summaryrefslogtreecommitdiff
path: root/chromium/ui
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui')
-rw-r--r--chromium/ui/accelerated_widget_mac/ca_layer_tree_coordinator.h2
-rw-r--r--chromium/ui/accelerated_widget_mac/ca_layer_tree_coordinator.mm4
-rw-r--r--chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm1
-rw-r--r--chromium/ui/accelerated_widget_mac/display_ca_layer_tree.mm1
-rw-r--r--chromium/ui/accessibility/BUILD.gn207
-rw-r--r--chromium/ui/accessibility/accessibility_features.cc32
-rw-r--r--chromium/ui/accessibility/accessibility_features.h50
-rw-r--r--chromium/ui/accessibility/accessibility_switches.h37
-rw-r--r--chromium/ui/accessibility/ax_enum_util.cc8
-rw-r--r--chromium/ui/accessibility/ax_enums.mojom28
-rw-r--r--chromium/ui/accessibility/ax_event.cc2
-rw-r--r--chromium/ui/accessibility/ax_event_generator.cc21
-rw-r--r--chromium/ui/accessibility/ax_event_generator.h13
-rw-r--r--chromium/ui/accessibility/ax_mode.cc3
-rw-r--r--chromium/ui/accessibility/ax_mode.h7
-rw-r--r--chromium/ui/accessibility/ax_node.cc288
-rw-r--r--chromium/ui/accessibility/ax_node.h74
-rw-r--r--chromium/ui/accessibility/ax_node_data.cc49
-rw-r--r--chromium/ui/accessibility/ax_node_data.h7
-rw-r--r--chromium/ui/accessibility/ax_node_position.cc5
-rw-r--r--chromium/ui/accessibility/ax_node_position_unittest.cc129
-rw-r--r--chromium/ui/accessibility/ax_param_traits_macros.h1
-rw-r--r--chromium/ui/accessibility/ax_position.h27
-rw-r--r--chromium/ui/accessibility/ax_range_unittest.cc10
-rw-r--r--chromium/ui/accessibility/ax_role_properties.cc12
-rw-r--r--chromium/ui/accessibility/ax_role_properties.h8
-rw-r--r--chromium/ui/accessibility/ax_table_fuzzer.cc27
-rw-r--r--chromium/ui/accessibility/ax_tree.cc88
-rw-r--r--chromium/ui/accessibility/ax_tree.h31
-rw-r--r--chromium/ui/accessibility/ax_tree_id.cc12
-rw-r--r--chromium/ui/accessibility/ax_tree_unittest.cc313
-rw-r--r--chromium/ui/accessibility/ax_tree_update.h17
-rw-r--r--chromium/ui/accessibility/extensions/chromevoxclassic/BUILD.gn6
-rw-r--r--chromium/ui/accessibility/extensions/chromevoxclassic/testing/chromevox_unittest_base.js9
-rw-r--r--chromium/ui/accessibility/mojom/ax_tree_update.mojom2
-rw-r--r--chromium/ui/accessibility/mojom/ax_tree_update_mojom_traits.cc2
-rw-r--r--chromium/ui/accessibility/mojom/ax_tree_update_mojom_traits.h7
-rw-r--r--chromium/ui/accessibility/platform/BUILD.gn142
-rw-r--r--chromium/ui/accessibility/platform/ax_fragment_root_win.cc66
-rw-r--r--chromium/ui/accessibility/platform/ax_fragment_root_win_unittest.cc104
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node.h2
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_auralinux.cc169
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_auralinux.h3
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc19
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_base.cc108
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_base.h54
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_delegate.h30
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_delegate_base.cc56
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_delegate_base.h12
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_mac.h1
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_mac.mm21
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_textchildprovider_win_unittest.cc2
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_textprovider_win_unittest.cc18
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc43
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.h10
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc27
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_unittest.cc8
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_win.cc173
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_win.h35
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_win_unittest.cc496
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_win_unittest.h3
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_relation_win.cc6
-rw-r--r--chromium/ui/accessibility/platform/ichromeaccessible.idl64
-rw-r--r--chromium/ui/accessibility/platform/test_ax_node_wrapper.cc54
-rw-r--r--chromium/ui/accessibility/platform/test_ax_node_wrapper.h4
-rw-r--r--chromium/ui/accessibility/platform/uia_registrar_win.cc50
-rw-r--r--chromium/ui/accessibility/platform/uia_registrar_win.h45
-rw-r--r--chromium/ui/accessibility/test_ax_node_helper.cc204
-rw-r--r--chromium/ui/accessibility/test_ax_node_helper.h50
-rw-r--r--chromium/ui/android/BUILD.gn24
-rw-r--r--chromium/ui/android/event_forwarder.cc17
-rw-r--r--chromium/ui/android/event_forwarder.h1
-rw-r--r--chromium/ui/android/junit/AndroidManifest.xml19
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/base/ActivityAndroidPermissionDelegateTest.java260
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/base/LocalizationUtilsTest.java4
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/base/SelectFileDialogTest.java44
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/base/TestActivity.java14
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/drawable/StateListDrawableBuilderTest.java19
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java15
-rw-r--r--chromium/ui/android/view_android.cc31
-rw-r--r--chromium/ui/android/view_android.h12
-rw-r--r--chromium/ui/android/view_android_unittests.cc4
-rw-r--r--chromium/ui/aura/BUILD.gn11
-rw-r--r--chromium/ui/aura/client/aura_constants.cc1
-rw-r--r--chromium/ui/aura/client/aura_constants.h5
-rw-r--r--chromium/ui/aura/client/cursor_client.h5
-rw-r--r--chromium/ui/aura/env.cc14
-rw-r--r--chromium/ui/aura/env.h8
-rw-r--r--chromium/ui/aura/gestures/gesture_recognizer_unittest.cc19
-rw-r--r--chromium/ui/aura/screen_ozone.cc5
-rw-r--r--chromium/ui/aura/screen_ozone.h1
-rw-r--r--chromium/ui/aura/window.cc27
-rw-r--r--chromium/ui/aura/window.h18
-rw-r--r--chromium/ui/aura/window_event_dispatcher.cc41
-rw-r--r--chromium/ui/aura/window_event_dispatcher.h3
-rw-r--r--chromium/ui/aura/window_event_dispatcher_unittest.cc48
-rw-r--r--chromium/ui/aura/window_observer.h4
-rw-r--r--chromium/ui/aura/window_tree_host.cc24
-rw-r--r--chromium/ui/aura/window_tree_host.h9
-rw-r--r--chromium/ui/aura/window_tree_host_platform.cc19
-rw-r--r--chromium/ui/aura/window_tree_host_unittest.cc28
-rw-r--r--chromium/ui/aura/window_unittest.cc129
-rw-r--r--chromium/ui/base/BUILD.gn133
-rw-r--r--chromium/ui/base/DEPS1
-rw-r--r--chromium/ui/base/accelerators/accelerator.cc25
-rw-r--r--chromium/ui/base/accelerators/accelerator.h9
-rw-r--r--chromium/ui/base/accelerators/accelerator_history.h4
-rw-r--r--chromium/ui/base/accelerators/accelerator_manager.h4
-rw-r--r--chromium/ui/base/accelerators/global_media_keys_listener_win.h5
-rw-r--r--chromium/ui/base/accelerators/media_keys_listener.h6
-rw-r--r--chromium/ui/base/accelerators/media_keys_listener_mac.mm1
-rw-r--r--chromium/ui/base/accelerators/media_keys_util.h9
-rw-r--r--chromium/ui/base/accelerators/menu_label_accelerator_util.h8
-rw-r--r--chromium/ui/base/accelerators/menu_label_accelerator_util_linux.h10
-rw-r--r--chromium/ui/base/accelerators/platform_accelerator_cocoa.h5
-rw-r--r--chromium/ui/base/accelerators/system_media_controls_media_keys_listener.h4
-rw-r--r--chromium/ui/base/base_window.h3
-rw-r--r--chromium/ui/base/class_property.h6
-rw-r--r--chromium/ui/base/clipboard/BUILD.gn72
-rw-r--r--chromium/ui/base/clipboard/clipboard.cc6
-rw-r--r--chromium/ui/base/clipboard/clipboard.h11
-rw-r--r--chromium/ui/base/clipboard/clipboard_android.cc11
-rw-r--r--chromium/ui/base/clipboard/clipboard_constants.h7
-rw-r--r--chromium/ui/base/clipboard/clipboard_constants_mac.mm5
-rw-r--r--chromium/ui/base/clipboard/clipboard_linux.cc33
-rw-r--r--chromium/ui/base/clipboard/clipboard_mac.h2
-rw-r--r--chromium/ui/base/clipboard/clipboard_mac.mm30
-rw-r--r--chromium/ui/base/clipboard/clipboard_metrics.cc20
-rw-r--r--chromium/ui/base/clipboard/clipboard_metrics.h30
-rw-r--r--chromium/ui/base/clipboard/clipboard_non_backed.cc (renamed from chromium/ui/base/clipboard/clipboard_aura.cc)208
-rw-r--r--chromium/ui/base/clipboard/clipboard_non_backed.h (renamed from chromium/ui/base/clipboard/clipboard_aura.h)24
-rw-r--r--chromium/ui/base/clipboard/clipboard_ozone.cc22
-rw-r--r--chromium/ui/base/clipboard/clipboard_test_template.h80
-rw-r--r--chromium/ui/base/clipboard/clipboard_util_mac.mm1
-rw-r--r--chromium/ui/base/clipboard/clipboard_win.cc9
-rw-r--r--chromium/ui/base/clipboard/clipboard_x11.cc337
-rw-r--r--chromium/ui/base/clipboard/scoped_clipboard_writer.cc16
-rw-r--r--chromium/ui/base/clipboard/scoped_clipboard_writer.h5
-rw-r--r--chromium/ui/base/cocoa/accessibility_focus_overrider.h4
-rw-r--r--chromium/ui/base/cocoa/appkit_utils.h6
-rw-r--r--chromium/ui/base/cocoa/base_view.h8
-rw-r--r--chromium/ui/base/cocoa/base_view.mm1
-rw-r--r--chromium/ui/base/cocoa/bubble_closer.h4
-rw-r--r--chromium/ui/base/cocoa/cocoa_base_utils.h20
-rw-r--r--chromium/ui/base/cocoa/command_dispatcher.h4
-rw-r--r--chromium/ui/base/cocoa/command_dispatcher.mm49
-rw-r--r--chromium/ui/base/cocoa/constrained_window/constrained_window_animation.h10
-rw-r--r--chromium/ui/base/cocoa/constrained_window/constrained_window_animation.mm1
-rw-r--r--chromium/ui/base/cocoa/controls/button_utils.h4
-rw-r--r--chromium/ui/base/cocoa/controls/textfield_utils.h4
-rw-r--r--chromium/ui/base/cocoa/defaults_utils.h6
-rw-r--r--chromium/ui/base/cocoa/find_pasteboard.h8
-rw-r--r--chromium/ui/base/cocoa/flipped_view.h4
-rw-r--r--chromium/ui/base/cocoa/focus_tracker.h4
-rw-r--r--chromium/ui/base/cocoa/focus_window_set.h9
-rw-r--r--chromium/ui/base/cocoa/focus_window_set.mm1
-rw-r--r--chromium/ui/base/cocoa/menu_controller.h4
-rw-r--r--chromium/ui/base/cocoa/permissions_utils.h4
-rw-r--r--chromium/ui/base/cocoa/quartz_util.h6
-rw-r--r--chromium/ui/base/cocoa/remote_accessibility_api.h4
-rw-r--r--chromium/ui/base/cocoa/remote_layer_api.h4
-rw-r--r--chromium/ui/base/cocoa/secure_password_input.h4
-rw-r--r--chromium/ui/base/cocoa/text_services_context_menu.cc22
-rw-r--r--chromium/ui/base/cocoa/text_services_context_menu.h22
-rw-r--r--chromium/ui/base/cocoa/tool_tip_base_view.h3
-rw-r--r--chromium/ui/base/cocoa/touch_bar_util.h21
-rw-r--r--chromium/ui/base/cocoa/tracking_area.h6
-rw-r--r--chromium/ui/base/cocoa/underlay_opengl_hosting_window.h4
-rw-r--r--chromium/ui/base/cocoa/views_hostable.h2
-rw-r--r--chromium/ui/base/cocoa/weak_ptr_nsobject.h4
-rw-r--r--chromium/ui/base/cocoa/window_size_constants.h4
-rw-r--r--chromium/ui/base/cursor/BUILD.gn114
-rw-r--r--chromium/ui/base/cursor/DEPS3
-rw-r--r--chromium/ui/base/cursor/cursor.h4
-rw-r--r--chromium/ui/base/cursor/cursor_factory.cc68
-rw-r--r--chromium/ui/base/cursor/cursor_factory.h (renamed from chromium/ui/ozone/public/cursor_factory_ozone.h)36
-rw-r--r--chromium/ui/base/cursor/cursor_loader.h11
-rw-r--r--chromium/ui/base/cursor/cursor_loader_ozone.cc65
-rw-r--r--chromium/ui/base/cursor/cursor_loader_ozone.h13
-rw-r--r--chromium/ui/base/cursor/cursor_loader_win.cc2
-rw-r--r--chromium/ui/base/cursor/cursor_loader_win.h5
-rw-r--r--chromium/ui/base/cursor/cursor_loader_x11.cc310
-rw-r--r--chromium/ui/base/cursor/cursor_loader_x11.h93
-rw-r--r--chromium/ui/base/cursor/cursor_lookup.h8
-rw-r--r--chromium/ui/base/cursor/cursor_ozone.cc6
-rw-r--r--chromium/ui/base/cursor/cursor_theme_manager.cc47
-rw-r--r--chromium/ui/base/cursor/cursor_theme_manager.h46
-rw-r--r--chromium/ui/base/cursor/cursor_theme_manager_linux.cc42
-rw-r--r--chromium/ui/base/cursor/cursor_theme_manager_linux.h52
-rw-r--r--chromium/ui/base/cursor/cursor_theme_manager_observer.h (renamed from chromium/ui/base/cursor/cursor_theme_manager_linux_observer.h)12
-rw-r--r--chromium/ui/base/cursor/cursor_unittest.cc23
-rw-r--r--chromium/ui/base/cursor/cursor_util.cc3
-rw-r--r--chromium/ui/base/cursor/cursor_util.h21
-rw-r--r--chromium/ui/base/cursor/cursor_util_unittest.cc1
-rw-r--r--chromium/ui/base/cursor/cursor_x11.cc21
-rw-r--r--chromium/ui/base/cursor/cursors_aura.cc116
-rw-r--r--chromium/ui/base/cursor/cursors_aura.h29
-rw-r--r--chromium/ui/base/cursor/image_cursors.cc72
-rw-r--r--chromium/ui/base/cursor/image_cursors.h23
-rw-r--r--chromium/ui/base/cursor/mojom/BUILD.gn4
-rw-r--r--chromium/ui/base/cursor/mojom/cursor_mojom_traits_unittest.cc15
-rw-r--r--chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc49
-rw-r--r--chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h31
-rw-r--r--chromium/ui/base/device_form_factor.h4
-rw-r--r--chromium/ui/base/dragdrop/cocoa_dnd_util.h15
-rw-r--r--chromium/ui/base/dragdrop/drag_drop_types.h4
-rw-r--r--chromium/ui/base/dragdrop/drag_source_win.cc2
-rw-r--r--chromium/ui/base/dragdrop/drag_source_win.h5
-rw-r--r--chromium/ui/base/dragdrop/drop_target_event.h3
-rw-r--r--chromium/ui/base/dragdrop/drop_target_win.h4
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data.cc2
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data.h4
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider.h3
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_factory.cc4
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_factory.h4
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_mac.h4
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_mac.mm6
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_non_backed.cc (renamed from chromium/ui/base/dragdrop/os_exchange_data_provider_aura.cc)107
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_non_backed.h (renamed from chromium/ui/base/dragdrop/os_exchange_data_provider_aura.h)40
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc10
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_win.h5
-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.h12
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_x11_unittest.cc26
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_unittest.cc35
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_win_unittest.cc15
-rw-r--r--chromium/ui/base/emoji/emoji_panel_helper.h10
-rw-r--r--chromium/ui/base/idle/BUILD.gn1
-rw-r--r--chromium/ui/base/idle/idle_query_x11.cc41
-rw-r--r--chromium/ui/base/idle/idle_query_x11.h8
-rw-r--r--chromium/ui/base/idle/screensaver_window_finder_x11.cc34
-rw-r--r--chromium/ui/base/idle/screensaver_window_finder_x11.h4
-rw-r--r--chromium/ui/base/ime/BUILD.gn3
-rw-r--r--chromium/ui/base/ime/chromeos/BUILD.gn2
-rw-r--r--chromium/ui/base/ime/dummy_input_method.cc5
-rw-r--r--chromium/ui/base/ime/dummy_input_method.h4
-rw-r--r--chromium/ui/base/ime/dummy_text_input_client.cc8
-rw-r--r--chromium/ui/base/ime/dummy_text_input_client.h6
-rw-r--r--chromium/ui/base/ime/fuchsia/input_method_fuchsia.cc4
-rw-r--r--chromium/ui/base/ime/fuchsia/input_method_keyboard_controller_fuchsia.cc6
-rw-r--r--chromium/ui/base/ime/ime_assistive_window_handler_interface.h23
-rw-r--r--chromium/ui/base/ime/ime_bridge.cc146
-rw-r--r--chromium/ui/base/ime/ime_bridge.h102
-rw-r--r--chromium/ui/base/ime/ime_engine_handler_interface.h15
-rw-r--r--chromium/ui/base/ime/ime_input_context_handler_interface.h5
-rw-r--r--chromium/ui/base/ime/ime_text_span.h7
-rw-r--r--chromium/ui/base/ime/init/BUILD.gn3
-rw-r--r--chromium/ui/base/ime/init/input_method_factory.cc28
-rw-r--r--chromium/ui/base/ime/init/input_method_initializer.cc6
-rw-r--r--chromium/ui/base/ime/input_method.h16
-rw-r--r--chromium/ui/base/ime/input_method_base.cc32
-rw-r--r--chromium/ui/base/ime/input_method_base.h11
-rw-r--r--chromium/ui/base/ime/linux/BUILD.gn9
-rw-r--r--chromium/ui/base/ime/linux/input_method_auralinux.cc60
-rw-r--r--chromium/ui/base/ime/linux/input_method_auralinux.h12
-rw-r--r--chromium/ui/base/ime/linux/input_method_auralinux_unittest.cc22
-rw-r--r--chromium/ui/base/ime/mock_ime_input_context_handler.cc16
-rw-r--r--chromium/ui/base/ime/mock_ime_input_context_handler.h12
-rw-r--r--chromium/ui/base/ime/mock_input_method.cc10
-rw-r--r--chromium/ui/base/ime/mock_input_method.h4
-rw-r--r--chromium/ui/base/ime/mojom/BUILD.gn41
-rw-r--r--chromium/ui/base/ime/mojom/ime_types.mojom25
-rw-r--r--chromium/ui/base/ime/mojom/ime_types_mojom_traits.cc99
-rw-r--r--chromium/ui/base/ime/mojom/ime_types_mojom_traits.h41
-rw-r--r--chromium/ui/base/ime/mojom/text_input_state.mojom68
-rw-r--r--chromium/ui/base/ime/mojom/virtual_keyboard_types.mojom (renamed from chromium/ui/base/ime/virtual_keyboard_visibility_request.h)17
-rw-r--r--chromium/ui/base/ime/text_input_client.h7
-rw-r--r--chromium/ui/base/ime/win/input_method_win_base.cc61
-rw-r--r--chromium/ui/base/ime/win/input_method_win_base.h13
-rw-r--r--chromium/ui/base/ime/win/input_method_win_imm32.cc19
-rw-r--r--chromium/ui/base/ime/win/input_method_win_tsf.cc5
-rw-r--r--chromium/ui/base/ime/win/on_screen_keyboard_display_manager_input_pane.cc12
-rw-r--r--chromium/ui/base/ime/win/on_screen_keyboard_display_manager_input_pane.h10
-rw-r--r--chromium/ui/base/ime/win/on_screen_keyboard_display_manager_tab_tip.h1
-rw-r--r--chromium/ui/base/ime/win/tsf_bridge.cc37
-rw-r--r--chromium/ui/base/ime/win/tsf_text_store.cc27
-rw-r--r--chromium/ui/base/ime/win/tsf_text_store.h9
-rw-r--r--chromium/ui/base/ime/win/tsf_text_store_unittest.cc87
-rw-r--r--chromium/ui/base/l10n/formatter.cc4
-rw-r--r--chromium/ui/base/l10n/formatter.h9
-rw-r--r--chromium/ui/base/l10n/l10n_font_util.h19
-rw-r--r--chromium/ui/base/l10n/l10n_util.cc1
-rw-r--r--chromium/ui/base/l10n/l10n_util.h192
-rw-r--r--chromium/ui/base/l10n/l10n_util_android.h10
-rw-r--r--chromium/ui/base/l10n/l10n_util_collator.h5
-rw-r--r--chromium/ui/base/l10n/l10n_util_mac.h105
-rw-r--r--chromium/ui/base/l10n/l10n_util_win.h18
-rw-r--r--chromium/ui/base/l10n/time_format.cc5
-rw-r--r--chromium/ui/base/l10n/time_format.h4
-rw-r--r--chromium/ui/base/layout.cc12
-rw-r--r--chromium/ui/base/layout.h19
-rw-r--r--chromium/ui/base/models/button_menu_item_model.h6
-rw-r--r--chromium/ui/base/models/combobox_model.cc20
-rw-r--r--chromium/ui/base/models/combobox_model.h25
-rw-r--r--chromium/ui/base/models/combobox_model_observer.h5
-rw-r--r--chromium/ui/base/models/image_model.cc8
-rw-r--r--chromium/ui/base/models/image_model.h7
-rw-r--r--chromium/ui/base/models/image_model_unittest.cc8
-rw-r--r--chromium/ui/base/models/list_model.h2
-rw-r--r--chromium/ui/base/models/list_model_observer.h4
-rw-r--r--chromium/ui/base/models/list_selection_model.h4
-rw-r--r--chromium/ui/base/models/menu_model.cc12
-rw-r--r--chromium/ui/base/models/menu_model.h18
-rw-r--r--chromium/ui/base/models/simple_combobox_model.cc4
-rw-r--r--chromium/ui/base/models/simple_combobox_model.h7
-rw-r--r--chromium/ui/base/models/simple_menu_model.cc20
-rw-r--r--chromium/ui/base/models/simple_menu_model.h15
-rw-r--r--chromium/ui/base/models/simple_menu_model_unittest.cc32
-rw-r--r--chromium/ui/base/models/table_model.h6
-rw-r--r--chromium/ui/base/models/table_model_observer.h4
-rw-r--r--chromium/ui/base/models/tree_model.h6
-rw-r--r--chromium/ui/base/models/tree_node_iterator.h2
-rw-r--r--chromium/ui/base/models/tree_node_model.h2
-rw-r--r--chromium/ui/base/mojom/BUILD.gn9
-rw-r--r--chromium/ui/base/mojom/attributed_string.mojom32
-rw-r--r--chromium/ui/base/mojom/window_open_disposition_mojom_traits.h2
-rw-r--r--chromium/ui/base/nine_image_painter_factory.h5
-rw-r--r--chromium/ui/base/page_transition_types.h36
-rw-r--r--chromium/ui/base/pointer/pointer_device.h22
-rw-r--r--chromium/ui/base/pointer/touch_editing_controller.h15
-rw-r--r--chromium/ui/base/pointer/touch_ui_controller.cc48
-rw-r--r--chromium/ui/base/pointer/touch_ui_controller.h14
-rw-r--r--chromium/ui/base/resource/data_pack.cc23
-rw-r--r--chromium/ui/base/resource/resource_bundle.cc53
-rw-r--r--chromium/ui/base/resource/resource_bundle.h24
-rw-r--r--chromium/ui/base/resource/resource_bundle_android.cc38
-rw-r--r--chromium/ui/base/resource/resource_bundle_android.h42
-rw-r--r--chromium/ui/base/resource/resource_bundle_ios.mm11
-rw-r--r--chromium/ui/base/resource/resource_bundle_mac.mm12
-rw-r--r--chromium/ui/base/resource/resource_bundle_unittest.cc8
-rw-r--r--chromium/ui/base/resource/resource_bundle_win.h6
-rw-r--r--chromium/ui/base/scoped_visibility_tracker.h4
-rw-r--r--chromium/ui/base/template_expressions.cc2
-rw-r--r--chromium/ui/base/template_expressions.h16
-rw-r--r--chromium/ui/base/text/bytes_formatting.h15
-rw-r--r--chromium/ui/base/theme_provider.h4
-rw-r--r--chromium/ui/base/ui_base_export.h37
-rw-r--r--chromium/ui/base/ui_base_features.cc44
-rw-r--r--chromium/ui/base/ui_base_features.h23
-rw-r--r--chromium/ui/base/ui_base_paths.h4
-rw-r--r--chromium/ui/base/ui_base_switches.h52
-rw-r--r--chromium/ui/base/ui_base_switches_util.h4
-rw-r--r--chromium/ui/base/ui_base_types.h5
-rw-r--r--chromium/ui/base/user_activity/user_activity_detector.h5
-rw-r--r--chromium/ui/base/user_activity/user_activity_observer.h4
-rw-r--r--chromium/ui/base/view_prop.cc4
-rw-r--r--chromium/ui/base/view_prop.h4
-rw-r--r--chromium/ui/base/webui/i18n_source_stream.h5
-rw-r--r--chromium/ui/base/webui/jstemplate_builder.cc2
-rw-r--r--chromium/ui/base/webui/jstemplate_builder.h23
-rw-r--r--chromium/ui/base/webui/web_ui_util.cc8
-rw-r--r--chromium/ui/base/webui/web_ui_util.h61
-rw-r--r--chromium/ui/base/win/accessibility_misc_utils.h4
-rw-r--r--chromium/ui/base/win/event_creation_utils.cc37
-rw-r--r--chromium/ui/base/win/event_creation_utils.h23
-rw-r--r--chromium/ui/base/win/foreground_helper.h6
-rw-r--r--chromium/ui/base/win/hidden_window.cc1
-rw-r--r--chromium/ui/base/win/hidden_window.h4
-rw-r--r--chromium/ui/base/win/hwnd_metrics.h4
-rw-r--r--chromium/ui/base/win/hwnd_subclass.h6
-rw-r--r--chromium/ui/base/win/internal_constants.h7
-rw-r--r--chromium/ui/base/win/lock_state.h4
-rw-r--r--chromium/ui/base/win/message_box_win.h11
-rw-r--r--chromium/ui/base/win/mouse_wheel_util.h10
-rw-r--r--chromium/ui/base/win/scoped_ole_initializer.h4
-rw-r--r--chromium/ui/base/win/session_change_observer.h4
-rw-r--r--chromium/ui/base/win/shell.h48
-rw-r--r--chromium/ui/base/win/touch_input.h11
-rw-r--r--chromium/ui/base/win/window_event_target.h4
-rw-r--r--chromium/ui/base/window_open_disposition.h28
-rw-r--r--chromium/ui/base/x/BUILD.gn25
-rw-r--r--chromium/ui/base/x/selection_owner.cc233
-rw-r--r--chromium/ui/base/x/selection_owner.h42
-rw-r--r--chromium/ui/base/x/selection_requestor.cc172
-rw-r--r--chromium/ui/base/x/selection_requestor.h52
-rw-r--r--chromium/ui/base/x/selection_requestor_unittest.cc86
-rw-r--r--chromium/ui/base/x/selection_utils.cc53
-rw-r--r--chromium/ui/base/x/selection_utils.h32
-rw-r--r--chromium/ui/base/x/x11_cursor.cc (renamed from chromium/ui/ozone/platform/x11/x11_cursor_ozone.cc)26
-rw-r--r--chromium/ui/base/x/x11_cursor.h55
-rw-r--r--chromium/ui/base/x/x11_cursor_factory.cc118
-rw-r--r--chromium/ui/base/x/x11_cursor_factory.h67
-rw-r--r--chromium/ui/base/x/x11_cursor_factory_unittest.cc (renamed from chromium/ui/ozone/platform/x11/x11_cursor_factory_ozone_unittest.cc)11
-rw-r--r--chromium/ui/base/x/x11_display_manager.cc56
-rw-r--r--chromium/ui/base/x/x11_display_manager.h11
-rw-r--r--chromium/ui/base/x/x11_display_util.cc381
-rw-r--r--chromium/ui/base/x/x11_display_util.h4
-rw-r--r--chromium/ui/base/x/x11_drag_context.cc71
-rw-r--r--chromium/ui/base/x/x11_drag_context.h36
-rw-r--r--chromium/ui/base/x/x11_drag_drop_client.cc285
-rw-r--r--chromium/ui/base/x/x11_drag_drop_client.h61
-rw-r--r--chromium/ui/base/x/x11_error_handler.cc104
-rw-r--r--chromium/ui/base/x/x11_error_handler.h26
-rw-r--r--chromium/ui/base/x/x11_gl_egl_utility.cc14
-rw-r--r--chromium/ui/base/x/x11_menu_list.cc8
-rw-r--r--chromium/ui/base/x/x11_menu_list.h15
-rw-r--r--chromium/ui/base/x/x11_menu_registrar.cc15
-rw-r--r--chromium/ui/base/x/x11_menu_registrar.h7
-rw-r--r--chromium/ui/base/x/x11_os_exchange_data_provider.cc84
-rw-r--r--chromium/ui/base/x/x11_os_exchange_data_provider.h17
-rw-r--r--chromium/ui/base/x/x11_pointer_grab.cc21
-rw-r--r--chromium/ui/base/x/x11_pointer_grab.h2
-rw-r--r--chromium/ui/base/x/x11_shm_image_pool.cc20
-rw-r--r--chromium/ui/base/x/x11_shm_image_pool.h9
-rw-r--r--chromium/ui/base/x/x11_software_bitmap_presenter.cc62
-rw-r--r--chromium/ui/base/x/x11_software_bitmap_presenter.h2
-rw-r--r--chromium/ui/base/x/x11_topmost_window_finder.h2
-rw-r--r--chromium/ui/base/x/x11_util.cc1011
-rw-r--r--chromium/ui/base/x/x11_util.h311
-rw-r--r--chromium/ui/base/x/x11_util_internal.h49
-rw-r--r--chromium/ui/base/x/x11_whole_screen_move_loop.cc79
-rw-r--r--chromium/ui/base/x/x11_whole_screen_move_loop.h4
-rw-r--r--chromium/ui/base/x/x11_window.cc1043
-rw-r--r--chromium/ui/base/x/x11_window.h66
-rw-r--r--chromium/ui/base/x/x11_workspace_handler.cc19
-rw-r--r--chromium/ui/base/x/x11_workspace_handler.h7
-rw-r--r--chromium/ui/base/x/xwmstartupcheck/BUILD.gn13
-rw-r--r--chromium/ui/base/x/xwmstartupcheck/xwmstartupcheck.cc125
-rw-r--r--chromium/ui/chromeos/BUILD.gn39
-rw-r--r--chromium/ui/color/color_id.h2
-rw-r--r--chromium/ui/compositor/BUILD.gn3
-rw-r--r--chromium/ui/compositor/animation_metrics_reporter.h20
-rw-r--r--chromium/ui/compositor/animation_throughput_reporter.cc151
-rw-r--r--chromium/ui/compositor/animation_throughput_reporter.h66
-rw-r--r--chromium/ui/compositor/animation_throughput_reporter_unittest.cc271
-rw-r--r--chromium/ui/compositor/callback_layer_animation_observer.cc1
-rw-r--r--chromium/ui/compositor/compositor.cc13
-rw-r--r--chromium/ui/compositor/compositor.h8
-rw-r--r--chromium/ui/compositor/compositor_unittest.cc13
-rw-r--r--chromium/ui/compositor/layer.cc54
-rw-r--r--chromium/ui/compositor/layer.h11
-rw-r--r--chromium/ui/compositor/layer_animation_observer.cc9
-rw-r--r--chromium/ui/compositor/layer_animation_observer.h6
-rw-r--r--chromium/ui/compositor/layer_animation_sequence.cc6
-rw-r--r--chromium/ui/compositor/layer_animator.cc17
-rw-r--r--chromium/ui/compositor/layer_animator.h1
-rw-r--r--chromium/ui/compositor/layer_animator_unittest.cc5
-rw-r--r--chromium/ui/compositor/layer_owner.cc6
-rw-r--r--chromium/ui/compositor/layer_owner.h4
-rw-r--r--chromium/ui/compositor/layer_tree_owner.h2
-rw-r--r--chromium/ui/compositor/layer_unittest.cc131
-rw-r--r--chromium/ui/compositor/overscroll/scroll_input_handler.cc8
-rw-r--r--chromium/ui/compositor/paint_context.h2
-rw-r--r--chromium/ui/compositor/throughput_tracker.cc23
-rw-r--r--chromium/ui/compositor/throughput_tracker.h5
-rw-r--r--chromium/ui/display/BUILD.gn2
-rw-r--r--chromium/ui/display/display.cc1
-rw-r--r--chromium/ui/display/display_features.cc8
-rw-r--r--chromium/ui/display/display_features.h2
-rw-r--r--chromium/ui/display/display_observer.h2
-rw-r--r--chromium/ui/display/display_switches.cc3
-rw-r--r--chromium/ui/display/display_switches.h1
-rw-r--r--chromium/ui/display/fake/fake_display_snapshot.cc22
-rw-r--r--chromium/ui/display/fake/fake_display_snapshot.h8
-rw-r--r--chromium/ui/display/manager/configure_displays_task.cc1
-rw-r--r--chromium/ui/display/manager/display_change_observer.cc64
-rw-r--r--chromium/ui/display/manager/display_change_observer.h2
-rw-r--r--chromium/ui/display/manager/display_change_observer_unittest.cc134
-rw-r--r--chromium/ui/display/manager/display_configurator.cc22
-rw-r--r--chromium/ui/display/manager/display_manager.cc12
-rw-r--r--chromium/ui/display/manager/display_manager.h2
-rw-r--r--chromium/ui/display/manager/display_util.cc8
-rw-r--r--chromium/ui/display/manager/display_util.h3
-rw-r--r--chromium/ui/display/manager/managed_display_info.cc17
-rw-r--r--chromium/ui/display/manager/managed_display_info.h10
-rw-r--r--chromium/ui/display/manager/managed_display_info_unittest.cc4
-rw-r--r--chromium/ui/display/manager/touch_device_manager.cc1
-rw-r--r--chromium/ui/display/manager/touch_transform_controller.cc1
-rw-r--r--chromium/ui/display/manager/update_display_configuration_task.cc1
-rw-r--r--chromium/ui/display/mojom/BUILD.gn13
-rw-r--r--chromium/ui/display/mojom/display_configuration_params.mojom15
-rw-r--r--chromium/ui/display/mojom/display_configuration_params_mojom_traits.cc29
-rw-r--r--chromium/ui/display/mojom/display_configuration_params_mojom_traits.h39
-rw-r--r--chromium/ui/display/scoped_display_for_new_windows.cc24
-rw-r--r--chromium/ui/display/scoped_display_for_new_windows.h27
-rw-r--r--chromium/ui/display/screen.cc20
-rw-r--r--chromium/ui/display/screen.h8
-rw-r--r--chromium/ui/display/screen_unittest.cc23
-rw-r--r--chromium/ui/display/types/BUILD.gn2
-rw-r--r--chromium/ui/display/types/display_configuration_params.cc21
-rw-r--r--chromium/ui/display/types/display_configuration_params.h31
-rw-r--r--chromium/ui/display/util/edid_parser.cc12
-rw-r--r--chromium/ui/display/util/edid_parser_unittest.cc30
-rw-r--r--chromium/ui/display/win/scaling_util.cc5
-rw-r--r--chromium/ui/display/win/scaling_util.h4
-rw-r--r--chromium/ui/display/win/scaling_util_unittest.cc10
-rw-r--r--chromium/ui/display/win/screen_win.cc5
-rw-r--r--chromium/ui/display/win/screen_win_unittest.cc199
-rw-r--r--chromium/ui/display/win/uwp_text_scale_factor.cc1
-rw-r--r--chromium/ui/events/android/motion_event_android.cc9
-rw-r--r--chromium/ui/events/android/motion_event_android.h3
-rw-r--r--chromium/ui/events/android/motion_event_android_unittest.cc15
-rw-r--r--chromium/ui/events/blink/blink_event_util.cc21
-rw-r--r--chromium/ui/events/blink/blink_event_util.h5
-rw-r--r--chromium/ui/events/blink/web_input_event_unittest.cc16
-rw-r--r--chromium/ui/events/devices/x11/device_data_manager_x11.cc232
-rw-r--r--chromium/ui/events/devices/x11/device_data_manager_x11.h51
-rw-r--r--chromium/ui/events/devices/x11/touch_factory_x11.cc6
-rw-r--r--chromium/ui/events/devices/x11/touch_factory_x11.h2
-rw-r--r--chromium/ui/events/event.cc117
-rw-r--r--chromium/ui/events/event.h87
-rw-r--r--chromium/ui/events/event_dispatcher.cc4
-rw-r--r--chromium/ui/events/event_dispatcher_unittest.cc13
-rw-r--r--chromium/ui/events/event_rewriter_unittest.cc3
-rw-r--r--chromium/ui/events/event_unittest.cc216
-rw-r--r--chromium/ui/events/fuchsia/input_event_dispatcher.cc2
-rw-r--r--chromium/ui/events/gesture_detection/bitset_32.h2
-rw-r--r--chromium/ui/events/gesture_detection/gesture_configuration.cc5
-rw-r--r--chromium/ui/events/gesture_detection/gesture_configuration.h2
-rw-r--r--chromium/ui/events/gesture_detection/gesture_configuration_aura.cc6
-rw-r--r--chromium/ui/events/gesture_detection/gesture_detector.cc50
-rw-r--r--chromium/ui/events/gesture_detection/gesture_detector.h10
-rw-r--r--chromium/ui/events/gesture_detection/gesture_provider_unittest.cc28
-rw-r--r--chromium/ui/events/gesture_detection/motion_event.cc5
-rw-r--r--chromium/ui/events/gesture_detection/motion_event.h9
-rw-r--r--chromium/ui/events/gesture_event_details.h2
-rw-r--r--chromium/ui/events/keycodes/dom/dom_key.h4
-rw-r--r--chromium/ui/events/keycodes/dom/dom_keyboard_layout_map_mac.mm1
-rw-r--r--chromium/ui/events/keycodes/dom/dom_keyboard_layout_map_win.cc1
-rw-r--r--chromium/ui/events/keycodes/keyboard_code_conversion_x.cc211
-rw-r--r--chromium/ui/events/ozone/device/udev/device_manager_udev.cc1
-rw-r--r--chromium/ui/events/ozone/evdev/event_converter_evdev_impl.cc1
-rw-r--r--chromium/ui/events/ozone/evdev/event_device_info.cc3
-rw-r--r--chromium/ui/events/ozone/evdev/gamepad_event_converter_evdev.cc1
-rw-r--r--chromium/ui/events/ozone/evdev/input_controller_evdev.cc19
-rw-r--r--chromium/ui/events/ozone/evdev/input_controller_evdev.h9
-rw-r--r--chromium/ui/events/ozone/evdev/input_injector_evdev.cc1
-rw-r--r--chromium/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc1
-rw-r--r--chromium/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc1
-rw-r--r--chromium/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.cc1
-rw-r--r--chromium/ui/events/ozone/evdev/stylus_button_event_converter_evdev.cc1
-rw-r--r--chromium/ui/events/ozone/evdev/tablet_event_converter_evdev.cc1
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc73
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.h8
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h11
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_unittest.cc39
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory.cc15
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory_unittest.cc9
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc31150
-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/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc1
-rw-r--r--chromium/ui/events/ozone/events_ozone.cc11
-rw-r--r--chromium/ui/events/ozone/events_ozone.h3
-rw-r--r--chromium/ui/events/ozone/features.cc5
-rw-r--r--chromium/ui/events/ozone/features.h9
-rw-r--r--chromium/ui/events/ozone/gamepad/gamepad_observer.h1
-rw-r--r--chromium/ui/events/ozone/layout/keyboard_layout_engine_manager.h2
-rw-r--r--chromium/ui/events/platform/platform_event_source.cc3
-rw-r--r--chromium/ui/events/platform/x11/x11_event_source.cc265
-rw-r--r--chromium/ui/events/platform/x11/x11_event_source.h89
-rw-r--r--chromium/ui/events/platform/x11/x11_event_watcher_glib.cc17
-rw-r--r--chromium/ui/events/platform/x11/x11_hotplug_event_handler.cc45
-rw-r--r--chromium/ui/events/scoped_target_handler.cc2
-rw-r--r--chromium/ui/events/win/keyboard_hook_win_base.cc2
-rw-r--r--chromium/ui/events/win/keyboard_hook_win_base.h2
-rw-r--r--chromium/ui/events/x/events_x_unittest.cc212
-rw-r--r--chromium/ui/events/x/events_x_utils.cc247
-rw-r--r--chromium/ui/events/x/events_x_utils.h54
-rw-r--r--chromium/ui/events/x/keyboard_hook_x11.cc6
-rw-r--r--chromium/ui/events/x/x11_event_translation.cc87
-rw-r--r--chromium/ui/events/x/x11_event_translation.h14
-rw-r--r--chromium/ui/events/x/x11_event_translation_unittest.cc43
-rw-r--r--chromium/ui/events/x/x11_window_event_manager.cc55
-rw-r--r--chromium/ui/events/x/x11_window_event_manager.h18
-rw-r--r--chromium/ui/file_manager/file_manager/background/js/BUILD.gn2
-rw-r--r--chromium/ui/file_manager/file_manager/foreground/elements/BUILD.gn4
-rw-r--r--chromium/ui/file_manager/file_manager/foreground/js/BUILD.gn44
-rw-r--r--chromium/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn15
-rw-r--r--chromium/ui/file_manager/file_manager/test/BUILD.gn1
-rw-r--r--chromium/ui/file_manager/image_loader/BUILD.gn16
-rw-r--r--chromium/ui/file_manager/integration_tests/BUILD.gn2
-rw-r--r--chromium/ui/file_manager/integration_tests/file_manager/BUILD.gn213
-rw-r--r--chromium/ui/gfx/BUILD.gn3
-rw-r--r--chromium/ui/gfx/animation/animation.cc3
-rw-r--r--chromium/ui/gfx/animation/animation_delegate_notifier.h2
-rw-r--r--chromium/ui/gfx/break_list.h2
-rw-r--r--chromium/ui/gfx/codec/jpeg_codec.cc1
-rw-r--r--chromium/ui/gfx/codec/png_codec.cc11
-rw-r--r--chromium/ui/gfx/codec/vector_wstream.h2
-rw-r--r--chromium/ui/gfx/color_palette.h2
-rw-r--r--chromium/ui/gfx/color_space.cc64
-rw-r--r--chromium/ui/gfx/color_space.h33
-rw-r--r--chromium/ui/gfx/color_space_unittest.cc101
-rw-r--r--chromium/ui/gfx/color_transform.cc33
-rw-r--r--chromium/ui/gfx/color_transform.h25
-rw-r--r--chromium/ui/gfx/color_transform_fuzzer.cc1
-rw-r--r--chromium/ui/gfx/color_transform_unittest.cc71
-rw-r--r--chromium/ui/gfx/geometry/matrix3_f.h2
-rw-r--r--chromium/ui/gfx/geometry/mojom/geometry.mojom9
-rw-r--r--chromium/ui/gfx/geometry/quad_f.h2
-rw-r--r--chromium/ui/gfx/geometry/rect.h2
-rw-r--r--chromium/ui/gfx/gpu_fence.cc47
-rw-r--r--chromium/ui/gfx/gpu_fence.h9
-rw-r--r--chromium/ui/gfx/image/image_generic.cc1
-rw-r--r--chromium/ui/gfx/image/image_util.cc10
-rw-r--r--chromium/ui/gfx/image/image_util_unittest.cc17
-rw-r--r--chromium/ui/gfx/linux/client_native_pixmap_dmabuf.cc34
-rw-r--r--chromium/ui/gfx/linux/drm_util_linux.cc9
-rw-r--r--chromium/ui/gfx/linux/gbm_util.cc3
-rw-r--r--chromium/ui/gfx/mac/cocoa_scrollbar_painter.cc334
-rw-r--r--chromium/ui/gfx/mac/cocoa_scrollbar_painter.h57
-rw-r--r--chromium/ui/gfx/mac/display_icc_profiles.cc1
-rw-r--r--chromium/ui/gfx/mojom/BUILD.gn40
-rw-r--r--chromium/ui/gfx/mojom/mojom_traits_unittest.cc9
-rw-r--r--chromium/ui/gfx/mojom/presentation_feedback.mojom4
-rw-r--r--chromium/ui/gfx/mojom/presentation_feedback_mojom_traits.h20
-rw-r--r--chromium/ui/gfx/native_widget_types.h18
-rw-r--r--chromium/ui/gfx/nine_image_painter.h1
-rw-r--r--chromium/ui/gfx/paint_throbber.cc87
-rw-r--r--chromium/ui/gfx/paint_throbber.h4
-rw-r--r--chromium/ui/gfx/path_mac.mm3
-rw-r--r--chromium/ui/gfx/path_mac_unittest.mm1
-rw-r--r--chromium/ui/gfx/platform_font_ios.mm1
-rw-r--r--chromium/ui/gfx/presentation_feedback.h30
-rw-r--r--chromium/ui/gfx/range/mojom/BUILD.gn1
-rw-r--r--chromium/ui/gfx/render_text.cc202
-rw-r--r--chromium/ui/gfx/render_text.h106
-rw-r--r--chromium/ui/gfx/render_text_api_fuzzer.cc1
-rw-r--r--chromium/ui/gfx/render_text_fuzzer.cc1
-rw-r--r--chromium/ui/gfx/render_text_harfbuzz.cc17
-rw-r--r--chromium/ui/gfx/render_text_harfbuzz.h2
-rw-r--r--chromium/ui/gfx/render_text_test_api.h4
-rw-r--r--chromium/ui/gfx/render_text_unittest.cc187
-rw-r--r--chromium/ui/gfx/rrect_f.cc2
-rw-r--r--chromium/ui/gfx/selection_model.cc2
-rw-r--r--chromium/ui/gfx/swap_result.cc29
-rw-r--r--chromium/ui/gfx/swap_result.h26
-rw-r--r--chromium/ui/gfx/switches.cc4
-rw-r--r--chromium/ui/gfx/switches.h2
-rw-r--r--chromium/ui/gfx/system_fonts_win.cc1
-rw-r--r--chromium/ui/gfx/text_utils.cc36
-rw-r--r--chromium/ui/gfx/text_utils.h74
-rw-r--r--chromium/ui/gfx/text_utils_unittest.cc80
-rw-r--r--chromium/ui/gfx/transform.cc27
-rw-r--r--chromium/ui/gfx/transform.h1
-rw-r--r--chromium/ui/gfx/transform_unittest.cc41
-rw-r--r--chromium/ui/gfx/win/hwnd_util.cc42
-rw-r--r--chromium/ui/gfx/win/hwnd_util.h6
-rw-r--r--chromium/ui/gfx/win/rendering_window_manager.cc1
-rw-r--r--chromium/ui/gfx/win/scoped_set_map_mode.h2
-rw-r--r--chromium/ui/gfx/win/window_impl.cc6
-rw-r--r--chromium/ui/gfx/win/window_impl.h2
-rw-r--r--chromium/ui/gfx/x/BUILD.gn117
-rw-r--r--chromium/ui/gfx/x/connection.cc222
-rw-r--r--chromium/ui/gfx/x/connection.h100
-rw-r--r--chromium/ui/gfx/x/connection_unittest.cc108
-rw-r--r--chromium/ui/gfx/x/event.cc103
-rw-r--r--chromium/ui/gfx/x/event.h92
-rw-r--r--chromium/ui/gfx/x/gen_xproto.py1124
-rw-r--r--chromium/ui/gfx/x/request_queue.cc29
-rw-r--r--chromium/ui/gfx/x/request_queue.h51
-rw-r--r--chromium/ui/gfx/x/x11.h21
-rw-r--r--chromium/ui/gfx/x/x11_atom_cache.cc151
-rw-r--r--chromium/ui/gfx/x/x11_atom_cache.h8
-rw-r--r--chromium/ui/gfx/x/x11_error_tracker.cc6
-rw-r--r--chromium/ui/gfx/x/x11_path.cc29
-rw-r--r--chromium/ui/gfx/x/x11_path.h8
-rw-r--r--chromium/ui/gfx/x/x11_types.cc6
-rw-r--r--chromium/ui/gfx/x/x11_types.h3
-rw-r--r--chromium/ui/gfx/x/xproto_internal.h104
-rw-r--r--chromium/ui/gfx/x/xproto_types.cc76
-rw-r--r--chromium/ui/gfx/x/xproto_types.h138
-rw-r--r--chromium/ui/gfx/x/xproto_util.cc6
-rw-r--r--chromium/ui/gl/BUILD.gn5
-rw-r--r--chromium/ui/gl/DEPS2
-rw-r--r--chromium/ui/gl/android/android_surface_control_compat.cc21
-rw-r--r--chromium/ui/gl/android/android_surface_control_compat.h1
-rw-r--r--chromium/ui/gl/angle_platform_impl.cc23
-rw-r--r--chromium/ui/gl/buffer_format_utils.cc1
-rw-r--r--chromium/ui/gl/child_window_win.cc6
-rw-r--r--chromium/ui/gl/child_window_win.h5
-rw-r--r--chromium/ui/gl/dc_layer_tree.cc14
-rw-r--r--chromium/ui/gl/direct_composition_child_surface_win.cc26
-rw-r--r--chromium/ui/gl/direct_composition_child_surface_win.h1
-rw-r--r--chromium/ui/gl/direct_composition_surface_win.cc129
-rw-r--r--chromium/ui/gl/direct_composition_surface_win.h5
-rw-r--r--chromium/ui/gl/egl_bindings_autogen_mock.cc30
-rw-r--r--chromium/ui/gl/egl_bindings_autogen_mock.h5
-rwxr-xr-xchromium/ui/gl/generate_bindings.py79
-rw-r--r--chromium/ui/gl/gl_bindings.h12
-rw-r--r--chromium/ui/gl/gl_bindings_api_autogen_egl.h3
-rw-r--r--chromium/ui/gl/gl_bindings_api_autogen_gl.h19
-rw-r--r--chromium/ui/gl/gl_bindings_autogen_egl.cc71
-rw-r--r--chromium/ui/gl/gl_bindings_autogen_egl.h21
-rw-r--r--chromium/ui/gl/gl_bindings_autogen_gl.cc305
-rw-r--r--chromium/ui/gl/gl_bindings_autogen_gl.h65
-rw-r--r--chromium/ui/gl/gl_bindings_autogen_mock.cc160
-rw-r--r--chromium/ui/gl/gl_bindings_autogen_mock.h42
-rw-r--r--chromium/ui/gl/gl_context.cc7
-rw-r--r--chromium/ui/gl/gl_context.h5
-rw-r--r--chromium/ui/gl/gl_context_egl.cc12
-rw-r--r--chromium/ui/gl/gl_context_egl.h1
-rw-r--r--chromium/ui/gl/gl_context_glx.h1
-rw-r--r--chromium/ui/gl/gl_context_glx_unittest.cc35
-rw-r--r--chromium/ui/gl/gl_features.cc2
-rw-r--r--chromium/ui/gl/gl_fence_android_native_fence_sync.cc36
-rw-r--r--chromium/ui/gl/gl_fence_android_native_fence_sync.h3
-rw-r--r--chromium/ui/gl/gl_gl_api_implementation.cc4
-rw-r--r--chromium/ui/gl/gl_image_ahardwarebuffer.cc5
-rw-r--r--chromium/ui/gl/gl_image_io_surface_egl.mm4
-rw-r--r--chromium/ui/gl/gl_image_memory.cc7
-rw-r--r--chromium/ui/gl/gl_implementation_wrapper.h1
-rw-r--r--chromium/ui/gl/gl_mock.h1
-rw-r--r--chromium/ui/gl/gl_mock_autogen_egl.h3
-rw-r--r--chromium/ui/gl/gl_mock_autogen_gl.h20
-rw-r--r--chromium/ui/gl/gl_share_group.h1
-rw-r--r--chromium/ui/gl/gl_stub_autogen_gl.cc4
-rw-r--r--chromium/ui/gl/gl_stub_autogen_gl.h19
-rw-r--r--chromium/ui/gl/gl_surface.h3
-rw-r--r--chromium/ui/gl/gl_surface_egl.cc55
-rw-r--r--chromium/ui/gl/gl_surface_egl_surface_control.cc69
-rw-r--r--chromium/ui/gl/gl_surface_egl_surface_control.h19
-rw-r--r--chromium/ui/gl/gl_surface_egl_x11.cc13
-rw-r--r--chromium/ui/gl/gl_surface_egl_x11.h5
-rw-r--r--chromium/ui/gl/gl_surface_egl_x11_gles2.cc53
-rw-r--r--chromium/ui/gl/gl_surface_egl_x11_gles2.h7
-rw-r--r--chromium/ui/gl/gl_surface_glx.cc150
-rw-r--r--chromium/ui/gl/gl_surface_glx.h5
-rw-r--r--chromium/ui/gl/gl_surface_glx_x11.cc5
-rw-r--r--chromium/ui/gl/gl_surface_glx_x11.h3
-rw-r--r--chromium/ui/gl/gl_surface_overlay.h3
-rw-r--r--chromium/ui/gl/gl_surface_presentation_helper.cc1
-rw-r--r--chromium/ui/gl/gl_switches.cc10
-rw-r--r--chromium/ui/gl/gl_switches.h2
-rw-r--r--chromium/ui/gl/gl_visual_picker_glx.cc4
-rw-r--r--chromium/ui/gl/init/BUILD.gn40
-rw-r--r--chromium/ui/gl/init/DEPS1
-rw-r--r--chromium/ui/gl/init/create_gr_gl_interface.cc1
-rw-r--r--chromium/ui/gl/init/gl_factory_linux_x11.cc (renamed from chromium/ui/gl/init/gl_factory_x11.cc)25
-rw-r--r--chromium/ui/gl/init/gl_factory_linux_x11.h98
-rw-r--r--chromium/ui/gl/init/gl_factory_ozone.cc73
-rw-r--r--chromium/ui/gl/init/gl_initializer_linux_x11.cc (renamed from chromium/ui/gl/init/gl_initializer_x11.cc)14
-rw-r--r--chromium/ui/gl/init/gl_initializer_linux_x11.h38
-rw-r--r--chromium/ui/gl/init/gl_initializer_mac.cc1
-rw-r--r--chromium/ui/gl/init/gl_initializer_ozone.cc29
-rw-r--r--chromium/ui/gl/scoped_binders.cc14
-rw-r--r--chromium/ui/gl/scoped_cgl.cc3
-rw-r--r--chromium/ui/gl/swap_chain_presenter.cc16
-rw-r--r--chromium/ui/gl/vsync_thread_win.cc43
-rw-r--r--chromium/ui/gl/vsync_thread_win.h2
-rw-r--r--chromium/ui/gl/yuv_to_rgb_converter.cc3
-rw-r--r--chromium/ui/gl/yuv_to_rgb_converter.h2
-rw-r--r--chromium/ui/gtk/BUILD.gn10
-rw-r--r--chromium/ui/gtk/gtk_ui.cc6
-rw-r--r--chromium/ui/gtk/printing/OWNERS3
-rw-r--r--chromium/ui/gtk/printing/print_dialog_gtk.cc (renamed from chromium/ui/gtk/print_dialog_gtk.cc)26
-rw-r--r--chromium/ui/gtk/printing/print_dialog_gtk.h (renamed from chromium/ui/gtk/print_dialog_gtk.h)9
-rw-r--r--chromium/ui/gtk/printing/printing_gtk_util.cc (renamed from chromium/ui/gtk/printing_gtk_util.cc)2
-rw-r--r--chromium/ui/gtk/printing/printing_gtk_util.h (renamed from chromium/ui/gtk/printing_gtk_util.h)6
-rw-r--r--chromium/ui/gtk/select_file_dialog_impl_kde.cc73
-rw-r--r--chromium/ui/gtk/x/gtk_event_loop_x11.cc47
-rw-r--r--chromium/ui/gtk/x/gtk_ui_delegate_x11.cc9
-rw-r--r--chromium/ui/latency/average_lag_tracker.cc153
-rw-r--r--chromium/ui/latency/average_lag_tracker.h6
-rw-r--r--chromium/ui/latency/latency_info.cc1
-rw-r--r--chromium/ui/latency/latency_tracker.cc14
-rw-r--r--chromium/ui/latency/latency_tracker.h11
-rw-r--r--chromium/ui/latency/mojom/BUILD.gn22
-rw-r--r--chromium/ui/latency/mojom/latency_info_mojom_traits.h10
-rw-r--r--chromium/ui/login/account_picker/chromeos_user_pod_row.js5
-rw-r--r--chromium/ui/login/display_manager.js199
-rw-r--r--chromium/ui/login/display_manager_types.js7
-rw-r--r--chromium/ui/login/screen_container.css6
-rw-r--r--chromium/ui/message_center/notification_list.cc10
-rw-r--r--chromium/ui/message_center/public/cpp/message_center_constants.h3
-rw-r--r--chromium/ui/message_center/public/cpp/notification.h17
-rw-r--r--chromium/ui/message_center/vector_icons/vector_icons.cc.template1
-rw-r--r--chromium/ui/message_center/views/message_popup_collection.cc23
-rw-r--r--chromium/ui/message_center/views/message_popup_collection.h5
-rw-r--r--chromium/ui/message_center/views/message_popup_collection_unittest.cc42
-rw-r--r--chromium/ui/message_center/views/message_view.h4
-rw-r--r--chromium/ui/message_center/views/notification_header_view.cc42
-rw-r--r--chromium/ui/message_center/views/notification_header_view.h11
-rw-r--r--chromium/ui/message_center/views/notification_header_view_unittest.cc4
-rw-r--r--chromium/ui/message_center/views/notification_view_md.cc27
-rw-r--r--chromium/ui/message_center/views/notification_view_md.h2
-rw-r--r--chromium/ui/message_center/views/notification_view_md_unittest.cc110
-rw-r--r--chromium/ui/native_theme/common_theme.cc6
-rw-r--r--chromium/ui/native_theme/native_theme.cc21
-rw-r--r--chromium/ui/native_theme/native_theme.h52
-rw-r--r--chromium/ui/native_theme/native_theme_aura.cc42
-rw-r--r--chromium/ui/native_theme/native_theme_base.cc79
-rw-r--r--chromium/ui/native_theme/native_theme_base.h18
-rw-r--r--chromium/ui/native_theme/native_theme_color_id.h4
-rw-r--r--chromium/ui/native_theme/native_theme_mac.h60
-rw-r--r--chromium/ui/native_theme/native_theme_mac.mm296
-rw-r--r--chromium/ui/native_theme/native_theme_mac_unittest.cc27
-rw-r--r--chromium/ui/native_theme/native_theme_win.cc17
-rw-r--r--chromium/ui/native_theme/native_theme_win_unittest.cc108
-rw-r--r--chromium/ui/native_theme/themed_vector_icon.cc7
-rw-r--r--chromium/ui/native_theme/themed_vector_icon.h7
-rw-r--r--chromium/ui/ozone/BUILD.gn9
-rw-r--r--chromium/ui/ozone/demo/gl_renderer.cc14
-rw-r--r--chromium/ui/ozone/demo/gl_renderer.h4
-rw-r--r--chromium/ui/ozone/demo/skia/skia_gl_renderer.cc17
-rw-r--r--chromium/ui/ozone/demo/skia/skia_gl_renderer.h4
-rw-r--r--chromium/ui/ozone/demo/skia/skia_renderer_factory.h1
-rw-r--r--chromium/ui/ozone/demo/skia/skia_surfaceless_gl_renderer.cc9
-rw-r--r--chromium/ui/ozone/demo/skia/skia_surfaceless_gl_renderer.h3
-rw-r--r--chromium/ui/ozone/demo/surfaceless_gl_renderer.cc11
-rw-r--r--chromium/ui/ozone/demo/surfaceless_gl_renderer.h3
-rw-r--r--chromium/ui/ozone/demo/vulkan_renderer.cc1
-rw-r--r--chromium/ui/ozone/ozone.gni7
-rw-r--r--chromium/ui/ozone/platform/cast/BUILD.gn1
-rw-r--r--chromium/ui/ozone/platform/cast/ozone_platform_cast.cc10
-rw-r--r--chromium/ui/ozone/platform/drm/BUILD.gn3
-rw-r--r--chromium/ui/ozone/platform/drm/common/drm_util.cc3
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_device.h1
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_device_manager.cc1
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_display.cc70
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_display.h11
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_display_unittest.cc192
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_framebuffer.cc1
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc12
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h6
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_gpu_util.cc1
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_thread.cc46
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_thread.h17
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_window_proxy.cc7
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_window_proxy.h6
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc33
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.h9
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/hardware_display_plane.cc9
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc1
-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.cc1
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc1
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/screen_manager.cc1
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.cc1
-rw-r--r--chromium/ui/ozone/platform/drm/host/drm_device_handle.cc1
-rw-r--r--chromium/ui/ozone/platform/drm/host/drm_display_host.cc12
-rw-r--r--chromium/ui/ozone/platform/drm/host/gpu_thread_adapter.h11
-rw-r--r--chromium/ui/ozone/platform/drm/host/host_drm_device.cc27
-rw-r--r--chromium/ui/ozone/platform/drm/host/host_drm_device.h7
-rw-r--r--chromium/ui/ozone/platform/drm/ozone_platform_gbm.cc10
-rw-r--r--chromium/ui/ozone/platform/headless/BUILD.gn2
-rw-r--r--chromium/ui/ozone/platform/headless/ozone_platform_headless.cc10
-rw-r--r--chromium/ui/ozone/platform/scenic/BUILD.gn2
-rw-r--r--chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc10
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_surface.cc17
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_surface.h6
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc7
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_window.cc26
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_window.h4
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_window_manager.cc4
-rw-r--r--chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc58
-rw-r--r--chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h15
-rw-r--r--chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.cc8
-rw-r--r--chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.h5
-rw-r--r--chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc14
-rw-r--r--chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.h4
-rw-r--r--chromium/ui/ozone/platform/wayland/BUILD.gn21
-rw-r--r--chromium/ui/ozone/platform/wayland/DEPS2
-rw-r--r--chromium/ui/ozone/platform/wayland/OWNERS1
-rw-r--r--chromium/ui/ozone/platform/wayland/common/data_util.cc218
-rw-r--r--chromium/ui/ozone/platform/wayland/common/data_util.h40
-rw-r--r--chromium/ui/ozone/platform/wayland/common/wayland_object.cc11
-rw-r--r--chromium/ui/ozone/platform/wayland/common/wayland_object.h14
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/drm_render_node_handle.cc2
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc68
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.h17
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.cc3
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory_unittest.cc4
-rw-r--r--chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device.cc9
-rw-r--r--chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.cc31
-rw-r--r--chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.h26
-rw-r--r--chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_source.cc76
-rw-r--r--chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_source.h46
-rw-r--r--chromium/ui/ozone/platform/wayland/host/shell_object_factory.cc3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/shell_popup_wrapper.cc3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc192
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h1
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_clipboard.cc221
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_clipboard.h54
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_connection.cc112
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_connection.h83
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_cursor.cc1
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_device.cc478
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_device.h139
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_device_base.cc3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_device_base.h1
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_device_manager.cc22
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_device_manager.h20
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_device_unittest.cc293
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc355
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.h136
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc406
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_source.cc226
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_source.h126
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_source_base.cc21
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_source_base.h38
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_drm.cc1
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_event_source.cc54
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_event_source.h22
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_keyboard.cc26
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_keyboard.h21
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_pointer.cc11
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_pointer.h1
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc2
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_popup.cc4
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_shm_buffer.cc1
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_subsurface.cc10
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_surface.cc347
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_surface.h129
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc368
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.h131
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window.cc63
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window.h23
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc325
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.h126
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc519
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_factory.cc6
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_manager.cc5
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_manager.h4
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_observer.cc2
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_observer.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_unittest.cc204
-rw-r--r--chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.cc157
-rw-r--r--chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.h6
-rw-r--r--chromium/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.cc2
-rw-r--r--chromium/ui/ozone/platform/wayland/ozone_platform_wayland.cc7
-rw-r--r--chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.cc16
-rw-r--r--chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.h5
-rw-r--r--chromium/ui/ozone/platform/wayland/test/scoped_wl_array.cc41
-rw-r--r--chromium/ui/ozone/platform/wayland/test/scoped_wl_array.h31
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_data_device.cc21
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_data_device.h15
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_data_source.cc18
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_data_source.h10
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_subsurface.cc2
-rw-r--r--chromium/ui/ozone/platform/wayland/test/wayland_test.cc35
-rw-r--r--chromium/ui/ozone/platform/wayland/test/wayland_test.h13
-rw-r--r--chromium/ui/ozone/platform/wayland/wayland_buffer_manager_unittest.cc322
-rw-r--r--chromium/ui/ozone/platform/windows/BUILD.gn2
-rw-r--r--chromium/ui/ozone/platform/windows/ozone_platform_windows.cc10
-rw-r--r--chromium/ui/ozone/platform/x11/BUILD.gn14
-rw-r--r--chromium/ui/ozone/platform/x11/ozone_platform_x11.cc47
-rw-r--r--chromium/ui/ozone/platform/x11/x11_clipboard_ozone.cc229
-rw-r--r--chromium/ui/ozone/platform/x11/x11_clipboard_ozone.h39
-rw-r--r--chromium/ui/ozone/platform/x11/x11_cursor_factory_ozone.cc118
-rw-r--r--chromium/ui/ozone/platform/x11/x11_cursor_factory_ozone.h55
-rw-r--r--chromium/ui/ozone/platform/x11/x11_cursor_ozone.h55
-rw-r--r--chromium/ui/ozone/platform/x11/x11_os_exchange_data_provider_ozone.cc14
-rw-r--r--chromium/ui/ozone/platform/x11/x11_os_exchange_data_provider_ozone.h5
-rw-r--r--chromium/ui/ozone/platform/x11/x11_screen_ozone.cc10
-rw-r--r--chromium/ui/ozone/platform/x11/x11_screen_ozone.h3
-rw-r--r--chromium/ui/ozone/platform/x11/x11_screen_ozone_unittest.cc6
-rw-r--r--chromium/ui/ozone/platform/x11/x11_surface_factory.cc3
-rw-r--r--chromium/ui/ozone/platform/x11/x11_window_ozone.cc158
-rw-r--r--chromium/ui/ozone/platform/x11/x11_window_ozone.h66
-rw-r--r--chromium/ui/ozone/platform/x11/x11_window_ozone_chromeos.cc28
-rw-r--r--chromium/ui/ozone/platform/x11/x11_window_ozone_chromeos.h33
-rw-r--r--chromium/ui/ozone/platform/x11/x11_window_ozone_unittest.cc27
-rw-r--r--chromium/ui/ozone/public/cursor_factory_ozone.cc63
-rw-r--r--chromium/ui/ozone/public/input_controller.cc2
-rw-r--r--chromium/ui/ozone/public/input_controller.h2
-rw-r--r--chromium/ui/ozone/public/mojom/drm_device.mojom11
-rw-r--r--chromium/ui/ozone/public/ozone_platform.cc17
-rw-r--r--chromium/ui/ozone/public/ozone_platform.h34
-rw-r--r--chromium/ui/ozone/public/platform_clipboard.h1
-rw-r--r--chromium/ui/ozone/public/platform_screen.cc2
-rw-r--r--chromium/ui/ozone/public/platform_window_surface.h16
-rw-r--r--chromium/ui/platform_window/BUILD.gn4
-rw-r--r--chromium/ui/platform_window/fuchsia/initialize_presenter_api_view.cc15
-rw-r--r--chromium/ui/platform_window/platform_window_handler/wm_drag_handler.cc2
-rw-r--r--chromium/ui/platform_window/platform_window_handler/wm_drag_handler.h22
-rw-r--r--chromium/ui/platform_window/x11/BUILD.gn35
-rw-r--r--chromium/ui/platform_window/x11/atk_event_conversion.cc12
-rw-r--r--chromium/ui/platform_window/x11/atk_event_conversion.h3
-rw-r--r--chromium/ui/platform_window/x11/x11_topmost_window_finder.cc25
-rw-r--r--chromium/ui/platform_window/x11/x11_topmost_window_finder.h11
-rw-r--r--chromium/ui/platform_window/x11/x11_window.cc224
-rw-r--r--chromium/ui/platform_window/x11/x11_window.h71
-rw-r--r--chromium/ui/shell_dialogs/BUILD.gn9
-rw-r--r--chromium/ui/shell_dialogs/select_file_dialog_android.cc8
-rw-r--r--chromium/ui/shell_dialogs/select_file_dialog_lacros.cc60
-rw-r--r--chromium/ui/shell_dialogs/select_file_dialog_lacros.h60
-rw-r--r--chromium/ui/shell_dialogs/select_file_dialog_mac.mm2
-rw-r--r--chromium/ui/shell_dialogs/select_file_dialog_win.cc9
-rw-r--r--chromium/ui/snapshot/snapshot_aura.cc3
-rw-r--r--chromium/ui/strings/translations/ui_strings_af.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_am.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_ar.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_as.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_az.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_be.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_bg.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_bn.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_bs.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_ca.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_cs.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_da.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_de.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_el.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_en-GB.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_es-419.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_es.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_et.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_eu.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_fa.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_fi.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_fil.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_fr-CA.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_fr.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_gl.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_gu.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_hi.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_hr.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_hu.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_hy.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_id.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_is.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_it.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_iw.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_ja.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_ka.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_kk.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_km.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_kn.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_ko.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_ky.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_lo.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_lt.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_lv.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_mk.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_ml.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_mn.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_mr.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_ms.xtb8
-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.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_no.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_or.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_pa.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_pl.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_pt-BR.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_pt-PT.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_ro.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_ru.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_si.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_sk.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_sl.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_sq.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_sr-Latn.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_sr.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_sv.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_sw.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_ta.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_te.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_th.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_tr.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_uk.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_ur.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_uz.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_vi.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_zh-CN.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_zh-HK.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_zh-TW.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_zu.xtb8
-rw-r--r--chromium/ui/strings/ui_strings.grd22
-rw-r--r--chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_MANAGE_SETTINGS.png.sha11
-rw-r--r--chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_SEARCH_BOX_ACCESSIBILITY_NAME_CLAMSHELL.png.sha11
-rw-r--r--chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_SEARCH_BOX_ACCESSIBILITY_NAME_TABLET.png.sha11
-rw-r--r--chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_SEARCH_BOX_PLACEHOLDER.png.sha11
-rw-r--r--chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_SUGGESTED_CONTENT_INFO.png.sha11
-rw-r--r--chromium/ui/strings/ui_strings_grd/IDS_MENU_ITEM_NEW_BADGE.png.sha11
-rw-r--r--chromium/ui/touch_selection/touch_handle.h1
-rw-r--r--chromium/ui/views/BUILD.gn31
-rw-r--r--chromium/ui/views/accessibility/ax_tree_source_views_unittest.cc2
-rw-r--r--chromium/ui/views/accessibility/ax_virtual_view.cc14
-rw-r--r--chromium/ui/views/accessibility/ax_virtual_view.h5
-rw-r--r--chromium/ui/views/accessibility/ax_virtual_view_unittest.cc13
-rw-r--r--chromium/ui/views/accessibility/ax_widget_obj_wrapper.cc9
-rw-r--r--chromium/ui/views/accessibility/ax_widget_obj_wrapper.h1
-rw-r--r--chromium/ui/views/accessibility/ax_window_obj_wrapper.cc28
-rw-r--r--chromium/ui/views/accessibility/ax_window_obj_wrapper.h10
-rw-r--r--chromium/ui/views/accessibility/view_accessibility.cc25
-rw-r--r--chromium/ui/views/accessibility/view_accessibility.h15
-rw-r--r--chromium/ui/views/accessibility/view_ax_platform_node_delegate.cc96
-rw-r--r--chromium/ui/views/accessibility/view_ax_platform_node_delegate.h13
-rw-r--r--chromium/ui/views/accessibility/view_ax_platform_node_delegate_auralinux_unittest.cc42
-rw-r--r--chromium/ui/views/accessibility/view_ax_platform_node_delegate_win_unittest.cc16
-rw-r--r--chromium/ui/views/animation/animation_delegate_views.cc22
-rw-r--r--chromium/ui/views/animation/animation_delegate_views.h2
-rw-r--r--chromium/ui/views/animation/bounds_animator.cc18
-rw-r--r--chromium/ui/views/animation/bounds_animator_unittest.cc148
-rw-r--r--chromium/ui/views/animation/compositor_animation_runner.cc1
-rw-r--r--chromium/ui/views/animation/compositor_animation_runner.h8
-rw-r--r--chromium/ui/views/animation/installable_ink_drop_painter_unittest.cc87
-rw-r--r--chromium/ui/views/animation/installable_ink_drop_unittest.cc69
-rw-r--r--chromium/ui/views/bubble/bubble_dialog_delegate_view.cc313
-rw-r--r--chromium/ui/views/bubble/bubble_dialog_delegate_view.h436
-rw-r--r--chromium/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc75
-rw-r--r--chromium/ui/views/bubble/bubble_frame_view.cc79
-rw-r--r--chromium/ui/views/bubble/bubble_frame_view.h17
-rw-r--r--chromium/ui/views/bubble/bubble_frame_view_unittest.cc28
-rw-r--r--chromium/ui/views/controls/button/button.cc9
-rw-r--r--chromium/ui/views/controls/button/button.h4
-rw-r--r--chromium/ui/views/controls/button/button_unittest.cc34
-rw-r--r--chromium/ui/views/controls/button/checkbox_unittest.cc4
-rw-r--r--chromium/ui/views/controls/button/image_button_factory.cc14
-rw-r--r--chromium/ui/views/controls/button/image_button_factory.h6
-rw-r--r--chromium/ui/views/controls/button/image_button_factory_unittest.cc10
-rw-r--r--chromium/ui/views/controls/button/label_button.cc39
-rw-r--r--chromium/ui/views/controls/button/label_button_label_unittest.cc26
-rw-r--r--chromium/ui/views/controls/button/label_button_unittest.cc23
-rw-r--r--chromium/ui/views/controls/button/md_text_button.cc14
-rw-r--r--chromium/ui/views/controls/button/md_text_button.h7
-rw-r--r--chromium/ui/views/controls/button/md_text_button_unittest.cc25
-rw-r--r--chromium/ui/views/controls/button/radio_button_unittest.cc3
-rw-r--r--chromium/ui/views/controls/combobox/combobox.cc97
-rw-r--r--chromium/ui/views/controls/combobox/combobox.h4
-rw-r--r--chromium/ui/views/controls/combobox/combobox_unittest.cc82
-rw-r--r--chromium/ui/views/controls/editable_combobox/editable_combobox.cc78
-rw-r--r--chromium/ui/views/controls/editable_combobox/editable_combobox.h18
-rw-r--r--chromium/ui/views/controls/focus_ring.cc33
-rw-r--r--chromium/ui/views/controls/focus_ring.h32
-rw-r--r--chromium/ui/views/controls/label.cc25
-rw-r--r--chromium/ui/views/controls/label.h14
-rw-r--r--chromium/ui/views/controls/label_unittest.cc5
-rw-r--r--chromium/ui/views/controls/menu/menu_controller.cc33
-rw-r--r--chromium/ui/views/controls/menu/menu_controller.h10
-rw-r--r--chromium/ui/views/controls/menu/menu_controller_unittest.cc21
-rw-r--r--chromium/ui/views/controls/menu/menu_delegate.h1
-rw-r--r--chromium/ui/views/controls/menu/menu_host.cc1
-rw-r--r--chromium/ui/views/controls/menu/menu_item_view.cc161
-rw-r--r--chromium/ui/views/controls/menu/menu_item_view.h32
-rw-r--r--chromium/ui/views/controls/menu/menu_item_view_unittest.cc33
-rw-r--r--chromium/ui/views/controls/menu/menu_model_adapter.cc17
-rw-r--r--chromium/ui/views/controls/menu/menu_model_adapter_unittest.cc22
-rw-r--r--chromium/ui/views/controls/menu/submenu_view.cc33
-rw-r--r--chromium/ui/views/controls/prefix_selector.cc9
-rw-r--r--chromium/ui/views/controls/prefix_selector.h5
-rw-r--r--chromium/ui/views/controls/scroll_view.h2
-rw-r--r--chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.h3
-rw-r--r--chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.mm48
-rw-r--r--chromium/ui/views/controls/tabbed_pane/tabbed_pane.cc15
-rw-r--r--chromium/ui/views/controls/tabbed_pane/tabbed_pane.h2
-rw-r--r--chromium/ui/views/controls/tabbed_pane/tabbed_pane_unittest.cc2
-rw-r--r--chromium/ui/views/controls/table/table_view.cc2
-rw-r--r--chromium/ui/views/controls/table/table_view.h3
-rw-r--r--chromium/ui/views/controls/textfield/textfield.cc34
-rw-r--r--chromium/ui/views/controls/textfield/textfield.h13
-rw-r--r--chromium/ui/views/controls/textfield/textfield_test_api.cc7
-rw-r--r--chromium/ui/views/controls/textfield/textfield_test_api.h10
-rw-r--r--chromium/ui/views/controls/textfield/textfield_unittest.cc77
-rw-r--r--chromium/ui/views/controls/tree/tree_view.cc341
-rw-r--r--chromium/ui/views/controls/tree/tree_view.h41
-rw-r--r--chromium/ui/views/controls/tree/tree_view_unittest.cc273
-rw-r--r--chromium/ui/views/controls/views_text_services_context_menu.cc28
-rw-r--r--chromium/ui/views/controls/views_text_services_context_menu.h21
-rw-r--r--chromium/ui/views/controls/views_text_services_context_menu_base.cc29
-rw-r--r--chromium/ui/views/controls/views_text_services_context_menu_base.h27
-rw-r--r--chromium/ui/views/controls/views_text_services_context_menu_mac.mm187
-rw-r--r--chromium/ui/views/controls/webview/webview.cc8
-rw-r--r--chromium/ui/views/controls/webview/webview.h2
-rw-r--r--chromium/ui/views/controls/webview/webview_unittest.cc4
-rw-r--r--chromium/ui/views/corewm/tooltip_aura.cc107
-rw-r--r--chromium/ui/views/corewm/tooltip_aura.h12
-rw-r--r--chromium/ui/views/corewm/tooltip_controller.cc25
-rw-r--r--chromium/ui/views/corewm/tooltip_controller.h4
-rw-r--r--chromium/ui/views/corewm/tooltip_controller_test_helper.h1
-rw-r--r--chromium/ui/views/corewm/tooltip_controller_unittest.cc7
-rw-r--r--chromium/ui/views/examples/combobox_example.cc2
-rw-r--r--chromium/ui/views/examples/example_combobox_model.cc2
-rw-r--r--chromium/ui/views/examples/example_combobox_model.h2
-rw-r--r--chromium/ui/views/examples/examples_main_proc.cc1
-rw-r--r--chromium/ui/views/examples/examples_skia_gold_pixel_diff.cc4
-rw-r--r--chromium/ui/views/examples/examples_skia_gold_pixel_diff.h2
-rw-r--r--chromium/ui/views/examples/examples_window.cc7
-rw-r--r--chromium/ui/views/focus/focus_manager.cc38
-rw-r--r--chromium/ui/views/focus/focus_manager.h3
-rw-r--r--chromium/ui/views/focus/focus_manager_unittest.cc53
-rw-r--r--chromium/ui/views/focus/focus_search.cc7
-rw-r--r--chromium/ui/views/focus/focus_traversal_unittest.cc2
-rw-r--r--chromium/ui/views/layout/grid_layout.h2
-rw-r--r--chromium/ui/views/linux_ui/linux_ui.cc1
-rw-r--r--chromium/ui/views/linux_ui/linux_ui.h4
-rw-r--r--chromium/ui/views/native_cursor_mac.mm2
-rw-r--r--chromium/ui/views/touchui/touch_selection_controller_impl.cc134
-rw-r--r--chromium/ui/views/touchui/touch_selection_controller_impl.h20
-rw-r--r--chromium/ui/views/touchui/touch_selection_controller_impl_unittest.cc2
-rw-r--r--chromium/ui/views/touchui/touch_selection_menu_views.cc19
-rw-r--r--chromium/ui/views/touchui/touch_selection_menu_views.h4
-rw-r--r--chromium/ui/views/vector_icons/vector_icons.cc.template1
-rw-r--r--chromium/ui/views/view.cc55
-rw-r--r--chromium/ui/views/view.h6
-rw-r--r--chromium/ui/views/view_class_properties.cc4
-rw-r--r--chromium/ui/views/view_class_properties.h6
-rw-r--r--chromium/ui/views/view_model.h2
-rw-r--r--chromium/ui/views/view_targeter_unittest.cc25
-rw-r--r--chromium/ui/views/view_unittest.cc10
-rw-r--r--chromium/ui/views/views_features.cc5
-rw-r--r--chromium/ui/views/views_features.h1
-rw-r--r--chromium/ui/views/widget/ax_native_widget_mac_unittest.mm2
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc61
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.h10
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11_unittest.cc468
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.cc313
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.h86
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc77
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc51
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.h10
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_drop_target_win.cc11
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_screen.cc2
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_screen_linux.cc35
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_screen_ozone.cc6
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_screen_win.cc4
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_screen_win.h2
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_screen_x11.cc34
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_screen_x11.h9
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc17
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h8
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_unittest.cc228
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc64
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc26
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h8
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc16
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h5
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_interactive_uitest.cc52
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc675
-rw-r--r--chromium/ui/views/widget/desktop_aura/x11_drag_drop_client_unittest.cc827
-rw-r--r--chromium/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc217
-rw-r--r--chromium/ui/views/widget/native_widget_aura_unittest.cc21
-rw-r--r--chromium/ui/views/widget/root_view_unittest.cc28
-rw-r--r--chromium/ui/views/widget/unique_widget_ptr.cc97
-rw-r--r--chromium/ui/views/widget/unique_widget_ptr.h43
-rw-r--r--chromium/ui/views/widget/unique_widget_ptr_unittest.cc133
-rw-r--r--chromium/ui/views/widget/widget.cc24
-rw-r--r--chromium/ui/views/widget/widget_delegate.cc47
-rw-r--r--chromium/ui/views/widget/widget_delegate.h68
-rw-r--r--chromium/ui/views/widget/widget_deletion_observer.cc1
-rw-r--r--chromium/ui/views/widget/widget_hwnd_utils.cc2
-rw-r--r--chromium/ui/views/widget/widget_interactive_uitest.cc30
-rw-r--r--chromium/ui/views/widget/window_reorderer_unittest.cc12
-rw-r--r--chromium/ui/views/win/hwnd_message_handler.cc83
-rw-r--r--chromium/ui/views/win/hwnd_message_handler.h26
-rw-r--r--chromium/ui/views/window/custom_frame_view_unittest.cc53
-rw-r--r--chromium/ui/views/window/dialog_delegate.cc7
-rw-r--r--chromium/ui/views/window/dialog_delegate.h20
-rw-r--r--chromium/ui/views/window/dialog_delegate_unittest.cc19
-rw-r--r--chromium/ui/views/window/vector_icons/vector_icons.cc.template1
-rw-r--r--chromium/ui/views_content_client/views_content_client_main_parts_desktop_aura.cc2
-rw-r--r--chromium/ui/webui/PLATFORM_OWNERS2
-rw-r--r--chromium/ui/webui/mojo_web_ui_controller.h8
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.js11
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.js11
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_entry.js9
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_list.js9
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.js15
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.js9
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.js11
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_shared_css.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.js15
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificates_browser_proxy.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.js9
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/BUILD.gn30
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/bluetooth/BUILD.gn68
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_dialog.html (renamed from chromium/ui/webui/resources/cr_components/chromeos/bluetooth_dialog.html)15
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_dialog.js (renamed from chromium/ui/webui/resources/cr_components/chromeos/bluetooth_dialog.js)0
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/base_page.html4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.html10
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.html14
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/final_page.html6
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.html2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/provisioning_page.html10
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/sim_detect_page.html8
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/BUILD.gn3
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/button_bar.html6
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/fake_mojo_service.html4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/icons.html2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/mojo_api.html4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html24
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_browser_proxy.html4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_delegate.html4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html8
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.html14
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.html14
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.js5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/start_setup_page.html18
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/ui_page.html8
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/ui_page_container_behavior.html6
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/BUILD.gn3
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/cellular_0.svg4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/cellular_0_with_x.svg8
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/cellular_1.svg6
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/cellular_2.svg6
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/cellular_3.svg6
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/cellular_4.svg4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/cellular_off.svg4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/ethernet.svg6
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/mojo_interface_provider.html2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_apnlist.html8
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.html10
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_config.html33
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_config_element_behavior.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_config_input.html10
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_config_select.html14
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_config_toggle.html15
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_config_toggle.js19
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_icon.html6
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_icons.html23
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.html10
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_list.html4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_list.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.html16
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.html16
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_password_input.html16
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.html12
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy.html18
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_exclusions.html8
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_input.html6
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_select.html4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_select.js9
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_shared_css.html2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.html18
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.html2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js35
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/wifi_0.svg4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/wifi_0_with_x.svg9
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/wifi_1.svg6
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/wifi_2.svg5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/wifi_3.svg5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/wifi_4.svg4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/wifi_off.svg4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network_health/BUILD.gn53
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.html49
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js94
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/lock_screen_constants.html2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.html23
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard_icon.html4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/setup_pin_keyboard.html14
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.html40
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/smb_shares/smb_browser_proxy.html4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/smb_shares/smb_browser_proxy.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/cr_components_images.grdp40
-rw-r--r--chromium/ui/webui/resources/cr_components/cr_components_resources.grdp319
-rw-r--r--chromium/ui/webui/resources/cr_components/cr_components_resources_v3.grdp64
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.html4
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html1
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html2
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js5
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html5
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js24
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html22
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js15
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_input/cr_input.html24
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_input/cr_input.js3
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_input/cr_input_style_css.html7
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toast/BUILD.gn8
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast.js1
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.js9
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html4
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html24
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js11
-rw-r--r--chromium/ui/webui/resources/cr_elements/policy/cr_policy_network_behavior_mojo.js2
-rw-r--r--chromium/ui/webui/resources/cr_elements/policy/cr_policy_pref_indicator.js38
-rw-r--r--chromium/ui/webui/resources/cr_elements/shared_vars_css.html12
-rw-r--r--chromium/ui/webui/resources/cr_elements_images.grdp48
-rw-r--r--chromium/ui/webui/resources/cr_elements_resources.grdp294
-rw-r--r--chromium/ui/webui/resources/cr_elements_resources_v3.grdp153
-rw-r--r--chromium/ui/webui/resources/cr_polymer_resources.grdp49
-rw-r--r--chromium/ui/webui/resources/cr_polymer_resources_v3.grdp12
-rw-r--r--chromium/ui/webui/resources/css/cros_colors.json56
-rw-r--r--chromium/ui/webui/resources/js/BUILD.gn5
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/command.js2
-rw-r--r--chromium/ui/webui/resources/js/load_time_data.js6
-rw-r--r--chromium/ui/webui/resources/js/parse_html_subset.js155
-rw-r--r--chromium/ui/webui/resources/js/plural_string_proxy.js33
-rw-r--r--chromium/ui/webui/resources/polymer_resources.grdp368
-rw-r--r--chromium/ui/webui/resources/polymer_resources_v3.grdp204
-rw-r--r--chromium/ui/webui/resources/webui_resources.grd319
-rw-r--r--chromium/ui/webui/webui_features.gni5
-rw-r--r--chromium/ui/wm/BUILD.gn6
-rw-r--r--chromium/ui/wm/core/compound_event_filter.cc11
-rw-r--r--chromium/ui/wm/core/compound_event_filter_unittest.cc6
-rw-r--r--chromium/ui/wm/core/cursor_manager.cc30
-rw-r--r--chromium/ui/wm/core/cursor_manager.h3
-rw-r--r--chromium/ui/wm/core/default_activation_client.h1
-rw-r--r--chromium/ui/wm/core/focus_controller_unittest.cc49
-rw-r--r--chromium/ui/wm/core/transient_window_manager.cc4
-rw-r--r--chromium/ui/wm/core/visibility_controller.h1
-rw-r--r--chromium/ui/wm/core/window_animations.cc8
-rw-r--r--chromium/ui/wm/core/window_animations.h2
-rw-r--r--chromium/ui/wm/public/scoped_tooltip_disabler.cc4
-rw-r--r--chromium/ui/wm/public/scoped_tooltip_disabler.h8
1388 files changed, 48575 insertions, 32442 deletions
diff --git a/chromium/ui/accelerated_widget_mac/ca_layer_tree_coordinator.h b/chromium/ui/accelerated_widget_mac/ca_layer_tree_coordinator.h
index 5fb42fd647d..c6ae9a055f3 100644
--- a/chromium/ui/accelerated_widget_mac/ca_layer_tree_coordinator.h
+++ b/chromium/ui/accelerated_widget_mac/ca_layer_tree_coordinator.h
@@ -36,7 +36,7 @@ class ACCELERATED_WIDGET_MAC_EXPORT CALayerTreeCoordinator {
// Commit the pending frame's OpenGL backbuffer or CALayer tree to be
// attached to the root CALayer.
- void CommitPendingTreesToCA(const gfx::Rect& pixel_damage_rect);
+ void CommitPendingTreesToCA();
// Get the root CALayer to display the current frame. This does not change
// over the lifetime of the object.
diff --git a/chromium/ui/accelerated_widget_mac/ca_layer_tree_coordinator.mm b/chromium/ui/accelerated_widget_mac/ca_layer_tree_coordinator.mm
index c86751a944f..2d50aa7207e 100644
--- a/chromium/ui/accelerated_widget_mac/ca_layer_tree_coordinator.mm
+++ b/chromium/ui/accelerated_widget_mac/ca_layer_tree_coordinator.mm
@@ -6,6 +6,7 @@
#import <AVFoundation/AVFoundation.h>
+#include "base/logging.h"
#include "base/mac/mac_util.h"
#include "base/trace_event/trace_event.h"
#include "ui/base/cocoa/animation_utils.h"
@@ -40,8 +41,7 @@ CARendererLayerTree* CALayerTreeCoordinator::GetPendingCARendererLayerTree() {
return pending_ca_renderer_layer_tree_.get();
}
-void CALayerTreeCoordinator::CommitPendingTreesToCA(
- const gfx::Rect& pixel_damage_rect) {
+void CALayerTreeCoordinator::CommitPendingTreesToCA() {
// Update the CALayer hierarchy.
ScopedCAActionDisabler disabler;
if (pending_ca_renderer_layer_tree_) {
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 90ebd774026..f66002644bf 100644
--- a/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm
+++ b/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm
@@ -12,6 +12,7 @@
#include <utility>
#include "base/command_line.h"
+#include "base/logging.h"
#include "base/trace_event/trace_event.h"
#include "components/metal_util/hdr_copier_layer.h"
#include "third_party/skia/include/core/SkColor.h"
diff --git a/chromium/ui/accelerated_widget_mac/display_ca_layer_tree.mm b/chromium/ui/accelerated_widget_mac/display_ca_layer_tree.mm
index 38f25d6314f..0db8f3e223e 100644
--- a/chromium/ui/accelerated_widget_mac/display_ca_layer_tree.mm
+++ b/chromium/ui/accelerated_widget_mac/display_ca_layer_tree.mm
@@ -8,6 +8,7 @@
#include <IOSurface/IOSurface.h>
#include "base/debug/dump_without_crashing.h"
+#include "base/logging.h"
#include "base/mac/mac_util.h"
#include "base/mac/scoped_cftyperef.h"
#include "base/trace_event/trace_event.h"
diff --git a/chromium/ui/accessibility/BUILD.gn b/chromium/ui/accessibility/BUILD.gn
index fc74899db46..0297bff6f13 100644
--- a/chromium/ui/accessibility/BUILD.gn
+++ b/chromium/ui/accessibility/BUILD.gn
@@ -16,6 +16,10 @@ if (is_android) {
import("//build/config/android/rules.gni")
}
+if (is_win) {
+ import("//build/toolchain/win/midl.gni")
+}
+
# Reset sources_assignment_filter for the BUILD.gn file to prevent
# regression during the migration of Chromium away from the feature.
# See docs/no_sources_assignment_filter.md for more information.
@@ -41,6 +45,10 @@ jumbo_component("ax_base") {
defines = [ "AX_BASE_IMPLEMENTATION" ]
sources = [
+ "accessibility_features.cc",
+ "accessibility_features.h",
+ "accessibility_switches.cc",
+ "accessibility_switches.h",
"ax_base_export.h",
"ax_enum_util.cc",
"ax_enum_util.h",
@@ -70,14 +78,18 @@ jumbo_component("ax_base") {
]
}
+#if (is_win) {
+# midl("ichromeaccessible") {
+# sources = [
+# "platform/ichromeaccessible.idl",
+# ]
+# }
+#}
+
jumbo_component("accessibility") {
defines = [ "AX_IMPLEMENTATION" ]
sources = [
- "accessibility_features.cc",
- "accessibility_features.h",
- "accessibility_switches.cc",
- "accessibility_switches.h",
"ax_action_data.cc",
"ax_action_data.h",
"ax_action_handler.cc",
@@ -132,85 +144,21 @@ jumbo_component("accessibility") {
"ax_tree_update_forward.h",
"null_ax_action_target.cc",
"null_ax_action_target.h",
-
- # ax_android_constants* are used in ax_assistant_structure.cc.
- "platform/ax_android_constants.cc",
- "platform/ax_android_constants.h",
-
- # ax_platform_node* are used for enable/disable accessibility and
- # test_ax_node_wrapper.
- "platform/ax_platform_node.cc",
- "platform/ax_platform_node.h",
- "platform/ax_platform_node_base.cc",
- "platform/ax_platform_node_base.h",
- "platform/ax_platform_node_delegate.h",
- "platform/ax_platform_node_delegate_base.cc",
- "platform/ax_platform_node_delegate_base.h",
-
- # ax_platform_node_test_helper.{cc,h} are used in
- # browser_view_browsertest.cc
- "platform/ax_platform_node_test_helper.cc",
- "platform/ax_platform_node_test_helper.h",
-
- # ax_unique_id.{cc,h} are used in browser_accessibility.cc and
- # view_accessibility.cc
- "platform/ax_unique_id.cc",
- "platform/ax_unique_id.h",
-
- # compute_attributes.{cc,h} are used in
- # accessibility_tree_formatter_blink.cc
- "platform/compute_attributes.cc",
- "platform/compute_attributes.h",
]
- deps = [ "//third_party/cld_3/src/src:cld_3" ]
+ deps = [
+ "//base/util/values:values_util",
+ "//third_party/cld_3/src/src:cld_3",
+ ]
public_deps = [
":ax_base",
- "//ui/display",
+ "//ui/accessibility/platform",
]
- if (has_native_accessibility) {
- sources += [
- "platform/ax_platform_text_boundary.cc",
- "platform/ax_platform_text_boundary.h",
- ]
-
- if (use_atk) {
- # ax_platform_text_boundary.h includes atk.h, so ATK is needed as a public
- # config to ensure anything that includes this is able to find atk.h.
- public_configs = [ "//build/config/linux/atk" ]
- }
- }
-
- if (is_win) {
- sources += [
- "platform/ax_fragment_root_delegate_win.h",
- "platform/ax_fragment_root_win.cc",
- "platform/ax_fragment_root_win.h",
- "platform/ax_platform_node_delegate_utils_win.cc",
- "platform/ax_platform_node_delegate_utils_win.h",
- "platform/ax_platform_node_textchildprovider_win.cc",
- "platform/ax_platform_node_textchildprovider_win.h",
- "platform/ax_platform_node_textprovider_win.cc",
- "platform/ax_platform_node_textprovider_win.h",
- "platform/ax_platform_node_textrangeprovider_win.cc",
- "platform/ax_platform_node_textrangeprovider_win.h",
- "platform/ax_platform_node_win.cc",
- "platform/ax_platform_node_win.h",
- "platform/ax_platform_relation_win.cc",
- "platform/ax_platform_relation_win.h",
- "platform/ax_system_caret_win.cc",
- "platform/ax_system_caret_win.h",
- ]
-
- public_deps += [ "//third_party/iaccessible2" ]
-
- libs = [
- "oleacc.lib",
- "uiautomationcore.lib",
- ]
- }
+ # Allows the files from //ui/accessibility/platform includes headers
+ # from this directory.
+ allow_circular_includes_from = [ "//ui/accessibility/platform" ]
if (!is_ios) {
sources += [
@@ -225,40 +173,6 @@ jumbo_component("accessibility") {
]
}
- if (is_mac) {
- sources += [
- "platform/ax_platform_node_mac.h",
- "platform/ax_platform_node_mac.mm",
- ]
-
- libs = [
- "AppKit.framework",
- "Foundation.framework",
- ]
- }
-
- if (use_atk) {
- sources += [
- "platform/atk_util_auralinux.cc",
- "platform/atk_util_auralinux.h",
- "platform/atk_util_auralinux_gtk.cc",
- "platform/ax_platform_atk_hyperlink.cc",
- "platform/ax_platform_atk_hyperlink.h",
- "platform/ax_platform_node_auralinux.cc",
- "platform/ax_platform_node_auralinux.h",
- ]
-
- configs += [ "//build/config/linux/atk" ]
-
- if (use_glib) {
- configs += [ "//build/config/linux:glib" ]
- }
-
- if (use_x11) {
- public_deps += [ "//ui/gfx/x" ]
- }
- }
-
if (use_aura) {
sources += [
"aura/aura_window_properties.cc",
@@ -281,15 +195,21 @@ source_set("ax_assistant") {
static_library("test_support") {
testonly = true
sources = [
- # test_ax_node_wrapper.{cc,h} are used in ax_range_unittest.cc
- "platform/test_ax_node_wrapper.cc",
- "platform/test_ax_node_wrapper.h",
+ "test_ax_node_helper.cc",
+ "test_ax_node_helper.h",
"test_ax_tree_manager.cc",
"test_ax_tree_manager.h",
"tree_generator.cc",
"tree_generator.h",
]
+ if (has_native_accessibility) {
+ sources += [
+ "platform/test_ax_node_wrapper.cc",
+ "platform/test_ax_node_wrapper.h",
+ ]
+ }
+
deps = [ ":accessibility" ]
}
@@ -325,23 +245,6 @@ test("accessibility_unittests") {
"run_all_unittests.cc",
]
- if (is_win) {
- sources += [
- "platform/ax_fragment_root_win_unittest.cc",
- "platform/ax_platform_node_textchildprovider_win_unittest.cc",
- "platform/ax_platform_node_textprovider_win_unittest.cc",
- "platform/ax_platform_node_textrangeprovider_win_unittest.cc",
- "platform/ax_platform_node_win_unittest.cc",
- "platform/ax_platform_node_win_unittest.h",
- ]
- }
-
- if (has_native_accessibility) {
- # This test depends heavily on NativeViewAccessible, which is only
- # implemented on these platforms.
- sources += [ "platform/ax_platform_node_base_unittest.cc" ]
- }
-
deps = [
":accessibility",
":test_support",
@@ -357,22 +260,40 @@ test("accessibility_unittests") {
"//ui/gfx:test_support",
]
- if (is_win) {
- deps += [ "//third_party/iaccessible2" ]
+ if (has_native_accessibility) {
+ # This test depends heavily on NativeViewAccessible, which is only
+ # implemented on these platforms.
+ sources += [ "platform/ax_platform_node_base_unittest.cc" ]
- libs = [
- "oleacc.lib",
- "uiautomationcore.lib",
- ]
- }
+ if (is_win) {
+ sources += [
+ "platform/ax_fragment_root_win_unittest.cc",
+ "platform/ax_platform_node_textchildprovider_win_unittest.cc",
+ "platform/ax_platform_node_textprovider_win_unittest.cc",
+ "platform/ax_platform_node_textrangeprovider_win_unittest.cc",
+ "platform/ax_platform_node_win_unittest.cc",
+ "platform/ax_platform_node_win_unittest.h",
+ ]
+
+ deps += [
+ "//third_party/iaccessible2",
+ "//ui/accessibility/platform:ichromeaccessible",
+ ]
+
+ libs = [
+ "oleacc.lib",
+ "uiautomationcore.lib",
+ ]
+ }
- if (use_atk) {
- sources += [
- "platform/atk_util_auralinux_unittest.cc",
- "platform/ax_platform_node_auralinux_unittest.cc",
- ]
+ if (use_atk) {
+ sources += [
+ "platform/atk_util_auralinux_unittest.cc",
+ "platform/ax_platform_node_auralinux_unittest.cc",
+ ]
- configs += [ "//build/config/linux/atk" ]
+ configs += [ "//build/config/linux/atk" ]
+ }
}
}
diff --git a/chromium/ui/accessibility/accessibility_features.cc b/chromium/ui/accessibility/accessibility_features.cc
index 6b6f63f1b90..4a52188c1b6 100644
--- a/chromium/ui/accessibility/accessibility_features.cc
+++ b/chromium/ui/accessibility/accessibility_features.cc
@@ -47,4 +47,36 @@ bool IsAccessibilityTreeForViewsEnabled() {
::features::kEnableAccessibilityTreeForViews);
}
+const base::Feature kAccessibilityFocusHighlight{
+ "AccessibilityFocusHighlight", base::FEATURE_DISABLED_BY_DEFAULT};
+
+bool IsAccessibilityFocusHighlightEnabled() {
+ return base::FeatureList::IsEnabled(::features::kAccessibilityFocusHighlight);
+}
+
+#if defined(OS_WIN)
+const base::Feature kIChromeAccessible{"IChromeAccessible",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+
+bool IsIChromeAccessibleEnabled() {
+ return base::FeatureList::IsEnabled(::features::kIChromeAccessible);
+}
+#endif // defined(OS_WIN)
+
+#if defined(OS_CHROMEOS)
+const base::Feature kAccessibilityCursorColor{
+ "AccessibilityCursorColor", base::FEATURE_DISABLED_BY_DEFAULT};
+
+bool IsAccessibilityCursorColorEnabled() {
+ return base::FeatureList::IsEnabled(::features::kAccessibilityCursorColor);
+}
+#endif // defined(OS_CHROMEOS)
+
+const base::Feature kAugmentExistingImageLabels{
+ "AugmentExistingImageLabels", base::FEATURE_DISABLED_BY_DEFAULT};
+
+bool IsAugmentExistingImageLabelsEnabled() {
+ return base::FeatureList::IsEnabled(::features::kAugmentExistingImageLabels);
+}
+
} // namespace features
diff --git a/chromium/ui/accessibility/accessibility_features.h b/chromium/ui/accessibility/accessibility_features.h
index b7fa71ec600..743a32c5bc7 100644
--- a/chromium/ui/accessibility/accessibility_features.h
+++ b/chromium/ui/accessibility/accessibility_features.h
@@ -8,35 +8,67 @@
#include "base/feature_list.h"
#include "build/build_config.h"
-#include "ui/accessibility/ax_export.h"
+#include "ui/accessibility/ax_base_export.h"
namespace features {
-AX_EXPORT extern const base::Feature kEnableAccessibilityExposeARIAAnnotations;
+AX_BASE_EXPORT extern const base::Feature
+ kEnableAccessibilityExposeARIAAnnotations;
// Returns true if ARIA annotations should be exposed to the browser AX Tree.
-AX_EXPORT bool IsAccessibilityExposeARIAAnnotationsEnabled();
+AX_BASE_EXPORT bool IsAccessibilityExposeARIAAnnotationsEnabled();
-AX_EXPORT extern const base::Feature kEnableAccessibilityExposeDisplayNone;
+AX_BASE_EXPORT extern const base::Feature kEnableAccessibilityExposeDisplayNone;
// Returns true if "display: none" nodes should be exposed to the
// browser process AXTree.
-AX_EXPORT bool IsAccessibilityExposeDisplayNoneEnabled();
+AX_BASE_EXPORT bool IsAccessibilityExposeDisplayNoneEnabled();
-AX_EXPORT extern const base::Feature kEnableAccessibilityExposeHTMLElement;
+AX_BASE_EXPORT extern const base::Feature kEnableAccessibilityExposeHTMLElement;
// Returns true if the <html> element should be exposed to the
// browser process AXTree (as an ignored node).
-AX_EXPORT bool IsAccessibilityExposeHTMLElementEnabled();
+AX_BASE_EXPORT bool IsAccessibilityExposeHTMLElementEnabled();
// Serializes accessibility information from the Views tree and deserializes it
// into an AXTree in the browser process.
-AX_EXPORT extern const base::Feature kEnableAccessibilityTreeForViews;
+AX_BASE_EXPORT extern const base::Feature kEnableAccessibilityTreeForViews;
// Returns true if the Views tree is exposed using an AXTree in the browser
// process. Returns false if the Views tree is exposed to accessibility
// directly.
-AX_EXPORT bool IsAccessibilityTreeForViewsEnabled();
+AX_BASE_EXPORT bool IsAccessibilityTreeForViewsEnabled();
+
+AX_BASE_EXPORT extern const base::Feature kAccessibilityFocusHighlight;
+
+// Returns true if the accessibility focus highlight feature is enabled,
+// which draws a visual highlight around the focused element on the page
+// briefly whenever focus changes.
+AX_BASE_EXPORT bool IsAccessibilityFocusHighlightEnabled();
+
+#if defined(OS_WIN)
+// Enables an experimental Chrome-specific accessibility COM API
+AX_BASE_EXPORT extern const base::Feature kIChromeAccessible;
+
+// Returns true if the IChromeAccessible COM API is enabled.
+AX_BASE_EXPORT bool IsIChromeAccessibleEnabled();
+
+#endif // defined(OS_WIN)
+
+#if defined(OS_CHROMEOS)
+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();
+#endif // defined(OS_CHROMEOS)
+
+// Enables Get Image Descriptions to augment existing images labels,
+// rather than only provide descriptions for completely unlabeled images.
+AX_BASE_EXPORT extern const base::Feature kAugmentExistingImageLabels;
+
+// Returns true if augmenting existing image labels is enabled.
+AX_BASE_EXPORT bool IsAugmentExistingImageLabelsEnabled();
} // namespace features
diff --git a/chromium/ui/accessibility/accessibility_switches.h b/chromium/ui/accessibility/accessibility_switches.h
index 3cc38c37f10..2d3b9f2761b 100644
--- a/chromium/ui/accessibility/accessibility_switches.h
+++ b/chromium/ui/accessibility/accessibility_switches.h
@@ -7,41 +7,46 @@
#define UI_ACCESSIBILITY_ACCESSIBILITY_SWITCHES_H_
#include "build/build_config.h"
-#include "ui/accessibility/ax_export.h"
+#include "ui/accessibility/ax_base_export.h"
namespace switches {
-AX_EXPORT extern const char kEnableExperimentalAccessibilityAutoclick[];
-AX_EXPORT extern const char kEnableExperimentalAccessibilityLabelsDebugging[];
-AX_EXPORT extern const char kEnableExperimentalAccessibilityLanguageDetection[];
-AX_EXPORT extern const char
+AX_BASE_EXPORT extern const char kEnableExperimentalAccessibilityAutoclick[];
+AX_BASE_EXPORT extern const char
+ kEnableExperimentalAccessibilityLabelsDebugging[];
+AX_BASE_EXPORT extern const char
+ kEnableExperimentalAccessibilityLanguageDetection[];
+AX_BASE_EXPORT extern const char
kEnableExperimentalAccessibilityLanguageDetectionDynamic[];
-AX_EXPORT extern const char kEnableExperimentalAccessibilitySwitchAccess[];
-AX_EXPORT extern const char kEnableExperimentalAccessibilitySwitchAccessText[];
-AX_EXPORT extern const char
+AX_BASE_EXPORT extern const char kEnableExperimentalAccessibilitySwitchAccess[];
+AX_BASE_EXPORT extern const char
+ kEnableExperimentalAccessibilitySwitchAccessText[];
+AX_BASE_EXPORT extern const char
kEnableExperimentalAccessibilityChromeVoxAnnotations[];
-AX_EXPORT extern const char
+AX_BASE_EXPORT extern const char
kDisableExperimentalAccessibilityChromeVoxLanguageSwitching[];
-AX_EXPORT extern const char
+AX_BASE_EXPORT extern const char
kDisableExperimentalAccessibilityChromeVoxSearchMenus[];
-AX_EXPORT extern const char kEnableExperimentalAccessibilityChromeVoxTutorial[];
+AX_BASE_EXPORT extern const char
+ kEnableExperimentalAccessibilityChromeVoxTutorial[];
// Returns true if experimental accessibility language detection is enabled.
-AX_EXPORT bool IsExperimentalAccessibilityLanguageDetectionEnabled();
+AX_BASE_EXPORT bool IsExperimentalAccessibilityLanguageDetectionEnabled();
// Returns true if experimental accessibility language detection support for
// dynamic content is enabled.
-AX_EXPORT bool IsExperimentalAccessibilityLanguageDetectionDynamicEnabled();
+AX_BASE_EXPORT bool
+IsExperimentalAccessibilityLanguageDetectionDynamicEnabled();
// Returns true if experimental accessibility Switch Access text is enabled.
-AX_EXPORT bool IsExperimentalAccessibilitySwitchAccessTextEnabled();
+AX_BASE_EXPORT bool IsExperimentalAccessibilitySwitchAccessTextEnabled();
#if defined(OS_WIN)
-AX_EXPORT extern const char kEnableExperimentalUIAutomation[];
+AX_BASE_EXPORT extern const char kEnableExperimentalUIAutomation[];
#endif
// Returns true if experimental support for UIAutomation is enabled.
-AX_EXPORT bool IsExperimentalAccessibilityPlatformUIAEnabled();
+AX_BASE_EXPORT bool IsExperimentalAccessibilityPlatformUIAEnabled();
} // namespace switches
diff --git a/chromium/ui/accessibility/ax_enum_util.cc b/chromium/ui/accessibility/ax_enum_util.cc
index 35bbef5afc6..6d592227fc2 100644
--- a/chromium/ui/accessibility/ax_enum_util.cc
+++ b/chromium/ui/accessibility/ax_enum_util.cc
@@ -81,8 +81,6 @@ const char* ToString(ax::mojom::Event event) {
return "menuListValueChanged";
case ax::mojom::Event::kMenuPopupEnd:
return "menuPopupEnd";
- case ax::mojom::Event::kMenuPopupHide:
- return "menuPopupHide";
case ax::mojom::Event::kMenuPopupStart:
return "menuPopupStart";
case ax::mojom::Event::kMenuStart:
@@ -211,8 +209,6 @@ ax::mojom::Event ParseEvent(const char* event) {
return ax::mojom::Event::kMenuListValueChanged;
if (0 == strcmp(event, "menuPopupEnd"))
return ax::mojom::Event::kMenuPopupEnd;
- if (0 == strcmp(event, "menuPopupHide"))
- return ax::mojom::Event::kMenuPopupHide;
if (0 == strcmp(event, "menuPopupStart"))
return ax::mojom::Event::kMenuPopupStart;
if (0 == strcmp(event, "menuStart"))
@@ -1884,6 +1880,8 @@ const char* ToString(ax::mojom::BoolAttribute bool_attribute) {
return "clipsChildren";
case ax::mojom::BoolAttribute::kSelected:
return "selected";
+ case ax::mojom::BoolAttribute::kSelectedFromFocus:
+ return "selectedFromFocus";
case ax::mojom::BoolAttribute::kSupportsTextLocation:
return "supportsTextLocation";
case ax::mojom::BoolAttribute::kIsLineBreakingObject:
@@ -1926,6 +1924,8 @@ ax::mojom::BoolAttribute ParseBoolAttribute(const char* bool_attribute) {
return ax::mojom::BoolAttribute::kClipsChildren;
if (0 == strcmp(bool_attribute, "selected"))
return ax::mojom::BoolAttribute::kSelected;
+ if (0 == strcmp(bool_attribute, "selectedFromFocus"))
+ return ax::mojom::BoolAttribute::kSelectedFromFocus;
if (0 == strcmp(bool_attribute, "supportsTextLocation"))
return ax::mojom::BoolAttribute::kSupportsTextLocation;
if (0 == strcmp(bool_attribute, "isLineBreakingObject"))
diff --git a/chromium/ui/accessibility/ax_enums.mojom b/chromium/ui/accessibility/ax_enums.mojom
index a5c0fc5884f..b1523555d3b 100644
--- a/chromium/ui/accessibility/ax_enums.mojom
+++ b/chromium/ui/accessibility/ax_enums.mojom
@@ -27,7 +27,7 @@ module ax.mojom;
enum Event {
kNone,
- kActiveDescendantChanged, // Web
+ kActiveDescendantChanged,
kAlert,
kAriaAttributeChanged, // Implicit
kAutocorrectionOccured, // Unknown: http://crbug.com/392498
@@ -56,13 +56,12 @@ enum Event {
kLocationChanged, // Web
kMediaStartedPlaying, // Native / Automation
kMediaStoppedPlaying, // Native / Automation
- kMenuEnd, // Native / Win
+ kMenuEnd, // Native / web: menu interaction has ended.
kMenuListItemSelected, // Web
kMenuListValueChanged, // Web
- kMenuPopupEnd, // Native
- kMenuPopupHide, // Native / AuraLinux
- kMenuPopupStart, // Native
- kMenuStart, // Native / Win
+ kMenuPopupEnd, // Native / web: a menu/submenu is hidden/closed.
+ kMenuPopupStart, // Native / web: a menu/submenu is shown/opened.
+ kMenuStart, // Native / web: menu interaction has begun.
kMouseCanceled,
kMouseDragged,
kMouseMoved,
@@ -77,7 +76,7 @@ enum Event {
kSelection, // Native
kSelectionAdd, // Native
kSelectionRemove, // Native
- kShow, // Remove: http://crbug.com/392502
+ kShow, // Native / Automation
kStateChanged, // Native / Automation
kTextChanged,
kWindowActivated, // Native
@@ -734,6 +733,9 @@ enum BoolAttribute {
// Indicates whether this node is selected or unselected.
kSelected,
+ // Indicates whether this node is selected due to selection follows focus.
+ kSelectedFromFocus,
+
// Indicates whether this node supports text location.
kSupportsTextLocation,
@@ -984,14 +986,14 @@ enum SortDirection {
enum NameFrom {
kNone,
kUninitialized,
- kAttribute,
+ kAttribute, // E.g. aria-label.
kAttributeExplicitlyEmpty,
- kCaption,
+ kCaption, // E.g. in the case of a table, from a caption element.
kContents,
- kPlaceholder,
- kRelatedElement,
- kTitle,
- kValue,
+ kPlaceholder, // E.g. from an HTML placeholder attribute on a text field.
+ kRelatedElement, // E.g. from a figcaption Element in a figure.
+ kTitle, // E.g. <input type="text" title="title">.
+ kValue, // E.g. <input type="button" value="Button's name">.
};
enum DescriptionFrom {
diff --git a/chromium/ui/accessibility/ax_event.cc b/chromium/ui/accessibility/ax_event.cc
index 34327f466f1..ecb80d908e4 100644
--- a/chromium/ui/accessibility/ax_event.cc
+++ b/chromium/ui/accessibility/ax_event.cc
@@ -29,7 +29,7 @@ AXEvent::AXEvent(const AXEvent& event) = default;
AXEvent& AXEvent::operator=(const AXEvent& event) = default;
std::string AXEvent::ToString() const {
- std::string result = "AXEvent";
+ std::string result = "AXEvent ";
result += ui::ToString(event_type);
result += " on node id=" + base::NumberToString(id);
diff --git a/chromium/ui/accessibility/ax_event_generator.cc b/chromium/ui/accessibility/ax_event_generator.cc
index 472dd5b1579..7561e537be6 100644
--- a/chromium/ui/accessibility/ax_event_generator.cc
+++ b/chromium/ui/accessibility/ax_event_generator.cc
@@ -49,9 +49,13 @@ void RemoveEvent(std::set<AXEventGenerator::EventParams>* node_events,
} // namespace
-AXEventGenerator::EventParams::EventParams(Event event,
- ax::mojom::EventFrom event_from)
- : event(event), event_from(event_from) {}
+AXEventGenerator::EventParams::EventParams(
+ Event event,
+ ax::mojom::EventFrom event_from,
+ const std::vector<AXEventIntent>& event_intents)
+ : event(event), event_from(event_from), event_intents(event_intents) {}
+
+AXEventGenerator::EventParams::~EventParams() = default;
AXEventGenerator::TargetedEvent::TargetedEvent(AXNode* node,
const EventParams& event_params)
@@ -138,7 +142,8 @@ void AXEventGenerator::AddEvent(AXNode* node, AXEventGenerator::Event event) {
return;
std::set<EventParams>& node_events = tree_events_[node];
- node_events.emplace(event, ax::mojom::EventFrom::kNone);
+ node_events.emplace(event, ax::mojom::EventFrom::kNone,
+ tree_->event_intents());
}
void AXEventGenerator::OnNodeDataChanged(AXTree* tree,
@@ -154,7 +159,8 @@ void AXEventGenerator::OnNodeDataChanged(AXTree* tree,
new_node_data.role != ax::mojom::Role::kStaticText) {
AXNode* node = tree_->GetFromId(new_node_data.id);
tree_events_[node].emplace(Event::CHILDREN_CHANGED,
- ax::mojom::EventFrom::kNone);
+ ax::mojom::EventFrom::kNone,
+ tree_->event_intents());
}
}
@@ -543,7 +549,7 @@ void AXEventGenerator::FireLiveRegionEvents(AXNode* node) {
.GetStringAttribute(ax::mojom::StringAttribute::kName)
.empty())
AddEvent(node, Event::LIVE_REGION_NODE_CHANGED);
- // Fire LIVE_REGION_CHANGED on the root of the live region.
+ // Fire LIVE_REGION_NODE_CHANGED on the root of the live region.
AddEvent(live_root, Event::LIVE_REGION_CHANGED);
}
}
@@ -610,6 +616,9 @@ void AXEventGenerator::FireRelationSourceEvents(AXTree* tree,
// Attempts to suppress load-related events that we presume no AT will be
// interested in under any circumstances, such as pages which have no size.
bool AXEventGenerator::ShouldFireLoadEvents(AXNode* node) {
+ if (always_fire_load_complete_)
+ return true;
+
const AXNodeData& data = node->data();
return data.relative_bounds.bounds.width() ||
data.relative_bounds.bounds.height();
diff --git a/chromium/ui/accessibility/ax_event_generator.h b/chromium/ui/accessibility/ax_event_generator.h
index 61d860b1e64..47c64ef7b80 100644
--- a/chromium/ui/accessibility/ax_event_generator.h
+++ b/chromium/ui/accessibility/ax_event_generator.h
@@ -11,6 +11,7 @@
#include <vector>
#include "base/scoped_observer.h"
+#include "ui/accessibility/ax_event_intent.h"
#include "ui/accessibility/ax_export.h"
#include "ui/accessibility/ax_tree.h"
#include "ui/accessibility/ax_tree_observer.h"
@@ -90,9 +91,13 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
};
struct EventParams {
- EventParams(Event event, ax::mojom::EventFrom event_from);
+ EventParams(Event event,
+ ax::mojom::EventFrom event_from,
+ const std::vector<AXEventIntent>& event_intents);
+ ~EventParams();
Event event;
ax::mojom::EventFrom event_from;
+ std::vector<AXEventIntent> event_intents;
bool operator==(const EventParams& rhs);
bool operator<(const EventParams& rhs) const;
@@ -165,6 +170,10 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
// same order they were added.
void AddEvent(ui::AXNode* node, Event event);
+ void set_always_fire_load_complete(bool val) {
+ always_fire_load_complete_ = val;
+ }
+
protected:
// AXTreeObserver overrides.
void OnNodeDataChanged(AXTree* tree,
@@ -236,6 +245,8 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
// OnAtomicUpdateFinished. List of nodes whose active descendant changed.
std::vector<AXNode*> active_descendant_changed_;
+ bool always_fire_load_complete_ = false;
+
// Please make sure that this ScopedObserver is always declared last in order
// to prevent any use-after-free.
ScopedObserver<AXTree, AXTreeObserver> tree_event_observer_{this};
diff --git a/chromium/ui/accessibility/ax_mode.cc b/chromium/ui/accessibility/ax_mode.cc
index 55d0fc130db..7919464eb0a 100644
--- a/chromium/ui/accessibility/ax_mode.cc
+++ b/chromium/ui/accessibility/ax_mode.cc
@@ -41,6 +41,9 @@ std::string AXMode::ToString() const {
case AXMode::kLabelImages:
flag_name = "kLabelImages";
break;
+ case AXMode::kPDF:
+ flag_name = "kPDF";
+ break;
}
DCHECK(flag_name);
diff --git a/chromium/ui/accessibility/ax_mode.h b/chromium/ui/accessibility/ax_mode.h
index 8e0b2dc5fc0..2536ad56236 100644
--- a/chromium/ui/accessibility/ax_mode.h
+++ b/chromium/ui/accessibility/ax_mode.h
@@ -10,7 +10,6 @@
#include <ostream>
#include <string>
-#include "base/logging.h"
#include "ui/accessibility/ax_export.h"
namespace ui {
@@ -60,10 +59,14 @@ class AX_EXPORT AXMode {
// The accessibility tree will contain automatic image annotations.
static constexpr uint32_t kLabelImages = 1 << 5;
+ // The accessibility tree will contain enough information to export
+ // an accessible PDF.
+ static constexpr uint32_t kPDF = 1 << 6;
+
// Update this to include the last supported mode flag. If you add
// another, be sure to update the stream insertion operator for
// logging and debugging.
- static constexpr uint32_t kLastModeFlag = 1 << 5;
+ static constexpr uint32_t kLastModeFlag = 1 << 6;
constexpr AXMode() : flags_(0) {}
constexpr AXMode(uint32_t flags) : flags_(flags) {}
diff --git a/chromium/ui/accessibility/ax_node.cc b/chromium/ui/accessibility/ax_node.cc
index b81f1491c31..3c7b06ecd91 100644
--- a/chromium/ui/accessibility/ax_node.cc
+++ b/chromium/ui/accessibility/ax_node.cc
@@ -10,6 +10,7 @@
#include "base/strings/string16.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_language_detection.h"
#include "ui/accessibility/ax_role_properties.h"
@@ -36,6 +37,7 @@ AXNode::AXNode(AXNode::OwnerTree* tree,
AXNode::~AXNode() = default;
size_t AXNode::GetUnignoredChildCount() const {
+ // TODO(nektar): Should DCHECK if the node is not ignored.
DCHECK(!tree_->GetTreeUpdateInProgressState());
return unignored_child_count_;
}
@@ -320,7 +322,7 @@ AXNode::UnignoredChildIterator AXNode::UnignoredChildrenEnd() const {
// The first (direct) child, ignored or unignored.
AXNode* AXNode::GetFirstChild() const {
- if (children().size() == 0)
+ if (children().empty())
return nullptr;
return children()[0];
}
@@ -354,9 +356,13 @@ AXNode* AXNode::GetNextSibling() const {
}
bool AXNode::IsText() const {
- return data().role == ax::mojom::Role::kStaticText ||
- data().role == ax::mojom::Role::kLineBreak ||
- data().role == ax::mojom::Role::kInlineTextBox;
+ // In Legacy Layout, a list marker has no children and is thus represented on
+ // all platforms as a leaf node that exposes the marker itself, i.e., it forms
+ // part of the AX tree's text representation. In contrast, in Layout NG, a
+ // list marker has a static text child.
+ if (data().role == ax::mojom::Role::kListMarker)
+ return !children().size();
+ return ui::IsText(data().role);
}
bool AXNode::IsLineBreak() const {
@@ -477,6 +483,61 @@ void AXNode::ClearLanguageInfo() {
language_info_.reset();
}
+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
+ // text nodes because Blink doesn't always add all trailing white space to the
+ // value attribute.
+ if (data().IsTextField() && children().empty()) {
+ std::string value =
+ data().GetStringAttribute(ax::mojom::StringAttribute::kValue);
+ // If the value is empty, then there might be some placeholder text in the
+ // text field, or any other name that is derived from visible contents, even
+ // if the text field has no children.
+ if (!value.empty())
+ return value;
+ }
+
+ // Ordinarily, plain text fields are leaves. We need to exclude them from the
+ // set of leaf nodes when they expose any descendants if we want to compute
+ // their inner text from their descendant text nodes.
+ if (IsLeaf() && !(data().IsTextField() && !children().empty())) {
+ switch (data().GetNameFrom()) {
+ case ax::mojom::NameFrom::kNone:
+ case ax::mojom::NameFrom::kUninitialized:
+ // The accessible name is not displayed on screen, e.g. aria-label, or is
+ // not displayed directly inside the node, e.g. an associated label
+ // element.
+ case ax::mojom::NameFrom::kAttribute:
+ // The node's accessible name is explicitly empty.
+ case ax::mojom::NameFrom::kAttributeExplicitlyEmpty:
+ // The accessible name does not represent the entirety of the node's inner
+ // text, e.g. a table's caption or a figure's figcaption.
+ case ax::mojom::NameFrom::kCaption:
+ case ax::mojom::NameFrom::kRelatedElement:
+ // The accessible name is not displayed directly inside the node but is
+ // visible via e.g. a tooltip.
+ case ax::mojom::NameFrom::kTitle:
+ return std::string();
+
+ case ax::mojom::NameFrom::kContents:
+ // The placeholder text is initially displayed inside the text field and
+ // takes the place of its value.
+ case ax::mojom::NameFrom::kPlaceholder:
+ // The value attribute takes the place of the node's inner text, e.g. the
+ // value of a submit button is displayed inside the button itself.
+ case ax::mojom::NameFrom::kValue:
+ return data().GetStringAttribute(ax::mojom::StringAttribute::kName);
+ }
+ }
+
+ std::string inner_text;
+ for (auto it = UnignoredChildrenBegin(); it != UnignoredChildrenEnd(); ++it) {
+ inner_text += it->GetInnerText();
+ }
+ return inner_text;
+}
+
std::string AXNode::GetLanguage() const {
// Walk up tree considering both detected and author declared languages.
for (const AXNode* cur = this; cur; cur = cur->parent()) {
@@ -584,44 +645,52 @@ AXNode* AXNode::GetTableCellFromCoords(int row_index, int col_index) const {
table_info->cell_ids[size_t{row_index}][size_t{col_index}]);
}
-void AXNode::GetTableColHeaderNodeIds(
- int col_index,
- std::vector<int32_t>* col_header_ids) const {
- DCHECK(col_header_ids);
+std::vector<AXNode::AXID> AXNode::GetTableColHeaderNodeIds() const {
+ const AXTableInfo* table_info = GetAncestorTableInfo();
+ if (!table_info)
+ return std::vector<AXNode::AXID>();
+
+ std::vector<AXNode::AXID> col_header_ids;
+ // Flatten and add column header ids of each column to |col_header_ids|.
+ for (std::vector<AXNode::AXID> col_headers_at_index :
+ table_info->col_headers) {
+ col_header_ids.insert(col_header_ids.end(), col_headers_at_index.begin(),
+ col_headers_at_index.end());
+ }
+
+ return col_header_ids;
+}
+
+std::vector<AXNode::AXID> AXNode::GetTableColHeaderNodeIds(
+ int col_index) const {
const AXTableInfo* table_info = GetAncestorTableInfo();
if (!table_info)
- return;
+ return std::vector<AXNode::AXID>();
if (col_index < 0 || size_t{col_index} >= table_info->col_count)
- return;
+ return std::vector<AXNode::AXID>();
- for (size_t i = 0; i < table_info->col_headers[size_t{col_index}].size(); i++)
- col_header_ids->push_back(table_info->col_headers[size_t{col_index}][i]);
+ return std::vector<AXNode::AXID>(table_info->col_headers[size_t{col_index}]);
}
-void AXNode::GetTableRowHeaderNodeIds(
- int row_index,
- std::vector<int32_t>* row_header_ids) const {
- DCHECK(row_header_ids);
+std::vector<AXNode::AXID> AXNode::GetTableRowHeaderNodeIds(
+ int row_index) const {
const AXTableInfo* table_info = GetAncestorTableInfo();
if (!table_info)
- return;
+ return std::vector<AXNode::AXID>();
if (row_index < 0 || size_t{row_index} >= table_info->row_count)
- return;
+ return std::vector<AXNode::AXID>();
- for (size_t i = 0; i < table_info->row_headers[size_t{row_index}].size(); i++)
- row_header_ids->push_back(table_info->row_headers[size_t{row_index}][i]);
+ return std::vector<AXNode::AXID>(table_info->row_headers[size_t{row_index}]);
}
-void AXNode::GetTableUniqueCellIds(std::vector<int32_t>* cell_ids) const {
- DCHECK(cell_ids);
+std::vector<AXNode::AXID> AXNode::GetTableUniqueCellIds() const {
const AXTableInfo* table_info = GetAncestorTableInfo();
if (!table_info)
- return;
+ return std::vector<AXNode::AXID>();
- cell_ids->assign(table_info->unique_cell_ids.begin(),
- table_info->unique_cell_ids.end());
+ return std::vector<AXNode::AXID>(table_info->unique_cell_ids);
}
const std::vector<AXNode*>* AXNode::GetExtraMacNodes() const {
@@ -792,47 +861,39 @@ base::Optional<int> AXNode::GetTableCellAriaRowIndex() const {
return int{table_info->cell_data_vector[*index].aria_row_index};
}
-void AXNode::GetTableCellColHeaderNodeIds(
- std::vector<int32_t>* col_header_ids) const {
- DCHECK(col_header_ids);
+std::vector<AXNode::AXID> AXNode::GetTableCellColHeaderNodeIds() const {
const AXTableInfo* table_info = GetAncestorTableInfo();
if (!table_info || table_info->col_count <= 0)
- return;
+ return std::vector<AXNode::AXID>();
// If this node is not a cell, then return the headers for the first column.
int col_index = GetTableCellColIndex().value_or(0);
- const auto& col = table_info->col_headers[col_index];
- for (int header : col)
- col_header_ids->push_back(header);
+
+ return std::vector<AXNode::AXID>(table_info->col_headers[col_index]);
}
void AXNode::GetTableCellColHeaders(std::vector<AXNode*>* col_headers) const {
DCHECK(col_headers);
- std::vector<int32_t> col_header_ids;
- GetTableCellColHeaderNodeIds(&col_header_ids);
+ std::vector<int32_t> col_header_ids = GetTableCellColHeaderNodeIds();
IdVectorToNodeVector(col_header_ids, col_headers);
}
-void AXNode::GetTableCellRowHeaderNodeIds(
- std::vector<int32_t>* row_header_ids) const {
- DCHECK(row_header_ids);
+std::vector<AXNode::AXID> AXNode::GetTableCellRowHeaderNodeIds() const {
const AXTableInfo* table_info = GetAncestorTableInfo();
if (!table_info || table_info->row_count <= 0)
- return;
+ return std::vector<AXNode::AXID>();
// If this node is not a cell, then return the headers for the first row.
int row_index = GetTableCellRowIndex().value_or(0);
- const auto& row = table_info->row_headers[row_index];
- for (int header : row)
- row_header_ids->push_back(header);
+
+ return std::vector<AXNode::AXID>(table_info->row_headers[row_index]);
}
void AXNode::GetTableCellRowHeaders(std::vector<AXNode*>* row_headers) const {
DCHECK(row_headers);
- std::vector<int32_t> row_header_ids;
- GetTableCellRowHeaderNodeIds(&row_header_ids);
+ std::vector<int32_t> row_header_ids = GetTableCellRowHeaderNodeIds();
IdVectorToNodeVector(row_header_ids, row_headers);
}
@@ -902,51 +963,14 @@ bool AXNode::IsOrderedSet() const {
return ui::IsSetLike(data().role);
}
-// pos_in_set and set_size related functions.
-// Uses AXTree's cache to calculate node's pos_in_set.
+// Uses AXTree's cache to calculate node's PosInSet.
base::Optional<int> AXNode::GetPosInSet() {
- // Only allow this to be called on nodes that can hold pos_in_set values,
- // which are defined in the ARIA spec.
- if (!IsOrderedSetItem() || IsIgnored())
- return base::nullopt;
-
- const AXNode* ordered_set = GetOrderedSet();
- if (!ordered_set) {
- return base::nullopt;
- }
-
- // If tree is being updated, return no value.
- if (tree()->GetTreeUpdateInProgressState())
- return base::nullopt;
-
- // See AXTree::GetPosInSet
- return tree_->GetPosInSet(*this, ordered_set);
+ return tree_->GetPosInSet(*this);
}
-// Uses AXTree's cache to calculate node's set_size.
+// Uses AXTree's cache to calculate node's SetSize.
base::Optional<int> AXNode::GetSetSize() {
- // Only allow this to be called on nodes that can hold set_size values, which
- // are defined in the ARIA spec.
- if ((!IsOrderedSetItem() && !IsOrderedSet()) || IsIgnored())
- return base::nullopt;
-
- // If node is item-like, find its outerlying ordered set. Otherwise,
- // this node is the ordered set.
- const AXNode* ordered_set = this;
- if (IsItemLike(data().role))
- ordered_set = GetOrderedSet();
- if (!ordered_set)
- return base::nullopt;
-
- // If tree is being updated, return no value.
- if (tree()->GetTreeUpdateInProgressState())
- return base::nullopt;
-
- // See AXTree::GetSetSize
- int32_t set_size = tree_->GetSetSize(*this, ordered_set);
- if (set_size < 0)
- return base::nullopt;
- return set_size;
+ return tree_->GetSetSize(*this);
}
// Returns true if the role of ordered set matches the role of item.
@@ -1001,7 +1025,8 @@ bool AXNode::SetRoleMatchesItemRole(const AXNode* ordered_set) const {
}
bool AXNode::IsIgnoredContainerForOrderedSet() const {
- return IsIgnored() || data().role == ax::mojom::Role::kListItem ||
+ return IsIgnored() || IsEmbeddedGroup() ||
+ data().role == ax::mojom::Role::kListItem ||
data().role == ax::mojom::Role::kGenericContainer ||
data().role == ax::mojom::Role::kUnknown;
}
@@ -1020,17 +1045,16 @@ int AXNode::UpdateUnignoredCachedValuesRecursive(int startIndex) {
return count;
}
-// Finds ordered set that immediately contains node.
+// Finds ordered set that contains node.
// Is not required for set's role to match node's role.
AXNode* AXNode::GetOrderedSet() const {
AXNode* result = parent();
// Continue walking up while parent is invalid, ignored, a generic container,
- // or unknown.
- while (result && (result->IsIgnored() ||
- result->data().role == ax::mojom::Role::kGenericContainer ||
- result->data().role == ax::mojom::Role::kUnknown)) {
+ // unknown, or embedded group.
+ while (result && result->IsIgnoredContainerForOrderedSet()) {
result = result->parent();
}
+
return result;
}
@@ -1069,6 +1093,70 @@ bool AXNode::IsIgnored() const {
return data().IsIgnored();
}
+bool AXNode::IsChildOfLeaf() const {
+ const AXNode* ancestor = GetUnignoredParent();
+ while (ancestor) {
+ if (ancestor->IsLeaf())
+ return true;
+ ancestor = ancestor->GetUnignoredParent();
+ }
+ return false;
+}
+
+bool AXNode::IsLeaf() const {
+ return !GetUnignoredChildCount() || IsLeafIncludingIgnored();
+}
+
+bool AXNode::IsLeafIncludingIgnored() const {
+ if (children().empty())
+ return true;
+
+#if defined(OS_WIN)
+ // On Windows, we want to hide the subtree of a collapsed <select> element.
+ // Otherwise, ATs are always going to announce its options whether it's
+ // collapsed or expanded. In the AXTree, this element corresponds to a node
+ // with role ax::mojom::Role::kPopUpButton that is the parent of a node with
+ // role ax::mojom::Role::kMenuListPopup.
+ if (IsCollapsedMenuListPopUpButton())
+ return true;
+#endif // defined(OS_WIN)
+
+ // These types of objects may have children that we use as internal
+ // implementation details, but we want to expose them as leaves to platform
+ // accessibility APIs because screen readers might be confused if they find
+ // any children.
+ if (data().IsPlainTextField() || IsText())
+ return true;
+
+ // Roles whose children are only presentational according to the ARIA and
+ // HTML5 Specs should be hidden from screen readers.
+ switch (data().role) {
+ // According to the ARIA and Core-AAM specs:
+ // https://w3c.github.io/aria/#button,
+ // https://www.w3.org/TR/core-aam-1.1/#exclude_elements
+ // buttons' children are presentational only and should be hidden from
+ // screen readers. However, we cannot enforce the leafiness of buttons
+ // because they may contain many rich, interactive descendants such as a day
+ // in a calendar, and screen readers will need to interact with these
+ // contents. See https://crbug.com/689204.
+ // So we decided to not enforce the leafiness of buttons and expose all
+ // children.
+ case ax::mojom::Role::kButton:
+ return false;
+ case ax::mojom::Role::kDocCover:
+ case ax::mojom::Role::kGraphicsSymbol:
+ case ax::mojom::Role::kImage:
+ case ax::mojom::Role::kMeter:
+ case ax::mojom::Role::kScrollBar:
+ case ax::mojom::Role::kSlider:
+ case ax::mojom::Role::kSplitter:
+ case ax::mojom::Role::kProgressIndicator:
+ return true;
+ default:
+ return false;
+ }
+}
+
bool AXNode::IsInListMarker() const {
if (data().role == ax::mojom::Role::kListMarker)
return true;
@@ -1125,4 +1213,24 @@ AXNode* AXNode::GetCollapsedMenuListPopUpButtonAncestor() const {
return node->IsCollapsedMenuListPopUpButton() ? node : nullptr;
}
+bool AXNode::IsEmbeddedGroup() const {
+ if (data().role != ax::mojom::Role::kGroup || !parent())
+ return false;
+
+ return ui::IsSetLike(parent()->data().role);
+}
+
+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();
+ }
+
+ return nullptr;
+}
+
} // namespace ui
diff --git a/chromium/ui/accessibility/ax_node.h b/chromium/ui/accessibility/ax_node.h
index e19d1bc43b7..b9fb97ff04e 100644
--- a/chromium/ui/accessibility/ax_node.h
+++ b/chromium/ui/accessibility/ax_node.h
@@ -56,10 +56,9 @@ class AX_EXPORT AXNode final {
// See AXTree::GetFromId.
virtual AXNode* GetFromId(int32_t id) const = 0;
- virtual int32_t GetPosInSet(const AXNode& node,
- const AXNode* ordered_set) = 0;
- virtual int32_t GetSetSize(const AXNode& node,
- const AXNode* ordered_set) = 0;
+ virtual base::Optional<int> GetPosInSet(const AXNode& node) = 0;
+ virtual base::Optional<int> GetSetSize(const AXNode& node) = 0;
+
virtual Selection GetUnignoredSelection() const = 0;
virtual bool GetTreeUpdateInProgressState() const = 0;
virtual bool HasPaginationSupport() const = 0;
@@ -101,7 +100,7 @@ class AX_EXPORT AXNode final {
// Accessors.
OwnerTree* tree() const { return tree_; }
- int32_t id() const { return data_.id; }
+ AXID id() const { return data_.id; }
AXNode* parent() const { return parent_; }
const AXNodeData& data() const { return data_; }
const std::vector<AXNode*>& children() const { return children_; }
@@ -296,6 +295,14 @@ class AX_EXPORT AXNode final {
base::string16 GetInheritedString16Attribute(
ax::mojom::StringAttribute attribute) const;
+ // Returns the text of this node and all descendant nodes; including text
+ // found in embedded objects.
+ //
+ // Only text displayed on screen is included. Text from ARIA and HTML
+ // attributes that is either not displayed on screen, or outside this node, is
+ // not returned.
+ std::string GetInnerText() const;
+
// Return a string representing the language code.
//
// This will consider the language declared in the DOM, and may eventually
@@ -335,11 +342,13 @@ class AX_EXPORT AXNode final {
AXNode* GetTableCaption() const;
AXNode* GetTableCellFromIndex(int index) const;
AXNode* GetTableCellFromCoords(int row_index, int col_index) const;
- void GetTableColHeaderNodeIds(int col_index,
- std::vector<int32_t>* col_header_ids) const;
- void GetTableRowHeaderNodeIds(int row_index,
- std::vector<int32_t>* row_header_ids) const;
- void GetTableUniqueCellIds(std::vector<int32_t>* row_header_ids) const;
+ // Get all the column header node ids of the table.
+ std::vector<AXNode::AXID> GetTableColHeaderNodeIds() const;
+ // Get the column header node ids associated with |col_index|.
+ std::vector<AXNode::AXID> GetTableColHeaderNodeIds(int col_index) const;
+ // Get the row header node ids associated with |row_index|.
+ std::vector<AXNode::AXID> GetTableRowHeaderNodeIds(int row_index) const;
+ std::vector<AXNode::AXID> GetTableUniqueCellIds() const;
// Extra computed nodes for the accessibility tree for macOS:
// one column node for each table column, followed by one
// table header container node, or nullptr if not applicable.
@@ -366,8 +375,8 @@ class AX_EXPORT AXNode final {
base::Optional<int> GetTableCellRowSpan() const;
base::Optional<int> GetTableCellAriaColIndex() const;
base::Optional<int> GetTableCellAriaRowIndex() const;
- void GetTableCellColHeaderNodeIds(std::vector<int32_t>* col_header_ids) const;
- void GetTableCellRowHeaderNodeIds(std::vector<int32_t>* row_header_ids) const;
+ std::vector<AXNode::AXID> GetTableCellColHeaderNodeIds() const;
+ std::vector<AXNode::AXID> GetTableCellRowHeaderNodeIds() const;
void GetTableCellColHeaders(std::vector<AXNode*>* col_headers) const;
void GetTableCellRowHeaders(std::vector<AXNode*>* row_headers) const;
@@ -390,10 +399,39 @@ class AX_EXPORT AXNode final {
// Destroy the language info for this node.
void ClearLanguageInfo();
+ // Returns true if node is a group and is a direct descendant of a set-like
+ // element.
+ bool IsEmbeddedGroup() const;
+
// Returns true if node has ignored state or ignored role.
bool IsIgnored() const;
- // Returns true if this current node is a list marker or if it's a descendant
+ // Returns true if an ancestor of this node (not including itself) is a
+ // leaf node, meaning that this node is not actually exposed to any
+ // platform's accessibility layer.
+ bool IsChildOfLeaf() const;
+
+ // Returns true if this is a leaf node, meaning all its
+ // children should not be exposed to any platform's native accessibility
+ // layer.
+ //
+ // The definition of a leaf includes nodes with children that are exclusively
+ // an internal renderer implementation, such as the children of an HTML native
+ // text field, as well as nodes with presentational children according to the
+ // ARIA and HTML5 Specs.
+ //
+ // A leaf node should never have children that are focusable or
+ // that might send notifications.
+ bool IsLeaf() const;
+
+ // Returns true if this is a leaf node, (see "IsLeaf"), or if all of the
+ // node's children are ignored.
+ //
+ // TODO(nektar): There are no performance advantages in keeping this method
+ // since unignored child count is cached. Please remove.
+ bool IsLeafIncludingIgnored() const;
+
+ // Returns true if this node is a list marker or if it's a descendant
// of a list marker node. Returns false otherwise.
bool IsInListMarker() const;
@@ -406,6 +444,12 @@ class AX_EXPORT AXNode final {
// collapsed.
AXNode* GetCollapsedMenuListPopUpButtonAncestor() const;
+ // Returns the text field ancestor of this current node if any.
+ AXNode* GetTextFieldAncestor() const;
+
+ // Finds and returns a pointer to ordered set containing node.
+ AXNode* GetOrderedSet() const;
+
private:
// Computes the text offset where each line starts by traversing all child
// leaf nodes.
@@ -419,9 +463,6 @@ class AX_EXPORT AXNode final {
AXNode* ComputeLastUnignoredChildRecursive() const;
AXNode* ComputeFirstUnignoredChildRecursive() const;
- // Finds and returns a pointer to ordered set containing node.
- AXNode* GetOrderedSet() const;
-
OwnerTree* const tree_; // Owns this.
size_t index_in_parent_;
size_t unignored_index_in_parent_;
@@ -430,6 +471,7 @@ class AX_EXPORT AXNode final {
std::vector<AXNode*> children_;
AXNodeData data_;
+ // Stores the detected language computed from the node's text.
std::unique_ptr<AXLanguageInfo> language_info_;
};
diff --git a/chromium/ui/accessibility/ax_node_data.cc b/chromium/ui/accessibility/ax_node_data.cc
index 1780711a1ae..789e9e01feb 100644
--- a/chromium/ui/accessibility/ax_node_data.cc
+++ b/chromium/ui/accessibility/ax_node_data.cc
@@ -570,17 +570,42 @@ AXNodeTextStyles AXNodeData::GetTextStyles() const {
}
void AXNodeData::SetName(const std::string& name) {
+ DCHECK_NE(role, ax::mojom::Role::kNone)
+ << "A valid role is required before setting the name attribute, because "
+ "the role is used for setting the required NameFrom attribute.";
+
auto iter = std::find_if(string_attributes.begin(), string_attributes.end(),
[](const auto& string_attribute) {
return string_attribute.first ==
ax::mojom::StringAttribute::kName;
});
+
if (iter == string_attributes.end()) {
string_attributes.push_back(
std::make_pair(ax::mojom::StringAttribute::kName, name));
} else {
iter->second = name;
}
+
+ if (HasIntAttribute(ax::mojom::IntAttribute::kNameFrom))
+ return;
+ // Since this method is mostly used by tests which don't always set the
+ // "NameFrom" attribute, we need to set it here to the most likely value if
+ // not set, otherwise code that tries to calculate the node's inner text, its
+ // hypertext, or even its value, might not know whether to include the name in
+ // the result or not.
+ //
+ // For example, if there is a text field, but it is empty, i.e. it has no
+ // value, its value could be its name if "NameFrom" is set to "kPlaceholder"
+ // or to "kContents" but not if it's set to "kAttribute". Similarly, if there
+ // is a button without any unignored children, it's name can only be
+ // equivalent to its inner text if "NameFrom" is set to "kContents" or to
+ // "kValue", but not if it is set to "kAttribute".
+ if (IsText(role)) {
+ SetNameFrom(ax::mojom::NameFrom::kContents);
+ } else {
+ SetNameFrom(ax::mojom::NameFrom::kAttribute);
+ }
}
void AXNodeData::SetName(const base::string16& name) {
@@ -729,7 +754,7 @@ ax::mojom::CheckedState AXNodeData::GetCheckedState() const {
}
void AXNodeData::SetCheckedState(ax::mojom::CheckedState checked_state) {
- if (HasIntAttribute(ax::mojom::IntAttribute::kCheckedState))
+ if (HasCheckedState())
RemoveIntAttribute(ax::mojom::IntAttribute::kCheckedState);
if (checked_state != ax::mojom::CheckedState::kNone) {
AddIntAttribute(ax::mojom::IntAttribute::kCheckedState,
@@ -737,6 +762,10 @@ void AXNodeData::SetCheckedState(ax::mojom::CheckedState checked_state) {
}
}
+bool AXNodeData::HasCheckedState() const {
+ return HasIntAttribute(ax::mojom::IntAttribute::kCheckedState);
+}
+
ax::mojom::DefaultActionVerb AXNodeData::GetDefaultActionVerb() const {
return static_cast<ax::mojom::DefaultActionVerb>(
GetIntAttribute(ax::mojom::IntAttribute::kDefaultActionVerb));
@@ -1001,21 +1030,6 @@ bool AXNodeData::SupportsExpandCollapse() const {
return ui::SupportsExpandCollapse(role);
}
-bool AXNodeData::IsContainedInActiveLiveRegion() const {
- if (!HasStringAttribute(ax::mojom::StringAttribute::kContainerLiveStatus))
- return false;
-
- if (base::CompareCaseInsensitiveASCII(
- GetStringAttribute(ax::mojom::StringAttribute::kContainerLiveStatus),
- "off") == 0)
- return false;
-
- if (GetBoolAttribute(ax::mojom::BoolAttribute::kContainerLiveBusy))
- return false;
-
- return true;
-}
-
std::string AXNodeData::ToString() const {
std::string result;
@@ -1539,6 +1553,9 @@ std::string AXNodeData::ToString() const {
case ax::mojom::BoolAttribute::kSelected:
result += " selected=" + value;
break;
+ case ax::mojom::BoolAttribute::kSelectedFromFocus:
+ result += " selected_from_focus=" + value;
+ break;
case ax::mojom::BoolAttribute::kSupportsTextLocation:
result += " supports_text_location=" + value;
break;
diff --git a/chromium/ui/accessibility/ax_node_data.h b/chromium/ui/accessibility/ax_node_data.h
index e03e836b912..c2ac3b5ad75 100644
--- a/chromium/ui/accessibility/ax_node_data.h
+++ b/chromium/ui/accessibility/ax_node_data.h
@@ -141,7 +141,8 @@ struct AX_BASE_EXPORT AXNodeData {
// Convenience functions.
//
- // Adds the name attribute or replaces it if already present.
+ // Adds the name attribute or replaces it if already present. Also sets the
+ // NameFrom attribute if not already set.
void SetName(const std::string& name);
void SetName(const base::string16& name);
@@ -177,6 +178,7 @@ struct AX_BASE_EXPORT AXNodeData {
// Please keep in alphabetic order.
ax::mojom::CheckedState GetCheckedState() const;
void SetCheckedState(ax::mojom::CheckedState checked_state);
+ bool HasCheckedState() const;
ax::mojom::DefaultActionVerb GetDefaultActionVerb() const;
void SetDefaultActionVerb(ax::mojom::DefaultActionVerb default_action_verb);
ax::mojom::HasPopup GetHasPopup() const;
@@ -258,9 +260,6 @@ struct AX_BASE_EXPORT AXNodeData {
// expand/collapse.
bool SupportsExpandCollapse() const;
- // Helper to determine if the node is in an active live region.
- bool IsContainedInActiveLiveRegion() const;
-
// Return a string representation of this data, for debugging.
virtual std::string ToString() const;
diff --git a/chromium/ui/accessibility/ax_node_position.cc b/chromium/ui/accessibility/ax_node_position.cc
index ffce6af1700..ef23c509c7e 100644
--- a/chromium/ui/accessibility/ax_node_position.cc
+++ b/chromium/ui/accessibility/ax_node_position.cc
@@ -18,7 +18,7 @@ AXEmbeddedObjectBehavior g_ax_embedded_object_behavior =
AXEmbeddedObjectBehavior::kExposeCharacter;
#else
AXEmbeddedObjectBehavior::kSuppressCharacter;
-#endif
+#endif // defined(OS_WIN)
// static
AXNodePosition::AXPositionInstance AXNodePosition::CreatePosition(
@@ -29,9 +29,10 @@ AXNodePosition::AXPositionInstance AXNodePosition::CreatePosition(
return CreateNullPosition();
AXTreeID tree_id = node.tree()->GetAXTreeID();
- if (node.IsText())
+ if (node.IsText()) {
return CreateTextPosition(tree_id, node.id(), child_index_or_text_offset,
affinity);
+ }
return CreateTreePosition(tree_id, node.id(), child_index_or_text_offset);
}
diff --git a/chromium/ui/accessibility/ax_node_position_unittest.cc b/chromium/ui/accessibility/ax_node_position_unittest.cc
index d7e7b25695e..170054bbb71 100644
--- a/chromium/ui/accessibility/ax_node_position_unittest.cc
+++ b/chromium/ui/accessibility/ax_node_position_unittest.cc
@@ -1370,6 +1370,135 @@ TEST_F(AXPositionTest, AtEndOfBlankLine) {
EXPECT_TRUE(text_position->AtEndOfLine());
}
+TEST_F(AXPositionTest, AtStartAndEndOfLineWhenAtEndOfTextSpan) {
+ // This test ensures that the "AtStartOfLine" and the "AtEndOfLine" methods
+ // return false and true respectively when we are at the end of a text span.
+ //
+ // A text span is defined by a series of inline text boxes that make up a
+ // single static text object. Lines always end at the end of static text
+ // objects, so there would never arise a situation when a position at the end
+ // of a text span would be at start of line. It should always be at end of
+ // line. On the contrary, if a position is at the end of an inline text box
+ // and the equivalent parent position is in the middle of a static text
+ // object, then the position would sometimes be at start of line, i.e., when
+ // the inline text box contains only white space that is used to separate
+ // lines in the case of lines being wrapped by a soft line break.
+ //
+ // Example accessibility tree:
+ // 0:kRootWebArea
+ // ++1:kStaticText "Hello testing "
+ // ++++2:kInlineTextBox "Hello" kNextOnLine=2
+ // ++++3:kInlineTextBox " " kPreviousOnLine=2
+ // ++++4:kInlineTextBox "testing" kNextOnLine=5
+ // ++++5:kInlineTextBox " " kPreviousOnLine=4
+ // ++6:kStaticText "here."
+ // ++++7:kInlineTextBox "here."
+ //
+ // Resulting text representation:
+ // "Hello<soft_line_break>testing <hard_line_break>here."
+ // Notice the extra space after the word "testing". This is not a line break.
+ // The hard line break is caused by the presence of the second static text
+ // object.
+ //
+ // A position at the end of inline text box 3 should be at start of line,
+ // whilst a position at the end of inline text box 5 should not.
+
+ AXNodeData root_data;
+ root_data.id = 1;
+ root_data.role = ax::mojom::Role::kRootWebArea;
+ // "kIsLineBreakingObject" is not strictly necessary but is added for
+ // completeness.
+ root_data.AddBoolAttribute(ax::mojom::BoolAttribute::kIsLineBreakingObject,
+ true);
+
+ AXNodeData static_text_data_1;
+ static_text_data_1.id = 2;
+ static_text_data_1.role = ax::mojom::Role::kStaticText;
+ static_text_data_1.SetName("Hello testing ");
+
+ AXNodeData inline_box_data_1;
+ inline_box_data_1.id = 3;
+ inline_box_data_1.role = ax::mojom::Role::kInlineTextBox;
+ inline_box_data_1.SetName("hello");
+
+ AXNodeData inline_box_data_2;
+ inline_box_data_2.id = 4;
+ inline_box_data_2.role = ax::mojom::Role::kInlineTextBox;
+ inline_box_data_1.AddIntAttribute(ax::mojom::IntAttribute::kNextOnLineId,
+ inline_box_data_2.id);
+ inline_box_data_2.AddIntAttribute(ax::mojom::IntAttribute::kPreviousOnLineId,
+ inline_box_data_1.id);
+ // The name is a space character that we assume it turns into a soft line
+ // break by the layout engine.
+ inline_box_data_2.SetName(" ");
+
+ AXNodeData inline_box_data_3;
+ inline_box_data_3.id = 5;
+ inline_box_data_3.role = ax::mojom::Role::kInlineTextBox;
+ inline_box_data_3.SetName("testing");
+
+ AXNodeData inline_box_data_4;
+ inline_box_data_4.id = 6;
+ inline_box_data_4.role = ax::mojom::Role::kInlineTextBox;
+ inline_box_data_3.AddIntAttribute(ax::mojom::IntAttribute::kNextOnLineId,
+ inline_box_data_4.id);
+ inline_box_data_4.AddIntAttribute(ax::mojom::IntAttribute::kPreviousOnLineId,
+ inline_box_data_3.id);
+ inline_box_data_4.SetName(" "); // Just a space character - not a line break.
+
+ AXNodeData static_text_data_2;
+ static_text_data_2.id = 7;
+ static_text_data_2.role = ax::mojom::Role::kStaticText;
+ static_text_data_2.SetName("here.");
+
+ AXNodeData inline_box_data_5;
+ inline_box_data_5.id = 8;
+ inline_box_data_5.role = ax::mojom::Role::kInlineTextBox;
+ inline_box_data_5.SetName("here.");
+
+ static_text_data_1.child_ids = {inline_box_data_1.id, inline_box_data_2.id,
+ inline_box_data_3.id, inline_box_data_4.id};
+ static_text_data_2.child_ids = {inline_box_data_5.id};
+ root_data.child_ids = {static_text_data_1.id, static_text_data_2.id};
+
+ SetTree(CreateAXTree({root_data, static_text_data_1, inline_box_data_1,
+ inline_box_data_2, inline_box_data_3, inline_box_data_4,
+ static_text_data_2, inline_box_data_5}));
+
+ // An "after text" tree position - after the soft line break.
+ TestPositionType tree_position = AXNodePosition::CreateTreePosition(
+ GetTreeID(), inline_box_data_2.id, 0 /* child_index */);
+ ASSERT_NE(nullptr, tree_position);
+ ASSERT_TRUE(tree_position->IsTreePosition());
+ EXPECT_TRUE(tree_position->AtStartOfLine());
+ EXPECT_FALSE(tree_position->AtEndOfLine());
+
+ // An "after text" tree position - after the space character and before the
+ // hard line break caused by the second static text object.
+ tree_position = AXNodePosition::CreateTreePosition(
+ GetTreeID(), inline_box_data_4.id, 0 /* child_index */);
+ ASSERT_NE(nullptr, tree_position);
+ ASSERT_TRUE(tree_position->IsTreePosition());
+ EXPECT_FALSE(tree_position->AtStartOfLine());
+ EXPECT_TRUE(tree_position->AtEndOfLine());
+
+ TestPositionType text_position = AXNodePosition::CreateTextPosition(
+ GetTreeID(), inline_box_data_2.id, 1 /* text_offset */,
+ ax::mojom::TextAffinity::kDownstream);
+ ASSERT_NE(nullptr, text_position);
+ ASSERT_TRUE(text_position->IsTextPosition());
+ EXPECT_TRUE(text_position->AtStartOfLine());
+ EXPECT_FALSE(text_position->AtEndOfLine());
+
+ text_position = AXNodePosition::CreateTextPosition(
+ GetTreeID(), inline_box_data_4.id, 1 /* text_offset */,
+ ax::mojom::TextAffinity::kDownstream);
+ ASSERT_NE(nullptr, text_position);
+ ASSERT_TRUE(text_position->IsTextPosition());
+ EXPECT_FALSE(text_position->AtStartOfLine());
+ EXPECT_TRUE(text_position->AtEndOfLine());
+}
+
TEST_F(AXPositionTest, AtStartAndEndOfLineInsideTextField) {
// This test ensures that "AtStart/EndOfLine" methods work properly when at
// the start or end of a text field.
diff --git a/chromium/ui/accessibility/ax_param_traits_macros.h b/chromium/ui/accessibility/ax_param_traits_macros.h
index d33912c774e..b545df34ba2 100644
--- a/chromium/ui/accessibility/ax_param_traits_macros.h
+++ b/chromium/ui/accessibility/ax_param_traits_macros.h
@@ -106,6 +106,7 @@ IPC_STRUCT_TRAITS_BEGIN(ui::AXTreeUpdate)
IPC_STRUCT_TRAITS_MEMBER(root_id)
IPC_STRUCT_TRAITS_MEMBER(nodes)
IPC_STRUCT_TRAITS_MEMBER(event_from)
+ IPC_STRUCT_TRAITS_MEMBER(event_intents)
IPC_STRUCT_TRAITS_END()
#undef IPC_MESSAGE_EXPORT
diff --git a/chromium/ui/accessibility/ax_position.h b/chromium/ui/accessibility/ax_position.h
index 70f9501c195..dfeed6edfde 100644
--- a/chromium/ui/accessibility/ax_position.h
+++ b/chromium/ui/accessibility/ax_position.h
@@ -23,7 +23,6 @@
#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
-#include "ui/accessibility/accessibility_features.h"
#include "ui/accessibility/ax_enum_util.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_node.h"
@@ -518,9 +517,12 @@ class AXPosition {
// We assume that white space, including but not limited to hard line
// breaks, might be used to separate lines. For example, an inline text
// box with just a single space character inside it can be used to
- // represent a soft line break. if an inline text box containing white
+ // represent a soft line break. If an inline text box containing white
// space separates two lines, it should always be connected to the first
- // line via "kPreviousOnLineId". This is guaranteed by the renderer.
+ // line via "kPreviousOnLineId". This is guaranteed by the renderer. If
+ // there are multiple line breaks separating the two lines, then only
+ // the first line break is connected to the first line via
+ // "kPreviousOnLineId".
//
// Sometimes there might be an inline text box with a single space in it
// at the end of a text field. We should not mark positions that are at
@@ -530,11 +532,11 @@ class AXPosition {
// all cases, the parent of an inline text box is a static text object,
// whose end signifies the end of the text span. One exception is line
// breaks.
- if (!text_position->AtEndOfTextSpan() &&
+ if (text_position->AtEndOfAnchor() &&
+ !text_position->AtEndOfTextSpan() &&
text_position->IsInWhiteSpace() &&
GetNextOnLineID(text_position->anchor_id_) ==
- AXNode::kInvalidAXID &&
- text_position->AtEndOfAnchor()) {
+ AXNode::kInvalidAXID) {
return true;
}
@@ -573,10 +575,12 @@ class AXPosition {
// In other cases, we assume that white space, including but not limited
// to hard line breaks, might be used to separate lines. For example, an
// inline text box with just a single space character inside it can be
- // used to represent a soft line break. if an inline text box containing
+ // used to represent a soft line break. If an inline text box containing
// white space separates two lines, it should always be connected to the
// first line via "kPreviousOnLineId". This is guaranteed by the
- // renderer.
+ // renderer. If there are multiple line breaks separating the two lines,
+ // then only the first line break is connected to the first line via
+ // "kPreviousOnLineId".
//
// We don't treat a position that is at the start of white space that is
// on a line by itself as being at the end of the line. This is in order
@@ -641,9 +645,10 @@ class AXPosition {
// 2. The current position is not whitespace only, unless it is also
// the first leaf text position within the document.
- if (text_position->IsInWhiteSpace())
+ if (text_position->IsInWhiteSpace()) {
return text_position->CreatePreviousLeafTextPosition()
->IsNullPosition();
+ }
// 3. Either (a) the current leaf text position is the first leaf text
// position in the document, or (b) there are no line breaking
@@ -3036,7 +3041,7 @@ class AXPosition {
if (AnchorUnignoredChildCount())
return false;
- // All unignored leaf nodes in the AXTree except the document and the text
+ // 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
// empty div) need to be treated as leaf nodes.
@@ -3083,14 +3088,12 @@ class AXPosition {
// The first unignored ancestor is necessarily the empty object if this node
// is the descendant of an empty object.
AXNodeType* ancestor_node = GetLowestUnignoredAncestor();
-
if (!ancestor_node)
return nullptr;
AXPositionInstance position = CreateTextPosition(
tree_id_, GetAnchorID(ancestor_node), 0 /* text_offset */,
ax::mojom::TextAffinity::kDownstream);
-
if (position && position->IsEmptyObjectReplacedByCharacter())
return ancestor_node;
diff --git a/chromium/ui/accessibility/ax_range_unittest.cc b/chromium/ui/accessibility/ax_range_unittest.cc
index 92910f94a57..b27df725cb6 100644
--- a/chromium/ui/accessibility/ax_range_unittest.cc
+++ b/chromium/ui/accessibility/ax_range_unittest.cc
@@ -17,7 +17,7 @@
#include "ui/accessibility/ax_tree.h"
#include "ui/accessibility/ax_tree_id.h"
#include "ui/accessibility/ax_tree_update.h"
-#include "ui/accessibility/platform/test_ax_node_wrapper.h"
+#include "ui/accessibility/test_ax_node_helper.h"
#include "ui/accessibility/test_ax_tree_manager.h"
namespace ui {
@@ -68,8 +68,8 @@ class TestAXRangeScreenRectDelegate : public AXRangeRectDelegate {
if (!node)
return gfx::Rect();
- TestAXNodeWrapper* wrapper =
- TestAXNodeWrapper::GetOrCreate(tree_manager_->GetTree(), node);
+ TestAXNodeHelper* wrapper =
+ TestAXNodeHelper::GetOrCreate(tree_manager_->GetTree(), node);
return wrapper->GetInnerTextRangeBoundsRect(
start_offset, end_offset, AXCoordinateSystem::kScreenDIPs,
AXClippingBehavior::kClipped, offscreen_result);
@@ -85,8 +85,8 @@ class TestAXRangeScreenRectDelegate : public AXRangeRectDelegate {
if (!node)
return gfx::Rect();
- TestAXNodeWrapper* wrapper =
- TestAXNodeWrapper::GetOrCreate(tree_manager_->GetTree(), node);
+ TestAXNodeHelper* wrapper =
+ TestAXNodeHelper::GetOrCreate(tree_manager_->GetTree(), node);
return wrapper->GetBoundsRect(AXCoordinateSystem::kScreenDIPs,
AXClippingBehavior::kClipped,
offscreen_result);
diff --git a/chromium/ui/accessibility/ax_role_properties.cc b/chromium/ui/accessibility/ax_role_properties.cc
index 587b4e81e19..60115f31327 100644
--- a/chromium/ui/accessibility/ax_role_properties.cc
+++ b/chromium/ui/accessibility/ax_role_properties.cc
@@ -564,10 +564,10 @@ bool IsSetLike(const ax::mojom::Role role) {
case ax::mojom::Role::kMenu:
case ax::mojom::Role::kMenuBar:
case ax::mojom::Role::kMenuListPopup:
+ case ax::mojom::Role::kPopUpButton:
case ax::mojom::Role::kRadioGroup:
case ax::mojom::Role::kTabList:
case ax::mojom::Role::kTree:
- case ax::mojom::Role::kPopUpButton:
return true;
default:
return false;
@@ -675,16 +675,6 @@ bool IsTableRow(ax::mojom::Role role) {
}
}
-bool IsTextOrLineBreak(ax::mojom::Role role) {
- switch (role) {
- case ax::mojom::Role::kLineBreak:
- case ax::mojom::Role::kStaticText:
- return true;
- default:
- return false;
- }
-}
-
bool IsText(ax::mojom::Role role) {
switch (role) {
case ax::mojom::Role::kInlineTextBox:
diff --git a/chromium/ui/accessibility/ax_role_properties.h b/chromium/ui/accessibility/ax_role_properties.h
index 536d2758440..60e8e570e62 100644
--- a/chromium/ui/accessibility/ax_role_properties.h
+++ b/chromium/ui/accessibility/ax_role_properties.h
@@ -161,14 +161,10 @@ AX_BASE_EXPORT bool IsTableLike(const ax::mojom::Role role);
// table is not used for layout purposes.
AX_BASE_EXPORT bool IsTableRow(ax::mojom::Role role);
-// Returns true if it's a text-related node e.g. static text, line break, or
-// inline text box node.
+// Returns true if the provided role is text-related, e.g., static text, line
+// break, or inline text box.
AX_BASE_EXPORT bool IsText(ax::mojom::Role role);
-// Returns true if it's a text-related node e.g. a static text or line break
-// node.
-AX_BASE_EXPORT bool IsTextOrLineBreak(ax::mojom::Role role);
-
// Returns true if the role supports expand/collapse.
AX_BASE_EXPORT bool SupportsExpandCollapse(const ax::mojom::Role role);
diff --git a/chromium/ui/accessibility/ax_table_fuzzer.cc b/chromium/ui/accessibility/ax_table_fuzzer.cc
index 9925f9bf79f..1ee955ee38f 100644
--- a/chromium/ui/accessibility/ax_table_fuzzer.cc
+++ b/chromium/ui/accessibility/ax_table_fuzzer.cc
@@ -98,12 +98,21 @@ void TestTableAPIs(const ui::AXNode* node) {
// crash. Normally |ids| is an out argument only, but
// there's no reason we shouldn't be able to pass a vector
// that was previously used by another call.
- std::vector<int32_t> ids;
+ std::vector<ui::AXNode::AXID> ids;
for (int i = 0; i < 3; i++) {
- node->GetTableColHeaderNodeIds(i, &ids);
- node->GetTableRowHeaderNodeIds(i, &ids);
+ std::vector<ui::AXNode::AXID> col_header_node_ids =
+ node->GetTableColHeaderNodeIds(i);
+ ids.insert(ids.end(), col_header_node_ids.begin(),
+ col_header_node_ids.end());
+
+ std::vector<ui::AXNode::AXID> row_header_node_ids =
+ node->GetTableRowHeaderNodeIds(i);
+ ids.insert(ids.end(), row_header_node_ids.begin(),
+ row_header_node_ids.end());
}
- node->GetTableUniqueCellIds(&ids);
+ std::vector<ui::AXNode::AXID> unique_cell_ids = node->GetTableUniqueCellIds();
+ ids.insert(ids.end(), unique_cell_ids.begin(), unique_cell_ids.end());
+
ignore_result(node->IsTableRow());
ignore_result(node->GetTableRowRowIndex());
#if defined(OS_MACOSX)
@@ -118,8 +127,14 @@ void TestTableAPIs(const ui::AXNode* node) {
ignore_result(node->GetTableCellRowSpan());
ignore_result(node->GetTableCellAriaColIndex());
ignore_result(node->GetTableCellAriaRowIndex());
- node->GetTableCellColHeaderNodeIds(&ids);
- node->GetTableCellRowHeaderNodeIds(&ids);
+ std::vector<ui::AXNode::AXID> cell_col_header_node_ids =
+ node->GetTableCellColHeaderNodeIds();
+ ids.insert(ids.end(), cell_col_header_node_ids.begin(),
+ cell_col_header_node_ids.end());
+ std::vector<ui::AXNode::AXID> cell_row_header_node_ids =
+ node->GetTableCellRowHeaderNodeIds();
+ ids.insert(ids.end(), cell_row_header_node_ids.begin(),
+ cell_row_header_node_ids.end());
std::vector<ui::AXNode*> headers;
node->GetTableCellColHeaders(&headers);
node->GetTableCellRowHeaders(&headers);
diff --git a/chromium/ui/accessibility/ax_tree.cc b/chromium/ui/accessibility/ax_tree.cc
index 5a2b447abbc..003f2770723 100644
--- a/chromium/ui/accessibility/ax_tree.cc
+++ b/chromium/ui/accessibility/ax_tree.cc
@@ -925,6 +925,11 @@ const std::set<AXTreeID> AXTree::GetAllChildTreeIds() const {
}
bool AXTree::Unserialize(const AXTreeUpdate& update) {
+ event_intents_ = update.event_intents;
+ base::ScopedClosureRunner clear_event_intents(base::BindOnce(
+ [](std::vector<AXEventIntent>* event_intents) { event_intents->clear(); },
+ &event_intents_));
+
AXTreeUpdateState update_state(*this);
const AXNode::AXID old_root_id = root_ ? root_->id() : AXNode::kInvalidAXID;
@@ -2202,30 +2207,69 @@ void AXTree::ComputeSetSizePosInSetAndCacheHelper(
} // End of iterating over each item in |ordered_set_content|.
}
-// Returns the pos_in_set of item. Looks in |node_set_size_pos_in_set_info_map_|
-// for cached value. Calculates pos_in_set and set_size for item (and all other
-// items in the same ordered set) if no value is present in the cache. This
-// function is guaranteed to be only called on nodes that can hold pos_in_set
-// values, minimizing the size of the cache.
-int32_t AXTree::GetPosInSet(const AXNode& node, const AXNode* ordered_set) {
- // If item's id is not in the cache, compute it.
- if (node_set_size_pos_in_set_info_map_.find(node.id()) ==
- node_set_size_pos_in_set_info_map_.end())
- ComputeSetSizePosInSetAndCache(node, ordered_set);
- return node_set_size_pos_in_set_info_map_[node.id()].pos_in_set;
+base::Optional<int> AXTree::GetPosInSet(const AXNode& node) {
+ if (node_set_size_pos_in_set_info_map_.find(node.id()) !=
+ node_set_size_pos_in_set_info_map_.end()) {
+ // If item's id is in the cache, return stored PosInSet value.
+ return node_set_size_pos_in_set_info_map_[node.id()].pos_in_set;
+ }
+
+ if (GetTreeUpdateInProgressState())
+ return base::nullopt;
+
+ // Only allow this to be called on nodes that can hold PosInSet values,
+ // which are defined in the ARIA spec.
+ if (!node.IsOrderedSetItem() || node.IsIgnored())
+ return base::nullopt;
+
+ const AXNode* ordered_set = node.GetOrderedSet();
+ if (!ordered_set)
+ return base::nullopt;
+
+ // Compute, cache, then return.
+ ComputeSetSizePosInSetAndCache(node, ordered_set);
+ base::Optional<int> pos_in_set =
+ node_set_size_pos_in_set_info_map_[node.id()].pos_in_set;
+ if (pos_in_set.has_value() && pos_in_set.value() < 1)
+ return base::nullopt;
+
+ return pos_in_set;
}
-// Returns the set_size of node. node could be an ordered set or an item.
-// Looks in |node_set_size_pos_in_set_info_map_| for cached value. Calculates
-// pos_in_set and set_size for all nodes in same ordered set if no value is
-// present in the cache. This function is guaranteed to be only called on nodes
-// that can hold set_size values, minimizing the size of the cache.
-int32_t AXTree::GetSetSize(const AXNode& node, const AXNode* ordered_set) {
- // If node's id is not in the cache, compute it.
- if (node_set_size_pos_in_set_info_map_.find(node.id()) ==
- node_set_size_pos_in_set_info_map_.end())
- ComputeSetSizePosInSetAndCache(node, ordered_set);
- return node_set_size_pos_in_set_info_map_[node.id()].set_size;
+base::Optional<int> AXTree::GetSetSize(const AXNode& node) {
+ if (node_set_size_pos_in_set_info_map_.find(node.id()) !=
+ node_set_size_pos_in_set_info_map_.end()) {
+ // If item's id is in the cache, return stored SetSize value.
+ return node_set_size_pos_in_set_info_map_[node.id()].set_size;
+ }
+
+ if (GetTreeUpdateInProgressState())
+ return base::nullopt;
+
+ // Only allow this to be called on nodes that can hold SetSize values, which
+ // are defined in the ARIA spec. However, we allow set-like items to receive
+ // SetSize values for internal purposes.
+ if ((!node.IsOrderedSetItem() && !node.IsOrderedSet()) || node.IsIgnored() ||
+ node.IsEmbeddedGroup()) {
+ return base::nullopt;
+ }
+
+ // If |node| is item-like, find its outerlying ordered set. Otherwise,
+ // |node| is the ordered set.
+ const AXNode* ordered_set = &node;
+ if (IsItemLike(node.data().role))
+ ordered_set = node.GetOrderedSet();
+ if (!ordered_set)
+ return base::nullopt;
+
+ // Compute, cache, then return.
+ ComputeSetSizePosInSetAndCache(node, ordered_set);
+ base::Optional<int> set_size =
+ node_set_size_pos_in_set_info_map_[node.id()].set_size;
+ if (set_size.has_value() && set_size.value() < 0)
+ return base::nullopt;
+
+ return set_size;
}
AXTree::Selection AXTree::GetUnignoredSelection() const {
diff --git a/chromium/ui/accessibility/ax_tree.h b/chromium/ui/accessibility/ax_tree.h
index 8c1c57517ac..c47d1c20234 100644
--- a/chromium/ui/accessibility/ax_tree.h
+++ b/chromium/ui/accessibility/ax_tree.h
@@ -147,18 +147,14 @@ class AX_EXPORT AXTree : public AXNode::OwnerTree {
// conflict with positive-numbered node IDs from tree sources.
int32_t GetNextNegativeInternalNodeId();
- // Returns the pos_in_set of node. Looks in node_set_size_pos_in_set_info_map_
- // for cached value. Calculates pos_in_set and set_size for node (and all
- // other nodes in the same ordered set) if no value is present in the cache.
- // This function is guaranteed to be only called on nodes that can hold
- // pos_in_set values, minimizing the size of the cache.
- int32_t GetPosInSet(const AXNode& node, const AXNode* ordered_set) override;
- // Returns the set_size of node. Looks in node_set_size_pos_in_set_info_map_
- // for cached value. Calculates pos_inset_set and set_size for node (and all
- // other nodes in the same ordered set) if no value is present in the cache.
- // This function is guaranteed to be only called on nodes that can hold
- // set_size values, minimizing the size of the cache.
- int32_t GetSetSize(const AXNode& node, const AXNode* ordered_set) override;
+ // Returns the PosInSet of |node|. Looks in node_set_size_pos_in_set_info_map_
+ // for cached value. Calls |ComputeSetSizePosInSetAndCache|if no value is
+ // present in the cache.
+ base::Optional<int> GetPosInSet(const AXNode& node) override;
+ // Returns the SetSize of |node|. Looks in node_set_size_pos_in_set_info_map_
+ // for cached value. Calls |ComputeSetSizePosInSetAndCache|if no value is
+ // present in the cache.
+ base::Optional<int> GetSetSize(const AXNode& node) override;
Selection GetUnignoredSelection() const override;
@@ -174,6 +170,11 @@ class AX_EXPORT AXTree : public AXNode::OwnerTree {
// When should we initialize this?
std::unique_ptr<AXLanguageDetectionManager> language_detection_manager;
+ // A list of intents active during a tree update/unserialization.
+ const std::vector<AXEventIntent>& event_intents() const {
+ return event_intents_;
+ }
+
private:
friend class AXTableInfoTest;
@@ -332,8 +333,8 @@ class AX_EXPORT AXTree : public AXNode::OwnerTree {
NodeSetSizePosInSetInfo();
~NodeSetSizePosInSetInfo();
- int32_t pos_in_set = 0;
- int32_t set_size = 0;
+ base::Optional<int> pos_in_set;
+ base::Optional<int> set_size;
base::Optional<int> lowest_hierarchical_level;
};
@@ -388,6 +389,8 @@ class AX_EXPORT AXTree : public AXNode::OwnerTree {
// Indicates if the tree represents a paginated document
bool has_pagination_support_ = false;
+
+ std::vector<AXEventIntent> event_intents_;
};
} // namespace ui
diff --git a/chromium/ui/accessibility/ax_tree_id.cc b/chromium/ui/accessibility/ax_tree_id.cc
index 86347de4255..3cb2335c798 100644
--- a/chromium/ui/accessibility/ax_tree_id.cc
+++ b/chromium/ui/accessibility/ax_tree_id.cc
@@ -10,7 +10,7 @@
#include "base/check.h"
#include "base/no_destructor.h"
#include "base/notreached.h"
-#include "base/value_conversions.h"
+#include "base/util/values/values_util.h"
#include "base/values.h"
#include "ui/accessibility/ax_enums.mojom.h"
@@ -30,10 +30,10 @@ AXTreeID::AXTreeID(const std::string& string) {
type_ = ax::mojom::AXTreeIDType::kUnknown;
} else {
type_ = ax::mojom::AXTreeIDType::kToken;
- base::Value string_value(string);
- base::UnguessableToken token;
- CHECK(base::GetValueAsUnguessableToken(string_value, &token));
- token_ = token;
+ base::Optional<base::UnguessableToken> token =
+ util::ValueToUnguessableToken(base::Value(string));
+ CHECK(token);
+ token_ = *token;
}
}
@@ -54,7 +54,7 @@ std::string AXTreeID::ToString() const {
case ax::mojom::AXTreeIDType::kUnknown:
return "";
case ax::mojom::AXTreeIDType::kToken:
- return base::CreateUnguessableTokenValue(*token_).GetString();
+ return util::UnguessableTokenToValue(*token_).GetString();
}
NOTREACHED();
diff --git a/chromium/ui/accessibility/ax_tree_unittest.cc b/chromium/ui/accessibility/ax_tree_unittest.cc
index 05c962720ea..8f2c3ce8541 100644
--- a/chromium/ui/accessibility/ax_tree_unittest.cc
+++ b/chromium/ui/accessibility/ax_tree_unittest.cc
@@ -3138,7 +3138,7 @@ TEST(AXTreeTest, ChildTreeIds) {
}
// Tests GetPosInSet and GetSetSize return the assigned int attribute values.
-TEST(AXTreeTest, TestSetSizePosInSetAssigned) {
+TEST(AXTreeTest, SetSizePosInSetAssigned) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(4);
@@ -3170,8 +3170,8 @@ TEST(AXTreeTest, TestSetSizePosInSetAssigned) {
EXPECT_OPTIONAL_EQ(12, item3->GetSetSize());
}
-// Tests that pos_in_set and set_size can be calculated if not assigned.
-TEST(AXTreeTest, TestSetSizePosInSetUnassigned) {
+// Tests that PosInSet and SetSize can be calculated if not assigned.
+TEST(AXTreeTest, SetSizePosInSetUnassigned) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(4);
@@ -3197,9 +3197,9 @@ TEST(AXTreeTest, TestSetSizePosInSetUnassigned) {
EXPECT_OPTIONAL_EQ(3, item3->GetSetSize());
}
-// Tests pos_in_set can be calculated if unassigned, and set_size can be
+// Tests PosInSet can be calculated if unassigned, and SetSize can be
// assigned on the outerlying ordered set.
-TEST(AXTreeTest, TestSetSizeAssignedInContainer) {
+TEST(AXTreeTest, SetSizeAssignedOnContainer) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(4);
@@ -3215,18 +3215,21 @@ TEST(AXTreeTest, TestSetSizeAssignedInContainer) {
tree_update.nodes[3].role = ax::mojom::Role::kListItem;
AXTree tree(tree_update);
- // Items should inherit set_size from ordered set if not specified.
+ // Items should inherit SetSize from ordered set if not specified.
AXNode* item1 = tree.GetFromId(2);
EXPECT_OPTIONAL_EQ(7, item1->GetSetSize());
+ EXPECT_OPTIONAL_EQ(1, item1->GetPosInSet());
AXNode* item2 = tree.GetFromId(3);
EXPECT_OPTIONAL_EQ(7, item2->GetSetSize());
+ EXPECT_OPTIONAL_EQ(2, item2->GetPosInSet());
AXNode* item3 = tree.GetFromId(4);
EXPECT_OPTIONAL_EQ(7, item3->GetSetSize());
+ EXPECT_OPTIONAL_EQ(3, item3->GetPosInSet());
}
// Tests GetPosInSet and GetSetSize on a list containing various roles.
// Roles for items and associated ordered set should match up.
-TEST(AXTreeTest, TestSetSizePosInSetDiverseList) {
+TEST(AXTreeTest, SetSizePosInSetDiverseList) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(6);
@@ -3261,12 +3264,12 @@ TEST(AXTreeTest, TestSetSizePosInSetDiverseList) {
EXPECT_OPTIONAL_EQ(4, item3->GetPosInSet());
EXPECT_OPTIONAL_EQ(4, item3->GetSetSize());
AXNode* tab = tree.GetFromId(6);
- EXPECT_OPTIONAL_EQ(0, tab->GetPosInSet());
- EXPECT_OPTIONAL_EQ(0, tab->GetSetSize());
+ EXPECT_FALSE(tab->GetPosInSet());
+ EXPECT_FALSE(tab->GetSetSize());
}
// Tests GetPosInSet and GetSetSize on a nested list.
-TEST(AXTreeTest, TestSetSizePosInSetNestedList) {
+TEST(AXTreeTest, SetSizePosInSetNestedList) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(7);
@@ -3307,9 +3310,9 @@ TEST(AXTreeTest, TestSetSizePosInSetNestedList) {
EXPECT_OPTIONAL_EQ(3, outer_item3->GetSetSize());
}
-// Tests pos_in_set can be calculated if one item specifies pos_in_set, but
+// Tests PosInSet can be calculated if one item specifies PosInSet, but
// other assignments are missing.
-TEST(AXTreeTest, TestPosInSetMissing) {
+TEST(AXTreeTest, PosInSetMissing) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(4);
@@ -3339,8 +3342,8 @@ TEST(AXTreeTest, TestPosInSetMissing) {
EXPECT_OPTIONAL_EQ(20, item3->GetSetSize());
}
-// A more difficult test that involves missing pos_in_set and set_size values.
-TEST(AXTreeTest, TestSetSizePosInSetMissingDifficult) {
+// A more difficult test that involves missing PosInSet and SetSize values.
+TEST(AXTreeTest, SetSizePosInSetMissingDifficult) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(6);
@@ -3380,9 +3383,9 @@ TEST(AXTreeTest, TestSetSizePosInSetMissingDifficult) {
EXPECT_OPTIONAL_EQ(11, item5->GetSetSize());
}
-// Tests that code overwrites decreasing set_size assignments to largest of
+// Tests that code overwrites decreasing SetSize assignments to largest of
// assigned values.
-TEST(AXTreeTest, TestSetSizeDecreasing) {
+TEST(AXTreeTest, SetSizeDecreasing) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(4);
@@ -3410,8 +3413,8 @@ TEST(AXTreeTest, TestSetSizeDecreasing) {
EXPECT_OPTIONAL_EQ(5, item3->GetSetSize());
}
-// Tests that code overwrites decreasing pos_in_set values.
-TEST(AXTreeTest, TestPosInSetDecreasing) {
+// Tests that code overwrites decreasing PosInSet values.
+TEST(AXTreeTest, PosInSetDecreasing) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(4);
@@ -3439,10 +3442,10 @@ TEST(AXTreeTest, TestPosInSetDecreasing) {
EXPECT_OPTIONAL_EQ(8, item3->GetSetSize());
}
-// Tests that code overwrites duplicate pos_in_set values. Note this case is
+// Tests that code overwrites duplicate PosInSet values. Note this case is
// tricky; an update to the second element causes an update to the third
// element.
-TEST(AXTreeTest, TestPosInSetDuplicates) {
+TEST(AXTreeTest, PosInSetDuplicates) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(4);
@@ -3473,7 +3476,7 @@ TEST(AXTreeTest, TestPosInSetDuplicates) {
// Tests GetPosInSet and GetSetSize when some list items are nested in a generic
// container.
-TEST(AXTreeTest, TestSetSizePosInSetNestedContainer) {
+TEST(AXTreeTest, SetSizePosInSetNestedContainer) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(7);
@@ -3517,10 +3520,8 @@ TEST(AXTreeTest, TestSetSizePosInSetNestedContainer) {
}
// Tests GetSetSize and GetPosInSet are correct, even when list items change.
-// This test is directed at the caching functionality of pos_in_set and
-// set_size. Tests that previously calculated values are not used after
-// tree is updated.
-TEST(AXTreeTest, TestSetSizePosInSetDeleteItem) {
+// Tests that previously calculated values are not used after tree is updated.
+TEST(AXTreeTest, SetSizePosInSetDeleteItem) {
AXTreeUpdate initial_state;
initial_state.root_id = 1;
initial_state.nodes.resize(4);
@@ -3561,9 +3562,9 @@ TEST(AXTreeTest, TestSetSizePosInSetDeleteItem) {
// Tests GetSetSize and GetPosInSet are correct, even when list items change.
// This test adds an item to the front of a list, which invalidates previously
-// calculated pos_in_set and set_size values. Tests that old values are not
+// calculated PosInSet and SetSize values. Tests that old values are not
// used after tree is updated.
-TEST(AXTreeTest, TestSetSizePosInSetAddItem) {
+TEST(AXTreeTest, SetSizePosInSetAddItem) {
AXTreeUpdate initial_state;
initial_state.root_id = 1;
initial_state.nodes.resize(4);
@@ -3611,22 +3612,22 @@ TEST(AXTreeTest, TestSetSizePosInSetAddItem) {
EXPECT_OPTIONAL_EQ(4, new_item4->GetSetSize());
}
-// Tests that the outerlying ordered set reports a set_size. Ordered sets
-// should not report a pos_in_set value other than 0, since they are not
+// Tests that the outerlying ordered set reports a SetSize. Ordered sets
+// should not report a PosInSet value other than 0, since they are not
// considered to be items within a set (even when nested).
-TEST(AXTreeTest, TestOrderedSetReportsSetSize) {
+TEST(AXTreeTest, OrderedSetReportsSetSize) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(12);
tree_update.nodes[0].id = 1;
- tree_update.nodes[0].role = ax::mojom::Role::kList; // set_size = 3
+ tree_update.nodes[0].role = ax::mojom::Role::kList; // SetSize = 3
tree_update.nodes[0].child_ids = {2, 3, 4, 7, 8, 9, 12};
tree_update.nodes[1].id = 2;
tree_update.nodes[1].role = ax::mojom::Role::kListItem; // 1 of 3
tree_update.nodes[2].id = 3;
tree_update.nodes[2].role = ax::mojom::Role::kListItem; // 2 of 3
tree_update.nodes[3].id = 4;
- tree_update.nodes[3].role = ax::mojom::Role::kList; // set_size = 2
+ tree_update.nodes[3].role = ax::mojom::Role::kList; // SetSize = 2
tree_update.nodes[3].child_ids = {5, 6};
tree_update.nodes[4].id = 5;
tree_update.nodes[4].role = ax::mojom::Role::kListItem; // 1 of 2
@@ -3635,10 +3636,10 @@ TEST(AXTreeTest, TestOrderedSetReportsSetSize) {
tree_update.nodes[6].id = 7;
tree_update.nodes[6].role = ax::mojom::Role::kListItem; // 3 of 3
tree_update.nodes[7].id = 8;
- tree_update.nodes[7].role = ax::mojom::Role::kList; // set_size = 0
+ tree_update.nodes[7].role = ax::mojom::Role::kList; // SetSize = 0
tree_update.nodes[8].id = 9;
tree_update.nodes[8].role =
- ax::mojom::Role::kList; // set_size = 1 because only 1 item whose role
+ ax::mojom::Role::kList; // SetSize = 1 because only 1 item whose role
// matches
tree_update.nodes[8].child_ids = {10, 11};
tree_update.nodes[9].id = 10;
@@ -3682,8 +3683,8 @@ TEST(AXTreeTest, TestOrderedSetReportsSetSize) {
// Only 1 item whose role matches.
EXPECT_OPTIONAL_EQ(1, inner_list3->GetSetSize());
AXNode* inner_list3_article1 = tree.GetFromId(10);
- EXPECT_OPTIONAL_EQ(0, inner_list3_article1->GetPosInSet());
- EXPECT_OPTIONAL_EQ(0, inner_list3_article1->GetSetSize());
+ EXPECT_FALSE(inner_list3_article1->GetPosInSet());
+ EXPECT_FALSE(inner_list3_article1->GetSetSize());
AXNode* inner_list3_item1 = tree.GetFromId(11);
EXPECT_OPTIONAL_EQ(1, inner_list3_item1->GetPosInSet());
EXPECT_OPTIONAL_EQ(1, inner_list3_item1->GetSetSize());
@@ -3696,7 +3697,7 @@ TEST(AXTreeTest, TestOrderedSetReportsSetSize) {
}
// Tests GetPosInSet and GetSetSize code on invalid input.
-TEST(AXTreeTest, TestSetSizePosInSetInvalid) {
+TEST(AXTreeTest, SetSizePosInSetInvalid) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(3);
@@ -3715,17 +3716,17 @@ TEST(AXTreeTest, TestSetSizePosInSetInvalid) {
EXPECT_FALSE(item1->GetPosInSet());
EXPECT_FALSE(item1->GetSetSize());
AXNode* item2 = tree.GetFromId(2);
- EXPECT_OPTIONAL_EQ(0, item2->GetPosInSet());
- EXPECT_OPTIONAL_EQ(0, item2->GetSetSize());
+ EXPECT_FALSE(item2->GetPosInSet());
+ EXPECT_FALSE(item2->GetSetSize());
AXNode* item3 = tree.GetFromId(3);
- EXPECT_OPTIONAL_EQ(0, item3->GetPosInSet());
- EXPECT_OPTIONAL_EQ(0, item3->GetSetSize());
+ EXPECT_FALSE(item3->GetPosInSet());
+ EXPECT_FALSE(item3->GetSetSize());
}
// Tests GetPosInSet and GetSetSize code on kRadioButtons. Radio buttons
// behave differently than other item-like elements; most notably, they do not
// need to be contained within an ordered set to report a PosInSet or SetSize.
-TEST(AXTreeTest, TestSetSizePosInSetRadioButtons) {
+TEST(AXTreeTest, SetSizePosInSetRadioButtons) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(13);
@@ -3837,13 +3838,13 @@ TEST(AXTreeTest, TestSetSizePosInSetRadioButtons) {
// Tests GetPosInSet and GetSetSize on a list that includes radio buttons.
// Note that radio buttons do not contribute to the SetSize of the outerlying
// list.
-TEST(AXTreeTest, TestSetSizePosInSetRadioButtonsInList) {
+TEST(AXTreeTest, SetSizePosInSetRadioButtonsInList) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(6);
tree_update.nodes[0].id = 1;
tree_update.nodes[0].role =
- ax::mojom::Role::kList; // set_size = 2, since only contains 2 ListItems
+ ax::mojom::Role::kList; // SetSize = 2, since only contains 2 ListItems
tree_update.nodes[0].child_ids = {2, 3, 4, 5, 6};
tree_update.nodes[1].id = 2;
@@ -3888,7 +3889,7 @@ TEST(AXTreeTest, TestSetSizePosInSetRadioButtonsInList) {
// to the tree representation, the three elements are siblings. However,
// due to the presence of the kHierarchicalLevel attribute, they all belong
// to different sets.
-TEST(AXTreeTest, TestSetSizePosInSetFlatTree) {
+TEST(AXTreeTest, SetSizePosInSetFlatTree) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(4);
@@ -3922,7 +3923,7 @@ TEST(AXTreeTest, TestSetSizePosInSetFlatTree) {
// Tests GetPosInSet and GetSetSize on a flat tree representation, where only
// the level is specified.
-TEST(AXTreeTest, TestSetSizePosInSetFlatTreeLevelsOnly) {
+TEST(AXTreeTest, SetSizePosInSetFlatTreeLevelsOnly) {
AXTreeUpdate tree_update;
tree_update.root_id = 1;
tree_update.nodes.resize(9);
@@ -3994,7 +3995,7 @@ TEST(AXTreeTest, TestSetSizePosInSetFlatTreeLevelsOnly) {
// Tests that GetPosInSet and GetSetSize work while a tree is being
// unserialized.
-TEST(AXTreeTest, TestSetSizePosInSetSubtreeDeleted) {
+TEST(AXTreeTest, SetSizePosInSetSubtreeDeleted) {
AXTreeUpdate initial_state;
initial_state.root_id = 1;
initial_state.nodes.resize(3);
@@ -4035,7 +4036,7 @@ TEST(AXTreeTest, TestSetSizePosInSetSubtreeDeleted) {
}
// Tests that GetPosInSet and GetSetSize work when there are ignored nodes.
-TEST(AXTreeTest, TestSetSizePosInSetIgnoredItem) {
+TEST(AXTreeTest, SetSizePosInSetIgnoredItem) {
AXTreeUpdate initial_state;
initial_state.root_id = 1;
initial_state.nodes.resize(3);
@@ -4083,7 +4084,7 @@ TEST(AXTreeTest, TestSetSizePosInSetIgnoredItem) {
// Tests that kPopUpButtons are assigned the SetSize of the wrapped
// kMenuListPopup, if one is present.
-TEST(AXTreeTest, TestSetSizePosInSetPopUpButton) {
+TEST(AXTreeTest, SetSizePosInSetPopUpButton) {
AXTreeUpdate initial_state;
initial_state.root_id = 1;
initial_state.nodes.resize(6);
@@ -4114,7 +4115,7 @@ TEST(AXTreeTest, TestSetSizePosInSetPopUpButton) {
// Tests that PosInSet and SetSize are still correctly calculated when there
// are nodes with role of kUnknown layered between items and ordered set.
-TEST(AXTreeTest, TestSetSizePosInSetUnkown) {
+TEST(AXTreeTest, SetSizePosInSetUnkown) {
AXTreeUpdate initial_state;
initial_state.root_id = 1;
initial_state.nodes.resize(5);
@@ -4143,7 +4144,7 @@ TEST(AXTreeTest, TestSetSizePosInSetUnkown) {
EXPECT_OPTIONAL_EQ(2, item2->GetSetSize());
}
-TEST(AXTreeTest, TestSetSizePosInSetMenuItemValidChildOfMenuListPopup) {
+TEST(AXTreeTest, SetSizePosInSetMenuItemValidChildOfMenuListPopup) {
AXTreeUpdate initial_state;
initial_state.root_id = 1;
initial_state.nodes.resize(3);
@@ -4166,7 +4167,7 @@ TEST(AXTreeTest, TestSetSizePosInSetMenuItemValidChildOfMenuListPopup) {
EXPECT_OPTIONAL_EQ(2, item2->GetSetSize());
}
-TEST(AXTreeTest, TestSetSizePostInSetListBoxOptionWithGroup) {
+TEST(AXTreeTest, SetSizePostInSetListBoxOptionWithGroup) {
AXTreeUpdate initial_state;
initial_state.root_id = 1;
initial_state.nodes.resize(7);
@@ -4191,16 +4192,212 @@ TEST(AXTreeTest, TestSetSizePostInSetListBoxOptionWithGroup) {
AXNode* listbox_option1 = tree.GetFromId(4);
EXPECT_OPTIONAL_EQ(1, listbox_option1->GetPosInSet());
- EXPECT_OPTIONAL_EQ(2, listbox_option1->GetSetSize());
+ EXPECT_OPTIONAL_EQ(4, listbox_option1->GetSetSize());
AXNode* listbox_option2 = tree.GetFromId(5);
EXPECT_OPTIONAL_EQ(2, listbox_option2->GetPosInSet());
- EXPECT_OPTIONAL_EQ(2, listbox_option2->GetSetSize());
+ EXPECT_OPTIONAL_EQ(4, listbox_option2->GetSetSize());
AXNode* listbox_option3 = tree.GetFromId(6);
- EXPECT_OPTIONAL_EQ(1, listbox_option3->GetPosInSet());
- EXPECT_OPTIONAL_EQ(2, listbox_option3->GetSetSize());
+ EXPECT_OPTIONAL_EQ(3, listbox_option3->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(4, listbox_option3->GetSetSize());
AXNode* listbox_option4 = tree.GetFromId(7);
- EXPECT_OPTIONAL_EQ(2, listbox_option4->GetPosInSet());
- EXPECT_OPTIONAL_EQ(2, listbox_option4->GetSetSize());
+ EXPECT_OPTIONAL_EQ(4, listbox_option4->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(4, listbox_option4->GetSetSize());
+}
+
+TEST(AXTreeTest, SetSizePosInSetGroup) {
+ // The behavior of a group changes depending on the context it appears in
+ // i.e. if it appears alone vs. if it is contained within another set-like
+ // element. The below example shows a group standing alone:
+ //
+ // <ul role="group"> <!-- SetSize = 3 -->
+ // <li role="menuitemradio" aria-checked="true">Small</li>
+ // <li role="menuitemradio" aria-checked="false">Medium</li>
+ // <li role="menuitemradio" aria-checked="false">Large</li>
+ // </ul>
+ //
+ // However, when it is contained within another set-like element, like a
+ // listbox, it should simply act like a generic container:
+ //
+ // <div role="listbox"> <!-- SetSize = 3 -->
+ // <div role="option">Red</div> <!-- 1 of 3 -->
+ // <div role="option">Yellow</div> <!-- 2 of 3 -->
+ // <div role="group"> <!-- SetSize = 0 -->
+ // <div role="option">Blue</div> <!-- 3 of 3 -->
+ // </div>
+ // </div>
+ //
+ // Please note: the GetPosInSet and GetSetSize functions take slightly
+ // different code paths when initially run on items vs. the container.
+ // Exercise both code paths in this test.
+
+ AXTreeUpdate tree_update;
+ tree_update.root_id = 1;
+ tree_update.nodes.resize(6);
+ tree_update.nodes[0].id = 1;
+ tree_update.nodes[0].role = ax::mojom::Role::kMenu; // SetSize = 4
+ tree_update.nodes[0].child_ids = {2, 6};
+ tree_update.nodes[1].id = 2;
+ tree_update.nodes[1].role = ax::mojom::Role::kGroup; // SetSize = 0
+ tree_update.nodes[1].child_ids = {3, 4, 5};
+ tree_update.nodes[2].id = 3;
+ tree_update.nodes[2].role = ax::mojom::Role::kMenuItemRadio; // 1 of 4
+ tree_update.nodes[3].id = 4;
+ tree_update.nodes[3].role = ax::mojom::Role::kMenuItemRadio; // 2 of 4
+ tree_update.nodes[4].id = 5;
+ tree_update.nodes[4].role = ax::mojom::Role::kMenuItemRadio; // 3 of 4
+ tree_update.nodes[5].id = 6;
+ tree_update.nodes[5].role = ax::mojom::Role::kMenuItemRadio; // 4 of 4
+ AXTree tree(tree_update);
+
+ // Get data on kMenu first.
+ AXNode* menu = tree.GetFromId(1);
+ EXPECT_OPTIONAL_EQ(4, menu->GetSetSize());
+ AXNode* group = tree.GetFromId(2);
+ EXPECT_FALSE(group->GetSetSize());
+ // The below values should have already been computed and cached.
+ AXNode* item1 = tree.GetFromId(3);
+ EXPECT_OPTIONAL_EQ(1, item1->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(4, item1->GetSetSize());
+ AXNode* item4 = tree.GetFromId(6);
+ EXPECT_OPTIONAL_EQ(4, item4->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(4, item4->GetSetSize());
+
+ AXTreeUpdate next_tree_update;
+ next_tree_update.root_id = 1;
+ next_tree_update.nodes.resize(6);
+ next_tree_update.nodes[0].id = 1;
+ next_tree_update.nodes[0].role = ax::mojom::Role::kListBox; // SetSize = 4
+ next_tree_update.nodes[0].child_ids = {2, 6};
+ next_tree_update.nodes[1].id = 2;
+ next_tree_update.nodes[1].role = ax::mojom::Role::kGroup; // SetSize = 0
+ next_tree_update.nodes[1].child_ids = {3, 4, 5};
+ next_tree_update.nodes[2].id = 3;
+ next_tree_update.nodes[2].role = ax::mojom::Role::kListBoxOption; // 1 of 4
+ next_tree_update.nodes[3].id = 4;
+ next_tree_update.nodes[3].role = ax::mojom::Role::kListBoxOption; // 2 of 4
+ next_tree_update.nodes[4].id = 5;
+ next_tree_update.nodes[4].role = ax::mojom::Role::kListBoxOption; // 3 of 4
+ next_tree_update.nodes[5].id = 6;
+ next_tree_update.nodes[5].role = ax::mojom::Role::kListBoxOption; // 4 of 4
+ AXTree next_tree(next_tree_update);
+
+ // Get data on kListBoxOption first.
+ AXNode* option1 = next_tree.GetFromId(3);
+ EXPECT_OPTIONAL_EQ(1, option1->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(4, option1->GetSetSize());
+ AXNode* option2 = next_tree.GetFromId(4);
+ EXPECT_OPTIONAL_EQ(2, option2->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(4, option2->GetSetSize());
+ AXNode* option3 = next_tree.GetFromId(5);
+ EXPECT_OPTIONAL_EQ(3, option3->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(4, option3->GetSetSize());
+ AXNode* option4 = next_tree.GetFromId(6);
+ EXPECT_OPTIONAL_EQ(4, option4->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(4, option4->GetSetSize());
+ AXNode* next_group = next_tree.GetFromId(2);
+ EXPECT_FALSE(next_group->GetSetSize());
+ // The below value should have already been computed and cached.
+ AXNode* listbox = next_tree.GetFromId(1);
+ EXPECT_OPTIONAL_EQ(4, listbox->GetSetSize());
+
+ // Standalone groups are allowed.
+ AXTreeUpdate third_tree_update;
+ third_tree_update.root_id = 1;
+ third_tree_update.nodes.resize(3);
+ third_tree_update.nodes[0].id = 1;
+ third_tree_update.nodes[0].role = ax::mojom::Role::kGroup;
+ third_tree_update.nodes[0].child_ids = {2, 3};
+ third_tree_update.nodes[1].id = 2;
+ third_tree_update.nodes[1].role = ax::mojom::Role::kListItem;
+ third_tree_update.nodes[2].id = 3;
+ third_tree_update.nodes[2].role = ax::mojom::Role::kListItem;
+ AXTree third_tree(third_tree_update);
+
+ // Ensure that groups can't also stand alone.
+ AXNode* last_group = third_tree.GetFromId(1);
+ EXPECT_OPTIONAL_EQ(2, last_group->GetSetSize());
+ AXNode* list_item1 = third_tree.GetFromId(2);
+ EXPECT_OPTIONAL_EQ(1, list_item1->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(2, list_item1->GetSetSize());
+ AXNode* list_item2 = third_tree.GetFromId(3);
+ EXPECT_OPTIONAL_EQ(2, list_item2->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(2, list_item2->GetSetSize());
+
+ // Test nested groups.
+ AXTreeUpdate last_tree_update;
+ last_tree_update.root_id = 1;
+ last_tree_update.nodes.resize(6);
+ last_tree_update.nodes[0].id = 1;
+ last_tree_update.nodes[0].role = ax::mojom::Role::kMenuBar;
+ last_tree_update.nodes[0].child_ids = {2};
+ last_tree_update.nodes[1].id = 2;
+ last_tree_update.nodes[1].role = ax::mojom::Role::kGroup;
+ last_tree_update.nodes[1].child_ids = {3, 4};
+ last_tree_update.nodes[2].id = 3;
+ last_tree_update.nodes[2].role = ax::mojom::Role::kMenuItemCheckBox;
+ last_tree_update.nodes[3].id = 4;
+ last_tree_update.nodes[3].role = ax::mojom::Role::kGroup;
+ last_tree_update.nodes[3].child_ids = {5, 6};
+ last_tree_update.nodes[4].id = 5;
+ last_tree_update.nodes[4].role = ax::mojom::Role::kMenuItemCheckBox;
+ last_tree_update.nodes[5].id = 6;
+ last_tree_update.nodes[5].role = ax::mojom::Role::kMenuItemCheckBox;
+ AXTree last_tree(last_tree_update);
+
+ AXNode* checkbox1 = last_tree.GetFromId(3);
+ EXPECT_OPTIONAL_EQ(1, checkbox1->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(3, checkbox1->GetSetSize());
+ AXNode* checkbox2 = last_tree.GetFromId(5);
+ EXPECT_OPTIONAL_EQ(2, checkbox2->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(3, checkbox2->GetSetSize());
+ AXNode* checkbox3 = last_tree.GetFromId(6);
+ EXPECT_OPTIONAL_EQ(3, checkbox3->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(3, checkbox3->GetSetSize());
+ AXNode* menu_bar = last_tree.GetFromId(1);
+ EXPECT_OPTIONAL_EQ(3, menu_bar->GetSetSize());
+ AXNode* outer_group = last_tree.GetFromId(2);
+ EXPECT_FALSE(outer_group->GetSetSize());
+ AXNode* inner_group = last_tree.GetFromId(4);
+ EXPECT_FALSE(inner_group->GetSetSize());
+}
+
+TEST(AXTreeTest, SetSizePosInSetHidden) {
+ AXTreeUpdate tree_update;
+ tree_update.root_id = 1;
+ tree_update.nodes.resize(6);
+ tree_update.nodes[0].id = 1;
+ tree_update.nodes[0].role = ax::mojom::Role::kListBox; // SetSize = 4
+ tree_update.nodes[0].child_ids = {2, 3, 4, 5, 6};
+ tree_update.nodes[1].id = 2;
+ tree_update.nodes[1].role = ax::mojom::Role::kListBoxOption; // 1 of 4
+ tree_update.nodes[2].id = 3;
+ tree_update.nodes[2].role = ax::mojom::Role::kListBoxOption; // 2 of 4
+ tree_update.nodes[3].id = 4;
+ tree_update.nodes[3].role = ax::mojom::Role::kListBoxOption; // Hidden
+ tree_update.nodes[3].AddState(ax::mojom::State::kInvisible);
+ tree_update.nodes[4].id = 5;
+ tree_update.nodes[4].role = ax::mojom::Role::kListBoxOption; // 3 of 4
+ tree_update.nodes[5].id = 6;
+ tree_update.nodes[5].role = ax::mojom::Role::kListBoxOption; // 4 of 4
+ AXTree tree(tree_update);
+
+ AXNode* list_box = tree.GetFromId(1);
+ EXPECT_OPTIONAL_EQ(4, list_box->GetSetSize());
+ AXNode* option1 = tree.GetFromId(2);
+ EXPECT_OPTIONAL_EQ(1, option1->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(4, option1->GetSetSize());
+ AXNode* option2 = tree.GetFromId(3);
+ EXPECT_OPTIONAL_EQ(2, option2->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(4, option2->GetSetSize());
+ AXNode* option_hidden = tree.GetFromId(4);
+ EXPECT_FALSE(option_hidden->GetPosInSet());
+ EXPECT_FALSE(option_hidden->GetSetSize());
+ AXNode* option3 = tree.GetFromId(5);
+ EXPECT_OPTIONAL_EQ(3, option3->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(4, option3->GetSetSize());
+ AXNode* option4 = tree.GetFromId(6);
+ EXPECT_OPTIONAL_EQ(4, option4->GetPosInSet());
+ EXPECT_OPTIONAL_EQ(4, option4->GetSetSize());
}
TEST(AXTreeTest, OnNodeWillBeDeletedHasValidUnignoredParent) {
diff --git a/chromium/ui/accessibility/ax_tree_update.h b/chromium/ui/accessibility/ax_tree_update.h
index 5225cdefb87..a27fc3b2377 100644
--- a/chromium/ui/accessibility/ax_tree_update.h
+++ b/chromium/ui/accessibility/ax_tree_update.h
@@ -13,7 +13,9 @@
#include <vector>
#include "base/strings/string_number_conversions.h"
+#include "ui/accessibility/ax_enum_util.h"
#include "ui/accessibility/ax_enums.mojom.h"
+#include "ui/accessibility/ax_event_intent.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/accessibility/ax_tree_data.h"
@@ -72,9 +74,12 @@ template<typename AXNodeData, typename AXTreeData> struct AXTreeUpdateBase {
// A vector of nodes to update, according to the rules above.
std::vector<AXNodeData> nodes;
- // The source of the event.
+ // The source of the event which generated this tree update.
ax::mojom::EventFrom event_from = ax::mojom::EventFrom::kNone;
+ // The event intents associated with this tree update.
+ std::vector<AXEventIntent> event_intents;
+
// Return a multi-line indented string representation, for logging.
std::string ToString() const;
@@ -100,6 +105,16 @@ std::string AXTreeUpdateBase<AXNodeData, AXTreeData>::ToString() const {
result += "AXTreeUpdate: root id " + base::NumberToString(root_id) + "\n";
}
+ if (event_from != ax::mojom::EventFrom::kNone)
+ result += "event_from=" + std::string(ui::ToString(event_from)) + "\n";
+
+ if (!event_intents.empty()) {
+ result += "event_intents=[\n";
+ for (const auto& event_intent : event_intents)
+ result += " " + event_intent.ToString() + "\n";
+ result += "]\n";
+ }
+
// The challenge here is that we want to indent the nodes being updated
// so that parent/child relationships are clear, but we don't have access
// to the rest of the tree for context, so we have to try to show the
diff --git a/chromium/ui/accessibility/extensions/chromevoxclassic/BUILD.gn b/chromium/ui/accessibility/extensions/chromevoxclassic/BUILD.gn
index a2f3cec09e6..dfecb666555 100644
--- a/chromium/ui/accessibility/extensions/chromevoxclassic/BUILD.gn
+++ b/chromium/ui/accessibility/extensions/chromevoxclassic/BUILD.gn
@@ -4,7 +4,7 @@
import("//build/config/features.gni")
import(
- "//chrome/browser/resources/chromeos/accessibility/chromevox/run_jsbundler.gni")
+ "//chrome/browser/resources/chromeos/accessibility/common/run_jsbundler.gni")
import(
"//chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings.gni")
import("//chrome/common/features.gni")
@@ -586,8 +586,8 @@ js2gtest("chromevox_unitjs_tests") {
"walkers/word_walker_test.unitjs",
]
gen_include_files = [
- "//chrome/browser/resources/chromeos/accessibility/chromevox/testing/assert_additions.js",
- "//chrome/browser/resources/chromeos/accessibility/chromevox/testing/callback_helper.js",
+ "//chrome/browser/resources/chromeos/accessibility/common/testing/assert_additions.js",
+ "//chrome/browser/resources/chromeos/accessibility/common/testing/callback_helper.js",
"//ui/accessibility/extensions/chromevoxclassic/testing/chromevox_unittest_base.js",
]
diff --git a/chromium/ui/accessibility/extensions/chromevoxclassic/testing/chromevox_unittest_base.js b/chromium/ui/accessibility/extensions/chromevoxclassic/testing/chromevox_unittest_base.js
index 29e01eb3824..01fcc5b6bdb 100644
--- a/chromium/ui/accessibility/extensions/chromevoxclassic/testing/chromevox_unittest_base.js
+++ b/chromium/ui/accessibility/extensions/chromevoxclassic/testing/chromevox_unittest_base.js
@@ -3,11 +3,14 @@
// found in the LICENSE file.
GEN_INCLUDE([
- '//chrome/browser/resources/chromeos/accessibility/chromevox/testing/assert_additions.js'
+ '//chrome/browser/resources/chromeos/accessibility/common/testing/' +
+ 'assert_additions.js'
]);
GEN_INCLUDE([
- '//chrome/browser/resources/chromeos/accessibility/chromevox/testing/common.js',
- '//chrome/browser/resources/chromeos/accessibility/chromevox/testing/callback_helper.js'
+ '//chrome/browser/resources/chromeos/accessibility/chromevox/testing/' +
+ 'common.js',
+ '//chrome/browser/resources/chromeos/accessibility/common/testing/' +
+ 'callback_helper.js'
]);
/**
diff --git a/chromium/ui/accessibility/mojom/ax_tree_update.mojom b/chromium/ui/accessibility/mojom/ax_tree_update.mojom
index 495f88158ea..957edd556c0 100644
--- a/chromium/ui/accessibility/mojom/ax_tree_update.mojom
+++ b/chromium/ui/accessibility/mojom/ax_tree_update.mojom
@@ -5,6 +5,7 @@
module ax.mojom;
import "ui/accessibility/ax_enums.mojom";
+import "ui/accessibility/mojom/ax_event_intent.mojom";
import "ui/accessibility/mojom/ax_node_data.mojom";
import "ui/accessibility/mojom/ax_tree_data.mojom";
@@ -16,4 +17,5 @@ struct AXTreeUpdate {
int32 root_id;
array<AXNodeData> nodes;
ax.mojom.EventFrom event_from;
+ array<EventIntent> event_intents;
};
diff --git a/chromium/ui/accessibility/mojom/ax_tree_update_mojom_traits.cc b/chromium/ui/accessibility/mojom/ax_tree_update_mojom_traits.cc
index 159aa36b138..e429ce978d3 100644
--- a/chromium/ui/accessibility/mojom/ax_tree_update_mojom_traits.cc
+++ b/chromium/ui/accessibility/mojom/ax_tree_update_mojom_traits.cc
@@ -18,7 +18,7 @@ bool StructTraits<ax::mojom::AXTreeUpdateDataView, ui::AXTreeUpdate>::Read(
if (!data.ReadNodes(&out->nodes))
return false;
out->event_from = data.event_from();
- return true;
+ return data.ReadEventIntents(&out->event_intents);
}
} // namespace mojo
diff --git a/chromium/ui/accessibility/mojom/ax_tree_update_mojom_traits.h b/chromium/ui/accessibility/mojom/ax_tree_update_mojom_traits.h
index 18a8bb8af1e..480c07aca8f 100644
--- a/chromium/ui/accessibility/mojom/ax_tree_update_mojom_traits.h
+++ b/chromium/ui/accessibility/mojom/ax_tree_update_mojom_traits.h
@@ -5,7 +5,10 @@
#ifndef UI_ACCESSIBILITY_MOJOM_AX_TREE_UPDATE_MOJOM_TRAITS_H_
#define UI_ACCESSIBILITY_MOJOM_AX_TREE_UPDATE_MOJOM_TRAITS_H_
+#include "ui/accessibility/ax_event_intent.h"
#include "ui/accessibility/ax_tree_update.h"
+#include "ui/accessibility/mojom/ax_event_intent.mojom.h"
+#include "ui/accessibility/mojom/ax_event_intent_mojom_traits.h"
#include "ui/accessibility/mojom/ax_node_data_mojom_traits.h"
#include "ui/accessibility/mojom/ax_tree_data_mojom_traits.h"
#include "ui/accessibility/mojom/ax_tree_update.mojom-shared.h"
@@ -30,6 +33,10 @@ struct StructTraits<ax::mojom::AXTreeUpdateDataView, ui::AXTreeUpdate> {
static ax::mojom::EventFrom event_from(const ui::AXTreeUpdate& p) {
return p.event_from;
}
+ static std::vector<ui::AXEventIntent> event_intents(
+ const ui::AXTreeUpdate& p) {
+ return p.event_intents;
+ }
static bool Read(ax::mojom::AXTreeUpdateDataView data, ui::AXTreeUpdate* out);
};
diff --git a/chromium/ui/accessibility/platform/BUILD.gn b/chromium/ui/accessibility/platform/BUILD.gn
new file mode 100644
index 00000000000..691a701457d
--- /dev/null
+++ b/chromium/ui/accessibility/platform/BUILD.gn
@@ -0,0 +1,142 @@
+# 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/features.gni")
+import("//build/config/jumbo.gni")
+import("//build/config/linux/pkg_config.gni")
+import("//build/config/ui.gni")
+import("//mojo/public/tools/bindings/mojom.gni")
+import("//testing/libfuzzer/fuzzer_test.gni")
+import("//testing/test.gni")
+import("//tools/json_schema_compiler/json_schema_api.gni")
+import("//ui/base/ui_features.gni")
+
+if (is_win) {
+ import("//build/toolchain/win/midl.gni")
+}
+
+if (is_win) {
+ midl("ichromeaccessible") {
+ sources = [ "ichromeaccessible.idl" ]
+ }
+}
+
+if (is_android) {
+ import("//build/config/android/rules.gni")
+}
+
+source_set("platform") {
+ defines = [ "AX_IMPLEMENTATION" ]
+
+ visibility = [ "//ui/accessibility" ]
+
+ sources = [
+ # Used by by browser_accessibility_state_impl.cc.
+ "ax_platform_node.cc",
+ "ax_platform_node.h",
+ "ax_platform_node_delegate.h",
+
+ # Used by browser_accessibility.cc.
+ "ax_unique_id.cc",
+ "ax_unique_id.h",
+
+ # Used by accessibility_tree_formatter_blink.cc.
+ "compute_attributes.cc",
+ "compute_attributes.h",
+
+ # Used by //ui/accessibility:ax_assistant.
+ "ax_android_constants.cc",
+ "ax_android_constants.h",
+
+ # Used by //ui/views/views/ax_virtual_view.h.
+ "ax_platform_node_base.cc",
+ "ax_platform_node_base.h",
+ "ax_platform_node_delegate_base.cc",
+ "ax_platform_node_delegate_base.h",
+
+ # Used by //chrome/test/browser_tests/browser_view_browsertest.cc
+ "ax_platform_node_test_helper.cc",
+ "ax_platform_node_test_helper.h",
+ ]
+
+ public_deps = [
+ "//ui/accessibility:ax_base",
+ "//ui/display",
+ ]
+
+ if (has_native_accessibility) {
+ sources += [
+ "ax_fragment_root_delegate_win.h",
+ "ax_fragment_root_win.cc",
+ "ax_fragment_root_win.h",
+ "ax_platform_node_delegate_utils_win.cc",
+ "ax_platform_node_delegate_utils_win.h",
+ "ax_platform_node_textchildprovider_win.cc",
+ "ax_platform_node_textchildprovider_win.h",
+ "ax_platform_node_textprovider_win.cc",
+ "ax_platform_node_textprovider_win.h",
+ "ax_platform_node_textrangeprovider_win.cc",
+ "ax_platform_node_textrangeprovider_win.h",
+ "ax_platform_node_win.cc",
+ "ax_platform_node_win.h",
+ "ax_platform_relation_win.cc",
+ "ax_platform_relation_win.h",
+ "ax_platform_text_boundary.cc",
+ "ax_platform_text_boundary.h",
+ "ax_system_caret_win.cc",
+ "ax_system_caret_win.h",
+ "uia_registrar_win.cc",
+ "uia_registrar_win.h",
+ ]
+
+ if (is_win) {
+ public_deps += [
+ "//third_party/iaccessible2",
+ "//ui/accessibility/platform:ichromeaccessible",
+ ]
+
+ libs = [
+ "oleacc.lib",
+ "uiautomationcore.lib",
+ ]
+ }
+
+ if (is_mac) {
+ sources += [
+ "ax_platform_node_mac.h",
+ "ax_platform_node_mac.mm",
+ ]
+
+ libs = [
+ "AppKit.framework",
+ "Foundation.framework",
+ ]
+ }
+
+ if (use_atk) {
+ sources += [
+ "atk_util_auralinux.cc",
+ "atk_util_auralinux.h",
+ "atk_util_auralinux_gtk.cc",
+ "ax_platform_atk_hyperlink.cc",
+ "ax_platform_atk_hyperlink.h",
+ "ax_platform_node_auralinux.cc",
+ "ax_platform_node_auralinux.h",
+ ]
+
+ # ax_platform_text_boundary.h includes atk.h, so ATK is needed
+ # as a public config to ensure anything that includes this is
+ # able to find atk.h.
+ public_configs = [ "//build/config/linux/atk" ]
+
+ if (use_glib) {
+ configs += [ "//build/config/linux:glib" ]
+ }
+
+ if (use_x11) {
+ public_deps += [ "//ui/gfx/x" ]
+ }
+ }
+ }
+}
diff --git a/chromium/ui/accessibility/platform/ax_fragment_root_win.cc b/chromium/ui/accessibility/platform/ax_fragment_root_win.cc
index f1925832840..163fb8446dd 100644
--- a/chromium/ui/accessibility/platform/ax_fragment_root_win.cc
+++ b/chromium/ui/accessibility/platform/ax_fragment_root_win.cc
@@ -7,17 +7,21 @@
#include <unordered_map>
#include "base/no_destructor.h"
+#include "base/strings/string_number_conversions.h"
#include "ui/accessibility/platform/ax_fragment_root_delegate_win.h"
#include "ui/accessibility/platform/ax_platform_node_win.h"
+#include "ui/accessibility/platform/uia_registrar_win.h"
#include "ui/base/win/atl_module.h"
namespace ui {
class AXFragmentRootPlatformNodeWin : public AXPlatformNodeWin,
+ public IItemContainerProvider,
public IRawElementProviderFragmentRoot,
public IRawElementProviderAdviseEvents {
public:
BEGIN_COM_MAP(AXFragmentRootPlatformNodeWin)
+ COM_INTERFACE_ENTRY(IItemContainerProvider)
COM_INTERFACE_ENTRY(IRawElementProviderFragmentRoot)
COM_INTERFACE_ENTRY(IRawElementProviderAdviseEvents)
COM_INTERFACE_ENTRY_CHAIN(AXPlatformNodeWin)
@@ -38,19 +42,76 @@ class AXFragmentRootPlatformNodeWin : public AXPlatformNodeWin,
}
//
+ // IItemContainerProvider methods.
+ //
+ IFACEMETHODIMP FindItemByProperty(
+ IRawElementProviderSimple* start_after_element,
+ PROPERTYID property_id,
+ VARIANT value,
+ IRawElementProviderSimple** result) override {
+ WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ITEMCONTAINER_FINDITEMBYPROPERTY);
+ UIA_VALIDATE_CALL_1_ARG(result);
+ *result = nullptr;
+
+ // We currently only support the custom UIA property ID for unique id and we
+ // ignore |start_after_element|.
+ if (property_id ==
+ UiaRegistrarWin::GetInstance().GetUiaUniqueIdPropertyId() &&
+ value.vt == VT_BSTR) {
+ // TODO: We should support the case when |start_after_element| isn't
+ // nullptr for unique id (https://crbug.com/1098160).
+ if (start_after_element)
+ return E_INVALIDARG;
+
+ int32_t ax_unique_id;
+ if (!base::StringToInt(value.bstrVal, &ax_unique_id))
+ return S_OK;
+
+ // In the Windows accessibility platform implementation, id 0 represents
+ // self; a positive id represents the immediate descendants; and a
+ // negative id represents a unique id that can be mapped to any node.
+ if (AXPlatformNodeWin* node_win =
+ static_cast<AXPlatformNodeWin*>(GetFromUniqueId(-ax_unique_id))) {
+ node_win->QueryInterface(IID_PPV_ARGS(result));
+ }
+
+ return S_OK;
+ }
+
+ return E_INVALIDARG;
+ }
+
+ //
// IRawElementProviderSimple methods.
//
IFACEMETHODIMP get_HostRawElementProvider(
IRawElementProviderSimple** host_element_provider) override {
+ WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_HOST_RAW_ELEMENT_PROVIDER);
UIA_VALIDATE_CALL_1_ARG(host_element_provider);
HWND hwnd = GetDelegate()->GetTargetForNativeAccessibilityEvent();
return UiaHostProviderFromHwnd(hwnd, host_element_provider);
}
+ IFACEMETHODIMP GetPatternProvider(PATTERNID pattern_id,
+ IUnknown** result) override {
+ WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_PATTERN_PROVIDER);
+ UIA_VALIDATE_CALL_1_ARG(result);
+ *result = nullptr;
+
+ if (pattern_id == UIA_ItemContainerPatternId) {
+ AddRef();
+ *result = static_cast<IItemContainerProvider*>(this);
+ return S_OK;
+ }
+
+ return AXPlatformNodeWin::GetPatternProviderImpl(pattern_id, result);
+ }
+
IFACEMETHODIMP GetPropertyValue(PROPERTYID property_id,
VARIANT* result) override {
+ WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_PROPERTY_VALUE);
UIA_VALIDATE_CALL_1_ARG(result);
switch (property_id) {
@@ -84,6 +145,7 @@ class AXFragmentRootPlatformNodeWin : public AXPlatformNodeWin,
IFACEMETHODIMP get_FragmentRoot(
IRawElementProviderFragmentRoot** fragment_root) override {
+ WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_FRAGMENTROOT);
UIA_VALIDATE_CALL_1_ARG(fragment_root);
QueryInterface(IID_PPV_ARGS(fragment_root));
@@ -97,6 +159,7 @@ class AXFragmentRootPlatformNodeWin : public AXPlatformNodeWin,
double screen_physical_pixel_x,
double screen_physical_pixel_y,
IRawElementProviderFragment** element_provider) override {
+ WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ELEMENT_PROVIDER_FROM_POINT);
UIA_VALIDATE_CALL_1_ARG(element_provider);
*element_provider = nullptr;
@@ -124,6 +187,7 @@ class AXFragmentRootPlatformNodeWin : public AXPlatformNodeWin,
}
IFACEMETHODIMP GetFocus(IRawElementProviderFragment** focus) override {
+ WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_FOCUS);
UIA_VALIDATE_CALL_1_ARG(focus);
*focus = nullptr;
@@ -157,6 +221,7 @@ class AXFragmentRootPlatformNodeWin : public AXPlatformNodeWin,
//
IFACEMETHODIMP AdviseEventAdded(EVENTID event_id,
SAFEARRAY* property_ids) override {
+ WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ADVISE_EVENT_ADDED);
if (event_id == UIA_LiveRegionChangedEventId) {
live_region_change_listeners_++;
@@ -179,6 +244,7 @@ class AXFragmentRootPlatformNodeWin : public AXPlatformNodeWin,
IFACEMETHODIMP AdviseEventRemoved(EVENTID event_id,
SAFEARRAY* property_ids) override {
+ WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ADVISE_EVENT_REMOVED);
if (event_id == UIA_LiveRegionChangedEventId) {
DCHECK(live_region_change_listeners_ > 0);
live_region_change_listeners_--;
diff --git a/chromium/ui/accessibility/platform/ax_fragment_root_win_unittest.cc b/chromium/ui/accessibility/platform/ax_fragment_root_win_unittest.cc
index 7691d12cece..e26ad0446c1 100644
--- a/chromium/ui/accessibility/platform/ax_fragment_root_win_unittest.cc
+++ b/chromium/ui/accessibility/platform/ax_fragment_root_win_unittest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "ui/accessibility/platform/ax_fragment_root_win.h"
+#include "ui/accessibility/accessibility_switches.h"
#include "ui/accessibility/platform/ax_platform_node_win.h"
#include "ui/accessibility/platform/ax_platform_node_win_unittest.h"
#include "ui/accessibility/platform/test_ax_node_wrapper.h"
@@ -14,11 +15,26 @@
#include "base/win/scoped_safearray.h"
#include "base/win/scoped_variant.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/accessibility/platform/uia_registrar_win.h"
+using base::win::ScopedVariant;
using Microsoft::WRL::ComPtr;
namespace ui {
+#define EXPECT_UIA_BSTR_EQ(node, property_id, expected) \
+ { \
+ ScopedVariant expectedVariant(expected); \
+ ASSERT_EQ(VT_BSTR, expectedVariant.type()); \
+ ASSERT_NE(nullptr, expectedVariant.ptr()->bstrVal); \
+ ScopedVariant actual; \
+ ASSERT_HRESULT_SUCCEEDED( \
+ node->GetPropertyValue(property_id, actual.Receive())); \
+ ASSERT_EQ(VT_BSTR, actual.type()); \
+ ASSERT_NE(nullptr, actual.ptr()->bstrVal); \
+ EXPECT_STREQ(expectedVariant.ptr()->bstrVal, actual.ptr()->bstrVal); \
+ }
+
class AXFragmentRootTest : public AXPlatformNodeWinTest {
public:
AXFragmentRootTest() = default;
@@ -27,6 +43,92 @@ class AXFragmentRootTest : public AXPlatformNodeWinTest {
AXFragmentRootTest& operator=(const AXFragmentRootTest&) = delete;
};
+TEST_F(AXFragmentRootTest, UIAFindItemByProperty) {
+ AXNodeData root;
+ root.id = 1;
+ root.role = ax::mojom::Role::kRootWebArea;
+ root.SetName("root");
+ root.child_ids = {2, 3};
+
+ AXNodeData text1;
+ text1.id = 2;
+ text1.role = ax::mojom::Role::kStaticText;
+ text1.SetName("text1");
+
+ AXNodeData button;
+ button.id = 3;
+ button.role = ax::mojom::Role::kButton;
+ button.SetName("button");
+ button.child_ids = {4};
+
+ AXNodeData text2;
+ text2.id = 4;
+ text2.role = ax::mojom::Role::kStaticText;
+ text2.SetName("text2");
+
+ Init(root, text1, button, text2);
+ InitFragmentRoot();
+
+ ComPtr<IRawElementProviderSimple> raw_element_provider_simple;
+ ax_fragment_root_->GetNativeViewAccessible()->QueryInterface(
+ IID_PPV_ARGS(&raw_element_provider_simple));
+
+ ComPtr<IItemContainerProvider> item_container_provider;
+ EXPECT_HRESULT_SUCCEEDED(raw_element_provider_simple->GetPatternProvider(
+ UIA_ItemContainerPatternId, &item_container_provider));
+ ASSERT_NE(nullptr, item_container_provider.Get());
+
+ // Fetch the AxUniqueId of "root", and verify we can retrieve its
+ // corresponding IRawElementProviderSimple through FindItemByProperty().
+ ScopedVariant unique_id_variant;
+ int32_t unique_id = AXPlatformNodeFromNode(GetRootAsAXNode())->GetUniqueId();
+ unique_id_variant.Set(
+ SysAllocString(base::NumberToString16(-unique_id).c_str()));
+ ComPtr<IRawElementProviderSimple> result;
+ EXPECT_HRESULT_SUCCEEDED(item_container_provider->FindItemByProperty(
+ nullptr, UiaRegistrarWin::GetInstance().GetUiaUniqueIdPropertyId(),
+ unique_id_variant, &result));
+ EXPECT_UIA_BSTR_EQ(result, UIA_NamePropertyId, L"root");
+ result.Reset();
+ unique_id_variant.Release();
+
+ // Fetch the AxUniqueId of "text1", and verify we can retrieve its
+ // corresponding IRawElementProviderSimple through FindItemByProperty().
+ unique_id =
+ AXPlatformNodeFromNode(GetRootAsAXNode()->children()[0])->GetUniqueId();
+ unique_id_variant.Set(
+ SysAllocString(base::NumberToString16(-unique_id).c_str()));
+ EXPECT_HRESULT_SUCCEEDED(item_container_provider->FindItemByProperty(
+ nullptr, UiaRegistrarWin::GetInstance().GetUiaUniqueIdPropertyId(),
+ unique_id_variant, &result));
+ EXPECT_UIA_BSTR_EQ(result, UIA_NamePropertyId, L"text1");
+ result.Reset();
+ unique_id_variant.Release();
+
+ // Fetch the AxUniqueId of "button", and verify we can retrieve its
+ // corresponding IRawElementProviderSimple through FindItemByProperty().
+ AXNode* button_node = GetRootAsAXNode()->children()[1];
+ unique_id = AXPlatformNodeFromNode(button_node)->GetUniqueId();
+ unique_id_variant.Set(
+ SysAllocString(base::NumberToString16(-unique_id).c_str()));
+ EXPECT_HRESULT_SUCCEEDED(item_container_provider->FindItemByProperty(
+ nullptr, UiaRegistrarWin::GetInstance().GetUiaUniqueIdPropertyId(),
+ unique_id_variant, &result));
+ EXPECT_UIA_BSTR_EQ(result, UIA_NamePropertyId, L"button");
+ result.Reset();
+ unique_id_variant.Release();
+
+ // Fetch the AxUniqueId of "text2", and verify we can retrieve its
+ // corresponding IRawElementProviderSimple through FindItemByProperty().
+ unique_id = AXPlatformNodeFromNode(button_node->children()[0])->GetUniqueId();
+ unique_id_variant.Set(
+ SysAllocString(base::NumberToString16(-unique_id).c_str()));
+ EXPECT_HRESULT_SUCCEEDED(item_container_provider->FindItemByProperty(
+ nullptr, UiaRegistrarWin::GetInstance().GetUiaUniqueIdPropertyId(),
+ unique_id_variant, &result));
+ EXPECT_UIA_BSTR_EQ(result, UIA_NamePropertyId, L"text2");
+}
+
TEST_F(AXFragmentRootTest, TestUIAGetFragmentRoot) {
AXNodeData root;
Init(root);
@@ -227,7 +329,7 @@ TEST_F(AXFragmentRootTest, TestGetPropertyValue) {
// IsControlElement and IsContentElement should follow the setting on the
// fragment root delegate.
test_fragment_root_delegate_->is_control_element_ = true;
- base::win::ScopedVariant result;
+ ScopedVariant result;
EXPECT_HRESULT_SUCCEEDED(root_provider->GetPropertyValue(
UIA_IsControlElementPropertyId, result.Receive()));
EXPECT_EQ(result.type(), VT_BOOL);
diff --git a/chromium/ui/accessibility/platform/ax_platform_node.h b/chromium/ui/accessibility/platform/ax_platform_node.h
index c5198fc792e..9621fcb9a5c 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node.h
@@ -92,7 +92,7 @@ class AX_EXPORT AXPlatformNode {
// Return true if this object is equal to or a descendant of |ancestor|.
virtual bool IsDescendantOf(AXPlatformNode* ancestor) const = 0;
- // Return the unique ID
+ // Return the unique ID.
int32_t GetUniqueId() const;
// Creates a string representation of this node's data.
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_auralinux.cc b/chromium/ui/accessibility/platform/ax_platform_node_auralinux.cc
index 89309020096..a4554aaac25 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_auralinux.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -17,6 +17,7 @@
#include "base/command_line.h"
#include "base/compiler_specific.h"
#include "base/debug/leak_annotations.h"
+#include "base/metrics/histogram_macros.h"
#include "base/no_destructor.h"
#include "base/numerics/ranges.h"
#include "base/optional.h"
@@ -73,6 +74,29 @@ namespace ui {
namespace {
+// IMPORTANT!
+// These values are written to logs. Do not renumber or delete
+// existing items; add new entries to the end of the list.
+enum class UmaAtkApi {
+ kGetName = 0,
+ kGetDescription = 1,
+ kGetNChildren = 2,
+ kRefChild = 3,
+ kGetIndexInParent = 4,
+ kGetParent = 5,
+ kRefRelationSet = 6,
+ kGetAttributes = 7,
+ kGetRole = 8,
+ kRefStateSet = 9,
+ // This must always be the last enum. It's okay for its value to
+ // increase, but none of the other enum values may change.
+ kMaxValue = kRefStateSet,
+};
+
+void RecordAccessibilityAtkApi(UmaAtkApi enum_value) {
+ UMA_HISTOGRAM_ENUMERATION("Accessibility.ATK-APIs", enum_value);
+}
+
// When accepting input from clients calling the API, an ATK character offset
// of -1 can often represent the length of the string.
static const int kStringLengthOffset = -1;
@@ -186,13 +210,17 @@ void SetIntPointerValueIfNotNull(int* pointer, int value) {
*pointer = value;
}
+#if defined(ATK_230)
bool SupportsAtkComponentScrollingInterface() {
return dlsym(RTLD_DEFAULT, "atk_component_scroll_to_point");
}
+#endif
+#if defined(ATK_232)
bool SupportsAtkTextScrollingInterface() {
return dlsym(RTLD_DEFAULT, "atk_text_scroll_substring_to_point");
}
+#endif
AtkObject* FindAtkObjectParentFrame(AtkObject* atk_object) {
AXPlatformNodeAuraLinux* node =
@@ -1246,6 +1274,7 @@ char* GetStringAtOffset(AtkText* atk_text,
}
#endif
+#if defined(ATK_230)
gfx::Rect GetUnclippedParentHypertextRangeBoundsRect(
AXPlatformNodeDelegate* ax_platform_node_delegate,
const int start_offset,
@@ -1269,6 +1298,7 @@ gfx::Rect GetUnclippedParentHypertextRangeBoundsRect(
AXClippingBehavior::kClipped)
.OffsetFromOrigin();
}
+#endif
void GetCharacterExtents(AtkText* atk_text,
int offset,
@@ -2028,6 +2058,7 @@ const gchar* GetName(AtkObject* atk_object) {
}
const gchar* AtkGetName(AtkObject* atk_object) {
+ RecordAccessibilityAtkApi(UmaAtkApi::kGetName);
AXPlatformNodeAuraLinux::EnableAXMode();
return GetName(atk_object);
}
@@ -2045,6 +2076,7 @@ const gchar* GetDescription(AtkObject* atk_object) {
}
const gchar* AtkGetDescription(AtkObject* atk_object) {
+ RecordAccessibilityAtkApi(UmaAtkApi::kGetDescription);
AXPlatformNodeAuraLinux::EnableAXMode();
return GetDescription(atk_object);
}
@@ -2061,6 +2093,7 @@ gint GetNChildren(AtkObject* atk_object) {
}
gint AtkGetNChildren(AtkObject* atk_object) {
+ RecordAccessibilityAtkApi(UmaAtkApi::kGetNChildren);
AXPlatformNodeAuraLinux::EnableAXMode();
return GetNChildren(atk_object);
}
@@ -2083,6 +2116,7 @@ AtkObject* RefChild(AtkObject* atk_object, gint index) {
}
AtkObject* AtkRefChild(AtkObject* atk_object, gint index) {
+ RecordAccessibilityAtkApi(UmaAtkApi::kRefChild);
AXPlatformNodeAuraLinux::EnableAXMode();
return RefChild(atk_object, index);
}
@@ -2099,6 +2133,7 @@ gint GetIndexInParent(AtkObject* atk_object) {
}
gint AtkGetIndexInParent(AtkObject* atk_object) {
+ RecordAccessibilityAtkApi(UmaAtkApi::kGetIndexInParent);
AXPlatformNodeAuraLinux::EnableAXMode();
return GetIndexInParent(atk_object);
}
@@ -2115,6 +2150,7 @@ AtkObject* GetParent(AtkObject* atk_object) {
}
AtkObject* AtkGetParent(AtkObject* atk_object) {
+ RecordAccessibilityAtkApi(UmaAtkApi::kGetParent);
AXPlatformNodeAuraLinux::EnableAXMode();
return GetParent(atk_object);
}
@@ -2130,6 +2166,7 @@ AtkRelationSet* RefRelationSet(AtkObject* atk_object) {
}
AtkRelationSet* AtkRefRelationSet(AtkObject* atk_object) {
+ RecordAccessibilityAtkApi(UmaAtkApi::kRefRelationSet);
AXPlatformNodeAuraLinux::EnableAXMode();
return RefRelationSet(atk_object);
}
@@ -2146,6 +2183,7 @@ AtkAttributeSet* GetAttributes(AtkObject* atk_object) {
}
AtkAttributeSet* AtkGetAttributes(AtkObject* atk_object) {
+ RecordAccessibilityAtkApi(UmaAtkApi::kGetAttributes);
AXPlatformNodeAuraLinux::EnableAXMode();
return GetAttributes(atk_object);
}
@@ -2161,6 +2199,7 @@ AtkRole GetRole(AtkObject* atk_object) {
}
AtkRole AtkGetRole(AtkObject* atk_object) {
+ RecordAccessibilityAtkApi(UmaAtkApi::kGetRole);
AXPlatformNodeAuraLinux::EnableAXMode();
return GetRole(atk_object);
}
@@ -2183,6 +2222,7 @@ AtkStateSet* RefStateSet(AtkObject* atk_object) {
}
AtkStateSet* AtkRefStateSet(AtkObject* atk_object) {
+ RecordAccessibilityAtkApi(UmaAtkApi::kRefStateSet);
AXPlatformNodeAuraLinux::EnableAXMode();
return RefStateSet(atk_object);
}
@@ -2468,6 +2508,8 @@ AtkObject* AXPlatformNodeAuraLinux::CreateAtkObject() {
if (GetData().role != ax::mojom::Role::kApplication &&
!GetAccessibilityMode().has_mode(AXMode::kNativeAPIs))
return nullptr;
+ if (GetDelegate()->IsChildOfLeaf())
+ return nullptr;
EnsureGTypeInit();
interface_mask_ = GetGTypeInterfaceMask(GetData());
GType type = GetAccessibilityGType();
@@ -3000,10 +3042,8 @@ void AXPlatformNodeAuraLinux::GetAtkState(AtkStateSet* atk_state_set) {
static_cast<int32_t>(ax::mojom::InvalidState::kFalse))
atk_state_set_add_state(atk_state_set, ATK_STATE_INVALID_ENTRY);
#if defined(ATK_216)
- if (data.HasIntAttribute(ax::mojom::IntAttribute::kCheckedState) &&
- data.role != ax::mojom::Role::kToggleButton) {
+ if (IsPlatformCheckable())
atk_state_set_add_state(atk_state_set, ATK_STATE_CHECKABLE);
- }
if (data.HasIntAttribute(ax::mojom::IntAttribute::kHasPopup))
atk_state_set_add_state(atk_state_set, ATK_STATE_HAS_POPUP);
#endif
@@ -3217,6 +3257,13 @@ void AXPlatformNodeAuraLinux::Init(AXPlatformNodeDelegate* delegate) {
GetOrCreateAtkObject();
}
+bool AXPlatformNodeAuraLinux::IsPlatformCheckable() const {
+ if (GetData().role == ax::mojom::Role::kToggleButton)
+ return false;
+
+ return AXPlatformNodeBase::IsPlatformCheckable();
+}
+
void AXPlatformNodeAuraLinux::EnsureAtkObjectIsValid() {
if (atk_object_) {
// If the object's role changes and that causes its
@@ -3343,7 +3390,7 @@ void AXPlatformNodeAuraLinux::OnMenuPopupStart() {
atk_object_notify_state_change(parent_frame, ATK_STATE_ACTIVE, TRUE);
}
-void AXPlatformNodeAuraLinux::OnMenuPopupHide() {
+void AXPlatformNodeAuraLinux::OnMenuPopupEnd() {
AtkObject* atk_object = GetOrCreateAtkObject();
AtkObject* parent_frame = FindAtkObjectParentFrame(atk_object);
if (!parent_frame)
@@ -3354,35 +3401,24 @@ void AXPlatformNodeAuraLinux::OnMenuPopupHide() {
// kMenuPopupHide may be called multiple times for the same menu, so only
// remove it if our parent frame matches the most recently opened menu.
std::vector<AtkObject*>& active_menus = GetActiveMenus();
- if (active_menus.empty())
- return;
-
- // When multiple levels of menu are closed at once, they may be hidden out
- // of order. When this happens, we just remove the open menu from the stack.
- if (active_menus.back() != atk_object) {
- auto it = std::find(active_menus.rbegin(), active_menus.rend(), atk_object);
- if (it != active_menus.rend()) {
- // We used a reverse iterator, so we need to convert it into a normal
- // iterator to use it for std::vector::erase(...).
- auto to_remove = --(it.base());
- active_menus.erase(to_remove);
- }
- return;
- }
+ DCHECK(!active_menus.empty())
+ << "Asymmetrical menupopupend events -- too many";
active_menus.pop_back();
-
- // We exit early if the newly activated menu has the same AtkWindow as the
- // previous one.
AtkObject* new_active_item = ComputeActiveTopLevelFrame();
- if (new_active_item == parent_frame)
- return;
- g_signal_emit_by_name(parent_frame, "deactivate");
- atk_object_notify_state_change(parent_frame, ATK_STATE_ACTIVE, FALSE);
- if (new_active_item) {
- g_signal_emit_by_name(new_active_item, "activate");
- atk_object_notify_state_change(new_active_item, ATK_STATE_ACTIVE, TRUE);
+ if (new_active_item != parent_frame) {
+ // Newly activated menu has the different AtkWindow as the previous one.
+ g_signal_emit_by_name(parent_frame, "deactivate");
+ atk_object_notify_state_change(parent_frame, ATK_STATE_ACTIVE, FALSE);
+ if (new_active_item) {
+ g_signal_emit_by_name(new_active_item, "activate");
+ atk_object_notify_state_change(new_active_item, ATK_STATE_ACTIVE, TRUE);
+ }
}
+
+ // All menus are closed.
+ if (active_menus.empty())
+ OnAllMenusEnded();
}
void AXPlatformNodeAuraLinux::ResendFocusSignalsForCurrentlyFocusedNode() {
@@ -3398,7 +3434,8 @@ void AXPlatformNodeAuraLinux::ResendFocusSignalsForCurrentlyFocusedNode() {
atk_object_notify_state_change(focused_node, ATK_STATE_FOCUSED, true);
}
-void AXPlatformNodeAuraLinux::OnMenuPopupEnd() {
+// All menus have closed.
+void AXPlatformNodeAuraLinux::OnAllMenusEnded() {
if (!GetActiveMenus().empty() && g_active_top_level_frame &&
ComputeActiveTopLevelFrame() != g_active_top_level_frame) {
g_signal_emit_by_name(g_active_top_level_frame, "activate");
@@ -3406,8 +3443,8 @@ void AXPlatformNodeAuraLinux::OnMenuPopupEnd() {
TRUE);
}
- ResendFocusSignalsForCurrentlyFocusedNode();
GetActiveMenus().clear();
+ ResendFocusSignalsForCurrentlyFocusedNode();
}
void AXPlatformNodeAuraLinux::OnWindowActivated() {
@@ -3512,16 +3549,25 @@ void AXPlatformNodeAuraLinux::OnFocused() {
SetActiveViewsDialog();
- if (g_current_focused) {
- g_signal_emit_by_name(g_current_focused, "focus-event", false);
- atk_object_notify_state_change(ATK_OBJECT(g_current_focused),
+ AtkObject* old_effective_focus = g_current_active_descendant
+ ? g_current_active_descendant
+ : g_current_focused;
+ if (old_effective_focus) {
+ g_signal_emit_by_name(old_effective_focus, "focus-event", false);
+ atk_object_notify_state_change(ATK_OBJECT(old_effective_focus),
ATK_STATE_FOCUSED, false);
}
SetWeakGPtrToAtkObject(&g_current_focused, atk_object);
- g_signal_emit_by_name(atk_object, "focus-event", true);
- atk_object_notify_state_change(ATK_OBJECT(atk_object), ATK_STATE_FOCUSED,
- true);
+ AtkObject* descendant = GetActiveDescendantOfCurrentFocused();
+ SetWeakGPtrToAtkObject(&g_current_active_descendant, descendant);
+
+ AtkObject* new_effective_focus = g_current_active_descendant
+ ? g_current_active_descendant
+ : g_current_focused;
+ g_signal_emit_by_name(new_effective_focus, "focus-event", true);
+ atk_object_notify_state_change(ATK_OBJECT(new_effective_focus),
+ ATK_STATE_FOCUSED, true);
}
void AXPlatformNodeAuraLinux::OnSelected() {
@@ -3874,21 +3920,15 @@ void AXPlatformNodeAuraLinux::NotifyAccessibilityEvent(
return;
AXPlatformNodeBase::NotifyAccessibilityEvent(event_type);
switch (event_type) {
- // There are three types of messages that we receive for popup menus. Each
- // time a popup menu is shown, we get a kMenuPopupStart message. This
- // includes if the menu is hidden and then re-shown. When a menu is hidden
- // we receive the kMenuPopupHide message. Finally, when the entire menu is
- // closed we receive the kMenuPopupEnd message for the parent menu and all
- // of the submenus that were opened when navigating through the menu.
- case ax::mojom::Event::kMenuPopupEnd:
- OnMenuPopupEnd();
- break;
- case ax::mojom::Event::kMenuPopupHide:
- OnMenuPopupHide();
- break;
+ // kMenuStart/kMenuEnd: the menu system has started / stopped.
+ // kMenuPopupStart/kMenuPopupEnd: an individual menu/submenu has
+ // opened/closed.
case ax::mojom::Event::kMenuPopupStart:
OnMenuPopupStart();
break;
+ case ax::mojom::Event::kMenuPopupEnd:
+ OnMenuPopupEnd();
+ break;
case ax::mojom::Event::kActiveDescendantChanged:
OnActiveDescendantChanged();
break;
@@ -4176,7 +4216,30 @@ gfx::NativeViewAccessible
AXPlatformNodeAuraLinux::HitTestSync(gint x, gint y, AtkCoordType coord_type) {
gfx::Point scroll_to(x, y);
scroll_to = ConvertPointToScreenCoordinates(scroll_to, coord_type);
- return delegate_->HitTestSync(scroll_to.x(), scroll_to.y());
+
+ AXPlatformNode* current_result = this;
+ while (true) {
+ gfx::NativeViewAccessible hit_child =
+ current_result->GetDelegate()->HitTestSync(scroll_to.x(),
+ scroll_to.y());
+ if (!hit_child)
+ return nullptr;
+ AXPlatformNode* hit_child_node =
+ AXPlatformNode::FromNativeViewAccessible(hit_child);
+ if (!hit_child_node || !hit_child_node->IsDescendantOf(current_result))
+ break;
+
+ // If we get the same node, we're done.
+ if (hit_child_node == current_result)
+ break;
+
+ // Continue to check recursively. That's because HitTestSync may have
+ // returned the best result within a particular accessibility tree,
+ // but we might need to recurse further in a tree of a different type
+ // (for example, from Views to Web).
+ current_result = hit_child_node;
+ }
+ return current_result->GetNativeViewAccessible();
}
bool AXPlatformNodeAuraLinux::GrabFocus() {
@@ -4303,9 +4366,9 @@ AtkAttributeSet* AXPlatformNodeAuraLinux::GetAtkAttributes() {
AtkStateType AXPlatformNodeAuraLinux::GetAtkStateTypeForCheckableNode() {
if (GetData().GetCheckedState() == ax::mojom::CheckedState::kMixed)
return ATK_STATE_INDETERMINATE;
- if (GetData().role == ax::mojom::Role::kToggleButton)
- return ATK_STATE_PRESSED;
- return ATK_STATE_CHECKED;
+ if (IsPlatformCheckable())
+ return ATK_STATE_CHECKED;
+ return ATK_STATE_PRESSED;
}
// AtkDocumentHelpers
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_auralinux.h b/chromium/ui/accessibility/platform/ax_platform_node_auralinux.h
index 6fde338d9e1..610b2041b97 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_auralinux.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_auralinux.h
@@ -206,8 +206,8 @@ class AX_EXPORT AXPlatformNodeAuraLinux : public AXPlatformNodeBase {
void OnWindowActivated();
void OnWindowDeactivated();
void OnMenuPopupStart();
- void OnMenuPopupHide();
void OnMenuPopupEnd();
+ void OnAllMenusEnded();
void OnSelected();
void OnSelectedChildrenChanged();
void OnTextSelectionChanged();
@@ -237,6 +237,7 @@ class AX_EXPORT AXPlatformNodeAuraLinux : public AXPlatformNodeBase {
// AXPlatformNodeBase overrides.
void Init(AXPlatformNodeDelegate* delegate) override;
+ bool IsPlatformCheckable() const override;
bool IsNameExposed();
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 b120f746734..706471c0a84 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc
@@ -201,6 +201,7 @@ static bool AtkObjectHasState(AtkObject* atk_object, AtkStateType state) {
TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkObjectDetachedObject) {
AXNodeData root;
root.id = 1;
+ root.role = ax::mojom::Role::kRootWebArea;
root.SetName("Name");
Init(root);
@@ -231,6 +232,7 @@ TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkObjectDetachedObject) {
TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkObjectName) {
AXNodeData root;
root.id = 1;
+ root.role = ax::mojom::Role::kRootWebArea;
root.SetName("Name");
Init(root);
@@ -659,12 +661,14 @@ TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkComponentRefAtPoint) {
AXNodeData node1;
node1.id = 2;
+ node1.role = ax::mojom::Role::kGenericContainer;
node1.relative_bounds.bounds = gfx::RectF(0, 0, 10, 10);
node1.SetName("Name1");
root.child_ids.push_back(node1.id);
AXNodeData node2;
node2.id = 3;
+ node2.role = ax::mojom::Role::kGenericContainer;
node2.relative_bounds.bounds = gfx::RectF(20, 20, 10, 10);
node2.SetName("Name2");
root.child_ids.push_back(node2.id);
@@ -1820,23 +1824,10 @@ TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkPopupWindowActive) {
{
ActivationTester tester(menu_atk_node);
GetPlatformNode(menu_node)->NotifyAccessibilityEvent(
- ax::mojom::Event::kMenuPopupHide);
- EXPECT_FALSE(tester.saw_activate_);
- EXPECT_TRUE(tester.saw_deactivate_);
- EXPECT_FALSE(tester.IsActivatedInStateSet());
- EXPECT_EQ(focus_events_on_original_node, 0);
- }
-
- {
- ActivationTester tester(menu_atk_node);
- GetPlatformNode(menu_node)->NotifyAccessibilityEvent(
ax::mojom::Event::kMenuPopupEnd);
EXPECT_FALSE(tester.saw_activate_);
- EXPECT_FALSE(tester.saw_deactivate_);
+ EXPECT_TRUE(tester.saw_deactivate_);
EXPECT_FALSE(tester.IsActivatedInStateSet());
-
- // The menu has closed so the original node should have received focus
- // again.
EXPECT_EQ(focus_events_on_original_node, 1);
}
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_base.cc b/chromium/ui/accessibility/platform/ax_platform_node_base.cc
index 99de6603989..36081b70c14 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_base.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_base.cc
@@ -4,6 +4,9 @@
#include "ui/accessibility/platform/ax_platform_node_base.h"
+#include <algorithm>
+#include <limits>
+#include <set>
#include <string>
#include <unordered_map>
#include <utility>
@@ -26,6 +29,7 @@
namespace ui {
namespace {
+
// A function to call when focus changes, for testing only.
base::LazyInstance<std::map<ax::mojom::Event, base::RepeatingClosure>>::
DestructorAtExit g_on_notify_event_for_testing;
@@ -54,6 +58,7 @@ bool FindDescendantRoleWithMaxDepth(AXPlatformNodeBase* node,
return false;
}
+
} // namespace
const base::char16 AXPlatformNodeBase::kEmbeddedCharacter = L'\xfffc';
@@ -139,7 +144,7 @@ gfx::NativeViewAccessible AXPlatformNodeBase::ChildAtIndex(int index) const {
std::string AXPlatformNodeBase::GetName() const {
if (delegate_)
return delegate_->GetName();
- return base::EmptyString();
+ return std::string();
}
base::string16 AXPlatformNodeBase::GetNameAsString16() const {
@@ -495,11 +500,20 @@ bool AXPlatformNodeBase::IsDocument() const {
}
bool AXPlatformNodeBase::IsTextOnlyObject() const {
+ if (!delegate_)
+ return false;
+
+ // In Legacy Layout, a list marker has no children and is thus represented on
+ // all platforms as a leaf node that exposes the marker itself, i.e., it forms
+ // part of the AX tree's text representation. In contrast, in Layout NG, a
+ // list marker has a static text child.
+ if (GetData().role == ax::mojom::Role::kListMarker)
+ return !GetChildCount();
return ui::IsText(GetData().role);
}
bool AXPlatformNodeBase::IsTextField() const {
- return IsPlainTextField() || IsRichTextField();
+ return GetData().IsTextField();
}
bool AXPlatformNodeBase::IsPlainTextField() const {
@@ -507,16 +521,18 @@ bool AXPlatformNodeBase::IsPlainTextField() const {
}
bool AXPlatformNodeBase::IsRichTextField() const {
- return GetBoolAttribute(ax::mojom::BoolAttribute::kEditableRoot) &&
- GetData().HasState(ax::mojom::State::kRichlyEditable);
+ return GetData().IsRichTextField();
}
base::string16 AXPlatformNodeBase::GetHypertext() const {
+ if (!delegate_)
+ return base::string16();
+
// Hypertext of platform leaves, which internally are composite objects, are
// represented with the inner text of the internal composite object. These
// don't exist on non-web content.
if (IsChildOfLeaf())
- return GetDelegate()->GetInnerText();
+ return GetInnerText();
if (hypertext_.needs_update)
UpdateComputedHypertext();
@@ -524,38 +540,9 @@ base::string16 AXPlatformNodeBase::GetHypertext() const {
}
base::string16 AXPlatformNodeBase::GetInnerText() const {
- // In order to get the inner text for web content, we potentially need access
- // to nodes that are not exposed to platform APIs, i.e. they are only visible
- // in the internal accessibility tree. For example, nodes representing the
- // shadow DOM inside a native text field.
- if (GetDelegate()->IsWebContent())
- return GetDelegate()->GetInnerText();
-
- // Allows us to get text even in non-web content, e.g. in the browser's UI
- // (AKA Views).
- //
- // Unlike in web content The "kValue" attribute takes precedence, because the
- // accessibility of Views controls are carefully crafted by hand, in contrast
- // to HTML pages, where any content that might be present in the shadow DOM
- // (i.e. in the internal accessibility tree) is actually used by the renderer.
- base::string16 value =
- GetString16Attribute(ax::mojom::StringAttribute::kValue);
- if (!value.empty())
- return value;
-
- // TODO(https://crbug.com/1030703): The check for IsInvisibleOrIgnored()
- // should not be needed. ChildAtIndex() and GetChildCount() are already
- // supposed to skip over nodes that are invisible or ignored, but
- // ViewAXPlatformNodeDelegate does not currently implement this behavior.
- if (!GetChildCount() && !IsInvisibleOrIgnored())
- return GetNameAsString16();
-
- base::string16 text;
- for (auto child_iter = AXPlatformNodeChildrenBegin();
- child_iter != AXPlatformNodeChildrenEnd(); ++child_iter) {
- text += child_iter->GetInnerText();
- }
- return text;
+ if (!delegate_)
+ return base::string16();
+ return delegate_->GetInnerText();
}
bool AXPlatformNodeBase::IsSelectionItemSupported() const {
@@ -847,48 +834,15 @@ bool AXPlatformNodeBase::HasCaret(
}
bool AXPlatformNodeBase::IsLeaf() const {
- if (!GetChildCount())
- return true;
-
- // These types of objects may have children that we use as internal
- // implementation details, but we want to expose them as leaves to platform
- // accessibility APIs because screen readers might be confused if they find
- // any children.
- if (IsPlainTextField() || IsTextOnlyObject())
- return true;
-
- // Roles whose children are only presentational according to the ARIA and
- // HTML5 Specs should be hidden from screen readers.
- // (Note that whilst ARIA buttons can have only presentational children, HTML5
- // buttons are allowed to have content.)
- switch (GetData().role) {
- case ax::mojom::Role::kImage:
- case ax::mojom::Role::kMeter:
- case ax::mojom::Role::kScrollBar:
- case ax::mojom::Role::kSlider:
- case ax::mojom::Role::kSplitter:
- case ax::mojom::Role::kProgressIndicator:
- return true;
- default:
- return false;
- }
+ return delegate_ && delegate_->IsLeaf();
}
bool AXPlatformNodeBase::IsChildOfLeaf() const {
- AXPlatformNodeBase* ancestor = FromNativeViewAccessible(GetParent());
-
- while (ancestor) {
- if (ancestor->IsLeaf())
- return true;
- ancestor = FromNativeViewAccessible(ancestor->GetParent());
- }
-
- return false;
+ return delegate_ && delegate_->IsChildOfLeaf();
}
bool AXPlatformNodeBase::IsInvisibleOrIgnored() const {
- const AXNodeData& data = GetData();
- return data.HasState(ax::mojom::State::kInvisible) || data.IsIgnored();
+ return GetData().IsInvisibleOrIgnored();
}
bool AXPlatformNodeBase::IsScrollable() const {
@@ -981,7 +935,7 @@ void AXPlatformNodeBase::ComputeAttributes(PlatformAttributeList* attributes) {
AddAttributeToList(ax::mojom::IntAttribute::kPosInSet, "posinset",
attributes);
- if (HasIntAttribute(ax::mojom::IntAttribute::kCheckedState))
+ if (IsPlatformCheckable())
AddAttributeToList("checkable", "true", attributes);
if (IsInvisibleOrIgnored()) // Note: NVDA prefers this over INVISIBLE state.
@@ -1280,6 +1234,8 @@ AXHypertext::AXHypertext(const AXHypertext& other) = default;
AXHypertext& AXHypertext::operator=(const AXHypertext& other) = default;
void AXPlatformNodeBase::UpdateComputedHypertext() const {
+ if (!delegate_)
+ return;
hypertext_ = AXHypertext();
if (IsLeaf()) {
@@ -1728,6 +1684,10 @@ bool AXPlatformNodeBase::IsText(const base::string16& text,
return ch != kEmbeddedCharacter;
}
+bool AXPlatformNodeBase::IsPlatformCheckable() const {
+ return delegate_ && GetData().HasCheckedState();
+}
+
void AXPlatformNodeBase::ComputeHypertextRemovedAndInserted(
const AXHypertext& old_hypertext,
size_t* start,
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_base.h b/chromium/ui/accessibility/platform/ax_platform_node_base.h
index 90fca62bb3f..c14c8c7e698 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_base.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_base.h
@@ -216,19 +216,13 @@ class AX_EXPORT AXPlatformNodeBase : public AXPlatformNode {
// Optionally accepts an unignored selection to avoid redundant computation.
bool HasCaret(const AXTree::Selection* unignored_selection = nullptr);
- // Returns true if an ancestor of this node (not including itself) is a
- // leaf node, meaning that this node is not actually exposed to the
- // platform.
+ // See AXPlatformNodeDelegate::IsChildOfLeaf().
bool IsChildOfLeaf() const;
- // Returns true if this is a leaf node on this platform, meaning any
- // children should not be exposed to this platform's native accessibility
- // layer. Each platform subclass should implement this itself.
- // The definition of a leaf may vary depending on the platform,
- // but a leaf node should never have children that are focusable or
- // that might send notifications.
+ // See AXPlatformNodeDelegate::IsLeaf().
bool IsLeaf() const;
+ // See AXPlatformNodeDelegate::IsInvisibleOrIgnored().
bool IsInvisibleOrIgnored() const;
// Returns true if this node can be scrolled either in the horizontal or the
@@ -241,34 +235,41 @@ class AX_EXPORT AXPlatformNodeBase : public AXPlatformNode {
// Returns true if this node can be scrolled in the vertical direction.
bool IsVerticallyScrollable() const;
- // Returns true if this node has role of StaticText, LineBreak, or
+ // Returns true if this node has a role of StaticText, LineBreak, or
// InlineTextBox
bool IsTextOnlyObject() const;
- // A text field is any widget in which the user should be able to enter and
- // edit text.
- //
- // Examples include <input type="text">, <input type="password">, <textarea>,
- // <div contenteditable="true">, <div role="textbox">, <div role="searchbox">
- // and <div role="combobox">. Note that when an ARIA role that indicates that
- // the widget is editable is used, such as "role=textbox", the element doesn't
- // need to be contenteditable for this method to return true, as in theory
- // JavaScript could be used to implement editing functionality. In practice,
- // this situation should be rare.
+ // See AXNodeData::IsTextField().
bool IsTextField() const;
- // Returns true if the node is an editable text field.
+ // See AXNodeData::IsPlainTextField().
bool IsPlainTextField() const;
+ // See AXNodeData::IsRichTextField().
+ bool IsRichTextField() const;
+
+ // Determines whether an element should be exposed with checkable state, and
+ // possibly the checked state. Examples are check box and radio button.
+ // Objects that are exposed as toggle buttons use the platform pressed state
+ // in some platform APIs, and should not be exposed as checkable. They don't
+ // expose the platform equivalent of the internal checked state.
+ virtual bool IsPlatformCheckable() const;
+
bool HasFocus();
- // If this node is a leaf, returns the text of this node, otherwise represents
- // each child node with a special "embedded object" character. This is how
- // text is represented in ATK and IA2 APIs.
+ // If this node is a leaf, returns the visible accessible name of this node.
+ // Otherwise represents every non-leaf child node with a special "embedded
+ // object character", and every leaf child node with its visible accessible
+ // name. This is how displayed text and embedded objects are represented in
+ // ATK and IA2 APIs.
base::string16 GetHypertext() const;
// Returns the text of this node and all descendant nodes; including text
// found in embedded objects.
+ //
+ // Only text displayed on screen is included. Text from ARIA and HTML
+ // attributes that is either not displayed on screen, or outside this node,
+ // e.g. aria-label and HTML title, is not returned.
base::string16 GetInnerText() const;
virtual base::string16 GetValue() const;
@@ -344,11 +345,10 @@ class AX_EXPORT AXPlatformNodeBase : public AXPlatformNode {
//
// Delegate. This is a weak reference which owns |this|.
//
- AXPlatformNodeDelegate* delegate_;
+ AXPlatformNodeDelegate* delegate_ = nullptr;
protected:
bool IsDocument() const;
- bool IsRichTextField() const;
bool IsSelectionItemSupported() const;
// Get the range value text, which might come from aria-valuetext or
@@ -491,7 +491,7 @@ class AX_EXPORT AXPlatformNodeBase : public AXPlatformNode {
mutable AXHypertext hypertext_;
private:
- // Return true if the index represents a text character.
+ // Returns true if the index represents a text character.
bool IsText(const base::string16& text,
size_t index,
bool is_indexed_from_end = false);
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_delegate.h b/chromium/ui/accessibility/platform/ax_platform_node_delegate.h
index c6064c6e248..e8ff6876672 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_delegate.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_delegate.h
@@ -78,6 +78,14 @@ class AX_EXPORT AXPlatformNodeDelegate {
// Get the accessibility tree data for this node.
virtual const AXTreeData& GetTreeData() const = 0;
+ // Returns the text of this node and all descendant nodes; including text
+ // found in embedded objects.
+ //
+ // Only text displayed on screen is included. Text from ARIA and HTML
+ // attributes that is either not displayed on screen, or outside this node,
+ // e.g. aria-label and HTML title, is not returned.
+ virtual base::string16 GetInnerText() const = 0;
+
// Get the unignored selection from the tree
virtual const AXTree::Selection GetUnignoredSelection() const = 0;
@@ -121,12 +129,22 @@ class AX_EXPORT AXPlatformNodeDelegate {
virtual gfx::NativeViewAccessible GetPreviousSibling() = 0;
// Returns true if an ancestor of this node (not including itself) is a
- // leaf node, meaning that this node is not actually exposed to the
- // platform.
+ // leaf node, meaning that this node is not actually exposed to any
+ // platform's accessibility layer.
virtual bool IsChildOfLeaf() const = 0;
- // If this object is exposed to the platform, returns this object. Otherwise,
- // returns the platform leaf under which this object is found.
+ // Returns true if this current node is editable and the root editable node is
+ // a plain text field.
+ virtual bool IsChildOfPlainTextField() const = 0;
+
+ // Returns true if this is a leaf node, meaning all its
+ // children should not be exposed to any platform's native accessibility
+ // layer.
+ virtual bool IsLeaf() const = 0;
+
+ // If this object is exposed to the platform's accessibility layer, returns
+ // this object. Otherwise, returns the platform leaf under which this object
+ // is found.
virtual gfx::NativeViewAccessible GetClosestPlatformObject() const = 0;
class ChildIterator {
@@ -172,10 +190,6 @@ class AX_EXPORT AXPlatformNodeDelegate {
// implementations.
virtual std::string GetInheritedFontFamilyName() const = 0;
- // Returns the text of this node and all descendant nodes; including text
- // found in embedded objects.
- virtual base::string16 GetInnerText() const = 0;
-
// Return the bounds of this node in the coordinate system indicated. If the
// clipping behavior is set to clipped, clipping is applied. If an offscreen
// result address is provided, it will be populated depending on whether the
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 8abc5a9300e..39d55498dbd 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.cc
@@ -31,6 +31,38 @@ const AXTreeData& AXPlatformNodeDelegateBase::GetTreeData() const {
return *empty_data;
}
+base::string16 AXPlatformNodeDelegateBase::GetInnerText() const {
+ // Unlike in web content The "kValue" attribute always takes precedence,
+ // because we assume that users of this base class, such as Views controls,
+ // are carefully crafted by hand, in contrast to HTML pages, where any content
+ // that might be present in the shadow DOM (AKA in the internal accessibility
+ // tree) is actually used by the renderer when assigning the "kValue"
+ // attribute, including any redundant white space.
+ base::string16 value =
+ GetData().GetString16Attribute(ax::mojom::StringAttribute::kValue);
+ if (!value.empty())
+ return value;
+
+ // TODO(https://crbug.com/1030703): The check for IsInvisibleOrIgnored()
+ // should not be needed. ChildAtIndex() and GetChildCount() are already
+ // supposed to skip over nodes that are invisible or ignored, but
+ // ViewAXPlatformNodeDelegate does not currently implement this behavior.
+ if (IsLeaf() && !GetData().IsInvisibleOrIgnored())
+ return GetData().GetString16Attribute(ax::mojom::StringAttribute::kName);
+
+ base::string16 inner_text;
+ for (int i = 0; i < GetChildCount(); ++i) {
+ // TODO(nektar): Add const to all tree traversal methods and remove
+ // const_cast.
+ const AXPlatformNode* child = AXPlatformNode::FromNativeViewAccessible(
+ const_cast<AXPlatformNodeDelegateBase*>(this)->ChildAtIndex(i));
+ if (!child || !child->GetDelegate())
+ continue;
+ inner_text += child->GetDelegate()->GetInnerText();
+ }
+ return inner_text;
+}
+
const AXTree::Selection AXPlatformNodeDelegateBase::GetUnignoredSelection()
const {
return AXTree::Selection{-1, -1, -1, ax::mojom::TextAffinity::kDownstream};
@@ -95,6 +127,21 @@ gfx::NativeViewAccessible AXPlatformNodeDelegateBase::GetPreviousSibling() {
}
bool AXPlatformNodeDelegateBase::IsChildOfLeaf() const {
+ // TODO(nektar): Make all tree traversal methods const and remove const_cast.
+ const AXPlatformNodeDelegate* parent =
+ const_cast<AXPlatformNodeDelegateBase*>(this)->GetParentDelegate();
+ if (!parent)
+ return false;
+ if (parent->IsLeaf())
+ return true;
+ return parent->IsChildOfLeaf();
+}
+
+bool AXPlatformNodeDelegateBase::IsLeaf() const {
+ return !GetChildCount();
+}
+
+bool AXPlatformNodeDelegateBase::IsChildOfPlainTextField() const {
return false;
}
@@ -200,10 +247,6 @@ bool AXPlatformNodeDelegateBase::SetHypertextSelection(int start_offset,
return AccessibilityPerformAction(action_data);
}
-base::string16 AXPlatformNodeDelegateBase::GetInnerText() const {
- return base::string16();
-}
-
gfx::Rect AXPlatformNodeDelegateBase::GetBoundsRect(
const AXCoordinateSystem coordinate_system,
const AXClippingBehavior clipping_behavior,
@@ -533,6 +576,11 @@ AXPlatformNodeDelegateBase::GetTargetNodesForRelation(
std::set<AXPlatformNode*> AXPlatformNodeDelegateBase::GetReverseRelations(
ax::mojom::IntAttribute attr) {
+ // TODO(accessibility) Implement these if views ever use relations more
+ // widely. The use so far has been for the Omnibox to the suggestion popup.
+ // If this is ever implemented, then the "popup for" to "controlled by"
+ // mapping in AXPlatformRelationWin can be removed, as it would be
+ // redundant with setting the controls relationship.
return std::set<AXPlatformNode*>();
}
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 350b9f6a44b..7dd68b928d7 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.h
@@ -35,7 +35,7 @@ class AX_EXPORT AXPlatformNodeDelegateBase : public AXPlatformNodeDelegate {
// Get the accessibility tree data for this node.
const AXTreeData& GetTreeData() const override;
- // Get the unignored selection from the tree
+ base::string16 GetInnerText() const override;
const AXTree::Selection GetUnignoredSelection() const override;
// Creates a text position rooted at this object.
@@ -67,13 +67,9 @@ class AX_EXPORT AXPlatformNodeDelegateBase : public AXPlatformNodeDelegate {
gfx::NativeViewAccessible GetNextSibling() override;
gfx::NativeViewAccessible GetPreviousSibling() override;
- // Returns true if an ancestor of this node (not including itself) is a
- // leaf node, meaning that this node is not actually exposed to the
- // platform.
bool IsChildOfLeaf() const override;
-
- // If this object is exposed to the platform, returns this object. Otherwise,
- // returns the platform leaf under which this object is found.
+ bool IsChildOfPlainTextField() const override;
+ bool IsLeaf() const override;
gfx::NativeViewAccessible GetClosestPlatformObject() const override;
class ChildIteratorBase : public ChildIterator {
@@ -107,8 +103,6 @@ class AX_EXPORT AXPlatformNodeDelegateBase : public AXPlatformNodeDelegate {
const TextAttributeList& default_attributes) const override;
std::string GetInheritedFontFamilyName() const override;
- base::string16 GetInnerText() const override;
-
gfx::Rect GetBoundsRect(const AXCoordinateSystem coordinate_system,
const AXClippingBehavior clipping_behavior,
AXOffscreenResult* offscreen_result) const override;
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_mac.h b/chromium/ui/accessibility/platform/ax_platform_node_mac.h
index 920f0a05363..c28d1a9fdc5 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_mac.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_mac.h
@@ -27,6 +27,7 @@ class AXPlatformNodeMac : public AXPlatformNodeBase {
// AXPlatformNodeBase.
void Destroy() override;
+ bool IsPlatformCheckable() const override;
protected:
void AddAttributeToList(const char* name,
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_mac.mm b/chromium/ui/accessibility/platform/ax_platform_node_mac.mm
index 9a8f6f6d60a..911344e83a4 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_mac.mm
+++ b/chromium/ui/accessibility/platform/ax_platform_node_mac.mm
@@ -497,6 +497,8 @@ bool AlsoUseShowMenuActionForDefaultAction(const ui::AXNodeData& data) {
return nil;
for (id child in [[self AXChildren] reverseObjectEnumerator]) {
+ if (!NSPointInRect(point, [child accessibilityFrame]))
+ continue;
if (id foundChild = [child accessibilityHitTest:point])
return foundChild;
}
@@ -744,7 +746,7 @@ bool AlsoUseShowMenuActionForDefaultAction(const ui::AXNodeData& data) {
if (ui::IsNameExposedInAXValueForRole(role))
return [self getName];
- if (_node->HasIntAttribute(ax::mojom::IntAttribute::kCheckedState)) {
+ if (_node->IsPlatformCheckable()) {
// Mixed checkbox state not currently supported in views, but could be.
// See browser_accessibility_cocoa.mm for details.
const auto checkedState = static_cast<ax::mojom::CheckedState>(
@@ -844,8 +846,10 @@ bool AlsoUseShowMenuActionForDefaultAction(const ui::AXNodeData& data) {
- (NSValue*)AXSelectedTextRange {
// Selection might not be supported. Return (NSRange){0,0} in that case.
int start = 0, end = 0;
- _node->GetIntAttribute(ax::mojom::IntAttribute::kTextSelStart, &start);
- _node->GetIntAttribute(ax::mojom::IntAttribute::kTextSelEnd, &end);
+ if (_node->IsPlainTextField()) {
+ start = _node->GetIntAttribute(ax::mojom::IntAttribute::kTextSelStart);
+ end = _node->GetIntAttribute(ax::mojom::IntAttribute::kTextSelEnd);
+ }
// NSRange cannot represent the direction the text was selected in.
return [NSValue valueWithRange:{std::min(start, end), abs(end - start)}];
@@ -1209,6 +1213,17 @@ void AXPlatformNodeMac::Destroy() {
AXPlatformNodeBase::Destroy();
}
+// On Mac, the checked state is mapped to AXValue.
+bool AXPlatformNodeMac::IsPlatformCheckable() const {
+ if (GetData().role == ax::mojom::Role::kTab) {
+ // On Mac, tabs are exposed as radio buttons, and are treated as checkable.
+ // Also, the internal State::kSelected is be mapped to checked via AXValue.
+ return true;
+ }
+
+ return AXPlatformNodeBase::IsPlatformCheckable();
+}
+
gfx::NativeViewAccessible AXPlatformNodeMac::GetNativeViewAccessible() {
if (!native_node_)
native_node_.reset([[AXPlatformNodeCocoa alloc] initWithNode:this]);
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_textchildprovider_win_unittest.cc b/chromium/ui/accessibility/platform/ax_platform_node_textchildprovider_win_unittest.cc
index 167e1af7f8e..ec5adb620d6 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_textchildprovider_win_unittest.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_textchildprovider_win_unittest.cc
@@ -60,7 +60,7 @@ class AXPlatformNodeTextChildProviderTest : public AXPlatformNodeWinTest {
ui::AXNodeData text_child_of_text;
text_child_of_text.id = 6;
- text_child_of_text.role = ax::mojom::Role::kStaticText;
+ text_child_of_text.role = ax::mojom::Role::kInlineTextBox;
text_child_of_text.SetName("text child of text.");
text_child_of_root.child_ids.push_back(text_child_of_text.id);
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 ec472458f9f..d86ee466120 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
@@ -7,6 +7,8 @@
#include <UIAutomationClient.h>
#include <UIAutomationCoreApi.h>
+#include <vector>
+
#include "base/win/scoped_bstr.h"
#include "base/win/scoped_safearray.h"
#include "ui/accessibility/ax_action_data.h"
@@ -107,8 +109,8 @@ TEST_F(AXPlatformNodeTextProviderTest, ITextProviderRangeFromChild) {
ui::AXNodeData root_data;
root_data.id = 1;
- root_data.SetName("Document");
root_data.role = ax::mojom::Role::kRootWebArea;
+ root_data.SetName("Document");
root_data.child_ids.push_back(2);
root_data.child_ids.push_back(3);
@@ -196,8 +198,8 @@ TEST_F(AXPlatformNodeTextProviderTest,
ui::AXNodeData root;
root.id = ROOT_ID;
- root.SetName("Document");
root.role = ax::mojom::Role::kRootWebArea;
+ root.SetName("Document");
root.child_ids = {DIALOG_ID};
ui::AXNodeData dialog;
@@ -343,8 +345,8 @@ TEST_F(AXPlatformNodeTextProviderTest, ITextProviderDocumentRange) {
ui::AXNodeData root_data;
root_data.id = 1;
- root_data.SetName("Document");
root_data.role = ax::mojom::Role::kRootWebArea;
+ root_data.SetName("Document");
root_data.child_ids.push_back(2);
Init(root_data, text_data);
@@ -374,8 +376,8 @@ TEST_F(AXPlatformNodeTextProviderTest, ITextProviderDocumentRangeNested) {
ui::AXNodeData root_data;
root_data.id = 1;
- root_data.SetName("Document");
root_data.role = ax::mojom::Role::kRootWebArea;
+ root_data.SetName("Document");
root_data.child_ids.push_back(2);
Init(root_data, paragraph_data, text_data);
@@ -400,8 +402,8 @@ TEST_F(AXPlatformNodeTextProviderTest, ITextProviderSupportedSelection) {
ui::AXNodeData root_data;
root_data.id = 1;
- root_data.SetName("Document");
root_data.role = ax::mojom::Role::kRootWebArea;
+ root_data.SetName("Document");
root_data.child_ids.push_back(2);
Init(root_data, text_data);
@@ -433,8 +435,8 @@ TEST_F(AXPlatformNodeTextProviderTest, ITextProviderGetSelection) {
ui::AXNodeData root_data;
root_data.id = 1;
- root_data.SetName("Document");
root_data.role = ax::mojom::Role::kRootWebArea;
+ root_data.SetName("Document");
root_data.child_ids.push_back(2);
root_data.child_ids.push_back(3);
@@ -608,8 +610,8 @@ TEST_F(AXPlatformNodeTextProviderTest, ITextProviderGetActiveComposition) {
ui::AXNodeData root_data;
root_data.id = 1;
- root_data.SetName("Document");
root_data.role = ax::mojom::Role::kRootWebArea;
+ root_data.SetName("Document");
root_data.child_ids.push_back(2);
ui::AXTreeUpdate update;
@@ -668,8 +670,8 @@ TEST_F(AXPlatformNodeTextProviderTest, ITextProviderGetConversionTarget) {
ui::AXNodeData root_data;
root_data.id = 1;
- root_data.SetName("Document");
root_data.role = ax::mojom::Role::kRootWebArea;
+ root_data.SetName("Document");
root_data.child_ids.push_back(2);
ui::AXTreeUpdate update;
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 ee4026570b1..379fa000578 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc
@@ -172,6 +172,11 @@ HRESULT AXPlatformNodeTextRangeProviderWin::CompareEndpoints(
HRESULT AXPlatformNodeTextRangeProviderWin::ExpandToEnclosingUnit(
TextUnit unit) {
WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_TEXTRANGE_EXPANDTOENCLOSINGUNIT);
+ return ExpandToEnclosingUnitImpl(unit);
+}
+
+HRESULT AXPlatformNodeTextRangeProviderWin::ExpandToEnclosingUnitImpl(
+ TextUnit unit) {
UIA_VALIDATE_TEXTRANGEPROVIDER_CALL();
NormalizeTextRange();
@@ -627,8 +632,8 @@ HRESULT AXPlatformNodeTextRangeProviderWin::Move(TextUnit unit,
// Move the start of the text range forward or backward in the document by the
// requested number of text unit boundaries.
int start_units_moved = 0;
- HRESULT hr = MoveEndpointByUnit(TextPatternRangeEndpoint_Start, unit, count,
- &start_units_moved);
+ HRESULT hr = MoveEndpointByUnitImpl(TextPatternRangeEndpoint_Start, unit,
+ count, &start_units_moved);
bool succeeded_move = SUCCEEDED(hr) && start_units_moved != 0;
if (succeeded_move) {
@@ -640,8 +645,8 @@ HRESULT AXPlatformNodeTextRangeProviderWin::Move(TextUnit unit,
// by one text unit to expand the text range from the degenerate range
// state.
int current_start_units_moved = 0;
- hr = MoveEndpointByUnit(TextPatternRangeEndpoint_Start, unit, -1,
- &current_start_units_moved);
+ hr = MoveEndpointByUnitImpl(TextPatternRangeEndpoint_Start, unit, -1,
+ &current_start_units_moved);
start_units_moved -= 1;
succeeded_move = SUCCEEDED(hr) && current_start_units_moved == -1 &&
start_units_moved > 0;
@@ -650,8 +655,8 @@ HRESULT AXPlatformNodeTextRangeProviderWin::Move(TextUnit unit,
// forward by one text unit to expand the text range from the degenerate
// state.
int end_units_moved = 0;
- hr = MoveEndpointByUnit(TextPatternRangeEndpoint_End, unit, 1,
- &end_units_moved);
+ hr = MoveEndpointByUnitImpl(TextPatternRangeEndpoint_End, unit, 1,
+ &end_units_moved);
succeeded_move = SUCCEEDED(hr) && end_units_moved == 1;
}
@@ -660,7 +665,7 @@ HRESULT AXPlatformNodeTextRangeProviderWin::Move(TextUnit unit,
// sure to bring back the end endpoint to the end of the start's anchor.
if (start_->anchor_id() != end_->anchor_id() &&
(unit == TextUnit_Character || unit == TextUnit_Word)) {
- ExpandToEnclosingUnit(unit);
+ ExpandToEnclosingUnitImpl(unit);
}
}
}
@@ -683,6 +688,14 @@ HRESULT AXPlatformNodeTextRangeProviderWin::MoveEndpointByUnit(
int count,
int* units_moved) {
WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_TEXTRANGE_MOVEENDPOINTBYUNIT);
+ return MoveEndpointByUnitImpl(endpoint, unit, count, units_moved);
+}
+
+HRESULT AXPlatformNodeTextRangeProviderWin::MoveEndpointByUnitImpl(
+ TextPatternRangeEndpoint endpoint,
+ TextUnit unit,
+ int count,
+ int* units_moved) {
UIA_VALIDATE_TEXTRANGEPROVIDER_CALL_1_OUT(units_moved);
// Per MSDN, MoveEndpointByUnit with zero count has no effect.
@@ -1124,12 +1137,22 @@ void AXPlatformNodeTextRangeProviderWin::NormalizeTextRange() {
NormalizeAsUnignoredTextRange();
// Do not normalize text ranges when a cursor or selection is visible. ATs
- // may depend on the specific position that the caret or selection is at.
+ // may depend on the specific position that the caret or selection is at. This
+ // condition fixes issues when the caret is inside a plain text field, but
+ // causes more issues when used inside of a rich text field. For this reason,
+ // if we have a caret or a selection inside of an editable node, restrict this
+ // to a plain text field as we gain nothing from using it in a rich text
+ // field.
AXPlatformNodeDelegate* start_delegate = GetDelegate(start_.get());
AXPlatformNodeDelegate* end_delegate = GetDelegate(end_.get());
- if ((start_delegate && start_delegate->HasVisibleCaretOrSelection()) ||
- (start_delegate && end_delegate->HasVisibleCaretOrSelection()))
+ if ((start_delegate && start_delegate->HasVisibleCaretOrSelection() &&
+ (!start_delegate->GetData().HasState(ax::mojom::State::kEditable) ||
+ start_delegate->IsChildOfPlainTextField())) ||
+ (end_delegate && end_delegate->HasVisibleCaretOrSelection() &&
+ (!end_delegate->GetData().HasState(ax::mojom::State::kEditable) ||
+ end_delegate->IsChildOfPlainTextField()))) {
return;
+ }
AXPositionInstance normalized_start =
start_->AsLeafTextPositionBeforeCharacter();
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 db595fdf424..c967b191124 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.h
@@ -99,6 +99,16 @@ class AX_EXPORT __declspec(uuid("3071e40d-a10d-45ff-a59f-6e8e1138e2c1"))
AXBoundaryBehavior boundary_behavior,
ax::mojom::MoveDirection boundary_direction);
+ // Prefer these *Impl methods when functionality is needed internally. We
+ // should avoid calling external APIs internally as it will cause the
+ // histograms to become innaccurate.
+ HRESULT MoveEndpointByUnitImpl(TextPatternRangeEndpoint endpoint,
+ TextUnit unit,
+ int count,
+ int* units_moved);
+
+ IFACEMETHODIMP ExpandToEnclosingUnitImpl(TextUnit unit);
+
base::string16 GetString(int max_count,
size_t* appended_newlines_count = nullptr);
AXPlatformNodeWin* owner() const;
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 13617fa8a8c..a698ca3c021 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
@@ -7,6 +7,9 @@
#include <UIAutomationClient.h>
#include <UIAutomationCoreApi.h>
+#include <memory>
+#include <utility>
+
#include "base/win/atl.h"
#include "base/win/scoped_bstr.h"
#include "base/win/scoped_safearray.h"
@@ -3074,24 +3077,12 @@ TEST_F(AXPlatformNodeTextRangeProviderTest,
update.tree_data = tree_data;
update.has_tree_data = true;
update.root_id = root_data.id;
- update.nodes.push_back(root_data);
- update.nodes.push_back(paragraph_data);
- update.nodes.push_back(static_text_data1);
- update.nodes.push_back(inline_text_data1);
- update.nodes.push_back(link_data);
- update.nodes.push_back(static_text_data2);
- update.nodes.push_back(inline_text_data2);
- update.nodes.push_back(link_data2);
- update.nodes.push_back(list_data);
- update.nodes.push_back(list_item_data);
- update.nodes.push_back(static_text_data3);
- update.nodes.push_back(inline_text_data3);
- update.nodes.push_back(search_box);
- update.nodes.push_back(search_text);
- update.nodes.push_back(pdf_highlight_data);
- update.nodes.push_back(static_text_data4);
- update.nodes.push_back(inline_text_data4);
-
+ update.nodes = {root_data, paragraph_data, static_text_data1,
+ inline_text_data1, link_data, static_text_data2,
+ inline_text_data2, link_data2, list_data,
+ list_item_data, static_text_data3, inline_text_data3,
+ search_box, search_text, pdf_highlight_data,
+ static_text_data4, inline_text_data4};
Init(update);
// Set up variables from the tree for testing.
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_unittest.cc b/chromium/ui/accessibility/platform/ax_platform_node_unittest.cc
index 480a7233253..1cc881f5af8 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_unittest.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_unittest.cc
@@ -359,31 +359,31 @@ AXTreeUpdate AXPlatformNodeTest::BuildListBox(
const std::vector<ax::mojom::State>& additional_state) {
AXNodeData listbox;
listbox.id = 1;
- listbox.SetName("ListBox");
listbox.role = ax::mojom::Role::kListBox;
+ listbox.SetName("ListBox");
for (auto state : additional_state)
listbox.AddState(state);
AXNodeData option_1;
option_1.id = 2;
- option_1.SetName("Option1");
option_1.role = ax::mojom::Role::kListBoxOption;
+ option_1.SetName("Option1");
if (option_1_is_selected)
option_1.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true);
listbox.child_ids.push_back(option_1.id);
AXNodeData option_2;
option_2.id = 3;
- option_2.SetName("Option2");
option_2.role = ax::mojom::Role::kListBoxOption;
+ option_2.SetName("Option2");
if (option_2_is_selected)
option_2.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true);
listbox.child_ids.push_back(option_2.id);
AXNodeData option_3;
option_3.id = 4;
- option_3.SetName("Option3");
option_3.role = ax::mojom::Role::kListBoxOption;
+ option_3.SetName("Option3");
if (option_3_is_selected)
option_3.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true);
listbox.child_ids.push_back(option_3.id);
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_win.cc b/chromium/ui/accessibility/platform/ax_platform_node_win.cc
index b9fbc55ae57..d0fbf20bcf0 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_win.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_win.cc
@@ -15,11 +15,14 @@
#include <utility>
#include <vector>
+#include "base/json/json_writer.h"
#include "base/lazy_instance.h"
#include "base/metrics/histogram_functions.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "base/values.h"
#include "base/win/enum_variant.h"
#include "base/win/scoped_bstr.h"
#include "base/win/scoped_safearray.h"
@@ -27,6 +30,7 @@
#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"
#include "ui/accessibility/ax_active_popup.h"
@@ -43,6 +47,7 @@
#include "ui/accessibility/platform/ax_platform_node_textchildprovider_win.h"
#include "ui/accessibility/platform/ax_platform_node_textprovider_win.h"
#include "ui/accessibility/platform/ax_platform_relation_win.h"
+#include "ui/accessibility/platform/uia_registrar_win.h"
#include "ui/base/win/atl_module.h"
#include "ui/display/win/screen_win.h"
#include "ui/gfx/geometry/rect_conversions.h"
@@ -297,7 +302,7 @@ AXPlatformNode* AXPlatformNode::FromNativeViewAccessible(
// AXPlatformNodeWin
//
-AXPlatformNodeWin::AXPlatformNodeWin() : force_new_hypertext_(false) {}
+AXPlatformNodeWin::AXPlatformNodeWin() {}
AXPlatformNodeWin::~AXPlatformNodeWin() {
ClearOwnRelations();
@@ -305,7 +310,6 @@ AXPlatformNodeWin::~AXPlatformNodeWin() {
void AXPlatformNodeWin::Init(AXPlatformNodeDelegate* delegate) {
AXPlatformNodeBase::Init(delegate);
- force_new_hypertext_ = false;
}
void AXPlatformNodeWin::ClearOwnRelations() {
@@ -314,10 +318,6 @@ void AXPlatformNodeWin::ClearOwnRelations() {
relations_.clear();
}
-void AXPlatformNodeWin::ForceNewHypertext() {
- force_new_hypertext_ = true;
-}
-
// Static
void AXPlatformNodeWin::SanitizeStringAttributeForUIAAriaProperty(
const base::string16& input,
@@ -645,7 +645,7 @@ void AXPlatformNodeWin::NotifyAccessibilityEvent(ax::mojom::Event event_type) {
::VariantInit(old_value.Receive());
base::win::ScopedVariant new_value;
::VariantInit(new_value.Receive());
- GetPropertyValue((*uia_property), new_value.Receive());
+ GetPropertyValueImpl((*uia_property), new_value.Receive());
::UiaRaiseAutomationPropertyChangedEvent(this, (*uia_property), old_value,
new_value);
}
@@ -1263,6 +1263,14 @@ IFACEMETHODIMP AXPlatformNodeWin::get_states(AccessibleStates* states) {
IFACEMETHODIMP AXPlatformNodeWin::get_uniqueID(LONG* id) {
WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_UNIQUE_ID);
COM_OBJECT_VALIDATE_1_ARG(id);
+ // We want to negate the unique id for it to be consistent across different
+ // Windows accessiblity APIs. The negative unique id convention originated
+ // from ::NotifyWinEvent() takes an hwnd and a child id. A 0 child id means
+ // self, and a positive child id means child #n. In order to fire an event for
+ // an arbitrary descendant of the window, Firefox started the practice of
+ // using a negative unique id. We follow the same negative unique id
+ // convention here and when we fire events via
+ // ::NotifyWinEvent().
*id = -GetUniqueId();
return S_OK;
}
@@ -2075,7 +2083,23 @@ HRESULT AXPlatformNodeWin::ISelectionItemProviderSetSelected(
return UIA_E_ELEMENTNOTENABLED;
}
- if (selected == ISelectionItemProviderIsSelected())
+ // The platform implements selection follows focus for single-selection
+ // container elements. Focus action can change a node's accessibility selected
+ // state, but does not cause the actual control to be selected.
+ // https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_selection_follows_focus
+ // https://www.w3.org/TR/core-aam-1.2/#mapping_events_selection
+ //
+ // We don't want to perform |Action::kDoDefault| for an ax node that has
+ // |kSelected=true| and |kSelectedFromFocus=false|, because perform
+ // |Action::kDoDefault| may cause the control to be unselected. However, if an
+ // ax node is selected due to focus, i.e. |kSelectedFromFocus=true|, we need
+ // to perform |Action::kDoDefault| on the ax node, since focus action only
+ // changes an ax node's accessibility selected state to |kSelected=true| and
+ // no |Action::kDoDefault| was performed on that node yet. So we need to
+ // perform |Action::kDoDefault| on the ax node to cause its associated control
+ // to be selected.
+ if (selected == ISelectionItemProviderIsSelected() &&
+ !GetBoolAttribute(ax::mojom::BoolAttribute::kSelectedFromFocus))
return S_OK;
AXActionData data;
@@ -3971,6 +3995,11 @@ IFACEMETHODIMP AXPlatformNodeWin::get_FragmentRoot(
IFACEMETHODIMP AXPlatformNodeWin::GetPatternProvider(PATTERNID pattern_id,
IUnknown** result) {
WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_PATTERN_PROVIDER);
+ return GetPatternProviderImpl(pattern_id, result);
+}
+
+HRESULT AXPlatformNodeWin::GetPatternProviderImpl(PATTERNID pattern_id,
+ IUnknown** result) {
UIA_VALIDATE_CALL_1_ARG(result);
*result = nullptr;
@@ -3997,7 +4026,11 @@ IFACEMETHODIMP AXPlatformNodeWin::GetPropertyValue(PROPERTYID property_id,
// Collapse all unknown property IDs into a single bucket.
base::UmaHistogramSparse("Accessibility.WinAPIs.GetPropertyValue", 0);
}
+ return GetPropertyValueImpl(property_id, result);
+}
+HRESULT AXPlatformNodeWin::GetPropertyValueImpl(PROPERTYID property_id,
+ VARIANT* result) {
UIA_VALIDATE_CALL_1_ARG(result);
result->vt = VT_EMPTY;
@@ -4005,6 +4038,7 @@ IFACEMETHODIMP AXPlatformNodeWin::GetPropertyValue(PROPERTYID property_id,
int int_attribute;
const AXNodeData& data = GetData();
+ // Default UIA Property Ids.
switch (property_id) {
case UIA_AriaPropertiesPropertyId:
result->vt = VT_BSTR;
@@ -4044,9 +4078,7 @@ IFACEMETHODIMP AXPlatformNodeWin::GetPropertyValue(PROPERTYID property_id,
break;
case UIA_CulturePropertyId:
- result->vt = VT_BSTR;
- GetStringAttributeAsBstr(ax::mojom::StringAttribute::kLanguage,
- &result->bstrVal);
+ return GetCultureAttributeAsVariant(result);
break;
case UIA_DescribedByPropertyId:
@@ -4366,6 +4398,21 @@ IFACEMETHODIMP AXPlatformNodeWin::GetPropertyValue(PROPERTYID property_id,
case UIA_ProviderDescriptionPropertyId:
case UIA_RuntimeIdPropertyId:
break;
+ } // End of default UIA property ids.
+
+ // Custom UIA Property Ids.
+ if (property_id ==
+ UiaRegistrarWin::GetInstance().GetUiaUniqueIdPropertyId()) {
+ // We want to negate the unique id for it to be consistent across different
+ // Windows accessiblity APIs. The negative unique id convention originated
+ // from ::NotifyWinEvent() takes an hwnd and a child id. A 0 child id means
+ // self, and a positive child id means child #n. In order to fire an event
+ // for an arbitrary descendant of the window, Firefox started the practice
+ // of using a negative unique id. We follow the same negative unique id
+ // convention here and when we fire events via ::NotifyWinEvent().
+ result->vt = VT_BSTR;
+ result->bstrVal =
+ SysAllocString(base::NumberToString16(-GetUniqueId()).c_str());
}
return S_OK;
@@ -4405,6 +4452,71 @@ IFACEMETHODIMP AXPlatformNodeWin::ShowContextMenu() {
}
//
+// IChromeAccessible implementation.
+//
+
+void SendBulkFetchResponse(
+ Microsoft::WRL::ComPtr<IChromeAccessibleDelegate> delegate,
+ LONG request_id,
+ std::string json_result) {
+ base::string16 json_result_utf16 = base::UTF8ToUTF16(json_result);
+ delegate->put_bulkFetchResult(request_id,
+ SysAllocString(json_result_utf16.c_str()));
+}
+
+IFACEMETHODIMP AXPlatformNodeWin::get_bulkFetch(
+ BSTR input_json,
+ LONG request_id,
+ IChromeAccessibleDelegate* delegate) {
+ COM_OBJECT_VALIDATE();
+ if (!delegate)
+ return E_INVALIDARG;
+
+ // TODO(crbug.com/1083834): if parsing |input_json|, use
+ // DataDecoder because the json is untrusted. For now, this is just
+ // a stub that calls PostTask so that it's async, but it doesn't
+ // actually parse the input.
+
+ base::Value result(base::Value::Type::DICTIONARY);
+ result.SetKey("role", base::Value(ui::ToString(GetData().role)));
+
+ gfx::Rect bounds = GetDelegate()->GetBoundsRect(
+ AXCoordinateSystem::kScreenDIPs, AXClippingBehavior::kUnclipped);
+ result.SetKey("x", base::Value(bounds.x()));
+ result.SetKey("y", base::Value(bounds.y()));
+ result.SetKey("width", base::Value(bounds.width()));
+ result.SetKey("height", base::Value(bounds.height()));
+ std::string json_result;
+ base::JSONWriter::Write(result, &json_result);
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE,
+ base::BindOnce(
+ &SendBulkFetchResponse,
+ Microsoft::WRL::ComPtr<IChromeAccessibleDelegate>(delegate),
+ request_id, json_result));
+ return S_OK;
+}
+
+IFACEMETHODIMP AXPlatformNodeWin::get_hitTest(
+ LONG screen_physical_pixel_x,
+ LONG screen_physical_pixel_y,
+ LONG request_id,
+ IChromeAccessibleDelegate* delegate) {
+ COM_OBJECT_VALIDATE();
+
+ if (!delegate)
+ return E_INVALIDARG;
+
+ // TODO(crbug.com/1083834): Plumb through an actual async hit test.
+ AXPlatformNodeWin* hit_child = static_cast<AXPlatformNodeWin*>(
+ FromNativeViewAccessible(GetDelegate()->HitTestSync(
+ screen_physical_pixel_x, screen_physical_pixel_y)));
+
+ delegate->put_hitTestResult(request_id, static_cast<IAccessible*>(hit_child));
+ return S_OK;
+}
+
+//
// IServiceProvider implementation.
//
@@ -4430,6 +4542,12 @@ IFACEMETHODIMP AXPlatformNodeWin::QueryService(REFGUID guidService,
return QueryInterface(riid, object);
}
+ if (guidService == IID_IChromeAccessible) {
+ if (features::IsIChromeAccessibleEnabled()) {
+ return QueryInterface(riid, object);
+ }
+ }
+
// TODO(suproteem): Include IAccessibleEx in the list, potentially checking
// for version.
@@ -4468,6 +4586,10 @@ STDMETHODIMP AXPlatformNodeWin::InternalQueryInterface(
if (!accessible->GetData().IsRangeValueSupported()) {
return E_NOINTERFACE;
}
+ } else if (riid == IID_IChromeAccessible) {
+ if (!features::IsIChromeAccessibleEnabled()) {
+ return E_NOINTERFACE;
+ }
}
return CComObjectRootBase::InternalQueryInterface(this_ptr, entries, riid,
@@ -5254,7 +5376,7 @@ int32_t AXPlatformNodeWin::ComputeIA2State() {
const AXNodeData& data = GetData();
int32_t ia2_state = IA2_STATE_OPAQUE;
- if (HasIntAttribute(ax::mojom::IntAttribute::kCheckedState))
+ if (IsPlatformCheckable())
ia2_state |= IA2_STATE_CHECKABLE;
if (HasIntAttribute(ax::mojom::IntAttribute::kInvalidState) &&
@@ -6800,7 +6922,12 @@ bool AXPlatformNodeWin::IsUIAControl() const {
// UIA provides multiple "views": raw, content and control. We only want to
// populate the content and control views with items that make sense to
// traverse over.
+
if (GetDelegate()->IsWebContent()) {
+ // Invisible or ignored elements should not show up in control view at all.
+ if (IsInvisibleOrIgnored())
+ return false;
+
if (IsTextOnlyObject()) {
// A text leaf can be a UIAControl, but text inside of a heading, link,
// button, etc. where the role allows the name to be generated from the
@@ -6840,7 +6967,8 @@ bool AXPlatformNodeWin::IsUIAControl() const {
}
parent = FromNativeViewAccessible(parent->GetParent());
}
- }
+ } // end of text only case.
+
const AXNodeData& data = GetData();
// https://docs.microsoft.com/en-us/windows/win32/winauto/uiauto-treeoverview#control-view
// The control view also includes noninteractive UI items that contribute
@@ -6892,9 +7020,10 @@ bool AXPlatformNodeWin::IsUIAControl() const {
!data.HasState(ax::mojom::State::kFocusable) && !data.IsClickable()) {
return false;
}
+
return true;
- }
- // non web-content case.
+ } // end of web-content only case.
+
const AXNodeData& data = GetData();
return !((IsReadOnlySupported(data.role) && data.IsReadOnlyOrDisabled()) ||
data.HasState(ax::mojom::State::kInvisible) ||
@@ -6959,8 +7088,10 @@ bool AXPlatformNodeWin::IsInaccessibleDueToAncestor() const {
}
bool AXPlatformNodeWin::ShouldHideChildrenForUIA() const {
- auto role = GetData().role;
+ if (IsPlainTextField())
+ return true;
+ auto role = GetData().role;
if (HasPresentationalChildren(role))
return true;
@@ -6982,7 +7113,6 @@ bool AXPlatformNodeWin::ShouldHideChildrenForUIA() const {
return only_child && only_child->IsTextOnlyObject();
}
return false;
- case ax::mojom::Role::kTextField:
case ax::mojom::Role::kPdfActionableHighlight:
return true;
default:
@@ -7004,6 +7134,13 @@ base::string16 AXPlatformNodeWin::GetValue() const {
return value;
}
+bool AXPlatformNodeWin::IsPlatformCheckable() const {
+ if (GetData().role == ax::mojom::Role::kToggleButton)
+ return false;
+
+ return AXPlatformNodeBase::IsPlatformCheckable();
+}
+
bool AXPlatformNodeWin::ShouldNodeHaveFocusableState(
const AXNodeData& data) const {
switch (data.role) {
@@ -7212,6 +7349,8 @@ base::Optional<DWORD> AXPlatformNodeWin::MojoEventToMSAAEvent(
switch (event) {
case ax::mojom::Event::kAlert:
return EVENT_SYSTEM_ALERT;
+ case ax::mojom::Event::kActiveDescendantChanged:
+ return IA2_EVENT_ACTIVE_DESCENDANT_CHANGED;
case ax::mojom::Event::kCheckedStateChanged:
case ax::mojom::Event::kExpandedChanged:
case ax::mojom::Event::kStateChanged:
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_win.h b/chromium/ui/accessibility/platform/ax_platform_node_win.h
index 1055422d59c..9f4367393bc 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_win.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_win.h
@@ -28,6 +28,7 @@
#include "ui/accessibility/ax_text_utils.h"
#include "ui/accessibility/platform/ax_platform_node_base.h"
#include "ui/accessibility/platform/ax_platform_text_boundary.h"
+#include "ui/accessibility/platform/ichromeaccessible.h"
#include "ui/gfx/range/range.h"
// IMPORTANT!
@@ -280,6 +281,11 @@ enum {
UMA_API_WINDOW_GET_WINDOWVISUALSTATE = 243,
UMA_API_WINDOW_GET_WINDOWINTERACTIONSTATE = 244,
UMA_API_WINDOW_GET_ISTOPMOST = 245,
+ UMA_API_ELEMENT_PROVIDER_FROM_POINT = 246,
+ UMA_API_GET_FOCUS = 247,
+ UMA_API_ADVISE_EVENT_ADDED = 248,
+ UMA_API_ADVISE_EVENT_REMOVED = 249,
+ UMA_API_ITEMCONTAINER_FINDITEMBYPROPERTY = 250,
// This must always be the last enum. It's okay for its value to
// increase, but none of the other enum values may change.
@@ -358,6 +364,7 @@ class AX_EXPORT __declspec(uuid("26f5641a-246d-457b-a96d-07f3fae6acf2"))
public IToggleProvider,
public IValueProvider,
public IWindowProvider,
+ public IChromeAccessible,
public AXPlatformNodeBase {
using IDispatchImpl::Invoke;
@@ -381,6 +388,7 @@ class AX_EXPORT __declspec(uuid("26f5641a-246d-457b-a96d-07f3fae6acf2"))
COM_INTERFACE_ENTRY(IAccessibleTable2)
COM_INTERFACE_ENTRY(IAccessibleTableCell)
COM_INTERFACE_ENTRY(IAccessibleValue)
+ COM_INTERFACE_ENTRY(IChromeAccessible)
COM_INTERFACE_ENTRY(IExpandCollapseProvider)
COM_INTERFACE_ENTRY(IGridItemProvider)
COM_INTERFACE_ENTRY(IGridProvider)
@@ -408,8 +416,6 @@ class AX_EXPORT __declspec(uuid("26f5641a-246d-457b-a96d-07f3fae6acf2"))
// Clear any AXPlatformRelationWin nodes owned by this node.
void ClearOwnRelations();
- void ForceNewHypertext();
-
// AXPlatformNode overrides.
gfx::NativeViewAccessible GetNativeViewAccessible() override;
void NotifyAccessibilityEvent(ax::mojom::Event event_type) override;
@@ -417,6 +423,7 @@ class AX_EXPORT __declspec(uuid("26f5641a-246d-457b-a96d-07f3fae6acf2"))
// AXPlatformNodeBase overrides.
void Destroy() override;
base::string16 GetValue() const override;
+ bool IsPlatformCheckable() const override;
//
// IAccessible methods.
@@ -1023,6 +1030,19 @@ class AX_EXPORT __declspec(uuid("26f5641a-246d-457b-a96d-07f3fae6acf2"))
IFACEMETHODIMP ShowContextMenu() override;
//
+ // IChromeAccessible methods.
+ //
+
+ IFACEMETHODIMP get_bulkFetch(BSTR input_json,
+ LONG request_id,
+ IChromeAccessibleDelegate* delegate) override;
+
+ IFACEMETHODIMP get_hitTest(LONG screen_physical_pixel_x,
+ LONG screen_physical_pixel_y,
+ LONG request_id,
+ IChromeAccessibleDelegate* delegate) override;
+
+ //
// IServiceProvider methods.
//
@@ -1046,6 +1066,16 @@ class AX_EXPORT __declspec(uuid("26f5641a-246d-457b-a96d-07f3fae6acf2"))
// IRawElementProviderSimple support method.
bool IsPatternProviderSupported(PATTERNID pattern_id);
+ // Prefer GetPatternProviderImpl when calling internally. We should avoid
+ // calling external APIs internally as it will cause the histograms to become
+ // innaccurate.
+ HRESULT GetPatternProviderImpl(PATTERNID pattern_id, IUnknown** result);
+
+ // Prefer GetPropertyValueImpl when calling internally. We should avoid
+ // calling external APIs internally as it will cause the histograms to become
+ // innaccurate.
+ HRESULT GetPropertyValueImpl(PROPERTYID property_id, VARIANT* result);
+
// Helper to return the runtime id (without going through a SAFEARRAY)
using RuntimeIdArray = std::array<int, 2>;
void GetRuntimeIdArray(RuntimeIdArray& runtime_id);
@@ -1123,7 +1153,6 @@ class AX_EXPORT __declspec(uuid("26f5641a-246d-457b-a96d-07f3fae6acf2"))
std::vector<Microsoft::WRL::ComPtr<AXPlatformRelationWin>> relations_;
AXHypertext old_hypertext_;
- bool force_new_hypertext_;
// These protected methods are still used by BrowserAccessibilityComWin. At
// some point post conversion, we can probably move these to be private
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_win_unittest.cc b/chromium/ui/accessibility/platform/ax_platform_node_win_unittest.cc
index 50b78af9642..c7fce2de057 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_win_unittest.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_win_unittest.cc
@@ -11,8 +11,11 @@
#include <memory>
#include "base/auto_reset.h"
+#include "base/json/json_reader.h"
+#include "base/run_loop.h"
#include "base/stl_util.h"
#include "base/test/metrics/histogram_tester.h"
+#include "base/test/task_environment.h"
#include "base/win/atl.h"
#include "base/win/scoped_bstr.h"
#include "base/win/scoped_safearray.h"
@@ -20,6 +23,7 @@
#include "testing/gmock/include/gmock/gmock-matchers.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/iaccessible2/ia2_api_all.h"
+#include "ui/accessibility/accessibility_features.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/accessibility/platform/ax_fragment_root_win.h"
@@ -219,7 +223,10 @@ ScopedVariant SELF(CHILDID_SELF);
testing::UnorderedElementsAreArray(expected_property_values)); \
}
-AXPlatformNodeWinTest::AXPlatformNodeWinTest() {}
+AXPlatformNodeWinTest::AXPlatformNodeWinTest() {
+ scoped_feature_list_.InitAndEnableFeature(features::kIChromeAccessible);
+}
+
AXPlatformNodeWinTest::~AXPlatformNodeWinTest() {}
void AXPlatformNodeWinTest::SetUp() {
@@ -451,6 +458,7 @@ bool TestFragmentRootDelegate::IsAXFragmentRootAControlElement() {
TEST_F(AXPlatformNodeWinTest, IAccessibleDetachedObject) {
AXNodeData root;
root.id = 1;
+ root.role = ax::mojom::Role::kRootWebArea;
root.SetName("Name");
Init(root);
@@ -472,12 +480,14 @@ TEST_F(AXPlatformNodeWinTest, IAccessibleHitTest) {
AXNodeData node1;
node1.id = 2;
+ node1.role = ax::mojom::Role::kGenericContainer;
node1.relative_bounds.bounds = gfx::RectF(0, 0, 10, 10);
node1.SetName("Name1");
root.child_ids.push_back(node1.id);
AXNodeData node2;
node2.id = 3;
+ node2.role = ax::mojom::Role::kGenericContainer;
node2.relative_bounds.bounds = gfx::RectF(20, 20, 20, 20);
node2.SetName("Name2");
root.child_ids.push_back(node2.id);
@@ -512,6 +522,7 @@ TEST_F(AXPlatformNodeWinTest, IAccessibleHitTestDoesNotLoopForever) {
AXNodeData node1;
node1.id = 2;
+ node1.role = ax::mojom::Role::kGenericContainer;
node1.relative_bounds.bounds = gfx::RectF(0, 0, 10, 10);
node1.SetName("Name1");
root.child_ids.push_back(node1.id);
@@ -535,6 +546,7 @@ TEST_F(AXPlatformNodeWinTest, IAccessibleHitTestDoesNotLoopForever) {
TEST_F(AXPlatformNodeWinTest, IAccessibleName) {
AXNodeData root;
root.id = 1;
+ root.role = ax::mojom::Role::kRootWebArea;
root.SetName("Name");
Init(root);
@@ -1928,6 +1940,103 @@ TEST_F(AXPlatformNodeWinTest, IAccessible2GetNRelations) {
// TODO(dougt): Try adding one more relation.
}
+TEST_F(AXPlatformNodeWinTest,
+ IAccessible2TestPopupForRelationMapsToControlledByRelation) {
+ AXNodeData root;
+ root.id = 1;
+ root.role = ax::mojom::Role::kRootWebArea;
+
+ AXNodeData child1;
+ child1.id = 2;
+ child1.role = ax::mojom::Role::kTextField;
+ child1.AddIntListAttribute(ax::mojom::IntListAttribute::kControlsIds, {3});
+ root.child_ids.push_back(2);
+
+ // Add listbox that is popup for the textfield.
+ AXNodeData child2;
+ child2.id = 3;
+ child2.role = ax::mojom::Role::kListBox;
+ child2.AddIntAttribute(ax::mojom::IntAttribute::kPopupForId, 2);
+ root.child_ids.push_back(3);
+
+ Init(root, child1, child2);
+ ComPtr<IAccessible> root_iaccessible(GetRootIAccessible());
+ ComPtr<IAccessible2> root_iaccessible2 = ToIAccessible2(root_iaccessible);
+
+ ComPtr<IDispatch> result;
+ EXPECT_EQ(S_OK, root_iaccessible2->get_accChild(ScopedVariant(1), &result));
+ ComPtr<IAccessible2> ax_child1;
+ EXPECT_EQ(S_OK, result.As(&ax_child1));
+ result.Reset();
+
+ EXPECT_EQ(S_OK, root_iaccessible2->get_accChild(ScopedVariant(2), &result));
+ ComPtr<IAccessible2> ax_child2;
+ EXPECT_EQ(S_OK, result.As(&ax_child2));
+ result.Reset();
+
+ LONG n_relations = 0;
+ LONG n_targets = 0;
+ ScopedBstr relation_type;
+ ComPtr<IAccessibleRelation> controls_relation;
+ ComPtr<IAccessibleRelation> controlled_by_relation;
+ ComPtr<IUnknown> target;
+
+ EXPECT_HRESULT_SUCCEEDED(ax_child1->get_nRelations(&n_relations));
+ EXPECT_EQ(1, n_relations);
+
+ EXPECT_HRESULT_SUCCEEDED(ax_child1->get_relation(0, &controls_relation));
+
+ EXPECT_HRESULT_SUCCEEDED(
+ controls_relation->get_relationType(relation_type.Receive()));
+ EXPECT_EQ(L"controllerFor", base::string16(relation_type.Get()));
+
+ relation_type.Reset();
+
+ EXPECT_HRESULT_SUCCEEDED(controls_relation->get_nTargets(&n_targets));
+ EXPECT_EQ(1, n_targets);
+
+ EXPECT_HRESULT_SUCCEEDED(controls_relation->get_target(0, &target));
+ target.Reset();
+
+ controls_relation.Reset();
+
+ // Test the controlled by relation, mapped from the popup for relation.
+ EXPECT_HRESULT_SUCCEEDED(ax_child2->get_nRelations(&n_relations));
+ // The test is currently outsmarting us, and automatically mapping the
+ // reverse relation in addition to mapping the popup for -> controlled by.
+ // Therefore, the same relation will exist twice in this test, which
+ // actually shows that the popup for -> controlled by relation is working.
+ // As a result, both relations should have the same result in this test.
+ EXPECT_EQ(2, n_relations);
+
+ // Both relations should have the same result in this test.
+ EXPECT_HRESULT_SUCCEEDED(ax_child2->get_relation(0, &controlled_by_relation));
+ EXPECT_HRESULT_SUCCEEDED(
+ controlled_by_relation->get_relationType(relation_type.Receive()));
+ EXPECT_EQ(L"controlledBy", base::string16(relation_type.Get()));
+ relation_type.Reset();
+
+ EXPECT_HRESULT_SUCCEEDED(controlled_by_relation->get_nTargets(&n_targets));
+ EXPECT_EQ(1, n_targets);
+
+ EXPECT_HRESULT_SUCCEEDED(controlled_by_relation->get_target(0, &target));
+ target.Reset();
+ controlled_by_relation.Reset();
+
+ // Both relations should have the same result in this test.
+ EXPECT_HRESULT_SUCCEEDED(ax_child2->get_relation(1, &controlled_by_relation));
+ EXPECT_HRESULT_SUCCEEDED(
+ controlled_by_relation->get_relationType(relation_type.Receive()));
+ EXPECT_EQ(L"controlledBy", base::string16(relation_type.Get()));
+ relation_type.Reset();
+
+ EXPECT_HRESULT_SUCCEEDED(controlled_by_relation->get_nTargets(&n_targets));
+ EXPECT_EQ(1, n_targets);
+
+ EXPECT_HRESULT_SUCCEEDED(controlled_by_relation->get_target(0, &target));
+ target.Reset();
+}
+
TEST_F(AXPlatformNodeWinTest, DISABLED_TestRelationTargetsOfType) {
AXNodeData root;
root.id = 1;
@@ -3474,6 +3583,124 @@ TEST_F(AXPlatformNodeWinTest, ITableProviderGetColumnHeaders) {
EXPECT_EQ(nullptr, safearray.Get());
}
+TEST_F(AXPlatformNodeWinTest, ITableProviderGetColumnHeadersMultipleHeaders) {
+ // Build a table like this:
+ // header_r1c1 | header_r1c2 | header_r1c3
+ // cell_r2c1 | cell_r2c2 | cell_r2c3
+ // cell_r3c1 | header_r3c2 |
+
+ // <table>
+ // <tr aria-label="row1">
+ // <th>header_r1c1</th>
+ // <th>header_r1c2</th>
+ // <th>header_r1c3</th>
+ // </tr>
+ // <tr aria-label="row2">
+ // <td>cell_r2c1</td>
+ // <td>cell_r2c2</td>
+ // <td>cell_r2c3</td>
+ // </tr>
+ // <tr aria-label="row3">
+ // <td>cell_r3c1</td>
+ // <th>header_r3c2</th>
+ // </tr>
+ // </table>
+
+ AXNodeData root;
+ root.id = 1;
+ root.role = ax::mojom::Role::kTable;
+
+ AXNodeData row1;
+ row1.id = 2;
+ row1.role = ax::mojom::Role::kRow;
+ root.child_ids.push_back(row1.id);
+
+ AXNodeData row2;
+ row2.id = 3;
+ row2.role = ax::mojom::Role::kRow;
+ root.child_ids.push_back(row2.id);
+
+ AXNodeData row3;
+ row3.id = 4;
+ row3.role = ax::mojom::Role::kRow;
+ root.child_ids.push_back(row3.id);
+
+ // <tr aria-label="row1">
+ // <th>header_r1c1</th> <th>header_r1c2</th> <th>header_r1c3</th>
+ // </tr>
+ AXNodeData header_r1c1;
+ header_r1c1.id = 5;
+ header_r1c1.role = ax::mojom::Role::kColumnHeader;
+ header_r1c1.SetName(L"header_r1c1");
+ row1.child_ids.push_back(header_r1c1.id);
+
+ AXNodeData header_r1c2;
+ header_r1c2.id = 6;
+ header_r1c2.role = ax::mojom::Role::kColumnHeader;
+ header_r1c2.SetName(L"header_r1c2");
+ row1.child_ids.push_back(header_r1c2.id);
+
+ AXNodeData header_r1c3;
+ header_r1c3.id = 7;
+ header_r1c3.role = ax::mojom::Role::kColumnHeader;
+ header_r1c3.SetName(L"header_r1c3");
+ row1.child_ids.push_back(header_r1c3.id);
+
+ // <tr aria-label="row2">
+ // <td>cell_r2c1</td> <td>cell_r2c2</td> <td>cell_r2c3</td>
+ // </tr>
+ AXNodeData cell_r2c1;
+ cell_r2c1.id = 8;
+ cell_r2c1.role = ax::mojom::Role::kCell;
+ cell_r2c1.SetName(L"cell_r2c1");
+ row2.child_ids.push_back(cell_r2c1.id);
+
+ AXNodeData cell_r2c2;
+ cell_r2c2.id = 9;
+ cell_r2c2.role = ax::mojom::Role::kCell;
+ cell_r2c2.SetName(L"cell_r2c2");
+ row2.child_ids.push_back(cell_r2c2.id);
+
+ AXNodeData cell_r2c3;
+ cell_r2c3.id = 10;
+ cell_r2c3.role = ax::mojom::Role::kCell;
+ cell_r2c3.SetName(L"cell_r2c3");
+ row2.child_ids.push_back(cell_r2c3.id);
+
+ // <tr aria-label="row3">
+ // <td>cell_r3c1</td> <th>header_r3c2</th>
+ // </tr>
+ AXNodeData cell_r3c1;
+ cell_r3c1.id = 11;
+ cell_r3c1.role = ax::mojom::Role::kCell;
+ cell_r3c1.SetName(L"cell_r3c1");
+ row3.child_ids.push_back(cell_r3c1.id);
+
+ AXNodeData header_r3c2;
+ header_r3c2.id = 12;
+ header_r3c2.role = ax::mojom::Role::kColumnHeader;
+ header_r3c2.SetName(L"header_r3c2");
+ row3.child_ids.push_back(header_r3c2.id);
+
+ Init(root, row1, row2, row3, header_r1c1, header_r1c2, header_r1c3, cell_r2c1,
+ cell_r2c2, cell_r2c3, cell_r3c1, header_r3c2);
+
+ ComPtr<ITableProvider> root_itableprovider(
+ QueryInterfaceFromNode<ITableProvider>(GetRootAsAXNode()));
+
+ base::win::ScopedSafearray safearray;
+ EXPECT_HRESULT_SUCCEEDED(
+ root_itableprovider->GetColumnHeaders(safearray.Receive()));
+ EXPECT_NE(nullptr, safearray.Get());
+
+ // Validate that we retrieve all column headers of the table and in the order
+ // below.
+ std::vector<std::wstring> expected_names = {L"header_r1c1", L"header_r1c2",
+ L"header_r3c2", L"header_r1c3"};
+ EXPECT_UIA_ELEMENT_ARRAY_BSTR_EQ(safearray.Get(), UIA_NamePropertyId,
+ expected_names);
+}
+
TEST_F(AXPlatformNodeWinTest, ITableProviderGetRowHeaders) {
AXNodeData root;
root.id = 1;
@@ -3690,6 +3917,7 @@ TEST_F(AXPlatformNodeWinTest, IA2GetAttribute) {
TEST_F(AXPlatformNodeWinTest, UIAGetPropertySimple) {
AXNodeData root;
+ root.role = ax::mojom::Role::kList;
root.SetName("fake name");
root.AddStringAttribute(ax::mojom::StringAttribute::kAccessKey, "Ctrl+Q");
root.AddStringAttribute(ax::mojom::StringAttribute::kLanguage, "en-us");
@@ -3699,7 +3927,6 @@ TEST_F(AXPlatformNodeWinTest, UIAGetPropertySimple) {
root.AddIntAttribute(ax::mojom::IntAttribute::kSetSize, 2);
root.AddIntAttribute(ax::mojom::IntAttribute::kInvalidState, 1);
root.id = 1;
- root.role = ax::mojom::Role::kList;
AXNodeData child1;
child1.id = 2;
@@ -3725,7 +3952,8 @@ TEST_F(AXPlatformNodeWinTest, UIAGetPropertySimple) {
EXPECT_UIA_BSTR_EQ(root_node, UIA_AriaPropertiesPropertyId,
L"readonly=true;expanded=false;multiline=false;"
L"multiselectable=false;required=false;setsize=2");
- EXPECT_UIA_BSTR_EQ(root_node, UIA_CulturePropertyId, L"en-us");
+ constexpr int en_us_lcid = 1033;
+ EXPECT_UIA_INT_EQ(root_node, UIA_CulturePropertyId, en_us_lcid);
EXPECT_UIA_BSTR_EQ(root_node, UIA_NamePropertyId, L"fake name");
EXPECT_UIA_INT_EQ(root_node, UIA_ControlTypePropertyId,
int{UIA_ListControlTypeId});
@@ -3814,6 +4042,93 @@ TEST_F(AXPlatformNodeWinTest, UIAGetPropertyValueIsDialog) {
UIA_IsDialogPropertyId, true);
}
+TEST_F(AXPlatformNodeWinTest,
+ UIAGetPropertyValueIsControlElementIgnoredInvisible) {
+ AXNodeData root;
+ root.id = 1;
+ root.role = ax::mojom::Role::kRootWebArea;
+ root.child_ids = {2, 3, 4, 5, 6, 7, 8};
+
+ AXNodeData normal_button;
+ normal_button.id = 2;
+ normal_button.role = ax::mojom::Role::kButton;
+
+ AXNodeData ignored_button;
+ ignored_button.id = 3;
+ ignored_button.role = ax::mojom::Role::kButton;
+ ignored_button.AddState(ax::mojom::State::kIgnored);
+
+ AXNodeData invisible_button;
+ invisible_button.id = 4;
+ invisible_button.role = ax::mojom::Role::kButton;
+ invisible_button.AddState(ax::mojom::State::kInvisible);
+
+ AXNodeData invisible_focusable_button;
+ invisible_focusable_button.id = 5;
+ invisible_focusable_button.role = ax::mojom::Role::kButton;
+ invisible_focusable_button.AddState(ax::mojom::State::kInvisible);
+ invisible_focusable_button.AddState(ax::mojom::State::kFocusable);
+
+ AXNodeData focusable_generic_container;
+ focusable_generic_container.id = 6;
+ focusable_generic_container.role = ax::mojom::Role::kGenericContainer;
+ focusable_generic_container.AddState(ax::mojom::State::kFocusable);
+
+ AXNodeData ignored_focusable_generic_container;
+ ignored_focusable_generic_container.id = 7;
+ ignored_focusable_generic_container.role = ax::mojom::Role::kGenericContainer;
+ ignored_focusable_generic_container.AddState(ax::mojom::State::kIgnored);
+ focusable_generic_container.AddState(ax::mojom::State::kFocusable);
+
+ AXNodeData invisible_focusable_generic_container;
+ invisible_focusable_generic_container.id = 8;
+ invisible_focusable_generic_container.role =
+ ax::mojom::Role::kGenericContainer;
+ invisible_focusable_generic_container.AddState(ax::mojom::State::kInvisible);
+ invisible_focusable_generic_container.AddState(ax::mojom::State::kFocusable);
+
+ Init(root, normal_button, ignored_button, invisible_button,
+ invisible_focusable_button, focusable_generic_container,
+ ignored_focusable_generic_container,
+ invisible_focusable_generic_container);
+
+ // Turn on web content mode for the AXTree.
+ TestAXNodeWrapper::SetGlobalIsWebContent(true);
+
+ // Normal button (id=2), no invisible or ignored state set. Should be a
+ // control element.
+ EXPECT_UIA_BOOL_EQ(GetIRawElementProviderSimpleFromChildIndex(0),
+ UIA_IsControlElementPropertyId, true);
+
+ // Button with ignored state (id=3). Should not be a control element.
+ EXPECT_UIA_BOOL_EQ(GetIRawElementProviderSimpleFromChildIndex(1),
+ UIA_IsControlElementPropertyId, false);
+
+ // Button with invisible state (id=4). Should not be a control element.
+ EXPECT_UIA_BOOL_EQ(GetIRawElementProviderSimpleFromChildIndex(2),
+ UIA_IsControlElementPropertyId, false);
+
+ // Button with invisible state, but focusable (id=5). Should not be a control
+ // element.
+ EXPECT_UIA_BOOL_EQ(GetIRawElementProviderSimpleFromChildIndex(3),
+ UIA_IsControlElementPropertyId, false);
+
+ // Generic container, focusable (id=6). Should be a control
+ // element.
+ EXPECT_UIA_BOOL_EQ(GetIRawElementProviderSimpleFromChildIndex(4),
+ UIA_IsControlElementPropertyId, true);
+
+ // Generic container, ignored but focusable (id=7). Should not be a control
+ // element.
+ EXPECT_UIA_BOOL_EQ(GetIRawElementProviderSimpleFromChildIndex(5),
+ UIA_IsControlElementPropertyId, false);
+
+ // Generic container, invisible and ignored, but focusable (id=8). Should not
+ // be a control element.
+ EXPECT_UIA_BOOL_EQ(GetIRawElementProviderSimpleFromChildIndex(6),
+ UIA_IsControlElementPropertyId, false);
+}
+
TEST_F(AXPlatformNodeWinTest, UIAGetControllerForPropertyId) {
AXNodeData root;
root.id = 1;
@@ -6251,6 +6566,65 @@ TEST_F(AXPlatformNodeWinTest, ISelectionItemProviderGetSelectionContainer) {
EXPECT_EQ(container, container_provider);
}
+TEST_F(AXPlatformNodeWinTest, ISelectionItemProviderSelectFollowFocus) {
+ AXNodeData root;
+ root.id = 1;
+ root.role = ax::mojom::Role::kTabList;
+
+ AXNodeData tab1;
+ tab1.id = 2;
+ tab1.role = ax::mojom::Role::kTab;
+ tab1.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, false);
+ tab1.SetDefaultActionVerb(ax::mojom::DefaultActionVerb::kClick);
+ root.child_ids.push_back(tab1.id);
+
+ Init(root, tab1);
+
+ auto* tab1_node = GetRootAsAXNode()->children()[0];
+ ComPtr<IRawElementProviderSimple> tab1_raw_element_provider_simple =
+ QueryInterfaceFromNode<IRawElementProviderSimple>(tab1_node);
+ ASSERT_NE(nullptr, tab1_raw_element_provider_simple.Get());
+
+ ComPtr<IRawElementProviderFragment> tab1_raw_element_provider_fragment =
+ IRawElementProviderFragmentFromNode(tab1_node);
+ ASSERT_NE(nullptr, tab1_raw_element_provider_fragment.Get());
+
+ ComPtr<ISelectionItemProvider> tab1_selection_item_provider;
+ EXPECT_HRESULT_SUCCEEDED(tab1_raw_element_provider_simple->GetPatternProvider(
+ UIA_SelectionItemPatternId, &tab1_selection_item_provider));
+ ASSERT_NE(nullptr, tab1_selection_item_provider.Get());
+
+ BOOL is_selected;
+ // Before setting focus to "tab1", validate that "tab1" has selected=false.
+ tab1_selection_item_provider->get_IsSelected(&is_selected);
+ EXPECT_FALSE(is_selected);
+
+ // Setting focus on "tab1" will result in selected=true.
+ tab1_raw_element_provider_fragment->SetFocus();
+ tab1_selection_item_provider->get_IsSelected(&is_selected);
+ EXPECT_TRUE(is_selected);
+
+ // Verify that we can still trigger action::kDoDefault through Select().
+ EXPECT_HRESULT_SUCCEEDED(tab1_selection_item_provider->Select());
+ tab1_selection_item_provider->get_IsSelected(&is_selected);
+ EXPECT_TRUE(is_selected);
+ EXPECT_EQ(tab1_node, TestAXNodeWrapper::GetNodeFromLastDefaultAction());
+ // Verify that after Select(), "tab1" is still selected.
+ tab1_selection_item_provider->get_IsSelected(&is_selected);
+ EXPECT_TRUE(is_selected);
+
+ // Since last Select() performed |action::kDoDefault|, which set
+ // |kSelectedFromFocus| to false. Calling Select() again will not perform
+ // |action::kDoDefault| again.
+ TestAXNodeWrapper::SetNodeFromLastDefaultAction(nullptr);
+ EXPECT_HRESULT_SUCCEEDED(tab1_selection_item_provider->Select());
+ tab1_selection_item_provider->get_IsSelected(&is_selected);
+ EXPECT_TRUE(is_selected);
+ // Verify that after Select(),|action::kDoDefault| was not triggered on
+ // "tab1".
+ EXPECT_EQ(nullptr, TestAXNodeWrapper::GetNodeFromLastDefaultAction());
+}
+
TEST_F(AXPlatformNodeWinTest, IValueProvider_GetValue) {
AXNodeData root;
root.id = 1;
@@ -6512,4 +6886,120 @@ TEST_F(AXPlatformNodeWinTest, SanitizeStringAttributeForIA2) {
EXPECT_EQ("\\\\\\:\\=\\,\\;", output);
}
+//
+// IChromeAccessible tests
+//
+
+class TestIChromeAccessibleDelegate
+ : public CComObjectRootEx<CComMultiThreadModel>,
+ public IDispatchImpl<IChromeAccessibleDelegate> {
+ using IDispatchImpl::Invoke;
+
+ public:
+ BEGIN_COM_MAP(TestIChromeAccessibleDelegate)
+ COM_INTERFACE_ENTRY(IChromeAccessibleDelegate)
+ END_COM_MAP()
+
+ TestIChromeAccessibleDelegate() = default;
+ ~TestIChromeAccessibleDelegate() = default;
+
+ std::string WaitForBulkFetchResult(LONG expected_request_id) {
+ if (bulk_fetch_result_.empty())
+ WaitUsingRunLoop();
+ CHECK_EQ(expected_request_id, request_id_);
+ return bulk_fetch_result_;
+ }
+
+ IUnknown* WaitForHitTestResult(LONG expected_request_id) {
+ if (!hit_test_result_)
+ WaitUsingRunLoop();
+ CHECK_EQ(expected_request_id, request_id_);
+ return hit_test_result_.Get();
+ }
+
+ private:
+ void WaitUsingRunLoop() {
+ base::RunLoop run_loop;
+ run_loop_quit_closure_ = run_loop.QuitClosure();
+ run_loop.Run();
+ }
+
+ IFACEMETHODIMP put_bulkFetchResult(LONG request_id, BSTR result) override {
+ bulk_fetch_result_ = base::WideToUTF8(result);
+ request_id_ = request_id;
+ if (run_loop_quit_closure_)
+ run_loop_quit_closure_.Run();
+ return S_OK;
+ }
+
+ IFACEMETHODIMP put_hitTestResult(LONG request_id, IUnknown* result) override {
+ hit_test_result_ = result;
+ request_id_ = request_id;
+ if (run_loop_quit_closure_)
+ run_loop_quit_closure_.Run();
+ return S_OK;
+ }
+
+ std::string bulk_fetch_result_;
+ ComPtr<IUnknown> hit_test_result_;
+ LONG request_id_ = 0;
+ base::RepeatingClosure run_loop_quit_closure_;
+};
+
+// http://crbug.com/1087206: failing on Win7 builders.
+TEST_F(AXPlatformNodeWinTest, DISABLED_BulkFetch) {
+ base::test::SingleThreadTaskEnvironment task_environment;
+ AXNodeData root;
+ root.id = 1;
+ root.role = ax::mojom::Role::kScrollBar;
+
+ Init(root);
+
+ ComPtr<IChromeAccessible> chrome_accessible =
+ QueryInterfaceFromNode<IChromeAccessible>(GetRootAsAXNode());
+
+ CComObject<TestIChromeAccessibleDelegate>* delegate = nullptr;
+ ASSERT_HRESULT_SUCCEEDED(
+ CComObject<TestIChromeAccessibleDelegate>::CreateInstance(&delegate));
+ ScopedBstr input_bstr(L"Potato");
+ chrome_accessible->get_bulkFetch(input_bstr.Get(), 99, delegate);
+ std::string response = delegate->WaitForBulkFetchResult(99);
+
+ // Note: base::JSONReader is fine for unit tests, but production code
+ // that parses untrusted JSON should always use DataDecoder instead.
+ base::Optional<base::Value> result =
+ base::JSONReader::Read(response, base::JSON_ALLOW_TRAILING_COMMAS);
+ ASSERT_TRUE(result);
+ ASSERT_TRUE(result->FindKey("role"));
+ ASSERT_EQ("scrollBar", result->FindKey("role")->GetString());
+}
+
+TEST_F(AXPlatformNodeWinTest, AsyncHitTest) {
+ base::test::SingleThreadTaskEnvironment task_environment;
+ AXNodeData root;
+ root.id = 50;
+ root.role = ax::mojom::Role::kArticle;
+ root.relative_bounds.bounds = gfx::RectF(0, 0, 800, 600);
+
+ Init(root);
+
+ ComPtr<IChromeAccessible> chrome_accessible =
+ QueryInterfaceFromNode<IChromeAccessible>(GetRootAsAXNode());
+
+ CComObject<TestIChromeAccessibleDelegate>* delegate = nullptr;
+ ASSERT_HRESULT_SUCCEEDED(
+ CComObject<TestIChromeAccessibleDelegate>::CreateInstance(&delegate));
+ ScopedBstr input_bstr(L"Potato");
+ chrome_accessible->get_hitTest(400, 300, 12345, delegate);
+ ComPtr<IUnknown> result = delegate->WaitForHitTestResult(12345);
+ ComPtr<IAccessible2> accessible = ToIAccessible2(result);
+ LONG result_unique_id = 0;
+ ASSERT_HRESULT_SUCCEEDED(accessible->get_uniqueID(&result_unique_id));
+ ComPtr<IAccessible2> root_accessible =
+ QueryInterfaceFromNode<IAccessible2>(GetRootAsAXNode());
+ LONG root_unique_id = 0;
+ ASSERT_HRESULT_SUCCEEDED(root_accessible->get_uniqueID(&root_unique_id));
+ ASSERT_EQ(root_unique_id, result_unique_id);
+}
+
} // namespace ui
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_win_unittest.h b/chromium/ui/accessibility/platform/ax_platform_node_win_unittest.h
index 400be7c18c3..1fb54910d86 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_win_unittest.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_win_unittest.h
@@ -10,6 +10,7 @@
#include <memory>
#include <unordered_set>
+#include "base/test/scoped_feature_list.h"
#include "ui/accessibility/platform/ax_fragment_root_delegate_win.h"
#include "ui/base/win/accessibility_misc_utils.h"
@@ -98,6 +99,8 @@ class AXPlatformNodeWinTest : public AXPlatformNodeTest {
std::unique_ptr<AXFragmentRootWin> ax_fragment_root_;
std::unique_ptr<TestFragmentRootDelegate> test_fragment_root_delegate_;
+
+ base::test::ScopedFeatureList scoped_feature_list_;
};
} // namespace ui
diff --git a/chromium/ui/accessibility/platform/ax_platform_relation_win.cc b/chromium/ui/accessibility/platform/ax_platform_relation_win.cc
index 5f03ec806bf..eee92e3b9cb 100644
--- a/chromium/ui/accessibility/platform/ax_platform_relation_win.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_relation_win.cc
@@ -43,6 +43,12 @@ base::string16 GetIA2RelationFromIntAttr(ax::mojom::IntAttribute attribute) {
return IA2_RELATION_MEMBER_OF;
case ax::mojom::IntAttribute::kErrormessageId:
return IA2_RELATION_ERROR;
+ case ax::mojom::IntAttribute::kPopupForId:
+ // Map "popup for" to "controlled by".
+ // Unlike ATK there is no special IA2 popup-for relationship, but it can
+ // be exposed via the controlled by relation, which is also computed for
+ // content as the reverse of the controls relationship.
+ return IA2_RELATION_CONTROLLED_BY;
default:
break;
}
diff --git a/chromium/ui/accessibility/platform/ichromeaccessible.idl b/chromium/ui/accessibility/platform/ichromeaccessible.idl
new file mode 100644
index 00000000000..f3567d1ba74
--- /dev/null
+++ b/chromium/ui/accessibility/platform/ichromeaccessible.idl
@@ -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.
+
+import "objidl.idl";
+import "oaidl.idl";
+
+const long DISPID_CHROME_BULK_FETCH = -1600;
+const long DISPID_CHROME_ON_BULK_FETCH_RESULT = -1601;
+const long DISPID_CHROME_HIT_TEST = -1602;
+const long DISPID_CHROME_ON_HIT_TEST_RESULT = -1603;
+
+// Interface to be implemented by the client that calls IChromeAccessible.
+// For every method in IChromeAccessible, there's a corresponding response
+// method in IChromeAccessibleDelegate.
+[object, uuid(0e3edc14-79f4-413f-b854-d3b6860d74a2), pointer_default(unique)]
+interface IChromeAccessibleDelegate : IUnknown
+{
+ [propput, id(DISPID_CHROME_ON_BULK_FETCH_RESULT)] HRESULT bulkFetchResult(
+ [in] LONG requestID,
+ [in] BSTR resultJson
+ );
+
+ [propput, id(DISPID_CHROME_ON_HIT_TEST_RESULT)] HRESULT hitTestResult(
+ [in] LONG requestID,
+ [in] IUnknown* result
+ );
+};
+
+// Chrome-specific interface exposed on every IAccessible object.
+//
+// This interface is EXPERIMENTAL and only available behind a flag.
+// Run Chrome with --enable-features=IChromeAccessible to use it.
+//
+// Do not depend on this interface remaining stable! It's only designed
+// for prototyping ideas, and anything that's stabilized should move to
+// an open standard API.
+[object, uuid(6175bd95-3b2e-4ebc-bc51-9cab782bec92), pointer_default(unique)]
+interface IChromeAccessible : IUnknown
+{
+ // TODO(crbug.com/1083834): Fully document this interface.
+ // Fetch multiple accessibility properties of one or more accessibility
+ // nodes as JSON. This method is asynchronous; the result is returned
+ // by calling put_bulkFetchResult on |delegate|. The client can pass any
+ // valid LONG as requestID and the same value will be passed to
+ // put_bulkFetchResult to enable matching of requests and responses.
+ [propget, id(DISPID_CHROME_BULK_FETCH)] HRESULT bulkFetch(
+ [in] BSTR inputJson,
+ [in] LONG requestID,
+ [in] IChromeAccessibleDelegate* delegate
+ );
+
+ // Hit-test the given pixel in screen physical pixel coordinates.
+ // This method is asynchronous; the result is returned
+ // by calling put_hitTestResult on |delegate|. The client can pass any
+ // valid LONG as requestID and the same value will be passed to
+ // put_hitTestResult to enable matching of requests and responses.
+ [propget, id(DISPID_CHROME_HIT_TEST)] HRESULT hitTest(
+ [in] LONG screenPhysicalPixelX,
+ [in] LONG screenPhysicalPixelY,
+ [in] LONG requestID,
+ [in] IChromeAccessibleDelegate* delegate
+ );
+};
diff --git a/chromium/ui/accessibility/platform/test_ax_node_wrapper.cc b/chromium/ui/accessibility/platform/test_ax_node_wrapper.cc
index 85283d36f99..873ab5c1985 100644
--- a/chromium/ui/accessibility/platform/test_ax_node_wrapper.cc
+++ b/chromium/ui/accessibility/platform/test_ax_node_wrapper.cc
@@ -99,6 +99,11 @@ const AXNode* TestAXNodeWrapper::GetNodeFromLastDefaultAction() {
}
// static
+void TestAXNodeWrapper::SetNodeFromLastDefaultAction(AXNode* node) {
+ g_node_from_last_default_action = node;
+}
+
+// static
std::unique_ptr<base::AutoReset<float>> TestAXNodeWrapper::SetScaleFactor(
float value) {
return std::make_unique<base::AutoReset<float>>(&g_scale_factor, value);
@@ -459,30 +464,22 @@ base::Optional<bool> TestAXNodeWrapper::GetTableHasColumnOrRowHeaderNode()
return node_->GetTableHasColumnOrRowHeaderNode();
}
-std::vector<int32_t> TestAXNodeWrapper::GetColHeaderNodeIds() const {
- std::vector<int32_t> header_ids;
- node_->GetTableCellColHeaderNodeIds(&header_ids);
- return header_ids;
+std::vector<AXNode::AXID> TestAXNodeWrapper::GetColHeaderNodeIds() const {
+ return node_->GetTableColHeaderNodeIds();
}
-std::vector<int32_t> TestAXNodeWrapper::GetColHeaderNodeIds(
+std::vector<AXNode::AXID> TestAXNodeWrapper::GetColHeaderNodeIds(
int col_index) const {
- std::vector<int32_t> header_ids;
- node_->GetTableColHeaderNodeIds(col_index, &header_ids);
- return header_ids;
+ return node_->GetTableColHeaderNodeIds(col_index);
}
-std::vector<int32_t> TestAXNodeWrapper::GetRowHeaderNodeIds() const {
- std::vector<int32_t> header_ids;
- node_->GetTableCellRowHeaderNodeIds(&header_ids);
- return header_ids;
+std::vector<AXNode::AXID> TestAXNodeWrapper::GetRowHeaderNodeIds() const {
+ return node_->GetTableCellRowHeaderNodeIds();
}
-std::vector<int32_t> TestAXNodeWrapper::GetRowHeaderNodeIds(
+std::vector<AXNode::AXID> TestAXNodeWrapper::GetRowHeaderNodeIds(
int row_index) const {
- std::vector<int32_t> header_ids;
- node_->GetTableRowHeaderNodeIds(row_index, &header_ids);
- return header_ids;
+ return node_->GetTableRowHeaderNodeIds(row_index);
}
bool TestAXNodeWrapper::IsTableRow() const {
@@ -586,6 +583,15 @@ bool TestAXNodeWrapper::AccessibilityPerformAction(
}
case ax::mojom::Action::kDoDefault: {
+ // If a default action such as a click is performed on an element, it
+ // could result in a selected state change. In which case, the element's
+ // selected state no longer comes from focus action, so we should set
+ // |kSelectedFromFocus| to false.
+ if (GetData().HasBoolAttribute(
+ ax::mojom::BoolAttribute::kSelectedFromFocus))
+ ReplaceBoolAttribute(ax::mojom::BoolAttribute::kSelectedFromFocus,
+ false);
+
switch (GetData().role) {
case ax::mojom::Role::kListBoxOption:
case ax::mojom::Role::kCell: {
@@ -611,7 +617,7 @@ bool TestAXNodeWrapper::AccessibilityPerformAction(
default:
break;
}
- g_node_from_last_default_action = node_;
+ SetNodeFromLastDefaultAction(node_);
return true;
}
@@ -636,9 +642,21 @@ bool TestAXNodeWrapper::AccessibilityPerformAction(
return true;
}
- case ax::mojom::Action::kFocus:
+ case ax::mojom::Action::kFocus: {
g_focused_node_in_tree[tree_] = node_;
+
+ // The platform has select follows focus behavior:
+ // https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_selection_follows_focus
+ // For test purpose, we support select follows focus for all elements, and
+ // not just single-selection container elements.
+ if (SupportsSelected(GetData().role)) {
+ ReplaceBoolAttribute(ax::mojom::BoolAttribute::kSelected, true);
+ ReplaceBoolAttribute(ax::mojom::BoolAttribute::kSelectedFromFocus,
+ true);
+ }
+
return true;
+ }
case ax::mojom::Action::kShowContextMenu:
g_node_from_last_show_context_menu = node_;
diff --git a/chromium/ui/accessibility/platform/test_ax_node_wrapper.h b/chromium/ui/accessibility/platform/test_ax_node_wrapper.h
index 2f0998c7bab..4cd51d5874c 100644
--- a/chromium/ui/accessibility/platform/test_ax_node_wrapper.h
+++ b/chromium/ui/accessibility/platform/test_ax_node_wrapper.h
@@ -41,6 +41,10 @@ class TestAXNodeWrapper : public AXPlatformNodeDelegateBase {
// called from for testing.
static const AXNode* GetNodeFromLastDefaultAction();
+ // Set the last node which AccessibilityPerformAction default action was
+ // called for testing.
+ static void SetNodeFromLastDefaultAction(AXNode* node);
+
// Set a global scale factor for testing.
static std::unique_ptr<base::AutoReset<float>> SetScaleFactor(float value);
diff --git a/chromium/ui/accessibility/platform/uia_registrar_win.cc b/chromium/ui/accessibility/platform/uia_registrar_win.cc
new file mode 100644
index 00000000000..bd6ca8f56aa
--- /dev/null
+++ b/chromium/ui/accessibility/platform/uia_registrar_win.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/accessibility/platform/uia_registrar_win.h"
+#include <wrl/implements.h>
+#include "base/stl_util.h"
+
+namespace ui {
+
+UiaRegistrarWin::UiaRegistrarWin() {
+ // Create the registrar object and get the IUIAutomationRegistrar
+ // interface pointer.
+ Microsoft::WRL::ComPtr<IUIAutomationRegistrar> registrar;
+ if (FAILED(CoCreateInstance(CLSID_CUIAutomationRegistrar, nullptr,
+ CLSCTX_INPROC_SERVER, IID_IUIAutomationRegistrar,
+ &registrar)))
+ return;
+
+ // Register the custom UIA property that represents the unique id of an UIA
+ // element which also matches its corresponding IA2 element's unique id.
+ UIAutomationPropertyInfo unique_id_property_info = {
+ kUiaPropertyUniqueIdGuid, L"UniqueId", UIAutomationType_String};
+ registrar->RegisterProperty(&unique_id_property_info,
+ &uia_unique_id_property_id_);
+
+ // Register the custom UIA event that represents the test end event for the
+ // UIA test suite.
+ UIAutomationEventInfo test_complete_event_info = {
+ kUiaEventTestCompleteSentinelGuid, L"kUiaTestCompleteSentinel"};
+ registrar->RegisterEvent(&test_complete_event_info,
+ &uia_test_complete_event_id_);
+}
+
+UiaRegistrarWin::~UiaRegistrarWin() = default;
+
+PROPERTYID UiaRegistrarWin::GetUiaUniqueIdPropertyId() const {
+ return uia_unique_id_property_id_;
+}
+
+EVENTID UiaRegistrarWin::GetUiaTestCompleteEventId() const {
+ return uia_test_complete_event_id_;
+}
+
+const UiaRegistrarWin& UiaRegistrarWin::GetInstance() {
+ static base::NoDestructor<UiaRegistrarWin> instance;
+ return *instance;
+}
+
+} // namespace ui
diff --git a/chromium/ui/accessibility/platform/uia_registrar_win.h b/chromium/ui/accessibility/platform/uia_registrar_win.h
new file mode 100644
index 00000000000..53c8da4fe37
--- /dev/null
+++ b/chromium/ui/accessibility/platform/uia_registrar_win.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_ACCESSIBILITY_PLATFORM_UIA_REGISTRAR_WIN_H_
+#define UI_ACCESSIBILITY_PLATFORM_UIA_REGISTRAR_WIN_H_
+
+#include <objbase.h>
+#include <uiautomation.h>
+#include "base/macros.h"
+#include "base/no_destructor.h"
+#include "ui/accessibility/ax_export.h"
+
+namespace ui {
+// {3761326A-34B2-465A-835D-7A3D8F4EFB92}
+static const GUID kUiaEventTestCompleteSentinelGuid = {
+ 0x3761326a,
+ 0x34b2,
+ 0x465a,
+ {0x83, 0x5d, 0x7a, 0x3d, 0x8f, 0x4e, 0xfb, 0x92}};
+
+// {cc7eeb32-4b62-4f4c-aff6-1c2e5752ad8e}
+static const GUID kUiaPropertyUniqueIdGuid = {
+ 0xcc7eeb32,
+ 0x4b62,
+ 0x4f4c,
+ {0xaf, 0xf6, 0x1c, 0x2e, 0x57, 0x52, 0xad, 0x8e}};
+
+class AX_EXPORT UiaRegistrarWin {
+ public:
+ UiaRegistrarWin();
+ ~UiaRegistrarWin();
+ PROPERTYID GetUiaUniqueIdPropertyId() const;
+ EVENTID GetUiaTestCompleteEventId() const;
+
+ static const UiaRegistrarWin& GetInstance();
+
+ private:
+ PROPERTYID uia_unique_id_property_id_ = 0;
+ EVENTID uia_test_complete_event_id_ = 0;
+};
+
+} // namespace ui
+
+#endif // UI_ACCESSIBILITY_PLATFORM_UIA_REGISTRAR_WIN_H_
diff --git a/chromium/ui/accessibility/test_ax_node_helper.cc b/chromium/ui/accessibility/test_ax_node_helper.cc
new file mode 100644
index 00000000000..ba257f7fffe
--- /dev/null
+++ b/chromium/ui/accessibility/test_ax_node_helper.cc
@@ -0,0 +1,204 @@
+// 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/test_ax_node_helper.h"
+
+#include <map>
+#include <utility>
+
+#include "base/numerics/ranges.h"
+#include "base/stl_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "ui/accessibility/ax_action_data.h"
+#include "ui/accessibility/ax_role_properties.h"
+#include "ui/accessibility/ax_table_info.h"
+#include "ui/accessibility/ax_tree_observer.h"
+#include "ui/gfx/geometry/rect_conversions.h"
+
+namespace ui {
+
+namespace {
+
+// A global map from AXNodes to TestAXNodeHelpers.
+std::map<AXNode::AXID, TestAXNodeHelper*> g_node_id_to_helper_map;
+
+// A simple implementation of AXTreeObserver to catch when AXNodes are
+// deleted so we can delete their helpers.
+class TestAXTreeObserver : public AXTreeObserver {
+ private:
+ void OnNodeDeleted(AXTree* tree, int32_t node_id) override {
+ const auto iter = g_node_id_to_helper_map.find(node_id);
+ if (iter != g_node_id_to_helper_map.end()) {
+ TestAXNodeHelper* helper = iter->second;
+ delete helper;
+ g_node_id_to_helper_map.erase(node_id);
+ }
+ }
+};
+
+TestAXTreeObserver g_ax_tree_observer;
+
+} // namespace
+
+// static
+TestAXNodeHelper* TestAXNodeHelper::GetOrCreate(AXTree* tree, AXNode* node) {
+ if (!tree || !node)
+ return nullptr;
+
+ if (!tree->HasObserver(&g_ax_tree_observer))
+ tree->AddObserver(&g_ax_tree_observer);
+ auto iter = g_node_id_to_helper_map.find(node->id());
+ if (iter != g_node_id_to_helper_map.end())
+ return iter->second;
+ TestAXNodeHelper* helper = new TestAXNodeHelper(tree, node);
+ g_node_id_to_helper_map[node->id()] = helper;
+ return helper;
+}
+
+TestAXNodeHelper::TestAXNodeHelper(AXTree* tree, AXNode* node)
+ : tree_(tree), node_(node) {}
+
+TestAXNodeHelper::~TestAXNodeHelper() = default;
+
+gfx::Rect TestAXNodeHelper::GetBoundsRect(
+ const AXCoordinateSystem coordinate_system,
+ const AXClippingBehavior clipping_behavior,
+ AXOffscreenResult* offscreen_result) const {
+ switch (coordinate_system) {
+ case AXCoordinateSystem::kScreenPhysicalPixels:
+ // For unit testing purposes, assume a device scale factor of 1 and fall
+ // through.
+ case AXCoordinateSystem::kScreenDIPs: {
+ // We could optionally add clipping here if ever needed.
+ gfx::RectF bounds = GetLocation();
+
+ // For test behavior only, for bounds that are offscreen we currently do
+ // not apply clipping to the bounds but we still return the offscreen
+ // status.
+ if (offscreen_result) {
+ *offscreen_result = DetermineOffscreenResult(bounds);
+ }
+
+ return gfx::ToEnclosingRect(bounds);
+ }
+ case AXCoordinateSystem::kRootFrame:
+ case AXCoordinateSystem::kFrame:
+ NOTIMPLEMENTED();
+ return gfx::Rect();
+ }
+}
+
+gfx::Rect TestAXNodeHelper::GetInnerTextRangeBoundsRect(
+ const int start_offset,
+ const int end_offset,
+ const AXCoordinateSystem coordinate_system,
+ const AXClippingBehavior clipping_behavior,
+ AXOffscreenResult* offscreen_result) const {
+ switch (coordinate_system) {
+ case AXCoordinateSystem::kScreenPhysicalPixels:
+ // For unit testing purposes, assume a device scale factor of 1 and fall
+ // through.
+ case AXCoordinateSystem::kScreenDIPs: {
+ gfx::RectF bounds = GetLocation();
+ // This implementation currently only deals with text node that has role
+ // kInlineTextBox and kStaticText.
+ // For test purposes, assume node with kStaticText always has a single
+ // child with role kInlineTextBox.
+ if (GetData().role == ax::mojom::Role::kInlineTextBox) {
+ bounds = GetInlineTextRect(start_offset, end_offset);
+ } else if (GetData().role == ax::mojom::Role::kStaticText &&
+ InternalChildCount() > 0) {
+ TestAXNodeHelper* child = InternalGetChild(0);
+ if (child != nullptr &&
+ child->GetData().role == ax::mojom::Role::kInlineTextBox) {
+ bounds = child->GetInlineTextRect(start_offset, end_offset);
+ }
+ }
+
+ // For test behavior only, for bounds that are offscreen we currently do
+ // not apply clipping to the bounds but we still return the offscreen
+ // status.
+ if (offscreen_result) {
+ *offscreen_result = DetermineOffscreenResult(bounds);
+ }
+
+ return gfx::ToEnclosingRect(bounds);
+ }
+ case AXCoordinateSystem::kRootFrame:
+ case AXCoordinateSystem::kFrame:
+ NOTIMPLEMENTED();
+ return gfx::Rect();
+ }
+}
+
+const AXNodeData& TestAXNodeHelper::GetData() const {
+ return node_->data();
+}
+
+gfx::RectF TestAXNodeHelper::GetLocation() const {
+ return GetData().relative_bounds.bounds;
+}
+
+int TestAXNodeHelper::InternalChildCount() const {
+ return int{node_->GetUnignoredChildCount()};
+}
+
+TestAXNodeHelper* TestAXNodeHelper::InternalGetChild(int index) const {
+ CHECK_GE(index, 0);
+ CHECK_LT(index, InternalChildCount());
+ return GetOrCreate(tree_, node_->GetUnignoredChildAtIndex(size_t{index}));
+}
+
+gfx::RectF TestAXNodeHelper::GetInlineTextRect(const int start_offset,
+ const int end_offset) const {
+ DCHECK(start_offset >= 0 && end_offset >= 0 && start_offset <= end_offset);
+ const std::vector<int32_t>& character_offsets = GetData().GetIntListAttribute(
+ ax::mojom::IntListAttribute::kCharacterOffsets);
+ gfx::RectF location = GetLocation();
+ gfx::RectF bounds;
+
+ switch (static_cast<ax::mojom::TextDirection>(
+ GetData().GetIntAttribute(ax::mojom::IntAttribute::kTextDirection))) {
+ // Currently only kNone and kLtr are supported text direction.
+ case ax::mojom::TextDirection::kNone:
+ case ax::mojom::TextDirection::kLtr: {
+ int start_pixel_offset =
+ start_offset > 0 ? character_offsets[start_offset - 1] : location.x();
+ int end_pixel_offset =
+ end_offset > 0 ? character_offsets[end_offset - 1] : location.x();
+ bounds =
+ gfx::RectF(start_pixel_offset, location.y(),
+ end_pixel_offset - start_pixel_offset, location.height());
+ break;
+ }
+ default:
+ NOTIMPLEMENTED();
+ }
+ return bounds;
+}
+
+AXOffscreenResult TestAXNodeHelper::DetermineOffscreenResult(
+ gfx::RectF bounds) const {
+ if (!tree_ || !tree_->root())
+ return AXOffscreenResult::kOnscreen;
+
+ const AXNodeData& root_web_area_node_data = tree_->root()->data();
+ gfx::RectF root_web_area_bounds =
+ root_web_area_node_data.relative_bounds.bounds;
+
+ // For testing, we only look at the current node's bound relative to the root
+ // web area bounds to determine offscreen status. We currently do not look at
+ // the bounds of the immediate parent of the node for determining offscreen
+ // status.
+ // We only determine offscreen result if the root web area bounds is actually
+ // set in the test. We default the offscreen result of every other situation
+ // to AXOffscreenResult::kOnscreen.
+ if (!root_web_area_bounds.IsEmpty()) {
+ bounds.Intersect(root_web_area_bounds);
+ if (bounds.IsEmpty())
+ return AXOffscreenResult::kOffscreen;
+ }
+ return AXOffscreenResult::kOnscreen;
+}
+} // namespace ui
diff --git a/chromium/ui/accessibility/test_ax_node_helper.h b/chromium/ui/accessibility/test_ax_node_helper.h
new file mode 100644
index 00000000000..a303b81abf9
--- /dev/null
+++ b/chromium/ui/accessibility/test_ax_node_helper.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_ACCESSIBILITY_TEST_AX_NODE_HELPER_H_
+#define UI_ACCESSIBILITY_TEST_AX_NODE_HELPER_H_
+
+#include "ui/accessibility/ax_clipping_behavior.h"
+#include "ui/accessibility/ax_coordinate_system.h"
+#include "ui/accessibility/ax_node.h"
+#include "ui/accessibility/ax_offscreen_result.h"
+#include "ui/accessibility/ax_tree.h"
+
+namespace ui {
+
+// For testing, a TestAXNodeHelper wraps an AXNode. This is a simple
+// version of TestAXNodeWrapper.
+class TestAXNodeHelper {
+ public:
+ // Create TestAXNodeHelper instances on-demand from an AXTree and AXNode.
+ static TestAXNodeHelper* GetOrCreate(AXTree* tree, AXNode* node);
+ ~TestAXNodeHelper();
+
+ gfx::Rect GetBoundsRect(const AXCoordinateSystem coordinate_system,
+ const AXClippingBehavior clipping_behavior,
+ AXOffscreenResult* offscreen_result) const;
+ gfx::Rect GetInnerTextRangeBoundsRect(
+ const int start_offset,
+ const int end_offset,
+ const AXCoordinateSystem coordinate_system,
+ const AXClippingBehavior clipping_behavior,
+ AXOffscreenResult* offscreen_result) const;
+
+ private:
+ TestAXNodeHelper(AXTree* tree, AXNode* node);
+ int InternalChildCount() const;
+ TestAXNodeHelper* InternalGetChild(int index) const;
+ const AXNodeData& GetData() const;
+ gfx::RectF GetLocation() const;
+ gfx::RectF GetInlineTextRect(const int start_offset,
+ const int end_offset) const;
+ AXOffscreenResult DetermineOffscreenResult(gfx::RectF bounds) const;
+
+ AXTree* tree_;
+ AXNode* node_;
+};
+
+} // namespace ui
+
+#endif // UI_ACCESSIBILITY_TEST_AX_NODE_HELPER_H_
diff --git a/chromium/ui/android/BUILD.gn b/chromium/ui/android/BUILD.gn
index 0f5c728944c..7b8a034042b 100644
--- a/chromium/ui/android/BUILD.gn
+++ b/chromium/ui/android/BUILD.gn
@@ -66,6 +66,7 @@ component("android") {
"//skia",
"//third_party/blink/public:blink_headers",
"//ui/base",
+ "//ui/base/cursor:cursor_base",
"//ui/base/cursor/mojom:cursor_type",
"//ui/compositor",
"//ui/display",
@@ -213,7 +214,9 @@ android_library("ui_utils_java") {
deps = [
"//base:base_java",
"//components/payments/mojom:mojom_java",
- "//third_party/android_deps:android_support_v7_appcompat_java",
+ "//third_party/android_deps:androidx_appcompat_appcompat_java",
+ "//third_party/android_deps:androidx_appcompat_appcompat_resources_java",
+ "//third_party/android_deps:androidx_core_core_java",
"//third_party/blink/public/mojom:mojom_platform_java",
]
}
@@ -317,6 +320,7 @@ android_library("ui_full_java") {
"java/src/org/chromium/ui/resources/system/SystemResourceLoader.java",
"java/src/org/chromium/ui/text/NoUnderlineClickableSpan.java",
"java/src/org/chromium/ui/text/SpanApplier.java",
+ "java/src/org/chromium/ui/util/AccessibilityUtil.java",
"java/src/org/chromium/ui/util/ColorUtils.java",
"java/src/org/chromium/ui/util/TokenHolder.java",
"java/src/org/chromium/ui/vr/VrModeObserver.java",
@@ -345,6 +349,7 @@ android_library("ui_full_java") {
"//base:jni_java",
"//third_party/android_deps:android_support_v7_appcompat_java",
"//third_party/android_deps:androidx_annotation_annotation_java",
+ "//third_party/android_deps:androidx_appcompat_appcompat_resources_java",
"//third_party/android_deps:androidx_asynclayoutinflater_asynclayoutinflater_java",
"//third_party/android_deps:androidx_recyclerview_recyclerview_java",
"//ui/base/cursor/mojom:cursor_type_java",
@@ -366,6 +371,7 @@ android_library("ui_java_test_support") {
"javatests/src/org/chromium/ui/test/util/UiRestriction.java",
"javatests/src/org/chromium/ui/test/util/UiRestrictionSkipCheck.java",
"javatests/src/org/chromium/ui/test/util/modelutil/FakeViewProvider.java",
+ "junit/src/org/chromium/ui/base/TestActivity.java",
]
deps = [
":ui_java",
@@ -378,19 +384,20 @@ android_library("ui_java_test_support") {
}
android_resources("ui_javatest_resources") {
- custom_package = "org.chromium.test.ui"
+ testonly = true
sources = [
"junit/res/layout/inflated_view.xml",
"junit/res/layout/layout_view_builder_test.xml",
"junit/res/layout/main_view.xml",
]
+ android_manifest = "junit/AndroidManifest.xml"
}
junit_binary("ui_junit_tests") {
- package_name = "org.chromium.test.ui"
sources = [
"junit/src/org/chromium/ui/AsyncViewProviderTest.java",
"junit/src/org/chromium/ui/AsyncViewStubTest.java",
+ "junit/src/org/chromium/ui/base/ActivityAndroidPermissionDelegateTest.java",
"junit/src/org/chromium/ui/base/ApplicationViewportInsetSupplierTest.java",
"junit/src/org/chromium/ui/base/ClipboardTest.java",
"junit/src/org/chromium/ui/base/EventOffsetHandlerTest.java",
@@ -425,7 +432,17 @@ junit_binary("ui_junit_tests") {
"//base:base_java_test_support",
"//base:base_junit_test_support",
"//base/test:test_support_java",
+ "//third_party/android_deps:androidx_annotation_annotation_java",
+ "//third_party/android_deps:androidx_appcompat_appcompat_java",
+ "//third_party/android_deps:androidx_appcompat_appcompat_resources_java",
+ "//third_party/android_deps:androidx_asynclayoutinflater_asynclayoutinflater_java",
+ "//third_party/android_deps:androidx_test_core_java",
+ "//third_party/android_deps:androidx_test_ext_junit_java",
+ "//third_party/android_deps:androidx_test_runner_java",
+ "//third_party/hamcrest:hamcrest_java",
+ "//third_party/mockito:mockito_java",
]
+ android_manifest = "junit/AndroidManifest.xml"
}
test("ui_android_unittests") {
@@ -471,6 +488,7 @@ android_library("clipboard_java_test_support") {
deps = [
"//base:base_java",
"//base:base_java_test_support",
+ "//base:jni_java",
]
}
diff --git a/chromium/ui/android/event_forwarder.cc b/chromium/ui/android/event_forwarder.cc
index cd3643cbe37..8eac9e2ecbf 100644
--- a/chromium/ui/android/event_forwarder.cc
+++ b/chromium/ui/android/event_forwarder.cc
@@ -72,6 +72,7 @@ jboolean EventForwarder::OnTouchEvent(JNIEnv* env,
jfloat raw_pos_y,
jint android_tool_type_0,
jint android_tool_type_1,
+ jint android_gesture_classification,
jint android_button_state,
jint android_meta_state,
jboolean for_touch_handle) {
@@ -84,9 +85,9 @@ jboolean EventForwarder::OnTouchEvent(JNIEnv* env,
ui::MotionEventAndroid event(
env, motion_event.obj(), 1.f / view_->GetDipScale(), 0.f, 0.f, 0.f,
time_ms, android_action, pointer_count, history_size, action_index,
- 0 /* action_button */, android_button_state, android_meta_state,
- raw_pos_x - pos_x_0, raw_pos_y - pos_y_0, for_touch_handle, &pointer0,
- &pointer1);
+ 0 /* action_button */, android_gesture_classification,
+ android_button_state, android_meta_state, raw_pos_x - pos_x_0,
+ raw_pos_y - pos_y_0, for_touch_handle, &pointer0, &pointer1);
return view_->OnTouchEvent(event);
}
@@ -113,10 +114,10 @@ void EventForwarder::OnMouseEvent(JNIEnv* env,
ui::MotionEventAndroid event(
env, nullptr /* event */, 1.f / view_->GetDipScale(), 0.f, 0.f, 0.f,
time_ms, android_action, 1 /* pointer_count */, 0 /* history_size */,
- 0 /* action_index */, android_action_button, android_button_state,
- android_meta_state, 0 /* raw_offset_x_pixels */,
- 0 /* raw_offset_y_pixels */, false /* for_touch_handle */, &pointer,
- nullptr);
+ 0 /* action_index */, android_action_button,
+ 0 /* gesture_classification */, android_button_state, android_meta_state,
+ 0 /* raw_offset_x_pixels */, 0 /* raw_offset_y_pixels */,
+ false /* for_touch_handle */, &pointer, nullptr);
view_->OnMouseEvent(event);
}
@@ -168,7 +169,7 @@ jboolean EventForwarder::OnGenericMotionEvent(
ui::MotionEventAndroid::Pointer pointer0(0, x, y, 0, 0, 0, 0, 0);
ui::MotionEventAndroid event(
env, motion_event.obj(), 1.f / view_->GetDipScale(), 0.f, 0.f, 0.f,
- time_ms, 0, 1, 0, 0, 0, 0, 0, 0, 0, false, &pointer0, nullptr);
+ time_ms, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, false, &pointer0, nullptr);
return view_->OnGenericMotionEvent(event);
}
diff --git a/chromium/ui/android/event_forwarder.h b/chromium/ui/android/event_forwarder.h
index 18b75e76384..cfdbd57fa7c 100644
--- a/chromium/ui/android/event_forwarder.h
+++ b/chromium/ui/android/event_forwarder.h
@@ -46,6 +46,7 @@ class EventForwarder {
jfloat raw_pos_y,
jint android_tool_type_0,
jint android_tool_type_1,
+ jint android_gesture_classification,
jint android_button_state,
jint android_meta_state,
jboolean is_touch_handle_event);
diff --git a/chromium/ui/android/junit/AndroidManifest.xml b/chromium/ui/android/junit/AndroidManifest.xml
new file mode 100644
index 00000000000..26fe399d700
--- /dev/null
+++ b/chromium/ui/android/junit/AndroidManifest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<!-- This manifest is required for tests using
+ androidx.test.core.app.ActivityScenario to work.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="org.chromium.test.ui">
+
+ <!-- Value used by ActivityAndroidPermissionDelegateTest -->
+ <uses-permission android:name="android.permission.INTERNET"/>
+
+ <application android:theme="@style/Theme.AppCompat.Light">
+ <activity android:name="org.chromium.ui.base.TestActivity"/>
+ </application>
+</manifest>
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/base/ActivityAndroidPermissionDelegateTest.java b/chromium/ui/android/junit/src/org/chromium/ui/base/ActivityAndroidPermissionDelegateTest.java
new file mode 100644
index 00000000000..1df70151bcb
--- /dev/null
+++ b/chromium/ui/android/junit/src/org/chromium/ui/base/ActivityAndroidPermissionDelegateTest.java
@@ -0,0 +1,260 @@
+// 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.
+
+package org.chromium.ui.base;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.content.pm.PackageManager;
+
+import androidx.test.core.app.ActivityScenario;
+import androidx.test.ext.junit.rules.ActivityScenarioRule;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.robolectric.Shadows;
+import org.robolectric.shadows.ShadowActivity;
+import org.robolectric.shadows.ShadowActivity.PermissionsRequest;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * Robolectric unit tests for {@link ActivityAndroidPermissionDelegate} and
+ * {@link AndroidPermissionDelegateWithRequester}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+public class ActivityAndroidPermissionDelegateTest {
+ /**
+ * Rule managing the lifecycle of activity in each {@code @Test}.
+ * <p>
+ * To access the activity and run code on its main thread, use
+ * {@link ActivityScenario#onActivity}:
+ * <pre>
+ * mActivityScenarios.getScenario().onActivity(activity -> {
+ * // Your test code using the activity here.
+ * });
+ * </pre>
+ */
+ @Rule
+ public ActivityScenarioRule<TestActivity> mActivityScenarios =
+ new ActivityScenarioRule<>(TestActivity.class);
+
+ @Test
+ public void testHasPermissionDenied() {
+ mActivityScenarios.getScenario().onActivity(activity -> {
+ AndroidPermissionDelegate permissionDelegate =
+ new ActivityAndroidPermissionDelegate(new WeakReference(activity));
+
+ boolean hasPermission =
+ permissionDelegate.hasPermission(android.Manifest.permission.INTERNET);
+
+ assertFalse("The default result of hasPermission should be false", hasPermission);
+ });
+ }
+
+ @Test
+ public void testHasPermissionGranted() {
+ mActivityScenarios.getScenario().onActivity(activity -> {
+ Shadows.shadowOf(activity).grantPermissions(android.Manifest.permission.INTERNET);
+ AndroidPermissionDelegate permissionDelegate =
+ new ActivityAndroidPermissionDelegate(new WeakReference(activity));
+
+ boolean hasPermission =
+ permissionDelegate.hasPermission(android.Manifest.permission.INTERNET);
+
+ assertTrue("hasPermission should return true if permission is granted", hasPermission);
+ });
+ }
+
+ @Test
+ public void testCanRequestPermissionInitial() {
+ mActivityScenarios.getScenario().onActivity(activity -> {
+ AndroidPermissionDelegate permissionDelegate =
+ new ActivityAndroidPermissionDelegate(new WeakReference(activity));
+
+ boolean canRequest =
+ permissionDelegate.canRequestPermission(android.Manifest.permission.INTERNET);
+
+ assertTrue("The default result of canRequestPermission should be true", canRequest);
+ });
+ }
+
+ @Test
+ public void testRequestPermissionsGranted() {
+ mActivityScenarios.getScenario().onActivity(activity -> {
+ AndroidPermissionDelegate permissionDelegate =
+ new ActivityAndroidPermissionDelegate(new WeakReference(activity));
+ PermissionCallback callback = Mockito.mock(PermissionCallback.class);
+
+ // Request permission
+ permissionDelegate.requestPermissions(
+ new String[] {android.Manifest.permission.INTERNET}, callback);
+
+ PermissionsRequest lastRequest =
+ Shadows.shadowOf(activity).getLastRequestedPermission();
+ assertEquals(new String[] {android.Manifest.permission.INTERNET},
+ lastRequest.requestedPermissions);
+ verify(callback,
+ never().description("PermissionCallback should not receive results before "
+ + "handlePermissionResult is invoked"))
+ .onRequestPermissionsResult(any(), any());
+
+ // Respond to the request
+ int[] grantResults = new int[] {PackageManager.PERMISSION_GRANTED};
+ permissionDelegate.handlePermissionResult(
+ lastRequest.requestCode, lastRequest.requestedPermissions, grantResults);
+
+ verify(callback,
+ Mockito.description(
+ "handlePermissionResult should invoke the PermissionCallback"))
+ .onRequestPermissionsResult(lastRequest.requestedPermissions, grantResults);
+ });
+ }
+
+ @Test
+ public void testRequestPermissionsDenied() {
+ mActivityScenarios.getScenario().onActivity(activity -> {
+ AndroidPermissionDelegate permissionDelegate =
+ new ActivityAndroidPermissionDelegate(new WeakReference(activity));
+ PermissionCallback callback = Mockito.mock(PermissionCallback.class);
+
+ // Request permission
+ permissionDelegate.requestPermissions(
+ new String[] {android.Manifest.permission.INTERNET}, callback);
+
+ PermissionsRequest lastRequest =
+ Shadows.shadowOf(activity).getLastRequestedPermission();
+ assertEquals(new String[] {android.Manifest.permission.INTERNET},
+ lastRequest.requestedPermissions);
+ verify(callback,
+ never().description("PermissionCallback should not receive results before "
+ + "handlePermissionResult is invoked"))
+ .onRequestPermissionsResult(any(), any());
+
+ // Respond to the request
+ int[] grantResults = new int[] {PackageManager.PERMISSION_DENIED};
+ permissionDelegate.handlePermissionResult(
+ lastRequest.requestCode, lastRequest.requestedPermissions, grantResults);
+
+ verify(callback,
+ Mockito.description(
+ "handlePermissionResult should invoke the PermissionCallback"))
+ .onRequestPermissionsResult(lastRequest.requestedPermissions, grantResults);
+ });
+ }
+
+ @Test
+ public void testCanRequestPermissionAfterRequestGranted() {
+ mActivityScenarios.getScenario().onActivity(activity -> {
+ AndroidPermissionDelegate permissionDelegate =
+ new ActivityAndroidPermissionDelegate(new WeakReference(activity));
+ performRequestPermission(permissionDelegate, Shadows.shadowOf(activity),
+ android.Manifest.permission.INTERNET, PackageManager.PERMISSION_GRANTED);
+
+ boolean canRequest =
+ permissionDelegate.canRequestPermission(android.Manifest.permission.INTERNET);
+
+ assertTrue("After a granted permission request canRequestPermission should return true",
+ canRequest);
+ });
+ }
+
+ @Test
+ public void testCanRequestPermissionAfterRequestDenied() {
+ mActivityScenarios.getScenario().onActivity(activity -> {
+ AndroidPermissionDelegate permissionDelegate =
+ new ActivityAndroidPermissionDelegate(new WeakReference(activity));
+ performRequestPermission(permissionDelegate, Shadows.shadowOf(activity),
+ android.Manifest.permission.INTERNET, PackageManager.PERMISSION_DENIED);
+
+ boolean canRequest =
+ permissionDelegate.canRequestPermission(android.Manifest.permission.INTERNET);
+
+ assertFalse(
+ "After a denied permission request canRequestPermission should return false",
+ canRequest);
+ });
+ }
+
+ @Test
+ public void testCanRequestPermissionWithShowRequestRationale() {
+ mActivityScenarios.getScenario().onActivity(activity -> {
+ AndroidPermissionDelegate permissionDelegate =
+ new ActivityAndroidPermissionDelegate(new WeakReference(activity));
+ performRequestPermission(permissionDelegate, Shadows.shadowOf(activity),
+ android.Manifest.permission.INTERNET, PackageManager.PERMISSION_DENIED);
+ Shadows.shadowOf(activity.getPackageManager())
+ .setShouldShowRequestPermissionRationale(
+ android.Manifest.permission.INTERNET, true);
+
+ boolean canRequest =
+ permissionDelegate.canRequestPermission(android.Manifest.permission.INTERNET);
+
+ assertTrue("When shouldShowRequestPermissionRationale is true "
+ + "canRequestPermission should return true",
+ canRequest);
+ });
+ }
+
+ @Test
+ public void testCanRequestPermissionAfterHasPermissionGranted() {
+ mActivityScenarios.getScenario().onActivity(activity -> {
+ AndroidPermissionDelegate permissionDelegate =
+ new ActivityAndroidPermissionDelegate(new WeakReference(activity));
+ performRequestPermission(permissionDelegate, Shadows.shadowOf(activity),
+ android.Manifest.permission.INTERNET, PackageManager.PERMISSION_DENIED);
+
+ Shadows.shadowOf(activity).grantPermissions(android.Manifest.permission.INTERNET);
+ permissionDelegate.hasPermission(android.Manifest.permission.INTERNET);
+ Shadows.shadowOf(activity).denyPermissions(android.Manifest.permission.INTERNET);
+
+ boolean canRequest =
+ permissionDelegate.canRequestPermission(android.Manifest.permission.INTERNET);
+
+ assertTrue("After hasPermission sees that a permission is granted "
+ + "canRequestPermission should return true",
+ canRequest);
+ });
+ }
+
+ @Test
+ public void testCanRequestPermissionWhileGranted() {
+ mActivityScenarios.getScenario().onActivity(activity -> {
+ AndroidPermissionDelegate permissionDelegate =
+ new ActivityAndroidPermissionDelegate(new WeakReference(activity));
+ performRequestPermission(permissionDelegate, Shadows.shadowOf(activity),
+ android.Manifest.permission.INTERNET, PackageManager.PERMISSION_DENIED);
+ Shadows.shadowOf(activity).grantPermissions(android.Manifest.permission.INTERNET);
+
+ boolean canRequest =
+ permissionDelegate.canRequestPermission(android.Manifest.permission.INTERNET);
+
+ assertTrue(
+ "If a permission is currently granted canRequestPermission should return true",
+ canRequest);
+ });
+ }
+
+ /**
+ * Calls {@link AndroidPermissionDelegate#requestPermissions} and {@link
+ * AndroidPermissionDelegate#handlePermissionResult} for a single permission.
+ */
+ private void performRequestPermission(AndroidPermissionDelegate permissionDelegate,
+ ShadowActivity shadowActivity, String permission, int grantResult) {
+ permissionDelegate.requestPermissions(
+ new String[] {permission}, Mockito.mock(PermissionCallback.class));
+ PermissionsRequest lastRequest = shadowActivity.getLastRequestedPermission();
+ permissionDelegate.handlePermissionResult(
+ lastRequest.requestCode, lastRequest.requestedPermissions, new int[] {grantResult});
+ }
+}
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/base/LocalizationUtilsTest.java b/chromium/ui/android/junit/src/org/chromium/ui/base/LocalizationUtilsTest.java
index 09724c4210f..2698c6be83e 100644
--- a/chromium/ui/android/junit/src/org/chromium/ui/base/LocalizationUtilsTest.java
+++ b/chromium/ui/android/junit/src/org/chromium/ui/base/LocalizationUtilsTest.java
@@ -4,12 +4,12 @@
package org.chromium.ui.base;
-import android.support.test.filters.SmallTest;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import androidx.test.filters.SmallTest;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/base/SelectFileDialogTest.java b/chromium/ui/android/junit/src/org/chromium/ui/base/SelectFileDialogTest.java
index 49e622b471b..cd5fe373955 100644
--- a/chromium/ui/android/junit/src/org/chromium/ui/base/SelectFileDialogTest.java
+++ b/chromium/ui/android/junit/src/org/chromium/ui/base/SelectFileDialogTest.java
@@ -5,6 +5,8 @@
package org.chromium.ui.base;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import android.net.Uri;
import android.webkit.MimeTypeMap;
@@ -16,8 +18,12 @@ import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowMimeTypeMap;
import org.chromium.base.ContextUtils;
+import org.chromium.base.PathUtils;
import org.chromium.base.test.BaseRobolectricTestRunner;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
@@ -153,4 +159,42 @@ public class SelectFileDialogTest {
assertEquals(task.mFilePaths[1].toString(),
"///storage/emulated/0/DCIM/Camera/IMG_1.jpg");
}
+
+ @Test
+ public void testFilePathSelected() throws IOException {
+ SelectFileDialog selectFileDialog = new SelectFileDialog(0);
+ PathUtils.setPrivateDataDirectorySuffix("test");
+ String dataDir = new File(PathUtils.getDataDirectory()).getCanonicalPath();
+
+ SelectFileDialog.FilePathSelectedTask task = selectFileDialog.new FilePathSelectedTask(
+ ContextUtils.getApplicationContext(), dataDir, null);
+ assertFalse(task.doInBackground());
+
+ task = selectFileDialog.new FilePathSelectedTask(
+ ContextUtils.getApplicationContext(), dataDir + "/tmp/xyz.jpg", null);
+ assertFalse(task.doInBackground());
+
+ task = selectFileDialog.new FilePathSelectedTask(
+ ContextUtils.getApplicationContext(), dataDir + "/../xyz.jpg", null);
+ assertTrue(task.doInBackground());
+
+ task = selectFileDialog.new FilePathSelectedTask(
+ ContextUtils.getApplicationContext(), dataDir + "/tmp/../xyz.jpg", null);
+ assertFalse(task.doInBackground());
+
+ task = selectFileDialog.new FilePathSelectedTask(
+ ContextUtils.getApplicationContext(), "/data/local/tmp.jpg", null);
+ assertTrue(task.doInBackground());
+
+ Path path = new File(dataDir).toPath();
+ String parent = path.getParent().toString();
+ String lastComponent = path.getName(path.getNameCount() - 1).toString();
+ task = selectFileDialog.new FilePathSelectedTask(ContextUtils.getApplicationContext(),
+ parent + "/./" + lastComponent + "/xyz.jpg", null);
+ assertFalse(task.doInBackground());
+
+ task = selectFileDialog.new FilePathSelectedTask(ContextUtils.getApplicationContext(),
+ dataDir + "/../" + lastComponent + "/xyz.jpg", null);
+ assertFalse(task.doInBackground());
+ }
}
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/base/TestActivity.java b/chromium/ui/android/junit/src/org/chromium/ui/base/TestActivity.java
new file mode 100644
index 00000000000..aaabcf4097f
--- /dev/null
+++ b/chromium/ui/android/junit/src/org/chromium/ui/base/TestActivity.java
@@ -0,0 +1,14 @@
+// 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.
+
+package org.chromium.ui.base;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+/**
+ * Activity used in {@code ui/base} tests.
+ * <p>
+ * This activity is declared in {@code ui/android/junit/AndroidManifest.xml}.
+ */
+public class TestActivity extends AppCompatActivity {}
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/drawable/StateListDrawableBuilderTest.java b/chromium/ui/android/junit/src/org/chromium/ui/drawable/StateListDrawableBuilderTest.java
index 4b033999efa..8a13da1e3c3 100644
--- a/chromium/ui/android/junit/src/org/chromium/ui/drawable/StateListDrawableBuilderTest.java
+++ b/chromium/ui/android/junit/src/org/chromium/ui/drawable/StateListDrawableBuilderTest.java
@@ -15,7 +15,6 @@ import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.shadow.api.Shadow;
-import org.robolectric.shadows.ShadowStateListDrawable;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.ui.shadows.ShadowAnimatedStateListDrawable;
@@ -31,23 +30,7 @@ public class StateListDrawableBuilderTest {
private static final int DEFAULT_DRAWABLE = 45678;
@Test
- @Config(sdk = 19)
- public void testPreL() {
- StateListDrawableBuilder b = new StateListDrawableBuilder(RuntimeEnvironment.application);
- b.addState(CHECKED_DRAWABLE, android.R.attr.state_checked);
- b.addState(DEFAULT_DRAWABLE, WILDCARD_STATE);
- StateListDrawable result = b.build();
- assertEquals(result.getClass(), StateListDrawable.class);
- ShadowStateListDrawable drawable = shadowOf(result);
- assertEquals(CHECKED_DRAWABLE,
- shadowOf(drawable.getDrawableForState(CHECKED_STATE)).getCreatedFromResId());
- assertEquals(DEFAULT_DRAWABLE,
- shadowOf(drawable.getDrawableForState(WILDCARD_STATE)).getCreatedFromResId());
- }
-
- @Test
- @Config(sdk = 21)
- public void testPostL() {
+ public void testBuild() {
StateListDrawableBuilder b = new StateListDrawableBuilder(RuntimeEnvironment.application);
b.addState(CHECKED_DRAWABLE, android.R.attr.state_checked);
b.addState(DEFAULT_DRAWABLE, WILDCARD_STATE);
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java b/chromium/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java
index 0e7e800f582..f23cb9c94ee 100644
--- a/chromium/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java
+++ b/chromium/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java
@@ -79,16 +79,19 @@ public class ModalDialogManagerTest {
@Feature({"ModalDialogManagerObserver"})
public void testModalDialogObserver() {
// Show two dialogs and make sure show is only called on one until it is hidden.
- verify(mObserver, times(0)).onDialogShown(mDialogModels.get(0));
+ verify(mObserver, times(0)).onDialogAdded(mDialogModels.get(0));
mModalDialogManager.showDialog(mDialogModels.get(0), ModalDialogType.APP);
mModalDialogManager.showDialog(mDialogModels.get(1), ModalDialogType.APP);
- verify(mObserver, times(1)).onDialogShown(mDialogModels.get(0));
- verify(mObserver, times(0)).onDialogShown(mDialogModels.get(1));
+ verify(mObserver, times(1)).onDialogAdded(mDialogModels.get(0));
+ verify(mObserver, times(0)).onDialogAdded(mDialogModels.get(1));
- verify(mObserver, times(0)).onDialogHidden(mDialogModels.get(0));
+ verify(mObserver, times(0)).onDialogDismissed(mDialogModels.get(0));
mModalDialogManager.dismissDialog(mDialogModels.get(0), ModalDialogType.APP);
- verify(mObserver, times(1)).onDialogHidden(mDialogModels.get(0));
- verify(mObserver, times(1)).onDialogShown(mDialogModels.get(1));
+ verify(mObserver, times(1)).onDialogDismissed(mDialogModels.get(0));
+ verify(mObserver, times(1)).onDialogAdded(mDialogModels.get(1));
+
+ mModalDialogManager.dismissDialog(mDialogModels.get(1), ModalDialogType.APP);
+ verify(mObserver, times(1)).onLastDialogDismissed();
}
/** Tests showing a dialog when no dialog is currently showing. */
diff --git a/chromium/ui/android/view_android.cc b/chromium/ui/android/view_android.cc
index 7d2e6ded2f0..9de5d840506 100644
--- a/chromium/ui/android/view_android.cc
+++ b/chromium/ui/android/view_android.cc
@@ -14,9 +14,11 @@
#include "base/stl_util.h"
#include "cc/layers/layer.h"
#include "components/viz/common/frame_sinks/copy_output_request.h"
+#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/android/event_forwarder.h"
#include "ui/android/ui_android_jni_headers/ViewAndroidDelegate_jni.h"
#include "ui/android/window_android.h"
+#include "ui/base/cursor/cursor.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
#include "ui/base/layout.h"
#include "ui/events/android/drag_event_android.h"
@@ -25,6 +27,7 @@
#include "ui/events/android/key_event_android.h"
#include "ui/events/android/motion_event_android.h"
#include "ui/gfx/android/java_bitmap.h"
+#include "ui/gfx/geometry/point.h"
#include "url/gurl.h"
namespace ui {
@@ -389,25 +392,25 @@ bool ViewAndroid::StartDragAndDrop(const JavaRef<jstring>& jtext,
jimage);
}
-void ViewAndroid::OnCursorChanged(int type,
- const SkBitmap& custom_image,
- const gfx::Point& hotspot) {
+void ViewAndroid::OnCursorChanged(const Cursor& cursor) {
ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate());
if (delegate.is_null())
return;
JNIEnv* env = base::android::AttachCurrentThread();
- if (type == static_cast<int>(ui::mojom::CursorType::kCustom)) {
- if (custom_image.drawsNothing()) {
+ if (cursor.type() == mojom::CursorType::kCustom) {
+ const SkBitmap& bitmap = cursor.custom_bitmap();
+ const gfx::Point& hotspot = cursor.custom_hotspot();
+ if (bitmap.drawsNothing()) {
Java_ViewAndroidDelegate_onCursorChanged(
- env, delegate, static_cast<int>(ui::mojom::CursorType::kPointer));
+ env, delegate, static_cast<int>(mojom::CursorType::kPointer));
return;
}
- ScopedJavaLocalRef<jobject> java_bitmap =
- gfx::ConvertToJavaBitmap(&custom_image);
+ ScopedJavaLocalRef<jobject> java_bitmap = gfx::ConvertToJavaBitmap(&bitmap);
Java_ViewAndroidDelegate_onCursorChangedToCustom(env, delegate, java_bitmap,
hotspot.x(), hotspot.y());
} else {
- Java_ViewAndroidDelegate_onCursorChanged(env, delegate, type);
+ Java_ViewAndroidDelegate_onCursorChanged(env, delegate,
+ static_cast<int>(cursor.type()));
}
}
@@ -461,6 +464,16 @@ void ViewAndroid::OnBrowserControlsHeightChanged() {
}
}
+void ViewAndroid::OnVerticalScrollDirectionChanged(bool direction_up,
+ float current_scroll_ratio) {
+ ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate());
+ if (delegate.is_null())
+ return;
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_ViewAndroidDelegate_onVerticalScrollDirectionChanged(
+ env, delegate, direction_up, current_scroll_ratio);
+}
+
void ViewAndroid::OnSizeChanged(int width, int height) {
// Match-parent view must not receive size events.
DCHECK(!match_parent());
diff --git a/chromium/ui/android/view_android.h b/chromium/ui/android/view_android.h
index cf88a186583..5c989d6b05e 100644
--- a/chromium/ui/android/view_android.h
+++ b/chromium/ui/android/view_android.h
@@ -18,8 +18,6 @@
#include "ui/android/view_android_observer.h"
#include "ui/gfx/geometry/rect_f.h"
-class SkBitmap;
-
namespace cc {
class Layer;
}
@@ -34,6 +32,7 @@ class CopyOutputRequest;
}
namespace ui {
+class Cursor;
class DragEventAndroid;
class EventForwarder;
class EventHandlerAndroid;
@@ -154,9 +153,7 @@ class UI_ANDROID_EXPORT ViewAndroid {
void OnSizeChanged(int width, int height);
void OnPhysicalBackingSizeChanged(const gfx::Size& size);
- void OnCursorChanged(int type,
- const SkBitmap& custom_image,
- const gfx::Point& hotspot);
+ void OnCursorChanged(const Cursor& cursor);
void OnBackgroundColorChanged(unsigned int color);
void OnTopControlsChanged(float top_controls_offset,
float top_content_offset,
@@ -164,6 +161,11 @@ class UI_ANDROID_EXPORT ViewAndroid {
void OnBottomControlsChanged(float bottom_controls_offset,
float bottom_controls_min_height_offset);
void OnBrowserControlsHeightChanged();
+ // |current_scroll_ratio| is the ratio of vertical scroll in [0, 1] range.
+ // Scroll at top of page is 0, and bottom of page is 1. It is defined as 0
+ // if page is not scrollable, though this should not be called in that case.
+ void OnVerticalScrollDirectionChanged(bool direction_up,
+ float current_scroll_ratio);
// Gets the Visual Viewport inset to apply in physical pixels.
int GetViewportInsetBottom();
diff --git a/chromium/ui/android/view_android_unittests.cc b/chromium/ui/android/view_android_unittests.cc
index d42e19b6484..b24c1ad5285 100644
--- a/chromium/ui/android/view_android_unittests.cc
+++ b/chromium/ui/android/view_android_unittests.cc
@@ -76,8 +76,8 @@ class ViewAndroidBoundsTest : public testing::Test {
ui::MotionEventAndroid::Pointer pointer0(0, x, y, 0, 0, 0, 0, 0);
ui::MotionEventAndroid::Pointer pointer1(0, 0, 0, 0, 0, 0, 0, 0);
ui::MotionEventAndroid event(nullptr, JavaParamRef<jobject>(nullptr), 1.f,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, false,
- &pointer0, &pointer1);
+ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ false, &pointer0, &pointer1);
root_.OnTouchEvent(event);
}
diff --git a/chromium/ui/aura/BUILD.gn b/chromium/ui/aura/BUILD.gn
index 633a0bb87db..fd917270bb3 100644
--- a/chromium/ui/aura/BUILD.gn
+++ b/chromium/ui/aura/BUILD.gn
@@ -127,6 +127,7 @@ jumbo_component("aura") {
"//ui/events:events_base",
"//ui/events/platform",
"//ui/gfx",
+ "//ui/gfx:gfx_switches",
"//ui/gfx/geometry",
"//ui/gl",
"//ui/platform_window",
@@ -134,12 +135,13 @@ jumbo_component("aura") {
]
public_deps = [
- "//ui/base/cursor",
+ "//ui/base/cursor:cursor_base",
"//ui/base/ime",
"//ui/compositor",
]
if (use_x11) {
+ public_deps += [ "//ui/base/x" ]
deps += [
"//ui/events/platform/x11",
"//ui/platform_window/x11",
@@ -151,6 +153,7 @@ jumbo_component("aura") {
deps += [
"//ipc",
+ "//ui/base/cursor",
"//ui/platform_window/win",
]
}
@@ -225,7 +228,7 @@ jumbo_static_library("test_support") {
"//skia",
"//testing/gtest",
"//ui/base:test_support",
- "//ui/base/cursor",
+ "//ui/base/cursor:cursor_base",
"//ui/base/cursor/mojom:cursor_type",
"//ui/base/ime/init",
"//ui/compositor:test_support",
@@ -347,6 +350,10 @@ test("aura_unittests") {
"//ui/wm",
]
+ if (use_ozone) {
+ deps += [ "//ui/ozone" ]
+ }
+
data_deps = [ "//third_party/mesa_headers" ]
}
diff --git a/chromium/ui/aura/client/aura_constants.cc b/chromium/ui/aura/client/aura_constants.cc
index 39e304b1ef7..3fa9141b582 100644
--- a/chromium/ui/aura/client/aura_constants.cc
+++ b/chromium/ui/aura/client/aura_constants.cc
@@ -72,6 +72,7 @@ DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(gfx::Rect, kRestoreBoundsKey, nullptr)
DEFINE_UI_CLASS_PROPERTY_KEY(ui::WindowShowState,
kShowStateKey,
ui::SHOW_STATE_DEFAULT)
+DEFINE_UI_CLASS_PROPERTY_KEY(bool, kSkipImeProcessing, false)
DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(base::string16, kTitleKey, nullptr)
DEFINE_UI_CLASS_PROPERTY_KEY(int, kTopViewInset, 0)
DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(gfx::ImageSkia, kWindowIconKey, nullptr)
diff --git a/chromium/ui/aura/client/aura_constants.h b/chromium/ui/aura/client/aura_constants.h
index 30c090399b9..138069130a8 100644
--- a/chromium/ui/aura/client/aura_constants.h
+++ b/chromium/ui/aura/client/aura_constants.h
@@ -137,6 +137,11 @@ AURA_EXPORT extern const WindowProperty<gfx::Rect*>* const kRestoreBoundsKey;
AURA_EXPORT extern const WindowProperty<ui::WindowShowState>* const
kShowStateKey;
+// A property key to store key event dispatch policy. The default value is
+// false, which means IME receives a key event in PREDISPATCH phace before a
+// window receives it. If it's true, a window receives a key event before IME.
+AURA_EXPORT extern const WindowProperty<bool>* const kSkipImeProcessing;
+
// A property key to store the title of the window; sometimes shown to users.
AURA_EXPORT extern const WindowProperty<base::string16*>* const kTitleKey;
diff --git a/chromium/ui/aura/client/cursor_client.h b/chromium/ui/aura/client/cursor_client.h
index ed6076995da..076ec1ab8bb 100644
--- a/chromium/ui/aura/client/cursor_client.h
+++ b/chromium/ui/aura/client/cursor_client.h
@@ -33,6 +33,11 @@ class AURA_EXPORT CursorClient {
// Returns the current cursor.
virtual gfx::NativeCursor GetCursor() const = 0;
+ // Forces the cursor to be updated. This is called when the system may have
+ // changed the cursor without the cursor client's knowledge, which breaks
+ // if the cursor client doesn't think the cursor has changed.
+ virtual void SetCursorForced(gfx::NativeCursor cursor) = 0;
+
// Shows the cursor. This does not take effect When mouse events are disabled.
virtual void ShowCursor() = 0;
diff --git a/chromium/ui/aura/env.cc b/chromium/ui/aura/env.cc
index 56d2ef94f1c..22b7aac67d4 100644
--- a/chromium/ui/aura/env.cc
+++ b/chromium/ui/aura/env.cc
@@ -25,6 +25,10 @@
#include "ui/ozone/public/ozone_platform.h"
#endif
+#if defined(USE_X11)
+#include "ui/gfx/switches.h"
+#endif
+
namespace aura {
namespace {
@@ -205,7 +209,15 @@ bool Env::initial_throttle_input_on_resize_ = true;
Env::Env()
: env_controller_(std::make_unique<EnvInputStateController>(this)),
gesture_recognizer_(std::make_unique<ui::GestureRecognizerImpl>()),
- input_state_lookup_(InputStateLookup::Create()) {}
+ input_state_lookup_(InputStateLookup::Create()) {
+#if defined(USE_X11)
+ // In Ozone/X11, the cursor factory is initialized by the platform
+ // initialization code.
+ if (!features::IsUsingOzonePlatform() &&
+ !base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kHeadless))
+ cursor_factory_ = std::make_unique<ui::X11CursorFactory>();
+#endif
+}
void Env::Init() {
#if defined(USE_OZONE)
diff --git a/chromium/ui/aura/env.h b/chromium/ui/aura/env.h
index 893c1578aca..12f91827271 100644
--- a/chromium/ui/aura/env.h
+++ b/chromium/ui/aura/env.h
@@ -19,6 +19,10 @@
#include "ui/events/types/event_type.h"
#include "ui/gfx/geometry/point.h"
+#if defined(USE_X11)
+#include "ui/base/x/x11_cursor_factory.h" // nogncheck
+#endif
+
namespace ui {
class ContextFactory;
class EventObserver;
@@ -171,6 +175,10 @@ class AURA_EXPORT Env : public ui::EventTarget,
std::unique_ptr<ui::GestureRecognizer> gesture_recognizer_;
+#if defined(USE_X11)
+ std::unique_ptr<ui::X11CursorFactory> cursor_factory_;
+#endif
+
std::unique_ptr<InputStateLookup> input_state_lookup_;
std::unique_ptr<ui::PlatformEventSource> event_source_;
diff --git a/chromium/ui/aura/gestures/gesture_recognizer_unittest.cc b/chromium/ui/aura/gestures/gesture_recognizer_unittest.cc
index a796c62911f..c681aa4b077 100644
--- a/chromium/ui/aura/gestures/gesture_recognizer_unittest.cc
+++ b/chromium/ui/aura/gestures/gesture_recognizer_unittest.cc
@@ -337,7 +337,7 @@ class GestureEventConsumeDelegate : public TestWindowDelegate {
class QueueTouchEventDelegate : public GestureEventConsumeDelegate {
public:
explicit QueueTouchEventDelegate(WindowEventDispatcher* dispatcher)
- : window_(NULL),
+ : window_(nullptr),
dispatcher_(dispatcher),
synchronous_ack_for_next_event_(AckState::PENDING) {}
@@ -2264,7 +2264,7 @@ TEST_F(GestureRecognizerTest, GestureEventTouchLockSelectsCorrectWindow) {
// A touch too far from other touches won't be locked to anything
target =
gesture_recognizer->GetTargetForLocation(gfx::PointF(1000.f, 1000.f), -1);
- EXPECT_TRUE(target == NULL);
+ EXPECT_TRUE(target == nullptr);
// Move a touch associated with windows[2] to 1000, 1000
ui::TouchEvent move2(
@@ -3066,11 +3066,11 @@ TEST_F(GestureRecognizerTest, FlushAllOnHide) {
DispatchEventUsingWindowDispatcher(&press2);
window->Hide();
EXPECT_EQ(
- NULL,
+ nullptr,
aura::Env::GetInstance()->gesture_recognizer()->GetTouchLockedTarget(
press1));
EXPECT_EQ(
- NULL,
+ nullptr,
aura::Env::GetInstance()->gesture_recognizer()->GetTouchLockedTarget(
press2));
}
@@ -3766,7 +3766,7 @@ TEST_F(GestureRecognizerTest, CancelAllActiveTouches) {
aura::Env::GetInstance()->gesture_recognizer()->CancelActiveTouchesExcept(
nullptr);
- EXPECT_EQ(NULL, gesture_recognizer->GetTouchLockedTarget(press));
+ EXPECT_EQ(nullptr, gesture_recognizer->GetTouchLockedTarget(press));
EXPECT_4_EVENTS(delegate->events(),
ui::ET_GESTURE_PINCH_END,
ui::ET_GESTURE_SCROLL_END,
@@ -4249,8 +4249,7 @@ TEST_F(GestureRecognizerTest, GestureEventFlagsPassedFromTouchEvent) {
// A delegate that deletes a window on long press.
class GestureEventDeleteWindowOnLongPress : public GestureEventConsumeDelegate {
public:
- GestureEventDeleteWindowOnLongPress()
- : window_(NULL) {}
+ GestureEventDeleteWindowOnLongPress() : window_(nullptr) {}
void set_window(aura::Window** window) { window_ = window; }
@@ -4259,7 +4258,7 @@ class GestureEventDeleteWindowOnLongPress : public GestureEventConsumeDelegate {
if (gesture->type() != ui::ET_GESTURE_LONG_PRESS)
return;
delete *window_;
- *window_ = NULL;
+ *window_ = nullptr;
}
private:
@@ -4283,11 +4282,11 @@ TEST_F(GestureRecognizerTest, GestureEventLongPressDeletingWindow) {
ui::ET_TOUCH_PRESSED, gfx::Point(101, 201), ui::EventTimeForNow(),
ui::PointerDetails(ui::EventPointerType::kTouch, kTouchId));
DispatchEventUsingWindowDispatcher(&press1);
- EXPECT_TRUE(window != NULL);
+ EXPECT_TRUE(window != nullptr);
// Wait until the timer runs out.
delegate.WaitUntilReceivedGesture(ui::ET_GESTURE_LONG_PRESS);
- EXPECT_EQ(NULL, window);
+ EXPECT_EQ(nullptr, window);
}
TEST_F(GestureRecognizerWithSwitchTest, GestureEventSmallPinchDisabled) {
diff --git a/chromium/ui/aura/screen_ozone.cc b/chromium/ui/aura/screen_ozone.cc
index c811c1c4898..34fce55b9f6 100644
--- a/chromium/ui/aura/screen_ozone.cc
+++ b/chromium/ui/aura/screen_ozone.cc
@@ -8,7 +8,6 @@
#include "ui/aura/window.h"
#include "ui/aura/window_tree_host.h"
#include "ui/display/display.h"
-#include "ui/display/screen.h"
#include "ui/ozone/public/ozone_platform.h"
#include "ui/ozone/public/platform_screen.h"
@@ -22,7 +21,9 @@ ScreenOzone::ScreenOzone() {
}
}
-ScreenOzone::~ScreenOzone() = default;
+ScreenOzone::~ScreenOzone() {
+ display::Screen::SetScreenInstance(old_screen_);
+}
gfx::Point ScreenOzone::GetCursorScreenPoint() {
return platform_screen_->GetCursorScreenPoint();
diff --git a/chromium/ui/aura/screen_ozone.h b/chromium/ui/aura/screen_ozone.h
index 864c6e38681..ee3e1de23c3 100644
--- a/chromium/ui/aura/screen_ozone.h
+++ b/chromium/ui/aura/screen_ozone.h
@@ -53,6 +53,7 @@ class AURA_EXPORT ScreenOzone : public display::Screen {
gfx::AcceleratedWidget GetAcceleratedWidgetForWindow(
aura::Window* window) const;
+ display::Screen* const old_screen_ = display::Screen::SetScreenInstance(this);
std::unique_ptr<ui::PlatformScreen> platform_screen_;
DISALLOW_COPY_AND_ASSIGN(ScreenOzone);
diff --git a/chromium/ui/aura/window.cc b/chromium/ui/aura/window.cc
index c26afb965a4..7d6cff67049 100644
--- a/chromium/ui/aura/window.cc
+++ b/chromium/ui/aura/window.cc
@@ -175,7 +175,7 @@ Window::~Window() {
// The layer will either be destroyed by |layer_owner_|'s dtor, or by whoever
// acquired it.
- layer()->set_delegate(NULL);
+ layer()->set_delegate(nullptr);
DestroyLayer();
// If SetEmbedFrameSinkId() was called by client code, then we assume client
@@ -248,7 +248,7 @@ Window* Window::GetRootWindow() {
}
const Window* Window::GetRootWindow() const {
- return IsRootWindow() ? this : parent_ ? parent_->GetRootWindow() : NULL;
+ return IsRootWindow() ? this : parent_ ? parent_->GetRootWindow() : nullptr;
}
WindowTreeHost* Window::GetHost() {
@@ -258,7 +258,7 @@ WindowTreeHost* Window::GetHost() {
const WindowTreeHost* Window::GetHost() const {
const Window* root_window = GetRootWindow();
- return root_window ? root_window->host_ : NULL;
+ return root_window ? root_window->host_ : nullptr;
}
void Window::Show() {
@@ -444,12 +444,12 @@ void Window::RemoveChild(Window* child) {
WindowObserver::HierarchyChangeParams params;
params.target = child;
- params.new_parent = NULL;
+ params.new_parent = nullptr;
params.old_parent = this;
params.phase = WindowObserver::HierarchyChangeParams::HIERARCHY_CHANGING;
NotifyWindowHierarchyChange(params);
- RemoveChildImpl(child, NULL);
+ RemoveChildImpl(child, nullptr);
params.phase = WindowObserver::HierarchyChangeParams::HIERARCHY_CHANGED;
NotifyWindowHierarchyChange(params);
@@ -476,7 +476,7 @@ const Window* Window::GetChildById(int id) const {
if (result)
return result;
}
- return NULL;
+ return nullptr;
}
// static
@@ -488,13 +488,13 @@ void Window::ConvertPointToTarget(const Window* source,
if (source->GetRootWindow() != target->GetRootWindow()) {
client::ScreenPositionClient* source_client =
client::GetScreenPositionClient(source->GetRootWindow());
- // |source_client| can be NULL in tests.
+ // |source_client| can be nullptr in tests.
if (source_client)
source_client->ConvertPointToScreen(source, point);
client::ScreenPositionClient* target_client =
client::GetScreenPositionClient(target->GetRootWindow());
- // |target_client| can be NULL in tests.
+ // |target_client| can be nullptr in tests.
if (target_client)
target_client->ConvertPointFromScreen(target, point);
} else {
@@ -660,8 +660,9 @@ Window* Window::GetEventHandlerForPoint(const gfx::Point& local_point) {
}
Window* Window::GetToplevelWindow() {
- Window* topmost_window_with_delegate = NULL;
- for (aura::Window* window = this; window != NULL; window = window->parent()) {
+ Window* topmost_window_with_delegate = nullptr;
+ for (aura::Window* window = this; window != nullptr;
+ window = window->parent()) {
if (window->delegate())
topmost_window_with_delegate = window;
}
@@ -745,7 +746,7 @@ std::unique_ptr<ScopedKeyboardHook> Window::CaptureSystemKeyEvents(
// {Set,Get,Clear}Property are implemented in class_property.h.
void Window::SetNativeWindowProperty(const char* key, void* value) {
- SetPropertyInternal(key, key, NULL, reinterpret_cast<int64_t>(value), 0);
+ SetPropertyInternal(key, key, nullptr, reinterpret_cast<int64_t>(value), 0);
}
void* Window::GetNativeWindowProperty(const char* key) const {
@@ -926,13 +927,13 @@ void Window::RemoveChildImpl(Window* child, Window* new_parent) {
for (WindowObserver& observer : observers_)
observer.OnWillRemoveWindow(child);
Window* root_window = child->GetRootWindow();
- Window* new_root_window = new_parent ? new_parent->GetRootWindow() : NULL;
+ Window* new_root_window = new_parent ? new_parent->GetRootWindow() : nullptr;
if (root_window && root_window != new_root_window)
child->NotifyRemovingFromRootWindow(new_root_window);
if (child->OwnsLayer())
layer()->Remove(child->layer());
- child->parent_ = NULL;
+ child->parent_ = nullptr;
auto i = std::find(children_.begin(), children_.end(), child);
DCHECK(i != children_.end());
children_.erase(i);
diff --git a/chromium/ui/aura/window.h b/chromium/ui/aura/window.h
index 05874dea71d..6251d9a30e8 100644
--- a/chromium/ui/aura/window.h
+++ b/chromium/ui/aura/window.h
@@ -13,9 +13,9 @@
#include <string>
#include <vector>
+#include "base/check.h"
#include "base/compiler_specific.h"
#include "base/containers/flat_set.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
@@ -193,9 +193,9 @@ class AURA_EXPORT Window : public ui::LayerDelegate,
const Window* parent() const { return parent_; }
// Returns the root Window that contains this Window. The root Window is
- // defined as the Window that has a dispatcher. These functions return NULL if
- // the Window is contained in a hierarchy that does not have a dispatcher at
- // its root.
+ // defined as the Window that has a dispatcher. These functions return nullptr
+ // if the Window is contained in a hierarchy that does not have a dispatcher
+ // at its root.
Window* GetRootWindow();
const Window* GetRootWindow() const;
@@ -278,7 +278,7 @@ class AURA_EXPORT Window : public ui::LayerDelegate,
void StackChildAtTop(Window* child);
// Stacks |child| above |target|. Does nothing if |child| is already above
- // |target|. Does not stack on top of windows with NULL layer delegates,
+ // |target|. Does not stack on top of windows with nullptr layer delegates,
// see WindowTest.StackingMadrigal for details.
void StackChildAbove(Window* child, Window* target);
@@ -298,14 +298,14 @@ class AURA_EXPORT Window : public ui::LayerDelegate,
// Returns true if this Window contains |other| somewhere in its children.
bool Contains(const Window* other) const;
- // Retrieves the first-level child with the specified id, or NULL if no first-
- // level child is found matching |id|.
+ // Retrieves the first-level child with the specified id, or nullptr if no
+ // first- level child is found matching |id|.
Window* GetChildById(int id);
const Window* GetChildById(int id) const;
// Converts |point| from |source|'s coordinates to |target|'s. If |source| is
- // NULL, the function returns without modifying |point|. |target| cannot be
- // NULL.
+ // nullptr, the function returns without modifying |point|. |target| cannot be
+ // nullptr.
static void ConvertPointToTarget(const Window* source,
const Window* target,
gfx::PointF* point);
diff --git a/chromium/ui/aura/window_event_dispatcher.cc b/chromium/ui/aura/window_event_dispatcher.cc
index 47ed7c1f1a3..0429eed4ad2 100644
--- a/chromium/ui/aura/window_event_dispatcher.cc
+++ b/chromium/ui/aura/window_event_dispatcher.cc
@@ -14,6 +14,7 @@
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
+#include "ui/aura/client/aura_constants.h"
#include "ui/aura/client/capture_client.h"
#include "ui/aura/client/cursor_client.h"
#include "ui/aura/client/event_client.h"
@@ -52,7 +53,7 @@ bool IsNonClientLocation(Window* target, const gfx::Point& location) {
}
Window* ConsumerToWindow(ui::GestureConsumer* consumer) {
- return consumer ? static_cast<Window*>(consumer) : NULL;
+ return consumer ? static_cast<Window*>(consumer) : nullptr;
}
bool IsEventCandidateForHold(const ui::Event& event) {
@@ -149,7 +150,7 @@ void WindowEventDispatcher::DispatchCancelModeEvent() {
ui::CancelModeEvent event;
Window* focused_window = client::GetFocusClient(window())->GetFocusedWindow();
if (focused_window && !window()->Contains(focused_window))
- focused_window = NULL;
+ focused_window = nullptr;
DispatchDetails details =
DispatchEvent(focused_window ? focused_window : window(), &event);
if (details.dispatcher_destroyed)
@@ -245,8 +246,8 @@ gfx::Point WindowEventDispatcher::GetLastMouseLocationInRoot() const {
}
void WindowEventDispatcher::OnHostLostMouseGrab() {
- mouse_pressed_handler_ = NULL;
- mouse_moved_handler_ = NULL;
+ mouse_pressed_handler_ = nullptr;
+ mouse_moved_handler_ = nullptr;
}
void WindowEventDispatcher::OnCursorMovedToRootLocation(
@@ -357,9 +358,9 @@ void WindowEventDispatcher::OnWindowHidden(Window* invisible,
// If the window the mouse was pressed in becomes invisible, it should no
// longer receive mouse events.
if (invisible->Contains(mouse_pressed_handler_))
- mouse_pressed_handler_ = NULL;
+ mouse_pressed_handler_ = nullptr;
if (invisible->Contains(mouse_moved_handler_))
- mouse_moved_handler_ = NULL;
+ mouse_moved_handler_ = nullptr;
if (invisible->Contains(touchpad_pinch_handler_))
touchpad_pinch_handler_ = nullptr;
@@ -368,7 +369,7 @@ void WindowEventDispatcher::OnWindowHidden(Window* invisible,
// dispatching events in the inner loop, then reset the target for the outer
// loop.
if (invisible->Contains(old_dispatch_target_))
- old_dispatch_target_ = NULL;
+ old_dispatch_target_ = nullptr;
invisible->CleanupGestureState();
@@ -383,10 +384,10 @@ void WindowEventDispatcher::OnWindowHidden(Window* invisible,
client::CaptureClient* capture_client =
client::GetCaptureClient(host_->window());
Window* capture_window =
- capture_client ? capture_client->GetCaptureWindow() : NULL;
+ capture_client ? capture_client->GetCaptureWindow() : nullptr;
if (invisible->Contains(event_dispatch_target_))
- event_dispatch_target_ = NULL;
+ event_dispatch_target_ = nullptr;
// If the ancestor of the capture window is hidden, release the capture.
// Note that this may delete the window so do not use capture_window
@@ -410,7 +411,7 @@ void WindowEventDispatcher::UpdateCapture(Window* old_capture,
// (see below). Clear it here to ensure we don't end up referencing a stale
// Window.
if (mouse_moved_handler_ && !window()->Contains(mouse_moved_handler_))
- mouse_moved_handler_ = NULL;
+ mouse_moved_handler_ = nullptr;
if (old_capture && old_capture->GetRootWindow() == window() &&
old_capture->delegate()) {
@@ -438,7 +439,7 @@ void WindowEventDispatcher::UpdateCapture(Window* old_capture,
if (details.dispatcher_destroyed)
return;
}
- mouse_pressed_handler_ = NULL;
+ mouse_pressed_handler_ = nullptr;
}
void WindowEventDispatcher::OnOtherRootGotCapture() {
@@ -460,8 +461,8 @@ void WindowEventDispatcher::OnOtherRootGotCapture() {
}
#endif
- mouse_moved_handler_ = NULL;
- mouse_pressed_handler_ = NULL;
+ mouse_moved_handler_ = nullptr;
+ mouse_pressed_handler_ = nullptr;
}
void WindowEventDispatcher::SetNativeCapture() {
@@ -539,7 +540,7 @@ ui::EventDispatchDetails WindowEventDispatcher::PreDispatchEvent(
} else if (event->IsTouchEvent()) {
details = PreDispatchTouchEvent(target_window, event->AsTouchEvent());
} else if (event->IsKeyEvent()) {
- details = PreDispatchKeyEvent(event->AsKeyEvent());
+ details = PreDispatchKeyEvent(target_window, event->AsKeyEvent());
} else if (event->IsPinchEvent()) {
details = PreDispatchPinchEvent(target_window, event->AsGestureEvent());
}
@@ -558,7 +559,7 @@ ui::EventDispatchDetails WindowEventDispatcher::PostDispatchEvent(
if (!target || target != event_dispatch_target_)
details.target_destroyed = true;
event_dispatch_target_ = old_dispatch_target_;
- old_dispatch_target_ = NULL;
+ old_dispatch_target_ = nullptr;
#ifndef NDEBUG
DCHECK(!event_dispatch_target_ || window()->Contains(event_dispatch_target_));
#endif
@@ -920,7 +921,7 @@ DispatchDetails WindowEventDispatcher::PreDispatchMouseEvent(
event->SetHandled();
return details;
}
- mouse_moved_handler_ = NULL;
+ mouse_moved_handler_ = nullptr;
}
break;
case ui::ET_MOUSE_MOVED:
@@ -949,7 +950,7 @@ DispatchDetails WindowEventDispatcher::PreDispatchMouseEvent(
return target_details;
}
if (details.target_destroyed || target_details.target_destroyed) {
- mouse_moved_handler_ = NULL;
+ mouse_moved_handler_ = nullptr;
event->SetHandled();
return target_details;
}
@@ -973,7 +974,7 @@ DispatchDetails WindowEventDispatcher::PreDispatchMouseEvent(
mouse_pressed_handler_ = target;
break;
case ui::ET_MOUSE_RELEASED:
- mouse_pressed_handler_ = NULL;
+ mouse_pressed_handler_ = nullptr;
break;
default:
break;
@@ -1035,10 +1036,12 @@ DispatchDetails WindowEventDispatcher::PreDispatchTouchEvent(
}
DispatchDetails WindowEventDispatcher::PreDispatchKeyEvent(
+ Window* target,
ui::KeyEvent* event) {
if (skip_ime_ || !host_->has_input_method() ||
(event->flags() & ui::EF_IS_SYNTHESIZED) ||
- !host_->ShouldSendKeyEventToIme()) {
+ !host_->ShouldSendKeyEventToIme() ||
+ target->GetProperty(aura::client::kSkipImeProcessing)) {
return DispatchDetails();
}
diff --git a/chromium/ui/aura/window_event_dispatcher.h b/chromium/ui/aura/window_event_dispatcher.h
index 74d4510901c..5435ce7b7f3 100644
--- a/chromium/ui/aura/window_event_dispatcher.h
+++ b/chromium/ui/aura/window_event_dispatcher.h
@@ -281,7 +281,8 @@ class AURA_EXPORT WindowEventDispatcher : public ui::EventProcessor,
ui::GestureEvent* event);
ui::EventDispatchDetails PreDispatchTouchEvent(Window* target,
ui::TouchEvent* event);
- ui::EventDispatchDetails PreDispatchKeyEvent(ui::KeyEvent* event);
+ ui::EventDispatchDetails PreDispatchKeyEvent(Window* target,
+ ui::KeyEvent* event);
WindowTreeHost* host_;
diff --git a/chromium/ui/aura/window_event_dispatcher_unittest.cc b/chromium/ui/aura/window_event_dispatcher_unittest.cc
index ef8dcda8b67..41e3c0cb331 100644
--- a/chromium/ui/aura/window_event_dispatcher_unittest.cc
+++ b/chromium/ui/aura/window_event_dispatcher_unittest.cc
@@ -19,6 +19,7 @@
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/aura/client/aura_constants.h"
#include "ui/aura/client/capture_client.h"
#include "ui/aura/client/event_client.h"
#include "ui/aura/client/focus_client.h"
@@ -33,6 +34,7 @@
#include "ui/aura/window_targeter.h"
#include "ui/aura/window_tracker.h"
#include "ui/base/hit_test.h"
+#include "ui/base/ime/mock_input_method.h"
#include "ui/base/ui_base_features.h"
#include "ui/display/screen.h"
#include "ui/events/event.h"
@@ -106,6 +108,25 @@ class ConsumeKeyHandler : public ui::test::TestEventHandler {
DISALLOW_COPY_AND_ASSIGN(ConsumeKeyHandler);
};
+// InputMethodDelegate that tracks the events passed to PostIME phase.
+class TestInputMethodDelegate : public ui::internal::InputMethodDelegate {
+ public:
+ TestInputMethodDelegate() = default;
+ ~TestInputMethodDelegate() override = default;
+
+ // ui::internal::InputMethodDelegate:
+ ui::EventDispatchDetails DispatchKeyEventPostIME(
+ ui::KeyEvent* event) override {
+ ++dispatched_event_count_;
+ return ui::EventDispatchDetails();
+ }
+
+ int dispatched_event_count() const { return dispatched_event_count_; }
+
+ private:
+ int dispatched_event_count_{0};
+};
+
bool IsFocusedWindow(aura::Window* window) {
return client::GetFocusClient(window)->GetFocusedWindow() == window;
}
@@ -468,6 +489,33 @@ TEST_F(WindowEventDispatcherTest, ScrollEventDispatch) {
root_window()->RemovePreTargetHandler(&handler);
}
+TEST_F(WindowEventDispatcherTest, PreDispatchKeyEventToIme) {
+ ui::MockInputMethod mock_ime(nullptr);
+ TestInputMethodDelegate delegate;
+ mock_ime.SetDelegate(&delegate);
+ host()->SetSharedInputMethod(&mock_ime);
+
+ ConsumeKeyHandler handler;
+ std::unique_ptr<Window> w(CreateNormalWindow(1, root_window(), nullptr));
+ w->AddPostTargetHandler(&handler);
+ w->Show();
+ w->Focus();
+
+ // The dispatched event went to IME before the event target.
+ ui::KeyEvent key_press(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_NONE);
+ DispatchEventUsingWindowDispatcher(&key_press);
+ EXPECT_EQ(0, handler.num_key_events());
+ EXPECT_EQ(1, delegate.dispatched_event_count());
+
+ // However, for the window with kSkipImeProcessing
+ // The event went to the event target at first.
+ w->SetProperty(client::kSkipImeProcessing, true);
+ ui::KeyEvent key_release(ui::ET_KEY_RELEASED, ui::VKEY_A, ui::EF_NONE);
+ DispatchEventUsingWindowDispatcher(&key_release);
+ EXPECT_EQ(1, handler.num_key_events());
+ EXPECT_EQ(1, delegate.dispatched_event_count());
+}
+
namespace {
// ui::EventHandler that tracks the types of events it's seen.
diff --git a/chromium/ui/aura/window_observer.h b/chromium/ui/aura/window_observer.h
index 071c5c884bc..4c34dbe7a12 100644
--- a/chromium/ui/aura/window_observer.h
+++ b/chromium/ui/aura/window_observer.h
@@ -175,10 +175,6 @@ class AURA_EXPORT WindowObserver : public base::CheckedObserver {
// (is_animating|IsAnimatingProperty|IsAnimatingOnePropertyOf)() from it.
virtual void OnWindowLayerRecreated(Window* window) {}
- // Called when the app embedded in |window| disconnects (is no longer
- // embedded).
- virtual void OnEmbeddedAppDisconnected(Window* window) {}
-
// Called when the occlusion state of |window| changes.
virtual void OnWindowOcclusionChanged(Window* window) {}
diff --git a/chromium/ui/aura/window_tree_host.cc b/chromium/ui/aura/window_tree_host.cc
index 29c93adb189..b0e2720fe05 100644
--- a/chromium/ui/aura/window_tree_host.cc
+++ b/chromium/ui/aura/window_tree_host.cc
@@ -6,7 +6,6 @@
#include "base/command_line.h"
#include "base/feature_list.h"
-#include "base/metrics/histogram_macros.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
#include "components/viz/common/features.h"
@@ -504,13 +503,18 @@ void WindowTreeHost::OnHostLostWindowCapture() {
void WindowTreeHost::OnDisplayMetricsChanged(const display::Display& display,
uint32_t metrics) {
- if (metrics & DisplayObserver::DISPLAY_METRIC_COLOR_SPACE) {
- display::Screen* screen = display::Screen::GetScreen();
- if (compositor_ &&
- display.id() == screen->GetDisplayNearestView(window()).id()) {
- compositor_->SetDisplayColorSpaces(display.color_spaces());
- }
- }
+ if (metrics & DisplayObserver::DISPLAY_METRIC_COLOR_SPACE && compositor_ &&
+ display.id() == GetDisplayId())
+ compositor_->SetDisplayColorSpaces(display.color_spaces());
+
+// Chrome OS is handled in WindowTreeHostManager::OnDisplayMetricsChanged.
+// Chrome OS requires additional handling for the bounds that we do not need to
+// do for other OSes.
+#if !defined(OS_CHROMEOS)
+ if (metrics & DISPLAY_METRIC_DEVICE_SCALE_FACTOR &&
+ display.id() == GetDisplayId())
+ OnHostResizedInPixels(GetBoundsInPixels().size());
+#endif
}
gfx::Rect WindowTreeHost::GetTransformedRootWindowBoundsInPixels(
@@ -549,15 +553,11 @@ void WindowTreeHost::OnCompositingEnded(ui::Compositor* compositor) {
dispatcher_->ReleasePointerMoves();
holding_pointer_moves_ = false;
- DCHECK(!synchronization_start_time_.is_null());
- UMA_HISTOGRAM_TIMES("UI.WindowTreeHost.SurfaceSynchronizationDuration",
- base::TimeTicks::Now() - synchronization_start_time_);
}
void WindowTreeHost::OnCompositingChildResizing(ui::Compositor* compositor) {
if (!Env::GetInstance()->throttle_input_on_resize() || holding_pointer_moves_)
return;
- synchronization_start_time_ = base::TimeTicks::Now();
dispatcher_->HoldPointerMoves();
holding_pointer_moves_ = true;
}
diff --git a/chromium/ui/aura/window_tree_host.h b/chromium/ui/aura/window_tree_host.h
index af78e44ce00..e00fb7b60ba 100644
--- a/chromium/ui/aura/window_tree_host.h
+++ b/chromium/ui/aura/window_tree_host.h
@@ -16,7 +16,6 @@
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/optional.h"
-#include "base/time/time.h"
#include "build/build_config.h"
#include "components/viz/common/surfaces/frame_sink_id.h"
#include "ui/aura/aura_export.h"
@@ -248,7 +247,10 @@ class AURA_EXPORT WindowTreeHost : public ui::internal::InputMethodDelegate,
// Requests using unadjusted movement mouse events, i.e. WM_INPUT on Windows.
// Returns a ScopedEnableUnadjustedMouseEvents instance which stops using
// unadjusted mouse events when destroyed, returns nullptr if unadjusted mouse
- // event is not not implemented or failed.
+ // event is not not implemented or failed. On some platforms this function may
+ // temporarily affect the global state of mouse settings. This function is
+ // currently only intended to be used with PointerLock as it is not set up for
+ // multiple calls.
virtual std::unique_ptr<ScopedEnableUnadjustedMouseEvents>
RequestUnadjustedMovement();
@@ -380,9 +382,6 @@ class AURA_EXPORT WindowTreeHost : public ui::internal::InputMethodDelegate,
// Whether the InputMethod instance is owned by this WindowTreeHost.
bool owned_input_method_;
- // Set to the time the synchronization event began.
- base::TimeTicks synchronization_start_time_;
-
// Set to true if this WindowTreeHost is currently holding pointer moves.
bool holding_pointer_moves_ = false;
diff --git a/chromium/ui/aura/window_tree_host_platform.cc b/chromium/ui/aura/window_tree_host_platform.cc
index 8cb0d96a566..917b45bf3f8 100644
--- a/chromium/ui/aura/window_tree_host_platform.cc
+++ b/chromium/ui/aura/window_tree_host_platform.cc
@@ -28,6 +28,7 @@
#include "ui/platform_window/platform_window_init_properties.h"
#if defined(USE_OZONE)
+#include "ui/base/ui_base_features.h"
#include "ui/ozone/public/ozone_platform.h"
#endif
@@ -68,18 +69,26 @@ WindowTreeHostPlatform::WindowTreeHostPlatform(std::unique_ptr<Window> window)
void WindowTreeHostPlatform::CreateAndSetPlatformWindow(
ui::PlatformWindowInitProperties properties) {
+#if defined(USE_OZONE) || defined(USE_X11)
#if defined(USE_OZONE)
- platform_window_ = ui::OzonePlatform::GetInstance()->CreatePlatformWindow(
- this, std::move(properties));
-#elif defined(OS_WIN)
- platform_window_.reset(new ui::WinWindow(this, properties.bounds));
-#elif defined(USE_X11)
+ if (features::IsUsingOzonePlatform()) {
+ platform_window_ = ui::OzonePlatform::GetInstance()->CreatePlatformWindow(
+ this, std::move(properties));
+ return;
+ }
+#endif
+#if defined(USE_X11)
auto platform_window = std::make_unique<ui::X11Window>(this);
auto* x11_window = platform_window.get();
// platform_window() may be called during Initialize(), so call
// SetPlatformWindow() now.
SetPlatformWindow(std::move(platform_window));
x11_window->Initialize(std::move(properties));
+ return;
+#endif
+ NOTREACHED();
+#elif defined(OS_WIN)
+ platform_window_.reset(new ui::WinWindow(this, properties.bounds));
#else
NOTIMPLEMENTED();
#endif
diff --git a/chromium/ui/aura/window_tree_host_unittest.cc b/chromium/ui/aura/window_tree_host_unittest.cc
index 761e4f030c7..2bf6cb83460 100644
--- a/chromium/ui/aura/window_tree_host_unittest.cc
+++ b/chromium/ui/aura/window_tree_host_unittest.cc
@@ -21,7 +21,9 @@ namespace aura {
using WindowTreeHostTest = test::AuraTestBase;
TEST_F(WindowTreeHostTest, DPIWindowSize) {
- gfx::Rect starting_bounds(0, 0, 800, 600);
+ constexpr gfx::Rect starting_bounds(
+ aura::test::AuraTestHelper::kDefaultHostSize);
+
EXPECT_EQ(starting_bounds.size(), host()->compositor()->size());
EXPECT_EQ(starting_bounds, host()->GetBoundsInPixels());
EXPECT_EQ(starting_bounds, root_window()->bounds());
@@ -113,6 +115,30 @@ TEST_F(WindowTreeHostTest, HoldPointerMovesOnChildResizing) {
}
#endif
+#if !defined(OS_CHROMEOS)
+// Tests if scale factor changes take effect. Previously a scale factor change
+// wouldn't take effect without a bounds change. For context see
+// https://crbug.com/1087626
+TEST_F(WindowTreeHostTest, ShouldHandleTextScale) {
+ constexpr gfx::Rect starting_bounds(
+ aura::test::AuraTestHelper::kDefaultHostSize);
+ auto asserter = [&](float test_scale_factor) {
+ test_screen()->SetDeviceScaleFactor(test_scale_factor, false);
+
+ EXPECT_EQ(starting_bounds, host()->GetBoundsInPixels());
+ // Size should be rounded up after scaling.
+ EXPECT_EQ(
+ gfx::ScaleToEnclosingRect(starting_bounds, 1.0f / test_scale_factor),
+ root_window()->bounds());
+ EXPECT_EQ(test_scale_factor, host()->device_scale_factor());
+ };
+
+ asserter(1.0f);
+ asserter(1.05f);
+ asserter(1.5f);
+}
+#endif
+
TEST_F(WindowTreeHostTest, NoRewritesPostIME) {
ui::test::TestEventRewriter event_rewriter;
host()->AddEventRewriter(&event_rewriter);
diff --git a/chromium/ui/aura/window_unittest.cc b/chromium/ui/aura/window_unittest.cc
index 86204d85e62..c9045d65c15 100644
--- a/chromium/ui/aura/window_unittest.cc
+++ b/chromium/ui/aura/window_unittest.cc
@@ -203,8 +203,7 @@ class ChildWindowDelegateImpl : public DestroyTrackingDelegateImpl {
// OnWindowDestroyed is called.
class DestroyOrphanDelegate : public TestWindowDelegate {
public:
- DestroyOrphanDelegate() : window_(NULL) {
- }
+ DestroyOrphanDelegate() : window_(nullptr) {}
void set_window(Window* window) { window_ = window; }
@@ -323,7 +322,7 @@ TEST_F(WindowTest, GetChildById) {
std::unique_ptr<Window> w111(CreateTestWindowWithId(111, w11.get()));
std::unique_ptr<Window> w12(CreateTestWindowWithId(12, w1.get()));
- EXPECT_EQ(NULL, w1->GetChildById(57));
+ EXPECT_FALSE(w1->GetChildById(57));
EXPECT_EQ(w12.get(), w1->GetChildById(12));
EXPECT_EQ(w111.get(), w1->GetChildById(111));
}
@@ -331,11 +330,11 @@ TEST_F(WindowTest, GetChildById) {
// Make sure that Window::Contains correctly handles children, grandchildren,
// and not containing NULL or parents.
TEST_F(WindowTest, Contains) {
- Window parent(NULL);
+ Window parent(nullptr);
parent.Init(ui::LAYER_NOT_DRAWN);
- Window child1(NULL);
+ Window child1(nullptr);
child1.Init(ui::LAYER_NOT_DRAWN);
- Window child2(NULL);
+ Window child2(nullptr);
child2.Init(ui::LAYER_NOT_DRAWN);
parent.AddChild(&child1);
@@ -345,7 +344,7 @@ TEST_F(WindowTest, Contains) {
EXPECT_TRUE(parent.Contains(&child1));
EXPECT_TRUE(parent.Contains(&child2));
- EXPECT_FALSE(parent.Contains(NULL));
+ EXPECT_FALSE(parent.Contains(nullptr));
EXPECT_FALSE(child1.Contains(&parent));
EXPECT_FALSE(child2.Contains(&child1));
}
@@ -376,7 +375,7 @@ TEST_F(WindowTest, ConvertPointToWindow) {
std::unique_ptr<Window> w1(CreateTestWindowWithId(1, root_window()));
gfx::Point reference_point(100, 100);
gfx::Point test_point = reference_point;
- Window::ConvertPointToTarget(NULL, w1.get(), &test_point);
+ Window::ConvertPointToTarget(nullptr, w1.get(), &test_point);
EXPECT_EQ(reference_point, test_point);
}
@@ -560,7 +559,7 @@ TEST_F(WindowTest, GetEventHandlerForPoint) {
Window* root = root_window();
w1->parent()->SetBounds(gfx::Rect(500, 500));
- EXPECT_EQ(NULL, root->GetEventHandlerForPoint(gfx::Point(5, 5)));
+ EXPECT_EQ(nullptr, root->GetEventHandlerForPoint(gfx::Point(5, 5)));
EXPECT_EQ(w1.get(), root->GetEventHandlerForPoint(gfx::Point(11, 11)));
EXPECT_EQ(w11.get(), root->GetEventHandlerForPoint(gfx::Point(16, 16)));
EXPECT_EQ(w111.get(), root->GetEventHandlerForPoint(gfx::Point(21, 21)));
@@ -606,8 +605,8 @@ TEST_F(WindowTest, GetToplevelWindow) {
std::unique_ptr<Window> w1111(
CreateTestWindowWithDelegate(&delegate, 1111, kBounds, w111.get()));
- EXPECT_TRUE(root_window()->GetToplevelWindow() == NULL);
- EXPECT_TRUE(w1->GetToplevelWindow() == NULL);
+ EXPECT_TRUE(root_window()->GetToplevelWindow() == nullptr);
+ EXPECT_TRUE(w1->GetToplevelWindow() == nullptr);
EXPECT_EQ(w11.get(), w11->GetToplevelWindow());
EXPECT_EQ(w11.get(), w111->GetToplevelWindow());
EXPECT_EQ(w11.get(), w1111->GetToplevelWindow());
@@ -632,7 +631,7 @@ TEST_F(WindowTest, WindowAddedToRootWindowShouldNotifyChildAndNotParent) {
AddedToRootWindowObserver child_observer;
std::unique_ptr<Window> parent_window(
CreateTestWindowWithId(1, root_window()));
- std::unique_ptr<Window> child_window(new Window(NULL));
+ std::unique_ptr<Window> child_window(new Window(nullptr));
child_window->Init(ui::LAYER_TEXTURED);
child_window->Show();
@@ -679,11 +678,11 @@ TEST_F(WindowTest, OrphanedBeforeOnDestroyed) {
// Make sure StackChildAtTop moves both the window and layer to the front.
TEST_F(WindowTest, StackChildAtTop) {
- Window parent(NULL);
+ Window parent(nullptr);
parent.Init(ui::LAYER_NOT_DRAWN);
- Window child1(NULL);
+ Window child1(nullptr);
child1.Init(ui::LAYER_NOT_DRAWN);
- Window child2(NULL);
+ Window child2(nullptr);
child2.Init(ui::LAYER_NOT_DRAWN);
parent.AddChild(&child1);
@@ -706,15 +705,15 @@ TEST_F(WindowTest, StackChildAtTop) {
// Make sure StackChildBelow works.
TEST_F(WindowTest, StackChildBelow) {
- Window parent(NULL);
+ Window parent(nullptr);
parent.Init(ui::LAYER_NOT_DRAWN);
- Window child1(NULL);
+ Window child1(nullptr);
child1.Init(ui::LAYER_NOT_DRAWN);
child1.set_id(1);
- Window child2(NULL);
+ Window child2(nullptr);
child2.Init(ui::LAYER_NOT_DRAWN);
child2.set_id(2);
- Window child3(NULL);
+ Window child3(nullptr);
child3.Init(ui::LAYER_NOT_DRAWN);
child3.set_id(3);
@@ -738,13 +737,13 @@ TEST_F(WindowTest, StackChildBelow) {
// Various assertions for StackChildAbove.
TEST_F(WindowTest, StackChildAbove) {
- Window parent(NULL);
+ Window parent(nullptr);
parent.Init(ui::LAYER_NOT_DRAWN);
- Window child1(NULL);
+ Window child1(nullptr);
child1.Init(ui::LAYER_NOT_DRAWN);
- Window child2(NULL);
+ Window child2(nullptr);
child2.Init(ui::LAYER_NOT_DRAWN);
- Window child3(NULL);
+ Window child3(nullptr);
child3.Init(ui::LAYER_NOT_DRAWN);
parent.AddChild(&child1);
@@ -844,7 +843,7 @@ TEST_F(WindowTest, CaptureTests) {
EXPECT_EQ(window.get(), aura::client::GetCaptureWindow(root_window()));
window->parent()->RemoveChild(window.get());
EXPECT_FALSE(window->HasCapture());
- EXPECT_EQ(NULL, aura::client::GetCaptureWindow(root_window()));
+ EXPECT_EQ(nullptr, aura::client::GetCaptureWindow(root_window()));
}
TEST_F(WindowTest, TouchCaptureCancelsOtherTouches) {
@@ -1097,8 +1096,8 @@ TEST_F(WindowTest, ReleaseCaptureOnDestroy) {
window.reset();
// Make sure the root window doesn't reference the window anymore.
- EXPECT_EQ(NULL, host()->dispatcher()->mouse_pressed_handler());
- EXPECT_EQ(NULL, aura::client::GetCaptureWindow(root_window()));
+ EXPECT_EQ(nullptr, host()->dispatcher()->mouse_pressed_handler());
+ EXPECT_EQ(nullptr, aura::client::GetCaptureWindow(root_window()));
}
TEST_F(WindowTest, GetBoundsInRootWindow) {
@@ -1455,13 +1454,13 @@ TEST_F(WindowTest, MouseEnterExitWithParentDelete) {
TEST_F(WindowTest, GetEventHandlerForPoint_NoDelegate) {
TestWindowDelegate d111;
std::unique_ptr<Window> w1(CreateTestWindowWithDelegate(
- NULL, 1, gfx::Rect(0, 0, 500, 500), root_window()));
+ nullptr, 1, gfx::Rect(0, 0, 500, 500), root_window()));
std::unique_ptr<Window> w11(CreateTestWindowWithDelegate(
- NULL, 11, gfx::Rect(0, 0, 500, 500), w1.get()));
+ nullptr, 11, gfx::Rect(0, 0, 500, 500), w1.get()));
std::unique_ptr<Window> w111(CreateTestWindowWithDelegate(
&d111, 111, gfx::Rect(50, 50, 450, 450), w11.get()));
std::unique_ptr<Window> w12(CreateTestWindowWithDelegate(
- NULL, 12, gfx::Rect(0, 0, 500, 500), w1.get()));
+ nullptr, 12, gfx::Rect(0, 0, 500, 500), w1.get()));
gfx::Point target_point = w111->bounds().CenterPoint();
EXPECT_EQ(w111.get(), w1->GetEventHandlerForPoint(target_point));
@@ -1561,7 +1560,7 @@ TEST_F(WindowTest, EventTargetingPolicy) {
TestWindowDelegate d111;
TestWindowDelegate d121;
std::unique_ptr<Window> w1(CreateTestWindowWithDelegate(
- NULL, 1, gfx::Rect(0, 0, 500, 500), root_window()));
+ nullptr, 1, gfx::Rect(0, 0, 500, 500), root_window()));
std::unique_ptr<Window> w11(CreateTestWindowWithDelegate(
&d11, 11, gfx::Rect(0, 0, 500, 500), w1.get()));
std::unique_ptr<Window> w111(CreateTestWindowWithDelegate(
@@ -1871,7 +1870,7 @@ class WindowObserverTest : public WindowTest,
// Return a tuple of the arguments passed in OnPropertyChanged callback.
PropertyChangeInfo PropertyChangeInfoAndClear() {
PropertyChangeInfo result(property_key_, old_property_value_);
- property_key_ = NULL;
+ property_key_ = nullptr;
old_property_value_ = -3;
return result;
}
@@ -2079,14 +2078,13 @@ TEST_F(WindowObserverTest, PropertyChanged) {
w1->SetNativeWindowProperty(native_prop_key, &*w1);
EXPECT_EQ(PropertyChangeInfo(native_prop_key, 0),
PropertyChangeInfoAndClear());
- w1->SetNativeWindowProperty(native_prop_key, NULL);
+ w1->SetNativeWindowProperty(native_prop_key, nullptr);
EXPECT_EQ(PropertyChangeInfo(native_prop_key,
reinterpret_cast<intptr_t>(&*w1)),
PropertyChangeInfoAndClear());
// Sanity check to see if |PropertyChangeInfoAndClear| really clears.
- EXPECT_EQ(PropertyChangeInfo(
- reinterpret_cast<const void*>(NULL), -3), PropertyChangeInfoAndClear());
+ EXPECT_EQ(PropertyChangeInfo(nullptr, -3), PropertyChangeInfoAndClear());
}
// Verify that WindowObserver::OnWindowBoundsChanged() is notified when the
@@ -2232,17 +2230,14 @@ TEST_F(WindowObserverTest, SetTransformAnimation) {
EXPECT_EQ(target_transform,
window_target_transform_changing_info().new_transform);
- ASSERT_EQ(1, window_transformed_info().changed_count);
- EXPECT_EQ(window.get(), window_transformed_info().window);
- EXPECT_EQ(ui::PropertyChangeReason::FROM_ANIMATION,
- window_transformed_info().reason);
+ ASSERT_EQ(0, window_transformed_info().changed_count);
window->layer()->GetAnimator()->StopAnimatingProperty(
ui::LayerAnimationElement::TRANSFORM);
EXPECT_EQ(1, window_target_transform_changing_info().changed_count);
- ASSERT_EQ(2, window_transformed_info().changed_count);
+ ASSERT_EQ(1, window_transformed_info().changed_count);
EXPECT_EQ(window.get(), window_transformed_info().window);
EXPECT_EQ(ui::PropertyChangeReason::FROM_ANIMATION,
window_transformed_info().reason);
@@ -2336,7 +2331,7 @@ TEST_F(WindowTest, AcquireLayer) {
window2.reset();
// This should be set by the window's destructor.
- EXPECT_TRUE(window1_layer->delegate() == NULL);
+ EXPECT_FALSE(window1_layer->delegate());
EXPECT_EQ(1U, parent->children().size());
}
@@ -2388,7 +2383,7 @@ TEST_F(WindowTest, AcquireThenRecreateLayer) {
SK_ColorWHITE, 1, gfx::Rect(0, 0, 100, 100), root_window()));
std::unique_ptr<ui::Layer> acquired_layer(w->AcquireLayer());
std::unique_ptr<ui::Layer> doubly_acquired_layer(w->RecreateLayer());
- EXPECT_EQ(NULL, doubly_acquired_layer.get());
+ EXPECT_FALSE(doubly_acquired_layer);
// Destroy window before layer gets destroyed.
w.reset();
@@ -2605,7 +2600,7 @@ TEST_F(WindowTest, RootWindowAttachment) {
RootWindowAttachmentObserver observer;
// Test a direct add/remove from the RootWindow.
- std::unique_ptr<Window> w1(new Window(NULL));
+ std::unique_ptr<Window> w1(new Window(nullptr));
w1->Init(ui::LAYER_NOT_DRAWN);
w1->AddObserver(&observer);
@@ -2620,9 +2615,9 @@ TEST_F(WindowTest, RootWindowAttachment) {
observer.Clear();
// Test an indirect add/remove from the RootWindow.
- w1.reset(new Window(NULL));
+ w1.reset(new Window(nullptr));
w1->Init(ui::LAYER_NOT_DRAWN);
- Window* w11 = new Window(NULL);
+ Window* w11 = new Window(nullptr);
w11->Init(ui::LAYER_NOT_DRAWN);
w11->AddObserver(&observer);
w1->AddChild(w11);
@@ -2634,20 +2629,20 @@ TEST_F(WindowTest, RootWindowAttachment) {
EXPECT_EQ(0, observer.removed_count());
w1.reset(); // Deletes w11.
- w11 = NULL;
+ w11 = nullptr;
EXPECT_EQ(1, observer.added_count());
EXPECT_EQ(1, observer.removed_count());
observer.Clear();
// Test an indirect add/remove with nested observers.
- w1.reset(new Window(NULL));
+ w1.reset(new Window(nullptr));
w1->Init(ui::LAYER_NOT_DRAWN);
- w11 = new Window(NULL);
+ w11 = new Window(nullptr);
w11->Init(ui::LAYER_NOT_DRAWN);
w11->AddObserver(&observer);
w1->AddChild(w11);
- Window* w111 = new Window(NULL);
+ Window* w111 = new Window(nullptr);
w111->Init(ui::LAYER_NOT_DRAWN);
w111->AddObserver(&observer);
w11->AddChild(w111);
@@ -2660,8 +2655,8 @@ TEST_F(WindowTest, RootWindowAttachment) {
EXPECT_EQ(0, observer.removed_count());
w1.reset(); // Deletes w11 and w111.
- w11 = NULL;
- w111 = NULL;
+ w11 = nullptr;
+ w111 = nullptr;
EXPECT_EQ(2, observer.added_count());
EXPECT_EQ(2, observer.removed_count());
}
@@ -2674,7 +2669,7 @@ class BoundsChangedWindowObserver : public WindowObserver {
const gfx::Rect& old_bounds,
const gfx::Rect& new_bounds,
ui::PropertyChangeReason reason) override {
- root_set_ = window->GetRootWindow() != NULL;
+ root_set_ = !!window->GetRootWindow();
}
bool root_set() const { return root_set_; }
@@ -2686,9 +2681,9 @@ class BoundsChangedWindowObserver : public WindowObserver {
};
TEST_F(WindowTest, RootWindowSetWhenReparenting) {
- Window parent1(NULL);
+ Window parent1(nullptr);
parent1.Init(ui::LAYER_NOT_DRAWN);
- Window parent2(NULL);
+ Window parent2(nullptr);
parent2.Init(ui::LAYER_NOT_DRAWN);
ParentWindow(&parent1);
ParentWindow(&parent2);
@@ -2696,7 +2691,7 @@ TEST_F(WindowTest, RootWindowSetWhenReparenting) {
parent2.SetBounds(gfx::Rect(20, 20, 300, 300));
BoundsChangedWindowObserver observer;
- Window child(NULL);
+ Window child(nullptr);
child.Init(ui::LAYER_NOT_DRAWN);
child.SetBounds(gfx::Rect(5, 5, 100, 100));
parent1.AddChild(&child);
@@ -2727,9 +2722,9 @@ TEST_F(WindowTest, OwnedByParentFalse) {
// By default, a window is owned by its parent. If this is set to false, the
// window will not be destroyed when its parent is.
- std::unique_ptr<Window> w1(new Window(NULL));
+ std::unique_ptr<Window> w1(new Window(nullptr));
w1->Init(ui::LAYER_NOT_DRAWN);
- std::unique_ptr<Window> w2(new Window(NULL));
+ std::unique_ptr<Window> w2(new Window(nullptr));
w2->set_owned_by_parent(false);
w2->Init(ui::LAYER_NOT_DRAWN);
w1->AddChild(w2.get());
@@ -2737,7 +2732,7 @@ TEST_F(WindowTest, OwnedByParentFalse) {
w1.reset();
// We should be able to deref w2 still, but its parent should now be NULL.
- EXPECT_EQ(NULL, w2->parent());
+ EXPECT_FALSE(w2->parent());
}
// Used By DeleteWindowFromOnWindowDestroyed. Destroys a Window from
@@ -2750,7 +2745,7 @@ class OwningWindowDelegate : public TestWindowDelegate {
owned_window_.reset(window);
}
- void OnWindowDestroyed(Window* window) override { owned_window_.reset(NULL); }
+ void OnWindowDestroyed(Window* window) override { owned_window_.reset(); }
private:
std::unique_ptr<Window> owned_window_;
@@ -2764,13 +2759,13 @@ class OwningWindowDelegate : public TestWindowDelegate {
// same parent and destroying BrowserView triggers it destroying the status
// bubble.
TEST_F(WindowTest, DeleteWindowFromOnWindowDestroyed) {
- std::unique_ptr<Window> parent(new Window(NULL));
+ std::unique_ptr<Window> parent(new Window(nullptr));
parent->Init(ui::LAYER_NOT_DRAWN);
OwningWindowDelegate delegate;
Window* c1 = new Window(&delegate);
c1->Init(ui::LAYER_NOT_DRAWN);
parent->AddChild(c1);
- Window* c2 = new Window(NULL);
+ Window* c2 = new Window(nullptr);
c2->Init(ui::LAYER_NOT_DRAWN);
parent->AddChild(c2);
delegate.SetOwnedWindow(c2);
@@ -2900,7 +2895,7 @@ TEST_F(WindowTest, DelegateNotifiedAsBoundsChangeInHiddenLayer) {
// Suppress paint on the layer since it is hidden (should reset the layer's
// delegate to NULL)
window->layer()->SuppressPaint();
- EXPECT_EQ(NULL, window->layer()->delegate());
+ EXPECT_FALSE(window->layer()->delegate());
// Animate to a different position.
{
@@ -3024,7 +3019,7 @@ TEST_F(WindowTest, OnWindowHierarchyChange) {
// Simple add & remove.
HierarchyObserver oroot(root_window());
- std::unique_ptr<Window> w1(CreateTestWindowWithId(1, NULL));
+ std::unique_ptr<Window> w1(CreateTestWindowWithId(1, nullptr));
HierarchyObserver o1(w1.get());
// Add.
@@ -3033,7 +3028,7 @@ TEST_F(WindowTest, OnWindowHierarchyChange) {
WindowObserver::HierarchyChangeParams params;
params.phase = WindowObserver::HierarchyChangeParams::HIERARCHY_CHANGING;
params.target = w1.get();
- params.old_parent = NULL;
+ params.old_parent = nullptr;
params.new_parent = root_window();
params.receiver = w1.get();
o1.ValidateState(0, params);
@@ -3053,7 +3048,7 @@ TEST_F(WindowTest, OnWindowHierarchyChange) {
params.phase = WindowObserver::HierarchyChangeParams::HIERARCHY_CHANGING;
params.old_parent = root_window();
- params.new_parent = NULL;
+ params.new_parent = nullptr;
params.receiver = w1.get();
o1.ValidateState(0, params);
@@ -3070,7 +3065,7 @@ TEST_F(WindowTest, OnWindowHierarchyChange) {
// Add & remove of hierarchy. Tests notification order per documentation in
// WindowObserver.
HierarchyObserver o(root_window());
- std::unique_ptr<Window> w1(CreateTestWindowWithId(1, NULL));
+ std::unique_ptr<Window> w1(CreateTestWindowWithId(1, nullptr));
Window* w11 = CreateTestWindowWithId(11, w1.get());
w1->AddObserver(&o);
w11->AddObserver(&o);
@@ -3083,7 +3078,7 @@ TEST_F(WindowTest, OnWindowHierarchyChange) {
WindowObserver::HierarchyChangeParams params;
params.phase = WindowObserver::HierarchyChangeParams::HIERARCHY_CHANGING;
params.target = w1.get();
- params.old_parent = NULL;
+ params.old_parent = nullptr;
params.new_parent = root_window();
params.receiver = w1.get();
o.ValidateState(index++, params);
@@ -3106,7 +3101,7 @@ TEST_F(WindowTest, OnWindowHierarchyChange) {
root_window()->RemoveChild(w1.get());
params.phase = WindowObserver::HierarchyChangeParams::HIERARCHY_CHANGING;
params.old_parent = root_window();
- params.new_parent = NULL;
+ params.new_parent = nullptr;
params.receiver = w1.get();
o.ValidateState(index++, params);
params.receiver = w11;
diff --git a/chromium/ui/base/BUILD.gn b/chromium/ui/base/BUILD.gn
index 547ecab34e4..1179753aeff 100644
--- a/chromium/ui/base/BUILD.gn
+++ b/chromium/ui/base/BUILD.gn
@@ -3,6 +3,7 @@
# found in the LICENSE file.
import("//build/buildflag_header.gni")
+import("//build/config/chromeos/ui_mode.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/dcheck_always_on.gni")
import("//build/config/jumbo.gni")
@@ -66,6 +67,7 @@ buildflag_header("buildflags") {
flags = [
"ENABLE_HIDPI=$enable_hidpi",
"ENABLE_MESSAGE_CENTER=$enable_message_center",
+ "LACROS=$chromeos_is_browser_only",
"USE_ATK=$use_atk",
"USE_XKBCOMMON=$use_xkbcommon",
"HAS_NATIVE_ACCESSIBILITY=$has_native_accessibility",
@@ -93,9 +95,6 @@ jumbo_component("base") {
sources = [
"class_property.cc",
"class_property.h",
- "cursor/cursor_loader.h",
- "cursor/cursor_lookup.cc",
- "cursor/cursor_lookup.h",
"default_style.h",
"device_form_factor.h",
"device_form_factor_desktop.cc",
@@ -158,7 +157,6 @@ jumbo_component("base") {
"template_expressions.h",
"theme_provider.cc",
"theme_provider.h",
- "ui_base_export.h",
"ui_base_exports.cc",
"ui_base_paths.cc",
"ui_base_paths.h",
@@ -178,6 +176,8 @@ jumbo_component("base") {
"window_open_disposition.h",
]
+ libs = []
+
if (is_android) {
sources += [
"device_form_factor_android.cc",
@@ -207,6 +207,8 @@ jumbo_component("base") {
"win/accessibility_misc_utils.cc",
"win/accessibility_misc_utils.h",
"win/atl_module.h",
+ "win/event_creation_utils.cc",
+ "win/event_creation_utils.h",
"win/foreground_helper.cc",
"win/foreground_helper.h",
"win/hidden_window.cc",
@@ -234,6 +236,11 @@ jumbo_component("base") {
"win/window_event_target.cc",
"win/window_event_target.h",
]
+ ldflags = [ "/DELAYLOAD:dwmapi.dll" ]
+ libs += [
+ "dwmapi.lib",
+ "wtsapi32.lib",
+ ]
}
if (is_mac) {
@@ -333,8 +340,6 @@ jumbo_component("base") {
"accelerators/system_media_controls_media_keys_listener.h",
"base_window.cc",
"base_window.h",
- "cursor/cursor_util.cc",
- "cursor/cursor_util.h",
"emoji/emoji_panel_helper.h",
"pointer/pointer_device.h",
"pointer/pointer_device_util.cc",
@@ -416,7 +421,7 @@ jumbo_component("base") {
configs += [ "//build/config/compiler:wexit_time_destructors" ]
- defines = [ "UI_BASE_IMPLEMENTATION" ]
+ defines = [ "IS_UI_BASE_IMPL" ]
public_deps = [
":buildflags",
@@ -425,11 +430,10 @@ jumbo_component("base") {
":ui_data_pack",
"//base",
"//skia",
- "//ui/base/cursor",
- "//ui/base/cursor/mojom:cursor_type",
"//ui/gfx",
"//ui/gfx/geometry",
]
+
deps = [
"//base:base_static",
"//base:i18n",
@@ -445,7 +449,7 @@ jumbo_component("base") {
"//ui/display",
"//ui/events",
"//ui/events/devices",
- "//ui/resources",
+ "//ui/resources:webui_resources_grd",
"//ui/strings",
"//url",
]
@@ -479,7 +483,7 @@ jumbo_component("base") {
deps += [ "//ui/events" ]
}
- if (is_desktop_linux && (use_x11 || ozone_platform_x11)) {
+ if ((is_desktop_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.
@@ -494,8 +498,6 @@ jumbo_component("base") {
if (use_x11 && use_aura) {
sources += [
- "cursor/cursor_loader_x11.cc",
- "cursor/cursor_loader_x11.h",
"x/selection_requestor.cc",
"x/selection_requestor.h",
]
@@ -521,14 +523,6 @@ jumbo_component("base") {
deps += [ "//third_party/fontconfig" ]
}
- if (is_desktop_linux) {
- sources += [
- "cursor/cursor_theme_manager_linux.cc",
- "cursor/cursor_theme_manager_linux.h",
- "cursor/cursor_theme_manager_linux_observer.h",
- ]
- }
-
if (use_glib) {
configs += [ "//build/config/linux:glib" ]
sources += [
@@ -540,8 +534,8 @@ jumbo_component("base") {
if (is_chromeos || (use_aura && is_linux && !use_x11)) {
sources += [
- "dragdrop/os_exchange_data_provider_aura.cc",
- "dragdrop/os_exchange_data_provider_aura.h",
+ "dragdrop/os_exchange_data_provider_non_backed.cc",
+ "dragdrop/os_exchange_data_provider_non_backed.h",
]
}
@@ -549,37 +543,11 @@ jumbo_component("base") {
deps += [ "//ui/base/clipboard" ]
}
- libs = []
- if (is_win) {
- sources += [
- "cursor/cursor_loader_win.cc",
- "cursor/cursor_loader_win.h",
- ]
- deps += [ "//third_party/wtl" ]
- cflags = [ "/wd4324" ] # Structure was padded due to __declspec(align()),
- # which is uninteresting.
-
- ldflags = [
- "/DELAYLOAD:d2d1.dll",
- "/DELAYLOAD:d3d10_1.dll",
- "/DELAYLOAD:dwmapi.dll",
- ]
- libs += [
- "d2d1.lib",
- "d3d10_1.lib",
- "dwmapi.lib",
- "d2d1.lib",
- "dwmapi.lib",
- "oleacc.lib",
- "wtsapi32.lib",
+ if (!use_aura) {
+ sources -= [
+ "view_prop.cc",
+ "view_prop.h",
]
- } else {
- if (!use_aura) {
- sources -= [
- "view_prop.cc",
- "view_prop.h",
- ]
- }
}
if (is_mac) {
@@ -596,20 +564,6 @@ jumbo_component("base") {
]
}
- if (use_ozone) {
- sources += [
- "cursor/cursor_loader_ozone.cc",
- "cursor/cursor_loader_ozone.h",
- "cursor/ozone/bitmap_cursor_factory_ozone.cc",
- "cursor/ozone/bitmap_cursor_factory_ozone.h",
- ]
-
- deps += [
- "//ui/events/ozone/layout",
- "//ui/ozone:ozone_base",
- ]
- }
-
if (!toolkit_views && !use_aura) {
sources -= [
"dragdrop/drag_drop_types.h",
@@ -637,16 +591,6 @@ jumbo_component("base") {
]
}
- if (use_aura) {
- # Cursor
- sources += [
- "cursor/cursors_aura.cc",
- "cursor/cursors_aura.h",
- "cursor/image_cursors.cc",
- "cursor/image_cursors.h",
- ]
- }
-
if (is_android || is_ios) {
sources -= [ "device_form_factor_desktop.cc" ]
}
@@ -690,10 +634,13 @@ component("features") {
]
}
+# TODO(crbug.com/1091985): Support CrOS.
if (is_win || is_mac || (is_linux && !is_chromeos)) {
jumbo_static_library("pixel_diff_test_support") {
testonly = true
sources = [
+ "test/skia_gold_matching_algorithm.cc",
+ "test/skia_gold_matching_algorithm.h",
"test/skia_gold_pixel_diff.cc",
"test/skia_gold_pixel_diff.h",
]
@@ -969,6 +916,7 @@ test("ui_base_unittests") {
"//ui/base:ui_data_pack",
"//ui/base/clipboard:clipboard_test",
"//ui/base/clipboard:clipboard_types",
+ "//ui/base/cursor:unittests",
"//ui/display",
"//ui/events:events_base",
"//ui/events:test_support",
@@ -999,18 +947,13 @@ test("ui_base_unittests") {
"accelerators/accelerator_unittest.cc",
"accelerators/menu_label_accelerator_util_unittest.cc",
"accelerators/system_media_controls_media_keys_listener_unittest.cc",
- "cursor/cursor_unittest.cc",
- "cursor/cursor_util_unittest.cc",
"models/list_model_unittest.cc",
"models/list_selection_model_unittest.cc",
"models/tree_node_model_unittest.cc",
"text/bytes_formatting_unittest.cc",
"webui/web_ui_util_unittest.cc",
]
- deps += [
- "//components/system_media_controls:test_support",
- "//ui/base/cursor/mojom:cursor_type",
- ]
+ deps += [ "//components/system_media_controls:test_support" ]
if (is_linux) {
sources +=
@@ -1033,8 +976,12 @@ test("ui_base_unittests") {
}
}
+ # TODO(crbug.com/1091985): Support CrOS.
if (is_win || is_mac || (is_linux && !is_chromeos)) {
- sources += [ "test/skia_gold_pixel_diff_unittest.cc" ]
+ sources += [
+ "test/skia_gold_matching_algorithm_unittest.cc",
+ "test/skia_gold_pixel_diff_unittest.cc",
+ ]
deps += [ ":pixel_diff_test_support" ]
}
@@ -1114,23 +1061,9 @@ test("ui_base_unittests") {
if (is_win) {
sources += [
"dragdrop/os_exchange_data_win_unittest.cc",
+ "view_prop_unittest.cc",
"win/hwnd_subclass_unittest.cc",
]
-
- ldflags = [
- "/DELAYLOAD:d2d1.dll",
- "/DELAYLOAD:d3d10_1.dll",
- ]
- libs = [
- "d2d1.lib",
- "d3d10_1.lib",
- "imm32.lib",
- "oleacc.lib",
- ]
- }
-
- if (is_win) {
- sources += [ "view_prop_unittest.cc" ]
}
if (is_android) {
@@ -1146,6 +1079,7 @@ test("ui_base_unittests") {
if (use_x11) {
deps += [
+ "//ui/base/x:unittests",
"//ui/events/platform/x11",
"//ui/gfx/x",
]
@@ -1173,6 +1107,7 @@ test("ui_base_unittests") {
"dragdrop/os_exchange_data_provider_x11_unittest.cc",
"x/selection_requestor_unittest.cc",
]
+ deps += [ "//ui/gfx/x:unit_test" ]
}
if (is_chromeos) {
diff --git a/chromium/ui/base/DEPS b/chromium/ui/base/DEPS
index 9179ffdd1b2..10a3245a323 100644
--- a/chromium/ui/base/DEPS
+++ b/chromium/ui/base/DEPS
@@ -15,4 +15,5 @@ include_rules = [
"+ui/resources/grit/webui_resources.h",
"+ui/strings/grit/app_locale_settings.h",
"+ui/strings/grit/ui_strings.h",
+ "+url"
]
diff --git a/chromium/ui/base/accelerators/accelerator.cc b/chromium/ui/base/accelerators/accelerator.cc
index 2ab364badbe..7f26ef86fe9 100644
--- a/chromium/ui/base/accelerators/accelerator.cc
+++ b/chromium/ui/base/accelerators/accelerator.cc
@@ -135,17 +135,11 @@ Accelerator::Accelerator(const KeyEvent& key_event)
#endif
}
-Accelerator::Accelerator(const Accelerator& accelerator) {
- key_code_ = accelerator.key_code_;
- key_state_ = accelerator.key_state_;
- modifiers_ = accelerator.modifiers_;
- time_stamp_ = accelerator.time_stamp_;
- interrupted_by_mouse_event_ = accelerator.interrupted_by_mouse_event_;
- source_device_id_ = accelerator.source_device_id_;
-}
+Accelerator::Accelerator(const Accelerator& accelerator) = default;
-Accelerator::~Accelerator() {
-}
+Accelerator& Accelerator::operator=(const Accelerator& accelerator) = default;
+
+Accelerator::~Accelerator() = default;
// static
int Accelerator::MaskOutKeyEventFlags(int flags) {
@@ -159,17 +153,6 @@ KeyEvent Accelerator::ToKeyEvent() const {
key_code(), modifiers(), time_stamp());
}
-Accelerator& Accelerator::operator=(const Accelerator& accelerator) {
- if (this != &accelerator) {
- key_code_ = accelerator.key_code_;
- key_state_ = accelerator.key_state_;
- modifiers_ = accelerator.modifiers_;
- time_stamp_ = accelerator.time_stamp_;
- interrupted_by_mouse_event_ = accelerator.interrupted_by_mouse_event_;
- }
- return *this;
-}
-
bool Accelerator::operator <(const Accelerator& rhs) const {
const int modifiers_with_mask = MaskOutKeyEventFlags(modifiers_);
const int rhs_modifiers_with_mask = MaskOutKeyEventFlags(rhs.modifiers_);
diff --git a/chromium/ui/base/accelerators/accelerator.h b/chromium/ui/base/accelerators/accelerator.h
index d4b97e5b6ee..6111a3bf550 100644
--- a/chromium/ui/base/accelerators/accelerator.h
+++ b/chromium/ui/base/accelerators/accelerator.h
@@ -14,10 +14,10 @@
#include <memory>
#include <utility>
+#include "base/component_export.h"
#include "base/strings/string16.h"
#include "base/time/time.h"
#include "build/build_config.h"
-#include "ui/base/ui_base_export.h"
#include "ui/events/event_constants.h"
#include "ui/events/keycodes/keyboard_codes.h"
@@ -30,7 +30,7 @@ class KeyEvent;
// for a particular KeyEvent matches an accelerator with or without the repeat
// flag. A side effect of this is that == (and <) does not consider the
// repeat flag in its comparison.
-class UI_BASE_EXPORT Accelerator {
+class COMPONENT_EXPORT(UI_BASE) Accelerator {
public:
enum class KeyState {
PRESSED,
@@ -48,6 +48,7 @@ class UI_BASE_EXPORT Accelerator {
base::TimeTicks time_stamp = base::TimeTicks());
explicit Accelerator(const KeyEvent& key_event);
Accelerator(const Accelerator& accelerator);
+ Accelerator& operator=(const Accelerator& accelerator);
~Accelerator();
// Masks out all the non-modifiers KeyEvent |flags| and returns only the
@@ -56,8 +57,6 @@ class UI_BASE_EXPORT Accelerator {
KeyEvent ToKeyEvent() const;
- Accelerator& operator=(const Accelerator& accelerator);
-
// Define the < operator so that the KeyboardShortcut can be used as a key in
// a std::map.
bool operator <(const Accelerator& rhs) const;
@@ -129,7 +128,7 @@ class UI_BASE_EXPORT Accelerator {
// An interface that classes that want to register for keyboard accelerators
// should implement.
-class UI_BASE_EXPORT AcceleratorTarget {
+class COMPONENT_EXPORT(UI_BASE) AcceleratorTarget {
public:
// Should return true if the accelerator was processed.
virtual bool AcceleratorPressed(const Accelerator& accelerator) = 0;
diff --git a/chromium/ui/base/accelerators/accelerator_history.h b/chromium/ui/base/accelerators/accelerator_history.h
index e9413773dbb..5d5ece78516 100644
--- a/chromium/ui/base/accelerators/accelerator_history.h
+++ b/chromium/ui/base/accelerators/accelerator_history.h
@@ -7,15 +7,15 @@
#include <set>
+#include "base/component_export.h"
#include "base/macros.h"
#include "ui/base/accelerators/accelerator.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
// Keeps track of the system-wide current and the most recent previous
// key accelerators.
-class UI_BASE_EXPORT AcceleratorHistory {
+class COMPONENT_EXPORT(UI_BASE) AcceleratorHistory {
public:
AcceleratorHistory();
~AcceleratorHistory();
diff --git a/chromium/ui/base/accelerators/accelerator_manager.h b/chromium/ui/base/accelerators/accelerator_manager.h
index 9eeec5ce99e..6d7c88604a0 100644
--- a/chromium/ui/base/accelerators/accelerator_manager.h
+++ b/chromium/ui/base/accelerators/accelerator_manager.h
@@ -10,16 +10,16 @@
#include <utility>
#include <vector>
+#include "base/component_export.h"
#include "base/macros.h"
#include "ui/base/accelerators/accelerator.h"
-#include "ui/base/ui_base_export.h"
#include "ui/events/event_constants.h"
namespace ui {
// AcceleratorManger handles processing of accelerators. A delegate may be
// supplied which is notified as unique accelerators are added and removed.
-class UI_BASE_EXPORT AcceleratorManager {
+class COMPONENT_EXPORT(UI_BASE) AcceleratorManager {
public:
enum HandlerPriority {
kNormalPriority,
diff --git a/chromium/ui/base/accelerators/global_media_keys_listener_win.h b/chromium/ui/base/accelerators/global_media_keys_listener_win.h
index 8de4946c61c..2f20ba52397 100644
--- a/chromium/ui/base/accelerators/global_media_keys_listener_win.h
+++ b/chromium/ui/base/accelerators/global_media_keys_listener_win.h
@@ -5,10 +5,10 @@
#ifndef UI_BASE_ACCELERATORS_GLOBAL_MEDIA_KEYS_LISTENER_WIN_H_
#define UI_BASE_ACCELERATORS_GLOBAL_MEDIA_KEYS_LISTENER_WIN_H_
+#include "base/component_export.h"
#include "base/containers/flat_map.h"
#include "base/win/windows_types.h"
#include "ui/base/accelerators/media_keys_listener.h"
-#include "ui/base/ui_base_export.h"
#include "ui/events/keycodes/keyboard_codes.h"
namespace gfx {
@@ -22,7 +22,8 @@ namespace ui {
// Implementation of MediaKeysListener that uses RegisterHotKey to globally
// listen for media key presses. It only allows for a single instance to be
// created in order to prevent conflicts form multiple listeners.
-class UI_BASE_EXPORT GlobalMediaKeysListenerWin : public MediaKeysListener {
+class COMPONENT_EXPORT(UI_BASE) GlobalMediaKeysListenerWin
+ : public MediaKeysListener {
public:
explicit GlobalMediaKeysListenerWin(MediaKeysListener::Delegate* delegate);
~GlobalMediaKeysListenerWin() override;
diff --git a/chromium/ui/base/accelerators/media_keys_listener.h b/chromium/ui/base/accelerators/media_keys_listener.h
index 997718d8aff..6787fa39da1 100644
--- a/chromium/ui/base/accelerators/media_keys_listener.h
+++ b/chromium/ui/base/accelerators/media_keys_listener.h
@@ -8,8 +8,8 @@
#include <memory>
#include "base/callback.h"
+#include "base/component_export.h"
#include "base/observer_list_types.h"
-#include "ui/base/ui_base_export.h"
#include "ui/events/keycodes/keyboard_codes.h"
namespace ui {
@@ -17,7 +17,7 @@ namespace ui {
class Accelerator;
// Create MediaKeyListener to receive accelerators on media keys.
-class UI_BASE_EXPORT MediaKeysListener {
+class COMPONENT_EXPORT(UI_BASE) MediaKeysListener {
public:
enum class Scope {
kGlobal, // Listener works whenever application in focus or not.
@@ -25,7 +25,7 @@ class UI_BASE_EXPORT MediaKeysListener {
};
// Media keys accelerators receiver.
- class UI_BASE_EXPORT Delegate : public base::CheckedObserver {
+ class COMPONENT_EXPORT(UI_BASE) Delegate : public base::CheckedObserver {
public:
~Delegate() override;
diff --git a/chromium/ui/base/accelerators/media_keys_listener_mac.mm b/chromium/ui/base/accelerators/media_keys_listener_mac.mm
index 85378bb565d..6052fd13ff3 100644
--- a/chromium/ui/base/accelerators/media_keys_listener_mac.mm
+++ b/chromium/ui/base/accelerators/media_keys_listener_mac.mm
@@ -11,6 +11,7 @@
#include <IOKit/hidsystem/ev_keymap.h>
#include "base/containers/flat_set.h"
+#include "base/logging.h"
#include "ui/base/accelerators/accelerator.h"
#include "ui/base/accelerators/system_media_controls_media_keys_listener.h"
diff --git a/chromium/ui/base/accelerators/media_keys_util.h b/chromium/ui/base/accelerators/media_keys_util.h
index 95a98d58598..029a9572f7f 100644
--- a/chromium/ui/base/accelerators/media_keys_util.h
+++ b/chromium/ui/base/accelerators/media_keys_util.h
@@ -5,7 +5,7 @@
#ifndef UI_BASE_ACCELERATORS_MEDIA_KEYS_UTIL_H_
#define UI_BASE_ACCELERATORS_MEDIA_KEYS_UTIL_H_
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
@@ -24,12 +24,13 @@ enum class MediaHardwareKeyAction {
};
// The name of the histogram that records |MediaHardwareKeyAction|.
-UI_BASE_EXPORT extern const char kMediaHardwareKeyActionHistogramName[];
+COMPONENT_EXPORT(UI_BASE)
+extern const char kMediaHardwareKeyActionHistogramName[];
// Records a media hardware key action to the
// |kMediaHardwareKeyActionHistogramName| histogram.
-UI_BASE_EXPORT void RecordMediaHardwareKeyAction(
- ui::MediaHardwareKeyAction action);
+COMPONENT_EXPORT(UI_BASE)
+void RecordMediaHardwareKeyAction(ui::MediaHardwareKeyAction action);
} // namespace ui
diff --git a/chromium/ui/base/accelerators/menu_label_accelerator_util.h b/chromium/ui/base/accelerators/menu_label_accelerator_util.h
index d70b21b6a34..fcdcd206a09 100644
--- a/chromium/ui/base/accelerators/menu_label_accelerator_util.h
+++ b/chromium/ui/base/accelerators/menu_label_accelerator_util.h
@@ -7,17 +7,17 @@
#include <string>
+#include "base/component_export.h"
#include "base/strings/string16.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
-UI_BASE_EXPORT base::char16 GetMnemonic(const base::string16& label);
+COMPONENT_EXPORT(UI_BASE) base::char16 GetMnemonic(const base::string16& label);
// This function escapes every '&' in label by replacing it with '&&', to avoid
// having single ampersands in user-provided strings treated as accelerators.
-UI_BASE_EXPORT base::string16 EscapeMenuLabelAmpersands(
- const base::string16& label);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 EscapeMenuLabelAmpersands(const base::string16& label);
} // namespace ui
diff --git a/chromium/ui/base/accelerators/menu_label_accelerator_util_linux.h b/chromium/ui/base/accelerators/menu_label_accelerator_util_linux.h
index 3d1c5d073f5..d799fb5ec28 100644
--- a/chromium/ui/base/accelerators/menu_label_accelerator_util_linux.h
+++ b/chromium/ui/base/accelerators/menu_label_accelerator_util_linux.h
@@ -7,18 +7,18 @@
#include <string>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
// Change windows accelerator style to GTK style. (GTK uses _ for
// accelerators. Windows uses & with && as an escape for &.)
-UI_BASE_EXPORT std::string ConvertAcceleratorsFromWindowsStyle(
- const std::string& label);
+COMPONENT_EXPORT(UI_BASE)
+std::string ConvertAcceleratorsFromWindowsStyle(const std::string& label);
// Removes the "&" accelerators from a Windows label.
-UI_BASE_EXPORT std::string RemoveWindowsStyleAccelerators(
- const std::string& label);
+COMPONENT_EXPORT(UI_BASE)
+std::string RemoveWindowsStyleAccelerators(const std::string& label);
} // namespace ui
diff --git a/chromium/ui/base/accelerators/platform_accelerator_cocoa.h b/chromium/ui/base/accelerators/platform_accelerator_cocoa.h
index 9feb15fab9a..26e93bd6f08 100644
--- a/chromium/ui/base/accelerators/platform_accelerator_cocoa.h
+++ b/chromium/ui/base/accelerators/platform_accelerator_cocoa.h
@@ -7,8 +7,8 @@
#import <Foundation/Foundation.h>
+#include "base/component_export.h"
#include "ui/base/accelerators/accelerator.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
@@ -19,7 +19,8 @@ namespace ui {
// accelerators have an associated NSMenuItem. Each NSMenuItem is specified with
// a |key_equivalent| and |modifier_mask|. This function takes a ui::Accelerator
// and returns the associated |key_equivalent| and |modifier_mask|.
-UI_BASE_EXPORT void GetKeyEquivalentAndModifierMaskFromAccelerator(
+COMPONENT_EXPORT(UI_BASE)
+void GetKeyEquivalentAndModifierMaskFromAccelerator(
const ui::Accelerator& accelerator,
NSString** key_equivalent,
NSUInteger* modifier_mask);
diff --git a/chromium/ui/base/accelerators/system_media_controls_media_keys_listener.h b/chromium/ui/base/accelerators/system_media_controls_media_keys_listener.h
index 2159509caa6..847669a515e 100644
--- a/chromium/ui/base/accelerators/system_media_controls_media_keys_listener.h
+++ b/chromium/ui/base/accelerators/system_media_controls_media_keys_listener.h
@@ -5,10 +5,10 @@
#ifndef UI_BASE_ACCELERATORS_SYSTEM_MEDIA_CONTROLS_MEDIA_KEYS_LISTENER_H_
#define UI_BASE_ACCELERATORS_SYSTEM_MEDIA_CONTROLS_MEDIA_KEYS_LISTENER_H_
+#include "base/component_export.h"
#include "base/containers/flat_set.h"
#include "components/system_media_controls/system_media_controls_observer.h"
#include "ui/base/accelerators/media_keys_listener.h"
-#include "ui/base/ui_base_export.h"
#include "ui/events/keycodes/keyboard_codes.h"
namespace system_media_controls {
@@ -20,7 +20,7 @@ namespace ui {
// Implementation of MediaKeysListener that uses the SystemMediaControls API to
// listen for media key presses. It only allows for a single instance to be
// created in order to prevent conflicts from multiple listeners.
-class UI_BASE_EXPORT SystemMediaControlsMediaKeysListener
+class COMPONENT_EXPORT(UI_BASE) SystemMediaControlsMediaKeysListener
: public MediaKeysListener,
public system_media_controls::SystemMediaControlsObserver {
public:
diff --git a/chromium/ui/base/base_window.h b/chromium/ui/base/base_window.h
index 1719233015b..c4695328177 100644
--- a/chromium/ui/base/base_window.h
+++ b/chromium/ui/base/base_window.h
@@ -6,6 +6,7 @@
#define UI_BASE_BASE_WINDOW_H_
#include "base/compiler_specific.h"
+#include "base/component_export.h"
#include "build/build_config.h"
#include "ui/base/ui_base_types.h"
#include "ui/gfx/native_widget_types.h"
@@ -18,7 +19,7 @@ namespace ui {
// Provides an interface to perform actions on windows, and query window
// state.
-class UI_BASE_EXPORT BaseWindow {
+class COMPONENT_EXPORT(UI_BASE) BaseWindow {
public:
// Returns true if the window is currently the active/focused window.
virtual bool IsActive() const = 0;
diff --git a/chromium/ui/base/class_property.h b/chromium/ui/base/class_property.h
index d7fcf47d318..4af52aef43d 100644
--- a/chromium/ui/base/class_property.h
+++ b/chromium/ui/base/class_property.h
@@ -10,8 +10,8 @@
#include <map>
#include <set>
+#include "base/component_export.h"
#include "base/time/time.h"
-#include "ui/base/ui_base_export.h"
#include "ui/base/ui_base_types.h"
// This header should be included by code that defines ClassProperties.
@@ -64,7 +64,7 @@ class PropertyHelper;
}
-class UI_BASE_EXPORT PropertyHandler {
+class COMPONENT_EXPORT(UI_BASE) PropertyHandler {
public:
PropertyHandler();
PropertyHandler(PropertyHandler&& other);
@@ -166,7 +166,7 @@ class ClassPropertyCaster<base::TimeDelta> {
namespace subtle {
-class UI_BASE_EXPORT PropertyHelper {
+class COMPONENT_EXPORT(UI_BASE) PropertyHelper {
public:
template<typename T>
static void Set(::ui::PropertyHandler* handler,
diff --git a/chromium/ui/base/clipboard/BUILD.gn b/chromium/ui/base/clipboard/BUILD.gn
index 61570cc1f2e..b36512c4c36 100644
--- a/chromium/ui/base/clipboard/BUILD.gn
+++ b/chromium/ui/base/clipboard/BUILD.gn
@@ -20,29 +20,30 @@ jumbo_component("clipboard_types") {
"clipboard_constants.h",
]
+ if (!is_ios) {
+ sources += [ "clipboard_format_type.h" ]
+ }
+
if (is_android) {
sources += [ "clipboard_format_type_android.cc" ]
}
if (is_mac) {
- sources += [
- "clipboard_constants_mac.mm",
- "clipboard_format_type_mac.mm",
- ]
+ sources += [ "clipboard_format_type_mac.mm" ]
+ }
+
+ if (is_mac || is_ios) {
+ sources += [ "clipboard_constants_mac.mm" ]
}
if (is_win) {
sources += [ "clipboard_format_type_win.cc" ]
}
- if (!is_ios) {
- if (use_aura) {
- if ((use_x11 && is_desktop_linux) || !is_win) {
- sources += [ "clipboard_format_type_aura.cc" ]
- }
+ if (use_aura) {
+ if ((use_x11 && is_desktop_linux) || !is_win) {
+ sources += [ "clipboard_format_type_aura.cc" ]
}
-
- sources += [ "clipboard_format_type.h" ]
}
defines = [ "IS_UI_BASE_CLIPBOARD_TYPES_IMPL" ]
@@ -50,11 +51,11 @@ jumbo_component("clipboard_types") {
deps = [ "//base" ]
libs = []
+ if (is_mac || is_ios) {
+ libs += [ "Foundation.framework" ]
+ }
if (is_mac) {
- libs += [
- "AppKit.framework",
- "CoreFoundation.framework",
- ]
+ libs += [ "AppKit.framework" ]
}
}
@@ -64,6 +65,8 @@ jumbo_component("clipboard") {
sources = [
"clipboard.cc",
"clipboard.h",
+ "clipboard_metrics.cc",
+ "clipboard_metrics.h",
"clipboard_monitor.cc",
"clipboard_monitor.h",
"clipboard_observer.h",
@@ -112,16 +115,17 @@ jumbo_component("clipboard") {
public_deps = [ ":clipboard_types" ]
if (use_aura) {
- # Aura clipboard.
- # Chromecast uses clipboard_aura now.
+ # Linux clipboard implementations.
if (is_desktop_linux && !is_chromecast) {
+ sources += [ "clipboard_linux.cc" ]
if (use_ozone) {
sources += [
"clipboard_ozone.cc",
"clipboard_ozone.h",
]
deps += [ "//ui/base" ]
- } else if (use_x11) {
+ }
+ if (use_x11) {
sources += [
"clipboard_x11.cc",
"clipboard_x11.h",
@@ -136,20 +140,20 @@ jumbo_component("clipboard") {
]
}
} else if (is_chromeos && ozone_platform_x11) {
- # linux-chromeos uses aura clipboard by default, but supports ozone x11
- # with flag --use-system-clipbboard.
+ # linux-chromeos uses non-backed clipboard by default, but supports ozone
+ # x11 with flag --use-system-clipbboard.
sources += [
- "clipboard_aura.cc",
- "clipboard_aura.h",
+ "clipboard_non_backed.cc",
+ "clipboard_non_backed.h",
"clipboard_ozone.cc",
"clipboard_ozone.h",
]
deps += [ "//ui/base" ]
} else if (!is_win) {
- # This file is used for all non-X11, non-Windows aura Builds.
+ # This file is used for all builds not backed by an underlying platform.
sources += [
- "clipboard_aura.cc",
- "clipboard_aura.h",
+ "clipboard_non_backed.cc",
+ "clipboard_non_backed.h",
]
}
}
@@ -181,10 +185,10 @@ jumbo_source_set("clipboard_test_support") {
"test/test_clipboard.cc",
"test/test_clipboard.h",
]
+ }
- if (is_android) {
- sources += [ "clipboard_android_test_support.cc" ]
- }
+ if (is_android) {
+ sources += [ "clipboard_android_test_support.cc" ]
}
public_deps = [
@@ -206,17 +210,17 @@ source_set("clipboard_test") {
sources = []
output_name = "ui_base_clipboard_test"
- if (is_mac) {
+ if (!is_ios) {
sources += [
- "clipboard_mac_unittest.mm",
- "clipboard_util_mac_unittest.mm",
+ "custom_data_helper_unittest.cc",
+ "test/test_clipboard_unittest.cc",
]
}
- if (!is_ios) {
+ if (is_mac) {
sources += [
- "custom_data_helper_unittest.cc",
- "test/test_clipboard_unittest.cc",
+ "clipboard_mac_unittest.mm",
+ "clipboard_util_mac_unittest.mm",
]
}
diff --git a/chromium/ui/base/clipboard/clipboard.cc b/chromium/ui/base/clipboard/clipboard.cc
index a91de7c9517..a7722e261c1 100644
--- a/chromium/ui/base/clipboard/clipboard.cc
+++ b/chromium/ui/base/clipboard/clipboard.cc
@@ -203,4 +203,10 @@ base::Lock& Clipboard::ClipboardMapLock() {
return *clipboard_map_lock;
}
+bool Clipboard::IsMarkedByOriginatorAsConfidential() const {
+ return false;
+}
+
+void Clipboard::MarkAsConfidential() {}
+
} // namespace ui
diff --git a/chromium/ui/base/clipboard/clipboard.h b/chromium/ui/base/clipboard/clipboard.h
index 40f0e4d5e0d..1a69e8420d8 100644
--- a/chromium/ui/base/clipboard/clipboard.h
+++ b/chromium/ui/base/clipboard/clipboard.h
@@ -110,6 +110,17 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) Clipboard
virtual bool IsFormatAvailable(const ClipboardFormatType& format,
ClipboardBuffer buffer) 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
+ // as confidential information, like passwords, might legitimately need to be
+ // manipulated.
+ virtual bool IsMarkedByOriginatorAsConfidential() const;
+
+ // Mark the data on the clipboard as being confidential. This isn't
+ // implemented for all platforms yet, but this call should be made on every
+ // platform so that when it is implemented on other platforms it is picked up.
+ virtual void MarkAsConfidential();
+
// Clear the clipboard data.
virtual void Clear(ClipboardBuffer buffer) = 0;
diff --git a/chromium/ui/base/clipboard/clipboard_android.cc b/chromium/ui/base/clipboard/clipboard_android.cc
index 501d191e961..917d0d9d135 100644
--- a/chromium/ui/base/clipboard/clipboard_android.cc
+++ b/chromium/ui/base/clipboard/clipboard_android.cc
@@ -21,10 +21,12 @@
#include "base/strings/utf_string_conversions.h"
#include "base/synchronization/lock.h"
#include "base/task/post_task.h"
+#include "base/task/thread_pool.h"
#include "base/thread_annotations.h"
#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_metrics.h"
#include "ui/base/ui_base_jni_headers/Clipboard_jni.h"
#include "ui/gfx/android/java_bitmap.h"
#include "ui/gfx/image/image.h"
@@ -149,9 +151,8 @@ std::string ClipboardMap::Get(const std::string& format) {
}
void ClipboardMap::GetImage(ReadImageCallback callback) {
- base::PostTaskAndReplyWithResult(
- FROM_HERE,
- {base::ThreadPool(), base::MayBlock(), base::TaskPriority::USER_BLOCKING},
+ base::ThreadPool::PostTaskAndReplyWithResult(
+ FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_BLOCKING},
base::BindOnce(&GetImageData, clipboard_manager_), std::move(callback));
}
@@ -432,6 +433,7 @@ void ClipboardAndroid::ReadAsciiText(ClipboardBuffer buffer,
std::string* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
+ RecordRead(ClipboardFormatMetric::kText);
*result = g_map.Get().Get(ClipboardFormatType::GetPlainTextType().GetName());
}
@@ -443,6 +445,7 @@ void ClipboardAndroid::ReadHTML(ClipboardBuffer buffer,
uint32_t* fragment_end) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
+ RecordRead(ClipboardFormatMetric::kHtml);
if (src_url)
src_url->clear();
@@ -464,6 +467,7 @@ void ClipboardAndroid::ReadImage(ClipboardBuffer buffer,
ReadImageCallback callback) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
+ RecordRead(ClipboardFormatMetric::kImage);
g_map.Get().GetImage(std::move(callback));
}
@@ -483,6 +487,7 @@ void ClipboardAndroid::ReadBookmark(base::string16* title,
void ClipboardAndroid::ReadData(const ClipboardFormatType& format,
std::string* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kData);
*result = g_map.Get().Get(format.GetName());
}
diff --git a/chromium/ui/base/clipboard/clipboard_constants.h b/chromium/ui/base/clipboard/clipboard_constants.h
index 52048077f19..f57524d56b6 100644
--- a/chromium/ui/base/clipboard/clipboard_constants.h
+++ b/chromium/ui/base/clipboard/clipboard_constants.h
@@ -44,13 +44,20 @@ extern const char kMimeTypePepperCustomData[];
// Pickled data.
COMPONENT_EXPORT(UI_BASE_CLIPBOARD_TYPES)
extern NSString* const kWebCustomDataPboardType;
+
// Tells us if WebKit was the last to write to the pasteboard. There's no
// actual data associated with this type.
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;
+
#endif // defined(OS_MACOSX)
#if defined(OS_ANDROID)
diff --git a/chromium/ui/base/clipboard/clipboard_constants_mac.mm b/chromium/ui/base/clipboard/clipboard_constants_mac.mm
index 4f3029f6200..8633a201234 100644
--- a/chromium/ui/base/clipboard/clipboard_constants_mac.mm
+++ b/chromium/ui/base/clipboard/clipboard_constants_mac.mm
@@ -14,4 +14,9 @@ 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
+// convention. See http://nspasteboard.org/ for more info.
+NSString* const kUTTypeConfidentialData = @"org.nspasteboard.ConcealedType";
+
} // namespace ui
diff --git a/chromium/ui/base/clipboard/clipboard_linux.cc b/chromium/ui/base/clipboard/clipboard_linux.cc
new file mode 100644
index 00000000000..ef42052ed5d
--- /dev/null
+++ b/chromium/ui/base/clipboard/clipboard_linux.cc
@@ -0,0 +1,33 @@
+// 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.h"
+
+#if defined(USE_OZONE)
+#include "ui/base/clipboard/clipboard_ozone.h"
+#include "ui/base/ui_base_features.h"
+#endif
+
+#if defined(USE_X11)
+#include "ui/base/clipboard/clipboard_x11.h"
+#endif
+
+namespace ui {
+
+// Clipboard factory method.
+Clipboard* Clipboard::Create() {
+#if defined(USE_OZONE)
+ if (features::IsUsingOzonePlatform())
+ return new ClipboardOzone();
+#endif
+
+#if defined(USE_X11)
+ return new ClipboardX11();
+#else
+ NOTREACHED();
+ return nullptr;
+#endif
+}
+
+} // namespace ui
diff --git a/chromium/ui/base/clipboard/clipboard_mac.h b/chromium/ui/base/clipboard/clipboard_mac.h
index 9ebd21cd157..507a7f8c786 100644
--- a/chromium/ui/base/clipboard/clipboard_mac.h
+++ b/chromium/ui/base/clipboard/clipboard_mac.h
@@ -33,6 +33,8 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ClipboardMac : public Clipboard {
uint64_t GetSequenceNumber(ClipboardBuffer buffer) const override;
bool IsFormatAvailable(const ClipboardFormatType& format,
ClipboardBuffer buffer) const override;
+ bool IsMarkedByOriginatorAsConfidential() const override;
+ void MarkAsConfidential() override;
void Clear(ClipboardBuffer buffer) override;
void ReadAvailableTypes(ClipboardBuffer buffer,
std::vector<base::string16>* types) const override;
diff --git a/chromium/ui/base/clipboard/clipboard_mac.mm b/chromium/ui/base/clipboard/clipboard_mac.mm
index 4c8e0e874b0..c396f9effea 100644
--- a/chromium/ui/base/clipboard/clipboard_mac.mm
+++ b/chromium/ui/base/clipboard/clipboard_mac.mm
@@ -24,6 +24,7 @@
#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_metrics.h"
#include "ui/base/clipboard/clipboard_util_mac.h"
#include "ui/base/clipboard/custom_data_helper.h"
#include "ui/gfx/canvas.h"
@@ -85,6 +86,27 @@ bool ClipboardMac::IsFormatAvailable(const ClipboardFormatType& format,
return [types containsObject:format.ToNSString()];
}
+bool ClipboardMac::IsMarkedByOriginatorAsConfidential() const {
+ DCHECK(CalledOnValidThread());
+
+ NSPasteboard* pb = GetPasteboard();
+ NSPasteboardType type =
+ [pb availableTypeFromArray:@[ kUTTypeConfidentialData ]];
+
+ if (type)
+ return true;
+
+ return false;
+}
+
+void ClipboardMac::MarkAsConfidential() {
+ DCHECK(CalledOnValidThread());
+
+ NSPasteboard* pb = GetPasteboard();
+ [pb addTypes:@[ kUTTypeConfidentialData ] owner:nil];
+ [pb setData:nil forType:kUTTypeConfidentialData];
+}
+
void ClipboardMac::Clear(ClipboardBuffer buffer) {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
@@ -138,6 +160,7 @@ void ClipboardMac::ReadText(ClipboardBuffer buffer,
base::string16* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
+ RecordRead(ClipboardFormatMetric::kText);
NSPasteboard* pb = GetPasteboard();
NSString* contents = [pb stringForType:NSPasteboardTypeString];
@@ -148,6 +171,7 @@ void ClipboardMac::ReadAsciiText(ClipboardBuffer buffer,
std::string* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
+ RecordRead(ClipboardFormatMetric::kText);
NSPasteboard* pb = GetPasteboard();
NSString* contents = [pb stringForType:NSPasteboardTypeString];
@@ -164,6 +188,7 @@ void ClipboardMac::ReadHTML(ClipboardBuffer buffer,
uint32_t* fragment_end) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
+ RecordRead(ClipboardFormatMetric::kHtml);
// TODO(avi): src_url?
markup->clear();
@@ -191,12 +216,14 @@ void ClipboardMac::ReadHTML(ClipboardBuffer buffer,
void ClipboardMac::ReadRTF(ClipboardBuffer buffer, std::string* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
+ RecordRead(ClipboardFormatMetric::kRtf);
return ReadData(ClipboardFormatType::GetRtfType(), result);
}
void ClipboardMac::ReadImage(ClipboardBuffer buffer,
ReadImageCallback callback) const {
+ RecordRead(ClipboardFormatMetric::kImage);
std::move(callback).Run(ReadImageInternal(buffer, GetPasteboard()));
}
@@ -205,6 +232,7 @@ void ClipboardMac::ReadCustomData(ClipboardBuffer buffer,
base::string16* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
+ RecordRead(ClipboardFormatMetric::kCustomData);
NSPasteboard* pb = GetPasteboard();
if ([[pb types] containsObject:kWebCustomDataPboardType]) {
@@ -216,6 +244,7 @@ void ClipboardMac::ReadCustomData(ClipboardBuffer buffer,
void ClipboardMac::ReadBookmark(base::string16* title, std::string* url) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kBookmark);
NSPasteboard* pb = GetPasteboard();
if (title) {
@@ -235,6 +264,7 @@ void ClipboardMac::ReadBookmark(base::string16* title, std::string* url) const {
void ClipboardMac::ReadData(const ClipboardFormatType& format,
std::string* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kData);
NSPasteboard* pb = GetPasteboard();
NSData* data = [pb dataForType:format.ToNSString()];
if ([data length])
diff --git a/chromium/ui/base/clipboard/clipboard_metrics.cc b/chromium/ui/base/clipboard/clipboard_metrics.cc
new file mode 100644
index 00000000000..dc52ad67926
--- /dev/null
+++ b/chromium/ui/base/clipboard/clipboard_metrics.cc
@@ -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.
+
+#include "ui/base/clipboard/clipboard_metrics.h"
+
+#include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
+
+namespace ui {
+
+void RecordRead(ClipboardFormatMetric metric) {
+ base::UmaHistogramEnumeration("Clipboard.Read", metric);
+}
+
+void RecordWrite(ClipboardFormatMetric metric) {
+ base::UmaHistogramEnumeration("Clipboard.Write", metric);
+}
+
+} // namespace ui
diff --git a/chromium/ui/base/clipboard/clipboard_metrics.h b/chromium/ui/base/clipboard/clipboard_metrics.h
new file mode 100644
index 00000000000..5077043bafe
--- /dev/null
+++ b/chromium/ui/base/clipboard/clipboard_metrics.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_CLIPBOARD_CLIPBOARD_METRICS_H_
+#define UI_BASE_CLIPBOARD_CLIPBOARD_METRICS_H_
+
+namespace ui {
+
+// Used to log formats read/written from/to the platform clipboard.
+//
+// This enum's values are persisted to logs. Do not reuse or renumber values.
+enum class ClipboardFormatMetric {
+ kText = 0, // On applicable platforms, includes both UNICODE and ANSI text.
+ kHtml = 1,
+ kRtf = 2,
+ kImage = 3,
+ kBookmark = 4,
+ kData = 5,
+ kCustomData = 6,
+ kWebSmartPaste = 7, // Only used on write.
+ kMaxValue = kWebSmartPaste,
+};
+
+void RecordRead(ClipboardFormatMetric metric);
+void RecordWrite(ClipboardFormatMetric metric);
+
+} // namespace ui
+
+#endif // UI_BASE_CLIPBOARD_CLIPBOARD_MONITOR_H_
diff --git a/chromium/ui/base/clipboard/clipboard_aura.cc b/chromium/ui/base/clipboard/clipboard_non_backed.cc
index 9f4ae70a5ed..2b827891f6d 100644
--- a/chromium/ui/base/clipboard/clipboard_aura.cc
+++ b/chromium/ui/base/clipboard/clipboard_non_backed.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_aura.h"
+#include "ui/base/clipboard/clipboard_non_backed.h"
#include <stdint.h>
@@ -22,6 +22,7 @@
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/clipboard/clipboard_constants.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/gfx/geometry/size.h"
@@ -33,8 +34,8 @@ namespace {
const size_t kMaxClipboardSize = 1;
-// Clipboard data format used by AuraClipboard.
-enum class AuraClipboardFormat {
+// Clipboard data format used by ClipboardInternal.
+enum class ClipboardInternalFormat {
kText = 1 << 0,
kHtml = 1 << 1,
kRtf = 1 << 2,
@@ -48,49 +49,47 @@ enum class AuraClipboardFormat {
// It mostly just provides APIs to cleanly access and manipulate this data.
class ClipboardData {
public:
- ClipboardData()
- : web_smart_paste_(false),
- format_(0) {}
+ ClipboardData() : web_smart_paste_(false), format_(0) {}
virtual ~ClipboardData() = default;
- // Bitmask of AuraClipboardFormat types.
+ // Bitmask of ClipboardInternalFormat types.
int format() const { return format_; }
const std::string& text() const { return text_; }
void set_text(const std::string& text) {
text_ = text;
- format_ |= static_cast<int>(AuraClipboardFormat::kText);
+ format_ |= static_cast<int>(ClipboardInternalFormat::kText);
}
const std::string& markup_data() const { return markup_data_; }
void set_markup_data(const std::string& markup_data) {
markup_data_ = markup_data;
- format_ |= static_cast<int>(AuraClipboardFormat::kHtml);
+ format_ |= static_cast<int>(ClipboardInternalFormat::kHtml);
}
const std::string& rtf_data() const { return rtf_data_; }
void SetRTFData(const std::string& rtf_data) {
rtf_data_ = rtf_data;
- format_ |= static_cast<int>(AuraClipboardFormat::kRtf);
+ format_ |= static_cast<int>(ClipboardInternalFormat::kRtf);
}
const std::string& url() const { return url_; }
void set_url(const std::string& url) {
url_ = url;
- format_ |= static_cast<int>(AuraClipboardFormat::kHtml);
+ format_ |= static_cast<int>(ClipboardInternalFormat::kHtml);
}
const std::string& bookmark_title() const { return bookmark_title_; }
void set_bookmark_title(const std::string& bookmark_title) {
bookmark_title_ = bookmark_title;
- format_ |= static_cast<int>(AuraClipboardFormat::kBookmark);
+ format_ |= static_cast<int>(ClipboardInternalFormat::kBookmark);
}
const std::string& bookmark_url() const { return bookmark_url_; }
void set_bookmark_url(const std::string& bookmark_url) {
bookmark_url_ = bookmark_url;
- format_ |= static_cast<int>(AuraClipboardFormat::kBookmark);
+ format_ |= static_cast<int>(ClipboardInternalFormat::kBookmark);
}
const SkBitmap& bitmap() const { return bitmap_; }
@@ -99,7 +98,7 @@ class ClipboardData {
NOTREACHED() << "Unable to convert bitmap for clipboard";
return;
}
- format_ |= static_cast<int>(AuraClipboardFormat::kBitmap);
+ format_ |= static_cast<int>(ClipboardInternalFormat::kBitmap);
}
const std::string& custom_data_format() const { return custom_data_format_; }
@@ -113,13 +112,13 @@ class ClipboardData {
}
custom_data_data_ = data_data;
custom_data_format_ = data_format;
- format_ |= static_cast<int>(AuraClipboardFormat::kCustom);
+ format_ |= static_cast<int>(ClipboardInternalFormat::kCustom);
}
bool web_smart_paste() const { return web_smart_paste_; }
void set_web_smart_paste(bool web_smart_paste) {
web_smart_paste_ = web_smart_paste;
- format_ |= static_cast<int>(AuraClipboardFormat::kWeb);
+ format_ |= static_cast<int>(ClipboardInternalFormat::kWeb);
}
private:
@@ -157,16 +156,13 @@ class ClipboardData {
} // namespace
-// Platform clipboard implementation for Aura. This handles things like format
-// conversion, versioning of clipboard items etc. The goal is to roughly provide
-// a substitute to platform clipboards on other platforms such as GtkClipboard
-// on gtk or winapi clipboard on win.
-class AuraClipboard {
+// Simple, internal implementation of a clipboard, handling things like format
+// conversion, versioning, etc.
+class ClipboardInternal {
public:
- AuraClipboard() : sequence_number_(0) {
- }
+ ClipboardInternal() : sequence_number_(0) {}
- ~AuraClipboard() = default;
+ ~ClipboardInternal() = default;
void Clear() {
sequence_number_++;
@@ -174,9 +170,7 @@ class AuraClipboard {
ClipboardMonitor::GetInstance()->NotifyClipboardDataChanged();
}
- uint64_t sequence_number() const {
- return sequence_number_;
- }
+ uint64_t sequence_number() const { return sequence_number_; }
// Returns the data currently on the top of the clipboard stack, nullptr if
// the clipboard stack is empty.
@@ -188,11 +182,11 @@ class AuraClipboard {
// Returns true if the data on top of the clipboard stack has format |format|
// or another format that can be converted to |format|.
- bool IsFormatAvailable(AuraClipboardFormat format) const {
+ bool IsFormatAvailable(ClipboardInternalFormat format) const {
switch (format) {
- case AuraClipboardFormat::kText:
- return HasFormat(AuraClipboardFormat::kText) ||
- HasFormat(AuraClipboardFormat::kBookmark);
+ case ClipboardInternalFormat::kText:
+ return HasFormat(ClipboardInternalFormat::kText) ||
+ HasFormat(ClipboardInternalFormat::kBookmark);
default:
return HasFormat(format);
}
@@ -211,11 +205,11 @@ class AuraClipboard {
const ClipboardData* data = GetData();
if (!data)
return;
- if (HasFormat(AuraClipboardFormat::kText))
+ if (HasFormat(ClipboardInternalFormat::kText))
*result = data->text();
- else if (HasFormat(AuraClipboardFormat::kHtml))
+ else if (HasFormat(ClipboardInternalFormat::kHtml))
*result = data->markup_data();
- else if (HasFormat(AuraClipboardFormat::kBookmark))
+ else if (HasFormat(ClipboardInternalFormat::kBookmark))
*result = data->bookmark_url();
}
@@ -230,7 +224,7 @@ class AuraClipboard {
*fragment_start = 0;
*fragment_end = 0;
- if (!HasFormat(AuraClipboardFormat::kHtml))
+ if (!HasFormat(ClipboardInternalFormat::kHtml))
return;
const ClipboardData* data = GetData();
@@ -246,7 +240,7 @@ class AuraClipboard {
void ReadRTF(std::string* result) const {
result->clear();
const ClipboardData* data = GetData();
- if (!HasFormat(AuraClipboardFormat::kRtf))
+ if (!HasFormat(ClipboardInternalFormat::kRtf))
return;
*result = data->rtf_data();
@@ -255,7 +249,7 @@ class AuraClipboard {
// Reads image from the data at the top of clipboard stack.
SkBitmap ReadImage() const {
SkBitmap img;
- if (!HasFormat(AuraClipboardFormat::kBitmap))
+ if (!HasFormat(ClipboardInternalFormat::kBitmap))
return img;
// A shallow copy should be fine here, but just to be safe...
@@ -272,7 +266,7 @@ class AuraClipboard {
base::string16* result) const {
result->clear();
const ClipboardData* data = GetData();
- if (!HasFormat(AuraClipboardFormat::kCustom))
+ if (!HasFormat(ClipboardInternalFormat::kCustom))
return;
ReadCustomDataForType(data->custom_data_data().c_str(),
@@ -285,7 +279,7 @@ class AuraClipboard {
title->clear();
if (url)
url->clear();
- if (!HasFormat(AuraClipboardFormat::kBookmark))
+ if (!HasFormat(ClipboardInternalFormat::kBookmark))
return;
const ClipboardData* data = GetData();
@@ -298,7 +292,7 @@ class AuraClipboard {
void ReadData(const std::string& type, std::string* result) const {
result->clear();
const ClipboardData* data = GetData();
- if (!HasFormat(AuraClipboardFormat::kCustom) ||
+ if (!HasFormat(ClipboardInternalFormat::kCustom) ||
type != data->custom_data_format())
return;
@@ -314,7 +308,7 @@ class AuraClipboard {
private:
// True if the data on top of the clipboard stack has format |format|.
- bool HasFormat(AuraClipboardFormat format) const {
+ bool HasFormat(ClipboardInternalFormat format) const {
const ClipboardData* data = GetData();
return data ? data->format() & static_cast<int>(format) : false;
}
@@ -337,13 +331,13 @@ class AuraClipboard {
// Sequence number uniquely identifying clipboard state.
uint64_t sequence_number_;
- DISALLOW_COPY_AND_ASSIGN(AuraClipboard);
+ DISALLOW_COPY_AND_ASSIGN(ClipboardInternal);
};
// Helper class to build a ClipboardData object and write it to clipboard.
class ClipboardDataBuilder {
public:
- static void CommitToClipboard(AuraClipboard* clipboard) {
+ static void CommitToClipboard(ClipboardInternal* clipboard) {
clipboard->WriteData(TakeCurrentData());
}
@@ -411,58 +405,63 @@ class ClipboardDataBuilder {
ClipboardData* ClipboardDataBuilder::current_data_ = nullptr;
-// linux-chromeos uses aura clipboard by default, but supports ozone x11
+// linux-chromeos uses non-backed clipboard by default, but supports ozone x11
// with flag --use-system-clipbboard.
#if !defined(OS_CHROMEOS) || !BUILDFLAG(OZONE_PLATFORM_X11)
// Clipboard factory method.
Clipboard* Clipboard::Create() {
- return new ClipboardAura;
+ return new ClipboardNonBacked;
}
#endif
-// ClipboardAura implementation.
-ClipboardAura::ClipboardAura()
- : clipboard_internal_(std::make_unique<AuraClipboard>()) {
+// ClipboardNonBacked implementation.
+ClipboardNonBacked::ClipboardNonBacked()
+ : clipboard_internal_(std::make_unique<ClipboardInternal>()) {
DCHECK(CalledOnValidThread());
}
-ClipboardAura::~ClipboardAura() {
+ClipboardNonBacked::~ClipboardNonBacked() {
DCHECK(CalledOnValidThread());
}
-void ClipboardAura::OnPreShutdown() {}
+void ClipboardNonBacked::OnPreShutdown() {}
-uint64_t ClipboardAura::GetSequenceNumber(ClipboardBuffer buffer) const {
+uint64_t ClipboardNonBacked::GetSequenceNumber(ClipboardBuffer buffer) const {
DCHECK(CalledOnValidThread());
return clipboard_internal_->sequence_number();
}
-bool ClipboardAura::IsFormatAvailable(const ClipboardFormatType& format,
- ClipboardBuffer buffer) const {
+bool ClipboardNonBacked::IsFormatAvailable(const ClipboardFormatType& format,
+ ClipboardBuffer buffer) const {
DCHECK(CalledOnValidThread());
DCHECK(IsSupportedClipboardBuffer(buffer));
if (ClipboardFormatType::GetPlainTextType().Equals(format) ||
ClipboardFormatType::GetUrlType().Equals(format))
- return clipboard_internal_->IsFormatAvailable(AuraClipboardFormat::kText);
+ return clipboard_internal_->IsFormatAvailable(
+ ClipboardInternalFormat::kText);
if (ClipboardFormatType::GetHtmlType().Equals(format))
- return clipboard_internal_->IsFormatAvailable(AuraClipboardFormat::kHtml);
+ return clipboard_internal_->IsFormatAvailable(
+ ClipboardInternalFormat::kHtml);
if (ClipboardFormatType::GetRtfType().Equals(format))
- return clipboard_internal_->IsFormatAvailable(AuraClipboardFormat::kRtf);
+ return clipboard_internal_->IsFormatAvailable(
+ ClipboardInternalFormat::kRtf);
if (ClipboardFormatType::GetBitmapType().Equals(format))
- return clipboard_internal_->IsFormatAvailable(AuraClipboardFormat::kBitmap);
+ return clipboard_internal_->IsFormatAvailable(
+ ClipboardInternalFormat::kBitmap);
if (ClipboardFormatType::GetWebKitSmartPasteType().Equals(format))
- return clipboard_internal_->IsFormatAvailable(AuraClipboardFormat::kWeb);
+ return clipboard_internal_->IsFormatAvailable(
+ ClipboardInternalFormat::kWeb);
const ClipboardData* data = clipboard_internal_->GetData();
return data && data->custom_data_format() == format.GetName();
}
-void ClipboardAura::Clear(ClipboardBuffer buffer) {
+void ClipboardNonBacked::Clear(ClipboardBuffer buffer) {
DCHECK(CalledOnValidThread());
DCHECK(IsSupportedClipboardBuffer(buffer));
clipboard_internal_->Clear();
}
-void ClipboardAura::ReadAvailableTypes(
+void ClipboardNonBacked::ReadAvailableTypes(
ClipboardBuffer buffer,
std::vector<base::string16>* types) const {
DCHECK(CalledOnValidThread());
@@ -481,7 +480,8 @@ void ClipboardAura::ReadAvailableTypes(
if (IsFormatAvailable(ClipboardFormatType::GetBitmapType(), buffer))
types->push_back(base::UTF8ToUTF16(kMimeTypePNG));
- if (clipboard_internal_->IsFormatAvailable(AuraClipboardFormat::kCustom) &&
+ if (clipboard_internal_->IsFormatAvailable(
+ ClipboardInternalFormat::kCustom) &&
clipboard_internal_->GetData()) {
ReadCustomDataTypes(
clipboard_internal_->GetData()->custom_data_data().c_str(),
@@ -490,7 +490,7 @@ void ClipboardAura::ReadAvailableTypes(
}
std::vector<base::string16>
-ClipboardAura::ReadAvailablePlatformSpecificFormatNames(
+ClipboardNonBacked::ReadAvailablePlatformSpecificFormatNames(
ClipboardBuffer buffer) const {
DCHECK(CalledOnValidThread());
@@ -516,59 +516,69 @@ ClipboardAura::ReadAvailablePlatformSpecificFormatNames(
return types;
}
-void ClipboardAura::ReadText(ClipboardBuffer buffer,
- base::string16* result) const {
+void ClipboardNonBacked::ReadText(ClipboardBuffer buffer,
+ base::string16* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kText);
clipboard_internal_->ReadText(result);
}
-void ClipboardAura::ReadAsciiText(ClipboardBuffer buffer,
- std::string* result) const {
+void ClipboardNonBacked::ReadAsciiText(ClipboardBuffer buffer,
+ std::string* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kText);
clipboard_internal_->ReadAsciiText(result);
}
-void ClipboardAura::ReadHTML(ClipboardBuffer buffer,
- base::string16* markup,
- std::string* src_url,
- uint32_t* fragment_start,
- uint32_t* fragment_end) const {
+void ClipboardNonBacked::ReadHTML(ClipboardBuffer buffer,
+ base::string16* markup,
+ std::string* src_url,
+ uint32_t* fragment_start,
+ uint32_t* fragment_end) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kHtml);
clipboard_internal_->ReadHTML(markup, src_url, fragment_start, fragment_end);
}
-void ClipboardAura::ReadRTF(ClipboardBuffer buffer, std::string* result) const {
+void ClipboardNonBacked::ReadRTF(ClipboardBuffer buffer,
+ std::string* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kRtf);
clipboard_internal_->ReadRTF(result);
}
-void ClipboardAura::ReadImage(ClipboardBuffer buffer,
- ReadImageCallback callback) const {
+void ClipboardNonBacked::ReadImage(ClipboardBuffer buffer,
+ ReadImageCallback callback) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kImage);
std::move(callback).Run(clipboard_internal_->ReadImage());
}
-void ClipboardAura::ReadCustomData(ClipboardBuffer buffer,
- const base::string16& type,
- base::string16* result) const {
+void ClipboardNonBacked::ReadCustomData(ClipboardBuffer buffer,
+ const base::string16& type,
+ base::string16* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kCustomData);
clipboard_internal_->ReadCustomData(type, result);
}
-void ClipboardAura::ReadBookmark(base::string16* title,
- std::string* url) const {
+void ClipboardNonBacked::ReadBookmark(base::string16* title,
+ std::string* url) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kBookmark);
clipboard_internal_->ReadBookmark(title, url);
}
-void ClipboardAura::ReadData(const ClipboardFormatType& format,
- std::string* result) const {
+void ClipboardNonBacked::ReadData(const ClipboardFormatType& format,
+ std::string* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kData);
clipboard_internal_->ReadData(format.GetName(), result);
}
-void ClipboardAura::WritePortableRepresentations(ClipboardBuffer buffer,
- const ObjectMap& objects) {
+void ClipboardNonBacked::WritePortableRepresentations(
+ ClipboardBuffer buffer,
+ const ObjectMap& objects) {
DCHECK(CalledOnValidThread());
DCHECK(IsSupportedClipboardBuffer(buffer));
for (const auto& object : objects)
@@ -576,7 +586,7 @@ void ClipboardAura::WritePortableRepresentations(ClipboardBuffer buffer,
ClipboardDataBuilder::CommitToClipboard(clipboard_internal_.get());
}
-void ClipboardAura::WritePlatformRepresentations(
+void ClipboardNonBacked::WritePlatformRepresentations(
ClipboardBuffer buffer,
std::vector<Clipboard::PlatformRepresentation> platform_representations) {
DCHECK(CalledOnValidThread());
@@ -587,39 +597,39 @@ void ClipboardAura::WritePlatformRepresentations(
ClipboardDataBuilder::CommitToClipboard(clipboard_internal_.get());
}
-void ClipboardAura::WriteText(const char* text_data, size_t text_len) {
+void ClipboardNonBacked::WriteText(const char* text_data, size_t text_len) {
ClipboardDataBuilder::WriteText(text_data, text_len);
}
-void ClipboardAura::WriteHTML(const char* markup_data,
- size_t markup_len,
- const char* url_data,
- size_t url_len) {
+void ClipboardNonBacked::WriteHTML(const char* markup_data,
+ size_t markup_len,
+ const char* url_data,
+ size_t url_len) {
ClipboardDataBuilder::WriteHTML(markup_data, markup_len, url_data, url_len);
}
-void ClipboardAura::WriteRTF(const char* rtf_data, size_t data_len) {
+void ClipboardNonBacked::WriteRTF(const char* rtf_data, size_t data_len) {
ClipboardDataBuilder::WriteRTF(rtf_data, data_len);
}
-void ClipboardAura::WriteBookmark(const char* title_data,
- size_t title_len,
- const char* url_data,
- size_t url_len) {
+void ClipboardNonBacked::WriteBookmark(const char* title_data,
+ size_t title_len,
+ const char* url_data,
+ size_t url_len) {
ClipboardDataBuilder::WriteBookmark(title_data, title_len, url_data, url_len);
}
-void ClipboardAura::WriteWebSmartPaste() {
+void ClipboardNonBacked::WriteWebSmartPaste() {
ClipboardDataBuilder::WriteWebSmartPaste();
}
-void ClipboardAura::WriteBitmap(const SkBitmap& bitmap) {
+void ClipboardNonBacked::WriteBitmap(const SkBitmap& bitmap) {
ClipboardDataBuilder::WriteBitmap(bitmap);
}
-void ClipboardAura::WriteData(const ClipboardFormatType& format,
- const char* data_data,
- size_t data_len) {
+void ClipboardNonBacked::WriteData(const ClipboardFormatType& format,
+ const char* data_data,
+ size_t data_len) {
ClipboardDataBuilder::WriteData(format.GetName(), data_data, data_len);
}
diff --git a/chromium/ui/base/clipboard/clipboard_aura.h b/chromium/ui/base/clipboard/clipboard_non_backed.h
index 6a6862ba688..8f57aca1e25 100644
--- a/chromium/ui/base/clipboard/clipboard_aura.h
+++ b/chromium/ui/base/clipboard/clipboard_non_backed.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_BASE_CLIPBOARD_CLIPBOARD_AURA_H_
-#define UI_BASE_CLIPBOARD_CLIPBOARD_AURA_H_
+#ifndef UI_BASE_CLIPBOARD_CLIPBOARD_NON_BACKED_H_
+#define UI_BASE_CLIPBOARD_CLIPBOARD_NON_BACKED_H_
#include <stddef.h>
#include <stdint.h>
@@ -13,13 +13,19 @@
namespace ui {
-class AuraClipboard;
+class ClipboardInternal;
-class ClipboardAura : public Clipboard {
+// In-memory clipboard implementation not backed by an underlying platform.
+// This clipboard can be used where there's no need to sync the clipboard with
+// an underlying platform, and can substitute platform clipboards like
+// ClipboardWin on Windows or ClipboardMac on MacOS. As this isn't backed by an
+// underlying platform, the clipboard data isn't persisted after an instance
+// goes away.
+class ClipboardNonBacked : public Clipboard {
private:
friend class Clipboard;
- ClipboardAura();
- ~ClipboardAura() override;
+ ClipboardNonBacked();
+ ~ClipboardNonBacked() override;
// Clipboard overrides:
void OnPreShutdown() override;
@@ -70,11 +76,11 @@ class ClipboardAura : public Clipboard {
const char* data_data,
size_t data_len) override;
- const std::unique_ptr<AuraClipboard> clipboard_internal_;
+ const std::unique_ptr<ClipboardInternal> clipboard_internal_;
- DISALLOW_COPY_AND_ASSIGN(ClipboardAura);
+ DISALLOW_COPY_AND_ASSIGN(ClipboardNonBacked);
};
} // namespace ui
-#endif // UI_BASE_CLIPBOARD_CLIPBOARD_AURA_H_
+#endif // UI_BASE_CLIPBOARD_CLIPBOARD_NON_BACKED_H_
diff --git a/chromium/ui/base/clipboard/clipboard_ozone.cc b/chromium/ui/base/clipboard/clipboard_ozone.cc
index bb5b7ad7182..a41bc2f5798 100644
--- a/chromium/ui/base/clipboard/clipboard_ozone.cc
+++ b/chromium/ui/base/clipboard/clipboard_ozone.cc
@@ -15,9 +15,11 @@
#include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h"
#include "base/timer/timer.h"
+#include "build/build_config.h"
#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_metrics.h"
#include "ui/base/clipboard/clipboard_monitor.h"
#include "ui/base/clipboard/custom_data_helper.h"
#include "ui/gfx/codec/png_codec.h"
@@ -27,7 +29,7 @@
#if defined(OS_CHROMEOS) && BUILDFLAG(OZONE_PLATFORM_X11)
#include "base/command_line.h"
-#include "ui/base/clipboard/clipboard_aura.h"
+#include "ui/base/clipboard/clipboard_non_backed.h"
#include "ui/base/ui_base_switches.h"
#endif
@@ -294,18 +296,21 @@ class ClipboardOzone::AsyncClipboardOzone {
DISALLOW_COPY_AND_ASSIGN(AsyncClipboardOzone);
};
+// Uses the factory in the clipboard_linux otherwise.
+#if defined(OS_CHROMEOS) || !defined(OS_LINUX)
// Clipboard factory method.
Clipboard* Clipboard::Create() {
-// linux-chromeos uses aura clipboard by default, but supports ozone x11
+// linux-chromeos uses non-backed clipboard by default, but supports ozone x11
// with flag --use-system-clipbboard.
#if defined(OS_CHROMEOS) && BUILDFLAG(OZONE_PLATFORM_X11)
if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kUseSystemClipboard)) {
- return new ClipboardAura;
+ return new ClipboardNonBacked;
}
#endif
return new ClipboardOzone;
}
+#endif
// ClipboardOzone implementation.
ClipboardOzone::ClipboardOzone() {
@@ -383,6 +388,7 @@ ClipboardOzone::ReadAvailablePlatformSpecificFormatNames(
void ClipboardOzone::ReadText(ClipboardBuffer buffer,
base::string16* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kText);
auto clipboard_data =
async_clipboard_ozone_->ReadClipboardDataAndWait(buffer, kMimeTypeText);
@@ -393,6 +399,7 @@ void ClipboardOzone::ReadText(ClipboardBuffer buffer,
void ClipboardOzone::ReadAsciiText(ClipboardBuffer buffer,
std::string* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kText);
auto clipboard_data =
async_clipboard_ozone_->ReadClipboardDataAndWait(buffer, kMimeTypeText);
@@ -405,6 +412,7 @@ void ClipboardOzone::ReadHTML(ClipboardBuffer buffer,
uint32_t* fragment_start,
uint32_t* fragment_end) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kHtml);
markup->clear();
if (src_url)
@@ -423,6 +431,7 @@ void ClipboardOzone::ReadHTML(ClipboardBuffer buffer,
void ClipboardOzone::ReadRTF(ClipboardBuffer buffer,
std::string* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kRtf);
auto clipboard_data =
async_clipboard_ozone_->ReadClipboardDataAndWait(buffer, kMimeTypeRTF);
@@ -431,6 +440,7 @@ void ClipboardOzone::ReadRTF(ClipboardBuffer buffer,
void ClipboardOzone::ReadImage(ClipboardBuffer buffer,
ReadImageCallback callback) const {
+ RecordRead(ClipboardFormatMetric::kImage);
std::move(callback).Run(ReadImageInternal(buffer));
}
@@ -438,6 +448,7 @@ void ClipboardOzone::ReadCustomData(ClipboardBuffer buffer,
const base::string16& type,
base::string16* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kCustomData);
auto custom_data = async_clipboard_ozone_->ReadClipboardDataAndWait(
buffer, kMimeTypeWebCustomData);
@@ -454,6 +465,7 @@ void ClipboardOzone::ReadBookmark(base::string16* title,
void ClipboardOzone::ReadData(const ClipboardFormatType& format,
std::string* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kData);
auto clipboard_data = async_clipboard_ozone_->ReadClipboardDataAndWait(
ClipboardBuffer::kCopyPaste, format.GetName());
@@ -469,8 +481,8 @@ void ClipboardOzone::WritePortableRepresentations(ClipboardBuffer buffer,
async_clipboard_ozone_->OfferData(buffer);
- // Just like Aura/X11 implementation does, copy text data from the copy/paste
- // selection to the primary selection.
+ // Just like Non-Backed/X11 implementation does, copy text data from the
+ // copy/paste selection to the primary selection.
if (buffer == ClipboardBuffer::kCopyPaste) {
auto text_iter = objects.find(PortableFormat::kText);
if (text_iter != objects.end()) {
diff --git a/chromium/ui/base/clipboard/clipboard_test_template.h b/chromium/ui/base/clipboard/clipboard_test_template.h
index f31c2594b7d..279252ce350 100644
--- a/chromium/ui/base/clipboard/clipboard_test_template.h
+++ b/chromium/ui/base/clipboard/clipboard_test_template.h
@@ -46,6 +46,7 @@
#endif
#if defined(USE_X11)
+#include "ui/base/ui_base_features.h"
#include "ui/events/platform/platform_event_source.h"
#endif
@@ -67,7 +68,8 @@ class ClipboardTest : public PlatformTest {
void SetUp() override {
PlatformTest::SetUp();
#if defined(USE_X11)
- event_source_ = ClipboardTraits::GetEventSource();
+ if (!features::IsUsingOzonePlatform())
+ event_source_ = ClipboardTraits::GetEventSource();
#endif
clipboard_ = ClipboardTraits::Create();
}
@@ -653,8 +655,8 @@ TYPED_TEST(ClipboardTest, DataTest) {
}
// TODO(https://crbug.com/1032161): Implement multiple raw types for
-// AuraClipboard. This test currently doesn't run on AuraClipboard because
-// AuraClipboard only supports one raw type.
+// ClipboardInternal. This test currently doesn't run on ClipboardInternal
+// because ClipboardInternal only supports one raw type.
#if (!defined(USE_AURA) || defined(OS_WIN) || defined(USE_OZONE) || \
defined(USE_X11)) && \
!defined(OS_CHROMEOS)
@@ -739,17 +741,38 @@ TYPED_TEST(ClipboardTest, ReadAvailablePlatformSpecificFormatNamesTest) {
#endif
}
-// Test that a platform-specific write works.
+// Test that platform-specific functionality works, with a predefined format in
+// On X11 Linux, this test uses a simple MIME type, text/plain.
+// On Windows, this test uses a pre-defined ANSI format, CF_TEXT, and tests that
+// the Windows implicitly converts this to UNICODE as expected.
+#if defined(OS_WIN) || defined(USE_X11)
+TYPED_TEST(ClipboardTest, PlatformSpecificDataTest) {
+ // We're testing platform-specific behavior, so use PlatformClipboardTest.
+ // TODO(https://crbug.com/1083050): The template shouldn't know about its
+ // instantiations. Move this information up using a flag, virtual method, or
+ // creating separate test files for different platforms.
+ std::string test_suite_name = ::testing::UnitTest::GetInstance()
+ ->current_test_info()
+ ->test_suite_name();
+ if (test_suite_name != std::string("ClipboardTest/PlatformClipboardTest"))
+ return;
+
+ const std::string text = "test string";
#if defined(OS_WIN)
-TYPED_TEST(ClipboardTest, WindowsPredefinedFormatWriteDataTest) {
+ // Windows pre-defined ANSI text format.
const std::string kFormatString = "CF_TEXT";
- const std::string text = "test string";
+ // Windows requires an extra '\0' at the end for a raw write.
+ const std::string kPlatformSpecificText = text + '\0';
+#elif defined(USE_X11)
+ const std::string kFormatString = "text/plain"; // X11 text format
+ const std::string kPlatformSpecificText = text;
+#endif
base::span<const uint8_t> text_span(
- reinterpret_cast<const uint8_t*>(text.data()), text.size() + 1);
-
+ reinterpret_cast<const uint8_t*>(kPlatformSpecificText.data()),
+ kPlatformSpecificText.size());
{
ScopedClipboardWriter clipboard_writer(ClipboardBuffer::kCopyPaste);
- clipboard_writer.WriteData(UTF8ToUTF16(kFormatString),
+ clipboard_writer.WriteData(ASCIIToUTF16(kFormatString),
mojo_base::BigBuffer(text_span));
}
@@ -758,27 +781,32 @@ TYPED_TEST(ClipboardTest, WindowsPredefinedFormatWriteDataTest) {
ClipboardBuffer::kCopyPaste);
EXPECT_THAT(raw_types, Contains(ASCIIToUTF16(kFormatString)));
+
+#if defined(OS_WIN)
+ // Only Windows ClipboardFormatType recognizes ANSI formats.
EXPECT_TRUE(this->clipboard().IsFormatAvailable(
ClipboardFormatType::GetPlainTextAType(), ClipboardBuffer::kCopyPaste));
+#endif // defined(OS_WIN)
- // Only ClipboardWin recognizes the Windows-specific CF_TEXT.
- std::string test_suite_name = ::testing::UnitTest::GetInstance()
- ->current_test_info()
- ->test_suite_name();
- if (test_suite_name == std::string("ClipboardTest/PlatformClipboardTest")) {
- std::string text_result;
- this->clipboard().ReadAsciiText(ClipboardBuffer::kCopyPaste, &text_result);
- EXPECT_EQ(text, text_result);
-
- // Windows will automatically convert CF_TEXT to its UNICODE version.
- EXPECT_TRUE(this->clipboard().IsFormatAvailable(
- ClipboardFormatType::GetPlainTextType(), ClipboardBuffer::kCopyPaste));
- base::string16 text_result16;
- this->clipboard().ReadText(ClipboardBuffer::kCopyPaste, &text_result16);
- EXPECT_EQ(base::ASCIIToUTF16(text), text_result16);
- }
+ EXPECT_TRUE(this->clipboard().IsFormatAvailable(
+ ClipboardFormatType::GetPlainTextType(), ClipboardBuffer::kCopyPaste));
+
+ std::string text_result;
+ this->clipboard().ReadAsciiText(ClipboardBuffer::kCopyPaste, &text_result);
+ EXPECT_EQ(text_result, text);
+ // Note: Windows will automatically convert CF_TEXT to its UNICODE version.
+ EXPECT_TRUE(this->clipboard().IsFormatAvailable(
+ ClipboardFormatType::GetPlainTextType(), ClipboardBuffer::kCopyPaste));
+ base::string16 text_result16;
+ this->clipboard().ReadText(ClipboardBuffer::kCopyPaste, &text_result16);
+ EXPECT_EQ(text_result16, base::ASCIIToUTF16(text));
+
+ std::string platform_specific_result;
+ this->clipboard().ReadData(ClipboardFormatType::GetType(kFormatString),
+ &platform_specific_result);
+ EXPECT_EQ(platform_specific_result, kPlatformSpecificText);
}
-#endif
+#endif // defined(OS_WIN) || defined(USE_X11)
#if !defined(OS_MACOSX) && !defined(OS_ANDROID)
TYPED_TEST(ClipboardTest, HyperlinkTest) {
diff --git a/chromium/ui/base/clipboard/clipboard_util_mac.mm b/chromium/ui/base/clipboard/clipboard_util_mac.mm
index a748d4af65a..8db45d20a2a 100644
--- a/chromium/ui/base/clipboard/clipboard_util_mac.mm
+++ b/chromium/ui/base/clipboard/clipboard_util_mac.mm
@@ -7,6 +7,7 @@
#include "base/mac/foundation_util.h"
#import "base/mac/mac_util.h"
#include "base/mac/scoped_cftyperef.h"
+#include "base/notreached.h"
namespace ui {
diff --git a/chromium/ui/base/clipboard/clipboard_win.cc b/chromium/ui/base/clipboard/clipboard_win.cc
index 9bfabd34eab..421f22eaaf6 100644
--- a/chromium/ui/base/clipboard/clipboard_win.cc
+++ b/chromium/ui/base/clipboard/clipboard_win.cc
@@ -30,6 +30,7 @@
#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_metrics.h"
#include "ui/base/clipboard/clipboard_util_win.h"
#include "ui/base/clipboard/custom_data_helper.h"
#include "ui/gfx/canvas.h"
@@ -319,6 +320,7 @@ ClipboardWin::ReadAvailablePlatformSpecificFormatNames(
void ClipboardWin::ReadText(ClipboardBuffer buffer,
base::string16* result) const {
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
+ RecordRead(ClipboardFormatMetric::kText);
if (!result) {
NOTREACHED();
return;
@@ -344,6 +346,7 @@ void ClipboardWin::ReadText(ClipboardBuffer buffer,
void ClipboardWin::ReadAsciiText(ClipboardBuffer buffer,
std::string* result) const {
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
+ RecordRead(ClipboardFormatMetric::kText);
if (!result) {
NOTREACHED();
return;
@@ -372,6 +375,7 @@ void ClipboardWin::ReadHTML(ClipboardBuffer buffer,
uint32_t* fragment_start,
uint32_t* fragment_end) const {
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
+ RecordRead(ClipboardFormatMetric::kHtml);
markup->clear();
// TODO(dcheng): Remove these checks, I don't think they should be optional.
@@ -425,6 +429,7 @@ void ClipboardWin::ReadHTML(ClipboardBuffer buffer,
void ClipboardWin::ReadRTF(ClipboardBuffer buffer, std::string* result) const {
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
+ RecordRead(ClipboardFormatMetric::kRtf);
ReadData(ClipboardFormatType::GetRtfType(), result);
TrimAfterNull(result);
@@ -432,6 +437,7 @@ void ClipboardWin::ReadRTF(ClipboardBuffer buffer, std::string* result) const {
void ClipboardWin::ReadImage(ClipboardBuffer buffer,
ReadImageCallback callback) const {
+ RecordRead(ClipboardFormatMetric::kImage);
std::move(callback).Run(ReadImageInternal(buffer));
}
@@ -439,6 +445,7 @@ void ClipboardWin::ReadCustomData(ClipboardBuffer buffer,
const base::string16& type,
base::string16* result) const {
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
+ RecordRead(ClipboardFormatMetric::kCustomData);
// Acquire the clipboard.
ScopedClipboard clipboard;
@@ -455,6 +462,7 @@ void ClipboardWin::ReadCustomData(ClipboardBuffer buffer,
}
void ClipboardWin::ReadBookmark(base::string16* title, std::string* url) const {
+ RecordRead(ClipboardFormatMetric::kBookmark);
if (title)
title->clear();
@@ -481,6 +489,7 @@ void ClipboardWin::ReadBookmark(base::string16* title, std::string* url) const {
void ClipboardWin::ReadData(const ClipboardFormatType& format,
std::string* result) const {
+ RecordRead(ClipboardFormatMetric::kData);
if (!result) {
NOTREACHED();
return;
diff --git a/chromium/ui/base/clipboard/clipboard_x11.cc b/chromium/ui/base/clipboard/clipboard_x11.cc
index 95e2caff21a..c2f3620584b 100644
--- a/chromium/ui/base/clipboard/clipboard_x11.cc
+++ b/chromium/ui/base/clipboard/clipboard_x11.cc
@@ -22,8 +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_metrics.h"
#include "ui/base/clipboard/clipboard_monitor.h"
#include "ui/base/clipboard/custom_data_helper.h"
+#include "ui/base/nine_image_painter_factory.h"
#include "ui/base/x/selection_owner.h"
#include "ui/base/x/selection_requestor.h"
#include "ui/base/x/selection_utils.h"
@@ -32,8 +34,12 @@
#include "ui/events/x/x11_window_event_manager.h"
#include "ui/gfx/codec/png_codec.h"
#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"
namespace ui {
@@ -61,63 +67,57 @@ class SelectionChangeObserver : public XEventObserver {
~SelectionChangeObserver() override;
// XEventObserver:
- void WillProcessXEvent(XEvent* xev) override;
- void DidProcessXEvent(XEvent* xev) override {}
+ void WillProcessXEvent(x11::Event* xev) override;
+ void DidProcessXEvent(x11::Event* xev) override {}
- int event_base_;
- Atom clipboard_atom_;
- uint64_t clipboard_sequence_number_;
- uint64_t primary_sequence_number_;
+ x11::Atom clipboard_atom_{};
+ uint64_t clipboard_sequence_number_{};
+ uint64_t primary_sequence_number_{};
DISALLOW_COPY_AND_ASSIGN(SelectionChangeObserver);
};
-SelectionChangeObserver::SelectionChangeObserver()
- : event_base_(-1),
- clipboard_atom_(x11::None),
- clipboard_sequence_number_(0),
- primary_sequence_number_(0) {
- int ignored;
- if (XFixesQueryExtension(gfx::GetXDisplay(), &event_base_, &ignored)) {
- clipboard_atom_ = gfx::GetAtom(kClipboard);
- XFixesSelectSelectionInput(gfx::GetXDisplay(), GetX11RootWindow(),
- clipboard_atom_,
- XFixesSetSelectionOwnerNotifyMask |
- XFixesSelectionWindowDestroyNotifyMask |
- XFixesSelectionClientCloseNotifyMask);
- // This seems to be semi-optional. For some reason, registering for any
- // selection notify events seems to subscribe us to events for both the
- // primary and the clipboard buffers. Register anyway just to be safe.
- XFixesSelectSelectionInput(gfx::GetXDisplay(), GetX11RootWindow(),
- XA_PRIMARY,
- XFixesSetSelectionOwnerNotifyMask |
- XFixesSelectionWindowDestroyNotifyMask |
- XFixesSelectionClientCloseNotifyMask);
-
- X11EventSource::GetInstance()->AddXEventObserver(this);
- }
-}
+SelectionChangeObserver::SelectionChangeObserver() {
+ auto& xfixes = x11::Connection::Get()->xfixes();
+ // Let the server know the client version. No need to sync since we don't
+ // care what version is running on the server.
+ xfixes.QueryVersion({x11::XFixes::major_version, x11::XFixes::minor_version});
+ if (!xfixes.present())
+ return;
+
+ clipboard_atom_ = gfx::GetAtom(kClipboard);
+ auto mask = x11::XFixes::SelectionEventMask::SetSelectionOwner |
+ x11::XFixes::SelectionEventMask::SelectionWindowDestroy |
+ x11::XFixes::SelectionEventMask::SelectionClientClose;
+ xfixes.SelectSelectionInput({GetX11RootWindow(), clipboard_atom_, mask});
+ // This seems to be semi-optional. For some reason, registering for any
+ // selection notify events seems to subscribe us to events for both the
+ // primary and the clipboard buffers. Register anyway just to be safe.
+ xfixes.SelectSelectionInput({GetX11RootWindow(), x11::Atom::PRIMARY, mask});
-SelectionChangeObserver::~SelectionChangeObserver() {
- // We are a singleton; we will outlive the event source.
+ X11EventSource::GetInstance()->AddXEventObserver(this);
}
+// We are a singleton; we will outlive the event source.
+SelectionChangeObserver::~SelectionChangeObserver() = default;
+
SelectionChangeObserver* SelectionChangeObserver::GetInstance() {
return base::Singleton<SelectionChangeObserver>::get();
}
-void SelectionChangeObserver::WillProcessXEvent(XEvent* xev) {
- if (xev->type == event_base_ + XFixesSelectionNotify) {
- XFixesSelectionNotifyEvent* ev =
- reinterpret_cast<XFixesSelectionNotifyEvent*>(xev);
- if (ev->selection == clipboard_atom_) {
- clipboard_sequence_number_++;
- ClipboardMonitor::GetInstance()->NotifyClipboardDataChanged();
- } else if (ev->selection == XA_PRIMARY) {
- primary_sequence_number_++;
- } else {
- DLOG(ERROR) << "Unexpected selection atom: " << ev->selection;
- }
+void SelectionChangeObserver::WillProcessXEvent(x11::Event* xev) {
+ auto* ev = xev->As<x11::XFixes::SelectionNotifyEvent>();
+ if (!ev)
+ return;
+
+ if (static_cast<x11::Atom>(ev->selection) == clipboard_atom_) {
+ clipboard_sequence_number_++;
+ ClipboardMonitor::GetInstance()->NotifyClipboardDataChanged();
+ } else if (ev->selection == x11::Atom::PRIMARY) {
+ primary_sequence_number_++;
+ } else {
+ DLOG(ERROR) << "Unexpected selection atom: "
+ << static_cast<uint32_t>(ev->selection);
}
}
@@ -126,7 +126,7 @@ void SelectionChangeObserver::WillProcessXEvent(XEvent* xev) {
// Represents a list of possible return types. Copy constructable.
class TargetList {
public:
- using AtomVector = std::vector<::Atom>;
+ using AtomVector = std::vector<x11::Atom>;
explicit TargetList(const AtomVector& target_list);
@@ -134,7 +134,7 @@ class TargetList {
bool ContainsText() const;
bool ContainsFormat(const ClipboardFormatType& format_type) const;
- bool ContainsAtom(::Atom atom) const;
+ bool ContainsAtom(x11::Atom atom) const;
private:
AtomVector target_list_;
@@ -144,7 +144,7 @@ TargetList::TargetList(const AtomVector& target_list)
: target_list_(target_list) {}
bool TargetList::ContainsText() const {
- std::vector<::Atom> atoms = GetTextAtomsFrom();
+ std::vector<x11::Atom> atoms = GetTextAtomsFrom();
for (const auto& atom : atoms) {
if (ContainsAtom(atom))
return true;
@@ -154,14 +154,19 @@ bool TargetList::ContainsText() const {
}
bool TargetList::ContainsFormat(const ClipboardFormatType& format_type) const {
- ::Atom atom = gfx::GetAtom(format_type.GetName().c_str());
+ x11::Atom atom = gfx::GetAtom(format_type.GetName().c_str());
return ContainsAtom(atom);
}
-bool TargetList::ContainsAtom(::Atom atom) const {
+bool TargetList::ContainsAtom(x11::Atom atom) const {
return base::Contains(target_list_, atom);
}
+x11::Window GetSelectionOwner(x11::Atom selection) {
+ auto response = x11::Connection::Get()->GetSelectionOwner({selection}).Sync();
+ return response ? response->owner : x11::Window::None;
+}
+
} // namespace
///////////////////////////////////////////////////////////////////////////////
@@ -176,14 +181,14 @@ class ClipboardX11::X11Details : public XEventDispatcher {
// Returns the X11 selection atom that we pass to various XSelection functions
// for the given buffer.
- ::Atom LookupSelectionForClipboardBuffer(ClipboardBuffer buffer) const;
+ x11::Atom LookupSelectionForClipboardBuffer(ClipboardBuffer buffer) const;
// Returns the X11 selection atom that we pass to various XSelection functions
// for ClipboardBuffer::kCopyPaste.
- ::Atom GetCopyPasteSelection() const;
+ x11::Atom GetCopyPasteSelection() const;
// Finds the SelectionFormatMap for the incoming selection atom.
- const SelectionFormatMap& LookupStorageForAtom(::Atom atom);
+ const SelectionFormatMap& LookupStorageForAtom(x11::Atom atom);
// As we need to collect all the data types before we tell X11 that we own a
// particular selection, we create a temporary clipboard mapping that
@@ -208,7 +213,7 @@ class ClipboardX11::X11Details : public XEventDispatcher {
// and do the asynchronous dance with whatever application is holding the
// selection.
SelectionData RequestAndWaitForTypes(ClipboardBuffer buffer,
- const std::vector<::Atom>& types);
+ const std::vector<x11::Atom>& types);
// Retrieves the list of possible data types the current clipboard owner has.
//
@@ -217,10 +222,10 @@ class ClipboardX11::X11Details : public XEventDispatcher {
TargetList WaitAndGetTargetsList(ClipboardBuffer buffer);
// Returns a list of all text atoms that we handle.
- std::vector<::Atom> GetTextAtoms() const;
+ std::vector<x11::Atom> GetTextAtoms() const;
// Returns a vector with a |format| converted to an X11 atom.
- std::vector<::Atom> GetAtomsForFormat(const ClipboardFormatType& format);
+ std::vector<x11::Atom> GetAtomsForFormat(const ClipboardFormatType& format);
// Clears a certain clipboard buffer, whether we own it or not.
void Clear(ClipboardBuffer buffer);
@@ -231,16 +236,14 @@ class ClipboardX11::X11Details : public XEventDispatcher {
private:
// XEventDispatcher:
- bool DispatchXEvent(XEvent* xev) override;
-
- bool CanDispatchXEvent(XEvent* xev);
+ bool DispatchXEvent(x11::Event* xev) override;
// Our X11 state.
- Display* x_display_;
- ::Window x_root_window_;
+ x11::Connection* connection_;
+ x11::Window x_root_window_;
// Input-only window used as a selection owner.
- ::Window x_window_;
+ x11::Window x_window_;
// Events selected on |x_window_|.
std::unique_ptr<XScopedEventSelector> x_window_events_;
@@ -259,26 +262,16 @@ class ClipboardX11::X11Details : public XEventDispatcher {
};
ClipboardX11::X11Details::X11Details()
- : x_display_(gfx::GetXDisplay()),
- x_root_window_(DefaultRootWindow(x_display_)),
- x_window_(XCreateWindow(x_display_,
- x_root_window_,
- -100,
- -100,
- 10,
- 10, // x, y, width, height
- 0, // border width
- CopyFromParent, // depth
- InputOnly,
- CopyFromParent, // visual
- 0,
- nullptr)),
- selection_requestor_(x_display_, x_window_, this),
- clipboard_owner_(x_display_, x_window_, gfx::GetAtom(kClipboard)),
- primary_owner_(x_display_, x_window_, XA_PRIMARY) {
- XStoreName(x_display_, x_window_, "Chromium clipboard");
- x_window_events_.reset(
- new XScopedEventSelector(x_window_, PropertyChangeMask));
+ : connection_(x11::Connection::Get()),
+ x_root_window_(ui::GetX11RootWindow()),
+ x_window_(CreateDummyWindow("Chromium Clipboard Window")),
+ selection_requestor_(x_window_, this),
+ clipboard_owner_(connection_, x_window_, gfx::GetAtom(kClipboard)),
+ primary_owner_(connection_, x_window_, x11::Atom::PRIMARY) {
+ SetStringProperty(x_window_, x11::Atom::WM_NAME, x11::Atom::STRING,
+ "Chromium clipboard");
+ x_window_events_ =
+ std::make_unique<XScopedEventSelector>(x_window_, PropertyChangeMask);
if (X11EventSource::GetInstance())
X11EventSource::GetInstance()->AddXEventDispatcher(this);
@@ -288,24 +281,24 @@ ClipboardX11::X11Details::~X11Details() {
if (X11EventSource::GetInstance())
X11EventSource::GetInstance()->RemoveXEventDispatcher(this);
- XDestroyWindow(x_display_, x_window_);
+ connection_->DestroyWindow({x_window_});
}
-::Atom ClipboardX11::X11Details::LookupSelectionForClipboardBuffer(
+x11::Atom ClipboardX11::X11Details::LookupSelectionForClipboardBuffer(
ClipboardBuffer buffer) const {
if (buffer == ClipboardBuffer::kCopyPaste)
return GetCopyPasteSelection();
- return XA_PRIMARY;
+ return x11::Atom::PRIMARY;
}
-::Atom ClipboardX11::X11Details::GetCopyPasteSelection() const {
+x11::Atom ClipboardX11::X11Details::GetCopyPasteSelection() const {
return gfx::GetAtom(kClipboard);
}
const SelectionFormatMap& ClipboardX11::X11Details::LookupStorageForAtom(
- ::Atom atom) {
- if (atom == XA_PRIMARY)
+ x11::Atom atom) {
+ if (atom == x11::Atom::PRIMARY)
return primary_owner_.selection_format_map();
DCHECK_EQ(GetCopyPasteSelection(), atom);
@@ -319,7 +312,7 @@ void ClipboardX11::X11Details::CreateNewClipboardData() {
void ClipboardX11::X11Details::InsertMapping(
const std::string& key,
const scoped_refptr<base::RefCountedMemory>& memory) {
- ::Atom atom_key = gfx::GetAtom(key.c_str());
+ x11::Atom atom_key = gfx::GetAtom(key.c_str());
clipboard_data_.Insert(atom_key, memory);
}
@@ -333,9 +326,9 @@ void ClipboardX11::X11Details::TakeOwnershipOfSelection(
SelectionData ClipboardX11::X11Details::RequestAndWaitForTypes(
ClipboardBuffer buffer,
- const std::vector<::Atom>& types) {
- ::Atom selection_name = LookupSelectionForClipboardBuffer(buffer);
- if (XGetSelectionOwner(x_display_, selection_name) == x_window_) {
+ const std::vector<x11::Atom>& types) {
+ x11::Atom selection_name = LookupSelectionForClipboardBuffer(buffer);
+ if (GetSelectionOwner(selection_name) == x_window_) {
// We can local fastpath instead of playing the nested run loop game
// with the X server.
const SelectionFormatMap& format_map = LookupStorageForAtom(selection_name);
@@ -348,8 +341,8 @@ SelectionData ClipboardX11::X11Details::RequestAndWaitForTypes(
} else {
TargetList targets = WaitAndGetTargetsList(buffer);
- ::Atom selection_name = LookupSelectionForClipboardBuffer(buffer);
- std::vector<::Atom> intersection;
+ x11::Atom selection_name = LookupSelectionForClipboardBuffer(buffer);
+ std::vector<x11::Atom> intersection;
GetAtomIntersection(types, targets.target_list(), &intersection);
return selection_requestor_.RequestAndWaitForTypes(selection_name,
intersection);
@@ -360,27 +353,25 @@ SelectionData ClipboardX11::X11Details::RequestAndWaitForTypes(
TargetList ClipboardX11::X11Details::WaitAndGetTargetsList(
ClipboardBuffer buffer) {
- ::Atom selection_name = LookupSelectionForClipboardBuffer(buffer);
- std::vector<::Atom> out;
- if (XGetSelectionOwner(x_display_, selection_name) == x_window_) {
+ x11::Atom selection_name = LookupSelectionForClipboardBuffer(buffer);
+ std::vector<x11::Atom> out;
+ if (GetSelectionOwner(selection_name) == x_window_) {
// We can local fastpath and return the list of local targets.
const SelectionFormatMap& format_map = LookupStorageForAtom(selection_name);
for (const auto& format : format_map)
out.push_back(format.first);
} else {
- scoped_refptr<base::RefCountedMemory> data;
- size_t out_data_items = 0;
- ::Atom out_type = x11::None;
+ std::vector<uint8_t> data;
+ x11::Atom out_type = x11::Atom::None;
if (selection_requestor_.PerformBlockingConvertSelection(
- selection_name, gfx::GetAtom(kTargets), &data, &out_data_items,
- &out_type)) {
+ selection_name, gfx::GetAtom(kTargets), &data, &out_type)) {
// Some apps return an |out_type| of "TARGETS". (crbug.com/377893)
- if (out_type == XA_ATOM || out_type == gfx::GetAtom(kTargets)) {
- const ::Atom* atom_array =
- reinterpret_cast<const ::Atom*>(data->front());
- for (size_t i = 0; i < out_data_items; ++i)
+ if (out_type == x11::Atom::ATOM || out_type == gfx::GetAtom(kTargets)) {
+ const x11::Atom* atom_array =
+ reinterpret_cast<const x11::Atom*>(data.data());
+ for (size_t i = 0; i < data.size() / sizeof(x11::Atom); ++i)
out.push_back(atom_array[i]);
}
} else {
@@ -390,11 +381,11 @@ TargetList ClipboardX11::X11Details::WaitAndGetTargetsList(
// text. This is pretty unfortunate since it means we have to actually
// copy the data to see if it is available, but at least this path
// shouldn't be hit for conforming programs.
- std::vector<::Atom> types = GetTextAtoms();
+ std::vector<x11::Atom> types = GetTextAtoms();
for (const auto& text_atom : types) {
- ::Atom type = x11::None;
+ x11::Atom type = x11::Atom::None;
if (selection_requestor_.PerformBlockingConvertSelection(
- selection_name, text_atom, nullptr, nullptr, &type) &&
+ selection_name, text_atom, nullptr, &type) &&
type == text_atom) {
out.push_back(text_atom);
}
@@ -405,11 +396,11 @@ TargetList ClipboardX11::X11Details::WaitAndGetTargetsList(
return TargetList(out);
}
-std::vector<::Atom> ClipboardX11::X11Details::GetTextAtoms() const {
+std::vector<x11::Atom> ClipboardX11::X11Details::GetTextAtoms() const {
return GetTextAtomsFrom();
}
-std::vector<::Atom> ClipboardX11::X11Details::GetAtomsForFormat(
+std::vector<x11::Atom> ClipboardX11::X11Details::GetAtomsForFormat(
const ClipboardFormatType& format) {
return {gfx::GetAtom(format.GetName().c_str())};
}
@@ -422,18 +413,18 @@ void ClipboardX11::X11Details::Clear(ClipboardBuffer buffer) {
}
void ClipboardX11::X11Details::StoreCopyPasteDataAndWait() {
- ::Atom selection = GetCopyPasteSelection();
- if (XGetSelectionOwner(x_display_, selection) != x_window_)
+ x11::Atom selection = GetCopyPasteSelection();
+ if (GetSelectionOwner(selection) != x_window_)
return;
- ::Atom clipboard_manager_atom = gfx::GetAtom(kClipboardManager);
- if (XGetSelectionOwner(x_display_, clipboard_manager_atom) == x11::None)
+ x11::Atom clipboard_manager_atom = gfx::GetAtom(kClipboardManager);
+ if (GetSelectionOwner(clipboard_manager_atom) == x11::Window::None)
return;
const SelectionFormatMap& format_map = LookupStorageForAtom(selection);
if (format_map.size() == 0)
return;
- std::vector<Atom> targets = format_map.GetTypes();
+ std::vector<x11::Atom> targets = format_map.GetTypes();
base::TimeTicks start = base::TimeTicks::Now();
selection_requestor_.PerformBlockingConvertSelectionWithParameter(
@@ -442,71 +433,45 @@ void ClipboardX11::X11Details::StoreCopyPasteDataAndWait() {
base::TimeTicks::Now() - start);
}
-bool ClipboardX11::X11Details::CanDispatchXEvent(XEvent* xev) {
- if (xev->xany.window == x_window_)
- return true;
-
- if (xev->type == PropertyNotify) {
- return primary_owner_.CanDispatchPropertyEvent(*xev) ||
- clipboard_owner_.CanDispatchPropertyEvent(*xev) ||
- selection_requestor_.CanDispatchPropertyEvent(*xev);
- }
- return false;
-}
-
-bool ClipboardX11::X11Details::DispatchXEvent(XEvent* xev) {
- if (!CanDispatchXEvent(xev))
- return false;
-
- switch (xev->type) {
- case SelectionRequest: {
- if (xev->xselectionrequest.selection == XA_PRIMARY) {
- primary_owner_.OnSelectionRequest(*xev);
- } else {
- // We should not get requests for the CLIPBOARD_MANAGER selection
- // because we never take ownership of it.
- DCHECK_EQ(GetCopyPasteSelection(), xev->xselectionrequest.selection);
- clipboard_owner_.OnSelectionRequest(*xev);
- }
- break;
- }
- case SelectionNotify: {
- selection_requestor_.OnSelectionNotify(*xev);
- break;
- }
- case SelectionClear: {
- if (xev->xselectionclear.selection == XA_PRIMARY) {
- primary_owner_.OnSelectionClear(*xev);
- } else {
- // We should not get requests for the CLIPBOARD_MANAGER selection
- // because we never take ownership of it.
- DCHECK_EQ(GetCopyPasteSelection(), xev->xselection.selection);
- clipboard_owner_.OnSelectionClear(*xev);
- }
- break;
+bool ClipboardX11::X11Details::DispatchXEvent(x11::Event* xev) {
+ if (auto* request = xev->As<x11::SelectionRequestEvent>()) {
+ if (request->owner != x_window_)
+ return false;
+ if (request->selection == x11::Atom::PRIMARY) {
+ primary_owner_.OnSelectionRequest(*xev);
+ } else {
+ // We should not get requests for the CLIPBOARD_MANAGER selection
+ // because we never take ownership of it.
+ DCHECK_EQ(GetCopyPasteSelection(), request->selection);
+ clipboard_owner_.OnSelectionRequest(*xev);
}
- case PropertyNotify: {
- if (primary_owner_.CanDispatchPropertyEvent(*xev))
- primary_owner_.OnPropertyEvent(*xev);
- if (clipboard_owner_.CanDispatchPropertyEvent(*xev))
- clipboard_owner_.OnPropertyEvent(*xev);
- if (selection_requestor_.CanDispatchPropertyEvent(*xev))
- selection_requestor_.OnPropertyEvent(*xev);
- break;
+ } else if (auto* notify = xev->As<x11::SelectionNotifyEvent>()) {
+ if (notify->requestor != x_window_)
+ return false;
+ selection_requestor_.OnSelectionNotify(*notify);
+ } else if (auto* clear = xev->As<x11::SelectionClearEvent>()) {
+ if (clear->owner != x_window_)
+ return false;
+ if (clear->selection == x11::Atom::PRIMARY) {
+ primary_owner_.OnSelectionClear(*xev);
+ } else {
+ // We should not get requests for the CLIPBOARD_MANAGER selection
+ // because we never take ownership of it.
+ DCHECK_EQ(GetCopyPasteSelection(), clear->selection);
+ clipboard_owner_.OnSelectionClear(*xev);
}
- default:
- break;
+ } else if (auto* prop = xev->As<x11::PropertyNotifyEvent>()) {
+ if (primary_owner_.CanDispatchPropertyEvent(*xev))
+ primary_owner_.OnPropertyEvent(*xev);
+ if (clipboard_owner_.CanDispatchPropertyEvent(*xev))
+ clipboard_owner_.OnPropertyEvent(*xev);
+ if (selection_requestor_.CanDispatchPropertyEvent(*xev))
+ selection_requestor_.OnPropertyEvent(*xev);
}
return false;
}
///////////////////////////////////////////////////////////////////////////////
-// Clipboard factory method.
-Clipboard* Clipboard::Create() {
- return new ClipboardX11;
-}
-
-///////////////////////////////////////////////////////////////////////////////
// ClipboardX11
ClipboardX11::ClipboardX11() : x11_details_(new X11Details) {
@@ -586,17 +551,16 @@ ClipboardX11::ReadAvailablePlatformSpecificFormatNames(
if (target_list.empty())
return {};
- std::vector<char*> types_buffer(target_list.size());
- // Call XGetAtomNames to minimize trips to the X11 server.
- int status = XGetAtomNames(gfx::GetXDisplay(), target_list.data(),
- target_list.size(), types_buffer.data());
- DCHECK(status) << "XGetAtomNames failed! An invalid Atom was passed in.";
-
+ std::vector<x11::Future<x11::GetAtomNameReply>> futures;
+ for (x11::Atom target : target_list)
+ futures.push_back(x11::Connection::Get()->GetAtomName({target}));
std::vector<base::string16> types;
types.reserve(target_list.size());
- for (char* type : types_buffer) {
- types.push_back(base::UTF8ToUTF16(type));
- XFree(type);
+ for (auto& future : futures) {
+ if (auto response = future.Sync())
+ types.push_back(base::UTF8ToUTF16(response->name));
+ else
+ types.emplace_back();
}
return types;
@@ -605,6 +569,7 @@ ClipboardX11::ReadAvailablePlatformSpecificFormatNames(
void ClipboardX11::ReadText(ClipboardBuffer buffer,
base::string16* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kText);
SelectionData data(x11_details_->RequestAndWaitForTypes(
buffer, x11_details_->GetTextAtoms()));
@@ -617,6 +582,7 @@ void ClipboardX11::ReadText(ClipboardBuffer buffer,
void ClipboardX11::ReadAsciiText(ClipboardBuffer buffer,
std::string* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kText);
SelectionData data(x11_details_->RequestAndWaitForTypes(
buffer, x11_details_->GetTextAtoms()));
@@ -632,6 +598,7 @@ void ClipboardX11::ReadHTML(ClipboardBuffer buffer,
uint32_t* fragment_start,
uint32_t* fragment_end) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kHtml);
markup->clear();
if (src_url)
src_url->clear();
@@ -652,6 +619,7 @@ void ClipboardX11::ReadHTML(ClipboardBuffer buffer,
void ClipboardX11::ReadRTF(ClipboardBuffer buffer, std::string* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kRtf);
SelectionData data(x11_details_->RequestAndWaitForTypes(
buffer,
@@ -663,6 +631,7 @@ void ClipboardX11::ReadRTF(ClipboardBuffer buffer, std::string* result) const {
void ClipboardX11::ReadImage(ClipboardBuffer buffer,
ReadImageCallback callback) const {
DCHECK(IsSupportedClipboardBuffer(buffer));
+ RecordRead(ClipboardFormatMetric::kImage);
std::move(callback).Run(ReadImageInternal(buffer));
}
@@ -670,6 +639,7 @@ void ClipboardX11::ReadCustomData(ClipboardBuffer buffer,
const base::string16& type,
base::string16* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kCustomData);
SelectionData data(x11_details_->RequestAndWaitForTypes(
buffer, x11_details_->GetAtomsForFormat(
@@ -687,6 +657,7 @@ void ClipboardX11::ReadBookmark(base::string16* title, std::string* url) const {
void ClipboardX11::ReadData(const ClipboardFormatType& format,
std::string* result) const {
DCHECK(CalledOnValidThread());
+ RecordRead(ClipboardFormatMetric::kData);
SelectionData data(x11_details_->RequestAndWaitForTypes(
ClipboardBuffer::kCopyPaste, x11_details_->GetAtomsForFormat(format)));
diff --git a/chromium/ui/base/clipboard/scoped_clipboard_writer.cc b/chromium/ui/base/clipboard/scoped_clipboard_writer.cc
index 1b8312f5fc5..c723b0d2e33 100644
--- a/chromium/ui/base/clipboard/scoped_clipboard_writer.cc
+++ b/chromium/ui/base/clipboard/scoped_clipboard_writer.cc
@@ -8,6 +8,7 @@
#include "base/strings/utf_string_conversions.h"
#include "net/base/escape.h"
#include "ui/base/clipboard/clipboard_format_type.h"
+#include "ui/base/clipboard/clipboard_metrics.h"
#include "ui/gfx/geometry/size.h"
// Documentation on the format of the parameters for each clipboard target can
@@ -31,9 +32,12 @@ ScopedClipboardWriter::~ScopedClipboardWriter() {
Clipboard::GetForCurrentThread()->WritePlatformRepresentations(
buffer_, std::move(platform_representations_));
}
+ if (confidential_)
+ Clipboard::GetForCurrentThread()->MarkAsConfidential();
}
void ScopedClipboardWriter::WriteText(const base::string16& text) {
+ RecordWrite(ClipboardFormatMetric::kText);
std::string utf8_text = base::UTF16ToUTF8(text);
Clipboard::ObjectMapParams parameters;
@@ -44,6 +48,7 @@ void ScopedClipboardWriter::WriteText(const base::string16& text) {
void ScopedClipboardWriter::WriteHTML(const base::string16& markup,
const std::string& source_url) {
+ RecordWrite(ClipboardFormatMetric::kHtml);
std::string utf8_markup = base::UTF16ToUTF8(markup);
Clipboard::ObjectMapParams parameters;
@@ -59,6 +64,7 @@ void ScopedClipboardWriter::WriteHTML(const base::string16& markup,
}
void ScopedClipboardWriter::WriteRTF(const std::string& rtf_data) {
+ RecordWrite(ClipboardFormatMetric::kRtf);
Clipboard::ObjectMapParams parameters;
parameters.push_back(Clipboard::ObjectMapParam(rtf_data.begin(),
rtf_data.end()));
@@ -69,6 +75,7 @@ void ScopedClipboardWriter::WriteBookmark(const base::string16& bookmark_title,
const std::string& url) {
if (bookmark_title.empty() || url.empty())
return;
+ RecordWrite(ClipboardFormatMetric::kBookmark);
std::string utf8_markup = base::UTF16ToUTF8(bookmark_title);
@@ -94,6 +101,7 @@ void ScopedClipboardWriter::WriteHyperlink(const base::string16& anchor_text,
}
void ScopedClipboardWriter::WriteWebSmartPaste() {
+ RecordWrite(ClipboardFormatMetric::kWebSmartPaste);
objects_[Clipboard::PortableFormat::kWebkit] = Clipboard::ObjectMapParams();
}
@@ -101,6 +109,7 @@ void ScopedClipboardWriter::WriteImage(const SkBitmap& bitmap) {
if (bitmap.drawsNothing())
return;
DCHECK(bitmap.getPixels());
+ RecordWrite(ClipboardFormatMetric::kImage);
bitmap_ = bitmap;
// TODO(dcheng): This is slightly less horrible than what we used to do, but
@@ -114,9 +123,14 @@ void ScopedClipboardWriter::WriteImage(const SkBitmap& bitmap) {
objects_[Clipboard::PortableFormat::kBitmap] = parameters;
}
+void ScopedClipboardWriter::MarkAsConfidential() {
+ confidential_ = true;
+}
+
void ScopedClipboardWriter::WritePickledData(
const base::Pickle& pickle,
const ClipboardFormatType& format) {
+ RecordWrite(ClipboardFormatMetric::kCustomData);
std::string format_string = format.Serialize();
Clipboard::ObjectMapParam format_parameter(format_string.begin(),
format_string.end());
@@ -134,6 +148,7 @@ void ScopedClipboardWriter::WritePickledData(
void ScopedClipboardWriter::WriteData(const base::string16& format,
mojo_base::BigBuffer data) {
+ RecordWrite(ClipboardFormatMetric::kData);
platform_representations_.push_back(
{base::UTF16ToUTF8(format), std::move(data)});
}
@@ -142,6 +157,7 @@ void ScopedClipboardWriter::Reset() {
objects_.clear();
platform_representations_.clear();
bitmap_.reset();
+ confidential_ = false;
}
} // namespace ui
diff --git a/chromium/ui/base/clipboard/scoped_clipboard_writer.h b/chromium/ui/base/clipboard/scoped_clipboard_writer.h
index d0e5cfb3e3e..d2ed3736ce2 100644
--- a/chromium/ui/base/clipboard/scoped_clipboard_writer.h
+++ b/chromium/ui/base/clipboard/scoped_clipboard_writer.h
@@ -67,6 +67,9 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ScopedClipboardWriter {
void WriteImage(const SkBitmap& bitmap);
+ // Mark the data to be written as confidential.
+ void MarkAsConfidential();
+
// Removes all objects that would be written to the clipboard.
void Reset();
@@ -83,6 +86,8 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ScopedClipboardWriter {
SkBitmap bitmap_;
+ bool confidential_ = false;
+
DISALLOW_COPY_AND_ASSIGN(ScopedClipboardWriter);
};
diff --git a/chromium/ui/base/cocoa/accessibility_focus_overrider.h b/chromium/ui/base/cocoa/accessibility_focus_overrider.h
index d8b6def31a2..7d3b88d04a7 100644
--- a/chromium/ui/base/cocoa/accessibility_focus_overrider.h
+++ b/chromium/ui/base/cocoa/accessibility_focus_overrider.h
@@ -5,7 +5,7 @@
#ifndef UI_BASE_COCOA_ACCESSIBILITY_FOCUS_OVERRIDER_H_
#define UI_BASE_COCOA_ACCESSIBILITY_FOCUS_OVERRIDER_H_
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
@@ -28,7 +28,7 @@ namespace ui {
// The above-required overriding of focus is done by instantiating an
// AccessibilityFocusOverrider and updating its state when the NSView in the
// PWA process is focused.
-class UI_BASE_EXPORT AccessibilityFocusOverrider {
+class COMPONENT_EXPORT(UI_BASE) AccessibilityFocusOverrider {
public:
class Client {
public:
diff --git a/chromium/ui/base/cocoa/appkit_utils.h b/chromium/ui/base/cocoa/appkit_utils.h
index 14f6c55070e..a3b46d13329 100644
--- a/chromium/ui/base/cocoa/appkit_utils.h
+++ b/chromium/ui/base/cocoa/appkit_utils.h
@@ -7,15 +7,15 @@
#import <Cocoa/Cocoa.h>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
// Whether a force-click event on the touchpad should invoke Quick Look.
-UI_BASE_EXPORT bool ForceClickInvokesQuickLook();
+COMPONENT_EXPORT(UI_BASE) bool ForceClickInvokesQuickLook();
// Returns true if both CGFloat values are equal.
-UI_BASE_EXPORT bool IsCGFloatEqual(CGFloat a, CGFloat b);
+COMPONENT_EXPORT(UI_BASE) bool IsCGFloatEqual(CGFloat a, CGFloat b);
} // namespace ui
diff --git a/chromium/ui/base/cocoa/base_view.h b/chromium/ui/base/cocoa/base_view.h
index d9194c2f629..989196e8e19 100644
--- a/chromium/ui/base/cocoa/base_view.h
+++ b/chromium/ui/base/cocoa/base_view.h
@@ -7,16 +7,16 @@
#import <Cocoa/Cocoa.h>
+#include "base/component_export.h"
#include "base/mac/scoped_nsobject.h"
#import "ui/base/cocoa/tracking_area.h"
-#include "ui/base/ui_base_export.h"
#include "ui/gfx/geometry/rect.h"
// A view that provides common functionality that many views will need:
// - Automatic registration for mouse-moved events.
// - Funneling of mouse and key events to two methods
// - Coordinate conversion utilities
-UI_BASE_EXPORT
+COMPONENT_EXPORT(UI_BASE)
@interface BaseView : NSView {
@public
enum EventHandled {
@@ -57,7 +57,7 @@ UI_BASE_EXPORT
// The name is |kViewDidBecomeFirstResponder|, the object is the view, and the
// NSSelectionDirection is wrapped in an NSNumber under the key
// |kSelectionDirection|.
-UI_BASE_EXPORT extern NSString* kViewDidBecomeFirstResponder;
-UI_BASE_EXPORT extern NSString* kSelectionDirection;
+COMPONENT_EXPORT(UI_BASE) extern NSString* kViewDidBecomeFirstResponder;
+COMPONENT_EXPORT(UI_BASE) extern NSString* kSelectionDirection;
#endif // UI_BASE_COCOA_BASE_VIEW_H_
diff --git a/chromium/ui/base/cocoa/base_view.mm b/chromium/ui/base/cocoa/base_view.mm
index 55ecf52defd..05ac7edca8b 100644
--- a/chromium/ui/base/cocoa/base_view.mm
+++ b/chromium/ui/base/cocoa/base_view.mm
@@ -4,6 +4,7 @@
#include "ui/base/cocoa/base_view.h"
+#include "base/check_op.h"
#include "base/mac/mac_util.h"
NSString* kViewDidBecomeFirstResponder =
diff --git a/chromium/ui/base/cocoa/bubble_closer.h b/chromium/ui/base/cocoa/bubble_closer.h
index 39a2f450d5a..806d7352726 100644
--- a/chromium/ui/base/cocoa/bubble_closer.h
+++ b/chromium/ui/base/cocoa/bubble_closer.h
@@ -8,9 +8,9 @@
#include <objc/objc.h>
#include "base/callback.h"
+#include "base/component_export.h"
#include "base/macros.h"
#include "ui/base/cocoa/weak_ptr_nsobject.h"
-#include "ui/base/ui_base_export.h"
#include "ui/gfx/native_widget_types.h"
namespace ui {
@@ -18,7 +18,7 @@ namespace ui {
// Monitors mouse events to allow a regular window to have menu-like popup
// behavior when clicking outside the window. This is needed because macOS
// suppresses window activation events when clicking rapidly.
-class UI_BASE_EXPORT BubbleCloser {
+class COMPONENT_EXPORT(UI_BASE) BubbleCloser {
public:
// Installs an event monitor watching for mouse clicks outside of |window| or
// any of its child windows. Invokes |on_click_outside| on each event.
diff --git a/chromium/ui/base/cocoa/cocoa_base_utils.h b/chromium/ui/base/cocoa/cocoa_base_utils.h
index 627fe3ba325..05c7526f8d4 100644
--- a/chromium/ui/base/cocoa/cocoa_base_utils.h
+++ b/chromium/ui/base/cocoa/cocoa_base_utils.h
@@ -7,7 +7,7 @@
#import <Cocoa/Cocoa.h>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
#include "ui/base/window_open_disposition.h"
namespace ui {
@@ -15,24 +15,26 @@ namespace ui {
// Retrieves the WindowOpenDisposition used to open a link from a user gesture
// represented by |event|. For example, a Cmd+Click would mean open the
// associated link in a background tab.
-UI_BASE_EXPORT WindowOpenDisposition
- WindowOpenDispositionFromNSEvent(NSEvent* event);
+COMPONENT_EXPORT(UI_BASE)
+WindowOpenDisposition WindowOpenDispositionFromNSEvent(NSEvent* event);
// Retrieves the WindowOpenDisposition used to open a link from a user gesture
// represented by |event|, but instead use the modifier flags given by |flags|,
// which is the same format as |-NSEvent modifierFlags|. This allows
// substitution of the modifiers without having to create a new event from
// scratch.
-UI_BASE_EXPORT WindowOpenDisposition
- WindowOpenDispositionFromNSEventWithFlags(NSEvent* event, NSUInteger flags);
+COMPONENT_EXPORT(UI_BASE)
+WindowOpenDisposition WindowOpenDispositionFromNSEventWithFlags(
+ NSEvent* event,
+ NSUInteger flags);
// Converts a point from window coordinates to screen coordinates.
-UI_BASE_EXPORT NSPoint ConvertPointFromWindowToScreen(NSWindow* window,
- NSPoint point);
+COMPONENT_EXPORT(UI_BASE)
+NSPoint ConvertPointFromWindowToScreen(NSWindow* window, NSPoint point);
// Converts a point from screen coordinates to window coordinates.
-UI_BASE_EXPORT NSPoint ConvertPointFromScreenToWindow(NSWindow* window,
- NSPoint point);
+COMPONENT_EXPORT(UI_BASE)
+NSPoint ConvertPointFromScreenToWindow(NSWindow* window, NSPoint point);
} // namespace ui
diff --git a/chromium/ui/base/cocoa/command_dispatcher.h b/chromium/ui/base/cocoa/command_dispatcher.h
index 0fca8887e6a..1203c0a4df2 100644
--- a/chromium/ui/base/cocoa/command_dispatcher.h
+++ b/chromium/ui/base/cocoa/command_dispatcher.h
@@ -7,8 +7,8 @@
#import <Cocoa/Cocoa.h>
+#include "base/component_export.h"
#import "base/mac/scoped_nsobject.h"
-#include "ui/base/ui_base_export.h"
@protocol CommandDispatcherDelegate;
@protocol CommandDispatchingWindow;
@@ -21,7 +21,7 @@
// NSWindow can use CommandDispatcher by implementing CommandDispatchingWindow
// and overriding -[NSWindow performKeyEquivalent:] and -[NSWindow sendEvent:]
// to call the respective CommandDispatcher methods.
-UI_BASE_EXPORT
+COMPONENT_EXPORT(UI_BASE)
@interface CommandDispatcher : NSObject
@property(assign, nonatomic) id<CommandDispatcherDelegate> delegate;
diff --git a/chromium/ui/base/cocoa/command_dispatcher.mm b/chromium/ui/base/cocoa/command_dispatcher.mm
index efe7a1862ce..1ae7b1707a7 100644
--- a/chromium/ui/base/cocoa/command_dispatcher.mm
+++ b/chromium/ui/base/cocoa/command_dispatcher.mm
@@ -23,6 +23,44 @@
- (NSWindow<CommandDispatchingWindow>*)bubbleParent;
@end
+namespace {
+
+// Duplicate the given key event, but changing the associated window.
+NSEvent* KeyEventForWindow(NSWindow* window, NSEvent* event) {
+ NSEventType event_type = [event type];
+
+ // Convert the event's location from the original window's coordinates into
+ // our own.
+ NSPoint location = [event locationInWindow];
+ location = ui::ConvertPointFromWindowToScreen([event window], location);
+ location = ui::ConvertPointFromScreenToWindow(window, location);
+
+ // Various things *only* apply to key down/up.
+ bool is_a_repeat = false;
+ NSString* characters = nil;
+ NSString* charactors_ignoring_modifiers = nil;
+ if (event_type == NSKeyDown || event_type == NSKeyUp) {
+ is_a_repeat = [event isARepeat];
+ characters = [event characters];
+ charactors_ignoring_modifiers = [event charactersIgnoringModifiers];
+ }
+
+ // This synthesis may be slightly imperfect: we provide nil for the context,
+ // since I (viettrungluu) am sceptical that putting in the original context
+ // (if one is given) is valid.
+ return [NSEvent keyEventWithType:event_type
+ location:location
+ modifierFlags:[event modifierFlags]
+ timestamp:[event timestamp]
+ windowNumber:[window windowNumber]
+ context:nil
+ characters:characters
+ charactersIgnoringModifiers:charactors_ignoring_modifiers
+ isARepeat:is_a_repeat
+ keyCode:[event keyCode]];
+}
+
+} // namespace
@implementation CommandDispatcher {
@private
@@ -169,10 +207,13 @@
return YES; // Pretend it's been handled in an effort to limit damage.
}
- // TODO(lgrey): This is a temporary sanity check since the code that was
- // here previously did *not* assume this. Remove shortly after this lands if
- // nothing blew up.
- DCHECK_EQ([event window], _owner);
+ // Sometimes, an event will be redispatched from a child window to a parent
+ // window to allow the parent window a chance to handle it. In that case, fix
+ // up the native event to reference the correct window. Failure to do this can
+ // cause infinite redispatch loops; see https://crbug.com/1085578 for more
+ // details.
+ if ([event window] != _owner)
+ event = KeyEventForWindow(_owner, event);
// Redispatch the event.
_eventHandled = YES;
diff --git a/chromium/ui/base/cocoa/constrained_window/constrained_window_animation.h b/chromium/ui/base/cocoa/constrained_window/constrained_window_animation.h
index 2bc672c9840..8942102b232 100644
--- a/chromium/ui/base/cocoa/constrained_window/constrained_window_animation.h
+++ b/chromium/ui/base/cocoa/constrained_window/constrained_window_animation.h
@@ -7,11 +7,11 @@
#import <Cocoa/Cocoa.h>
+#include "base/component_export.h"
#include "base/mac/scoped_nsobject.h"
-#include "ui/base/ui_base_export.h"
// Base class for all constrained window animation classes.
-UI_BASE_EXPORT
+COMPONENT_EXPORT(UI_BASE)
@interface ConstrainedWindowAnimationBase : NSAnimation {
@protected
base::scoped_nsobject<NSWindow> _window;
@@ -22,17 +22,17 @@ UI_BASE_EXPORT
@end
// An animation to show a window.
-UI_BASE_EXPORT
+COMPONENT_EXPORT(UI_BASE)
@interface ConstrainedWindowAnimationShow : ConstrainedWindowAnimationBase
@end
// An animation to hide a window.
-UI_BASE_EXPORT
+COMPONENT_EXPORT(UI_BASE)
@interface ConstrainedWindowAnimationHide : ConstrainedWindowAnimationBase
@end
// An animation that pulses the window by growing it then shrinking it back.
-UI_BASE_EXPORT
+COMPONENT_EXPORT(UI_BASE)
@interface ConstrainedWindowAnimationPulse : ConstrainedWindowAnimationBase
@end
diff --git a/chromium/ui/base/cocoa/constrained_window/constrained_window_animation.mm b/chromium/ui/base/cocoa/constrained_window/constrained_window_animation.mm
index ce16e17dfcb..c8ce99f708b 100644
--- a/chromium/ui/base/cocoa/constrained_window/constrained_window_animation.mm
+++ b/chromium/ui/base/cocoa/constrained_window/constrained_window_animation.mm
@@ -11,6 +11,7 @@
#include "base/location.h"
#import "base/mac/foundation_util.h"
#include "base/native_library.h"
+#include "base/notreached.h"
#include "base/stl_util.h"
#include "ui/gfx/animation/tween.h"
diff --git a/chromium/ui/base/cocoa/controls/button_utils.h b/chromium/ui/base/cocoa/controls/button_utils.h
index 740c914140a..d9b039f0fa9 100644
--- a/chromium/ui/base/cocoa/controls/button_utils.h
+++ b/chromium/ui/base/cocoa/controls/button_utils.h
@@ -5,11 +5,11 @@
#ifndef UI_BASE_COCOA_CONTROLS_BUTTON_UTILS_H_
#define UI_BASE_COCOA_CONTROLS_BUTTON_UTILS_H_
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
#include <Cocoa/Cocoa.h>
-UI_BASE_EXPORT
+COMPONENT_EXPORT(UI_BASE)
@interface ButtonUtils : NSObject
// These methods are a polyfill for convenience constructors that exist on
diff --git a/chromium/ui/base/cocoa/controls/textfield_utils.h b/chromium/ui/base/cocoa/controls/textfield_utils.h
index dea04b87f0e..4fd54c6c0ea 100644
--- a/chromium/ui/base/cocoa/controls/textfield_utils.h
+++ b/chromium/ui/base/cocoa/controls/textfield_utils.h
@@ -5,11 +5,11 @@
#ifndef UI_BASE_COCOA_CONTROLS_TEXTFIELD_UTILS_H_
#define UI_BASE_COCOA_CONTROLS_TEXTFIELD_UTILS_H_
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
#include <Cocoa/Cocoa.h>
-UI_BASE_EXPORT
+COMPONENT_EXPORT(UI_BASE)
@interface TextFieldUtils : NSObject
// This method is a polyfill for a method on NSTextField on macOS 10.12+.
diff --git a/chromium/ui/base/cocoa/defaults_utils.h b/chromium/ui/base/cocoa/defaults_utils.h
index ff68374f8a0..7845045d5c4 100644
--- a/chromium/ui/base/cocoa/defaults_utils.h
+++ b/chromium/ui/base/cocoa/defaults_utils.h
@@ -5,15 +5,15 @@
#ifndef UI_BASE_COCOA_DEFAULTS_UTILS_H_
#define UI_BASE_COCOA_DEFAULTS_UTILS_H_
+#include "base/component_export.h"
#include "base/time/time.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
// Returns the text insertion caret blink period, if one is configured in
// NSUserDefaults.
-UI_BASE_EXPORT bool TextInsertionCaretBlinkPeriod(base::TimeDelta* period);
-
+COMPONENT_EXPORT(UI_BASE)
+bool TextInsertionCaretBlinkPeriod(base::TimeDelta* period);
}
#endif
diff --git a/chromium/ui/base/cocoa/find_pasteboard.h b/chromium/ui/base/cocoa/find_pasteboard.h
index 4cda454dbc2..3dc0867ca8e 100644
--- a/chromium/ui/base/cocoa/find_pasteboard.h
+++ b/chromium/ui/base/cocoa/find_pasteboard.h
@@ -11,10 +11,10 @@
#import <Cocoa/Cocoa.h>
+#include "base/component_export.h"
#include "base/mac/scoped_nsobject.h"
-#include "ui/base/ui_base_export.h"
-UI_BASE_EXPORT extern NSString* kFindPasteboardChangedNotification;
+COMPONENT_EXPORT(UI_BASE) extern NSString* kFindPasteboardChangedNotification;
// Manages the find pasteboard. Use this to copy text to the find pasteboard,
// to get the text currently on the find pasteboard, and to receive
@@ -25,7 +25,7 @@ UI_BASE_EXPORT extern NSString* kFindPasteboardChangedNotification;
// This is not thread-safe and must be used on the main thread.
//
// This is supposed to be a singleton.
-UI_BASE_EXPORT
+COMPONENT_EXPORT(UI_BASE)
@interface FindPasteboard : NSObject {
@private
base::scoped_nsobject<NSString> _findText;
@@ -54,6 +54,6 @@ UI_BASE_EXPORT
#endif // __OBJC__
// Also provide a c++ interface
-UI_BASE_EXPORT base::string16 GetFindPboardText();
+COMPONENT_EXPORT(UI_BASE) base::string16 GetFindPboardText();
#endif // UI_BASE_COCOA_FIND_PASTEBOARD_H_
diff --git a/chromium/ui/base/cocoa/flipped_view.h b/chromium/ui/base/cocoa/flipped_view.h
index 7bc117779d8..c5dce1a553d 100644
--- a/chromium/ui/base/cocoa/flipped_view.h
+++ b/chromium/ui/base/cocoa/flipped_view.h
@@ -7,13 +7,13 @@
#import <Cocoa/Cocoa.h>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
// A view where the Y axis is flipped such that the origin is at the top left
// and Y value increases downwards. Drawing is flipped so that layout of the
// sections is easier. Apple recommends flipping the coordinate origin when
// doing a lot of text layout because it's more natural.
-UI_BASE_EXPORT
+COMPONENT_EXPORT(UI_BASE)
@interface FlippedView : NSView
@end
diff --git a/chromium/ui/base/cocoa/focus_tracker.h b/chromium/ui/base/cocoa/focus_tracker.h
index f77559ea098..a676e08ef15 100644
--- a/chromium/ui/base/cocoa/focus_tracker.h
+++ b/chromium/ui/base/cocoa/focus_tracker.h
@@ -4,15 +4,15 @@
#import <Cocoa/Cocoa.h>
+#include "base/component_export.h"
#include "base/mac/scoped_nsobject.h"
-#include "ui/base/ui_base_export.h"
// A class that handles saving and restoring focus. An instance of
// this class snapshots the currently focused view when it is
// constructed, and callers can use restoreFocus to return focus to
// that view. FocusTracker will not restore focus to views that are
// no longer in the view hierarchy or are not in the correct window.
-UI_BASE_EXPORT
+COMPONENT_EXPORT(UI_BASE)
@interface FocusTracker : NSObject {
@private
base::scoped_nsobject<NSView> _focusedView;
diff --git a/chromium/ui/base/cocoa/focus_window_set.h b/chromium/ui/base/cocoa/focus_window_set.h
index e4b6d9f0471..820195f6978 100644
--- a/chromium/ui/base/cocoa/focus_window_set.h
+++ b/chromium/ui/base/cocoa/focus_window_set.h
@@ -7,7 +7,7 @@
#include <set>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
#include "ui/gfx/native_widget_types.h"
namespace ui {
@@ -15,7 +15,8 @@ namespace ui {
// Brings a group of windows to the front without changing their order, and
// makes the frontmost one key and main. If none are visible, the frontmost
// miniaturized window is deminiaturized.
-UI_BASE_EXPORT void FocusWindowSet(const std::set<gfx::NativeWindow>& windows);
+COMPONENT_EXPORT(UI_BASE)
+void FocusWindowSet(const std::set<gfx::NativeWindow>& windows);
// Brings a group of windows to the front without changing their
// order, and makes the frontmost one key and main. If none are
@@ -24,8 +25,8 @@ UI_BASE_EXPORT void FocusWindowSet(const std::set<gfx::NativeWindow>& windows);
// behavior. Unlike FocusWindowSet, only windows on the current space
// are considered. It also ignores the hidden state of windows; the
// window system may be in the middle of unhiding the application.
-UI_BASE_EXPORT void FocusWindowSetOnCurrentSpace(
- const std::set<gfx::NativeWindow>& windows);
+COMPONENT_EXPORT(UI_BASE)
+void FocusWindowSetOnCurrentSpace(const std::set<gfx::NativeWindow>& windows);
} // namespace ui
diff --git a/chromium/ui/base/cocoa/focus_window_set.mm b/chromium/ui/base/cocoa/focus_window_set.mm
index 498df6e2951..06e7223ded8 100644
--- a/chromium/ui/base/cocoa/focus_window_set.mm
+++ b/chromium/ui/base/cocoa/focus_window_set.mm
@@ -4,6 +4,7 @@
#import <Cocoa/Cocoa.h>
+#include "base/check.h"
#include "ui/base/cocoa/focus_window_set.h"
namespace ui {
diff --git a/chromium/ui/base/cocoa/menu_controller.h b/chromium/ui/base/cocoa/menu_controller.h
index d6dd4f0ced2..8dc3cdb50a5 100644
--- a/chromium/ui/base/cocoa/menu_controller.h
+++ b/chromium/ui/base/cocoa/menu_controller.h
@@ -7,9 +7,9 @@
#import <Cocoa/Cocoa.h>
+#include "base/component_export.h"
#include "base/mac/scoped_nsobject.h"
#include "base/strings/string16.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
class MenuModel;
@@ -21,7 +21,7 @@ class MenuModel;
// allow for hierarchical menus). The tag is the index into that model for
// that particular item. It is important that the model outlives this object
// as it only maintains weak references.
-UI_BASE_EXPORT
+COMPONENT_EXPORT(UI_BASE)
@interface MenuControllerCocoa
: NSObject<NSMenuDelegate, NSUserInterfaceValidations>
diff --git a/chromium/ui/base/cocoa/permissions_utils.h b/chromium/ui/base/cocoa/permissions_utils.h
index 14355053988..a8ec034cdf2 100644
--- a/chromium/ui/base/cocoa/permissions_utils.h
+++ b/chromium/ui/base/cocoa/permissions_utils.h
@@ -5,7 +5,7 @@
#ifndef UI_BASE_COCOA_PERMISSIONS_UTILS_H_
#define UI_BASE_COCOA_PERMISSIONS_UTILS_H_
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
@@ -14,7 +14,7 @@ namespace ui {
// requires a permission authorization. There is no direct way to query the
// permission state, so this uses a heuristic to evaluate whether the permission
// has been granted.
-UI_BASE_EXPORT bool IsScreenCaptureAllowed();
+COMPONENT_EXPORT(UI_BASE) bool IsScreenCaptureAllowed();
} // namespace ui
diff --git a/chromium/ui/base/cocoa/quartz_util.h b/chromium/ui/base/cocoa/quartz_util.h
index dd3201fe925..bba1f2016e5 100644
--- a/chromium/ui/base/cocoa/quartz_util.h
+++ b/chromium/ui/base/cocoa/quartz_util.h
@@ -5,15 +5,15 @@
#ifndef UI_BASE_COCOA_QUARTZ_UTIL_H_
#define UI_BASE_COCOA_QUARTZ_UTIL_H_
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
// Calls +[CATransaction begin].
-UI_BASE_EXPORT void BeginCATransaction();
+COMPONENT_EXPORT(UI_BASE) void BeginCATransaction();
// Calls +[CATransaction commit].
-UI_BASE_EXPORT void CommitCATransaction();
+COMPONENT_EXPORT(UI_BASE) void CommitCATransaction();
} // namespace ui
diff --git a/chromium/ui/base/cocoa/remote_accessibility_api.h b/chromium/ui/base/cocoa/remote_accessibility_api.h
index 2a58aebabb2..e7adfee3210 100644
--- a/chromium/ui/base/cocoa/remote_accessibility_api.h
+++ b/chromium/ui/base/cocoa/remote_accessibility_api.h
@@ -8,8 +8,8 @@
#import <Cocoa/Cocoa.h>
#include <vector>
+#include "base/component_export.h"
#include "base/mac/scoped_nsobject.h"
-#include "ui/base/ui_base_export.h"
@interface NSAccessibilityRemoteUIElement : NSObject
+ (void)registerRemoteUIProcessIdentifier:(int)pid;
@@ -23,7 +23,7 @@ namespace ui {
// Helper functions to implement the above functions using std::vectors intsead
// of NSData.
-class UI_BASE_EXPORT RemoteAccessibility {
+class COMPONENT_EXPORT(UI_BASE) RemoteAccessibility {
public:
static std::vector<uint8_t> GetTokenForLocalElement(id element);
static base::scoped_nsobject<NSAccessibilityRemoteUIElement>
diff --git a/chromium/ui/base/cocoa/remote_layer_api.h b/chromium/ui/base/cocoa/remote_layer_api.h
index 2057fe69d1b..d684614589c 100644
--- a/chromium/ui/base/cocoa/remote_layer_api.h
+++ b/chromium/ui/base/cocoa/remote_layer_api.h
@@ -11,7 +11,7 @@
#include <stdint.h>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
// The CGSConnectionID is used to create the CAContext in the process that is
// going to share the CALayers that it is rendering to another process to
@@ -54,7 +54,7 @@ namespace ui {
// This function will check if all of the interfaces listed above are supported
// on the system, and return true if they are.
-bool UI_BASE_EXPORT RemoteLayerAPISupported();
+bool COMPONENT_EXPORT(UI_BASE) RemoteLayerAPISupported();
} // namespace ui
diff --git a/chromium/ui/base/cocoa/secure_password_input.h b/chromium/ui/base/cocoa/secure_password_input.h
index ca90d3964a5..d272cd1bd6a 100644
--- a/chromium/ui/base/cocoa/secure_password_input.h
+++ b/chromium/ui/base/cocoa/secure_password_input.h
@@ -5,13 +5,13 @@
#ifndef UI_BASE_COCOA_SECURE_PASSWORD_INPUT_H_
#define UI_BASE_COCOA_SECURE_PASSWORD_INPUT_H_
+#include "base/component_export.h"
#include "base/macros.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
// Enables the secure password input mode while in scope.
-class UI_BASE_EXPORT ScopedPasswordInputEnabler {
+class COMPONENT_EXPORT(UI_BASE) ScopedPasswordInputEnabler {
public:
ScopedPasswordInputEnabler();
~ScopedPasswordInputEnabler();
diff --git a/chromium/ui/base/cocoa/text_services_context_menu.cc b/chromium/ui/base/cocoa/text_services_context_menu.cc
index d149dd8df63..0dcfe6db2b4 100644
--- a/chromium/ui/base/cocoa/text_services_context_menu.cc
+++ b/chromium/ui/base/cocoa/text_services_context_menu.cc
@@ -17,22 +17,6 @@
namespace {
-enum MenuCommands {
- // These must not overlap with the command IDs used by other menus that
- // incorporate text services.
- // TODO(ellyjones): This is an ugly global dependency, especially on
- // //ui/views. What can we do about this? Can we get rid of the global
- // implicit namespace of command IDs?
- kSpeechMenu = 100,
- kSpeechStartSpeaking,
- kSpeechStopSpeaking,
-
- kWritingDirectionMenu,
- kWritingDirectionDefault,
- kWritingDirectionLtr,
- kWritingDirectionRtl,
-};
-
// The speech channel used for speaking. This is shared to check if a speech
// channel is currently speaking.
SpeechChannel g_speech_channel;
@@ -41,11 +25,11 @@ SpeechChannel g_speech_channel;
// |command_id|.
base::i18n::TextDirection GetTextDirectionFromCommandId(int command_id) {
switch (command_id) {
- case kWritingDirectionDefault:
+ case ui::TextServicesContextMenu::kWritingDirectionDefault:
return base::i18n::UNKNOWN_DIRECTION;
- case kWritingDirectionLtr:
+ case ui::TextServicesContextMenu::kWritingDirectionLtr:
return base::i18n::LEFT_TO_RIGHT;
- case kWritingDirectionRtl:
+ case ui::TextServicesContextMenu::kWritingDirectionRtl:
return base::i18n::RIGHT_TO_LEFT;
default:
NOTREACHED();
diff --git a/chromium/ui/base/cocoa/text_services_context_menu.h b/chromium/ui/base/cocoa/text_services_context_menu.h
index e9d48efa68c..a32b76f9523 100644
--- a/chromium/ui/base/cocoa/text_services_context_menu.h
+++ b/chromium/ui/base/cocoa/text_services_context_menu.h
@@ -5,20 +5,36 @@
#ifndef UI_BASE_COCOA_TEXT_SERVICES_CONTEXT_MENU_H_
#define UI_BASE_COCOA_TEXT_SERVICES_CONTEXT_MENU_H_
+#include "base/component_export.h"
#include "base/i18n/rtl.h"
#include "base/macros.h"
#include "base/strings/string16.h"
#include "ui/base/models/simple_menu_model.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
// This class is used to append and handle the Speech and BiDi submenu for the
// context menu.
-class UI_BASE_EXPORT TextServicesContextMenu
+class COMPONENT_EXPORT(UI_BASE) TextServicesContextMenu
: public SimpleMenuModel::Delegate {
public:
- class UI_BASE_EXPORT Delegate {
+ enum MenuCommands {
+ // These must not overlap with the command IDs used by other menus that
+ // incorporate text services.
+ // TODO(ellyjones): This is an ugly global dependency, especially on
+ // //ui/views. What can we do about this? Can we get rid of the global
+ // implicit namespace of command IDs?
+ kSpeechMenu = 100,
+ kSpeechStartSpeaking,
+ kSpeechStopSpeaking,
+
+ kWritingDirectionMenu,
+ kWritingDirectionDefault,
+ kWritingDirectionLtr,
+ kWritingDirectionRtl,
+ };
+
+ class COMPONENT_EXPORT(UI_BASE) Delegate {
public:
// Returns the selected text.
virtual base::string16 GetSelectedText() const = 0;
diff --git a/chromium/ui/base/cocoa/tool_tip_base_view.h b/chromium/ui/base/cocoa/tool_tip_base_view.h
index 086530a4894..32d354fd525 100644
--- a/chromium/ui/base/cocoa/tool_tip_base_view.h
+++ b/chromium/ui/base/cocoa/tool_tip_base_view.h
@@ -7,12 +7,13 @@
#import <AppKit/AppKit.h>
+#include "base/component_export.h"
#import "ui/base/cocoa/base_view.h"
// An NSiew that allows tooltip text to be set at the current mouse location. It
// can take effect immediately, but won't appear unless the tooltip delay has
// elapsed.
-UI_BASE_EXPORT
+COMPONENT_EXPORT(UI_BASE)
@interface ToolTipBaseView : BaseView {
@private
// These are part of the magic tooltip code from WebKit's WebHTMLView:
diff --git a/chromium/ui/base/cocoa/touch_bar_util.h b/chromium/ui/base/cocoa/touch_bar_util.h
index 457099bd9a5..f69d2a392f1 100644
--- a/chromium/ui/base/cocoa/touch_bar_util.h
+++ b/chromium/ui/base/cocoa/touch_bar_util.h
@@ -8,7 +8,7 @@
#import <Cocoa/Cocoa.h>
#include <os/availability.h>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
@@ -29,30 +29,29 @@ enum TouchBarAction {
};
// Logs the sample's UMA metrics into the DefaultTouchBar.Metrics histogram.
-UI_BASE_EXPORT void LogTouchBarUMA(TouchBarAction command);
+COMPONENT_EXPORT(UI_BASE) void LogTouchBarUMA(TouchBarAction command);
// Returns the NSTouchBar Class.
-UI_BASE_EXPORT Class NSTouchBar();
+COMPONENT_EXPORT(UI_BASE) Class NSTouchBar();
// Returns the NSCustomTouchBarItem Class.
-UI_BASE_EXPORT Class NSCustomTouchBarItem();
+COMPONENT_EXPORT(UI_BASE) Class NSCustomTouchBarItem();
// Returns the NSGroupTouchBarItem Class.
-UI_BASE_EXPORT Class NSGroupTouchBarItem();
+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))
-UI_BASE_EXPORT NSButton* GetBlueTouchBarButton(NSString* title,
- id target,
- SEL action);
+COMPONENT_EXPORT(UI_BASE)
+NSButton* GetBlueTouchBarButton(NSString* title, id target, SEL action);
// Creates a touch bar identifier with the given |id|.
-UI_BASE_EXPORT NSString* GetTouchBarId(NSString* touch_bar_id);
+COMPONENT_EXPORT(UI_BASE) NSString* GetTouchBarId(NSString* touch_bar_id);
// Creates a touch Bar jtem identifier.
-UI_BASE_EXPORT NSString* GetTouchBarItemId(NSString* touch_bar_id,
- NSString* item_id);
+COMPONENT_EXPORT(UI_BASE)
+NSString* GetTouchBarItemId(NSString* touch_bar_id, NSString* item_id);
} // namespace ui
diff --git a/chromium/ui/base/cocoa/tracking_area.h b/chromium/ui/base/cocoa/tracking_area.h
index 4d7cd334e72..9d4c1c42783 100644
--- a/chromium/ui/base/cocoa/tracking_area.h
+++ b/chromium/ui/base/cocoa/tracking_area.h
@@ -7,15 +7,15 @@
#import <AppKit/AppKit.h>
+#include "base/component_export.h"
#include "base/mac/scoped_nsobject.h"
#include "base/macros.h"
-#include "ui/base/ui_base_export.h"
@class CrTrackingAreaOwnerProxy;
// The CrTrackingArea can be used in place of an NSTrackingArea to shut off
// messaging to the |owner| at a specific point in time.
-UI_BASE_EXPORT
+COMPONENT_EXPORT(UI_BASE)
@interface CrTrackingArea : NSTrackingArea {
@private
base::scoped_nsobject<CrTrackingAreaOwnerProxy> _ownerProxy;
@@ -39,7 +39,7 @@ namespace ui {
// Use an instance of this class to call |-clearOwner| on the |tracking_area_|
// when this goes out of scope.
-class UI_BASE_EXPORT ScopedCrTrackingArea {
+class COMPONENT_EXPORT(UI_BASE) ScopedCrTrackingArea {
public:
// Takes ownership of |tracking_area| without retaining it.
explicit ScopedCrTrackingArea(CrTrackingArea* tracking_area = nil);
diff --git a/chromium/ui/base/cocoa/underlay_opengl_hosting_window.h b/chromium/ui/base/cocoa/underlay_opengl_hosting_window.h
index d673c31a0f3..ec1c6c972ee 100644
--- a/chromium/ui/base/cocoa/underlay_opengl_hosting_window.h
+++ b/chromium/ui/base/cocoa/underlay_opengl_hosting_window.h
@@ -7,12 +7,12 @@
#import <Cocoa/Cocoa.h>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
// Common base class for windows that host a OpenGL surface that renders under
// the window. Previously contained methods related to hole punching, now just
// contains common asserts.
-UI_BASE_EXPORT
+COMPONENT_EXPORT(UI_BASE)
@interface UnderlayOpenGLHostingWindow : NSWindow
@end
diff --git a/chromium/ui/base/cocoa/views_hostable.h b/chromium/ui/base/cocoa/views_hostable.h
index 46f0277491f..9a9ae9324a5 100644
--- a/chromium/ui/base/cocoa/views_hostable.h
+++ b/chromium/ui/base/cocoa/views_hostable.h
@@ -7,7 +7,7 @@
#import <objc/objc.h>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/native_widget_types.h"
diff --git a/chromium/ui/base/cocoa/weak_ptr_nsobject.h b/chromium/ui/base/cocoa/weak_ptr_nsobject.h
index fa9580e94ec..6d50aa00b9e 100644
--- a/chromium/ui/base/cocoa/weak_ptr_nsobject.h
+++ b/chromium/ui/base/cocoa/weak_ptr_nsobject.h
@@ -5,8 +5,8 @@
#ifndef UI_BASE_COCOA_WEAK_PTR_NSOBJECT_H_
#define UI_BASE_COCOA_WEAK_PTR_NSOBJECT_H_
+#include "base/component_export.h"
#include "base/macros.h"
-#include "ui/base/ui_base_export.h"
#if defined(__OBJC__)
@class WeakPtrNSObject;
@@ -20,7 +20,7 @@ namespace internal {
// Non-templatized base for WeakPtrNSObjectFactory with utility functions. This
// mainly serves to hide the objective-C code from the header, so it can be
// included in cc files.
-class UI_BASE_EXPORT WeakPtrNSObjectFactoryBase {
+class COMPONENT_EXPORT(UI_BASE) WeakPtrNSObjectFactoryBase {
protected:
static WeakPtrNSObject* Create(void* owner);
static void* UnWrap(WeakPtrNSObject* handle);
diff --git a/chromium/ui/base/cocoa/window_size_constants.h b/chromium/ui/base/cocoa/window_size_constants.h
index bb94018fd53..0f096c95629 100644
--- a/chromium/ui/base/cocoa/window_size_constants.h
+++ b/chromium/ui/base/cocoa/window_size_constants.h
@@ -5,14 +5,14 @@
#ifndef UI_BASE_COCOA_WINDOW_SIZE_CONSTANTS_H_
#define UI_BASE_COCOA_WINDOW_SIZE_CONSTANTS_H_
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
#import <Foundation/Foundation.h>
namespace ui {
// It is not valid to make a zero-sized window. Use this constant instead.
-UI_BASE_EXPORT extern const NSRect kWindowSizeDeterminedLater;
+COMPONENT_EXPORT(UI_BASE) extern const NSRect kWindowSizeDeterminedLater;
} // namespace ui
diff --git a/chromium/ui/base/cursor/BUILD.gn b/chromium/ui/base/cursor/BUILD.gn
index e69e571c44b..f16386ecf4a 100644
--- a/chromium/ui/base/cursor/BUILD.gn
+++ b/chromium/ui/base/cursor/BUILD.gn
@@ -4,39 +4,123 @@
import("//build/config/ui.gni")
-component("cursor") {
- output_name = "ui_base_cursor"
-
+# This component was split from :cursor to allow Blink to depend on it without
+# bringing all of //ui/base/cursor.
+component("cursor_base") {
+ output_name = "ui_base_cursor_base"
sources = [
"cursor.cc",
"cursor.h",
+ "cursor_factory.cc",
+ "cursor_factory.h",
"cursor_size.h",
]
-
- defines = [ "IS_UI_BASE_CURSOR_IMPL" ]
-
+ defines = [ "IS_UI_BASE_CURSOR_BASE_IMPL" ]
public_deps = [
"//base",
"//skia",
"//ui/base/cursor/mojom:cursor_type",
"//ui/gfx/geometry",
]
-
deps = [ "//ui/gfx:geometry_skia" ]
- if (use_x11 && use_aura) {
- sources += [ "cursor_x11.cc" ]
-
- deps += [ "//ui/base/x" ]
+ if (is_win) {
+ sources += [ "cursor_win.cc" ]
}
- if (use_ozone) {
+ if (use_x11 || use_ozone) {
sources += [ "cursor_ozone.cc" ]
+ }
+}
+
+source_set("theme_manager") {
+ sources = [
+ "cursor_theme_manager.cc",
+ "cursor_theme_manager.h",
+ "cursor_theme_manager_observer.h",
+ ]
+ deps = [ "//base" ]
+}
- deps += [ "//ui/ozone:ozone_base" ]
+if (use_aura) {
+ component("cursor") {
+ output_name = "ui_base_cursor"
+ sources = [
+ "cursor_loader.h",
+ "cursor_lookup.cc",
+ "cursor_lookup.h",
+ "cursor_util.cc",
+ "cursor_util.h",
+ "cursors_aura.cc",
+ "cursors_aura.h",
+ "image_cursors.cc",
+ "image_cursors.h",
+ ]
+ defines = [ "IS_UI_BASE_CURSOR_IMPL" ]
+ public_deps = [
+ ":cursor_base",
+ "//base",
+ "//ui/base/cursor/mojom:cursor_type",
+ "//ui/display",
+ "//ui/gfx:native_widget_types",
+ ]
+ deps = [
+ "//skia",
+ "//ui/base",
+ "//ui/gfx",
+ "//ui/gfx:geometry_skia",
+ "//ui/gfx/geometry",
+ "//ui/resources:ui_resources_grd",
+ ]
+
+ if (is_win) {
+ sources += [
+ "cursor_loader_win.cc",
+ "cursor_loader_win.h",
+ ]
+ deps += [ "//ui/resources:ui_unscaled_resources_grd" ]
+ }
+
+ if (use_ozone) {
+ sources += [
+ "ozone/bitmap_cursor_factory_ozone.cc",
+ "ozone/bitmap_cursor_factory_ozone.h",
+ ]
+ public_deps += [
+ "//skia",
+ "//ui/gfx/geometry",
+ ]
+ }
+
+ if (use_x11 || use_ozone) {
+ sources += [
+ "cursor_loader_ozone.cc",
+ "cursor_loader_ozone.h",
+ ]
+ }
}
+}
- if (is_win) {
- sources += [ "cursor_win.cc" ]
+source_set("unittests") {
+ testonly = true
+ sources = []
+ deps = [
+ "//skia",
+ "//testing/gtest",
+ "//ui/gfx/geometry",
+ ]
+
+ if (!is_ios) {
+ sources += [ "cursor_unittest.cc" ]
+ deps += [
+ ":cursor_base",
+ "//ui/base/cursor/mojom:cursor_type",
+ "//ui/gfx:geometry_skia",
+ ]
+ }
+
+ if (use_aura) {
+ sources += [ "cursor_util_unittest.cc" ]
+ deps += [ ":cursor" ]
}
}
diff --git a/chromium/ui/base/cursor/DEPS b/chromium/ui/base/cursor/DEPS
deleted file mode 100644
index de08167e272..00000000000
--- a/chromium/ui/base/cursor/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
- "+ui/ozone/public",
-]
diff --git a/chromium/ui/base/cursor/cursor.h b/chromium/ui/base/cursor/cursor.h
index 095798ce964..835027a9ac4 100644
--- a/chromium/ui/base/cursor/cursor.h
+++ b/chromium/ui/base/cursor/cursor.h
@@ -21,14 +21,12 @@ namespace ui {
#if defined(OS_WIN)
typedef ::HCURSOR PlatformCursor;
-#elif defined(USE_X11)
-typedef unsigned long PlatformCursor;
#else
typedef void* PlatformCursor;
#endif
// Ref-counted cursor that supports both default and custom cursors.
-class COMPONENT_EXPORT(UI_BASE_CURSOR) Cursor {
+class COMPONENT_EXPORT(UI_BASE_CURSOR_BASE) Cursor {
public:
Cursor();
diff --git a/chromium/ui/base/cursor/cursor_factory.cc b/chromium/ui/base/cursor/cursor_factory.cc
new file mode 100644
index 00000000000..43645a5d446
--- /dev/null
+++ b/chromium/ui/base/cursor/cursor_factory.cc
@@ -0,0 +1,68 @@
+// 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/cursor_factory.h"
+
+#include <ostream>
+
+#include "base/check.h"
+#include "base/check_op.h"
+#include "base/notreached.h"
+
+namespace ui {
+
+namespace {
+
+CursorFactory* g_instance = nullptr;
+
+} // namespace
+
+CursorFactory::CursorFactory() {
+ DCHECK(!g_instance) << "There should only be a single CursorFactory.";
+ g_instance = this;
+}
+
+CursorFactory::~CursorFactory() {
+ DCHECK_EQ(g_instance, this);
+ g_instance = nullptr;
+}
+
+CursorFactory* CursorFactory::GetInstance() {
+ DCHECK(g_instance);
+ return g_instance;
+}
+
+base::Optional<PlatformCursor> CursorFactory::GetDefaultCursor(
+ mojom::CursorType type) {
+ NOTIMPLEMENTED();
+ return base::nullopt;
+}
+
+PlatformCursor CursorFactory::CreateImageCursor(const SkBitmap& bitmap,
+ const gfx::Point& hotspot) {
+ NOTIMPLEMENTED();
+ return 0;
+}
+
+PlatformCursor CursorFactory::CreateAnimatedCursor(
+ const std::vector<SkBitmap>& bitmaps,
+ const gfx::Point& hotspot,
+ int frame_delay_ms) {
+ NOTIMPLEMENTED();
+ return 0;
+}
+
+void CursorFactory::RefImageCursor(PlatformCursor cursor) {
+ NOTIMPLEMENTED();
+}
+
+void CursorFactory::UnrefImageCursor(PlatformCursor cursor) {
+ NOTIMPLEMENTED();
+}
+
+void CursorFactory::ObserveThemeChanges() {
+ NOTIMPLEMENTED();
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/public/cursor_factory_ozone.h b/chromium/ui/base/cursor/cursor_factory.h
index a179bf08e73..f038a422819 100644
--- a/chromium/ui/ozone/public/cursor_factory_ozone.h
+++ b/chromium/ui/base/cursor/cursor_factory.h
@@ -2,42 +2,45 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_OZONE_PUBLIC_CURSOR_FACTORY_OZONE_H_
-#define UI_OZONE_PUBLIC_CURSOR_FACTORY_OZONE_H_
+#ifndef UI_BASE_CURSOR_CURSOR_FACTORY_H_
+#define UI_BASE_CURSOR_CURSOR_FACTORY_H_
#include <vector>
#include "base/component_export.h"
+#include "base/optional.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
-#include "ui/gfx/native_widget_types.h"
+
+class SkBitmap;
namespace gfx {
class Point;
}
namespace ui {
+using PlatformCursor = void*;
-typedef void* PlatformCursor;
-
-class COMPONENT_EXPORT(OZONE_BASE) CursorFactoryOzone {
+class COMPONENT_EXPORT(UI_BASE_CURSOR_BASE) CursorFactory {
public:
- CursorFactoryOzone();
- virtual ~CursorFactoryOzone();
+ CursorFactory();
+ virtual ~CursorFactory();
// Returns the thread-local instance.
- static CursorFactoryOzone* GetInstance();
+ static CursorFactory* GetInstance();
// Return the default cursor of the specified type. The types are listed in
// ui/base/cursor/cursor.h. Default cursors are managed by the implementation
// and must live indefinitely; there's no way to know when to free them.
- virtual PlatformCursor GetDefaultCursor(mojom::CursorType type);
+ // nullptr may be a valid value for the hidden cursor. When a default cursor
+ // is not available, base::nullopt is returned.
+ 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,
- const gfx::Point& hotspot,
- float bitmap_dpi);
+ 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.
@@ -46,16 +49,19 @@ class COMPONENT_EXPORT(OZONE_BASE) CursorFactoryOzone {
virtual PlatformCursor CreateAnimatedCursor(
const std::vector<SkBitmap>& bitmaps,
const gfx::Point& hotspot,
- int frame_delay_ms,
- float bitmap_dpi);
+ int frame_delay_ms);
// Increment platform image cursor refcount.
virtual void RefImageCursor(PlatformCursor cursor);
// Decrement platform image cursor refcount.
virtual void UnrefImageCursor(PlatformCursor cursor);
+
+ // Called after CursorThemeManager is initialized, to be able to track
+ // cursor theme and size changes.
+ virtual void ObserveThemeChanges();
};
} // namespace ui
-#endif // UI_OZONE_PUBLIC_CURSOR_FACTORY_OZONE_H_
+#endif // UI_BASE_CURSOR_CURSOR_FACTORY_H_
diff --git a/chromium/ui/base/cursor/cursor_loader.h b/chromium/ui/base/cursor/cursor_loader.h
index 95141089ffe..2553c54e488 100644
--- a/chromium/ui/base/cursor/cursor_loader.h
+++ b/chromium/ui/base/cursor/cursor_loader.h
@@ -5,18 +5,19 @@
#ifndef UI_BASE_CURSOR_CURSOR_LOADER_H_
#define UI_BASE_CURSOR_CURSOR_LOADER_H_
-#include "base/logging.h"
+#include "base/component_export.h"
#include "base/macros.h"
-#include "base/strings/string16.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
-#include "ui/base/ui_base_export.h"
#include "ui/display/display.h"
-#include "ui/gfx/geometry/point.h"
#include "ui/gfx/native_widget_types.h"
+namespace gfx {
+class Point;
+}
+
namespace ui {
-class UI_BASE_EXPORT CursorLoader {
+class COMPONENT_EXPORT(UI_BASE_CURSOR) CursorLoader {
public:
CursorLoader() : scale_(1.f), rotation_(display::Display::ROTATE_0) {}
virtual ~CursorLoader() {}
diff --git a/chromium/ui/base/cursor/cursor_loader_ozone.cc b/chromium/ui/base/cursor/cursor_loader_ozone.cc
index 8668095578e..6df16b5f1e7 100644
--- a/chromium/ui/base/cursor/cursor_loader_ozone.cc
+++ b/chromium/ui/base/cursor/cursor_loader_ozone.cc
@@ -6,15 +6,16 @@
#include <vector>
-#include "ui/base/cursor/cursor.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/ozone/public/cursor_factory_ozone.h"
namespace ui {
CursorLoaderOzone::CursorLoaderOzone() {
- factory_ = CursorFactoryOzone::GetInstance();
+ factory_ = CursorFactory::GetInstance();
}
CursorLoaderOzone::~CursorLoaderOzone() {
@@ -29,7 +30,7 @@ void CursorLoaderOzone::LoadImageCursor(mojom::CursorType id,
GetImageCursorBitmap(resource_id, scale(), rotation(), &hotspot, &bitmap);
- image_cursors_[id] = factory_->CreateImageCursor(bitmap, hotspot, scale());
+ image_cursors_[id] = factory_->CreateImageCursor(bitmap, hotspot);
}
void CursorLoaderOzone::LoadAnimatedCursor(mojom::CursorType id,
@@ -43,7 +44,7 @@ void CursorLoaderOzone::LoadAnimatedCursor(mojom::CursorType id,
resource_id, scale(), rotation(), &hotspot, &bitmaps);
image_cursors_[id] =
- factory_->CreateAnimatedCursor(bitmaps, hotspot, frame_delay_ms, scale());
+ factory_->CreateAnimatedCursor(bitmaps, hotspot, frame_delay_ms);
}
void CursorLoaderOzone::UnloadAll() {
@@ -53,22 +54,48 @@ void CursorLoaderOzone::UnloadAll() {
}
void CursorLoaderOzone::SetPlatformCursor(gfx::NativeCursor* cursor) {
- mojom::CursorType native_type = cursor->type();
- PlatformCursor platform;
-
- if (image_cursors_.count(native_type)) {
- // An image cursor is loaded for this type.
- platform = image_cursors_[native_type];
- } else if (native_type == mojom::CursorType::kCustom) {
- // The platform cursor was already set via WebCursor::GetPlatformCursor.
- platform = cursor->platform();
- } else {
- // Use default cursor of this type.
- platform = factory_->GetDefaultCursor(native_type);
- }
+ DCHECK(cursor);
+ // The platform cursor was already set via WebCursor::GetPlatformCursor.
+ if (cursor->type() == mojom::CursorType::kCustom)
+ return;
cursor->set_image_scale_factor(scale());
- cursor->SetPlatformCursor(platform);
+ cursor->SetPlatformCursor(CursorFromType(cursor->type()));
+}
+
+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;
+
+ // Loads the default Aura cursor bitmap for the cursor type. Falls back on
+ // pointer cursor if this fails.
+ PlatformCursor platform = CreateFallbackCursor(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;
+ return platform;
+}
+
+// Gets default Aura cursor bitmap/hotspot and creates a PlatformCursor with it.
+PlatformCursor CursorLoaderOzone::CreateFallbackCursor(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);
+ return image_cursors_[type];
+ }
+ return nullptr;
}
CursorLoader* CursorLoader::Create() {
diff --git a/chromium/ui/base/cursor/cursor_loader_ozone.h b/chromium/ui/base/cursor/cursor_loader_ozone.h
index 9d561727761..ccd23a3c9e0 100644
--- a/chromium/ui/base/cursor/cursor_loader_ozone.h
+++ b/chromium/ui/base/cursor/cursor_loader_ozone.h
@@ -7,19 +7,17 @@
#include <map>
+#include "base/component_export.h"
#include "base/macros.h"
#include "ui/base/cursor/cursor.h"
#include "ui/base/cursor/cursor_loader.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
namespace ui {
+class CursorFactory;
-class CursorFactoryOzone;
-
-class UI_BASE_EXPORT CursorLoaderOzone : public CursorLoader {
+class COMPONENT_EXPORT(UI_BASE_CURSOR) CursorLoaderOzone : public CursorLoader {
public:
- // CursorLoaderOzone will use CursorFactoryOzone corresponding to the thread
- // it was constructed on.
CursorLoaderOzone();
~CursorLoaderOzone() override;
@@ -35,9 +33,12 @@ class UI_BASE_EXPORT CursorLoaderOzone : public CursorLoader {
void SetPlatformCursor(gfx::NativeCursor* cursor) override;
private:
+ PlatformCursor CursorFromType(mojom::CursorType type);
+ PlatformCursor CreateFallbackCursor(mojom::CursorType type);
+
// Pointers are owned by ResourceBundle and must not be freed here.
std::map<mojom::CursorType, PlatformCursor> image_cursors_;
- CursorFactoryOzone* factory_ = nullptr;
+ CursorFactory* factory_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(CursorLoaderOzone);
};
diff --git a/chromium/ui/base/cursor/cursor_loader_win.cc b/chromium/ui/base/cursor/cursor_loader_win.cc
index d981eb79cda..735568dddc0 100644
--- a/chromium/ui/base/cursor/cursor_loader_win.cc
+++ b/chromium/ui/base/cursor/cursor_loader_win.cc
@@ -7,7 +7,7 @@
#include <windows.h>
#include "base/lazy_instance.h"
-#include "base/strings/string16.h"
+#include "base/notreached.h"
#include "ui/base/cursor/cursor.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
#include "ui/resources/grit/ui_unscaled_resources.h"
diff --git a/chromium/ui/base/cursor/cursor_loader_win.h b/chromium/ui/base/cursor/cursor_loader_win.h
index f17ca9f965b..bf3ec63c961 100644
--- a/chromium/ui/base/cursor/cursor_loader_win.h
+++ b/chromium/ui/base/cursor/cursor_loader_win.h
@@ -5,13 +5,14 @@
#ifndef UI_BASE_CURSOR_CURSOR_LOADER_WIN_H_
#define UI_BASE_CURSOR_CURSOR_LOADER_WIN_H_
-#include "base/compiler_specific.h"
+#include "base/component_export.h"
#include "base/macros.h"
+#include "base/strings/string16.h"
#include "ui/base/cursor/cursor_loader.h"
namespace ui {
-class UI_BASE_EXPORT CursorLoaderWin : public CursorLoader {
+class COMPONENT_EXPORT(UI_BASE_CURSOR) CursorLoaderWin : public CursorLoader {
public:
CursorLoaderWin();
~CursorLoaderWin() override;
diff --git a/chromium/ui/base/cursor/cursor_loader_x11.cc b/chromium/ui/base/cursor/cursor_loader_x11.cc
deleted file mode 100644
index e0b52555d62..00000000000
--- a/chromium/ui/base/cursor/cursor_loader_x11.cc
+++ /dev/null
@@ -1,310 +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.
-
-#include "ui/base/cursor/cursor_loader_x11.h"
-
-#include <float.h>
-
-#include "base/check.h"
-#include "base/notreached.h"
-#include "build/build_config.h"
-#include "skia/ext/image_operations.h"
-#include "ui/base/cursor/cursor.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/base/x/x11_util.h"
-#include "ui/display/display.h"
-#include "ui/gfx/geometry/point_conversions.h"
-#include "ui/gfx/geometry/size_conversions.h"
-#include "ui/gfx/image/image.h"
-#include "ui/gfx/skbitmap_operations.h"
-#include "ui/gfx/skia_util.h"
-
-namespace ui {
-
-namespace {
-
-// Load a cursor with a list of css names or shapes in order of decreasing
-// priority.
-::Cursor LoadFontCursor() {
- return x11::None;
-}
-
-template <typename... Ts>
-::Cursor LoadFontCursor(int shape, Ts... ts);
-
-template <typename... Ts>
-::Cursor LoadFontCursor(const char* name, Ts... ts) {
- ::Cursor cursor = XcursorLibraryLoadCursor(gfx::GetXDisplay(), name);
- if (cursor != x11::None)
- return cursor;
- return LoadFontCursor(ts...);
-}
-
-template <typename... Ts>
-::Cursor LoadFontCursor(int shape, Ts... ts) {
- ::Cursor cursor = XCreateFontCursor(gfx::GetXDisplay(), shape);
- if (cursor != x11::None)
- return cursor;
- return LoadFontCursor(ts...);
-}
-
-::Cursor LoadFontCursorForCursorType(mojom::CursorType id) {
- switch (id) {
- case mojom::CursorType::kMiddlePanning:
- return LoadFontCursor("all-scroll", XC_fleur);
- case mojom::CursorType::kMiddlePanningVertical:
- return LoadFontCursor("v-scroll");
- case mojom::CursorType::kMiddlePanningHorizontal:
- return LoadFontCursor("h-scroll");
- case mojom::CursorType::kNone:
- return LoadFontCursor("none");
- case mojom::CursorType::kGrab:
- return LoadFontCursor("openhand", "grab");
- case mojom::CursorType::kGrabbing:
- return LoadFontCursor("closedhand", "grabbing", XC_hand2);
- case mojom::CursorType::kNull:
- case mojom::CursorType::kPointer:
- return LoadFontCursor("left_ptr", XC_left_ptr);
- case mojom::CursorType::kMove:
- return LoadFontCursor("all-scroll", XC_fleur);
- case mojom::CursorType::kCross:
- return LoadFontCursor("crosshair", XC_cross);
- case mojom::CursorType::kHand:
- return LoadFontCursor("pointer", "hand", XC_hand2);
- case mojom::CursorType::kIBeam:
- return LoadFontCursor("text", XC_xterm);
- case mojom::CursorType::kProgress:
- return LoadFontCursor("progress", "left_ptr_watch", XC_watch);
- case mojom::CursorType::kWait:
- return LoadFontCursor("wait", XC_watch);
- case mojom::CursorType::kHelp:
- return LoadFontCursor("help");
- case mojom::CursorType::kEastResize:
- case mojom::CursorType::kEastPanning:
- return LoadFontCursor("e-resize", XC_right_side);
- case mojom::CursorType::kNorthResize:
- case mojom::CursorType::kNorthPanning:
- return LoadFontCursor("n-resize", XC_top_side);
- case mojom::CursorType::kNorthEastResize:
- case mojom::CursorType::kNorthEastPanning:
- return LoadFontCursor("ne-resize", XC_top_right_corner);
- case mojom::CursorType::kNorthWestResize:
- case mojom::CursorType::kNorthWestPanning:
- return LoadFontCursor("nw-resize", XC_top_left_corner);
- case mojom::CursorType::kSouthResize:
- case mojom::CursorType::kSouthPanning:
- return LoadFontCursor("s-resize", XC_bottom_side);
- case mojom::CursorType::kSouthEastResize:
- case mojom::CursorType::kSouthEastPanning:
- return LoadFontCursor("se-resize", XC_bottom_right_corner);
- case mojom::CursorType::kSouthWestResize:
- case mojom::CursorType::kSouthWestPanning:
- return LoadFontCursor("sw-resize", XC_bottom_left_corner);
- case mojom::CursorType::kWestResize:
- case mojom::CursorType::kWestPanning:
- return LoadFontCursor("w-resize", XC_right_side);
- case mojom::CursorType::kNorthSouthResize:
- return LoadFontCursor(XC_sb_v_double_arrow, "ns-resize");
- case mojom::CursorType::kEastWestResize:
- return LoadFontCursor(XC_sb_h_double_arrow, "ew-resize");
- case mojom::CursorType::kColumnResize:
- return LoadFontCursor("col-resize", XC_sb_h_double_arrow);
- case mojom::CursorType::kRowResize:
- return LoadFontCursor("row-resize", XC_sb_v_double_arrow);
- case mojom::CursorType::kNorthEastSouthWestResize:
- return LoadFontCursor("size_bdiag", "nesw-resize", "fd_double_arrow");
- case mojom::CursorType::kNorthWestSouthEastResize:
- return LoadFontCursor("size_fdiag", "nwse-resize", "bd_double_arrow");
- case mojom::CursorType::kVerticalText:
- return LoadFontCursor("vertical-text");
- case mojom::CursorType::kZoomIn:
- return LoadFontCursor("zoom-in");
- case mojom::CursorType::kZoomOut:
- return LoadFontCursor("zoom-out");
- case mojom::CursorType::kCell:
- return LoadFontCursor("cell", XC_plus);
- case mojom::CursorType::kContextMenu:
- return LoadFontCursor("context-menu");
- case mojom::CursorType::kAlias:
- return LoadFontCursor("alias");
- case mojom::CursorType::kNoDrop:
- return LoadFontCursor("no-drop");
- case mojom::CursorType::kCopy:
- return LoadFontCursor("copy");
- case mojom::CursorType::kNotAllowed:
- return LoadFontCursor("not-allowed", "crossed_circle");
- case mojom::CursorType::kDndNone:
- return LoadFontCursor("dnd-none", XC_hand2);
- case mojom::CursorType::kDndMove:
- return LoadFontCursor("dnd-move", XC_hand2);
- case mojom::CursorType::kDndCopy:
- return LoadFontCursor("dnd-copy", XC_hand2);
- case mojom::CursorType::kDndLink:
- return LoadFontCursor("dnd-link", XC_hand2);
- case mojom::CursorType::kCustom:
- NOTREACHED();
- return LoadFontCursor();
- }
- NOTREACHED() << "Case not handled for " << static_cast<int>(id);
- return LoadFontCursor();
-}
-
-} // namespace
-
-CursorLoader* CursorLoader::Create() {
- return new CursorLoaderX11;
-}
-
-CursorLoaderX11::ImageCursor::ImageCursor(XcursorImage* x_image,
- float scale,
- display::Display::Rotation rotation)
- : scale(scale), rotation(rotation) {
- cursor = CreateReffedCustomXCursor(x_image);
-}
-
-CursorLoaderX11::ImageCursor::~ImageCursor() {
- UnrefCustomXCursor(cursor);
-}
-
-CursorLoaderX11::CursorLoaderX11()
- : display_(gfx::GetXDisplay()),
- invisible_cursor_(CreateInvisibleCursor(), gfx::GetXDisplay()) {
- auto* cursor_theme_manager = CursorThemeManagerLinux::GetInstance();
- if (cursor_theme_manager)
- cursor_theme_observer_.Add(cursor_theme_manager);
-}
-
-CursorLoaderX11::~CursorLoaderX11() {
- UnloadAll();
-}
-
-void CursorLoaderX11::LoadImageCursor(mojom::CursorType id,
- int resource_id,
- const gfx::Point& hot) {
- SkBitmap bitmap;
- gfx::Point hotspot = hot;
-
- GetImageCursorBitmap(resource_id, scale(), rotation(), &hotspot, &bitmap);
- XcursorImage* x_image = SkBitmapToXcursorImage(bitmap, hotspot);
- image_cursors_[id] =
- std::make_unique<ImageCursor>(x_image, scale(), rotation());
-}
-
-void CursorLoaderX11::LoadAnimatedCursor(mojom::CursorType id,
- int resource_id,
- const gfx::Point& hot,
- int frame_delay_ms) {
- std::vector<SkBitmap> bitmaps;
- gfx::Point hotspot = hot;
-
- GetAnimatedCursorBitmaps(resource_id, scale(), rotation(), &hotspot,
- &bitmaps);
-
- XcursorImages* x_images = XcursorImagesCreate(bitmaps.size());
- x_images->nimage = bitmaps.size();
-
- for (unsigned int frame = 0; frame < bitmaps.size(); ++frame) {
- XcursorImage* x_image = SkBitmapToXcursorImage(bitmaps[frame], hotspot);
- x_image->delay = frame_delay_ms;
- x_images->images[frame] = x_image;
- }
-
- animated_cursors_[id] = std::make_pair(
- XcursorImagesLoadCursor(gfx::GetXDisplay(), x_images), x_images);
-}
-
-void CursorLoaderX11::UnloadAll() {
- image_cursors_.clear();
-
- // Free animated cursors and images.
- for (const auto& cursor : animated_cursors_) {
- XcursorImagesDestroy(
- cursor.second.second); // also frees individual frames.
- XFreeCursor(gfx::GetXDisplay(), cursor.second.first);
- }
-}
-
-void CursorLoaderX11::SetPlatformCursor(gfx::NativeCursor* cursor) {
- DCHECK(cursor);
-
- if (*cursor == mojom::CursorType::kNone) {
- cursor->SetPlatformCursor(invisible_cursor_.get());
- return;
- }
-
- if (*cursor == mojom::CursorType::kCustom)
- return;
-
- cursor->set_image_scale_factor(scale());
- cursor->SetPlatformCursor(CursorFromId(cursor->type()));
-}
-
-const XcursorImage* CursorLoaderX11::GetXcursorImageForTest(
- mojom::CursorType id) {
- return test::GetCachedXcursorImage(image_cursors_[id]->cursor);
-}
-
-void CursorLoaderX11::OnCursorThemeNameChanged(
- const std::string& cursor_theme_name) {
- XcursorSetTheme(display_, cursor_theme_name.c_str());
- ClearThemeCursors();
-}
-
-void CursorLoaderX11::OnCursorThemeSizeChanged(int cursor_theme_size) {
- XcursorSetDefaultSize(display_, cursor_theme_size);
- ClearThemeCursors();
-}
-
-bool CursorLoaderX11::IsImageCursor(gfx::NativeCursor native_cursor) {
- mojom::CursorType type = native_cursor.type();
- return image_cursors_.count(type) || animated_cursors_.count(type);
-}
-
-::Cursor CursorLoaderX11::CursorFromId(mojom::CursorType id) {
- auto font_it = font_cursors_.find(id);
- if (font_it != font_cursors_.end())
- return font_it->second;
- auto image_it = image_cursors_.find(id);
- if (image_it != image_cursors_.end()) {
- if (image_it->second->scale == scale() &&
- image_it->second->rotation == rotation()) {
- return image_it->second->cursor;
- } else {
- image_cursors_.erase(image_it);
- }
- }
-
- // First try to load the cursor directly.
- ::Cursor cursor = LoadFontCursorForCursorType(id);
- if (cursor != x11::None) {
- font_cursors_[id] = cursor;
- return cursor;
- }
-
- // If the theme is missing the desired cursor, use a chromium-supplied
- // fallback icon.
- int resource_id;
- gfx::Point point;
- if (ui::GetCursorDataFor(ui::CursorSize::kNormal, id, scale(), &resource_id,
- &point)) {
- LoadImageCursor(id, resource_id, point);
- return image_cursors_[id]->cursor;
- }
-
- // As a last resort, return a left pointer.
- cursor = XCreateFontCursor(display_, XC_left_ptr);
- DCHECK(cursor);
- font_cursors_[id] = cursor;
- return cursor;
-}
-
-void CursorLoaderX11::ClearThemeCursors() {
- font_cursors_.clear();
- image_cursors_.clear();
-}
-
-} // namespace ui
diff --git a/chromium/ui/base/cursor/cursor_loader_x11.h b/chromium/ui/base/cursor/cursor_loader_x11.h
deleted file mode 100644
index 26870d09e03..00000000000
--- a/chromium/ui/base/cursor/cursor_loader_x11.h
+++ /dev/null
@@ -1,93 +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.
-
-#ifndef UI_BASE_CURSOR_CURSOR_LOADER_X11_H_
-#define UI_BASE_CURSOR_CURSOR_LOADER_X11_H_
-
-#include <map>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/scoped_observer.h"
-#include "ui/base/cursor/cursor.h"
-#include "ui/base/cursor/cursor_loader.h"
-#include "ui/base/cursor/cursor_theme_manager_linux.h"
-#include "ui/base/cursor/cursor_theme_manager_linux_observer.h"
-#include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
-#include "ui/base/ui_base_export.h"
-#include "ui/base/x/x11_util.h"
-#include "ui/gfx/x/x11.h"
-
-namespace ui {
-
-class UI_BASE_EXPORT CursorLoaderX11 : public CursorLoader,
- public CursorThemeManagerLinuxObserver {
- public:
- CursorLoaderX11();
- ~CursorLoaderX11() 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 SetPlatformCursor(gfx::NativeCursor* cursor) override;
-
- const XcursorImage* GetXcursorImageForTest(mojom::CursorType id);
-
- protected:
- // CursorThemeManagerLinux:
- void OnCursorThemeNameChanged(const std::string& cursor_theme_name) override;
- void OnCursorThemeSizeChanged(int cursor_theme_size) override;
-
- private:
- struct ImageCursor {
- ImageCursor(XcursorImage* x_image,
- float scale,
- display::Display::Rotation rotation);
- ~ImageCursor();
-
- ::Cursor cursor;
- float scale;
- display::Display::Rotation rotation;
- };
-
- // Returns true if we have an image resource loaded for the |native_cursor|.
- bool IsImageCursor(gfx::NativeCursor native_cursor);
-
- // Loads a new cursor corresponding to |id|.
- ::Cursor CursorFromId(mojom::CursorType id);
-
- void ClearThemeCursors();
-
- XDisplay* display_;
-
- // A map from a cursor native type to X cursor.
- std::map<mojom::CursorType, ::Cursor> font_cursors_;
-
- // A map to hold all image cursors. It maps the cursor ID to the X Cursor, the
- // display's scale factor, and the display's rotation.
- std::map<mojom::CursorType, std::unique_ptr<ImageCursor>> image_cursors_;
-
- // A map to hold all animated cursors. It maps the cursor ID to the pair of
- // the X Cursor and the corresponding XcursorImages. We need a pointer to the
- // images so that we can free them on destruction.
- std::map<mojom::CursorType, std::pair<::Cursor, XcursorImages*>>
- animated_cursors_;
-
- const XScopedCursor invisible_cursor_;
-
- ScopedObserver<CursorThemeManagerLinux, CursorThemeManagerLinuxObserver>
- cursor_theme_observer_{this};
-
- DISALLOW_COPY_AND_ASSIGN(CursorLoaderX11);
-};
-
-} // namespace ui
-
-#endif // UI_BASE_CURSOR_CURSOR_LOADER_X11_H_
diff --git a/chromium/ui/base/cursor/cursor_lookup.h b/chromium/ui/base/cursor/cursor_lookup.h
index 47aefe22f6c..82f908422a1 100644
--- a/chromium/ui/base/cursor/cursor_lookup.h
+++ b/chromium/ui/base/cursor/cursor_lookup.h
@@ -5,7 +5,7 @@
#ifndef UI_BASE_CURSOR_CURSOR_LOOKUP_H_
#define UI_BASE_CURSOR_CURSOR_LOOKUP_H_
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
class SkBitmap;
@@ -16,9 +16,11 @@ class Point;
namespace ui {
class Cursor;
-SkBitmap UI_BASE_EXPORT GetCursorBitmap(const Cursor& cursor);
+COMPONENT_EXPORT(UI_BASE_CURSOR)
+SkBitmap GetCursorBitmap(const Cursor& cursor);
-gfx::Point UI_BASE_EXPORT GetCursorHotspot(const Cursor& cursor);
+COMPONENT_EXPORT(UI_BASE_CURSOR)
+gfx::Point GetCursorHotspot(const Cursor& cursor);
} // namespace ui
diff --git a/chromium/ui/base/cursor/cursor_ozone.cc b/chromium/ui/base/cursor/cursor_ozone.cc
index c4ef8c4d45e..b41f4ca3b67 100644
--- a/chromium/ui/base/cursor/cursor_ozone.cc
+++ b/chromium/ui/base/cursor/cursor_ozone.cc
@@ -4,18 +4,18 @@
#include "ui/base/cursor/cursor.h"
-#include "ui/ozone/public/cursor_factory_ozone.h"
+#include "ui/base/cursor/cursor_factory.h"
namespace ui {
void Cursor::RefCustomCursor() {
if (platform_cursor_)
- CursorFactoryOzone::GetInstance()->RefImageCursor(platform_cursor_);
+ CursorFactory::GetInstance()->RefImageCursor(platform_cursor_);
}
void Cursor::UnrefCustomCursor() {
if (platform_cursor_)
- CursorFactoryOzone::GetInstance()->UnrefImageCursor(platform_cursor_);
+ CursorFactory::GetInstance()->UnrefImageCursor(platform_cursor_);
}
} // namespace ui
diff --git a/chromium/ui/base/cursor/cursor_theme_manager.cc b/chromium/ui/base/cursor/cursor_theme_manager.cc
new file mode 100644
index 00000000000..665725a1c27
--- /dev/null
+++ b/chromium/ui/base/cursor/cursor_theme_manager.cc
@@ -0,0 +1,47 @@
+// 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/base/cursor/cursor_theme_manager.h"
+
+#include "base/check.h"
+#include "base/check_op.h"
+
+namespace ui {
+
+namespace {
+
+CursorThemeManager* g_instance = nullptr;
+
+}
+
+CursorThemeManager::~CursorThemeManager() {
+ DCHECK_EQ(g_instance, this);
+ g_instance = nullptr;
+}
+
+// static
+CursorThemeManager* CursorThemeManager::GetInstance() {
+ return g_instance;
+}
+
+void CursorThemeManager::AddObserver(CursorThemeManagerObserver* observer) {
+ cursor_theme_observers_.AddObserver(observer);
+ std::string name = GetCursorThemeName();
+ if (!name.empty())
+ observer->OnCursorThemeNameChanged(name);
+ int size = GetCursorThemeSize();
+ if (size)
+ observer->OnCursorThemeSizeChanged(size);
+}
+
+void CursorThemeManager::RemoveObserver(CursorThemeManagerObserver* observer) {
+ cursor_theme_observers_.RemoveObserver(observer);
+}
+
+CursorThemeManager::CursorThemeManager() {
+ DCHECK(!g_instance);
+ g_instance = this;
+}
+
+} // namespace ui
diff --git a/chromium/ui/base/cursor/cursor_theme_manager.h b/chromium/ui/base/cursor/cursor_theme_manager.h
new file mode 100644
index 00000000000..a6d09f04945
--- /dev/null
+++ b/chromium/ui/base/cursor/cursor_theme_manager.h
@@ -0,0 +1,46 @@
+// 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_BASE_CURSOR_CURSOR_THEME_MANAGER_H_
+#define UI_BASE_CURSOR_CURSOR_THEME_MANAGER_H_
+
+#include <string>
+
+#include "base/observer_list.h"
+#include "ui/base/cursor/cursor_theme_manager_observer.h"
+
+namespace ui {
+
+class CursorThemeManager {
+ public:
+ CursorThemeManager(const CursorThemeManager&) = delete;
+ CursorThemeManager& operator=(const CursorThemeManager&) = delete;
+ virtual ~CursorThemeManager();
+
+ static CursorThemeManager* GetInstance();
+
+ // Adds |observer| and makes initial OnCursorThemNameChanged() and/or
+ // OnCursorThemeSizeChanged() calls if the respective settings were set.
+ void AddObserver(CursorThemeManagerObserver* observer);
+
+ void RemoveObserver(CursorThemeManagerObserver* observer);
+
+ protected:
+ CursorThemeManager();
+
+ const base::ObserverList<CursorThemeManagerObserver>&
+ cursor_theme_observers() {
+ return cursor_theme_observers_;
+ }
+
+ virtual std::string GetCursorThemeName() = 0;
+ virtual int GetCursorThemeSize() = 0;
+
+ private:
+ base::ObserverList<CursorThemeManagerObserver> cursor_theme_observers_;
+};
+
+} // namespace ui
+
+#endif // UI_BASE_CURSOR_CURSOR_THEME_MANAGER_H_
diff --git a/chromium/ui/base/cursor/cursor_theme_manager_linux.cc b/chromium/ui/base/cursor/cursor_theme_manager_linux.cc
deleted file mode 100644
index f825b745f5d..00000000000
--- a/chromium/ui/base/cursor/cursor_theme_manager_linux.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// 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/base/cursor/cursor_theme_manager_linux.h"
-
-namespace ui {
-
-// static
-CursorThemeManagerLinux* CursorThemeManagerLinux::instance_ = nullptr;
-
-// static
-void CursorThemeManagerLinux::SetInstance(CursorThemeManagerLinux* instance) {
- instance_ = instance;
-}
-
-// static
-CursorThemeManagerLinux* CursorThemeManagerLinux::GetInstance() {
- return instance_;
-}
-
-CursorThemeManagerLinux::CursorThemeManagerLinux() = default;
-
-CursorThemeManagerLinux::~CursorThemeManagerLinux() = default;
-
-void CursorThemeManagerLinux::AddObserver(
- CursorThemeManagerLinuxObserver* observer) {
- cursor_theme_observers_.AddObserver(observer);
- std::string name = GetCursorThemeName();
- if (!name.empty())
- observer->OnCursorThemeNameChanged(name);
- int size = GetCursorThemeSize();
- if (size)
- observer->OnCursorThemeSizeChanged(size);
-}
-
-void CursorThemeManagerLinux::RemoveObserver(
- CursorThemeManagerLinuxObserver* observer) {
- cursor_theme_observers_.RemoveObserver(observer);
-}
-
-} // namespace ui
diff --git a/chromium/ui/base/cursor/cursor_theme_manager_linux.h b/chromium/ui/base/cursor/cursor_theme_manager_linux.h
deleted file mode 100644
index 464d397cec5..00000000000
--- a/chromium/ui/base/cursor/cursor_theme_manager_linux.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// 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_BASE_CURSOR_CURSOR_THEME_MANAGER_LINUX_H_
-#define UI_BASE_CURSOR_CURSOR_THEME_MANAGER_LINUX_H_
-
-#include <string>
-
-#include "base/macros.h"
-#include "base/observer_list.h"
-#include "ui/base/cursor/cursor_theme_manager_linux_observer.h"
-#include "ui/base/ui_base_export.h"
-
-namespace ui {
-
-class UI_BASE_EXPORT CursorThemeManagerLinux {
- public:
- virtual ~CursorThemeManagerLinux();
-
- static void SetInstance(CursorThemeManagerLinux* instance);
-
- static CursorThemeManagerLinux* GetInstance();
-
- // Adds |observer| and makes initial OnCursorThemNameChanged() and/or
- // OnCursorThemeSizeChanged() calls if the respective settings were set.
- void AddObserver(CursorThemeManagerLinuxObserver* observer);
-
- void RemoveObserver(CursorThemeManagerLinuxObserver* observer);
-
- protected:
- CursorThemeManagerLinux();
-
- const base::ObserverList<CursorThemeManagerLinuxObserver>&
- cursor_theme_observers() {
- return cursor_theme_observers_;
- }
-
- virtual std::string GetCursorThemeName() = 0;
- virtual int GetCursorThemeSize() = 0;
-
- private:
- static CursorThemeManagerLinux* instance_;
-
- base::ObserverList<CursorThemeManagerLinuxObserver> cursor_theme_observers_;
-
- DISALLOW_COPY_AND_ASSIGN(CursorThemeManagerLinux);
-};
-
-} // namespace ui
-
-#endif // UI_BASE_CURSOR_CURSOR_THEME_MANAGER_LINUX_H_
diff --git a/chromium/ui/base/cursor/cursor_theme_manager_linux_observer.h b/chromium/ui/base/cursor/cursor_theme_manager_observer.h
index 73a3b42f343..028a8bb7dfe 100644
--- a/chromium/ui/base/cursor/cursor_theme_manager_linux_observer.h
+++ b/chromium/ui/base/cursor/cursor_theme_manager_observer.h
@@ -2,18 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_BASE_CURSOR_CURSOR_THEME_MANAGER_LINUX_OBSERVER_H_
-#define UI_BASE_CURSOR_CURSOR_THEME_MANAGER_LINUX_OBSERVER_H_
+#ifndef UI_BASE_CURSOR_CURSOR_THEME_MANAGER_OBSERVER_H_
+#define UI_BASE_CURSOR_CURSOR_THEME_MANAGER_OBSERVER_H_
#include <string>
#include "base/observer_list_types.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
-class UI_BASE_EXPORT CursorThemeManagerLinuxObserver
- : public base::CheckedObserver {
+class CursorThemeManagerObserver : public base::CheckedObserver {
public:
// |cursor_theme_name| will be nonempty.
virtual void OnCursorThemeNameChanged(
@@ -23,9 +21,9 @@ class UI_BASE_EXPORT CursorThemeManagerLinuxObserver
virtual void OnCursorThemeSizeChanged(int cursor_theme_size) = 0;
protected:
- ~CursorThemeManagerLinuxObserver() override = default;
+ ~CursorThemeManagerObserver() override = default;
};
} // namespace ui
-#endif // UI_BASE_CURSOR_CURSOR_THEME_MANAGER_LINUX_OBSERVER_H_
+#endif // UI_BASE_CURSOR_CURSOR_THEME_MANAGER_OBSERVER_H_
diff --git a/chromium/ui/base/cursor/cursor_unittest.cc b/chromium/ui/base/cursor/cursor_unittest.cc
index ef2d9e1e58f..d69ecfcc2cd 100644
--- a/chromium/ui/base/cursor/cursor_unittest.cc
+++ b/chromium/ui/base/cursor/cursor_unittest.cc
@@ -4,12 +4,10 @@
#include "ui/base/cursor/cursor.h"
-#include <algorithm>
-
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/base/cursor/cursor_lookup.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
+#include "ui/gfx/geometry/point.h"
#include "ui/gfx/skia_util.h"
namespace ui {
@@ -38,22 +36,21 @@ TEST(CursorTest, CustomType) {
const gfx::Point kHotspot = gfx::Point(5, 2);
cursor.set_custom_hotspot(kHotspot);
- EXPECT_EQ(kHotspot, GetCursorHotspot(cursor));
+ EXPECT_EQ(kHotspot, cursor.custom_hotspot());
SkBitmap bitmap;
bitmap.allocN32Pixels(10, 10);
bitmap.eraseColor(SK_ColorRED);
cursor.set_custom_bitmap(bitmap);
- EXPECT_EQ(bitmap.getGenerationID(),
- GetCursorBitmap(cursor).getGenerationID());
- EXPECT_TRUE(gfx::BitmapsAreEqual(bitmap, GetCursorBitmap(cursor)));
+ EXPECT_EQ(bitmap.getGenerationID(), cursor.custom_bitmap().getGenerationID());
+ EXPECT_TRUE(gfx::BitmapsAreEqual(bitmap, cursor.custom_bitmap()));
Cursor copy(cursor);
- EXPECT_EQ(GetCursorBitmap(cursor).getGenerationID(),
- GetCursorBitmap(copy).getGenerationID());
+ EXPECT_EQ(cursor.custom_bitmap().getGenerationID(),
+ copy.custom_bitmap().getGenerationID());
EXPECT_TRUE(
- gfx::BitmapsAreEqual(GetCursorBitmap(cursor), GetCursorBitmap(copy)));
+ gfx::BitmapsAreEqual(cursor.custom_bitmap(), copy.custom_bitmap()));
EXPECT_EQ(cursor, copy);
}
@@ -71,10 +68,10 @@ TEST(CursorTest, CustomTypeComparesBitmapPixels) {
bitmap2.eraseColor(SK_ColorRED);
cursor2.set_custom_bitmap(bitmap2);
- EXPECT_NE(GetCursorBitmap(cursor1).getGenerationID(),
- GetCursorBitmap(cursor2).getGenerationID());
+ EXPECT_NE(cursor1.custom_bitmap().getGenerationID(),
+ cursor2.custom_bitmap().getGenerationID());
EXPECT_TRUE(
- gfx::BitmapsAreEqual(GetCursorBitmap(cursor1), GetCursorBitmap(cursor2)));
+ gfx::BitmapsAreEqual(cursor1.custom_bitmap(), cursor2.custom_bitmap()));
EXPECT_EQ(cursor1, cursor2);
}
diff --git a/chromium/ui/base/cursor/cursor_util.cc b/chromium/ui/base/cursor/cursor_util.cc
index 4af26e57833..a19a4ddcf1e 100644
--- a/chromium/ui/base/cursor/cursor_util.cc
+++ b/chromium/ui/base/cursor/cursor_util.cc
@@ -6,8 +6,11 @@
#include "base/check_op.h"
#include "base/notreached.h"
+#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/resource/resource_bundle.h"
+#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/point_conversions.h"
+#include "ui/gfx/geometry/size.h"
#include "ui/gfx/geometry/size_conversions.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/skbitmap_operations.h"
diff --git a/chromium/ui/base/cursor/cursor_util.h b/chromium/ui/base/cursor/cursor_util.h
index fc93f2150f4..1fe3277c509 100644
--- a/chromium/ui/base/cursor/cursor_util.h
+++ b/chromium/ui/base/cursor/cursor_util.h
@@ -7,22 +7,25 @@
#include <vector>
-#include "base/compiler_specific.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
#include "ui/display/display.h"
-#include "ui/gfx/geometry/point.h"
+
+class SkBitmap;
+
+namespace gfx {
+class Point;
+}
namespace ui {
// Scale and rotate the cursor's bitmap and hotpoint.
// |bitmap_in_out| and |hotpoint_in_out| are used as
// both input and output.
-UI_BASE_EXPORT void ScaleAndRotateCursorBitmapAndHotpoint(
- float scale,
- display::Display::Rotation rotation,
- SkBitmap* bitmap_in_out,
- gfx::Point* hotpoint_in_out);
+COMPONENT_EXPORT(UI_BASE_CURSOR)
+void ScaleAndRotateCursorBitmapAndHotpoint(float scale,
+ display::Display::Rotation rotation,
+ SkBitmap* bitmap_in_out,
+ gfx::Point* hotpoint_in_out);
// Helpers for CursorLoader.
void GetImageCursorBitmap(int resource_id,
diff --git a/chromium/ui/base/cursor/cursor_util_unittest.cc b/chromium/ui/base/cursor/cursor_util_unittest.cc
index 1e2d55f6385..89cb58fc873 100644
--- a/chromium/ui/base/cursor/cursor_util_unittest.cc
+++ b/chromium/ui/base/cursor/cursor_util_unittest.cc
@@ -6,6 +6,7 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/gfx/geometry/point.h"
namespace ui {
namespace {
diff --git a/chromium/ui/base/cursor/cursor_x11.cc b/chromium/ui/base/cursor/cursor_x11.cc
deleted file mode 100644
index edf6c9bb6ba..00000000000
--- a/chromium/ui/base/cursor/cursor_x11.cc
+++ /dev/null
@@ -1,21 +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.
-
-#include "ui/base/cursor/cursor.h"
-
-#include "ui/base/x/x11_util.h"
-
-namespace ui {
-
-void Cursor::RefCustomCursor() {
- if (platform_cursor_)
- ui::RefCustomXCursor(platform_cursor_);
-}
-
-void Cursor::UnrefCustomCursor() {
- if (platform_cursor_)
- ui::UnrefCustomXCursor(platform_cursor_);
-}
-
-} // namespace ui
diff --git a/chromium/ui/base/cursor/cursors_aura.cc b/chromium/ui/base/cursor/cursors_aura.cc
index 2a7ba7784c1..710fb8dba11 100644
--- a/chromium/ui/base/cursor/cursors_aura.cc
+++ b/chromium/ui/base/cursor/cursors_aura.cc
@@ -9,6 +9,7 @@
#include "base/stl_util.h"
#include "build/build_config.h"
#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/base/cursor/cursor.h"
#include "ui/base/cursor/cursor_size.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
#include "ui/base/resource/resource_bundle.h"
@@ -22,6 +23,7 @@
#endif
namespace ui {
+
namespace {
struct HotPoint {
@@ -282,120 +284,6 @@ bool SearchTable(const CursorData* table,
} // namespace
-const char* CursorCssNameFromId(mojom::CursorType id) {
- switch (id) {
- case mojom::CursorType::kMiddlePanning:
- return "all-scroll";
- case mojom::CursorType::kMiddlePanningVertical:
- return "v-scroll";
- case mojom::CursorType::kMiddlePanningHorizontal:
- return "h-scroll";
- case mojom::CursorType::kEastPanning:
- return "e-resize";
- case mojom::CursorType::kNorthPanning:
- return "n-resize";
- case mojom::CursorType::kNorthEastPanning:
- return "ne-resize";
- case mojom::CursorType::kNorthWestPanning:
- return "nw-resize";
- case mojom::CursorType::kSouthPanning:
- return "s-resize";
- case mojom::CursorType::kSouthEastPanning:
- return "se-resize";
- case mojom::CursorType::kSouthWestPanning:
- return "sw-resize";
- case mojom::CursorType::kWestPanning:
- return "w-resize";
- case mojom::CursorType::kNone:
- return "none";
- case mojom::CursorType::kGrab:
- return "grab";
- case mojom::CursorType::kGrabbing:
- return "grabbing";
- case mojom::CursorType::kNull:
- return "left_ptr";
- case mojom::CursorType::kPointer:
- return "left_ptr";
- case mojom::CursorType::kMove:
- // Returning "move" is the correct thing here, but Blink doesn't
- // make a distinction between move and all-scroll. Other
- // platforms use a cursor more consistent with all-scroll, so
- // use that.
- return "all-scroll";
- case mojom::CursorType::kCross:
- return "crosshair";
- case mojom::CursorType::kHand:
- return "pointer";
- case mojom::CursorType::kIBeam:
- return "text";
- case mojom::CursorType::kProgress:
- return "progress";
- case mojom::CursorType::kWait:
- return "wait";
- case mojom::CursorType::kHelp:
- return "help";
- case mojom::CursorType::kEastResize:
- return "e-resize";
- case mojom::CursorType::kNorthResize:
- return "n-resize";
- case mojom::CursorType::kNorthEastResize:
- return "ne-resize";
- case mojom::CursorType::kNorthWestResize:
- return "nw-resize";
- case mojom::CursorType::kSouthResize:
- return "s-resize";
- case mojom::CursorType::kSouthEastResize:
- return "se-resize";
- case mojom::CursorType::kSouthWestResize:
- return "sw-resize";
- case mojom::CursorType::kWestResize:
- return "w-resize";
- case mojom::CursorType::kNorthSouthResize:
- return "ns-resize";
- case mojom::CursorType::kEastWestResize:
- return "ew-resize";
- case mojom::CursorType::kColumnResize:
- return "col-resize";
- case mojom::CursorType::kRowResize:
- return "row-resize";
- case mojom::CursorType::kNorthEastSouthWestResize:
- return "nesw-resize";
- case mojom::CursorType::kNorthWestSouthEastResize:
- return "nwse-resize";
- case mojom::CursorType::kVerticalText:
- return "vertical-text";
- case mojom::CursorType::kZoomIn:
- return "zoom-in";
- case mojom::CursorType::kZoomOut:
- return "zoom-out";
- case mojom::CursorType::kCell:
- return "cell";
- case mojom::CursorType::kContextMenu:
- return "context-menu";
- case mojom::CursorType::kAlias:
- return "alias";
- case mojom::CursorType::kNoDrop:
- return "no-drop";
- case mojom::CursorType::kCopy:
- return "copy";
- case mojom::CursorType::kNotAllowed:
- return "not-allowed";
- case mojom::CursorType::kDndNone:
- return "dnd-none";
- case mojom::CursorType::kDndMove:
- return "dnd-move";
- case mojom::CursorType::kDndCopy:
- return "dnd-copy";
- case mojom::CursorType::kDndLink:
- return "dnd-link";
- case mojom::CursorType::kCustom:
- NOTREACHED();
- return "left_ptr";
- }
- NOTREACHED() << "Case not handled for " << static_cast<int>(id);
- return "left_ptr";
-}
-
bool GetCursorDataFor(CursorSize cursor_size,
mojom::CursorType id,
float scale_factor,
diff --git a/chromium/ui/base/cursor/cursors_aura.h b/chromium/ui/base/cursor/cursors_aura.h
index 778a5d3c871..cc82d976546 100644
--- a/chromium/ui/base/cursor/cursors_aura.h
+++ b/chromium/ui/base/cursor/cursors_aura.h
@@ -5,9 +5,8 @@
#ifndef UI_BASE_CURSOR_CURSORS_AURA_H_
#define UI_BASE_CURSOR_CURSORS_AURA_H_
-#include "ui/base/cursor/cursor.h"
+#include "base/component_export.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
-#include "ui/base/ui_base_export.h"
class SkBitmap;
@@ -16,29 +15,29 @@ class Point;
}
namespace ui {
+class Cursor;
enum class CursorSize;
const int kAnimatedCursorFrameDelayMs = 25;
-// Returns CSS cursor name from an Aura cursor ID.
-UI_BASE_EXPORT const char* CursorCssNameFromId(mojom::CursorType id);
-
// 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
// |hot_2x|. Returns false if |id| is invalid.
-UI_BASE_EXPORT bool GetCursorDataFor(CursorSize cursor_size,
- mojom::CursorType id,
- float scale_factor,
- int* resource_id,
- gfx::Point* point);
+COMPONENT_EXPORT(UI_BASE_CURSOR)
+bool GetCursorDataFor(CursorSize cursor_size,
+ mojom::CursorType id,
+ float scale_factor,
+ int* resource_id,
+ gfx::Point* point);
// Like above, but for animated cursors.
-UI_BASE_EXPORT bool GetAnimatedCursorDataFor(CursorSize cursor_size,
- mojom::CursorType id,
- float scale_factor,
- int* resource_id,
- gfx::Point* point);
+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);
diff --git a/chromium/ui/base/cursor/image_cursors.cc b/chromium/ui/base/cursor/image_cursors.cc
index 4612bedb350..42fd3249684 100644
--- a/chromium/ui/base/cursor/image_cursors.cc
+++ b/chromium/ui/base/cursor/image_cursors.cc
@@ -4,25 +4,17 @@
#include "ui/base/cursor/image_cursors.h"
-#include <float.h>
-#include <stddef.h>
-
#include "base/check.h"
-#include "base/notreached.h"
-#include "base/stl_util.h"
-#include "base/strings/string16.h"
-#include "ui/base/cursor/cursor.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/display/display.h"
#include "ui/gfx/geometry/point.h"
namespace ui {
namespace {
-const mojom::CursorType kImageCursorIds[] = {
+constexpr mojom::CursorType kImageCursorIds[] = {
mojom::CursorType::kNull,
mojom::CursorType::kPointer,
mojom::CursorType::kNoDrop,
@@ -57,49 +49,30 @@ const mojom::CursorType kImageCursorIds[] = {
mojom::CursorType::kGrabbing,
};
-const mojom::CursorType kAnimatedCursorIds[] = {mojom::CursorType::kWait,
- mojom::CursorType::kProgress};
+constexpr mojom::CursorType kAnimatedCursorIds[] = {
+ mojom::CursorType::kWait, mojom::CursorType::kProgress};
} // namespace
-ImageCursors::ImageCursors() : cursor_size_(CursorSize::kNormal) {}
+ImageCursors::ImageCursors()
+ : cursor_loader_(CursorLoader::Create()),
+ cursor_size_(CursorSize::kNormal) {}
-ImageCursors::~ImageCursors() {
-}
-
-void ImageCursors::Initialize() {
- if (!cursor_loader_)
- cursor_loader_.reset(CursorLoader::Create());
-}
+ImageCursors::~ImageCursors() = default;
float ImageCursors::GetScale() const {
- if (!cursor_loader_) {
- NOTREACHED();
- // Returning default on release build as it's not serious enough to crash
- // even if this ever happens.
- return 1.0f;
- }
return cursor_loader_->scale();
}
display::Display::Rotation ImageCursors::GetRotation() const {
- if (!cursor_loader_) {
- NOTREACHED();
- // Returning default on release build as it's not serious enough to crash
- // even if this ever happens.
- return display::Display::ROTATE_0;
- }
return cursor_loader_->rotation();
}
bool ImageCursors::SetDisplay(const display::Display& display,
float scale_factor) {
- if (!cursor_loader_) {
- cursor_loader_.reset(CursorLoader::Create());
- } else if (cursor_loader_->rotation() == display.panel_rotation() &&
- cursor_loader_->scale() == 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);
@@ -112,25 +85,21 @@ void ImageCursors::ReloadCursors() {
cursor_loader_->UnloadAll();
- for (size_t i = 0; i < base::size(kImageCursorIds); ++i) {
+ for (auto cursor_id : kImageCursorIds) {
int resource_id = -1;
gfx::Point hot_point;
- bool success =
- GetCursorDataFor(cursor_size_, kImageCursorIds[i], device_scale_factor,
- &resource_id, &hot_point);
+ bool success = GetCursorDataFor(
+ cursor_size_, cursor_id, device_scale_factor, &resource_id, &hot_point);
DCHECK(success);
- cursor_loader_->LoadImageCursor(kImageCursorIds[i], resource_id, hot_point);
+ cursor_loader_->LoadImageCursor(cursor_id, resource_id, hot_point);
}
- for (size_t i = 0; i < base::size(kAnimatedCursorIds); ++i) {
+ for (auto cursor_id : kAnimatedCursorIds) {
int resource_id = -1;
gfx::Point hot_point;
- bool success =
- GetAnimatedCursorDataFor(cursor_size_, kAnimatedCursorIds[i],
- device_scale_factor, &resource_id, &hot_point);
+ bool success = GetAnimatedCursorDataFor(
+ cursor_size_, cursor_id, device_scale_factor, &resource_id, &hot_point);
DCHECK(success);
- cursor_loader_->LoadAnimatedCursor(kAnimatedCursorIds[i],
- resource_id,
- hot_point,
+ cursor_loader_->LoadAnimatedCursor(cursor_id, resource_id, hot_point,
kAnimatedCursorFrameDelayMs);
}
}
@@ -141,16 +110,11 @@ void ImageCursors::SetCursorSize(CursorSize cursor_size) {
cursor_size_ = cursor_size;
- if (cursor_loader_.get())
- ReloadCursors();
+ ReloadCursors();
}
void ImageCursors::SetPlatformCursor(gfx::NativeCursor* cursor) {
cursor_loader_->SetPlatformCursor(cursor);
}
-base::WeakPtr<ImageCursors> ImageCursors::GetWeakPtr() {
- return weak_ptr_factory_.GetWeakPtr();
-}
-
} // namespace ui
diff --git a/chromium/ui/base/cursor/image_cursors.h b/chromium/ui/base/cursor/image_cursors.h
index 0855bfff15e..b5b5ec274dd 100644
--- a/chromium/ui/base/cursor/image_cursors.h
+++ b/chromium/ui/base/cursor/image_cursors.h
@@ -7,12 +7,8 @@
#include <memory>
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/strings/string16.h"
-#include "ui/base/cursor/cursor.h"
+#include "base/component_export.h"
#include "ui/base/cursor/cursor_size.h"
-#include "ui/base/ui_base_export.h"
#include "ui/display/display.h"
#include "ui/gfx/native_widget_types.h"
@@ -22,19 +18,13 @@ class CursorLoader;
// A utility class that provides cursors for NativeCursors for which we have
// image resources.
-class UI_BASE_EXPORT ImageCursors {
+class COMPONENT_EXPORT(UI_BASE_CURSOR) ImageCursors {
public:
ImageCursors();
+ ImageCursors(const ImageCursors&) = delete;
+ ImageCursors& operator=(const ImageCursors&) = delete;
~ImageCursors();
- // Creates the |cursor_loader_|. This is optional as |cursor_loader_| is
- // lazily created if Initialize() isn't explictly called.
- // However note that it matters which thread is used to create
- // |cursor_loader_| (see CursorLoaderOzone, crbug.com/741106). Thus explicit
- // call to Initialize may be useful to ensure initialization happens on the
- // right thread.
- void Initialize();
-
// Returns the scale and rotation of the currently loaded cursor.
float GetScale() const;
display::Display::Rotation GetRotation() const;
@@ -49,17 +39,12 @@ class UI_BASE_EXPORT ImageCursors {
// Sets the platform cursor based on the native type of |cursor|.
void SetPlatformCursor(gfx::NativeCursor* cursor);
- base::WeakPtr<ImageCursors> GetWeakPtr();
-
private:
// Reloads the all loaded cursors in the cursor loader.
void ReloadCursors();
std::unique_ptr<CursorLoader> cursor_loader_;
CursorSize cursor_size_;
- base::WeakPtrFactory<ImageCursors> weak_ptr_factory_{this};
-
- DISALLOW_COPY_AND_ASSIGN(ImageCursors);
};
} // namespace ui
diff --git a/chromium/ui/base/cursor/mojom/BUILD.gn b/chromium/ui/base/cursor/mojom/BUILD.gn
index 042d2160861..588e828c29d 100644
--- a/chromium/ui/base/cursor/mojom/BUILD.gn
+++ b/chromium/ui/base/cursor/mojom/BUILD.gn
@@ -33,7 +33,7 @@ source_set("mojom_traits") {
]
public_deps = [
":mojom_shared",
- "//ui/base/cursor",
+ "//ui/base/cursor:cursor_base",
]
deps = [
"//skia",
@@ -56,7 +56,7 @@ source_set("unittests") {
":mojom_traits",
"//testing/gtest",
"//ui/base",
- "//ui/base/cursor",
+ "//ui/base/cursor:cursor_base",
"//ui/gfx:geometry_skia",
"//ui/gfx/geometry/mojom:mojom_traits",
]
diff --git a/chromium/ui/base/cursor/mojom/cursor_mojom_traits_unittest.cc b/chromium/ui/base/cursor/mojom/cursor_mojom_traits_unittest.cc
index d3b1aee2f12..88f888b2709 100644
--- a/chromium/ui/base/cursor/mojom/cursor_mojom_traits_unittest.cc
+++ b/chromium/ui/base/cursor/mojom/cursor_mojom_traits_unittest.cc
@@ -7,7 +7,6 @@
#include "skia/public/mojom/bitmap_skbitmap_mojom_traits.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/cursor/cursor.h"
-#include "ui/base/cursor/cursor_lookup.h"
#include "ui/base/cursor/mojom/cursor.mojom.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
#include "ui/gfx/geometry/mojom/geometry_mojom_traits.h"
@@ -59,18 +58,18 @@ TEST_F(CursorStructTraitsTest, TestBitmapCursor) {
EXPECT_EQ(ui::mojom::CursorType::kCustom, output.type());
EXPECT_EQ(kScale, output.image_scale_factor());
- EXPECT_EQ(kHotspot, GetCursorHotspot(output));
+ EXPECT_EQ(kHotspot, output.custom_hotspot());
// Even though the pixel data is the same, the bitmap generation ids differ.
EXPECT_TRUE(
- gfx::BitmapsAreEqual(GetCursorBitmap(input), GetCursorBitmap(output)));
- EXPECT_NE(GetCursorBitmap(input).getGenerationID(),
- GetCursorBitmap(output).getGenerationID());
+ gfx::BitmapsAreEqual(input.custom_bitmap(), output.custom_bitmap()));
+ EXPECT_NE(input.custom_bitmap().getGenerationID(),
+ output.custom_bitmap().getGenerationID());
// Make a copy of output; the bitmap generation ids should be the same.
ui::Cursor copy = output;
- EXPECT_EQ(GetCursorBitmap(output).getGenerationID(),
- GetCursorBitmap(copy).getGenerationID());
+ EXPECT_EQ(output.custom_bitmap().getGenerationID(),
+ copy.custom_bitmap().getGenerationID());
EXPECT_EQ(input, output);
}
@@ -88,7 +87,7 @@ TEST_F(CursorStructTraitsTest, TestEmptyCursor) {
ui::Cursor output;
ASSERT_TRUE(EchoCursor(input, &output));
- EXPECT_TRUE(GetCursorBitmap(output).empty());
+ EXPECT_TRUE(output.custom_bitmap().empty());
}
// Test that various device scale factors are passed correctly over the wire.
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 44037bc6142..e86f70ea603 100644
--- a/chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc
+++ b/chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc
@@ -7,10 +7,6 @@
#include <algorithm>
#include "base/check_op.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/base/cursor/cursor_lookup.h"
-#include "ui/base/cursor/cursors_aura.h"
-#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
namespace ui {
@@ -24,20 +20,6 @@ PlatformCursor ToPlatformCursor(BitmapCursorOzone* cursor) {
return static_cast<PlatformCursor>(cursor);
}
-scoped_refptr<BitmapCursorOzone> CreateDefaultBitmapCursor(
- mojom::CursorType type) {
- Cursor cursor(type);
- // Ozone must honor the lowest possible scale value, which is 1.0f. Otherwise,
- // it can happen that cursor chooses wrong hotspots if max scaling value is
- // set to 200p, for example.
- cursor.set_image_scale_factor(1.0f);
- SkBitmap bitmap = GetCursorBitmap(cursor);
- gfx::Point hotspot = GetCursorHotspot(cursor);
- if (!bitmap.isNull())
- return new BitmapCursorOzone(bitmap, hotspot);
- return nullptr;
-}
-
} // namespace
BitmapCursorOzone::BitmapCursorOzone(const SkBitmap& bitmap,
@@ -89,15 +71,16 @@ scoped_refptr<BitmapCursorOzone> BitmapCursorFactoryOzone::GetBitmapCursor(
return base::WrapRefCounted(ToBitmapCursorOzone(platform_cursor));
}
-PlatformCursor BitmapCursorFactoryOzone::GetDefaultCursor(
+base::Optional<PlatformCursor> BitmapCursorFactoryOzone::GetDefaultCursor(
mojom::CursorType type) {
- return GetDefaultCursorInternal(type).get();
+ if (type == mojom::CursorType::kNone)
+ return nullptr; // nullptr is used for the hidden cursor.
+ return base::nullopt;
}
PlatformCursor BitmapCursorFactoryOzone::CreateImageCursor(
const SkBitmap& bitmap,
- const gfx::Point& hotspot,
- float bitmap_dpi) {
+ const gfx::Point& hotspot) {
BitmapCursorOzone* cursor = new BitmapCursorOzone(bitmap, hotspot);
cursor->AddRef(); // Balanced by UnrefImageCursor.
return ToPlatformCursor(cursor);
@@ -106,8 +89,7 @@ PlatformCursor BitmapCursorFactoryOzone::CreateImageCursor(
PlatformCursor BitmapCursorFactoryOzone::CreateAnimatedCursor(
const std::vector<SkBitmap>& bitmaps,
const gfx::Point& hotspot,
- int frame_delay_ms,
- float bitmap_dpi) {
+ int frame_delay_ms) {
DCHECK_LT(0U, bitmaps.size());
BitmapCursorOzone* cursor =
new BitmapCursorOzone(bitmaps, hotspot, frame_delay_ms);
@@ -123,23 +105,4 @@ void BitmapCursorFactoryOzone::UnrefImageCursor(PlatformCursor cursor) {
ToBitmapCursorOzone(cursor)->Release();
}
-scoped_refptr<BitmapCursorOzone>
-BitmapCursorFactoryOzone::GetDefaultCursorInternal(mojom::CursorType type) {
- if (type == mojom::CursorType::kNone)
- return nullptr; // Null is used for hidden cursor.
-
- if (!default_cursors_.count(type)) {
- // Create new image cursor from default aura bitmap for this type. We hold a
- // ref forever because clients do not do refcounting for default cursors.
- scoped_refptr<BitmapCursorOzone> cursor = CreateDefaultBitmapCursor(type);
- if (!cursor.get() && type != mojom::CursorType::kPointer)
- cursor = GetDefaultCursorInternal(mojom::CursorType::kPointer);
- DCHECK(cursor.get()) << "Failed to load default cursor bitmap";
- default_cursors_[type] = cursor;
- }
-
- // Returned owned default cursor for this type.
- return default_cursors_[type];
-}
-
} // namespace ui
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 95ed10b051b..b489e099ad0 100644
--- a/chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h
+++ b/chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h
@@ -5,21 +5,20 @@
#ifndef UI_BASE_CURSOR_OZONE_BITMAP_CURSOR_FACTORY_OZONE_H_
#define UI_BASE_CURSOR_OZONE_BITMAP_CURSOR_FACTORY_OZONE_H_
-#include <map>
+#include <vector>
+#include "base/component_export.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/cursor/cursor.h"
-#include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
-#include "ui/base/ui_base_export.h"
+#include "ui/base/cursor/cursor_factory.h"
#include "ui/gfx/geometry/point.h"
-#include "ui/ozone/public/cursor_factory_ozone.h"
namespace ui {
// A cursor that is an SkBitmap combined with a gfx::Point hotspot.
-class UI_BASE_EXPORT BitmapCursorOzone
+class COMPONENT_EXPORT(UI_BASE_CURSOR) BitmapCursorOzone
: public base::RefCounted<BitmapCursorOzone> {
public:
BitmapCursorOzone(const SkBitmap& bitmap, const gfx::Point& hotspot);
@@ -45,14 +44,15 @@ class UI_BASE_EXPORT BitmapCursorOzone
DISALLOW_COPY_AND_ASSIGN(BitmapCursorOzone);
};
-// CursorFactoryOzone implementation for bitmapped cursors.
+// CursorFactory implementation for bitmapped cursors.
//
// This is a base class for platforms where PlatformCursor is an SkBitmap
// combined with a gfx::Point for the hotspot.
//
// Subclasses need only implement SetBitmapCursor() as everything else is
// implemented here.
-class UI_BASE_EXPORT BitmapCursorFactoryOzone : public CursorFactoryOzone {
+class COMPONENT_EXPORT(UI_BASE_CURSOR) BitmapCursorFactoryOzone
+ : public CursorFactory {
public:
BitmapCursorFactoryOzone();
~BitmapCursorFactoryOzone() override;
@@ -62,26 +62,17 @@ class UI_BASE_EXPORT BitmapCursorFactoryOzone : public CursorFactoryOzone {
PlatformCursor platform_cursor);
// CursorFactoryOzone:
- PlatformCursor GetDefaultCursor(mojom::CursorType type) override;
+ base::Optional<PlatformCursor> GetDefaultCursor(
+ mojom::CursorType type) override;
PlatformCursor CreateImageCursor(const SkBitmap& bitmap,
- const gfx::Point& hotspot,
- float bitmap_dpi) override;
+ const gfx::Point& hotspot) override;
PlatformCursor CreateAnimatedCursor(const std::vector<SkBitmap>& bitmaps,
const gfx::Point& hotspot,
- int frame_delay_ms,
- float bitmap_dpi) override;
+ int frame_delay_ms) override;
void RefImageCursor(PlatformCursor cursor) override;
void UnrefImageCursor(PlatformCursor cursor) override;
private:
- // Get cached BitmapCursorOzone for a default cursor.
- scoped_refptr<BitmapCursorOzone> GetDefaultCursorInternal(
- mojom::CursorType type);
-
- // Default cursors are cached & owned by the factory.
- std::map<mojom::CursorType, scoped_refptr<BitmapCursorOzone>>
- default_cursors_;
-
DISALLOW_COPY_AND_ASSIGN(BitmapCursorFactoryOzone);
};
diff --git a/chromium/ui/base/device_form_factor.h b/chromium/ui/base/device_form_factor.h
index f87ceca159f..e7c52c28897 100644
--- a/chromium/ui/base/device_form_factor.h
+++ b/chromium/ui/base/device_form_factor.h
@@ -5,7 +5,7 @@
#ifndef UI_BASE_DEVICE_FORM_FACTOR_H_
#define UI_BASE_DEVICE_FORM_FACTOR_H_
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
@@ -17,7 +17,7 @@ enum DeviceFormFactor {
// Returns the form factor of current device. For platforms other than Android
// and iOS, DEVICE_FORM_FACTOR_DESKTOP is always returned.
-UI_BASE_EXPORT DeviceFormFactor GetDeviceFormFactor();
+COMPONENT_EXPORT(UI_BASE) DeviceFormFactor GetDeviceFormFactor();
} // namespace ui
diff --git a/chromium/ui/base/dragdrop/cocoa_dnd_util.h b/chromium/ui/base/dragdrop/cocoa_dnd_util.h
index 1945c177293..1daf898b21c 100644
--- a/chromium/ui/base/dragdrop/cocoa_dnd_util.h
+++ b/chromium/ui/base/dragdrop/cocoa_dnd_util.h
@@ -9,8 +9,8 @@
#include <vector>
+#include "base/component_export.h"
#include "base/strings/string16.h"
-#include "ui/base/ui_base_export.h"
class GURL;
@@ -20,24 +20,25 @@ namespace ui {
// any data associated with this type; it's only used to ensure that Chrome
// supports any drag initiated inside of Chrome, whether or not data has been
// associated with it.
-UI_BASE_EXPORT extern NSString* const kChromeDragDummyPboardType;
+COMPONENT_EXPORT(UI_BASE) extern NSString* const kChromeDragDummyPboardType;
// Mail.app and TextEdit accept drags that have both HTML and image flavors on
// them, but don't process them correctly <http://crbug.com/55879>. Therefore,
// if there is an image flavor, don't put the HTML data on as HTML, but rather
// put it on as this Chrome-only flavor. External apps won't see HTML but
// Chrome will know enough to read it as HTML. <http://crbug.com/55879>
-UI_BASE_EXPORT extern NSString* const kChromeDragImageHTMLPboardType;
+COMPONENT_EXPORT(UI_BASE) extern NSString* const kChromeDragImageHTMLPboardType;
// Populates the |url| and |title| with URL data in |pboard|. There may be more
// than one, but we only handle dropping the first. |url| must not be |NULL|;
// |title| is an optional parameter. Returns |YES| if URL data was obtained from
// the pasteboard, |NO| otherwise. If |convert_filenames| is |YES|, the function
// will also attempt to convert filenames in |pboard| to file URLs.
-UI_BASE_EXPORT BOOL PopulateURLAndTitleFromPasteboard(GURL* url,
- base::string16* title,
- NSPasteboard* pboard,
- BOOL convert_filenames);
+COMPONENT_EXPORT(UI_BASE)
+BOOL PopulateURLAndTitleFromPasteboard(GURL* url,
+ base::string16* title,
+ NSPasteboard* pboard,
+ BOOL convert_filenames);
} // namespace ui
diff --git a/chromium/ui/base/dragdrop/drag_drop_types.h b/chromium/ui/base/dragdrop/drag_drop_types.h
index ddb726fe53a..af2fad11112 100644
--- a/chromium/ui/base/dragdrop/drag_drop_types.h
+++ b/chromium/ui/base/dragdrop/drag_drop_types.h
@@ -7,12 +7,12 @@
#include <stdint.h>
+#include "base/component_export.h"
#include "build/build_config.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
-class UI_BASE_EXPORT DragDropTypes {
+class COMPONENT_EXPORT(UI_BASE) DragDropTypes {
public:
enum DragOperation {
DRAG_NONE = 0,
diff --git a/chromium/ui/base/dragdrop/drag_source_win.cc b/chromium/ui/base/dragdrop/drag_source_win.cc
index fe201a8d9c1..c27409139ee 100644
--- a/chromium/ui/base/dragdrop/drag_source_win.cc
+++ b/chromium/ui/base/dragdrop/drag_source_win.cc
@@ -24,7 +24,7 @@ HRESULT DragSourceWin::QueryContinueDrag(BOOL escape_pressed, DWORD key_state) {
return DRAGDROP_S_CANCEL;
}
- if (!(key_state & MK_LBUTTON)) {
+ if (!(key_state & MK_LBUTTON) && !(key_state & MK_RBUTTON)) {
OnDragSourceDrop();
return DRAGDROP_S_DROP;
}
diff --git a/chromium/ui/base/dragdrop/drag_source_win.h b/chromium/ui/base/dragdrop/drag_source_win.h
index 5634d7082c1..466ec9672ad 100644
--- a/chromium/ui/base/dragdrop/drag_source_win.h
+++ b/chromium/ui/base/dragdrop/drag_source_win.h
@@ -8,9 +8,9 @@
#include <objidl.h>
#include <wrl/implements.h>
+#include "base/component_export.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
@@ -26,7 +26,8 @@ class DragSourceWin
IDropSource> {
public:
// Factory method to avoid exporting the class and all it derives from.
- static UI_BASE_EXPORT Microsoft::WRL::ComPtr<DragSourceWin> Create();
+ static COMPONENT_EXPORT(
+ UI_BASE) Microsoft::WRL::ComPtr<DragSourceWin> Create();
// Use Create() to construct these objects. Direct calls to the constructor
// are an error - it is only public because a WRL helper function creates the
diff --git a/chromium/ui/base/dragdrop/drop_target_event.h b/chromium/ui/base/dragdrop/drop_target_event.h
index 47f1b4e09ae..5a8abf1f40c 100644
--- a/chromium/ui/base/dragdrop/drop_target_event.h
+++ b/chromium/ui/base/dragdrop/drop_target_event.h
@@ -5,6 +5,7 @@
#ifndef UI_BASE_DRAGDROP_DROP_TARGET_EVENT_H_
#define UI_BASE_DRAGDROP_DROP_TARGET_EVENT_H_
+#include "base/component_export.h"
#include "base/macros.h"
#include "ui/base/dragdrop/os_exchange_data.h"
#include "ui/events/event.h"
@@ -13,7 +14,7 @@ namespace ui {
// Note: This object must not outlive the OSExchangeData used to construct it,
// as it stores that by reference.
-class UI_BASE_EXPORT DropTargetEvent : public LocatedEvent {
+class COMPONENT_EXPORT(UI_BASE) DropTargetEvent : public LocatedEvent {
public:
DropTargetEvent(const OSExchangeData& data,
const gfx::PointF& location,
diff --git a/chromium/ui/base/dragdrop/drop_target_win.h b/chromium/ui/base/dragdrop/drop_target_win.h
index 6470b34c891..18409b41d36 100644
--- a/chromium/ui/base/dragdrop/drop_target_win.h
+++ b/chromium/ui/base/dragdrop/drop_target_win.h
@@ -7,9 +7,9 @@
#include <objidl.h>
+#include "base/component_export.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
-#include "ui/base/ui_base_export.h"
// Windows interface.
struct IDropTargetHelper;
@@ -25,7 +25,7 @@ namespace ui {
// before the HWND is deleted too.
//
// This class is meant to be used in a STA and is not multithread-safe.
-class UI_BASE_EXPORT DropTargetWin : public IDropTarget {
+class COMPONENT_EXPORT(UI_BASE) DropTargetWin : public IDropTarget {
public:
DropTargetWin();
virtual ~DropTargetWin();
diff --git a/chromium/ui/base/dragdrop/os_exchange_data.cc b/chromium/ui/base/dragdrop/os_exchange_data.cc
index 727deb75a01..f8c4f3e8929 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data.cc
+++ b/chromium/ui/base/dragdrop/os_exchange_data.cc
@@ -99,7 +99,7 @@ bool OSExchangeData::HasAnyFormat(
const std::set<ClipboardFormatType>& format_types) const {
if ((formats & STRING) != 0 && HasString())
return true;
- if ((formats & URL) != 0 && HasURL(CONVERT_FILENAMES))
+ if ((formats & URL) != 0 && HasURL(FilenameToURLPolicy::CONVERT_FILENAMES))
return true;
#if defined(OS_WIN)
if ((formats & FILE_CONTENTS) != 0 && provider_->HasFileContents())
diff --git a/chromium/ui/base/dragdrop/os_exchange_data.h b/chromium/ui/base/dragdrop/os_exchange_data.h
index 58b160be349..bd851a065fc 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data.h
+++ b/chromium/ui/base/dragdrop/os_exchange_data.h
@@ -18,10 +18,10 @@
#endif
#include "base/callback_forward.h"
+#include "base/component_export.h"
#include "base/files/file_path.h"
#include "base/macros.h"
#include "ui/base/dragdrop/os_exchange_data_provider.h"
-#include "ui/base/ui_base_export.h"
class GURL;
@@ -48,7 +48,7 @@ struct FileInfo;
// TabContentsViewGtk uses a different class to handle drag support that does
// not use OSExchangeData. As such, file contents and html support is only
// compiled on windows.
-class UI_BASE_EXPORT OSExchangeData {
+class COMPONENT_EXPORT(UI_BASE) OSExchangeData {
public:
// Enumeration of the known formats.
enum Format {
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider.h b/chromium/ui/base/dragdrop/os_exchange_data_provider.h
index 2e45ee878fb..b945ec9180f 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider.h
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider.h
@@ -33,8 +33,7 @@ namespace ui {
// Controls whether or not filenames should be converted to file: URLs when
// getting a URL.
-// TODO(crbug.com/1070138): convert to enum class.
-enum FilenameToURLPolicy {
+enum class FilenameToURLPolicy {
CONVERT_FILENAMES,
DO_NOT_CONVERT_FILENAMES,
};
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider_factory.cc b/chromium/ui/base/dragdrop/os_exchange_data_provider_factory.cc
index 52efa7c8e6a..fcf63aac986 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_factory.cc
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_factory.cc
@@ -13,7 +13,7 @@
#if defined(USE_OZONE)
#include "ui/base/dragdrop/os_exchange_data_provider_factory_ozone.h"
#endif
-#include "ui/base/dragdrop/os_exchange_data_provider_aura.h"
+#include "ui/base/dragdrop/os_exchange_data_provider_non_backed.h"
#elif defined(OS_MACOSX)
#include "ui/base/dragdrop/os_exchange_data_provider_builder_mac.h"
#elif defined(OS_WIN)
@@ -39,7 +39,7 @@ OSExchangeDataProviderFactory::CreateProvider() {
return provider;
}
#endif
- return std::make_unique<OSExchangeDataProviderAura>();
+ return std::make_unique<OSExchangeDataProviderNonBacked>();
#elif defined(OS_MACOSX)
return BuildOSExchangeDataProviderMac();
#elif defined(OS_WIN)
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider_factory.h b/chromium/ui/base/dragdrop/os_exchange_data_provider_factory.h
index b3fbd31a564..72ac48751a5 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_factory.h
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_factory.h
@@ -7,13 +7,13 @@
#include <memory>
+#include "base/component_export.h"
#include "ui/base/dragdrop/os_exchange_data_provider.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
// Builds platform specific OSExchangeDataProviders.
-class UI_BASE_EXPORT OSExchangeDataProviderFactory {
+class COMPONENT_EXPORT(UI_BASE) OSExchangeDataProviderFactory {
public:
// Creates a Provider based on the current platform.
static std::unique_ptr<OSExchangeDataProvider> CreateProvider();
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 11465f8cc86..8fb6a3ad5c6 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_mac.h
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_mac.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/component_export.h"
#include "base/mac/scoped_nsobject.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
@@ -25,7 +26,8 @@
namespace ui {
// OSExchangeDataProvider implementation for Mac.
-class UI_BASE_EXPORT OSExchangeDataProviderMac : public OSExchangeDataProvider {
+class COMPONENT_EXPORT(UI_BASE) OSExchangeDataProviderMac
+ : public OSExchangeDataProvider {
public:
~OSExchangeDataProviderMac() override;
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 4c7cbf41185..b7f144452f3 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_mac.mm
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_mac.mm
@@ -193,7 +193,8 @@ bool OSExchangeDataProviderMac::GetString(base::string16* data) const {
// There was no NSString, check for an NSURL.
GURL url;
base::string16 title;
- bool result = GetURLAndTitle(DO_NOT_CONVERT_FILENAMES, &url, &title);
+ bool result = GetURLAndTitle(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES,
+ &url, &title);
if (result)
*data = base::UTF8ToUTF16(url.spec());
@@ -218,7 +219,8 @@ bool OSExchangeDataProviderMac::GetURLAndTitle(FilenameToURLPolicy policy,
// the trailing slashes off of paths and always returns the last path element
// as the title whereas no path conversion nor title is wanted.
base::FilePath path;
- if (policy != DO_NOT_CONVERT_FILENAMES && GetFilename(&path)) {
+ if (policy != FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES &&
+ GetFilename(&path)) {
NSURL* fileUrl =
[NSURL fileURLWithPath:base::SysUTF8ToNSString(path.value())];
*url =
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider_aura.cc b/chromium/ui/base/dragdrop/os_exchange_data_provider_non_backed.cc
index 7131bc01992..a4964922b00 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_aura.cc
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_non_backed.cc
@@ -2,49 +2,53 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/base/dragdrop/os_exchange_data_provider_aura.h"
+#include "ui/base/dragdrop/os_exchange_data_provider_non_backed.h"
+
+#include <memory>
#include "base/check.h"
-#include "base/memory/ptr_util.h"
+#include "base/files/file_path.h"
+#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "net/base/filename_util.h"
#include "ui/base/clipboard/clipboard_format_type.h"
#include "ui/base/dragdrop/file_info/file_info.h"
+#include "ui/base/dragdrop/os_exchange_data.h"
+#include "url/gurl.h"
namespace ui {
-OSExchangeDataProviderAura::OSExchangeDataProviderAura()
- : formats_(0) {
-}
+OSExchangeDataProviderNonBacked::OSExchangeDataProviderNonBacked() = default;
-OSExchangeDataProviderAura::~OSExchangeDataProviderAura() = default;
+OSExchangeDataProviderNonBacked::~OSExchangeDataProviderNonBacked() = default;
-std::unique_ptr<OSExchangeDataProvider> OSExchangeDataProviderAura::Clone()
+std::unique_ptr<OSExchangeDataProvider> OSExchangeDataProviderNonBacked::Clone()
const {
- OSExchangeDataProviderAura* ret = new OSExchangeDataProviderAura();
- ret->formats_ = formats_;
- ret->string_ = string_;
- ret->url_ = url_;
- ret->title_ = title_;
- ret->filenames_ = filenames_;
- ret->pickle_data_ = pickle_data_;
+ auto clone = std::make_unique<OSExchangeDataProviderNonBacked>();
+
+ clone->formats_ = formats_;
+ clone->string_ = string_;
+ clone->url_ = url_;
+ clone->title_ = title_;
+ clone->filenames_ = filenames_;
+ clone->pickle_data_ = pickle_data_;
// We skip copying the drag images.
- ret->html_ = html_;
- ret->base_url_ = base_url_;
+ clone->html_ = html_;
+ clone->base_url_ = base_url_;
- return base::WrapUnique<OSExchangeDataProvider>(ret);
+ return clone;
}
-void OSExchangeDataProviderAura::MarkOriginatedFromRenderer() {
+void OSExchangeDataProviderNonBacked::MarkOriginatedFromRenderer() {
// TODO(dcheng): Currently unneeded because ChromeOS Aura correctly separates
// URL and filename metadata, and does not implement the DownloadURL protocol.
}
-bool OSExchangeDataProviderAura::DidOriginateFromRenderer() const {
+bool OSExchangeDataProviderNonBacked::DidOriginateFromRenderer() const {
return false;
}
-void OSExchangeDataProviderAura::SetString(const base::string16& data) {
+void OSExchangeDataProviderNonBacked::SetString(const base::string16& data) {
if (HasString())
return;
@@ -52,8 +56,8 @@ void OSExchangeDataProviderAura::SetString(const base::string16& data) {
formats_ |= OSExchangeData::STRING;
}
-void OSExchangeDataProviderAura::SetURL(const GURL& url,
- const base::string16& title) {
+void OSExchangeDataProviderNonBacked::SetURL(const GURL& url,
+ const base::string16& title) {
url_ = url;
title_ = title;
formats_ |= OSExchangeData::URL;
@@ -61,39 +65,41 @@ void OSExchangeDataProviderAura::SetURL(const GURL& url,
SetString(base::UTF8ToUTF16(url.spec()));
}
-void OSExchangeDataProviderAura::SetFilename(const base::FilePath& path) {
+void OSExchangeDataProviderNonBacked::SetFilename(const base::FilePath& path) {
filenames_.clear();
filenames_.push_back(FileInfo(path, base::FilePath()));
formats_ |= OSExchangeData::FILE_NAME;
}
-void OSExchangeDataProviderAura::SetFilenames(
+void OSExchangeDataProviderNonBacked::SetFilenames(
const std::vector<FileInfo>& filenames) {
filenames_ = filenames;
formats_ |= OSExchangeData::FILE_NAME;
}
-void OSExchangeDataProviderAura::SetPickledData(
+void OSExchangeDataProviderNonBacked::SetPickledData(
const ClipboardFormatType& format,
const base::Pickle& data) {
pickle_data_[format] = data;
formats_ |= OSExchangeData::PICKLED_DATA;
}
-bool OSExchangeDataProviderAura::GetString(base::string16* data) const {
+bool OSExchangeDataProviderNonBacked::GetString(base::string16* data) const {
if ((formats_ & OSExchangeData::STRING) == 0)
return false;
*data = string_;
return true;
}
-bool OSExchangeDataProviderAura::GetURLAndTitle(FilenameToURLPolicy policy,
- GURL* url,
- base::string16* title) const {
+bool OSExchangeDataProviderNonBacked::GetURLAndTitle(
+ FilenameToURLPolicy policy,
+ GURL* url,
+ base::string16* title) const {
if ((formats_ & OSExchangeData::URL) == 0) {
title->clear();
return GetPlainTextURL(url) ||
- (policy == CONVERT_FILENAMES && GetFileURL(url));
+ (policy == FilenameToURLPolicy::CONVERT_FILENAMES &&
+ GetFileURL(url));
}
if (!url_.is_valid())
@@ -104,7 +110,7 @@ bool OSExchangeDataProviderAura::GetURLAndTitle(FilenameToURLPolicy policy,
return true;
}
-bool OSExchangeDataProviderAura::GetFilename(base::FilePath* path) const {
+bool OSExchangeDataProviderNonBacked::GetFilename(base::FilePath* path) const {
if ((formats_ & OSExchangeData::FILE_NAME) == 0)
return false;
DCHECK(!filenames_.empty());
@@ -112,7 +118,7 @@ bool OSExchangeDataProviderAura::GetFilename(base::FilePath* path) const {
return true;
}
-bool OSExchangeDataProviderAura::GetFilenames(
+bool OSExchangeDataProviderNonBacked::GetFilenames(
std::vector<FileInfo>* filenames) const {
if ((formats_ & OSExchangeData::FILE_NAME) == 0)
return false;
@@ -120,10 +126,10 @@ bool OSExchangeDataProviderAura::GetFilenames(
return true;
}
-bool OSExchangeDataProviderAura::GetPickledData(
+bool OSExchangeDataProviderNonBacked::GetPickledData(
const ClipboardFormatType& format,
base::Pickle* data) const {
- PickleData::const_iterator i = pickle_data_.find(format);
+ const auto i = pickle_data_.find(format);
if (i == pickle_data_.end())
return false;
@@ -131,37 +137,38 @@ bool OSExchangeDataProviderAura::GetPickledData(
return true;
}
-bool OSExchangeDataProviderAura::HasString() const {
+bool OSExchangeDataProviderNonBacked::HasString() const {
return (formats_ & OSExchangeData::STRING) != 0;
}
-bool OSExchangeDataProviderAura::HasURL(FilenameToURLPolicy policy) const {
+bool OSExchangeDataProviderNonBacked::HasURL(FilenameToURLPolicy policy) const {
if ((formats_ & OSExchangeData::URL) != 0) {
return true;
}
// No URL, see if we have plain text that can be parsed as a URL.
- return GetPlainTextURL(NULL) ||
- (policy == CONVERT_FILENAMES && GetFileURL(nullptr));
+ return GetPlainTextURL(nullptr) ||
+ (policy == FilenameToURLPolicy::CONVERT_FILENAMES &&
+ GetFileURL(nullptr));
}
-bool OSExchangeDataProviderAura::HasFile() const {
+bool OSExchangeDataProviderNonBacked::HasFile() const {
return (formats_ & OSExchangeData::FILE_NAME) != 0;
}
-bool OSExchangeDataProviderAura::HasCustomFormat(
+bool OSExchangeDataProviderNonBacked::HasCustomFormat(
const ClipboardFormatType& format) const {
return base::Contains(pickle_data_, format);
}
-void OSExchangeDataProviderAura::SetHtml(const base::string16& html,
- const GURL& base_url) {
+void OSExchangeDataProviderNonBacked::SetHtml(const base::string16& html,
+ const GURL& base_url) {
formats_ |= OSExchangeData::HTML;
html_ = html;
base_url_ = base_url;
}
-bool OSExchangeDataProviderAura::GetHtml(base::string16* html,
- GURL* base_url) const {
+bool OSExchangeDataProviderNonBacked::GetHtml(base::string16* html,
+ GURL* base_url) const {
if ((formats_ & OSExchangeData::HTML) == 0)
return false;
*html = html_;
@@ -169,26 +176,26 @@ bool OSExchangeDataProviderAura::GetHtml(base::string16* html,
return true;
}
-bool OSExchangeDataProviderAura::HasHtml() const {
+bool OSExchangeDataProviderNonBacked::HasHtml() const {
return ((formats_ & OSExchangeData::HTML) != 0);
}
-void OSExchangeDataProviderAura::SetDragImage(
+void OSExchangeDataProviderNonBacked::SetDragImage(
const gfx::ImageSkia& image,
const gfx::Vector2d& cursor_offset) {
drag_image_ = image;
drag_image_offset_ = cursor_offset;
}
-gfx::ImageSkia OSExchangeDataProviderAura::GetDragImage() const {
+gfx::ImageSkia OSExchangeDataProviderNonBacked::GetDragImage() const {
return drag_image_;
}
-gfx::Vector2d OSExchangeDataProviderAura::GetDragImageOffset() const {
+gfx::Vector2d OSExchangeDataProviderNonBacked::GetDragImageOffset() const {
return drag_image_offset_;
}
-bool OSExchangeDataProviderAura::GetFileURL(GURL* url) const {
+bool OSExchangeDataProviderNonBacked::GetFileURL(GURL* url) const {
base::FilePath file_path;
if (!GetFilename(&file_path))
return false;
@@ -202,7 +209,7 @@ bool OSExchangeDataProviderAura::GetFileURL(GURL* url) const {
return true;
}
-bool OSExchangeDataProviderAura::GetPlainTextURL(GURL* url) const {
+bool OSExchangeDataProviderNonBacked::GetPlainTextURL(GURL* url) const {
if ((formats_ & OSExchangeData::STRING) == 0)
return false;
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider_aura.h b/chromium/ui/base/dragdrop/os_exchange_data_provider_non_backed.h
index c535f08666a..6a15a8df69d 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_aura.h
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_non_backed.h
@@ -2,29 +2,39 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_AURA_H_
-#define UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_AURA_H_
+#ifndef UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_NON_BACKED_H_
+#define UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_NON_BACKED_H_
#include <map>
-#include "base/files/file_path.h"
-#include "base/macros.h"
+#include "base/component_export.h"
#include "base/pickle.h"
-#include "ui/base/dragdrop/os_exchange_data.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"
#include "ui/gfx/image/image_skia.h"
#include "url/gurl.h"
+namespace base {
+class FilePath;
+} // namespace base
+
namespace ui {
class ClipboardFormatType;
-// OSExchangeDataProvider implementation for aura on linux.
-class UI_BASE_EXPORT OSExchangeDataProviderAura
+// Simple OSExchangeDataProvider implementation for aura-based ports with no
+// actual platform integration. So data managed by this class is exchangeable
+// only among Chromium windows and is available only while it is alive.
+class COMPONENT_EXPORT(UI_BASE) OSExchangeDataProviderNonBacked
: public OSExchangeDataProvider {
public:
- OSExchangeDataProviderAura();
- ~OSExchangeDataProviderAura() override;
+ OSExchangeDataProviderNonBacked();
+ OSExchangeDataProviderNonBacked(const OSExchangeDataProviderNonBacked&) =
+ delete;
+ OSExchangeDataProviderNonBacked& operator=(
+ const OSExchangeDataProviderNonBacked&) = delete;
+ ~OSExchangeDataProviderNonBacked() override;
// Overridden from OSExchangeDataProvider:
std::unique_ptr<OSExchangeDataProvider> Clone() const override;
@@ -58,8 +68,6 @@ class UI_BASE_EXPORT OSExchangeDataProviderAura
gfx::Vector2d GetDragImageOffset() const override;
private:
- typedef std::map<ClipboardFormatType, base::Pickle> PickleData;
-
// Returns true if |formats_| contains a file format and the file name can be
// parsed as a URL.
bool GetFileURL(GURL* url) const;
@@ -68,9 +76,9 @@ class UI_BASE_EXPORT OSExchangeDataProviderAura
// parsed as a URL.
bool GetPlainTextURL(GURL* url) const;
- // Actual formats that have been set. See comment above |known_formats_|
+ // Actual formats that have been set.
// for details.
- int formats_;
+ int formats_ = 0;
// String contents.
base::string16 string_;
@@ -83,7 +91,7 @@ class UI_BASE_EXPORT OSExchangeDataProviderAura
std::vector<FileInfo> filenames_;
// PICKLED_DATA contents.
- PickleData pickle_data_;
+ std::map<ClipboardFormatType, base::Pickle> pickle_data_;
// Drag image and offset data.
gfx::ImageSkia drag_image_;
@@ -92,10 +100,8 @@ class UI_BASE_EXPORT OSExchangeDataProviderAura
// For HTML format
base::string16 html_;
GURL base_url_;
-
- DISALLOW_COPY_AND_ASSIGN(OSExchangeDataProviderAura);
};
} // namespace ui
-#endif // UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_AURA_H_
+#endif // UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_NON_BACKED_H_
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 9be3da2f9de..b51a0161fdf 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc
@@ -542,9 +542,9 @@ bool OSExchangeDataProviderWin::GetURLAndTitle(FilenameToURLPolicy policy,
GURL* url,
base::string16* title) const {
base::string16 url_str;
- bool success =
- ClipboardUtil::GetUrl(source_object_.Get(), url, title,
- policy == CONVERT_FILENAMES ? true : false);
+ bool success = ClipboardUtil::GetUrl(
+ source_object_.Get(), url, title,
+ policy == FilenameToURLPolicy::CONVERT_FILENAMES ? true : false);
if (success) {
DCHECK(url->is_valid());
return true;
@@ -658,7 +658,9 @@ bool OSExchangeDataProviderWin::HasString() const {
bool OSExchangeDataProviderWin::HasURL(FilenameToURLPolicy policy) const {
return (ClipboardUtil::HasUrl(source_object_.Get(),
- policy == CONVERT_FILENAMES ? true : false) ||
+ policy == FilenameToURLPolicy::CONVERT_FILENAMES
+ ? true
+ : false) ||
HasPlainTextURL(source_object_.Get()));
}
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 481e18f4ab2..f160602b2da 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_win.h
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_win.h
@@ -23,10 +23,10 @@
#define IDataObjectAsyncCapability IAsyncOperation
#endif
+#include "base/component_export.h"
#include "base/macros.h"
#include "ui/base/dragdrop/os_exchange_data.h"
#include "ui/base/dragdrop/os_exchange_data_provider.h"
-#include "ui/base/ui_base_export.h"
#include "ui/gfx/geometry/vector2d.h"
#include "ui/gfx/image/image_skia.h"
@@ -115,7 +115,8 @@ class DataObjectImpl : public DownloadFileObserver,
bool async_operation_started_;
};
-class UI_BASE_EXPORT OSExchangeDataProviderWin : public OSExchangeDataProvider {
+class COMPONENT_EXPORT(UI_BASE) OSExchangeDataProviderWin
+ : public OSExchangeDataProvider {
public:
// Returns true if source has plain text that is a valid url.
static bool HasPlainTextURL(IDataObject* source);
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 f336655478b..fdb28d24631 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_x11.cc
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_x11.cc
@@ -11,11 +11,12 @@
#include "ui/base/x/selection_utils.h"
#include "ui/events/platform/platform_event_source.h"
#include "ui/gfx/x/x11_atom_cache.h"
+#include "ui/gfx/x/xproto.h"
namespace ui {
OSExchangeDataProviderX11::OSExchangeDataProviderX11(
- XID x_window,
+ x11::Window x_window,
const SelectionFormatMap& selection)
: XOSExchangeDataProvider(x_window, selection) {}
@@ -69,8 +70,9 @@ void OSExchangeDataProviderX11::SetFileContents(
base::RefCountedString::TakeString(&file_contents_copy)));
}
-bool OSExchangeDataProviderX11::DispatchXEvent(XEvent* xev) {
- if (xev->type == SelectionRequest && xev->xany.window == x_window()) {
+bool OSExchangeDataProviderX11::DispatchXEvent(x11::Event* xev) {
+ auto* selection = xev->As<x11::SelectionRequestEvent>();
+ if (selection && selection->owner == x_window()) {
selection_owner().OnSelectionRequest(*xev);
return true;
}
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 980b384c3c5..024152eb474 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_x11.h
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_x11.h
@@ -5,18 +5,22 @@
#ifndef UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_X11_H_
#define UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_X11_H_
+#include "base/component_export.h"
#include "ui/base/x/x11_os_exchange_data_provider.h"
#include "ui/events/platform/x11/x11_event_source.h"
+#include "ui/gfx/x/event.h"
namespace ui {
// OSExchangeDataProvider implementation for x11 linux.
-class UI_BASE_EXPORT OSExchangeDataProviderX11 : public XOSExchangeDataProvider,
- public XEventDispatcher {
+class COMPONENT_EXPORT(UI_BASE) OSExchangeDataProviderX11
+ : public XOSExchangeDataProvider,
+ public XEventDispatcher {
public:
// |x_window| is the window the cursor is over, and |selection| is the set of
// data being offered.
- OSExchangeDataProviderX11(XID x_window, const SelectionFormatMap& selection);
+ OSExchangeDataProviderX11(x11::Window x_window,
+ const SelectionFormatMap& selection);
// Creates a Provider for sending drag information. This creates its own,
// hidden X11 window to own send data.
@@ -34,7 +38,7 @@ class UI_BASE_EXPORT OSExchangeDataProviderX11 : public XOSExchangeDataProvider,
const std::string& file_contents) override;
// XEventDispatcher:
- bool DispatchXEvent(XEvent* xev) override;
+ bool DispatchXEvent(x11::Event* xev) override;
private:
friend class OSExchangeDataProviderX11Test;
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider_x11_unittest.cc b/chromium/ui/base/dragdrop/os_exchange_data_provider_x11_unittest.cc
index 82f9c71aabd..11a7fd89a44 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_x11_unittest.cc
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_x11_unittest.cc
@@ -47,8 +47,8 @@ TEST_F(OSExchangeDataProviderX11Test, MozillaURL) {
{
GURL out_gurl;
base::string16 out_str;
- EXPECT_TRUE(
- provider.GetURLAndTitle(DO_NOT_CONVERT_FILENAMES, &out_gurl, &out_str));
+ EXPECT_TRUE(provider.GetURLAndTitle(
+ FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES, &out_gurl, &out_str));
EXPECT_EQ(base::ASCIIToUTF16(kGoogleTitle), out_str);
EXPECT_EQ(kGoogleURL, out_gurl.spec());
}
@@ -58,8 +58,8 @@ TEST_F(OSExchangeDataProviderX11Test, MozillaURL) {
{
GURL out_gurl;
base::string16 out_str;
- EXPECT_TRUE(
- provider.GetURLAndTitle(DO_NOT_CONVERT_FILENAMES, &out_gurl, &out_str));
+ EXPECT_TRUE(provider.GetURLAndTitle(
+ FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES, &out_gurl, &out_str));
EXPECT_EQ(base::string16(), out_str);
EXPECT_EQ(kGoogleURL, out_gurl.spec());
}
@@ -69,24 +69,24 @@ TEST_F(OSExchangeDataProviderX11Test, FilesArentURLs) {
AddURLList(kFileURL);
EXPECT_TRUE(provider.HasFile());
- EXPECT_TRUE(provider.HasURL(ui::CONVERT_FILENAMES));
- EXPECT_FALSE(provider.HasURL(ui::DO_NOT_CONVERT_FILENAMES));
+ EXPECT_TRUE(provider.HasURL(FilenameToURLPolicy::CONVERT_FILENAMES));
+ EXPECT_FALSE(provider.HasURL(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES));
}
TEST_F(OSExchangeDataProviderX11Test, HTTPURLsArentFiles) {
AddURLList(kGoogleURL);
EXPECT_FALSE(provider.HasFile());
- EXPECT_TRUE(provider.HasURL(ui::CONVERT_FILENAMES));
- EXPECT_TRUE(provider.HasURL(ui::DO_NOT_CONVERT_FILENAMES));
+ EXPECT_TRUE(provider.HasURL(FilenameToURLPolicy::CONVERT_FILENAMES));
+ EXPECT_TRUE(provider.HasURL(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES));
}
TEST_F(OSExchangeDataProviderX11Test, URIListWithBoth) {
AddURLList("file:///home/user/file.txt\nhttp://www.google.com");
EXPECT_TRUE(provider.HasFile());
- EXPECT_TRUE(provider.HasURL(ui::CONVERT_FILENAMES));
- EXPECT_TRUE(provider.HasURL(ui::DO_NOT_CONVERT_FILENAMES));
+ EXPECT_TRUE(provider.HasURL(FilenameToURLPolicy::CONVERT_FILENAMES));
+ EXPECT_TRUE(provider.HasURL(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES));
// We should only receive the file from GetFilenames().
std::vector<FileInfo> filenames;
@@ -97,8 +97,8 @@ TEST_F(OSExchangeDataProviderX11Test, URIListWithBoth) {
// We should only receive the URL here.
GURL out_gurl;
base::string16 out_str;
- EXPECT_TRUE(
- provider.GetURLAndTitle(DO_NOT_CONVERT_FILENAMES, &out_gurl, &out_str));
+ EXPECT_TRUE(provider.GetURLAndTitle(
+ FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES, &out_gurl, &out_str));
EXPECT_EQ(base::string16(), out_str);
EXPECT_EQ(kGoogleURL, out_gurl.spec());
}
@@ -108,7 +108,7 @@ TEST_F(OSExchangeDataProviderX11Test, OnlyStringURLIsUnfiltered) {
provider.SetString(file_url);
EXPECT_TRUE(provider.HasString());
- EXPECT_FALSE(provider.HasURL(ui::DO_NOT_CONVERT_FILENAMES));
+ EXPECT_FALSE(provider.HasURL(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES));
}
TEST_F(OSExchangeDataProviderX11Test, StringAndURIListFilterString) {
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_unittest.cc b/chromium/ui/base/dragdrop/os_exchange_data_unittest.cc
index 3c000b0f0a7..e57cc2eb849 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_unittest.cc
+++ b/chromium/ui/base/dragdrop/os_exchange_data_unittest.cc
@@ -48,7 +48,8 @@ TEST_F(OSExchangeDataTest, StringDataGetAndSet) {
std::string url_spec = "http://www.goats.com/";
GURL url(url_spec);
base::string16 title;
- EXPECT_FALSE(data2.GetURLAndTitle(DO_NOT_CONVERT_FILENAMES, &url, &title));
+ EXPECT_FALSE(data2.GetURLAndTitle(
+ FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES, &url, &title));
// No URLs in |data|, so url should be untouched.
EXPECT_EQ(url_spec, url.spec());
}
@@ -58,9 +59,9 @@ TEST_F(OSExchangeDataTest, TestURLExchangeFormats) {
std::string url_spec = "http://www.google.com/";
GURL url(url_spec);
base::string16 url_title = base::ASCIIToUTF16("www.google.com");
- EXPECT_FALSE(data.HasURL(DO_NOT_CONVERT_FILENAMES));
+ EXPECT_FALSE(data.HasURL(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES));
data.SetURL(url, url_title);
- EXPECT_TRUE(data.HasURL(DO_NOT_CONVERT_FILENAMES));
+ EXPECT_TRUE(data.HasURL(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES));
OSExchangeData data2(
std::unique_ptr<OSExchangeDataProvider>(data.provider().Clone()));
@@ -68,9 +69,10 @@ TEST_F(OSExchangeDataTest, TestURLExchangeFormats) {
// URL spec and title should match
GURL output_url;
base::string16 output_title;
- EXPECT_TRUE(data2.HasURL(DO_NOT_CONVERT_FILENAMES));
- EXPECT_TRUE(data2.GetURLAndTitle(DO_NOT_CONVERT_FILENAMES, &output_url,
- &output_title));
+ EXPECT_TRUE(data2.HasURL(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES));
+ EXPECT_TRUE(
+ data2.GetURLAndTitle(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES,
+ &output_url, &output_title));
EXPECT_EQ(url_spec, output_url.spec());
EXPECT_EQ(url_title, output_title);
base::string16 output_string;
@@ -96,16 +98,16 @@ TEST_F(OSExchangeDataTest, URLAndString) {
GURL output_url;
base::string16 output_title;
- EXPECT_TRUE(data.GetURLAndTitle(DO_NOT_CONVERT_FILENAMES, &output_url,
- &output_title));
+ EXPECT_TRUE(data.GetURLAndTitle(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES,
+ &output_url, &output_title));
EXPECT_EQ(url_spec, output_url.spec());
EXPECT_EQ(url_title, output_title);
}
TEST_F(OSExchangeDataTest, TestFileToURLConversion) {
OSExchangeData data;
- EXPECT_FALSE(data.HasURL(DO_NOT_CONVERT_FILENAMES));
- EXPECT_FALSE(data.HasURL(CONVERT_FILENAMES));
+ EXPECT_FALSE(data.HasURL(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES));
+ EXPECT_FALSE(data.HasURL(FilenameToURLPolicy::CONVERT_FILENAMES));
EXPECT_FALSE(data.HasFile());
base::FilePath current_directory;
@@ -114,21 +116,22 @@ TEST_F(OSExchangeDataTest, TestFileToURLConversion) {
data.SetFilename(current_directory);
{
- EXPECT_FALSE(data.HasURL(DO_NOT_CONVERT_FILENAMES));
+ EXPECT_FALSE(data.HasURL(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES));
GURL actual_url;
base::string16 actual_title;
- EXPECT_FALSE(data.GetURLAndTitle(DO_NOT_CONVERT_FILENAMES, &actual_url,
- &actual_title));
+ EXPECT_FALSE(
+ data.GetURLAndTitle(FilenameToURLPolicy::DO_NOT_CONVERT_FILENAMES,
+ &actual_url, &actual_title));
EXPECT_EQ(GURL(), actual_url);
EXPECT_EQ(base::string16(), actual_title);
}
{
- EXPECT_TRUE(data.HasURL(CONVERT_FILENAMES));
+ EXPECT_TRUE(data.HasURL(FilenameToURLPolicy::CONVERT_FILENAMES));
GURL actual_url;
base::string16 actual_title;
- EXPECT_TRUE(
- data.GetURLAndTitle(CONVERT_FILENAMES, &actual_url, &actual_title));
+ EXPECT_TRUE(data.GetURLAndTitle(FilenameToURLPolicy::CONVERT_FILENAMES,
+ &actual_url, &actual_title));
// Some Mac OS versions return the URL in file://localhost form instead
// of file:///, so we compare the url's path not its absolute string.
EXPECT_EQ(net::FilePathToFileURL(current_directory).path(),
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_win_unittest.cc b/chromium/ui/base/dragdrop/os_exchange_data_win_unittest.cc
index 750fd72ea75..1bc955e3806 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_win_unittest.cc
+++ b/chromium/ui/base/dragdrop/os_exchange_data_win_unittest.cc
@@ -100,10 +100,11 @@ TEST_F(OSExchangeDataWinTest, StringDataWritingViaCOM) {
// Construct a new object with the old object so that we can use our access
// APIs.
OSExchangeData data2(data.provider().Clone());
- EXPECT_TRUE(data2.HasURL(CONVERT_FILENAMES));
+ EXPECT_TRUE(data2.HasURL(FilenameToURLPolicy::CONVERT_FILENAMES));
GURL url_from_data;
std::wstring title;
- EXPECT_TRUE(data2.GetURLAndTitle(CONVERT_FILENAMES, &url_from_data, &title));
+ EXPECT_TRUE(data2.GetURLAndTitle(FilenameToURLPolicy::CONVERT_FILENAMES,
+ &url_from_data, &title));
GURL reference_url(input);
EXPECT_EQ(reference_url.spec(), url_from_data.spec());
}
@@ -147,10 +148,11 @@ TEST_F(OSExchangeDataWinTest, RemoveData) {
// Construct a new object with the old object so that we can use our access
// APIs.
OSExchangeData data2(data.provider().Clone());
- EXPECT_TRUE(data2.HasURL(CONVERT_FILENAMES));
+ EXPECT_TRUE(data2.HasURL(FilenameToURLPolicy::CONVERT_FILENAMES));
GURL url_from_data;
std::wstring title;
- EXPECT_TRUE(data2.GetURLAndTitle(CONVERT_FILENAMES, &url_from_data, &title));
+ EXPECT_TRUE(data2.GetURLAndTitle(FilenameToURLPolicy::CONVERT_FILENAMES,
+ &url_from_data, &title));
EXPECT_EQ(GURL(input2).spec(), url_from_data.spec());
}
@@ -853,10 +855,11 @@ TEST_F(OSExchangeDataWinTest, ProvideURLForPlainTextURL) {
data.SetString(L"http://google.com");
OSExchangeData data2(data.provider().Clone());
- ASSERT_TRUE(data2.HasURL(CONVERT_FILENAMES));
+ ASSERT_TRUE(data2.HasURL(FilenameToURLPolicy::CONVERT_FILENAMES));
GURL read_url;
std::wstring title;
- EXPECT_TRUE(data2.GetURLAndTitle(CONVERT_FILENAMES, &read_url, &title));
+ EXPECT_TRUE(data2.GetURLAndTitle(FilenameToURLPolicy::CONVERT_FILENAMES,
+ &read_url, &title));
EXPECT_EQ(GURL("http://google.com"), read_url);
}
diff --git a/chromium/ui/base/emoji/emoji_panel_helper.h b/chromium/ui/base/emoji/emoji_panel_helper.h
index 344316b629f..df37ef0162f 100644
--- a/chromium/ui/base/emoji/emoji_panel_helper.h
+++ b/chromium/ui/base/emoji/emoji_panel_helper.h
@@ -6,22 +6,22 @@
#define UI_BASE_EMOJI_EMOJI_PANEL_HELPER_H_
#include "base/callback.h"
+#include "base/component_export.h"
#include "base/macros.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
// Returns whether showing the Emoji Panel is supported on this version of
// the operating system.
-UI_BASE_EXPORT bool IsEmojiPanelSupported();
+COMPONENT_EXPORT(UI_BASE) bool IsEmojiPanelSupported();
// Invokes the commands to show the Emoji Panel.
-UI_BASE_EXPORT void ShowEmojiPanel();
+COMPONENT_EXPORT(UI_BASE) void ShowEmojiPanel();
#if defined(OS_CHROMEOS)
// Sets a callback to show the emoji panel (ChromeOS only).
-UI_BASE_EXPORT void SetShowEmojiKeyboardCallback(
- base::RepeatingClosure callback);
+COMPONENT_EXPORT(UI_BASE)
+void SetShowEmojiKeyboardCallback(base::RepeatingClosure callback);
#endif
} // namespace ui
diff --git a/chromium/ui/base/idle/BUILD.gn b/chromium/ui/base/idle/BUILD.gn
index 9120a2df91e..8e76844e5b6 100644
--- a/chromium/ui/base/idle/BUILD.gn
+++ b/chromium/ui/base/idle/BUILD.gn
@@ -61,7 +61,6 @@ component("idle") {
}
if (use_x11 && !is_chromeos) {
- configs += [ "//build/config/linux:xscrnsaver" ]
deps += [ "//ui/gfx/x" ]
sources += [
"idle_query_x11.cc",
diff --git a/chromium/ui/base/idle/idle_query_x11.cc b/chromium/ui/base/idle/idle_query_x11.cc
index ee676686f36..569c57a2d71 100644
--- a/chromium/ui/base/idle/idle_query_x11.cc
+++ b/chromium/ui/base/idle/idle_query_x11.cc
@@ -4,43 +4,28 @@
#include "ui/base/idle/idle_query_x11.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 {
-class IdleData {
- public:
- IdleData() {
- int event_base;
- int error_base;
- if (XScreenSaverQueryExtension(gfx::GetXDisplay(), &event_base,
- &error_base)) {
- mit_info.reset(XScreenSaverAllocInfo());
- }
- }
-
- ~IdleData() {
- }
-
- gfx::XScopedPtr<XScreenSaverInfo> mit_info;
-};
-
-IdleQueryX11::IdleQueryX11() : idle_data_(new IdleData()) {}
+IdleQueryX11::IdleQueryX11() : connection_(x11::Connection::Get()) {
+ // Let the server know the client version before making any requests.
+ connection_->screensaver().QueryVersion(
+ {x11::ScreenSaver::major_version, x11::ScreenSaver::minor_version});
+}
-IdleQueryX11::~IdleQueryX11() {}
+IdleQueryX11::~IdleQueryX11() = default;
int IdleQueryX11::IdleTime() {
- if (!idle_data_->mit_info)
- return 0;
-
- if (XScreenSaverQueryInfo(gfx::GetXDisplay(),
- XRootWindow(gfx::GetXDisplay(), 0),
- idle_data_->mit_info.get())) {
- return (idle_data_->mit_info->idle) / 1000;
- } else {
- return 0;
+ if (auto reply = connection_->screensaver()
+ .QueryInfo({connection_->default_root()})
+ .Sync()) {
+ return reply->ms_since_user_input / 1000;
}
+ return 0;
}
} // namespace ui
diff --git a/chromium/ui/base/idle/idle_query_x11.h b/chromium/ui/base/idle/idle_query_x11.h
index 0857418897e..457aada6a1e 100644
--- a/chromium/ui/base/idle/idle_query_x11.h
+++ b/chromium/ui/base/idle/idle_query_x11.h
@@ -9,9 +9,11 @@
#include "base/macros.h"
-namespace ui {
+namespace x11 {
+class Connection;
+}
-class IdleData;
+namespace ui {
class IdleQueryX11 {
public:
@@ -21,7 +23,7 @@ class IdleQueryX11 {
int IdleTime();
private:
- std::unique_ptr<IdleData> idle_data_;
+ x11::Connection* connection_;
DISALLOW_COPY_AND_ASSIGN(IdleQueryX11);
};
diff --git a/chromium/ui/base/idle/screensaver_window_finder_x11.cc b/chromium/ui/base/idle/screensaver_window_finder_x11.cc
index 74f1a5f6fcd..45342ff5383 100644
--- a/chromium/ui/base/idle/screensaver_window_finder_x11.cc
+++ b/chromium/ui/base/idle/screensaver_window_finder_x11.cc
@@ -5,26 +5,27 @@
#include "ui/base/idle/screensaver_window_finder_x11.h"
#include "ui/base/x/x11_util.h"
+#include "ui/gfx/x/connection.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) {
-}
+ScreensaverWindowFinder::ScreensaverWindowFinder() : exists_(false) {}
bool ScreensaverWindowFinder::ScreensaverWindowExists() {
- XScreenSaverInfo info;
- XDisplay* display = gfx::GetXDisplay();
- XID root = DefaultRootWindow(display);
- static int xss_event_base;
- static int xss_error_base;
- static bool have_xss =
- XScreenSaverQueryExtension(display, &xss_event_base, &xss_error_base);
- if (have_xss && XScreenSaverQueryInfo(display, root, &info) &&
- info.state == ScreenSaverOn) {
+ auto* connection = x11::Connection::Get();
+
+ // Let the server know the client version before making any requests.
+ connection->screensaver().QueryVersion(
+ {x11::ScreenSaver::major_version, x11::ScreenSaver::minor_version});
+
+ auto reply =
+ connection->screensaver().QueryInfo({connection->default_root()}).Sync();
+ if (reply && static_cast<x11::ScreenSaver::State>(reply->state) ==
+ x11::ScreenSaver::State::On) {
return true;
}
@@ -32,9 +33,10 @@ bool ScreensaverWindowFinder::ScreensaverWindowExists() {
// info.state == ScreenSaverOff or info.state == ScreenSaverDisabled does not
// necessarily mean that a screensaver is not active, so add a special check
// for xscreensaver.
- XAtom lock_atom = gfx::GetAtom("LOCK");
+ x11::Atom lock_atom = gfx::GetAtom("LOCK");
std::vector<int> atom_properties;
- if (GetIntArrayProperty(root, "_SCREENSAVER_STATUS", &atom_properties) &&
+ if (GetIntArrayProperty(GetX11RootWindow(), "_SCREENSAVER_STATUS",
+ &atom_properties) &&
atom_properties.size() > 0) {
if (atom_properties[0] == static_cast<int>(lock_atom)) {
return true;
@@ -48,14 +50,14 @@ bool ScreensaverWindowFinder::ScreensaverWindowExists() {
return finder.exists_ && !err_tracker.FoundNewError();
}
-bool ScreensaverWindowFinder::ShouldStopIterating(XID window) {
+bool ScreensaverWindowFinder::ShouldStopIterating(x11::Window window) {
if (!ui::IsWindowVisible(window) || !IsScreensaverWindow(window))
return false;
exists_ = true;
return true;
}
-bool ScreensaverWindowFinder::IsScreensaverWindow(XID window) const {
+bool ScreensaverWindowFinder::IsScreensaverWindow(x11::Window window) const {
// It should occupy the full screen.
if (!ui::IsX11WindowFullScreen(window))
return false;
diff --git a/chromium/ui/base/idle/screensaver_window_finder_x11.h b/chromium/ui/base/idle/screensaver_window_finder_x11.h
index dad3d209510..a502daa6fbe 100644
--- a/chromium/ui/base/idle/screensaver_window_finder_x11.h
+++ b/chromium/ui/base/idle/screensaver_window_finder_x11.h
@@ -16,12 +16,12 @@ class ScreensaverWindowFinder : public ui::EnumerateWindowsDelegate {
static bool ScreensaverWindowExists();
protected:
- bool ShouldStopIterating(XID window) override;
+ bool ShouldStopIterating(x11::Window window) override;
private:
ScreensaverWindowFinder();
- bool IsScreensaverWindow(XID window) const;
+ bool IsScreensaverWindow(x11::Window window) const;
bool exists_;
diff --git a/chromium/ui/base/ime/BUILD.gn b/chromium/ui/base/ime/BUILD.gn
index 2a0670796c0..5ab39cdea54 100644
--- a/chromium/ui/base/ime/BUILD.gn
+++ b/chromium/ui/base/ime/BUILD.gn
@@ -58,8 +58,6 @@ jumbo_component("ime") {
"constants.cc",
"constants.h",
"ime_assistive_window_handler_interface.h",
- "ime_bridge.cc",
- "ime_bridge.h",
"ime_candidate_window_handler_interface.h",
"ime_engine_handler_interface.h",
"ime_input_context_handler_interface.h",
@@ -81,7 +79,6 @@ jumbo_component("ime") {
"text_edit_commands.h",
"text_input_client.cc",
"text_input_client.h",
- "virtual_keyboard_visibility_request.h",
]
defines = [ "IS_UI_BASE_IME_IMPL" ]
diff --git a/chromium/ui/base/ime/chromeos/BUILD.gn b/chromium/ui/base/ime/chromeos/BUILD.gn
index 4baf9294a95..03f91b5ea59 100644
--- a/chromium/ui/base/ime/chromeos/BUILD.gn
+++ b/chromium/ui/base/ime/chromeos/BUILD.gn
@@ -22,6 +22,8 @@ jumbo_component("chromeos") {
"fake_ime_keyboard.h",
"fake_input_method_delegate.cc",
"fake_input_method_delegate.h",
+ "ime_bridge.cc",
+ "ime_bridge.h",
"ime_keyboard.cc",
"ime_keyboard_impl.cc",
"ime_keyboard_impl.h",
diff --git a/chromium/ui/base/ime/dummy_input_method.cc b/chromium/ui/base/ime/dummy_input_method.cc
index 4e3dff450b2..da32e766c9c 100644
--- a/chromium/ui/base/ime/dummy_input_method.cc
+++ b/chromium/ui/base/ime/dummy_input_method.cc
@@ -98,9 +98,4 @@ DummyInputMethod::GetInputMethodKeyboardController() {
return nullptr;
}
-const std::vector<std::unique_ptr<KeyEvent>>&
-DummyInputMethod::GetKeyEventsForTesting() {
- return key_events_for_testing_;
-}
-
} // namespace ui
diff --git a/chromium/ui/base/ime/dummy_input_method.h b/chromium/ui/base/ime/dummy_input_method.h
index 9865876b0ad..fba6e76cdb2 100644
--- a/chromium/ui/base/ime/dummy_input_method.h
+++ b/chromium/ui/base/ime/dummy_input_method.h
@@ -49,11 +49,7 @@ class DummyInputMethod : public InputMethod {
void RemoveObserver(InputMethodObserver* observer) override;
InputMethodKeyboardController* GetInputMethodKeyboardController() override;
- const std::vector<std::unique_ptr<KeyEvent>>& GetKeyEventsForTesting()
- override;
-
private:
- std::vector<std::unique_ptr<KeyEvent>> key_events_for_testing_;
DISALLOW_COPY_AND_ASSIGN(DummyInputMethod);
};
diff --git a/chromium/ui/base/ime/dummy_text_input_client.cc b/chromium/ui/base/ime/dummy_text_input_client.cc
index 2ed42e851b2..a286b663259 100644
--- a/chromium/ui/base/ime/dummy_text_input_client.cc
+++ b/chromium/ui/base/ime/dummy_text_input_client.cc
@@ -152,6 +152,14 @@ bool DummyTextInputClient::SetCompositionFromExistingText(
}
#endif
+#if defined(OS_CHROMEOS)
+bool DummyTextInputClient::SetAutocorrectRange(
+ const base::string16& autocorrect_text,
+ const gfx::Range& range) {
+ return false;
+}
+#endif
+
#if defined(OS_WIN)
void DummyTextInputClient::GetActiveTextInputControlLayoutBounds(
base::Optional<gfx::Rect>* control_bounds,
diff --git a/chromium/ui/base/ime/dummy_text_input_client.h b/chromium/ui/base/ime/dummy_text_input_client.h
index e145feda8f6..af8f0ad48fc 100644
--- a/chromium/ui/base/ime/dummy_text_input_client.h
+++ b/chromium/ui/base/ime/dummy_text_input_client.h
@@ -62,6 +62,12 @@ class DummyTextInputClient : public TextInputClient {
const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) override;
#endif
+#if defined(OS_CHROMEOS)
+ // Set the autocorrect range
+ bool SetAutocorrectRange(const base::string16& autocorrect_text,
+ const gfx::Range& range) override;
+#endif
+
#if defined(OS_WIN)
void GetActiveTextInputControlLayoutBounds(
base::Optional<gfx::Rect>* control_bounds,
diff --git a/chromium/ui/base/ime/fuchsia/input_method_fuchsia.cc b/chromium/ui/base/ime/fuchsia/input_method_fuchsia.cc
index 2d205c8d182..9959fa3d031 100644
--- a/chromium/ui/base/ime/fuchsia/input_method_fuchsia.cc
+++ b/chromium/ui/base/ime/fuchsia/input_method_fuchsia.cc
@@ -9,7 +9,7 @@
#include <memory>
#include <utility>
-#include "base/fuchsia/default_context.h"
+#include "base/fuchsia/process_context.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/events/base_event_utils.h"
#include "ui/events/keycodes/dom/dom_code.h"
@@ -22,7 +22,7 @@ InputMethodFuchsia::InputMethodFuchsia(internal::InputMethodDelegate* delegate,
: InputMethodBase(delegate),
event_converter_(this),
ime_client_binding_(this),
- ime_service_(base::fuchsia::ComponentContextForCurrentProcess()
+ ime_service_(base::ComponentContextForProcess()
->svc()
->Connect<fuchsia::ui::input::ImeService>()),
virtual_keyboard_controller_(ime_service_.get()) {}
diff --git a/chromium/ui/base/ime/fuchsia/input_method_keyboard_controller_fuchsia.cc b/chromium/ui/base/ime/fuchsia/input_method_keyboard_controller_fuchsia.cc
index c284253ad9b..6a6271b471e 100644
--- a/chromium/ui/base/ime/fuchsia/input_method_keyboard_controller_fuchsia.cc
+++ b/chromium/ui/base/ime/fuchsia/input_method_keyboard_controller_fuchsia.cc
@@ -7,9 +7,11 @@
#include <lib/sys/cpp/component_context.h>
#include <utility>
+#include "base/check.h"
#include "base/fuchsia/default_context.h"
#include "base/fuchsia/fuchsia_logging.h"
-#include "base/logging.h"
+#include "base/fuchsia/process_context.h"
+#include "base/notreached.h"
namespace ui {
@@ -17,7 +19,7 @@ InputMethodKeyboardControllerFuchsia::InputMethodKeyboardControllerFuchsia(
fuchsia::ui::input::ImeService* ime_service)
: ime_service_(ime_service),
ime_visibility_(
- base::fuchsia::ComponentContextForCurrentProcess()
+ base::ComponentContextForProcess()
->svc()
->Connect<fuchsia::ui::input::ImeVisibilityService>()) {
DCHECK(ime_service_);
diff --git a/chromium/ui/base/ime/ime_assistive_window_handler_interface.h b/chromium/ui/base/ime/ime_assistive_window_handler_interface.h
index 8807731e9a0..d400f291dff 100644
--- a/chromium/ui/base/ime/ime_assistive_window_handler_interface.h
+++ b/chromium/ui/base/ime/ime_assistive_window_handler_interface.h
@@ -14,6 +14,13 @@ namespace gfx {
class Rect;
} // namespace gfx
+namespace ui {
+namespace ime {
+struct AssistiveWindowButton;
+struct SuggestionDetails;
+} // namespace ime
+} // namespace ui
+
namespace chromeos {
struct AssistiveWindowProperties;
@@ -27,9 +34,19 @@ class COMPONENT_EXPORT(UI_BASE_IME) IMEAssistiveWindowHandlerInterface {
virtual void SetAssistiveWindowProperties(
const AssistiveWindowProperties& window) {}
- virtual void ShowSuggestion(const base::string16& text,
- const size_t confirmed_length,
- const bool show_tab) {}
+ virtual void ShowSuggestion(const ui::ime::SuggestionDetails& details) {}
+
+ virtual void ShowMultipleSuggestions(
+ const std::vector<base::string16>& suggestions) {}
+
+ // Highlights or unhighlights a given assistive button based on the given
+ // parameters.
+ virtual void SetButtonHighlighted(
+ const ui::ime::AssistiveWindowButton& button,
+ bool highlighted) {}
+
+ virtual void AcceptSuggestion(const base::string16& suggestion) {}
+
virtual void HideSuggestion() {}
// Called to get the current suggestion text.
diff --git a/chromium/ui/base/ime/ime_bridge.cc b/chromium/ui/base/ime/ime_bridge.cc
deleted file mode 100644
index 5e44712f9a0..00000000000
--- a/chromium/ui/base/ime/ime_bridge.cc
+++ /dev/null
@@ -1,146 +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/ime/ime_bridge.h"
-
-#include <map>
-
-#include "base/macros.h"
-#include "base/memory/singleton.h"
-#include "base/observer_list.h"
-#include "build/build_config.h"
-
-namespace ui {
-
-static IMEBridge* g_ime_bridge = nullptr;
-
-// An implementation of IMEBridge.
-class IMEBridgeImpl : public IMEBridge {
- public:
- IMEBridgeImpl()
- : current_input_context_(ui::TEXT_INPUT_TYPE_NONE,
- ui::TEXT_INPUT_MODE_DEFAULT,
- 0,
- ui::TextInputClient::FOCUS_REASON_NONE,
- false /* should_do_learning */) {}
-
- ~IMEBridgeImpl() override {}
-
- // IMEBridge override.
- IMEInputContextHandlerInterface* GetInputContextHandler() const override {
- return input_context_handler_;
- }
-
- // IMEBridge override.
- void SetInputContextHandler(
- IMEInputContextHandlerInterface* handler) override {
- input_context_handler_ = handler;
- for (auto& observer : observers_)
- observer.OnInputContextHandlerChanged();
- }
-
- // IMEBridge override.
- void SetCurrentEngineHandler(IMEEngineHandlerInterface* handler) override {
- engine_handler_ = handler;
- }
-
- // IMEBridge override.
- IMEEngineHandlerInterface* GetCurrentEngineHandler() const override {
- return engine_handler_;
- }
-
- // IMEBridge override.
- void SetCurrentInputContext(
- const IMEEngineHandlerInterface::InputContext& input_context) override {
- current_input_context_ = input_context;
- }
-
- // IMEBridge override.
- const IMEEngineHandlerInterface::InputContext& GetCurrentInputContext()
- const override {
- return current_input_context_;
- }
-
- // IMEBridge override.
- void AddObserver(ui::IMEBridgeObserver* observer) override {
- observers_.AddObserver(observer);
- }
-
- // IMEBridge override.
- void RemoveObserver(ui::IMEBridgeObserver* observer) override {
- observers_.RemoveObserver(observer);
- }
-
- // IMEBridge override.
- void MaybeSwitchEngine() override {
- for (auto& observer : observers_)
- observer.OnRequestSwitchEngine();
- }
-
-#if defined(OS_CHROMEOS)
- // IMEBridge override.
- void SetCandidateWindowHandler(
- chromeos::IMECandidateWindowHandlerInterface* handler) override {
- candidate_window_handler_ = handler;
- }
-
- // IMEBridge override.
- chromeos::IMECandidateWindowHandlerInterface* GetCandidateWindowHandler()
- const override {
- return candidate_window_handler_;
- }
-
- // IMEBridge override.
- void SetAssistiveWindowHandler(
- chromeos::IMEAssistiveWindowHandlerInterface* handler) override {
- assistive_window_handler_ = handler;
- }
-
- // IMEBridge override.
- chromeos::IMEAssistiveWindowHandlerInterface* GetAssistiveWindowHandler()
- const override {
- return assistive_window_handler_;
- }
-#endif
-
- private:
- IMEInputContextHandlerInterface* input_context_handler_ = nullptr;
- IMEEngineHandlerInterface* engine_handler_ = nullptr;
- base::ObserverList<IMEBridgeObserver> observers_;
- IMEEngineHandlerInterface::InputContext current_input_context_;
-
-#if defined(OS_CHROMEOS)
- chromeos::IMECandidateWindowHandlerInterface* candidate_window_handler_ =
- nullptr;
- chromeos::IMEAssistiveWindowHandlerInterface* assistive_window_handler_ =
- nullptr;
-#endif
-
- DISALLOW_COPY_AND_ASSIGN(IMEBridgeImpl);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// IMEBridge
-IMEBridge::IMEBridge() {}
-
-IMEBridge::~IMEBridge() {}
-
-// static.
-void IMEBridge::Initialize() {
- if (!g_ime_bridge)
- g_ime_bridge = new IMEBridgeImpl();
-}
-
-// static.
-void IMEBridge::Shutdown() {
- delete g_ime_bridge;
- g_ime_bridge = nullptr;
-}
-
-// static.
-IMEBridge* IMEBridge::Get() {
- return g_ime_bridge;
-}
-
-} // namespace ui
diff --git a/chromium/ui/base/ime/ime_bridge.h b/chromium/ui/base/ime/ime_bridge.h
deleted file mode 100644
index 9fade0b1944..00000000000
--- a/chromium/ui/base/ime/ime_bridge.h
+++ /dev/null
@@ -1,102 +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_IME_IME_BRIDGE_H_
-#define UI_BASE_IME_IME_BRIDGE_H_
-
-#include "base/component_export.h"
-#include "base/macros.h"
-#include "build/build_config.h"
-#include "ui/base/ime/ime_bridge_observer.h"
-#include "ui/base/ime/ime_engine_handler_interface.h"
-#include "ui/base/ime/ime_input_context_handler_interface.h"
-
-#if defined(OS_CHROMEOS)
-#include "ui/base/ime/ime_assistive_window_handler_interface.h"
-#include "ui/base/ime/ime_candidate_window_handler_interface.h"
-
-namespace chromeos {
-class IMECandidateWindowHandlerInterface;
-class IMEAssistiveWindowHandlerInterface;
-}
-#endif
-
-namespace ui {
-
-// IMEBridge provides access of each IME related handler. This class
-// is used for IME implementation.
-class COMPONENT_EXPORT(UI_BASE_IME) IMEBridge {
- public:
- virtual ~IMEBridge();
-
- // Allocates the global instance. Must be called before any calls to Get().
- static void Initialize();
-
- // Releases the global instance.
- static void Shutdown();
-
- // Returns IMEBridge global instance. Initialize() must be called first.
- static IMEBridge* Get();
-
- // Returns current InputContextHandler. This function returns NULL if input
- // context is not ready to use.
- virtual IMEInputContextHandlerInterface* GetInputContextHandler() const = 0;
-
- // Updates current InputContextHandler. If there is no active input context,
- // pass NULL for |handler|. Caller must release |handler|.
- virtual void SetInputContextHandler(
- IMEInputContextHandlerInterface* handler) = 0;
-
- // Updates current EngineHandler. If there is no active engine service, pass
- // NULL for |handler|. Caller must release |handler|.
- virtual void SetCurrentEngineHandler(IMEEngineHandlerInterface* handler) = 0;
-
- // Returns current EngineHandler. This function returns NULL if current engine
- // is not ready to use.
- virtual IMEEngineHandlerInterface* GetCurrentEngineHandler() const = 0;
-
- // Updates the current input context.
- // This is called from InputMethodChromeOS.
- virtual void SetCurrentInputContext(
- const IMEEngineHandlerInterface::InputContext& input_context) = 0;
-
- // Returns the current input context.
- // This is called from InputMethodEngine.
- virtual const IMEEngineHandlerInterface::InputContext&
- GetCurrentInputContext() const = 0;
-
- // Add or remove observers of events such as switching engines, etc.
- virtual void AddObserver(ui::IMEBridgeObserver* observer) = 0;
- virtual void RemoveObserver(ui::IMEBridgeObserver* observer) = 0;
-
- // Switches the engine handler upon top level window focus change.
- virtual void MaybeSwitchEngine() = 0;
-
-#if defined(OS_CHROMEOS)
- // Returns current CandidateWindowHandler. This function returns NULL if
- // current candidate window is not ready to use.
- virtual chromeos::IMECandidateWindowHandlerInterface*
- GetCandidateWindowHandler() const = 0;
-
- // Updates current CandidatWindowHandler. If there is no active candidate
- // window service, pass NULL for |handler|. Caller must release |handler|.
- virtual void SetCandidateWindowHandler(
- chromeos::IMECandidateWindowHandlerInterface* handler) = 0;
-
- virtual chromeos::IMEAssistiveWindowHandlerInterface*
- GetAssistiveWindowHandler() const = 0;
- virtual void SetAssistiveWindowHandler(
- chromeos::IMEAssistiveWindowHandlerInterface* handler) = 0;
-#endif
-
- protected:
- IMEBridge();
-
- private:
- DISALLOW_COPY_AND_ASSIGN(IMEBridge);
-};
-
-} // namespace ui
-
-#endif // UI_BASE_IME_IME_BRIDGE_H_
diff --git a/chromium/ui/base/ime/ime_engine_handler_interface.h b/chromium/ui/base/ime/ime_engine_handler_interface.h
index 4eb49c6ecf0..4895587e81c 100644
--- a/chromium/ui/base/ime/ime_engine_handler_interface.h
+++ b/chromium/ui/base/ime/ime_engine_handler_interface.h
@@ -24,8 +24,15 @@ class Rect;
namespace ui {
+class InputMethodKeyboardController;
class KeyEvent;
+#if defined(OS_CHROMEOS)
+namespace ime {
+struct AssistiveWindowButton;
+} // namespace ime
+#endif // defined(OS_CHROMEOS)
+
// A interface to handle the engine handler method call.
class COMPONENT_EXPORT(UI_BASE_IME) IMEEngineHandlerInterface {
public:
@@ -114,6 +121,10 @@ class COMPONENT_EXPORT(UI_BASE_IME) IMEEngineHandlerInterface {
// Called when the composition bounds changed.
virtual void SetCompositionBounds(const std::vector<gfx::Rect>& bounds) = 0;
+ // Gets the implementation of the keyboard controller.
+ virtual ui::InputMethodKeyboardController* GetInputMethodKeyboardController()
+ const = 0;
+
#if defined(OS_CHROMEOS)
// Called when a property is activated or changed.
@@ -123,6 +134,10 @@ class COMPONENT_EXPORT(UI_BASE_IME) IMEEngineHandlerInterface {
// based candidate index in lookup table.
virtual void CandidateClicked(uint32_t index) = 0;
+ // Called when assistive window is clicked.
+ virtual void AssistiveWindowButtonClicked(
+ const ui::ime::AssistiveWindowButton& button) {}
+
// Sets the mirroring/casting enable states.
virtual void SetMirroringEnabled(bool mirroring_enabled) = 0;
virtual void SetCastingEnabled(bool casting_enabled) = 0;
diff --git a/chromium/ui/base/ime/ime_input_context_handler_interface.h b/chromium/ui/base/ime/ime_input_context_handler_interface.h
index 5387c7b7b0e..46fd1fef8ea 100644
--- a/chromium/ui/base/ime/ime_input_context_handler_interface.h
+++ b/chromium/ui/base/ime/ime_input_context_handler_interface.h
@@ -33,6 +33,11 @@ class COMPONENT_EXPORT(UI_BASE_IME) IMEInputContextHandlerInterface {
uint32_t after,
const std::vector<ui::ImeTextSpan>& text_spans) = 0;
+ // Set the autocorrect range with text.
+ virtual bool SetAutocorrectRange(const base::string16& autocorrect_text,
+ uint32_t start,
+ uint32_t end) = 0;
+
// Called when the engine changes the selection range.
// Returns true if the operation was successful.
virtual bool SetSelectionRange(uint32_t start, uint32_t end) = 0;
diff --git a/chromium/ui/base/ime/ime_text_span.h b/chromium/ui/base/ime/ime_text_span.h
index c76734e2e4f..62bdfb8cbac 100644
--- a/chromium/ui/base/ime/ime_text_span.h
+++ b/chromium/ui/base/ime/ime_text_span.h
@@ -15,9 +15,6 @@
namespace ui {
-// Intentionally keep sync with blink::WebImeTextSpan defined in:
-// third_party/WebKit/public/web/WebImeTextSpan.h
-
struct COMPONENT_EXPORT(UI_BASE_IME_TYPES) ImeTextSpan {
enum class Type {
// Creates a composition marker.
@@ -29,6 +26,8 @@ struct COMPONENT_EXPORT(UI_BASE_IME_TYPES) ImeTextSpan {
// replacement, and will be ignored if added to an element with spell
// checking disabled.
kMisspellingSuggestion,
+ // Creates an autocorrect marker that isn't cleared by itself.
+ kAutocorrect,
};
enum class Thickness {
@@ -72,6 +71,7 @@ struct COMPONENT_EXPORT(UI_BASE_IME_TYPES) ImeTextSpan {
rhs.suggestion_highlight_color) &&
(this->remove_on_finish_composing ==
rhs.remove_on_finish_composing) &&
+ (this->interim_char_selection == rhs.interim_char_selection) &&
(this->suggestions == rhs.suggestions);
}
@@ -87,6 +87,7 @@ struct COMPONENT_EXPORT(UI_BASE_IME_TYPES) ImeTextSpan {
SkColor background_color;
SkColor suggestion_highlight_color;
bool remove_on_finish_composing = false;
+ bool interim_char_selection = false;
std::vector<std::string> suggestions;
};
diff --git a/chromium/ui/base/ime/init/BUILD.gn b/chromium/ui/base/ime/init/BUILD.gn
index 0aad80f4551..26e7a60f901 100644
--- a/chromium/ui/base/ime/init/BUILD.gn
+++ b/chromium/ui/base/ime/init/BUILD.gn
@@ -31,6 +31,9 @@ jumbo_component("init") {
if (is_mac) {
deps += [ "//ui/base/ime/mac" ]
}
+ if (is_chromeos) {
+ deps += [ "//ui/base/ime/chromeos" ]
+ }
if (is_linux && !is_chromeos) {
deps += [ "//ui/base/ime/linux" ]
}
diff --git a/chromium/ui/base/ime/init/input_method_factory.cc b/chromium/ui/base/ime/init/input_method_factory.cc
index 5e98636a36c..d923c6b2331 100644
--- a/chromium/ui/base/ime/init/input_method_factory.cc
+++ b/chromium/ui/base/ime/init/input_method_factory.cc
@@ -5,6 +5,7 @@
#include "ui/base/ime/init/input_method_factory.h"
#include "base/command_line.h"
+#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/win/windows_version.h"
#include "build/build_config.h"
@@ -17,10 +18,15 @@
#include "ui/base/ime/win/input_method_win_tsf.h"
#elif defined(OS_MACOSX)
#include "ui/base/ime/mac/input_method_mac.h"
-#elif defined(USE_X11)
-#include "ui/base/ime/linux/input_method_auralinux.h"
-#elif defined(USE_OZONE)
+#elif defined(USE_X11) || defined(USE_OZONE)
+#if defined(USE_X11)
+// TODO(crbug.com/1085700): Remove nogncheck when we can build both Ozone
+// Wayland and X11 on Linux codesearch-gen bots.
+#include "ui/base/ime/linux/input_method_auralinux.h" // nogncheck
+#endif // defined(USE_X11)
+#if defined(USE_OZONE)
#include "ui/ozone/public/ozone_platform.h"
+#endif // defined(USE_OZONE)
#else
#include "ui/base/ime/input_method_minimal.h"
#endif
@@ -63,10 +69,18 @@ std::unique_ptr<InputMethod> CreateInputMethod(
return std::make_unique<InputMethodWinImm32>(delegate, widget);
#elif defined(OS_MACOSX)
return std::make_unique<InputMethodMac>(delegate);
-#elif defined(USE_X11)
- return std::make_unique<InputMethodAuraLinux>(delegate);
-#elif defined(USE_OZONE)
- return ui::OzonePlatform::GetInstance()->CreateInputMethod(delegate, widget);
+#elif defined(USE_X11) || defined(USE_OZONE)
+#if defined(USE_OZONE)
+ if (features::IsUsingOzonePlatform()) {
+ return ui::OzonePlatform::GetInstance()->CreateInputMethod(delegate,
+ widget);
+ }
+#endif // defined(USE_OZONE)
+#if defined(USE_X11)
+ return std::make_unique<ui::InputMethodAuraLinux>(delegate);
+#endif // defined(USE_X11)
+ NOTREACHED();
+ return nullptr;
#else
return std::make_unique<InputMethodMinimal>(delegate);
#endif
diff --git a/chromium/ui/base/ime/init/input_method_initializer.cc b/chromium/ui/base/ime/init/input_method_initializer.cc
index 1a453109dbc..1bfc48a8005 100644
--- a/chromium/ui/base/ime/init/input_method_initializer.cc
+++ b/chromium/ui/base/ime/init/input_method_initializer.cc
@@ -9,10 +9,12 @@
#include "build/build_config.h"
#if defined(OS_CHROMEOS)
-#include "ui/base/ime/ime_bridge.h"
+#include "ui/base/ime/chromeos/ime_bridge.h"
#elif defined(USE_AURA) && defined(OS_LINUX)
#include "base/check.h"
-#include "ui/base/ime/linux/fake_input_method_context_factory.h"
+// TODO(crbug.com/1085700): Remove nogncheck when we can build both Ozone
+// Wayland and X11 on Linux codesearch-gen bots.
+#include "ui/base/ime/linux/fake_input_method_context_factory.h" // nogncheck
#elif defined(OS_WIN)
#include "ui/base/ime/init/input_method_factory.h"
#include "ui/base/ime/win/tsf_bridge.h"
diff --git a/chromium/ui/base/ime/input_method.h b/chromium/ui/base/ime/input_method.h
index b400ece46ac..9ead7fa666e 100644
--- a/chromium/ui/base/ime/input_method.h
+++ b/chromium/ui/base/ime/input_method.h
@@ -18,10 +18,6 @@
#include "ui/events/platform_event.h"
#include "ui/gfx/geometry/rect.h"
-namespace extensions {
-class InputImeApiTest;
-} // namespace extensions
-
namespace ui {
namespace internal {
@@ -57,8 +53,6 @@ class TextInputClient;
// ui::InputMethod and owns it.
class InputMethod {
public:
- InputMethod() : track_key_events_for_testing_(false) {}
-
#if defined(OS_WIN)
typedef LRESULT NativeEventResult;
#else
@@ -174,16 +168,6 @@ class InputMethod {
// Return the keyboard controller; used only on Windows.
virtual InputMethodKeyboardController* GetInputMethodKeyboardController() = 0;
-
- protected:
- friend class extensions::InputImeApiTest;
-
- // Gets the tracked key events of using input.ime.sendKeyEvents API.
- virtual const std::vector<std::unique_ptr<ui::KeyEvent>>&
- GetKeyEventsForTesting() = 0;
-
- // Whether the key events will be tracked. Only used for testing.
- bool track_key_events_for_testing_;
};
} // namespace ui
diff --git a/chromium/ui/base/ime/input_method_base.cc b/chromium/ui/base/ime/input_method_base.cc
index 6051072ddb7..b5f26b6bf9d 100644
--- a/chromium/ui/base/ime/input_method_base.cc
+++ b/chromium/ui/base/ime/input_method_base.cc
@@ -9,7 +9,6 @@
#include "base/check.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
-#include "ui/base/ime/ime_bridge.h"
#include "ui/base/ime/input_method_delegate.h"
#include "ui/base/ime/input_method_keyboard_controller_stub.h"
#include "ui/base/ime/input_method_observer.h"
@@ -18,11 +17,6 @@
namespace ui {
-ui::IMEEngineHandlerInterface* InputMethodBase::GetEngine() {
- auto* bridge = ui::IMEBridge::Get();
- return bridge ? bridge->GetCurrentEngineHandler() : nullptr;
-}
-
InputMethodBase::InputMethodBase(internal::InputMethodDelegate* delegate)
: InputMethodBase(delegate, nullptr) {}
@@ -35,9 +29,6 @@ InputMethodBase::InputMethodBase(
InputMethodBase::~InputMethodBase() {
for (InputMethodObserver& observer : observer_list_)
observer.OnInputMethodDestroyed(this);
- if (ui::IMEBridge::Get() &&
- ui::IMEBridge::Get()->GetInputContextHandler() == this)
- ui::IMEBridge::Get()->SetInputContextHandler(nullptr);
}
void InputMethodBase::SetDelegate(internal::InputMethodDelegate* delegate) {
@@ -45,17 +36,9 @@ void InputMethodBase::SetDelegate(internal::InputMethodDelegate* delegate) {
}
void InputMethodBase::OnFocus() {
- ui::IMEBridge* bridge = ui::IMEBridge::Get();
- if (bridge) {
- bridge->SetInputContextHandler(this);
- bridge->MaybeSwitchEngine();
- }
}
void InputMethodBase::OnBlur() {
- if (ui::IMEBridge::Get() &&
- ui::IMEBridge::Get()->GetInputContextHandler() == this)
- ui::IMEBridge::Get()->SetInputContextHandler(nullptr);
}
#if defined(OS_WIN)
@@ -251,6 +234,13 @@ bool InputMethodBase::SetCompositionRange(
return false;
}
+bool InputMethodBase::SetAutocorrectRange(
+ const base::string16& autocorrect_text,
+ uint32_t start,
+ uint32_t end) {
+ return false;
+}
+
bool InputMethodBase::SetSelectionRange(uint32_t start, uint32_t end) {
return false;
}
@@ -275,9 +265,6 @@ SurroundingTextInfo InputMethodBase::GetSurroundingTextInfo() {
}
void InputMethodBase::SendKeyEvent(KeyEvent* event) {
- if (track_key_events_for_testing_) {
- key_events_for_testing_.push_back(std::make_unique<KeyEvent>(*event));
- }
ui::EventDispatchDetails details = DispatchKeyEvent(event);
DCHECK(!details.dispatcher_destroyed);
}
@@ -298,9 +285,4 @@ bool InputMethodBase::HasCompositionText() {
return client && client->HasCompositionText();
}
-const std::vector<std::unique_ptr<ui::KeyEvent>>&
-InputMethodBase::GetKeyEventsForTesting() {
- return key_events_for_testing_;
-}
-
} // namespace ui
diff --git a/chromium/ui/base/ime/input_method_base.h b/chromium/ui/base/ime/input_method_base.h
index 7d182e01975..e87cdcab71e 100644
--- a/chromium/ui/base/ime/input_method_base.h
+++ b/chromium/ui/base/ime/input_method_base.h
@@ -92,6 +92,9 @@ class COMPONENT_EXPORT(UI_BASE_IME) InputMethodBase
uint32_t before,
uint32_t after,
const std::vector<ui::ImeTextSpan>& text_spans) override;
+ bool SetAutocorrectRange(const base::string16& autocorrect_text,
+ uint32_t start,
+ uint32_t end) override;
bool SetSelectionRange(uint32_t start, uint32_t end) override;
#endif
@@ -134,23 +137,15 @@ class COMPONENT_EXPORT(UI_BASE_IME) InputMethodBase
internal::InputMethodDelegate* delegate() const { return delegate_; }
- static IMEEngineHandlerInterface* GetEngine();
-
private:
internal::InputMethodDelegate* delegate_;
- // InputMethod:
- const std::vector<std::unique_ptr<ui::KeyEvent>>& GetKeyEventsForTesting()
- override;
-
void SetFocusedTextInputClientInternal(TextInputClient* client);
TextInputClient* text_input_client_ = nullptr;
base::ObserverList<InputMethodObserver>::Unchecked observer_list_;
- std::vector<std::unique_ptr<ui::KeyEvent>> key_events_for_testing_;
-
// Screen bounds of a on-screen keyboard.
gfx::Rect keyboard_bounds_;
diff --git a/chromium/ui/base/ime/linux/BUILD.gn b/chromium/ui/base/ime/linux/BUILD.gn
index 01c9b24e6a7..dbef616118c 100644
--- a/chromium/ui/base/ime/linux/BUILD.gn
+++ b/chromium/ui/base/ime/linux/BUILD.gn
@@ -5,7 +5,14 @@
import("//build/config/jumbo.gni")
import("//build/config/linux/pangocairo/pangocairo.gni")
-assert(is_linux && !is_chromeos)
+# Allows base/ime/linux to be built if it's just for making kythe annotations.
+# This is used to generate cross references in codesearch. References are
+# generated by building the ozone wayland backend on ChromiumOS, which
+# normally we would not want to compile base/ime/linux for. We can't build
+# both ozone and x11 on Linux yet, but when we can we should remove this.
+# TODO(crbug.com/1085700): Remove || enable_kythe_annotations here.
+import("//build/toolchain/kythe.gni")
+assert((is_linux && !is_chromeos) || enable_kythe_annotations)
jumbo_component("linux") {
output_name = "ui_base_ime_linux"
diff --git a/chromium/ui/base/ime/linux/input_method_auralinux.cc b/chromium/ui/base/ime/linux/input_method_auralinux.cc
index 3f3663c3a51..de49a5b15f1 100644
--- a/chromium/ui/base/ime/linux/input_method_auralinux.cc
+++ b/chromium/ui/base/ime/linux/input_method_auralinux.cc
@@ -8,8 +8,6 @@
#include "base/bind.h"
#include "base/environment.h"
#include "ui/base/ime/constants.h"
-#include "ui/base/ime/ime_bridge.h"
-#include "ui/base/ime/ime_engine_handler_interface.h"
#include "ui/base/ime/linux/linux_input_method_context_factory.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/events/event.h"
@@ -88,42 +86,9 @@ ui::EventDispatchDetails InputMethodAuraLinux::DispatchKeyEvent(
}
}
- // If there's an active IME extension is listening to the key event, and the
- // current text input client is not password input client, the key event
- // should be dispatched to the extension engine in the two conditions:
- // 1) |filtered| == false: the ET_KEY_PRESSED event of non-character key,
- // or the ET_KEY_RELEASED event of all key.
- // 2) |filtered| == true && NeedInsertChar(): the ET_KEY_PRESSED event of
- // character key.
- if (text_input_type_ != TEXT_INPUT_TYPE_PASSWORD && GetEngine() &&
- (!filtered || NeedInsertChar())) {
- ui::IMEEngineHandlerInterface::KeyEventDoneCallback callback =
- base::BindOnce(&InputMethodAuraLinux::ProcessKeyEventByEngineDone,
- weak_ptr_factory_.GetWeakPtr(),
- base::Owned(new ui::KeyEvent(*event)), filtered,
- composition_changed_,
- base::Owned(new ui::CompositionText(composition_)),
- base::Owned(new base::string16(result_text_)));
- GetEngine()->ProcessKeyEvent(*event, std::move(callback));
- return ui::EventDispatchDetails();
- }
-
return ProcessKeyEventDone(event, filtered, false);
}
-void InputMethodAuraLinux::ProcessKeyEventByEngineDone(
- ui::KeyEvent* event,
- bool filtered,
- bool composition_changed,
- ui::CompositionText* composition,
- base::string16* result_text,
- bool is_handled) {
- composition_changed_ = composition_changed;
- composition_ = *composition;
- result_text_ = *result_text;
- ignore_result(ProcessKeyEventDone(event, filtered, is_handled));
-}
-
ui::EventDispatchDetails InputMethodAuraLinux::ProcessKeyEventDone(
ui::KeyEvent* event,
bool filtered,
@@ -248,22 +213,6 @@ void InputMethodAuraLinux::UpdateContextFocusState() {
context_simple_->Focus();
else
context_simple_->Blur();
-
- if (!ui::IMEBridge::Get()) // IMEBridge could be null for tests.
- return;
-
- ui::IMEEngineHandlerInterface::InputContext context(
- GetTextInputType(), GetTextInputMode(), GetTextInputFlags(),
- ui::TextInputClient::FOCUS_REASON_OTHER, GetClientShouldDoLearning());
- ui::IMEBridge::Get()->SetCurrentInputContext(context);
-
- ui::IMEEngineHandlerInterface* engine = GetEngine();
- if (engine) {
- if (old_text_input_type != TEXT_INPUT_TYPE_NONE)
- engine->FocusOut();
- if (text_input_type_ != TEXT_INPUT_TYPE_NONE)
- engine->FocusIn(context);
- }
}
void InputMethodAuraLinux::OnTextInputTypeChanged(
@@ -286,19 +235,12 @@ void InputMethodAuraLinux::OnCaretBoundsChanged(const TextInputClient* client) {
client->GetEditableSelectionRange(&selection_range)) {
context_->SetSurroundingText(text, selection_range);
}
-
- if (!IsTextInputTypeNone() && text_input_type_ != TEXT_INPUT_TYPE_PASSWORD &&
- GetEngine())
- GetEngine()->SetCompositionBounds(GetCompositionBounds(client));
}
void InputMethodAuraLinux::CancelComposition(const TextInputClient* client) {
if (!IsTextInputClientFocused(client))
return;
- if (GetEngine())
- GetEngine()->Reset();
-
ResetContext();
}
@@ -457,8 +399,6 @@ void InputMethodAuraLinux::ConfirmCompositionText(bool reset_engine,
NOTIMPLEMENTED_LOG_ONCE();
}
InputMethodBase::ConfirmCompositionText(reset_engine, keep_selection);
- if (reset_engine && GetEngine())
- GetEngine()->Reset();
ResetContext();
}
diff --git a/chromium/ui/base/ime/linux/input_method_auralinux.h b/chromium/ui/base/ime/linux/input_method_auralinux.h
index 294979dec2d..e560171df5b 100644
--- a/chromium/ui/base/ime/linux/input_method_auralinux.h
+++ b/chromium/ui/base/ime/linux/input_method_auralinux.h
@@ -65,18 +65,6 @@ class COMPONENT_EXPORT(UI_BASE_IME_LINUX) InputMethodAuraLinux
bool is_handled)
WARN_UNUSED_RESULT;
- // Callback function for IMEEngineHandlerInterface::ProcessKeyEvent().
- // It recovers the context when the event is being passed to the extension and
- // call ProcessKeyEventDone() for the following processing. This is necessary
- // as this method is async. The environment may be changed by other generated
- // key events by the time the callback is run.
- void ProcessKeyEventByEngineDone(ui::KeyEvent* event,
- bool filtered,
- bool composition_changed,
- ui::CompositionText* composition,
- base::string16* result_text,
- bool is_handled);
-
std::unique_ptr<LinuxInputMethodContext> context_;
std::unique_ptr<LinuxInputMethodContext> context_simple_;
diff --git a/chromium/ui/base/ime/linux/input_method_auralinux_unittest.cc b/chromium/ui/base/ime/linux/input_method_auralinux_unittest.cc
index 02819b93d51..c7d29003977 100644
--- a/chromium/ui/base/ime/linux/input_method_auralinux_unittest.cc
+++ b/chromium/ui/base/ime/linux/input_method_auralinux_unittest.cc
@@ -271,19 +271,19 @@ class TextInputClientForTesting : public DummyTextInputClient {
class InputMethodAuraLinuxTest : public testing::Test {
protected:
InputMethodAuraLinuxTest()
- : factory_(NULL),
- input_method_auralinux_(NULL),
- delegate_(NULL),
- context_(NULL),
- context_simple_(NULL) {
+ : factory_(nullptr),
+ input_method_auralinux_(nullptr),
+ delegate_(nullptr),
+ context_(nullptr),
+ context_simple_(nullptr) {
factory_ = new LinuxInputMethodContextFactoryForTesting();
LinuxInputMethodContextFactory::SetInstance(factory_);
test_result_ = TestResult::GetInstance();
}
~InputMethodAuraLinuxTest() override {
delete factory_;
- factory_ = NULL;
- test_result_ = NULL;
+ factory_ = nullptr;
+ test_result_ = nullptr;
}
void SetUp() override {
@@ -303,13 +303,13 @@ class InputMethodAuraLinuxTest : public testing::Test {
context_simple_->SetSyncMode(false);
context_simple_->SetEatKey(false);
- context_ = NULL;
- context_simple_ = NULL;
+ context_ = nullptr;
+ context_simple_ = nullptr;
delete input_method_auralinux_;
- input_method_auralinux_ = NULL;
+ input_method_auralinux_ = nullptr;
delete delegate_;
- delegate_ = NULL;
+ delegate_ = nullptr;
}
LinuxInputMethodContextFactoryForTesting* factory_;
diff --git a/chromium/ui/base/ime/mock_ime_input_context_handler.cc b/chromium/ui/base/ime/mock_ime_input_context_handler.cc
index f6d7cf6decb..f2ba25fbeb6 100644
--- a/chromium/ui/base/ime/mock_ime_input_context_handler.cc
+++ b/chromium/ui/base/ime/mock_ime_input_context_handler.cc
@@ -5,6 +5,7 @@
#include "ui/base/ime/mock_ime_input_context_handler.h"
#include "base/logging.h"
+#include "base/notreached.h"
#include "base/strings/utf_string_conversions.h"
#include "ui/base/ime/composition_text.h"
#include "ui/base/ime/input_method.h"
@@ -16,8 +17,7 @@ MockIMEInputContextHandler::MockIMEInputContextHandler()
: commit_text_call_count_(0),
set_selection_range_call_count_(0),
update_preedit_text_call_count_(0),
- delete_surrounding_text_call_count_(0),
- last_sent_key_event_(ui::ET_KEY_PRESSED, ui::VKEY_SPACE, 0) {}
+ delete_surrounding_text_call_count_(0) {}
MockIMEInputContextHandler::~MockIMEInputContextHandler() {}
@@ -47,6 +47,14 @@ bool MockIMEInputContextHandler::SetCompositionRange(
return true;
}
+bool MockIMEInputContextHandler::SetAutocorrectRange(
+ const base::string16& autocorrect_text,
+ uint32_t start,
+ uint32_t end) {
+ // TODO(crbug.com/1091088): Implement function.
+ return false;
+}
+
bool MockIMEInputContextHandler::SetSelectionRange(uint32_t start,
uint32_t end) {
++set_selection_range_call_count_;
@@ -72,11 +80,11 @@ void MockIMEInputContextHandler::Reset() {
update_preedit_text_call_count_ = 0;
delete_surrounding_text_call_count_ = 0;
last_commit_text_.clear();
- last_sent_key_event_ = ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_SPACE, 0);
+ sent_key_events_.clear();
}
void MockIMEInputContextHandler::SendKeyEvent(KeyEvent* event) {
- last_sent_key_event_ = *event;
+ sent_key_events_.emplace_back(*event);
}
InputMethod* MockIMEInputContextHandler::GetInputMethod() {
diff --git a/chromium/ui/base/ime/mock_ime_input_context_handler.h b/chromium/ui/base/ime/mock_ime_input_context_handler.h
index e13c67f0b9d..6890e6b538a 100644
--- a/chromium/ui/base/ime/mock_ime_input_context_handler.h
+++ b/chromium/ui/base/ime/mock_ime_input_context_handler.h
@@ -44,6 +44,10 @@ class COMPONENT_EXPORT(UI_BASE_IME) MockIMEInputContextHandler
uint32_t after,
const std::vector<ui::ImeTextSpan>& text_spans) override;
+ bool SetAutocorrectRange(const base::string16& autocorrect_text,
+ uint32_t start,
+ uint32_t end) override;
+
bool SetSelectionRange(uint32_t start, uint32_t end) override;
#endif
@@ -66,6 +70,8 @@ class COMPONENT_EXPORT(UI_BASE_IME) MockIMEInputContextHandler
return delete_surrounding_text_call_count_;
}
+ int send_key_event_call_count() const { return sent_key_events_.size(); }
+
const std::string& last_commit_text() const { return last_commit_text_; }
const UpdateCompositionTextArg& last_update_composition_arg() const {
@@ -76,8 +82,8 @@ class COMPONENT_EXPORT(UI_BASE_IME) MockIMEInputContextHandler
return last_delete_surrounding_text_arg_;
}
- const ui::KeyEvent& last_sent_key_event() const {
- return last_sent_key_event_;
+ const std::vector<ui::KeyEvent>& sent_key_events() const {
+ return sent_key_events_;
}
// Resets all call count.
@@ -89,7 +95,7 @@ class COMPONENT_EXPORT(UI_BASE_IME) MockIMEInputContextHandler
int update_preedit_text_call_count_;
int delete_surrounding_text_call_count_;
std::string last_commit_text_;
- ui::KeyEvent last_sent_key_event_;
+ std::vector<ui::KeyEvent> sent_key_events_;
UpdateCompositionTextArg last_update_composition_arg_;
DeleteSurroundingTextArg last_delete_surrounding_text_arg_;
};
diff --git a/chromium/ui/base/ime/mock_input_method.cc b/chromium/ui/base/ime/mock_input_method.cc
index 17555ca526f..5cd43dd5165 100644
--- a/chromium/ui/base/ime/mock_input_method.cc
+++ b/chromium/ui/base/ime/mock_input_method.cc
@@ -13,8 +13,7 @@
namespace ui {
MockInputMethod::MockInputMethod(internal::InputMethodDelegate* delegate)
- : text_input_client_(NULL), delegate_(delegate) {
-}
+ : text_input_client_(nullptr), delegate_(delegate) {}
MockInputMethod::~MockInputMethod() {
for (InputMethodObserver& observer : observer_list_)
@@ -35,7 +34,7 @@ void MockInputMethod::SetFocusedTextInputClient(TextInputClient* client) {
void MockInputMethod::DetachTextInputClient(TextInputClient* client) {
if (text_input_client_ == client) {
- text_input_client_ = NULL;
+ text_input_client_ = nullptr;
}
}
@@ -129,9 +128,4 @@ MockInputMethod::GetInputMethodKeyboardController() {
return &keyboard_controller_;
}
-const std::vector<std::unique_ptr<ui::KeyEvent>>&
-MockInputMethod::GetKeyEventsForTesting() {
- return key_events_for_testing_;
-}
-
} // namespace ui
diff --git a/chromium/ui/base/ime/mock_input_method.h b/chromium/ui/base/ime/mock_input_method.h
index 2d72e99a4bc..3cbfa920c9a 100644
--- a/chromium/ui/base/ime/mock_input_method.h
+++ b/chromium/ui/base/ime/mock_input_method.h
@@ -61,15 +61,11 @@ class COMPONENT_EXPORT(UI_BASE_IME) MockInputMethod : public InputMethod {
InputMethodKeyboardController* GetInputMethodKeyboardController() override;
private:
- // InputMethod:
- const std::vector<std::unique_ptr<ui::KeyEvent>>& GetKeyEventsForTesting()
- override;
TextInputClient* text_input_client_;
base::ObserverList<InputMethodObserver>::Unchecked observer_list_;
internal::InputMethodDelegate* delegate_;
- std::vector<std::unique_ptr<ui::KeyEvent>> key_events_for_testing_;
InputMethodKeyboardControllerStub keyboard_controller_;
DISALLOW_COPY_AND_ASSIGN(MockInputMethod);
diff --git a/chromium/ui/base/ime/mojom/BUILD.gn b/chromium/ui/base/ime/mojom/BUILD.gn
index dd96cc53288..c69ea02d7a9 100644
--- a/chromium/ui/base/ime/mojom/BUILD.gn
+++ b/chromium/ui/base/ime/mojom/BUILD.gn
@@ -4,11 +4,33 @@
import("//mojo/public/tools/bindings/mojom.gni")
+component("shared_mojom_traits") {
+ output_name = "ime_shared_mojom_traits"
+ defines = [ "IS_IME_SHARED_MOJOM_TRAITS_IMPL" ]
+ sources = [
+ "ime_types_mojom_traits.cc",
+ "ime_types_mojom_traits.h",
+ ]
+ public_deps = [
+ ":mojom_shared",
+ "//ipc:param_traits",
+ "//ui/base/ime:ime_types",
+ ]
+}
+
mojom("mojom") {
generate_java = true
- sources = [ "ime_types.mojom" ]
+ sources = [
+ "ime_types.mojom",
+ "text_input_state.mojom",
+ "virtual_keyboard_types.mojom",
+ ]
- public_deps = [ "//mojo/public/mojom/base" ]
+ public_deps = [
+ "//mojo/public/mojom/base",
+ "//ui/gfx/geometry/mojom",
+ "//ui/gfx/range/mojom",
+ ]
cpp_typemaps = [
{
@@ -26,19 +48,30 @@ mojom("mojom") {
cpp = "::ui::ImeTextSpan::UnderlineStyle"
},
{
+ mojom = "ui.mojom.TextInputAction"
+ cpp = "::ui::TextInputAction"
+ },
+ {
+ mojom = "ui.mojom.TextInputMode"
+ cpp = "::ui::TextInputMode"
+ },
+ {
mojom = "ui.mojom.TextInputType"
cpp = "::ui::TextInputType"
},
]
- traits_sources = [ "ime_types_mojom_traits.cc" ]
traits_headers = [ "ime_types_mojom_traits.h" ]
traits_public_deps = [
- "//ui/base/ime:ime_types",
+ ":shared_mojom_traits",
"//ui/gfx/range",
]
},
]
+ blink_cpp_typemaps = cpp_typemaps
+ export_class_attribute_blink = "BLINK_PLATFORM_EXPORT"
+ export_define_blink = "BLINK_PLATFORM_IMPLEMENTATION=1"
+ export_header_blink = "third_party/blink/public/platform/web_common.h"
}
mojom("test_interfaces") {
diff --git a/chromium/ui/base/ime/mojom/ime_types.mojom b/chromium/ui/base/ime/mojom/ime_types.mojom
index 57b07029fa3..0c04bbfa900 100644
--- a/chromium/ui/base/ime/mojom/ime_types.mojom
+++ b/chromium/ui/base/ime/mojom/ime_types.mojom
@@ -6,6 +6,29 @@ module ui.mojom;
import "mojo/public/mojom/base/string16.mojom";
+enum TextInputMode {
+ kDefault,
+ kNone,
+ kText,
+ kTel,
+ kUrl,
+ kEmail,
+ kNumeric,
+ kDecimal,
+ kSearch,
+};
+
+enum TextInputAction {
+ kDefault,
+ kEnter,
+ kDone,
+ kGo,
+ kNext,
+ kPrevious,
+ kSearch,
+ kSend,
+};
+
// Text input type which is based on blink::WebTextInputType.
enum TextInputType {
NONE,
@@ -34,6 +57,7 @@ enum ImeTextSpanType {
kComposition,
kSuggestion,
kMisspellingSuggestion,
+ kAutocorrect,
};
// This enum represents the thickness of an underline segment of text,
@@ -76,5 +100,6 @@ struct ImeTextSpan {
uint32 background_color;
uint32 suggestion_highlight_color;
bool remove_on_finish_composing;
+ bool interim_char_selection;
array<string> suggestions;
};
diff --git a/chromium/ui/base/ime/mojom/ime_types_mojom_traits.cc b/chromium/ui/base/ime/mojom/ime_types_mojom_traits.cc
index 694959deddd..e09781c80e8 100644
--- a/chromium/ui/base/ime/mojom/ime_types_mojom_traits.cc
+++ b/chromium/ui/base/ime/mojom/ime_types_mojom_traits.cc
@@ -6,6 +6,99 @@
namespace mojo {
+#define UI_TO_MOJO_ACTION_CASE(name) \
+ case ui::TextInputAction::name: \
+ return ui::mojom::TextInputAction::name
+
+// static
+ui::mojom::TextInputAction
+EnumTraits<ui::mojom::TextInputAction, ui::TextInputAction>::ToMojom(
+ ui::TextInputAction text_input_action) {
+ switch (text_input_action) {
+ UI_TO_MOJO_ACTION_CASE(kDefault);
+ UI_TO_MOJO_ACTION_CASE(kEnter);
+ UI_TO_MOJO_ACTION_CASE(kDone);
+ UI_TO_MOJO_ACTION_CASE(kGo);
+ UI_TO_MOJO_ACTION_CASE(kNext);
+ UI_TO_MOJO_ACTION_CASE(kPrevious);
+ UI_TO_MOJO_ACTION_CASE(kSearch);
+ UI_TO_MOJO_ACTION_CASE(kSend);
+ }
+}
+
+#undef UI_TO_MOJO_ACTION_CASE
+
+#define MOJO_TO_UI_ACTION_CASE(name) \
+ case ui::mojom::TextInputAction::name: \
+ *out = ui::TextInputAction::name; \
+ return true;
+
+// static
+bool EnumTraits<ui::mojom::TextInputAction, ui::TextInputAction>::FromMojom(
+ ui::mojom::TextInputAction input,
+ ui::TextInputAction* out) {
+ switch (input) {
+ MOJO_TO_UI_ACTION_CASE(kDefault);
+ MOJO_TO_UI_ACTION_CASE(kEnter);
+ MOJO_TO_UI_ACTION_CASE(kDone);
+ MOJO_TO_UI_ACTION_CASE(kGo);
+ MOJO_TO_UI_ACTION_CASE(kNext);
+ MOJO_TO_UI_ACTION_CASE(kPrevious);
+ MOJO_TO_UI_ACTION_CASE(kSearch);
+ MOJO_TO_UI_ACTION_CASE(kSend);
+ }
+ return false;
+}
+
+#undef MOJO_TO_UI_ACTION_CASE
+
+#define UI_TO_MOJO_MODE_CASE(name, mojo_name) \
+ case ui::TextInputMode::TEXT_INPUT_MODE_##name: \
+ return ui::mojom::TextInputMode::mojo_name
+
+// static
+ui::mojom::TextInputMode
+EnumTraits<ui::mojom::TextInputMode, ui::TextInputMode>::ToMojom(
+ ui::TextInputMode text_input_mode) {
+ switch (text_input_mode) {
+ UI_TO_MOJO_MODE_CASE(DEFAULT, kDefault);
+ UI_TO_MOJO_MODE_CASE(NONE, kNone);
+ UI_TO_MOJO_MODE_CASE(TEXT, kText);
+ UI_TO_MOJO_MODE_CASE(TEL, kTel);
+ UI_TO_MOJO_MODE_CASE(URL, kUrl);
+ UI_TO_MOJO_MODE_CASE(EMAIL, kEmail);
+ UI_TO_MOJO_MODE_CASE(NUMERIC, kNumeric);
+ UI_TO_MOJO_MODE_CASE(DECIMAL, kDecimal);
+ UI_TO_MOJO_MODE_CASE(SEARCH, kSearch);
+ }
+}
+
+#undef UI_TO_MOJO_MODE_CASE
+
+#define MOJO_TO_UI_MODE_CASE(name, mojo_name) \
+ case ui::mojom::TextInputMode::mojo_name: \
+ *out = ui::TextInputMode::TEXT_INPUT_MODE_##name; \
+ return true;
+
+// static
+bool EnumTraits<ui::mojom::TextInputMode, ui::TextInputMode>::FromMojom(
+ ui::mojom::TextInputMode input,
+ ui::TextInputMode* out) {
+ switch (input) {
+ MOJO_TO_UI_MODE_CASE(DEFAULT, kDefault);
+ MOJO_TO_UI_MODE_CASE(NONE, kNone);
+ MOJO_TO_UI_MODE_CASE(TEXT, kText);
+ MOJO_TO_UI_MODE_CASE(TEL, kTel);
+ MOJO_TO_UI_MODE_CASE(URL, kUrl);
+ MOJO_TO_UI_MODE_CASE(EMAIL, kEmail);
+ MOJO_TO_UI_MODE_CASE(NUMERIC, kNumeric);
+ MOJO_TO_UI_MODE_CASE(DECIMAL, kDecimal);
+ MOJO_TO_UI_MODE_CASE(SEARCH, kSearch);
+ }
+}
+
+#undef MOJO_TO_UI_MODE_CASE
+
#define UI_TO_MOJO_TYPE_CASE(name) \
case ui::TEXT_INPUT_TYPE_##name: \
return ui::mojom::TextInputType::name
@@ -97,6 +190,7 @@ bool StructTraits<ui::mojom::ImeTextSpanDataView, ui::ImeTextSpan>::Read(
out->background_color = data.background_color();
out->suggestion_highlight_color = data.suggestion_highlight_color();
out->remove_on_finish_composing = data.remove_on_finish_composing();
+ out->interim_char_selection = data.interim_char_selection();
if (!data.ReadSuggestions(&out->suggestions))
return false;
return true;
@@ -113,6 +207,8 @@ EnumTraits<ui::mojom::ImeTextSpanType, ui::ImeTextSpan::Type>::ToMojom(
return ui::mojom::ImeTextSpanType::kSuggestion;
case ui::ImeTextSpan::Type::kMisspellingSuggestion:
return ui::mojom::ImeTextSpanType::kMisspellingSuggestion;
+ case ui::ImeTextSpan::Type::kAutocorrect:
+ return ui::mojom::ImeTextSpanType::kAutocorrect;
}
NOTREACHED();
@@ -133,6 +229,9 @@ bool EnumTraits<ui::mojom::ImeTextSpanType, ui::ImeTextSpan::Type>::FromMojom(
case ui::mojom::ImeTextSpanType::kMisspellingSuggestion:
*out = ui::ImeTextSpan::Type::kMisspellingSuggestion;
return true;
+ case ui::mojom::ImeTextSpanType::kAutocorrect:
+ *out = ui::ImeTextSpan::Type::kAutocorrect;
+ return true;
}
NOTREACHED();
diff --git a/chromium/ui/base/ime/mojom/ime_types_mojom_traits.h b/chromium/ui/base/ime/mojom/ime_types_mojom_traits.h
index 58d192e2910..50489fadc75 100644
--- a/chromium/ui/base/ime/mojom/ime_types_mojom_traits.h
+++ b/chromium/ui/base/ime/mojom/ime_types_mojom_traits.h
@@ -7,20 +7,41 @@
#include <vector>
+#include "base/component_export.h"
#include "ui/base/ime/ime_text_span.h"
-#include "ui/base/ime/mojom/ime_types.mojom.h"
+#include "ui/base/ime/mojom/ime_types.mojom-shared.h"
+#include "ui/base/ime/text_input_action.h"
+#include "ui/base/ime/text_input_mode.h"
#include "ui/base/ime/text_input_type.h"
namespace mojo {
template <>
-struct EnumTraits<ui::mojom::TextInputType, ui::TextInputType> {
+struct COMPONENT_EXPORT(IME_SHARED_MOJOM_TRAITS)
+ EnumTraits<ui::mojom::TextInputMode, ui::TextInputMode> {
+ static ui::mojom::TextInputMode ToMojom(ui::TextInputMode text_input_mode);
+ static bool FromMojom(ui::mojom::TextInputMode input, ui::TextInputMode* out);
+};
+
+template <>
+struct COMPONENT_EXPORT(IME_SHARED_MOJOM_TRAITS)
+ EnumTraits<ui::mojom::TextInputAction, ui::TextInputAction> {
+ static ui::mojom::TextInputAction ToMojom(
+ ui::TextInputAction text_input_action);
+ static bool FromMojom(ui::mojom::TextInputAction input,
+ ui::TextInputAction* out);
+};
+
+template <>
+struct COMPONENT_EXPORT(IME_SHARED_MOJOM_TRAITS)
+ EnumTraits<ui::mojom::TextInputType, ui::TextInputType> {
static ui::mojom::TextInputType ToMojom(ui::TextInputType text_input_type);
static bool FromMojom(ui::mojom::TextInputType input, ui::TextInputType* out);
};
template <>
-struct StructTraits<ui::mojom::ImeTextSpanDataView, ui::ImeTextSpan> {
+struct COMPONENT_EXPORT(IME_SHARED_MOJOM_TRAITS)
+ StructTraits<ui::mojom::ImeTextSpanDataView, ui::ImeTextSpan> {
static ui::ImeTextSpan::Type type(const ui::ImeTextSpan& c) { return c.type; }
static uint32_t start_offset(const ui::ImeTextSpan& c) {
return c.start_offset;
@@ -46,6 +67,9 @@ struct StructTraits<ui::mojom::ImeTextSpanDataView, ui::ImeTextSpan> {
static bool remove_on_finish_composing(const ui::ImeTextSpan& c) {
return c.remove_on_finish_composing;
}
+ static bool interim_char_selection(const ui::ImeTextSpan& c) {
+ return c.interim_char_selection;
+ }
static std::vector<std::string> suggestions(const ui::ImeTextSpan& c) {
return c.suggestions;
}
@@ -53,7 +77,8 @@ struct StructTraits<ui::mojom::ImeTextSpanDataView, ui::ImeTextSpan> {
};
template <>
-struct EnumTraits<ui::mojom::ImeTextSpanType, ui::ImeTextSpan::Type> {
+struct COMPONENT_EXPORT(IME_SHARED_MOJOM_TRAITS)
+ EnumTraits<ui::mojom::ImeTextSpanType, ui::ImeTextSpan::Type> {
static ui::mojom::ImeTextSpanType ToMojom(
ui::ImeTextSpan::Type ime_text_span_type);
static bool FromMojom(ui::mojom::ImeTextSpanType input,
@@ -61,7 +86,8 @@ struct EnumTraits<ui::mojom::ImeTextSpanType, ui::ImeTextSpan::Type> {
};
template <>
-struct EnumTraits<ui::mojom::ImeTextSpanThickness, ui::ImeTextSpan::Thickness> {
+struct COMPONENT_EXPORT(IME_SHARED_MOJOM_TRAITS)
+ EnumTraits<ui::mojom::ImeTextSpanThickness, ui::ImeTextSpan::Thickness> {
static ui::mojom::ImeTextSpanThickness ToMojom(
ui::ImeTextSpan::Thickness thickness);
static bool FromMojom(ui::mojom::ImeTextSpanThickness input,
@@ -69,8 +95,9 @@ struct EnumTraits<ui::mojom::ImeTextSpanThickness, ui::ImeTextSpan::Thickness> {
};
template <>
-struct EnumTraits<ui::mojom::ImeTextSpanUnderlineStyle,
- ui::ImeTextSpan::UnderlineStyle> {
+struct COMPONENT_EXPORT(IME_SHARED_MOJOM_TRAITS)
+ EnumTraits<ui::mojom::ImeTextSpanUnderlineStyle,
+ ui::ImeTextSpan::UnderlineStyle> {
static ui::mojom::ImeTextSpanUnderlineStyle ToMojom(
ui::ImeTextSpan::UnderlineStyle underline_style);
static bool FromMojom(ui::mojom::ImeTextSpanUnderlineStyle input,
diff --git a/chromium/ui/base/ime/mojom/text_input_state.mojom b/chromium/ui/base/ime/mojom/text_input_state.mojom
new file mode 100644
index 00000000000..63746cb4d67
--- /dev/null
+++ b/chromium/ui/base/ime/mojom/text_input_state.mojom
@@ -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.
+
+module ui.mojom;
+
+import "mojo/public/mojom/base/string16.mojom";
+import "mojo/public/mojom/base/text_direction.mojom";
+import "ui/base/ime/mojom/ime_types.mojom";
+import "ui/base/ime/mojom/virtual_keyboard_types.mojom";
+import "ui/gfx/geometry/mojom/geometry.mojom";
+import "ui/gfx/range/mojom/range.mojom";
+
+// This structure represents the current editing state.
+struct TextInputState {
+ // Type of the input field.
+ ui.mojom.TextInputType type = ui.mojom.TextInputType.NONE;
+
+ // The mode of input field.
+ ui.mojom.TextInputMode mode = ui.mojom.TextInputMode.kDefault;
+
+ // The action of the input field.
+ ui.mojom.TextInputAction action = ui.mojom.TextInputAction.kDefault;
+
+ // The flags of input field (autocorrect, autocomplete, etc.)
+ // See ui/base/ime/text_input_flags.h for definitions.
+ uint32 flags;
+
+ // The value of input field.
+ mojo_base.mojom.String16? value;
+
+ // The current selection range, or the caret position if nothing is selected.
+ gfx.mojom.Range selection;
+
+ // The current composition range if there is one.
+ gfx.mojom.Range? composition;
+
+ // Whether or not inline composition can be performed for the current input.
+ bool can_compose_inline = true;
+
+ // Whether or not the IME should be shown as a result of this update. Even if
+ // true, the IME will only be shown if the input is appropriate (e.g. not
+ // TEXT_INPUT_TYPE_NONE).
+ bool show_ime_if_needed;
+
+ // Whether or not the IME should always be hidden as a result of this update.
+ bool always_hide_ime;
+
+ // Whether or not this is a reply to a request from IME.
+ bool reply_to_request;
+
+ // Store control and selection bounds of EditContext.
+ // These optionals will be nullopts if there isn't any active EditContext.
+ // For non EditContext scenarios, the bounds are returned via
+ // |GetCompositionCharacterBounds|
+ gfx.mojom.Rect? edit_context_control_bounds;
+ gfx.mojom.Rect? edit_context_selection_bounds;
+
+ // The virtualkeyboardpolicy of the input field.
+ ui.mojom.VirtualKeyboardPolicy vk_policy =
+ ui.mojom.VirtualKeyboardPolicy.AUTO;
+
+ // Whether or not show()/hide() API is called from VirtualKeyboard by web
+ // authors when the virtualkeyboardpolicy is manual.
+ ui.mojom.VirtualKeyboardVisibilityRequest last_vk_visibility_request =
+ ui.mojom.VirtualKeyboardVisibilityRequest.NONE;
+};
+
diff --git a/chromium/ui/base/ime/virtual_keyboard_visibility_request.h b/chromium/ui/base/ime/mojom/virtual_keyboard_types.mojom
index 65cee20f299..d1cd8d038f7 100644
--- a/chromium/ui/base/ime/virtual_keyboard_visibility_request.h
+++ b/chromium/ui/base/ime/mojom/virtual_keyboard_types.mojom
@@ -2,20 +2,19 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_BASE_IME_VIRTUAL_KEYBOARD_VISIBILITY_REQUEST_H_
-#define UI_BASE_IME_VIRTUAL_KEYBOARD_VISIBILITY_REQUEST_H_
+module ui.mojom;
-namespace ui {
+// This mode corresponds to virtualkeyboardpolicy
+// https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/master/VirtualKeyboardPolicy/explainer.md
+enum VirtualKeyboardPolicy {
+ AUTO,
+ MANUAL,
+};
// This mode corresponds to VirtualKeyboard API show/hide.
// https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/master/VirtualKeyboardPolicy/explainer.md
-enum class VirtualKeyboardVisibilityRequest {
+enum VirtualKeyboardVisibilityRequest {
SHOW,
HIDE,
NONE,
- MAX = NONE,
};
-
-} // namespace ui
-
-#endif // UI_BASE_IME_VIRTUAL_KEYBOARD_VISIBILITY_REQUEST_H_
diff --git a/chromium/ui/base/ime/text_input_client.h b/chromium/ui/base/ime/text_input_client.h
index 7fc2d584a94..b6302623328 100644
--- a/chromium/ui/base/ime/text_input_client.h
+++ b/chromium/ui/base/ime/text_input_client.h
@@ -217,6 +217,13 @@ class COMPONENT_EXPORT(UI_BASE_IME) TextInputClient {
const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) = 0;
#endif
+#if defined(OS_CHROMEOS)
+ // Set the autocorrect range and return if it has been set correctly as a
+ // boolean value.
+ virtual bool SetAutocorrectRange(const base::string16& autocorrect_text,
+ const gfx::Range& range) = 0;
+#endif
+
#if defined(OS_WIN)
// Returns false if either the focused editable element or the EditContext
// bounds is not available, else it returns true with the control and
diff --git a/chromium/ui/base/ime/win/input_method_win_base.cc b/chromium/ui/base/ime/win/input_method_win_base.cc
index 83850840d83..fc9c8d3a0f2 100644
--- a/chromium/ui/base/ime/win/input_method_win_base.cc
+++ b/chromium/ui/base/ime/win/input_method_win_base.cc
@@ -13,8 +13,6 @@
#include "base/command_line.h"
#include "base/memory/ptr_util.h"
#include "base/win/windows_version.h"
-#include "ui/base/ime/ime_bridge.h"
-#include "ui/base/ime/ime_engine_handler_interface.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/base/ime/win/on_screen_keyboard_display_manager_input_pane.h"
#include "ui/base/ime/win/on_screen_keyboard_display_manager_tab_tip.h"
@@ -237,21 +235,6 @@ ui::EventDispatchDetails InputMethodWinBase::DispatchKeyEvent(
!std::iswcntrl(static_cast<wint_t>(char_msgs[0].wParam)))
event->set_character(static_cast<base::char16>(char_msgs[0].wParam));
- // Dispatches the key events to the Chrome IME extension which is listening to
- // key events on the following two situations:
- // 1) |char_msgs| is empty when the event is non-character key.
- // 2) |char_msgs|.size() == 1 when the event is character key and the WM_CHAR
- // messages have been combined in the event processing flow.
- if (char_msgs.size() <= 1 && GetEngine()) {
- ui::IMEEngineHandlerInterface::KeyEventDoneCallback callback =
- base::BindOnce(&InputMethodWinBase::ProcessKeyEventDone,
- weak_ptr_factory_.GetWeakPtr(),
- base::Owned(new ui::KeyEvent(*event)),
- base::Owned(new std::vector<MSG>(char_msgs)));
- GetEngine()->ProcessKeyEvent(*event, std::move(callback));
- return ui::EventDispatchDetails();
- }
-
return ProcessUnhandledKeyEvent(event, &char_msgs);
}
@@ -506,48 +489,4 @@ ui::EventDispatchDetails InputMethodWinBase::ProcessUnhandledKeyEvent(
return details;
}
-void InputMethodWinBase::UpdateCompositionBoundsForEngine(
- const TextInputClient* client) {
- TextInputType text_input_type = GetTextInputType();
- if (client == GetTextInputClient() &&
- text_input_type != TEXT_INPUT_TYPE_NONE &&
- text_input_type != TEXT_INPUT_TYPE_PASSWORD && GetEngine()) {
- GetEngine()->SetCompositionBounds(GetCompositionBounds(client));
- }
-}
-
-void InputMethodWinBase::ResetEngine() {
- if (GetEngine())
- GetEngine()->Reset();
-}
-
-void InputMethodWinBase::CancelCompositionForEngine() {
- TextInputType text_input_type = GetTextInputType();
- if (text_input_type != TEXT_INPUT_TYPE_NONE &&
- text_input_type != TEXT_INPUT_TYPE_PASSWORD) {
- InputMethodWinBase::ResetEngine();
- }
-}
-
-void InputMethodWinBase::UpdateEngineFocusAndInputContext() {
- if (!ui::IMEBridge::Get()) // IMEBridge could be null for tests.
- return;
-
- const TextInputType old_text_input_type =
- ui::IMEBridge::Get()->GetCurrentInputContext().type;
- ui::IMEEngineHandlerInterface::InputContext context(
- GetTextInputType(), GetTextInputMode(), GetTextInputFlags(),
- ui::TextInputClient::FOCUS_REASON_OTHER, GetClientShouldDoLearning());
- ui::IMEBridge::Get()->SetCurrentInputContext(context);
-
- // Update IME Engine state.
- ui::IMEEngineHandlerInterface* engine = GetEngine();
- if (engine) {
- if (old_text_input_type != ui::TEXT_INPUT_TYPE_NONE)
- engine->FocusOut();
- if (GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE)
- engine->FocusIn(context);
- }
-}
-
} // namespace ui
diff --git a/chromium/ui/base/ime/win/input_method_win_base.h b/chromium/ui/base/ime/win/input_method_win_base.h
index 139d966dc0e..c788c6b5f35 100644
--- a/chromium/ui/base/ime/win/input_method_win_base.h
+++ b/chromium/ui/base/ime/win/input_method_win_base.h
@@ -62,19 +62,6 @@ class COMPONENT_EXPORT(UI_BASE_IME_WIN) InputMethodWinBase
ui::KeyEvent* event,
const std::vector<MSG>* char_msgs);
- // Update composition bounds for Chromium IME extension.
- void UpdateCompositionBoundsForEngine(const TextInputClient* client);
-
- // Reset composition status for Chromium IME extension.
- void ResetEngine();
-
- // Cancel composition for Chromium IME extension.
- void CancelCompositionForEngine();
-
- // Update focus state for Chromium IME extension and update input context in
- // ui::IMEBridge.
- void UpdateEngineFocusAndInputContext();
-
// The toplevel window handle.
const HWND toplevel_window_handle_;
diff --git a/chromium/ui/base/ime/win/input_method_win_imm32.cc b/chromium/ui/base/ime/win/input_method_win_imm32.cc
index 7c0ee3ee966..324a6bc91fb 100644
--- a/chromium/ui/base/ime/win/input_method_win_imm32.cc
+++ b/chromium/ui/base/ime/win/input_method_win_imm32.cc
@@ -12,8 +12,6 @@
#include "base/bind.h"
#include "base/command_line.h"
#include "base/metrics/histogram_macros.h"
-#include "ui/base/ime/ime_bridge.h"
-#include "ui/base/ime/ime_engine_handler_interface.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/base/ime/win/tsf_input_scope.h"
#include "ui/display/win/screen_win.h"
@@ -101,7 +99,6 @@ void InputMethodWinImm32::OnCaretBoundsChanged(const TextInputClient* client) {
if (!IsTextInputClientFocused(client) || !IsWindowFocused(client))
return;
NotifyTextInputCaretBoundsChanged(client);
- InputMethodWinBase::UpdateCompositionBoundsForEngine(client);
if (!enabled_)
return;
@@ -126,13 +123,8 @@ void InputMethodWinImm32::OnCaretBoundsChanged(const TextInputClient* client) {
}
void InputMethodWinImm32::CancelComposition(const TextInputClient* client) {
- if (IsTextInputClientFocused(client)) {
- // |enabled_| == false could be faked, and the engine should rely on the
- // real type get from GetTextInputType().
- InputMethodWinBase::CancelCompositionForEngine();
-
- if (enabled_)
- imm32_manager_.CancelIME(toplevel_window_handle_);
+ if (IsTextInputClientFocused(client) && enabled_) {
+ imm32_manager_.CancelIME(toplevel_window_handle_);
}
}
@@ -326,8 +318,6 @@ void InputMethodWinImm32::RefreshInputLanguage() {
void InputMethodWinImm32::ConfirmCompositionText(bool reset_engine,
bool keep_selection) {
InputMethodBase::ConfirmCompositionText(reset_engine, keep_selection);
- if (reset_engine)
- InputMethodWinBase::ResetEngine();
// Makes sure the native IME app can be informed about the composition is
// cleared, so that it can clean up its internal states.
@@ -339,8 +329,7 @@ void InputMethodWinImm32::UpdateIMEState() {
// Use switch here in case we are going to add more text input types.
// We disable input method in password field.
const HWND window_handle = toplevel_window_handle_;
- const TextInputType text_input_type =
- GetEngine() ? TEXT_INPUT_TYPE_NONE : GetTextInputType();
+ const TextInputType text_input_type = GetTextInputType();
const TextInputMode text_input_mode = GetTextInputMode();
switch (text_input_type) {
case ui::TEXT_INPUT_TYPE_NONE:
@@ -357,8 +346,6 @@ void InputMethodWinImm32::UpdateIMEState() {
imm32_manager_.SetTextInputMode(window_handle, text_input_mode);
tsf_inputscope::SetInputScopeForTsfUnawareWindow(
window_handle, text_input_type, text_input_mode);
-
- InputMethodWinBase::UpdateEngineFocusAndInputContext();
}
} // namespace ui
diff --git a/chromium/ui/base/ime/win/input_method_win_tsf.cc b/chromium/ui/base/ime/win/input_method_win_tsf.cc
index 58926e51a7f..b4e4fcc2e67 100644
--- a/chromium/ui/base/ime/win/input_method_win_tsf.cc
+++ b/chromium/ui/base/ime/win/input_method_win_tsf.cc
@@ -100,7 +100,6 @@ void InputMethodWinTSF::OnTextInputTypeChanged(const TextInputClient* client) {
}
ui::TSFBridge::GetInstance()->CancelComposition();
ui::TSFBridge::GetInstance()->OnTextInputTypeChanged(client);
- InputMethodWinBase::UpdateEngineFocusAndInputContext();
}
void InputMethodWinTSF::OnCaretBoundsChanged(const TextInputClient* client) {
@@ -110,14 +109,12 @@ void InputMethodWinTSF::OnCaretBoundsChanged(const TextInputClient* client) {
}
NotifyTextInputCaretBoundsChanged(client);
ui::TSFBridge::GetInstance()->OnTextLayoutChanged();
- InputMethodWinBase::UpdateCompositionBoundsForEngine(client);
}
void InputMethodWinTSF::CancelComposition(const TextInputClient* client) {
if (ui::TSFBridge::GetInstance() && IsTextInputClientFocused(client) &&
IsWindowFocused(client)) {
ui::TSFBridge::GetInstance()->CancelComposition();
- InputMethodWinBase::CancelCompositionForEngine();
}
}
@@ -181,8 +178,6 @@ void InputMethodWinTSF::ConfirmCompositionText(bool reset_engine,
if (IsTextInputTypeNone())
return;
- if (reset_engine && GetTextInputClient()->HasCompositionText())
- InputMethodWinBase::ResetEngine();
if (ui::TSFBridge::GetInstance())
ui::TSFBridge::GetInstance()->ConfirmComposition();
}
diff --git a/chromium/ui/base/ime/win/on_screen_keyboard_display_manager_input_pane.cc b/chromium/ui/base/ime/win/on_screen_keyboard_display_manager_input_pane.cc
index cf2caabef7d..5c19abd64d6 100644
--- a/chromium/ui/base/ime/win/on_screen_keyboard_display_manager_input_pane.cc
+++ b/chromium/ui/base/ime/win/on_screen_keyboard_display_manager_input_pane.cc
@@ -222,7 +222,7 @@ void OnScreenKeyboardDisplayManagerInputPane::Run() {
// Execute show() or hide() on the background thread after the debounce
// expires.
switch (last_vk_visibility_request_) {
- case VirtualKeyboardVisibilityRequest::SHOW: {
+ case mojom::VirtualKeyboardVisibilityRequest::SHOW: {
background_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(
@@ -231,7 +231,7 @@ void OnScreenKeyboardDisplayManagerInputPane::Run() {
base::RetainedRef(virtual_keyboard_input_pane_), hwnd_));
break;
}
- case VirtualKeyboardVisibilityRequest::HIDE: {
+ case mojom::VirtualKeyboardVisibilityRequest::HIDE: {
background_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(
@@ -240,18 +240,18 @@ void OnScreenKeyboardDisplayManagerInputPane::Run() {
base::RetainedRef(virtual_keyboard_input_pane_), hwnd_));
break;
}
- case VirtualKeyboardVisibilityRequest::NONE: {
+ case mojom::VirtualKeyboardVisibilityRequest::NONE: {
break;
}
}
// Reset the VK visibility state to none so we can keep track of subsequent
// API calls.
- last_vk_visibility_request_ = VirtualKeyboardVisibilityRequest::NONE;
+ last_vk_visibility_request_ = mojom::VirtualKeyboardVisibilityRequest::NONE;
}
bool OnScreenKeyboardDisplayManagerInputPane::DisplayVirtualKeyboard() {
DCHECK(main_task_runner_->BelongsToCurrentThread());
- last_vk_visibility_request_ = VirtualKeyboardVisibilityRequest::SHOW;
+ last_vk_visibility_request_ = mojom::VirtualKeyboardVisibilityRequest::SHOW;
debouncer_->RequestRun(base::BindOnce(
&OnScreenKeyboardDisplayManagerInputPane::Run, base::Unretained(this)));
return true;
@@ -259,7 +259,7 @@ bool OnScreenKeyboardDisplayManagerInputPane::DisplayVirtualKeyboard() {
void OnScreenKeyboardDisplayManagerInputPane::DismissVirtualKeyboard() {
DCHECK(main_task_runner_->BelongsToCurrentThread());
- last_vk_visibility_request_ = VirtualKeyboardVisibilityRequest::HIDE;
+ last_vk_visibility_request_ = mojom::VirtualKeyboardVisibilityRequest::HIDE;
debouncer_->RequestRun(base::BindOnce(
&OnScreenKeyboardDisplayManagerInputPane::Run, base::Unretained(this)));
}
diff --git a/chromium/ui/base/ime/win/on_screen_keyboard_display_manager_input_pane.h b/chromium/ui/base/ime/win/on_screen_keyboard_display_manager_input_pane.h
index 40c8578cb79..68b15c27f21 100644
--- a/chromium/ui/base/ime/win/on_screen_keyboard_display_manager_input_pane.h
+++ b/chromium/ui/base/ime/win/on_screen_keyboard_display_manager_input_pane.h
@@ -18,7 +18,7 @@
#include "base/threading/thread_task_runner_handle.h"
#include "base/win/windows_types.h"
#include "ui/base/ime/input_method_keyboard_controller.h"
-#include "ui/base/ime/virtual_keyboard_visibility_request.h"
+#include "ui/base/ime/mojom/virtual_keyboard_types.mojom-shared.h"
#include "ui/base/ime/win/virtual_keyboard_debounce_timer.h"
#include "ui/gfx/geometry/rect.h"
@@ -47,8 +47,8 @@ class COMPONENT_EXPORT(UI_BASE_IME_WIN)
pane);
// Returns whether show/hide VK API is called from
// InputMethodKeyboardController or not.
- VirtualKeyboardVisibilityRequest GetLastVirtualKeyboardVisibilityRequest()
- const {
+ mojom::VirtualKeyboardVisibilityRequest
+ GetLastVirtualKeyboardVisibilityRequest() const {
return last_vk_visibility_request_;
}
@@ -69,8 +69,8 @@ class COMPONENT_EXPORT(UI_BASE_IME_WIN)
const scoped_refptr<base::SingleThreadTaskRunner> background_task_runner_;
scoped_refptr<VirtualKeyboardInputPane> virtual_keyboard_input_pane_;
bool is_keyboard_visible_;
- VirtualKeyboardVisibilityRequest last_vk_visibility_request_ =
- VirtualKeyboardVisibilityRequest::NONE;
+ mojom::VirtualKeyboardVisibilityRequest last_vk_visibility_request_ =
+ mojom::VirtualKeyboardVisibilityRequest::NONE;
std::unique_ptr<VirtualKeyboardDebounceTimer> debouncer_;
base::WeakPtrFactory<OnScreenKeyboardDisplayManagerInputPane> weak_factory_{
this};
diff --git a/chromium/ui/base/ime/win/on_screen_keyboard_display_manager_tab_tip.h b/chromium/ui/base/ime/win/on_screen_keyboard_display_manager_tab_tip.h
index c32989e65b7..f718926d662 100644
--- a/chromium/ui/base/ime/win/on_screen_keyboard_display_manager_tab_tip.h
+++ b/chromium/ui/base/ime/win/on_screen_keyboard_display_manager_tab_tip.h
@@ -11,7 +11,6 @@
#include "base/observer_list.h"
#include "base/strings/string16.h"
#include "ui/base/ime/input_method_keyboard_controller.h"
-#include "ui/base/ui_base_export.h"
#include "ui/gfx/geometry/rect.h"
namespace ui {
diff --git a/chromium/ui/base/ime/win/tsf_bridge.cc b/chromium/ui/base/ime/win/tsf_bridge.cc
index 778f19bb853..f5c8c7155d4 100644
--- a/chromium/ui/base/ime/win/tsf_bridge.cc
+++ b/chromium/ui/base/ime/win/tsf_bridge.cc
@@ -111,6 +111,10 @@ class TSFBridgeImpl : public TSFBridge {
// An ITfThreadMgr object to be used in focus and document management.
Microsoft::WRL::ComPtr<ITfThreadMgr> thread_manager_;
+ // An ITfInputProcessorProfiles object to be used to get current language
+ // locale profile.
+ Microsoft::WRL::ComPtr<ITfInputProcessorProfiles> input_processor_profiles_;
+
// A map from TextInputType to an editable document for TSF. We use multiple
// TSF documents that have different InputScopes and TSF attributes based on
// the TextInputType associated with the target document. For a TextInputType
@@ -134,6 +138,9 @@ class TSFBridgeImpl : public TSFBridge {
// Handle to ITfKeyTraceEventSink.
DWORD key_trace_sink_cookie_ = 0;
+ // Handle to ITfLanguageProfileNotifySink
+ DWORD language_profile_cookie_ = 0;
+
DISALLOW_COPY_AND_ASSIGN(TSFBridgeImpl);
};
@@ -149,6 +156,11 @@ TSFBridgeImpl::~TSFBridgeImpl() {
if (SUCCEEDED(thread_manager_->QueryInterface(IID_PPV_ARGS(&source)))) {
source->UnadviseSink(key_trace_sink_cookie_);
}
+ Microsoft::WRL::ComPtr<ITfSource> language_source;
+ if (SUCCEEDED(input_processor_profiles_->QueryInterface(
+ IID_PPV_ARGS(&language_source)))) {
+ language_source->UnadviseSink(language_profile_cookie_);
+ }
}
for (TSFDocumentMap::iterator it = tsf_document_map_.begin();
@@ -174,6 +186,13 @@ bool TSFBridgeImpl::Initialize() {
return false;
}
+ if (FAILED(::CoCreateInstance(CLSID_TF_InputProcessorProfiles, nullptr,
+ CLSCTX_ALL,
+ IID_PPV_ARGS(&input_processor_profiles_)))) {
+ DVLOG(1) << "Failed to create InputProcessorProfiles instance.";
+ return false;
+ }
+
if (FAILED(::CoCreateInstance(CLSID_TF_ThreadMgr, nullptr, CLSCTX_ALL,
IID_PPV_ARGS(&thread_manager_)))) {
DVLOG(1) << "Failed to create ThreadManager instance.";
@@ -309,7 +328,8 @@ void TSFBridgeImpl::SetFocusedClient(HWND focused_window,
void TSFBridgeImpl::RemoveFocusedClient(TextInputClient* client) {
DCHECK(base::MessageLoopCurrentForUI::IsSet());
- DCHECK(IsInitialized());
+ if (!IsInitialized())
+ return;
if (client_ != client)
return;
ClearAssociateFocus();
@@ -422,6 +442,21 @@ bool TSFBridgeImpl::CreateDocumentManager(TSFTextStore* text_store,
return false;
}
+ Microsoft::WRL::ComPtr<ITfSource> language_source;
+ if (FAILED(input_processor_profiles_->QueryInterface(
+ IID_PPV_ARGS(&language_source)))) {
+ DVLOG(1) << "Failed to get source_ITfInputProcessorProfiles.";
+ return false;
+ }
+
+ if (FAILED(
+ language_source->AdviseSink(IID_ITfLanguageProfileNotifySink,
+ static_cast<ITfTextEditSink*>(text_store),
+ &language_profile_cookie_))) {
+ DVLOG(1) << "AdviseSink for language profile notify sink failed.";
+ return false;
+ }
+
if (*source_cookie == TF_INVALID_COOKIE) {
DVLOG(1) << "The result of cookie is invalid.";
return false;
diff --git a/chromium/ui/base/ime/win/tsf_text_store.cc b/chromium/ui/base/ime/win/tsf_text_store.cc
index 22f43ff72b0..98ca302320d 100644
--- a/chromium/ui/base/ime/win/tsf_text_store.cc
+++ b/chromium/ui/base/ime/win/tsf_text_store.cc
@@ -11,6 +11,7 @@
#include <algorithm>
+#include "base/logging.h"
#include "base/numerics/ranges.h"
#include "base/win/scoped_variant.h"
#include "ui/base/ime/text_input_client.h"
@@ -80,6 +81,8 @@ HRESULT TSFTextStore::QueryInterface(REFIID iid, void** result) {
*result = static_cast<ITextStoreACP*>(this);
} else if (iid == IID_ITfContextOwnerCompositionSink) {
*result = static_cast<ITfContextOwnerCompositionSink*>(this);
+ } else if (iid == IID_ITfLanguageProfileNotifySink) {
+ *result = static_cast<ITfLanguageProfileNotifySink*>(this);
} else if (iid == IID_ITfTextEditSink) {
*result = static_cast<ITfTextEditSink*>(this);
} else if (iid == IID_ITfKeyTraceEventSink) {
@@ -647,9 +650,7 @@ HRESULT TSFTextStore::RequestLock(DWORD lock_flags, HRESULT* result) {
// 3. User commits current composition text.
if (((new_composition_start > last_composition_start &&
text_input_client_->HasCompositionText()) ||
- (wparam_keydown_fired_ == 0 && !has_composition_range_ &&
- !text_input_client_->HasCompositionText()) ||
- (wparam_keydown_fired_ != 0 && !has_composition_range_)) &&
+ !has_composition_range_) &&
text_input_client_) {
CommitTextAndEndCompositionIfAny(last_composition_start,
new_composition_start);
@@ -694,6 +695,7 @@ HRESULT TSFTextStore::RequestLock(DWORD lock_flags, HRESULT* result) {
// reset the flag since we've already inserted/replaced the text.
new_text_inserted_ = false;
+ is_selection_interim_char_ = false;
// reset string_buffer_ if composition is no longer active.
if (!text_input_client_->HasCompositionText()) {
@@ -760,6 +762,7 @@ HRESULT TSFTextStore::SetSelection(ULONG selection_buffer_size,
}
selection_.set_start(start_pos);
selection_.set_end(end_pos);
+ is_selection_interim_char_ = selection_buffer[0].style.fInterimChar;
}
return S_OK;
}
@@ -829,6 +832,15 @@ HRESULT TSFTextStore::OnEndComposition(ITfCompositionView* composition_view) {
return S_OK;
}
+HRESULT TSFTextStore::OnLanguageChange(LANGID langid, BOOL* pfAccept) {
+ return S_OK;
+}
+HRESULT TSFTextStore::OnLanguageChanged() {
+ if (text_input_client_)
+ text_input_client_->OnInputMethodChanged();
+ return S_OK;
+}
+
HRESULT TSFTextStore::OnKeyTraceDown(WPARAM wParam, LPARAM lParam) {
// fire the event right away if we're in composition
if (has_composition_range_) {
@@ -1052,6 +1064,10 @@ bool TSFTextStore::GetCompositionStatus(
span.end_offset = start_pos + length;
span.underline_color = SK_ColorBLACK;
span.background_color = SK_ColorTRANSPARENT;
+ if (selection_.EqualsIgnoringDirection(
+ gfx::Range(span.start_offset, span.end_offset))) {
+ span.interim_char_selection = is_selection_interim_char_;
+ }
if (has_display_attribute)
GetStyle(display_attribute, &span);
spans->push_back(span);
@@ -1355,8 +1371,11 @@ void TSFTextStore::CommitTextAndEndCompositionIfAny(size_t old_size,
: new_committed_string_size);
// TODO(crbug.com/978678): Unify the behavior of
// |TextInputClient::InsertText(text)| for the empty text.
- if (!new_committed_string.empty())
+ if (!new_committed_string.empty()) {
text_input_client_->InsertText(new_committed_string);
+ } else {
+ text_input_client_->ClearCompositionText();
+ }
// Notify accessibility about this committed composition
text_input_client_->SetActiveCompositionForAccessibility(
replace_text_range_, new_committed_string,
diff --git a/chromium/ui/base/ime/win/tsf_text_store.h b/chromium/ui/base/ime/win/tsf_text_store.h
index 10bbae5a50e..bf02704ffff 100644
--- a/chromium/ui/base/ime/win/tsf_text_store.h
+++ b/chromium/ui/base/ime/win/tsf_text_store.h
@@ -102,6 +102,7 @@ class TextInputClient;
class COMPONENT_EXPORT(UI_BASE_IME_WIN) TSFTextStore
: public ITextStoreACP,
public ITfContextOwnerCompositionSink,
+ public ITfLanguageProfileNotifySink,
public ITfKeyTraceEventSink,
public ITfTextEditSink {
public:
@@ -216,6 +217,10 @@ class COMPONENT_EXPORT(UI_BASE_IME_WIN) TSFTextStore
IFACEMETHODIMP OnEndComposition(
ITfCompositionView* composition_view) override;
+ // ITfLanguageProfileNotifySink:
+ IFACEMETHODIMP OnLanguageChange(LANGID langid, BOOL* pfAccept) override;
+ IFACEMETHODIMP OnLanguageChanged() override;
+
// ITfTextEditSink:
IFACEMETHODIMP OnEndEdit(ITfContext* context,
TfEditCookie read_only_edit_cookie,
@@ -391,6 +396,10 @@ class COMPONENT_EXPORT(UI_BASE_IME_WIN) TSFTextStore
// |selection_.end()|: 4
gfx::Range selection_;
+ // Indicates if the selection is an interim character. Please refer to
+ // https://docs.microsoft.com/en-us/windows/win32/api/textstor/ns-textstor-ts_selectionstyle
+ bool is_selection_interim_char_ = false;
+
// |start_offset| and |end_offset| of |text_spans_| indicates
// the offsets in |string_buffer_document_|.
// Example: "aoi" is committed. There are two underlines in "umi" and "no".
diff --git a/chromium/ui/base/ime/win/tsf_text_store_unittest.cc b/chromium/ui/base/ime/win/tsf_text_store_unittest.cc
index 081809d75a1..4e81d7c1012 100644
--- a/chromium/ui/base/ime/win/tsf_text_store_unittest.cc
+++ b/chromium/ui/base/ime/win/tsf_text_store_unittest.cc
@@ -3394,5 +3394,92 @@ TEST_F(TSFTextStoreTest, RegressionTest7) {
EXPECT_EQ(S_OK, result);
}
+// regression tests for crbug.com/1091069.
+// We should allow inserting empty compositon string to cancel composition.
+class RegressionTest8Callback : public TSFTextStoreTestCallback {
+ public:
+ explicit RegressionTest8Callback(TSFTextStore* text_store)
+ : TSFTextStoreTestCallback(text_store) {}
+
+ HRESULT LockGranted1(DWORD flags) {
+ SetTextTest(0, 0, L"bbbb", S_OK);
+ SetSelectionTest(0, 4, S_OK);
+
+ text_spans()->clear();
+ ImeTextSpan text_span_1;
+ text_span_1.start_offset = 0;
+ text_span_1.end_offset = 4;
+ text_span_1.underline_color = SK_ColorBLACK;
+ text_span_1.thickness = ImeTextSpan::Thickness::kThin;
+ text_span_1.background_color = SK_ColorTRANSPARENT;
+ text_spans()->push_back(text_span_1);
+
+ *edit_flag() = true;
+ *composition_start() = 0;
+ composition_range()->set_start(0);
+ composition_range()->set_end(4);
+ *has_composition_range() = true;
+
+ text_store_->OnKeyTraceDown(65u, 1966081u);
+ return S_OK;
+ }
+
+ void SetCompositionText1(const ui::CompositionText& composition) {
+ EXPECT_EQ(L"bbbb", composition.text);
+ EXPECT_EQ(0u, composition.selection.start());
+ EXPECT_EQ(4u, composition.selection.end());
+ ASSERT_EQ(1u, composition.ime_text_spans.size());
+ EXPECT_EQ(0u, composition.ime_text_spans[0].start_offset);
+ EXPECT_EQ(4u, composition.ime_text_spans[0].end_offset);
+ SetHasCompositionText(true);
+ }
+
+ HRESULT LockGranted2(DWORD flags) {
+ GetTextTest(0, -1, L"bbbb", 4);
+ SetTextTest(0, 4, L"", S_OK);
+
+ text_spans()->clear();
+ *edit_flag() = true;
+ *composition_start() = 0;
+ composition_range()->set_start(0);
+ composition_range()->set_end(0);
+
+ *has_composition_range() = false;
+ text_store_->OnKeyTraceUp(65u, 1966081u);
+ return S_OK;
+ }
+
+ void ClearCompositionText2() { EXPECT_EQ(false, *has_composition_range()); }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(RegressionTest8Callback);
+};
+
+TEST_F(TSFTextStoreTest, RegressionTest8) {
+ RegressionTest8Callback callback(text_store_.get());
+ EXPECT_CALL(text_input_client_, SetCompositionText(_))
+ .WillOnce(
+ Invoke(&callback, &RegressionTest8Callback::SetCompositionText1));
+
+ EXPECT_CALL(text_input_client_, ClearCompositionText())
+ .WillOnce(
+ Invoke(&callback, &RegressionTest8Callback::ClearCompositionText2));
+
+ EXPECT_CALL(*sink_, OnLockGranted(_))
+ .WillOnce(Invoke(&callback, &RegressionTest8Callback::LockGranted1))
+ .WillOnce(Invoke(&callback, &RegressionTest8Callback::LockGranted2));
+
+ ON_CALL(text_input_client_, HasCompositionText())
+ .WillByDefault(
+ Invoke(&callback, &TSFTextStoreTestCallback::HasCompositionText));
+
+ HRESULT result = kInvalidResult;
+ EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result));
+ EXPECT_EQ(S_OK, result);
+ result = kInvalidResult;
+ EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result));
+ EXPECT_EQ(S_OK, result);
+}
+
} // namespace
} // namespace ui
diff --git a/chromium/ui/base/l10n/formatter.cc b/chromium/ui/base/l10n/formatter.cc
index 72ed375005f..e4446d4786f 100644
--- a/chromium/ui/base/l10n/formatter.cc
+++ b/chromium/ui/base/l10n/formatter.cc
@@ -7,9 +7,11 @@
#include <limits.h>
#include <memory>
+#include <ostream>
#include <vector>
#include "base/check.h"
+#include "base/component_export.h"
#include "third_party/icu/source/common/unicode/unistr.h"
#include "third_party/icu/source/i18n/unicode/msgfmt.h"
#include "ui/base/l10n/l10n_util.h"
@@ -17,7 +19,7 @@
namespace ui {
-UI_BASE_EXPORT bool formatter_force_fallback = false;
+COMPONENT_EXPORT(UI_BASE) bool formatter_force_fallback = false;
struct Pluralities {
int id;
diff --git a/chromium/ui/base/l10n/formatter.h b/chromium/ui/base/l10n/formatter.h
index 17ff00e9d2f..7d9478a48f9 100644
--- a/chromium/ui/base/l10n/formatter.h
+++ b/chromium/ui/base/l10n/formatter.h
@@ -10,13 +10,13 @@
#include <memory>
+#include "base/component_export.h"
#include "base/lazy_instance.h"
#include "base/macros.h"
#include "third_party/icu/source/common/unicode/unistr.h"
#include "third_party/icu/source/i18n/unicode/msgfmt.h"
#include "third_party/icu/source/i18n/unicode/plurrule.h"
#include "ui/base/l10n/time_format.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
@@ -87,7 +87,7 @@ class Formatter {
};
// Class to hold all Formatters, intended to be used in a global LazyInstance.
-class UI_BASE_EXPORT FormatterContainer {
+class COMPONENT_EXPORT(UI_BASE) FormatterContainer {
public:
FormatterContainer();
~FormatterContainer();
@@ -112,10 +112,11 @@ class UI_BASE_EXPORT FormatterContainer {
// Windows compilation requires full definition of FormatterContainer before
// LazyInstance<FormatterContainter> may be declared.
-extern UI_BASE_EXPORT base::LazyInstance<FormatterContainer>::Leaky g_container;
+extern COMPONENT_EXPORT(UI_BASE) base::LazyInstance<FormatterContainer>::Leaky
+ g_container;
// For use in unit tests only.
-extern UI_BASE_EXPORT bool formatter_force_fallback;
+extern COMPONENT_EXPORT(UI_BASE) bool formatter_force_fallback;
} // namespace ui
diff --git a/chromium/ui/base/l10n/l10n_font_util.h b/chromium/ui/base/l10n/l10n_font_util.h
index 8036566e879..81dffd348f1 100644
--- a/chromium/ui/base/l10n/l10n_font_util.h
+++ b/chromium/ui/base/l10n/l10n_font_util.h
@@ -5,7 +5,7 @@
#ifndef UI_BASE_L10N_FONT_UTIL_H_
#define UI_BASE_L10N_FONT_UTIL_H_
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
#include "ui/gfx/geometry/size.h"
namespace gfx {
@@ -18,13 +18,16 @@ namespace ui {
// its localized size data and the given font. The width in cols is held in a
// localized string resource identified by |col_resource_id|, the height in the
// same fashion.
-UI_BASE_EXPORT int GetLocalizedContentsWidthForFont(int col_resource_id,
- const gfx::Font& font);
-UI_BASE_EXPORT int GetLocalizedContentsHeightForFont(int row_resource_id,
- const gfx::Font& font);
-UI_BASE_EXPORT gfx::Size GetLocalizedContentsSizeForFont(int col_resource_id,
- int row_resource_id,
- const gfx::Font& font);
+COMPONENT_EXPORT(UI_BASE)
+int GetLocalizedContentsWidthForFont(int col_resource_id,
+ const gfx::Font& font);
+COMPONENT_EXPORT(UI_BASE)
+int GetLocalizedContentsHeightForFont(int row_resource_id,
+ const gfx::Font& font);
+COMPONENT_EXPORT(UI_BASE)
+gfx::Size GetLocalizedContentsSizeForFont(int col_resource_id,
+ int row_resource_id,
+ const gfx::Font& font);
} // namespace ui
diff --git a/chromium/ui/base/l10n/l10n_util.cc b/chromium/ui/base/l10n/l10n_util.cc
index 489cde62132..29deb4da711 100644
--- a/chromium/ui/base/l10n/l10n_util.cc
+++ b/chromium/ui/base/l10n/l10n_util.cc
@@ -45,6 +45,7 @@
#endif
#if defined(OS_WIN)
+#include "base/logging.h"
#include "ui/base/l10n/l10n_util_win.h"
#endif // OS_WIN
diff --git a/chromium/ui/base/l10n/l10n_util.h b/chromium/ui/base/l10n/l10n_util.h
index 21de14825df..6a9af307289 100644
--- a/chromium/ui/base/l10n/l10n_util.h
+++ b/chromium/ui/base/l10n/l10n_util.h
@@ -14,9 +14,9 @@
#include <string>
#include <vector>
+#include "base/component_export.h"
#include "base/strings/string16.h"
#include "build/build_config.h"
-#include "ui/base/ui_base_export.h"
#if defined(OS_MACOSX)
#include "ui/base/l10n/l10n_util_mac.h"
@@ -25,12 +25,13 @@
namespace l10n_util {
// Takes normalized locale as |locale|. Returns language part (before '-').
-UI_BASE_EXPORT std::string GetLanguage(const std::string& locale);
+COMPONENT_EXPORT(UI_BASE) std::string GetLanguage(const std::string& locale);
// This method translates a generic locale name to one of the locally defined
// ones. This method returns true if it succeeds.
-UI_BASE_EXPORT bool CheckAndResolveLocale(const std::string& locale,
- std::string* resolved_locale);
+COMPONENT_EXPORT(UI_BASE)
+bool CheckAndResolveLocale(const std::string& locale,
+ std::string* resolved_locale);
// This method is responsible for determining the locale as defined below. In
// nearly all cases you shouldn't call this, rather use GetApplicationLocale
@@ -42,17 +43,20 @@ UI_BASE_EXPORT bool CheckAndResolveLocale(const std::string& locale,
// a value if there's a corresponding resource DLL for the locale. Otherwise,
// we fall back to en-us. |set_icu_locale| determines whether the resulting
// locale is set as the default ICU locale before returning it.
-UI_BASE_EXPORT std::string GetApplicationLocale(const std::string& pref_locale,
- bool set_icu_locale);
+COMPONENT_EXPORT(UI_BASE)
+std::string GetApplicationLocale(const std::string& pref_locale,
+ bool set_icu_locale);
// Convenience version of GetApplicationLocale() that sets the resulting locale
// as the default ICU locale before returning it.
-UI_BASE_EXPORT std::string GetApplicationLocale(const std::string& pref_locale);
+COMPONENT_EXPORT(UI_BASE)
+std::string GetApplicationLocale(const std::string& pref_locale);
// Returns true if a display name for |locale| is available in the locale
// |display_locale|.
-UI_BASE_EXPORT bool IsLocaleNameTranslated(const char* locale,
- const std::string& display_locale);
+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
@@ -68,25 +72,27 @@ bool IsLocaleSupportedByOS(const std::string& locale);
// in the UI thread.
// If |is_for_ui| is true, U+200F is appended so that it can be
// rendered properly in a RTL Chrome.
-UI_BASE_EXPORT base::string16 GetDisplayNameForLocale(
- const std::string& locale,
- const std::string& display_locale,
- bool is_for_ui,
- bool disallow_default = false);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 GetDisplayNameForLocale(const std::string& locale,
+ const std::string& display_locale,
+ bool is_for_ui,
+ bool disallow_default = false);
// Returns the display name of the |country_code| in |display_locale|.
-UI_BASE_EXPORT base::string16 GetDisplayNameForCountry(
- const std::string& country_code,
- const std::string& display_locale);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 GetDisplayNameForCountry(const std::string& country_code,
+ const std::string& display_locale);
// Converts all - into _, to be consistent with ICU and file system names.
-UI_BASE_EXPORT std::string NormalizeLocale(const std::string& locale);
+COMPONENT_EXPORT(UI_BASE)
+std::string NormalizeLocale(const std::string& locale);
// Produce a vector of parent locales for given locale.
// It includes the current locale in the result.
// sr_Cyrl_RS generates sr_Cyrl_RS, sr_Cyrl and sr.
-UI_BASE_EXPORT void GetParentLocales(const std::string& current_locale,
- std::vector<std::string>* parent_locales);
+COMPONENT_EXPORT(UI_BASE)
+void GetParentLocales(const std::string& current_locale,
+ std::vector<std::string>* parent_locales);
// Checks if a string is plausibly a syntactically-valid locale string,
// for cases where we want the valid input to be a locale string such as
@@ -96,72 +102,81 @@ UI_BASE_EXPORT void GetParentLocales(const std::string& current_locale,
// accepted, but 'z', 'German', 'en-$1', or 'abcd-1234' should not.
// Case-insensitive. Based on BCP 47, see:
// http://unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers
-UI_BASE_EXPORT bool IsValidLocaleSyntax(const std::string& locale);
+COMPONENT_EXPORT(UI_BASE) bool IsValidLocaleSyntax(const std::string& locale);
//
// Mac Note: See l10n_util_mac.h for some NSString versions and other support.
//
// Pulls resource string from the string bundle and returns it.
-UI_BASE_EXPORT std::string GetStringUTF8(int message_id);
-UI_BASE_EXPORT base::string16 GetStringUTF16(int message_id);
+COMPONENT_EXPORT(UI_BASE) std::string GetStringUTF8(int message_id);
+COMPONENT_EXPORT(UI_BASE) base::string16 GetStringUTF16(int message_id);
// Get a resource string and replace $i with replacements[i] for all
// i < replacements.size(). Additionally, $$ is replaced by $.
// If non-NULL |offsets| will be replaced with the start points of the replaced
// strings.
-UI_BASE_EXPORT base::string16 GetStringFUTF16(
- int message_id,
- const std::vector<base::string16>& replacements,
- std::vector<size_t>* offsets);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 GetStringFUTF16(int message_id,
+ const std::vector<base::string16>& replacements,
+ std::vector<size_t>* offsets);
// Convenience wrappers for the above.
-UI_BASE_EXPORT base::string16 GetStringFUTF16(int message_id,
- const base::string16& a);
-UI_BASE_EXPORT base::string16 GetStringFUTF16(int message_id,
- const base::string16& a,
- const base::string16& b);
-UI_BASE_EXPORT base::string16 GetStringFUTF16(int message_id,
- const base::string16& a,
- const base::string16& b,
- const base::string16& c);
-UI_BASE_EXPORT base::string16 GetStringFUTF16(int message_id,
- const base::string16& a,
- const base::string16& b,
- const base::string16& c,
- const base::string16& d);
-UI_BASE_EXPORT base::string16 GetStringFUTF16(int message_id,
- const base::string16& a,
- const base::string16& b,
- const base::string16& c,
- const base::string16& d,
- const base::string16& e);
-UI_BASE_EXPORT std::string GetStringFUTF8(int message_id,
- const base::string16& a);
-UI_BASE_EXPORT std::string GetStringFUTF8(int message_id,
- const base::string16& a,
- const base::string16& b);
-UI_BASE_EXPORT std::string GetStringFUTF8(int message_id,
- const base::string16& a,
- const base::string16& b,
- const base::string16& c);
-UI_BASE_EXPORT std::string GetStringFUTF8(int message_id,
- const base::string16& a,
- const base::string16& b,
- const base::string16& c,
- const base::string16& d);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 GetStringFUTF16(int message_id, const base::string16& a);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 GetStringFUTF16(int message_id,
+ const base::string16& a,
+ const base::string16& b);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 GetStringFUTF16(int message_id,
+ const base::string16& a,
+ const base::string16& b,
+ const base::string16& c);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 GetStringFUTF16(int message_id,
+ const base::string16& a,
+ const base::string16& b,
+ const base::string16& c,
+ const base::string16& d);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 GetStringFUTF16(int message_id,
+ const base::string16& a,
+ const base::string16& b,
+ const base::string16& c,
+ const base::string16& d,
+ const base::string16& e);
+COMPONENT_EXPORT(UI_BASE)
+std::string GetStringFUTF8(int message_id, const base::string16& a);
+COMPONENT_EXPORT(UI_BASE)
+std::string GetStringFUTF8(int message_id,
+ const base::string16& a,
+ const base::string16& b);
+COMPONENT_EXPORT(UI_BASE)
+std::string GetStringFUTF8(int message_id,
+ const base::string16& a,
+ const base::string16& b,
+ const base::string16& c);
+COMPONENT_EXPORT(UI_BASE)
+std::string GetStringFUTF8(int message_id,
+ const base::string16& a,
+ const base::string16& b,
+ const base::string16& c,
+ const base::string16& d);
// Variants that return the offset(s) of the replaced parameters. The
// vector based version returns offsets ordered by parameter. For example if
// invoked with a and b offsets[0] gives the offset for a and offsets[1] the
// offset of b regardless of where the parameters end up in the string.
-UI_BASE_EXPORT base::string16 GetStringFUTF16(int message_id,
- const base::string16& a,
- size_t* offset);
-UI_BASE_EXPORT base::string16 GetStringFUTF16(int message_id,
- const base::string16& a,
- const base::string16& b,
- std::vector<size_t>* offsets);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 GetStringFUTF16(int message_id,
+ const base::string16& a,
+ size_t* offset);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 GetStringFUTF16(int message_id,
+ const base::string16& a,
+ const base::string16& b,
+ std::vector<size_t>* offsets);
// Convenience functions to get a string with a single integer as a parameter.
// The result will use non-ASCII(native) digits if required by a locale
@@ -174,7 +189,8 @@ UI_BASE_EXPORT base::string16 GetStringFUTF16(int message_id,
// // Note that native digits have to be used in UI in general.
// base::{Int*,Double}ToString convert a number to a string with
// ASCII digits in non-UI strings.
-UI_BASE_EXPORT base::string16 GetStringFUTF16Int(int message_id, int a);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 GetStringFUTF16Int(int message_id, int a);
base::string16 GetStringFUTF16Int(int message_id, int64_t a);
// Convenience functions to format a string with a single number that requires
@@ -188,45 +204,51 @@ base::string16 GetStringFUTF16Int(int message_id, int64_t a);
// double, time, string; e.g. "At 3:45 on Feb 3, 2016, 5 files are downloaded
// at 3 MB/s."), use base::i18n::MessageFormatter.
// message_format_unittests.cc also has more examples of plural formatting.
-UI_BASE_EXPORT base::string16 GetPluralStringFUTF16(int message_id, int number);
-UI_BASE_EXPORT std::string GetPluralStringFUTF8(int message_id, int number);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 GetPluralStringFUTF16(int message_id, int number);
+COMPONENT_EXPORT(UI_BASE)
+std::string GetPluralStringFUTF8(int message_id, int number);
// Get a string when you only care about 'single vs multiple' distinction.
// The message pointed to by |message_id| should be in ICU syntax
// (see the references above for Plural) with 'single', 'multiple', and
// 'other' (fallback) instead of 'male', 'female', and 'other' (fallback).
-UI_BASE_EXPORT base::string16 GetSingleOrMultipleStringUTF16(int message_id,
- bool is_multiple);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 GetSingleOrMultipleStringUTF16(int message_id, bool is_multiple);
// In place sorting of base::string16 strings using collation rules for
// |locale|.
-UI_BASE_EXPORT void SortStrings16(const std::string& locale,
- std::vector<base::string16>* strings);
+COMPONENT_EXPORT(UI_BASE)
+void SortStrings16(const std::string& locale,
+ std::vector<base::string16>* strings);
// Returns a vector of available locale codes. E.g., a vector containing
// en-US, es, fr, fi, pt-PT, pt-BR, etc.
-UI_BASE_EXPORT const std::vector<std::string>& GetAvailableLocales();
+COMPONENT_EXPORT(UI_BASE) const std::vector<std::string>& GetAvailableLocales();
// Returns a vector of locale codes usable for accept-languages.
-UI_BASE_EXPORT void GetAcceptLanguagesForLocale(
- const std::string& display_locale,
- std::vector<std::string>* locale_codes);
+COMPONENT_EXPORT(UI_BASE)
+void GetAcceptLanguagesForLocale(const std::string& display_locale,
+ std::vector<std::string>* locale_codes);
// Returns a vector of untranslated locale codes usable for accept-languages.
-UI_BASE_EXPORT void GetAcceptLanguages(std::vector<std::string>* locale_codes);
+COMPONENT_EXPORT(UI_BASE)
+void GetAcceptLanguages(std::vector<std::string>* locale_codes);
// Returns true if |locale| is in a predefined AcceptLanguageList and
// a display name for the |locale| is available in the locale |display_locale|.
-UI_BASE_EXPORT bool IsLanguageAccepted(const std::string& display_locale,
- const std::string& locale);
+COMPONENT_EXPORT(UI_BASE)
+bool IsLanguageAccepted(const std::string& display_locale,
+ const std::string& locale);
// Returns the preferred size of the contents view of a window based on
// designer given constraints which might dependent on the language used.
-UI_BASE_EXPORT int GetLocalizedContentsWidthInPixels(int pixel_resource_id);
+COMPONENT_EXPORT(UI_BASE)
+int GetLocalizedContentsWidthInPixels(int pixel_resource_id);
-UI_BASE_EXPORT const char* const* GetAcceptLanguageListForTesting();
+COMPONENT_EXPORT(UI_BASE) const char* const* GetAcceptLanguageListForTesting();
-UI_BASE_EXPORT size_t GetAcceptLanguageListSizeForTesting();
+COMPONENT_EXPORT(UI_BASE) size_t GetAcceptLanguageListSizeForTesting();
} // namespace l10n_util
diff --git a/chromium/ui/base/l10n/l10n_util_android.h b/chromium/ui/base/l10n/l10n_util_android.h
index 38592e9c58e..23fd7b1a937 100644
--- a/chromium/ui/base/l10n/l10n_util_android.h
+++ b/chromium/ui/base/l10n/l10n_util_android.h
@@ -9,16 +9,16 @@
#include <string>
+#include "base/component_export.h"
#include "base/strings/string16.h"
-#include "ui/base/ui_base_export.h"
namespace l10n_util {
-UI_BASE_EXPORT base::string16 GetDisplayNameForLocale(
- const std::string& locale,
- const std::string& display_locale);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 GetDisplayNameForLocale(const std::string& locale,
+ const std::string& display_locale);
-UI_BASE_EXPORT bool IsLayoutRtl();
+COMPONENT_EXPORT(UI_BASE) bool IsLayoutRtl();
} // namespace l10n_util
diff --git a/chromium/ui/base/l10n/l10n_util_collator.h b/chromium/ui/base/l10n/l10n_util_collator.h
index db3fa11481a..a6ac539ccfd 100644
--- a/chromium/ui/base/l10n/l10n_util_collator.h
+++ b/chromium/ui/base/l10n/l10n_util_collator.h
@@ -13,9 +13,9 @@
#include <string>
#include <vector>
+#include "base/component_export.h"
#include "base/i18n/string_compare.h"
#include "third_party/icu/source/i18n/unicode/coll.h"
-#include "ui/base/ui_base_export.h"
namespace l10n_util {
@@ -105,7 +105,8 @@ class StringComparator {
// Specialization of operator() method for base::string16 version.
template <>
-UI_BASE_EXPORT inline bool StringComparator<base::string16>::operator()(
+COMPONENT_EXPORT(UI_BASE)
+inline bool StringComparator<base::string16>::operator()(
const base::string16& lhs,
const base::string16& rhs) const {
// If we can not get collator instance for specified locale, just do simple
diff --git a/chromium/ui/base/l10n/l10n_util_mac.h b/chromium/ui/base/l10n/l10n_util_mac.h
index 9d7c42e19e4..0d9cb8683b3 100644
--- a/chromium/ui/base/l10n/l10n_util_mac.h
+++ b/chromium/ui/base/l10n/l10n_util_mac.h
@@ -10,8 +10,8 @@
#include <string>
#include <vector>
+#include "base/component_export.h"
#include "base/strings/string16.h"
-#include "ui/base/ui_base_export.h"
#ifdef __OBJC__
@class NSString;
@@ -27,77 +27,88 @@ namespace l10n_util {
// language and script by the - token and reformatted as
// "$lowercase_language ($UPPERCASE_SCRIPT)". If the - token is not found, the
// lowercase version of |locale| will be returned.
-UI_BASE_EXPORT base::string16 GetDisplayNameForLocale(
- const std::string& locale,
- const std::string& display_locale);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 GetDisplayNameForLocale(const std::string& locale,
+ const std::string& display_locale);
// Remove the Windows-style accelerator marker (for labels, menuitems, etc.)
// and change "..." into an ellipsis.
// Returns the result in an autoreleased NSString.
-UI_BASE_EXPORT NSString* FixUpWindowsStyleLabel(const base::string16& label);
+COMPONENT_EXPORT(UI_BASE)
+NSString* FixUpWindowsStyleLabel(const base::string16& label);
// Pulls resource string from the string bundle and returns it.
-UI_BASE_EXPORT NSString* GetNSString(int message_id);
+COMPONENT_EXPORT(UI_BASE) NSString* GetNSString(int message_id);
// Get a resource string and replace $1-$2-$3 with |a| and |b|
// respectively. Additionally, $$ is replaced by $.
-UI_BASE_EXPORT NSString* GetNSStringF(int message_id, const base::string16& a);
-UI_BASE_EXPORT NSString* GetNSStringF(int message_id,
- const base::string16& a,
- const base::string16& b);
-UI_BASE_EXPORT NSString* GetNSStringF(int message_id,
- const base::string16& a,
- const base::string16& b,
- const base::string16& c);
-UI_BASE_EXPORT NSString* GetNSStringF(int message_id,
- const base::string16& a,
- const base::string16& b,
- const base::string16& c,
- const base::string16& d);
-UI_BASE_EXPORT NSString* GetNSStringF(int message_id,
- const base::string16& a,
- const base::string16& b,
- const base::string16& c,
- const base::string16& d,
- const base::string16& e);
+COMPONENT_EXPORT(UI_BASE)
+NSString* GetNSStringF(int message_id, const base::string16& a);
+COMPONENT_EXPORT(UI_BASE)
+NSString* GetNSStringF(int message_id,
+ const base::string16& a,
+ const base::string16& b);
+COMPONENT_EXPORT(UI_BASE)
+NSString* GetNSStringF(int message_id,
+ const base::string16& a,
+ const base::string16& b,
+ const base::string16& c);
+COMPONENT_EXPORT(UI_BASE)
+NSString* GetNSStringF(int message_id,
+ const base::string16& a,
+ const base::string16& b,
+ const base::string16& c,
+ const base::string16& d);
+COMPONENT_EXPORT(UI_BASE)
+NSString* GetNSStringF(int message_id,
+ const base::string16& a,
+ const base::string16& b,
+ const base::string16& c,
+ const base::string16& d,
+ const base::string16& e);
// Variants that return the offset(s) of the replaced parameters. (See
// app/l10n_util.h for more details.)
-UI_BASE_EXPORT NSString* GetNSStringF(int message_id,
- const base::string16& a,
- const base::string16& b,
- std::vector<size_t>* offsets);
+COMPONENT_EXPORT(UI_BASE)
+NSString* GetNSStringF(int message_id,
+ const base::string16& a,
+ const base::string16& b,
+ std::vector<size_t>* offsets);
// Same as GetNSString, but runs the result through FixUpWindowsStyleLabel
// before returning it.
-UI_BASE_EXPORT NSString* GetNSStringWithFixup(int message_id);
+COMPONENT_EXPORT(UI_BASE) NSString* GetNSStringWithFixup(int message_id);
// Same as GetNSStringF, but runs the result through FixUpWindowsStyleLabel
// before returning it.
-UI_BASE_EXPORT NSString* GetNSStringFWithFixup(int message_id,
- const base::string16& a);
-UI_BASE_EXPORT NSString* GetNSStringFWithFixup(int message_id,
- const base::string16& a,
- const base::string16& b);
-UI_BASE_EXPORT NSString* GetNSStringFWithFixup(int message_id,
- const base::string16& a,
- const base::string16& b,
- const base::string16& c);
-UI_BASE_EXPORT NSString* GetNSStringFWithFixup(int message_id,
- const base::string16& a,
- const base::string16& b,
- const base::string16& c,
- const base::string16& d);
+COMPONENT_EXPORT(UI_BASE)
+NSString* GetNSStringFWithFixup(int message_id, const base::string16& a);
+COMPONENT_EXPORT(UI_BASE)
+NSString* GetNSStringFWithFixup(int message_id,
+ const base::string16& a,
+ const base::string16& b);
+COMPONENT_EXPORT(UI_BASE)
+NSString* GetNSStringFWithFixup(int message_id,
+ const base::string16& a,
+ const base::string16& b,
+ const base::string16& c);
+COMPONENT_EXPORT(UI_BASE)
+NSString* GetNSStringFWithFixup(int message_id,
+ const base::string16& a,
+ const base::string16& b,
+ const base::string16& c,
+ const base::string16& d);
// Get a resource string using |number| with a locale-specific plural rule.
// |message_id| points to a message in the ICU syntax.
// See http://userguide.icu-project.org/formatparse/messages and
// go/plurals (Google internal).
-UI_BASE_EXPORT NSString* GetPluralNSStringF(int message_id, int number);
+COMPONENT_EXPORT(UI_BASE)
+NSString* GetPluralNSStringF(int message_id, int number);
// Support the override of the locale with the value from Cocoa.
-UI_BASE_EXPORT void OverrideLocaleWithCocoaLocale();
-UI_BASE_EXPORT const std::string& GetLocaleOverride();
+COMPONENT_EXPORT(UI_BASE) void OverrideLocaleWithCocoaLocale();
+COMPONENT_EXPORT(UI_BASE) const std::string& GetLocaleOverride();
} // namespace l10n_util
diff --git a/chromium/ui/base/l10n/l10n_util_win.h b/chromium/ui/base/l10n/l10n_util_win.h
index a245ec91764..70a7be88046 100644
--- a/chromium/ui/base/l10n/l10n_util_win.h
+++ b/chromium/ui/base/l10n/l10n_util_win.h
@@ -9,8 +9,8 @@
#include <string>
#include <vector>
+#include "base/component_export.h"
#include "base/strings/string16.h"
-#include "ui/base/ui_base_export.h"
namespace l10n_util {
@@ -19,17 +19,17 @@ namespace l10n_util {
// (e.g. WS_EX_LAYOUTRTL, WS_EX_RTLREADING, etc.) when creating a window.
// Callers should OR this value into their extended style value when creating
// a window.
-UI_BASE_EXPORT int GetExtendedStyles();
+COMPONENT_EXPORT(UI_BASE) int GetExtendedStyles();
// TODO(xji):
// This is a temporary name, it will eventually replace GetExtendedStyles
-UI_BASE_EXPORT int GetExtendedTooltipStyles();
+COMPONENT_EXPORT(UI_BASE) int GetExtendedTooltipStyles();
// Give an HWND, this function sets the WS_EX_LAYOUTRTL extended style for the
// underlying window. When this style is set, the UI for the window is going to
// be mirrored. This is generally done for the UI of right-to-left languages
// such as Hebrew.
-UI_BASE_EXPORT void HWNDSetRTLLayout(HWND hwnd);
+COMPONENT_EXPORT(UI_BASE) void HWNDSetRTLLayout(HWND hwnd);
// See http://blogs.msdn.com/oldnewthing/archive/2005/09/15/467598.aspx
// and http://blogs.msdn.com/oldnewthing/archive/2006/06/26/647365.aspx
@@ -40,18 +40,18 @@ UI_BASE_EXPORT void HWNDSetRTLLayout(HWND hwnd);
// override_font_family and font_size_scaler are not null, they'll be
// filled with the font family name and the size scaler. The output
// parameters are not modified if the return value is false.
-UI_BASE_EXPORT bool NeedOverrideDefaultUIFont(
- base::string16* override_font_family,
- double* font_size_scaler);
+COMPONENT_EXPORT(UI_BASE)
+bool NeedOverrideDefaultUIFont(base::string16* override_font_family,
+ double* font_size_scaler);
// Allow processes to override the configured locale with the user's Windows UI
// languages. This function should generally be called once early in
// Application startup.
-UI_BASE_EXPORT void OverrideLocaleWithUILanguageList();
+COMPONENT_EXPORT(UI_BASE) void OverrideLocaleWithUILanguageList();
// Retrieve the locale override, or an empty vector if the locale has not been
// or failed to be overridden.
-UI_BASE_EXPORT const std::vector<std::string>& GetLocaleOverrides();
+COMPONENT_EXPORT(UI_BASE) const std::vector<std::string>& GetLocaleOverrides();
} // namespace l10n_util
diff --git a/chromium/ui/base/l10n/time_format.cc b/chromium/ui/base/l10n/time_format.cc
index c5a98fc850d..25b4336923f 100644
--- a/chromium/ui/base/l10n/time_format.cc
+++ b/chromium/ui/base/l10n/time_format.cc
@@ -7,6 +7,7 @@
#include <limits>
#include "base/check_op.h"
+#include "base/component_export.h"
#include "base/lazy_instance.h"
#include "base/notreached.h"
#include "base/strings/string_util.h"
@@ -14,7 +15,6 @@
#include "third_party/icu/source/common/unicode/unistr.h"
#include "ui/base/l10n/formatter.h"
#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/ui_base_export.h"
#include "ui/strings/grit/ui_strings.h"
using base::TimeDelta;
@@ -22,7 +22,8 @@ using ui::TimeFormat;
namespace ui {
-UI_BASE_EXPORT base::LazyInstance<FormatterContainer>::Leaky g_container =
+COMPONENT_EXPORT(UI_BASE)
+base::LazyInstance<FormatterContainer>::Leaky g_container =
LAZY_INSTANCE_INITIALIZER;
// static
diff --git a/chromium/ui/base/l10n/time_format.h b/chromium/ui/base/l10n/time_format.h
index 69617a66ddf..d1691441eb2 100644
--- a/chromium/ui/base/l10n/time_format.h
+++ b/chromium/ui/base/l10n/time_format.h
@@ -5,9 +5,9 @@
#ifndef UI_BASE_L10N_TIME_FORMAT_H_
#define UI_BASE_L10N_TIME_FORMAT_H_
+#include "base/component_export.h"
#include "base/macros.h"
#include "base/strings/string16.h"
-#include "ui/base/ui_base_export.h"
namespace base {
class Time;
@@ -17,7 +17,7 @@ class TimeDelta;
namespace ui {
// Methods to format time values as strings.
-class UI_BASE_EXPORT TimeFormat {
+class COMPONENT_EXPORT(UI_BASE) TimeFormat {
public:
enum Format {
FORMAT_DURATION, // Plain duration, e.g. in English: "2 minutes".
diff --git a/chromium/ui/base/layout.cc b/chromium/ui/base/layout.cc
index fce80d356ce..d984586ceee 100644
--- a/chromium/ui/base/layout.cc
+++ b/chromium/ui/base/layout.cc
@@ -22,13 +22,13 @@ namespace ui {
namespace {
-std::vector<ScaleFactor>* g_supported_scale_factors = NULL;
+std::vector<ScaleFactor>* g_supported_scale_factors = nullptr;
} // namespace
void SetSupportedScaleFactors(
const std::vector<ui::ScaleFactor>& scale_factors) {
- if (g_supported_scale_factors != NULL)
+ if (g_supported_scale_factors != nullptr)
delete g_supported_scale_factors;
g_supported_scale_factors = new std::vector<ScaleFactor>(scale_factors);
@@ -49,12 +49,12 @@ void SetSupportedScaleFactors(
}
const std::vector<ScaleFactor>& GetSupportedScaleFactors() {
- DCHECK(g_supported_scale_factors != NULL);
+ DCHECK(g_supported_scale_factors != nullptr);
return *g_supported_scale_factors;
}
ScaleFactor GetSupportedScaleFactor(float scale) {
- DCHECK(g_supported_scale_factors != NULL);
+ DCHECK(g_supported_scale_factors != nullptr);
ScaleFactor closest_match = SCALE_FACTOR_100P;
float smallest_diff = std::numeric_limits<float>::max();
for (size_t i = 0; i < g_supported_scale_factors->size(); ++i) {
@@ -85,7 +85,7 @@ ScopedSetSupportedScaleFactors::ScopedSetSupportedScaleFactors(
original_scale_factors_ =
new std::vector<ScaleFactor>(*g_supported_scale_factors);
} else {
- original_scale_factors_ = NULL;
+ original_scale_factors_ = nullptr;
}
SetSupportedScaleFactors(new_scale_factors);
}
@@ -96,7 +96,7 @@ ScopedSetSupportedScaleFactors::~ScopedSetSupportedScaleFactors() {
delete original_scale_factors_;
} else {
delete g_supported_scale_factors;
- g_supported_scale_factors = NULL;
+ g_supported_scale_factors = nullptr;
}
}
diff --git a/chromium/ui/base/layout.h b/chromium/ui/base/layout.h
index fd2627bbc50..e25289b3a48 100644
--- a/chromium/ui/base/layout.h
+++ b/chromium/ui/base/layout.h
@@ -7,10 +7,10 @@
#include <vector>
+#include "base/component_export.h"
#include "base/macros.h"
#include "build/build_config.h"
#include "ui/base/resource/scale_factor.h"
-#include "ui/base/ui_base_export.h"
#include "ui/gfx/native_widget_types.h"
namespace ui {
@@ -18,29 +18,32 @@ namespace ui {
// Changes the value of GetSupportedScaleFactors() to |scale_factors|.
// Use ScopedSetSupportedScaleFactors for unit tests as not to affect the
// state of other tests.
-UI_BASE_EXPORT void SetSupportedScaleFactors(
- const std::vector<ScaleFactor>& scale_factors);
+COMPONENT_EXPORT(UI_BASE)
+void SetSupportedScaleFactors(const std::vector<ScaleFactor>& scale_factors);
// Returns a vector with the scale factors which are supported by this
// platform, in ascending order.
-UI_BASE_EXPORT const std::vector<ScaleFactor>& GetSupportedScaleFactors();
+COMPONENT_EXPORT(UI_BASE)
+const std::vector<ScaleFactor>& GetSupportedScaleFactors();
// Returns the supported ScaleFactor which most closely matches |scale|.
// Converting from float to ScaleFactor is inefficient and should be done as
// little as possible.
-UI_BASE_EXPORT ScaleFactor GetSupportedScaleFactor(float image_scale);
+COMPONENT_EXPORT(UI_BASE)
+ScaleFactor GetSupportedScaleFactor(float image_scale);
// Returns the ScaleFactor used by |view|.
-UI_BASE_EXPORT float GetScaleFactorForNativeView(gfx::NativeView view);
+COMPONENT_EXPORT(UI_BASE)
+float GetScaleFactorForNativeView(gfx::NativeView view);
// Returns true if the scale passed in is the list of supported scales for
// the platform.
-UI_BASE_EXPORT bool IsSupportedScale(float scale);
+COMPONENT_EXPORT(UI_BASE) bool IsSupportedScale(float scale);
namespace test {
// Class which changes the value of GetSupportedScaleFactors() to
// |new_scale_factors| for the duration of its lifetime.
-class UI_BASE_EXPORT ScopedSetSupportedScaleFactors {
+class COMPONENT_EXPORT(UI_BASE) ScopedSetSupportedScaleFactors {
public:
explicit ScopedSetSupportedScaleFactors(
const std::vector<ui::ScaleFactor>& new_scale_factors);
diff --git a/chromium/ui/base/models/button_menu_item_model.h b/chromium/ui/base/models/button_menu_item_model.h
index eabf45695aa..7772052fda8 100644
--- a/chromium/ui/base/models/button_menu_item_model.h
+++ b/chromium/ui/base/models/button_menu_item_model.h
@@ -8,16 +8,16 @@
#include <vector>
#include "base/compiler_specific.h"
+#include "base/component_export.h"
#include "base/macros.h"
#include "base/strings/string16.h"
#include "ui/base/accelerators/accelerator.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
// A model representing the rows of buttons that should be inserted in a button
// containing menu item.
-class UI_BASE_EXPORT ButtonMenuItemModel {
+class COMPONENT_EXPORT(UI_BASE) ButtonMenuItemModel {
public:
// Types of buttons.
enum ButtonType {
@@ -26,7 +26,7 @@ class UI_BASE_EXPORT ButtonMenuItemModel {
TYPE_BUTTON_LABEL
};
- class UI_BASE_EXPORT Delegate : public AcceleratorProvider {
+ class COMPONENT_EXPORT(UI_BASE) Delegate : public AcceleratorProvider {
public:
// Some command ids have labels that change over time.
virtual bool IsItemForCommandIdDynamic(int command_id) const;
diff --git a/chromium/ui/base/models/combobox_model.cc b/chromium/ui/base/models/combobox_model.cc
index c6913da55e5..a6a311fc465 100644
--- a/chromium/ui/base/models/combobox_model.cc
+++ b/chromium/ui/base/models/combobox_model.cc
@@ -4,9 +4,27 @@
#include "ui/base/models/combobox_model.h"
+#include "ui/base/models/image_model.h"
+
namespace ui {
-bool ComboboxModel::IsItemSeparatorAt(int index) {
+base::string16 ComboboxModel::GetDropDownTextAt(int index) const {
+ return GetItemAt(index);
+}
+
+base::string16 ComboboxModel::GetDropDownSecondaryTextAt(int index) const {
+ return base::string16();
+}
+
+ImageModel ComboboxModel::GetIconAt(int index) const {
+ return ui::ImageModel();
+}
+
+ImageModel ComboboxModel::GetDropDownIconAt(int index) const {
+ return GetIconAt(index);
+}
+
+bool ComboboxModel::IsItemSeparatorAt(int index) const {
return false;
}
diff --git a/chromium/ui/base/models/combobox_model.h b/chromium/ui/base/models/combobox_model.h
index 2fcd7b69029..994ac2bbef7 100644
--- a/chromium/ui/base/models/combobox_model.h
+++ b/chromium/ui/base/models/combobox_model.h
@@ -5,15 +5,16 @@
#ifndef UI_BASE_MODELS_COMBOBOX_MODEL_H_
#define UI_BASE_MODELS_COMBOBOX_MODEL_H_
+#include "base/component_export.h"
#include "base/strings/string16.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
class ComboboxModelObserver;
+class ImageModel;
// A data model for a combo box.
-class UI_BASE_EXPORT ComboboxModel {
+class COMPONENT_EXPORT(UI_BASE) ComboboxModel {
public:
virtual ~ComboboxModel() {}
@@ -21,11 +22,27 @@ class UI_BASE_EXPORT ComboboxModel {
virtual int GetItemCount() const = 0;
// Returns the string at the specified index.
- virtual base::string16 GetItemAt(int index) = 0;
+ virtual base::string16 GetItemAt(int index) const = 0;
+
+ // Returns the string to be shown in the dropdown for the item at |index|. By
+ // default, it returns GetItemAt(index).
+ virtual base::string16 GetDropDownTextAt(int index) const;
+
+ // Returns the secondary string at the specified index. Secondary strings are
+ // displayed in a second line inside every menu item.
+ virtual base::string16 GetDropDownSecondaryTextAt(int index) const;
+
+ // Gets the icon for the item at the specified index. ImageModel is empty if
+ // there is no icon.
+ virtual ImageModel GetIconAt(int index) const;
+
+ // Gets the icon for the item at |index|. ImageModel is empty if there is no
+ // icon. By default, it returns GetIconAt(index).
+ virtual ImageModel GetDropDownIconAt(int index) const;
// Should return true if the item at |index| is a non-selectable separator
// item.
- virtual bool IsItemSeparatorAt(int index);
+ virtual bool IsItemSeparatorAt(int index) const;
// The index of the item that is selected by default (before user
// interaction).
diff --git a/chromium/ui/base/models/combobox_model_observer.h b/chromium/ui/base/models/combobox_model_observer.h
index 42d15bdc0e0..5e00ab68a0c 100644
--- a/chromium/ui/base/models/combobox_model_observer.h
+++ b/chromium/ui/base/models/combobox_model_observer.h
@@ -5,15 +5,16 @@
#ifndef UI_BASE_MODELS_COMBOBOX_MODEL_OBSERVER_H_
#define UI_BASE_MODELS_COMBOBOX_MODEL_OBSERVER_H_
+#include "base/component_export.h"
#include "base/observer_list_types.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
class ComboboxModel;
// Observer for the ComboboxModel.
-class UI_BASE_EXPORT ComboboxModelObserver : public base::CheckedObserver {
+class COMPONENT_EXPORT(UI_BASE) ComboboxModelObserver
+ : public base::CheckedObserver {
public:
// Invoked when |model| has changed in some way. The observer should assume
// everything changed.
diff --git a/chromium/ui/base/models/image_model.cc b/chromium/ui/base/models/image_model.cc
index 501f8dc9495..9578759666b 100644
--- a/chromium/ui/base/models/image_model.cc
+++ b/chromium/ui/base/models/image_model.cc
@@ -84,6 +84,14 @@ bool ImageModel::IsImage() const {
return image_ && !image_.value().IsEmpty();
}
+gfx::Size ImageModel::Size() const {
+ if (IsVectorIcon()) {
+ const int icon_size = GetVectorIcon().icon_size();
+ return gfx::Size(icon_size, icon_size);
+ }
+ return IsImage() ? GetImage().Size() : gfx::Size();
+}
+
const VectorIconModel ImageModel::GetVectorIcon() const {
DCHECK(IsVectorIcon());
return vector_icon_model_.value();
diff --git a/chromium/ui/base/models/image_model.h b/chromium/ui/base/models/image_model.h
index 098a92ed42d..dbc4cf8b01d 100644
--- a/chromium/ui/base/models/image_model.h
+++ b/chromium/ui/base/models/image_model.h
@@ -6,9 +6,9 @@
#define UI_BASE_MODELS_IMAGE_MODEL_H_
#include "base/callback.h"
+#include "base/component_export.h"
#include "base/optional.h"
#include "third_party/skia/include/core/SkColor.h"
-#include "ui/base/ui_base_export.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/image/image_skia.h"
@@ -28,7 +28,7 @@ namespace ui {
// is only used internal to ImageModel and should never be instantiated except
// by ImageModel.
-class UI_BASE_EXPORT VectorIconModel {
+class COMPONENT_EXPORT(UI_BASE) VectorIconModel {
public:
VectorIconModel();
VectorIconModel(const VectorIconModel&);
@@ -71,7 +71,7 @@ class UI_BASE_EXPORT VectorIconModel {
// of the two may be specified at a given time. This class is instantiated via
// the FromXXXX static factory functions.
-class UI_BASE_EXPORT ImageModel {
+class COMPONENT_EXPORT(UI_BASE) ImageModel {
public:
ImageModel();
ImageModel(const ImageModel&);
@@ -92,6 +92,7 @@ class UI_BASE_EXPORT ImageModel {
bool IsEmpty() const;
bool IsVectorIcon() const;
bool IsImage() const;
+ gfx::Size Size() const;
// Only valid if IsVectorIcon() or IsImage() return true, respectively.
const VectorIconModel GetVectorIcon() const;
const gfx::Image GetImage() const;
diff --git a/chromium/ui/base/models/image_model_unittest.cc b/chromium/ui/base/models/image_model_unittest.cc
index 3b494797afc..8bb31fc06a1 100644
--- a/chromium/ui/base/models/image_model_unittest.cc
+++ b/chromium/ui/base/models/image_model_unittest.cc
@@ -54,6 +54,14 @@ TEST(ImageModelTest, CheckForImage) {
EXPECT_TRUE(image_model.IsImage());
}
+TEST(ImageModelTest, Size) {
+ EXPECT_EQ(gfx::Size(), ImageModel().Size());
+ EXPECT_EQ(gfx::Size(16, 16),
+ ImageModel::FromVectorIcon(GetVectorIcon(), -1, 16).Size());
+ EXPECT_EQ(gfx::Size(16, 16),
+ ImageModel::FromImage(gfx::test::CreateImage(16, 16)).Size());
+}
+
TEST(ImageModelTest, CheckAssignVectorIcon) {
VectorIconModel vector_icon_model_dest;
VectorIconModel vector_icon_model_src =
diff --git a/chromium/ui/base/models/list_model.h b/chromium/ui/base/models/list_model.h
index 3187ee5fd86..ed5217d99d9 100644
--- a/chromium/ui/base/models/list_model.h
+++ b/chromium/ui/base/models/list_model.h
@@ -11,7 +11,7 @@
#include <utility>
#include <vector>
-#include "base/logging.h"
+#include "base/check_op.h"
#include "base/macros.h"
#include "base/observer_list.h"
#include "ui/base/models/list_model_observer.h"
diff --git a/chromium/ui/base/models/list_model_observer.h b/chromium/ui/base/models/list_model_observer.h
index cc8be0f6e0a..c7d42310504 100644
--- a/chromium/ui/base/models/list_model_observer.h
+++ b/chromium/ui/base/models/list_model_observer.h
@@ -7,11 +7,11 @@
#include <stddef.h>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
-class UI_BASE_EXPORT ListModelObserver {
+class COMPONENT_EXPORT(UI_BASE) ListModelObserver {
public:
// Invoked after items has been added to the model.
virtual void ListItemsAdded(size_t start, size_t count) = 0;
diff --git a/chromium/ui/base/models/list_selection_model.h b/chromium/ui/base/models/list_selection_model.h
index e4e25150351..4c98ae9f645 100644
--- a/chromium/ui/base/models/list_selection_model.h
+++ b/chromium/ui/base/models/list_selection_model.h
@@ -9,7 +9,7 @@
#include <vector>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
@@ -25,7 +25,7 @@ namespace ui {
//
// Typically there is only one selected item, in which case the anchor and
// active index correspond to the same thing.
-class UI_BASE_EXPORT ListSelectionModel {
+class COMPONENT_EXPORT(UI_BASE) ListSelectionModel {
public:
using SelectedIndices = std::vector<int>;
diff --git a/chromium/ui/base/models/menu_model.cc b/chromium/ui/base/models/menu_model.cc
index 90a350cf9ce..32070758287 100644
--- a/chromium/ui/base/models/menu_model.cc
+++ b/chromium/ui/base/models/menu_model.cc
@@ -19,6 +19,14 @@ bool MenuModel::IsVisibleAt(int index) const {
return true;
}
+bool MenuModel::IsAlertedAt(int index) const {
+ return false;
+}
+
+bool MenuModel::IsNewFeatureAt(int index) const {
+ return false;
+}
+
// static
bool MenuModel::GetModelAndIndexForCommandId(int command_id,
MenuModel** model,
@@ -52,6 +60,10 @@ base::string16 MenuModel::GetMinorTextAt(int index) const {
return base::string16();
}
+base::string16 MenuModel::GetSecondaryLabelAt(int index) const {
+ return base::string16();
+}
+
ImageModel MenuModel::GetMinorIconAt(int index) const {
return ImageModel();
}
diff --git a/chromium/ui/base/models/menu_model.h b/chromium/ui/base/models/menu_model.h
index 887eee64e27..c746b37d627 100644
--- a/chromium/ui/base/models/menu_model.h
+++ b/chromium/ui/base/models/menu_model.h
@@ -5,11 +5,11 @@
#ifndef UI_BASE_MODELS_MENU_MODEL_H_
#define UI_BASE_MODELS_MENU_MODEL_H_
+#include "base/component_export.h"
#include "base/memory/weak_ptr.h"
#include "base/strings/string16.h"
#include "ui/base/models/menu_model_delegate.h"
#include "ui/base/models/menu_separator_types.h"
-#include "ui/base/ui_base_export.h"
#include "ui/gfx/native_widget_types.h"
namespace gfx {
@@ -23,7 +23,8 @@ class ButtonMenuItemModel;
class ImageModel;
// An interface implemented by an object that provides the content of a menu.
-class UI_BASE_EXPORT MenuModel : public base::SupportsWeakPtr<MenuModel> {
+class COMPONENT_EXPORT(UI_BASE) MenuModel
+ : public base::SupportsWeakPtr<MenuModel> {
public:
// The type of item.
enum ItemType {
@@ -65,6 +66,10 @@ class UI_BASE_EXPORT MenuModel : public base::SupportsWeakPtr<MenuModel> {
// Returns the label of the item at the specified index.
virtual base::string16 GetLabelAt(int index) const = 0;
+ // Returns the secondary label of the item at the specified index. Secondary
+ // label is shown below the label.
+ virtual base::string16 GetSecondaryLabelAt(int index) const;
+
// Returns the minor text of the item at the specified index. The minor text
// is rendered to the right of the label and using the font GetLabelFontAt().
virtual base::string16 GetMinorTextAt(int index) const;
@@ -108,6 +113,15 @@ class UI_BASE_EXPORT MenuModel : public base::SupportsWeakPtr<MenuModel> {
// Returns true if the menu item is visible.
virtual bool IsVisibleAt(int index) const;
+ // Returns true if the item is rendered specially to draw attention
+ // for in-product help.
+ virtual bool IsAlertedAt(int index) const;
+
+ // Returns true if the menu item grants access to a new feature that we want
+ // to show off to users (items marked as new will receive a "New" badge when
+ // the appropriate flag is enabled).
+ virtual bool IsNewFeatureAt(int index) const;
+
// Returns the model for the submenu at the specified index.
virtual MenuModel* GetSubmenuModelAt(int index) const = 0;
diff --git a/chromium/ui/base/models/simple_combobox_model.cc b/chromium/ui/base/models/simple_combobox_model.cc
index ff4f04f8036..64e05588544 100644
--- a/chromium/ui/base/models/simple_combobox_model.cc
+++ b/chromium/ui/base/models/simple_combobox_model.cc
@@ -18,11 +18,11 @@ int SimpleComboboxModel::GetItemCount() const {
return items_.size();
}
-base::string16 SimpleComboboxModel::GetItemAt(int index) {
+base::string16 SimpleComboboxModel::GetItemAt(int index) const {
return items_[index];
}
-bool SimpleComboboxModel::IsItemSeparatorAt(int index) {
+bool SimpleComboboxModel::IsItemSeparatorAt(int index) const {
return items_[index].empty();
}
diff --git a/chromium/ui/base/models/simple_combobox_model.h b/chromium/ui/base/models/simple_combobox_model.h
index a50373a5cf5..140760a604b 100644
--- a/chromium/ui/base/models/simple_combobox_model.h
+++ b/chromium/ui/base/models/simple_combobox_model.h
@@ -5,6 +5,7 @@
#ifndef UI_BASE_MODELS_SIMPLE_COMBOBOX_MODEL_H_
#define UI_BASE_MODELS_SIMPLE_COMBOBOX_MODEL_H_
+#include "base/component_export.h"
#include "base/macros.h"
#include "ui/base/models/combobox_model.h"
@@ -14,15 +15,15 @@ namespace ui {
// A simple data model for a combobox that takes a string16 vector as the items.
// An empty string will be a separator.
-class UI_BASE_EXPORT SimpleComboboxModel : public ComboboxModel {
+class COMPONENT_EXPORT(UI_BASE) SimpleComboboxModel : public ComboboxModel {
public:
explicit SimpleComboboxModel(std::vector<base::string16> items);
~SimpleComboboxModel() override;
// ui::ComboboxModel:
int GetItemCount() const override;
- base::string16 GetItemAt(int index) override;
- bool IsItemSeparatorAt(int index) override;
+ base::string16 GetItemAt(int index) const override;
+ bool IsItemSeparatorAt(int index) const override;
int GetDefaultIndex() const override;
private:
diff --git a/chromium/ui/base/models/simple_menu_model.cc b/chromium/ui/base/models/simple_menu_model.cc
index 88053e9d501..0c37f6e2cae 100644
--- a/chromium/ui/base/models/simple_menu_model.cc
+++ b/chromium/ui/base/models/simple_menu_model.cc
@@ -39,6 +39,10 @@ bool SimpleMenuModel::Delegate::IsCommandIdVisible(int command_id) const {
return true;
}
+bool SimpleMenuModel::Delegate::IsCommandIdAlerted(int command_id) const {
+ return false;
+}
+
bool SimpleMenuModel::Delegate::IsItemForCommandIdDynamic(
int command_id) const {
return false;
@@ -317,6 +321,10 @@ void SimpleMenuModel::SetVisibleAt(int index, bool visible) {
MenuItemsChanged();
}
+void SimpleMenuModel::SetIsNewFeatureAt(int index, bool is_new_feature) {
+ items_[ValidateItemIndex(index)].is_new_feature = is_new_feature;
+}
+
void SimpleMenuModel::Clear() {
items_.clear();
MenuItemsChanged();
@@ -432,6 +440,18 @@ bool SimpleMenuModel::IsVisibleAt(int index) const {
items_[ValidateItemIndex(index)].visible;
}
+bool SimpleMenuModel::IsAlertedAt(int index) const {
+ const int command_id = GetCommandIdAt(index);
+ if (!delegate_ || command_id == kSeparatorId || command_id == kTitleId)
+ return false;
+
+ return delegate_->IsCommandIdAlerted(command_id);
+}
+
+bool SimpleMenuModel::IsNewFeatureAt(int index) const {
+ return items_[ValidateItemIndex(index)].is_new_feature;
+}
+
void SimpleMenuModel::ActivatedAt(int index) {
ActivatedAt(index, 0);
}
diff --git a/chromium/ui/base/models/simple_menu_model.h b/chromium/ui/base/models/simple_menu_model.h
index 2b06f3f4a03..5f1116ba19b 100644
--- a/chromium/ui/base/models/simple_menu_model.h
+++ b/chromium/ui/base/models/simple_menu_model.h
@@ -9,6 +9,7 @@
#include <vector>
#include "base/compiler_specific.h"
+#include "base/component_export.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/strings/string16.h"
@@ -24,9 +25,9 @@ class ButtonMenuItemModel;
// items. This makes it easy to construct fixed menus. Menus populated by
// dynamic data sources may be better off implementing MenuModel directly.
// The breadth of MenuModel is not exposed through this API.
-class UI_BASE_EXPORT SimpleMenuModel : public MenuModel {
+class COMPONENT_EXPORT(UI_BASE) SimpleMenuModel : public MenuModel {
public:
- class UI_BASE_EXPORT Delegate : public AcceleratorProvider {
+ class COMPONENT_EXPORT(UI_BASE) Delegate : public AcceleratorProvider {
public:
~Delegate() override {}
@@ -40,6 +41,10 @@ class UI_BASE_EXPORT SimpleMenuModel : public MenuModel {
// Delegate should return true if |command_id| should be visible.
virtual bool IsCommandIdVisible(int command_id) const;
+ // Determines if |command_id| should be rendered with an alert for
+ // in-product help.
+ virtual bool IsCommandIdAlerted(int command_id) const;
+
// Some command ids have labels and icons that change over time.
virtual bool IsItemForCommandIdDynamic(int command_id) const;
virtual base::string16 GetLabelForCommandId(int command_id) const;
@@ -158,6 +163,9 @@ class UI_BASE_EXPORT SimpleMenuModel : public MenuModel {
// Sets whether the item at |index| is visible.
void SetVisibleAt(int index, bool visible);
+ // Sets whether the item at |index| is new.
+ void SetIsNewFeatureAt(int index, bool is_new_feature);
+
// Clears all items. Note that it does not free MenuModel of submenu.
void Clear();
@@ -182,6 +190,8 @@ class UI_BASE_EXPORT SimpleMenuModel : public MenuModel {
ui::ButtonMenuItemModel* GetButtonMenuItemAt(int index) const override;
bool IsEnabledAt(int index) const override;
bool IsVisibleAt(int index) const override;
+ bool IsAlertedAt(int index) const override;
+ bool IsNewFeatureAt(int index) const override;
void ActivatedAt(int index) override;
void ActivatedAt(int index, int event_flags) override;
MenuModel* GetSubmenuModelAt(int index) const override;
@@ -215,6 +225,7 @@ class UI_BASE_EXPORT SimpleMenuModel : public MenuModel {
MenuSeparatorType separator_type = NORMAL_SEPARATOR;
bool enabled = true;
bool visible = true;
+ bool is_new_feature = false;
};
typedef std::vector<Item> ItemVector;
diff --git a/chromium/ui/base/models/simple_menu_model_unittest.cc b/chromium/ui/base/models/simple_menu_model_unittest.cc
index 4fe768d11b9..b38debbc855 100644
--- a/chromium/ui/base/models/simple_menu_model_unittest.cc
+++ b/chromium/ui/base/models/simple_menu_model_unittest.cc
@@ -16,6 +16,8 @@ namespace ui {
namespace {
+constexpr int kAlertedCommandId = 2;
+
class DelegateBase : public SimpleMenuModel::Delegate {
public:
DelegateBase() : SimpleMenuModel::Delegate() {}
@@ -37,6 +39,10 @@ class DelegateBase : public SimpleMenuModel::Delegate {
return command_id < 100;
}
+ bool IsCommandIdAlerted(int command_id) const override {
+ return command_id == kAlertedCommandId;
+ }
+
void ExecuteCommand(int command_id, int event_flags) override {}
bool IsItemForCommandIdDynamic(int command_id) const override {
@@ -147,6 +153,32 @@ TEST(SimpleMenuModelTest, IsVisibleAtWithDelegateAndCommandNotVisible) {
ASSERT_FALSE(simple_menu_model.IsEnabledAt(0));
}
+TEST(SimpleMenuModelTest, IsAlertedAtViaDelegate) {
+ DelegateBase delegate;
+ SimpleMenuModel simple_menu_model(&delegate);
+ simple_menu_model.AddItem(kAlertedCommandId,
+ base::ASCIIToUTF16("alerted item"));
+ simple_menu_model.AddItem(kAlertedCommandId + 1,
+ base::ASCIIToUTF16("non-alerted item"));
+
+ EXPECT_TRUE(simple_menu_model.IsAlertedAt(0));
+ EXPECT_FALSE(simple_menu_model.IsAlertedAt(1));
+}
+
+TEST(SimpleMenuModelTest, SetIsNewFeatureAt) {
+ SimpleMenuModel simple_menu_model(nullptr);
+ simple_menu_model.AddItem(/*command_id*/ 5,
+ base::ASCIIToUTF16("menu item 0"));
+ simple_menu_model.AddItem(/*command_id*/ 6,
+ base::ASCIIToUTF16("menu item 1"));
+
+ simple_menu_model.SetIsNewFeatureAt(/*index*/ 0, false);
+ simple_menu_model.SetIsNewFeatureAt(/*index*/ 1, true);
+
+ ASSERT_FALSE(simple_menu_model.IsNewFeatureAt(0));
+ ASSERT_TRUE(simple_menu_model.IsNewFeatureAt(1));
+}
+
TEST(SimpleMenuModelTest, HasIconsViaDelegate) {
DelegateBase delegate;
SimpleMenuModel simple_menu_model(&delegate);
diff --git a/chromium/ui/base/models/table_model.h b/chromium/ui/base/models/table_model.h
index 088cda5a42d..6e098fbe8dc 100644
--- a/chromium/ui/base/models/table_model.h
+++ b/chromium/ui/base/models/table_model.h
@@ -7,9 +7,9 @@
#include <vector>
+#include "base/component_export.h"
#include "base/strings/string16.h"
#include "third_party/icu/source/i18n/unicode/coll.h"
-#include "ui/base/ui_base_export.h"
namespace gfx {
class ImageSkia;
@@ -20,7 +20,7 @@ namespace ui {
class TableModelObserver;
// The model driving the TableView.
-class UI_BASE_EXPORT TableModel {
+class COMPONENT_EXPORT(UI_BASE) TableModel {
public:
// Size of the table row icon, if used.
static constexpr int kIconSize = 16;
@@ -65,7 +65,7 @@ class UI_BASE_EXPORT TableModel {
};
// TableColumn specifies the title, alignment and size of a particular column.
-struct UI_BASE_EXPORT TableColumn {
+struct COMPONENT_EXPORT(UI_BASE) TableColumn {
enum Alignment {
LEFT, RIGHT, CENTER
};
diff --git a/chromium/ui/base/models/table_model_observer.h b/chromium/ui/base/models/table_model_observer.h
index 20b5c7f0e13..eaff0750819 100644
--- a/chromium/ui/base/models/table_model_observer.h
+++ b/chromium/ui/base/models/table_model_observer.h
@@ -5,13 +5,13 @@
#ifndef UI_BASE_MODELS_TABLE_MODEL_OBSERVER_H_
#define UI_BASE_MODELS_TABLE_MODEL_OBSERVER_H_
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
// Observer for a TableModel. Anytime the model changes, it must notify its
// observer.
-class UI_BASE_EXPORT TableModelObserver {
+class COMPONENT_EXPORT(UI_BASE) TableModelObserver {
public:
// Invoked when the model has been completely changed.
virtual void OnModelChanged() = 0;
diff --git a/chromium/ui/base/models/tree_model.h b/chromium/ui/base/models/tree_model.h
index 815cebbdea9..20dc6cdef24 100644
--- a/chromium/ui/base/models/tree_model.h
+++ b/chromium/ui/base/models/tree_model.h
@@ -7,8 +7,8 @@
#include <vector>
+#include "base/component_export.h"
#include "base/strings/string16.h"
-#include "ui/base/ui_base_export.h"
namespace gfx {
class ImageSkia;
@@ -34,7 +34,7 @@ class TreeModelNode {
};
// Observer for the TreeModel. Notified of significant events to the model.
-class UI_BASE_EXPORT TreeModelObserver {
+class COMPONENT_EXPORT(UI_BASE) TreeModelObserver {
public:
// Notification that nodes were added to the specified parent.
virtual void TreeNodesAdded(TreeModel* model,
@@ -61,7 +61,7 @@ class UI_BASE_EXPORT TreeModelObserver {
// of bookkeeping for the tree to be implemented. Generally you will want to
// use TreeNodeModel which provides a standard implementation for basic
// hierarchy and observer notification. See tree_node_model.h.
-class UI_BASE_EXPORT TreeModel {
+class COMPONENT_EXPORT(UI_BASE) TreeModel {
public:
using Nodes = std::vector<TreeModelNode*>;
diff --git a/chromium/ui/base/models/tree_node_iterator.h b/chromium/ui/base/models/tree_node_iterator.h
index 4f84b20e2b9..931e2606e0d 100644
--- a/chromium/ui/base/models/tree_node_iterator.h
+++ b/chromium/ui/base/models/tree_node_iterator.h
@@ -6,8 +6,8 @@
#define UI_BASE_MODELS_TREE_NODE_ITERATOR_H_
#include "base/callback.h"
+#include "base/check.h"
#include "base/containers/stack.h"
-#include "base/logging.h"
#include "base/macros.h"
namespace ui {
diff --git a/chromium/ui/base/models/tree_node_model.h b/chromium/ui/base/models/tree_node_model.h
index b1213ba67a5..d21bf9a66d0 100644
--- a/chromium/ui/base/models/tree_node_model.h
+++ b/chromium/ui/base/models/tree_node_model.h
@@ -11,7 +11,7 @@
#include <memory>
#include <vector>
-#include "base/logging.h"
+#include "base/check_op.h"
#include "base/macros.h"
#include "base/observer_list.h"
#include "base/strings/string16.h"
diff --git a/chromium/ui/base/mojom/BUILD.gn b/chromium/ui/base/mojom/BUILD.gn
index 8b330d88d52..49ea535072d 100644
--- a/chromium/ui/base/mojom/BUILD.gn
+++ b/chromium/ui/base/mojom/BUILD.gn
@@ -10,6 +10,15 @@ mojom("mojom") {
"ui_base_types.mojom",
"window_open_disposition.mojom",
]
+
+ if (is_mac) {
+ sources += [ "attributed_string.mojom" ]
+ public_deps = [
+ "//mojo/public/mojom/base",
+ "//ui/gfx/range/mojom",
+ ]
+ }
+
cpp_typemaps = [
{
types = [
diff --git a/chromium/ui/base/mojom/attributed_string.mojom b/chromium/ui/base/mojom/attributed_string.mojom
new file mode 100644
index 00000000000..18969f51079
--- /dev/null
+++ b/chromium/ui/base/mojom/attributed_string.mojom
@@ -0,0 +1,32 @@
+// 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 ui.mojom;
+
+import "mojo/public/mojom/base/string16.mojom";
+import "ui/gfx/range/mojom/range.mojom";
+
+// This will serialize the font information of an NSAttributedString so that
+// it can be sent over mojo. This only stores the information of the
+// NSFontAttributeName. The motive is that of security: using NSArchiver and
+// friends to send objects from the renderer to the browser could lead to
+// deserialization of arbitrary objects. This restricts serialization to a
+// specific object class and specific attributes of that object.
+
+// A C++ mojo-friendly representation of the NSFontAttributeName attribute
+// set.
+struct FontAttribute {
+ mojo_base.mojom.String16 font_name;
+ float font_point_size;
+ gfx.mojom.Range effective_range;
+};
+
+// A struct that contains the pertinent information from an NSAttributedString,
+// which can be serialized over mojo.
+struct AttributedString {
+ // The plain-text string.
+ mojo_base.mojom.String16 string;
+ // The set of attributes that style |string|.
+ array<FontAttribute> attributes;
+};
diff --git a/chromium/ui/base/mojom/window_open_disposition_mojom_traits.h b/chromium/ui/base/mojom/window_open_disposition_mojom_traits.h
index 84b7c86f102..a9862b8d62d 100644
--- a/chromium/ui/base/mojom/window_open_disposition_mojom_traits.h
+++ b/chromium/ui/base/mojom/window_open_disposition_mojom_traits.h
@@ -5,7 +5,7 @@
#ifndef UI_BASE_MOJOM_WINDOW_OPEN_DISPOSITION_MOJOM_TRAITS_H_
#define UI_BASE_MOJOM_WINDOW_OPEN_DISPOSITION_MOJOM_TRAITS_H_
-#include "base/logging.h"
+#include "base/notreached.h"
#include "mojo/public/cpp/bindings/enum_traits.h"
#include "ui/base/mojom/window_open_disposition.mojom.h"
#include "ui/base/window_open_disposition.h"
diff --git a/chromium/ui/base/nine_image_painter_factory.h b/chromium/ui/base/nine_image_painter_factory.h
index af4b13c3dbb..dd4e7052952 100644
--- a/chromium/ui/base/nine_image_painter_factory.h
+++ b/chromium/ui/base/nine_image_painter_factory.h
@@ -7,7 +7,7 @@
#include <memory>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
// A macro to define arrays of IDR constants used with CreateImageGridPainter.
#define IMAGE_GRID(x) { x ## _TOP_LEFT, x ## _TOP, x ## _TOP_RIGHT, \
@@ -44,7 +44,8 @@ namespace ui {
// Creates a NineImagePainter from an array of image ids. It's expected the
// array came from the IMAGE_GRID macro.
-UI_BASE_EXPORT std::unique_ptr<gfx::NineImagePainter> CreateNineImagePainter(
+COMPONENT_EXPORT(UI_BASE)
+std::unique_ptr<gfx::NineImagePainter> CreateNineImagePainter(
const int image_ids[]);
} // namespace ui
diff --git a/chromium/ui/base/page_transition_types.h b/chromium/ui/base/page_transition_types.h
index 21773ad6241..ea8632c706e 100644
--- a/chromium/ui/base/page_transition_types.h
+++ b/chromium/ui/base/page_transition_types.h
@@ -7,7 +7,7 @@
#include <stdint.h>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
@@ -150,43 +150,47 @@ enum PageTransition {
// Compares two PageTransition types ignoring qualifiers. |rhs| is taken to
// be a compile time constant, and hence must not contain any qualifiers.
-UI_BASE_EXPORT bool PageTransitionCoreTypeIs(PageTransition lhs,
- PageTransition rhs);
+COMPONENT_EXPORT(UI_BASE)
+bool PageTransitionCoreTypeIs(PageTransition lhs, PageTransition rhs);
// Compares two PageTransition types including qualifiers. Rarely useful,
// PageTransitionCoreTypeIs() is more likely what you need.
-UI_BASE_EXPORT bool PageTransitionTypeIncludingQualifiersIs(PageTransition lhs,
- PageTransition rhs);
+COMPONENT_EXPORT(UI_BASE)
+bool PageTransitionTypeIncludingQualifiersIs(PageTransition lhs,
+ PageTransition rhs);
// Simplifies the provided transition by removing any qualifier
-UI_BASE_EXPORT PageTransition PageTransitionStripQualifier(
- PageTransition type);
+COMPONENT_EXPORT(UI_BASE)
+PageTransition PageTransitionStripQualifier(PageTransition type);
-UI_BASE_EXPORT bool PageTransitionIsValidType(int32_t type);
+COMPONENT_EXPORT(UI_BASE) bool PageTransitionIsValidType(int32_t type);
-UI_BASE_EXPORT PageTransition PageTransitionFromInt(int32_t type);
+COMPONENT_EXPORT(UI_BASE) PageTransition PageTransitionFromInt(int32_t type);
// Returns true if the given transition is a top-level frame transition, or
// false if the transition was for a subframe.
-UI_BASE_EXPORT bool PageTransitionIsMainFrame(PageTransition type);
+COMPONENT_EXPORT(UI_BASE) bool PageTransitionIsMainFrame(PageTransition type);
// Returns whether a transition involves a redirection
-UI_BASE_EXPORT bool PageTransitionIsRedirect(PageTransition type);
+COMPONENT_EXPORT(UI_BASE) bool PageTransitionIsRedirect(PageTransition type);
// Returns whether a transition is a new navigation (rather than a return
// to a previously committed navigation).
-UI_BASE_EXPORT bool PageTransitionIsNewNavigation(PageTransition type);
+COMPONENT_EXPORT(UI_BASE)
+bool PageTransitionIsNewNavigation(PageTransition type);
// Return the qualifier
-UI_BASE_EXPORT int32_t PageTransitionGetQualifier(PageTransition type);
+COMPONENT_EXPORT(UI_BASE)
+int32_t PageTransitionGetQualifier(PageTransition type);
// Returns true if the transition can be triggered by the web instead of
// through UI or similar.
-UI_BASE_EXPORT bool PageTransitionIsWebTriggerable(PageTransition type);
+COMPONENT_EXPORT(UI_BASE)
+bool PageTransitionIsWebTriggerable(PageTransition type);
// Return a string version of the core type values.
-UI_BASE_EXPORT const char* PageTransitionGetCoreTransitionString(
- PageTransition type);
+COMPONENT_EXPORT(UI_BASE)
+const char* PageTransitionGetCoreTransitionString(PageTransition type);
// Declare a dummy class that is intentionally never defined.
class DontUseOperatorEquals;
diff --git a/chromium/ui/base/pointer/pointer_device.h b/chromium/ui/base/pointer/pointer_device.h
index 19765542fb3..c50fdde7fe7 100644
--- a/chromium/ui/base/pointer/pointer_device.h
+++ b/chromium/ui/base/pointer/pointer_device.h
@@ -7,8 +7,8 @@
#include <tuple>
+#include "base/component_export.h"
#include "build/build_config.h"
-#include "ui/base/ui_base_export.h"
#if defined(OS_ANDROID)
#include <jni.h>
@@ -22,7 +22,8 @@ enum class TouchScreensAvailability {
DISABLED, // Touch screens are present and disabled.
};
-UI_BASE_EXPORT TouchScreensAvailability GetTouchScreensAvailability();
+COMPONENT_EXPORT(UI_BASE)
+TouchScreensAvailability GetTouchScreensAvailability();
// Returns the maximum number of simultaneous touch contacts supported
// by the device. In the case of devices with multiple digitizers (e.g.
@@ -31,7 +32,7 @@ UI_BASE_EXPORT TouchScreensAvailability GetTouchScreensAvailability();
// For example, suppose a device has 3 touchscreens, which support 2, 5,
// and 10 simultaneous touch contacts, respectively. This returns 10.
// http://www.w3.org/TR/pointerevents/#widl-Navigator-maxTouchPoints
-UI_BASE_EXPORT int MaxTouchPoints();
+COMPONENT_EXPORT(UI_BASE) int MaxTouchPoints();
// Bit field values indicating available pointer types. Identical to
// blink::PointerType enums, enforced by compile-time assertions in
@@ -60,12 +61,15 @@ enum HoverType {
int GetAvailablePointerTypes();
int GetAvailableHoverTypes();
-UI_BASE_EXPORT std::pair<int, int> GetAvailablePointerAndHoverTypes();
-UI_BASE_EXPORT void SetAvailablePointerAndHoverTypesForTesting(
- int available_pointer_types,
- int available_hover_types);
-UI_BASE_EXPORT PointerType GetPrimaryPointerType(int available_pointer_types);
-UI_BASE_EXPORT HoverType GetPrimaryHoverType(int available_hover_types);
+COMPONENT_EXPORT(UI_BASE)
+std::pair<int, int> GetAvailablePointerAndHoverTypes();
+COMPONENT_EXPORT(UI_BASE)
+void SetAvailablePointerAndHoverTypesForTesting(int available_pointer_types,
+ int available_hover_types);
+COMPONENT_EXPORT(UI_BASE)
+PointerType GetPrimaryPointerType(int available_pointer_types);
+COMPONENT_EXPORT(UI_BASE)
+HoverType GetPrimaryHoverType(int available_hover_types);
} // namespace ui
diff --git a/chromium/ui/base/pointer/touch_editing_controller.h b/chromium/ui/base/pointer/touch_editing_controller.h
index e55fb3c9be1..0797a4017af 100644
--- a/chromium/ui/base/pointer/touch_editing_controller.h
+++ b/chromium/ui/base/pointer/touch_editing_controller.h
@@ -5,6 +5,7 @@
#ifndef UI_BASE_POINTER_TOUCH_EDITING_CONTROLLER_H_
#define UI_BASE_POINTER_TOUCH_EDITING_CONTROLLER_H_
+#include "base/component_export.h"
#include "ui/base/models/simple_menu_model.h"
namespace gfx {
@@ -17,7 +18,8 @@ namespace ui {
// An interface implemented by widget that has text that can be selected/edited
// using touch.
-class UI_BASE_EXPORT TouchEditable : public ui::SimpleMenuModel::Delegate {
+class COMPONENT_EXPORT(UI_BASE) TouchEditable
+ : public ui::SimpleMenuModel::Delegate {
public:
// Commands that all TouchEditables support:
enum MenuCommands {
@@ -79,7 +81,7 @@ class UI_BASE_EXPORT TouchEditable : public ui::SimpleMenuModel::Delegate {
// This defines the callback interface for other code to be notified of changes
// in the state of a TouchEditable.
-class UI_BASE_EXPORT TouchEditingControllerDeprecated {
+class COMPONENT_EXPORT(UI_BASE) TouchEditingControllerDeprecated {
public:
virtual ~TouchEditingControllerDeprecated() {}
@@ -89,16 +91,9 @@ class UI_BASE_EXPORT TouchEditingControllerDeprecated {
// Notifies the controller that the selection has changed.
virtual void SelectionChanged() = 0;
-
- // Returns true if the user is currently dragging one of the handles.
- virtual bool IsHandleDragInProgress() = 0;
-
- // Hides visible handles. According to the value of |quick|, handles might
- // fade out quickly or slowly.
- virtual void HideHandles(bool quick) = 0;
};
-class UI_BASE_EXPORT TouchEditingControllerFactory {
+class COMPONENT_EXPORT(UI_BASE) TouchEditingControllerFactory {
public:
virtual ~TouchEditingControllerFactory() {}
diff --git a/chromium/ui/base/pointer/touch_ui_controller.cc b/chromium/ui/base/pointer/touch_ui_controller.cc
index f594a6db23c..326da1df5d9 100644
--- a/chromium/ui/base/pointer/touch_ui_controller.cc
+++ b/chromium/ui/base/pointer/touch_ui_controller.cc
@@ -4,11 +4,13 @@
#include "ui/base/pointer/touch_ui_controller.h"
+#include <memory>
#include <string>
#include "base/bind.h"
#include "base/command_line.h"
#include "base/message_loop/message_loop_current.h"
+#include "base/metrics/user_metrics.h"
#include "base/no_destructor.h"
#include "base/trace_event/trace_event.h"
#include "ui/base/ui_base_switches.h"
@@ -22,17 +24,27 @@
namespace ui {
-#if defined(OS_WIN)
namespace {
+#if defined(OS_WIN)
+
bool IsTabletMode() {
return base::win::IsWindows10TabletMode(
gfx::SingletonHwnd::GetInstance()->hwnd());
}
-} // namespace
#endif // defined(OS_WIN)
+void RecordEnteredTouchMode() {
+ base::RecordAction(base::UserMetricsAction("TouchMode.EnteredTouchMode"));
+}
+
+void RecordEnteredNonTouchMode() {
+ base::RecordAction(base::UserMetricsAction("TouchMode.EnteredNonTouchMode"));
+}
+
+} // namespace
+
TouchUiController::TouchUiScoperForTesting::TouchUiScoperForTesting(
bool enabled,
TouchUiController* controller)
@@ -44,6 +56,11 @@ TouchUiController::TouchUiScoperForTesting::~TouchUiScoperForTesting() {
controller_->SetTouchUiState(old_state_);
}
+void TouchUiController::TouchUiScoperForTesting::UpdateState(bool enabled) {
+ controller_->SetTouchUiState(enabled ? TouchUiState::kEnabled
+ : TouchUiState::kDisabled);
+}
+
// static
TouchUiController* TouchUiController::Get() {
static base::NoDestructor<TouchUiController> instance([] {
@@ -72,6 +89,11 @@ TouchUiController::TouchUiController(TouchUiState touch_ui_state)
tablet_mode_ = IsTabletMode();
}
#endif
+
+ if (touch_ui())
+ RecordEnteredTouchMode();
+ else
+ RecordEnteredNonTouchMode();
}
TouchUiController::~TouchUiController() = default;
@@ -79,10 +101,8 @@ TouchUiController::~TouchUiController() = default;
void TouchUiController::OnTabletModeToggled(bool enabled) {
const bool was_touch_ui = touch_ui();
tablet_mode_ = enabled;
- if (touch_ui() != was_touch_ui) {
- TRACE_EVENT0("ui", "TouchUiController.NotifyListeners");
- callback_list_.Notify();
- }
+ if (touch_ui() != was_touch_ui)
+ TouchUiChanged();
}
std::unique_ptr<TouchUiController::Subscription>
@@ -94,11 +114,19 @@ TouchUiController::TouchUiState TouchUiController::SetTouchUiState(
TouchUiState touch_ui_state) {
const bool was_touch_ui = touch_ui();
const TouchUiState old_state = std::exchange(touch_ui_state_, touch_ui_state);
- if (touch_ui() != was_touch_ui) {
- TRACE_EVENT0("ui", "TouchUiController.NotifyListeners");
- callback_list_.Notify();
- }
+ if (touch_ui() != was_touch_ui)
+ TouchUiChanged();
return old_state;
}
+void TouchUiController::TouchUiChanged() {
+ if (touch_ui())
+ RecordEnteredTouchMode();
+ else
+ RecordEnteredNonTouchMode();
+
+ TRACE_EVENT0("ui", "TouchUiController.NotifyListeners");
+ callback_list_.Notify();
+}
+
} // namespace ui
diff --git a/chromium/ui/base/pointer/touch_ui_controller.h b/chromium/ui/base/pointer/touch_ui_controller.h
index cecd4ddcc69..0240f4eaef3 100644
--- a/chromium/ui/base/pointer/touch_ui_controller.h
+++ b/chromium/ui/base/pointer/touch_ui_controller.h
@@ -5,11 +5,12 @@
#ifndef UI_BASE_POINTER_TOUCH_UI_CONTROLLER_H_
#define UI_BASE_POINTER_TOUCH_UI_CONTROLLER_H_
+#include <memory>
#include <string>
#include "base/callback_list.h"
+#include "base/component_export.h"
#include "build/build_config.h"
-#include "ui/base/ui_base_export.h"
#if defined(OS_WIN)
namespace gfx {
@@ -20,7 +21,7 @@ class SingletonHwndObserver;
namespace ui {
// Central controller to handle touch UI modes.
-class UI_BASE_EXPORT TouchUiController {
+class COMPONENT_EXPORT(UI_BASE) TouchUiController {
public:
using CallbackList = base::CallbackList<void()>;
using Subscription = CallbackList::Subscription;
@@ -31,7 +32,7 @@ class UI_BASE_EXPORT TouchUiController {
kEnabled,
};
- class UI_BASE_EXPORT TouchUiScoperForTesting {
+ class COMPONENT_EXPORT(UI_BASE) TouchUiScoperForTesting {
public:
explicit TouchUiScoperForTesting(bool enabled,
TouchUiController* controller = Get());
@@ -39,6 +40,11 @@ class UI_BASE_EXPORT TouchUiController {
TouchUiScoperForTesting& operator=(const TouchUiScoperForTesting&) = delete;
~TouchUiScoperForTesting();
+ // Update the current touch mode state but still roll back to the
+ // original state at destruction. Allows a test to change the mode
+ // multiple times without creating multiple instances.
+ void UpdateState(bool enabled);
+
private:
TouchUiController* const controller_;
const TouchUiState old_state_;
@@ -64,6 +70,8 @@ class UI_BASE_EXPORT TouchUiController {
private:
TouchUiState SetTouchUiState(TouchUiState touch_ui_state);
+ void TouchUiChanged();
+
bool tablet_mode_ = false;
TouchUiState touch_ui_state_;
diff --git a/chromium/ui/base/resource/data_pack.cc b/chromium/ui/base/resource/data_pack.cc
index 618204dfcda..09513e6aed2 100644
--- a/chromium/ui/base/resource/data_pack.cc
+++ b/chromium/ui/base/resource/data_pack.cc
@@ -10,6 +10,7 @@
#include <utility>
#include "base/command_line.h"
+#include "base/files/file.h"
#include "base/files/file_util.h"
#include "base/files/memory_mapped_file.h"
#include "base/logging.h"
@@ -41,8 +42,11 @@ static const size_t kHeaderLengthV5 =
// We're crashing when trying to load a pak file on Windows. Add some error
// codes for logging.
// http://crbug.com/58056
+// These values are logged to UMA. Entries should not be renumbered and
+// numeric values should never be reused. Keep in sync with "DataPackLoadErrors"
+// in src/tools/metrics/histograms/enums.xml.
enum LoadErrors {
- INIT_FAILED = 1,
+ INIT_FAILED_OBSOLETE = 1,
BAD_VERSION,
INDEX_TRUNCATED,
ENTRY_NOT_FOUND,
@@ -50,6 +54,8 @@ enum LoadErrors {
WRONG_ENCODING,
INIT_FAILED_FROM_FILE,
UNZIP_FAILED,
+ OPEN_FAILED,
+ MAP_FAILED,
LOAD_ERRORS_COUNT,
};
@@ -274,9 +280,20 @@ DataPack::~DataPack() {
bool DataPack::LoadFromPath(const base::FilePath& path) {
std::unique_ptr<base::MemoryMappedFile> mmap =
std::make_unique<base::MemoryMappedFile>();
- if (!mmap->Initialize(path)) {
+ // Open the file for reading; allowing other consumers to also open it for
+ // reading and deleting. Do not allow others to write to it.
+ base::File data_file(path, base::File::FLAG_OPEN | base::File::FLAG_READ |
+ base::File::FLAG_EXCLUSIVE_WRITE |
+ base::File::FLAG_SHARE_DELETE);
+ if (!data_file.IsValid()) {
+ DLOG(ERROR) << "Failed to open datapack with base::File::Error "
+ << data_file.error_details();
+ LogDataPackError(OPEN_FAILED);
+ return false;
+ }
+ if (!mmap->Initialize(std::move(data_file))) {
DLOG(ERROR) << "Failed to mmap datapack";
- LogDataPackError(INIT_FAILED);
+ LogDataPackError(MAP_FAILED);
return false;
}
if (MmapHasGzipHeader(mmap.get())) {
diff --git a/chromium/ui/base/resource/resource_bundle.cc b/chromium/ui/base/resource/resource_bundle.cc
index 133540ca848..eeb09546b45 100644
--- a/chromium/ui/base/resource/resource_bundle.cc
+++ b/chromium/ui/base/resource/resource_bundle.cc
@@ -12,10 +12,12 @@
#include "base/big_endian.h"
#include "base/command_line.h"
+#include "base/debug/alias.h"
#include "base/files/file.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/memory/ref_counted_memory.h"
+#include "base/notreached.h"
#include "base/path_service.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
@@ -45,6 +47,7 @@
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/image/image_skia_source.h"
#include "ui/strings/grit/app_locale_settings.h"
+#include "url/gurl.h"
#if defined(OS_ANDROID)
#include "base/android/build_info.h"
@@ -257,7 +260,9 @@ std::string ResourceBundle::InitSharedInstanceWithLocale(
InitSharedInstance(delegate);
if (load_resources == LOAD_COMMON_RESOURCES)
g_shared_instance_->LoadCommonResources();
- std::string result = g_shared_instance_->LoadLocaleResources(pref_locale);
+ std::string result =
+ g_shared_instance_->LoadLocaleResources(pref_locale,
+ /*crash_on_failure=*/true);
g_shared_instance_->InitDefaultFontList();
return result;
}
@@ -326,7 +331,8 @@ void ResourceBundle::LoadSecondaryLocaleDataWithPakFileRegion(
#if !defined(OS_ANDROID)
// static
bool ResourceBundle::LocaleDataPakExists(const std::string& locale) {
- return !GetLocaleFilePath(locale).empty();
+ const auto path = GetLocaleFilePath(locale);
+ return !path.empty() && base::PathExists(path);
}
#endif // !defined(OS_ANDROID)
@@ -378,10 +384,7 @@ base::FilePath ResourceBundle::GetLocaleFilePath(
return base::FilePath();
base::FilePath locale_file_path;
-
- base::PathService::Get(ui::DIR_LOCALES, &locale_file_path);
-
- if (!locale_file_path.empty()) {
+ if (base::PathService::Get(ui::DIR_LOCALES, &locale_file_path)) {
#if defined(OS_ANDROID)
if (locale_file_path.value().find("chromium_tests") == std::string::npos) {
std::string extracted_file_suffix =
@@ -410,20 +413,14 @@ base::FilePath ResourceBundle::GetLocaleFilePath(
locale_file_path, app_locale);
}
- // Don't try to load empty values or values that are not absolute paths.
- if (locale_file_path.empty() || !locale_file_path.IsAbsolute())
- return base::FilePath();
-
- if (base::PathExists(locale_file_path))
- return locale_file_path;
-
- return base::FilePath();
+ // Don't try to load from paths that are not absolute.
+ return locale_file_path.IsAbsolute() ? locale_file_path : base::FilePath();
}
#endif
#if !defined(OS_ANDROID)
-std::string ResourceBundle::LoadLocaleResources(
- const std::string& pref_locale) {
+std::string ResourceBundle::LoadLocaleResources(const std::string& pref_locale,
+ bool crash_on_failure) {
DCHECK(!locale_resources_data_.get()) << "locale.pak already loaded";
std::string app_locale = l10n_util::GetApplicationLocale(pref_locale);
base::FilePath locale_file_path = GetOverriddenPakPath();
@@ -437,10 +434,18 @@ std::string ResourceBundle::LoadLocaleResources(
}
std::unique_ptr<DataPack> data_pack(new DataPack(SCALE_FACTOR_100P));
- if (!data_pack->LoadFromPath(locale_file_path)) {
- LOG(ERROR) << "failed to load locale file: " << locale_file_path;
- NOTREACHED();
- return std::string();
+ if (!data_pack->LoadFromPath(locale_file_path) && crash_on_failure) {
+ // https://crbug.com/1076423: Chrome can't start when the locale file cannot
+ // be loaded. Crash early and gather some data.
+#if defined(OS_WIN)
+ const auto last_error = ::GetLastError();
+ base::debug::Alias(&last_error);
+ wchar_t path_copy[MAX_PATH];
+ base::wcslcpy(path_copy, locale_file_path.value().c_str(),
+ base::size(path_copy));
+ base::debug::Alias(path_copy);
+#endif // defined(OS_WIN)
+ CHECK(false);
}
locale_resources_data_ = std::move(data_pack);
@@ -500,6 +505,12 @@ base::string16 ResourceBundle::MaybeMangleLocalizedString(
if (base::StringToInt(str, &ignored))
return str;
+ // IDS_WEBSTORE_URL and some other resources are localization "strings" that
+ // are actually URLs, where the "localized" part is actually just the language
+ // code embedded in the URL. Don't mangle any URL.
+ if (GURL(str).is_valid())
+ return str;
+
// For a string S, produce [[ --- S --- ]], where the number of dashes is 1/4
// of the number of characters in S. This makes S something around 50-75%
// longer, except for extremely short strings, which get > 100% longer.
@@ -518,7 +529,7 @@ std::string ResourceBundle::ReloadLocaleResources(
overridden_locale_strings_.clear();
UnloadLocaleResources();
- return LoadLocaleResources(pref_locale);
+ return LoadLocaleResources(pref_locale, /*crash_on_failure=*/false);
}
gfx::ImageSkia* ResourceBundle::GetImageSkiaNamed(int resource_id) {
diff --git a/chromium/ui/base/resource/resource_bundle.h b/chromium/ui/base/resource/resource_bundle.h
index 0b62c5dba94..9cbc1d512ac 100644
--- a/chromium/ui/base/resource/resource_bundle.h
+++ b/chromium/ui/base/resource/resource_bundle.h
@@ -13,6 +13,7 @@
#include <unordered_map>
#include <vector>
+#include "base/component_export.h"
#include "base/files/file_path.h"
#include "base/files/memory_mapped_file.h"
#include "base/gtest_prod_util.h"
@@ -21,7 +22,6 @@
#include "base/strings/string16.h"
#include "base/strings/string_piece.h"
#include "ui/base/layout.h"
-#include "ui/base/ui_base_export.h"
#include "ui/gfx/font_list.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/native_widget_types.h"
@@ -41,7 +41,7 @@ class ResourceHandle;
// ResourceBundle is a central facility to load images and other resources,
// such as theme graphics. Every resource is loaded only once.
-class UI_BASE_EXPORT ResourceBundle {
+class COMPONENT_EXPORT(UI_BASE) ResourceBundle {
public:
// Legacy font size deltas. Consider these to be magic numbers. New code
// should declare their own size delta constant using an identifier that
@@ -121,9 +121,10 @@ class UI_BASE_EXPORT ResourceBundle {
// Initialize the ResourceBundle for this process. Does not take ownership of
// the |delegate| value. Returns the language selected or an empty string if
- // initialization failed (e.g. resource bundle not found or corrupted).
- // NOTE: Mac ignores this and always loads up resources for the language
- // defined by the Cocoa UI (i.e., NSBundle does the language work).
+ // no candidate bundle file could be determined, or crashes the process if a
+ // candidate could not be loaded (e.g., file not found or corrupted). NOTE:
+ // Mac ignores this and always loads up resources for the language defined by
+ // the Cocoa UI (i.e., NSBundle does the language work).
//
// TODO(sergeyu): This method also loads common resources (i.e. chrome.pak).
// There is no way to specify which resource files are loaded, i.e. names of
@@ -323,8 +324,10 @@ class UI_BASE_EXPORT ResourceBundle {
const base::string16& string);
// Returns the full pathname of the locale file to load, which may be a
- // compressed locale file ending in .gz. Returns an empty string if no locale
- // data files are found.
+ // compressed locale file ending in .gz. Returns an empty path if |app_locale|
+ // is empty, the directory of locale files cannot be determined, or if the
+ // path to the directory of locale files is relative. If not empty, the
+ // returned path is not guaranteed to reference an existing file.
// Used on Android to load the local file in the browser process and pass it
// to the sandboxed renderer process.
static base::FilePath GetLocaleFilePath(const std::string& app_locale);
@@ -396,8 +399,11 @@ class UI_BASE_EXPORT ResourceBundle {
void AddDataPack(std::unique_ptr<DataPack> data_pack);
// Try to load the locale specific strings from an external data module.
- // Returns the locale that is loaded.
- std::string LoadLocaleResources(const std::string& pref_locale);
+ // Returns the locale that is loaded or an empty string if no resources were
+ // loaded. If |crash_on_failure| is true on non-Android platforms, the process
+ // is terminated if a candidate locale file could not be loaded.
+ std::string LoadLocaleResources(const std::string& pref_locale,
+ bool crash_on_failure);
// Load test resources in given paths. If either path is empty an empty
// resource pack is loaded.
diff --git a/chromium/ui/base/resource/resource_bundle_android.cc b/chromium/ui/base/resource/resource_bundle_android.cc
index c86a3bfa2bd..e8cf7b78c66 100644
--- a/chromium/ui/base/resource/resource_bundle_android.cc
+++ b/chromium/ui/base/resource/resource_bundle_android.cc
@@ -4,10 +4,14 @@
#include "ui/base/resource/resource_bundle_android.h"
+#include <utility>
+
#include "base/android/apk_assets.h"
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
+#include "base/files/file_util.h"
#include "base/logging.h"
+#include "base/notreached.h"
#include "base/path_service.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/data_pack.h"
@@ -56,11 +60,10 @@ bool LoadFromApkOrFile(const char* apk_path,
int LoadLocalePakFromApk(const std::string& app_locale,
bool in_split,
base::MemoryMappedFile::Region* out_region) {
+ bool log_error = true;
std::string locale_path_within_apk =
- GetPathForAndroidLocalePakWithinApk(app_locale, in_split);
+ GetPathForAndroidLocalePakWithinApk(app_locale, in_split, log_error);
if (locale_path_within_apk.empty()) {
- LOG(WARNING) << "locale_path_within_apk.empty() for locale "
- << app_locale;
return -1;
}
return base::android::OpenApkAsset(locale_path_within_apk, out_region);
@@ -95,16 +98,20 @@ void ResourceBundle::LoadCommonResources() {
// static
bool ResourceBundle::LocaleDataPakExists(const std::string& locale) {
- if (g_locale_paks_in_apk) {
- return !GetPathForAndroidLocalePakWithinApk(locale, false).empty();
+ bool log_error = false;
+ bool in_split = !g_locale_paks_in_apk;
+ if (!in_split) {
+ return !GetPathForAndroidLocalePakWithinApk(locale, in_split, log_error)
+ .empty();
}
- if (!GetPathForAndroidLocalePakWithinApk(locale, true).empty())
+ if (!GetPathForAndroidLocalePakWithinApk(locale, in_split, log_error).empty())
return true;
- return !GetLocaleFilePath(locale).empty();
+ const auto path = GetLocaleFilePath(locale);
+ return !path.empty() && base::PathExists(path);
}
-std::string ResourceBundle::LoadLocaleResources(
- const std::string& pref_locale) {
+std::string ResourceBundle::LoadLocaleResources(const std::string& pref_locale,
+ bool crash_on_failure) {
DCHECK(!locale_resources_data_.get() &&
!secondary_locale_resources_data_.get())
<< "locale.pak already loaded";
@@ -166,8 +173,11 @@ std::string ResourceBundle::LoadLocaleResources(
}
if (g_locale_pack_fd < 0) {
// Otherwise, try to locate the extracted locale .pak file.
- if (locale_file_path.empty())
- locale_file_path = GetLocaleFilePath(app_locale);
+ if (locale_file_path.empty()) {
+ auto path = GetLocaleFilePath(app_locale);
+ if (base::PathExists(path))
+ locale_file_path = std::move(path);
+ }
if (locale_file_path.empty()) {
// It's possible that there is no locale.pak.
@@ -260,11 +270,13 @@ int GetSecondaryLocalePackFd(base::MemoryMappedFile::Region* out_region) {
}
std::string GetPathForAndroidLocalePakWithinApk(const std::string& locale,
- bool in_bundle) {
+ bool in_bundle,
+ bool log_error) {
JNIEnv* env = base::android::AttachCurrentThread();
base::android::ScopedJavaLocalRef<jstring> ret =
Java_ResourceBundle_getLocalePakResourcePath(
- env, base::android::ConvertUTF8ToJavaString(env, locale), in_bundle);
+ env, base::android::ConvertUTF8ToJavaString(env, locale), in_bundle,
+ log_error);
if (ret.obj() == nullptr) {
return std::string();
}
diff --git a/chromium/ui/base/resource/resource_bundle_android.h b/chromium/ui/base/resource/resource_bundle_android.h
index e02fc11568f..99096888fc9 100644
--- a/chromium/ui/base/resource/resource_bundle_android.h
+++ b/chromium/ui/base/resource/resource_bundle_android.h
@@ -8,55 +8,57 @@
#include <jni.h>
#include <string>
+#include "base/component_export.h"
#include "base/files/memory_mapped_file.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
// Loads "resources.apk" from the .apk. Falls back to loading from disk, which
// is necessary for tests.
-UI_BASE_EXPORT void LoadMainAndroidPackFile(
- const char* path_within_apk,
- const base::FilePath& disk_file_path);
+COMPONENT_EXPORT(UI_BASE)
+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.
-UI_BASE_EXPORT void LoadPackFileFromApk(const std::string& path);
+COMPONENT_EXPORT(UI_BASE) void LoadPackFileFromApk(const std::string& path);
// Returns the file descriptor and region for resources.pak.
-UI_BASE_EXPORT int GetMainAndroidPackFd(
- base::MemoryMappedFile::Region* out_region);
+COMPONENT_EXPORT(UI_BASE)
+int GetMainAndroidPackFd(base::MemoryMappedFile::Region* out_region);
// Returns the file descriptor and region for chrome_100_percent.pak.
-UI_BASE_EXPORT int GetCommonResourcesPackFd(
- base::MemoryMappedFile::Region* out_region);
+COMPONENT_EXPORT(UI_BASE)
+int GetCommonResourcesPackFd(base::MemoryMappedFile::Region* out_region);
// Returns the file descriptor and region for the locale .pak file.
-UI_BASE_EXPORT int GetLocalePackFd(
- base::MemoryMappedFile::Region* out_region);
+COMPONENT_EXPORT(UI_BASE)
+int GetLocalePackFd(base::MemoryMappedFile::Region* out_region);
// Returns the file descriptor and region for the secondary locale .pak file.
-UI_BASE_EXPORT int GetSecondaryLocalePackFd(
- base::MemoryMappedFile::Region* out_region);
+COMPONENT_EXPORT(UI_BASE)
+int GetSecondaryLocalePackFd(base::MemoryMappedFile::Region* out_region);
// Tell ResourceBundle to locate locale pak files via
// GetPathForAndroidLocalePakWithinApk rather than looking for them on disk.
-UI_BASE_EXPORT void SetLocalePaksStoredInApk(bool value);
+COMPONENT_EXPORT(UI_BASE) void SetLocalePaksStoredInApk(bool value);
// Tell ResourceBundle to load secondary locale .pak files.
-UI_BASE_EXPORT void SetLoadSecondaryLocalePaks(bool value);
+COMPONENT_EXPORT(UI_BASE) void SetLoadSecondaryLocalePaks(bool value);
// Returns the path within the apk for the given locale's .pak file, or an
// empty string if it doesn't exist.
// Only locale paks for the active Android language can be retrieved.
-// If |inSplit| is true, look into bundle split-specific location (e.g.
+// If |in_split| is true, look into bundle split-specific location (e.g.
// 'assets/locales#lang_<lang>/<locale>.pak', otherwise use the default
// WebView-related location, i.e. 'assets/stored-locales/<locale>.pak'.
-UI_BASE_EXPORT std::string GetPathForAndroidLocalePakWithinApk(
- const std::string& locale,
- bool in_split = false);
+// If |log_error|, logs the path to logcat, but does not abort.
+COMPONENT_EXPORT(UI_BASE)
+std::string GetPathForAndroidLocalePakWithinApk(const std::string& locale,
+ bool in_split,
+ bool log_error);
// Called in test when there are no locale pak files available.
-UI_BASE_EXPORT void SetNoAvailableLocalePaksForTest();
+COMPONENT_EXPORT(UI_BASE) void SetNoAvailableLocalePaksForTest();
// Get the density of the primary display. Use this instead of using Display
// to avoid initializing Display in child processes.
diff --git a/chromium/ui/base/resource/resource_bundle_ios.mm b/chromium/ui/base/resource/resource_bundle_ios.mm
index 111786882c6..f623bdf562d 100644
--- a/chromium/ui/base/resource/resource_bundle_ios.mm
+++ b/chromium/ui/base/resource/resource_bundle_ios.mm
@@ -13,6 +13,7 @@
#include "base/mac/foundation_util.h"
#include "base/mac/scoped_nsobject.h"
#include "base/memory/ref_counted_memory.h"
+#include "base/notreached.h"
#include "base/strings/sys_string_conversions.h"
#include "base/synchronization/lock.h"
#include "ui/base/resource/resource_handle.h"
@@ -80,14 +81,8 @@ base::FilePath ResourceBundle::GetLocaleFilePath(
locale_file_path, app_locale);
}
- // Don't try to load empty values or values that are not absolute paths.
- if (locale_file_path.empty() || !locale_file_path.IsAbsolute())
- return base::FilePath();
-
- if (!base::PathExists(locale_file_path))
- return base::FilePath();
-
- return locale_file_path;
+ // Don't try to load from paths that are not absolute.
+ return locale_file_path.IsAbsolute() ? locale_file_path : base::FilePath();
}
gfx::Image& ResourceBundle::GetNativeImageNamed(int resource_id) {
diff --git a/chromium/ui/base/resource/resource_bundle_mac.mm b/chromium/ui/base/resource/resource_bundle_mac.mm
index 6bd9d7aff19..87921ce6c6b 100644
--- a/chromium/ui/base/resource/resource_bundle_mac.mm
+++ b/chromium/ui/base/resource/resource_bundle_mac.mm
@@ -9,9 +9,11 @@
#include "base/files/file_path.h"
#include "base/files/file_util.h"
+#include "base/logging.h"
#include "base/mac/bundle_locations.h"
#include "base/mac/scoped_nsobject.h"
#include "base/memory/ref_counted_memory.h"
+#include "base/notreached.h"
#include "base/strings/sys_string_conversions.h"
#include "base/synchronization/lock.h"
#include "ui/base/resource/resource_handle.h"
@@ -80,14 +82,8 @@ base::FilePath ResourceBundle::GetLocaleFilePath(
locale_file_path, app_locale);
}
- // Don't try to load empty values or values that are not absolute paths.
- if (locale_file_path.empty() || !locale_file_path.IsAbsolute())
- return base::FilePath();
-
- if (!base::PathExists(locale_file_path))
- return base::FilePath();
-
- return locale_file_path;
+ // Don't try to load from paths that are not absolute.
+ return locale_file_path.IsAbsolute() ? locale_file_path : base::FilePath();
}
gfx::Image& ResourceBundle::GetNativeImageNamed(int resource_id) {
diff --git a/chromium/ui/base/resource/resource_bundle_unittest.cc b/chromium/ui/base/resource/resource_bundle_unittest.cc
index 904695c9291..bfa3dab5e80 100644
--- a/chromium/ui/base/resource/resource_bundle_unittest.cc
+++ b/chromium/ui/base/resource/resource_bundle_unittest.cc
@@ -163,16 +163,16 @@ TEST_F(ResourceBundleTest, DelegateGetPathForLocalePack) {
.RetiresOnSaturation();
EXPECT_FALSE(ResourceBundle::LocaleDataPakExists(locale));
- EXPECT_EQ("",
- ResourceBundle::GetSharedInstance().LoadLocaleResources(locale));
+ EXPECT_EQ("", ResourceBundle::GetSharedInstance().LoadLocaleResources(
+ locale, /*crash_on_failure=*/false));
// Allow the load to proceed.
EXPECT_CALL(delegate, GetPathForLocalePack(_, _))
.WillRepeatedly(ReturnArg<0>());
EXPECT_TRUE(ResourceBundle::LocaleDataPakExists(locale));
- EXPECT_EQ(locale,
- ResourceBundle::GetSharedInstance().LoadLocaleResources(locale));
+ EXPECT_EQ(locale, ResourceBundle::GetSharedInstance().LoadLocaleResources(
+ locale, /*crash_on_failure=*/false));
ResourceBundle::CleanupSharedInstance();
ResourceBundle::SwapSharedInstanceForTesting(orig_instance);
diff --git a/chromium/ui/base/resource/resource_bundle_win.h b/chromium/ui/base/resource/resource_bundle_win.h
index 92590eaff97..167f40c1ce3 100644
--- a/chromium/ui/base/resource/resource_bundle_win.h
+++ b/chromium/ui/base/resource/resource_bundle_win.h
@@ -9,16 +9,16 @@
#include <windows.h>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
// NOTE: This needs to be called before initializing ResourceBundle if your
// resources are not stored in the executable.
-UI_BASE_EXPORT void SetResourcesDataDLL(HINSTANCE handle);
+COMPONENT_EXPORT(UI_BASE) void SetResourcesDataDLL(HINSTANCE handle);
// Loads and returns an icon from the app module.
-UI_BASE_EXPORT HICON LoadThemeIconFromResourcesDataDLL(int icon_id);
+COMPONENT_EXPORT(UI_BASE) HICON LoadThemeIconFromResourcesDataDLL(int icon_id);
} // namespace ui
diff --git a/chromium/ui/base/scoped_visibility_tracker.h b/chromium/ui/base/scoped_visibility_tracker.h
index b351b57099e..2f53bc552b3 100644
--- a/chromium/ui/base/scoped_visibility_tracker.h
+++ b/chromium/ui/base/scoped_visibility_tracker.h
@@ -7,8 +7,8 @@
#include <memory>
+#include "base/component_export.h"
#include "base/time/time.h"
-#include "ui/base/ui_base_export.h"
namespace base {
class TickClock;
@@ -18,7 +18,7 @@ namespace ui {
// This class tracks the total time it is visible, based on receiving
// OnShown/OnHidden notifications, which are logically idempotent.
-class UI_BASE_EXPORT ScopedVisibilityTracker {
+class COMPONENT_EXPORT(UI_BASE) ScopedVisibilityTracker {
public:
// |tick_clock| must outlive this object.
ScopedVisibilityTracker(const base::TickClock* tick_clock, bool is_shown);
diff --git a/chromium/ui/base/template_expressions.cc b/chromium/ui/base/template_expressions.cc
index 2d7af5e5bc4..2f6573447c6 100644
--- a/chromium/ui/base/template_expressions.cc
+++ b/chromium/ui/base/template_expressions.cc
@@ -6,6 +6,8 @@
#include <stddef.h>
+#include <ostream>
+
#include "base/check_op.h"
#include "base/optional.h"
#include "base/stl_util.h"
diff --git a/chromium/ui/base/template_expressions.h b/chromium/ui/base/template_expressions.h
index a12f5b2fad8..470d54b3734 100644
--- a/chromium/ui/base/template_expressions.h
+++ b/chromium/ui/base/template_expressions.h
@@ -11,8 +11,8 @@
#include <map>
#include <string>
+#include "base/component_export.h"
#include "base/strings/string_piece.h"
-#include "ui/base/ui_base_export.h"
namespace base {
class DictionaryValue;
@@ -26,14 +26,16 @@ typedef std::map<const std::string, std::string> TemplateReplacements;
// Convert a dictionary to a replacement map. This helper function is to assist
// migration to using TemplateReplacements directly (which is preferred).
// TODO(dschuyler): remove this function by using TemplateReplacements directly.
-UI_BASE_EXPORT void TemplateReplacementsFromDictionaryValue(
+COMPONENT_EXPORT(UI_BASE)
+void TemplateReplacementsFromDictionaryValue(
const base::DictionaryValue& dictionary,
TemplateReplacements* replacements);
// Replace $i18n*{foo} in the format string with the value for the foo key in
// |replacements|. If the key is not found in the |replacements| that item will
// be unaltered.
-UI_BASE_EXPORT std::string ReplaceTemplateExpressions(
+COMPONENT_EXPORT(UI_BASE)
+std::string ReplaceTemplateExpressions(
base::StringPiece source,
const TemplateReplacements& replacements,
bool skip_unexpected_placeholder_check = false);
@@ -51,10 +53,10 @@ UI_BASE_EXPORT std::string ReplaceTemplateExpressions(
// backticks or "${" within the HTML string).
// Note: Currently, this only supports the legacy Polymer syntax, i.e.:
// _template: html` ... `,
-UI_BASE_EXPORT bool ReplaceTemplateExpressionsInJS(
- base::StringPiece source,
- const TemplateReplacements& replacements,
- std::string* output);
+COMPONENT_EXPORT(UI_BASE)
+bool ReplaceTemplateExpressionsInJS(base::StringPiece source,
+ const TemplateReplacements& replacements,
+ std::string* output);
} // namespace ui
diff --git a/chromium/ui/base/text/bytes_formatting.h b/chromium/ui/base/text/bytes_formatting.h
index 7cb6e45ce62..424d5297435 100644
--- a/chromium/ui/base/text/bytes_formatting.h
+++ b/chromium/ui/base/text/bytes_formatting.h
@@ -7,8 +7,8 @@
#include <stdint.h>
+#include "base/component_export.h"
#include "base/strings/string16.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
@@ -17,12 +17,12 @@ namespace ui {
// Simple call to return a byte quantity as a string in human-readable format.
// Ex: FormatBytes(512) => "512 B"
// Ex: FormatBytes(101479) => "99.1 kB"
-UI_BASE_EXPORT base::string16 FormatBytes(int64_t bytes);
+COMPONENT_EXPORT(UI_BASE) base::string16 FormatBytes(int64_t bytes);
// Simple call to return a speed as a string in human-readable format.
// Ex: FormatSpeed(512) => "512 B/s"
// Ex: FormatSpeed(101479) => "99.1 kB/s"
-UI_BASE_EXPORT base::string16 FormatSpeed(int64_t bytes);
+COMPONENT_EXPORT(UI_BASE) base::string16 FormatSpeed(int64_t bytes);
// Less-Simple API -------------------------------------------------------------
@@ -38,15 +38,16 @@ enum DataUnits {
// Return the unit type that is appropriate for displaying the amount of bytes
// passed in. Most of the time, an explicit call to this isn't necessary; just
// use FormatBytes()/FormatSpeed() above.
-UI_BASE_EXPORT DataUnits GetByteDisplayUnits(int64_t bytes);
+COMPONENT_EXPORT(UI_BASE) DataUnits GetByteDisplayUnits(int64_t bytes);
// Return a byte quantity as a string in human-readable format with an optional
// unit suffix. Specify in the |units| argument the units to be used.
// Ex: FormatBytes(512, DATA_UNITS_KIBIBYTE, true) => "0.5 kB"
// Ex: FormatBytes(10*1024, DATA_UNITS_MEBIBYTE, false) => "0.1"
-UI_BASE_EXPORT base::string16 FormatBytesWithUnits(int64_t bytes,
- DataUnits units,
- bool show_units);
+COMPONENT_EXPORT(UI_BASE)
+base::string16 FormatBytesWithUnits(int64_t bytes,
+ DataUnits units,
+ bool show_units);
// As above, but with "/s" units for speed values.
// Ex: FormatSpeed(512, DATA_UNITS_KIBIBYTE, true) => "0.5 kB/s"
diff --git a/chromium/ui/base/theme_provider.h b/chromium/ui/base/theme_provider.h
index 514a9ae4545..f47a724d56d 100644
--- a/chromium/ui/base/theme_provider.h
+++ b/chromium/ui/base/theme_provider.h
@@ -5,9 +5,9 @@
#ifndef UI_BASE_THEME_PROVIDER_H_
#define UI_BASE_THEME_PROVIDER_H_
+#include "base/component_export.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/base/layout.h"
-#include "ui/base/ui_base_export.h"
namespace base {
class RefCountedMemory;
@@ -32,7 +32,7 @@ namespace ui {
//
////////////////////////////////////////////////////////////////////////////////
-class UI_BASE_EXPORT ThemeProvider {
+class COMPONENT_EXPORT(UI_BASE) ThemeProvider {
public:
virtual ~ThemeProvider();
diff --git a/chromium/ui/base/ui_base_export.h b/chromium/ui/base/ui_base_export.h
deleted file mode 100644
index dba9b898029..00000000000
--- a/chromium/ui/base/ui_base_export.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_BASE_UI_BASE_EXPORT_H_
-#define UI_BASE_UI_BASE_EXPORT_H_
-
-// Defines UI_BASE_EXPORT so that functionality implemented by the UI module
-// can be exported to consumers.
-
-#if defined(COMPONENT_BUILD)
-
-#if defined(WIN32)
-
-#if defined(UI_BASE_IMPLEMENTATION)
-#define UI_BASE_EXPORT __declspec(dllexport)
-#else
-#define UI_BASE_EXPORT __declspec(dllimport)
-#endif
-
-#else // !defined(WIN32)
-
-#if defined(UI_BASE_IMPLEMENTATION)
-#define UI_BASE_EXPORT __attribute__((visibility("default")))
-#else
-#define UI_BASE_EXPORT
-#endif
-
-#endif
-
-#else // !defined(COMPONENT_BUILD)
-
-#define UI_BASE_EXPORT
-
-#endif
-
-#endif // UI_BASE_UI_BASE_EXPORT_H_
diff --git a/chromium/ui/base/ui_base_features.cc b/chromium/ui/base/ui_base_features.cc
index 7050729f302..3a6ee833e13 100644
--- a/chromium/ui/base/ui_base_features.cc
+++ b/chromium/ui/base/ui_base_features.cc
@@ -161,6 +161,18 @@ bool IsEyeDropperEnabled() {
base::FeatureList::IsEnabled(features::kEyeDropper);
}
+// Enable the CSSColorSchemeUARendering feature for Windows, ChromeOS, Linux,
+// and Mac. This feature will be released for Android in later milestones. See
+// crbug.com/1086530 for the Desktop launch bug.
+const base::Feature kCSSColorSchemeUARendering = {
+ "CSSColorSchemeUARendering", base::FEATURE_DISABLED_BY_DEFAULT};
+
+bool IsCSSColorSchemeUARenderingEnabled() {
+ static const bool css_color_scheme_ua_rendering_enabled =
+ base::FeatureList::IsEnabled(features::kCSSColorSchemeUARendering);
+ return css_color_scheme_ua_rendering_enabled;
+}
+
// Enable the FormControlsRefresh feature for Windows, ChromeOS, Linux, and Mac.
// This feature will be released for Android in later milestones. See
// crbug.com/1012106 for the Windows launch bug, and crbug.com/1012108 for the
@@ -188,13 +200,9 @@ bool IsUseCommonSelectPopupEnabled() {
return base::FeatureList::IsEnabled(features::kUseCommonSelectPopup);
}
-// Enable WebUI accessibility enhancements for review and testing.
-const base::Feature kWebUIA11yEnhancements{"WebUIA11yEnhancements",
- base::FEATURE_DISABLED_BY_DEFAULT};
-
#if defined(OS_CHROMEOS)
const base::Feature kHandwritingGesture = {"HandwritingGesture",
- base::FEATURE_DISABLED_BY_DEFAULT};
+ base::FEATURE_ENABLED_BY_DEFAULT};
#endif
const base::Feature kSynchronousPageFlipTesting{
@@ -204,4 +212,30 @@ bool IsSynchronousPageFlipTestingEnabled() {
return base::FeatureList::IsEnabled(kSynchronousPageFlipTesting);
}
+#if defined(USE_X11) || defined(USE_OZONE)
+const base::Feature kUseOzonePlatform {
+ "UseOzonePlatform",
+#if defined(USE_X11)
+ base::FEATURE_DISABLED_BY_DEFAULT
+};
+#else
+ base::FEATURE_ENABLED_BY_DEFAULT
+};
+#endif
+
+bool IsUsingOzonePlatform() {
+ // Only allow enabling and disabling the OzonePlatform on USE_X11 && USE_OZONE
+ // builds.
+#if defined(USE_X11) && defined(USE_OZONE)
+ return base::FeatureList::IsEnabled(kUseOzonePlatform);
+#elif defined(USE_X11) && !defined(USE_OZONE)
+ // This shouldn't be switchable for pure X11 builds.
+ return false;
+#else
+ // All the other platforms must use Ozone by default and can't disable that.
+ return true;
+#endif
+}
+#endif // defined(USE_X11) || defined(USE_OZONE)
+
} // namespace features
diff --git a/chromium/ui/base/ui_base_features.h b/chromium/ui/base/ui_base_features.h
index 83d7157f8d0..61f75131c9f 100644
--- a/chromium/ui/base/ui_base_features.h
+++ b/chromium/ui/base/ui_base_features.h
@@ -73,6 +73,11 @@ COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsForcedColorsEnabled();
COMPONENT_EXPORT(UI_BASE_FEATURES) extern const base::Feature kEyeDropper;
COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsEyeDropperEnabled();
+// Used to enable form controls and scrollbar dark mode rendering.
+COMPONENT_EXPORT(UI_BASE_FEATURES)
+extern const base::Feature kCSSColorSchemeUARendering;
+COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsCSSColorSchemeUARenderingEnabled();
+
// Used to enable the new controls UI.
COMPONENT_EXPORT(UI_BASE_FEATURES)
extern const base::Feature kFormControlsRefresh;
@@ -94,9 +99,6 @@ COMPONENT_EXPORT(UI_BASE_FEATURES)
bool IsNewShortcutMappingEnabled();
#endif
-COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kWebUIA11yEnhancements;
-
// Indicates whether DrmOverlayManager should used the synchronous API to
// perform pageflip tests.
COMPONENT_EXPORT(UI_BASE_FEATURES)
@@ -105,6 +107,21 @@ extern const base::Feature kSynchronousPageFlipTesting;
COMPONENT_EXPORT(UI_BASE_FEATURES)
bool IsSynchronousPageFlipTestingEnabled();
+#if defined(USE_X11) || defined(USE_OZONE)
+// Indicates whether the OzonePlatform feature is used on Linux. Although, it is
+// available for all Ozone platforms, this always resolves to true for
+// non-desktop Linux builds. The reason why it is needed for all Ozone builds is
+// that we have many places in the code that Ozone takes independently of the
+// platform, and it's highly important that when USE_X11 && USE_OZONE are true
+// and the OzonePlatform feature is not enabled, the Ozone path is never taken.
+// This will be removed as soon as Ozone/Linux is default and USE_X11 is
+// removed. More info at
+// https://docs.google.com/document/d/1PvKquOHWySbvbe4bgduAcpW0Pda4BBhXI7xphtyDtPQ
+COMPONENT_EXPORT(UI_BASE_FEATURES) extern const base::Feature kUseOzonePlatform;
+
+COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsUsingOzonePlatform();
+#endif
+
} // namespace features
#endif // UI_BASE_UI_BASE_FEATURES_H_
diff --git a/chromium/ui/base/ui_base_paths.h b/chromium/ui/base/ui_base_paths.h
index cf5e0041e6f..fa61416237d 100644
--- a/chromium/ui/base/ui_base_paths.h
+++ b/chromium/ui/base/ui_base_paths.h
@@ -5,8 +5,8 @@
#ifndef UI_BASE_UI_BASE_PATHS_H_
#define UI_BASE_UI_BASE_PATHS_H_
+#include "base/component_export.h"
#include "build/build_config.h"
-#include "ui/base/ui_base_export.h"
// This file declares path keys for various special directories. These can be
// used with the PathService to access these directories and files.
@@ -31,7 +31,7 @@ enum {
};
// Call once to register the provider for the path keys defined above.
-UI_BASE_EXPORT void RegisterPathProvider();
+COMPONENT_EXPORT(UI_BASE) void RegisterPathProvider();
} // namespace ui
diff --git a/chromium/ui/base/ui_base_switches.h b/chromium/ui/base/ui_base_switches.h
index 26b8dbf13a1..8e7fb9e0c93 100644
--- a/chromium/ui/base/ui_base_switches.h
+++ b/chromium/ui/base/ui_base_switches.h
@@ -7,41 +7,41 @@
#ifndef UI_BASE_UI_BASE_SWITCHES_H_
#define UI_BASE_UI_BASE_SWITCHES_H_
+#include "base/component_export.h"
#include "build/build_config.h"
-#include "ui/base/ui_base_export.h"
namespace switches {
#if defined(OS_MACOSX) && !defined(OS_IOS)
-UI_BASE_EXPORT extern const char kDisableAVFoundationOverlays[];
-UI_BASE_EXPORT extern const char kDisableMacOverlays[];
-UI_BASE_EXPORT extern const char kDisableModalAnimations[];
-UI_BASE_EXPORT extern const char kDisableRemoteCoreAnimation[];
-UI_BASE_EXPORT extern const char kShowMacOverlayBorders[];
+COMPONENT_EXPORT(UI_BASE) extern const char kDisableAVFoundationOverlays[];
+COMPONENT_EXPORT(UI_BASE) extern const char kDisableMacOverlays[];
+COMPONENT_EXPORT(UI_BASE) extern const char kDisableModalAnimations[];
+COMPONENT_EXPORT(UI_BASE) extern const char kDisableRemoteCoreAnimation[];
+COMPONENT_EXPORT(UI_BASE) extern const char kShowMacOverlayBorders[];
#endif
-UI_BASE_EXPORT extern const char kDisableCompositedAntialiasing[];
-UI_BASE_EXPORT extern const char kDisableDwmComposition[];
-UI_BASE_EXPORT extern const char kDisableTouchAdjustment[];
-UI_BASE_EXPORT extern const char kDisableTouchDragDrop[];
-UI_BASE_EXPORT extern const char kEnableTouchDragDrop[];
-UI_BASE_EXPORT extern const char kForceCaptionStyle[];
-UI_BASE_EXPORT extern const char kForceDarkMode[];
-UI_BASE_EXPORT extern const char kForceHighContrast[];
-UI_BASE_EXPORT extern const char kLang[];
-UI_BASE_EXPORT extern const char kShowOverdrawFeedback[];
-UI_BASE_EXPORT extern const char kSlowDownCompositingScaleFactor[];
-UI_BASE_EXPORT extern const char kTintGlCompositedContent[];
-UI_BASE_EXPORT extern const char kTopChromeTouchUi[];
-UI_BASE_EXPORT extern const char kTopChromeTouchUiAuto[];
-UI_BASE_EXPORT extern const char kTopChromeTouchUiDisabled[];
-UI_BASE_EXPORT extern const char kTopChromeTouchUiEnabled[];
-UI_BASE_EXPORT extern const char kUIDisablePartialSwap[];
-UI_BASE_EXPORT extern const char kUseSystemClipboard[];
+COMPONENT_EXPORT(UI_BASE) extern const char kDisableCompositedAntialiasing[];
+COMPONENT_EXPORT(UI_BASE) extern const char kDisableDwmComposition[];
+COMPONENT_EXPORT(UI_BASE) extern const char kDisableTouchAdjustment[];
+COMPONENT_EXPORT(UI_BASE) extern const char kDisableTouchDragDrop[];
+COMPONENT_EXPORT(UI_BASE) extern const char kEnableTouchDragDrop[];
+COMPONENT_EXPORT(UI_BASE) extern const char kForceCaptionStyle[];
+COMPONENT_EXPORT(UI_BASE) extern const char kForceDarkMode[];
+COMPONENT_EXPORT(UI_BASE) extern const char kForceHighContrast[];
+COMPONENT_EXPORT(UI_BASE) extern const char kLang[];
+COMPONENT_EXPORT(UI_BASE) extern const char kShowOverdrawFeedback[];
+COMPONENT_EXPORT(UI_BASE) extern const char kSlowDownCompositingScaleFactor[];
+COMPONENT_EXPORT(UI_BASE) extern const char kTintGlCompositedContent[];
+COMPONENT_EXPORT(UI_BASE) extern const char kTopChromeTouchUi[];
+COMPONENT_EXPORT(UI_BASE) extern const char kTopChromeTouchUiAuto[];
+COMPONENT_EXPORT(UI_BASE) extern const char kTopChromeTouchUiDisabled[];
+COMPONENT_EXPORT(UI_BASE) extern const char kTopChromeTouchUiEnabled[];
+COMPONENT_EXPORT(UI_BASE) extern const char kUIDisablePartialSwap[];
+COMPONENT_EXPORT(UI_BASE) extern const char kUseSystemClipboard[];
// Test related.
-UI_BASE_EXPORT extern const char kDisallowNonExactResourceReuse[];
-UI_BASE_EXPORT extern const char kMangleLocalizedStrings[];
+COMPONENT_EXPORT(UI_BASE) extern const char kDisallowNonExactResourceReuse[];
+COMPONENT_EXPORT(UI_BASE) extern const char kMangleLocalizedStrings[];
} // namespace switches
diff --git a/chromium/ui/base/ui_base_switches_util.h b/chromium/ui/base/ui_base_switches_util.h
index 2b6af8c1088..9928e56708b 100644
--- a/chromium/ui/base/ui_base_switches_util.h
+++ b/chromium/ui/base/ui_base_switches_util.h
@@ -5,11 +5,11 @@
#ifndef UI_BASE_UI_BASE_SWITCHES_UTIL_H_
#define UI_BASE_UI_BASE_SWITCHES_UTIL_H_
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace switches {
-UI_BASE_EXPORT bool IsTouchDragDropEnabled();
+COMPONENT_EXPORT(UI_BASE) bool IsTouchDragDropEnabled();
} // namespace switches
diff --git a/chromium/ui/base/ui_base_types.h b/chromium/ui/base/ui_base_types.h
index f79b03aaeb2..f290701526d 100644
--- a/chromium/ui/base/ui_base_types.h
+++ b/chromium/ui/base/ui_base_types.h
@@ -5,7 +5,7 @@
#ifndef UI_BASE_UI_BASE_TYPES_H_
#define UI_BASE_UI_BASE_TYPES_H_
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
@@ -93,7 +93,8 @@ enum MenuSourceType {
MENU_SOURCE_TYPE_LAST = MENU_SOURCE_ADJUST_SELECTION_RESET
};
-UI_BASE_EXPORT MenuSourceType GetMenuSourceTypeForEvent(const ui::Event& event);
+COMPONENT_EXPORT(UI_BASE)
+MenuSourceType GetMenuSourceTypeForEvent(const ui::Event& event);
} // namespace ui
diff --git a/chromium/ui/base/user_activity/user_activity_detector.h b/chromium/ui/base/user_activity/user_activity_detector.h
index 0f2a9a9ec4b..caffb50fdf8 100644
--- a/chromium/ui/base/user_activity/user_activity_detector.h
+++ b/chromium/ui/base/user_activity/user_activity_detector.h
@@ -6,10 +6,10 @@
#define UI_BASE_USER_ACTIVITY_USER_ACTIVITY_DETECTOR_H_
#include "base/compiler_specific.h"
+#include "base/component_export.h"
#include "base/macros.h"
#include "base/observer_list.h"
#include "base/time/time.h"
-#include "ui/base/ui_base_export.h"
#include "ui/events/event.h"
#include "ui/events/platform/platform_event_observer.h"
@@ -18,7 +18,8 @@ namespace ui {
class UserActivityObserver;
// Watches for input events and notifies observers that the user is active.
-class UI_BASE_EXPORT UserActivityDetector : public PlatformEventObserver {
+class COMPONENT_EXPORT(UI_BASE) UserActivityDetector
+ : public PlatformEventObserver {
public:
// Minimum amount of time between notifications to observers.
static const int kNotifyIntervalMs;
diff --git a/chromium/ui/base/user_activity/user_activity_observer.h b/chromium/ui/base/user_activity/user_activity_observer.h
index f6b98d210af..a83c8affd8e 100644
--- a/chromium/ui/base/user_activity/user_activity_observer.h
+++ b/chromium/ui/base/user_activity/user_activity_observer.h
@@ -5,8 +5,8 @@
#ifndef UI_BASE_USER_ACTIVITY_USER_ACTIVITY_OBSERVER_H_
#define UI_BASE_USER_ACTIVITY_USER_ACTIVITY_OBSERVER_H_
+#include "base/component_export.h"
#include "base/macros.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
class Event;
@@ -16,7 +16,7 @@ namespace ui {
// Interface for classes that want to be notified about user activity.
// Implementations should register themselves with UserActivityDetector.
-class UI_BASE_EXPORT UserActivityObserver {
+class COMPONENT_EXPORT(UI_BASE) UserActivityObserver {
public:
// Invoked periodically while the user is active (i.e. generating input
// events). |event| is the event that triggered the notification; it may
diff --git a/chromium/ui/base/view_prop.cc b/chromium/ui/base/view_prop.cc
index 45185f5ffbe..33b38a2ff04 100644
--- a/chromium/ui/base/view_prop.cc
+++ b/chromium/ui/base/view_prop.cc
@@ -53,9 +53,7 @@ class ViewProp::Data : public base::RefCounted<ViewProp::Data> {
typedef std::set<Data*, DataComparator> DataSet;
Data(gfx::AcceleratedWidget view, const char* key)
- : view_(view),
- key_(key),
- data_(NULL) {}
+ : view_(view), key_(key), data_(nullptr) {}
~Data() {
auto i = data_set_->find(this);
diff --git a/chromium/ui/base/view_prop.h b/chromium/ui/base/view_prop.h
index c81e995b0ba..c15007ae06a 100644
--- a/chromium/ui/base/view_prop.h
+++ b/chromium/ui/base/view_prop.h
@@ -5,10 +5,10 @@
#ifndef UI_BASE_VIEW_PROP_H_
#define UI_BASE_VIEW_PROP_H_
+#include "base/component_export.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "build/build_config.h"
-#include "ui/base/ui_base_export.h"
#include "ui/gfx/native_widget_types.h"
#if !defined(OS_WIN) && !defined(USE_AURA)
@@ -21,7 +21,7 @@ namespace ui {
// designed as a replacement for the Win32's SetProp, but does not make use of
// window manager memory. ViewProp shares similar semantics as SetProp, the
// value for a particular view/key pair comes from the last ViewProp created.
-class UI_BASE_EXPORT ViewProp {
+class COMPONENT_EXPORT(UI_BASE) ViewProp {
public:
// Associates data with a view/key pair. If a ViewProp has already been
// created for the specified pair |data| replaces the current value.
diff --git a/chromium/ui/base/webui/i18n_source_stream.h b/chromium/ui/base/webui/i18n_source_stream.h
index 994ac6ce4ba..bba7a13c27e 100644
--- a/chromium/ui/base/webui/i18n_source_stream.h
+++ b/chromium/ui/base/webui/i18n_source_stream.h
@@ -8,14 +8,15 @@
#include <memory>
#include <string>
+#include "base/component_export.h"
#include "base/macros.h"
#include "net/filter/filter_source_stream.h"
#include "ui/base/template_expressions.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
-class UI_BASE_EXPORT I18nSourceStream : public net::FilterSourceStream {
+class COMPONENT_EXPORT(UI_BASE) I18nSourceStream
+ : public net::FilterSourceStream {
public:
~I18nSourceStream() override;
diff --git a/chromium/ui/base/webui/jstemplate_builder.cc b/chromium/ui/base/webui/jstemplate_builder.cc
index b2b2b142275..50c52507d00 100644
--- a/chromium/ui/base/webui/jstemplate_builder.cc
+++ b/chromium/ui/base/webui/jstemplate_builder.cc
@@ -123,7 +123,7 @@ void AppendJsonJS(const base::DictionaryValue* json,
// If the script is being imported as a module, import |loadTimeData| in
// order to allow assigning the localized strings to loadTimeData.data.
output->append("import {loadTimeData} from ");
- output->append("'chrome://resources/js/load_time_data.m.js';\n");
+ output->append("'//resources/js/load_time_data.m.js';\n");
}
std::string jstext;
diff --git a/chromium/ui/base/webui/jstemplate_builder.h b/chromium/ui/base/webui/jstemplate_builder.h
index 5b1c1170690..97a4a558a2d 100644
--- a/chromium/ui/base/webui/jstemplate_builder.h
+++ b/chromium/ui/base/webui/jstemplate_builder.h
@@ -15,8 +15,8 @@
#include <string>
+#include "base/component_export.h"
#include "base/strings/string_piece.h"
-#include "ui/base/ui_base_export.h"
namespace base {
class DictionaryValue;
@@ -27,22 +27,23 @@ namespace webui {
// A helper function that generates a string of HTML to be loaded. The
// string includes the HTML and the javascript code necessary to generate the
// full page with support for i18n Templates.
-UI_BASE_EXPORT std::string GetI18nTemplateHtml(
- const base::StringPiece& html_template,
- const base::DictionaryValue* json);
+COMPONENT_EXPORT(UI_BASE)
+std::string GetI18nTemplateHtml(const base::StringPiece& html_template,
+ const base::DictionaryValue* json);
// A helper function that generates a string of HTML to be loaded. The
// string includes the HTML and the javascript code necessary to generate the
// full page with support for both i18n Templates and JsTemplates.
-UI_BASE_EXPORT std::string GetTemplatesHtml(
- const base::StringPiece& html_template,
- const base::DictionaryValue* json,
- const base::StringPiece& template_id);
+COMPONENT_EXPORT(UI_BASE)
+std::string GetTemplatesHtml(const base::StringPiece& html_template,
+ const base::DictionaryValue* json,
+ const base::StringPiece& template_id);
// Assigns the given json data into |loadTimeData|, without a <script> tag.
-UI_BASE_EXPORT void AppendJsonJS(const base::DictionaryValue* json,
- std::string* output,
- bool from_js_module);
+COMPONENT_EXPORT(UI_BASE)
+void AppendJsonJS(const base::DictionaryValue* json,
+ std::string* output,
+ bool from_js_module);
} // namespace webui
diff --git a/chromium/ui/base/webui/web_ui_util.cc b/chromium/ui/base/webui/web_ui_util.cc
index 6b6ea2d9bb7..ffc30f61a7a 100644
--- a/chromium/ui/base/webui/web_ui_util.cc
+++ b/chromium/ui/base/webui/web_ui_util.cc
@@ -189,7 +189,6 @@ void ParsePathAndFrame(const GURL& url, std::string* path, int* frame_index) {
void SetLoadTimeDataDefaults(const std::string& app_locale,
base::DictionaryValue* localized_strings) {
- localized_strings->SetString("a11yenhanced", GetA11yEnhanced());
localized_strings->SetString("fontfamily", GetFontFamily());
localized_strings->SetString("fontsize", GetFontSize());
localized_strings->SetString("language", l10n_util::GetLanguage(app_locale));
@@ -198,7 +197,6 @@ void SetLoadTimeDataDefaults(const std::string& app_locale,
void SetLoadTimeDataDefaults(const std::string& app_locale,
ui::TemplateReplacements* replacements) {
- (*replacements)["a11yenhanced"] = GetA11yEnhanced();
(*replacements)["fontfamily"] = GetFontFamily();
(*replacements)["fontsize"] = GetFontSize();
(*replacements)["language"] = l10n_util::GetLanguage(app_locale);
@@ -225,12 +223,6 @@ void AppendWebUiCssTextDefaults(std::string* html) {
html->append("</style>");
}
-std::string GetA11yEnhanced() {
- return base::FeatureList::IsEnabled(features::kWebUIA11yEnhancements)
- ? "a11y-enhanced"
- : "";
-}
-
std::string GetFontFamily() {
std::string font_family = l10n_util::GetStringUTF8(IDS_WEB_FONT_FAMILY);
diff --git a/chromium/ui/base/webui/web_ui_util.h b/chromium/ui/base/webui/web_ui_util.h
index 77e20e282e8..1aa12627756 100644
--- a/chromium/ui/base/webui/web_ui_util.h
+++ b/chromium/ui/base/webui/web_ui_util.h
@@ -9,10 +9,10 @@
#include <string>
+#include "base/component_export.h"
#include "base/strings/string_piece.h"
#include "base/values.h"
#include "ui/base/template_expressions.h"
-#include "ui/base/ui_base_export.h"
#include "ui/base/window_open_disposition.h"
class GURL;
@@ -27,21 +27,22 @@ struct LocalizedString {
// Convenience routine to convert SkBitmap object to data url
// so that it can be used in WebUI.
-UI_BASE_EXPORT std::string GetBitmapDataUrl(const SkBitmap& bitmap);
+COMPONENT_EXPORT(UI_BASE) std::string GetBitmapDataUrl(const SkBitmap& bitmap);
// Convenience routine to convert an in-memory PNG to a data url for WebUI use.
-UI_BASE_EXPORT std::string GetPngDataUrl(const unsigned char* data,
- size_t size);
+COMPONENT_EXPORT(UI_BASE)
+std::string GetPngDataUrl(const unsigned char* data, size_t size);
// Extracts a disposition from click event arguments. |args| should contain
// an integer button and booleans alt key, ctrl key, meta key, and shift key
// (in that order), starting at |start_index|.
-UI_BASE_EXPORT WindowOpenDisposition
- GetDispositionFromClick(const base::ListValue* args, int start_index);
+COMPONENT_EXPORT(UI_BASE)
+WindowOpenDisposition GetDispositionFromClick(const base::ListValue* args,
+ int start_index);
// Parse a formatted scale factor string into float and sets to |scale_factor|.
-UI_BASE_EXPORT bool ParseScaleFactor(const base::StringPiece& identifier,
- float* scale_factor);
+COMPONENT_EXPORT(UI_BASE)
+bool ParseScaleFactor(const base::StringPiece& identifier, float* scale_factor);
// Parses a URL containing some path [{frame}]@{scale}x. If it contains a
// scale factor then it is returned and the associated part of the URL is
@@ -50,49 +51,47 @@ UI_BASE_EXPORT bool ParseScaleFactor(const base::StringPiece& identifier,
// is returned and the associated part of the URL is removed from the
// returned |path|, otherwise the default frame index is returned and |path|
// is left intact.
-UI_BASE_EXPORT void ParsePathAndImageSpec(const GURL& url,
- std::string* path,
- float* scale_factor,
- int* frame_index);
+COMPONENT_EXPORT(UI_BASE)
+void ParsePathAndImageSpec(const GURL& url,
+ std::string* path,
+ float* scale_factor,
+ int* frame_index);
// Parses a URL containing some path @{scale}x. If it does not contain a scale
// factor then the default scale factor is returned.
-UI_BASE_EXPORT void ParsePathAndScale(const GURL& url,
- std::string* path,
- float* scale_factor);
+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.
-UI_BASE_EXPORT void ParsePathAndFrame(const GURL& url,
- std::string* path,
- int* frame_index);
+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()).
-UI_BASE_EXPORT void SetLoadTimeDataDefaults(
- const std::string& app_locale,
- base::DictionaryValue* localized_strings);
-UI_BASE_EXPORT void SetLoadTimeDataDefaults(
- const std::string& app_locale,
- ui::TemplateReplacements* replacements);
+COMPONENT_EXPORT(UI_BASE)
+void SetLoadTimeDataDefaults(const std::string& app_locale,
+ base::DictionaryValue* localized_strings);
+COMPONENT_EXPORT(UI_BASE)
+void SetLoadTimeDataDefaults(const std::string& app_locale,
+ ui::TemplateReplacements* replacements);
// Get a CSS declaration for common text styles for all of Web UI.
-UI_BASE_EXPORT std::string GetWebUiCssTextDefaults();
+COMPONENT_EXPORT(UI_BASE) std::string GetWebUiCssTextDefaults();
// Get a CSS declaration for common text styles for Web UI using
// Material Design.
-UI_BASE_EXPORT std::string GetWebUiCssTextDefaultsMd();
+COMPONENT_EXPORT(UI_BASE) std::string GetWebUiCssTextDefaultsMd();
// Appends the CSS declaration returned by GetWebUiCssTextDefaults() as an
// inline stylesheet.
-UI_BASE_EXPORT void AppendWebUiCssTextDefaults(std::string* html);
+COMPONENT_EXPORT(UI_BASE) void AppendWebUiCssTextDefaults(std::string* html);
-UI_BASE_EXPORT std::string GetA11yEnhanced();
// Get some common font styles for all of WebUI.
-UI_BASE_EXPORT std::string GetFontFamily();
-UI_BASE_EXPORT std::string GetFontSize();
-UI_BASE_EXPORT std::string GetTextDirection();
+COMPONENT_EXPORT(UI_BASE) std::string GetFontFamily();
+COMPONENT_EXPORT(UI_BASE) std::string GetFontSize();
+COMPONENT_EXPORT(UI_BASE) std::string GetTextDirection();
} // namespace webui
diff --git a/chromium/ui/base/win/accessibility_misc_utils.h b/chromium/ui/base/win/accessibility_misc_utils.h
index ec493a3cad2..98116875245 100644
--- a/chromium/ui/base/win/accessibility_misc_utils.h
+++ b/chromium/ui/base/win/accessibility_misc_utils.h
@@ -9,14 +9,14 @@
#include <UIAutomationCore.h>
#include "base/compiler_specific.h"
+#include "base/component_export.h"
#include "base/strings/string16.h"
-#include "ui/base/ui_base_export.h"
namespace base {
namespace win {
// UIA Text provider implementation for edit controls.
-class UI_BASE_EXPORT UIATextProvider
+class COMPONENT_EXPORT(UI_BASE) UIATextProvider
: public CComObjectRootEx<CComMultiThreadModel>,
public ITextProvider {
public:
diff --git a/chromium/ui/base/win/event_creation_utils.cc b/chromium/ui/base/win/event_creation_utils.cc
new file mode 100644
index 00000000000..29efc62b3cc
--- /dev/null
+++ b/chromium/ui/base/win/event_creation_utils.cc
@@ -0,0 +1,37 @@
+// 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/base/win/event_creation_utils.h"
+
+#include <windows.h>
+#include <winuser.h>
+
+#include <algorithm>
+
+#include "base/numerics/ranges.h"
+#include "ui/gfx/geometry/point.h"
+
+namespace ui {
+
+bool SendMouseEvent(const gfx::Point& point, int flags) {
+ INPUT input = {INPUT_MOUSE};
+ // Get the max screen coordinate for use in computing the normalized absolute
+ // coordinates required by SendInput.
+ const int max_x = ::GetSystemMetrics(SM_CXSCREEN) - 1;
+ const int max_y = ::GetSystemMetrics(SM_CYSCREEN) - 1;
+ int screen_x = base::ClampToRange(point.x(), 0, max_x);
+ int screen_y = base::ClampToRange(point.y(), 0, max_y);
+
+ // Form the input data containing the normalized absolute coordinates. As of
+ // Windows 10 Fall Creators Update, moving to an absolute position of zero
+ // does not work. It seems that moving to 1,1 does, though.
+ input.mi.dx =
+ static_cast<LONG>(std::max(1.0, std::ceil(screen_x * (65535.0 / max_x))));
+ input.mi.dy =
+ static_cast<LONG>(std::max(1.0, std::ceil(screen_y * (65535.0 / max_y))));
+ input.mi.dwFlags = flags;
+ return ::SendInput(1, &input, sizeof(input)) == 1;
+}
+
+} // namespace ui
diff --git a/chromium/ui/base/win/event_creation_utils.h b/chromium/ui/base/win/event_creation_utils.h
new file mode 100644
index 00000000000..cb893f240a2
--- /dev/null
+++ b/chromium/ui/base/win/event_creation_utils.h
@@ -0,0 +1,23 @@
+// 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.
+
+#ifndef UI_BASE_WIN_EVENT_CREATION_UTILS_H_
+#define UI_BASE_WIN_EVENT_CREATION_UTILS_H_
+
+#include "base/component_export.h"
+
+namespace gfx {
+class Point;
+} // namespace gfx
+
+namespace ui {
+
+// Send a mouse event to Windows input queue using ::SendInput, to screen
+// point |point|. Returns true if the mouse event was sent, false if not.
+COMPONENT_EXPORT(UI_BASE)
+bool SendMouseEvent(const gfx::Point& point, int flags);
+
+} // namespace ui
+
+#endif // UI_BASE_WIN_EVENT_CREATION_UTILS_H_
diff --git a/chromium/ui/base/win/foreground_helper.h b/chromium/ui/base/win/foreground_helper.h
index 38dcdbab9f2..333b87531d9 100644
--- a/chromium/ui/base/win/foreground_helper.h
+++ b/chromium/ui/base/win/foreground_helper.h
@@ -5,9 +5,9 @@
#ifndef UI_BASE_WIN_FOREGROUND_HELPER_H_
#define UI_BASE_WIN_FOREGROUND_HELPER_H_
-#include "base/logging.h"
+#include "base/component_export.h"
#include "base/macros.h"
-#include "ui/base/ui_base_export.h"
+#include "base/notreached.h"
#include "ui/gfx/win/window_impl.h"
#include <windows.h>
@@ -21,7 +21,7 @@ namespace ui {
// to be capable of moving to the foreground.
//
// This is probably leveraging a windows bug.
-class UI_BASE_EXPORT ForegroundHelper : public gfx::WindowImpl {
+class COMPONENT_EXPORT(UI_BASE) ForegroundHelper : public gfx::WindowImpl {
public:
ForegroundHelper();
~ForegroundHelper() override;
diff --git a/chromium/ui/base/win/hidden_window.cc b/chromium/ui/base/win/hidden_window.cc
index 3312dde6b26..accdea3bf6d 100644
--- a/chromium/ui/base/win/hidden_window.cc
+++ b/chromium/ui/base/win/hidden_window.cc
@@ -4,6 +4,7 @@
#include "ui/base/win/hidden_window.h"
+#include "base/notreached.h"
#include "ui/gfx/win/window_impl.h"
namespace ui {
diff --git a/chromium/ui/base/win/hidden_window.h b/chromium/ui/base/win/hidden_window.h
index 6cc2fd0dd6d..8524f1dafe4 100644
--- a/chromium/ui/base/win/hidden_window.h
+++ b/chromium/ui/base/win/hidden_window.h
@@ -7,13 +7,13 @@
#include <windows.h>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
// Returns an HWND that can be used as a temporary parent. The returned HWND is
// never destroyed.
-UI_BASE_EXPORT HWND GetHiddenWindow();
+COMPONENT_EXPORT(UI_BASE) HWND GetHiddenWindow();
} // namespace ui
diff --git a/chromium/ui/base/win/hwnd_metrics.h b/chromium/ui/base/win/hwnd_metrics.h
index 22ec6f9c85e..bc171aaebb9 100644
--- a/chromium/ui/base/win/hwnd_metrics.h
+++ b/chromium/ui/base/win/hwnd_metrics.h
@@ -7,12 +7,12 @@
#include <windows.h>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
// The size, in pixels, of the non-client frame around a window on |monitor|.
-UI_BASE_EXPORT int GetFrameThickness(HMONITOR monitor);
+COMPONENT_EXPORT(UI_BASE) int GetFrameThickness(HMONITOR monitor);
} // namespace ui
diff --git a/chromium/ui/base/win/hwnd_subclass.h b/chromium/ui/base/win/hwnd_subclass.h
index 56bced1b34d..6628f7b8d68 100644
--- a/chromium/ui/base/win/hwnd_subclass.h
+++ b/chromium/ui/base/win/hwnd_subclass.h
@@ -10,15 +10,15 @@
#include <memory>
#include <vector>
+#include "base/component_export.h"
#include "base/macros.h"
-#include "ui/base/ui_base_export.h"
#include "ui/base/view_prop.h"
namespace ui {
// Classes implementing this interface get the opportunity to handle and consume
// messages before they are sent to their target HWND.
-class UI_BASE_EXPORT HWNDMessageFilter {
+class COMPONENT_EXPORT(UI_BASE) HWNDMessageFilter {
public:
virtual ~HWNDMessageFilter();
@@ -39,7 +39,7 @@ class UI_BASE_EXPORT HWNDMessageFilter {
// An object that instance-subclasses a window. If the window has already been
// instance-subclassed, that subclassing is lost.
-class UI_BASE_EXPORT HWNDSubclass {
+class COMPONENT_EXPORT(UI_BASE) HWNDSubclass {
public:
~HWNDSubclass();
diff --git a/chromium/ui/base/win/internal_constants.h b/chromium/ui/base/win/internal_constants.h
index 65f025f397a..c34541f5cbb 100644
--- a/chromium/ui/base/win/internal_constants.h
+++ b/chromium/ui/base/win/internal_constants.h
@@ -5,18 +5,19 @@
#ifndef UI_BASE_WIN_INTERNAL_CONSTANTS_H_
#define UI_BASE_WIN_INTERNAL_CONSTANTS_H_
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
// This window property if set on the window does not activate the window for a
// touch based WM_MOUSEACTIVATE message.
-UI_BASE_EXPORT extern const wchar_t kIgnoreTouchMouseActivateForWindow[];
+COMPONENT_EXPORT(UI_BASE)
+extern const wchar_t kIgnoreTouchMouseActivateForWindow[];
// This property is put on an HWND so the compositor output knows to treat it
// as transparent and draw to it using WS_EX_LAYERED (if using the software
// compositor).
-UI_BASE_EXPORT extern const wchar_t kWindowTranslucent[];
+COMPONENT_EXPORT(UI_BASE) extern const wchar_t kWindowTranslucent[];
} // namespace ui
diff --git a/chromium/ui/base/win/lock_state.h b/chromium/ui/base/win/lock_state.h
index 02a7a2d72df..c596b5a2e08 100644
--- a/chromium/ui/base/win/lock_state.h
+++ b/chromium/ui/base/win/lock_state.h
@@ -5,12 +5,12 @@
#ifndef UI_BASE_WIN_LOCK_STATE_H_
#define UI_BASE_WIN_LOCK_STATE_H_
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
// Returns true if the screen is currently locked.
-UI_BASE_EXPORT bool IsWorkstationLocked();
+COMPONENT_EXPORT(UI_BASE) bool IsWorkstationLocked();
} // namespace ui
diff --git a/chromium/ui/base/win/message_box_win.h b/chromium/ui/base/win/message_box_win.h
index f48bec3e4fa..f19bb39e6fa 100644
--- a/chromium/ui/base/win/message_box_win.h
+++ b/chromium/ui/base/win/message_box_win.h
@@ -7,8 +7,8 @@
#include <windows.h>
+#include "base/component_export.h"
#include "base/strings/string16.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
@@ -16,10 +16,11 @@ namespace ui {
// MessageBox function allows us to control certain RTL locale flags so that
// callers don't have to worry about adding these flags when running in a
// right-to-left locale.
-UI_BASE_EXPORT int MessageBox(HWND hwnd,
- const base::string16& text,
- const base::string16& caption,
- UINT flags);
+COMPONENT_EXPORT(UI_BASE)
+int MessageBox(HWND hwnd,
+ const base::string16& text,
+ const base::string16& caption,
+ UINT flags);
} // namespace ui
diff --git a/chromium/ui/base/win/mouse_wheel_util.h b/chromium/ui/base/win/mouse_wheel_util.h
index b9f5872b0c4..7dc76d2a1f8 100644
--- a/chromium/ui/base/win/mouse_wheel_util.h
+++ b/chromium/ui/base/win/mouse_wheel_util.h
@@ -7,7 +7,7 @@
#include <windows.h>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
@@ -17,7 +17,8 @@ class ViewProp;
// We reroute the mouse wheel messages to such HWND when they are under the
// mouse pointer (but are not the active window). Callers own the returned
// object.
-UI_BASE_EXPORT ViewProp* SetWindowSupportsRerouteMouseWheel(HWND hwnd);
+COMPONENT_EXPORT(UI_BASE)
+ViewProp* SetWindowSupportsRerouteMouseWheel(HWND hwnd);
// Forwards mouse wheel messages to the window under it.
// Windows sends mouse wheel messages to the currently active window.
@@ -26,9 +27,8 @@ UI_BASE_EXPORT ViewProp* SetWindowSupportsRerouteMouseWheel(HWND hwnd);
// mouse wheel in order to scroll that window. This is arguably a better user
// experience. The returns value says whether the mouse wheel message was
// successfully redirected.
-UI_BASE_EXPORT bool RerouteMouseWheel(HWND window,
- WPARAM w_param,
- LPARAM l_param);
+COMPONENT_EXPORT(UI_BASE)
+bool RerouteMouseWheel(HWND window, WPARAM w_param, LPARAM l_param);
} // namespace ui
diff --git a/chromium/ui/base/win/scoped_ole_initializer.h b/chromium/ui/base/win/scoped_ole_initializer.h
index 28085f5f022..c82b1e1ddf7 100644
--- a/chromium/ui/base/win/scoped_ole_initializer.h
+++ b/chromium/ui/base/win/scoped_ole_initializer.h
@@ -5,14 +5,14 @@
#ifndef UI_BASE_WIN_SCOPED_OLE_INITIALIZER_H_
#define UI_BASE_WIN_SCOPED_OLE_INITIALIZER_H_
+#include "base/component_export.h"
#include "base/macros.h"
#include "base/threading/thread_checker.h"
#include "base/win/windows_types.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
-class UI_BASE_EXPORT ScopedOleInitializer {
+class COMPONENT_EXPORT(UI_BASE) ScopedOleInitializer {
public:
ScopedOleInitializer();
~ScopedOleInitializer();
diff --git a/chromium/ui/base/win/session_change_observer.h b/chromium/ui/base/win/session_change_observer.h
index b2b73f8a351..8ebb68d27d8 100644
--- a/chromium/ui/base/win/session_change_observer.h
+++ b/chromium/ui/base/win/session_change_observer.h
@@ -8,8 +8,8 @@
#include <windows.h>
#include "base/callback.h"
+#include "base/component_export.h"
#include "base/macros.h"
-#include "ui/base/ui_base_export.h"
namespace ui {
@@ -17,7 +17,7 @@ namespace ui {
// managing the tricky business of observing a singleton object. Only
// WTS_SESSION_LOCK and WTS_SESSION_UNLOCK events trigger the callback
// because those are the only events existing observers handle.
-class UI_BASE_EXPORT SessionChangeObserver {
+class COMPONENT_EXPORT(UI_BASE) SessionChangeObserver {
public:
// WPARAM is the wparam passed to the OnWndProc when message is
// WM_WTSSESSION_CHANGE. The bool indicates whether the session
diff --git a/chromium/ui/base/win/shell.h b/chromium/ui/base/win/shell.h
index 5a91276fe65..758c354bb09 100644
--- a/chromium/ui/base/win/shell.h
+++ b/chromium/ui/base/win/shell.h
@@ -7,8 +7,8 @@
#include <windows.h>
+#include "base/component_export.h"
#include "base/strings/string16.h"
-#include "ui/base/ui_base_export.h"
namespace base {
class FilePath;
@@ -21,7 +21,8 @@ namespace win {
// |full_path| does not refer to a folder.
//
// Note: Must be called on a thread that allows blocking.
-UI_BASE_EXPORT bool OpenFolderViaShell(const base::FilePath& full_path);
+COMPONENT_EXPORT(UI_BASE)
+bool OpenFolderViaShell(const base::FilePath& full_path);
// Invokes the default verb on the file specified by |full_path| via the Windows
// shell. Usually, the default verb is "open" unless specified otherwise for the
@@ -32,53 +33,56 @@ UI_BASE_EXPORT bool OpenFolderViaShell(const base::FilePath& full_path);
// |true| on success.
//
// Note: Must be called on a thread that allows blocking.
-UI_BASE_EXPORT bool OpenFileViaShell(const base::FilePath& full_path);
+COMPONENT_EXPORT(UI_BASE)
+bool OpenFileViaShell(const base::FilePath& full_path);
// Disables the ability of the specified window to be pinned to the taskbar or
// the Start menu. This will remove "Pin this program to taskbar" from the
// taskbar menu of the specified window.
-UI_BASE_EXPORT bool PreventWindowFromPinning(HWND hwnd);
+COMPONENT_EXPORT(UI_BASE) bool PreventWindowFromPinning(HWND hwnd);
// Sets the application id, app icon, relaunch command and relaunch display name
// for the given window. |app_icon_index| should be set to 0 if the app icon
// file only has a single icon.
-UI_BASE_EXPORT void SetAppDetailsForWindow(
- const base::string16& app_id,
- const base::FilePath& app_icon_path,
- int app_icon_index,
- const base::string16& relaunch_command,
- const base::string16& relaunch_display_name,
- HWND hwnd);
+COMPONENT_EXPORT(UI_BASE)
+void SetAppDetailsForWindow(const base::string16& app_id,
+ const base::FilePath& app_icon_path,
+ int app_icon_index,
+ const base::string16& relaunch_command,
+ const base::string16& relaunch_display_name,
+ HWND hwnd);
// Sets the application id given as the Application Model ID for the window
// specified. This method is used to insure that different web applications
// do not group together on the Win7 task bar.
-UI_BASE_EXPORT void SetAppIdForWindow(const base::string16& app_id, HWND hwnd);
+COMPONENT_EXPORT(UI_BASE)
+void SetAppIdForWindow(const base::string16& app_id, HWND hwnd);
// Sets the application icon for the window specified.
-UI_BASE_EXPORT void SetAppIconForWindow(const base::FilePath& app_icon_path,
- int app_icon_index,
- HWND hwnd);
+COMPONENT_EXPORT(UI_BASE)
+void SetAppIconForWindow(const base::FilePath& app_icon_path,
+ int app_icon_index,
+ HWND hwnd);
// Sets the relaunch command and relaunch display name for the window specified.
// Windows will use this information for grouping on the taskbar, and to create
// a shortcut if the window is pinned to the taskbar.
-UI_BASE_EXPORT void SetRelaunchDetailsForWindow(
- const base::string16& relaunch_command,
- const base::string16& display_name,
- HWND hwnd);
+COMPONENT_EXPORT(UI_BASE)
+void SetRelaunchDetailsForWindow(const base::string16& relaunch_command,
+ const base::string16& display_name,
+ HWND hwnd);
// Clears the Window Property Store on an HWND.
-UI_BASE_EXPORT void ClearWindowPropertyStore(HWND hwnd);
+COMPONENT_EXPORT(UI_BASE) void ClearWindowPropertyStore(HWND hwnd);
// Returns true if dwm composition is available and turned on on the current
// platform.
// This method supports a command-line override for testing.
-UI_BASE_EXPORT bool IsAeroGlassEnabled();
+COMPONENT_EXPORT(UI_BASE) bool IsAeroGlassEnabled();
// Returns true if dwm composition is available and turned on on the current
// platform.
-UI_BASE_EXPORT bool IsDwmCompositionEnabled();
+COMPONENT_EXPORT(UI_BASE) bool IsDwmCompositionEnabled();
} // namespace win
} // namespace ui
diff --git a/chromium/ui/base/win/touch_input.h b/chromium/ui/base/win/touch_input.h
index f113ec5b463..83457080a39 100644
--- a/chromium/ui/base/win/touch_input.h
+++ b/chromium/ui/base/win/touch_input.h
@@ -7,16 +7,17 @@
#include <windows.h>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
// Wrapper for GetTouchInputInfo, which is not defined before Win7. For
// earlier OS's, this function returns FALSE.
-UI_BASE_EXPORT BOOL GetTouchInputInfoWrapper(HTOUCHINPUT handle,
- UINT count,
- PTOUCHINPUT pointer,
- int size);
+COMPONENT_EXPORT(UI_BASE)
+BOOL GetTouchInputInfoWrapper(HTOUCHINPUT handle,
+ UINT count,
+ PTOUCHINPUT pointer,
+ int size);
} // namespace ui
diff --git a/chromium/ui/base/win/window_event_target.h b/chromium/ui/base/win/window_event_target.h
index 52cfa8d3ad9..61478cb28dd 100644
--- a/chromium/ui/base/win/window_event_target.h
+++ b/chromium/ui/base/win/window_event_target.h
@@ -7,14 +7,14 @@
#include <windows.h>
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
namespace ui {
// This interface is implemented by classes who get input events forwarded to
// them from others. E.g. would be a win32 parent child relationship where the
// child forwards input events to the parent after doing minimal processing.
-class UI_BASE_EXPORT WindowEventTarget {
+class COMPONENT_EXPORT(UI_BASE) WindowEventTarget {
public:
static const char kWin32InputEventTarget[];
diff --git a/chromium/ui/base/window_open_disposition.h b/chromium/ui/base/window_open_disposition.h
index 930024e8300..ef07e966a05 100644
--- a/chromium/ui/base/window_open_disposition.h
+++ b/chromium/ui/base/window_open_disposition.h
@@ -5,7 +5,7 @@
#ifndef UI_BASE_WINDOW_OPEN_DISPOSITION_H_
#define UI_BASE_WINDOW_OPEN_DISPOSITION_H_
-#include "ui/base/ui_base_export.h"
+#include "base/component_export.h"
// DEPRECATED: Instead of introducing new references to this enum, use
// the generated ui::mojom::WindowOpenDisposition in
@@ -41,20 +41,22 @@ namespace ui {
// suggest opening in the current tab; for example, a caller could set this to
// NEW_FOREGROUND_TAB to prevent a click from overwriting the current tab by
// default.
-UI_BASE_EXPORT WindowOpenDisposition
-DispositionFromClick(bool middle_button,
- bool alt_key,
- bool ctrl_key,
- bool meta_key,
- bool shift_key,
- WindowOpenDisposition disposition_for_current_tab =
- WindowOpenDisposition::CURRENT_TAB);
+COMPONENT_EXPORT(UI_BASE)
+WindowOpenDisposition DispositionFromClick(
+ bool middle_button,
+ bool alt_key,
+ bool ctrl_key,
+ bool meta_key,
+ bool shift_key,
+ WindowOpenDisposition disposition_for_current_tab =
+ WindowOpenDisposition::CURRENT_TAB);
// As with DispositionFromClick(), but using |event_flags| as in ui::MouseEvent.
-UI_BASE_EXPORT WindowOpenDisposition
-DispositionFromEventFlags(int event_flags,
- WindowOpenDisposition disposition_for_current_tab =
- WindowOpenDisposition::CURRENT_TAB);
+COMPONENT_EXPORT(UI_BASE)
+WindowOpenDisposition DispositionFromEventFlags(
+ int event_flags,
+ WindowOpenDisposition disposition_for_current_tab =
+ WindowOpenDisposition::CURRENT_TAB);
} // namespace ui
diff --git a/chromium/ui/base/x/BUILD.gn b/chromium/ui/base/x/BUILD.gn
index 0daf5090985..2737a66ff79 100644
--- a/chromium/ui/base/x/BUILD.gn
+++ b/chromium/ui/base/x/BUILD.gn
@@ -15,12 +15,18 @@ jumbo_component("x") {
sources = [
"selection_utils.cc",
"selection_utils.h",
+ "x11_cursor.cc",
+ "x11_cursor.h",
+ "x11_cursor_factory.cc",
+ "x11_cursor_factory.h",
"x11_desktop_window_move_client.cc",
"x11_desktop_window_move_client.h",
"x11_display_manager.cc",
"x11_display_manager.h",
"x11_display_util.cc",
"x11_display_util.h",
+ "x11_error_handler.cc",
+ "x11_error_handler.h",
"x11_menu_list.cc",
"x11_menu_list.h",
"x11_menu_registrar.cc",
@@ -46,7 +52,7 @@ jumbo_component("x") {
"x11_workspace_handler.h",
]
- if (is_desktop_linux) {
+ if (is_desktop_linux || is_chromeos) {
sources += [
"selection_owner.cc",
"selection_owner.h",
@@ -59,8 +65,6 @@ jumbo_component("x") {
]
}
- public_configs = [ "//build/config/linux:xrandr" ]
-
defines = [ "IS_UI_BASE_X_IMPL" ]
deps = [
@@ -72,6 +76,9 @@ jumbo_component("x") {
"//ui/base:hit_test",
"//ui/base:wm_role_names",
"//ui/base/clipboard:clipboard_types",
+ "//ui/base/cursor:cursor_base",
+ "//ui/base/cursor:theme_manager",
+ "//ui/base/cursor/mojom:cursor_type",
"//ui/base/dragdrop/file_info",
"//ui/display/util",
"//ui/events",
@@ -80,6 +87,7 @@ jumbo_component("x") {
"//ui/events/platform/x11",
"//ui/events/x:x",
"//ui/gfx",
+ "//ui/gfx/geometry",
"//ui/gfx/x",
"//ui/platform_window/common",
]
@@ -115,3 +123,14 @@ source_set("test_support") {
"//ui/gfx/x",
]
}
+
+source_set("unittests") {
+ testonly = true
+ sources = [ "x11_cursor_factory_unittest.cc" ]
+ deps = [
+ ":x",
+ "//skia",
+ "//testing/gtest",
+ "//ui/gfx/geometry",
+ ]
+}
diff --git a/chromium/ui/base/x/selection_owner.cc b/chromium/ui/base/x/selection_owner.cc
index 76d95fdd45a..755b502b20a 100644
--- a/chromium/ui/base/x/selection_owner.cc
+++ b/chromium/ui/base/x/selection_owner.cc
@@ -7,11 +7,14 @@
#include <algorithm>
#include "base/logging.h"
+#include "base/memory/ref_counted_memory.h"
#include "ui/base/x/selection_utils.h"
+#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"
namespace ui {
@@ -38,152 +41,142 @@ static_assert(KSelectionOwnerTimerPeriodMs <= kIncrementalTransferTimeoutMs,
// Returns a conservative max size of the data we can pass into
// XChangeProperty(). Copied from GTK.
-size_t GetMaxRequestSize(XDisplay* display) {
- long extended_max_size = XExtendedMaxRequestSize(display);
+size_t GetMaxRequestSize(x11::Connection* connection) {
+ long extended_max_size = connection->extended_max_request_length();
long max_size =
- (extended_max_size ? extended_max_size : XMaxRequestSize(display)) - 100;
+ (extended_max_size ? extended_max_size
+ : connection->setup().maximum_request_length) -
+ 100;
return std::min(static_cast<long>(0x40000),
std::max(static_cast<long>(0), max_size));
}
// Gets the value of an atom pair array property. On success, true is returned
// and the value is stored in |value|.
-bool GetAtomPairArrayProperty(XID window,
- XAtom property,
- std::vector<std::pair<XAtom,XAtom> >* value) {
- XAtom type = x11::None;
- int format = 0; // size in bits of each item in 'property'
- unsigned long num_items = 0;
- unsigned char* properties = nullptr;
- unsigned long remaining_bytes = 0;
-
- int result = XGetWindowProperty(gfx::GetXDisplay(), window, property,
- 0, // offset into property data to
- // read
- (~0L), // entire array
- x11::False, // deleted
- AnyPropertyType, &type, &format, &num_items,
- &remaining_bytes, &properties);
- gfx::XScopedPtr<unsigned char> scoped_properties(properties);
-
- if (result != x11::Success)
+bool GetAtomPairArrayProperty(
+ x11::Window window,
+ x11::Atom property,
+ std::vector<std::pair<x11::Atom, x11::Atom>>* value) {
+ std::vector<x11::Atom> atoms;
+ // Since this is an array of atom pairs, ensure ensure |atoms|
+ // has an element count that's a multiple of 2.
+ if (!ui::GetArrayProperty(window, property, &atoms) || atoms.size() % 2 != 0)
return false;
- // GTK does not require |type| to be kAtomPair.
- if (format != 32 || num_items % 2 != 0)
- return false;
-
- XAtom* atom_properties = reinterpret_cast<XAtom*>(properties);
value->clear();
- for (size_t i = 0; i < num_items; i+=2)
- value->push_back(std::make_pair(atom_properties[i], atom_properties[i+1]));
+ for (size_t i = 0; i < atoms.size(); i += 2)
+ value->push_back(std::make_pair(atoms[i], atoms[i + 1]));
return true;
}
+x11::Window GetSelectionOwner(x11::Atom selection) {
+ auto response = x11::Connection::Get()->GetSelectionOwner({selection}).Sync();
+ return response ? response->owner : x11::Window::None;
+}
+
+void SetSelectionOwner(x11::Window window,
+ x11::Atom selection,
+ x11::Time time = x11::Time::CurrentTime) {
+ x11::Connection::Get()->SetSelectionOwner({window, selection, time});
+}
+
} // namespace
-SelectionOwner::SelectionOwner(XDisplay* x_display,
- XID x_window,
- XAtom selection_name)
- : x_display_(x_display),
- x_window_(x_window),
+SelectionOwner::SelectionOwner(x11::Connection* connection,
+ x11::Window x_window,
+ x11::Atom selection_name)
+ : x_window_(x_window),
selection_name_(selection_name),
- max_request_size_(GetMaxRequestSize(x_display)) {}
+ max_request_size_(GetMaxRequestSize(connection)) {}
SelectionOwner::~SelectionOwner() {
// If we are the selection owner, we need to release the selection so we
// don't receive further events. However, we don't call ClearSelectionOwner()
// because we don't want to do this indiscriminately.
- if (XGetSelectionOwner(x_display_, selection_name_) == x_window_)
- XSetSelectionOwner(x_display_, selection_name_, x11::None,
- x11::CurrentTime);
+ if (GetSelectionOwner(selection_name_) == x_window_)
+ SetSelectionOwner(x11::Window::None, selection_name_);
}
-void SelectionOwner::RetrieveTargets(std::vector<XAtom>* targets) {
+void SelectionOwner::RetrieveTargets(std::vector<x11::Atom>* targets) {
for (const auto& format_target : format_map_)
targets->push_back(format_target.first);
}
-void SelectionOwner::TakeOwnershipOfSelection(
- const SelectionFormatMap& data) {
+void SelectionOwner::TakeOwnershipOfSelection(const SelectionFormatMap& data) {
acquired_selection_timestamp_ = X11EventSource::GetInstance()->GetTimestamp();
- XSetSelectionOwner(x_display_, selection_name_, x_window_,
- acquired_selection_timestamp_);
+ SetSelectionOwner(x_window_, selection_name_,
+ static_cast<x11::Time>(acquired_selection_timestamp_));
- if (XGetSelectionOwner(x_display_, selection_name_) == x_window_) {
+ if (GetSelectionOwner(selection_name_) == x_window_) {
// The X server agrees that we are the selection owner. Commit our data.
format_map_ = data;
}
}
void SelectionOwner::ClearSelectionOwner() {
- XSetSelectionOwner(x_display_, selection_name_, x11::None, x11::CurrentTime);
+ SetSelectionOwner(x11::Window::None, selection_name_);
format_map_ = SelectionFormatMap();
}
-void SelectionOwner::OnSelectionRequest(const XEvent& event) {
- XID requestor = event.xselectionrequest.requestor;
- XAtom requested_target = event.xselectionrequest.target;
- XAtom requested_property = event.xselectionrequest.property;
+void SelectionOwner::OnSelectionRequest(const x11::Event& x11_event) {
+ auto& request = *x11_event.As<x11::SelectionRequestEvent>();
+ auto requestor = request.requestor;
+ x11::Atom requested_target = request.target;
+ x11::Atom requested_property = request.property;
// Incrementally build our selection. By default this is a refusal, and we'll
// override the parts indicating success in the different cases.
- XEvent reply;
- reply.xselection.type = SelectionNotify;
- reply.xselection.requestor = requestor;
- reply.xselection.selection = event.xselectionrequest.selection;
- reply.xselection.target = requested_target;
- reply.xselection.property = x11::None; // Indicates failure
- reply.xselection.time = event.xselectionrequest.time;
+ x11::SelectionNotifyEvent reply{
+ .time = request.time,
+ .requestor = requestor,
+ .selection = request.selection,
+ .target = requested_target,
+ .property = x11::Atom::None, // Indicates failure
+ };
if (requested_target == gfx::GetAtom(kMultiple)) {
// The contents of |requested_property| should be a list of
// <target,property> pairs.
- std::vector<std::pair<XAtom,XAtom> > conversions;
- if (GetAtomPairArrayProperty(requestor,
- requested_property,
- &conversions)) {
- std::vector<XAtom> conversion_results;
- for (const std::pair<XAtom, XAtom>& conversion : conversions) {
+ std::vector<std::pair<x11::Atom, x11::Atom>> conversions;
+ if (GetAtomPairArrayProperty(requestor, requested_property, &conversions)) {
+ std::vector<x11::Atom> conversion_results;
+ for (const std::pair<x11::Atom, x11::Atom>& conversion : conversions) {
bool conversion_successful =
ProcessTarget(conversion.first, requestor, conversion.second);
conversion_results.push_back(conversion.first);
conversion_results.push_back(conversion_successful ? conversion.second
- : x11::None);
+ : x11::Atom::None);
}
// Set the property to indicate which conversions succeeded. This matches
// what GTK does.
- XChangeProperty(
- x_display_, requestor, requested_property, gfx::GetAtom(kAtomPair),
- 32, PropModeReplace,
- reinterpret_cast<const unsigned char*>(&conversion_results.front()),
- conversion_results.size());
+ ui::SetArrayProperty(requestor, requested_property,
+ gfx::GetAtom(kAtomPair), conversion_results);
- reply.xselection.property = requested_property;
+ reply.property = requested_property;
}
} else {
if (ProcessTarget(requested_target, requestor, requested_property))
- reply.xselection.property = requested_property;
+ reply.property = requested_property;
}
// Send off the reply.
- XSendEvent(x_display_, requestor, x11::False, 0, &reply);
+ ui::SendEvent(reply, requestor, x11::EventMask::NoEvent);
}
-void SelectionOwner::OnSelectionClear(const XEvent& event) {
+void SelectionOwner::OnSelectionClear(const x11::Event& event) {
DLOG(ERROR) << "SelectionClear";
// TODO(erg): If we receive a SelectionClear event while we're handling data,
// we need to delay clearing.
}
-bool SelectionOwner::CanDispatchPropertyEvent(const XEvent& event) {
- return event.xproperty.state == PropertyDelete &&
+bool SelectionOwner::CanDispatchPropertyEvent(const x11::Event& event) {
+ return event.As<x11::PropertyNotifyEvent>()->state == x11::Property::Delete &&
FindIncrementalTransferForEvent(event) != incremental_transfers_.end();
}
-void SelectionOwner::OnPropertyEvent(const XEvent& event) {
+void SelectionOwner::OnPropertyEvent(const x11::Event& event) {
auto it = FindIncrementalTransferForEvent(event);
if (it == incremental_transfers_.end())
return;
@@ -193,35 +186,31 @@ void SelectionOwner::OnPropertyEvent(const XEvent& event) {
CompleteIncrementalTransfer(it);
}
-bool SelectionOwner::ProcessTarget(XAtom target,
- XID requestor,
- XAtom property) {
- XAtom multiple_atom = gfx::GetAtom(kMultiple);
- XAtom save_targets_atom = gfx::GetAtom(kSaveTargets);
- XAtom targets_atom = gfx::GetAtom(kTargets);
- XAtom timestamp_atom = gfx::GetAtom(kTimestamp);
+bool SelectionOwner::ProcessTarget(x11::Atom target,
+ x11::Window requestor,
+ x11::Atom property) {
+ x11::Atom multiple_atom = gfx::GetAtom(kMultiple);
+ x11::Atom save_targets_atom = gfx::GetAtom(kSaveTargets);
+ x11::Atom targets_atom = gfx::GetAtom(kTargets);
+ x11::Atom timestamp_atom = gfx::GetAtom(kTimestamp);
if (target == multiple_atom || target == save_targets_atom)
return false;
if (target == timestamp_atom) {
- XChangeProperty(
- x_display_, requestor, property, XA_INTEGER, 32, PropModeReplace,
- reinterpret_cast<unsigned char*>(&acquired_selection_timestamp_), 1);
+ ui::SetProperty(requestor, property, x11::Atom::INTEGER,
+ acquired_selection_timestamp_);
return true;
}
if (target == targets_atom) {
// We have been asked for TARGETS. Send an atom array back with the data
// types we support.
- std::vector<XAtom> targets = {timestamp_atom, targets_atom,
- save_targets_atom, multiple_atom};
+ std::vector<x11::Atom> targets = {timestamp_atom, targets_atom,
+ save_targets_atom, multiple_atom};
RetrieveTargets(&targets);
- XChangeProperty(x_display_, requestor, property, XA_ATOM, 32,
- PropModeReplace,
- reinterpret_cast<unsigned char*>(&targets.front()),
- targets.size());
+ ui::SetArrayProperty(requestor, property, x11::Atom::ATOM, targets);
return true;
}
@@ -232,10 +221,8 @@ bool SelectionOwner::ProcessTarget(XAtom target,
// We must send the data back in several chunks due to a limitation in
// the size of X requests. Notify the selection requestor that the data
// will be sent incrementally by returning data of type "INCR".
- long length = it->second->size();
- XChangeProperty(x_display_, requestor, property, gfx::GetAtom(kIncr), 32,
- PropModeReplace,
- reinterpret_cast<unsigned char*>(&length), 1);
+ uint32_t length = it->second->size();
+ ui::SetProperty(requestor, property, gfx::GetAtom(kIncr), length);
// Wait for the selection requestor to indicate that it has processed
// the selection result before sending the first chunk of data. The
@@ -243,10 +230,10 @@ bool SelectionOwner::ProcessTarget(XAtom target,
base::TimeTicks timeout =
base::TimeTicks::Now() +
base::TimeDelta::FromMilliseconds(kIncrementalTransferTimeoutMs);
- incremental_transfers_.push_back(IncrementalTransfer(
+ incremental_transfers_.emplace_back(
requestor, target, property,
std::make_unique<XScopedEventSelector>(requestor, PropertyChangeMask),
- it->second, 0, timeout));
+ it->second, 0, timeout);
// Start a timer to abort the data transfer in case that the selection
// requestor does not support the INCR property or gets destroyed during
@@ -258,15 +245,9 @@ bool SelectionOwner::ProcessTarget(XAtom target,
this, &SelectionOwner::AbortStaleIncrementalTransfers);
}
} else {
- XChangeProperty(
- x_display_,
- requestor,
- property,
- target,
- 8,
- PropModeReplace,
- const_cast<unsigned char*>(it->second->front()),
- it->second->size());
+ auto& mem = it->second;
+ std::vector<uint8_t> data(mem->data(), mem->data() + mem->size());
+ ui::SetArrayProperty(requestor, property, target, data);
}
return true;
}
@@ -279,17 +260,13 @@ bool SelectionOwner::ProcessTarget(XAtom target,
void SelectionOwner::ProcessIncrementalTransfer(IncrementalTransfer* transfer) {
size_t remaining = transfer->data->size() - transfer->offset;
size_t chunk_length = std::min(remaining, max_request_size_);
- XChangeProperty(
- x_display_,
- transfer->window,
- transfer->property,
- transfer->target,
- 8,
- PropModeReplace,
- const_cast<unsigned char*>(transfer->data->front() + transfer->offset),
- chunk_length);
+ const uint8_t* data = transfer->data->front() + transfer->offset;
+ std::vector<uint8_t> buf(data, data + chunk_length);
+ ui::SetArrayProperty(transfer->window, transfer->property, transfer->target,
+ buf);
transfer->offset += chunk_length;
- transfer->timeout = base::TimeTicks::Now() +
+ transfer->timeout =
+ base::TimeTicks::Now() +
base::TimeDelta::FromMilliseconds(kIncrementalTransferTimeoutMs);
// When offset == data->size(), we still need to transfer a zero-sized chunk
@@ -302,8 +279,8 @@ void SelectionOwner::ProcessIncrementalTransfer(IncrementalTransfer* transfer) {
void SelectionOwner::AbortStaleIncrementalTransfers() {
base::TimeTicks now = base::TimeTicks::Now();
- for (int i = static_cast<int>(incremental_transfers_.size()) - 1;
- i >= 0; --i) {
+ for (int i = static_cast<int>(incremental_transfers_.size()) - 1; i >= 0;
+ --i) {
if (incremental_transfers_[i].timeout <= now)
CompleteIncrementalTransfer(incremental_transfers_.begin() + i);
}
@@ -318,21 +295,20 @@ void SelectionOwner::CompleteIncrementalTransfer(
}
std::vector<SelectionOwner::IncrementalTransfer>::iterator
- SelectionOwner::FindIncrementalTransferForEvent(const XEvent& event) {
+SelectionOwner::FindIncrementalTransferForEvent(const x11::Event& event) {
for (auto it = incremental_transfers_.begin();
it != incremental_transfers_.end(); ++it) {
- if (it->window == event.xproperty.window &&
- it->property == event.xproperty.atom) {
+ const auto* prop = event.As<x11::PropertyNotifyEvent>();
+ if (it->window == prop->window && it->property == prop->atom)
return it;
- }
}
return incremental_transfers_.end();
}
SelectionOwner::IncrementalTransfer::IncrementalTransfer(
- XID window,
- XAtom target,
- XAtom property,
+ x11::Window window,
+ x11::Atom target,
+ x11::Atom property,
std::unique_ptr<XScopedEventSelector> event_selector,
const scoped_refptr<base::RefCountedMemory>& data,
int offset,
@@ -348,10 +324,9 @@ SelectionOwner::IncrementalTransfer::IncrementalTransfer(
SelectionOwner::IncrementalTransfer::IncrementalTransfer(
IncrementalTransfer&& other) = default;
-SelectionOwner::IncrementalTransfer& SelectionOwner::IncrementalTransfer::
-operator=(IncrementalTransfer&&) = default;
+SelectionOwner::IncrementalTransfer&
+SelectionOwner::IncrementalTransfer::operator=(IncrementalTransfer&&) = default;
-SelectionOwner::IncrementalTransfer::~IncrementalTransfer() {
-}
+SelectionOwner::IncrementalTransfer::~IncrementalTransfer() = default;
} // namespace ui
diff --git a/chromium/ui/base/x/selection_owner.h b/chromium/ui/base/x/selection_owner.h
index a048133b9dd..0c715bd53d0 100644
--- a/chromium/ui/base/x/selection_owner.h
+++ b/chromium/ui/base/x/selection_owner.h
@@ -16,6 +16,7 @@
#include "base/time/time.h"
#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 {
@@ -33,16 +34,16 @@ COMPONENT_EXPORT(UI_BASE_X) extern const char kTargets[];
// processes.
class COMPONENT_EXPORT(UI_BASE_X) SelectionOwner {
public:
- SelectionOwner(XDisplay* xdisplay,
- XID xwindow,
- XAtom selection_name);
+ SelectionOwner(x11::Connection* connection,
+ x11::Window xwindow,
+ x11::Atom selection_name);
~SelectionOwner();
// Returns the current selection data. Useful for fast paths.
const SelectionFormatMap& selection_format_map() { return format_map_; }
// Appends a list of types we're offering to |targets|.
- void RetrieveTargets(std::vector<XAtom>* targets);
+ void RetrieveTargets(std::vector<x11::Atom>* targets);
// Attempts to take ownership of the selection. If we're successful, present
// |data| to other windows.
@@ -53,21 +54,21 @@ class COMPONENT_EXPORT(UI_BASE_X) SelectionOwner {
void ClearSelectionOwner();
// It is our owner's responsibility to plumb X11 events on |xwindow_| to us.
- void OnSelectionRequest(const XEvent& event);
- void OnSelectionClear(const XEvent& event);
+ void OnSelectionRequest(const x11::Event& event);
+ void OnSelectionClear(const x11::Event& event);
// Returns true if SelectionOwner can process the XPropertyEvent event,
// |event|.
- bool CanDispatchPropertyEvent(const XEvent& event);
+ bool CanDispatchPropertyEvent(const x11::Event& event);
- void OnPropertyEvent(const XEvent& event);
+ void OnPropertyEvent(const x11::Event& event);
private:
// Holds state related to an incremental data transfer.
struct IncrementalTransfer {
- IncrementalTransfer(XID window,
- XAtom target,
- XAtom property,
+ IncrementalTransfer(x11::Window window,
+ x11::Atom target,
+ x11::Atom property,
std::unique_ptr<XScopedEventSelector> event_selector,
const scoped_refptr<base::RefCountedMemory>& data,
int offset,
@@ -80,9 +81,9 @@ class COMPONENT_EXPORT(UI_BASE_X) SelectionOwner {
// Parameters from the XSelectionRequest. The data is transferred over
// |property| on |window|.
- XID window;
- XAtom target;
- XAtom property;
+ x11::Window window;
+ x11::Atom target;
+ x11::Atom property;
// Selects events on |window|.
std::unique_ptr<XScopedEventSelector> event_selector;
@@ -105,7 +106,9 @@ class COMPONENT_EXPORT(UI_BASE_X) SelectionOwner {
// Attempts to convert the selection to |target|. If the conversion is
// successful, true is returned and the result is stored in the |property|
// of |requestor|.
- bool ProcessTarget(XAtom target, XID requestor, XAtom property);
+ bool ProcessTarget(x11::Atom target,
+ x11::Window requestor,
+ x11::Atom property);
// Sends the next chunk of data for given the incremental data transfer.
void ProcessIncrementalTransfer(IncrementalTransfer* transfer);
@@ -120,17 +123,16 @@ class COMPONENT_EXPORT(UI_BASE_X) SelectionOwner {
// Returns the incremental data transfer, if any, which was waiting for
// |event|.
std::vector<IncrementalTransfer>::iterator FindIncrementalTransferForEvent(
- const XEvent& event);
+ const x11::Event& event);
// Our X11 state.
- XDisplay* x_display_;
- XID x_window_;
+ x11::Window x_window_;
// The X11 selection that this instance communicates on.
- XAtom selection_name_;
+ x11::Atom selection_name_;
// The time that this instance took ownership of its selection.
- Time acquired_selection_timestamp_;
+ uint32_t acquired_selection_timestamp_;
// The maximum size of data we can put in XChangeProperty().
size_t max_request_size_;
diff --git a/chromium/ui/base/x/selection_requestor.cc b/chromium/ui/base/x/selection_requestor.cc
index c94e955d363..3e2173b4498 100644
--- a/chromium/ui/base/x/selection_requestor.cc
+++ b/chromium/ui/base/x/selection_requestor.cc
@@ -6,15 +6,16 @@
#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.h"
#include "ui/gfx/x/x11_atom_cache.h"
#include "ui/gfx/x/x11_types.h"
+#include "ui/gfx/x/xproto.h"
namespace ui {
@@ -32,46 +33,40 @@ const int kRequestTimeoutMs = 10000;
static_assert(KSelectionRequestorTimerPeriodMs <= kRequestTimeoutMs,
"timer period must be <= request timeout");
-// Combines |data| into a single RefCountedMemory object.
-scoped_refptr<base::RefCountedMemory> CombineRefCountedMemory(
- const std::vector<scoped_refptr<base::RefCountedMemory> >& data) {
+// Combines |data| into a single std::vector<uint8_t>.
+std::vector<uint8_t> CombineData(
+ const std::vector<std::vector<uint8_t>>& data) {
if (data.size() == 1u)
return data[0];
- size_t combined_length = 0;
+ size_t bytes = 0;
for (const auto& datum : data)
- combined_length += datum->size();
- std::vector<unsigned char> combined_data;
- combined_data.reserve(combined_length);
-
- for (const auto& datum : data) {
- combined_data.insert(combined_data.end(), datum->front(),
- datum->front() + datum->size());
- }
- return base::RefCountedBytes::TakeVector(&combined_data);
+ bytes += datum.size();
+ std::vector<uint8_t> combined;
+ combined.reserve(bytes);
+ for (const auto& datum : data)
+ std::copy(datum.begin(), datum.end(), std::back_inserter(combined));
+ return combined;
}
} // namespace
-SelectionRequestor::SelectionRequestor(XDisplay* x_display,
- XID x_window,
+SelectionRequestor::SelectionRequestor(x11::Window x_window,
XEventDispatcher* dispatcher)
- : x_display_(x_display),
- x_window_(x_window),
- x_property_(x11::None),
+ : x_window_(x_window),
+ x_property_(x11::Atom::None),
dispatcher_(dispatcher),
current_request_index_(0u) {
x_property_ = gfx::GetAtom(kChromeSelection);
}
-SelectionRequestor::~SelectionRequestor() {}
+SelectionRequestor::~SelectionRequestor() = default;
bool SelectionRequestor::PerformBlockingConvertSelection(
- XAtom selection,
- XAtom target,
- scoped_refptr<base::RefCountedMemory>* out_data,
- size_t* out_data_items,
- XAtom* out_type) {
+ x11::Atom selection,
+ x11::Atom target,
+ std::vector<uint8_t>* out_data,
+ x11::Atom* out_type) {
base::TimeTicks timeout =
base::TimeTicks::Now() +
base::TimeDelta::FromMilliseconds(kRequestTimeoutMs);
@@ -94,9 +89,7 @@ bool SelectionRequestor::PerformBlockingConvertSelection(
if (request.success) {
if (out_data)
- *out_data = CombineRefCountedMemory(request.out_data);
- if (out_data_items)
- *out_data_items = request.out_data_items;
+ *out_data = CombineData(request.out_data);
if (out_type)
*out_type = request.out_type;
}
@@ -104,109 +97,100 @@ bool SelectionRequestor::PerformBlockingConvertSelection(
}
void SelectionRequestor::PerformBlockingConvertSelectionWithParameter(
- XAtom selection,
- XAtom target,
- const std::vector<XAtom>& parameter) {
+ x11::Atom selection,
+ x11::Atom target,
+ const std::vector<x11::Atom>& parameter) {
SetAtomArrayProperty(x_window_, kChromeSelection, "ATOM", parameter);
- PerformBlockingConvertSelection(selection, target, nullptr, nullptr, nullptr);
+ PerformBlockingConvertSelection(selection, target, nullptr, nullptr);
}
SelectionData SelectionRequestor::RequestAndWaitForTypes(
- XAtom selection,
- const std::vector<XAtom>& types) {
- for (const XAtom& item : types) {
- scoped_refptr<base::RefCountedMemory> data;
- XAtom type = x11::None;
- if (PerformBlockingConvertSelection(selection, item, &data, nullptr,
- &type) && type == item) {
- return SelectionData(type, data);
+ x11::Atom selection,
+ const std::vector<x11::Atom>& types) {
+ for (const x11::Atom& item : types) {
+ std::vector<uint8_t> data;
+ x11::Atom type = x11::Atom::None;
+ if (PerformBlockingConvertSelection(selection, item, &data, &type) &&
+ type == item) {
+ return SelectionData(type, base::RefCountedBytes::TakeVector(&data));
}
}
return SelectionData();
}
-void SelectionRequestor::OnSelectionNotify(const XEvent& event) {
+void SelectionRequestor::OnSelectionNotify(
+ const x11::SelectionNotifyEvent& selection) {
Request* request = GetCurrentRequest();
- XAtom event_property = event.xselection.property;
- if (!request ||
- request->completed ||
- request->selection != event.xselection.selection ||
- request->target != event.xselection.target) {
+ x11::Atom event_property = selection.property;
+ if (!request || request->completed ||
+ request->selection != selection.selection ||
+ request->target != selection.target) {
// ICCCM requires us to delete the property passed into SelectionNotify.
- if (event_property != x11::None)
- XDeleteProperty(x_display_, x_window_, event_property);
+ if (event_property != x11::Atom::None)
+ ui::DeleteProperty(x_window_, event_property);
return;
}
bool success = false;
if (event_property == x_property_) {
- scoped_refptr<base::RefCountedMemory> out_data;
- success = ui::GetRawBytesOfProperty(x_window_,
- x_property_,
- &out_data,
- &request->out_data_items,
+ std::vector<uint8_t> out_data;
+ success = ui::GetRawBytesOfProperty(x_window_, x_property_, &out_data,
&request->out_type);
if (success) {
request->out_data.clear();
request->out_data.push_back(out_data);
}
}
- if (event_property != x11::None)
- XDeleteProperty(x_display_, x_window_, event_property);
+ if (event_property != x11::Atom::None)
+ ui::DeleteProperty(x_window_, event_property);
if (request->out_type == gfx::GetAtom(kIncr)) {
request->data_sent_incrementally = true;
request->out_data.clear();
- request->out_data_items = 0u;
- request->out_type = x11::None;
+ request->out_type = x11::Atom::None;
request->timeout = base::TimeTicks::Now() +
- base::TimeDelta::FromMilliseconds(kRequestTimeoutMs);
+ base::TimeDelta::FromMilliseconds(kRequestTimeoutMs);
} else {
CompleteRequest(current_request_index_, success);
}
}
-bool SelectionRequestor::CanDispatchPropertyEvent(const XEvent& event) {
- return event.xproperty.window == x_window_ &&
- event.xproperty.atom == x_property_ &&
- event.xproperty.state == PropertyNewValue;
+bool SelectionRequestor::CanDispatchPropertyEvent(const x11::Event& event) {
+ const auto* prop = event.As<x11::PropertyNotifyEvent>();
+ return prop->window == x_window_ && prop->atom == x_property_ &&
+ prop->state == x11::Property::NewValue;
}
-void SelectionRequestor::OnPropertyEvent(const XEvent& event) {
+void SelectionRequestor::OnPropertyEvent(const x11::Event& event) {
Request* request = GetCurrentRequest();
if (!request || !request->data_sent_incrementally)
return;
- scoped_refptr<base::RefCountedMemory> out_data;
- size_t out_data_items = 0u;
- Atom out_type = x11::None;
- bool success = ui::GetRawBytesOfProperty(x_window_,
- x_property_,
- &out_data,
- &out_data_items,
- &out_type);
+ std::vector<uint8_t> out_data;
+ x11::Atom out_type = x11::Atom::None;
+ bool success =
+ ui::GetRawBytesOfProperty(x_window_, x_property_, &out_data, &out_type);
if (!success) {
CompleteRequest(current_request_index_, false);
return;
}
- if (request->out_type != x11::None && request->out_type != out_type) {
+ if (request->out_type != x11::Atom::None && request->out_type != out_type) {
CompleteRequest(current_request_index_, false);
return;
}
request->out_data.push_back(out_data);
- request->out_data_items += out_data_items;
request->out_type = out_type;
// Delete the property to tell the selection owner to send the next chunk.
- XDeleteProperty(x_display_, x_window_, x_property_);
+ ui::DeleteProperty(x_window_, x_property_);
request->timeout = base::TimeTicks::Now() +
- base::TimeDelta::FromMilliseconds(kRequestTimeoutMs);
+ base::TimeDelta::FromMilliseconds(kRequestTimeoutMs);
- if (out_data->size() == 0u)
+ if (out_data.empty())
CompleteRequest(current_request_index_, true);
}
@@ -219,8 +203,8 @@ void SelectionRequestor::AbortStaleRequests() {
}
void SelectionRequestor::CompleteRequest(size_t index, bool success) {
- if (index >= requests_.size())
- return;
+ if (index >= requests_.size())
+ return;
Request* request = requests_[index];
if (request->completed)
@@ -241,8 +225,13 @@ void SelectionRequestor::CompleteRequest(size_t index, bool success) {
void SelectionRequestor::ConvertSelectionForCurrentRequest() {
Request* request = GetCurrentRequest();
if (request) {
- XConvertSelection(x_display_, request->selection, request->target,
- x_property_, x_window_, x11::CurrentTime);
+ x11::Connection::Get()->ConvertSelection({
+ .requestor = static_cast<x11::Window>(x_window_),
+ .selection = request->selection,
+ .target = request->target,
+ .property = x_property_,
+ .time = x11::Time::CurrentTime,
+ });
}
}
@@ -266,11 +255,14 @@ void SelectionRequestor::BlockTillSelectionNotifyForRequest(Request* request) {
} else {
// This occurs if PerformBlockingConvertSelection() is called during
// shutdown and the X11EventSource has already been destroyed.
- while (!request->completed &&
- request->timeout > base::TimeTicks::Now()) {
- if (XPending(x_display_)) {
- XEvent event;
- XNextEvent(x_display_, &event);
+ 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);
}
}
@@ -283,19 +275,17 @@ SelectionRequestor::Request* SelectionRequestor::GetCurrentRequest() {
: requests_[current_request_index_];
}
-SelectionRequestor::Request::Request(XAtom selection,
- XAtom target,
+SelectionRequestor::Request::Request(x11::Atom selection,
+ x11::Atom target,
base::TimeTicks timeout)
: selection(selection),
target(target),
data_sent_incrementally(false),
- out_data_items(0u),
- out_type(x11::None),
+ out_type(x11::Atom::None),
success(false),
timeout(timeout),
completed(false) {}
-SelectionRequestor::Request::~Request() {
-}
+SelectionRequestor::Request::~Request() = default;
} // namespace ui
diff --git a/chromium/ui/base/x/selection_requestor.h b/chromium/ui/base/x/selection_requestor.h
index aa5f7a14b3b..9b97d24ff58 100644
--- a/chromium/ui/base/x/selection_requestor.h
+++ b/chromium/ui/base/x/selection_requestor.h
@@ -10,12 +10,14 @@
#include <vector>
#include "base/callback.h"
+#include "base/component_export.h"
#include "base/macros.h"
#include "base/memory/ref_counted_memory.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
-#include "ui/base/ui_base_export.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 {
@@ -29,67 +31,62 @@ class SelectionData;
// drop. This class interprets messages from the stateful selection request
// API. SelectionRequestor should only deal with the X11 details; it does not
// implement per-component fast-paths.
-class UI_BASE_EXPORT SelectionRequestor {
+class COMPONENT_EXPORT(UI_BASE) SelectionRequestor {
public:
- SelectionRequestor(XDisplay* xdisplay,
- XID xwindow,
- XEventDispatcher* dispatcher);
+ SelectionRequestor(x11::Window xwindow, XEventDispatcher* dispatcher);
~SelectionRequestor();
// Does the work of requesting |target| from |selection|, spinning up the
// nested run loop, and reading the resulting data back. The result is
// stored in |out_data|.
// |out_data_items| is the length of |out_data| in |out_type| items.
- bool PerformBlockingConvertSelection(
- XAtom selection,
- XAtom target,
- scoped_refptr<base::RefCountedMemory>* out_data,
- size_t* out_data_items,
- XAtom* out_type);
+ bool PerformBlockingConvertSelection(x11::Atom selection,
+ x11::Atom target,
+ std::vector<uint8_t>* out_data,
+ x11::Atom* out_type);
// Requests |target| from |selection|, passing |parameter| as a parameter to
// XConvertSelection().
void PerformBlockingConvertSelectionWithParameter(
- XAtom selection,
- XAtom target,
- const std::vector<XAtom>& parameter);
+ x11::Atom selection,
+ x11::Atom target,
+ const std::vector<x11::Atom>& parameter);
// Returns the first of |types| offered by the current owner of |selection|.
// Returns an empty SelectionData object if none of |types| are available.
- SelectionData RequestAndWaitForTypes(XAtom selection,
- const std::vector<XAtom>& types);
+ SelectionData RequestAndWaitForTypes(x11::Atom selection,
+ const std::vector<x11::Atom>& types);
// It is our owner's responsibility to plumb X11 SelectionNotify events on
// |xwindow_| to us.
- void OnSelectionNotify(const XEvent& event);
+ void OnSelectionNotify(const x11::SelectionNotifyEvent& event);
// Returns true if SelectionOwner can process the XChangeProperty event,
// |event|.
- bool CanDispatchPropertyEvent(const XEvent& event);
+ bool CanDispatchPropertyEvent(const x11::Event& event);
- void OnPropertyEvent(const XEvent& event);
+ void OnPropertyEvent(const x11::Event& event);
private:
friend class SelectionRequestorTest;
// A request that has been issued.
struct Request {
- Request(XAtom selection, XAtom target, base::TimeTicks timeout);
+ Request(x11::Atom selection, x11::Atom target, base::TimeTicks timeout);
~Request();
// The target and selection requested in the XConvertSelection() request.
// Used for error detection.
- XAtom selection;
- XAtom target;
+ x11::Atom selection;
+ x11::Atom target;
// Whether the result of the XConvertSelection() request is being sent
// incrementally.
bool data_sent_incrementally;
// The result data for the XConvertSelection() request.
- std::vector<scoped_refptr<base::RefCountedMemory> > out_data;
- size_t out_data_items;
- XAtom out_type;
+ std::vector<std::vector<uint8_t>> out_data;
+ x11::Atom out_type;
// Whether the XConvertSelection() request was successful.
bool success;
@@ -122,12 +119,11 @@ class UI_BASE_EXPORT SelectionRequestor {
Request* GetCurrentRequest();
// Our X11 state.
- XDisplay* x_display_;
- XID x_window_;
+ x11::Window x_window_;
// The property on |x_window_| set by the selection owner with the value of
// the selection.
- XAtom x_property_;
+ x11::Atom x_property_;
// Dispatcher which handles SelectionNotify and SelectionRequest for
// |selection_name_|. PerformBlockingConvertSelection() calls the
diff --git a/chromium/ui/base/x/selection_requestor_unittest.cc b/chromium/ui/base/x/selection_requestor_unittest.cc
index f4d547e2668..ac538ae6d25 100644
--- a/chromium/ui/base/x/selection_requestor_unittest.cc
+++ b/chromium/ui/base/x/selection_requestor_unittest.cc
@@ -5,6 +5,8 @@
#include "ui/base/x/selection_requestor.h"
#include <stddef.h>
+#include <xcb/xcb.h>
+
#include <memory>
#include "base/bind.h"
@@ -17,40 +19,44 @@
#include "ui/base/x/selection_utils.h"
#include "ui/base/x/x11_util.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.h"
#include "ui/gfx/x/x11_atom_cache.h"
#include "ui/gfx/x/x11_types.h"
+#include "ui/gfx/x/xproto.h"
namespace ui {
class SelectionRequestorTest : public testing::Test {
public:
- SelectionRequestorTest()
- : x_display_(gfx::GetXDisplay()), x_window_(x11::None) {}
+ SelectionRequestorTest() : x_display_(gfx::GetXDisplay()) {}
- ~SelectionRequestorTest() override {}
+ ~SelectionRequestorTest() override = default;
// Responds to the SelectionRequestor's XConvertSelection() request by
// - Setting the property passed into the XConvertSelection() request to
// |value|.
// - Sending a SelectionNotify event.
- void SendSelectionNotify(XAtom selection,
- XAtom target,
+ void SendSelectionNotify(x11::Atom selection,
+ x11::Atom target,
const std::string& value) {
ui::SetStringProperty(x_window_, requestor_->x_property_,
gfx::GetAtom("STRING"), value);
- XEvent xev;
- xev.type = SelectionNotify;
- xev.xselection.serial = 0u;
- xev.xselection.display = x_display_;
- xev.xselection.requestor = x_window_;
- xev.xselection.selection = selection;
- xev.xselection.target = target;
- xev.xselection.property = requestor_->x_property_;
- xev.xselection.time = x11::CurrentTime;
- xev.xselection.type = SelectionNotify;
- requestor_->OnSelectionNotify(xev);
+ xcb_generic_event_t ge;
+ memset(&ge, 0, sizeof(ge));
+ auto* event = reinterpret_cast<xcb_selection_notify_event_t*>(&ge);
+ event->response_type = x11::SelectionNotifyEvent::opcode;
+ event->sequence = 0;
+ event->requestor = static_cast<uint32_t>(x_window_);
+ event->selection = static_cast<uint32_t>(selection);
+ event->target = static_cast<uint32_t>(target);
+ event->property = static_cast<uint32_t>(requestor_->x_property_);
+ event->time = x11::CurrentTime;
+
+ x11::Event xev(&ge, x11::Connection::Get());
+ requestor_->OnSelectionNotify(*xev.As<x11::SelectionNotifyEvent>());
}
protected:
@@ -59,33 +65,31 @@ class SelectionRequestorTest : public testing::Test {
XSynchronize(x_display_, x11::True);
// Create a window for the selection requestor to use.
- x_window_ = XCreateWindow(x_display_,
- DefaultRootWindow(x_display_),
- 0, 0, 10, 10, // x, y, width, height
- 0, // border width
- CopyFromParent, // depth
- InputOnly,
- CopyFromParent, // visual
- 0,
- nullptr);
+ x_window_ = static_cast<x11::Window>(XCreateWindow(
+ x_display_, DefaultRootWindow(x_display_), 0, 0, 10,
+ 10, // x, y, width, height
+ 0, // border width
+ static_cast<int>(x11::WindowClass::CopyFromParent), // depth
+ static_cast<int>(x11::WindowClass::InputOnly),
+ nullptr, // visual
+ 0, nullptr));
event_source_ = PlatformEventSource::CreateDefault();
CHECK(PlatformEventSource::GetInstance());
- requestor_ =
- std::make_unique<SelectionRequestor>(x_display_, x_window_, nullptr);
+ requestor_ = std::make_unique<SelectionRequestor>(x_window_, nullptr);
}
void TearDown() override {
requestor_.reset();
event_source_.reset();
- XDestroyWindow(x_display_, x_window_);
+ XDestroyWindow(x_display_, static_cast<uint32_t>(x_window_));
XSynchronize(x_display_, x11::False);
}
Display* x_display_;
// |requestor_|'s window.
- XID x_window_;
+ x11::Window x_window_ = x11::Window::None;
std::unique_ptr<PlatformEventSource> event_source_;
std::unique_ptr<SelectionRequestor> requestor_;
@@ -101,16 +105,16 @@ namespace {
// Converts |selection| to |target| and checks the returned values.
void PerformBlockingConvertSelection(SelectionRequestor* requestor,
- XAtom selection,
- XAtom target,
+ x11::Atom selection,
+ x11::Atom target,
const std::string& expected_data) {
- scoped_refptr<base::RefCountedMemory> out_data;
- size_t out_data_items = 0u;
- XAtom out_type = x11::None;
- EXPECT_TRUE(requestor->PerformBlockingConvertSelection(
- selection, target, &out_data, &out_data_items, &out_type));
- EXPECT_EQ(expected_data, ui::RefCountedMemoryToString(out_data));
- EXPECT_EQ(expected_data.size(), out_data_items);
+ std::vector<uint8_t> out_data;
+ x11::Atom out_type = x11::Atom::None;
+ EXPECT_TRUE(requestor->PerformBlockingConvertSelection(selection, target,
+ &out_data, &out_type));
+ EXPECT_EQ(expected_data.size(), out_data.size());
+ EXPECT_EQ(expected_data, ui::RefCountedMemoryToString(
+ base::RefCountedBytes::TakeVector(&out_data)));
EXPECT_EQ(gfx::GetAtom("STRING"), out_type);
}
@@ -122,10 +126,10 @@ TEST_F(SelectionRequestorTest, 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.
- XAtom selection = gfx::GetAtom("FAKE_SELECTION");
+ x11::Atom selection = gfx::GetAtom("FAKE_SELECTION");
- XAtom target1 = gfx::GetAtom("TARGET1");
- XAtom target2 = gfx::GetAtom("TARGET2");
+ x11::Atom target1 = gfx::GetAtom("TARGET1");
+ x11::Atom target2 = gfx::GetAtom("TARGET2");
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(&PerformBlockingConvertSelection,
diff --git a/chromium/ui/base/x/selection_utils.cc b/chromium/ui/base/x/selection_utils.cc
index a5eaa7443e0..34533b97d69 100644
--- a/chromium/ui/base/x/selection_utils.cc
+++ b/chromium/ui/base/x/selection_utils.cc
@@ -25,8 +25,8 @@ const char kTextPlain[] = "text/plain";
const char kTextPlainUtf8[] = "text/plain;charset=utf-8";
const char kUtf8String[] = "UTF8_STRING";
-std::vector<::Atom> GetTextAtomsFrom() {
- std::vector< ::Atom> atoms;
+std::vector<x11::Atom> GetTextAtomsFrom() {
+ std::vector<x11::Atom> atoms;
atoms.push_back(gfx::GetAtom(kUtf8String));
atoms.push_back(gfx::GetAtom(kString));
atoms.push_back(gfx::GetAtom(kText));
@@ -35,22 +35,22 @@ std::vector<::Atom> GetTextAtomsFrom() {
return atoms;
}
-std::vector<::Atom> GetURLAtomsFrom() {
- std::vector< ::Atom> atoms;
+std::vector<x11::Atom> GetURLAtomsFrom() {
+ std::vector<x11::Atom> atoms;
atoms.push_back(gfx::GetAtom(kMimeTypeURIList));
atoms.push_back(gfx::GetAtom(kMimeTypeMozillaURL));
return atoms;
}
-std::vector<::Atom> GetURIListAtomsFrom() {
- std::vector< ::Atom> atoms;
+std::vector<x11::Atom> GetURIListAtomsFrom() {
+ std::vector<x11::Atom> atoms;
atoms.push_back(gfx::GetAtom(kMimeTypeURIList));
return atoms;
}
-void GetAtomIntersection(const std::vector< ::Atom>& desired,
- const std::vector< ::Atom>& offered,
- std::vector< ::Atom>* output) {
+void GetAtomIntersection(const std::vector<x11::Atom>& desired,
+ const std::vector<x11::Atom>& offered,
+ std::vector<x11::Atom>* output) {
for (const auto& desired_atom : desired) {
if (base::Contains(offered, desired_atom))
output->push_back(desired_atom);
@@ -68,8 +68,8 @@ std::vector<std::string> ParseURIList(const SelectionData& data) {
// uri-lists are newline separated file lists in URL encoding.
std::string unparsed;
data.AssignTo(&unparsed);
- return base::SplitString(
- unparsed, "\n", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+ return base::SplitString(unparsed, "\n", base::KEEP_WHITESPACE,
+ base::SPLIT_WANT_NONEMPTY);
}
std::string RefCountedMemoryToString(
@@ -104,22 +104,22 @@ base::string16 RefCountedMemoryToString16(
///////////////////////////////////////////////////////////////////////////////
-SelectionFormatMap::SelectionFormatMap() {}
+SelectionFormatMap::SelectionFormatMap() = default;
SelectionFormatMap::SelectionFormatMap(const SelectionFormatMap& other) =
default;
-SelectionFormatMap::~SelectionFormatMap() {}
+SelectionFormatMap::~SelectionFormatMap() = default;
void SelectionFormatMap::Insert(
- ::Atom atom,
+ x11::Atom atom,
const scoped_refptr<base::RefCountedMemory>& item) {
data_.erase(atom);
data_.emplace(atom, item);
}
ui::SelectionData SelectionFormatMap::GetFirstOf(
- const std::vector< ::Atom>& requested_types) const {
+ const std::vector<x11::Atom>& requested_types) const {
for (const auto& requested_type : requested_types) {
auto data_it = data_.find(requested_type);
if (data_it != data_.end()) {
@@ -130,8 +130,8 @@ ui::SelectionData SelectionFormatMap::GetFirstOf(
return SelectionData();
}
-std::vector< ::Atom> SelectionFormatMap::GetTypes() const {
- std::vector< ::Atom> atoms;
+std::vector<x11::Atom> SelectionFormatMap::GetTypes() const {
+ std::vector<x11::Atom> atoms;
for (const auto& datum : data_)
atoms.push_back(datum.first);
@@ -140,17 +140,16 @@ std::vector< ::Atom> SelectionFormatMap::GetTypes() const {
///////////////////////////////////////////////////////////////////////////////
-SelectionData::SelectionData() : type_(x11::None) {}
+SelectionData::SelectionData() : type_(x11::Atom::None) {}
SelectionData::SelectionData(
- ::Atom type,
+ x11::Atom type,
const scoped_refptr<base::RefCountedMemory>& memory)
: type_(type), memory_(memory) {}
-SelectionData::SelectionData(const SelectionData& rhs)
- : type_(rhs.type_), memory_(rhs.memory_) {}
+SelectionData::SelectionData(const SelectionData& rhs) = default;
-SelectionData::~SelectionData() {}
+SelectionData::~SelectionData() = default;
SelectionData& SelectionData::operator=(const SelectionData& rhs) {
type_ = rhs.type_;
@@ -161,10 +160,10 @@ SelectionData& SelectionData::operator=(const SelectionData& rhs) {
}
bool SelectionData::IsValid() const {
- return type_ != x11::None;
+ return type_ != x11::Atom::None;
}
-::Atom SelectionData::GetType() const {
+x11::Atom SelectionData::GetType() const {
return type_;
}
@@ -184,8 +183,7 @@ std::string SelectionData::GetText() const {
type_ == gfx::GetAtom(kTextPlain)) {
std::string result;
base::ConvertToUtf8AndNormalize(RefCountedMemoryToString(memory_),
- base::kCodepageLatin1,
- &result);
+ base::kCodepageLatin1, &result);
return result;
} else {
// BTW, I looked at COMPOUND_TEXT, and there's no way we're going to
@@ -204,8 +202,7 @@ base::string16 SelectionData::GetHtml() const {
// If the data starts with 0xFEFF, i.e., Byte Order Mark, assume it is
// UTF-16, otherwise assume UTF-8.
- if (size >= 2 &&
- reinterpret_cast<const uint16_t*>(data)[0] == 0xFEFF) {
+ if (size >= 2 && reinterpret_cast<const uint16_t*>(data)[0] == 0xFEFF) {
markup.assign(reinterpret_cast<const uint16_t*>(data) + 1,
(size / 2) - 1);
} else {
diff --git a/chromium/ui/base/x/selection_utils.h b/chromium/ui/base/x/selection_utils.h
index 5be34cd6414..9ca25b373a0 100644
--- a/chromium/ui/base/x/selection_utils.h
+++ b/chromium/ui/base/x/selection_utils.h
@@ -20,17 +20,17 @@ COMPONENT_EXPORT(UI_BASE_X) extern const char kText[];
COMPONENT_EXPORT(UI_BASE_X) extern const char kUtf8String[];
// Returns a list of all text atoms that we handle.
-COMPONENT_EXPORT(UI_BASE_X) std::vector<::Atom> GetTextAtomsFrom();
+COMPONENT_EXPORT(UI_BASE_X) std::vector<x11::Atom> GetTextAtomsFrom();
-COMPONENT_EXPORT(UI_BASE_X) std::vector<::Atom> GetURLAtomsFrom();
+COMPONENT_EXPORT(UI_BASE_X) std::vector<x11::Atom> GetURLAtomsFrom();
-COMPONENT_EXPORT(UI_BASE_X) std::vector<::Atom> GetURIListAtomsFrom();
+COMPONENT_EXPORT(UI_BASE_X) std::vector<x11::Atom> GetURIListAtomsFrom();
// Places the intersection of |desired| and |offered| into |output|.
COMPONENT_EXPORT(UI_BASE_X)
-void GetAtomIntersection(const std::vector<::Atom>& desired,
- const std::vector<::Atom>& offered,
- std::vector<::Atom>* output);
+void GetAtomIntersection(const std::vector<x11::Atom>& desired,
+ const std::vector<x11::Atom>& offered,
+ std::vector<x11::Atom>* output);
// Takes the raw bytes of the base::string16 and copies them into |bytes|.
COMPONENT_EXPORT(UI_BASE_X)
@@ -56,8 +56,9 @@ base::string16 RefCountedMemoryToString16(
class COMPONENT_EXPORT(UI_BASE_X) SelectionFormatMap {
public:
// Our internal data store, which we only expose through iterators.
- typedef std::map< ::Atom, scoped_refptr<base::RefCountedMemory> > InternalMap;
- typedef InternalMap::const_iterator const_iterator;
+ using InternalMap =
+ std::map<x11::Atom, scoped_refptr<base::RefCountedMemory>>;
+ using const_iterator = InternalMap::const_iterator;
SelectionFormatMap();
SelectionFormatMap(const SelectionFormatMap& other);
@@ -66,19 +67,20 @@ class COMPONENT_EXPORT(UI_BASE_X) SelectionFormatMap {
// Adds the selection in the format |atom|. Ownership of |data| is passed to
// us.
- void Insert(::Atom atom, const scoped_refptr<base::RefCountedMemory>& item);
+ void Insert(x11::Atom atom,
+ const scoped_refptr<base::RefCountedMemory>& item);
// Returns the first of the requested_types or NULL if missing.
ui::SelectionData GetFirstOf(
- const std::vector< ::Atom>& requested_types) const;
+ const std::vector<x11::Atom>& requested_types) const;
// Returns all the selected types.
- std::vector< ::Atom> GetTypes() const;
+ std::vector<x11::Atom> GetTypes() const;
// Pass through to STL map. Only allow non-mutation access.
const_iterator begin() const { return data_.begin(); }
const_iterator end() const { return data_.end(); }
- const_iterator find(::Atom atom) const { return data_.find(atom); }
+ const_iterator find(x11::Atom atom) const { return data_.find(atom); }
size_t size() const { return data_.size(); }
private:
@@ -92,14 +94,14 @@ class COMPONENT_EXPORT(UI_BASE_X) SelectionData {
public:
// |atom_cache| is still owned by caller.
SelectionData();
- SelectionData(::Atom type,
+ SelectionData(x11::Atom type,
const scoped_refptr<base::RefCountedMemory>& memory);
SelectionData(const SelectionData& rhs);
~SelectionData();
SelectionData& operator=(const SelectionData& rhs);
bool IsValid() const;
- ::Atom GetType() const;
+ x11::Atom GetType() const;
const unsigned char* GetData() const;
size_t GetSize() const;
@@ -115,7 +117,7 @@ class COMPONENT_EXPORT(UI_BASE_X) SelectionData {
void AssignTo(base::string16* result) const;
private:
- ::Atom type_;
+ x11::Atom type_;
scoped_refptr<base::RefCountedMemory> memory_;
};
diff --git a/chromium/ui/ozone/platform/x11/x11_cursor_ozone.cc b/chromium/ui/base/x/x11_cursor.cc
index 64eb043d301..9d55c5db524 100644
--- a/chromium/ui/ozone/platform/x11/x11_cursor_ozone.cc
+++ b/chromium/ui/base/x/x11_cursor.cc
@@ -2,26 +2,24 @@
// 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_cursor_ozone.h"
+#include "ui/base/x/x11_cursor.h"
#include "base/check_op.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/x/x11_util.h"
#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/x/x11.h"
namespace ui {
-X11CursorOzone::X11CursorOzone(const SkBitmap& bitmap,
- const gfx::Point& hotspot) {
+X11Cursor::X11Cursor(const SkBitmap& bitmap, const gfx::Point& hotspot) {
XcursorImage* image = SkBitmapToXcursorImage(bitmap, hotspot);
xcursor_ = XcursorImageLoadCursor(gfx::GetXDisplay(), image);
XcursorImageDestroy(image);
}
-X11CursorOzone::X11CursorOzone(const std::vector<SkBitmap>& bitmaps,
- const gfx::Point& hotspot,
- int frame_delay_ms) {
+X11Cursor::X11Cursor(const std::vector<SkBitmap>& bitmaps,
+ const gfx::Point& hotspot,
+ int frame_delay_ms) {
// Initialize an XCursorImage for each frame, store all of them in
// XCursorImages and load the cursor from that.
XcursorImages* images = XcursorImagesCreate(bitmaps.size());
@@ -36,20 +34,14 @@ X11CursorOzone::X11CursorOzone(const std::vector<SkBitmap>& bitmaps,
XcursorImagesDestroy(images);
}
-X11CursorOzone::X11CursorOzone(const char* name) {
- xcursor_ = XcursorLibraryLoadCursor(gfx::GetXDisplay(), name);
-}
+X11Cursor::X11Cursor(::Cursor xcursor) : xcursor_(xcursor) {}
// static
-scoped_refptr<X11CursorOzone> X11CursorOzone::CreateInvisible() {
- scoped_refptr<X11CursorOzone> invisible_ = new X11CursorOzone();
- invisible_->xcursor_ = CreateInvisibleCursor();
- return invisible_;
+scoped_refptr<X11Cursor> X11Cursor::CreateInvisible() {
+ return base::MakeRefCounted<X11Cursor>(CreateInvisibleCursor());
}
-X11CursorOzone::X11CursorOzone() {}
-
-X11CursorOzone::~X11CursorOzone() {
+X11Cursor::~X11Cursor() {
XFreeCursor(gfx::GetXDisplay(), xcursor_);
}
diff --git a/chromium/ui/base/x/x11_cursor.h b/chromium/ui/base/x/x11_cursor.h
new file mode 100644
index 00000000000..1711b947970
--- /dev/null
+++ b/chromium/ui/base/x/x11_cursor.h
@@ -0,0 +1,55 @@
+// 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.
+
+#ifndef UI_BASE_X_X11_CURSOR_H_
+#define UI_BASE_X_X11_CURSOR_H_
+
+#include <vector>
+
+#include "base/component_export.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
+#include "ui/gfx/x/x11.h"
+
+class SkBitmap;
+
+namespace gfx {
+class Point;
+}
+
+namespace ui {
+
+// Ref counted class to hold an X11 cursor resource. Clears the X11 resources
+// on destruction
+class COMPONENT_EXPORT(UI_BASE_X) X11Cursor
+ : public base::RefCounted<X11Cursor> {
+ public:
+ REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE();
+
+ // Handles creating X11 cursor resources from SkBitmap/hotspot.
+ X11Cursor(const SkBitmap& bitmap, const gfx::Point& hotspot);
+ X11Cursor(const X11Cursor&) = delete;
+ X11Cursor& operator=(const X11Cursor&) = delete;
+ X11Cursor(const std::vector<SkBitmap>& bitmaps,
+ const gfx::Point& hotspot,
+ int frame_delay_ms);
+ // Wraps an X11 cursor |xcursor|.
+ explicit X11Cursor(::Cursor xcursor);
+
+ // Creates a new cursor that is invisible.
+ static scoped_refptr<X11Cursor> CreateInvisible();
+
+ ::Cursor xcursor() const { return xcursor_; }
+
+ private:
+ friend class base::RefCounted<X11Cursor>;
+
+ ~X11Cursor();
+
+ ::Cursor xcursor_ = x11::None;
+};
+
+} // namespace ui
+
+#endif // UI_BASE_X_X11_CURSOR_H_
diff --git a/chromium/ui/base/x/x11_cursor_factory.cc b/chromium/ui/base/x/x11_cursor_factory.cc
new file mode 100644
index 00000000000..26624776290
--- /dev/null
+++ b/chromium/ui/base/x/x11_cursor_factory.cc
@@ -0,0 +1,118 @@
+// 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/base/x/x11_cursor_factory.h"
+
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
+#include "ui/base/x/x11_cursor.h"
+#include "ui/base/x/x11_util.h"
+#include "ui/gfx/geometry/point.h"
+#include "ui/gfx/x/x11.h"
+
+namespace ui {
+
+namespace {
+
+X11Cursor* ToX11Cursor(PlatformCursor cursor) {
+ return static_cast<X11Cursor*>(cursor);
+}
+
+PlatformCursor ToPlatformCursor(X11Cursor* cursor) {
+ return static_cast<PlatformCursor>(cursor);
+}
+
+} // namespace
+
+X11CursorFactory::X11CursorFactory()
+ : invisible_cursor_(X11Cursor::CreateInvisible()) {}
+
+X11CursorFactory::~X11CursorFactory() = default;
+
+base::Optional<PlatformCursor> X11CursorFactory::GetDefaultCursor(
+ mojom::CursorType type) {
+ auto cursor = GetDefaultCursorInternal(type);
+ if (!cursor)
+ return base::nullopt;
+ return ToPlatformCursor(cursor.get());
+}
+
+PlatformCursor X11CursorFactory::CreateImageCursor(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
+ // image. Return invisible cursor here instead.
+ if (bitmap.drawsNothing()) {
+ // The result of |invisible_cursor_| is owned by the caller, and will be
+ // Unref()ed by code far away. (Usually in web_cursor.cc in content, among
+ // others.) If we don't manually add another reference before we cast this
+ // to a void*, we can end up with |invisible_cursor_| being freed out from
+ // under us.
+ invisible_cursor_->AddRef();
+ return ToPlatformCursor(invisible_cursor_.get());
+ }
+
+ auto cursor = base::MakeRefCounted<X11Cursor>(bitmap, hotspot);
+ cursor->AddRef();
+ return ToPlatformCursor(cursor.get());
+}
+
+PlatformCursor X11CursorFactory::CreateAnimatedCursor(
+ const std::vector<SkBitmap>& bitmaps,
+ const gfx::Point& hotspot,
+ int frame_delay_ms) {
+ auto cursor =
+ base::MakeRefCounted<X11Cursor>(bitmaps, hotspot, frame_delay_ms);
+ cursor->AddRef();
+ return ToPlatformCursor(cursor.get());
+}
+
+void X11CursorFactory::RefImageCursor(PlatformCursor cursor) {
+ ToX11Cursor(cursor)->AddRef();
+}
+
+void X11CursorFactory::UnrefImageCursor(PlatformCursor cursor) {
+ ToX11Cursor(cursor)->Release();
+}
+
+void X11CursorFactory::ObserveThemeChanges() {
+ auto* cursor_theme_manager = CursorThemeManager::GetInstance();
+ if (cursor_theme_manager)
+ cursor_theme_observer_.Add(cursor_theme_manager);
+}
+
+void X11CursorFactory::OnCursorThemeNameChanged(
+ const std::string& cursor_theme_name) {
+ XcursorSetTheme(gfx::GetXDisplay(), cursor_theme_name.c_str());
+ ClearThemeCursors();
+}
+
+void X11CursorFactory::OnCursorThemeSizeChanged(int cursor_theme_size) {
+ XcursorSetDefaultSize(gfx::GetXDisplay(), cursor_theme_size);
+ ClearThemeCursors();
+}
+
+scoped_refptr<X11Cursor> X11CursorFactory::GetDefaultCursorInternal(
+ mojom::CursorType type) {
+ if (type == mojom::CursorType::kNone)
+ return invisible_cursor_;
+
+ if (!default_cursors_.count(type)) {
+ // Try to load a predefined X11 cursor.
+ ::Cursor xcursor = LoadCursorFromType(type);
+ if (xcursor == x11::None)
+ return nullptr;
+ auto cursor = base::MakeRefCounted<X11Cursor>(xcursor);
+ default_cursors_[type] = cursor;
+ }
+
+ // Returns owned default cursor for this type.
+ return default_cursors_[type];
+}
+
+void X11CursorFactory::ClearThemeCursors() {
+ default_cursors_.clear();
+}
+
+} // namespace ui
diff --git a/chromium/ui/base/x/x11_cursor_factory.h b/chromium/ui/base/x/x11_cursor_factory.h
new file mode 100644
index 00000000000..424511854ef
--- /dev/null
+++ b/chromium/ui/base/x/x11_cursor_factory.h
@@ -0,0 +1,67 @@
+// 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.
+
+#ifndef UI_BASE_X_X11_CURSOR_FACTORY_H_
+#define UI_BASE_X_X11_CURSOR_FACTORY_H_
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include "base/component_export.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/scoped_observer.h"
+#include "ui/base/cursor/cursor_factory.h"
+#include "ui/base/cursor/cursor_theme_manager.h"
+#include "ui/base/cursor/cursor_theme_manager_observer.h"
+#include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
+
+namespace ui {
+class X11Cursor;
+
+// CursorFactoryOzone implementation for X11 cursors.
+class COMPONENT_EXPORT(UI_BASE_X) X11CursorFactory
+ : public CursorFactory,
+ public CursorThemeManagerObserver {
+ public:
+ X11CursorFactory();
+ X11CursorFactory(const X11CursorFactory&) = delete;
+ X11CursorFactory& operator=(const X11CursorFactory&) = delete;
+ ~X11CursorFactory() override;
+
+ // CursorFactoryOzone:
+ base::Optional<PlatformCursor> GetDefaultCursor(
+ mojom::CursorType type) override;
+ PlatformCursor CreateImageCursor(const SkBitmap& bitmap,
+ const gfx::Point& hotspot) override;
+ PlatformCursor CreateAnimatedCursor(const std::vector<SkBitmap>& bitmaps,
+ const gfx::Point& hotspot,
+ int frame_delay_ms) override;
+ void RefImageCursor(PlatformCursor cursor) override;
+ void UnrefImageCursor(PlatformCursor cursor) override;
+ void ObserveThemeChanges() override;
+
+ private:
+ // CusorThemeManagerObserver:
+ void OnCursorThemeNameChanged(const std::string& cursor_theme_name) override;
+ void OnCursorThemeSizeChanged(int cursor_theme_size) override;
+
+ void ClearThemeCursors();
+
+ // Loads/caches default cursor or returns cached version.
+ scoped_refptr<X11Cursor> GetDefaultCursorInternal(mojom::CursorType type);
+
+ // Holds a single instance of the invisible cursor. X11 has no way to hide
+ // the cursor so an invisible cursor mimics that.
+ scoped_refptr<X11Cursor> invisible_cursor_;
+
+ std::map<mojom::CursorType, scoped_refptr<X11Cursor>> default_cursors_;
+
+ ScopedObserver<CursorThemeManager, CursorThemeManagerObserver>
+ cursor_theme_observer_{this};
+};
+
+} // namespace ui
+
+#endif // UI_BASE_X_X11_CURSOR_FACTORY_H_
diff --git a/chromium/ui/ozone/platform/x11/x11_cursor_factory_ozone_unittest.cc b/chromium/ui/base/x/x11_cursor_factory_unittest.cc
index 8b065eb100b..8c317fba402 100644
--- a/chromium/ui/ozone/platform/x11/x11_cursor_factory_ozone_unittest.cc
+++ b/chromium/ui/base/x/x11_cursor_factory_unittest.cc
@@ -2,23 +2,24 @@
// 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_cursor_factory_ozone.h"
+#include "ui/base/x/x11_cursor_factory.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/base/x/x11_cursor.h"
#include "ui/gfx/geometry/point.h"
namespace ui {
-TEST(X11CursorFactoryOzoneTest, InvisibleRefcount) {
- X11CursorFactoryOzone factory;
+TEST(X11CursorFactoryTest, InvisibleRefcount) {
+ X11CursorFactory factory;
// Building an image cursor with an invalid SkBitmap should return the
// invisible cursor in X11. The invisible cursor instance should have more
// than a single reference since the factory should hold a reference and
// CreateImageCursor should return an incremented refcount.
- X11CursorOzone* invisible_cursor = static_cast<X11CursorOzone*>(
- factory.CreateImageCursor(SkBitmap(), gfx::Point(), 1.0f));
+ auto* invisible_cursor = static_cast<X11Cursor*>(
+ factory.CreateImageCursor(SkBitmap(), gfx::Point()));
ASSERT_FALSE(invisible_cursor->HasOneRef());
// Release our refcount on the cursor
diff --git a/chromium/ui/base/x/x11_display_manager.cc b/chromium/ui/base/x/x11_display_manager.cc
index 5d2475a3315..623d809dd02 100644
--- a/chromium/ui/base/x/x11_display_manager.cc
+++ b/chromium/ui/base/x/x11_display_manager.cc
@@ -9,6 +9,7 @@
#include "base/bind.h"
#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"
@@ -22,21 +23,22 @@ constexpr int kMinXrandrVersion = 103; // Need at least xrandr version 1.3
XDisplayManager::XDisplayManager(Delegate* delegate)
: delegate_(delegate),
- xdisplay_(gfx::GetXDisplay()),
- x_root_window_(DefaultRootWindow(xdisplay_)),
- xrandr_version_(GetXrandrVersion(xdisplay_)),
+ connection_(x11::Connection::Get()),
+ x_root_window_(connection_->default_screen().root),
+ xrandr_version_(GetXrandrVersion()),
workspace_handler_(this) {}
XDisplayManager::~XDisplayManager() = default;
void XDisplayManager::Init() {
if (IsXrandrAvailable()) {
- int error_base_ignored = 0;
- XRRQueryExtension(xdisplay_, &xrandr_event_base_, &error_base_ignored);
+ auto& randr = connection_->randr();
+ xrandr_event_base_ = randr.first_event();
- XRRSelectInput(xdisplay_, x_root_window_,
- RRScreenChangeNotifyMask | RROutputChangeNotifyMask |
- RRCrtcChangeNotifyMask);
+ randr.SelectInput(
+ {x_root_window_, x11::RandR::NotifyMask::ScreenChange |
+ x11::RandR::NotifyMask::OutputChange |
+ x11::RandR::NotifyMask::CrtcChange});
}
FetchDisplayList();
}
@@ -59,25 +61,25 @@ void XDisplayManager::RemoveObserver(display::DisplayObserver* observer) {
change_notifier_.RemoveObserver(observer);
}
-bool XDisplayManager::CanProcessEvent(const XEvent& xev) {
- return xev.type - xrandr_event_base_ == RRScreenChangeNotify ||
- xev.type - xrandr_event_base_ == RRNotify ||
+bool XDisplayManager::CanProcessEvent(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
+ return xev.type - xrandr_event_base_ ==
+ x11::RandR::ScreenChangeNotifyEvent::opcode ||
+ xev.type - xrandr_event_base_ == x11::RandR::NotifyEvent::opcode ||
(xev.type == PropertyNotify &&
- xev.xproperty.window == x_root_window_ &&
- xev.xproperty.atom == gfx::GetAtom("_NET_WORKAREA"));
+ static_cast<x11::Window>(xev.xproperty.window) == x_root_window_ &&
+ xev.xproperty.atom ==
+ static_cast<uint32_t>(gfx::GetAtom("_NET_WORKAREA")));
}
-bool XDisplayManager::ProcessEvent(XEvent* xev) {
- DCHECK(xev);
+bool XDisplayManager::ProcessEvent(x11::Event* x11_event) {
+ DCHECK(x11_event);
+ XEvent* xev = &x11_event->xlib_event();
int ev_type = xev->type - xrandr_event_base_;
- if (ev_type == RRScreenChangeNotify) {
- // Pass the event through to xlib.
- XRRUpdateConfiguration(xev);
- return true;
- }
- if (ev_type == RRNotify ||
+ if (ev_type == x11::RandR::NotifyEvent::opcode ||
(xev->type == PropertyNotify &&
- xev->xproperty.atom == gfx::GetAtom("_NET_WORKAREA"))) {
+ xev->xproperty.atom ==
+ static_cast<uint32_t>(gfx::GetAtom("_NET_WORKAREA")))) {
DispatchDelayedDisplayListUpdate();
return true;
}
@@ -123,13 +125,9 @@ void XDisplayManager::DispatchDelayedDisplayListUpdate() {
}
gfx::Point XDisplayManager::GetCursorLocation() const {
- XID root, child;
- int root_x, root_y, win_x, win_y;
- unsigned int mask;
- XQueryPointer(xdisplay_, x_root_window_, &root, &child, &root_x, &root_y,
- &win_x, &win_y, &mask);
-
- return gfx::Point(root_x, root_y);
+ if (auto response = connection_->QueryPointer({x_root_window_}).Sync())
+ return {response->root_x, response->root_y};
+ return {};
}
std::string XDisplayManager::GetCurrentWorkspace() {
diff --git a/chromium/ui/base/x/x11_display_manager.h b/chromium/ui/base/x/x11_display_manager.h
index 257467daef0..d638460ad1b 100644
--- a/chromium/ui/base/x/x11_display_manager.h
+++ b/chromium/ui/base/x/x11_display_manager.h
@@ -14,6 +14,7 @@
#include "ui/display/display.h"
#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 {
@@ -34,7 +35,7 @@ class X11ScreenOzoneTest;
// Scale Factor information and simple hooks are delegated to API clients
// through |XDisplayManager::Delegate| interface. To get notifications about
// dynamic display changes, clients must register |DisplayObserver| instances
-// and feed |XDisplayManager| with |XEvent|s.
+// and feed |XDisplayManager| with |x11::Event|s.
//
// All bounds and size values are assumed to be expressed in pixels.
class COMPONENT_EXPORT(UI_BASE_X) XDisplayManager
@@ -47,8 +48,8 @@ class COMPONENT_EXPORT(UI_BASE_X) XDisplayManager
void Init();
bool IsXrandrAvailable() const;
- bool CanProcessEvent(const XEvent& xev);
- bool ProcessEvent(XEvent* xev);
+ bool CanProcessEvent(const x11::Event& xev);
+ bool ProcessEvent(x11::Event* xev);
void UpdateDisplayList();
void DispatchDelayedDisplayListUpdate();
display::Display GetPrimaryDisplay() const;
@@ -76,8 +77,8 @@ class COMPONENT_EXPORT(UI_BASE_X) XDisplayManager
std::vector<display::Display> displays_;
display::DisplayChangeNotifier change_notifier_;
- XDisplay* const xdisplay_;
- XID x_root_window_;
+ x11::Connection* const connection_;
+ x11::Window x_root_window_;
int64_t primary_display_index_ = 0;
// XRandR version. MAJOR * 100 + MINOR. Zero if no xrandr is present.
diff --git a/chromium/ui/base/x/x11_display_util.cc b/chromium/ui/base/x/x11_display_util.cc
index fe73b11b30d..0376b5ef9b3 100644
--- a/chromium/ui/base/x/x11_display_util.cc
+++ b/chromium/ui/base/x/x11_display_util.cc
@@ -18,6 +18,7 @@
#include "ui/gfx/geometry/matrix3_f.h"
#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"
@@ -27,32 +28,17 @@ namespace {
constexpr int kMinVersionXrandr = 103; // Need at least xrandr version 1.3.
-typedef XRRMonitorInfo* (*XRRGetMonitors)(::Display*, Window, bool, int*);
-typedef void (*XRRFreeMonitors)(XRRMonitorInfo*);
+constexpr const char kRandrEdidProperty[] = "EDID";
-NO_SANITIZE("cfi-icall")
-std::map<RROutput, int> GetMonitors(int version,
- XDisplay* xdisplay,
- GLXWindow window) {
- std::map<RROutput, int> output_to_monitor;
+std::map<x11::RandR::Output, int> GetMonitors(int version,
+ x11::RandR* randr,
+ x11::Window window) {
+ std::map<x11::RandR::Output, int> output_to_monitor;
if (version >= 105) {
- void* xrandr_lib = dlopen(nullptr, RTLD_NOW);
- if (xrandr_lib) {
- static XRRGetMonitors XRRGetMonitors_ptr =
- reinterpret_cast<XRRGetMonitors>(dlsym(xrandr_lib, "XRRGetMonitors"));
- static XRRFreeMonitors XRRFreeMonitors_ptr =
- reinterpret_cast<XRRFreeMonitors>(
- dlsym(xrandr_lib, "XRRFreeMonitors"));
- if (XRRGetMonitors_ptr && XRRFreeMonitors_ptr) {
- int nmonitors = 0;
- XRRMonitorInfo* monitors =
- XRRGetMonitors_ptr(xdisplay, window, false, &nmonitors);
- for (int monitor = 0; monitor < nmonitors; monitor++) {
- for (int j = 0; j < monitors[monitor].noutput; j++) {
- output_to_monitor[monitors[monitor].outputs[j]] = monitor;
- }
- }
- XRRFreeMonitors_ptr(monitors);
+ if (auto reply = randr->GetMonitors({window}).Sync()) {
+ for (size_t monitor = 0; monitor < reply->monitors.size(); monitor++) {
+ for (x11::RandR::Output output : reply->monitors[monitor].outputs)
+ output_to_monitor[output] = monitor;
}
}
}
@@ -65,8 +51,7 @@ std::map<RROutput, int> GetMonitors(int version,
void ClipWorkArea(std::vector<display::Display>* displays,
int64_t primary_display_index,
float scale) {
- XDisplay* xdisplay = gfx::GetXDisplay();
- GLXWindow x_root_window = DefaultRootWindow(xdisplay);
+ x11::Window x_root_window = ui::GetX11RootWindow();
std::vector<int> value;
if (!ui::GetIntArrayProperty(x_root_window, "_NET_WORKAREA", &value) ||
@@ -103,126 +88,89 @@ void ClipWorkArea(std::vector<display::Display>* displays,
primary.set_work_area(work_area);
}
-float GetRefreshRateFromXRRModeInfo(XRRModeInfo* modes,
- int num_of_mode,
- RRMode current_mode_id) {
- for (int i = 0; i < num_of_mode; i++) {
- XRRModeInfo mode_info = modes[i];
- if (mode_info.id != current_mode_id)
+float GetRefreshRateFromXRRModeInfo(
+ const std::vector<x11::RandR::ModeInfo>& modes,
+ x11::RandR::Mode current_mode_id) {
+ for (const auto& mode_info : modes) {
+ if (static_cast<x11::RandR::Mode>(mode_info.id) != current_mode_id)
continue;
- if (!mode_info.hTotal || !mode_info.vTotal)
+ if (!mode_info.htotal || !mode_info.vtotal)
return 0;
// Refresh Rate = Pixel Clock / (Horizontal Total * Vertical Total)
- return mode_info.dotClock /
- static_cast<float>(mode_info.hTotal * mode_info.vTotal);
+ return mode_info.dot_clock /
+ static_cast<float>(mode_info.htotal * mode_info.vtotal);
}
return 0;
}
-int DefaultScreenDepth(XDisplay* xdisplay) {
- return DefaultDepth(xdisplay, DefaultScreen(xdisplay));
-}
-
-int DefaultBitsPerComponent(XDisplay* xdisplay) {
- Visual* visual = DefaultVisual(xdisplay, DefaultScreen(xdisplay));
+int DefaultBitsPerComponent() {
+ auto* connection = x11::Connection::Get();
+ const x11::VisualType& visual = connection->default_root_visual();
// The mask fields are only valid for DirectColor and TrueColor classes.
- if (visual->c_class == DirectColor || visual->c_class == TrueColor) {
+ if (visual.c_class == x11::VisualClass::DirectColor ||
+ visual.c_class == x11::VisualClass::TrueColor) {
// RGB components are packed into fixed size integers for each visual. The
// layout of bits in the packing is given by
- // |visual->{red,green,blue}_mask|. Count the number of bits to get the
+ // |visual.{red,green,blue}_mask|. Count the number of bits to get the
// number of bits per component.
auto bits = [](auto mask) {
return std::bitset<sizeof(mask) * 8>{mask}.count();
};
- size_t red_bits = bits(visual->red_mask);
- size_t green_bits = bits(visual->green_mask);
- size_t blue_bits = bits(visual->blue_mask);
+ size_t red_bits = bits(visual.red_mask);
+ size_t green_bits = bits(visual.green_mask);
+ size_t blue_bits = bits(visual.blue_mask);
if (red_bits == green_bits && red_bits == blue_bits)
return red_bits;
}
// Next, try getting the number of colormap entries per subfield. If it's a
// power of 2, log2 is a possible guess for the number of bits per component.
- if (base::bits::IsPowerOfTwo(visual->map_entries))
- return base::bits::Log2Ceiling(visual->map_entries);
+ if (base::bits::IsPowerOfTwo(visual.colormap_entries))
+ return base::bits::Log2Ceiling(visual.colormap_entries);
// |bits_per_rgb| can sometimes be unreliable (may be 11 for 30bpp visuals),
// so only use it as a last resort.
- return visual->bits_per_rgb;
-}
-
-bool IsRandRAvailable() {
- int randr_version_major = 0;
- int randr_version_minor = 0;
- static bool is_randr_available = XRRQueryVersion(
- gfx::GetXDisplay(), &randr_version_major, &randr_version_minor);
- return is_randr_available;
+ return visual.bits_per_rgb_value;
}
// Get the EDID data from the |output| and stores to |edid|.
-void GetEDIDProperty(XID output, std::vector<uint8_t>* edid) {
- if (!IsRandRAvailable())
- return;
-
- Display* display = gfx::GetXDisplay();
-
- Atom edid_property = gfx::GetAtom(RR_PROPERTY_RANDR_EDID);
-
- bool has_edid_property = false;
- int num_properties = 0;
- gfx::XScopedPtr<Atom[]> properties(
- XRRListOutputProperties(display, output, &num_properties));
- for (int i = 0; i < num_properties; ++i) {
- if (properties[i] == edid_property) {
- has_edid_property = true;
- break;
- }
- }
- if (!has_edid_property)
- return;
-
- Atom actual_type;
- int actual_format;
- unsigned long bytes_after;
- unsigned long nitems = 0;
- unsigned char* prop = nullptr;
- XRRGetOutputProperty(display, output, edid_property,
- 0, // offset
- 128, // length
- false, // _delete
- false, // pending
- AnyPropertyType, // req_type
- &actual_type, &actual_format, &nitems, &bytes_after,
- &prop);
- DCHECK_EQ(XA_INTEGER, actual_type);
- DCHECK_EQ(8, actual_format);
- edid->assign(prop, prop + nitems);
- XFree(prop);
+std::vector<uint8_t> GetEDIDProperty(x11::RandR* randr,
+ x11::RandR::Output output) {
+ auto future = randr->GetOutputProperty({
+ .output = output,
+ .property = gfx::GetAtom(kRandrEdidProperty),
+ .long_length = 128,
+ });
+ auto response = future.Sync();
+ std::vector<uint8_t> edid;
+ if (response && response->format == 8 && response->type != x11::Atom::None)
+ edid = std::move(response->data);
+ return edid;
}
} // namespace
-int GetXrandrVersion(XDisplay* xdisplay) {
- int xrandr_version = 0;
- // We only support 1.3+. There were library changes before this and we should
- // use the new interface instead of the 1.2 one.
- int randr_version_major = 0;
- int randr_version_minor = 0;
- if (XRRQueryVersion(xdisplay, &randr_version_major, &randr_version_minor)) {
- xrandr_version = randr_version_major * 100 + randr_version_minor;
- }
- return xrandr_version;
+int GetXrandrVersion() {
+ auto impl = []() -> int {
+ auto future = x11::Connection::Get()->randr().QueryVersion(
+ {x11::RandR::major_version, x11::RandR::minor_version});
+ if (auto response = future.Sync())
+ return response->major_version * 100 + response->minor_version;
+ return 0;
+ };
+ static int version = impl();
+ return version;
}
std::vector<display::Display> GetFallbackDisplayList(float scale) {
- XDisplay* display = gfx::GetXDisplay();
- ::Screen* screen = DefaultScreenOfDisplay(display);
- gfx::Size physical_size(WidthMMOfScreen(screen), HeightMMOfScreen(screen));
+ const auto& screen = x11::Connection::Get()->default_screen();
+ gfx::Size physical_size(screen.width_in_millimeters,
+ screen.height_in_millimeters);
- int width = WidthOfScreen(screen);
- int height = HeightOfScreen(screen);
+ int width = screen.width_in_pixels;
+ int height = screen.height_in_pixels;
gfx::Rect bounds_in_pixels(0, 0, width, height);
display::Display gfx_display(0, bounds_in_pixels);
@@ -236,8 +184,8 @@ std::vector<display::Display> GetFallbackDisplayList(float scale) {
scale = 1;
}
- gfx_display.set_color_depth(DefaultScreenDepth(display));
- gfx_display.set_depth_per_component(DefaultBitsPerComponent(display));
+ gfx_display.set_color_depth(screen.root_depth);
+ gfx_display.set_depth_per_component(DefaultBitsPerComponent());
std::vector<display::Display> displays{gfx_display};
ClipWorkArea(&displays, 0, scale);
@@ -250,125 +198,129 @@ std::vector<display::Display> BuildDisplaysFromXRandRInfo(
int64_t* primary_display_index_out) {
DCHECK(primary_display_index_out);
DCHECK_GE(version, kMinVersionXrandr);
- XDisplay* xdisplay = gfx::GetXDisplay();
- GLXWindow x_root_window = DefaultRootWindow(xdisplay);
+ auto* connection = x11::Connection::Get();
+ auto& randr = connection->randr();
+ auto x_root_window = static_cast<x11::Window>(ui::GetX11RootWindow());
std::vector<display::Display> displays;
- gfx::XScopedPtr<
- XRRScreenResources,
- gfx::XObjectDeleter<XRRScreenResources, void, XRRFreeScreenResources>>
- resources(XRRGetScreenResourcesCurrent(xdisplay, x_root_window));
+ auto resources = randr.GetScreenResourcesCurrent({x_root_window}).Sync();
if (!resources) {
LOG(ERROR) << "XRandR returned no displays; falling back to root window";
return GetFallbackDisplayList(scale);
}
- const int depth = DefaultScreenDepth(xdisplay);
- const int bits_per_component = DefaultBitsPerComponent(xdisplay);
+ const int depth = connection->default_screen().root_depth;
+ const int bits_per_component = DefaultBitsPerComponent();
- std::map<RROutput, int> output_to_monitor =
- GetMonitors(version, xdisplay, x_root_window);
+ std::map<x11::RandR::Output, int> output_to_monitor =
+ GetMonitors(version, &randr, x_root_window);
*primary_display_index_out = 0;
- RROutput primary_display_id = XRRGetOutputPrimary(xdisplay, x_root_window);
+ auto output_primary = randr.GetOutputPrimary({x_root_window}).Sync();
+ if (!output_primary)
+ return GetFallbackDisplayList(scale);
+ x11::RandR::Output primary_display_id = output_primary->output;
int explicit_primary_display_index = -1;
int monitor_order_primary_display_index = -1;
// As per-display scale factor is not supported right now,
// the X11 root window's scale factor is always used.
- for (int i = 0; i < resources->noutput; ++i) {
- RROutput output_id = resources->outputs[i];
- gfx::XScopedPtr<XRROutputInfo,
- gfx::XObjectDeleter<XRROutputInfo, void, XRRFreeOutputInfo>>
- output_info(XRRGetOutputInfo(xdisplay, resources.get(), output_id));
-
- // XRRGetOutputInfo returns null in some cases: https://crbug.com/921490
+ for (size_t i = 0; i < resources->outputs.size(); i++) {
+ x11::RandR::Output output_id = resources->outputs[i];
+ auto output_info =
+ randr.GetOutputInfo({output_id, resources->config_timestamp}).Sync();
if (!output_info)
continue;
- bool is_connected = (output_info->connection == RR_Connected);
- if (!is_connected)
+ if (output_info->connection != x11::RandR::RandRConnection::Connected)
continue;
bool is_primary_display = (output_id == primary_display_id);
- if (output_info->crtc) {
- gfx::XScopedPtr<XRRCrtcInfo,
- gfx::XObjectDeleter<XRRCrtcInfo, void, XRRFreeCrtcInfo>>
- crtc(XRRGetCrtcInfo(xdisplay, resources.get(), output_info->crtc));
-
- std::vector<uint8_t> edid_bytes;
- GetEDIDProperty(output_id, &edid_bytes);
- display::EdidParser edid_parser(edid_bytes);
- int64_t display_id = edid_parser.GetDisplayId(output_id);
- // It isn't ideal, but if we can't parse the EDID data, fall back on the
- // display number.
- if (!display_id)
- display_id = i;
-
- gfx::Rect crtc_bounds(crtc->x, crtc->y, crtc->width, crtc->height);
- display::Display display(display_id, crtc_bounds);
-
- if (!display::Display::HasForceDeviceScaleFactor()) {
- display.SetScaleAndBounds(scale, crtc_bounds);
- display.set_work_area(
- gfx::ScaleToEnclosingRect(crtc_bounds, 1.0f / scale));
- }
-
- switch (crtc->rotation) {
- case RR_Rotate_0:
- display.set_rotation(display::Display::ROTATE_0);
- break;
- case RR_Rotate_90:
- display.set_rotation(display::Display::ROTATE_90);
- break;
- case RR_Rotate_180:
- display.set_rotation(display::Display::ROTATE_180);
- break;
- case RR_Rotate_270:
- display.set_rotation(display::Display::ROTATE_270);
- break;
- }
+ if (output_info->crtc == static_cast<x11::RandR::Crtc>(0))
+ continue;
- if (is_primary_display)
- explicit_primary_display_index = displays.size();
+ auto crtc =
+ randr.GetCrtcInfo({output_info->crtc, resources->config_timestamp})
+ .Sync();
+ if (!crtc)
+ continue;
- auto monitor_iter = output_to_monitor.find(output_id);
- if (monitor_iter != output_to_monitor.end() && monitor_iter->second == 0)
- monitor_order_primary_display_index = displays.size();
+ display::EdidParser edid_parser(
+ GetEDIDProperty(&randr, static_cast<x11::RandR::Output>(output_id)));
+ auto output_32 = static_cast<uint32_t>(output_id);
+ int64_t display_id =
+ output_32 > 0xff ? 0 : edid_parser.GetDisplayId(output_32);
+ // It isn't ideal, but if we can't parse the EDID data, fall back on the
+ // display number.
+ if (!display_id)
+ display_id = i;
+
+ gfx::Rect crtc_bounds(crtc->x, crtc->y, crtc->width, crtc->height);
+ display::Display display(display_id, crtc_bounds);
+
+ if (!display::Display::HasForceDeviceScaleFactor()) {
+ display.SetScaleAndBounds(scale, crtc_bounds);
+ display.set_work_area(
+ gfx::ScaleToEnclosingRect(crtc_bounds, 1.0f / scale));
+ }
- if (!display::Display::HasForceDisplayColorProfile()) {
- gfx::ICCProfile icc_profile = ui::GetICCProfileForMonitor(
- monitor_iter == output_to_monitor.end() ? 0 : monitor_iter->second);
- gfx::ColorSpace color_space = icc_profile.GetPrimariesOnlyColorSpace();
+ switch (crtc->rotation) {
+ case x11::RandR::Rotation::Rotate_0:
+ display.set_rotation(display::Display::ROTATE_0);
+ break;
+ case x11::RandR::Rotation::Rotate_90:
+ display.set_rotation(display::Display::ROTATE_90);
+ break;
+ case x11::RandR::Rotation::Rotate_180:
+ display.set_rotation(display::Display::ROTATE_180);
+ break;
+ case x11::RandR::Rotation::Rotate_270:
+ display.set_rotation(display::Display::ROTATE_270);
+ break;
+ case x11::RandR::Rotation::Reflect_X:
+ case x11::RandR::Rotation::Reflect_Y:
+ NOTIMPLEMENTED();
+ }
- // Most folks do not have an ICC profile set up, but we still want to
- // detect if a display has a wide color gamut so that HDR videos can be
- // enabled. Only do this if |bits_per_component| > 8 or else SDR
- // screens may have washed out colors.
- if (bits_per_component > 8 && !color_space.IsValid())
- color_space = display::GetColorSpaceFromEdid(edid_parser);
+ if (is_primary_display)
+ explicit_primary_display_index = displays.size();
- display.set_color_spaces(
- gfx::DisplayColorSpaces(color_space, gfx::BufferFormat::BGRA_8888));
- }
+ auto monitor_iter =
+ output_to_monitor.find(static_cast<x11::RandR::Output>(output_id));
+ if (monitor_iter != output_to_monitor.end() && monitor_iter->second == 0)
+ monitor_order_primary_display_index = displays.size();
- display.set_color_depth(depth);
- display.set_depth_per_component(bits_per_component);
+ if (!display::Display::HasForceDisplayColorProfile()) {
+ gfx::ICCProfile icc_profile = ui::GetICCProfileForMonitor(
+ monitor_iter == output_to_monitor.end() ? 0 : monitor_iter->second);
+ gfx::ColorSpace color_space = icc_profile.GetPrimariesOnlyColorSpace();
- // Set monitor refresh rate
- int refresh_rate = static_cast<int>(GetRefreshRateFromXRRModeInfo(
- resources->modes, resources->nmode, crtc->mode));
- display.set_display_frequency(refresh_rate);
+ // Most folks do not have an ICC profile set up, but we still want to
+ // detect if a display has a wide color gamut so that HDR videos can be
+ // enabled. Only do this if |bits_per_component| > 8 or else SDR
+ // screens may have washed out colors.
+ if (bits_per_component > 8 && !color_space.IsValid())
+ color_space = display::GetColorSpaceFromEdid(edid_parser);
- displays.push_back(display);
+ display.set_color_spaces(
+ gfx::DisplayColorSpaces(color_space, gfx::BufferFormat::BGRA_8888));
}
+
+ display.set_color_depth(depth);
+ display.set_depth_per_component(bits_per_component);
+
+ // Set monitor refresh rate
+ int refresh_rate = static_cast<int>(
+ GetRefreshRateFromXRRModeInfo(resources->modes, crtc->mode));
+ display.set_display_frequency(refresh_rate);
+
+ displays.push_back(display);
}
- if (explicit_primary_display_index != -1) {
+ if (explicit_primary_display_index != -1)
*primary_display_index_out = explicit_primary_display_index;
- } else if (monitor_order_primary_display_index != -1) {
+ else if (monitor_order_primary_display_index != -1)
*primary_display_index_out = monitor_order_primary_display_index;
- }
if (displays.empty())
return GetFallbackDisplayList(scale);
@@ -377,32 +329,33 @@ std::vector<display::Display> BuildDisplaysFromXRandRInfo(
return displays;
}
-base::TimeDelta GetPrimaryDisplayRefreshIntervalFromXrandr(Display* display) {
+base::TimeDelta GetPrimaryDisplayRefreshIntervalFromXrandr() {
constexpr base::TimeDelta kDefaultInterval =
base::TimeDelta::FromSecondsD(1. / 60);
- GLXWindow root = DefaultRootWindow(display);
- gfx::XScopedPtr<
- XRRScreenResources,
- gfx::XObjectDeleter<XRRScreenResources, void, XRRFreeScreenResources>>
- resources(XRRGetScreenResourcesCurrent(display, root));
+ x11::RandR randr = x11::Connection::Get()->randr();
+ auto root = static_cast<x11::Window>(ui::GetX11RootWindow());
+ auto resources = randr.GetScreenResourcesCurrent({root}).Sync();
if (!resources)
return kDefaultInterval;
// TODO(crbug.com/726842): It might make sense here to pick the output that
// the window is on. On the other hand, if compositing is enabled, all drawing
// might be synced to the primary output anyway. Needs investigation.
- RROutput primary_output = XRRGetOutputPrimary(display, root);
+ auto output_primary = randr.GetOutputPrimary({root}).Sync();
+ if (!output_primary)
+ return kDefaultInterval;
+ x11::RandR::Output primary_output = output_primary->output;
bool disconnected_primary = false;
- for (int i = 0; i < resources->noutput; i++) {
+ for (size_t i = 0; i < resources->outputs.size(); i++) {
if (!disconnected_primary && resources->outputs[i] != primary_output)
continue;
- gfx::XScopedPtr<XRROutputInfo,
- gfx::XObjectDeleter<XRROutputInfo, void, XRRFreeOutputInfo>>
- output_info(XRRGetOutputInfo(display, resources.get(), primary_output));
+ auto output_info =
+ randr.GetOutputInfo({primary_output, resources->config_timestamp})
+ .Sync();
if (!output_info)
continue;
- if (output_info->connection != RR_Connected) {
+ if (output_info->connection != x11::RandR::RandRConnection::Connected) {
// If the primary monitor is disconnected, then start over and choose the
// first connected monitor instead.
if (!disconnected_primary) {
@@ -411,13 +364,13 @@ base::TimeDelta GetPrimaryDisplayRefreshIntervalFromXrandr(Display* display) {
}
continue;
}
- gfx::XScopedPtr<XRRCrtcInfo,
- gfx::XObjectDeleter<XRRCrtcInfo, void, XRRFreeCrtcInfo>>
- crtc(XRRGetCrtcInfo(display, resources.get(), output_info->crtc));
+ auto crtc =
+ randr.GetCrtcInfo({output_info->crtc, resources->config_timestamp})
+ .Sync();
if (!crtc)
continue;
- float refresh_rate = GetRefreshRateFromXRRModeInfo(
- resources->modes, resources->nmode, crtc->mode);
+ float refresh_rate =
+ GetRefreshRateFromXRRModeInfo(resources->modes, crtc->mode);
if (refresh_rate == 0)
continue;
diff --git a/chromium/ui/base/x/x11_display_util.h b/chromium/ui/base/x/x11_display_util.h
index 825d840bab7..7a128004483 100644
--- a/chromium/ui/base/x/x11_display_util.h
+++ b/chromium/ui/base/x/x11_display_util.h
@@ -16,7 +16,7 @@ namespace ui {
// Return the version for xrandr. It multiplies the major number by 100 and
// adds the minor like MAJOR * 100 + MINOR. It returns zero if no xrandr is
// present.
-COMPONENT_EXPORT(UI_BASE_X) int GetXrandrVersion(XDisplay* xdisplay);
+COMPONENT_EXPORT(UI_BASE_X) int GetXrandrVersion();
// Builds a list of displays for fallback.
COMPONENT_EXPORT(UI_BASE_X)
@@ -33,7 +33,7 @@ std::vector<display::Display> BuildDisplaysFromXRandRInfo(
// Returns the refresh interval of the primary display. If there is no connected
// primary display, returns the refresh interval of the first connected display.
COMPONENT_EXPORT(UI_BASE_X)
-base::TimeDelta GetPrimaryDisplayRefreshIntervalFromXrandr(Display* display);
+base::TimeDelta GetPrimaryDisplayRefreshIntervalFromXrandr();
} // namespace ui
diff --git a/chromium/ui/base/x/x11_drag_context.cc b/chromium/ui/base/x/x11_drag_context.cc
index 3ed9e98b2a2..bdb6df1fd5c 100644
--- a/chromium/ui/base/x/x11_drag_context.cc
+++ b/chromium/ui/base/x/x11_drag_context.cc
@@ -4,11 +4,15 @@
#include "ui/base/x/x11_drag_context.h"
+#include "base/logging.h"
+#include "base/memory/ref_counted_memory.h"
#include "ui/base/dragdrop/drag_drop_types.h"
#include "ui/base/x/x11_drag_drop_client.h"
#include "ui/base/x/x11_util.h"
#include "ui/events/platform/platform_event_source.h"
+#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/x11_atom_cache.h"
+#include "ui/gfx/x/xproto.h"
namespace ui {
@@ -36,15 +40,15 @@ const char kChromiumDragReciever[] = "_CHROMIUM_DRAG_RECEIVER";
} // namespace
-XDragContext::XDragContext(XID local_window,
- const XClientMessageEvent& event,
+XDragContext::XDragContext(x11::Window local_window,
+ const x11::ClientMessageEvent& event,
XDragDropClient* source_client,
const SelectionFormatMap& data)
: local_window_(local_window),
- source_window_(event.data.l[0]),
+ source_window_(static_cast<x11::Window>(event.data.data32[0])),
source_client_(source_client) {
if (!source_client_) {
- bool get_types_from_property = ((event.data.l[1] & 1) != 0);
+ bool get_types_from_property = ((event.data.data32[1] & 1) != 0);
if (get_types_from_property) {
if (!GetAtomArrayProperty(source_window_, kXdndTypeList,
@@ -54,20 +58,22 @@ XDragContext::XDragContext(XID local_window,
} else {
// data.l[2,3,4] contain the first three types. Unused slots can be None.
for (size_t i = 2; i < 5; ++i) {
- if (event.data.l[i] != x11::None)
- unfetched_targets_.push_back(event.data.l[i]);
+ if (event.data.data32[i]) {
+ unfetched_targets_.push_back(
+ static_cast<x11::Atom>(event.data.data32[i]));
+ }
}
}
#if DCHECK_IS_ON()
DVLOG(1) << "XdndEnter has " << unfetched_targets_.size() << " data types";
- for (Atom target : unfetched_targets_)
- DVLOG(1) << "XdndEnter data type: " << target;
+ for (x11::Atom target : unfetched_targets_)
+ DVLOG(1) << "XdndEnter data type: " << static_cast<uint32_t>(target);
#endif // DCHECK_IS_ON()
// We must perform a full sync here because we could be racing
// |source_window_|.
- XSync(gfx::GetXDisplay(), x11::False);
+ x11::Connection::Get()->Sync();
} else {
// This drag originates from an aura window within our process. This means
// that we can shortcut the X11 server and ask the owning SelectionOwner
@@ -81,9 +87,9 @@ XDragContext::XDragContext(XID local_window,
XDragContext::~XDragContext() = default;
void XDragContext::OnXdndPositionMessage(XDragDropClient* client,
- Atom suggested_action,
- XID source_window,
- Time time_stamp,
+ x11::Atom suggested_action,
+ x11::Window source_window,
+ x11::Time time_stamp,
const gfx::Point& screen_point) {
DCHECK_EQ(source_window_, source_window);
suggested_action_ = suggested_action;
@@ -108,15 +114,15 @@ void XDragContext::RequestNextTarget() {
DCHECK(drag_drop_client_);
DCHECK(waiting_to_handle_position_);
- Atom target = unfetched_targets_.back();
+ x11::Atom target = unfetched_targets_.back();
unfetched_targets_.pop_back();
- XConvertSelection(gfx::GetXDisplay(), gfx::GetAtom(kXdndSelection), target,
- gfx::GetAtom(kChromiumDragReciever), local_window_,
- position_time_stamp_);
+ x11::Connection::Get()->ConvertSelection(
+ {local_window_, gfx::GetAtom(kXdndSelection), target,
+ gfx::GetAtom(kChromiumDragReciever), position_time_stamp_});
}
-void XDragContext::OnSelectionNotify(const XSelectionEvent& event) {
+void XDragContext::OnSelectionNotify(const x11::SelectionNotifyEvent& event) {
if (!waiting_to_handle_position_) {
// A misbehaved window may send SelectionNotify without us requesting data
// via XConvertSelection().
@@ -124,23 +130,24 @@ void XDragContext::OnSelectionNotify(const XSelectionEvent& event) {
}
DCHECK(drag_drop_client_);
- DVLOG(1) << "SelectionNotify, format " << event.target;
+ DVLOG(1) << "SelectionNotify, format " << static_cast<uint32_t>(event.target);
- if (event.property != x11::None) {
- DCHECK_EQ(event.property, gfx::GetAtom(kChromiumDragReciever));
+ auto property = static_cast<x11::Atom>(event.property);
+ auto target = static_cast<x11::Atom>(event.target);
- scoped_refptr<base::RefCountedMemory> data;
- Atom type = x11::None;
- if (GetRawBytesOfProperty(local_window_, event.property, &data, nullptr,
- &type)) {
- fetched_targets_.Insert(event.target, data);
- }
+ if (event.property != x11::Atom::None) {
+ DCHECK_EQ(property, gfx::GetAtom(kChromiumDragReciever));
+
+ std::vector<uint8_t> data;
+ x11::Atom type = x11::Atom::None;
+ if (GetRawBytesOfProperty(local_window_, property, &data, &type))
+ fetched_targets_.Insert(target, base::RefCountedBytes::TakeVector(&data));
} else {
// The source failed to convert the drop data to the format (target in X11
// parlance) that we asked for. This happens, even though we only ask for
// the formats advertised by the source. http://crbug.com/628099
LOG(ERROR) << "XConvertSelection failed for source-advertised target "
- << event.target;
+ << static_cast<uint32_t>(event.target);
}
if (!unfetched_targets_.empty()) {
@@ -154,7 +161,7 @@ void XDragContext::OnSelectionNotify(const XSelectionEvent& event) {
void XDragContext::ReadActions() {
if (!source_client_) {
- std::vector<Atom> atom_array;
+ std::vector<x11::Atom> atom_array;
if (!GetAtomArrayProperty(source_window_, kXdndActionList, &atom_array))
actions_.clear();
else
@@ -177,7 +184,7 @@ int XDragContext::GetDragOperation() const {
return drag_operation;
}
-void XDragContext::MaskOperation(Atom xdnd_operation,
+void XDragContext::MaskOperation(x11::Atom xdnd_operation,
int* drag_operation) const {
if (xdnd_operation == gfx::GetAtom(kXdndActionCopy))
*drag_operation |= DragDropTypes::DRAG_COPY;
@@ -187,9 +194,9 @@ void XDragContext::MaskOperation(Atom xdnd_operation,
*drag_operation |= DragDropTypes::DRAG_LINK;
}
-bool XDragContext::DispatchXEvent(XEvent* xev) {
- if (xev->type == PropertyNotify &&
- xev->xproperty.atom == gfx::GetAtom(kXdndActionList)) {
+bool XDragContext::DispatchPropertyNotifyEvent(
+ const x11::PropertyNotifyEvent& prop) {
+ if (prop.atom == gfx::GetAtom(kXdndActionList)) {
ReadActions();
return true;
}
diff --git a/chromium/ui/base/x/x11_drag_context.h b/chromium/ui/base/x/x11_drag_context.h
index 386ca2810e6..33cfea53651 100644
--- a/chromium/ui/base/x/x11_drag_context.h
+++ b/chromium/ui/base/x/x11_drag_context.h
@@ -12,7 +12,9 @@
#include "ui/base/x/selection_utils.h"
#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 {
@@ -20,8 +22,8 @@ class XDragDropClient;
class COMPONENT_EXPORT(UI_BASE_X) XDragContext {
public:
- XDragContext(XID local_window,
- const XClientMessageEvent& event,
+ XDragContext(x11::Window local_window,
+ const x11::ClientMessageEvent& event,
XDragDropClient* source_client,
const SelectionFormatMap& data);
~XDragContext();
@@ -29,7 +31,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XDragContext {
XDragContext(const XDragContext&) = delete;
XDragContext& operator=(const XDragContext&) = delete;
- XID source_window() const { return source_window_; }
+ x11::Window source_window() const { return source_window_; }
XDragDropClient* source_client() { return source_client_; }
const SelectionFormatMap& fetched_targets() const { return fetched_targets_; }
@@ -38,13 +40,13 @@ class COMPONENT_EXPORT(UI_BASE_X) XDragContext {
// message. If we have that data already, dispatch immediately. Otherwise,
// delay dispatching until we do.
void OnXdndPositionMessage(XDragDropClient* client,
- Atom suggested_action,
- XID source_window,
- Time time_stamp,
+ x11::Atom suggested_action,
+ x11::Window source_window,
+ x11::Time time_stamp,
const gfx::Point& screen_point);
// Called when XSelection data has been copied to our process.
- void OnSelectionNotify(const XSelectionEvent& xselection);
+ void OnSelectionNotify(const x11::SelectionNotifyEvent& xselection);
// Reads the kXdndActionList property from |source_window_| and copies it
// into |actions_|.
@@ -54,7 +56,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XDragContext {
// action list.
int GetDragOperation() const;
- bool DispatchXEvent(XEvent* event);
+ bool DispatchPropertyNotifyEvent(const x11::PropertyNotifyEvent& event);
private:
// Called to request the next target from the source window. This is only
@@ -64,13 +66,13 @@ class COMPONENT_EXPORT(UI_BASE_X) XDragContext {
// Masks the X11 atom |xdnd_operation|'s views representation onto
// |drag_operation|.
- void MaskOperation(Atom xdnd_operation, int* drag_operation) const;
+ void MaskOperation(x11::Atom xdnd_operation, int* drag_operation) const;
- // The XID of our chrome local aura window handling our events.
- XID local_window_;
+ // The x11::Window of our chrome local aura window handling our events.
+ x11::Window local_window_;
- // The XID of the window that initiated the drag.
- XID source_window_;
+ // The x11::Window of the window that initiated the drag.
+ x11::Window source_window_;
// The DesktopDragDropClientAuraX11 for |source_window_| if |source_window_|
// belongs to a Chrome window.
@@ -89,21 +91,21 @@ class COMPONENT_EXPORT(UI_BASE_X) XDragContext {
// The time stamp of the last XdndPosition event we received. The XDND
// specification mandates that we use this time stamp when querying the source
// about the drag and drop data.
- Time position_time_stamp_;
+ x11::Time position_time_stamp_;
// A SelectionFormatMap of data that we have in our process.
SelectionFormatMap fetched_targets_;
// The names of various data types offered by the other window that we
// haven't fetched and put in |fetched_targets_| yet.
- std::vector<Atom> unfetched_targets_;
+ std::vector<x11::Atom> unfetched_targets_;
// XdndPosition messages have a suggested action. Qt applications exclusively
// use this, instead of the XdndActionList which is backed by |actions_|.
- Atom suggested_action_ = x11::None;
+ x11::Atom suggested_action_ = x11::Atom::None;
// Possible actions.
- std::vector<Atom> actions_;
+ std::vector<x11::Atom> actions_;
};
} // namespace ui
diff --git a/chromium/ui/base/x/x11_drag_drop_client.cc b/chromium/ui/base/x/x11_drag_drop_client.cc
index 6329bd377f0..3eccf0b276d 100644
--- a/chromium/ui/base/x/x11_drag_drop_client.cc
+++ b/chromium/ui/base/x/x11_drag_drop_client.cc
@@ -5,11 +5,14 @@
#include "ui/base/x/x11_drag_drop_client.h"
#include "base/lazy_instance.h"
+#include "base/logging.h"
#include "ui/base/clipboard/clipboard_constants.h"
#include "ui/base/dragdrop/os_exchange_data.h"
#include "ui/base/x/x11_os_exchange_data_provider.h"
#include "ui/base/x/x11_util.h"
+#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/x11_atom_cache.h"
+#include "ui/gfx/x/xproto.h"
// Reading recommended for understanding the implementation in this file:
//
@@ -112,12 +115,12 @@ const char kXdndPosition[] = "XdndPosition";
// action will be taken if the drop is accepted.
const char kXdndStatus[] = "XdndStatus";
-static base::LazyInstance<std::map<XID, XDragDropClient*>>::Leaky
+static base::LazyInstance<std::map<x11::Window, XDragDropClient*>>::Leaky
g_live_client_map = LAZY_INSTANCE_INITIALIZER;
// Converts a bitfield of actions into an Atom that represents what action
// we're most likely to take on drop.
-Atom XDragOperationToAtom(int drag_operation) {
+x11::Atom XDragOperationToAtom(int drag_operation) {
if (drag_operation & DragDropTypes::DRAG_COPY)
return gfx::GetAtom(kXdndActionCopy);
if (drag_operation & DragDropTypes::DRAG_MOVE)
@@ -125,11 +128,11 @@ Atom XDragOperationToAtom(int drag_operation) {
if (drag_operation & DragDropTypes::DRAG_LINK)
return gfx::GetAtom(kXdndActionLink);
- return x11::None;
+ return x11::Atom::None;
}
// Converts a single action atom to a drag operation.
-DragDropTypes::DragOperation XAtomToDragOperation(Atom atom) {
+DragDropTypes::DragOperation AtomToDragOperation(x11::Atom atom) {
if (atom == gfx::GetAtom(kXdndActionCopy))
return DragDropTypes::DRAG_COPY;
if (atom == gfx::GetAtom(kXdndActionMove))
@@ -143,34 +146,34 @@ DragDropTypes::DragOperation XAtomToDragOperation(Atom atom) {
} // namespace
int XGetMaskAsEventFlags() {
- XDisplay* display = gfx::GetXDisplay();
+ x11::KeyButMask mask{};
+ auto* connection = x11::Connection::Get();
+ if (auto reply =
+ connection->QueryPointer({connection->default_root()}).Sync()) {
+ mask = reply->mask;
+ }
- XID root, child;
- int root_x, root_y, win_x, win_y;
- unsigned int mask;
- XQueryPointer(display, DefaultRootWindow(display), &root, &child, &root_x,
- &root_y, &win_x, &win_y, &mask);
int modifiers = ui::EF_NONE;
- if (mask & ShiftMask)
+ if (static_cast<bool>(mask & x11::KeyButMask::Shift))
modifiers |= ui::EF_SHIFT_DOWN;
- if (mask & ControlMask)
+ if (static_cast<bool>(mask & x11::KeyButMask::Control))
modifiers |= ui::EF_CONTROL_DOWN;
- if (mask & Mod1Mask)
+ if (static_cast<bool>(mask & x11::KeyButMask::Mod1))
modifiers |= ui::EF_ALT_DOWN;
- if (mask & Mod4Mask)
+ if (static_cast<bool>(mask & x11::KeyButMask::Mod4))
modifiers |= ui::EF_COMMAND_DOWN;
- if (mask & Button1Mask)
+ if (static_cast<bool>(mask & x11::KeyButMask::Button1))
modifiers |= ui::EF_LEFT_MOUSE_BUTTON;
- if (mask & Button2Mask)
+ if (static_cast<bool>(mask & x11::KeyButMask::Button2))
modifiers |= ui::EF_MIDDLE_MOUSE_BUTTON;
- if (mask & Button3Mask)
+ if (static_cast<bool>(mask & x11::KeyButMask::Button3))
modifiers |= ui::EF_RIGHT_MOUSE_BUTTON;
return modifiers;
}
// static
-XDragDropClient* XDragDropClient::GetForWindow(XID window) {
- std::map<XID, XDragDropClient*>::const_iterator it =
+XDragDropClient* XDragDropClient::GetForWindow(x11::Window window) {
+ std::map<x11::Window, XDragDropClient*>::const_iterator it =
g_live_client_map.Get().find(window);
if (it == g_live_client_map.Get().end())
return nullptr;
@@ -178,16 +181,14 @@ XDragDropClient* XDragDropClient::GetForWindow(XID window) {
}
XDragDropClient::XDragDropClient(XDragDropClient::Delegate* delegate,
- Display* xdisplay,
- XID xwindow)
- : delegate_(delegate), xdisplay_(xdisplay), xwindow_(xwindow) {
+ x11::Window xwindow)
+ : delegate_(delegate), xwindow_(xwindow) {
DCHECK(delegate_);
// Mark that we are aware of drag and drop concepts.
- unsigned long xdnd_version = kMaxXdndVersion;
- XChangeProperty(xdisplay_, xwindow_, gfx::GetAtom(kXdndAware), XA_ATOM, 32,
- PropModeReplace,
- reinterpret_cast<unsigned char*>(&xdnd_version), 1);
+ uint32_t xdnd_version = kMaxXdndVersion;
+ ui::SetProperty(xwindow_, gfx::GetAtom(kXdndAware), x11::Atom::ATOM,
+ xdnd_version);
// Some tests change the DesktopDragDropClientAuraX11 associated with an
// |xwindow|.
@@ -198,8 +199,8 @@ XDragDropClient::~XDragDropClient() {
g_live_client_map.Get().erase(xwindow());
}
-std::vector<Atom> XDragDropClient::GetOfferedDragOperations() const {
- std::vector<Atom> operations;
+std::vector<x11::Atom> XDragDropClient::GetOfferedDragOperations() const {
+ std::vector<x11::Atom> operations;
if (drag_operation_ & DragDropTypes::DRAG_COPY)
operations.push_back(gfx::GetAtom(kXdndActionCopy));
if (drag_operation_ & DragDropTypes::DRAG_MOVE)
@@ -209,7 +210,7 @@ std::vector<Atom> XDragDropClient::GetOfferedDragOperations() const {
return operations;
}
-void XDragDropClient::CompleteXdndPosition(XID source_window,
+void XDragDropClient::CompleteXdndPosition(x11::Window source_window,
const gfx::Point& screen_point) {
int drag_operation = delegate_->UpdateDrag(screen_point);
@@ -219,11 +220,12 @@ void XDragDropClient::CompleteXdndPosition(XID source_window,
// actually making use of this. A client can return (0, 0) and/or set the
// first bit of l[1] to disable the feature, and it appears that gtk neither
// sets this nor respects it if set.
- XEvent xev = PrepareXdndClientMessage(kXdndStatus, source_window);
- xev.xclient.data.l[1] =
+ auto xev = PrepareXdndClientMessage(kXdndStatus, source_window);
+ xev.data.data32[1] =
(drag_operation != 0) ? (kWantFurtherPosEvents | kWillAcceptDrop) : 0;
- xev.xclient.data.l[4] = XDragOperationToAtom(drag_operation);
- SendXClientEvent(source_window, &xev);
+ xev.data.data32[4] =
+ static_cast<uint32_t>(XDragOperationToAtom(drag_operation));
+ SendXClientEvent(source_window, xev);
}
void XDragDropClient::ProcessMouseMove(const gfx::Point& screen_point,
@@ -232,26 +234,26 @@ void XDragDropClient::ProcessMouseMove(const gfx::Point& screen_point,
return;
// Find the current window the cursor is over.
- XID dest_window = FindWindowFor(screen_point);
+ x11::Window dest_window = FindWindowFor(screen_point);
- if (source_current_window_ != dest_window) {
- if (source_current_window_ != x11::None)
- SendXdndLeave(source_current_window_);
+ if (target_current_window_ != dest_window) {
+ if (target_current_window_ != x11::Window::None)
+ SendXdndLeave(target_current_window_);
- source_current_window_ = dest_window;
+ target_current_window_ = dest_window;
waiting_on_status_ = false;
next_position_message_.reset();
status_received_since_enter_ = false;
negotiated_operation_ = DragDropTypes::DRAG_NONE;
- if (source_current_window_ != x11::None) {
- std::vector<Atom> targets;
+ if (target_current_window_ != x11::Window::None) {
+ std::vector<x11::Atom> targets;
source_provider_->RetrieveTargets(&targets);
- SendXdndEnter(source_current_window_, targets);
+ SendXdndEnter(target_current_window_, targets);
}
}
- if (source_current_window_ != x11::None) {
+ if (target_current_window_ != x11::Window::None) {
if (waiting_on_status_) {
next_position_message_ =
std::make_unique<std::pair<gfx::Point, unsigned long>>(screen_point,
@@ -262,30 +264,30 @@ void XDragDropClient::ProcessMouseMove(const gfx::Point& screen_point,
}
}
-bool XDragDropClient::HandleXdndEvent(const XClientMessageEvent& event) {
- Atom message_type = event.message_type;
- if (message_type == gfx::GetAtom("XdndEnter")) {
+bool XDragDropClient::HandleXdndEvent(const x11::ClientMessageEvent& event) {
+ x11::Atom message_type = event.type;
+ if (message_type == gfx::GetAtom("XdndEnter"))
OnXdndEnter(event);
- } else if (message_type == gfx::GetAtom("XdndLeave")) {
+ else if (message_type == gfx::GetAtom("XdndLeave"))
OnXdndLeave(event);
- } else if (message_type == gfx::GetAtom("XdndPosition")) {
+ else if (message_type == gfx::GetAtom("XdndPosition"))
OnXdndPosition(event);
- } else if (message_type == gfx::GetAtom("XdndStatus")) {
+ else if (message_type == gfx::GetAtom("XdndStatus"))
OnXdndStatus(event);
- } else if (message_type == gfx::GetAtom("XdndFinished")) {
+ else if (message_type == gfx::GetAtom("XdndFinished"))
OnXdndFinished(event);
- } else if (message_type == gfx::GetAtom("XdndDrop")) {
+ else if (message_type == gfx::GetAtom("XdndDrop"))
OnXdndDrop(event);
- } else {
+ else
return false;
- }
return true;
}
-void XDragDropClient::OnXdndEnter(const XClientMessageEvent& event) {
- DVLOG(1) << "OnXdndEnter, version " << ((event.data.l[1] & 0xff000000) >> 24);
+void XDragDropClient::OnXdndEnter(const x11::ClientMessageEvent& event) {
+ DVLOG(1) << "OnXdndEnter, version "
+ << ((event.data.data32[1] & 0xff000000) >> 24);
- int version = (event.data.l[1] & 0xff000000) >> 24;
+ int version = (event.data.data32[1] & 0xff000000) >> 24;
if (version < kMinXdndVersion) {
// This protocol version is not documented in the XDND standard (last
// revised in 1999), so we don't support it. Since don't understand the
@@ -303,7 +305,8 @@ void XDragDropClient::OnXdndEnter(const XClientMessageEvent& event) {
// Make sure that we've run ~X11DragContext() before creating another one.
ResetDragContext();
- auto* source_client = GetForWindow(event.data.l[0]);
+ auto* source_client =
+ GetForWindow(static_cast<x11::Window>(event.data.data32[0]));
DCHECK(!source_client || source_client->source_provider_);
target_current_context_ = std::make_unique<XDragContext>(
xwindow_, event, source_client,
@@ -313,7 +316,8 @@ void XDragDropClient::OnXdndEnter(const XClientMessageEvent& event) {
if (!target_current_context()->source_client()) {
// The window doesn't have a DesktopDragDropClientAuraX11, which means it's
// created by some other process. Listen for messages on it.
- delegate_->OnBeginForeignDrag(event.data.l[0]);
+ delegate_->OnBeginForeignDrag(
+ static_cast<x11::Window>(event.data.data32[0]));
}
// In the Windows implementation, we immediately call DesktopDropTargetWin::
@@ -322,14 +326,14 @@ void XDragDropClient::OnXdndEnter(const XClientMessageEvent& event) {
// XdndStatus message.
}
-void XDragDropClient::OnXdndPosition(const XClientMessageEvent& event) {
+void XDragDropClient::OnXdndPosition(const x11::ClientMessageEvent& event) {
DVLOG(1) << "OnXdndPosition";
- XID source_window = event.data.l[0];
- int x_root_window = event.data.l[2] >> 16;
- int y_root_window = event.data.l[2] & 0xffff;
- Time time_stamp = event.data.l[3];
- Atom suggested_action = event.data.l[4];
+ auto source_window = static_cast<x11::Window>(event.data.data32[0]);
+ int x_root_window = event.data.data32[2] >> 16;
+ int y_root_window = event.data.data32[2] & 0xffff;
+ x11::Time time_stamp = static_cast<x11::Time>(event.data.data32[3]);
+ x11::Atom suggested_action = static_cast<x11::Atom>(event.data.data32[4]);
if (!target_current_context()) {
NOTREACHED();
@@ -341,12 +345,12 @@ void XDragDropClient::OnXdndPosition(const XClientMessageEvent& event) {
gfx::Point(x_root_window, y_root_window));
}
-void XDragDropClient::OnXdndStatus(const XClientMessageEvent& event) {
+void XDragDropClient::OnXdndStatus(const x11::ClientMessageEvent& event) {
DVLOG(1) << "OnXdndStatus";
- XID source_window = event.data.l[0];
+ auto source_window = static_cast<x11::Window>(event.data.data32[0]);
- if (source_window != source_current_window_)
+ if (source_window != target_current_window_)
return;
if (source_state_ != SourceState::kPendingDrop &&
@@ -357,9 +361,9 @@ void XDragDropClient::OnXdndStatus(const XClientMessageEvent& event) {
waiting_on_status_ = false;
status_received_since_enter_ = true;
- if (event.data.l[1] & 1) {
- Atom atom_operation = event.data.l[4];
- negotiated_operation_ = XAtomToDragOperation(atom_operation);
+ if (event.data.data32[1] & 1) {
+ x11::Atom atom_operation = static_cast<x11::Atom>(event.data.data32[4]);
+ negotiated_operation_ = AtomToDragOperation(atom_operation);
} else {
negotiated_operation_ = DragDropTypes::DRAG_NONE;
}
@@ -394,53 +398,55 @@ void XDragDropClient::OnXdndStatus(const XClientMessageEvent& event) {
}
}
-void XDragDropClient::OnXdndLeave(const XClientMessageEvent& event) {
+void XDragDropClient::OnXdndLeave(const x11::ClientMessageEvent& event) {
DVLOG(1) << "OnXdndLeave";
delegate_->OnBeforeDragLeave();
ResetDragContext();
}
-void XDragDropClient::OnXdndDrop(const XClientMessageEvent& event) {
+void XDragDropClient::OnXdndDrop(const x11::ClientMessageEvent& event) {
DVLOG(1) << "OnXdndDrop";
- XID source_window = event.data.l[0];
+ auto source_window = static_cast<x11::Window>(event.data.data32[0]);
int drag_operation = delegate_->PerformDrop();
- XEvent xev = PrepareXdndClientMessage(kXdndFinished, source_window);
- xev.xclient.data.l[1] = (drag_operation != 0) ? 1 : 0;
- xev.xclient.data.l[2] = XDragOperationToAtom(drag_operation);
- SendXClientEvent(source_window, &xev);
+ auto xev = PrepareXdndClientMessage(kXdndFinished, source_window);
+ xev.data.data32[1] = (drag_operation != 0) ? 1 : 0;
+ xev.data.data32[2] =
+ static_cast<uint32_t>(XDragOperationToAtom(drag_operation));
+ SendXClientEvent(source_window, xev);
}
-void XDragDropClient::OnXdndFinished(const XClientMessageEvent& event) {
+void XDragDropClient::OnXdndFinished(const x11::ClientMessageEvent& event) {
DVLOG(1) << "OnXdndFinished";
- XID source_window = event.data.l[0];
- if (source_current_window_ != source_window)
+ auto source_window = static_cast<x11::Window>(event.data.data32[0]);
+ if (target_current_window_ != source_window)
return;
// Clear |negotiated_operation_| if the drag was rejected.
- if ((event.data.l[1] & 1) == 0)
+ if ((event.data.data32[1] & 1) == 0)
negotiated_operation_ = DragDropTypes::DRAG_NONE;
- // Clear |source_current_window_| to avoid sending XdndLeave upon ending the
+ // Clear |target_current_window_| to avoid sending XdndLeave upon ending the
// move loop.
- source_current_window_ = x11::None;
+ target_current_window_ = x11::Window::None;
EndMoveLoop();
}
-void XDragDropClient::OnSelectionNotify(const XSelectionEvent& xselection) {
+void XDragDropClient::OnSelectionNotify(
+ const x11::SelectionNotifyEvent& xselection) {
DVLOG(1) << "OnSelectionNotify";
if (target_current_context_)
target_current_context_->OnSelectionNotify(xselection);
// ICCCM requires us to delete the property passed into SelectionNotify.
- if (xselection.property != x11::None)
- XDeleteProperty(xdisplay_, xwindow_, xselection.property);
+ if (xselection.property != x11::Atom::None)
+ ui::DeleteProperty(xwindow_, xselection.property);
}
void XDragDropClient::InitDrag(int operation, const OSExchangeData* data) {
- source_current_window_ = x11::None;
+ target_current_window_ = x11::Window::None;
source_state_ = SourceState::kOther;
waiting_on_status_ = false;
next_position_message_.reset();
@@ -452,7 +458,7 @@ void XDragDropClient::InitDrag(int operation, const OSExchangeData* data) {
static_cast<const XOSExchangeDataProvider*>(&data->provider());
source_provider_->TakeOwnershipOfSelection();
- std::vector<Atom> actions = GetOfferedDragOperations();
+ std::vector<x11::Atom> actions = GetOfferedDragOperations();
if (!source_provider_->file_contents_name().empty()) {
actions.push_back(gfx::GetAtom(kXdndActionDirectSave));
SetStringProperty(xwindow_, gfx::GetAtom(kXdndDirectSave0),
@@ -464,8 +470,8 @@ void XDragDropClient::InitDrag(int operation, const OSExchangeData* data) {
void XDragDropClient::CleanupDrag() {
source_provider_ = nullptr;
- XDeleteProperty(xdisplay_, xwindow_, gfx::GetAtom(kXdndActionList));
- XDeleteProperty(xdisplay_, xwindow_, gfx::GetAtom(kXdndDirectSave0));
+ ui::DeleteProperty(xwindow_, gfx::GetAtom(kXdndActionList));
+ ui::DeleteProperty(xwindow_, gfx::GetAtom(kXdndDirectSave0));
}
void XDragDropClient::UpdateModifierState(int flags) {
@@ -516,7 +522,7 @@ void XDragDropClient::HandleMouseReleased() {
return;
}
- if (source_current_window_ != x11::None) {
+ if (target_current_window_ != x11::Window::None) {
if (waiting_on_status_) {
if (status_received_since_enter_) {
// If we are waiting for an XdndStatus message, we need to wait for it
@@ -543,8 +549,12 @@ void XDragDropClient::HandleMouseReleased() {
// We have negotiated an action with the other end.
source_state_ = SourceState::kDropped;
- SendXdndDrop(source_current_window_);
+ SendXdndDrop(target_current_window_);
return;
+ } else {
+ // No transfer is negotiated. We need to tell the target window that we
+ // are leaving.
+ SendXdndLeave(target_current_window_);
}
}
@@ -552,36 +562,33 @@ void XDragDropClient::HandleMouseReleased() {
}
void XDragDropClient::HandleMoveLoopEnded() {
- if (source_current_window_ != x11::None) {
- SendXdndLeave(source_current_window_);
- source_current_window_ = x11::None;
+ if (target_current_window_ != x11::Window::None) {
+ SendXdndLeave(target_current_window_);
+ target_current_window_ = x11::Window::None;
}
ResetDragContext();
StopRepeatMouseMoveTimer();
StopEndMoveLoopTimer();
}
-XEvent XDragDropClient::PrepareXdndClientMessage(const char* message,
- XID recipient) const {
- XEvent xev;
- xev.xclient.type = ClientMessage;
- xev.xclient.message_type = gfx::GetAtom(message);
- xev.xclient.format = 32;
- xev.xclient.window = recipient;
- xev.xclient.data.l[0] = xwindow_;
- xev.xclient.data.l[1] = 0;
- xev.xclient.data.l[2] = 0;
- xev.xclient.data.l[3] = 0;
- xev.xclient.data.l[4] = 0;
+x11::ClientMessageEvent XDragDropClient::PrepareXdndClientMessage(
+ const char* message,
+ x11::Window recipient) const {
+ x11::ClientMessageEvent xev;
+ xev.type = gfx::GetAtom(message);
+ xev.window = recipient;
+ xev.format = 32;
+ xev.data.data32.fill(0);
+ xev.data.data32[0] = static_cast<uint32_t>(xwindow_);
return xev;
}
-XID XDragDropClient::FindWindowFor(const gfx::Point& screen_point) {
+x11::Window XDragDropClient::FindWindowFor(const gfx::Point& screen_point) {
auto finder = delegate_->CreateWindowFinder();
- XID target = finder->FindWindowAt(screen_point);
+ x11::Window target = finder->FindWindowAt(screen_point);
- if (target == x11::None)
- return x11::None;
+ if (target == x11::Window::None)
+ return x11::Window::None;
// TODO(crbug/651775): The proxy window should be reported separately from the
// target window. XDND messages should be sent to the proxy, and their
@@ -590,22 +597,21 @@ XID XDragDropClient::FindWindowFor(const gfx::Point& screen_point) {
// Figure out which window we should test as XdndAware. If |target| has
// XdndProxy, it will set that proxy on target, and if not, |target|'s
// original value will remain.
- GetXIDProperty(target, kXdndProxy, &target);
+ GetProperty(target, gfx::GetAtom(kXdndProxy), &target);
int version;
if (GetIntProperty(target, kXdndAware, &version) &&
version >= kMaxXdndVersion) {
return target;
}
- return x11::None;
+ return x11::Window::None;
}
-void XDragDropClient::SendXClientEvent(XID xid, XEvent* xev) {
- DCHECK_EQ(ClientMessage, xev->type);
-
+void XDragDropClient::SendXClientEvent(x11::Window window,
+ const x11::ClientMessageEvent& xev) {
// Don't send messages to the X11 message queue if we can help it.
- XDragDropClient* short_circuit = GetForWindow(xid);
- if (short_circuit && short_circuit->HandleXdndEvent(xev->xclient))
+ XDragDropClient* short_circuit = GetForWindow(window);
+ if (short_circuit && short_circuit->HandleXdndEvent(xev))
return;
// I don't understand why the GTK+ code is doing what it's doing here. It
@@ -617,36 +623,37 @@ void XDragDropClient::SendXClientEvent(XID xid, XEvent* xev) {
//
// I'm unsure if I have to jump through those hoops, or if XSendEvent is
// sufficient.
- XSendEvent(xdisplay_, xid, x11::False, 0, xev);
+ ui::SendEvent(xev, window, x11::EventMask::NoEvent);
}
-void XDragDropClient::SendXdndEnter(XID dest_window,
- const std::vector<Atom>& targets) {
- XEvent xev = PrepareXdndClientMessage(kXdndEnter, dest_window);
- xev.xclient.data.l[1] = (kMaxXdndVersion << 24); // The version number.
+void XDragDropClient::SendXdndEnter(x11::Window dest_window,
+ const std::vector<x11::Atom>& targets) {
+ auto xev = PrepareXdndClientMessage(kXdndEnter, dest_window);
+ xev.data.data32[1] = (kMaxXdndVersion << 24); // The version number.
if (targets.size() > 3) {
- xev.xclient.data.l[1] |= 1;
+ xev.data.data32[1] |= 1;
SetAtomArrayProperty(xwindow(), kXdndTypeList, "ATOM", targets);
} else {
// Pack the targets into the enter message.
for (size_t i = 0; i < targets.size(); ++i)
- xev.xclient.data.l[2 + i] = targets[i];
+ xev.data.data32[2 + i] = static_cast<uint32_t>(targets[i]);
}
- SendXClientEvent(dest_window, &xev);
+ SendXClientEvent(dest_window, xev);
}
-void XDragDropClient::SendXdndPosition(XID dest_window,
+void XDragDropClient::SendXdndPosition(x11::Window dest_window,
const gfx::Point& screen_point,
unsigned long event_time) {
waiting_on_status_ = true;
- XEvent xev = PrepareXdndClientMessage(kXdndPosition, dest_window);
- xev.xclient.data.l[2] = (screen_point.x() << 16) | screen_point.y();
- xev.xclient.data.l[3] = event_time;
- xev.xclient.data.l[4] = XDragOperationToAtom(drag_operation_);
- SendXClientEvent(dest_window, &xev);
+ auto xev = PrepareXdndClientMessage(kXdndPosition, dest_window);
+ xev.data.data32[2] = (screen_point.x() << 16) | screen_point.y();
+ xev.data.data32[3] = event_time;
+ xev.data.data32[4] =
+ static_cast<uint32_t>(XDragOperationToAtom(drag_operation_));
+ SendXClientEvent(dest_window, xev);
// http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html and
// the Xdnd protocol both recommend that drag events should be sent
@@ -657,20 +664,20 @@ void XDragDropClient::SendXdndPosition(XID dest_window,
screen_point, event_time));
}
-void XDragDropClient::SendXdndLeave(XID dest_window) {
- XEvent xev = PrepareXdndClientMessage(kXdndLeave, dest_window);
- SendXClientEvent(dest_window, &xev);
+void XDragDropClient::SendXdndLeave(x11::Window dest_window) {
+ auto xev = PrepareXdndClientMessage(kXdndLeave, dest_window);
+ SendXClientEvent(dest_window, xev);
}
-void XDragDropClient::SendXdndDrop(XID dest_window) {
- XEvent xev = PrepareXdndClientMessage(kXdndDrop, dest_window);
- xev.xclient.data.l[2] = x11::CurrentTime;
- SendXClientEvent(dest_window, &xev);
+void XDragDropClient::SendXdndDrop(x11::Window dest_window) {
+ auto xev = PrepareXdndClientMessage(kXdndDrop, dest_window);
+ xev.data.data32[2] = x11::CurrentTime;
+ SendXClientEvent(dest_window, xev);
}
void XDragDropClient::EndMoveLoop() {
StopEndMoveLoopTimer();
- delegate_->EndMoveLoop();
+ delegate_->EndDragLoop();
}
} // 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 9a0df14cf71..1d7e6a32caf 100644
--- a/chromium/ui/base/x/x11_drag_drop_client.h
+++ b/chromium/ui/base/x/x11_drag_drop_client.h
@@ -15,6 +15,7 @@
#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 {
@@ -49,7 +50,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XDragDropClient {
DragDropTypes::DragOperation negotiated_operation) = 0;
// Called when data from another application enters the window.
- virtual void OnBeginForeignDrag(XID window) = 0;
+ virtual void OnBeginForeignDrag(x11::Window window) = 0;
// Called when data from another application is about to leave the window.
virtual void OnEndForeignDrag() = 0;
@@ -60,19 +61,19 @@ class COMPONENT_EXPORT(UI_BASE_X) XDragDropClient {
// Drops data at the current location and returns the resulting operation.
virtual int PerformDrop() = 0;
- // Called to end the move loop that is maintained by the subclass.
- virtual void EndMoveLoop() = 0;
+ // Called to end the drag loop that is maintained by the subclass.
+ virtual void EndDragLoop() = 0;
protected:
virtual ~Delegate() = default;
};
- XDragDropClient(Delegate* delegate, Display* xdisplay, XID xwindow);
+ XDragDropClient(Delegate* delegate, x11::Window xwindow);
virtual ~XDragDropClient();
XDragDropClient(const XDragDropClient&) = delete;
XDragDropClient& operator=(const XDragDropClient&) = delete;
- XID xwindow() const { return xwindow_; }
+ x11::Window xwindow() const { return xwindow_; }
XDragContext* target_current_context() {
return target_current_context_.get();
}
@@ -84,7 +85,8 @@ class COMPONENT_EXPORT(UI_BASE_X) XDragDropClient {
// Handling XdndPosition can be paused while waiting for more data; this is
// called either synchronously from OnXdndPosition, or asynchronously after
// we've received data requested from the other window.
- void CompleteXdndPosition(XID source_window, const gfx::Point& screen_point);
+ void CompleteXdndPosition(x11::Window source_window,
+ const gfx::Point& screen_point);
void ProcessMouseMove(const gfx::Point& screen_point,
unsigned long event_time);
@@ -92,12 +94,12 @@ class COMPONENT_EXPORT(UI_BASE_X) XDragDropClient {
// During the blocking StartDragAndDrop() call, this converts the views-style
// |drag_operation_| bitfield into a vector of Atoms to offer to other
// processes.
- std::vector<Atom> GetOfferedDragOperations() const;
+ std::vector<x11::Atom> GetOfferedDragOperations() const;
// Tries to handle the XDND event. Returns true for all known event types:
// XdndEnter, XdndLeave, XdndPosition, XdndStatus, XdndDrop, and XdndFinished;
// returns false if an event of an unexpected type has been passed.
- bool HandleXdndEvent(const XClientMessageEvent& event);
+ bool HandleXdndEvent(const x11::ClientMessageEvent& event);
// These |Handle...| methods essentially implement the
// views::X11MoveLoopDelegate interface.
@@ -108,7 +110,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XDragDropClient {
void HandleMoveLoopEnded();
// Called when XSelection data has been copied to our process.
- void OnSelectionNotify(const XSelectionEvent& xselection);
+ void OnSelectionNotify(const x11::SelectionNotifyEvent& xselection);
// Resets the drag state so the object is ready to handle the drag. Sets
// X window properties so that the desktop environment is aware of available
@@ -156,53 +158,54 @@ class COMPONENT_EXPORT(UI_BASE_X) XDragDropClient {
private:
// These methods handle the various X11 client messages from the platform.
- void OnXdndEnter(const XClientMessageEvent& event);
- void OnXdndPosition(const XClientMessageEvent& event);
- void OnXdndStatus(const XClientMessageEvent& event);
- void OnXdndLeave(const XClientMessageEvent& event);
- void OnXdndDrop(const XClientMessageEvent& event);
- void OnXdndFinished(const XClientMessageEvent& event);
+ void OnXdndEnter(const x11::ClientMessageEvent& event);
+ void OnXdndPosition(const x11::ClientMessageEvent& event);
+ void OnXdndStatus(const x11::ClientMessageEvent& event);
+ void OnXdndLeave(const x11::ClientMessageEvent& event);
+ void OnXdndDrop(const x11::ClientMessageEvent& event);
+ void OnXdndFinished(const x11::ClientMessageEvent& event);
// Creates an XEvent and fills it in with values typical for XDND messages:
// the type of event is set to ClientMessage, the format is set to 32 (longs),
// and the zero member of data payload is set to |xwindow_|. All other data
// members are zeroed, as per XDND specification.
- XEvent PrepareXdndClientMessage(const char* message, XID recipient) const;
+ x11::ClientMessageEvent PrepareXdndClientMessage(const char* message,
+ x11::Window recipient) const;
// Finds the topmost X11 window at |screen_point| and returns it if it is
// Xdnd aware. Returns x11::None otherwise.
// Virtual for testing.
- virtual XID FindWindowFor(const gfx::Point& screen_point);
+ virtual x11::Window FindWindowFor(const gfx::Point& screen_point);
- // Sends |xev| to |xid|, optionally short circuiting the round trip to the X
- // server.
- // Virtual for testing.
- virtual void SendXClientEvent(XID xid, XEvent* xev);
+ // Sends |xev| to |window|, optionally short circuiting the round trip to the
+ // X server. Virtual for testing.
+ virtual void SendXClientEvent(x11::Window window,
+ const x11::ClientMessageEvent& xev);
- void SendXdndEnter(XID dest_window, const std::vector<Atom>& targets);
- void SendXdndPosition(XID dest_window,
+ void SendXdndEnter(x11::Window dest_window,
+ const std::vector<x11::Atom>& targets);
+ void SendXdndPosition(x11::Window dest_window,
const gfx::Point& screen_point,
unsigned long event_time);
- void SendXdndLeave(XID dest_window);
- void SendXdndDrop(XID dest_window);
+ void SendXdndLeave(x11::Window dest_window);
+ void SendXdndDrop(x11::Window dest_window);
// We maintain a mapping of live XDragDropClient objects to their X11 windows,
// so that we'd able to short circuit sending X11 messages to windows in our
// process.
- static XDragDropClient* GetForWindow(XID window);
+ static XDragDropClient* GetForWindow(x11::Window window);
void EndMoveLoop();
Delegate* const delegate_;
- Display* const xdisplay_;
- const XID xwindow_;
+ const x11::Window xwindow_;
// Target side information.
+ x11::Window target_current_window_ = x11::Window::None;
std::unique_ptr<XDragContext> target_current_context_;
// Source side information.
- XID source_current_window_ = x11::None;
SourceState source_state_ = SourceState::kOther;
const XOSExchangeDataProvider* source_provider_ = nullptr;
diff --git a/chromium/ui/base/x/x11_error_handler.cc b/chromium/ui/base/x/x11_error_handler.cc
new file mode 100644
index 00000000000..d1babb0bcbd
--- /dev/null
+++ b/chromium/ui/base/x/x11_error_handler.cc
@@ -0,0 +1,104 @@
+// 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/message_loop/message_loop_current.h"
+#include "base/sequenced_task_runner.h"
+#include "base/threading/sequenced_task_runner_handle.h"
+#include "ui/base/x/x11_util.h"
+#include "ui/base/x/x11_util_internal.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));
+ }
+ 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::MessageLoopCurrentForUI::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
new file mode 100644
index 00000000000..49011beb3d8
--- /dev/null
+++ b/chromium/ui/base/x/x11_error_handler.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_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 2a7fd03779f..197f8e4c553 100644
--- a/chromium/ui/base/x/x11_gl_egl_utility.cc
+++ b/chromium/ui/base/x/x11_gl_egl_utility.cc
@@ -25,11 +25,11 @@ void GetPlatformExtraDisplayAttribs(EGLenum platform_type,
// ANGLE_NULL doesn't use the visual, and may run without X11 where we can't
// get it anyway.
if (platform_type != EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE) {
- Visual* visual;
- ui::XVisualManager::GetInstance()->ChooseVisualForWindow(
- true, &visual, nullptr, nullptr, nullptr);
+ x11::VisualId visual_id;
+ ui::XVisualManager::GetInstance()->ChooseVisualForWindow(true, &visual_id,
+ nullptr, nullptr);
attributes->push_back(EGL_X11_VISUAL_ID_ANGLE);
- attributes->push_back(static_cast<EGLAttrib>(XVisualIDFromVisual(visual)));
+ attributes->push_back(static_cast<EGLAttrib>(visual_id));
}
}
@@ -38,8 +38,10 @@ void ChoosePlatformCustomAlphaAndBufferSize(EGLint* alpha_size,
// If we're using ANGLE_NULL, we may not have a display, in which case we
// can't use XVisualManager.
if (gl::GLSurfaceEGL::GetNativeDisplay() != EGL_DEFAULT_DISPLAY) {
- ui::XVisualManager::GetInstance()->ChooseVisualForWindow(
- true, nullptr, buffer_size, nullptr, nullptr);
+ uint8_t depth;
+ ui::XVisualManager::GetInstance()->ChooseVisualForWindow(true, nullptr,
+ &depth, nullptr);
+ *buffer_size = depth;
*alpha_size = *buffer_size == 32 ? 8 : 0;
}
}
diff --git a/chromium/ui/base/x/x11_menu_list.cc b/chromium/ui/base/x/x11_menu_list.cc
index 83a5522437b..5cea1a41421 100644
--- a/chromium/ui/base/x/x11_menu_list.cc
+++ b/chromium/ui/base/x/x11_menu_list.cc
@@ -24,23 +24,23 @@ XMenuList::~XMenuList() {
menus_.clear();
}
-void XMenuList::MaybeRegisterMenu(XID menu) {
+void XMenuList::MaybeRegisterMenu(x11::Window menu) {
int value = 0;
if (!GetIntProperty(menu, "_NET_WM_WINDOW_TYPE", &value) ||
- static_cast<XAtom>(value) != menu_type_atom_) {
+ static_cast<x11::Atom>(value) != menu_type_atom_) {
return;
}
menus_.push_back(menu);
}
-void XMenuList::MaybeUnregisterMenu(XID menu) {
+void XMenuList::MaybeUnregisterMenu(x11::Window menu) {
auto iter = std::find(menus_.begin(), menus_.end(), menu);
if (iter == menus_.end())
return;
menus_.erase(iter);
}
-void XMenuList::InsertMenuWindowXIDs(std::vector<XID>* stack) {
+void XMenuList::InsertMenuWindows(std::vector<x11::Window>* stack) {
stack->insert(stack->begin(), menus_.begin(), menus_.end());
}
diff --git a/chromium/ui/base/x/x11_menu_list.h b/chromium/ui/base/x/x11_menu_list.h
index f4882b8dcb0..8f45b83e50d 100644
--- a/chromium/ui/base/x/x11_menu_list.h
+++ b/chromium/ui/base/x/x11_menu_list.h
@@ -13,7 +13,8 @@
// A process wide singleton cache for X menus.
namespace base {
-template <typename T> struct DefaultSingletonTraits;
+template <typename T>
+struct DefaultSingletonTraits;
}
namespace ui {
@@ -25,21 +26,21 @@ class COMPONENT_EXPORT(UI_BASE_X) XMenuList {
// Checks if |menu| has _NET_WM_WINDOW_TYPE property set to
// "_NET_WM_WINDOW_TYPE_MENU" atom and if so caches it.
- void MaybeRegisterMenu(XID menu);
+ void MaybeRegisterMenu(x11::Window menu);
// Finds |menu| in cache and if found removes it.
- void MaybeUnregisterMenu(XID menu);
+ void MaybeUnregisterMenu(x11::Window menu);
- // Inserts cached menu XIDs at the beginning of |stack|.
- void InsertMenuWindowXIDs(std::vector<XID>* stack);
+ // Inserts cached menu x11::Windows at the beginning of |stack|.
+ void InsertMenuWindows(std::vector<x11::Window>* stack);
private:
friend struct base::DefaultSingletonTraits<XMenuList>;
XMenuList();
~XMenuList();
- std::vector<XID> menus_;
- XAtom menu_type_atom_;
+ std::vector<x11::Window> menus_;
+ x11::Atom menu_type_atom_;
DISALLOW_COPY_AND_ASSIGN(XMenuList);
};
diff --git a/chromium/ui/base/x/x11_menu_registrar.cc b/chromium/ui/base/x/x11_menu_registrar.cc
index 2d1d23ff714..2264b4b465b 100644
--- a/chromium/ui/base/x/x11_menu_registrar.cc
+++ b/chromium/ui/base/x/x11_menu_registrar.cc
@@ -32,8 +32,7 @@ X11MenuRegistrar* X11MenuRegistrar::Get() {
}
X11MenuRegistrar::X11MenuRegistrar()
- : xdisplay_(gfx::GetXDisplay()),
- x_root_window_(DefaultRootWindow(xdisplay_)) {
+ : xdisplay_(gfx::GetXDisplay()), x_root_window_(ui::GetX11RootWindow()) {
if (ui::X11EventSource::HasInstance())
ui::X11EventSource::GetInstance()->AddXEventDispatcher(this);
@@ -46,16 +45,19 @@ X11MenuRegistrar::~X11MenuRegistrar() {
ui::X11EventSource::GetInstance()->RemoveXEventDispatcher(this);
}
-bool X11MenuRegistrar::DispatchXEvent(XEvent* event) {
+bool X11MenuRegistrar::DispatchXEvent(x11::Event* x11_event) {
+ XEvent* event = &x11_event->xlib_event();
if (event->type != CreateNotify && event->type != DestroyNotify) {
return false;
}
switch (event->type) {
case CreateNotify:
- OnWindowCreatedOrDestroyed(event->type, event->xcreatewindow.window);
+ OnWindowCreatedOrDestroyed(
+ event->type, x11_event->As<x11::CreateNotifyEvent>()->window);
break;
case DestroyNotify:
- OnWindowCreatedOrDestroyed(event->type, event->xdestroywindow.window);
+ OnWindowCreatedOrDestroyed(
+ event->type, x11_event->As<x11::DestroyNotifyEvent>()->window);
break;
default:
NOTREACHED();
@@ -63,7 +65,8 @@ bool X11MenuRegistrar::DispatchXEvent(XEvent* event) {
return false;
}
-void X11MenuRegistrar::OnWindowCreatedOrDestroyed(int event_type, XID window) {
+void X11MenuRegistrar::OnWindowCreatedOrDestroyed(int event_type,
+ x11::Window window) {
// Menus created by Chrome can be drag and drop targets. Since they are
// direct children of the screen root window and have override_redirect
// we cannot use regular _NET_CLIENT_LIST_STACKING property to find them
diff --git a/chromium/ui/base/x/x11_menu_registrar.h b/chromium/ui/base/x/x11_menu_registrar.h
index b3a30a24167..0fe0a83e727 100644
--- a/chromium/ui/base/x/x11_menu_registrar.h
+++ b/chromium/ui/base/x/x11_menu_registrar.h
@@ -12,6 +12,7 @@
#include <vector>
#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"
@@ -29,7 +30,7 @@ class X11MenuRegistrar : public ui::XEventDispatcher {
static X11MenuRegistrar* Get();
// ui::XEventDispatcher
- bool DispatchXEvent(XEvent* event) override;
+ bool DispatchXEvent(x11::Event* event) override;
private:
X11MenuRegistrar();
@@ -37,13 +38,13 @@ class X11MenuRegistrar : public ui::XEventDispatcher {
// Called when |window| has been created or destroyed. |window| may not be
// managed by Chrome.
- void OnWindowCreatedOrDestroyed(int event_type, XID window);
+ void OnWindowCreatedOrDestroyed(int event_type, x11::Window window);
// The display and the native X window hosting the root window.
XDisplay* xdisplay_;
// The native root window.
- ::Window x_root_window_;
+ x11::Window x_root_window_;
// Events selected on |x_root_window_|.
std::unique_ptr<ui::XScopedEventSelector> x_root_window_events_;
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 88a24bab57b..5a38c3f841b 100644
--- a/chromium/ui/base/x/x11_os_exchange_data_provider.cc
+++ b/chromium/ui/base/x/x11_os_exchange_data_provider.cc
@@ -15,6 +15,7 @@
#include "ui/base/clipboard/clipboard_format_type.h"
#include "ui/base/dragdrop/file_info/file_info.h"
#include "ui/base/x/selection_utils.h"
+#include "ui/base/x/x11_util.h"
#include "ui/gfx/x/x11_atom_cache.h"
// Note: the GetBlah() methods are used immediately by the
@@ -34,38 +35,25 @@ const char kNetscapeURL[] = "_NETSCAPE_URL";
} // namespace
XOSExchangeDataProvider::XOSExchangeDataProvider(
- XID x_window,
+ x11::Window x_window,
const SelectionFormatMap& selection)
- : x_display_(gfx::GetXDisplay()),
- x_root_window_(DefaultRootWindow(x_display_)),
+ : connection_(x11::Connection::Get()),
+ x_root_window_(ui::GetX11RootWindow()),
own_window_(false),
x_window_(x_window),
format_map_(selection),
- selection_owner_(x_display_, x_window_, gfx::GetAtom(kDndSelection)) {}
+ selection_owner_(connection_, x_window_, gfx::GetAtom(kDndSelection)) {}
XOSExchangeDataProvider::XOSExchangeDataProvider()
- : x_display_(gfx::GetXDisplay()),
- x_root_window_(DefaultRootWindow(x_display_)),
+ : connection_(x11::Connection::Get()),
+ x_root_window_(ui::GetX11RootWindow()),
own_window_(true),
- x_window_(XCreateWindow(x_display_,
- x_root_window_,
- -100, // x
- -100, // y
- 10, // width
- 10, // height
- 0, // border width
- CopyFromParent, // depth
- InputOnly,
- CopyFromParent, // visual
- 0,
- nullptr)),
- selection_owner_(x_display_, x_window_, gfx::GetAtom(kDndSelection)) {
- XStoreName(x_display_, x_window_, "Chromium Drag & Drop Window");
-}
+ x_window_(CreateDummyWindow("Chromium Drag & Drop Window")),
+ selection_owner_(connection_, x_window_, gfx::GetAtom(kDndSelection)) {}
XOSExchangeDataProvider::~XOSExchangeDataProvider() {
if (own_window_)
- XDestroyWindow(x_display_, x_window_);
+ connection_->DestroyWindow({x_window_});
}
void XOSExchangeDataProvider::TakeOwnershipOfSelection() const {
@@ -73,7 +61,7 @@ void XOSExchangeDataProvider::TakeOwnershipOfSelection() const {
}
void XOSExchangeDataProvider::RetrieveTargets(
- std::vector<Atom>* targets) const {
+ std::vector<x11::Atom>* targets) const {
selection_owner_.RetrieveTargets(targets);
}
@@ -159,7 +147,7 @@ void XOSExchangeDataProvider::SetURL(const GURL& url,
void XOSExchangeDataProvider::SetFilename(const base::FilePath& path) {
std::vector<FileInfo> data;
- data.push_back(FileInfo(path, base::FilePath()));
+ data.emplace_back(path, base::FilePath());
SetFilenames(data);
}
@@ -199,8 +187,8 @@ bool XOSExchangeDataProvider::GetString(base::string16* result) const {
return false;
}
- std::vector<Atom> text_atoms = ui::GetTextAtomsFrom();
- std::vector<Atom> requested_types;
+ std::vector<x11::Atom> text_atoms = ui::GetTextAtomsFrom();
+ std::vector<x11::Atom> requested_types;
GetAtomIntersection(text_atoms, GetTargets(), &requested_types);
ui::SelectionData data(format_map_.GetFirstOf(requested_types));
@@ -216,8 +204,8 @@ bool XOSExchangeDataProvider::GetString(base::string16* result) const {
bool XOSExchangeDataProvider::GetURLAndTitle(FilenameToURLPolicy policy,
GURL* url,
base::string16* title) const {
- std::vector<Atom> url_atoms = ui::GetURLAtomsFrom();
- std::vector<Atom> requested_types;
+ std::vector<x11::Atom> url_atoms = ui::GetURLAtomsFrom();
+ std::vector<x11::Atom> requested_types;
GetAtomIntersection(url_atoms, GetTargets(), &requested_types);
ui::SelectionData data(format_map_.GetFirstOf(requested_types));
@@ -247,7 +235,8 @@ bool XOSExchangeDataProvider::GetURLAndTitle(FilenameToURLPolicy policy,
std::vector<std::string> tokens = ui::ParseURIList(data);
for (const std::string& token : tokens) {
GURL test_url(token);
- if (!test_url.SchemeIsFile() || policy == CONVERT_FILENAMES) {
+ if (!test_url.SchemeIsFile() ||
+ policy == FilenameToURLPolicy::CONVERT_FILENAMES) {
*url = test_url;
*title = base::string16();
return true;
@@ -271,8 +260,8 @@ bool XOSExchangeDataProvider::GetFilename(base::FilePath* path) const {
bool XOSExchangeDataProvider::GetFilenames(
std::vector<FileInfo>* filenames) const {
- std::vector<Atom> url_atoms = ui::GetURIListAtomsFrom();
- std::vector<Atom> requested_types;
+ std::vector<x11::Atom> url_atoms = ui::GetURIListAtomsFrom();
+ std::vector<x11::Atom> requested_types;
GetAtomIntersection(url_atoms, GetTargets(), &requested_types);
filenames->clear();
@@ -293,7 +282,7 @@ bool XOSExchangeDataProvider::GetFilenames(
bool XOSExchangeDataProvider::GetPickledData(const ClipboardFormatType& format,
base::Pickle* pickle) const {
- std::vector<Atom> requested_types;
+ std::vector<x11::Atom> requested_types;
requested_types.push_back(gfx::GetAtom(format.GetName().c_str()));
ui::SelectionData data(format_map_.GetFirstOf(requested_types));
@@ -309,15 +298,15 @@ bool XOSExchangeDataProvider::GetPickledData(const ClipboardFormatType& format,
}
bool XOSExchangeDataProvider::HasString() const {
- std::vector<Atom> text_atoms = ui::GetTextAtomsFrom();
- std::vector<Atom> requested_types;
+ std::vector<x11::Atom> text_atoms = ui::GetTextAtomsFrom();
+ std::vector<x11::Atom> requested_types;
GetAtomIntersection(text_atoms, GetTargets(), &requested_types);
return !requested_types.empty() && !HasFile();
}
bool XOSExchangeDataProvider::HasURL(FilenameToURLPolicy policy) const {
- std::vector<Atom> url_atoms = ui::GetURLAtomsFrom();
- std::vector<Atom> requested_types;
+ std::vector<x11::Atom> url_atoms = ui::GetURLAtomsFrom();
+ std::vector<x11::Atom> requested_types;
GetAtomIntersection(url_atoms, GetTargets(), &requested_types);
if (requested_types.empty())
@@ -333,7 +322,8 @@ bool XOSExchangeDataProvider::HasURL(FilenameToURLPolicy policy) const {
} else if (data.GetType() == gfx::GetAtom(ui::kMimeTypeURIList)) {
std::vector<std::string> tokens = ui::ParseURIList(data);
for (const std::string& token : tokens) {
- if (!GURL(token).SchemeIsFile() || policy == CONVERT_FILENAMES)
+ if (!GURL(token).SchemeIsFile() ||
+ policy == FilenameToURLPolicy::CONVERT_FILENAMES)
return true;
}
@@ -345,8 +335,8 @@ bool XOSExchangeDataProvider::HasURL(FilenameToURLPolicy policy) const {
}
bool XOSExchangeDataProvider::HasFile() const {
- std::vector<Atom> url_atoms = ui::GetURIListAtomsFrom();
- std::vector<Atom> requested_types;
+ std::vector<x11::Atom> url_atoms = ui::GetURIListAtomsFrom();
+ std::vector<x11::Atom> requested_types;
GetAtomIntersection(url_atoms, GetTargets(), &requested_types);
if (requested_types.empty())
@@ -371,9 +361,9 @@ bool XOSExchangeDataProvider::HasFile() const {
bool XOSExchangeDataProvider::HasCustomFormat(
const ClipboardFormatType& format) const {
- std::vector<Atom> url_atoms;
+ std::vector<x11::Atom> url_atoms;
url_atoms.push_back(gfx::GetAtom(format.GetName().c_str()));
- std::vector<Atom> requested_types;
+ std::vector<x11::Atom> requested_types;
GetAtomIntersection(url_atoms, GetTargets(), &requested_types);
return !requested_types.empty();
@@ -395,9 +385,9 @@ void XOSExchangeDataProvider::SetHtml(const base::string16& html,
bool XOSExchangeDataProvider::GetHtml(base::string16* html,
GURL* base_url) const {
- std::vector<Atom> url_atoms;
+ std::vector<x11::Atom> url_atoms;
url_atoms.push_back(gfx::GetAtom(kMimeTypeHTML));
- std::vector<Atom> requested_types;
+ std::vector<x11::Atom> requested_types;
GetAtomIntersection(url_atoms, GetTargets(), &requested_types);
ui::SelectionData data(format_map_.GetFirstOf(requested_types));
@@ -411,9 +401,9 @@ bool XOSExchangeDataProvider::GetHtml(base::string16* html,
}
bool XOSExchangeDataProvider::HasHtml() const {
- std::vector<Atom> url_atoms;
+ std::vector<x11::Atom> url_atoms;
url_atoms.push_back(gfx::GetAtom(kMimeTypeHTML));
- std::vector<Atom> requested_types;
+ std::vector<x11::Atom> requested_types;
GetAtomIntersection(url_atoms, GetTargets(), &requested_types);
return !requested_types.empty();
@@ -446,12 +436,12 @@ bool XOSExchangeDataProvider::GetPlainTextURL(GURL* url) const {
return false;
}
-std::vector<Atom> XOSExchangeDataProvider::GetTargets() const {
+std::vector<x11::Atom> XOSExchangeDataProvider::GetTargets() const {
return format_map_.GetTypes();
}
void XOSExchangeDataProvider::InsertData(
- Atom format,
+ x11::Atom format,
const scoped_refptr<base::RefCountedMemory>& data) {
format_map_.Insert(format, data);
}
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 6763eb0aea7..214bf950ba1 100644
--- a/chromium/ui/base/x/x11_os_exchange_data_provider.h
+++ b/chromium/ui/base/x/x11_os_exchange_data_provider.h
@@ -33,7 +33,8 @@ class COMPONENT_EXPORT(UI_BASE_X) XOSExchangeDataProvider
public:
// |x_window| is the window the cursor is over, and |selection| is the set of
// data being offered.
- XOSExchangeDataProvider(XID x_window, const SelectionFormatMap& selection);
+ XOSExchangeDataProvider(x11::Window x_window,
+ const SelectionFormatMap& selection);
// Creates a Provider for sending drag information. This creates its own,
// hidden X11 window to own send data.
@@ -50,7 +51,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XOSExchangeDataProvider
// Retrieves a list of types we're offering. Noop if we haven't taken the
// selection.
- void RetrieveTargets(std::vector<Atom>* targets) const;
+ void RetrieveTargets(std::vector<x11::Atom>* targets) const;
// Makes a copy of the format map currently being offered.
SelectionFormatMap GetFormatMap() const;
@@ -97,7 +98,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XOSExchangeDataProvider
using PickleData = std::map<ClipboardFormatType, base::Pickle>;
bool own_window() const { return own_window_; }
- XID x_window() const { return x_window_; }
+ x11::Window x_window() const { return x_window_; }
const SelectionFormatMap& format_map() const { return format_map_; }
void set_format_map(const SelectionFormatMap& format_map) {
format_map_ = format_map;
@@ -112,10 +113,10 @@ class COMPONENT_EXPORT(UI_BASE_X) XOSExchangeDataProvider
bool GetPlainTextURL(GURL* url) const;
// Returns the targets in |format_map_|.
- std::vector<Atom> GetTargets() const;
+ std::vector<x11::Atom> GetTargets() const;
// Inserts data into the format map.
- void InsertData(Atom format,
+ void InsertData(x11::Atom format,
const scoped_refptr<base::RefCountedMemory>& data);
private:
@@ -124,8 +125,8 @@ class COMPONENT_EXPORT(UI_BASE_X) XOSExchangeDataProvider
gfx::Vector2d drag_image_offset_;
// Our X11 state.
- Display* x_display_;
- XID x_root_window_;
+ x11::Connection* connection_;
+ x11::Window x_root_window_;
// In X11, because the IPC parts of drag operations are implemented by
// XSelection, we require an x11 window to receive drag messages on. The
@@ -135,7 +136,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XOSExchangeDataProvider
// our own xwindow just to receive events on it.
const bool own_window_;
- XID x_window_;
+ x11::Window x_window_;
// A representation of data. This is either passed to us from the other
// process, or built up through a sequence of Set*() calls. It can be passed
diff --git a/chromium/ui/base/x/x11_pointer_grab.cc b/chromium/ui/base/x/x11_pointer_grab.cc
index 01c0efb666b..b7a65240c02 100644
--- a/chromium/ui/base/x/x11_pointer_grab.cc
+++ b/chromium/ui/base/x/x11_pointer_grab.cc
@@ -14,14 +14,14 @@ namespace ui {
namespace {
// The grab window. None if there are no active pointer grabs.
-XID g_grab_window = x11::None;
+x11::Window g_grab_window = x11::Window::None;
// The "owner events" parameter used to grab the pointer.
bool g_owner_events = false;
} // namespace
-int GrabPointer(XID window, bool owner_events, ::Cursor cursor) {
+int GrabPointer(x11::Window window, bool owner_events, ::Cursor cursor) {
int result = GrabInvalidTime;
if (ui::IsXInput2Available()) {
// Do an XInput2 pointer grab. If there is an active XInput2 pointer grab
@@ -42,9 +42,10 @@ int GrabPointer(XID window, bool owner_events, ::Cursor cursor) {
ui::DeviceDataManagerX11::GetInstance()->master_pointers();
for (int master_pointer : master_pointers) {
evmask.deviceid = master_pointer;
- result = XIGrabDevice(gfx::GetXDisplay(), master_pointer, window,
- x11::CurrentTime, cursor, GrabModeAsync,
- GrabModeAsync, owner_events, &evmask);
+ result =
+ XIGrabDevice(gfx::GetXDisplay(), master_pointer,
+ static_cast<uint32_t>(window), x11::CurrentTime, cursor,
+ GrabModeAsync, GrabModeAsync, owner_events, &evmask);
// Assume that the grab will succeed on either all or none of the master
// pointers.
if (result != GrabSuccess) {
@@ -56,9 +57,9 @@ int GrabPointer(XID window, bool owner_events, ::Cursor cursor) {
if (result != GrabSuccess) {
int event_mask = PointerMotionMask | ButtonReleaseMask | ButtonPressMask;
- result = XGrabPointer(gfx::GetXDisplay(), window, owner_events, event_mask,
- GrabModeAsync, GrabModeAsync, x11::None, cursor,
- x11::CurrentTime);
+ result = XGrabPointer(gfx::GetXDisplay(), static_cast<uint32_t>(window),
+ owner_events, event_mask, GrabModeAsync,
+ GrabModeAsync, x11::None, cursor, x11::CurrentTime);
}
if (result == GrabSuccess) {
@@ -69,12 +70,12 @@ int GrabPointer(XID window, bool owner_events, ::Cursor cursor) {
}
void ChangeActivePointerGrabCursor(::Cursor cursor) {
- DCHECK(g_grab_window != x11::None);
+ DCHECK(g_grab_window != x11::Window::None);
GrabPointer(g_grab_window, g_owner_events, cursor);
}
void UngrabPointer() {
- g_grab_window = x11::None;
+ g_grab_window = x11::Window::None;
if (ui::IsXInput2Available()) {
const std::vector<int>& master_pointers =
ui::DeviceDataManagerX11::GetInstance()->master_pointers();
diff --git a/chromium/ui/base/x/x11_pointer_grab.h b/chromium/ui/base/x/x11_pointer_grab.h
index 9f34e28193c..8df814098e3 100644
--- a/chromium/ui/base/x/x11_pointer_grab.h
+++ b/chromium/ui/base/x/x11_pointer_grab.h
@@ -15,7 +15,7 @@ namespace ui {
// Grabs the pointer. It is unnecessary to ungrab the pointer prior to grabbing
// it.
COMPONENT_EXPORT(UI_BASE_X)
-int GrabPointer(XID window, bool owner_events, ::Cursor cursor);
+int GrabPointer(x11::Window window, bool owner_events, ::Cursor cursor);
// Sets the cursor to use for the duration of the active pointer grab.
COMPONENT_EXPORT(UI_BASE_X) void ChangeActivePointerGrabCursor(::Cursor cursor);
diff --git a/chromium/ui/base/x/x11_shm_image_pool.cc b/chromium/ui/base/x/x11_shm_image_pool.cc
index 4719fbf261c..1824426e5bb 100644
--- a/chromium/ui/base/x/x11_shm_image_pool.cc
+++ b/chromium/ui/base/x/x11_shm_image_pool.cc
@@ -116,7 +116,7 @@ XShmImagePool::XShmImagePool(
scoped_refptr<base::SequencedTaskRunner> host_task_runner,
scoped_refptr<base::SequencedTaskRunner> event_task_runner,
XDisplay* display,
- XID drawable,
+ x11::Drawable drawable,
Visual* visual,
int depth,
std::size_t frames_pending)
@@ -163,9 +163,9 @@ bool XShmImagePool::Resize(const gfx::Size& pixel_size) {
std::size_t needed_frame_bytes;
for (std::size_t i = 0; i < frame_states_.size(); ++i) {
FrameState& state = frame_states_[i];
- state.image.reset(XShmCreateImage(display_, visual_, depth_, ZPixmap,
- nullptr, &state.shminfo_,
- pixel_size.width(), pixel_size.height()));
+ state.image.reset(XShmCreateImage(
+ display_, visual_, depth_, static_cast<int>(x11::ImageFormat::ZPixmap),
+ nullptr, &state.shminfo_, pixel_size.width(), pixel_size.height()));
if (!state.image)
return false;
std::size_t current_frame_bytes =
@@ -312,18 +312,20 @@ void XShmImagePool::DispatchShmCompletionEvent(XShmCompletionEvent event) {
}
}
-bool XShmImagePool::CanDispatchXEvent(XEvent* xev) {
+bool XShmImagePool::CanDispatchXEvent(x11::Event* x11_event) {
+ const XEvent* xev = &x11_event->xlib_event();
DCHECK(event_task_runner_->RunsTasksInCurrentSequence());
if (xev->type != ui::ShmEventBase() + ShmCompletion)
return false;
- XShmCompletionEvent* shm_event = reinterpret_cast<XShmCompletionEvent*>(xev);
- return shm_event->drawable == drawable_;
+ const auto* shm_event = reinterpret_cast<const XShmCompletionEvent*>(xev);
+ return shm_event->drawable == drawable_.value;
}
-bool XShmImagePool::DispatchXEvent(XEvent* xev) {
- if (!CanDispatchXEvent(xev))
+bool XShmImagePool::DispatchXEvent(x11::Event* x11_event) {
+ XEvent* xev = &x11_event->xlib_event();
+ if (!CanDispatchXEvent(x11_event))
return false;
XShmCompletionEvent* shm_event = reinterpret_cast<XShmCompletionEvent*>(xev);
diff --git a/chromium/ui/base/x/x11_shm_image_pool.h b/chromium/ui/base/x/x11_shm_image_pool.h
index c74ff171d34..b50331d5c9b 100644
--- a/chromium/ui/base/x/x11_shm_image_pool.h
+++ b/chromium/ui/base/x/x11_shm_image_pool.h
@@ -19,6 +19,7 @@
#include "ui/base/x/x11_util.h"
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/x/event.h"
#include "ui/gfx/x/x11.h"
namespace ui {
@@ -34,7 +35,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XShmImagePool
XShmImagePool(scoped_refptr<base::SequencedTaskRunner> host_task_runner,
scoped_refptr<base::SequencedTaskRunner> event_task_runner,
XDisplay* display,
- XID drawable,
+ x11::Drawable drawable,
Visual* visual,
int depth,
std::size_t max_frames_pending);
@@ -66,7 +67,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XShmImagePool
void DispatchShmCompletionEvent(XShmCompletionEvent event);
- bool CanDispatchXEvent(XEvent* xev);
+ bool CanDispatchXEvent(x11::Event* xev);
const scoped_refptr<base::SequencedTaskRunner> host_task_runner_;
const scoped_refptr<base::SequencedTaskRunner> event_task_runner_;
@@ -98,7 +99,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XShmImagePool
};
// XEventDispatcher:
- bool DispatchXEvent(XEvent* xev) override;
+ bool DispatchXEvent(x11::Event* xev) override;
void InitializeOnGpu();
void TeardownOnGpu();
@@ -106,7 +107,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XShmImagePool
void Cleanup();
XDisplay* const display_;
- const XID drawable_;
+ const x11::Drawable drawable_;
Visual* const visual_;
const int depth_;
diff --git a/chromium/ui/base/x/x11_software_bitmap_presenter.cc b/chromium/ui/base/x/x11_software_bitmap_presenter.cc
index f72b5b3ac6b..1974c5bfac8 100644
--- a/chromium/ui/base/x/x11_software_bitmap_presenter.cc
+++ b/chromium/ui/base/x/x11_software_bitmap_presenter.cc
@@ -13,6 +13,7 @@
#include <utility>
#include "base/bind.h"
+#include "base/logging.h"
#include "base/macros.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkImageInfo.h"
@@ -20,6 +21,7 @@
#include "ui/base/x/x11_shm_image_pool.h"
#include "ui/base/x/x11_util.h"
#include "ui/base/x/x11_util_internal.h"
+#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_error_tracker.h"
#include "ui/gfx/x/x11_types.h"
@@ -65,8 +67,8 @@ bool X11SoftwareBitmapPresenter::CompositeBitmap(XDisplay* display,
ui::XScopedImage bg;
{
gfx::X11ErrorTracker ignore_x_errors;
- bg.reset(
- XGetImage(display, widget, x, y, width, height, AllPlanes, ZPixmap));
+ bg.reset(XGetImage(display, widget, x, y, width, height, AllPlanes,
+ static_cast<int>(x11::ImageFormat::ZPixmap)));
}
// XGetImage() may fail if the drawable is a window and the window is not
@@ -78,27 +80,28 @@ bool X11SoftwareBitmapPresenter::CompositeBitmap(XDisplay* display,
return false;
XGCValues gcv;
- gcv.subwindow_mode = IncludeInferiors;
+ gcv.subwindow_mode = static_cast<int>(x11::SubwindowMode::IncludeInferiors);
XChangeGC(display, gc, GCSubwindowMode, &gcv);
XCopyArea(display, widget, pixmap, gc, x, y, width, height, 0, 0);
- gcv.subwindow_mode = ClipByChildren;
+ gcv.subwindow_mode = static_cast<int>(x11::SubwindowMode::ClipByChildren);
XChangeGC(display, gc, GCSubwindowMode, &gcv);
- bg.reset(
- XGetImage(display, pixmap, 0, 0, width, height, AllPlanes, ZPixmap));
+ bg.reset(XGetImage(display, pixmap, 0, 0, width, height, AllPlanes,
+ static_cast<int>(x11::ImageFormat::ZPixmap)));
}
if (!bg)
return false;
SkBitmap bg_bitmap;
- SkImageInfo image_info =
- SkImageInfo::Make(bg->width, bg->height,
- bg->byte_order == LSBFirst ? kBGRA_8888_SkColorType
- : kRGBA_8888_SkColorType,
- kPremul_SkAlphaType);
+ SkImageInfo image_info = SkImageInfo::Make(
+ bg->width, bg->height,
+ bg->byte_order == static_cast<int>(x11::ImageOrder::LSBFirst)
+ ? kBGRA_8888_SkColorType
+ : kRGBA_8888_SkColorType,
+ kPremul_SkAlphaType);
if (!bg_bitmap.installPixels(image_info, bg->data, bg->bytes_per_line))
return false;
SkCanvas canvas(bg_bitmap);
@@ -120,16 +123,18 @@ X11SoftwareBitmapPresenter::X11SoftwareBitmapPresenter(
gfx::AcceleratedWidget widget,
scoped_refptr<base::SequencedTaskRunner> host_task_runner,
scoped_refptr<base::SequencedTaskRunner> event_task_runner)
- : widget_(widget),
+ : widget_(static_cast<x11::Window>(widget)),
display_(gfx::GetXDisplay()),
gc_(nullptr),
host_task_runner_(host_task_runner),
event_task_runner_(event_task_runner) {
- DCHECK_NE(widget_, gfx::kNullAcceleratedWidget);
- gc_ = XCreateGC(display_, widget_, 0, nullptr);
+ DCHECK(widget_ != x11::Window::None);
+ gc_ = XCreateGC(display_, static_cast<uint32_t>(widget_), 0, nullptr);
memset(&attributes_, 0, sizeof(attributes_));
- if (!XGetWindowAttributes(display_, widget_, &attributes_)) {
- LOG(ERROR) << "XGetWindowAttributes failed for window " << widget_;
+ if (!XGetWindowAttributes(display_, static_cast<uint32_t>(widget_),
+ &attributes_)) {
+ LOG(ERROR) << "XGetWindowAttributes failed for window "
+ << static_cast<uint32_t>(widget_);
return;
}
@@ -219,9 +224,9 @@ void X11SoftwareBitmapPresenter::EndPaint(const gfx::Rect& damage_rect) {
if (ShmPoolReady()) {
// TODO(thomasanderson): Investigate direct rendering with DRI3 to avoid any
// unnecessary X11 IPC or buffer copying.
- if (XShmPutImage(display_, widget_, gc_, shm_pool_->CurrentImage(),
- rect.x(), rect.y(), rect.x(), rect.y(), rect.width(),
- rect.height(), x11::True)) {
+ if (XShmPutImage(display_, static_cast<uint32_t>(widget_), gc_,
+ shm_pool_->CurrentImage(), rect.x(), rect.y(), rect.x(),
+ rect.y(), rect.width(), rect.height(), x11::True)) {
needs_swap_ = true;
FlushAfterPutImage();
return;
@@ -231,10 +236,13 @@ void X11SoftwareBitmapPresenter::EndPaint(const gfx::Rect& damage_rect) {
surface_->peekPixels(&skia_pixmap);
}
+ if (!skia_pixmap.addr())
+ return;
+
if (composite_ &&
- CompositeBitmap(display_, widget_, rect.x(), rect.y(), rect.width(),
- rect.height(), attributes_.depth, gc_,
- skia_pixmap.addr())) {
+ CompositeBitmap(display_, static_cast<uint32_t>(widget_), rect.x(),
+ rect.y(), rect.width(), rect.height(), attributes_.depth,
+ gc_, skia_pixmap.addr())) {
FlushAfterPutImage();
return;
}
@@ -242,10 +250,10 @@ void X11SoftwareBitmapPresenter::EndPaint(const gfx::Rect& damage_rect) {
XImage image = {};
image.width = viewport_pixel_size_.width();
image.height = viewport_pixel_size_.height();
- image.format = ZPixmap;
- image.byte_order = LSBFirst;
+ image.format = static_cast<int>(x11::ImageFormat::ZPixmap);
+ image.byte_order = static_cast<int>(x11::ImageOrder::LSBFirst);
image.bitmap_unit = 8;
- image.bitmap_bit_order = LSBFirst;
+ image.bitmap_bit_order = static_cast<int>(x11::ImageOrder::LSBFirst);
image.depth = attributes_.depth;
image.bits_per_pixel = attributes_.visual->bits_per_rgb;
@@ -257,8 +265,8 @@ void X11SoftwareBitmapPresenter::EndPaint(const gfx::Rect& damage_rect) {
image.blue_mask = attributes_.visual->blue_mask;
image.data = reinterpret_cast<char*>(const_cast<void*>(skia_pixmap.addr()));
- XPutImage(display_, widget_, gc_, &image, rect.x(), rect.y(), rect.x(),
- rect.y(), rect.width(), rect.height());
+ XPutImage(display_, static_cast<uint32_t>(widget_), gc_, &image, rect.x(),
+ rect.y(), rect.x(), rect.y(), rect.width(), rect.height());
FlushAfterPutImage();
}
diff --git a/chromium/ui/base/x/x11_software_bitmap_presenter.h b/chromium/ui/base/x/x11_software_bitmap_presenter.h
index c100fddc463..4f405653b19 100644
--- a/chromium/ui/base/x/x11_software_bitmap_presenter.h
+++ b/chromium/ui/base/x/x11_software_bitmap_presenter.h
@@ -58,7 +58,7 @@ class COMPONENT_EXPORT(UI_BASE_X) X11SoftwareBitmapPresenter {
void FlushAfterPutImage();
- gfx::AcceleratedWidget widget_;
+ x11::Window widget_;
XDisplay* display_;
GC gc_;
XWindowAttributes attributes_;
diff --git a/chromium/ui/base/x/x11_topmost_window_finder.h b/chromium/ui/base/x/x11_topmost_window_finder.h
index fd5305da988..8099ce8bbcb 100644
--- a/chromium/ui/base/x/x11_topmost_window_finder.h
+++ b/chromium/ui/base/x/x11_topmost_window_finder.h
@@ -19,7 +19,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XTopmostWindowFinder {
virtual ~XTopmostWindowFinder();
// Returns the topmost window at |screen_loc_px|.
- virtual XID FindWindowAt(const gfx::Point& screen_loc_px) = 0;
+ virtual x11::Window FindWindowAt(const gfx::Point& screen_loc_px) = 0;
};
} // namespace ui
diff --git a/chromium/ui/base/x/x11_util.cc b/chromium/ui/base/x/x11_util.cc
index 4f35d362363..e09f75b75c0 100644
--- a/chromium/ui/base/x/x11_util.cc
+++ b/chromium/ui/base/x/x11_util.cc
@@ -21,12 +21,14 @@
#include "base/bind.h"
#include "base/command_line.h"
+#include "base/compiler_specific.h"
#include "base/location.h"
#include "base/logging.h"
#include "base/memory/singleton.h"
#include "base/message_loop/message_loop_current.h"
#include "base/metrics/histogram_macros.h"
#include "base/no_destructor.h"
+#include "base/notreached.h"
#include "base/single_thread_task_runner.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
@@ -42,6 +44,7 @@
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkImageInfo.h"
#include "third_party/skia/include/core/SkTypes.h"
+#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
#include "ui/base/x/x11_menu_list.h"
#include "ui/base/x/x11_util_internal.h"
#include "ui/events/devices/x11/device_data_manager_x11.h"
@@ -62,6 +65,7 @@
#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"
#if defined(OS_FREEBSD)
@@ -84,10 +88,6 @@ namespace {
constexpr int kNetWMStateAdd = 1;
constexpr int kNetWMStateRemove = 0;
-// Length in 32-bit multiples of the data to be retrieved for
-// XGetWindowProperty.
-constexpr int kLongLength = 0x1FFFFFFF; /* MAXINT32 / 4 */
-
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.
@@ -113,58 +113,15 @@ int DefaultX11IOErrorHandler(XDisplay* d) {
_exit(1);
}
-template <typename T>
-bool GetProperty(XID window, const std::string& property_name, T* value) {
- static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "");
- auto response = x11::Connection::Get()
- ->GetProperty({
- .window = static_cast<x11::Window>(window),
- .property = static_cast<x11::Atom>(
- gfx::GetAtom(property_name.c_str())),
- .long_length = std::max<uint32_t>(1, sizeof(T) / 4),
- })
- .Sync();
- if (!response || response->format != 8 * sizeof(T) ||
- response->value.size() != sizeof(T)) {
- return false;
- }
-
- DCHECK_EQ(response->format / 8 * response->value_len, response->value.size());
- memcpy(value, response->value.data(), sizeof(T));
- return true;
-}
-
-template <typename T>
-bool GetArrayProperty(XID window,
- const std::string& property_name,
- std::vector<T>* value) {
- static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "");
- auto response = x11::Connection::Get()
- ->GetProperty({
- .window = static_cast<x11::Window>(window),
- .property = static_cast<x11::Atom>(
- gfx::GetAtom(property_name.c_str())),
- .long_length = std::numeric_limits<uint32_t>::max(),
- })
- .Sync();
- if (!response || response->format != 8 * sizeof(T))
- return false;
-
- DCHECK_EQ(response->format / 8 * response->value_len, response->value.size());
- value->resize(response->value_len);
- memcpy(value->data(), response->value.data(), response->value.size());
- return true;
-}
-
bool SupportsEWMH() {
static bool supports_ewmh = false;
static bool supports_ewmh_cached = false;
if (!supports_ewmh_cached) {
supports_ewmh_cached = true;
- int wm_window = 0u;
- if (!GetIntProperty(GetX11RootWindow(), "_NET_SUPPORTING_WM_CHECK",
- &wm_window)) {
+ x11::Window wm_window = x11::Window::None;
+ if (!GetProperty(GetX11RootWindow(),
+ gfx::GetAtom("_NET_SUPPORTING_WM_CHECK"), &wm_window)) {
supports_ewmh = false;
return false;
}
@@ -179,9 +136,10 @@ bool SupportsEWMH() {
// property referencing an ID that's been recycled for another window), so
// we check that too.
gfx::X11ErrorTracker err_tracker;
- int wm_window_property = 0;
- bool result = GetIntProperty(wm_window, "_NET_SUPPORTING_WM_CHECK",
- &wm_window_property);
+ x11::Window wm_window_property = x11::Window::None;
+ bool result =
+ GetProperty(wm_window, gfx::GetAtom("_NET_SUPPORTING_WM_CHECK"),
+ &wm_window_property);
supports_ewmh = !err_tracker.FoundNewError() && result &&
wm_window_property == wm_window;
}
@@ -194,32 +152,29 @@ bool GetWindowManagerName(std::string* wm_name) {
if (!SupportsEWMH())
return false;
- int wm_window = 0;
- if (!GetIntProperty(GetX11RootWindow(), "_NET_SUPPORTING_WM_CHECK",
- &wm_window)) {
+ x11::Window wm_window = x11::Window::None;
+ if (!GetProperty(GetX11RootWindow(), gfx::GetAtom("_NET_SUPPORTING_WM_CHECK"),
+ &wm_window)) {
return false;
}
gfx::X11ErrorTracker err_tracker;
- bool result =
- GetStringProperty(static_cast<XID>(wm_window), "_NET_WM_NAME", wm_name);
+ bool result = GetStringProperty(wm_window, "_NET_WM_NAME", wm_name);
return !err_tracker.FoundNewError() && result;
}
unsigned int GetMaxCursorSize() {
- // Although XQueryBestCursor() takes unsigned ints, the width and height will
- // be sent over the wire as 16 bit integers.
constexpr unsigned int kQuerySize = std::numeric_limits<uint16_t>::max();
- XDisplay* display = gfx::GetXDisplay();
- unsigned int width = 0;
- unsigned int height = 0;
- XQueryBestCursor(display, DefaultRootWindow(display), kQuerySize, kQuerySize,
- &width, &height);
- unsigned int min_dimension = std::min(width, height);
+ auto* connection = x11::Connection::Get();
+ x11::QueryBestSizeRequest request{
+ x11::QueryShapeOf::LargestCursor,
+ static_cast<x11::Window>(GetX11RootWindow()), kQuerySize, kQuerySize};
+ if (auto response = connection->QueryBestSize(request).Sync())
+ return std::min(response->width, response->height);
// libXcursor defines MAX_BITMAP_CURSOR_SIZE to 64 in src/xcursorint.h, so use
// this as a fallback in case the X server returns zero size, which can happen
// on some buggy implementations of XWayland/XMir.
- return min_dimension > 0 ? min_dimension : 64;
+ return 64;
}
// A process wide singleton cache for custom X cursors.
@@ -308,8 +263,235 @@ SkBitmap ConvertSkBitmapToUnpremul(const SkBitmap& bitmap) {
return converted_bitmap;
}
+// Returns a cursor name, compatible with either X11 or the FreeDesktop.org
+// cursor spec
+// (https://www.x.org/releases/current/doc/libX11/libX11/libX11.html#x_font_cursors
+// and https://www.freedesktop.org/wiki/Specifications/cursor-spec/), followed
+// by fallbacks that can work as replacements in some environments where the
+// original may not be available (e.g. desktop environments other than
+// GNOME and KDE).
+// TODO(hferreiro): each list starts with the FreeDesktop.org icon name but
+// "ns-resize", "ew-resize", "nesw-resize", "nwse-resize", "grab", "grabbing",
+// which were not available in older versions of Breeze, the default KDE theme.
+std::vector<const char*> CursorNamesFromType(mojom::CursorType type) {
+ switch (type) {
+ case mojom::CursorType::kMove:
+ // Returning "move" is the correct thing here, but Blink doesn't make a
+ // distinction between move and all-scroll. Other platforms use a cursor
+ // more consistent with all-scroll, so use that.
+ case mojom::CursorType::kMiddlePanning:
+ case mojom::CursorType::kMiddlePanningVertical:
+ case mojom::CursorType::kMiddlePanningHorizontal:
+ return {"all-scroll", "fleur"};
+ case mojom::CursorType::kEastPanning:
+ case mojom::CursorType::kEastResize:
+ return {"e-resize", "right_side"};
+ case mojom::CursorType::kNorthPanning:
+ case mojom::CursorType::kNorthResize:
+ return {"n-resize", "top_side"};
+ case mojom::CursorType::kNorthEastPanning:
+ case mojom::CursorType::kNorthEastResize:
+ return {"ne-resize", "top_right_corner"};
+ case mojom::CursorType::kNorthWestPanning:
+ case mojom::CursorType::kNorthWestResize:
+ return {"nw-resize", "top_left_corner"};
+ case mojom::CursorType::kSouthPanning:
+ case mojom::CursorType::kSouthResize:
+ return {"s-resize", "bottom_side"};
+ case mojom::CursorType::kSouthEastPanning:
+ case mojom::CursorType::kSouthEastResize:
+ return {"se-resize", "bottom_right_corner"};
+ case mojom::CursorType::kSouthWestPanning:
+ case mojom::CursorType::kSouthWestResize:
+ return {"sw-resize", "bottom_left_corner"};
+ case mojom::CursorType::kWestPanning:
+ case mojom::CursorType::kWestResize:
+ return {"w-resize", "left_side"};
+ case mojom::CursorType::kNone:
+ return {"none"};
+ case mojom::CursorType::kGrab:
+ return {"openhand", "grab"};
+ case mojom::CursorType::kGrabbing:
+ return {"closedhand", "grabbing", "hand2"};
+ case mojom::CursorType::kCross:
+ return {"crosshair", "cross"};
+ case mojom::CursorType::kHand:
+ return {"pointer", "hand", "hand2"};
+ case mojom::CursorType::kIBeam:
+ return {"text", "xterm"};
+ case mojom::CursorType::kProgress:
+ return {"progress", "left_ptr_watch", "watch"};
+ case mojom::CursorType::kWait:
+ return {"wait", "watch"};
+ case mojom::CursorType::kHelp:
+ return {"help"};
+ case mojom::CursorType::kNorthSouthResize:
+ return {"sb_v_double_arrow", "ns-resize"};
+ case mojom::CursorType::kEastWestResize:
+ return {"sb_h_double_arrow", "ew-resize"};
+ case mojom::CursorType::kColumnResize:
+ return {"col-resize", "sb_h_double_arrow"};
+ case mojom::CursorType::kRowResize:
+ return {"row-resize", "sb_v_double_arrow"};
+ case mojom::CursorType::kNorthEastSouthWestResize:
+ return {"size_bdiag", "nesw-resize", "fd_double_arrow"};
+ case mojom::CursorType::kNorthWestSouthEastResize:
+ return {"size_fdiag", "nwse-resize", "bd_double_arrow"};
+ case mojom::CursorType::kVerticalText:
+ return {"vertical-text"};
+ case mojom::CursorType::kZoomIn:
+ return {"zoom-in"};
+ case mojom::CursorType::kZoomOut:
+ return {"zoom-out"};
+ case mojom::CursorType::kCell:
+ return {"cell", "plus"};
+ case mojom::CursorType::kContextMenu:
+ return {"context-menu"};
+ case mojom::CursorType::kAlias:
+ return {"alias"};
+ case mojom::CursorType::kNoDrop:
+ return {"no-drop"};
+ case mojom::CursorType::kCopy:
+ return {"copy"};
+ case mojom::CursorType::kNotAllowed:
+ return {"not-allowed", "crossed_circle"};
+ case mojom::CursorType::kDndNone:
+ return {"dnd-none", "hand2"};
+ case mojom::CursorType::kDndMove:
+ return {"dnd-move", "hand2"};
+ case mojom::CursorType::kDndCopy:
+ return {"dnd-copy", "hand2"};
+ case mojom::CursorType::kDndLink:
+ return {"dnd-link", "hand2"};
+ case mojom::CursorType::kCustom:
+ // kCustom is for custom image cursors. The platform cursor will be set
+ // at WebCursor::GetPlatformCursor().
+ NOTREACHED();
+ FALLTHROUGH;
+ case mojom::CursorType::kNull:
+ case mojom::CursorType::kPointer:
+ return {"left_ptr"};
+ }
+ NOTREACHED();
+ return {"left_ptr"};
+}
+
} // namespace
+void DeleteProperty(x11::Window window, x11::Atom name) {
+ x11::Connection::Get()->DeleteProperty({
+ .window = static_cast<x11::Window>(window),
+ .property = name,
+ });
+}
+
+bool GetWmNormalHints(x11::Window window, SizeHints* hints) {
+ std::vector<uint32_t> hints32;
+ if (!GetArrayProperty(window, gfx::GetAtom("WM_NORMAL_HINTS"), &hints32))
+ return false;
+ if (hints32.size() != sizeof(SizeHints) / 4)
+ return false;
+ memcpy(hints, hints32.data(), sizeof(*hints));
+ return true;
+}
+
+void SetWmNormalHints(x11::Window window, const SizeHints& hints) {
+ std::vector<uint32_t> hints32(sizeof(SizeHints) / 4);
+ memcpy(hints32.data(), &hints, sizeof(SizeHints));
+ ui::SetArrayProperty(window, gfx::GetAtom("WM_NORMAL_HINTS"),
+ gfx::GetAtom("WM_SIZE_HINTS"), hints32);
+}
+
+bool GetWmHints(x11::Window window, WmHints* hints) {
+ std::vector<uint32_t> hints32;
+ if (!GetArrayProperty(window, gfx::GetAtom("WM_HINTS"), &hints32))
+ return false;
+ if (hints32.size() != sizeof(WmHints) / 4)
+ return false;
+ memcpy(hints, hints32.data(), sizeof(*hints));
+ return true;
+}
+
+void SetWmHints(x11::Window window, const WmHints& hints) {
+ std::vector<uint32_t> hints32(sizeof(WmHints) / 4);
+ memcpy(hints32.data(), &hints, sizeof(WmHints));
+ ui::SetArrayProperty(window, gfx::GetAtom("WM_HINTS"),
+ gfx::GetAtom("WM_HINTS"), hints32);
+}
+
+void WithdrawWindow(x11::Window window) {
+ auto* connection = x11::Connection::Get();
+ connection->UnmapWindow({window});
+
+ auto root = connection->default_root();
+ x11::UnmapNotifyEvent event{.event = root, .window = window};
+ auto event_bytes = x11::Write(event);
+ event_bytes.resize(32);
+
+ auto mask =
+ x11::EventMask::SubstructureNotify | x11::EventMask::SubstructureRedirect;
+ x11::SendEventRequest request{false, root, mask};
+ std::copy(event_bytes.begin(), event_bytes.end(), request.event.begin());
+ connection->SendEvent(request);
+}
+
+void RaiseWindow(x11::Window window) {
+ x11::Connection::Get()->ConfigureWindow(
+ {.window = window, .stack_mode = x11::StackMode::Above});
+}
+
+void LowerWindow(x11::Window window) {
+ x11::Connection::Get()->ConfigureWindow(
+ {.window = window, .stack_mode = x11::StackMode::Below});
+}
+
+void DefineCursor(x11::Window window, x11::Cursor cursor) {
+ // TODO(https://crbug.com/1066670): Sync() should be removed. It's added for
+ // now because Xlib's XDefineCursor() sync'ed and removing it perturbs the
+ // timing on BookmarkBarViewTest8.DNDBackToOriginatingMenu on
+ // linux-chromeos-rel, causing it to flake.
+ x11::Connection::Get()
+ ->ChangeWindowAttributes({.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({
+ .wid = window,
+ .parent = connection->default_root(),
+ .x = -100,
+ .y = -100,
+ .width = 10,
+ .height = 10,
+ .c_class = x11::WindowClass::InputOnly,
+ .override_redirect = x11::Bool32(true),
+ });
+ if (!name.empty())
+ SetStringProperty(window, x11::Atom::WM_NAME, x11::Atom::STRING, name);
+ return window;
+}
+
+x11::KeyCode KeysymToKeycode(x11::Connection* connection, x11::KeySym keysym) {
+ uint8_t min_keycode = static_cast<uint8_t>(connection->setup().min_keycode);
+ uint8_t max_keycode = static_cast<uint8_t>(connection->setup().max_keycode);
+ uint8_t count = max_keycode - min_keycode + 1;
+ auto future =
+ connection->GetKeyboardMapping({connection->setup().min_keycode, count});
+ if (auto reply = future.Sync()) {
+ DCHECK_EQ(count * reply->keysyms_per_keycode,
+ static_cast<int>(reply->keysyms.size()));
+ for (size_t i = 0; i < reply->keysyms.size(); i++) {
+ if (reply->keysyms[i] == keysym) {
+ return static_cast<x11::KeyCode>(min_keycode +
+ i / reply->keysyms_per_keycode);
+ }
+ }
+ }
+ return {};
+}
+
bool IsXInput2Available() {
return DeviceDataManagerX11::GetInstance()->IsXInput2Available();
}
@@ -396,24 +578,37 @@ XcursorImage* SkBitmapToXcursorImage(const SkBitmap& cursor_image,
return image;
}
-int CoalescePendingMotionEvents(const XEvent* xev, XEvent* last_event) {
- DCHECK(xev->type == MotionNotify || xev->type == GenericEvent);
- XDisplay* display = xev->xany.display;
- XEvent next_event;
+::Cursor LoadCursorFromType(mojom::CursorType type) {
+ for (auto* name : CursorNamesFromType(type)) {
+ ::Cursor cursor = XcursorLibraryLoadCursor(gfx::GetXDisplay(), name);
+ if (cursor != x11::None)
+ return cursor;
+ }
+ return x11::None;
+}
+
+int CoalescePendingMotionEvents(const x11::Event* x11_event,
+ x11::Event* last_event) {
+ const XEvent* xev = &x11_event->xlib_event();
+ DCHECK(xev->type == x11::MotionNotifyEvent::opcode ||
+ xev->type == x11::GeGenericEvent::opcode);
+ auto* conn = x11::Connection::Get();
bool is_motion = false;
int num_coalesced = 0;
- if (xev->type == MotionNotify) {
+ conn->ReadResponses();
+ if (xev->type == x11::MotionNotifyEvent::opcode) {
is_motion = true;
- while (XPending(display)) {
- XPeekEvent(xev->xany.display, &next_event);
+ for (auto it = conn->events().begin(); it != conn->events().end();) {
+ const auto& next_event = it->xlib_event();
// Discard all but the most recent motion event that targets the same
// window with unchanged state.
- if (next_event.type == MotionNotify &&
+ if (next_event.type == x11::MotionNotifyEvent::opcode &&
next_event.xmotion.window == xev->xmotion.window &&
next_event.xmotion.subwindow == xev->xmotion.subwindow &&
next_event.xmotion.state == xev->xmotion.state) {
- XNextEvent(xev->xany.display, last_event);
+ *last_event = std::move(*it);
+ it = conn->events().erase(it);
} else {
break;
}
@@ -424,12 +619,14 @@ int CoalescePendingMotionEvents(const XEvent* xev, XEvent* last_event) {
DCHECK(event_type == XI_Motion || event_type == XI_TouchUpdate);
is_motion = event_type == XI_Motion;
- while (XPending(display)) {
- XPeekEvent(display, &next_event);
+ auto* ddmx11 = ui::DeviceDataManagerX11::GetInstance();
+ for (auto it = conn->events().begin(); it != conn->events().end();) {
+ auto& next_event = it->xlib_event();
- // If we can't get the cookie, abort the check.
- if (!XGetEventData(next_event.xgeneric.display, &next_event.xcookie))
- return num_coalesced;
+ if (next_event.type != x11::GeGenericEvent::opcode ||
+ !next_event.xcookie.data) {
+ break;
+ }
// If this isn't from a valid device, throw the event away, as
// that's what the message pump would do. Device events come in pairs
@@ -437,17 +634,14 @@ int CoalescePendingMotionEvents(const XEvent* xev, XEvent* last_event) {
// always be at least one pending.
if (!ui::TouchFactory::GetInstance()->ShouldProcessXI2Event(
&next_event)) {
- XFreeEventData(display, &next_event.xcookie);
- XNextEvent(display, &next_event);
+ it = conn->events().erase(it);
continue;
}
- if (next_event.type == GenericEvent &&
+ if (next_event.type == x11::GeGenericEvent::opcode &&
next_event.xgeneric.evtype == event_type &&
- !ui::DeviceDataManagerX11::GetInstance()->IsCMTGestureEvent(
- next_event) &&
- ui::DeviceDataManagerX11::GetInstance()->GetScrollClassEventDetail(
- next_event) == SCROLL_TYPE_NO_SCROLL) {
+ !ddmx11->IsCMTGestureEvent(*it) &&
+ ddmx11->GetScrollClassEventDetail(*it) == SCROLL_TYPE_NO_SCROLL) {
XIDeviceEvent* next_xievent =
static_cast<XIDeviceEvent*>(next_event.xcookie.data);
// Confirm that the motion event is targeted at the same window
@@ -462,25 +656,16 @@ int CoalescePendingMotionEvents(const XEvent* xev, XEvent* last_event) {
xievent->mods.latched == next_xievent->mods.latched &&
xievent->mods.locked == next_xievent->mods.locked &&
xievent->mods.effective == next_xievent->mods.effective) {
- XFreeEventData(display, &next_event.xcookie);
- // Free the previous cookie.
- if (num_coalesced > 0)
- XFreeEventData(display, &last_event->xcookie);
- // Get the event and its cookie data.
- XNextEvent(display, last_event);
- XGetEventData(display, &last_event->xcookie);
- ++num_coalesced;
+ *last_event = std::move(*it);
+ it = conn->events().erase(it);
+ num_coalesced++;
continue;
}
}
- // This isn't an event we want so free its cookie data.
- XFreeEventData(display, &next_event.xcookie);
break;
}
}
- if (is_motion && num_coalesced > 0)
- UMA_HISTOGRAM_COUNTS_10000("Event.CoalescedCount.Mouse", num_coalesced);
return num_coalesced;
}
@@ -505,62 +690,53 @@ void HideHostCursor() {
return invisible_cursor;
}
-void SetUseOSWindowFrame(XID window, bool use_os_window_frame) {
+void SetUseOSWindowFrame(x11::Window window, bool use_os_window_frame) {
// This data structure represents additional hints that we send to the window
// manager and has a direct lineage back to Motif, which defined this de facto
- // standard. This struct doesn't seem 64-bit safe though, but it's what GDK
- // does.
+ // standard. We define this struct to match the wire-format (32-bit fields)
+ // rather than the Xlib API (XChangeProperty) format (long fields).
typedef struct {
- unsigned long flags;
- unsigned long functions;
- unsigned long decorations;
- long input_mode;
- unsigned long status;
+ uint32_t flags;
+ uint32_t functions;
+ uint32_t decorations;
+ int32_t input_mode;
+ uint32_t status;
} MotifWmHints;
MotifWmHints motif_hints;
memset(&motif_hints, 0, sizeof(motif_hints));
// Signals that the reader of the _MOTIF_WM_HINTS property should pay
// attention to the value of |decorations|.
- motif_hints.flags = (1L << 1);
+ motif_hints.flags = (1u << 1);
motif_hints.decorations = use_os_window_frame ? 1 : 0;
- XAtom hint_atom = gfx::GetAtom("_MOTIF_WM_HINTS");
- XChangeProperty(gfx::GetXDisplay(), window, hint_atom, hint_atom, 32,
- PropModeReplace,
- reinterpret_cast<unsigned char*>(&motif_hints),
- sizeof(MotifWmHints) / sizeof(long));
+ std::vector<uint32_t> hints(sizeof(MotifWmHints) / sizeof(uint32_t));
+ memcpy(hints.data(), &motif_hints, sizeof(MotifWmHints));
+ x11::Atom hint_atom = gfx::GetAtom("_MOTIF_WM_HINTS");
+ SetArrayProperty(window, hint_atom, hint_atom, hints);
}
bool IsShapeExtensionAvailable() {
- int dummy;
- static bool is_shape_available =
- XShapeQueryExtension(gfx::GetXDisplay(), &dummy, &dummy);
- return is_shape_available;
+ return x11::Connection::Get()->shape().present();
}
-XID GetX11RootWindow() {
- return DefaultRootWindow(gfx::GetXDisplay());
+x11::Window GetX11RootWindow() {
+ return x11::Connection::Get()->default_screen().root;
}
bool GetCurrentDesktop(int* desktop) {
return GetIntProperty(GetX11RootWindow(), "_NET_CURRENT_DESKTOP", desktop);
}
-void SetHideTitlebarWhenMaximizedProperty(XID window,
+void SetHideTitlebarWhenMaximizedProperty(x11::Window window,
HideTitlebarWhenMaximized property) {
- // XChangeProperty() expects "hide" to be long.
- unsigned long hide = property;
- XChangeProperty(gfx::GetXDisplay(), window,
- gfx::GetAtom("_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED"),
- XA_CARDINAL,
- 32, // size in bits
- PropModeReplace, reinterpret_cast<unsigned char*>(&hide), 1);
+ SetProperty(window, gfx::GetAtom("_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED"),
+ x11::Atom::CARDINAL, static_cast<uint32_t>(property));
}
void ClearX11DefaultRootWindow() {
XDisplay* display = gfx::GetXDisplay();
- XID root_window = GetX11RootWindow();
+ x11::Window root_window = GetX11RootWindow();
gfx::Rect root_bounds;
if (!GetOuterWindowBounds(root_window, &root_bounds)) {
LOG(ERROR) << "Failed to get the bounds of the X11 root window";
@@ -569,25 +745,27 @@ void ClearX11DefaultRootWindow() {
XGCValues gc_values = {0};
gc_values.foreground = BlackPixel(display, DefaultScreen(display));
- GC gc = XCreateGC(display, root_window, GCForeground, &gc_values);
- XFillRectangle(display, root_window, gc, root_bounds.x(), root_bounds.y(),
- root_bounds.width(), root_bounds.height());
+ GC gc = XCreateGC(display, static_cast<uint32_t>(root_window), GCForeground,
+ &gc_values);
+ XFillRectangle(display, static_cast<uint32_t>(root_window), gc,
+ root_bounds.x(), root_bounds.y(), root_bounds.width(),
+ root_bounds.height());
XFreeGC(display, gc);
}
-bool IsWindowVisible(XID window) {
+bool IsWindowVisible(x11::Window window) {
TRACE_EVENT0("ui", "IsWindowVisible");
- XWindowAttributes win_attributes;
- if (!XGetWindowAttributes(gfx::GetXDisplay(), window, &win_attributes))
- return false;
- if (win_attributes.map_state != IsViewable)
+ auto x11_window = static_cast<x11::Window>(window);
+ auto* connection = x11::Connection::Get();
+ auto response = connection->GetWindowAttributes({x11_window}).Sync();
+ if (!response || response->map_state != x11::MapState::Viewable)
return false;
// Minimized windows are not visible.
- std::vector<XAtom> wm_states;
+ std::vector<x11::Atom> wm_states;
if (GetAtomArrayProperty(window, "_NET_WM_STATE", &wm_states)) {
- XAtom hidden_atom = gfx::GetAtom("_NET_WM_STATE_HIDDEN");
+ x11::Atom hidden_atom = gfx::GetAtom("_NET_WM_STATE_HIDDEN");
if (base::Contains(wm_states, hidden_atom))
return false;
}
@@ -600,26 +778,27 @@ bool IsWindowVisible(XID window) {
window_desktop == kAllDesktops || window_desktop == current_desktop);
}
-bool GetInnerWindowBounds(XID window, gfx::Rect* rect) {
- Window root, child;
- int x, y;
- unsigned int width, height;
- unsigned int border_width, depth;
+bool GetInnerWindowBounds(x11::Window window, gfx::Rect* rect) {
+ auto x11_window = static_cast<x11::Window>(window);
+ auto root = static_cast<x11::Window>(GetX11RootWindow());
- if (!XGetGeometry(gfx::GetXDisplay(), window, &root, &x, &y, &width, &height,
- &border_width, &depth))
- return false;
+ x11::Connection* connection = x11::Connection::Get();
+ auto get_geometry = connection->GetGeometry({x11_window});
+ auto translate_coords = connection->TranslateCoordinates({x11_window, root});
- if (!XTranslateCoordinates(gfx::GetXDisplay(), window, root, 0, 0, &x, &y,
- &child))
- return false;
+ // Sync after making both requests so only one round-trip is made.
+ auto geometry = get_geometry.Sync();
+ auto coords = translate_coords.Sync();
- *rect = gfx::Rect(x, y, width, height);
+ if (!geometry || !coords)
+ return false;
+ *rect = gfx::Rect(coords->dst_x, coords->dst_y, geometry->width,
+ geometry->height);
return true;
}
-bool GetWindowExtents(XID window, gfx::Insets* extents) {
+bool GetWindowExtents(x11::Window window, gfx::Insets* extents) {
std::vector<int> insets;
if (!GetIntArrayProperty(window, "_NET_FRAME_EXTENTS", &insets))
return false;
@@ -634,7 +813,7 @@ bool GetWindowExtents(XID window, gfx::Insets* extents) {
return true;
}
-bool GetOuterWindowBounds(XID window, gfx::Rect* rect) {
+bool GetOuterWindowBounds(x11::Window window, gfx::Rect* rect) {
if (!GetInnerWindowBounds(window, rect))
return false;
@@ -647,7 +826,7 @@ bool GetOuterWindowBounds(XID window, gfx::Rect* rect) {
return true;
}
-bool WindowContainsPoint(XID window, gfx::Point screen_loc) {
+bool WindowContainsPoint(x11::Window window, gfx::Point screen_loc) {
TRACE_EVENT0("ui", "WindowContainsPoint");
gfx::Rect window_rect;
@@ -673,22 +852,21 @@ bool WindowContainsPoint(XID window, gfx::Point screen_loc) {
// client bounding region. Any portion of the client input region that is not
// included in both the default input region and the client bounding region
// will not be included in the effective input region on the screen.
- int rectangle_kind[] = {ShapeInput, ShapeBounding};
- for (int kind_index : rectangle_kind) {
- int dummy;
- int shape_rects_size = 0;
- gfx::XScopedPtr<XRectangle[]> shape_rects(XShapeGetRectangles(
- gfx::GetXDisplay(), window, kind_index, &shape_rects_size, &dummy));
- if (!shape_rects) {
- // The shape is empty. This can occur when |window| is minimized.
- DCHECK_EQ(0, shape_rects_size);
+ x11::Shape::Sk rectangle_kind[] = {x11::Shape::Sk::Input,
+ x11::Shape::Sk::Bounding};
+ for (auto kind : rectangle_kind) {
+ auto shape =
+ x11::Connection::Get()->shape().GetRectangles({window, kind}).Sync();
+ if (!shape)
+ return true;
+ if (shape->rectangles.empty()) {
+ // The shape can be empty when |window| is minimized.
return false;
}
bool is_in_shape_rects = false;
- for (int i = 0; i < shape_rects_size; ++i) {
+ for (const auto& rect : shape->rectangles) {
// The ShapeInput and ShapeBounding rects are to be in window space, so we
// have to translate by the window_rect's offset to map to screen space.
- const XRectangle& rect = shape_rects[i];
gfx::Rect shape_rect =
gfx::Rect(rect.x + window_rect.x(), rect.y + window_rect.y(),
rect.width, rect.height);
@@ -703,182 +881,105 @@ bool WindowContainsPoint(XID window, gfx::Point screen_loc) {
return true;
}
-bool PropertyExists(XID window, const std::string& property_name) {
+bool PropertyExists(x11::Window window, const std::string& property_name) {
auto response = x11::Connection::Get()
->GetProperty({
.window = static_cast<x11::Window>(window),
- .property = static_cast<x11::Atom>(
- gfx::GetAtom(property_name.c_str())),
+ .property = gfx::GetAtom(property_name),
.long_length = 1,
})
.Sync();
return response && response->format;
}
-bool GetRawBytesOfProperty(XID window,
- XAtom property,
- scoped_refptr<base::RefCountedMemory>* out_data,
- size_t* out_data_items,
- XAtom* out_type) {
- // Retrieve the data from our window.
- unsigned long nitems = 0;
- unsigned long nbytes = 0;
- XAtom prop_type = x11::None;
- int prop_format = 0;
- unsigned char* property_data = nullptr;
- if (XGetWindowProperty(gfx::GetXDisplay(), window, property, 0, kLongLength,
- x11::False, AnyPropertyType, &prop_type, &prop_format,
- &nitems, &nbytes, &property_data) != x11::Success) {
- return false;
- }
- gfx::XScopedPtr<unsigned char> scoped_property(property_data);
-
- if (prop_type == x11::None)
+bool GetRawBytesOfProperty(x11::Window window,
+ x11::Atom property,
+ std::vector<uint8_t>* out_data,
+ x11::Atom* out_type) {
+ auto future = x11::Connection::Get()->GetProperty({
+ .window = static_cast<x11::Window>(window),
+ .property = property,
+ // Don't limit the amount of returned data.
+ .long_length = std::numeric_limits<uint32_t>::max(),
+ });
+ auto response = future.Sync();
+ if (!response || !response->format)
return false;
-
- size_t bytes = 0;
- // So even though we should theoretically have nbytes (and we can't
- // pass nullptr there), we need to manually calculate the byte length here
- // because nbytes always returns zero.
- switch (prop_format) {
- case 8:
- bytes = nitems;
- break;
- case 16:
- bytes = sizeof(short) * nitems;
- break;
- case 32:
- bytes = sizeof(long) * nitems;
- break;
- default:
- NOTREACHED();
- break;
- }
-
- if (out_data)
- *out_data = new XRefcountedMemory(scoped_property.release(), bytes);
-
- if (out_data_items)
- *out_data_items = nitems;
-
+ *out_data = std::move(response->value);
if (out_type)
- *out_type = prop_type;
-
+ *out_type = response->type;
return true;
}
-bool GetIntProperty(XID window, const std::string& property_name, int* value) {
- return GetProperty(window, property_name, value);
+bool GetIntProperty(x11::Window window,
+ const std::string& property_name,
+ int* value) {
+ return GetProperty(window, gfx::GetAtom(property_name), value);
}
-bool GetXIDProperty(XID window, const std::string& property_name, XID* value) {
- uint32_t xid;
- if (!GetProperty(window, property_name, &xid))
- return false;
- *value = xid;
- return true;
-}
-
-bool GetIntArrayProperty(XID window,
+bool GetIntArrayProperty(x11::Window window,
const std::string& property_name,
- std::vector<int>* value) {
- return GetArrayProperty(window, property_name, value);
+ std::vector<int32_t>* value) {
+ return GetArrayProperty(window, gfx::GetAtom(property_name), value);
}
-bool GetAtomArrayProperty(XID window,
+bool GetAtomArrayProperty(x11::Window window,
const std::string& property_name,
- std::vector<XAtom>* value) {
- std::vector<uint32_t> value32;
- if (!GetArrayProperty(window, property_name, &value32))
- return false;
- *value = std::vector<XAtom>(value32.begin(), value32.end());
- return true;
+ std::vector<x11::Atom>* value) {
+ return GetArrayProperty(window, gfx::GetAtom(property_name), value);
}
-bool GetStringProperty(XID window,
+bool GetStringProperty(x11::Window window,
const std::string& property_name,
std::string* value) {
std::vector<char> str;
- if (!GetArrayProperty(window, property_name, &str))
+ if (!GetArrayProperty(window, gfx::GetAtom(property_name), &str))
return false;
value->assign(str.data(), str.size());
return true;
}
-bool SetIntProperty(XID window,
+void SetIntProperty(x11::Window window,
const std::string& name,
const std::string& type,
- int value) {
+ int32_t value) {
std::vector<int> values(1, value);
return SetIntArrayProperty(window, name, type, values);
}
-bool SetIntArrayProperty(XID window,
+void SetIntArrayProperty(x11::Window window,
const std::string& name,
const std::string& type,
- const std::vector<int>& value) {
- DCHECK(!value.empty());
- XAtom name_atom = gfx::GetAtom(name.c_str());
- XAtom type_atom = gfx::GetAtom(type.c_str());
-
- // XChangeProperty() expects values of type 32 to be longs.
- std::unique_ptr<long[]> data(new long[value.size()]);
- for (size_t i = 0; i < value.size(); ++i)
- data[i] = value[i];
-
- gfx::X11ErrorTracker err_tracker;
- XChangeProperty(gfx::GetXDisplay(), window, name_atom, type_atom,
- 32, // size in bits of items in 'value'
- PropModeReplace,
- reinterpret_cast<const unsigned char*>(data.get()),
- value.size()); // num items
- return !err_tracker.FoundNewError();
+ const std::vector<int32_t>& value) {
+ SetArrayProperty(window, gfx::GetAtom(name), gfx::GetAtom(type), value);
}
-bool SetAtomProperty(XID window,
+void SetAtomProperty(x11::Window window,
const std::string& name,
const std::string& type,
- XAtom value) {
- std::vector<XAtom> values(1, value);
+ x11::Atom value) {
+ std::vector<x11::Atom> values(1, value);
return SetAtomArrayProperty(window, name, type, values);
}
-bool SetAtomArrayProperty(XID window,
+void SetAtomArrayProperty(x11::Window window,
const std::string& name,
const std::string& type,
- const std::vector<XAtom>& value) {
- DCHECK(!value.empty());
- XAtom name_atom = gfx::GetAtom(name.c_str());
- XAtom type_atom = gfx::GetAtom(type.c_str());
-
- // XChangeProperty() expects values of type 32 to be longs.
- std::unique_ptr<XAtom[]> data(new XAtom[value.size()]);
- for (size_t i = 0; i < value.size(); ++i)
- data[i] = value[i];
-
- gfx::X11ErrorTracker err_tracker;
- XChangeProperty(gfx::GetXDisplay(), window, name_atom, type_atom,
- 32, // size in bits of items in 'value'
- PropModeReplace,
- reinterpret_cast<const unsigned char*>(data.get()),
- value.size()); // num items
- return !err_tracker.FoundNewError();
+ const std::vector<x11::Atom>& value) {
+ SetArrayProperty(window, gfx::GetAtom(name), gfx::GetAtom(type), value);
}
-bool SetStringProperty(XID window,
- XAtom property,
- XAtom type,
+void SetStringProperty(x11::Window window,
+ x11::Atom property,
+ x11::Atom type,
const std::string& value) {
- gfx::X11ErrorTracker err_tracker;
- XChangeProperty(
- gfx::GetXDisplay(), window, property, type, 8, PropModeReplace,
- reinterpret_cast<const unsigned char*>(value.c_str()), value.size());
- return !err_tracker.FoundNewError();
+ std::vector<char> str(value.begin(), value.end());
+ SetArrayProperty(window, property, type, str);
}
-void SetWindowClassHint(XDisplay* display,
- XID window,
+void SetWindowClassHint(x11::Connection* connection,
+ x11::Window window,
const std::string& res_name,
const std::string& res_class) {
XClassHint class_hints;
@@ -887,66 +988,45 @@ void SetWindowClassHint(XDisplay* display,
// not const references.
class_hints.res_name = const_cast<char*>(res_name.c_str());
class_hints.res_class = const_cast<char*>(res_class.c_str());
- XSetClassHint(display, window, &class_hints);
+ XSetClassHint(connection->display(), static_cast<uint32_t>(window),
+ &class_hints);
}
-void SetWindowRole(XDisplay* display, XID window, const std::string& role) {
- if (role.empty()) {
- XDeleteProperty(display, window, gfx::GetAtom("WM_WINDOW_ROLE"));
- } else {
- char* role_c = const_cast<char*>(role.c_str());
- XChangeProperty(display, window, gfx::GetAtom("WM_WINDOW_ROLE"), XA_STRING,
- 8, PropModeReplace,
- reinterpret_cast<unsigned char*>(role_c), role.size());
- }
+void SetWindowRole(x11::Window window, const std::string& role) {
+ x11::Atom prop = gfx::GetAtom("WM_WINDOW_ROLE");
+ if (role.empty())
+ DeleteProperty(window, prop);
+ else
+ SetStringProperty(window, prop, x11::Atom::STRING, role);
+}
+
+void SetWMSpecState(x11::Window window,
+ bool enabled,
+ x11::Atom state1,
+ x11::Atom state2) {
+ SendClientMessage(
+ window, GetX11RootWindow(), gfx::GetAtom("_NET_WM_STATE"),
+ {enabled ? kNetWMStateAdd : kNetWMStateRemove,
+ static_cast<uint32_t>(state1), static_cast<uint32_t>(state2), 1, 0});
}
-void SetWMSpecState(XID window, bool enabled, XAtom state1, XAtom state2) {
- XEvent xclient;
- memset(&xclient, 0, sizeof(xclient));
- xclient.type = ClientMessage;
- xclient.xclient.window = window;
- xclient.xclient.message_type = gfx::GetAtom("_NET_WM_STATE");
- // The data should be viewed as a list of longs, because XAtom is a typedef of
- // long.
- xclient.xclient.format = 32;
- xclient.xclient.data.l[0] = enabled ? kNetWMStateAdd : kNetWMStateRemove;
- xclient.xclient.data.l[1] = state1;
- xclient.xclient.data.l[2] = state2;
- xclient.xclient.data.l[3] = 1;
- xclient.xclient.data.l[4] = 0;
-
- XSendEvent(gfx::GetXDisplay(), GetX11RootWindow(), x11::False,
- SubstructureRedirectMask | SubstructureNotifyMask, &xclient);
-}
-
-void DoWMMoveResize(XDisplay* display,
- XID root_window,
- XID window,
+void DoWMMoveResize(x11::Connection* connection,
+ x11::Window root_window,
+ x11::Window window,
const gfx::Point& location_px,
int direction) {
// This handler is usually sent when the window has the implicit grab. We
// need to dump it because what we're about to do is tell the window manager
// that it's now responsible for moving the window around; it immediately
// grabs when it receives the event below.
- XUngrabPointer(display, x11::CurrentTime);
+ connection->UngrabPointer({x11::Time::CurrentTime});
- XEvent event;
- memset(&event, 0, sizeof(event));
- event.xclient.type = ClientMessage;
- event.xclient.display = display;
- event.xclient.window = window;
- event.xclient.message_type = gfx::GetAtom("_NET_WM_MOVERESIZE");
- event.xclient.format = 32;
- event.xclient.data.l[0] = location_px.x();
- event.xclient.data.l[1] = location_px.y();
- event.xclient.data.l[2] = direction;
-
- XSendEvent(display, root_window, x11::False,
- SubstructureRedirectMask | SubstructureNotifyMask, &event);
+ SendClientMessage(window, root_window, gfx::GetAtom("_NET_WM_MOVERESIZE"),
+ {location_px.x(), location_px.y(), direction, 0, 0});
}
-bool HasWMSpecProperty(const base::flat_set<XAtom>& properties, XAtom atom) {
+bool HasWMSpecProperty(const base::flat_set<x11::Atom>& properties,
+ x11::Atom atom) {
return properties.find(atom) != properties.end();
}
@@ -1014,7 +1094,7 @@ bool IsWmTiling(WindowManagerName window_manager) {
}
}
-bool GetWindowDesktop(XID window, int* desktop) {
+bool GetWindowDesktop(x11::Window window, int* desktop) {
return GetIntProperty(window, "_NET_WM_DESKTOP", desktop);
}
@@ -1025,26 +1105,21 @@ std::string GetX11ErrorString(XDisplay* display, int err) {
}
// Returns true if |window| is a named window.
-bool IsWindowNamed(XID window) {
- XTextProperty prop;
- if (!XGetWMName(gfx::GetXDisplay(), window, &prop) || !prop.value)
- return false;
-
- XFree(prop.value);
- return true;
+bool IsWindowNamed(x11::Window window) {
+ return PropertyExists(window, "WM_NAME");
}
bool EnumerateChildren(EnumerateWindowsDelegate* delegate,
- XID window,
+ x11::Window window,
const int max_depth,
int depth) {
if (depth > max_depth)
return false;
- std::vector<XID> windows;
- std::vector<XID>::iterator iter;
+ std::vector<x11::Window> windows;
+ std::vector<x11::Window>::iterator iter;
if (depth == 0) {
- XMenuList::GetInstance()->InsertMenuWindowXIDs(&windows);
+ XMenuList::GetInstance()->InsertMenuWindows(&windows);
// Enumerate the menus first.
for (iter = windows.begin(); iter != windows.end(); iter++) {
if (delegate->ShouldStopIterating(*iter))
@@ -1053,17 +1128,10 @@ bool EnumerateChildren(EnumerateWindowsDelegate* delegate,
windows.clear();
}
- XID root, parent, *children;
- unsigned int num_children;
- int status = XQueryTree(gfx::GetXDisplay(), window, &root, &parent, &children,
- &num_children);
- if (status == 0)
+ auto query_tree = x11::Connection::Get()->QueryTree({window}).Sync();
+ if (!query_tree)
return false;
-
- for (int i = static_cast<int>(num_children) - 1; i >= 0; i--)
- windows.push_back(children[i]);
-
- XFree(children);
+ windows = std::move(query_tree->children);
// XQueryTree returns the children of |window| in bottom-to-top order, so
// reverse-iterate the list to check the windows from top-to-bottom.
@@ -1087,12 +1155,12 @@ bool EnumerateChildren(EnumerateWindowsDelegate* delegate,
}
bool EnumerateAllWindows(EnumerateWindowsDelegate* delegate, int max_depth) {
- XID root = GetX11RootWindow();
+ x11::Window root = GetX11RootWindow();
return EnumerateChildren(delegate, root, max_depth, 0);
}
void EnumerateTopLevelWindows(ui::EnumerateWindowsDelegate* delegate) {
- std::vector<XID> stack;
+ std::vector<x11::Window> stack;
if (!ui::GetXWindowStack(ui::GetX11RootWindow(), &stack)) {
// Window Manager doesn't support _NET_CLIENT_LIST_STACKING, so fall back
// to old school enumeration of all X windows. Some WMs parent 'top-level'
@@ -1102,22 +1170,23 @@ void EnumerateTopLevelWindows(ui::EnumerateWindowsDelegate* delegate) {
ui::EnumerateAllWindows(delegate, kMaxSearchDepth);
return;
}
- XMenuList::GetInstance()->InsertMenuWindowXIDs(&stack);
+ XMenuList::GetInstance()->InsertMenuWindows(&stack);
- std::vector<XID>::iterator iter;
+ std::vector<x11::Window>::iterator iter;
for (iter = stack.begin(); iter != stack.end(); iter++) {
if (delegate->ShouldStopIterating(*iter))
return;
}
}
-bool GetXWindowStack(Window window, std::vector<XID>* windows) {
- std::vector<uint32_t> value32;
- if (!GetArrayProperty(window, "_NET_CLIENT_LIST_STACKING", &value32))
+bool GetXWindowStack(x11::Window window, std::vector<x11::Window>* windows) {
+ if (!GetArrayProperty(window, gfx::GetAtom("_NET_CLIENT_LIST_STACKING"),
+ windows)) {
return false;
+ }
// It's more common to iterate from lowest window to highest,
// so reverse the vector.
- *windows = std::vector<XID>(value32.rbegin(), value32.rend());
+ std::reverse(windows->begin(), windows->end());
return true;
}
@@ -1181,9 +1250,15 @@ std::string GuessWindowManagerName() {
}
bool IsCompositingManagerPresent() {
+ auto is_compositing_manager_present_impl = []() {
+ auto response = x11::Connection::Get()
+ ->GetSelectionOwner({gfx::GetAtom("_NET_WM_CM_S0")})
+ .Sync();
+ return response && response->owner != x11::Window::None;
+ };
+
static bool is_compositing_manager_present =
- XGetSelectionOwner(gfx::GetXDisplay(), gfx::GetAtom("_NET_WM_CM_S0")) !=
- x11::None;
+ is_compositing_manager_present_impl();
return is_compositing_manager_present;
}
@@ -1191,13 +1266,13 @@ void SetDefaultX11ErrorHandlers() {
SetX11ErrorHandlers(nullptr, nullptr);
}
-bool IsX11WindowFullScreen(XID window) {
+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
// whether we're fullscreen.
- XAtom fullscreen_atom = gfx::GetAtom("_NET_WM_STATE_FULLSCREEN");
+ x11::Atom fullscreen_atom = gfx::GetAtom("_NET_WM_STATE_FULLSCREEN");
if (WmSupportsHint(fullscreen_atom)) {
- std::vector<XAtom> atom_properties;
+ std::vector<x11::Atom> atom_properties;
if (GetAtomArrayProperty(window, "_NET_WM_STATE", &atom_properties)) {
return base::Contains(atom_properties, fullscreen_atom);
}
@@ -1207,23 +1282,20 @@ bool IsX11WindowFullScreen(XID window) {
if (!ui::GetOuterWindowBounds(window, &window_rect))
return false;
- // We can't use display::Screen here because we don't have an aura::Window. So
- // instead just look at the size of the default display.
- //
- // TODO(erg): Actually doing this correctly would require pulling out xrandr,
- // which we don't even do in the desktop screen yet.
- ::XDisplay* display = gfx::GetXDisplay();
- ::Screen* screen = DefaultScreenOfDisplay(display);
- int width = WidthOfScreen(screen);
- int height = HeightOfScreen(screen);
+ // TODO(thomasanderson): We should use
+ // display::Screen::GetDisplayNearestWindow() instead of using the
+ // connection screen size, which encompasses all displays.
+ auto* connection = x11::Connection::Get();
+ int width = connection->default_screen().width_in_pixels;
+ int height = connection->default_screen().height_in_pixels;
return window_rect.size() == gfx::Size(width, height);
}
-bool WmSupportsHint(XAtom atom) {
+bool WmSupportsHint(x11::Atom atom) {
if (!SupportsEWMH())
return false;
- std::vector<XAtom> supported_atoms;
+ std::vector<x11::Atom> supported_atoms;
if (!GetAtomArrayProperty(GetX11RootWindow(), "_NET_SUPPORTED",
&supported_atoms)) {
return false;
@@ -1236,27 +1308,13 @@ gfx::ICCProfile GetICCProfileForMonitor(int monitor) {
gfx::ICCProfile icc_profile;
if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kHeadless))
return icc_profile;
- std::string atom_name;
- if (monitor == 0) {
- atom_name = "_ICC_PROFILE";
- } else {
- atom_name = base::StringPrintf("_ICC_PROFILE_%d", monitor);
- }
- Atom property = gfx::GetAtom(atom_name.c_str());
- if (property != x11::None) {
- Atom prop_type = x11::None;
- int prop_format = 0;
- unsigned long nitems = 0;
- unsigned long nbytes = 0;
- char* property_data = nullptr;
- int result = XGetWindowProperty(
- gfx::GetXDisplay(), DefaultRootWindow(gfx::GetXDisplay()), property, 0,
- kLongLength, x11::False, AnyPropertyType, &prop_type, &prop_format,
- &nitems, &nbytes, reinterpret_cast<unsigned char**>(&property_data));
- if (result == x11::Success) {
- icc_profile = gfx::ICCProfile::FromData(property_data, nitems);
- XFree(property_data);
- }
+ std::string atom_name = monitor == 0
+ ? "_ICC_PROFILE"
+ : base::StringPrintf("_ICC_PROFILE_%d", monitor);
+ std::vector<uint8_t> data;
+ if (GetRawBytesOfProperty(GetX11RootWindow(), gfx::GetAtom(atom_name), &data,
+ nullptr)) {
+ icc_profile = gfx::ICCProfile::FromData(data.data(), data.size());
}
return icc_profile;
}
@@ -1298,7 +1356,7 @@ SkColorType ColorTypeForVisual(void* visual) {
};
Visual* vis = reinterpret_cast<Visual*>(visual);
// When running under Xvfb, a visual may not be set.
- if (!vis->red_mask && !vis->green_mask && !vis->blue_mask)
+ if (!vis || !vis->red_mask || !vis->green_mask || !vis->blue_mask)
return kUnknown_SkColorType;
for (const auto& color_info : color_infos) {
if (vis->red_mask == color_info.red_mask &&
@@ -1314,6 +1372,22 @@ SkColorType ColorTypeForVisual(void* visual) {
return kUnknown_SkColorType;
}
+x11::Future<void> SendClientMessage(x11::Window window,
+ x11::Window target,
+ x11::Atom type,
+ const std::array<uint32_t, 5> data,
+ x11::EventMask event_mask) {
+ x11::ClientMessageEvent event{.format = 32, .window = window, .type = type};
+ event.data.data32 = data;
+ auto event_bytes = x11::Write(event);
+ DCHECK_EQ(event_bytes.size(), 32ul);
+
+ auto* connection = x11::Connection::Get();
+ x11::SendEventRequest request{false, target, event_mask};
+ std::copy(event_bytes.begin(), event_bytes.end(), request.event.begin());
+ return connection->SendEvent(request);
+}
+
XRefcountedMemory::XRefcountedMemory(unsigned char* x11_data, size_t length)
: x11_data_(length ? x11_data : nullptr), length_(length) {}
@@ -1404,32 +1478,20 @@ XVisualManager* XVisualManager::GetInstance() {
return base::Singleton<XVisualManager>::get();
}
-XVisualManager::XVisualManager()
- : display_(gfx::GetXDisplay()),
- default_visual_id_(0),
- system_visual_id_(0),
- transparent_visual_id_(0),
- using_software_rendering_(false),
- have_gpu_argb_visual_(false) {
+XVisualManager::XVisualManager() : connection_(x11::Connection::Get()) {
base::AutoLock lock(lock_);
- int visuals_len = 0;
- XVisualInfo visual_template;
- visual_template.screen = DefaultScreen(display_);
- gfx::XScopedPtr<XVisualInfo[]> visual_list(XGetVisualInfo(
- display_, VisualScreenMask, &visual_template, &visuals_len));
- for (int i = 0; i < visuals_len; ++i)
- visuals_[visual_list[i].visualid] =
- std::make_unique<XVisualData>(visual_list[i]);
-
- XAtom NET_WM_CM_S0 = gfx::GetAtom("_NET_WM_CM_S0");
- using_compositing_wm_ =
- XGetSelectionOwner(display_, NET_WM_CM_S0) != x11::None;
+
+ for (const auto& depth : connection_->default_screen().allowed_depths) {
+ for (const auto& visual : depth.visuals) {
+ visuals_[visual.visual_id] =
+ std::make_unique<XVisualData>(depth.depth, &visual);
+ }
+ }
// Choose the opaque visual.
- default_visual_id_ =
- XVisualIDFromVisual(DefaultVisual(display_, DefaultScreen(display_)));
+ default_visual_id_ = connection_->default_screen().root_visual;
system_visual_id_ = default_visual_id_;
- DCHECK(system_visual_id_);
+ DCHECK_NE(system_visual_id_, x11::VisualId{});
DCHECK(visuals_.find(system_visual_id_) != visuals_.end());
// Choose the transparent visual.
@@ -1437,119 +1499,98 @@ XVisualManager::XVisualManager()
// Why support only 8888 ARGB? Because it's all that GTK+ supports. In
// gdkvisual-x11.cc, they look for this specific visual and use it for
// all their alpha channel using needs.
- const XVisualInfo& info = pair.second->visual_info;
- if (info.depth == 32 && info.visual->red_mask == 0xff0000 &&
- info.visual->green_mask == 0x00ff00 &&
- info.visual->blue_mask == 0x0000ff) {
- transparent_visual_id_ = info.visualid;
+ const auto& data = *pair.second;
+ if (data.depth == 32 && data.info->red_mask == 0xff0000 &&
+ data.info->green_mask == 0x00ff00 && data.info->blue_mask == 0x0000ff) {
+ transparent_visual_id_ = pair.first;
break;
}
}
- if (transparent_visual_id_)
+ if (transparent_visual_id_ != x11::VisualId{})
DCHECK(visuals_.find(transparent_visual_id_) != visuals_.end());
}
XVisualManager::~XVisualManager() = default;
void XVisualManager::ChooseVisualForWindow(bool want_argb_visual,
- Visual** visual,
- int* depth,
- Colormap* colormap,
+ x11::VisualId* visual_id,
+ uint8_t* depth,
bool* visual_has_alpha) {
base::AutoLock lock(lock_);
- bool use_argb = want_argb_visual && using_compositing_wm_ &&
+ bool use_argb = want_argb_visual && IsCompositingManagerPresent() &&
(using_software_rendering_ || have_gpu_argb_visual_);
- VisualID visual_id = use_argb && transparent_visual_id_
- ? transparent_visual_id_
- : system_visual_id_;
+ x11::VisualId visual = use_argb && transparent_visual_id_ != x11::VisualId{}
+ ? transparent_visual_id_
+ : system_visual_id_;
- bool success =
- GetVisualInfoImpl(visual_id, visual, depth, colormap, visual_has_alpha);
+ if (visual_id)
+ *visual_id = visual;
+ bool success = GetVisualInfoImpl(visual, depth, visual_has_alpha);
DCHECK(success);
}
-bool XVisualManager::GetVisualInfo(VisualID visual_id,
- Visual** visual,
- int* depth,
- Colormap* colormap,
+bool XVisualManager::GetVisualInfo(x11::VisualId visual_id,
+ uint8_t* depth,
bool* visual_has_alpha) {
base::AutoLock lock(lock_);
- return GetVisualInfoImpl(visual_id, visual, depth, colormap,
- visual_has_alpha);
+ return GetVisualInfoImpl(visual_id, depth, visual_has_alpha);
}
bool XVisualManager::OnGPUInfoChanged(bool software_rendering,
- VisualID system_visual_id,
- VisualID transparent_visual_id) {
+ x11::VisualId system_visual_id,
+ x11::VisualId transparent_visual_id) {
base::AutoLock lock(lock_);
// TODO(thomasanderson): Cache these visual IDs as a property of the root
// window so that newly created browser processes can get them immediately.
- if ((system_visual_id && !visuals_.count(system_visual_id)) ||
- (transparent_visual_id && !visuals_.count(transparent_visual_id)))
+ if ((system_visual_id != x11::VisualId{} &&
+ !visuals_.count(system_visual_id)) ||
+ (transparent_visual_id != x11::VisualId{} &&
+ !visuals_.count(transparent_visual_id)))
return false;
using_software_rendering_ = software_rendering;
- have_gpu_argb_visual_ = have_gpu_argb_visual_ || transparent_visual_id;
- if (system_visual_id)
+ have_gpu_argb_visual_ =
+ have_gpu_argb_visual_ || transparent_visual_id != x11::VisualId{};
+ if (system_visual_id != x11::VisualId{})
system_visual_id_ = system_visual_id;
- if (transparent_visual_id)
+ if (transparent_visual_id != x11::VisualId{})
transparent_visual_id_ = transparent_visual_id;
return true;
}
bool XVisualManager::ArgbVisualAvailable() const {
base::AutoLock lock(lock_);
- return using_compositing_wm_ &&
+ return IsCompositingManagerPresent() &&
(using_software_rendering_ || have_gpu_argb_visual_);
}
-bool XVisualManager::GetVisualInfoImpl(VisualID visual_id,
- Visual** visual,
- int* depth,
- Colormap* colormap,
+bool XVisualManager::GetVisualInfoImpl(x11::VisualId visual_id,
+ uint8_t* depth,
bool* visual_has_alpha) {
auto it = visuals_.find(visual_id);
if (it == visuals_.end())
return false;
- XVisualData& visual_data = *it->second;
- const XVisualInfo& visual_info = visual_data.visual_info;
-
- bool is_default_visual = visual_id == default_visual_id_;
+ XVisualData& data = *it->second;
+ const x11::VisualType& info = *data.info;
- if (visual)
- *visual = visual_info.visual;
if (depth)
- *depth = visual_info.depth;
- if (colormap)
- *colormap =
- is_default_visual ? 0 /* CopyFromParent */ : visual_data.GetColormap();
+ *depth = data.depth;
if (visual_has_alpha) {
auto popcount = [](auto x) {
return std::bitset<8 * sizeof(decltype(x))>(x).count();
};
- *visual_has_alpha = popcount(visual_info.red_mask) +
- popcount(visual_info.green_mask) +
- popcount(visual_info.blue_mask) <
- static_cast<std::size_t>(visual_info.depth);
+ *visual_has_alpha = popcount(info.red_mask) + popcount(info.green_mask) +
+ popcount(info.blue_mask) <
+ static_cast<std::size_t>(data.depth);
}
return true;
}
-XVisualManager::XVisualData::XVisualData(XVisualInfo visual_info)
- : visual_info(visual_info), colormap_(0 /* CopyFromParent */) {}
+XVisualManager::XVisualData::XVisualData(uint8_t depth,
+ const x11::VisualType* info)
+ : depth(depth), info(info) {}
-// Do not XFreeColormap as this would uninstall the colormap even for
-// non-Chromium clients.
XVisualManager::XVisualData::~XVisualData() = default;
-Colormap XVisualManager::XVisualData::GetColormap() {
- XDisplay* display = gfx::GetXDisplay();
- if (colormap_ == 0 /* CopyFromParent */) {
- colormap_ = XCreateColormap(display, DefaultRootWindow(display),
- visual_info.visual, AllocNone);
- }
- return colormap_;
-}
-
// ----------------------------------------------------------------------------
// End of x11_util_internal.h
diff --git a/chromium/ui/base/x/x11_util.h b/chromium/ui/base/x/x11_util.h
index ff1dd2c5635..4c7c574a921 100644
--- a/chromium/ui/base/x/x11_util.h
+++ b/chromium/ui/base/x/x11_util.h
@@ -21,10 +21,12 @@
#include "base/containers/flat_set.h"
#include "base/macros.h"
#include "base/memory/ref_counted_memory.h"
+#include "ui/base/cursor/mojom/cursor_type.mojom-forward.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/event.h"
#include "ui/gfx/x/x11_types.h"
typedef unsigned long Cursor;
@@ -38,9 +40,195 @@ class SkBitmap;
namespace ui {
+enum WmState : uint32_t {
+ WM_STATE_WITHDRAWN = 0,
+ WM_STATE_NORMAL = 1,
+ WM_STATE_ICONIC = 3,
+};
+
+enum SizeHintsFlags : int32_t {
+ SIZE_HINT_US_POSITION = 1 << 0,
+ SIZE_HINT_US_SIZE = 1 << 1,
+ SIZE_HINT_P_POSITION = 1 << 2,
+ SIZE_HINT_P_SIZE = 1 << 3,
+ SIZE_HINT_P_MIN_SIZE = 1 << 4,
+ SIZE_HINT_P_MAX_SIZE = 1 << 5,
+ SIZE_HINT_P_RESIZE_INC = 1 << 6,
+ SIZE_HINT_P_ASPECT = 1 << 7,
+ SIZE_HINT_BASE_SIZE = 1 << 8,
+ SIZE_HINT_P_WIN_GRAVITY = 1 << 9,
+};
+
+struct SizeHints {
+ // User specified flags
+ int32_t flags;
+ // User-specified position
+ int32_t x, y;
+ // User-specified size
+ int32_t width, height;
+ // Program-specified minimum size
+ int32_t min_width, min_height;
+ // Program-specified maximum size
+ int32_t max_width, max_height;
+ // Program-specified resize increments
+ int32_t width_inc, height_inc;
+ // Program-specified minimum aspect ratios
+ int32_t min_aspect_num, min_aspect_den;
+ // Program-specified maximum aspect ratios
+ int32_t max_aspect_num, max_aspect_den;
+ // Program-specified base size
+ int32_t base_width, base_height;
+ // Program-specified window gravity
+ uint32_t win_gravity;
+};
+
+enum WmHintsFlags : uint32_t {
+ WM_HINT_INPUT = 1L << 0,
+ WM_HINT_STATE = 1L << 1,
+ WM_HINT_ICON_PIXMAP = 1L << 2,
+ WM_HINT_ICON_WINDOW = 1L << 3,
+ WM_HINT_ICON_POSITION = 1L << 4,
+ WM_HINT_ICON_MASK = 1L << 5,
+ WM_HINT_WINDOW_GROUP = 1L << 6,
+ // 1L << 7 doesn't have any defined meaning
+ WM_HINT_X_URGENCY = 1L << 8
+};
+
+struct WmHints {
+ // Marks which fields in this structure are defined
+ int32_t flags;
+ // Does this application rely on the window manager to get keyboard input?
+ uint32_t input;
+ // See below
+ int32_t initial_state;
+ // Pixmap to be used as icon
+ xcb_pixmap_t icon_pixmap;
+ // Window to be used as icon
+ xcb_window_t icon_window;
+ // Initial position of icon
+ int32_t icon_x, icon_y;
+ // Icon mask bitmap
+ xcb_pixmap_t icon_mask;
+ // Identifier of related window group
+ xcb_window_t window_group;
+};
+
// These functions use the default display and this /must/ be called from
// the UI thread. Thus, they don't support multiple displays.
+template <typename T>
+bool GetArrayProperty(x11::Window window,
+ x11::Atom name,
+ std::vector<T>* value,
+ x11::Atom* out_type = nullptr,
+ size_t amount = 0) {
+ static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "");
+
+ size_t bytes = amount * sizeof(T);
+ // The length field specifies the maximum amount of data we would like the
+ // server to give us. It's specified in units of 4 bytes, so divide by 4.
+ // Add 3 before division to round up.
+ size_t length = (bytes + 3) / 4;
+ 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()})
+ .Sync();
+ if (!response || response->format != CHAR_BIT * sizeof(T))
+ return false;
+
+ DCHECK_EQ(response->format / CHAR_BIT * response->value_len,
+ response->value.size());
+ value->resize(response->value_len);
+ memcpy(value->data(), response->value.data(), response->value.size());
+ if (out_type)
+ *out_type = response->type;
+ return true;
+}
+
+template <typename T>
+bool GetProperty(x11::Window window, const x11::Atom name, T* value) {
+ std::vector<T> values;
+ if (!GetArrayProperty(window, name, &values, nullptr, 1) || values.empty())
+ return false;
+ *value = values[0];
+ return true;
+}
+
+template <typename T>
+void SetArrayProperty(x11::Window window,
+ x11::Atom name,
+ x11::Atom type,
+ const std::vector<T>& values) {
+ 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 = data});
+}
+
+template <typename T>
+void SetProperty(x11::Window window,
+ x11::Atom name,
+ x11::Atom type,
+ const T& value) {
+ SetArrayProperty(window, name, type, std::vector<T>{value});
+}
+
+template <typename T>
+void SendEvent(const T& event, x11::Window target, x11::EventMask mask) {
+ static_assert(T::type_id > 0, "T must be an x11::*Event type");
+ auto event_bytes = x11::Write(event);
+ DCHECK_LE(event_bytes.size(), 32ul);
+ event_bytes.resize(32);
+
+ x11::SendEventRequest send_event{false, target, mask};
+ std::copy(event_bytes.begin(), event_bytes.end(), send_event.event.begin());
+ x11::Connection::Get()->SendEvent(send_event);
+}
+
+COMPONENT_EXPORT(UI_BASE_X)
+void DeleteProperty(x11::Window window, x11::Atom name);
+
+COMPONENT_EXPORT(UI_BASE_X)
+bool GetWmNormalHints(x11::Window window, SizeHints* hints);
+
+COMPONENT_EXPORT(UI_BASE_X)
+void SetWmNormalHints(x11::Window window, const SizeHints& hints);
+
+COMPONENT_EXPORT(UI_BASE_X)
+bool GetWmHints(x11::Window window, WmHints* hints);
+
+COMPONENT_EXPORT(UI_BASE_X)
+void SetWmHints(x11::Window window, const WmHints& hints);
+
+COMPONENT_EXPORT(UI_BASE_X)
+void WithdrawWindow(x11::Window window);
+
+COMPONENT_EXPORT(UI_BASE_X)
+void RaiseWindow(x11::Window window);
+
+COMPONENT_EXPORT(UI_BASE_X)
+void LowerWindow(x11::Window window);
+
+COMPONENT_EXPORT(UI_BASE_X)
+void DefineCursor(x11::Window window, x11::Cursor cursor);
+
+COMPONENT_EXPORT(UI_BASE_X)
+x11::Window CreateDummyWindow(const std::string& name = "");
+
+COMPONENT_EXPORT(UI_BASE_X)
+x11::KeyCode KeysymToKeycode(x11::Connection* connection, x11::KeySym keysym);
+
// These functions cache their results ---------------------------------
// Returns true if the system supports XINPUT2.
@@ -73,11 +261,16 @@ COMPONENT_EXPORT(UI_BASE_X)
XcursorImage* SkBitmapToXcursorImage(const SkBitmap& bitmap,
const gfx::Point& hotspot);
+// Loads and returns an X11 cursor, trying to find one that matches |type|. If
+// unavailable, x11::None is returned.
+COMPONENT_EXPORT(UI_BASE_X)
+::Cursor LoadCursorFromType(mojom::CursorType type);
+
// Coalesce all pending motion events (touch or mouse) that are at the top of
// the queue, and return the number eliminated, storing the last one in
// |last_event|.
COMPONENT_EXPORT(UI_BASE_X)
-int CoalescePendingMotionEvents(const XEvent* xev, XEvent* last_event);
+int CoalescePendingMotionEvents(const x11::Event* xev, x11::Event* last_event);
// Hides the host cursor.
COMPONENT_EXPORT(UI_BASE_X) void HideHostCursor();
@@ -87,7 +280,7 @@ COMPONENT_EXPORT(UI_BASE_X)::Cursor CreateInvisibleCursor();
// Sets whether |window| should use the OS window frame.
COMPONENT_EXPORT(UI_BASE_X)
-void SetUseOSWindowFrame(XID window, bool use_os_window_frame);
+void SetUseOSWindowFrame(x11::Window window, bool use_os_window_frame);
// These functions do not cache their results --------------------------
@@ -95,122 +288,123 @@ void SetUseOSWindowFrame(XID window, bool use_os_window_frame);
COMPONENT_EXPORT(UI_BASE_X) bool IsShapeExtensionAvailable();
// Get the X window id for the default root window
-COMPONENT_EXPORT(UI_BASE_X) XID GetX11RootWindow();
+COMPONENT_EXPORT(UI_BASE_X) x11::Window GetX11RootWindow();
// Returns the user's current desktop.
COMPONENT_EXPORT(UI_BASE_X) bool GetCurrentDesktop(int* desktop);
-enum HideTitlebarWhenMaximized {
+enum HideTitlebarWhenMaximized : uint32_t {
SHOW_TITLEBAR_WHEN_MAXIMIZED = 0,
HIDE_TITLEBAR_WHEN_MAXIMIZED = 1,
};
// Sets _GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED on |window|.
COMPONENT_EXPORT(UI_BASE_X)
-void SetHideTitlebarWhenMaximizedProperty(XID window,
+void SetHideTitlebarWhenMaximizedProperty(x11::Window window,
HideTitlebarWhenMaximized property);
// Clears all regions of X11's default root window by filling black pixels.
COMPONENT_EXPORT(UI_BASE_X) void ClearX11DefaultRootWindow();
// Returns true if |window| is visible.
-COMPONENT_EXPORT(UI_BASE_X) bool IsWindowVisible(XID window);
+COMPONENT_EXPORT(UI_BASE_X) bool IsWindowVisible(x11::Window window);
// Returns the inner bounds of |window| (excluding the non-client area).
COMPONENT_EXPORT(UI_BASE_X)
-bool GetInnerWindowBounds(XID window, gfx::Rect* rect);
+bool GetInnerWindowBounds(x11::Window window, gfx::Rect* rect);
// Returns the non-client area extents of |window|. This is a negative inset; it
// represents the negative size of the window border on all sides.
// InnerWindowBounds.Inset(WindowExtents) = OuterWindowBounds.
// Returns false if the window manager does not provide extents information.
COMPONENT_EXPORT(UI_BASE_X)
-bool GetWindowExtents(XID window, gfx::Insets* extents);
+bool GetWindowExtents(x11::Window window, gfx::Insets* extents);
// Returns the outer bounds of |window| (including the non-client area).
COMPONENT_EXPORT(UI_BASE_X)
-bool GetOuterWindowBounds(XID window, gfx::Rect* rect);
+bool GetOuterWindowBounds(x11::Window window, gfx::Rect* rect);
// Returns true if |window| contains the point |screen_loc|.
COMPONENT_EXPORT(UI_BASE_X)
-bool WindowContainsPoint(XID window, gfx::Point screen_loc);
+bool WindowContainsPoint(x11::Window window, gfx::Point screen_loc);
// Return true if |window| has any property with |property_name|.
COMPONENT_EXPORT(UI_BASE_X)
-bool PropertyExists(XID window, const std::string& property_name);
+bool PropertyExists(x11::Window window, const std::string& property_name);
// Returns the raw bytes from a property with minimal
// interpretation. |out_data| should be freed by XFree() after use.
COMPONENT_EXPORT(UI_BASE_X)
-bool GetRawBytesOfProperty(XID window,
- XAtom property,
- scoped_refptr<base::RefCountedMemory>* out_data,
- size_t* out_data_items,
- XAtom* out_type);
+bool GetRawBytesOfProperty(x11::Window window,
+ x11::Atom property,
+ std::vector<uint8_t>* out_data,
+ x11::Atom* out_type);
// Get the value of an int, int array, atom array or string property. On
// success, true is returned and the value is stored in |value|.
//
-// TODO(erg): Once we remove the gtk port and are 100% aura, all of these
-// should accept an XAtom instead of a string.
-COMPONENT_EXPORT(UI_BASE_X)
-bool GetIntProperty(XID window, const std::string& property_name, int* value);
+// These functions should no longer be used. TODO(thomasanderson): migrate
+// existing callers to {Set,Get}{,Array}Property<> instead.
COMPONENT_EXPORT(UI_BASE_X)
-bool GetXIDProperty(XID window, const std::string& property_name, XID* value);
+bool GetIntProperty(x11::Window window,
+ const std::string& property_name,
+ int32_t* value);
COMPONENT_EXPORT(UI_BASE_X)
-bool GetIntArrayProperty(XID window,
+bool GetIntArrayProperty(x11::Window window,
const std::string& property_name,
- std::vector<int>* value);
+ std::vector<int32_t>* value);
COMPONENT_EXPORT(UI_BASE_X)
-bool GetAtomArrayProperty(XID window,
+bool GetAtomArrayProperty(x11::Window window,
const std::string& property_name,
- std::vector<XAtom>* value);
+ std::vector<x11::Atom>* value);
COMPONENT_EXPORT(UI_BASE_X)
-bool GetStringProperty(XID window,
+bool GetStringProperty(x11::Window window,
const std::string& property_name,
std::string* value);
-// These setters all make round trips.
COMPONENT_EXPORT(UI_BASE_X)
-bool SetIntProperty(XID window,
+void SetIntProperty(x11::Window window,
const std::string& name,
const std::string& type,
- int value);
+ int32_t value);
COMPONENT_EXPORT(UI_BASE_X)
-bool SetIntArrayProperty(XID window,
+void SetIntArrayProperty(x11::Window window,
const std::string& name,
const std::string& type,
- const std::vector<int>& value);
+ const std::vector<int32_t>& value);
COMPONENT_EXPORT(UI_BASE_X)
-bool SetAtomProperty(XID window,
+void SetAtomProperty(x11::Window window,
const std::string& name,
const std::string& type,
- XAtom value);
+ x11::Atom value);
COMPONENT_EXPORT(UI_BASE_X)
-bool SetAtomArrayProperty(XID window,
+void SetAtomArrayProperty(x11::Window window,
const std::string& name,
const std::string& type,
- const std::vector<XAtom>& value);
+ const std::vector<x11::Atom>& value);
COMPONENT_EXPORT(UI_BASE_X)
-bool SetStringProperty(XID window,
- XAtom property,
- XAtom type,
+void SetStringProperty(x11::Window window,
+ x11::Atom property,
+ x11::Atom type,
const std::string& value);
// Sets the WM_CLASS attribute for a given X11 window.
COMPONENT_EXPORT(UI_BASE_X)
-void SetWindowClassHint(XDisplay* display,
- XID window,
+void SetWindowClassHint(x11::Connection* connection,
+ x11::Window window,
const std::string& res_name,
const std::string& res_class);
// Sets the WM_WINDOW_ROLE attribute for a given X11 window.
COMPONENT_EXPORT(UI_BASE_X)
-void SetWindowRole(XDisplay* display, XID window, const std::string& role);
+void SetWindowRole(x11::Window window, const std::string& role);
// Sends a message to the x11 window manager, enabling or disabling the
// states |state1| and |state2|.
COMPONENT_EXPORT(UI_BASE_X)
-void SetWMSpecState(XID window, bool enabled, XAtom state1, XAtom state2);
+void SetWMSpecState(x11::Window window,
+ bool enabled,
+ x11::Atom state1,
+ x11::Atom state2);
// Sends a NET_WM_MOVERESIZE message to the x11 window manager, enabling the
// move/resize mode. As per NET_WM_MOVERESIZE spec, |location| is the position
@@ -218,15 +412,16 @@ void SetWMSpecState(XID window, bool enabled, XAtom state1, XAtom state2);
// |direction| indicates whether this is a move or resize event, and if it is a
// resize event, which edges of the window the size grip applies to.
COMPONENT_EXPORT(UI_BASE_X)
-void DoWMMoveResize(XDisplay* display,
- XID root_window,
- XID window,
+void DoWMMoveResize(x11::Connection* connection,
+ x11::Window root_window,
+ x11::Window window,
const gfx::Point& location_px,
int direction);
// Checks if the window manager has set a specific state.
COMPONENT_EXPORT(UI_BASE_X)
-bool HasWMSpecProperty(const base::flat_set<XAtom>& properties, XAtom atom);
+bool HasWMSpecProperty(const base::flat_set<x11::Atom>& properties,
+ x11::Atom atom);
// Determine whether we should default to native decorations or the custom
// frame based on the currently-running window manager.
@@ -235,7 +430,8 @@ COMPONENT_EXPORT(UI_BASE_X) bool GetCustomFramePrefDefault();
static const int kAllDesktops = -1;
// Queries the desktop |window| is on, kAllDesktops if sticky. Returns false if
// property not found.
-COMPONENT_EXPORT(UI_BASE_X) bool GetWindowDesktop(XID window, int* desktop);
+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)
@@ -245,12 +441,12 @@ std::string GetX11ErrorString(XDisplay* display, int err);
// the main display.
class EnumerateWindowsDelegate {
public:
- // |xid| is the X Window ID of the enumerated window. Return true to stop
+ // |window| is the X Window ID of the enumerated window. Return true to stop
// further iteration.
- virtual bool ShouldStopIterating(XID xid) = 0;
+ virtual bool ShouldStopIterating(x11::Window window) = 0;
protected:
- virtual ~EnumerateWindowsDelegate() {}
+ virtual ~EnumerateWindowsDelegate() = default;
};
// Enumerates all windows in the current display. Will recurse into child
@@ -265,7 +461,7 @@ void EnumerateTopLevelWindows(ui::EnumerateWindowsDelegate* delegate);
// Returns all children windows of a given window in top-to-bottom stacking
// order.
COMPONENT_EXPORT(UI_BASE_X)
-bool GetXWindowStack(XID window, std::vector<XID>* windows);
+bool GetXWindowStack(x11::Window window, std::vector<x11::Window>* windows);
enum WindowManagerName {
WM_OTHER, // We were able to obtain the WM's name, but there is
@@ -316,10 +512,10 @@ COMPONENT_EXPORT(UI_BASE_X) bool IsCompositingManagerPresent();
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(XID window);
+COMPONENT_EXPORT(UI_BASE_X) bool IsX11WindowFullScreen(x11::Window window);
// Returns true if the window manager supports the given hint.
-COMPONENT_EXPORT(UI_BASE_X) bool WmSupportsHint(XAtom atom);
+COMPONENT_EXPORT(UI_BASE_X) bool WmSupportsHint(x11::Atom atom);
// Returns the ICCProfile corresponding to |monitor| using XGetWindowProperty.
COMPONENT_EXPORT(UI_BASE_X)
@@ -333,6 +529,15 @@ COMPONENT_EXPORT(UI_BASE_X) bool IsSyncExtensionAvailable();
COMPONENT_EXPORT(UI_BASE_X)
SkColorType ColorTypeForVisual(void* visual);
+COMPONENT_EXPORT(UI_BASE_X)
+x11::Future<void> SendClientMessage(
+ x11::Window window,
+ x11::Window target,
+ x11::Atom type,
+ const std::array<uint32_t, 5> data,
+ x11::EventMask event_mask = x11::EventMask::SubstructureNotify |
+ x11::EventMask::SubstructureRedirect);
+
// Manages a piece of X11 allocated memory as a RefCountedMemory segment. This
// object takes ownership over the passed in memory and will free it with the
// X11 allocator when done.
diff --git a/chromium/ui/base/x/x11_util_internal.h b/chromium/ui/base/x/x11_util_internal.h
index cd97da64e02..705c606c7b5 100644
--- a/chromium/ui/base/x/x11_util_internal.h
+++ b/chromium/ui/base/x/x11_util_internal.h
@@ -55,18 +55,14 @@ class COMPONENT_EXPORT(UI_BASE_X) XVisualManager {
public:
static XVisualManager* GetInstance();
- // Picks the best argb or opaque visual given |want_argb_visual|. If the
- // default visual is returned, |colormap| is set to CopyFromParent.
+ // Picks the best argb or opaque visual given |want_argb_visual|.
void ChooseVisualForWindow(bool want_argb_visual,
- Visual** visual,
- int* depth,
- Colormap* colormap,
+ x11::VisualId* visual_id,
+ uint8_t* depth,
bool* visual_has_alpha);
- bool GetVisualInfo(VisualID visual_id,
- Visual** visual,
- int* depth,
- Colormap* colormap,
+ bool GetVisualInfo(x11::VisualId visual_id,
+ uint8_t* depth,
bool* visual_has_alpha);
// Called by GpuDataManagerImplPrivate when GPUInfo becomes available. It is
@@ -74,8 +70,8 @@ class COMPONENT_EXPORT(UI_BASE_X) XVisualManager {
// because we don't want to load GL in the browser process. Returns false iff
// |default_visual_id| or |transparent_visual_id| are invalid.
bool OnGPUInfoChanged(bool software_rendering,
- VisualID default_visual_id,
- VisualID transparent_visual_id);
+ x11::VisualId default_visual_id,
+ x11::VisualId transparent_visual_id);
// Are all of the system requirements met for using transparent visuals?
bool ArgbVisualAvailable() const;
@@ -87,41 +83,34 @@ class COMPONENT_EXPORT(UI_BASE_X) XVisualManager {
class XVisualData {
public:
- explicit XVisualData(XVisualInfo visual_info);
+ XVisualData(uint8_t depth, const x11::VisualType* info);
~XVisualData();
- Colormap GetColormap();
-
- const XVisualInfo visual_info;
-
- private:
- Colormap colormap_;
+ uint8_t depth = 0;
+ const x11::VisualType* info = nullptr;
};
XVisualManager();
- bool GetVisualInfoImpl(VisualID visual_id,
- Visual** visual,
- int* depth,
- Colormap* colormap,
+ bool GetVisualInfoImpl(x11::VisualId visual_id,
+ uint8_t* depth,
bool* visual_has_alpha);
mutable base::Lock lock_;
- std::unordered_map<VisualID, std::unique_ptr<XVisualData>> visuals_;
+ std::unordered_map<x11::VisualId, std::unique_ptr<XVisualData>> visuals_;
- XDisplay* display_;
+ x11::Connection* const connection_;
- VisualID default_visual_id_;
+ x11::VisualId default_visual_id_{};
// The system visual is usually the same as the default visual, but
// may not be in general.
- VisualID system_visual_id_;
- VisualID transparent_visual_id_;
+ x11::VisualId system_visual_id_{};
+ x11::VisualId transparent_visual_id_{};
- bool using_compositing_wm_;
- bool using_software_rendering_;
- bool have_gpu_argb_visual_;
+ bool using_software_rendering_ = false;
+ bool have_gpu_argb_visual_ = false;
DISALLOW_COPY_AND_ASSIGN(XVisualManager);
};
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 2f7aaf4037a..39f4d0c12aa 100644
--- a/chromium/ui/base/x/x11_whole_screen_move_loop.cc
+++ b/chromium/ui/base/x/x11_whole_screen_move_loop.cc
@@ -26,25 +26,34 @@
#include "ui/events/platform/x11/x11_event_source.h"
#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"
namespace ui {
+namespace {
+
+constexpr x11::KeySym kEscKeysym = static_cast<x11::KeySym>(0xff1b);
+
// XGrabKey requires the modifier mask to explicitly be specified.
-const unsigned int kModifiersMasks[] = {0, // No additional modifier.
- Mod2Mask, // Num lock
- LockMask, // Caps lock
- Mod5Mask, // Scroll lock
- Mod2Mask | LockMask,
- Mod2Mask | Mod5Mask,
- LockMask | Mod5Mask,
- Mod2Mask | LockMask | Mod5Mask};
+constexpr x11::ModMask kModifiersMasks[] = {
+ {}, // No additional modifier.
+ x11::ModMask::c_2, // Num lock
+ x11::ModMask::Lock, // Caps lock
+ x11::ModMask::c_5, // Scroll lock
+ x11::ModMask::c_2 | x11::ModMask::Lock,
+ x11::ModMask::c_2 | x11::ModMask::c_5,
+ x11::ModMask::Lock | x11::ModMask::c_5,
+ x11::ModMask::c_2 | x11::ModMask::Lock | x11::ModMask::c_5,
+};
+
+} // namespace
X11WholeScreenMoveLoop::X11WholeScreenMoveLoop(X11MoveLoopDelegate* delegate)
: delegate_(delegate),
in_move_loop_(false),
initial_cursor_(x11::None),
- grab_input_window_(x11::None),
+ grab_input_window_(x11::Window::None),
grabbed_pointer_(false),
canceled_(false) {}
@@ -131,7 +140,7 @@ bool X11WholeScreenMoveLoop::RunMoveLoop(bool can_grab_pointer,
// restored when the move loop finishes.
initial_cursor_ = old_cursor;
- CreateDragInputWindow(gfx::GetXDisplay());
+ CreateDragInputWindow(x11::Connection::Get());
// Only grab mouse capture of |grab_input_window_| if |can_grab_pointer| is
// true aka the source that initiated the move loop doesn't have explicit
@@ -145,7 +154,7 @@ bool X11WholeScreenMoveLoop::RunMoveLoop(bool can_grab_pointer,
if (can_grab_pointer) {
grabbed_pointer_ = GrabPointer(new_cursor);
if (!grabbed_pointer_) {
- XDestroyWindow(gfx::GetXDisplay(), grab_input_window_);
+ x11::Connection::Get()->DestroyWindow({grab_input_window_});
return false;
}
}
@@ -194,59 +203,65 @@ void X11WholeScreenMoveLoop::EndMoveLoop() {
else
UpdateCursor(initial_cursor_);
- XDisplay* display = gfx::GetXDisplay();
- unsigned int esc_keycode = XKeysymToKeycode(display, XK_Escape);
+ auto* connection = x11::Connection::Get();
+ auto esc_keycode = KeysymToKeycode(connection, kEscKeysym);
for (auto mask : kModifiersMasks)
- XUngrabKey(display, esc_keycode, mask, grab_input_window_);
+ connection->UngrabKey({esc_keycode, grab_input_window_, mask});
// Restore the previous dispatcher.
nested_dispatcher_.reset();
delegate_->OnMoveLoopEnded();
grab_input_window_events_.reset();
- XDestroyWindow(display, grab_input_window_);
- grab_input_window_ = x11::None;
+ connection->DestroyWindow({grab_input_window_});
+ grab_input_window_ = x11::Window::None;
in_move_loop_ = false;
std::move(quit_closure_).Run();
}
bool X11WholeScreenMoveLoop::GrabPointer(::Cursor cursor) {
- XDisplay* display = gfx::GetXDisplay();
+ auto* connection = x11::Connection::Get();
// Pass "owner_events" as false so that X sends all mouse events to
// |grab_input_window_|.
int ret = ui::GrabPointer(grab_input_window_, false, cursor);
if (ret != GrabSuccess) {
DLOG(ERROR) << "Grabbing pointer for dragging failed: "
- << ui::GetX11ErrorString(display, ret);
+ << ui::GetX11ErrorString(connection->display(), ret);
}
- XFlush(display);
+ connection->Flush();
return ret == GrabSuccess;
}
void X11WholeScreenMoveLoop::GrabEscKey() {
- XDisplay* display = gfx::GetXDisplay();
- unsigned int esc_keycode = XKeysymToKeycode(display, XK_Escape);
+ auto* connection = x11::Connection::Get();
+ auto esc_keycode = KeysymToKeycode(connection, kEscKeysym);
for (auto mask : kModifiersMasks) {
- XGrabKey(display, esc_keycode, mask, grab_input_window_, x11::False,
- GrabModeAsync, GrabModeAsync);
+ connection->GrabKey({false, grab_input_window_, mask, esc_keycode,
+ x11::GrabMode::Async, x11::GrabMode::Async});
}
}
-void X11WholeScreenMoveLoop::CreateDragInputWindow(XDisplay* display) {
- XSetWindowAttributes swa;
- memset(&swa, 0, sizeof(swa));
- swa.override_redirect = x11::True;
- grab_input_window_ = XCreateWindow(display, DefaultRootWindow(display), -100,
- -100, 10, 10, 0, CopyFromParent, InputOnly,
- CopyFromParent, CWOverrideRedirect, &swa);
+void X11WholeScreenMoveLoop::CreateDragInputWindow(
+ x11::Connection* connection) {
+ grab_input_window_ = connection->GenerateId<x11::Window>();
+ connection->CreateWindow({
+ .wid = grab_input_window_,
+ .parent = connection->default_root(),
+ .x = -100,
+ .y = -100,
+ .width = 10,
+ .height = 10,
+ .c_class = x11::WindowClass::InputOnly,
+ .override_redirect = x11::Bool32(true),
+ });
uint32_t event_mask = ButtonPressMask | ButtonReleaseMask |
PointerMotionMask | KeyPressMask | KeyReleaseMask |
StructureNotifyMask;
grab_input_window_events_ = std::make_unique<ui::XScopedEventSelector>(
grab_input_window_, event_mask);
-
- XMapRaised(display, grab_input_window_);
+ connection->MapWindow({grab_input_window_});
+ RaiseWindow(grab_input_window_);
}
} // namespace ui
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 1132b905529..eae75d85f04 100644
--- a/chromium/ui/base/x/x11_whole_screen_move_loop.h
+++ b/chromium/ui/base/x/x11_whole_screen_move_loop.h
@@ -55,7 +55,7 @@ class COMPONENT_EXPORT(UI_BASE_X) X11WholeScreenMoveLoop
void GrabEscKey();
// Creates an input-only window to be used during the drag.
- void CreateDragInputWindow(XDisplay* display);
+ void CreateDragInputWindow(x11::Connection* connection);
// Dispatch mouse movement event to |delegate_| in a posted task.
void DispatchMouseMovement();
@@ -74,7 +74,7 @@ class COMPONENT_EXPORT(UI_BASE_X) X11WholeScreenMoveLoop
// An invisible InputOnly window. Keyboard grab and sometimes mouse grab
// are set on this window.
- XID grab_input_window_;
+ x11::Window grab_input_window_;
// Events selected on |grab_input_window_|.
std::unique_ptr<ui::XScopedEventSelector> grab_input_window_events_;
diff --git a/chromium/ui/base/x/x11_window.cc b/chromium/ui/base/x/x11_window.cc
index 70f520bccd4..bc5f4fefa7a 100644
--- a/chromium/ui/base/x/x11_window.cc
+++ b/chromium/ui/base/x/x11_window.cc
@@ -13,6 +13,7 @@
#include "base/strings/utf_string_conversions.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
+#include "net/base/network_interfaces.h"
#include "third_party/skia/include/core/SkRegion.h"
#include "ui/base/hit_test_x11.h"
#include "ui/base/wm_role_names_linux.h"
@@ -31,9 +32,13 @@
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/image/image_skia_rep.h"
#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"
+#include "ui/gfx/x/xproto.h"
#include "ui/platform_window/common/platform_window_defaults.h"
namespace ui {
@@ -46,7 +51,7 @@ const int kAllWorkspaces = 0xFFFFFFFF;
constexpr char kX11WindowRolePopup[] = "popup";
constexpr char kX11WindowRoleBubble[] = "bubble";
-constexpr unsigned char kDarkGtkThemeVariant[] = "dark";
+constexpr char kDarkGtkThemeVariant[] = "dark";
constexpr long kSystemTrayRequestDock = 0;
@@ -54,6 +59,11 @@ constexpr int kXembedInfoProtocolVersion = 0;
constexpr int kXembedFlagMap = 1 << 0;
constexpr int kXembedInfoFlags = kXembedFlagMap;
+enum CrossingFlags : uint8_t {
+ CROSSING_FLAG_FOCUS = 1 << 0,
+ CROSSING_FLAG_SAME_SCREEN = 1 << 1,
+};
+
// In some situations, views tries to make a zero sized window, and that
// makes us crash. Make sure we have valid sizes.
gfx::Rect SanitizeBounds(const gfx::Rect& bounds) {
@@ -64,59 +74,76 @@ gfx::Rect SanitizeBounds(const gfx::Rect& bounds) {
}
void SerializeImageRepresentation(const gfx::ImageSkiaRep& rep,
- std::vector<unsigned long>* data) {
- int width = rep.GetWidth();
+ std::vector<uint32_t>* data) {
+ uint32_t width = rep.GetWidth();
data->push_back(width);
- int height = rep.GetHeight();
+ uint32_t height = rep.GetHeight();
data->push_back(height);
const SkBitmap& bitmap = rep.GetBitmap();
- for (int y = 0; y < height; ++y)
- for (int x = 0; x < width; ++x)
+ for (uint32_t y = 0; y < height; ++y)
+ for (uint32_t x = 0; x < width; ++x)
data->push_back(bitmap.getColor(x, y));
}
-int XI2ModeToXMode(int xi2_mode) {
+x11::NotifyMode XI2ModeToXMode(x11::Input::NotifyMode xi2_mode) {
switch (xi2_mode) {
- case XINotifyNormal:
- return NotifyNormal;
- case XINotifyGrab:
- case XINotifyPassiveGrab:
- return NotifyGrab;
- case XINotifyUngrab:
- case XINotifyPassiveUngrab:
- return NotifyUngrab;
- case XINotifyWhileGrabbed:
- return NotifyWhileGrabbed;
+ case x11::Input::NotifyMode::Normal:
+ return x11::NotifyMode::Normal;
+ case x11::Input::NotifyMode::Grab:
+ case x11::Input::NotifyMode::PassiveGrab:
+ return x11::NotifyMode::Grab;
+ case x11::Input::NotifyMode::Ungrab:
+ case x11::Input::NotifyMode::PassiveUngrab:
+ return x11::NotifyMode::Ungrab;
+ case x11::Input::NotifyMode::WhileGrabbed:
+ return x11::NotifyMode::WhileGrabbed;
default:
NOTREACHED();
- return NotifyNormal;
+ return x11::NotifyMode::Normal;
}
}
-bool SyncSetCounter(XDisplay* display, XID counter, int64_t value) {
- XSyncValue sync_value;
- XSyncIntsToValue(&sync_value, value & 0xFFFFFFFF, value >> 32);
- return XSyncSetCounter(display, counter, sync_value) == x11::True;
+x11::NotifyDetail XI2DetailToXDetail(x11::Input::NotifyDetail xi2_detail) {
+ switch (xi2_detail) {
+ case x11::Input::NotifyDetail::Ancestor:
+ return x11::NotifyDetail::Ancestor;
+ case x11::Input::NotifyDetail::Virtual:
+ return x11::NotifyDetail::Virtual;
+ case x11::Input::NotifyDetail::Inferior:
+ return x11::NotifyDetail::Inferior;
+ case x11::Input::NotifyDetail::Nonlinear:
+ return x11::NotifyDetail::Nonlinear;
+ case x11::Input::NotifyDetail::NonlinearVirtual:
+ return x11::NotifyDetail::NonlinearVirtual;
+ case x11::Input::NotifyDetail::Pointer:
+ return x11::NotifyDetail::Pointer;
+ case x11::Input::NotifyDetail::PointerRoot:
+ return x11::NotifyDetail::PointerRoot;
+ case x11::Input::NotifyDetail::None:
+ return x11::NotifyDetail::None;
+ }
}
-// Returns the whole path from |window| to the root.
-std::vector<::Window> GetParentsList(XDisplay* xdisplay, ::Window window) {
- ::Window parent_win, root_win;
- Window* child_windows;
- unsigned int num_child_windows;
- std::vector<::Window> result;
+void SyncSetCounter(x11::Connection* connection,
+ x11::Sync::Counter counter,
+ int64_t value) {
+ x11::Sync::Int64 sync_value{.hi = value >> 32, .lo = value & 0xFFFFFFFF};
+ connection->sync().SetCounter({counter, sync_value});
+}
- while (window) {
+// Returns the whole path from |window| to the root.
+std::vector<x11::Window> GetParentsList(x11::Connection* connection,
+ x11::Window window) {
+ std::vector<x11::Window> result;
+ while (window != x11::Window::None) {
result.push_back(window);
- if (!XQueryTree(xdisplay, window, &root_win, &parent_win, &child_windows,
- &num_child_windows))
+ if (auto reply = connection->QueryTree({window}).Sync())
+ window = reply->parent;
+ else
break;
- if (child_windows)
- XFree(child_windows);
- window = parent_win;
}
return result;
}
@@ -139,15 +166,15 @@ XWindow::Configuration::Configuration(const Configuration&) = default;
XWindow::Configuration::~Configuration() = default;
XWindow::XWindow()
- : xdisplay_(gfx::GetXDisplay()),
- x_root_window_(DefaultRootWindow(xdisplay_)) {
- DCHECK(xdisplay_);
- DCHECK_NE(x_root_window_, x11::None);
+ : connection_(x11::Connection::Get()), x_root_window_(GetX11RootWindow()) {
+ DCHECK(connection_);
+ DCHECK_NE(x_root_window_, x11::Window::None);
}
XWindow::~XWindow() {
- DCHECK_EQ(xwindow_, x11::None) << "XWindow destructed without calling "
- "Close() to release allocated resources.";
+ DCHECK_EQ(xwindow_, x11::Window::None)
+ << "XWindow destructed without calling "
+ "Close() to release allocated resources.";
}
void XWindow::Init(const Configuration& config) {
@@ -157,31 +184,28 @@ void XWindow::Init(const Configuration& config) {
activatable_ = config.activatable;
- unsigned long attribute_mask = CWBackPixel | CWBitGravity;
- XSetWindowAttributes swa;
- memset(&swa, 0, sizeof(swa));
- swa.background_pixmap = x11::None;
- swa.bit_gravity = NorthWestGravity;
- swa.background_pixel = config.background_color.has_value()
+ x11::CreateWindowRequest req;
+ req.bit_gravity = x11::Gravity::NorthWest;
+ req.background_pixel = config.background_color.has_value()
? config.background_color.value()
- : WhitePixel(xdisplay_, DefaultScreen(xdisplay_));
+ : connection_->default_screen().white_pixel;
- XAtom window_type;
+ x11::Atom window_type;
switch (config.type) {
case WindowType::kMenu:
- swa.override_redirect = x11::True;
+ req.override_redirect = x11::Bool32(true);
window_type = gfx::GetAtom("_NET_WM_WINDOW_TYPE_MENU");
break;
case WindowType::kTooltip:
- swa.override_redirect = x11::True;
+ req.override_redirect = x11::Bool32(true);
window_type = gfx::GetAtom("_NET_WM_WINDOW_TYPE_TOOLTIP");
break;
case WindowType::kPopup:
- swa.override_redirect = x11::True;
+ req.override_redirect = x11::Bool32(true);
window_type = gfx::GetAtom("_NET_WM_WINDOW_TYPE_NOTIFICATION");
break;
case WindowType::kDrag:
- swa.override_redirect = x11::True;
+ req.override_redirect = x11::Bool32(true);
window_type = gfx::GetAtom("_NET_WM_WINDOW_TYPE_DND");
break;
default:
@@ -190,7 +214,7 @@ void XWindow::Init(const Configuration& config) {
}
// An in-activatable window should not interact with the system wm.
if (!activatable_ || config.override_redirect)
- swa.override_redirect = x11::True;
+ req.override_redirect = x11::Bool32(true);
#if !defined(USE_X11)
// It seems like there is a difference how tests are instantiated in case of
@@ -204,12 +228,10 @@ void XWindow::Init(const Configuration& config) {
// here. Otherwise, tests for non-Ozone X11 fail.
// TODO(msisov): figure out usage of this for non-Ozone X11.
if (UseTestConfigForPlatformWindows())
- swa.override_redirect = true;
+ req.override_redirect = x11::Bool32(true);
#endif
- override_redirect_ = swa.override_redirect == x11::True;
- if (override_redirect_)
- attribute_mask |= CWOverrideRedirect;
+ override_redirect_ = req.override_redirect.has_value();
bool enable_transparent_visuals;
switch (config.opacity) {
@@ -223,44 +245,42 @@ void XWindow::Init(const Configuration& config) {
enable_transparent_visuals = config.type == WindowType::kDrag;
}
- int visual_id;
if (config.wm_role_name == kStatusIconWmRoleName) {
std::string atom_name =
- "_NET_SYSTEM_TRAY_S" + base::NumberToString(DefaultScreen(xdisplay_));
- XID manager =
- XGetSelectionOwner(xdisplay_, gfx::GetAtom(atom_name.c_str()));
- if (ui::GetIntProperty(manager, "_NET_SYSTEM_TRAY_VISUAL", &visual_id))
- visual_id_ = visual_id;
- }
-
- Visual* visual = CopyFromParent;
- int depth = CopyFromParent;
- Colormap colormap = CopyFromParent;
- ui::XVisualManager* visual_manager = ui::XVisualManager::GetInstance();
- if (!visual_id_ ||
- !visual_manager->GetVisualInfo(visual_id_, &visual, &depth, &colormap,
- &visual_has_alpha_)) {
- visual_manager->ChooseVisualForWindow(enable_transparent_visuals, &visual,
- &depth, &colormap,
- &visual_has_alpha_);
+ "_NET_SYSTEM_TRAY_S" +
+ base::NumberToString(connection_->DefaultScreenId());
+ auto selection = connection_->GetSelectionOwner({gfx::GetAtom(atom_name)});
+ if (auto reply = selection.Sync()) {
+ GetProperty(reply->owner, gfx::GetAtom("_NET_SYSTEM_TRAY_VISUAL"),
+ &visual_id_);
+ }
}
- if (colormap != CopyFromParent) {
- attribute_mask |= CWColormap;
- swa.colormap = colormap;
+ x11::VisualId visual_id = visual_id_;
+ uint8_t depth = 0;
+ XVisualManager* visual_manager = XVisualManager::GetInstance();
+ if (visual_id_ == x11::VisualId{} ||
+ !visual_manager->GetVisualInfo(visual_id_, &depth, &visual_has_alpha_)) {
+ visual_manager->ChooseVisualForWindow(
+ enable_transparent_visuals, &visual_id, &depth, &visual_has_alpha_);
}
// x.org will BadMatch if we don't set a border when the depth isn't the
// same as the parent depth.
- attribute_mask |= CWBorderPixel;
- swa.border_pixel = 0;
+ req.border_pixel = 0;
bounds_in_pixels_ = SanitizeBounds(config.bounds);
- xwindow_ = XCreateWindow(xdisplay_, x_root_window_, bounds_in_pixels_.x(),
- bounds_in_pixels_.y(), bounds_in_pixels_.width(),
- bounds_in_pixels_.height(),
- 0, // border width
- depth, InputOutput, visual, attribute_mask, &swa);
+ req.parent = x_root_window_;
+ req.x = bounds_in_pixels_.x();
+ req.y = bounds_in_pixels_.y();
+ req.width = bounds_in_pixels_.width();
+ req.height = bounds_in_pixels_.height();
+ req.depth = depth;
+ req.c_class = x11::WindowClass::InputOutput;
+ req.visual = visual_id;
+ xwindow_ = connection_->GenerateId<x11::Window>();
+ req.wid = xwindow_;
+ connection_->CreateWindow(req);
// It can be a status icon window. If it fails to initialize, don't provide
// him with a native window handle, close self and let the client destroy
@@ -281,15 +301,12 @@ void XWindow::Init(const Configuration& config) {
StructureNotifyMask | PropertyChangeMask |
PointerMotionMask;
xwindow_events_ =
- std::make_unique<ui::XScopedEventSelector>(xwindow_, event_mask);
- XFlush(xdisplay_);
+ std::make_unique<XScopedEventSelector>(xwindow_, event_mask);
+ connection_->Flush();
- if (ui::IsXInput2Available())
- ui::TouchFactory::GetInstance()->SetupXI2ForXWindow(xwindow_);
+ if (IsXInput2Available())
+ TouchFactory::GetInstance()->SetupXI2ForXWindow(xwindow_);
- // TODO(erg): We currently only request window deletion events. We also
- // should listen for activation events and anything else that GTK+ listens
- // for, and do something useful.
// Request the _NET_WM_SYNC_REQUEST protocol which is used for synchronizing
// between chrome and desktop compositor (or WM) during resizing.
// The resizing behavior with _NET_WM_SYNC_REQUEST is:
@@ -305,31 +322,29 @@ void XWindow::Init(const Configuration& config) {
// frame with new content from chrome.
// 7. Desktop compositor responses user mouse move events, and starts a new
// resize process, go to step 1.
- XAtom protocols[] = {
+ std::vector<x11::Atom> protocols = {
gfx::GetAtom("WM_DELETE_WINDOW"),
gfx::GetAtom("_NET_WM_PING"),
gfx::GetAtom("_NET_WM_SYNC_REQUEST"),
};
- XSetWMProtocols(xdisplay_, xwindow_, protocols, base::size(protocols));
+ SetArrayProperty(xwindow_, gfx::GetAtom("WM_PROTOCOLS"), x11::Atom::ATOM,
+ protocols);
- // We need a WM_CLIENT_MACHINE and WM_LOCALE_NAME value so we integrate with
- // the desktop environment.
- XSetWMProperties(xdisplay_, xwindow_, nullptr, nullptr, nullptr, 0, nullptr,
- nullptr, nullptr);
+ // We need a WM_CLIENT_MACHINE value so we integrate with the desktop
+ // environment.
+ SetStringProperty(xwindow_, gfx::GetAtom("WM_CLIENT_MACHINE"),
+ gfx::GetAtom("STRING"), net::GetHostName());
// Likewise, the X server needs to know this window's pid so it knows which
// program to kill if the window hangs.
// XChangeProperty() expects "pid" to be long.
- static_assert(sizeof(long) >= sizeof(pid_t),
- "pid_t should not be larger than long");
- long pid = getpid();
- XChangeProperty(xdisplay_, xwindow_, gfx::GetAtom("_NET_WM_PID"), XA_CARDINAL,
- 32, PropModeReplace, reinterpret_cast<unsigned char*>(&pid),
- 1);
+ static_assert(sizeof(uint32_t) >= sizeof(pid_t),
+ "pid_t should not be larger than uint32_t");
+ uint32_t pid = getpid();
+ SetProperty(xwindow_, gfx::GetAtom("_NET_WM_PID"), x11::Atom::CARDINAL, pid);
- XChangeProperty(xdisplay_, xwindow_, gfx::GetAtom("_NET_WM_WINDOW_TYPE"),
- XA_ATOM, 32, PropModeReplace,
- reinterpret_cast<unsigned char*>(&window_type), 1);
+ SetProperty(xwindow_, gfx::GetAtom("_NET_WM_WINDOW_TYPE"), x11::Atom::ATOM,
+ window_type);
// The changes to |window_properties_| here will be sent to the X server just
// before the window is mapped.
@@ -350,16 +365,16 @@ void XWindow::Init(const Configuration& config) {
workspace_ = base::nullopt;
if (config.visible_on_all_workspaces) {
window_properties_.insert(gfx::GetAtom("_NET_WM_STATE_STICKY"));
- ui::SetIntProperty(xwindow_, "_NET_WM_DESKTOP", "CARDINAL", kAllWorkspaces);
+ SetIntProperty(xwindow_, "_NET_WM_DESKTOP", "CARDINAL", kAllWorkspaces);
} else if (!config.workspace.empty()) {
int workspace;
if (base::StringToInt(config.workspace, &workspace))
- ui::SetIntProperty(xwindow_, "_NET_WM_DESKTOP", "CARDINAL", workspace);
+ SetIntProperty(xwindow_, "_NET_WM_DESKTOP", "CARDINAL", workspace);
}
if (!config.wm_class_name.empty() || !config.wm_class_class.empty()) {
- ui::SetWindowClassHint(xdisplay_, xwindow_, config.wm_class_name,
- config.wm_class_class);
+ SetWindowClassHint(connection_, xwindow_, config.wm_class_name,
+ config.wm_class_class);
}
const char* wm_role_name = nullptr;
@@ -380,40 +395,40 @@ void XWindow::Init(const Configuration& config) {
}
}
if (wm_role_name)
- ui::SetWindowRole(xdisplay_, xwindow_, std::string(wm_role_name));
+ SetWindowRole(xwindow_, std::string(wm_role_name));
if (config.remove_standard_frame) {
// Setting _GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED tells gnome-shell to not force
// fullscreen on the window when it matches the desktop size.
- ui::SetHideTitlebarWhenMaximizedProperty(xwindow_,
- ui::HIDE_TITLEBAR_WHEN_MAXIMIZED);
+ SetHideTitlebarWhenMaximizedProperty(xwindow_,
+ HIDE_TITLEBAR_WHEN_MAXIMIZED);
}
if (config.prefer_dark_theme) {
- XChangeProperty(xdisplay_, xwindow_, gfx::GetAtom("_GTK_THEME_VARIANT"),
- gfx::GetAtom("UTF8_STRING"), 8, PropModeReplace,
- kDarkGtkThemeVariant, base::size(kDarkGtkThemeVariant) - 1);
+ SetStringProperty(xwindow_, gfx::GetAtom("_GTK_THEME_VARIANT"),
+ gfx::GetAtom("UTF8_STRING"), kDarkGtkThemeVariant);
}
- if (ui::IsSyncExtensionAvailable()) {
- XSyncValue value;
- XSyncIntToValue(&value, 0);
- update_counter_ = XSyncCreateCounter(xdisplay_, value);
- extended_update_counter_ = XSyncCreateCounter(xdisplay_, value);
- XID counters[]{update_counter_, extended_update_counter_};
+ if (IsSyncExtensionAvailable()) {
+ x11::Sync::Int64 value{};
+ update_counter_ = connection_->GenerateId<x11::Sync::Counter>();
+ connection_->sync().CreateCounter({update_counter_, value});
+ extended_update_counter_ = connection_->GenerateId<x11::Sync::Counter>();
+ connection_->sync().CreateCounter({extended_update_counter_, value});
+
+ std::vector<x11::Sync::Counter> counters{update_counter_,
+ extended_update_counter_};
// Set XSyncCounter as window property _NET_WM_SYNC_REQUEST_COUNTER. the
// compositor will listen on them during resizing.
- XChangeProperty(
- xdisplay_, xwindow_, gfx::GetAtom("_NET_WM_SYNC_REQUEST_COUNTER"),
- XA_CARDINAL, 32, PropModeReplace,
- reinterpret_cast<const unsigned char*>(counters), base::size(counters));
+ SetArrayProperty(xwindow_, gfx::GetAtom("_NET_WM_SYNC_REQUEST_COUNTER"),
+ x11::Atom::CARDINAL, counters);
}
// Always composite Chromium windows if a compositing WM is used. Sometimes,
// WMs will not composite fullscreen windows as an optimization, but this can
// lead to tearing of fullscreen videos.
- ui::SetIntProperty(xwindow_, "_NET_WM_BYPASS_COMPOSITOR", "CARDINAL", 2);
+ SetIntProperty(xwindow_, "_NET_WM_BYPASS_COMPOSITOR", "CARDINAL", 2);
if (config.icon)
SetXWindowIcons(gfx::ImageSkia(), *config.icon);
@@ -422,58 +437,55 @@ void XWindow::Init(const Configuration& config) {
void XWindow::Map(bool inactive) {
// Before we map the window, set size hints. Otherwise, some window managers
// will ignore toplevel XMoveWindow commands.
- XSizeHints size_hints;
- size_hints.flags = 0;
- long supplied_return;
- XGetWMNormalHints(xdisplay_, xwindow_, &size_hints, &supplied_return);
- size_hints.flags |= PPosition;
+ SizeHints size_hints;
+ memset(&size_hints, 0, sizeof(size_hints));
+ GetWmNormalHints(xwindow_, &size_hints);
+ size_hints.flags |= SIZE_HINT_P_POSITION;
size_hints.x = bounds_in_pixels_.x();
size_hints.y = bounds_in_pixels_.y();
- XSetWMNormalHints(xdisplay_, xwindow_, &size_hints);
+ SetWmNormalHints(xwindow_, size_hints);
ignore_keyboard_input_ = inactive;
- unsigned long wm_user_time_ms =
+ uint32_t wm_user_time_ms =
ignore_keyboard_input_ ? 0
: X11EventSource::GetInstance()->GetTimestamp();
if (inactive || wm_user_time_ms != 0) {
- XChangeProperty(xdisplay_, xwindow_, gfx::GetAtom("_NET_WM_USER_TIME"),
- XA_CARDINAL, 32, PropModeReplace,
- reinterpret_cast<const unsigned char*>(&wm_user_time_ms),
- 1);
+ SetProperty(xwindow_, gfx::GetAtom("_NET_WM_USER_TIME"),
+ x11::Atom::CARDINAL, wm_user_time_ms);
}
UpdateMinAndMaxSize();
if (window_properties_.empty()) {
- XDeleteProperty(xdisplay_, xwindow_, gfx::GetAtom("_NET_WM_STATE"));
+ DeleteProperty(xwindow_, gfx::GetAtom("_NET_WM_STATE"));
} else {
- ui::SetAtomArrayProperty(xwindow_, "_NET_WM_STATE", "ATOM",
- std::vector<XAtom>(std::begin(window_properties_),
+ SetAtomArrayProperty(xwindow_, "_NET_WM_STATE", "ATOM",
+ std::vector<x11::Atom>(std::begin(window_properties_),
std::end(window_properties_)));
}
- XMapWindow(xdisplay_, xwindow_);
+ connection_->MapWindow({xwindow_});
window_mapped_in_client_ = true;
// TODO(thomasanderson): Find out why this flush is necessary.
- XFlush(xdisplay_);
+ connection_->Flush();
}
void XWindow::Close() {
- if (xwindow_ == x11::None)
+ if (xwindow_ == x11::Window::None)
return;
CancelResize();
UnconfineCursor();
- XDestroyWindow(xdisplay_, xwindow_);
- xwindow_ = x11::None;
+ connection_->DestroyWindow({xwindow_});
+ xwindow_ = x11::Window::None;
- if (update_counter_ != x11::None) {
- XSyncDestroyCounter(xdisplay_, update_counter_);
- XSyncDestroyCounter(xdisplay_, extended_update_counter_);
- update_counter_ = x11::None;
- extended_update_counter_ = x11::None;
+ if (update_counter_ != x11::Sync::Counter{}) {
+ connection_->sync().DestroyCounter({update_counter_});
+ connection_->sync().DestroyCounter({extended_update_counter_});
+ update_counter_ = {};
+ extended_update_counter_ = {};
}
}
@@ -487,10 +499,12 @@ void XWindow::Maximize() {
}
void XWindow::Minimize() {
- if (window_mapped_in_client_)
- XIconifyWindow(xdisplay_, xwindow_, 0);
- else
- SetWMSpecState(true, gfx::GetAtom("_NET_WM_STATE_HIDDEN"), x11::None);
+ if (window_mapped_in_client_) {
+ SendClientMessage(xwindow_, x_root_window_, gfx::GetAtom("WM_CHANGE_STATE"),
+ {WM_STATE_ICONIC, 0, 0, 0, 0});
+ } else {
+ SetWMSpecState(true, gfx::GetAtom("_NET_WM_STATE_HIDDEN"), x11::Atom::None);
+ }
}
void XWindow::Unmaximize() {
@@ -506,18 +520,18 @@ bool XWindow::Hide() {
// Make sure no resize task will run after the window is unmapped.
CancelResize();
- XWithdrawWindow(xdisplay_, xwindow_, 0);
+ WithdrawWindow(xwindow_);
window_mapped_in_client_ = false;
return true;
}
void XWindow::Unhide() {
- SetWMSpecState(false, gfx::GetAtom("_NET_WM_STATE_HIDDEN"), x11::None);
+ SetWMSpecState(false, gfx::GetAtom("_NET_WM_STATE_HIDDEN"), x11::Atom::None);
}
void XWindow::SetFullscreen(bool fullscreen) {
SetWMSpecState(fullscreen, gfx::GetAtom("_NET_WM_STATE_FULLSCREEN"),
- x11::None);
+ x11::Atom::None);
}
void XWindow::Activate() {
@@ -531,45 +545,41 @@ void XWindow::Activate() {
// wmii says that it supports _NET_ACTIVE_WINDOW but does not.
// https://code.google.com/p/wmii/issues/detail?id=266
static bool wm_supports_active_window =
- ui::GuessWindowManager() != ui::WM_WMII &&
- ui::WmSupportsHint(gfx::GetAtom("_NET_ACTIVE_WINDOW"));
+ GuessWindowManager() != WM_WMII &&
+ WmSupportsHint(gfx::GetAtom("_NET_ACTIVE_WINDOW"));
::Time timestamp = X11EventSource::GetInstance()->GetTimestamp();
// override_redirect windows ignore _NET_ACTIVE_WINDOW.
// https://crbug.com/940924
if (wm_supports_active_window && !override_redirect_) {
- XEvent xclient;
- memset(&xclient, 0, sizeof(xclient));
- xclient.type = ClientMessage;
- xclient.xclient.window = xwindow_;
- xclient.xclient.message_type = gfx::GetAtom("_NET_ACTIVE_WINDOW");
- xclient.xclient.format = 32;
- xclient.xclient.data.l[0] = 1; // Specified we are an app.
- xclient.xclient.data.l[1] = timestamp;
- // TODO(thomasanderson): if another chrome window is active, specify that in
- // data.l[2]. The EWMH spec claims this may make the WM more likely to
- // service our _NET_ACTIVE_WINDOW request.
- xclient.xclient.data.l[2] = x11::None;
- xclient.xclient.data.l[3] = 0;
- xclient.xclient.data.l[4] = 0;
-
- XSendEvent(xdisplay_, x_root_window_, x11::False,
- SubstructureRedirectMask | SubstructureNotifyMask, &xclient);
+ std::array<uint32_t, 5> data = {
+ // We're an app.
+ 1,
+ timestamp,
+ // TODO(thomasanderson): if another chrome window is active, specify
+ // that here. The EWMH spec claims this may make the WM more likely to
+ // service our _NET_ACTIVE_WINDOW request.
+ 0,
+ 0,
+ 0,
+ };
+ SendClientMessage(xwindow_, x_root_window_,
+ gfx::GetAtom("_NET_ACTIVE_WINDOW"), data);
} else {
- XRaiseWindow(xdisplay_, xwindow_);
+ RaiseWindow(xwindow_);
// Directly ask the X server to give focus to the window. Note that the call
// would have raised an X error if the window is not mapped.
- auto ignore_errors = [](XDisplay*, XErrorEvent*) -> int { return 0; };
- auto old_error_handler = XSetErrorHandler(ignore_errors);
- XSetInputFocus(xdisplay_, xwindow_, RevertToParent, timestamp);
+ connection_
+ ->SetInputFocus({x11::InputFocus::Parent, xwindow_,
+ static_cast<x11::Time>(timestamp)})
+ .IgnoreError();
// At this point, we know we will receive focus, and some
// webdriver tests depend on a window being IsActive() immediately
// after an Activate(), so just set this state now.
has_pointer_focus_ = false;
has_window_focus_ = true;
window_mapped_in_server_ = true;
- XSetErrorHandler(old_error_handler);
}
AfterActivationStateChanged();
@@ -581,7 +591,7 @@ void XWindow::Deactivate() {
// Ignore future input events.
ignore_keyboard_input_ = true;
- XLowerWindow(xdisplay_, xwindow_);
+ ui::LowerWindow(xwindow_);
AfterActivationStateChanged();
}
@@ -594,8 +604,9 @@ bool XWindow::IsActive() const {
return (has_window_focus_ || has_pointer_focus_) && !ignore_keyboard_input_;
}
void XWindow::SetSize(const gfx::Size& size_in_pixels) {
- XResizeWindow(xdisplay_, xwindow_, size_in_pixels.width(),
- size_in_pixels.height());
+ connection_->ConfigureWindow({.window = xwindow_,
+ .width = size_in_pixels.width(),
+ .height = size_in_pixels.height()});
bounds_in_pixels_.set_size(size_in_pixels);
}
@@ -603,8 +614,8 @@ void XWindow::SetBounds(const gfx::Rect& requested_bounds_in_pixels) {
gfx::Rect bounds_in_pixels(requested_bounds_in_pixels);
bool origin_changed = bounds_in_pixels_.origin() != bounds_in_pixels.origin();
bool size_changed = bounds_in_pixels_.size() != bounds_in_pixels.size();
- XWindowChanges changes = {0};
- unsigned value_mask = 0;
+
+ x11::ConfigureWindowRequest req{.window = xwindow_};
if (size_changed) {
// Update the minimum and maximum sizes in case they have changed.
@@ -622,19 +633,17 @@ void XWindow::SetBounds(const gfx::Rect& requested_bounds_in_pixels) {
bounds_in_pixels.set_size(size_in_pixels);
}
- changes.width = bounds_in_pixels.width();
- changes.height = bounds_in_pixels.height();
- value_mask |= CWHeight | CWWidth;
+ req.width = bounds_in_pixels.width();
+ req.height = bounds_in_pixels.height();
}
if (origin_changed) {
- changes.x = bounds_in_pixels.x();
- changes.y = bounds_in_pixels.y();
- value_mask |= CWX | CWY;
+ req.x = bounds_in_pixels.x();
+ req.y = bounds_in_pixels.y();
}
- if (value_mask)
- XConfigureWindow(xdisplay_, xwindow_, value_mask, &changes);
+ if (origin_changed || size_changed)
+ connection_->ConfigureWindow(req);
// Assume that the resize will go through as requested, which should be the
// case if we're running without a window manager. If there's a window
@@ -658,23 +667,23 @@ bool XWindow::IsXWindowVisible() const {
}
bool XWindow::IsMinimized() const {
- return ui::HasWMSpecProperty(window_properties_,
- gfx::GetAtom("_NET_WM_STATE_HIDDEN"));
+ return HasWMSpecProperty(window_properties_,
+ gfx::GetAtom("_NET_WM_STATE_HIDDEN"));
}
bool XWindow::IsMaximized() const {
- return (ui::HasWMSpecProperty(window_properties_,
- gfx::GetAtom("_NET_WM_STATE_MAXIMIZED_VERT")) &&
- ui::HasWMSpecProperty(window_properties_,
- gfx::GetAtom("_NET_WM_STATE_MAXIMIZED_HORZ")));
+ return (HasWMSpecProperty(window_properties_,
+ gfx::GetAtom("_NET_WM_STATE_MAXIMIZED_VERT")) &&
+ HasWMSpecProperty(window_properties_,
+ gfx::GetAtom("_NET_WM_STATE_MAXIMIZED_HORZ")));
}
bool XWindow::IsFullscreen() const {
- return ui::HasWMSpecProperty(window_properties_,
- gfx::GetAtom("_NET_WM_STATE_FULLSCREEN"));
+ return HasWMSpecProperty(window_properties_,
+ gfx::GetAtom("_NET_WM_STATE_FULLSCREEN"));
}
-gfx::Rect XWindow::GetOutterBounds() const {
+gfx::Rect XWindow::GetOuterBounds() const {
gfx::Rect outer_bounds(bounds_in_pixels_);
outer_bounds.Inset(-native_window_frame_borders_in_pixels_);
return outer_bounds;
@@ -687,18 +696,18 @@ void XWindow::GrabPointer() {
}
void XWindow::ReleasePointerGrab() {
- ui::UngrabPointer();
+ UngrabPointer();
has_pointer_grab_ = false;
}
-void XWindow::StackXWindowAbove(::Window window) {
- DCHECK(window != x11::None);
+void XWindow::StackXWindowAbove(x11::Window window) {
+ DCHECK(window != x11::Window::None);
// Find all parent windows up to the root.
- std::vector<::Window> window_below_parents =
- GetParentsList(xdisplay_, window);
- std::vector<::Window> window_above_parents =
- GetParentsList(xdisplay_, xwindow_);
+ std::vector<x11::Window> window_below_parents =
+ GetParentsList(connection_, window);
+ std::vector<x11::Window> window_above_parents =
+ GetParentsList(connection_, xwindow_);
// Find their common ancestor.
auto it_below_window = window_below_parents.rbegin();
@@ -711,23 +720,21 @@ void XWindow::StackXWindowAbove(::Window window) {
if (it_below_window != window_below_parents.rend() &&
it_above_window != window_above_parents.rend()) {
- // First stack |xwindow| below so Z-order of |window| stays the same.
- ::Window windows[] = {*it_below_window, *it_above_window};
- if (XRestackWindows(xdisplay_, windows, 2) == 0) {
- // Now stack them properly.
- std::swap(windows[0], windows[1]);
- XRestackWindows(xdisplay_, windows, 2);
- }
+ connection_->ConfigureWindow({
+ .window = *it_above_window,
+ .sibling = *it_below_window,
+ .stack_mode = x11::StackMode::Above,
+ });
}
}
void XWindow::StackXWindowAtTop() {
- XRaiseWindow(xdisplay_, xwindow_);
+ RaiseWindow(xwindow_);
}
void XWindow::SetCursor(::Cursor cursor) {
last_cursor_ = cursor;
- XDefineCursor(xdisplay_, xwindow_, cursor);
+ DefineCursor(xwindow_, static_cast<x11::Cursor>(cursor));
}
bool XWindow::SetTitle(base::string16 title) {
@@ -736,17 +743,10 @@ bool XWindow::SetTitle(base::string16 title) {
window_title_ = title;
std::string utf8str = base::UTF16ToUTF8(title);
- XChangeProperty(xdisplay_, xwindow_, gfx::GetAtom("_NET_WM_NAME"),
- gfx::GetAtom("UTF8_STRING"), 8, PropModeReplace,
- reinterpret_cast<const unsigned char*>(utf8str.c_str()),
- utf8str.size());
- XTextProperty xtp;
- char* c_utf8_str = const_cast<char*>(utf8str.c_str());
- if (Xutf8TextListToTextProperty(xdisplay_, &c_utf8_str, 1, XUTF8StringStyle,
- &xtp) == x11::Success) {
- XSetWMName(xdisplay_, xwindow_, &xtp);
- XFree(xtp.value);
- }
+ SetStringProperty(xwindow_, gfx::GetAtom("_NET_WM_NAME"),
+ gfx::GetAtom("UTF8_STRING"), utf8str);
+ SetStringProperty(xwindow_, x11::Atom::WM_NAME, gfx::GetAtom("UTF8_STRING"),
+ utf8str);
return true;
}
@@ -756,35 +756,35 @@ void XWindow::SetXWindowOpacity(float opacity) {
// XChangeProperty() expects "cardinality" to be long.
// Scale opacity to [0 .. 255] range.
- unsigned long opacity_8bit =
- static_cast<unsigned long>(opacity * 255.0f) & 0xFF;
+ uint32_t opacity_8bit = static_cast<uint32_t>(opacity * 255.0f) & 0xFF;
// Use opacity value for all channels.
- const unsigned long channel_multiplier = 0x1010101;
- unsigned long cardinality = opacity_8bit * channel_multiplier;
+ uint32_t channel_multiplier = 0x1010101;
+ uint32_t cardinality = opacity_8bit * channel_multiplier;
if (cardinality == 0xffffffff) {
- XDeleteProperty(xdisplay_, xwindow_,
- gfx::GetAtom("_NET_WM_WINDOW_OPACITY"));
+ DeleteProperty(xwindow_, gfx::GetAtom("_NET_WM_WINDOW_OPACITY"));
} else {
- XChangeProperty(xdisplay_, xwindow_, gfx::GetAtom("_NET_WM_WINDOW_OPACITY"),
- XA_CARDINAL, 32, PropModeReplace,
- reinterpret_cast<unsigned char*>(&cardinality), 1);
+ SetProperty(xwindow_, gfx::GetAtom("_NET_WM_WINDOW_OPACITY"),
+ x11::Atom::CARDINAL, cardinality);
}
}
void XWindow::SetXWindowAspectRatio(const gfx::SizeF& aspect_ratio) {
- XSizeHints size_hints;
- size_hints.flags = 0;
- long supplied_return;
+ SizeHints size_hints;
+ memset(&size_hints, 0, sizeof(size_hints));
- XGetWMNormalHints(xdisplay_, xwindow_, &size_hints, &supplied_return);
+ GetWmNormalHints(xwindow_, &size_hints);
// Unforce aspect ratio is parameter length is 0, otherwise set normally.
- if (!aspect_ratio.IsEmpty()) {
- size_hints.flags |= PAspect;
- size_hints.min_aspect.x = size_hints.max_aspect.x = aspect_ratio.width();
- size_hints.min_aspect.y = size_hints.max_aspect.y = aspect_ratio.height();
+ if (aspect_ratio.IsEmpty()) {
+ size_hints.flags &= ~SIZE_HINT_P_ASPECT;
+ } else {
+ size_hints.flags |= SIZE_HINT_P_ASPECT;
+ size_hints.min_aspect_num = size_hints.max_aspect_num =
+ aspect_ratio.width();
+ size_hints.min_aspect_den = size_hints.max_aspect_den =
+ aspect_ratio.height();
}
- XSetWMNormalHints(xdisplay_, xwindow_, &size_hints);
+ SetWmNormalHints(xwindow_, size_hints);
}
void XWindow::SetXWindowIcons(const gfx::ImageSkia& window_icon,
@@ -797,7 +797,7 @@ void XWindow::SetXWindowIcons(const gfx::ImageSkia& window_icon,
// so that we can pass to the WM.
//
// All of this could be made much, much better.
- std::vector<unsigned long> data;
+ std::vector<uint32_t> data;
if (!window_icon.isNull())
SerializeImageRepresentation(window_icon.GetRepresentation(1.0f), &data);
@@ -805,35 +805,27 @@ void XWindow::SetXWindowIcons(const gfx::ImageSkia& window_icon,
if (!app_icon.isNull())
SerializeImageRepresentation(app_icon.GetRepresentation(1.0f), &data);
- if (!data.empty())
- ui::SetAtomArrayProperty(xwindow_, "_NET_WM_ICON", "CARDINAL", data);
+ if (!data.empty()) {
+ SetArrayProperty(xwindow_, gfx::GetAtom("_NET_WM_ICON"),
+ x11::Atom::CARDINAL, data);
+ }
}
void XWindow::SetXWindowVisibleOnAllWorkspaces(bool visible) {
- SetWMSpecState(visible, gfx::GetAtom("_NET_WM_STATE_STICKY"), x11::None);
+ SetWMSpecState(visible, gfx::GetAtom("_NET_WM_STATE_STICKY"),
+ x11::Atom::None);
int new_desktop = 0;
if (visible) {
new_desktop = kAllWorkspaces;
} else {
- if (!ui::GetCurrentDesktop(&new_desktop))
+ if (!GetCurrentDesktop(&new_desktop))
return;
}
workspace_ = kAllWorkspaces;
- XEvent xevent;
- memset(&xevent, 0, sizeof(xevent));
- xevent.type = ClientMessage;
- xevent.xclient.window = xwindow_;
- xevent.xclient.message_type = gfx::GetAtom("_NET_WM_DESKTOP");
- xevent.xclient.format = 32;
- xevent.xclient.data.l[0] = new_desktop;
- xevent.xclient.data.l[1] = 0;
- xevent.xclient.data.l[2] = 0;
- xevent.xclient.data.l[3] = 0;
- xevent.xclient.data.l[4] = 0;
- XSendEvent(xdisplay_, x_root_window_, x11::False,
- SubstructureRedirectMask | SubstructureNotifyMask, &xevent);
+ SendClientMessage(xwindow_, x_root_window_, gfx::GetAtom("_NET_WM_DESKTOP"),
+ {new_desktop, 0, 0, 0, 0});
}
bool XWindow::IsXWindowVisibleOnAllWorkspaces() const {
@@ -845,13 +837,15 @@ bool XWindow::IsXWindowVisibleOnAllWorkspaces() const {
}
void XWindow::MoveCursorTo(const gfx::Point& location_in_pixels) {
- XWarpPointer(xdisplay_, x11::None, x_root_window_, 0, 0, 0, 0,
- bounds_in_pixels_.x() + location_in_pixels.x(),
- bounds_in_pixels_.y() + location_in_pixels.y());
+ connection_->WarpPointer({
+ .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(),
+ });
}
void XWindow::ResetWindowRegion() {
- XRegion* xregion = nullptr;
+ std::unique_ptr<std::vector<x11::Rectangle>> xregion;
if (!use_custom_shape() && !IsMaximized() && !IsFullscreen()) {
SkPath window_mask;
GetWindowMaskForXWindow(bounds().size(), &window_mask);
@@ -860,13 +854,13 @@ void XWindow::ResetWindowRegion() {
if (window_mask.countPoints() > 0)
xregion = gfx::CreateRegionFromSkPath(window_mask);
}
- UpdateWindowRegion(xregion);
+ UpdateWindowRegion(std::move(xregion));
}
void XWindow::OnWorkspaceUpdated() {
auto old_workspace = workspace_;
int workspace;
- if (ui::GetWindowDesktop(xwindow_, &workspace))
+ if (GetWindowDesktop(xwindow_, &workspace))
workspace_ = workspace;
else
workspace_ = base::nullopt;
@@ -877,25 +871,24 @@ void XWindow::OnWorkspaceUpdated() {
void XWindow::SetAlwaysOnTop(bool always_on_top) {
is_always_on_top_ = always_on_top;
- SetWMSpecState(always_on_top, gfx::GetAtom("_NET_WM_STATE_ABOVE"), x11::None);
+ SetWMSpecState(always_on_top, gfx::GetAtom("_NET_WM_STATE_ABOVE"),
+ x11::Atom::None);
}
void XWindow::SetFlashFrameHint(bool flash_frame) {
if (urgency_hint_set_ == flash_frame)
return;
- gfx::XScopedPtr<XWMHints> hints(XGetWMHints(xdisplay_, xwindow_));
- if (!hints) {
- // The window hasn't had its hints set yet.
- hints.reset(XAllocWMHints());
- }
+ WmHints hints;
+ memset(&hints, 0, sizeof(hints));
+ GetWmHints(xwindow_, &hints);
if (flash_frame)
- hints->flags |= XUrgencyHint;
+ hints.flags |= WM_HINT_X_URGENCY;
else
- hints->flags &= ~XUrgencyHint;
+ hints.flags &= ~WM_HINT_X_URGENCY;
- XSetWMHints(xdisplay_, xwindow_, hints.get());
+ SetWmHints(xwindow_, hints);
urgency_hint_set_ = flash_frame;
}
@@ -911,28 +904,27 @@ void XWindow::UpdateMinAndMaxSize() {
min_size_in_pixels_ = minimum_in_pixels.value();
max_size_in_pixels_ = maximum_in_pixels.value();
- XSizeHints hints;
- hints.flags = 0;
- long supplied_return;
- XGetWMNormalHints(xdisplay_, xwindow_, &hints, &supplied_return);
+ SizeHints hints;
+ memset(&hints, 0, sizeof(hints));
+ GetWmNormalHints(xwindow_, &hints);
if (min_size_in_pixels_.IsEmpty()) {
- hints.flags &= ~PMinSize;
+ hints.flags &= ~SIZE_HINT_P_MIN_SIZE;
} else {
- hints.flags |= PMinSize;
+ hints.flags |= SIZE_HINT_P_MIN_SIZE;
hints.min_width = min_size_in_pixels_.width();
hints.min_height = min_size_in_pixels_.height();
}
if (max_size_in_pixels_.IsEmpty()) {
- hints.flags &= ~PMaxSize;
+ hints.flags &= ~SIZE_HINT_P_MAX_SIZE;
} else {
- hints.flags |= PMaxSize;
+ hints.flags |= SIZE_HINT_P_MAX_SIZE;
hints.max_width = max_size_in_pixels_.width();
hints.max_height = max_size_in_pixels_.height();
}
- XSetWMNormalHints(xdisplay_, xwindow_, &hints);
+ SetWmNormalHints(xwindow_, hints);
}
void XWindow::BeforeActivationStateChanged() {
@@ -961,24 +953,24 @@ void XWindow::AfterActivationStateChanged() {
void XWindow::SetUseNativeFrame(bool use_native_frame) {
use_native_frame_ = use_native_frame;
- ui::SetUseOSWindowFrame(xwindow_, use_native_frame);
+ SetUseOSWindowFrame(xwindow_, use_native_frame);
ResetWindowRegion();
}
void XWindow::OnCrossingEvent(bool enter,
bool focus_in_window_or_ancestor,
- int mode,
- int detail) {
+ x11::NotifyMode mode,
+ x11::NotifyDetail detail) {
// NotifyInferior on a crossing event means the pointer moved into or out of a
// child window, but the pointer is still within |xwindow_|.
- if (detail == NotifyInferior)
+ if (detail == x11::NotifyDetail::Inferior)
return;
BeforeActivationStateChanged();
- if (mode == NotifyGrab)
+ if (mode == x11::NotifyMode::Grab)
has_pointer_grab_ = enter;
- else if (mode == NotifyUngrab)
+ else if (mode == x11::NotifyMode::Ungrab)
has_pointer_grab_ = false;
has_pointer_ = enter;
@@ -994,13 +986,16 @@ void XWindow::OnCrossingEvent(bool enter,
AfterActivationStateChanged();
}
-void XWindow::OnFocusEvent(bool focus_in, int mode, int detail) {
+void XWindow::OnFocusEvent(bool focus_in,
+ x11::NotifyMode mode,
+ x11::NotifyDetail detail) {
// NotifyInferior on a focus event means the focus moved into or out of a
// child window, but the focus is still within |xwindow_|.
- if (detail == NotifyInferior)
+ if (detail == x11::NotifyDetail::Inferior)
return;
- bool notify_grab = mode == NotifyGrab || mode == NotifyUngrab;
+ bool notify_grab =
+ mode == x11::NotifyMode::Grab || mode == x11::NotifyMode::Ungrab;
BeforeActivationStateChanged();
@@ -1010,13 +1005,13 @@ void XWindow::OnFocusEvent(bool focus_in, int mode, int detail) {
// For |has_pointer_focus_| and |has_window_focus_|, we continue tracking
// state during a grab, but ignore grab/ungrab events themselves.
- if (!notify_grab && detail != NotifyPointer)
+ if (!notify_grab && detail != x11::NotifyDetail::Pointer)
has_window_focus_ = focus_in;
if (!notify_grab && has_pointer_) {
switch (detail) {
- case NotifyAncestor:
- case NotifyVirtual:
+ case x11::NotifyDetail::Ancestor:
+ case x11::NotifyDetail::Virtual:
// If we reach this point, we know |has_pointer_| was true before and
// after this event. Since the definition of |has_pointer_focus_| is
// (An ancestor window or the PointerRoot is focused) && |has_pointer_|,
@@ -1033,7 +1028,7 @@ void XWindow::OnFocusEvent(bool focus_in, int mode, int detail) {
// (FocusIn with NotifyVirtual)
has_pointer_focus_ = !focus_in;
break;
- case NotifyPointer:
+ case x11::NotifyDetail::Pointer:
// The remaining cases for |has_pointer_focus_| becoming true are:
// 3. Focus moves from |xwindow_| to the PointerRoot
// 4. Focus moves from a descendant of |xwindow_| to the PointerRoot
@@ -1052,8 +1047,8 @@ void XWindow::OnFocusEvent(bool focus_in, int mode, int detail) {
// In each case, we will get a FocusOut with a detail of NotifyPointer.
has_pointer_focus_ = focus_in;
break;
- case NotifyNonlinear:
- case NotifyNonlinearVirtual:
+ case x11::NotifyDetail::Nonlinear:
+ case x11::NotifyDetail::NonlinearVirtual:
// We get Nonlinear(Virtual) events when
// 1. Focus moves from Other to |xwindow_|
// (FocusIn with NotifyNonlinear)
@@ -1076,11 +1071,12 @@ void XWindow::OnFocusEvent(bool focus_in, int mode, int detail) {
AfterActivationStateChanged();
}
-bool XWindow::IsTargetedBy(const XEvent& xev) const {
- ::Window target_window =
- (xev.type == GenericEvent)
+bool XWindow::IsTargetedBy(const x11::Event& x11_event) const {
+ const XEvent& xev = x11_event.xlib_event();
+ auto target_window = static_cast<x11::Window>(
+ xev.type == x11::GeGenericEvent::opcode
? static_cast<XIDeviceEvent*>(xev.xcookie.data)->event
- : xev.xany.window;
+ : xev.xany.window);
return target_window == xwindow_;
}
@@ -1089,16 +1085,16 @@ void XWindow::WmMoveResize(int hittest, const gfx::Point& location) const {
if (direction == -1)
return;
- DoWMMoveResize(xdisplay_, x_root_window_, xwindow_, location, direction);
+ DoWMMoveResize(connection_, x_root_window_, xwindow_, location, direction);
}
-// In Ozone, there are no ui::*Event constructors receiving XEvent* as input,
-// in this case ui::PlatformEvent is expected. Furthermore,
+// In Ozone, there are no *Event constructors receiving XEvent* as input,
+// in this case PlatformEvent is expected. Furthermore,
// X11EventSourceLibevent is used in that case, which already translates
-// Mouse/Key/Touch/Scroll events into ui::Events so they should not be handled
+// Mouse/Key/Touch/Scroll events into Events so they should not be handled
// by PlatformWindow, which is supposed to use XWindow in Ozone builds. So
// handling these events is disabled for Ozone.
-void XWindow::ProcessEvent(XEvent* xev) {
+void XWindow::ProcessEvent(x11::Event* xev) {
// We can lose track of the window's position when the window is reparented.
// When the parent window is moved, we won't get an event, so the window's
// position relative to the root window will get out-of-sync. We can re-sync
@@ -1106,8 +1102,8 @@ void XWindow::ProcessEvent(XEvent* xev) {
// ButtonRelease, MotionNotify) which include the pointer location both
// relative to this window and relative to the root window, so we can
// calculate this window's position from that information.
- gfx::Point window_point = ui::EventLocationFromXEvent(*xev);
- gfx::Point root_point = ui::EventSystemLocationFromXEvent(*xev);
+ gfx::Point window_point = EventLocationFromXEvent(*xev);
+ gfx::Point root_point = EventSystemLocationFromXEvent(*xev);
if (!window_point.IsOrigin() && !root_point.IsOrigin()) {
gfx::Point window_origin = gfx::Point() + (root_point - window_point);
if (bounds_in_pixels_.origin() != window_origin) {
@@ -1118,135 +1114,115 @@ void XWindow::ProcessEvent(XEvent* xev) {
// May want to factor CheckXEventForConsistency(xev); into a common location
// since it is called here.
- switch (xev->type) {
- case EnterNotify:
- case LeaveNotify: {
- OnCrossingEvent(xev->type == EnterNotify, xev->xcrossing.focus,
- xev->xcrossing.mode, xev->xcrossing.detail);
- break;
- }
- case Expose: {
- gfx::Rect damage_rect_in_pixels(xev->xexpose.x, xev->xexpose.y,
- xev->xexpose.width, xev->xexpose.height);
- OnXWindowDamageEvent(damage_rect_in_pixels);
- break;
- }
- case x11::FocusIn:
- case x11::FocusOut:
- OnFocusEvent(xev->type == x11::FocusIn, xev->xfocus.mode,
- xev->xfocus.detail);
- break;
- case ConfigureNotify:
- OnConfigureEvent(xev);
- break;
- case GenericEvent: {
- ui::TouchFactory* factory = ui::TouchFactory::GetInstance();
- if (!factory->ShouldProcessXI2Event(xev))
- break;
-
- XIEnterEvent* enter_event = static_cast<XIEnterEvent*>(xev->xcookie.data);
- switch (static_cast<XIEvent*>(xev->xcookie.data)->evtype) {
- case XI_Enter:
- case XI_Leave: {
- OnCrossingEvent(enter_event->evtype == XI_Enter, enter_event->focus,
- XI2ModeToXMode(enter_event->mode),
- enter_event->detail);
- return;
- }
- case XI_FocusIn:
- case XI_FocusOut: {
- OnFocusEvent(enter_event->evtype == XI_FocusIn,
- XI2ModeToXMode(enter_event->mode), enter_event->detail);
- return;
- }
- default:
+ if (auto* crossing = xev->As<x11::CrossingEvent>()) {
+ bool focus = crossing->same_screen_focus & CROSSING_FLAG_FOCUS;
+ OnCrossingEvent(crossing->opcode == x11::CrossingEvent::EnterNotify, focus,
+ crossing->mode, crossing->detail);
+ } else if (auto* expose = xev->As<x11::ExposeEvent>()) {
+ gfx::Rect damage_rect_in_pixels(expose->x, expose->y, expose->width,
+ expose->height);
+ OnXWindowDamageEvent(damage_rect_in_pixels);
+ } else if (auto* focus = xev->As<x11::FocusEvent>()) {
+ OnFocusEvent(focus->opcode == x11::FocusEvent::In, focus->mode,
+ focus->detail);
+ } else if (auto* configure = xev->As<x11::ConfigureNotifyEvent>()) {
+ OnConfigureEvent(*configure);
+ } else if (auto* crossing = xev->As<x11::Input::CrossingEvent>()) {
+ TouchFactory* factory = TouchFactory::GetInstance();
+ if (factory->ShouldProcessXI2Event(&xev->xlib_event())) {
+ auto mode = XI2ModeToXMode(crossing->mode);
+ auto detail = XI2DetailToXDetail(crossing->detail);
+ switch (crossing->opcode) {
+ case x11::Input::CrossingEvent::Enter:
+ OnCrossingEvent(true, crossing->focus, mode, detail);
break;
- }
- break;
- }
- case MapNotify: {
- OnWindowMapped();
- break;
- }
- case UnmapNotify: {
- window_mapped_in_server_ = false;
- has_pointer_ = false;
- has_pointer_grab_ = false;
- has_pointer_focus_ = false;
- has_window_focus_ = false;
- break;
- }
- case ClientMessage: {
- Atom message_type = xev->xclient.message_type;
- if (message_type == gfx::GetAtom("WM_PROTOCOLS")) {
- Atom protocol = static_cast<Atom>(xev->xclient.data.l[0]);
- if (protocol == gfx::GetAtom("WM_DELETE_WINDOW")) {
- // We have received a close message from the window manager.
- OnXWindowCloseRequested();
- } else if (protocol == gfx::GetAtom("_NET_WM_PING")) {
- XEvent reply_event = *xev;
- reply_event.xclient.window = x_root_window_;
-
- XSendEvent(xdisplay_, reply_event.xclient.window, x11::False,
- SubstructureRedirectMask | SubstructureNotifyMask,
- &reply_event);
- } else if (protocol == gfx::GetAtom("_NET_WM_SYNC_REQUEST")) {
- pending_counter_value_ =
- xev->xclient.data.l[2] +
- (static_cast<int64_t>(xev->xclient.data.l[3]) << 32);
- pending_counter_value_is_extended_ = xev->xclient.data.l[4] != 0;
- }
- } else {
- OnXWindowDragDropEvent(xev);
- }
- break;
- }
- case MappingNotify: {
- switch (xev->xmapping.request) {
- case MappingModifier:
- case MappingKeyboard:
- XRefreshKeyboardMapping(&xev->xmapping);
+ case x11::Input::CrossingEvent::Leave:
+ OnCrossingEvent(false, crossing->focus, mode, detail);
break;
- case MappingPointer:
- ui::DeviceDataManagerX11::GetInstance()->UpdateButtonMap();
+ case x11::Input::CrossingEvent::FocusIn:
+ OnFocusEvent(true, mode, detail);
break;
- default:
- NOTIMPLEMENTED() << " Unknown request: " << xev->xmapping.request;
+ case x11::Input::CrossingEvent::FocusOut:
+ OnFocusEvent(false, mode, detail);
break;
}
- break;
}
- case PropertyNotify: {
- XAtom changed_atom = xev->xproperty.atom;
- if (changed_atom == gfx::GetAtom("_NET_WM_STATE")) {
- OnWMStateUpdated();
- } else if (changed_atom == gfx::GetAtom("_NET_FRAME_EXTENTS")) {
- OnFrameExtentsUpdated();
- } else if (changed_atom == gfx::GetAtom("_NET_WM_DESKTOP")) {
- OnWorkspaceUpdated();
+ } else if (xev->As<x11::MapNotifyEvent>()) {
+ OnWindowMapped();
+ } else if (xev->As<x11::UnmapNotifyEvent>()) {
+ window_mapped_in_server_ = false;
+ has_pointer_ = false;
+ has_pointer_grab_ = false;
+ has_pointer_focus_ = false;
+ has_window_focus_ = false;
+ } else if (auto* client = xev->As<x11::ClientMessageEvent>()) {
+ x11::Atom message_type = client->type;
+ if (message_type == gfx::GetAtom("WM_PROTOCOLS")) {
+ x11::Atom protocol = static_cast<x11::Atom>(client->data.data32[0]);
+ if (protocol == gfx::GetAtom("WM_DELETE_WINDOW")) {
+ // We have received a close message from the window manager.
+ OnXWindowCloseRequested();
+ } else if (protocol == gfx::GetAtom("_NET_WM_PING")) {
+ x11::ClientMessageEvent reply_event = *client;
+ reply_event.window = x_root_window_;
+
+ auto event_bytes = x11::Write(reply_event);
+ DCHECK_EQ(event_bytes.size(), 32ul);
+
+ x11::SendEventRequest request{false, x_root_window_,
+ x11::EventMask::SubstructureNotify |
+ x11::EventMask::SubstructureRedirect};
+ std::copy(event_bytes.begin(), event_bytes.end(),
+ request.event.begin());
+ connection_->SendEvent(request);
+ } else if (protocol == gfx::GetAtom("_NET_WM_SYNC_REQUEST")) {
+ pending_counter_value_ =
+ client->data.data32[2] +
+ (static_cast<int64_t>(client->data.data32[3]) << 32);
+ pending_counter_value_is_extended_ = client->data.data32[4] != 0;
}
- break;
+ } else {
+ OnXWindowDragDropEvent(xev);
}
- case SelectionNotify: {
- OnXWindowSelectionEvent(xev);
- break;
+ } else if (auto* mapping = xev->As<x11::MappingNotifyEvent>()) {
+ switch (mapping->request) {
+ case x11::Mapping::Modifier:
+ case x11::Mapping::Keyboard:
+ XRefreshKeyboardMapping(&xev->xlib_event().xmapping);
+ break;
+ case x11::Mapping::Pointer:
+ DeviceDataManagerX11::GetInstance()->UpdateButtonMap();
+ break;
+ default:
+ NOTIMPLEMENTED() << " Unknown request: "
+ << static_cast<int>(mapping->request);
+ break;
+ }
+ } else if (auto* property = xev->As<x11::PropertyNotifyEvent>()) {
+ x11::Atom changed_atom = property->atom;
+ if (changed_atom == gfx::GetAtom("_NET_WM_STATE")) {
+ OnWMStateUpdated();
+ } else if (changed_atom == gfx::GetAtom("_NET_FRAME_EXTENTS")) {
+ OnFrameExtentsUpdated();
+ } else if (changed_atom == gfx::GetAtom("_NET_WM_DESKTOP")) {
+ OnWorkspaceUpdated();
}
+ } else if (auto* selection = xev->As<x11::SelectionNotifyEvent>()) {
+ OnXWindowSelectionEvent(xev);
}
}
-void XWindow::UpdateWMUserTime(ui::Event* event) {
+void XWindow::UpdateWMUserTime(Event* event) {
if (!IsActive())
return;
DCHECK(event);
- ui::EventType type = event->type();
- if (type == ui::ET_MOUSE_PRESSED || type == ui::ET_KEY_PRESSED ||
- type == ui::ET_TOUCH_PRESSED) {
- unsigned long wm_user_time_ms =
+ EventType type = event->type();
+ if (type == ET_MOUSE_PRESSED || type == ET_KEY_PRESSED ||
+ type == ET_TOUCH_PRESSED) {
+ uint32_t wm_user_time_ms =
(event->time_stamp() - base::TimeTicks()).InMilliseconds();
- XChangeProperty(xdisplay_, xwindow_, gfx::GetAtom("_NET_WM_USER_TIME"),
- XA_CARDINAL, 32, PropModeReplace,
- reinterpret_cast<const unsigned char*>(&wm_user_time_ms),
- 1);
+ SetProperty(xwindow_, gfx::GetAtom("_NET_WM_USER_TIME"),
+ x11::Atom::CARDINAL, wm_user_time_ms);
}
}
@@ -1260,31 +1236,33 @@ void XWindow::OnWindowMapped() {
}
}
-void XWindow::OnConfigureEvent(XEvent* xev) {
- DCHECK_EQ(xwindow_, xev->xconfigure.window);
- DCHECK_EQ(xwindow_, xev->xconfigure.event);
+void XWindow::OnConfigureEvent(const x11::ConfigureNotifyEvent& configure) {
+ DCHECK_EQ(xwindow_, configure.window);
+ DCHECK_EQ(xwindow_, configure.event);
if (pending_counter_value_) {
DCHECK(!configure_counter_value_);
configure_counter_value_ = pending_counter_value_;
configure_counter_value_is_extended_ = pending_counter_value_is_extended_;
- pending_counter_value_is_extended_ = 0;
+ pending_counter_value_is_extended_ = false;
pending_counter_value_ = 0;
}
// It's possible that the X window may be resized by some other means than
// from within aura (e.g. the X window manager can change the size). Make
// sure the root window size is maintained properly.
- int translated_x_in_pixels = xev->xconfigure.x;
- int translated_y_in_pixels = xev->xconfigure.y;
- if (!xev->xconfigure.send_event && !xev->xconfigure.override_redirect) {
- Window unused;
- XTranslateCoordinates(xdisplay_, xwindow_, x_root_window_, 0, 0,
- &translated_x_in_pixels, &translated_y_in_pixels,
- &unused);
+ int translated_x_in_pixels = configure.x;
+ int translated_y_in_pixels = configure.y;
+ if (!configure.send_event && !configure.override_redirect) {
+ auto future =
+ connection_->TranslateCoordinates({xwindow_, x_root_window_, 0, 0});
+ if (auto coords = future.Sync()) {
+ translated_x_in_pixels = coords->dst_x;
+ translated_y_in_pixels = coords->dst_y;
+ }
}
gfx::Rect bounds_in_pixels(translated_x_in_pixels, translated_y_in_pixels,
- xev->xconfigure.width, xev->xconfigure.height);
+ configure.width, configure.height);
bool size_changed = bounds_in_pixels_.size() != bounds_in_pixels.size();
bool origin_changed = bounds_in_pixels_.origin() != bounds_in_pixels.origin();
previous_bounds_in_pixels_ = bounds_in_pixels_;
@@ -1296,13 +1274,13 @@ void XWindow::OnConfigureEvent(XEvent* xev) {
NotifyBoundsChanged(bounds_in_pixels_);
}
-void XWindow::SetWMSpecState(bool enabled, XAtom state1, XAtom state2) {
+void XWindow::SetWMSpecState(bool enabled, x11::Atom state1, x11::Atom state2) {
if (window_mapped_in_client_) {
ui::SetWMSpecState(xwindow_, enabled, state1, state2);
} else {
// The updated state will be set when the window is (re)mapped.
- base::flat_set<XAtom> new_window_properties = window_properties_;
- for (XAtom atom : {state1, state2}) {
+ base::flat_set<x11::Atom> new_window_properties = window_properties_;
+ for (x11::Atom atom : {state1, state2}) {
if (enabled)
new_window_properties.insert(atom);
else
@@ -1318,16 +1296,16 @@ void XWindow::OnWMStateUpdated() {
// persist across a Hide() and Show(). So if the window is currently
// unmapped, leave the state unchanged so it will be restored when the window
// is remapped.
- std::vector<XAtom> atom_list;
- if (ui::GetAtomArrayProperty(xwindow_, "_NET_WM_STATE", &atom_list) ||
+ std::vector<x11::Atom> atom_list;
+ if (GetAtomArrayProperty(xwindow_, "_NET_WM_STATE", &atom_list) ||
window_mapped_in_client_) {
UpdateWindowProperties(
- base::flat_set<XAtom>(std::begin(atom_list), std::end(atom_list)));
+ base::flat_set<x11::Atom>(std::begin(atom_list), std::end(atom_list)));
}
}
void XWindow::UpdateWindowProperties(
- const base::flat_set<XAtom>& new_window_properties) {
+ const base::flat_set<x11::Atom>& new_window_properties) {
was_minimized_ = IsMinimized();
window_properties_ = new_window_properties;
@@ -1337,15 +1315,15 @@ void XWindow::UpdateWindowProperties(
// handle window manager initiated fullscreen. In particular, Chrome needs to
// do preprocessing before the x window's fullscreen state is toggled.
- is_always_on_top_ = ui::HasWMSpecProperty(
- window_properties_, gfx::GetAtom("_NET_WM_STATE_ABOVE"));
+ is_always_on_top_ = HasWMSpecProperty(window_properties_,
+ gfx::GetAtom("_NET_WM_STATE_ABOVE"));
OnXWindowStateChanged();
ResetWindowRegion();
}
void XWindow::OnFrameExtentsUpdated() {
std::vector<int> insets;
- if (ui::GetIntArrayProperty(xwindow_, "_NET_FRAME_EXTENTS", &insets) &&
+ if (GetIntArrayProperty(xwindow_, "_NET_FRAME_EXTENTS", &insets) &&
insets.size() == 4) {
// |insets| are returned in the order: [left, right, top, bottom].
native_window_frame_borders_in_pixels_ =
@@ -1363,14 +1341,14 @@ void XWindow::NotifySwapAfterResize() {
// Setting an even number to |extended_update_counter_| will trigger a
// new resize.
current_counter_value_ += 3;
- SyncSetCounter(xdisplay_, extended_update_counter_,
+ SyncSetCounter(connection_, extended_update_counter_,
current_counter_value_);
}
return;
}
if (configure_counter_value_ != 0) {
- SyncSetCounter(xdisplay_, update_counter_, configure_counter_value_);
+ SyncSetCounter(connection_, update_counter_, configure_counter_value_);
configure_counter_value_ = 0;
}
}
@@ -1378,7 +1356,8 @@ void XWindow::NotifySwapAfterResize() {
// Removes |delayed_resize_task_| from the task queue (if it's in
// the queue) and adds it back at the end of the queue.
void XWindow::DispatchResize() {
- if (update_counter_ == x11::None || configure_counter_value_ == 0) {
+ if (update_counter_ == x11::Sync::Counter{} ||
+ configure_counter_value_ == 0) {
// WM doesn't support _NET_WM_SYNC_REQUEST.
// Or we are too slow, so _NET_WM_SYNC_REQUEST is disabled by the
// compositor.
@@ -1410,7 +1389,7 @@ void XWindow::DelayedResize(const gfx::Rect& bounds_in_pixels) {
// are not frozen and re-enable _NET_WM_SYNC_REQUEST, if it was disabled.
// Increase the |extended_update_counter_| to an odd number will not trigger
// a new resize.
- SyncSetCounter(xdisplay_, extended_update_counter_,
+ SyncSetCounter(connection_, extended_update_counter_,
++current_counter_value_);
}
@@ -1434,41 +1413,51 @@ void XWindow::ConfineCursorTo(const gfx::Rect& bounds) {
gfx::Rect barrier = bounds + bounds_in_pixels_.OffsetFromOrigin();
+ auto make_barrier = [&](uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2,
+ x11::XFixes::BarrierDirections directions) {
+ x11::XFixes::Barrier barrier =
+ connection_->GenerateId<x11::XFixes::Barrier>();
+ connection_->xfixes().CreatePointerBarrier(
+ {barrier, x_root_window_, x1, y1, x2, y2, directions});
+ return barrier;
+ };
+
// Top horizontal barrier.
- pointer_barriers_[0] = XFixesCreatePointerBarrier(
- xdisplay_, x_root_window_, barrier.x(), barrier.y(), barrier.right(),
- barrier.y(), BarrierPositiveY, 0, XIAllDevices);
+ pointer_barriers_[0] =
+ make_barrier(barrier.x(), barrier.y(), barrier.right(), barrier.y(),
+ x11::XFixes::BarrierDirections::PositiveY);
// Bottom horizontal barrier.
- pointer_barriers_[1] = XFixesCreatePointerBarrier(
- xdisplay_, x_root_window_, barrier.x(), barrier.bottom(), barrier.right(),
- barrier.bottom(), BarrierNegativeY, 0, XIAllDevices);
+ pointer_barriers_[1] =
+ make_barrier(barrier.x(), barrier.bottom(), barrier.right(),
+ barrier.bottom(), x11::XFixes::BarrierDirections::NegativeY);
// Left vertical barrier.
- pointer_barriers_[2] = XFixesCreatePointerBarrier(
- xdisplay_, x_root_window_, barrier.x(), barrier.y(), barrier.x(),
- barrier.bottom(), BarrierPositiveX, 0, XIAllDevices);
+ pointer_barriers_[2] =
+ make_barrier(barrier.x(), barrier.y(), barrier.x(), barrier.bottom(),
+ x11::XFixes::BarrierDirections::PositiveX);
// Right vertical barrier.
- pointer_barriers_[3] = XFixesCreatePointerBarrier(
- xdisplay_, x_root_window_, barrier.right(), barrier.y(), barrier.right(),
- barrier.bottom(), BarrierNegativeX, 0, XIAllDevices);
+ pointer_barriers_[3] =
+ make_barrier(barrier.right(), barrier.y(), barrier.right(),
+ barrier.bottom(), x11::XFixes::BarrierDirections::NegativeX);
has_pointer_barriers_ = true;
}
void XWindow::LowerWindow() {
- XLowerWindow(xdisplay_, xwindow_);
+ ui::LowerWindow(xwindow_);
}
void XWindow::SetOverrideRedirect(bool override_redirect) {
bool remap = window_mapped_in_client_;
if (remap)
Hide();
- XSetWindowAttributes swa;
- swa.override_redirect = override_redirect;
- XChangeWindowAttributes(xdisplay_, xwindow_, CWOverrideRedirect, &swa);
+ connection_->ChangeWindowAttributes({
+ .window = xwindow_,
+ .override_redirect = x11::Bool32(override_redirect),
+ });
if (remap) {
Map();
if (has_pointer_grab_)
- ui::ChangeActivePointerGrabCursor(x11::None);
+ ChangeActivePointerGrabCursor(x11::None);
}
}
@@ -1476,12 +1465,16 @@ bool XWindow::ContainsPointInRegion(const gfx::Point& point) const {
if (!shape())
return true;
- return XPointInRegion(shape(), point.x(), point.y()) == x11::True;
+ for (const auto& rect : *shape()) {
+ if (gfx::Rect(rect.x, rect.y, rect.width, rect.height).Contains(point))
+ return true;
+ }
+ return false;
}
void XWindow::SetXWindowShape(std::unique_ptr<NativeShapeRects> native_shape,
const gfx::Transform& transform) {
- XRegion* xregion = nullptr;
+ std::unique_ptr<std::vector<x11::Rectangle>> xregion;
if (native_shape) {
SkRegion native_region;
for (const gfx::Rect& rect : *native_shape)
@@ -1493,7 +1486,7 @@ void XWindow::SetXWindowShape(std::unique_ptr<NativeShapeRects> native_shape,
path_in_dip.transform(SkMatrix(transform.matrix()), &path_in_pixels);
xregion = gfx::CreateRegionFromSkPath(path_in_pixels);
} else {
- xregion = XCreateRegion();
+ xregion = std::make_unique<std::vector<x11::Rectangle>>();
}
} else {
xregion = gfx::CreateRegionFromSkRegion(native_region);
@@ -1501,7 +1494,7 @@ void XWindow::SetXWindowShape(std::unique_ptr<NativeShapeRects> native_shape,
}
custom_window_shape_ = !!xregion;
- window_shape_.reset(xregion);
+ window_shape_ = std::move(xregion);
ResetWindowRegion();
}
@@ -1509,25 +1502,35 @@ void XWindow::UnconfineCursor() {
if (!has_pointer_barriers_)
return;
- for (XID pointer_barrier : pointer_barriers_)
- XFixesDestroyPointerBarrier(xdisplay_, pointer_barrier);
- pointer_barriers_.fill(x11::None);
+ for (auto pointer_barrier : pointer_barriers_)
+ connection_->xfixes().DeletePointerBarrier({pointer_barrier});
+
+ pointer_barriers_.fill({});
has_pointer_barriers_ = false;
}
-void XWindow::UpdateWindowRegion(XRegion* xregion) {
+void XWindow::UpdateWindowRegion(
+ std::unique_ptr<std::vector<x11::Rectangle>> region) {
+ auto set_shape = [&](const std::vector<x11::Rectangle>& rectangles) {
+ connection_->shape().Rectangles({
+ .operation = x11::Shape::So::Set,
+ .destination_kind = x11::Shape::Sk::Bounding,
+ .ordering = x11::ClipOrdering::YXBanded,
+ .destination_window = xwindow_,
+ .rectangles = rectangles,
+ });
+ };
+
// If a custom window shape was supplied then apply it.
if (use_custom_shape()) {
- XShapeCombineRegion(xdisplay_, xwindow_, ShapeBounding, 0, 0,
- window_shape_.get(), false);
+ set_shape(*window_shape_);
return;
}
- window_shape_.reset(xregion);
+ window_shape_ = std::move(region);
if (window_shape_) {
- XShapeCombineRegion(xdisplay_, xwindow_, ShapeBounding, 0, 0,
- window_shape_.get(), false);
+ set_shape(*window_shape_);
return;
}
@@ -1538,19 +1541,21 @@ void XWindow::UpdateWindowRegion(XRegion* xregion) {
// 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.
- XShapeCombineMask(xdisplay_, xwindow_, ShapeBounding, 0, 0, x11::None,
- ShapeSet);
+ connection_->shape().Mask({
+ .operation = x11::Shape::So::Set,
+ .destination_kind = x11::Shape::Sk::Bounding,
+ .destination_window = xwindow_,
+ .source_bitmap = x11::Pixmap::None,
+ });
} else {
// Conversely, if the window does not have system borders, the mask must be
// manually set to a rectangle that covers the whole window (not null). This
// is due to a bug in KWin <= 4.11.5 (KDE bug #330573) where setting a null
// shape causes the hint to disable system borders to be ignored (resulting
// in a double border).
- XRectangle r = {0, 0,
- static_cast<unsigned short>(bounds_in_pixels_.width()),
- static_cast<unsigned short>(bounds_in_pixels_.height())};
- XShapeCombineRectangles(xdisplay_, xwindow_, ShapeBounding, 0, 0, &r, 1,
- ShapeSet, YXBanded);
+ x11::Rectangle r{0, 0, bounds_in_pixels_.width(),
+ bounds_in_pixels_.height()};
+ set_shape({r});
}
}
@@ -1560,42 +1565,32 @@ void XWindow::NotifyBoundsChanged(const gfx::Rect& new_bounds_in_px) {
}
bool XWindow::InitializeAsStatusIcon() {
- std::string atom_name =
- "_NET_SYSTEM_TRAY_S" + base::NumberToString(DefaultScreen(xdisplay_));
- XID manager = XGetSelectionOwner(xdisplay_, gfx::GetAtom(atom_name.c_str()));
- if (manager == x11::None)
+ std::string atom_name = "_NET_SYSTEM_TRAY_S" +
+ base::NumberToString(connection_->DefaultScreenId());
+ auto reply = connection_->GetSelectionOwner({gfx::GetAtom(atom_name)}).Sync();
+ if (!reply || reply->owner == x11::Window::None)
return false;
+ auto manager = reply->owner;
- ui::SetIntArrayProperty(xwindow_, "_XEMBED_INFO", "CARDINAL",
- {kXembedInfoProtocolVersion, kXembedInfoFlags});
+ SetIntArrayProperty(xwindow_, "_XEMBED_INFO", "CARDINAL",
+ {kXembedInfoProtocolVersion, kXembedInfoFlags});
- XSetWindowAttributes attrs;
- unsigned long flags = 0;
+ x11::ChangeWindowAttributesRequest req{xwindow_};
if (has_alpha()) {
- flags |= CWBackPixel;
- attrs.background_pixel = 0;
+ req.background_pixel = 0;
} else {
- ui::SetIntProperty(xwindow_, "CHROMIUM_COMPOSITE_WINDOW", "CARDINAL", 1);
- flags |= CWBackPixmap;
- attrs.background_pixmap = ParentRelative;
- }
- XChangeWindowAttributes(xdisplay_, xwindow_, flags, &attrs);
- XEvent ev;
- memset(&ev, 0, sizeof(ev));
- ev.xclient.type = ClientMessage;
- ev.xclient.window = manager;
- ev.xclient.message_type = gfx::GetAtom("_NET_SYSTEM_TRAY_OPCODE");
- ev.xclient.format = 32;
- ev.xclient.data.l[0] = ui::X11EventSource::GetInstance()->GetTimestamp();
- ev.xclient.data.l[1] = kSystemTrayRequestDock;
- ev.xclient.data.l[2] = xwindow_;
- bool error;
- {
- gfx::X11ErrorTracker error_tracker;
- XSendEvent(xdisplay_, manager, false, NoEventMask, &ev);
- error = error_tracker.FoundNewError();
+ SetIntProperty(xwindow_, "CHROMIUM_COMPOSITE_WINDOW", "CARDINAL", 1);
+ req.background_pixmap =
+ static_cast<x11::Pixmap>(x11::BackPixmap::ParentRelative);
}
- return !error;
+ connection_->ChangeWindowAttributes(req);
+
+ auto future = SendClientMessage(
+ manager, manager, gfx::GetAtom("_NET_SYSTEM_TRAY_OPCODE"),
+ {X11EventSource::GetInstance()->GetTimestamp(), kSystemTrayRequestDock,
+ static_cast<uint32_t>(xwindow_), 0, 0},
+ x11::EventMask::NoEvent);
+ return !future.Sync().error;
}
} // namespace ui
diff --git a/chromium/ui/base/x/x11_window.h b/chromium/ui/base/x/x11_window.h
index feec9b62e6d..c5b0d7227a5 100644
--- a/chromium/ui/base/x/x11_window.h
+++ b/chromium/ui/base/x/x11_window.h
@@ -8,6 +8,7 @@
#include <array>
#include <memory>
#include <string>
+#include <vector>
#include "base/cancelable_callback.h"
#include "base/component_export.h"
@@ -19,8 +20,12 @@
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
#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"
class SkPath;
@@ -107,11 +112,11 @@ class COMPONENT_EXPORT(UI_BASE_X) XWindow {
bool IsActive() const;
void GrabPointer();
void ReleasePointerGrab();
- void StackXWindowAbove(::Window window);
+ void StackXWindowAbove(x11::Window window);
void StackXWindowAtTop();
- bool IsTargetedBy(const XEvent& xev) const;
+ bool IsTargetedBy(const x11::Event& xev) const;
void WmMoveResize(int hittest, const gfx::Point& location) const;
- void ProcessEvent(XEvent* xev);
+ void ProcessEvent(x11::Event* xev);
void SetSize(const gfx::Size& size_in_pixels);
void SetBounds(const gfx::Rect& requested_bounds);
@@ -119,7 +124,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XWindow {
bool IsMinimized() const;
bool IsMaximized() const;
bool IsFullscreen() const;
- gfx::Rect GetOutterBounds() const;
+ gfx::Rect GetOuterBounds() const;
void SetCursor(::Cursor cursor);
bool SetTitle(base::string16 title);
@@ -163,12 +168,14 @@ class COMPONENT_EXPORT(UI_BASE_X) XWindow {
bool has_alpha() const { return visual_has_alpha_; }
base::Optional<int> workspace() const { return workspace_; }
- XDisplay* display() const { return xdisplay_; }
- ::Window window() const { return xwindow_; }
- ::Window root_window() const { return x_root_window_; }
- ::Region shape() const { return window_shape_.get(); }
- XID update_counter() const { return update_counter_; }
- XID extended_update_counter() const { return extended_update_counter_; }
+ x11::Connection* connection() const { return connection_; }
+ x11::Window window() const { return xwindow_; }
+ x11::Window root_window() const { return x_root_window_; }
+ std::vector<x11::Rectangle>* shape() const { return window_shape_.get(); }
+ x11::Sync::Counter update_counter() const { return update_counter_; }
+ x11::Sync::Counter extended_update_counter() const {
+ return extended_update_counter_;
+ }
::Cursor last_cursor() const { return last_cursor_; }
protected:
@@ -178,14 +185,16 @@ class COMPONENT_EXPORT(UI_BASE_X) XWindow {
private:
// Called on an XFocusInEvent, XFocusOutEvent, XIFocusInEvent, or an
// XIFocusOutEvent.
- void OnFocusEvent(bool focus_in, int mode, int detail);
+ void OnFocusEvent(bool focus_in,
+ x11::NotifyMode mode,
+ x11::NotifyDetail detail);
// Called on an XEnterWindowEvent, XLeaveWindowEvent, XIEnterEvent, or an
// XILeaveEvent.
void OnCrossingEvent(bool enter,
bool focus_in_window_or_ancestor,
- int mode,
- int detail);
+ x11::NotifyMode mode,
+ x11::NotifyDetail detail);
// Called when |xwindow_|'s _NET_WM_STATE property is updated.
void OnWMStateUpdated();
@@ -193,7 +202,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XWindow {
// Called when |xwindow_|'s _NET_FRAME_EXTENTS property is updated.
void OnFrameExtentsUpdated();
- void OnConfigureEvent(XEvent* xev);
+ void OnConfigureEvent(const x11::ConfigureNotifyEvent& event);
void OnWorkspaceUpdated();
@@ -215,15 +224,15 @@ class COMPONENT_EXPORT(UI_BASE_X) XWindow {
// be invalid to unset the maximized state by making two calls like
// (_NET_WM_STATE_MAXIMIZED_VERT, x11::None), (_NET_WM_STATE_MAXIMIZED_HORZ,
// x11::None).
- void SetWMSpecState(bool enabled, XAtom state1, XAtom state2);
+ void SetWMSpecState(bool enabled, x11::Atom state1, x11::Atom state2);
// Updates |window_properties_| with |new_window_properties|.
void UpdateWindowProperties(
- const base::flat_set<XAtom>& new_window_properties);
+ const base::flat_set<x11::Atom>& new_window_properties);
void UnconfineCursor();
- void UpdateWindowRegion(XRegion* xregion);
+ void UpdateWindowRegion(std::unique_ptr<std::vector<x11::Rectangle>> region);
void NotifyBoundsChanged(const gfx::Rect& new_bounds_in_px);
@@ -241,23 +250,23 @@ class COMPONENT_EXPORT(UI_BASE_X) XWindow {
virtual void OnXWindowWorkspaceChanged() = 0;
virtual void OnXWindowLostPointerGrab() = 0;
virtual void OnXWindowLostCapture() = 0;
- virtual void OnXWindowSelectionEvent(XEvent* xev) = 0;
- virtual void OnXWindowDragDropEvent(XEvent* xev) = 0;
+ virtual void OnXWindowSelectionEvent(x11::Event* xev) = 0;
+ virtual void OnXWindowDragDropEvent(x11::Event* xev) = 0;
virtual base::Optional<gfx::Size> GetMinimumSizeForXWindow() = 0;
virtual base::Optional<gfx::Size> GetMaximumSizeForXWindow() = 0;
virtual void GetWindowMaskForXWindow(const gfx::Size& size,
SkPath* window_mask) = 0;
// The display and the native X window hosting the root window.
- XDisplay* xdisplay_ = nullptr;
- ::Window xwindow_ = x11::None;
- ::Window x_root_window_ = x11::None;
+ x11::Connection* const connection_;
+ x11::Window xwindow_ = x11::Window::None;
+ x11::Window x_root_window_ = x11::Window::None;
// Events selected on |xwindow_|.
std::unique_ptr<ui::XScopedEventSelector> xwindow_events_;
// The window manager state bits.
- base::flat_set<XAtom> window_properties_;
+ base::flat_set<x11::Atom> window_properties_;
// Is this window able to receive focus?
bool activatable_ = true;
@@ -276,7 +285,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XWindow {
// The bounds of |xwindow_|.
gfx::Rect bounds_in_pixels_;
- VisualID visual_id_ = 0;
+ x11::VisualId visual_id_{};
// Whether we used an ARGB visual for our window.
bool visual_has_alpha_ = false;
@@ -325,8 +334,8 @@ class COMPONENT_EXPORT(UI_BASE_X) XWindow {
// Used for synchronizing between |xwindow_| and desktop compositor during
// resizing.
- XID update_counter_ = x11::None;
- XID extended_update_counter_ = x11::None;
+ x11::Sync::Counter update_counter_{};
+ x11::Sync::Counter extended_update_counter_{};
// Whenever the bounds are set, we keep the previous set of bounds around so
// we can have a better chance of getting the real
@@ -353,8 +362,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XWindow {
gfx::Size max_size_in_pixels_;
// The window shape if the window is non-rectangular.
- gfx::XScopedPtr<XRegion, gfx::XObjectDeleter<XRegion, int, XDestroyRegion>>
- window_shape_;
+ std::unique_ptr<std::vector<x11::Rectangle>> window_shape_;
// Whether |window_shape_| was set via SetShape().
bool custom_window_shape_ = false;
@@ -377,7 +385,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XWindow {
// Keep track of barriers to confine cursor.
bool has_pointer_barriers_ = false;
- std::array<XID, 4> pointer_barriers_;
+ std::array<x11::XFixes::Barrier, 4> pointer_barriers_;
::Cursor last_cursor_ = x11::None;
};
diff --git a/chromium/ui/base/x/x11_workspace_handler.cc b/chromium/ui/base/x/x11_workspace_handler.cc
index 72ea0fb82d5..cb48d38fc4a 100644
--- a/chromium/ui/base/x/x11_workspace_handler.cc
+++ b/chromium/ui/base/x/x11_workspace_handler.cc
@@ -15,11 +15,10 @@ namespace ui {
namespace {
-x11::Future<x11::XProto::GetPropertyReply> GetWorkspace() {
+x11::Future<x11::GetPropertyReply> GetWorkspace() {
auto* connection = x11::Connection::Get();
return connection->GetProperty({
- .window =
- static_cast<x11::Window>(XDefaultRootWindow(connection->display())),
+ .window = connection->default_screen().root,
.property = static_cast<x11::Atom>(gfx::GetAtom("_NET_CURRENT_DESKTOP")),
.type = static_cast<x11::Atom>(gfx::GetAtom("CARDINAL")),
.long_length = 1,
@@ -30,7 +29,7 @@ x11::Future<x11::XProto::GetPropertyReply> GetWorkspace() {
X11WorkspaceHandler::X11WorkspaceHandler(Delegate* delegate)
: xdisplay_(gfx::GetXDisplay()),
- x_root_window_(DefaultRootWindow(xdisplay_)),
+ x_root_window_(ui::GetX11RootWindow()),
delegate_(delegate) {
DCHECK(delegate_);
if (ui::X11EventSource::HasInstance())
@@ -51,14 +50,16 @@ std::string X11WorkspaceHandler::GetCurrentWorkspace() {
return workspace_;
}
-bool X11WorkspaceHandler::DispatchXEvent(XEvent* event) {
+bool X11WorkspaceHandler::DispatchXEvent(x11::Event* x11_event) {
+ XEvent* event = &x11_event->xlib_event();
if (event->type != PropertyNotify ||
- event->xproperty.window != x_root_window_) {
+ event->xproperty.window != static_cast<uint32_t>(x_root_window_)) {
return false;
}
switch (event->type) {
- case PropertyNotify: {
- if (event->xproperty.atom == gfx::GetAtom("_NET_CURRENT_DESKTOP")) {
+ case x11::PropertyNotifyEvent::opcode: {
+ if (event->xproperty.atom ==
+ static_cast<uint32_t>(gfx::GetAtom("_NET_CURRENT_DESKTOP"))) {
GetWorkspace().OnResponse(
base::BindOnce(&X11WorkspaceHandler::OnWorkspaceResponse,
weak_factory_.GetWeakPtr()));
@@ -72,7 +73,7 @@ bool X11WorkspaceHandler::DispatchXEvent(XEvent* event) {
}
void X11WorkspaceHandler::OnWorkspaceResponse(
- x11::XProto::GetPropertyResponse response) {
+ x11::GetPropertyResponse response) {
if (!response || response->format != 32 || response->value.size() < 4)
return;
DCHECK_EQ(response->bytes_after, 0U);
diff --git a/chromium/ui/base/x/x11_workspace_handler.h b/chromium/ui/base/x/x11_workspace_handler.h
index b60f91a9f56..2a9c1ab4ea6 100644
--- a/chromium/ui/base/x/x11_workspace_handler.h
+++ b/chromium/ui/base/x/x11_workspace_handler.h
@@ -10,6 +10,7 @@
#include "base/component_export.h"
#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"
@@ -40,15 +41,15 @@ class COMPONENT_EXPORT(UI_BASE_X) X11WorkspaceHandler
private:
// ui::XEventDispatcher
- bool DispatchXEvent(XEvent* event) override;
+ bool DispatchXEvent(x11::Event* event) override;
- void OnWorkspaceResponse(x11::XProto::GetPropertyResponse response);
+ void OnWorkspaceResponse(x11::GetPropertyResponse response);
// The display and the native X window hosting the root window.
XDisplay* xdisplay_;
// The native root window.
- ::Window x_root_window_;
+ x11::Window x_root_window_;
// Events selected on x_root_window_.
std::unique_ptr<ui::XScopedEventSelector> x_root_window_events_;
diff --git a/chromium/ui/base/x/xwmstartupcheck/BUILD.gn b/chromium/ui/base/x/xwmstartupcheck/BUILD.gn
new file mode 100644
index 00000000000..debd8fac289
--- /dev/null
+++ b/chromium/ui/base/x/xwmstartupcheck/BUILD.gn
@@ -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.
+
+executable("xwmstartupcheck") {
+ testonly = true
+
+ sources = [ "xwmstartupcheck.cc" ]
+
+ deps = [ "//base" ]
+
+ configs += [ "//build/config/linux:x11" ]
+}
diff --git a/chromium/ui/base/x/xwmstartupcheck/xwmstartupcheck.cc b/chromium/ui/base/x/xwmstartupcheck/xwmstartupcheck.cc
new file mode 100644
index 00000000000..09ef42f3e12
--- /dev/null
+++ b/chromium/ui/base/x/xwmstartupcheck/xwmstartupcheck.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.
+//
+// Checks for the reparent notify events that is a signal that a WM has been
+// started. Returns 0 on success and 1 on failure. This program must be started
+// BEFORE the Wm starts.
+//
+
+#include <cerrno>
+#include <cstdio>
+
+#include <time.h>
+
+#include <X11/Xlib.h>
+
+void CalculateTimeout(const timespec& now,
+ const timespec& deadline,
+ timeval* timeout) {
+ // 1s == 1e+6 us.
+ // 1nsec == 1e-3 us
+ timeout->tv_usec = (deadline.tv_sec - now.tv_sec) * 1000000 +
+ (deadline.tv_nsec - now.tv_nsec) / 1000;
+ timeout->tv_sec = 0;
+}
+
+class XScopedDisplay {
+ public:
+ explicit XScopedDisplay(Display* display) : display_(display) {}
+ ~XScopedDisplay() {
+ if (display_)
+ XCloseDisplay(display_);
+ }
+
+ Display* display() const { return display_; }
+
+ private:
+ Display* const display_;
+};
+
+int main(int argc, char* argv[]) {
+ // Connects to a display specified in the current process' env value DISPLAY.
+ XScopedDisplay scoped_display(XOpenDisplay(nullptr));
+
+ // No display found - fail early.
+ if (!scoped_display.display()) {
+ fprintf(stderr, "Couldn't connect to a display.\n");
+ return 1;
+ }
+
+ auto* xdisplay = scoped_display.display();
+
+ auto root_window = DefaultRootWindow(xdisplay);
+ if (!root_window) {
+ fprintf(stderr, "Couldn't find root window.\n");
+ return 1;
+ }
+
+ auto dummmy_window = XCreateSimpleWindow(
+ xdisplay, root_window, 0 /*x*/, 0 /*y*/, 1 /*width*/, 1 /*height*/,
+ 0 /*border width*/, 0 /*border*/, 0 /*background*/);
+ if (!dummmy_window) {
+ fprintf(stderr, "Couldn't create a dummy window.");
+ return 1;
+ }
+
+ XMapWindow(xdisplay, dummmy_window);
+ // We are only interested in the ReparentNotify events that are sent whenever
+ // our dummy window is reparented because of a wm start.
+ XSelectInput(xdisplay, dummmy_window, StructureNotifyMask);
+ XFlush(xdisplay);
+
+ int display_fd = ConnectionNumber(xdisplay);
+
+ // Set deadline as 30s.
+ struct timespec now, deadline;
+ clock_gettime(CLOCK_REALTIME, &now);
+ deadline = now;
+ deadline.tv_sec += 30;
+
+ // Calculate first timeout.
+ struct timeval tv;
+ CalculateTimeout(now, deadline, &tv);
+
+ XEvent ev;
+ do {
+ fd_set in_fds;
+ FD_ZERO(&in_fds);
+ FD_SET(display_fd, &in_fds);
+
+ int ret = select(display_fd + 1, &in_fds, nullptr, nullptr, &tv);
+ if (ret == -1) {
+ if (errno != EINTR) {
+ perror("Error occured while polling the display fd");
+ break;
+ }
+ } else if (ret > 0) {
+ while (XPending(xdisplay)) {
+ XNextEvent(xdisplay, &ev);
+ // If we got ReparentNotify, a wm has started up and we can stop
+ // execution.
+ if (ev.type == ReparentNotify) {
+ return 0;
+ }
+ }
+ }
+ // Calculate next timeout. If it's less or equal to 0, give up.
+ clock_gettime(CLOCK_REALTIME, &now);
+ CalculateTimeout(now, deadline, &tv);
+ } while (tv.tv_usec >= 0);
+
+ return 1;
+}
+
+#if defined(LEAK_SANITIZER)
+// XOpenDisplay leaks memory if it takes more than one try to connect. This
+// causes LSan bots to fail. We don't care about memory leaks in xdisplaycheck
+// anyway, so just disable LSan completely.
+// This function isn't referenced from the executable itself. Make sure it isn't
+// stripped by the linker.
+__attribute__((used)) __attribute__((visibility("default"))) extern "C" int
+__lsan_is_turned_off() {
+ return 1;
+}
+#endif
diff --git a/chromium/ui/chromeos/BUILD.gn b/chromium/ui/chromeos/BUILD.gn
index 89da79afca0..a7475924135 100644
--- a/chromium/ui/chromeos/BUILD.gn
+++ b/chromium/ui/chromeos/BUILD.gn
@@ -11,24 +11,6 @@ component("chromeos") {
sources = [
"devicetype_utils.cc",
"devicetype_utils.h",
- "ime/assistive_delegate.h",
- "ime/candidate_view.cc",
- "ime/candidate_view.h",
- "ime/candidate_window_constants.h",
- "ime/candidate_window_view.cc",
- "ime/candidate_window_view.h",
- "ime/infolist_window.cc",
- "ime/infolist_window.h",
- "ime/input_method_menu_item.cc",
- "ime/input_method_menu_item.h",
- "ime/input_method_menu_manager.cc",
- "ime/input_method_menu_manager.h",
- "ime/suggestion_view.cc",
- "ime/suggestion_view.h",
- "ime/suggestion_window_view.cc",
- "ime/suggestion_window_view.h",
- "ime/undo_window.cc",
- "ime/undo_window.h",
"user_activity_power_manager_notifier.cc",
"user_activity_power_manager_notifier.h",
]
@@ -40,38 +22,19 @@ component("chromeos") {
"//chromeos/dbus/power",
"//chromeos/dbus/power:power_manager_proto",
"//components/device_event_log",
- "//components/onc",
"//mojo/public/cpp/bindings",
"//services/device/public/mojom",
"//services/service_manager/public/cpp",
- "//skia",
- "//ui/accessibility:ax_base",
- "//ui/aura",
"//ui/base",
- "//ui/base/ime",
- "//ui/chromeos/resources",
"//ui/chromeos/strings",
- "//ui/display",
"//ui/events",
"//ui/events:gesture_detection",
"//ui/events/devices:devices",
- "//ui/gfx",
- "//ui/gfx/geometry",
- "//ui/message_center",
- "//ui/native_theme",
- "//ui/views",
- "//ui/wm",
]
}
test("ui_chromeos_unittests") {
- sources = [
- "ime/candidate_view_unittest.cc",
- "ime/candidate_window_view_unittest.cc",
- "ime/input_method_menu_item_unittest.cc",
- "ime/input_method_menu_manager_unittest.cc",
- "run_all_unittests.cc",
- ]
+ sources = [ "run_all_unittests.cc" ]
deps = [
":chromeos",
"//base/test:test_support",
diff --git a/chromium/ui/color/color_id.h b/chromium/ui/color/color_id.h
index 43304ff2d8f..ae5f30f2ebe 100644
--- a/chromium/ui/color/color_id.h
+++ b/chromium/ui/color/color_id.h
@@ -5,7 +5,7 @@
#ifndef UI_COLOR_COLOR_ID_H_
#define UI_COLOR_COLOR_ID_H_
-#include "base/logging.h"
+#include "base/check_op.h"
#include "build/build_config.h"
#include "build/buildflag.h"
diff --git a/chromium/ui/compositor/BUILD.gn b/chromium/ui/compositor/BUILD.gn
index a9fa6400328..19ba19069b3 100644
--- a/chromium/ui/compositor/BUILD.gn
+++ b/chromium/ui/compositor/BUILD.gn
@@ -17,6 +17,8 @@ jumbo_component("compositor") {
"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",
"callback_layer_animation_observer.h",
"canvas_painter.cc",
@@ -220,6 +222,7 @@ jumbo_static_library("test_support") {
test("compositor_unittests") {
sources = [
+ "animation_throughput_reporter_unittest.cc",
"callback_layer_animation_observer_unittest.cc",
"canvas_painter_unittest.cc",
"compositor_lock_unittest.cc",
diff --git a/chromium/ui/compositor/animation_metrics_reporter.h b/chromium/ui/compositor/animation_metrics_reporter.h
index d06fe232e70..1b12fb55acc 100644
--- a/chromium/ui/compositor/animation_metrics_reporter.h
+++ b/chromium/ui/compositor/animation_metrics_reporter.h
@@ -5,6 +5,7 @@
#ifndef UI_COMPOSITOR_ANIMATION_METRICS_REPORTER_H_
#define UI_COMPOSITOR_ANIMATION_METRICS_REPORTER_H_
+#include "base/metrics/histogram_macros.h"
#include "ui/compositor/compositor_export.h"
namespace ui {
@@ -22,6 +23,25 @@ class COMPOSITOR_EXPORT AnimationMetricsReporter {
virtual void Report(int value) = 0;
};
+// A subclass of AnimationMetricsReporter that writes into a percentage
+// histogram when Report() is called.
+template <const char* histogram_name>
+class COMPOSITOR_EXPORT HistogramPercentageMetricsReporter
+ : public AnimationMetricsReporter {
+ public:
+ HistogramPercentageMetricsReporter() = default;
+ HistogramPercentageMetricsReporter(
+ const HistogramPercentageMetricsReporter&) = delete;
+ HistogramPercentageMetricsReporter& operator=(
+ const HistogramPercentageMetricsReporter&) = delete;
+ ~HistogramPercentageMetricsReporter() override = default;
+
+ // AnimationMetricsReporter:
+ void Report(int value) override {
+ UMA_HISTOGRAM_PERCENTAGE(histogram_name, value);
+ }
+};
+
} // namespace ui
#endif // UI_COMPOSITOR_ANIMATION_METRICS_REPORTER_H_
diff --git a/chromium/ui/compositor/animation_throughput_reporter.cc b/chromium/ui/compositor/animation_throughput_reporter.cc
new file mode 100644
index 00000000000..bcb963bb367
--- /dev/null
+++ b/chromium/ui/compositor/animation_throughput_reporter.cc
@@ -0,0 +1,151 @@
+// 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_throughput_reporter.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/check.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/memory/weak_ptr.h"
+#include "base/optional.h"
+#include "cc/animation/animation.h"
+#include "ui/compositor/callback_layer_animation_observer.h"
+#include "ui/compositor/compositor.h"
+#include "ui/compositor/layer.h"
+#include "ui/compositor/layer_animation_delegate.h"
+#include "ui/compositor/layer_animator.h"
+#include "ui/compositor/throughput_tracker.h"
+
+namespace ui {
+
+class AnimationThroughputReporter::AnimationTracker
+ : public CallbackLayerAnimationObserver {
+ public:
+ AnimationTracker(LayerAnimator* animator, ReportCallback report_callback)
+ : CallbackLayerAnimationObserver(
+ base::BindRepeating(&AnimationTracker::OnAnimationEnded,
+ base::Unretained(this))),
+ animator_(animator),
+ report_callback_(std::move(report_callback)) {
+ DCHECK(report_callback_);
+ }
+ AnimationTracker(const AnimationTracker& other) = delete;
+ AnimationTracker& operator=(const AnimationTracker& other) = delete;
+ ~AnimationTracker() override = default;
+
+ // Whether there are attached animation sequences to track.
+ bool IsTrackingAnimation() const { return !attached_sequences().empty(); }
+
+ void set_should_delete(bool should_delete) { should_delete_ = should_delete; }
+
+ private:
+ // CallbackLayerAnimationObserver:
+ void OnAnimatorAttachedToTimeline() override { MaybeStartTracking(); }
+ void OnAnimatorDetachedFromTimeline() override {
+ // Gives up tracking when detached from the timeline.
+ should_start_tracking_ = false;
+ if (throughput_tracker_)
+ throughput_tracker_.reset();
+
+ // OnAnimationEnded would not happen after detached from the timeline.
+ // So do the clean up here.
+ if (should_delete_)
+ delete this;
+ }
+ void OnLayerAnimationStarted(LayerAnimationSequence* sequence) override {
+ CallbackLayerAnimationObserver::OnLayerAnimationStarted(sequence);
+
+ should_start_tracking_ = true;
+ MaybeStartTracking();
+
+ // Make sure SetActive() is called so that OnAnimationEnded callback will be
+ // invoked when all attached layer animation sequences finish.
+ if (!active())
+ SetActive();
+ }
+
+ void MaybeStartTracking() {
+ // No tracking if no layer animation sequence is started.
+ if (!should_start_tracking_)
+ return;
+
+ // No tracking if |animator_| is not attached to a timeline. Layer animation
+ // sequence would not tick without a timeline.
+ if (!AnimationThroughputReporter::IsAnimatorAttachedToTimeline(
+ animator_.get())) {
+ return;
+ }
+
+ ui::Compositor* compositor =
+ AnimationThroughputReporter::GetCompositor(animator_.get());
+ throughput_tracker_ = compositor->RequestNewThroughputTracker();
+ throughput_tracker_->Start(report_callback_);
+ }
+
+ // Invoked when all animation sequences finish.
+ bool OnAnimationEnded(const CallbackLayerAnimationObserver& self) {
+ // |tracking_started_| could reset when detached from animation timeline.
+ // E.g. underlying Layer is moved from one Compositor to another. No report
+ // for such case.
+ if (throughput_tracker_) {
+ if (self.aborted_count())
+ throughput_tracker_->Cancel();
+ else
+ throughput_tracker_->Stop();
+ }
+
+ should_start_tracking_ = false;
+ return should_delete_;
+ }
+
+ // Whether this class should delete itself on animation ended.
+ bool should_delete_ = false;
+
+ scoped_refptr<LayerAnimator> animator_;
+
+ base::Optional<ThroughputTracker> throughput_tracker_;
+
+ // Whether |throughput_tracker_| should be started.
+ bool should_start_tracking_ = false;
+
+ AnimationThroughputReporter::ReportCallback report_callback_;
+};
+
+AnimationThroughputReporter::AnimationThroughputReporter(
+ LayerAnimator* animator,
+ ReportCallback report_callback)
+ : animator_(animator),
+ animation_tracker_(
+ std::make_unique<AnimationTracker>(animator_,
+ std::move(report_callback))) {
+ animator_->AddObserver(animation_tracker_.get());
+}
+
+AnimationThroughputReporter::~AnimationThroughputReporter() {
+ // Directly remove |animation_tracker_| from |LayerAnimator::observers_|
+ // rather than calling LayerAnimator::RemoveObserver(), to avoid removing it
+ // from the scheduled animation sequences.
+ animator_->observers_.RemoveObserver(animation_tracker_.get());
+
+ // |animation_tracker_| deletes itself when its tracked animations finish.
+ if (animation_tracker_->IsTrackingAnimation())
+ animation_tracker_.release()->set_should_delete(true);
+}
+
+// static
+Compositor* AnimationThroughputReporter::GetCompositor(
+ LayerAnimator* animator) {
+ return animator->delegate()->GetLayer()->GetCompositor();
+}
+
+// static
+bool AnimationThroughputReporter::IsAnimatorAttachedToTimeline(
+ LayerAnimator* animator) {
+ return animator->animation_->animation_timeline();
+}
+
+} // namespace ui
diff --git a/chromium/ui/compositor/animation_throughput_reporter.h b/chromium/ui/compositor/animation_throughput_reporter.h
new file mode 100644
index 00000000000..7fb9b665728
--- /dev/null
+++ b/chromium/ui/compositor/animation_throughput_reporter.h
@@ -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.
+
+#ifndef UI_COMPOSITOR_ANIMATION_THROUGHPUT_REPORTER_H_
+#define UI_COMPOSITOR_ANIMATION_THROUGHPUT_REPORTER_H_
+
+#include <memory>
+
+#include "base/callback_forward.h"
+#include "cc/metrics/frame_sequence_metrics.h"
+#include "ui/compositor/compositor_export.h"
+
+namespace ui {
+
+class Compositor;
+class LayerAnimator;
+
+// Reports cc::FrameSequenceMetrics::ThroughputData of layer animations.
+//
+// Throughput is defined as the ratio between number frames presented (actual
+// screen updates) for the animations and the number frames expected.
+// DroppedFrames/SkippedFrames is the other part of the story. It is a ratio
+// between dropped/skipped frames over the expected frames.
+//
+// See also docs/speed/graphics_metrics_definitions.md.
+//
+// cc::FrameSequenceMetrics::ThroughputData contains the numbers of produced
+// frames and expected frames and could be used to calculate the two metrics.
+//
+// All layer animation sequences created after its construction are consider
+// as part of the animation being tracked. Graphics throughput tracking is
+// stopped when all relevant layer animation sequences finish. The report
+// callback is invoked on the next frame presentation if there is enough data
+// and none of the layer animation sequences is aborted.
+class COMPOSITOR_EXPORT AnimationThroughputReporter {
+ public:
+ using ReportCallback =
+ base::RepeatingCallback<void(cc::FrameSequenceMetrics::ThroughputData)>;
+ AnimationThroughputReporter(LayerAnimator* animator,
+ ReportCallback report_callback);
+ AnimationThroughputReporter(const AnimationThroughputReporter&) = delete;
+ AnimationThroughputReporter& operator=(const AnimationThroughputReporter&) =
+ delete;
+ ~AnimationThroughputReporter();
+
+ private:
+ // Tracks when layer animation sequences are scheduled and finished.
+ class AnimationTracker;
+
+ // Returns the relevant compositor of |animator|. Note it could return
+ // nullptr if |animator| has not attached to an animation timeline.
+ // Listed here to access LayerAnimator's protected delegate().
+ static Compositor* GetCompositor(LayerAnimator* animator);
+
+ // Whether |animator_| is attached to a timeline.
+ // List here to access LayerAnimation's private |anmation_| member.
+ static bool IsAnimatorAttachedToTimeline(LayerAnimator* animator);
+
+ LayerAnimator* const animator_;
+ std::unique_ptr<AnimationTracker> animation_tracker_;
+};
+
+} // namespace ui
+
+#endif // UI_COMPOSITOR_ANIMATION_THROUGHPUT_REPORTER_H_
diff --git a/chromium/ui/compositor/animation_throughput_reporter_unittest.cc b/chromium/ui/compositor/animation_throughput_reporter_unittest.cc
new file mode 100644
index 00000000000..c6a14ba2f45
--- /dev/null
+++ b/chromium/ui/compositor/animation_throughput_reporter_unittest.cc
@@ -0,0 +1,271 @@
+// 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_throughput_reporter.h"
+
+#include <memory>
+
+#include "base/run_loop.h"
+#include "base/test/bind_test_util.h"
+#include "base/test/task_environment.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
+#include "cc/metrics/frame_sequence_metrics.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/compositor/compositor.h"
+#include "ui/compositor/layer.h"
+#include "ui/compositor/layer_animation_sequence.h"
+#include "ui/compositor/layer_animator.h"
+#include "ui/compositor/scoped_layer_animation_settings.h"
+#include "ui/compositor/test/test_compositor_host.h"
+#include "ui/compositor/test/test_context_factories.h"
+#include "ui/gfx/geometry/rect.h"
+
+namespace ui {
+
+class AnimationThroughputReporterTest : public testing::Test {
+ public:
+ AnimationThroughputReporterTest()
+ : task_environment_(base::test::TaskEnvironment::MainThreadType::UI) {}
+ AnimationThroughputReporterTest(const AnimationThroughputReporterTest&) =
+ delete;
+ AnimationThroughputReporterTest& operator=(
+ const AnimationThroughputReporterTest&) = delete;
+ ~AnimationThroughputReporterTest() override = default;
+
+ // testing::Test:
+ void SetUp() override {
+ context_factories_ = std::make_unique<TestContextFactories>(false);
+
+ const gfx::Rect bounds(100, 100);
+ host_.reset(TestCompositorHost::Create(
+ bounds, context_factories_->GetContextFactory()));
+ host_->Show();
+
+ compositor()->SetRootLayer(&root_);
+
+ frame_generation_timer_.Start(
+ FROM_HERE, base::TimeDelta::FromMilliseconds(50), this,
+ &AnimationThroughputReporterTest::GenerateOneFrame);
+ }
+
+ void TearDown() override {
+ frame_generation_timer_.Stop();
+ host_.reset();
+ context_factories_.reset();
+ }
+
+ void GenerateOneFrame() { compositor()->ScheduleFullRedraw(); }
+
+ Compositor* compositor() { return host_->GetCompositor(); }
+ Layer* root_layer() { return &root_; }
+
+ private:
+ base::test::TaskEnvironment task_environment_;
+
+ std::unique_ptr<TestContextFactories> context_factories_;
+ std::unique_ptr<TestCompositorHost> host_;
+ Layer root_;
+
+ // A timer to generate continuous compositor frames to trigger throughput
+ // data being transferred back.
+ base::RepeatingTimer frame_generation_timer_;
+};
+
+// Tests animation throughput collection with implicit animation scenario.
+TEST_F(AnimationThroughputReporterTest, ImplicitAnimation) {
+ Layer layer;
+ layer.SetOpacity(0.5f);
+ root_layer()->Add(&layer);
+
+ base::RunLoop run_loop;
+ {
+ LayerAnimator* animator = layer.GetAnimator();
+ AnimationThroughputReporter reporter(
+ animator, base::BindLambdaForTesting(
+ [&](cc::FrameSequenceMetrics::ThroughputData) {
+ run_loop.Quit();
+ }));
+
+ ScopedLayerAnimationSettings settings(animator);
+ settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(50));
+ layer.SetOpacity(1.0f);
+ }
+ run_loop.Run();
+}
+
+// Tests animation throughput collection with implicit animation setup before
+// Layer is attached to a compositor.
+TEST_F(AnimationThroughputReporterTest, ImplicitAnimationLateAttach) {
+ Layer layer;
+ layer.SetOpacity(0.5f);
+
+ base::RunLoop run_loop;
+ {
+ LayerAnimator* animator = layer.GetAnimator();
+ AnimationThroughputReporter reporter(
+ animator, base::BindLambdaForTesting(
+ [&](cc::FrameSequenceMetrics::ThroughputData) {
+ run_loop.Quit();
+ }));
+
+ ScopedLayerAnimationSettings settings(animator);
+ settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(50));
+ layer.SetOpacity(1.0f);
+ }
+
+ // Attach to root after animation setup.
+ root_layer()->Add(&layer);
+
+ run_loop.Run();
+}
+
+// Tests animation throughput collection with explicitly created animation
+// sequence scenario.
+TEST_F(AnimationThroughputReporterTest, ExplicitAnimation) {
+ Layer layer;
+ layer.SetOpacity(0.5f);
+ root_layer()->Add(&layer);
+
+ base::RunLoop run_loop;
+ {
+ LayerAnimator* animator = layer.GetAnimator();
+ AnimationThroughputReporter reporter(
+ animator, base::BindLambdaForTesting(
+ [&](cc::FrameSequenceMetrics::ThroughputData) {
+ run_loop.Quit();
+ }));
+
+ animator->ScheduleAnimation(
+ new LayerAnimationSequence(LayerAnimationElement::CreateOpacityElement(
+ 1.0f, base::TimeDelta::FromMilliseconds(50))));
+ }
+ run_loop.Run();
+}
+
+// Tests animation throughput collection for a persisted animator of a Layer.
+TEST_F(AnimationThroughputReporterTest, PersistedAnimation) {
+ auto layer = std::make_unique<Layer>();
+ layer->SetOpacity(0.5f);
+ root_layer()->Add(layer.get());
+
+ // Set a persisted animator to |layer|.
+ LayerAnimator* animator =
+ new LayerAnimator(base::TimeDelta::FromMilliseconds(50));
+ layer->SetAnimator(animator);
+
+ 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(); }));
+
+ // Report data for animation of opacity goes to 1.
+ layer->SetOpacity(1.0f);
+ run_loop->Run();
+
+ // Report data for animation of opacity goes to 0.5.
+ run_loop = std::make_unique<base::RunLoop>();
+ layer->SetOpacity(0.5f);
+ run_loop->Run();
+}
+
+// Tests animation throughput not reported when animation is aborted.
+TEST_F(AnimationThroughputReporterTest, AbortedAnimation) {
+ auto layer = std::make_unique<Layer>();
+ layer->SetOpacity(0.5f);
+ root_layer()->Add(layer.get());
+
+ {
+ LayerAnimator* animator = layer->GetAnimator();
+ AnimationThroughputReporter reporter(
+ animator, base::BindLambdaForTesting(
+ [&](cc::FrameSequenceMetrics::ThroughputData) {
+ ADD_FAILURE() << "No report for aborted animations.";
+ }));
+
+ ScopedLayerAnimationSettings settings(animator);
+ settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(50));
+ layer->SetOpacity(1.0f);
+ }
+
+ // Delete |layer| to abort on-going animations.
+ layer.reset();
+
+ // Wait a bit to ensure that report does not happen.
+ base::RunLoop run_loop;
+ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+ FROM_HERE, run_loop.QuitClosure(),
+ base::TimeDelta::FromMilliseconds(100));
+ run_loop.Run();
+}
+
+// Tests animation throughput not reported when detached from timeline.
+TEST_F(AnimationThroughputReporterTest, NoReportOnDetach) {
+ auto layer = std::make_unique<Layer>();
+ layer->SetOpacity(0.5f);
+ root_layer()->Add(layer.get());
+
+ {
+ LayerAnimator* animator = layer->GetAnimator();
+ AnimationThroughputReporter reporter(
+ animator, base::BindLambdaForTesting(
+ [&](cc::FrameSequenceMetrics::ThroughputData) {
+ ADD_FAILURE() << "No report for aborted animations.";
+ }));
+
+ ScopedLayerAnimationSettings settings(animator);
+ settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(50));
+ layer->SetOpacity(1.0f);
+ }
+
+ // Detach from the root and attach to a root.
+ root_layer()->Remove(layer.get());
+ root_layer()->Add(layer.get());
+
+ // Wait a bit to ensure that report does not happen.
+ base::RunLoop run_loop;
+ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+ FROM_HERE, run_loop.QuitClosure(),
+ base::TimeDelta::FromMilliseconds(100));
+ run_loop.Run();
+}
+
+// Tests animation throughput not reported and no leak when animation is stopped
+// without being attached to a root.
+TEST_F(AnimationThroughputReporterTest, EndDetachedNoReportNoLeak) {
+ auto layer = std::make_unique<Layer>();
+ layer->SetOpacity(0.5f);
+
+ LayerAnimator* animator = layer->GetAnimator();
+
+ // Schedule an animation without being attached to a root.
+ {
+ AnimationThroughputReporter reporter(
+ animator, base::BindLambdaForTesting(
+ [&](cc::FrameSequenceMetrics::ThroughputData) {
+ ADD_FAILURE() << "No report for aborted animations.";
+ }));
+
+ ScopedLayerAnimationSettings settings(animator);
+ settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(50));
+ layer->SetOpacity(1.0f);
+ }
+
+ // End the animation without being attached to a root.
+ animator->StopAnimating();
+
+ // Wait a bit to ensure that report does not happen.
+ base::RunLoop run_loop;
+ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+ FROM_HERE, run_loop.QuitClosure(),
+ base::TimeDelta::FromMilliseconds(100));
+ run_loop.Run();
+
+ // AnimationTracker in |reporter| should not leak in asan.
+}
+
+} // namespace ui
diff --git a/chromium/ui/compositor/callback_layer_animation_observer.cc b/chromium/ui/compositor/callback_layer_animation_observer.cc
index 8082678d7b1..3c41fe6fb35 100644
--- a/chromium/ui/compositor/callback_layer_animation_observer.cc
+++ b/chromium/ui/compositor/callback_layer_animation_observer.cc
@@ -5,6 +5,7 @@
#include "ui/compositor/callback_layer_animation_observer.h"
#include "base/bind.h"
+#include "base/logging.h"
#include "ui/compositor/layer_animation_sequence.h"
namespace ui {
diff --git a/chromium/ui/compositor/compositor.cc b/chromium/ui/compositor/compositor.cc
index 178fc2628e3..65d2f3ec773 100644
--- a/chromium/ui/compositor/compositor.cc
+++ b/chromium/ui/compositor/compositor.cc
@@ -450,16 +450,6 @@ void Compositor::SetDisplayColorSpaces(
if (display_color_spaces_ == display_color_spaces)
return;
display_color_spaces_ = display_color_spaces;
- // TODO(crbug.com/1012846): Remove this flag and provision when HDR is fully
- // supported on ChromeOS.
-#if defined(OS_CHROMEOS)
- if (display_color_spaces_.SupportsHDR() &&
- !base::CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kEnableUseHDRTransferFunction)) {
- display_color_spaces_ =
- gfx::DisplayColorSpaces(gfx::ColorSpace::CreateSRGB());
- }
-#endif
host_->SetRasterColorSpace(display_color_spaces_.GetRasterColorSpace());
// Always force the ui::Compositor to re-draw all layers, because damage
@@ -615,7 +605,8 @@ void Compositor::IssueExternalBeginFrame(
}
ThroughputTracker Compositor::RequestNewThroughputTracker() {
- return ThroughputTracker(next_throughput_tracker_id_++, this);
+ return ThroughputTracker(next_throughput_tracker_id_++,
+ weak_ptr_factory_.GetWeakPtr());
}
void Compositor::DidUpdateLayers() {
diff --git a/chromium/ui/compositor/compositor.h b/chromium/ui/compositor/compositor.h
index 48cd5ff63d7..438dd212d88 100644
--- a/chromium/ui/compositor/compositor.h
+++ b/chromium/ui/compositor/compositor.h
@@ -346,6 +346,13 @@ class COMPOSITOR_EXPORT Compositor : public cc::LayerTreeHostClient,
override;
void NotifyThroughputTrackerResults(
cc::CustomTrackerResults results) override;
+ void SubmitThroughputData(ukm::SourceId source_id,
+ int aggregated_percent,
+ int impl_percent,
+ base::Optional<int> main_percent) override {}
+ void DidObserveFirstScrollDelay(
+ base::TimeDelta first_scroll_delay,
+ base::TimeTicks first_scroll_timestamp) override {}
// cc::LayerTreeHostSingleThreadClient implementation.
void DidSubmitCompositorFrame() override;
@@ -483,6 +490,7 @@ class COMPOSITOR_EXPORT Compositor : public cc::LayerTreeHostClient,
ThroughputTrackerMap throughput_tracker_map_;
base::WeakPtrFactory<Compositor> context_creation_weak_ptr_factory_{this};
+ base::WeakPtrFactory<Compositor> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(Compositor);
};
diff --git a/chromium/ui/compositor/compositor_unittest.cc b/chromium/ui/compositor/compositor_unittest.cc
index e92a5eb1362..8515cdc5ab1 100644
--- a/chromium/ui/compositor/compositor_unittest.cc
+++ b/chromium/ui/compositor/compositor_unittest.cc
@@ -270,6 +270,19 @@ TEST_F(CompositorTestWithMessageLoop, ThroughputTracker) {
run_loop.Run();
}
+TEST_F(CompositorTestWithMessageLoop, ThroughputTrackerOutliveCompositor) {
+ auto tracker = compositor()->RequestNewThroughputTracker();
+ tracker.Start(base::BindLambdaForTesting(
+ [&](cc::FrameSequenceMetrics::ThroughputData throughput) {
+ ADD_FAILURE() << "No report should happen";
+ }));
+
+ DestroyCompositor();
+
+ // No crash, no use-after-free and no report.
+ tracker.Stop();
+}
+
#if defined(OS_WIN)
// TODO(crbug.com/608436): Flaky on windows trybots
#define MAYBE_CreateAndReleaseOutputSurface \
diff --git a/chromium/ui/compositor/layer.cc b/chromium/ui/compositor/layer.cc
index ec9f20471ae..27efca014fd 100644
--- a/chromium/ui/compositor/layer.cc
+++ b/chromium/ui/compositor/layer.cc
@@ -308,7 +308,9 @@ void Layer::SetShowReflectedLayerSubtree(Layer* subtree_reflected_layer) {
scoped_refptr<cc::MirrorLayer> new_layer =
cc::MirrorLayer::Create(subtree_reflected_layer->cc_layer_);
- SwitchToLayer(new_layer);
+ if (!SwitchToLayer(new_layer))
+ return;
+
mirror_layer_ = std::move(new_layer);
subtree_reflected_layer_ = subtree_reflected_layer;
@@ -375,12 +377,20 @@ void Layer::Add(Layer* child) {
}
void Layer::Remove(Layer* child) {
+ base::WeakPtr<Layer> weak_this = weak_ptr_factory_.GetWeakPtr();
+ base::WeakPtr<Layer> weak_child = child->weak_ptr_factory_.GetWeakPtr();
+
// Current bounds are used to calculate offsets when layers are reparented.
// Stop (and complete) an ongoing animation to update the bounds immediately.
LayerAnimator* child_animator = child->animator_.get();
if (child_animator)
child_animator->StopAnimatingProperty(ui::LayerAnimationElement::BOUNDS);
+ // Do not proceed if |this| or |child| is released by an animation observer
+ // of |child|'s bounds animation.
+ if (!weak_this || !weak_child)
+ return;
+
Compositor* compositor = GetCompositor();
if (compositor)
child->ResetCompositorForAnimatorsInTree(compositor);
@@ -725,11 +735,19 @@ void Layer::SetName(const std::string& name) {
cc_layer_->SetDebugName(name);
}
-void Layer::SwitchToLayer(scoped_refptr<cc::Layer> new_layer) {
+bool Layer::SwitchToLayer(scoped_refptr<cc::Layer> new_layer) {
// Finish animations being handled by cc_layer_.
if (animator_) {
+ base::WeakPtr<Layer> weak_this = weak_ptr_factory_.GetWeakPtr();
+
animator_->StopAnimatingProperty(LayerAnimationElement::TRANSFORM);
+ if (!weak_this)
+ return false;
+
animator_->StopAnimatingProperty(LayerAnimationElement::OPACITY);
+ if (!weak_this)
+ return false;
+
animator_->SwitchToLayer(new_layer);
}
@@ -781,12 +799,16 @@ void Layer::SwitchToLayer(scoped_refptr<cc::Layer> new_layer) {
SetLayerFilters();
SetLayerBackgroundFilters();
+ return true;
}
-void Layer::SwitchCCLayerForTest() {
+bool Layer::SwitchCCLayerForTest() {
scoped_refptr<cc::PictureLayer> new_layer = cc::PictureLayer::Create(this);
- SwitchToLayer(new_layer);
+ if (!SwitchToLayer(new_layer))
+ return false;
+
content_layer_ = std::move(new_layer);
+ return true;
}
// Note: The code that sets this flag would be responsible to unset it on that
@@ -889,7 +911,9 @@ void Layer::SetTransferableResource(
scoped_refptr<cc::TextureLayer> new_layer =
cc::TextureLayer::CreateForMailbox(this);
new_layer->SetFlipped(true);
- SwitchToLayer(new_layer);
+ if (!SwitchToLayer(new_layer))
+ return;
+
texture_layer_ = new_layer;
// Reset the frame_size_in_dip_ so that SetTextureSize() will not early out,
// the frame_size_in_dip_ was for a previous (different) |texture_layer_|.
@@ -972,7 +996,9 @@ void Layer::SetShowReflectedSurface(const viz::SurfaceId& surface_id,
if (!surface_layer_) {
scoped_refptr<cc::SurfaceLayer> new_layer = cc::SurfaceLayer::Create();
- SwitchToLayer(new_layer);
+ if (!SwitchToLayer(new_layer))
+ return;
+
surface_layer_ = new_layer;
}
@@ -1007,7 +1033,9 @@ void Layer::SetShowSolidColorContent() {
return;
scoped_refptr<cc::SolidColorLayer> new_layer = cc::SolidColorLayer::Create();
- SwitchToLayer(new_layer);
+ if (!SwitchToLayer(new_layer))
+ return;
+
solid_color_layer_ = new_layer;
transfer_resource_ = viz::TransferableResource();
@@ -1385,10 +1413,12 @@ void Layer::SetBoundsFromAnimation(const gfx::Rect& bounds,
reflecting_layer->MatchLayerSize(this);
}
-void Layer::SetTransformFromAnimation(const gfx::Transform& transform,
+void Layer::SetTransformFromAnimation(const gfx::Transform& new_transform,
PropertyChangeReason reason) {
- const gfx::Transform old_transform = this->transform();
- cc_layer_->SetTransform(transform);
+ const gfx::Transform old_transform = transform();
+ if (old_transform == new_transform)
+ return;
+ cc_layer_->SetTransform(new_transform);
// Skip recomputing position if the subpixel offset does not need updating
// which is the case if an explicit offset is set.
@@ -1618,7 +1648,9 @@ void Layer::CreateSurfaceLayerIfNecessary() {
return;
scoped_refptr<cc::SurfaceLayer> new_layer = cc::SurfaceLayer::Create();
new_layer->SetSurfaceHitTestable(true);
- SwitchToLayer(new_layer);
+ if (!SwitchToLayer(new_layer))
+ return;
+
surface_layer_ = new_layer;
}
diff --git a/chromium/ui/compositor/layer.h b/chromium/ui/compositor/layer.h
index 505c81e688c..8434ac53c33 100644
--- a/chromium/ui/compositor/layer.h
+++ b/chromium/ui/compositor/layer.h
@@ -458,7 +458,7 @@ class COMPOSITOR_EXPORT Layer : public LayerAnimationDelegate,
float device_scale_factor() const { return device_scale_factor_; }
// Triggers a call to SwitchToLayer.
- void SwitchCCLayerForTest();
+ bool SwitchCCLayerForTest();
const cc::Region& damaged_region_for_testing() const {
return damaged_region_;
@@ -527,7 +527,7 @@ class COMPOSITOR_EXPORT Layer : public LayerAnimationDelegate,
// Implementation of LayerAnimatorDelegate
void SetBoundsFromAnimation(const gfx::Rect& bounds,
PropertyChangeReason reason) override;
- void SetTransformFromAnimation(const gfx::Transform& transform,
+ void SetTransformFromAnimation(const gfx::Transform& new_transform,
PropertyChangeReason reason) override;
void SetOpacityFromAnimation(float opacity,
PropertyChangeReason reason) override;
@@ -575,8 +575,11 @@ class COMPOSITOR_EXPORT Layer : public LayerAnimationDelegate,
// Set all filters which got applied to the layer background.
void SetLayerBackgroundFilters();
- // Cleanup |cc_layer_| and replaces it with |new_layer|.
- void SwitchToLayer(scoped_refptr<cc::Layer> new_layer);
+ // Cleanup |cc_layer_| and replaces it with |new_layer|. When stopping
+ // animations handled by old cc layer before the switch, |this| could be
+ // released by an animation observer. Returns false when it happens and
+ // callers should take cautions as well. Otherwise returns true.
+ bool SwitchToLayer(scoped_refptr<cc::Layer> new_layer) WARN_UNUSED_RESULT;
void SetCompositorForAnimatorsInTree(Compositor* compositor);
void ResetCompositorForAnimatorsInTree(Compositor* compositor);
diff --git a/chromium/ui/compositor/layer_animation_observer.cc b/chromium/ui/compositor/layer_animation_observer.cc
index 2c77493b76d..043176d6ccd 100644
--- a/chromium/ui/compositor/layer_animation_observer.cc
+++ b/chromium/ui/compositor/layer_animation_observer.cc
@@ -59,10 +59,7 @@ void LayerAnimationObserver::DetachedFromSequence(
// ImplicitAnimationObserver
ImplicitAnimationObserver::ImplicitAnimationObserver()
- : active_(false),
- destroyed_(NULL),
- first_sequence_scheduled_(false) {
-}
+ : active_(false), destroyed_(nullptr), first_sequence_scheduled_(false) {}
ImplicitAnimationObserver::~ImplicitAnimationObserver() {
if (destroyed_)
@@ -97,7 +94,7 @@ void ImplicitAnimationObserver::OnLayerAnimationEnded(
sequence->RemoveObserver(this);
if (destroyed)
return;
- destroyed_ = NULL;
+ destroyed_ = nullptr;
DCHECK(attached_sequences().find(sequence) == attached_sequences().end());
CheckCompleted();
}
@@ -110,7 +107,7 @@ void ImplicitAnimationObserver::OnLayerAnimationAborted(
sequence->RemoveObserver(this);
if (destroyed)
return;
- destroyed_ = NULL;
+ destroyed_ = nullptr;
DCHECK(attached_sequences().find(sequence) == attached_sequences().end());
CheckCompleted();
}
diff --git a/chromium/ui/compositor/layer_animation_observer.h b/chromium/ui/compositor/layer_animation_observer.h
index b83acde04fb..eb460da8533 100644
--- a/chromium/ui/compositor/layer_animation_observer.h
+++ b/chromium/ui/compositor/layer_animation_observer.h
@@ -73,6 +73,12 @@ class COMPOSITOR_EXPORT LayerAnimationObserver {
// Called when |this| is removed to |sequence|'s observer list.
virtual void OnDetachedFromSequence(LayerAnimationSequence* sequence);
+ // Called when the relevant animator attaches to an animation timeline.
+ virtual void OnAnimatorAttachedToTimeline() {}
+
+ // Called when the relevant animator detaches from an animation timeline.
+ virtual void OnAnimatorDetachedFromTimeline() {}
+
// Detaches this observer from all sequences it is currently observing.
void StopObserving();
diff --git a/chromium/ui/compositor/layer_animation_sequence.cc b/chromium/ui/compositor/layer_animation_sequence.cc
index 06995075fcf..e25e1c34541 100644
--- a/chromium/ui/compositor/layer_animation_sequence.cc
+++ b/chromium/ui/compositor/layer_animation_sequence.cc
@@ -249,11 +249,17 @@ 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(
diff --git a/chromium/ui/compositor/layer_animator.cc b/chromium/ui/compositor/layer_animator.cc
index e3e564a1037..a9db6922b89 100644
--- a/chromium/ui/compositor/layer_animator.cc
+++ b/chromium/ui/compositor/layer_animator.cc
@@ -31,10 +31,9 @@
((running_anim.is_sequence_alive()) \
? function(running_anim.sequence()) \
: false)
-#define SAFE_INVOKE_PTR(function, running_anim) \
- ((running_anim.is_sequence_alive()) \
- ? function(running_anim.sequence()) \
- : NULL)
+#define SAFE_INVOKE_PTR(function, running_anim) \
+ ((running_anim.is_sequence_alive()) ? function(running_anim.sequence()) \
+ : nullptr)
namespace ui {
@@ -47,7 +46,7 @@ const int kLayerAnimatorDefaultTransitionDurationMs = 120;
// LayerAnimator public --------------------------------------------------------
LayerAnimator::LayerAnimator(base::TimeDelta transition_duration)
- : delegate_(NULL),
+ : delegate_(nullptr),
preemption_strategy_(IMMEDIATELY_SET_NEW_TARGET),
is_transition_duration_locked_(false),
transition_duration_(transition_duration),
@@ -66,7 +65,7 @@ LayerAnimator::~LayerAnimator() {
running_animations_[i].sequence()->OnAnimatorDestroyed();
}
ClearAnimationsInternal();
- delegate_ = NULL;
+ delegate_ = nullptr;
DCHECK(!animation_->animation_timeline());
}
@@ -660,7 +659,7 @@ LayerAnimator::RunningAnimation* LayerAnimator::GetRunningAnimation(
if ((*iter).sequence()->properties() & property)
return &(*iter);
}
- return NULL;
+ return nullptr;
}
void LayerAnimator::AddToQueueIfNotPresent(LayerAnimationSequence* animation) {
@@ -735,7 +734,7 @@ void LayerAnimator::ImmediatelySetNewTarget(LayerAnimationSequence* sequence) {
return;
LayerAnimationSequence* removed = RemoveAnimation(sequence);
- DCHECK(removed == NULL || removed == sequence);
+ DCHECK(removed == nullptr || removed == sequence);
if (!weak_sequence_ptr.get())
return;
@@ -950,7 +949,7 @@ void LayerAnimator::PurgeDeletedAnimations() {
}
LayerAnimatorCollection* LayerAnimator::GetLayerAnimatorCollection() {
- return delegate_ ? delegate_->GetLayerAnimatorCollection() : NULL;
+ return delegate_ ? delegate_->GetLayerAnimatorCollection() : nullptr;
}
void LayerAnimator::NotifyAnimationStarted(base::TimeTicks monotonic_time,
diff --git a/chromium/ui/compositor/layer_animator.h b/chromium/ui/compositor/layer_animator.h
index c9a64b24712..fe4cb76be33 100644
--- a/chromium/ui/compositor/layer_animator.h
+++ b/chromium/ui/compositor/layer_animator.h
@@ -258,6 +258,7 @@ class COMPOSITOR_EXPORT LayerAnimator : public base::RefCounted<LayerAnimator>,
friend class base::RefCounted<LayerAnimator>;
friend class ScopedLayerAnimationSettings;
friend class LayerAnimatorTestController;
+ friend class AnimationThroughputReporter;
FRIEND_TEST_ALL_PREFIXES(LayerAnimatorTest, AnimatorStartedCorrectly);
FRIEND_TEST_ALL_PREFIXES(LayerAnimatorTest,
AnimatorRemovedFromCollectionWhenLayerIsDestroyed);
diff --git a/chromium/ui/compositor/layer_animator_unittest.cc b/chromium/ui/compositor/layer_animator_unittest.cc
index c02519f0d86..bbb9f4c5c37 100644
--- a/chromium/ui/compositor/layer_animator_unittest.cc
+++ b/chromium/ui/compositor/layer_animator_unittest.cc
@@ -231,8 +231,9 @@ class LayerAnimatorDestructionObserver {
class TestLayerAnimator : public LayerAnimator {
public:
- TestLayerAnimator() : LayerAnimator(base::TimeDelta::FromSeconds(0)),
- destruction_observer_(NULL) {}
+ TestLayerAnimator()
+ : LayerAnimator(base::TimeDelta::FromSeconds(0)),
+ destruction_observer_(nullptr) {}
void SetDestructionObserver(
LayerAnimatorDestructionObserver* observer) {
diff --git a/chromium/ui/compositor/layer_owner.cc b/chromium/ui/compositor/layer_owner.cc
index c8adc411bcb..3eaf415111b 100644
--- a/chromium/ui/compositor/layer_owner.cc
+++ b/chromium/ui/compositor/layer_owner.cc
@@ -33,7 +33,7 @@ void LayerOwner::SetLayer(std::unique_ptr<Layer> layer) {
std::unique_ptr<Layer> LayerOwner::AcquireLayer() {
if (layer_owner_)
- layer_owner_->owner_ = NULL;
+ layer_owner_->owner_ = nullptr;
return std::move(layer_owner_);
}
@@ -53,7 +53,7 @@ std::unique_ptr<Layer> LayerOwner::RecreateLayer() {
return old_layer;
LayerDelegate* old_delegate = old_layer->delegate();
- old_layer->set_delegate(NULL);
+ old_layer->set_delegate(nullptr);
SetLayer(old_layer->Clone());
@@ -88,7 +88,7 @@ std::unique_ptr<Layer> LayerOwner::RecreateLayer() {
}
void LayerOwner::DestroyLayer() {
- layer_ = NULL;
+ layer_ = nullptr;
layer_owner_.reset();
}
diff --git a/chromium/ui/compositor/layer_owner.h b/chromium/ui/compositor/layer_owner.h
index 7d4bc47b536..c541ca919c8 100644
--- a/chromium/ui/compositor/layer_owner.h
+++ b/chromium/ui/compositor/layer_owner.h
@@ -50,7 +50,7 @@ class COMPOSITOR_EXPORT LayerOwner {
// |layer|.
void Reset(std::unique_ptr<Layer> layer);
- // Asks the owner to recreate the layer, returning the old Layer. NULL is
+ // Asks the owner to recreate the layer, returning the old Layer. nullptr is
// returned if there is no existing layer, or recreate is not supported.
//
// This does not recurse. Existing children of the layer are moved to the new
@@ -69,7 +69,7 @@ class COMPOSITOR_EXPORT LayerOwner {
private:
// The LayerOwner owns its layer unless ownership is relinquished via a call
// to AcquireLayer(). After that moment |layer_| will still be valid but
- // |layer_owner_| will be NULL. The reason for releasing ownership is that
+ // |layer_owner_| will be nullptr. The reason for releasing ownership is that
// the client may wish to animate the layer beyond the lifetime of the owner,
// e.g. fading it out when it is destroyed.
std::unique_ptr<Layer> layer_owner_;
diff --git a/chromium/ui/compositor/layer_tree_owner.h b/chromium/ui/compositor/layer_tree_owner.h
index 4412c2225a0..ed0e53b14af 100644
--- a/chromium/ui/compositor/layer_tree_owner.h
+++ b/chromium/ui/compositor/layer_tree_owner.h
@@ -23,7 +23,7 @@ class COMPOSITOR_EXPORT LayerTreeOwner {
Layer* release() WARN_UNUSED_RESULT {
Layer* root = root_;
- root_ = NULL;
+ root_ = nullptr;
return root;
}
diff --git a/chromium/ui/compositor/layer_unittest.cc b/chromium/ui/compositor/layer_unittest.cc
index d97c7e846af..77945544e9f 100644
--- a/chromium/ui/compositor/layer_unittest.cc
+++ b/chromium/ui/compositor/layer_unittest.cc
@@ -790,7 +790,7 @@ TEST_F(LayerWithDelegateTest, Cloning) {
layer->SetFillsBoundsOpaquely(false);
// Color and opaqueness targets should be preserved during cloning, even after
// switching away from solid color content.
- layer->SwitchCCLayerForTest();
+ ASSERT_TRUE(layer->SwitchCCLayerForTest());
clone = layer->Clone();
@@ -1971,7 +1971,7 @@ namespace {
class SchedulePaintLayerDelegate : public LayerDelegate {
public:
- SchedulePaintLayerDelegate() : paint_count_(0), layer_(NULL) {}
+ SchedulePaintLayerDelegate() : paint_count_(0), layer_(nullptr) {}
~SchedulePaintLayerDelegate() override {}
@@ -2427,7 +2427,7 @@ TEST_P(LayerWithRealCompositorTest, SwitchCCLayerAnimations) {
l1->SetOpacity(0.5f);
// Change l1's cc::Layer.
- l1->SwitchCCLayerForTest();
+ ASSERT_TRUE(l1->SwitchCCLayerForTest());
// Ensure that the opacity animation completed.
EXPECT_FLOAT_EQ(l1->opacity(), 0.5f);
@@ -2449,7 +2449,7 @@ TEST_P(LayerWithRealCompositorTest, SwitchCCLayerSolidColorNotAnimating) {
EXPECT_EQ(transparent, root->GetTargetColor());
// Changing the underlying layer should not affect targets.
- root->SwitchCCLayerForTest();
+ ASSERT_TRUE(root->SwitchCCLayerForTest());
EXPECT_FALSE(root->fills_bounds_opaquely());
EXPECT_FALSE(
@@ -2487,7 +2487,7 @@ TEST_P(LayerWithRealCompositorTest, SwitchCCLayerSolidColorWhileAnimating) {
EXPECT_EQ(transparent, root->GetTargetColor());
// Changing the underlying layer should not affect targets.
- root->SwitchCCLayerForTest();
+ ASSERT_TRUE(root->SwitchCCLayerForTest());
EXPECT_TRUE(root->fills_bounds_opaquely());
EXPECT_TRUE(
@@ -2515,7 +2515,7 @@ TEST_P(LayerWithRealCompositorTest, SwitchCCLayerCacheRenderSurface) {
l1->AddCacheRenderSurfaceRequest();
// Change l1's cc::Layer.
- l1->SwitchCCLayerForTest();
+ ASSERT_TRUE(l1->SwitchCCLayerForTest());
// Ensure that the cache_render_surface flag is maintained.
EXPECT_TRUE(l1->cc_layer_for_testing()->cache_render_surface());
@@ -2532,7 +2532,7 @@ TEST_P(LayerWithRealCompositorTest, SwitchCCLayerTrilinearFiltering) {
l1->AddTrilinearFilteringRequest();
// Change l1's cc::Layer.
- l1->SwitchCCLayerForTest();
+ ASSERT_TRUE(l1->SwitchCCLayerForTest());
// Ensure that the trilinear_filtering flag is maintained.
EXPECT_TRUE(l1->cc_layer_for_testing()->trilinear_filtering());
@@ -2550,12 +2550,38 @@ TEST_P(LayerWithRealCompositorTest, SwitchCCLayerMasksToBounds) {
EXPECT_TRUE(l1->cc_layer_for_testing()->masks_to_bounds());
// Change l1's cc::Layer.
- l1->SwitchCCLayerForTest();
+ ASSERT_TRUE(l1->SwitchCCLayerForTest());
// Ensure that the trilinear_filtering flag is maintained.
EXPECT_TRUE(l1->cc_layer_for_testing()->masks_to_bounds());
}
+// Tests that no crash happens when switching cc layer with an animation
+// observer that deletes the layer itself.
+TEST_P(LayerWithRealCompositorTest, SwitchCCLayerDeleteLayer) {
+ std::unique_ptr<Layer> root(CreateLayer(LAYER_TEXTURED));
+ std::unique_ptr<Layer> l1(CreateLayer(LAYER_TEXTURED));
+ GetCompositor()->SetRootLayer(root.get());
+ root->Add(l1.get());
+
+ TestCallbackAnimationObserver animation_observer;
+ animation_observer.SetCallback(
+ base::BindLambdaForTesting([&]() { l1.reset(); }));
+
+ auto long_duration_animation =
+ std::make_unique<ui::ScopedAnimationDurationScaleMode>(
+ ui::ScopedAnimationDurationScaleMode::SLOW_DURATION);
+ {
+ ui::ScopedLayerAnimationSettings animation(l1->GetAnimator());
+ animation.AddObserver(&animation_observer);
+ animation.SetTransitionDuration(base::TimeDelta::FromMilliseconds(1000));
+ l1->SetOpacity(0.f);
+ }
+
+ // Fails but no crash.
+ EXPECT_FALSE(l1->SwitchCCLayerForTest());
+}
+
// Triggerring a OnDeviceScaleFactorChanged while a layer is undergoing
// transform animation, may cause a crash. This is because an animation observer
// may mutate the tree, e.g. deleting a layer, changing ancestor z-order etc,
@@ -2604,9 +2630,6 @@ TEST_P(LayerWithRealCompositorTest, TreeMutationDuringScaleFactorChange) {
root->Add(layer_to_delete.get());
layer_to_delete->Add(child.get());
- long_duration_animation =
- std::make_unique<ui::ScopedAnimationDurationScaleMode>(
- ui::ScopedAnimationDurationScaleMode::SLOW_DURATION);
{
ui::ScopedLayerAnimationSettings animation(layer_to_delete->GetAnimator());
animation.AddObserver(&animation_observer);
@@ -2629,9 +2652,6 @@ TEST_P(LayerWithRealCompositorTest, TreeMutationDuringScaleFactorChange) {
layer_to_delete->Add(child.get());
layer_to_delete->Add(child2.get());
- long_duration_animation =
- std::make_unique<ui::ScopedAnimationDurationScaleMode>(
- ui::ScopedAnimationDurationScaleMode::SLOW_DURATION);
{
ui::ScopedLayerAnimationSettings animation(child->GetAnimator());
animation.AddObserver(&animation_observer);
@@ -2666,6 +2686,60 @@ TEST_P(LayerWithRealCompositorTest, TreeMutationDuringScaleFactorChange) {
root->OnDeviceScaleFactorChanged(1.5f);
}
+// Tests that no crash when parent/child layer is released by an animation
+// observer of the child layer bounds animation.
+TEST_P(LayerWithRealCompositorTest, ParentOrChildGoneDuringRemove) {
+ std::unique_ptr<Layer> root = CreateLayer(LAYER_SOLID_COLOR);
+ GetCompositor()->SetRootLayer(root.get());
+ root->SetBounds(gfx::Rect(0, 0, 100, 100));
+
+ // Actions to taken on animation ends.
+ enum class Action {
+ kReleaseParent,
+ kReleaseChild,
+ };
+
+ for (auto action : {Action::kReleaseParent, Action::kReleaseChild}) {
+ SCOPED_TRACE(::testing::Message() << "action=" << static_cast<int>(action));
+
+ std::unique_ptr<Layer> parent = CreateLayer(LAYER_SOLID_COLOR);
+ parent->SetBounds(gfx::Rect(0, 0, 100, 100));
+
+ std::unique_ptr<Layer> child = CreateLayer(LAYER_SOLID_COLOR);
+ child->SetBounds(gfx::Rect(0, 0, 100, 100));
+ parent->Add(child.get());
+
+ root->Add(parent.get());
+
+ // An animation observer that takes action on animation ends.
+ TestCallbackAnimationObserver animation_observer;
+ animation_observer.SetCallback(base::BindLambdaForTesting([&]() {
+ switch (action) {
+ case Action::kReleaseParent:
+ parent.reset();
+ break;
+ case Action::kReleaseChild:
+ child.reset();
+ break;
+ }
+ }));
+
+ // Schedule a bounds animation on |child|.
+ auto long_duration_animation =
+ std::make_unique<ui::ScopedAnimationDurationScaleMode>(
+ ui::ScopedAnimationDurationScaleMode::SLOW_DURATION);
+ {
+ ui::ScopedLayerAnimationSettings animation(child->GetAnimator());
+ animation.AddObserver(&animation_observer);
+ animation.SetTransitionDuration(base::TimeDelta::FromMilliseconds(1000));
+ child->SetBounds(gfx::Rect(10, 20, 100, 100));
+ }
+
+ // No crash should happen when removing |child| with a bounds animation.
+ parent->Remove(child.get());
+ }
+}
+
// Tests that the animators in the layer tree is added to the
// animator-collection when the root-layer is set to the compositor.
TEST_F(LayerWithDelegateTest, RootLayerAnimatorsInCompositor) {
@@ -2910,7 +2984,7 @@ TEST(LayerDelegateTest, OnLayerTransformed) {
layer->SetTransform(target_transform1);
}
gfx::Transform target_transform2;
- target_transform2.Skew(10.0f, 5.0f);
+ target_transform2.Skew(15.0f, 5.0f);
EXPECT_CALL(delegate,
OnLayerTransformed(target_transform1,
PropertyChangeReason::NOT_FROM_ANIMATION))
@@ -2923,6 +2997,18 @@ TEST(LayerDelegateTest, OnLayerTransformed) {
layer->SetTransform(target_transform2);
}
+// Verify that LayerDelegate::OnLayerTransformed() is not called when the
+// transform isn't actually changed.
+TEST(LayerDelegateTest, OnLayerTransformedNotCalledWhenUnchanged) {
+ auto layer = std::make_unique<Layer>(LAYER_TEXTURED);
+ testing::StrictMock<TestLayerDelegate> delegate;
+ layer->set_delegate(&delegate);
+
+ gfx::Transform target_transform;
+ EXPECT_CALL(delegate, OnLayerTransformed).Times(0);
+ layer->SetTransform(target_transform);
+}
+
// Verify that LayerDelegate::OnLayerTransformed() is called at every step of a
// non-threaded transform transition.
TEST(LayerDelegateTest, OnLayerTransformedNonThreadedAnimation) {
@@ -2996,8 +3082,8 @@ TEST(LayerDelegateTest, OnLayerTransformedNonThreadedAnimation) {
testing::Mock::VerifyAndClear(&delegate);
}
-// Verify that LayerDelegate::OnLayerTransformed() is called at the beginning
-// and at the end of a threaded transform transition.
+// Verify that LayerDelegate::OnLayerTransformed() is called at the end of a
+// threaded transform transition.
TEST(LayerDelegateTest, OnLayerTransformedThreadedAnimation) {
ScopedAnimationDurationScaleMode scoped_animation_duration_scale_mode(
ScopedAnimationDurationScaleMode::NORMAL_DURATION);
@@ -3019,17 +3105,12 @@ TEST(LayerDelegateTest, OnLayerTransformedThreadedAnimation) {
target_transform, base::TimeDelta::FromSeconds(1));
ASSERT_TRUE(element->IsThreaded(layer.get()));
LayerAnimationElement* element_raw = element.get();
+ // At the beginning, setting the transform actually does not change, so
+ // OnLayerTransformed isn't called.
EXPECT_CALL(delegate,
OnLayerTransformed(gfx::Transform(),
PropertyChangeReason::FROM_ANIMATION))
- .WillOnce(testing::Invoke([&](const gfx::Transform& old_transform,
- PropertyChangeReason) {
- // Verify that |layer->transform()| returns the correct value when the
- // delegate is notified.
- EXPECT_EQ(layer->transform(), initial_transform);
- EXPECT_TRUE(
- animator->IsAnimatingProperty(LayerAnimationElement::TRANSFORM));
- }));
+ .Times(0);
animator->StartAnimation(new LayerAnimationSequence(std::move(element)));
testing::Mock::VerifyAndClear(&delegate);
test_controller.StartThreadedAnimationsIfNeeded();
diff --git a/chromium/ui/compositor/overscroll/scroll_input_handler.cc b/chromium/ui/compositor/overscroll/scroll_input_handler.cc
index 6b2a80c5cfe..15f1a6a0250 100644
--- a/chromium/ui/compositor/overscroll/scroll_input_handler.cc
+++ b/chromium/ui/compositor/overscroll/scroll_input_handler.cc
@@ -65,8 +65,12 @@ bool ScrollInputHandler::OnScrollEvent(const ScrollEvent& event,
// Note: the WHEEL type covers both actual wheels as well as trackpad
// scrolling.
- input_handler_weak_ptr_->ScrollBegin(&scroll_state_begin,
- ui::ScrollInputType::kWheel);
+ cc::InputHandler::ScrollStatus result = input_handler_weak_ptr_->ScrollBegin(
+ &scroll_state_begin, ui::ScrollInputType::kWheel);
+
+ // Falling back to the main thread should never be required when an explicit
+ // ElementId is provided.
+ DCHECK(!result.needs_main_thread_hit_test);
cc::ScrollState scroll_state = CreateScrollState(event, false);
input_handler_weak_ptr_->ScrollUpdate(&scroll_state, base::TimeDelta());
diff --git a/chromium/ui/compositor/paint_context.h b/chromium/ui/compositor/paint_context.h
index 63e5b75b7d0..c2d3dcaa2af 100644
--- a/chromium/ui/compositor/paint_context.h
+++ b/chromium/ui/compositor/paint_context.h
@@ -7,7 +7,7 @@
#include <memory>
-#include "base/logging.h"
+#include "base/check.h"
#include "base/macros.h"
#include "cc/paint/paint_recorder.h"
#include "ui/compositor/compositor_export.h"
diff --git a/chromium/ui/compositor/throughput_tracker.cc b/chromium/ui/compositor/throughput_tracker.cc
index 04e9b22c3e8..50e379fdc3f 100644
--- a/chromium/ui/compositor/throughput_tracker.cc
+++ b/chromium/ui/compositor/throughput_tracker.cc
@@ -11,8 +11,9 @@
namespace ui {
-ThroughputTracker::ThroughputTracker(TrackerId id, ThroughputTrackerHost* host)
- : id_(id), host_(host) {
+ThroughputTracker::ThroughputTracker(TrackerId id,
+ base::WeakPtr<ThroughputTrackerHost> host)
+ : id_(id), host_(std::move(host)) {
DCHECK(host_);
}
@@ -22,11 +23,11 @@ ThroughputTracker::ThroughputTracker(ThroughputTracker&& other) {
ThroughputTracker& ThroughputTracker::operator=(ThroughputTracker&& other) {
id_ = other.id_;
- host_ = other.host_;
+ host_ = std::move(other.host_);
started_ = other.started_;
other.id_ = kInvalidId;
- other.host_ = nullptr;
+ other.host_.reset();
other.started_ = false;
return *this;
}
@@ -37,18 +38,28 @@ ThroughputTracker::~ThroughputTracker() {
}
void ThroughputTracker::Start(ThroughputTrackerHost::ReportCallback callback) {
+ // Start after |host_| destruction is likely an error.
+ DCHECK(host_);
+ DCHECK(!started_);
+
started_ = true;
host_->StartThroughputTracker(id_, std::move(callback));
}
void ThroughputTracker::Stop() {
+ DCHECK(started_);
+
started_ = false;
- host_->StopThroughtputTracker(id_);
+ if (host_)
+ host_->StopThroughtputTracker(id_);
}
void ThroughputTracker::Cancel() {
+ DCHECK(started_);
+
started_ = false;
- host_->CancelThroughtputTracker(id_);
+ if (host_)
+ host_->CancelThroughtputTracker(id_);
}
} // namespace ui
diff --git a/chromium/ui/compositor/throughput_tracker.h b/chromium/ui/compositor/throughput_tracker.h
index def502b4229..ae18af42b66 100644
--- a/chromium/ui/compositor/throughput_tracker.h
+++ b/chromium/ui/compositor/throughput_tracker.h
@@ -6,6 +6,7 @@
#define UI_COMPOSITOR_THROUGHPUT_TRACKER_H_
#include "base/callback_forward.h"
+#include "base/memory/weak_ptr.h"
#include "ui/compositor/compositor_export.h"
#include "ui/compositor/throughput_tracker_host.h"
@@ -47,11 +48,11 @@ class COMPOSITOR_EXPORT ThroughputTracker {
// Private since it should only be created via Compositor's
// RequestNewThroughputTracker call.
- ThroughputTracker(TrackerId id, ThroughputTrackerHost* host);
+ ThroughputTracker(TrackerId id, base::WeakPtr<ThroughputTrackerHost> host);
static const TrackerId kInvalidId = 0u;
TrackerId id_ = kInvalidId;
- ThroughputTrackerHost* host_ = nullptr;
+ base::WeakPtr<ThroughputTrackerHost> host_;
bool started_ = false;
};
diff --git a/chromium/ui/display/BUILD.gn b/chromium/ui/display/BUILD.gn
index 2ce0eb72a65..fa824fb6aae 100644
--- a/chromium/ui/display/BUILD.gn
+++ b/chromium/ui/display/BUILD.gn
@@ -36,6 +36,8 @@ jumbo_component("display") {
"display_switches.h",
"display_transform.cc",
"display_transform.h",
+ "scoped_display_for_new_windows.cc",
+ "scoped_display_for_new_windows.h",
"screen.cc",
"screen.h",
"screen_base.cc",
diff --git a/chromium/ui/display/display.cc b/chromium/ui/display/display.cc
index 0dc06d9d5bc..ced58c7672a 100644
--- a/chromium/ui/display/display.cc
+++ b/chromium/ui/display/display.cc
@@ -8,6 +8,7 @@
#include "base/command_line.h"
#include "base/logging.h"
+#include "base/notreached.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
#include "build/build_config.h"
diff --git a/chromium/ui/display/display_features.cc b/chromium/ui/display/display_features.cc
index ad2894dc036..bbe1b07aa4a 100644
--- a/chromium/ui/display/display_features.cc
+++ b/chromium/ui/display/display_features.cc
@@ -7,11 +7,17 @@
namespace display {
namespace features {
+#if defined(OS_CHROMEOS)
+// Enables using HDR transfer function if the monitor says it supports it.
+const base::Feature kUseHDRTransferFunction{"UseHDRTransferFunction",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+#endif
+
// This features allows listing all display modes of external displays in the
// display settings and setting any one of them exactly as requested, which can
// be very useful for debugging and development purposes.
const base::Feature kListAllDisplayModes = {"ListAllDisplayModes",
- base::FEATURE_DISABLED_BY_DEFAULT};
+ base::FEATURE_ENABLED_BY_DEFAULT};
bool IsListAllDisplayModesEnabled() {
return base::FeatureList::IsEnabled(kListAllDisplayModes);
diff --git a/chromium/ui/display/display_features.h b/chromium/ui/display/display_features.h
index 43e5f4acccc..878fa3bb0a6 100644
--- a/chromium/ui/display/display_features.h
+++ b/chromium/ui/display/display_features.h
@@ -12,7 +12,7 @@ namespace display {
namespace features {
#if defined(OS_CHROMEOS)
-DISPLAY_EXPORT extern const base::Feature kUseMonitorColorSpace;
+DISPLAY_EXPORT extern const base::Feature kUseHDRTransferFunction;
#endif
DISPLAY_EXPORT extern const base::Feature kListAllDisplayModes;
diff --git a/chromium/ui/display/display_observer.h b/chromium/ui/display/display_observer.h
index c15b93ad420..1d3bc80fde9 100644
--- a/chromium/ui/display/display_observer.h
+++ b/chromium/ui/display/display_observer.h
@@ -25,6 +25,8 @@ class DISPLAY_EXPORT DisplayObserver : public base::CheckedObserver {
DISPLAY_METRIC_PRIMARY = 1 << 4,
DISPLAY_METRIC_MIRROR_STATE = 1 << 5,
DISPLAY_METRIC_COLOR_SPACE = 1 << 6,
+ DISPLAY_METRIC_REFRESH_RATE = 1 << 7,
+ DISPLAY_METRIC_INTERLACED = 1 << 8,
};
// This may be called before other methods to signal changes are about to
diff --git a/chromium/ui/display/display_switches.cc b/chromium/ui/display/display_switches.cc
index 806109ce25d..f2c0f562448 100644
--- a/chromium/ui/display/display_switches.cc
+++ b/chromium/ui/display/display_switches.cc
@@ -56,9 +56,6 @@ const char kUseFirstDisplayAsInternal[] = "use-first-display-as-internal";
#if defined(OS_CHROMEOS)
// Enables unified desktop mode.
const char kEnableUnifiedDesktop[] = "ash-enable-unified-desktop";
-
-// Enables using HDR transfer function if the monitor says it supports it.
-const char kEnableUseHDRTransferFunction[] = "enable-use-hdr-transfer-function";
#endif
} // namespace switches
diff --git a/chromium/ui/display/display_switches.h b/chromium/ui/display/display_switches.h
index 78b2af3cfe6..ff76d749d0f 100644
--- a/chromium/ui/display/display_switches.h
+++ b/chromium/ui/display/display_switches.h
@@ -26,7 +26,6 @@ DISPLAY_EXPORT extern const char kUseFirstDisplayAsInternal[];
#if defined(OS_CHROMEOS)
DISPLAY_EXPORT extern const char kEnableUnifiedDesktop[];
-DISPLAY_EXPORT extern const char kEnableUseHDRTransferFunction[];
#endif
} // namespace switches
diff --git a/chromium/ui/display/fake/fake_display_snapshot.cc b/chromium/ui/display/fake/fake_display_snapshot.cc
index af8fad503ca..98c8b875022 100644
--- a/chromium/ui/display/fake/fake_display_snapshot.cc
+++ b/chromium/ui/display/fake/fake_display_snapshot.cc
@@ -10,6 +10,7 @@
#include <vector>
#include "base/logging.h"
+#include "base/notreached.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
#include "base/strings/stringprintf.h"
@@ -164,7 +165,8 @@ std::unique_ptr<FakeDisplaySnapshot> Builder::Build() {
id_, origin_, physical_size, type_, is_aspect_preserving_scaling_,
has_overscan_, privacy_screen_state_, has_color_correction_matrix_,
color_correction_in_linear_space_, name_, std::move(modes_),
- current_mode_, native_mode_, product_code_, maximum_cursor_size_);
+ current_mode_, native_mode_, product_code_, maximum_cursor_size_,
+ color_space_, bits_per_channel_);
}
Builder& Builder::SetId(int64_t id) {
@@ -265,6 +267,16 @@ Builder& Builder::SetPrivacyScreen(PrivacyScreenState state) {
return *this;
}
+Builder& Builder::SetColorSpace(const gfx::ColorSpace& color_space) {
+ color_space_ = color_space;
+ return *this;
+}
+
+Builder& Builder::SetBitsPerChannel(uint32_t bits_per_channel) {
+ bits_per_channel_ = bits_per_channel;
+ return *this;
+}
+
const DisplayMode* Builder::AddOrFindDisplayMode(const gfx::Size& size) {
for (auto& mode : modes_) {
if (mode->size() == size)
@@ -306,7 +318,9 @@ FakeDisplaySnapshot::FakeDisplaySnapshot(
const DisplayMode* current_mode,
const DisplayMode* native_mode,
int64_t product_code,
- const gfx::Size& maximum_cursor_size)
+ const gfx::Size& maximum_cursor_size,
+ const gfx::ColorSpace& color_space,
+ uint32_t bits_per_channel)
: DisplaySnapshot(display_id,
origin,
physical_size,
@@ -316,8 +330,8 @@ FakeDisplaySnapshot::FakeDisplaySnapshot(
privacy_screen_state,
has_color_correction_matrix,
color_correction_in_linear_space,
- gfx::ColorSpace(),
- 8u /* bits_per_channel */,
+ color_space,
+ bits_per_channel,
display_name,
base::FilePath(),
std::move(modes),
diff --git a/chromium/ui/display/fake/fake_display_snapshot.h b/chromium/ui/display/fake/fake_display_snapshot.h
index 833ac744d08..d521fb34078 100644
--- a/chromium/ui/display/fake/fake_display_snapshot.h
+++ b/chromium/ui/display/fake/fake_display_snapshot.h
@@ -70,6 +70,8 @@ class FAKE_DISPLAY_EXPORT FakeDisplaySnapshot : public DisplaySnapshot {
// Sets physical_size for high DPI display.
Builder& SetHighDPI();
Builder& SetPrivacyScreen(PrivacyScreenState state);
+ Builder& SetColorSpace(const gfx::ColorSpace& color_space);
+ Builder& SetBitsPerChannel(uint32_t bits_per_channel);
private:
// Returns a display mode with |size|. If there is no existing mode, insert
@@ -94,6 +96,8 @@ class FAKE_DISPLAY_EXPORT FakeDisplaySnapshot : public DisplaySnapshot {
DisplayModeList modes_;
const DisplayMode* current_mode_ = nullptr;
const DisplayMode* native_mode_ = nullptr;
+ gfx::ColorSpace color_space_;
+ uint32_t bits_per_channel_ = 8u;
DISALLOW_COPY_AND_ASSIGN(Builder);
};
@@ -112,7 +116,9 @@ class FAKE_DISPLAY_EXPORT FakeDisplaySnapshot : public DisplaySnapshot {
const DisplayMode* current_mode,
const DisplayMode* native_mode,
int64_t product_code,
- const gfx::Size& maximum_cursor_size);
+ const gfx::Size& maximum_cursor_size,
+ const gfx::ColorSpace& color_space,
+ uint32_t bits_per_channel);
~FakeDisplaySnapshot() override;
// Creates a display snapshot from the provided |spec| string. Returns null if
diff --git a/chromium/ui/display/manager/configure_displays_task.cc b/chromium/ui/display/manager/configure_displays_task.cc
index 1b37056d62c..9bb4b1a4967 100644
--- a/chromium/ui/display/manager/configure_displays_task.cc
+++ b/chromium/ui/display/manager/configure_displays_task.cc
@@ -7,6 +7,7 @@
#include "base/auto_reset.h"
#include "base/bind.h"
#include "base/containers/queue.h"
+#include "base/logging.h"
#include "base/metrics/histogram_functions.h"
#include "base/stl_util.h"
#include "ui/display/manager/display_util.h"
diff --git a/chromium/ui/display/manager/display_change_observer.cc b/chromium/ui/display/manager/display_change_observer.cc
index 93961fa5a03..89a9139d3fe 100644
--- a/chromium/ui/display/manager/display_change_observer.cc
+++ b/chromium/ui/display/manager/display_change_observer.cc
@@ -77,6 +77,51 @@ ManagedDisplayInfo::ManagedDisplayModeList GetModeListWithAllRefreshRates(
return display_mode_list;
}
+#if defined(OS_CHROMEOS)
+// Constructs the raster DisplayColorSpaces out of |snapshot_color_space|,
+// including the HDR ones if present and |allow_high_bit_depth| is set.
+gfx::DisplayColorSpaces FillDisplayColorSpaces(
+ const gfx::ColorSpace& snapshot_color_space,
+ bool allow_high_bit_depth) {
+ // ChromeOS VMs (e.g. amd64-generic or betty) have INVALID Primaries; just
+ // pass the color space along.
+ if (!snapshot_color_space.IsValid()) {
+ return gfx::DisplayColorSpaces(snapshot_color_space,
+ DisplaySnapshot::PrimaryFormat());
+ }
+
+ // TODO(b/158126931): |snapshot_color_space| Primaries/Transfer function
+ // cannot be used directly, as users prefer saturated colors to accurate ones.
+ // Instead, clamp at DCI-P3 and clamp at that level or with a small overshoot.
+ gfx::DisplayColorSpaces display_color_spaces(
+ gfx::ColorSpace::CreateSRGB(), DisplaySnapshot::PrimaryFormat());
+
+ if (allow_high_bit_depth) {
+ constexpr float kSDRJoint = 0.5;
+ constexpr float kHDRLevel = 3.0;
+ const auto primary_id = snapshot_color_space.GetPrimaryID();
+ gfx::ColorSpace hdr_color_space;
+ if (primary_id == gfx::ColorSpace::PrimaryID::CUSTOM) {
+ skcms_Matrix3x3 primary_matrix{};
+ snapshot_color_space.GetPrimaryMatrix(&primary_matrix);
+ hdr_color_space = gfx::ColorSpace::CreatePiecewiseHDR(
+ primary_id, kSDRJoint, kHDRLevel, &primary_matrix);
+ } else {
+ hdr_color_space =
+ gfx::ColorSpace::CreatePiecewiseHDR(primary_id, kSDRJoint, kHDRLevel);
+ }
+
+ display_color_spaces.SetOutputColorSpaceAndBufferFormat(
+ gfx::ContentColorUsage::kHDR, false /* needs_alpha */, hdr_color_space,
+ gfx::BufferFormat::RGBA_1010102);
+ display_color_spaces.SetOutputColorSpaceAndBufferFormat(
+ gfx::ContentColorUsage::kHDR, true /* needs_alpha */, hdr_color_space,
+ gfx::BufferFormat::RGBA_1010102);
+ }
+ return display_color_spaces;
+}
+#endif
+
} // namespace
// static
@@ -337,21 +382,22 @@ ManagedDisplayInfo DisplayChangeObserver::CreateManagedDisplayInfo(
if (dpi)
new_info.set_device_dpi(dpi);
+#if !defined(OS_CHROMEOS)
// TODO(crbug.com/1012846): This should configure the HDR color spaces.
gfx::DisplayColorSpaces display_color_spaces(
snapshot->color_space(), DisplaySnapshot::PrimaryFormat());
new_info.set_display_color_spaces(display_color_spaces);
new_info.set_bits_per_channel(snapshot->bits_per_channel());
-
- // TODO(crbug.com/1012846): Remove this flag and provision when HDR is fully
- // supported on ChromeOS.
-#if defined(OS_CHROMEOS)
+#else
+ // TODO(crbug.com/1012846): Remove kEnableUseHDRTransferFunction usage when
+ // HDR is fully supported on ChromeOS.
+ const bool allow_high_bit_depth =
+ base::FeatureList::IsEnabled(features::kUseHDRTransferFunction);
+ new_info.set_display_color_spaces(
+ FillDisplayColorSpaces(snapshot->color_space(), allow_high_bit_depth));
constexpr int32_t kNormalBitDepth = 8;
- if (new_info.bits_per_channel() > kNormalBitDepth &&
- !base::CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kEnableUseHDRTransferFunction)) {
- new_info.set_bits_per_channel(kNormalBitDepth);
- }
+ new_info.set_bits_per_channel(
+ allow_high_bit_depth ? snapshot->bits_per_channel() : kNormalBitDepth);
#endif
new_info.set_refresh_rate(mode_info->refresh_rate());
diff --git a/chromium/ui/display/manager/display_change_observer.h b/chromium/ui/display/manager/display_change_observer.h
index 0e896e24e5e..5c17ce60977 100644
--- a/chromium/ui/display/manager/display_change_observer.h
+++ b/chromium/ui/display/manager/display_change_observer.h
@@ -60,6 +60,8 @@ class DISPLAY_MANAGER_EXPORT DisplayChangeObserver
DISPLAY_EXPORT static float FindDeviceScaleFactor(float dpi);
private:
+ friend class DisplayChangeObserverTest;
+
void UpdateInternalDisplay(
const DisplayConfigurator::DisplayStateList& display_states);
diff --git a/chromium/ui/display/manager/display_change_observer_unittest.cc b/chromium/ui/display/manager/display_change_observer_unittest.cc
index bb900209bac..91d90d99f55 100644
--- a/chromium/ui/display/manager/display_change_observer_unittest.cc
+++ b/chromium/ui/display/manager/display_change_observer_unittest.cc
@@ -14,8 +14,11 @@
#include "ui/display/display_switches.h"
#include "ui/display/fake/fake_display_snapshot.h"
#include "ui/display/manager/display_configurator.h"
+#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_mode.h"
+#include "ui/events/devices/device_data_manager.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
@@ -60,6 +63,13 @@ class DisplayChangeObserverTest : public testing::Test,
Test::SetUp();
}
+ // Pass through method to be called by individual test cases.
+ ManagedDisplayInfo CreateManagedDisplayInfo(DisplayChangeObserver* observer,
+ const DisplaySnapshot* snapshot,
+ const DisplayMode* mode_info) {
+ return observer->CreateManagedDisplayInfo(snapshot, mode_info);
+ }
+
private:
base::test::ScopedFeatureList scoped_feature_list_;
@@ -175,7 +185,8 @@ TEST_P(DisplayChangeObserverTest, GetEmptyExternalManagedDisplayModeList) {
FakeDisplaySnapshot display_snapshot(
123, gfx::Point(), gfx::Size(), DISPLAY_CONNECTION_TYPE_UNKNOWN, false,
false, PrivacyScreenState::kNotSupported, false, false, std::string(), {},
- nullptr, nullptr, 0, gfx::Size());
+ nullptr, nullptr, 0, gfx::Size(), gfx::ColorSpace(),
+ /*bits_per_channel=*/8u);
ManagedDisplayInfo::ManagedDisplayModeList display_modes =
DisplayChangeObserver::GetExternalManagedDisplayModeList(
@@ -294,6 +305,127 @@ TEST_P(DisplayChangeObserverTest,
}
}
+TEST_P(DisplayChangeObserverTest, InvalidDisplayColorSpaces) {
+ const std::unique_ptr<DisplaySnapshot> display_snapshot =
+ FakeDisplaySnapshot::Builder()
+ .SetId(123)
+ .SetName("AmazingFakeDisplay")
+ .SetNativeMode(MakeDisplayMode(1920, 1080, true, 60))
+ .SetColorSpace(gfx::ColorSpace())
+ .Build();
+
+ ui::DeviceDataManager::CreateInstance();
+ DisplayManager manager(nullptr);
+ const auto display_mode = MakeDisplayMode(1920, 1080, true, 60);
+ DisplayChangeObserver observer(&manager);
+ const ManagedDisplayInfo display_info = CreateManagedDisplayInfo(
+ &observer, display_snapshot.get(), display_mode.get());
+
+ EXPECT_EQ(display_info.bits_per_channel(), 8u);
+ const auto display_color_spaces = display_info.display_color_spaces();
+ EXPECT_FALSE(display_color_spaces.SupportsHDR());
+
+ EXPECT_EQ(
+ DisplaySnapshot::PrimaryFormat(),
+ display_color_spaces.GetOutputBufferFormat(gfx::ContentColorUsage::kSRGB,
+ /*needs_alpha=*/true));
+
+ const auto color_space = display_color_spaces.GetRasterColorSpace();
+ // DisplayColorSpaces will fix an invalid ColorSpace to return sRGB.
+ EXPECT_TRUE(color_space.IsValid());
+ EXPECT_EQ(color_space, gfx::ColorSpace::CreateSRGB());
+}
+
+TEST_P(DisplayChangeObserverTest, SDRDisplayColorSpaces) {
+ const std::unique_ptr<DisplaySnapshot> display_snapshot =
+ FakeDisplaySnapshot::Builder()
+ .SetId(123)
+ .SetName("AmazingFakeDisplay")
+ .SetNativeMode(MakeDisplayMode(1920, 1080, true, 60))
+ .SetColorSpace(gfx::ColorSpace::CreateSRGB())
+ .Build();
+
+ ui::DeviceDataManager::CreateInstance();
+ DisplayManager manager(nullptr);
+ const auto display_mode = MakeDisplayMode(1920, 1080, true, 60);
+ DisplayChangeObserver observer(&manager);
+ const ManagedDisplayInfo display_info = CreateManagedDisplayInfo(
+ &observer, display_snapshot.get(), display_mode.get());
+
+ EXPECT_EQ(display_info.bits_per_channel(), 8u);
+
+ const auto display_color_spaces = display_info.display_color_spaces();
+ EXPECT_FALSE(display_color_spaces.SupportsHDR());
+
+ EXPECT_EQ(
+ DisplaySnapshot::PrimaryFormat(),
+ display_color_spaces.GetOutputBufferFormat(gfx::ContentColorUsage::kSRGB,
+ /*needs_alpha=*/true));
+
+ const auto color_space = display_color_spaces.GetRasterColorSpace();
+ EXPECT_TRUE(color_space.IsValid());
+ EXPECT_EQ(color_space.GetPrimaryID(), gfx::ColorSpace::PrimaryID::BT709);
+ EXPECT_EQ(color_space.GetTransferID(),
+ gfx::ColorSpace::TransferID::IEC61966_2_1);
+}
+
+#if defined(OS_CHROMEOS)
+TEST_P(DisplayChangeObserverTest, HDRDisplayColorSpaces) {
+ // TODO(crbug.com/1012846): Remove this flag and provision when HDR is fully
+ // supported on ChromeOS.
+ base::test::ScopedFeatureList scoped_feature_list;
+ scoped_feature_list.InitAndEnableFeature(features::kUseHDRTransferFunction);
+
+ const std::unique_ptr<DisplaySnapshot> display_snapshot =
+ FakeDisplaySnapshot::Builder()
+ .SetId(123)
+ .SetName("AmazingFakeDisplay")
+ .SetNativeMode(MakeDisplayMode(1920, 1080, true, 60))
+ .SetColorSpace(gfx::ColorSpace::CreateHDR10(100.0f))
+ .SetBitsPerChannel(10u)
+ .Build();
+
+ ui::DeviceDataManager::CreateInstance();
+ DisplayManager manager(nullptr);
+ const auto display_mode = MakeDisplayMode(1920, 1080, true, 60);
+ DisplayChangeObserver observer(&manager);
+ const ManagedDisplayInfo display_info = CreateManagedDisplayInfo(
+ &observer, display_snapshot.get(), display_mode.get());
+
+ EXPECT_EQ(display_info.bits_per_channel(), 10u);
+
+ const auto display_color_spaces = display_info.display_color_spaces();
+ EXPECT_TRUE(display_color_spaces.SupportsHDR());
+
+ // |display_color_spaces| still supports SDR rendering.
+ EXPECT_EQ(
+ DisplaySnapshot::PrimaryFormat(),
+ display_color_spaces.GetOutputBufferFormat(gfx::ContentColorUsage::kSRGB,
+ /*needs_alpha=*/true));
+
+ const auto sdr_color_space =
+ display_color_spaces.GetOutputColorSpace(gfx::ContentColorUsage::kSRGB,
+ /*needs_alpha=*/true);
+ EXPECT_TRUE(sdr_color_space.IsValid());
+ EXPECT_EQ(sdr_color_space.GetPrimaryID(), gfx::ColorSpace::PrimaryID::BT709);
+ EXPECT_EQ(sdr_color_space.GetTransferID(),
+ gfx::ColorSpace::TransferID::IEC61966_2_1);
+
+ EXPECT_EQ(
+ display_color_spaces.GetOutputBufferFormat(gfx::ContentColorUsage::kHDR,
+ /*needs_alpha=*/true),
+ gfx::BufferFormat::RGBA_1010102);
+
+ const auto hdr_color_space =
+ display_color_spaces.GetOutputColorSpace(gfx::ContentColorUsage::kHDR,
+ /*needs_alpha=*/true);
+ EXPECT_TRUE(hdr_color_space.IsValid());
+ EXPECT_EQ(hdr_color_space.GetPrimaryID(), gfx::ColorSpace::PrimaryID::BT2020);
+ EXPECT_EQ(hdr_color_space.GetTransferID(),
+ gfx::ColorSpace::TransferID::PIECEWISE_HDR);
+}
+#endif
+
INSTANTIATE_TEST_SUITE_P(All,
DisplayChangeObserverTest,
::testing::Values(false, true));
diff --git a/chromium/ui/display/manager/display_configurator.cc b/chromium/ui/display/manager/display_configurator.cc
index 0f078a96d7a..30774956842 100644
--- a/chromium/ui/display/manager/display_configurator.cc
+++ b/chromium/ui/display/manager/display_configurator.cc
@@ -785,24 +785,26 @@ bool DisplayConfigurator::SetGammaCorrection(
bool DisplayConfigurator::IsPrivacyScreenSupportedOnInternalDisplay() const {
return current_internal_display_ &&
- current_internal_display_->privacy_screen_state() != kNotSupported;
+ current_internal_display_->privacy_screen_state() != kNotSupported &&
+ current_internal_display_->current_mode();
}
bool DisplayConfigurator::SetPrivacyScreenOnInternalDisplay(bool enabled) {
- if (!current_internal_display_) {
- LOG(ERROR) << "This device does not have an internal display.";
- return false;
+ if (IsPrivacyScreenSupportedOnInternalDisplay()) {
+ native_display_delegate_->SetPrivacyScreen(
+ current_internal_display_->display_id(), enabled);
+ return true;
}
- if (!IsPrivacyScreenSupportedOnInternalDisplay()) {
+ if (!current_internal_display_) {
+ LOG(ERROR) << "This device does not have an internal display.";
+ } else if (current_internal_display_->privacy_screen_state() ==
+ kNotSupported) {
LOG(ERROR) << "The internal display of this device does not support "
- "privacy screeny.";
- return false;
+ "privacy screen.";
}
- native_display_delegate_->SetPrivacyScreen(
- current_internal_display_->display_id(), enabled);
- return true;
+ return false;
}
chromeos::DisplayPowerState DisplayConfigurator::GetRequestedPowerState()
diff --git a/chromium/ui/display/manager/display_manager.cc b/chromium/ui/display/manager/display_manager.cc
index 11423d46aae..7d909dddb79 100644
--- a/chromium/ui/display/manager/display_manager.cc
+++ b/chromium/ui/display/manager/display_manager.cc
@@ -33,6 +33,7 @@
#include "ui/display/display_observer.h"
#include "ui/display/display_switches.h"
#include "ui/display/manager/display_layout_store.h"
+#include "ui/display/manager/display_util.h"
#include "ui/display/manager/managed_display_info.h"
#include "ui/display/screen.h"
#include "ui/display/types/display_snapshot.h"
@@ -47,7 +48,6 @@
#include "chromeos/system/devicemode.h"
#include "ui/display/manager/display_change_observer.h"
#include "ui/display/manager/display_configurator.h"
-#include "ui/display/manager/display_util.h"
#include "ui/display/types/native_display_delegate.h"
#include "ui/events/devices/touchscreen_device.h"
#endif
@@ -985,6 +985,16 @@ void DisplayManager::UpdateDisplaysWith(
if (current_display.rotation() != new_display.rotation())
metrics |= DisplayObserver::DISPLAY_METRIC_ROTATION;
+ if (!WithinEpsilon(current_display.display_frequency(),
+ new_display.display_frequency())) {
+ metrics |= DisplayObserver::DISPLAY_METRIC_REFRESH_RATE;
+ }
+
+ if (current_display_info.is_interlaced() !=
+ new_display_info.is_interlaced()) {
+ metrics |= DisplayObserver::DISPLAY_METRIC_INTERLACED;
+ }
+
if (metrics != DisplayObserver::DISPLAY_METRIC_NONE) {
display_changes.insert(
std::pair<size_t, uint32_t>(new_displays.size(), metrics));
diff --git a/chromium/ui/display/manager/display_manager.h b/chromium/ui/display/manager/display_manager.h
index d979f1f4e07..9520879323a 100644
--- a/chromium/ui/display/manager/display_manager.h
+++ b/chromium/ui/display/manager/display_manager.h
@@ -16,9 +16,9 @@
#include <vector>
#include "base/callback.h"
+#include "base/check_op.h"
#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
diff --git a/chromium/ui/display/manager/display_util.cc b/chromium/ui/display/manager/display_util.cc
index 310e6293da6..c6b5b32b23a 100644
--- a/chromium/ui/display/manager/display_util.cc
+++ b/chromium/ui/display/manager/display_util.cc
@@ -62,10 +62,6 @@ constexpr std::array<ZoomListBucketDsf, 6> kZoomListBucketsForDsf{{
{1.f / kDsf_2_666, 0.5f, 0.6f, 0.8f, 0.9f, 1.f, 1.2f, 1.35f, 1.5f}},
}};
-bool WithinEpsilon(float a, float b) {
- return std::abs(a - b) < std::numeric_limits<float>::epsilon();
-}
-
} // namespace
#if defined(OS_CHROMEOS)
@@ -108,6 +104,10 @@ int GetDisplayPower(const std::vector<DisplaySnapshot*>& displays,
#endif // defined(OS_CHROMEOS)
+bool WithinEpsilon(float a, float b) {
+ return std::abs(a - b) < std::numeric_limits<float>::epsilon();
+}
+
std::string MultipleDisplayStateToString(MultipleDisplayState state) {
switch (state) {
case MULTIPLE_DISPLAY_STATE_INVALID:
diff --git a/chromium/ui/display/manager/display_util.h b/chromium/ui/display/manager/display_util.h
index e90f055eeaa..a51c684318d 100644
--- a/chromium/ui/display/manager/display_util.h
+++ b/chromium/ui/display/manager/display_util.h
@@ -34,6 +34,9 @@ GetDisplayPower(const std::vector<DisplaySnapshot*>& displays,
#endif // defined(OS_CHROMEOS)
+// Determines whether |a| is within an epsilon of |b|.
+bool WithinEpsilon(float a, float b);
+
// Returns a string describing |state|.
std::string MultipleDisplayStateToString(MultipleDisplayState state);
diff --git a/chromium/ui/display/manager/managed_display_info.cc b/chromium/ui/display/manager/managed_display_info.cc
index e40b18c2cce..60720f12024 100644
--- a/chromium/ui/display/manager/managed_display_info.cc
+++ b/chromium/ui/display/manager/managed_display_info.cc
@@ -70,6 +70,11 @@ struct ManagedDisplayModeSorter {
}
};
+bool IsWithinEpsilon(float a, float b) {
+ constexpr float kEpsilon = 0.0001f;
+ return std::abs(a - b) < kEpsilon;
+}
+
} // namespace
ManagedDisplayMode::ManagedDisplayMode() {}
@@ -104,6 +109,13 @@ ManagedDisplayMode::ManagedDisplayMode(const ManagedDisplayMode& other) =
ManagedDisplayMode& ManagedDisplayMode::operator=(
const ManagedDisplayMode& other) = default;
+bool ManagedDisplayMode::operator==(const ManagedDisplayMode& other) const {
+ return size_ == other.size_ && is_interlaced_ == other.is_interlaced_ &&
+ native_ == other.native_ &&
+ IsWithinEpsilon(refresh_rate_, other.refresh_rate_) &&
+ IsWithinEpsilon(device_scale_factor_, other.device_scale_factor_);
+}
+
gfx::Size ManagedDisplayMode::GetSizeInDIP() const {
gfx::SizeF size_dip(size_);
size_dip.Scale(1.0f / device_scale_factor_);
@@ -114,9 +126,8 @@ bool ManagedDisplayMode::IsEquivalent(const ManagedDisplayMode& other) const {
if (display::features::IsListAllDisplayModesEnabled())
return *this == other;
- const float kEpsilon = 0.0001f;
return size_ == other.size_ &&
- std::abs(device_scale_factor_ - other.device_scale_factor_) < kEpsilon;
+ IsWithinEpsilon(device_scale_factor_, other.device_scale_factor_);
}
std::string ManagedDisplayMode::ToString() const {
@@ -208,7 +219,7 @@ ManagedDisplayInfo ManagedDisplayInfo::CreateFromSpecWithID(
base::SPLIT_WANT_NONEMPTY);
for (size_t i = 0; i < parts.size(); ++i) {
gfx::Size size;
- float refresh_rate = 0.0f;
+ float refresh_rate = 60.0f;
bool is_interlaced = false;
gfx::Rect mode_bounds;
diff --git a/chromium/ui/display/manager/managed_display_info.h b/chromium/ui/display/manager/managed_display_info.h
index e340223f8e0..f99bf46bbcf 100644
--- a/chromium/ui/display/manager/managed_display_info.h
+++ b/chromium/ui/display/manager/managed_display_info.h
@@ -40,6 +40,7 @@ class DISPLAY_MANAGER_EXPORT ManagedDisplayMode {
~ManagedDisplayMode();
ManagedDisplayMode(const ManagedDisplayMode& other);
ManagedDisplayMode& operator=(const ManagedDisplayMode& other);
+ bool operator==(const ManagedDisplayMode& other) const;
// Returns the size in DIP which is visible to the user.
gfx::Size GetSizeInDIP() const;
@@ -66,15 +67,6 @@ class DISPLAY_MANAGER_EXPORT ManagedDisplayMode {
float device_scale_factor_ = 1.0f; // The device scale factor of the mode.
};
-inline bool operator==(const ManagedDisplayMode& lhs,
- const ManagedDisplayMode& rhs) {
- return lhs.size() == rhs.size() &&
- lhs.is_interlaced() == rhs.is_interlaced() &&
- lhs.refresh_rate() == rhs.refresh_rate() &&
- lhs.native() == rhs.native() &&
- lhs.device_scale_factor() == rhs.device_scale_factor();
-}
-
inline bool operator!=(const ManagedDisplayMode& lhs,
const ManagedDisplayMode& rhs) {
return !(lhs == rhs);
diff --git a/chromium/ui/display/manager/managed_display_info_unittest.cc b/chromium/ui/display/manager/managed_display_info_unittest.cc
index b73f335bed0..115214dd8be 100644
--- a/chromium/ui/display/manager/managed_display_info_unittest.cc
+++ b/chromium/ui/display/manager/managed_display_info_unittest.cc
@@ -68,11 +68,11 @@ TEST_F(DisplayInfoTest, CreateFromSpec) {
EXPECT_EQ("200x200", info.display_modes()[3].size().ToString());
EXPECT_EQ("300x200", info.display_modes()[4].size().ToString());
- EXPECT_EQ(0.0f, info.display_modes()[0].refresh_rate());
+ EXPECT_EQ(60.0f, info.display_modes()[0].refresh_rate());
EXPECT_EQ(60.0f, info.display_modes()[1].refresh_rate());
EXPECT_EQ(30.0f, info.display_modes()[2].refresh_rate());
EXPECT_EQ(59.9f, info.display_modes()[3].refresh_rate());
- EXPECT_EQ(0.0f, info.display_modes()[4].refresh_rate());
+ EXPECT_EQ(60.0f, info.display_modes()[4].refresh_rate());
EXPECT_EQ(2.0f, info.display_modes()[0].device_scale_factor());
EXPECT_EQ(1.0f, info.display_modes()[1].device_scale_factor());
diff --git a/chromium/ui/display/manager/touch_device_manager.cc b/chromium/ui/display/manager/touch_device_manager.cc
index fc7499a38ca..4b2766bd236 100644
--- a/chromium/ui/display/manager/touch_device_manager.cc
+++ b/chromium/ui/display/manager/touch_device_manager.cc
@@ -11,6 +11,7 @@
#include "base/files/file_util.h"
#include "base/hash/hash.h"
+#include "base/logging.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
diff --git a/chromium/ui/display/manager/touch_transform_controller.cc b/chromium/ui/display/manager/touch_transform_controller.cc
index 62ce69c4fc5..d2f07a537c6 100644
--- a/chromium/ui/display/manager/touch_transform_controller.cc
+++ b/chromium/ui/display/manager/touch_transform_controller.cc
@@ -7,6 +7,7 @@
#include <utility>
#include <vector>
+#include "base/logging.h"
#include "third_party/skia/include/core/SkMatrix44.h"
#include "ui/display/display_layout.h"
#include "ui/display/manager/display_manager.h"
diff --git a/chromium/ui/display/manager/update_display_configuration_task.cc b/chromium/ui/display/manager/update_display_configuration_task.cc
index 0dd56cd85de..bfee8b7d58e 100644
--- a/chromium/ui/display/manager/update_display_configuration_task.cc
+++ b/chromium/ui/display/manager/update_display_configuration_task.cc
@@ -5,6 +5,7 @@
#include "ui/display/manager/update_display_configuration_task.h"
#include "base/bind.h"
+#include "base/logging.h"
#include "base/metrics/histogram_functions.h"
#include "ui/display/manager/configure_displays_task.h"
#include "ui/display/manager/display_layout_manager.h"
diff --git a/chromium/ui/display/mojom/BUILD.gn b/chromium/ui/display/mojom/BUILD.gn
index af12f462fb1..db1ab150193 100644
--- a/chromium/ui/display/mojom/BUILD.gn
+++ b/chromium/ui/display/mojom/BUILD.gn
@@ -9,6 +9,7 @@ mojom("mojom") {
sources = [
"display.mojom",
+ "display_configuration_params.mojom",
"display_constants.mojom",
"display_layout.mojom",
"display_mode.mojom",
@@ -134,6 +135,18 @@ mojom("mojom") {
traits_headers = [ "gamma_ramp_rgb_entry_mojom_traits.h" ]
traits_public_deps = [ "//ui/display" ]
},
+ {
+ types = [
+ {
+ mojom = "display.mojom.DisplayConfigurationParams"
+ cpp = "::display::DisplayConfigurationParams"
+ },
+ ]
+ traits_sources = [ "display_configuration_params_mojom_traits.cc" ]
+ traits_headers = [ "display_configuration_params_mojom_traits.h" ]
+ traits_public_deps = [ "//ui/display" ]
+ traits_deps = [ "//ui/gfx/geometry" ]
+ },
]
cpp_typemaps += shared_cpp_typemaps
diff --git a/chromium/ui/display/mojom/display_configuration_params.mojom b/chromium/ui/display/mojom/display_configuration_params.mojom
new file mode 100644
index 00000000000..9817e7f4897
--- /dev/null
+++ b/chromium/ui/display/mojom/display_configuration_params.mojom
@@ -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.
+
+module display.mojom;
+
+import "ui/display/mojom/display_mode.mojom";
+import "ui/gfx/geometry/mojom/geometry.mojom";
+
+// Corresponds to display::DisplayConfigurationParams.
+struct DisplayConfigurationParams {
+ int64 id;
+ gfx.mojom.Point origin;
+ display.mojom.DisplayMode? mode;
+};
diff --git a/chromium/ui/display/mojom/display_configuration_params_mojom_traits.cc b/chromium/ui/display/mojom/display_configuration_params_mojom_traits.cc
new file mode 100644
index 00000000000..8f0cf48b631
--- /dev/null
+++ b/chromium/ui/display/mojom/display_configuration_params_mojom_traits.cc
@@ -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.
+
+#include "ui/display/mojom/display_configuration_params_mojom_traits.h"
+
+namespace mojo {
+
+// static
+bool StructTraits<display::mojom::DisplayConfigurationParamsDataView,
+ display::DisplayConfigurationParams>::
+ Read(display::mojom::DisplayConfigurationParamsDataView data,
+ display::DisplayConfigurationParams* out) {
+ gfx::Point origin;
+ if (!data.ReadOrigin(&origin))
+ return false;
+
+ base::Optional<std::unique_ptr<display::DisplayMode>> mode;
+ if (!data.ReadMode(&mode))
+ return false;
+
+ out->id = data.id();
+ out->origin = origin;
+ out->mode = std::move(mode);
+
+ return true;
+}
+
+} // namespace mojo
diff --git a/chromium/ui/display/mojom/display_configuration_params_mojom_traits.h b/chromium/ui/display/mojom/display_configuration_params_mojom_traits.h
new file mode 100644
index 00000000000..736c9e7e002
--- /dev/null
+++ b/chromium/ui/display/mojom/display_configuration_params_mojom_traits.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_DISPLAY_MOJOM_DISPLAY_CONFIGURATION_PARAMS_MOJOM_TRAITS_H_
+#define UI_DISPLAY_MOJOM_DISPLAY_CONFIGURATION_PARAMS_MOJOM_TRAITS_H_
+
+#include "ui/display/mojom/display_configuration_params.mojom.h"
+#include "ui/display/types/display_configuration_params.h"
+#include "ui/gfx/geometry/mojom/geometry_mojom_traits.h"
+#include "ui/gfx/ipc/color/gfx_param_traits.h"
+
+namespace mojo {
+
+template <>
+struct StructTraits<display::mojom::DisplayConfigurationParamsDataView,
+ display::DisplayConfigurationParams> {
+ static int64_t id(
+ const display::DisplayConfigurationParams& display_configuration_params) {
+ return display_configuration_params.id;
+ }
+
+ static gfx::Point origin(
+ const display::DisplayConfigurationParams& display_configuration_params) {
+ return display_configuration_params.origin;
+ }
+
+ static const base::Optional<std::unique_ptr<display::DisplayMode>>& mode(
+ const display::DisplayConfigurationParams& display_configuration_params) {
+ return display_configuration_params.mode;
+ }
+
+ static bool Read(display::mojom::DisplayConfigurationParamsDataView data,
+ display::DisplayConfigurationParams* out);
+};
+
+} // namespace mojo
+
+#endif // UI_DISPLAY_MOJOM_DISPLAY_CONFIGURATION_PARAMS_MOJOM_TRAITS_H_
diff --git a/chromium/ui/display/scoped_display_for_new_windows.cc b/chromium/ui/display/scoped_display_for_new_windows.cc
new file mode 100644
index 00000000000..d23839b8284
--- /dev/null
+++ b/chromium/ui/display/scoped_display_for_new_windows.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/display/scoped_display_for_new_windows.h"
+
+#include "ui/display/screen.h"
+
+namespace display {
+
+ScopedDisplayForNewWindows::ScopedDisplayForNewWindows(int64_t new_display) {
+ Screen::GetScreen()->SetScopedDisplayForNewWindows(new_display);
+}
+
+ScopedDisplayForNewWindows::ScopedDisplayForNewWindows(gfx::NativeView view)
+ : ScopedDisplayForNewWindows(
+ Screen::GetScreen()->GetDisplayNearestView(view).id()) {}
+
+ScopedDisplayForNewWindows::~ScopedDisplayForNewWindows() {
+ Screen::GetScreen()->SetScopedDisplayForNewWindows(
+ display::kInvalidDisplayId);
+}
+
+} // namespace display
diff --git a/chromium/ui/display/scoped_display_for_new_windows.h b/chromium/ui/display/scoped_display_for_new_windows.h
new file mode 100644
index 00000000000..073a81d660a
--- /dev/null
+++ b/chromium/ui/display/scoped_display_for_new_windows.h
@@ -0,0 +1,27 @@
+// 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_SCOPED_DISPLAY_FOR_NEW_WINDOWS_H_
+#define UI_DISPLAY_SCOPED_DISPLAY_FOR_NEW_WINDOWS_H_
+
+#include "ui/display/screen.h"
+#include "ui/gfx/native_widget_types.h"
+
+namespace display {
+
+// Constructing a ScopedDisplayForNewWindows allows temporarily switching
+// display for new windows during the lifetime of this object.
+class DISPLAY_EXPORT ScopedDisplayForNewWindows {
+ public:
+ explicit ScopedDisplayForNewWindows(int64_t new_display);
+ explicit ScopedDisplayForNewWindows(gfx::NativeView view);
+ ~ScopedDisplayForNewWindows();
+ ScopedDisplayForNewWindows(const ScopedDisplayForNewWindows&) = delete;
+ ScopedDisplayForNewWindows& operator=(const ScopedDisplayForNewWindows&) =
+ delete;
+};
+
+} // namespace display
+
+#endif // UI_DISPLAY_SCOPED_DISPLAY_FOR_NEW_WINDOWS_H_
diff --git a/chromium/ui/display/screen.cc b/chromium/ui/display/screen.cc
index ef1d381d9e2..c289415a1a1 100644
--- a/chromium/ui/display/screen.cc
+++ b/chromium/ui/display/screen.cc
@@ -6,7 +6,8 @@
#include <utility>
-#include "base/logging.h"
+#include "base/check.h"
+#include "base/notreached.h"
#include "ui/display/display.h"
#include "ui/display/types/display_constants.h"
#include "ui/gfx/geometry/rect.h"
@@ -44,6 +45,12 @@ Display Screen::GetDisplayNearestView(gfx::NativeView view) const {
display::Display Screen::GetDisplayForNewWindows() const {
display::Display display;
+ // Scoped value can override if it is set.
+ if (scoped_display_id_for_new_windows_ != kInvalidDisplayId &&
+ GetDisplayWithDisplayId(scoped_display_id_for_new_windows_, &display)) {
+ return display;
+ }
+
if (GetDisplayWithDisplayId(display_id_for_new_windows_, &display))
return display;
@@ -90,4 +97,15 @@ std::string Screen::GetCurrentWorkspace() {
return {};
}
+void Screen::SetScopedDisplayForNewWindows(int64_t display_id) {
+ if (display_id == scoped_display_id_for_new_windows_)
+ return;
+ // Only allow set and clear, not switch.
+ DCHECK(display_id == kInvalidDisplayId ^
+ scoped_display_id_for_new_windows_ == kInvalidDisplayId)
+ << "display_id=" << display_id << ", scoped_display_id_for_new_windows_="
+ << scoped_display_id_for_new_windows_;
+ scoped_display_id_for_new_windows_ = display_id;
+}
+
} // namespace display
diff --git a/chromium/ui/display/screen.h b/chromium/ui/display/screen.h
index 2263985910f..7742ef3e192 100644
--- a/chromium/ui/display/screen.h
+++ b/chromium/ui/display/screen.h
@@ -128,9 +128,17 @@ class DISPLAY_EXPORT Screen {
virtual std::string GetCurrentWorkspace();
private:
+ friend class ScopedDisplayForNewWindows;
+
+ // Used to temporarily override the value from SetDisplayForNewWindows() by
+ // creating an instance of ScopedDisplayForNewWindows. Call with
+ // |kInvalidDisplayId| to unset.
+ void SetScopedDisplayForNewWindows(int64_t display_id);
+
static gfx::NativeWindow GetWindowForView(gfx::NativeView view);
int64_t display_id_for_new_windows_;
+ int64_t scoped_display_id_for_new_windows_ = display::kInvalidDisplayId;
DISALLOW_COPY_AND_ASSIGN(Screen);
};
diff --git a/chromium/ui/display/screen_unittest.cc b/chromium/ui/display/screen_unittest.cc
index 6acc48019ab..ac09e4e9f9a 100644
--- a/chromium/ui/display/screen_unittest.cc
+++ b/chromium/ui/display/screen_unittest.cc
@@ -6,6 +6,7 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/display/display.h"
+#include "ui/display/scoped_display_for_new_windows.h"
#include "ui/display/test/test_screen.h"
namespace display {
@@ -16,6 +17,8 @@ const int DEFAULT_DISPLAY_ID = 0x1337;
const int DEFAULT_DISPLAY_WIDTH = 2560;
const int DEFAULT_DISPLAY_HEIGHT = 1440;
+const int DISPLAY_2_ID = 0xc001;
+
} // namespace
class ScreenTest : public testing::Test {
@@ -28,6 +31,8 @@ class ScreenTest : public testing::Test {
gfx::Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT));
test_screen_.display_list().RemoveDisplay(test_display.id());
test_screen_.display_list().AddDisplay(display, DisplayList::Type::PRIMARY);
+ test_screen_.display_list().AddDisplay(Display(DISPLAY_2_ID),
+ DisplayList::Type::NOT_PRIMARY);
Screen::SetScreenInstance(&test_screen_);
}
@@ -46,7 +51,7 @@ TEST_F(ScreenTest, GetPrimaryDisplaySize) {
}
TEST_F(ScreenTest, GetNumDisplays) {
- EXPECT_EQ(Screen::GetScreen()->GetNumDisplays(), 1);
+ EXPECT_EQ(Screen::GetScreen()->GetNumDisplays(), 2);
}
TEST_F(ScreenTest, GetDisplayWithDisplayId) {
@@ -66,4 +71,20 @@ TEST_F(ScreenTest, GetDisplayForNewWindows) {
screen->GetDisplayForNewWindows().id());
}
+TEST_F(ScreenTest, ScopedDisplayForNewWindows) {
+ Screen* screen = Screen::GetScreen();
+
+ // Set primary as default;
+ screen->SetDisplayForNewWindows(DEFAULT_DISPLAY_ID);
+ EXPECT_EQ(DEFAULT_DISPLAY_ID, screen->GetDisplayForNewWindows().id());
+
+ // ScopedDisplayForNewWindows overrides while it is in scope.
+ {
+ ScopedDisplayForNewWindows scoped(DISPLAY_2_ID);
+ EXPECT_EQ(DISPLAY_2_ID, screen->GetDisplayForNewWindows().id());
+ }
+
+ EXPECT_EQ(DEFAULT_DISPLAY_ID, screen->GetDisplayForNewWindows().id());
+}
+
} // namespace display
diff --git a/chromium/ui/display/types/BUILD.gn b/chromium/ui/display/types/BUILD.gn
index 2b4ae22a6a8..86ea7b44df1 100644
--- a/chromium/ui/display/types/BUILD.gn
+++ b/chromium/ui/display/types/BUILD.gn
@@ -7,6 +7,8 @@ import("//build/config/jumbo.gni")
jumbo_component("types") {
output_name = "display_types"
sources = [
+ "display_configuration_params.cc",
+ "display_configuration_params.h",
"display_constants.h",
"display_mode.cc",
"display_mode.h",
diff --git a/chromium/ui/display/types/display_configuration_params.cc b/chromium/ui/display/types/display_configuration_params.cc
new file mode 100644
index 00000000000..996ade949e4
--- /dev/null
+++ b/chromium/ui/display/types/display_configuration_params.cc
@@ -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.
+
+#include "ui/display/types/display_configuration_params.h"
+
+namespace display {
+
+DisplayConfigurationParams::DisplayConfigurationParams() = default;
+DisplayConfigurationParams::DisplayConfigurationParams(
+ int64_t id,
+ gfx::Point origin,
+ const display::DisplayMode* pmode)
+ : id(id), origin(origin) {
+ if (pmode)
+ mode = pmode->Clone();
+}
+
+DisplayConfigurationParams::~DisplayConfigurationParams() = default;
+
+} // namespace display
diff --git a/chromium/ui/display/types/display_configuration_params.h b/chromium/ui/display/types/display_configuration_params.h
new file mode 100644
index 00000000000..73c009435dd
--- /dev/null
+++ b/chromium/ui/display/types/display_configuration_params.h
@@ -0,0 +1,31 @@
+// 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_TYPES_DISPLAY_CONFIGURATION_PARAMS_H_
+#define UI_DISPLAY_TYPES_DISPLAY_CONFIGURATION_PARAMS_H_
+
+#include <stdint.h>
+
+#include "base/optional.h"
+#include "ui/display/types/display_mode.h"
+#include "ui/display/types/display_types_export.h"
+#include "ui/gfx/geometry/point.h"
+
+namespace display {
+
+struct DISPLAY_TYPES_EXPORT DisplayConfigurationParams {
+ DisplayConfigurationParams();
+ DisplayConfigurationParams(int64_t id,
+ gfx::Point origin,
+ const display::DisplayMode* pmode);
+ ~DisplayConfigurationParams();
+
+ int64_t id = 0;
+ gfx::Point origin = gfx::Point();
+ base::Optional<std::unique_ptr<display::DisplayMode>> mode = base::nullopt;
+};
+
+} // namespace display
+
+#endif // UI_DISPLAY_TYPES_DISPLAY_CONFIGURATION_PARAMS_H_
diff --git a/chromium/ui/display/util/edid_parser.cc b/chromium/ui/display/util/edid_parser.cc
index 4664a3e5332..d1b248b92ed 100644
--- a/chromium/ui/display/util/edid_parser.cc
+++ b/chromium/ui/display/util/edid_parser.cc
@@ -328,14 +328,10 @@ void EdidParser::ParseEdid(const std::vector<uint8_t>& edid) {
}
// Verify if the |display_name_| consists of printable characters only.
- // TODO(oshima|muka): Consider replacing unprintable chars with white space.
- for (const char c : display_name_) {
- if (!isascii(c) || !isprint(c)) {
- display_name_.clear();
- base::UmaHistogramEnumeration(kParseEdidFailureMetric,
- ParseEdidFailure::kDisplayName);
- }
- }
+ // Replace unprintable chars with white space.
+ std::replace_if(
+ display_name_.begin(), display_name_.end(),
+ [](char c) { return !isascii(c) || !isprint(c); }, ' ');
// See http://en.wikipedia.org/wiki/Extended_display_identification_data
// for the extension format of EDID. Also see EIA/CEA-861 spec for
diff --git a/chromium/ui/display/util/edid_parser_unittest.cc b/chromium/ui/display/util/edid_parser_unittest.cc
index 0991d79c751..73dda4af53c 100644
--- a/chromium/ui/display/util/edid_parser_unittest.cc
+++ b/chromium/ui/display/util/edid_parser_unittest.cc
@@ -25,6 +25,18 @@ namespace display {
namespace {
+// EDID with non-ascii char in display name.
+constexpr unsigned char kBadDisplayName[] =
+ "\x00\xff\xff\xff\xff\xff\xff\x00\x22\xf0\x6c\x28\x01\x01\x01\x01"
+ "\x02\x16\x01\x04\xb5\x40\x28\x78\xe2\x8d\x85\xad\x4f\x35\xb1\x25"
+ "\x0e\x50\x54\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
+ "\x01\x01\x01\x01\x01\x01\xe2\x68\x00\xa0\xa0\x40\x2e\x60\x30\x20"
+ "\x36\x00\x81\x90\x21\x00\x00\x1a\xbc\x1b\x00\xa0\x50\x20\x17\x30"
+ "\x30\x20\x36\x00\x81\x90\x21\x00\x00\x1a\x00\x00\x00\xfc\x00\x48"
+ "\x50\x20\x5a\x00\x33\x30\x77\x0a\x20\x20\x20\x20\x00\x00\x00\xff"
+ "\x00\x43\x4e\x34\x32\x30\x32\x31\x33\x37\x51\x0a\x20\x20\x00\x71";
+constexpr size_t kBadDisplayNameLength = base::size(kBadDisplayName);
+
// Sample EDID data extracted from real devices.
constexpr unsigned char kNormalDisplay[] =
"\x00\xff\xff\xff\xff\xff\xff\x00\x22\xf0\x6c\x28\x01\x01\x01\x01"
@@ -251,6 +263,24 @@ struct TestParams {
} kTestCases[] = {
{0x22f0u,
0x6c28u,
+ "HP Z 30w", // non-ascii char in display name.
+ gfx::Size(2560, 1600),
+ 2012,
+ false,
+ 2.2,
+ 10,
+ kNormalDisplayPrimaries,
+ 586181672,
+ 9834990092472576,
+ "HWP",
+ "286C",
+ {},
+ {},
+ base::nullopt,
+ kBadDisplayName,
+ kBadDisplayNameLength},
+ {0x22f0u,
+ 0x6c28u,
"HP ZR30w",
gfx::Size(2560, 1600),
2012,
diff --git a/chromium/ui/display/win/scaling_util.cc b/chromium/ui/display/win/scaling_util.cc
index 2102a7d0475..e23e68ee6d5 100644
--- a/chromium/ui/display/win/scaling_util.cc
+++ b/chromium/ui/display/win/scaling_util.cc
@@ -227,8 +227,9 @@ DisplayPlacement CalculateDisplayPlacement(const DisplayInfo& parent,
// corners and |rect|'s top corners when the rects don't overlap vertically.
int64_t SquaredDistanceBetweenRects(const gfx::Rect& ref,
const gfx::Rect& rect) {
- if (ref.Intersects(rect))
- return 0;
+ gfx::Rect intersection_rect = gfx::IntersectRects(ref, rect);
+ if (!intersection_rect.IsEmpty())
+ return -(intersection_rect.width() * intersection_rect.height());
CoordinateRotation degrees = ComputeCoordinateRotationRefTop(ref, rect);
gfx::Rect top_rect(CoordinateRotateRect(ref, degrees));
diff --git a/chromium/ui/display/win/scaling_util.h b/chromium/ui/display/win/scaling_util.h
index 18b475f3cc4..74e8d5a34ed 100644
--- a/chromium/ui/display/win/scaling_util.h
+++ b/chromium/ui/display/win/scaling_util.h
@@ -134,7 +134,9 @@ DISPLAY_EXPORT DisplayPlacement CalculateDisplayPlacement(
// | | | |
// +---+ +----+
//
-// For rectangles that intersect each other, the distance is 0.
+// For rectangles that intersect each other, the distance is the negative value
+// of the overlapping area, so callers can distinguish different amounts of
+// overlap.
//
// The squared distance is used to avoid taking the square root as the common
// usage is to compare distances greater than 1 unit.
diff --git a/chromium/ui/display/win/scaling_util_unittest.cc b/chromium/ui/display/win/scaling_util_unittest.cc
index c6fd7f4c226..79c1a04bb10 100644
--- a/chromium/ui/display/win/scaling_util_unittest.cc
+++ b/chromium/ui/display/win/scaling_util_unittest.cc
@@ -430,15 +430,15 @@ TEST(ScalingUtilTest, CalculateDisplayPlacement2xScale) {
TEST(ScalingUtilTest, SquaredDistanceBetweenRectsFullyIntersecting) {
gfx::Rect rect1(0, 0, 100, 100);
gfx::Rect rect2(5, 5, 10, 10);
- EXPECT_EQ(0, SquaredDistanceBetweenRects(rect1, rect2));
- EXPECT_EQ(0, SquaredDistanceBetweenRects(rect2, rect1));
+ EXPECT_EQ(-100, SquaredDistanceBetweenRects(rect1, rect2));
+ EXPECT_EQ(-100, SquaredDistanceBetweenRects(rect2, rect1));
}
TEST(ScalingUtilTest, SquaredDistanceBetweenRectsPartiallyIntersecting) {
gfx::Rect rect1(0, 0, 10, 10);
- gfx::Rect rect2(5, 5, 10, 10);
- EXPECT_EQ(0, SquaredDistanceBetweenRects(rect1, rect2));
- EXPECT_EQ(0, SquaredDistanceBetweenRects(rect2, rect1));
+ gfx::Rect rect2(5, 5, 20, 20);
+ EXPECT_EQ(-25, SquaredDistanceBetweenRects(rect1, rect2));
+ EXPECT_EQ(-25, SquaredDistanceBetweenRects(rect2, rect1));
}
TEST(ScalingUtilTest, SquaredDistanceBetweenRectsTouching) {
diff --git a/chromium/ui/display/win/screen_win.cc b/chromium/ui/display/win/screen_win.cc
index 0c789c42fa5..d4fc53fd60d 100644
--- a/chromium/ui/display/win/screen_win.cc
+++ b/chromium/ui/display/win/screen_win.cc
@@ -15,6 +15,7 @@
#include "base/numerics/ranges.h"
#include "base/optional.h"
#include "base/stl_util.h"
+#include "base/trace_event/trace_event.h"
#include "base/win/win_util.h"
#include "base/win/windows_version.h"
#include "ui/display/display.h"
@@ -817,6 +818,8 @@ void ScreenWin::OnWndProc(HWND hwnd,
(message != WM_SETTINGCHANGE || wparam != SPI_SETWORKAREA))
return;
+ TRACE_EVENT1("ui", "ScreenWin::OnWndProc", "message", message);
+
color_profile_reader_->UpdateIfNeeded();
if (request_hdr_status_callback_)
request_hdr_status_callback_.Run();
@@ -836,6 +839,8 @@ void ScreenWin::OnColorProfilesChanged() {
}
void ScreenWin::UpdateAllDisplaysAndNotify() {
+ TRACE_EVENT0("ui", "ScreenWin::UpdateAllDisplaysAndNotify");
+
std::vector<Display> old_displays = std::move(displays_);
UpdateFromDisplayInfos(GetDisplayInfosFromSystem());
change_notifier_.NotifyDisplaysChanged(old_displays, displays_);
diff --git a/chromium/ui/display/win/screen_win_unittest.cc b/chromium/ui/display/win/screen_win_unittest.cc
index 059c533c4f1..fa5d8572c8f 100644
--- a/chromium/ui/display/win/screen_win_unittest.cc
+++ b/chromium/ui/display/win/screen_win_unittest.cc
@@ -39,7 +39,7 @@ class TestScreenWin : public ScreenWin {
UpdateFromDisplayInfos(display_infos);
}
- ~TestScreenWin() override = default;
+ ~TestScreenWin() override { Screen::SetScreenInstance(old_screen_); }
protected:
// win::ScreenWin:
@@ -122,6 +122,7 @@ class TestScreenWin : public ScreenWin {
return metric;
}
+ Screen* old_screen_ = Screen::SetScreenInstance(this);
std::vector<MONITORINFOEX> monitor_infos_;
std::unordered_map<HWND, gfx::Rect> hwnd_map_;
@@ -148,8 +149,7 @@ class TestScreenWinInitializer {
class TestScreenWinManager final : public TestScreenWinInitializer {
public:
TestScreenWinManager() = default;
-
- ~TestScreenWinManager() { Screen::SetScreenInstance(nullptr); }
+ ~TestScreenWinManager() = default;
void AddMonitor(const gfx::Rect& pixel_bounds,
const gfx::Rect& pixel_work,
@@ -175,7 +175,6 @@ class TestScreenWinManager final : public TestScreenWinInitializer {
ASSERT_EQ(screen_win_, nullptr);
screen_win_ = std::make_unique<TestScreenWin>(display_infos_,
monitor_infos_, hwnd_map_);
- Screen::SetScreenInstance(screen_win_.get());
}
ScreenWin* GetScreenWin() {
@@ -305,6 +304,13 @@ TEST_F(ScreenWinTestSingleDisplay1x, DIPToScreenRects) {
EXPECT_EQ(middle, ScreenWin::DIPToScreenRect(hwnd, middle));
}
+TEST_F(ScreenWinTestSingleDisplay1x, DIPToScreenRectNullHWND) {
+ gfx::Rect origin(0, 0, 50, 100);
+ gfx::Rect middle(253, 495, 41, 52);
+ EXPECT_EQ(origin, ScreenWin::DIPToScreenRect(nullptr, origin));
+ EXPECT_EQ(middle, ScreenWin::DIPToScreenRect(nullptr, middle));
+}
+
TEST_F(ScreenWinTestSingleDisplay1x, ClientToDIPRects) {
HWND hwnd = GetFakeHwnd();
gfx::Rect origin(0, 0, 50, 100);
@@ -467,6 +473,13 @@ TEST_F(ScreenWinTestSingleDisplay1_25x, DIPToScreenRects) {
ScreenWin::DIPToScreenRect(hwnd, gfx::Rect(168, 330, 28, 36)));
}
+TEST_F(ScreenWinTestSingleDisplay1_25x, DIPToScreenRectNullHWND) {
+ EXPECT_EQ(gfx::Rect(0, 0, 43, 84),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 34, 67)));
+ EXPECT_EQ(gfx::Rect(210, 412, 35, 46),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(168, 330, 28, 36)));
+}
+
TEST_F(ScreenWinTestSingleDisplay1_25x, ClientToDIPRects) {
HWND hwnd = GetFakeHwnd();
EXPECT_EQ(gfx::Rect(0, 0, 40, 80),
@@ -616,6 +629,13 @@ TEST_F(ScreenWinTestSingleDisplay1_5x, DIPToScreenRects) {
ScreenWin::DIPToScreenRect(hwnd, gfx::Rect(168, 330, 28, 36)));
}
+TEST_F(ScreenWinTestSingleDisplay1_5x, DIPToScreenRectNullHWND) {
+ EXPECT_EQ(gfx::Rect(0, 0, 51, 101),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 34, 67)));
+ EXPECT_EQ(gfx::Rect(252, 495, 42, 54),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(168, 330, 28, 36)));
+}
+
TEST_F(ScreenWinTestSingleDisplay1_5x, ClientToDIPRects) {
HWND hwnd = GetFakeHwnd();
EXPECT_EQ(gfx::Rect(0, 0, 34, 67),
@@ -765,6 +785,13 @@ TEST_F(ScreenWinTestSingleDisplay2x, DIPToScreenRects) {
ScreenWin::DIPToScreenRect(hwnd, gfx::Rect(126, 248, 21, 26)));
}
+TEST_F(ScreenWinTestSingleDisplay2x, DIPToScreenRectNullHWND) {
+ EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
+ EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(126, 248, 21, 26)));
+}
+
TEST_F(ScreenWinTestSingleDisplay2x, ClientToDIPRects) {
HWND hwnd = GetFakeHwnd();
EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
@@ -966,6 +993,22 @@ TEST_F(ScreenWinTestTwoDisplays1x, DIPToScreenRects) {
ScreenWin::DIPToScreenRect(right_hwnd, right_origin_left));
}
+TEST_F(ScreenWinTestTwoDisplays1x, DIPToScreenRectNullHWND) {
+ gfx::Rect left_origin(0, 0, 50, 100);
+ gfx::Rect left_middle(253, 495, 41, 52);
+ EXPECT_EQ(left_origin, ScreenWin::DIPToScreenRect(nullptr, left_origin));
+ EXPECT_EQ(left_middle, ScreenWin::DIPToScreenRect(nullptr, left_middle));
+
+ gfx::Rect right_origin(1920, 0, 200, 300);
+ gfx::Rect right_middle(2000, 496, 100, 200);
+ EXPECT_EQ(right_origin, ScreenWin::DIPToScreenRect(nullptr, right_origin));
+ EXPECT_EQ(right_middle, ScreenWin::DIPToScreenRect(nullptr, right_middle));
+
+ gfx::Rect right_origin_left(1900, 200, 100, 100);
+ EXPECT_EQ(right_origin_left,
+ ScreenWin::DIPToScreenRect(nullptr, right_origin_left));
+}
+
TEST_F(ScreenWinTestTwoDisplays1x, ClientToDIPRects) {
HWND left_hwnd = GetLeftFakeHwnd();
gfx::Rect origin(0, 0, 50, 100);
@@ -1232,6 +1275,21 @@ TEST_F(ScreenWinTestTwoDisplays2x, DIPToScreenRects) {
gfx::Rect(950, 100, 50, 50)));
}
+TEST_F(ScreenWinTestTwoDisplays2x, DIPToScreenRectNullHWND) {
+ EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
+ EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(126, 248, 21, 26)));
+
+ EXPECT_EQ(gfx::Rect(1920, 0, 200, 300),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(960, 0, 100, 150)));
+ EXPECT_EQ(gfx::Rect(2000, 496, 100, 200),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(1000, 248, 50, 100)));
+
+ EXPECT_EQ(gfx::Rect(1900, 200, 100, 100),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(950, 100, 50, 50)));
+}
+
TEST_F(ScreenWinTestTwoDisplays2x, ClientToDIPRects) {
HWND left_hwnd = GetLeftFakeHwnd();
EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
@@ -1611,6 +1669,43 @@ TEST_F(ScreenWinTestManyDisplays1x, DIPToScreenRects) {
ScreenWin::DIPToScreenRect(GetFakeHwnd(4), monitor4_middle));
}
+TEST_F(ScreenWinTestManyDisplays1x, DIPToScreenRectNullHWND) {
+ gfx::Rect primary_origin(0, 0, 50, 100);
+ gfx::Rect primary_middle(250, 252, 40, 50);
+ EXPECT_EQ(primary_origin,
+ ScreenWin::DIPToScreenRect(nullptr, primary_origin));
+ EXPECT_EQ(primary_middle,
+ ScreenWin::DIPToScreenRect(nullptr, primary_middle));
+
+ gfx::Rect monitor1_origin(640, 0, 25, 43);
+ gfx::Rect monitor1_middle(852, 357, 37, 45);
+ EXPECT_EQ(monitor1_origin,
+ ScreenWin::DIPToScreenRect(nullptr, monitor1_origin));
+ EXPECT_EQ(monitor1_middle,
+ ScreenWin::DIPToScreenRect(nullptr, monitor1_middle));
+
+ gfx::Rect monitor2_origin(0, 480, 42, 40);
+ gfx::Rect monitor2_middle(321, 700, 103, 203);
+ EXPECT_EQ(monitor2_origin,
+ ScreenWin::DIPToScreenRect(nullptr, monitor2_origin));
+ EXPECT_EQ(monitor2_middle,
+ ScreenWin::DIPToScreenRect(nullptr, monitor2_middle));
+
+ gfx::Rect monitor3_origin(1664, 768, 24, 102);
+ gfx::Rect monitor3_middle(1823, 1000, 35, 35);
+ EXPECT_EQ(monitor3_origin,
+ ScreenWin::DIPToScreenRect(nullptr, monitor3_origin));
+ EXPECT_EQ(monitor3_middle,
+ ScreenWin::DIPToScreenRect(nullptr, monitor3_middle));
+
+ gfx::Rect monitor4_origin(1864, 1168, 15, 20);
+ gfx::Rect monitor4_middle(1955, 1224, 25, 30);
+ EXPECT_EQ(monitor4_origin,
+ ScreenWin::DIPToScreenRect(nullptr, monitor4_origin));
+ EXPECT_EQ(monitor4_middle,
+ ScreenWin::DIPToScreenRect(nullptr, monitor4_middle));
+}
+
TEST_F(ScreenWinTestManyDisplays1x, ClientToDIPRects) {
gfx::Rect origin(0, 0, 50, 100);
gfx::Rect middle(253, 495, 41, 52);
@@ -2027,6 +2122,38 @@ TEST_F(ScreenWinTestManyDisplays2x, DIPToScreenRects) {
gfx::Rect(977, 612, 13, 15)));
}
+TEST_F(ScreenWinTestManyDisplays2x, DIPToScreenRectNullHWND) {
+ // Primary Monitor
+ EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
+ EXPECT_EQ(gfx::Rect(250, 252, 40, 50),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(125, 126, 20, 25)));
+
+ // Monitor 1
+ EXPECT_EQ(gfx::Rect(640, 0, 26, 44),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(320, 0, 13, 22)));
+ EXPECT_EQ(gfx::Rect(852, 356, 38, 46),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(426, 178, 19, 23)));
+
+ // Monitor 2
+ EXPECT_EQ(gfx::Rect(0, 480, 42, 40),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 240, 21, 20)));
+ EXPECT_EQ(gfx::Rect(320, 700, 104, 204),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(160, 350, 52, 102)));
+
+ // Monitor 3
+ EXPECT_EQ(gfx::Rect(1664, 768, 24, 102),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(832, 384, 12, 51)));
+ EXPECT_EQ(gfx::Rect(1822, 1000, 36, 36),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(911, 500, 18, 18)));
+
+ // Monitor 4
+ EXPECT_EQ(gfx::Rect(1864, 1168, 16, 20),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(932, 584, 8, 10)));
+ EXPECT_EQ(gfx::Rect(1954, 1224, 26, 30),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(977, 612, 13, 15)));
+}
+
TEST_F(ScreenWinTestManyDisplays2x, ClientToDIPRects) {
gfx::Rect client_screen_origin(0, 0, 50, 100);
gfx::Rect client_dip_origin(0, 0, 25, 50);
@@ -2330,6 +2457,24 @@ TEST_F(ScreenWinTestTwoDisplays1x2x, DIPToScreenRects) {
gfx::Rect(1910, 100, 50, 50)));
}
+TEST_F(ScreenWinTestTwoDisplays1x2x, DIPToScreenRectNullHWND) {
+ EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 50, 100)));
+ EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(252, 496, 42, 52)));
+
+ EXPECT_EQ(gfx::Rect(1920, 0, 200, 300),
+ ScreenWin::DIPToScreenRect(nullptr,
+ gfx::Rect(1920, 0, 100, 150)));
+ EXPECT_EQ(gfx::Rect(2000, 496, 100, 200),
+ ScreenWin::DIPToScreenRect(nullptr,
+ gfx::Rect(1960, 248, 50, 100)));
+
+ EXPECT_EQ(gfx::Rect(1900, 200, 100, 100),
+ ScreenWin::DIPToScreenRect(nullptr,
+ gfx::Rect(1910, 100, 50, 50)));
+}
+
TEST_F(ScreenWinTestTwoDisplays1x2x, ClientToDIPRects) {
HWND left_hwnd = GetLeftFakeHwnd();
EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
@@ -2605,6 +2750,21 @@ TEST_F(ScreenWinTestTwoDisplays1_5x1x, DIPToScreenRects) {
gfx::Rect(514, 0, 100, 100)));
}
+TEST_F(ScreenWinTestTwoDisplays1_5x1x, DIPToScreenRectNullHWND) {
+ EXPECT_EQ(gfx::Rect(0, 0, 51, 101),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 34, 67)));
+ EXPECT_EQ(gfx::Rect(252, 495, 42, 54),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(168, 330, 28, 36)));
+
+ EXPECT_EQ(gfx::Rect(800, 120, 200, 300),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(534, -80, 200, 300)));
+ EXPECT_EQ(gfx::Rect(1253, 496, 100, 200),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(987, 296, 100, 200)));
+
+ EXPECT_EQ(gfx::Rect(780, 200, 100, 100),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(514, 0, 100, 100)));
+}
+
TEST_F(ScreenWinTestTwoDisplays1_5x1x, ClientToDIPRects) {
HWND left_hwnd = GetLeftFakeHwnd();
EXPECT_EQ(gfx::Rect(0, 0, 34, 67),
@@ -2876,6 +3036,22 @@ TEST_F(ScreenWinTestTwoDisplays2x1x, DIPToScreenRects) {
gfx::Rect(940, 200, 100, 100)));
}
+TEST_F(ScreenWinTestTwoDisplays2x1x, DIPToScreenRectNullHWND) {
+ EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
+ EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(126, 248, 21, 26)));
+
+ EXPECT_EQ(gfx::Rect(1920, 0, 200, 300),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(960, 0, 200, 300)));
+ EXPECT_EQ(
+ gfx::Rect(2000, 496, 100, 200),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(1040, 496, 100, 200)));
+
+ EXPECT_EQ(gfx::Rect(1900, 200, 100, 100),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(940, 200, 100, 100)));
+}
+
TEST_F(ScreenWinTestTwoDisplays2x1x, ClientToDIPRects) {
HWND left_hwnd = GetLeftFakeHwnd();
EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
@@ -3152,6 +3328,21 @@ TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToScreenRects) {
gfx::Rect(3190, 100, 50, 50)));
}
+TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToScreenRectNullHWND) {
+ EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
+ EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(126, 248, 21, 26)));
+
+ EXPECT_EQ(gfx::Rect(6400, 0, 200, 300),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(3200, 0, 100, 150)));
+ EXPECT_EQ(gfx::Rect(7000, 496, 100, 200),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(3500, 248, 50, 100)));
+
+ EXPECT_EQ(gfx::Rect(6380, 200, 100, 100),
+ ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(3190, 100, 50, 50)));
+}
+
TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, ClientToDIPRects) {
HWND left_hwnd = GetLeftFakeHwnd();
EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
diff --git a/chromium/ui/display/win/uwp_text_scale_factor.cc b/chromium/ui/display/win/uwp_text_scale_factor.cc
index 6d4cb4a1c8e..a5be273160b 100644
--- a/chromium/ui/display/win/uwp_text_scale_factor.cc
+++ b/chromium/ui/display/win/uwp_text_scale_factor.cc
@@ -11,6 +11,7 @@
#include <wrl/event.h>
#include "base/lazy_instance.h"
+#include "base/logging.h"
#include "base/strings/string_piece.h"
#include "base/threading/thread_checker.h"
#include "base/win/core_winrt_util.h"
diff --git a/chromium/ui/events/android/motion_event_android.cc b/chromium/ui/events/android/motion_event_android.cc
index 39ee501a963..1dbd0685f2d 100644
--- a/chromium/ui/events/android/motion_event_android.cc
+++ b/chromium/ui/events/android/motion_event_android.cc
@@ -9,6 +9,7 @@
#include <cmath>
#include "base/android/jni_android.h"
+#include "base/notreached.h"
#include "base/numerics/math_constants.h"
#include "ui/events/base_event_utils.h"
#include "ui/events/event_constants.h"
@@ -242,6 +243,7 @@ MotionEventAndroid::MotionEventAndroid(JNIEnv* env,
jint history_size,
jint action_index,
jint android_action_button,
+ jint android_gesture_classification,
jint android_button_state,
jint android_meta_state,
jfloat raw_offset_x_pixels,
@@ -261,6 +263,7 @@ MotionEventAndroid::MotionEventAndroid(JNIEnv* env,
cached_history_size_(ToValidHistorySize(history_size, cached_action_)),
cached_action_index_(action_index),
cached_action_button_(android_action_button),
+ cached_gesture_classification_(android_gesture_classification),
cached_button_state_(FromAndroidButtonState(android_button_state)),
cached_flags_(ToEventFlags(android_meta_state, android_button_state)),
cached_raw_position_offset_(ToDips(raw_offset_x_pixels),
@@ -292,6 +295,7 @@ MotionEventAndroid::MotionEventAndroid(const MotionEventAndroid& e)
cached_history_size_(e.cached_history_size_),
cached_action_index_(e.cached_action_index_),
cached_action_button_(e.cached_action_button_),
+ cached_gesture_classification_(e.cached_gesture_classification_),
cached_button_state_(e.cached_button_state_),
cached_flags_(e.cached_flags_),
cached_raw_position_offset_(e.cached_raw_position_offset_),
@@ -338,6 +342,11 @@ int MotionEventAndroid::GetActionButton() const {
return cached_action_button_;
}
+MotionEvent::Classification MotionEventAndroid::GetClassification() const {
+ return static_cast<MotionEvent::Classification>(
+ cached_gesture_classification_);
+}
+
float MotionEventAndroid::GetTickMultiplier() const {
return ToDips(tick_multiplier_);
}
diff --git a/chromium/ui/events/android/motion_event_android.h b/chromium/ui/events/android/motion_event_android.h
index 30a86f2a5ff..7b68d938861 100644
--- a/chromium/ui/events/android/motion_event_android.h
+++ b/chromium/ui/events/android/motion_event_android.h
@@ -65,6 +65,7 @@ class EVENTS_EXPORT MotionEventAndroid : public MotionEvent {
jint history_size,
jint action_index,
jint android_action_button,
+ jint android_gesture_classification,
jint android_button_state,
jint meta_state,
jfloat raw_offset_x_pixels,
@@ -117,6 +118,7 @@ class EVENTS_EXPORT MotionEventAndroid : public MotionEvent {
int GetFlags() const override;
int GetActionButton() const;
+ Classification GetClassification() const override;
float ticks_x() const { return ticks_x_; }
float ticks_y() const { return ticks_y_; }
float time_sec() const { return time_sec_; }
@@ -162,6 +164,7 @@ class EVENTS_EXPORT MotionEventAndroid : public MotionEvent {
const size_t cached_history_size_;
const int cached_action_index_;
const int cached_action_button_;
+ const int cached_gesture_classification_;
const int cached_button_state_;
const int cached_flags_;
const gfx::Vector2dF cached_raw_position_offset_;
diff --git a/chromium/ui/events/android/motion_event_android_unittest.cc b/chromium/ui/events/android/motion_event_android_unittest.cc
index a57f8744762..8714dab88a7 100644
--- a/chromium/ui/events/android/motion_event_android_unittest.cc
+++ b/chromium/ui/events/android/motion_event_android_unittest.cc
@@ -75,7 +75,7 @@ TEST(MotionEventAndroidTest, Constructor) {
MotionEventAndroid event(
base::android::AttachCurrentThread(), nullptr, kPixToDip, 0.f, 0.f, 0.f,
kEventTimeMS, kAndroidActionDown, pointer_count, history_size,
- action_index, kAndroidActionButton, kAndroidButtonPrimary,
+ action_index, kAndroidActionButton, 0, kAndroidButtonPrimary,
kAndroidAltKeyDown, raw_offset, -raw_offset, false, &p0, &p1);
EXPECT_EQ(MotionEvent::Action::DOWN, event.GetAction());
@@ -119,7 +119,7 @@ TEST(MotionEventAndroidTest, Clone) {
1, 13.7f, -7.13f, 5.3f, 1.2f, 0.1f, 0.2f, kAndroidToolTypeFinger);
MotionEventAndroid event(base::android::AttachCurrentThread(), nullptr,
kPixToDip, 0, 0, 0, 0, kAndroidActionDown,
- pointer_count, 0, 0, 0, 0, 0, 0, 0, false, &p0,
+ pointer_count, 0, 0, 0, 0, 0, 0, 0, 0, false, &p0,
nullptr);
std::unique_ptr<MotionEvent> clone = event.Clone();
@@ -138,7 +138,7 @@ TEST(MotionEventAndroidTest, Cancel) {
1, 13.7f, -7.13f, 5.3f, 1.2f, 0.1f, 0.2f, kAndroidToolTypeFinger);
MotionEventAndroid event(base::android::AttachCurrentThread(), nullptr,
kPixToDip, 0, 0, 0, kEventTimeMS, kAndroidActionDown,
- pointer_count, 0, 0, 0, 0, 0, 0, 0, false, &p0,
+ pointer_count, 0, 0, 0, 0, 0, 0, 0, 0, false, &p0,
nullptr);
std::unique_ptr<MotionEvent> cancel_event = event.Cancel();
@@ -162,7 +162,8 @@ TEST(MotionEventAndroidTest, InvalidOrientationsSanitized) {
MotionEventAndroid::Pointer p1(1, 0, 0, 0, 0, orientation1, 0, 0);
MotionEventAndroid event(base::android::AttachCurrentThread(), nullptr,
kPixToDip, 0, 0, 0, 0, kAndroidActionDown,
- pointer_count, 0, 0, 0, 0, 0, 0, 0, false, &p0, &p1);
+ pointer_count, 0, 0, 0, 0, 0, 0, 0, 0, false, &p0,
+ &p1);
EXPECT_EQ(0.f, event.GetOrientation(0));
EXPECT_EQ(0.f, event.GetOrientation(1));
@@ -177,8 +178,8 @@ TEST(MotionEventAndroidTest, NonEmptyHistoryForNonMoveEventsSanitized) {
MotionEventAndroid::Pointer p0(0, 0, 0, 0, 0, 0, 0, 0);
MotionEventAndroid event(base::android::AttachCurrentThread(), nullptr,
kPixToDip, 0, 0, 0, 0, kAndroidActionDown,
- pointer_count, history_size, 0, 0, 0, 0, 0, 0, false,
- &p0, nullptr);
+ pointer_count, history_size, 0, 0, 0, 0, 0, 0, 0,
+ false, &p0, nullptr);
EXPECT_EQ(0U, event.GetHistorySize());
}
@@ -197,7 +198,7 @@ TEST(MotionEventAndroidTest, ActionIndexForPointerDown) {
MotionEventAndroid event(base::android::AttachCurrentThread(), nullptr,
kPixToDip, 0, 0, 0, 0, kAndroidActionPointerDown,
pointer_count, history_size, action_index, 0, 0, 0,
- 0, 0, false, &p0, &p1);
+ 0, 0, 0, false, &p0, &p1);
EXPECT_EQ(MotionEvent::Action::POINTER_DOWN, event.GetAction());
EXPECT_EQ(action_index, event.GetActionIndex());
diff --git a/chromium/ui/events/blink/blink_event_util.cc b/chromium/ui/events/blink/blink_event_util.cc
index 5f00c70ac67..e9710b2743c 100644
--- a/chromium/ui/events/blink/blink_event_util.cc
+++ b/chromium/ui/events/blink/blink_event_util.cc
@@ -707,17 +707,6 @@ blink::WebInputEvent::Modifiers DomCodeToWebInputEventModifiers(DomCode code) {
return static_cast<blink::WebInputEvent::Modifiers>(0);
}
-bool IsGestureScroll(WebInputEvent::Type type) {
- switch (type) {
- case blink::WebGestureEvent::Type::kGestureScrollBegin:
- case blink::WebGestureEvent::Type::kGestureScrollUpdate:
- case blink::WebGestureEvent::Type::kGestureScrollEnd:
- return true;
- default:
- return false;
- }
-}
-
bool IsContinuousGestureEvent(WebInputEvent::Type type) {
switch (type) {
case blink::WebGestureEvent::Type::kGestureScrollUpdate:
@@ -769,16 +758,6 @@ blink::WebGestureEvent ScrollBeginFromScrollUpdate(
return scroll_begin;
}
-gfx::PointF PositionInWidgetFromInputEvent(const blink::WebInputEvent& event) {
- if (WebInputEvent::IsMouseEventType(event.GetType())) {
- return static_cast<const WebMouseEvent&>(event).PositionInWidget();
- } else if (WebInputEvent::IsGestureEventType(event.GetType())) {
- return static_cast<const WebGestureEvent&>(event).PositionInWidget();
- } else {
- return gfx::PointF(0, 0);
- }
-}
-
#if defined(OS_ANDROID)
std::unique_ptr<WebGestureEvent> CreateWebGestureEventFromGestureEventAndroid(
const GestureEventAndroid& event) {
diff --git a/chromium/ui/events/blink/blink_event_util.h b/chromium/ui/events/blink/blink_event_util.h
index bc236c5f18f..29ce4a9985c 100644
--- a/chromium/ui/events/blink/blink_event_util.h
+++ b/chromium/ui/events/blink/blink_event_util.h
@@ -83,8 +83,6 @@ float IfNanUseMaxFloat(float value);
blink::WebInputEvent::Modifiers DomCodeToWebInputEventModifiers(
ui::DomCode code);
-bool IsGestureScroll(blink::WebInputEvent::Type);
-
bool IsContinuousGestureEvent(blink::WebInputEvent::Type);
EventPointerType WebPointerTypeToEventPointerType(
@@ -99,9 +97,6 @@ inline const blink::WebGestureEvent& ToWebGestureEvent(
blink::WebGestureEvent ScrollBeginFromScrollUpdate(
const blink::WebGestureEvent& scroll_update);
-// Returns the position in the widget if it exists for the passed in event type
-gfx::PointF PositionInWidgetFromInputEvent(const blink::WebInputEvent& event);
-
#if defined(OS_ANDROID)
// Convenience method that converts an instance to blink event.
std::unique_ptr<blink::WebGestureEvent>
diff --git a/chromium/ui/events/blink/web_input_event_unittest.cc b/chromium/ui/events/blink/web_input_event_unittest.cc
index 177e0c7c82f..abcc74c1df4 100644
--- a/chromium/ui/events/blink/web_input_event_unittest.cc
+++ b/chromium/ui/events/blink/web_input_event_unittest.cc
@@ -18,12 +18,13 @@
#include "ui/events/keycodes/dom/dom_key.h"
#include "ui/events/keycodes/dom/keycode_converter.h"
#include "ui/events/test/keyboard_layout.h"
-#include "ui/events/x/x11_event_translation.h"
#if defined(USE_X11)
#include "ui/events/test/events_test_utils_x11.h"
-#include "ui/gfx/x/x11.h" // nogncheck
-#include "ui/gfx/x/x11_types.h" // nogncheck
+#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 {
@@ -105,7 +106,8 @@ TEST(WebInputEventTest, TestMakeWebKeyboardEventWindowsKeyCode) {
{
// Press left Ctrl.
xev.InitKeyEvent(ET_KEY_PRESSED, VKEY_CONTROL, 0);
- XEvent* xevent = xev;
+ x11::Event* x11_event = xev;
+ XEvent* xevent = &x11_event->xlib_event();
xevent->xkey.keycode =
KeycodeConverter::DomCodeToNativeKeycode(DomCode::CONTROL_LEFT);
auto event = ui::BuildKeyEventFromXEvent(*xev);
@@ -115,7 +117,8 @@ TEST(WebInputEventTest, TestMakeWebKeyboardEventWindowsKeyCode) {
{
// Press right Ctrl.
xev.InitKeyEvent(ET_KEY_PRESSED, VKEY_CONTROL, 0);
- XEvent* xevent = xev;
+ x11::Event* x11_event = xev;
+ XEvent* xevent = &x11_event->xlib_event();
xevent->xkey.keycode =
KeycodeConverter::DomCodeToNativeKeycode(DomCode::CONTROL_RIGHT);
auto event = ui::BuildKeyEventFromXEvent(*xev);
@@ -221,7 +224,8 @@ TEST(WebInputEventTest, TestMakeWebKeyboardEventKeyPadKeyCode) {
continue;
xev.InitKeyEvent(ET_KEY_PRESSED, test_case.ui_keycode, EF_NONE);
- XEvent* xevent = xev;
+ x11::Event* x11_event = xev;
+ XEvent* xevent = &x11_event->xlib_event();
xevent->xkey.keycode =
XKeysymToKeycode(gfx::GetXDisplay(), test_case.x_keysym);
if (!xevent->xkey.keycode)
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 6a55ee3ac19..bebb83dc7a5 100644
--- a/chromium/ui/events/devices/x11/device_data_manager_x11.cc
+++ b/chromium/ui/events/devices/x11/device_data_manager_x11.cc
@@ -35,9 +35,9 @@
// Multi-touch support was introduced in XI 2.2. Add XI event types here
// for backward-compatibility with older versions of XInput.
#if !defined(XI_TouchBegin)
-#define XI_TouchBegin 18
+#define XI_TouchBegin 18
#define XI_TouchUpdate 19
-#define XI_TouchEnd 20
+#define XI_TouchEnd 20
#endif
// Copied from xserver-properties.h
@@ -46,21 +46,21 @@
// CMT specific timings
#define AXIS_LABEL_PROP_ABS_DBL_START_TIME "Abs Dbl Start Timestamp"
-#define AXIS_LABEL_PROP_ABS_DBL_END_TIME "Abs Dbl End Timestamp"
+#define AXIS_LABEL_PROP_ABS_DBL_END_TIME "Abs Dbl End Timestamp"
// Ordinal values
-#define AXIS_LABEL_PROP_ABS_DBL_ORDINAL_X "Abs Dbl Ordinal X"
-#define AXIS_LABEL_PROP_ABS_DBL_ORDINAL_Y "Abs Dbl Ordinal Y"
+#define AXIS_LABEL_PROP_ABS_DBL_ORDINAL_X "Abs Dbl Ordinal X"
+#define AXIS_LABEL_PROP_ABS_DBL_ORDINAL_Y "Abs Dbl Ordinal Y"
// Fling properties
-#define AXIS_LABEL_PROP_ABS_DBL_FLING_VX "Abs Dbl Fling X Velocity"
-#define AXIS_LABEL_PROP_ABS_DBL_FLING_VY "Abs Dbl Fling Y Velocity"
-#define AXIS_LABEL_PROP_ABS_FLING_STATE "Abs Fling State"
+#define AXIS_LABEL_PROP_ABS_DBL_FLING_VX "Abs Dbl Fling X Velocity"
+#define AXIS_LABEL_PROP_ABS_DBL_FLING_VY "Abs Dbl Fling Y Velocity"
+#define AXIS_LABEL_PROP_ABS_FLING_STATE "Abs Fling State"
-#define AXIS_LABEL_PROP_ABS_FINGER_COUNT "Abs Finger Count"
+#define AXIS_LABEL_PROP_ABS_FINGER_COUNT "Abs Finger Count"
// Cros metrics gesture from touchpad
-#define AXIS_LABEL_PROP_ABS_METRICS_TYPE "Abs Metrics Type"
+#define AXIS_LABEL_PROP_ABS_METRICS_TYPE "Abs Metrics Type"
#define AXIS_LABEL_PROP_ABS_DBL_METRICS_DATA1 "Abs Dbl Metrics Data 1"
#define AXIS_LABEL_PROP_ABS_DBL_METRICS_DATA2 "Abs Dbl Metrics Data 2"
@@ -68,11 +68,11 @@
#define AXIS_LABEL_ABS_MT_TOUCH_MAJOR "Abs MT Touch Major"
#define AXIS_LABEL_ABS_MT_TOUCH_MINOR "Abs MT Touch Minor"
#define AXIS_LABEL_ABS_MT_ORIENTATION "Abs MT Orientation"
-#define AXIS_LABEL_ABS_MT_PRESSURE "Abs MT Pressure"
-#define AXIS_LABEL_ABS_MT_POSITION_X "Abs MT Position X"
-#define AXIS_LABEL_ABS_MT_POSITION_Y "Abs MT Position Y"
+#define AXIS_LABEL_ABS_MT_PRESSURE "Abs MT Pressure"
+#define AXIS_LABEL_ABS_MT_POSITION_X "Abs MT Position X"
+#define AXIS_LABEL_ABS_MT_POSITION_Y "Abs MT Position Y"
#define AXIS_LABEL_ABS_MT_TRACKING_ID "Abs MT Tracking ID"
-#define AXIS_LABEL_TOUCH_TIMESTAMP "Touch Timestamp"
+#define AXIS_LABEL_TOUCH_TIMESTAMP "Touch Timestamp"
// When you add new data types, please make sure the order here is aligned
// with the order in the DataType enum in the header file because we assume
@@ -135,6 +135,21 @@ bool IsHighPrecisionScrollingDisabled() {
kDisableHighPrecisionScrolling);
}
+// Identical to double_to_fp3232 from xserver's inpututils.c
+x11::Input::Fp3232 DoubleToFp3232(double in) {
+ x11::Input::Fp3232 ret;
+
+ double tmp = floor(in);
+ int32_t integral = tmp;
+
+ tmp = (in - integral) * (1ULL << 32);
+ uint32_t frac_d = tmp;
+
+ ret.integral = integral;
+ ret.frac = frac_d;
+ return ret;
+}
+
} // namespace
bool DeviceDataManagerX11::IsCMTDataType(const int type) {
@@ -173,15 +188,14 @@ DeviceDataManagerX11::DeviceDataManagerX11()
UpdateButtonMap();
}
-DeviceDataManagerX11::~DeviceDataManagerX11() {
-}
+DeviceDataManagerX11::~DeviceDataManagerX11() = default;
bool DeviceDataManagerX11::InitializeXInputInternal() {
// Check if XInput is available on the system.
xi_opcode_ = -1;
int opcode, event, error;
- if (!XQueryExtension(
- gfx::GetXDisplay(), "XInputExtension", &opcode, &event, &error)) {
+ if (!XQueryExtension(gfx::GetXDisplay(), "XInputExtension", &opcode, &event,
+ &error)) {
VLOG(1) << "X Input extension not available: error=" << error;
return false;
}
@@ -194,7 +208,7 @@ bool DeviceDataManagerX11::InitializeXInputInternal() {
}
if (major < 2 || (major == 2 && minor < 2)) {
DVLOG(1) << "XI version on server is " << major << "." << minor << ". "
- << "But 2.2 is required.";
+ << "But 2.2 is required.";
return false;
}
@@ -240,9 +254,9 @@ void DeviceDataManagerX11::UpdateDeviceList(Display* display) {
// Find all the touchpad devices.
const XDeviceList& dev_list =
ui::DeviceListCacheX11::GetInstance()->GetXDeviceList(display);
- Atom xi_touchpad = gfx::GetAtom(XI_TOUCHPAD);
+ x11::Atom xi_touchpad = gfx::GetAtom(XI_TOUCHPAD);
for (int i = 0; i < dev_list.count; ++i)
- if (dev_list[i].type == xi_touchpad)
+ if (static_cast<x11::Atom>(dev_list[i].type) == xi_touchpad)
touchpads_[dev_list[i].id] = true;
if (!IsXInput2Available())
@@ -251,7 +265,7 @@ void DeviceDataManagerX11::UpdateDeviceList(Display* display) {
// Update the structs with new valuator information
const XIDeviceList& info_list =
ui::DeviceListCacheX11::GetInstance()->GetXI2DeviceList(display);
- Atom atoms[DT_LAST_ENTRY];
+ x11::Atom atoms[DT_LAST_ENTRY];
for (int data_type = 0; data_type < DT_LAST_ENTRY; ++data_type)
atoms[data_type] = gfx::GetAtom(kCachedAtoms[data_type]);
@@ -281,8 +295,8 @@ void DeviceDataManagerX11::UpdateDeviceList(Display* display) {
continue;
valuator_lookup_[deviceid].resize(DT_LAST_ENTRY);
- data_type_lookup_[deviceid].resize(
- valuator_count_[deviceid], DT_LAST_ENTRY);
+ data_type_lookup_[deviceid].resize(valuator_count_[deviceid],
+ DT_LAST_ENTRY);
for (int j = 0; j < kMaxSlotNum; j++)
last_seen_valuator_[deviceid][j].resize(DT_LAST_ENTRY, 0);
for (int j = 0; j < info.num_classes; ++j) {
@@ -311,8 +325,10 @@ bool DeviceDataManagerX11::GetSlotNumber(const XIDeviceEvent* xiev, int* slot) {
return factory->QuerySlotForTrackingID(xiev->detail, slot);
}
-void DeviceDataManagerX11::GetEventRawData(const XEvent& xev, EventData* data) {
- if (xev.type != GenericEvent)
+void DeviceDataManagerX11::GetEventRawData(const x11::Event& x11_event,
+ EventData* data) {
+ const XEvent& xev = x11_event.xlib_event();
+ if (xev.type != x11::GeGenericEvent::opcode)
return;
XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev.xcookie.data);
@@ -339,9 +355,11 @@ void DeviceDataManagerX11::GetEventRawData(const XEvent& xev, EventData* data) {
}
}
-bool DeviceDataManagerX11::GetEventData(const XEvent& xev,
- const DataType type, double* value) {
- if (xev.type != GenericEvent)
+bool DeviceDataManagerX11::GetEventData(const x11::Event& x11_event,
+ const DataType type,
+ double* value) {
+ const XEvent& xev = x11_event.xlib_event();
+ if (xev.type != x11::GeGenericEvent::opcode)
return false;
XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev.xcookie.data);
@@ -356,8 +374,7 @@ bool DeviceDataManagerX11::GetEventData(const XEvent& xev,
if (type == DT_TOUCH_TRACKING_ID) {
// With XInput2 MT, Tracking ID is provided in the detail field for touch
// events.
- if (xiev->evtype == XI_TouchBegin ||
- xiev->evtype == XI_TouchEnd ||
+ if (xiev->evtype == XI_TouchBegin || xiev->evtype == XI_TouchEnd ||
xiev->evtype == XI_TouchUpdate) {
*value = xiev->detail;
} else {
@@ -390,14 +407,18 @@ bool DeviceDataManagerX11::GetEventData(const XEvent& xev,
return false;
}
-bool DeviceDataManagerX11::IsXIDeviceEvent(const XEvent& xev) const {
- if (xev.type != GenericEvent || xev.xcookie.extension != xi_opcode_)
+bool DeviceDataManagerX11::IsXIDeviceEvent(const x11::Event& x11_event) const {
+ const XEvent& xev = x11_event.xlib_event();
+ if (xev.type != x11::GeGenericEvent::opcode ||
+ xev.xcookie.extension != xi_opcode_)
return false;
return xi_device_event_types_[xev.xcookie.evtype];
}
-bool DeviceDataManagerX11::IsTouchpadXInputEvent(const XEvent& xev) const {
- if (xev.type != GenericEvent)
+bool DeviceDataManagerX11::IsTouchpadXInputEvent(
+ const x11::Event& x11_event) const {
+ const XEvent& xev = x11_event.xlib_event();
+ if (xev.type != x11::GeGenericEvent::opcode)
return false;
XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev.xcookie.data);
@@ -407,8 +428,9 @@ bool DeviceDataManagerX11::IsTouchpadXInputEvent(const XEvent& xev) const {
return touchpads_[xievent->sourceid];
}
-bool DeviceDataManagerX11::IsCMTDeviceEvent(const XEvent& xev) const {
- if (xev.type != GenericEvent)
+bool DeviceDataManagerX11::IsCMTDeviceEvent(const x11::Event& x11_event) const {
+ const XEvent& xev = x11_event.xlib_event();
+ if (xev.type != x11::GeGenericEvent::opcode)
return false;
XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev.xcookie.data);
@@ -418,8 +440,10 @@ bool DeviceDataManagerX11::IsCMTDeviceEvent(const XEvent& xev) const {
return cmt_devices_[xievent->sourceid];
}
-int DeviceDataManagerX11::GetScrollClassEventDetail(const XEvent& xev) const {
- if (xev.type != GenericEvent)
+int DeviceDataManagerX11::GetScrollClassEventDetail(
+ const x11::Event& x11_event) const {
+ const XEvent& xev = x11_event.xlib_event();
+ if (xev.type != x11::GeGenericEvent::opcode)
return SCROLL_TYPE_NO_SCROLL;
XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev.xcookie.data);
@@ -436,8 +460,10 @@ int DeviceDataManagerX11::GetScrollClassEventDetail(const XEvent& xev) const {
: 0);
}
-int DeviceDataManagerX11::GetScrollClassDeviceDetail(const XEvent& xev) const {
- if (xev.type != GenericEvent)
+int DeviceDataManagerX11::GetScrollClassDeviceDetail(
+ const x11::Event& x11_event) const {
+ const XEvent& xev = x11_event.xlib_event();
+ if (xev.type != x11::GeGenericEvent::opcode)
return SCROLL_TYPE_NO_SCROLL;
XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev.xcookie.data);
@@ -449,12 +475,12 @@ int DeviceDataManagerX11::GetScrollClassDeviceDetail(const XEvent& xev) const {
(device_data.horizontal.number >= 0 ? SCROLL_TYPE_HORIZONTAL : 0);
}
-bool DeviceDataManagerX11::IsCMTGestureEvent(const XEvent& xev) const {
+bool DeviceDataManagerX11::IsCMTGestureEvent(const x11::Event& xev) const {
return (IsScrollEvent(xev) || IsFlingEvent(xev) || IsCMTMetricsEvent(xev));
}
-bool DeviceDataManagerX11::HasEventData(
- const XIDeviceEvent* xiev, const DataType type) const {
+bool DeviceDataManagerX11::HasEventData(const XIDeviceEvent* xiev,
+ const DataType type) const {
CHECK_GE(xiev->sourceid, 0);
if (xiev->sourceid >= kMaxDeviceNum)
return false;
@@ -464,8 +490,9 @@ bool DeviceDataManagerX11::HasEventData(
return (idx >= 0) && XIMaskIsSet(xiev->valuators.mask, idx);
}
-bool DeviceDataManagerX11::IsScrollEvent(const XEvent& xev) const {
- if (!IsCMTDeviceEvent(xev))
+bool DeviceDataManagerX11::IsScrollEvent(const x11::Event& x11_event) const {
+ const XEvent& xev = x11_event.xlib_event();
+ if (!IsCMTDeviceEvent(x11_event))
return false;
XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev.xcookie.data);
@@ -473,8 +500,9 @@ bool DeviceDataManagerX11::IsScrollEvent(const XEvent& xev) const {
HasEventData(xiev, DT_CMT_SCROLL_Y));
}
-bool DeviceDataManagerX11::IsFlingEvent(const XEvent& xev) const {
- if (!IsCMTDeviceEvent(xev))
+bool DeviceDataManagerX11::IsFlingEvent(const x11::Event& x11_event) const {
+ const XEvent& xev = x11_event.xlib_event();
+ if (!IsCMTDeviceEvent(x11_event))
return false;
XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev.xcookie.data);
@@ -483,8 +511,10 @@ bool DeviceDataManagerX11::IsFlingEvent(const XEvent& xev) const {
HasEventData(xiev, DT_CMT_FLING_STATE));
}
-bool DeviceDataManagerX11::IsCMTMetricsEvent(const XEvent& xev) const {
- if (!IsCMTDeviceEvent(xev))
+bool DeviceDataManagerX11::IsCMTMetricsEvent(
+ const x11::Event& x11_event) const {
+ const XEvent& xev = x11_event.xlib_event();
+ if (!IsCMTDeviceEvent(x11_event))
return false;
XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev.xcookie.data);
@@ -493,8 +523,9 @@ bool DeviceDataManagerX11::IsCMTMetricsEvent(const XEvent& xev) const {
HasEventData(xiev, DT_CMT_METRICS_DATA2));
}
-bool DeviceDataManagerX11::HasGestureTimes(const XEvent& xev) const {
- if (!IsCMTDeviceEvent(xev))
+bool DeviceDataManagerX11::HasGestureTimes(const x11::Event& x11_event) const {
+ const XEvent& xev = x11_event.xlib_event();
+ if (!IsCMTDeviceEvent(x11_event))
return false;
XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev.xcookie.data);
@@ -502,7 +533,7 @@ bool DeviceDataManagerX11::HasGestureTimes(const XEvent& xev) const {
HasEventData(xiev, DT_CMT_END_TIME));
}
-void DeviceDataManagerX11::GetScrollOffsets(const XEvent& xev,
+void DeviceDataManagerX11::GetScrollOffsets(const x11::Event& xev,
float* x_offset,
float* y_offset,
float* x_offset_ordinal,
@@ -529,15 +560,16 @@ void DeviceDataManagerX11::GetScrollOffsets(const XEvent& xev,
*finger_count = static_cast<int>(data[DT_CMT_FINGER_COUNT]);
}
-void DeviceDataManagerX11::GetScrollClassOffsets(const XEvent& xev,
+void DeviceDataManagerX11::GetScrollClassOffsets(const x11::Event& x11_event,
double* x_offset,
double* y_offset) {
- DCHECK_NE(SCROLL_TYPE_NO_SCROLL, GetScrollClassDeviceDetail(xev));
+ const XEvent& xev = x11_event.xlib_event();
+ DCHECK_NE(SCROLL_TYPE_NO_SCROLL, GetScrollClassDeviceDetail(x11_event));
*x_offset = 0;
*y_offset = 0;
- if (xev.type != GenericEvent)
+ if (xev.type != x11::GeGenericEvent::opcode)
return;
XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev.xcookie.data);
@@ -565,9 +597,9 @@ void DeviceDataManagerX11::GetScrollClassOffsets(const XEvent& xev,
void DeviceDataManagerX11::InvalidateScrollClasses(int device_id) {
if (device_id == kAllDevices) {
- for (int i = 0; i < kMaxDeviceNum; i++) {
- scroll_data_[i].horizontal.seen = false;
- scroll_data_[i].vertical.seen = false;
+ for (auto& i : scroll_data_) {
+ i.horizontal.seen = false;
+ i.vertical.seen = false;
}
} else {
CHECK(device_id >= 0 && device_id < kMaxDeviceNum);
@@ -576,7 +608,7 @@ void DeviceDataManagerX11::InvalidateScrollClasses(int device_id) {
}
}
-void DeviceDataManagerX11::GetFlingData(const XEvent& xev,
+void DeviceDataManagerX11::GetFlingData(const x11::Event& xev,
float* vx,
float* vy,
float* vx_ordinal,
@@ -603,7 +635,7 @@ void DeviceDataManagerX11::GetFlingData(const XEvent& xev,
*vy_ordinal = data[DT_CMT_ORDINAL_Y];
}
-void DeviceDataManagerX11::GetMetricsData(const XEvent& xev,
+void DeviceDataManagerX11::GetMetricsData(const x11::Event& xev,
GestureMetricsType* type,
float* data1,
float* data2) {
@@ -628,8 +660,8 @@ void DeviceDataManagerX11::GetMetricsData(const XEvent& xev,
}
int DeviceDataManagerX11::GetMappedButton(int button) {
- return button > 0 && button <= button_map_count_ ? button_map_[button - 1] :
- button;
+ return button > 0 && button <= button_map_count_ ? button_map_[button - 1]
+ : button;
}
void DeviceDataManagerX11::UpdateButtonMap() {
@@ -637,7 +669,7 @@ void DeviceDataManagerX11::UpdateButtonMap() {
base::size(button_map_));
}
-void DeviceDataManagerX11::GetGestureTimes(const XEvent& xev,
+void DeviceDataManagerX11::GetGestureTimes(const x11::Event& xev,
double* start_time,
double* end_time) {
*start_time = 0;
@@ -713,23 +745,50 @@ void DeviceDataManagerX11::SetDeviceListForTest(
}
}
-void DeviceDataManagerX11::SetValuatorDataForTest(XIDeviceEvent* xievent,
- DataType type,
- double value) {
- int index = valuator_lookup_[xievent->deviceid][type].number;
- CHECK(!XIMaskIsSet(xievent->valuators.mask, index));
- CHECK(index >= 0 && index < valuator_count_[xievent->deviceid]);
- XISetMask(xievent->valuators.mask, index);
+void DeviceDataManagerX11::SetValuatorDataForTest(
+ XIDeviceEvent* xievent,
+ x11::Input::DeviceEvent* devev,
+ DataType type,
+ double value) {
+ // Modify |xievent|.
+ {
+ int index = valuator_lookup_[xievent->deviceid][type].number;
+ CHECK(!XIMaskIsSet(xievent->valuators.mask, index));
+ CHECK(index >= 0 && index < valuator_count_[xievent->deviceid]);
+ XISetMask(xievent->valuators.mask, index);
+
+ double* valuators = xievent->valuators.values;
+ for (int i = 0; i < index; ++i) {
+ if (XIMaskIsSet(xievent->valuators.mask, i))
+ valuators++;
+ }
+ for (int i = DT_LAST_ENTRY - 1; i > valuators - xievent->valuators.values;
+ --i) {
+ xievent->valuators.values[i] = xievent->valuators.values[i - 1];
+ }
+ *valuators = value;
+ }
- double* valuators = xievent->valuators.values;
- for (int i = 0; i < index; ++i) {
- if (XIMaskIsSet(xievent->valuators.mask, i))
- valuators++;
+ // Modify |devev|.
+ {
+ uint16_t device = static_cast<uint16_t>(devev->deviceid);
+ int index = valuator_lookup_[device][type].number;
+ CHECK(!XIMaskIsSet(devev->valuator_mask.data(), index));
+ CHECK(index >= 0 && index < valuator_count_[device]);
+ XISetMask(devev->valuator_mask.data(), index);
+
+ x11::Input::Fp3232* valuators = devev->axisvalues.data();
+ for (int i = 0; i < index; ++i) {
+ if (XIMaskIsSet(devev->valuator_mask.data(), i))
+ valuators++;
+ }
+ for (int i = DT_LAST_ENTRY - 1; i > valuators - devev->axisvalues.data();
+ --i) {
+ devev->axisvalues[i] = devev->axisvalues[i - 1];
+ }
+
+ *valuators = DoubleToFp3232(value);
}
- for (int i = DT_LAST_ENTRY - 1; i > valuators - xievent->valuators.values;
- --i)
- xievent->valuators.values[i] = xievent->valuators.values[i - 1];
- *valuators = value;
}
void DeviceDataManagerX11::InitializeValuatorsForTest(int deviceid,
@@ -753,11 +812,12 @@ void DeviceDataManagerX11::InitializeValuatorsForTest(int deviceid,
bool DeviceDataManagerX11::UpdateValuatorClassDevice(
XIValuatorClassInfo* valuator_class_info,
- Atom* atoms,
+ x11::Atom* atoms,
int deviceid) {
DCHECK(deviceid >= 0 && deviceid < kMaxDeviceNum);
- Atom* label =
- std::find(atoms, atoms + DT_LAST_ENTRY, valuator_class_info->label);
+ x11::Atom* label =
+ std::find(atoms, atoms + DT_LAST_ENTRY,
+ static_cast<x11::Atom>(valuator_class_info->label));
if (label == atoms + DT_LAST_ENTRY) {
return false;
}
@@ -810,8 +870,7 @@ double DeviceDataManagerX11::ExtractAndUpdateScrollOffset(
void DeviceDataManagerX11::SetDisabledKeyboardAllowedKeys(
std::unique_ptr<std::set<KeyboardCode>> excepted_keys) {
- DCHECK(!excepted_keys.get() ||
- !blocked_keyboard_allowed_keys_.get());
+ DCHECK(!excepted_keys.get() || !blocked_keyboard_allowed_keys_.get());
blocked_keyboard_allowed_keys_ = std::move(excepted_keys);
}
@@ -844,9 +903,10 @@ bool DeviceDataManagerX11::IsDeviceEnabled(int device_id) const {
return blocked_devices_.test(device_id);
}
-bool DeviceDataManagerX11::IsEventBlocked(const XEvent& xev) {
+bool DeviceDataManagerX11::IsEventBlocked(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
// Only check XI2 events which have a source device id.
- if (xev.type != GenericEvent)
+ if (xev.type != x11::GeGenericEvent::opcode)
return false;
XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev.xcookie.data);
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 daadcb877bd..a415db641fb 100644
--- a/chromium/ui/events/devices/x11/device_data_manager_x11.h
+++ b/chromium/ui/events/devices/x11/device_data_manager_x11.h
@@ -19,8 +19,10 @@
#include "ui/events/keycodes/keyboard_codes.h"
#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 {
@@ -133,53 +135,53 @@ class EVENTS_DEVICES_X11_EXPORT DeviceDataManagerX11
// Get all event data in one pass. We extract only data types that we know
// about (defined in enum DataType). The data is not processed (e.g. not
// filled in by cached values) as in GetEventData.
- void GetEventRawData(const XEvent& xev, EventData* data);
+ void GetEventRawData(const x11::Event& xev, EventData* data);
// Get a datum of the specified type. Return true and the value
// is updated if the data is found, false and value unchanged if the data is
// not found. In the case of MT-B/XI2.2, the value can come from a previously
// cached one (see the comment above last_seen_valuator_).
- bool GetEventData(const XEvent& xev, const DataType type, double* value);
+ bool GetEventData(const x11::Event& xev, const DataType type, double* value);
// Check if the event is an XI input event in the strict sense
// (i.e. XIDeviceEvent). This rules out things like hierarchy changes,
/// device changes, property changes and so on.
- bool IsXIDeviceEvent(const XEvent& xev) const;
+ bool IsXIDeviceEvent(const x11::Event& xev) const;
// Check if the event comes from touchpad devices.
- bool IsTouchpadXInputEvent(const XEvent& xev) const;
+ bool IsTouchpadXInputEvent(const x11::Event& xev) const;
// Check if the event comes from devices running CMT driver or using
// CMT valuators (e.g. mouses). Note that doesn't necessarily mean the event
// is a CMT event (e.g. it could be a mouse pointer move).
- bool IsCMTDeviceEvent(const XEvent& xev) const;
+ bool IsCMTDeviceEvent(const x11::Event& xev) const;
// Check if the event contains information about a ScrollClass, and
// report which scroll axes are contained in this event, defined by
// ScrollType.
- int GetScrollClassEventDetail(const XEvent& xev) const;
+ int GetScrollClassEventDetail(const x11::Event& xev) const;
// Check if the event comes from a device that has a ScrollClass, and
// report which scroll axes it supports as a bit field, defined by
// ScrollType.
- int GetScrollClassDeviceDetail(const XEvent& xev) const;
+ int GetScrollClassDeviceDetail(const x11::Event& xev) const;
// Check if the event is one of the CMT gesture events (scroll, fling,
// metrics etc.).
- bool IsCMTGestureEvent(const XEvent& xev) const;
+ bool IsCMTGestureEvent(const x11::Event& xev) const;
// Returns true if the event is of the specific type, false if not.
- bool IsScrollEvent(const XEvent& xev) const;
- bool IsFlingEvent(const XEvent& xev) const;
- bool IsCMTMetricsEvent(const XEvent& xev) const;
+ bool IsScrollEvent(const x11::Event& xev) const;
+ bool IsFlingEvent(const x11::Event& xev) const;
+ bool IsCMTMetricsEvent(const x11::Event& xev) const;
// Returns true if the event has CMT start/end timestamps.
- bool HasGestureTimes(const XEvent& xev) const;
+ bool HasGestureTimes(const x11::Event& xev) const;
// Extract data from a scroll event (a motion event with the necessary
// valuators). User must first verify the event type with IsScrollEvent.
// Pointers shouldn't be NULL.
- void GetScrollOffsets(const XEvent& xev,
+ void GetScrollOffsets(const x11::Event& xev,
float* x_offset,
float* y_offset,
float* x_offset_ordinal,
@@ -189,7 +191,7 @@ class EVENTS_DEVICES_X11_EXPORT DeviceDataManagerX11
// Extract data from a scroll class event (smooth scrolling). User must
// first verify the event type with GetScrollClassEventDetail.
// Pointers shouldn't be NULL.
- void GetScrollClassOffsets(const XEvent& xev,
+ void GetScrollClassOffsets(const x11::Event& xev,
double* x_offset,
double* y_offset);
@@ -200,7 +202,7 @@ class EVENTS_DEVICES_X11_EXPORT DeviceDataManagerX11
// Extract data from a fling event. User must first verify the event type
// with IsFlingEvent. Pointers shouldn't be NULL.
- void GetFlingData(const XEvent& xev,
+ void GetFlingData(const x11::Event& xev,
float* vx,
float* vy,
float* vx_ordinal,
@@ -209,7 +211,7 @@ class EVENTS_DEVICES_X11_EXPORT DeviceDataManagerX11
// Extract data from a CrOS metrics gesture event. User must first verify
// the event type with IsCMTMetricsEvent. Pointers shouldn't be NULL.
- void GetMetricsData(const XEvent& xev,
+ void GetMetricsData(const x11::Event& xev,
GestureMetricsType* type,
float* data1,
float* data2);
@@ -223,15 +225,15 @@ class EVENTS_DEVICES_X11_EXPORT DeviceDataManagerX11
// Extract the start/end timestamps from CMT events. User must first verify
// the event with HasGestureTimes. Pointers shouldn't be NULL.
- void GetGestureTimes(const XEvent& xev, double* start_time, double* end_time);
+ void GetGestureTimes(const x11::Event& xev,
+ double* start_time,
+ double* end_time);
// Normalize the data value on deviceid to fall into [0, 1].
// *value = (*value - min_value_of_tp) / (max_value_of_tp - min_value_of_tp)
// Returns true and sets the normalized value in|value| if normalization is
// successful. Returns false and |value| is unchanged otherwise.
- bool NormalizeData(int deviceid,
- const DataType type,
- double* value);
+ bool NormalizeData(int deviceid, const DataType type, double* value);
// Extract the range of the data type. Return true if the range is available
// and written into min & max, false if the range is not available.
@@ -249,6 +251,7 @@ class EVENTS_DEVICES_X11_EXPORT DeviceDataManagerX11
const std::vector<int>& other_devices);
void SetValuatorDataForTest(XIDeviceEvent* xievent,
+ x11::Input::DeviceEvent* devev,
DataType type,
double value);
@@ -263,11 +266,9 @@ class EVENTS_DEVICES_X11_EXPORT DeviceDataManagerX11
bool IsDeviceEnabled(int device_id) const;
// Returns true if |native_event| should be blocked.
- bool IsEventBlocked(const XEvent& xev);
+ bool IsEventBlocked(const x11::Event& xev);
- const std::vector<int>& master_pointers() const {
- return master_pointers_;
- }
+ const std::vector<int>& master_pointers() const { return master_pointers_; }
protected:
// DeviceHotplugEventObserver:
@@ -317,7 +318,7 @@ class EVENTS_DEVICES_X11_EXPORT DeviceDataManagerX11
// Updates a device based on a Valuator class info. Returns true if the
// device is a possible CMT device.
bool UpdateValuatorClassDevice(XIValuatorClassInfo* valuator_class_info,
- Atom* atoms,
+ x11::Atom* atoms,
int deviceid);
// Updates a device based on a Scroll class info.
diff --git a/chromium/ui/events/devices/x11/touch_factory_x11.cc b/chromium/ui/events/devices/x11/touch_factory_x11.cc
index 96abfc60208..7396743e7d6 100644
--- a/chromium/ui/events/devices/x11/touch_factory_x11.cc
+++ b/chromium/ui/events/devices/x11/touch_factory_x11.cc
@@ -147,7 +147,7 @@ void TouchFactory::UpdateDeviceList(XDisplay* display) {
}
bool TouchFactory::ShouldProcessXI2Event(XEvent* xev) {
- DCHECK_EQ(GenericEvent, xev->type);
+ DCHECK_EQ(x11::GeGenericEvent::opcode, xev->type);
XIEvent* event = static_cast<XIEvent*>(xev->xcookie.data);
XIDeviceEvent* xiev = reinterpret_cast<XIDeviceEvent*>(event);
@@ -196,7 +196,7 @@ bool TouchFactory::ShouldProcessXI2Event(XEvent* xev) {
return IsTouchDevice(xiev->deviceid) ? !is_touch_disabled : true;
}
-void TouchFactory::SetupXI2ForXWindow(Window window) {
+void TouchFactory::SetupXI2ForXWindow(x11::Window window) {
// Setup mask for mouse events. It is possible that a device is loaded/plugged
// in after we have setup XInput2 on a window. In such cases, we need to
// either resetup XInput2 for the window, so that we get events from the new
@@ -238,7 +238,7 @@ void TouchFactory::SetupXI2ForXWindow(Window window) {
evmask.deviceid = XIAllDevices;
evmask.mask_len = sizeof(mask);
evmask.mask = mask;
- XISelectEvents(display, window, &evmask, 1);
+ XISelectEvents(display, static_cast<uint32_t>(window), &evmask, 1);
XFlush(display);
}
diff --git a/chromium/ui/events/devices/x11/touch_factory_x11.h b/chromium/ui/events/devices/x11/touch_factory_x11.h
index 88d1c8389b4..13482a6f707 100644
--- a/chromium/ui/events/devices/x11/touch_factory_x11.h
+++ b/chromium/ui/events/devices/x11/touch_factory_x11.h
@@ -50,7 +50,7 @@ class EVENTS_DEVICES_X11_EXPORT TouchFactory {
bool ShouldProcessXI2Event(XEvent* xevent);
// Setup an X Window for XInput2 events.
- void SetupXI2ForXWindow(::Window xid);
+ void SetupXI2ForXWindow(x11::Window window);
// Keeps a list of touch devices so that it is possible to determine if a
// pointer event is a touch-event or a mouse-event. The list is reset each
diff --git a/chromium/ui/events/event.cc b/chromium/ui/events/event.cc
index 219c9c42080..e60e7095cb0 100644
--- a/chromium/ui/events/event.cc
+++ b/chromium/ui/events/event.cc
@@ -6,14 +6,17 @@
#include <cmath>
#include <cstring>
+#include <memory>
+#include <string>
#include <utility>
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/metrics/histogram.h"
#include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
+#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
#include "build/build_config.h"
#include "ui/events/base_event_utils.h"
#include "ui/events/event_utils.h"
@@ -28,7 +31,7 @@
#include "ui/gfx/transform_util.h"
#if defined(USE_OZONE)
-#include "ui/events/ozone/layout/keyboard_layout_engine.h" // nogncheck
+#include "ui/events/ozone/layout/keyboard_layout_engine.h" // nogncheck
#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h" // nogncheck
#endif
@@ -40,9 +43,8 @@ namespace ui {
namespace {
constexpr int kChangedButtonFlagMask =
- ui::EF_LEFT_MOUSE_BUTTON | ui::EF_MIDDLE_MOUSE_BUTTON |
- ui::EF_RIGHT_MOUSE_BUTTON | ui::EF_BACK_MOUSE_BUTTON |
- ui::EF_FORWARD_MOUSE_BUTTON;
+ EF_LEFT_MOUSE_BUTTON | EF_MIDDLE_MOUSE_BUTTON | EF_RIGHT_MOUSE_BUTTON |
+ EF_BACK_MOUSE_BUTTON | EF_FORWARD_MOUSE_BUTTON;
SourceEventType EventTypeToLatencySourceEventType(EventType type) {
switch (type) {
@@ -72,8 +74,8 @@ SourceEventType EventTypeToLatencySourceEventType(EventType type) {
case ET_SCROLL_FLING_CANCEL:
return SourceEventType::UNKNOWN;
- case ui::ET_KEY_PRESSED:
- return ui::SourceEventType::KEY_PRESS;
+ case ET_KEY_PRESSED:
+ return SourceEventType::KEY_PRESS;
case ET_MOUSE_PRESSED:
case ET_MOUSE_DRAGGED:
@@ -141,7 +143,7 @@ std::string ScrollEventPhaseToString(ScrollEventPhase phase) {
#if defined(USE_OZONE)
uint32_t ScanCodeFromNative(const PlatformEvent& native_event) {
- const ui::KeyEvent* event = static_cast<const ui::KeyEvent*>(native_event);
+ const KeyEvent* event = static_cast<const KeyEvent*>(native_event);
DCHECK(event->IsKeyEvent());
return event->scan_code();
}
@@ -189,6 +191,13 @@ Event::~Event() {
ReleaseCopiedNativeEvent(native_event_);
}
+void Event::SetNativeEvent(const PlatformEvent& event) {
+ if (delete_native_event_)
+ ReleaseCopiedNativeEvent(native_event_);
+ native_event_ = CopyNativeEvent(event);
+ delete_native_event_ = true;
+}
+
const char* Event::GetName() const {
return EventTypeName(type_);
}
@@ -308,12 +317,12 @@ std::string Event::ToString() const {
Event::Event(EventType type, base::TimeTicks time_stamp, int flags)
: type_(type),
- time_stamp_(time_stamp),
+ time_stamp_(time_stamp.is_null() ? EventTimeForNow() : time_stamp),
flags_(flags),
native_event_(PlatformEvent()),
delete_native_event_(false),
cancelable_(true),
- target_(NULL),
+ target_(nullptr),
phase_(EP_PREDISPATCH),
result_(ER_UNHANDLED),
source_device_id_(ED_UNKNOWN_DEVICE) {
@@ -328,7 +337,7 @@ Event::Event(const PlatformEvent& native_event, EventType type, int flags)
native_event_(native_event),
delete_native_event_(false),
cancelable_(true),
- target_(NULL),
+ target_(nullptr),
phase_(EP_PREDISPATCH),
result_(ER_UNHANDLED),
source_device_id_(ED_UNKNOWN_DEVICE) {
@@ -351,7 +360,7 @@ Event::Event(const Event& copy)
native_event_(CopyNativeEvent(copy.native_event_)),
delete_native_event_(true),
cancelable_(true),
- target_(NULL),
+ target_(nullptr),
phase_(EP_PREDISPATCH),
result_(ER_UNHANDLED),
source_device_id_(copy.source_device_id_),
@@ -380,7 +389,7 @@ Event& Event::operator=(const Event& rhs) {
else
properties_.reset();
}
- latency_.set_source_event_type(ui::SourceEventType::OTHER);
+ latency_.set_source_event_type(SourceEventType::OTHER);
return *this;
}
@@ -398,8 +407,7 @@ CancelModeEvent::CancelModeEvent()
set_cancelable(false);
}
-CancelModeEvent::~CancelModeEvent() {
-}
+CancelModeEvent::~CancelModeEvent() = default;
////////////////////////////////////////////////////////////////////////////////
// LocatedEvent
@@ -459,7 +467,7 @@ MouseEvent::MouseEvent(const PlatformEvent& native_event)
: LocatedEvent(native_event),
changed_button_flags_(GetChangedMouseButtonFlagsFromNative(native_event)),
pointer_details_(GetMousePointerDetailsFromNative(native_event)) {
- latency()->set_source_event_type(ui::SourceEventType::MOUSE);
+ latency()->set_source_event_type(SourceEventType::MOUSE);
latency()->AddLatencyNumberWithTimestamp(
INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, time_stamp());
latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT);
@@ -479,7 +487,7 @@ MouseEvent::MouseEvent(EventType type,
DCHECK_NE(ET_MOUSEWHEEL, type);
DCHECK_EQ(changed_button_flags_,
changed_button_flags_ & kChangedButtonFlagMask);
- latency()->set_source_event_type(ui::SourceEventType::MOUSE);
+ latency()->set_source_event_type(SourceEventType::MOUSE);
latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT);
if (this->type() == ET_MOUSE_MOVED && IsAnyButton())
SetType(ET_MOUSE_DRAGGED);
@@ -518,8 +526,7 @@ bool MouseEvent::IsRepeatedClickEvent(const MouseEvent& event1,
static const int kDoubleClickWidth = 4;
static const int kDoubleClickHeight = 4;
- if (event1.type() != ET_MOUSE_PRESSED ||
- event2.type() != ET_MOUSE_PRESSED)
+ if (event1.type() != ET_MOUSE_PRESSED || event2.type() != ET_MOUSE_PRESSED)
return false;
// Compare flags, but ignore EF_IS_DOUBLE_CLICK to allow triple clicks.
@@ -549,9 +556,9 @@ bool MouseEvent::IsRepeatedClickEvent(const MouseEvent& event1,
int MouseEvent::GetRepeatCount(const MouseEvent& event) {
int click_count = 1;
if (last_click_event_) {
- if (event.type() == ui::ET_MOUSE_RELEASED) {
+ if (event.type() == ET_MOUSE_RELEASED) {
if (event.changed_button_flags() ==
- last_click_event_->changed_button_flags()) {
+ last_click_event_->changed_button_flags()) {
return last_click_event_->GetClickCount();
} else {
// If last_click_event_ has changed since this button was pressed
@@ -577,12 +584,12 @@ int MouseEvent::GetRepeatCount(const MouseEvent& event) {
void MouseEvent::ResetLastClickForTest() {
if (last_click_event_) {
delete last_click_event_;
- last_click_event_ = NULL;
+ last_click_event_ = nullptr;
}
}
// static
-MouseEvent* MouseEvent::last_click_event_ = NULL;
+MouseEvent* MouseEvent::last_click_event_ = nullptr;
int MouseEvent::GetClickCount() const {
if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED)
@@ -642,8 +649,7 @@ MouseWheelEvent::MouseWheelEvent(const MouseEvent& mouse_event,
}
MouseWheelEvent::MouseWheelEvent(const MouseWheelEvent& mouse_wheel_event)
- : MouseEvent(mouse_wheel_event),
- offset_(mouse_wheel_event.offset()) {
+ : MouseEvent(mouse_wheel_event), offset_(mouse_wheel_event.offset()) {
DCHECK_EQ(ET_MOUSEWHEEL, type());
}
@@ -653,7 +659,7 @@ MouseWheelEvent::MouseWheelEvent(const gfx::Vector2d& offset,
base::TimeTicks time_stamp,
int flags,
int changed_button_flags)
- : MouseEvent(ui::ET_UNKNOWN,
+ : MouseEvent(ET_UNKNOWN,
location,
root_location,
time_stamp,
@@ -663,7 +669,7 @@ MouseWheelEvent::MouseWheelEvent(const gfx::Vector2d& offset,
// Set event type to ET_UNKNOWN initially in MouseEvent() to pass the
// DCHECK for type to enforce that we use MouseWheelEvent() to create
// a MouseWheelEvent.
- SetType(ui::ET_MOUSEWHEEL);
+ SetType(ET_MOUSEWHEEL);
}
MouseWheelEvent::MouseWheelEvent(const gfx::Vector2d& offset,
@@ -805,9 +811,7 @@ KeyEvent::KeyEvent(EventType type,
KeyboardCode key_code,
int flags,
base::TimeTicks time_stamp)
- : Event(type,
- time_stamp == base::TimeTicks() ? EventTimeForNow() : time_stamp,
- flags),
+ : Event(type, time_stamp, flags),
key_code_(key_code),
code_(UsLayoutKeyboardCodeToDomCode(key_code)) {}
@@ -815,10 +819,7 @@ KeyEvent::KeyEvent(EventType type,
KeyboardCode key_code,
DomCode code,
int flags)
- : Event(type, EventTimeForNow(), flags),
- key_code_(key_code),
- code_(code) {
-}
+ : Event(type, EventTimeForNow(), flags), key_code_(key_code), code_(code) {}
KeyEvent::KeyEvent(EventType type,
KeyboardCode key_code,
@@ -838,9 +839,7 @@ KeyEvent::KeyEvent(base::char16 character,
DomCode code,
int flags,
base::TimeTicks time_stamp)
- : Event(ET_KEY_PRESSED,
- time_stamp == base::TimeTicks() ? EventTimeForNow() : time_stamp,
- flags),
+ : Event(ET_KEY_PRESSED, time_stamp, flags),
key_code_(key_code),
code_(code),
is_char_(true),
@@ -881,7 +880,7 @@ void KeyEvent::InitializeNative() {
// Check if this is a key repeat. This must be called before initial flags
// processing, e.g: NormalizeFlags(), to avoid issues like crbug.com/1069690.
if (IsRepeated(GetLastKeyEvent()))
- set_flags(flags() | ui::EF_IS_REPEAT);
+ set_flags(flags() | EF_IS_REPEAT);
#if defined(USE_X11)
NormalizeFlags();
@@ -899,7 +898,7 @@ void KeyEvent::InitializeNative() {
}
void KeyEvent::ApplyLayout() const {
- ui::DomCode code = code_;
+ DomCode code = code_;
if (code == DomCode::NONE) {
// Catch old code that tries to do layout without a physical key, and try
// to recover using the KeyboardCode. Once key events are fully defined
@@ -940,13 +939,13 @@ bool KeyEvent::IsRepeated(KeyEvent** last_key_event) {
if (is_char())
return false;
- if (type() == ui::ET_KEY_RELEASED) {
+ if (type() == ET_KEY_RELEASED) {
delete *last_key_event;
*last_key_event = nullptr;
return false;
}
- CHECK_EQ(ui::ET_KEY_PRESSED, type());
+ CHECK_EQ(ET_KEY_PRESSED, type());
KeyEvent* last = *last_key_event;
if (!last) {
@@ -954,7 +953,7 @@ bool KeyEvent::IsRepeated(KeyEvent** last_key_event) {
return false;
} else if (time_stamp() == last->time_stamp()) {
// The KeyEvent is created from the same native event.
- return (last->flags() & ui::EF_IS_REPEAT) != 0;
+ return (last->flags() & EF_IS_REPEAT) != 0;
}
DCHECK(last);
@@ -969,7 +968,7 @@ bool KeyEvent::IsRepeated(KeyEvent** last_key_event) {
#endif
if (!is_repeat) {
if (key_code() == last->key_code() &&
- flags() == (last->flags() & ~ui::EF_IS_REPEAT) &&
+ flags() == (last->flags() & ~EF_IS_REPEAT) &&
(time_stamp() - last->time_stamp()).InMilliseconds() <
kMaxAutoRepeatTimeMs) {
is_repeat = true;
@@ -978,7 +977,7 @@ bool KeyEvent::IsRepeated(KeyEvent** last_key_event) {
if (is_repeat) {
last->set_time_stamp(time_stamp());
- last->set_flags(last->flags() | ui::EF_IS_REPEAT);
+ last->set_flags(last->flags() | EF_IS_REPEAT);
return true;
}
@@ -1036,8 +1035,8 @@ base::char16 KeyEvent::GetCharacter() const {
base::char16 KeyEvent::GetText() const {
if ((flags() & EF_CONTROL_DOWN) != 0) {
- ui::DomKey key;
- ui::KeyboardCode key_code;
+ DomKey key;
+ KeyboardCode key_code;
if (DomCodeToControlCharacter(code_, flags(), &key, &key_code))
return key.ToCharacter();
}
@@ -1061,9 +1060,9 @@ bool KeyEvent::IsUnicodeKeyCode() const {
// In that case, EF_EXTENDED will not be set; if it is set, the key event
// originated from the relevant non-numpad dedicated key, e.g. [Insert].
return (!(flags() & EF_IS_EXTENDED_KEY) &&
- (key == VKEY_INSERT || key == VKEY_END || key == VKEY_DOWN ||
- key == VKEY_NEXT || key == VKEY_LEFT || key == VKEY_CLEAR ||
- key == VKEY_RIGHT || key == VKEY_HOME || key == VKEY_UP ||
+ (key == VKEY_INSERT || key == VKEY_END || key == VKEY_DOWN ||
+ key == VKEY_NEXT || key == VKEY_LEFT || key == VKEY_CLEAR ||
+ key == VKEY_RIGHT || key == VKEY_HOME || key == VKEY_UP ||
key == VKEY_PRIOR));
#else
return false;
@@ -1124,18 +1123,16 @@ ScrollEvent::ScrollEvent(const PlatformEvent& native_event)
&y_offset_ordinal_, &finger_count_, &momentum_phase_);
} else if (type() == ET_SCROLL_FLING_START ||
type() == ET_SCROLL_FLING_CANCEL) {
- GetFlingData(native_event,
- &x_offset_, &y_offset_,
- &x_offset_ordinal_, &y_offset_ordinal_,
- NULL);
+ GetFlingData(native_event, &x_offset_, &y_offset_, &x_offset_ordinal_,
+ &y_offset_ordinal_, nullptr);
} else {
NOTREACHED() << "Unexpected event type " << type()
- << " when constructing a ScrollEvent.";
+ << " when constructing a ScrollEvent.";
}
if (IsScrollEvent())
- latency()->set_source_event_type(ui::SourceEventType::WHEEL);
+ latency()->set_source_event_type(SourceEventType::WHEEL);
else
- latency()->set_source_event_type(ui::SourceEventType::TOUCH);
+ latency()->set_source_event_type(SourceEventType::TOUCH);
}
ScrollEvent::ScrollEvent(EventType type,
@@ -1159,7 +1156,7 @@ ScrollEvent::ScrollEvent(EventType type,
momentum_phase_(momentum_phase),
scroll_event_phase_(scroll_event_phase) {
CHECK(IsScrollEvent());
- latency()->set_source_event_type(ui::SourceEventType::WHEEL);
+ latency()->set_source_event_type(SourceEventType::WHEEL);
}
ScrollEvent::ScrollEvent(EventType type,
@@ -1224,11 +1221,11 @@ GestureEvent::GestureEvent(float x,
flags | EF_FROM_TOUCH),
details_(details),
unique_touch_event_id_(unique_touch_event_id) {
- latency()->set_source_event_type(ui::SourceEventType::TOUCH);
+ latency()->set_source_event_type(SourceEventType::TOUCH);
// TODO(crbug.com/868056) Other touchpad gesture should report as TOUCHPAD.
if (IsPinchEvent() &&
- details.device_type() == ui::GestureDeviceType::DEVICE_TOUCHPAD) {
- latency()->set_source_event_type(ui::SourceEventType::TOUCHPAD);
+ details.device_type() == GestureDeviceType::DEVICE_TOUCHPAD) {
+ latency()->set_source_event_type(SourceEventType::TOUCHPAD);
}
}
diff --git a/chromium/ui/events/event.h b/chromium/ui/events/event.h
index 21fbd51da74..d91fcdc5f82 100644
--- a/chromium/ui/events/event.h
+++ b/chromium/ui/events/event.h
@@ -5,8 +5,7 @@
#ifndef UI_EVENTS_EVENT_H_
#define UI_EVENTS_EVENT_H_
-#include <stdint.h>
-
+#include <cstdint>
#include <memory>
#include <string>
#include <vector>
@@ -14,11 +13,9 @@
#include "base/compiler_specific.h"
#include "base/containers/flat_map.h"
#include "base/gtest_prod_util.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/strings/string16.h"
#include "base/time/time.h"
-#include "build/build_config.h"
#include "ui/events/event_constants.h"
#include "ui/events/gesture_event_details.h"
#include "ui/events/gestures/gesture_types.h"
@@ -36,6 +33,7 @@ class Transform;
}
namespace ui {
+
class CancelModeEvent;
class Event;
class EventTarget;
@@ -62,9 +60,7 @@ class EVENTS_EXPORT Event {
public:
explicit DispatcherApi(Event* event) : event_(event) {}
- void set_target(EventTarget* target) {
- event_->target_ = target;
- }
+ void set_target(EventTarget* target) { event_->target_ = target; }
void set_phase(EventPhase phase) { event_->phase_ = phase; }
void set_result(int result) {
@@ -78,6 +74,7 @@ class EVENTS_EXPORT Event {
DISALLOW_COPY_AND_ASSIGN(DispatcherApi);
};
+ void SetNativeEvent(const PlatformEvent& event);
const PlatformEvent& native_event() const { return native_event_; }
EventType type() const { return type_; }
// time_stamp represents time since machine was booted.
@@ -129,9 +126,7 @@ class EVENTS_EXPORT Event {
bool IsSynthesized() const { return (flags_ & EF_IS_SYNTHESIZED) != 0; }
- bool IsCancelModeEvent() const {
- return type_ == ET_CANCEL_MODE;
- }
+ bool IsCancelModeEvent() const { return type_ == ET_CANCEL_MODE; }
bool IsKeyEvent() const {
return type_ == ET_KEY_PRESSED || type_ == ET_KEY_RELEASED;
@@ -194,12 +189,12 @@ class EVENTS_EXPORT Event {
// An ending event is paired with the event which started it. Setting capture
// should not prevent ending events from getting to their initial target.
bool IsEndingEvent() const {
- switch(type_) {
- case ui::ET_TOUCH_CANCELLED:
- case ui::ET_GESTURE_TAP_CANCEL:
- case ui::ET_GESTURE_END:
- case ui::ET_GESTURE_SCROLL_END:
- case ui::ET_GESTURE_PINCH_END:
+ switch (type_) {
+ case ET_TOUCH_CANCELLED:
+ case ET_GESTURE_TAP_CANCEL:
+ case ET_GESTURE_END:
+ case ET_GESTURE_SCROLL_END:
+ case ET_GESTURE_PINCH_END:
return true;
default:
return false;
@@ -209,10 +204,9 @@ class EVENTS_EXPORT Event {
bool IsScrollEvent() const {
// Flings can be GestureEvents too. EF_FROM_TOUCH determines if they're
// Gesture or Scroll events.
- return type_ == ET_SCROLL ||
- ((type_ == ET_SCROLL_FLING_START ||
- type_ == ET_SCROLL_FLING_CANCEL) &&
- !(flags() & EF_FROM_TOUCH));
+ return type_ == ET_SCROLL || ((type_ == ET_SCROLL_FLING_START ||
+ type_ == ET_SCROLL_FLING_CANCEL) &&
+ !(flags() & EF_FROM_TOUCH));
}
bool IsPinchEvent() const {
@@ -222,18 +216,14 @@ class EVENTS_EXPORT Event {
bool IsScrollGestureEvent() const {
return type_ == ET_GESTURE_SCROLL_BEGIN ||
- type_ == ET_GESTURE_SCROLL_UPDATE ||
- type_ == ET_GESTURE_SCROLL_END;
+ type_ == ET_GESTURE_SCROLL_UPDATE || type_ == ET_GESTURE_SCROLL_END;
}
bool IsFlingScrollEvent() const {
- return type_ == ET_SCROLL_FLING_CANCEL ||
- type_ == ET_SCROLL_FLING_START;
+ return type_ == ET_SCROLL_FLING_CANCEL || type_ == ET_SCROLL_FLING_START;
}
- bool IsMouseWheelEvent() const {
- return type_ == ET_MOUSEWHEEL;
- }
+ bool IsMouseWheelEvent() const { return type_ == ET_MOUSEWHEEL; }
bool IsLocatedEvent() const {
return IsMouseEvent() || IsScrollEvent() || IsTouchEvent() ||
@@ -312,9 +302,7 @@ class EVENTS_EXPORT Event {
void SetType(EventType type);
void set_cancelable(bool cancelable) { cancelable_ = cancelable; }
- void set_time_stamp(base::TimeTicks time_stamp) {
- time_stamp_ = time_stamp;
- }
+ void set_time_stamp(base::TimeTicks time_stamp) { time_stamp_ = time_stamp; }
private:
friend class EventTestApi;
@@ -347,7 +335,7 @@ class EVENTS_EXPORT LocatedEvent : public Event {
public:
// Convenience function that casts |event| to a LocatedEvent if it is one,
// otherwise returns null.
- static const ui::LocatedEvent* FromIfValid(const ui::Event* event) {
+ static const LocatedEvent* FromIfValid(const Event* event) {
return event && event->IsLocatedEvent() ? event->AsLocatedEvent() : nullptr;
}
@@ -370,9 +358,7 @@ class EVENTS_EXPORT LocatedEvent : public Event {
gfx::Point root_location() const {
return gfx::ToFlooredPoint(root_location_);
}
- const gfx::PointF& root_location_f() const {
- return root_location_;
- }
+ const gfx::PointF& root_location_f() const { return root_location_; }
// Transform the locations using |inverted_root_transform| and
// |inverted_local_transform|. |inverted_local_transform| is only used if
@@ -528,9 +514,7 @@ class EVENTS_EXPORT MouseEvent : public LocatedEvent {
return (flags() & EF_RIGHT_MOUSE_BUTTON) != 0;
}
- bool IsAnyButton() const {
- return button_flags() != 0;
- }
+ bool IsAnyButton() const { return button_flags() != 0; }
// Returns the flags for the mouse buttons.
int button_flags() const {
@@ -541,9 +525,8 @@ class EVENTS_EXPORT MouseEvent : public LocatedEvent {
// Compares two mouse down events and returns true if the second one should
// be considered a repeat of the first.
- static bool IsRepeatedClickEvent(
- const MouseEvent& event1,
- const MouseEvent& event2);
+ static bool IsRepeatedClickEvent(const MouseEvent& event1,
+ const MouseEvent& event2);
// Get the click count. Can be 1, 2 or 3 for mousedown messages, 0 otherwise.
int GetClickCount() const;
@@ -606,12 +589,9 @@ class EVENTS_EXPORT MouseWheelEvent : public MouseEvent {
~MouseWheelEvent() override;
template <class T>
- MouseWheelEvent(const MouseWheelEvent& model,
- T* source,
- T* target)
+ MouseWheelEvent(const MouseWheelEvent& model, T* source, T* target)
: MouseEvent(model, source, target, model.type(), model.flags()),
- offset_(model.x_offset(), model.y_offset()) {
- }
+ offset_(model.x_offset(), model.y_offset()) {}
// Used for synthetic events in testing and by the gesture recognizer.
MouseWheelEvent(const gfx::Vector2d& offset,
@@ -799,10 +779,7 @@ class EVENTS_EXPORT KeyEvent : public Event {
// Used for synthetic events with code of DOM KeyboardEvent (e.g. 'KeyA')
// See also: ui/events/keycodes/dom/dom_values.txt
- KeyEvent(EventType type,
- KeyboardCode key_code,
- DomCode code,
- int flags);
+ KeyEvent(EventType type, KeyboardCode key_code, DomCode code, int flags);
KeyEvent(const KeyEvent& rhs);
@@ -1017,8 +994,8 @@ class EVENTS_EXPORT ScrollEvent : public MouseEvent {
class EVENTS_EXPORT GestureEvent : public LocatedEvent {
public:
- // The constructor takes a default unique_touch_id of zero to support many
- // (80+) existing tests that doesn't care about this id.
+ // The constructor takes a default unique_touch_id of zero to support many
+ // (80+) existing tests that doesn't care about this id.
GestureEvent(float x,
float y,
int flags,
@@ -1031,17 +1008,13 @@ class EVENTS_EXPORT GestureEvent : public LocatedEvent {
// converted from |source| coordinate system to |target| coordinate system.
template <typename T>
GestureEvent(const GestureEvent& model, T* source, T* target)
- : LocatedEvent(model, source, target),
- details_(model.details_) {
- }
+ : LocatedEvent(model, source, target), details_(model.details_) {}
GestureEvent(const GestureEvent& copy);
~GestureEvent() override;
const GestureEventDetails& details() const { return details_; }
- uint32_t unique_touch_event_id() const {
- return unique_touch_event_id_;
- }
+ uint32_t unique_touch_event_id() const { return unique_touch_event_id_; }
private:
GestureEventDetails details_;
diff --git a/chromium/ui/events/event_dispatcher.cc b/chromium/ui/events/event_dispatcher.cc
index f3b451ef69c..95268c39884 100644
--- a/chromium/ui/events/event_dispatcher.cc
+++ b/chromium/ui/events/event_dispatcher.cc
@@ -31,9 +31,7 @@ class ScopedDispatchHelper : public Event::DispatcherApi {
} // namespace
-EventDispatcherDelegate::EventDispatcherDelegate()
- : dispatcher_(NULL) {
-}
+EventDispatcherDelegate::EventDispatcherDelegate() : dispatcher_(nullptr) {}
EventDispatcherDelegate::~EventDispatcherDelegate() {
if (dispatcher_)
diff --git a/chromium/ui/events/event_dispatcher_unittest.cc b/chromium/ui/events/event_dispatcher_unittest.cc
index 6b67cb30e5c..37dc1cc3f7f 100644
--- a/chromium/ui/events/event_dispatcher_unittest.cc
+++ b/chromium/ui/events/event_dispatcher_unittest.cc
@@ -21,9 +21,7 @@ namespace {
class TestTarget : public EventTarget,
public EventHandler {
public:
- TestTarget() : parent_(NULL), valid_(true) {
- SetTargetHandler(this);
- }
+ TestTarget() : parent_(nullptr), valid_(true) { SetTargetHandler(this); }
~TestTarget() override {}
void set_parent(TestTarget* parent) { parent_ = parent; }
@@ -52,7 +50,7 @@ class TestTarget : public EventTarget,
return nullptr;
}
- EventTargeter* GetEventTargeter() override { return NULL; }
+ EventTargeter* GetEventTargeter() override { return nullptr; }
TestTarget* parent_;
std::vector<int> handler_list_;
@@ -163,8 +161,7 @@ class EventHandlerDestroyer : public TestEventHandler {
EventHandlerDestroyer(int id, EventHandler* destroy)
: TestEventHandler(id),
to_destroy_(destroy),
- dispatcher_delegate_(NULL) {
- }
+ dispatcher_delegate_(nullptr) {}
~EventHandlerDestroyer() override { CHECK(!to_destroy_); }
@@ -176,11 +173,11 @@ class EventHandlerDestroyer : public TestEventHandler {
void ReceivedEvent(Event* event) override {
TestEventHandler::ReceivedEvent(event);
delete to_destroy_;
- to_destroy_ = NULL;
+ to_destroy_ = nullptr;
if (dispatcher_delegate_) {
delete dispatcher_delegate_;
- dispatcher_delegate_ = NULL;
+ dispatcher_delegate_ = nullptr;
}
}
diff --git a/chromium/ui/events/event_rewriter_unittest.cc b/chromium/ui/events/event_rewriter_unittest.cc
index 3a5f088b81a..328cde5a30e 100644
--- a/chromium/ui/events/event_rewriter_unittest.cc
+++ b/chromium/ui/events/event_rewriter_unittest.cc
@@ -111,7 +111,8 @@ class TestConstantEventRewriterOld : public EventRewriter {
// EVENT_REWRITE_DISPATCH_ANOTHER.
class TestStateMachineEventRewriterOld : public EventRewriter {
public:
- TestStateMachineEventRewriterOld() : last_rewritten_event_(0), state_(0) {}
+ TestStateMachineEventRewriterOld()
+ : last_rewritten_event_(nullptr), state_(0) {}
void AddRule(int from_state,
EventType from_type,
int to_state,
diff --git a/chromium/ui/events/event_unittest.cc b/chromium/ui/events/event_unittest.cc
index f13f74a1944..c8dc4af45f0 100644
--- a/chromium/ui/events/event_unittest.cc
+++ b/chromium/ui/events/event_unittest.cc
@@ -21,13 +21,14 @@
#include "ui/events/test/events_test_utils.h"
#include "ui/events/test/keyboard_layout.h"
#include "ui/events/test/test_event_target.h"
-#include "ui/events/x/x11_event_translation.h"
#include "ui/gfx/transform.h"
#if defined(USE_X11)
#include "ui/events/test/events_test_utils_x11.h"
-#include "ui/gfx/x/x11.h" // nogncheck
-#include "ui/gfx/x/x11_types.h" // nogncheck
+#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 {
@@ -39,7 +40,7 @@ TEST(EventTest, NoNativeEvent) {
TEST(EventTest, NativeEvent) {
#if defined(OS_WIN)
- MSG native_event = { NULL, WM_KEYUP, VKEY_A, 0 };
+ MSG native_event = {nullptr, WM_KEYUP, VKEY_A, 0};
KeyEvent keyev(native_event);
EXPECT_TRUE(keyev.HasNativeEvent());
#elif defined(USE_X11)
@@ -84,7 +85,7 @@ TEST(EventTest, GetCharacter) {
TEST(EventTest, ClickCount) {
const gfx::Point origin(0, 0);
MouseEvent mouseev(ET_MOUSE_PRESSED, origin, origin, EventTimeForNow(), 0, 0);
- for (int i = 1; i <=3 ; ++i) {
+ for (int i = 1; i <= 3; ++i) {
mouseev.SetClickCount(i);
EXPECT_EQ(i, mouseev.GetClickCount());
}
@@ -97,7 +98,7 @@ TEST(EventTest, RepeatedClick) {
LocatedEventTestApi test_event1(&event1);
LocatedEventTestApi test_event2(&event2);
- base::TimeTicks start = base::TimeTicks();
+ base::TimeTicks start = base::TimeTicks::Now();
base::TimeTicks soon = start + base::TimeDelta::FromMilliseconds(1);
base::TimeTicks later = start + base::TimeDelta::FromMilliseconds(1000);
@@ -136,7 +137,7 @@ TEST(EventTest, RepeatedClick) {
// does not yield a double click event: http://crbug.com/389162
TEST(EventTest, DoubleClickRequiresUniqueTimestamp) {
const gfx::Point point(0, 0);
- base::TimeTicks time1 = base::TimeTicks();
+ base::TimeTicks time1 = base::TimeTicks::Now();
base::TimeTicks time2 = time1 + base::TimeDelta::FromMilliseconds(1);
// Re-processing the same press doesn't yield a double-click.
@@ -177,7 +178,7 @@ TEST(EventTest, DoubleClickRequiresUniqueTimestamp) {
// Tests that right clicking, then left clicking does not yield double clicks.
TEST(EventTest, SingleClickRightLeft) {
const gfx::Point point(0, 0);
- base::TimeTicks time1 = base::TimeTicks();
+ base::TimeTicks time1 = base::TimeTicks::Now();
base::TimeTicks time2 = time1 + base::TimeDelta::FromMilliseconds(1);
base::TimeTicks time3 = time1 + base::TimeDelta::FromMilliseconds(2);
@@ -204,80 +205,78 @@ TEST(EventTest, KeyEvent) {
int flags;
uint16_t character;
} kTestData[] = {
- { VKEY_A, 0, 'a' },
- { VKEY_A, EF_SHIFT_DOWN, 'A' },
- { VKEY_A, EF_CAPS_LOCK_ON, 'A' },
- { VKEY_A, EF_SHIFT_DOWN | EF_CAPS_LOCK_ON, 'a' },
- { VKEY_A, EF_CONTROL_DOWN, 0x01 },
- { VKEY_A, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x01' },
- { VKEY_Z, 0, 'z' },
- { VKEY_Z, EF_SHIFT_DOWN, 'Z' },
- { VKEY_Z, EF_CAPS_LOCK_ON, 'Z' },
- { VKEY_Z, EF_SHIFT_DOWN | EF_CAPS_LOCK_ON, 'z' },
- { VKEY_Z, EF_CONTROL_DOWN, '\x1A' },
- { VKEY_Z, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x1A' },
-
- { VKEY_2, EF_CONTROL_DOWN, '\x12' },
- { VKEY_2, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\0' },
- { VKEY_6, EF_CONTROL_DOWN, '\x16' },
- { VKEY_6, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x1E' },
- { VKEY_OEM_MINUS, EF_CONTROL_DOWN, '\x0D' },
- { VKEY_OEM_MINUS, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x1F' },
- { VKEY_OEM_4, EF_CONTROL_DOWN, '\x1B' },
- { VKEY_OEM_4, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x1B' },
- { VKEY_OEM_5, EF_CONTROL_DOWN, '\x1C' },
- { VKEY_OEM_5, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x1C' },
- { VKEY_OEM_6, EF_CONTROL_DOWN, '\x1D' },
- { VKEY_OEM_6, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x1D' },
- { VKEY_RETURN, EF_CONTROL_DOWN, '\x0A' },
-
- { VKEY_0, 0, '0' },
- { VKEY_0, EF_SHIFT_DOWN, ')' },
- { VKEY_0, EF_SHIFT_DOWN | EF_CAPS_LOCK_ON, ')' },
- { VKEY_0, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x09' },
-
- { VKEY_9, 0, '9' },
- { VKEY_9, EF_SHIFT_DOWN, '(' },
- { VKEY_9, EF_SHIFT_DOWN | EF_CAPS_LOCK_ON, '(' },
- { VKEY_9, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x08' },
-
- { VKEY_NUMPAD0, EF_CONTROL_DOWN, '\x10' },
- { VKEY_NUMPAD0, EF_SHIFT_DOWN, '0' },
-
- { VKEY_NUMPAD9, EF_CONTROL_DOWN, '\x19' },
- { VKEY_NUMPAD9, EF_SHIFT_DOWN, '9' },
-
- { VKEY_TAB, EF_NONE, '\t' },
- { VKEY_TAB, EF_CONTROL_DOWN, '\t' },
- { VKEY_TAB, EF_SHIFT_DOWN, '\t' },
-
- { VKEY_MULTIPLY, EF_CONTROL_DOWN, '\x0A' },
- { VKEY_MULTIPLY, EF_SHIFT_DOWN, '*' },
- { VKEY_ADD, EF_CONTROL_DOWN, '\x0B' },
- { VKEY_ADD, EF_SHIFT_DOWN, '+' },
- { VKEY_SUBTRACT, EF_CONTROL_DOWN, '\x0D' },
- { VKEY_SUBTRACT, EF_SHIFT_DOWN, '-' },
- { VKEY_DECIMAL, EF_CONTROL_DOWN, '\x0E' },
- { VKEY_DECIMAL, EF_SHIFT_DOWN, '.' },
- { VKEY_DIVIDE, EF_CONTROL_DOWN, '\x0F' },
- { VKEY_DIVIDE, EF_SHIFT_DOWN, '/' },
-
- { VKEY_OEM_1, EF_CONTROL_DOWN, '\x1B' },
- { VKEY_OEM_1, EF_SHIFT_DOWN, ':' },
- { VKEY_OEM_PLUS, EF_CONTROL_DOWN, '\x1D' },
- { VKEY_OEM_PLUS, EF_SHIFT_DOWN, '+' },
- { VKEY_OEM_COMMA, EF_CONTROL_DOWN, '\x0C' },
- { VKEY_OEM_COMMA, EF_SHIFT_DOWN, '<' },
- { VKEY_OEM_PERIOD, EF_CONTROL_DOWN, '\x0E' },
- { VKEY_OEM_PERIOD, EF_SHIFT_DOWN, '>' },
- { VKEY_OEM_3, EF_CONTROL_DOWN, '\x0' },
- { VKEY_OEM_3, EF_SHIFT_DOWN, '~' },
+ {VKEY_A, 0, 'a'},
+ {VKEY_A, EF_SHIFT_DOWN, 'A'},
+ {VKEY_A, EF_CAPS_LOCK_ON, 'A'},
+ {VKEY_A, EF_SHIFT_DOWN | EF_CAPS_LOCK_ON, 'a'},
+ {VKEY_A, EF_CONTROL_DOWN, 0x01},
+ {VKEY_A, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x01'},
+ {VKEY_Z, 0, 'z'},
+ {VKEY_Z, EF_SHIFT_DOWN, 'Z'},
+ {VKEY_Z, EF_CAPS_LOCK_ON, 'Z'},
+ {VKEY_Z, EF_SHIFT_DOWN | EF_CAPS_LOCK_ON, 'z'},
+ {VKEY_Z, EF_CONTROL_DOWN, '\x1A'},
+ {VKEY_Z, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x1A'},
+
+ {VKEY_2, EF_CONTROL_DOWN, '\x12'},
+ {VKEY_2, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\0'},
+ {VKEY_6, EF_CONTROL_DOWN, '\x16'},
+ {VKEY_6, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x1E'},
+ {VKEY_OEM_MINUS, EF_CONTROL_DOWN, '\x0D'},
+ {VKEY_OEM_MINUS, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x1F'},
+ {VKEY_OEM_4, EF_CONTROL_DOWN, '\x1B'},
+ {VKEY_OEM_4, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x1B'},
+ {VKEY_OEM_5, EF_CONTROL_DOWN, '\x1C'},
+ {VKEY_OEM_5, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x1C'},
+ {VKEY_OEM_6, EF_CONTROL_DOWN, '\x1D'},
+ {VKEY_OEM_6, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x1D'},
+ {VKEY_RETURN, EF_CONTROL_DOWN, '\x0A'},
+
+ {VKEY_0, 0, '0'},
+ {VKEY_0, EF_SHIFT_DOWN, ')'},
+ {VKEY_0, EF_SHIFT_DOWN | EF_CAPS_LOCK_ON, ')'},
+ {VKEY_0, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x09'},
+
+ {VKEY_9, 0, '9'},
+ {VKEY_9, EF_SHIFT_DOWN, '('},
+ {VKEY_9, EF_SHIFT_DOWN | EF_CAPS_LOCK_ON, '('},
+ {VKEY_9, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x08'},
+
+ {VKEY_NUMPAD0, EF_CONTROL_DOWN, '\x10'},
+ {VKEY_NUMPAD0, EF_SHIFT_DOWN, '0'},
+
+ {VKEY_NUMPAD9, EF_CONTROL_DOWN, '\x19'},
+ {VKEY_NUMPAD9, EF_SHIFT_DOWN, '9'},
+
+ {VKEY_TAB, EF_NONE, '\t'},
+ {VKEY_TAB, EF_CONTROL_DOWN, '\t'},
+ {VKEY_TAB, EF_SHIFT_DOWN, '\t'},
+
+ {VKEY_MULTIPLY, EF_CONTROL_DOWN, '\x0A'},
+ {VKEY_MULTIPLY, EF_SHIFT_DOWN, '*'},
+ {VKEY_ADD, EF_CONTROL_DOWN, '\x0B'},
+ {VKEY_ADD, EF_SHIFT_DOWN, '+'},
+ {VKEY_SUBTRACT, EF_CONTROL_DOWN, '\x0D'},
+ {VKEY_SUBTRACT, EF_SHIFT_DOWN, '-'},
+ {VKEY_DECIMAL, EF_CONTROL_DOWN, '\x0E'},
+ {VKEY_DECIMAL, EF_SHIFT_DOWN, '.'},
+ {VKEY_DIVIDE, EF_CONTROL_DOWN, '\x0F'},
+ {VKEY_DIVIDE, EF_SHIFT_DOWN, '/'},
+
+ {VKEY_OEM_1, EF_CONTROL_DOWN, '\x1B'},
+ {VKEY_OEM_1, EF_SHIFT_DOWN, ':'},
+ {VKEY_OEM_PLUS, EF_CONTROL_DOWN, '\x1D'},
+ {VKEY_OEM_PLUS, EF_SHIFT_DOWN, '+'},
+ {VKEY_OEM_COMMA, EF_CONTROL_DOWN, '\x0C'},
+ {VKEY_OEM_COMMA, EF_SHIFT_DOWN, '<'},
+ {VKEY_OEM_PERIOD, EF_CONTROL_DOWN, '\x0E'},
+ {VKEY_OEM_PERIOD, EF_SHIFT_DOWN, '>'},
+ {VKEY_OEM_3, EF_CONTROL_DOWN, '\x0'},
+ {VKEY_OEM_3, EF_SHIFT_DOWN, '~'},
};
for (size_t i = 0; i < base::size(kTestData); ++i) {
- KeyEvent key(ET_KEY_PRESSED,
- kTestData[i].key_code,
- kTestData[i].flags);
+ KeyEvent key(ET_KEY_PRESSED, kTestData[i].key_code, kTestData[i].flags);
EXPECT_EQ(kTestData[i].character, key.GetCharacter())
<< " Index:" << i << " key_code:" << kTestData[i].key_code;
}
@@ -315,7 +314,7 @@ TEST(EventTest, NormalizeKeyEventFlags) {
EXPECT_EQ(EF_NONE, keyev->flags());
}
{
- event.InitKeyEvent(ET_KEY_PRESSED, VKEY_MENU, EF_ALT_DOWN);
+ event.InitKeyEvent(ET_KEY_PRESSED, VKEY_MENU, EF_ALT_DOWN);
auto keyev = ui::BuildKeyEventFromXEvent(*event);
EXPECT_EQ(EF_ALT_DOWN, keyev->flags());
}
@@ -349,7 +348,7 @@ TEST(EventTest, NormalizeKeyEventFlags) {
EXPECT_EQ(EF_NONE, keyev.flags());
}
{
- KeyEvent keyev(ET_KEY_PRESSED, VKEY_MENU, EF_ALT_DOWN);
+ KeyEvent keyev(ET_KEY_PRESSED, VKEY_MENU, EF_ALT_DOWN);
EXPECT_EQ(EF_ALT_DOWN, keyev.flags());
}
{
@@ -409,21 +408,21 @@ TEST(EventTest, KeyEventCode) {
ASSERT_EQ((kNativeCodeSpace & 0xFF), kNativeCodeSpace);
const LPARAM lParam = GetLParamFromScanCode(kNativeCodeSpace);
- MSG native_event = { NULL, WM_KEYUP, VKEY_SPACE, lParam };
+ MSG native_event = {nullptr, WM_KEYUP, VKEY_SPACE, lParam};
KeyEvent key(native_event);
// KeyEvent converts from the native keycode (scan code) to the code.
EXPECT_EQ(kCodeForSpace, key.GetCodeString());
}
{
- const char kCodeForHome[] = "Home";
+ const char kCodeForHome[] = "Home";
const uint16_t kNativeCodeHome = 0xe047;
// 'Home' is an extended key with 0xe000 bits.
ASSERT_NE((kNativeCodeHome & 0xFF), kNativeCodeHome);
const LPARAM lParam = GetLParamFromScanCode(kNativeCodeHome);
- MSG native_event = { NULL, WM_KEYUP, VKEY_HOME, lParam };
+ MSG native_event = {nullptr, WM_KEYUP, VKEY_HOME, lParam};
KeyEvent key(native_event);
// KeyEvent converts from the native keycode (scan code) to the code.
@@ -435,12 +434,16 @@ TEST(EventTest, KeyEventCode) {
#if defined(USE_X11)
namespace {
-void SetKeyEventTimestamp(XEvent* event, int64_t time) {
- event->xkey.time = time & UINT32_MAX;
+void SetKeyEventTimestamp(x11::Event* event, int64_t time64) {
+ uint32_t time = time64 & UINT32_MAX;
+ event->xlib_event().xkey.time = time;
+ event->As<x11::KeyEvent>()->time = static_cast<x11::Time>(time);
}
-void AdvanceKeyEventTimestamp(XEvent* event) {
- event->xkey.time++;
+void AdvanceKeyEventTimestamp(x11::Event* event) {
+ uint32_t time = event->xlib_event().xkey.time + 1;
+ event->xlib_event().xkey.time = time;
+ event->As<x11::KeyEvent>()->time = static_cast<x11::Time>(time);
}
} // namespace
@@ -454,22 +457,26 @@ TEST(EventTest, AutoRepeat) {
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);
+ 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);
+ 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);
+ native_event_a_pressed_nonstandard_state.InitKeyEvent(ET_KEY_PRESSED, VKEY_A,
+ kNativeCodeA);
// IBUS-GTK uses the mask (1 << 25) to detect reposted event.
- static_cast<XEvent*>(native_event_a_pressed_nonstandard_state)->xkey.state |=
- 1 << 25;
+ {
+ x11::Event& event = *native_event_a_pressed_nonstandard_state;
+ int mask = event.xlib_event().xkey.state | 1 << 25;
+ event.xlib_event().xkey.state = mask;
+ event.As<x11::KeyEvent>()->state = static_cast<x11::KeyButMask>(mask);
+ }
int64_t ticks_base =
(base::TimeTicks::Now() - base::TimeTicks()).InMilliseconds() - 5000;
@@ -555,7 +562,7 @@ TEST(EventTest, AutoRepeat) {
#endif // USE_X11
TEST(EventTest, TouchEventRadiusDefaultsToOtherAxis) {
- const base::TimeTicks time = base::TimeTicks();
+ const base::TimeTicks time = base::TimeTicks::Now();
const float non_zero_length1 = 30;
const float non_zero_length2 = 46;
@@ -579,7 +586,7 @@ TEST(EventTest, TouchEventRadiusDefaultsToOtherAxis) {
}
TEST(EventTest, TouchEventRotationAngleFixing) {
- const base::TimeTicks time = base::TimeTicks();
+ const base::TimeTicks time = base::TimeTicks::Now();
const float radius_x = 20;
const float radius_y = 10;
@@ -805,7 +812,7 @@ TEST(EventTest, EventLatencyOSTouchHistograms) {
TEST(EventTest, EventLatencyOSMouseWheelHistogram) {
#if defined(OS_WIN)
base::HistogramTester histogram_tester;
- MSG event = { nullptr, WM_MOUSEWHEEL, 0, 0 };
+ MSG event = {nullptr, WM_MOUSEWHEEL, 0, 0};
MouseWheelEvent mouseWheelEvent(event);
histogram_tester.ExpectTotalCount("Event.Latency.OS.MOUSE_WHEEL", 1);
#elif defined(USE_X11)
@@ -813,11 +820,12 @@ TEST(EventTest, EventLatencyOSMouseWheelHistogram) {
DeviceDataManagerX11::CreateInstance();
// Initializes a native event and uses it to generate a MouseWheel event.
- XEvent native_event;
- memset(&native_event, 0, sizeof(XEvent));
- XButtonEvent* button_event = &(native_event.xbutton);
- button_event->type = ButtonPress;
- button_event->button = 4; // A valid wheel button number between min and max.
+ 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
diff --git a/chromium/ui/events/fuchsia/input_event_dispatcher.cc b/chromium/ui/events/fuchsia/input_event_dispatcher.cc
index a0450ee04e2..f557679808b 100644
--- a/chromium/ui/events/fuchsia/input_event_dispatcher.cc
+++ b/chromium/ui/events/fuchsia/input_event_dispatcher.cc
@@ -6,7 +6,9 @@
#include <memory>
+#include "base/logging.h"
#include "base/memory/ptr_util.h"
+#include "base/notreached.h"
#include "ui/events/event.h"
#include "ui/events/fuchsia/input_event_dispatcher_delegate.h"
#include "ui/events/keycodes/dom/keycode_converter.h"
diff --git a/chromium/ui/events/gesture_detection/bitset_32.h b/chromium/ui/events/gesture_detection/bitset_32.h
index 903f1118bb9..b365617d48f 100644
--- a/chromium/ui/events/gesture_detection/bitset_32.h
+++ b/chromium/ui/events/gesture_detection/bitset_32.h
@@ -7,7 +7,7 @@
#include <stdint.h>
-#include "base/logging.h"
+#include "base/check_op.h"
namespace ui {
diff --git a/chromium/ui/events/gesture_detection/gesture_configuration.cc b/chromium/ui/events/gesture_detection/gesture_configuration.cc
index 42e2619bafe..70e15714e9d 100644
--- a/chromium/ui/events/gesture_detection/gesture_configuration.cc
+++ b/chromium/ui/events/gesture_detection/gesture_configuration.cc
@@ -13,11 +13,6 @@ GestureConfiguration* instance = nullptr;
} // namespace
// static
-void GestureConfiguration::SetInstance(GestureConfiguration* config) {
- instance = config;
-}
-
-// static
GestureConfiguration* GestureConfiguration::GetInstance() {
if (instance)
return instance;
diff --git a/chromium/ui/events/gesture_detection/gesture_configuration.h b/chromium/ui/events/gesture_detection/gesture_configuration.h
index 88e0515170d..71713612ec6 100644
--- a/chromium/ui/events/gesture_detection/gesture_configuration.h
+++ b/chromium/ui/events/gesture_detection/gesture_configuration.h
@@ -13,8 +13,6 @@ namespace ui {
class GESTURE_DETECTION_EXPORT GestureConfiguration {
public:
- // Sets the shared instance. This does not take ownership of |config|.
- static void SetInstance(GestureConfiguration* config);
// Returns the singleton GestureConfiguration.
static GestureConfiguration* GetInstance();
diff --git a/chromium/ui/events/gesture_detection/gesture_configuration_aura.cc b/chromium/ui/events/gesture_detection/gesture_configuration_aura.cc
index 24717a4b173..e973ea88dfb 100644
--- a/chromium/ui/events/gesture_detection/gesture_configuration_aura.cc
+++ b/chromium/ui/events/gesture_detection/gesture_configuration_aura.cc
@@ -29,6 +29,12 @@ class GestureConfigurationAura : public GestureConfiguration {
private:
GestureConfigurationAura() : GestureConfiguration() {
+#if defined(OS_CHROMEOS)
+ // On ChromeOS, use 6 which is derived from the android's default(8),
+ // multiplied by base dpi ratio(0.75). See crbug.com/1083120 for more
+ // details.
+ set_max_touch_move_in_pixels_for_click(6);
+#endif
set_double_tap_enabled(kDoubleTapAuraSupport);
set_double_tap_timeout_in_ms(semi_long_press_time_in_ms());
set_gesture_begin_end_types_enabled(true);
diff --git a/chromium/ui/events/gesture_detection/gesture_detector.cc b/chromium/ui/events/gesture_detection/gesture_detector.cc
index 5ee0e7c894d..f44ea90523f 100644
--- a/chromium/ui/events/gesture_detection/gesture_detector.cc
+++ b/chromium/ui/events/gesture_detection/gesture_detector.cc
@@ -57,6 +57,11 @@ GestureDetector::Config::Config()
#else
stylus_button_accelerated_longpress_enabled(false),
#endif
+#if defined(OS_ANDROID)
+ deep_press_accelerated_longpress_enabled(true),
+#else
+ deep_press_accelerated_longpress_enabled(false),
+#endif
velocity_tracker_strategy(VelocityTracker::Strategy::STRATEGY_DEFAULT) {
}
@@ -142,6 +147,7 @@ GestureDetector::GestureDetector(
down_focus_x_(0),
down_focus_y_(0),
stylus_button_accelerated_longpress_enabled_(false),
+ deep_press_accelerated_longpress_enabled_(false),
longpress_enabled_(true),
showpress_enabled_(true),
swipe_enabled_(false),
@@ -340,9 +346,27 @@ bool GestureDetector::OnTouchEvent(const MotionEvent& ev,
last_focus_y_ = focus_y;
}
- if (stylus_button_accelerated_longpress_enabled_ &&
- (ev.GetFlags() & ui::EF_LEFT_MOUSE_BUTTON)) {
- OnStylusButtonPress(ev);
+ // Try to activate long press gesture early.
+ if (ev.GetPointerCount() == 1 &&
+ timeout_handler_->HasTimeout(LONG_PRESS)) {
+ if (ev.GetToolType(0) == MotionEvent::ToolType::STYLUS &&
+ stylus_button_accelerated_longpress_enabled_ &&
+ (ev.GetFlags() & ui::EF_LEFT_MOUSE_BUTTON)) {
+ // This will generate a ET_GESTURE_LONG_PRESS event with
+ // EF_LEFT_MOUSE_BUTTON, which is consumed by MetalayerMode if that
+ // feature is enabled, because MetalayerMode is also activated by a
+ // stylus button press and has precedence over this press acceleration
+ // feature.
+ ActivateLongPressGesture(ev);
+ } else if (ev.GetToolType(0) == MotionEvent::ToolType::FINGER &&
+ deep_press_accelerated_longpress_enabled_ &&
+ ev.GetClassification() ==
+ MotionEvent::Classification::DEEP_PRESS) {
+ // This uses the current_down_event_ to generate the long press
+ // gesture which keeps the original coordinates in case the current
+ // move event has a different coordinate.
+ OnLongPressTimeout();
+ }
}
if (!two_finger_tap_allowed_for_gesture_)
@@ -376,7 +400,7 @@ bool GestureDetector::OnTouchEvent(const MotionEvent& ev,
handled = listener_->OnSingleTapUp(
ev, 1 + current_single_tap_repeat_count_);
if (defer_confirm_single_tap_ && should_process_double_tap &&
- double_tap_listener_ != NULL) {
+ double_tap_listener_) {
double_tap_listener_->OnSingleTapConfirmed(ev);
}
} else if (!all_pointers_within_slop_regions_) {
@@ -472,6 +496,8 @@ void GestureDetector::Init(const Config& config) {
single_tap_repeat_interval_ = config.single_tap_repeat_interval;
stylus_button_accelerated_longpress_enabled_ =
config.stylus_button_accelerated_longpress_enabled;
+ deep_press_accelerated_longpress_enabled_ =
+ config.deep_press_accelerated_longpress_enabled;
}
void GestureDetector::OnShowPressTimeout() {
@@ -479,9 +505,7 @@ void GestureDetector::OnShowPressTimeout() {
}
void GestureDetector::OnLongPressTimeout() {
- timeout_handler_->StopTimeout(TAP);
- defer_confirm_single_tap_ = false;
- listener_->OnLongPress(*current_down_event_);
+ ActivateLongPressGesture(*current_down_event_);
}
void GestureDetector::OnTapTimeout() {
@@ -495,17 +519,9 @@ void GestureDetector::OnTapTimeout() {
}
}
-void GestureDetector::OnStylusButtonPress(const MotionEvent& ev) {
- if (!timeout_handler_->HasTimeout(LONG_PRESS))
- return;
- timeout_handler_->StopTimeout(TAP);
- timeout_handler_->StopTimeout(SHOW_PRESS);
- timeout_handler_->StopTimeout(LONG_PRESS);
+void GestureDetector::ActivateLongPressGesture(const MotionEvent& ev) {
+ timeout_handler_->Stop();
defer_confirm_single_tap_ = false;
- // This will generate a ET_GESTURE_LONG_PRESS event with EF_LEFT_MOUSE_BUTTON,
- // which is consumed by MetalayerMode if that feature is enabled, because
- // MetalayerMode is also activated by a stylus button press and has precedence
- // over this press acceleration feature.
listener_->OnLongPress(ev);
}
diff --git a/chromium/ui/events/gesture_detection/gesture_detector.h b/chromium/ui/events/gesture_detection/gesture_detector.h
index e525277bdd3..7bbfff41084 100644
--- a/chromium/ui/events/gesture_detection/gesture_detector.h
+++ b/chromium/ui/events/gesture_detection/gesture_detector.h
@@ -7,7 +7,6 @@
#include <memory>
-#include "base/logging.h"
#include "base/macros.h"
#include "ui/events/gesture_detection/gesture_detection_export.h"
#include "ui/events/gesture_detection/velocity_tracker_state.h"
@@ -81,6 +80,10 @@ class GESTURE_DETECTION_EXPORT GestureDetector {
// is pressed, given that the longpress timeout is still active.
bool stylus_button_accelerated_longpress_enabled;
+ // Whether a longpress should be generated immediately when a pointer is
+ // deep-pressing, given that the longpress timeout is still active.
+ bool deep_press_accelerated_longpress_enabled;
+
VelocityTracker::Strategy velocity_tracker_strategy;
};
@@ -96,7 +99,7 @@ class GESTURE_DETECTION_EXPORT GestureDetector {
// Note: The listener must never be changed while |is_double_tapping| is true.
void SetDoubleTapListener(DoubleTapListener* double_tap_listener);
- bool has_doubletap_listener() const { return double_tap_listener_ != NULL; }
+ bool has_doubletap_listener() const { return !!double_tap_listener_; }
bool is_double_tapping() const { return is_double_tapping_; }
@@ -116,7 +119,7 @@ class GESTURE_DETECTION_EXPORT GestureDetector {
void OnShowPressTimeout();
void OnLongPressTimeout();
void OnTapTimeout();
- void OnStylusButtonPress(const MotionEvent& ev);
+ void ActivateLongPressGesture(const MotionEvent& ev);
void Cancel();
void CancelTaps();
bool IsRepeatedTap(const MotionEvent& first_down,
@@ -178,6 +181,7 @@ class GESTURE_DETECTION_EXPORT GestureDetector {
float down_focus_y_;
bool stylus_button_accelerated_longpress_enabled_;
+ bool deep_press_accelerated_longpress_enabled_;
bool longpress_enabled_;
bool showpress_enabled_;
bool swipe_enabled_;
diff --git a/chromium/ui/events/gesture_detection/gesture_provider_unittest.cc b/chromium/ui/events/gesture_detection/gesture_provider_unittest.cc
index bbeb855a2f3..6beca1fbe08 100644
--- a/chromium/ui/events/gesture_detection/gesture_provider_unittest.cc
+++ b/chromium/ui/events/gesture_detection/gesture_provider_unittest.cc
@@ -305,6 +305,13 @@ class GestureProviderTest : public testing::Test, public GestureProviderClient {
SetUpWithConfig(config);
}
+ void SetDeepPressAcceleratedLongPress(bool enabled) {
+ GestureProvider::Config config = GetDefaultConfig();
+ config.gesture_detector_config.deep_press_accelerated_longpress_enabled =
+ enabled;
+ SetUpWithConfig(config);
+ }
+
bool HasDownEvent() const { return gesture_provider_->current_down_event(); }
protected:
@@ -1256,16 +1263,35 @@ TEST_F(GestureProviderTest, GestureLongPressDoesNotPreventScrolling) {
EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_LONG_TAP));
}
+TEST_F(GestureProviderTest, DeepPressAcceleratedLongPress) {
+ SetDeepPressAcceleratedLongPress(true);
+ base::TimeTicks event_time = base::TimeTicks::Now();
+
+ MockMotionEvent event =
+ ObtainMotionEvent(event_time, MotionEvent::Action::DOWN);
+ event.SetToolType(0, MotionEvent::ToolType::FINGER);
+ EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
+
+ event = ObtainMotionEvent(event_time + kOneMicrosecond,
+ MotionEvent::Action::MOVE);
+ event.SetToolType(0, MotionEvent::ToolType::FINGER);
+ event.SetClassification(MotionEvent::Classification::DEEP_PRESS);
+ EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
+ EXPECT_EQ(ET_GESTURE_LONG_PRESS, GetMostRecentGestureEventType());
+}
+
TEST_F(GestureProviderTest, StylusButtonCausesLongPress) {
SetStylusButtonAcceleratedLongPress(true);
base::TimeTicks event_time = base::TimeTicks::Now();
MockMotionEvent event =
ObtainMotionEvent(event_time, MotionEvent::Action::DOWN);
+ event.SetToolType(0, MotionEvent::ToolType::STYLUS);
EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
event = ObtainMotionEvent(event_time + kOneMicrosecond,
MotionEvent::Action::MOVE);
+ event.SetToolType(0, MotionEvent::ToolType::STYLUS);
event.set_flags(EF_LEFT_MOUSE_BUTTON);
EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
EXPECT_EQ(ET_GESTURE_LONG_PRESS, GetMostRecentGestureEventType());
@@ -1277,10 +1303,12 @@ TEST_F(GestureProviderTest, DisabledStylusButtonDoesNotCauseLongPress) {
MockMotionEvent event =
ObtainMotionEvent(event_time, MotionEvent::Action::DOWN);
+ event.SetToolType(0, MotionEvent::ToolType::STYLUS);
EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
event = ObtainMotionEvent(event_time + kOneMicrosecond,
MotionEvent::Action::MOVE);
+ event.SetToolType(0, MotionEvent::ToolType::STYLUS);
event.set_flags(EF_LEFT_MOUSE_BUTTON);
EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
EXPECT_NE(ET_GESTURE_LONG_PRESS, GetMostRecentGestureEventType());
diff --git a/chromium/ui/events/gesture_detection/motion_event.cc b/chromium/ui/events/gesture_detection/motion_event.cc
index 2d75ceacb1f..c16b82d7ca6 100644
--- a/chromium/ui/events/gesture_detection/motion_event.cc
+++ b/chromium/ui/events/gesture_detection/motion_event.cc
@@ -37,6 +37,11 @@ float MotionEvent::GetHistoricalY(size_t pointer_index,
return 0.f;
}
+MotionEvent::Classification MotionEvent::GetClassification() const {
+ NOTIMPLEMENTED();
+ return Classification::NONE;
+}
+
int MotionEvent::FindPointerIndexOfId(int id) const {
const size_t pointer_count = GetPointerCount();
for (size_t i = 0; i < pointer_count; ++i) {
diff --git a/chromium/ui/events/gesture_detection/motion_event.h b/chromium/ui/events/gesture_detection/motion_event.h
index 10a72111f24..a40fe798d9b 100644
--- a/chromium/ui/events/gesture_detection/motion_event.h
+++ b/chromium/ui/events/gesture_detection/motion_event.h
@@ -37,6 +37,13 @@ class GESTURE_DETECTION_EXPORT MotionEvent {
enum class ToolType { UNKNOWN, FINGER, STYLUS, MOUSE, ERASER, LAST = ERASER };
+ enum class Classification {
+ NONE,
+ AMBIGUOUS_GESTURE,
+ DEEP_PRESS,
+ LAST = DEEP_PRESS
+ };
+
enum ButtonType {
BUTTON_PRIMARY = 1 << 0,
BUTTON_SECONDARY = 1 << 1,
@@ -78,6 +85,8 @@ class GESTURE_DETECTION_EXPORT MotionEvent {
virtual int GetFlags() const = 0;
virtual base::TimeTicks GetEventTime() const = 0;
+ virtual Classification GetClassification() const;
+
// Optional historical data, default implementation provides an empty history.
virtual size_t GetHistorySize() const;
virtual base::TimeTicks GetHistoricalEventTime(size_t historical_index) const;
diff --git a/chromium/ui/events/gesture_event_details.h b/chromium/ui/events/gesture_event_details.h
index f1a7c446aa7..d20416738bd 100644
--- a/chromium/ui/events/gesture_event_details.h
+++ b/chromium/ui/events/gesture_event_details.h
@@ -7,7 +7,7 @@
#include <string.h>
-#include "base/logging.h"
+#include "base/check_op.h"
#include "ui/events/event_constants.h"
#include "ui/events/events_base_export.h"
#include "ui/events/types/event_type.h"
diff --git a/chromium/ui/events/keycodes/dom/dom_key.h b/chromium/ui/events/keycodes/dom/dom_key.h
index 3f3e7ca5931..2f062886eca 100644
--- a/chromium/ui/events/keycodes/dom/dom_key.h
+++ b/chromium/ui/events/keycodes/dom/dom_key.h
@@ -7,7 +7,9 @@
#include <stdint.h>
-#include "base/logging.h"
+#include <ostream>
+
+#include "base/check.h"
#include "base/optional.h"
#include "build/build_config.h"
diff --git a/chromium/ui/events/keycodes/dom/dom_keyboard_layout_map_mac.mm b/chromium/ui/events/keycodes/dom/dom_keyboard_layout_map_mac.mm
index 7ebc2b301aa..43fd8604a30 100644
--- a/chromium/ui/events/keycodes/dom/dom_keyboard_layout_map_mac.mm
+++ b/chromium/ui/events/keycodes/dom/dom_keyboard_layout_map_mac.mm
@@ -7,6 +7,7 @@
#include <cstdint>
#include <string>
+#include "base/check_op.h"
#include "base/mac/foundation_util.h"
#include "ui/events/keycodes/dom/dom_code.h"
#include "ui/events/keycodes/dom/dom_key.h"
diff --git a/chromium/ui/events/keycodes/dom/dom_keyboard_layout_map_win.cc b/chromium/ui/events/keycodes/dom/dom_keyboard_layout_map_win.cc
index 025a030183f..2df81649722 100644
--- a/chromium/ui/events/keycodes/dom/dom_keyboard_layout_map_win.cc
+++ b/chromium/ui/events/keycodes/dom/dom_keyboard_layout_map_win.cc
@@ -9,6 +9,7 @@
#include <utility>
#include <vector>
+#include "base/check_op.h"
#include "base/containers/flat_map.h"
#include "base/logging.h"
#include "base/macros.h"
diff --git a/chromium/ui/events/keycodes/keyboard_code_conversion_x.cc b/chromium/ui/events/keycodes/keyboard_code_conversion_x.cc
index 7b12d1aac1d..3a5dac167ba 100644
--- a/chromium/ui/events/keycodes/keyboard_code_conversion_x.cc
+++ b/chromium/ui/events/keycodes/keyboard_code_conversion_x.cc
@@ -134,57 +134,57 @@ const struct MAP0 {
return m1.ch0 < m2.ch0;
}
} map0[] = {
- {0x0025, 0x35}, // XK_percent: VKEY_5
- {0x0026, 0x31}, // XK_ampersand: VKEY_1
- {0x003C, 0xDC}, // XK_less: VKEY_OEM_5
- {0x007B, 0xDE}, // XK_braceleft: VKEY_OEM_7
- {0x007C, 0xDC}, // XK_bar: VKEY_OEM_5
- {0x007D, 0xBF}, // XK_braceright: VKEY_OEM_2
- {0x007E, 0xDC}, // XK_asciitilde: VKEY_OEM_5
- {0x00A1, 0xDD}, // XK_exclamdown: VKEY_OEM_6
- {0x00AD, 0xC0}, // XK_hyphen: VKEY_OEM_3
- {0x00B2, 0xDE}, // XK_twosuperior: VKEY_OEM_7
- {0x00B5, 0xDC}, // XK_mu: VKEY_OEM_5
- {0x00BB, 0x39}, // XK_guillemotright: VKEY_9
- {0x00BD, 0xDC}, // XK_onehalf: VKEY_OEM_5
- {0x00BF, 0xDD}, // XK_questiondown: VKEY_OEM_6
- {0x00DF, 0xDB}, // XK_ssharp: VKEY_OEM_4
- {0x00E5, 0xDD}, // XK_aring: VKEY_OEM_6
- {0x00EA, 0x33}, // XK_ecircumflex: VKEY_3
- {0x00EB, 0xBA}, // XK_ediaeresis: VKEY_OEM_1
- {0x00EC, 0xDD}, // XK_igrave: VKEY_OEM_6
- {0x00EE, 0xDD}, // XK_icircumflex: VKEY_OEM_6
- {0x00F1, 0xC0}, // XK_ntilde: VKEY_OEM_3
- {0x00F2, 0xC0}, // XK_ograve: VKEY_OEM_3
- {0x00F5, 0xDB}, // XK_otilde: VKEY_OEM_4
- {0x00F7, 0xDD}, // XK_division: VKEY_OEM_6
- {0x00FD, 0x37}, // XK_yacute: VKEY_7
- {0x00FE, 0xBD}, // XK_thorn: VKEY_OEM_MINUS
- {0x01A1, 0xDD}, // XK_ohorn: VKEY_OEM_6
- {0x01B0, 0xDB}, // XK_uhorn: VKEY_OEM_4
- {0x01B5, 0x32}, // XK_lcaron: VKEY_2
- {0x01B6, 0xDD}, // XK_zstroke: VKEY_OEM_6
- {0x01BB, 0x35}, // XK_tcaron: VKEY_5
- {0x01E6, 0xDE}, // XK_cacute: VKEY_OEM_7
- {0x01EC, 0x32}, // XK_ecaron: VKEY_2
- {0x01F2, 0xDC}, // XK_ncaron: VKEY_OEM_5
- {0x01F5, 0xDB}, // XK_odoubleacute: VKEY_OEM_4
- {0x01F8, 0x35}, // XK_rcaron: VKEY_5
- {0x01F9, 0xBA}, // XK_uring: VKEY_OEM_1
- {0x01FB, 0xDC}, // XK_udoubleacute: VKEY_OEM_5
- {0x01FE, 0xDE}, // XK_tcedilla: VKEY_OEM_7
- {0x0259, 0xC0}, // XK_schwa: VKEY_OEM_3
- {0x02B1, 0xDD}, // XK_hstroke: VKEY_OEM_6
- {0x02B9, 0xBA}, // XK_idotless: VKEY_OEM_1
- {0x02BB, 0xDD}, // XK_gbreve: VKEY_OEM_6
- {0x02E5, 0xC0}, // XK_cabovedot: VKEY_OEM_3
- {0x02F5, 0xDB}, // XK_gabovedot: VKEY_OEM_4
- {0x03B6, 0xBF}, // XK_lcedilla: VKEY_OEM_2
- {0x03BA, 0x57}, // XK_emacron: VKEY_W
- {0x03E0, 0xDF}, // XK_amacron: VKEY_OEM_8
- {0x03EF, 0xDD}, // XK_imacron: VKEY_OEM_6
- {0x03F1, 0xDB}, // XK_ncedilla: VKEY_OEM_4
- {0x03F3, 0xDC}, // XK_kcedilla: VKEY_OEM_5
+ {0x0025, 0x35}, // XK_percent: VKEY_5
+ {0x0026, 0x31}, // XK_ampersand: VKEY_1
+ {0x003C, 0xDC}, // XK_less: VKEY_OEM_5
+ {0x007B, 0xDE}, // XK_braceleft: VKEY_OEM_7
+ {0x007C, 0xDC}, // XK_bar: VKEY_OEM_5
+ {0x007D, 0xBF}, // XK_braceright: VKEY_OEM_2
+ {0x007E, 0xDC}, // XK_asciitilde: VKEY_OEM_5
+ {0x00A1, 0xDD}, // XK_exclamdown: VKEY_OEM_6
+ {0x00AD, 0xC0}, // XK_hyphen: VKEY_OEM_3
+ {0x00B2, 0xDE}, // XK_twosuperior: VKEY_OEM_7
+ {0x00B5, 0xDC}, // XK_mu: VKEY_OEM_5
+ {0x00BB, 0x39}, // XK_guillemotright: VKEY_9
+ {0x00BD, 0xDC}, // XK_onehalf: VKEY_OEM_5
+ {0x00BF, 0xDD}, // XK_questiondown: VKEY_OEM_6
+ {0x00DF, 0xDB}, // XK_ssharp: VKEY_OEM_4
+ {0x00E5, 0xDD}, // XK_aring: VKEY_OEM_6
+ {0x00EA, 0x33}, // XK_ecircumflex: VKEY_3
+ {0x00EB, 0xBA}, // XK_ediaeresis: VKEY_OEM_1
+ {0x00EC, 0xDD}, // XK_igrave: VKEY_OEM_6
+ {0x00EE, 0xDD}, // XK_icircumflex: VKEY_OEM_6
+ {0x00F1, 0xC0}, // XK_ntilde: VKEY_OEM_3
+ {0x00F2, 0xC0}, // XK_ograve: VKEY_OEM_3
+ {0x00F5, 0xDB}, // XK_otilde: VKEY_OEM_4
+ {0x00F7, 0xDD}, // XK_division: VKEY_OEM_6
+ {0x00FD, 0x37}, // XK_yacute: VKEY_7
+ {0x00FE, 0xBD}, // XK_thorn: VKEY_OEM_MINUS
+ {0x01A1, 0xDD}, // XK_ohorn: VKEY_OEM_6
+ {0x01B0, 0xDB}, // XK_uhorn: VKEY_OEM_4
+ {0x01B5, 0x32}, // XK_lcaron: VKEY_2
+ {0x01B6, 0xDD}, // XK_zstroke: VKEY_OEM_6
+ {0x01BB, 0x35}, // XK_tcaron: VKEY_5
+ {0x01E6, 0xDE}, // XK_cacute: VKEY_OEM_7
+ {0x01EC, 0x32}, // XK_ecaron: VKEY_2
+ {0x01F2, 0xDC}, // XK_ncaron: VKEY_OEM_5
+ {0x01F5, 0xDB}, // XK_odoubleacute: VKEY_OEM_4
+ {0x01F8, 0x35}, // XK_rcaron: VKEY_5
+ {0x01F9, 0xBA}, // XK_uring: VKEY_OEM_1
+ {0x01FB, 0xDC}, // XK_udoubleacute: VKEY_OEM_5
+ {0x01FE, 0xDE}, // XK_tcedilla: VKEY_OEM_7
+ {0x0259, 0xC0}, // XK_schwa: VKEY_OEM_3
+ {0x02B1, 0xDD}, // XK_hstroke: VKEY_OEM_6
+ {0x02B9, 0xBA}, // XK_idotless: VKEY_OEM_1
+ {0x02BB, 0xDD}, // XK_gbreve: VKEY_OEM_6
+ {0x02E5, 0xC0}, // XK_cabovedot: VKEY_OEM_3
+ {0x02F5, 0xDB}, // XK_gabovedot: VKEY_OEM_4
+ {0x03B6, 0xBF}, // XK_lcedilla: VKEY_OEM_2
+ {0x03BA, 0x57}, // XK_emacron: VKEY_W
+ {0x03E0, 0xDF}, // XK_amacron: VKEY_OEM_8
+ {0x03EF, 0xDD}, // XK_imacron: VKEY_OEM_6
+ {0x03F1, 0xDB}, // XK_ncedilla: VKEY_OEM_4
+ {0x03F3, 0xDC}, // XK_kcedilla: VKEY_OEM_5
};
const struct MAP1 {
@@ -389,34 +389,32 @@ const struct MAP2 {
return m1.ch0 < m2.ch0;
}
} map2[] = {
- {0x0023, 0x33, 0x0027,
- 0xBF}, // XK_numbersign+BKSL+XK_quoteright: VKEY_OEM_2
- {0x0027, 0x30, 0x0022,
- 0xDE}, // XK_quoteright+AC11+XK_quotedbl: VKEY_OEM_7
- {0x0027, 0x31, 0x0022,
- 0xC0}, // XK_quoteright+TLDE+XK_quotedbl: VKEY_OEM_3
- {0x0027, 0x31, 0x00B7,
- 0xDC}, // XK_quoteright+TLDE+XK_periodcentered: VKEY_OEM_5
- {0x0027, 0x33, 0x0000, 0xDC}, // XK_quoteright+BKSL+NoSymbol: VKEY_OEM_5
- {0x002D, 0x3D, 0x003D, 0xBD}, // XK_minus+AB10+XK_equal: VKEY_OEM_MINUS
- {0x002F, 0x0C, 0x0033, 0x33}, // XK_slash+AE03+XK_3: VKEY_3
- {0x002F, 0x0C, 0x003F, 0xBF}, // XK_slash+AE03+XK_question: VKEY_OEM_2
- {0x002F, 0x13, 0x0030, 0x30}, // XK_slash+AE10+XK_0: VKEY_0
- {0x002F, 0x13, 0x003F, 0xBF}, // XK_slash+AE10+XK_question: VKEY_OEM_2
- {0x003D, 0x3D, 0x0025, 0xDF}, // XK_equal+AB10+XK_percent: VKEY_OEM_8
- {0x003D, 0x3D, 0x002B, 0xBB}, // XK_equal+AB10+XK_plus: VKEY_OEM_PLUS
- {0x005C, 0x33, 0x007C, 0xDC}, // XK_backslash+BKSL+XK_bar: VKEY_OEM_5
- {0x0060, 0x31, 0x0000, 0xC0}, // XK_quoteleft+TLDE+NoSymbol: VKEY_OEM_3
- {0x0060, 0x31, 0x00AC, 0xDF}, // XK_quoteleft+TLDE+XK_notsign: VKEY_OEM_8
- {0x00A7, 0x31, 0x00B0, 0xBF}, // XK_section+TLDE+XK_degree: VKEY_OEM_2
- {0x00A7, 0x31, 0x00BD, 0xDC}, // XK_section+TLDE+XK_onehalf: VKEY_OEM_5
- {0x00E0, 0x30, 0x00B0, 0xDE}, // XK_agrave+AC11+XK_degree: VKEY_OEM_7
- {0x00E0, 0x30, 0x00E4, 0xDC}, // XK_agrave+AC11+XK_adiaeresis: VKEY_OEM_5
- {0x00E4, 0x30, 0x00E0, 0xDC}, // XK_adiaeresis+AC11+XK_agrave: VKEY_OEM_5
- {0x00E9, 0x2F, 0x00C9, 0xBA}, // XK_eacute+AC10+XK_Eacute: VKEY_OEM_1
- {0x00E9, 0x2F, 0x00F6, 0xDE}, // XK_eacute+AC10+XK_odiaeresis: VKEY_OEM_7
- {0x00F6, 0x2F, 0x00E9, 0xDE}, // XK_odiaeresis+AC10+XK_eacute: VKEY_OEM_7
- {0x00FC, 0x22, 0x00E8, 0xBA}, // XK_udiaeresis+AD11+XK_egrave: VKEY_OEM_1
+ {0x0023, 0x33, 0x0027,
+ 0xBF}, // XK_numbersign+BKSL+XK_quoteright: VKEY_OEM_2
+ {0x0027, 0x30, 0x0022, 0xDE}, // XK_quoteright+AC11+XK_quotedbl: VKEY_OEM_7
+ {0x0027, 0x31, 0x0022, 0xC0}, // XK_quoteright+TLDE+XK_quotedbl: VKEY_OEM_3
+ {0x0027, 0x31, 0x00B7,
+ 0xDC}, // XK_quoteright+TLDE+XK_periodcentered: VKEY_OEM_5
+ {0x0027, 0x33, 0x0000, 0xDC}, // XK_quoteright+BKSL+NoSymbol: VKEY_OEM_5
+ {0x002D, 0x3D, 0x003D, 0xBD}, // XK_minus+AB10+XK_equal: VKEY_OEM_MINUS
+ {0x002F, 0x0C, 0x0033, 0x33}, // XK_slash+AE03+XK_3: VKEY_3
+ {0x002F, 0x0C, 0x003F, 0xBF}, // XK_slash+AE03+XK_question: VKEY_OEM_2
+ {0x002F, 0x13, 0x0030, 0x30}, // XK_slash+AE10+XK_0: VKEY_0
+ {0x002F, 0x13, 0x003F, 0xBF}, // XK_slash+AE10+XK_question: VKEY_OEM_2
+ {0x003D, 0x3D, 0x0025, 0xDF}, // XK_equal+AB10+XK_percent: VKEY_OEM_8
+ {0x003D, 0x3D, 0x002B, 0xBB}, // XK_equal+AB10+XK_plus: VKEY_OEM_PLUS
+ {0x005C, 0x33, 0x007C, 0xDC}, // XK_backslash+BKSL+XK_bar: VKEY_OEM_5
+ {0x0060, 0x31, 0x0000, 0xC0}, // XK_quoteleft+TLDE+NoSymbol: VKEY_OEM_3
+ {0x0060, 0x31, 0x00AC, 0xDF}, // XK_quoteleft+TLDE+XK_notsign: VKEY_OEM_8
+ {0x00A7, 0x31, 0x00B0, 0xBF}, // XK_section+TLDE+XK_degree: VKEY_OEM_2
+ {0x00A7, 0x31, 0x00BD, 0xDC}, // XK_section+TLDE+XK_onehalf: VKEY_OEM_5
+ {0x00E0, 0x30, 0x00B0, 0xDE}, // XK_agrave+AC11+XK_degree: VKEY_OEM_7
+ {0x00E0, 0x30, 0x00E4, 0xDC}, // XK_agrave+AC11+XK_adiaeresis: VKEY_OEM_5
+ {0x00E4, 0x30, 0x00E0, 0xDC}, // XK_adiaeresis+AC11+XK_agrave: VKEY_OEM_5
+ {0x00E9, 0x2F, 0x00C9, 0xBA}, // XK_eacute+AC10+XK_Eacute: VKEY_OEM_1
+ {0x00E9, 0x2F, 0x00F6, 0xDE}, // XK_eacute+AC10+XK_odiaeresis: VKEY_OEM_7
+ {0x00F6, 0x2F, 0x00E9, 0xDE}, // XK_odiaeresis+AC10+XK_eacute: VKEY_OEM_7
+ {0x00FC, 0x22, 0x00E8, 0xBA}, // XK_udiaeresis+AD11+XK_egrave: VKEY_OEM_1
};
const struct MAP3 {
@@ -543,22 +541,12 @@ KeyboardCode FindVK(const T_MAP& key, const T_MAP* map, size_t size) {
// 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
- };
+ 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};
- for (size_t i = 0; i < base::size(keysyms); ++i) {
- if (keysyms[i] == keysym)
+ for (unsigned long i : keysyms) {
+ if (i == keysym)
return true;
}
return false;
@@ -584,7 +572,7 @@ KeyboardCode KeyboardCodeFromXKeyEvent(const XEvent* xev) {
KeySym keysym = NoSymbol;
XEvent xkeyevent;
xkeyevent.xkey = {};
- if (xev->type == GenericEvent) {
+ if (xev->type == x11::GeGenericEvent::opcode) {
// Convert the XI2 key event into a core key event so that we can
// continue to use XLookupString() until crbug.com/367732 is complete.
InitXKeyEventFromXIDeviceEvent(*xev, &xkeyevent);
@@ -595,7 +583,7 @@ KeyboardCode KeyboardCodeFromXKeyEvent(const XEvent* xev) {
XKeyEvent* xkey = &xkeyevent.xkey;
// XLookupKeysym does not take into consideration the state of the lock/shift
// etc. keys. So it is necessary to use XLookupString instead.
- XLookupString(xkey, NULL, 0, &keysym, NULL);
+ XLookupString(xkey, nullptr, 0, &keysym, nullptr);
if (IsKeypadKey(keysym) || IsPrivateKeypadKey(keysym) ||
IsCursorKey(keysym) || IsPFKey(keysym) || IsFunctionKey(keysym) ||
IsModifierKey(keysym) || IsTtyFunctionOrSpaceKey(keysym)) {
@@ -607,7 +595,7 @@ KeyboardCode KeyboardCodeFromXKeyEvent(const XEvent* xev) {
// generates VKEY_D.
if (xkey->state & 0xFF & ~Mod2Mask) {
xkey->state &= (~0xFF | Mod2Mask);
- XLookupString(xkey, NULL, 0, &keysym, NULL);
+ XLookupString(xkey, nullptr, 0, &keysym, nullptr);
}
// [a-z] cases.
@@ -633,7 +621,7 @@ KeyboardCode KeyboardCodeFromXKeyEvent(const XEvent* xev) {
KeySym keysym_shift = NoSymbol;
xkey->state |= ShiftMask;
- XLookupString(xkey, NULL, 0, &keysym_shift, NULL);
+ XLookupString(xkey, nullptr, 0, &keysym_shift, nullptr);
MAP2 key2 = {keysym & 0xFFFF, xkey->keycode, keysym_shift & 0xFFFF, 0};
keycode = FindVK(key2, map2, base::size(map2));
if (keycode != VKEY_UNKNOWN)
@@ -642,7 +630,7 @@ KeyboardCode KeyboardCodeFromXKeyEvent(const XEvent* xev) {
KeySym keysym_altgr = NoSymbol;
xkey->state &= ~ShiftMask;
xkey->state |= Mod1Mask;
- XLookupString(xkey, NULL, 0, &keysym_altgr, NULL);
+ XLookupString(xkey, nullptr, 0, &keysym_altgr, nullptr);
MAP3 key3 = {keysym & 0xFFFF, xkey->keycode, keysym_shift & 0xFFFF,
keysym_altgr & 0xFFFF, 0};
keycode = FindVK(key3, map3, base::size(map3));
@@ -652,8 +640,7 @@ KeyboardCode KeyboardCodeFromXKeyEvent(const XEvent* xev) {
// On Linux some keys has AltGr char but not on Windows.
// So if cannot find VKEY with (ch0+sc+ch1+ch2) in map3, tries to fallback
// to just find VKEY with (ch0+sc+ch1). This is the best we could do.
- MAP3 key4 = {keysym & 0xFFFF, xkey->keycode, keysym_shift & 0xFFFF, 0,
- 0};
+ MAP3 key4 = {keysym & 0xFFFF, xkey->keycode, keysym_shift & 0xFFFF, 0, 0};
const MAP3* p =
std::lower_bound(map3, map3 + base::size(map3), key4, MAP3());
if (p != map3 + base::size(map3) && p->ch0 == key4.ch0 &&
@@ -950,14 +937,14 @@ KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) {
case XF86XK_KbdBrightnessUp:
return VKEY_KBD_BRIGHTNESS_UP;
- // TODO(sad): some keycodes are still missing.
+ // TODO(sad): some keycodes are still missing.
}
DVLOG(1) << "Unknown keysym: " << base::StringPrintf("0x%x", keysym);
return VKEY_UNKNOWN;
}
DomCode CodeFromXEvent(const XEvent* xev) {
- int keycode = (xev->type == GenericEvent)
+ int keycode = (xev->type == x11::GeGenericEvent::opcode)
? static_cast<XIDeviceEvent*>(xev->xcookie.data)->detail
: xev->xkey.keycode;
return ui::KeycodeConverter::NativeKeycodeToDomCode(keycode);
@@ -966,8 +953,8 @@ DomCode CodeFromXEvent(const XEvent* xev) {
uint16_t GetCharacterFromXEvent(const XEvent* xev) {
XEvent xkeyevent;
xkeyevent.xkey = {};
- const XKeyEvent* xkey = NULL;
- if (xev->type == GenericEvent) {
+ const XKeyEvent* xkey = nullptr;
+ if (xev->type == x11::GeGenericEvent::opcode) {
// Convert the XI2 key event into a core key event so that we can
// continue to use XLookupString() until crbug.com/367732 is complete.
InitXKeyEventFromXIDeviceEvent(*xev, &xkeyevent);
@@ -976,7 +963,7 @@ uint16_t GetCharacterFromXEvent(const XEvent* xev) {
xkey = &xev->xkey;
}
KeySym keysym = XK_VoidSymbol;
- XLookupString(const_cast<XKeyEvent*>(xkey), NULL, 0, &keysym, NULL);
+ XLookupString(const_cast<XKeyEvent*>(xkey), nullptr, 0, &keysym, nullptr);
return GetUnicodeCharacterFromXKeySym(keysym);
}
@@ -984,7 +971,7 @@ DomKey GetDomKeyFromXEvent(const XEvent* xev) {
XEvent xkeyevent;
xkeyevent.xkey = {};
XKeyEvent xkey;
- if (xev->type == GenericEvent) {
+ if (xev->type == x11::GeGenericEvent::opcode) {
// Convert the XI2 key event into a core key event so that we can
// continue to use XLookupString() until crbug.com/367732 is complete.
InitXKeyEventFromXIDeviceEvent(*xev, &xkeyevent);
@@ -1003,7 +990,7 @@ DomKey GetDomKeyFromXEvent(const XEvent* xev) {
// https://crbug.com/633838
xkey.state &= ~ControlMask;
KeySym keysym = XK_VoidSymbol;
- XLookupString(&xkey, NULL, 0, &keysym, NULL);
+ XLookupString(&xkey, nullptr, 0, &keysym, nullptr);
base::char16 ch = GetUnicodeCharacterFromXKeySym(keysym);
return XKeySymToDomKey(keysym, ch);
}
@@ -1444,18 +1431,18 @@ int XKeysymForWindowsKeyCode(KeyboardCode keycode, bool shift) {
default:
LOG(WARNING) << "Unknown keycode:" << keycode;
return 0;
- }
+ }
}
void InitXKeyEventFromXIDeviceEvent(const XEvent& src, XEvent* xkeyevent) {
- DCHECK(src.type == GenericEvent);
+ DCHECK(src.type == x11::GeGenericEvent::opcode);
XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(src.xcookie.data);
switch (xievent->evtype) {
case XI_KeyPress:
- xkeyevent->type = KeyPress;
+ xkeyevent->type = x11::KeyEvent::Press;
break;
case XI_KeyRelease:
- xkeyevent->type = KeyRelease;
+ xkeyevent->type = x11::KeyEvent::Release;
break;
default:
NOTREACHED();
diff --git a/chromium/ui/events/ozone/device/udev/device_manager_udev.cc b/chromium/ui/events/ozone/device/udev/device_manager_udev.cc
index 14d7e17d01d..9bd6ddd1ee5 100644
--- a/chromium/ui/events/ozone/device/udev/device_manager_udev.cc
+++ b/chromium/ui/events/ozone/device/udev/device_manager_udev.cc
@@ -6,6 +6,7 @@
#include <stddef.h>
+#include "base/logging.h"
#include "base/message_loop/message_loop_current.h"
#include "base/stl_util.h"
#include "base/strings/stringprintf.h"
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 941a0464af0..0fd9bc5b2b2 100644
--- a/chromium/ui/events/ozone/evdev/event_converter_evdev_impl.cc
+++ b/chromium/ui/events/ozone/evdev/event_converter_evdev_impl.cc
@@ -8,6 +8,7 @@
#include <linux/input.h>
#include <stddef.h>
+#include "base/logging.h"
#include "base/trace_event/trace_event.h"
#include "ui/events/devices/stylus_state.h"
#include "ui/events/event.h"
diff --git a/chromium/ui/events/ozone/evdev/event_device_info.cc b/chromium/ui/events/ozone/evdev/event_device_info.cc
index efbc258b19b..473847f55d1 100644
--- a/chromium/ui/events/ozone/evdev/event_device_info.cc
+++ b/chromium/ui/events/ozone/evdev/event_device_info.cc
@@ -6,8 +6,11 @@
#include <linux/input.h>
+#include <cstring>
+
#include "base/files/file_path.h"
#include "base/logging.h"
+#include "base/notreached.h"
#include "base/stl_util.h"
#include "base/threading/thread_restrictions.h"
#include "ui/events/devices/device_util_linux.h"
diff --git a/chromium/ui/events/ozone/evdev/gamepad_event_converter_evdev.cc b/chromium/ui/events/ozone/evdev/gamepad_event_converter_evdev.cc
index 9ea76eb0035..6ca3e8ff946 100644
--- a/chromium/ui/events/ozone/evdev/gamepad_event_converter_evdev.cc
+++ b/chromium/ui/events/ozone/evdev/gamepad_event_converter_evdev.cc
@@ -8,6 +8,7 @@
#include <linux/input.h>
#include <stddef.h>
+#include "base/logging.h"
#include "base/trace_event/trace_event.h"
#include "ui/events/event_utils.h"
#include "ui/events/ozone/evdev/device_event_dispatcher_evdev.h"
diff --git a/chromium/ui/events/ozone/evdev/input_controller_evdev.cc b/chromium/ui/events/ozone/evdev/input_controller_evdev.cc
index 18ef7c8bc0b..c7f564820bc 100644
--- a/chromium/ui/events/ozone/evdev/input_controller_evdev.cc
+++ b/chromium/ui/events/ozone/evdev/input_controller_evdev.cc
@@ -169,10 +169,29 @@ void InputControllerEvdev::SetMouseReverseScroll(bool enabled) {
}
void InputControllerEvdev::SetMouseAcceleration(bool enabled) {
+ if (mouse_acceleration_suspended_) {
+ stored_mouse_acceleration_setting_ = enabled;
+ return;
+ }
input_device_settings_.mouse_acceleration_enabled = enabled;
ScheduleUpdateDeviceSettings();
}
+void InputControllerEvdev::SuspendMouseAcceleration() {
+ // multiple calls to suspend are currently not supported.
+ DCHECK(!mouse_acceleration_suspended_);
+ stored_mouse_acceleration_setting_ =
+ input_device_settings_.mouse_acceleration_enabled;
+ mouse_acceleration_suspended_ = true;
+ input_device_settings_.mouse_acceleration_enabled = false;
+ ScheduleUpdateDeviceSettings();
+}
+
+void InputControllerEvdev::EndMouseAccelerationSuspension() {
+ mouse_acceleration_suspended_ = false;
+ SetMouseAcceleration(stored_mouse_acceleration_setting_);
+}
+
void InputControllerEvdev::SetMouseScrollAcceleration(bool enabled) {
input_device_settings_.mouse_scroll_acceleration_enabled = enabled;
ScheduleUpdateDeviceSettings();
diff --git a/chromium/ui/events/ozone/evdev/input_controller_evdev.h b/chromium/ui/events/ozone/evdev/input_controller_evdev.h
index 47dad8fa9e3..2e49e1c6b97 100644
--- a/chromium/ui/events/ozone/evdev/input_controller_evdev.h
+++ b/chromium/ui/events/ozone/evdev/input_controller_evdev.h
@@ -62,6 +62,8 @@ class COMPONENT_EXPORT(EVDEV) InputControllerEvdev : public InputController {
void SetPrimaryButtonRight(bool right) override;
void SetMouseReverseScroll(bool enabled) override;
void SetMouseAcceleration(bool enabled) override;
+ void SuspendMouseAcceleration() override;
+ void EndMouseAccelerationSuspension() override;
void SetMouseScrollAcceleration(bool enabled) override;
void SetTouchpadAcceleration(bool enabled) override;
void SetTouchpadScrollAcceleration(bool enabled) override;
@@ -91,6 +93,13 @@ class COMPONENT_EXPORT(EVDEV) InputControllerEvdev : public InputController {
// Configuration that needs to be passed on to InputDeviceFactory.
InputDeviceSettingsEvdev input_device_settings_;
+ // Indicates when the mouse acceleration is turned off for PointerLock.
+ bool mouse_acceleration_suspended_ = false;
+ // Holds mouse acceleration setting while suspended.
+ // Should only be considered a valid setting while
+ // |mouse_acceleration_suspended| is true.
+ bool stored_mouse_acceleration_setting_ = false;
+
// Task to update config from input_device_settings_ is pending.
bool settings_update_pending_ = false;
diff --git a/chromium/ui/events/ozone/evdev/input_injector_evdev.cc b/chromium/ui/events/ozone/evdev/input_injector_evdev.cc
index fb08e6bb298..3a964d6fff5 100644
--- a/chromium/ui/events/ozone/evdev/input_injector_evdev.cc
+++ b/chromium/ui/events/ozone/evdev/input_injector_evdev.cc
@@ -6,6 +6,7 @@
#include <utility>
+#include "base/logging.h"
#include "ui/events/event.h"
#include "ui/events/event_modifiers.h"
#include "ui/events/event_utils.h"
diff --git a/chromium/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc b/chromium/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc
index 7cf723c6b45..4d84634cdab 100644
--- a/chromium/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc
+++ b/chromium/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc
@@ -9,6 +9,7 @@
#include <linux/input.h>
#include <utility>
+#include "base/logging.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/trace_event/trace_event.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 2e890c0bdfe..20ee5b89567 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
@@ -8,6 +8,7 @@
#include <libevdev/libevdev.h>
#include <linux/input.h>
+#include "base/logging.h"
#include "base/stl_util.h"
#include "base/strings/stringprintf.h"
#include "base/timer/timer.h"
diff --git a/chromium/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.cc b/chromium/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.cc
index 655492e5754..5a98308f38b 100644
--- a/chromium/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.cc
+++ b/chromium/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.cc
@@ -6,6 +6,7 @@
#include <gestures/gestures.h>
+#include "base/logging.h"
#include "base/timer/timer.h"
// libgestures requires that this be in the top level namespace.
diff --git a/chromium/ui/events/ozone/evdev/stylus_button_event_converter_evdev.cc b/chromium/ui/events/ozone/evdev/stylus_button_event_converter_evdev.cc
index 39d263f25ab..762cab753ae 100644
--- a/chromium/ui/events/ozone/evdev/stylus_button_event_converter_evdev.cc
+++ b/chromium/ui/events/ozone/evdev/stylus_button_event_converter_evdev.cc
@@ -7,6 +7,7 @@
#include <errno.h>
#include <linux/input.h>
+#include "base/logging.h"
#include "base/trace_event/trace_event.h"
#include "ui/events/event_utils.h"
#include "ui/events/ozone/evdev/device_event_dispatcher_evdev.h"
diff --git a/chromium/ui/events/ozone/evdev/tablet_event_converter_evdev.cc b/chromium/ui/events/ozone/evdev/tablet_event_converter_evdev.cc
index bf00990d0d8..498b9094ea6 100644
--- a/chromium/ui/events/ozone/evdev/tablet_event_converter_evdev.cc
+++ b/chromium/ui/events/ozone/evdev/tablet_event_converter_evdev.cc
@@ -8,6 +8,7 @@
#include <linux/input.h>
#include <stddef.h>
+#include "base/logging.h"
#include "base/trace_event/trace_event.h"
#include "ui/events/event.h"
#include "ui/events/ozone/evdev/device_event_dispatcher_evdev.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 2449b059ab2..8c0a1efa0d0 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
@@ -14,10 +14,14 @@
#include <utility>
#include <vector>
+#include "base/command_line.h"
+#include "base/json/json_reader.h"
#include "base/logging.h"
+#include "base/values.h"
#include "ui/events/ozone/evdev/event_device_info.h"
#include "ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h"
#include "ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.h"
+#include "ui/events/ozone/features.h"
namespace ui {
namespace {
@@ -33,6 +37,7 @@ NeuralStylusPalmDetectionFilter::NeuralStylusPalmDetectionFilter(
std::unique_ptr<NeuralStylusPalmDetectionFilterModel> palm_model,
SharedPalmDetectionFilterState* shared_palm_state)
: PalmDetectionFilter(shared_palm_state),
+ tracking_ids_count_within_session_(0),
palm_filter_dev_info_(CreatePalmFilterDeviceInfo(devinfo)),
model_(std::move(palm_model)) {
DCHECK(CompatibleWithNeuralStylusPalmDetectionFilter(devinfo))
@@ -120,6 +125,7 @@ void NeuralStylusPalmDetectionFilter::Filter(
slots_to_hold->reset();
slots_to_suppress->reset();
std::unordered_set<int> slots_to_decide;
+ std::vector<int> ended_tracking_ids;
uint32_t total_finger_touching = 0;
for (const auto& touch : touches) {
if (touch.touching && touch.tool_code != BTN_TOOL_PEN) {
@@ -156,6 +162,12 @@ void NeuralStylusPalmDetectionFilter::Filter(
}
DCHECK_NE(tracking_id, -1);
+
+ auto insert_result = active_tracking_ids_.insert(tracking_id);
+ // New tracking_id.
+ if (insert_result.second)
+ tracking_ids_count_within_session_++;
+
// Find the stroke in the stroke list.
auto stroke_it = strokes_.find(tracking_id);
@@ -172,6 +184,8 @@ void NeuralStylusPalmDetectionFilter::Filter(
if (stroke.samples().size() < config.max_sample_count) {
slots_to_decide.insert(slot);
}
+
+ ended_tracking_ids.push_back(tracking_id);
continue;
}
@@ -212,6 +226,11 @@ void NeuralStylusPalmDetectionFilter::Filter(
shared_palm_state_->latest_palm_touch_time = time;
}
}
+
+ for (const int tracking_id : ended_tracking_ids) {
+ active_tracking_ids_.erase(tracking_id);
+ }
+
*slots_to_suppress |= is_palm_;
*slots_to_hold |= is_delay_;
@@ -306,6 +325,14 @@ std::vector<float> NeuralStylusPalmDetectionFilter::ExtractFeatures(
}
}
+ if (config.use_tracking_id_count) {
+ features.push_back(tracking_ids_count_within_session_);
+ }
+
+ if (config.use_active_tracking_id_count) {
+ features.push_back(active_tracking_ids_.size());
+ }
+
return features;
}
@@ -367,12 +394,22 @@ std::string NeuralStylusPalmDetectionFilter::FilterNameForTesting() const {
return kFilterName;
}
+bool NeuralStylusPalmDetectionFilter::
+ CompatibleWithNeuralStylusPalmDetectionFilter(
+ const EventDeviceInfo& devinfo) {
+ return NeuralStylusPalmDetectionFilter::
+ CompatibleWithNeuralStylusPalmDetectionFilter(
+ devinfo, base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ kOzoneNNPalmSwitchName));
+}
+
const std::vector<int> NeuralStylusPalmDetectionFilter::kRequiredAbsMtCodes = {
ABS_MT_POSITION_X, ABS_MT_POSITION_Y, ABS_MT_TOUCH_MAJOR};
bool NeuralStylusPalmDetectionFilter::
CompatibleWithNeuralStylusPalmDetectionFilter(
- const EventDeviceInfo& devinfo) {
+ const EventDeviceInfo& devinfo,
+ const std::string& ozone_params_switch_string) {
if (devinfo.HasStylus()) {
return false;
}
@@ -403,6 +440,33 @@ bool NeuralStylusPalmDetectionFilter::
if (devinfo.device_type() != INPUT_DEVICE_INTERNAL) {
return false;
}
+
+ // Check the switch string.
+
+ base::Optional<base::Value> value =
+ base::JSONReader::Read(ozone_params_switch_string);
+ if (value != base::nullopt && !ozone_params_switch_string.empty()) {
+ if (!value->is_dict()) {
+ return false;
+ }
+ // If the key isn't set, default to false.
+ if (value->FindKey(kOzoneNNPalmTouchCompatibleProperty) == nullptr) {
+ return false;
+ }
+ std::string* touch_string_val =
+ value->FindStringKey(kOzoneNNPalmTouchCompatibleProperty);
+ if (touch_string_val != nullptr) {
+ if (*touch_string_val == "false") {
+ return false;
+ } else if (*touch_string_val == "true") {
+ return true;
+ } else {
+ LOG(DFATAL) << "Unexpected value for nnpalm touch compatible. expected "
+ "\"true\" or \"false\" . Got: "
+ << *touch_string_val;
+ }
+ }
+ }
return true;
}
@@ -419,5 +483,12 @@ void NeuralStylusPalmDetectionFilter::EraseOldStrokes(base::TimeTicks time) {
++it;
}
}
+
+ // If the blank time is more than max_blank_time, starts a new session.
+ if (time - previous_report_time_ > model_->config().max_blank_time) {
+ tracking_ids_count_within_session_ = 0;
+ active_tracking_ids_.clear();
+ }
+ previous_report_time_ = time;
}
} // namespace ui
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.h b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.h
index aceec370b6f..a3f30805d3c 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.h
+++ b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.h
@@ -11,6 +11,7 @@
#include <map>
#include <memory>
#include <string>
+#include <unordered_set>
#include <utility>
#include <vector>
@@ -45,6 +46,10 @@ class COMPONENT_EXPORT(EVDEV) NeuralStylusPalmDetectionFilter
static bool CompatibleWithNeuralStylusPalmDetectionFilter(
const EventDeviceInfo& devinfo);
+ static bool CompatibleWithNeuralStylusPalmDetectionFilter(
+ const EventDeviceInfo& devinfo,
+ const std::string& ozone_params_switch_string);
+
static const int kFeaturesPerSample;
static const int kExtraFeaturesForNeighbor;
@@ -82,6 +87,9 @@ class COMPONENT_EXPORT(EVDEV) NeuralStylusPalmDetectionFilter
std::bitset<kNumTouchEvdevSlots> is_palm_;
std::bitset<kNumTouchEvdevSlots> is_delay_;
std::map<int, PalmFilterStroke> strokes_;
+ base::TimeTicks previous_report_time_;
+ std::unordered_set<int> active_tracking_ids_;
+ int tracking_ids_count_within_session_;
int tracking_ids_[kNumTouchEvdevSlots];
const PalmFilterDeviceInfo palm_filter_dev_info_;
std::unique_ptr<NeuralStylusPalmDetectionFilterModel> model_;
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h
index f92bc49122f..1abc9c4e5ac 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h
+++ b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h
@@ -54,6 +54,17 @@ struct COMPONENT_EXPORT(EVDEV) NeuralStylusPalmDetectionFilterModelConfig {
// point.
bool heuristic_delay_start_if_palm = false;
+ // Maximum blank time within a session, in milliseconds.
+ // Two tracking_ids are considered in one session if they overlap with each
+ // other or the gap between them is less than max_blank_time.
+ base::TimeDelta max_blank_time;
+
+ // If true, uses tracking_id count within a session as a feature.
+ bool use_tracking_id_count = false;
+
+ // If true, uses current active tracking_id count as a feature.
+ bool use_active_tracking_id_count = false;
+
// If empty, the radius by the device is left as is.
// If non empty, the radius reported by device is re-sized in features by the
// polynomial defined in this vector. E.g. if this vector is {0.5, 1.3,
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_unittest.cc b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_unittest.cc
index 0b5ba7f3afc..707a9e70b46 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_unittest.cc
+++ b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_unittest.cc
@@ -83,6 +83,17 @@ TEST_F(NeuralStylusPalmDetectionFilterTest, EventDeviceSimpleTest) {
NeuralStylusPalmDetectionFilter::
CompatibleWithNeuralStylusPalmDetectionFilter(devinfo))
<< "Failed on " << it.first.name;
+ EXPECT_EQ(false, NeuralStylusPalmDetectionFilter::
+ CompatibleWithNeuralStylusPalmDetectionFilter(
+ devinfo, "{\"touch-compatible\": \"false\"}"));
+ EXPECT_EQ(false,
+ NeuralStylusPalmDetectionFilter::
+ CompatibleWithNeuralStylusPalmDetectionFilter(devinfo, "{}"));
+ if (it.second) {
+ EXPECT_EQ(true, NeuralStylusPalmDetectionFilter::
+ CompatibleWithNeuralStylusPalmDetectionFilter(
+ devinfo, "{\"touch-compatible\": \"true\"}"));
+ }
}
}
@@ -182,6 +193,10 @@ TEST_F(NeuralStylusPalmDetectionFilterTest, CallFilterTest) {
std::bitset<kNumTouchEvdevSlots> actual_held, actual_cancelled;
std::bitset<kNumTouchEvdevSlots> expected_cancelled;
+ model_config_.max_blank_time = base::TimeDelta::FromMillisecondsD(100);
+ model_config_.use_tracking_id_count = true;
+ model_config_.use_active_tracking_id_count = true;
+
touch_[0].touching = true;
touch_[0].tracking_id = 500;
touch_[0].major = 15;
@@ -237,7 +252,7 @@ TEST_F(NeuralStylusPalmDetectionFilterTest, CallFilterTest) {
11, 9, 0, 0.625, 1, 11, 9, 0, 0.625, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4};
EXPECT_CALL(*model_,
Inference(testing::Pointwise(testing::FloatEq(), features)))
.Times(1)
@@ -248,6 +263,28 @@ TEST_F(NeuralStylusPalmDetectionFilterTest, CallFilterTest) {
EXPECT_TRUE(actual_held.none());
expected_cancelled.set(0, true);
EXPECT_EQ(actual_cancelled, expected_cancelled);
+
+ // Touch 0 already ended in last report, now we mark touch 2 ended, its last
+ // two features should be 4 and 3 (tracking_id_count and
+ // active_tracking_id_count).
+ touch_[0].was_touching = false;
+ touch_[2].tracking_id = -1;
+ touch_[3].was_touching = true;
+ features = {10, 8, 0, 73.55, 1, 10, 8, 0, 73.55, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3};
+ EXPECT_CALL(*model_,
+ Inference(testing::Pointwise(testing::FloatEq(), features)))
+ .Times(1)
+ .WillOnce(testing::Return(0.5));
+ touch_time += base::TimeDelta::FromMillisecondsD(8.0f);
+ palm_detection_filter_->Filter(touch_, touch_time, &actual_held,
+ &actual_cancelled);
+ EXPECT_TRUE(actual_held.none());
+ expected_cancelled.set(2, true);
+ EXPECT_EQ(actual_cancelled, expected_cancelled);
}
TEST_F(NeuralStylusPalmDetectionFilterTest, InferenceOnceNotPalm) {
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 9e90f038e6b..76160310bc3 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
@@ -7,7 +7,9 @@
#include <memory>
#include <utility>
+#include "base/command_line.h"
#include "base/feature_list.h"
+#include "base/json/json_reader.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
#include "base/system/sys_info.h"
@@ -47,6 +49,19 @@ std::string FetchNeuralPalmRadiusPolynomial(const EventDeviceInfo& devinfo,
return param_string;
}
+ // look at the command line.
+ base::Optional<base::Value> ozone_switch_value = base::JSONReader::Read(
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ kOzoneNNPalmSwitchName));
+ if (ozone_switch_value != base::nullopt && ozone_switch_value->is_dict()) {
+ std::string* switch_string_value =
+ ozone_switch_value->FindStringKey(kOzoneNNPalmRadiusPolynomialProperty);
+ if (switch_string_value != nullptr) {
+ return *switch_string_value;
+ }
+ }
+
+ // TODO(robsc): Remove this when comfortable.
#if defined(OS_CHROMEOS)
// We should really only be running in chromeos anyway; We do a check here
// temporarily for hatch and reef. These numbers should live in config on
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 793ab1cafd1..43fc4af5360 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
@@ -52,7 +52,7 @@ class PalmDetectionFilterFactoryDeathTest
: public PalmDetectionFilterFactoryTest {};
#if defined(OS_CHROMEOS)
-TEST_F(PalmDetectionFilterFactoryTest, Radiuses) {
+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(
@@ -70,6 +70,13 @@ TEST_F(PalmDetectionFilterFactoryTest, Radiuses) {
}
#endif
+TEST_F(PalmDetectionFilterFactoryTest, RadiusFromSwitch) {
+ base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+ kOzoneNNPalmSwitchName, "{\"radius-polynomial\" : \"15.8,22.7,30.01\"}");
+ EXPECT_EQ("15.8,22.7,30.01", internal::FetchNeuralPalmRadiusPolynomial(
+ kohaku_touchscreen_info_, ""));
+}
+
TEST_F(PalmDetectionFilterFactoryTest, AllDisabled) {
scoped_feature_list_->InitWithFeatures(
{}, {ui::kEnableHeuristicPalmDetectionFilter,
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 04e040a5f32..4a8697863a1 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
@@ -16,8 +16,8 @@ namespace {
// -----------------------------------------------------------------------------
// OP LIBRARY
-// Copied here to make sure that the inferece code always stays in sync with the
-// lib that it was generated for.
+// Copied here to make sure that the inference code always stays in sync with
+// the lib that it was generated for.
// -----------------------------------------------------------------------------
// Default to using std::copy and std::fill over memcpy and memset as they
@@ -360,6 +360,137 @@ void FullyConnected(const int32_t* __restrict input_shape,
#endif
}
+template <typename T, typename TBlocks, typename TPaddings>
+void SpaceToBatchNDRank4(const int32_t* __restrict input_shape,
+ const T* __restrict input_values,
+ const TBlocks* __restrict block_shape_values,
+ const TPaddings* __restrict padding_values,
+ T* __restrict output_values) {
+ BENCHMARK_TIMER("SpaceToBatchNDRank4");
+ const int32_t input_batch_size = input_shape[0];
+ const int32_t input_height = input_shape[1];
+ const int32_t input_width = input_shape[2];
+ const int32_t input_depth = input_shape[3];
+
+ const TBlocks block_shape_height = block_shape_values[0];
+ const TBlocks block_shape_width = block_shape_values[1];
+ const TPaddings padding_top = padding_values[0];
+ const TPaddings padding_bottom = padding_values[1];
+ const TPaddings padding_left = padding_values[2];
+ const TPaddings padding_right = padding_values[3];
+
+ const int32_t block_size = block_shape_height * block_shape_width;
+ const int32_t output_depth = input_depth;
+ const int32_t output_batch_size = input_batch_size * block_size;
+ const int32_t output_height =
+ (padding_top + padding_bottom + input_height) / block_shape_height;
+ const int32_t output_width =
+ (padding_left + padding_right + input_width) / block_shape_width;
+
+ const T pad_value = 0;
+
+ for (int32_t out_b = 0; out_b < output_batch_size; ++out_b) {
+ const int32_t input_batch = out_b % input_batch_size;
+ const int32_t shift_w = (out_b / input_batch_size) % block_shape_width;
+ const int32_t shift_h = (out_b / input_batch_size) / block_shape_width;
+ for (int32_t out_h = 0; out_h < output_height; ++out_h) {
+ for (int32_t out_w = 0; out_w < output_width; ++out_w) {
+ T* out = output_values +
+ (((out_b * output_height + out_h) * output_width + out_w) *
+ output_depth +
+ 0);
+ // Check if padding cell are being handled.
+ if (out_h * block_shape_height + shift_h < padding_top ||
+ out_h * block_shape_height + shift_h >=
+ padding_top + input_height ||
+ out_w * block_shape_width + shift_w < padding_left ||
+ out_w * block_shape_width + shift_w >= padding_left + input_width) {
+// This may not execute correctly when pad_value != 0 and T != uint8.
+#if USE_TYPED_MEMSETMEMCPY
+ std::fill(out, out + input_depth, pad_value);
+#else
+ std::memset(out, pad_value, input_depth * sizeof(T));
+#endif
+ } else {
+ const int32_t i0 = input_batch;
+ const int32_t i1 =
+ (out_h * block_shape_height + shift_h) - padding_top;
+ const int32_t i2 =
+ (out_w * block_shape_width + shift_w) - padding_left;
+ const T* in =
+ input_values +
+ (((i0 * input_height + i1) * input_width + i2) * input_depth + 0);
+#if USE_TYPED_MEMSETMEMCPY
+ std::copy(in, in + input_depth, out);
+#else
+ std::memcpy(out, in, input_depth * sizeof(T));
+#endif
+ }
+ }
+ }
+ }
+}
+
+template <typename T, typename TBlocks, typename TCrops>
+void BatchToSpaceNDRank4(const int32_t* __restrict input_shape,
+ const T* __restrict input_values,
+ const TBlocks* __restrict block_shape_values,
+ const TCrops* __restrict crops_values,
+ T* __restrict output_values) {
+ BENCHMARK_TIMER("BatchToSpaceNDRank4");
+ const int32_t input_batch_size = input_shape[0];
+ const int32_t input_height = input_shape[1];
+ const int32_t input_width = input_shape[2];
+ const int32_t input_depth = input_shape[3];
+ const TBlocks block_shape_height = block_shape_values[0];
+ const TBlocks block_shape_width = block_shape_values[1];
+ const TCrops crops_top = crops_values[0];
+ const TCrops crops_bottom = crops_values[1];
+ const TCrops crops_left = crops_values[2];
+ const TCrops crops_right = crops_values[3];
+
+ const int32_t output_depth = input_depth;
+ const int32_t output_batch_size =
+ input_batch_size / (block_shape_width * block_shape_height);
+ const int32_t output_height =
+ input_height * block_shape_height - crops_top - crops_bottom;
+ const int32_t output_width =
+ input_width * block_shape_width - crops_left - crops_right;
+
+ for (int32_t in_batch = 0; in_batch < input_batch_size; ++in_batch) {
+ const int32_t out_batch = in_batch % output_batch_size;
+ const int32_t spatial_offset = in_batch / output_batch_size;
+ for (int32_t in_h = 0; in_h < input_height; ++in_h) {
+ const int32_t out_h = in_h * block_shape_height +
+ spatial_offset / block_shape_width - crops_top;
+ if (out_h < 0 || out_h >= output_height) {
+ continue;
+ }
+ for (int32_t in_w = 0; in_w < input_width; ++in_w) {
+ const int32_t out_w = in_w * block_shape_width +
+ spatial_offset % block_shape_width - crops_left;
+
+ if (out_w < 0 || out_w >= output_width) {
+ continue;
+ }
+ T* out = output_values +
+ (((out_batch * output_height + out_h) * output_width + out_w) *
+ output_depth +
+ 0);
+ const T* in = input_values +
+ (((in_batch * input_height + in_h) * input_width + in_w) *
+ input_depth +
+ 0);
+#if USE_TYPED_MEMSETMEMCPY
+ std::copy(in, in + input_depth, out);
+#else
+ std::memcpy(out, in, input_depth * sizeof(T));
+#endif
+ }
+ }
+ }
+}
+
#if USE_EIGEN_SPARSE
template <typename T>
void SparseDenseMatmulCSR(const int32_t* __restrict input_shape,
@@ -784,7 +915,7 @@ void StridedSlice(const int32_t input_rank,
dim_is_full_range[dim] =
dim_begin[dim] == 0 && dim_end[dim] == input_shape[dim] && stride == 1;
// Make sure that the dim_end is always bigger than dim_begin, this
- // simplifies the boundry checks below.
+ // simplifies the boundary checks below.
if (stride > 0 && dim_begin[dim] > dim_end[dim]) {
dim_end[dim] += input_shape[dim];
}
@@ -1134,83 +1265,158 @@ BROADCAST_BINARY_OP(SquaredDifference,
// We use macros instead of template functions with templated functors here
// because it's a lot less verbose and easier for the compiler to optimize.
-#define REDUCE_OP(OP_NAME, DEFAULT_VALUE, UPDATE_EXPR, RESULT_EXPR) \
- template <typename T, typename Tidx> \
- void OP_NAME##InnerReduce( \
- int32_t input_rank, const int32_t* __restrict input_shape, \
- const T* __restrict input_values, int32_t index_tensor_rank, \
- const int32_t* __restrict index_shape, \
- const Tidx* __restrict index_values, T* __restrict output_values) { \
- BENCHMARK_TIMER(#OP_NAME, "InnerReduce"); \
- const int32_t inner_size = \
- GetReduceInnerSize(input_rank, input_shape, index_tensor_rank, \
- index_shape, index_values); \
- const int32_t input_size = ShapeSize(input_rank, input_shape); \
- const int32_t outer_size = input_size / inner_size; \
- for (int32_t idx_out = 0; idx_out < outer_size; ++idx_out) { \
- T value = DEFAULT_VALUE; \
- for (int32_t idx_in = 0; idx_in < inner_size; ++idx_in) { \
- const T prev = value; \
- const T next = input_values[idx_out * inner_size + idx_in]; \
- value = UPDATE_EXPR; \
- } \
- const T count = inner_size; \
- (void)sizeof(count); \
- output_values[idx_out] = RESULT_EXPR; \
- } \
- } \
- template <typename T, typename Tidx> \
- void OP_NAME##GenericReduceRank4( \
- int32_t input_rank, const int32_t* __restrict input_shape, \
- const T* __restrict input_values, int32_t index_tensor_rank, \
- const int32_t* __restrict index_shape, \
- const Tidx* __restrict index_values, T* __restrict output_values) { \
- assert(input_rank == 4); \
- assert(index_tensor_rank <= 1); \
- BENCHMARK_TIMER(#OP_NAME, "GenericReduceRank4"); \
- int32_t out_shape[4] = {input_shape[0], input_shape[1], input_shape[2], \
- input_shape[3]}; \
- bool reduce_mask[4] = {false, false, false, false}; \
- const int32_t num_indices = index_tensor_rank > 0 ? index_shape[0] : 1; \
- for (int32_t i = 0; i < num_indices; ++i) { \
- reduce_mask[index_values[i]] = true; \
- out_shape[index_values[i]] = 1; \
- } \
- const int32_t out_strides[4] = { \
- reduce_mask[0] ? 0 : out_shape[1] * out_shape[2] * out_shape[3], \
- reduce_mask[1] ? 0 : out_shape[2] * out_shape[3], \
- reduce_mask[2] ? 0 : out_shape[3], \
- reduce_mask[3] ? 0 : 1, \
- }; \
- const int32_t output_size = ShapeSize(input_rank, out_shape); \
- std::fill_n(output_values, output_size, DEFAULT_VALUE); \
- for (int32_t dim0 = 0; dim0 < input_shape[0]; ++dim0) { \
- for (int32_t dim1 = 0; dim1 < input_shape[1]; ++dim1) { \
- for (int32_t dim2 = 0; dim2 < input_shape[2]; ++dim2) { \
- for (int32_t dim3 = 0; dim3 < input_shape[3]; \
- ++dim3, ++input_values) { \
- T* out_ptr = output_values + out_strides[0] * dim0 + \
- out_strides[1] * dim1 + out_strides[2] * dim2 + \
- out_strides[3] * dim3; \
- const T prev = *out_ptr; \
- const T next = *input_values; \
- *out_ptr = UPDATE_EXPR; \
- } \
- } \
- } \
- } \
- const T count = (reduce_mask[0] ? input_shape[0] : 1) * \
- (reduce_mask[1] ? input_shape[1] : 1) * \
- (reduce_mask[2] ? input_shape[2] : 1) * \
- (reduce_mask[3] ? input_shape[3] : 1); \
- (void)sizeof(count); \
- for (int32_t i = 0; i < output_size; ++i) { \
- const T value = output_values[i]; \
- output_values[i] = RESULT_EXPR; \
- } \
+#define REDUCE_OP(OP_NAME, DEFAULT_VALUE, UPDATE_EXPR, RESULT_EXPR) \
+ template <typename T, typename Tidx> \
+ void OP_NAME##InnerReduce( \
+ int32_t input_rank, const int32_t* __restrict input_shape, \
+ const T* __restrict input_values, int32_t index_tensor_rank, \
+ const int32_t* __restrict index_shape, \
+ const Tidx* __restrict index_values, T* __restrict output_values) { \
+ BENCHMARK_TIMER(#OP_NAME, "InnerReduce"); \
+ const int32_t inner_size = \
+ GetReduceInnerSize(input_rank, input_shape, index_tensor_rank, \
+ index_shape, index_values); \
+ const int32_t input_size = ShapeSize(input_rank, input_shape); \
+ const int32_t outer_size = input_size / inner_size; \
+ for (int32_t idx_out = 0; idx_out < outer_size; ++idx_out) { \
+ T value = DEFAULT_VALUE; \
+ for (int32_t idx_in = 0; idx_in < inner_size; ++idx_in) { \
+ const T prev = value; \
+ const T next = input_values[idx_out * inner_size + idx_in]; \
+ value = UPDATE_EXPR; \
+ } \
+ const T count = inner_size; \
+ /* Used by mean reduce. */ \
+ (void)sizeof(count); \
+ output_values[idx_out] = RESULT_EXPR; \
+ } \
+ } \
+ template <typename T, typename Tidx> \
+ void OP_NAME##GenericReduceRank2( \
+ int32_t input_rank, const int32_t* __restrict input_shape, \
+ const T* __restrict input_values, int32_t index_tensor_rank, \
+ const int32_t* __restrict index_shape, \
+ const Tidx* __restrict index_values, T* __restrict output_values) { \
+ assert(input_rank == 2); \
+ assert(index_tensor_rank <= 1); \
+ BENCHMARK_TIMER(#OP_NAME, "GenericReduceRank2"); \
+ const int32_t output_size = input_shape[1]; \
+ std::fill_n(output_values, output_size, DEFAULT_VALUE); \
+ for (int32_t dim0 = 0; dim0 < input_shape[0]; ++dim0) { \
+ for (int32_t dim1 = 0; dim1 < input_shape[1]; ++dim1, ++input_values) { \
+ T* out_ptr = output_values + dim1; \
+ const T prev = *out_ptr; \
+ const T next = *input_values; \
+ *out_ptr = UPDATE_EXPR; \
+ } \
+ } \
+ const T count = input_shape[0]; \
+ /* Used by mean reduce. */ \
+ (void)sizeof(count); \
+ for (int32_t i = 0; i < output_size; ++i) { \
+ const T value = output_values[i]; \
+ output_values[i] = RESULT_EXPR; \
+ } \
+ } \
+ template <typename T, typename Tidx> \
+ void OP_NAME##GenericReduceRank3( \
+ int32_t input_rank, const int32_t* __restrict input_shape, \
+ const T* __restrict input_values, int32_t index_tensor_rank, \
+ const int32_t* __restrict index_shape, \
+ const Tidx* __restrict index_values, T* __restrict output_values) { \
+ assert(input_rank == 3); \
+ assert(index_tensor_rank <= 1); \
+ BENCHMARK_TIMER(#OP_NAME, "GenericReduceRank3"); \
+ int32_t out_shape[3] = {input_shape[0], input_shape[1], input_shape[2]}; \
+ bool reduce_mask[3] = {false, false, false}; \
+ const int32_t num_indices = index_tensor_rank > 0 ? index_shape[0] : 1; \
+ for (int32_t i = 0; i < num_indices; ++i) { \
+ reduce_mask[index_values[i]] = true; \
+ out_shape[index_values[i]] = 1; \
+ } \
+ const int32_t out_strides[3] = { \
+ reduce_mask[0] ? 0 : out_shape[1] * out_shape[2], \
+ reduce_mask[1] ? 0 : out_shape[2], \
+ reduce_mask[2] ? 0 : 1, \
+ }; \
+ const int32_t output_size = ShapeSize(input_rank, out_shape); \
+ std::fill_n(output_values, output_size, DEFAULT_VALUE); \
+ for (int32_t dim0 = 0; dim0 < input_shape[0]; ++dim0) { \
+ for (int32_t dim1 = 0; dim1 < input_shape[1]; ++dim1) { \
+ for (int32_t dim2 = 0; dim2 < input_shape[2]; \
+ ++dim2, ++input_values) { \
+ T* out_ptr = output_values + out_strides[0] * dim0 + \
+ out_strides[1] * dim1 + out_strides[2] * dim2; \
+ const T prev = *out_ptr; \
+ const T next = *input_values; \
+ *out_ptr = UPDATE_EXPR; \
+ } \
+ } \
+ } \
+ const T count = (reduce_mask[0] ? input_shape[0] : 1) * \
+ (reduce_mask[1] ? input_shape[1] : 1) * \
+ (reduce_mask[2] ? input_shape[2] : 1); \
+ /* Used by mean reduce. */ \
+ (void)sizeof(count); \
+ for (int32_t i = 0; i < output_size; ++i) { \
+ const T value = output_values[i]; \
+ output_values[i] = RESULT_EXPR; \
+ } \
+ } \
+ template <typename T, typename Tidx> \
+ void OP_NAME##GenericReduceRank4( \
+ int32_t input_rank, const int32_t* __restrict input_shape, \
+ const T* __restrict input_values, int32_t index_tensor_rank, \
+ const int32_t* __restrict index_shape, \
+ const Tidx* __restrict index_values, T* __restrict output_values) { \
+ assert(input_rank == 4); \
+ assert(index_tensor_rank <= 1); \
+ BENCHMARK_TIMER(#OP_NAME, "GenericReduceRank4"); \
+ int32_t out_shape[4] = {input_shape[0], input_shape[1], input_shape[2], \
+ input_shape[3]}; \
+ bool reduce_mask[4] = {false, false, false, false}; \
+ const int32_t num_indices = index_tensor_rank > 0 ? index_shape[0] : 1; \
+ for (int32_t i = 0; i < num_indices; ++i) { \
+ reduce_mask[index_values[i]] = true; \
+ out_shape[index_values[i]] = 1; \
+ } \
+ const int32_t out_strides[4] = { \
+ reduce_mask[0] ? 0 : out_shape[1] * out_shape[2] * out_shape[3], \
+ reduce_mask[1] ? 0 : out_shape[2] * out_shape[3], \
+ reduce_mask[2] ? 0 : out_shape[3], \
+ reduce_mask[3] ? 0 : 1, \
+ }; \
+ const int32_t output_size = ShapeSize(input_rank, out_shape); \
+ std::fill_n(output_values, output_size, DEFAULT_VALUE); \
+ for (int32_t dim0 = 0; dim0 < input_shape[0]; ++dim0) { \
+ for (int32_t dim1 = 0; dim1 < input_shape[1]; ++dim1) { \
+ for (int32_t dim2 = 0; dim2 < input_shape[2]; ++dim2) { \
+ for (int32_t dim3 = 0; dim3 < input_shape[3]; \
+ ++dim3, ++input_values) { \
+ T* out_ptr = output_values + out_strides[0] * dim0 + \
+ out_strides[1] * dim1 + out_strides[2] * dim2 + \
+ out_strides[3] * dim3; \
+ const T prev = *out_ptr; \
+ const T next = *input_values; \
+ *out_ptr = UPDATE_EXPR; \
+ } \
+ } \
+ } \
+ } \
+ const T count = (reduce_mask[0] ? input_shape[0] : 1) * \
+ (reduce_mask[1] ? input_shape[1] : 1) * \
+ (reduce_mask[2] ? input_shape[2] : 1) * \
+ (reduce_mask[3] ? input_shape[3] : 1); \
+ /* Used by mean reduce. */ \
+ (void)sizeof(count); \
+ for (int32_t i = 0; i < output_size; ++i) { \
+ const T value = output_values[i]; \
+ output_values[i] = RESULT_EXPR; \
+ } \
}
REDUCE_OP(Max, std::numeric_limits<T>::lowest(), std::max(prev, next), value)
+REDUCE_OP(Min, std::numeric_limits<T>::infinity(), std::min(prev, next), value)
REDUCE_OP(Sum, 0, prev + next, value)
REDUCE_OP(Mean, 0, prev + next, value / count)
@@ -1272,14449 +1478,16376 @@ 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_2_bias_part_0_shape[1] = {59};
+const int32_t dnn_hiddenlayer_0_bias_part_0_shape[1] = {102};
const union {
- uint8_t bytes[236];
- float values[59];
-} dnn_hiddenlayer_2_bias_part_0 = {{
- 0xa5, 0x90, 0xaf, 0xbe, 0x59, 0xb0, 0xd4, 0x3f, 0xa2, 0xe0, 0xa2, 0x3f,
- 0x2e, 0xcb, 0x1b, 0x3e, 0xb1, 0x59, 0xd9, 0xbe, 0x22, 0x37, 0xb0, 0x3f,
- 0xd3, 0xa7, 0x6e, 0x3f, 0x89, 0xf1, 0xd2, 0xbd, 0xa0, 0xf9, 0x24, 0xbf,
- 0x7e, 0x27, 0x08, 0xbf, 0xd1, 0xa5, 0xbc, 0x3e, 0x00, 0x89, 0x62, 0x3f,
- 0x61, 0xe2, 0x0b, 0x3f, 0x5e, 0x6e, 0x13, 0x3f, 0x37, 0x43, 0x26, 0xbf,
- 0x8b, 0x24, 0x6b, 0x3e, 0xf4, 0x56, 0x6d, 0xbe, 0x89, 0xba, 0xca, 0x3e,
- 0x9f, 0x14, 0x5c, 0x3d, 0x8a, 0x0a, 0x5f, 0x3e, 0x1b, 0x7f, 0x07, 0xbf,
- 0xf9, 0x44, 0x05, 0xbf, 0xca, 0x09, 0x29, 0x3f, 0x00, 0xba, 0xb8, 0xbe,
- 0xd1, 0x0c, 0x70, 0x3f, 0xc5, 0xae, 0x1d, 0x3f, 0x9f, 0xd0, 0xa5, 0xbf,
- 0xe6, 0x7b, 0x3f, 0x3e, 0x7a, 0x0d, 0x80, 0xbe, 0x46, 0x82, 0x6f, 0x3d,
- 0xee, 0x9a, 0x01, 0x3f, 0x69, 0x72, 0x89, 0x3f, 0xcc, 0x99, 0xd6, 0xbd,
- 0xfc, 0xd7, 0xb1, 0xbe, 0x0d, 0x9e, 0x76, 0xbd, 0xae, 0x4f, 0xa0, 0xbe,
- 0x9f, 0xd9, 0x1f, 0x3e, 0xd2, 0x7f, 0xd0, 0xbe, 0x31, 0x1c, 0x29, 0x3e,
- 0xa7, 0x25, 0x7a, 0xbf, 0xd3, 0xe9, 0xb7, 0xbd, 0x7f, 0x17, 0x47, 0xbf,
- 0x03, 0xdf, 0x65, 0x3f, 0x15, 0x66, 0x1c, 0x3f, 0x45, 0x74, 0xf7, 0x3e,
- 0xa3, 0xfa, 0xf3, 0x3e, 0xbc, 0xc8, 0x65, 0x3e, 0xfb, 0xd9, 0x61, 0x3f,
- 0x04, 0x05, 0x87, 0xbd, 0x49, 0xe2, 0x5f, 0x3e, 0x99, 0x4f, 0x4c, 0xbf,
- 0xe8, 0x02, 0xed, 0xbe, 0x4a, 0x81, 0xb1, 0xbd, 0x46, 0x27, 0x09, 0x3f,
- 0x62, 0xd5, 0x59, 0xbf, 0xbd, 0x25, 0x96, 0x3e, 0x21, 0x6b, 0x91, 0xbf,
- 0x0f, 0x88, 0xb2, 0x3e, 0x3e, 0xfc, 0xc3, 0xbe,
+ uint8_t bytes[408];
+ float values[102];
+} 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,
}};
-const int32_t dnn_logits_kernel_part_0_shape[2] = {59, 1};
+const int32_t dnn_hiddenlayer_0_kernel_part_0_shape[2] = {193, 102};
const union {
- uint8_t bytes[236];
- float values[59];
-} dnn_logits_kernel_part_0 = {{
- 0x1a, 0x63, 0xb6, 0x3d, 0xa2, 0xcb, 0x12, 0xbe, 0x02, 0x7d, 0x6b, 0xbd,
- 0xb8, 0x61, 0xa8, 0x3d, 0xe7, 0xfe, 0xc0, 0x3d, 0x0e, 0xc3, 0xd8, 0xbd,
- 0xb4, 0x0e, 0x83, 0xbd, 0x9d, 0xba, 0xbb, 0x3d, 0xc1, 0x35, 0xbc, 0x3d,
- 0x7c, 0xe9, 0xc5, 0x3d, 0xce, 0xe5, 0x2d, 0xbd, 0xc8, 0xfd, 0xb7, 0xbd,
- 0xb6, 0xc7, 0x3b, 0xbe, 0x66, 0xd8, 0xf1, 0x3d, 0x5d, 0xf0, 0xbc, 0x3d,
- 0x99, 0x8a, 0x0b, 0xbe, 0x33, 0xf9, 0xde, 0xbd, 0x63, 0x58, 0xc2, 0xbd,
- 0x7e, 0x6e, 0xce, 0xbd, 0xa8, 0x8f, 0x17, 0xbe, 0xef, 0xe6, 0x43, 0x3e,
- 0x0b, 0xc7, 0x0d, 0x3d, 0xe3, 0x49, 0x0b, 0xbe, 0x13, 0x09, 0x0b, 0x3e,
- 0xfd, 0xfd, 0x9d, 0xbd, 0xe9, 0xc3, 0x82, 0xbd, 0xde, 0x5b, 0xd6, 0x3d,
- 0xd0, 0x8d, 0xe1, 0x3d, 0x44, 0x39, 0x5c, 0x3d, 0x6b, 0x5f, 0x17, 0x3e,
- 0xb1, 0x29, 0xba, 0xbd, 0x3c, 0xc4, 0xc8, 0xbd, 0xb5, 0x01, 0xf1, 0x3d,
- 0x6f, 0x15, 0x74, 0x3d, 0x33, 0x36, 0x32, 0xbe, 0xe3, 0x94, 0xa5, 0xbd,
- 0x82, 0x50, 0xf4, 0x3d, 0x22, 0x13, 0xc1, 0x3d, 0x18, 0x68, 0x1c, 0xbd,
- 0x69, 0x5a, 0xfb, 0x3d, 0x32, 0x00, 0xa3, 0x3d, 0x0e, 0x2a, 0x85, 0x3d,
- 0xbd, 0x4c, 0x9f, 0xbd, 0x94, 0x6e, 0x4d, 0x3e, 0x44, 0xba, 0x15, 0xbd,
- 0x10, 0x0d, 0xc3, 0xbd, 0xff, 0xb4, 0x2f, 0xbe, 0xc5, 0xb4, 0xdf, 0xbd,
- 0x7e, 0xd8, 0xfd, 0x3d, 0x55, 0x1e, 0x4a, 0xbe, 0x44, 0x48, 0xb6, 0x3d,
- 0xea, 0xc4, 0xcc, 0x3d, 0xd0, 0xe3, 0xdd, 0xbd, 0xa8, 0x72, 0x47, 0xbe,
- 0xef, 0xc5, 0x9b, 0x3d, 0xf8, 0x4f, 0xff, 0x3d, 0x39, 0xea, 0x70, 0x3d,
- 0xcb, 0xce, 0x01, 0xbe, 0xa3, 0x92, 0x8d, 0x3d,
+ uint8_t bytes[78744];
+ float values[19686];
+} 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,
}};
-const int32_t dnn_logits_bias_part_0_shape[1] = {1};
+const int32_t dnn_hiddenlayer_1_bias_part_0_shape[1] = {123};
const union {
- uint8_t bytes[4];
- float values[1];
-} dnn_logits_bias_part_0 = {{
- 0x5e,
- 0xf1,
- 0x07,
- 0xbf,
+ uint8_t bytes[492];
+ float values[123];
+} 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,
}};
-const int32_t dnn_hiddenlayer_0_kernel_part_0_shape[2] = {193, 117};
+const int32_t dnn_hiddenlayer_1_kernel_part_0_shape[2] = {102, 123};
const union {
- uint8_t bytes[90324];
- float values[22581];
-} dnn_hiddenlayer_0_kernel_part_0 = {{
- 0xbc, 0x23, 0x82, 0xbe, 0x5c, 0xdc, 0xdc, 0xbb, 0xe6, 0xa3, 0x84, 0xbd,
- 0x0c, 0x1d, 0xd0, 0x3d, 0x8a, 0x34, 0x96, 0xbe, 0x89, 0x71, 0xb1, 0xbd,
- 0xd1, 0x1d, 0xd5, 0x3e, 0xbf, 0x83, 0xe3, 0xbe, 0x65, 0xe8, 0xc4, 0x3e,
- 0x69, 0x17, 0x8d, 0xbc, 0xa9, 0x67, 0x87, 0x3c, 0x75, 0x2d, 0x38, 0x3e,
- 0x32, 0xc9, 0xaa, 0xbd, 0x6f, 0x06, 0x5b, 0x3e, 0xc8, 0x18, 0x99, 0xbe,
- 0x76, 0x6b, 0x82, 0x3e, 0x08, 0xe2, 0x18, 0xbe, 0xe2, 0x2a, 0x37, 0x3e,
- 0xec, 0x2a, 0xb1, 0xbc, 0x09, 0x09, 0x05, 0xbe, 0xcb, 0xee, 0x05, 0x3f,
- 0x06, 0xed, 0xbd, 0xbe, 0xd4, 0x13, 0x24, 0xbf, 0x2c, 0x47, 0x23, 0xbf,
- 0xff, 0x7b, 0x95, 0x3d, 0xfd, 0x9b, 0x9d, 0x3e, 0xbf, 0x88, 0x34, 0xbf,
- 0xc5, 0x4d, 0x8a, 0x3e, 0xba, 0x81, 0xd6, 0xbc, 0xa1, 0x2f, 0x2b, 0xbe,
- 0x34, 0x19, 0x09, 0x3f, 0x93, 0xa0, 0x7e, 0xbe, 0xd1, 0xd9, 0xe1, 0xbe,
- 0x83, 0x43, 0xe2, 0xbd, 0x0c, 0x91, 0xd9, 0xbe, 0x6b, 0xbd, 0xbe, 0xbd,
- 0xcc, 0xdc, 0x02, 0x3f, 0x5e, 0xb0, 0x67, 0x3e, 0x09, 0x97, 0x73, 0xbe,
- 0xf6, 0x83, 0x18, 0xbe, 0x52, 0xf4, 0x10, 0xbf, 0xde, 0x40, 0xeb, 0xbd,
- 0x3a, 0x77, 0xa7, 0xbe, 0x49, 0x25, 0xad, 0x3d, 0x73, 0xee, 0x01, 0x3c,
- 0xce, 0xab, 0x26, 0xbe, 0x3c, 0x16, 0x22, 0x3f, 0xd8, 0xc6, 0x91, 0x3e,
- 0x5d, 0x0a, 0x1a, 0x3c, 0xb8, 0xf7, 0xb3, 0xbb, 0x8a, 0x74, 0x84, 0x3e,
- 0x02, 0x70, 0x72, 0x3e, 0xe6, 0x8e, 0xfe, 0x3e, 0x79, 0x84, 0x48, 0xbe,
- 0x57, 0xf3, 0x0c, 0xbc, 0x5d, 0xfd, 0x29, 0xbf, 0x70, 0x3c, 0xab, 0x3e,
- 0x9d, 0x3e, 0x2a, 0x3d, 0x66, 0x63, 0x4e, 0x3e, 0x8f, 0x1f, 0xb7, 0xbb,
- 0x47, 0x41, 0x7e, 0xbe, 0x29, 0xa0, 0x0a, 0xbf, 0x83, 0xcc, 0xab, 0x3d,
- 0x0d, 0xee, 0xaa, 0xbe, 0x9f, 0x6e, 0x30, 0xbe, 0x30, 0x05, 0xe2, 0x3d,
- 0x53, 0x12, 0xfd, 0x3e, 0x37, 0x4a, 0x84, 0x3d, 0x6c, 0xc3, 0xb7, 0xbe,
- 0xad, 0xb0, 0x1e, 0xbf, 0x8b, 0x52, 0xa6, 0xbd, 0x73, 0x59, 0x8d, 0xbe,
- 0x6c, 0xd9, 0x33, 0x3e, 0xe7, 0xc0, 0x9f, 0x3c, 0x6b, 0x2f, 0x93, 0xbe,
- 0x91, 0xcf, 0x07, 0x3d, 0xd7, 0x2d, 0x70, 0xbe, 0xe2, 0xd3, 0xfc, 0x3e,
- 0x1f, 0xb4, 0x32, 0x3e, 0xd3, 0x34, 0xad, 0xbe, 0xf4, 0xf3, 0xd4, 0xbc,
- 0x55, 0x04, 0x13, 0x3d, 0x61, 0x92, 0xd1, 0xbd, 0x6e, 0xa8, 0x00, 0x3c,
- 0x86, 0x07, 0xfb, 0xbe, 0xa4, 0xf3, 0xf7, 0xbc, 0xb0, 0x0f, 0x3e, 0x3e,
- 0xda, 0xbb, 0x05, 0xbf, 0xfc, 0x7b, 0xc4, 0xbd, 0x73, 0xca, 0x36, 0xbe,
- 0x5f, 0xbd, 0xa5, 0xbe, 0x39, 0xb7, 0x96, 0xbc, 0x7a, 0x54, 0x02, 0x3d,
- 0x98, 0x1b, 0x4d, 0xbc, 0xb2, 0xb0, 0xe8, 0xbe, 0x6e, 0x8f, 0x92, 0xbe,
- 0xf0, 0x86, 0x33, 0x3e, 0xf4, 0x5b, 0x2a, 0xbe, 0x9d, 0x2a, 0x40, 0x3e,
- 0xe3, 0x53, 0x67, 0xbe, 0x1f, 0xa7, 0xc3, 0xbe, 0xda, 0xa1, 0xc1, 0xbe,
- 0xd6, 0xbe, 0x9d, 0xbe, 0xaf, 0x52, 0xd5, 0x3d, 0x05, 0x42, 0xbb, 0xbe,
- 0x8a, 0x4a, 0xd0, 0x3e, 0x3e, 0xe6, 0x20, 0xbc, 0x7c, 0x71, 0xd7, 0x3e,
- 0x30, 0xc5, 0x1f, 0x3f, 0xcd, 0xca, 0xe0, 0xbd, 0x36, 0x53, 0xb2, 0x3e,
- 0x20, 0x64, 0xa0, 0xbe, 0x3a, 0x4c, 0xd2, 0xbe, 0xf5, 0x70, 0x9b, 0xbd,
- 0x2c, 0xf8, 0x12, 0x3f, 0xcd, 0xc4, 0xcc, 0x3e, 0x04, 0x6c, 0x68, 0xbe,
- 0xda, 0x3a, 0xdb, 0xbe, 0x73, 0x84, 0x4c, 0x3d, 0x0f, 0xff, 0x86, 0xbe,
- 0xc0, 0x7c, 0x86, 0xbe, 0x94, 0x4a, 0x0d, 0xbf, 0x7f, 0x95, 0x55, 0x3d,
- 0x0a, 0x07, 0x85, 0x3e, 0xf2, 0x31, 0xee, 0xbe, 0xcf, 0x99, 0x0d, 0x3f,
- 0xf2, 0x02, 0x7a, 0x3d, 0xeb, 0x44, 0x82, 0x3e, 0x3b, 0xb9, 0xff, 0x3c,
- 0x4c, 0x7d, 0xe3, 0x3e, 0x96, 0xb0, 0xb2, 0x3e, 0xb9, 0xf7, 0x5e, 0xbd,
- 0xb4, 0x43, 0xb2, 0x3e, 0x3e, 0x16, 0x8e, 0x3c, 0x0f, 0x9d, 0x30, 0x3c,
- 0x1c, 0xf8, 0xd9, 0xbc, 0x8d, 0x50, 0xae, 0xbe, 0x4e, 0x24, 0x72, 0x3f,
- 0xca, 0x18, 0x9b, 0xbe, 0x9f, 0xf7, 0x1b, 0xbf, 0xd9, 0x46, 0xcc, 0xbe,
- 0x01, 0x9b, 0x20, 0xbe, 0x57, 0x0b, 0xba, 0x3e, 0xd8, 0xee, 0x09, 0xbd,
- 0x0e, 0xe2, 0xc7, 0x3d, 0xc8, 0xe0, 0xe5, 0x3b, 0xf2, 0xfe, 0x91, 0x3e,
- 0x8f, 0xc2, 0xa8, 0xbe, 0x53, 0xd6, 0x82, 0xbd, 0xda, 0x7c, 0xc6, 0xbe,
- 0x3b, 0x06, 0x41, 0xbc, 0xcf, 0x57, 0xba, 0xbe, 0x88, 0xd2, 0xaf, 0x3e,
- 0xb6, 0x04, 0xe0, 0xbe, 0x99, 0xb5, 0x09, 0x3e, 0xb4, 0xb3, 0xc1, 0xbe,
- 0x9b, 0x61, 0x9e, 0xbd, 0x4c, 0x4a, 0x4e, 0xbf, 0x35, 0x7b, 0xc1, 0x3d,
- 0xf5, 0x3e, 0x88, 0xbe, 0x3c, 0x92, 0x17, 0xbe, 0x9c, 0x7f, 0xa1, 0xbe,
- 0xa9, 0xd3, 0x2d, 0x3f, 0xcc, 0x05, 0xb8, 0x3e, 0x3b, 0xec, 0xee, 0x3d,
- 0xbb, 0x1b, 0x84, 0x3c, 0x26, 0xa7, 0x18, 0x3d, 0x6a, 0x97, 0xbb, 0x3e,
- 0x64, 0x0d, 0x1f, 0xbe, 0x7d, 0xab, 0xdc, 0x3e, 0xae, 0x4d, 0x70, 0xbe,
- 0xfe, 0x89, 0x0f, 0xbe, 0x5c, 0x9b, 0xa2, 0x3e, 0xcd, 0xac, 0xe4, 0xbe,
- 0xda, 0x02, 0x49, 0xbf, 0x24, 0xcb, 0x8d, 0xba, 0x01, 0x6f, 0x15, 0x3d,
- 0xa8, 0x3a, 0x82, 0xbe, 0x0c, 0x59, 0xfe, 0xbe, 0x5e, 0x10, 0x42, 0x3e,
- 0x08, 0x04, 0x2a, 0xbd, 0xca, 0x96, 0xd4, 0x3e, 0x6e, 0x5b, 0x9e, 0xbd,
- 0xe4, 0xba, 0x3f, 0xbf, 0x5e, 0xab, 0x70, 0xbd, 0x59, 0xa1, 0x54, 0x3e,
- 0xfb, 0xf4, 0x87, 0xbe, 0x6f, 0x2d, 0x90, 0xbd, 0x8f, 0xd8, 0xc6, 0x3c,
- 0xe9, 0x9f, 0x01, 0x3f, 0x16, 0x81, 0xc1, 0xbd, 0xfc, 0x14, 0xc2, 0xbd,
- 0x03, 0x82, 0x2a, 0xbe, 0x8e, 0x59, 0x06, 0x3d, 0x2d, 0x2e, 0x6b, 0xba,
- 0x9a, 0xf9, 0xeb, 0xbd, 0xcc, 0xc0, 0x84, 0xbe, 0x36, 0x6f, 0x03, 0xbe,
- 0xae, 0xb7, 0xa6, 0x3e, 0x8b, 0x0d, 0xaf, 0x3d, 0x90, 0x74, 0x1a, 0x3d,
- 0x90, 0xc6, 0x4b, 0xbe, 0x12, 0xeb, 0xc8, 0xbd, 0x64, 0xb9, 0x03, 0x3f,
- 0x4f, 0xc9, 0x55, 0xbe, 0xa0, 0xe5, 0xce, 0xbe, 0x3e, 0x65, 0xf7, 0x3d,
- 0xa7, 0xb5, 0x5a, 0xbe, 0x2a, 0x45, 0x01, 0xbe, 0x34, 0x36, 0x33, 0x3f,
- 0x70, 0x43, 0xad, 0xbe, 0xd9, 0x1b, 0xd1, 0x3d, 0xc7, 0x37, 0xa3, 0xbe,
- 0xf4, 0xca, 0xaf, 0x3e, 0xe4, 0x2e, 0x32, 0xbe, 0x69, 0x42, 0x34, 0xbf,
- 0xf1, 0xa8, 0x32, 0x3e, 0x8c, 0x76, 0xba, 0xbe, 0x24, 0x0d, 0x2f, 0xbd,
- 0xf7, 0x39, 0x19, 0xbf, 0xc7, 0xe0, 0xfb, 0xbe, 0x52, 0x63, 0x4a, 0xbf,
- 0x3d, 0x6c, 0x48, 0xbe, 0x65, 0xd9, 0x43, 0x3f, 0x9b, 0x80, 0x44, 0x3f,
- 0x58, 0x6c, 0xd3, 0xbd, 0xff, 0xda, 0x63, 0xbe, 0xef, 0x2c, 0xa0, 0x3e,
- 0x85, 0x03, 0x1a, 0xbf, 0x92, 0x79, 0xcb, 0xbe, 0xf4, 0xed, 0xca, 0xbe,
- 0x7c, 0x1d, 0x02, 0x3d, 0x8d, 0xc2, 0x6f, 0x3e, 0x92, 0x58, 0x83, 0xbe,
- 0xc0, 0x7d, 0x34, 0x3d, 0x7e, 0x2a, 0x02, 0xbe, 0x40, 0x98, 0x3f, 0x3d,
- 0x10, 0xe9, 0x78, 0xbd, 0xf4, 0xeb, 0x62, 0x3d, 0xb0, 0x35, 0x35, 0x3c,
- 0x30, 0xbe, 0x45, 0x3c, 0xce, 0xdb, 0xd7, 0x3d, 0x20, 0xfa, 0xaa, 0xbb,
- 0xa3, 0xd5, 0x02, 0xbe, 0x80, 0x52, 0xfb, 0xbb, 0xa4, 0x64, 0xd1, 0xbd,
- 0xb0, 0x75, 0xf0, 0xbd, 0xe0, 0x08, 0x48, 0xbc, 0x52, 0xc9, 0xbf, 0xbd,
- 0xea, 0x03, 0xfb, 0xbd, 0x80, 0xf2, 0x4e, 0xbc, 0x36, 0xd6, 0x01, 0xbe,
- 0x4e, 0x33, 0xd5, 0x3d, 0x8d, 0xd9, 0x0a, 0x3e, 0x9c, 0x0e, 0x9b, 0xbd,
- 0x90, 0x0a, 0xca, 0x3d, 0x98, 0xaf, 0xc9, 0x3c, 0x02, 0xdc, 0xe3, 0x3d,
- 0x18, 0xd5, 0xad, 0x3d, 0x58, 0x95, 0x22, 0xbd, 0xe2, 0x9f, 0xfa, 0x3d,
- 0xea, 0xc8, 0xa9, 0x3d, 0x78, 0xc4, 0x88, 0x3c, 0xb4, 0x2d, 0x71, 0x3d,
- 0x30, 0x14, 0x1b, 0x3c, 0xc5, 0x11, 0x07, 0xbe, 0x30, 0x1d, 0x38, 0x3c,
- 0xc2, 0x83, 0xe4, 0x3d, 0x60, 0x69, 0x04, 0xbe, 0xf4, 0xd1, 0x8a, 0xbd,
- 0xf8, 0x76, 0xd0, 0xbd, 0x8e, 0xa0, 0xa0, 0x3d, 0x30, 0x6b, 0x4a, 0x3c,
- 0x90, 0x2a, 0x14, 0x3c, 0x98, 0x9b, 0xc6, 0xbd, 0x04, 0xd9, 0x8b, 0x3d,
- 0xe0, 0xcd, 0xa5, 0x3c, 0x3a, 0xd9, 0xe5, 0x3d, 0xd0, 0x3b, 0xdd, 0x3c,
- 0x9c, 0x8f, 0x8a, 0x3d, 0x18, 0xef, 0x89, 0x3d, 0x00, 0x1f, 0x37, 0xbc,
- 0x7e, 0x01, 0x93, 0x3d, 0x36, 0x73, 0xce, 0xbd, 0xdc, 0x6e, 0xdd, 0xbc,
- 0x18, 0xa2, 0xb4, 0xbc, 0xc0, 0x67, 0xbe, 0x3b, 0xa8, 0x9f, 0xbd, 0xbd,
- 0x22, 0x4f, 0x8f, 0x3d, 0xde, 0x6f, 0xbe, 0x3d, 0xb8, 0x36, 0xaf, 0x3d,
- 0x60, 0x41, 0xac, 0x3d, 0x11, 0xbd, 0x08, 0x3e, 0xf6, 0x90, 0xb1, 0xbd,
- 0xd6, 0x76, 0xe6, 0x3d, 0x70, 0x96, 0x4a, 0xbd, 0x00, 0x4e, 0x76, 0xba,
- 0x70, 0xc2, 0x5d, 0x3d, 0x14, 0x39, 0xb5, 0x3d, 0x64, 0x3e, 0x91, 0x3d,
- 0x6a, 0x6f, 0xae, 0x3d, 0xa6, 0x80, 0xe6, 0xbd, 0xc2, 0xbb, 0xe7, 0x3d,
- 0x70, 0x6d, 0xc1, 0x3d, 0x3a, 0x06, 0x4f, 0xbd, 0x84, 0xce, 0xba, 0xbd,
- 0xe0, 0xc9, 0x70, 0xbc, 0x20, 0x82, 0xd7, 0xbd, 0x26, 0x29, 0x0d, 0xbe,
- 0x10, 0x5e, 0x07, 0x3d, 0xd0, 0xd7, 0x23, 0xbc, 0x20, 0xf7, 0x67, 0xbc,
- 0xa0, 0x6e, 0xbd, 0x3c, 0x54, 0xb5, 0xde, 0x3d, 0x58, 0xdf, 0x6c, 0x3d,
- 0x4e, 0x18, 0x22, 0xbd, 0xc6, 0x14, 0xd7, 0xbd, 0x70, 0x8c, 0x6e, 0x3c,
- 0x9d, 0xc2, 0xde, 0xbd, 0xdb, 0xf2, 0x0b, 0x3e, 0x89, 0x8d, 0x01, 0x3e,
- 0x10, 0x7e, 0x4d, 0xbc, 0x00, 0x08, 0x57, 0x3a, 0x95, 0xcd, 0x04, 0x3e,
- 0xd0, 0x63, 0xd3, 0x3c, 0xe8, 0x8f, 0xbf, 0xbc, 0x9b, 0x0c, 0x89, 0xbd,
- 0xa8, 0xee, 0xa1, 0xbd, 0x2c, 0x51, 0x6b, 0x3d, 0x98, 0x14, 0xd7, 0x3c,
- 0xc6, 0xa1, 0x0b, 0xbe, 0x3b, 0x93, 0x0c, 0x3e, 0x2c, 0x40, 0x8c, 0xbc,
- 0xa4, 0x53, 0xa3, 0x3d, 0x50, 0xe8, 0xa2, 0xbd, 0x58, 0x34, 0xb3, 0xbc,
- 0x48, 0xfb, 0x4b, 0xbd, 0x11, 0x95, 0xf8, 0xbd, 0x08, 0x8a, 0xe0, 0xbd,
- 0x94, 0xc1, 0x9c, 0xbc, 0xef, 0xdf, 0xa6, 0xbd, 0x12, 0x3f, 0x88, 0xbd,
- 0xe0, 0xb1, 0x71, 0xbd, 0x48, 0x1e, 0xb9, 0x3d, 0x0e, 0xca, 0xc0, 0x3d,
- 0x80, 0x6b, 0x58, 0xbd, 0xf0, 0x97, 0xcc, 0x3d, 0xe2, 0x73, 0x93, 0xbd,
- 0xf2, 0xd7, 0xb1, 0xbd, 0x3c, 0xc4, 0x35, 0xbd, 0x3c, 0xce, 0x63, 0x3d,
- 0x13, 0x9d, 0x74, 0xbd, 0x0c, 0xf1, 0x96, 0xbd, 0xda, 0x6f, 0x84, 0xbe,
- 0x33, 0x8d, 0x63, 0x3d, 0x15, 0x29, 0xc9, 0x3d, 0x05, 0x8a, 0x71, 0xbb,
- 0x0f, 0x1f, 0x26, 0x3e, 0x49, 0xda, 0xf5, 0x3d, 0x73, 0x9d, 0x11, 0xbf,
- 0xa1, 0xea, 0x54, 0xbd, 0x44, 0x30, 0x7b, 0xbe, 0xa9, 0x13, 0x55, 0xbe,
- 0xfc, 0x4c, 0x05, 0xbe, 0xf4, 0xf2, 0x9e, 0xbe, 0x39, 0xca, 0x2e, 0xbc,
- 0x7c, 0x3f, 0x2c, 0x3e, 0x6c, 0x88, 0x41, 0xbe, 0x10, 0x50, 0x1c, 0xbe,
- 0xec, 0x33, 0x86, 0x3d, 0x6d, 0x06, 0x75, 0x3d, 0xb8, 0x35, 0x99, 0xbd,
- 0x26, 0x98, 0x89, 0x3d, 0xf5, 0xac, 0x85, 0xbc, 0x0a, 0x4f, 0xaf, 0xbd,
- 0x32, 0xbd, 0x89, 0x3e, 0x9a, 0xe0, 0xa4, 0x3d, 0xbd, 0x68, 0xbb, 0x3d,
- 0xe0, 0xa2, 0x0d, 0x3b, 0xfd, 0xba, 0x8c, 0xbc, 0x44, 0xc1, 0xcf, 0xbe,
- 0xc2, 0xd2, 0xef, 0xbb, 0xa8, 0x3f, 0x8c, 0xbe, 0x6d, 0x29, 0x81, 0x3c,
- 0xe8, 0x58, 0x0a, 0xbe, 0x65, 0xf3, 0x01, 0x3e, 0xc0, 0x94, 0x16, 0x3e,
- 0xc3, 0x0a, 0x1e, 0x3e, 0x05, 0x5e, 0xd3, 0xbe, 0x97, 0xf8, 0xc9, 0xbe,
- 0xce, 0x4c, 0x39, 0x3d, 0x66, 0x32, 0xa4, 0x3d, 0xbe, 0x01, 0x07, 0xbe,
- 0x9e, 0x9b, 0x35, 0x3d, 0x73, 0x7a, 0x11, 0xbf, 0x20, 0x96, 0x79, 0xbd,
- 0xcc, 0x62, 0xa3, 0xbe, 0x01, 0x32, 0xb7, 0xbd, 0x8f, 0xb6, 0x53, 0xbe,
- 0xee, 0x88, 0xd3, 0xbe, 0x3e, 0x8e, 0x10, 0xbc, 0x92, 0xac, 0x9f, 0x3e,
- 0xa9, 0xd4, 0xc9, 0xbd, 0x84, 0xf2, 0x2a, 0xbd, 0x7a, 0xae, 0x18, 0x3e,
- 0x35, 0x0d, 0x05, 0xbf, 0x81, 0x88, 0x18, 0x3d, 0x2b, 0xd4, 0x3f, 0xbe,
- 0x25, 0xd0, 0x7c, 0xbe, 0xbe, 0x21, 0x2e, 0x3c, 0x09, 0x61, 0x1b, 0x3e,
- 0xb0, 0x19, 0x1c, 0x3c, 0x9e, 0xd0, 0x28, 0x3e, 0x88, 0x62, 0xe7, 0xbd,
- 0x06, 0x53, 0xf4, 0x3d, 0x89, 0x94, 0x36, 0xbe, 0xcb, 0x86, 0x02, 0xbf,
- 0xde, 0x17, 0xfb, 0xbd, 0xb3, 0x23, 0x38, 0xbe, 0x0f, 0xea, 0xa2, 0xbd,
- 0x90, 0xf1, 0x1b, 0x3e, 0xef, 0x32, 0x44, 0xbe, 0xeb, 0x60, 0x8f, 0x3e,
- 0x63, 0x6c, 0x98, 0x3e, 0x0d, 0x2d, 0x2c, 0xbe, 0xe2, 0x80, 0xb7, 0x3d,
- 0xc5, 0xf2, 0x70, 0x3d, 0x42, 0x80, 0x09, 0xbe, 0x33, 0x58, 0x08, 0x3e,
- 0xd3, 0x5b, 0x6b, 0x3c, 0x58, 0x36, 0x97, 0xbe, 0x1c, 0x93, 0x9d, 0xbd,
- 0x26, 0xf5, 0x95, 0xbd, 0xb1, 0x1f, 0x04, 0xbc, 0x54, 0xea, 0xcc, 0xbd,
- 0xb5, 0x6a, 0x66, 0x3e, 0xa7, 0xc4, 0xda, 0xbc, 0x35, 0x47, 0x74, 0x3d,
- 0x27, 0xc8, 0x03, 0xbe, 0xa7, 0x9d, 0x1d, 0xbe, 0x55, 0xd9, 0x22, 0xbe,
- 0xf3, 0x64, 0xab, 0x3d, 0xed, 0x99, 0x4e, 0xbe, 0x94, 0x71, 0x8d, 0xbd,
- 0x75, 0x25, 0x8e, 0xbe, 0x2d, 0x87, 0x8f, 0xbd, 0xc1, 0x55, 0x91, 0xbd,
- 0x91, 0x1a, 0x72, 0xbd, 0x5a, 0x8c, 0xc8, 0xbd, 0xe7, 0xcf, 0x85, 0xbc,
- 0xb5, 0x86, 0xc8, 0x3c, 0xfb, 0x38, 0xa7, 0x3d, 0x8c, 0x6a, 0xde, 0xbd,
- 0x17, 0x3b, 0xd0, 0xbd, 0x50, 0xd3, 0x43, 0xbe, 0x24, 0x5d, 0x4f, 0x3c,
- 0x33, 0x37, 0xfe, 0x3d, 0x12, 0x93, 0x75, 0xbd, 0xa8, 0x40, 0x57, 0x3e,
- 0xef, 0xde, 0xac, 0x3d, 0xbc, 0x43, 0xb4, 0xbe, 0x7b, 0xf5, 0xe9, 0xbe,
- 0x01, 0x7a, 0x0c, 0x3e, 0x48, 0xe4, 0x3c, 0xbe, 0x7b, 0x66, 0x39, 0x3e,
- 0xbd, 0x7d, 0x8f, 0xbd, 0x72, 0xe1, 0xd5, 0x3d, 0x4e, 0xe3, 0xa9, 0x3d,
- 0x21, 0xde, 0xe7, 0xbe, 0x54, 0x9b, 0x95, 0x3f, 0xa4, 0x9c, 0xc4, 0xbd,
- 0xf0, 0xa7, 0xd8, 0x3f, 0x68, 0x4a, 0x73, 0x3f, 0x39, 0x8b, 0x26, 0x3f,
- 0x01, 0x34, 0x24, 0x3e, 0xcf, 0xb8, 0xa5, 0xbd, 0x6b, 0x06, 0xfa, 0xbe,
- 0xdd, 0x4a, 0xa6, 0xbf, 0x31, 0x14, 0xa0, 0xbd, 0x61, 0x7a, 0x05, 0xbe,
- 0x73, 0xe3, 0x4c, 0x3f, 0x4d, 0xfd, 0x46, 0xbf, 0x39, 0x76, 0x8b, 0xbf,
- 0x30, 0x1a, 0x2d, 0xbf, 0xbc, 0x83, 0x37, 0xbd, 0x74, 0x10, 0xf2, 0xbe,
- 0x10, 0xd8, 0x85, 0xbf, 0x74, 0x75, 0x11, 0xbf, 0x7f, 0xf6, 0x07, 0x3f,
- 0xf0, 0x04, 0x1a, 0x3f, 0x70, 0x40, 0x93, 0xbe, 0x14, 0xc6, 0xad, 0xbe,
- 0x5e, 0x16, 0x30, 0xbe, 0x0f, 0xb5, 0x90, 0x3e, 0xe3, 0x94, 0xf1, 0xbe,
- 0xfb, 0xb3, 0x02, 0xc0, 0x25, 0xb8, 0xa2, 0x3d, 0x65, 0x0d, 0xe4, 0xbe,
- 0x1a, 0xcf, 0x56, 0xbe, 0x3f, 0x27, 0x4c, 0xbf, 0x98, 0x32, 0x68, 0x3e,
- 0xfc, 0x61, 0x90, 0x3e, 0xf7, 0x44, 0xb4, 0xbd, 0xf8, 0x9c, 0x99, 0xbf,
- 0xd1, 0x30, 0x18, 0x3f, 0x21, 0x9d, 0xb2, 0xbd, 0xcc, 0x22, 0x5f, 0x3e,
- 0xcd, 0x48, 0x39, 0xbf, 0x40, 0xaf, 0xa0, 0xbe, 0x77, 0x6c, 0x96, 0xbd,
- 0x68, 0xee, 0x6f, 0x3e, 0xf0, 0x8b, 0x0c, 0x3f, 0x5c, 0xbc, 0x82, 0x3f,
- 0x38, 0xba, 0xce, 0xbd, 0xf5, 0xbc, 0x95, 0xbf, 0xbb, 0x64, 0xbe, 0x3d,
- 0xae, 0x02, 0xbf, 0x3e, 0x8f, 0x15, 0xf1, 0xbe, 0x48, 0xe7, 0xd4, 0x3f,
- 0xb0, 0xea, 0xbe, 0x3d, 0xb4, 0x41, 0x9a, 0x3f, 0x5a, 0xb0, 0x56, 0x3e,
- 0x43, 0xf0, 0x1b, 0x3f, 0xdb, 0xd8, 0x0f, 0xbf, 0xc5, 0x7b, 0xb8, 0x3f,
- 0xdb, 0x68, 0x97, 0x3e, 0x60, 0x1c, 0x99, 0xbf, 0x04, 0x8a, 0x3e, 0x3f,
- 0x70, 0xee, 0x03, 0x3e, 0x1e, 0x9f, 0x0d, 0xbf, 0xc5, 0xff, 0xa1, 0xbd,
- 0xfc, 0x0c, 0x4f, 0xbf, 0x61, 0x87, 0x51, 0xbe, 0x2b, 0x1b, 0x0b, 0x3f,
- 0x7f, 0xd3, 0x94, 0x3f, 0xe0, 0x10, 0x8d, 0x3e, 0xbc, 0xaa, 0xe2, 0xbe,
- 0x5f, 0x96, 0x64, 0x3e, 0xc8, 0xee, 0x7b, 0xbe, 0xb8, 0x98, 0x0b, 0x3e,
- 0x9e, 0x98, 0x4c, 0xbf, 0x3d, 0x74, 0xb8, 0x3e, 0x3f, 0x41, 0xea, 0xbe,
- 0x7f, 0xb5, 0x3a, 0xbd, 0x1e, 0x37, 0x7d, 0x3f, 0xa9, 0x74, 0x99, 0xbf,
- 0xe8, 0xbe, 0x8f, 0xbf, 0x64, 0xfb, 0x97, 0xbc, 0x46, 0xf2, 0x8a, 0xbb,
- 0x4a, 0x09, 0xe5, 0x3d, 0x5a, 0xb6, 0xfb, 0x3e, 0xd2, 0x43, 0x1a, 0xbf,
- 0x3e, 0x19, 0xc3, 0x3e, 0x21, 0x17, 0x09, 0x3f, 0x52, 0x3d, 0xc9, 0xbe,
- 0x8a, 0x84, 0x50, 0xbe, 0xf7, 0xcf, 0x9a, 0xbd, 0x38, 0x56, 0xa1, 0xbe,
- 0xe4, 0x99, 0x2f, 0x3f, 0x6f, 0x0c, 0x34, 0xbe, 0x47, 0x78, 0x3c, 0xbd,
- 0xca, 0x9b, 0xca, 0x3e, 0x93, 0xf5, 0xd1, 0x3e, 0xf2, 0x4c, 0x98, 0xbe,
- 0x37, 0x20, 0x74, 0x3f, 0xf8, 0x82, 0xef, 0xbe, 0x13, 0x5f, 0x63, 0x3f,
- 0xa9, 0x9c, 0xa3, 0xbf, 0xa7, 0xfb, 0xd7, 0xbe, 0x31, 0x27, 0x48, 0xbf,
- 0xb6, 0xea, 0x63, 0x3e, 0xdb, 0x10, 0xc1, 0x3f, 0x8b, 0x59, 0x4b, 0xbf,
- 0x07, 0xdb, 0xd7, 0xbd, 0x6c, 0x74, 0x25, 0x3e, 0x63, 0x22, 0x17, 0x3f,
- 0xcd, 0x1a, 0xc5, 0xbe, 0x1f, 0xe9, 0x25, 0x3f, 0x44, 0xb5, 0x55, 0xbe,
- 0x4b, 0xaf, 0x57, 0x3f, 0x89, 0x36, 0x8f, 0xbc, 0x39, 0xcf, 0x37, 0x3f,
- 0xd0, 0xa6, 0x7f, 0x3f, 0xf9, 0xf7, 0xba, 0xbe, 0x86, 0x94, 0x1a, 0xbe,
- 0x16, 0x4f, 0x6a, 0xbe, 0x44, 0xef, 0x58, 0xbe, 0xdd, 0xf2, 0x79, 0x3d,
- 0x9d, 0x07, 0x0e, 0xbe, 0x96, 0x78, 0x14, 0x3c, 0x34, 0x3f, 0x6b, 0xbe,
- 0x63, 0x12, 0xaa, 0x3d, 0x89, 0xd3, 0xf4, 0xbe, 0x52, 0xf5, 0x5a, 0x3e,
- 0x26, 0x8e, 0xfc, 0x3d, 0x39, 0x0f, 0xde, 0xbe, 0xb6, 0xa9, 0x8b, 0xbd,
- 0x3b, 0xad, 0x15, 0xbd, 0x3c, 0x13, 0x92, 0x3e, 0x7e, 0xa8, 0x7d, 0xbe,
- 0x8d, 0x66, 0x54, 0x3d, 0xbb, 0xa8, 0xd2, 0x3c, 0xc2, 0xd9, 0x25, 0x3e,
- 0x66, 0x31, 0x0b, 0x3e, 0x75, 0x54, 0x3d, 0xbe, 0x60, 0x72, 0x19, 0x3e,
- 0x1b, 0xeb, 0x93, 0xbe, 0x99, 0x6e, 0xae, 0xbe, 0xec, 0x94, 0x1d, 0xbf,
- 0x40, 0x29, 0x14, 0xbe, 0xd6, 0xe0, 0x86, 0x3e, 0x70, 0xfe, 0x06, 0xbf,
- 0x43, 0xf7, 0x19, 0x3e, 0x72, 0xa8, 0x05, 0xbe, 0xbf, 0xb9, 0x97, 0xbd,
- 0xc9, 0xd4, 0x72, 0x3e, 0xc0, 0xc3, 0x42, 0x3e, 0x1e, 0xb2, 0x9f, 0xbe,
- 0xf2, 0x31, 0xa6, 0xbe, 0x51, 0xdb, 0xba, 0xbe, 0xbb, 0x94, 0x9c, 0x3d,
- 0xe4, 0xf2, 0x10, 0x3f, 0xaa, 0x56, 0xe2, 0xbb, 0x5d, 0x9c, 0x13, 0xbe,
- 0x42, 0x5e, 0x55, 0x3e, 0x5d, 0x62, 0x6a, 0xbe, 0xf1, 0x84, 0xb6, 0xbc,
- 0xa8, 0xdf, 0xc2, 0xbe, 0x46, 0xbc, 0x23, 0x3e, 0x10, 0x2a, 0x7b, 0x3e,
- 0xec, 0x98, 0x1f, 0xbe, 0x8d, 0x8e, 0xd7, 0x3e, 0x0d, 0xdc, 0xc3, 0x3e,
- 0x69, 0x75, 0x9a, 0xbc, 0x18, 0xe1, 0xce, 0xbd, 0xcb, 0x41, 0x56, 0x3e,
- 0xab, 0xba, 0x87, 0x3e, 0x6a, 0xcf, 0x26, 0xbd, 0x49, 0x51, 0x45, 0xbe,
- 0xd7, 0xb7, 0xc9, 0xbc, 0x84, 0x0b, 0xe3, 0xbe, 0xcb, 0x4a, 0xe3, 0x3e,
- 0x2d, 0xc1, 0x34, 0x3e, 0xb3, 0xd9, 0x96, 0x3e, 0xcf, 0xf0, 0x3e, 0xbc,
- 0xf6, 0x87, 0xa7, 0xbe, 0xc4, 0x45, 0xa1, 0xbd, 0x79, 0x52, 0x0b, 0xbe,
- 0x96, 0xad, 0x6b, 0xbe, 0x11, 0xc2, 0xb9, 0xbe, 0x75, 0x1b, 0xcb, 0xbd,
- 0x11, 0xec, 0xd0, 0x3d, 0xd7, 0x6d, 0x71, 0x3e, 0x09, 0xa2, 0x87, 0xbe,
- 0xf5, 0x63, 0xb8, 0xbe, 0x52, 0x36, 0x8a, 0xbe, 0x17, 0xe8, 0xe3, 0xbe,
- 0x0c, 0x25, 0xbd, 0xbc, 0x89, 0xce, 0x91, 0xbc, 0x72, 0x70, 0x9c, 0xbe,
- 0xab, 0xbe, 0x4d, 0xbe, 0x73, 0x65, 0x82, 0xbe, 0xff, 0x76, 0xf3, 0x3e,
- 0x1f, 0x82, 0x34, 0x3e, 0x68, 0x63, 0xb9, 0xbe, 0xed, 0xf4, 0x14, 0xbe,
- 0x76, 0x4f, 0xd5, 0xbd, 0x9e, 0x47, 0x68, 0xbe, 0x0e, 0xf5, 0x42, 0x3e,
- 0x03, 0x8f, 0x34, 0xbe, 0x93, 0x86, 0xc9, 0x3d, 0xf2, 0xa8, 0x00, 0xbc,
- 0xae, 0x0d, 0x70, 0xbe, 0x5e, 0x12, 0x74, 0xbd, 0x63, 0x7d, 0x06, 0xbe,
- 0x92, 0x40, 0x92, 0xbe, 0xf4, 0x52, 0x47, 0x3e, 0xb6, 0xbb, 0x42, 0xbe,
- 0xc0, 0x55, 0xed, 0xbd, 0xea, 0x7d, 0x80, 0xbe, 0x12, 0x26, 0x10, 0xbe,
- 0xcf, 0x6c, 0x17, 0x3e, 0xee, 0xd6, 0x08, 0xbe, 0x54, 0xb7, 0x36, 0xbe,
- 0x22, 0xf7, 0xf6, 0x3d, 0x19, 0xca, 0x47, 0xbe, 0xf1, 0x54, 0xd5, 0xbe,
- 0xcd, 0x34, 0x81, 0xbe, 0xd1, 0x98, 0x84, 0x3e, 0x4f, 0xe8, 0x72, 0x3e,
- 0x39, 0x2a, 0x34, 0x3e, 0x45, 0xbe, 0x9a, 0xbe, 0x5c, 0x84, 0xad, 0xbe,
- 0xee, 0x0f, 0x99, 0x3e, 0x3b, 0x64, 0xab, 0xbe, 0x2a, 0xa3, 0x3e, 0x3e,
- 0xb9, 0x8a, 0x11, 0xbe, 0xbf, 0xfc, 0xa2, 0xbd, 0xa2, 0xcf, 0x7b, 0x3c,
- 0xb1, 0x5e, 0x5e, 0x3e, 0xe8, 0x7b, 0x16, 0x3c, 0x3b, 0x7c, 0x39, 0xbe,
- 0xef, 0x95, 0x92, 0xbe, 0x80, 0xa1, 0x22, 0xbe, 0xf1, 0x01, 0xf0, 0xbd,
- 0x8a, 0x59, 0x6b, 0xbc, 0x0e, 0x28, 0x8b, 0x3e, 0x10, 0x63, 0xd8, 0x3d,
- 0x32, 0xda, 0x4f, 0xbe, 0x12, 0x49, 0x1c, 0xbf, 0x19, 0xab, 0xd7, 0x3d,
- 0xb1, 0xf2, 0xa3, 0x3e, 0xa0, 0x13, 0xe0, 0xbe, 0x2b, 0xb5, 0x75, 0xbd,
- 0x3c, 0x1d, 0x5c, 0x3e, 0xdc, 0x7e, 0xb6, 0xbc, 0xea, 0x82, 0xc2, 0xbe,
- 0x07, 0xd0, 0x1c, 0xbe, 0xb6, 0x44, 0x95, 0xbd, 0x67, 0x41, 0x3b, 0xbe,
- 0xfd, 0xce, 0x53, 0xbe, 0x75, 0x4d, 0x0a, 0xbf, 0x3f, 0xe8, 0xf2, 0x3e,
- 0x07, 0xa5, 0x25, 0x3c, 0x27, 0x5d, 0xcf, 0xbe, 0x6f, 0x2e, 0x9c, 0xbe,
- 0x97, 0x98, 0x90, 0xbe, 0x28, 0xb9, 0x7c, 0x3e, 0x44, 0xbb, 0x67, 0xbe,
- 0x85, 0x56, 0x6a, 0x3e, 0x5b, 0x67, 0x65, 0x3d, 0x3b, 0x67, 0x06, 0x3e,
- 0x3e, 0xb5, 0x0d, 0xbf, 0x4c, 0x13, 0x91, 0xbd, 0xe3, 0x42, 0x97, 0xbe,
- 0x54, 0x68, 0xa6, 0xbe, 0x97, 0xc3, 0xd4, 0xbd, 0x5c, 0x6e, 0x46, 0x3d,
- 0x41, 0x04, 0xb1, 0x3e, 0xdf, 0xef, 0xdb, 0x3d, 0xb0, 0x6c, 0xad, 0xbd,
- 0x0a, 0x59, 0x47, 0xbd, 0x93, 0x23, 0xe8, 0xbe, 0x5a, 0x0c, 0x83, 0x3d,
- 0xec, 0x33, 0x9b, 0xbd, 0x81, 0x70, 0xef, 0xbd, 0x96, 0x2c, 0x21, 0x3e,
- 0x81, 0x86, 0x3b, 0x3e, 0x05, 0xe0, 0x9e, 0xbb, 0x5b, 0x97, 0xc0, 0x3d,
- 0x9b, 0xdd, 0xd3, 0xbd, 0x31, 0x63, 0xa5, 0xbd, 0xed, 0x07, 0xb6, 0x3d,
- 0xc2, 0x5d, 0x17, 0xbe, 0xde, 0xaf, 0xb7, 0xbe, 0x20, 0xca, 0x55, 0xbe,
- 0xe3, 0xc7, 0x41, 0xbe, 0xab, 0xfb, 0x59, 0x3e, 0x91, 0xbd, 0x86, 0x3e,
- 0xad, 0x95, 0x36, 0xbf, 0x06, 0x40, 0x38, 0x3e, 0x49, 0xb8, 0x27, 0xbe,
- 0xa2, 0x57, 0x25, 0x3d, 0x45, 0x72, 0x0e, 0xbe, 0xdb, 0x95, 0x08, 0x3c,
- 0xe8, 0x83, 0xaf, 0x3b, 0x30, 0xb4, 0x0e, 0x3e, 0x95, 0xb2, 0xeb, 0x3d,
- 0xfe, 0x51, 0x35, 0xbe, 0x87, 0xfe, 0x58, 0x3e, 0x5e, 0x2c, 0x0e, 0x3d,
- 0x72, 0x59, 0xa0, 0xbd, 0x33, 0xbc, 0x94, 0xbe, 0x46, 0x61, 0xfb, 0x3d,
- 0xa4, 0x9a, 0x4d, 0x3e, 0xfb, 0x2d, 0x7e, 0xbe, 0x82, 0x17, 0xd4, 0x3c,
- 0x67, 0x04, 0x99, 0xbd, 0x65, 0x78, 0x99, 0x3d, 0xce, 0xd1, 0x2b, 0xbe,
- 0x53, 0x69, 0x2b, 0x3e, 0x12, 0xf3, 0xbe, 0x3c, 0xff, 0xb4, 0xe3, 0xbc,
- 0x66, 0xef, 0x7c, 0x3e, 0xe0, 0x65, 0x71, 0x3d, 0x15, 0x65, 0x0a, 0x3e,
- 0x91, 0x93, 0x35, 0xbe, 0x41, 0x38, 0x92, 0xbe, 0xd1, 0x44, 0xf9, 0x3d,
- 0xdb, 0x33, 0xca, 0xbd, 0x3f, 0x5a, 0x1c, 0xbf, 0xb3, 0xf0, 0xe4, 0x3d,
- 0xd4, 0x65, 0xd1, 0xbd, 0xbe, 0x68, 0xdc, 0x3b, 0x4e, 0xd6, 0xb7, 0x3e,
- 0x30, 0xd9, 0x5a, 0xbe, 0x7d, 0xb6, 0x6d, 0x3c, 0x55, 0x07, 0x33, 0xbc,
- 0xde, 0x6b, 0x95, 0x3e, 0x2a, 0x33, 0x20, 0xbe, 0x7c, 0xd5, 0xc4, 0xbe,
- 0xdf, 0x18, 0xc3, 0x3b, 0x3f, 0xc0, 0xa7, 0xbe, 0x45, 0xe7, 0x12, 0xbf,
- 0xe9, 0x93, 0x89, 0xbe, 0xbe, 0x58, 0xaa, 0xbe, 0x9b, 0x84, 0x29, 0xbf,
- 0xbc, 0x8b, 0x8a, 0x3e, 0x6f, 0x55, 0xcf, 0x3e, 0xb5, 0x12, 0x7b, 0x3d,
- 0x2b, 0x7e, 0x9e, 0x3e, 0xa1, 0x71, 0x03, 0xbe, 0x8c, 0xa3, 0xcf, 0x3e,
- 0xb3, 0x2c, 0x15, 0x3e, 0xa9, 0x9f, 0x1d, 0x3d, 0x10, 0xd8, 0x03, 0xbd,
- 0x21, 0xfb, 0x79, 0xbe, 0x8e, 0x4a, 0x37, 0xbe, 0xdf, 0xe6, 0xf9, 0xbe,
- 0x2f, 0xd4, 0x83, 0x3e, 0x6f, 0x57, 0x9b, 0x3f, 0x13, 0xe6, 0x25, 0xbf,
- 0x43, 0x1a, 0x9b, 0xbf, 0x19, 0x25, 0x0c, 0xbf, 0xe1, 0xf0, 0x25, 0x3f,
- 0xcb, 0x66, 0x8e, 0x3e, 0x37, 0xac, 0x6e, 0x3f, 0xe8, 0xe9, 0x87, 0xbe,
- 0x6c, 0x56, 0x03, 0xbf, 0xe7, 0x31, 0x00, 0xbe, 0xc3, 0xc0, 0x21, 0x3f,
- 0x04, 0xfd, 0x9a, 0xbe, 0x11, 0x6e, 0xc0, 0x3e, 0x36, 0x99, 0x9d, 0xbf,
- 0x69, 0x85, 0xe9, 0xbf, 0xc0, 0x7e, 0x54, 0x3f, 0x18, 0x6d, 0xc1, 0xbe,
- 0x45, 0x72, 0x28, 0xbf, 0x49, 0x67, 0xcb, 0x3e, 0xf8, 0xb8, 0x6a, 0xbf,
- 0x9f, 0x69, 0xa6, 0xbe, 0xab, 0x73, 0x9f, 0xbf, 0xc4, 0x87, 0x14, 0xbe,
- 0x78, 0xb6, 0xcc, 0xbd, 0xba, 0x9a, 0xd8, 0x3d, 0x75, 0x1d, 0xe2, 0xbd,
- 0x0e, 0x1c, 0x7e, 0xbe, 0x1b, 0x41, 0xa7, 0x3d, 0x49, 0x37, 0xac, 0x3c,
- 0x27, 0x3d, 0x84, 0x3e, 0x3d, 0xeb, 0x1f, 0xbf, 0x33, 0xfb, 0xae, 0xbe,
- 0xe3, 0xb3, 0x45, 0x3f, 0xf9, 0xee, 0xc9, 0x3e, 0x8a, 0x82, 0x2b, 0xbf,
- 0xd3, 0x7e, 0x43, 0xbe, 0xdc, 0x4d, 0x11, 0xbf, 0xe7, 0xfd, 0x0b, 0xbf,
- 0x87, 0x6b, 0x84, 0x3e, 0xaf, 0x6a, 0x25, 0xbf, 0x3f, 0xe6, 0x0b, 0xbd,
- 0xda, 0x47, 0x21, 0x3f, 0x5c, 0x50, 0x19, 0x3d, 0xf1, 0xe9, 0xa6, 0x3e,
- 0xdd, 0xa8, 0x67, 0xbe, 0x8b, 0x7e, 0x49, 0x3f, 0x17, 0x61, 0x25, 0xbf,
- 0xb6, 0xff, 0x85, 0xbd, 0x36, 0xd0, 0x81, 0xbf, 0x81, 0x56, 0x3a, 0xbe,
- 0xff, 0xba, 0x67, 0xbe, 0xcf, 0x1e, 0xad, 0xbe, 0xaa, 0xce, 0x8b, 0xbf,
- 0xaa, 0xd7, 0x66, 0x3d, 0x57, 0x08, 0xb8, 0xbd, 0x10, 0x64, 0xa8, 0x3e,
- 0x07, 0x52, 0x83, 0xbf, 0x5d, 0x5b, 0x91, 0xbe, 0x5a, 0x01, 0x8f, 0x3e,
- 0xaf, 0x29, 0x4c, 0x3d, 0x6c, 0x13, 0x45, 0xbf, 0x34, 0x28, 0x1b, 0x3e,
- 0x91, 0x5c, 0x83, 0x3e, 0xc1, 0xc8, 0x64, 0x3e, 0xa8, 0x26, 0xa5, 0xbd,
- 0x09, 0x88, 0xae, 0xbf, 0xc7, 0xd5, 0x2e, 0x3d, 0x9b, 0xc6, 0x59, 0x3e,
- 0x39, 0x8b, 0x03, 0xbf, 0x85, 0xa5, 0x46, 0xbf, 0xc4, 0x8e, 0x80, 0xbf,
- 0xc1, 0x8c, 0x67, 0x3e, 0x74, 0x35, 0x1b, 0x3d, 0xc5, 0x63, 0x44, 0x3e,
- 0xd1, 0xbc, 0x74, 0x3c, 0x89, 0x4f, 0x5e, 0xbf, 0xc6, 0x00, 0xb5, 0x3e,
- 0xd5, 0xe8, 0x00, 0x3f, 0x1e, 0x6f, 0x1a, 0xbf, 0x86, 0x44, 0x2a, 0xbd,
- 0xaa, 0x1f, 0x05, 0x3f, 0x71, 0x04, 0x62, 0x3e, 0x9b, 0x68, 0xd6, 0xbd,
- 0x3f, 0x1e, 0x71, 0x3f, 0xe7, 0x1d, 0xa1, 0xbe, 0xd0, 0xda, 0x9a, 0x3f,
- 0x99, 0xc6, 0x10, 0x3f, 0xec, 0x9a, 0x11, 0xbf, 0xdf, 0xb5, 0xbf, 0xbf,
- 0x1a, 0x24, 0xbe, 0xbf, 0xd8, 0x15, 0x5f, 0xbd, 0x03, 0x52, 0xac, 0xbd,
- 0x72, 0x86, 0x90, 0xbe, 0xd1, 0x7f, 0xb7, 0x3a, 0x7c, 0x35, 0x5b, 0xbf,
- 0x0f, 0x7d, 0xe1, 0xbf, 0x04, 0xff, 0x5c, 0xbf, 0xf7, 0x65, 0x6d, 0x3d,
- 0x68, 0xd0, 0x62, 0x3f, 0xe7, 0x6a, 0x85, 0xbd, 0xa8, 0x2b, 0x65, 0x3f,
- 0x9f, 0xc4, 0x13, 0xbf, 0x69, 0xf3, 0xc8, 0x3e, 0x8a, 0x02, 0x2f, 0x3e,
- 0x0d, 0x64, 0xa1, 0xbf, 0x36, 0xbf, 0x72, 0x3f, 0x91, 0x7a, 0x4a, 0xbf,
- 0x3a, 0xcd, 0x89, 0x3f, 0x07, 0xa6, 0x32, 0xbd, 0x4e, 0xce, 0x32, 0xbf,
- 0x9f, 0x82, 0xc8, 0xbe, 0xb6, 0xc8, 0xd0, 0x3e, 0x27, 0x22, 0x84, 0x3f,
- 0x0b, 0xb6, 0x73, 0xbf, 0x53, 0x96, 0x53, 0xbf, 0x3a, 0x7a, 0xc8, 0xbf,
- 0xfb, 0x15, 0x78, 0xbd, 0x37, 0x38, 0x56, 0xbd, 0x02, 0x2a, 0x4b, 0xbe,
- 0x3e, 0x1b, 0xcf, 0x3c, 0xb3, 0x79, 0x04, 0x3e, 0x7c, 0x36, 0x18, 0x3d,
- 0x66, 0x6e, 0x75, 0x3a, 0xd9, 0xd9, 0x5b, 0x3e, 0x7c, 0x09, 0x24, 0xbf,
- 0x41, 0xb0, 0x07, 0x3e, 0x42, 0x0f, 0x2a, 0x3c, 0x28, 0x6a, 0xd6, 0xbe,
- 0xa2, 0x94, 0xb4, 0xbc, 0x55, 0x4b, 0xf7, 0xbd, 0x17, 0x02, 0x1f, 0x3e,
- 0x29, 0x47, 0xfe, 0x3d, 0x22, 0x35, 0xca, 0xbe, 0x60, 0x23, 0x88, 0xbd,
- 0x4d, 0xcf, 0xbc, 0x3d, 0xa6, 0xac, 0x2b, 0x3d, 0xe3, 0x6b, 0x49, 0xbe,
- 0x6a, 0x13, 0xdb, 0x3c, 0xb9, 0x8a, 0xd6, 0xbd, 0x0e, 0xb3, 0x9e, 0x3d,
- 0xd0, 0x65, 0xbd, 0x3d, 0x4d, 0x75, 0xf8, 0xbc, 0x75, 0x75, 0x2f, 0x3e,
- 0x87, 0x1d, 0x17, 0x3e, 0x48, 0x44, 0x9a, 0x3c, 0x6e, 0x0d, 0xc0, 0xbe,
- 0x44, 0xf9, 0xe4, 0xbd, 0x9a, 0xd0, 0x8f, 0xbe, 0x5c, 0xde, 0x8e, 0xbe,
- 0x01, 0x6c, 0x9d, 0xbb, 0xae, 0x53, 0x06, 0x3e, 0xff, 0x0f, 0x83, 0x3d,
- 0x20, 0x34, 0x16, 0xbc, 0x86, 0xfb, 0x15, 0xbe, 0xd8, 0x15, 0xe8, 0xbe,
- 0x93, 0xd7, 0xeb, 0x3d, 0xc7, 0xd7, 0x0e, 0xbd, 0xb5, 0x82, 0x8e, 0xbd,
- 0xd1, 0xd3, 0x31, 0xbe, 0xd9, 0xbb, 0x37, 0xbf, 0x48, 0xbe, 0xfc, 0xbd,
- 0xb0, 0xa4, 0x66, 0xbe, 0x76, 0x55, 0xc4, 0x3d, 0x83, 0x9f, 0xb5, 0xbe,
- 0xb6, 0xfc, 0x14, 0xbf, 0x27, 0xfd, 0xba, 0xbc, 0xd8, 0x14, 0x25, 0xbc,
- 0x6e, 0xef, 0xf4, 0xbc, 0xea, 0xa5, 0xf1, 0x3d, 0xe8, 0xa1, 0xe7, 0x3c,
- 0xd3, 0x94, 0x14, 0xbf, 0x21, 0x82, 0xd6, 0xbc, 0xef, 0x85, 0x32, 0xbe,
- 0x54, 0x52, 0xe1, 0xbd, 0x86, 0x5d, 0x1e, 0x3e, 0xe9, 0xf6, 0xe6, 0x3d,
- 0xa9, 0xa6, 0xbd, 0xb9, 0xa9, 0x14, 0x7d, 0x3d, 0x40, 0xa4, 0x7a, 0xbe,
- 0xab, 0x02, 0x01, 0x3e, 0xae, 0xc2, 0xc1, 0x3d, 0x36, 0x04, 0x22, 0xbf,
- 0x5c, 0xcc, 0xaf, 0xbd, 0x88, 0x1d, 0x6b, 0xbe, 0x03, 0x9f, 0x4a, 0xbc,
- 0x93, 0x23, 0xe2, 0x3d, 0x1c, 0x02, 0x9d, 0xbe, 0x63, 0xd2, 0x1e, 0x3e,
- 0x83, 0x39, 0x97, 0x3e, 0x4d, 0x31, 0x9a, 0xbe, 0x6b, 0xff, 0xa2, 0xbd,
- 0xa7, 0x57, 0x43, 0xbd, 0xba, 0x25, 0x6b, 0x3d, 0xb3, 0x98, 0x05, 0x3e,
- 0xf8, 0xe0, 0x1a, 0xbe, 0x71, 0xf6, 0xf2, 0xbd, 0xff, 0x64, 0x95, 0xbd,
- 0x0a, 0x57, 0xb6, 0xbe, 0x7f, 0xdd, 0x21, 0x3d, 0xf5, 0xbb, 0x05, 0x3e,
- 0x27, 0xbf, 0x58, 0xbd, 0x7b, 0xd6, 0xe4, 0xbd, 0xa9, 0xd5, 0x43, 0xbe,
- 0x61, 0x19, 0x02, 0xbe, 0xda, 0x76, 0xeb, 0xbd, 0xae, 0xea, 0x17, 0xbc,
- 0x8f, 0x91, 0x39, 0xbe, 0xc2, 0xd4, 0xf8, 0xbd, 0x8f, 0x4a, 0x73, 0xbd,
- 0x9c, 0x41, 0x8c, 0xbd, 0x81, 0x28, 0xb5, 0xbc, 0x6c, 0xbc, 0x89, 0xbc,
- 0x2d, 0x50, 0x9b, 0xbd, 0x1c, 0xe2, 0x2e, 0xbe, 0x19, 0x31, 0x99, 0x3d,
- 0x52, 0x65, 0x00, 0x3e, 0x74, 0xb5, 0x17, 0xbd, 0x60, 0xbc, 0x06, 0x3e,
- 0x06, 0xa6, 0xb7, 0x3c, 0x20, 0x9d, 0x53, 0xbe, 0x31, 0x28, 0x8e, 0xbc,
- 0x6b, 0xfb, 0x13, 0xbe, 0x94, 0x67, 0x83, 0xbd, 0x1a, 0x59, 0x2f, 0x3e,
- 0xce, 0x14, 0xb9, 0xbb, 0x48, 0x2f, 0xc2, 0xbe, 0x90, 0x9f, 0x82, 0xbe,
- 0xaf, 0x4a, 0x19, 0x3e, 0x8c, 0xd8, 0x88, 0xbe, 0xf3, 0x54, 0x20, 0x3e,
- 0xbf, 0x58, 0xef, 0x3d, 0x75, 0x46, 0x89, 0x3e, 0x6c, 0x10, 0x4c, 0xbb,
- 0x13, 0xa2, 0x96, 0xbe, 0x56, 0xde, 0x9f, 0x3f, 0xe5, 0x3b, 0x65, 0x3d,
- 0x38, 0x7b, 0xdc, 0x3f, 0x70, 0xaf, 0x5c, 0x3f, 0x55, 0x87, 0x4b, 0x3f,
- 0xfa, 0xd9, 0xb3, 0x3e, 0xa1, 0x3f, 0x19, 0xbc, 0xdf, 0xb8, 0xf9, 0xbe,
- 0x15, 0x22, 0xb9, 0xbf, 0x3e, 0x47, 0x29, 0xbe, 0x94, 0xf9, 0x34, 0xbe,
- 0x49, 0x8e, 0x47, 0x3f, 0xd5, 0x74, 0x1b, 0xbf, 0x53, 0x96, 0x9b, 0xbf,
- 0x80, 0x12, 0x10, 0xbf, 0x7c, 0x36, 0x58, 0xbe, 0xb6, 0xcb, 0x14, 0xbf,
- 0x8d, 0xea, 0x71, 0xbf, 0x51, 0x22, 0x02, 0xbf, 0x11, 0xb0, 0x1c, 0x3f,
- 0x4e, 0xdc, 0x2b, 0x3f, 0x08, 0xe2, 0xab, 0xbe, 0x96, 0x04, 0xba, 0xbe,
- 0x93, 0x38, 0xf1, 0xbd, 0xc5, 0xa2, 0x8f, 0x3e, 0x4f, 0x7b, 0xfd, 0xbe,
- 0xa5, 0x3a, 0x0f, 0xc0, 0x7d, 0x10, 0x8f, 0x3d, 0x55, 0x60, 0x82, 0xbe,
- 0x60, 0x9b, 0x24, 0xbe, 0xff, 0xa7, 0x62, 0xbf, 0x3d, 0x5e, 0x23, 0x3e,
- 0xa8, 0xce, 0xf2, 0x3e, 0xc9, 0xaa, 0xb2, 0x3c, 0xa3, 0xd1, 0x7b, 0xbf,
- 0x3c, 0x91, 0x16, 0x3f, 0xa6, 0x8d, 0x3c, 0xbd, 0x31, 0x76, 0xaa, 0x3e,
- 0x73, 0x51, 0x15, 0xbf, 0x00, 0x7f, 0x8b, 0xbe, 0x3e, 0x30, 0x3e, 0xbd,
- 0x1a, 0x10, 0xa1, 0x3e, 0x64, 0x2e, 0xda, 0x3e, 0x4b, 0xd3, 0x53, 0x3f,
- 0xd3, 0xf7, 0x82, 0xbe, 0x30, 0xc1, 0x86, 0xbf, 0x73, 0x99, 0x99, 0xbd,
- 0xae, 0xc9, 0xfc, 0x3e, 0x32, 0x49, 0x01, 0xbf, 0xdc, 0x4a, 0xcc, 0x3f,
- 0xc2, 0xab, 0x0a, 0xbd, 0x8e, 0x2e, 0x8c, 0x3f, 0x88, 0x06, 0x2b, 0x3d,
- 0x23, 0x80, 0xff, 0x3e, 0x60, 0x57, 0xb4, 0xbe, 0x9b, 0xa5, 0xbb, 0x3f,
- 0x91, 0xc4, 0xae, 0x3d, 0x88, 0xd1, 0x90, 0xbf, 0xae, 0xf7, 0x1d, 0x3f,
- 0xe6, 0x24, 0x0f, 0x3e, 0x0b, 0xe5, 0xe3, 0xbe, 0x0e, 0x0a, 0xc8, 0x3c,
- 0x50, 0xc1, 0x4c, 0xbf, 0x45, 0x83, 0xcf, 0xbd, 0x83, 0x8e, 0xe2, 0x3e,
- 0xf1, 0xc1, 0x71, 0x3f, 0x2c, 0x9f, 0xc4, 0x3e, 0x1e, 0x9f, 0xac, 0xbe,
- 0x78, 0xf6, 0xa6, 0x3e, 0x01, 0x7a, 0xc6, 0xbe, 0x3b, 0xfe, 0xa5, 0x3d,
- 0x22, 0xc6, 0x7c, 0xbf, 0xb8, 0x92, 0x94, 0x3e, 0xd5, 0x23, 0xa3, 0xbe,
- 0x32, 0x2e, 0x6e, 0xbe, 0x5e, 0x69, 0x94, 0x3f, 0xc7, 0xab, 0xb8, 0xbf,
- 0x5a, 0xd2, 0xad, 0xbf, 0x32, 0xe8, 0xbd, 0xbc, 0x64, 0x14, 0xf2, 0xbd,
- 0x64, 0xd5, 0x4b, 0x3d, 0xc3, 0x6b, 0x6f, 0x3e, 0x08, 0xdb, 0x2a, 0xbf,
- 0x7e, 0xd3, 0xcd, 0x3e, 0x21, 0xab, 0xbc, 0x3e, 0x84, 0x1f, 0x72, 0xbe,
- 0xfa, 0xef, 0xc7, 0xbd, 0x06, 0xab, 0x8d, 0x3c, 0x04, 0xc0, 0xd2, 0xbe,
- 0xda, 0x3e, 0x63, 0x3f, 0x12, 0x08, 0x75, 0xbd, 0x89, 0x45, 0x22, 0xbd,
- 0xdf, 0xae, 0xd3, 0x3e, 0x93, 0xe8, 0xce, 0x3e, 0xee, 0x6f, 0x69, 0xbe,
- 0x8f, 0x2f, 0x96, 0x3f, 0x66, 0xf9, 0x95, 0xbe, 0x09, 0x8a, 0x73, 0x3f,
- 0xa1, 0x0a, 0xbd, 0xbf, 0xd1, 0x5b, 0xca, 0xbe, 0x2b, 0x5d, 0x2d, 0xbf,
- 0x17, 0x57, 0x8d, 0x3e, 0xfd, 0x31, 0xc3, 0x3f, 0x77, 0x6a, 0x45, 0xbf,
- 0x33, 0x24, 0xb8, 0xbd, 0xac, 0x5d, 0xe4, 0x3d, 0x2f, 0xc0, 0x2a, 0x3f,
- 0xa3, 0x7e, 0xa8, 0xbe, 0x45, 0x95, 0x31, 0x3f, 0xaa, 0xce, 0x60, 0xbe,
- 0xab, 0x2b, 0x35, 0x3f, 0x7e, 0x12, 0x6c, 0xbc, 0x0f, 0xde, 0x34, 0x3f,
- 0x46, 0xc0, 0x89, 0x3f, 0x0e, 0x7e, 0xf9, 0xbe, 0xea, 0x83, 0x6a, 0xbe,
- 0xeb, 0xcd, 0x0a, 0xbe, 0x5d, 0x45, 0xc4, 0xbd, 0xbe, 0xfd, 0x54, 0x3d,
- 0xc8, 0x33, 0xa8, 0xbc, 0xf2, 0x0f, 0x16, 0xbe, 0x60, 0x1e, 0x45, 0xbe,
- 0x95, 0xbb, 0x3e, 0x3e, 0xa3, 0xc8, 0x80, 0xbe, 0xe9, 0xe8, 0x45, 0x3e,
- 0x0e, 0xb9, 0x2a, 0xbe, 0x66, 0x8d, 0xd8, 0x3d, 0x2d, 0x5f, 0xe7, 0x3c,
- 0xc1, 0x26, 0x53, 0xbe, 0xcd, 0x54, 0xd3, 0x3e, 0x44, 0x0c, 0x80, 0xbc,
- 0x8c, 0xa9, 0xd9, 0x3d, 0x05, 0xe3, 0xd5, 0xbd, 0x7e, 0xb5, 0x18, 0xbe,
- 0x59, 0x48, 0xbf, 0x3e, 0x96, 0xe0, 0x2d, 0xbe, 0xb6, 0x5a, 0x07, 0x3e,
- 0xbf, 0x72, 0x6e, 0xbe, 0x46, 0xe4, 0x94, 0xbe, 0x1d, 0x41, 0xe6, 0xbe,
- 0xf2, 0xad, 0x85, 0xbe, 0x04, 0x22, 0x3a, 0x3c, 0x6d, 0x06, 0xd5, 0xbe,
- 0xc7, 0xcc, 0x41, 0x3e, 0xcb, 0x3a, 0x19, 0xbc, 0xcf, 0x16, 0x23, 0xbe,
- 0x0a, 0xa7, 0x5b, 0x3e, 0xf7, 0xe2, 0xb5, 0x3d, 0xc9, 0xdb, 0xd8, 0x3d,
- 0x78, 0x72, 0x7d, 0xbe, 0x59, 0xc1, 0x72, 0xbe, 0x64, 0x69, 0xd3, 0x3d,
- 0x14, 0xce, 0x0e, 0x3e, 0x0e, 0x72, 0xf0, 0xbc, 0x3c, 0xbe, 0x23, 0xbd,
- 0xc8, 0x52, 0xe3, 0xbd, 0x74, 0xcc, 0x54, 0xbe, 0xa7, 0xbf, 0x78, 0x3d,
- 0xdf, 0xa2, 0xac, 0xbe, 0xf1, 0x01, 0x69, 0x3e, 0xfb, 0xa1, 0x7a, 0x3e,
- 0xfd, 0xfb, 0x88, 0xbe, 0xac, 0x47, 0x56, 0x3e, 0x7d, 0x38, 0x11, 0x3e,
- 0x68, 0x8c, 0x03, 0x3e, 0x4c, 0x59, 0x0c, 0x3e, 0xf8, 0x03, 0x15, 0xbd,
- 0xf7, 0xd8, 0x3d, 0x3e, 0x95, 0x98, 0x61, 0xbd, 0xdc, 0x02, 0x8d, 0xbe,
- 0x6a, 0x7d, 0x7d, 0xbd, 0xa6, 0xdf, 0x58, 0xbd, 0x05, 0xd3, 0xd4, 0x3d,
- 0xe1, 0xf4, 0x2d, 0x3e, 0x85, 0x80, 0x3c, 0x3e, 0xc7, 0x99, 0x08, 0xbd,
- 0xa6, 0x86, 0xc4, 0x3a, 0xff, 0xfc, 0x2b, 0x3e, 0x44, 0x82, 0xbc, 0xbc,
- 0x0d, 0x7b, 0x76, 0xbe, 0x3c, 0xdb, 0x04, 0xbe, 0xd9, 0x37, 0xad, 0x3d,
- 0x20, 0x88, 0x79, 0x3e, 0x9f, 0x6b, 0x92, 0x3e, 0xf7, 0xe8, 0xa5, 0xbe,
- 0x99, 0x6f, 0xc5, 0xbe, 0xa3, 0x4b, 0x8b, 0xbc, 0x27, 0x75, 0xa0, 0xbe,
- 0x97, 0xfd, 0xa5, 0xbe, 0x47, 0x63, 0xd6, 0xbd, 0x12, 0x8c, 0x3c, 0xbe,
- 0xcb, 0x8f, 0xa6, 0xbe, 0x1b, 0x9b, 0x2c, 0xbe, 0xb8, 0xd9, 0xd6, 0x3e,
- 0xe7, 0x2d, 0x53, 0x3d, 0xeb, 0x00, 0xb3, 0xbd, 0x61, 0xba, 0xb6, 0x3d,
- 0xfd, 0xdf, 0xcf, 0x3c, 0x9a, 0x6b, 0x0c, 0xbe, 0xc1, 0xa5, 0x6e, 0x3e,
- 0x86, 0xed, 0xa5, 0x3a, 0x31, 0xe5, 0x23, 0x3d, 0xce, 0x95, 0x7c, 0x3e,
- 0xf4, 0xe3, 0xd7, 0x3d, 0x53, 0x6c, 0x5d, 0x3e, 0x89, 0xcf, 0x1c, 0x3e,
- 0x92, 0x80, 0xf1, 0xbd, 0xdd, 0xdd, 0xa4, 0x3e, 0xaf, 0xe2, 0xca, 0xbe,
- 0xa2, 0xfb, 0xb2, 0xbe, 0x00, 0xfc, 0x60, 0xbe, 0xb7, 0x26, 0x65, 0xbd,
- 0x64, 0xc0, 0x87, 0xbd, 0x42, 0x3f, 0xe1, 0xbe, 0x08, 0xf7, 0xd7, 0xbc,
- 0x32, 0x01, 0x17, 0x3e, 0x7c, 0xb9, 0xac, 0xbe, 0x60, 0x79, 0x76, 0x3b,
- 0x10, 0x8c, 0x03, 0xbe, 0x09, 0x3d, 0xa0, 0x3e, 0x85, 0xcf, 0xe9, 0x3c,
- 0xe9, 0xe5, 0xe6, 0xbc, 0x55, 0x97, 0x47, 0xbd, 0xd7, 0xf5, 0xd2, 0xbd,
- 0x8a, 0x00, 0xb6, 0x3d, 0x88, 0x5d, 0x55, 0xbe, 0x95, 0xac, 0x8d, 0x3e,
- 0x69, 0x50, 0x46, 0xbe, 0x44, 0x72, 0xc2, 0x3c, 0x20, 0x57, 0x29, 0xbd,
- 0x55, 0x85, 0xf0, 0x3d, 0x57, 0x36, 0x61, 0x3e, 0x35, 0xb7, 0x88, 0xbe,
- 0x03, 0x16, 0xf8, 0xbd, 0xf7, 0xcb, 0xc0, 0xbd, 0x9d, 0xe3, 0xd3, 0xbd,
- 0x39, 0x53, 0x9a, 0x3d, 0x4c, 0x5e, 0x43, 0x3e, 0x39, 0xbf, 0xf6, 0x3e,
- 0x7a, 0x05, 0x83, 0xbe, 0xed, 0x16, 0x0b, 0xbf, 0xc3, 0x1a, 0x12, 0xbd,
- 0x38, 0x21, 0x47, 0x3d, 0x40, 0xaa, 0x06, 0xbc, 0x92, 0xf8, 0xd1, 0xbd,
- 0xc8, 0x73, 0x7d, 0x3d, 0x15, 0xa8, 0x01, 0xbe, 0x1a, 0xf8, 0xb0, 0xbe,
- 0x36, 0x92, 0x41, 0xbe, 0xb5, 0xbb, 0xa4, 0xbd, 0x27, 0x24, 0xd4, 0xbe,
- 0x0f, 0x47, 0x15, 0xbb, 0x60, 0x8c, 0x9c, 0xbe, 0x33, 0xce, 0x0b, 0x3f,
- 0xa1, 0xda, 0x77, 0xbe, 0x94, 0xab, 0x0a, 0xbf, 0x37, 0x3a, 0xba, 0xbe,
- 0xc2, 0xc1, 0x0e, 0xbf, 0xe1, 0x2a, 0x7a, 0x3d, 0x4a, 0xf4, 0x37, 0xbd,
- 0x5b, 0x35, 0x28, 0xbe, 0x4f, 0xef, 0x55, 0xbd, 0x8f, 0x65, 0x0d, 0x3e,
- 0x20, 0x7c, 0xb0, 0xbe, 0x06, 0xa2, 0x8e, 0xbd, 0x9e, 0x46, 0xbf, 0x3c,
- 0x6b, 0xd3, 0x97, 0xbc, 0x51, 0xd0, 0x9e, 0xbd, 0xa9, 0x5e, 0xd7, 0xbc,
- 0x01, 0xf9, 0x1f, 0x3b, 0x51, 0xed, 0x6e, 0x3d, 0x50, 0xa5, 0x38, 0xbe,
- 0x3c, 0x3b, 0x5e, 0xbe, 0xcb, 0x8f, 0xfd, 0xbe, 0x95, 0x2c, 0xaf, 0x3d,
- 0x8d, 0x25, 0x75, 0x3c, 0xdf, 0x83, 0x91, 0xbe, 0x28, 0xed, 0x96, 0x3e,
- 0x2c, 0x99, 0x48, 0x3e, 0x79, 0x01, 0xbb, 0xbe, 0xa2, 0xc1, 0xa6, 0x3d,
- 0x93, 0x75, 0xd6, 0xbd, 0x95, 0x55, 0x7d, 0x3e, 0x12, 0x83, 0x47, 0xbc,
- 0x60, 0x47, 0xb6, 0xbe, 0xe8, 0xd4, 0xdd, 0xbd, 0xeb, 0xf3, 0x8d, 0xbe,
- 0x75, 0x69, 0x79, 0xbe, 0x40, 0x59, 0x0d, 0x3f, 0x88, 0xca, 0xf2, 0xbc,
- 0x3c, 0xc7, 0x27, 0xbf, 0x5b, 0xb0, 0x9f, 0xbd, 0xc2, 0x10, 0x67, 0xbd,
- 0xbd, 0x62, 0xa3, 0x3e, 0x14, 0x6c, 0xe2, 0x3d, 0x31, 0xe1, 0x0c, 0xbd,
- 0x30, 0x36, 0xbf, 0xbb, 0x0a, 0xb2, 0x42, 0x3e, 0x41, 0xeb, 0x8a, 0xbc,
- 0x9a, 0x12, 0xef, 0xbe, 0x13, 0x33, 0x25, 0x3e, 0xa5, 0xfd, 0x46, 0xbe,
- 0x3e, 0x8b, 0x9d, 0xbd, 0x89, 0x32, 0xdd, 0xbd, 0xa1, 0x59, 0x43, 0x3e,
- 0xcd, 0xeb, 0x95, 0x3e, 0x5f, 0xb9, 0x24, 0xbe, 0x4e, 0x6e, 0x8f, 0xbc,
- 0x72, 0xda, 0x84, 0xbc, 0xc4, 0x5e, 0x2b, 0xbd, 0xbe, 0x3e, 0x13, 0xbd,
- 0x74, 0x5c, 0x30, 0xbe, 0xa2, 0x0f, 0xc7, 0x3d, 0xf6, 0xa1, 0x85, 0x3d,
- 0x25, 0x86, 0x82, 0xbd, 0xf2, 0xe8, 0xc4, 0x3b, 0x3e, 0x70, 0x78, 0xbe,
- 0x88, 0xc6, 0x59, 0xbb, 0xc3, 0x0b, 0x57, 0xbe, 0x4c, 0xf9, 0x48, 0x3e,
- 0xf9, 0xb4, 0xe3, 0x3d, 0x7a, 0xcb, 0x1b, 0xbf, 0xd7, 0x95, 0x8f, 0x3d,
- 0x51, 0x5d, 0x7f, 0xbe, 0xca, 0xbf, 0x36, 0x3d, 0x80, 0x58, 0x0e, 0xbe,
- 0x35, 0xc6, 0x84, 0xbe, 0xdc, 0xe9, 0x7e, 0x3e, 0xbe, 0x48, 0xee, 0xbd,
- 0xbb, 0xcd, 0x8d, 0x3e, 0x68, 0x92, 0xae, 0xbe, 0x7c, 0x18, 0x8a, 0xbd,
- 0x36, 0x63, 0x8e, 0x3d, 0x06, 0xb5, 0xd3, 0xbe, 0xaf, 0x97, 0x0b, 0xbb,
- 0x38, 0x1f, 0x71, 0xbe, 0x73, 0x1f, 0x06, 0xbe, 0x96, 0x80, 0x19, 0xbf,
- 0xce, 0x79, 0x4b, 0x3e, 0xbc, 0x3a, 0xa1, 0x3e, 0xe9, 0x77, 0xaa, 0x3e,
- 0x13, 0x07, 0xc8, 0x3d, 0x2e, 0x16, 0x0d, 0xbe, 0xd1, 0xab, 0x93, 0x3e,
- 0xf2, 0xc8, 0x23, 0xbe, 0x2f, 0xc7, 0x8f, 0x3e, 0x70, 0xdf, 0x1d, 0x3e,
- 0x24, 0x75, 0x26, 0xbd, 0xde, 0x4a, 0xd8, 0x3b, 0xa9, 0x9d, 0x42, 0xbf,
- 0xaf, 0xec, 0xdb, 0x3e, 0x32, 0x7c, 0x63, 0x3f, 0xdd, 0xb1, 0xd2, 0xbc,
- 0x0b, 0x9c, 0x64, 0xbf, 0x4b, 0x8a, 0xab, 0xbf, 0xe7, 0x68, 0xc8, 0x3e,
- 0xa0, 0x94, 0x75, 0x3e, 0x98, 0xb0, 0x83, 0x3f, 0x95, 0x9b, 0xbd, 0xbd,
- 0x82, 0xbe, 0x88, 0x3d, 0xb7, 0xb1, 0xb5, 0x3e, 0x9c, 0xe0, 0xe7, 0xbe,
- 0x1a, 0xad, 0x04, 0xbe, 0x86, 0x26, 0xb9, 0x3e, 0xae, 0x6d, 0xd5, 0x3e,
- 0x62, 0xb1, 0xbf, 0x3e, 0x37, 0x43, 0xa6, 0x3f, 0xbc, 0xfc, 0x18, 0x3e,
- 0xf3, 0x8b, 0x5f, 0xbc, 0xe6, 0x72, 0xbf, 0x3f, 0xab, 0xf8, 0x9d, 0xbf,
- 0xec, 0x16, 0x28, 0xbf, 0xf2, 0x2d, 0x35, 0xbf, 0xde, 0x44, 0x1f, 0x3f,
- 0xdc, 0x55, 0x04, 0x3f, 0xa8, 0x4e, 0xb4, 0x3e, 0x1f, 0xed, 0x47, 0x3f,
- 0x89, 0x56, 0x44, 0x3e, 0xf1, 0x2f, 0x73, 0x3d, 0x57, 0xb6, 0x6e, 0x3c,
- 0x58, 0x9d, 0x0e, 0x3f, 0xca, 0xd0, 0xf3, 0xbe, 0x93, 0x8f, 0x1b, 0xbe,
- 0xa9, 0x79, 0x7f, 0x3f, 0x7b, 0x9d, 0x01, 0xbf, 0x0f, 0x04, 0xbe, 0xbf,
- 0x44, 0xcc, 0x3c, 0xbf, 0x9c, 0xd8, 0x7c, 0xbe, 0x9e, 0x52, 0x2a, 0x3e,
- 0xed, 0x95, 0x0f, 0x3f, 0x1c, 0xec, 0x6f, 0x3f, 0x4e, 0xfb, 0x33, 0x3d,
- 0xa0, 0xa1, 0xa3, 0x3e, 0x6a, 0x89, 0xd7, 0x3e, 0x87, 0x06, 0x41, 0xbf,
- 0x60, 0x97, 0x68, 0x3e, 0x4e, 0x7f, 0x73, 0xbf, 0x7b, 0x08, 0xd1, 0x3d,
- 0x37, 0x98, 0x1e, 0x3d, 0x8b, 0x85, 0xdf, 0x3e, 0xd5, 0x13, 0x49, 0xbc,
- 0x40, 0x83, 0x39, 0xbf, 0x9e, 0x26, 0x47, 0xbe, 0x4b, 0x15, 0x6e, 0xbe,
- 0x72, 0x4a, 0x4d, 0xbe, 0xdf, 0x8d, 0xcf, 0x3e, 0xe5, 0xca, 0xad, 0xbd,
- 0x7b, 0xd6, 0xa8, 0xbe, 0xe5, 0x48, 0x49, 0x3f, 0xb0, 0x0d, 0x80, 0xbf,
- 0xda, 0x98, 0xf5, 0x3e, 0x2d, 0x85, 0xb1, 0x3e, 0x84, 0x1e, 0x0b, 0xbd,
- 0x2e, 0x3b, 0x48, 0x3f, 0xda, 0x23, 0x27, 0xbe, 0x79, 0x09, 0xad, 0x3e,
- 0xc9, 0x9f, 0x99, 0xbe, 0xb6, 0x2a, 0x54, 0xbf, 0xfc, 0xe8, 0x83, 0xbd,
- 0x53, 0x9d, 0x87, 0xbf, 0xdd, 0xa7, 0x0a, 0xbf, 0x92, 0x38, 0x5a, 0xbf,
- 0xe4, 0xd1, 0xb9, 0x3e, 0xa6, 0xef, 0x27, 0xbe, 0x85, 0xe7, 0x0d, 0xbf,
- 0x45, 0x88, 0x48, 0xbf, 0xa6, 0xac, 0x13, 0x3f, 0x56, 0x4b, 0x66, 0x3e,
- 0xcd, 0x3c, 0xb1, 0xbe, 0xb2, 0x36, 0x2e, 0xbe, 0xae, 0x74, 0xc0, 0x3c,
- 0xcf, 0x1d, 0x10, 0x3f, 0x96, 0x3c, 0x2e, 0x3e, 0xf5, 0x81, 0x47, 0xbf,
- 0x0a, 0x7c, 0x57, 0xbf, 0x75, 0x14, 0x6d, 0xbf, 0xdb, 0xb0, 0x1a, 0x3f,
- 0x45, 0xfa, 0xd1, 0x3e, 0xf5, 0xac, 0x88, 0x3d, 0xb5, 0xf6, 0x88, 0xbf,
- 0xc8, 0xf0, 0x57, 0xbf, 0xbb, 0xc7, 0x98, 0xbe, 0x01, 0xad, 0x7d, 0xbe,
- 0xac, 0x98, 0x5a, 0xbe, 0xc0, 0xb9, 0x2c, 0x3f, 0x29, 0x90, 0x43, 0xbf,
- 0xea, 0xf1, 0xe9, 0xbf, 0xe5, 0x64, 0xa7, 0x3e, 0x4c, 0x0b, 0xe1, 0x3e,
- 0x79, 0xaa, 0xed, 0x3e, 0x0f, 0x18, 0xf4, 0xbd, 0x2e, 0xb3, 0xfd, 0x3d,
- 0xc7, 0x8e, 0x08, 0xbe, 0x30, 0xcd, 0x88, 0xbf, 0x1d, 0x05, 0x87, 0xbe,
- 0x97, 0x8c, 0x33, 0xbf, 0xf3, 0x7b, 0x1a, 0x3f, 0xad, 0x3a, 0x2f, 0xbe,
- 0xd7, 0x2b, 0xc1, 0x3e, 0x95, 0x1f, 0x22, 0xbe, 0xfd, 0x6b, 0x8b, 0xbf,
- 0x9c, 0xe6, 0x1d, 0x3d, 0x53, 0x39, 0xd2, 0x3f, 0x05, 0x0d, 0x03, 0xc0,
- 0x5e, 0x99, 0xf4, 0xbf, 0x81, 0x51, 0x69, 0xbe, 0x1a, 0x9c, 0x79, 0xbf,
- 0x61, 0x73, 0x11, 0x3d, 0x71, 0x05, 0x25, 0xbe, 0xfa, 0x15, 0x37, 0xbe,
- 0x73, 0xec, 0x01, 0xbe, 0x00, 0x22, 0xa8, 0x3d, 0x47, 0x01, 0xd0, 0x3d,
- 0x52, 0xf7, 0xae, 0x39, 0x59, 0x9a, 0x92, 0x3d, 0x09, 0xb2, 0x30, 0xbf,
- 0x64, 0xde, 0x07, 0x3e, 0x80, 0x6c, 0x94, 0x3d, 0x20, 0xce, 0xc2, 0xbe,
- 0xf9, 0x71, 0xb0, 0xbd, 0xdd, 0xb9, 0xf2, 0x3d, 0x5d, 0x91, 0x4c, 0x3e,
- 0xdd, 0xad, 0xef, 0xba, 0xde, 0xec, 0x31, 0xbe, 0xe5, 0x84, 0xc7, 0x3c,
- 0x23, 0x9d, 0x82, 0xbd, 0x81, 0x11, 0x61, 0x3e, 0xbe, 0xcb, 0x2b, 0xbd,
- 0x42, 0xff, 0x34, 0x3e, 0xde, 0xaa, 0x0c, 0x3b, 0x54, 0x84, 0x4a, 0x3e,
- 0xdf, 0xf0, 0xd4, 0x3d, 0x52, 0xba, 0x3f, 0x3e, 0x06, 0x16, 0x33, 0x3e,
- 0x79, 0x7b, 0xdc, 0xbd, 0xb4, 0xfe, 0xd3, 0xbc, 0x7e, 0xdb, 0x1e, 0xbf,
- 0xdc, 0x06, 0x6c, 0x3c, 0x6b, 0xe4, 0x38, 0xbe, 0xca, 0x03, 0x31, 0xbd,
- 0x2a, 0xbf, 0x12, 0x3e, 0x06, 0x48, 0xcc, 0x3d, 0x57, 0x03, 0x14, 0xbd,
- 0x32, 0xa2, 0x52, 0xbe, 0x3f, 0xaf, 0x58, 0xbe, 0x88, 0x0b, 0x82, 0xbe,
- 0x4d, 0x5c, 0xee, 0x3b, 0x80, 0x67, 0x17, 0xbd, 0xaf, 0x10, 0x31, 0x3d,
- 0x0e, 0xdf, 0x48, 0xbe, 0xeb, 0x14, 0x41, 0xbf, 0x68, 0x59, 0x19, 0xbd,
- 0xf9, 0xcd, 0x04, 0xbe, 0x1e, 0x8f, 0xfc, 0xbd, 0xb0, 0xd1, 0x5e, 0xbd,
- 0xca, 0xa5, 0x17, 0xbf, 0xa8, 0x30, 0xae, 0xbc, 0x99, 0xe8, 0x1b, 0xbe,
- 0xdd, 0xf4, 0x37, 0xbd, 0x2f, 0xf1, 0x2c, 0x3e, 0xb3, 0x2f, 0x34, 0x3d,
- 0x54, 0xf7, 0x16, 0xbf, 0xb6, 0x82, 0xaa, 0xbd, 0x8b, 0x08, 0x61, 0xbc,
- 0x68, 0xda, 0x04, 0xbd, 0x9c, 0x73, 0x82, 0x3c, 0x70, 0xda, 0x83, 0x3d,
- 0xdc, 0x57, 0x56, 0x3d, 0xd2, 0x2c, 0xb4, 0xbc, 0xde, 0x31, 0x49, 0xbe,
- 0x38, 0x27, 0x05, 0xbd, 0x36, 0xf4, 0xa7, 0xbd, 0xde, 0xfd, 0x19, 0xbe,
- 0xad, 0xe8, 0xcc, 0x3d, 0x52, 0xb9, 0xa6, 0xbc, 0x87, 0xf7, 0xe9, 0x3d,
- 0xcc, 0x23, 0xe5, 0x3d, 0x7a, 0xe8, 0xed, 0xbd, 0x12, 0x7c, 0x3e, 0x3e,
- 0xd8, 0xcd, 0x24, 0x3b, 0x78, 0x2c, 0x8f, 0xbe, 0x8e, 0x04, 0x16, 0xbe,
- 0xc0, 0xcc, 0x5f, 0xbe, 0x11, 0x28, 0x09, 0xbb, 0x8f, 0x82, 0x60, 0xbb,
- 0xfc, 0x8e, 0x5b, 0x3b, 0x1d, 0x79, 0x69, 0xbe, 0xba, 0x7a, 0x31, 0x3d,
- 0x26, 0xb4, 0x87, 0xbe, 0xd4, 0xb5, 0x7b, 0x3d, 0x88, 0xd3, 0xc8, 0x3b,
- 0x73, 0x9c, 0xae, 0x3c, 0xe5, 0xe3, 0x3f, 0xbe, 0x73, 0x78, 0x98, 0xbd,
- 0xf5, 0xae, 0x65, 0xbc, 0xa1, 0x8c, 0x63, 0xbe, 0xe8, 0x5f, 0x54, 0xbd,
- 0x24, 0xa4, 0xff, 0x3d, 0x54, 0x70, 0x89, 0xbe, 0x71, 0x41, 0x5e, 0xbd,
- 0xf0, 0xa8, 0x02, 0xbe, 0xca, 0x3b, 0x0d, 0x3e, 0xc3, 0x1f, 0x4e, 0xbe,
- 0xab, 0x1b, 0x47, 0xbd, 0x4a, 0x29, 0xc9, 0xbe, 0xa1, 0x34, 0xcd, 0xbd,
- 0xa4, 0x92, 0x30, 0x3e, 0x8d, 0x9d, 0xe0, 0x3d, 0x1f, 0xf7, 0x48, 0x3e,
- 0x76, 0x5d, 0x39, 0xbe, 0xbb, 0xd8, 0xc2, 0x3d, 0x0c, 0x11, 0xce, 0x3d,
- 0x91, 0x48, 0xcc, 0x3c, 0x8b, 0xbf, 0xbd, 0x3d, 0x00, 0x25, 0x52, 0xbd,
- 0x6e, 0x41, 0x9c, 0xbd, 0x3b, 0xee, 0x83, 0xbe, 0xba, 0xa9, 0x43, 0xbd,
- 0xae, 0x45, 0xe3, 0x3d, 0xd8, 0x06, 0xb9, 0x3d, 0x19, 0xe0, 0xdd, 0xbd,
- 0x6a, 0xe8, 0x69, 0x3b, 0x8b, 0x5b, 0x45, 0x3e, 0x96, 0x93, 0x04, 0xbe,
- 0xec, 0x98, 0xfb, 0xbe, 0xb0, 0xe3, 0xb1, 0x3f, 0x9c, 0xad, 0x0c, 0xbd,
- 0x0e, 0xcf, 0xca, 0x3f, 0xf4, 0x3b, 0x3f, 0x3f, 0xff, 0x59, 0x36, 0x3f,
- 0x93, 0xf1, 0x66, 0x3e, 0x36, 0x1b, 0x01, 0x3e, 0x14, 0x47, 0x07, 0xbf,
- 0xe1, 0xad, 0xb8, 0xbf, 0xc9, 0x1f, 0x15, 0xbd, 0x19, 0xde, 0xdc, 0xbd,
- 0xa9, 0x73, 0x36, 0x3f, 0xcb, 0x68, 0x1e, 0xbf, 0x6d, 0x66, 0x98, 0xbf,
- 0x8e, 0x4f, 0xf5, 0xbe, 0xb2, 0x83, 0x20, 0xbe, 0x80, 0x18, 0xda, 0xbe,
- 0x57, 0xe8, 0x7b, 0xbf, 0xf0, 0x23, 0x1b, 0xbf, 0xd1, 0xa3, 0xec, 0x3e,
- 0x52, 0xad, 0x31, 0x3f, 0x0a, 0xef, 0xf1, 0xbe, 0x68, 0x22, 0xc4, 0xbe,
- 0x32, 0xfc, 0x4e, 0xbe, 0x3b, 0xda, 0x9c, 0x3e, 0x89, 0x87, 0x01, 0xbf,
- 0x87, 0xbc, 0x0d, 0xc0, 0xf7, 0x56, 0xa8, 0x3d, 0x0b, 0x39, 0xa6, 0xbe,
- 0x58, 0x23, 0x71, 0xbe, 0x33, 0xeb, 0x66, 0xbf, 0x37, 0x75, 0x85, 0x3e,
- 0x3a, 0x1c, 0xcd, 0x3e, 0xf7, 0xeb, 0x53, 0xbe, 0x9a, 0x56, 0x91, 0xbf,
- 0x8a, 0xe0, 0x3a, 0x3f, 0xa2, 0xdb, 0xba, 0xbc, 0x6f, 0xdb, 0x8b, 0x3e,
- 0xf9, 0xee, 0x3c, 0xbf, 0x44, 0x3c, 0x8e, 0xbe, 0x60, 0x1f, 0xaf, 0x3d,
- 0x90, 0xfa, 0x4c, 0x3e, 0xa2, 0x1a, 0xe7, 0x3e, 0x7c, 0x16, 0x7e, 0x3f,
- 0x85, 0xd8, 0xb7, 0xbe, 0x37, 0xe9, 0xa0, 0xbf, 0x95, 0xbd, 0xb7, 0xbd,
- 0x9e, 0x52, 0xe9, 0x3e, 0xd3, 0xf5, 0x95, 0xbe, 0x2a, 0x97, 0xd2, 0x3f,
- 0x99, 0x89, 0x05, 0x3e, 0xb0, 0x71, 0xa2, 0x3f, 0x2e, 0xa9, 0x00, 0x3d,
- 0x6d, 0xec, 0x1a, 0x3f, 0xc3, 0xcf, 0xff, 0xbe, 0x65, 0xe3, 0xab, 0x3f,
- 0x09, 0x85, 0x94, 0x3e, 0xa6, 0xe5, 0x9b, 0xbf, 0x32, 0x1b, 0x39, 0x3f,
- 0x74, 0x4e, 0x04, 0x3e, 0x3b, 0x51, 0x03, 0xbf, 0x2d, 0xa1, 0xac, 0xbd,
- 0x3c, 0xe4, 0x21, 0xbf, 0xa4, 0x67, 0xcb, 0xbc, 0x0b, 0x11, 0xfb, 0x3e,
- 0x8f, 0x94, 0x7f, 0x3f, 0x46, 0x91, 0xda, 0x3e, 0x9c, 0xd7, 0xa2, 0xbe,
- 0x29, 0x7d, 0x5b, 0x3e, 0x4f, 0xc5, 0xcd, 0xbe, 0xb7, 0x67, 0x0e, 0x3d,
- 0xac, 0x06, 0x74, 0xbf, 0x33, 0x93, 0x05, 0x3e, 0x61, 0x8a, 0xa3, 0xbe,
- 0x18, 0x1b, 0xcc, 0xbd, 0xfb, 0xa3, 0x9b, 0x3f, 0x77, 0xa2, 0xac, 0xbf,
- 0xc0, 0xf3, 0xab, 0xbf, 0xd3, 0x89, 0xf8, 0x3d, 0x84, 0x7b, 0x8d, 0xbd,
- 0x84, 0x86, 0xd6, 0x3d, 0x78, 0xa4, 0xe9, 0x3e, 0x92, 0x87, 0x52, 0xbf,
- 0x63, 0x33, 0x7f, 0x3e, 0x31, 0x8e, 0x02, 0x3f, 0x72, 0x0a, 0x6b, 0xbe,
- 0x2e, 0xbd, 0xf7, 0xbd, 0xe8, 0xfa, 0x82, 0xbd, 0xa0, 0xa7, 0xd1, 0xbe,
- 0x4a, 0x6f, 0x5b, 0x3f, 0x99, 0x5e, 0xab, 0xbd, 0xe7, 0xb6, 0x26, 0xbe,
- 0x0c, 0xbb, 0xba, 0x3e, 0x83, 0xb8, 0x0e, 0x3f, 0x8a, 0x44, 0x69, 0xbe,
- 0x67, 0xaf, 0x82, 0x3f, 0x2a, 0x9c, 0xbc, 0xbe, 0xe9, 0xd1, 0x75, 0x3f,
- 0xfd, 0xdf, 0xb8, 0xbf, 0x57, 0xec, 0xdc, 0xbe, 0xb7, 0x45, 0x63, 0xbf,
- 0x89, 0x50, 0xec, 0x3d, 0xf9, 0x5b, 0xbb, 0x3f, 0x27, 0x5d, 0x16, 0xbf,
- 0x52, 0x05, 0x28, 0xbe, 0x20, 0x68, 0x14, 0x3e, 0x99, 0xc0, 0x09, 0x3f,
- 0xe3, 0x1b, 0xed, 0xbd, 0xf5, 0x1c, 0x0b, 0x3f, 0xce, 0x5b, 0xb5, 0xbe,
- 0xaf, 0x75, 0x2f, 0x3f, 0xab, 0x48, 0x15, 0xbe, 0x89, 0xd8, 0x17, 0x3f,
- 0x45, 0x40, 0x93, 0x3f, 0xd5, 0x2a, 0xea, 0xbe, 0x2c, 0x31, 0x3d, 0xbe,
- 0xd2, 0xb1, 0x12, 0x3b, 0xef, 0x95, 0x9f, 0xbe, 0x47, 0x91, 0x11, 0x3d,
- 0x79, 0x55, 0x7c, 0xbe, 0x93, 0xfc, 0xd8, 0xbe, 0x43, 0xfc, 0x91, 0xbe,
- 0x4e, 0x58, 0x1e, 0x3e, 0x50, 0x52, 0x32, 0xbe, 0xaf, 0xd1, 0xab, 0x3e,
- 0xe9, 0x6a, 0x15, 0x3e, 0x14, 0x58, 0xcd, 0x3d, 0x2c, 0xd5, 0x36, 0xbd,
- 0x4b, 0x67, 0x0b, 0xbe, 0x98, 0xb7, 0xfe, 0x3e, 0x36, 0x3c, 0xa9, 0x3e,
- 0x93, 0x2a, 0x8c, 0xbd, 0x69, 0xdb, 0xeb, 0xbd, 0x20, 0x68, 0xcb, 0xbe,
- 0xff, 0x51, 0x2d, 0x3e, 0x31, 0x9c, 0xf3, 0xbd, 0x98, 0x64, 0xd9, 0xbd,
- 0x16, 0x18, 0x0e, 0xbf, 0x92, 0x22, 0x66, 0xbd, 0x80, 0x49, 0xe1, 0x3d,
- 0x67, 0x03, 0x07, 0xbf, 0x83, 0xde, 0x8f, 0xbe, 0xa4, 0x31, 0x19, 0xbe,
- 0x06, 0x51, 0x36, 0x3e, 0x68, 0xa1, 0xb9, 0x3d, 0x4d, 0x8d, 0x2a, 0x3d,
- 0xc1, 0xed, 0xbb, 0x3c, 0xf1, 0x29, 0xa3, 0x3e, 0xb9, 0x59, 0xa5, 0x3e,
- 0x5b, 0x24, 0xee, 0xbe, 0x63, 0x80, 0x73, 0x3d, 0xf5, 0xa6, 0x7a, 0x3e,
- 0xcb, 0x68, 0xa5, 0xbe, 0xd5, 0xf4, 0xe4, 0x3d, 0x22, 0x9a, 0x2e, 0xbe,
- 0x5f, 0xe4, 0x9f, 0xbe, 0x49, 0x60, 0xa0, 0x3e, 0x41, 0x83, 0x2b, 0xbd,
- 0xe1, 0x54, 0x2a, 0xbe, 0x62, 0x8e, 0x00, 0x3e, 0x9e, 0x56, 0x30, 0x3d,
- 0x34, 0xea, 0x02, 0xbe, 0xbd, 0x39, 0x08, 0x3e, 0xb8, 0x0a, 0x96, 0x3e,
- 0x6b, 0xe0, 0x8f, 0x3e, 0x7b, 0x4f, 0xb6, 0x3d, 0x62, 0xbf, 0xc4, 0xbd,
- 0xbf, 0xc3, 0xa4, 0xbc, 0x48, 0x45, 0xf5, 0xbe, 0xac, 0x0c, 0x94, 0xbe,
- 0x06, 0xe5, 0xdf, 0x3d, 0x05, 0x08, 0x40, 0xbd, 0x67, 0xfd, 0x7f, 0xbd,
- 0xf2, 0x7a, 0x2f, 0xbe, 0x32, 0x3a, 0x41, 0x3e, 0xa0, 0x1b, 0x22, 0xbd,
- 0xed, 0x9f, 0xfa, 0xbd, 0xd1, 0xda, 0x85, 0x3e, 0xd8, 0x20, 0x97, 0xbc,
- 0x84, 0xeb, 0x45, 0xbe, 0x5e, 0x3e, 0xac, 0xbd, 0xfb, 0x20, 0x1e, 0x3e,
- 0xdf, 0x75, 0xc6, 0x3c, 0x44, 0x30, 0x5b, 0x3e, 0x9b, 0x5a, 0x80, 0xbe,
- 0x1f, 0xd2, 0x55, 0xbe, 0x0b, 0x9f, 0xf4, 0x3d, 0x3f, 0x2b, 0x7c, 0xbe,
- 0xc9, 0x9f, 0xbd, 0xbe, 0x11, 0xe5, 0x84, 0x3b, 0xc0, 0xb0, 0x10, 0x3d,
- 0xc8, 0xf6, 0xa3, 0xbe, 0xfa, 0x10, 0x1b, 0xbe, 0x16, 0x20, 0x85, 0x3e,
- 0xf0, 0x90, 0x14, 0x3e, 0x4f, 0xf7, 0xf9, 0x3d, 0x6c, 0x57, 0x07, 0xbe,
- 0x9b, 0x92, 0xab, 0xbc, 0xc8, 0x76, 0x16, 0xbe, 0x64, 0x77, 0x25, 0x3e,
- 0x1d, 0xfb, 0x53, 0x3e, 0x7d, 0xda, 0xb3, 0xbe, 0x42, 0x68, 0x0a, 0xbd,
- 0x6a, 0xa9, 0x88, 0x3e, 0x6c, 0xd7, 0x01, 0x3d, 0x23, 0xa5, 0x65, 0x3e,
- 0x5e, 0xe8, 0xac, 0xbc, 0x50, 0xc0, 0x9c, 0x3e, 0xb2, 0x75, 0xee, 0xbe,
- 0xa6, 0xb7, 0x48, 0xbe, 0xff, 0x26, 0x4e, 0xbe, 0xfc, 0xfe, 0x72, 0x3d,
- 0x9f, 0x08, 0x75, 0xbe, 0xc8, 0x46, 0xd7, 0xbe, 0x49, 0xae, 0x12, 0xbe,
- 0x71, 0x1a, 0x80, 0x3e, 0xda, 0xeb, 0x90, 0xbd, 0x82, 0xc9, 0xff, 0x3d,
- 0x2d, 0xf8, 0xaa, 0x3c, 0x9e, 0xee, 0x3e, 0x3e, 0x63, 0x5c, 0xe3, 0x3e,
- 0xe7, 0xa4, 0x8a, 0xbe, 0x6c, 0x7a, 0x1e, 0xbe, 0x41, 0x46, 0xd5, 0xbe,
- 0x11, 0x76, 0x65, 0xbe, 0x59, 0x81, 0xbe, 0x3d, 0x2a, 0x42, 0xea, 0x3d,
- 0x32, 0xdd, 0x6a, 0xbe, 0xde, 0xa9, 0xe2, 0x3d, 0x84, 0x09, 0x91, 0xbe,
- 0x0d, 0x4b, 0xca, 0x3d, 0x22, 0xd2, 0x7b, 0xbe, 0xba, 0x60, 0xca, 0xbe,
- 0xf4, 0xa5, 0xf3, 0xbc, 0xd6, 0x1e, 0xea, 0xbe, 0xfb, 0xfa, 0xf9, 0x3d,
- 0x58, 0x8e, 0xbe, 0x3d, 0x94, 0x41, 0x9b, 0x3e, 0x5a, 0x36, 0x8b, 0x3e,
- 0x36, 0x7a, 0x29, 0xbf, 0x01, 0x9d, 0x2a, 0xbf, 0x36, 0x75, 0xbc, 0xbd,
- 0x59, 0xa9, 0x93, 0x3d, 0x67, 0x0b, 0x93, 0x3c, 0x33, 0x55, 0xae, 0xbe,
- 0x86, 0x92, 0x13, 0xbe, 0x02, 0x77, 0x50, 0xbe, 0xc3, 0x99, 0x93, 0xbe,
- 0x7c, 0x92, 0x88, 0xbe, 0xa1, 0xdf, 0x00, 0xbe, 0xf3, 0x8b, 0xe9, 0xbe,
- 0x3a, 0xa1, 0x21, 0xbe, 0x44, 0x6a, 0x34, 0xbe, 0x93, 0x55, 0x34, 0x3e,
- 0x82, 0xfe, 0x17, 0xbe, 0x23, 0x3d, 0x99, 0xbe, 0x60, 0xf4, 0xc6, 0xbe,
- 0xb6, 0x02, 0x6f, 0xbf, 0x77, 0xea, 0x55, 0x3d, 0x4d, 0xfe, 0xf3, 0xbd,
- 0x00, 0xdf, 0x1a, 0xbe, 0xbd, 0x95, 0x00, 0x3d, 0x52, 0x5f, 0xa0, 0xbd,
- 0x2c, 0x1e, 0xd9, 0xbd, 0x9f, 0xe8, 0x25, 0x3d, 0xf0, 0x20, 0x6c, 0x3c,
- 0xf1, 0x66, 0xab, 0xbe, 0x5c, 0xc7, 0xd7, 0x3d, 0xfc, 0xba, 0x0c, 0xbe,
- 0x44, 0x5a, 0x0e, 0xbe, 0xc2, 0xd6, 0xb5, 0x3d, 0xec, 0x48, 0xc3, 0x3c,
- 0xb9, 0x79, 0x8a, 0xbe, 0x1b, 0x7d, 0xb5, 0xbe, 0x51, 0x07, 0x2a, 0xbd,
- 0xc3, 0x09, 0x27, 0x3d, 0x33, 0x7b, 0xae, 0xbe, 0x85, 0xb3, 0xe2, 0x3d,
- 0x11, 0xc9, 0xc2, 0x3d, 0xea, 0xd5, 0x0b, 0xbf, 0x3a, 0x82, 0x03, 0x3e,
- 0xfb, 0x12, 0x5d, 0xbb, 0xce, 0x8b, 0x37, 0x3e, 0x1f, 0x2a, 0xab, 0xbe,
- 0xb7, 0x1a, 0x52, 0xbe, 0xfa, 0x09, 0x08, 0xbf, 0xbf, 0xd8, 0x99, 0x3d,
- 0x17, 0xa9, 0x3a, 0xbd, 0xe6, 0xed, 0x1c, 0x3f, 0xf6, 0xc5, 0x80, 0x3e,
- 0x65, 0x24, 0xe5, 0xbe, 0x6b, 0x54, 0x54, 0xbe, 0x9d, 0x81, 0xdb, 0xbd,
- 0xe2, 0xa7, 0x8e, 0x3e, 0x7f, 0x2f, 0x7d, 0x3e, 0x5d, 0x5e, 0x99, 0x3c,
- 0x12, 0x43, 0x45, 0xbd, 0xb8, 0x7e, 0xe7, 0xbd, 0x74, 0x63, 0x5e, 0xbd,
- 0xe8, 0xfa, 0x0e, 0xbf, 0xdf, 0x66, 0x20, 0x3e, 0x84, 0xd5, 0x93, 0xbe,
- 0x34, 0xec, 0xa4, 0x3e, 0x4c, 0x0f, 0xae, 0x3b, 0x3e, 0x94, 0x8b, 0x3e,
- 0xa6, 0x6f, 0x2a, 0xbd, 0x06, 0x7e, 0x99, 0x3c, 0x55, 0x55, 0xd3, 0xbd,
- 0x7a, 0xe3, 0x07, 0x3c, 0x03, 0x8d, 0xa3, 0x3d, 0xf3, 0xce, 0xa0, 0xbd,
- 0xd4, 0x84, 0x1b, 0x3d, 0x71, 0x95, 0x97, 0x3e, 0x3b, 0xce, 0xf1, 0xbc,
- 0x8a, 0x14, 0x38, 0x3d, 0x38, 0x21, 0xf0, 0x3d, 0x54, 0xf5, 0x46, 0xbe,
- 0xf6, 0xa2, 0x48, 0x3d, 0x1e, 0x6e, 0x80, 0x3d, 0x65, 0xdb, 0xaa, 0xbe,
- 0x18, 0xed, 0x46, 0x3e, 0x52, 0x24, 0x9d, 0xbe, 0xcc, 0x97, 0xa1, 0xbd,
- 0xa7, 0x84, 0x0f, 0xbc, 0x9d, 0x8b, 0x4e, 0xbe, 0x14, 0x82, 0xb6, 0xbe,
- 0x4b, 0x42, 0x09, 0xbe, 0xd0, 0x6f, 0x0f, 0x3e, 0x8b, 0x83, 0x76, 0x3c,
- 0x5e, 0x8f, 0xb8, 0x3d, 0x35, 0xb4, 0x11, 0xbe, 0x9a, 0xe4, 0xfc, 0xbd,
- 0x54, 0xef, 0x17, 0x3e, 0x45, 0xc4, 0xa6, 0xbd, 0x65, 0x3c, 0xc1, 0x3d,
- 0x2b, 0x29, 0x70, 0xbe, 0x9e, 0x6f, 0x1d, 0xbe, 0x99, 0x69, 0xf0, 0xbd,
- 0x4e, 0x30, 0x10, 0x3f, 0x22, 0x2d, 0x44, 0x3e, 0x31, 0x52, 0xdb, 0x3d,
- 0x76, 0x7e, 0xbb, 0x3e, 0x49, 0xcf, 0xdf, 0x3d, 0xef, 0xa2, 0xde, 0xbd,
- 0x18, 0xd0, 0xba, 0x3d, 0x6b, 0x2a, 0x84, 0x3e, 0x43, 0x0e, 0x12, 0xbd,
- 0x77, 0x47, 0xad, 0xbc, 0x97, 0xc8, 0x71, 0xbc, 0x09, 0xf1, 0xee, 0xbe,
- 0xf5, 0xb4, 0xc8, 0x3e, 0x7b, 0x8d, 0xc8, 0xbe, 0x83, 0x3e, 0x60, 0xbe,
- 0x56, 0x33, 0x57, 0xbd, 0x3a, 0x5f, 0x29, 0x3c, 0xa8, 0x5f, 0x23, 0x3f,
- 0xd6, 0x13, 0x02, 0xbe, 0x52, 0x59, 0x9f, 0x3f, 0xe3, 0x29, 0xed, 0xbe,
- 0x19, 0xc4, 0x0c, 0x3f, 0x02, 0xb5, 0x84, 0xbf, 0xb8, 0xa8, 0x2a, 0xbf,
- 0x1f, 0x85, 0xcb, 0x3e, 0xe3, 0x41, 0x10, 0x3f, 0xc8, 0x4b, 0x81, 0xbf,
- 0x58, 0xc8, 0x93, 0x3f, 0x8a, 0x1e, 0x06, 0xbe, 0xbd, 0x11, 0x93, 0xbd,
- 0x01, 0x7a, 0xb6, 0x3f, 0x3a, 0xcb, 0xea, 0x3e, 0x55, 0x7e, 0xf0, 0x3e,
- 0x86, 0xf4, 0x35, 0xbf, 0xef, 0x9b, 0x86, 0xbe, 0x0d, 0x4f, 0x22, 0xbe,
- 0x5b, 0x4b, 0xa4, 0x3e, 0xa0, 0xd8, 0xe1, 0xbd, 0x1a, 0x05, 0xb4, 0xbd,
- 0x49, 0xaa, 0xb8, 0xbe, 0xd2, 0x3f, 0xc9, 0xbd, 0x40, 0x45, 0xfa, 0xbe,
- 0x33, 0xfd, 0x26, 0xbf, 0x0a, 0x03, 0x7f, 0x3e, 0x8b, 0x82, 0xaa, 0xbe,
- 0x25, 0x97, 0x93, 0x3f, 0x46, 0x47, 0x71, 0xbd, 0x92, 0xaa, 0x27, 0xbf,
- 0x5a, 0xce, 0x2e, 0x3d, 0x19, 0xbb, 0x8f, 0x3f, 0xe4, 0xec, 0x2e, 0xbe,
- 0xc8, 0x80, 0x27, 0x3e, 0x5e, 0x73, 0x19, 0x3e, 0x61, 0x53, 0xf7, 0xbb,
- 0x5e, 0x65, 0xbc, 0x3e, 0x18, 0xe8, 0x9b, 0xbd, 0x9e, 0x40, 0xaa, 0xbf,
- 0x9a, 0x4f, 0x42, 0x3e, 0xb9, 0x6e, 0x9f, 0xbf, 0x7b, 0x69, 0x3e, 0xbf,
- 0x28, 0x83, 0x02, 0xbf, 0x3f, 0x3c, 0xa3, 0xbd, 0xde, 0x5b, 0x50, 0x3f,
- 0xc7, 0xbd, 0x4b, 0xbe, 0xc7, 0x97, 0xe8, 0x3c, 0x1d, 0x13, 0x83, 0x3d,
- 0x14, 0xe0, 0xa1, 0x3c, 0x2c, 0xd8, 0x9e, 0xbe, 0xb8, 0x13, 0x04, 0xbd,
- 0x53, 0xc8, 0xa5, 0x3f, 0xc5, 0xac, 0x6e, 0x3d, 0xc2, 0xc9, 0x67, 0xbf,
- 0x9c, 0xff, 0x45, 0x3e, 0x36, 0x52, 0x7b, 0x3c, 0x45, 0xd2, 0x5c, 0x3e,
- 0xe7, 0x60, 0xa0, 0x3f, 0x1b, 0xa3, 0xb7, 0x3e, 0x27, 0x2b, 0x90, 0xbe,
- 0xf4, 0x18, 0x33, 0x3f, 0xed, 0x6c, 0xf4, 0x3e, 0xbf, 0xca, 0x4d, 0x3f,
- 0xb1, 0xfc, 0xa6, 0x3e, 0x87, 0x51, 0xa8, 0x3e, 0x64, 0x39, 0xc8, 0xbe,
- 0x31, 0x04, 0x6a, 0x3f, 0x40, 0x8f, 0xa9, 0x3d, 0xd5, 0xaf, 0xa2, 0xbe,
- 0xda, 0xa5, 0x34, 0xbf, 0x0f, 0x90, 0x11, 0x3e, 0x05, 0x2c, 0x8f, 0x3d,
- 0x50, 0xfc, 0x11, 0xbf, 0x55, 0xfd, 0x02, 0x3f, 0x92, 0xd3, 0xbd, 0xbc,
- 0xca, 0x41, 0x44, 0xbe, 0x18, 0xaa, 0x09, 0x3f, 0x14, 0x9c, 0xc5, 0xbe,
- 0x70, 0x95, 0x05, 0xbe, 0xcb, 0xb1, 0xfd, 0x3e, 0x92, 0x0f, 0xc2, 0xbe,
- 0x12, 0x04, 0xe6, 0xbd, 0x5f, 0x09, 0x81, 0xbe, 0x72, 0xe0, 0xc4, 0xbe,
- 0x1b, 0xb8, 0xe6, 0xbe, 0x85, 0x75, 0x1f, 0xbe, 0x50, 0xdb, 0x12, 0x3f,
- 0xb9, 0x41, 0x59, 0xbf, 0x77, 0x7d, 0xcf, 0x3e, 0x3e, 0xa4, 0x2f, 0xbe,
- 0x81, 0xd1, 0xbf, 0x3e, 0x82, 0x2e, 0x14, 0x3e, 0xe2, 0x8d, 0x32, 0xbf,
- 0xb6, 0x0b, 0xc1, 0x3d, 0x7b, 0xe2, 0xf7, 0xbe, 0xbd, 0x85, 0x6a, 0x3f,
- 0xb2, 0xb2, 0x29, 0x3e, 0xac, 0x5e, 0x35, 0x3f, 0xf1, 0x1e, 0x04, 0x3e,
- 0x73, 0x73, 0x85, 0x3e, 0x73, 0xa6, 0x9f, 0xbe, 0x68, 0xa5, 0x1c, 0x3e,
- 0x3e, 0x99, 0x9c, 0x3e, 0x48, 0xcf, 0x09, 0x3e, 0x9f, 0xca, 0x9a, 0xbd,
- 0x87, 0xda, 0xce, 0xbe, 0xed, 0x19, 0x07, 0xbe, 0xb8, 0xb1, 0x78, 0xbf,
- 0x98, 0xa0, 0xab, 0xbf, 0x59, 0x3a, 0x20, 0xbf, 0x14, 0x7c, 0x37, 0xbf,
- 0xb0, 0x5c, 0x16, 0x3e, 0x1b, 0x87, 0x8b, 0xbc, 0xd1, 0xa5, 0x7b, 0xbe,
- 0xeb, 0xc7, 0x7a, 0x3d, 0x34, 0x2b, 0x09, 0x3c, 0x46, 0x67, 0xa2, 0x3d,
- 0x38, 0x70, 0xa7, 0xbd, 0x3c, 0xc9, 0xdc, 0xbd, 0x8b, 0xab, 0x24, 0xbf,
- 0x43, 0x78, 0x1f, 0x3e, 0xb0, 0x81, 0x2d, 0x3d, 0x4f, 0xbe, 0x4c, 0xbe,
- 0xdb, 0xeb, 0xe1, 0xbd, 0xfc, 0x0a, 0xf1, 0x3b, 0x06, 0x3d, 0x5b, 0x3d,
- 0xa0, 0x2a, 0xbd, 0x3b, 0x87, 0x5e, 0x32, 0xbe, 0x6b, 0xec, 0x0e, 0xba,
- 0xc1, 0x0c, 0x88, 0xbd, 0xbd, 0x14, 0x5e, 0x3e, 0xd3, 0x89, 0x7b, 0xbe,
- 0x7b, 0x98, 0xe2, 0x3c, 0x97, 0xcf, 0x37, 0x3c, 0x2d, 0x40, 0xb0, 0xbd,
- 0x47, 0xee, 0x5c, 0xbd, 0x10, 0x77, 0x53, 0x3e, 0xbb, 0x9b, 0x4c, 0x3d,
- 0x3a, 0xb3, 0x13, 0x3e, 0xd9, 0xd6, 0x0c, 0xbe, 0xf9, 0x2e, 0x23, 0xbf,
- 0xe7, 0x53, 0xb0, 0x3d, 0xe1, 0xda, 0xd7, 0xbd, 0x47, 0xae, 0xc7, 0xbd,
- 0xfe, 0x9c, 0xbb, 0x3d, 0xc9, 0x67, 0xa5, 0x3d, 0x13, 0xec, 0x5f, 0xbd,
- 0x66, 0x97, 0xa2, 0x3b, 0x5b, 0xfa, 0x2f, 0xbe, 0xd5, 0x7d, 0x47, 0xbe,
- 0x0b, 0x48, 0x04, 0x3e, 0xe5, 0x8e, 0xce, 0x3d, 0x45, 0x2d, 0x0b, 0xbd,
- 0x56, 0x53, 0xb0, 0xbb, 0x1a, 0xca, 0x3a, 0xbf, 0x9b, 0x26, 0xde, 0xbd,
- 0xdc, 0xc9, 0x97, 0xbe, 0xd4, 0x30, 0x0e, 0xbe, 0x11, 0x6a, 0x1e, 0xbe,
- 0x2d, 0x8d, 0x34, 0xbf, 0x6d, 0x8a, 0x36, 0xbe, 0x7c, 0xcd, 0x2c, 0xbe,
- 0x74, 0xd8, 0x00, 0xbe, 0x22, 0xa1, 0xef, 0x3d, 0xef, 0x9f, 0x82, 0xbd,
- 0x39, 0xff, 0xea, 0xbe, 0xa2, 0xe6, 0xd6, 0x3d, 0x87, 0x6d, 0x15, 0xbe,
- 0xe8, 0x0f, 0x5b, 0xbe, 0x1f, 0x9e, 0x79, 0x3d, 0x83, 0xf9, 0x65, 0xbd,
- 0x4a, 0x1d, 0xae, 0xbc, 0xfd, 0x22, 0x01, 0xbe, 0x51, 0xcc, 0xe4, 0xbd,
- 0xbd, 0x78, 0xd7, 0xbc, 0x3b, 0x52, 0x42, 0xbe, 0x9f, 0x11, 0x18, 0xbe,
- 0x7b, 0xe1, 0x0a, 0x3e, 0x4a, 0x62, 0x77, 0xbd, 0x21, 0x6f, 0xf1, 0xbc,
- 0x19, 0x9d, 0x45, 0x3e, 0x23, 0xe9, 0x0d, 0xbe, 0xd1, 0x7b, 0x4c, 0x3e,
- 0x06, 0xb0, 0x1c, 0x3d, 0x2f, 0x72, 0x43, 0xbc, 0xc2, 0x9a, 0xad, 0x3c,
- 0xd1, 0xb8, 0x12, 0x3d, 0x34, 0x82, 0xd5, 0x3d, 0x44, 0x95, 0xa4, 0x3c,
- 0x03, 0x94, 0x43, 0xbb, 0xbc, 0x63, 0xab, 0x3d, 0x95, 0xd5, 0xa4, 0x3d,
- 0x65, 0xec, 0xc5, 0xbd, 0x97, 0xd5, 0xcb, 0xbd, 0xc7, 0x67, 0x7c, 0x3d,
- 0xaa, 0x98, 0x27, 0xbe, 0x8d, 0x82, 0x40, 0xbe, 0x05, 0x17, 0xdb, 0xbd,
- 0xb5, 0xca, 0x02, 0xbe, 0xbb, 0x67, 0xbc, 0xbd, 0x34, 0x3f, 0xc6, 0x3d,
- 0x30, 0xbc, 0x32, 0x3e, 0x26, 0xbf, 0x2d, 0xbe, 0x4b, 0x9b, 0x25, 0xbd,
- 0xf2, 0xec, 0x7c, 0xbd, 0xa8, 0x50, 0x04, 0x3e, 0x27, 0x4a, 0x34, 0x3c,
- 0x8b, 0x03, 0xb0, 0xbd, 0xd2, 0xda, 0xc3, 0xbe, 0x02, 0x93, 0xb7, 0xbd,
- 0x8c, 0xb7, 0xf4, 0x3b, 0x28, 0xb7, 0xd7, 0xbd, 0xe3, 0x20, 0x02, 0x3e,
- 0x2f, 0x44, 0xde, 0xbd, 0x87, 0xa3, 0x2d, 0xbe, 0xb2, 0xe4, 0xf0, 0x3d,
- 0xa7, 0x79, 0xc0, 0x3c, 0x96, 0xd3, 0x91, 0x3c, 0xf8, 0xb6, 0x15, 0x3e,
- 0x2d, 0xad, 0x3e, 0xbd, 0xf7, 0xce, 0xf0, 0xbd, 0xd8, 0xdb, 0x3e, 0xbd,
- 0x30, 0xc0, 0xaa, 0xbd, 0xc4, 0x66, 0x35, 0x3e, 0x82, 0x9c, 0xe3, 0x3d,
- 0x10, 0x5e, 0x73, 0xbd, 0xa4, 0x34, 0x36, 0x3e, 0x83, 0x96, 0xca, 0xbd,
- 0x07, 0x4e, 0xcc, 0xbe, 0x0e, 0xb5, 0x9c, 0x3f, 0xc4, 0x21, 0x6f, 0xbd,
- 0x94, 0x40, 0xc9, 0x3f, 0x10, 0x7d, 0x47, 0x3f, 0x97, 0x87, 0x26, 0x3f,
- 0x23, 0x41, 0x73, 0x3e, 0xac, 0xe2, 0x93, 0x3c, 0x9b, 0x35, 0xb9, 0xbe,
- 0xe5, 0x1b, 0xaa, 0xbf, 0x94, 0xe8, 0x18, 0xbe, 0xe8, 0xba, 0x52, 0xbe,
- 0xd9, 0xc9, 0x33, 0x3f, 0x35, 0x8e, 0x22, 0xbf, 0x89, 0x94, 0x86, 0xbf,
- 0x72, 0x3c, 0x11, 0xbf, 0x1c, 0xc9, 0x59, 0xbd, 0x88, 0x38, 0xf0, 0xbe,
- 0x82, 0xd7, 0x93, 0xbf, 0x44, 0x00, 0x0e, 0xbf, 0x45, 0x3e, 0x17, 0x3f,
- 0x5f, 0xa8, 0xf7, 0x3e, 0x4c, 0xfd, 0x88, 0xbe, 0x80, 0x07, 0xde, 0xbe,
- 0x61, 0xa5, 0x82, 0xbe, 0x87, 0x0b, 0x3e, 0x3e, 0xbf, 0x8c, 0x1c, 0xbf,
- 0xa7, 0xd7, 0x00, 0xc0, 0x4c, 0xb1, 0x87, 0xbd, 0x07, 0x75, 0xea, 0xbe,
- 0x39, 0x01, 0x50, 0xbd, 0x29, 0x0f, 0x5d, 0xbf, 0xd7, 0xea, 0x0e, 0x3e,
- 0x06, 0xde, 0xd6, 0x3e, 0x29, 0xc3, 0x40, 0xbe, 0x76, 0xe8, 0x98, 0xbf,
- 0xc0, 0xa9, 0x52, 0x3f, 0xe9, 0xc5, 0x10, 0xbe, 0xfd, 0xa7, 0xc8, 0x3e,
- 0x9b, 0x23, 0x3c, 0xbf, 0x50, 0x25, 0x56, 0xbe, 0x02, 0x0b, 0x1e, 0xbb,
- 0x7c, 0x82, 0x97, 0x3e, 0x32, 0x6f, 0xe5, 0x3e, 0x6d, 0x77, 0x7a, 0x3f,
- 0xd8, 0xc8, 0x7d, 0xbe, 0x2f, 0x38, 0x97, 0xbf, 0xe1, 0x03, 0x88, 0xba,
- 0x2a, 0x76, 0x9e, 0x3e, 0x41, 0xfe, 0x90, 0xbe, 0xa8, 0x0c, 0xb7, 0x3f,
- 0xea, 0xc5, 0xb4, 0xbd, 0x00, 0x21, 0x9e, 0x3f, 0x00, 0xcb, 0x3c, 0x3e,
- 0x6d, 0x9e, 0x16, 0x3f, 0x3b, 0xa4, 0x1c, 0xbf, 0x75, 0x8e, 0xaa, 0x3f,
- 0x4c, 0x21, 0x06, 0x3e, 0xf4, 0x83, 0x92, 0xbf, 0x8e, 0x38, 0x0e, 0x3f,
- 0xea, 0x0b, 0xb8, 0x3d, 0xbd, 0xdf, 0xcc, 0xbe, 0x40, 0x91, 0x1e, 0xbd,
- 0xd2, 0xf1, 0x5b, 0xbf, 0xb1, 0x67, 0x94, 0xbd, 0x90, 0xa1, 0x95, 0x3e,
- 0x09, 0xcd, 0x82, 0x3f, 0xed, 0x71, 0x03, 0x3f, 0x9a, 0x2f, 0xb4, 0xbe,
- 0x2a, 0x5b, 0xb5, 0x3e, 0x7f, 0xd4, 0xd1, 0xbe, 0x0c, 0xbe, 0x34, 0x3c,
- 0x6a, 0x9c, 0x75, 0xbf, 0x7a, 0x7f, 0x42, 0x3e, 0x33, 0xa3, 0x9e, 0xbe,
- 0x2a, 0x1b, 0x8d, 0xbe, 0xe9, 0x15, 0x92, 0x3f, 0xef, 0x1f, 0xba, 0xbf,
- 0x9d, 0x36, 0x8e, 0xbf, 0xb2, 0x2f, 0x50, 0x3b, 0x28, 0x83, 0xfb, 0xbd,
- 0x0e, 0x62, 0xa4, 0x3d, 0xb5, 0xfb, 0x90, 0x3e, 0x6a, 0x3a, 0x4a, 0xbf,
- 0xa8, 0x9c, 0xaf, 0x3e, 0x6d, 0x17, 0xf3, 0x3e, 0x7e, 0xf1, 0xaf, 0xbe,
- 0x16, 0xb0, 0x2f, 0xbe, 0x8e, 0x5b, 0x1d, 0xbe, 0x66, 0x0c, 0x9e, 0xbe,
- 0x2a, 0x15, 0x6e, 0x3f, 0x39, 0x03, 0x8c, 0xbe, 0x7f, 0x2f, 0x3b, 0xbe,
- 0xe1, 0x45, 0xff, 0x3e, 0x31, 0x32, 0x16, 0x3f, 0x94, 0x22, 0xde, 0xbd,
- 0x75, 0x78, 0x8a, 0x3f, 0xa2, 0x7f, 0x9a, 0xbe, 0xc1, 0x78, 0x71, 0x3f,
- 0xa3, 0x97, 0xa2, 0xbf, 0x70, 0xff, 0x13, 0xbf, 0x17, 0xdc, 0x42, 0xbf,
- 0x2b, 0xed, 0x88, 0x3e, 0xc3, 0xe6, 0xd6, 0x3f, 0x9f, 0x6c, 0x2c, 0xbf,
- 0x35, 0xc0, 0xbc, 0xbd, 0x1e, 0x74, 0x70, 0x3e, 0xaa, 0xb1, 0x08, 0x3f,
- 0x8b, 0x6d, 0xa8, 0xbe, 0xac, 0x26, 0x06, 0x3f, 0x12, 0x62, 0xb3, 0xbe,
- 0xd5, 0x6d, 0x3a, 0x3f, 0x09, 0x1a, 0x2f, 0xbe, 0xb1, 0xbb, 0x13, 0x3f,
- 0x79, 0x9d, 0x92, 0x3f, 0xbb, 0xd1, 0xf1, 0xbe, 0xee, 0x65, 0x92, 0xbe,
- 0x89, 0xe7, 0xcd, 0xbd, 0x2f, 0xf2, 0xbd, 0xbe, 0x82, 0xd2, 0x0d, 0xbc,
- 0xaf, 0x3c, 0xb0, 0xbe, 0x1f, 0x0c, 0x0a, 0xbf, 0x58, 0x8b, 0x9a, 0xbe,
- 0x1c, 0x09, 0xd4, 0x3e, 0x1c, 0x9d, 0xac, 0xbe, 0x2b, 0x6d, 0x20, 0x3e,
- 0xba, 0x86, 0xee, 0xbd, 0x61, 0x9d, 0x0c, 0x3f, 0x4a, 0x7a, 0xcd, 0xbd,
- 0x43, 0x85, 0x46, 0x3c, 0xe0, 0x55, 0xf2, 0x3e, 0x1a, 0x0a, 0x06, 0x3f,
- 0x89, 0x88, 0xb5, 0x3e, 0x93, 0xd1, 0x51, 0xbe, 0xe4, 0xbc, 0x0a, 0xbd,
- 0x6e, 0xb4, 0x84, 0x3e, 0x88, 0x87, 0x55, 0x3d, 0x0b, 0xfc, 0xda, 0xbe,
- 0x16, 0x3a, 0x75, 0xbe, 0x03, 0x1a, 0xfb, 0x3c, 0x26, 0x9f, 0xde, 0x3e,
- 0x65, 0x72, 0x05, 0xbf, 0x20, 0x34, 0x7b, 0xbf, 0x79, 0xa0, 0xb5, 0xbd,
- 0x5e, 0x19, 0x1a, 0x3e, 0xa8, 0xbd, 0xd4, 0xbd, 0x29, 0x00, 0x4c, 0xbd,
- 0xbf, 0x9f, 0x4c, 0xbd, 0xd6, 0x8a, 0x99, 0x3e, 0x57, 0x83, 0xc8, 0x3e,
- 0x58, 0xc9, 0x45, 0xbe, 0x30, 0x78, 0xe6, 0xbd, 0x4c, 0xdd, 0xd6, 0x3e,
- 0x96, 0xf3, 0x2c, 0xbf, 0xd0, 0x39, 0x98, 0xbe, 0x3a, 0x52, 0xa1, 0xbe,
- 0xb9, 0x9a, 0x88, 0xbe, 0x06, 0x06, 0x19, 0x3f, 0x7f, 0x07, 0x5e, 0xbd,
- 0x6d, 0x36, 0xb1, 0xbe, 0x7b, 0x49, 0x75, 0x3e, 0xb7, 0x45, 0xf5, 0x3d,
- 0x72, 0x3c, 0x0f, 0xbe, 0x65, 0x8b, 0x5d, 0xbb, 0x9a, 0xe6, 0x09, 0x3e,
- 0xf6, 0x5f, 0xfe, 0x3e, 0xa7, 0x6c, 0x39, 0xbd, 0x05, 0xf8, 0x78, 0xbe,
- 0xbf, 0x0c, 0x3d, 0x3d, 0xbe, 0xf9, 0x84, 0xbe, 0x7a, 0x15, 0x0c, 0xbe,
- 0xc4, 0x88, 0x95, 0x3e, 0x0c, 0x87, 0xc6, 0x3d, 0x9c, 0x63, 0x50, 0xbd,
- 0xed, 0x3e, 0x98, 0x3d, 0x68, 0x5d, 0x02, 0xbd, 0x32, 0x78, 0x71, 0xbe,
- 0xb5, 0x07, 0x97, 0xbe, 0xce, 0xc5, 0x29, 0x3f, 0x51, 0xdd, 0xa4, 0xbe,
- 0x56, 0x69, 0x73, 0xbe, 0x57, 0x3d, 0xdc, 0xbd, 0xd7, 0x3e, 0xa6, 0x3e,
- 0xc2, 0xb3, 0x53, 0xbd, 0x8b, 0xc1, 0x66, 0xbd, 0x2d, 0xc0, 0x49, 0xbe,
- 0xb1, 0x6c, 0xe1, 0xbe, 0xb9, 0x15, 0xe8, 0x3d, 0x8c, 0x53, 0x0e, 0x3e,
- 0x49, 0x3d, 0x79, 0xbe, 0xb8, 0xbd, 0x89, 0xbd, 0xb7, 0x33, 0x6c, 0xbd,
- 0x88, 0x9e, 0x96, 0xbe, 0x5a, 0xd8, 0xd7, 0xbe, 0xd2, 0xc0, 0xa9, 0x3d,
- 0xe8, 0x5a, 0x94, 0x3e, 0x82, 0xfb, 0xc4, 0x3e, 0x93, 0x1a, 0x99, 0x3d,
- 0x62, 0xff, 0x55, 0x3e, 0xad, 0x3f, 0x23, 0xbd, 0xbc, 0x39, 0x6f, 0x3e,
- 0xb2, 0x30, 0xaf, 0x3e, 0x57, 0x80, 0x7b, 0xbe, 0x1a, 0x2f, 0x5e, 0x3e,
- 0x2c, 0x9a, 0xbc, 0x3e, 0x67, 0xc0, 0x6f, 0x3d, 0x98, 0xa1, 0x98, 0x3e,
- 0x30, 0x3e, 0x6b, 0x3e, 0xf9, 0x6a, 0x17, 0x3e, 0xd8, 0x0a, 0x90, 0xbe,
- 0x22, 0x87, 0x9a, 0xbe, 0x22, 0xb0, 0x79, 0xbe, 0x92, 0x57, 0x8d, 0x3e,
- 0x89, 0x6a, 0xaa, 0xbd, 0x07, 0x04, 0xbc, 0xbe, 0x19, 0x23, 0x00, 0xbd,
- 0x0f, 0xe2, 0xb3, 0x3e, 0x12, 0x24, 0x9c, 0x3e, 0xff, 0x56, 0xa9, 0x3e,
- 0x0e, 0xaf, 0x19, 0xbd, 0x85, 0xd1, 0xb4, 0x3e, 0xb9, 0xbd, 0x10, 0x3f,
- 0xff, 0x74, 0xcd, 0xbe, 0xde, 0x37, 0xbe, 0xbd, 0x98, 0x07, 0xc4, 0xbe,
- 0x4e, 0xd4, 0x2c, 0xbf, 0x70, 0xe2, 0x20, 0x3e, 0x2f, 0x93, 0x93, 0x3c,
- 0xc1, 0xae, 0xbf, 0xbe, 0x05, 0xd1, 0x53, 0x3d, 0x19, 0xb9, 0xb8, 0xbe,
- 0x1b, 0x82, 0xbd, 0xbd, 0x6a, 0x1b, 0x12, 0xbe, 0xee, 0x1a, 0x17, 0x3d,
- 0x6e, 0x48, 0xb7, 0x3e, 0x69, 0x4c, 0xeb, 0xbe, 0xa0, 0x02, 0x8a, 0x3e,
- 0x5e, 0x33, 0x8b, 0x3e, 0x2b, 0xc8, 0xee, 0x3e, 0xbf, 0x88, 0xe6, 0x3d,
- 0x4e, 0x86, 0x06, 0xbf, 0x3a, 0xc5, 0x43, 0xbf, 0xc6, 0x8e, 0xb0, 0x3c,
- 0x5e, 0x30, 0x45, 0xbe, 0xc8, 0x70, 0x80, 0x3d, 0x96, 0xcf, 0x35, 0xbf,
- 0x70, 0x1a, 0x7c, 0xbe, 0x5d, 0x6a, 0x92, 0xbe, 0x34, 0x90, 0x7a, 0xbe,
- 0x72, 0x90, 0x8a, 0xbc, 0x63, 0x34, 0x36, 0xbd, 0xf4, 0xc5, 0x6e, 0xbe,
- 0x31, 0x6d, 0x37, 0xbe, 0xf7, 0xa0, 0xab, 0x3d, 0x19, 0x5f, 0x8b, 0x3e,
- 0x76, 0x6f, 0xdb, 0xbe, 0xa4, 0x05, 0x1e, 0xbf, 0xce, 0x07, 0xd2, 0xbc,
- 0x31, 0x3a, 0x96, 0xbf, 0xb0, 0x33, 0x1e, 0xbf, 0x4e, 0x66, 0x45, 0x3e,
- 0x06, 0xea, 0xf3, 0xbe, 0x03, 0x4f, 0x29, 0xbe, 0x08, 0xd7, 0x0a, 0x3d,
- 0x06, 0x3f, 0x0c, 0x3e, 0x5f, 0x0e, 0xb6, 0x3e, 0x22, 0x8a, 0x5b, 0x3c,
- 0xcf, 0xba, 0x84, 0xbd, 0x56, 0xf5, 0x93, 0xbd, 0x21, 0x01, 0xec, 0xbd,
- 0xd2, 0xe4, 0x16, 0xbe, 0x35, 0xb1, 0xaf, 0x3e, 0x3e, 0xce, 0x23, 0x3d,
- 0x68, 0x6f, 0xd1, 0xbe, 0x9f, 0xc6, 0xae, 0xbd, 0x88, 0x1e, 0x15, 0xbc,
- 0x93, 0xe9, 0x7f, 0x3e, 0xdc, 0x08, 0x70, 0xbe, 0xfb, 0xbb, 0xe3, 0x3e,
- 0xbc, 0x4b, 0x42, 0xbe, 0x6d, 0x48, 0x6c, 0xbe, 0xd2, 0x3e, 0xf9, 0x3d,
- 0x4e, 0xda, 0x85, 0x3e, 0xb8, 0xc0, 0x09, 0x3d, 0x07, 0x72, 0xb4, 0xbe,
- 0xc1, 0x08, 0xb7, 0xbe, 0xc2, 0x00, 0x68, 0xbe, 0x67, 0x67, 0xbd, 0x3d,
- 0x19, 0x85, 0x39, 0xbe, 0x0e, 0x0a, 0x1c, 0x3f, 0x3c, 0xb5, 0x42, 0x3e,
- 0x2e, 0x96, 0xee, 0xbd, 0x79, 0x67, 0xac, 0xbe, 0xcb, 0x64, 0x5f, 0xbe,
- 0x12, 0x22, 0x13, 0x3e, 0x0a, 0x24, 0xb2, 0x3e, 0x56, 0x35, 0x3e, 0xbe,
- 0xc6, 0xf9, 0x08, 0x3d, 0x5d, 0x51, 0x40, 0xbe, 0xa8, 0xf4, 0x23, 0x3e,
- 0xc8, 0x2b, 0x2b, 0xbf, 0xd8, 0xa9, 0x76, 0xbd, 0xb2, 0x95, 0x14, 0xbf,
- 0xf7, 0xca, 0x57, 0x3e, 0xbd, 0x39, 0xf0, 0x3d, 0x87, 0x21, 0x98, 0x3e,
- 0xf5, 0xf1, 0x1c, 0xbe, 0x86, 0xc2, 0x23, 0x3e, 0x13, 0x79, 0xb5, 0xbd,
- 0x10, 0x56, 0x3d, 0xbe, 0x0f, 0x71, 0xbf, 0xbe, 0xac, 0x29, 0x59, 0x3e,
- 0x95, 0x76, 0x75, 0xbe, 0x8d, 0x09, 0xd1, 0x3e, 0xb2, 0x8e, 0xb3, 0x3d,
- 0x72, 0x0b, 0x03, 0x3e, 0x6d, 0xc4, 0x8a, 0x3e, 0xb4, 0xa0, 0xba, 0xbe,
- 0xff, 0x74, 0xdb, 0xbc, 0x92, 0xce, 0x85, 0x3e, 0xa0, 0xed, 0x4e, 0xbe,
- 0x2f, 0x0a, 0x2c, 0x3e, 0xd9, 0x41, 0x8c, 0xbe, 0x4b, 0x6d, 0x4c, 0x3d,
- 0x5e, 0x36, 0xae, 0xbc, 0xef, 0x82, 0xc4, 0xbe, 0x9f, 0x0d, 0xf7, 0xbe,
- 0xd7, 0xda, 0x16, 0xbe, 0xd6, 0x4f, 0x14, 0x3e, 0xfe, 0x35, 0x97, 0xba,
- 0xcf, 0x2a, 0xf1, 0x3d, 0x15, 0xa5, 0xc7, 0xbe, 0xa2, 0x87, 0xba, 0x3d,
- 0x3b, 0x78, 0x82, 0x3d, 0x85, 0xcc, 0xb3, 0xbc, 0x92, 0x97, 0xa7, 0x3e,
- 0x95, 0x31, 0x7f, 0xbd, 0xd5, 0x22, 0x6f, 0x3d, 0x62, 0xea, 0xd2, 0x3e,
- 0xfd, 0xc4, 0xca, 0x3e, 0xee, 0x4d, 0x7f, 0x3c, 0x5c, 0x20, 0x0e, 0x3e,
- 0xeb, 0xe1, 0xd0, 0x3d, 0x14, 0x9b, 0xe3, 0x3c, 0x93, 0x75, 0x9e, 0x3c,
- 0xd1, 0xe2, 0x2a, 0xbe, 0x2f, 0xa1, 0x1b, 0x3e, 0xbf, 0xba, 0x73, 0x3e,
- 0x3f, 0xc4, 0x9a, 0xbe, 0x90, 0xe9, 0x95, 0xbe, 0xff, 0xa4, 0xea, 0xbe,
- 0xcf, 0x0a, 0x79, 0xbc, 0xf3, 0x0a, 0x49, 0x3f, 0x8f, 0xd0, 0x12, 0xbf,
- 0x3d, 0x4f, 0x31, 0xbe, 0x71, 0x7a, 0x44, 0xbf, 0x14, 0x7b, 0xb7, 0x3e,
- 0xfa, 0x4d, 0xa3, 0x3d, 0x38, 0xf3, 0x0a, 0x3f, 0xa6, 0xa9, 0xf8, 0xbe,
- 0x4a, 0xd9, 0x47, 0xbf, 0xfd, 0xdb, 0xde, 0x3e, 0x85, 0xdf, 0x1f, 0xbe,
- 0x68, 0x8f, 0x16, 0x3f, 0xac, 0x04, 0x46, 0xbd, 0x1d, 0x4a, 0x9a, 0x3e,
- 0x19, 0x7d, 0x2c, 0x3f, 0xc3, 0x49, 0xdd, 0x3e, 0x88, 0x6f, 0x6f, 0x3e,
- 0x29, 0x41, 0xf3, 0xbe, 0xb7, 0x57, 0x26, 0x3f, 0x93, 0x73, 0x15, 0xbe,
- 0x40, 0x1f, 0xaf, 0xbe, 0xd2, 0x28, 0xeb, 0xbe, 0xc9, 0x17, 0x79, 0x3f,
- 0xe7, 0xeb, 0x4d, 0xbf, 0x88, 0xf9, 0xea, 0xbe, 0xda, 0xd6, 0x13, 0xbf,
- 0xb8, 0x42, 0x51, 0x3d, 0x0b, 0x03, 0x92, 0xbd, 0x37, 0xdf, 0x0f, 0xbf,
- 0x5d, 0x5e, 0x68, 0xbf, 0xb3, 0x95, 0x85, 0x3f, 0xbf, 0xb5, 0xad, 0xbd,
- 0x4a, 0xa7, 0x72, 0x3d, 0xb4, 0xea, 0xb8, 0x3c, 0xa3, 0xd7, 0xa8, 0xbf,
- 0xf9, 0xff, 0x6d, 0xbf, 0x32, 0x69, 0xa0, 0xbf, 0xbf, 0x79, 0x09, 0x3f,
- 0x6b, 0x3d, 0x8c, 0xbe, 0x8a, 0xb3, 0x3b, 0x3f, 0x76, 0x57, 0x2d, 0x3a,
- 0xc5, 0x4d, 0xaf, 0x3e, 0x66, 0x73, 0x19, 0x3e, 0x55, 0x7b, 0xda, 0x3e,
- 0x82, 0xec, 0x36, 0xbe, 0x68, 0x82, 0xbe, 0x3f, 0xfe, 0x17, 0x44, 0xbf,
- 0x89, 0x2e, 0x23, 0xbf, 0x63, 0x85, 0x78, 0xbe, 0x3e, 0x39, 0x59, 0xbe,
- 0x24, 0x7e, 0xd7, 0xbe, 0xdd, 0xad, 0xb8, 0x3e, 0xd8, 0xae, 0x06, 0xbf,
- 0xc7, 0x2f, 0x30, 0xbf, 0x6c, 0x99, 0x30, 0xbf, 0x35, 0x3f, 0x10, 0xbe,
- 0xbd, 0x88, 0xc9, 0x3c, 0x08, 0x4e, 0x1b, 0xbf, 0x28, 0x7a, 0xb2, 0xbe,
- 0xa9, 0xb4, 0xc1, 0xbe, 0x06, 0xd5, 0x35, 0xbf, 0x82, 0xe0, 0x8e, 0xbf,
- 0xb7, 0x59, 0x11, 0xbf, 0xa0, 0xde, 0xae, 0xbe, 0x72, 0xc8, 0x1b, 0xbf,
- 0x2b, 0x74, 0xe1, 0x3e, 0xe7, 0xdb, 0x63, 0xbe, 0xe6, 0x77, 0x57, 0x3e,
- 0x68, 0x37, 0xba, 0xbe, 0x4a, 0x4c, 0x83, 0x3c, 0xdc, 0x0e, 0xc4, 0x3d,
- 0x7d, 0xc5, 0x42, 0xbe, 0x03, 0xf3, 0x08, 0x3f, 0xe1, 0x8c, 0xe4, 0x3e,
- 0xef, 0x6c, 0x8a, 0xbd, 0x9f, 0x59, 0x70, 0xbe, 0xae, 0x42, 0xbd, 0x3c,
- 0x60, 0xe8, 0x98, 0x3f, 0x80, 0x87, 0x58, 0xbf, 0x02, 0x10, 0x02, 0xbe,
- 0x4b, 0x4a, 0x5b, 0xbe, 0x0b, 0xd8, 0x02, 0x3e, 0xfc, 0x34, 0xcd, 0x3d,
- 0x4b, 0x1b, 0x52, 0xbe, 0x80, 0x40, 0x06, 0x3f, 0xe5, 0x69, 0x64, 0x3f,
- 0x35, 0x11, 0x4b, 0xbe, 0x14, 0x12, 0x8d, 0xbf, 0x84, 0x41, 0x0e, 0xc0,
- 0x39, 0x2d, 0x89, 0xbf, 0xfd, 0xc4, 0xb6, 0xbd, 0x20, 0x17, 0x22, 0xbf,
- 0x6f, 0x33, 0xfa, 0x3e, 0x0d, 0x9e, 0xea, 0x3e, 0x12, 0xa3, 0x47, 0x3f,
- 0x0c, 0xfd, 0x1e, 0x3d, 0x05, 0xce, 0x2b, 0xbc, 0x3c, 0x69, 0xc9, 0xbe,
- 0x33, 0xb8, 0x26, 0xbe, 0xb5, 0x0d, 0xd9, 0x3f, 0xbd, 0x07, 0xbd, 0xbd,
- 0xa3, 0xfd, 0x7d, 0x3f, 0xc5, 0x04, 0xd8, 0x3e, 0x10, 0xca, 0x1a, 0xbe,
- 0x2c, 0x8d, 0xdf, 0xbf, 0xe2, 0xb8, 0xe9, 0xbf, 0x9f, 0x7f, 0x09, 0xc0,
- 0x8d, 0x9d, 0x3e, 0x3f, 0xb8, 0xdf, 0xf7, 0xbe, 0xbe, 0x75, 0x37, 0x3e,
- 0x9c, 0x09, 0x0a, 0x3f, 0xb0, 0xf1, 0x27, 0xbf, 0xf9, 0xae, 0x2c, 0xbf,
- 0x35, 0x8f, 0xea, 0xbf, 0xf7, 0x6e, 0x98, 0x3e, 0x35, 0x5e, 0x27, 0xbd,
- 0xfc, 0x8a, 0x60, 0x3e, 0x40, 0x2a, 0x97, 0xbd, 0x6b, 0x20, 0x9f, 0x3c,
- 0xb8, 0xdc, 0x1f, 0x3e, 0xe4, 0xd5, 0x82, 0xbc, 0xf8, 0xef, 0x00, 0xbd,
- 0xea, 0xcb, 0x3b, 0x3e, 0xaf, 0x14, 0x86, 0xbe, 0x0c, 0xaa, 0x04, 0xbf,
- 0xea, 0xbb, 0xa7, 0xbd, 0xa8, 0xc5, 0x1e, 0x3e, 0x91, 0xcc, 0xde, 0xbe,
- 0xca, 0x36, 0x88, 0x3c, 0xea, 0xe8, 0x3a, 0xbe, 0x04, 0xcd, 0x49, 0x3e,
- 0x66, 0xfe, 0x3e, 0x3e, 0x17, 0x98, 0xbe, 0xbd, 0xa5, 0x7c, 0x2d, 0xbe,
- 0x3c, 0xa4, 0xb9, 0xbd, 0x0a, 0x66, 0xfc, 0x3d, 0xfb, 0x74, 0x5c, 0xbe,
- 0x55, 0x48, 0x39, 0x3e, 0x1f, 0xe4, 0x3c, 0xbc, 0xbf, 0x70, 0xed, 0xbc,
- 0x40, 0x36, 0x29, 0x3d, 0x14, 0x52, 0x4c, 0x3d, 0xd9, 0xfb, 0x5c, 0xbd,
- 0xda, 0x81, 0xe7, 0x3d, 0x30, 0xa9, 0x6b, 0xbd, 0xdf, 0x7b, 0xbf, 0xbe,
- 0x62, 0xd9, 0xe3, 0xbd, 0x82, 0xf1, 0x1f, 0xbe, 0x49, 0x2f, 0x56, 0xbe,
- 0x1c, 0xc5, 0x6b, 0xbe, 0x68, 0xbc, 0xb8, 0xbd, 0x7c, 0xf0, 0xd7, 0x3d,
- 0xa4, 0xc4, 0xa7, 0xb9, 0x19, 0xc7, 0x0b, 0x3c, 0x3d, 0xa0, 0x30, 0xbe,
- 0xe9, 0xc4, 0xf2, 0x3d, 0x77, 0xcb, 0x41, 0x3e, 0x34, 0x0d, 0x36, 0xbc,
- 0xf4, 0x81, 0x21, 0x3e, 0xc9, 0xb6, 0x44, 0xbf, 0x14, 0xc3, 0xb8, 0x3b,
- 0xcf, 0x2e, 0xcc, 0xbe, 0x82, 0x3e, 0x1a, 0x3e, 0x18, 0x0a, 0x35, 0xbe,
- 0x21, 0xd2, 0xd4, 0xbe, 0x20, 0x29, 0x7b, 0xbd, 0x63, 0x6f, 0xbf, 0x3d,
- 0xe9, 0x29, 0x85, 0xbd, 0xfc, 0xf0, 0xe3, 0xbd, 0x83, 0xa0, 0x86, 0xbd,
- 0x5a, 0xe4, 0xff, 0xbe, 0x1f, 0x3d, 0x0e, 0x3e, 0x2c, 0x03, 0xfd, 0xbd,
- 0x4f, 0x2f, 0x13, 0xbe, 0xaa, 0x63, 0x97, 0xbd, 0xb0, 0xae, 0x13, 0x3e,
- 0x5b, 0x5f, 0x9b, 0xbe, 0xe1, 0x23, 0xad, 0xbd, 0x91, 0x15, 0xab, 0xbc,
- 0x4f, 0xbe, 0x76, 0xbe, 0x85, 0x28, 0x84, 0xbe, 0x86, 0xa1, 0x7c, 0x3d,
- 0xe3, 0x44, 0x58, 0x3e, 0x53, 0x06, 0xe5, 0x3c, 0x35, 0xfd, 0xd6, 0x3d,
- 0x0b, 0x81, 0xdd, 0x3d, 0x94, 0x9a, 0x71, 0xbd, 0xab, 0x97, 0x4c, 0x3e,
- 0xa4, 0x0e, 0x92, 0x3c, 0x97, 0x3a, 0xcf, 0xbd, 0xca, 0x89, 0x03, 0x3d,
- 0xe2, 0x28, 0x0f, 0xbe, 0x76, 0x2e, 0x55, 0x3e, 0xf0, 0x17, 0x0c, 0xbe,
- 0xb2, 0x2e, 0x61, 0xbd, 0xd5, 0x99, 0x0f, 0x3e, 0x48, 0xc8, 0xce, 0xbd,
- 0xa6, 0x9a, 0x18, 0xbe, 0xc2, 0xbc, 0x2c, 0xbe, 0x5e, 0xee, 0xdf, 0x3d,
- 0x79, 0xbb, 0xd1, 0xbd, 0x27, 0xe8, 0x2e, 0xbe, 0x4a, 0x60, 0x26, 0xbe,
- 0x2c, 0xc2, 0x56, 0xbe, 0x77, 0xf9, 0xdc, 0xbc, 0x86, 0x11, 0x09, 0xbc,
- 0x56, 0x6a, 0xe5, 0x3d, 0xa2, 0x68, 0xfa, 0xbd, 0x73, 0x5b, 0x0f, 0xbd,
- 0xb9, 0xce, 0x80, 0xbd, 0xfa, 0xf9, 0xec, 0x3d, 0xcb, 0x70, 0x23, 0xbe,
- 0xb9, 0xdb, 0x21, 0x3e, 0x14, 0x72, 0x71, 0xbe, 0xa7, 0xf3, 0xe2, 0x3d,
- 0x29, 0xf3, 0x9d, 0xbd, 0x3a, 0x21, 0x16, 0x3e, 0x48, 0x78, 0x99, 0xbd,
- 0xf2, 0x60, 0xc2, 0xbd, 0x55, 0xe6, 0xc0, 0xbc, 0xe0, 0x20, 0x33, 0xbd,
- 0xcd, 0x08, 0x2d, 0xbd, 0x1c, 0x59, 0x20, 0xbe, 0xfa, 0xd8, 0x32, 0xba,
- 0xa5, 0x2b, 0x0b, 0x3d, 0x14, 0x57, 0x67, 0xbd, 0x2a, 0x55, 0x11, 0x3e,
- 0x36, 0xd6, 0xc2, 0x3d, 0x03, 0x44, 0x47, 0x3b, 0x79, 0xec, 0xdd, 0xbd,
- 0x86, 0xe0, 0xde, 0x3c, 0x13, 0xff, 0x2a, 0x3c, 0x44, 0x17, 0x83, 0x3d,
- 0x0f, 0x38, 0x88, 0xbe, 0xbe, 0x5d, 0xa5, 0x3f, 0x10, 0x70, 0x6c, 0x3d,
- 0x3c, 0xbe, 0xdb, 0x3f, 0xbc, 0xe9, 0x6d, 0x3f, 0x35, 0x2f, 0x3f, 0x3f,
- 0xe6, 0xa2, 0x8b, 0x3e, 0xa7, 0x29, 0x99, 0x3d, 0x61, 0xdb, 0xdb, 0xbe,
- 0xfb, 0x96, 0xbe, 0xbf, 0xdf, 0x19, 0x4e, 0x3d, 0xca, 0xc8, 0x27, 0xbe,
- 0xb3, 0xa0, 0x21, 0x3f, 0x99, 0x46, 0x1a, 0xbf, 0x49, 0x48, 0x9a, 0xbf,
- 0x9a, 0x08, 0x1d, 0xbf, 0xd5, 0x08, 0x87, 0xbd, 0xe2, 0x6c, 0xfd, 0xbe,
- 0x18, 0x27, 0x84, 0xbf, 0xcb, 0x98, 0x01, 0xbf, 0x19, 0xb0, 0xbc, 0x3e,
- 0x0f, 0x33, 0xf4, 0x3e, 0xeb, 0x14, 0x51, 0xbe, 0x48, 0x80, 0xf3, 0xbe,
- 0xe2, 0xc3, 0x62, 0xbe, 0x61, 0xff, 0xa4, 0x3e, 0x51, 0x4f, 0xd6, 0xbe,
- 0x16, 0xd9, 0x01, 0xc0, 0x85, 0x07, 0x06, 0xbe, 0x05, 0x97, 0xed, 0xbe,
- 0x45, 0x39, 0x88, 0xbe, 0x9b, 0xcd, 0x3b, 0xbf, 0x41, 0x47, 0x65, 0x3e,
- 0xc5, 0x7b, 0x5d, 0x3e, 0xcb, 0xeb, 0xac, 0xbc, 0x42, 0xac, 0x98, 0xbf,
- 0xec, 0x62, 0x43, 0x3f, 0x24, 0xe0, 0x26, 0xbd, 0x93, 0x00, 0x9e, 0x3e,
- 0x95, 0x67, 0x29, 0xbf, 0x5b, 0x68, 0x1f, 0xbe, 0x23, 0xa8, 0x02, 0xbe,
- 0x10, 0xc4, 0x66, 0x3e, 0xfc, 0x2d, 0x08, 0x3f, 0x35, 0xba, 0x7c, 0x3f,
- 0x4c, 0xdd, 0x56, 0xbe, 0xdf, 0x38, 0xa0, 0xbf, 0x1b, 0x34, 0x9c, 0xbd,
- 0xfc, 0x2f, 0x9e, 0x3e, 0x87, 0xc8, 0x01, 0xbf, 0xf6, 0x0e, 0xc2, 0x3f,
- 0x67, 0x58, 0xf2, 0x3d, 0x23, 0x0d, 0x85, 0x3f, 0x78, 0xbc, 0x68, 0x3e,
- 0x76, 0x56, 0x04, 0x3f, 0x3c, 0xb9, 0xc6, 0xbe, 0x93, 0x71, 0xb1, 0x3f,
- 0x80, 0x2a, 0x44, 0x3e, 0x9e, 0x14, 0x83, 0xbf, 0xbe, 0x10, 0x22, 0x3f,
- 0xd4, 0xc0, 0x79, 0x3c, 0xa3, 0xba, 0xdf, 0xbe, 0x25, 0xac, 0xf8, 0xbc,
- 0xb2, 0xe6, 0x25, 0xbf, 0x51, 0x8e, 0xa8, 0xbd, 0x44, 0x52, 0xa2, 0x3e,
- 0x93, 0xb1, 0x88, 0x3f, 0x34, 0x81, 0xbc, 0x3e, 0xa4, 0x51, 0x11, 0xbf,
- 0x04, 0x41, 0x9b, 0x3e, 0xc5, 0xeb, 0xc0, 0xbe, 0x71, 0x3a, 0x8d, 0x3d,
- 0x0e, 0xdb, 0x64, 0xbf, 0x18, 0xb0, 0x75, 0x3e, 0x05, 0xf5, 0xb7, 0xbe,
- 0xb1, 0x9b, 0xf3, 0xbd, 0x51, 0x16, 0x8e, 0x3f, 0xe9, 0x63, 0xa3, 0xbf,
- 0x92, 0xaf, 0xae, 0xbf, 0x95, 0x14, 0x7b, 0x3d, 0x11, 0x17, 0x52, 0xbd,
- 0x0e, 0x86, 0xb8, 0x3d, 0x6e, 0xbb, 0xdb, 0x3e, 0x30, 0x97, 0x3a, 0xbf,
- 0x52, 0xc3, 0x39, 0x3e, 0x27, 0xa4, 0x14, 0x3f, 0x66, 0x68, 0x57, 0xbe,
- 0x9a, 0xc1, 0xa1, 0xbc, 0xc8, 0xd4, 0x0c, 0xbe, 0x53, 0x70, 0x7b, 0xbe,
- 0x62, 0x2e, 0x69, 0x3f, 0x77, 0xd6, 0x76, 0xbe, 0xbb, 0x25, 0x23, 0xbe,
- 0x8a, 0x05, 0x81, 0x3e, 0x89, 0x2b, 0xfc, 0x3e, 0x46, 0x6a, 0x8b, 0xbe,
- 0xc0, 0x41, 0x86, 0x3f, 0xe0, 0xa9, 0x07, 0xbf, 0xbd, 0xed, 0x55, 0x3f,
- 0xeb, 0x36, 0xb2, 0xbf, 0x13, 0x30, 0xcc, 0xbe, 0xa7, 0xf6, 0x38, 0xbf,
- 0x87, 0x49, 0x85, 0x3e, 0x8f, 0x62, 0xdd, 0x3f, 0xb5, 0x69, 0x3c, 0xbf,
- 0x48, 0xbd, 0x06, 0xbc, 0x70, 0x08, 0x9b, 0x3d, 0x79, 0xdc, 0x21, 0x3f,
- 0x13, 0x67, 0x2c, 0xbe, 0xa1, 0x37, 0x2f, 0x3f, 0xba, 0xa3, 0xea, 0xbe,
- 0x19, 0xdf, 0x37, 0x3f, 0xbc, 0x99, 0x9c, 0xbd, 0x99, 0xbd, 0xf3, 0x3e,
- 0xfd, 0x66, 0x93, 0x3f, 0x09, 0x55, 0xcd, 0xbe, 0x6e, 0x2e, 0x11, 0xbe,
- 0x94, 0x93, 0xb2, 0xbb, 0x02, 0xe5, 0x38, 0xbe, 0x75, 0x7b, 0x80, 0x3e,
- 0xcd, 0xdb, 0xd9, 0xbb, 0xd4, 0x50, 0x84, 0xbe, 0x25, 0x38, 0x13, 0xbe,
- 0x9f, 0xf4, 0x95, 0x3e, 0x0e, 0x68, 0x20, 0x3d, 0xf0, 0xe0, 0x9c, 0x3e,
- 0xc8, 0x86, 0x45, 0xbd, 0x30, 0x99, 0x9b, 0x3e, 0xec, 0x2a, 0x4f, 0x3c,
- 0x17, 0xf6, 0xb9, 0xbd, 0x69, 0xaa, 0x74, 0x3e, 0x82, 0x97, 0x84, 0x3e,
- 0xe7, 0x76, 0xb8, 0x3d, 0x41, 0x1c, 0x44, 0xbe, 0x80, 0x97, 0x44, 0xbe,
- 0xa5, 0x77, 0x1f, 0x3d, 0xcf, 0x04, 0xaf, 0xbe, 0x49, 0xbc, 0xb6, 0xbb,
- 0x23, 0x1a, 0xb3, 0x3d, 0x90, 0x1e, 0x64, 0x3e, 0xbe, 0xd2, 0x11, 0x3f,
- 0x7c, 0xba, 0x46, 0xbd, 0x8d, 0xf9, 0xa3, 0xbe, 0x5b, 0xae, 0xe2, 0x3c,
- 0xb4, 0xd8, 0x3b, 0x3e, 0x3d, 0xd2, 0x22, 0xbe, 0x68, 0x9e, 0x31, 0x3e,
- 0xfa, 0x88, 0x92, 0x3d, 0x8a, 0x74, 0xa7, 0x3e, 0xce, 0xd9, 0xda, 0x3d,
- 0x65, 0xee, 0x0a, 0xbc, 0x00, 0x04, 0x94, 0x3e, 0x16, 0xc3, 0x7f, 0x3e,
- 0x48, 0xa1, 0x9f, 0xbe, 0x5a, 0x5b, 0xa1, 0xbe, 0x81, 0x0e, 0xa0, 0xbe,
- 0x69, 0xd7, 0x55, 0xbe, 0xa1, 0x33, 0x2b, 0x3f, 0x8e, 0xdb, 0x0c, 0xbe,
- 0x55, 0x8a, 0x64, 0xbe, 0x66, 0x47, 0x00, 0x3e, 0xfa, 0x6e, 0xd0, 0xbd,
- 0x95, 0x41, 0xb2, 0xbb, 0xc3, 0xe7, 0x43, 0x3e, 0x58, 0xf7, 0xcf, 0x3c,
- 0xda, 0xe0, 0xe0, 0x3e, 0x26, 0x30, 0x31, 0xbe, 0x18, 0x46, 0x7c, 0xbb,
- 0x49, 0x9c, 0xa4, 0xbc, 0xdd, 0x81, 0xbb, 0x3d, 0x64, 0x39, 0x10, 0x3e,
- 0x05, 0x4f, 0x19, 0x3d, 0xa5, 0xa0, 0xe1, 0x3d, 0x07, 0x09, 0x64, 0x3e,
- 0x06, 0x5b, 0x90, 0x3b, 0x66, 0xd3, 0x06, 0xbe, 0x11, 0x16, 0x03, 0x3e,
- 0xb8, 0xc5, 0x09, 0xbe, 0x46, 0x76, 0x23, 0x3e, 0x24, 0xea, 0xd2, 0x3d,
- 0x50, 0x26, 0x9c, 0xbd, 0x51, 0xe8, 0xb4, 0xbd, 0x0c, 0x46, 0x19, 0xbe,
- 0xbf, 0x55, 0xc6, 0x3e, 0x0d, 0xda, 0x5f, 0x3c, 0x62, 0x63, 0xae, 0xbc,
- 0x2a, 0x99, 0x88, 0xbe, 0xcb, 0x91, 0x85, 0x3e, 0x6f, 0x20, 0x19, 0xbe,
- 0x4a, 0xe0, 0x23, 0x3c, 0x9c, 0x49, 0x53, 0x3c, 0x46, 0xc3, 0xbf, 0xbc,
- 0x16, 0x43, 0x44, 0xbe, 0x39, 0x88, 0x8c, 0xbe, 0x59, 0x16, 0xcc, 0xba,
- 0x75, 0x4b, 0xa4, 0x3d, 0x98, 0x37, 0x9e, 0x3d, 0xe6, 0x65, 0x85, 0xbd,
- 0x00, 0x82, 0xa0, 0xbe, 0x76, 0x35, 0x49, 0x3e, 0x81, 0x41, 0xa2, 0x3d,
- 0x11, 0x53, 0x82, 0x3e, 0xf0, 0x4e, 0x92, 0xbe, 0xf6, 0x7c, 0xd7, 0x3e,
- 0xb1, 0x97, 0xc9, 0x3e, 0x0b, 0xeb, 0x36, 0xbe, 0x96, 0x96, 0x32, 0x3e,
- 0xe9, 0xd9, 0x1b, 0x3d, 0x3a, 0x67, 0x80, 0x3d, 0x70, 0x05, 0x96, 0x3d,
- 0xea, 0x68, 0x1d, 0xbd, 0x57, 0x57, 0x1c, 0x3d, 0x19, 0x38, 0x31, 0x3e,
- 0xd8, 0xdc, 0x91, 0xbe, 0x4d, 0x21, 0xf8, 0xbd, 0x08, 0x98, 0x25, 0xbe,
- 0xf4, 0x9d, 0xa3, 0xbc, 0x7b, 0xbb, 0x76, 0x3d, 0x88, 0x6c, 0x63, 0x3e,
- 0x1d, 0x86, 0x89, 0xbe, 0x24, 0xa7, 0x27, 0xbd, 0x0a, 0x33, 0x3e, 0xbe,
- 0x4e, 0x6f, 0x9b, 0xbe, 0x2e, 0x13, 0x57, 0x3d, 0x26, 0x36, 0x4a, 0xbe,
- 0x4b, 0x46, 0x9d, 0xbe, 0xa3, 0x43, 0x26, 0x3d, 0x7f, 0x69, 0x89, 0x3d,
- 0x94, 0xd2, 0xb9, 0xbe, 0x7e, 0x37, 0x04, 0x3a, 0x98, 0x1d, 0x25, 0xbe,
- 0x7f, 0x0d, 0x3a, 0x3e, 0x13, 0x76, 0x2c, 0x3e, 0x30, 0x37, 0x21, 0x3e,
- 0xa9, 0x18, 0x68, 0x3c, 0xd4, 0x66, 0x1d, 0xbe, 0xe6, 0x9c, 0x10, 0x3f,
- 0x56, 0x5d, 0x50, 0x3d, 0xc7, 0x92, 0xd8, 0xbd, 0xe1, 0x82, 0x4f, 0x3d,
- 0x21, 0xaa, 0xa4, 0xbe, 0x05, 0x8f, 0xee, 0xbe, 0xeb, 0xdc, 0x9c, 0x3d,
- 0x1c, 0xb7, 0x69, 0xbd, 0x45, 0x00, 0x2f, 0x3d, 0xbe, 0x80, 0x41, 0xbe,
- 0xa1, 0xd7, 0x62, 0xbe, 0xd5, 0x01, 0xb2, 0xbe, 0x54, 0xbf, 0x8d, 0xbe,
- 0xd3, 0x03, 0x13, 0xbe, 0x45, 0x40, 0xa5, 0xbb, 0xaf, 0xaf, 0x86, 0xbd,
- 0xfa, 0x9e, 0x4f, 0x3e, 0xe3, 0x14, 0xad, 0x3e, 0x91, 0xd1, 0x06, 0x3f,
- 0x62, 0x63, 0x2a, 0xbe, 0x58, 0x95, 0xa4, 0xbe, 0xdc, 0xd3, 0xd6, 0x3d,
- 0x7e, 0x74, 0x40, 0xbf, 0xb3, 0xa2, 0x0f, 0xbf, 0x58, 0x5d, 0x6c, 0x3d,
- 0x43, 0xc0, 0xfb, 0xbd, 0xc7, 0xbb, 0x24, 0xbe, 0xf3, 0x34, 0x2b, 0x3e,
- 0xbf, 0xa0, 0x8a, 0x3e, 0x25, 0xe9, 0x8d, 0x3e, 0x20, 0xfd, 0xa0, 0x3d,
- 0xa1, 0xef, 0x0b, 0x3e, 0x8f, 0x00, 0xa6, 0x3e, 0x97, 0xd9, 0x52, 0xbe,
- 0x90, 0x9d, 0xfd, 0xbc, 0x78, 0x14, 0x9b, 0x3e, 0xd6, 0x3c, 0xaa, 0xbe,
- 0x6b, 0x9d, 0x26, 0xbe, 0xad, 0xc0, 0xa6, 0x3d, 0x45, 0xed, 0x36, 0xbc,
- 0x3c, 0xc0, 0xa2, 0x3d, 0xf5, 0xbf, 0x01, 0xbe, 0x65, 0x67, 0x67, 0x3e,
- 0xd4, 0x1d, 0x91, 0xbc, 0xac, 0xf3, 0x85, 0xbe, 0xe6, 0x75, 0x9c, 0x3d,
- 0x36, 0xae, 0x46, 0x3e, 0x10, 0x4f, 0xd6, 0x3c, 0x55, 0xcc, 0x56, 0xbe,
- 0xce, 0x4e, 0x4d, 0xbd, 0x75, 0x60, 0xbf, 0x3e, 0x90, 0x01, 0xbc, 0x3a,
- 0x48, 0x07, 0x3f, 0xbe, 0x55, 0x8c, 0x5e, 0xbd, 0x43, 0x97, 0x04, 0xbd,
- 0x5d, 0x0e, 0x2c, 0xbe, 0x5e, 0xe0, 0xa5, 0xbe, 0x88, 0xb1, 0xfe, 0x3d,
- 0xa3, 0xaf, 0x51, 0x3e, 0x87, 0x0c, 0x3e, 0x3d, 0xc8, 0xe6, 0x8f, 0x3e,
- 0xd4, 0x46, 0x4d, 0x3d, 0x3d, 0xc7, 0x80, 0xbd, 0x34, 0x93, 0xcc, 0xbe,
- 0x9d, 0x66, 0x04, 0xbf, 0xa7, 0x94, 0x3f, 0x3d, 0xfd, 0x35, 0xa7, 0xbe,
- 0x19, 0x8f, 0x42, 0x3e, 0x44, 0x15, 0x4b, 0x3e, 0xde, 0x21, 0x9a, 0xbc,
- 0x8f, 0xef, 0x1c, 0x3d, 0x61, 0x8d, 0xb0, 0xbd, 0xda, 0xa8, 0xdb, 0xbc,
- 0x86, 0xc2, 0xd5, 0xbe, 0xc8, 0x17, 0xb6, 0xbd, 0xff, 0x68, 0x69, 0x3d,
- 0x2f, 0xd0, 0x84, 0x3b, 0x81, 0x2d, 0x58, 0x3e, 0x7c, 0x29, 0xaf, 0xbd,
- 0xcf, 0x83, 0xf4, 0xbe, 0x41, 0x3e, 0x0c, 0x3e, 0xe7, 0x6b, 0xcf, 0xbe,
- 0x59, 0xb6, 0x0c, 0xbe, 0x05, 0x4f, 0x60, 0x3d, 0x44, 0xbf, 0xa7, 0xbe,
- 0xe5, 0xce, 0xe9, 0x3c, 0x40, 0x6e, 0x91, 0xbd, 0x13, 0x88, 0x97, 0xbd,
- 0x4b, 0xce, 0x0d, 0xbe, 0x7e, 0x09, 0xd3, 0xbe, 0x1c, 0x5a, 0x74, 0xbe,
- 0x92, 0xcb, 0xbf, 0x3d, 0x7c, 0x20, 0xdc, 0x3d, 0xf0, 0x50, 0x21, 0x3e,
- 0x91, 0xdc, 0x58, 0x3e, 0x49, 0x83, 0x6b, 0x3e, 0x4c, 0xa2, 0x92, 0x3e,
- 0x24, 0x2d, 0x04, 0x3e, 0x11, 0xe6, 0x57, 0xbe, 0x1e, 0xce, 0x8e, 0x3e,
- 0xfa, 0x65, 0x0d, 0xbe, 0xea, 0xc1, 0x8c, 0xbc, 0x3e, 0x31, 0x1e, 0x3e,
- 0x8b, 0xc4, 0xaa, 0x3d, 0x02, 0xb3, 0xd9, 0x3d, 0x6f, 0xbb, 0xab, 0x3e,
- 0xe5, 0x4e, 0xa4, 0x3e, 0x85, 0x1f, 0xe3, 0x3d, 0xee, 0xae, 0x90, 0xbe,
- 0x55, 0x77, 0x82, 0xbe, 0xc0, 0x1e, 0x96, 0x3d, 0x6d, 0x92, 0x8c, 0xbe,
- 0x92, 0x69, 0x96, 0xb9, 0x52, 0xea, 0x9b, 0xbe, 0x70, 0xd4, 0x70, 0xbe,
- 0x7c, 0xc0, 0xdd, 0xbe, 0xb1, 0x60, 0x98, 0x3f, 0xd6, 0x6a, 0xbc, 0xbe,
- 0x3c, 0xfb, 0xf9, 0xbc, 0xa6, 0x01, 0xf2, 0x3e, 0x91, 0x5f, 0x46, 0x3f,
- 0xe2, 0x70, 0xd8, 0x3d, 0x59, 0x17, 0xc7, 0xbd, 0x8f, 0x18, 0x8e, 0xbc,
- 0x4b, 0xef, 0xe8, 0x3e, 0xc5, 0x5c, 0xad, 0x3e, 0xde, 0xad, 0x2b, 0x3f,
- 0x99, 0xe3, 0xfa, 0xbe, 0x9a, 0xfd, 0x0d, 0x3f, 0x94, 0xa6, 0x5a, 0xbe,
- 0x15, 0x97, 0x56, 0x3e, 0x6d, 0xf2, 0xf3, 0x3d, 0x8f, 0x0b, 0xe6, 0x3e,
- 0xaf, 0xca, 0x92, 0xbf, 0x5d, 0x9a, 0x22, 0xbf, 0x90, 0xdb, 0x08, 0xbe,
- 0xe8, 0x8e, 0x32, 0x3f, 0x2f, 0xe8, 0xa1, 0xbe, 0x0c, 0x8c, 0xbc, 0xbf,
- 0xef, 0xa9, 0x8a, 0x3e, 0xfe, 0x36, 0x05, 0xbf, 0xf7, 0xe6, 0x0c, 0xbf,
- 0x78, 0x9d, 0x40, 0x3e, 0x25, 0xa4, 0x0c, 0xbc, 0x1c, 0xe4, 0xbc, 0xbe,
- 0x09, 0xef, 0x8a, 0xbb, 0x49, 0xdf, 0x3d, 0xbf, 0xf9, 0x1f, 0x01, 0xbe,
- 0x48, 0xe2, 0x1c, 0x3f, 0x4e, 0xda, 0x46, 0xbf, 0x8d, 0x1a, 0x5a, 0xbf,
- 0x02, 0xb3, 0x89, 0x3e, 0xca, 0xa2, 0xd3, 0xbe, 0x31, 0x57, 0x33, 0xbf,
- 0x7e, 0x95, 0xfc, 0xbe, 0x52, 0xca, 0xa8, 0x3e, 0xca, 0xaf, 0x82, 0x3d,
- 0x89, 0xda, 0x0f, 0x3f, 0x0a, 0x98, 0xd8, 0xbc, 0x31, 0x07, 0x4d, 0xbd,
- 0x5c, 0x96, 0x66, 0xbd, 0xef, 0xfd, 0xa0, 0xbe, 0xd6, 0x71, 0x2d, 0x3f,
- 0x5a, 0xe4, 0x96, 0xbd, 0xdd, 0xcd, 0x10, 0x3f, 0x5f, 0x2a, 0xfa, 0x3e,
- 0x3f, 0xfd, 0xf1, 0xbe, 0x42, 0xe8, 0x4e, 0xbe, 0xcb, 0xf7, 0x24, 0x3f,
- 0x3c, 0x90, 0x44, 0xbf, 0x09, 0xd8, 0xe3, 0xbe, 0xc7, 0x0c, 0x08, 0x3f,
- 0xa1, 0x1a, 0xb2, 0xbe, 0x07, 0xd0, 0xcc, 0x3c, 0x9e, 0x48, 0x10, 0x3e,
- 0x8e, 0x3f, 0x21, 0xbf, 0x76, 0x2d, 0x7b, 0x3e, 0x3f, 0x18, 0x97, 0xbe,
- 0x01, 0x31, 0xc1, 0x3e, 0xbe, 0x55, 0x5a, 0xbd, 0xc8, 0x25, 0x51, 0xbf,
- 0xe1, 0x46, 0x10, 0x3f, 0xc8, 0x21, 0xe5, 0xbe, 0x02, 0x0e, 0x27, 0xbf,
- 0xd0, 0x09, 0xcc, 0xbe, 0x0c, 0x70, 0x50, 0x3e, 0x9e, 0xfe, 0x3a, 0x3d,
- 0xbb, 0xf8, 0x9f, 0xbe, 0x65, 0x1c, 0xab, 0x3e, 0xde, 0xf2, 0xa2, 0xbf,
- 0x3e, 0x32, 0x1d, 0x3f, 0xd9, 0x7e, 0x19, 0x3f, 0xee, 0xa9, 0x96, 0xbd,
- 0xee, 0xe3, 0xf9, 0x3e, 0x29, 0x7e, 0x0e, 0xbe, 0x95, 0x3b, 0x60, 0x3d,
- 0x39, 0x01, 0x18, 0xbe, 0xa7, 0xc0, 0x25, 0xbe, 0xf7, 0xc9, 0x52, 0xbd,
- 0x35, 0x10, 0xcd, 0xb9, 0x0d, 0xed, 0xd3, 0x3e, 0x26, 0xa8, 0x03, 0xbd,
- 0x67, 0xb8, 0x3d, 0x3e, 0x3d, 0x93, 0xc6, 0x3e, 0xf4, 0xa5, 0xf6, 0xbf,
- 0xfc, 0xd4, 0x52, 0xbe, 0x0c, 0x46, 0xc8, 0x3e, 0xc9, 0x25, 0x34, 0xbe,
- 0x41, 0xf3, 0xb0, 0x3e, 0xc8, 0xd9, 0x0f, 0xbe, 0xbd, 0x50, 0x17, 0x3e,
- 0xa7, 0x54, 0x9f, 0xbe, 0xbe, 0x73, 0x22, 0xbe, 0x81, 0xe8, 0x95, 0xbe,
- 0x97, 0x8e, 0x86, 0xbe, 0x3f, 0x72, 0x23, 0x3f, 0x78, 0xf8, 0x71, 0xbf,
- 0xc2, 0x42, 0xe6, 0xbe, 0x9b, 0x6a, 0xd4, 0xbe, 0x92, 0x4a, 0x12, 0x3d,
- 0x2e, 0xee, 0xf3, 0x3f, 0x7a, 0xed, 0x98, 0xbe, 0x42, 0xc7, 0x3a, 0xbe,
- 0x62, 0xea, 0x0c, 0x3f, 0x86, 0xdf, 0x85, 0xbe, 0x77, 0x04, 0xb3, 0x3e,
- 0x71, 0x8c, 0x24, 0x3e, 0x56, 0xdd, 0x8c, 0x3f, 0xd9, 0x5e, 0xc2, 0x3e,
- 0xc8, 0x09, 0x0d, 0xc0, 0xac, 0xc6, 0xd9, 0x3e, 0xfe, 0x92, 0xc8, 0x3e,
- 0x7d, 0x7a, 0x34, 0xbe, 0xb7, 0xbb, 0xd2, 0xbc, 0x14, 0x29, 0x2b, 0x3e,
- 0x6d, 0x2a, 0xa6, 0x3d, 0x5f, 0x29, 0x07, 0x3e, 0xe3, 0x30, 0x7b, 0x3d,
- 0x46, 0x87, 0x76, 0xbd, 0x1d, 0x64, 0x0a, 0x3e, 0xd3, 0x34, 0x8e, 0xbe,
- 0x86, 0xa9, 0x28, 0x3d, 0x1d, 0xe0, 0x0d, 0xbe, 0x51, 0x53, 0x50, 0x3e,
- 0x9f, 0xd2, 0xc2, 0x3c, 0x5c, 0x63, 0xb8, 0x3d, 0xd9, 0x66, 0x9f, 0x3d,
- 0x87, 0x02, 0xa6, 0x3d, 0x78, 0x8b, 0xb5, 0xbc, 0x59, 0x3f, 0xab, 0xbd,
- 0xf6, 0xc3, 0x1b, 0xbc, 0xb4, 0xf6, 0x82, 0x3d, 0x37, 0xed, 0x84, 0xbd,
- 0x4e, 0x54, 0xdc, 0xbc, 0x61, 0x00, 0x7a, 0x3d, 0x14, 0xc2, 0xbe, 0x3d,
- 0x40, 0xac, 0x15, 0x3e, 0x3e, 0xa6, 0x29, 0x3e, 0x10, 0xb6, 0x3f, 0xbc,
- 0xf4, 0x91, 0x97, 0x3d, 0xe3, 0xf1, 0x8e, 0xbd, 0xc4, 0xfc, 0x03, 0xbf,
- 0x87, 0x35, 0x87, 0xbb, 0xab, 0x17, 0xd0, 0x3c, 0xa5, 0x29, 0x96, 0xbe,
- 0xa0, 0x65, 0x91, 0xba, 0xe7, 0xb1, 0x95, 0x3e, 0x93, 0xc8, 0xfb, 0x3d,
- 0x1e, 0xec, 0x61, 0x3e, 0x62, 0xed, 0x81, 0xbd, 0x41, 0x15, 0xcb, 0xbd,
- 0xe3, 0x0d, 0xbf, 0x3d, 0x7f, 0x1d, 0x4a, 0x3e, 0x28, 0xce, 0xd0, 0xbc,
- 0x84, 0x85, 0x1a, 0xbe, 0x80, 0x88, 0xa0, 0xbe, 0xe2, 0x96, 0x03, 0xbe,
- 0x74, 0x56, 0x84, 0xbb, 0xf9, 0x02, 0x9f, 0x3d, 0x61, 0xe7, 0x97, 0xbd,
- 0x20, 0x35, 0xbc, 0xbe, 0x88, 0x5c, 0xa0, 0x3c, 0x0e, 0x29, 0x08, 0x3c,
- 0x85, 0x20, 0x2a, 0x3e, 0x2a, 0x42, 0x51, 0xbe, 0xd8, 0xef, 0xd9, 0x3c,
- 0x17, 0xc7, 0x7a, 0xbe, 0x52, 0x06, 0x23, 0xbe, 0x4f, 0xea, 0x3b, 0xbe,
- 0x63, 0x59, 0x18, 0x3d, 0x58, 0xfa, 0x4d, 0x3d, 0x98, 0x8e, 0x23, 0x3e,
- 0x15, 0x58, 0x1e, 0xbc, 0x15, 0xee, 0x8f, 0xbd, 0x7b, 0xfc, 0x0a, 0x3e,
- 0x09, 0x1f, 0xc2, 0x3d, 0x7c, 0x5a, 0xd1, 0xbd, 0xd1, 0xb7, 0x2a, 0xbf,
- 0x2b, 0xd7, 0x5e, 0xbc, 0xef, 0x9b, 0x1f, 0x3c, 0x99, 0xc8, 0xe2, 0xbd,
- 0x02, 0x6d, 0xcb, 0xbd, 0x05, 0x64, 0x19, 0xbe, 0x96, 0xb2, 0x20, 0x3e,
- 0x78, 0xda, 0x26, 0x3e, 0xb8, 0xdf, 0xcb, 0xbc, 0x60, 0x38, 0x9c, 0x3d,
- 0x6d, 0x02, 0x7e, 0x3e, 0x97, 0x9e, 0x18, 0xbd, 0xf5, 0x5c, 0xfb, 0x3b,
- 0xbb, 0x0c, 0x13, 0x3e, 0x39, 0x19, 0x89, 0xbe, 0x11, 0x25, 0x04, 0xbe,
- 0x36, 0x71, 0x68, 0xbe, 0x0a, 0x0d, 0xe1, 0xbe, 0x01, 0xd8, 0x43, 0x3e,
- 0xe4, 0x1a, 0x0d, 0x3e, 0x84, 0x15, 0x7f, 0x3c, 0xe7, 0xb1, 0x73, 0xbd,
- 0x7d, 0x72, 0xf9, 0xbd, 0x47, 0x66, 0xd0, 0x3d, 0x4d, 0xca, 0x42, 0xbd,
- 0x48, 0xcf, 0xdf, 0x3d, 0xb7, 0xf2, 0x81, 0x3d, 0x68, 0xb2, 0x1a, 0xbd,
- 0x12, 0x07, 0xee, 0x3d, 0xb9, 0xe4, 0xbb, 0xbd, 0x39, 0x9f, 0xff, 0xbd,
- 0x8a, 0x98, 0x28, 0x3e, 0xcf, 0x0e, 0xf8, 0xbd, 0xf7, 0x31, 0x41, 0xbd,
- 0x49, 0x49, 0x27, 0xbe, 0xa9, 0xbc, 0xa6, 0x3b, 0xc0, 0xf5, 0x56, 0x3d,
- 0xf3, 0x7e, 0x8b, 0xbd, 0x81, 0xe9, 0x8e, 0xbe, 0x5a, 0xda, 0xfc, 0xbd,
- 0x52, 0xf4, 0x25, 0x3d, 0xd1, 0x03, 0x5d, 0x3d, 0x47, 0x73, 0x86, 0x3d,
- 0x21, 0xc3, 0xb6, 0x3d, 0x85, 0x67, 0x1c, 0xbe, 0xff, 0x37, 0x5d, 0x3e,
- 0x10, 0xc8, 0xef, 0x3c, 0xbb, 0x14, 0xe6, 0xbd, 0xff, 0x26, 0x6e, 0x3e,
- 0xfb, 0x24, 0x12, 0xbe, 0x03, 0x62, 0xa3, 0x3d, 0xfc, 0x29, 0x31, 0x3e,
- 0xbf, 0xfe, 0x7d, 0xbe, 0x07, 0xf7, 0xa3, 0x3f, 0xd1, 0xc9, 0xdd, 0x3d,
- 0x82, 0x03, 0xa5, 0x3f, 0xd1, 0x2e, 0x78, 0x3f, 0xc9, 0x93, 0x1a, 0x3f,
- 0x5d, 0xcc, 0x4b, 0x3e, 0x6b, 0x9b, 0xb8, 0x3d, 0xc7, 0xdd, 0xdb, 0xbe,
- 0x36, 0xcc, 0x69, 0xbf, 0x1f, 0x08, 0xa0, 0x3c, 0x3c, 0x19, 0xa6, 0xbc,
- 0x92, 0x65, 0xf6, 0x3e, 0x08, 0x0c, 0xf6, 0xbe, 0x68, 0xd7, 0x7f, 0xbf,
- 0xb0, 0xaf, 0x34, 0xbf, 0x68, 0xbb, 0x93, 0x3e, 0xfe, 0x4e, 0x9b, 0xbe,
- 0x5b, 0x4f, 0x8a, 0xbf, 0xe4, 0xfc, 0x06, 0xbf, 0xea, 0x1a, 0xb5, 0x3e,
- 0xfd, 0xee, 0x09, 0x3f, 0xdd, 0xfc, 0x22, 0xbe, 0x75, 0x26, 0xfc, 0xbe,
- 0x73, 0xe4, 0xe6, 0x3d, 0xe0, 0x34, 0x66, 0x3e, 0x37, 0xb4, 0xe9, 0xbe,
- 0xfb, 0x54, 0xd7, 0xbf, 0x52, 0xd6, 0x82, 0xbd, 0xab, 0x5e, 0x84, 0xbe,
- 0x8f, 0xc3, 0xb0, 0xbc, 0x2a, 0x72, 0x17, 0xbf, 0x68, 0xd0, 0xb1, 0xbd,
- 0x1b, 0x18, 0xf8, 0x3e, 0x31, 0x10, 0x3a, 0x3e, 0xc5, 0xc4, 0xa8, 0xbf,
- 0xb6, 0x6f, 0xcd, 0x3e, 0x1e, 0x45, 0x40, 0xbe, 0x10, 0x1d, 0xc7, 0x3e,
- 0xd4, 0xe4, 0x33, 0xbf, 0x63, 0x25, 0x8c, 0x3e, 0xc3, 0x0d, 0xf8, 0x3d,
- 0x3b, 0x19, 0x39, 0xbc, 0xf2, 0x3c, 0x18, 0x3f, 0x9b, 0x13, 0x3f, 0x3f,
- 0x42, 0xab, 0x91, 0xbd, 0x77, 0x7d, 0x52, 0xbf, 0x5f, 0x4b, 0x04, 0xbe,
- 0xf0, 0xa8, 0xe9, 0x3d, 0x4b, 0x70, 0x52, 0xbe, 0xf5, 0x7a, 0x90, 0x3f,
- 0xca, 0xaf, 0x3b, 0xbd, 0xc9, 0x6c, 0x88, 0x3f, 0x40, 0x92, 0xb2, 0x3e,
- 0x3b, 0x67, 0xc8, 0x3e, 0x1a, 0xba, 0xad, 0xbe, 0x86, 0x18, 0xa8, 0x3f,
- 0xff, 0x14, 0x19, 0x3e, 0x43, 0x6c, 0x0d, 0xbf, 0x83, 0xb0, 0x1a, 0x3f,
- 0x6b, 0xc4, 0x9a, 0xbd, 0xc6, 0x90, 0x14, 0xbf, 0xca, 0xc7, 0x95, 0x3d,
- 0x4e, 0x8e, 0x1e, 0xbf, 0x8b, 0x4e, 0x81, 0xbd, 0x18, 0x67, 0xa0, 0x3e,
- 0x1e, 0x02, 0x75, 0x3f, 0x12, 0xec, 0x0c, 0x3f, 0x06, 0xc9, 0xfc, 0xbe,
- 0x52, 0x15, 0xa6, 0x3e, 0x49, 0x08, 0x5c, 0xbd, 0x48, 0x8f, 0x27, 0xbe,
- 0x27, 0x9b, 0x32, 0xbf, 0x39, 0x7f, 0x48, 0x3e, 0x32, 0x3d, 0xe0, 0xbe,
- 0xaa, 0xdb, 0xcf, 0x3d, 0xed, 0x28, 0x47, 0x3f, 0x2b, 0x91, 0x74, 0xbf,
- 0x01, 0x7e, 0x52, 0xbf, 0xa0, 0xb0, 0xf3, 0xbe, 0x77, 0x5c, 0xc3, 0xbd,
- 0xf6, 0x6f, 0xad, 0x3d, 0xe4, 0x92, 0x73, 0x3e, 0x37, 0x93, 0xfb, 0xbe,
- 0x10, 0x17, 0xff, 0x3e, 0x7a, 0x08, 0x1a, 0x3f, 0x97, 0xfb, 0x00, 0x3e,
- 0xbb, 0x2b, 0x75, 0xbe, 0x6d, 0xdc, 0x1a, 0x3e, 0x88, 0x04, 0x1b, 0xbe,
- 0x88, 0xa9, 0x91, 0x3e, 0x17, 0x1b, 0x53, 0xbe, 0xdc, 0xac, 0xce, 0x3d,
- 0x3d, 0xcd, 0x53, 0x3e, 0x28, 0xf3, 0x30, 0xbb, 0x3d, 0xfe, 0x82, 0xbe,
- 0xf2, 0x14, 0x81, 0x3f, 0x31, 0x23, 0xb7, 0xbd, 0x4a, 0xaf, 0x2e, 0x3f,
- 0xb2, 0xd2, 0x8e, 0xbf, 0x40, 0x20, 0x4a, 0xbe, 0x0b, 0xfd, 0x2e, 0xbf,
- 0xf0, 0xfa, 0x25, 0xbe, 0x3b, 0x54, 0x35, 0x3f, 0x20, 0x40, 0x2e, 0xbf,
- 0x2d, 0x06, 0x17, 0xbe, 0x9d, 0x0f, 0xf5, 0x3d, 0x77, 0x4e, 0xf2, 0x3e,
- 0x73, 0x62, 0x53, 0xbe, 0x3b, 0x9f, 0xa9, 0x3e, 0xcf, 0x3e, 0x34, 0xbe,
- 0x97, 0x57, 0x18, 0x3f, 0xca, 0xba, 0x51, 0x3d, 0xb3, 0x1b, 0x35, 0x3f,
- 0xd2, 0x96, 0x57, 0x3f, 0x26, 0x2a, 0xa9, 0xbe, 0x81, 0x40, 0x9d, 0xbd,
- 0xcf, 0x5d, 0x4e, 0xbb, 0x6e, 0x30, 0xf6, 0x3c, 0x22, 0x24, 0xe0, 0x3d,
- 0xbd, 0xdf, 0xa3, 0xbe, 0x03, 0xb0, 0x38, 0xbf, 0x11, 0xff, 0xf5, 0xbc,
- 0xff, 0x7b, 0x56, 0x3e, 0xff, 0xd9, 0x1c, 0x3e, 0x6e, 0xaa, 0x84, 0x3e,
- 0x9c, 0x13, 0xf2, 0xbd, 0xeb, 0xed, 0xc0, 0xbd, 0xf4, 0xde, 0xcb, 0xbd,
- 0x14, 0x43, 0x17, 0x3d, 0x81, 0x8c, 0x10, 0x3f, 0x03, 0xf5, 0xc5, 0x3d,
- 0x35, 0x69, 0x27, 0x3e, 0x51, 0x4c, 0x46, 0xbe, 0xe1, 0x1f, 0xea, 0x3d,
- 0x9a, 0xa5, 0x91, 0x3d, 0x90, 0xb7, 0x9e, 0xbd, 0xd0, 0xfc, 0x4a, 0xbe,
- 0xab, 0xca, 0x74, 0xbe, 0xa6, 0xa0, 0xef, 0x3d, 0xbb, 0x21, 0x11, 0x3f,
- 0x99, 0x9e, 0x52, 0xbe, 0x2b, 0x37, 0xab, 0xbe, 0xa5, 0x5c, 0x6c, 0x3c,
- 0x09, 0x67, 0x23, 0x3e, 0x0e, 0xe4, 0x4f, 0xbd, 0x18, 0xd2, 0xb9, 0x3e,
- 0x0b, 0x02, 0x7b, 0xbd, 0xc3, 0x3f, 0x3f, 0x3e, 0x91, 0x77, 0x61, 0xbd,
- 0x3a, 0xd1, 0xac, 0x3d, 0x39, 0x42, 0xfd, 0xbd, 0x28, 0x80, 0x1c, 0x3e,
- 0x5c, 0x5a, 0x23, 0xbf, 0xdc, 0xc6, 0x45, 0xbe, 0x14, 0x98, 0x4c, 0xbe,
- 0x15, 0x63, 0x8d, 0xbe, 0x7a, 0xea, 0xa6, 0x3e, 0x7f, 0xef, 0x64, 0xbd,
- 0xe4, 0x36, 0x8e, 0xbe, 0x12, 0x30, 0x6c, 0x3e, 0xcd, 0x15, 0xe2, 0x3c,
- 0x14, 0x8a, 0x1f, 0x3e, 0x1f, 0x64, 0xb8, 0x3e, 0xc6, 0x44, 0xaf, 0xbe,
- 0xd4, 0x15, 0x2b, 0x3e, 0x1c, 0x4c, 0xfe, 0xbe, 0x62, 0x5e, 0x40, 0x3a,
- 0x31, 0xa1, 0xf0, 0x3c, 0x71, 0xc7, 0x06, 0xbc, 0xac, 0xd1, 0x26, 0xbe,
- 0x89, 0x65, 0x09, 0x3e, 0x61, 0x32, 0x77, 0x3e, 0x82, 0xba, 0x91, 0xbd,
- 0xb1, 0xf8, 0x37, 0x3e, 0x6e, 0x12, 0x4b, 0xbe, 0x55, 0x58, 0x0f, 0x3e,
- 0x7a, 0x6c, 0x38, 0xbe, 0x93, 0x5d, 0x39, 0x3d, 0x72, 0xa3, 0x64, 0xbd,
- 0x67, 0x81, 0x29, 0xbe, 0x4a, 0x96, 0x97, 0xbd, 0xa2, 0xe2, 0x11, 0xbf,
- 0x1e, 0x3a, 0xb4, 0x3d, 0x11, 0xd4, 0xc0, 0xbe, 0xa9, 0xfe, 0xb2, 0x3c,
- 0x9c, 0x10, 0x00, 0xbe, 0x52, 0xa1, 0xa7, 0xbd, 0xa8, 0x9e, 0xaa, 0xbe,
- 0x77, 0xa3, 0xbe, 0xbd, 0x5b, 0x7b, 0x07, 0xbd, 0xf0, 0x71, 0xb5, 0x3d,
- 0x11, 0x20, 0xc8, 0x3e, 0xa1, 0x7e, 0xb8, 0xbe, 0xa8, 0x9a, 0xa4, 0x3b,
- 0xcb, 0x93, 0x5e, 0x3d, 0x50, 0xd8, 0x55, 0x3e, 0x8c, 0x06, 0xdb, 0xbc,
- 0x2a, 0x8a, 0x26, 0xbe, 0x9f, 0x57, 0x8b, 0x3e, 0x21, 0x7e, 0xeb, 0x3d,
- 0x3c, 0x43, 0x3a, 0xbe, 0x18, 0xe6, 0x92, 0xbe, 0x54, 0x0b, 0x3b, 0x3e,
- 0x6f, 0xbb, 0xab, 0xbc, 0xad, 0xeb, 0x6b, 0xbe, 0x66, 0x6b, 0x86, 0x3e,
- 0x77, 0x6b, 0x85, 0xbe, 0x04, 0x9f, 0x59, 0xbc, 0x9b, 0x09, 0x26, 0x3d,
- 0xae, 0xc3, 0xab, 0xbd, 0x2b, 0x59, 0xee, 0x3d, 0x54, 0x2b, 0x89, 0x3c,
- 0x6f, 0x23, 0xad, 0xbe, 0x48, 0xe0, 0x8b, 0x3e, 0x67, 0x69, 0x15, 0xbe,
- 0x30, 0x29, 0x73, 0x3d, 0xb4, 0x07, 0xb4, 0x3d, 0x83, 0xcd, 0xa0, 0x3d,
- 0x03, 0xaf, 0x97, 0x3d, 0x52, 0x9d, 0x0c, 0x3e, 0xaa, 0xae, 0xfa, 0x3c,
- 0x6e, 0xea, 0x7a, 0xbe, 0x3f, 0x0a, 0x1f, 0x3d, 0x1a, 0xa9, 0x8c, 0xbe,
- 0xcb, 0xc5, 0x32, 0xbe, 0xe5, 0x50, 0xc7, 0x3d, 0x20, 0x8a, 0x24, 0xbe,
- 0xb5, 0x59, 0xa7, 0xbd, 0xd9, 0xcb, 0x58, 0x3d, 0x2e, 0x00, 0xf5, 0xbe,
- 0xa6, 0x8a, 0x49, 0x3e, 0x8c, 0xc7, 0x07, 0x3d, 0x9b, 0x7b, 0x0c, 0x3e,
- 0x39, 0x8b, 0x20, 0xbd, 0x09, 0x9e, 0x04, 0xbe, 0xbc, 0xc9, 0x45, 0x3e,
- 0xa2, 0x2d, 0xa6, 0xbd, 0xfe, 0xc2, 0xa6, 0xbe, 0x07, 0x3b, 0x85, 0xbe,
- 0x1d, 0xff, 0xb5, 0xbe, 0xcf, 0xb1, 0xc5, 0xbe, 0xea, 0x15, 0xca, 0xbd,
- 0x53, 0xa2, 0x02, 0xbe, 0xa0, 0x0a, 0x02, 0x3d, 0x5f, 0x29, 0xa3, 0x3c,
- 0x44, 0x1a, 0xf0, 0xbc, 0xd5, 0xc6, 0xa7, 0xbe, 0xec, 0xd6, 0x3c, 0xbe,
- 0x17, 0x63, 0xa0, 0xbe, 0xeb, 0xcc, 0x13, 0xbe, 0xd9, 0xa5, 0xe2, 0xbd,
- 0x7c, 0x60, 0xc9, 0x3d, 0xe3, 0x42, 0xba, 0x3e, 0x80, 0x19, 0x77, 0x3e,
- 0x60, 0xfe, 0xfb, 0xbd, 0x3a, 0x34, 0x17, 0xbe, 0x48, 0x2d, 0x07, 0x3d,
- 0x0d, 0x17, 0x23, 0xbf, 0x98, 0xdc, 0xd9, 0xbe, 0xec, 0x9b, 0x1b, 0x3d,
- 0x32, 0x77, 0x79, 0xbe, 0x8e, 0x6e, 0xa9, 0xbb, 0x52, 0x77, 0x05, 0x3e,
- 0xb1, 0xfe, 0xe3, 0x3e, 0x70, 0x6e, 0x60, 0x3e, 0xc9, 0x80, 0x92, 0x3d,
- 0x38, 0x39, 0xf0, 0xbc, 0x52, 0xfb, 0xb8, 0xbd, 0xc3, 0xe0, 0x8a, 0xbd,
- 0x14, 0x25, 0x33, 0x3e, 0x3e, 0xdb, 0x97, 0x3e, 0x5e, 0x5c, 0x50, 0xbd,
- 0xd5, 0xd4, 0x82, 0xbe, 0x9f, 0x52, 0x14, 0xbe, 0xd2, 0x31, 0xf3, 0x3d,
- 0xef, 0x27, 0x43, 0x3d, 0x21, 0xf8, 0x8a, 0x3c, 0xaa, 0x22, 0x2d, 0x3e,
- 0x22, 0xb0, 0xcc, 0xbc, 0xb2, 0x50, 0x0e, 0xbe, 0x88, 0x50, 0xcb, 0xbe,
- 0x7f, 0x82, 0x7c, 0x3e, 0xb7, 0x0a, 0x0c, 0x3e, 0x0e, 0xc4, 0x50, 0x3d,
- 0xfa, 0x35, 0x8a, 0xbd, 0x51, 0x5b, 0xa6, 0x3e, 0xc2, 0xa5, 0x39, 0xbd,
- 0x11, 0xd6, 0xde, 0x3c, 0x6c, 0x90, 0x66, 0x3c, 0xe3, 0xa3, 0x48, 0x3d,
- 0xe5, 0x22, 0x8d, 0xbd, 0xa1, 0x4a, 0x5b, 0xbe, 0xfa, 0x58, 0xfd, 0x3c,
- 0xb7, 0xdd, 0x7e, 0xbd, 0xcf, 0x17, 0x52, 0xbe, 0xdb, 0xf1, 0xc8, 0x3d,
- 0xf1, 0xa1, 0xb0, 0x3d, 0x8e, 0x13, 0x61, 0xbe, 0xcd, 0x9f, 0x19, 0xbf,
- 0x20, 0xb1, 0x16, 0xbf, 0xbe, 0xd1, 0x08, 0xbe, 0xa0, 0x68, 0x32, 0xbe,
- 0x20, 0x01, 0xce, 0x3e, 0xcc, 0x63, 0x75, 0xbe, 0x07, 0xbb, 0x31, 0x3b,
- 0xf3, 0xfd, 0x39, 0xbe, 0x99, 0xe6, 0x14, 0xbd, 0x61, 0xa0, 0x28, 0x3e,
- 0x3d, 0x36, 0x2a, 0xbd, 0x99, 0xc4, 0x1d, 0xbe, 0xe0, 0xb8, 0x96, 0x3c,
- 0x84, 0x80, 0x68, 0xbc, 0x02, 0x32, 0xa8, 0x3d, 0x70, 0xc2, 0x09, 0xbe,
- 0x2c, 0x82, 0x8c, 0xbe, 0xf8, 0x29, 0x83, 0x3d, 0xb1, 0xf5, 0xd1, 0xbe,
- 0x17, 0xb0, 0x38, 0xbe, 0x4c, 0xe0, 0x9c, 0x3d, 0x12, 0x84, 0x8d, 0xbe,
- 0x35, 0xd8, 0x84, 0xbc, 0x48, 0x15, 0xe5, 0xbd, 0xf7, 0x77, 0x17, 0x3e,
- 0xf8, 0x70, 0xfc, 0xbc, 0xf4, 0x30, 0x62, 0xbe, 0x5e, 0xd3, 0x82, 0xbd,
- 0x5f, 0x29, 0x20, 0x3e, 0xd3, 0x79, 0xd9, 0xbb, 0xd1, 0xc5, 0x1d, 0x3e,
- 0xd6, 0xcd, 0x4c, 0x3e, 0xbf, 0x63, 0x00, 0x3e, 0xc4, 0xcd, 0xc4, 0x3d,
- 0x53, 0x96, 0x69, 0x3e, 0x6b, 0x81, 0x9a, 0xbe, 0xcc, 0x5a, 0x9e, 0x3e,
- 0xa9, 0xd8, 0x8c, 0xbd, 0xb8, 0x1a, 0xc5, 0x3d, 0x60, 0x11, 0x8b, 0x3e,
- 0x80, 0xc8, 0x99, 0x3e, 0xbc, 0x50, 0x4f, 0xbe, 0xcf, 0x55, 0x7b, 0x3e,
- 0x79, 0xd3, 0xc2, 0x3e, 0xe7, 0x28, 0xe1, 0xbc, 0x86, 0xb9, 0x05, 0xbf,
- 0x94, 0x28, 0x8a, 0xbe, 0x6a, 0xf4, 0x83, 0x3d, 0x60, 0x47, 0x36, 0x3e,
- 0x09, 0x8c, 0x19, 0xbe, 0xc4, 0xdb, 0x62, 0xbe, 0x60, 0x51, 0x8d, 0xbd,
- 0x40, 0xfb, 0xfb, 0x3e, 0x60, 0x54, 0x2e, 0xbe, 0xd7, 0x19, 0xd9, 0xbe,
- 0x62, 0xe3, 0x50, 0x3d, 0x7b, 0x7b, 0x79, 0x3f, 0xfd, 0x0c, 0xc2, 0xbd,
- 0x7d, 0xeb, 0x41, 0x3f, 0x24, 0x71, 0xb6, 0xbb, 0xa0, 0x52, 0x98, 0x3e,
- 0x65, 0x60, 0x88, 0x3e, 0x55, 0x7f, 0x66, 0xbe, 0x18, 0x0f, 0x43, 0x3f,
- 0x0a, 0xfa, 0x8a, 0x3d, 0xdc, 0x5a, 0xa7, 0xbe, 0xc0, 0x53, 0xdc, 0xbe,
- 0x0b, 0x1b, 0xc1, 0xbe, 0xd7, 0xde, 0xa8, 0xbe, 0x9b, 0xd0, 0xe0, 0x3b,
- 0x97, 0x85, 0x68, 0xbd, 0x54, 0x83, 0x9d, 0xbe, 0x3d, 0xfa, 0x86, 0xbd,
- 0x3b, 0x8f, 0xfd, 0x3c, 0x87, 0x14, 0x25, 0x3e, 0xc7, 0xda, 0x9a, 0xbe,
- 0x1d, 0x73, 0xe8, 0x3d, 0x19, 0x9e, 0x96, 0x3d, 0xff, 0xbe, 0xac, 0xbf,
- 0xeb, 0x65, 0xc3, 0x3e, 0xe4, 0x7d, 0xcd, 0x3c, 0x84, 0x52, 0x83, 0x3f,
- 0x04, 0x7e, 0x46, 0xbf, 0x0d, 0x26, 0xa6, 0xbe, 0xab, 0xa1, 0x15, 0x3e,
- 0xbb, 0x6a, 0x68, 0x3f, 0xac, 0x3b, 0x10, 0x3f, 0x28, 0x10, 0xbe, 0xbe,
- 0x86, 0x83, 0xe3, 0x3e, 0xef, 0x37, 0x9f, 0x3f, 0x3a, 0x43, 0x0d, 0xbf,
- 0x76, 0x04, 0x49, 0xbf, 0x51, 0x92, 0x41, 0xbe, 0x5a, 0xb4, 0x09, 0x3e,
- 0x64, 0x90, 0x80, 0xbe, 0xcd, 0xbc, 0xb9, 0xbd, 0x15, 0x8b, 0xbd, 0xbf,
- 0x94, 0x92, 0x8a, 0x3c, 0x18, 0x24, 0x5b, 0x3d, 0xdc, 0x80, 0xeb, 0x3e,
- 0xf0, 0xf2, 0x52, 0x3e, 0x7b, 0xac, 0xb4, 0xbe, 0xc9, 0x10, 0x5c, 0x3f,
- 0xdb, 0xd6, 0x33, 0x3e, 0x83, 0x8e, 0x5d, 0xbe, 0x06, 0x20, 0x68, 0xbe,
- 0x4e, 0x3d, 0x11, 0xbf, 0xc3, 0x8d, 0xc6, 0x3d, 0x2b, 0xe9, 0x83, 0x3e,
- 0xab, 0xce, 0x7b, 0xbf, 0x31, 0x12, 0x5a, 0xbf, 0xea, 0x38, 0x25, 0x3f,
- 0xeb, 0x9b, 0x2c, 0x3e, 0x41, 0xb0, 0x6e, 0x3e, 0xcb, 0xab, 0xa5, 0x3e,
- 0x3e, 0x8f, 0xc2, 0xbe, 0x82, 0xa9, 0x6c, 0x3f, 0xdb, 0x12, 0x6c, 0xbe,
- 0x1a, 0x29, 0x9a, 0x3f, 0x68, 0xba, 0xa8, 0x3f, 0x76, 0xd1, 0x88, 0x3e,
- 0x54, 0xc9, 0x78, 0x3e, 0x0e, 0x61, 0x3c, 0xbe, 0x0f, 0x34, 0x05, 0xbf,
- 0x75, 0x4e, 0x43, 0xbf, 0xfb, 0x43, 0x7f, 0x3e, 0x09, 0x55, 0x51, 0xbf,
- 0x8e, 0x0f, 0x33, 0x3f, 0x31, 0xe9, 0x27, 0x3f, 0x3a, 0x6d, 0xb5, 0xbe,
- 0x8d, 0xc5, 0xb6, 0x3f, 0xf3, 0x10, 0x76, 0xbd, 0x1e, 0x00, 0x06, 0xbe,
- 0x98, 0x8b, 0x2a, 0xbe, 0x6b, 0xf4, 0xdc, 0xbe, 0x43, 0x02, 0x3c, 0x3e,
- 0x1d, 0x63, 0x03, 0x3f, 0x82, 0xcb, 0x48, 0x3b, 0x80, 0x39, 0x6a, 0xbf,
- 0xdf, 0xca, 0xa2, 0x3e, 0x70, 0xba, 0x55, 0x3e, 0x6b, 0x40, 0xc0, 0xbd,
- 0x0a, 0x58, 0x9d, 0x3e, 0x39, 0x72, 0x89, 0x3e, 0xd6, 0x84, 0xf8, 0x3e,
- 0x46, 0x9d, 0x56, 0xbf, 0xd5, 0x31, 0xc3, 0xbe, 0x66, 0x5b, 0x5d, 0x3f,
- 0x7e, 0x0a, 0x72, 0x3f, 0xc6, 0xa3, 0x84, 0x3e, 0x4b, 0x86, 0x74, 0x3f,
- 0x02, 0x77, 0x2b, 0xbf, 0xf4, 0x00, 0xa4, 0x3e, 0xb7, 0x49, 0xf1, 0xbe,
- 0xad, 0x62, 0x90, 0xbe, 0xae, 0xab, 0x3a, 0x3f, 0xc3, 0xfb, 0x1f, 0xbe,
- 0xee, 0x4c, 0xb3, 0x3e, 0xd7, 0x46, 0xfb, 0x3c, 0xc4, 0x79, 0xd1, 0xbf,
- 0xa3, 0xe4, 0x04, 0xbe, 0x87, 0xf7, 0x2a, 0x3b, 0xcf, 0xb1, 0xbe, 0x3e,
- 0x42, 0xee, 0x00, 0xbe, 0x19, 0x6f, 0xe6, 0xbe, 0x9a, 0x47, 0xc1, 0x3e,
- 0xfe, 0xee, 0x5b, 0xbe, 0x07, 0x52, 0xa9, 0xbf, 0xe4, 0xc7, 0x28, 0xbf,
- 0xae, 0x7d, 0x99, 0xbe, 0x1c, 0x2e, 0xe7, 0x3d, 0xb3, 0xd5, 0x8c, 0xbe,
- 0xdb, 0x62, 0x4c, 0x3d, 0x9b, 0xe8, 0xd4, 0x3d, 0xaa, 0xfe, 0x74, 0x3d,
- 0x78, 0x49, 0x22, 0xbd, 0x4c, 0xd8, 0x06, 0x3e, 0x2f, 0xb9, 0x1b, 0xbf,
- 0xc4, 0x8c, 0x23, 0xbd, 0x7b, 0xc4, 0x27, 0xbe, 0x14, 0x71, 0xc8, 0x3d,
- 0x07, 0x76, 0xbd, 0xbd, 0x86, 0x86, 0xcb, 0xbc, 0x5a, 0xdb, 0xc7, 0x3d,
- 0xe7, 0x29, 0x2c, 0x3e, 0x61, 0x15, 0xc5, 0xbd, 0xc8, 0x31, 0x84, 0x3c,
- 0x82, 0xec, 0x29, 0xbe, 0x0d, 0xbb, 0xe9, 0x3d, 0x11, 0xf6, 0xe6, 0xbc,
- 0x18, 0xb7, 0x56, 0xbd, 0x13, 0x7f, 0x0b, 0xbd, 0xa5, 0xce, 0x4c, 0xbd,
- 0x63, 0x6b, 0xaa, 0x3d, 0x00, 0xad, 0x85, 0xbd, 0xb3, 0x83, 0xf0, 0x3d,
- 0x0a, 0x45, 0x83, 0x3d, 0x91, 0x1b, 0x99, 0xbc, 0xf1, 0xe8, 0xae, 0xbe,
- 0x7d, 0x10, 0x01, 0xbe, 0x74, 0x84, 0xc1, 0x3c, 0xd2, 0xcd, 0xb4, 0xbd,
- 0x37, 0xa8, 0x5b, 0x3c, 0x97, 0x65, 0x35, 0x3e, 0xc9, 0x31, 0x16, 0xbc,
- 0x2a, 0xa6, 0x4f, 0x3e, 0x10, 0xf6, 0xbf, 0xbc, 0x59, 0xe0, 0xe1, 0xbd,
- 0xa1, 0xfc, 0xc0, 0x3d, 0xd8, 0x1c, 0x2e, 0xbe, 0x4c, 0x6c, 0x7f, 0xbd,
- 0x84, 0xd3, 0x21, 0x3b, 0x3c, 0x69, 0x5a, 0xbe, 0x0f, 0x5f, 0x5f, 0xbd,
- 0x56, 0x65, 0x32, 0x3d, 0x33, 0xd7, 0x44, 0xbe, 0x1a, 0xc2, 0x71, 0xbd,
- 0x99, 0xe0, 0x8e, 0xbe, 0xb3, 0x66, 0xbe, 0x3e, 0x0e, 0xa0, 0xd8, 0xbb,
- 0x76, 0xf1, 0x96, 0x3d, 0x7e, 0x62, 0xa4, 0xbd, 0x6d, 0xf0, 0x14, 0xbe,
- 0xca, 0x95, 0xbe, 0xbe, 0xa3, 0x17, 0x12, 0xbe, 0xd8, 0xd3, 0x92, 0x3c,
- 0xa4, 0xef, 0xcf, 0x3c, 0x17, 0x74, 0x14, 0x3e, 0x62, 0xc1, 0xfa, 0x3d,
- 0xc9, 0xdb, 0x06, 0xbe, 0xd8, 0x37, 0xd6, 0xbd, 0xdc, 0x8f, 0xef, 0xbd,
- 0xce, 0xdf, 0x1e, 0x3e, 0xe8, 0x9a, 0xce, 0x3d, 0x19, 0x25, 0xc3, 0xbe,
- 0xd8, 0x9d, 0x57, 0x3c, 0x26, 0xf3, 0x43, 0x3e, 0xe0, 0x2a, 0xb2, 0xb9,
- 0x68, 0x92, 0xf9, 0xbd, 0x98, 0x02, 0xb8, 0xbe, 0xc9, 0xc8, 0x19, 0x3e,
- 0x04, 0x01, 0x00, 0x3e, 0x8d, 0x53, 0x9b, 0x3d, 0x66, 0x85, 0x18, 0xbd,
- 0x4a, 0x6c, 0x10, 0x3f, 0x41, 0xfd, 0x28, 0x3e, 0xc3, 0x02, 0xe3, 0xbb,
- 0xd2, 0xba, 0xa6, 0xbd, 0x58, 0xd5, 0x85, 0xbe, 0xc0, 0xb5, 0x3a, 0x3b,
- 0xa5, 0x74, 0x91, 0xbd, 0x7c, 0x99, 0x2d, 0xbe, 0xf9, 0xa5, 0x43, 0x3d,
- 0xa0, 0x17, 0x30, 0xbc, 0x40, 0xa3, 0x22, 0x3c, 0xb2, 0xde, 0xea, 0xbd,
- 0x45, 0xc9, 0x2f, 0xbd, 0x8e, 0x71, 0x8d, 0x3c, 0x9c, 0xeb, 0x89, 0x3d,
- 0x8e, 0xaa, 0x31, 0x3d, 0x0a, 0xc2, 0x46, 0x3d, 0xb4, 0x11, 0x4e, 0x3d,
- 0xda, 0x7c, 0xcd, 0xbb, 0xbe, 0xee, 0x08, 0xbe, 0x88, 0x0a, 0x9b, 0xbc,
- 0x19, 0xa3, 0xc0, 0x3d, 0x8b, 0x54, 0xc9, 0xbd, 0x28, 0xbe, 0x20, 0xbc,
- 0xeb, 0xe3, 0x2e, 0xbc, 0xab, 0x21, 0xca, 0x3d, 0x73, 0x2f, 0xf0, 0xbd,
- 0x13, 0xb4, 0xff, 0x3d, 0x54, 0x27, 0x0d, 0xbe, 0x10, 0xb8, 0xdd, 0x3c,
- 0x41, 0x73, 0x5b, 0x3e, 0x6a, 0xc6, 0xb2, 0x3d, 0xac, 0x91, 0x05, 0x3d,
- 0x7b, 0x1a, 0xe0, 0xbd, 0x2e, 0x56, 0x0b, 0xbf, 0xe7, 0xe5, 0x9b, 0x3e,
- 0xf4, 0xe0, 0x1f, 0x3e, 0xd9, 0x5b, 0x2d, 0xbe, 0x3b, 0x1d, 0x2f, 0xbd,
- 0x1a, 0xc8, 0xa9, 0x3d, 0xe0, 0x07, 0x35, 0x3d, 0xf7, 0xd9, 0x96, 0x3d,
- 0x03, 0xda, 0xec, 0xbe, 0x67, 0x69, 0x9f, 0x3f, 0xc6, 0x67, 0x39, 0xbe,
- 0x90, 0x79, 0x8f, 0x3f, 0x11, 0x28, 0x0f, 0x3f, 0x2c, 0xe0, 0x21, 0x3f,
- 0x25, 0x9f, 0x0a, 0xbc, 0x73, 0xe9, 0x2b, 0x3e, 0x69, 0xa2, 0x1e, 0xbf,
- 0xd6, 0xcd, 0x50, 0xbf, 0x7f, 0xa3, 0x44, 0x3e, 0xdd, 0xab, 0x2b, 0x3e,
- 0x9b, 0x55, 0x2e, 0x3f, 0xad, 0x97, 0xf3, 0xbe, 0x23, 0xb1, 0x70, 0xbf,
- 0x23, 0x39, 0xd0, 0xbe, 0x75, 0xa5, 0x94, 0x3e, 0xe9, 0x85, 0x01, 0xbf,
- 0xd9, 0xe0, 0x7e, 0xbf, 0xed, 0x44, 0xd8, 0xbe, 0x77, 0xdd, 0x00, 0x3f,
- 0x02, 0x5d, 0xc2, 0x3e, 0x65, 0x20, 0x11, 0xbe, 0xb4, 0x33, 0x09, 0xbf,
- 0x92, 0xfb, 0xf1, 0xbd, 0xbb, 0xd9, 0xab, 0xbd, 0xc6, 0xd4, 0xd5, 0xbe,
- 0x07, 0x24, 0xab, 0xbf, 0xf8, 0x5c, 0x27, 0xbe, 0x07, 0xc3, 0x67, 0xbe,
- 0x78, 0xdb, 0x44, 0x3e, 0x20, 0xeb, 0xde, 0xbe, 0x08, 0x19, 0x20, 0xbf,
- 0xc1, 0x1a, 0x30, 0x3f, 0x5a, 0x49, 0x75, 0xbe, 0xfb, 0x5e, 0xae, 0xbf,
- 0xed, 0xaa, 0x19, 0x3f, 0x1e, 0xdf, 0x68, 0xbe, 0x11, 0x27, 0xc9, 0x3d,
- 0xf3, 0x6e, 0x27, 0xbf, 0x15, 0x20, 0x6a, 0xbe, 0x21, 0xfc, 0xcf, 0xbb,
- 0xfc, 0x9c, 0x08, 0xbe, 0x97, 0xe2, 0xd4, 0x3e, 0xb9, 0xa9, 0x01, 0x3f,
- 0xc6, 0xf4, 0x8b, 0x3e, 0x01, 0x23, 0x2a, 0xbf, 0xb9, 0x9d, 0x91, 0xbc,
- 0xa1, 0x3d, 0x8e, 0xbd, 0x64, 0x26, 0x86, 0x3d, 0xfe, 0xac, 0x8f, 0x3f,
- 0x29, 0xdd, 0x52, 0xbe, 0x84, 0x90, 0x6b, 0x3f, 0x04, 0xcc, 0x00, 0x3e,
- 0x6a, 0xb2, 0xd4, 0xbc, 0xfa, 0x9a, 0xf9, 0xbe, 0xea, 0x61, 0xa4, 0x3f,
- 0xac, 0x5d, 0x7a, 0x3e, 0x53, 0xe4, 0x0d, 0xbf, 0xa2, 0xf8, 0xfa, 0x3e,
- 0xf4, 0xba, 0xe5, 0xbd, 0x1b, 0xbd, 0xf9, 0xbe, 0x0f, 0x46, 0xc5, 0x3d,
- 0xdc, 0x4a, 0x8e, 0xbe, 0xfb, 0xb1, 0x50, 0xbe, 0x60, 0xa6, 0x01, 0xbf,
- 0xac, 0x6d, 0x14, 0x3f, 0x77, 0x8c, 0xa5, 0x3e, 0x76, 0x85, 0xd9, 0xbe,
- 0xa0, 0xea, 0xf6, 0x3e, 0xa9, 0x23, 0x87, 0xbe, 0xbd, 0x37, 0x6e, 0xbe,
- 0x46, 0xd8, 0x3b, 0xbf, 0xda, 0xf3, 0x63, 0x3e, 0x19, 0xf7, 0xb9, 0xbe,
- 0x97, 0xd6, 0x51, 0x3e, 0x58, 0xb5, 0x51, 0x3f, 0xf7, 0x4e, 0x83, 0xbf,
- 0xcb, 0x82, 0x42, 0xbf, 0xb8, 0x79, 0xfa, 0xbe, 0x6a, 0xd2, 0xbd, 0x3d,
- 0x78, 0x73, 0xa5, 0xbd, 0xba, 0xa0, 0xc8, 0x3e, 0xfe, 0xb8, 0x16, 0xbf,
- 0x6d, 0x4e, 0x1d, 0xbd, 0x23, 0x17, 0xf5, 0x3e, 0x15, 0xab, 0x8e, 0xbc,
- 0x24, 0xd0, 0xf1, 0xbd, 0x3e, 0xac, 0x27, 0x3c, 0xc8, 0x15, 0xd6, 0xbe,
- 0x9c, 0x00, 0x13, 0x3b, 0x3d, 0x6f, 0xc1, 0xbe, 0x5d, 0x9a, 0x8b, 0xbe,
- 0xe7, 0xc1, 0xac, 0x3e, 0x7e, 0xad, 0x51, 0x3e, 0x79, 0xbb, 0xa6, 0xbe,
- 0x9a, 0x56, 0x82, 0x3f, 0x8f, 0xd2, 0xf3, 0x3c, 0x8b, 0x67, 0x08, 0x3f,
- 0x27, 0xa6, 0x6d, 0xbf, 0x5c, 0xa5, 0xba, 0xbe, 0x58, 0xf9, 0x2a, 0xbf,
- 0x55, 0x45, 0xd0, 0xbd, 0x64, 0x65, 0x86, 0x3f, 0x06, 0x65, 0x43, 0xbf,
- 0x48, 0xc4, 0x2a, 0xbd, 0x59, 0x6a, 0xb9, 0x3e, 0xac, 0xfc, 0xc7, 0x3e,
- 0xb4, 0xdb, 0x90, 0xbe, 0xda, 0x4e, 0x12, 0x3d, 0x07, 0x0e, 0xc0, 0xbd,
- 0x34, 0x5f, 0x22, 0x3f, 0x96, 0x9c, 0x9a, 0x3a, 0x27, 0x31, 0x14, 0x3f,
- 0x9b, 0x77, 0x7a, 0x3f, 0x5f, 0x1a, 0xf3, 0xbd, 0x2c, 0x95, 0x12, 0xbe,
- 0x12, 0x37, 0x90, 0x3e, 0x42, 0x4c, 0x3a, 0xbe, 0xf6, 0xea, 0xc2, 0xbe,
- 0xbf, 0x7e, 0x0a, 0xbf, 0x3c, 0x5e, 0xa2, 0xbe, 0x3f, 0x49, 0x29, 0x3e,
- 0xd1, 0x9a, 0xc2, 0x3d, 0xcb, 0xf6, 0xfd, 0x3d, 0x5c, 0xc2, 0xd2, 0x3d,
- 0x96, 0xe5, 0xe2, 0xbb, 0x8c, 0xc7, 0xf4, 0xbd, 0xa0, 0x35, 0xdf, 0xbe,
- 0x27, 0xa7, 0x4a, 0x3e, 0x25, 0x40, 0x51, 0x3e, 0xde, 0x53, 0x4c, 0x3e,
- 0x36, 0x38, 0x36, 0xbd, 0x2a, 0x48, 0x8b, 0xbd, 0x5d, 0x17, 0x11, 0x3e,
- 0xee, 0x75, 0x31, 0x3e, 0x2b, 0x7f, 0x39, 0xbd, 0x8d, 0x5f, 0x41, 0xbc,
- 0xf2, 0xe7, 0x63, 0xbe, 0x7c, 0x7d, 0x55, 0x3d, 0xeb, 0x53, 0xec, 0x3e,
- 0xf4, 0x8d, 0x21, 0xbc, 0x7b, 0x1f, 0xb0, 0xbe, 0xff, 0xfc, 0xb5, 0x3d,
- 0x0c, 0x16, 0x5f, 0x3b, 0x2b, 0x0d, 0xc7, 0xbd, 0xbc, 0x55, 0x9c, 0x3e,
- 0xe5, 0xb9, 0x51, 0xbe, 0x4c, 0x8e, 0x3b, 0xbd, 0xe1, 0xbc, 0x9b, 0xbd,
- 0x93, 0xa1, 0xf2, 0x3d, 0x63, 0x2c, 0x88, 0xbe, 0xda, 0xf5, 0x91, 0x3e,
- 0xdb, 0x23, 0x91, 0xbe, 0xcd, 0xb3, 0x9f, 0x3c, 0x7b, 0x28, 0xec, 0xbe,
- 0xf9, 0xa8, 0x3a, 0xbd, 0xec, 0xb0, 0x14, 0x3e, 0x0a, 0x51, 0x1f, 0x3c,
- 0xc2, 0x1b, 0x2d, 0xbd, 0xd9, 0x2e, 0x08, 0x3e, 0xe7, 0x2f, 0xc2, 0xbc,
- 0xa1, 0x29, 0xfe, 0x3c, 0x06, 0xcb, 0x55, 0xbb, 0x7f, 0xd9, 0x2f, 0xbe,
- 0x38, 0xc7, 0xb9, 0x3e, 0x89, 0x99, 0x1e, 0xbf, 0x0c, 0xf8, 0x2b, 0x3d,
- 0xa7, 0x58, 0x17, 0xbe, 0xbb, 0xcd, 0xb6, 0xbb, 0xb0, 0xa3, 0x46, 0xbd,
- 0x77, 0xf5, 0xdd, 0x3d, 0xea, 0xa3, 0x00, 0x3e, 0x20, 0xe2, 0xbb, 0xbd,
- 0x6e, 0xd6, 0x3d, 0x3e, 0x61, 0x59, 0xad, 0xbd, 0xce, 0xea, 0x60, 0x3e,
- 0xa2, 0xfb, 0x17, 0xbe, 0xb3, 0xdb, 0x9e, 0x3c, 0xbf, 0x79, 0xcb, 0xbd,
- 0x53, 0xca, 0x38, 0xbd, 0x24, 0x4d, 0x8b, 0xbc, 0x26, 0xa2, 0x62, 0xbe,
- 0x25, 0xae, 0x80, 0x3e, 0x4a, 0xf4, 0x83, 0xbe, 0xc6, 0x48, 0x6b, 0xbd,
- 0xa3, 0x2a, 0x04, 0xbf, 0xcd, 0x66, 0x06, 0x3d, 0x05, 0x95, 0x4b, 0xbe,
- 0xfd, 0xd5, 0x03, 0xbe, 0x16, 0x70, 0xe8, 0xbd, 0x49, 0x28, 0x68, 0x3c,
- 0x9e, 0x98, 0x94, 0x3b, 0x54, 0xc4, 0xb1, 0xbe, 0xaf, 0xd3, 0x83, 0xbe,
- 0x44, 0x09, 0x94, 0xbc, 0xe5, 0x9f, 0x36, 0x3e, 0xcc, 0xe9, 0x44, 0xbd,
- 0x2f, 0xcb, 0x01, 0xbe, 0xc2, 0x88, 0x21, 0x3b, 0xbe, 0x2d, 0x85, 0x3d,
- 0x95, 0xa0, 0x7c, 0xbd, 0xef, 0xf3, 0x38, 0xbe, 0x30, 0xf3, 0x3c, 0x3e,
- 0x71, 0x82, 0x9d, 0x3c, 0xcd, 0xf1, 0xf2, 0xbd, 0xe5, 0x40, 0x2e, 0x3e,
- 0x02, 0xbb, 0x0f, 0xbe, 0xcf, 0xea, 0x78, 0x3e, 0xa0, 0xbd, 0xdf, 0xbd,
- 0x28, 0xb0, 0x48, 0xbd, 0xe2, 0xa7, 0x1c, 0x3e, 0xcf, 0x0e, 0x47, 0x3e,
- 0x7b, 0xdb, 0x4d, 0x3c, 0xac, 0x54, 0x7a, 0xbd, 0x79, 0x1f, 0x6a, 0x3d,
- 0x47, 0x79, 0xdb, 0xbd, 0xa1, 0xe8, 0x60, 0x3d, 0x39, 0xef, 0x41, 0x3e,
- 0xe2, 0x5b, 0xf8, 0xbe, 0xb5, 0xdb, 0xf4, 0x3d, 0x9f, 0x68, 0x8f, 0xbc,
- 0x47, 0xc5, 0x90, 0xbc, 0x12, 0xe8, 0x24, 0x3e, 0x5b, 0xa3, 0x0a, 0xbc,
- 0x6e, 0xa7, 0x90, 0xbe, 0x25, 0x8b, 0xd7, 0x3d, 0xa1, 0x33, 0x56, 0xbe,
- 0x36, 0x1b, 0x65, 0xbd, 0xc2, 0xa9, 0x69, 0x3e, 0x90, 0xa5, 0x54, 0xbe,
- 0xf4, 0x54, 0x16, 0xbd, 0xa9, 0xb2, 0x1c, 0x3e, 0x46, 0xee, 0xab, 0xbd,
- 0x37, 0xcc, 0x17, 0x3e, 0xca, 0x91, 0x95, 0x3c, 0x82, 0x8d, 0x07, 0xbe,
- 0x2f, 0x33, 0xde, 0xbe, 0xee, 0x60, 0x0c, 0xbe, 0x5f, 0x64, 0x6d, 0xbd,
- 0xa6, 0xba, 0x72, 0xbe, 0xbc, 0x97, 0x21, 0xbf, 0x7a, 0x42, 0x99, 0x3d,
- 0x1a, 0xc0, 0x50, 0xbe, 0x96, 0x9e, 0x38, 0xbe, 0xff, 0x7c, 0x3d, 0xbe,
- 0x0f, 0x98, 0x45, 0xbd, 0x69, 0xcc, 0x88, 0xbd, 0xcc, 0x06, 0xa0, 0xbe,
- 0x68, 0xf7, 0x32, 0xbd, 0xcd, 0x59, 0x58, 0xbe, 0xc8, 0x97, 0xe1, 0xbc,
- 0xb5, 0xf6, 0xf2, 0x3d, 0xf3, 0xe2, 0x37, 0x3e, 0x35, 0x83, 0xc1, 0x3e,
- 0xf9, 0x83, 0xac, 0xbe, 0x4d, 0xb7, 0xcb, 0x3d, 0x9d, 0xe2, 0x8c, 0x3e,
- 0xf6, 0x5f, 0x54, 0xbe, 0xf5, 0xd2, 0x7f, 0xbe, 0x5d, 0x28, 0xf5, 0x3d,
- 0x80, 0x2f, 0x3e, 0xbe, 0x26, 0x33, 0x88, 0xbc, 0xb2, 0x06, 0x60, 0x3e,
- 0x51, 0x43, 0xd9, 0x3d, 0x70, 0xfe, 0xa1, 0xbd, 0xcc, 0x50, 0xae, 0x3d,
- 0x79, 0x6b, 0x80, 0x3d, 0x73, 0x5d, 0xb0, 0xbd, 0xe5, 0xe7, 0xf5, 0x3c,
- 0x63, 0xa4, 0x8e, 0xbe, 0x85, 0x7b, 0xa1, 0x3e, 0x5c, 0xe6, 0xe0, 0xbe,
- 0x43, 0x40, 0x79, 0xbe, 0x24, 0x15, 0x4b, 0xbe, 0x47, 0x10, 0x23, 0xbc,
- 0xfe, 0x2f, 0xd1, 0x3c, 0x10, 0x24, 0x10, 0xbd, 0xab, 0x86, 0x3f, 0x3e,
- 0x19, 0x03, 0x08, 0x3e, 0xdb, 0xc4, 0xa2, 0xbe, 0x19, 0x96, 0x4a, 0xbd,
- 0x29, 0x99, 0x7c, 0x3e, 0xf7, 0x22, 0x32, 0x3c, 0x0a, 0xac, 0x27, 0xbe,
- 0xaa, 0x06, 0xb1, 0xbd, 0x13, 0x7d, 0x2a, 0x3e, 0x2a, 0x16, 0x43, 0xbb,
- 0x86, 0x96, 0x9a, 0x3e, 0x3f, 0xbd, 0x61, 0x3e, 0xe7, 0xcb, 0x87, 0xbe,
- 0x79, 0xcc, 0x01, 0xbe, 0xfc, 0x87, 0x6e, 0xbe, 0xe9, 0x93, 0xac, 0xbc,
- 0x0d, 0x18, 0x84, 0xbd, 0xc7, 0x41, 0x37, 0xbe, 0x54, 0xe5, 0x33, 0x3e,
- 0xf8, 0xe1, 0x06, 0xbd, 0x1f, 0x3d, 0x87, 0xbe, 0xdb, 0x79, 0x69, 0xbe,
- 0xde, 0x57, 0x32, 0xbf, 0x23, 0x1e, 0xb3, 0xbe, 0xd8, 0x59, 0x77, 0xbe,
- 0x74, 0x57, 0x8a, 0xbe, 0x60, 0x56, 0xb2, 0x3d, 0xb9, 0xd5, 0xea, 0x3d,
- 0x20, 0xbd, 0xd1, 0xbc, 0x7a, 0x0a, 0xb9, 0x3d, 0x0f, 0xf2, 0xe4, 0xbc,
- 0x6b, 0xe4, 0x53, 0xbe, 0x43, 0x98, 0xbe, 0x3c, 0x94, 0xff, 0xd6, 0x3d,
- 0x02, 0x95, 0x1e, 0xbe, 0x8f, 0x09, 0xd1, 0x3d, 0xce, 0x35, 0x7a, 0xbd,
- 0xa8, 0x73, 0x14, 0xbe, 0x64, 0xc0, 0x84, 0xbd, 0xc1, 0x4a, 0xa7, 0xbe,
- 0xf2, 0x91, 0x07, 0xbe, 0x50, 0x73, 0xc6, 0x3d, 0x9a, 0x59, 0x94, 0x3d,
- 0xca, 0x16, 0x52, 0xbe, 0x9a, 0xec, 0x7e, 0x3e, 0x99, 0xca, 0x23, 0xbe,
- 0x56, 0x9c, 0x1b, 0xbd, 0x84, 0xdc, 0xbe, 0xbd, 0x0c, 0xc8, 0x9a, 0xbd,
- 0x4b, 0x2b, 0xe1, 0x3d, 0x13, 0xfe, 0xc5, 0xbd, 0xe4, 0x0a, 0x6e, 0xbd,
- 0xd6, 0x87, 0x8d, 0x3c, 0x97, 0x04, 0x1d, 0xbe, 0x4c, 0xf7, 0x1d, 0x3e,
- 0xe2, 0xbc, 0xba, 0x3e, 0x01, 0xf3, 0x3f, 0xbe, 0x48, 0x96, 0xef, 0x3e,
- 0x78, 0xa9, 0xd4, 0xbe, 0x88, 0x2a, 0x4f, 0xbd, 0x9f, 0x73, 0x5c, 0x3e,
- 0x9b, 0x81, 0x97, 0x3e, 0x71, 0xa0, 0x31, 0xbe, 0xbb, 0x51, 0xae, 0x3d,
- 0x7d, 0x48, 0xa8, 0xba, 0xb6, 0xac, 0x21, 0xbd, 0xb4, 0x6a, 0x16, 0xbf,
- 0x30, 0x5d, 0xde, 0xbe, 0xac, 0x52, 0x56, 0x3e, 0xbc, 0x54, 0x39, 0xbe,
- 0x80, 0xa1, 0xcc, 0xbe, 0x37, 0x9e, 0x8c, 0x3d, 0x20, 0x5a, 0x4e, 0xbd,
- 0x52, 0xd6, 0xe1, 0x3e, 0xcc, 0x50, 0x69, 0x3f, 0x07, 0x29, 0xa3, 0xbe,
- 0x57, 0x96, 0xcc, 0x3e, 0x2f, 0x7d, 0x69, 0x3f, 0xc6, 0x41, 0x98, 0x3e,
- 0x4f, 0x14, 0x0d, 0xbf, 0x64, 0xa0, 0x82, 0x3e, 0xe0, 0xa7, 0xf9, 0xbe,
- 0xf6, 0x8c, 0x26, 0x3f, 0x31, 0xee, 0x9b, 0xbf, 0x68, 0xea, 0xd1, 0xbe,
- 0x07, 0x39, 0xb6, 0x3e, 0xae, 0xe9, 0x04, 0x3e, 0x91, 0xbf, 0xdd, 0xbe,
- 0x4a, 0xf2, 0x04, 0xbf, 0x5b, 0xce, 0x45, 0xbf, 0x77, 0x97, 0x64, 0xbf,
- 0xc1, 0x01, 0x94, 0x3f, 0xa0, 0xc1, 0x1a, 0xbe, 0xc2, 0x09, 0x86, 0x3f,
- 0x6c, 0x54, 0x2c, 0xbb, 0xe8, 0x72, 0x73, 0xbf, 0x7a, 0xde, 0x29, 0x3d,
- 0x53, 0x3f, 0x60, 0xbf, 0xf3, 0x45, 0x71, 0x3e, 0x9e, 0xa7, 0x02, 0xbf,
- 0x70, 0x44, 0x04, 0x3e, 0x52, 0x4c, 0x26, 0xbe, 0xaa, 0x10, 0x3e, 0x3e,
- 0xff, 0x27, 0x3f, 0x3d, 0x6f, 0xcc, 0xa4, 0xbd, 0xff, 0x43, 0x9e, 0x3e,
- 0x7f, 0xc8, 0x03, 0xbf, 0xf0, 0x2a, 0xc7, 0x3e, 0xa1, 0x45, 0x97, 0x3f,
- 0xdc, 0x0e, 0xc4, 0x3b, 0xfe, 0x49, 0x95, 0xbf, 0x00, 0xd4, 0xcb, 0xbe,
- 0x81, 0x8d, 0x72, 0xbd, 0x67, 0x92, 0x9b, 0xbe, 0x8e, 0xaf, 0x0e, 0xbd,
- 0x95, 0xce, 0x06, 0x3e, 0x4d, 0x63, 0xd3, 0x3d, 0x8f, 0x9d, 0x25, 0xbe,
- 0x57, 0x79, 0xd1, 0xbd, 0xde, 0x1d, 0x84, 0x3f, 0x63, 0x45, 0x87, 0xbe,
- 0x64, 0x77, 0x90, 0xbe, 0xbb, 0xcd, 0x4c, 0x3f, 0x48, 0x5d, 0xd4, 0x3e,
- 0xa8, 0x1c, 0x29, 0xbe, 0xc6, 0x24, 0x88, 0xbf, 0x4e, 0x10, 0x19, 0x3e,
- 0xa8, 0xe2, 0xf2, 0xbd, 0x23, 0x96, 0xe1, 0x3e, 0xfb, 0xb6, 0x1e, 0x3e,
- 0x6c, 0xb4, 0x52, 0x3f, 0x34, 0xe7, 0x8f, 0x3e, 0xaf, 0x95, 0xe9, 0x3e,
- 0x0c, 0x17, 0x81, 0xbe, 0x63, 0xf7, 0x82, 0x3f, 0xa2, 0x3b, 0x50, 0xbf,
- 0x2f, 0x5e, 0x31, 0xbf, 0x9c, 0xce, 0xfd, 0xbe, 0x17, 0xf8, 0xa0, 0xbd,
- 0x5c, 0x4c, 0x22, 0xbe, 0xbb, 0x87, 0x98, 0x3d, 0x8c, 0xa7, 0x4e, 0x3e,
- 0x28, 0x53, 0x4f, 0x3f, 0x1b, 0xd0, 0x38, 0x3e, 0xa5, 0x01, 0x39, 0xbe,
- 0xef, 0x04, 0xec, 0xbe, 0x6e, 0x63, 0x20, 0x3f, 0x5b, 0x3d, 0x9c, 0xbe,
- 0x1f, 0xf2, 0x07, 0xbf, 0xae, 0xb7, 0x8d, 0x3e, 0xba, 0xbc, 0x57, 0x3f,
- 0x9b, 0x23, 0x1b, 0x3f, 0x21, 0xee, 0x2a, 0xbd, 0x85, 0xfa, 0x00, 0xbe,
- 0x85, 0x1e, 0x8f, 0x3d, 0xe5, 0xbe, 0x2d, 0x3e, 0xef, 0xb8, 0xe9, 0x3d,
- 0x7d, 0x77, 0x4c, 0x3e, 0x09, 0xc8, 0xb0, 0xbd, 0x9b, 0x09, 0xc6, 0x3d,
- 0xa8, 0x13, 0xf7, 0x39, 0x94, 0xc2, 0x2d, 0xbf, 0x1c, 0x35, 0x74, 0xbd,
- 0x59, 0x89, 0x50, 0x3e, 0x9c, 0x97, 0xd6, 0xbe, 0xf8, 0x38, 0x53, 0x3f,
- 0xcf, 0x14, 0x04, 0xbf, 0x63, 0xde, 0x54, 0xbf, 0xd2, 0xdc, 0x39, 0x3f,
- 0x5e, 0xba, 0x78, 0x3f, 0x94, 0x8f, 0x0d, 0xbf, 0x60, 0xa3, 0xaa, 0x3e,
- 0x46, 0xf0, 0x4f, 0xbf, 0xdf, 0x37, 0x40, 0xbf, 0xd1, 0x32, 0x71, 0x3e,
- 0x0c, 0xed, 0x43, 0xbf, 0xc5, 0x63, 0xa0, 0x3f, 0xda, 0x02, 0xdc, 0xbe,
- 0x42, 0xc8, 0xb2, 0xbe, 0x95, 0x52, 0x33, 0x3e, 0x2b, 0x92, 0xa3, 0xbf,
- 0x08, 0x6b, 0x4d, 0xbe, 0x8d, 0x43, 0x44, 0xbe, 0xc7, 0x5d, 0xe2, 0x3e,
- 0x28, 0xb7, 0xa6, 0x3e, 0x7e, 0x30, 0xa9, 0xbf, 0x47, 0xa1, 0xc5, 0x3e,
- 0xf5, 0xd6, 0xae, 0xbe, 0x02, 0x47, 0xbf, 0xbe, 0x6b, 0x1d, 0xed, 0xbd,
- 0x0e, 0x6b, 0x1e, 0xbe, 0xba, 0x58, 0x74, 0xbd, 0x63, 0x03, 0x18, 0xbf,
- 0x16, 0xcc, 0x6a, 0x3d, 0xee, 0xab, 0xe7, 0x3c, 0x01, 0x50, 0x8b, 0x3c,
- 0x92, 0x88, 0xbc, 0x3c, 0x4e, 0x43, 0xe0, 0x3d, 0xb9, 0xf0, 0xd1, 0xbe,
- 0xd0, 0x15, 0x48, 0xbd, 0x04, 0x76, 0x53, 0xbe, 0xb7, 0x32, 0x2c, 0x3e,
- 0x4d, 0xa7, 0x29, 0xbe, 0x8a, 0xab, 0x28, 0xbd, 0x84, 0x4d, 0x2f, 0x3e,
- 0xdb, 0x62, 0xbb, 0x3d, 0xd3, 0x68, 0xbb, 0x3d, 0xe2, 0x7c, 0x44, 0x3d,
- 0x6c, 0x74, 0x05, 0xbe, 0xf9, 0x70, 0xaf, 0xbc, 0x4f, 0x6e, 0x1a, 0xbe,
- 0x76, 0xb7, 0xe3, 0xbd, 0x16, 0xd5, 0x08, 0xbe, 0x67, 0x7f, 0x0d, 0x3e,
- 0x3d, 0x3c, 0x9d, 0xbd, 0xff, 0xd1, 0x65, 0xbe, 0x41, 0xc5, 0x01, 0xbe,
- 0xad, 0x2a, 0x42, 0x3d, 0x36, 0x54, 0xa3, 0x3c, 0xb0, 0xef, 0x03, 0xbf,
- 0x9c, 0x72, 0x22, 0x3d, 0x34, 0x63, 0x37, 0xbd, 0xff, 0x65, 0x39, 0xbe,
- 0xca, 0xfe, 0x9c, 0xbc, 0x9f, 0x4d, 0x9d, 0xbd, 0x18, 0x77, 0x9b, 0xbc,
- 0xb2, 0xda, 0x51, 0x3e, 0x24, 0x4d, 0x68, 0xbd, 0x7c, 0x71, 0x16, 0xbe,
- 0x5d, 0xac, 0x09, 0x3e, 0x72, 0x20, 0x2a, 0xbe, 0x78, 0xad, 0x27, 0xbd,
- 0xfe, 0x07, 0x05, 0x3e, 0x11, 0xe5, 0x69, 0xbe, 0x22, 0x09, 0xad, 0xbd,
- 0x14, 0xc9, 0x7a, 0xbb, 0xb4, 0x09, 0x53, 0x3e, 0xdc, 0x39, 0x15, 0xbe,
- 0xa9, 0xd5, 0xa3, 0xbe, 0x66, 0x9a, 0xc3, 0x3e, 0xc6, 0x33, 0x9e, 0xbd,
- 0x6f, 0x82, 0x92, 0xbc, 0xfd, 0xaf, 0x95, 0xbd, 0xb0, 0xe8, 0xcb, 0x3d,
- 0x9f, 0xc2, 0x9f, 0xbe, 0x50, 0x7d, 0xa6, 0xbd, 0x2b, 0x90, 0xc3, 0x3e,
- 0xf0, 0x85, 0x83, 0x3c, 0x82, 0x60, 0x8b, 0xbd, 0x2a, 0x7b, 0x24, 0x3d,
- 0x1e, 0x52, 0xaa, 0xbd, 0xa9, 0x68, 0xcd, 0xbc, 0x01, 0x76, 0xfb, 0xbd,
- 0x6d, 0xd1, 0x90, 0x3d, 0x61, 0x8b, 0x96, 0xbb, 0x54, 0xd8, 0x5a, 0xbe,
- 0x0b, 0x95, 0x63, 0x3d, 0x73, 0x3b, 0x1e, 0x3e, 0xad, 0x3e, 0x36, 0x3d,
- 0x14, 0x98, 0x99, 0x3d, 0xe2, 0x37, 0x2c, 0x3d, 0x81, 0x69, 0x53, 0x3d,
- 0x9a, 0x85, 0xc5, 0x3d, 0x56, 0xa3, 0xb6, 0x3c, 0xd2, 0x13, 0xb5, 0xbc,
- 0x87, 0x4e, 0x17, 0xbe, 0x1b, 0x09, 0x01, 0x3e, 0xe2, 0x58, 0x0f, 0x3d,
- 0xd9, 0xc9, 0x46, 0xbc, 0xba, 0x4b, 0xa3, 0xbe, 0x48, 0xde, 0xde, 0x3c,
- 0x74, 0x30, 0x28, 0xbd, 0x04, 0x1a, 0x84, 0xbe, 0x22, 0x14, 0x23, 0x3e,
- 0x31, 0x67, 0x4e, 0xbe, 0x13, 0x27, 0xbc, 0xbd, 0xc2, 0x1a, 0x1e, 0xbe,
- 0xe6, 0x8e, 0x93, 0x3d, 0x79, 0x83, 0xc2, 0xbc, 0x83, 0x3b, 0x21, 0x3e,
- 0x93, 0xbf, 0x8c, 0xbd, 0xb7, 0xbc, 0xb3, 0xbd, 0xc4, 0x1d, 0x4b, 0x3d,
- 0x08, 0x59, 0x85, 0x3d, 0x64, 0x25, 0x5c, 0xbe, 0x5e, 0x41, 0x98, 0xbb,
- 0x25, 0x29, 0x02, 0x3e, 0x5e, 0x4d, 0x07, 0xbe, 0x57, 0x20, 0xfc, 0x3c,
- 0xd1, 0xa9, 0x2e, 0x3d, 0xd2, 0x37, 0x34, 0xbd, 0x88, 0xf2, 0xb0, 0xbd,
- 0x78, 0xa5, 0xf2, 0xbe, 0xea, 0xde, 0x78, 0xbe, 0xad, 0x9e, 0xde, 0x3c,
- 0xb2, 0xa2, 0x37, 0xbd, 0x1d, 0x10, 0xdd, 0xbc, 0xbb, 0x24, 0xab, 0x3d,
- 0x18, 0xe6, 0x90, 0x3d, 0xbc, 0x43, 0x05, 0xbf, 0x64, 0xa8, 0x9e, 0x3e,
- 0x92, 0x3a, 0x20, 0x3d, 0x7c, 0x68, 0x1f, 0xbd, 0xf2, 0xe2, 0xaf, 0xbd,
- 0xc7, 0x7d, 0x6e, 0x3e, 0x40, 0xdc, 0xd8, 0xbd, 0x68, 0x8e, 0x76, 0xbe,
- 0x01, 0x29, 0xfc, 0xbd, 0xc5, 0x5b, 0x75, 0x3f, 0xce, 0x95, 0x92, 0xbe,
- 0xfe, 0xb9, 0x6d, 0x3f, 0xee, 0xc0, 0x67, 0x3f, 0x6e, 0x63, 0x3c, 0x3f,
- 0x69, 0x73, 0x17, 0x3e, 0x3e, 0x10, 0x2a, 0x3e, 0x24, 0xd4, 0xbf, 0xbe,
- 0xdb, 0x90, 0x42, 0xbf, 0xd5, 0xcf, 0x75, 0x3e, 0x09, 0xaa, 0xad, 0xbc,
- 0xc9, 0x58, 0xcb, 0x3e, 0xe3, 0x3d, 0xcd, 0xbe, 0xca, 0x34, 0x40, 0xbf,
- 0x9d, 0xf9, 0x00, 0xbf, 0x91, 0xae, 0x69, 0x3e, 0xae, 0x86, 0xe3, 0xbe,
- 0xd6, 0x01, 0x21, 0xbf, 0xac, 0xf9, 0xe8, 0xbe, 0x5d, 0x48, 0x62, 0x3e,
- 0x48, 0xf8, 0xa1, 0x3b, 0xae, 0x14, 0x93, 0xbd, 0x7f, 0xc8, 0x0d, 0xbf,
- 0xc1, 0xc8, 0x06, 0xbe, 0x75, 0x3b, 0x59, 0xbe, 0x86, 0x72, 0x1d, 0xbf,
- 0x09, 0x83, 0x91, 0xbf, 0x78, 0x48, 0x83, 0x3c, 0x4e, 0xc2, 0x19, 0xbe,
- 0x00, 0xd0, 0x02, 0x3e, 0x56, 0x4c, 0x49, 0xbf, 0x63, 0x61, 0xb1, 0xbe,
- 0xc6, 0x52, 0xce, 0x3e, 0x3e, 0x67, 0x41, 0xbf, 0x62, 0x40, 0x9f, 0xbf,
- 0xf1, 0x5a, 0xf3, 0x3e, 0x58, 0xf5, 0x92, 0xbe, 0xce, 0x43, 0x72, 0x3e,
- 0xd5, 0xbb, 0x19, 0xbf, 0xd6, 0xdd, 0xcf, 0x3d, 0x4a, 0xff, 0x05, 0xbe,
- 0x6f, 0x18, 0x7f, 0x3d, 0x52, 0x1f, 0xcf, 0x3e, 0xba, 0x30, 0x3c, 0x3f,
- 0x4e, 0xed, 0x41, 0x3e, 0x00, 0x15, 0x0e, 0xbf, 0xf7, 0x52, 0xfc, 0x3a,
- 0xa5, 0xdc, 0xdb, 0xbd, 0xa7, 0x07, 0xf5, 0x3d, 0x02, 0xcf, 0x8c, 0x3f,
- 0xbe, 0xbc, 0x08, 0xbe, 0xca, 0xf0, 0x33, 0x3f, 0x46, 0xbc, 0x56, 0x3e,
- 0x0b, 0x17, 0x59, 0x3e, 0xb0, 0xec, 0xf1, 0xbe, 0x00, 0xab, 0xbc, 0x3f,
- 0x64, 0x99, 0xa4, 0x3d, 0x48, 0x09, 0x99, 0xbe, 0x4d, 0xc6, 0x11, 0x3f,
- 0x49, 0x96, 0x93, 0xbc, 0x74, 0x78, 0x96, 0xbe, 0xc8, 0xa9, 0x94, 0x3d,
- 0x9b, 0xee, 0xdd, 0xbe, 0x2f, 0x22, 0x28, 0xbe, 0xb7, 0xc1, 0xbb, 0xbe,
- 0x6a, 0xf9, 0x59, 0x3f, 0xcb, 0x8f, 0xd5, 0x3e, 0x74, 0xa8, 0xd6, 0xbe,
- 0xe6, 0x29, 0x62, 0x3e, 0x60, 0xc6, 0xc3, 0x3d, 0x31, 0xab, 0x1f, 0xbe,
- 0x89, 0x57, 0x32, 0xbf, 0x79, 0x42, 0xbc, 0x3e, 0x25, 0xa3, 0xc5, 0xbe,
- 0x36, 0x16, 0x59, 0xbe, 0x60, 0x20, 0x43, 0x3f, 0x94, 0x9f, 0x7b, 0xbf,
- 0xcb, 0x01, 0xec, 0xbe, 0x60, 0x79, 0xec, 0xbe, 0xf0, 0x3b, 0x60, 0x3d,
- 0xcb, 0x01, 0x6d, 0xbe, 0x2b, 0x8c, 0x5a, 0x3b, 0x4b, 0x90, 0x78, 0xbe,
- 0xc0, 0xc0, 0x32, 0x3e, 0xfd, 0x77, 0x1a, 0x3f, 0x60, 0x86, 0xfe, 0x3e,
- 0x5b, 0xd0, 0x08, 0x3d, 0x42, 0x2b, 0x3e, 0x3e, 0x44, 0x29, 0xbd, 0xbe,
- 0x7c, 0x8c, 0xa6, 0x3e, 0xba, 0xb0, 0x9f, 0xbe, 0x2f, 0xcd, 0x6d, 0xbe,
- 0x9c, 0xb1, 0x1a, 0x3e, 0xb9, 0x01, 0x85, 0x3e, 0x82, 0xd8, 0xdf, 0xbe,
- 0x2d, 0x99, 0x97, 0x3f, 0xdc, 0x13, 0x8c, 0xbe, 0x61, 0x6a, 0x0b, 0x3f,
- 0xc3, 0x03, 0x8a, 0xbf, 0x3d, 0x0e, 0x9a, 0xbe, 0xfe, 0x60, 0x3f, 0xbf,
- 0x6b, 0x79, 0x23, 0xbf, 0xa8, 0x8c, 0x5b, 0x3f, 0x91, 0xad, 0x5b, 0xbf,
- 0x33, 0x39, 0x13, 0xbb, 0xcc, 0xa4, 0xd4, 0x3d, 0x6c, 0x65, 0x5d, 0x3e,
- 0xc4, 0x73, 0x39, 0xbe, 0x3a, 0x88, 0x02, 0xbe, 0x91, 0xf2, 0x63, 0x3d,
- 0xad, 0x3f, 0x7b, 0x3e, 0xfd, 0x2c, 0xf7, 0xbc, 0x47, 0x51, 0xd3, 0x3e,
- 0x02, 0xad, 0x4b, 0x3f, 0x81, 0xb1, 0x32, 0xbe, 0x84, 0x1d, 0x90, 0xbe,
- 0x5e, 0xc2, 0x23, 0xbd, 0x15, 0x6e, 0xdf, 0xbc, 0x07, 0xdb, 0x15, 0xbe,
- 0x48, 0x91, 0xae, 0xbe, 0x05, 0xec, 0xed, 0xbe, 0x4e, 0x3d, 0xae, 0x3d,
- 0x21, 0xe3, 0xc0, 0xbd, 0x68, 0x1b, 0x0f, 0x3e, 0xca, 0x73, 0x07, 0xbd,
- 0x03, 0xb4, 0x15, 0x3d, 0x51, 0xdc, 0xe3, 0xbd, 0x0f, 0x48, 0xec, 0xbd,
- 0xe1, 0x3b, 0x5d, 0x3e, 0x68, 0x44, 0xa9, 0x3e, 0x39, 0x67, 0xe2, 0x3d,
- 0x1d, 0xe2, 0x4b, 0xbe, 0x2f, 0x17, 0xe3, 0x3d, 0x89, 0x87, 0x1a, 0x3e,
- 0x3b, 0xbe, 0xa3, 0x3c, 0xbf, 0x50, 0xa4, 0x3d, 0xaf, 0x16, 0x22, 0xbd,
- 0xc8, 0x0d, 0x29, 0x3d, 0x1d, 0xa4, 0xd2, 0x3d, 0xb6, 0xce, 0xd5, 0x3e,
- 0x35, 0x0f, 0xfa, 0xbc, 0x93, 0x42, 0xee, 0xbe, 0x58, 0x2c, 0x0f, 0x3d,
- 0xf0, 0x6e, 0x39, 0xbd, 0xf1, 0x19, 0xdf, 0x3d, 0xe3, 0x84, 0x73, 0x3e,
- 0xea, 0x9c, 0x5d, 0xbe, 0x02, 0x59, 0x15, 0xbe, 0x14, 0xd1, 0x01, 0xba,
- 0x5d, 0x71, 0xfd, 0x3d, 0xeb, 0x17, 0x21, 0xbe, 0xef, 0x33, 0xb6, 0x3d,
- 0x0d, 0x99, 0x14, 0xbe, 0xbe, 0xb1, 0x14, 0xbd, 0xa3, 0x41, 0x2a, 0xbd,
- 0x89, 0xe3, 0xb6, 0xbd, 0x3e, 0x9b, 0x78, 0x3d, 0x1e, 0x4f, 0x08, 0x3d,
- 0x4d, 0x4d, 0x85, 0xbd, 0xf8, 0x02, 0x09, 0x3e, 0x1d, 0x86, 0x3c, 0xbd,
- 0xdd, 0x28, 0x94, 0x3d, 0xb0, 0x01, 0x31, 0x3e, 0xce, 0x06, 0x20, 0x3d,
- 0x18, 0xcd, 0x38, 0x3d, 0x8f, 0x6e, 0x0e, 0xbf, 0x51, 0x88, 0xfd, 0x3c,
- 0x82, 0x0a, 0xa8, 0xbd, 0x95, 0x3c, 0x0e, 0xbe, 0x02, 0xdf, 0x3c, 0xbd,
- 0x9c, 0xe7, 0xa0, 0xbd, 0xd2, 0xb8, 0x5e, 0x3d, 0xe6, 0x3d, 0x0b, 0xbe,
- 0x2c, 0x55, 0x59, 0x3d, 0xa4, 0x1a, 0xa6, 0x3d, 0xd8, 0xdd, 0x35, 0x3d,
- 0x98, 0xf8, 0x03, 0x3d, 0x40, 0xd2, 0x36, 0xbe, 0xe9, 0x63, 0x09, 0xbf,
- 0xaa, 0x5b, 0xc6, 0xbd, 0x0d, 0x60, 0xe4, 0xbc, 0x6d, 0x26, 0x8c, 0x3b,
- 0x11, 0x71, 0x9b, 0x3e, 0xe8, 0xc5, 0x8e, 0xbd, 0xed, 0x3b, 0x77, 0x3d,
- 0xde, 0x98, 0xc4, 0xbe, 0x57, 0x71, 0x2e, 0xbe, 0x58, 0x3f, 0x96, 0xbe,
- 0xb5, 0xb2, 0x3d, 0xbd, 0x29, 0x9f, 0xcc, 0x3b, 0x9e, 0x4f, 0x48, 0x3e,
- 0x12, 0x2e, 0xdd, 0xbd, 0xa9, 0xe6, 0x2c, 0xbe, 0x4d, 0x8d, 0xdf, 0xbd,
- 0x09, 0x8e, 0xe7, 0xbd, 0x67, 0x67, 0xfb, 0xba, 0x86, 0x14, 0xed, 0xbd,
- 0xc6, 0xc2, 0xea, 0xbc, 0x10, 0x3e, 0x32, 0xbc, 0x63, 0xe8, 0xe3, 0x3c,
- 0xf0, 0xab, 0xee, 0xbd, 0xd1, 0x66, 0x5c, 0xbe, 0xcf, 0x91, 0x29, 0x3e,
- 0xfc, 0x2d, 0xe7, 0xbd, 0x88, 0x2a, 0xb2, 0xbe, 0x03, 0xdf, 0x55, 0x3d,
- 0x30, 0xa2, 0x58, 0xbe, 0x97, 0x35, 0x02, 0xbe, 0x44, 0xb3, 0xbb, 0x3d,
- 0xae, 0x3c, 0x6e, 0x3d, 0x21, 0x3d, 0xab, 0x3e, 0x43, 0xf1, 0x4d, 0xbe,
- 0x2d, 0xa5, 0xc0, 0xbd, 0x95, 0x76, 0x3b, 0xbe, 0x2c, 0x5f, 0xf5, 0x3d,
- 0x28, 0x51, 0xa7, 0xbc, 0x08, 0xab, 0x35, 0xbe, 0xff, 0x89, 0xf0, 0x3b,
- 0xaf, 0x2c, 0x2d, 0x3c, 0x5f, 0x27, 0x95, 0x3e, 0xc3, 0x1a, 0x51, 0xbd,
- 0x96, 0xcd, 0xce, 0x3d, 0x96, 0xc1, 0x4c, 0x3e, 0x79, 0x03, 0x69, 0xbc,
- 0x4c, 0x58, 0xab, 0xbd, 0x59, 0xa4, 0x5d, 0x3d, 0xac, 0x97, 0xfe, 0xbe,
- 0x26, 0xe7, 0xed, 0xbd, 0x87, 0x8b, 0x84, 0x3e, 0xec, 0x9d, 0x5b, 0xbe,
- 0x3d, 0x58, 0x16, 0xbd, 0x6c, 0x53, 0x46, 0x3e, 0x9a, 0x13, 0x7c, 0xbe,
- 0xe1, 0x31, 0x80, 0x3e, 0xa1, 0xdc, 0xb2, 0x39, 0x33, 0x0d, 0xf9, 0x3c,
- 0xa2, 0x85, 0x97, 0x3d, 0xf8, 0xcd, 0x63, 0xbd, 0x5c, 0xcf, 0xa0, 0xbd,
- 0x48, 0x5e, 0x97, 0xbe, 0x3c, 0xda, 0x3f, 0xbf, 0x16, 0x6f, 0x99, 0xbe,
- 0xd6, 0x81, 0x6a, 0xbd, 0xd0, 0x7a, 0x9f, 0xbe, 0x86, 0x4f, 0x4f, 0xbd,
- 0x09, 0xfd, 0x9f, 0x3d, 0x31, 0x73, 0xcd, 0x3c, 0x90, 0x56, 0x67, 0xbe,
- 0x9d, 0xd3, 0xec, 0xbd, 0x52, 0x44, 0xb6, 0xbc, 0xd6, 0x05, 0xd1, 0x3c,
- 0x1a, 0xf7, 0x53, 0x3e, 0xd6, 0x66, 0x51, 0x3d, 0x10, 0x9d, 0x95, 0x3e,
- 0xc7, 0x51, 0xc2, 0xbc, 0x9f, 0xc8, 0x5e, 0x3d, 0x9c, 0x95, 0x29, 0xbb,
- 0x7b, 0x58, 0x4e, 0xbd, 0x5e, 0xe9, 0x9d, 0xbe, 0xd1, 0x21, 0xab, 0x3e,
- 0x36, 0x0b, 0xc8, 0xbe, 0x6f, 0x2a, 0xd1, 0xbd, 0x37, 0x5c, 0x91, 0x3e,
- 0xff, 0x4d, 0xc0, 0x3d, 0xb6, 0xb5, 0x3d, 0x3d, 0x24, 0x06, 0x21, 0x3e,
- 0x87, 0x79, 0x0f, 0xbd, 0xca, 0x22, 0x9c, 0x3d, 0xa5, 0xad, 0x60, 0x3d,
- 0x24, 0x3b, 0x5b, 0x3e, 0xeb, 0x67, 0x77, 0x3d, 0xca, 0x5d, 0x14, 0xbe,
- 0xc2, 0xf4, 0xa1, 0xbe, 0x70, 0xc7, 0x88, 0xbd, 0xbd, 0x4a, 0xf4, 0xbd,
- 0x5c, 0xea, 0x8e, 0x3d, 0x8f, 0x42, 0x21, 0x3c, 0x94, 0xdd, 0xba, 0xbd,
- 0x02, 0x0e, 0x2b, 0x3e, 0x61, 0x70, 0x90, 0xbe, 0x56, 0xbf, 0x75, 0xbd,
- 0x4b, 0xac, 0x69, 0x3e, 0x6e, 0x50, 0x53, 0x3d, 0x15, 0xd3, 0x5e, 0x3e,
- 0x32, 0xdd, 0x20, 0x3e, 0x30, 0x60, 0xd8, 0x3e, 0x4b, 0x01, 0xb9, 0xbd,
- 0x20, 0x65, 0xec, 0x3d, 0xa9, 0xc8, 0x18, 0x3d, 0x63, 0xc8, 0x82, 0xbe,
- 0x4e, 0xeb, 0x8b, 0x3d, 0x72, 0xb3, 0x53, 0xbe, 0x38, 0x11, 0x19, 0x3e,
- 0x8c, 0x27, 0xaf, 0xbc, 0x00, 0x6c, 0x9f, 0xbd, 0xe4, 0x30, 0xb7, 0xbe,
- 0x04, 0x34, 0xd8, 0xbd, 0x68, 0x42, 0xd6, 0xbd, 0x85, 0x6a, 0x26, 0x3d,
- 0x83, 0xbe, 0x05, 0xbe, 0xd7, 0x6f, 0xa9, 0xbe, 0x04, 0x65, 0x84, 0xbe,
- 0x70, 0xe3, 0xae, 0xbe, 0xdc, 0xf4, 0x85, 0xbe, 0x80, 0xa3, 0x5b, 0xbe,
- 0x48, 0x9c, 0x03, 0xbe, 0x6f, 0x57, 0x00, 0xbe, 0xf8, 0x76, 0x10, 0x3e,
- 0xb8, 0xbd, 0xd1, 0xbe, 0xf2, 0xb1, 0xbf, 0x3d, 0xc6, 0xa6, 0x87, 0xbc,
- 0x1f, 0x63, 0x21, 0xbe, 0x0a, 0x8d, 0xb2, 0x3d, 0x8c, 0x5b, 0xb5, 0x3d,
- 0x2a, 0x7c, 0xd3, 0xbc, 0xe0, 0x40, 0x2c, 0xbd, 0xa5, 0x62, 0x3f, 0xbe,
- 0x90, 0x12, 0x04, 0x3e, 0x31, 0x3a, 0x27, 0x3c, 0x5a, 0x8d, 0x66, 0x3d,
- 0xaa, 0x4a, 0x4b, 0xbe, 0x6d, 0x89, 0xe2, 0x3d, 0x5a, 0x05, 0x12, 0xbe,
- 0x39, 0x51, 0x00, 0xbe, 0xa7, 0x06, 0xf6, 0x3c, 0xf0, 0x96, 0x92, 0x3d,
- 0xd7, 0xb9, 0x97, 0x3e, 0x07, 0x9d, 0x24, 0xbd, 0x8d, 0x70, 0x6b, 0xbe,
- 0xb3, 0x2b, 0x82, 0xbd, 0x61, 0x46, 0xdc, 0xbe, 0x64, 0x46, 0x87, 0x3e,
- 0xf4, 0x60, 0x8f, 0x3e, 0x97, 0x14, 0x7f, 0xbe, 0xb6, 0xd7, 0xcd, 0x3e,
- 0xbe, 0xa9, 0xdb, 0x3d, 0x1a, 0xbc, 0x5a, 0x3e, 0xfc, 0x54, 0xcd, 0x3e,
- 0xa3, 0xd6, 0x37, 0x3e, 0x14, 0x01, 0x36, 0xbe, 0xf8, 0xfd, 0xc3, 0x3e,
- 0xe8, 0x95, 0x7b, 0xbd, 0xb7, 0x08, 0xa3, 0x3b, 0xd5, 0x66, 0x26, 0xbf,
- 0x47, 0x93, 0x4f, 0xbe, 0x5d, 0x82, 0x33, 0x3e, 0xec, 0x7b, 0x61, 0x3d,
- 0xf4, 0x2d, 0x83, 0xbe, 0xe7, 0xfa, 0xde, 0xbd, 0xc2, 0x5f, 0xa2, 0xbe,
- 0x33, 0x80, 0x3a, 0x3e, 0x76, 0x1d, 0x61, 0x3f, 0x8a, 0x50, 0x05, 0xbd,
- 0xf9, 0x9e, 0xb5, 0xbe, 0x1e, 0xd4, 0x34, 0xbe, 0x3f, 0xd4, 0x91, 0xbe,
- 0x9e, 0x25, 0x98, 0xbd, 0x9f, 0xe3, 0x2a, 0x3e, 0xb6, 0xf5, 0x16, 0x3f,
- 0x24, 0x33, 0xbc, 0x3f, 0x3d, 0xd4, 0x22, 0xbf, 0x29, 0x11, 0x2b, 0xbf,
- 0xee, 0xe5, 0x01, 0x3f, 0x67, 0xab, 0xa2, 0x3f, 0xdc, 0xf9, 0x25, 0x3f,
- 0xb4, 0x44, 0x00, 0x3f, 0xc2, 0x03, 0x82, 0xbf, 0xca, 0xd7, 0x3b, 0xbf,
- 0x4d, 0xb2, 0xf6, 0xbd, 0x58, 0xba, 0x8a, 0xbf, 0x5d, 0x0f, 0xe7, 0xbe,
- 0x1a, 0x5b, 0x48, 0xbe, 0x31, 0xb0, 0x8d, 0xbe, 0x94, 0x0a, 0xd1, 0x3e,
- 0x22, 0x30, 0x5f, 0xbf, 0xee, 0xdb, 0x68, 0xbe, 0xde, 0x41, 0x41, 0x3e,
- 0xdf, 0x15, 0x4a, 0xbf, 0x46, 0xdd, 0x1c, 0xbe, 0x19, 0xd0, 0x7f, 0x3f,
- 0x8d, 0x58, 0x57, 0x3e, 0xc9, 0xb6, 0x05, 0x3f, 0xb4, 0x09, 0x3b, 0xbe,
- 0x66, 0x47, 0x9b, 0xbe, 0xaf, 0x92, 0xcd, 0x3e, 0xe1, 0xc2, 0x3c, 0xbe,
- 0xdb, 0x1e, 0x91, 0xbe, 0xc3, 0x36, 0xbe, 0xbe, 0x57, 0x6d, 0xd9, 0xbe,
- 0x4d, 0xa2, 0x13, 0x3f, 0xce, 0x59, 0xac, 0x3d, 0x36, 0x05, 0xae, 0x3d,
- 0x6f, 0x6b, 0x23, 0xbe, 0x74, 0xba, 0xd5, 0xbd, 0x5b, 0x57, 0x1f, 0x3f,
- 0x78, 0xac, 0x08, 0x3f, 0x56, 0x95, 0x2a, 0x3f, 0xda, 0xbe, 0x51, 0xbe,
- 0xb4, 0x4f, 0xa7, 0xbc, 0x88, 0xe9, 0x6f, 0xbe, 0x32, 0xae, 0x95, 0xbd,
- 0x4d, 0x02, 0x67, 0xbe, 0x7d, 0xfc, 0x21, 0xbf, 0x7d, 0x24, 0x31, 0x3d,
- 0x72, 0x35, 0x7b, 0x3e, 0x75, 0x8c, 0xf3, 0x3e, 0xf2, 0x0e, 0xae, 0x3f,
- 0xf1, 0x0c, 0x03, 0xbf, 0x7e, 0x69, 0x84, 0xbc, 0x7d, 0xb4, 0x2c, 0xbf,
- 0x43, 0xf8, 0x0f, 0xbf, 0xdf, 0x1f, 0xd2, 0x3d, 0x1b, 0xe9, 0xe0, 0x3d,
- 0x31, 0x07, 0x27, 0xbe, 0x86, 0xd2, 0x97, 0xbe, 0x46, 0xfc, 0xab, 0xbd,
- 0x6a, 0x52, 0x7c, 0xbf, 0x4d, 0x85, 0x5d, 0x3d, 0x09, 0x80, 0x53, 0xbe,
- 0x6d, 0x1e, 0xd5, 0xbe, 0xcb, 0xc5, 0x12, 0xbe, 0xcd, 0x5d, 0x8a, 0x3e,
- 0x1d, 0xaf, 0xbf, 0xbe, 0xef, 0x83, 0xb4, 0x3e, 0x64, 0x96, 0xfa, 0xbe,
- 0x14, 0xe1, 0x3a, 0xbf, 0x1c, 0xd9, 0xba, 0x3d, 0x98, 0x3e, 0x05, 0x3f,
- 0xf0, 0xd6, 0x48, 0xbd, 0xbc, 0x43, 0x42, 0xbe, 0x46, 0x72, 0xf2, 0x3d,
- 0xc7, 0xf4, 0x41, 0xbe, 0xad, 0xfb, 0x44, 0x3e, 0x8e, 0x07, 0xd1, 0x3e,
- 0x3d, 0x30, 0x91, 0xbd, 0x15, 0x9f, 0x7a, 0xbf, 0x36, 0x54, 0x69, 0xbd,
- 0xe2, 0xf6, 0xb5, 0xbe, 0x4f, 0xdf, 0x58, 0xbf, 0xc6, 0xa8, 0xf0, 0x3d,
- 0xc2, 0x0a, 0x88, 0xbb, 0x58, 0x22, 0x63, 0x3d, 0x8f, 0xce, 0xba, 0x3e,
- 0x23, 0xe4, 0xce, 0x3e, 0x3f, 0x8e, 0x21, 0x3f, 0x3c, 0xec, 0xd1, 0xbe,
- 0x23, 0xeb, 0x68, 0x3e, 0x6e, 0xe6, 0x22, 0x3f, 0x90, 0xbf, 0x36, 0xbf,
- 0x92, 0xef, 0x27, 0xbf, 0x84, 0xf1, 0xb3, 0x3e, 0x08, 0xc9, 0xdb, 0xbf,
- 0xbb, 0x8e, 0x95, 0xbe, 0xfb, 0x84, 0x08, 0x3d, 0x92, 0x6a, 0x26, 0xbf,
- 0x60, 0x0f, 0xd1, 0x3e, 0x73, 0x26, 0x0f, 0x3e, 0x40, 0x67, 0x28, 0xbf,
- 0xea, 0x03, 0x00, 0xbf, 0xa4, 0xc0, 0x40, 0x3e, 0x20, 0x8e, 0x52, 0x3d,
- 0xb2, 0x7d, 0x51, 0xbe, 0x21, 0x6e, 0x14, 0x3f, 0xd7, 0x06, 0x6e, 0x3d,
- 0x36, 0xdf, 0x95, 0x3e, 0xf6, 0x37, 0xc3, 0xbe, 0xdb, 0x58, 0x92, 0x3e,
- 0x0a, 0x40, 0xb4, 0xbe, 0x7c, 0x66, 0x29, 0x3c, 0x1a, 0xaa, 0x5d, 0xbe,
- 0x63, 0xaa, 0xca, 0x3d, 0xad, 0x1c, 0x34, 0x3e, 0x94, 0x87, 0xe2, 0xbc,
- 0x62, 0x1c, 0x01, 0x3e, 0x61, 0x27, 0xb6, 0x3d, 0xb9, 0x21, 0xb1, 0xbe,
- 0x7e, 0x02, 0xa0, 0x3d, 0xdb, 0x78, 0xac, 0xbe, 0x48, 0xb2, 0xa0, 0x3e,
- 0xf2, 0xfe, 0xfa, 0xbd, 0x64, 0x43, 0x48, 0x3d, 0xf4, 0xbc, 0x5b, 0x3d,
- 0xd5, 0xfd, 0x23, 0x3e, 0xa3, 0xb2, 0x67, 0x3d, 0x2a, 0xdb, 0xe8, 0xbd,
- 0x02, 0xde, 0x16, 0xbe, 0xd9, 0xfc, 0x11, 0xbd, 0xc7, 0xe1, 0x65, 0xbd,
- 0x43, 0xac, 0xa8, 0xbd, 0x1d, 0x23, 0xc3, 0xbc, 0xc9, 0xff, 0x67, 0xbd,
- 0x55, 0x27, 0xb1, 0xbb, 0x5e, 0xef, 0xb9, 0xbe, 0xa4, 0xf5, 0x44, 0x3c,
- 0x3d, 0xd3, 0x44, 0x3e, 0xa7, 0xa2, 0x0c, 0x3d, 0x87, 0x1f, 0x17, 0xbe,
- 0x7c, 0x22, 0x61, 0xb9, 0x47, 0x96, 0x0a, 0x3e, 0x8a, 0xa7, 0x24, 0x3d,
- 0x4d, 0x6e, 0x9d, 0x3d, 0x47, 0xd0, 0x0e, 0xbe, 0x1d, 0x0b, 0xe5, 0x3d,
- 0xe8, 0xb4, 0x00, 0xbd, 0xcb, 0x0c, 0xa0, 0xbb, 0xfc, 0xf0, 0xec, 0xbd,
- 0x1c, 0x6a, 0x44, 0x3e, 0xd5, 0x12, 0x5e, 0xbd, 0x93, 0xb4, 0xce, 0xbd,
- 0x85, 0x5b, 0xbd, 0x3d, 0x9d, 0xf8, 0xb1, 0xbd, 0x5e, 0x4d, 0x79, 0xbd,
- 0x3e, 0xb0, 0x9b, 0xbc, 0x0b, 0x77, 0x69, 0x3e, 0xf6, 0x3a, 0x87, 0xbe,
- 0x42, 0xc0, 0x08, 0xbe, 0xfb, 0x42, 0xc4, 0x3e, 0x02, 0x79, 0x71, 0xbd,
- 0x60, 0xc6, 0xd4, 0xbd, 0xb6, 0xbf, 0xbd, 0xbc, 0x0c, 0xf0, 0x12, 0xbe,
- 0x45, 0xb3, 0x36, 0xbe, 0x8a, 0x01, 0xc4, 0xbd, 0x5a, 0xea, 0x8b, 0x3d,
- 0x3d, 0x62, 0x05, 0x3e, 0xf0, 0x7d, 0x01, 0xbd, 0xb9, 0xd0, 0x39, 0xbc,
- 0xe9, 0x46, 0x0d, 0xbe, 0xa8, 0x6a, 0x5d, 0x3d, 0xfb, 0x17, 0x67, 0xbe,
- 0x91, 0x8d, 0x01, 0x3e, 0xe9, 0xbc, 0x85, 0x3d, 0x53, 0xe7, 0x2d, 0xbd,
- 0xeb, 0xa2, 0x1b, 0x3d, 0x99, 0xf4, 0xfe, 0x3d, 0x84, 0xa2, 0x2b, 0x3d,
- 0x35, 0x67, 0x00, 0x3e, 0x29, 0xdf, 0x3b, 0xbe, 0x03, 0x14, 0xe2, 0x3d,
- 0x54, 0xed, 0xce, 0x3d, 0x4b, 0x37, 0x67, 0x3e, 0x65, 0x26, 0xb6, 0x3c,
- 0x07, 0x4a, 0x01, 0x3d, 0xa3, 0xdf, 0x0c, 0xba, 0xbe, 0x15, 0x49, 0x3c,
- 0x7c, 0x96, 0x96, 0x3d, 0x81, 0xaf, 0xaf, 0xbe, 0xb4, 0x6d, 0xf0, 0xbd,
- 0x6f, 0x98, 0xee, 0xbc, 0xb8, 0x3e, 0xd4, 0xbd, 0x8d, 0x9b, 0x9d, 0x3d,
- 0xe0, 0xd7, 0xd8, 0x3d, 0xf2, 0x65, 0x79, 0xbc, 0xe4, 0x87, 0x0a, 0xbe,
- 0xed, 0xcc, 0xce, 0x3d, 0x13, 0x5f, 0xdd, 0x3d, 0x76, 0xf7, 0x76, 0x3d,
- 0x3c, 0x37, 0x67, 0x3d, 0xc2, 0x9a, 0xc5, 0xbc, 0x37, 0x54, 0x3b, 0x3e,
- 0xf9, 0x8e, 0x4d, 0x3e, 0xc6, 0xa0, 0x65, 0xbe, 0x4b, 0x25, 0xce, 0xbd,
- 0x6f, 0xfe, 0xed, 0x3d, 0xe1, 0x56, 0xba, 0xbd, 0x30, 0xd6, 0x02, 0x3e,
- 0x4a, 0xd5, 0xb1, 0x3b, 0x7a, 0xfb, 0x34, 0xbe, 0x5a, 0x82, 0x20, 0x3c,
- 0xd8, 0x0e, 0x14, 0xbe, 0xda, 0x29, 0x95, 0xbe, 0xdc, 0xde, 0xbd, 0xbd,
- 0x09, 0x0c, 0x88, 0x3d, 0xd6, 0xe6, 0xf0, 0xba, 0xdc, 0x35, 0x38, 0xbd,
- 0x5e, 0x6c, 0x2a, 0xbd, 0x94, 0x88, 0x97, 0xbe, 0x24, 0x03, 0x68, 0xbd,
- 0x12, 0x59, 0xc0, 0x3d, 0xa2, 0xdb, 0x0b, 0xbe, 0x96, 0x7e, 0x8d, 0x3e,
- 0xd0, 0x85, 0x1e, 0xbc, 0xac, 0x00, 0x4a, 0x3d, 0xef, 0x00, 0x9a, 0xbd,
- 0x0a, 0x43, 0x94, 0xbe, 0x6d, 0xb2, 0x4e, 0x3f, 0x57, 0xbe, 0xea, 0xbd,
- 0xbb, 0x45, 0x66, 0x3f, 0xdb, 0x20, 0x6d, 0x3f, 0x53, 0xb7, 0xf5, 0x3e,
- 0xb0, 0x83, 0xda, 0x3e, 0x0d, 0x03, 0x7a, 0x3e, 0xfd, 0x09, 0x86, 0xbe,
- 0x5b, 0x30, 0x1b, 0xbf, 0x71, 0x68, 0x9e, 0xbe, 0xcb, 0xdb, 0xea, 0x3d,
- 0x8a, 0x12, 0xb0, 0x3e, 0xf5, 0xb0, 0x7c, 0xbe, 0xf2, 0x3f, 0x03, 0xbf,
- 0x34, 0x21, 0xcc, 0xbe, 0xbc, 0x8b, 0xcd, 0x3e, 0xc7, 0xbe, 0x30, 0xbf,
- 0x1e, 0x46, 0x2e, 0xbf, 0x1b, 0xb7, 0xe0, 0xbd, 0x1c, 0x40, 0x41, 0x3c,
- 0xae, 0xb5, 0x35, 0x3e, 0xd7, 0x17, 0xc5, 0x3c, 0x7e, 0x2b, 0x31, 0xbf,
- 0x33, 0x73, 0x19, 0x3d, 0xb3, 0xcb, 0xdf, 0xbe, 0xd2, 0x6b, 0xe8, 0xbe,
- 0xe6, 0xf0, 0x9e, 0xbf, 0xa8, 0x7b, 0x03, 0xbe, 0xa4, 0xb5, 0xc9, 0xbe,
- 0x68, 0xc7, 0x92, 0xbd, 0xd5, 0x66, 0x1d, 0xbf, 0x95, 0xef, 0xbd, 0xbd,
- 0x5c, 0x76, 0xe6, 0x3e, 0x03, 0x41, 0x03, 0xbf, 0x20, 0x9b, 0x7d, 0xbf,
- 0x0a, 0xd2, 0xd1, 0x3e, 0xeb, 0xe5, 0x83, 0xbe, 0xed, 0xd7, 0x87, 0x3e,
- 0x5b, 0xf8, 0x52, 0xbf, 0xa3, 0xb2, 0x23, 0x3e, 0x0c, 0x66, 0x95, 0xbd,
- 0x1e, 0x07, 0x06, 0x3e, 0xb7, 0x51, 0xd8, 0x3e, 0x34, 0x91, 0x08, 0x3f,
- 0xf7, 0x58, 0xc1, 0x3e, 0xc3, 0x27, 0x16, 0xbe, 0x7d, 0x69, 0x2a, 0x3d,
- 0x82, 0xad, 0xa6, 0x3d, 0xf9, 0x59, 0x9c, 0xbd, 0x2b, 0x2f, 0x28, 0x3f,
- 0x4b, 0x92, 0x89, 0xbe, 0x2f, 0x5a, 0x25, 0x3f, 0x94, 0x7a, 0x13, 0xbe,
- 0x4a, 0x54, 0x30, 0xbe, 0x88, 0x02, 0x18, 0xbf, 0x0f, 0xc1, 0x89, 0x3f,
- 0xd1, 0xb8, 0x97, 0xbd, 0x94, 0x78, 0x64, 0xbe, 0xcb, 0x9a, 0xb7, 0x3e,
- 0xb0, 0x94, 0xfd, 0x3d, 0xbf, 0x1a, 0xe3, 0xbd, 0xbf, 0x8d, 0x9b, 0xbe,
- 0xe8, 0xc8, 0x10, 0xbf, 0x88, 0xcf, 0x80, 0xbe, 0x28, 0x6c, 0x29, 0xbe,
- 0x7d, 0x95, 0xe8, 0x3e, 0xdd, 0xfe, 0xfd, 0x3e, 0x71, 0xb7, 0xae, 0xbe,
- 0x48, 0x07, 0xa8, 0x3e, 0xaa, 0x8a, 0x89, 0xbe, 0xf9, 0xd4, 0x12, 0xbe,
- 0xaf, 0xe0, 0x0f, 0xbf, 0xea, 0x46, 0x6a, 0x3e, 0xd8, 0x6f, 0x12, 0xbf,
- 0x0a, 0x3c, 0x2f, 0x3d, 0x4d, 0x3c, 0x4c, 0x3f, 0x9f, 0xb5, 0x57, 0xbf,
- 0xaa, 0x99, 0xdc, 0xbe, 0x6a, 0xff, 0x07, 0xbf, 0xa8, 0x22, 0x8b, 0x3d,
- 0x17, 0x93, 0xa4, 0xbc, 0x99, 0x24, 0x1a, 0x3e, 0x4e, 0x92, 0x55, 0xbd,
- 0x53, 0x7c, 0x32, 0x3e, 0x50, 0xb7, 0x0f, 0x3f, 0x49, 0x26, 0xbd, 0x3e,
- 0xd5, 0x52, 0xdb, 0x3d, 0xf7, 0x6c, 0xd4, 0x3d, 0xc3, 0x7c, 0x10, 0xbe,
- 0x77, 0xe4, 0x96, 0x3e, 0x41, 0xd5, 0x1b, 0xbf, 0x6b, 0x42, 0x01, 0xbe,
- 0x97, 0xf5, 0xd2, 0x3e, 0x75, 0xf5, 0x79, 0x3e, 0x06, 0x80, 0x8e, 0xbe,
- 0xb6, 0x69, 0x65, 0x3f, 0xd6, 0x68, 0x27, 0xbe, 0xca, 0xaf, 0x2e, 0x3f,
- 0x3e, 0x5f, 0x6d, 0xbf, 0xac, 0xeb, 0x82, 0xbe, 0x41, 0xe5, 0xd9, 0xbe,
- 0xd2, 0x6c, 0x2c, 0x3d, 0xb8, 0x11, 0x08, 0x3f, 0x3b, 0x38, 0x70, 0xbf,
- 0xef, 0x00, 0xd6, 0xbc, 0x14, 0x29, 0xc2, 0x3e, 0x70, 0xe4, 0x56, 0xbd,
- 0x4b, 0x19, 0x1b, 0x3c, 0x4a, 0x5a, 0x94, 0xbc, 0x39, 0x1c, 0x94, 0xbe,
- 0xf2, 0x07, 0xd1, 0x3e, 0xc6, 0xe9, 0x15, 0x3e, 0x7c, 0xbc, 0x31, 0x3f,
- 0xba, 0x24, 0xf5, 0x3e, 0x3a, 0x64, 0x4d, 0xbe, 0x63, 0x0c, 0xbe, 0xbe,
- 0xce, 0xa2, 0xe5, 0x3d, 0xa7, 0xe6, 0x72, 0xbd, 0xc1, 0xcb, 0x39, 0xbe,
- 0x90, 0x2b, 0x27, 0xbf, 0xc7, 0x7c, 0xdf, 0xbe, 0x7c, 0x5f, 0x5e, 0x3d,
- 0x3a, 0x16, 0xa9, 0xbd, 0x30, 0xf6, 0xc9, 0xbd, 0x14, 0x39, 0x62, 0x3e,
- 0x33, 0xb0, 0xb7, 0xbc, 0x47, 0xa3, 0x3d, 0x3d, 0x36, 0xcf, 0x04, 0x3c,
- 0x39, 0x14, 0xf1, 0x3d, 0xaa, 0x97, 0x94, 0x3e, 0x74, 0x2b, 0x7c, 0x3d,
- 0xda, 0xa7, 0x36, 0xbd, 0xc4, 0xe4, 0x4a, 0x3e, 0x35, 0x0f, 0x95, 0x3d,
- 0x87, 0xb2, 0x5b, 0x3d, 0x15, 0x10, 0x4f, 0x3c, 0x05, 0xda, 0x23, 0xbe,
- 0x96, 0xf7, 0x27, 0xbe, 0x9d, 0xb8, 0x22, 0xbe, 0xb3, 0x8a, 0x68, 0x3e,
- 0xc9, 0x8b, 0xa8, 0xbd, 0xf8, 0xe8, 0xc6, 0xbe, 0x92, 0x0f, 0xe8, 0x3b,
- 0xf1, 0xa5, 0xb7, 0xbc, 0xcb, 0xd1, 0x78, 0xbc, 0x1e, 0x5b, 0x41, 0x3e,
- 0x0b, 0x11, 0x75, 0xbe, 0xd3, 0x53, 0xb0, 0x3d, 0x11, 0xc9, 0x0a, 0x3e,
- 0x96, 0xe3, 0x00, 0x3e, 0xf9, 0x0d, 0x54, 0x3e, 0x2d, 0xc1, 0x87, 0x3d,
- 0x1a, 0xd8, 0xfb, 0xbe, 0x9d, 0x95, 0x25, 0x3c, 0x3f, 0xdf, 0xb0, 0xbe,
- 0x83, 0x54, 0x3b, 0xbe, 0x8c, 0x71, 0x72, 0x3d, 0x65, 0x6a, 0x00, 0x3e,
- 0x26, 0x35, 0x33, 0xbc, 0x2c, 0xa0, 0x85, 0x3e, 0x55, 0x70, 0x8a, 0xbd,
- 0x4f, 0x03, 0x5a, 0x3c, 0xb2, 0xaf, 0x17, 0x3d, 0xea, 0xf6, 0x45, 0xbd,
- 0x89, 0x24, 0x2a, 0x3e, 0x34, 0xbd, 0xcd, 0xbe, 0x9e, 0x5b, 0x1d, 0xbe,
- 0x21, 0x0b, 0x25, 0xbc, 0xd1, 0xf7, 0x93, 0x3d, 0x71, 0xb8, 0x10, 0xbd,
- 0x2b, 0xb5, 0xc1, 0xbd, 0xb5, 0x03, 0xed, 0x3d, 0x3a, 0x71, 0xe1, 0xbb,
- 0x1e, 0x19, 0x09, 0x3e, 0xf3, 0xed, 0x40, 0x3d, 0xf3, 0x61, 0xcf, 0x3d,
- 0x5a, 0x87, 0x88, 0xbd, 0x8e, 0xa4, 0xf9, 0xbd, 0xbc, 0x54, 0xd8, 0xbe,
- 0x5a, 0x49, 0x2e, 0xbe, 0x42, 0xfe, 0xe6, 0x3c, 0x85, 0x47, 0xe0, 0xbd,
- 0x68, 0x1f, 0x01, 0xbe, 0xa8, 0x1d, 0xe7, 0xbc, 0x90, 0x4f, 0x28, 0x3e,
- 0x9e, 0x7a, 0xcc, 0xbe, 0x1e, 0xbd, 0x1c, 0xbe, 0x97, 0x3d, 0x32, 0xbe,
- 0xbb, 0x6e, 0x5a, 0x3b, 0x08, 0x7d, 0xff, 0xbd, 0xf1, 0x32, 0xc5, 0x3e,
- 0x96, 0x0e, 0x4a, 0xbd, 0xe4, 0x95, 0xb3, 0x3b, 0xa0, 0x6d, 0xea, 0x3a,
- 0x07, 0x97, 0x84, 0x3d, 0x47, 0x2b, 0x18, 0xbd, 0xfa, 0xb2, 0x85, 0x3d,
- 0x4a, 0x76, 0x76, 0x3c, 0x15, 0x0b, 0x0e, 0x3e, 0xce, 0x76, 0x4d, 0x3e,
- 0x73, 0x59, 0x81, 0xbd, 0x1f, 0x73, 0x81, 0xbd, 0x4e, 0x0c, 0x66, 0x3e,
- 0x75, 0x11, 0xac, 0x3b, 0x21, 0xf8, 0x44, 0xbd, 0x20, 0xb0, 0x29, 0x3e,
- 0x5c, 0x80, 0x9f, 0xbe, 0x26, 0x97, 0x08, 0x3d, 0xfc, 0xd9, 0xc5, 0x3d,
- 0xf3, 0x2a, 0x4a, 0x3d, 0x1e, 0x45, 0x91, 0xbe, 0x61, 0x8a, 0xc1, 0xbe,
- 0x88, 0xa4, 0x80, 0xbd, 0x07, 0xb3, 0x6d, 0xbb, 0x3b, 0xb8, 0xa6, 0x3d,
- 0x91, 0x37, 0x02, 0x3d, 0x48, 0xe6, 0x18, 0xbd, 0x8c, 0x65, 0x4f, 0xbd,
- 0x84, 0xf4, 0xac, 0x3d, 0x8e, 0x98, 0x53, 0x3e, 0x96, 0x9e, 0x31, 0x3d,
- 0xec, 0xb8, 0x6c, 0xbd, 0x2d, 0x46, 0x08, 0x3c, 0x6b, 0xee, 0xbd, 0x3d,
- 0xc2, 0x53, 0x02, 0x3d, 0x82, 0x9f, 0x2a, 0xbd, 0x24, 0xbb, 0x10, 0xbe,
- 0x0b, 0xe5, 0xd5, 0xbd, 0xae, 0x44, 0x87, 0x3d, 0xaf, 0x74, 0xc9, 0xbe,
- 0xa5, 0xb5, 0x8b, 0x3d, 0x34, 0x82, 0x46, 0x3e, 0x1d, 0x10, 0x0b, 0xbe,
- 0xef, 0x01, 0x58, 0x3e, 0xc8, 0xd6, 0x95, 0x3d, 0x8f, 0x26, 0x84, 0xbe,
- 0xdb, 0x66, 0x07, 0x3e, 0xfb, 0xd1, 0x8c, 0x3e, 0x8a, 0x1a, 0xdd, 0xbc,
- 0x2b, 0x68, 0x34, 0xbe, 0x5d, 0xcd, 0x4a, 0xbf, 0xe2, 0xf5, 0x27, 0xbe,
- 0xd2, 0xef, 0x4f, 0xbe, 0x1f, 0x46, 0x2d, 0xbe, 0x11, 0x65, 0x63, 0xbe,
- 0x0c, 0x88, 0x4f, 0x3e, 0x8f, 0x48, 0x49, 0xbd, 0xa0, 0x34, 0x92, 0xbe,
- 0x62, 0x8c, 0x9a, 0xbd, 0x13, 0xce, 0x0c, 0x3d, 0xa7, 0x79, 0x46, 0x3b,
- 0xe7, 0x95, 0xb5, 0x3e, 0xf9, 0xc0, 0x80, 0xbd, 0x54, 0x8a, 0x12, 0x3e,
- 0xa1, 0x21, 0x86, 0x3d, 0x92, 0x15, 0xa4, 0xbd, 0xa9, 0x30, 0x83, 0x3c,
- 0x8e, 0x04, 0xcc, 0x3b, 0x59, 0x9f, 0x0a, 0xbe, 0x87, 0xe2, 0x13, 0x3e,
- 0xf2, 0x48, 0x8c, 0xbe, 0xa6, 0xd8, 0x00, 0x3d, 0x69, 0x98, 0x54, 0x3e,
- 0xd3, 0x6a, 0x71, 0x3d, 0x87, 0x77, 0x38, 0x3e, 0x6a, 0xe2, 0x70, 0x3e,
- 0xf5, 0x2d, 0x2f, 0x3d, 0x32, 0x87, 0xd6, 0x3d, 0x2c, 0x4b, 0x79, 0xbd,
- 0x66, 0x08, 0x39, 0x3e, 0xfd, 0xa9, 0xd1, 0xbb, 0x43, 0x43, 0x05, 0xbf,
- 0x24, 0xa3, 0x2b, 0xbe, 0xa9, 0xee, 0xcd, 0x3d, 0x44, 0x77, 0xaa, 0xbd,
- 0x0c, 0x75, 0x2a, 0x3e, 0xc3, 0xca, 0xb9, 0xbd, 0x0d, 0x2f, 0xba, 0x3d,
- 0xa4, 0xe5, 0x2c, 0x3d, 0x65, 0x06, 0x7b, 0xbe, 0x26, 0x50, 0x1b, 0xbe,
- 0x0b, 0x9b, 0x6e, 0x3e, 0xe7, 0x1d, 0xad, 0x3e, 0xba, 0x42, 0x52, 0x3e,
- 0x6b, 0x00, 0x1b, 0x3e, 0x89, 0x6f, 0xcb, 0x3e, 0xcd, 0x9d, 0x87, 0x3c,
- 0x70, 0xf5, 0x65, 0xbd, 0x36, 0xd5, 0xde, 0x3b, 0x74, 0xf0, 0x61, 0x3c,
- 0xa4, 0xfc, 0x26, 0x3e, 0x77, 0x3d, 0x0f, 0xbe, 0xf1, 0x22, 0x35, 0x3e,
- 0x33, 0x3a, 0x60, 0x3e, 0xc4, 0xd9, 0x8c, 0x3d, 0x0a, 0xf5, 0x69, 0xbe,
- 0x70, 0x3d, 0x2c, 0xbe, 0x19, 0x2c, 0x0c, 0xbe, 0x4a, 0xed, 0x05, 0xbe,
- 0x68, 0x71, 0x14, 0xbe, 0x05, 0x04, 0x89, 0xbe, 0x70, 0x11, 0x04, 0xbe,
- 0xe9, 0xce, 0x72, 0xbd, 0xa0, 0x8f, 0x15, 0xbe, 0x60, 0x6f, 0x16, 0x3d,
- 0x15, 0xf8, 0xd9, 0xbd, 0x33, 0xfa, 0x3b, 0x3e, 0x3c, 0xff, 0x88, 0x3e,
- 0x1f, 0x03, 0xbf, 0xbe, 0xd3, 0xe3, 0x72, 0x3e, 0x57, 0xa6, 0x13, 0xbe,
- 0x65, 0x78, 0x35, 0xbd, 0x93, 0x07, 0x9e, 0x3d, 0xf8, 0xdc, 0xb0, 0x3d,
- 0x54, 0xfb, 0xf4, 0xbd, 0xb7, 0x5e, 0x78, 0x3d, 0xdb, 0xe2, 0x89, 0xbe,
- 0xb5, 0xdf, 0x21, 0x3d, 0x2a, 0x3b, 0x4b, 0xbe, 0x67, 0x48, 0x92, 0xbd,
- 0xe3, 0x6f, 0x30, 0xbe, 0x96, 0xbd, 0xca, 0x3d, 0x8c, 0x72, 0x31, 0xbe,
- 0x9e, 0x4a, 0x4c, 0xba, 0x7b, 0xeb, 0x4b, 0x3d, 0x92, 0xf8, 0x5d, 0x3d,
- 0x94, 0x94, 0x8c, 0x3e, 0xdc, 0x8b, 0xdf, 0xbe, 0xad, 0xd4, 0x9b, 0xbe,
- 0xad, 0x50, 0x33, 0x3c, 0xe5, 0x95, 0xc1, 0xbd, 0xf1, 0x98, 0x74, 0x3d,
- 0x07, 0x46, 0x8e, 0x3e, 0x99, 0x1c, 0x75, 0xbe, 0x9f, 0xc0, 0x4a, 0x3e,
- 0x65, 0xb4, 0x30, 0xbd, 0x57, 0xc6, 0x70, 0xbd, 0x9d, 0x12, 0xce, 0x3e,
- 0x8e, 0xca, 0xf7, 0x3d, 0xee, 0x7b, 0x24, 0xbe, 0x28, 0x1e, 0xb2, 0x3e,
- 0x1c, 0x4c, 0x93, 0xbd, 0x03, 0x21, 0xae, 0xbc, 0xc2, 0xf1, 0x73, 0xbe,
- 0xf6, 0x02, 0x44, 0xbe, 0x97, 0x21, 0xb5, 0x3c, 0xb1, 0xf9, 0xca, 0x3e,
- 0x59, 0xc5, 0xd5, 0xbd, 0xe6, 0x45, 0x2f, 0xbe, 0xfe, 0xa7, 0x8d, 0xbe,
- 0x33, 0x6d, 0x94, 0x3e, 0xdf, 0xbc, 0xa8, 0xbd, 0x23, 0x40, 0x73, 0xbe,
- 0x21, 0x19, 0xab, 0xbe, 0x44, 0xdc, 0x9a, 0x3e, 0xe6, 0x1e, 0xd8, 0x3e,
- 0x88, 0x96, 0x1a, 0x3e, 0xb2, 0x00, 0x6e, 0xbd, 0xdb, 0xf9, 0x88, 0x3e,
- 0x5f, 0x7c, 0x31, 0x3f, 0xb0, 0xa6, 0x42, 0xbf, 0x54, 0x54, 0x04, 0xbf,
- 0xc0, 0xa9, 0xa4, 0x3e, 0x64, 0x78, 0x5a, 0x3e, 0x87, 0xef, 0x53, 0xbe,
- 0x08, 0x20, 0x33, 0x3e, 0x6d, 0x0b, 0x4e, 0xbf, 0x9e, 0x37, 0x54, 0xbf,
- 0x7e, 0xe4, 0x10, 0x3f, 0xa3, 0x7d, 0x48, 0xbf, 0xc9, 0x24, 0x80, 0xbc,
- 0x96, 0x6c, 0x55, 0xbe, 0x45, 0x42, 0x9a, 0xbe, 0xae, 0x40, 0x26, 0x3e,
- 0x68, 0x10, 0xb4, 0xbf, 0x97, 0xd9, 0xf3, 0xbd, 0xf9, 0x76, 0x10, 0xbc,
- 0x6d, 0xd8, 0x53, 0x3f, 0x60, 0x77, 0x98, 0xbd, 0x98, 0x7b, 0xe9, 0x3e,
- 0xbe, 0x86, 0x03, 0xbf, 0x00, 0xba, 0x31, 0xbf, 0x00, 0x82, 0x31, 0x3f,
- 0xe1, 0x57, 0x17, 0x3f, 0xad, 0xcc, 0xd7, 0x3e, 0xd5, 0xae, 0x38, 0xbe,
- 0xdd, 0xda, 0xed, 0xbe, 0xd0, 0x5d, 0x14, 0x3d, 0xac, 0xb8, 0x1a, 0xbf,
- 0xb3, 0xf7, 0x67, 0xbc, 0x60, 0x21, 0x3b, 0xbe, 0x0c, 0x50, 0xdb, 0xbd,
- 0x37, 0x94, 0xab, 0xbd, 0xaf, 0xbf, 0x2b, 0xbe, 0x75, 0x25, 0x20, 0x3f,
- 0x77, 0xed, 0x51, 0x3e, 0x7d, 0xa4, 0xcb, 0x3d, 0x00, 0x82, 0x93, 0xbe,
- 0xe7, 0x25, 0x00, 0x3e, 0x59, 0xc7, 0xd8, 0x3c, 0xad, 0xb2, 0xb7, 0xbe,
- 0x40, 0x11, 0x83, 0xbf, 0xc9, 0xa4, 0x6a, 0xbf, 0xef, 0x69, 0x04, 0x3e,
- 0x4a, 0xa2, 0x08, 0x3e, 0x19, 0x71, 0x22, 0x3f, 0x33, 0x04, 0x3d, 0x3f,
- 0xae, 0x0d, 0x32, 0xbe, 0x75, 0x19, 0x21, 0xbf, 0xc3, 0x18, 0x03, 0x3f,
- 0x26, 0x49, 0x2b, 0xbe, 0xe2, 0x7b, 0xbc, 0xbe, 0xe4, 0x19, 0x00, 0xbf,
- 0x80, 0x56, 0xf4, 0x3e, 0x68, 0x20, 0x49, 0x3e, 0xae, 0xd7, 0x29, 0xbd,
- 0xfb, 0xa8, 0x5e, 0xbf, 0xc6, 0xe6, 0xa7, 0xbf, 0xe7, 0x02, 0x1b, 0x3f,
- 0xd6, 0xbc, 0x56, 0x3d, 0x44, 0x6e, 0xe2, 0x3d, 0xb3, 0xf1, 0x14, 0xbf,
- 0xed, 0xf9, 0xa5, 0xbd, 0x2d, 0x02, 0x6f, 0x3e, 0x21, 0x42, 0x47, 0xbf,
- 0x70, 0xd2, 0xc2, 0x3e, 0xc1, 0xce, 0x97, 0x3e, 0x21, 0xe7, 0x98, 0x3e,
- 0x62, 0x1c, 0x87, 0x3e, 0x7b, 0x73, 0x82, 0x3d, 0x10, 0x11, 0x80, 0xbc,
- 0x9c, 0xd5, 0xad, 0x3d, 0x56, 0x1d, 0x1a, 0x3e, 0xcb, 0x68, 0x48, 0x3e,
- 0x86, 0xab, 0x0f, 0x3c, 0xcf, 0xb7, 0xc1, 0xbe, 0xd2, 0x51, 0x19, 0xbf,
- 0x25, 0x8e, 0xa0, 0x3e, 0xa4, 0x76, 0x0f, 0x3f, 0xe8, 0x7d, 0x61, 0xbf,
- 0x74, 0x63, 0xab, 0x3e, 0x6d, 0xa2, 0x71, 0xbe, 0x81, 0x70, 0x6c, 0x3f,
- 0x36, 0xb6, 0x8b, 0xbe, 0x42, 0x52, 0xbe, 0x3e, 0x09, 0x4d, 0xa4, 0xbe,
- 0x4f, 0xc9, 0xa1, 0xbe, 0xcb, 0x0a, 0x9b, 0x3e, 0x3a, 0xc8, 0x9b, 0xbe,
- 0x2b, 0xb4, 0xd4, 0xbe, 0xfd, 0x13, 0x31, 0xbf, 0xbc, 0x94, 0x17, 0x3f,
- 0x14, 0xee, 0x2c, 0xbe, 0x28, 0x3e, 0x36, 0x3e, 0xe6, 0xab, 0x78, 0xbd,
- 0xfd, 0x4f, 0x29, 0xbe, 0xff, 0x6c, 0x81, 0x3f, 0xba, 0xbc, 0x6d, 0x37,
- 0x8b, 0xba, 0x2f, 0x3f, 0xdf, 0x92, 0xb2, 0x3e, 0xf4, 0xc2, 0xcf, 0xbd,
- 0x66, 0x75, 0x39, 0x3e, 0xfe, 0xa8, 0xda, 0x3c, 0x98, 0xac, 0xcf, 0xbc,
- 0x4b, 0x88, 0xc0, 0xbe, 0xd2, 0x21, 0x07, 0xbf, 0x76, 0x29, 0xa3, 0x3d,
- 0xb1, 0xa6, 0x9c, 0xbe, 0xf4, 0xa2, 0x17, 0x3e, 0x4e, 0x90, 0x3d, 0xbe,
- 0x1b, 0x58, 0x8c, 0x3d, 0x07, 0x44, 0x7d, 0x3d, 0x13, 0xa6, 0xff, 0xbd,
- 0x1e, 0x18, 0xc8, 0xbc, 0xd9, 0xcc, 0x6b, 0xbb, 0x98, 0x67, 0xe6, 0xbd,
- 0x40, 0xca, 0x8d, 0xbd, 0x42, 0xdd, 0x80, 0xbe, 0x66, 0x1e, 0xe7, 0x3d,
- 0x66, 0x57, 0x57, 0xbe, 0xc3, 0x30, 0xef, 0x3c, 0x19, 0x43, 0x92, 0x3b,
- 0x3d, 0xd0, 0x07, 0x3e, 0xd5, 0x74, 0x1a, 0x3d, 0x82, 0x2d, 0x85, 0xbd,
- 0x7b, 0x37, 0xda, 0xbd, 0x8a, 0xf6, 0xe4, 0xbc, 0x47, 0x12, 0x76, 0x3d,
- 0x51, 0x66, 0x3b, 0xbe, 0xe5, 0xbd, 0x0e, 0x3e, 0x91, 0xba, 0xf5, 0x3c,
- 0xb7, 0x24, 0x36, 0x3c, 0x21, 0xf4, 0x13, 0xbe, 0x81, 0xc5, 0x44, 0xbe,
- 0xbe, 0x09, 0x5d, 0x3d, 0x75, 0x86, 0x2e, 0xbd, 0x99, 0x87, 0xd4, 0xbd,
- 0x20, 0xcc, 0x07, 0xbe, 0xcb, 0x98, 0x7f, 0xbd, 0x1b, 0x42, 0x8d, 0x3d,
- 0xf4, 0xfb, 0xf2, 0xba, 0xc8, 0x12, 0x0b, 0xbe, 0x6a, 0xec, 0xf8, 0x3b,
- 0xd8, 0x07, 0x3a, 0x3e, 0x6d, 0x2b, 0xef, 0xbd, 0xae, 0xe5, 0x87, 0xbd,
- 0xb3, 0xa2, 0xb2, 0x3d, 0xbe, 0x78, 0x13, 0xbe, 0x8e, 0x68, 0xd9, 0x3c,
- 0xb6, 0x66, 0x28, 0x3e, 0x7b, 0x85, 0x4e, 0xbe, 0x0c, 0xab, 0x92, 0xbc,
- 0xff, 0x35, 0xe2, 0xbc, 0x0e, 0x13, 0x64, 0x3e, 0xd2, 0x4f, 0x3b, 0xbe,
- 0x75, 0x23, 0x6d, 0xbe, 0x99, 0x23, 0xcd, 0x3d, 0x05, 0x64, 0xe8, 0x3a,
- 0xea, 0xed, 0x5d, 0x3d, 0x2d, 0x86, 0xcd, 0xbd, 0x3f, 0x37, 0xf3, 0xbd,
- 0x44, 0xf1, 0x9e, 0xbe, 0x27, 0x1e, 0x2d, 0xbe, 0xaf, 0x2d, 0x09, 0x3c,
- 0x1b, 0x7a, 0xcd, 0x3d, 0xe3, 0xc8, 0x95, 0x3c, 0x8c, 0x7b, 0xb4, 0x3d,
- 0x91, 0x91, 0x2b, 0xbc, 0xc6, 0x49, 0x99, 0x3d, 0x58, 0x96, 0xd5, 0xbe,
- 0x02, 0x86, 0x52, 0x3d, 0x32, 0xb1, 0x8c, 0x3e, 0xf9, 0x26, 0x03, 0xbe,
- 0x14, 0x12, 0xd8, 0x3d, 0x18, 0x38, 0xa3, 0x3d, 0x27, 0xd6, 0x83, 0x3a,
- 0x13, 0xd2, 0x4c, 0x3e, 0xe5, 0x72, 0x02, 0xbe, 0xf4, 0xb6, 0x66, 0x3d,
- 0xd2, 0x48, 0x82, 0x3d, 0x51, 0x14, 0x64, 0x3e, 0x4d, 0xeb, 0x0e, 0xbe,
- 0x36, 0x31, 0x9a, 0xbc, 0x3d, 0x06, 0xb3, 0x3c, 0x50, 0x54, 0x52, 0xbb,
- 0x80, 0xb0, 0x5f, 0xbc, 0xa1, 0x46, 0xbe, 0xbb, 0x00, 0x1e, 0x47, 0x3a,
- 0xed, 0x73, 0x15, 0xbe, 0x34, 0xf9, 0x8d, 0x3d, 0x7c, 0x93, 0x6e, 0x3d,
- 0x00, 0xf1, 0x7d, 0xbc, 0xf3, 0x88, 0x2d, 0xbc, 0x27, 0xa3, 0x40, 0xbe,
- 0xae, 0x6e, 0xb3, 0x3d, 0xd1, 0x6e, 0x9d, 0xbd, 0xd4, 0x95, 0xda, 0x3c,
- 0xe9, 0x01, 0x3e, 0x3e, 0x87, 0x5e, 0x0c, 0x3d, 0x9e, 0x86, 0xea, 0x3d,
- 0x0a, 0xb7, 0xe5, 0xbc, 0xca, 0x7c, 0xb3, 0xbe, 0xb3, 0x2d, 0xea, 0x3c,
- 0xc6, 0x42, 0x8b, 0x3d, 0x14, 0x67, 0xf6, 0xbd, 0xae, 0x4e, 0xe8, 0x3d,
- 0xce, 0xb0, 0xb8, 0x3d, 0xc4, 0x41, 0xee, 0x3d, 0x1e, 0x67, 0xeb, 0x3b,
- 0x77, 0x0c, 0x9f, 0xbd, 0x80, 0x56, 0x81, 0xbe, 0x9f, 0xc6, 0x21, 0xbd,
- 0xca, 0xe1, 0xee, 0x3c, 0xd4, 0x36, 0x6a, 0x3d, 0x4d, 0x80, 0xc1, 0xbd,
- 0x7b, 0x4d, 0x5f, 0xbd, 0xf9, 0xf1, 0xab, 0xbd, 0x42, 0x68, 0x36, 0xbd,
- 0xc0, 0xd5, 0x24, 0x3e, 0x77, 0xdb, 0x5e, 0xbe, 0x39, 0x54, 0x91, 0xbb,
- 0xf3, 0xbf, 0x3e, 0x3d, 0x23, 0x2b, 0xad, 0x3c, 0x4d, 0xa8, 0x6f, 0x3d,
- 0xaf, 0xa3, 0xcd, 0xbe, 0xfd, 0x74, 0x6d, 0x3f, 0x21, 0xe2, 0x66, 0xbe,
- 0x6d, 0x81, 0x5a, 0x3f, 0xff, 0x50, 0x71, 0x3f, 0xe4, 0xe4, 0x83, 0x3e,
- 0xc5, 0x65, 0xbb, 0x3e, 0x28, 0x88, 0x8a, 0x3e, 0xf8, 0xbd, 0xb3, 0xbe,
- 0xed, 0xf6, 0x30, 0xbf, 0x16, 0xc0, 0x3b, 0x3e, 0x6c, 0x80, 0xa9, 0x3d,
- 0x00, 0x17, 0xde, 0x3e, 0xf1, 0xb2, 0x83, 0xbe, 0x1b, 0x29, 0x21, 0xbf,
- 0x2d, 0x85, 0xc9, 0xbe, 0xd1, 0x47, 0x0d, 0x3f, 0x55, 0xe5, 0xfa, 0xbe,
- 0x70, 0x0c, 0x2e, 0xbf, 0x9f, 0x7d, 0x03, 0x3d, 0x0a, 0x49, 0x4a, 0xbd,
- 0xe7, 0x49, 0xf6, 0x3c, 0x9c, 0xac, 0xe3, 0x3d, 0x15, 0xac, 0x51, 0xbf,
- 0xd6, 0x5d, 0x3a, 0xbd, 0x24, 0x66, 0x36, 0xbe, 0x74, 0x2d, 0x34, 0xbf,
- 0x68, 0x0b, 0x6d, 0xbf, 0xc0, 0x67, 0x96, 0xbc, 0xfd, 0xb1, 0xb6, 0xbe,
- 0x95, 0x15, 0x26, 0xbe, 0xba, 0x44, 0x0d, 0xbf, 0xb1, 0xce, 0xf5, 0xbd,
- 0x30, 0x07, 0x0a, 0x3f, 0xa7, 0xfe, 0xdb, 0xbe, 0x41, 0x10, 0x80, 0xbf,
- 0x58, 0xef, 0xd6, 0x3e, 0xda, 0x35, 0xc4, 0xbd, 0xf2, 0xaa, 0x3f, 0x3e,
- 0xf7, 0xb6, 0x2a, 0xbf, 0x2e, 0xf1, 0x32, 0x3e, 0x1b, 0xf9, 0x31, 0x3b,
- 0x01, 0x70, 0x89, 0x3c, 0x28, 0x96, 0x85, 0x3e, 0xcb, 0x6f, 0x38, 0x3f,
- 0x8f, 0x26, 0xdb, 0x3c, 0x9c, 0xfd, 0x67, 0xbe, 0x47, 0x27, 0x1d, 0xbe,
- 0xc9, 0x45, 0x1e, 0x3e, 0x08, 0xe7, 0xc7, 0xbd, 0x51, 0x4f, 0xdf, 0x3e,
- 0x63, 0x3d, 0x9d, 0xbd, 0x6d, 0xe4, 0x35, 0x3f, 0xc5, 0xae, 0x99, 0xbd,
- 0x84, 0x59, 0x80, 0xbe, 0x54, 0x6d, 0xed, 0xbe, 0xec, 0x38, 0x8f, 0x3f,
- 0xdf, 0x6f, 0xa0, 0x3d, 0x1a, 0x30, 0xe1, 0xbe, 0xb9, 0x9a, 0x1f, 0x3f,
- 0xe9, 0x8e, 0x8a, 0x3e, 0xbf, 0x7b, 0x34, 0xbe, 0x32, 0x7c, 0x01, 0xbf,
- 0x67, 0x0e, 0x02, 0xbf, 0xe9, 0x47, 0x82, 0xbc, 0x3a, 0xb5, 0x7f, 0xbd,
- 0x12, 0x72, 0xe9, 0x3e, 0xcf, 0x12, 0xc0, 0x3e, 0x22, 0x34, 0xac, 0xbd,
- 0x7a, 0x29, 0xa7, 0x3e, 0x3c, 0xec, 0x8f, 0xbd, 0xa7, 0x77, 0x2c, 0x3e,
- 0x53, 0xa1, 0xbc, 0xbe, 0xbe, 0x7f, 0x5b, 0x3e, 0xb4, 0x68, 0xf7, 0xbe,
- 0x65, 0xa9, 0xd9, 0x38, 0x13, 0x7e, 0x12, 0x3f, 0x72, 0xec, 0x7e, 0xbf,
- 0x0f, 0x99, 0x0a, 0xbf, 0x86, 0x81, 0x83, 0xbe, 0xb0, 0x78, 0x15, 0x3d,
- 0x1f, 0xc2, 0x31, 0xbd, 0xea, 0x3f, 0xb8, 0x3e, 0x15, 0x65, 0x95, 0xbe,
- 0xf2, 0xf5, 0x94, 0xbd, 0x85, 0xe3, 0x01, 0x3f, 0x33, 0x01, 0x81, 0x3e,
- 0x7f, 0xb4, 0xa2, 0x3e, 0x4c, 0x5f, 0xc8, 0x3d, 0x5f, 0x69, 0xde, 0xbd,
- 0x6b, 0x41, 0xd9, 0x3e, 0x97, 0x3c, 0xb7, 0xbe, 0x7c, 0x8f, 0x91, 0xbe,
- 0xe6, 0xb1, 0xcb, 0x39, 0x8e, 0x51, 0x7c, 0x3e, 0x81, 0x1d, 0x99, 0xbe,
- 0x7d, 0x5b, 0x0c, 0x3f, 0x87, 0x12, 0x2f, 0x3d, 0xd6, 0xcd, 0xd3, 0x3e,
- 0xf7, 0x9e, 0x90, 0xbf, 0xca, 0x15, 0x78, 0xbe, 0xb6, 0x05, 0x27, 0xbf,
- 0x34, 0x0e, 0x62, 0x3d, 0x38, 0x90, 0x1a, 0x3f, 0x7d, 0x0d, 0x61, 0xbf,
- 0x60, 0xbc, 0x00, 0xbe, 0xe0, 0x8b, 0xd6, 0x3e, 0x3a, 0xd0, 0xb8, 0x3d,
- 0x6c, 0x57, 0xe0, 0x3d, 0x6a, 0xbc, 0xb9, 0xbd, 0x68, 0xe5, 0x6e, 0x3d,
- 0x9c, 0x49, 0xed, 0x3d, 0x19, 0x74, 0x11, 0x3e, 0xe7, 0x46, 0x07, 0x3f,
- 0x57, 0x7e, 0xe2, 0x3e, 0x0b, 0xa9, 0x40, 0xbe, 0x40, 0x87, 0x40, 0xbe,
- 0x82, 0x74, 0xe9, 0x3d, 0x35, 0xcf, 0xc1, 0x3d, 0x1d, 0x32, 0x9a, 0xbe,
- 0x16, 0x62, 0xbf, 0xbe, 0x80, 0xc1, 0xe7, 0xbe, 0x31, 0x6d, 0x27, 0x3d,
- 0x3e, 0xec, 0x0c, 0xbc, 0xf3, 0x49, 0xa4, 0xbe, 0x3f, 0xfc, 0x9f, 0x3c,
- 0xec, 0x90, 0x2c, 0x3e, 0xe2, 0x95, 0x56, 0xbc, 0xde, 0x42, 0x68, 0xbe,
- 0xae, 0xba, 0x27, 0x3c, 0xd9, 0xe6, 0xed, 0x3e, 0x97, 0x49, 0x15, 0x3d,
- 0x36, 0xc7, 0xff, 0xbc, 0x32, 0xba, 0x33, 0x3e, 0x69, 0x94, 0x1b, 0x3e,
- 0x6d, 0x3b, 0xd8, 0xbc, 0x17, 0x43, 0xf2, 0x3d, 0x54, 0x29, 0x36, 0x3d,
- 0x72, 0xfc, 0xf4, 0xbe, 0x5d, 0xc6, 0x28, 0x3b, 0x6f, 0xbf, 0x90, 0x3d,
- 0x23, 0xfd, 0x6a, 0x3d, 0x4e, 0x41, 0xc6, 0xbe, 0x1c, 0xa2, 0xd5, 0xbe,
- 0x47, 0x4d, 0x4b, 0xbe, 0xf0, 0x81, 0xee, 0x3d, 0x1b, 0x9c, 0x61, 0x3e,
- 0x42, 0xc0, 0x3c, 0xbe, 0xa6, 0xac, 0xe3, 0xbd, 0x77, 0xa3, 0x92, 0x3d,
- 0x90, 0xb2, 0x0b, 0xbe, 0x90, 0x85, 0xcf, 0x3d, 0xa6, 0xd8, 0x33, 0x3e,
- 0xbf, 0xae, 0x9a, 0xbe, 0x06, 0xc6, 0x14, 0x3e, 0x63, 0x5a, 0xb0, 0xbe,
- 0x7d, 0xad, 0xbe, 0x3b, 0xbe, 0x42, 0x01, 0x3d, 0x75, 0x1b, 0xa4, 0xbd,
- 0x8c, 0x57, 0xa8, 0xbe, 0x5d, 0x94, 0xb3, 0x3d, 0xf5, 0x1f, 0xe1, 0xbc,
- 0x1d, 0xff, 0x6e, 0x3d, 0x63, 0x79, 0x53, 0x3d, 0x57, 0x77, 0x3e, 0xbe,
- 0x86, 0x65, 0x76, 0xbc, 0xbd, 0x92, 0xc9, 0xbe, 0x6c, 0xe8, 0xf0, 0x3c,
- 0x25, 0x69, 0xbc, 0x3c, 0x7b, 0x87, 0x9a, 0x3c, 0x8b, 0x36, 0x4f, 0xbe,
- 0x9c, 0x71, 0xee, 0x3a, 0x1d, 0x9e, 0x03, 0x3b, 0x5c, 0xa4, 0x16, 0xbe,
- 0x86, 0xa6, 0x23, 0x3c, 0x1c, 0xd5, 0xf2, 0x3d, 0x69, 0x61, 0xf0, 0x3d,
- 0xa3, 0x33, 0xca, 0x3b, 0x1c, 0xe5, 0x4f, 0xbc, 0x17, 0x92, 0xe9, 0xbe,
- 0xc1, 0x8b, 0x00, 0x3e, 0x71, 0x58, 0x4a, 0xbe, 0xb9, 0x4f, 0x1e, 0x3e,
- 0xa0, 0x09, 0x8a, 0x3d, 0x78, 0xdc, 0xcc, 0xbc, 0xb0, 0xaa, 0xe2, 0xbd,
- 0x00, 0x97, 0x9e, 0xbe, 0x8c, 0x99, 0x33, 0x3d, 0x9c, 0xcd, 0x60, 0xbd,
- 0x79, 0x42, 0x3e, 0x3e, 0x7c, 0x9c, 0xcc, 0xbc, 0x58, 0x21, 0x10, 0x3e,
- 0x16, 0xe8, 0x94, 0x3b, 0xb4, 0xb7, 0x2b, 0x3e, 0xe0, 0x96, 0x8a, 0x3d,
- 0x78, 0x52, 0x21, 0x3d, 0xf5, 0x34, 0x94, 0xbd, 0x40, 0xfb, 0x0a, 0x3d,
- 0x4c, 0x37, 0x33, 0xbe, 0xa5, 0xda, 0x00, 0x3e, 0xef, 0x03, 0x6a, 0x3e,
- 0x10, 0x4c, 0x19, 0xbc, 0x0e, 0xcc, 0x22, 0x3e, 0x1c, 0x64, 0xe4, 0x3d,
- 0xce, 0x2e, 0xc2, 0xbd, 0x3d, 0x44, 0x87, 0xbe, 0xc7, 0x72, 0x87, 0xbc,
- 0x02, 0x6a, 0x85, 0xbe, 0x44, 0x29, 0xa8, 0xbd, 0xd5, 0x2d, 0xcb, 0xbd,
- 0xd2, 0x8f, 0x80, 0x3e, 0xa9, 0xf1, 0x4b, 0xbe, 0x62, 0x8e, 0x40, 0xbe,
- 0x95, 0x43, 0x12, 0xbe, 0xf1, 0xef, 0x02, 0x3e, 0xa5, 0x53, 0xba, 0x3d,
- 0x00, 0x3b, 0xd2, 0x3d, 0xca, 0x61, 0x4e, 0xbe, 0x53, 0x4d, 0x6f, 0xbc,
- 0x4b, 0x51, 0x0f, 0x3e, 0x7b, 0x88, 0xb5, 0x3d, 0x09, 0xd0, 0xd0, 0x3d,
- 0x6a, 0xdd, 0xc6, 0xbd, 0x5b, 0x5a, 0xbb, 0x3d, 0xec, 0x91, 0xd6, 0xbc,
- 0xab, 0x49, 0xda, 0xbc, 0x12, 0xad, 0x0c, 0x3e, 0x35, 0x6f, 0x38, 0xbe,
- 0xc2, 0xde, 0xf4, 0xbd, 0x13, 0xa6, 0x0b, 0x3d, 0x4f, 0x61, 0x4e, 0xbe,
- 0x2d, 0xff, 0x57, 0xbb, 0x0a, 0xe5, 0x9d, 0xbd, 0x5b, 0x6a, 0x0f, 0xbe,
- 0xd0, 0x9f, 0x11, 0xbd, 0x30, 0x24, 0x14, 0x3d, 0xc6, 0x94, 0x21, 0xbd,
- 0xe3, 0x2a, 0xf9, 0x3d, 0x67, 0x07, 0x53, 0xba, 0x78, 0x39, 0x3a, 0x3d,
- 0x3e, 0x25, 0x60, 0xbe, 0xd4, 0x56, 0x8c, 0xbf, 0xf0, 0x92, 0xc1, 0xbd,
- 0x1f, 0x1d, 0xf8, 0x3a, 0x34, 0x8c, 0xb1, 0x3d, 0x2d, 0xe7, 0xc9, 0xbd,
- 0x24, 0x2c, 0x55, 0x3c, 0x25, 0x1d, 0x68, 0x3e, 0x4e, 0xdc, 0xbf, 0xbd,
- 0x3f, 0x1c, 0x95, 0xbe, 0x53, 0xe4, 0x81, 0x3d, 0xb9, 0xe5, 0x0d, 0xbe,
- 0xb2, 0xfa, 0xe0, 0x3d, 0xb1, 0xa8, 0xd0, 0x3d, 0xff, 0xd7, 0x4c, 0x3e,
- 0x0c, 0x60, 0x79, 0xbe, 0x2c, 0x2f, 0x80, 0xbd, 0xec, 0x20, 0xb1, 0x3c,
- 0x6e, 0xd3, 0x79, 0x3c, 0x6b, 0xde, 0x45, 0xbe, 0x8b, 0x0b, 0xa9, 0xbe,
- 0xc2, 0x91, 0xce, 0xbe, 0x31, 0xe2, 0xbf, 0x3d, 0xc7, 0xbc, 0x17, 0x3e,
- 0x10, 0x4a, 0x2f, 0xbd, 0x4f, 0xe4, 0x2e, 0x3d, 0x68, 0xfa, 0xa7, 0x3d,
- 0xd1, 0x08, 0x30, 0x3e, 0x3f, 0x9d, 0xbd, 0xbd, 0x7b, 0x49, 0x56, 0xbe,
- 0xa2, 0xa3, 0x64, 0xbc, 0xcb, 0x74, 0x62, 0x3d, 0xf3, 0xe8, 0xd4, 0xbe,
- 0x16, 0x33, 0xba, 0x3c, 0x4d, 0x48, 0x47, 0x3e, 0xa5, 0x61, 0xc7, 0x3c,
- 0x5e, 0x4a, 0x89, 0xbe, 0xe0, 0x9d, 0x99, 0x3d, 0xb5, 0x9b, 0x30, 0xbd,
- 0x8c, 0x67, 0x05, 0xbc, 0x09, 0x35, 0x1a, 0xbe, 0xb4, 0x0f, 0x2b, 0xbe,
- 0xfb, 0xbb, 0xe1, 0x3b, 0x90, 0x0e, 0xf8, 0xbd, 0x83, 0x7e, 0x8f, 0x3e,
- 0xbd, 0xc0, 0x7b, 0x3d, 0x18, 0x13, 0x09, 0x3e, 0x2f, 0x49, 0x2b, 0xbe,
- 0x59, 0x8d, 0x0d, 0xbe, 0x16, 0xb3, 0x23, 0x3c, 0xdd, 0x02, 0x41, 0x3c,
- 0xb2, 0x3c, 0x3b, 0xbe, 0xcc, 0x68, 0xfd, 0xbd, 0x74, 0xf5, 0x19, 0xbd,
- 0xfe, 0x9f, 0x7a, 0x3e, 0x06, 0xab, 0x79, 0x3d, 0xc8, 0xeb, 0x01, 0xbe,
- 0x5e, 0xe6, 0x90, 0x3d, 0x26, 0x96, 0x17, 0xbe, 0xe7, 0xaa, 0x49, 0xbd,
- 0x20, 0x2d, 0xc0, 0xbe, 0x89, 0xda, 0x14, 0xbe, 0x2e, 0x7d, 0x90, 0xba,
- 0x99, 0xfc, 0xba, 0x3d, 0x64, 0x86, 0xdf, 0x3d, 0xcd, 0x1c, 0xbd, 0x3d,
- 0xca, 0x7e, 0x96, 0xbb, 0x46, 0x7c, 0x18, 0xbc, 0x80, 0x49, 0x9e, 0x3d,
- 0xa5, 0xb5, 0x29, 0x3e, 0x6d, 0x07, 0xcc, 0x3e, 0x9a, 0x34, 0xad, 0xbd,
- 0x92, 0xc2, 0x1a, 0x3d, 0xbd, 0xcd, 0x94, 0xbe, 0x38, 0x49, 0xde, 0x3c,
- 0x1b, 0x1d, 0xcc, 0xbd, 0xb5, 0x42, 0x62, 0x3e, 0xa7, 0xc2, 0xb4, 0xbe,
- 0x35, 0xea, 0x79, 0x3e, 0x74, 0x3a, 0x18, 0xbe, 0xc1, 0x43, 0x0c, 0xbe,
- 0xad, 0x2a, 0x2a, 0x3d, 0x21, 0xb4, 0x35, 0xbc, 0x2b, 0xee, 0x89, 0xbe,
- 0x47, 0x61, 0x2d, 0xbe, 0xc8, 0xae, 0xa8, 0xbd, 0x22, 0x70, 0x96, 0xbe,
- 0xa6, 0x22, 0x7d, 0x3e, 0x12, 0xf5, 0x2e, 0xbe, 0x20, 0x44, 0x21, 0xbe,
- 0x24, 0xf7, 0xa2, 0x3d, 0xee, 0x35, 0xa5, 0xbe, 0x49, 0xd4, 0x92, 0x3c,
- 0x8e, 0xc0, 0x8a, 0xbc, 0x3e, 0x22, 0x90, 0xbe, 0xb6, 0xd0, 0x84, 0x3d,
- 0x4d, 0x70, 0x8c, 0x3e, 0x28, 0x61, 0x89, 0xbd, 0x26, 0xfc, 0x05, 0x3e,
- 0xbd, 0xe4, 0x0a, 0x3d, 0xb5, 0xe0, 0xde, 0xbd, 0x74, 0x96, 0xac, 0x3e,
- 0xe9, 0x94, 0xa7, 0xbd, 0x09, 0x68, 0xfc, 0x3e, 0x29, 0xde, 0x9e, 0xbe,
- 0x4b, 0x81, 0x6b, 0x3c, 0xbb, 0xcd, 0x95, 0x3e, 0xc7, 0x00, 0xf6, 0xbc,
- 0xa1, 0x63, 0x56, 0xbd, 0x8f, 0x97, 0xc3, 0x3c, 0xe8, 0x81, 0x1b, 0xbe,
- 0xb5, 0x73, 0x2d, 0xbf, 0x01, 0x17, 0x05, 0x3f, 0x08, 0x4e, 0xe7, 0xbd,
- 0xb0, 0x7b, 0x1d, 0x3d, 0xf7, 0x3c, 0x75, 0x3e, 0x73, 0x5f, 0x0c, 0x3d,
- 0x7e, 0x1e, 0x1c, 0x3e, 0xf8, 0xf3, 0xf0, 0x3e, 0xcc, 0x95, 0x51, 0xbf,
- 0x4d, 0xfb, 0x4b, 0x3e, 0x99, 0x12, 0x92, 0x3e, 0x8a, 0x4c, 0x6b, 0xbf,
- 0xe5, 0x84, 0x5d, 0x3d, 0x08, 0xf2, 0x81, 0xbe, 0x0a, 0x4e, 0xf5, 0xbe,
- 0x05, 0xae, 0x28, 0xbf, 0x4e, 0xf2, 0xdc, 0xbe, 0xaf, 0x96, 0x50, 0xbf,
- 0x05, 0xa0, 0x8d, 0x3e, 0xcb, 0xc8, 0x76, 0xbd, 0xb4, 0x99, 0x9b, 0x3f,
- 0x38, 0x99, 0xa2, 0xbd, 0x90, 0xd1, 0xdd, 0xbd, 0x0e, 0x53, 0xf4, 0x3d,
- 0xe4, 0x15, 0x25, 0x3e, 0x37, 0x25, 0xf2, 0x3d, 0x0d, 0x88, 0xf7, 0xbe,
- 0x65, 0x4e, 0x14, 0x3f, 0x3f, 0x5b, 0x17, 0x3e, 0x2e, 0xa3, 0x29, 0x3f,
- 0x4e, 0x98, 0xed, 0xbc, 0xcd, 0xa7, 0x04, 0xbf, 0x91, 0x68, 0x81, 0x3e,
- 0x18, 0x87, 0x94, 0xbd, 0x83, 0xfa, 0x04, 0x3f, 0x7a, 0xb7, 0x80, 0xbe,
- 0xbe, 0x0d, 0xb2, 0xbe, 0x49, 0xde, 0x12, 0xbe, 0x5b, 0xf5, 0xa6, 0xbe,
- 0xc9, 0x52, 0xd6, 0xbf, 0xb1, 0x81, 0x3e, 0xbf, 0x67, 0x56, 0x91, 0xbd,
- 0x4d, 0x1f, 0x11, 0xbd, 0xea, 0xdd, 0x01, 0xbd, 0xee, 0x4d, 0x14, 0xbf,
- 0x57, 0x58, 0xf6, 0xbe, 0x59, 0x3f, 0xba, 0x3e, 0x96, 0x82, 0x8d, 0xbd,
- 0x9f, 0xc9, 0x30, 0xbf, 0xa1, 0x7b, 0x55, 0x3e, 0x3b, 0xb7, 0x9c, 0xbd,
- 0x5e, 0xd2, 0x92, 0xbe, 0x03, 0xc1, 0x92, 0xbe, 0x60, 0x81, 0x6c, 0x3e,
- 0xef, 0x96, 0xe1, 0x3d, 0xb8, 0xd6, 0x08, 0x3f, 0x15, 0x3f, 0x0e, 0xbd,
- 0x2a, 0x8d, 0x3d, 0x3d, 0xf3, 0x21, 0x8b, 0xba, 0xdd, 0x31, 0xf5, 0x3e,
- 0x5f, 0x66, 0x0a, 0x3f, 0xd8, 0x56, 0x2a, 0xbe, 0x6d, 0x7c, 0x64, 0xbe,
- 0x24, 0x49, 0x3a, 0x3f, 0xb5, 0xf9, 0xd5, 0x3c, 0xba, 0x8a, 0x0e, 0x3d,
- 0xf5, 0xfe, 0x1b, 0xbf, 0xec, 0xb3, 0x52, 0xbf, 0x7d, 0x2d, 0xbd, 0x3f,
- 0x78, 0xe8, 0xde, 0x3e, 0x27, 0xb5, 0xdb, 0xbd, 0x98, 0x21, 0xba, 0xbe,
- 0xa6, 0x2c, 0xeb, 0x3e, 0xfa, 0x04, 0xc6, 0x3e, 0x6a, 0xd9, 0xff, 0xbe,
- 0x89, 0x1d, 0x95, 0x3e, 0x90, 0xc8, 0xa4, 0x3f, 0x21, 0xb5, 0xcb, 0xbe,
- 0xe5, 0x10, 0xa8, 0x3e, 0xb6, 0xdf, 0xf0, 0x3e, 0xf0, 0xbb, 0x6b, 0x3c,
- 0x82, 0x46, 0x12, 0x3c, 0x81, 0x86, 0x8e, 0xbe, 0x1f, 0x7c, 0x4a, 0xbf,
- 0x07, 0xf1, 0xf6, 0xbc, 0x20, 0x5a, 0x86, 0xbf, 0x60, 0x4d, 0x69, 0x3e,
- 0xd4, 0xfc, 0x45, 0x3e, 0xe0, 0xa6, 0x92, 0x3e, 0xca, 0x2b, 0x52, 0xbe,
- 0x7e, 0xf8, 0xf0, 0x3d, 0x82, 0xa0, 0x25, 0xbe, 0xa7, 0x63, 0x70, 0x3f,
- 0xa8, 0xfc, 0x78, 0xbe, 0x67, 0x7a, 0x2b, 0x3f, 0x41, 0x2e, 0xd2, 0x3d,
- 0xb7, 0xfe, 0xff, 0xbe, 0x15, 0xa7, 0x67, 0x3e, 0xa4, 0x01, 0x8f, 0xbe,
- 0xad, 0x1d, 0xaa, 0xbe, 0xf1, 0x21, 0xde, 0xbe, 0x86, 0x6e, 0x8b, 0x3f,
- 0x6a, 0x83, 0x61, 0xbc, 0x90, 0x74, 0x3c, 0x3f, 0x22, 0x48, 0x9d, 0x3c,
- 0x70, 0x33, 0x3c, 0x3f, 0x69, 0xaf, 0xe5, 0xbd, 0x55, 0xb4, 0x1d, 0xbe,
- 0xa5, 0x0d, 0x48, 0x3f, 0xf9, 0xea, 0xa2, 0x3e, 0xe9, 0xcc, 0x13, 0xbe,
- 0xd3, 0x9d, 0xab, 0xbe, 0xbd, 0x50, 0x01, 0xbf, 0xbd, 0x34, 0x0e, 0x3e,
- 0x42, 0xf9, 0x04, 0xbf, 0xc9, 0xc8, 0xeb, 0xbe, 0xbf, 0x98, 0x66, 0xbe,
- 0x69, 0xe9, 0x8d, 0xbe, 0xb5, 0x8e, 0x20, 0x3e, 0x92, 0x41, 0x06, 0xbe,
- 0x42, 0xea, 0x56, 0x3c, 0xb6, 0x28, 0x42, 0x3e, 0x3c, 0xd5, 0xab, 0xbd,
- 0xb9, 0x16, 0x31, 0xbd, 0x8e, 0x1f, 0x17, 0xbd, 0xb9, 0xa3, 0x37, 0xbe,
- 0x04, 0x4f, 0xd4, 0xbd, 0x15, 0x07, 0x58, 0xbe, 0xb6, 0xfb, 0x49, 0x3e,
- 0x94, 0x6d, 0x97, 0x3c, 0xd4, 0xbf, 0xd0, 0xbb, 0x53, 0x7e, 0x0a, 0x3d,
- 0x2e, 0xcc, 0x1e, 0x3e, 0x41, 0x35, 0x74, 0x3c, 0x3d, 0xa9, 0xe4, 0x3c,
- 0xab, 0xed, 0x4e, 0xbe, 0x37, 0xbc, 0xc1, 0xbd, 0x46, 0x2d, 0x1f, 0xbc,
- 0xd6, 0x2a, 0xb5, 0xbe, 0x8d, 0xdf, 0xbc, 0x3d, 0x30, 0xd8, 0x32, 0x3d,
- 0xae, 0xf0, 0x65, 0x3e, 0xf2, 0x9c, 0x54, 0xbc, 0x1a, 0x85, 0x9f, 0xbe,
- 0xcb, 0x1a, 0xba, 0x3d, 0xe1, 0xd5, 0xbc, 0x3d, 0xf6, 0x2d, 0xaa, 0xbd,
- 0x2b, 0x47, 0xb2, 0xbd, 0xe1, 0xed, 0xba, 0x3d, 0x88, 0x17, 0x24, 0x3d,
- 0xea, 0xa2, 0xa9, 0x3b, 0x40, 0xbf, 0x17, 0xbe, 0xfb, 0x21, 0xa1, 0x3d,
- 0x09, 0xa1, 0x2f, 0x3e, 0x52, 0x02, 0xfa, 0xbd, 0x5d, 0xe8, 0x61, 0xbe,
- 0x76, 0x56, 0x91, 0xbd, 0xca, 0xbb, 0xf7, 0xbc, 0xa4, 0x99, 0xda, 0xbd,
- 0x58, 0x76, 0x47, 0xbd, 0x22, 0x46, 0x20, 0xbe, 0x20, 0x8b, 0x1b, 0xbc,
- 0xe1, 0x63, 0x34, 0x3d, 0xfd, 0x8a, 0xae, 0x3d, 0x6a, 0xc5, 0x63, 0xbe,
- 0x27, 0xb8, 0x33, 0xbe, 0x0b, 0x4e, 0x12, 0x3e, 0x2d, 0x3b, 0x30, 0x3c,
- 0x30, 0xdb, 0xeb, 0x3c, 0x1c, 0xc8, 0xd0, 0xbd, 0x5d, 0xe8, 0xb2, 0xbd,
- 0x44, 0xd7, 0x80, 0xbd, 0x34, 0xec, 0x0a, 0xbe, 0xb2, 0xdd, 0xea, 0x3d,
- 0xcc, 0x93, 0x0f, 0x3e, 0xdf, 0x54, 0xc3, 0x3c, 0xc4, 0xfa, 0x5a, 0x3d,
- 0xce, 0x0a, 0x14, 0xbd, 0x61, 0x49, 0x19, 0x3e, 0x86, 0x99, 0x88, 0xbe,
- 0x8f, 0x0d, 0x4b, 0x3d, 0x72, 0xe9, 0xde, 0x3d, 0xc8, 0x26, 0x91, 0xbe,
- 0x81, 0xf4, 0x0b, 0x3e, 0xa5, 0xeb, 0xed, 0xbc, 0x4f, 0x8a, 0x0a, 0x3d,
- 0xf7, 0x26, 0x29, 0x3e, 0xb1, 0x4c, 0x03, 0xbd, 0xec, 0x49, 0x16, 0xbc,
- 0x72, 0x6c, 0x0e, 0xbe, 0xf4, 0x08, 0x51, 0x3d, 0x05, 0x99, 0xb0, 0xbd,
- 0x22, 0x62, 0xb1, 0x3d, 0xaf, 0xa5, 0xa5, 0xbd, 0xc9, 0xf2, 0xed, 0x3c,
- 0x2c, 0xb1, 0x2f, 0x3c, 0x7b, 0x71, 0x02, 0xbe, 0xe6, 0x7e, 0x6a, 0xbd,
- 0x50, 0x70, 0xc2, 0xbd, 0x06, 0xcf, 0x12, 0xbe, 0x91, 0x9d, 0xd1, 0x3d,
- 0xe0, 0xb8, 0xd1, 0xbd, 0x7d, 0x6b, 0xdc, 0xbd, 0x3e, 0xcd, 0x16, 0xbe,
- 0x89, 0xdb, 0xc5, 0x3d, 0x67, 0x99, 0xe1, 0x3d, 0xd5, 0xe4, 0x45, 0x3d,
- 0xd5, 0x15, 0xd7, 0x3c, 0x44, 0x1d, 0x6f, 0xbe, 0xa3, 0xeb, 0x02, 0x3e,
- 0xa4, 0x6e, 0x25, 0xbd, 0x48, 0x10, 0x7d, 0xbe, 0xbe, 0xe1, 0x2b, 0x3d,
- 0x09, 0x7c, 0xad, 0x3d, 0x8f, 0x27, 0x02, 0x3e, 0xfe, 0xd6, 0xc0, 0x3d,
- 0x51, 0x1c, 0x5a, 0x3e, 0xa0, 0x9b, 0x4c, 0x3d, 0xad, 0xd6, 0x23, 0x3d,
- 0xa4, 0x34, 0x9b, 0x3d, 0x6c, 0xe9, 0x6a, 0xbd, 0xc6, 0x53, 0xcd, 0xbd,
- 0x0c, 0x5c, 0x81, 0xbc, 0xf0, 0x6d, 0xb1, 0xbc, 0x6c, 0x81, 0xb7, 0x3b,
- 0x54, 0xf8, 0x0a, 0xbd, 0xb3, 0x4e, 0xe0, 0xbd, 0xa4, 0xaa, 0xe0, 0x3d,
- 0x9b, 0xb5, 0x56, 0xbd, 0x94, 0x39, 0x6e, 0x3d, 0x6f, 0x85, 0x96, 0x3e,
- 0x7a, 0xf8, 0x82, 0xbd, 0x22, 0x91, 0x47, 0xbc, 0x26, 0xef, 0xb4, 0xbc,
- 0xc2, 0xf8, 0xd2, 0xbe, 0x66, 0xfb, 0x31, 0x3f, 0x7c, 0x26, 0x9b, 0xbd,
- 0x57, 0xa1, 0x59, 0x3f, 0x48, 0x33, 0x87, 0x3f, 0x02, 0xcc, 0x03, 0x3f,
- 0x5c, 0x3f, 0xe4, 0x3e, 0xa7, 0x59, 0xa2, 0x3d, 0x19, 0x34, 0xe0, 0xbe,
- 0x0d, 0x4a, 0xa1, 0xbe, 0x59, 0xa7, 0x09, 0xbc, 0x05, 0xb5, 0x74, 0xbd,
- 0xa1, 0xf6, 0xc4, 0x3d, 0x91, 0x66, 0xd7, 0xbd, 0x30, 0x68, 0xcf, 0xbe,
- 0xd1, 0x59, 0xe8, 0xbe, 0xca, 0x8b, 0x95, 0x3e, 0x94, 0x72, 0x0d, 0xbf,
- 0x1a, 0xf3, 0x42, 0xbf, 0xcb, 0xc7, 0x5a, 0xbd, 0xbb, 0x9b, 0x0a, 0x3e,
- 0x43, 0xa3, 0x21, 0xbe, 0x6f, 0x9d, 0x45, 0x3e, 0x4c, 0xd0, 0x10, 0xbf,
- 0x78, 0x72, 0xae, 0xbb, 0xad, 0xc8, 0x28, 0xbe, 0x4e, 0x9b, 0x35, 0xbf,
- 0x14, 0x55, 0x57, 0xbf, 0x6b, 0xac, 0xb6, 0xbd, 0xe2, 0x67, 0xf0, 0xbd,
- 0xc4, 0x14, 0x58, 0x3d, 0x50, 0xa8, 0x93, 0xbe, 0x00, 0xa2, 0x92, 0x3d,
- 0x64, 0xbb, 0xa1, 0x3e, 0xf1, 0xa5, 0xbe, 0xbe, 0xcf, 0xb6, 0x6c, 0xbf,
- 0x96, 0x4b, 0xb8, 0x3e, 0x09, 0x47, 0xed, 0xbd, 0xac, 0x48, 0xd8, 0xbc,
- 0xee, 0x6e, 0x43, 0xbf, 0xe8, 0x3f, 0xa3, 0x3e, 0x90, 0xc5, 0x04, 0xbc,
- 0xbc, 0x31, 0xdd, 0x3c, 0x46, 0x0c, 0xd4, 0x3d, 0x6f, 0xaf, 0x16, 0x3f,
- 0x01, 0x79, 0xf8, 0x3d, 0x13, 0xd6, 0x92, 0xbd, 0x36, 0xcf, 0x90, 0xbd,
- 0xec, 0x79, 0x03, 0x3e, 0xde, 0x0f, 0x34, 0xbe, 0xe9, 0x49, 0xc2, 0x3e,
- 0x04, 0x2f, 0xd9, 0x3d, 0xef, 0xcf, 0x14, 0x3f, 0xeb, 0x9b, 0xe9, 0x3c,
- 0x13, 0x41, 0x3e, 0xbd, 0xc6, 0xc3, 0x81, 0xbe, 0xa7, 0x2c, 0x6b, 0x3f,
- 0x71, 0x0b, 0xeb, 0x3b, 0x50, 0xf8, 0xa9, 0xba, 0x9a, 0xd6, 0xd0, 0x3e,
- 0x6f, 0x6f, 0xff, 0x3d, 0x28, 0x2e, 0x54, 0xbe, 0x99, 0x5b, 0x23, 0xbe,
- 0xbe, 0xbf, 0x47, 0xbe, 0xe1, 0xe7, 0x85, 0xbc, 0xcd, 0xb7, 0xfe, 0xbd,
- 0x27, 0xef, 0x0d, 0x3f, 0x12, 0x51, 0x65, 0x3c, 0x26, 0x63, 0x4a, 0xbe,
- 0x91, 0xe7, 0x00, 0x3f, 0x9d, 0x37, 0x05, 0x3e, 0xc2, 0x0b, 0xda, 0x3d,
- 0x4c, 0xdd, 0xf6, 0xbe, 0xc4, 0xb0, 0x1e, 0x3e, 0x5c, 0x40, 0x03, 0xbe,
- 0xc7, 0xba, 0xd4, 0x3d, 0xad, 0x49, 0x1c, 0x3f, 0x62, 0x18, 0x69, 0xbf,
- 0x95, 0x54, 0x0e, 0xbf, 0x8c, 0x27, 0x24, 0xbe, 0x6a, 0xd7, 0xa9, 0xbd,
- 0xf9, 0x4f, 0x08, 0xbe, 0xe7, 0xc9, 0xce, 0x3e, 0x84, 0x3c, 0x08, 0xbe,
- 0xf3, 0x67, 0x55, 0x3e, 0x19, 0xd7, 0xf6, 0x3e, 0x17, 0xd8, 0x85, 0x3e,
- 0xae, 0x0e, 0xc7, 0x3e, 0x85, 0xfa, 0xcc, 0xbd, 0x1f, 0x7b, 0x36, 0xbd,
- 0x9c, 0x76, 0xc0, 0x3d, 0x26, 0x94, 0x0b, 0xbf, 0x15, 0x93, 0xda, 0xbd,
- 0xe7, 0x87, 0x8c, 0x3e, 0x10, 0x51, 0x8f, 0x3e, 0xa7, 0xaa, 0x9a, 0xbe,
- 0x31, 0xee, 0x0a, 0x3f, 0xea, 0xb9, 0x1a, 0x3c, 0xaf, 0xea, 0x8e, 0x3e,
- 0x78, 0x97, 0x4e, 0xbf, 0x22, 0x97, 0xff, 0xbd, 0xf1, 0x11, 0x23, 0xbf,
- 0x4f, 0x1c, 0xe5, 0xbb, 0x96, 0xf9, 0x5e, 0x3e, 0x38, 0xd0, 0x09, 0xbf,
- 0x1e, 0xfa, 0xc3, 0xbd, 0xad, 0xf2, 0x6d, 0x3e, 0x63, 0xf5, 0xa1, 0x3e,
- 0xe6, 0xb1, 0x36, 0xbc, 0x56, 0x50, 0xfb, 0x3d, 0xd3, 0xff, 0x01, 0xbe,
- 0x3f, 0xd3, 0x3b, 0x3e, 0x31, 0x14, 0xd3, 0x3d, 0xce, 0xa9, 0x32, 0x3f,
- 0x02, 0x64, 0x21, 0x3e, 0x33, 0xc2, 0xb4, 0xbe, 0x8d, 0x60, 0x18, 0x3b,
- 0xab, 0xb4, 0x2f, 0x3c, 0x9c, 0x6a, 0x4a, 0x3e, 0x9a, 0xb9, 0x7a, 0xbd,
- 0x8a, 0x8e, 0x0f, 0xbf, 0x4e, 0x42, 0x61, 0xbe, 0xfd, 0xd1, 0x6d, 0x3e,
- 0x7b, 0x1c, 0xfb, 0xbd, 0x26, 0x77, 0x34, 0xbc, 0x9d, 0xbd, 0xdc, 0xbd,
- 0xa4, 0x0a, 0x9d, 0x3d, 0x98, 0xf4, 0x86, 0xbe, 0x6e, 0x13, 0x1b, 0xbe,
- 0x56, 0xdb, 0x85, 0xbd, 0x72, 0x92, 0xc4, 0x3d, 0x73, 0x53, 0x8e, 0x3d,
- 0x69, 0xc1, 0x56, 0xbc, 0x40, 0xed, 0x78, 0x3e, 0xd3, 0x22, 0x5c, 0x3d,
- 0x13, 0x71, 0xc5, 0xbd, 0x42, 0xfb, 0x8c, 0x3e, 0x4b, 0x77, 0x5c, 0x3d,
- 0x25, 0x45, 0x14, 0xbe, 0x9c, 0x5b, 0x54, 0x3d, 0x95, 0xd7, 0xad, 0xbd,
- 0x34, 0x37, 0x63, 0x3c, 0x8d, 0x34, 0x3b, 0xbe, 0xc8, 0x6a, 0x66, 0xbe,
- 0x56, 0x35, 0xe5, 0xbd, 0x86, 0x73, 0xb4, 0x3d, 0x61, 0x56, 0xbb, 0x3d,
- 0xc6, 0x01, 0x86, 0xbe, 0x4d, 0x30, 0x20, 0xbe, 0xb4, 0x03, 0x16, 0x3c,
- 0xff, 0x01, 0x22, 0xbd, 0xfb, 0x64, 0x63, 0xbe, 0xaa, 0xe2, 0x8b, 0x3e,
- 0xab, 0xb5, 0x99, 0xbe, 0x8c, 0xdc, 0xbc, 0x3d, 0x16, 0xb7, 0xa9, 0xbe,
- 0x67, 0x73, 0xbd, 0xbd, 0x6c, 0xd0, 0x3b, 0x3e, 0x08, 0xec, 0x0a, 0xbe,
- 0xcb, 0x20, 0x37, 0xbe, 0xc6, 0xfa, 0x5c, 0xbc, 0x77, 0x5b, 0xa5, 0xbd,
- 0x73, 0x05, 0xab, 0x3d, 0x9e, 0x6c, 0x3f, 0x3d, 0x41, 0x3d, 0x9e, 0xbd,
- 0xc3, 0x09, 0xd1, 0x3d, 0xea, 0xcb, 0xaf, 0xbd, 0x8c, 0x2b, 0x9b, 0xbd,
- 0xaa, 0x00, 0x44, 0xbe, 0xcd, 0x85, 0x26, 0xbd, 0x3f, 0x06, 0x84, 0xbe,
- 0x8f, 0x70, 0xfd, 0xbc, 0xad, 0x6a, 0xac, 0xbc, 0xb3, 0xdc, 0x03, 0x3d,
- 0xb4, 0x98, 0x07, 0x3e, 0x98, 0x8f, 0x0d, 0x3e, 0x24, 0x69, 0xe5, 0x3c,
- 0x14, 0x6f, 0xfa, 0xbd, 0x72, 0x4c, 0x1b, 0xbe, 0x84, 0x4f, 0x96, 0xbe,
- 0x68, 0xc6, 0x16, 0x3e, 0x99, 0xfe, 0x24, 0xbd, 0xa6, 0xe1, 0x80, 0x3d,
- 0x68, 0xe8, 0x88, 0xbe, 0x9d, 0xb3, 0xd9, 0xbd, 0x14, 0x4f, 0xd5, 0xbd,
- 0x5e, 0xcd, 0x8c, 0xbe, 0xa1, 0x11, 0x3b, 0x3e, 0xa2, 0xa3, 0x55, 0xbe,
- 0xbc, 0xc0, 0xcf, 0x3d, 0xf7, 0xd9, 0xfe, 0xbd, 0xef, 0x37, 0x2c, 0x3e,
- 0x99, 0xd1, 0x25, 0xbe, 0x91, 0x0c, 0x81, 0xbe, 0xb9, 0x42, 0xd5, 0x3c,
- 0xb7, 0x18, 0x75, 0x3e, 0x78, 0xc0, 0xe7, 0xbc, 0x02, 0x4a, 0xa3, 0xbd,
- 0xcb, 0x14, 0x18, 0x3d, 0x0c, 0x5f, 0x42, 0xbd, 0x25, 0xf7, 0x79, 0x3e,
- 0xcd, 0x82, 0x4a, 0x3d, 0x33, 0x3c, 0xa2, 0x3c, 0x5d, 0xc3, 0x12, 0xbe,
- 0x88, 0xf9, 0x46, 0xbe, 0xb8, 0x0c, 0xcc, 0xbe, 0x5d, 0x8b, 0x59, 0x3d,
- 0x56, 0x95, 0x2a, 0xbd, 0x24, 0x84, 0xb9, 0x3d, 0xed, 0xe4, 0x9a, 0x3d,
- 0x30, 0x74, 0x14, 0xbd, 0x94, 0x1a, 0x69, 0xbe, 0x2c, 0xd3, 0x16, 0x3e,
- 0xaa, 0xb5, 0xf9, 0xbc, 0x1f, 0xc5, 0x19, 0x3d, 0x90, 0x1f, 0x31, 0x3e,
- 0xf7, 0x46, 0x49, 0x3d, 0x76, 0x74, 0xd0, 0xbd, 0x29, 0x8f, 0x12, 0xbe,
- 0xb3, 0x2e, 0x14, 0x3c, 0x1c, 0xc3, 0xdb, 0x3c, 0xc5, 0x5b, 0x0e, 0x3c,
- 0x24, 0x9f, 0x54, 0xbe, 0x07, 0xb4, 0xa6, 0x3d, 0x68, 0x81, 0x1d, 0x3d,
- 0xf9, 0x8e, 0x26, 0x3e, 0x53, 0xb1, 0x13, 0x3e, 0x53, 0x6f, 0x53, 0xbe,
- 0xef, 0x1b, 0xae, 0xbe, 0x5f, 0xeb, 0x94, 0xbd, 0x92, 0xb8, 0xb2, 0xbd,
- 0x37, 0x3a, 0xcc, 0xbd, 0xad, 0x44, 0x49, 0xbd, 0x39, 0x7b, 0x0c, 0xbf,
- 0x84, 0x28, 0x85, 0xbb, 0x12, 0x2f, 0x35, 0x3e, 0x53, 0xc9, 0x1e, 0xbd,
- 0x00, 0xc2, 0x07, 0xbe, 0x34, 0xe8, 0xac, 0x3d, 0x5c, 0x75, 0xec, 0x3c,
- 0x15, 0x2e, 0xb2, 0x3d, 0x7d, 0xe8, 0x4c, 0xbf, 0x8f, 0x33, 0xd3, 0xbe,
- 0x70, 0x27, 0x37, 0xbe, 0xf0, 0x6a, 0x07, 0xbe, 0x74, 0xec, 0x1f, 0xbe,
- 0x78, 0x3e, 0x80, 0x3d, 0x3b, 0x9c, 0xd6, 0xbc, 0xec, 0xe0, 0xe6, 0xbd,
- 0xe2, 0x66, 0x5d, 0xbd, 0x3e, 0x4b, 0x6c, 0x3e, 0x4d, 0x42, 0x09, 0xbe,
- 0x2d, 0x0d, 0x32, 0x3e, 0x0c, 0xb2, 0xd9, 0xbc, 0xd2, 0x65, 0xac, 0xbd,
- 0xe2, 0xb0, 0x23, 0xbd, 0xc5, 0x12, 0x3c, 0xbe, 0x79, 0xcf, 0xb8, 0x3c,
- 0x05, 0x5f, 0x81, 0xbe, 0x87, 0x87, 0x04, 0xbd, 0x1f, 0x98, 0xc8, 0xbe,
- 0x63, 0xd9, 0x89, 0xbe, 0xba, 0x35, 0xb3, 0xbd, 0xb3, 0xca, 0x3f, 0x3d,
- 0x50, 0x1a, 0xad, 0xbe, 0x7e, 0xaa, 0x4f, 0x3e, 0x9a, 0xb9, 0x29, 0x3e,
- 0xd3, 0xf3, 0x07, 0xbe, 0x44, 0x4a, 0x1f, 0x3c, 0xac, 0x3f, 0x1c, 0xbe,
- 0xcb, 0x9a, 0xe2, 0xbd, 0xfe, 0xba, 0x41, 0xbd, 0x77, 0x78, 0x6d, 0xbe,
- 0xe7, 0x72, 0x37, 0x3c, 0x83, 0xed, 0xa7, 0xbc, 0x5f, 0x7b, 0x82, 0xbd,
- 0x47, 0xc5, 0xfb, 0xbd, 0x91, 0xda, 0xad, 0xbd, 0x5a, 0x00, 0xa2, 0xbe,
- 0xd2, 0xd6, 0x72, 0x3d, 0x62, 0x85, 0x8e, 0xbe, 0xa0, 0xdc, 0xd7, 0x3d,
- 0x5d, 0x01, 0x6a, 0x3e, 0x23, 0xf5, 0x07, 0xbc, 0x3e, 0x83, 0x39, 0xbd,
- 0xb3, 0x51, 0x48, 0x3c, 0x68, 0x90, 0x55, 0x3e, 0x06, 0x8c, 0x4b, 0xbe,
- 0x10, 0xd4, 0x26, 0x3c, 0x8c, 0x4c, 0x7b, 0xbd, 0x93, 0xef, 0x38, 0x3e,
- 0xed, 0x74, 0x5b, 0x3d, 0xd2, 0xdc, 0xb8, 0xbd, 0x7f, 0xc4, 0x73, 0xbd,
- 0xb7, 0x8e, 0x68, 0xba, 0x48, 0xb0, 0x84, 0x3e, 0x2c, 0xd9, 0x70, 0xbe,
- 0xe6, 0x86, 0x9a, 0xbc, 0xd1, 0x75, 0xd5, 0x3c, 0xd2, 0xf4, 0x97, 0x3d,
- 0xb5, 0x48, 0xd1, 0xbe, 0xa7, 0x92, 0x35, 0xbe, 0xfd, 0x48, 0x56, 0xbe,
- 0x12, 0xff, 0x54, 0xbe, 0xbb, 0xd1, 0xa0, 0x3d, 0x7b, 0x61, 0xd1, 0xbd,
- 0x97, 0x84, 0x17, 0xbe, 0x98, 0x24, 0xb4, 0xbc, 0x2c, 0xb6, 0x29, 0x3c,
- 0x0c, 0x47, 0x42, 0xbe, 0xf3, 0xfb, 0x97, 0xbd, 0x70, 0x5d, 0x8c, 0xbc,
- 0xe7, 0xbf, 0x3d, 0x3e, 0x65, 0x48, 0x9c, 0x3d, 0x0a, 0x53, 0xee, 0x3d,
- 0x78, 0xc3, 0xcc, 0x3c, 0xf5, 0x71, 0x12, 0xbe, 0xa5, 0xe7, 0xdf, 0xbd,
- 0xd3, 0xa7, 0x98, 0x3e, 0xfa, 0x9d, 0xa8, 0xbe, 0x7b, 0x92, 0x05, 0x3e,
- 0x64, 0x9c, 0x76, 0x3c, 0x5d, 0x55, 0x27, 0xbe, 0x38, 0x09, 0xdc, 0xbd,
- 0x18, 0x82, 0x69, 0xbe, 0x54, 0x0a, 0x3e, 0x3e, 0xb1, 0xe3, 0x56, 0x3c,
- 0xdd, 0xf5, 0xba, 0x3d, 0x7e, 0xb9, 0xb8, 0xbe, 0xfb, 0xe9, 0x2f, 0x3e,
- 0xb8, 0xe2, 0xa9, 0x3b, 0x05, 0x50, 0x1d, 0xbe, 0x70, 0xba, 0x17, 0x3d,
- 0xc2, 0xe4, 0xba, 0x3d, 0x4d, 0x6f, 0x62, 0xbd, 0x8f, 0x02, 0x37, 0x3d,
- 0xc5, 0x9b, 0x0f, 0x3e, 0xde, 0xd5, 0x8c, 0xbd, 0x54, 0xe7, 0xd6, 0x3d,
- 0xba, 0xe9, 0x2d, 0xbc, 0x39, 0x65, 0x3d, 0xbe, 0xf0, 0x35, 0x79, 0x3e,
- 0x2d, 0xab, 0xa1, 0x3d, 0xd4, 0x43, 0x9b, 0x3e, 0x45, 0xce, 0x94, 0xbe,
- 0x28, 0x5e, 0xeb, 0xbd, 0x91, 0x50, 0x61, 0x3e, 0x94, 0x4f, 0x9d, 0xbb,
- 0x08, 0xc6, 0x5f, 0xbd, 0x01, 0xf1, 0x26, 0x3d, 0x73, 0x98, 0xbb, 0xbe,
- 0x87, 0xc1, 0x1a, 0x3f, 0x52, 0xd2, 0x5c, 0xbd, 0x57, 0x9b, 0x54, 0x3e,
- 0x90, 0xe3, 0x20, 0xbd, 0x59, 0x69, 0xc1, 0xbd, 0x71, 0x56, 0x58, 0xbf,
- 0x14, 0xcd, 0x28, 0xbb, 0x1f, 0xc4, 0x20, 0x3e, 0xbe, 0xd8, 0x1f, 0xbf,
- 0x79, 0xa5, 0xed, 0xbd, 0xd7, 0xb8, 0xd9, 0x3d, 0xc4, 0xda, 0xcd, 0xbe,
- 0x5a, 0x10, 0x3b, 0x3f, 0x77, 0x49, 0xd8, 0x3d, 0x90, 0x44, 0xf1, 0x3c,
- 0x37, 0x8a, 0xe1, 0x3e, 0xd0, 0x20, 0x1e, 0x3f, 0xf8, 0xea, 0x71, 0x3e,
- 0x46, 0x50, 0x7c, 0xbd, 0x90, 0xf9, 0x58, 0x3f, 0xe9, 0x35, 0x79, 0x3e,
- 0x65, 0x64, 0x0f, 0x3f, 0x9f, 0x18, 0x16, 0x3f, 0xa7, 0x0e, 0x5a, 0x3e,
- 0x60, 0x4e, 0xd0, 0x3e, 0xc3, 0x32, 0x4b, 0x3d, 0xc7, 0x71, 0x3c, 0xbf,
- 0xb7, 0x5a, 0x7e, 0xbc, 0xa3, 0x66, 0xa8, 0xbc, 0xa5, 0x49, 0x83, 0x3f,
- 0xba, 0xab, 0xa5, 0xbe, 0xc0, 0xd6, 0x6a, 0xbe, 0x46, 0x98, 0x3e, 0x3d,
- 0xc5, 0xa9, 0x14, 0x3e, 0xc0, 0x45, 0x5f, 0x3e, 0x01, 0x26, 0x04, 0x3f,
- 0x21, 0xb1, 0x81, 0xbe, 0xcc, 0x7d, 0x6b, 0xbe, 0x5c, 0x0a, 0xe9, 0xbd,
- 0xf0, 0x28, 0x70, 0xbd, 0x44, 0xc7, 0x8e, 0xbe, 0xdf, 0xa3, 0x42, 0x3d,
- 0x83, 0x7c, 0x24, 0x3e, 0xb1, 0x59, 0xf9, 0xbe, 0xbf, 0xba, 0x71, 0xbe,
- 0x93, 0x30, 0x73, 0xbe, 0xa3, 0xc5, 0xdf, 0x3e, 0x5b, 0xb1, 0xf6, 0xbe,
- 0xc0, 0xcd, 0x23, 0xbe, 0x49, 0x1f, 0x15, 0xbf, 0xf2, 0xd5, 0x9c, 0xbe,
- 0x0b, 0x34, 0x89, 0x3e, 0xd2, 0xda, 0xab, 0x3d, 0x05, 0xf6, 0xed, 0x3d,
- 0x0d, 0xc9, 0xb2, 0xbd, 0x13, 0xf3, 0x5e, 0x3e, 0x6a, 0x4f, 0xf7, 0x3d,
- 0xff, 0x59, 0xc5, 0x3d, 0x04, 0x88, 0x2d, 0xbe, 0xa9, 0xcc, 0x12, 0x3e,
- 0xed, 0x69, 0xf1, 0x3e, 0x37, 0x45, 0xd9, 0x3e, 0x5a, 0xb5, 0xbd, 0xbd,
- 0xdf, 0x86, 0x19, 0x3a, 0x20, 0x00, 0x17, 0xbf, 0x99, 0x74, 0x67, 0x3e,
- 0x51, 0x9f, 0x32, 0xbf, 0xb3, 0xa0, 0xad, 0xbe, 0xb9, 0xc8, 0x93, 0x3f,
- 0xe3, 0x2c, 0x54, 0x3e, 0xbc, 0x69, 0x80, 0x3c, 0x59, 0x14, 0x06, 0xbc,
- 0x51, 0xf0, 0x61, 0xbe, 0x09, 0x58, 0x30, 0x3e, 0x38, 0x6a, 0xc4, 0xbe,
- 0xf2, 0xe3, 0x10, 0xbe, 0x87, 0xbb, 0x37, 0x3f, 0x3c, 0xe7, 0x74, 0x3e,
- 0xbd, 0xed, 0xa1, 0x3e, 0xb9, 0xf5, 0xab, 0x3e, 0xa8, 0x28, 0xbf, 0x3d,
- 0x07, 0x94, 0x72, 0xbc, 0x58, 0xb9, 0x14, 0xbf, 0x8c, 0x41, 0xa8, 0xbe,
- 0xc0, 0x8b, 0xd7, 0xbc, 0xc9, 0x77, 0xbb, 0xbe, 0xd2, 0xff, 0x15, 0x3e,
- 0x9f, 0xfb, 0x1c, 0x3e, 0xcc, 0x6a, 0x22, 0x3f, 0x67, 0xa1, 0xae, 0xbe,
- 0xac, 0x61, 0x10, 0xbf, 0x3e, 0x71, 0x23, 0xbf, 0x46, 0x59, 0xf0, 0x3e,
- 0xcb, 0x88, 0xc4, 0x3e, 0xdb, 0xc8, 0x40, 0xbf, 0xf7, 0x9f, 0x84, 0x3d,
- 0x41, 0x7c, 0x2a, 0xbe, 0x01, 0xaa, 0x00, 0xbf, 0x6e, 0xfc, 0x17, 0xbf,
- 0xe3, 0x93, 0xe9, 0xbd, 0x4f, 0xfb, 0x18, 0xbf, 0xf6, 0xaa, 0xf3, 0x3e,
- 0x2d, 0x5e, 0xcc, 0xbd, 0x09, 0xcd, 0x3d, 0xbe, 0xed, 0x32, 0x78, 0xbd,
- 0x29, 0x93, 0xde, 0x3e, 0xf5, 0xcb, 0x66, 0xbe, 0xf1, 0xc6, 0x1c, 0xbe,
- 0x99, 0xbb, 0x27, 0x3f, 0xca, 0x68, 0xbb, 0x3e, 0xc1, 0xe6, 0xd1, 0xbe,
- 0x73, 0xe0, 0x4e, 0x3f, 0x95, 0xc5, 0xe3, 0xbb, 0x7f, 0x88, 0x00, 0xbe,
- 0xfc, 0x15, 0x87, 0xbe, 0xc4, 0x89, 0xf7, 0xbe, 0xd3, 0xde, 0x8b, 0xbc,
- 0x8e, 0x60, 0xfd, 0xbc, 0x8c, 0xb4, 0x3e, 0xbc, 0x2f, 0xc7, 0x2f, 0xbe,
- 0xf9, 0x28, 0xe1, 0x3c, 0xd3, 0x9f, 0x19, 0x3e, 0x9c, 0x81, 0x26, 0x3c,
- 0xfc, 0x0d, 0x94, 0x3c, 0x0e, 0x59, 0x22, 0xbd, 0x36, 0xc4, 0x69, 0xbe,
- 0xda, 0x0c, 0xec, 0xbd, 0x19, 0x8f, 0x4f, 0xbe, 0x17, 0x64, 0x2d, 0x3e,
- 0x63, 0x67, 0xd6, 0xbd, 0xb9, 0x1e, 0x38, 0xbd, 0x51, 0x6c, 0xd8, 0xbd,
- 0xfa, 0xc0, 0xcf, 0x3d, 0x5a, 0x3a, 0xa8, 0x3d, 0x0f, 0xd6, 0x0c, 0xbd,
- 0x23, 0xf1, 0x04, 0xbe, 0xfd, 0x7d, 0xd0, 0xbd, 0x86, 0xb3, 0x0f, 0x3d,
- 0x09, 0x7a, 0x38, 0xbe, 0x9c, 0x81, 0x4c, 0xbd, 0x33, 0x6b, 0xfb, 0x3d,
- 0x1b, 0x7a, 0x99, 0x3d, 0x13, 0x7c, 0xa6, 0x3b, 0x3b, 0xdd, 0xcc, 0xbe,
- 0xe3, 0xbb, 0xae, 0x3d, 0xe7, 0xab, 0xbf, 0xbd, 0x0b, 0x15, 0xe7, 0xbd,
- 0xff, 0x85, 0x47, 0x3c, 0x4a, 0x7c, 0x2c, 0x3e, 0xb5, 0x4a, 0xf4, 0xbc,
- 0x15, 0x6c, 0xb3, 0x3d, 0x37, 0x11, 0x7c, 0xbe, 0xa0, 0x1d, 0x2a, 0x3d,
- 0x19, 0x9d, 0x10, 0x3d, 0x5b, 0xb1, 0x72, 0x3d, 0xb3, 0x2f, 0x9e, 0xbe,
- 0xb5, 0xf1, 0x20, 0xbd, 0x36, 0x3a, 0xd3, 0xbd, 0xf2, 0x5e, 0xa8, 0xbd,
- 0x42, 0xcc, 0x34, 0xbe, 0xdf, 0xfa, 0xdf, 0x3d, 0xed, 0xb0, 0xf4, 0xbc,
- 0x61, 0xd5, 0xc8, 0x3d, 0x8c, 0x3c, 0x76, 0x3e, 0xba, 0x0c, 0xa3, 0xbd,
- 0xab, 0x1a, 0x32, 0xbe, 0x11, 0x7a, 0x21, 0x3e, 0x92, 0x9e, 0x2b, 0xbd,
- 0xc6, 0xd8, 0x45, 0xbe, 0xf4, 0x14, 0xa7, 0xbe, 0xfc, 0xd0, 0x34, 0xbe,
- 0xca, 0xed, 0x15, 0xbd, 0xde, 0xc3, 0x06, 0x3d, 0x37, 0x37, 0x4a, 0xbd,
- 0xab, 0x1d, 0x7d, 0x3d, 0x4d, 0xef, 0x62, 0xbc, 0x53, 0x83, 0x09, 0x3e,
- 0x4b, 0xb9, 0x17, 0xbd, 0x4f, 0xd9, 0x63, 0x3d, 0xdf, 0xda, 0x25, 0xbd,
- 0xad, 0x50, 0x1c, 0x3c, 0x89, 0x88, 0x14, 0x3d, 0x36, 0x07, 0x66, 0xbe,
- 0x91, 0xe3, 0x09, 0x3e, 0x64, 0xc1, 0x81, 0x3b, 0xee, 0xe0, 0xbc, 0x3c,
- 0x87, 0xbb, 0x57, 0x3e, 0x94, 0xf7, 0x41, 0x3e, 0xe3, 0x6c, 0xc1, 0x3d,
- 0x1e, 0x08, 0xd9, 0xbc, 0xc4, 0xe8, 0xa3, 0x3d, 0xfd, 0x81, 0x14, 0xbe,
- 0x19, 0xa5, 0x0a, 0x3d, 0x6a, 0xd5, 0x9e, 0xbd, 0xfe, 0xd7, 0x7a, 0xbc,
- 0xea, 0xe6, 0xed, 0x3c, 0xae, 0xae, 0x0c, 0xbe, 0xbc, 0x96, 0x15, 0xbd,
- 0x4c, 0x01, 0x97, 0x3d, 0x95, 0x84, 0x6f, 0x3c, 0x4d, 0xec, 0x10, 0x3d,
- 0xca, 0x46, 0x3b, 0xbe, 0xe6, 0x62, 0x82, 0xbd, 0x5d, 0xb4, 0xa1, 0xbd,
- 0x20, 0x79, 0x4d, 0x3d, 0xa0, 0x82, 0x4b, 0xbe, 0xf4, 0xe7, 0xd4, 0x3d,
- 0xa6, 0x6f, 0x53, 0xbd, 0xf0, 0x3f, 0x03, 0x3d, 0x26, 0x00, 0xa1, 0x3d,
- 0xf0, 0x4f, 0xf8, 0xbd, 0xe1, 0x0d, 0x22, 0x3c, 0x12, 0x98, 0xbc, 0x3d,
- 0x49, 0x6c, 0x2c, 0x3e, 0x12, 0x55, 0x1a, 0xbe, 0x31, 0xf9, 0x28, 0x3e,
- 0x0f, 0x61, 0x77, 0xbd, 0xf6, 0xd4, 0xcc, 0xbd, 0x94, 0x8f, 0xa9, 0x3d,
- 0x7a, 0x3a, 0xae, 0xbd, 0xbe, 0x0e, 0x9b, 0xbc, 0xc3, 0xe7, 0xb3, 0xbd,
- 0x4e, 0x76, 0x68, 0x3d, 0x08, 0xc3, 0x00, 0xbd, 0x3e, 0x34, 0xc4, 0xbb,
- 0x0b, 0x7c, 0x60, 0x3c, 0x53, 0x34, 0x76, 0x3d, 0x1c, 0x4a, 0xce, 0xbd,
- 0x67, 0xd3, 0xcc, 0x3d, 0xce, 0x17, 0x8c, 0xbd, 0x8d, 0x9a, 0x52, 0x3e,
- 0x91, 0x7e, 0xd7, 0xbc, 0x64, 0xf5, 0x14, 0x3d, 0xec, 0xb4, 0x06, 0x3d,
- 0x3c, 0x9d, 0x94, 0xbe, 0x51, 0x30, 0x16, 0x3f, 0x39, 0xe4, 0x41, 0xbe,
- 0x37, 0xb4, 0xf1, 0x3e, 0xa3, 0x02, 0x46, 0x3f, 0xa0, 0x5c, 0x46, 0x3e,
- 0x94, 0x5b, 0xb3, 0x3e, 0x6a, 0x34, 0x25, 0xbe, 0x91, 0x39, 0x77, 0xbe,
- 0xba, 0x51, 0x4e, 0xbe, 0xd2, 0xdd, 0xa2, 0x3d, 0x0e, 0xfd, 0xf3, 0x3d,
- 0xed, 0x88, 0x55, 0xbc, 0x72, 0x47, 0x0e, 0x3e, 0x85, 0xbb, 0x25, 0xbe,
- 0xcf, 0x30, 0xdb, 0xbd, 0x9c, 0x65, 0x94, 0x3e, 0x69, 0x66, 0x91, 0xbe,
- 0x91, 0xcf, 0x07, 0xbf, 0xe0, 0xd6, 0x69, 0x3e, 0xb0, 0xa8, 0xe7, 0xbd,
- 0x34, 0x4e, 0xcc, 0x3d, 0xcf, 0x81, 0x90, 0xbc, 0x96, 0xbc, 0xb7, 0xbe,
- 0x06, 0x7a, 0x9a, 0xbd, 0x66, 0xb6, 0x75, 0xbd, 0xf3, 0x6d, 0xf3, 0xbe,
- 0x7e, 0xce, 0xfe, 0xbe, 0x3b, 0x59, 0xd3, 0xbd, 0x54, 0x64, 0x43, 0xbe,
- 0xcf, 0xf9, 0xba, 0xbd, 0x3a, 0xa7, 0x58, 0xbe, 0xee, 0xf8, 0x63, 0x3b,
- 0x97, 0x0b, 0xd1, 0x3e, 0x2b, 0x12, 0xb4, 0xbe, 0xe8, 0x57, 0x22, 0xbf,
- 0x5b, 0x81, 0x36, 0x3e, 0x8a, 0xc0, 0x17, 0xbe, 0xa2, 0x82, 0x3a, 0xba,
- 0x59, 0xc6, 0x30, 0xbf, 0x36, 0xc9, 0x29, 0x3c, 0xfd, 0x98, 0x2c, 0x3c,
- 0x31, 0xbb, 0x32, 0xbe, 0xbe, 0xd1, 0x5f, 0x3e, 0x81, 0xf6, 0x08, 0x3e,
- 0xd0, 0x22, 0xa3, 0xbd, 0x33, 0x1b, 0x77, 0x3d, 0x44, 0xbf, 0xad, 0x3c,
- 0x24, 0x75, 0x8c, 0x3e, 0x9b, 0xd4, 0xc6, 0xbd, 0x7f, 0x3d, 0x9f, 0x3d,
- 0x7d, 0x48, 0x37, 0xbd, 0xdc, 0xa7, 0xfc, 0x3e, 0x67, 0x20, 0xa7, 0x3d,
- 0xc3, 0xef, 0x5a, 0x3c, 0xf3, 0x1c, 0x9e, 0xbe, 0x72, 0x2a, 0xcc, 0x3e,
- 0xa0, 0x21, 0x02, 0x3d, 0x87, 0x4b, 0xc5, 0xbb, 0x32, 0x1f, 0x10, 0x3f,
- 0x8b, 0xf4, 0xaf, 0xbd, 0x08, 0xb9, 0x54, 0xbe, 0x85, 0x6f, 0x59, 0xbe,
- 0xff, 0xb5, 0x58, 0xbe, 0xfc, 0xb6, 0xda, 0xbd, 0x23, 0x52, 0x56, 0xbd,
- 0x1d, 0xa0, 0xd0, 0x3e, 0x9a, 0x7d, 0x42, 0x3e, 0x03, 0x62, 0x83, 0xbe,
- 0xc7, 0x4a, 0x2a, 0x3e, 0x99, 0x3b, 0x62, 0x3d, 0xf8, 0x51, 0x95, 0x3e,
- 0x16, 0x33, 0x97, 0xbe, 0x4c, 0xc2, 0x27, 0xbc, 0x50, 0xfb, 0x60, 0xbe,
- 0x25, 0xf6, 0xfd, 0x3d, 0x17, 0x42, 0xed, 0x3e, 0x55, 0x8c, 0x28, 0xbf,
- 0x56, 0x0d, 0xfb, 0x3d, 0x50, 0xe3, 0x1a, 0x3b, 0x08, 0xae, 0xc6, 0xbd,
- 0x99, 0x9c, 0x29, 0xbe, 0x47, 0x3f, 0x56, 0x3c, 0xa9, 0x21, 0xde, 0xbd,
- 0x7b, 0xf0, 0xa3, 0x3d, 0x1c, 0x89, 0xb7, 0x3e, 0xe7, 0x04, 0xe0, 0x3d,
- 0x85, 0x28, 0xc6, 0x3c, 0x4e, 0xbd, 0x0e, 0xbe, 0x88, 0x41, 0x2a, 0x3e,
- 0x99, 0x50, 0x08, 0xbe, 0xaf, 0x65, 0x2d, 0xbe, 0xf8, 0x37, 0x57, 0xbe,
- 0xbb, 0xeb, 0xc6, 0xbd, 0xad, 0xb7, 0xef, 0x3d, 0x32, 0x2f, 0x9b, 0x3d,
- 0x38, 0x52, 0x43, 0x3e, 0x68, 0x27, 0x05, 0xbe, 0x61, 0xdf, 0xea, 0x3d,
- 0xb3, 0x1a, 0x1a, 0xbf, 0x6c, 0xb2, 0xc6, 0xbd, 0xd8, 0x77, 0x13, 0xbe,
- 0x12, 0x1c, 0x10, 0x3d, 0x59, 0xcf, 0xd0, 0xbc, 0x92, 0x62, 0xaf, 0xbe,
- 0x51, 0x03, 0x77, 0xbe, 0x51, 0x24, 0x9f, 0x3e, 0xea, 0x00, 0xa7, 0x3e,
- 0x15, 0x69, 0x5c, 0xbe, 0xc7, 0xd7, 0x48, 0x3e, 0x8f, 0x2d, 0xf0, 0xbd,
- 0xb1, 0x61, 0x29, 0x3e, 0x00, 0x1d, 0x89, 0x3e, 0x99, 0xfd, 0x21, 0x3f,
- 0xcf, 0x25, 0xe0, 0x3d, 0xad, 0x57, 0xb5, 0xbe, 0xa9, 0x42, 0x9e, 0xbe,
- 0x7e, 0x1a, 0xe1, 0xbe, 0x2c, 0x2e, 0xa0, 0x3f, 0xa9, 0xe1, 0x84, 0xbd,
- 0x11, 0xb8, 0xc7, 0x3f, 0x0f, 0x1d, 0x59, 0x3f, 0xb0, 0x3a, 0x24, 0x3f,
- 0xc5, 0xa6, 0x88, 0x3e, 0x30, 0x3e, 0xd2, 0x3d, 0x90, 0xfd, 0xdf, 0xbe,
- 0x6c, 0xf1, 0x8f, 0xbf, 0xff, 0x18, 0x8a, 0x3d, 0x72, 0x0b, 0xa4, 0x3d,
- 0xd1, 0xda, 0x14, 0x3f, 0xb8, 0x93, 0x31, 0xbf, 0x5f, 0x76, 0x85, 0xbf,
- 0x53, 0x90, 0x07, 0xbf, 0xd7, 0xe5, 0x23, 0xbd, 0xc3, 0x8d, 0x1c, 0xbf,
- 0x1f, 0x3a, 0x89, 0xbf, 0xf7, 0xee, 0xfa, 0xbe, 0x42, 0x28, 0xb0, 0x3e,
- 0xc7, 0x32, 0xfa, 0x3e, 0xfb, 0xf4, 0x4f, 0xbe, 0xa7, 0x0f, 0x05, 0xbf,
- 0x80, 0x50, 0xeb, 0xbd, 0x4d, 0xfc, 0x72, 0x3e, 0x66, 0xd2, 0x1f, 0xbf,
- 0x6f, 0x23, 0xff, 0xbf, 0xda, 0x3a, 0x62, 0xbd, 0x6d, 0x23, 0xa2, 0xbe,
- 0x7d, 0x63, 0x44, 0xbe, 0x93, 0xda, 0x26, 0xbf, 0xab, 0x15, 0x31, 0x3e,
- 0xde, 0x33, 0xaf, 0x3e, 0x67, 0x6a, 0xa0, 0xbe, 0x3f, 0x6f, 0x9b, 0xbf,
- 0xe7, 0x5e, 0x46, 0x3f, 0x3a, 0xfc, 0x4a, 0xbc, 0x3c, 0x9a, 0x65, 0x3e,
- 0x7e, 0xc4, 0x1a, 0xbf, 0x57, 0x36, 0x1a, 0xbe, 0x84, 0xd1, 0x13, 0xbc,
- 0x70, 0x3c, 0x83, 0x3e, 0x70, 0x1a, 0xbc, 0x3e, 0xe7, 0x90, 0x55, 0x3f,
- 0x50, 0xe4, 0xe3, 0xbd, 0xdd, 0x0e, 0x52, 0xbf, 0xe1, 0xbe, 0x40, 0xbe,
- 0x12, 0x85, 0x37, 0x3e, 0xad, 0x74, 0xc6, 0xbe, 0x2e, 0x10, 0xb0, 0x3f,
- 0x33, 0x5b, 0xd4, 0x3c, 0x8a, 0x39, 0x78, 0x3f, 0x88, 0xbb, 0xf5, 0x3d,
- 0x28, 0x85, 0xcf, 0x3e, 0xbd, 0x7b, 0x22, 0xbf, 0xd0, 0x93, 0xae, 0x3f,
- 0x3e, 0xc1, 0x30, 0x3e, 0x7c, 0x97, 0x61, 0xbf, 0xb7, 0xfa, 0x39, 0x3f,
- 0x42, 0x83, 0x70, 0xbd, 0xba, 0x10, 0xeb, 0xbe, 0xc1, 0xa5, 0x33, 0xbd,
- 0x14, 0x56, 0x2f, 0xbf, 0x53, 0xfb, 0x01, 0xbd, 0x56, 0x2d, 0x90, 0x3e,
- 0x79, 0x59, 0x87, 0x3f, 0x0b, 0xa9, 0x07, 0x3f, 0x9e, 0x5a, 0xd1, 0xbe,
- 0xc4, 0x67, 0xd1, 0x3e, 0xc7, 0x3c, 0xd1, 0xbe, 0x4f, 0x42, 0x36, 0x3e,
- 0xb0, 0xba, 0x60, 0xbf, 0x70, 0xab, 0x05, 0x3e, 0x4b, 0x85, 0xc4, 0xbe,
- 0x79, 0xb9, 0xfb, 0xbd, 0x4f, 0x0b, 0x93, 0x3f, 0x74, 0x7a, 0x9a, 0xbf,
- 0x2c, 0xda, 0x92, 0xbf, 0x48, 0x31, 0xec, 0xbd, 0x44, 0xb9, 0x18, 0x3d,
- 0x95, 0x21, 0x84, 0xbd, 0xfd, 0xbb, 0x95, 0x3e, 0xbb, 0xf8, 0xfe, 0xbe,
- 0x97, 0x79, 0xa5, 0x3e, 0x1e, 0x5a, 0x23, 0x3f, 0xce, 0xd0, 0x17, 0xbd,
- 0xb9, 0x19, 0x15, 0x3d, 0x0b, 0x3d, 0xc7, 0xbd, 0x06, 0xca, 0x4d, 0xbe,
- 0x62, 0xdf, 0x4b, 0x3f, 0xba, 0xf2, 0xc3, 0xbe, 0x55, 0x3c, 0x14, 0xbe,
- 0x84, 0x04, 0xc4, 0x3e, 0x40, 0xdb, 0x0a, 0x3f, 0xbe, 0x17, 0xbb, 0xbe,
- 0xb4, 0x47, 0x87, 0x3f, 0xc1, 0xd2, 0xa2, 0xbe, 0xf3, 0x51, 0x4d, 0x3f,
- 0x6a, 0x52, 0xa1, 0xbf, 0xb6, 0x25, 0x05, 0xbf, 0xac, 0x08, 0x4c, 0xbf,
- 0x13, 0xf0, 0x46, 0x3d, 0xee, 0x5d, 0xa3, 0x3f, 0xa8, 0x4c, 0x44, 0xbf,
- 0xcf, 0x51, 0x5e, 0xbd, 0x8b, 0xc5, 0x85, 0x3e, 0x15, 0x4b, 0x16, 0x3f,
- 0x33, 0xc7, 0x3a, 0xbe, 0x78, 0x78, 0xf7, 0x3e, 0x01, 0x19, 0x50, 0xbe,
- 0xed, 0x29, 0x4f, 0x3f, 0x58, 0x85, 0x2b, 0xbe, 0x66, 0x49, 0x23, 0x3f,
- 0x5d, 0xcf, 0x8c, 0x3f, 0x21, 0x3b, 0xfd, 0xbe, 0x8d, 0x4b, 0x99, 0xbe,
- 0xdc, 0x98, 0x44, 0x3e, 0x0e, 0x18, 0xd7, 0x3d, 0xfe, 0x0d, 0x92, 0xbe,
- 0xf2, 0x66, 0x23, 0x3e, 0x3a, 0x08, 0xa9, 0xbe, 0x0e, 0x99, 0x93, 0xbd,
- 0x17, 0xf9, 0x0c, 0xbe, 0x6b, 0x1c, 0x01, 0x3e, 0x88, 0xe9, 0x4d, 0x3e,
- 0xa3, 0xaf, 0xa7, 0x3e, 0x17, 0x39, 0xa0, 0x3e, 0x9e, 0xdd, 0x14, 0xbe,
- 0xbc, 0xee, 0x28, 0x3f, 0x90, 0xfa, 0xa5, 0xbd, 0xf5, 0x00, 0xda, 0xbc,
- 0xda, 0x89, 0xc6, 0x3d, 0x86, 0x7d, 0xbf, 0xbc, 0xfc, 0xba, 0x1b, 0x3e,
- 0x6e, 0x4b, 0x97, 0xbd, 0x46, 0x2e, 0xed, 0xbe, 0x3c, 0x03, 0x19, 0xbe,
- 0x22, 0x70, 0x8c, 0xbe, 0x15, 0x7e, 0x28, 0xbf, 0x8a, 0x0d, 0xe1, 0x3e,
- 0xcc, 0x17, 0xac, 0x3d, 0x91, 0x34, 0x90, 0x3e, 0x2c, 0xbb, 0xab, 0xbe,
- 0xeb, 0xaa, 0x4c, 0xbe, 0x77, 0x8a, 0xd3, 0x3d, 0xcd, 0x13, 0xd8, 0x3e,
- 0xdd, 0x27, 0xa7, 0x3e, 0xd2, 0xa1, 0x5b, 0xbe, 0x5d, 0x07, 0x47, 0xbe,
- 0xd8, 0x27, 0xfb, 0x3d, 0xd4, 0xca, 0xd4, 0x3e, 0x0c, 0x49, 0xaa, 0xbe,
- 0x3f, 0x02, 0x16, 0x3e, 0x70, 0xde, 0x6d, 0xbe, 0x8e, 0x2c, 0xd4, 0xbe,
- 0x34, 0x62, 0xaf, 0xbc, 0xe6, 0x72, 0xc5, 0x3e, 0xe6, 0xd2, 0x10, 0xbe,
- 0x41, 0x68, 0xe8, 0x3e, 0x1b, 0x00, 0x15, 0xbe, 0xef, 0x46, 0x08, 0xbf,
- 0xdd, 0xeb, 0xcc, 0x3e, 0x86, 0xf7, 0x4b, 0x3e, 0xe1, 0x03, 0x9f, 0xbf,
- 0x1a, 0x7e, 0x5c, 0x3e, 0x46, 0x46, 0xca, 0x3e, 0x88, 0x0c, 0x08, 0x3e,
- 0xd7, 0x6b, 0x2e, 0xbe, 0x43, 0x90, 0xd8, 0x3d, 0x6e, 0x97, 0xb7, 0xbe,
- 0x31, 0x24, 0x27, 0xbf, 0x61, 0x93, 0x12, 0x3e, 0x7a, 0x1b, 0x52, 0x3f,
- 0x63, 0xd5, 0x0a, 0xbf, 0x23, 0xdf, 0x51, 0x3d, 0x07, 0xf2, 0x86, 0xbf,
- 0x0d, 0xe4, 0xa0, 0xbc, 0x9b, 0x91, 0xc3, 0xbe, 0xd2, 0xe8, 0xb0, 0xbe,
- 0xda, 0xb2, 0x39, 0x3d, 0x09, 0x6c, 0x93, 0x3e, 0x88, 0x91, 0xa8, 0x3e,
- 0xde, 0x10, 0xb3, 0x3d, 0x0a, 0x69, 0x27, 0x3e, 0x9d, 0x63, 0x3a, 0xbd,
- 0x49, 0x79, 0xfd, 0xbd, 0x08, 0x1b, 0x6d, 0x3e, 0x33, 0x8a, 0x56, 0xbe,
- 0x8c, 0xe1, 0x60, 0xbd, 0x98, 0x75, 0x04, 0x3f, 0xb1, 0xf6, 0x88, 0xbe,
- 0xcc, 0x64, 0x08, 0xbf, 0x7d, 0x54, 0xbe, 0x3e, 0xbd, 0x1e, 0x3e, 0xbf,
- 0x11, 0xdf, 0x41, 0x3e, 0x46, 0x18, 0x91, 0x3e, 0x45, 0xe3, 0xff, 0xbd,
- 0xc6, 0xb5, 0x59, 0x3e, 0xd9, 0x70, 0x95, 0x3e, 0xa1, 0xb1, 0x65, 0xbd,
- 0xc8, 0xff, 0x0e, 0x3f, 0x1d, 0x08, 0x1f, 0xbe, 0x52, 0x09, 0x0c, 0xbf,
- 0x0e, 0x2f, 0x11, 0x3d, 0x96, 0x17, 0x5f, 0xbf, 0x68, 0x93, 0x94, 0xbf,
- 0x55, 0x99, 0x1f, 0x3d, 0x5d, 0xea, 0x43, 0xbc, 0x94, 0x65, 0x6e, 0xbe,
- 0x9a, 0xe2, 0x79, 0x3e, 0x4b, 0x01, 0x72, 0x3f, 0x52, 0xff, 0xa8, 0x3e,
- 0x91, 0xd5, 0x1f, 0xbd, 0xd2, 0x0c, 0x50, 0x3d, 0xae, 0xaa, 0x54, 0xbf,
- 0x61, 0xa8, 0x24, 0xbd, 0x6e, 0xd9, 0x5e, 0xbe, 0xe1, 0xf7, 0x0e, 0xbf,
- 0x10, 0x0a, 0x03, 0x3f, 0x16, 0xa9, 0x55, 0x3f, 0x86, 0xe7, 0xe3, 0x3e,
- 0x9e, 0x9b, 0x0e, 0x3f, 0x3e, 0x62, 0x9a, 0x3e, 0x9d, 0xc2, 0x38, 0x3c,
- 0xd0, 0xb9, 0x60, 0xbd, 0x68, 0x5b, 0xaa, 0xbe, 0x07, 0x67, 0x97, 0x3e,
- 0x2b, 0x1f, 0x0f, 0x3f, 0x37, 0xfa, 0xc2, 0x3e, 0xb3, 0x94, 0xb6, 0x3e,
- 0xbb, 0x4b, 0xfd, 0xbf, 0xfe, 0xf5, 0x6d, 0xbf, 0x01, 0x02, 0xdd, 0xbc,
- 0xf8, 0x52, 0x96, 0x3d, 0x9c, 0x4a, 0x35, 0x3d, 0xc6, 0xd4, 0x1e, 0xbd,
- 0x88, 0x63, 0x7f, 0x3d, 0x75, 0x1a, 0x8f, 0xbd, 0x70, 0x0b, 0x5e, 0x3c,
- 0x38, 0x99, 0x4a, 0xbd, 0x00, 0x3a, 0x71, 0xbb, 0xad, 0x43, 0x02, 0x3e,
- 0x8d, 0xdc, 0xd6, 0xbd, 0xba, 0x43, 0xa2, 0x3d, 0xd0, 0x0b, 0x13, 0xbc,
- 0x10, 0x71, 0x95, 0xbc, 0x08, 0x62, 0xd6, 0x3c, 0x56, 0xed, 0xa3, 0x3d,
- 0xce, 0x83, 0x80, 0x3d, 0x68, 0x2a, 0x46, 0xbd, 0x5c, 0x01, 0x03, 0x3d,
- 0x4f, 0xb3, 0xdc, 0xbd, 0x14, 0xac, 0x5f, 0x3d, 0x00, 0x03, 0xcf, 0xbb,
- 0xaa, 0xda, 0x98, 0xbd, 0x9e, 0x2b, 0x01, 0xbd, 0x0e, 0x54, 0xd6, 0xbd,
- 0x1b, 0xd9, 0xf1, 0xbd, 0xcc, 0xdb, 0x59, 0x3d, 0x99, 0x4d, 0x05, 0x3e,
- 0xa8, 0x87, 0x92, 0xbc, 0x00, 0x97, 0x0d, 0xbd, 0x1a, 0x26, 0xdb, 0x3d,
- 0x73, 0xad, 0x00, 0x3e, 0x04, 0x6c, 0x81, 0xbd, 0x8e, 0x28, 0x6d, 0xbd,
- 0x7c, 0x76, 0x80, 0xbc, 0xda, 0x86, 0xd5, 0xbd, 0x03, 0x2a, 0x96, 0xbd,
- 0xb1, 0x62, 0xa8, 0xbd, 0xc7, 0x17, 0xef, 0xbd, 0x78, 0x42, 0xc3, 0x3d,
- 0xda, 0x1e, 0xed, 0x3d, 0x58, 0x72, 0xb2, 0xbc, 0x0e, 0xf1, 0xf7, 0x3d,
- 0x3a, 0x23, 0xfd, 0x3d, 0xd1, 0x69, 0x0a, 0x3e, 0xa0, 0xc3, 0x0d, 0xbd,
- 0xd0, 0x78, 0x82, 0xbc, 0xbe, 0xc7, 0x42, 0xbd, 0xea, 0xb2, 0xb8, 0x3d,
- 0x00, 0x22, 0x16, 0x3c, 0xb0, 0x0a, 0x75, 0xbd, 0xf0, 0x48, 0xde, 0xbc,
- 0x66, 0xb9, 0x99, 0x3d, 0x5e, 0xae, 0xcc, 0xbd, 0x80, 0xca, 0x9a, 0x3a,
- 0x80, 0xb5, 0xcd, 0xbd, 0xd0, 0x90, 0x8f, 0x3c, 0x16, 0x89, 0xc3, 0xbd,
- 0x28, 0x08, 0xc5, 0x3d, 0x40, 0xfe, 0x31, 0x3c, 0x40, 0xa1, 0x80, 0xbb,
- 0x40, 0x77, 0x4e, 0x3d, 0x72, 0xef, 0x09, 0xbe, 0xd6, 0x33, 0x88, 0x3d,
- 0xd0, 0x59, 0x64, 0x3d, 0x50, 0x29, 0x74, 0xbd, 0xc0, 0x08, 0x3c, 0xbb,
- 0x3e, 0x68, 0xb7, 0xbd, 0x0b, 0x2c, 0x0b, 0x3e, 0xde, 0x7a, 0xf1, 0xbd,
- 0x2e, 0xa3, 0x54, 0xbd, 0xaa, 0x5c, 0xc6, 0x3d, 0x60, 0xb4, 0xa8, 0x3c,
- 0xc8, 0x9f, 0xed, 0x3c, 0x8c, 0xbb, 0xaf, 0xbd, 0x00, 0x40, 0x4d, 0x3d,
- 0x1a, 0xb8, 0xf1, 0xbd, 0x66, 0x40, 0xa8, 0xbd, 0xad, 0x00, 0xc0, 0xbd,
- 0x32, 0x65, 0xc1, 0xbd, 0xfa, 0x05, 0x4d, 0xbd, 0xa6, 0x04, 0xfc, 0xbd,
- 0x10, 0x27, 0xc4, 0xbc, 0x54, 0x21, 0xca, 0xbc, 0x64, 0xcf, 0xcd, 0xbc,
- 0x42, 0xd6, 0x90, 0x3d, 0xb6, 0x30, 0xd2, 0xbd, 0xa8, 0x2f, 0xf1, 0x3c,
- 0xc4, 0x31, 0x22, 0xbd, 0x2c, 0x99, 0x8b, 0xbd, 0x9a, 0x3d, 0xc5, 0x3d,
- 0xdb, 0x8f, 0xd3, 0xbd, 0x28, 0xeb, 0xbf, 0x3c, 0xbe, 0xe0, 0xe4, 0x3d,
- 0x18, 0x64, 0xb3, 0x3d, 0x2c, 0xc3, 0x4e, 0xbd, 0x74, 0x6c, 0x05, 0xbd,
- 0x11, 0x52, 0xde, 0xbd, 0xae, 0x64, 0x02, 0xbd, 0x0a, 0xb2, 0xef, 0x3d,
- 0x20, 0xcf, 0xc7, 0xbd, 0x5f, 0x16, 0x0c, 0x3e, 0x10, 0xf9, 0xf3, 0x3c,
- 0xb8, 0x2f, 0xa4, 0xbc, 0xf0, 0xab, 0xb1, 0x3c, 0x76, 0x0b, 0x43, 0xbd,
- 0x3c, 0xbb, 0x03, 0xbd, 0x74, 0xfc, 0xf0, 0xbc, 0x09, 0xf0, 0xa4, 0xbd,
- 0xc0, 0xd5, 0xef, 0x3b, 0xaf, 0x9c, 0x09, 0xbe, 0x08, 0xac, 0x0e, 0xbd,
- 0x98, 0xea, 0xd0, 0x3d, 0xa3, 0xee, 0xe3, 0xbd, 0xd8, 0x49, 0x64, 0x3d,
- 0x90, 0x5c, 0x0e, 0xbe, 0xdc, 0xa4, 0x19, 0x3d, 0x08, 0x96, 0x6d, 0xbc,
- 0xa5, 0x40, 0xec, 0xbe, 0xef, 0xfb, 0xa0, 0x3f, 0x0d, 0xd6, 0x03, 0xbb,
- 0x87, 0x80, 0x9c, 0x3f, 0xb8, 0x94, 0x4d, 0x3e, 0xcb, 0xcf, 0x3f, 0x3f,
- 0x28, 0x26, 0x85, 0x3e, 0x4c, 0xf2, 0xb3, 0x3e, 0xe9, 0x6b, 0x16, 0xbf,
- 0x92, 0xf6, 0x7b, 0xbf, 0x10, 0xbe, 0x23, 0x3f, 0x62, 0x67, 0x30, 0xbe,
- 0xb2, 0x6f, 0x81, 0xbd, 0xc6, 0x66, 0x92, 0xbd, 0x51, 0x61, 0x2b, 0xbf,
- 0x7d, 0xb6, 0x7b, 0xbd, 0xa3, 0x00, 0x79, 0xbe, 0x90, 0xc1, 0x04, 0xbf,
- 0x95, 0xbb, 0x0a, 0xbf, 0xb7, 0xb3, 0x6f, 0xbd, 0x34, 0x7f, 0x27, 0x3f,
- 0x70, 0x4c, 0x3b, 0x3f, 0x17, 0x67, 0xc4, 0xbe, 0xa4, 0xa5, 0xaa, 0xbe,
- 0xc3, 0xbe, 0xb6, 0xbd, 0x25, 0x5a, 0xf8, 0x3e, 0x2c, 0x33, 0x3b, 0xbe,
- 0x15, 0xa4, 0xa6, 0xbf, 0x20, 0xcf, 0x80, 0x3d, 0x93, 0x51, 0x93, 0xbe,
- 0xb5, 0x7e, 0x1f, 0x3f, 0x1a, 0xb5, 0x1e, 0xbf, 0x48, 0x84, 0xd1, 0xbc,
- 0xd7, 0x55, 0xd7, 0x3e, 0x4c, 0x40, 0xc6, 0x3d, 0x65, 0x50, 0xce, 0xbd,
- 0x9d, 0xd3, 0xd9, 0x3e, 0xb1, 0x0c, 0xe8, 0xbe, 0xc7, 0x0e, 0xa5, 0x3e,
- 0x5c, 0xc5, 0xf2, 0xbe, 0x2a, 0x14, 0x75, 0xbe, 0xd6, 0x09, 0x8c, 0xbd,
- 0x5d, 0x0b, 0x7a, 0x3e, 0x63, 0x6e, 0x22, 0xbe, 0x4d, 0x3a, 0x8c, 0x3f,
- 0x93, 0x19, 0x2e, 0xbe, 0xd5, 0xcf, 0x4d, 0xbe, 0xf7, 0x83, 0x2c, 0x3c,
- 0x72, 0x66, 0xbc, 0x3d, 0x57, 0xde, 0x27, 0x3e, 0x81, 0x46, 0xe3, 0x3e,
- 0xd6, 0x93, 0x27, 0xbd, 0x46, 0x76, 0x5f, 0x3f, 0x49, 0x05, 0x82, 0x3c,
- 0xae, 0x84, 0x42, 0xbd, 0x3e, 0xb5, 0xf8, 0xbd, 0xd8, 0x7d, 0xe3, 0x3c,
- 0xea, 0xb6, 0x92, 0x3e, 0xbf, 0x41, 0x58, 0xbf, 0xf6, 0x5e, 0x07, 0x3f,
- 0x86, 0xa5, 0x88, 0x3e, 0xb1, 0x4e, 0x14, 0x3d, 0x2e, 0x79, 0x29, 0xbd,
- 0x5f, 0x51, 0x2a, 0xbf, 0x27, 0xed, 0xe1, 0xbd, 0x24, 0x5b, 0x0c, 0xbc,
- 0xa4, 0x95, 0x1c, 0x3d, 0x49, 0x0e, 0xf5, 0x3e, 0xe1, 0xf9, 0xcc, 0xbe,
- 0xdf, 0x0b, 0xc1, 0x3e, 0x73, 0x8e, 0x84, 0x3c, 0x92, 0x9b, 0x41, 0x3e,
- 0x75, 0x95, 0xd7, 0xbe, 0xfc, 0x54, 0x20, 0xbd, 0x06, 0xc1, 0x09, 0xbf,
- 0x0e, 0xea, 0xd2, 0x3e, 0xe9, 0xcb, 0x7d, 0x3f, 0x89, 0xe8, 0x35, 0xbf,
- 0x38, 0xa2, 0x4a, 0xbf, 0x67, 0x62, 0x59, 0xbd, 0xdc, 0xdf, 0xaf, 0xbd,
- 0x47, 0x5d, 0xb3, 0xbe, 0xc3, 0x84, 0xde, 0x3e, 0xb1, 0x19, 0xad, 0xbe,
- 0xd8, 0x69, 0x09, 0xbe, 0x72, 0x1a, 0x0a, 0x3f, 0x96, 0x36, 0x55, 0x3c,
- 0xe0, 0x5a, 0xdf, 0x3d, 0x7c, 0x5e, 0x14, 0xbe, 0xe3, 0xb0, 0x71, 0xbe,
- 0x21, 0x00, 0x28, 0x3f, 0xcb, 0x22, 0xac, 0xbe, 0x0a, 0x07, 0x56, 0xbe,
- 0x9d, 0x2c, 0x8a, 0x3e, 0xc4, 0x8a, 0xdc, 0x3e, 0xb3, 0x1f, 0x20, 0xbc,
- 0x6b, 0x40, 0xe6, 0x3e, 0x26, 0x4b, 0xa1, 0xbe, 0xd1, 0x1b, 0x4e, 0x3f,
- 0x90, 0x25, 0x69, 0xbf, 0xdc, 0x7b, 0xfd, 0xbe, 0x40, 0xac, 0x7a, 0xbe,
- 0xdb, 0x8e, 0x91, 0x3e, 0x9f, 0x74, 0x20, 0xbe, 0xbf, 0x2f, 0x12, 0xbf,
- 0xc1, 0xcf, 0x90, 0xbe, 0x8d, 0x16, 0xa0, 0x3e, 0xb1, 0x53, 0x57, 0x3f,
- 0x14, 0xf2, 0x24, 0x3e, 0x79, 0x79, 0x86, 0xbc, 0x1d, 0x9e, 0x2a, 0x3e,
- 0x55, 0x8a, 0x7b, 0x3f, 0xce, 0x6d, 0x7d, 0xbd, 0x21, 0xa3, 0x6e, 0x3e,
- 0xb1, 0x69, 0x90, 0xbe, 0xa6, 0x2e, 0x59, 0x3d, 0x92, 0xbc, 0xa8, 0xbe,
- 0x4d, 0x11, 0x53, 0xbe, 0x9b, 0x42, 0x92, 0x3d, 0x6f, 0xad, 0x41, 0xbd,
- 0xf5, 0x25, 0x98, 0x3e, 0x47, 0xd7, 0x0d, 0x3d, 0xc1, 0xe0, 0x7b, 0x3e,
- 0xfa, 0x93, 0x3f, 0xbe, 0x61, 0xba, 0x20, 0xbc, 0x89, 0x70, 0x37, 0x3e,
- 0x0e, 0x9b, 0x99, 0x3e, 0x0a, 0x7b, 0x33, 0x3e, 0xdb, 0xce, 0x9f, 0x3d,
- 0x25, 0x38, 0xe4, 0x3d, 0x9d, 0x0f, 0x95, 0x3e, 0x0e, 0xd6, 0x22, 0x3f,
- 0x5e, 0x97, 0x14, 0xbf, 0xe8, 0xc0, 0x2a, 0xbe, 0xfc, 0x83, 0x25, 0xbd,
- 0xd4, 0x3a, 0x9e, 0xbd, 0x02, 0x4e, 0x21, 0xbd, 0x00, 0x61, 0xb0, 0x3d,
- 0xaa, 0x70, 0x98, 0x3d, 0x7c, 0xbc, 0xba, 0x3e, 0x72, 0x6d, 0x0e, 0xbc,
- 0x8a, 0xc2, 0xe7, 0x3e, 0xc7, 0x43, 0x19, 0xbe, 0x56, 0x91, 0x12, 0xbf,
- 0x06, 0xba, 0x98, 0x3c, 0x01, 0x69, 0x80, 0xbd, 0xd2, 0xd7, 0xd6, 0x3d,
- 0x8f, 0xc6, 0xdc, 0x3e, 0xc2, 0x37, 0xbc, 0x3d, 0x4b, 0x8c, 0xdd, 0xbd,
- 0x33, 0x4a, 0x00, 0x3f, 0xdf, 0xd6, 0xa7, 0xbd, 0x74, 0x73, 0x6e, 0xbd,
- 0x0a, 0x2f, 0xcc, 0x3e, 0x6b, 0xe2, 0xcf, 0xbe, 0xee, 0xb8, 0x60, 0x3e,
- 0xd3, 0x40, 0x03, 0xbf, 0xfe, 0x08, 0xa4, 0xbe, 0xef, 0xd1, 0xe3, 0xbd,
- 0x3f, 0x57, 0x74, 0x3c, 0xeb, 0xf8, 0x9b, 0x3e, 0x06, 0x66, 0x38, 0xbf,
- 0x5d, 0x74, 0xa1, 0x3e, 0x67, 0x2f, 0x06, 0xbe, 0xa6, 0x80, 0xb8, 0x3d,
- 0xcf, 0xd9, 0x57, 0x3e, 0x41, 0x5e, 0xa1, 0x3e, 0x11, 0xfa, 0x93, 0x3e,
- 0xe8, 0x97, 0xe7, 0x3e, 0xd1, 0xad, 0x21, 0x3f, 0x4c, 0x7a, 0x13, 0x3f,
- 0xe9, 0x95, 0x92, 0x3d, 0xcf, 0x99, 0xb9, 0xbe, 0x7c, 0x01, 0x9d, 0xbe,
- 0x09, 0x89, 0xeb, 0x3d, 0xb3, 0x5d, 0xea, 0x3c, 0x8b, 0x73, 0x04, 0xbf,
- 0x37, 0xa1, 0xfe, 0xbc, 0x84, 0xed, 0xef, 0xbd, 0x8d, 0xcf, 0xc7, 0xbd,
- 0x57, 0xbe, 0x27, 0xbe, 0x84, 0x9b, 0x21, 0x3e, 0xd6, 0xdd, 0x97, 0xbd,
- 0x50, 0x77, 0xf2, 0xbc, 0x21, 0x51, 0x50, 0x3e, 0x6c, 0x02, 0x32, 0x3f,
- 0xf5, 0x5f, 0xe6, 0x3e, 0xd8, 0x90, 0x48, 0xbb, 0xad, 0x43, 0x50, 0x3e,
- 0x24, 0x0f, 0x52, 0x3f, 0x32, 0x14, 0xb6, 0xbd, 0x86, 0xc5, 0xb9, 0xbe,
- 0x97, 0x47, 0x58, 0x3d, 0x98, 0x2d, 0xa2, 0x3e, 0x55, 0x50, 0x40, 0xbd,
- 0x93, 0xac, 0xb5, 0x3e, 0xdc, 0x15, 0x36, 0x3d, 0x74, 0xa5, 0xed, 0xbd,
- 0x74, 0x63, 0xa0, 0xbe, 0xe2, 0xe3, 0x1e, 0x3e, 0x50, 0x5b, 0x9b, 0xbe,
- 0xb6, 0x73, 0x86, 0xbd, 0xcd, 0x5c, 0x2a, 0xbe, 0x4c, 0x72, 0xc0, 0x3e,
- 0x18, 0x0d, 0x3c, 0xbe, 0xe2, 0xa7, 0xea, 0x3e, 0xfd, 0x56, 0xa2, 0x3d,
- 0x7b, 0xd9, 0x33, 0x3e, 0x56, 0x6f, 0x0a, 0xbf, 0x64, 0x04, 0x9e, 0x3e,
- 0xb5, 0xaf, 0xd7, 0x3c, 0x8b, 0x02, 0xa4, 0xbd, 0x1b, 0xf4, 0x0b, 0xbd,
- 0xaa, 0x94, 0x9a, 0x3e, 0xc1, 0xcc, 0x49, 0xbe, 0x0b, 0xc7, 0x5f, 0x3e,
- 0xd6, 0xb3, 0xe6, 0xbc, 0xc1, 0x90, 0x0d, 0xbf, 0x08, 0x00, 0x0f, 0xbf,
- 0x6c, 0xed, 0x01, 0xbe, 0x72, 0xfc, 0x93, 0xbe, 0xfd, 0x35, 0xaa, 0xbd,
- 0x58, 0x25, 0x82, 0xbe, 0x1e, 0x9d, 0x08, 0xbf, 0xc6, 0xd7, 0x06, 0xbe,
- 0x12, 0xe6, 0x39, 0xbf, 0x27, 0x18, 0xa5, 0xbd, 0x95, 0x7d, 0x95, 0x3e,
- 0x57, 0x8b, 0xed, 0xbc, 0x37, 0x6e, 0x8a, 0x3d, 0x9e, 0x2f, 0x25, 0x3e,
- 0x2c, 0x18, 0x36, 0xbe, 0x8f, 0xb2, 0x7f, 0x3e, 0x7d, 0x57, 0xfb, 0x3c,
- 0x95, 0x70, 0x7c, 0x3e, 0x80, 0xa6, 0x48, 0xbe, 0x87, 0x50, 0x54, 0x3e,
- 0x03, 0xae, 0x15, 0xbf, 0xb5, 0x61, 0x0d, 0xbd, 0xa2, 0x08, 0xde, 0xbe,
- 0x5f, 0x26, 0xce, 0x3e, 0x75, 0x02, 0xaf, 0xbd, 0x97, 0x11, 0xa9, 0xbd,
- 0xcb, 0xb9, 0x05, 0xbf, 0x3b, 0x09, 0x3c, 0x3e, 0xbf, 0x3f, 0x28, 0xbd,
- 0x5f, 0x82, 0xe3, 0x3e, 0x0a, 0x08, 0xb2, 0x3d, 0x87, 0x83, 0xf9, 0x3d,
- 0xc6, 0x2e, 0xe4, 0x3e, 0x96, 0x1e, 0x56, 0x3e, 0x18, 0x10, 0x84, 0x3e,
- 0x27, 0xed, 0x9e, 0xbc, 0xc0, 0x47, 0xae, 0x3e, 0x9c, 0x07, 0x08, 0x3d,
- 0xc7, 0xb1, 0x34, 0xbe, 0x2f, 0xd3, 0x68, 0x3e, 0x76, 0xcb, 0x54, 0x3e,
- 0xb8, 0x42, 0x4a, 0x3e, 0x43, 0x21, 0x0e, 0xbf, 0x29, 0x8e, 0xdd, 0xbe,
- 0xe6, 0x0c, 0xaa, 0x3e, 0x6d, 0x7d, 0x69, 0xbd, 0x0c, 0x24, 0x9b, 0xbe,
- 0x12, 0x21, 0xce, 0xbe, 0xe3, 0x93, 0xc4, 0xbe, 0x48, 0xe7, 0x8e, 0x3d,
- 0x0a, 0x8b, 0xe6, 0xba, 0x58, 0x3b, 0x95, 0x3e, 0x04, 0x27, 0x09, 0x3e,
- 0x11, 0x0a, 0xdd, 0xbe, 0xab, 0x71, 0xb3, 0x3e, 0xcb, 0xa1, 0xb2, 0xbc,
- 0x7e, 0x7b, 0x97, 0x3e, 0xc9, 0x09, 0x06, 0xbd, 0xfb, 0xb7, 0xf5, 0xbd,
- 0xd5, 0xf7, 0x29, 0xbe, 0x68, 0xe4, 0x86, 0x3d, 0xa4, 0x2b, 0x1a, 0xbe,
- 0xd5, 0x41, 0x2e, 0x3e, 0xe6, 0x12, 0xf3, 0x3d, 0xb9, 0x5e, 0x97, 0x3e,
- 0xf3, 0x79, 0x93, 0xbc, 0x54, 0x50, 0xc0, 0xbe, 0xa6, 0x9a, 0x5d, 0xbe,
- 0x4b, 0x3a, 0xba, 0x3d, 0x27, 0x45, 0x2d, 0x3f, 0x77, 0x1a, 0xe3, 0xbe,
- 0x2c, 0x99, 0x99, 0x3d, 0x07, 0xda, 0xc5, 0xbe, 0xbd, 0xca, 0xb8, 0x3d,
- 0x09, 0x99, 0x33, 0x3e, 0x26, 0xb2, 0x61, 0x3e, 0x9c, 0xe6, 0x7e, 0x3e,
- 0xfc, 0xb9, 0x0d, 0x3e, 0x6c, 0x43, 0xf0, 0xbe, 0x66, 0x06, 0xd1, 0x3d,
- 0xd8, 0x7b, 0x9d, 0x3e, 0xce, 0xe4, 0xd6, 0x3d, 0xb1, 0x3f, 0x34, 0xbe,
- 0xae, 0x2d, 0x93, 0xbd, 0x39, 0xfc, 0x41, 0x3d, 0x50, 0xf0, 0xaf, 0xbe,
- 0x13, 0x02, 0xb8, 0xbe, 0xdd, 0x67, 0x00, 0xbe, 0xfc, 0x95, 0x79, 0x3e,
- 0xef, 0x02, 0x80, 0xbd, 0x3a, 0xb9, 0x78, 0x3d, 0x8f, 0x11, 0xa2, 0xbe,
- 0xb7, 0x9a, 0xb3, 0x3c, 0xf1, 0x68, 0x52, 0x3e, 0xa3, 0xf7, 0x16, 0xbe,
- 0x17, 0xb7, 0x1f, 0x3e, 0xcf, 0xc9, 0x8a, 0xbd, 0xa8, 0x2f, 0xb8, 0xbd,
- 0x70, 0x58, 0x8c, 0xbd, 0xa6, 0x93, 0x94, 0xbe, 0xe8, 0x63, 0xa9, 0x3e,
- 0x67, 0x4f, 0x56, 0xbe, 0x10, 0xcf, 0x73, 0x3e, 0xb4, 0xba, 0x4e, 0x3e,
- 0x40, 0x0b, 0x3f, 0x3d, 0x2d, 0x65, 0x0b, 0x3e, 0x53, 0x31, 0x99, 0x3d,
- 0x83, 0x9b, 0xa8, 0xbe, 0x9c, 0x7b, 0x0f, 0xbf, 0xbc, 0x75, 0x8f, 0xbd,
- 0x8f, 0x47, 0x87, 0xbc, 0x23, 0x74, 0xeb, 0xbe, 0xa5, 0x4a, 0xad, 0xbe,
- 0x9d, 0x19, 0x04, 0x3e, 0x14, 0x59, 0x22, 0xbd, 0x12, 0x69, 0x81, 0xbe,
- 0x63, 0x39, 0x36, 0xbe, 0x65, 0xdf, 0xa1, 0xbe, 0x64, 0x3b, 0xa9, 0xbc,
- 0x04, 0xf3, 0x60, 0xbd, 0xd4, 0xbf, 0xe8, 0xbc, 0x13, 0xf5, 0xc4, 0x3d,
- 0x5a, 0x0d, 0x81, 0xbe, 0xe4, 0xcd, 0x42, 0xbe, 0x26, 0xa1, 0xbb, 0xbe,
- 0xbb, 0xa2, 0x09, 0x3f, 0x87, 0x7f, 0x28, 0x3d, 0x16, 0x75, 0xe0, 0xbe,
- 0xca, 0x7e, 0x09, 0x3d, 0xda, 0x90, 0x06, 0x3e, 0x41, 0xab, 0xd3, 0x3b,
- 0xef, 0x24, 0x04, 0xbe, 0xe5, 0x8a, 0x24, 0xbc, 0xfa, 0x18, 0x2c, 0x3f,
- 0xf9, 0x94, 0x95, 0x3e, 0xcf, 0xd3, 0x97, 0xbd, 0xd9, 0xc9, 0xa8, 0x3e,
- 0xc5, 0x22, 0xa6, 0xbe, 0xcf, 0x04, 0x00, 0xbe, 0xdc, 0xc1, 0x6c, 0x3e,
- 0xd8, 0xd6, 0x0d, 0xbd, 0x39, 0xbe, 0xd4, 0x3d, 0xc8, 0xb9, 0x85, 0x3e,
- 0xc6, 0xc0, 0xa9, 0xbe, 0xec, 0x38, 0x56, 0x3d, 0x8a, 0x50, 0x1a, 0xbe,
- 0xa6, 0xe9, 0x13, 0x3f, 0x57, 0x65, 0x2b, 0x3e, 0x28, 0x25, 0xb7, 0x3e,
- 0x4f, 0x1f, 0xfc, 0xbc, 0xb8, 0x67, 0x9c, 0x3e, 0x27, 0xca, 0xf4, 0x3e,
- 0x2f, 0x39, 0x09, 0xbf, 0xb0, 0x43, 0xa7, 0xbd, 0x21, 0x5a, 0x30, 0x3e,
- 0xd5, 0xc4, 0x47, 0xbd, 0x61, 0x97, 0x73, 0x3e, 0xf8, 0xdc, 0x3d, 0x3f,
- 0x81, 0x38, 0x63, 0x3e, 0xf2, 0xdb, 0x71, 0xbe, 0xd7, 0x6f, 0x5b, 0xbd,
- 0xf0, 0xc6, 0xd7, 0x3e, 0x79, 0x62, 0xb6, 0x3d, 0xea, 0x36, 0xa0, 0xbe,
- 0x51, 0xa8, 0xf2, 0xbe, 0x61, 0x5b, 0x8c, 0xbe, 0x99, 0x87, 0x1e, 0xbe,
- 0x43, 0xb7, 0xbd, 0x3d, 0xed, 0xcb, 0xab, 0x3d, 0x2f, 0xc8, 0x23, 0x3e,
- 0xf3, 0xce, 0xf6, 0xbe, 0x28, 0x62, 0x54, 0x3e, 0xfb, 0x5f, 0xd7, 0x3d,
- 0xc6, 0x35, 0x77, 0xbe, 0x86, 0x29, 0x96, 0xbe, 0x40, 0xd7, 0x01, 0xbe,
- 0x77, 0x57, 0x74, 0xbc, 0xe7, 0x6d, 0x8c, 0xbe, 0xca, 0x10, 0xef, 0x3e,
- 0x45, 0x92, 0xcd, 0x3e, 0xc1, 0xcf, 0x3c, 0x3e, 0xa6, 0xf7, 0xe7, 0x3e,
- 0xf5, 0x94, 0x51, 0xbc, 0xa6, 0xad, 0x03, 0xbf, 0xe9, 0xad, 0xb9, 0xbe,
- 0xff, 0x93, 0x4f, 0xbe, 0xef, 0x0e, 0x9d, 0x3e, 0x39, 0xa9, 0x8d, 0xbe,
- 0xdf, 0x55, 0xeb, 0xbd, 0xc4, 0x73, 0x5a, 0xbd, 0xe9, 0x0a, 0xf4, 0x3e,
- 0x2a, 0x1a, 0xdc, 0x3d, 0x7d, 0x3c, 0xa1, 0xbd, 0xe4, 0xe3, 0x3a, 0x3e,
- 0xbe, 0x00, 0x24, 0xbd, 0xec, 0x77, 0xa9, 0xbe, 0xac, 0xcd, 0x41, 0xbe,
- 0xd7, 0xce, 0x81, 0x3e, 0x91, 0xcb, 0xa7, 0x3e, 0x8d, 0x57, 0x33, 0xbe,
- 0xba, 0x6f, 0x8c, 0xbe, 0x7e, 0xb0, 0x05, 0xbf, 0xa6, 0x77, 0x9b, 0x3e,
- 0x0e, 0x58, 0x61, 0xbd, 0xce, 0x90, 0xfa, 0xbc, 0x70, 0xe9, 0x06, 0x3e,
- 0x9e, 0xe7, 0x99, 0x3e, 0x4f, 0x2a, 0xa9, 0xbc, 0x1a, 0x7e, 0xd2, 0xbe,
- 0x5c, 0xb2, 0x5a, 0xbe, 0xd2, 0x90, 0x5c, 0xbc, 0xc4, 0x0b, 0xe8, 0xbe,
- 0x79, 0x15, 0x30, 0x3d, 0x51, 0x8e, 0xb1, 0x3c, 0xe3, 0x1f, 0x81, 0xbc,
- 0x27, 0xe3, 0x96, 0xbe, 0x6e, 0x81, 0x14, 0x3d, 0x70, 0x23, 0x77, 0x3e,
- 0xf2, 0x3a, 0x3a, 0xbe, 0x20, 0xd5, 0x86, 0x3d, 0x3d, 0x9c, 0xd5, 0xba,
- 0x0f, 0x02, 0x8d, 0xbd, 0x21, 0x40, 0x06, 0x3f, 0x38, 0xbf, 0x51, 0xbd,
- 0x61, 0x71, 0x11, 0xbe, 0xae, 0x5a, 0x8b, 0xbe, 0x13, 0x23, 0xb5, 0x3e,
- 0x33, 0xd9, 0x06, 0x3e, 0xe9, 0x35, 0x43, 0xbe, 0xef, 0x2f, 0x51, 0xbe,
- 0xd5, 0x89, 0x95, 0x3e, 0xec, 0xee, 0xf6, 0xbe, 0x88, 0x39, 0x72, 0xbf,
- 0xa1, 0x6e, 0x06, 0xbf, 0xe1, 0xa6, 0xcc, 0xbd, 0xca, 0xf1, 0xf1, 0xbe,
- 0x2c, 0xe9, 0x96, 0xbe, 0x27, 0x19, 0x66, 0xbe, 0x72, 0x8e, 0x68, 0xbd,
- 0x9d, 0x0e, 0xa7, 0xbe, 0xa6, 0x8d, 0x58, 0x3e, 0x4f, 0xda, 0x09, 0xbf,
- 0x98, 0x72, 0xf1, 0x3e, 0x2f, 0x88, 0x08, 0x3e, 0xfb, 0x93, 0x12, 0xbf,
- 0x92, 0x09, 0x92, 0x3d, 0xf1, 0xa2, 0x84, 0x3e, 0x83, 0x7e, 0xc2, 0xbd,
- 0xd1, 0x5a, 0x5b, 0xbe, 0xbd, 0x4f, 0xcc, 0xbd, 0x45, 0x72, 0x13, 0x3f,
- 0x15, 0xc6, 0xb1, 0x3e, 0xf6, 0x26, 0x26, 0x3e, 0xbf, 0x11, 0x8e, 0xbe,
- 0x65, 0xb4, 0x62, 0xbf, 0xce, 0xb7, 0xa4, 0xbc, 0xd3, 0x95, 0x7f, 0x3f,
- 0x0a, 0x22, 0x20, 0xbf, 0x13, 0xbc, 0x81, 0x3e, 0xd1, 0xdb, 0x81, 0xbc,
- 0x52, 0xf5, 0x92, 0x3d, 0x21, 0x5b, 0x6b, 0xbf, 0x17, 0x95, 0x0b, 0x3e,
- 0x90, 0x81, 0x42, 0x3f, 0x4b, 0x75, 0x1c, 0xbe, 0xd4, 0xc4, 0x9c, 0x3e,
- 0x45, 0x4e, 0xaf, 0x3e, 0x44, 0x44, 0x02, 0xbf, 0xb9, 0xf9, 0x0c, 0xbf,
- 0x9a, 0x77, 0xac, 0xbf, 0x65, 0xe7, 0x31, 0xbf, 0x38, 0x86, 0x5d, 0x3e,
- 0x6c, 0x88, 0x94, 0xbf, 0xfb, 0x77, 0x28, 0xbf, 0xa0, 0x56, 0x86, 0xbf,
- 0x4e, 0x6c, 0xba, 0xbf, 0xd3, 0x09, 0xa4, 0x3e, 0x8b, 0x47, 0xb8, 0xbd,
- 0xf3, 0x08, 0x91, 0x3c, 0x77, 0x30, 0xe9, 0x3c, 0x0c, 0xd4, 0xaf, 0x3d,
- 0x27, 0xe0, 0x46, 0x3e, 0xc2, 0x32, 0x24, 0xbf, 0x6c, 0x82, 0x05, 0xbe,
- 0xa5, 0x9e, 0x25, 0xbf, 0x1c, 0x15, 0xf4, 0xbe, 0x9a, 0x3c, 0x99, 0xbb,
- 0xfd, 0xae, 0xa4, 0xbe, 0xba, 0x46, 0x3b, 0x3c, 0x38, 0x21, 0x53, 0xbe,
- 0x24, 0x87, 0x65, 0x3e, 0x00, 0xf5, 0xbd, 0x3d, 0x94, 0x1c, 0xb9, 0xbd,
- 0xd3, 0xc4, 0x1b, 0x3f, 0x99, 0x2f, 0x91, 0xbe, 0x0b, 0x68, 0xa5, 0x3e,
- 0x46, 0x22, 0x28, 0xbf, 0xaf, 0xb3, 0xf6, 0xbd, 0x54, 0x12, 0xe3, 0xbe,
- 0x12, 0x94, 0x5e, 0x3c, 0x70, 0x4a, 0xd7, 0x3e, 0xb0, 0xbf, 0x13, 0xbf,
- 0x43, 0x28, 0xb9, 0xbe, 0x97, 0x03, 0x63, 0xbf, 0xac, 0x3d, 0x8d, 0xbe,
- 0x18, 0xf2, 0x0b, 0xbe, 0xc8, 0x6b, 0x30, 0x3f, 0xe8, 0x96, 0x8c, 0x3e,
- 0x70, 0xf6, 0xba, 0x3e, 0x44, 0xa9, 0x91, 0xbe, 0x6c, 0x9c, 0x6d, 0xbf,
- 0xc7, 0x66, 0xdf, 0x3d, 0xc4, 0x98, 0x9d, 0xbf, 0x56, 0xd9, 0xbe, 0xbd,
- 0xee, 0xb3, 0x4f, 0xbf, 0xec, 0xd3, 0xa9, 0xbd, 0x3c, 0x35, 0x59, 0xbd,
- 0x10, 0xb3, 0x81, 0xbd, 0x01, 0x4a, 0x8b, 0xbf, 0x29, 0x3d, 0xa8, 0x3e,
- 0x87, 0x81, 0x43, 0xbf, 0x68, 0x03, 0x0a, 0x3d, 0xe2, 0x75, 0xad, 0xbf,
- 0xf6, 0x68, 0x5a, 0xbf, 0xdf, 0xb8, 0x35, 0xbe, 0x0f, 0x9c, 0x0b, 0xbf,
- 0x0b, 0x74, 0x2a, 0xbe, 0xc4, 0xdf, 0xb3, 0x3e, 0x46, 0xde, 0xdd, 0x3e,
- 0xc0, 0x62, 0xf8, 0x3e, 0xc5, 0x2a, 0x45, 0xbe, 0x20, 0xce, 0x17, 0x3c,
- 0xbe, 0x46, 0x63, 0xbd, 0x8f, 0x09, 0x0d, 0x3c, 0x90, 0x3f, 0x08, 0xbe,
- 0x30, 0x8b, 0x95, 0xbd, 0x43, 0x35, 0x77, 0x3f, 0x6b, 0x89, 0x06, 0x3f,
- 0x95, 0x08, 0x38, 0x3f, 0xce, 0x84, 0xc0, 0xbf, 0xf2, 0xe1, 0x38, 0xbf,
- 0x36, 0x1f, 0x74, 0xbf, 0xbb, 0x1f, 0x36, 0x3e, 0x80, 0x93, 0x12, 0xbf,
- 0x32, 0xcf, 0xf6, 0x3e, 0x62, 0xef, 0xb2, 0xbe, 0x76, 0xd8, 0xd4, 0xbb,
- 0xab, 0x70, 0xb5, 0x3e, 0x2a, 0xb4, 0xae, 0x3e, 0x8f, 0x5b, 0xa0, 0xbf,
- 0x2c, 0xf8, 0xcd, 0xbe, 0xe2, 0x38, 0x8c, 0x3f, 0x0f, 0x33, 0x0a, 0x3f,
- 0x05, 0xea, 0x80, 0xbe, 0x00, 0x16, 0xad, 0x3e, 0xd5, 0xa7, 0x4b, 0xbe,
- 0xff, 0x9f, 0xb5, 0x3d, 0xb5, 0x5f, 0x38, 0x3f, 0xf9, 0x16, 0xa4, 0xbe,
- 0xac, 0x9e, 0x38, 0x3e, 0x85, 0x00, 0x0d, 0x3e, 0x81, 0x76, 0xf0, 0xbd,
- 0x4b, 0xfe, 0xa5, 0xbf, 0xfb, 0x4a, 0x30, 0xbe, 0xaa, 0xca, 0x05, 0x3e,
- 0xeb, 0x9f, 0x75, 0x3d, 0x3c, 0xbe, 0x2c, 0x3f, 0xba, 0x40, 0x8b, 0xbe,
- 0x5f, 0xad, 0xaf, 0xbe, 0xdd, 0xe8, 0x48, 0x3e, 0xbc, 0xa5, 0x0d, 0xbe,
- 0x77, 0xa5, 0xc3, 0x3c, 0xed, 0x12, 0xbb, 0xbd, 0x16, 0xc3, 0x3c, 0xbe,
- 0x6d, 0x94, 0xbf, 0xbd, 0x5f, 0x58, 0xc4, 0x3c, 0x49, 0x39, 0xac, 0xbe,
- 0x63, 0xc4, 0xe5, 0x3c, 0xaa, 0x88, 0x9e, 0x3e, 0x7a, 0xac, 0x3b, 0x3e,
- 0x24, 0x41, 0x37, 0xbf, 0xd4, 0xf4, 0x00, 0x3e, 0x24, 0x4c, 0x71, 0xbe,
- 0x32, 0xee, 0xc2, 0xbd, 0xe0, 0x8b, 0xb1, 0x3e, 0x4c, 0x8f, 0xcd, 0x3d,
- 0x63, 0x9d, 0x83, 0xbd, 0x9b, 0xdb, 0xcb, 0xbd, 0x34, 0x37, 0x4d, 0xbe,
- 0xbb, 0x61, 0x81, 0x3e, 0x1d, 0x6f, 0x3c, 0x3e, 0xc2, 0xfd, 0x11, 0xbe,
- 0x0a, 0x14, 0x8a, 0x3e, 0xd2, 0x08, 0x72, 0x3d, 0x64, 0x23, 0x1d, 0xbe,
- 0x50, 0x20, 0xaf, 0xbe, 0x4c, 0xa1, 0xdd, 0x3d, 0x16, 0xe4, 0xb6, 0x3e,
- 0xc9, 0x33, 0xd8, 0xbd, 0xf5, 0x56, 0x4a, 0x3e, 0xb6, 0x2a, 0x23, 0xbe,
- 0x8f, 0x58, 0x95, 0x3d, 0xa4, 0x5f, 0xb4, 0xbd, 0x66, 0xeb, 0xf5, 0xbe,
- 0x9f, 0x5c, 0x44, 0xbe, 0x39, 0xec, 0xe6, 0xbd, 0x0a, 0xb6, 0x3f, 0x3e,
- 0x13, 0xdf, 0xf0, 0xbd, 0x09, 0x03, 0x31, 0xbe, 0x6c, 0x4b, 0x98, 0xbd,
- 0x8b, 0xd5, 0x00, 0x3e, 0x30, 0xef, 0x62, 0x3e, 0x22, 0x0b, 0x66, 0x3e,
- 0x9d, 0xe6, 0x0c, 0xbd, 0xde, 0x0a, 0x2e, 0xbd, 0x70, 0xc2, 0x0c, 0xbe,
- 0xc4, 0x5b, 0xa9, 0xbe, 0xd0, 0xa5, 0x2b, 0x3e, 0xdf, 0xe7, 0x45, 0xbe,
- 0x22, 0xa0, 0x88, 0xbe, 0xe6, 0xca, 0x85, 0xbe, 0x5a, 0x53, 0x29, 0x3e,
- 0x52, 0x25, 0x49, 0xbe, 0x26, 0x3e, 0x44, 0x3e, 0x2b, 0xb1, 0x35, 0x3e,
- 0xc8, 0xee, 0x3e, 0xbe, 0x17, 0x64, 0x74, 0x3d, 0xd2, 0x66, 0x52, 0x3e,
- 0x66, 0x4e, 0xc0, 0xbe, 0xe1, 0x60, 0x91, 0x3e, 0xf7, 0x17, 0xa0, 0xbd,
- 0x4b, 0xe7, 0x6a, 0x3e, 0x3e, 0x88, 0x16, 0x3c, 0x23, 0x46, 0x07, 0xbe,
- 0xcb, 0xdb, 0x7a, 0xbe, 0xec, 0xcf, 0x3d, 0xbe, 0xd2, 0x0b, 0x8a, 0xbe,
- 0x35, 0x69, 0x7a, 0x3d, 0xeb, 0x6b, 0x87, 0xbd, 0x90, 0x09, 0x78, 0xbe,
- 0x60, 0x97, 0x0a, 0xbe, 0x6c, 0x46, 0x52, 0xbd, 0x21, 0x53, 0x2e, 0xbe,
- 0xd0, 0x45, 0x87, 0x3e, 0xb2, 0xf8, 0xef, 0xbc, 0x10, 0x84, 0xcb, 0xba,
- 0xa2, 0x99, 0x1a, 0x3e, 0xcf, 0xb8, 0xe7, 0xbc, 0xb4, 0x5a, 0x00, 0xbd,
- 0x93, 0xa0, 0x06, 0xbe, 0x1b, 0x26, 0x18, 0xbe, 0xd1, 0x8d, 0x32, 0x3e,
- 0xd6, 0xec, 0x15, 0xbe, 0x12, 0x0e, 0xd9, 0x3b, 0x17, 0x92, 0x8f, 0x3e,
- 0xa8, 0x6d, 0x3e, 0xbc, 0x0a, 0xd8, 0x86, 0x3e, 0x02, 0x48, 0x9e, 0x3d,
- 0x17, 0xb6, 0x21, 0xbd, 0x14, 0x2c, 0xcc, 0xbc, 0xd8, 0x80, 0xff, 0x3c,
- 0xb7, 0x5e, 0x36, 0xbe, 0xcf, 0x51, 0x02, 0xbe, 0x28, 0x48, 0xdc, 0xbe,
- 0x76, 0xf8, 0x49, 0xbd, 0x7c, 0x75, 0x80, 0x3e, 0xb2, 0x44, 0xd8, 0x3d,
- 0xd7, 0x27, 0x23, 0xbe, 0x7d, 0x26, 0xc9, 0xbd, 0xf9, 0x8d, 0x16, 0xbe,
- 0xba, 0x16, 0x15, 0x3e, 0xd8, 0xf1, 0xa2, 0xbe, 0x17, 0x9e, 0x35, 0xbd,
- 0xd5, 0x29, 0x81, 0xbe, 0x47, 0x0a, 0xbe, 0x3d, 0xce, 0x98, 0x62, 0x3e,
- 0x69, 0x60, 0x26, 0xbd, 0xd2, 0x49, 0x11, 0xbe, 0xcd, 0xbf, 0x58, 0x3c,
- 0x0d, 0xae, 0xee, 0x3d, 0xe9, 0x83, 0xcb, 0x3a, 0xaf, 0x08, 0x01, 0xbe,
- 0x2b, 0x2b, 0x9d, 0xbd, 0xee, 0x87, 0x1d, 0x3d, 0x9c, 0xa9, 0x56, 0xbc,
- 0xc3, 0x82, 0xe8, 0xbe, 0xa3, 0x0f, 0xa1, 0x3f, 0x7f, 0x9a, 0x2a, 0xbe,
- 0x55, 0xfc, 0xab, 0x3f, 0x4f, 0x72, 0x90, 0x3e, 0x93, 0x78, 0x1f, 0x3f,
- 0x4c, 0x91, 0xb0, 0x3e, 0xac, 0x3f, 0x59, 0x3e, 0x72, 0x3e, 0xd1, 0xbe,
- 0x87, 0xc4, 0x93, 0xbf, 0x5c, 0x99, 0x1a, 0x3f, 0x03, 0x96, 0xcb, 0xbd,
- 0xc5, 0x62, 0xbd, 0x3c, 0xac, 0x16, 0x05, 0x3d, 0x27, 0x9c, 0x1c, 0xbf,
- 0xda, 0xb9, 0x29, 0xbe, 0x1b, 0x32, 0x05, 0xbe, 0xf8, 0xc0, 0x22, 0xbf,
- 0x33, 0x11, 0x3e, 0xbf, 0x01, 0x80, 0xd8, 0x3d, 0x70, 0xa6, 0xfc, 0x3e,
- 0x1e, 0x55, 0x2d, 0x3f, 0x0d, 0x01, 0xfe, 0xbe, 0xec, 0x76, 0x8d, 0xbe,
- 0xf4, 0x74, 0xa8, 0xbe, 0xbb, 0x15, 0x9d, 0x3e, 0x7f, 0x0e, 0xad, 0xbe,
- 0xa7, 0xef, 0x95, 0xbf, 0x7b, 0x37, 0x1b, 0xbe, 0x31, 0xd7, 0x6e, 0xbe,
- 0x3f, 0x16, 0x1f, 0x3f, 0xd0, 0x64, 0x5f, 0xbf, 0x01, 0x62, 0x95, 0x3b,
- 0xef, 0xd3, 0xe9, 0x3e, 0x0b, 0x82, 0x2e, 0x3e, 0x0f, 0x5f, 0x1b, 0xbd,
- 0xcb, 0x05, 0xc1, 0x3e, 0xed, 0x6a, 0xc4, 0xbe, 0xf3, 0xbc, 0xd4, 0x3e,
- 0xda, 0x0d, 0x20, 0xbf, 0x91, 0x73, 0x85, 0xbe, 0x93, 0x46, 0xb2, 0x3d,
- 0x01, 0xbd, 0x16, 0x3e, 0x23, 0x73, 0x93, 0xbd, 0x3f, 0xbe, 0x93, 0x3f,
- 0xb0, 0x8a, 0xac, 0xbe, 0xe3, 0x02, 0x74, 0xbe, 0x68, 0xd9, 0x32, 0x3e,
- 0x14, 0x10, 0xd5, 0x3d, 0x16, 0xba, 0xde, 0xbc, 0x0c, 0x79, 0x2b, 0x3f,
- 0xa2, 0xe2, 0x14, 0x3d, 0x7e, 0x77, 0x65, 0x3f, 0xc1, 0x07, 0x6b, 0xbd,
- 0x0b, 0x08, 0x59, 0x3d, 0xbf, 0xda, 0x09, 0xbe, 0x80, 0x44, 0xba, 0x3d,
- 0x41, 0x77, 0x30, 0x3e, 0xd1, 0xa5, 0x4f, 0xbf, 0xd7, 0x2e, 0x14, 0x3f,
- 0xd6, 0x4d, 0xe9, 0x3e, 0xcd, 0x06, 0x7f, 0x3b, 0x13, 0x7b, 0x11, 0xbe,
- 0x3d, 0x95, 0x2c, 0xbf, 0xfd, 0xe8, 0xcc, 0xbd, 0x6c, 0x13, 0x2c, 0x3a,
- 0x11, 0x79, 0x1b, 0xbe, 0x89, 0xe7, 0xc5, 0x3e, 0xdd, 0xe7, 0xac, 0xbe,
- 0x94, 0x7f, 0x91, 0x3e, 0x95, 0x19, 0xbd, 0x3c, 0x30, 0xf7, 0x82, 0x3e,
- 0x1d, 0xab, 0xe9, 0xbe, 0x5a, 0x93, 0x39, 0xbe, 0x70, 0xd5, 0x04, 0xbf,
- 0x42, 0x26, 0xb4, 0x3e, 0x1d, 0xc8, 0x93, 0x3f, 0xf5, 0x9d, 0x15, 0xbf,
- 0x96, 0x88, 0x55, 0xbf, 0xb9, 0x95, 0xde, 0x3d, 0x70, 0x15, 0x89, 0x3d,
- 0x43, 0xbc, 0xab, 0xbe, 0x11, 0xe1, 0x0c, 0x3f, 0x85, 0x49, 0xff, 0xbe,
- 0x4d, 0x0e, 0x37, 0xbe, 0xff, 0xd8, 0xcd, 0x3e, 0x37, 0x58, 0x24, 0x3e,
- 0x05, 0x49, 0x20, 0x3e, 0x72, 0xde, 0x19, 0xbe, 0x3d, 0x65, 0xe0, 0xbd,
- 0x5f, 0xd6, 0x2b, 0x3f, 0xcf, 0x6a, 0xb6, 0xbe, 0xaa, 0x46, 0xf7, 0xbc,
- 0x93, 0x4d, 0x8b, 0x3e, 0xfe, 0xa2, 0xc6, 0x3e, 0xfa, 0x63, 0xc7, 0x3d,
- 0xcd, 0x8e, 0xe6, 0x3e, 0x4a, 0x36, 0x9d, 0xbe, 0xb3, 0xaa, 0x25, 0x3f,
- 0x88, 0xd6, 0x39, 0xbf, 0xb1, 0x5c, 0xe8, 0xbe, 0x6c, 0x98, 0x52, 0xbe,
- 0x43, 0x68, 0xdb, 0x3d, 0x52, 0xb6, 0xf1, 0xbd, 0x79, 0xfa, 0x1e, 0xbf,
- 0x6f, 0x7a, 0x2f, 0xbe, 0x6f, 0xbd, 0x01, 0x3f, 0x16, 0x35, 0x4c, 0x3f,
- 0x54, 0x7c, 0xac, 0x3d, 0x78, 0x3b, 0x2f, 0xbd, 0x8b, 0x8b, 0x2c, 0xbd,
- 0x79, 0x21, 0x7b, 0x3f, 0x0b, 0x56, 0xe6, 0x3d, 0x47, 0xeb, 0x4c, 0x3e,
- 0x13, 0x2e, 0x45, 0xbe, 0x6e, 0xac, 0x88, 0x3e, 0x92, 0x4d, 0x96, 0xbe,
- 0x3e, 0xcf, 0x0e, 0x3d, 0x8d, 0x29, 0xbd, 0xbd, 0x6d, 0x08, 0x2e, 0x3e,
- 0x78, 0x09, 0x0a, 0xbf, 0x07, 0x47, 0x2e, 0xbe, 0x58, 0xd7, 0xbd, 0xbe,
- 0x1a, 0x1e, 0x24, 0x3e, 0x8d, 0x80, 0x2f, 0xbe, 0xe7, 0x34, 0x8f, 0x3e,
- 0xac, 0xe0, 0xb4, 0xbe, 0xd4, 0x66, 0x2f, 0xbe, 0x88, 0x7e, 0x58, 0x3e,
- 0x50, 0x16, 0x4e, 0x3e, 0x7e, 0x86, 0xe9, 0x3c, 0x8c, 0xd2, 0x96, 0xbc,
- 0x0c, 0x05, 0x28, 0x3e, 0x63, 0xc0, 0x15, 0xbe, 0xbd, 0x62, 0xb9, 0x3d,
- 0x20, 0x20, 0xa2, 0x3e, 0xde, 0x62, 0x8f, 0x3e, 0x66, 0x35, 0x36, 0xbe,
- 0xba, 0x59, 0x93, 0xbd, 0x3e, 0xe5, 0x87, 0xbc, 0x60, 0x9c, 0x98, 0x3d,
- 0x71, 0xb3, 0x8c, 0x3d, 0xe6, 0xf3, 0x1c, 0xbf, 0x0a, 0xf4, 0x66, 0xbe,
- 0x92, 0x13, 0xcd, 0x3d, 0x25, 0xee, 0x44, 0xbc, 0xf0, 0x9e, 0x77, 0xbe,
- 0xdc, 0xce, 0xbe, 0xbe, 0xa8, 0xe0, 0x65, 0xbe, 0xac, 0x78, 0x0d, 0x3c,
- 0x20, 0xb1, 0xeb, 0x3d, 0x56, 0x1d, 0xd0, 0x3d, 0x79, 0x87, 0xdf, 0x3d,
- 0x1a, 0x18, 0xa1, 0xbe, 0x0a, 0x7d, 0xfd, 0x3e, 0xe9, 0x28, 0x5c, 0xbd,
- 0x69, 0xe6, 0xea, 0x3e, 0xf4, 0x5a, 0xa3, 0xbd, 0x89, 0xa3, 0x0b, 0xbe,
- 0xf5, 0x3c, 0x26, 0xbd, 0x49, 0x64, 0x75, 0x3d, 0x3e, 0xdc, 0xc6, 0x3b,
- 0x83, 0x74, 0x09, 0xbc, 0x95, 0x13, 0xda, 0x3c, 0x58, 0x75, 0xab, 0x3e,
- 0xac, 0xcf, 0xb1, 0x3d, 0x92, 0xd9, 0x54, 0xbe, 0xf1, 0xb8, 0x02, 0xbe,
- 0x91, 0x34, 0xfa, 0xbd, 0x28, 0x9e, 0x03, 0x3f, 0x6a, 0x2c, 0xfc, 0xbe,
- 0xbc, 0x79, 0x26, 0xbd, 0x57, 0x25, 0x64, 0xbe, 0x7a, 0x71, 0x15, 0xbd,
- 0xf8, 0x3b, 0xa6, 0x3e, 0x9a, 0xfe, 0xec, 0x3e, 0xfe, 0x26, 0x1b, 0xbe,
- 0xf6, 0x16, 0xf3, 0xbc, 0x25, 0x52, 0x83, 0xbe, 0x4c, 0xda, 0x9e, 0xbc,
- 0x97, 0xa0, 0x81, 0x3e, 0x63, 0x43, 0x3d, 0xbd, 0x38, 0xb0, 0x2a, 0xbe,
- 0x15, 0x94, 0x5e, 0xbd, 0x99, 0xeb, 0xe7, 0x3d, 0x60, 0xa8, 0x57, 0xbe,
- 0xfa, 0xb9, 0x94, 0xbd, 0x6d, 0x86, 0xeb, 0xbd, 0x97, 0x2b, 0x8a, 0x3e,
- 0x14, 0xbe, 0x5a, 0xbe, 0xda, 0xa9, 0xbe, 0xbc, 0x6e, 0xc7, 0xa8, 0xbd,
- 0x5f, 0x14, 0xa9, 0x3d, 0xe3, 0x74, 0x4f, 0x3d, 0xa7, 0xb0, 0x91, 0xbd,
- 0xe2, 0xb3, 0x7f, 0xbd, 0x55, 0x79, 0x4e, 0xbe, 0x0a, 0x83, 0xd0, 0xbd,
- 0x69, 0x59, 0x94, 0xbd, 0xe0, 0xf2, 0x9e, 0xbe, 0x9a, 0x00, 0x84, 0x3e,
- 0xf0, 0xef, 0x77, 0x3d, 0xba, 0xa6, 0x84, 0x3e, 0x1c, 0x74, 0x80, 0xbd,
- 0xcf, 0x08, 0x27, 0x3d, 0x24, 0x61, 0x1f, 0x3e, 0x4c, 0x50, 0xa2, 0x3d,
- 0x13, 0x4c, 0xbe, 0xbe, 0x7a, 0xa3, 0xa9, 0xbe, 0xbe, 0x44, 0x4f, 0xbd,
- 0xd2, 0xee, 0x7e, 0x3c, 0x68, 0xe6, 0xd1, 0xbe, 0x3c, 0xc7, 0xdc, 0xbd,
- 0xfe, 0x9a, 0x1e, 0x3d, 0xdf, 0x9e, 0x65, 0xbe, 0xcb, 0x68, 0xb7, 0xbd,
- 0xad, 0x83, 0x8e, 0xbd, 0x58, 0x8d, 0x8d, 0xbe, 0x32, 0x56, 0xae, 0xbd,
- 0xff, 0x5d, 0x82, 0x3d, 0x30, 0x47, 0x1e, 0xbe, 0x6e, 0xc5, 0xc2, 0x3d,
- 0x40, 0x27, 0x64, 0xbe, 0xff, 0x30, 0xc1, 0xbd, 0x93, 0xa2, 0x6c, 0xbe,
- 0x90, 0xcd, 0x45, 0x3e, 0xa0, 0x39, 0xe9, 0xbd, 0xe0, 0xc8, 0xbc, 0xbe,
- 0x75, 0x21, 0xa4, 0xbe, 0x2e, 0x01, 0x35, 0xbd, 0xdb, 0x1d, 0x02, 0xbe,
- 0xec, 0x90, 0x8b, 0xbe, 0x36, 0x71, 0xc7, 0xbd, 0xc0, 0xa1, 0xab, 0x3e,
- 0x93, 0x8e, 0x7e, 0x3d, 0xb8, 0x3f, 0xc7, 0x3d, 0x0b, 0x39, 0xd6, 0x3c,
- 0xe8, 0x33, 0x41, 0xbe, 0x52, 0xc5, 0x0e, 0x3d, 0xe9, 0x4b, 0x9a, 0x3e,
- 0xcb, 0x39, 0xc3, 0xbe, 0x5b, 0x05, 0x2c, 0x3e, 0xb7, 0x3b, 0x8e, 0x3e,
- 0x48, 0x17, 0x48, 0xbe, 0xb9, 0x9f, 0xe7, 0xbd, 0x6e, 0x44, 0xa2, 0x3b,
- 0x39, 0x11, 0xa6, 0x3e, 0x31, 0x02, 0x00, 0xbe, 0x5c, 0x00, 0xc4, 0x3e,
- 0x84, 0x7e, 0x05, 0xbf, 0xbd, 0x73, 0x2c, 0x3e, 0x06, 0x0f, 0x16, 0x3f,
- 0xb6, 0xd9, 0x09, 0xbf, 0x6e, 0xd2, 0xbc, 0xbd, 0x9a, 0x92, 0xf4, 0x3d,
- 0x2c, 0x9b, 0x9c, 0xbc, 0x67, 0x0e, 0x37, 0x3e, 0x8a, 0xcc, 0xd7, 0x3e,
- 0x20, 0x02, 0xab, 0x3d, 0xa0, 0x04, 0xbf, 0xbe, 0x10, 0x81, 0x43, 0xbe,
- 0x52, 0x22, 0xab, 0x3e, 0x79, 0x37, 0x0a, 0x3d, 0x15, 0x0f, 0x12, 0xbe,
- 0x27, 0xdf, 0x7a, 0xbe, 0xf8, 0xfa, 0x17, 0xbd, 0x03, 0xe7, 0x83, 0xbd,
- 0xcc, 0x77, 0x19, 0xbd, 0xeb, 0xb4, 0xc3, 0x3d, 0xf0, 0x23, 0x08, 0x3d,
- 0x6e, 0xa6, 0x1f, 0xbf, 0xd0, 0x36, 0x93, 0x3d, 0xf2, 0xe9, 0x57, 0x3e,
- 0x51, 0xa4, 0x7f, 0x3c, 0x9d, 0x6e, 0x88, 0xbe, 0x83, 0xa2, 0xbe, 0xbd,
- 0x90, 0x28, 0x62, 0xbd, 0x14, 0x16, 0xef, 0xbc, 0xcf, 0x6a, 0x0c, 0x3f,
- 0x5e, 0xb1, 0xef, 0x3e, 0x39, 0xd8, 0x38, 0x3e, 0xe1, 0x1e, 0xd8, 0x3e,
- 0x6c, 0x4e, 0x0c, 0xbe, 0x83, 0x09, 0x9d, 0xbe, 0x85, 0xbb, 0xf0, 0xbd,
- 0xa3, 0xfe, 0x57, 0xbd, 0x0b, 0x6b, 0x3a, 0xbe, 0xac, 0xed, 0x5c, 0xbe,
- 0x4b, 0xc7, 0xa8, 0xbd, 0x7f, 0x66, 0xac, 0xbd, 0xad, 0x9c, 0x93, 0x3e,
- 0xb5, 0x30, 0x70, 0x3d, 0x02, 0x26, 0x50, 0xbe, 0x59, 0x3e, 0xb2, 0xbc,
- 0x2d, 0x85, 0x22, 0xbd, 0xa9, 0x57, 0x4c, 0xbe, 0x15, 0xfd, 0x9f, 0xbd,
- 0x5f, 0xe8, 0x0d, 0x3e, 0xb8, 0x02, 0x94, 0x3e, 0x05, 0x5e, 0xc1, 0xbd,
- 0xcf, 0x40, 0x04, 0xbe, 0x65, 0x4b, 0x54, 0xbf, 0x11, 0xd0, 0x8f, 0x3e,
- 0xb3, 0x0f, 0x00, 0x3e, 0x27, 0x9f, 0xcb, 0xbd, 0x74, 0x4c, 0xa0, 0xbd,
- 0x56, 0x27, 0xb0, 0x3e, 0xce, 0x60, 0xd1, 0xbd, 0xaa, 0xd1, 0x92, 0xbe,
- 0xdf, 0x82, 0x5e, 0xbb, 0x6a, 0x5f, 0xfd, 0xb9, 0x53, 0xd3, 0x6c, 0xbe,
- 0xa7, 0xb8, 0x08, 0xbe, 0xb9, 0x96, 0x0a, 0x3d, 0x9e, 0x37, 0xed, 0xbd,
- 0x82, 0x8e, 0x30, 0xbe, 0x2c, 0xd3, 0x34, 0x3d, 0x60, 0x5a, 0xd0, 0x3d,
- 0xf4, 0xa5, 0x1c, 0xbe, 0x8f, 0x00, 0x38, 0xbd, 0x44, 0xdd, 0x4c, 0xbd,
- 0x16, 0x4c, 0x48, 0xbd, 0xb2, 0x7f, 0x0b, 0x3f, 0x72, 0xdd, 0xd2, 0x3d,
- 0x93, 0x0f, 0x5c, 0x3d, 0xfb, 0x7b, 0x85, 0xbd, 0x60, 0xf0, 0xcb, 0x3e,
- 0xbc, 0x0c, 0xa1, 0xbd, 0xc6, 0xf4, 0xef, 0xbd, 0xc0, 0x15, 0x37, 0xbe,
- 0x78, 0x98, 0xb8, 0xbd, 0xb0, 0x2d, 0xe3, 0xbe, 0x1a, 0x0a, 0x26, 0xbf,
- 0x8c, 0x33, 0x7d, 0xbe, 0xff, 0x25, 0xce, 0xbd, 0xac, 0x89, 0x12, 0xbf,
- 0x42, 0x10, 0xa8, 0xbd, 0x1d, 0xd6, 0x9c, 0xbe, 0xa5, 0x1e, 0x80, 0x3e,
- 0x9d, 0xce, 0xf0, 0xbd, 0x52, 0xb6, 0x41, 0x3e, 0xeb, 0x19, 0xa8, 0xbe,
- 0x80, 0xaf, 0x5f, 0x3e, 0x65, 0x46, 0xdf, 0xbd, 0x36, 0x4a, 0x0a, 0xbf,
- 0xda, 0xcf, 0x4e, 0xbe, 0xb3, 0xcf, 0xe9, 0x3c, 0xc0, 0xc9, 0x80, 0x3c,
- 0x1a, 0x66, 0x8c, 0xbe, 0xd7, 0xb0, 0xfd, 0xbd, 0x9d, 0xaa, 0x2c, 0x3e,
- 0x10, 0x89, 0x81, 0x3d, 0xa0, 0x8d, 0x1c, 0xbf, 0xe2, 0x2f, 0xeb, 0x3e,
- 0x9e, 0x61, 0x8f, 0xbf, 0x9d, 0x32, 0x1a, 0xbe, 0xba, 0x6f, 0x1c, 0x3f,
- 0x44, 0xe6, 0xdb, 0x3e, 0xa1, 0xb2, 0x9f, 0x3e, 0x3e, 0x84, 0x14, 0x3e,
- 0x5b, 0xb1, 0xe3, 0xbe, 0x3b, 0x3f, 0x92, 0x3f, 0xe0, 0x9d, 0x41, 0x3f,
- 0x40, 0x30, 0xb7, 0x3e, 0xcb, 0xe7, 0xc4, 0xbd, 0x03, 0xbb, 0x71, 0xbe,
- 0x03, 0x2a, 0xc4, 0xbe, 0xc5, 0x14, 0x35, 0x3f, 0x73, 0xd3, 0x7d, 0xbf,
- 0xd1, 0xe4, 0xa8, 0xbf, 0xdb, 0xc2, 0xb8, 0x3d, 0xfb, 0xc1, 0xc1, 0xbe,
- 0x34, 0xd6, 0x7b, 0xbf, 0xe3, 0xba, 0xe7, 0xbe, 0xd1, 0x8e, 0x9d, 0xbe,
- 0x94, 0x8a, 0xaf, 0xbf, 0x90, 0xfb, 0x29, 0x3e, 0xff, 0x5b, 0x37, 0xbe,
- 0x12, 0x7a, 0x01, 0x3f, 0xa3, 0x2d, 0x88, 0x3d, 0x58, 0x51, 0xb9, 0x3e,
- 0xc7, 0x64, 0xe0, 0xbe, 0x94, 0xb5, 0xb2, 0xbe, 0x1a, 0xa6, 0x95, 0x3d,
- 0xbe, 0x4e, 0xd7, 0x3f, 0x27, 0xf7, 0x82, 0xbd, 0x06, 0xa5, 0xff, 0x3e,
- 0xcd, 0x09, 0x5d, 0xbe, 0xae, 0x8f, 0x0b, 0xbf, 0x05, 0x63, 0x94, 0x3e,
- 0xb5, 0xb8, 0x83, 0xbe, 0x75, 0xa7, 0x01, 0x3c, 0xad, 0xa4, 0xf9, 0x3d,
- 0xb3, 0x05, 0xe6, 0x3e, 0x0a, 0xb8, 0xad, 0xbe, 0xee, 0x2d, 0x03, 0x3e,
- 0x44, 0xff, 0xee, 0xbd, 0x8e, 0x53, 0x3c, 0xbf, 0x5c, 0xd4, 0xc8, 0xbb,
- 0x5f, 0xd3, 0xfd, 0xbe, 0xc5, 0x7e, 0x3b, 0xbf, 0x20, 0xf9, 0x2f, 0xbf,
- 0x33, 0xd5, 0x8f, 0xbe, 0x3f, 0x61, 0xce, 0xbe, 0x93, 0xd0, 0xa8, 0xbe,
- 0x2a, 0x57, 0x3d, 0xbd, 0xcd, 0xec, 0x91, 0xbf, 0xe1, 0x3b, 0x9e, 0x3f,
- 0x2c, 0x55, 0x6b, 0x3f, 0xfc, 0xdb, 0x43, 0xbd, 0xf2, 0x71, 0xae, 0xbe,
- 0x5c, 0x3c, 0x3f, 0x3d, 0x6e, 0xef, 0x67, 0xbf, 0x44, 0xa6, 0x5b, 0x3e,
- 0x52, 0xb9, 0x0a, 0xbf, 0x91, 0x1d, 0xeb, 0xbe, 0x7e, 0x2f, 0xd9, 0x3c,
- 0x20, 0x9a, 0x8d, 0x3d, 0xfb, 0x06, 0x79, 0xbe, 0x76, 0xd5, 0x0a, 0x3f,
- 0x91, 0xa5, 0x7f, 0xbe, 0x4d, 0xd2, 0xad, 0xbe, 0x8b, 0x3e, 0xb0, 0xbf,
- 0x40, 0x50, 0x9b, 0xbf, 0xca, 0x49, 0x49, 0xbd, 0x38, 0xf5, 0x7b, 0xbf,
- 0xa9, 0x61, 0x82, 0x3f, 0x11, 0xc3, 0x37, 0xbf, 0xf9, 0x92, 0xe1, 0x3e,
- 0x26, 0x23, 0xb4, 0xbe, 0x2e, 0xbb, 0xc1, 0xbe, 0xff, 0xac, 0x59, 0x3d,
- 0xd5, 0xf0, 0xa8, 0xbd, 0x30, 0x79, 0x02, 0x3f, 0x4d, 0x16, 0x3d, 0xbe,
- 0xd1, 0xe8, 0x6e, 0xbe, 0x8b, 0x0b, 0x1f, 0x3d, 0xfb, 0x00, 0xb4, 0x3d,
- 0x68, 0xd1, 0x87, 0x3f, 0x41, 0x8a, 0x51, 0xbf, 0xbe, 0x66, 0xfe, 0xbe,
- 0x8f, 0x38, 0x9e, 0xbe, 0x06, 0x78, 0x81, 0x3f, 0xbb, 0x89, 0x57, 0xbf,
- 0x01, 0x99, 0x3c, 0xbf, 0x74, 0x5f, 0x28, 0x3f, 0x04, 0x2e, 0x62, 0x3e,
- 0x57, 0x34, 0xe9, 0x3d, 0xe0, 0x76, 0x91, 0x3f, 0xc7, 0x95, 0x8f, 0xbe,
- 0x58, 0x4d, 0x17, 0xbf, 0xcc, 0xbe, 0x02, 0x3e, 0xb2, 0x30, 0xe5, 0x3e,
- 0x39, 0xac, 0x75, 0x3f, 0x9a, 0x4e, 0x04, 0xbe, 0xe4, 0xde, 0xd5, 0xbd,
- 0xe2, 0x59, 0x46, 0xbe, 0x6e, 0xea, 0xad, 0x3d, 0x18, 0x22, 0xd3, 0xbe,
- 0x2d, 0x6e, 0xd7, 0x3e, 0x77, 0x9b, 0xc8, 0xbb, 0x04, 0x51, 0x93, 0x3e,
- 0x20, 0xed, 0x83, 0xbf, 0xd5, 0x21, 0x91, 0x3f, 0xdb, 0xd5, 0x89, 0xbd,
- 0x88, 0x95, 0x0e, 0xbe, 0x58, 0xdb, 0x54, 0xbe, 0xfc, 0xd2, 0x92, 0x3f,
- 0x62, 0xc5, 0x86, 0xbe, 0xc9, 0xc3, 0xb6, 0xbd, 0xbb, 0xbb, 0xc5, 0x3d,
- 0x02, 0xba, 0xdf, 0x3d, 0x86, 0x27, 0x8d, 0x3d, 0xf9, 0x48, 0xb6, 0xbd,
- 0x9e, 0x63, 0xc0, 0xbd, 0x47, 0x67, 0x2f, 0xbd, 0xdd, 0x0f, 0x58, 0xbe,
- 0xc2, 0xd5, 0x5e, 0x3e, 0x09, 0xbe, 0x36, 0x3d, 0x0a, 0x24, 0x85, 0x3e,
- 0x41, 0x1d, 0x0b, 0xbf, 0x94, 0xb4, 0x20, 0x3e, 0x44, 0x51, 0x9e, 0xbd,
- 0x16, 0xee, 0xe5, 0xbc, 0x0a, 0x8f, 0xc8, 0x3e, 0x41, 0x61, 0x43, 0x3e,
- 0x37, 0xd0, 0x4e, 0x3d, 0xf5, 0xc4, 0x7d, 0xbe, 0x5c, 0x06, 0xea, 0xbd,
- 0xc1, 0x6a, 0x2c, 0x3e, 0x20, 0x4e, 0xed, 0xbb, 0xa5, 0x58, 0xad, 0xbd,
- 0x57, 0x0d, 0x4c, 0x3d, 0x78, 0xb0, 0xd4, 0xbc, 0xdd, 0xc2, 0xd0, 0xbd,
- 0x80, 0xc4, 0x26, 0xbe, 0x21, 0xbc, 0xab, 0xbb, 0xe2, 0xeb, 0x93, 0x3e,
- 0x87, 0x0e, 0x22, 0xbe, 0x1b, 0xeb, 0xc5, 0x3e, 0x09, 0xbb, 0x5d, 0xbd,
- 0xdf, 0xa6, 0x78, 0x3c, 0x00, 0xc5, 0x00, 0xbe, 0x86, 0x47, 0xab, 0xbe,
- 0x9b, 0x26, 0x55, 0xbe, 0x14, 0x37, 0x95, 0xbd, 0x43, 0xf2, 0x31, 0x3e,
- 0x0b, 0x15, 0xf9, 0xbd, 0xb8, 0x44, 0x61, 0xbd, 0x8d, 0xc8, 0x8c, 0xbd,
- 0x21, 0x42, 0xc7, 0x3c, 0x2a, 0xc4, 0x2c, 0x3d, 0x7e, 0x82, 0x81, 0xbd,
- 0xbe, 0xba, 0x3e, 0xbe, 0x65, 0xff, 0x11, 0xbe, 0xde, 0xcb, 0x28, 0xbe,
- 0xb8, 0xea, 0x82, 0xbe, 0x8b, 0xac, 0x2f, 0x3e, 0x41, 0x47, 0xea, 0xbd,
- 0xce, 0x0a, 0x4a, 0xbe, 0xc6, 0x56, 0xc9, 0xbd, 0x2b, 0xfe, 0x25, 0x3e,
- 0x79, 0xd2, 0xf8, 0xbd, 0x26, 0x1d, 0x28, 0xbe, 0x43, 0xf7, 0x28, 0xbe,
- 0x15, 0xf6, 0x41, 0x3d, 0xcc, 0x30, 0x11, 0x3e, 0xba, 0x6d, 0x54, 0xbc,
- 0x67, 0x34, 0x5d, 0xbd, 0x98, 0x3b, 0x66, 0x3d, 0xd2, 0x04, 0x38, 0x3e,
- 0x4f, 0xef, 0x85, 0xbd, 0x86, 0x6f, 0x09, 0x3d, 0xe1, 0x71, 0x56, 0x3d,
- 0x03, 0x08, 0x4e, 0xbd, 0x6b, 0x08, 0x82, 0x3d, 0xc4, 0xe8, 0x7a, 0xbe,
- 0xb8, 0x94, 0x9e, 0x3d, 0xd7, 0x93, 0x8a, 0xbb, 0xc5, 0xf3, 0xf0, 0xbd,
- 0x59, 0xe6, 0xd9, 0x3c, 0x7c, 0x3a, 0x0e, 0xbe, 0x40, 0xd3, 0x4e, 0x3d,
- 0x8c, 0x16, 0x12, 0x3d, 0x2f, 0x7a, 0x1e, 0xba, 0xff, 0x0a, 0xf5, 0x3d,
- 0x5a, 0x7b, 0xb8, 0xbd, 0x2c, 0xc6, 0xa4, 0xbd, 0x35, 0x19, 0x7e, 0xbd,
- 0xb6, 0xc8, 0x65, 0xbe, 0x04, 0xe7, 0x6b, 0x3c, 0xc9, 0x21, 0x0f, 0x3e,
- 0x04, 0xca, 0x5d, 0x3d, 0xa7, 0xef, 0xbc, 0xbc, 0x19, 0xec, 0x52, 0x3e,
- 0x2b, 0x21, 0x24, 0xbe, 0x0d, 0x92, 0xa3, 0x3d, 0x78, 0x77, 0x89, 0x3d,
- 0x98, 0x86, 0xbd, 0xbd, 0xf9, 0x28, 0x5f, 0x3d, 0x2f, 0x12, 0xe3, 0xbc,
- 0xe9, 0xf7, 0x03, 0xbe, 0x14, 0xf3, 0x36, 0x3e, 0x9f, 0x58, 0xb8, 0xbe,
- 0x90, 0x06, 0x4e, 0x3c, 0x9d, 0x95, 0xd9, 0x3d, 0xd7, 0xdf, 0x13, 0xbd,
- 0xe4, 0xef, 0x05, 0x3e, 0xd1, 0x1a, 0x46, 0x3c, 0xa6, 0x60, 0x7b, 0x3c,
- 0x37, 0x8a, 0xb2, 0x3e, 0xa8, 0x1e, 0x5a, 0xbe, 0xeb, 0xb0, 0xc4, 0xbd,
- 0x18, 0x0f, 0xa7, 0xbe, 0x30, 0x65, 0xf9, 0xbd, 0xc0, 0x24, 0x74, 0x3e,
- 0x7f, 0x4b, 0xac, 0xbd, 0x40, 0x72, 0x97, 0xbc, 0x77, 0x7a, 0x04, 0x3e,
- 0x22, 0x9b, 0xdf, 0x3d, 0xad, 0x20, 0x23, 0x3c, 0x16, 0xe1, 0x26, 0xbd,
- 0x09, 0x2d, 0x37, 0xbe, 0xbe, 0x37, 0x52, 0xbe, 0x12, 0x05, 0xa8, 0xbd,
- 0x36, 0xdf, 0x86, 0xbe, 0x1d, 0xfe, 0xb6, 0x3f, 0xc1, 0x85, 0xb5, 0x3d,
- 0x9a, 0x3e, 0x97, 0x3f, 0x60, 0xd3, 0x37, 0x3e, 0x13, 0x33, 0x32, 0x3f,
- 0x54, 0xa5, 0xd1, 0x3e, 0x34, 0x1f, 0x79, 0x3e, 0x73, 0x48, 0x16, 0xbf,
- 0x43, 0x33, 0x96, 0xbf, 0x2e, 0xa5, 0x06, 0x3f, 0xfe, 0xd8, 0x46, 0xbe,
- 0xbd, 0x5e, 0x5f, 0x3c, 0x28, 0xe6, 0xa0, 0xbd, 0x59, 0x52, 0x2d, 0xbf,
- 0x3f, 0x14, 0x9c, 0xbe, 0x25, 0x05, 0xf7, 0xbd, 0x3c, 0x9c, 0xc1, 0xbe,
- 0x5b, 0xa4, 0x39, 0xbf, 0xfe, 0x8e, 0xc6, 0xbc, 0x46, 0xe1, 0xf2, 0x3e,
- 0x30, 0x0e, 0x3d, 0x3f, 0x5b, 0x3c, 0xe8, 0xbe, 0x3c, 0xde, 0x92, 0xbe,
- 0xc6, 0xc1, 0xa5, 0xbe, 0x47, 0xd8, 0xe9, 0x3e, 0x92, 0x46, 0x42, 0xbe,
- 0x53, 0xc8, 0x96, 0xbf, 0x1c, 0x95, 0xac, 0xbd, 0xbc, 0xfc, 0x82, 0xbd,
- 0xc5, 0xe1, 0x21, 0x3f, 0xd8, 0x8d, 0x28, 0xbf, 0x7e, 0xd8, 0x8a, 0xbc,
- 0x07, 0x3e, 0xb3, 0x3e, 0x44, 0x07, 0x98, 0x3d, 0xc0, 0x9f, 0x4a, 0xbd,
- 0x30, 0x81, 0x77, 0x3e, 0x11, 0xc5, 0x10, 0xbf, 0x5f, 0xdf, 0xa0, 0x3e,
- 0x8c, 0x59, 0xfc, 0xbe, 0xf7, 0x3b, 0x7f, 0xbe, 0x43, 0x19, 0x3e, 0xbd,
- 0x59, 0x50, 0xcf, 0x3d, 0xb9, 0xac, 0x21, 0xbe, 0x49, 0x15, 0x8b, 0x3f,
- 0x10, 0x18, 0x93, 0xbe, 0xd7, 0x82, 0x59, 0xbe, 0x43, 0x5f, 0x04, 0x3e,
- 0xc5, 0x81, 0x8b, 0x3d, 0xe5, 0xa7, 0x88, 0xbd, 0x7d, 0xe8, 0xff, 0x3e,
- 0x41, 0x49, 0x07, 0xbd, 0x2e, 0x19, 0x45, 0x3f, 0x09, 0x03, 0x87, 0xbc,
- 0x78, 0xbd, 0xc0, 0xbd, 0xa4, 0xb9, 0xbb, 0xbe, 0x17, 0xbf, 0x99, 0xbd,
- 0xef, 0xde, 0x61, 0x3e, 0x51, 0xc3, 0x47, 0xbf, 0x64, 0xb8, 0xa5, 0x3e,
- 0xd2, 0x02, 0xfe, 0x3e, 0xf0, 0x6c, 0x07, 0xbd, 0x01, 0x87, 0x08, 0x3d,
- 0x99, 0x3e, 0x37, 0xbf, 0x5e, 0x73, 0x0e, 0xbd, 0x34, 0x49, 0x1c, 0xbd,
- 0x59, 0xda, 0x22, 0xbd, 0x39, 0xeb, 0xd8, 0x3e, 0xd9, 0xab, 0x0a, 0xbf,
- 0xcd, 0x02, 0xb8, 0x3e, 0x28, 0x75, 0xda, 0x3c, 0xe8, 0xf4, 0x8b, 0x3e,
- 0x23, 0xed, 0x0f, 0xbf, 0x81, 0x2c, 0x77, 0xbe, 0xd8, 0x34, 0x09, 0xbf,
- 0x2f, 0xba, 0x44, 0x3e, 0xcd, 0x03, 0x8d, 0x3f, 0x13, 0x74, 0x2a, 0xbf,
- 0x9c, 0xcb, 0x53, 0xbf, 0xa1, 0xf9, 0xc4, 0x3d, 0x8a, 0x7d, 0x76, 0xbb,
- 0x71, 0xbb, 0xb9, 0xbe, 0x46, 0x63, 0x01, 0x3f, 0x5d, 0xd3, 0xd5, 0xbe,
- 0x27, 0xa6, 0x03, 0xbd, 0x94, 0xca, 0x15, 0x3f, 0x20, 0x8b, 0x03, 0x3d,
- 0xcf, 0x19, 0x18, 0xbd, 0x89, 0x74, 0x67, 0xbd, 0x5e, 0x9f, 0x05, 0xbd,
- 0x43, 0x45, 0x63, 0x3f, 0xfb, 0x33, 0xc4, 0xbe, 0xda, 0xfc, 0x80, 0xbe,
- 0xa8, 0x57, 0x84, 0x3e, 0x86, 0x23, 0x96, 0x3e, 0xbc, 0xdb, 0x9e, 0x3b,
- 0x3f, 0x41, 0x06, 0x3f, 0x65, 0x4f, 0x00, 0xbf, 0xed, 0x7c, 0x57, 0x3f,
- 0x1c, 0x95, 0x43, 0xbf, 0x01, 0xef, 0xcc, 0xbe, 0xc6, 0xd7, 0xae, 0xbe,
- 0xab, 0xc4, 0x8b, 0x3e, 0xc1, 0x50, 0x31, 0xbe, 0x8f, 0xe8, 0x2c, 0xbf,
- 0x21, 0x47, 0x7d, 0xbe, 0x77, 0x30, 0xd4, 0x3e, 0xa7, 0x04, 0x19, 0x3f,
- 0x81, 0x56, 0x9f, 0x3e, 0x47, 0xa6, 0x0e, 0xbe, 0x95, 0x2c, 0xc3, 0x3c,
- 0x03, 0xc2, 0x57, 0x3f, 0x69, 0xab, 0xcc, 0xbd, 0x5d, 0xc8, 0x11, 0x3d,
- 0xf6, 0xea, 0x9b, 0xbe, 0x28, 0x0c, 0xd2, 0x3d, 0x78, 0xf2, 0x69, 0xbe,
- 0x4c, 0x29, 0x0e, 0xbe, 0x80, 0x9b, 0x25, 0x3d, 0x49, 0xe3, 0x95, 0xbd,
- 0x4a, 0x5a, 0xbd, 0xbe, 0x55, 0xc1, 0x5c, 0x3d, 0x26, 0x02, 0xbd, 0xbe,
- 0xd5, 0xd0, 0xd1, 0x3e, 0xe9, 0x17, 0xcd, 0x3d, 0xe7, 0x16, 0x79, 0x3e,
- 0x5d, 0xc5, 0x25, 0x3d, 0x03, 0xbd, 0x83, 0xbe, 0x29, 0xfe, 0xce, 0x3c,
- 0x5e, 0x49, 0x50, 0x3b, 0x5f, 0x7a, 0xd4, 0x3d, 0x0c, 0x51, 0x88, 0x3d,
- 0x1d, 0x95, 0x23, 0x3e, 0x91, 0xa0, 0x49, 0xbd, 0x00, 0xb5, 0xd7, 0xbd,
- 0x17, 0x99, 0xc2, 0x3e, 0xd5, 0x3a, 0xf9, 0xbc, 0xfc, 0xef, 0x7b, 0xbe,
- 0x2f, 0x7c, 0x31, 0xbe, 0xb1, 0x4a, 0x35, 0x3d, 0x01, 0xd1, 0x62, 0x3e,
- 0x8b, 0x49, 0xe5, 0x3c, 0x9f, 0xf2, 0xd2, 0xbe, 0x5c, 0xd9, 0xfd, 0xbd,
- 0xa7, 0xcc, 0x96, 0x3d, 0xab, 0xf0, 0x73, 0xbd, 0x7a, 0x94, 0x73, 0xbd,
- 0xf4, 0xfb, 0xf7, 0xbd, 0x4d, 0xf7, 0x08, 0xbe, 0x90, 0x9e, 0x9b, 0xbd,
- 0x75, 0x52, 0x25, 0x3e, 0x98, 0x63, 0xdd, 0xbd, 0x89, 0x0e, 0xf9, 0xbb,
- 0xdb, 0x02, 0xa1, 0xbe, 0xa9, 0x36, 0x73, 0x3d, 0x94, 0xff, 0xbb, 0xbd,
- 0x3c, 0xc8, 0x66, 0x3e, 0x18, 0xb9, 0x4a, 0xbe, 0x9e, 0x06, 0x5c, 0xbd,
- 0x06, 0xc6, 0xe0, 0xbd, 0x44, 0xe7, 0x09, 0x3d, 0xbb, 0x20, 0x36, 0x3e,
- 0xc9, 0x2a, 0x08, 0x3e, 0x6d, 0xbd, 0xf0, 0xbc, 0x49, 0xbe, 0x49, 0x3e,
- 0xab, 0x38, 0x18, 0xbc, 0xc7, 0x7a, 0xcb, 0x3d, 0x6b, 0x7f, 0x00, 0x3e,
- 0x2d, 0x4d, 0x54, 0xbc, 0x1f, 0x1e, 0xab, 0x3e, 0xa5, 0xa7, 0x87, 0xbe,
- 0x70, 0x62, 0xf6, 0xbc, 0xdd, 0xc7, 0x89, 0xbe, 0xe2, 0xe1, 0xbe, 0xbc,
- 0xaa, 0x37, 0xdd, 0x3e, 0xb2, 0x16, 0xf1, 0x3e, 0x05, 0xb0, 0xbf, 0xbc,
- 0xf9, 0xc5, 0xeb, 0x3b, 0x91, 0x8b, 0x47, 0xbb, 0x10, 0x6d, 0x8d, 0x3d,
- 0x74, 0x32, 0xe6, 0x3e, 0xeb, 0x2d, 0x2c, 0x3d, 0xcc, 0x60, 0xca, 0xbc,
- 0xe4, 0xa3, 0x03, 0xbd, 0x7b, 0x05, 0xe0, 0x3d, 0x33, 0x4c, 0xae, 0xbe,
- 0x9e, 0xc3, 0xf1, 0x3c, 0x31, 0xb9, 0xf9, 0x3d, 0x6b, 0x2a, 0x0b, 0x3e,
- 0xff, 0x8b, 0x70, 0xbe, 0xfb, 0x4e, 0xc3, 0xbd, 0x02, 0xfb, 0xf6, 0x3d,
- 0x96, 0x1f, 0x0d, 0xbd, 0x96, 0x1e, 0xbe, 0xbd, 0x90, 0x00, 0x4f, 0xbe,
- 0x89, 0x88, 0x52, 0x3d, 0x6c, 0x69, 0x4e, 0xbe, 0x00, 0x48, 0xc5, 0xbc,
- 0xbf, 0x8a, 0xaa, 0xbe, 0x91, 0xa7, 0x95, 0xbe, 0xc3, 0x2c, 0x21, 0xbd,
- 0x4a, 0x80, 0x0f, 0x3d, 0x10, 0x1b, 0x91, 0xbc, 0x1d, 0xd5, 0x4d, 0x3e,
- 0x79, 0x57, 0x0b, 0xbe, 0xbf, 0x3c, 0xb7, 0x3d, 0x7d, 0xd0, 0xaf, 0xba,
- 0xae, 0x6b, 0xd6, 0xbe, 0x61, 0xff, 0xde, 0xbd, 0x5b, 0x43, 0x38, 0x3e,
- 0x37, 0x6b, 0x8f, 0xbc, 0x13, 0x7f, 0xa5, 0xbe, 0x9f, 0x62, 0x32, 0xbe,
- 0x75, 0x1c, 0x85, 0xbe, 0x59, 0xa1, 0xf5, 0xbd, 0xa0, 0x0f, 0x77, 0xbd,
- 0x9e, 0x32, 0xad, 0x3e, 0x4b, 0x76, 0x70, 0x3d, 0x2d, 0x65, 0x6f, 0x3d,
- 0xde, 0xbb, 0xbc, 0xbc, 0xe7, 0x5e, 0x33, 0xbe, 0x93, 0x95, 0x02, 0x3e,
- 0xb1, 0xef, 0x68, 0xbe, 0x76, 0x16, 0x5d, 0x3d, 0xa5, 0x60, 0xa4, 0xbe,
- 0x6f, 0xdf, 0x10, 0x3e, 0xd0, 0x08, 0xe3, 0x3d, 0xa8, 0xc3, 0x28, 0xbe,
- 0x53, 0xe4, 0xe5, 0xbe, 0xe6, 0x2e, 0xc0, 0xbd, 0xf8, 0x8e, 0xf1, 0xbd,
- 0x14, 0x4e, 0x35, 0xbe, 0xd9, 0xb3, 0xa3, 0xbd, 0xd1, 0x40, 0xf5, 0xbd,
- 0xff, 0x69, 0x2b, 0x3e, 0xb3, 0xe9, 0x70, 0x3d, 0xb2, 0x15, 0x2e, 0xbe,
- 0x52, 0xd9, 0x21, 0xbe, 0x37, 0xd6, 0x13, 0xbe, 0xe1, 0x90, 0xde, 0x3e,
- 0xfa, 0xec, 0x94, 0xbe, 0x48, 0x83, 0x94, 0x3e, 0x1e, 0x5f, 0x9c, 0x3e,
- 0xcc, 0x4f, 0xcd, 0x3d, 0x7a, 0x22, 0xc1, 0xbe, 0x84, 0x8f, 0x79, 0x3d,
- 0x55, 0x4f, 0x21, 0x3e, 0x99, 0x78, 0xd5, 0x3d, 0x7e, 0xbe, 0x62, 0x3e,
- 0x47, 0xa3, 0xf6, 0xbe, 0x63, 0x74, 0x19, 0xbe, 0xe1, 0x4e, 0xd3, 0x3e,
- 0xa1, 0xe6, 0x67, 0xbe, 0x1c, 0x50, 0x68, 0xbd, 0xae, 0x34, 0xb4, 0x3c,
- 0x85, 0x4a, 0x6e, 0xbd, 0xaf, 0x0e, 0x0f, 0x3e, 0x9f, 0xf7, 0xd6, 0x3e,
- 0xee, 0x20, 0xce, 0x3c, 0x44, 0x87, 0x2b, 0xbe, 0x21, 0x1c, 0x29, 0x3d,
- 0x1a, 0x22, 0xb7, 0x3d, 0xce, 0x14, 0x98, 0xbd, 0xb4, 0x0f, 0x0f, 0xbe,
- 0xcb, 0x9a, 0xc1, 0xbd, 0x9d, 0xf4, 0x1b, 0x3e, 0x66, 0x1b, 0x05, 0x3d,
- 0xc7, 0xef, 0x8e, 0x3d, 0x37, 0x8a, 0x66, 0x3e, 0xb9, 0xd3, 0x2f, 0xbd,
- 0x65, 0x79, 0xd0, 0xbe, 0xcd, 0xfa, 0x15, 0xbe, 0x51, 0x96, 0x42, 0xbd,
- 0x9a, 0xbd, 0x2d, 0xbd, 0xcc, 0x27, 0xe1, 0xbe, 0x88, 0x77, 0x08, 0xbe,
- 0x4c, 0xa0, 0x61, 0xbd, 0xda, 0x47, 0x9b, 0xbe, 0xdc, 0x36, 0x18, 0x3f,
- 0x10, 0x7f, 0xc7, 0x3e, 0x4c, 0xc6, 0x91, 0x3d, 0xa2, 0x81, 0x67, 0x3e,
- 0x84, 0x5e, 0xc4, 0xbd, 0xa6, 0x16, 0xec, 0xbe, 0x99, 0xe5, 0xa3, 0xbd,
- 0x86, 0x23, 0xdd, 0xbd, 0x47, 0x99, 0x2d, 0xbe, 0x06, 0xf9, 0xa1, 0xbe,
- 0x2e, 0xe1, 0x57, 0xbd, 0xc8, 0x08, 0x1e, 0xbd, 0x8c, 0xa8, 0x8c, 0x3e,
- 0x6b, 0xc6, 0xd3, 0x3d, 0xae, 0x3c, 0x0a, 0x3d, 0x4b, 0xdd, 0xd0, 0xbc,
- 0x42, 0x73, 0x05, 0xbe, 0xf2, 0x0f, 0xa0, 0x3e, 0x10, 0xbf, 0x52, 0x3d,
- 0x93, 0xa9, 0xb3, 0x3e, 0x2c, 0xf7, 0x56, 0x3e, 0xaf, 0xa9, 0x47, 0xbe,
- 0x25, 0x72, 0xe6, 0xbd, 0x86, 0x21, 0x23, 0xbf, 0xc5, 0x64, 0x3a, 0xbe,
- 0x23, 0x6d, 0xc5, 0xbd, 0xe2, 0xcf, 0x70, 0x3d, 0xa9, 0xc1, 0x35, 0xbe,
- 0x00, 0xfe, 0x5b, 0x3e, 0x72, 0xe6, 0x9e, 0xbc, 0x86, 0x44, 0xf4, 0xb9,
- 0x8b, 0xc8, 0x4b, 0xbd, 0xe8, 0x39, 0x06, 0xbd, 0x7e, 0x56, 0x82, 0xbe,
- 0xd3, 0x5d, 0xa7, 0xbe, 0xd5, 0x62, 0xbd, 0x3c, 0xf5, 0x51, 0x9c, 0xbd,
- 0x71, 0xdf, 0xe7, 0xbd, 0x06, 0x59, 0xd0, 0x3d, 0xc8, 0xbc, 0x4b, 0x3d,
- 0x9f, 0xfc, 0x22, 0xbe, 0x46, 0x8f, 0x34, 0xbe, 0x03, 0xb9, 0xd7, 0xbb,
- 0x09, 0x8c, 0x48, 0xbe, 0x2d, 0x7a, 0xb6, 0x3e, 0x89, 0x31, 0x45, 0x3e,
- 0xb4, 0x5b, 0xfe, 0x3c, 0xa5, 0xab, 0x0b, 0x3e, 0x16, 0x3d, 0xa6, 0x3e,
- 0x5b, 0x12, 0xb4, 0xbe, 0xe7, 0xc1, 0x4d, 0x3e, 0xfc, 0x78, 0x24, 0xbe,
- 0x0c, 0x4b, 0xd8, 0x3d, 0x76, 0xe7, 0x8b, 0xbe, 0xe0, 0x05, 0xd1, 0xbe,
- 0x20, 0xfd, 0x33, 0x3e, 0x92, 0xb3, 0xbe, 0x3d, 0xb7, 0xfe, 0xc0, 0xbe,
- 0xaf, 0x4a, 0xfe, 0xbd, 0x9e, 0x33, 0x9e, 0xbe, 0x8f, 0xa7, 0x5e, 0x3e,
- 0xe0, 0x45, 0x98, 0xbe, 0x10, 0xdf, 0x05, 0x3e, 0x1d, 0xba, 0xbe, 0xbe,
- 0x15, 0x76, 0xa3, 0xbd, 0xd6, 0x11, 0x77, 0x3d, 0xd6, 0x25, 0xbc, 0xbe,
- 0x85, 0x61, 0x10, 0xbe, 0x1e, 0xfd, 0x84, 0xbe, 0x33, 0x43, 0x8c, 0xbd,
- 0xad, 0xdc, 0x30, 0xbe, 0x13, 0x39, 0x10, 0xbe, 0xa6, 0xab, 0xad, 0xbd,
- 0xf0, 0xfa, 0x0b, 0xbf, 0xc5, 0xb1, 0xc5, 0x3e, 0xb4, 0x6b, 0xa7, 0x3e,
- 0xd4, 0xed, 0xa4, 0xbf, 0x39, 0x01, 0x37, 0xbe, 0x8c, 0x57, 0x85, 0x3f,
- 0x52, 0x58, 0x83, 0xbf, 0x07, 0x90, 0x26, 0xbd, 0x2d, 0xc8, 0xd3, 0x3e,
- 0xb0, 0x90, 0xa7, 0xbe, 0x24, 0x71, 0x8b, 0x3e, 0x1f, 0xd6, 0x2f, 0x3f,
- 0x37, 0xcb, 0x89, 0x3e, 0xb0, 0xfc, 0xfe, 0x3e, 0x82, 0x13, 0x92, 0x3d,
- 0x6d, 0x01, 0x8a, 0x3e, 0xd1, 0x83, 0x8e, 0xbf, 0xaf, 0x98, 0x9b, 0xbd,
- 0x31, 0x12, 0xe1, 0xbe, 0xab, 0x8e, 0x02, 0xbf, 0xd8, 0x09, 0x8e, 0xbe,
- 0xa0, 0x78, 0x9e, 0xbf, 0xad, 0xf6, 0x2a, 0xbf, 0x31, 0x03, 0xa3, 0x3d,
- 0x47, 0xc3, 0xa6, 0x3e, 0x3c, 0x91, 0x2b, 0x3f, 0x89, 0xce, 0x34, 0x3f,
- 0xc5, 0xa6, 0xc8, 0xbd, 0x5e, 0x87, 0x2c, 0x3d, 0x8c, 0xb5, 0xcd, 0xbe,
- 0x6a, 0x2d, 0xcb, 0xbe, 0x43, 0x4a, 0xd5, 0xbe, 0xa6, 0x9b, 0x1a, 0xbe,
- 0x9b, 0x98, 0x79, 0x3f, 0x9b, 0xc8, 0x10, 0x3f, 0xd0, 0xdc, 0xca, 0xbe,
- 0x7c, 0x55, 0x46, 0xbe, 0x42, 0xf2, 0xa9, 0xbe, 0xc9, 0x05, 0x60, 0x3e,
- 0xfa, 0x72, 0x8b, 0x3f, 0x56, 0xaf, 0x9c, 0xbe, 0x96, 0x76, 0xf7, 0xbd,
- 0xec, 0x5e, 0xbd, 0x3e, 0x5a, 0xcf, 0x8d, 0xbe, 0x65, 0x36, 0xe1, 0x3d,
- 0xe1, 0x98, 0xa6, 0xbf, 0xae, 0x1d, 0x37, 0xbf, 0xd9, 0x2d, 0x07, 0x3f,
- 0xa0, 0xd5, 0x0a, 0xbf, 0x03, 0x70, 0x8f, 0xbf, 0x1b, 0x0f, 0x0b, 0xbf,
- 0x9c, 0xeb, 0xd6, 0xbe, 0x6c, 0xf7, 0x8a, 0xbd, 0x2f, 0x91, 0x4a, 0xbf,
- 0x5b, 0x75, 0x1f, 0xbe, 0xf6, 0x21, 0x4b, 0x3e, 0xeb, 0x03, 0x64, 0x3e,
- 0x98, 0xd2, 0xb6, 0x3e, 0xe7, 0x25, 0x41, 0xbd, 0xc6, 0xb6, 0x42, 0xbf,
- 0xf1, 0xe3, 0x1d, 0xbf, 0xa6, 0x29, 0xdc, 0x3d, 0x77, 0xaa, 0x0d, 0x3f,
- 0x35, 0xba, 0x12, 0xbf, 0xa3, 0xe2, 0x16, 0x3d, 0xb5, 0x0f, 0x07, 0xbe,
- 0x56, 0xe4, 0x79, 0x3d, 0x60, 0x4c, 0xc1, 0xbe, 0x5e, 0x34, 0x01, 0xbf,
- 0x79, 0x59, 0x90, 0xbf, 0x9b, 0x0e, 0x33, 0xbd, 0x80, 0x23, 0x0d, 0xbf,
- 0x53, 0x40, 0x18, 0x3e, 0xad, 0x35, 0xc2, 0xbd, 0x8f, 0x02, 0x66, 0xbd,
- 0xc2, 0xd2, 0xbc, 0xbd, 0xeb, 0x82, 0xd2, 0xbd, 0xcd, 0x85, 0xdd, 0x3f,
- 0x28, 0x62, 0xd3, 0xbe, 0xd8, 0xcc, 0x32, 0xbd, 0x62, 0xee, 0xa6, 0x3d,
- 0xb0, 0x1e, 0x7d, 0xbe, 0x1a, 0xc5, 0xcd, 0x3e, 0x72, 0x69, 0xcb, 0xbd,
- 0x05, 0x9a, 0x50, 0xbe, 0xf5, 0x63, 0x26, 0xbe, 0x06, 0x95, 0x2b, 0x3f,
- 0x4a, 0x69, 0x19, 0xbf, 0x10, 0x3e, 0x89, 0xbe, 0x81, 0x0e, 0xf8, 0xbe,
- 0x70, 0xcd, 0xbb, 0x3e, 0x0f, 0x21, 0x7d, 0x3f, 0xde, 0x6b, 0x6e, 0xbf,
- 0xa7, 0xef, 0x06, 0xbe, 0x0a, 0x99, 0x18, 0x3f, 0x99, 0x45, 0x7b, 0xbe,
- 0xa4, 0xda, 0xc1, 0xbe, 0x4c, 0x48, 0xc4, 0xbd, 0xad, 0x1e, 0x0d, 0x3f,
- 0x57, 0xb0, 0x55, 0xbd, 0x25, 0xaf, 0x5f, 0x3e, 0x11, 0x3d, 0x88, 0x3e,
- 0x82, 0x9a, 0x85, 0x3e, 0xa7, 0x65, 0xd3, 0x3a, 0xb8, 0xf9, 0x84, 0xbf,
- 0x7e, 0x8c, 0x4b, 0xbe, 0xa6, 0x87, 0x7f, 0x3f, 0x4c, 0x81, 0x30, 0xbf,
- 0xcc, 0x3d, 0x9e, 0xbe, 0x9e, 0xc3, 0xa6, 0x3a, 0x8d, 0x30, 0xc3, 0xbf,
- 0x8a, 0xb7, 0xc9, 0x3d, 0xef, 0x7c, 0x33, 0x3d, 0x4d, 0xa0, 0x64, 0xbd,
- 0x8d, 0xf3, 0x79, 0xbc, 0x64, 0x4b, 0xd5, 0x3c, 0x72, 0xa9, 0x3f, 0xbf,
- 0xad, 0x4f, 0x89, 0xbd, 0xe0, 0x61, 0xa8, 0xbd, 0x68, 0x41, 0x60, 0xbd,
- 0xfe, 0x2c, 0x47, 0x3c, 0x7b, 0x02, 0x25, 0xbe, 0x48, 0xc1, 0xec, 0x3d,
- 0xe9, 0xc5, 0x85, 0xbe, 0xea, 0xc9, 0xd2, 0x3d, 0x08, 0x59, 0xdc, 0xbd,
- 0x2a, 0xb3, 0x63, 0x3e, 0xe3, 0x01, 0xe0, 0x3d, 0xe9, 0xed, 0x9a, 0x3e,
- 0xaf, 0xee, 0xac, 0xbe, 0x49, 0x4d, 0x75, 0x3e, 0xb9, 0xba, 0xf2, 0xbd,
- 0xee, 0x0e, 0x45, 0xbd, 0x6a, 0x0c, 0xb5, 0x3e, 0x8c, 0x27, 0xcc, 0x3d,
- 0x80, 0x0a, 0xa4, 0x3d, 0x45, 0x05, 0x1a, 0xbe, 0x30, 0x03, 0x85, 0xbe,
- 0xed, 0x79, 0xa9, 0x3d, 0xd9, 0x0e, 0xc1, 0x3d, 0xa4, 0x72, 0xad, 0xbd,
- 0x8f, 0x0d, 0x7b, 0xbd, 0xde, 0xa9, 0x9c, 0xbb, 0xc9, 0x4e, 0x00, 0xbb,
- 0xdb, 0x2a, 0x1b, 0xbe, 0x1f, 0x0d, 0x28, 0xbe, 0xb3, 0x4c, 0xc3, 0x3b,
- 0xda, 0xa6, 0xe6, 0xbc, 0x71, 0x47, 0x0f, 0x3e, 0xe1, 0x1d, 0xe1, 0xbd,
- 0xad, 0x36, 0x95, 0x3e, 0x0c, 0x2b, 0xf7, 0xbd, 0x2d, 0x5b, 0xd3, 0xbe,
- 0x13, 0x7a, 0x68, 0xbe, 0xcb, 0x76, 0xea, 0xbc, 0xa5, 0x08, 0x92, 0x3e,
- 0x3d, 0x7b, 0xa1, 0xbd, 0x8e, 0x13, 0xdb, 0xbd, 0x27, 0x76, 0x08, 0xbd,
- 0x87, 0xe0, 0x8a, 0xbd, 0x61, 0x1a, 0xf7, 0x3d, 0x53, 0xad, 0xcf, 0xbd,
- 0xb7, 0xf9, 0x09, 0x3d, 0xcd, 0xb9, 0xbf, 0x3d, 0xdd, 0xb5, 0x61, 0xbe,
- 0xaf, 0x84, 0x63, 0xbe, 0x44, 0x54, 0xc4, 0x3d, 0xdc, 0x19, 0x11, 0xbe,
- 0x10, 0x88, 0x8d, 0xbe, 0xf9, 0x6e, 0x8f, 0xbe, 0xcc, 0x7a, 0x5c, 0x3e,
- 0x5b, 0x3e, 0xb3, 0x3c, 0x8f, 0xf3, 0x7e, 0x3d, 0x7f, 0xde, 0x88, 0xbd,
- 0x04, 0x81, 0x0d, 0xbe, 0xfd, 0x2b, 0xdb, 0x3d, 0xb3, 0xc8, 0xf3, 0x3d,
- 0x1e, 0x74, 0x85, 0xbe, 0xf5, 0xe0, 0x4e, 0x3e, 0x1c, 0xde, 0x69, 0xbc,
- 0xaf, 0xb9, 0x84, 0xbd, 0xa8, 0x76, 0x34, 0xbc, 0xb8, 0x8b, 0x24, 0xbe,
- 0xc1, 0x25, 0x52, 0xbe, 0xf7, 0x40, 0xfb, 0x3d, 0x46, 0x8b, 0x6b, 0xbe,
- 0x74, 0xfb, 0x8a, 0x3d, 0x19, 0x1b, 0xec, 0xbd, 0xfc, 0xd5, 0x36, 0xbd,
- 0xde, 0xc3, 0x0f, 0xbe, 0x9d, 0xe9, 0x15, 0x3c, 0x7a, 0x47, 0x15, 0xbc,
- 0xf1, 0x49, 0xfb, 0xbc, 0xad, 0xd7, 0x87, 0xbd, 0x5b, 0xd3, 0x0b, 0xbd,
- 0x9a, 0x20, 0x1f, 0xbe, 0x4a, 0x3f, 0x34, 0x3d, 0x97, 0xa3, 0xe6, 0x3d,
- 0x27, 0xc2, 0x95, 0xbd, 0xf3, 0xb4, 0xc1, 0xbc, 0x88, 0xe7, 0x07, 0x3e,
- 0x6c, 0x1e, 0x53, 0xbd, 0x14, 0x13, 0x32, 0xbe, 0xe0, 0x2c, 0x22, 0x3d,
- 0x14, 0x7d, 0xb0, 0xbd, 0xf6, 0x32, 0x60, 0x3e, 0x90, 0x51, 0x18, 0xbd,
- 0x29, 0x9a, 0xc2, 0xbd, 0xb1, 0x5d, 0xcb, 0x3d, 0x58, 0xf7, 0x2d, 0xbe,
- 0xe4, 0xbe, 0x18, 0xbe, 0x62, 0x15, 0xf8, 0x3d, 0x30, 0xbd, 0xb7, 0xbe,
- 0x51, 0x2f, 0x4e, 0xbe, 0x8e, 0xac, 0xf3, 0x3c, 0x9e, 0x2b, 0x9e, 0xbd,
- 0x43, 0x7a, 0xb9, 0x3d, 0x91, 0x49, 0xd7, 0x3d, 0x91, 0xbf, 0x91, 0x3d,
- 0x21, 0x03, 0x9a, 0x3d, 0x8b, 0xd4, 0xe3, 0xbd, 0xc7, 0xd6, 0x25, 0xbd,
- 0x63, 0x27, 0xa4, 0xbe, 0x20, 0x16, 0x0e, 0xbe, 0x84, 0x9c, 0x16, 0x3e,
- 0x76, 0xc2, 0xf3, 0x3d, 0x98, 0x70, 0xe1, 0xbc, 0x94, 0x45, 0x5d, 0x3e,
- 0xb7, 0x98, 0x19, 0x3e, 0xe0, 0xf7, 0x31, 0x3e, 0x85, 0xfb, 0x9b, 0xbe,
- 0xa1, 0x7b, 0xa7, 0xbd, 0xdf, 0x44, 0xf1, 0xbd, 0x30, 0x6e, 0x09, 0xbc,
- 0x5f, 0x21, 0xc0, 0xbe, 0xd1, 0x7d, 0xa5, 0x3f, 0x67, 0xb7, 0x2b, 0xbe,
- 0xb5, 0xb5, 0xa6, 0x3f, 0x72, 0xa9, 0x1a, 0x3e, 0xc3, 0x5d, 0x62, 0x3f,
- 0x66, 0x30, 0xea, 0x3e, 0xbe, 0x7f, 0x84, 0x3e, 0x7d, 0x90, 0x07, 0xbf,
- 0x32, 0xa6, 0x74, 0xbf, 0x71, 0xdd, 0x06, 0x3f, 0x7c, 0x7f, 0x38, 0xbe,
- 0xa6, 0xd3, 0x64, 0x3d, 0x2b, 0x9e, 0x66, 0x3d, 0x95, 0x46, 0x37, 0xbf,
- 0x98, 0xd6, 0xa0, 0xbd, 0x21, 0x1a, 0x6f, 0xbe, 0x12, 0x23, 0x05, 0xbf,
- 0x9e, 0xe3, 0x15, 0xbf, 0xc2, 0x17, 0xfe, 0x3c, 0xde, 0x55, 0xf7, 0x3e,
- 0xc0, 0x4b, 0x3b, 0x3f, 0xb9, 0xb6, 0x95, 0xbe, 0x6c, 0xdf, 0x93, 0xbe,
- 0xbb, 0x62, 0x3e, 0xbe, 0x7b, 0x4d, 0xb4, 0x3e, 0x4e, 0x28, 0x97, 0xbe,
- 0x87, 0x6e, 0xae, 0xbf, 0xd9, 0x42, 0x0a, 0xbe, 0xd4, 0x91, 0xaa, 0xbd,
- 0x55, 0x49, 0x1a, 0x3f, 0xac, 0xbe, 0x3f, 0xbf, 0x9e, 0xa6, 0xd6, 0xbd,
- 0x39, 0x6a, 0xba, 0x3e, 0x9e, 0xf8, 0xe5, 0x3c, 0x17, 0x31, 0xcb, 0xbd,
- 0xbd, 0x65, 0x5a, 0x3e, 0xb5, 0xcc, 0xcf, 0xbe, 0xaf, 0x36, 0xe9, 0x3e,
- 0x14, 0x2a, 0x18, 0xbf, 0xe4, 0x80, 0x2a, 0xbe, 0x4f, 0x90, 0xbd, 0xbd,
- 0xa3, 0xaa, 0x35, 0x3e, 0x40, 0xec, 0x27, 0xbe, 0x8b, 0x47, 0x8b, 0x3f,
- 0xb9, 0x47, 0x56, 0xbe, 0x0f, 0x87, 0x9f, 0xbd, 0x3c, 0x76, 0xf2, 0x3d,
- 0x1d, 0x60, 0x22, 0x3e, 0xb7, 0x98, 0x27, 0x3e, 0x2e, 0xab, 0x0b, 0x3f,
- 0xb5, 0x66, 0x19, 0xbe, 0x1a, 0x62, 0x6c, 0x3f, 0x93, 0x64, 0xae, 0xbc,
- 0xa8, 0x99, 0x8f, 0x3d, 0xda, 0xdb, 0x88, 0xbe, 0xf8, 0x39, 0x5d, 0xbd,
- 0x27, 0x96, 0x2a, 0x3e, 0xcb, 0x4b, 0x6d, 0xbf, 0x2e, 0x7a, 0xa3, 0x3e,
- 0x40, 0x0d, 0x9d, 0x3e, 0x8a, 0x7f, 0x27, 0xbd, 0xab, 0x12, 0x82, 0xbd,
- 0x9b, 0x3b, 0xff, 0xbe, 0xed, 0xbe, 0x08, 0xbe, 0x6a, 0x45, 0x09, 0xbd,
- 0x8d, 0x61, 0xb9, 0xbc, 0x16, 0x8c, 0x0f, 0x3f, 0xfb, 0x10, 0x14, 0xbf,
- 0x9b, 0xd1, 0xa6, 0x3e, 0xee, 0xe4, 0xe2, 0x3d, 0xd2, 0xd3, 0x45, 0x3c,
- 0x1f, 0x4a, 0x1a, 0xbf, 0x36, 0xef, 0x92, 0xbd, 0xe4, 0xb4, 0x45, 0xbf,
- 0x8c, 0x82, 0x9d, 0x3e, 0x79, 0x02, 0x95, 0x3f, 0x55, 0x01, 0x40, 0xbf,
- 0xca, 0x09, 0x41, 0xbf, 0xf1, 0x5e, 0xe6, 0x3d, 0x2e, 0xee, 0xc4, 0x3d,
- 0x2f, 0x3d, 0xac, 0xbe, 0xe6, 0x16, 0x0b, 0x3f, 0xe5, 0x9b, 0xac, 0xbe,
- 0xd2, 0xd2, 0x66, 0xbc, 0xa4, 0xa4, 0x14, 0x3f, 0xb3, 0xdf, 0x83, 0x3d,
- 0xf2, 0x58, 0xa3, 0x3d, 0xd9, 0x8f, 0xbc, 0x3d, 0x05, 0x98, 0x41, 0xbe,
- 0xe7, 0x92, 0x33, 0x3f, 0x59, 0x95, 0xbb, 0xbe, 0x44, 0x7f, 0x25, 0xbc,
- 0x0e, 0xde, 0x9b, 0x3d, 0x74, 0xc8, 0x94, 0x3e, 0x4c, 0x83, 0x53, 0x3d,
- 0x82, 0x23, 0x23, 0x3f, 0xf4, 0x8c, 0xc4, 0xbe, 0x89, 0xbc, 0x22, 0x3f,
- 0x9c, 0xb8, 0x47, 0xbf, 0xf1, 0x6e, 0xee, 0xbe, 0x24, 0x74, 0xa4, 0xbe,
- 0xb4, 0x8f, 0x38, 0x3e, 0x68, 0x07, 0xe2, 0xbd, 0x6b, 0xc5, 0x03, 0xbf,
- 0x9d, 0x65, 0x10, 0xbe, 0x29, 0x06, 0xbc, 0x3e, 0x2d, 0x94, 0x33, 0x3f,
- 0x7e, 0x7a, 0xd8, 0x3d, 0x91, 0xdf, 0x88, 0x3d, 0xb5, 0x72, 0x67, 0xbd,
- 0x0f, 0xa2, 0x71, 0x3f, 0x3a, 0xef, 0x60, 0x3d, 0x25, 0x11, 0x6c, 0x3d,
- 0xea, 0x9f, 0x8e, 0xbe, 0xdc, 0x7e, 0x54, 0x3e, 0x08, 0x82, 0x27, 0xbe,
- 0x72, 0x2b, 0x12, 0xbe, 0xaf, 0xc8, 0x45, 0x3e, 0x76, 0x23, 0x08, 0xbe,
- 0x11, 0xec, 0x7a, 0xbe, 0x5c, 0x3c, 0x34, 0xbd, 0x88, 0x6e, 0xa9, 0xbe,
- 0x3e, 0xe9, 0x11, 0x3f, 0x43, 0x66, 0x0b, 0xbe, 0xfd, 0x53, 0xd6, 0x3d,
- 0xe3, 0x08, 0xd0, 0xbd, 0xfe, 0xd6, 0x65, 0xbe, 0x2d, 0x9a, 0xd6, 0x3d,
- 0xac, 0x18, 0x0b, 0x3c, 0x64, 0x6b, 0x9e, 0xbe, 0x37, 0x14, 0x34, 0x3d,
- 0x17, 0x9c, 0x0b, 0xbd, 0xa8, 0x01, 0x16, 0xbe, 0x17, 0x69, 0xc8, 0xbe,
- 0xce, 0x49, 0x7e, 0x3e, 0x5c, 0xfe, 0x90, 0x3e, 0x37, 0x6e, 0xb7, 0xbe,
- 0xba, 0x82, 0x8b, 0xbe, 0x97, 0x72, 0x8a, 0x3d, 0xfa, 0x3b, 0x42, 0x3e,
- 0x80, 0x76, 0x5f, 0xbd, 0xc6, 0x4a, 0xae, 0xbe, 0x45, 0xc2, 0xb1, 0x3d,
- 0x44, 0xd2, 0xf1, 0xbd, 0x4f, 0x3c, 0x9e, 0xbd, 0x7f, 0xe2, 0xe7, 0x3d,
- 0x37, 0x27, 0xf8, 0xbd, 0x4f, 0x00, 0x01, 0xbd, 0xba, 0xdb, 0x0d, 0x3d,
- 0x67, 0xf1, 0xb3, 0xbe, 0x91, 0xa7, 0xe1, 0xbd, 0x35, 0x9e, 0x1d, 0xbc,
- 0xf8, 0x12, 0x0c, 0xbe, 0x84, 0x50, 0x2c, 0x3d, 0x09, 0xa9, 0x58, 0xbd,
- 0xca, 0x60, 0x2f, 0x3e, 0xbe, 0x82, 0x81, 0x3c, 0x25, 0x41, 0xf7, 0xbd,
- 0x07, 0xbd, 0x93, 0xbe, 0x84, 0x29, 0xc4, 0x3c, 0x33, 0x3b, 0x21, 0x3e,
- 0xca, 0x1b, 0x91, 0x3e, 0xf7, 0x84, 0x7e, 0xbd, 0x3e, 0xf7, 0x4d, 0x3e,
- 0x38, 0x93, 0x62, 0x3e, 0xcc, 0xb4, 0xdd, 0xba, 0x58, 0xfa, 0x16, 0x3e,
- 0x04, 0x76, 0x17, 0x3e, 0xd3, 0x0e, 0x9c, 0x3e, 0x87, 0x4d, 0xbd, 0xbe,
- 0xa2, 0xaf, 0x50, 0xbd, 0x8a, 0xba, 0x16, 0xbe, 0xdd, 0x3d, 0xd0, 0xbe,
- 0x96, 0xce, 0xcd, 0x3e, 0x3d, 0x93, 0x0b, 0x3f, 0xe6, 0x8e, 0xa9, 0xbe,
- 0x1e, 0x6f, 0x4e, 0xbd, 0x29, 0x0f, 0x87, 0x3e, 0x84, 0x84, 0xb5, 0x3e,
- 0x1c, 0xee, 0x88, 0x3e, 0x68, 0xd3, 0x99, 0xbe, 0xf9, 0xff, 0x91, 0x3c,
- 0x60, 0xf6, 0x4e, 0xbe, 0x6f, 0xe2, 0xe8, 0xbd, 0x2a, 0x75, 0x31, 0xbe,
- 0x60, 0x41, 0x0a, 0x3e, 0xfc, 0x98, 0xec, 0x3c, 0x9d, 0x18, 0x99, 0x3e,
- 0x88, 0xea, 0x1e, 0xbe, 0xf7, 0xbf, 0xfe, 0xbd, 0xf0, 0x6c, 0xfb, 0x3d,
- 0x6b, 0xb8, 0xa0, 0x3e, 0x7e, 0xf0, 0x2d, 0xbe, 0x01, 0x90, 0x9a, 0xbd,
- 0x59, 0x5b, 0xfa, 0xbc, 0xa8, 0x6d, 0x96, 0x3d, 0xf8, 0xb3, 0xb1, 0x3d,
- 0xdf, 0x24, 0xfd, 0xbd, 0x2b, 0xf2, 0x74, 0xbe, 0x7a, 0x0d, 0x2c, 0xbb,
- 0x57, 0x30, 0xc8, 0xbd, 0xed, 0xf3, 0x51, 0x3d, 0xbc, 0xe6, 0x80, 0x3d,
- 0x61, 0x3f, 0xaf, 0xbe, 0xe4, 0xd3, 0x08, 0xbe, 0x2b, 0x60, 0xe8, 0x3d,
- 0x5c, 0xdf, 0xd9, 0xbe, 0xcf, 0xf3, 0x09, 0x3e, 0x5c, 0x1d, 0x52, 0x3e,
- 0xe1, 0x0e, 0x72, 0x3b, 0xb4, 0xf3, 0x80, 0xbe, 0xe2, 0xc5, 0x02, 0xbe,
- 0x0a, 0x0d, 0x36, 0xbe, 0x3b, 0xcf, 0xab, 0xbe, 0x9d, 0xdc, 0x6b, 0x3e,
- 0x3c, 0xa0, 0x05, 0x3f, 0x62, 0x4f, 0x35, 0xbd, 0x9e, 0x78, 0xcd, 0x3d,
- 0x02, 0x2e, 0x3d, 0x3e, 0x12, 0x1f, 0x05, 0xbe, 0xa6, 0x64, 0x39, 0x3d,
- 0x65, 0xd6, 0xa2, 0xbe, 0x8d, 0xeb, 0x79, 0x3d, 0x3f, 0x57, 0x3a, 0xba,
- 0x51, 0x6a, 0x53, 0xbe, 0xf0, 0x7f, 0x1a, 0x3c, 0xb7, 0x3c, 0x56, 0x3d,
- 0xf8, 0x30, 0x0d, 0xbf, 0x75, 0x8d, 0xbc, 0xbe, 0xb8, 0xb1, 0x76, 0xbd,
- 0xde, 0x61, 0x72, 0xbe, 0x05, 0x6e, 0x20, 0x3d, 0xb2, 0x3d, 0x73, 0xbe,
- 0x71, 0xb7, 0x98, 0x3d, 0x26, 0x35, 0x08, 0x3e, 0xe7, 0x14, 0xf5, 0xbd,
- 0x99, 0xe0, 0x49, 0xbe, 0x34, 0xa2, 0x37, 0x3c, 0xc5, 0xe7, 0x81, 0x3e,
- 0xbd, 0x2b, 0x23, 0xbe, 0x25, 0x2a, 0xc0, 0x3e, 0x1b, 0xbd, 0xcc, 0x3e,
- 0x28, 0xab, 0x5a, 0x3e, 0x8e, 0x12, 0x17, 0xbf, 0x64, 0x72, 0x50, 0x3e,
- 0x58, 0x39, 0xc7, 0x3b, 0x31, 0x0c, 0x06, 0xbe, 0x2e, 0x1d, 0xa0, 0x3d,
- 0x04, 0xa7, 0x7c, 0xbe, 0x48, 0x12, 0xb1, 0xbe, 0xe9, 0x98, 0xfc, 0x3c,
- 0x3b, 0x02, 0x8a, 0xbe, 0x59, 0x1c, 0xa7, 0x3c, 0xc2, 0x92, 0x15, 0x3d,
- 0xf1, 0x14, 0x26, 0xbe, 0x35, 0x0b, 0x7a, 0x3d, 0x94, 0x9f, 0x22, 0x3e,
- 0x5f, 0xb3, 0xd6, 0xbc, 0x35, 0xf2, 0x4a, 0xbe, 0xb6, 0xb4, 0x98, 0x3c,
- 0x91, 0xd4, 0x23, 0x3e, 0x5e, 0xc3, 0x22, 0xbe, 0xc5, 0x23, 0x81, 0xbd,
- 0x0c, 0x2b, 0x4e, 0xbe, 0xf5, 0x36, 0x58, 0x3e, 0x1b, 0x78, 0x67, 0x3d,
- 0x99, 0xe0, 0x81, 0xbe, 0x67, 0xc5, 0xcd, 0x3c, 0xd1, 0xc2, 0x40, 0xbd,
- 0x99, 0x4a, 0x13, 0xbf, 0x2f, 0x59, 0xd4, 0x3d, 0x3a, 0xd7, 0x04, 0xbe,
- 0x5b, 0x72, 0x04, 0x3e, 0x25, 0xcb, 0x9b, 0xbe, 0xb8, 0xa6, 0xd6, 0x3d,
- 0x0a, 0xe5, 0x41, 0xbe, 0x50, 0x22, 0x0c, 0xbe, 0x44, 0x76, 0xd1, 0x3e,
- 0x80, 0x81, 0xc3, 0x3e, 0x71, 0xf0, 0x3c, 0x3e, 0x68, 0xe9, 0x67, 0x3d,
- 0xcf, 0xb6, 0x48, 0xbd, 0x53, 0x1d, 0xb0, 0xbe, 0xe5, 0xb6, 0xc3, 0xbd,
- 0xe0, 0x88, 0x69, 0x3e, 0x61, 0x05, 0xca, 0x3d, 0xb9, 0x85, 0x30, 0xbe,
- 0x4e, 0xa2, 0xc1, 0xbd, 0x32, 0x56, 0x1b, 0x3e, 0x4d, 0x4c, 0x1e, 0xbf,
- 0x16, 0xdc, 0xa9, 0xba, 0xdc, 0xd1, 0x57, 0xbe, 0xf2, 0x37, 0xff, 0xbd,
- 0xbd, 0x40, 0xfa, 0x3d, 0xd0, 0x67, 0x04, 0x3f, 0xfb, 0xd6, 0xcb, 0x3d,
- 0x0e, 0xfb, 0xc9, 0x3e, 0x48, 0xd0, 0xff, 0xbd, 0xcd, 0x8f, 0x8f, 0xbc,
- 0x3f, 0x33, 0x51, 0xbe, 0xb0, 0x18, 0xc3, 0xbe, 0xc3, 0x1d, 0x15, 0xbe,
- 0x4b, 0x3f, 0x4d, 0x3e, 0xa3, 0x3e, 0x55, 0x3d, 0x39, 0x5f, 0x03, 0xbe,
- 0x2c, 0x43, 0x11, 0xba, 0x10, 0xcd, 0xa0, 0xbb, 0x1b, 0x3b, 0xed, 0x3d,
- 0x7f, 0x33, 0xd7, 0x3d, 0x79, 0x9f, 0x1f, 0xbd, 0x75, 0x39, 0x96, 0xbe,
- 0x31, 0x0e, 0xe1, 0xbe, 0x0b, 0xc7, 0x44, 0xbe, 0x4c, 0x64, 0x10, 0xbe,
- 0x37, 0xa5, 0x2e, 0xbe, 0x8d, 0x45, 0x9b, 0xbe, 0xe6, 0x96, 0x86, 0xbd,
- 0xa1, 0x8e, 0x39, 0xbe, 0x7e, 0x86, 0x59, 0xbe, 0x8f, 0xad, 0x91, 0xbe,
- 0xff, 0x5f, 0xa0, 0xbe, 0x1e, 0x61, 0xbf, 0x3d, 0xe5, 0xa1, 0x70, 0x3c,
- 0x79, 0x43, 0x39, 0x3d, 0x80, 0x7d, 0x9c, 0x3e, 0x0c, 0xa0, 0xe6, 0x3d,
- 0x43, 0xbb, 0x4b, 0xbe, 0x0f, 0x76, 0x57, 0xbd, 0xac, 0x46, 0xb6, 0xbc,
- 0xe8, 0x6a, 0x44, 0x3e, 0xa8, 0x6d, 0x93, 0xbe, 0x28, 0xf6, 0x57, 0x3d,
- 0x9d, 0xdf, 0xb4, 0x3e, 0xd0, 0x93, 0x3b, 0x3d, 0x78, 0x90, 0xcd, 0xbe,
- 0x77, 0xe8, 0xcd, 0xbc, 0x8e, 0xdc, 0x96, 0xbe, 0x12, 0x02, 0x59, 0x3e,
- 0xab, 0x81, 0x6a, 0xbe, 0x34, 0xb5, 0x14, 0x3e, 0xf7, 0x88, 0x8c, 0xbd,
- 0xb2, 0xd2, 0x2c, 0xbe, 0x44, 0xa8, 0x09, 0x3d, 0xf0, 0xd6, 0x38, 0xbc,
- 0x21, 0x82, 0x19, 0xbf, 0xaa, 0xa3, 0x2e, 0xbf, 0x5d, 0x36, 0x4f, 0xbe,
- 0xd8, 0x17, 0xbc, 0xbd, 0xf1, 0x8c, 0x88, 0xbe, 0x5c, 0x01, 0x22, 0xbf,
- 0x9f, 0x79, 0x64, 0xbf, 0x64, 0xb5, 0x8f, 0x3e, 0xe3, 0x29, 0xa3, 0x3c,
- 0x47, 0x8e, 0x2f, 0xbf, 0x2f, 0x0a, 0x86, 0xbc, 0xce, 0x54, 0x5b, 0xbe,
- 0x15, 0xa6, 0xd0, 0xbe, 0x2f, 0xa1, 0xa8, 0x3e, 0x17, 0x26, 0xfc, 0x3e,
- 0x46, 0x2d, 0x20, 0xbf, 0xb4, 0xc3, 0x68, 0xbf, 0xc9, 0x11, 0x57, 0x3e,
- 0xbc, 0x09, 0x83, 0x3f, 0x20, 0x48, 0xf2, 0x3e, 0x43, 0x61, 0x94, 0x3e,
- 0x17, 0xb0, 0x94, 0x3f, 0xe3, 0xe9, 0xca, 0xbe, 0x07, 0xdc, 0xe4, 0xbc,
- 0x5f, 0xe5, 0xf5, 0x3e, 0x30, 0x43, 0x68, 0xbf, 0xb4, 0xce, 0xa0, 0xbe,
- 0x30, 0x9f, 0x93, 0xbf, 0xf8, 0xda, 0x3c, 0xbf, 0xe5, 0xac, 0x2d, 0x3e,
- 0x02, 0xc0, 0x2a, 0x3e, 0x84, 0xc7, 0x1b, 0xbe, 0xcf, 0x45, 0x91, 0x3e,
- 0xa8, 0x71, 0xd6, 0x3d, 0xee, 0x9d, 0x89, 0xbd, 0x79, 0x5c, 0x15, 0x3f,
- 0xee, 0x94, 0x8b, 0xbe, 0xaf, 0xd5, 0xff, 0xbe, 0x67, 0xef, 0x77, 0xbe,
- 0x11, 0x57, 0x05, 0x3e, 0x44, 0x9d, 0x56, 0x3f, 0x8c, 0xba, 0x28, 0xbf,
- 0xbc, 0xa0, 0x0b, 0x3e, 0x51, 0x80, 0x24, 0xbf, 0x22, 0xb5, 0xc9, 0xbd,
- 0xa6, 0x5e, 0x86, 0x3f, 0x2a, 0x1f, 0x5d, 0x3f, 0x04, 0x84, 0xd3, 0xbd,
- 0x81, 0xbb, 0xf1, 0x3e, 0x58, 0x27, 0xe9, 0xbd, 0xb1, 0x7d, 0x18, 0x3f,
- 0x6c, 0xe7, 0xd1, 0x3e, 0x6d, 0xbc, 0x63, 0xbf, 0x4a, 0x30, 0x82, 0xbe,
- 0x9f, 0xda, 0x2c, 0x3d, 0x1c, 0x10, 0x91, 0x3e, 0x28, 0x26, 0xcd, 0x3e,
- 0x5f, 0xeb, 0xbe, 0x3d, 0x61, 0x92, 0x9a, 0xbf, 0xf3, 0xbb, 0x99, 0xbe,
- 0x82, 0xe0, 0x0d, 0xbd, 0x33, 0x93, 0x95, 0xbc, 0x14, 0xc4, 0x7c, 0xbf,
- 0xa4, 0x33, 0x0a, 0x3f, 0xc3, 0x81, 0xb1, 0x3f, 0xaf, 0xe4, 0x69, 0xbf,
- 0x3d, 0xca, 0x80, 0xbf, 0x64, 0xef, 0x56, 0xbe, 0x7f, 0xab, 0x51, 0x3e,
- 0x68, 0x2a, 0x6d, 0xbe, 0x3a, 0x38, 0x3b, 0x3e, 0x79, 0x7c, 0x4d, 0x3d,
- 0x7c, 0x8a, 0x12, 0x3e, 0x22, 0x49, 0x8b, 0xbf, 0xb6, 0xfd, 0x31, 0xbd,
- 0xab, 0xe3, 0x5f, 0xbf, 0xd0, 0xe7, 0xa4, 0x3e, 0xa4, 0xc6, 0x8e, 0x3e,
- 0xef, 0x09, 0x7d, 0x3e, 0x08, 0x5d, 0xed, 0x3c, 0x88, 0xfe, 0xb7, 0xbf,
- 0xe8, 0xae, 0xd1, 0xbe, 0x5e, 0x3e, 0x45, 0xbe, 0x91, 0x79, 0xbd, 0x3f,
- 0xff, 0x4e, 0x13, 0x3e, 0xbb, 0x88, 0x35, 0x3e, 0xbf, 0x23, 0xba, 0xbd,
- 0x88, 0xb2, 0xf1, 0x3d, 0x8a, 0xce, 0xbd, 0x3e, 0xb7, 0x4e, 0x6a, 0x3f,
- 0xa4, 0xb3, 0x42, 0xbe, 0x94, 0x98, 0xfb, 0xbe, 0x2c, 0xb6, 0x66, 0x3f,
- 0x34, 0x01, 0xa2, 0x3c, 0x43, 0x26, 0xb1, 0xbe, 0x50, 0x2b, 0x81, 0xbf,
- 0xc0, 0xbb, 0xaa, 0x3d, 0x7e, 0x27, 0x3f, 0x3f, 0xce, 0x57, 0x13, 0xbf,
- 0x86, 0x59, 0xc2, 0xbf, 0xe5, 0x66, 0x2f, 0x3f, 0x86, 0xf2, 0xc9, 0xbe,
- 0x9d, 0x4f, 0x33, 0xbb, 0x2c, 0xac, 0xe7, 0xbc, 0x38, 0x54, 0x91, 0xbe,
- 0xb6, 0x84, 0x6f, 0xbf, 0xeb, 0x6e, 0xd5, 0x3d, 0xc3, 0x03, 0x28, 0x3f,
- 0xa4, 0xf5, 0x1a, 0x3f, 0x56, 0xc2, 0x98, 0x3d, 0x77, 0xa7, 0x80, 0xbf,
- 0xbb, 0x6e, 0xd5, 0xbd, 0x78, 0xcd, 0x35, 0x3f, 0x9f, 0x8d, 0x56, 0x3f,
- 0x14, 0x21, 0xf8, 0xbd, 0xde, 0x89, 0xad, 0x3d, 0x39, 0x45, 0x55, 0xbe,
- 0x77, 0xcc, 0xa2, 0xbd, 0x9a, 0x4d, 0x1d, 0xbf, 0x0f, 0xa8, 0x0f, 0xbd,
- 0xcf, 0x2d, 0xcf, 0xbc, 0x70, 0x14, 0x70, 0x3d, 0xa2, 0xca, 0xe1, 0x3d,
- 0x2f, 0x67, 0x89, 0xbd, 0xec, 0x29, 0xc4, 0x3d, 0xd4, 0x90, 0xc3, 0x3d,
- 0xa3, 0x19, 0xa7, 0xbd, 0xb8, 0xd3, 0xd5, 0xbd, 0x80, 0xdf, 0xe8, 0x3d,
- 0xc3, 0x48, 0xf6, 0xbd, 0xd4, 0x05, 0x68, 0xbc, 0x69, 0xb4, 0xa6, 0x3d,
- 0xb0, 0x44, 0x6a, 0x3e, 0xc2, 0x24, 0xa1, 0xbd, 0xd5, 0x05, 0x15, 0x3d,
- 0x53, 0xb7, 0xbe, 0xbe, 0xb8, 0x72, 0xb5, 0xbc, 0xd3, 0x4f, 0x21, 0x3d,
- 0x4e, 0x28, 0x2a, 0x3e, 0x08, 0x1c, 0x0a, 0x3e, 0xf0, 0x29, 0x6c, 0x3e,
- 0xcb, 0x72, 0xd3, 0x3d, 0xdc, 0x37, 0x6b, 0xbe, 0x6e, 0x16, 0x57, 0xbd,
- 0x25, 0x17, 0x43, 0xba, 0xdf, 0x11, 0x48, 0x3e, 0x32, 0x3c, 0x3b, 0xbc,
- 0xbc, 0x09, 0x65, 0x3d, 0xdb, 0x53, 0x39, 0x3d, 0xa7, 0xe4, 0xcf, 0x3d,
- 0xbe, 0xfa, 0xd7, 0x3c, 0x90, 0x1a, 0x0c, 0xbe, 0xf7, 0x40, 0x7f, 0x3e,
- 0x95, 0x60, 0x23, 0xbe, 0xa3, 0x8e, 0xc4, 0x3e, 0x38, 0xf2, 0x0d, 0xbe,
- 0x6f, 0x72, 0x20, 0x3e, 0x61, 0xd8, 0xb4, 0xbe, 0x4f, 0x05, 0xd4, 0xbe,
- 0x67, 0x87, 0x0c, 0xbe, 0xc6, 0x86, 0xa4, 0xbd, 0xae, 0xf9, 0x77, 0x3e,
- 0x1b, 0x10, 0x3f, 0xbe, 0x48, 0xb3, 0x1a, 0xbe, 0xf5, 0x1c, 0x6a, 0xbd,
- 0xbb, 0xb8, 0x00, 0x3b, 0x15, 0x0d, 0x2e, 0x3e, 0x26, 0x07, 0x40, 0xbe,
- 0x1b, 0xb6, 0x70, 0x3c, 0x4a, 0x25, 0x25, 0x3e, 0xe3, 0x00, 0xa7, 0xbe,
- 0x14, 0x10, 0x8f, 0xbe, 0xa4, 0x55, 0x48, 0x3b, 0x20, 0x26, 0x2b, 0xbe,
- 0xb1, 0xa9, 0x70, 0xbe, 0x51, 0x8f, 0x3e, 0xbe, 0xe3, 0x3c, 0x18, 0x3e,
- 0x20, 0xfa, 0x5a, 0xbd, 0xae, 0x26, 0x8a, 0x3d, 0xe6, 0xd8, 0x20, 0xbe,
- 0x03, 0x93, 0x91, 0xbd, 0x60, 0x26, 0x38, 0xbe, 0xc9, 0xf4, 0x81, 0x3e,
- 0x12, 0x4b, 0x0b, 0xbe, 0x97, 0x46, 0xda, 0x3d, 0x26, 0xc4, 0xc5, 0x3d,
- 0x7c, 0x50, 0x93, 0xbd, 0x86, 0xe4, 0x1d, 0xbe, 0x4b, 0x0d, 0x3a, 0xbe,
- 0x7c, 0xd5, 0x80, 0xbe, 0x2c, 0x79, 0x8d, 0x3d, 0xac, 0x68, 0x84, 0xbe,
- 0x80, 0x48, 0xbc, 0x3d, 0x92, 0x95, 0x4f, 0xbd, 0xfa, 0x5b, 0x80, 0xbe,
- 0x5f, 0xa4, 0x6b, 0xbd, 0x2a, 0x7e, 0xf8, 0xbd, 0x3b, 0x0c, 0xd4, 0x3c,
- 0xc7, 0x79, 0xd2, 0x3c, 0x2e, 0xc0, 0x53, 0xbb, 0xe0, 0x96, 0x76, 0x3a,
- 0xc5, 0xde, 0x46, 0xbe, 0x2e, 0x8f, 0x20, 0xba, 0x64, 0x22, 0x1c, 0xbd,
- 0x31, 0x51, 0x95, 0xbe, 0x98, 0xf6, 0xf3, 0xbd, 0x0d, 0xa4, 0x58, 0x3d,
- 0xc1, 0x9d, 0xc4, 0xbd, 0x5d, 0xd4, 0x8d, 0xbd, 0xd9, 0xe6, 0x3e, 0xbe,
- 0x98, 0xaf, 0x14, 0xbe, 0x2e, 0xad, 0xd9, 0x3d, 0xbc, 0x02, 0xc2, 0xbd,
- 0x28, 0xd2, 0x00, 0x3e, 0x7b, 0x93, 0xc0, 0x3d, 0x92, 0x53, 0x0a, 0xbe,
- 0xbb, 0x90, 0x1d, 0xbe, 0x44, 0xee, 0x8e, 0x3d, 0xc7, 0xdf, 0xd0, 0xbe,
- 0x8a, 0xc9, 0xb4, 0x3d, 0x4a, 0xe2, 0x53, 0x3e, 0x99, 0xe6, 0x7d, 0xbe,
- 0xb6, 0x7c, 0xa1, 0xbc, 0xec, 0xad, 0x0f, 0xbc, 0xa1, 0xe7, 0x6d, 0x3d,
- 0xcc, 0x91, 0x0b, 0x3d, 0x42, 0xe0, 0x7e, 0xbe, 0x10, 0xcc, 0x2a, 0xbd,
- 0xb3, 0xbb, 0x8c, 0xbe, 0x26, 0x4e, 0x78, 0xbd, 0xd6, 0x04, 0x34, 0x3e,
- 0x8e, 0x7a, 0x04, 0xbd, 0xc9, 0xed, 0x9b, 0x3d, 0xa3, 0xce, 0x0c, 0xbc,
- 0xf0, 0x1d, 0x6e, 0x3e, 0xd0, 0x53, 0xe0, 0x3c, 0xee, 0xc4, 0x8d, 0xbe,
- 0x09, 0x06, 0x85, 0xbe, 0xd6, 0xac, 0x8d, 0xbd, 0x71, 0xb6, 0x47, 0x3d,
- 0xb5, 0x43, 0xbf, 0xbe, 0x5b, 0x83, 0xb6, 0x3f, 0x60, 0x6b, 0x07, 0xbe,
- 0x21, 0x43, 0xab, 0x3f, 0x7c, 0x58, 0x14, 0x3e, 0x29, 0x3c, 0x2c, 0x3f,
- 0x92, 0x3f, 0x9f, 0x3e, 0x92, 0x39, 0x69, 0x3e, 0xea, 0xb7, 0xf3, 0xbe,
- 0x7e, 0x12, 0x81, 0xbf, 0xbc, 0xd0, 0x17, 0x3f, 0x28, 0x1c, 0x05, 0xbd,
- 0x56, 0x9d, 0x18, 0xbe, 0xc8, 0xd3, 0xeb, 0x3d, 0xd8, 0xee, 0xf0, 0xbe,
- 0xda, 0x47, 0x93, 0xbe, 0xd0, 0xa4, 0x8b, 0xbe, 0xac, 0x3f, 0xde, 0xbe,
- 0x31, 0x6b, 0x3f, 0xbf, 0xb9, 0xe2, 0x95, 0xba, 0xb0, 0xdd, 0x31, 0x3f,
- 0xf7, 0xff, 0xff, 0x3e, 0x9f, 0x5c, 0x9b, 0xbe, 0x62, 0x85, 0xb9, 0xbe,
- 0xd3, 0x9a, 0x7e, 0xbe, 0x43, 0x05, 0xbf, 0x3e, 0x9c, 0x3a, 0x2b, 0xbe,
- 0xd2, 0x6c, 0x98, 0xbf, 0x10, 0x19, 0xf7, 0xbd, 0x7d, 0x2c, 0x7a, 0xbe,
- 0xf5, 0x7e, 0xee, 0x3e, 0x7c, 0x02, 0x55, 0xbf, 0x0d, 0x0b, 0x74, 0x3d,
- 0xb9, 0x79, 0x9a, 0x3e, 0x15, 0x44, 0x15, 0x3e, 0xb4, 0xa3, 0x0c, 0xbd,
- 0x4f, 0x27, 0xa4, 0x3e, 0xd5, 0xf6, 0x05, 0xbf, 0x97, 0x08, 0xdb, 0x3e,
- 0xb4, 0xd0, 0x0e, 0xbf, 0x60, 0xe6, 0x77, 0xbe, 0x65, 0x14, 0xe3, 0x3c,
- 0xba, 0xe0, 0x06, 0x3e, 0x9d, 0x1b, 0x37, 0xbd, 0x63, 0x42, 0xa0, 0x3f,
- 0x32, 0x00, 0x9c, 0xbe, 0xc6, 0x73, 0x7d, 0xbc, 0x67, 0x0b, 0x08, 0x3e,
- 0x4d, 0x56, 0x48, 0x3e, 0x9f, 0x2a, 0x89, 0xbd, 0x6e, 0xbd, 0x25, 0x3f,
- 0xdb, 0xac, 0xdb, 0x3c, 0x58, 0x60, 0x4b, 0x3f, 0xa4, 0x92, 0xfa, 0x3d,
- 0xdc, 0x3c, 0xc6, 0x3d, 0xff, 0xfb, 0x7f, 0xbe, 0x56, 0x00, 0xd8, 0x3c,
- 0x79, 0xff, 0x5f, 0x3e, 0xad, 0x5f, 0x4a, 0xbf, 0x52, 0x61, 0xea, 0x3e,
- 0x57, 0xcc, 0xe6, 0x3e, 0xbe, 0x41, 0x7c, 0xbd, 0x22, 0xa3, 0x47, 0x3d,
- 0x9d, 0xa1, 0x20, 0xbf, 0x7a, 0x9f, 0xcf, 0x3c, 0xe8, 0xfa, 0x70, 0xbd,
- 0xa7, 0x54, 0x04, 0xbd, 0x36, 0x3b, 0x16, 0x3f, 0xeb, 0xa5, 0x06, 0xbf,
- 0x72, 0x4f, 0x23, 0x3e, 0xb9, 0x41, 0x23, 0x3e, 0xa0, 0xcf, 0x08, 0x3e,
- 0x58, 0x4a, 0xfe, 0xbe, 0x67, 0xa2, 0x77, 0xbe, 0xc0, 0x64, 0x30, 0xbf,
- 0x44, 0x39, 0xd3, 0x3e, 0x4f, 0x22, 0x93, 0x3f, 0x2d, 0xa0, 0x35, 0xbf,
- 0x72, 0x1d, 0x42, 0xbf, 0xc5, 0x8d, 0x93, 0x3d, 0x6d, 0xc6, 0x5a, 0xbc,
- 0x59, 0xaf, 0xc4, 0xbe, 0xbf, 0x79, 0xec, 0x3e, 0x9d, 0xfb, 0xcd, 0xbe,
- 0x15, 0x69, 0xf0, 0xbc, 0xc8, 0x01, 0x2a, 0x3f, 0xfc, 0xb0, 0x02, 0x3e,
- 0x59, 0xae, 0x75, 0x3d, 0x20, 0x93, 0x16, 0xbe, 0x74, 0x11, 0x8d, 0xbd,
- 0x3d, 0xea, 0x4f, 0x3f, 0x93, 0x78, 0xa9, 0xbe, 0x86, 0xc8, 0x0b, 0xbe,
- 0x41, 0x3a, 0x89, 0x3e, 0x30, 0x7d, 0xe8, 0x3e, 0x6c, 0x80, 0x4e, 0x3d,
- 0x06, 0xd9, 0x01, 0x3f, 0x4e, 0xb0, 0xdb, 0xbe, 0x33, 0x26, 0x41, 0x3f,
- 0xd2, 0xcc, 0x40, 0xbf, 0xcd, 0x1c, 0x04, 0xbf, 0xaa, 0x40, 0x4d, 0xbe,
- 0xf5, 0xc4, 0xb8, 0x3e, 0x22, 0x24, 0x89, 0xbe, 0x3b, 0x34, 0xf2, 0xbe,
- 0x49, 0xe2, 0xee, 0xbd, 0x13, 0x48, 0xa9, 0x3e, 0xfd, 0x81, 0x45, 0x3f,
- 0x4c, 0xa0, 0xab, 0x3d, 0x9e, 0x32, 0x0a, 0xbe, 0xd7, 0xa4, 0x81, 0x3c,
- 0x99, 0xcd, 0x61, 0x3f, 0x00, 0xfc, 0xcf, 0xbc, 0x0d, 0x15, 0x92, 0x3e,
- 0x80, 0xf4, 0x8d, 0xbe, 0xf8, 0x0b, 0x72, 0x3e, 0x81, 0x3b, 0xd5, 0xbd,
- 0xd3, 0xeb, 0xe7, 0xbd, 0xe8, 0xd2, 0xc6, 0xbc, 0x16, 0xce, 0x9a, 0xbe,
- 0x9c, 0xd8, 0xc8, 0xbe, 0x3a, 0xb4, 0x08, 0x3e, 0x9f, 0x35, 0xaa, 0xbe,
- 0x2e, 0x2e, 0xc7, 0x3e, 0x2a, 0xc5, 0xc4, 0xbd, 0xe5, 0x1c, 0x1e, 0x3e,
- 0x1c, 0x70, 0x8c, 0x3e, 0x9b, 0xb2, 0xe9, 0xbd, 0x69, 0x6c, 0x8a, 0xbd,
- 0xc7, 0x63, 0x56, 0xbc, 0xa9, 0x34, 0x89, 0xbd, 0x29, 0x22, 0x83, 0xbd,
- 0x17, 0x2d, 0xc5, 0xbd, 0xba, 0x97, 0xc1, 0x3c, 0xed, 0x9a, 0xd8, 0xbe,
- 0x33, 0x1e, 0x8d, 0x3e, 0xaa, 0x6f, 0x8c, 0x3e, 0x9d, 0x8f, 0xbb, 0xbe,
- 0x36, 0x1b, 0xd2, 0xbe, 0x9a, 0x62, 0xa1, 0x3c, 0x9b, 0xfa, 0x4c, 0x3e,
- 0xff, 0x67, 0x6b, 0xbe, 0x5c, 0xb3, 0x2d, 0xbe, 0xc2, 0x83, 0x5c, 0x3e,
- 0x4f, 0x70, 0x34, 0x3e, 0x6c, 0xaa, 0x04, 0xbe, 0x62, 0x2c, 0x63, 0x3e,
- 0xee, 0xbb, 0x55, 0x3a, 0x0f, 0x9e, 0x95, 0x3e, 0x32, 0xd5, 0xda, 0xbd,
- 0xc8, 0x91, 0x28, 0xbd, 0xf9, 0x7e, 0xc6, 0xbe, 0xc2, 0x92, 0x69, 0x3e,
- 0xc1, 0xd7, 0x08, 0xbe, 0x4a, 0x1f, 0x40, 0x3e, 0x3a, 0x35, 0xae, 0xbe,
- 0x7d, 0xc0, 0x85, 0x3c, 0xf7, 0x5b, 0xb1, 0xba, 0x76, 0xb6, 0x92, 0xbb,
- 0xf0, 0xbb, 0xd5, 0xbd, 0x93, 0x02, 0xfa, 0xbd, 0xe0, 0x71, 0x3e, 0xbe,
- 0xe4, 0x03, 0x9e, 0x3e, 0xc1, 0xfc, 0xb3, 0xbd, 0x00, 0xa3, 0xa0, 0x3e,
- 0x4a, 0x88, 0x79, 0x3e, 0x8c, 0x67, 0x7b, 0x3e, 0x60, 0x10, 0x95, 0x3d,
- 0x1c, 0x2c, 0xe4, 0x3c, 0xa6, 0xd4, 0xd9, 0x3d, 0xf2, 0x1c, 0xa9, 0xbe,
- 0xae, 0x1a, 0x11, 0x3e, 0x51, 0xb5, 0x91, 0xbb, 0x0b, 0xde, 0x7c, 0xbe,
- 0x48, 0x3f, 0xe9, 0x3e, 0x9f, 0xaf, 0xe5, 0x3e, 0xa4, 0x05, 0xd6, 0xbc,
- 0xa1, 0xaa, 0x0c, 0xbd, 0xb1, 0x8c, 0x0d, 0x3d, 0x02, 0xe2, 0xb9, 0x3e,
- 0x2b, 0xfb, 0xee, 0x3e, 0x54, 0xf5, 0x95, 0xbe, 0x34, 0x04, 0xaf, 0x3d,
- 0xcb, 0x15, 0x89, 0xbd, 0xcb, 0xc1, 0x71, 0xbe, 0x30, 0x57, 0x0e, 0xbd,
- 0x9c, 0x74, 0x37, 0x3e, 0x3a, 0xce, 0xe0, 0x3c, 0x73, 0xdf, 0x65, 0xbc,
- 0x27, 0x5d, 0xd4, 0xbe, 0x5c, 0xdf, 0xc8, 0xbd, 0xda, 0xa2, 0x0f, 0x3f,
- 0x9f, 0x73, 0x2c, 0x3e, 0x84, 0x3a, 0x90, 0xbe, 0xe8, 0xfe, 0x5b, 0xbe,
- 0xe9, 0xc8, 0x1d, 0x3e, 0xb1, 0xb3, 0xc0, 0x3b, 0xab, 0x62, 0xc5, 0x3a,
- 0xb6, 0x87, 0x4d, 0xbe, 0x33, 0xd0, 0x7e, 0x3d, 0x25, 0x19, 0xae, 0xbe,
- 0x63, 0xf7, 0xbd, 0xbc, 0xae, 0x05, 0x07, 0xbe, 0xe6, 0x17, 0x81, 0xbd,
- 0xcc, 0xcd, 0xdd, 0xbd, 0xd5, 0xcc, 0xbc, 0xbd, 0xa1, 0x26, 0xbb, 0xbd,
- 0xbc, 0x0f, 0xdf, 0x3d, 0xf4, 0x7a, 0x01, 0xbe, 0xf9, 0x39, 0xc0, 0x3e,
- 0x94, 0x6a, 0xad, 0xbe, 0xf0, 0x86, 0xcd, 0xbe, 0xc1, 0x8c, 0x6f, 0x3d,
- 0xea, 0x77, 0xa7, 0xbe, 0xa1, 0xb0, 0xdc, 0xbd, 0x09, 0x93, 0x1b, 0xbd,
- 0xf7, 0xfd, 0x01, 0x3f, 0xc0, 0xa1, 0x44, 0x3e, 0xc0, 0x59, 0xec, 0x3c,
- 0x33, 0xf6, 0x52, 0x3d, 0xb0, 0x55, 0x93, 0xbe, 0x93, 0x43, 0xfe, 0x3e,
- 0xfd, 0x16, 0x89, 0xbe, 0x8d, 0x4d, 0x16, 0xbe, 0xab, 0x06, 0xc1, 0x3c,
- 0x46, 0x2c, 0x71, 0xbe, 0xd5, 0x1f, 0xfb, 0xbd, 0xd3, 0x19, 0xb2, 0x3d,
- 0xd6, 0xe2, 0x2e, 0xbf, 0x31, 0x88, 0x9b, 0xbe, 0x61, 0xe7, 0x9a, 0xbd,
- 0x92, 0x0c, 0x02, 0xbd, 0xac, 0x23, 0x48, 0xbe, 0x28, 0xeb, 0x5e, 0xbe,
- 0x39, 0xa4, 0x36, 0x3e, 0xc8, 0x50, 0xad, 0x3e, 0x71, 0xb1, 0xd4, 0xbe,
- 0x1f, 0x70, 0xc9, 0xbd, 0x0e, 0xea, 0x97, 0xbd, 0xa3, 0x80, 0x41, 0x3e,
- 0xc3, 0x70, 0xb9, 0xbe, 0xfc, 0x6a, 0x95, 0x3e, 0xfb, 0xc5, 0x1d, 0x3e,
- 0xf2, 0x6f, 0x74, 0x3e, 0x8a, 0xa6, 0x1e, 0xbf, 0xeb, 0x6d, 0x31, 0xbc,
- 0xf1, 0x88, 0x23, 0xbe, 0xf7, 0x2d, 0x1e, 0xbe, 0x25, 0xe9, 0xf9, 0xbd,
- 0xc0, 0x66, 0xc3, 0xbe, 0xbe, 0x76, 0x02, 0xbf, 0xbe, 0x6e, 0x76, 0xbb,
- 0x76, 0x31, 0x3c, 0xbe, 0x77, 0xf9, 0x53, 0xbd, 0x47, 0x67, 0x5f, 0xbd,
- 0xd6, 0x11, 0xa6, 0xbe, 0x96, 0x39, 0x94, 0x3d, 0x88, 0xa2, 0x4c, 0x3e,
- 0x36, 0x8a, 0x05, 0xbd, 0xea, 0xfa, 0xf9, 0xbd, 0x31, 0xcb, 0x76, 0x3e,
- 0x39, 0x59, 0x1b, 0x3e, 0x98, 0x0c, 0xaa, 0x3c, 0xe5, 0xeb, 0xce, 0xbd,
- 0x3c, 0x17, 0xf2, 0x3d, 0x17, 0x3a, 0x8f, 0x3e, 0x57, 0x0d, 0x1b, 0xbe,
- 0xd7, 0x8b, 0xee, 0x3c, 0x3d, 0x9c, 0xf4, 0x3c, 0x9a, 0x9d, 0xeb, 0x3d,
- 0x98, 0x94, 0x83, 0xbe, 0x11, 0xc3, 0xbc, 0x3c, 0xe9, 0x82, 0x37, 0xbe,
- 0x6f, 0xb3, 0x27, 0xbe, 0x4e, 0x22, 0xb9, 0xbe, 0xb6, 0xb3, 0x0a, 0xbe,
- 0x4f, 0x0e, 0x7f, 0xbd, 0x57, 0x77, 0xb1, 0xbe, 0x60, 0x35, 0x6c, 0x3e,
- 0x47, 0xb1, 0xe8, 0x3e, 0x09, 0xba, 0x26, 0xbd, 0x20, 0x26, 0xa3, 0x3d,
- 0x89, 0x2c, 0xf6, 0x3a, 0xb3, 0x12, 0x85, 0xbe, 0x6d, 0x91, 0x82, 0x3e,
- 0x65, 0x51, 0x17, 0x3e, 0xb8, 0x74, 0x94, 0xbd, 0x65, 0x8f, 0xaa, 0xbc,
- 0x82, 0x49, 0x15, 0x3d, 0x54, 0x70, 0x27, 0x3d, 0x4a, 0x32, 0x68, 0xbf,
- 0x83, 0xcd, 0x38, 0x3e, 0x0c, 0x14, 0x3b, 0xbe, 0x24, 0x59, 0x3f, 0x3e,
- 0xa7, 0x1b, 0x41, 0xbd, 0x88, 0x7a, 0x9a, 0x3e, 0x41, 0xc0, 0xcc, 0x3e,
- 0x5d, 0x87, 0xce, 0x3e, 0xe7, 0x4c, 0x1e, 0x3c, 0x84, 0xd9, 0x11, 0xbc,
- 0x74, 0xdb, 0x9b, 0xbe, 0xbf, 0x5f, 0x22, 0xbe, 0x2c, 0x0d, 0x4f, 0xbc,
- 0x36, 0x08, 0x8c, 0x3e, 0x73, 0x05, 0x4b, 0x3d, 0x54, 0x76, 0x44, 0xbe,
- 0x71, 0x35, 0xb9, 0xbd, 0x6e, 0xf0, 0x8c, 0x3b, 0x99, 0xe4, 0xc0, 0xbd,
- 0x8c, 0xd1, 0xa5, 0x3e, 0x0a, 0x07, 0x12, 0xbd, 0x66, 0xa3, 0x0c, 0x3e,
- 0x1a, 0x98, 0x6b, 0xbe, 0xff, 0x4d, 0x53, 0xbe, 0x19, 0x26, 0x87, 0x3d,
- 0x30, 0xd8, 0x79, 0xbe, 0xea, 0xf3, 0xee, 0xbd, 0x8c, 0x17, 0xa6, 0xbe,
- 0xba, 0xf8, 0x3c, 0xbe, 0xd1, 0x8a, 0xe6, 0xbc, 0x79, 0xa1, 0xa3, 0xbe,
- 0x8d, 0x67, 0x37, 0xbe, 0x46, 0x33, 0xb2, 0x3e, 0x9a, 0x93, 0xa0, 0xbc,
- 0x99, 0x9a, 0x59, 0x3e, 0xe7, 0xb3, 0x97, 0x3e, 0x38, 0x21, 0x9d, 0x3c,
- 0x88, 0x03, 0x86, 0xbe, 0x63, 0x43, 0xff, 0x3c, 0x9a, 0xa1, 0xa9, 0x3b,
- 0xec, 0x0e, 0x61, 0x3e, 0xed, 0x04, 0xb6, 0xbe, 0xbc, 0xc1, 0xad, 0x3e,
- 0x57, 0x20, 0x0e, 0x3f, 0x1c, 0x59, 0x4e, 0x3e, 0xf6, 0xd2, 0x9c, 0xbe,
- 0xd4, 0x26, 0x5e, 0x3e, 0x9d, 0x98, 0x20, 0xbc, 0x67, 0x03, 0x90, 0x3d,
- 0xba, 0xc0, 0x9a, 0xbe, 0x24, 0x5b, 0xe8, 0xbd, 0x8a, 0x49, 0xfb, 0xbd,
- 0xca, 0xd5, 0x51, 0xbe, 0xa2, 0xeb, 0x05, 0xbe, 0x5b, 0xd4, 0xae, 0x3c,
- 0x87, 0x84, 0x18, 0xbf, 0x8c, 0xfd, 0x82, 0xbf, 0x74, 0xc7, 0xcf, 0xbd,
- 0xcd, 0x30, 0x8e, 0xbe, 0xd6, 0x32, 0x82, 0xbe, 0x2e, 0x9e, 0xb6, 0xbe,
- 0x91, 0xef, 0x92, 0xbe, 0x13, 0xcf, 0xe5, 0x3e, 0x34, 0x6c, 0xd5, 0xbe,
- 0x14, 0x26, 0xde, 0xbd, 0x54, 0xcc, 0x46, 0x3d, 0x44, 0xee, 0x60, 0xbf,
- 0x10, 0x46, 0x62, 0x3f, 0x6d, 0x67, 0x9c, 0x3e, 0x5a, 0x89, 0xa2, 0x3d,
- 0x75, 0x36, 0x16, 0x3e, 0x03, 0x2c, 0x47, 0xbf, 0x4f, 0x04, 0xab, 0x3d,
- 0xca, 0xf3, 0xb9, 0x3f, 0xa7, 0xe9, 0xb8, 0xbd, 0xa0, 0xd2, 0x50, 0x3e,
- 0x00, 0x9b, 0x87, 0xbf, 0xe3, 0xe4, 0x1d, 0xbf, 0x12, 0x6d, 0x18, 0xbf,
- 0xd1, 0xce, 0x07, 0xbf, 0x08, 0xab, 0xd5, 0x3c, 0x56, 0x00, 0xfe, 0xbe,
- 0xdf, 0x9e, 0xc2, 0xbe, 0x8b, 0xa5, 0x09, 0xbf, 0x40, 0xeb, 0x97, 0x3e,
- 0xd4, 0xba, 0xa5, 0x3e, 0x01, 0x52, 0x9b, 0x3e, 0x53, 0x51, 0xd3, 0x3e,
- 0x25, 0x06, 0x90, 0xbe, 0xc2, 0x77, 0x58, 0xbe, 0xe8, 0xec, 0x30, 0x3f,
- 0xcb, 0x6d, 0x9b, 0xbe, 0x25, 0xa4, 0x0a, 0xbf, 0xe2, 0x5b, 0x27, 0xbe,
- 0xdc, 0xe0, 0x2e, 0x3e, 0xbc, 0x33, 0x1b, 0x3f, 0xe7, 0x07, 0x43, 0xbf,
- 0x3d, 0x25, 0xac, 0x3e, 0x6b, 0xa9, 0x0d, 0xbf, 0xc6, 0xde, 0xfb, 0x3e,
- 0x99, 0xc3, 0x07, 0x3e, 0x82, 0x97, 0x69, 0x3e, 0x45, 0x69, 0x02, 0xbd,
- 0x3d, 0xcd, 0xb9, 0x3e, 0x23, 0xe8, 0x1d, 0xbf, 0x0a, 0x77, 0x07, 0x3e,
- 0xb5, 0x38, 0x50, 0x3f, 0x51, 0xe0, 0x88, 0x3d, 0x6a, 0x3d, 0x01, 0xbe,
- 0xdf, 0xc9, 0x56, 0xbd, 0x55, 0x09, 0x61, 0x3f, 0x39, 0x0e, 0x32, 0xbe,
- 0x8b, 0xf5, 0x65, 0xbf, 0x42, 0x7b, 0x39, 0xbf, 0xb5, 0x8d, 0x97, 0xbf,
- 0xee, 0xee, 0xab, 0x3c, 0x4a, 0x1c, 0x1d, 0xbf, 0x2b, 0x16, 0xb9, 0xbf,
- 0xdd, 0x9a, 0x16, 0xbd, 0xc3, 0x57, 0xda, 0x3d, 0xf9, 0x8b, 0x07, 0xbf,
- 0x09, 0x79, 0x95, 0xbe, 0xb3, 0x68, 0x55, 0xbf, 0xda, 0x22, 0x94, 0x3f,
- 0x83, 0x2d, 0xd2, 0xbe, 0xa6, 0x80, 0x4f, 0xbd, 0xe1, 0x1f, 0x0a, 0xbe,
- 0xd6, 0xbe, 0x53, 0xbc, 0x8b, 0x80, 0x8a, 0xbe, 0xc7, 0x0d, 0x5c, 0x3e,
- 0x70, 0x3b, 0xbb, 0x3e, 0xe7, 0x71, 0x50, 0x3e, 0xf7, 0xa6, 0x65, 0x3f,
- 0x06, 0xeb, 0x9a, 0xbe, 0x4d, 0xd8, 0xba, 0xbd, 0x8b, 0x4a, 0x87, 0xbf,
- 0x9a, 0xe6, 0x27, 0x3f, 0x8a, 0x2a, 0x2d, 0xbe, 0x11, 0xae, 0x4a, 0x3f,
- 0xa5, 0x04, 0xdb, 0x3e, 0x41, 0x8c, 0xa8, 0xbd, 0xde, 0xd8, 0xb2, 0xbc,
- 0x33, 0x33, 0x04, 0x3b, 0x62, 0x45, 0x92, 0x3f, 0x00, 0xf7, 0xc3, 0xbe,
- 0x93, 0x30, 0x6f, 0xbe, 0x09, 0x76, 0x2c, 0xbf, 0xde, 0x44, 0x28, 0x3f,
- 0x80, 0x93, 0xfc, 0x3e, 0x0b, 0x47, 0x98, 0xbe, 0x0a, 0xcc, 0xde, 0xbe,
- 0x9f, 0xf4, 0x95, 0x3d, 0x44, 0x66, 0xbe, 0x3e, 0x4c, 0x40, 0xdd, 0xba,
- 0x38, 0xd0, 0xdc, 0xbe, 0x80, 0x17, 0x00, 0x3f, 0x33, 0xbf, 0xec, 0xbe,
- 0xa9, 0x06, 0x8f, 0x3f, 0x03, 0x59, 0xca, 0x3e, 0x8a, 0x48, 0x82, 0x3e,
- 0x46, 0x0c, 0x32, 0xbe, 0x70, 0xd4, 0x82, 0x3f, 0xb0, 0xba, 0x00, 0x3f,
- 0x51, 0xb6, 0xd3, 0x3d, 0x65, 0x75, 0x06, 0x3e, 0xa1, 0xbb, 0xa7, 0xbf,
- 0xd3, 0x03, 0x99, 0xbe, 0x4f, 0x72, 0x4e, 0x3e, 0x35, 0x1d, 0xa6, 0xbf,
- 0xc9, 0x57, 0x17, 0xbf, 0x66, 0x38, 0x1a, 0xbe, 0xb7, 0x2f, 0x8a, 0x3d,
- 0xeb, 0x6a, 0xc2, 0xbd, 0x42, 0x7e, 0xb6, 0xbf, 0x1a, 0x58, 0xc6, 0xbd,
- 0x7e, 0xe0, 0xff, 0xbe, 0xe4, 0xdf, 0xa2, 0xbe, 0x33, 0xa8, 0xf1, 0xbe,
- 0xe3, 0x37, 0xb7, 0xbd, 0xdf, 0x2f, 0xc1, 0xbd, 0xfb, 0xc6, 0x2a, 0xbe,
- 0xb1, 0xb1, 0x9e, 0x3d, 0x3b, 0xdb, 0x1e, 0xbe, 0xf8, 0xc5, 0xf8, 0x3d,
- 0xd5, 0x7c, 0x43, 0xbe, 0x62, 0x10, 0x4f, 0x3c, 0x87, 0x20, 0xd9, 0xbd,
- 0xc3, 0xf0, 0xbf, 0x3d, 0x46, 0xcb, 0x47, 0x3d, 0x38, 0x4f, 0x49, 0x3e,
- 0xc9, 0x8c, 0xac, 0xbe, 0xa8, 0xf2, 0x07, 0xbe, 0x76, 0x8f, 0x14, 0xbe,
- 0xe4, 0x89, 0x15, 0x3e, 0x16, 0x09, 0x52, 0x3e, 0xcf, 0xb1, 0x44, 0x3e,
- 0xba, 0xe6, 0xa0, 0xbd, 0xed, 0x75, 0xa4, 0xbe, 0x64, 0x16, 0xa8, 0xbd,
- 0xf3, 0x04, 0x30, 0x3e, 0x0e, 0x14, 0x76, 0x3d, 0x81, 0xd9, 0xb1, 0x3d,
- 0x10, 0x83, 0x4e, 0x3e, 0xdf, 0xea, 0xb3, 0xbd, 0x16, 0xda, 0xd6, 0xbd,
- 0x4e, 0x8e, 0xb8, 0xbd, 0x36, 0x2f, 0x10, 0x3c, 0x25, 0x88, 0x8e, 0x3e,
- 0x3b, 0xbb, 0xb6, 0x3c, 0x8e, 0x62, 0xda, 0x3e, 0xf7, 0x0f, 0xde, 0xbc,
- 0xec, 0x2c, 0x3a, 0x3c, 0x51, 0x8f, 0xa5, 0xbe, 0xb3, 0x1d, 0xc2, 0xbe,
- 0x80, 0x45, 0xc0, 0xbd, 0x41, 0x6f, 0x65, 0xbc, 0x83, 0xe4, 0xdc, 0x3d,
- 0xdf, 0x12, 0xfd, 0xbc, 0x13, 0x70, 0xed, 0xbc, 0xe7, 0xb3, 0x4f, 0xbd,
- 0xab, 0x5b, 0x89, 0xbd, 0x10, 0x0b, 0x92, 0x3e, 0xd6, 0x5d, 0x78, 0x3c,
- 0xa9, 0xde, 0x18, 0xbd, 0x20, 0x31, 0x4c, 0x3e, 0x6e, 0x63, 0x99, 0xbe,
- 0xa6, 0x8f, 0x5f, 0xbe, 0xf0, 0xc0, 0x24, 0xbd, 0xb1, 0xde, 0x86, 0xbd,
- 0x6a, 0x9e, 0x08, 0xbe, 0x61, 0x79, 0xc2, 0xbe, 0xf1, 0x8c, 0x3b, 0x3d,
- 0xbf, 0xe5, 0x03, 0xbe, 0xf1, 0xd6, 0xe7, 0xbb, 0x8c, 0x03, 0x4a, 0xbe,
- 0xe3, 0x08, 0x7c, 0xbe, 0xef, 0x56, 0x5e, 0xbe, 0x47, 0x6e, 0x9f, 0x3e,
- 0x34, 0x17, 0x87, 0xbe, 0x73, 0xe0, 0x2d, 0xbe, 0x1c, 0x58, 0xda, 0x3d,
- 0x41, 0x2a, 0xc8, 0xbd, 0xd0, 0x6a, 0xe1, 0x3d, 0xb1, 0xd7, 0x13, 0xbe,
- 0x21, 0x0a, 0x3f, 0xbe, 0x6f, 0xba, 0x83, 0xbc, 0x50, 0x79, 0x3d, 0x3c,
- 0x80, 0xde, 0xa3, 0x3d, 0xde, 0x80, 0x6d, 0xbd, 0x6a, 0x93, 0x14, 0xbe,
- 0x98, 0x20, 0xb8, 0xbd, 0x96, 0x23, 0x22, 0xbe, 0x60, 0x21, 0x19, 0x3d,
- 0x17, 0x2b, 0x0f, 0x3e, 0xd9, 0xaa, 0x9f, 0xbd, 0x75, 0xbd, 0x66, 0x3c,
- 0x38, 0xc5, 0x3b, 0xbe, 0x31, 0x80, 0xe8, 0x3b, 0x77, 0x3b, 0x92, 0xbd,
- 0xd0, 0x91, 0x71, 0xbe, 0xb4, 0xa9, 0x7a, 0xbd, 0xea, 0x5f, 0x24, 0xbe,
- 0x6b, 0x28, 0x16, 0xbe, 0x23, 0x66, 0x60, 0xbd, 0x52, 0x40, 0x14, 0xbe,
- 0x8d, 0x56, 0x33, 0xbe, 0xca, 0x55, 0x8c, 0x3e, 0x11, 0x76, 0xc3, 0x3c,
- 0x2e, 0x4f, 0x84, 0x3e, 0x57, 0x16, 0x6f, 0x3e, 0xdb, 0x3f, 0xad, 0x3d,
- 0x50, 0x56, 0x30, 0x3d, 0x5c, 0x67, 0x96, 0x3d, 0xfb, 0x6c, 0xec, 0xbe,
- 0xd2, 0x08, 0x4c, 0xbd, 0xbf, 0xd0, 0x1a, 0x3e, 0x14, 0xd8, 0x92, 0xbe,
- 0xe3, 0xf4, 0x5c, 0xbc, 0x99, 0xf2, 0xa9, 0x3d, 0xae, 0xae, 0x24, 0x3e,
- 0xd3, 0xfd, 0x48, 0x3e, 0x9b, 0x2b, 0xeb, 0xbd, 0xb8, 0x76, 0xdd, 0x3d,
- 0xd6, 0x43, 0x27, 0xbe, 0xa2, 0x2f, 0x84, 0xbe, 0xb6, 0xe7, 0x0e, 0x3e,
- 0x29, 0xe6, 0x25, 0x3e, 0x48, 0x1c, 0xc7, 0xbd, 0x3e, 0x94, 0x35, 0x3d,
- 0xeb, 0xb3, 0xf8, 0x3d, 0x86, 0x1e, 0x3c, 0x3d, 0x6f, 0x4b, 0x8c, 0xbd,
- 0x49, 0xd0, 0x33, 0xbe, 0x24, 0x7f, 0x04, 0xbe, 0xe3, 0x41, 0xa9, 0x3d,
- 0xf3, 0x7d, 0x94, 0xbe, 0x8d, 0x04, 0xa1, 0x3f, 0x2a, 0xa6, 0x8c, 0x3d,
- 0x33, 0x05, 0x9c, 0x3f, 0x1e, 0x5c, 0x00, 0x3e, 0x49, 0xcd, 0x36, 0x3f,
- 0x10, 0xb0, 0xa1, 0x3e, 0x74, 0x50, 0x31, 0x3e, 0xa2, 0x30, 0xdd, 0xbe,
- 0x01, 0x67, 0x8e, 0xbf, 0x0a, 0x3e, 0x24, 0x3f, 0x57, 0xb6, 0x0b, 0xbe,
- 0xd8, 0xe1, 0x0d, 0xbd, 0xf7, 0x6f, 0x18, 0x3e, 0x17, 0xa2, 0x1f, 0xbf,
- 0x3d, 0xbe, 0x91, 0xbe, 0x79, 0x96, 0x14, 0xbe, 0x74, 0x7e, 0xf8, 0xbe,
- 0x66, 0x20, 0x13, 0xbf, 0xbd, 0x67, 0xe6, 0xbd, 0x1a, 0x29, 0x31, 0x3f,
- 0xb0, 0x33, 0x31, 0x3f, 0x9f, 0xd7, 0xbe, 0xbe, 0x32, 0x1e, 0xbb, 0xbe,
- 0x7a, 0x9d, 0x91, 0xbe, 0x14, 0x2d, 0x07, 0x3f, 0x0f, 0xe2, 0x8e, 0xbe,
- 0xf1, 0xef, 0xae, 0xbf, 0xa8, 0xf6, 0x2c, 0xbd, 0xaf, 0xb0, 0x70, 0xbd,
- 0xcd, 0x02, 0x3a, 0x3f, 0xd8, 0xb3, 0x46, 0xbf, 0xe8, 0xb8, 0xbf, 0xbd,
- 0x13, 0x45, 0xf8, 0x3e, 0x18, 0x6d, 0xb5, 0x3d, 0x29, 0x9f, 0xbf, 0xbc,
- 0x6d, 0x5b, 0x90, 0x3e, 0x01, 0xc1, 0xbf, 0xbe, 0x67, 0x71, 0xa9, 0x3e,
- 0x68, 0x30, 0x28, 0xbf, 0xdc, 0x9f, 0x99, 0xbe, 0xc7, 0x40, 0xf1, 0xbd,
- 0xa6, 0xed, 0x91, 0x3d, 0xc5, 0x7d, 0x20, 0xbe, 0x91, 0xc5, 0x97, 0x3f,
- 0x4c, 0x7a, 0x82, 0xbe, 0xfb, 0x72, 0x08, 0xbe, 0x54, 0xed, 0x0a, 0x3b,
- 0x0a, 0xfc, 0x60, 0x3d, 0x48, 0xa9, 0x73, 0x3d, 0xf5, 0x0f, 0xf3, 0x3e,
- 0x7f, 0x5b, 0xf9, 0xbd, 0x42, 0xa6, 0x6c, 0x3f, 0x59, 0x93, 0xfd, 0x3d,
- 0xa1, 0x75, 0x1e, 0xba, 0x80, 0x07, 0x7a, 0xbe, 0xd2, 0x62, 0x9c, 0x3d,
- 0xd3, 0xba, 0xca, 0x3d, 0x09, 0x77, 0x41, 0xbf, 0xaa, 0x40, 0xf0, 0x3e,
- 0xce, 0x2f, 0xd1, 0x3e, 0xa6, 0x0c, 0x1b, 0x3e, 0x26, 0xf0, 0x17, 0xbe,
- 0xa9, 0x1f, 0x1e, 0xbf, 0xed, 0x59, 0x96, 0x3c, 0x12, 0xad, 0xef, 0x3c,
- 0x60, 0x57, 0x0f, 0xbe, 0x5e, 0x14, 0x0e, 0x3f, 0xa3, 0x4b, 0x0a, 0xbf,
- 0x3f, 0xa6, 0xd1, 0x3e, 0x82, 0x1b, 0x59, 0xbd, 0xe0, 0x0a, 0x4e, 0x3e,
- 0xcf, 0x38, 0x0a, 0xbf, 0x00, 0x99, 0xed, 0xbd, 0xd6, 0x68, 0x1a, 0xbf,
- 0x4e, 0x76, 0x98, 0x3e, 0x0f, 0x9f, 0x88, 0x3f, 0x2d, 0xb2, 0x18, 0xbf,
- 0x7a, 0xd2, 0x53, 0xbf, 0x30, 0xd8, 0x02, 0x3e, 0x72, 0x62, 0xb4, 0xbd,
- 0x76, 0x78, 0x89, 0xbe, 0x4d, 0xc2, 0xd6, 0x3e, 0x7d, 0xff, 0x03, 0xbf,
- 0x11, 0x00, 0x0b, 0xbe, 0x98, 0x6d, 0x29, 0x3f, 0x1d, 0xd3, 0x68, 0x3e,
- 0x1d, 0xe3, 0xb2, 0x3c, 0xd2, 0x6a, 0xdd, 0xbc, 0x49, 0x3d, 0x49, 0xbe,
- 0xc5, 0x8d, 0x3b, 0x3f, 0x6d, 0xf5, 0x6b, 0xbe, 0xfc, 0xae, 0x1a, 0xbe,
- 0xe9, 0x66, 0xab, 0x3d, 0x48, 0xb2, 0xc0, 0x3e, 0xbc, 0x10, 0x93, 0x3d,
- 0x35, 0x58, 0x07, 0x3f, 0xd4, 0xc9, 0xc1, 0xbe, 0x01, 0x89, 0x57, 0x3f,
- 0xc0, 0xbf, 0x2d, 0xbf, 0x6b, 0xa7, 0xdb, 0xbe, 0xac, 0xde, 0xb2, 0xbe,
- 0xcc, 0x78, 0x72, 0x3e, 0x82, 0x0b, 0x7a, 0xbe, 0xf7, 0xa9, 0x07, 0xbf,
- 0xbe, 0x1b, 0x15, 0xbe, 0xac, 0x30, 0x90, 0x3e, 0xb7, 0xdb, 0x51, 0x3f,
- 0xf3, 0x3a, 0x98, 0x3e, 0xb2, 0x8e, 0x29, 0xbd, 0xb4, 0xcd, 0xa2, 0xbd,
- 0x47, 0xce, 0x5d, 0x3f, 0x07, 0x7f, 0x9e, 0x3d, 0x97, 0xe7, 0x85, 0x3e,
- 0x37, 0x5f, 0x3f, 0xbe, 0x66, 0x70, 0x88, 0x3e, 0xe6, 0xd8, 0x63, 0xbe,
- 0x9f, 0x10, 0x3a, 0x3e, 0x92, 0x43, 0x8d, 0xbd, 0x9f, 0xec, 0xb5, 0xbe,
- 0x41, 0x6a, 0xc4, 0xbe, 0xe1, 0xef, 0x00, 0xbd, 0x11, 0xd9, 0x86, 0x3d,
- 0x10, 0x4f, 0xe5, 0x3e, 0xa0, 0x81, 0xee, 0xbd, 0x37, 0x03, 0xa0, 0xbb,
- 0xe1, 0x17, 0x72, 0x3e, 0x4e, 0xcc, 0xf7, 0xbd, 0x1a, 0xf3, 0x01, 0x3e,
- 0x48, 0xde, 0x31, 0xbe, 0x53, 0x41, 0xdb, 0xbd, 0x30, 0xb4, 0xaa, 0x3d,
- 0xda, 0x11, 0x63, 0x3d, 0x6a, 0x61, 0x18, 0x3e, 0xd4, 0xdc, 0x13, 0xbf,
- 0xc2, 0x22, 0x16, 0x3e, 0x8b, 0xd7, 0x20, 0x3e, 0x35, 0xfb, 0x15, 0xbe,
- 0x00, 0xf4, 0x82, 0xbe, 0xc2, 0x66, 0x8c, 0x3e, 0x00, 0xc7, 0x36, 0xbe,
- 0xc8, 0x60, 0x4c, 0xbe, 0x61, 0xe4, 0x99, 0xbe, 0xab, 0x39, 0x5d, 0x3e,
- 0x61, 0x3e, 0x3f, 0x3e, 0x53, 0x44, 0xfe, 0x3d, 0x6e, 0xb7, 0x42, 0x3e,
- 0x17, 0x1e, 0x73, 0xbd, 0x40, 0xcb, 0x20, 0xbe, 0xb6, 0x74, 0xe8, 0xbd,
- 0x7b, 0x95, 0x16, 0xbe, 0xc6, 0x73, 0x99, 0xbe, 0x96, 0xd6, 0xa2, 0x3e,
- 0xfb, 0x43, 0x98, 0xbe, 0x6f, 0xba, 0x4c, 0x3c, 0x0a, 0x81, 0x09, 0xbf,
- 0x3b, 0x55, 0xca, 0xbe, 0xda, 0x0d, 0x82, 0x3b, 0x0b, 0xd8, 0xee, 0x3d,
- 0x00, 0xdd, 0x5d, 0xbe, 0xeb, 0x43, 0xb6, 0xbd, 0xa3, 0xb5, 0xcb, 0xbc,
- 0x2f, 0xd9, 0xa1, 0x3d, 0x20, 0x32, 0x76, 0xbe, 0x17, 0x9a, 0x45, 0x3e,
- 0x20, 0x89, 0x4d, 0x3d, 0xde, 0x74, 0x6f, 0xbd, 0x2b, 0x50, 0x7c, 0x3d,
- 0x50, 0xf8, 0x32, 0x3e, 0xbb, 0x34, 0xd3, 0x3e, 0xa2, 0x83, 0x18, 0xbe,
- 0xd8, 0x8a, 0x52, 0xbd, 0xb2, 0x11, 0x7c, 0xbe, 0x39, 0x8f, 0xf7, 0xbd,
- 0xc7, 0x0d, 0x58, 0x3e, 0x30, 0x0a, 0xe7, 0x3d, 0xeb, 0x22, 0x15, 0x3e,
- 0xd8, 0x3f, 0xb2, 0x3c, 0x7e, 0x23, 0x0c, 0x3e, 0xb4, 0xfc, 0xfc, 0x3c,
- 0x8b, 0x85, 0xb7, 0x3e, 0x7a, 0x2b, 0xfc, 0xbe, 0xb1, 0x22, 0x3c, 0x3d,
- 0x97, 0x04, 0x07, 0x3d, 0x3a, 0x3a, 0x22, 0x3e, 0xcf, 0x9e, 0x85, 0x3c,
- 0x2f, 0x9f, 0xf3, 0x3d, 0xc7, 0x24, 0x79, 0xbc, 0xd7, 0x84, 0xa1, 0xbc,
- 0xcd, 0xe5, 0x46, 0xbe, 0x77, 0x14, 0x97, 0x3c, 0x5f, 0xff, 0x07, 0x3f,
- 0xd5, 0x01, 0xd8, 0xbe, 0xa5, 0x5b, 0x51, 0xbe, 0x97, 0xec, 0x91, 0xbd,
- 0x11, 0xe8, 0x4b, 0x3e, 0xf8, 0xc9, 0x4f, 0x3d, 0xf1, 0x30, 0xdc, 0x3d,
- 0x6a, 0x18, 0xbc, 0xbd, 0xca, 0x8c, 0x7f, 0xbe, 0xfc, 0x0a, 0xe9, 0xbd,
- 0xc9, 0x52, 0xd2, 0xbd, 0x12, 0x65, 0x43, 0x3d, 0xb0, 0xb4, 0x85, 0x3c,
- 0x6b, 0x28, 0xb8, 0x3d, 0xec, 0x0d, 0x05, 0xbe, 0xef, 0xd6, 0x83, 0xbd,
- 0xd6, 0xaf, 0xa4, 0x3e, 0x1f, 0x94, 0x11, 0xbe, 0x4e, 0x7c, 0xee, 0x3c,
- 0x72, 0xb2, 0x1c, 0xbf, 0xc0, 0xd4, 0x0f, 0xbf, 0x1a, 0xeb, 0x14, 0xbd,
- 0x93, 0x51, 0x79, 0xbe, 0x87, 0x37, 0x3f, 0x3e, 0xa8, 0xcf, 0x68, 0xbd,
- 0x4b, 0xb5, 0x26, 0x3e, 0x99, 0x5e, 0x8b, 0x3e, 0x54, 0xcd, 0x2d, 0x3e,
- 0x9f, 0x16, 0x92, 0x3e, 0x98, 0xaf, 0xb0, 0x3d, 0xb7, 0x85, 0x12, 0x3e,
- 0x20, 0x52, 0xd9, 0xbd, 0x46, 0x48, 0x04, 0x3e, 0xb1, 0x28, 0xae, 0x3b,
- 0x25, 0xde, 0xf2, 0x3d, 0x41, 0xb3, 0x73, 0x3d, 0xad, 0x9b, 0x7b, 0xbe,
- 0xee, 0x11, 0xd2, 0xbe, 0x53, 0x57, 0x1a, 0xbe, 0xc1, 0x83, 0x18, 0x3e,
- 0x9e, 0x44, 0xf6, 0x3d, 0xc3, 0xa2, 0x3a, 0x39, 0x4f, 0xf4, 0x50, 0xbe,
- 0x13, 0xe0, 0xe4, 0x3d, 0x17, 0xd0, 0x25, 0x3e, 0xab, 0x25, 0x94, 0xbe,
- 0x26, 0xfb, 0x16, 0xbe, 0x4d, 0x8f, 0x7e, 0xbd, 0xaa, 0x3a, 0x91, 0x3e,
- 0x02, 0x71, 0xa5, 0xbe, 0x28, 0x8f, 0xa1, 0x3d, 0x96, 0xa1, 0x61, 0x3e,
- 0xfe, 0xa0, 0xef, 0x3d, 0xa8, 0xe7, 0x71, 0xbe, 0xea, 0x18, 0x8f, 0x3d,
- 0xb1, 0x36, 0x2e, 0xbe, 0x82, 0x60, 0x9f, 0xbe, 0x32, 0x00, 0x0b, 0xbe,
- 0x01, 0xed, 0x44, 0xbe, 0x8e, 0xe4, 0x26, 0xbe, 0xb6, 0x36, 0xf4, 0xbd,
- 0x7b, 0x91, 0x51, 0xbd, 0x56, 0xa4, 0xb7, 0x3d, 0xe6, 0x8c, 0x51, 0x3e,
- 0x5e, 0x91, 0xd5, 0xbd, 0xf4, 0x87, 0xb9, 0x3e, 0xb0, 0x12, 0x01, 0xbe,
- 0x14, 0x4e, 0xbf, 0x3d, 0x68, 0x35, 0x62, 0xbe, 0xe2, 0xa0, 0x36, 0x3e,
- 0x76, 0x26, 0x4e, 0x3c, 0xe2, 0xd7, 0xdf, 0xbd, 0x32, 0x80, 0x9a, 0xbc,
- 0x3e, 0x9b, 0x38, 0xbc, 0x64, 0xe4, 0xd3, 0x3d, 0xd8, 0x6a, 0x53, 0x3d,
- 0xc4, 0x4e, 0x2b, 0xbd, 0x4d, 0xc8, 0xec, 0x3d, 0xf5, 0x4c, 0xbb, 0x3c,
- 0xf3, 0xf0, 0x8c, 0xbe, 0x69, 0x94, 0x1f, 0x3d, 0xbf, 0x9b, 0x83, 0xbf,
- 0xb7, 0xc0, 0x85, 0xbe, 0x99, 0x15, 0x05, 0xbe, 0xaf, 0x5b, 0x58, 0x3c,
- 0xf1, 0x4b, 0x99, 0xbd, 0xa9, 0x39, 0xbc, 0xbe, 0x2f, 0x2e, 0xec, 0x3d,
- 0xbb, 0x52, 0x0f, 0x3d, 0x8d, 0xf8, 0x10, 0xbe, 0xc2, 0xea, 0xbc, 0xbd,
- 0x2f, 0x8f, 0x5e, 0x3c, 0x08, 0x99, 0x78, 0xbe, 0xbd, 0x6c, 0x41, 0x3e,
- 0x9b, 0x5e, 0x96, 0xbd, 0xc6, 0xb2, 0x30, 0x3e, 0xaa, 0x02, 0x4b, 0xbe,
- 0x6e, 0xe4, 0xa9, 0xbd, 0xf8, 0xb7, 0x6c, 0xbe, 0x9f, 0x64, 0xa3, 0xbe,
- 0x7e, 0xa9, 0x2d, 0xbd, 0x93, 0x5d, 0xa1, 0xbe, 0xc2, 0x21, 0x3f, 0xbd,
- 0x79, 0x22, 0x80, 0x3d, 0x60, 0xc7, 0x07, 0x3f, 0xe9, 0x10, 0x46, 0xbe,
- 0x0f, 0x01, 0xb5, 0x3e, 0xac, 0xd6, 0xcf, 0xbe, 0x7f, 0xbd, 0x80, 0x3c,
- 0x5c, 0x2a, 0x90, 0xbd, 0x7d, 0x5d, 0xa2, 0x3d, 0x8d, 0x1a, 0x63, 0xbd,
- 0xf5, 0xdc, 0xbc, 0x3e, 0x14, 0xc4, 0xaf, 0x3d, 0xb8, 0x05, 0x42, 0xbe,
- 0x90, 0x30, 0x73, 0x3d, 0x6a, 0xc2, 0xae, 0xbd, 0xf0, 0xd1, 0x8c, 0xbc,
- 0xb1, 0x00, 0xe2, 0xbd, 0x88, 0xf1, 0xa4, 0x3d, 0x7b, 0xda, 0xf3, 0x3d,
- 0xd9, 0xf1, 0x00, 0xbf, 0x34, 0x8a, 0x31, 0xbd, 0x72, 0xe7, 0x50, 0xbd,
- 0x0e, 0xc3, 0x6e, 0xbd, 0xa0, 0x41, 0x21, 0xbe, 0x7c, 0x90, 0x00, 0xbe,
- 0x94, 0xe1, 0x2b, 0xbe, 0x37, 0xe5, 0x94, 0xbd, 0x93, 0x11, 0x61, 0xbe,
- 0xb5, 0x5f, 0x47, 0xbd, 0xc9, 0x3f, 0x86, 0x3e, 0x34, 0x19, 0x11, 0x3d,
- 0x3f, 0x52, 0x50, 0x3d, 0xfa, 0xb1, 0xfb, 0x3e, 0x03, 0x2c, 0xc5, 0xbd,
- 0x01, 0x36, 0x19, 0xbf, 0x4a, 0x55, 0xa4, 0xbd, 0x18, 0x83, 0x2a, 0x3c,
- 0xff, 0x2b, 0xea, 0x3e, 0x69, 0x42, 0x76, 0x3d, 0x34, 0xbd, 0xe2, 0x3e,
- 0x82, 0x1f, 0xe2, 0xbc, 0xd9, 0xbd, 0xbb, 0x3d, 0x4d, 0x95, 0xef, 0xbd,
- 0xce, 0xc2, 0x0e, 0x3e, 0xd5, 0xd5, 0x39, 0xbd, 0xf4, 0x6a, 0x5e, 0xbe,
- 0x71, 0xb3, 0x5f, 0xbe, 0x58, 0xec, 0x39, 0x3d, 0x6c, 0x1e, 0xce, 0xbc,
- 0xbf, 0xfc, 0xd4, 0x3d, 0x82, 0xae, 0x0c, 0xbe, 0xee, 0xd2, 0x77, 0xbe,
- 0x96, 0x9d, 0xf6, 0xbe, 0x8a, 0x56, 0xaf, 0xbe, 0x02, 0x15, 0xb5, 0xbd,
- 0xa4, 0x2a, 0xb9, 0x3b, 0x7f, 0x2e, 0x8e, 0xbe, 0xc8, 0xc8, 0xcd, 0xbd,
- 0xf8, 0x72, 0x5a, 0x3f, 0xb7, 0x7a, 0x00, 0x3f, 0x0f, 0x30, 0xdd, 0xbd,
- 0xb3, 0xcd, 0x9a, 0xbe, 0x4d, 0x43, 0x48, 0x3e, 0x58, 0x0f, 0x43, 0xbe,
- 0x10, 0xb2, 0x31, 0x3f, 0x6d, 0xbc, 0xda, 0x3c, 0x03, 0xc7, 0xe2, 0xbe,
- 0xbb, 0x44, 0xd5, 0xbe, 0xca, 0xf2, 0xc6, 0xbe, 0x03, 0x41, 0x20, 0x3f,
- 0xd8, 0x49, 0x3a, 0x3e, 0xa3, 0x9f, 0xd8, 0x3e, 0x86, 0x0c, 0xb0, 0x3c,
- 0x0f, 0x01, 0x91, 0xbf, 0xd4, 0x25, 0x0c, 0x3f, 0xf8, 0xcf, 0x71, 0x3e,
- 0x5b, 0x88, 0xb6, 0x3e, 0x40, 0xcf, 0x1b, 0xbf, 0x41, 0x87, 0x84, 0xbf,
- 0xf2, 0x2b, 0xc5, 0xbe, 0x19, 0xa2, 0x81, 0xbf, 0xd6, 0x8b, 0x3a, 0x3e,
- 0x70, 0x9e, 0xde, 0x3e, 0xbb, 0x29, 0x36, 0xbe, 0x1e, 0x21, 0x82, 0x3e,
- 0x93, 0x25, 0xc3, 0xbe, 0x2c, 0x43, 0xe2, 0xbd, 0xc4, 0x3e, 0x00, 0x3f,
- 0xa9, 0xc5, 0x4e, 0xbf, 0xd5, 0x47, 0x1c, 0xbf, 0x2b, 0xff, 0xbe, 0xbd,
- 0x9f, 0x5a, 0x3d, 0xbe, 0x07, 0xc0, 0x0c, 0xbe, 0xd6, 0x4b, 0x0c, 0xbe,
- 0x16, 0x11, 0x81, 0x3d, 0xfd, 0xc2, 0x99, 0x3e, 0xce, 0xf3, 0x56, 0xbf,
- 0x54, 0xfe, 0x81, 0x3e, 0x71, 0xcf, 0xf2, 0x3e, 0xd3, 0xaf, 0xf3, 0xbd,
- 0xd7, 0x73, 0x17, 0x3f, 0xde, 0x9b, 0x8a, 0xbf, 0x6d, 0x49, 0x80, 0x3e,
- 0x26, 0xb4, 0x12, 0xbe, 0xa0, 0xdf, 0xc6, 0xbe, 0xea, 0x2d, 0x15, 0xbf,
- 0xbc, 0xdb, 0x10, 0xbf, 0x6d, 0x04, 0xa8, 0xbe, 0xfd, 0xa5, 0xa8, 0x3d,
- 0x12, 0x03, 0x55, 0xbf, 0x52, 0x36, 0x8f, 0xbc, 0xad, 0x60, 0x67, 0xbe,
- 0xee, 0x2f, 0xa1, 0xbd, 0x1e, 0x0e, 0x8a, 0xbe, 0xbe, 0x53, 0x00, 0xbf,
- 0xdb, 0xb8, 0x2c, 0x3f, 0x0c, 0x0d, 0xad, 0x3c, 0x79, 0xd9, 0x8f, 0xbe,
- 0x80, 0x0a, 0x37, 0x3e, 0xf5, 0xd8, 0xb4, 0xbe, 0x92, 0x15, 0x05, 0x3f,
- 0x00, 0x08, 0x47, 0xbf, 0x0a, 0xe5, 0x72, 0x3e, 0x53, 0x1c, 0x48, 0x3d,
- 0xd4, 0xc9, 0x19, 0x3e, 0xac, 0xc4, 0xd7, 0xbe, 0x70, 0x8a, 0x7e, 0x3e,
- 0x43, 0x7b, 0xac, 0xbf, 0x41, 0x32, 0x8a, 0xbe, 0x7e, 0x41, 0x08, 0x3e,
- 0x4e, 0x71, 0x61, 0xbf, 0xbc, 0x2e, 0x06, 0xbe, 0xc2, 0x0b, 0x66, 0xbf,
- 0xf0, 0x0d, 0x4f, 0x3e, 0x61, 0x82, 0x66, 0x3f, 0xe5, 0xcc, 0x8e, 0x3f,
- 0x0c, 0xc4, 0x8f, 0x3c, 0x68, 0x97, 0x9b, 0x3e, 0x82, 0xfd, 0x9b, 0xbd,
- 0x66, 0x2d, 0x3f, 0xbe, 0x5f, 0x06, 0x5c, 0x3f, 0xae, 0x51, 0x94, 0xbf,
- 0x53, 0x66, 0x02, 0xbd, 0xa4, 0x5c, 0x9a, 0x3e, 0x93, 0x23, 0x4a, 0x3f,
- 0x77, 0x1b, 0x0c, 0x3f, 0xee, 0x67, 0x40, 0xbe, 0x67, 0xa3, 0xac, 0xbe,
- 0x06, 0xf9, 0x54, 0x3e, 0x64, 0xbe, 0x49, 0x3e, 0xca, 0x55, 0x0d, 0xbe,
- 0xa4, 0xbf, 0x2e, 0x3f, 0x87, 0xb1, 0x71, 0x3f, 0x42, 0xcc, 0x5a, 0xbd,
- 0xfc, 0xe8, 0xef, 0xbe, 0x69, 0x44, 0x21, 0x3d, 0x19, 0xd2, 0x26, 0x3f,
- 0x00, 0xca, 0x4a, 0x3e, 0xcc, 0x0c, 0xde, 0x3f, 0xa9, 0xbf, 0x06, 0x3e,
- 0x15, 0x08, 0x9d, 0x3e, 0x3f, 0x12, 0xdf, 0x3d, 0xfc, 0xf1, 0x53, 0xbf,
- 0xd6, 0x9f, 0xe6, 0xbd, 0x94, 0x00, 0x17, 0xbf, 0x04, 0xb0, 0x71, 0x3e,
- 0x78, 0x17, 0x2e, 0x3e, 0x0e, 0xa6, 0x64, 0xbd, 0x4c, 0x6e, 0x2c, 0xbf,
- 0x55, 0xef, 0x73, 0x3b, 0x9e, 0x38, 0x21, 0xbf, 0x0c, 0xcf, 0xd7, 0xbd,
- 0x35, 0xe9, 0x22, 0xbd, 0x78, 0x05, 0x8c, 0xbc, 0xd9, 0x29, 0x53, 0x3e,
- 0xea, 0x14, 0xd4, 0xbd, 0x09, 0x15, 0x69, 0xbe, 0x06, 0x01, 0x40, 0xbe,
- 0xe3, 0xeb, 0xf9, 0xbb, 0x71, 0xb6, 0x4d, 0xbe, 0x8e, 0x17, 0x99, 0x3d,
- 0x2d, 0x50, 0x1b, 0xbe, 0xa6, 0x11, 0xa8, 0xbd, 0x8d, 0x26, 0x13, 0xbd,
- 0x80, 0x37, 0xc3, 0x3d, 0xd5, 0x7a, 0x86, 0x3e, 0x08, 0x5f, 0x62, 0xbe,
- 0xbe, 0xdc, 0x15, 0xbe, 0x0d, 0xad, 0xdd, 0xbc, 0xc9, 0x07, 0xa7, 0x3d,
- 0xa8, 0xef, 0x26, 0x3e, 0x65, 0xda, 0xf3, 0x3e, 0x3d, 0x72, 0x01, 0x3e,
- 0x67, 0x97, 0x96, 0xbb, 0x11, 0xf1, 0xc6, 0xbe, 0xe6, 0x60, 0x29, 0x3e,
- 0x40, 0x54, 0x20, 0x3e, 0x6b, 0xfb, 0x5f, 0x3e, 0x25, 0x14, 0x7f, 0xbd,
- 0x77, 0x52, 0x56, 0x3e, 0xa1, 0xfb, 0x06, 0xbe, 0x8e, 0xda, 0xd7, 0xbb,
- 0x7e, 0x5c, 0x15, 0x3d, 0x24, 0x66, 0xdc, 0x3d, 0x0c, 0xcd, 0x5b, 0x3e,
- 0xe7, 0xe2, 0xc1, 0xbc, 0xf1, 0x29, 0xb5, 0x3d, 0x59, 0xe7, 0xad, 0xbd,
- 0x33, 0x80, 0x96, 0xbd, 0xc4, 0x87, 0x4a, 0xbe, 0x05, 0xf3, 0xb8, 0xbe,
- 0xae, 0xb2, 0x3b, 0xbc, 0xe4, 0xc8, 0xa1, 0x3d, 0x3b, 0x63, 0x15, 0xbe,
- 0x99, 0x3c, 0x3c, 0xbe, 0x9d, 0x7b, 0x84, 0x3e, 0x83, 0xa5, 0xb7, 0x3c,
- 0x9c, 0x51, 0xe9, 0xbc, 0xe4, 0x35, 0xa3, 0x3d, 0x40, 0xd4, 0x8b, 0xbd,
- 0x6c, 0xa5, 0x19, 0xbc, 0x96, 0xd4, 0x85, 0xbe, 0x1d, 0x07, 0xce, 0x3d,
- 0x5a, 0xee, 0x4c, 0xbe, 0xe2, 0x6c, 0xe8, 0x3d, 0x0c, 0xef, 0xfa, 0xbd,
- 0x06, 0xc3, 0xb3, 0xbd, 0x11, 0xf1, 0x59, 0xbe, 0x09, 0x98, 0x2a, 0xbe,
- 0x77, 0xb5, 0x9f, 0x3c, 0x02, 0xb3, 0x2d, 0xbe, 0xbd, 0x63, 0x1f, 0xbe,
- 0x5b, 0xa5, 0x92, 0xbe, 0x9c, 0xce, 0x11, 0xbe, 0xc2, 0x7f, 0x25, 0x3d,
- 0xa4, 0x4b, 0x46, 0xbe, 0x6f, 0xe7, 0x12, 0xbc, 0x23, 0x17, 0xb7, 0xbe,
- 0xd3, 0x53, 0xb2, 0xbd, 0x4a, 0xd3, 0xc8, 0xbc, 0x72, 0x7f, 0x88, 0xbd,
- 0x4d, 0xa8, 0x25, 0xbe, 0x5a, 0x32, 0xcb, 0x3d, 0x2c, 0xad, 0x20, 0xbe,
- 0xdc, 0x41, 0x33, 0xbe, 0x94, 0x91, 0x9f, 0xbc, 0x2a, 0xad, 0x99, 0xbe,
- 0x8c, 0x9d, 0x4b, 0x3d, 0xc1, 0xc1, 0x24, 0xbe, 0xfe, 0x5d, 0x9c, 0x3d,
- 0x97, 0xc1, 0x15, 0xbe, 0xcc, 0xbb, 0xae, 0x3d, 0xac, 0x7c, 0x60, 0xbe,
- 0xa3, 0x33, 0x25, 0x3e, 0xf1, 0xfe, 0x38, 0x3e, 0x38, 0x08, 0x2e, 0xbb,
- 0x11, 0xb6, 0x9d, 0xbd, 0x78, 0x04, 0x1b, 0xbe, 0xd1, 0xf8, 0xc6, 0x3d,
- 0xe8, 0x89, 0x4f, 0xbe, 0x5b, 0xcf, 0xf3, 0xbd, 0x86, 0x34, 0xe9, 0xbd,
- 0xb1, 0xcb, 0x34, 0xbe, 0x2e, 0x7e, 0x95, 0x3d, 0xdb, 0xe8, 0x72, 0xbe,
- 0x78, 0x63, 0x01, 0xbd, 0x5d, 0x18, 0x33, 0x3e, 0x4f, 0xd8, 0xc8, 0xbd,
- 0x3e, 0xd1, 0xe9, 0x3c, 0x6d, 0x5b, 0xf6, 0xbd, 0x8f, 0x92, 0x79, 0xbe,
- 0xd5, 0xea, 0x44, 0x3e, 0x94, 0x19, 0x62, 0xbc, 0x1c, 0x74, 0x5b, 0xbe,
- 0x71, 0xf4, 0xb2, 0xbd, 0x55, 0x93, 0x12, 0xbe, 0x51, 0x75, 0x76, 0x3e,
- 0xb9, 0x1c, 0x92, 0x3e, 0x39, 0x14, 0x04, 0xbe, 0x1f, 0xca, 0x8d, 0x3c,
- 0xb0, 0x97, 0x25, 0xbe, 0xce, 0xfe, 0x38, 0x3d, 0xb7, 0x94, 0x20, 0x3e,
- 0x3e, 0x9b, 0x90, 0x3d, 0xae, 0x89, 0x9c, 0x3d, 0x8c, 0xb1, 0xf6, 0x3d,
- 0x2c, 0x57, 0xa1, 0xbc, 0xd4, 0xdd, 0xb4, 0x3d, 0x2a, 0xdc, 0x9e, 0x3d,
- 0x86, 0xd9, 0x55, 0xbd, 0x73, 0xb7, 0x02, 0xbe, 0x66, 0xd4, 0x58, 0xbe,
- 0x6e, 0x92, 0xc1, 0xbe, 0x91, 0x13, 0xbc, 0x3f, 0x4f, 0x20, 0xbf, 0xbd,
- 0xb3, 0x6f, 0x8a, 0x3f, 0x02, 0xc5, 0x4e, 0x3e, 0x7a, 0x2f, 0x57, 0x3f,
- 0x4c, 0x14, 0xfb, 0x3a, 0x85, 0xd5, 0x58, 0x3d, 0x12, 0x08, 0xe4, 0xbe,
- 0xf9, 0x45, 0x87, 0xbf, 0x89, 0x5d, 0x38, 0x3f, 0x3f, 0x35, 0x96, 0xbe,
- 0xf6, 0x4c, 0xa2, 0x3d, 0x57, 0x1b, 0x3b, 0x3e, 0x29, 0xf0, 0x67, 0xbe,
- 0x3c, 0xd3, 0x0e, 0xbe, 0xe3, 0x65, 0xf3, 0xbd, 0x7c, 0x8e, 0xfa, 0xbe,
- 0xcf, 0x4d, 0x2a, 0xbf, 0x50, 0xd3, 0xf1, 0xbc, 0xf3, 0x32, 0x61, 0x3f,
- 0x44, 0xd7, 0x49, 0x3f, 0x09, 0x56, 0x00, 0xbf, 0xf7, 0xb4, 0xb4, 0xbe,
- 0x41, 0xd8, 0xfc, 0xbc, 0xb1, 0x44, 0x78, 0x3e, 0x28, 0x5a, 0xf7, 0xbd,
- 0xb5, 0x93, 0xa0, 0xbf, 0xc5, 0x57, 0xa8, 0xbd, 0x15, 0xc7, 0xb7, 0xbe,
- 0x7c, 0x90, 0x3c, 0x3f, 0x6a, 0x03, 0x75, 0xbf, 0x84, 0xe3, 0x04, 0xbe,
- 0x07, 0x6a, 0xfe, 0x3e, 0x05, 0x32, 0x46, 0x3e, 0x61, 0xaa, 0x18, 0x3e,
- 0x06, 0xf2, 0xd6, 0x3e, 0xca, 0x99, 0x00, 0xbf, 0xa7, 0xda, 0x1d, 0xbe,
- 0x25, 0x3e, 0xb8, 0xbe, 0xbb, 0xdf, 0x38, 0xbe, 0xa5, 0xd9, 0x01, 0xbe,
- 0x45, 0x20, 0x5a, 0x3e, 0xb2, 0xc3, 0x3d, 0xbe, 0x66, 0xb5, 0x99, 0x3f,
- 0xba, 0x6a, 0xca, 0xbe, 0x8e, 0xc3, 0xf9, 0xbd, 0x03, 0xae, 0x6a, 0x3e,
- 0x5f, 0xf8, 0x0b, 0x3e, 0xb2, 0x23, 0xa0, 0x3d, 0x9a, 0xf5, 0xe2, 0x3e,
- 0x09, 0xdb, 0x9c, 0xbd, 0xfd, 0x27, 0x78, 0x3f, 0xbc, 0xeb, 0x96, 0xbc,
- 0x30, 0x33, 0xff, 0x3a, 0xbd, 0x93, 0xf9, 0xbd, 0x39, 0x83, 0xbc, 0x3d,
- 0x40, 0x36, 0xbd, 0x3d, 0x73, 0x55, 0x6c, 0xbf, 0xa6, 0x50, 0x58, 0x3e,
- 0x3f, 0x7e, 0x57, 0x3e, 0x1e, 0xad, 0x23, 0xbd, 0xcd, 0x21, 0xe9, 0xbe,
- 0x4c, 0xd1, 0x40, 0xbf, 0xed, 0xde, 0x50, 0xbe, 0x78, 0xb4, 0x27, 0xbd,
- 0xdc, 0xf0, 0x2d, 0x3e, 0x7d, 0x80, 0x1c, 0x3f, 0xba, 0x0c, 0x42, 0xbe,
- 0x21, 0x95, 0xc4, 0x3c, 0x3d, 0xe1, 0x25, 0x3e, 0x6c, 0xf4, 0xac, 0x3e,
- 0x90, 0xb7, 0x64, 0xbe, 0xc8, 0xa9, 0x6f, 0xbd, 0xf8, 0xcd, 0x06, 0xbf,
- 0xfe, 0x59, 0xf0, 0xbd, 0xa9, 0x69, 0x3d, 0x3f, 0x5d, 0x75, 0xf7, 0xbe,
- 0x07, 0x7e, 0x20, 0xbf, 0xb9, 0xea, 0x04, 0x3e, 0x10, 0x7b, 0x01, 0x3e,
- 0x5b, 0xa3, 0x4e, 0x3d, 0x79, 0xcb, 0xc6, 0x3e, 0x71, 0xd6, 0xf6, 0xbe,
- 0xc9, 0x6b, 0x11, 0x3c, 0xf9, 0xe9, 0x20, 0x3f, 0xc5, 0x31, 0x18, 0x3f,
- 0xe5, 0x84, 0xba, 0x3e, 0x53, 0xba, 0x57, 0xbc, 0x9d, 0x2e, 0xca, 0xbe,
- 0x3f, 0x02, 0x09, 0x3f, 0xc3, 0x69, 0xbb, 0xbe, 0x5b, 0xd7, 0xe6, 0xbe,
- 0x7c, 0x6b, 0x8c, 0x3e, 0x30, 0x8c, 0x97, 0x3e, 0x7f, 0x73, 0x11, 0x3d,
- 0x9a, 0x74, 0xf4, 0x3e, 0x3b, 0x96, 0xee, 0xbe, 0xfa, 0x4e, 0x13, 0x3f,
- 0xb1, 0x2d, 0x28, 0xbf, 0x4c, 0x91, 0x0a, 0xbf, 0x54, 0x87, 0x5e, 0xbe,
- 0x8b, 0xcf, 0x89, 0x3e, 0x18, 0xb6, 0xfa, 0xbd, 0xe4, 0x23, 0x4d, 0xbf,
- 0x89, 0xd9, 0x83, 0xbd, 0x3b, 0xc5, 0x1a, 0x3f, 0xde, 0x7b, 0x07, 0x3f,
- 0x07, 0xa1, 0xc1, 0x3d, 0xd9, 0x63, 0x25, 0xbc, 0x73, 0x37, 0x8f, 0xbc,
- 0xed, 0xb0, 0x1f, 0x3f, 0x7a, 0x38, 0xdd, 0xbd, 0xd4, 0x07, 0xbd, 0x3e,
- 0xfe, 0x8e, 0x79, 0x3d, 0x37, 0xd9, 0x92, 0x3e, 0xea, 0xf2, 0x92, 0xbe,
- 0xce, 0x7b, 0x89, 0x3d, 0x22, 0x76, 0x5b, 0x3e, 0x9b, 0xb6, 0xd3, 0xbd,
- 0xd4, 0xcd, 0x80, 0xbe, 0x93, 0xf2, 0x31, 0xbe, 0x89, 0x9b, 0x0e, 0x3d,
- 0x05, 0x90, 0x98, 0x3e, 0x8b, 0x72, 0x3d, 0xbe, 0xca, 0x7e, 0xaa, 0xbd,
- 0x4e, 0x2b, 0x09, 0x3d, 0x15, 0x0f, 0x60, 0xbe, 0xcf, 0x10, 0x43, 0x3e,
- 0x61, 0x6b, 0xb3, 0xbd, 0x08, 0x25, 0xe2, 0xbd, 0x40, 0x9b, 0x84, 0x3e,
- 0xb9, 0xa5, 0x56, 0x3c, 0x3e, 0xce, 0x39, 0x3d, 0x53, 0xc8, 0xfb, 0xbe,
- 0xc5, 0x0a, 0x8c, 0x3e, 0xa3, 0x73, 0x85, 0x3e, 0x71, 0xa9, 0xf2, 0xbc,
- 0xec, 0xce, 0xbe, 0xbe, 0xa4, 0xea, 0xd3, 0x3d, 0x8a, 0x1c, 0x52, 0xbe,
- 0xf9, 0x6d, 0x0c, 0xbe, 0x01, 0xee, 0x44, 0xbd, 0xd6, 0x12, 0x0c, 0x3e,
- 0x52, 0x0e, 0x88, 0x3e, 0xa8, 0x84, 0x1b, 0x3c, 0x49, 0x7b, 0x0c, 0x3e,
- 0xe4, 0x2d, 0x84, 0x3d, 0x67, 0x3e, 0x2e, 0xbd, 0xa9, 0x91, 0xf7, 0x3d,
- 0xd2, 0xc7, 0x01, 0xbe, 0x6a, 0x29, 0xd5, 0xbe, 0x67, 0x54, 0x77, 0x3e,
- 0x8f, 0xcc, 0xda, 0xbd, 0xac, 0x3b, 0xb0, 0xbd, 0xb2, 0x73, 0xdb, 0xbe,
- 0x9b, 0x73, 0x03, 0xbf, 0xa6, 0x54, 0x98, 0x3d, 0xfb, 0x42, 0x00, 0xbe,
- 0xa6, 0x77, 0x80, 0xbe, 0xf3, 0xcf, 0xc7, 0xbd, 0x87, 0xec, 0x79, 0xbe,
- 0x7f, 0xda, 0xda, 0x3c, 0xc3, 0x5f, 0xa3, 0xbd, 0x72, 0x37, 0x04, 0x3e,
- 0x61, 0x03, 0x41, 0xbd, 0x47, 0xdb, 0xd6, 0xbd, 0x74, 0x43, 0xb2, 0xba,
- 0x5d, 0x3c, 0x4e, 0x3e, 0x2b, 0x06, 0xc6, 0x3d, 0x44, 0x50, 0x89, 0xbd,
- 0x57, 0x70, 0x02, 0x3d, 0x22, 0xb9, 0x6a, 0xbe, 0x91, 0x0d, 0xf6, 0xbb,
- 0xa2, 0x63, 0x1e, 0x3e, 0xb3, 0x23, 0xb5, 0x3b, 0x87, 0x17, 0xad, 0x3e,
- 0x5a, 0x10, 0xbf, 0x3c, 0x1a, 0x20, 0xde, 0xbd, 0x3d, 0x85, 0x1b, 0x3d,
- 0xcc, 0x5d, 0x33, 0x3e, 0x94, 0x1b, 0x0f, 0xbd, 0x5c, 0x2b, 0x13, 0x3d,
- 0x89, 0x3f, 0x47, 0xbe, 0x5c, 0xb4, 0x96, 0xbd, 0x88, 0x27, 0xc6, 0x3e,
- 0x27, 0x3f, 0x98, 0x3e, 0x12, 0x3b, 0xcd, 0x3d, 0x39, 0xd5, 0x90, 0x3c,
- 0xdd, 0x37, 0x32, 0xbe, 0x18, 0xda, 0x3b, 0xbe, 0x0f, 0x39, 0x2a, 0x3f,
- 0x6f, 0xd2, 0xf2, 0xbe, 0x3a, 0x89, 0xcc, 0xbd, 0x8d, 0xa9, 0x40, 0xbe,
- 0x7e, 0xcc, 0xf6, 0x3d, 0xac, 0x4e, 0xd2, 0xbc, 0x4f, 0xb3, 0x36, 0x3c,
- 0xe3, 0x4c, 0x77, 0xbd, 0x4b, 0xe0, 0x9d, 0xbc, 0x22, 0xfb, 0x5b, 0xbe,
- 0xdb, 0x27, 0xa6, 0xbd, 0x56, 0x83, 0x47, 0xbe, 0x10, 0x55, 0x93, 0x3e,
- 0x52, 0xe0, 0x82, 0xbe, 0xdf, 0xb2, 0x34, 0x3d, 0x71, 0x62, 0x85, 0xbe,
- 0xd8, 0x12, 0xb8, 0x3e, 0xd8, 0xc6, 0x46, 0x3d, 0x97, 0x89, 0xc7, 0xbc,
- 0x94, 0xb7, 0x96, 0xbd, 0xa9, 0xbf, 0xf8, 0xbe, 0xab, 0xe1, 0x89, 0xbd,
- 0x46, 0x2f, 0x59, 0x3b, 0xac, 0xbe, 0xa5, 0x3e, 0x32, 0xb3, 0x6b, 0xbd,
- 0x19, 0xf4, 0xcb, 0xbd, 0xbc, 0x9e, 0x2d, 0x3e, 0x0b, 0x7e, 0xe7, 0xbc,
- 0xa1, 0xa3, 0x14, 0xbe, 0xfe, 0xa3, 0xb9, 0xbd, 0x71, 0x10, 0xfb, 0xbb,
- 0xed, 0x38, 0x84, 0xbc, 0x2e, 0xaf, 0x7a, 0xbd, 0xc3, 0x7e, 0x63, 0xbe,
- 0x3a, 0x7d, 0xf9, 0x3d, 0xa4, 0xe4, 0xdb, 0xbd, 0x7a, 0x50, 0xab, 0xbd,
- 0x47, 0xec, 0x73, 0xbe, 0x48, 0x52, 0x05, 0xbe, 0x25, 0xe2, 0x66, 0xbd,
- 0x57, 0xe2, 0xdd, 0x3d, 0x4f, 0x9a, 0x31, 0xbe, 0x9c, 0xaa, 0x04, 0xbe,
- 0x65, 0x42, 0x90, 0x3e, 0x0a, 0x62, 0x9b, 0x3e, 0xf9, 0xa1, 0xc7, 0xbc,
- 0xb4, 0x95, 0xc1, 0xbd, 0xe2, 0xee, 0x89, 0xbd, 0x1a, 0xc1, 0xa1, 0x3d,
- 0xb0, 0xbc, 0xa5, 0xbe, 0xc8, 0x44, 0x8a, 0x3d, 0x9e, 0xe6, 0xc8, 0x3d,
- 0x00, 0xc4, 0x8c, 0x3e, 0xe5, 0x36, 0xcb, 0xbd, 0x94, 0x74, 0xf8, 0x3d,
- 0x3a, 0x8d, 0xbf, 0xbe, 0x33, 0xf6, 0xef, 0xbd, 0x7f, 0x7c, 0x3e, 0xbe,
- 0xfd, 0x87, 0x91, 0xbd, 0x92, 0x77, 0xe9, 0x3d, 0xd0, 0x96, 0x9f, 0x3d,
- 0x2f, 0xca, 0x15, 0xbe, 0x28, 0x94, 0x40, 0x3e, 0x7a, 0x1c, 0xa1, 0x3e,
- 0x42, 0x96, 0xb7, 0xbe, 0x34, 0x4f, 0x93, 0x3d, 0x31, 0x03, 0xc8, 0xbd,
- 0x3a, 0xc1, 0x1c, 0x3e, 0x34, 0x5f, 0x09, 0xbe, 0x15, 0xc0, 0x92, 0xbd,
- 0xbb, 0x4e, 0x3d, 0x3d, 0x45, 0x07, 0x40, 0xbd, 0x63, 0x92, 0xe1, 0x3d,
- 0xda, 0xe6, 0xda, 0x3c, 0x8c, 0xc5, 0x93, 0x3e, 0x70, 0x53, 0x24, 0x3d,
- 0x90, 0x36, 0x1f, 0xbe, 0xe8, 0x3a, 0xe5, 0xbd, 0xa4, 0xf1, 0x12, 0x3e,
- 0xb5, 0x72, 0x31, 0xbe, 0xf7, 0x47, 0xa0, 0x3e, 0x40, 0x7e, 0x14, 0xbf,
- 0xf6, 0xce, 0x81, 0xbe, 0x92, 0xd0, 0x0a, 0xbd, 0x9d, 0x8d, 0xb7, 0x3d,
- 0x85, 0x5a, 0xa0, 0x3d, 0xb7, 0x5a, 0x3f, 0xbe, 0x27, 0x6b, 0xc0, 0x3c,
- 0x4a, 0x66, 0x05, 0xbe, 0x54, 0x28, 0x7e, 0x3e, 0x48, 0x80, 0x46, 0xbe,
- 0xf0, 0xe9, 0x70, 0x3c, 0x47, 0x51, 0x94, 0xbe, 0x76, 0xeb, 0xf2, 0x3d,
- 0x3e, 0xd0, 0x84, 0xbd, 0x7d, 0x49, 0xaf, 0x3c, 0x26, 0x8e, 0xf7, 0xbd,
- 0x87, 0xd4, 0xa3, 0x3d, 0x91, 0x0d, 0xd1, 0xbe, 0x86, 0x58, 0x23, 0x3d,
- 0xc0, 0x6a, 0x74, 0xbe, 0xca, 0x79, 0x27, 0xbe, 0x2b, 0xc6, 0x82, 0x3e,
- 0x86, 0x0f, 0x54, 0x3c, 0x49, 0xb2, 0x81, 0x3e, 0x5f, 0xdc, 0x99, 0xbe,
- 0x9b, 0x15, 0x90, 0x3e, 0xfa, 0x77, 0x9b, 0x3d, 0x9b, 0x20, 0x21, 0xbe,
- 0x99, 0xe6, 0x33, 0xbe, 0xb4, 0x1c, 0x37, 0xbd, 0x73, 0xfc, 0x93, 0x3e,
- 0xcf, 0xd4, 0x54, 0x3e, 0xa8, 0x88, 0x7e, 0xbd, 0x59, 0xb6, 0xe4, 0xbb,
- 0xd9, 0x40, 0xad, 0x3e, 0x17, 0x5c, 0x71, 0xbc, 0x24, 0x6c, 0x4d, 0x3d,
- 0x71, 0xca, 0x00, 0xbf, 0xb8, 0x22, 0x27, 0xbe, 0x29, 0xf9, 0xf3, 0x3c,
- 0x47, 0x2b, 0x36, 0xbe, 0xa1, 0x3d, 0x3d, 0x3d, 0x50, 0x01, 0xcc, 0xbc,
- 0x1d, 0xc8, 0xea, 0xba, 0x49, 0x19, 0x3f, 0xbe, 0x66, 0xaf, 0xea, 0xbd,
- 0x8d, 0xae, 0x89, 0x3c, 0x33, 0x21, 0x39, 0xbe, 0x32, 0x97, 0x0a, 0xbe,
- 0x9e, 0xc9, 0xc9, 0xbd, 0x49, 0x75, 0x6f, 0x3e, 0xcb, 0x5b, 0x4c, 0x3d,
- 0x78, 0x29, 0x9a, 0x3d, 0xc1, 0xe9, 0xc0, 0x3e, 0x66, 0x8d, 0x37, 0x3e,
- 0x66, 0x33, 0x6c, 0xbe, 0x03, 0x16, 0x43, 0xbd, 0x14, 0xfa, 0xbe, 0x3d,
- 0x3c, 0x85, 0x4e, 0x3e, 0xbf, 0x36, 0x16, 0x3e, 0xc3, 0xf8, 0x05, 0x3e,
- 0x43, 0x97, 0x45, 0xbd, 0xc0, 0x1b, 0x04, 0x3e, 0xf7, 0xc1, 0xd9, 0xbd,
- 0x7b, 0xfd, 0x74, 0x3d, 0xd7, 0x26, 0x14, 0xbd, 0x46, 0x3d, 0xac, 0x3c,
- 0xf4, 0x4a, 0x2d, 0xbe, 0x2f, 0xe1, 0x1a, 0xbe, 0x9e, 0xbf, 0x0e, 0xbd,
- 0xd9, 0x0a, 0x96, 0x3d, 0x06, 0xea, 0xd9, 0xbc, 0xfe, 0x5c, 0x05, 0xbd,
- 0x5d, 0x52, 0x9f, 0xbe, 0x1a, 0x19, 0x66, 0xbe, 0x09, 0x1e, 0x04, 0xbe,
- 0x43, 0x8c, 0x98, 0xbd, 0x48, 0xf2, 0xc7, 0xbd, 0xda, 0xf3, 0xdb, 0xbd,
- 0x08, 0xda, 0x2f, 0x3f, 0xba, 0x8d, 0xe6, 0xbe, 0x9e, 0x41, 0x9d, 0xbd,
- 0x5d, 0x63, 0xd1, 0xbc, 0xd2, 0x5d, 0x8d, 0xbd, 0xff, 0x6c, 0xbf, 0x3e,
- 0x63, 0x48, 0x60, 0x3f, 0xe1, 0xb4, 0xb9, 0xbd, 0x31, 0xda, 0x30, 0xbf,
- 0xde, 0x68, 0x6b, 0xbf, 0x2c, 0x1d, 0xd5, 0x3e, 0x62, 0x82, 0xa1, 0x3e,
- 0x5c, 0xd5, 0x64, 0x3f, 0x60, 0xa1, 0x4f, 0xbf, 0x47, 0xa2, 0x33, 0xbf,
- 0xef, 0xe3, 0x24, 0xbf, 0xd6, 0xc3, 0x08, 0x3f, 0xbe, 0x8d, 0x9e, 0x3e,
- 0x21, 0x8d, 0x86, 0xbe, 0x85, 0x09, 0x89, 0xbe, 0x1a, 0x11, 0x42, 0xbf,
- 0x3d, 0x9c, 0x24, 0xbf, 0x63, 0xc0, 0xcc, 0xbe, 0x63, 0x23, 0xab, 0x3e,
- 0xfa, 0x3d, 0x15, 0xbe, 0xd8, 0xab, 0x9a, 0xbe, 0x11, 0x3e, 0x6b, 0x3e,
- 0x3d, 0x98, 0xf4, 0xbe, 0x41, 0x9a, 0x90, 0x3d, 0x8d, 0x01, 0x05, 0x3f,
- 0xe6, 0x69, 0x8c, 0xbf, 0x52, 0x97, 0x9a, 0xbf, 0x4e, 0x9d, 0x36, 0x3a,
- 0x29, 0x81, 0x02, 0x3f, 0x34, 0x22, 0xf3, 0x3e, 0xab, 0xd0, 0xb7, 0x3e,
- 0xf5, 0x72, 0x64, 0xbe, 0xa7, 0x82, 0xa3, 0x3e, 0x99, 0xb5, 0x92, 0xbe,
- 0x5f, 0x37, 0x55, 0xbf, 0x9a, 0xb4, 0xad, 0x3e, 0xdd, 0xbe, 0x52, 0x3d,
- 0xeb, 0xb6, 0xb8, 0x3e, 0xea, 0x28, 0xb2, 0xbe, 0x93, 0xc6, 0x7f, 0x3e,
- 0xdc, 0x9d, 0x0a, 0x3f, 0xad, 0x9a, 0xab, 0xbe, 0xec, 0x76, 0xf4, 0xbe,
- 0xdc, 0x38, 0xa6, 0xbe, 0x47, 0x10, 0x9b, 0x3d, 0xea, 0x7d, 0x2e, 0x3e,
- 0x3b, 0x28, 0x34, 0xbf, 0xbc, 0x06, 0x71, 0xbf, 0x34, 0x2f, 0x9b, 0xbe,
- 0xdf, 0x6e, 0xc4, 0x3d, 0x23, 0x32, 0x35, 0x3e, 0x50, 0x3c, 0x02, 0xbf,
- 0xed, 0x54, 0xc0, 0xbe, 0xf8, 0x7d, 0x15, 0x3e, 0x3b, 0xcb, 0xf0, 0x3e,
- 0xf9, 0x65, 0x5e, 0xbe, 0x05, 0x8a, 0x57, 0xbe, 0xb5, 0xa8, 0x59, 0xbf,
- 0x1a, 0x73, 0x32, 0x3e, 0x6e, 0xfd, 0xc8, 0x3e, 0xa1, 0xf6, 0x1e, 0x3d,
- 0x37, 0xcb, 0x27, 0xbe, 0xaa, 0xf4, 0x0a, 0xbe, 0xda, 0x66, 0xc3, 0x3e,
- 0xf9, 0x43, 0xa7, 0xbf, 0x07, 0x9a, 0x16, 0xbd, 0xdf, 0xc0, 0x0b, 0x3f,
- 0x5b, 0xc7, 0x5f, 0xbe, 0xf6, 0x3e, 0xbe, 0xbd, 0xe2, 0x7d, 0x87, 0xbe,
- 0x58, 0xb2, 0x88, 0x3c, 0x6a, 0x64, 0x9d, 0x3f, 0x75, 0xd4, 0xd6, 0xbe,
- 0x8e, 0xa3, 0xf2, 0x3d, 0xeb, 0xf1, 0xb2, 0x3b, 0xdd, 0xea, 0x13, 0xbd,
- 0x62, 0xeb, 0xc4, 0x3d, 0xb2, 0x88, 0x8e, 0x3f, 0x89, 0x9c, 0x84, 0x3e,
- 0xd2, 0x64, 0xf1, 0xbd, 0x51, 0x6d, 0x22, 0x3e, 0x89, 0x3a, 0xd7, 0x3c,
- 0xd8, 0x40, 0x87, 0x3f, 0xea, 0xb2, 0x57, 0xbf, 0x2c, 0x7f, 0xb9, 0xbe,
- 0xc6, 0xd7, 0x0b, 0x3f, 0x58, 0x5b, 0x0b, 0xbf, 0xe3, 0x54, 0x6b, 0xb9,
- 0x1b, 0xa9, 0x55, 0xbf, 0x41, 0xf4, 0x3b, 0xbe, 0x8a, 0x01, 0x6b, 0x3d,
- 0xac, 0x02, 0x55, 0x3e, 0xb6, 0x2a, 0x9b, 0x3e, 0x79, 0x30, 0xb5, 0xbe,
- 0xa0, 0xb5, 0x5d, 0xbf, 0x1a, 0x0b, 0x79, 0x3f, 0x51, 0xa8, 0x81, 0x3d,
- 0x76, 0xe5, 0x02, 0xbd, 0x79, 0x66, 0x22, 0xbe, 0xec, 0x54, 0x70, 0x3c,
- 0x55, 0xc8, 0x76, 0x3b, 0xf9, 0xde, 0xdf, 0xbe, 0x14, 0xe3, 0x38, 0xbe,
- 0xca, 0x08, 0x28, 0x3f, 0x7f, 0xd0, 0x17, 0x3e, 0x72, 0x49, 0x35, 0xbe,
- 0xa2, 0x4f, 0x98, 0x3e, 0x3b, 0x85, 0x3b, 0xbf, 0x36, 0x01, 0xdb, 0x3d,
- 0xe3, 0x48, 0x5b, 0xbe, 0xaa, 0xbd, 0x77, 0xbd, 0x9e, 0x12, 0x36, 0xbd,
- 0x42, 0xb6, 0x1f, 0xbe, 0x41, 0x17, 0x76, 0xbe, 0x7a, 0x6e, 0x1b, 0x3e,
- 0xf7, 0xd6, 0xf5, 0x3d, 0xf8, 0x7d, 0x5e, 0xbd, 0xa1, 0xf1, 0x9b, 0x3d,
- 0xe5, 0xaa, 0x07, 0xbe, 0x2c, 0x8f, 0xc1, 0xbd, 0xb1, 0x8a, 0x32, 0x3d,
- 0xee, 0x30, 0x29, 0xbe, 0x45, 0x86, 0x46, 0x3e, 0x61, 0x0b, 0x05, 0xbe,
- 0xa4, 0x74, 0xda, 0xbe, 0xd1, 0x8a, 0x33, 0x3d, 0xc6, 0x6f, 0xf9, 0x3d,
- 0x6c, 0xf0, 0xbc, 0xbc, 0x53, 0xb8, 0x1a, 0x3e, 0xbe, 0x72, 0x73, 0x3e,
- 0xf3, 0x49, 0x60, 0x3d, 0xa0, 0xa8, 0xc0, 0xbe, 0x5a, 0x63, 0x9a, 0x3c,
- 0xf4, 0x10, 0x12, 0xbe, 0x34, 0x1b, 0x12, 0x3d, 0x13, 0x74, 0xed, 0xbd,
- 0x13, 0xcd, 0xa8, 0x3e, 0x5f, 0xff, 0x2a, 0xbe, 0xe9, 0x7b, 0xd1, 0xbd,
- 0xf9, 0xa4, 0x8a, 0xbe, 0x50, 0xb9, 0x2d, 0x3d, 0x39, 0x6d, 0xbe, 0x3c,
- 0x74, 0xa0, 0x3a, 0xbc, 0xfc, 0x19, 0xad, 0x3d, 0xba, 0xbb, 0xae, 0x3d,
- 0x6a, 0xe0, 0x0f, 0xbe, 0x0d, 0x29, 0xc8, 0xbe, 0xa6, 0x2a, 0x02, 0xbe,
- 0x3e, 0x13, 0x41, 0x3d, 0x77, 0xb1, 0x6d, 0xbd, 0x03, 0x14, 0x48, 0x3c,
- 0x9b, 0xab, 0x26, 0xbb, 0xf2, 0x53, 0x1e, 0x3e, 0x9a, 0xcf, 0xd9, 0x3d,
- 0x34, 0x20, 0x59, 0x3e, 0x97, 0x4b, 0x9f, 0x3c, 0xc5, 0xca, 0x13, 0x3d,
- 0xbe, 0x3a, 0x7e, 0xbe, 0x25, 0x09, 0x83, 0xbe, 0x36, 0x62, 0x06, 0x3e,
- 0x6e, 0xcf, 0xa6, 0xbe, 0xa2, 0xe9, 0xd2, 0xbd, 0xd5, 0xe9, 0x5d, 0x3e,
- 0x14, 0x55, 0x48, 0xbe, 0xd1, 0x15, 0x09, 0xbe, 0x40, 0x0b, 0x3e, 0xbe,
- 0xf6, 0x48, 0xce, 0x3d, 0xda, 0x70, 0xd6, 0xbd, 0x0c, 0xf8, 0x4f, 0x3c,
- 0x0d, 0xd8, 0x13, 0x3d, 0x62, 0x5f, 0xb1, 0x3d, 0xa4, 0xa9, 0x50, 0xbe,
- 0x25, 0xb1, 0x0c, 0xbe, 0x8b, 0x98, 0x2b, 0x3e, 0x3b, 0x70, 0x24, 0x3d,
- 0xeb, 0x2d, 0xd5, 0xbc, 0x41, 0x8a, 0xd0, 0xbb, 0x1c, 0x23, 0x8d, 0x3d,
- 0x93, 0x30, 0x1b, 0x3d, 0x65, 0x61, 0x02, 0x3e, 0xb5, 0x63, 0x26, 0xbe,
- 0x69, 0x82, 0x4f, 0xbe, 0x75, 0xcd, 0xeb, 0x3d, 0xde, 0x0d, 0x31, 0xbd,
- 0x54, 0xef, 0xa8, 0xbb, 0xe5, 0xc4, 0x6f, 0x3d, 0x45, 0xa6, 0x9b, 0x3d,
- 0xd9, 0x6c, 0xd6, 0xbe, 0xb8, 0xd7, 0x57, 0x3e, 0x81, 0xbf, 0xe2, 0x3d,
- 0xed, 0x7a, 0xb0, 0xbb, 0x5e, 0xa4, 0xdf, 0xbd, 0x2d, 0x18, 0x99, 0xbd,
- 0x52, 0x07, 0xbe, 0x3d, 0xb9, 0x1e, 0x0f, 0xbe, 0xab, 0x0c, 0x01, 0x3e,
- 0x94, 0x3c, 0xe1, 0xbd, 0x0c, 0x5a, 0xf7, 0x3b, 0x33, 0xb3, 0x07, 0xbe,
- 0xbf, 0x2c, 0xbc, 0xbd, 0x57, 0xb8, 0x98, 0xbd, 0x75, 0x1e, 0x20, 0xbb,
- 0x48, 0x3c, 0x3d, 0xbe, 0x79, 0x28, 0x91, 0x3d, 0x87, 0x9e, 0xa5, 0x3c,
- 0xa8, 0x3a, 0xaf, 0x3d, 0xdb, 0xa5, 0x1f, 0xbb, 0xaf, 0xd8, 0xe3, 0xbe,
- 0xa1, 0xf5, 0x23, 0xbe, 0xf4, 0xdf, 0x88, 0x3e, 0x09, 0xd7, 0x88, 0x3d,
- 0x0b, 0x38, 0x73, 0xbd, 0x6e, 0xd0, 0x3d, 0xbe, 0x4c, 0x9f, 0x66, 0x3e,
- 0x6f, 0xf8, 0xab, 0xbe, 0xd5, 0x72, 0x9a, 0xbd, 0x75, 0xaf, 0x75, 0xbd,
- 0x8c, 0x27, 0x24, 0xbd, 0x03, 0x14, 0xda, 0x3d, 0xef, 0xc7, 0x86, 0x3d,
- 0x09, 0x2c, 0xae, 0x3d, 0x96, 0x0b, 0xe9, 0xbd, 0xc0, 0x64, 0x62, 0x3d,
- 0x4e, 0x0c, 0xaa, 0x3e, 0xca, 0x45, 0x51, 0xbe, 0xe1, 0xaf, 0x8c, 0x3d,
- 0x6f, 0x24, 0x06, 0x3e, 0xdf, 0xec, 0xe3, 0xbc, 0x5f, 0x5c, 0xb0, 0xbe,
- 0x42, 0x6b, 0x15, 0xbf, 0xee, 0x2f, 0xc2, 0x3f, 0x71, 0xad, 0x80, 0x3d,
- 0xa9, 0xc7, 0x9c, 0x3f, 0xb1, 0xa4, 0x97, 0xbd, 0x5c, 0xd3, 0x4b, 0x3f,
- 0xcb, 0xfb, 0x82, 0x3e, 0x53, 0x0f, 0xaa, 0x3e, 0x09, 0x26, 0x16, 0xbf,
- 0x76, 0x11, 0xa1, 0xbf, 0x6b, 0xba, 0xf7, 0x3e, 0x1f, 0x83, 0x01, 0xbf,
- 0x44, 0xd5, 0x81, 0x3a, 0xf0, 0x54, 0xd4, 0x3e, 0xbd, 0xdc, 0x70, 0xbe,
- 0x6b, 0xed, 0x26, 0xbe, 0x96, 0xb1, 0x38, 0xbd, 0x63, 0xd7, 0xc4, 0xbe,
- 0xf0, 0x7d, 0x02, 0xbf, 0x8d, 0x85, 0x04, 0xbe, 0x97, 0x56, 0x5c, 0x3f,
- 0xb1, 0x5e, 0xba, 0x3e, 0x24, 0xef, 0x05, 0xbf, 0xcd, 0x49, 0x2a, 0xbe,
- 0x31, 0x5e, 0x97, 0xbd, 0xe0, 0x16, 0x09, 0x3e, 0x90, 0x17, 0x1e, 0xbe,
- 0x30, 0x1c, 0x9c, 0xbf, 0x45, 0xf4, 0x88, 0x3c, 0xfb, 0xe1, 0x0e, 0xbf,
- 0x8e, 0xd0, 0x19, 0x3f, 0x12, 0xf9, 0x85, 0xbf, 0x3d, 0x8e, 0xa7, 0xbd,
- 0x10, 0x57, 0xfb, 0x3e, 0x41, 0xa3, 0x29, 0x3d, 0xe8, 0x41, 0xdd, 0x3d,
- 0x74, 0xa1, 0x1a, 0x3f, 0x6f, 0xb2, 0x83, 0xbe, 0x47, 0x3f, 0x52, 0x3a,
- 0x27, 0xff, 0x46, 0xbe, 0xc7, 0xac, 0x2a, 0xbd, 0x63, 0x4e, 0x84, 0xbd,
- 0x7e, 0x21, 0x92, 0x3e, 0x4f, 0xa6, 0x1f, 0xbe, 0x58, 0xab, 0x93, 0x3f,
- 0xe9, 0x43, 0x96, 0xbe, 0x97, 0x80, 0x54, 0xbd, 0xe6, 0x44, 0xa7, 0x3e,
- 0x19, 0x00, 0x5c, 0x3d, 0x46, 0xdb, 0x00, 0x3e, 0xfa, 0x91, 0x16, 0x3f,
- 0x17, 0x8d, 0xd8, 0x3d, 0x58, 0xce, 0x3a, 0x3f, 0x0a, 0xdf, 0x4c, 0xbc,
- 0xdd, 0x48, 0xe5, 0xbc, 0xd2, 0x52, 0x80, 0x3c, 0xab, 0x71, 0x6a, 0x3d,
- 0xc1, 0x81, 0x05, 0x3e, 0x34, 0xc7, 0x28, 0xbf, 0x6b, 0x1a, 0xaa, 0x3e,
- 0x6f, 0x07, 0xad, 0x3e, 0x5f, 0x51, 0x19, 0xbe, 0x69, 0x0f, 0x34, 0xbe,
- 0x3a, 0xd0, 0x37, 0xbf, 0xe7, 0x3a, 0x28, 0xbe, 0x8b, 0xc0, 0x08, 0xbe,
- 0xb6, 0xe3, 0xa3, 0xbd, 0x92, 0xce, 0x0d, 0x3f, 0xe1, 0x93, 0x08, 0xbe,
- 0x3c, 0x08, 0x8d, 0xbd, 0x24, 0x6b, 0xb4, 0x3c, 0x08, 0xb2, 0xf7, 0x3e,
- 0xb3, 0xbb, 0x8e, 0xbe, 0xf4, 0x2d, 0x76, 0xbb, 0x78, 0x88, 0x29, 0xbf,
- 0x89, 0xc8, 0x54, 0xbe, 0x51, 0xf6, 0x20, 0x3f, 0xfa, 0x41, 0x1b, 0xbf,
- 0x9f, 0xb8, 0x17, 0xbf, 0x36, 0x9c, 0xc3, 0xbd, 0x69, 0xe7, 0xe7, 0xbd,
- 0xed, 0x1f, 0x7a, 0x3d, 0x73, 0x75, 0xd3, 0x3e, 0xc9, 0x93, 0x50, 0xbe,
- 0xe6, 0x80, 0x35, 0xbd, 0x26, 0x09, 0x08, 0x3f, 0x0e, 0x13, 0xbb, 0x3e,
- 0xe6, 0x41, 0x7d, 0x3d, 0x6a, 0x95, 0x54, 0xbe, 0xb1, 0xe3, 0xde, 0xbe,
- 0x50, 0x22, 0x1a, 0x3f, 0x63, 0x3e, 0xd1, 0xbe, 0x2a, 0xf2, 0x8c, 0xbe,
- 0x42, 0xa9, 0x9a, 0x3e, 0x1b, 0x00, 0x89, 0x3e, 0xbc, 0x99, 0xe0, 0xbc,
- 0x26, 0xd0, 0x07, 0x3e, 0x9e, 0xe5, 0x92, 0xbe, 0xfc, 0xec, 0xf5, 0x3e,
- 0x69, 0x03, 0x8d, 0xbe, 0x46, 0x3a, 0x11, 0xbf, 0x89, 0xd5, 0x8a, 0xbe,
- 0x07, 0xd7, 0x82, 0xbd, 0xa7, 0xc0, 0xc0, 0xbd, 0x7d, 0xef, 0x47, 0xbf,
- 0x6f, 0xa5, 0x6a, 0x3d, 0x15, 0x3d, 0x41, 0x3f, 0xff, 0x8e, 0x28, 0x3f,
- 0xcb, 0x79, 0xf5, 0x3d, 0x05, 0x0d, 0x14, 0x3e, 0xe6, 0x21, 0x1b, 0x3e,
- 0x97, 0x72, 0x7f, 0x3f, 0x23, 0x30, 0x90, 0xbe, 0x9e, 0x91, 0xc0, 0x3e,
- 0xe4, 0x86, 0x9e, 0xb9, 0x40, 0x85, 0xbf, 0x3e, 0x8b, 0xb6, 0xf3, 0xbe,
- 0xc7, 0xa8, 0xda, 0x3d, 0xa0, 0x83, 0x8e, 0x3e, 0x29, 0x29, 0x22, 0x3b,
- 0x56, 0xb8, 0x30, 0xbe, 0xb7, 0x80, 0x4a, 0x3c, 0x87, 0x40, 0x94, 0xbc,
- 0x49, 0xa2, 0x97, 0x3e, 0x76, 0x14, 0x08, 0x3e, 0x12, 0xba, 0x68, 0xbd,
- 0x3b, 0xaa, 0x13, 0x3d, 0x97, 0x4b, 0x18, 0xbe, 0x3c, 0xaa, 0x5a, 0x3e,
- 0x85, 0xd0, 0x1a, 0xbb, 0x35, 0x9e, 0xd6, 0xbd, 0xfa, 0x74, 0x76, 0x3e,
- 0xb6, 0xb3, 0x70, 0xbe, 0xb3, 0xfb, 0x92, 0x3c, 0x73, 0x87, 0xb8, 0xbe,
- 0x46, 0xf2, 0xfd, 0x3d, 0xca, 0xc4, 0xe5, 0x3d, 0xe2, 0xfe, 0x5c, 0xbd,
- 0x6a, 0x84, 0x29, 0xbe, 0xb1, 0xb4, 0x83, 0x3d, 0x25, 0xca, 0xbb, 0xbc,
- 0xe7, 0x59, 0xf8, 0xbe, 0xbf, 0xf8, 0xd0, 0xbd, 0xcb, 0xa3, 0xe6, 0x3d,
- 0x5b, 0x87, 0x3b, 0x3d, 0xf9, 0xd8, 0x13, 0x3e, 0x7b, 0x33, 0x31, 0xbd,
- 0xde, 0x72, 0x2e, 0x3e, 0x91, 0x51, 0x41, 0xbd, 0x9a, 0x11, 0x18, 0xbd,
- 0xc3, 0x41, 0x71, 0x3d, 0x04, 0x5a, 0x21, 0xbe, 0xfe, 0xaf, 0x09, 0x3e,
- 0x60, 0x58, 0x08, 0xbe, 0x1f, 0xd6, 0x0c, 0xbe, 0x0a, 0x97, 0x0e, 0x3a,
- 0xb6, 0x3f, 0x8b, 0xbe, 0x7f, 0x45, 0xfa, 0x3b, 0x2f, 0xe1, 0xee, 0x3d,
- 0xfd, 0x5b, 0x90, 0xbe, 0x47, 0xa0, 0x23, 0xbe, 0xcb, 0x11, 0x1f, 0xbd,
- 0x38, 0xe4, 0x10, 0x3d, 0x66, 0x24, 0x0d, 0xbe, 0x40, 0x05, 0x00, 0x3e,
- 0x03, 0x26, 0xe3, 0x3d, 0x21, 0xf2, 0x7d, 0xbe, 0x02, 0x1e, 0x17, 0xbe,
- 0x28, 0x34, 0x35, 0x3d, 0x80, 0x7c, 0x53, 0x3e, 0x10, 0x2f, 0x0e, 0xbe,
- 0x6d, 0x61, 0x84, 0xbd, 0xf0, 0x79, 0xf0, 0xbd, 0xea, 0x05, 0xd4, 0x3d,
- 0xfb, 0xf1, 0xa0, 0xbd, 0x96, 0x04, 0xa5, 0x3b, 0x0d, 0xad, 0xbe, 0x3d,
- 0xbc, 0x32, 0xc4, 0xbc, 0x19, 0x9f, 0xcf, 0xbd, 0x72, 0x6e, 0xe5, 0xbe,
- 0x34, 0x6a, 0x49, 0x3d, 0x4a, 0x2c, 0xed, 0x3d, 0x03, 0x49, 0x22, 0x3d,
- 0x74, 0xa8, 0x0f, 0xbe, 0x61, 0x89, 0x81, 0xbd, 0x46, 0xf1, 0x5c, 0x3e,
- 0x63, 0x88, 0xd2, 0x3d, 0x5f, 0x45, 0x2b, 0xbe, 0x0e, 0xe5, 0xb5, 0xbd,
- 0xee, 0x18, 0x8b, 0xbe, 0xc6, 0xd7, 0x25, 0x3d, 0x79, 0x27, 0xea, 0x3e,
- 0x51, 0x7b, 0x0e, 0xbf, 0xff, 0xc0, 0xc4, 0xbe, 0xd9, 0xeb, 0x29, 0xbe,
- 0xdd, 0x1a, 0x9c, 0x3d, 0xfa, 0xc8, 0x5e, 0xbe, 0x23, 0x8a, 0x9c, 0xbd,
- 0x9b, 0xe2, 0x45, 0xbc, 0x70, 0x9e, 0xc4, 0xbd, 0xd0, 0x74, 0x10, 0xbe,
- 0x22, 0x31, 0x7a, 0x3d, 0xd1, 0x77, 0x43, 0xbe, 0xb6, 0x27, 0xd5, 0x3e,
- 0xd7, 0x1d, 0xfd, 0x3d, 0x24, 0xfc, 0x1c, 0xbe, 0xd7, 0x95, 0x51, 0xbd,
- 0x69, 0xf5, 0xca, 0x3e, 0xa8, 0x33, 0xaa, 0xbd, 0xe7, 0x4b, 0x4e, 0x3d,
- 0x1e, 0xa3, 0x26, 0x3e, 0x8c, 0x01, 0x1d, 0xbf, 0x0b, 0x7f, 0x33, 0x3e,
- 0x1e, 0x61, 0xb9, 0x3d, 0x40, 0x95, 0x73, 0x3e, 0xfa, 0x49, 0x0d, 0xbe,
- 0xaf, 0xde, 0x1b, 0xbe, 0x3b, 0x0c, 0x8c, 0x3e, 0x6e, 0xe6, 0x3f, 0xbe,
- 0x4a, 0x83, 0xc5, 0xbe, 0xda, 0x1c, 0xbe, 0xbd, 0xd2, 0x86, 0x2c, 0xbe,
- 0x04, 0xf2, 0x09, 0xbe, 0x0f, 0x02, 0x08, 0x3e, 0x75, 0x9a, 0x99, 0xbe,
- 0xb0, 0x67, 0xc5, 0x3d, 0xe2, 0xf6, 0xf3, 0xbd, 0x68, 0xbf, 0x24, 0xbe,
- 0xef, 0x41, 0xe6, 0xbe, 0xf7, 0x54, 0xfe, 0x3d, 0xf4, 0x77, 0xb7, 0x3c,
- 0x27, 0x30, 0xc0, 0xbd, 0xe4, 0x10, 0x12, 0x3e, 0xab, 0x8a, 0x0a, 0xbf,
- 0x91, 0x79, 0x5f, 0x3d, 0xed, 0x6f, 0xad, 0x3e, 0x15, 0xd4, 0xb6, 0xbd,
- 0x29, 0x8a, 0x93, 0xbd, 0xa7, 0x01, 0x13, 0xbe, 0xf6, 0x62, 0x44, 0x3e,
- 0xb9, 0xc6, 0x42, 0xbe, 0x05, 0x64, 0x1f, 0x3e, 0x7c, 0xcb, 0xff, 0xbc,
- 0x50, 0x37, 0xd2, 0x3d, 0x29, 0x6f, 0x23, 0x3e, 0xe6, 0x08, 0x75, 0x3e,
- 0x36, 0x66, 0x54, 0xbe, 0x9d, 0xaa, 0xfe, 0xbd, 0xe5, 0x8d, 0x28, 0xbe,
- 0x12, 0x5b, 0x36, 0xbd, 0x56, 0x40, 0x06, 0xbe, 0x6b, 0x07, 0x5c, 0xbb,
- 0xcf, 0x7f, 0x91, 0xbc, 0xeb, 0x90, 0x26, 0x3e, 0x5a, 0xbe, 0xfc, 0x3d,
- 0x0c, 0xbc, 0xc4, 0x3c, 0xe9, 0x29, 0x00, 0x3b, 0x3a, 0x0c, 0xc1, 0x3c,
- 0x4a, 0xd4, 0x78, 0x3d, 0x7d, 0xab, 0x1b, 0xbe, 0xc7, 0x9e, 0xd2, 0xbc,
- 0x6e, 0xe4, 0xd6, 0x3d, 0x0d, 0xcb, 0x4b, 0xbc, 0x71, 0x4b, 0xdd, 0x3c,
- 0x6a, 0x59, 0x9b, 0x3d, 0xcf, 0xb4, 0x14, 0x3e, 0xe4, 0xd2, 0xa0, 0xbd,
- 0xc4, 0x08, 0x81, 0xbd, 0x3e, 0xd8, 0x3b, 0xbe, 0xdf, 0x9d, 0x5a, 0x3d,
- 0x1a, 0x1c, 0x67, 0xbe, 0x50, 0xd3, 0x93, 0x3e, 0xd6, 0xf8, 0xfa, 0xbe,
- 0x76, 0x88, 0x25, 0xbe, 0x15, 0x38, 0x03, 0xbd, 0x69, 0x96, 0x3e, 0x3b,
- 0xd3, 0xfc, 0xc0, 0x3d, 0xb0, 0x00, 0x31, 0xbe, 0x39, 0x1d, 0x40, 0x3e,
- 0xec, 0x4f, 0xff, 0xbc, 0x0b, 0x38, 0xa1, 0x3d, 0x6b, 0xe6, 0xd5, 0xbc,
- 0x33, 0x2c, 0x45, 0xbd, 0xd9, 0x34, 0xad, 0xbe, 0xd5, 0x17, 0x7c, 0xbe,
- 0x9d, 0xdb, 0x25, 0x3e, 0x54, 0x3e, 0x02, 0xbe, 0xb4, 0xe9, 0xd0, 0x3d,
- 0x2f, 0x1d, 0x0a, 0x3e, 0xbb, 0xee, 0x01, 0xbf, 0x7d, 0xa2, 0x23, 0x3e,
- 0x22, 0x96, 0x66, 0xbe, 0x37, 0xcd, 0xc3, 0xbd, 0x69, 0x36, 0xf5, 0x3d,
- 0xa6, 0x71, 0x2a, 0xbe, 0x00, 0xf4, 0x7f, 0x3e, 0x8e, 0x35, 0x01, 0xbf,
- 0x99, 0xf7, 0xe9, 0x3d, 0x17, 0xed, 0x02, 0x3e, 0x6b, 0xa1, 0xc2, 0xbd,
- 0x60, 0x92, 0x9a, 0xbd, 0xb5, 0xdb, 0xfb, 0xbc, 0xc0, 0x73, 0x42, 0x3e,
- 0x04, 0x24, 0xc1, 0x3d, 0x02, 0xbe, 0x03, 0xbe, 0x4f, 0x2a, 0x10, 0xbe,
- 0x44, 0x8e, 0xc0, 0x3e, 0x38, 0x36, 0xd2, 0xbb, 0x00, 0xd1, 0x82, 0x3d,
- 0x71, 0x29, 0x03, 0xbf, 0x9b, 0xfb, 0xde, 0xbc, 0xe6, 0xb8, 0x0a, 0x3e,
- 0xe8, 0xc3, 0x78, 0xbe, 0x68, 0x82, 0x00, 0xbd, 0x68, 0x7d, 0x01, 0xbe,
- 0x45, 0xc2, 0xc5, 0xb9, 0x4f, 0x72, 0x68, 0x3c, 0xb0, 0x80, 0xde, 0x3c,
- 0x84, 0x02, 0x3f, 0xbc, 0x08, 0xd2, 0x21, 0xbe, 0x03, 0xb5, 0x57, 0xbe,
- 0x14, 0xa2, 0x76, 0xbc, 0x4a, 0xed, 0x01, 0x3e, 0xe1, 0xb9, 0xd2, 0x3a,
- 0xd3, 0xc9, 0x59, 0x3e, 0x7b, 0xbc, 0xbb, 0x3e, 0x75, 0xac, 0x05, 0x3e,
- 0xd8, 0xca, 0x66, 0xbd, 0x6e, 0xb6, 0x0c, 0x3e, 0xb8, 0x7c, 0x0c, 0x3d,
- 0x01, 0x57, 0xf5, 0x3e, 0xa7, 0x58, 0x26, 0x3d, 0x75, 0xc6, 0x69, 0xbc,
- 0xa6, 0x4c, 0xf1, 0xbe, 0xea, 0x53, 0x05, 0x3d, 0xe9, 0x34, 0x89, 0xbc,
- 0xf4, 0xba, 0x77, 0xbe, 0xc1, 0xe2, 0x89, 0xbb, 0x4b, 0xcb, 0x0e, 0xbe,
- 0xd0, 0x33, 0x97, 0x3d, 0x11, 0x72, 0x11, 0x3e, 0xe4, 0xa9, 0x9d, 0xbd,
- 0xb4, 0x6c, 0x92, 0x3c, 0xf1, 0xc9, 0x46, 0x3d, 0x43, 0x89, 0xdb, 0xbd,
- 0x76, 0x3a, 0xdb, 0xbe, 0xdc, 0xd6, 0x2d, 0x3e, 0xa0, 0xe0, 0x64, 0xbd,
- 0x78, 0x35, 0x1d, 0x3d, 0xc6, 0x1e, 0xe8, 0x3d, 0xfa, 0x4c, 0x46, 0xbe,
- 0x3e, 0xb3, 0x88, 0x3e, 0x5b, 0x31, 0x98, 0xbe, 0x1e, 0xb1, 0x30, 0xbe,
- 0xdb, 0x79, 0x6f, 0x3e, 0x7d, 0xc8, 0x52, 0xbd, 0xa3, 0x22, 0x0a, 0x3f,
- 0x7c, 0x72, 0x0d, 0x3f, 0xba, 0x23, 0xd6, 0xbd, 0x33, 0x19, 0xdd, 0xbe,
- 0xf7, 0xb5, 0x57, 0xbe, 0x79, 0x40, 0x77, 0x3d, 0x6e, 0xdc, 0x1e, 0x3d,
- 0x43, 0x85, 0xb9, 0x3e, 0xbb, 0xf6, 0x28, 0xbf, 0x97, 0xbb, 0x14, 0xbf,
- 0x22, 0x7c, 0x8a, 0x3e, 0x04, 0xd7, 0x81, 0xbd, 0x4b, 0x4b, 0xbe, 0x3e,
- 0x65, 0xd5, 0x0f, 0xbf, 0x14, 0x84, 0xcc, 0x3e, 0x13, 0xc0, 0xd4, 0xbe,
- 0x1b, 0x1b, 0x11, 0xbf, 0xca, 0x03, 0x08, 0xbe, 0x08, 0x11, 0x1b, 0xbe,
- 0xb3, 0x4d, 0xec, 0x3e, 0x8c, 0x2e, 0x96, 0xbe, 0x29, 0xc8, 0x7e, 0xbe,
- 0x99, 0xff, 0xea, 0x3e, 0x1e, 0x42, 0x1d, 0x3d, 0xe1, 0x1d, 0xac, 0x3d,
- 0xca, 0x8b, 0x16, 0xbf, 0xd8, 0xec, 0xfb, 0xbe, 0x27, 0xaf, 0x54, 0xbe,
- 0xef, 0x52, 0x28, 0xbe, 0x6e, 0x48, 0x7e, 0xbe, 0x0b, 0x06, 0x86, 0x3e,
- 0x35, 0x82, 0x09, 0x3f, 0x54, 0x05, 0x1b, 0x3d, 0x5a, 0xe3, 0x1a, 0x3f,
- 0x97, 0xc1, 0xbc, 0xbf, 0xcb, 0x22, 0x33, 0x3e, 0x06, 0x1b, 0x06, 0xbe,
- 0xd7, 0x8c, 0xa3, 0x3e, 0xe8, 0x1a, 0x36, 0xbf, 0x92, 0x8b, 0xbb, 0xbe,
- 0xe3, 0xab, 0x62, 0xbf, 0x02, 0x5c, 0x07, 0x3f, 0xd1, 0x2d, 0x9f, 0xbd,
- 0x34, 0xfe, 0x8d, 0x3e, 0x84, 0x07, 0x88, 0x3f, 0x77, 0x26, 0x27, 0xbe,
- 0xb9, 0xba, 0xc8, 0xbe, 0x37, 0xd5, 0x3d, 0xbf, 0xe0, 0xdb, 0x03, 0xbe,
- 0x0c, 0x3f, 0xd1, 0xbb, 0x46, 0x5e, 0x6e, 0x3e, 0xa2, 0xe1, 0x38, 0xbf,
- 0x56, 0xce, 0x01, 0x3f, 0x7f, 0x85, 0xe1, 0x3e, 0x81, 0xc3, 0x2a, 0x3f,
- 0xc6, 0x25, 0xc0, 0x3d, 0x24, 0x21, 0x03, 0xbe, 0x8a, 0x5b, 0x53, 0xbd,
- 0xa1, 0x24, 0x23, 0x3f, 0x84, 0x1e, 0x85, 0x3e, 0xec, 0xbd, 0xc3, 0xbd,
- 0xce, 0x00, 0x66, 0x3c, 0x44, 0x4a, 0x10, 0x3e, 0x18, 0x30, 0xf3, 0xbe,
- 0x7c, 0x74, 0xff, 0xbf, 0x12, 0xaa, 0x4d, 0x3d, 0x70, 0x78, 0x51, 0x3e,
- 0xd2, 0x1e, 0x04, 0x3f, 0x89, 0x8c, 0x1d, 0xbe, 0xe9, 0x11, 0xe0, 0xbe,
- 0x37, 0xad, 0x66, 0xbe, 0xde, 0x64, 0x95, 0x3e, 0xb1, 0x3b, 0x2c, 0xbe,
- 0x3b, 0xa3, 0x26, 0x3f, 0x86, 0x5b, 0x18, 0xbd, 0x44, 0xb9, 0x14, 0xbe,
- 0xf3, 0x9e, 0xbb, 0x3b, 0x5e, 0x82, 0x0d, 0x3f, 0x97, 0x86, 0x02, 0x3e,
- 0x47, 0x3a, 0xcb, 0xbd, 0xad, 0x07, 0xff, 0x3e, 0x7d, 0xef, 0xb5, 0xbe,
- 0x34, 0xe4, 0x5e, 0x3e, 0x7d, 0xff, 0xd5, 0xbe, 0x9c, 0x27, 0xca, 0x3d,
- 0xa5, 0x10, 0xb5, 0xbe, 0x79, 0x38, 0x59, 0x3e, 0xd1, 0x3a, 0xbf, 0xbe,
- 0x0d, 0x0c, 0x0f, 0xbf, 0x19, 0xa3, 0x81, 0xbf, 0x18, 0xa7, 0x16, 0xbf,
- 0x7d, 0x47, 0x11, 0x3f, 0xbc, 0x6d, 0xa2, 0xbe, 0x9a, 0x21, 0xa3, 0x3c,
- 0x36, 0xd8, 0x58, 0x3e, 0xd5, 0xe4, 0x1d, 0x3f, 0xc6, 0xda, 0x9a, 0x3f,
- 0x53, 0xc2, 0x23, 0x3d, 0x9c, 0xb6, 0x3f, 0xbe, 0xae, 0x1e, 0x8e, 0x3f,
- 0x0f, 0x49, 0xb4, 0xbb, 0x7f, 0xa8, 0x77, 0xbf, 0x21, 0x90, 0x1d, 0xbf,
- 0x9f, 0xeb, 0x0b, 0x3f, 0xb7, 0xaa, 0x3b, 0xbe, 0x37, 0xab, 0x8c, 0x3e,
- 0x47, 0x73, 0x28, 0x3e, 0xcd, 0xaa, 0x92, 0xbe, 0x3b, 0x01, 0x60, 0x3e,
- 0x50, 0x46, 0xb3, 0xbd, 0x81, 0xe1, 0x53, 0xbf, 0xb6, 0x2b, 0x9f, 0x3e,
- 0xb3, 0x6f, 0x54, 0xbe, 0x14, 0x32, 0x03, 0xbe, 0xc4, 0xe7, 0x30, 0x3e,
- 0x41, 0x87, 0x8b, 0x3e, 0x66, 0x1d, 0x39, 0xbe, 0x3f, 0x96, 0xf3, 0x3d,
- 0xe8, 0x66, 0xd0, 0xbc, 0xc2, 0xba, 0x19, 0x3c, 0x09, 0x4c, 0xb7, 0x3c,
- 0x30, 0xf5, 0x2f, 0x3d, 0x8d, 0x83, 0x77, 0xbd, 0x76, 0x27, 0x20, 0xbe,
- 0xf3, 0xaf, 0x80, 0xbe, 0x03, 0xd8, 0x31, 0xbe, 0xc4, 0xa6, 0x1b, 0xbd,
- 0x97, 0x6a, 0x47, 0x3e, 0x5e, 0x78, 0x31, 0x3e, 0xf4, 0x14, 0x94, 0x3e,
- 0xd6, 0x3f, 0x4f, 0x3e, 0x2f, 0xc6, 0xb1, 0xbe, 0x40, 0x73, 0x0b, 0xbd,
- 0x17, 0x1f, 0xa3, 0x3d, 0x3e, 0x63, 0x3d, 0xbd, 0x83, 0x70, 0xfe, 0xbd,
- 0xea, 0xab, 0x26, 0x3e, 0xd9, 0x51, 0xb9, 0xbe, 0x09, 0x48, 0x5c, 0x3d,
- 0x93, 0x23, 0x9b, 0xbe, 0x20, 0x37, 0xeb, 0xbd, 0xa5, 0xd3, 0x1a, 0x3e,
- 0xf2, 0xc7, 0xce, 0xbd, 0xef, 0xba, 0x87, 0x3d, 0x94, 0xe6, 0x37, 0xbd,
- 0xa8, 0xce, 0x2f, 0xbe, 0xea, 0x4f, 0x95, 0xbe, 0xa4, 0xd4, 0x72, 0xbe,
- 0xe2, 0x6b, 0x9e, 0x3d, 0x8b, 0x03, 0xe4, 0x3d, 0x9c, 0x90, 0xa2, 0xbd,
- 0x23, 0x44, 0xdd, 0x3e, 0x72, 0xe3, 0xfc, 0x3d, 0x17, 0xc8, 0x0c, 0xbe,
- 0x6d, 0x73, 0x45, 0x3e, 0x42, 0x46, 0x80, 0xbb, 0xd6, 0xa6, 0x47, 0x3d,
- 0xb3, 0xd0, 0xa1, 0xbc, 0x42, 0x31, 0x69, 0xbe, 0xcd, 0x95, 0x57, 0x3e,
- 0xc1, 0x62, 0xd3, 0xbe, 0x38, 0xfc, 0x12, 0xbe, 0x70, 0x57, 0x4a, 0xbd,
- 0x64, 0x63, 0x2f, 0xbe, 0x30, 0x08, 0xd0, 0xbd, 0x18, 0x7a, 0xc5, 0xbd,
- 0xf3, 0x4f, 0xb5, 0x3d, 0x37, 0x4f, 0xda, 0xbd, 0xbc, 0xb0, 0xbb, 0xbd,
- 0xdf, 0xb8, 0x81, 0xbc, 0xd7, 0x04, 0xce, 0xbc, 0xaa, 0x2f, 0x87, 0xbd,
- 0xe9, 0xc6, 0x8c, 0xbd, 0x15, 0xaa, 0x69, 0xbd, 0x68, 0x9b, 0x4e, 0xbf,
- 0xb0, 0xf5, 0xaa, 0xbd, 0x23, 0xa5, 0x54, 0xbd, 0x6d, 0x81, 0xc2, 0xbc,
- 0xd4, 0xcb, 0xcb, 0xbd, 0xf3, 0x52, 0x29, 0x3e, 0xf3, 0x38, 0xc5, 0xbd,
- 0x8f, 0x1f, 0x39, 0x3b, 0xc2, 0x9f, 0x77, 0x3d, 0x3b, 0x36, 0x27, 0x3e,
- 0xde, 0x2f, 0x02, 0xbc, 0xf0, 0x4a, 0xd9, 0xbd, 0x47, 0xee, 0xf0, 0xbd,
- 0xc5, 0xa1, 0x12, 0xbf, 0x1b, 0xf5, 0x5f, 0x3d, 0xfe, 0x8f, 0x8c, 0xbd,
- 0xa6, 0xe4, 0xd0, 0xbd, 0x36, 0x05, 0x15, 0xbd, 0x48, 0x18, 0x4f, 0xbc,
- 0x6f, 0x58, 0x96, 0x3b, 0x53, 0xd0, 0x7a, 0xbd, 0x12, 0xe9, 0xaf, 0xbd,
- 0x9e, 0xb3, 0x35, 0xbd, 0xcd, 0x1e, 0x48, 0xbd, 0xda, 0x58, 0xf2, 0xbd,
- 0x7f, 0xb2, 0xbb, 0x3d, 0x19, 0x3d, 0x4e, 0x3d, 0x72, 0x09, 0x46, 0x3d,
- 0x0b, 0xf2, 0x93, 0xbd, 0x2e, 0xc9, 0x59, 0x3e, 0xde, 0x1b, 0x87, 0xbe,
- 0x8d, 0x30, 0x62, 0x3e, 0x93, 0x5b, 0xf8, 0x3d, 0x5e, 0x6f, 0x94, 0xbe,
- 0x57, 0xe9, 0x00, 0x3e, 0xe9, 0x47, 0x0f, 0x3e, 0x36, 0x47, 0xb4, 0xbe,
- 0xe4, 0xfd, 0xf0, 0x3d, 0x17, 0x60, 0x00, 0xbe, 0x4a, 0x10, 0x83, 0x3d,
- 0xd7, 0x75, 0xce, 0xbe, 0xcf, 0x37, 0xeb, 0xbd, 0x33, 0x28, 0x15, 0x3e,
- 0xe6, 0xdc, 0x09, 0xbe, 0x09, 0xb4, 0x0f, 0x3e, 0xf2, 0xad, 0xca, 0x3d,
- 0x8f, 0x72, 0x70, 0xbe, 0x21, 0x42, 0xd4, 0xbd, 0x36, 0xf4, 0x67, 0x3e,
- 0x78, 0x7f, 0x7f, 0xbd, 0x1a, 0x66, 0x7d, 0x3e, 0x7d, 0x97, 0x03, 0xbe,
- 0xfb, 0x37, 0xa0, 0xbd, 0x90, 0xc5, 0x03, 0x3e, 0x0e, 0xd7, 0x8e, 0xbe,
- 0x46, 0xf5, 0xf1, 0xbe, 0xcf, 0x60, 0xb7, 0x3f, 0xa7, 0xdc, 0x6f, 0x3e,
- 0xe8, 0xae, 0x83, 0x3f, 0x50, 0x8d, 0x02, 0xbc, 0xc6, 0xa7, 0x66, 0x3f,
- 0xb7, 0x23, 0x81, 0xbd, 0x16, 0x37, 0x9d, 0x3e, 0x48, 0xa0, 0xde, 0xbe,
- 0x14, 0x29, 0x87, 0xbf, 0x08, 0xd4, 0x9d, 0x3e, 0x70, 0x2d, 0xf0, 0xbe,
- 0xb8, 0x05, 0xd4, 0x3d, 0xea, 0xdc, 0x91, 0x3e, 0xab, 0xbe, 0xb7, 0xbe,
- 0xa8, 0xdd, 0x3d, 0xbe, 0xd2, 0x0a, 0x82, 0xbe, 0xe8, 0x43, 0x85, 0xbe,
- 0x17, 0xa7, 0xb4, 0xbe, 0xdd, 0x58, 0x77, 0xbe, 0x2e, 0x7f, 0x64, 0x3f,
- 0x45, 0x9b, 0x18, 0x3f, 0xaf, 0xcb, 0x19, 0xbf, 0xac, 0x21, 0x25, 0xbe,
- 0x1d, 0x4b, 0x8c, 0xbe, 0x6a, 0x6c, 0xf5, 0x3d, 0x7c, 0x3f, 0xa1, 0xbd,
- 0xe8, 0x39, 0x9e, 0xbf, 0x76, 0xa2, 0xaa, 0xbc, 0x8f, 0xc5, 0x00, 0xbf,
- 0xa2, 0x19, 0x10, 0x3f, 0x54, 0x27, 0x4a, 0xbf, 0x43, 0x12, 0x3c, 0xbc,
- 0x30, 0x3b, 0x09, 0x3f, 0x4c, 0x7d, 0x3e, 0x3e, 0xcc, 0x55, 0x0b, 0xbd,
- 0xf9, 0xa1, 0x25, 0x3f, 0x23, 0x06, 0xd8, 0xbe, 0xc2, 0xc2, 0x7f, 0x3e,
- 0x5b, 0x3a, 0xf6, 0xbd, 0x5d, 0x0b, 0xe4, 0xbd, 0x01, 0x5c, 0xd0, 0x3d,
- 0xa1, 0x24, 0x9d, 0x3d, 0xc0, 0x94, 0x8f, 0xbe, 0x4d, 0x8d, 0x7f, 0x3f,
- 0xe6, 0x62, 0x1b, 0xbe, 0x45, 0x84, 0xf5, 0xbd, 0x02, 0xab, 0x81, 0x3e,
- 0x0d, 0xfc, 0x9a, 0x3d, 0xec, 0x1a, 0x9b, 0xbc, 0x36, 0x28, 0xbd, 0x3e,
- 0x62, 0x1c, 0x97, 0xbd, 0xed, 0x17, 0xd4, 0x3e, 0x71, 0xef, 0xf1, 0xbd,
- 0x6a, 0x9a, 0x42, 0xbc, 0xbe, 0xac, 0xe8, 0x3d, 0x6a, 0xd2, 0x8a, 0x3e,
- 0x9f, 0xb2, 0x52, 0x3e, 0xe4, 0xda, 0x16, 0xbf, 0xf4, 0xef, 0x9c, 0x3d,
- 0xb7, 0xc3, 0xad, 0x3e, 0x8f, 0x88, 0x72, 0xbd, 0xf7, 0xee, 0x52, 0xbf,
- 0xf6, 0xf8, 0x1f, 0xbf, 0x1d, 0xa7, 0xa1, 0xbd, 0xdc, 0x3f, 0x0e, 0xbe,
- 0xf6, 0xa4, 0x44, 0xbd, 0x46, 0xeb, 0x06, 0x3f, 0xe7, 0x54, 0x86, 0xbe,
- 0x53, 0x62, 0x04, 0xbd, 0x5e, 0xf9, 0xc6, 0x3d, 0xde, 0xce, 0xde, 0x3e,
- 0x44, 0x4d, 0x18, 0xbd, 0x9c, 0xf5, 0x87, 0x3d, 0xb3, 0xb0, 0x44, 0xbf,
- 0x61, 0x8a, 0x1e, 0xbf, 0xfc, 0x9e, 0xea, 0x3e, 0x27, 0x33, 0x1a, 0xbf,
- 0xb3, 0xc4, 0xb8, 0xbe, 0x00, 0x43, 0x78, 0xbe, 0xfb, 0x3f, 0xcf, 0xbd,
- 0xf1, 0x3e, 0xec, 0xbd, 0x25, 0x0a, 0x00, 0x3f, 0x99, 0xb0, 0x7c, 0xbe,
- 0x6a, 0xbb, 0x24, 0xbe, 0x62, 0x42, 0x60, 0x3f, 0x46, 0x15, 0x9b, 0x3e,
- 0x52, 0x85, 0x9d, 0x3e, 0x46, 0xa6, 0xa4, 0xbe, 0xf2, 0xe7, 0x57, 0xbe,
- 0x48, 0x5b, 0x09, 0x3f, 0x02, 0x3e, 0x94, 0xbe, 0x18, 0x27, 0x03, 0xbf,
- 0xee, 0xb3, 0xca, 0x3e, 0x64, 0x1a, 0x80, 0x3e, 0x8d, 0x4c, 0x78, 0xbd,
- 0x3b, 0x81, 0x20, 0x3e, 0x8a, 0x81, 0xe0, 0xbe, 0x3c, 0x39, 0xe3, 0x3c,
- 0x5a, 0x0f, 0xc5, 0xbd, 0x21, 0xd1, 0xde, 0xbe, 0x00, 0x96, 0x5f, 0xbe,
- 0x8d, 0x06, 0xbd, 0xbe, 0x1d, 0x70, 0xda, 0x3d, 0x58, 0x37, 0x22, 0xbf,
- 0x9c, 0xbd, 0x01, 0x3d, 0x65, 0x01, 0x2c, 0x3f, 0x1f, 0xe9, 0x4f, 0x3f,
- 0x8f, 0x11, 0x1f, 0x3c, 0x53, 0x5a, 0x1a, 0xbd, 0x4a, 0x0f, 0xc8, 0x3d,
- 0xe6, 0xdf, 0x15, 0x3f, 0xff, 0x5c, 0x49, 0x3c, 0xea, 0x20, 0x73, 0x3e,
- 0xf6, 0x58, 0xfb, 0x3c, 0xad, 0x0f, 0x27, 0x3f, 0xb5, 0x1d, 0x41, 0xbe,
- 0x3f, 0x38, 0x60, 0x3e, 0xd2, 0xa7, 0xd9, 0xbc, 0x90, 0xb0, 0x69, 0xbd,
- 0x73, 0xc7, 0xb9, 0xbe, 0xa6, 0x75, 0xea, 0x3c, 0x32, 0x31, 0x4f, 0xbc,
- 0x69, 0x3d, 0x25, 0x3e, 0x5e, 0x3c, 0x85, 0x3e, 0x5f, 0x99, 0xc3, 0xbc,
- 0xf2, 0x97, 0x14, 0xbe, 0xf6, 0xb8, 0x9b, 0xbe, 0xaa, 0x4d, 0x3b, 0x3e,
- 0x47, 0x8f, 0xdf, 0x3d, 0x60, 0x74, 0xa0, 0xbd, 0x4a, 0xfa, 0x65, 0x3e,
- 0xa9, 0xe8, 0x54, 0xbe, 0x5c, 0x2f, 0xea, 0x3d, 0x39, 0xb4, 0xf1, 0xbe,
- 0xc8, 0xbf, 0x82, 0x3d, 0x06, 0x9c, 0x3c, 0x3e, 0xb5, 0xb3, 0xe1, 0x3d,
- 0xaa, 0x08, 0x10, 0xbe, 0xa2, 0x8e, 0x4c, 0x3d, 0xfd, 0xc3, 0xbe, 0xbd,
- 0x33, 0x1a, 0x02, 0xbf, 0x30, 0x84, 0x32, 0xbd, 0x16, 0x62, 0x9e, 0x3e,
- 0x50, 0xbb, 0x30, 0xbd, 0x28, 0xf1, 0xa9, 0x3d, 0x44, 0xd5, 0x14, 0x3b,
- 0x10, 0x72, 0x2e, 0x3e, 0x0c, 0xb5, 0xad, 0xbe, 0xc2, 0xd2, 0x3f, 0xbd,
- 0x83, 0x48, 0xec, 0x3d, 0x23, 0x6f, 0x25, 0x3c, 0x57, 0xd6, 0x5d, 0x3e,
- 0xc6, 0x81, 0x2d, 0xbe, 0x4e, 0x4f, 0x3f, 0xbd, 0xdc, 0x32, 0x0a, 0xbe,
- 0x93, 0x3a, 0xa7, 0xbe, 0x9a, 0x00, 0x80, 0xbe, 0x14, 0xf1, 0xe3, 0x3d,
- 0x5c, 0x49, 0x24, 0xbe, 0xc0, 0xa7, 0x8d, 0xbc, 0x0c, 0x23, 0xc8, 0xbd,
- 0x8a, 0x69, 0xa2, 0xbe, 0x85, 0xaa, 0x0e, 0x3e, 0x72, 0xef, 0x33, 0x3d,
- 0x8f, 0xff, 0xd2, 0x3d, 0x5c, 0x15, 0x4f, 0x3e, 0x5d, 0x18, 0x08, 0xbe,
- 0x7b, 0x6a, 0x99, 0x3e, 0x95, 0x92, 0xd9, 0x3d, 0x87, 0x47, 0x50, 0x3d,
- 0x48, 0x3b, 0x91, 0x3c, 0xe0, 0x07, 0xf2, 0xbd, 0x84, 0x92, 0x71, 0xbd,
- 0xf9, 0x0f, 0xc3, 0xbd, 0xa6, 0x53, 0xd0, 0xbd, 0xd7, 0x18, 0x43, 0x3e,
- 0x37, 0xce, 0x84, 0x3b, 0x0f, 0xc2, 0x59, 0xbe, 0xed, 0x9e, 0xa4, 0xbe,
- 0xf9, 0x5e, 0x19, 0x3e, 0x9c, 0x25, 0x96, 0x3d, 0xe5, 0xc9, 0xef, 0xbd,
- 0xa6, 0x80, 0x74, 0xbc, 0x66, 0xba, 0x96, 0xbc, 0x59, 0xf6, 0x11, 0xbd,
- 0x20, 0x36, 0x85, 0xbd, 0xa9, 0x90, 0x10, 0xbe, 0x52, 0x61, 0xf8, 0x3c,
- 0xb0, 0x46, 0x5a, 0xbc, 0xc5, 0xee, 0x25, 0x3c, 0x63, 0xb1, 0xbd, 0x3e,
- 0x88, 0x91, 0xa0, 0xbe, 0xdb, 0x9a, 0xcc, 0xbe, 0xff, 0xe9, 0x1e, 0xbe,
- 0xff, 0xf6, 0x4f, 0x3e, 0x42, 0x2b, 0x80, 0x3b, 0x9a, 0x0d, 0x9a, 0x3d,
- 0x24, 0x8b, 0xf7, 0xbc, 0x61, 0x72, 0xe6, 0xbd, 0xd4, 0xce, 0xdb, 0xbd,
- 0x9a, 0x9d, 0xfc, 0xbd, 0xc5, 0x47, 0x32, 0xbe, 0xea, 0x07, 0xff, 0x3e,
- 0xe8, 0x40, 0x1b, 0x3c, 0x07, 0x8d, 0xc0, 0xbd, 0x71, 0x88, 0x2a, 0xbe,
- 0xf5, 0x6f, 0x74, 0x3e, 0x97, 0xe1, 0x6d, 0xbd, 0x2d, 0x36, 0xbe, 0xbd,
- 0x7b, 0x91, 0xef, 0x3d, 0x9e, 0xe1, 0x86, 0xbe, 0x3a, 0x7d, 0xf2, 0x3d,
- 0xfd, 0x3b, 0xaf, 0x3c, 0xac, 0x00, 0x62, 0x3e, 0x68, 0xa2, 0x62, 0xbe,
- 0x66, 0x8c, 0xb6, 0xbd, 0x9e, 0xb5, 0x6d, 0x3e, 0xe2, 0xbe, 0xb1, 0x3c,
- 0xa7, 0x16, 0xc6, 0xbe, 0x4f, 0x92, 0x0c, 0xbb, 0x1d, 0x23, 0x40, 0xbe,
- 0xde, 0xba, 0x5e, 0x3d, 0x17, 0xde, 0xc9, 0x3d, 0x60, 0x76, 0x43, 0xbe,
- 0x6b, 0xda, 0x2e, 0xbe, 0xa6, 0xb4, 0x60, 0xbd, 0x62, 0xdc, 0xd1, 0xbc,
- 0x56, 0x72, 0xa9, 0xbe, 0x22, 0x40, 0xd9, 0xbd, 0x8a, 0x6b, 0xe5, 0xbd,
- 0x07, 0xa1, 0x0b, 0x3e, 0x2c, 0xac, 0x96, 0x3d, 0x46, 0xce, 0xb4, 0xbe,
- 0x6a, 0xef, 0x4c, 0xbd, 0x55, 0x3c, 0x4f, 0x3e, 0x30, 0xb6, 0xba, 0x3c,
- 0x1a, 0x43, 0x02, 0xbf, 0x3e, 0x1e, 0x52, 0xbe, 0x33, 0xc6, 0x7a, 0x3e,
- 0x94, 0xe2, 0x2e, 0xbe, 0xd0, 0x58, 0x97, 0x3e, 0x1a, 0xfa, 0x9f, 0x3d,
- 0xf9, 0xe7, 0x62, 0x3d, 0xf7, 0x18, 0x6b, 0x3c, 0x4c, 0xae, 0xca, 0x3e,
- 0xfa, 0x6c, 0xd8, 0x3c, 0x11, 0xc7, 0x75, 0xbd, 0x58, 0x61, 0x02, 0xbe,
- 0xbf, 0x0b, 0xc4, 0x3c, 0x6a, 0x2c, 0xa2, 0xbd, 0xaa, 0x18, 0xa0, 0xbd,
- 0x54, 0x0a, 0x2c, 0xbc, 0x80, 0xe3, 0xda, 0x3e, 0xf0, 0x79, 0x9f, 0xbd,
- 0xe7, 0x7e, 0xd7, 0x3d, 0x1a, 0x42, 0x01, 0x3e, 0xef, 0xe3, 0x52, 0x3e,
- 0x5c, 0x7d, 0x0b, 0xbe, 0x34, 0xea, 0x56, 0xbe, 0x9f, 0x1c, 0x01, 0xbe,
- 0x86, 0x18, 0x05, 0x3e, 0x49, 0x82, 0x3d, 0xbd, 0x56, 0xbc, 0x41, 0x3e,
- 0x97, 0xc1, 0x18, 0x3d, 0x78, 0x5d, 0x18, 0x3d, 0x55, 0xc4, 0x41, 0xbe,
- 0x70, 0x0e, 0x24, 0xbe, 0xc6, 0x18, 0x07, 0x3e, 0x2c, 0x99, 0x13, 0x3e,
- 0xa8, 0xb8, 0x87, 0xbe, 0x81, 0x54, 0xdf, 0x3e, 0xf6, 0xff, 0xeb, 0xbe,
- 0x7e, 0x7d, 0xa3, 0xbe, 0x15, 0xc4, 0x86, 0xbe, 0xa1, 0x1b, 0xb1, 0xbc,
- 0x7c, 0xed, 0x63, 0x3d, 0xd7, 0xc4, 0x18, 0xbe, 0x59, 0xb7, 0xa7, 0x3e,
- 0xf9, 0x4f, 0xdd, 0xbe, 0xdd, 0xb5, 0xcd, 0x3d, 0xfd, 0x78, 0x82, 0xbe,
- 0x74, 0xf0, 0xec, 0xbd, 0x24, 0x8b, 0x0a, 0xbe, 0x61, 0x2e, 0x82, 0x3d,
- 0x2d, 0xf3, 0x44, 0xbd, 0xeb, 0x16, 0x84, 0x3d, 0xbd, 0x0d, 0x1f, 0xba,
- 0xb0, 0xd4, 0xf9, 0xbb, 0xeb, 0x84, 0xbc, 0xbe, 0x80, 0x0c, 0x22, 0xbe,
- 0xd3, 0xd1, 0xdf, 0xbd, 0xcb, 0x7b, 0xaa, 0x3d, 0xec, 0xfa, 0x64, 0xbd,
- 0xf5, 0x41, 0x95, 0x3c, 0xd4, 0xd7, 0x60, 0x3e, 0x8a, 0x18, 0x28, 0xbe,
- 0x3c, 0xb0, 0xeb, 0x3c, 0xef, 0x72, 0xac, 0xbd, 0x15, 0xa4, 0x44, 0xbe,
- 0x78, 0xb7, 0xea, 0x3c, 0x60, 0x9d, 0x98, 0xbe, 0x73, 0x4e, 0x36, 0xbd,
- 0x20, 0xd5, 0x56, 0xbd, 0xfb, 0xfd, 0xe3, 0xbd, 0x97, 0xea, 0x40, 0xbe,
- 0xa2, 0x33, 0x88, 0x3e, 0x9d, 0x4a, 0x2f, 0xbe, 0x80, 0xdd, 0xd8, 0x3c,
- 0x11, 0x45, 0x22, 0xbf, 0x62, 0x7a, 0x4b, 0x3e, 0xa7, 0xdd, 0x4f, 0x3e,
- 0x0a, 0xf8, 0xbc, 0xbc, 0x39, 0x1e, 0xb8, 0xbc, 0xbf, 0xa3, 0xfd, 0xbc,
- 0x36, 0x4b, 0xdf, 0x3b, 0x9c, 0xe9, 0xfb, 0x3d, 0x5d, 0xb0, 0xd9, 0x3d,
- 0x4e, 0x2a, 0xf1, 0xbd, 0x80, 0x9a, 0xd0, 0xbd, 0xd8, 0x9c, 0x54, 0xbe,
- 0x65, 0xe8, 0x98, 0xbd, 0xaf, 0x48, 0x73, 0x3e, 0x46, 0xb7, 0xe5, 0xbd,
- 0x93, 0x02, 0x89, 0x3d, 0xe3, 0x36, 0x83, 0x3e, 0xb2, 0xdb, 0x09, 0xbc,
- 0x2a, 0xc7, 0x99, 0x3d, 0x10, 0x50, 0x8a, 0x3e, 0xc6, 0x8b, 0x95, 0xbd,
- 0xbe, 0x42, 0xd1, 0x3e, 0x24, 0x64, 0x16, 0xbc, 0x10, 0x82, 0x2c, 0x3e,
- 0x60, 0x57, 0x4f, 0xbe, 0x08, 0x7e, 0xa5, 0x3d, 0x2d, 0x66, 0xba, 0x3d,
- 0xd8, 0x6c, 0xfb, 0xbe, 0x6a, 0x82, 0x32, 0xbe, 0xa8, 0xa5, 0xbb, 0xbc,
- 0xd7, 0xf1, 0xf5, 0xbd, 0x9c, 0xbe, 0xa8, 0x3b, 0xb2, 0x53, 0x78, 0xbe,
- 0xd1, 0x7b, 0x8b, 0xbe, 0x1a, 0x82, 0x2c, 0x3d, 0xb4, 0xbc, 0x12, 0x3e,
- 0xb5, 0x1b, 0xc5, 0xbe, 0xcc, 0x88, 0x1c, 0x3c, 0xa3, 0x52, 0xbe, 0xbd,
- 0xc0, 0x13, 0x2f, 0x3c, 0x7d, 0x8e, 0x09, 0xbd, 0x9f, 0xf3, 0x73, 0xbd,
- 0x7c, 0xce, 0x6b, 0x3f, 0xd5, 0x65, 0x0e, 0x3f, 0x28, 0x57, 0x07, 0x3f,
- 0xfc, 0xc0, 0x15, 0xbe, 0x44, 0x54, 0x94, 0x3d, 0xf5, 0x11, 0x7f, 0xbe,
- 0x5c, 0xe6, 0x40, 0x3e, 0x94, 0x71, 0xe7, 0xbd, 0xa8, 0xbd, 0x12, 0xbf,
- 0x08, 0x10, 0x50, 0xbe, 0x91, 0xa0, 0x15, 0xbf, 0xef, 0x21, 0x23, 0xbd,
- 0xf6, 0x14, 0xc3, 0x3d, 0x1f, 0x93, 0x33, 0xbe, 0xc2, 0xd5, 0x11, 0xbf,
- 0x66, 0x43, 0xdd, 0x3e, 0xfc, 0x19, 0x0f, 0x3e, 0x20, 0xa2, 0x14, 0xbf,
- 0x68, 0xf4, 0x82, 0x3d, 0x8d, 0xea, 0x76, 0xbe, 0xe8, 0xb0, 0x60, 0x3e,
- 0x84, 0x67, 0xc5, 0xbe, 0x40, 0x49, 0x59, 0x3e, 0xa4, 0xf4, 0x3f, 0xbe,
- 0x1c, 0x50, 0x0c, 0xbf, 0x7c, 0x2f, 0x49, 0xbd, 0x89, 0xb5, 0x0d, 0x3f,
- 0x26, 0x76, 0x7e, 0xbe, 0xf5, 0xbb, 0xa8, 0x3c, 0x32, 0xdd, 0xb1, 0xbd,
- 0x95, 0x4f, 0xf0, 0xbe, 0x19, 0x23, 0x09, 0xbf, 0x2f, 0x37, 0x74, 0xbd,
- 0x96, 0x1e, 0x1e, 0xbf, 0x7e, 0x7c, 0x82, 0xbf, 0x88, 0x52, 0x88, 0x3e,
- 0x8e, 0x16, 0x63, 0x3e, 0x8e, 0x10, 0xa9, 0xbe, 0x5e, 0x5a, 0xeb, 0x3c,
- 0xe2, 0xce, 0x7f, 0xbf, 0x4a, 0x9d, 0xbe, 0xbc, 0x11, 0xae, 0xd7, 0xbd,
- 0x29, 0xe9, 0x8c, 0x3e, 0xfa, 0xce, 0x18, 0x3e, 0x4e, 0x5a, 0x8b, 0x3e,
- 0x72, 0x34, 0x42, 0xbe, 0x9e, 0x73, 0x59, 0xbe, 0xa2, 0x1b, 0x0d, 0x3e,
- 0xd2, 0x78, 0x6f, 0x3e, 0x67, 0x96, 0x83, 0xbe, 0x31, 0xda, 0xc8, 0xbe,
- 0x82, 0x43, 0xb7, 0xbf, 0xcc, 0xbe, 0x43, 0xbf, 0x47, 0xad, 0x71, 0x3e,
- 0xf7, 0x77, 0x94, 0xbd, 0xbd, 0x21, 0xb8, 0x3e, 0x52, 0xde, 0xd5, 0xbe,
- 0x11, 0x25, 0x95, 0x3e, 0xe1, 0x3a, 0x39, 0xbf, 0xef, 0x51, 0x8a, 0x3e,
- 0x22, 0x58, 0x3c, 0xbd, 0xbb, 0x32, 0xe4, 0xbd, 0x00, 0xe6, 0x93, 0x3d,
- 0xc1, 0x17, 0xb3, 0x3e, 0x0a, 0x41, 0x4c, 0xbd, 0x60, 0xbc, 0x59, 0xbd,
- 0x74, 0x66, 0x7f, 0xbd, 0xaf, 0x7f, 0xfd, 0xbf, 0x4a, 0xa5, 0xd6, 0x3c,
- 0x29, 0x74, 0xa8, 0xbf, 0x60, 0x79, 0x97, 0xbe, 0xfb, 0xdd, 0x31, 0x3f,
- 0xef, 0xcf, 0xa2, 0x3e, 0x1c, 0xf1, 0x41, 0xbe, 0xaa, 0x74, 0x71, 0xbe,
- 0xd7, 0x01, 0x8a, 0xbe, 0x30, 0xb8, 0xd9, 0x3e, 0xa9, 0xd0, 0x1a, 0x3f,
- 0xfe, 0x4c, 0x16, 0xbe, 0x3d, 0x7d, 0x5f, 0xbe, 0x6c, 0x3c, 0x8c, 0xbd,
- 0xc3, 0x84, 0xe9, 0xbc, 0xa4, 0x50, 0x61, 0x3e, 0xad, 0xe7, 0x03, 0xbf,
- 0x46, 0xeb, 0x54, 0x3d, 0xc8, 0xbf, 0x33, 0xbe, 0x17, 0x45, 0x86, 0x3d,
- 0x46, 0xab, 0x01, 0xbd, 0xa1, 0xe7, 0x04, 0xbf, 0x22, 0x15, 0x87, 0xbf,
- 0x51, 0x27, 0x61, 0x3e, 0x58, 0x4b, 0xa0, 0x3e, 0xef, 0x74, 0x37, 0xbf,
- 0x5d, 0x9c, 0x3a, 0x3f, 0x64, 0x5f, 0x61, 0x3f, 0xcb, 0x7f, 0xbe, 0xbe,
- 0x50, 0x11, 0xab, 0x3d, 0x40, 0x33, 0x05, 0xbe, 0xec, 0xaf, 0xaf, 0xbc,
- 0xa6, 0x73, 0x25, 0x3f, 0x20, 0x06, 0x17, 0xbe, 0x88, 0x7f, 0x1b, 0x3f,
- 0xe4, 0x02, 0x8e, 0x3d, 0x02, 0x6f, 0x01, 0xbe, 0x04, 0x90, 0x95, 0x3e,
- 0x0c, 0x5f, 0x5a, 0x3c, 0x6a, 0x09, 0x22, 0xbf, 0x06, 0x63, 0xfd, 0x3e,
- 0xba, 0xd0, 0x88, 0xbe, 0x9a, 0xf2, 0x4f, 0x3d, 0xf8, 0xc6, 0x8a, 0x3e,
- 0xdd, 0xac, 0x7a, 0x3e, 0x72, 0xf1, 0x2e, 0x3d, 0x43, 0xc0, 0xd0, 0x3d,
- 0x8e, 0x21, 0xb4, 0x3d, 0x7c, 0x0f, 0x2b, 0xbf, 0x02, 0xc9, 0x46, 0xbe,
- 0xd1, 0x17, 0xe0, 0x3d, 0x20, 0x6b, 0x6b, 0xbe, 0xcf, 0x86, 0xb3, 0x3d,
- 0x42, 0x22, 0xc0, 0x3d, 0x99, 0x11, 0x56, 0xbd, 0x6e, 0x29, 0x0b, 0xbe,
- 0x28, 0xa7, 0x72, 0xbd, 0x95, 0xdc, 0x06, 0x3d, 0x35, 0xb1, 0x60, 0x3e,
- 0xbb, 0x47, 0x88, 0x3e, 0xc3, 0xd7, 0x87, 0x3d, 0x85, 0x1e, 0xd4, 0xbc,
- 0x82, 0x62, 0x89, 0xbd, 0x66, 0x0a, 0x1b, 0xbe, 0x6e, 0xc2, 0x19, 0x3e,
- 0x5a, 0x12, 0x44, 0x3d, 0x75, 0x34, 0x6d, 0xbd, 0x51, 0x80, 0x78, 0x3e,
- 0x0e, 0x45, 0x24, 0x3c, 0x48, 0x40, 0x19, 0xbe, 0x43, 0x10, 0x5d, 0x3d,
- 0xef, 0x69, 0xd7, 0xbc, 0xc6, 0xb1, 0x56, 0x3e, 0xd3, 0x75, 0x37, 0xbd,
- 0x74, 0xeb, 0x80, 0x3d, 0x50, 0x1d, 0x68, 0xbe, 0x43, 0x63, 0x00, 0x3d,
- 0x2e, 0x87, 0x52, 0xbd, 0x3c, 0x26, 0xa6, 0x3d, 0x18, 0x7f, 0x09, 0x3e,
- 0x40, 0xf9, 0x8a, 0xbd, 0x8e, 0x2a, 0x4b, 0x3e, 0x00, 0x96, 0x33, 0xbe,
- 0x21, 0xa3, 0x5c, 0xbc, 0x22, 0x1e, 0x3c, 0xbe, 0xd6, 0x1f, 0x8b, 0xbe,
- 0x73, 0xa4, 0x45, 0x3d, 0x3d, 0x54, 0x1d, 0x3e, 0x06, 0x0b, 0x96, 0xbd,
- 0x44, 0xfa, 0xc0, 0x3e, 0x78, 0x6b, 0x63, 0xbe, 0x70, 0x4a, 0x00, 0x3e,
- 0x84, 0x89, 0x5f, 0x3e, 0x06, 0xff, 0x3b, 0x3c, 0x4a, 0x7a, 0xde, 0xbc,
- 0xe0, 0x6d, 0x7f, 0xbe, 0x2d, 0x75, 0x8b, 0xbd, 0x01, 0x77, 0x8e, 0x3d,
- 0xec, 0x9f, 0xfb, 0xbe, 0x38, 0xda, 0x2e, 0xbd, 0x8d, 0xf6, 0xeb, 0x3d,
- 0x2b, 0xc4, 0x33, 0x3b, 0x67, 0x22, 0xc7, 0xbc, 0x33, 0x4c, 0x2b, 0x3e,
- 0xee, 0x47, 0x0b, 0x3e, 0x32, 0xa5, 0x4f, 0x3d, 0x91, 0xb7, 0x31, 0xbe,
- 0x6d, 0xce, 0xee, 0xbc, 0xd7, 0x94, 0x2c, 0x3d, 0x45, 0xea, 0xda, 0xbd,
- 0xec, 0x0c, 0x02, 0xbd, 0x04, 0xad, 0x9c, 0xbd, 0xc8, 0x2f, 0xe0, 0xbe,
- 0xf7, 0x22, 0x4d, 0xbe, 0x6c, 0xad, 0xdf, 0xbc, 0x3f, 0xee, 0x6d, 0x3d,
- 0xf4, 0xde, 0x21, 0xbe, 0x5d, 0x45, 0x65, 0x3d, 0x95, 0x6a, 0x6c, 0x3d,
- 0xfb, 0xa2, 0x01, 0xbe, 0x9b, 0x2b, 0xee, 0x3c, 0x3b, 0x73, 0x52, 0x3c,
- 0x52, 0xf3, 0x26, 0x3d, 0x5b, 0x5d, 0x26, 0xbe, 0x5a, 0x45, 0xf1, 0xbc,
- 0xa1, 0x50, 0xf6, 0xbe, 0x69, 0x52, 0x63, 0x3e, 0xc7, 0x7c, 0xb6, 0xbd,
- 0x08, 0xbc, 0x38, 0x3d, 0x3a, 0x44, 0x07, 0xbe, 0xb9, 0xcb, 0xcd, 0xbc,
- 0x56, 0xe7, 0x92, 0x3c, 0x64, 0x58, 0xa1, 0x3e, 0x32, 0xa7, 0x82, 0x3c,
- 0xdf, 0x19, 0x9d, 0x3b, 0xed, 0xb8, 0x19, 0xbe, 0x64, 0x2b, 0x76, 0xbd,
- 0x3f, 0x8d, 0x90, 0x3b, 0x7a, 0x5d, 0x98, 0xbc, 0xf2, 0x87, 0x21, 0x3e,
- 0x38, 0x6d, 0x66, 0xbe, 0xb9, 0x0a, 0x4a, 0x3e, 0x57, 0xb8, 0xb1, 0xbe,
- 0xc2, 0xf4, 0x46, 0x3e, 0x9d, 0xc0, 0x19, 0xbe, 0x8f, 0x72, 0xc4, 0xbe,
- 0x89, 0x3b, 0x46, 0xbe, 0x77, 0x4d, 0x22, 0x3e, 0x13, 0xd9, 0x9c, 0xbe,
- 0x46, 0x04, 0x43, 0x3e, 0x88, 0x0b, 0x39, 0xbd, 0xe4, 0x82, 0x95, 0xbd,
- 0x1f, 0xc5, 0x14, 0xbf, 0x63, 0x0a, 0xda, 0xbd, 0xfb, 0x34, 0x32, 0x3e,
- 0x7a, 0x19, 0x63, 0xbd, 0x81, 0x70, 0xd6, 0x3c, 0x07, 0x90, 0x0c, 0x3d,
- 0x6c, 0x29, 0x00, 0x3e, 0xf0, 0x6f, 0x30, 0xbd, 0x12, 0x21, 0x11, 0x3e,
- 0x83, 0x7b, 0xeb, 0x3d, 0xf5, 0x3f, 0x3b, 0x3d, 0x17, 0x4d, 0x21, 0xbe,
- 0x37, 0xd4, 0xe2, 0x3c, 0xa5, 0x92, 0x09, 0x3d, 0xa6, 0xbb, 0x08, 0xbc,
- 0xb5, 0xd7, 0xf8, 0xbe, 0x05, 0x4f, 0x9c, 0x3f, 0x28, 0xe8, 0xb3, 0x3e,
- 0xb9, 0xe3, 0x84, 0x3f, 0x05, 0x9c, 0xda, 0x3d, 0xf8, 0xa7, 0x3f, 0x3f,
- 0x03, 0x93, 0x58, 0xbc, 0xf7, 0x37, 0x62, 0x3e, 0xfe, 0x5b, 0xfa, 0xbe,
- 0x3d, 0x97, 0x67, 0xbf, 0xaf, 0x25, 0xd2, 0x3e, 0x0e, 0x5a, 0xca, 0xbe,
- 0xd6, 0xe1, 0x20, 0x3e, 0x00, 0x56, 0x84, 0x3e, 0x4e, 0x90, 0x94, 0xbe,
- 0x58, 0x74, 0x7a, 0xbe, 0x9e, 0xfb, 0xd9, 0xbe, 0x6f, 0x50, 0x2a, 0xbe,
- 0x2d, 0x29, 0x14, 0xbf, 0xed, 0x38, 0x02, 0xbe, 0x82, 0x82, 0x3e, 0x3f,
- 0xad, 0x0c, 0xf4, 0x3e, 0xa7, 0x23, 0xcd, 0xbe, 0x7e, 0x0a, 0x43, 0xbe,
- 0x2b, 0xff, 0x16, 0xbe, 0xd3, 0x10, 0x20, 0x3e, 0x57, 0xb5, 0xaa, 0xbe,
- 0xf6, 0x39, 0xa1, 0xbf, 0x73, 0xb8, 0xa8, 0x3a, 0xda, 0x74, 0xed, 0xbe,
- 0xb8, 0xd2, 0x11, 0x3f, 0x77, 0xfd, 0x4c, 0xbf, 0x41, 0x25, 0x16, 0xbe,
- 0x01, 0x13, 0xe6, 0x3e, 0x80, 0x42, 0x20, 0x3e, 0x02, 0xc5, 0x1c, 0xbe,
- 0x88, 0xa5, 0x12, 0x3f, 0x40, 0x62, 0x99, 0xbe, 0x0f, 0xb3, 0x98, 0xbd,
- 0xb4, 0xc3, 0x8a, 0xbd, 0xe6, 0x7d, 0x00, 0xbe, 0x55, 0x46, 0xd0, 0x3d,
- 0xa1, 0x55, 0x0a, 0x3e, 0x0e, 0x43, 0xbc, 0xbd, 0xdf, 0x31, 0x99, 0x3f,
- 0x3e, 0x6f, 0x4e, 0xbf, 0xaf, 0xc8, 0x8f, 0x3d, 0x4b, 0xc1, 0x35, 0xbe,
- 0x41, 0x3a, 0xc0, 0x3d, 0x1e, 0xaa, 0xce, 0x3d, 0x9e, 0xf9, 0xcf, 0x3e,
- 0x5d, 0x61, 0x04, 0x3c, 0xaa, 0xdc, 0xd3, 0x3e, 0xe0, 0x0b, 0xa6, 0x3d,
- 0x6b, 0x52, 0x85, 0x3d, 0x4c, 0xfa, 0xa6, 0xbe, 0x8e, 0xb0, 0x9d, 0xbc,
- 0x18, 0x16, 0xa1, 0x3e, 0x19, 0x44, 0x52, 0xbe, 0x0d, 0xe0, 0x37, 0x3e,
- 0x1b, 0x48, 0xa0, 0x3e, 0x2c, 0xce, 0x5a, 0xbe, 0x31, 0xc8, 0x6f, 0xbe,
- 0x8e, 0x09, 0x45, 0xbf, 0x5e, 0x0a, 0xaa, 0xbe, 0xf5, 0xee, 0xab, 0x3d,
- 0xe1, 0x94, 0x9c, 0xbc, 0xf7, 0xc3, 0xf2, 0x3e, 0x02, 0xab, 0xd5, 0xbe,
- 0x99, 0x14, 0xf2, 0x3d, 0xe5, 0x43, 0x1f, 0xbe, 0x06, 0xa2, 0x8e, 0x3e,
- 0x74, 0xc2, 0xeb, 0x3c, 0x17, 0x9f, 0x3b, 0xbe, 0xb1, 0x76, 0x53, 0xbf,
- 0x68, 0x81, 0xd1, 0xbe, 0x8a, 0x09, 0x1c, 0x3f, 0x95, 0x8e, 0xe1, 0xbe,
- 0x29, 0xc5, 0x06, 0xbf, 0x64, 0x8a, 0x0d, 0xbe, 0x0b, 0xec, 0xee, 0x3d,
- 0x7a, 0xb6, 0xe2, 0xbd, 0xc5, 0xff, 0x48, 0x3f, 0x75, 0x5a, 0x8b, 0xbe,
- 0x5c, 0x16, 0x37, 0xbe, 0x38, 0xfd, 0x52, 0x3f, 0x6c, 0x31, 0x0a, 0x3d,
- 0x46, 0xca, 0x41, 0x3e, 0x3e, 0x66, 0x87, 0xbe, 0x8b, 0x80, 0x9f, 0xbe,
- 0xf2, 0x88, 0xdf, 0x3e, 0xa3, 0xbd, 0x47, 0xbe, 0x2e, 0x61, 0xfc, 0xbe,
- 0xc3, 0x48, 0x0c, 0x3f, 0xeb, 0xc6, 0x24, 0x3e, 0x9d, 0x09, 0x80, 0x3d,
- 0xc7, 0x68, 0x34, 0x3e, 0xc0, 0x60, 0xf6, 0xbe, 0x27, 0x79, 0x14, 0x3f,
- 0xa1, 0x54, 0x27, 0xbe, 0x01, 0x8c, 0x23, 0xbf, 0x1b, 0x69, 0xe0, 0xbe,
- 0x7c, 0x94, 0x0a, 0xbf, 0x5a, 0xce, 0x09, 0xbc, 0xac, 0x41, 0xf2, 0xbe,
- 0x52, 0xf5, 0x85, 0x3d, 0xe3, 0xe8, 0x23, 0x3f, 0xda, 0x1f, 0xbe, 0x3e,
- 0x11, 0x21, 0xd7, 0x3c, 0xf2, 0xf4, 0x08, 0xbd, 0x7e, 0xb3, 0xfc, 0xbd,
- 0x0c, 0xee, 0x31, 0x3f, 0x82, 0x67, 0x39, 0xbd, 0x07, 0x90, 0x1d, 0x3e,
- 0x6c, 0xb8, 0xed, 0x3d, 0xf6, 0x52, 0xcd, 0x3e, 0xa3, 0x2b, 0xcf, 0xbe,
- 0x68, 0xb0, 0x5d, 0x3d, 0xc7, 0x3c, 0x88, 0xbd, 0x4d, 0xd0, 0x25, 0x3e,
- 0x6f, 0x4c, 0x93, 0xbe, 0x0a, 0x79, 0x26, 0x3d, 0x95, 0x89, 0x80, 0xbe,
- 0xe0, 0xd8, 0x40, 0x3e, 0x9e, 0x9f, 0xa3, 0x3d, 0x5b, 0x04, 0x87, 0xbc,
- 0x57, 0x19, 0x6f, 0xbc, 0xc1, 0x82, 0x89, 0xbd, 0xe3, 0xa4, 0x0a, 0x3e,
- 0x9d, 0x85, 0x40, 0xbd, 0x2f, 0x51, 0xd9, 0x3b, 0xe4, 0xa0, 0xab, 0x3d,
- 0x13, 0xc0, 0xed, 0xbd, 0x7e, 0x01, 0x30, 0x3e, 0xed, 0x2a, 0x3b, 0xbe,
- 0x7c, 0x05, 0xbb, 0x3d, 0x7d, 0x35, 0x12, 0xbe, 0x7b, 0x75, 0x31, 0x3e,
- 0x6e, 0xb0, 0x16, 0xbd, 0x62, 0x8a, 0xcd, 0x3d, 0xd2, 0x8d, 0x17, 0xbe,
- 0xd3, 0xe8, 0x0f, 0xbf, 0x71, 0x20, 0x54, 0xbe, 0x16, 0x1e, 0x22, 0x3e,
- 0xaf, 0xcb, 0x83, 0x3d, 0x0a, 0x04, 0x65, 0xbc, 0x08, 0x69, 0x84, 0x3e,
- 0xfe, 0x76, 0xae, 0x3c, 0xe6, 0x4f, 0x85, 0xbe, 0xfd, 0x32, 0x3d, 0xbe,
- 0xdf, 0xe5, 0xcc, 0xba, 0xa9, 0x3c, 0xfd, 0xbd, 0x8c, 0x24, 0x60, 0x3e,
- 0x25, 0x1a, 0xb2, 0x3d, 0xfa, 0xf9, 0x50, 0xbe, 0x4f, 0x6c, 0x29, 0x3e,
- 0xa0, 0x2a, 0xae, 0xbc, 0x87, 0xf5, 0xa8, 0xbe, 0x7d, 0x87, 0x6d, 0xba,
- 0xa0, 0x5c, 0x31, 0xbe, 0x5f, 0xe2, 0x25, 0x3d, 0x08, 0x85, 0x71, 0xbe,
- 0x66, 0x7d, 0x5d, 0xbf, 0xa6, 0x5b, 0x2f, 0xbd, 0xe8, 0x88, 0xe6, 0xbd,
- 0xe2, 0x70, 0x2b, 0xba, 0x23, 0x8d, 0x26, 0x3e, 0x18, 0xec, 0x19, 0xbe,
- 0x73, 0xdd, 0x93, 0x3e, 0xcf, 0xfb, 0x64, 0x3e, 0xc9, 0x07, 0x8f, 0xbd,
- 0xeb, 0xb7, 0x09, 0x3e, 0xab, 0x81, 0x7a, 0x3e, 0x3b, 0x0b, 0x7d, 0xbd,
- 0x98, 0xae, 0x7f, 0xbe, 0x0d, 0xa9, 0xb5, 0x3d, 0x95, 0x94, 0x2f, 0x3e,
- 0x32, 0x27, 0x73, 0xbd, 0x4d, 0x39, 0x8e, 0xbd, 0x47, 0xc2, 0xdd, 0xbe,
- 0x15, 0x4b, 0x70, 0x3e, 0x03, 0x62, 0x9b, 0x3e, 0xb8, 0x40, 0x69, 0xbd,
- 0xa2, 0x01, 0x2d, 0xbe, 0x83, 0x6f, 0xd7, 0x3d, 0x21, 0x86, 0x40, 0x3e,
- 0x1d, 0x2b, 0xb3, 0x3d, 0x96, 0x1a, 0x66, 0xbd, 0x7a, 0xae, 0x8f, 0x3d,
- 0x8a, 0xad, 0x1b, 0xbe, 0xb9, 0x1d, 0x42, 0xbe, 0x9f, 0x12, 0xb9, 0x3d,
- 0x54, 0xf0, 0xca, 0xbe, 0x82, 0x47, 0xef, 0xbe, 0x70, 0x9c, 0x0e, 0xbe,
- 0xe7, 0x2e, 0xe8, 0x3e, 0x9f, 0xf1, 0x9c, 0xbd, 0xa9, 0xa7, 0x51, 0xbd,
- 0x44, 0x3e, 0x0e, 0xbe, 0xb5, 0x52, 0xc9, 0xbe, 0x70, 0x39, 0x78, 0xbe,
- 0x92, 0xb8, 0x0e, 0xbe, 0x4c, 0xbe, 0xa2, 0xbd, 0x40, 0x38, 0xf6, 0x3e,
- 0x35, 0xbd, 0xb2, 0x3d, 0x32, 0x21, 0x3c, 0xbe, 0xec, 0x63, 0x2b, 0xbe,
- 0x87, 0x4c, 0xbe, 0x3e, 0x42, 0x5b, 0xaa, 0x3b, 0xc2, 0xa1, 0x4c, 0x3d,
- 0x0b, 0xb7, 0xc5, 0x3e, 0x84, 0xbc, 0x90, 0xbd, 0x5d, 0x33, 0xb3, 0x3e,
- 0xe5, 0x34, 0x3c, 0x3c, 0xdf, 0xe8, 0x0a, 0x3e, 0x63, 0xe1, 0x0a, 0xbe,
- 0x42, 0x08, 0xfe, 0xbd, 0xa8, 0xc4, 0x21, 0x3e, 0xd8, 0x02, 0x49, 0x3e,
- 0x91, 0x89, 0xb0, 0xbe, 0x08, 0xbd, 0x6d, 0xbc, 0xbd, 0xdf, 0x76, 0xbe,
- 0x5a, 0x61, 0xb9, 0x3d, 0x8e, 0xf2, 0x8c, 0x3e, 0xa8, 0xae, 0x5d, 0xbe,
- 0x4b, 0x10, 0xb2, 0xbd, 0x2c, 0xa5, 0x4c, 0x3d, 0x7f, 0xe2, 0xdc, 0xbd,
- 0x6d, 0xdb, 0xc9, 0xbe, 0xc5, 0xc7, 0x93, 0xbe, 0xa1, 0xfc, 0x70, 0xbe,
- 0x98, 0x2e, 0x28, 0x3e, 0x71, 0xb4, 0x23, 0x3e, 0xed, 0x53, 0x0c, 0xbf,
- 0xf5, 0x44, 0xa0, 0x3d, 0x77, 0x64, 0x95, 0x3e, 0x95, 0x2b, 0xcf, 0xbd,
- 0x45, 0x1c, 0xad, 0xbe, 0x91, 0xc1, 0x02, 0xbe, 0x2c, 0x15, 0x2e, 0xbd,
- 0x9a, 0xfd, 0xcf, 0xbd, 0x58, 0x19, 0x8f, 0x3e, 0x8e, 0x5e, 0xd1, 0xbc,
- 0x8a, 0x1b, 0x86, 0x3d, 0xc8, 0x85, 0xab, 0xb9, 0x31, 0x56, 0xe6, 0x3c,
- 0x05, 0x28, 0x51, 0xbe, 0x52, 0x12, 0x3a, 0x3e, 0x8a, 0x78, 0x7e, 0x3b,
- 0x7e, 0x5b, 0x2d, 0x3e, 0x4e, 0x67, 0xcd, 0x3d, 0xf9, 0x84, 0xa1, 0x3d,
- 0x6f, 0xff, 0x24, 0x3e, 0xf0, 0x6d, 0x98, 0x3d, 0x10, 0xa0, 0x48, 0xbe,
- 0x15, 0x85, 0xcb, 0x3d, 0xeb, 0x99, 0x6a, 0x3d, 0x17, 0x3c, 0x05, 0xbe,
- 0xcc, 0x8c, 0x40, 0xbe, 0xf3, 0x57, 0xa3, 0xbe, 0xd3, 0x55, 0x12, 0xbe,
- 0x56, 0x33, 0x45, 0x3e, 0x0a, 0x18, 0x4f, 0xbc, 0x41, 0x62, 0xa7, 0x3e,
- 0x91, 0xbe, 0x98, 0x3e, 0x72, 0xf4, 0x74, 0x3d, 0x6c, 0xe8, 0x1b, 0xbe,
- 0xa0, 0xd1, 0x57, 0xbe, 0xbd, 0xc7, 0x21, 0xbd, 0x6c, 0x7c, 0xcb, 0x3d,
- 0x58, 0xf1, 0x61, 0xbe, 0x76, 0xa0, 0xbd, 0x3e, 0x66, 0x9b, 0x92, 0xbe,
- 0xfc, 0xd7, 0x64, 0xbe, 0xa2, 0x3a, 0x94, 0xbe, 0xfd, 0xfd, 0x0c, 0xbe,
- 0x09, 0x8f, 0xa5, 0xbb, 0x40, 0x2b, 0xd5, 0x3b, 0xb7, 0x59, 0x82, 0x3e,
- 0xff, 0x17, 0x8a, 0xbf, 0x18, 0xb8, 0x25, 0x3e, 0x3e, 0x5a, 0x8f, 0xbe,
- 0xb5, 0x03, 0x71, 0xbc, 0x12, 0x90, 0xfd, 0x3d, 0xad, 0xd1, 0xa0, 0xbd,
- 0x92, 0x26, 0x8e, 0x3e, 0x01, 0x3d, 0x7e, 0xbc, 0xf8, 0x8f, 0x5f, 0xbc,
- 0x5b, 0xa8, 0x8b, 0xbd, 0x56, 0xff, 0x6d, 0xbe, 0x4d, 0x0b, 0x27, 0xbe,
- 0x40, 0x3f, 0xac, 0xbd, 0xc7, 0xce, 0x00, 0xbe, 0x2d, 0x3a, 0x12, 0xbe,
- 0x09, 0x21, 0x56, 0xbe, 0x90, 0x2b, 0x29, 0x3e, 0xb3, 0x29, 0xdc, 0xbe,
- 0x9e, 0x12, 0xc4, 0x3d, 0xca, 0x6f, 0x9f, 0xbb, 0xd7, 0xfa, 0x79, 0x3d,
- 0xc8, 0xf0, 0x77, 0x3d, 0xdb, 0xc3, 0xc7, 0xbe, 0x1e, 0x21, 0xf0, 0x3d,
- 0x04, 0x58, 0xad, 0xbc, 0xf9, 0x7f, 0x46, 0xbd, 0x20, 0x6f, 0x97, 0xbe,
- 0xbb, 0x1f, 0xfb, 0x3d, 0xcb, 0x04, 0xc6, 0xbd, 0x4f, 0x7c, 0x4c, 0xbd,
- 0xe5, 0x95, 0x17, 0xbf, 0x1c, 0x25, 0xbc, 0x3d, 0x91, 0x93, 0xcd, 0x3e,
- 0x81, 0xe1, 0xad, 0x3d, 0x58, 0x48, 0x53, 0xbe, 0xd3, 0x03, 0x92, 0x3c,
- 0x13, 0x9d, 0xe9, 0xbd, 0x80, 0x92, 0x8f, 0xbd, 0x10, 0xe7, 0x9f, 0x3d,
- 0xe5, 0x01, 0x1f, 0xbe, 0x47, 0x94, 0x3a, 0x3e, 0xfd, 0x56, 0x6a, 0xbe,
- 0x7e, 0x30, 0xc9, 0xbc, 0x18, 0x1f, 0x24, 0x3d, 0x0b, 0xb7, 0x76, 0xbe,
- 0x80, 0x52, 0x87, 0x3e, 0xe2, 0x2d, 0x01, 0xbe, 0xb3, 0xfb, 0x47, 0xbd,
- 0xf4, 0xdf, 0x92, 0x3e, 0x71, 0x08, 0x5a, 0x3e, 0xeb, 0x37, 0xaf, 0x3d,
- 0xc4, 0xc9, 0xf2, 0x3e, 0x38, 0xbd, 0x46, 0xbe, 0x48, 0x37, 0xcd, 0xbb,
- 0xfb, 0xb9, 0xaa, 0xbe, 0xad, 0x1b, 0x2e, 0xbe, 0x1d, 0xba, 0xc2, 0x3e,
- 0x9e, 0x68, 0x95, 0xbe, 0x59, 0x6d, 0x47, 0xbd, 0x23, 0x7a, 0x52, 0x3d,
- 0xe8, 0x45, 0x8a, 0xbd, 0x8b, 0x3f, 0x4a, 0x3e, 0x35, 0x9b, 0xb1, 0x3d,
- 0x00, 0x09, 0x4f, 0x3b, 0xb9, 0xfc, 0xea, 0xbc, 0x1c, 0x14, 0x66, 0x3d,
- 0x34, 0xbf, 0x26, 0xbf, 0x96, 0xb7, 0xbf, 0xbe, 0x63, 0x0d, 0x9f, 0xbe,
- 0x35, 0xc3, 0x6e, 0x3d, 0xfb, 0xec, 0x58, 0x3e, 0x0d, 0xd6, 0x8a, 0xbe,
- 0xf4, 0x16, 0x9c, 0x3e, 0x66, 0x9d, 0xbd, 0xbe, 0x97, 0xae, 0xd8, 0x3d,
- 0x55, 0x99, 0x31, 0xbc, 0x17, 0x04, 0x44, 0x3e, 0x83, 0xac, 0x7e, 0x3e,
- 0x62, 0x46, 0x87, 0xbd, 0xdf, 0x96, 0x5b, 0xbe, 0x9c, 0x56, 0xc6, 0xbd,
- 0x47, 0x9a, 0xb9, 0x3d, 0xdf, 0x2e, 0xf2, 0xbe, 0xd2, 0xa6, 0x93, 0x3e,
- 0xe0, 0x25, 0xd6, 0x3d, 0x70, 0xa3, 0x0c, 0xbf, 0xa4, 0x6f, 0x75, 0xbe,
- 0xd1, 0xea, 0x83, 0xbe, 0x2e, 0x16, 0xe9, 0x3c, 0xa6, 0x05, 0x01, 0xbf,
- 0xa5, 0x75, 0x69, 0xbe, 0x0a, 0x22, 0xd5, 0xbe, 0x98, 0x76, 0x0f, 0xbf,
- 0xa1, 0xca, 0xce, 0xbe, 0x6b, 0xcc, 0xd2, 0xbd, 0x1b, 0xbc, 0x48, 0xbe,
- 0xf0, 0xed, 0x2d, 0xbd, 0x57, 0xd2, 0xce, 0x3e, 0x28, 0x83, 0x0b, 0xbe,
- 0xf2, 0x43, 0x7e, 0x3d, 0x10, 0x67, 0x9a, 0x3d, 0x56, 0x88, 0x82, 0xbd,
- 0xc2, 0xe1, 0x20, 0x3e, 0x3d, 0x2b, 0xb3, 0xbd, 0x8a, 0xfc, 0x6f, 0xbe,
- 0x77, 0xc5, 0xdc, 0xbe, 0x96, 0x0c, 0x17, 0xbf, 0x9c, 0x07, 0x06, 0xbf,
- 0xeb, 0x03, 0xed, 0x3e, 0x74, 0x4a, 0x88, 0x3e, 0x96, 0x7f, 0xa0, 0x3d,
- 0xbc, 0xd1, 0xa2, 0xbe, 0x07, 0x18, 0xce, 0xbe, 0x56, 0x87, 0x46, 0x3d,
- 0x6a, 0x1b, 0x06, 0x3f, 0xe3, 0x29, 0xa9, 0xbe, 0x90, 0x47, 0x03, 0xbe,
- 0xe7, 0xcc, 0x00, 0x3e, 0x83, 0x40, 0xb1, 0xbe, 0x0c, 0x6d, 0x74, 0x3d,
- 0x72, 0x84, 0xcc, 0xbb, 0xad, 0x0d, 0xf3, 0x3e, 0xad, 0xae, 0x01, 0xbf,
- 0x3b, 0x12, 0x53, 0xbf, 0xfa, 0x72, 0x45, 0xbf, 0xcb, 0xab, 0xc6, 0x3d,
- 0xa6, 0x92, 0x8b, 0xbd, 0xc4, 0x60, 0x63, 0x3f, 0x5b, 0xae, 0x6e, 0x3e,
- 0xad, 0x7f, 0x89, 0x3f, 0x15, 0x71, 0xc0, 0x3e, 0x9a, 0x05, 0xe2, 0x3e,
- 0x66, 0x5e, 0xd5, 0x3e, 0xa3, 0xef, 0xa7, 0xbe, 0xfa, 0x41, 0xfd, 0xbc,
- 0x77, 0x37, 0x08, 0xbf, 0x0a, 0x01, 0xab, 0x3e, 0xae, 0xad, 0x82, 0xbd,
- 0x1b, 0x0a, 0x27, 0xbe, 0xc2, 0x2c, 0x9d, 0xbd, 0x6a, 0x4e, 0x7d, 0x3e,
- 0x0d, 0x2b, 0x24, 0xbf, 0x98, 0x86, 0x4b, 0xbe, 0x94, 0xc3, 0x52, 0xbf,
- 0x7c, 0x27, 0xb3, 0xbd, 0x08, 0x14, 0xb6, 0xbc, 0xef, 0x7a, 0xb8, 0x3e,
- 0x5a, 0x31, 0x1f, 0xbe, 0x0c, 0xf2, 0x18, 0x3d, 0xa3, 0xa5, 0xeb, 0xbe,
- 0xd2, 0x9f, 0x60, 0x3d, 0x48, 0xeb, 0xce, 0xbc, 0xcd, 0x1d, 0x31, 0xbd,
- 0xe9, 0xd9, 0xf7, 0x3d, 0x8b, 0x93, 0xc9, 0x3e, 0x4d, 0x9a, 0x3b, 0xbe,
- 0xcd, 0x91, 0x52, 0xbd, 0xf7, 0xe1, 0x13, 0xbf, 0x08, 0xcc, 0x56, 0xbe,
- 0x11, 0x08, 0x32, 0x3f, 0x09, 0x7e, 0x46, 0xbf, 0x3e, 0x88, 0x31, 0xbf,
- 0xd4, 0x8e, 0xb1, 0x3e, 0xcf, 0xb9, 0x69, 0x3f, 0xfa, 0x30, 0xf9, 0xbe,
- 0xb2, 0x67, 0x0d, 0x3f, 0x2a, 0x81, 0x52, 0x3f, 0x6d, 0xea, 0x23, 0x3d,
- 0x90, 0x6d, 0xa8, 0xbe, 0xc7, 0x7f, 0xeb, 0x3e, 0xc3, 0xbf, 0xce, 0xbf,
- 0xc7, 0x89, 0x1a, 0x3e, 0x64, 0x38, 0x3f, 0xbf, 0xeb, 0x11, 0xf7, 0x3e,
- 0x68, 0xad, 0xbc, 0xbe, 0x18, 0xc3, 0x0e, 0xbe, 0x05, 0xd4, 0x7f, 0x3d,
- 0xb6, 0x04, 0xa3, 0xbc, 0xda, 0xcf, 0x2d, 0xbf, 0x04, 0x41, 0x0f, 0x3e,
- 0x3c, 0x08, 0x43, 0xbe, 0xb1, 0x82, 0x3b, 0x3b, 0xf9, 0x52, 0x86, 0x3d,
- 0xa0, 0x0a, 0x6d, 0x3e, 0x6d, 0x2d, 0x4a, 0xbe, 0x21, 0x19, 0xd0, 0x3e,
- 0x54, 0x33, 0x16, 0xbd, 0x91, 0xea, 0xe5, 0xbe, 0xbb, 0x0e, 0x15, 0xbf,
- 0x7c, 0x27, 0xb4, 0x3e, 0x72, 0x56, 0x2b, 0xbe, 0xcf, 0xd6, 0x7c, 0x3d,
- 0xd1, 0x85, 0xa7, 0x3d, 0x67, 0x9b, 0x43, 0xbe, 0xbc, 0x78, 0x6a, 0xbd,
- 0x2b, 0x17, 0x05, 0xbd, 0xb4, 0xd9, 0x43, 0x3e, 0x47, 0xb4, 0x22, 0x3e,
- 0xd7, 0xa6, 0x82, 0x3e, 0x26, 0x13, 0x17, 0x3e, 0x0f, 0xa0, 0x75, 0xbe,
- 0xf8, 0x0c, 0x44, 0x3e, 0xbf, 0x6b, 0x8b, 0x3c, 0x87, 0xcf, 0x48, 0x3e,
- 0xc2, 0xf3, 0x91, 0x3d, 0x7f, 0xdd, 0x60, 0x3c, 0x56, 0x59, 0x01, 0x3e,
- 0xec, 0x23, 0x2c, 0xbe, 0xa0, 0x34, 0x5b, 0x3c, 0xb9, 0xda, 0x76, 0xbd,
- 0x62, 0x69, 0xf5, 0x3d, 0x84, 0x2c, 0xa8, 0x3a, 0xe1, 0xed, 0x26, 0xbe,
- 0x4d, 0x7c, 0x15, 0x3e, 0x6d, 0x75, 0x27, 0xbe, 0xb9, 0x3b, 0x16, 0x3e,
- 0xbc, 0x3a, 0xb5, 0x3d, 0xda, 0xfd, 0xe1, 0x3d, 0xa4, 0x46, 0x22, 0x3e,
- 0x79, 0xa2, 0xd2, 0xba, 0x2d, 0x51, 0xca, 0x3d, 0xd5, 0x02, 0x8b, 0xbd,
- 0x1e, 0x39, 0xa7, 0x3d, 0xdc, 0xe6, 0xd0, 0xbe, 0x88, 0x69, 0x02, 0xbe,
- 0xf3, 0xe1, 0x50, 0x3e, 0x67, 0x4c, 0x3b, 0x3e, 0xdc, 0x24, 0xfa, 0x3d,
- 0xab, 0xd9, 0x4d, 0xbd, 0x1c, 0x47, 0x9e, 0xbe, 0x2a, 0x23, 0xa8, 0x3c,
- 0xfe, 0x6b, 0xa1, 0x3e, 0xfd, 0x41, 0x70, 0x3e, 0xbd, 0x6a, 0x9a, 0x3d,
- 0xe6, 0xf1, 0x70, 0xbf, 0x4c, 0x0e, 0x60, 0xbd, 0x6e, 0x92, 0xa3, 0xbd,
- 0x01, 0x8b, 0xec, 0xbd, 0x92, 0xde, 0x1c, 0x3e, 0x94, 0xec, 0xbe, 0xbc,
- 0xb7, 0x29, 0xe0, 0xbc, 0x4b, 0xeb, 0x13, 0xbe, 0x45, 0x5b, 0x9c, 0x3d,
- 0x68, 0x69, 0x0d, 0xbd, 0x2a, 0x63, 0xaf, 0xbd, 0xe0, 0x51, 0x5e, 0xbe,
- 0x1b, 0x00, 0xba, 0xbd, 0xcb, 0xd6, 0xdd, 0x3d, 0xb8, 0xe9, 0x7d, 0xbc,
- 0xbc, 0xb0, 0x88, 0xbd, 0x2b, 0xcf, 0x4e, 0xbe, 0x35, 0xca, 0x8e, 0xbe,
- 0x21, 0x27, 0x82, 0xbe, 0x18, 0x4e, 0xdf, 0xbd, 0xd5, 0x81, 0x22, 0x3c,
- 0x4f, 0x84, 0xfc, 0x3c, 0xb9, 0x33, 0x6e, 0xbd, 0x1b, 0xb4, 0x8b, 0xbd,
- 0x7c, 0x3f, 0xcc, 0xbd, 0x1e, 0x9e, 0x64, 0xbd, 0x64, 0xbb, 0xa2, 0xbd,
- 0xf7, 0x0b, 0x51, 0xbd, 0xfc, 0x91, 0xff, 0xbd, 0x5e, 0x75, 0x9b, 0x3d,
- 0x58, 0xf7, 0xc8, 0xbe, 0xde, 0xe0, 0xdb, 0x3e, 0x2a, 0x91, 0xe1, 0xbd,
- 0x57, 0x00, 0x9a, 0xbd, 0xac, 0x65, 0x31, 0xbe, 0x67, 0x05, 0x16, 0xbe,
- 0xbc, 0x5f, 0xa9, 0x3d, 0xe4, 0xf6, 0xe5, 0x3e, 0x81, 0x53, 0x0e, 0x3c,
- 0x09, 0x1b, 0xbe, 0xbd, 0xba, 0x06, 0xe0, 0xbc, 0xae, 0xda, 0xd2, 0xbd,
- 0xda, 0x00, 0x24, 0x3e, 0x67, 0x73, 0x0b, 0x3e, 0xaf, 0xad, 0x6e, 0x3e,
- 0xea, 0xcd, 0x62, 0xbe, 0xbd, 0xb5, 0xcc, 0xbc, 0xa0, 0xcc, 0xfa, 0xbe,
- 0xd0, 0x23, 0x43, 0x3e, 0x54, 0x52, 0x68, 0xbd, 0xd8, 0xaf, 0x8a, 0xbe,
- 0xf7, 0x15, 0x4b, 0x3c, 0xce, 0xf4, 0x97, 0x3c, 0xda, 0xa3, 0x86, 0xbd,
- 0xd9, 0x05, 0xb5, 0x3e, 0xce, 0xf1, 0xdb, 0xbc, 0x9a, 0x91, 0x87, 0xbd,
- 0x01, 0x63, 0x3b, 0xbe, 0xbc, 0x5b, 0x24, 0x3d, 0x39, 0x50, 0x77, 0x3e,
- 0x73, 0x1b, 0x6b, 0xbd, 0x11, 0x34, 0x22, 0xbe, 0xdb, 0xe7, 0xdd, 0xbc,
- 0x63, 0xf7, 0x1f, 0x3e, 0xf1, 0xa3, 0x9d, 0x3d, 0x7b, 0x92, 0x40, 0x3e,
- 0x8f, 0x9c, 0x3c, 0xbe, 0x16, 0x0a, 0xcd, 0xbe, 0x77, 0x1b, 0x64, 0x3c,
- 0x8e, 0x85, 0x06, 0xbe, 0xf9, 0x59, 0x6f, 0xbd, 0xa9, 0xf8, 0xca, 0xbe,
- 0xbe, 0x24, 0x17, 0xbf, 0x44, 0xf8, 0xd5, 0x3f, 0xe9, 0xc7, 0x96, 0x3d,
- 0x53, 0x50, 0x7d, 0x3f, 0x6c, 0xd5, 0x27, 0x3d, 0x46, 0x01, 0x4e, 0x3f,
- 0x5f, 0x68, 0xcd, 0xbd, 0x5f, 0x06, 0xcb, 0x3e, 0x74, 0x5f, 0x01, 0xbf,
- 0xe3, 0x08, 0x81, 0xbf, 0xd7, 0x79, 0x1f, 0x3f, 0x0f, 0x64, 0x00, 0xbf,
- 0x38, 0x7f, 0x00, 0xbe, 0xb6, 0xc0, 0xcc, 0x3e, 0xc2, 0xaa, 0x0c, 0xbf,
- 0x63, 0x66, 0x4b, 0xbe, 0x6a, 0x83, 0xeb, 0xbe, 0x70, 0x0a, 0xe6, 0xbe,
- 0x2b, 0x5e, 0x16, 0xbf, 0x04, 0x1c, 0x4c, 0xbe, 0x40, 0x6e, 0x21, 0x3f,
- 0x44, 0xf1, 0x0d, 0x3f, 0x15, 0xce, 0x1d, 0xbf, 0xb9, 0xee, 0x49, 0xbe,
- 0x4f, 0xb2, 0xb0, 0xbe, 0x28, 0xf3, 0x89, 0x3e, 0xef, 0x79, 0x96, 0xbe,
- 0x9d, 0x06, 0x99, 0xbf, 0x71, 0x9b, 0xd6, 0xbd, 0xef, 0xfd, 0xa8, 0xbe,
- 0x74, 0x6b, 0x3f, 0x3f, 0x6d, 0xcc, 0x67, 0xbf, 0xb5, 0x9f, 0x98, 0x3d,
- 0xce, 0x4b, 0xf4, 0x3e, 0xe1, 0xc5, 0x7c, 0x3e, 0xf8, 0x03, 0x24, 0xbe,
- 0x6c, 0x09, 0x0b, 0x3f, 0x92, 0x43, 0x07, 0xbf, 0x96, 0xb4, 0xf3, 0x3d,
- 0x7b, 0xd1, 0xb3, 0xbe, 0xf8, 0x74, 0x9a, 0xbd, 0x56, 0x96, 0x9f, 0xbc,
- 0xe0, 0xc4, 0xb3, 0x3e, 0x82, 0x08, 0x16, 0xbe, 0x21, 0x91, 0xa1, 0x3f,
- 0xaf, 0xdc, 0xa0, 0xbf, 0xbb, 0x70, 0x64, 0xbe, 0x62, 0x48, 0x5f, 0xbe,
- 0x5a, 0xde, 0xed, 0x3c, 0x39, 0xc0, 0x88, 0x3d, 0x3f, 0x1d, 0xa5, 0x3e,
- 0xc1, 0x65, 0x3d, 0xbc, 0xd9, 0xe6, 0x9d, 0x3e, 0x0d, 0x65, 0x7b, 0xbe,
- 0x6e, 0x05, 0x4e, 0x3d, 0x38, 0xda, 0x58, 0xbe, 0xdb, 0xef, 0x1a, 0xbd,
- 0x0e, 0x67, 0x06, 0x3f, 0x74, 0xd0, 0x7c, 0xbe, 0xff, 0x0c, 0x2c, 0x3e,
- 0xe2, 0x4e, 0xa4, 0x3e, 0x98, 0xab, 0x8d, 0x3d, 0x8d, 0x8b, 0xdf, 0xbe,
- 0x4e, 0xfa, 0x44, 0xbf, 0xa2, 0x31, 0xbe, 0xbe, 0x72, 0x05, 0xc6, 0x3d,
- 0xcd, 0x3a, 0x0c, 0xbe, 0x65, 0x94, 0xb1, 0x3e, 0xfe, 0x77, 0xcb, 0xbe,
- 0xee, 0x26, 0x1a, 0x3d, 0xb7, 0x73, 0x90, 0xbd, 0x79, 0xd2, 0xc7, 0x3e,
- 0x90, 0x2c, 0x53, 0xbe, 0x48, 0xec, 0x23, 0x3c, 0xb7, 0xf2, 0x59, 0xbf,
- 0x57, 0xdf, 0xd1, 0xbe, 0xeb, 0x26, 0x24, 0x3f, 0xf3, 0x30, 0x27, 0xbf,
- 0xeb, 0xfc, 0x0c, 0xbf, 0x2d, 0x3d, 0x24, 0xbe, 0x4e, 0x4a, 0xe5, 0x3d,
- 0xfa, 0x88, 0xa8, 0xbd, 0xb2, 0x38, 0x2f, 0x3f, 0x89, 0x4e, 0xe2, 0xbd,
- 0x4f, 0x3c, 0x70, 0xbd, 0xd8, 0xd8, 0x74, 0x3f, 0xe7, 0xe7, 0xc5, 0x3e,
- 0xa4, 0x53, 0x4a, 0x3d, 0x65, 0xa3, 0x93, 0xbe, 0x9b, 0xe7, 0xa1, 0xbe,
- 0xd1, 0x32, 0x91, 0x3e, 0xd9, 0x74, 0x08, 0xbe, 0xde, 0x54, 0x17, 0xbf,
- 0xfb, 0x4e, 0x17, 0x3f, 0x64, 0xa7, 0x4a, 0x3d, 0x27, 0xe8, 0x1a, 0x3d,
- 0x04, 0xf8, 0x51, 0x3e, 0x6e, 0x7d, 0xd9, 0xbe, 0x43, 0xf2, 0x5a, 0x3f,
- 0xe6, 0xfc, 0x2f, 0x3d, 0x9f, 0x20, 0x25, 0xbf, 0xe4, 0x0f, 0xa8, 0xbe,
- 0xbc, 0x3e, 0x82, 0xbe, 0xf4, 0xf5, 0x09, 0xbd, 0x8d, 0xad, 0x3f, 0xbf,
- 0xa4, 0x3e, 0x09, 0xbd, 0x88, 0x2b, 0x0c, 0x3f, 0x25, 0x35, 0x12, 0x3f,
- 0x45, 0xf7, 0x70, 0x3e, 0x7d, 0xa2, 0x8a, 0xbd, 0xfc, 0xc3, 0x21, 0x3e,
- 0x78, 0xc4, 0x2d, 0x3f, 0x8c, 0x20, 0xf8, 0xbe, 0xfc, 0xf9, 0xa7, 0x3d,
- 0xbb, 0x65, 0xb6, 0xbc, 0x70, 0xb9, 0xbf, 0x3e, 0x65, 0x15, 0x05, 0xbf,
- 0xa9, 0xa4, 0xbf, 0x3d, 0x4f, 0x9c, 0xd1, 0x3d, 0x26, 0x3f, 0x65, 0xbe,
- 0x63, 0xd6, 0x44, 0xbe, 0x43, 0x9f, 0x9e, 0xbd, 0x91, 0xf0, 0x1d, 0xbe,
- 0xf5, 0xd3, 0xb5, 0x3d, 0x6c, 0x78, 0x33, 0x3e, 0xdd, 0xcc, 0x47, 0x3d,
- 0x12, 0xbf, 0xdb, 0x3b, 0xc2, 0x18, 0x70, 0x3c, 0x6b, 0xad, 0x64, 0x3e,
- 0x1c, 0x4e, 0x01, 0xbd, 0x52, 0xdc, 0x6e, 0x3d, 0xe9, 0x0f, 0xb3, 0xbd,
- 0xf3, 0x35, 0x4e, 0xbe, 0xb1, 0x95, 0x17, 0x3e, 0xd1, 0xcf, 0x75, 0x3d,
- 0x17, 0x1b, 0x6c, 0x3e, 0xef, 0x87, 0x68, 0xbd, 0x18, 0x1d, 0x4f, 0x3e,
- 0xbf, 0x4d, 0x26, 0xbe, 0xef, 0x28, 0xeb, 0x3d, 0x4a, 0xf9, 0x9a, 0xbc,
- 0xd7, 0x25, 0x1c, 0xbf, 0x51, 0xc3, 0x52, 0xbe, 0x25, 0x51, 0xeb, 0xbd,
- 0xaa, 0x10, 0xe8, 0x3d, 0xb8, 0x4a, 0xf7, 0xbc, 0x82, 0x9d, 0x80, 0x3e,
- 0xb0, 0x26, 0xdc, 0xbe, 0xe3, 0x92, 0xaa, 0xbe, 0xba, 0xa2, 0x29, 0x3c,
- 0xbf, 0x82, 0xd8, 0x3d, 0xf0, 0x4c, 0xa0, 0x3e, 0x61, 0x47, 0x10, 0x3e,
- 0xd2, 0xda, 0xdb, 0x3d, 0xef, 0x93, 0xca, 0x3d, 0xfe, 0x0d, 0x12, 0x3e,
- 0x14, 0xb2, 0x1b, 0x3d, 0xe3, 0x55, 0x9f, 0xbc, 0xbe, 0x32, 0xf9, 0xbd,
- 0x9c, 0x15, 0x1e, 0xbe, 0x1f, 0x8c, 0xec, 0x3d, 0x58, 0x26, 0x42, 0xbe,
- 0xcf, 0x01, 0x12, 0xbf, 0xfa, 0xd3, 0x84, 0xbd, 0x42, 0x0d, 0x01, 0xbf,
- 0x46, 0x4d, 0x06, 0x3d, 0xf8, 0xbe, 0xd0, 0x3d, 0xc6, 0xda, 0x1a, 0xbe,
- 0x51, 0xa3, 0x9b, 0x3e, 0xd9, 0x46, 0x81, 0x3d, 0x04, 0x31, 0xf4, 0xbd,
- 0x52, 0xf3, 0xd6, 0xbd, 0x53, 0x97, 0x26, 0x3e, 0xbf, 0x71, 0xf9, 0xbd,
- 0xa6, 0x3c, 0x99, 0xbe, 0x06, 0xb1, 0x42, 0xbe, 0xfa, 0xf4, 0x41, 0x3e,
- 0x9a, 0x0f, 0x00, 0xbd, 0xe7, 0x72, 0x18, 0x3e, 0x07, 0x37, 0xc5, 0xbe,
- 0x91, 0xe5, 0x06, 0x3e, 0x2c, 0x97, 0x1f, 0x3d, 0xea, 0x6d, 0xaa, 0x3b,
- 0xd3, 0x8a, 0x47, 0xbe, 0x87, 0x22, 0xc6, 0x3c, 0xc6, 0xcf, 0xdb, 0x3d,
- 0xd8, 0x6b, 0x49, 0xbd, 0x2e, 0xe7, 0xef, 0x3d, 0x20, 0x83, 0xb9, 0x3d,
- 0xd7, 0x23, 0x4b, 0xbe, 0x4e, 0x69, 0xcf, 0xbb, 0x64, 0x31, 0xc1, 0xbe,
- 0x05, 0xc4, 0xaa, 0xbe, 0x0f, 0xc4, 0x50, 0xbf, 0x15, 0x7b, 0x68, 0xbe,
- 0xb8, 0x58, 0xc3, 0x3e, 0xc6, 0xb7, 0xcc, 0x3c, 0x16, 0x9b, 0x20, 0xbc,
- 0x85, 0x00, 0x20, 0xbd, 0xe9, 0xb7, 0xa8, 0xbe, 0xf4, 0xc6, 0x8c, 0xbe,
- 0x2f, 0x2b, 0x98, 0xbd, 0x22, 0xa9, 0x00, 0x3d, 0x43, 0x77, 0xf4, 0x3e,
- 0x81, 0x45, 0x54, 0x3d, 0x1b, 0xad, 0x0a, 0xbe, 0x8e, 0x9c, 0xe1, 0xbe,
- 0xcf, 0xf1, 0xdd, 0xbb, 0xe3, 0x85, 0x39, 0xbd, 0x08, 0xbc, 0x53, 0x3e,
- 0xa9, 0x79, 0xc9, 0x3e, 0x30, 0x07, 0x8b, 0xbe, 0x65, 0x56, 0xc4, 0x3e,
- 0xca, 0x97, 0xdf, 0xbc, 0x86, 0x5f, 0x18, 0x3d, 0xd2, 0x40, 0x3a, 0xbe,
- 0x80, 0xb0, 0x82, 0xbe, 0x2a, 0x1a, 0xb5, 0x3e, 0xfb, 0x76, 0xd6, 0x3e,
- 0x06, 0xbb, 0x9f, 0xbe, 0xab, 0x6a, 0xa3, 0x3d, 0x69, 0x87, 0x3e, 0xbe,
- 0xe4, 0xd7, 0x66, 0xbd, 0xbe, 0x4b, 0xbe, 0x3e, 0x2e, 0x2d, 0x1d, 0xbe,
- 0xf4, 0x7b, 0x9a, 0x3b, 0xa0, 0xeb, 0xd3, 0x3d, 0xd7, 0xaa, 0x7c, 0xbe,
- 0x3b, 0xce, 0x9b, 0xbe, 0xc8, 0x93, 0x58, 0xbe, 0x33, 0x43, 0x8a, 0xbd,
- 0xfe, 0x1a, 0x49, 0x3e, 0x5c, 0x82, 0xaf, 0xbc, 0xf2, 0x16, 0xc5, 0xbd,
- 0x49, 0x41, 0x8c, 0xbd, 0xa9, 0x05, 0x2c, 0x3c, 0xdb, 0x86, 0x8a, 0xbe,
- 0xa2, 0x70, 0x04, 0xbf, 0x8d, 0xe2, 0xf2, 0xbd, 0x66, 0xce, 0x7d, 0xbd,
- 0x25, 0xca, 0x7b, 0x3d, 0x0d, 0xe0, 0x74, 0x3e, 0xad, 0xb8, 0x50, 0xbd,
- 0x3e, 0x31, 0x26, 0xbd, 0x20, 0x88, 0x35, 0x3d, 0x90, 0x64, 0x51, 0x3c,
- 0x8a, 0x87, 0xc4, 0xbd, 0x29, 0x74, 0x50, 0xbc, 0xdc, 0xc8, 0x6e, 0xbe,
- 0xc9, 0x38, 0x5d, 0x3e, 0x32, 0xbb, 0x5d, 0xbc, 0xf6, 0x67, 0x3c, 0x3e,
- 0x1b, 0xa8, 0xdc, 0xbd, 0xaf, 0x70, 0xb6, 0x3d, 0xfb, 0x90, 0xca, 0xbd,
- 0x84, 0xe5, 0xa0, 0x3d, 0xf2, 0xda, 0x4e, 0x3e, 0x8e, 0x65, 0x4e, 0x3e,
- 0x00, 0x74, 0xe6, 0x3c, 0x32, 0x50, 0x15, 0xbe, 0xaf, 0x73, 0xa1, 0x3d,
- 0x25, 0x1e, 0xa7, 0x3e, 0x12, 0x72, 0x8c, 0xbc, 0xd2, 0xdc, 0x52, 0x3d,
- 0x2f, 0xde, 0x73, 0xbe, 0xab, 0xc5, 0x9b, 0xbd, 0x8d, 0x62, 0x95, 0xbd,
- 0xee, 0x4e, 0x13, 0xbe, 0x26, 0x87, 0xa5, 0x3e, 0xa6, 0x15, 0x79, 0xbe,
- 0x0a, 0xa6, 0xa3, 0xbe, 0x36, 0xb5, 0xe5, 0x3e, 0xf4, 0xc5, 0x32, 0xbd,
- 0x83, 0x08, 0xb0, 0xbc, 0x34, 0x92, 0xdd, 0x3d, 0x48, 0xef, 0xcb, 0x3d,
- 0x26, 0xcd, 0x0b, 0xbe, 0x89, 0x65, 0x3a, 0xbd, 0xe8, 0x86, 0x6c, 0x3e,
- 0xcb, 0x21, 0x2a, 0xbf, 0x5b, 0xa9, 0x41, 0x3e, 0xd2, 0xc6, 0x05, 0xbf,
- 0x02, 0x3e, 0x50, 0x3e, 0xf9, 0x69, 0x00, 0xbf, 0xd0, 0x79, 0x8f, 0x3d,
- 0x2c, 0x1c, 0xe7, 0x3c, 0x48, 0x8d, 0x19, 0xbd, 0x2e, 0x21, 0x2a, 0xbe,
- 0x45, 0xff, 0x51, 0x3c, 0xe7, 0xad, 0xc1, 0x3d, 0x74, 0xca, 0x75, 0xbd,
- 0xef, 0x44, 0x66, 0xbc, 0xa4, 0x26, 0xa2, 0xbe, 0x8d, 0x8f, 0x6e, 0xbd,
- 0x02, 0xd0, 0x34, 0xbe, 0xf9, 0x40, 0x12, 0x3e, 0x9b, 0x52, 0x10, 0xbe,
- 0xfd, 0x6a, 0xc1, 0x3d, 0x42, 0x7f, 0x6c, 0xbe, 0xcf, 0x25, 0xd5, 0x3d,
- 0xbb, 0x1a, 0x5b, 0x3d, 0x49, 0xc5, 0xdf, 0xbe, 0x22, 0xd0, 0x8c, 0x3e,
- 0x9b, 0x1e, 0x59, 0xbe, 0x76, 0x67, 0xf9, 0x3d, 0xd1, 0x1c, 0x1a, 0x3b,
- 0x5c, 0x97, 0x02, 0x3e, 0xef, 0xc3, 0xf4, 0xbd, 0x35, 0x7f, 0x08, 0xbe,
- 0xa7, 0xae, 0xfb, 0xbe, 0xb3, 0x31, 0x95, 0xbd, 0x31, 0x3d, 0x20, 0x3d,
- 0xaf, 0x14, 0xb3, 0x3c, 0x83, 0x83, 0xd0, 0x3c, 0x77, 0x19, 0xc6, 0x3c,
- 0x8b, 0x9c, 0xa5, 0x3d, 0x10, 0x08, 0xb8, 0xbe, 0xd5, 0x6e, 0x7b, 0x3d,
- 0xca, 0x4f, 0xbf, 0xbc, 0xa4, 0x53, 0xa6, 0x3e, 0x5e, 0x75, 0xe4, 0xbc,
- 0xb7, 0xf8, 0x51, 0x3e, 0xe4, 0x54, 0xbb, 0xbd, 0x67, 0xb1, 0x1c, 0xbf,
- 0x86, 0xc4, 0x1f, 0xbd, 0x03, 0x1a, 0x2a, 0x3c, 0x75, 0xe5, 0x2e, 0x3d,
- 0x12, 0x87, 0xaa, 0x3e, 0x26, 0x1b, 0x81, 0xbe, 0x89, 0x4c, 0xa8, 0x3d,
- 0xb1, 0x84, 0xc3, 0x3e, 0x3d, 0x67, 0x4f, 0xbe, 0x1d, 0x39, 0x23, 0xbb,
- 0x8a, 0xcc, 0xf4, 0xbe, 0x7e, 0x5f, 0x1d, 0x3c, 0x76, 0x3a, 0xd0, 0x3e,
- 0x70, 0xb4, 0x44, 0xbe, 0x8c, 0x2a, 0x27, 0xbe, 0x97, 0x9f, 0xa0, 0x3e,
- 0xa4, 0xa1, 0xca, 0xbb, 0xcf, 0x0c, 0x80, 0x3d, 0x8f, 0xda, 0x41, 0x3c,
- 0x7b, 0x6b, 0x7e, 0xbe, 0xbf, 0xa7, 0x25, 0x3d, 0x48, 0x92, 0xd0, 0xbe,
- 0x41, 0xea, 0x23, 0xbf, 0x6b, 0x79, 0x5a, 0xbe, 0xef, 0x8c, 0xae, 0xbe,
- 0xd9, 0xb6, 0x80, 0xbd, 0x0a, 0x44, 0x9c, 0x3e, 0xe7, 0x30, 0x8d, 0x3d,
- 0x35, 0xe3, 0xb7, 0x3d, 0xcb, 0x6d, 0xcb, 0x3d, 0x2e, 0xf7, 0x0d, 0x3e,
- 0x42, 0x76, 0xcf, 0xbc, 0x1d, 0xc3, 0xca, 0x3d, 0x55, 0xdf, 0xae, 0xbc,
- 0xb8, 0xf9, 0xcf, 0xbf, 0xca, 0x86, 0xc5, 0xbe, 0x69, 0x78, 0xaa, 0xbe,
- 0x93, 0xb7, 0x53, 0x3c, 0x19, 0x5b, 0x1a, 0xbf, 0x39, 0x4d, 0xdf, 0x3d,
- 0x4a, 0xa6, 0x87, 0xbe, 0xce, 0x10, 0x63, 0xbf, 0x7e, 0x33, 0x33, 0xbf,
- 0xd2, 0x8d, 0x0f, 0x3f, 0xba, 0xbb, 0x8e, 0x3e, 0x7b, 0x80, 0x04, 0xbf,
- 0x0c, 0x9a, 0xa5, 0x3d, 0x65, 0xcf, 0x86, 0x3e, 0x01, 0x30, 0xe8, 0xbe,
- 0x96, 0x3a, 0xc2, 0xbe, 0x68, 0x50, 0x88, 0xbe, 0xbe, 0xf1, 0x1c, 0xbe,
- 0x22, 0x3a, 0x84, 0xbe, 0x99, 0x73, 0xb6, 0x3e, 0x41, 0x84, 0x96, 0x3e,
- 0x1b, 0x2d, 0xe8, 0x3d, 0x35, 0x77, 0xba, 0x3c, 0xcf, 0x8c, 0xba, 0xbd,
- 0x2c, 0x19, 0xa5, 0x3e, 0x7d, 0x30, 0x8b, 0xbe, 0x1f, 0x7d, 0x4d, 0xbe,
- 0xbe, 0x34, 0x82, 0x3d, 0x57, 0x5e, 0x34, 0xbf, 0xff, 0xf0, 0x49, 0x3e,
- 0x47, 0xa8, 0x87, 0x3e, 0x1f, 0xbd, 0x51, 0x3e, 0x1e, 0x97, 0xa8, 0x3d,
- 0xbf, 0x92, 0x11, 0x3e, 0x52, 0x1a, 0xb0, 0x3d, 0x52, 0x9d, 0xbd, 0xbc,
- 0xa4, 0xaa, 0xc6, 0x3e, 0x79, 0x66, 0x86, 0x3d, 0x71, 0xce, 0x16, 0x3e,
- 0xdc, 0xda, 0x79, 0xbf, 0x0d, 0x77, 0x1c, 0xbf, 0x38, 0xf4, 0xd8, 0xbe,
- 0x71, 0x46, 0x5c, 0x3e, 0x49, 0xb7, 0x8c, 0x3e, 0xe5, 0xd2, 0x02, 0xbf,
- 0xa6, 0x20, 0xcb, 0xbf, 0x41, 0x71, 0xff, 0xbd, 0x5e, 0x98, 0x5b, 0xbe,
- 0x48, 0x1b, 0xa3, 0xbc, 0xd4, 0x41, 0x1e, 0x3f, 0x83, 0xe7, 0x83, 0x3e,
- 0x57, 0x7c, 0xef, 0x3e, 0x5b, 0xaa, 0xbc, 0x3d, 0xe2, 0xc8, 0x28, 0x3f,
- 0xb7, 0xc7, 0x02, 0x3f, 0x8e, 0x3f, 0xcc, 0xbe, 0xaf, 0x63, 0x4d, 0x3d,
- 0x6d, 0x5b, 0x13, 0xbf, 0x03, 0xc3, 0x0b, 0xbf, 0x51, 0x8a, 0xa3, 0x3d,
- 0xb7, 0xa1, 0xdc, 0xbd, 0x95, 0xdd, 0xb5, 0x3e, 0x19, 0x0f, 0x96, 0x3e,
- 0xa1, 0x23, 0x2f, 0xbf, 0x11, 0x6f, 0x54, 0xbc, 0x87, 0x38, 0x64, 0xbe,
- 0xfc, 0xbc, 0x96, 0xbe, 0xe0, 0xf9, 0xfa, 0xbd, 0xe8, 0x82, 0x25, 0x3f,
- 0x34, 0x78, 0x07, 0xbf, 0x1a, 0x8a, 0x15, 0xbc, 0x31, 0xa1, 0x8c, 0x3d,
- 0xe4, 0xb5, 0x07, 0xbe, 0x89, 0x28, 0x19, 0xbb, 0xa2, 0x7c, 0x00, 0x3e,
- 0x07, 0x74, 0x3b, 0x3e, 0x48, 0x20, 0x76, 0xbe, 0x7a, 0x91, 0x43, 0xbd,
- 0x26, 0x9e, 0xef, 0xbd, 0xcf, 0x89, 0xfc, 0x3e, 0x50, 0x7e, 0xa3, 0xbe,
- 0x03, 0xe4, 0x5a, 0x3f, 0x87, 0x33, 0x2c, 0xbf, 0xb9, 0x38, 0x7c, 0xbf,
- 0x9b, 0x08, 0xc6, 0x3d, 0x0b, 0xf5, 0x98, 0x3e, 0x83, 0x2c, 0x28, 0xbf,
- 0x82, 0xdf, 0x74, 0xbe, 0xe4, 0x05, 0xa5, 0x3e, 0xfd, 0x65, 0x58, 0xbd,
- 0x65, 0x3a, 0x93, 0xbe, 0x1f, 0xab, 0x2a, 0x3f, 0xaf, 0x12, 0xed, 0x3e,
- 0xd0, 0x30, 0xc9, 0x3e, 0x81, 0x20, 0x61, 0x3d, 0x0c, 0x78, 0x64, 0x3f,
- 0x16, 0x5c, 0x8d, 0xbe, 0xb3, 0xfa, 0x5a, 0xbe, 0x13, 0x72, 0x05, 0xbe,
- 0x17, 0xba, 0xa3, 0x3d, 0x85, 0x26, 0xe8, 0xbe, 0xc0, 0xe1, 0xcb, 0x3d,
- 0x80, 0x39, 0x74, 0x3a, 0x0f, 0x21, 0x82, 0x3c, 0xac, 0xbf, 0x06, 0xbd,
- 0x0d, 0x1e, 0x05, 0x3e, 0x89, 0x7b, 0xef, 0xbc, 0x23, 0x0f, 0x47, 0x3e,
- 0x90, 0x1e, 0xb7, 0x3c, 0xc4, 0x81, 0x87, 0x3e, 0x19, 0x12, 0xbf, 0xbe,
- 0xb0, 0x91, 0xc2, 0x3d, 0x9d, 0xc7, 0xde, 0xbd, 0x24, 0x69, 0x89, 0x3d,
- 0x00, 0x1b, 0xb5, 0x3d, 0x0f, 0xc6, 0x21, 0x3d, 0xb3, 0xe0, 0x03, 0xbc,
- 0xc1, 0xd0, 0x32, 0xbd, 0x71, 0xd6, 0x31, 0x3e, 0xbe, 0x7e, 0x85, 0x3e,
- 0xc8, 0x3e, 0x5a, 0x3e, 0x0b, 0xf9, 0x13, 0x3e, 0xb9, 0xc3, 0x20, 0xbe,
- 0x17, 0x1f, 0x12, 0x3e, 0xa7, 0x9f, 0xea, 0xbd, 0xe2, 0x7b, 0x46, 0x3e,
- 0xda, 0xa9, 0x06, 0x3e, 0x0b, 0x46, 0x93, 0xbe, 0x85, 0xd3, 0x03, 0x3e,
- 0xa7, 0x8d, 0x0c, 0xbe, 0xf9, 0x34, 0xb5, 0xbd, 0x23, 0x0d, 0x66, 0x3d,
- 0xfd, 0x56, 0x00, 0x3e, 0xb8, 0x5c, 0x11, 0x3b, 0x8d, 0x00, 0x1d, 0xbe,
- 0xd8, 0xc8, 0xd7, 0x3b, 0x79, 0x15, 0xfd, 0x3d, 0xbe, 0x71, 0x4d, 0x3e,
- 0x4c, 0xb0, 0x8f, 0xbd, 0x9f, 0xbd, 0x6a, 0xbc, 0x8f, 0x79, 0x81, 0xbd,
- 0x9c, 0x2d, 0x41, 0xbe, 0xde, 0x9b, 0x5c, 0x3e, 0xcd, 0x81, 0x74, 0xbd,
- 0xb0, 0xc2, 0x0a, 0x3c, 0x2b, 0xaa, 0x41, 0xbc, 0x64, 0x5b, 0xe0, 0xbe,
- 0x92, 0xa5, 0x81, 0x3e, 0xd6, 0xac, 0x8d, 0x3e, 0xbd, 0x21, 0xe6, 0x3d,
- 0xa9, 0xec, 0xfa, 0xbc, 0xa3, 0xd4, 0x37, 0xbd, 0x53, 0xcf, 0xe4, 0x3d,
- 0xdc, 0x11, 0x64, 0x3e, 0x30, 0xd0, 0x46, 0x3e, 0x12, 0x1c, 0x86, 0x3c,
- 0x6a, 0xf7, 0x27, 0xbf, 0xee, 0x56, 0x59, 0xbd, 0x4c, 0xeb, 0xf6, 0xbe,
- 0x8e, 0x81, 0x67, 0x3c, 0x21, 0xbc, 0x1a, 0xbe, 0x77, 0xbd, 0xcb, 0x3c,
- 0xba, 0xb0, 0xdf, 0x3d, 0xc5, 0x40, 0x8f, 0xbd, 0x3a, 0xea, 0x50, 0xbe,
- 0x67, 0xf2, 0xc5, 0x3d, 0x57, 0xa7, 0x11, 0x3e, 0x53, 0xdb, 0x8b, 0xbe,
- 0x0a, 0xc5, 0xf5, 0xbc, 0x8e, 0x43, 0x78, 0x3d, 0x88, 0xd1, 0x63, 0xbd,
- 0x6d, 0xb2, 0xbc, 0xbd, 0xf9, 0x97, 0x66, 0xbe, 0x59, 0x75, 0x8b, 0xbe,
- 0x56, 0x4c, 0x21, 0xbe, 0x6b, 0xee, 0x90, 0xbe, 0x7f, 0x6b, 0xd7, 0xbc,
- 0xfe, 0xab, 0x4c, 0xbd, 0x36, 0x81, 0xf0, 0x3c, 0xb4, 0xee, 0x87, 0xbd,
- 0xd8, 0xf4, 0x5a, 0xbe, 0xfa, 0x20, 0x5d, 0x3d, 0xa7, 0x43, 0x82, 0x3d,
- 0xe9, 0x6d, 0x04, 0x3d, 0x19, 0x8f, 0xda, 0xbd, 0xd0, 0x90, 0xc3, 0x3d,
- 0xe3, 0x21, 0xad, 0xbe, 0xc0, 0xff, 0xe2, 0x3e, 0x22, 0x93, 0x0e, 0x3e,
- 0x71, 0x51, 0xbd, 0xbe, 0x20, 0xd5, 0xb7, 0xbd, 0xac, 0xca, 0xfe, 0xbd,
- 0x1c, 0xe1, 0xcb, 0xbc, 0x8d, 0xc9, 0x2d, 0x3e, 0x67, 0x72, 0xe3, 0x3d,
- 0x42, 0xcc, 0x57, 0x3d, 0x4b, 0xe2, 0x7e, 0x3e, 0x94, 0x38, 0x9c, 0xbd,
- 0x21, 0x14, 0x35, 0x3e, 0xdb, 0x3a, 0x2f, 0x3d, 0x90, 0x18, 0xb0, 0x3e,
- 0xbb, 0x3e, 0xb3, 0xbe, 0xe9, 0xc8, 0xfa, 0xbd, 0xe5, 0xde, 0x84, 0xbe,
- 0x37, 0x83, 0xd5, 0xbd, 0x46, 0x26, 0x1e, 0x3e, 0x8c, 0x84, 0x32, 0xbe,
- 0x88, 0xb0, 0x19, 0xbe, 0x0b, 0x9a, 0xcf, 0x3d, 0x78, 0x13, 0x21, 0xbf,
- 0x52, 0xcc, 0x84, 0xbc, 0x1b, 0x4b, 0x00, 0x3e, 0xab, 0x5b, 0x37, 0xbe,
- 0x52, 0x74, 0x75, 0xbe, 0x3d, 0x30, 0xb5, 0xbd, 0x19, 0xc5, 0x5c, 0x3e,
- 0x4b, 0x0b, 0xad, 0x3a, 0x9b, 0x8b, 0x2b, 0xbe, 0x79, 0x04, 0xc8, 0xbd,
- 0xbb, 0x61, 0x99, 0xbd, 0x51, 0x22, 0x99, 0x3d, 0xf3, 0x23, 0x72, 0xbe,
- 0x40, 0xf2, 0xa5, 0xbd, 0xa1, 0x4d, 0x97, 0xbe, 0x1a, 0xdd, 0x99, 0x3d,
- 0x2e, 0xb0, 0x0c, 0xbe, 0xba, 0x1f, 0x05, 0x3e, 0x4f, 0x70, 0xcc, 0xbd,
- 0x4c, 0x16, 0x05, 0xbf, 0x8e, 0xff, 0xdb, 0x3f, 0x60, 0xa3, 0x13, 0xbc,
- 0x16, 0x21, 0x78, 0x3f, 0x8b, 0xd1, 0x71, 0xbd, 0x22, 0xd3, 0x5d, 0x3f,
- 0xc2, 0xef, 0xe0, 0xbd, 0x5e, 0xb1, 0xb2, 0x3e, 0x3e, 0xa0, 0x0e, 0xbf,
- 0x0f, 0x3a, 0x94, 0xbf, 0x92, 0xb7, 0x24, 0x3f, 0x5f, 0xbf, 0x90, 0xbe,
- 0x64, 0x8d, 0x76, 0xbe, 0x58, 0x88, 0xf6, 0x3d, 0x55, 0xe3, 0x1a, 0xbf,
- 0x70, 0x02, 0xad, 0xbe, 0x24, 0xf3, 0x01, 0xbf, 0x2e, 0x2a, 0xc7, 0xbe,
- 0xc0, 0xd1, 0x0d, 0xbf, 0x1b, 0xd0, 0x10, 0xbf, 0xe3, 0x4a, 0x2e, 0x3f,
- 0x50, 0xcd, 0xf4, 0x3e, 0xe3, 0x57, 0x1c, 0xbf, 0xee, 0x60, 0x89, 0xbe,
- 0xe3, 0x15, 0x91, 0xbe, 0x5e, 0x58, 0x99, 0x3e, 0xab, 0x6b, 0x7d, 0xbe,
- 0xd9, 0x86, 0x88, 0xbf, 0x65, 0xaa, 0x37, 0xbe, 0xff, 0xf6, 0xc9, 0xbe,
- 0x34, 0x8c, 0x16, 0x3f, 0xdb, 0x50, 0x71, 0xbf, 0x40, 0x4c, 0x0d, 0xbe,
- 0x9a, 0x29, 0x73, 0x3e, 0x42, 0xeb, 0xc8, 0x3e, 0x04, 0xe1, 0x8b, 0xbe,
- 0x43, 0xbf, 0x2b, 0x3f, 0xb8, 0xb0, 0xb3, 0xbe, 0x77, 0x37, 0xac, 0x3c,
- 0x68, 0xe7, 0x91, 0xbe, 0x3d, 0x71, 0x39, 0xbe, 0x7b, 0x2b, 0x65, 0xbd,
- 0xf4, 0xf4, 0xd0, 0x3d, 0xd6, 0xeb, 0x8c, 0xbe, 0xb3, 0x96, 0x84, 0x3f,
- 0xde, 0x87, 0x56, 0xbf, 0x58, 0xcd, 0x09, 0xbd, 0x29, 0xb2, 0xcf, 0xbe,
- 0xe2, 0x89, 0xff, 0xbc, 0x80, 0xcc, 0x8d, 0x3d, 0x1c, 0x0b, 0xe1, 0x3e,
- 0x7f, 0x47, 0x82, 0x3d, 0x8d, 0x04, 0xc2, 0x3d, 0xde, 0xd8, 0x96, 0xbe,
- 0x90, 0x24, 0x2f, 0xbe, 0xa1, 0x1d, 0x93, 0xbe, 0x41, 0x95, 0xe9, 0xbd,
- 0x6f, 0x96, 0xb8, 0x3e, 0xa1, 0x20, 0x82, 0xbe, 0xbf, 0xa1, 0x00, 0x3f,
- 0x99, 0x09, 0xdc, 0x3e, 0xd5, 0xf3, 0xca, 0xbc, 0xad, 0xcf, 0x94, 0xbe,
- 0x82, 0x38, 0x16, 0xbf, 0xe6, 0x6d, 0x05, 0xbf, 0xf4, 0x96, 0xb1, 0x3d,
- 0x55, 0xe5, 0xb8, 0x3c, 0xcc, 0xaf, 0x38, 0x3f, 0x69, 0xab, 0x85, 0xbe,
- 0x15, 0x46, 0x37, 0xbd, 0x49, 0x42, 0x5e, 0x3d, 0x2c, 0x22, 0x29, 0x3e,
- 0xcf, 0x5f, 0xa4, 0x3d, 0x7e, 0xc1, 0xbe, 0x3d, 0x4f, 0xce, 0x6c, 0xbf,
- 0x1f, 0x33, 0x94, 0xbe, 0x68, 0x6f, 0x15, 0x3f, 0xfa, 0x9e, 0x45, 0xbf,
- 0x80, 0x40, 0x27, 0xbf, 0x67, 0x81, 0x31, 0xbe, 0x78, 0x0c, 0x98, 0x3d,
- 0xa6, 0xc5, 0x6d, 0x3d, 0x1d, 0x63, 0x23, 0x3f, 0xc1, 0x8f, 0xb3, 0xbc,
- 0xd3, 0x1f, 0x8b, 0x3d, 0x21, 0x9e, 0x86, 0x3f, 0x1c, 0xb5, 0xbb, 0x3d,
- 0x56, 0x37, 0x75, 0x3e, 0xba, 0x6f, 0x25, 0xbf, 0xbb, 0xf3, 0x1d, 0xbe,
- 0x91, 0x81, 0x08, 0xbe, 0x79, 0x70, 0xf3, 0xbd, 0x63, 0xca, 0x6e, 0xbe,
- 0x9d, 0xc8, 0xab, 0x3e, 0x05, 0x77, 0x44, 0x3e, 0xa2, 0x04, 0xdd, 0x3d,
- 0x70, 0x5e, 0x06, 0xbd, 0x72, 0x3b, 0xbe, 0xbe, 0x3b, 0xa7, 0x3a, 0x3e,
- 0xc0, 0xac, 0x91, 0xbe, 0xf7, 0x9d, 0xbe, 0xbe, 0xcb, 0xda, 0xb9, 0xbe,
- 0x7b, 0xd0, 0x07, 0xbe, 0x46, 0x63, 0xbc, 0xbd, 0x44, 0x2a, 0x5e, 0xbf,
- 0x43, 0x8f, 0x45, 0x3d, 0xd9, 0x64, 0x3c, 0x3f, 0xa9, 0xa2, 0xd1, 0x3e,
- 0x4a, 0x2a, 0x28, 0x3e, 0xfa, 0xa2, 0xc8, 0x3c, 0xe1, 0xd3, 0x35, 0xbd,
- 0x1d, 0x53, 0x10, 0x3f, 0xdd, 0x7c, 0x96, 0xbe, 0x7e, 0x4c, 0x19, 0x3e,
- 0x0f, 0xca, 0xf2, 0xbd, 0x90, 0xaa, 0x91, 0x3e, 0x21, 0xb4, 0xc9, 0x3d,
- 0x9d, 0xb1, 0xe5, 0x3d, 0x16, 0x61, 0x9e, 0x3e, 0xe8, 0xe3, 0x9e, 0xbd,
- 0x51, 0x1f, 0x8d, 0xbe, 0x9e, 0x34, 0xc6, 0xbb, 0x52, 0xc7, 0x4a, 0xbe,
- 0xd8, 0x20, 0xf1, 0x3c, 0x8c, 0x9b, 0xae, 0x3e, 0x96, 0x37, 0xeb, 0x3d,
- 0x65, 0x24, 0x07, 0xbe, 0xf4, 0xeb, 0xf0, 0x3c, 0x49, 0x7b, 0x8b, 0xbb,
- 0x74, 0xa7, 0x9c, 0xbd, 0xf7, 0x2f, 0xfa, 0xbd, 0xf4, 0x91, 0x33, 0x3c,
- 0x7a, 0x14, 0xf6, 0xbd, 0x42, 0x37, 0xac, 0x3e, 0xb3, 0xfc, 0x2b, 0xbe,
- 0xfd, 0x91, 0xfc, 0x3d, 0x6c, 0x92, 0x6e, 0xbe, 0x4f, 0xbe, 0x0a, 0xbc,
- 0x96, 0x1f, 0x38, 0x3d, 0x41, 0xfc, 0x70, 0x3e, 0x2c, 0x74, 0xcd, 0xbd,
- 0xb2, 0xbc, 0x4c, 0xbf, 0xe4, 0x4f, 0xdf, 0xbd, 0x34, 0xfe, 0xe2, 0x3e,
- 0x5a, 0x39, 0x3b, 0x3e, 0x14, 0xf1, 0x34, 0xbe, 0x6b, 0x7d, 0xd6, 0x3d,
- 0x44, 0x12, 0x1a, 0xbf, 0x83, 0xf2, 0xce, 0xbe, 0x07, 0x13, 0xf2, 0xbd,
- 0x34, 0xb7, 0xdb, 0x3d, 0xf9, 0xe4, 0x26, 0xbd, 0x5c, 0x85, 0x72, 0x3d,
- 0x61, 0x16, 0x02, 0x3c, 0xe2, 0xb0, 0xb2, 0xbd, 0xa9, 0xea, 0x35, 0x3e,
- 0xbc, 0x5d, 0x61, 0x3e, 0x28, 0x6f, 0x38, 0xbc, 0x87, 0xb7, 0x78, 0xbc,
- 0x82, 0x24, 0x60, 0xbe, 0x74, 0xbf, 0xa8, 0x3c, 0x0c, 0xae, 0xb7, 0xbe,
- 0xc9, 0x22, 0xde, 0xbe, 0xd3, 0x27, 0x19, 0x3e, 0x65, 0xf2, 0xe2, 0xbe,
- 0xcd, 0x7d, 0xa4, 0x3e, 0xb7, 0x77, 0xf8, 0x3d, 0xc7, 0x79, 0xa1, 0xbd,
- 0x2f, 0x36, 0xa7, 0x3e, 0xaa, 0xb2, 0x92, 0x3d, 0x5f, 0x17, 0x25, 0xbe,
- 0x90, 0xc5, 0x14, 0xbd, 0x83, 0x6d, 0x82, 0x3e, 0xe5, 0x6e, 0xc2, 0xbd,
- 0xef, 0x1d, 0x64, 0xbe, 0x1f, 0xa9, 0xd3, 0xbd, 0xbd, 0xfd, 0x3c, 0x3e,
- 0x40, 0x7e, 0xb7, 0xbe, 0x67, 0x02, 0x07, 0xbe, 0x88, 0xef, 0x7e, 0xbe,
- 0x98, 0x77, 0x07, 0x3e, 0x1e, 0x54, 0xdd, 0xbe, 0xfa, 0xbd, 0xe6, 0xbd,
- 0xf4, 0x74, 0x1a, 0xbe, 0x73, 0xd0, 0x1b, 0x3e, 0xdd, 0x37, 0x3c, 0x3e,
- 0xb2, 0xe8, 0xdc, 0xbd, 0x05, 0x15, 0x97, 0x3a, 0x3b, 0xed, 0x1b, 0xbd,
- 0xa3, 0x95, 0x85, 0xbe, 0xfb, 0x42, 0x44, 0xbd, 0xf2, 0xdd, 0x02, 0xbe,
- 0x6b, 0x76, 0x9d, 0xbe, 0x02, 0x4a, 0x41, 0xbf, 0x68, 0x2a, 0x90, 0xbe,
- 0xbd, 0xb5, 0xf9, 0x3e, 0x0e, 0x01, 0x1e, 0x3d, 0x25, 0x03, 0xf1, 0xbd,
- 0x99, 0x14, 0xae, 0xbd, 0x3c, 0xfe, 0x01, 0xbf, 0x28, 0x17, 0x8a, 0xbd,
- 0xa4, 0x1f, 0x19, 0xbe, 0x02, 0x7c, 0x05, 0x3e, 0x22, 0x9f, 0xe6, 0x3e,
- 0xbd, 0x04, 0x9c, 0x3d, 0x0a, 0x6a, 0x4d, 0xbe, 0x2e, 0x10, 0xe2, 0xbe,
- 0xe4, 0x3c, 0x27, 0x3d, 0xb9, 0x9b, 0x6c, 0x3e, 0xd4, 0x53, 0x05, 0xbe,
- 0x28, 0xde, 0x32, 0xbd, 0xe6, 0x59, 0x11, 0xbe, 0xb8, 0x2d, 0x5a, 0x3d,
- 0xb7, 0x80, 0xa0, 0xbe, 0x20, 0x50, 0x75, 0x3e, 0xcf, 0x1b, 0x6b, 0xbe,
- 0x62, 0x5d, 0x0e, 0xbf, 0x77, 0xf4, 0x73, 0x3d, 0x65, 0xad, 0xe6, 0x3e,
- 0xf7, 0xf5, 0xc3, 0xbd, 0xea, 0x4f, 0x47, 0xbd, 0x2d, 0xe8, 0x3a, 0x3d,
- 0x99, 0xcb, 0xd1, 0x3d, 0xe2, 0x72, 0x0d, 0x3e, 0x92, 0xfe, 0x6c, 0xbe,
- 0xde, 0x13, 0x29, 0xbd, 0x19, 0x65, 0x64, 0xbd, 0x8e, 0x23, 0x7b, 0xbe,
- 0xf5, 0xc6, 0xaa, 0xbe, 0x0c, 0x00, 0xd2, 0xbb, 0x25, 0x33, 0x6d, 0xbd,
- 0x1b, 0xe1, 0x97, 0x3d, 0xc2, 0xfc, 0xb5, 0x3e, 0x46, 0x3a, 0x2c, 0xbe,
- 0x7c, 0x54, 0x22, 0xbd, 0x34, 0xba, 0x12, 0x3e, 0xea, 0xaf, 0x42, 0xbe,
- 0x45, 0x8c, 0x24, 0xbf, 0x3e, 0xcb, 0xa3, 0x3c, 0xd9, 0xd4, 0x08, 0xbe,
- 0x05, 0x1a, 0xfd, 0xbd, 0xce, 0x1e, 0xa7, 0x3e, 0x7b, 0x94, 0x21, 0xbe,
- 0xb7, 0x2c, 0xfe, 0x3c, 0xec, 0x58, 0x15, 0xbe, 0xfe, 0x1f, 0x47, 0xbe,
- 0x68, 0x81, 0xde, 0xbd, 0x2e, 0xda, 0x39, 0xbd, 0xeb, 0x5b, 0x81, 0xbe,
- 0xf6, 0xe6, 0xb2, 0x3e, 0x0f, 0x6b, 0x3a, 0x3d, 0x6a, 0xb0, 0x5c, 0x3e,
- 0x7b, 0x70, 0x16, 0xbe, 0x2a, 0x8c, 0x39, 0x3e, 0x69, 0x86, 0xc2, 0xbe,
- 0x3d, 0xaa, 0x0f, 0x3e, 0x34, 0x70, 0x93, 0x3e, 0xe8, 0x1b, 0xeb, 0x3e,
- 0xe6, 0xe7, 0x64, 0xbe, 0x96, 0x9c, 0x1b, 0xbe, 0x4f, 0x86, 0xcd, 0x3e,
- 0x06, 0xc5, 0xf1, 0x3e, 0x96, 0xb4, 0x52, 0x3d, 0xa4, 0x00, 0x53, 0xbe,
- 0x25, 0x8b, 0x97, 0xbe, 0x4a, 0xaa, 0x95, 0xbe, 0xa6, 0x2f, 0x49, 0x3c,
- 0x6c, 0xda, 0x16, 0xbe, 0xa4, 0xc6, 0x05, 0x3e, 0xb9, 0x27, 0x25, 0xbe,
- 0x00, 0xdf, 0x0b, 0xbf, 0x0c, 0x83, 0xb5, 0x3e, 0xef, 0x63, 0x36, 0xbe,
- 0xd7, 0x60, 0x00, 0xbe, 0x18, 0x82, 0x3e, 0xbe, 0x1a, 0xa0, 0x90, 0xbd,
- 0xe0, 0x13, 0xf7, 0xbc, 0xab, 0x5c, 0x9c, 0xbd, 0xdd, 0xed, 0x5e, 0x3e,
- 0x72, 0x1c, 0xa6, 0xbe, 0x02, 0x31, 0xd1, 0x3d, 0x44, 0x1f, 0x1f, 0xbf,
- 0x37, 0xd2, 0xd1, 0x3e, 0xb6, 0x4f, 0x00, 0xbf, 0x3d, 0x3d, 0x57, 0xbd,
- 0xfc, 0x2a, 0x01, 0x3e, 0xb5, 0xaa, 0x83, 0xbe, 0x79, 0x8a, 0x5f, 0xbe,
- 0x27, 0x9a, 0x99, 0xbd, 0xb7, 0x25, 0xb6, 0xbd, 0x63, 0xc6, 0x79, 0xbd,
- 0x7a, 0xd8, 0x94, 0xbe, 0x8d, 0xd5, 0x8e, 0xbe, 0xe4, 0x34, 0x3b, 0xbc,
- 0x09, 0x9e, 0xcb, 0xbe, 0x45, 0xcc, 0xa9, 0xbd, 0x70, 0x00, 0xae, 0xbd,
- 0x96, 0x31, 0x76, 0x3e, 0x24, 0xd0, 0x01, 0xbf, 0xa6, 0xdf, 0x8d, 0x3d,
- 0x64, 0x4f, 0x55, 0xbc, 0x08, 0x08, 0x29, 0xbf, 0x50, 0x61, 0xb0, 0x3d,
- 0x6f, 0xe5, 0x88, 0xbe, 0x22, 0xc6, 0x0e, 0x3d, 0x03, 0x7a, 0x0e, 0xbe,
- 0x5e, 0x4f, 0x26, 0xbe, 0x5a, 0x08, 0xc2, 0x3d, 0xa5, 0x7a, 0x1d, 0xbe,
- 0xa3, 0x83, 0xbc, 0xbe, 0x3f, 0xb9, 0xda, 0xbe, 0xab, 0x34, 0xe5, 0xbd,
- 0x76, 0x92, 0x16, 0x3e, 0xfd, 0xa8, 0x88, 0x3b, 0x9f, 0x4e, 0x88, 0x3c,
- 0x80, 0x8d, 0xec, 0xbc, 0xfe, 0x68, 0x05, 0xbf, 0x63, 0x17, 0xac, 0x3c,
- 0x83, 0xee, 0x0d, 0xbd, 0x08, 0x37, 0xc5, 0x3e, 0x3b, 0xb4, 0x6b, 0xbc,
- 0xd0, 0xf4, 0xfb, 0x3d, 0x30, 0xae, 0xa3, 0xbd, 0xb1, 0x76, 0x46, 0xbf,
- 0x4f, 0x2a, 0x29, 0xbd, 0xe4, 0xe3, 0x2d, 0xbe, 0x55, 0xa9, 0x6f, 0xbd,
- 0xa7, 0xa4, 0x12, 0x3e, 0x24, 0x24, 0xe2, 0x3c, 0xb0, 0xd7, 0x15, 0xbe,
- 0xee, 0x2b, 0x3b, 0x3d, 0x85, 0xcd, 0xef, 0xbd, 0xc4, 0x75, 0x5b, 0x3e,
- 0x58, 0xcd, 0x09, 0xbf, 0x72, 0x8b, 0x53, 0x3e, 0x6f, 0x5c, 0x1b, 0x3f,
- 0x2b, 0x0f, 0x91, 0xbe, 0x6a, 0x54, 0xa2, 0xbd, 0x82, 0xd0, 0x0c, 0x3f,
- 0x2d, 0x3b, 0x77, 0xbd, 0x9e, 0x09, 0x4f, 0xbc, 0xfd, 0xcc, 0x0b, 0xbd,
- 0xba, 0x5c, 0x52, 0xbc, 0x07, 0x0c, 0x92, 0xbb, 0xe9, 0x22, 0x9a, 0xbe,
- 0xde, 0x4e, 0x24, 0xbf, 0xd3, 0x2b, 0xb1, 0xbd, 0xdd, 0xb0, 0xc8, 0xbd,
- 0xf9, 0x79, 0x26, 0x3c, 0x3d, 0x8c, 0x88, 0x3e, 0x03, 0x19, 0xfb, 0xbd,
- 0x7f, 0x9e, 0x2e, 0x3f, 0x05, 0x98, 0x4f, 0xbd, 0x59, 0xd0, 0x98, 0x3e,
- 0x2d, 0xea, 0x83, 0x3e, 0xde, 0xea, 0xa4, 0xbc, 0x9b, 0xe2, 0x22, 0x3f,
- 0x8a, 0xa4, 0x99, 0xbf, 0x84, 0x56, 0x0b, 0xbf, 0x3f, 0xc7, 0xb3, 0x3c,
- 0x91, 0xe6, 0xe4, 0xbe, 0x5e, 0x2b, 0xd1, 0xbe, 0x4a, 0x53, 0xbd, 0x3e,
- 0xf0, 0x30, 0xaa, 0x3e, 0x71, 0xc1, 0x19, 0xbe, 0xbe, 0x5b, 0x6c, 0xbe,
- 0xf8, 0xf7, 0x9e, 0xbe, 0xa7, 0x8e, 0xa7, 0x3e, 0x43, 0x1c, 0x36, 0xbf,
- 0x84, 0x1a, 0xf7, 0xbe, 0x0d, 0xa8, 0x65, 0x3f, 0x99, 0x06, 0xb9, 0x3e,
- 0xb3, 0x50, 0x2e, 0x3f, 0x30, 0xde, 0x4d, 0xbd, 0x97, 0x5f, 0x58, 0x3d,
- 0xa5, 0x7d, 0x7b, 0xbe, 0x0e, 0x46, 0x7b, 0x3e, 0xc4, 0xbd, 0x29, 0xbe,
- 0x96, 0x8a, 0x0b, 0xbe, 0x01, 0x79, 0x5e, 0x3d, 0xdd, 0x08, 0x29, 0x3c,
- 0x03, 0x4f, 0x87, 0x3e, 0x70, 0xbf, 0x9a, 0xbe, 0xa2, 0x13, 0x07, 0xbd,
- 0x21, 0xd5, 0x7b, 0x3c, 0x55, 0x9d, 0x24, 0xbf, 0xd4, 0x37, 0xee, 0x3c,
- 0xc7, 0x39, 0xac, 0x3e, 0xe2, 0x5d, 0x72, 0xba, 0x3a, 0xdd, 0x00, 0xbf,
- 0xa6, 0x68, 0x35, 0x3e, 0x2d, 0xb2, 0xd1, 0x3d, 0xbd, 0xfb, 0xae, 0x3c,
- 0x70, 0xf7, 0x33, 0xbe, 0xc7, 0xd4, 0xc9, 0xbe, 0x2e, 0x34, 0x1f, 0xbe,
- 0xa0, 0x02, 0x8c, 0xbe, 0x1f, 0xbe, 0xb7, 0xbd, 0xf1, 0xc9, 0x4d, 0xbe,
- 0xb6, 0xd5, 0xde, 0x3e, 0xc1, 0xc3, 0x75, 0xbe, 0x9d, 0x1c, 0xb2, 0xbe,
- 0xb2, 0xc0, 0x8c, 0xbf, 0x8a, 0x0d, 0x93, 0xbc, 0xea, 0xa6, 0x3d, 0xbe,
- 0xe1, 0x1c, 0x09, 0xbd, 0x63, 0x12, 0x85, 0x3e, 0x0e, 0x77, 0xaa, 0x3e,
- 0x0e, 0x54, 0x12, 0x3f, 0x1c, 0x10, 0x2c, 0x3e, 0xae, 0x24, 0xc4, 0xbd,
- 0x0e, 0xa6, 0x45, 0x3e, 0xf7, 0x72, 0x09, 0xbf, 0x03, 0x65, 0x89, 0x3e,
- 0xc8, 0x44, 0x3c, 0xbe, 0x39, 0x21, 0x44, 0xbf, 0xe8, 0xef, 0xde, 0x3d,
- 0x4d, 0xdf, 0x28, 0xbd, 0x8d, 0xcd, 0x67, 0xbf, 0xd4, 0x4a, 0x5b, 0x3e,
- 0x5d, 0xdc, 0x80, 0xbe, 0x76, 0x21, 0x2b, 0x3e, 0x10, 0x14, 0x64, 0xbf,
- 0x29, 0x58, 0x83, 0xbe, 0x1b, 0x2e, 0x7c, 0x3d, 0x85, 0xf8, 0x3a, 0x3f,
- 0x95, 0xac, 0xce, 0xbe, 0x3a, 0x4b, 0x26, 0xbf, 0x84, 0x29, 0xeb, 0xbe,
- 0xc8, 0x41, 0xb0, 0x3e, 0x64, 0x7e, 0xea, 0x3d, 0xc0, 0x91, 0xb7, 0x3d,
- 0x53, 0xab, 0x3f, 0x3d, 0x15, 0x80, 0x6b, 0x3d, 0x5d, 0x73, 0x0d, 0xbf,
- 0x06, 0xfd, 0x0c, 0xbe, 0x99, 0x44, 0xc3, 0x3e, 0xd5, 0x39, 0x48, 0x3e,
- 0x05, 0xca, 0x90, 0xbe, 0x3d, 0x99, 0x71, 0x3d, 0x79, 0x34, 0x69, 0xbf,
- 0xef, 0xaa, 0xd6, 0x3d, 0x9f, 0x83, 0x8f, 0xbe, 0xf9, 0x3f, 0x34, 0xbf,
- 0xb2, 0x19, 0x9c, 0xbe, 0x8f, 0x70, 0x2b, 0x3e, 0x29, 0xac, 0x27, 0x3f,
- 0x09, 0x89, 0x42, 0x3f, 0x71, 0xb0, 0x45, 0x3e, 0xab, 0x7c, 0xbb, 0x3e,
- 0x1b, 0xec, 0x97, 0x3e, 0xf3, 0x07, 0x0d, 0xbe, 0x9e, 0x01, 0x03, 0x3f,
- 0x37, 0xc8, 0x89, 0xbc, 0xb6, 0x02, 0x1f, 0xbd, 0x8c, 0xe0, 0xeb, 0x3d,
- 0xf1, 0x1f, 0x01, 0xbe, 0x13, 0x1d, 0xbf, 0xbd, 0xa4, 0x53, 0xaa, 0x3d,
- 0x76, 0xf3, 0xa4, 0xbe, 0x4a, 0x63, 0x82, 0x3b, 0xf4, 0xbc, 0x18, 0xbd,
- 0x7d, 0xb6, 0x9c, 0xbd, 0x75, 0xee, 0x0e, 0xbc, 0xaf, 0x72, 0x4e, 0x3e,
- 0xe0, 0x69, 0x0c, 0xbd, 0xd5, 0x73, 0x6e, 0x3f, 0xce, 0xb6, 0x8b, 0x3d,
- 0x13, 0x1f, 0x76, 0x3e, 0xff, 0x8d, 0x2b, 0x3e, 0xcd, 0xaf, 0x68, 0x3e,
- 0x70, 0x32, 0x30, 0xbc, 0xe0, 0x28, 0x2c, 0xbd, 0xc0, 0x7d, 0x8e, 0xbd,
- 0x0a, 0x93, 0xe8, 0xbd, 0xb2, 0xd8, 0x7b, 0xbc, 0x05, 0x42, 0x48, 0x3e,
- 0x6c, 0x8c, 0x52, 0x3e, 0x03, 0x0c, 0x7e, 0xbd, 0x7e, 0x91, 0x2f, 0x3c,
- 0xc4, 0xb3, 0x51, 0x3e, 0x74, 0xe6, 0x16, 0x3c, 0x26, 0x3e, 0xd5, 0x3d,
- 0x2b, 0xdf, 0x0d, 0x3e, 0x4c, 0xf1, 0xa2, 0xbe, 0x5a, 0xa8, 0x02, 0x3e,
- 0xd8, 0xd5, 0x5a, 0xbe, 0x25, 0x39, 0x39, 0xbe, 0x53, 0xfe, 0x5d, 0x3d,
- 0xb9, 0xea, 0xe3, 0x3d, 0xb7, 0xc8, 0x7f, 0xbd, 0x63, 0xc3, 0x38, 0xbe,
- 0x95, 0x8f, 0x1e, 0xbe, 0x96, 0xa9, 0x40, 0x3e, 0xfb, 0xf1, 0x4f, 0x3e,
- 0x8f, 0xed, 0x4d, 0xbd, 0xf5, 0x9a, 0x14, 0xbe, 0xc1, 0x8c, 0x0e, 0xbe,
- 0xc2, 0x18, 0xf4, 0xba, 0x2f, 0x95, 0x58, 0x3e, 0x98, 0x2b, 0x3e, 0xbe,
- 0x09, 0xf8, 0x06, 0xbe, 0x7b, 0x1e, 0xa0, 0xbe, 0xc5, 0x3b, 0xa5, 0xbe,
- 0xa7, 0x55, 0x04, 0x3c, 0x1b, 0x3a, 0x8d, 0x3e, 0x95, 0x69, 0x30, 0x3e,
- 0x97, 0x92, 0xf3, 0xbc, 0x75, 0x65, 0xcc, 0xbd, 0xc5, 0xef, 0xad, 0xbc,
- 0x03, 0x67, 0x61, 0x3e, 0xec, 0xd9, 0x5c, 0x3e, 0xd0, 0x63, 0x31, 0x3e,
- 0x91, 0x13, 0x02, 0xbf, 0x95, 0x27, 0xed, 0xbc, 0xb0, 0x9c, 0x59, 0xbe,
- 0x36, 0x62, 0x66, 0xbc, 0xbe, 0x52, 0x56, 0xbe, 0x3c, 0x95, 0xd6, 0x3d,
- 0xac, 0xc7, 0x28, 0x3e, 0x48, 0xf3, 0xb1, 0xbd, 0xfb, 0x10, 0x6d, 0xbb,
- 0xdf, 0x0e, 0x55, 0xbc, 0xf1, 0x44, 0x30, 0xbd, 0x19, 0x19, 0xcc, 0xbe,
- 0x0e, 0x23, 0x43, 0xbe, 0x9b, 0x46, 0x4e, 0xbd, 0x92, 0x2d, 0x11, 0xbd,
- 0x28, 0x6b, 0x58, 0x3d, 0x8e, 0x9c, 0x89, 0xbe, 0x33, 0x33, 0xc4, 0xbd,
- 0x1f, 0xaf, 0x04, 0xbe, 0x6f, 0x9f, 0x05, 0xbf, 0x4e, 0x05, 0x6b, 0x3c,
- 0x60, 0x55, 0x96, 0xbd, 0xfa, 0x28, 0xc9, 0xbd, 0xb4, 0xac, 0x77, 0xbd,
- 0x3d, 0x86, 0x47, 0xbd, 0x22, 0x9c, 0x94, 0xbc, 0xb3, 0x74, 0x9d, 0xbc,
- 0xcb, 0x3e, 0xfa, 0xbd, 0xec, 0x07, 0x1a, 0xbe, 0x3f, 0x21, 0x89, 0x3e,
- 0x33, 0x40, 0x57, 0xbe, 0x69, 0xbb, 0x65, 0x3e, 0xa9, 0x4b, 0x0a, 0x3d,
- 0x88, 0xe1, 0x89, 0xbd, 0x9f, 0x50, 0xae, 0x3c, 0x54, 0x90, 0x83, 0x3d,
- 0x78, 0x33, 0x45, 0xbd, 0xe0, 0x99, 0x95, 0x3e, 0x27, 0xe6, 0x12, 0xbe,
- 0x76, 0xdd, 0xe5, 0xbc, 0x75, 0x7c, 0xd8, 0x3e, 0xcc, 0x2e, 0x38, 0xbd,
- 0x18, 0x97, 0x88, 0x3d, 0xb9, 0x58, 0x66, 0xbe, 0x60, 0xef, 0x6e, 0x3e,
- 0xc1, 0xc5, 0x85, 0xbe, 0x21, 0xc5, 0x7d, 0xbe, 0x26, 0xb9, 0x01, 0xbf,
- 0x89, 0xdb, 0xbd, 0xbd, 0x4e, 0xce, 0x66, 0x3e, 0xef, 0x72, 0x2d, 0xbe,
- 0xb6, 0x44, 0xa6, 0xbe, 0x6a, 0x7d, 0xa0, 0x3d, 0x7f, 0x55, 0x02, 0xbf,
- 0xc5, 0x23, 0xa8, 0xbe, 0xe7, 0x68, 0x8a, 0x3e, 0x00, 0x07, 0xfb, 0xbc,
- 0x31, 0x06, 0x7c, 0xbe, 0xc1, 0x15, 0xcf, 0x3d, 0x76, 0x2d, 0x6d, 0xbd,
- 0x4b, 0x6d, 0xb7, 0x3d, 0x63, 0xe6, 0xd6, 0xbe, 0x96, 0x81, 0x39, 0xbe,
- 0x31, 0xcb, 0xfb, 0x3d, 0x69, 0x8e, 0xe2, 0xbc, 0xd0, 0x0c, 0x57, 0xbe,
- 0x99, 0xb5, 0x68, 0xbd, 0xc6, 0x97, 0xb4, 0xbd, 0x60, 0x7b, 0xfe, 0x3d,
- 0x1f, 0x91, 0x7f, 0x3c, 0x4d, 0x0e, 0x8d, 0x3e, 0xfd, 0x16, 0x9b, 0xbd,
- 0x5e, 0x43, 0x0b, 0xbf, 0xce, 0x61, 0xd0, 0x3f, 0xa8, 0xec, 0x98, 0x3e,
- 0x9d, 0x23, 0x51, 0x3f, 0x54, 0xf0, 0xaf, 0x3d, 0xcd, 0x8b, 0x23, 0x3f,
- 0x1f, 0x2f, 0xbc, 0xbd, 0x5c, 0x76, 0x9b, 0x3e, 0x3f, 0x0d, 0xfd, 0xbe,
- 0x24, 0xa2, 0x85, 0xbf, 0x8a, 0x24, 0x04, 0x3f, 0x03, 0xe9, 0xa4, 0xba,
- 0x3f, 0x28, 0xbd, 0xbb, 0xbf, 0xa8, 0x9d, 0x3e, 0x3f, 0x32, 0x53, 0xbe,
- 0x24, 0x98, 0xb8, 0xbd, 0xee, 0xd0, 0xd9, 0xbe, 0x05, 0xb7, 0x8d, 0xbe,
- 0xe8, 0xbe, 0x0a, 0xbf, 0x26, 0x1a, 0xc0, 0xbe, 0x2d, 0x28, 0xed, 0x3e,
- 0xea, 0xfa, 0x09, 0x3f, 0xca, 0xf3, 0x3d, 0xbf, 0xd7, 0x2e, 0x51, 0xbe,
- 0xdb, 0xab, 0xcc, 0xbe, 0xe7, 0x35, 0xa8, 0x3e, 0xc2, 0x13, 0x0f, 0x3e,
- 0xff, 0x73, 0x80, 0xbf, 0xf5, 0xf8, 0x37, 0xbe, 0x9d, 0x83, 0x21, 0xbf,
- 0xcc, 0x29, 0x47, 0x3f, 0x65, 0xf4, 0x6b, 0xbf, 0xd0, 0x29, 0x12, 0x3d,
- 0xb4, 0x7f, 0xba, 0xbd, 0x32, 0x52, 0x16, 0x3d, 0x4c, 0xb7, 0x1c, 0xbe,
- 0x51, 0xf9, 0x1d, 0x3f, 0xa1, 0x96, 0xd3, 0xbe, 0x39, 0x60, 0x0f, 0x3e,
- 0xc9, 0x54, 0x7f, 0xbe, 0xb3, 0x44, 0xa5, 0xbd, 0x58, 0xf8, 0x80, 0xbd,
- 0xef, 0x21, 0x71, 0x3e, 0x05, 0xcf, 0x7d, 0xbe, 0x66, 0x6d, 0x9d, 0x3f,
- 0x09, 0xcf, 0x51, 0xbf, 0xd3, 0x5d, 0x9c, 0xbe, 0x1c, 0x88, 0xf2, 0xbe,
- 0x64, 0xcd, 0x27, 0x3e, 0x88, 0x05, 0xc9, 0x3d, 0x9d, 0xe7, 0x06, 0x3f,
- 0x66, 0x09, 0xef, 0xbd, 0xec, 0x85, 0x76, 0x3e, 0xef, 0x7c, 0x95, 0xbe,
- 0xd6, 0x70, 0x4e, 0xbe, 0xfd, 0x1f, 0x37, 0xbe, 0x18, 0x0f, 0x0f, 0x3a,
- 0x12, 0x5a, 0x8f, 0x3e, 0x78, 0x61, 0x5f, 0xbe, 0xab, 0xa4, 0xdc, 0x3e,
- 0xdc, 0xec, 0xa3, 0x3e, 0x6a, 0x13, 0x09, 0xbd, 0x36, 0x23, 0x6e, 0xbd,
- 0x5a, 0x41, 0x0c, 0xbf, 0x82, 0x53, 0x1a, 0xbf, 0xdd, 0xf5, 0x40, 0x3d,
- 0xe7, 0xac, 0x27, 0xbe, 0xe9, 0x8d, 0x1d, 0x3f, 0x9f, 0xa2, 0xf7, 0xbe,
- 0x55, 0x75, 0x02, 0x3e, 0x07, 0xc6, 0x0d, 0x3e, 0x1f, 0x05, 0x9e, 0x3e,
- 0x5e, 0x84, 0x87, 0xbe, 0x20, 0x38, 0x0d, 0xbe, 0x6e, 0xb9, 0x51, 0xbf,
- 0x38, 0xa2, 0x85, 0xbe, 0x68, 0x70, 0xae, 0x3e, 0x6b, 0xd7, 0x3b, 0xbf,
- 0x4d, 0xf8, 0xff, 0xbe, 0x89, 0x7f, 0xe8, 0xbc, 0x42, 0x34, 0xcf, 0xbd,
- 0x58, 0xe5, 0x86, 0xbd, 0x94, 0xe6, 0x22, 0x3f, 0x7a, 0x20, 0x91, 0xbb,
- 0x53, 0xb7, 0x13, 0xbe, 0x3c, 0x14, 0x86, 0x3f, 0xa1, 0xd2, 0xbc, 0x3e,
- 0x65, 0x49, 0xa0, 0x3e, 0x9a, 0xf6, 0x0a, 0xbf, 0x3d, 0x84, 0x00, 0xbe,
- 0x61, 0x13, 0x8a, 0xbd, 0xf7, 0x41, 0x77, 0xbe, 0xd1, 0x44, 0xd2, 0xbe,
- 0xf0, 0x82, 0x89, 0x3e, 0x81, 0xcc, 0x70, 0x3e, 0x70, 0x7c, 0xc2, 0xbd,
- 0x04, 0x5c, 0x05, 0xbe, 0x2d, 0x45, 0xb0, 0xbe, 0x7e, 0x1c, 0x72, 0x3e,
- 0xf8, 0x7d, 0x1a, 0xbf, 0xc9, 0x02, 0xc3, 0xbe, 0x9b, 0xf7, 0xe1, 0xbe,
- 0xcf, 0xb7, 0x64, 0xbe, 0xbe, 0x81, 0x08, 0xbe, 0xab, 0xe6, 0x5d, 0xbf,
- 0x27, 0xa0, 0x8a, 0xbd, 0x0a, 0x16, 0x0a, 0x3f, 0x25, 0xad, 0x09, 0x3f,
- 0x52, 0x80, 0x21, 0x3e, 0x85, 0xbb, 0x0a, 0x3e, 0x4e, 0xbb, 0x9d, 0xbe,
- 0xa7, 0xc1, 0x5b, 0x3f, 0x43, 0x1d, 0x4e, 0xbe, 0x66, 0xd6, 0x26, 0xbd,
- 0x48, 0x2e, 0x79, 0xbe, 0xaa, 0xda, 0xee, 0x3e, 0x58, 0xaf, 0x11, 0xbd,
- 0xfb, 0xd9, 0xe0, 0xbe, 0x7d, 0x6e, 0xca, 0x3f, 0x67, 0x0a, 0x1d, 0xbd,
- 0x32, 0x4d, 0x99, 0x3f, 0x94, 0xf5, 0xce, 0x3d, 0x6c, 0x89, 0x61, 0x3f,
- 0x81, 0xc8, 0xc0, 0x3d, 0xa8, 0x48, 0x59, 0x3e, 0x3a, 0x2c, 0xe1, 0xbe,
- 0x2f, 0x23, 0x88, 0xbf, 0x69, 0x66, 0x28, 0x3f, 0x8a, 0xe1, 0xbc, 0xbe,
- 0x6e, 0x1a, 0x05, 0x3d, 0x2a, 0x3f, 0x69, 0x3e, 0x93, 0x68, 0x13, 0xbf,
- 0xa7, 0x72, 0xa2, 0xbe, 0x34, 0x25, 0x8b, 0xbe, 0xcd, 0xfe, 0xe2, 0xbe,
- 0x0b, 0xb3, 0xff, 0xbe, 0xe9, 0x2e, 0x80, 0xbd, 0x88, 0x2c, 0x3c, 0x3f,
- 0x50, 0xd4, 0x14, 0x3f, 0xae, 0x44, 0x25, 0xbf, 0x14, 0x17, 0xab, 0xbe,
- 0x4f, 0x13, 0x42, 0xbe, 0xb1, 0x94, 0xb2, 0x3e, 0xd6, 0xf2, 0xb3, 0xbd,
- 0xee, 0x7d, 0x9f, 0xbf, 0xc1, 0x97, 0x8d, 0x3d, 0x30, 0xac, 0xe9, 0xbe,
- 0x1f, 0x30, 0x12, 0x3f, 0xf8, 0xf7, 0x3f, 0xbf, 0x05, 0xfb, 0x6f, 0xbc,
- 0xdd, 0x10, 0xb4, 0x3e, 0x9f, 0xf4, 0x90, 0x3e, 0xd6, 0x52, 0xa6, 0xbd,
- 0xf9, 0x94, 0x0c, 0x3f, 0x64, 0x64, 0xc1, 0xbe, 0xb7, 0xc6, 0x4f, 0x3e,
- 0x62, 0x05, 0xcc, 0xbe, 0xa7, 0x66, 0x10, 0xbe, 0xe1, 0x07, 0xd5, 0xbd,
- 0x92, 0x2a, 0xa8, 0x3d, 0x9e, 0x73, 0xbe, 0xbd, 0xd7, 0xea, 0xa3, 0x3f,
- 0xc7, 0xd6, 0xf3, 0xbe, 0xba, 0x17, 0x41, 0xbd, 0xd6, 0xa9, 0x84, 0xbd,
- 0xe1, 0xcb, 0x5d, 0x3e, 0xac, 0x18, 0x8c, 0x3d, 0xf3, 0x63, 0x04, 0x3f,
- 0x6f, 0x93, 0xd9, 0xbd, 0x9f, 0x71, 0x37, 0x3f, 0x9f, 0xd6, 0xec, 0xbd,
- 0x0f, 0xde, 0x0d, 0xbe, 0xe5, 0x5a, 0x15, 0xbe, 0x85, 0xc4, 0x8b, 0x3d,
- 0x56, 0x19, 0xa8, 0x3e, 0xf8, 0x38, 0x2e, 0xbf, 0x03, 0x6f, 0xd7, 0x3e,
- 0xcd, 0xf6, 0xaf, 0x3e, 0xc7, 0x73, 0x83, 0xbd, 0x92, 0xbf, 0x82, 0xbe,
- 0x9d, 0xf0, 0x4b, 0xbf, 0x8c, 0xca, 0x2f, 0xbe, 0xce, 0xca, 0x66, 0xbd,
- 0x08, 0xc8, 0xa1, 0x3d, 0xc8, 0x96, 0x14, 0x3f, 0xbe, 0x16, 0x9e, 0xbe,
- 0x51, 0xb3, 0xa1, 0x3d, 0x59, 0xc9, 0xdf, 0x3d, 0xef, 0x80, 0x97, 0x3e,
- 0xc9, 0xde, 0x9b, 0xbe, 0x80, 0xe2, 0x39, 0xbe, 0x89, 0xa3, 0x2d, 0xbf,
- 0x8c, 0x47, 0x7d, 0x3e, 0x73, 0xc3, 0x71, 0x3f, 0x33, 0x34, 0x3e, 0xbf,
- 0x8c, 0x61, 0x14, 0xbf, 0xfb, 0x2f, 0xb8, 0x3d, 0xab, 0x02, 0xf3, 0xbc,
- 0x08, 0x26, 0xb4, 0xbe, 0x0d, 0x80, 0x20, 0x3f, 0x7d, 0x41, 0xc7, 0xbe,
- 0xf7, 0x8b, 0xaf, 0xbd, 0xef, 0xcd, 0x49, 0x3f, 0x75, 0xa4, 0x25, 0x3e,
- 0x13, 0x81, 0x66, 0x3e, 0x70, 0x58, 0xa9, 0xbe, 0x63, 0xbb, 0x27, 0xbe,
- 0xef, 0xb9, 0x38, 0x3f, 0x74, 0xd2, 0x9e, 0xbe, 0x57, 0x9a, 0xac, 0xbe,
- 0x09, 0x0e, 0xf5, 0x3d, 0xb2, 0xc5, 0x20, 0x3e, 0xe5, 0x2c, 0xf6, 0xbd,
- 0xbd, 0x70, 0xd9, 0x3e, 0xca, 0x28, 0xfa, 0xbe, 0xbe, 0xa6, 0x09, 0x3f,
- 0xfb, 0x09, 0x27, 0xbf, 0x92, 0xbb, 0x08, 0xbf, 0x51, 0xc9, 0xcb, 0xbe,
- 0x80, 0xe1, 0x3a, 0x3e, 0x9f, 0x99, 0xa8, 0xbd, 0x26, 0x80, 0x2b, 0xbf,
- 0x41, 0x8c, 0x50, 0xbe, 0x03, 0xec, 0xef, 0x3e, 0xba, 0x54, 0x4d, 0x3f,
- 0x8e, 0x19, 0x3c, 0x3e, 0x80, 0x0f, 0x8b, 0x3d, 0xec, 0xbb, 0xb1, 0xbc,
- 0xe2, 0x46, 0x51, 0x3f, 0x1e, 0x44, 0x95, 0xbd, 0xe0, 0xc2, 0x64, 0x3e,
- 0xb6, 0x6e, 0x52, 0xbe, 0x0a, 0x84, 0x85, 0x3e, 0xf7, 0xb5, 0x88, 0xbe,
- 0x08, 0xe2, 0x55, 0x3f, 0xc7, 0x11, 0x70, 0x3e, 0xb0, 0xd3, 0xeb, 0x3e,
- 0xf2, 0xd5, 0x16, 0x3e, 0xc0, 0xf4, 0x81, 0xbd, 0x0b, 0xd9, 0x26, 0x3f,
- 0x93, 0xd5, 0x13, 0xbf, 0x4b, 0x0e, 0x53, 0xbf, 0x3a, 0x51, 0xac, 0x3e,
- 0x1d, 0x3d, 0xa0, 0x3d, 0x92, 0xa0, 0xb7, 0xbd, 0xb7, 0xaf, 0x72, 0x3f,
- 0x89, 0x71, 0x2e, 0x3d, 0x15, 0x78, 0x77, 0xbe, 0x57, 0x4c, 0x35, 0x3e,
- 0xf1, 0x0f, 0x83, 0x3e, 0xd6, 0xdd, 0xd0, 0xbe, 0x81, 0x30, 0x46, 0xbe,
- 0x67, 0xcc, 0xee, 0xbe, 0x43, 0xa5, 0x99, 0xbe, 0x5d, 0xd7, 0x73, 0xbe,
- 0xa1, 0x2d, 0x8f, 0xbe, 0xe7, 0xe3, 0x0b, 0xbf, 0x65, 0xb2, 0x64, 0xbd,
- 0xda, 0x09, 0xd6, 0xbe, 0xb2, 0xf5, 0x09, 0x3f, 0xf6, 0xb1, 0x45, 0x3e,
- 0x6f, 0x21, 0x65, 0x3e, 0x76, 0xf3, 0x15, 0xbe, 0xd6, 0x51, 0xb8, 0x3e,
- 0x0d, 0xff, 0xc1, 0x3d, 0xef, 0x82, 0x1d, 0xbf, 0x50, 0x99, 0x7d, 0xbe,
- 0x61, 0x45, 0xba, 0x3e, 0xb1, 0x5a, 0x66, 0x3e, 0xf4, 0x25, 0x10, 0x3f,
- 0x9b, 0x43, 0x0b, 0x3f, 0x7d, 0xf6, 0x15, 0x3f, 0xca, 0xbf, 0x80, 0xbe,
- 0x94, 0x09, 0xca, 0x3e, 0x3a, 0xa7, 0x38, 0x3e, 0xc5, 0xa9, 0xb5, 0x3d,
- 0x77, 0x6c, 0x39, 0x3e, 0x19, 0xae, 0x2c, 0xbe, 0x73, 0xfc, 0x24, 0xbf,
- 0x12, 0x63, 0x2f, 0x3d, 0xf2, 0x78, 0x27, 0xbf, 0x5c, 0xa1, 0x9c, 0xbe,
- 0x15, 0x66, 0xe8, 0x3e, 0xd2, 0xca, 0x09, 0x3f, 0x6a, 0x5e, 0xa1, 0x3e,
- 0xd5, 0x65, 0xb7, 0xbe, 0xaa, 0x83, 0xfd, 0x3e, 0xad, 0xb3, 0xd9, 0xbe,
- 0x27, 0x30, 0x39, 0xbe, 0x2c, 0xb8, 0x79, 0x3e, 0xa6, 0x30, 0x2e, 0x3e,
- 0x30, 0x70, 0x02, 0x3e, 0xbf, 0x57, 0x67, 0xbd, 0x94, 0x51, 0xbf, 0xbe,
- 0x2c, 0x7b, 0xd1, 0xbd, 0x95, 0x4d, 0xe8, 0xbe, 0x5c, 0x0d, 0xd6, 0xbe,
- 0xd2, 0x4b, 0xa0, 0xbd, 0xd7, 0x54, 0x17, 0x3f, 0xa0, 0x0c, 0x91, 0xbd,
- 0xd3, 0x5c, 0x74, 0xbd, 0xba, 0x60, 0x4e, 0x3d, 0x93, 0xda, 0xb4, 0xbe,
- 0x51, 0x24, 0x98, 0xbf, 0x07, 0x34, 0x3c, 0xbe, 0xf3, 0x17, 0x7d, 0x3b,
- 0x20, 0xb1, 0x86, 0x3e, 0x32, 0x4b, 0x77, 0xbd, 0x21, 0x5c, 0xa6, 0xbd,
- 0xa4, 0xd1, 0xc0, 0xbe, 0x1d, 0x6c, 0x0c, 0x3c, 0x09, 0x6e, 0x78, 0x3e,
- 0xb1, 0x62, 0x36, 0x3e, 0xea, 0xd3, 0x43, 0x3d, 0x73, 0xb3, 0xa8, 0x3d,
- 0x60, 0x45, 0xa2, 0x3d, 0xa8, 0xd1, 0x43, 0x3f, 0x71, 0x97, 0xb3, 0x3d,
- 0xc9, 0x2c, 0x31, 0xbe, 0xf3, 0x11, 0x00, 0x3d, 0xff, 0x54, 0x96, 0xbe,
- 0xa4, 0x8f, 0x76, 0xbe, 0x04, 0x8d, 0x5c, 0xbf, 0x24, 0xbf, 0xec, 0xbe,
- 0xd1, 0xa6, 0x00, 0x3f, 0xa6, 0xbe, 0xd9, 0x3d, 0x1d, 0x69, 0x69, 0xbf,
- 0x8c, 0xb8, 0x8d, 0xbe, 0xd8, 0x65, 0xdf, 0x3e, 0x96, 0xe6, 0x6c, 0x3e,
- 0x12, 0x84, 0xd5, 0x3c, 0x3e, 0xc9, 0xce, 0xbb, 0x98, 0x7e, 0x0d, 0x3e,
- 0x31, 0x75, 0x15, 0xbe, 0xbc, 0x83, 0xf8, 0x3e, 0x95, 0x9e, 0x01, 0x3f,
- 0x6a, 0x09, 0x9e, 0x3e, 0x1a, 0xf4, 0x6f, 0xbe, 0x17, 0xf8, 0xd0, 0xbe,
- 0xd4, 0x58, 0xaa, 0xbe, 0xc0, 0xd9, 0x08, 0x3e, 0xd8, 0x56, 0xf5, 0x3d,
- 0xac, 0x2e, 0x3d, 0xbe, 0x73, 0xe8, 0xb3, 0xbd, 0xb7, 0xdc, 0x8b, 0xbe,
- 0xc5, 0x8c, 0x12, 0x3f, 0x63, 0x2e, 0x82, 0x3e, 0x30, 0x3a, 0x00, 0x3e,
- 0x33, 0x6a, 0xdd, 0xbe, 0x5a, 0xb8, 0x89, 0xbe, 0xb6, 0x81, 0x00, 0x3f,
- 0xb8, 0x56, 0x2f, 0x3c, 0x67, 0xab, 0x96, 0x3e, 0x68, 0xbe, 0x8d, 0x3d,
- 0x85, 0x96, 0xba, 0x3d, 0x24, 0x39, 0x07, 0x3e, 0x81, 0x9e, 0xe8, 0xbc,
- 0x68, 0xb5, 0xd9, 0xbd, 0xf1, 0x42, 0x39, 0x3e, 0x96, 0x44, 0x03, 0xbf,
- 0xd5, 0x09, 0x30, 0x3f, 0x67, 0x42, 0xc5, 0xbf, 0x65, 0x57, 0xb4, 0xbf,
- 0x27, 0x1d, 0x58, 0xbe, 0x18, 0x46, 0x01, 0x3e, 0xc0, 0xed, 0xa7, 0x3d,
- 0x49, 0xd3, 0x40, 0xbf, 0x3b, 0x2f, 0x77, 0xbf, 0xa5, 0x17, 0x24, 0x3f,
- 0xd3, 0x0d, 0x7f, 0x3e, 0x9e, 0xf9, 0xd3, 0xbf, 0x5b, 0xb7, 0x14, 0xbf,
- 0x62, 0x07, 0x82, 0x3e, 0x1e, 0xa7, 0x9e, 0xbe, 0x26, 0x37, 0x55, 0x3e,
- 0xc1, 0x86, 0x1a, 0xbe, 0x1f, 0x4b, 0x84, 0x3e, 0x10, 0x51, 0x98, 0xbe,
- 0x97, 0x57, 0x7c, 0x3e, 0x79, 0x02, 0x89, 0xbd, 0xdd, 0xd1, 0x8f, 0xbe,
- 0xa7, 0x35, 0x3a, 0x3e, 0xf0, 0x14, 0xf5, 0x3e, 0x74, 0xa7, 0xf9, 0x3d,
- 0x03, 0x8a, 0x42, 0xbf, 0x45, 0x1d, 0x82, 0xbd, 0x53, 0x14, 0xd0, 0xbe,
- 0x66, 0x9b, 0xeb, 0x3e, 0xa0, 0xd0, 0x97, 0x3e, 0xcd, 0xc0, 0xce, 0x3e,
- 0x11, 0xc4, 0x48, 0x3f, 0x0b, 0xa7, 0x6e, 0xbd, 0x72, 0x40, 0xa0, 0x3d,
- 0x00, 0xc2, 0x19, 0x3f, 0x1b, 0x2e, 0xb3, 0xbe, 0x08, 0x9a, 0xe0, 0x3c,
- 0x15, 0x59, 0x33, 0xbf, 0xcb, 0xf2, 0x4c, 0x3e, 0x11, 0xc9, 0x1b, 0xbf,
- 0x3d, 0x18, 0xdf, 0x3e, 0x37, 0xea, 0x49, 0x3e, 0xaf, 0xb4, 0x77, 0x3d,
- 0x97, 0x7a, 0x72, 0x3f, 0x0a, 0xfa, 0xa7, 0x3e, 0x2d, 0x19, 0x34, 0xbe,
- 0x68, 0x64, 0x39, 0x3d, 0x69, 0xf0, 0x03, 0xbe, 0x87, 0xe7, 0x41, 0xbe,
- 0x76, 0x46, 0x3e, 0xbf, 0x37, 0x2a, 0x34, 0x3f, 0x88, 0xb9, 0x8c, 0x3e,
- 0xe7, 0x12, 0x09, 0xbe, 0xcb, 0x3f, 0x39, 0xbf, 0xf1, 0x6a, 0x4e, 0xbd,
- 0xa7, 0xa8, 0xb4, 0xbe, 0x7a, 0x22, 0xe5, 0xbe, 0x3c, 0xdb, 0xd0, 0xbd,
- 0x7a, 0x3d, 0xfe, 0xbc, 0x16, 0x7a, 0x25, 0xbb, 0x66, 0x1c, 0xc9, 0x3f,
- 0x68, 0xdf, 0x25, 0xbf, 0xe0, 0x0f, 0xb5, 0x3c, 0xdb, 0x9e, 0x95, 0xbf,
- 0x90, 0x8e, 0x23, 0x3f, 0x60, 0x7c, 0x22, 0xbe, 0xce, 0x44, 0x9f, 0xbf,
- 0xd9, 0x85, 0xba, 0xbc, 0xf2, 0xf0, 0x95, 0xbf, 0x8b, 0x92, 0xac, 0x3d,
- 0x1c, 0x37, 0x71, 0x3e, 0x63, 0x09, 0x5b, 0xbe, 0xd7, 0xe5, 0xfc, 0xbd,
- 0x6d, 0xc4, 0x52, 0x3d, 0x78, 0xf3, 0x1f, 0x3f, 0x9e, 0x94, 0x02, 0xbf,
- 0xc4, 0xea, 0x5d, 0x3d, 0x71, 0xf2, 0x0b, 0x3f, 0xc8, 0xde, 0xd1, 0xbc,
- 0x7e, 0x3a, 0x0b, 0xbe, 0xad, 0x8f, 0x19, 0x3e, 0xa0, 0x2e, 0x9b, 0xbe,
- 0xb7, 0xed, 0xd3, 0x3e, 0xea, 0xd9, 0x47, 0xbd, 0xdf, 0xbb, 0xac, 0x3d,
- 0xae, 0x9e, 0x29, 0xbf, 0x63, 0xbd, 0x40, 0xbe, 0x45, 0x26, 0x04, 0x3f,
- 0x1e, 0x60, 0xf5, 0xbf, 0x45, 0x46, 0x83, 0x3d, 0x86, 0x61, 0xf8, 0xbf,
- 0x84, 0xa8, 0x3e, 0xbf, 0xee, 0x41, 0xba, 0xbd, 0x64, 0x44, 0x3c, 0x3e,
- 0xf9, 0xd5, 0x44, 0xbe, 0x7b, 0xf7, 0x37, 0x3e, 0x6a, 0x05, 0xfb, 0x3d,
- 0x2d, 0x8e, 0x0c, 0x3d, 0xd2, 0x6f, 0xdf, 0xbd, 0x9e, 0x0b, 0x1d, 0xbf,
- 0xea, 0xc6, 0x3c, 0x3d, 0x17, 0x98, 0xad, 0xbd, 0xbe, 0x3d, 0x2b, 0xbe,
- 0xee, 0x4e, 0xf8, 0xbd, 0xa4, 0x11, 0xd3, 0xbd, 0xa3, 0xe9, 0xab, 0x3e,
- 0x74, 0xd3, 0xa4, 0xbd, 0x39, 0x36, 0xa2, 0xbe, 0xdf, 0x02, 0x1d, 0xbf,
- 0xa1, 0xeb, 0x05, 0xbf, 0x9c, 0x2f, 0x9d, 0x3f, 0xaa, 0xbb, 0xc9, 0x3d,
- 0xfa, 0xf6, 0x4e, 0x3f, 0xad, 0x68, 0x18, 0xbe, 0x7c, 0x74, 0x26, 0x3f,
- 0xa3, 0xd9, 0x9b, 0x3d, 0xbf, 0x86, 0x81, 0x3e, 0x73, 0x0b, 0xd3, 0xbe,
- 0x78, 0x73, 0x3c, 0xbf, 0x8e, 0x25, 0x7a, 0x3e, 0x3b, 0x5b, 0x93, 0xbe,
- 0x6a, 0x51, 0x0b, 0x3e, 0x24, 0xe4, 0x99, 0x3e, 0x85, 0x49, 0x77, 0xbe,
- 0x72, 0xfd, 0x9b, 0xbd, 0x13, 0x95, 0xbb, 0x3e, 0xd2, 0x54, 0x30, 0xbf,
- 0x90, 0x34, 0x04, 0xbf, 0x39, 0xbe, 0xfc, 0x3b, 0x9e, 0xc1, 0xe5, 0x3e,
- 0x08, 0x7e, 0x09, 0x3f, 0x1f, 0x8e, 0xc3, 0xbe, 0x17, 0x46, 0xea, 0xbe,
- 0x5e, 0xb6, 0x89, 0xbe, 0x2b, 0x14, 0x65, 0x3e, 0xd2, 0x23, 0xcb, 0xbe,
- 0xea, 0x54, 0x80, 0xbf, 0x72, 0x9f, 0x11, 0xbe, 0x6c, 0xf4, 0xb3, 0xbe,
- 0x13, 0x94, 0x1c, 0x3f, 0xd0, 0x98, 0x2a, 0xbf, 0x53, 0x96, 0xef, 0x3c,
- 0xa3, 0xbf, 0x07, 0x3f, 0xe2, 0xaf, 0x3a, 0x3e, 0x9e, 0xfc, 0x9c, 0xbe,
- 0xc7, 0x3b, 0x91, 0x3e, 0x3e, 0x9a, 0x68, 0xbe, 0x91, 0xa9, 0x7d, 0x3e,
- 0xf1, 0x6f, 0x14, 0xbf, 0xbe, 0xd3, 0x0f, 0xbe, 0xa4, 0x91, 0x31, 0xbb,
- 0xde, 0x1e, 0x08, 0xbf, 0x50, 0x6d, 0x83, 0x3d, 0x0e, 0x3a, 0x80, 0x3f,
- 0xdd, 0x08, 0xbb, 0xbd, 0xd2, 0x3e, 0xb7, 0xbd, 0x4b, 0x1b, 0x52, 0xbe,
- 0x46, 0x2d, 0x1f, 0x3e, 0x4a, 0x78, 0x14, 0x3d, 0xcb, 0xac, 0xb9, 0x3e,
- 0x32, 0x96, 0x7f, 0xbe, 0x2b, 0xa3, 0x6f, 0x3f, 0x58, 0xb4, 0xbd, 0x3d,
- 0xd8, 0xe3, 0x37, 0xbd, 0xfe, 0xe6, 0x9f, 0xbe, 0x99, 0x02, 0x94, 0x3e,
- 0x56, 0x5d, 0xba, 0x3e, 0x3d, 0x13, 0x04, 0xbf, 0x10, 0x05, 0x02, 0x3f,
- 0xaa, 0xd0, 0x96, 0x3e, 0xa5, 0x95, 0x04, 0x3f, 0xba, 0x06, 0x92, 0x3e,
- 0xbc, 0x8a, 0x32, 0xbf, 0xf2, 0x25, 0x24, 0xbd, 0x4a, 0xd2, 0xc7, 0xbd,
- 0x90, 0x12, 0xc8, 0xbd, 0x21, 0x6e, 0xe9, 0x3e, 0x29, 0x06, 0xa1, 0xbe,
- 0x1f, 0x9a, 0x0d, 0x3d, 0x24, 0x37, 0xf1, 0xbd, 0x67, 0xa3, 0x5b, 0xbd,
- 0x74, 0x2b, 0xc5, 0xbe, 0xfa, 0x6f, 0x60, 0xbe, 0x74, 0x0e, 0x21, 0xbf,
- 0xce, 0x66, 0x8d, 0x3e, 0x32, 0x35, 0xd7, 0x3d, 0x43, 0xef, 0x47, 0xbf,
- 0x9b, 0x64, 0xe0, 0xbe, 0x71, 0x07, 0xc8, 0xbd, 0x3d, 0x9e, 0x05, 0xbc,
- 0xa4, 0x97, 0x1e, 0xbe, 0xeb, 0x4e, 0x86, 0x3e, 0xfa, 0xe6, 0x80, 0xbe,
- 0x93, 0xfa, 0xee, 0xbd, 0xe0, 0x04, 0xe2, 0x3e, 0xd9, 0x33, 0x15, 0x3e,
- 0x0f, 0x34, 0x08, 0x3d, 0x8a, 0xc3, 0x59, 0xbb, 0x26, 0xa8, 0xe8, 0xbd,
- 0x6d, 0x23, 0x91, 0x3e, 0x4b, 0x56, 0x7b, 0xbe, 0x6d, 0xaa, 0xd1, 0xbc,
- 0x52, 0x3c, 0xa3, 0x3e, 0x29, 0x47, 0x76, 0x3e, 0x15, 0x96, 0xde, 0x3d,
- 0x27, 0xdf, 0x78, 0x3e, 0x31, 0x64, 0x68, 0xbe, 0x53, 0x5a, 0x62, 0x3f,
- 0xd2, 0x9a, 0x01, 0xbf, 0x52, 0x7e, 0x15, 0xbf, 0xb7, 0xbf, 0xa0, 0x3d,
- 0x15, 0xbd, 0xa5, 0x3e, 0x41, 0xc9, 0x89, 0xbd, 0x6f, 0x51, 0x99, 0xbe,
- 0xe9, 0x1b, 0x0d, 0xbe, 0x18, 0x17, 0xf6, 0x3e, 0x63, 0x4f, 0xfc, 0x3e,
- 0xa5, 0xb5, 0x6a, 0xbd, 0x5c, 0xd6, 0x2b, 0xbc, 0x66, 0x1c, 0xd4, 0x3d,
- 0xdd, 0x35, 0x05, 0x3f, 0x35, 0x4f, 0x7b, 0xbd, 0x66, 0x80, 0x3b, 0xbe,
- 0x19, 0x48, 0x1f, 0xbe, 0x15, 0xae, 0x31, 0x3e, 0x2b, 0xf1, 0x9a, 0xbe,
- 0xb3, 0x1f, 0xfb, 0xbe, 0xc6, 0x88, 0x4d, 0xbe, 0xdf, 0xa9, 0x66, 0x3e,
- 0x11, 0x8f, 0x57, 0x3e, 0x05, 0x50, 0x23, 0xbe, 0xc4, 0xa4, 0x9f, 0xbd,
- 0x88, 0xce, 0x0a, 0xbf, 0x5f, 0x48, 0xaf, 0x3e, 0x42, 0x07, 0xaf, 0xbd,
- 0xf7, 0x37, 0xf1, 0x3e, 0x97, 0xdc, 0x99, 0xbd, 0x3a, 0x9b, 0xa3, 0xbe,
- 0x5a, 0xeb, 0xc2, 0x3e, 0xf7, 0x7e, 0xcc, 0xbe, 0x9e, 0x17, 0x60, 0xbe,
- 0x37, 0x76, 0xfc, 0xbe, 0x51, 0x9b, 0x8b, 0xbd, 0x67, 0x90, 0xd9, 0x3c,
- 0x67, 0xd4, 0xea, 0x3d, 0x95, 0xd9, 0xf1, 0xbe, 0x11, 0x31, 0x00, 0x3f,
- 0x52, 0xb4, 0x4b, 0xbe, 0x54, 0xa5, 0x5f, 0x3f, 0x48, 0xad, 0xed, 0xbe,
- 0x1f, 0xb1, 0x8e, 0xbe, 0xa9, 0xf6, 0x5f, 0xbe, 0xf8, 0x52, 0xa2, 0xbe,
- 0x8f, 0x00, 0x23, 0x3e, 0x14, 0x18, 0x6b, 0xbd, 0xe9, 0xb8, 0x92, 0x3e,
- 0xbf, 0xc7, 0x4e, 0x3f, 0x7e, 0x70, 0xf5, 0xbe, 0x8c, 0x16, 0x3d, 0x3c,
- 0xc0, 0xe1, 0x74, 0xbc, 0xa8, 0x4c, 0x4c, 0x3e, 0x93, 0x5a, 0x25, 0x3e,
- 0x69, 0x51, 0x23, 0xbd, 0x20, 0xcd, 0x1c, 0x3f, 0x29, 0xf6, 0x15, 0x3e,
- 0x9f, 0xd7, 0xd0, 0xbe, 0x63, 0x13, 0xa4, 0x3e, 0xa8, 0x0d, 0x17, 0xbe,
- 0xce, 0xa2, 0x58, 0xbe, 0x3f, 0x62, 0x35, 0x3e, 0x47, 0xbf, 0x5d, 0x3d,
- 0x84, 0x1d, 0x42, 0x3e, 0x85, 0x1d, 0x72, 0xbe, 0x63, 0xed, 0x09, 0xbf,
- 0x9c, 0xb6, 0xfb, 0x3d, 0xa3, 0xe8, 0x9f, 0xbe, 0xdf, 0x40, 0x19, 0xbe,
- 0x16, 0x7a, 0x80, 0xbd, 0x47, 0xd9, 0x9c, 0xbc, 0x28, 0x19, 0x16, 0x3e,
- 0x05, 0x12, 0x22, 0xbe, 0x9d, 0xe2, 0x95, 0x3e, 0xfd, 0x4a, 0x97, 0x3c,
- 0x2f, 0x0d, 0x00, 0x3f, 0x76, 0xbd, 0xc4, 0x3e, 0xf2, 0x31, 0x5b, 0x3e,
- 0x47, 0x75, 0x77, 0xbd, 0x9c, 0x17, 0xb2, 0xbc, 0xee, 0x9f, 0x81, 0xbe,
- 0x87, 0xe5, 0xce, 0xbe, 0xbc, 0x8f, 0x82, 0x3e, 0x01, 0x7b, 0x92, 0x3d,
- 0xa5, 0xe2, 0x5a, 0xbe, 0x3e, 0xf9, 0xc4, 0xbe, 0x1d, 0xb4, 0x55, 0x3e,
- 0xd2, 0xcc, 0xc8, 0xbc, 0xe2, 0xb8, 0xf9, 0xbb, 0x5a, 0xe4, 0xe3, 0x3e,
- 0x40, 0x8d, 0xe1, 0x3e, 0x62, 0x59, 0x4f, 0xbe, 0x85, 0x87, 0xd5, 0x3e,
- 0x23, 0xb9, 0xca, 0x3d, 0xdb, 0xde, 0xc6, 0xbe, 0xbf, 0xc1, 0x53, 0x3d,
- 0xc4, 0x3f, 0x03, 0x3f, 0x36, 0xe0, 0xd7, 0xbc, 0xd8, 0xcd, 0x93, 0xbd,
- 0xff, 0xae, 0x26, 0xbe, 0xba, 0x18, 0x06, 0x3e, 0x3f, 0xc7, 0x97, 0xbe,
- 0xd3, 0x59, 0x75, 0xbd, 0x66, 0x94, 0x35, 0x3e, 0xe5, 0xb9, 0xff, 0xbe,
- 0xd1, 0x54, 0x9d, 0x3d, 0xbb, 0xd7, 0xac, 0xbe, 0x4c, 0xcc, 0xde, 0x3e,
- 0x25, 0x8b, 0x81, 0x3e, 0x63, 0xaa, 0x4f, 0xbf, 0x93, 0xb4, 0x1b, 0x3f,
- 0x5a, 0x63, 0xa8, 0xb8, 0x64, 0xf3, 0x1d, 0xbe, 0x8f, 0x28, 0x7d, 0xbe,
- 0xab, 0xf5, 0x98, 0x3c, 0x12, 0x83, 0x7d, 0xbd, 0xb7, 0xab, 0xca, 0xbd,
- 0xaa, 0x27, 0x01, 0xbd, 0x27, 0x7b, 0x3a, 0x3f, 0xa7, 0x70, 0x9c, 0xbc,
- 0x01, 0x8e, 0xe1, 0x3d, 0x70, 0x76, 0xb4, 0xbd, 0x1e, 0x38, 0x20, 0x3f,
- 0x8b, 0x47, 0x84, 0xbd, 0x72, 0x36, 0x52, 0x3e, 0xe2, 0x86, 0x2c, 0x3e,
- 0x87, 0x1c, 0x78, 0x3e, 0xa8, 0xe7, 0xa5, 0xbd, 0xd9, 0xd0, 0xaa, 0x3c,
- 0x96, 0xb7, 0xee, 0x3e, 0x9d, 0x18, 0x93, 0xbe, 0x5c, 0x62, 0x7e, 0xbe,
- 0xae, 0xba, 0x96, 0xbc, 0x52, 0xd2, 0x9e, 0xbc, 0x21, 0xf2, 0x06, 0x3e,
- 0x08, 0x02, 0x33, 0x3e, 0x0f, 0xea, 0x5e, 0x3e, 0xed, 0xbf, 0x0f, 0xbe,
- 0x31, 0x1b, 0x95, 0xbe, 0xfe, 0xdd, 0x19, 0xbe, 0xf3, 0xcb, 0x81, 0xbe,
- 0x7c, 0x39, 0x12, 0x3e, 0x29, 0xdf, 0x30, 0xbe, 0x60, 0x96, 0x9c, 0xbe,
- 0xab, 0xa4, 0xa0, 0x3c, 0x60, 0x07, 0xe5, 0xbe, 0x73, 0xd6, 0x86, 0xbe,
- 0x90, 0xc5, 0xcd, 0xbd, 0x5c, 0x08, 0xb7, 0x3e, 0x21, 0x1d, 0x7a, 0x3e,
- 0xbf, 0x81, 0xb2, 0xbe, 0xa7, 0xda, 0x1c, 0x3d, 0x3a, 0x43, 0x30, 0xbe,
- 0x0f, 0xcd, 0xaa, 0x3e, 0x03, 0x24, 0x8a, 0xbe, 0x6c, 0xd3, 0xf2, 0xbe,
- 0x3a, 0x36, 0x1d, 0xbf, 0x79, 0xf7, 0x09, 0xbe, 0xc1, 0x93, 0x88, 0x3d,
- 0x63, 0x6f, 0xc9, 0xbd, 0x3e, 0x7f, 0x83, 0xbe, 0x9d, 0x4b, 0x87, 0xbd,
- 0x46, 0x18, 0x00, 0xbf, 0x95, 0x20, 0x0a, 0x3d, 0xbb, 0x7b, 0x3e, 0x3e,
- 0xbf, 0xa8, 0xf0, 0x3d, 0x34, 0x00, 0x01, 0xbe, 0x3d, 0xef, 0x90, 0xbc,
- 0x44, 0x13, 0x17, 0x3e, 0xba, 0x55, 0x20, 0xbd, 0x7d, 0xc9, 0xc2, 0x3d,
- 0x1b, 0x67, 0x19, 0xbf, 0xca, 0xc3, 0x30, 0x3f, 0x2b, 0xe1, 0xe9, 0x3d,
- 0xe5, 0xa0, 0x9f, 0x3d, 0x50, 0x0e, 0x89, 0xbe, 0xb4, 0xee, 0x50, 0xbd,
- 0x07, 0xb9, 0x22, 0xbf, 0x71, 0xf3, 0x2a, 0xbd, 0x87, 0x1c, 0xaa, 0xbe,
- 0xc7, 0x9f, 0xda, 0x3d, 0x58, 0xe4, 0x8f, 0x3e, 0xb8, 0xcb, 0x01, 0xbd,
- 0x7a, 0xdd, 0xc9, 0x3e, 0x06, 0x70, 0xef, 0xbd, 0x83, 0xea, 0xfd, 0xbe,
- 0xb0, 0x9b, 0xb4, 0xbe, 0x46, 0xd2, 0x66, 0x3e, 0x33, 0xd0, 0x60, 0xbd,
- 0xb9, 0x48, 0x86, 0xbd, 0xfa, 0x25, 0x4f, 0x3d, 0xa2, 0x09, 0xad, 0x3e,
- 0x6c, 0x68, 0xa1, 0x3e, 0x6e, 0x2d, 0x78, 0x3d, 0x44, 0x76, 0x40, 0xbe,
- 0xd9, 0x39, 0x5c, 0xbe, 0xb8, 0x92, 0x93, 0x3c, 0x56, 0x36, 0x11, 0xbe,
- 0x70, 0xc1, 0x3d, 0xbe, 0xbb, 0x71, 0xd8, 0x3e, 0x7f, 0x31, 0x07, 0xbe,
- 0xb6, 0x15, 0x75, 0xbd, 0xaf, 0xd7, 0x62, 0x3e, 0x03, 0x6c, 0x4a, 0xbe,
- 0x32, 0xf4, 0x48, 0x3e, 0x60, 0xa2, 0x28, 0xbe, 0x44, 0xcb, 0x49, 0xbe,
- 0x55, 0x98, 0x13, 0xbe, 0x8f, 0x5e, 0x2c, 0xbe, 0xd0, 0x61, 0x5f, 0x3e,
- 0xc9, 0x0e, 0x0a, 0x3e, 0x01, 0xda, 0x88, 0xbe, 0x19, 0x03, 0xc0, 0x3e,
- 0xe3, 0xde, 0xa0, 0x3d, 0xbe, 0xf3, 0xb4, 0x3c, 0x03, 0xb3, 0xd5, 0xbd,
- 0x3b, 0x16, 0x90, 0x3d, 0x07, 0x5a, 0x20, 0xbe, 0x6e, 0xe6, 0xf4, 0x3e,
- 0x85, 0xb9, 0xf1, 0x3d, 0xaf, 0xce, 0xab, 0x3e, 0xf9, 0xea, 0xe5, 0xbe,
- 0xd4, 0x84, 0x96, 0x3e, 0xa1, 0x85, 0x61, 0x3b, 0xc2, 0xf4, 0xc7, 0x3d,
- 0x57, 0xb2, 0x75, 0xbe, 0x9a, 0x41, 0x4f, 0x3e, 0x12, 0x06, 0x53, 0xbe,
- 0x19, 0x84, 0x18, 0x3d, 0xc7, 0xa4, 0x99, 0x3e, 0xfe, 0x07, 0x90, 0x3d,
- 0x6a, 0x82, 0x27, 0xbf, 0x55, 0x0b, 0x25, 0x3d, 0x7c, 0xe3, 0xdd, 0x3e,
- 0x27, 0xdb, 0xa5, 0x3e, 0xb8, 0x3f, 0x0c, 0xbf, 0x47, 0x2d, 0xd9, 0xbe,
- 0x61, 0xe8, 0x26, 0x3c, 0xef, 0xe0, 0x21, 0xbe, 0x3e, 0xb7, 0xd4, 0x3d,
- 0x54, 0xea, 0xc6, 0xbd, 0xf4, 0x95, 0xdf, 0xbd, 0x95, 0x92, 0x24, 0xbe,
- 0x12, 0xae, 0x49, 0x3e, 0xac, 0xaf, 0xda, 0xbd, 0xa9, 0x89, 0xe8, 0x3a,
- 0xd4, 0x6f, 0xde, 0xbe, 0x3a, 0x2c, 0xaa, 0xbd, 0x5b, 0x8f, 0x66, 0xbe,
- 0xa1, 0x58, 0x16, 0xbd, 0xa4, 0xf9, 0x94, 0x3d, 0x65, 0x44, 0x90, 0xbd,
- 0x40, 0x9a, 0x41, 0x3e, 0x9c, 0xde, 0xa6, 0x3e, 0x17, 0xf9, 0x25, 0x3e,
- 0x81, 0xcc, 0x8e, 0xbe, 0x39, 0x97, 0xd0, 0x3c, 0x19, 0x6c, 0x70, 0x3e,
- 0x41, 0x3c, 0xc4, 0xbe, 0x99, 0x2c, 0x1a, 0xbe, 0x50, 0xd2, 0x25, 0x3e,
- 0x8a, 0x1d, 0xd6, 0x3e, 0x49, 0xa6, 0xf1, 0xbe, 0xb6, 0x06, 0x6b, 0xbe,
- 0x44, 0x18, 0x19, 0xbe, 0xee, 0x64, 0x6e, 0xbe, 0x5b, 0x61, 0xc9, 0x3e,
- 0xbb, 0x07, 0xb8, 0x3e, 0xd9, 0xc8, 0xc7, 0xbe, 0xd1, 0x02, 0x21, 0x3e,
- 0x10, 0x61, 0x9a, 0x3d, 0xfe, 0x96, 0xd6, 0x3d, 0xbf, 0x9c, 0x1a, 0x3d,
- 0x03, 0x68, 0xd0, 0xbe, 0xc5, 0x0e, 0xec, 0x3e, 0x1e, 0x7f, 0x7a, 0x3d,
- 0xdf, 0x60, 0x49, 0xbd, 0xbb, 0xd9, 0xd5, 0xbe, 0x92, 0x28, 0x0f, 0x3e,
- 0x15, 0x38, 0x7b, 0x3e, 0x08, 0xdd, 0x8f, 0x3d, 0xd4, 0x9f, 0x8b, 0xbd,
- 0x07, 0xcf, 0x91, 0x3e, 0x4d, 0x3f, 0x70, 0x3e, 0x7d, 0x6f, 0x3c, 0xbe,
- 0x99, 0x1d, 0xd1, 0x3d, 0x4b, 0xdd, 0x07, 0x3e, 0x02, 0xdf, 0x2d, 0xbd,
- 0x2d, 0x6f, 0x32, 0xbf, 0x13, 0x30, 0x1a, 0x3f, 0x14, 0xa5, 0x44, 0xbe,
- 0x2c, 0x90, 0x69, 0x3e, 0xb9, 0xa7, 0xb4, 0xbd, 0x75, 0x38, 0x19, 0x3d,
- 0x8c, 0x90, 0x10, 0xbf, 0xe8, 0x1c, 0x0b, 0x3e, 0x84, 0xd2, 0xbb, 0xbe,
- 0x7f, 0x90, 0x24, 0x3f, 0x56, 0xd6, 0xb9, 0xbd, 0x5f, 0xc1, 0x37, 0xbe,
- 0x8e, 0xf5, 0x23, 0x3e, 0xd4, 0x00, 0x48, 0xbe, 0x2b, 0xed, 0x1d, 0xbf,
- 0xd1, 0x45, 0x80, 0xbe, 0x9c, 0x1b, 0x1d, 0x3c, 0x74, 0x4d, 0x39, 0x3b,
- 0xf7, 0xbe, 0x1b, 0x3d, 0x89, 0x12, 0x41, 0x3f, 0x87, 0x79, 0x19, 0xbd,
- 0xe5, 0xd3, 0x81, 0xbe, 0x4f, 0xfa, 0x8f, 0xbe, 0x25, 0x59, 0x00, 0xbf,
- 0xfd, 0xb6, 0xc4, 0x3c, 0x60, 0xf3, 0xc2, 0x3b, 0xa7, 0x84, 0xd9, 0x3d,
- 0xd3, 0xf7, 0xf2, 0x3e, 0xad, 0xd3, 0x18, 0x3f, 0x2a, 0x5a, 0x6c, 0x3d,
- 0xa1, 0xa1, 0x95, 0xbe, 0xaf, 0x6a, 0x41, 0xbe, 0x52, 0xf4, 0xd2, 0x3d,
- 0x76, 0x7d, 0x17, 0x3e, 0xb5, 0x90, 0x6e, 0xbb, 0xe4, 0x21, 0x10, 0x3f,
- 0x51, 0x3a, 0xef, 0x3e, 0xbe, 0x1c, 0x24, 0xbe, 0x53, 0x95, 0xa9, 0xbe,
- 0x93, 0x38, 0x3e, 0xbe, 0x55, 0x40, 0x23, 0xbf, 0xc9, 0xa3, 0xc3, 0x3e,
- 0xd6, 0x7f, 0xbc, 0x3e, 0x1d, 0x23, 0x0f, 0x3d, 0x47, 0x22, 0x61, 0xbc,
- 0x02, 0xb2, 0xb7, 0xbd, 0x24, 0x51, 0x40, 0x3e, 0x36, 0xac, 0x8a, 0x3e,
- 0x1b, 0x28, 0x9b, 0xbc, 0x55, 0x43, 0x86, 0xbb, 0x3c, 0xbe, 0xb3, 0xbe,
- 0x2c, 0x0c, 0x3c, 0x3e, 0x30, 0x6a, 0x9c, 0x3e, 0x09, 0x00, 0x71, 0x3e,
- 0x60, 0x57, 0x6f, 0x3e, 0x92, 0x45, 0x62, 0xbd, 0x80, 0x17, 0xec, 0x3e,
- 0x47, 0xdd, 0x22, 0x3f, 0x1d, 0xc9, 0x3b, 0x3e, 0x79, 0x5d, 0x1c, 0x3e,
- 0xbc, 0x8c, 0x2e, 0xbf, 0x90, 0xa4, 0x83, 0xbd, 0x03, 0xfa, 0xc6, 0xbe,
- 0xc5, 0x68, 0x02, 0x3f, 0x3c, 0x9f, 0xd7, 0xbd, 0xe4, 0xfa, 0xd4, 0xbd,
- 0xbb, 0x47, 0x1c, 0xbe, 0xbe, 0x01, 0xe9, 0xbd, 0x72, 0xaa, 0x8d, 0xbe,
- 0xf2, 0x58, 0xfe, 0xbc, 0x98, 0x4b, 0x1f, 0x3d, 0x45, 0x76, 0x02, 0xbf,
- 0x0b, 0x92, 0xca, 0xbe, 0x59, 0x75, 0x13, 0xbe, 0x66, 0x90, 0x82, 0x3e,
- 0xa2, 0x7c, 0xb7, 0xbd, 0x87, 0x64, 0x87, 0xbe, 0x60, 0xf2, 0xa4, 0xbe,
- 0x8a, 0x2b, 0x81, 0xbd, 0xdd, 0x29, 0xba, 0xbd, 0x5d, 0x16, 0x9d, 0x3e,
- 0x93, 0x70, 0xb0, 0x3f, 0xd4, 0x74, 0xbb, 0xbc, 0x85, 0x7b, 0x03, 0xbe,
- 0x23, 0x1d, 0xda, 0xbf, 0x94, 0xda, 0x0a, 0xbd, 0xb4, 0x72, 0x76, 0xbe,
- 0x00, 0x01, 0x90, 0x3e, 0x96, 0x68, 0x11, 0x3f, 0xee, 0x69, 0xa2, 0x3d,
- 0xe3, 0x4d, 0xd1, 0x3e, 0xe9, 0xd6, 0xda, 0xbd, 0xd8, 0x29, 0xa4, 0xbe,
- 0x4f, 0x1e, 0x38, 0xbe, 0x66, 0x72, 0x71, 0x3e, 0x31, 0xa9, 0x1c, 0x3f,
- 0x60, 0xbb, 0xa5, 0x3e, 0x9d, 0x62, 0xfb, 0x3d, 0x17, 0xa3, 0x95, 0xbd,
- 0x39, 0x85, 0x7d, 0xbe, 0xb9, 0x33, 0xb0, 0xbe, 0x99, 0xa1, 0x58, 0x3d,
- 0xcf, 0x39, 0xc1, 0xbe, 0x8b, 0x61, 0x1c, 0xbf, 0xf5, 0x9b, 0x0e, 0x3f,
- 0x71, 0xb0, 0x0f, 0x3f, 0x88, 0xbf, 0x10, 0xbe, 0x01, 0x55, 0x7a, 0x3e,
- 0xb1, 0x3b, 0x78, 0x3f, 0x9c, 0x7b, 0x62, 0xbe, 0xe7, 0xa2, 0xe1, 0xbb,
- 0x2b, 0x57, 0x5a, 0x3e, 0x68, 0xdb, 0x6a, 0x3e, 0x0d, 0xef, 0x43, 0x3e,
- 0x60, 0x9b, 0x1d, 0x3f, 0xed, 0x0a, 0x36, 0x3f, 0x8b, 0x7e, 0x13, 0xbf,
- 0xcb, 0x55, 0x26, 0xbf, 0x64, 0x62, 0xc4, 0xbd, 0xdc, 0xdc, 0x54, 0xbf,
- 0x51, 0x96, 0xdf, 0xbd, 0x1f, 0x8c, 0x50, 0x3e, 0x39, 0x14, 0x80, 0xbd,
- 0x6a, 0x0d, 0xa4, 0xbe, 0x8d, 0x35, 0x46, 0xbf, 0x2b, 0x44, 0x1d, 0xbf,
- 0xfc, 0x32, 0x28, 0x3d, 0x06, 0xcf, 0x50, 0xbd, 0x36, 0x4d, 0x9e, 0x3e,
- 0x62, 0x6e, 0x5b, 0xbe, 0x53, 0xe9, 0x62, 0x3e, 0xc8, 0xc8, 0xc8, 0xbe,
- 0x58, 0x8b, 0x85, 0xbe, 0xcd, 0xc9, 0x8b, 0xbc, 0x0e, 0x27, 0x71, 0x3d,
- 0xd1, 0x27, 0xb2, 0x3d, 0xfa, 0x07, 0x99, 0xbe, 0xfe, 0x2b, 0xae, 0xbe,
- 0x65, 0xcf, 0xf9, 0xbb, 0x9e, 0xcc, 0x49, 0x3e, 0x44, 0x69, 0x04, 0xbe,
- 0x4a, 0xf1, 0x98, 0x3c, 0x3b, 0x47, 0xd4, 0x3e, 0x47, 0xe5, 0xef, 0xbd,
- 0x16, 0x8e, 0x22, 0x3f, 0x46, 0xc0, 0xf7, 0x3e, 0x40, 0x7c, 0xb9, 0xbd,
- 0x7e, 0x44, 0xad, 0xbb, 0x5e, 0x58, 0xc6, 0xbf, 0x8d, 0x7d, 0x6c, 0x3d,
- 0x96, 0x57, 0x19, 0xbf, 0xc1, 0x46, 0x80, 0xbd, 0x2b, 0x58, 0x24, 0xbf,
- 0x25, 0xb1, 0xaa, 0x3e, 0xc2, 0x9c, 0xff, 0x3b, 0x30, 0x7e, 0x27, 0xbf,
- 0xc6, 0x0c, 0xab, 0xbf, 0xb8, 0xa8, 0x95, 0xbe, 0x9d, 0x90, 0x02, 0xbf,
- 0x0b, 0x7e, 0x6c, 0x3f, 0xc0, 0xc4, 0xc7, 0xbd, 0x86, 0x2c, 0xeb, 0x3d,
- 0x73, 0xfd, 0x3c, 0xbb, 0x10, 0x7b, 0x23, 0x3e, 0x79, 0xd5, 0x1a, 0x3e,
- 0x90, 0x35, 0x08, 0xbc, 0x7f, 0x0c, 0xa5, 0x3e, 0xa6, 0x0e, 0x47, 0x3f,
- 0x4c, 0x34, 0xf6, 0xbd, 0x1a, 0x93, 0xe7, 0xbd, 0x5c, 0xd0, 0x29, 0x3e,
- 0x98, 0xa1, 0x34, 0xbe, 0xc5, 0xe1, 0x1b, 0x3f, 0xe6, 0xd5, 0x61, 0xbe,
- 0xa3, 0xf6, 0x08, 0xbf, 0x8c, 0x37, 0x8d, 0xbe, 0x71, 0x25, 0x12, 0xbd,
- 0x38, 0x98, 0x64, 0xbe, 0x5e, 0xf6, 0x17, 0x3e, 0x2e, 0x45, 0x40, 0x3f,
- 0xf4, 0x9e, 0xb2, 0xbd, 0x7c, 0x45, 0x75, 0x3e, 0x20, 0xef, 0xb5, 0x3e,
- 0x0c, 0x15, 0x49, 0x3d, 0x46, 0x6f, 0x45, 0xbd, 0xab, 0xe9, 0x47, 0xbf,
- 0xad, 0x76, 0x11, 0x3d, 0x1c, 0x7e, 0x54, 0x3e, 0x01, 0x69, 0xea, 0xbd,
- 0xdb, 0x5b, 0x25, 0xbe, 0x78, 0x79, 0x3a, 0x3d, 0x89, 0x30, 0x1e, 0x3d,
- 0x92, 0x88, 0x00, 0xbf, 0x0b, 0x1e, 0xee, 0xbd, 0x21, 0x93, 0x26, 0xbe,
- 0x6f, 0xf2, 0x3e, 0xbe, 0x45, 0x5f, 0xd7, 0x3e, 0x54, 0xd9, 0x5f, 0x3f,
- 0x05, 0xe8, 0xcc, 0xbe, 0x83, 0xe2, 0xe5, 0x3d, 0x2a, 0x7a, 0x75, 0x3e,
- 0xec, 0xb4, 0x4a, 0x3c, 0xa5, 0x02, 0x5f, 0xbe, 0x2a, 0xf7, 0x2d, 0xbe,
- 0xad, 0x8f, 0x1d, 0x3d, 0x6a, 0xe3, 0x08, 0xbd, 0x49, 0x60, 0x8e, 0xbe,
- 0xee, 0xf0, 0xa5, 0xbe, 0x19, 0x8d, 0x0d, 0x3e, 0xd9, 0x25, 0xb8, 0xbe,
- 0x74, 0xb5, 0xe1, 0x3e, 0xf2, 0xaa, 0x1c, 0x3d, 0xf0, 0xa6, 0x7d, 0xbe,
- 0xa8, 0x02, 0x46, 0x3e, 0x1f, 0xb9, 0x33, 0xbe, 0xde, 0x29, 0xc3, 0x3c,
- 0x60, 0x01, 0x76, 0x3e, 0x08, 0x4d, 0xb8, 0xbc, 0x55, 0xa3, 0x86, 0x3e,
- 0x7e, 0xbc, 0x85, 0x3d, 0x22, 0xfb, 0xc1, 0xbe, 0xc8, 0xaf, 0x44, 0x3e,
- 0x82, 0xbd, 0x7f, 0x3e, 0x86, 0x01, 0x16, 0x3d, 0xe6, 0xeb, 0x05, 0xbd,
- 0x02, 0x53, 0xe6, 0xbb, 0xc6, 0x64, 0x09, 0xbe, 0xc2, 0x35, 0xc2, 0xbe,
- 0x0f, 0x50, 0x23, 0xbe, 0x75, 0xa1, 0x26, 0x3e, 0x75, 0x47, 0x43, 0x3d,
- 0x78, 0x92, 0xba, 0xbd, 0xe6, 0x70, 0x1e, 0xbe, 0xbd, 0xb4, 0xc2, 0x3e,
- 0x53, 0x07, 0x01, 0x3e, 0x5e, 0x0d, 0x98, 0xbe, 0x63, 0x85, 0xf0, 0xbc,
- 0x63, 0x17, 0x3f, 0x3e, 0x6a, 0x11, 0x57, 0xbc, 0x46, 0x24, 0xcc, 0x3d,
- 0xea, 0x96, 0xd5, 0xbe, 0xc5, 0x75, 0x6b, 0x3c, 0x47, 0x0b, 0x82, 0xbc,
- 0x65, 0x00, 0x7a, 0x3e, 0x47, 0xb7, 0x4a, 0x3e, 0xe2, 0xfd, 0xf8, 0x3b,
- 0xd2, 0xad, 0x5d, 0x3d, 0x89, 0x55, 0x99, 0x3e, 0x9d, 0x63, 0xa6, 0x3d,
- 0xaa, 0x6e, 0xa2, 0xbe, 0xd9, 0xb7, 0x8d, 0xbd, 0x17, 0x0a, 0x1d, 0xbe,
- 0xcd, 0x1e, 0x2e, 0x3d, 0xe2, 0xb3, 0xa1, 0x3d, 0x6d, 0xe0, 0x85, 0xbe,
- 0xb3, 0x19, 0x1d, 0xbc, 0xe7, 0x2d, 0x8c, 0xbc, 0xb1, 0x63, 0x0d, 0x3d,
- 0xe6, 0x47, 0xb5, 0xbd, 0x9d, 0x00, 0x12, 0x3d, 0x26, 0x43, 0x00, 0x3e,
- 0xad, 0x1a, 0x64, 0x3e, 0x17, 0x61, 0x1c, 0xbe, 0xf9, 0x96, 0x9b, 0xbb,
- 0xd3, 0xb5, 0xcc, 0xbd, 0xdd, 0x06, 0xbc, 0x3e, 0x33, 0x78, 0x86, 0x3c,
- 0x7f, 0x96, 0x89, 0xbd, 0x93, 0x7e, 0x81, 0xbd, 0xcd, 0x08, 0x60, 0x3d,
- 0x6a, 0xb0, 0x68, 0xbd, 0xb0, 0x08, 0x1f, 0xbe, 0x83, 0x20, 0xd2, 0x3d,
- 0x0d, 0xa0, 0xbb, 0x3c, 0x61, 0x39, 0x5d, 0xbe, 0x66, 0x9b, 0xb7, 0xbc,
- 0x6f, 0xaf, 0x44, 0xbe, 0x5d, 0x37, 0xfb, 0xbd, 0x1a, 0xae, 0xf3, 0xbc,
- 0x93, 0xdf, 0xd9, 0xbd, 0x59, 0xb2, 0x4d, 0xbe, 0x57, 0xd7, 0xc9, 0xbd,
- 0x5e, 0xeb, 0xfd, 0x3c, 0xcc, 0x7a, 0xba, 0xbd, 0xff, 0xc9, 0x6c, 0x3e,
- 0xaa, 0xdb, 0xc3, 0x3e, 0x3b, 0xfe, 0x7e, 0xbe, 0xff, 0x30, 0x3b, 0xbe,
- 0xce, 0x97, 0x55, 0x3e, 0x5d, 0xfd, 0x78, 0x3e, 0xd1, 0x35, 0x85, 0xbd,
- 0x11, 0x3e, 0xa9, 0x3e, 0x46, 0x5a, 0x39, 0xbe, 0xf0, 0x18, 0x76, 0xbd,
- 0x64, 0xe4, 0xd8, 0x3d, 0x4f, 0x6a, 0x9a, 0x3e, 0xf9, 0x42, 0x71, 0xbc,
- 0x1a, 0x80, 0x90, 0x3d, 0x3b, 0x2d, 0xcd, 0x3d, 0xa9, 0x08, 0x74, 0xbe,
- 0xb0, 0x34, 0x04, 0x3e, 0x50, 0xd9, 0x8a, 0x3c, 0x1a, 0x3b, 0xa8, 0xbe,
- 0x64, 0xcc, 0xe0, 0xbd, 0x5b, 0x64, 0x8b, 0xbd, 0x63, 0x19, 0x06, 0xbe,
- 0x79, 0xf2, 0x24, 0xbe, 0x6f, 0x5a, 0x83, 0xbd, 0xdb, 0x4a, 0x80, 0xbd,
- 0xdc, 0xd0, 0xbd, 0xbd, 0xc1, 0xf6, 0xcd, 0xbe, 0x2a, 0x30, 0xe1, 0xbd,
- 0xef, 0x9d, 0x16, 0xbe, 0xaf, 0x20, 0x66, 0x3b, 0x5e, 0xd9, 0x20, 0x3e,
- 0xce, 0x81, 0x0f, 0xbf, 0x26, 0xfa, 0x9e, 0x3f, 0x18, 0x27, 0x02, 0xbc,
- 0x5e, 0xf7, 0x3e, 0x3f, 0x8d, 0xc4, 0xff, 0xbd, 0xd8, 0x2b, 0x42, 0x3f,
- 0x6b, 0x0e, 0xf4, 0x3d, 0xc0, 0xcf, 0xb4, 0x3e, 0xa1, 0x6d, 0xe6, 0xbe,
- 0x38, 0xd3, 0x2f, 0xbf, 0x9a, 0x56, 0xa6, 0x3e, 0xe1, 0xa1, 0x18, 0xbe,
- 0x36, 0xee, 0x14, 0x3e, 0xe5, 0x90, 0x0a, 0x3e, 0xf3, 0xd5, 0x98, 0xbe,
- 0x7d, 0x06, 0x78, 0xbe, 0xd3, 0xc3, 0xb5, 0x3e, 0xfe, 0x4d, 0x48, 0xbf,
- 0xda, 0x19, 0xfe, 0xbe, 0x8c, 0xf3, 0x8c, 0xbc, 0xc2, 0x9d, 0xc6, 0x3e,
- 0x7c, 0x1d, 0xd5, 0x3e, 0x96, 0x0a, 0x85, 0xbe, 0x91, 0x8f, 0xb6, 0xbe,
- 0x39, 0x9a, 0xde, 0xbe, 0x97, 0x09, 0x47, 0x3e, 0x77, 0x43, 0xff, 0xbe,
- 0xb8, 0x7c, 0x83, 0xbf, 0x16, 0x15, 0x22, 0xbe, 0x34, 0xfe, 0x86, 0xbe,
- 0xf9, 0x1d, 0x31, 0x3f, 0xdc, 0xf9, 0x39, 0xbf, 0x5a, 0x72, 0x29, 0xbe,
- 0xfd, 0xbe, 0x0a, 0x3f, 0xf0, 0xd7, 0xb1, 0x3d, 0xd3, 0x4d, 0x13, 0xbe,
- 0x5d, 0x4c, 0xfd, 0x3d, 0xde, 0x6d, 0x8e, 0xbe, 0xa6, 0x46, 0x29, 0x3e,
- 0xb7, 0x0f, 0xfc, 0xbe, 0x33, 0xac, 0xa3, 0xbd, 0xcf, 0xfb, 0x70, 0x3c,
- 0xed, 0x7d, 0xd3, 0xbe, 0x26, 0xac, 0x23, 0xbe, 0x7e, 0x02, 0x8a, 0x3f,
- 0x9a, 0x28, 0x22, 0xbe, 0x92, 0x4e, 0x34, 0xbd, 0x6b, 0xf2, 0x53, 0xbe,
- 0x26, 0x4a, 0x7c, 0x3e, 0xb2, 0x6b, 0x97, 0x3c, 0x43, 0x2c, 0xcc, 0x3e,
- 0x7f, 0x72, 0x6c, 0xbe, 0x86, 0x3b, 0x85, 0x3f, 0x86, 0xf0, 0x9f, 0xbd,
- 0x00, 0xf2, 0x17, 0xbe, 0x8d, 0xe2, 0xa3, 0xbd, 0x14, 0x17, 0xd0, 0x3e,
- 0x0e, 0x24, 0xac, 0x3e, 0x8b, 0xd8, 0x05, 0xbf, 0xb9, 0x2e, 0x02, 0x3f,
- 0x7a, 0x6c, 0xfe, 0x3e, 0x1d, 0xf9, 0xd5, 0x3e, 0x7c, 0x4e, 0x94, 0x3e,
- 0x2a, 0x03, 0x45, 0xbf, 0x35, 0x42, 0xe0, 0x3d, 0xec, 0xea, 0x3e, 0xbe,
- 0xe0, 0x59, 0xf8, 0xbd, 0x91, 0x02, 0x1a, 0x3f, 0x31, 0x4d, 0x9a, 0xbe,
- 0xec, 0x57, 0x39, 0x3e, 0x79, 0x65, 0x05, 0xbe, 0xeb, 0x1a, 0x25, 0x3d,
- 0xc3, 0xbc, 0x9b, 0xbe, 0xa1, 0x1d, 0x74, 0x3c, 0xe0, 0x5a, 0x1a, 0xbf,
- 0xe0, 0xad, 0x7b, 0x3e, 0x66, 0x8f, 0x55, 0xbc, 0x49, 0x3d, 0x4a, 0xbf,
- 0x2b, 0x19, 0x15, 0xbf, 0xc1, 0x5d, 0xca, 0xbc, 0x29, 0xbb, 0x45, 0xbd,
- 0x29, 0xcd, 0x95, 0x3d, 0x78, 0x0e, 0x9e, 0x3e, 0xba, 0x28, 0xb4, 0xbe,
- 0x05, 0xb6, 0x40, 0x3d, 0x28, 0xf5, 0xdc, 0x3e, 0x20, 0xa6, 0x03, 0x3e,
- 0x72, 0x70, 0x09, 0x3e, 0xe4, 0xbc, 0x96, 0x3c, 0x42, 0x02, 0xbd, 0xbd,
- 0x27, 0x87, 0xc8, 0x3e, 0xf7, 0x55, 0x59, 0xbe, 0x97, 0xd2, 0xc3, 0xbd,
- 0xdc, 0x73, 0xac, 0x3e, 0x1d, 0xc9, 0x84, 0x3e, 0xc5, 0x74, 0x16, 0x3e,
- 0xbd, 0xdb, 0x54, 0x3e, 0x2e, 0x01, 0xc9, 0xbe, 0xd5, 0xeb, 0x56, 0x3f,
- 0x0c, 0x18, 0xf8, 0xbe, 0x58, 0x95, 0xb3, 0xbe, 0x34, 0x9d, 0xb2, 0xbc,
- 0x47, 0x56, 0xaf, 0x3e, 0xa9, 0x6b, 0x3c, 0xbe, 0x0d, 0xb3, 0x56, 0xbe,
- 0x6b, 0xa4, 0x48, 0xbe, 0x48, 0xa4, 0xc3, 0x3e, 0x71, 0x51, 0xd3, 0x3e,
- 0x20, 0x1c, 0x29, 0x3d, 0x7f, 0x9a, 0x7b, 0xbd, 0xd1, 0x20, 0x9d, 0x3d,
- 0xa9, 0x18, 0x0e, 0x3f, 0x63, 0xa1, 0x5d, 0xbe, 0xb0, 0x95, 0xe7, 0xbd,
- 0x92, 0xb8, 0xca, 0xbd, 0x9c, 0xcd, 0x94, 0x3e, 0x05, 0x88, 0xa1, 0xbe,
- 0xc6, 0xe1, 0x71, 0x3e, 0x92, 0x46, 0x7f, 0x3d, 0xcd, 0x9c, 0x48, 0xbe,
- 0x8a, 0x02, 0x12, 0xbf, 0xa4, 0x1d, 0xfc, 0xbd, 0xa4, 0x55, 0x5c, 0xbd,
- 0x86, 0x28, 0x58, 0x3e, 0x27, 0xd5, 0xd4, 0x3d, 0x0c, 0xbb, 0x6c, 0xbe,
- 0x5a, 0x9d, 0x17, 0x3e, 0x20, 0x6a, 0x04, 0xbf, 0x4c, 0x83, 0x26, 0xbd,
- 0x03, 0x19, 0x95, 0xbe, 0xaf, 0xa8, 0x8b, 0x3e, 0xaa, 0x3c, 0x0d, 0x3e,
- 0x93, 0xe8, 0x15, 0xbf, 0x83, 0xe7, 0xbe, 0x3d, 0xd7, 0xae, 0x04, 0x3e,
- 0xa5, 0xb8, 0xcc, 0x3e, 0xbd, 0x3f, 0x80, 0xbe, 0x36, 0x96, 0xb9, 0xbe,
- 0x8a, 0x6c, 0x0a, 0xbf, 0x65, 0x8b, 0x10, 0xbc, 0x49, 0x24, 0x9c, 0x3c,
- 0xee, 0x7c, 0x0d, 0x3c, 0x35, 0xe9, 0xd1, 0xbe, 0x1a, 0x84, 0x65, 0xbe,
- 0x18, 0x0c, 0x74, 0xbe, 0x11, 0x4e, 0x4d, 0xbd, 0xe8, 0x61, 0x19, 0x3e,
- 0x42, 0x18, 0xee, 0x3d, 0xd1, 0xf8, 0x75, 0xbc, 0xf4, 0xd1, 0x47, 0xbd,
- 0x26, 0x36, 0x55, 0x3e, 0xa9, 0xa6, 0x85, 0xbe, 0x04, 0x06, 0xcb, 0x3e,
- 0xb2, 0xa5, 0x17, 0xbf, 0x83, 0xbc, 0x6c, 0x3e, 0x64, 0x9d, 0x43, 0xbe,
- 0xc1, 0xa7, 0x62, 0x3e, 0x1c, 0xaa, 0xb5, 0xbe, 0x83, 0x68, 0x5d, 0x3d,
- 0x81, 0xbc, 0x1c, 0xbf, 0x7d, 0x1a, 0x26, 0xbe, 0xfb, 0xe1, 0x1e, 0x3d,
- 0x7d, 0x2c, 0xec, 0xbb, 0x33, 0x65, 0xc7, 0xbd, 0xab, 0xfb, 0x65, 0x3d,
- 0xa2, 0x4f, 0x90, 0x3e, 0xff, 0xe4, 0xa5, 0xbe, 0x5c, 0x3e, 0x0b, 0xbf,
- 0x03, 0x72, 0x54, 0xbe, 0x65, 0x10, 0x82, 0x3e, 0xdb, 0xc7, 0xb1, 0x3c,
- 0x07, 0x2a, 0xb5, 0xbc, 0xa5, 0x7c, 0xf0, 0x3d, 0x2a, 0xf8, 0x39, 0x3e,
- 0x70, 0xd2, 0xb8, 0x3e, 0xb5, 0x1f, 0xd6, 0x3d, 0xd8, 0xaf, 0x04, 0xbe,
- 0xff, 0x5a, 0x72, 0xbd, 0xfd, 0x45, 0x96, 0x3e, 0x5f, 0x89, 0x09, 0x3e,
- 0xa7, 0x0e, 0xa6, 0xbe, 0x4a, 0x74, 0xb2, 0x3e, 0x15, 0x59, 0x6a, 0x3d,
- 0x62, 0x8b, 0xcd, 0xbd, 0xc8, 0xe8, 0xbc, 0x3d, 0xf4, 0xbc, 0x8e, 0x3d,
- 0x7a, 0x64, 0x6c, 0x3d, 0x15, 0x8a, 0x85, 0x3c, 0xa1, 0x4d, 0x58, 0xbe,
- 0x43, 0x14, 0x30, 0x3e, 0x4b, 0x33, 0x84, 0x3d, 0xf2, 0x8c, 0xa4, 0xbb,
- 0xe8, 0xa4, 0x81, 0x3e, 0x8c, 0xc7, 0x24, 0xbd, 0x0b, 0xf6, 0x72, 0x3e,
- 0x90, 0xe0, 0x8f, 0x3d, 0xcc, 0x72, 0xc1, 0xbd, 0xce, 0xc4, 0x11, 0xbe,
- 0xbe, 0xca, 0xeb, 0xbb, 0xbe, 0x67, 0x42, 0xbd, 0x7e, 0x74, 0x0f, 0x3f,
- 0xe8, 0x5e, 0xe9, 0x3d, 0x1d, 0xed, 0x29, 0x3e, 0x54, 0x46, 0x57, 0xbe,
- 0x40, 0x49, 0x3f, 0x3e, 0xd9, 0x20, 0x9f, 0x3c, 0xc7, 0xbc, 0x70, 0x3e,
- 0x2a, 0x54, 0x20, 0xbe, 0xe0, 0x32, 0x6a, 0x3e, 0xbc, 0xd6, 0x57, 0xbe,
- 0x57, 0x8f, 0x17, 0x3e, 0x43, 0x83, 0xe6, 0x3c, 0x5b, 0x76, 0x2b, 0x3e,
- 0x88, 0x80, 0x1f, 0xbf, 0xa6, 0x56, 0x3b, 0xbd, 0xc2, 0x63, 0x2f, 0x3e,
- 0x6b, 0xd9, 0xfe, 0x3d, 0x50, 0x1b, 0xe9, 0xbe, 0x03, 0x4f, 0x6e, 0xbe,
- 0x18, 0xb8, 0x13, 0xbd, 0xc7, 0x89, 0x68, 0xbd, 0xbf, 0x60, 0x98, 0x3d,
- 0x9d, 0x20, 0x2c, 0xbc, 0x3c, 0xc0, 0x68, 0x3e, 0x39, 0xd4, 0xba, 0xbd,
- 0xb4, 0xc2, 0xeb, 0xbd, 0xbe, 0x01, 0xf1, 0x3c, 0x97, 0x23, 0x27, 0x3e,
- 0x0c, 0xc4, 0xb2, 0xbe, 0x4c, 0xcd, 0xf6, 0xbd, 0x16, 0x40, 0x6a, 0xbe,
- 0x3c, 0xbc, 0x8a, 0xbb, 0xc9, 0xde, 0x2c, 0x3e, 0xa0, 0x89, 0x46, 0xbe,
- 0x14, 0x5d, 0x5b, 0x3e, 0x06, 0x30, 0x95, 0x3e, 0xa9, 0x98, 0x27, 0x3d,
- 0x14, 0xef, 0xc9, 0xbe, 0x14, 0xc5, 0x2c, 0x3d, 0xe1, 0xf3, 0xbb, 0x3e,
- 0x57, 0x86, 0x45, 0xbe, 0xa2, 0x1e, 0x28, 0xbe, 0xd9, 0x01, 0x94, 0x3c,
- 0xff, 0x5f, 0xab, 0x3d, 0xb5, 0x22, 0x0f, 0xbf, 0x54, 0x5e, 0x5d, 0xbe,
- 0xc5, 0x60, 0xcb, 0xbd, 0x25, 0x0d, 0x29, 0xbd, 0x96, 0x7f, 0x59, 0x3e,
- 0xdc, 0xc0, 0x9b, 0xbc, 0x21, 0xfb, 0x8c, 0xbe, 0x61, 0x38, 0xa8, 0x3e,
- 0x6d, 0x2c, 0x45, 0x3e, 0x88, 0x9c, 0xde, 0x3c, 0x94, 0xec, 0x83, 0x3d,
- 0xbb, 0xf6, 0xd6, 0xbe, 0xc5, 0x18, 0x9d, 0x3e, 0x1f, 0xca, 0x63, 0x3e,
- 0x50, 0x4d, 0xf6, 0xbd, 0x0c, 0x46, 0x84, 0xbe, 0xf0, 0xbb, 0xc1, 0xbc,
- 0x17, 0x84, 0x2f, 0x3d, 0x72, 0x68, 0x4f, 0xbd, 0x1f, 0xaf, 0x20, 0xbd,
- 0x2c, 0x7f, 0x06, 0x3e, 0xa6, 0x43, 0x82, 0x3e, 0x56, 0xa5, 0x2a, 0xbe,
- 0x22, 0x85, 0x9e, 0x3e, 0x01, 0xad, 0xa6, 0xbd, 0x41, 0x19, 0x56, 0xbe,
- 0x35, 0xd6, 0xcf, 0xbe, 0x7e, 0xfb, 0x1f, 0xbb, 0x6b, 0x2e, 0x96, 0xbe,
- 0x9a, 0x9c, 0xa9, 0x3c, 0x7e, 0x42, 0xd9, 0xbd, 0x3d, 0x24, 0x67, 0x3d,
- 0xf8, 0x20, 0x04, 0xbf, 0x1b, 0x68, 0x08, 0x3c, 0x8b, 0x9e, 0xdc, 0xbd,
- 0x8e, 0xed, 0xa8, 0x3e, 0x06, 0xfc, 0xc7, 0xbe, 0xe7, 0x26, 0xf6, 0xbc,
- 0xdf, 0xe8, 0x3c, 0x3d, 0x21, 0x68, 0xa1, 0xbd, 0x36, 0xa0, 0xe1, 0xbe,
- 0x22, 0x49, 0xc4, 0xbd, 0xed, 0x69, 0x01, 0x3e, 0xd1, 0x88, 0x02, 0xbe,
- 0x18, 0x4b, 0x7b, 0xbc, 0x5b, 0xe2, 0xa3, 0x3e, 0xea, 0xcd, 0x84, 0x3c,
- 0xbd, 0x07, 0x7f, 0xbe, 0xa7, 0x88, 0x7f, 0xbe, 0x27, 0x73, 0x64, 0xbd,
- 0x73, 0x57, 0x7f, 0x3d, 0x45, 0x9d, 0x03, 0x3f, 0x17, 0x7b, 0xdb, 0x3d,
- 0x35, 0x90, 0x35, 0x3e, 0x10, 0xa0, 0xac, 0x3e, 0x4f, 0x9c, 0x04, 0xbe,
- 0x21, 0xa3, 0x51, 0xbd, 0xe3, 0x1d, 0xe2, 0xbd, 0x75, 0x9d, 0x3b, 0x3e,
- 0x11, 0xef, 0xc7, 0xbd, 0xe5, 0x9e, 0x50, 0xbe, 0x02, 0x5d, 0xc3, 0x3d,
- 0x83, 0x38, 0x35, 0x3e, 0xd0, 0x79, 0xd3, 0xbc, 0x85, 0x5a, 0x06, 0xbf,
- 0xb4, 0xc9, 0x49, 0xbe, 0x5b, 0x57, 0x4a, 0xbe, 0x57, 0x07, 0x6c, 0x3e,
- 0x02, 0xcd, 0x89, 0x3c, 0x8a, 0x6c, 0xcc, 0xbc, 0x39, 0x8f, 0xcc, 0xbc,
- 0x85, 0x5b, 0x12, 0xbd, 0xfd, 0xaf, 0x3a, 0x3e, 0xdf, 0x7a, 0xc3, 0x3e,
- 0x93, 0x4c, 0x00, 0xbe, 0x29, 0xbc, 0xf0, 0x3d, 0x84, 0x74, 0x2e, 0xbb,
- 0xec, 0xa3, 0xe6, 0x3e, 0xc5, 0x62, 0xa1, 0x3e, 0x2d, 0x73, 0xe4, 0x3d,
- 0x9a, 0x31, 0xf3, 0x3d, 0x83, 0xfd, 0x42, 0xbd, 0x85, 0x27, 0x65, 0xbd,
- 0xf1, 0x0a, 0x0c, 0x3f, 0xe4, 0x63, 0x83, 0xbc, 0xa4, 0x21, 0x66, 0x3e,
- 0xcb, 0x12, 0x07, 0xbf, 0x3e, 0x4a, 0x8b, 0x3d, 0x18, 0x0b, 0x64, 0xbe,
- 0x96, 0x27, 0x83, 0x3e, 0x28, 0x38, 0xf4, 0xbd, 0x1d, 0xdf, 0xbf, 0xbc,
- 0xfa, 0x18, 0x6a, 0x3e, 0x5b, 0x06, 0x85, 0xbd, 0x1c, 0xc5, 0x88, 0xbe,
- 0x65, 0xf8, 0x1e, 0xbe, 0x76, 0x42, 0x37, 0x3e, 0x39, 0x2c, 0x0a, 0xbf,
- 0x08, 0xdb, 0x98, 0xbe, 0x0e, 0xb3, 0x0e, 0x3d, 0x47, 0x3c, 0xf7, 0x3d,
- 0xb9, 0x05, 0x0e, 0xbe, 0x92, 0x8d, 0x30, 0xbe, 0xfb, 0x26, 0x98, 0xbe,
- 0xe8, 0xcf, 0xee, 0xbd, 0xab, 0xa0, 0x0c, 0xbd, 0x51, 0x49, 0x06, 0xbc,
- 0x7c, 0x9c, 0x2f, 0x3d, 0x4a, 0x23, 0x11, 0x3f, 0xa7, 0x5b, 0x52, 0x3f,
- 0x1d, 0x10, 0x7f, 0xbf, 0xe4, 0x14, 0x41, 0xbc, 0x6a, 0x8a, 0x94, 0xbe,
- 0x1c, 0xaa, 0xa7, 0x3e, 0x89, 0x44, 0x0a, 0x3f, 0x0f, 0xd0, 0xb6, 0x3e,
- 0xd2, 0x9d, 0xab, 0x3e, 0xda, 0x0d, 0x7c, 0xbf, 0x49, 0xdd, 0xf3, 0x3e,
- 0xc4, 0x6e, 0xd8, 0xbe, 0xd4, 0x5c, 0xe0, 0x3e, 0x67, 0xef, 0xab, 0xbf,
- 0xd4, 0x97, 0xbc, 0x3d, 0xad, 0xce, 0xf2, 0xbe, 0x3d, 0x23, 0x32, 0x3f,
- 0x92, 0x5c, 0x44, 0x3f, 0xdf, 0xc5, 0x47, 0xbe, 0x7d, 0x34, 0x6e, 0x3f,
- 0x5d, 0xed, 0x29, 0xbf, 0x1f, 0x8c, 0xf2, 0x3e, 0x05, 0x04, 0xd3, 0xbe,
- 0xe6, 0xa8, 0x0a, 0x3e, 0xd3, 0x4a, 0x45, 0xbe, 0x21, 0x68, 0x2b, 0x3e,
- 0x1e, 0x49, 0xcf, 0x3e, 0x2c, 0xc3, 0x12, 0xbd, 0xc7, 0x37, 0xe0, 0xbe,
- 0x8d, 0x60, 0x2c, 0x3d, 0xce, 0x0e, 0x8f, 0xbe, 0xc6, 0x53, 0xe5, 0xbd,
- 0x19, 0x95, 0x83, 0x3f, 0x2d, 0x4d, 0xab, 0x3e, 0x51, 0x57, 0x1d, 0xbf,
- 0xfe, 0x63, 0xfb, 0x3d, 0x38, 0x7d, 0x59, 0x3e, 0x1b, 0x73, 0xb7, 0x3e,
- 0x0d, 0x40, 0x62, 0x3d, 0xfd, 0x10, 0x9a, 0x3e, 0xd0, 0xe0, 0x75, 0x3b,
- 0xc1, 0xbd, 0xf6, 0x3d, 0x84, 0x2e, 0xe2, 0x3d, 0x0f, 0x33, 0x92, 0xbf,
- 0x97, 0x9a, 0x34, 0xbf, 0x08, 0x1c, 0xf2, 0x3d, 0xd2, 0xd1, 0x96, 0xbe,
- 0xeb, 0x41, 0xc0, 0xbe, 0x4a, 0x8c, 0x1f, 0xbe, 0x56, 0xd8, 0x37, 0xbf,
- 0xaf, 0xd4, 0x87, 0x3e, 0x33, 0xf2, 0x3e, 0xbc, 0x4e, 0x57, 0x08, 0xbe,
- 0xaf, 0x95, 0x7c, 0x3d, 0x0a, 0x58, 0xa5, 0xbc, 0x5a, 0x74, 0x66, 0x3f,
- 0xb2, 0xda, 0xb1, 0x3d, 0x9c, 0x07, 0xbd, 0xbf, 0x75, 0x6d, 0x96, 0x3d,
- 0xcc, 0x4f, 0x7e, 0x3f, 0xc6, 0x02, 0x2d, 0x3f, 0x9d, 0x00, 0x21, 0xbf,
- 0x44, 0x50, 0x9a, 0x3e, 0xd9, 0xe4, 0x39, 0x3d, 0xbd, 0xd9, 0x63, 0xbe,
- 0x41, 0x23, 0x76, 0xbd, 0xdc, 0x2a, 0x7d, 0x3f, 0x6a, 0xf6, 0x89, 0xbf,
- 0x37, 0x54, 0x65, 0xbf, 0x8b, 0x5f, 0x80, 0xbe, 0xf3, 0x65, 0x4c, 0xbe,
- 0xd5, 0xc9, 0xc5, 0xbd, 0x17, 0xf3, 0x89, 0x3d, 0xf8, 0x2d, 0x79, 0xbf,
- 0x70, 0x9e, 0xd0, 0x3e, 0x59, 0xb5, 0x00, 0xbf, 0xc7, 0x49, 0xad, 0xbe,
- 0x9f, 0xd0, 0xc8, 0x3e, 0x7c, 0x95, 0x8b, 0xbc, 0xae, 0xb8, 0x0e, 0x3b,
- 0x22, 0xc8, 0xb8, 0xbd, 0xf8, 0xcb, 0x25, 0x3f, 0xd9, 0xf0, 0x8c, 0xbf,
- 0x8a, 0xa9, 0x71, 0x3d, 0xf3, 0xa7, 0x9e, 0xbf, 0xd8, 0x70, 0x03, 0x3e,
- 0xc6, 0xf5, 0x0f, 0x3d, 0xeb, 0x58, 0xab, 0xbf, 0x46, 0x4b, 0xfd, 0xbd,
- 0x08, 0x35, 0xbd, 0xbf, 0x78, 0x9b, 0xb5, 0x3d, 0xc7, 0x71, 0x0d, 0xbf,
- 0xd8, 0xd9, 0xc7, 0x3e, 0x3b, 0x47, 0x1c, 0xbf, 0xf0, 0xc1, 0x80, 0xbe,
- 0xbe, 0x06, 0x0c, 0xbf, 0xb4, 0x75, 0x88, 0x3f, 0xe8, 0x27, 0x8d, 0x3f,
- 0x2b, 0x43, 0x79, 0xbe, 0xcc, 0x6c, 0x2a, 0x3f, 0xc2, 0x30, 0xb4, 0x3e,
- 0x03, 0xf1, 0x43, 0x3d, 0x49, 0x84, 0xbb, 0x3c, 0x0d, 0xcd, 0xb2, 0xbf,
- 0xc6, 0xba, 0xbe, 0xbd, 0x78, 0x26, 0xc2, 0x3e, 0x70, 0x01, 0x19, 0xbd,
- 0x1a, 0x86, 0x2d, 0xbe, 0xe5, 0x68, 0x33, 0xbe, 0x5d, 0x11, 0xfd, 0x3c,
- 0xce, 0xea, 0x23, 0xbf, 0xd3, 0x9e, 0x6b, 0xbe, 0xa0, 0xde, 0x27, 0xbe,
- 0x6f, 0xbe, 0x6e, 0xbe, 0xbf, 0x2a, 0xbd, 0x3d, 0xb0, 0xf8, 0xf3, 0x3e,
- 0x45, 0x06, 0xcb, 0xbe, 0x49, 0xba, 0x32, 0x3d, 0x02, 0xad, 0x77, 0x3e,
- 0xc9, 0xe9, 0x1e, 0x3e, 0x3b, 0x66, 0x38, 0xbe, 0xa7, 0x4b, 0x7e, 0x3c,
- 0xcf, 0x59, 0xc8, 0x3d, 0x4a, 0xa6, 0x49, 0x3d, 0x08, 0x67, 0x7c, 0xbd,
- 0x95, 0xa8, 0x8f, 0xbe, 0xae, 0x16, 0x3e, 0x3e, 0xcc, 0xba, 0xe3, 0xbe,
- 0xdb, 0xdd, 0x8f, 0x3d, 0x55, 0x4a, 0x85, 0xbc, 0x1d, 0xf8, 0x4e, 0xbe,
- 0xc6, 0x01, 0x53, 0x3e, 0xdc, 0xf8, 0x1b, 0xbe, 0x1e, 0x57, 0x8c, 0x3d,
- 0x9c, 0xd7, 0x5a, 0x3c, 0x0d, 0xfc, 0xd4, 0x3d, 0xd6, 0xc3, 0xca, 0x3e,
- 0x03, 0x21, 0x3f, 0xbd, 0xdc, 0x80, 0x80, 0xbe, 0xd0, 0x85, 0xb8, 0x3d,
- 0xb1, 0xbb, 0x47, 0x3e, 0x10, 0x4c, 0x45, 0x3e, 0x2e, 0xd2, 0x20, 0x3e,
- 0xdf, 0xd5, 0xb4, 0xbd, 0x06, 0xed, 0x6d, 0xbd, 0xc0, 0x9b, 0xbd, 0xbe,
- 0xbe, 0x77, 0xee, 0xbc, 0x47, 0x8d, 0x46, 0x3a, 0xad, 0xad, 0x1b, 0x3d,
- 0xce, 0xca, 0xcd, 0x3b, 0x45, 0x4e, 0x50, 0xbe, 0x83, 0x58, 0x70, 0x3e,
- 0x8f, 0xc4, 0xf5, 0xbd, 0x27, 0x9c, 0x52, 0xbe, 0xb1, 0x17, 0x36, 0x3e,
- 0xe5, 0x7a, 0xb8, 0x3e, 0xd4, 0xab, 0x66, 0xbd, 0xd9, 0x1c, 0x0c, 0xbe,
- 0x83, 0xc6, 0xe2, 0xbe, 0x67, 0x4d, 0x3c, 0x3e, 0x01, 0x9e, 0xf1, 0xbb,
- 0x1d, 0xe9, 0x33, 0x3d, 0x84, 0x96, 0xb0, 0x3d, 0x92, 0x72, 0x2b, 0xbe,
- 0x07, 0x38, 0x49, 0x3e, 0x01, 0x85, 0x0a, 0x3e, 0xed, 0x0f, 0xc6, 0x3d,
- 0xad, 0x18, 0xec, 0xbd, 0x6a, 0xe4, 0x6d, 0xbe, 0xac, 0xb8, 0x2d, 0x3d,
- 0x24, 0x44, 0x0c, 0xbe, 0x7a, 0x5e, 0x36, 0x3c, 0xb9, 0x05, 0x1f, 0xbe,
- 0xb7, 0x64, 0x49, 0x3e, 0x42, 0xe3, 0x9e, 0x3d, 0xe3, 0x5a, 0x56, 0x3c,
- 0x06, 0xa6, 0x03, 0x3d, 0xfb, 0xe3, 0x59, 0xbd, 0xf8, 0x5d, 0x0e, 0x3e,
- 0x80, 0x66, 0x8f, 0x3e, 0xa1, 0x0e, 0xa0, 0xbe, 0x64, 0x1f, 0xf6, 0xbd,
- 0xa8, 0xa9, 0xbb, 0xbd, 0x3d, 0x50, 0x93, 0x3e, 0x5b, 0x39, 0x03, 0x3e,
- 0x97, 0x5c, 0x2d, 0xbd, 0xdd, 0xcb, 0x26, 0xbe, 0x42, 0x44, 0xb7, 0x3d,
- 0xe0, 0xc3, 0xad, 0xbd, 0x52, 0x54, 0x20, 0x3c, 0x1e, 0x2b, 0x2c, 0x3e,
- 0xdd, 0x54, 0x31, 0xbe, 0xd0, 0xe8, 0xa2, 0xbe, 0x10, 0xf2, 0x47, 0x3c,
- 0xf5, 0x6f, 0x53, 0xbd, 0x69, 0xa9, 0x6c, 0x3d, 0xcb, 0xfa, 0xb4, 0x3d,
- 0x3d, 0xbc, 0xc0, 0x3b, 0x01, 0x78, 0x6e, 0xbe, 0xe9, 0x0c, 0xba, 0xbe,
- 0x9c, 0x4e, 0xb3, 0xbc, 0x10, 0x4f, 0xb1, 0xbd, 0x6a, 0xd5, 0x82, 0x3e,
- 0xd0, 0x77, 0x9e, 0x3e, 0xe0, 0xad, 0x40, 0xbe, 0xdd, 0xd6, 0x34, 0xbe,
- 0x60, 0xb8, 0xf0, 0x3b, 0x6a, 0xb3, 0x48, 0x3e, 0xd3, 0xc9, 0x2a, 0x3e,
- 0x19, 0xa5, 0x9b, 0x3e, 0xc1, 0xbe, 0x31, 0x3d, 0x95, 0x77, 0x21, 0x3e,
- 0x6c, 0x5e, 0x1d, 0x3e, 0x8b, 0xf4, 0x88, 0x3e, 0x7d, 0x03, 0x7a, 0x3e,
- 0x57, 0x34, 0x4e, 0xbd, 0xb8, 0xf0, 0xa0, 0xbd, 0x43, 0x42, 0x5c, 0xbe,
- 0xf9, 0x1a, 0x4e, 0x3d, 0xd1, 0xe2, 0x49, 0xbe, 0xba, 0x7b, 0xb7, 0x3d,
- 0x94, 0x02, 0x9d, 0x3c, 0xa2, 0x88, 0x1c, 0xbe, 0xc5, 0xd5, 0x68, 0xbe,
- 0x37, 0x63, 0x80, 0xbe, 0x55, 0x88, 0xd1, 0xbd, 0x08, 0x88, 0xc4, 0xbd,
- 0xea, 0xd6, 0xca, 0x3d, 0x91, 0x97, 0xe1, 0xbe, 0x1b, 0x1e, 0x9d, 0xbe,
- 0xed, 0xd9, 0x65, 0xbe, 0x35, 0x0d, 0xf3, 0xbc, 0x52, 0xe3, 0x0d, 0x3e,
- 0x67, 0x82, 0xd1, 0xbe, 0x26, 0x48, 0x99, 0x3f, 0x4c, 0x15, 0xce, 0x3d,
- 0x74, 0x3b, 0x66, 0x3f, 0xe5, 0x34, 0xcb, 0xbc, 0x5e, 0xac, 0x56, 0x3f,
- 0x15, 0x2f, 0x37, 0x3e, 0xf6, 0x03, 0x5f, 0x3e, 0xf7, 0x47, 0xf1, 0xbe,
- 0x00, 0x4c, 0x27, 0xbf, 0x14, 0xac, 0xaf, 0x3d, 0x2c, 0x17, 0xa4, 0xbe,
- 0xb8, 0x66, 0xfb, 0x3d, 0x9e, 0x95, 0xc5, 0x3e, 0x5f, 0x0c, 0xed, 0xbe,
- 0xaf, 0x8d, 0xa2, 0xbe, 0x05, 0x64, 0x7d, 0x3e, 0x56, 0x05, 0x10, 0xbf,
- 0xbd, 0x02, 0x03, 0xbf, 0x12, 0xe3, 0x38, 0x3d, 0xbc, 0x6d, 0xf8, 0x3e,
- 0x42, 0x41, 0x1d, 0x3f, 0xb9, 0x2e, 0xc9, 0xbe, 0xbe, 0xe7, 0x6c, 0xbe,
- 0x3a, 0x80, 0x82, 0xbe, 0xb8, 0x01, 0x1f, 0x3e, 0xfa, 0x9d, 0x1b, 0xbf,
- 0x26, 0x97, 0x91, 0xbf, 0x5c, 0xf3, 0x25, 0xbd, 0x86, 0x32, 0x92, 0xbe,
- 0x4b, 0x0b, 0x2b, 0x3f, 0x8e, 0xf6, 0x3b, 0xbf, 0xd3, 0xf6, 0xde, 0xbd,
- 0xc1, 0x25, 0x0f, 0x3f, 0xc4, 0x0c, 0x01, 0x3e, 0xaf, 0x3b, 0x86, 0xbe,
- 0x9d, 0x56, 0x9d, 0x3d, 0xcd, 0x4f, 0x80, 0xbe, 0x5a, 0xf4, 0xb0, 0x3d,
- 0x4d, 0xfc, 0x3c, 0xbf, 0x7f, 0x2a, 0x26, 0xbe, 0xa6, 0x01, 0x05, 0xbe,
- 0x00, 0x76, 0x12, 0xbf, 0x0c, 0xbe, 0x83, 0xbc, 0x9e, 0xd0, 0x76, 0x3f,
- 0xd9, 0xbe, 0xca, 0xbd, 0xc4, 0x51, 0xcc, 0x3d, 0x93, 0x68, 0x68, 0xbe,
- 0x72, 0xcf, 0x53, 0x3e, 0xee, 0xf9, 0x0f, 0xbd, 0x95, 0xd5, 0x8c, 0x3e,
- 0xd4, 0x2f, 0x78, 0xbe, 0xe2, 0xf5, 0x84, 0x3f, 0x73, 0x30, 0xc3, 0xbb,
- 0xaa, 0x58, 0x06, 0xbe, 0xdf, 0x73, 0x14, 0xbe, 0x42, 0x13, 0xcc, 0x3e,
- 0xcd, 0xdb, 0x7d, 0x3e, 0xa9, 0x14, 0xe4, 0xbe, 0x29, 0xf3, 0x40, 0x3f,
- 0xc2, 0xae, 0xb6, 0x3e, 0x1b, 0xd7, 0xdf, 0x3e, 0x6b, 0xd3, 0x75, 0x3e,
- 0x3c, 0x56, 0x36, 0xbf, 0x1f, 0x68, 0x0e, 0x3e, 0x7e, 0x81, 0x4b, 0xbc,
- 0x19, 0x28, 0x46, 0xbe, 0x6f, 0x0d, 0x2b, 0x3f, 0x0b, 0xdc, 0xfc, 0xbe,
- 0xa1, 0xf2, 0xe8, 0x3c, 0xf6, 0x12, 0xba, 0x3d, 0x69, 0xe1, 0x26, 0x3d,
- 0x71, 0x0b, 0xcc, 0xbe, 0x1d, 0x3d, 0x42, 0xbe, 0xa8, 0xfe, 0x25, 0xbf,
- 0xde, 0x77, 0x02, 0x3d, 0x2f, 0xff, 0xd6, 0x3c, 0x3f, 0x08, 0x74, 0xbf,
- 0xf5, 0xf5, 0xd4, 0xbe, 0xc3, 0x35, 0xb0, 0x3d, 0xd1, 0x2d, 0xfd, 0x3d,
- 0x06, 0x76, 0x38, 0x3d, 0xe9, 0x88, 0xb1, 0x3e, 0xbd, 0x7c, 0x6c, 0xbe,
- 0x82, 0x4c, 0x1e, 0x3d, 0xc0, 0x58, 0x03, 0x3f, 0x72, 0x73, 0x8c, 0x3e,
- 0x40, 0x72, 0xf5, 0x3d, 0xae, 0x77, 0x52, 0xbe, 0x54, 0xa9, 0x38, 0xbe,
- 0x0d, 0xc2, 0xf4, 0x3e, 0xff, 0x57, 0x53, 0xbe, 0x2f, 0x6e, 0xcd, 0xbc,
- 0xfe, 0x38, 0x68, 0x3e, 0xe9, 0x09, 0xdc, 0x3d, 0x98, 0x7b, 0x5e, 0x3d,
- 0x7b, 0x45, 0x83, 0x3e, 0x0d, 0xf4, 0x5d, 0xbe, 0x3a, 0xf8, 0x46, 0x3f,
- 0x12, 0xfd, 0x0e, 0xbf, 0x78, 0x17, 0xb7, 0xbe, 0x18, 0x0b, 0xd2, 0x3d,
- 0x12, 0x4e, 0x31, 0x3e, 0xe2, 0x63, 0x37, 0xbe, 0x01, 0x87, 0x94, 0xbe,
- 0x55, 0xca, 0xec, 0x3c, 0xfe, 0x7a, 0xcf, 0x3e, 0x07, 0x33, 0xbc, 0x3e,
- 0x3c, 0x19, 0xdf, 0xbd, 0x55, 0x6a, 0xca, 0x3a, 0xed, 0xa8, 0x97, 0xbd,
- 0x6d, 0x3b, 0x13, 0x3f, 0xd9, 0x41, 0x74, 0xbe, 0xf2, 0xb3, 0x19, 0xbe,
- 0x3a, 0xfb, 0x75, 0xbe, 0xba, 0x03, 0xa9, 0x3e, 0xf9, 0xec, 0x98, 0xbe,
- 0xed, 0x7a, 0xd5, 0x3c, 0x74, 0x06, 0x37, 0x3e, 0x57, 0x51, 0x29, 0xbe,
- 0x45, 0x8f, 0x7b, 0xbe, 0xf9, 0x6f, 0x39, 0x3d, 0x0b, 0xa8, 0xad, 0xbd,
- 0xa4, 0x0b, 0x29, 0x3e, 0x87, 0xa8, 0xb0, 0xbd, 0x9b, 0x55, 0x41, 0xbd,
- 0x9c, 0x34, 0xc8, 0xbd, 0x98, 0x90, 0xde, 0xbe, 0xe3, 0x67, 0x8f, 0xbe,
- 0x6a, 0x0d, 0x70, 0xbd, 0x0c, 0x2a, 0x2b, 0x3d, 0x33, 0xe0, 0x14, 0x3d,
- 0xfe, 0x9a, 0xd9, 0xbe, 0xa8, 0x0e, 0xc6, 0x3e, 0x2c, 0x2d, 0x0c, 0x3e,
- 0xed, 0x0f, 0xbd, 0x3e, 0x77, 0x45, 0x2a, 0xbe, 0x27, 0x16, 0xd1, 0xbe,
- 0x27, 0xfc, 0xb1, 0xbe, 0xee, 0xff, 0x0d, 0xbe, 0x25, 0x7d, 0xee, 0xbd,
- 0xd7, 0x19, 0xf8, 0xbb, 0x5a, 0x9b, 0xbd, 0xbe, 0xda, 0xa8, 0xb6, 0xbd,
- 0xce, 0x06, 0xbc, 0xbe, 0x22, 0x0a, 0x23, 0x3d, 0x77, 0x8c, 0x7b, 0x3e,
- 0x36, 0x41, 0x26, 0xbd, 0xe6, 0xa5, 0xce, 0xbd, 0x78, 0x85, 0x48, 0xbd,
- 0xa0, 0x1c, 0x5f, 0x3e, 0x9d, 0x28, 0x65, 0xbe, 0x83, 0x5c, 0xac, 0x3e,
- 0x43, 0x8c, 0x31, 0xbf, 0x5f, 0x39, 0x11, 0x3e, 0x56, 0xa4, 0x47, 0xbe,
- 0x87, 0x2d, 0xa6, 0x3e, 0x04, 0xd9, 0x69, 0xbe, 0xb5, 0x43, 0xc4, 0x3d,
- 0xc3, 0x92, 0x21, 0xbf, 0xbd, 0x9e, 0xdc, 0xbd, 0x3a, 0xf0, 0x9c, 0xbd,
- 0xc3, 0x75, 0x55, 0xbe, 0x2b, 0xb1, 0x3b, 0x3c, 0xd2, 0xda, 0x0e, 0xbe,
- 0x58, 0x33, 0x3a, 0x3e, 0xec, 0x1b, 0x9d, 0xbe, 0xf9, 0x4c, 0xc9, 0xbe,
- 0x4b, 0x2e, 0xcc, 0x3d, 0xad, 0x96, 0x6d, 0x3e, 0x0d, 0x95, 0xa9, 0xbd,
- 0x9b, 0x2b, 0x6e, 0x3d, 0x92, 0xa5, 0x3e, 0x3e, 0x53, 0x26, 0x22, 0x3e,
- 0x1a, 0x7e, 0xae, 0x3e, 0xc6, 0xc7, 0xa0, 0x3d, 0x26, 0x0e, 0xdf, 0xbd,
- 0x6a, 0x1d, 0xfc, 0xbd, 0xa0, 0x7b, 0xab, 0x3e, 0xb0, 0x43, 0x05, 0xbe,
- 0xe3, 0xad, 0x2f, 0xbe, 0xc5, 0x28, 0x5f, 0x3e, 0xef, 0xb2, 0x53, 0xbc,
- 0xd4, 0xcc, 0x71, 0xbe, 0x69, 0x1b, 0x7c, 0x3e, 0x8e, 0x9c, 0xd9, 0x3d,
- 0x01, 0x88, 0xb5, 0xbd, 0x6e, 0x60, 0xa7, 0xbd, 0xa9, 0x76, 0xc1, 0xbe,
- 0x07, 0xe3, 0xe4, 0xbb, 0xdb, 0x94, 0xd8, 0xbd, 0x6b, 0xb4, 0x54, 0x3e,
- 0x4d, 0x6d, 0xfc, 0x3d, 0x84, 0xa3, 0x6d, 0xbd, 0x24, 0xa7, 0x51, 0x3e,
- 0x0f, 0x71, 0x81, 0xbe, 0x0c, 0x34, 0xa7, 0x3d, 0xb9, 0x2a, 0xb1, 0x3d,
- 0x6c, 0x50, 0x00, 0x3c, 0x7d, 0x29, 0x9d, 0xbe, 0x6a, 0xa2, 0xa8, 0x3e,
- 0x2c, 0x1e, 0xef, 0xbd, 0xe2, 0xc4, 0xbe, 0x3e, 0x8e, 0x62, 0x1c, 0xbe,
- 0x83, 0x03, 0x86, 0x3e, 0x54, 0x95, 0x5f, 0xbe, 0x2a, 0x27, 0x83, 0x3e,
- 0x17, 0x13, 0xa2, 0xbe, 0xca, 0x7e, 0x86, 0x3e, 0x8e, 0xbf, 0x14, 0xbe,
- 0x69, 0xfc, 0xd3, 0xbc, 0xad, 0x61, 0xef, 0xbc, 0x37, 0x94, 0x8f, 0x3e,
- 0xd9, 0xb9, 0x8e, 0xbe, 0x05, 0xba, 0xd8, 0x3d, 0xb2, 0x36, 0xef, 0xba,
- 0x46, 0x31, 0x8a, 0xbe, 0x02, 0x5a, 0xb7, 0xbe, 0x95, 0xa3, 0xee, 0xbc,
- 0xf9, 0xd5, 0x99, 0x3e, 0x4d, 0x69, 0xcf, 0xbd, 0xda, 0x73, 0x49, 0x3d,
- 0x2e, 0x59, 0xda, 0xbd, 0x22, 0x9a, 0x45, 0xbd, 0x18, 0x9f, 0x7d, 0x3d,
- 0x47, 0x35, 0x61, 0xbe, 0xf7, 0xd2, 0xab, 0xbb, 0xe7, 0x58, 0xfe, 0xbd,
- 0x68, 0x91, 0x61, 0xbe, 0xc6, 0x65, 0xe0, 0xbd, 0xe3, 0x78, 0x81, 0xbe,
- 0xb3, 0xe9, 0x1f, 0x3d, 0xb3, 0x5d, 0x4d, 0x3e, 0x33, 0x55, 0xe5, 0xbd,
- 0x44, 0xcf, 0xed, 0x3e, 0x3a, 0xc7, 0xc0, 0x3d, 0x5e, 0xbb, 0x22, 0x3e,
- 0x9d, 0xad, 0xe6, 0xbe, 0x53, 0xc8, 0x5e, 0x3d, 0x3f, 0xf6, 0x55, 0x3e,
- 0x42, 0x52, 0xc1, 0xbe, 0x68, 0x84, 0x34, 0xbe, 0x1d, 0x0d, 0x97, 0x3e,
- 0x06, 0x33, 0xe3, 0x3d, 0x20, 0xe0, 0x1a, 0xbe, 0x80, 0xce, 0x08, 0xbe,
- 0xcd, 0x31, 0x06, 0x3d, 0x6b, 0x9f, 0x07, 0x3d, 0x5f, 0x8a, 0x06, 0x3e,
- 0x30, 0x59, 0x03, 0x3e, 0x2f, 0xfa, 0xf5, 0xbe, 0xea, 0x0a, 0x55, 0x3e,
- 0x1f, 0x5d, 0x1e, 0xbe, 0xa7, 0x37, 0xbd, 0x3e, 0xb9, 0x68, 0xaf, 0x39,
- 0x27, 0x6a, 0x90, 0xbe, 0xf2, 0x0f, 0x14, 0x3f, 0x35, 0xd4, 0x93, 0x3d,
- 0x5d, 0x2b, 0xf0, 0xbd, 0xf9, 0xae, 0x09, 0xbe, 0x76, 0xff, 0x94, 0x3d,
- 0xdc, 0x99, 0x49, 0x3d, 0x93, 0x4c, 0xc5, 0x3d, 0x4d, 0x8b, 0x01, 0x3e,
- 0xb0, 0x9a, 0xd6, 0x3d, 0x2b, 0xbb, 0x56, 0x3e, 0x62, 0xb5, 0x91, 0x3c,
- 0xab, 0x69, 0x9f, 0x3e, 0xe3, 0x65, 0xce, 0x3b, 0xe8, 0x1c, 0x5f, 0xbe,
- 0xac, 0x2e, 0xf9, 0xbe, 0x57, 0xf8, 0xe2, 0x3d, 0x18, 0xca, 0x05, 0x3e,
- 0x89, 0xea, 0x7e, 0xbd, 0xc4, 0xbb, 0x5a, 0xbe, 0x1f, 0x17, 0x44, 0x3d,
- 0x73, 0x59, 0xd1, 0xbe, 0xa5, 0xeb, 0x82, 0x3d, 0x07, 0x52, 0xba, 0x3c,
- 0x9c, 0xc0, 0xc4, 0x3c, 0x1d, 0x21, 0xe6, 0xbe, 0xe4, 0xdc, 0xf0, 0x3c,
- 0x7f, 0xc7, 0x5d, 0xbd, 0x29, 0xcb, 0xd5, 0xbe, 0xae, 0x05, 0xac, 0xbe,
- 0x9b, 0x0e, 0x16, 0x3e, 0x31, 0xaf, 0x8b, 0x3d, 0xca, 0x7c, 0x0d, 0xbe,
- 0x7f, 0xe0, 0x05, 0x3d, 0xfc, 0x24, 0x9b, 0x3e, 0x93, 0x96, 0x42, 0xbe,
- 0x59, 0x56, 0x27, 0xbe, 0x48, 0x08, 0xdb, 0xbe, 0x9c, 0x59, 0xb4, 0xbe,
- 0x0d, 0x8e, 0xd5, 0xbd, 0x01, 0x0a, 0x8d, 0x3e, 0xc7, 0x16, 0x90, 0x3e,
- 0x39, 0x94, 0x52, 0x3d, 0xf6, 0xa4, 0x1b, 0x3e, 0x03, 0x53, 0x78, 0x3d,
- 0xb2, 0xa6, 0x01, 0xbe, 0xca, 0xfa, 0x83, 0x3e, 0x04, 0xc9, 0x6f, 0x3e,
- 0x5e, 0xae, 0x8c, 0xbd, 0xf0, 0xe5, 0xd7, 0xbc, 0x6e, 0xb3, 0x3b, 0xbe,
- 0xb0, 0xa6, 0x9e, 0x3e, 0x03, 0x2e, 0xf9, 0xbd, 0x5f, 0xe8, 0xa8, 0xbe,
- 0x22, 0xba, 0x9f, 0xbe, 0xab, 0x1a, 0xf9, 0x3c, 0xcf, 0x3c, 0xb7, 0x3e,
- 0x02, 0x39, 0x5d, 0x3e, 0x37, 0x25, 0x61, 0xbd, 0xeb, 0x38, 0x97, 0xbd,
- 0xb7, 0xd5, 0x50, 0x3c, 0xff, 0x2b, 0x88, 0x3e, 0x2e, 0xb0, 0x51, 0x3e,
- 0x16, 0x34, 0xbb, 0x3d, 0xab, 0x27, 0x81, 0x3e, 0xd3, 0x27, 0x93, 0x3d,
- 0x27, 0x76, 0x68, 0x3e, 0x08, 0xff, 0x2c, 0x3d, 0xe8, 0x27, 0x4f, 0x3e,
- 0xce, 0x39, 0x45, 0x3e, 0x22, 0x4b, 0xb1, 0xbd, 0x9b, 0x8a, 0xce, 0x3d,
- 0x07, 0xfc, 0xa0, 0x3e, 0xaf, 0xb4, 0x28, 0xbe, 0x5e, 0x1e, 0xa9, 0x3e,
- 0x88, 0x5f, 0xc6, 0xbe, 0x9f, 0xc6, 0xec, 0xbd, 0x40, 0x46, 0x9e, 0xbd,
- 0x27, 0x90, 0xaa, 0x3e, 0xba, 0x08, 0x64, 0xbd, 0x75, 0x2f, 0x06, 0xbe,
- 0xb4, 0x7f, 0x81, 0x3e, 0xa1, 0x84, 0xd5, 0xbd, 0xba, 0xd1, 0x0e, 0xbe,
- 0xc4, 0x22, 0xab, 0xbd, 0x2f, 0x8f, 0x2b, 0xbe, 0x0c, 0x11, 0x2d, 0xbf,
- 0xa7, 0xb7, 0xdb, 0xbe, 0xe0, 0x6f, 0x63, 0xbc, 0xea, 0x5e, 0xd6, 0x3d,
- 0x74, 0xe0, 0xfb, 0xbd, 0x91, 0xbe, 0x31, 0xbe, 0xc7, 0xd9, 0x96, 0xbe,
- 0x73, 0xe9, 0x6d, 0xbd, 0xbd, 0xbb, 0x11, 0xbe, 0x98, 0x7f, 0x08, 0xbe,
- 0x05, 0x2c, 0x0c, 0xbe, 0xcf, 0x62, 0x36, 0x3e, 0x98, 0xa6, 0x47, 0xbe,
- 0xd0, 0xa9, 0x6e, 0xbf, 0x06, 0x93, 0x2c, 0x3d, 0xf2, 0x55, 0x5f, 0x3f,
- 0x40, 0xe0, 0xd6, 0xbb, 0x55, 0x61, 0x73, 0x3e, 0x77, 0x4e, 0x89, 0x3e,
- 0xf4, 0x74, 0x9d, 0x3c, 0x87, 0x47, 0xf6, 0xbf, 0x03, 0x7a, 0xa0, 0x3e,
- 0x24, 0xdd, 0x3e, 0x3d, 0xbb, 0xce, 0x37, 0x3f, 0x63, 0x0e, 0x18, 0xbf,
- 0x51, 0x93, 0x2f, 0xbf, 0x25, 0x3a, 0x41, 0xbe, 0x15, 0x2c, 0x98, 0xbe,
- 0xd4, 0x74, 0x54, 0x3f, 0xa9, 0xf8, 0x05, 0xbe, 0x84, 0xce, 0xcf, 0xbe,
- 0x2b, 0x46, 0x40, 0xbf, 0x16, 0xe4, 0x6b, 0x3e, 0x44, 0xfa, 0x30, 0x3d,
- 0x45, 0x51, 0xda, 0xbd, 0x2c, 0x81, 0x7f, 0xbc, 0x2e, 0x27, 0x3f, 0xbd,
- 0xff, 0x47, 0x61, 0x3e, 0xc2, 0xd9, 0xdc, 0xbd, 0xdc, 0xa5, 0xc1, 0x3e,
- 0x7e, 0x42, 0xd5, 0xbd, 0xfa, 0x6f, 0xbe, 0x3d, 0x60, 0x15, 0x0f, 0xbd,
- 0x25, 0x4d, 0x86, 0x3f, 0x04, 0x57, 0xca, 0xbe, 0xe3, 0xcb, 0xfb, 0x3d,
- 0x31, 0xf6, 0x13, 0xbe, 0x46, 0x87, 0x50, 0xbd, 0xb3, 0x25, 0xd7, 0xbe,
- 0xf3, 0xb7, 0x32, 0xbf, 0xa8, 0xad, 0x51, 0xbd, 0xc3, 0x40, 0x63, 0x3c,
- 0xc9, 0xef, 0x0e, 0x3e, 0x28, 0x81, 0x17, 0xbf, 0x16, 0x48, 0x7c, 0xbd,
- 0x8d, 0xb7, 0x6f, 0x3e, 0x33, 0xcb, 0x23, 0xbf, 0xbc, 0xed, 0x17, 0x3d,
- 0x57, 0xa9, 0x13, 0x3e, 0x5c, 0x17, 0xa7, 0x3e, 0xb6, 0x31, 0xe0, 0xbd,
- 0x17, 0x22, 0x33, 0x3f, 0x09, 0x7c, 0x04, 0x3f, 0x8e, 0x71, 0x33, 0xbe,
- 0xf2, 0x70, 0xad, 0xbd, 0x7c, 0x9d, 0x6b, 0xbc, 0xfe, 0xa0, 0x9d, 0x3d,
- 0x69, 0x6b, 0xe2, 0xbe, 0xff, 0xc2, 0x1f, 0xbf, 0xaa, 0xdc, 0xe2, 0x3e,
- 0xdf, 0xce, 0xd1, 0x3e, 0x0b, 0x65, 0x8c, 0x3f, 0xe3, 0x77, 0xe6, 0xbd,
- 0xa2, 0x9b, 0x1f, 0xbd, 0xb3, 0x8d, 0xd6, 0x3e, 0x70, 0x28, 0x03, 0xbe,
- 0x3e, 0xc1, 0x14, 0xbd, 0x5d, 0x7a, 0x58, 0xbe, 0x25, 0x8e, 0xf2, 0x3c,
- 0x3e, 0x17, 0xd4, 0xbe, 0xb2, 0xc6, 0x43, 0x3e, 0x75, 0xbe, 0x3e, 0xbe,
- 0x86, 0xcc, 0x5a, 0xbe, 0x10, 0xc4, 0xb1, 0x3d, 0xf3, 0x92, 0x41, 0xbe,
- 0x43, 0x03, 0xd9, 0xbe, 0xa2, 0x87, 0x45, 0x3f, 0xb2, 0x39, 0xcd, 0xbe,
- 0xdb, 0x23, 0xb1, 0x3d, 0x43, 0xc5, 0x33, 0x3e, 0xb0, 0x94, 0xdc, 0xbd,
- 0xe4, 0x2f, 0x2d, 0x3d, 0xaa, 0x95, 0x5f, 0xbe, 0x81, 0x06, 0x41, 0x3d,
- 0x2d, 0x25, 0x4b, 0xbe, 0x37, 0xea, 0x53, 0x3e, 0x04, 0x86, 0x36, 0x3f,
- 0xad, 0xc1, 0xf5, 0x3e, 0x6d, 0xe7, 0x68, 0xbe, 0x48, 0xce, 0xe7, 0xbe,
- 0x94, 0x25, 0x2d, 0xbf, 0x08, 0x70, 0x9c, 0x3d, 0x33, 0xc5, 0xf1, 0xbe,
- 0xec, 0x0a, 0x49, 0xbe, 0x7c, 0x20, 0x7b, 0x3d, 0x76, 0x9b, 0x07, 0xbe,
- 0xb3, 0x43, 0xe0, 0xb9, 0xa9, 0xb6, 0x18, 0x3f, 0xf3, 0x74, 0xc2, 0xbb,
- 0x85, 0x8c, 0x57, 0x3e, 0x7e, 0xa0, 0x30, 0x3f, 0xbd, 0x1e, 0x42, 0xbe,
- 0xfa, 0xd5, 0x0a, 0xbf, 0xd0, 0x64, 0x06, 0xbe, 0x03, 0x28, 0xa8, 0xbe,
- 0xb5, 0xa9, 0x58, 0xbd, 0xef, 0xc5, 0x14, 0x3f, 0xa0, 0x22, 0x33, 0x3f,
- 0xc7, 0x9a, 0x3d, 0xbd, 0x97, 0x90, 0xbe, 0x3b, 0x89, 0x71, 0x4a, 0x3e,
- 0x55, 0x62, 0xad, 0xbd, 0xc3, 0x2c, 0x62, 0xbe, 0xc5, 0x63, 0xb3, 0xbe,
- 0xe2, 0x7e, 0x7b, 0x3d, 0x71, 0xfe, 0xf0, 0x3e, 0xe2, 0xde, 0x48, 0x3e,
- 0xd0, 0x9e, 0xaa, 0xbe, 0xb0, 0x09, 0x9d, 0xbc, 0x90, 0xb3, 0x41, 0x3e,
- 0xed, 0xac, 0xfb, 0xbc, 0xae, 0x33, 0x51, 0xbe, 0xe9, 0x0f, 0x02, 0xbe,
- 0xb2, 0x34, 0x21, 0xbd, 0xee, 0x04, 0xcb, 0x3d, 0x12, 0xdb, 0xb1, 0x3d,
- 0xd5, 0xd4, 0x7b, 0xbd, 0x4c, 0xcc, 0x66, 0xbc, 0xfe, 0x0f, 0x83, 0xbe,
- 0x4c, 0x80, 0x7f, 0x3e, 0x04, 0xee, 0x6d, 0xbc, 0x1e, 0xe8, 0x55, 0xbe,
- 0x66, 0x40, 0x19, 0x3d, 0xe9, 0x2b, 0xa6, 0xbd, 0x60, 0x28, 0xe5, 0xbd,
- 0x48, 0x2f, 0x7d, 0x3d, 0xed, 0xc9, 0x53, 0x3e, 0x8e, 0xcc, 0x9a, 0x3e,
- 0x14, 0x4f, 0x30, 0x3e, 0x2f, 0xe9, 0x9c, 0xbe, 0x01, 0x7f, 0x35, 0x3d,
- 0x5a, 0xf8, 0x89, 0x3d, 0x98, 0x99, 0xcc, 0x3d, 0x44, 0x80, 0xa6, 0x3d,
- 0x37, 0xfa, 0x92, 0x3d, 0x52, 0x07, 0xd9, 0xbd, 0xd9, 0xd7, 0x2b, 0xbe,
- 0xf5, 0x75, 0x1b, 0x3c, 0x2e, 0x64, 0xc4, 0x3c, 0xf4, 0x70, 0xb5, 0x3b,
- 0x9a, 0xc3, 0x67, 0xbd, 0x96, 0xcf, 0xcd, 0xbd, 0x4f, 0x15, 0xf6, 0x3d,
- 0x4a, 0x8b, 0x95, 0x3d, 0x2f, 0xa2, 0x98, 0xbe, 0x29, 0x24, 0x01, 0x3e,
- 0x53, 0x84, 0x27, 0x3e, 0xc3, 0xf1, 0x53, 0xbe, 0xe2, 0x09, 0x5c, 0xbc,
- 0x95, 0x1d, 0xab, 0xbe, 0x3c, 0x6f, 0x9d, 0xbc, 0xf3, 0x86, 0x48, 0x3e,
- 0x5d, 0x0a, 0x15, 0x3e, 0x70, 0x71, 0xd8, 0x3d, 0x93, 0x59, 0x43, 0xbe,
- 0xa9, 0x4f, 0x1d, 0x3e, 0x1b, 0xff, 0x88, 0x3e, 0x00, 0x99, 0x89, 0x3a,
- 0x6d, 0x4b, 0x77, 0xbe, 0xfa, 0x09, 0xbd, 0xbe, 0x77, 0xad, 0x12, 0xbd,
- 0x91, 0x25, 0x01, 0x3d, 0xfb, 0x47, 0x71, 0x3e, 0xf2, 0xc2, 0x33, 0x3d,
- 0xc6, 0x16, 0xc8, 0x3d, 0xca, 0xfd, 0x91, 0x3d, 0xae, 0x52, 0x12, 0x3e,
- 0x90, 0x9d, 0x30, 0xbb, 0x55, 0x28, 0x62, 0xbd, 0xb5, 0xf7, 0x9c, 0xbd,
- 0x7c, 0x75, 0xaa, 0x3d, 0x95, 0x51, 0x52, 0xbe, 0xe6, 0x25, 0x46, 0xbe,
- 0x0a, 0xd7, 0x3e, 0xbe, 0x9b, 0xf3, 0x33, 0x3e, 0x37, 0x6f, 0x0f, 0x3e,
- 0xaf, 0xaf, 0xe0, 0xbd, 0x33, 0xa3, 0x76, 0xbc, 0x5f, 0x8f, 0xa9, 0x3d,
- 0x88, 0x4a, 0x83, 0xbc, 0x10, 0x17, 0xce, 0xbd, 0xa5, 0xc7, 0x11, 0x3e,
- 0x71, 0x74, 0x5a, 0xbd, 0x49, 0xce, 0xb4, 0xbe, 0x2c, 0xbf, 0xb1, 0x3c,
- 0x10, 0x70, 0x5e, 0xbe, 0x8c, 0xf3, 0x1f, 0xbe, 0x8d, 0xaa, 0x32, 0x3c,
- 0x2d, 0x66, 0xd3, 0x3d, 0x99, 0xec, 0x94, 0xbe, 0x37, 0x3c, 0x39, 0xbe,
- 0xce, 0xfc, 0xe8, 0x3c, 0x1e, 0x27, 0xb2, 0x3d, 0x13, 0x2e, 0x0a, 0x3e,
- 0x83, 0xf8, 0x88, 0x3e, 0x15, 0xce, 0xef, 0xbd, 0x60, 0xdb, 0x91, 0xbd,
- 0x2a, 0xfb, 0x0c, 0x3d, 0xef, 0xbc, 0xd6, 0xbc, 0x0a, 0xe0, 0x48, 0x3e,
- 0x44, 0xcc, 0x8e, 0x3e, 0xd2, 0xaa, 0x5c, 0xbe, 0x09, 0x22, 0x03, 0xbb,
- 0x08, 0x91, 0x5a, 0xbd, 0x33, 0x90, 0x58, 0x3e, 0x00, 0xe3, 0x98, 0x3d,
- 0xc0, 0x77, 0x5b, 0xbe, 0x9d, 0x6c, 0x15, 0xbe, 0x7b, 0xf1, 0x78, 0xbe,
- 0x9c, 0xba, 0xc4, 0x3d, 0x6b, 0x5d, 0xf4, 0xbc, 0x95, 0x20, 0xa0, 0x3d,
- 0xe5, 0x64, 0xfd, 0xbc, 0xb3, 0x14, 0x4f, 0x3c, 0xb5, 0xc0, 0x44, 0xbe,
- 0x0d, 0x81, 0xd4, 0xbd, 0xf4, 0x49, 0x06, 0xbe, 0x32, 0x3e, 0x66, 0xbe,
- 0x92, 0xf7, 0x38, 0x3d, 0x4e, 0x86, 0x71, 0xbe, 0x2e, 0x0c, 0x85, 0xbe,
- 0xdd, 0xef, 0x62, 0x3c, 0xfb, 0x7e, 0x57, 0x3d, 0xf5, 0x7f, 0xc9, 0x3d,
- 0xcd, 0x5b, 0xad, 0xbe, 0x1a, 0x9c, 0x96, 0x3f, 0xdd, 0x55, 0x18, 0x3e,
- 0x74, 0xc3, 0x6c, 0x3f, 0xc4, 0xa6, 0x9e, 0x3b, 0xcc, 0x8a, 0x4a, 0x3f,
- 0x9b, 0x7f, 0xc4, 0x3d, 0x3e, 0x81, 0x9d, 0x3e, 0x18, 0x81, 0x15, 0xbf,
- 0x50, 0xab, 0x3d, 0xbf, 0xce, 0x16, 0x3a, 0x3e, 0x12, 0x3f, 0xc7, 0xbe,
- 0xf2, 0xb4, 0x1a, 0x3e, 0x9a, 0xb1, 0xa6, 0x3e, 0xb7, 0xe2, 0xdf, 0xbe,
- 0x1f, 0x3c, 0x56, 0xbe, 0xe9, 0xa1, 0x58, 0x3e, 0x42, 0x36, 0x17, 0xbf,
- 0xa1, 0xb4, 0xe7, 0xbe, 0x57, 0xe6, 0x2a, 0x3e, 0x70, 0x31, 0x09, 0x3f,
- 0x14, 0xba, 0x15, 0x3f, 0xff, 0xbb, 0xee, 0xbe, 0xbe, 0x37, 0x85, 0xbe,
- 0xfb, 0x71, 0x9b, 0xbe, 0x03, 0xfc, 0x6d, 0x3e, 0x14, 0xd8, 0x0b, 0xbf,
- 0xed, 0x85, 0x94, 0xbf, 0x03, 0xf9, 0xdf, 0xbc, 0xfc, 0x90, 0xbe, 0xbe,
- 0x69, 0x10, 0x24, 0x3f, 0x8c, 0xb3, 0x37, 0xbf, 0xba, 0xc6, 0x2a, 0x3d,
- 0x6e, 0x89, 0x0e, 0x3f, 0x68, 0x45, 0xb2, 0x3d, 0xc9, 0xa1, 0x71, 0xbe,
- 0x6f, 0x3f, 0x93, 0x3e, 0x14, 0x25, 0x97, 0xbe, 0x50, 0xc6, 0x38, 0x3e,
- 0xcb, 0xa8, 0xff, 0xbe, 0x11, 0xba, 0x2f, 0xbd, 0x28, 0xe8, 0x9f, 0xbd,
- 0x9d, 0xbe, 0xb1, 0xbe, 0x68, 0xf9, 0xe8, 0xbd, 0xae, 0xb9, 0x87, 0x3f,
- 0x83, 0x46, 0xe3, 0xbd, 0x5e, 0x3f, 0x45, 0x3d, 0xe3, 0x9a, 0xc3, 0xbe,
- 0x36, 0x8b, 0x59, 0x3e, 0xfe, 0x77, 0x9b, 0xbd, 0x67, 0x9c, 0xe4, 0x3e,
- 0xc1, 0x80, 0xb9, 0xbd, 0xe1, 0xcd, 0x5e, 0x3f, 0xb2, 0xbb, 0x03, 0x3d,
- 0x46, 0x71, 0xfa, 0xbd, 0x0e, 0x18, 0x81, 0xbd, 0xe8, 0x2f, 0xbd, 0x3e,
- 0x4a, 0xee, 0xb6, 0x3e, 0x02, 0x9c, 0x0c, 0xbf, 0x31, 0xe9, 0x1a, 0x3f,
- 0x2a, 0x30, 0xfd, 0x3e, 0x87, 0x69, 0xa6, 0x3e, 0xe4, 0xb3, 0x9f, 0x3e,
- 0xf2, 0x72, 0x43, 0xbf, 0x1f, 0xed, 0x8d, 0x3d, 0x84, 0x13, 0x5c, 0x3d,
- 0x3a, 0x8b, 0x0e, 0xbe, 0x0b, 0x8b, 0x00, 0x3f, 0xe7, 0x0f, 0x9d, 0xbe,
- 0x8e, 0x63, 0xd9, 0x3d, 0x7d, 0x13, 0x0d, 0xbe, 0x89, 0x5f, 0x7b, 0xbd,
- 0xa8, 0x14, 0x66, 0xbe, 0x97, 0xd1, 0x9f, 0xbd, 0x42, 0xd3, 0x23, 0xbf,
- 0xd1, 0xe1, 0x6e, 0x3e, 0x0d, 0xa2, 0x25, 0x3d, 0x67, 0x73, 0x69, 0xbf,
- 0x4b, 0xcc, 0xcd, 0xbe, 0x0b, 0xef, 0x7f, 0xbd, 0x03, 0xfe, 0x6e, 0xbd,
- 0xd5, 0xc0, 0x75, 0xbc, 0xa1, 0xee, 0xc3, 0x3e, 0x04, 0x9b, 0xb1, 0xbe,
- 0x24, 0xce, 0x0c, 0xbe, 0xf7, 0x67, 0x21, 0x3f, 0x56, 0x3d, 0xa4, 0x3e,
- 0x7c, 0x2e, 0x93, 0x3d, 0xd0, 0xfc, 0x41, 0xbe, 0x9e, 0x19, 0x26, 0xbe,
- 0x6b, 0xaa, 0xf5, 0x3e, 0xc2, 0xea, 0xac, 0xbe, 0x56, 0xdb, 0x22, 0x3d,
- 0xd2, 0xcd, 0x75, 0x3e, 0xc9, 0x64, 0x75, 0x3e, 0x71, 0x86, 0x5c, 0xbd,
- 0xbc, 0x60, 0xb4, 0x3e, 0xfe, 0xf5, 0x8f, 0xbe, 0x7d, 0x7e, 0x6c, 0x3f,
- 0x02, 0x5b, 0x12, 0xbf, 0xb2, 0x54, 0x03, 0xbf, 0xee, 0x78, 0xa0, 0xb9,
- 0x49, 0x34, 0x91, 0x3e, 0x4a, 0xcd, 0x54, 0xbe, 0xe3, 0x03, 0x20, 0xbe,
- 0x8d, 0xb8, 0x85, 0xbb, 0x45, 0x4d, 0x1d, 0x3f, 0xd9, 0x01, 0x9b, 0x3e,
- 0xa7, 0xbc, 0x01, 0xbe, 0x4f, 0xcd, 0xa0, 0x3b, 0x2c, 0x63, 0x04, 0x3c,
- 0x6d, 0xa3, 0x14, 0x3f, 0xa6, 0x51, 0x84, 0xbe, 0xad, 0xd9, 0xba, 0xbe,
- 0xe9, 0x0a, 0xdc, 0xbd, 0x10, 0xbe, 0xb1, 0x3e, 0xcd, 0xb5, 0x84, 0xbe,
- 0x33, 0x50, 0xfb, 0x3e, 0x66, 0xfc, 0x90, 0x3c, 0xe4, 0x73, 0xe5, 0xbd,
- 0x2c, 0x4b, 0xe9, 0xbe, 0xa5, 0xb0, 0xff, 0xbc, 0x57, 0xdd, 0x38, 0xbe,
- 0x1a, 0xbb, 0x01, 0x3f, 0x4c, 0x8b, 0x5b, 0x3e, 0x7d, 0x84, 0x00, 0x3e,
- 0xbf, 0x02, 0x5e, 0xbe, 0x78, 0x6c, 0xe9, 0xbe, 0x8a, 0x8f, 0x9d, 0xbe,
- 0x71, 0x6e, 0x1a, 0xbe, 0x82, 0x81, 0x7a, 0xbd, 0xce, 0x8f, 0x1a, 0x3d,
- 0x24, 0x2c, 0x1d, 0xbf, 0xc0, 0x47, 0xe9, 0x3e, 0x03, 0x4c, 0x70, 0x3d,
- 0x1b, 0x29, 0x53, 0x3e, 0xa2, 0x70, 0xb8, 0xbd, 0x54, 0xe6, 0x92, 0xbe,
- 0xbd, 0x2a, 0xf5, 0xbe, 0x50, 0x3e, 0x58, 0xbe, 0xa0, 0x79, 0x83, 0xbe,
- 0x4e, 0x7b, 0xab, 0xbe, 0x8f, 0xa3, 0x07, 0xbe, 0xd6, 0xed, 0x4e, 0xbe,
- 0xad, 0x0e, 0xa0, 0x3d, 0x42, 0x8d, 0x48, 0x3d, 0x6e, 0xbf, 0x35, 0x3e,
- 0xae, 0xd4, 0x83, 0xbd, 0x2b, 0x0d, 0xea, 0xbd, 0xdf, 0x3a, 0xd8, 0x3c,
- 0x14, 0x8c, 0x71, 0x3d, 0x8a, 0x14, 0xb1, 0xbd, 0xc0, 0xdf, 0x0f, 0x3f,
- 0x6a, 0x97, 0x12, 0xbf, 0x71, 0x41, 0x46, 0x3e, 0xb7, 0xf7, 0x6b, 0xbe,
- 0x95, 0x04, 0x79, 0x3e, 0xae, 0x01, 0xa9, 0xbe, 0x0c, 0x52, 0x96, 0xbd,
- 0xca, 0x71, 0x2a, 0xbf, 0x3f, 0xf4, 0x9d, 0xbd, 0x74, 0x81, 0x7d, 0xbe,
- 0x1b, 0x96, 0x7a, 0xbe, 0x77, 0x01, 0xf1, 0x3d, 0x51, 0x4d, 0x04, 0xbe,
- 0x15, 0xa1, 0x81, 0x3e, 0x89, 0xba, 0xeb, 0xbe, 0x7f, 0x9c, 0x90, 0xbd,
- 0xcb, 0x0c, 0xf6, 0x3d, 0x53, 0xb6, 0x48, 0x3d, 0x2e, 0xe6, 0xf5, 0xbd,
- 0xff, 0xd7, 0x25, 0xbd, 0x61, 0x4c, 0x88, 0xbe, 0x48, 0xb0, 0x3d, 0x3d,
- 0x81, 0x71, 0xb0, 0x3e, 0xd6, 0x14, 0xee, 0x3d, 0x2b, 0x4c, 0x7f, 0xbd,
- 0x36, 0x56, 0x5e, 0xbe, 0xab, 0x4b, 0xe2, 0x3d, 0xaf, 0x0c, 0x47, 0x3e,
- 0x9e, 0x17, 0x8f, 0xbd, 0xe8, 0x10, 0xa9, 0x3d, 0x4c, 0x0b, 0x01, 0xbd,
- 0x55, 0x29, 0xc4, 0xbc, 0xf9, 0xd8, 0x06, 0x3e, 0x82, 0xd4, 0x97, 0x3e,
- 0xf3, 0xb0, 0x6b, 0xbe, 0x04, 0x7d, 0xbd, 0x3d, 0x13, 0xd5, 0x00, 0xbf,
- 0xa2, 0xa9, 0xa4, 0x3c, 0x5f, 0x79, 0xba, 0xbc, 0x57, 0xe7, 0xd9, 0x3d,
- 0xdb, 0xc8, 0xea, 0x3d, 0x83, 0x6f, 0x11, 0xbe, 0x8f, 0x73, 0x93, 0xbd,
- 0x9a, 0x86, 0x45, 0xbc, 0x97, 0x8c, 0x10, 0x3d, 0x00, 0xa5, 0xa2, 0x3d,
- 0xcf, 0x99, 0x9b, 0xbd, 0x3a, 0x84, 0xc2, 0xbd, 0x22, 0x29, 0xb8, 0x3e,
- 0x89, 0x43, 0x56, 0x3d, 0xa5, 0xb5, 0x82, 0x3d, 0x47, 0x7f, 0x2b, 0x3b,
- 0xa2, 0xe8, 0x0f, 0x3c, 0x07, 0xea, 0xd7, 0x3d, 0x07, 0xee, 0xd8, 0x3e,
- 0xd2, 0x1d, 0x75, 0xbd, 0x84, 0x59, 0x72, 0x3e, 0xaf, 0x4a, 0xec, 0xbd,
- 0x83, 0xe5, 0x9c, 0x3d, 0x1f, 0x88, 0x4d, 0xbe, 0x4d, 0x0a, 0x9b, 0x3e,
- 0xb4, 0x4c, 0x4f, 0xbe, 0xfc, 0x28, 0x2f, 0xbd, 0x16, 0x32, 0xad, 0xbe,
- 0x55, 0xb8, 0xcb, 0xbe, 0xc5, 0x8e, 0x90, 0xbe, 0xcc, 0x55, 0x98, 0x3e,
- 0x6d, 0x00, 0x59, 0x3e, 0x4e, 0x11, 0xeb, 0xba, 0x5f, 0xd1, 0xe8, 0xba,
- 0x20, 0x13, 0x02, 0xbe, 0xe5, 0x5d, 0x50, 0x3d, 0x8f, 0xed, 0x6b, 0x3e,
- 0xf1, 0x62, 0x90, 0x3d, 0xc9, 0xee, 0xc2, 0xbd, 0x11, 0x6e, 0x7b, 0xbd,
- 0xc6, 0x7f, 0x24, 0xbe, 0xe9, 0xea, 0xb4, 0xbe, 0xe7, 0xae, 0xb9, 0xbe,
- 0x1e, 0xe0, 0x19, 0x3c, 0xf1, 0x89, 0x3f, 0x3e, 0xb1, 0xf9, 0x0f, 0xbe,
- 0xef, 0x51, 0xdd, 0x3e, 0xc4, 0x40, 0x3e, 0xbd, 0x5e, 0x5c, 0x9f, 0x3e,
- 0x5b, 0x92, 0x08, 0xbf, 0x01, 0x7f, 0x42, 0xbd, 0x8d, 0x7c, 0x37, 0x3d,
- 0xbd, 0x0f, 0x81, 0xbe, 0xc0, 0xaa, 0xef, 0xbd, 0xd4, 0xe7, 0xa7, 0x3e,
- 0x13, 0xb5, 0x8f, 0xbd, 0xe8, 0xc9, 0x01, 0xbe, 0x3f, 0xe4, 0xb8, 0xbd,
- 0x5b, 0xa5, 0x0c, 0xbe, 0xa2, 0xb0, 0x8f, 0xbe, 0x61, 0xfb, 0x6b, 0x3d,
- 0x08, 0xd3, 0x5f, 0xbe, 0x26, 0x9e, 0x93, 0xbd, 0x8c, 0xd1, 0x86, 0x3e,
- 0x38, 0x50, 0xab, 0xbe, 0xbe, 0xdd, 0xc8, 0x3e, 0x1b, 0xa7, 0xfe, 0x3d,
- 0x66, 0x29, 0x94, 0xbe, 0xe8, 0x5a, 0xba, 0x3e, 0x84, 0xf5, 0x09, 0x3b,
- 0x88, 0x8b, 0xd8, 0xbd, 0x5e, 0x7b, 0x35, 0xbe, 0x44, 0x36, 0x0a, 0xbd,
- 0x3a, 0xc6, 0x8e, 0x3e, 0x35, 0xb0, 0xd2, 0xbd, 0x83, 0x00, 0x8f, 0x3e,
- 0x9f, 0x35, 0xa1, 0x3e, 0x18, 0xf3, 0xb9, 0x3e, 0x27, 0x64, 0xa1, 0x3c,
- 0xde, 0x28, 0xcb, 0x3e, 0xe2, 0xba, 0x05, 0xbd, 0x8e, 0x6c, 0x49, 0xbe,
- 0x11, 0x8f, 0xd5, 0xbe, 0xf5, 0xfa, 0x25, 0xbe, 0x33, 0x6f, 0xb8, 0x3e,
- 0x49, 0x69, 0x43, 0x3d, 0xdc, 0x57, 0xa3, 0xbe, 0xd8, 0x4a, 0x06, 0x3c,
- 0x2b, 0x11, 0xc1, 0xbe, 0x71, 0xa8, 0x4e, 0x3e, 0x39, 0x2e, 0x48, 0xbe,
- 0xf8, 0xf2, 0xd5, 0x3c, 0x46, 0x58, 0xcd, 0xbe, 0xbc, 0x7b, 0x10, 0xbe,
- 0xde, 0x5b, 0xd4, 0x3c, 0x0d, 0x97, 0x9b, 0xbe, 0x78, 0xf4, 0x48, 0xbe,
- 0xe6, 0xb0, 0xf3, 0xbd, 0x29, 0x3b, 0xb0, 0x3d, 0x14, 0x43, 0x93, 0x3d,
- 0x8e, 0x7c, 0x62, 0x3d, 0x7e, 0xb2, 0xdf, 0xbe, 0x29, 0x55, 0x1e, 0xbe,
- 0x56, 0x0b, 0xfa, 0x3c, 0x9c, 0x07, 0x58, 0x3e, 0xbf, 0x1b, 0xf5, 0xbe,
- 0xe0, 0x9a, 0xb0, 0xbe, 0xaa, 0x2a, 0x9d, 0xbd, 0x41, 0x2b, 0x29, 0x3e,
- 0x6f, 0xaf, 0xc7, 0x3d, 0xf5, 0x25, 0xd7, 0x3d, 0x61, 0x03, 0xd4, 0xbd,
- 0xe0, 0x34, 0x41, 0xbe, 0x44, 0x04, 0x32, 0x3e, 0xde, 0x78, 0x83, 0x3e,
- 0x10, 0x95, 0x47, 0xbe, 0xd9, 0x36, 0x23, 0xbd, 0x92, 0xd6, 0xc1, 0xbe,
- 0x66, 0x51, 0xc0, 0x3e, 0x8f, 0x6f, 0x0f, 0x3d, 0x29, 0x22, 0x3a, 0xbe,
- 0x07, 0xbd, 0x8a, 0xbe, 0x3d, 0x3e, 0x85, 0x3d, 0x20, 0xf9, 0xb0, 0x3e,
- 0xfe, 0x71, 0x9a, 0x3e, 0x9f, 0x2f, 0x06, 0xbc, 0xe7, 0x07, 0xf4, 0x3c,
- 0x56, 0x53, 0x88, 0xbd, 0x09, 0xb0, 0x26, 0x3e, 0xe4, 0x2d, 0x72, 0x3e,
- 0x64, 0x37, 0xc2, 0xbd, 0x34, 0x40, 0x26, 0x3e, 0x51, 0x35, 0x58, 0x3e,
- 0xcd, 0x16, 0x8e, 0xbe, 0xaf, 0xef, 0x6f, 0x3e, 0xf9, 0x64, 0x42, 0x3e,
- 0x7a, 0x3d, 0x1f, 0x3e, 0xb4, 0x44, 0xfb, 0xbc, 0x59, 0x0a, 0x61, 0x3d,
- 0x70, 0x93, 0x31, 0x3d, 0x92, 0x42, 0xa9, 0xbe, 0xca, 0xf7, 0x90, 0x3e,
- 0x49, 0x8d, 0xdc, 0xbe, 0xe2, 0x2d, 0x5e, 0xbd, 0x94, 0xc4, 0x91, 0xbe,
- 0x16, 0xf2, 0x52, 0xbe, 0xc4, 0xb6, 0x8f, 0x3e, 0x52, 0xa0, 0xb4, 0xbd,
- 0x81, 0xc5, 0xbb, 0xbd, 0x8f, 0x8d, 0x17, 0xbe, 0x40, 0xe9, 0x8b, 0x3d,
- 0x36, 0x14, 0x10, 0xbe, 0x3d, 0xfe, 0x9c, 0x3d, 0x3e, 0xb9, 0x56, 0xbe,
- 0x64, 0x5c, 0xe7, 0xbd, 0x60, 0xe2, 0x7d, 0xbd, 0x70, 0xd7, 0x9c, 0x3d,
- 0xfc, 0x56, 0xa3, 0xbe, 0x6d, 0x84, 0x70, 0xbe, 0x1e, 0x46, 0x3a, 0xbe,
- 0xa4, 0xe7, 0x0b, 0xbd, 0x49, 0xb4, 0xc4, 0xbe, 0x6e, 0xdf, 0xab, 0xbd,
- 0xb8, 0x63, 0x62, 0x3e, 0x8e, 0x82, 0xc2, 0xbc, 0x75, 0xb0, 0x87, 0xbe,
- 0x64, 0x0b, 0x1a, 0xbf, 0xae, 0xb4, 0x40, 0xbd, 0x30, 0xfe, 0x87, 0x3f,
- 0x92, 0x26, 0xd5, 0xbd, 0xaa, 0x3e, 0xa4, 0x3c, 0x12, 0x69, 0x89, 0xbd,
- 0x22, 0x54, 0xe2, 0x3c, 0xa2, 0x0f, 0x8e, 0xbf, 0x08, 0x3a, 0xe8, 0xbd,
- 0xe5, 0x54, 0x12, 0xbf, 0x06, 0x99, 0x9c, 0x3e, 0x3f, 0x40, 0xff, 0xbe,
- 0xdc, 0x12, 0xf8, 0xbe, 0x6c, 0x2d, 0x06, 0xbf, 0x53, 0x5e, 0xca, 0xbe,
- 0x3c, 0xd0, 0x02, 0x3f, 0x9c, 0x66, 0x4f, 0xbf, 0x53, 0x49, 0x0e, 0x3e,
- 0x7c, 0xd0, 0x61, 0x3d, 0x2d, 0x7b, 0xcb, 0xbe, 0x87, 0x3a, 0x3a, 0x3e,
- 0x1b, 0xfb, 0xf2, 0x3e, 0x87, 0xd2, 0x46, 0x3e, 0x36, 0xfa, 0xc1, 0x3e,
- 0x38, 0x3b, 0x33, 0x3e, 0x05, 0x1d, 0x20, 0xbd, 0xa0, 0x5d, 0x40, 0x3f,
- 0xfb, 0x4f, 0xde, 0x3d, 0xc8, 0xab, 0x11, 0xbf, 0x2b, 0x67, 0x4b, 0x3d,
- 0xa8, 0xe2, 0x59, 0x3f, 0xeb, 0xce, 0xbc, 0xbc, 0x9a, 0xbf, 0x1a, 0x3e,
- 0xd4, 0x53, 0x9b, 0x3e, 0x77, 0xa8, 0xae, 0xbe, 0xb9, 0xc9, 0x82, 0xbe,
- 0x0b, 0xc6, 0x0a, 0xbf, 0xb7, 0x03, 0xbb, 0x3d, 0xf8, 0x5c, 0x89, 0xbd,
- 0x02, 0x52, 0x2a, 0xbe, 0x99, 0x37, 0xfd, 0xbe, 0xa8, 0x22, 0x84, 0xbe,
- 0xe6, 0x7c, 0x00, 0x3f, 0xdc, 0xfe, 0x46, 0xbe, 0x21, 0x0c, 0x30, 0x3d,
- 0x06, 0xaf, 0xb5, 0x3e, 0xa0, 0xb5, 0xb4, 0x3e, 0x8c, 0x52, 0x8d, 0x3e,
- 0x62, 0x58, 0xe7, 0x3e, 0xd1, 0x72, 0x52, 0xbd, 0xe1, 0x91, 0x76, 0xbe,
- 0x5a, 0x55, 0xe0, 0x3d, 0x37, 0xf4, 0xfc, 0xbe, 0xd0, 0x90, 0xfa, 0xbe,
- 0x9b, 0x73, 0x08, 0x3f, 0x3a, 0x33, 0x40, 0x3d, 0x9f, 0x02, 0x0e, 0xbe,
- 0xc5, 0x67, 0x18, 0x3e, 0x25, 0x64, 0x1c, 0xbf, 0xb2, 0x18, 0x5a, 0x3e,
- 0x57, 0x1a, 0xcb, 0xbd, 0xfb, 0x59, 0x8a, 0x3f, 0x22, 0x18, 0xf5, 0x3d,
- 0xee, 0xed, 0xfd, 0xbd, 0xd1, 0xd5, 0x5f, 0xbe, 0xcb, 0x7c, 0x75, 0x3c,
- 0x8d, 0x20, 0x36, 0xbf, 0x6f, 0x6f, 0x8b, 0x3d, 0x5b, 0xe7, 0x05, 0xbe,
- 0x60, 0xfd, 0x00, 0x3e, 0x1a, 0x79, 0x9b, 0xbd, 0x93, 0x74, 0x5f, 0x3f,
- 0xfb, 0x96, 0x18, 0xbf, 0x92, 0x94, 0xd1, 0x3e, 0x91, 0xd2, 0x0e, 0xbe,
- 0xa0, 0xe3, 0x86, 0x3b, 0xcd, 0x18, 0xd8, 0x3d, 0x29, 0x9f, 0x20, 0xbc,
- 0xb6, 0x17, 0x23, 0x3d, 0xd0, 0xe3, 0xf7, 0x3e, 0x0a, 0xb5, 0x02, 0xbe,
- 0xbf, 0x7c, 0x1e, 0xbe, 0x77, 0x05, 0xbf, 0x3f, 0x04, 0x01, 0xbf, 0x3e,
- 0x1f, 0x92, 0x1d, 0x3f, 0xbc, 0x72, 0xaa, 0xbe, 0x99, 0x3c, 0x41, 0xbe,
- 0x98, 0x04, 0xdd, 0xbe, 0xc6, 0xa9, 0xb2, 0xbe, 0x2a, 0x57, 0x93, 0x3e,
- 0xf2, 0x12, 0x10, 0xbe, 0x8a, 0xe5, 0x1b, 0xbf, 0x2c, 0x30, 0xfc, 0x3e,
- 0x33, 0xc2, 0xfe, 0xbd, 0xc6, 0xcf, 0x10, 0x3e, 0x47, 0xfa, 0x23, 0x3f,
- 0x69, 0xef, 0x10, 0x3f, 0x0a, 0x15, 0x82, 0x3f, 0xa5, 0x5f, 0x97, 0xbe,
- 0x4b, 0x9f, 0x97, 0xbe, 0xcd, 0xba, 0xb5, 0xbc, 0x55, 0x5b, 0x93, 0x3e,
- 0xce, 0x89, 0x06, 0xbe, 0x8d, 0xb2, 0xbf, 0x3d, 0xb0, 0x7e, 0x6e, 0xbf,
- 0x39, 0xd4, 0x2d, 0xbe, 0x4c, 0x3b, 0x1e, 0x3e, 0xee, 0x00, 0x36, 0x3d,
- 0x18, 0x7b, 0xd4, 0x3d, 0xae, 0x0f, 0x97, 0xbe, 0x16, 0xab, 0xa4, 0xbe,
- 0x68, 0x71, 0x53, 0xbe, 0x6a, 0xc6, 0x18, 0x3f, 0x4d, 0x6d, 0xc2, 0x3e,
- 0x92, 0x12, 0x1b, 0xbe, 0x48, 0xfb, 0x2a, 0xbd, 0xc5, 0xc6, 0xd6, 0x3d,
- 0xc7, 0xfd, 0x22, 0x3e, 0x69, 0x70, 0x06, 0xbe, 0x35, 0x26, 0x9f, 0xbd,
- 0x4c, 0x67, 0x29, 0x3d, 0x79, 0x2f, 0xab, 0xbd, 0x4e, 0xe5, 0xb6, 0x3d,
- 0x07, 0xb1, 0xca, 0xbd, 0x0c, 0x9a, 0x81, 0x3d, 0x81, 0xd2, 0xa0, 0xbe,
- 0x1b, 0x3c, 0x63, 0x3d, 0x15, 0x98, 0xb2, 0xbb, 0xc3, 0x22, 0x3b, 0xbe,
- 0x25, 0x50, 0x86, 0x3e, 0x82, 0x4a, 0xdb, 0xbc, 0x2b, 0xe5, 0x26, 0x3e,
- 0xc9, 0x89, 0x99, 0xbd, 0x77, 0xd1, 0x61, 0x3e, 0xbd, 0xfc, 0x27, 0x3e,
- 0x72, 0x87, 0x3a, 0x3e, 0x61, 0x38, 0xdc, 0xbe, 0xa3, 0x1b, 0x22, 0xbe,
- 0x57, 0xc8, 0x24, 0xbe, 0x36, 0x4e, 0x96, 0x3d, 0x6d, 0xd3, 0x9a, 0x3d,
- 0xf4, 0x61, 0xd5, 0x3c, 0x5e, 0x98, 0x34, 0xb9, 0x50, 0xc0, 0x6f, 0x3a,
- 0xb2, 0x6a, 0x93, 0xbb, 0xab, 0x71, 0x5f, 0x3d, 0xe7, 0xfd, 0x37, 0xbe,
- 0x72, 0xfd, 0x04, 0xbe, 0x5b, 0xb0, 0x65, 0xbd, 0xed, 0x10, 0xac, 0xbc,
- 0xef, 0x80, 0xda, 0x3d, 0x81, 0x0f, 0xa5, 0xbe, 0xd8, 0xfb, 0x1e, 0x3e,
- 0x2f, 0xad, 0x90, 0x3e, 0x2f, 0x60, 0xd9, 0xbd, 0x59, 0x22, 0x2c, 0x3d,
- 0xa4, 0x29, 0x8d, 0xbe, 0x5c, 0xea, 0x4b, 0x3e, 0xec, 0xd2, 0xd7, 0x3d,
- 0x43, 0xcd, 0x93, 0xba, 0xbd, 0x72, 0x11, 0x3e, 0x2f, 0xfb, 0x8d, 0xbe,
- 0xee, 0x4c, 0x12, 0x3e, 0x57, 0xe6, 0x95, 0x3d, 0x63, 0xd7, 0x87, 0x3d,
- 0x6a, 0x92, 0x8b, 0xbe, 0xa9, 0xe0, 0xe8, 0xbe, 0x93, 0xb9, 0xb7, 0xbd,
- 0xf6, 0x6a, 0x06, 0xbe, 0x0c, 0xa2, 0x93, 0x3e, 0x80, 0x5b, 0x93, 0xbd,
- 0x9e, 0xc6, 0xb5, 0x3d, 0x05, 0xad, 0x88, 0x3d, 0x1b, 0xec, 0x4a, 0x3d,
- 0x9e, 0xf2, 0x4b, 0xbe, 0x52, 0xc2, 0x01, 0xbe, 0xd9, 0x4b, 0x7e, 0x3d,
- 0xcf, 0x31, 0xe5, 0x3d, 0xd6, 0x92, 0xc6, 0xbe, 0xd5, 0xdf, 0x57, 0xbe,
- 0x49, 0xd3, 0xb8, 0xbd, 0xc7, 0xe4, 0x98, 0x3d, 0x7d, 0xc4, 0x5b, 0x3d,
- 0xe2, 0xdf, 0xc8, 0x3d, 0xc1, 0xc1, 0x94, 0x3c, 0x60, 0x7c, 0x6c, 0xbd,
- 0x1f, 0x5d, 0xf9, 0xbc, 0x91, 0xde, 0x5b, 0xbe, 0xec, 0x07, 0x8c, 0x3d,
- 0xf7, 0x12, 0x6a, 0xbd, 0xfb, 0xa0, 0xb9, 0xbe, 0xf2, 0xaf, 0x1a, 0x3e,
- 0xcb, 0x11, 0xeb, 0xbd, 0x13, 0x57, 0xaf, 0x3d, 0xad, 0x07, 0x8c, 0x3d,
- 0xb8, 0x05, 0x3b, 0x3d, 0x81, 0x27, 0xc8, 0xbd, 0x42, 0x12, 0xe4, 0x3b,
- 0x79, 0xc1, 0x96, 0xbd, 0x34, 0xc2, 0x64, 0x3e, 0x65, 0x17, 0x82, 0xbd,
- 0x1b, 0x24, 0xf8, 0x3d, 0x73, 0x8c, 0x5a, 0xbe, 0x52, 0x2a, 0x08, 0xbe,
- 0x9e, 0x98, 0xcc, 0x3d, 0x0e, 0xc5, 0x99, 0xbd, 0x63, 0x9e, 0x4a, 0x3e,
- 0xad, 0x5b, 0xb0, 0x3e, 0x3f, 0x54, 0x25, 0xbe, 0x19, 0x8d, 0x0f, 0x3e,
- 0x24, 0x01, 0x21, 0xbe, 0x28, 0x42, 0x30, 0x3e, 0x9e, 0x63, 0x88, 0x3e,
- 0x31, 0xa7, 0xdd, 0xbd, 0x8c, 0x75, 0xfd, 0x3d, 0xe2, 0x4f, 0x88, 0xbd,
- 0x01, 0x94, 0x97, 0xbd, 0x9f, 0x99, 0x64, 0xbe, 0x7f, 0xe6, 0x83, 0x3e,
- 0x84, 0x00, 0x54, 0xbe, 0x0e, 0x88, 0xd8, 0xbd, 0xe5, 0xc5, 0x63, 0xbd,
- 0x75, 0x6f, 0x5a, 0xbd, 0x2f, 0x3b, 0x6a, 0xbd, 0xda, 0xdf, 0x0a, 0xbe,
- 0x9f, 0x0c, 0xd0, 0x3d, 0x60, 0xcb, 0xd1, 0xbe, 0x1e, 0x1e, 0x82, 0xbe,
- 0x42, 0x1b, 0x7f, 0xbd, 0xa1, 0x09, 0x04, 0x3e, 0xee, 0x15, 0x30, 0x3e,
- 0xe9, 0x95, 0xc0, 0xbe, 0xb8, 0x9c, 0xa1, 0x3f, 0x2c, 0x02, 0xed, 0x3d,
- 0xc2, 0x24, 0x4d, 0x3f, 0x14, 0x06, 0xd6, 0xbc, 0x62, 0x0b, 0x36, 0x3f,
- 0xf9, 0xb3, 0x99, 0x3d, 0x28, 0x2f, 0xb3, 0x3e, 0x57, 0xef, 0xbe, 0xbe,
- 0x2a, 0x22, 0x4f, 0xbf, 0x90, 0x1d, 0x9f, 0x3e, 0x75, 0x8b, 0x8d, 0xbe,
- 0x16, 0x69, 0xe1, 0x3d, 0x40, 0xb4, 0x93, 0x3e, 0x51, 0x72, 0xe1, 0xbe,
- 0xd3, 0x0c, 0xa6, 0xbe, 0x95, 0xc0, 0xb3, 0x3e, 0xfc, 0xd9, 0x43, 0xbf,
- 0x85, 0x90, 0xe1, 0xbe, 0x53, 0x8e, 0x32, 0x3e, 0xc8, 0x6e, 0xee, 0x3e,
- 0x36, 0xfa, 0xd5, 0x3e, 0x8d, 0x17, 0xac, 0xbe, 0x8f, 0x3f, 0xde, 0xbe,
- 0x2d, 0x18, 0xcc, 0xbe, 0x8b, 0x44, 0x57, 0x3e, 0xe6, 0x81, 0xbc, 0xbe,
- 0x2f, 0xb3, 0x80, 0xbf, 0x1e, 0xcf, 0x1e, 0xbe, 0x5d, 0xea, 0x66, 0xbe,
- 0x66, 0xd4, 0x0d, 0x3f, 0xca, 0xcc, 0x57, 0xbf, 0xc6, 0x57, 0x81, 0x3d,
- 0xf4, 0xca, 0x2e, 0x3f, 0x2c, 0x72, 0x4b, 0x3e, 0x80, 0x9f, 0x7e, 0xbe,
- 0xc3, 0x7d, 0xce, 0x3d, 0xd1, 0x1e, 0xd3, 0xbd, 0x7a, 0x37, 0x34, 0xbc,
- 0x9b, 0xc2, 0x1e, 0xbf, 0x75, 0xe2, 0x88, 0xbd, 0xd4, 0x0e, 0xcf, 0x3d,
- 0x43, 0xd1, 0xd6, 0xbe, 0xa7, 0x9e, 0x98, 0xbd, 0x01, 0x6a, 0x97, 0x3f,
- 0xa0, 0xaa, 0xaa, 0xbb, 0x6f, 0xc2, 0xba, 0x3c, 0x03, 0x4e, 0xb0, 0xbe,
- 0x58, 0x5b, 0x48, 0x3e, 0xc8, 0xd3, 0x0b, 0xbd, 0xbf, 0xad, 0x04, 0x3f,
- 0x23, 0xf1, 0x9c, 0xbe, 0x0b, 0x1b, 0x4c, 0x3f, 0x62, 0x05, 0x0e, 0x3d,
- 0x05, 0x20, 0x68, 0xbd, 0x84, 0xe7, 0x90, 0xbe, 0x84, 0xae, 0xe6, 0x3e,
- 0xf4, 0x31, 0x9c, 0x3e, 0xff, 0x0f, 0x00, 0xbf, 0x49, 0x41, 0x15, 0x3f,
- 0x08, 0x5a, 0xc8, 0x3e, 0xc3, 0x73, 0xb3, 0x3e, 0xc3, 0x33, 0x69, 0x3e,
- 0x7d, 0x1b, 0x11, 0xbf, 0xc2, 0xc1, 0x22, 0x3d, 0xe5, 0xb3, 0x0c, 0xbe,
- 0xd6, 0x64, 0x6b, 0xbe, 0x75, 0xfa, 0x18, 0x3f, 0xa3, 0x5f, 0xd2, 0xbe,
- 0xa6, 0xd4, 0x23, 0x3e, 0x07, 0xa6, 0x22, 0xbe, 0xde, 0x37, 0x9e, 0x3c,
- 0xbf, 0x68, 0xd6, 0xbe, 0xd4, 0x99, 0x4b, 0xbe, 0x3c, 0xe1, 0x25, 0xbf,
- 0x55, 0x31, 0x83, 0x3d, 0x31, 0xfc, 0x9c, 0x3a, 0x79, 0x98, 0x70, 0xbf,
- 0x85, 0x1b, 0x10, 0xbf, 0xa0, 0xa4, 0x8e, 0x3b, 0xc6, 0x32, 0xc8, 0x3d,
- 0x0b, 0xf8, 0xc6, 0x3c, 0x09, 0x85, 0xbb, 0x3e, 0xd6, 0xff, 0xd1, 0xbe,
- 0xa5, 0x12, 0x53, 0xbd, 0xbf, 0x89, 0x21, 0x3f, 0x62, 0x28, 0x76, 0x3e,
- 0xc8, 0x85, 0x57, 0x3a, 0x3a, 0x42, 0x19, 0xbe, 0x1f, 0xd4, 0xa8, 0xbd,
- 0xbd, 0xd1, 0x9f, 0x3e, 0x3b, 0xd9, 0x56, 0xbe, 0xe5, 0x43, 0x88, 0x3d,
- 0xca, 0x63, 0xa6, 0x3e, 0x98, 0x0b, 0xbe, 0x3e, 0xff, 0x02, 0x8b, 0xbb,
- 0x5f, 0x54, 0x45, 0x3e, 0xfc, 0xba, 0x91, 0xbe, 0x07, 0xe6, 0x64, 0x3f,
- 0xb6, 0xfa, 0x0b, 0xbf, 0x64, 0x40, 0xb7, 0xbe, 0x5f, 0xd9, 0x8d, 0x3d,
- 0x0b, 0xe1, 0xc6, 0x3e, 0xbc, 0xa0, 0x01, 0xbe, 0xea, 0x6e, 0xb1, 0xbd,
- 0x52, 0x69, 0x27, 0xbe, 0x8c, 0x42, 0xdd, 0x3e, 0x93, 0xc2, 0xf9, 0x3e,
- 0x90, 0x1c, 0x9c, 0x3d, 0xe1, 0x96, 0x89, 0xbb, 0x6d, 0xb2, 0xe4, 0x3d,
- 0x23, 0xaa, 0x1a, 0x3f, 0x39, 0xea, 0x63, 0xbd, 0xfe, 0x70, 0x49, 0xbe,
- 0x02, 0x7b, 0x58, 0xbe, 0x0d, 0xf6, 0x66, 0x3e, 0x75, 0x05, 0x07, 0xbe,
- 0x4a, 0xb0, 0x55, 0x3e, 0x18, 0xc6, 0x67, 0x3d, 0x5d, 0x21, 0x07, 0xbd,
- 0xe4, 0xe4, 0xcf, 0xbe, 0x10, 0xf2, 0xb0, 0x3d, 0x36, 0xdb, 0x3f, 0xbe,
- 0x1d, 0x37, 0xf4, 0x3e, 0xc5, 0xa8, 0x86, 0x3e, 0xa3, 0xca, 0xd9, 0x3d,
- 0xd8, 0x3a, 0x6b, 0xbd, 0x92, 0xac, 0xa9, 0xbe, 0xc1, 0x70, 0x6d, 0xbe,
- 0x60, 0xcb, 0x99, 0xbd, 0xfc, 0x34, 0x43, 0x3d, 0xe5, 0x70, 0x9b, 0x3e,
- 0xb4, 0xba, 0xdc, 0xbe, 0x08, 0xba, 0x09, 0x3f, 0xd2, 0x00, 0x78, 0x3e,
- 0x17, 0x6d, 0x07, 0xbd, 0x1b, 0xfd, 0xd2, 0xbc, 0xce, 0xa5, 0x7e, 0xbe,
- 0x97, 0xee, 0x3f, 0xbe, 0xbc, 0x7d, 0x66, 0xbe, 0x45, 0x73, 0x39, 0xbe,
- 0x29, 0xfd, 0x0c, 0xbe, 0xad, 0xa9, 0x7a, 0xbe, 0x9d, 0xdf, 0x02, 0x3d,
- 0x58, 0x69, 0x28, 0xbd, 0xa4, 0x03, 0x94, 0xbd, 0xfd, 0xe8, 0xc0, 0x3d,
- 0xb1, 0x5b, 0x39, 0xbe, 0x20, 0x93, 0xda, 0x3a, 0x4a, 0xa6, 0x23, 0xbe,
- 0x82, 0x5c, 0x6e, 0x3d, 0x08, 0x42, 0x1b, 0x3e, 0xdc, 0xb3, 0xed, 0x3e,
- 0x88, 0x38, 0x1e, 0xbf, 0x89, 0x4c, 0x27, 0xbe, 0x24, 0x91, 0xe5, 0xbe,
- 0x32, 0xd1, 0x56, 0x3c, 0xfc, 0x06, 0xec, 0xbe, 0xd7, 0x45, 0x22, 0x3d,
- 0x27, 0x71, 0x25, 0xbf, 0x53, 0x45, 0x33, 0xbe, 0xf9, 0x74, 0xb6, 0x3d,
- 0x85, 0x88, 0x8d, 0x3a, 0xa1, 0xa4, 0x92, 0x3d, 0xfd, 0xea, 0x15, 0x3e,
- 0x52, 0x6a, 0x71, 0x3e, 0x6e, 0xe0, 0xbd, 0xbe, 0xb3, 0x42, 0xb0, 0xbe,
- 0x83, 0xe1, 0x16, 0x3e, 0x0d, 0xc7, 0x82, 0x3d, 0xe4, 0x85, 0x38, 0xbe,
- 0xc2, 0x7e, 0xd9, 0xbd, 0xbe, 0x6b, 0x6e, 0xbe, 0x65, 0xc8, 0x1c, 0xbe,
- 0xac, 0xcc, 0xc6, 0xbd, 0xf1, 0x2b, 0x1b, 0x3c, 0xac, 0x9a, 0xbd, 0xbd,
- 0xf9, 0x94, 0x81, 0xbe, 0xbb, 0xc6, 0x5d, 0x3e, 0x59, 0x4d, 0x59, 0x3e,
- 0x7f, 0xb0, 0x84, 0x3c, 0xe9, 0xf0, 0xa8, 0x3d, 0x83, 0x07, 0x9b, 0x3d,
- 0x72, 0x3a, 0x96, 0xbc, 0x0f, 0xc0, 0x31, 0xbd, 0xea, 0x8f, 0x2f, 0x3e,
- 0x5e, 0x8e, 0x8e, 0xbe, 0x5a, 0x04, 0x8f, 0x3c, 0xbe, 0x5a, 0x8e, 0xbe,
- 0xfc, 0x91, 0x34, 0xbd, 0xbf, 0xe2, 0x03, 0x3d, 0x32, 0xc9, 0xb5, 0x3d,
- 0x34, 0xbc, 0x9b, 0x3d, 0xc2, 0x4b, 0xa7, 0x3d, 0x22, 0xe7, 0x99, 0xbe,
- 0x99, 0xac, 0x15, 0xbe, 0x83, 0xe0, 0xdd, 0x3d, 0xf4, 0x9a, 0x8d, 0x3d,
- 0x44, 0x3e, 0xb2, 0x3d, 0x04, 0x09, 0x44, 0xbe, 0xb2, 0x4d, 0xb5, 0x3e,
- 0x2d, 0x30, 0xc9, 0xbd, 0xbd, 0x5e, 0x04, 0x3e, 0x18, 0x79, 0x79, 0x3e,
- 0x8b, 0xe4, 0x27, 0x3d, 0xdb, 0xe3, 0xba, 0xbd, 0xd6, 0x76, 0x0e, 0x3f,
- 0x0f, 0xf6, 0x11, 0x3e, 0xf8, 0x77, 0x10, 0x3e, 0xa6, 0x3b, 0x25, 0xbe,
- 0xcd, 0x83, 0x67, 0xbe, 0xd1, 0x04, 0xc3, 0xbd, 0xe6, 0x48, 0x51, 0x3e,
- 0x19, 0xe7, 0x3f, 0xbe, 0xd8, 0x0e, 0x56, 0xbe, 0x63, 0x2f, 0x9e, 0xbe,
- 0x6f, 0x2b, 0xa3, 0xbe, 0x3c, 0x37, 0x5c, 0x3d, 0x26, 0xde, 0xa1, 0x3d,
- 0x3a, 0x0d, 0x4f, 0x3e, 0x18, 0x82, 0xe7, 0xbd, 0x59, 0xe5, 0x09, 0xbe,
- 0xfa, 0x30, 0x7f, 0xbd, 0xa8, 0xd3, 0xd5, 0x3e, 0xc4, 0xdc, 0x6d, 0x3e,
- 0x8c, 0x3e, 0xcb, 0xbe, 0x36, 0x68, 0xc6, 0xbd, 0x2a, 0xf7, 0x2f, 0xbe,
- 0x2c, 0x51, 0xa4, 0xbe, 0xca, 0x4c, 0x9c, 0xbe, 0xd2, 0x61, 0xb6, 0xbe,
- 0x73, 0xf3, 0x2d, 0xbe, 0xab, 0x17, 0xe7, 0x3e, 0xcb, 0xa1, 0x49, 0xbe,
- 0x40, 0x65, 0xc1, 0x3e, 0xc3, 0xca, 0x7a, 0x3e, 0xaf, 0x8e, 0x16, 0x3d,
- 0x6c, 0xad, 0x1a, 0xbe, 0xf2, 0x71, 0x12, 0xbe, 0x6e, 0x1e, 0x47, 0x3d,
- 0xa1, 0xf3, 0x54, 0xbd, 0xda, 0x78, 0x73, 0xbe, 0xbc, 0x3e, 0x07, 0x3d,
- 0x77, 0x1a, 0x8d, 0xbd, 0x16, 0x91, 0x0d, 0xbd, 0x55, 0x45, 0x84, 0xbe,
- 0xf5, 0xd1, 0x25, 0xbe, 0x05, 0xe1, 0x80, 0xbe, 0x56, 0xd0, 0x36, 0xbd,
- 0x1c, 0x31, 0xf1, 0xbd, 0xd3, 0x95, 0xfc, 0xbc, 0x6f, 0x41, 0x00, 0x3f,
- 0xb4, 0x04, 0x20, 0xbf, 0xc1, 0x9f, 0xe1, 0x3e, 0xfb, 0x81, 0xf7, 0x3d,
- 0x12, 0xd0, 0x6b, 0xbe, 0x2b, 0xae, 0x39, 0x3e, 0xa5, 0xbc, 0x13, 0x3d,
- 0xba, 0xd3, 0x56, 0xbe, 0x09, 0xa2, 0x28, 0x3e, 0xab, 0xdd, 0x4f, 0x3e,
- 0xcc, 0x8c, 0x0d, 0x3e, 0x68, 0xb4, 0x0e, 0xbe, 0x47, 0x8a, 0x42, 0x3e,
- 0x6e, 0x10, 0x04, 0x3e, 0xfe, 0x4b, 0x01, 0x3f, 0x65, 0x1e, 0x8a, 0x3d,
- 0xe6, 0x9c, 0xf7, 0x3d, 0x73, 0xd1, 0x89, 0x3e, 0xf6, 0xbd, 0xfe, 0xbe,
- 0x4c, 0xbc, 0x2b, 0xbe, 0xf7, 0x73, 0xbd, 0xbe, 0xc5, 0x51, 0x88, 0x3d,
- 0x69, 0xda, 0xdc, 0x3d, 0xb6, 0x3c, 0x81, 0xbe, 0x28, 0xb9, 0xc2, 0xbc,
- 0x27, 0xd8, 0xda, 0xbe, 0xba, 0x6d, 0x6f, 0x3e, 0x53, 0x08, 0xa9, 0x3e,
- 0x21, 0x6c, 0xb7, 0xbd, 0xcf, 0xc4, 0xf8, 0xbd, 0x0a, 0x73, 0x51, 0x3d,
- 0x7a, 0x0a, 0xf8, 0xbd, 0xd5, 0x85, 0x75, 0xbe, 0xb9, 0x75, 0x0c, 0xbe,
- 0x3e, 0xb9, 0x36, 0xbe, 0x3b, 0xbe, 0x8f, 0x3e, 0xbb, 0xd6, 0xa8, 0x3d,
- 0x45, 0x72, 0xcf, 0x3c, 0x5d, 0x3c, 0x21, 0xbf, 0xde, 0x92, 0x7a, 0xbd,
- 0xce, 0x63, 0x07, 0xbd, 0xdc, 0x47, 0xda, 0x3d, 0x60, 0xd8, 0xd2, 0xbe,
- 0x9a, 0xbf, 0xa4, 0xbe, 0x18, 0xf3, 0x9a, 0x3e, 0x2d, 0x81, 0x08, 0x3e,
- 0x3e, 0xe8, 0x31, 0x3e, 0xaf, 0xe9, 0xbc, 0x3d, 0x7a, 0xe3, 0xca, 0x3c,
- 0x29, 0xc4, 0x41, 0xbe, 0x75, 0x3e, 0xa1, 0xbd, 0xaf, 0x24, 0x1c, 0x3e,
- 0xd6, 0x7b, 0x4b, 0xbe, 0x3d, 0x4b, 0x61, 0xbd, 0xcd, 0x1b, 0xcb, 0xbe,
- 0x14, 0xef, 0x5f, 0x3e, 0x54, 0x51, 0xa4, 0x3d, 0x67, 0xde, 0x7a, 0xbe,
- 0xc4, 0x96, 0xa3, 0xbd, 0x38, 0xbc, 0x4e, 0x3e, 0xb0, 0x03, 0xa7, 0x3e,
- 0x39, 0x3b, 0x2c, 0xbe, 0x29, 0x75, 0x9c, 0xbb, 0x0c, 0xf0, 0xba, 0xbd,
- 0x5b, 0xb4, 0xb4, 0xbd, 0xf4, 0x1a, 0x80, 0xbb, 0xed, 0xc4, 0x0b, 0x3e,
- 0x86, 0xa8, 0xb3, 0xbd, 0xc0, 0xf5, 0xa8, 0x3e, 0x12, 0x9d, 0xc6, 0x3e,
- 0x01, 0x34, 0x29, 0xbf, 0x1f, 0xcb, 0xca, 0x3e, 0xf4, 0x8e, 0x4e, 0x3e,
- 0xfb, 0xcb, 0x17, 0x3e, 0xb4, 0x6e, 0xd3, 0xbe, 0x33, 0x27, 0x81, 0xbe,
- 0x1e, 0xb8, 0xbe, 0x3d, 0x62, 0x47, 0x2c, 0x3d, 0x14, 0xfa, 0x86, 0x3e,
- 0x07, 0xb3, 0x73, 0xbe, 0x6c, 0x67, 0x2a, 0xbd, 0x34, 0x72, 0xc4, 0x3d,
- 0xff, 0x57, 0xea, 0xbd, 0x4e, 0x13, 0xbf, 0x3e, 0xd8, 0x65, 0x02, 0xbf,
- 0x7d, 0xcc, 0x64, 0x3a, 0xa8, 0xc7, 0x3f, 0xbd, 0xf9, 0xf0, 0x31, 0x3e,
- 0x3c, 0x0c, 0x9b, 0x3c, 0x27, 0x76, 0x47, 0x3e, 0xf8, 0x31, 0x3f, 0xbe,
- 0xb0, 0xd9, 0x80, 0xbc, 0xac, 0x24, 0x8b, 0x3b, 0x5a, 0xeb, 0xa3, 0x3c,
- 0xa8, 0x8b, 0x37, 0xbd, 0xe9, 0x57, 0xfc, 0xbd, 0x56, 0x67, 0xf3, 0xbd,
- 0xc5, 0xe3, 0xdc, 0xbd, 0x21, 0xcf, 0xf0, 0xbe, 0x1a, 0xd1, 0x18, 0xbe,
- 0x84, 0x7c, 0xf2, 0x3d, 0x3d, 0x04, 0x97, 0xbe, 0xb6, 0xe8, 0x63, 0xbe,
- 0x3f, 0x7e, 0x54, 0xbe, 0xb5, 0xcf, 0xb6, 0x3d, 0xb4, 0x20, 0x4f, 0x3f,
- 0x92, 0x16, 0x0a, 0x3e, 0xdb, 0x55, 0x3f, 0xbe, 0x96, 0x95, 0xb1, 0xbe,
- 0xbc, 0xcf, 0xba, 0xbe, 0x2f, 0x6e, 0x03, 0x3f, 0x1f, 0xe0, 0x2d, 0xbe,
- 0xb7, 0x9a, 0x00, 0xbe, 0xc5, 0x5c, 0xbb, 0xbe, 0x09, 0xec, 0x60, 0xbe,
- 0x40, 0x6f, 0x34, 0xbe, 0xf8, 0xc6, 0x74, 0x3f, 0x80, 0x57, 0x46, 0xbe,
- 0x83, 0xb4, 0x38, 0xbd, 0xc6, 0xa8, 0x0a, 0x3e, 0xa5, 0x54, 0xf1, 0x3e,
- 0x08, 0x80, 0x66, 0xbd, 0x72, 0xaa, 0x8e, 0xbf, 0x83, 0xf3, 0x8f, 0x3e,
- 0x36, 0x58, 0x5c, 0xbe, 0xc5, 0x7e, 0x4e, 0xbe, 0x7c, 0xc9, 0x97, 0x3c,
- 0x31, 0x5e, 0x15, 0x3f, 0xa8, 0xec, 0x12, 0x3e, 0xf1, 0xe7, 0xa5, 0x3e,
- 0xa4, 0xce, 0x12, 0xbd, 0xce, 0xd7, 0x30, 0xbf, 0x46, 0xf9, 0xd6, 0xbd,
- 0xf7, 0x2f, 0x0f, 0x3f, 0xe2, 0xf5, 0x89, 0x3e, 0x50, 0x53, 0x24, 0xbf,
- 0xfa, 0x7a, 0x8b, 0x3e, 0x97, 0x9d, 0xec, 0x3d, 0x15, 0xba, 0xf3, 0x3c,
- 0x08, 0x66, 0x4d, 0xbf, 0xcd, 0xdc, 0x9e, 0xbe, 0x24, 0x66, 0xf2, 0xbc,
- 0x89, 0x83, 0x47, 0xbe, 0xde, 0x42, 0xb0, 0xbe, 0xd9, 0x0e, 0xf4, 0x3c,
- 0x1c, 0x89, 0x92, 0x3d, 0x5e, 0x78, 0x00, 0xbe, 0x04, 0xe1, 0x7f, 0xbd,
- 0x5f, 0x1b, 0x45, 0xbc, 0xa9, 0xf5, 0x96, 0xbf, 0xf8, 0xe3, 0x2a, 0x3f,
- 0xa9, 0x4f, 0x34, 0x3f, 0x4f, 0x00, 0xfa, 0xbe, 0xfa, 0x8c, 0xb2, 0xbe,
- 0x37, 0x50, 0x66, 0x3d, 0xfa, 0x11, 0x19, 0x3e, 0xea, 0xa8, 0x5a, 0xbe,
- 0x73, 0x1c, 0xb4, 0xbd, 0xf9, 0x56, 0x45, 0xbf, 0x80, 0x6a, 0x9f, 0x3f,
- 0x17, 0xeb, 0xb7, 0x3e, 0xed, 0x59, 0x3c, 0xbe, 0x9f, 0x68, 0x41, 0xbe,
- 0x9f, 0x5f, 0x9d, 0xbd, 0x25, 0x12, 0x3e, 0x3f, 0xc7, 0x91, 0xa5, 0xbd,
- 0x10, 0xc6, 0xc8, 0xbd, 0x02, 0xda, 0x02, 0xbe, 0x47, 0xda, 0xa5, 0x3e,
- 0xa2, 0x5a, 0x8b, 0xbf, 0x27, 0xe6, 0x7f, 0xbe, 0x8e, 0xaf, 0x19, 0x3e,
- 0x43, 0x08, 0x91, 0xbe, 0xd3, 0xdb, 0x1e, 0xbe, 0x9e, 0x45, 0xd6, 0xbd,
- 0x00, 0x7a, 0xed, 0xbe, 0xf2, 0xea, 0xb2, 0x3c, 0x30, 0x0f, 0xfc, 0xbe,
- 0x69, 0x8f, 0xc5, 0xbd, 0x3a, 0x1f, 0x52, 0x3e, 0x2e, 0x47, 0xe7, 0x3d,
- 0xb1, 0x9a, 0xc6, 0x3d, 0xce, 0x92, 0x5e, 0x3f, 0x27, 0xb3, 0x20, 0x3f,
- 0xe0, 0x05, 0x62, 0xbc, 0x14, 0x17, 0x2d, 0x3f, 0x50, 0xd9, 0x41, 0xbe,
- 0xa7, 0x95, 0x67, 0x3f, 0x98, 0x9b, 0xe5, 0x3e, 0xa4, 0x1f, 0x9d, 0xbf,
- 0x4d, 0x11, 0x8e, 0xbe, 0x50, 0x7d, 0x23, 0x3f, 0x7d, 0x79, 0x52, 0xbd,
- 0x6b, 0x57, 0x83, 0xbf, 0x1e, 0x8d, 0x01, 0xbe, 0x71, 0x6d, 0x95, 0x3c,
- 0x60, 0x4f, 0x0b, 0x3f, 0x3e, 0x91, 0xfe, 0xbd, 0x1f, 0x90, 0xad, 0x3e,
- 0xef, 0xa2, 0xd0, 0xbf, 0xc6, 0x2f, 0x24, 0x3f, 0xc7, 0x78, 0x9d, 0x3d,
- 0x4b, 0x18, 0xfe, 0xbe, 0xf0, 0x52, 0x6b, 0xbe, 0x90, 0xbf, 0x64, 0xbe,
- 0x5a, 0xb5, 0x09, 0x3d, 0x34, 0x4b, 0xf6, 0xbe, 0x02, 0xc0, 0xd7, 0x3d,
- 0x39, 0x70, 0xa8, 0xbe, 0xe2, 0xeb, 0xa2, 0xbd, 0x4e, 0x0d, 0x88, 0x3d,
- 0x61, 0x2a, 0xa8, 0x3e, 0xdb, 0x5a, 0x21, 0xbe, 0x4a, 0x28, 0x3d, 0xbe,
- 0xfa, 0xb8, 0x83, 0xbd, 0x5c, 0xff, 0x1e, 0x3f, 0x79, 0x4b, 0x9e, 0x3e,
- 0x7c, 0x90, 0x26, 0xbe, 0x1a, 0xe4, 0xa8, 0xbd, 0xf1, 0xcd, 0x5f, 0x3e,
- 0x3b, 0x43, 0x0e, 0x3d, 0x9f, 0x28, 0xbd, 0xbd, 0x4a, 0x08, 0x2d, 0xbe,
- 0xfc, 0xde, 0x28, 0x3e, 0x78, 0xbd, 0x4a, 0x3d, 0x55, 0xed, 0x83, 0xbc,
- 0x6c, 0x6f, 0x6e, 0x3d, 0xd0, 0x55, 0x57, 0x3e, 0xfe, 0x8f, 0x5f, 0xbe,
- 0x85, 0x09, 0x9b, 0x3e, 0x3d, 0x69, 0x17, 0xbe, 0x45, 0x7b, 0x88, 0xbe,
- 0x91, 0x40, 0xe1, 0x3d, 0xa5, 0xa9, 0xfe, 0x3d, 0x67, 0x15, 0x0a, 0x3e,
- 0x3d, 0xad, 0x35, 0xbc, 0x0a, 0x51, 0x32, 0x3e, 0x6a, 0xa2, 0x8b, 0x3e,
- 0x34, 0xb7, 0x0c, 0xbd, 0xaf, 0x78, 0xbf, 0xbe, 0x89, 0xdd, 0x32, 0xbe,
- 0x5b, 0x7b, 0xa4, 0xbc, 0xb9, 0x67, 0x4b, 0x3e, 0xd1, 0xbf, 0x25, 0x3e,
- 0xbf, 0xd8, 0x08, 0xbe, 0x3a, 0x96, 0x30, 0xbe, 0xe2, 0x4b, 0x48, 0x3e,
- 0xe2, 0x53, 0x4e, 0x3d, 0x3d, 0x11, 0xd8, 0xbd, 0x04, 0x86, 0x11, 0xbe,
- 0x17, 0x76, 0x0a, 0x3c, 0x26, 0x43, 0x4b, 0xbe, 0xea, 0x8b, 0xa9, 0x3e,
- 0x96, 0xbb, 0x8c, 0xbd, 0x18, 0x0b, 0x3a, 0xbe, 0x73, 0xc3, 0x5d, 0x3a,
- 0xcb, 0xe5, 0x73, 0x3e, 0x9d, 0x63, 0x26, 0xbe, 0x7f, 0x3b, 0x0d, 0xbe,
- 0x52, 0x3b, 0xdb, 0xbe, 0x42, 0x8e, 0x23, 0x3d, 0x51, 0x27, 0x41, 0x3d,
- 0x7b, 0x77, 0x02, 0xbe, 0x06, 0x61, 0xbb, 0x3d, 0x15, 0x23, 0x27, 0xbd,
- 0xbe, 0xa5, 0x2f, 0x3e, 0x7e, 0x22, 0x35, 0x3d, 0xff, 0x25, 0x67, 0x3e,
- 0x65, 0x0d, 0x8d, 0xbe, 0x76, 0x08, 0xa8, 0xbe, 0xf5, 0x76, 0xab, 0x3d,
- 0xf0, 0x1a, 0xad, 0xbd, 0x00, 0x9a, 0x80, 0x3e, 0xa1, 0xf7, 0xe3, 0x3d,
- 0xbb, 0x3d, 0x7b, 0x3d, 0x5c, 0x02, 0x66, 0xbe, 0xe1, 0xc8, 0xf7, 0xbd,
- 0xc8, 0xe0, 0x1c, 0xbb, 0xdd, 0x85, 0x3b, 0xbe, 0x6b, 0x2a, 0x86, 0x3e,
- 0xec, 0xc3, 0xd8, 0x3a, 0xc9, 0x7a, 0xbb, 0xbe, 0x59, 0x61, 0xcb, 0xbd,
- 0x0b, 0xee, 0x9b, 0xbd, 0xc1, 0x90, 0xac, 0xb9, 0x4b, 0x5d, 0x49, 0x3e,
- 0xea, 0xe3, 0xea, 0xbd, 0x12, 0x95, 0xaa, 0x3d, 0xf7, 0x2d, 0xe8, 0xbd,
- 0xe3, 0xab, 0xb4, 0xbd, 0x5b, 0xe4, 0xd8, 0xbd, 0x03, 0x79, 0xb4, 0xbd,
- 0xef, 0x48, 0x99, 0xbd, 0xd4, 0xa3, 0xc1, 0xbe, 0x19, 0xb4, 0xbb, 0x3d,
- 0xbc, 0x10, 0x41, 0xbe, 0xe6, 0xed, 0x20, 0x3d, 0xf7, 0xc5, 0xe2, 0xbb,
- 0x2d, 0xe2, 0x6a, 0x3d, 0xd2, 0x32, 0xa1, 0xbb, 0x82, 0x87, 0x93, 0xbe,
- 0xda, 0xc8, 0xd9, 0xbc, 0x40, 0x4c, 0x6e, 0x3e, 0x8d, 0xe5, 0xb0, 0xbd,
- 0x08, 0x6f, 0xbf, 0x3d, 0x1e, 0xee, 0x49, 0x3d, 0x5d, 0x1e, 0x56, 0xbe,
- 0x34, 0x3c, 0x5f, 0x3d, 0xaf, 0x64, 0x03, 0xbe, 0x1b, 0x60, 0x4f, 0x3e,
- 0x23, 0x28, 0xa4, 0x3e, 0xb2, 0x72, 0x09, 0xbd, 0xc9, 0xe3, 0x8c, 0x3e,
- 0x07, 0x38, 0x9e, 0xbe, 0xbc, 0x0a, 0x4e, 0x3e, 0x75, 0x0e, 0xff, 0x3c,
- 0xb9, 0xfc, 0x54, 0xbe, 0x6c, 0xb3, 0x26, 0x3c, 0x0f, 0x1d, 0xe0, 0xbd,
- 0x7d, 0xe7, 0x1f, 0xbe, 0xf4, 0xd5, 0x54, 0xbd, 0x83, 0xc4, 0x0d, 0x3d,
- 0xc7, 0x51, 0x4d, 0xbe, 0xc3, 0xcc, 0xc3, 0xbd, 0x71, 0xb5, 0x1e, 0xbe,
- 0xef, 0x85, 0x08, 0x3e, 0xb7, 0x08, 0xf0, 0xbd, 0x7b, 0x5d, 0x60, 0xbe,
- 0xe5, 0xae, 0x58, 0x3e, 0x25, 0x9d, 0xf6, 0xbe, 0xa2, 0x5f, 0x87, 0xbe,
- 0xce, 0xcd, 0xe7, 0xbc, 0x46, 0xfc, 0x26, 0xbd, 0x57, 0xf8, 0xa9, 0x3d,
- 0x6c, 0xcc, 0x0e, 0xbf, 0xae, 0x02, 0xad, 0x3f, 0x66, 0x8f, 0x3e, 0xbd,
- 0x88, 0xcc, 0x2f, 0x3f, 0x0d, 0xc1, 0xff, 0xbd, 0x50, 0x85, 0x4a, 0x3f,
- 0xa5, 0xa9, 0xc2, 0x3d, 0x2c, 0xc5, 0xd7, 0x3e, 0x09, 0xbf, 0xc9, 0xbe,
- 0xfe, 0x6a, 0x2c, 0xbf, 0x9c, 0xb5, 0xb5, 0x3e, 0x2a, 0x9a, 0x3a, 0xbe,
- 0x76, 0xf5, 0x1f, 0x3d, 0x38, 0x90, 0xa8, 0x3e, 0xb1, 0x68, 0xd1, 0xbe,
- 0x59, 0xb1, 0xa5, 0xbe, 0xa7, 0x16, 0xc5, 0x3e, 0xe6, 0xd5, 0x47, 0xbf,
- 0xd9, 0x17, 0xfb, 0xbe, 0x77, 0x99, 0x64, 0x3e, 0x20, 0x28, 0x0f, 0x3f,
- 0x66, 0xdd, 0xe3, 0x3e, 0x45, 0x67, 0xe2, 0xbe, 0x6e, 0xb2, 0xfb, 0xbe,
- 0x9b, 0xa9, 0xa3, 0xbe, 0xc3, 0x8a, 0x51, 0x3e, 0xdf, 0xae, 0xb7, 0xbe,
- 0x83, 0x20, 0x93, 0xbf, 0xab, 0xdf, 0x83, 0x3d, 0xd2, 0x91, 0xa8, 0xbe,
- 0x21, 0x2c, 0x3b, 0x3f, 0x3c, 0x83, 0x50, 0xbf, 0x62, 0xbd, 0x19, 0xbe,
- 0x0e, 0x96, 0xe3, 0x3e, 0x70, 0xab, 0xb5, 0x3d, 0x08, 0xa3, 0x9b, 0xbe,
- 0xa9, 0x11, 0x24, 0x3e, 0x26, 0xa6, 0x80, 0xbe, 0xb1, 0x5f, 0xfc, 0x3d,
- 0x8c, 0xf4, 0xf7, 0xbe, 0xb3, 0xde, 0x65, 0x3d, 0x6d, 0x07, 0x09, 0xbe,
- 0x13, 0x83, 0xad, 0xbe, 0x44, 0x07, 0x1a, 0xbe, 0x76, 0x75, 0x86, 0x3f,
- 0x41, 0x9c, 0x71, 0xbd, 0x18, 0x5a, 0x36, 0x3d, 0x1f, 0x20, 0x32, 0xbe,
- 0x89, 0x18, 0x7c, 0x3e, 0x64, 0x02, 0x49, 0xbd, 0xf3, 0x20, 0x96, 0x3e,
- 0xcd, 0x07, 0x9b, 0xbe, 0x67, 0xbd, 0x83, 0x3f, 0x97, 0xb1, 0x7a, 0x3c,
- 0xb6, 0xb0, 0xef, 0x3c, 0x4d, 0xd2, 0xf2, 0xbd, 0x65, 0x5b, 0x75, 0x3e,
- 0xb4, 0x79, 0x7e, 0x3e, 0x4a, 0x8c, 0x2c, 0xbf, 0x8d, 0x24, 0x20, 0x3f,
- 0xba, 0xae, 0xc6, 0x3e, 0xf9, 0x9c, 0xde, 0x3e, 0x8a, 0x72, 0xea, 0x3d,
- 0xf3, 0xa4, 0x04, 0xbf, 0x65, 0x82, 0xa7, 0xbd, 0xc6, 0x43, 0x24, 0xbe,
- 0xa0, 0xf6, 0x52, 0xbe, 0x3d, 0x88, 0x1d, 0x3f, 0x8d, 0x27, 0xa3, 0xbe,
- 0xfa, 0x6b, 0xd5, 0x3d, 0xe0, 0x81, 0x80, 0xbd, 0x25, 0x2c, 0x09, 0x3d,
- 0x9f, 0x02, 0xdd, 0xbe, 0x14, 0xd2, 0x33, 0xbe, 0xf8, 0x58, 0x05, 0xbf,
- 0x46, 0xf1, 0x6e, 0x3d, 0x70, 0xb5, 0xc1, 0xbc, 0x03, 0xfa, 0x3b, 0xbf,
- 0x83, 0x79, 0xd0, 0xbe, 0xcf, 0xfb, 0xbb, 0xbc, 0x22, 0x60, 0xb6, 0xbd,
- 0x41, 0x21, 0x87, 0x3d, 0xd8, 0xc3, 0x9b, 0x3e, 0x66, 0x2e, 0xad, 0xbe,
- 0x53, 0x30, 0xb5, 0xbc, 0x28, 0xe3, 0x14, 0x3f, 0x4d, 0xfa, 0x13, 0x3e,
- 0x1a, 0xdf, 0xab, 0xbd, 0x46, 0xbf, 0x6e, 0xbe, 0xb8, 0xb0, 0xb6, 0xbd,
- 0x76, 0xe2, 0xfe, 0x3e, 0xb5, 0xd1, 0x9d, 0xbe, 0x32, 0xdd, 0xdf, 0x3c,
- 0x9a, 0x75, 0x43, 0x3e, 0x95, 0xfb, 0x0a, 0x3e, 0x32, 0xfe, 0xaf, 0xbc,
- 0x2f, 0x10, 0xa1, 0x3e, 0xcc, 0x57, 0xc3, 0xbe, 0x8f, 0xbc, 0x48, 0x3f,
- 0xea, 0x7a, 0x05, 0xbf, 0xbe, 0x58, 0x0e, 0xbf, 0x27, 0x3b, 0xbc, 0xbb,
- 0xb7, 0x04, 0x91, 0x3e, 0x85, 0xec, 0x56, 0xbe, 0x33, 0xf9, 0x00, 0xbe,
- 0x6e, 0xd5, 0x71, 0xbe, 0xd2, 0x28, 0xf0, 0x3e, 0x3a, 0x54, 0x03, 0x3f,
- 0xb0, 0x3e, 0x88, 0x3d, 0x6b, 0x9b, 0x28, 0x3d, 0xb1, 0xb4, 0xa3, 0x3c,
- 0xb7, 0x50, 0x28, 0x3f, 0x53, 0x22, 0x9c, 0xbd, 0xd5, 0x01, 0x99, 0xbe,
- 0xf9, 0xff, 0x58, 0xbd, 0x59, 0xb2, 0x63, 0x3e, 0x17, 0x44, 0xaa, 0xbe,
- 0xf7, 0xe4, 0xc6, 0x3e, 0xbd, 0x97, 0xdb, 0x3b, 0x83, 0x72, 0x36, 0xbe,
- 0x17, 0x6d, 0xa1, 0xbe, 0xc4, 0x97, 0x8f, 0x3d, 0x1e, 0xd7, 0x80, 0xbe,
- 0x73, 0x50, 0xf0, 0x3e, 0x03, 0xf8, 0x6b, 0x3e, 0xca, 0x35, 0xc2, 0x3e,
- 0xdb, 0xc1, 0x5c, 0x3d, 0xa5, 0x3a, 0x95, 0xbd, 0x82, 0x67, 0x03, 0xbe,
- 0x68, 0xf6, 0x8d, 0xbd, 0x71, 0x3d, 0x2c, 0x3e, 0xb2, 0x4b, 0x86, 0x3e,
- 0x84, 0xfb, 0x77, 0x3d, 0x58, 0x17, 0xbe, 0x3e, 0xc4, 0x24, 0xb3, 0x3d,
- 0xa1, 0xda, 0x63, 0xbd, 0x4d, 0x44, 0xee, 0x3c, 0x92, 0x0b, 0x83, 0xbe,
- 0x40, 0x0f, 0x18, 0x3e, 0x44, 0x10, 0xc9, 0xbd, 0xf0, 0xb8, 0x92, 0xbe,
- 0x31, 0x05, 0x89, 0xbd, 0x22, 0xdb, 0xae, 0xbe, 0x33, 0x11, 0x05, 0x3d,
- 0xb8, 0xb4, 0x15, 0x3e, 0x00, 0x5b, 0xb5, 0x3d, 0x82, 0x3c, 0x20, 0xbe,
- 0x27, 0x8e, 0x1e, 0xbe, 0x35, 0x24, 0x73, 0xbe, 0x9d, 0xa5, 0x06, 0xbe,
- 0xc4, 0xea, 0xc8, 0x3d, 0xd3, 0x4f, 0x76, 0x3e, 0x56, 0xae, 0x88, 0x3e,
- 0xb3, 0x37, 0xeb, 0xbe, 0x86, 0x38, 0xfb, 0x3c, 0xbd, 0xa0, 0x61, 0x3e,
- 0xce, 0x3f, 0xd0, 0x3d, 0x5f, 0x44, 0x9d, 0xbe, 0x69, 0xb4, 0x6d, 0x3d,
- 0x34, 0x37, 0xd0, 0xbe, 0x2f, 0xde, 0x0c, 0xbd, 0x92, 0xde, 0x98, 0xbd,
- 0x4c, 0x5e, 0x6b, 0xbe, 0x6a, 0x91, 0x57, 0xbd, 0xac, 0x13, 0x82, 0x3d,
- 0xe0, 0x1a, 0x85, 0x3e, 0xb3, 0x75, 0x9e, 0xbe, 0x85, 0xcc, 0xe4, 0xbe,
- 0xcb, 0xcd, 0xab, 0x3d, 0x6a, 0x81, 0xc4, 0xbd, 0xec, 0xfa, 0xf5, 0xbc,
- 0xa4, 0x14, 0x9f, 0xbd, 0x58, 0x87, 0xc4, 0x3d, 0xe6, 0x50, 0x80, 0xbe,
- 0x2d, 0x48, 0x93, 0xbd, 0xe2, 0x23, 0x67, 0x3e, 0x8c, 0xc4, 0x07, 0xbd,
- 0x26, 0xe5, 0x0a, 0xbe, 0x6e, 0x5b, 0x9d, 0x3e, 0x0a, 0xe2, 0x1a, 0xbe,
- 0x5d, 0xf4, 0x09, 0x3d, 0x92, 0x32, 0x8f, 0x3e, 0xdb, 0xa4, 0x16, 0xbe,
- 0x8c, 0xbe, 0x2b, 0xbe, 0x32, 0xa3, 0x94, 0xbc, 0x62, 0x57, 0x90, 0x3e,
- 0xe5, 0xa9, 0x0f, 0xbe, 0xde, 0x8e, 0xa6, 0x3c, 0xa3, 0xaf, 0xea, 0x3d,
- 0x7b, 0x00, 0x98, 0xbc, 0xcb, 0xf9, 0x26, 0x3c, 0x2c, 0xd4, 0x37, 0xbd,
- 0x26, 0x70, 0x10, 0x3e, 0x59, 0x87, 0x8f, 0xbe, 0x2c, 0x55, 0xa2, 0x3d,
- 0x48, 0x1d, 0xac, 0xbc, 0x95, 0x4a, 0x0e, 0x3e, 0xd6, 0x24, 0x1e, 0x3d,
- 0x41, 0x3b, 0xc5, 0x3d, 0x66, 0x18, 0xa1, 0x3c, 0x37, 0x52, 0x32, 0x3e,
- 0xdb, 0x12, 0x71, 0xbd, 0x38, 0x24, 0xe8, 0xbc, 0xc7, 0xb8, 0xb3, 0x3e,
- 0x38, 0x8d, 0x6f, 0x3e, 0x98, 0xeb, 0x74, 0xbe, 0xa4, 0xb7, 0xb6, 0x3e,
- 0x8a, 0x83, 0xed, 0x3b, 0xf0, 0x0d, 0xc7, 0x38, 0x4c, 0xa5, 0x45, 0x3e,
- 0x38, 0x62, 0x3d, 0xbf, 0x95, 0xf6, 0x71, 0xbd, 0x68, 0xfb, 0xa8, 0x3d,
- 0xa7, 0x41, 0x85, 0xbe, 0xf6, 0xa5, 0x11, 0xbe, 0x1c, 0x74, 0xc9, 0x3b,
- 0xaf, 0xf6, 0xc7, 0xbd, 0x50, 0x56, 0xbe, 0xbd, 0x4e, 0x75, 0x22, 0x3d,
- 0xf9, 0xd4, 0x86, 0x3c, 0xf7, 0xc5, 0x34, 0xbd, 0x52, 0x7c, 0x00, 0x3d,
- 0x14, 0x40, 0x39, 0xbe, 0xeb, 0x44, 0x52, 0x3e, 0x4c, 0x34, 0x2c, 0xbe,
- 0x23, 0xb2, 0x95, 0xbe, 0x73, 0x9e, 0xae, 0x3d, 0x81, 0x7b, 0xbf, 0xbd,
- 0x87, 0x31, 0xd2, 0xbe, 0x63, 0xa3, 0x7a, 0xbe, 0xc2, 0x6f, 0x3e, 0xbe,
- 0x3a, 0xf9, 0xda, 0xbc, 0x2b, 0x94, 0x4d, 0x3e, 0xb7, 0xc4, 0x19, 0xbe,
- 0x54, 0xb2, 0xfa, 0x3e, 0x60, 0x97, 0x8d, 0x3e, 0x91, 0xdf, 0xb4, 0x3d,
- 0x7b, 0x98, 0xb8, 0xbe, 0xee, 0xfc, 0x38, 0x3d, 0xa8, 0xc9, 0x1e, 0x3d,
- 0xbb, 0x6f, 0xba, 0xbe, 0xc3, 0x44, 0xb4, 0xbe, 0x01, 0x02, 0x97, 0x3e,
- 0xa9, 0x45, 0x9a, 0x3d, 0x4b, 0x7e, 0x0c, 0x3e, 0x67, 0x0c, 0x28, 0xbe,
- 0x55, 0x36, 0xe5, 0x3a, 0x69, 0xe0, 0x6d, 0xbe, 0x66, 0x58, 0x61, 0x3d,
- 0xfe, 0xfa, 0x8e, 0xbd, 0x03, 0x07, 0x4f, 0xbe, 0x98, 0x85, 0x93, 0x3e,
- 0x35, 0x09, 0xc1, 0xbe, 0xca, 0xc0, 0x01, 0x3f, 0x5c, 0xab, 0x17, 0x3d,
- 0xba, 0xc4, 0x95, 0x3d, 0xbc, 0xf0, 0x5e, 0x3d, 0x9c, 0x6f, 0xf8, 0x3d,
- 0x77, 0x8c, 0x05, 0x3c, 0x17, 0x53, 0xf9, 0xbd, 0x1e, 0x7d, 0xce, 0x3e,
- 0x03, 0xda, 0xb4, 0xbd, 0x49, 0x29, 0x11, 0x3c, 0xff, 0xc6, 0x44, 0x3d,
- 0xca, 0xb7, 0x46, 0x3e, 0x08, 0xd7, 0xbe, 0x3e, 0xcd, 0x39, 0xc5, 0xbb,
- 0xf1, 0x90, 0x7b, 0x3e, 0x9b, 0x1d, 0x8d, 0x3e, 0x2c, 0x5a, 0x5a, 0xbe,
- 0xe6, 0x33, 0xa0, 0xbe, 0xee, 0x81, 0xc7, 0xbe, 0xd1, 0x0c, 0xfa, 0x3e,
- 0x4a, 0xa4, 0x1a, 0xbd, 0xb5, 0xfb, 0x8c, 0xbe, 0xca, 0x00, 0x48, 0xbd,
- 0xfe, 0x17, 0xb0, 0xbe, 0xf9, 0x25, 0x3e, 0x3e, 0x0f, 0x8b, 0xd8, 0xbd,
- 0x14, 0x9e, 0x7c, 0x3d, 0x02, 0x83, 0xbd, 0x3c, 0x46, 0xcc, 0x3f, 0x3e,
- 0x46, 0xb5, 0x2c, 0x3e, 0x4d, 0xcd, 0x53, 0xbe, 0x80, 0x94, 0x8a, 0xbe,
- 0x33, 0xaf, 0xbb, 0xbd, 0xc5, 0x4a, 0x0e, 0xbd, 0x45, 0x3f, 0x3d, 0x3e,
- 0x9d, 0x90, 0x2a, 0xbe, 0xb5, 0x7d, 0xb6, 0xbe, 0xe4, 0x4e, 0xf8, 0xbe,
- 0x8e, 0x74, 0x85, 0x3d, 0xd4, 0x73, 0x5c, 0x3e, 0x80, 0xa1, 0x4e, 0xbe,
- 0x95, 0x8e, 0x06, 0xbf, 0x05, 0xd2, 0x8e, 0x3e, 0x6c, 0xe3, 0xae, 0xbe,
- 0xce, 0x93, 0xa3, 0x3d, 0x22, 0x17, 0x85, 0x3e, 0xa2, 0xf4, 0xf1, 0xbd,
- 0xd0, 0xa7, 0x03, 0x3d, 0xb6, 0x10, 0xa2, 0xbe, 0x0c, 0x5c, 0x01, 0x3e,
- 0x0c, 0x72, 0xc9, 0x3c, 0x71, 0xd0, 0x63, 0xbd, 0x51, 0xba, 0x7f, 0xbd,
- 0x37, 0xfa, 0xcf, 0x3e, 0x4f, 0x64, 0x16, 0xbe, 0x14, 0xd4, 0x9c, 0xbd,
- 0x34, 0x8e, 0x4f, 0xbe, 0xb6, 0xba, 0x79, 0xbd, 0x84, 0x57, 0x58, 0x3e,
- 0xad, 0x19, 0x48, 0x3d, 0xf4, 0xe9, 0xb1, 0xbd, 0x37, 0xc0, 0x0a, 0xbe,
- 0x2c, 0xda, 0xb7, 0xbd, 0x1e, 0x6f, 0x53, 0x3e, 0xd0, 0xf4, 0x8e, 0x3e,
- 0x8a, 0x5e, 0x5a, 0x3d, 0x8d, 0x3e, 0xa8, 0x3e, 0x1f, 0x70, 0xca, 0x3e,
- 0xd8, 0x4d, 0x59, 0xbf, 0xfc, 0xaa, 0x4d, 0x3e, 0x60, 0x4a, 0x74, 0x3e,
- 0xfe, 0x7f, 0x38, 0xbd, 0x5c, 0xc6, 0xf0, 0xbe, 0x1b, 0xe3, 0x98, 0xbd,
- 0xb2, 0x88, 0x30, 0xbf, 0xc5, 0x4a, 0xf8, 0x3d, 0x62, 0xe3, 0x8c, 0x3e,
- 0x85, 0xdf, 0xa7, 0xbe, 0x18, 0x11, 0x4f, 0x3d, 0x92, 0x93, 0x9d, 0x3e,
- 0x53, 0xcb, 0x05, 0x3e, 0x3d, 0x26, 0x83, 0x3e, 0xf9, 0x78, 0xc4, 0xbe,
- 0xa8, 0xec, 0xa1, 0xbe, 0x37, 0x12, 0x3a, 0xbe, 0xa2, 0x06, 0xd9, 0x3e,
- 0x75, 0x0a, 0x5e, 0x3d, 0x4a, 0xa4, 0x1c, 0x3d, 0xc1, 0x2a, 0xb0, 0xbd,
- 0x31, 0x6e, 0x3d, 0xbe, 0x1c, 0x87, 0x21, 0xbe, 0x65, 0x72, 0x37, 0x3e,
- 0x19, 0x7a, 0xa1, 0xbe, 0x19, 0x5f, 0x8e, 0xbe, 0xe9, 0x01, 0x33, 0xbe,
- 0x9d, 0x08, 0x31, 0xbe, 0xa7, 0x0d, 0x01, 0xbf, 0xe1, 0x9b, 0x4b, 0xbc,
- 0x71, 0x51, 0x72, 0xbe, 0xad, 0xf5, 0x0a, 0x3f, 0x3b, 0xf7, 0xa4, 0xbe,
- 0xb6, 0x9b, 0xce, 0x3e, 0xf9, 0xe6, 0x0c, 0xbd, 0x9d, 0x6d, 0x33, 0x3f,
- 0xea, 0x0d, 0x85, 0x3e, 0x19, 0x5e, 0x0b, 0xbf, 0xf1, 0x7a, 0xc8, 0xbb,
- 0x8f, 0x10, 0x81, 0x3e, 0x17, 0x62, 0x31, 0x3f, 0x97, 0xa3, 0xed, 0xbe,
- 0xfe, 0xd1, 0x6a, 0x3f, 0x5e, 0xe2, 0xf1, 0xbe, 0x7a, 0x40, 0x1a, 0xbf,
- 0xfe, 0x61, 0x1a, 0xbe, 0xf0, 0x30, 0x48, 0xbf, 0x7b, 0x24, 0xd6, 0xbd,
- 0x15, 0xc1, 0x2d, 0x3e, 0x49, 0xf1, 0x81, 0xbf, 0xf1, 0x6a, 0x33, 0x3e,
- 0x22, 0x48, 0x74, 0x3f, 0x68, 0xaf, 0x34, 0xbf, 0x1f, 0x0e, 0xb7, 0xbe,
- 0x2a, 0x47, 0xb8, 0x3e, 0xdc, 0xe7, 0xae, 0x3e, 0x98, 0xca, 0x99, 0xbe,
- 0xcf, 0xf5, 0xb4, 0xbd, 0xd8, 0x14, 0xd9, 0x3d, 0x81, 0xc6, 0x17, 0xbf,
- 0xed, 0x4b, 0x80, 0x3e, 0x40, 0xb2, 0xfe, 0x3e, 0x7a, 0xb3, 0x58, 0x3d,
- 0x5d, 0x86, 0xf0, 0x3e, 0x45, 0x15, 0xb4, 0x3c, 0x04, 0x64, 0xf0, 0xbe,
- 0x25, 0xe7, 0xc7, 0x3e, 0x91, 0x0c, 0x35, 0x3e, 0xcc, 0x4a, 0x32, 0x3f,
- 0x7f, 0x17, 0x2f, 0xbe, 0x2b, 0xed, 0x94, 0x3e, 0x80, 0x98, 0xc5, 0x3b,
- 0xb3, 0x04, 0x12, 0xbd, 0xce, 0x1e, 0x97, 0x3d, 0xd2, 0x34, 0x0f, 0x3f,
- 0x22, 0x5d, 0xda, 0x3e, 0x68, 0x6b, 0x8c, 0xbf, 0x86, 0xfe, 0xbb, 0xbd,
- 0x42, 0x3a, 0x96, 0x3f, 0x9b, 0x0e, 0x65, 0x3f, 0x1f, 0x3b, 0x3e, 0x3f,
- 0x49, 0x52, 0x9f, 0x3f, 0x4d, 0x99, 0x86, 0x3e, 0x99, 0xcb, 0xa8, 0x3e,
- 0xa3, 0xf0, 0x18, 0x3e, 0x86, 0x34, 0xad, 0x3d, 0xc1, 0xaa, 0x99, 0xbe,
- 0x9f, 0xbf, 0xef, 0xbe, 0x99, 0xfe, 0x83, 0xbd, 0xf0, 0xf0, 0x83, 0xbf,
- 0xf9, 0x4f, 0xc9, 0xbd, 0x06, 0x67, 0x94, 0xbd, 0x05, 0x94, 0x2f, 0x3f,
- 0xb4, 0x31, 0x93, 0xbe, 0xe6, 0x5e, 0x07, 0x3f, 0x01, 0xa4, 0x05, 0x3d,
- 0xa1, 0x0d, 0x5b, 0xbd, 0xc8, 0x59, 0x59, 0xbe, 0xbd, 0x1b, 0x25, 0x3d,
- 0x19, 0x87, 0x31, 0xbf, 0x66, 0x83, 0x35, 0xbd, 0xa2, 0x6d, 0xbb, 0x3d,
- 0xda, 0x46, 0x75, 0xbf, 0x2b, 0xd2, 0xfb, 0xbc, 0x8a, 0xcc, 0x7e, 0x3d,
- 0xc6, 0x01, 0x50, 0xbe, 0xd0, 0x78, 0x7d, 0x3e, 0xd7, 0xe1, 0xa1, 0xbe,
- 0x96, 0x8e, 0x1a, 0x3e, 0x6c, 0x83, 0x68, 0x3e, 0x6d, 0x24, 0x02, 0xbe,
- 0x4d, 0x21, 0x2b, 0xbc, 0x5f, 0x9f, 0xe3, 0x3e, 0x57, 0xd6, 0xb4, 0x3e,
- 0xf5, 0x1d, 0xb2, 0xbd, 0x34, 0x3f, 0xb0, 0x3e, 0x18, 0x12, 0x7d, 0x3f,
- 0xfe, 0x5e, 0x2e, 0x3e, 0xa9, 0xb9, 0x22, 0x3e, 0xaf, 0x7f, 0x33, 0xbe,
- 0xf6, 0xb8, 0xca, 0x3d, 0x55, 0x4d, 0x8f, 0x3e, 0x56, 0x9e, 0x8c, 0x3f,
- 0x73, 0x5e, 0x2a, 0xbe, 0x85, 0xe9, 0x05, 0x3f, 0x73, 0x3e, 0xe4, 0xbb,
- 0xbd, 0xc4, 0xbf, 0xbe, 0x31, 0x77, 0x14, 0xbf, 0x0a, 0x72, 0xf5, 0x3e,
- 0xe5, 0x0c, 0x06, 0xbf, 0xca, 0x41, 0x16, 0x3f, 0xe2, 0xf3, 0x10, 0xbf,
- 0xaa, 0xe4, 0xee, 0xbe, 0x93, 0x0f, 0x8a, 0xbe, 0xcd, 0xfb, 0x58, 0xbe,
- 0x0b, 0xf0, 0x8d, 0xbd, 0xe4, 0xbe, 0x07, 0x3d, 0xdd, 0x35, 0x91, 0xbf,
- 0x04, 0x41, 0x76, 0x3e, 0x47, 0xa2, 0x42, 0x3e, 0xd8, 0x7c, 0x4e, 0xbd,
- 0x6f, 0xa6, 0x10, 0x3f, 0xeb, 0x4c, 0xa3, 0xbe, 0x27, 0x1a, 0x1f, 0x3d,
- 0xaf, 0x2b, 0x86, 0xbe, 0x75, 0x9e, 0x40, 0x3f, 0xf1, 0x77, 0x8b, 0x3e,
- 0x0c, 0xc4, 0x8a, 0xbe, 0xe9, 0xbe, 0x65, 0xbc, 0x4b, 0x22, 0xd1, 0xbd,
- 0x82, 0xa9, 0x6a, 0x3c, 0x30, 0x0b, 0x1a, 0xbd, 0xb5, 0x40, 0x19, 0xbd,
- 0x47, 0x1b, 0xdf, 0x3c, 0x83, 0xd5, 0x84, 0xbd, 0x3a, 0xce, 0x19, 0x3e,
- 0xb1, 0xb6, 0xe0, 0xbd, 0x1a, 0x22, 0xba, 0xbc, 0x24, 0x43, 0x12, 0xbe,
- 0x4e, 0x63, 0x5c, 0x3e, 0x8d, 0xa4, 0xa5, 0xbd, 0x4f, 0xc4, 0x8b, 0xbe,
- 0xfe, 0xfd, 0x89, 0xbd, 0xef, 0xfd, 0x87, 0xbe, 0x02, 0xf3, 0x19, 0xbe,
- 0x7a, 0x1a, 0x25, 0x3e, 0x5c, 0x57, 0xa0, 0x3d, 0x43, 0x85, 0xef, 0x3d,
- 0xba, 0xa7, 0xa7, 0x3d, 0x7c, 0x66, 0xc0, 0xbe, 0x3a, 0xcc, 0xc7, 0xbc,
- 0x00, 0x1d, 0xce, 0xbd, 0x75, 0x75, 0x0d, 0x3e, 0x98, 0xd3, 0x7d, 0xbe,
- 0xf3, 0x8d, 0x33, 0xbb, 0x78, 0x5a, 0x86, 0xbd, 0xb5, 0x4f, 0xff, 0xbd,
- 0x4c, 0x04, 0x81, 0x3e, 0x9d, 0xe4, 0xf4, 0xbd, 0x16, 0xfa, 0x19, 0xbe,
- 0xac, 0x62, 0xaa, 0x3d, 0x7b, 0x77, 0x60, 0xbd, 0x6f, 0xeb, 0xb8, 0xbd,
- 0x5a, 0xe3, 0xdd, 0x3d, 0x92, 0xdb, 0x61, 0xbe, 0xd6, 0xd9, 0xb0, 0x3e,
- 0x4a, 0x76, 0x2b, 0x3e, 0xa0, 0x6c, 0xd2, 0xbc, 0x80, 0x06, 0xe1, 0x3d,
- 0x5c, 0x6d, 0x32, 0x3c, 0xb6, 0x4e, 0xe9, 0x3c, 0xc5, 0xab, 0x18, 0xbe,
- 0x61, 0x89, 0x87, 0x3d, 0xf7, 0x5d, 0x3f, 0xbe, 0x6a, 0xac, 0x89, 0x3b,
- 0x4e, 0x41, 0xbd, 0x3d, 0xe9, 0x7b, 0x88, 0x3e, 0xe0, 0xdb, 0x7a, 0x3e,
- 0x0d, 0x4f, 0x99, 0xbe, 0x78, 0x30, 0xee, 0xbe, 0x2d, 0xfe, 0x2f, 0x3e,
- 0x24, 0x2a, 0x32, 0xbe, 0xf2, 0xa7, 0x94, 0x3e, 0x16, 0xae, 0x95, 0xbc,
- 0xcb, 0x2f, 0x4d, 0x3d, 0xd2, 0xa7, 0xa0, 0xbd, 0x6f, 0x20, 0x35, 0xbe,
- 0x4d, 0xa3, 0x2c, 0xbd, 0x63, 0x93, 0xf4, 0xbd, 0xf9, 0x05, 0x0e, 0x3d,
- 0xdd, 0x65, 0x19, 0xbe, 0x0d, 0x85, 0x9a, 0xbe, 0x0b, 0x8c, 0x22, 0xbe,
- 0xe7, 0x42, 0x76, 0x3d, 0x06, 0x42, 0xf3, 0x3d, 0x0e, 0xd5, 0xc1, 0x3d,
- 0x6b, 0x72, 0xf5, 0x3d, 0x3b, 0xe2, 0xaf, 0xbd, 0x5b, 0x85, 0x97, 0x3b,
- 0x56, 0x15, 0x4c, 0x3d, 0xf2, 0xf6, 0x17, 0x3d, 0xe6, 0x5e, 0xa0, 0x3c,
- 0xc7, 0xe5, 0x62, 0xbe, 0xf1, 0x62, 0xb6, 0xbe, 0xb9, 0x7f, 0xff, 0x3d,
- 0x97, 0xd5, 0xb4, 0xbd, 0xd1, 0x52, 0x73, 0xbd, 0x48, 0x87, 0xe6, 0x3b,
- 0x44, 0x0c, 0x7e, 0xbc, 0xdb, 0x9b, 0x27, 0xbd, 0x22, 0x9b, 0x73, 0xbe,
- 0x15, 0x44, 0xca, 0x3d, 0xab, 0x80, 0x90, 0x3d, 0xa9, 0x2a, 0x03, 0xbe,
- 0x4c, 0xf4, 0xea, 0x3d, 0x21, 0xb0, 0x60, 0x3e, 0x41, 0xd2, 0xa7, 0xbc,
- 0xdc, 0x7c, 0x05, 0xbe, 0xdf, 0xe3, 0x10, 0x3d, 0x4b, 0x26, 0xf7, 0xbd,
- 0xa5, 0x76, 0x57, 0xbe, 0x8f, 0x92, 0x89, 0xbd, 0x9f, 0xc6, 0x89, 0x3e,
- 0x96, 0xa2, 0x71, 0xbd, 0x73, 0x4b, 0x2e, 0x3e, 0x39, 0xac, 0xaa, 0x3e,
- 0x7e, 0xce, 0x22, 0xbe, 0x2d, 0xad, 0xa9, 0xbe, 0xbc, 0xcc, 0xa7, 0x3d,
- 0x6d, 0x5f, 0x5f, 0xbe, 0x71, 0x5c, 0x07, 0xbe, 0x56, 0x9f, 0x34, 0x3b,
- 0x54, 0x07, 0x6a, 0xbd, 0xc6, 0x61, 0x13, 0x3d, 0xb0, 0x1f, 0xa0, 0x3d,
- 0x50, 0x96, 0xaa, 0x3d, 0xdd, 0x73, 0x25, 0x3c, 0x9b, 0x1b, 0x14, 0xbe,
- 0xf7, 0xfb, 0xe0, 0xb9, 0x5e, 0x3d, 0xab, 0xbe, 0x19, 0x14, 0x85, 0xbb,
- 0x23, 0x35, 0xcc, 0xbc, 0xe9, 0xe3, 0x9e, 0xbd, 0x21, 0x96, 0x37, 0xbd,
- 0x44, 0x1b, 0xd4, 0xbe, 0x7d, 0x5e, 0xa2, 0x3f, 0xe6, 0xe8, 0x92, 0x3d,
- 0x03, 0x62, 0x0f, 0x3f, 0x10, 0x92, 0x08, 0xbe, 0xcd, 0x62, 0x65, 0x3f,
- 0x2c, 0x77, 0xe9, 0xbc, 0x48, 0x85, 0x93, 0x3e, 0x0c, 0xfb, 0x0a, 0xbf,
- 0x4d, 0x82, 0xe9, 0xbe, 0xde, 0xf0, 0x7a, 0x3e, 0x40, 0x6b, 0x5d, 0xbe,
- 0x20, 0x53, 0x3e, 0x3d, 0xd2, 0x06, 0x01, 0x3f, 0xa1, 0x2d, 0xc2, 0xbe,
- 0xf3, 0xed, 0xfa, 0xbe, 0x9e, 0xd8, 0x66, 0x3e, 0xb1, 0x4f, 0x17, 0xbf,
- 0xf7, 0xc5, 0xc3, 0xbe, 0xef, 0x94, 0x0d, 0x3d, 0xff, 0x82, 0xef, 0x3e,
- 0xd6, 0xb8, 0x8c, 0x3e, 0x5c, 0xfb, 0x87, 0xbe, 0xce, 0x16, 0x09, 0xbe,
- 0x96, 0x3d, 0xe3, 0xbe, 0x7a, 0xef, 0xbf, 0x3e, 0x9d, 0x4a, 0x22, 0xbf,
- 0xe1, 0xd6, 0x94, 0xbf, 0x5a, 0x30, 0x7b, 0x3c, 0x7d, 0x7f, 0xe4, 0xbe,
- 0x1b, 0x4b, 0x05, 0x3f, 0x5a, 0x8c, 0x2d, 0xbf, 0xdd, 0x0d, 0xff, 0xbd,
- 0xa7, 0x6e, 0x27, 0x3f, 0xf6, 0xa2, 0x7b, 0x3e, 0x27, 0x6a, 0x7c, 0xbe,
- 0x3e, 0x8a, 0x00, 0x3e, 0xb5, 0xac, 0xcb, 0xbe, 0x0e, 0x92, 0xe5, 0x3e,
- 0xb9, 0x62, 0x0c, 0xbf, 0xc4, 0x51, 0x00, 0xbd, 0x8a, 0x8a, 0x18, 0xbe,
- 0x2c, 0xc2, 0x4a, 0xbe, 0x3b, 0x63, 0xca, 0xbd, 0xa5, 0x05, 0x7e, 0x3f,
- 0x8e, 0x68, 0xb9, 0x3d, 0x95, 0xc6, 0x2d, 0xbd, 0xbc, 0xcc, 0x35, 0xbd,
- 0xe5, 0x70, 0xef, 0x3d, 0xf7, 0xb7, 0xd7, 0x3c, 0x94, 0x27, 0x97, 0x3d,
- 0x98, 0x48, 0xe3, 0xbd, 0xdb, 0x38, 0x1c, 0x3f, 0x7f, 0x54, 0xf1, 0x3b,
- 0xae, 0x7f, 0xed, 0xbd, 0x67, 0xf6, 0x7f, 0xbd, 0xdc, 0xc9, 0x49, 0x3e,
- 0x35, 0x00, 0x44, 0x3d, 0xf6, 0xc0, 0xed, 0xbe, 0x8d, 0x93, 0x11, 0x3f,
- 0xf9, 0x90, 0xf9, 0x3e, 0x48, 0x87, 0x04, 0x3f, 0x40, 0xf0, 0xa9, 0x3e,
- 0xca, 0x08, 0x19, 0xbf, 0x4d, 0x27, 0xd9, 0xbd, 0x33, 0x30, 0x9e, 0xbd,
- 0xa0, 0xcf, 0x95, 0x3b, 0xe1, 0x40, 0x12, 0x3f, 0x48, 0x4c, 0xff, 0xbe,
- 0x7b, 0xa7, 0x36, 0x3e, 0x2e, 0x47, 0x83, 0xbd, 0xc0, 0xc7, 0x8e, 0x3e,
- 0x83, 0xfc, 0x52, 0xbd, 0xbb, 0xaa, 0x35, 0xbe, 0x7b, 0xda, 0x35, 0xbf,
- 0x8e, 0xba, 0x4a, 0x3e, 0x65, 0x56, 0xa1, 0x3b, 0xfd, 0x7b, 0x2f, 0xbf,
- 0x32, 0x6a, 0xab, 0xbe, 0x12, 0x74, 0x55, 0x3d, 0x62, 0x32, 0x02, 0x3d,
- 0x84, 0x7a, 0x0b, 0xbd, 0x45, 0x2a, 0xcc, 0x3e, 0x0d, 0x9c, 0x81, 0xbe,
- 0x0f, 0x3e, 0x83, 0xbd, 0x44, 0xca, 0xd9, 0x3e, 0x82, 0x3e, 0x93, 0x3e,
- 0xc4, 0x69, 0xbc, 0x3d, 0xde, 0x16, 0xfa, 0x3d, 0xbf, 0x49, 0xbb, 0xbe,
- 0x8a, 0xcf, 0x32, 0x3e, 0xad, 0x19, 0x11, 0xbe, 0x3f, 0x56, 0xe4, 0x3c,
- 0x5a, 0x25, 0x46, 0xbe, 0x92, 0x9b, 0x19, 0x3e, 0x7f, 0x64, 0x6f, 0x3c,
- 0x74, 0xb1, 0x9b, 0x3d, 0x9e, 0x35, 0xb4, 0xbd, 0x85, 0xa4, 0x4b, 0x3f,
- 0xc0, 0x44, 0x4f, 0xbe, 0x10, 0xe3, 0x0d, 0xbf, 0xfe, 0x97, 0xd6, 0x3d,
- 0x98, 0x40, 0x45, 0x3d, 0xd6, 0xfb, 0x0a, 0xbe, 0xd9, 0xaa, 0x67, 0xbe,
- 0x4f, 0x3f, 0x60, 0xbc, 0xe4, 0xe1, 0x09, 0x3f, 0x64, 0x98, 0x13, 0x3e,
- 0x86, 0x77, 0x4d, 0xbe, 0xf2, 0xa2, 0x3f, 0xbc, 0x30, 0xc8, 0x7a, 0x3d,
- 0x49, 0x22, 0x7b, 0x3e, 0x9b, 0x33, 0xba, 0xbd, 0x68, 0x08, 0x8a, 0xbe,
- 0x3a, 0xdd, 0xad, 0x3c, 0x29, 0x5e, 0x0c, 0x3e, 0xc3, 0x25, 0x31, 0xbe,
- 0x5e, 0x0e, 0x87, 0x3e, 0xd1, 0x7a, 0xa1, 0x3c, 0x9d, 0xb1, 0x8f, 0xbd,
- 0x25, 0x95, 0x66, 0xbe, 0xb5, 0x95, 0xba, 0x3d, 0x5f, 0x67, 0xaa, 0xbd,
- 0x80, 0x83, 0x54, 0x3e, 0xd0, 0x91, 0xc8, 0x3e, 0xc4, 0xd3, 0x8d, 0x3d,
- 0xaf, 0x76, 0xad, 0x3d, 0x0f, 0x06, 0x8d, 0xbd, 0x67, 0xdd, 0x82, 0xbe,
- 0x0f, 0x37, 0x11, 0x3b, 0x98, 0xbc, 0xcf, 0x3d, 0x73, 0x1e, 0x4c, 0x3e,
- 0x77, 0x6b, 0x71, 0xbd, 0xaf, 0x2d, 0xd6, 0x3e, 0x1f, 0xf7, 0xd4, 0x3d,
- 0xd4, 0x47, 0x0e, 0xbd, 0x17, 0xc3, 0x2c, 0x3e, 0x98, 0xe3, 0x9d, 0xbe,
- 0x74, 0xb5, 0xb7, 0x3e, 0x72, 0x61, 0xa3, 0xbd, 0x30, 0x04, 0x67, 0xbe,
- 0x3d, 0x91, 0x10, 0x3e, 0x2e, 0xd9, 0xa9, 0xbe, 0xeb, 0x15, 0x84, 0x3d,
- 0x4a, 0xda, 0xf8, 0x3d, 0xa1, 0x58, 0xf6, 0x3d, 0x58, 0x49, 0x12, 0x3b,
- 0x50, 0x0a, 0x81, 0xbe, 0xc4, 0x7c, 0x88, 0xbe, 0x02, 0xc1, 0x7b, 0x3d,
- 0xa2, 0x74, 0xee, 0xbd, 0x7f, 0x67, 0xa2, 0x3e, 0x81, 0x61, 0x2a, 0x3e,
- 0xe7, 0x91, 0x25, 0xbe, 0xaa, 0x00, 0x43, 0xbd, 0xf6, 0xb0, 0x96, 0x3e,
- 0xf4, 0x6e, 0x12, 0xbe, 0x2d, 0x7b, 0x29, 0xbe, 0x30, 0x9d, 0xe7, 0xbd,
- 0x45, 0x55, 0xc0, 0xbe, 0x11, 0x44, 0x13, 0x3d, 0x21, 0xff, 0x39, 0xbd,
- 0x69, 0xdf, 0xd1, 0xbd, 0xa6, 0xc6, 0x1b, 0xbd, 0x1f, 0x13, 0x89, 0x3e,
- 0xb9, 0xd2, 0xa7, 0x3e, 0xba, 0xcb, 0x85, 0xbd, 0x25, 0x02, 0xf6, 0xbe,
- 0x6f, 0x46, 0xcf, 0x3d, 0xc7, 0x99, 0x6e, 0x3e, 0xad, 0x80, 0x89, 0xbe,
- 0xc3, 0x43, 0xec, 0xbd, 0xb3, 0xab, 0xcd, 0xbd, 0xc9, 0x62, 0x42, 0xbe,
- 0x7a, 0xd1, 0xf2, 0xbd, 0xb3, 0x83, 0x3b, 0x3e, 0xd1, 0x13, 0xbd, 0xbd,
- 0x39, 0xe4, 0x6c, 0xbe, 0x97, 0x35, 0x27, 0x3e, 0xa8, 0xf0, 0xbf, 0xbd,
- 0xfa, 0xa7, 0x04, 0xbe, 0x8b, 0xa4, 0x6c, 0x3e, 0x08, 0xf0, 0x8d, 0x3d,
- 0xb1, 0xc9, 0xce, 0xbc, 0xeb, 0x44, 0x37, 0xbe, 0x16, 0xa1, 0x30, 0x3e,
- 0xa4, 0x99, 0xe0, 0xbd, 0xcf, 0x0e, 0xf7, 0x3d, 0xb6, 0x53, 0x41, 0x3e,
- 0x0a, 0xc8, 0x9e, 0xbd, 0xb7, 0x8f, 0x6a, 0xbb, 0xd8, 0xa5, 0xc7, 0xbd,
- 0x1c, 0x86, 0xda, 0x3e, 0x98, 0xdd, 0xe5, 0xbe, 0x09, 0xd7, 0x0c, 0x3d,
- 0xb8, 0x79, 0x61, 0x3d, 0x00, 0x4a, 0x78, 0x3a, 0xd7, 0x0e, 0x1a, 0xbe,
- 0x19, 0x16, 0xf7, 0x3d, 0x35, 0xc4, 0xfc, 0xbc, 0x9b, 0x77, 0x04, 0x3e,
- 0x1b, 0x5a, 0xc1, 0xbc, 0xce, 0xeb, 0x93, 0xbe, 0xeb, 0xfa, 0x97, 0x3c,
- 0x91, 0xc0, 0xdf, 0x3e, 0x59, 0xdf, 0x9a, 0xbd, 0x52, 0x57, 0x0c, 0x3e,
- 0x04, 0xe6, 0x2f, 0x3c, 0x07, 0xfa, 0x2c, 0xbe, 0x58, 0x40, 0x41, 0xbd,
- 0x8d, 0x2a, 0x46, 0xbf, 0xff, 0xc8, 0x13, 0xbe, 0x08, 0x66, 0xad, 0x3c,
- 0xa3, 0x13, 0xdb, 0xbe, 0x5e, 0x11, 0x21, 0xbe, 0x39, 0xd0, 0x06, 0xbe,
- 0x8d, 0x15, 0xb9, 0x3e, 0x2b, 0xb9, 0xf3, 0x3d, 0x04, 0xd3, 0x31, 0x3e,
- 0x4b, 0x4a, 0xd5, 0xbe, 0xc9, 0x84, 0x04, 0xbe, 0xfe, 0x69, 0xbf, 0xbc,
- 0x33, 0x70, 0xa1, 0xbd, 0xba, 0xa6, 0x13, 0x3e, 0x86, 0x2c, 0xd7, 0xbd,
- 0xc2, 0x08, 0xab, 0xbe, 0xfc, 0x0f, 0x86, 0x3d, 0xdd, 0x48, 0xb0, 0xbe,
- 0x48, 0x7b, 0x80, 0xbe, 0x31, 0x7b, 0x8a, 0xbe, 0x50, 0x1e, 0xe0, 0xbd,
- 0xae, 0x56, 0x0e, 0xbd, 0x40, 0xbc, 0x53, 0x3e, 0xb2, 0xcb, 0x1b, 0xbc,
- 0x5d, 0x7a, 0x6d, 0x3e, 0x98, 0x01, 0xca, 0xbd, 0x67, 0xf6, 0xfe, 0xbc,
- 0xd1, 0x2c, 0x59, 0xbe, 0xf5, 0x49, 0x11, 0xbd, 0x59, 0x9a, 0x0b, 0x3c,
- 0x28, 0x66, 0xd6, 0xbe, 0x8f, 0x6d, 0xbb, 0xbe, 0xc3, 0xdc, 0x05, 0xbc,
- 0xa1, 0xbc, 0xef, 0x3b, 0x53, 0x0f, 0xe0, 0xbd, 0x03, 0xf1, 0x6f, 0xbe,
- 0xe1, 0x86, 0x89, 0x3d, 0xb5, 0xdb, 0x83, 0xbe, 0xec, 0xf9, 0x94, 0xbe,
- 0xf5, 0x33, 0x9b, 0x3e, 0x12, 0xe6, 0xff, 0xbd, 0x65, 0xaf, 0x07, 0x3e,
- 0x79, 0xe2, 0xde, 0xbe, 0x4e, 0xb0, 0xfc, 0x3e, 0xf8, 0x77, 0x25, 0x3c,
- 0x69, 0x9f, 0x95, 0x3e, 0xfc, 0x34, 0x4d, 0x3b, 0xaa, 0x64, 0x90, 0x3d,
- 0x7b, 0x61, 0x42, 0xbe, 0xf8, 0x01, 0x84, 0xbe, 0x88, 0x55, 0x53, 0x3e,
- 0x1a, 0x03, 0x4d, 0x3e, 0x75, 0x54, 0x2e, 0xbd, 0x92, 0xfa, 0x8e, 0x3d,
- 0xf8, 0xe9, 0x93, 0x3e, 0x50, 0x99, 0x8c, 0x3e, 0x86, 0x17, 0x03, 0xbd,
- 0x99, 0xd6, 0x5d, 0xbe, 0x35, 0xd6, 0xb3, 0x3e, 0x11, 0x2a, 0xd5, 0xbe,
- 0xa5, 0x0b, 0x0c, 0xbe, 0x58, 0xd9, 0x2b, 0xbe, 0x6c, 0xc8, 0xd1, 0x3e,
- 0x7b, 0x33, 0xd1, 0xbd, 0xe3, 0xea, 0x99, 0xbe, 0x24, 0xcd, 0x80, 0xbd,
- 0xa5, 0xaa, 0x22, 0xbe, 0xb2, 0x37, 0x93, 0x3e, 0xf2, 0xae, 0x3d, 0x3d,
- 0xab, 0x02, 0xf6, 0x3d, 0x8c, 0x2e, 0x01, 0x3d, 0x76, 0x3e, 0x0f, 0x3e,
- 0x20, 0x94, 0xbb, 0x3e, 0x1e, 0xec, 0x05, 0x3d, 0xe0, 0x3f, 0x2b, 0xbe,
- 0xf5, 0xc4, 0xd1, 0xbd, 0x89, 0x30, 0x02, 0x3e, 0xd5, 0x90, 0x38, 0xbe,
- 0xe5, 0xe0, 0xef, 0x3d, 0x85, 0xca, 0x1b, 0xbe, 0x78, 0x93, 0xac, 0xbe,
- 0xde, 0x10, 0x5e, 0xbd, 0x51, 0xef, 0xab, 0x3d, 0x51, 0xef, 0x47, 0xbd,
- 0x43, 0xa8, 0xd4, 0xbe, 0xb0, 0x17, 0x18, 0x3e, 0x32, 0x8f, 0x88, 0xbe,
- 0x46, 0x5a, 0xaf, 0xbd, 0x87, 0x63, 0x10, 0xbd, 0xb6, 0x56, 0x2e, 0xbe,
- 0xb0, 0xa6, 0x75, 0xbc, 0xaa, 0xb1, 0xb5, 0xbe, 0x4e, 0x52, 0x4f, 0xbe,
- 0x80, 0xd1, 0x92, 0x3b, 0x62, 0x31, 0x9a, 0x3c, 0x14, 0x1c, 0x25, 0x3d,
- 0x8e, 0x2d, 0x94, 0xbc, 0x5f, 0xfa, 0x28, 0xbd, 0x3f, 0x3f, 0xd5, 0xbd,
- 0x85, 0xb4, 0x77, 0xbb, 0x34, 0xa5, 0x96, 0xbe, 0xb5, 0x01, 0x9f, 0x3e,
- 0x76, 0x0b, 0x6c, 0x3e, 0x0a, 0x90, 0xb7, 0xbc, 0x06, 0xc1, 0xcb, 0x39,
- 0xc1, 0x3f, 0xe6, 0xbd, 0xfb, 0xb9, 0xce, 0x3d, 0xab, 0x66, 0xfa, 0x3e,
- 0xd0, 0x0b, 0xd6, 0xbd, 0x21, 0x2b, 0xaa, 0x3e, 0xf2, 0xb3, 0x69, 0x3d,
- 0x82, 0x2b, 0x40, 0xbf, 0xf8, 0xc0, 0x3f, 0x3e, 0xfe, 0x00, 0xf1, 0x3c,
- 0x92, 0xb7, 0x35, 0x3b, 0x36, 0x3c, 0xa5, 0xbe, 0xe4, 0x25, 0x99, 0xbd,
- 0x0f, 0xba, 0x6a, 0xbf, 0xed, 0x31, 0x92, 0x3e, 0x2b, 0x1b, 0xfb, 0x3d,
- 0xc8, 0x7d, 0xfd, 0xbd, 0x71, 0x7f, 0xc5, 0x3d, 0x95, 0x1e, 0x69, 0xbc,
- 0x9a, 0xd8, 0x73, 0x3e, 0xff, 0xc8, 0x6c, 0x3e, 0x53, 0x0a, 0xf9, 0xbd,
- 0x26, 0x6b, 0xb5, 0xbe, 0x5c, 0x75, 0xfe, 0xbd, 0x26, 0x55, 0xc6, 0x3e,
- 0xe0, 0xeb, 0x2c, 0x3d, 0x29, 0x34, 0xe6, 0xbd, 0x3c, 0x4a, 0x88, 0x3e,
- 0x81, 0x3b, 0x16, 0xbd, 0x58, 0x15, 0x91, 0x3d, 0x38, 0x43, 0x74, 0xbe,
- 0x64, 0x40, 0x69, 0xbd, 0x7d, 0x0d, 0xa8, 0xbd, 0xb2, 0x21, 0x6a, 0xbe,
- 0xdd, 0x7c, 0x95, 0xbd, 0x83, 0xba, 0x1f, 0xbf, 0xe0, 0xb8, 0x48, 0xbc,
- 0x81, 0x2f, 0x42, 0x3f, 0x69, 0x72, 0x8a, 0xbe, 0x70, 0xb4, 0x75, 0xbd,
- 0x3a, 0x8d, 0x28, 0x3e, 0x9f, 0x5b, 0xf2, 0x3a, 0xc6, 0x6f, 0x34, 0x3f,
- 0xbe, 0x2d, 0xb1, 0x3d, 0xdd, 0x0b, 0xeb, 0xbe, 0x99, 0xe1, 0x2a, 0xbf,
- 0xf8, 0xb8, 0x88, 0xbe, 0x13, 0x0f, 0x19, 0x3f, 0x15, 0x6f, 0x95, 0xbe,
- 0x21, 0x38, 0x2f, 0xbe, 0x66, 0x8b, 0xaf, 0x3f, 0xf6, 0x99, 0x28, 0x3f,
- 0x15, 0x55, 0x65, 0xbf, 0x06, 0x1b, 0x02, 0xbf, 0x9f, 0xff, 0x53, 0xbf,
- 0xa4, 0x1e, 0x88, 0xbe, 0xc6, 0xee, 0x10, 0xbf, 0x49, 0x0b, 0x53, 0xbe,
- 0xcb, 0x7f, 0x88, 0x3f, 0xc9, 0xfa, 0xa0, 0x3e, 0x77, 0x26, 0x40, 0x3c,
- 0xd5, 0x8b, 0x3d, 0xbe, 0x2a, 0x3c, 0xc9, 0x3d, 0x61, 0xd4, 0x7e, 0xbe,
- 0xd6, 0xc5, 0x1e, 0x3f, 0xcf, 0xb1, 0xaa, 0x3e, 0xde, 0x67, 0xf3, 0xbe,
- 0x9c, 0x3d, 0x16, 0xbf, 0x74, 0xe9, 0x28, 0xbf, 0x13, 0xe2, 0x33, 0xbe,
- 0x14, 0x02, 0xe4, 0x3e, 0xec, 0x0e, 0x07, 0x3f, 0x6c, 0x66, 0x1b, 0xbf,
- 0x9f, 0xe3, 0xc9, 0x3e, 0x52, 0x2b, 0x65, 0x3e, 0xdd, 0x94, 0x46, 0x3f,
- 0x26, 0x0a, 0x9d, 0xbf, 0x35, 0x48, 0x29, 0x3e, 0x11, 0x7e, 0x00, 0xbe,
- 0x3a, 0x3b, 0x1c, 0xbe, 0x0f, 0x96, 0x7f, 0xbe, 0xb8, 0x31, 0x5b, 0xbf,
- 0x0b, 0x27, 0xba, 0x3e, 0x2e, 0x9e, 0xc9, 0xbb, 0xbb, 0xb0, 0x56, 0xbe,
- 0x96, 0xd5, 0x1d, 0x3f, 0x66, 0x56, 0x1d, 0x3f, 0x75, 0x86, 0x74, 0x3c,
- 0xbf, 0x57, 0x63, 0x3f, 0x5a, 0x28, 0x51, 0xbe, 0xd6, 0x83, 0xd2, 0xbe,
- 0x82, 0xa8, 0x1d, 0x3e, 0xd8, 0xc7, 0xcf, 0xbe, 0xcf, 0xaf, 0x7c, 0x3e,
- 0x62, 0x54, 0x65, 0x3d, 0xcb, 0xda, 0x69, 0x3d, 0x55, 0x72, 0xad, 0xbd,
- 0x4d, 0x31, 0x64, 0x3e, 0x57, 0xee, 0xd9, 0xbe, 0x9b, 0xc0, 0x7d, 0x3f,
- 0x5a, 0xe4, 0xa2, 0xbf, 0xa5, 0xf3, 0x1b, 0x3e, 0xc2, 0xbd, 0x8b, 0xbd,
- 0xd9, 0x5b, 0x84, 0xbd, 0x85, 0x82, 0x92, 0xbd, 0x9a, 0xfd, 0xe6, 0x3e,
- 0xbd, 0x63, 0xb7, 0xbe, 0xc0, 0x18, 0x09, 0xbd, 0x1d, 0xb3, 0xda, 0xbe,
- 0xd7, 0x98, 0x1e, 0xbf, 0x8b, 0xe0, 0xe9, 0x3d, 0x20, 0x1b, 0x01, 0xbf,
- 0xd7, 0x64, 0xcf, 0x3e, 0xdb, 0x66, 0x0a, 0x3e, 0xeb, 0xe6, 0xa9, 0xbe,
- 0x20, 0x28, 0x2a, 0x3f, 0xd7, 0xb0, 0x84, 0xbd, 0xe9, 0xb0, 0x89, 0xbd,
- 0x50, 0x10, 0x87, 0x3d, 0x30, 0x17, 0xb2, 0xbd, 0x3f, 0x60, 0x02, 0xbd,
- 0xd8, 0x22, 0x86, 0x3d, 0x92, 0xf5, 0xd7, 0xbe, 0x09, 0xb1, 0x8c, 0x3d,
- 0xea, 0x90, 0xaa, 0xbd, 0x8b, 0xcd, 0x0f, 0xbf, 0xa3, 0xd0, 0xe5, 0xbe,
- 0xe4, 0x43, 0x80, 0xbe, 0xa4, 0xbb, 0x9c, 0x3d, 0x6d, 0xf3, 0x6b, 0x3e,
- 0xed, 0x38, 0x34, 0x3f, 0x10, 0x3d, 0x1c, 0xbb, 0x78, 0x71, 0xd1, 0xbe,
- 0xc7, 0x73, 0x29, 0xbf, 0x6e, 0x87, 0x0e, 0xbd, 0xd9, 0x6b, 0x1f, 0x3f,
- 0xf4, 0x97, 0x7e, 0xbd, 0xf1, 0x37, 0x2c, 0x3e, 0x2d, 0xa2, 0xac, 0xbc,
- 0x8f, 0xb7, 0x40, 0xbe, 0x28, 0x8f, 0x6b, 0xbe, 0x87, 0xbf, 0x6e, 0x3e,
- 0x7e, 0xf7, 0x75, 0x3d, 0x1d, 0x58, 0xce, 0xbe, 0x44, 0xf8, 0x2b, 0xbe,
- 0x78, 0xbf, 0x29, 0x3f, 0x6d, 0x60, 0x54, 0x3e, 0xcc, 0x1d, 0x45, 0xbe,
- 0x5c, 0x84, 0xb7, 0xbe, 0x63, 0x63, 0x1f, 0xbe, 0x0c, 0x21, 0x67, 0xbe,
- 0x77, 0x0b, 0xdc, 0xbc, 0x3f, 0xa3, 0x0b, 0x3f, 0x49, 0x1e, 0x81, 0xbe,
- 0xc1, 0xa8, 0x62, 0xbe, 0x6c, 0x84, 0xd7, 0xbd, 0xa7, 0x89, 0xa9, 0xbe,
- 0x9c, 0x35, 0xfd, 0x3d, 0xbb, 0x79, 0xba, 0xbd, 0xa8, 0x15, 0x93, 0xbd,
- 0x0b, 0x77, 0x9f, 0x3d, 0x60, 0xb5, 0xb5, 0xbd, 0x86, 0x9a, 0xec, 0x3d,
- 0x1d, 0x42, 0x95, 0xbd, 0xb9, 0xf8, 0x5a, 0x3e, 0xd0, 0xdd, 0x5d, 0xbe,
- 0xba, 0x3c, 0x8e, 0x3e, 0x3c, 0x08, 0x0b, 0xbe, 0x08, 0x55, 0x4c, 0xbe,
- 0xd0, 0xf5, 0xe7, 0xbd, 0xcb, 0xdf, 0x35, 0xbe, 0x00, 0x99, 0x95, 0xbc,
- 0x07, 0x50, 0x04, 0x3e, 0x6c, 0x7b, 0x17, 0x3d, 0x12, 0x24, 0x9f, 0x3d,
- 0xfd, 0x22, 0xdf, 0x3d, 0x46, 0x5b, 0x41, 0xbe, 0x88, 0x18, 0x49, 0xbe,
- 0xd7, 0xc6, 0x45, 0xbd, 0x4f, 0x2b, 0x0e, 0x3e, 0xd3, 0xde, 0xb3, 0xbe,
- 0xed, 0x72, 0x63, 0x3c, 0x35, 0xd5, 0xc3, 0x3c, 0xe8, 0x75, 0x22, 0xbe,
- 0x6e, 0x2a, 0xd0, 0x3d, 0xe9, 0x9a, 0x2b, 0x3d, 0x77, 0x15, 0xc9, 0xbd,
- 0xe6, 0xd0, 0x28, 0xbe, 0x4d, 0xf7, 0x8d, 0x3c, 0xff, 0x4e, 0x96, 0xbd,
- 0xff, 0x69, 0x6d, 0x3e, 0x25, 0x5d, 0x0c, 0x3d, 0x7e, 0x67, 0xcf, 0x3d,
- 0xc4, 0x7d, 0x9a, 0x3d, 0xf9, 0x55, 0xc0, 0xbd, 0x8c, 0x62, 0xfc, 0xbd,
- 0xbb, 0x7e, 0xa4, 0xbd, 0xe3, 0x3b, 0x19, 0x3e, 0x92, 0x42, 0x90, 0xbc,
- 0x0a, 0xcc, 0xed, 0xbc, 0xb9, 0x46, 0x0c, 0xbe, 0x74, 0x6f, 0x2f, 0x3d,
- 0xa4, 0x69, 0xb0, 0x3d, 0xe4, 0x84, 0x32, 0xbd, 0x05, 0x75, 0x80, 0x3e,
- 0x43, 0x86, 0xbd, 0xbd, 0xf1, 0x9e, 0x81, 0xbd, 0x5e, 0x7a, 0xe2, 0xbe,
- 0x8d, 0x8f, 0x0e, 0xbe, 0xc7, 0x9b, 0x6d, 0x3e, 0x61, 0xe6, 0x8a, 0xbd,
- 0x90, 0x64, 0xb0, 0xbd, 0x4a, 0x56, 0xdb, 0x3d, 0x67, 0xd4, 0x7a, 0xbd,
- 0xbf, 0x79, 0x77, 0xbd, 0x40, 0x50, 0x25, 0xbd, 0x2d, 0x53, 0x58, 0x3e,
- 0x95, 0x15, 0x1b, 0x3e, 0x65, 0x36, 0x56, 0xbe, 0x6b, 0x01, 0xe6, 0xbd,
- 0xee, 0xcb, 0xac, 0xbd, 0x74, 0x33, 0x3f, 0x3e, 0xef, 0x28, 0x9e, 0x3e,
- 0x74, 0x05, 0x1a, 0x3e, 0xea, 0x08, 0xdc, 0xbd, 0x9a, 0xc5, 0xb6, 0x3d,
- 0xa1, 0x42, 0x16, 0x3d, 0xcd, 0x33, 0xa1, 0x3d, 0xf9, 0x35, 0x2e, 0x3e,
- 0x35, 0x7b, 0x0c, 0x3d, 0x7a, 0x98, 0xb9, 0xbe, 0xe6, 0x79, 0xf1, 0x3d,
- 0x9a, 0xae, 0x0b, 0x3e, 0xca, 0xdb, 0x0c, 0xbe, 0xc7, 0xf9, 0xc5, 0xbd,
- 0xb5, 0xd9, 0xa0, 0xbd, 0xa5, 0x42, 0xa6, 0xbd, 0xe6, 0x62, 0x03, 0xbe,
- 0x9e, 0x45, 0x9f, 0xbd, 0x3e, 0x5b, 0x81, 0x3d, 0xe2, 0x62, 0xd6, 0xbc,
- 0xf1, 0xa6, 0x76, 0x3d, 0x73, 0x61, 0x86, 0x3e, 0xe4, 0x69, 0xb2, 0xbd,
- 0xd7, 0xd5, 0x3e, 0xbe, 0x38, 0x2d, 0x39, 0x3e, 0x91, 0x50, 0x4c, 0xbe,
- 0x18, 0x24, 0x6e, 0xbe, 0xa5, 0x65, 0xe7, 0xbd, 0x03, 0x89, 0x7e, 0x3e,
- 0x3d, 0x22, 0x2d, 0xbe, 0x9d, 0x25, 0xc4, 0x3b, 0xf3, 0xde, 0xa2, 0x3d,
- 0xe2, 0xbe, 0x26, 0xbe, 0x6d, 0x1d, 0xf1, 0xbd, 0x86, 0xaf, 0x44, 0x3d,
- 0xdd, 0x40, 0xe3, 0xbe, 0x7e, 0x44, 0x74, 0x3d, 0x5b, 0x89, 0xba, 0xbd,
- 0x0a, 0xb7, 0x1c, 0x3d, 0xd9, 0x4f, 0x31, 0x3d, 0x56, 0x71, 0x24, 0x3e,
- 0x32, 0x41, 0x29, 0x3d, 0x29, 0x19, 0xf4, 0x3d, 0xf7, 0xaf, 0xd4, 0xbe,
- 0xb5, 0x3b, 0xd0, 0xbc, 0x58, 0x3c, 0x32, 0xbe, 0xc4, 0x4f, 0x22, 0xbe,
- 0x03, 0x7a, 0xeb, 0xbd, 0x79, 0x3d, 0x85, 0xbd, 0x7b, 0x97, 0xd3, 0x3c,
- 0xf0, 0x36, 0x17, 0xbf, 0x06, 0xf4, 0xaa, 0x3f, 0xbe, 0xa8, 0x1b, 0xbc,
- 0x55, 0xc9, 0xf3, 0x3e, 0x41, 0x36, 0xa9, 0x3d, 0x50, 0xc2, 0x56, 0x3f,
- 0x0a, 0x16, 0x9c, 0x3d, 0x2a, 0xb6, 0xd5, 0x3e, 0x14, 0x03, 0xeb, 0xbe,
- 0xc3, 0x54, 0x11, 0xbf, 0x1d, 0x92, 0x9f, 0x3e, 0xba, 0xe5, 0x2f, 0xbe,
- 0xc7, 0xa9, 0x01, 0x3d, 0xfe, 0x3b, 0xe0, 0x3e, 0x63, 0xb2, 0x10, 0xbf,
- 0xb3, 0x4b, 0xa3, 0xbe, 0x18, 0x7f, 0x82, 0x3e, 0x43, 0x43, 0x08, 0xbf,
- 0xe4, 0x2d, 0x0c, 0xbf, 0x0d, 0x51, 0x7d, 0xbe, 0xa2, 0xa7, 0xf0, 0x3e,
- 0x6b, 0xb8, 0x01, 0x3f, 0x03, 0x87, 0xd4, 0xbe, 0x57, 0x2a, 0x2e, 0xbe,
- 0xa7, 0xfd, 0xb7, 0xbe, 0xfb, 0xcd, 0x71, 0x3e, 0x65, 0xae, 0xc6, 0xbe,
- 0x4f, 0x1a, 0xa9, 0xbf, 0x8d, 0x83, 0xd8, 0xbd, 0x9a, 0xb2, 0x2d, 0xbe,
- 0x45, 0xa8, 0x22, 0x3f, 0xe6, 0x50, 0x4b, 0xbf, 0x5d, 0x15, 0x07, 0xbe,
- 0x66, 0xb3, 0x08, 0x3f, 0x35, 0x93, 0x38, 0x3e, 0x30, 0x8c, 0xfc, 0xbe,
- 0x66, 0xaa, 0x60, 0x3e, 0x5f, 0xc9, 0x65, 0xbe, 0x40, 0x9d, 0xab, 0x3e,
- 0x3f, 0x99, 0x2b, 0xbf, 0x43, 0xcf, 0xad, 0x3b, 0xdd, 0x63, 0xa4, 0x3d,
- 0xf4, 0x0e, 0xa9, 0xbe, 0xad, 0x97, 0x13, 0xbd, 0xe1, 0x7e, 0x89, 0x3f,
- 0x9f, 0x2b, 0x08, 0xbe, 0x9f, 0x85, 0x23, 0xbe, 0xae, 0xb2, 0xa2, 0x3d,
- 0xec, 0xac, 0x84, 0x3e, 0x9d, 0xc2, 0x1e, 0xbe, 0x33, 0x9d, 0x2a, 0x3e,
- 0x64, 0xf0, 0x80, 0xbe, 0xfa, 0xc4, 0x57, 0x3f, 0xe0, 0x0b, 0xcf, 0xbe,
- 0xbd, 0xb5, 0xf1, 0x3b, 0x00, 0x83, 0x6c, 0xbd, 0x5b, 0xd8, 0x05, 0xbd,
- 0x0e, 0x17, 0x2f, 0x3b, 0xc6, 0xc3, 0x1d, 0xbf, 0xc1, 0x96, 0x06, 0x3f,
- 0xd3, 0x7c, 0xd3, 0x3e, 0x08, 0xb3, 0xd8, 0x3e, 0x35, 0xa6, 0x4a, 0x3e,
- 0x23, 0x30, 0x0e, 0xbf, 0xed, 0x12, 0x7e, 0xbd, 0x66, 0xe5, 0xcf, 0x3c,
- 0x64, 0x7c, 0xab, 0xbd, 0xcd, 0x2c, 0x99, 0x3e, 0x29, 0x3a, 0x33, 0xbf,
- 0x80, 0x9b, 0x07, 0x3e, 0xf9, 0xbc, 0x11, 0x3e, 0x46, 0x14, 0xb0, 0x3d,
- 0xdd, 0xc7, 0x63, 0xbe, 0xde, 0xd2, 0xda, 0xbd, 0x89, 0xce, 0x21, 0xbf,
- 0x4f, 0x1c, 0xc5, 0x3e, 0x28, 0x9f, 0xd7, 0xbc, 0xb0, 0x54, 0x28, 0xbf,
- 0xbc, 0x28, 0x84, 0xbe, 0x52, 0xb1, 0x0c, 0xbe, 0x81, 0xf5, 0xaa, 0x3d,
- 0xa9, 0x55, 0x02, 0x3c, 0x78, 0x1e, 0xa0, 0x3e, 0xcf, 0x43, 0x3f, 0xbc,
- 0xfb, 0xd3, 0x90, 0xbd, 0xf9, 0x45, 0x04, 0x3f, 0xba, 0x62, 0x08, 0x3f,
- 0xb5, 0x38, 0x05, 0xbb, 0x4f, 0xc1, 0x7e, 0x3d, 0x32, 0x5a, 0xde, 0xbe,
- 0x2d, 0xdd, 0x88, 0x3e, 0x6c, 0xcb, 0x42, 0xbe, 0x81, 0x2c, 0x85, 0xbd,
- 0xbc, 0xeb, 0x4c, 0xbe, 0x86, 0x2b, 0x86, 0x3e, 0xbb, 0xe7, 0x0b, 0x3e,
- 0x37, 0x80, 0xfc, 0xbb, 0xc1, 0xdf, 0xb0, 0xbe, 0x58, 0x62, 0x08, 0x3f,
- 0xa2, 0x12, 0x93, 0xbe, 0x65, 0x27, 0xed, 0xbe, 0x54, 0x91, 0x54, 0x3d,
- 0x5d, 0xa3, 0xeb, 0xbe, 0xfc, 0x98, 0x53, 0xbe, 0xa1, 0x89, 0xcc, 0xbe,
- 0xf4, 0x21, 0x1e, 0x3d, 0xd6, 0x09, 0x05, 0x3f, 0x28, 0x81, 0x0d, 0x3f,
- 0xfc, 0x30, 0xf4, 0x3d, 0x5a, 0xf8, 0x00, 0xbd, 0xb2, 0x00, 0xca, 0xbe,
- 0xdf, 0x63, 0x86, 0x3e, 0x7f, 0xd3, 0x54, 0xbe, 0xcc, 0x1d, 0x67, 0xbd,
- 0xb2, 0x2b, 0x1c, 0xbe, 0xf2, 0x5e, 0x2d, 0x3e, 0x0c, 0x89, 0x64, 0xbe,
- 0xcd, 0xe7, 0xd1, 0x3d, 0xf3, 0x60, 0x13, 0xbe, 0x2a, 0xf9, 0xb2, 0xbe,
- 0xc8, 0xb6, 0x9c, 0xbe, 0x20, 0x6e, 0x69, 0xbc, 0x47, 0xd5, 0x27, 0x3e,
- 0xe6, 0x94, 0x6b, 0x3e, 0x79, 0x7e, 0xec, 0x3e, 0x11, 0xe6, 0x0e, 0x3e,
- 0x81, 0x69, 0xe1, 0x3d, 0x74, 0x3f, 0x9f, 0x3e, 0x78, 0x5f, 0xa4, 0xbd,
- 0xbf, 0x3f, 0x24, 0x3d, 0x9d, 0x22, 0x8d, 0x3e, 0x3d, 0x15, 0x26, 0x3e,
- 0xfc, 0xb3, 0x6e, 0xbb, 0xe4, 0x45, 0x90, 0x3e, 0xec, 0xd6, 0x95, 0xbd,
- 0x8f, 0x4e, 0xa6, 0x3d, 0x6c, 0x1d, 0xb4, 0x3e, 0xc3, 0x5b, 0xf7, 0xbd,
- 0x2d, 0x66, 0x91, 0x3e, 0xe6, 0x00, 0x7d, 0xbe, 0xe9, 0x90, 0x12, 0x3e,
- 0xc0, 0xda, 0x3d, 0x3e, 0xc1, 0xf0, 0x87, 0xbe, 0x45, 0x79, 0x29, 0x3d,
- 0x01, 0x0e, 0xb8, 0x3c, 0x5a, 0xf9, 0x9c, 0xbd, 0x71, 0xb5, 0x0f, 0xbe,
- 0x70, 0x04, 0xf8, 0x3c, 0x25, 0x76, 0x1a, 0xbe, 0x37, 0xec, 0x63, 0xbd,
- 0x28, 0xaf, 0x91, 0x3d, 0x49, 0xb0, 0xca, 0x3e, 0x5a, 0xea, 0xb1, 0x3d,
- 0x0b, 0xac, 0x5c, 0xbe, 0x1c, 0xa6, 0x99, 0x3d, 0xc7, 0x8f, 0x7a, 0xbe,
- 0x38, 0x5c, 0x1e, 0xbe, 0x83, 0x10, 0x8f, 0xbc, 0x4e, 0x99, 0x4a, 0x3d,
- 0xc5, 0x55, 0xce, 0xbe, 0xbf, 0xa6, 0x0b, 0x3e, 0xf8, 0xda, 0x03, 0xbd,
- 0xb3, 0x68, 0x39, 0x3e, 0xb7, 0x57, 0x1f, 0xbd, 0xdf, 0x97, 0x39, 0x3d,
- 0xa9, 0xa7, 0x29, 0x3e, 0x0f, 0x54, 0xaf, 0xbe, 0xd5, 0xe2, 0x07, 0xbf,
- 0x8e, 0xe3, 0x21, 0x3e, 0x8b, 0xac, 0xc7, 0x3d, 0x44, 0xcb, 0x78, 0xbe,
- 0x25, 0x84, 0xc5, 0xbd, 0x35, 0xaf, 0x29, 0xbe, 0x70, 0x52, 0x85, 0xbd,
- 0xd2, 0x26, 0xa5, 0xbd, 0xca, 0x74, 0x81, 0xbd, 0xb6, 0x8c, 0x86, 0xbd,
- 0x7b, 0x33, 0x47, 0xbe, 0xc9, 0x04, 0x42, 0x3e, 0xc9, 0x5b, 0xf3, 0x3d,
- 0x28, 0x18, 0x90, 0xbe, 0x77, 0x1c, 0x55, 0x3e, 0x04, 0xe8, 0xf7, 0xbd,
- 0x9c, 0xd1, 0xe0, 0xbd, 0xf7, 0xf9, 0x73, 0xbe, 0xa6, 0xc0, 0x2b, 0xbd,
- 0xf1, 0xc1, 0x91, 0xbe, 0xe4, 0x35, 0x27, 0x3e, 0x12, 0x5a, 0x36, 0x3e,
- 0x1c, 0xe3, 0x3c, 0xbc, 0x2c, 0x90, 0x6f, 0xbd, 0x53, 0x9c, 0x08, 0xbd,
- 0x99, 0x81, 0xce, 0x3e, 0xa0, 0x7d, 0x09, 0xbe, 0x87, 0xcd, 0x93, 0x3e,
- 0xb0, 0xa8, 0xb7, 0x3e, 0x29, 0x98, 0x1d, 0xbe, 0xb7, 0xaf, 0x12, 0xbe,
- 0x11, 0x8f, 0x9b, 0x3d, 0x79, 0x50, 0xc2, 0x3c, 0x6e, 0x56, 0xcb, 0xbd,
- 0xdf, 0xb3, 0xcf, 0xbd, 0x23, 0x0a, 0x35, 0xbe, 0x00, 0xf7, 0x77, 0xbd,
- 0x10, 0x51, 0xb4, 0x3e, 0x97, 0xe5, 0x89, 0xbd, 0xef, 0x46, 0x4c, 0x3e,
- 0x17, 0xd9, 0xac, 0xbd, 0x3c, 0xa9, 0xd5, 0x3c, 0xdf, 0x54, 0x43, 0x3e,
- 0x0d, 0x3c, 0x3f, 0xbe, 0x92, 0x3d, 0x95, 0x3e, 0xdc, 0x05, 0xdc, 0xbd,
- 0x5d, 0xa4, 0x34, 0xbe, 0x21, 0xfe, 0x4e, 0xbe, 0xab, 0xac, 0x4d, 0x3e,
- 0xe9, 0x7d, 0xb3, 0x3d, 0xa0, 0xd9, 0x6d, 0x3e, 0xd1, 0xd8, 0x4a, 0xbd,
- 0xc4, 0x22, 0xc7, 0xbe, 0xa7, 0x9c, 0x8c, 0xbc, 0x56, 0x7c, 0x3b, 0x3e,
- 0x98, 0x82, 0x1f, 0xbe, 0x71, 0x82, 0x64, 0x3e, 0x78, 0xed, 0xa2, 0xbd,
- 0x4b, 0x9b, 0xc1, 0xbe, 0x59, 0x39, 0x2c, 0x3d, 0xc6, 0xe8, 0x92, 0xbe,
- 0x59, 0xeb, 0x39, 0xbe, 0xf1, 0x9d, 0x0c, 0xbd, 0xb7, 0x63, 0xc8, 0xbd,
- 0x1d, 0x06, 0x4f, 0xbe, 0x47, 0xee, 0xae, 0xbd, 0x27, 0x57, 0xe4, 0xbd,
- 0x0e, 0x96, 0xe4, 0x3d, 0x79, 0xe4, 0x2e, 0xbe, 0x8f, 0x91, 0xdd, 0xbd,
- 0x70, 0x8c, 0xf3, 0x3c, 0x8b, 0xa6, 0xf5, 0xbd, 0x74, 0xca, 0x5e, 0x3d,
- 0xfa, 0x82, 0xe8, 0xbe, 0xad, 0xc0, 0x8c, 0xbe, 0x8a, 0x6b, 0x03, 0xbc,
- 0x59, 0xb7, 0x23, 0xbe, 0xb2, 0x20, 0x4b, 0x3d, 0x15, 0x7b, 0xb1, 0xbd,
- 0x81, 0xa4, 0x92, 0x3e, 0x4b, 0x7d, 0xd5, 0x3d, 0x73, 0x8e, 0xce, 0xbe,
- 0xc9, 0x48, 0x95, 0x3e, 0x8a, 0x1c, 0x65, 0xbe, 0x4a, 0xd2, 0x64, 0xbe,
- 0xa6, 0xdd, 0xcb, 0xbe, 0xe6, 0xe8, 0x36, 0x3f, 0x11, 0x95, 0xa2, 0xbd,
- 0x8d, 0xc9, 0xec, 0x3e, 0xa0, 0x62, 0xe0, 0xbd, 0x5b, 0x41, 0xd1, 0x3d,
- 0x29, 0x57, 0x22, 0x3e, 0xdc, 0xb5, 0x28, 0x3d, 0xfb, 0x9b, 0xc3, 0x3d,
- 0x00, 0x3d, 0x66, 0xbb, 0xca, 0xef, 0x3f, 0xbd, 0x5c, 0x4f, 0x58, 0x3d,
- 0x6a, 0xce, 0x2f, 0x3e, 0xd4, 0xe8, 0x5f, 0x3c, 0x0d, 0xbe, 0x35, 0xbd,
- 0xc3, 0xa8, 0x03, 0xbd, 0x3e, 0xe6, 0xc4, 0x3e, 0x67, 0xf5, 0x4d, 0xbe,
- 0xee, 0xf3, 0x17, 0x3e, 0x0f, 0xf9, 0x93, 0xbe, 0xb0, 0x9b, 0x7b, 0xbe,
- 0xef, 0xfd, 0xde, 0xbd, 0xe0, 0x91, 0xe6, 0xbd, 0x2b, 0xb7, 0x04, 0xbe,
- 0x42, 0xd8, 0x69, 0xbe, 0xc9, 0xb3, 0xc8, 0x3e, 0x1e, 0x2f, 0x36, 0x3e,
- 0xca, 0xbb, 0x9c, 0x3e, 0x20, 0xe4, 0x19, 0x3d, 0x60, 0xb4, 0x9f, 0x3d,
- 0x25, 0x8e, 0x23, 0x3e, 0xe5, 0xae, 0x9f, 0xbe, 0x8f, 0x63, 0x19, 0xbd,
- 0xc2, 0xc2, 0xf4, 0xbd, 0x50, 0x94, 0xb2, 0x3e, 0x15, 0xb8, 0x3c, 0xbd,
- 0x94, 0x2b, 0xde, 0xbc, 0xc3, 0x1f, 0xe5, 0x3d, 0x1d, 0x09, 0xcc, 0xbd,
- 0xbd, 0xaf, 0x23, 0xbd, 0xb7, 0x83, 0x96, 0xbe, 0x55, 0xa1, 0xaa, 0x3e,
- 0xb4, 0x2a, 0xf2, 0xbd, 0x42, 0x36, 0x7a, 0x3e, 0x1d, 0x82, 0xcb, 0xbd,
- 0x00, 0x22, 0xce, 0xbd, 0x05, 0x93, 0x18, 0x3e, 0xce, 0x66, 0x15, 0x3b,
- 0x1a, 0x3b, 0x2f, 0xbb, 0x39, 0x9f, 0xb1, 0xbe, 0xc2, 0x26, 0x54, 0xbe,
- 0x32, 0xc8, 0x73, 0xbe, 0x7f, 0x50, 0xb1, 0xba, 0xf8, 0x9c, 0x38, 0x3a,
- 0x65, 0xa7, 0x0a, 0xbe, 0x2f, 0xcc, 0xd7, 0x3b, 0x14, 0x72, 0xa4, 0x3d,
- 0x4d, 0xc1, 0xc8, 0xbc, 0x10, 0xf5, 0x53, 0xbe, 0x39, 0x6f, 0x7c, 0x3e,
- 0xb1, 0x05, 0xd0, 0x3e, 0x22, 0x35, 0x38, 0x3d, 0xd9, 0x64, 0xf7, 0xbd,
- 0x55, 0xe6, 0xa5, 0xbd, 0xdd, 0xde, 0xf6, 0x3d, 0x70, 0xe5, 0x80, 0x3e,
- 0xef, 0xca, 0x46, 0xbd, 0x29, 0x34, 0x81, 0x3e, 0xd7, 0x75, 0x31, 0xbe,
- 0x7d, 0xc1, 0x47, 0xbf, 0x29, 0xdd, 0xb3, 0xbc, 0x64, 0x7c, 0x85, 0x3d,
- 0xda, 0x69, 0xec, 0xbd, 0x71, 0x4e, 0xec, 0xbe, 0xc7, 0x2f, 0xa8, 0x3e,
- 0x38, 0x1d, 0xd9, 0xbe, 0x40, 0x7b, 0xc4, 0x3e, 0x26, 0x0f, 0x6e, 0x3d,
- 0x57, 0x4b, 0x81, 0x3d, 0xf6, 0x35, 0xfb, 0xbc, 0xd5, 0x70, 0xcd, 0xbc,
- 0xf1, 0x02, 0x87, 0x3e, 0x18, 0x0c, 0x94, 0x3e, 0x06, 0x76, 0xbd, 0xbd,
- 0xcb, 0x42, 0xa6, 0xbe, 0xa0, 0xd1, 0x55, 0x3d, 0x49, 0xbd, 0x80, 0x3e,
- 0x84, 0x85, 0x38, 0xbe, 0xbe, 0xb9, 0x2e, 0xbe, 0x3b, 0x14, 0xce, 0x3e,
- 0x38, 0x4e, 0x47, 0x3b, 0x29, 0x72, 0xb2, 0xbb, 0x8f, 0xda, 0x07, 0xbe,
- 0x6a, 0x57, 0x0a, 0x3e, 0xa0, 0xe5, 0x12, 0xbd, 0xa7, 0x1b, 0x45, 0xbd,
- 0x7b, 0x53, 0x38, 0xbd, 0x82, 0xc4, 0xc7, 0xbe, 0x02, 0x0f, 0x6b, 0x3e,
- 0x2f, 0x29, 0x1f, 0x3f, 0x3f, 0xea, 0xa9, 0x3e, 0x73, 0x8b, 0x98, 0xbc,
- 0x07, 0xf3, 0xd2, 0xbe, 0xef, 0x18, 0x78, 0xbd, 0x45, 0x12, 0x41, 0x3e,
- 0xff, 0x78, 0x2e, 0xbe, 0x0c, 0xc1, 0x97, 0xbe, 0xee, 0x23, 0x1a, 0xbf,
- 0x03, 0x96, 0xfe, 0x3e, 0x09, 0xb3, 0x99, 0xbe, 0x4d, 0xf6, 0xda, 0x3e,
- 0x0d, 0x11, 0xa3, 0x3e, 0x3b, 0xed, 0x2f, 0x3f, 0x29, 0x32, 0x3e, 0x3e,
- 0xe1, 0x4b, 0x82, 0xbe, 0xaf, 0xbc, 0x54, 0xbf, 0x34, 0x5b, 0x93, 0xbe,
- 0x29, 0x30, 0xa2, 0x3c, 0xfa, 0xfe, 0xbc, 0xbf, 0x98, 0xac, 0x08, 0xbf,
- 0x96, 0x26, 0x69, 0x3e, 0xa1, 0x5b, 0xac, 0x3f, 0x86, 0xe4, 0x62, 0x3d,
- 0x18, 0x76, 0x7e, 0x3e, 0x67, 0xf1, 0x49, 0x3e, 0xa3, 0x6a, 0x34, 0xbe,
- 0x77, 0xe9, 0x46, 0x3d, 0xb4, 0x09, 0xcd, 0x3d, 0x62, 0xff, 0xff, 0xbe,
- 0x6d, 0x9e, 0x3e, 0xbf, 0x92, 0xb7, 0x80, 0xbf, 0x68, 0xae, 0x06, 0xbe,
- 0xc6, 0x43, 0x7a, 0x3e, 0x7d, 0x79, 0x1d, 0x3e, 0x73, 0x57, 0xef, 0xbe,
- 0x2e, 0x3d, 0x5b, 0x3e, 0xda, 0x1a, 0x25, 0xbf, 0x3b, 0x8d, 0xb6, 0xbe,
- 0x9f, 0xa4, 0xe2, 0xbd, 0x63, 0xf3, 0x84, 0x3c, 0x0e, 0xda, 0x78, 0x3d,
- 0xf3, 0x5e, 0x3b, 0xbc, 0x1b, 0x27, 0x2b, 0xbf, 0x6c, 0x40, 0x5d, 0x3e,
- 0x31, 0x95, 0x95, 0x3e, 0x45, 0x1d, 0x90, 0xbe, 0x09, 0x37, 0x57, 0xbb,
- 0x7c, 0xb9, 0x00, 0x3f, 0x4b, 0xb0, 0x28, 0x3e, 0x62, 0x38, 0x8c, 0x3e,
- 0x7a, 0xd0, 0x3a, 0xbf, 0x93, 0x7c, 0x9b, 0xbe, 0x70, 0xa3, 0x19, 0xbd,
- 0x17, 0x4e, 0x24, 0xbc, 0x27, 0x9e, 0x35, 0x3f, 0x50, 0x2b, 0x9a, 0xbe,
- 0x02, 0x2e, 0x5f, 0x3d, 0xde, 0xe3, 0x94, 0x3e, 0xf3, 0x14, 0xae, 0x3e,
- 0x5f, 0xfe, 0x73, 0xbe, 0x2f, 0xd1, 0x0d, 0xbf, 0xbd, 0x2a, 0x87, 0x3f,
- 0x74, 0x8f, 0x3a, 0xbe, 0x87, 0x64, 0xf0, 0x3e, 0x1d, 0x32, 0x5f, 0x3d,
- 0xcc, 0xb3, 0xb0, 0xbd, 0xd7, 0x11, 0x66, 0xbe, 0x29, 0x83, 0xc3, 0xbe,
- 0xdf, 0x95, 0xdd, 0xbf, 0x39, 0xc3, 0x23, 0xbe, 0x6d, 0x80, 0x79, 0xbe,
- 0x3b, 0x74, 0xd2, 0x3c, 0x2c, 0x24, 0x8d, 0xbd, 0x6e, 0x3a, 0x08, 0x3f,
- 0x31, 0xb2, 0x88, 0x3d, 0x18, 0x11, 0x8e, 0xbe, 0x92, 0xa3, 0xcb, 0xbe,
- 0x68, 0x14, 0x04, 0x3f, 0x90, 0x87, 0xad, 0xbc, 0xa3, 0x27, 0xc4, 0x3d,
- 0x8b, 0x60, 0x5b, 0x3a, 0x02, 0x43, 0x1e, 0x3e, 0x87, 0xa9, 0xc0, 0x3e,
- 0x0b, 0x34, 0x8b, 0xbc, 0xd6, 0x65, 0x4e, 0xbf, 0xb6, 0x59, 0x31, 0x3e,
- 0x81, 0x8f, 0x96, 0x3e, 0x64, 0x73, 0xc0, 0x3e, 0x4d, 0x9c, 0x47, 0xbf,
- 0xe6, 0xd2, 0x3b, 0xbe, 0xf2, 0x2d, 0x58, 0x3f, 0xe1, 0x02, 0x4d, 0xbf,
- 0x66, 0x00, 0xdb, 0xbd, 0x24, 0xe2, 0xf2, 0x3e, 0x23, 0x58, 0x1c, 0xbc,
- 0xe4, 0xca, 0xb1, 0x3d, 0xd0, 0xc2, 0x03, 0x3f, 0xb7, 0xdd, 0x4f, 0x3f,
- 0x78, 0xc0, 0x3c, 0x3f, 0xe6, 0xa4, 0x6e, 0x3f, 0x9c, 0x1d, 0x26, 0xbe,
- 0xda, 0xbb, 0xa1, 0xbe, 0xcb, 0x60, 0xbd, 0x3d, 0xaf, 0xa8, 0x0c, 0xbf,
- 0x0c, 0x3c, 0xc2, 0xbd, 0x09, 0x81, 0xd7, 0x3e, 0xc0, 0x54, 0x55, 0xbf,
- 0x05, 0x4b, 0xfb, 0x3d, 0x82, 0xbd, 0xfb, 0x3d, 0x89, 0x68, 0xa5, 0xbe,
- 0xc4, 0x77, 0xe0, 0xbe, 0x39, 0x37, 0xe8, 0xbd, 0xe3, 0x1c, 0x9c, 0xbd,
- 0x14, 0x71, 0xfc, 0x3d, 0xce, 0x73, 0xf1, 0x3e, 0x74, 0x3e, 0x9a, 0x3c,
- 0x7c, 0xd5, 0x93, 0x3c, 0x18, 0x27, 0x81, 0xbe, 0xde, 0x67, 0xdd, 0xbe,
- 0xdf, 0x32, 0x06, 0x3d, 0xc5, 0x18, 0x0a, 0xbe, 0x37, 0x51, 0x7e, 0xbd,
- 0xd5, 0x35, 0x00, 0xbd, 0x22, 0x9d, 0x1e, 0x3c, 0xf2, 0xe2, 0x94, 0x3a,
- 0xbf, 0xff, 0xe2, 0x3d, 0xc0, 0xd8, 0x6d, 0x3e, 0x4e, 0xda, 0x23, 0x3e,
- 0x19, 0xfa, 0x05, 0x3c, 0x10, 0xd1, 0x5f, 0x3d, 0x5a, 0x7e, 0x35, 0xbe,
- 0x87, 0xef, 0xc9, 0xbc, 0xc6, 0x02, 0xc3, 0x3b, 0x55, 0x68, 0x83, 0x3d,
- 0xd1, 0xf4, 0xa1, 0x3d, 0xec, 0x45, 0x5f, 0x3d, 0x8c, 0x25, 0x0a, 0x3d,
- 0xfd, 0x1a, 0xf9, 0xbd, 0xe5, 0x96, 0x7c, 0xbd, 0xfd, 0x6a, 0x34, 0x39,
- 0xd4, 0x86, 0x26, 0xbd, 0x3e, 0x2d, 0x75, 0x3e, 0xd6, 0x2e, 0x9c, 0xbe,
- 0x56, 0x6c, 0xb3, 0x3d, 0x1b, 0x9f, 0x96, 0x3d, 0x06, 0x2a, 0xd7, 0xbd,
- 0x64, 0xe5, 0x4a, 0x3e, 0x3c, 0x87, 0xa8, 0x3c, 0x6e, 0x0d, 0xe1, 0xbd,
- 0x51, 0x10, 0xc5, 0x3d, 0x0a, 0x2f, 0xab, 0x3d, 0xb9, 0x44, 0x41, 0x3c,
- 0xce, 0xe9, 0xe8, 0x3d, 0x3a, 0x1b, 0xb6, 0xbc, 0xf9, 0x4c, 0x3c, 0xbe,
- 0x91, 0xf6, 0x49, 0xbd, 0xee, 0x89, 0xe7, 0xbd, 0xf2, 0xaa, 0x1f, 0x3d,
- 0x2e, 0x1e, 0xa8, 0xbd, 0xbe, 0x65, 0xbd, 0x3d, 0x4e, 0x95, 0x54, 0x3d,
- 0x00, 0x6a, 0xff, 0xbc, 0xb0, 0x17, 0x97, 0xbe, 0xeb, 0x42, 0x1e, 0xbe,
- 0xb2, 0xbf, 0xfb, 0xbc, 0xee, 0xe5, 0x81, 0xbe, 0x24, 0xa7, 0xb6, 0xbc,
- 0x0c, 0xd5, 0x90, 0xbe, 0x8d, 0x8c, 0x0a, 0xbe, 0x72, 0x56, 0x0b, 0xbe,
- 0xe1, 0x7b, 0x0d, 0xbd, 0x98, 0x80, 0x54, 0x3e, 0x2b, 0x37, 0x3a, 0x3e,
- 0x1d, 0xf6, 0x95, 0xbd, 0xd9, 0xe2, 0x0a, 0xbe, 0x3c, 0xa2, 0xb6, 0xbd,
- 0xfa, 0x43, 0xad, 0x3d, 0xbe, 0x87, 0xeb, 0xbd, 0xa1, 0x98, 0x19, 0x3e,
- 0xff, 0x5b, 0x4c, 0x3e, 0xc1, 0xc5, 0x90, 0xbe, 0xc5, 0xf1, 0x69, 0xbb,
- 0xb3, 0x51, 0x76, 0xbd, 0x66, 0x4b, 0x10, 0x3e, 0x5b, 0x72, 0x86, 0x3e,
- 0xa5, 0xf2, 0x31, 0x3d, 0x9b, 0xb2, 0x73, 0xbd, 0xc0, 0xab, 0x5f, 0x3d,
- 0xfd, 0x8d, 0x6f, 0x3c, 0xcb, 0xae, 0xac, 0xbd, 0xed, 0x30, 0x72, 0x3d,
- 0x58, 0x9b, 0x2d, 0xbd, 0xd2, 0x52, 0x04, 0xbd, 0x75, 0x16, 0x70, 0x3d,
- 0xda, 0x33, 0x59, 0x3c, 0xd3, 0x00, 0x12, 0xbe, 0xfa, 0xda, 0x5b, 0x3d,
- 0xbe, 0x19, 0xed, 0xbd, 0x07, 0x8c, 0xfa, 0xbd, 0xfb, 0xe8, 0xfb, 0x3d,
- 0xb5, 0xd3, 0x5a, 0xbc, 0xec, 0xaf, 0x02, 0x3d, 0xde, 0xbc, 0xad, 0xbd,
- 0x37, 0x07, 0x02, 0x3e, 0xc3, 0xf9, 0x4b, 0x3e, 0x1c, 0x52, 0x21, 0xbd,
- 0x15, 0x8b, 0x8a, 0xbe, 0xf8, 0x37, 0x81, 0x3e, 0x50, 0x16, 0x47, 0xbe,
- 0xc5, 0x9e, 0xeb, 0xbd, 0x4a, 0xb2, 0x08, 0xbe, 0x45, 0x98, 0xc0, 0x3d,
- 0xd5, 0xa5, 0xf9, 0x3c, 0x2d, 0x7e, 0xc0, 0x3c, 0x17, 0x09, 0xa3, 0xbb,
- 0xf2, 0xad, 0x5a, 0xbe, 0xb3, 0xb5, 0xb7, 0x3d, 0xd8, 0x57, 0x11, 0xba,
- 0x39, 0xdd, 0x16, 0xbf, 0x34, 0x11, 0x24, 0xbe, 0x01, 0x62, 0x97, 0xbd,
- 0x38, 0xf6, 0x22, 0xbe, 0x29, 0x58, 0x34, 0xbd, 0x17, 0x91, 0x83, 0x3e,
- 0x1c, 0x48, 0x95, 0xbc, 0x6f, 0x22, 0x08, 0xbe, 0x76, 0x7d, 0x74, 0xbe,
- 0x40, 0xdd, 0xad, 0x3d, 0xfb, 0xbe, 0x71, 0xbe, 0xc0, 0xf1, 0xef, 0xbd,
- 0xc3, 0xdc, 0x1d, 0xbe, 0x71, 0x82, 0x77, 0xbe, 0x88, 0x6d, 0x34, 0x3e,
- 0x5a, 0x93, 0xe5, 0xbe, 0x73, 0x3a, 0x88, 0x3f, 0x95, 0xbc, 0xd1, 0xbe,
- 0xc9, 0x65, 0xf2, 0x3e, 0x8e, 0x47, 0x71, 0xbc, 0x98, 0x4e, 0x48, 0x3f,
- 0x43, 0x72, 0x94, 0xbd, 0xdd, 0x33, 0xe1, 0x3e, 0xda, 0x3a, 0xfb, 0xbe,
- 0x09, 0x55, 0x3d, 0xbf, 0xc7, 0xad, 0x0c, 0x3f, 0x57, 0xc8, 0x18, 0x3d,
- 0xd5, 0x01, 0x50, 0x3d, 0x8f, 0x37, 0x04, 0x3f, 0xfb, 0x46, 0x17, 0xbf,
- 0x7c, 0x56, 0xfe, 0xbe, 0x26, 0xbb, 0x86, 0x3e, 0x75, 0xa4, 0x44, 0xbf,
- 0xbd, 0x22, 0xe4, 0xbe, 0x4d, 0x99, 0xe5, 0xbd, 0x30, 0x83, 0xf0, 0x3e,
- 0x98, 0xd9, 0x9b, 0x3e, 0xbb, 0xac, 0x12, 0xbe, 0xc0, 0x52, 0x06, 0x3e,
- 0x77, 0x47, 0xf5, 0xbe, 0xe2, 0x00, 0x29, 0x3e, 0xb9, 0xdc, 0xad, 0xbe,
- 0x61, 0x94, 0x9e, 0xbf, 0x73, 0x3c, 0x18, 0xbe, 0x18, 0x08, 0x71, 0xbe,
- 0x8f, 0x3d, 0x3e, 0x3f, 0x4e, 0x80, 0x3b, 0xbf, 0xee, 0x40, 0x88, 0x3d,
- 0x4c, 0xa1, 0x52, 0x3f, 0xf3, 0xb5, 0xd0, 0x3e, 0xf3, 0xea, 0x16, 0xbf,
- 0xbc, 0x5b, 0x4b, 0x3e, 0x78, 0x80, 0x85, 0xbe, 0x76, 0xa4, 0xa1, 0x3d,
- 0xb8, 0x44, 0x36, 0xbf, 0x7f, 0xb7, 0x8f, 0x3d, 0xd3, 0x53, 0x06, 0x3d,
- 0x34, 0x1b, 0x63, 0xbe, 0xd9, 0xc3, 0xff, 0xbd, 0x1b, 0x2c, 0x89, 0x3f,
- 0x65, 0x0b, 0x70, 0x3e, 0xea, 0x83, 0x67, 0xbe, 0x80, 0x8c, 0x57, 0x3d,
- 0x1a, 0x4b, 0x54, 0x3d, 0xb2, 0xcc, 0xc7, 0xbd, 0xfb, 0x04, 0x25, 0x3d,
- 0x87, 0x47, 0x35, 0xbe, 0xfb, 0x1f, 0x56, 0x3f, 0xa6, 0x0f, 0x73, 0xbe,
- 0xb2, 0x31, 0x06, 0xbe, 0xdd, 0xcf, 0xbb, 0xbe, 0xa1, 0xb0, 0x28, 0x3e,
- 0xd9, 0x6f, 0x6f, 0x3d, 0x82, 0xee, 0x00, 0xbf, 0xff, 0x1b, 0x0b, 0x3f,
- 0xba, 0x39, 0x14, 0x3f, 0x46, 0xc8, 0xce, 0x3e, 0xf0, 0x47, 0x2d, 0x3e,
- 0x79, 0x0e, 0x07, 0xbf, 0x97, 0x39, 0x9b, 0xbc, 0xb1, 0x70, 0x0d, 0xbe,
- 0x90, 0xc5, 0x10, 0x3d, 0x79, 0xcf, 0xa0, 0x3e, 0xdc, 0xad, 0x03, 0xbf,
- 0x00, 0x1c, 0xf1, 0xbd, 0x66, 0x72, 0xcd, 0x3c, 0xb6, 0x5f, 0x5e, 0xbd,
- 0xfb, 0x41, 0x91, 0xbe, 0x3a, 0x1d, 0xdd, 0xbd, 0x5b, 0x00, 0x3b, 0xbf,
- 0x9f, 0xa2, 0xd2, 0x3e, 0x2c, 0x4c, 0x7a, 0x3e, 0xff, 0x23, 0x32, 0xbf,
- 0x93, 0x3c, 0xc8, 0xbe, 0x50, 0x7a, 0x50, 0xbd, 0x45, 0xbf, 0xd6, 0xbc,
- 0xad, 0x8b, 0x06, 0xbe, 0x6b, 0x31, 0x7a, 0x3e, 0x4d, 0x1a, 0x34, 0xbe,
- 0xb2, 0xac, 0x4b, 0x3d, 0xdb, 0x97, 0xc6, 0x3e, 0x33, 0xc8, 0xa1, 0x3e,
- 0x3e, 0xc0, 0x2e, 0x3e, 0x39, 0x7a, 0x36, 0xbe, 0x03, 0xe3, 0xb8, 0xbe,
- 0x6e, 0xc5, 0x19, 0xbe, 0xc7, 0x01, 0x21, 0xbe, 0x43, 0x92, 0xf1, 0xbc,
- 0xe4, 0x4e, 0xe2, 0xbd, 0x16, 0x8d, 0x7a, 0x3e, 0x07, 0x72, 0xbb, 0x3d,
- 0x58, 0xb5, 0x36, 0x3d, 0xb5, 0xc4, 0x5c, 0xbe, 0x50, 0x49, 0x42, 0x3f,
- 0xe8, 0x18, 0xcd, 0xbd, 0xb7, 0x61, 0xd5, 0xbe, 0x9f, 0xc1, 0x29, 0xbe,
- 0x56, 0x01, 0x0c, 0xbf, 0xc8, 0xad, 0xa0, 0xbd, 0xac, 0xe0, 0xf0, 0xbe,
- 0xd2, 0x28, 0x75, 0x3d, 0xb2, 0x7b, 0x21, 0x3f, 0x0d, 0x65, 0x20, 0x3f,
- 0xe2, 0xdc, 0xa0, 0x3d, 0x1b, 0xf0, 0x7b, 0x3d, 0xd1, 0x85, 0x8f, 0xbe,
- 0x97, 0xb0, 0x2a, 0x3e, 0x77, 0x64, 0x55, 0xbe, 0x13, 0xaf, 0x6b, 0xbe,
- 0x7b, 0xc8, 0x06, 0x3d, 0x89, 0xa6, 0x34, 0xbc, 0x7f, 0x7f, 0x20, 0xbe,
- 0x6d, 0x2a, 0x8f, 0xbd, 0x3f, 0x7f, 0x0a, 0x3d, 0xa0, 0x51, 0xb6, 0xbd,
- 0xe2, 0xd7, 0x87, 0xbe, 0x5b, 0x47, 0xd0, 0x3d, 0x53, 0xd7, 0x04, 0xbc,
- 0x36, 0x96, 0x2e, 0x3d, 0x08, 0x02, 0xed, 0x3e, 0x57, 0xab, 0xe4, 0xbd,
- 0x9a, 0xf5, 0x34, 0xbe, 0xf1, 0xf5, 0x3b, 0x3e, 0x9c, 0xd4, 0x66, 0x3c,
- 0x0e, 0x56, 0xce, 0x3b, 0xaa, 0xd3, 0xa7, 0x3d, 0xd1, 0x46, 0xee, 0x3e,
- 0x9b, 0xec, 0x64, 0xbd, 0xe6, 0x23, 0xc2, 0x3e, 0xc3, 0xe9, 0xaf, 0xbe,
- 0x83, 0x08, 0x38, 0xbc, 0x73, 0x5f, 0xa3, 0x3e, 0xc4, 0xb2, 0x83, 0xbe,
- 0x11, 0xb7, 0xf8, 0x3e, 0x2c, 0x29, 0x62, 0xbe, 0x29, 0x10, 0x0e, 0xbd,
- 0xd1, 0x15, 0x48, 0x3e, 0x04, 0x27, 0xfa, 0xbd, 0x7f, 0x26, 0x8d, 0x3d,
- 0x35, 0xb2, 0x3e, 0xbe, 0x2f, 0xe1, 0x56, 0x3c, 0xc3, 0xef, 0x92, 0xbd,
- 0xea, 0xcc, 0x15, 0xbe, 0xe8, 0xf4, 0x93, 0x3c, 0x54, 0x55, 0xea, 0x3d,
- 0x9d, 0x17, 0x09, 0xbd, 0xf0, 0xea, 0xc3, 0x3e, 0x9d, 0x98, 0x1e, 0x3e,
- 0xbb, 0x4f, 0x32, 0xbe, 0x4a, 0xb5, 0x83, 0xbd, 0x2a, 0xc8, 0xbc, 0xbe,
- 0x4a, 0x0f, 0xd1, 0xbc, 0x32, 0x4a, 0x64, 0xbc, 0x5a, 0xde, 0xf8, 0xbd,
- 0x73, 0x3a, 0xb3, 0xbe, 0x61, 0x97, 0x27, 0xbe, 0xa9, 0x4a, 0xed, 0xbc,
- 0x4e, 0x30, 0xcc, 0x3e, 0x47, 0x2b, 0xdc, 0x3c, 0xd0, 0xcb, 0xe7, 0x3d,
- 0xf8, 0x95, 0xe3, 0x3c, 0x50, 0x90, 0xb4, 0xbd, 0x4a, 0x7b, 0x42, 0xbf,
- 0x3a, 0x39, 0xd8, 0x3d, 0xf0, 0xab, 0xb6, 0xbd, 0x7b, 0x81, 0x50, 0xbe,
- 0xb7, 0x21, 0xbf, 0x3d, 0x0b, 0x9d, 0x55, 0xbd, 0xa2, 0x7f, 0x04, 0x3e,
- 0xcc, 0x06, 0x2c, 0xbe, 0x4d, 0xf5, 0xd7, 0x3d, 0x7a, 0x46, 0x34, 0xbe,
- 0xd1, 0xfd, 0xad, 0x3c, 0x67, 0x90, 0x61, 0xbd, 0xe8, 0x38, 0xe6, 0xbd,
- 0xde, 0x19, 0x4a, 0xbe, 0xea, 0x8e, 0x62, 0x3e, 0xf5, 0xf7, 0x34, 0x3d,
- 0xbc, 0x53, 0xc2, 0x3d, 0xa9, 0xac, 0xb4, 0xbd, 0x79, 0x5a, 0x7b, 0xbd,
- 0x57, 0x05, 0x42, 0xbe, 0xe6, 0x81, 0x34, 0x3e, 0xbe, 0x20, 0xf3, 0x3d,
- 0xd8, 0xe6, 0xd6, 0xbd, 0x36, 0x46, 0xbe, 0xbd, 0xaf, 0x03, 0xc6, 0xbd,
- 0xf3, 0xc8, 0xe6, 0x3e, 0xf8, 0x31, 0xac, 0x3b, 0x12, 0xe3, 0x58, 0x3e,
- 0x11, 0x06, 0xd5, 0x3e, 0xb6, 0x51, 0xeb, 0xbd, 0x64, 0xf8, 0xcb, 0xbd,
- 0x0f, 0x8d, 0xfa, 0x3c, 0xcd, 0x48, 0x77, 0xbe, 0x45, 0xdd, 0xf5, 0xbd,
- 0x7c, 0x0f, 0x99, 0xbc, 0x84, 0x31, 0xe0, 0xbd, 0xd1, 0x26, 0x46, 0xbe,
- 0xaa, 0xdf, 0x0d, 0x3f, 0x1a, 0xbe, 0xb9, 0xbe, 0x31, 0x7b, 0x84, 0x3e,
- 0x99, 0x1e, 0x8e, 0xbe, 0xf3, 0x08, 0xda, 0x3d, 0xd4, 0xa6, 0x79, 0x3e,
- 0xea, 0x91, 0xae, 0xbe, 0x41, 0x57, 0x38, 0x3e, 0x2c, 0xb4, 0x27, 0xbe,
- 0xc6, 0x31, 0x0c, 0x3b, 0xda, 0xf5, 0xcc, 0xbd, 0xe6, 0x30, 0x82, 0x3e,
- 0xb0, 0xc5, 0x9a, 0xbe, 0x89, 0x1b, 0xb5, 0x3c, 0x8f, 0x75, 0x5e, 0xbd,
- 0x4c, 0x45, 0x25, 0xbe, 0x94, 0x8d, 0xeb, 0x3b, 0x3e, 0x29, 0x26, 0xbe,
- 0x99, 0x0f, 0x2d, 0xbe, 0x14, 0x3b, 0x2b, 0x3e, 0xc0, 0xc2, 0x38, 0x3d,
- 0x52, 0xcd, 0xbc, 0xbe, 0xeb, 0x00, 0xae, 0x3d, 0xb8, 0x1a, 0xea, 0xbc,
- 0xee, 0xa3, 0x8d, 0xbe, 0xf4, 0x38, 0x82, 0x3d, 0x9d, 0x5d, 0x44, 0xbd,
- 0xe9, 0xbd, 0x57, 0xbe, 0xd5, 0x9d, 0x38, 0x3e, 0x05, 0xfd, 0x07, 0xbe,
- 0xc6, 0x3b, 0xa6, 0x3e, 0xc8, 0x2f, 0x97, 0x3b, 0x65, 0x87, 0xe8, 0xbd,
- 0xa9, 0x2b, 0xa5, 0xbe, 0x28, 0xbe, 0x9f, 0x3d, 0x66, 0xc9, 0x27, 0x3d,
- 0xb1, 0x57, 0xaa, 0xbe, 0x94, 0xdb, 0x46, 0xbe, 0x59, 0xce, 0x15, 0xbd,
- 0xa6, 0x0a, 0x92, 0xbe, 0x11, 0xa1, 0x45, 0x3e, 0xe0, 0x33, 0x67, 0xbd,
- 0xda, 0x74, 0xb5, 0x3e, 0xae, 0xd4, 0x36, 0xbe, 0x77, 0x45, 0x3d, 0xbe,
- 0xd4, 0x6f, 0x00, 0x3f, 0xee, 0x5a, 0xcf, 0xbd, 0xa5, 0xa9, 0xd0, 0xbd,
- 0xad, 0x76, 0xba, 0xbd, 0xfb, 0x67, 0x15, 0x3f, 0x88, 0x63, 0x68, 0xbe,
- 0xcd, 0x85, 0xef, 0x3e, 0x73, 0x36, 0x67, 0xbe, 0x4d, 0x2f, 0xf1, 0x3d,
- 0xe6, 0x00, 0x0a, 0x3e, 0xc4, 0x0c, 0x3b, 0xbe, 0x0f, 0xf2, 0x77, 0xbd,
- 0x02, 0xc5, 0xfa, 0x3d, 0x5f, 0x40, 0x9e, 0xbd, 0x21, 0xd0, 0x2f, 0xbe,
- 0x6f, 0x31, 0x85, 0x3d, 0x0d, 0xad, 0xe2, 0x3c, 0xac, 0x1c, 0xc4, 0x3d,
- 0xc2, 0xf9, 0x68, 0xbe, 0x7a, 0xc0, 0xb0, 0x3e, 0xa6, 0x32, 0x88, 0xbe,
- 0xf7, 0xb2, 0x9b, 0xbe, 0xc3, 0xf1, 0xdc, 0xbd, 0x8a, 0x54, 0xad, 0xbe,
- 0xd1, 0x57, 0x48, 0xbe, 0x1e, 0xc1, 0x82, 0x3c, 0xa1, 0x62, 0x3c, 0x3d,
- 0x62, 0x05, 0xa3, 0xbd, 0x26, 0xc6, 0x2f, 0x3c, 0x06, 0xdf, 0x69, 0x3c,
- 0x42, 0x37, 0xad, 0x3e, 0x9f, 0xf8, 0xe1, 0x3d, 0xf0, 0x44, 0x95, 0x3d,
- 0x45, 0x5d, 0x44, 0x3d, 0x73, 0x5c, 0x47, 0xbe, 0x52, 0xe3, 0x19, 0xbf,
- 0xc9, 0xb3, 0x84, 0x3d, 0xd4, 0xa2, 0x85, 0x3e, 0xd1, 0x26, 0x69, 0xbe,
- 0x11, 0x36, 0x8c, 0xbd, 0xed, 0x97, 0xa9, 0xbd, 0x50, 0x5e, 0xef, 0xbd,
- 0x07, 0xdb, 0x41, 0xbe, 0x9e, 0xc7, 0x4d, 0xbc, 0x04, 0xdc, 0xbd, 0x3d,
- 0xb2, 0x44, 0x22, 0xbe, 0x3b, 0xf1, 0x2b, 0x3e, 0x60, 0xd6, 0xdf, 0xbe,
- 0xd6, 0xec, 0x3c, 0x3d, 0xea, 0x74, 0xa2, 0x3d, 0xea, 0x8d, 0xe3, 0xbd,
- 0x08, 0x97, 0x00, 0xbe, 0xc3, 0x66, 0xc5, 0xbe, 0xaa, 0x19, 0x57, 0xbd,
- 0xa3, 0x31, 0xa8, 0xbd, 0xe6, 0x1f, 0x0e, 0x3e, 0x79, 0x9d, 0x58, 0xbe,
- 0x45, 0x3e, 0xc8, 0xbd, 0x0f, 0x05, 0x9a, 0xbd, 0x75, 0x2b, 0x3c, 0x3d,
- 0x7f, 0xb3, 0x6f, 0x3d, 0x78, 0xa7, 0xd9, 0xbc, 0x73, 0x04, 0x2f, 0xbd,
- 0x12, 0x3c, 0xfb, 0x3e, 0x4a, 0xb8, 0xf5, 0xbd, 0xdd, 0x5e, 0xd7, 0x3d,
- 0xbb, 0xe7, 0xcb, 0x3d, 0x94, 0xbe, 0x45, 0x3e, 0xfa, 0xad, 0xbc, 0x3d,
- 0x8b, 0x1f, 0xc7, 0x3d, 0xa0, 0x7f, 0x17, 0x3f, 0x5b, 0xbb, 0xb1, 0xbd,
- 0xd2, 0x99, 0x9f, 0xbe, 0x47, 0xb8, 0x5c, 0xbe, 0x5d, 0x9f, 0xef, 0xbd,
- 0x8f, 0x72, 0x7b, 0xbe, 0xe1, 0xaa, 0x9a, 0xbe, 0xa8, 0x62, 0x80, 0xbd,
- 0xa2, 0x58, 0xd8, 0xbe, 0x3d, 0x3c, 0x6f, 0x3e, 0x71, 0x15, 0x2c, 0xbd,
- 0x75, 0xce, 0xa6, 0xbd, 0x85, 0x86, 0x9c, 0x3d, 0x51, 0x8a, 0x4f, 0x3d,
- 0x9c, 0xa7, 0x17, 0xbb, 0x67, 0x54, 0xcc, 0xbb, 0xf9, 0x2c, 0x80, 0x3e,
- 0xa2, 0x61, 0x43, 0xbe, 0xf7, 0x6a, 0x77, 0xbd, 0x58, 0x02, 0x49, 0x3e,
- 0x36, 0xe0, 0x00, 0xbe, 0xa4, 0x75, 0x71, 0xbe, 0x28, 0x2c, 0xbc, 0x3d,
- 0x65, 0x9f, 0x05, 0x3e, 0x80, 0x65, 0xea, 0xbc, 0xf9, 0xf8, 0x7a, 0xbd,
- 0x16, 0xf4, 0x99, 0xbb, 0x86, 0x98, 0x06, 0xbe, 0x0a, 0x41, 0x69, 0xbe,
- 0x6f, 0xf6, 0xdb, 0x3c, 0x7f, 0x7c, 0x86, 0xbd, 0x73, 0x6c, 0x67, 0x3e,
- 0x36, 0xcb, 0xaa, 0x3c, 0xb7, 0x65, 0x6e, 0x3e, 0xb5, 0x9a, 0xf2, 0xbd,
- 0xcb, 0xb6, 0xf8, 0x3c, 0xf9, 0x50, 0x1b, 0xbd, 0x2f, 0xff, 0x4f, 0x3f,
- 0xc9, 0x75, 0x8f, 0x3e, 0xc3, 0x1f, 0x08, 0xbe, 0xbd, 0x91, 0xe7, 0xbe,
- 0xe8, 0x86, 0xf2, 0xbd, 0xbe, 0xd8, 0x1d, 0x3e, 0xdf, 0x01, 0x7b, 0x3e,
- 0x34, 0x86, 0x8a, 0xbd, 0x9e, 0x85, 0x8a, 0xbd, 0xa7, 0xec, 0x96, 0x3e,
- 0xdf, 0xcb, 0x17, 0xbf, 0x89, 0x65, 0xb1, 0x3d, 0x5d, 0xb9, 0xde, 0xbe,
- 0x85, 0xb2, 0x53, 0xbe, 0x56, 0x1e, 0xc6, 0xbd, 0x33, 0xd4, 0x10, 0x3f,
- 0x59, 0xb0, 0x73, 0x3d, 0xe2, 0xc8, 0xb2, 0x3f, 0x5b, 0x8a, 0x60, 0xbe,
- 0x91, 0x6d, 0xd0, 0xbe, 0x84, 0xb3, 0x8d, 0xbc, 0x3f, 0x82, 0x5e, 0xbe,
- 0xf5, 0x8c, 0x59, 0x3e, 0x01, 0x3c, 0x8b, 0x3c, 0x77, 0xf1, 0x3a, 0xbe,
- 0xe9, 0x65, 0xcb, 0xbe, 0x2c, 0x20, 0x71, 0xbf, 0x2f, 0x53, 0x40, 0x3d,
- 0xf8, 0xc6, 0xb4, 0x3e, 0x46, 0x13, 0x01, 0xbf, 0x1e, 0x00, 0x24, 0xbe,
- 0x49, 0xe5, 0x25, 0x3e, 0xed, 0x02, 0x08, 0x3f, 0x0d, 0x63, 0x94, 0xbe,
- 0x43, 0xe1, 0x61, 0xbe, 0x89, 0xce, 0xff, 0xbd, 0x9b, 0x94, 0xd9, 0xbd,
- 0x14, 0xb3, 0x30, 0x3e, 0x8e, 0xab, 0xc8, 0x3d, 0x59, 0x57, 0x86, 0x3e,
- 0x83, 0x36, 0x72, 0x3e, 0xd2, 0x9b, 0x92, 0xbe, 0xbc, 0xdb, 0xe1, 0x3d,
- 0x33, 0x7d, 0xca, 0x3e, 0x75, 0x7d, 0x69, 0x3f, 0x76, 0xe8, 0xb6, 0xbd,
- 0xfa, 0x42, 0xa0, 0xbf, 0x3a, 0x9f, 0xce, 0xbd, 0x6f, 0xd0, 0x98, 0x3e,
- 0x2f, 0x73, 0xe2, 0xbc, 0x87, 0x20, 0xf8, 0x3e, 0xc1, 0x4b, 0x6c, 0x3e,
- 0xc3, 0x75, 0x03, 0xbf, 0x6b, 0xbd, 0xe4, 0x3d, 0xd7, 0x63, 0x16, 0x3d,
- 0xdf, 0x6d, 0xce, 0xbc, 0xb2, 0x60, 0xf7, 0x3e, 0xd6, 0xe7, 0x39, 0xbe,
- 0x94, 0xc6, 0x89, 0x3e, 0x59, 0x8d, 0xa2, 0x3e, 0x50, 0x49, 0xba, 0xbd,
- 0x05, 0xf4, 0x25, 0xbe, 0xa9, 0x36, 0xd3, 0xbe, 0xf9, 0x18, 0x67, 0xbd,
- 0xb3, 0x0d, 0x2b, 0xbf, 0x8c, 0xa7, 0xc4, 0x3c, 0xa4, 0x8f, 0xe1, 0x3d,
- 0x5b, 0xa8, 0xd4, 0x3e, 0x3e, 0x92, 0xd5, 0xbd, 0x90, 0x27, 0xc5, 0xbc,
- 0x66, 0x42, 0xdb, 0x3a, 0x32, 0xca, 0xaf, 0x3d, 0x6b, 0x08, 0x85, 0xbe,
- 0x4b, 0x52, 0x98, 0x3e, 0xff, 0x98, 0x58, 0xbd, 0xd5, 0x0c, 0x9b, 0x3d,
- 0x11, 0xa2, 0x4f, 0x3d, 0x88, 0xa1, 0x03, 0x3e, 0x89, 0xe5, 0x1a, 0x3e,
- 0x0f, 0xe8, 0x66, 0x3d, 0xad, 0x26, 0x8b, 0xbf, 0xa5, 0x99, 0x99, 0x3e,
- 0x01, 0x46, 0x16, 0xbe, 0x22, 0x7d, 0x9c, 0xbc, 0xd4, 0x39, 0x2f, 0xbf,
- 0x21, 0x77, 0x91, 0xbe, 0xf8, 0x5a, 0xae, 0xbc, 0xa5, 0x17, 0x43, 0xbe,
- 0x46, 0x4a, 0x4a, 0xbe, 0x7f, 0xbf, 0x9b, 0x3f, 0xf9, 0xc9, 0xa9, 0xbc,
- 0x3a, 0x3a, 0x26, 0xbf, 0xa7, 0x97, 0x14, 0x3e, 0xde, 0x4f, 0x04, 0xbf,
- 0x34, 0x2d, 0x5e, 0xbe, 0xbf, 0xa7, 0xd8, 0x3e, 0x0e, 0x32, 0xe5, 0xbe,
- 0xc4, 0xa7, 0x18, 0xbe, 0xe8, 0xdf, 0x48, 0xbe, 0x2e, 0xa3, 0x9d, 0xbc,
- 0xdf, 0x05, 0x19, 0xbe, 0x70, 0xc1, 0x01, 0x3f, 0xa5, 0xf2, 0xc3, 0x3e,
- 0x4e, 0x49, 0x01, 0xbe, 0xb7, 0xda, 0x3a, 0x3e, 0x2e, 0x07, 0xd6, 0xbd,
- 0x55, 0x63, 0xa6, 0xbe, 0xea, 0x49, 0xe4, 0xbc, 0xb7, 0xd0, 0xfc, 0xbd,
- 0x09, 0xb0, 0x32, 0x3e, 0xda, 0x4f, 0xd3, 0x3e, 0x10, 0x20, 0x41, 0x3f,
- 0x27, 0xff, 0x8b, 0x3d, 0x68, 0xe3, 0x38, 0xbe, 0x05, 0xaa, 0xd7, 0xbe,
- 0xd8, 0x94, 0x04, 0x3c, 0x09, 0x5b, 0x33, 0xbe, 0x82, 0xb4, 0x38, 0x3c,
- 0xa1, 0xcb, 0xf4, 0xbc, 0x64, 0x97, 0x8b, 0xbd, 0x61, 0x95, 0xaa, 0xbc,
- 0x60, 0x8a, 0xcf, 0x3d, 0xaa, 0x29, 0x21, 0x3e, 0xae, 0x3b, 0x38, 0xbc,
- 0xdb, 0xe0, 0xec, 0xbd, 0x6a, 0xba, 0xfd, 0xbb, 0xd3, 0xe0, 0x1d, 0xbe,
- 0xdc, 0x9b, 0xc3, 0xbb, 0xad, 0x45, 0xbb, 0xbc, 0x0b, 0x53, 0x5b, 0x3d,
- 0x4b, 0x57, 0x85, 0x3e, 0xcc, 0xff, 0x8f, 0xbd, 0x88, 0x08, 0x2e, 0x3c,
- 0xb4, 0xe7, 0x85, 0xbd, 0xc9, 0x4f, 0x7e, 0xbe, 0xbf, 0x8b, 0x8e, 0xbe,
- 0x95, 0x4d, 0x85, 0xbd, 0x7d, 0x8e, 0x83, 0x3d, 0xcc, 0xb5, 0x35, 0xbe,
- 0x57, 0x8f, 0x1e, 0x3e, 0x24, 0x86, 0x43, 0x3d, 0x13, 0x42, 0x81, 0xbe,
- 0x55, 0x60, 0xad, 0x3d, 0xd3, 0x92, 0xa8, 0x3d, 0x1b, 0x2a, 0xbe, 0xbd,
- 0x33, 0x15, 0xda, 0xbc, 0xb2, 0x56, 0x73, 0xbd, 0xb9, 0xaf, 0xd5, 0xbd,
- 0x14, 0xe3, 0xb6, 0x3c, 0xea, 0xa7, 0xa4, 0xbe, 0xd1, 0x3a, 0x51, 0xbe,
- 0x28, 0x4e, 0x85, 0x3d, 0x86, 0x7b, 0x80, 0x3d, 0x17, 0x91, 0x3d, 0xbd,
- 0xdc, 0x1c, 0x44, 0xbd, 0xe8, 0x98, 0x76, 0x3d, 0x0f, 0xc4, 0x79, 0xbc,
- 0xff, 0x24, 0xfa, 0xbd, 0x8e, 0x15, 0xaf, 0xbe, 0xb2, 0x6c, 0x80, 0xbd,
- 0xdf, 0x24, 0xab, 0x3d, 0x0b, 0xcf, 0x00, 0x3d, 0xc8, 0x46, 0x5a, 0xbe,
- 0xd0, 0x10, 0xfc, 0xbd, 0xa5, 0xa9, 0x3e, 0x3d, 0xaf, 0x01, 0x8e, 0xbe,
- 0x96, 0x6f, 0x7d, 0xbc, 0x1f, 0x28, 0x24, 0xbd, 0xa2, 0x9d, 0x9e, 0x3d,
- 0x2f, 0x23, 0x68, 0x3e, 0x93, 0x98, 0x03, 0xbe, 0x1d, 0xe9, 0xa7, 0xbe,
- 0xcf, 0x62, 0x45, 0x3d, 0xf4, 0xc7, 0xd8, 0xbd, 0x8e, 0xd9, 0xaf, 0x3d,
- 0x92, 0x8c, 0x9e, 0x3d, 0xe0, 0x91, 0x63, 0xbe, 0xf0, 0x25, 0x20, 0xbe,
- 0x93, 0x1c, 0xc5, 0xbd, 0x5b, 0xc0, 0x13, 0xbd, 0x83, 0x74, 0x4c, 0x3e,
- 0x3f, 0x5f, 0x1f, 0x3e, 0xdf, 0x9e, 0x21, 0x3e, 0xc1, 0x79, 0x12, 0x3e,
- 0x9a, 0x32, 0xf6, 0xbd, 0x78, 0xf6, 0xde, 0xbd, 0xd6, 0x7d, 0x5b, 0x3c,
- 0x8b, 0x6b, 0x09, 0x3e, 0x21, 0xd1, 0xf5, 0xbd, 0x09, 0xb7, 0x16, 0x3e,
- 0x36, 0xcb, 0x12, 0xbe, 0x82, 0x12, 0xa6, 0x3d, 0x9b, 0xbd, 0xd3, 0x3d,
- 0x89, 0x56, 0x1a, 0xbe, 0xf8, 0xa9, 0xf8, 0x3d, 0xd8, 0xed, 0xa0, 0x3d,
- 0x46, 0x56, 0xfe, 0x3c, 0xc9, 0x71, 0x65, 0x3b, 0x23, 0x99, 0x24, 0x3e,
- 0x44, 0xc8, 0x59, 0x3d, 0x18, 0x0b, 0xa0, 0x3d, 0x18, 0xeb, 0xd7, 0x3d,
- 0x62, 0x82, 0xe7, 0xbe, 0xec, 0x7a, 0x25, 0x3d, 0x3d, 0xd7, 0x19, 0xbe,
- 0x09, 0x45, 0xe2, 0xbd, 0x07, 0x91, 0x4f, 0x3e, 0x42, 0x47, 0xf1, 0x3d,
- 0x44, 0x87, 0xa2, 0x3d, 0x37, 0x71, 0xdb, 0x3b, 0xbb, 0xf2, 0xc0, 0x3d,
- 0xa1, 0xe1, 0x8d, 0xbe, 0x41, 0x5d, 0x86, 0xbb, 0x92, 0xac, 0xdc, 0x3d,
- 0x79, 0xbc, 0x69, 0xbe, 0x4e, 0xa4, 0xbe, 0xbd, 0x79, 0x80, 0x02, 0xbe,
- 0xfd, 0x10, 0xce, 0x3c, 0xea, 0x8b, 0xba, 0x3d, 0x60, 0xae, 0x33, 0x3e,
- 0xe0, 0x5a, 0xef, 0x3d, 0x15, 0x63, 0x09, 0x3e, 0xbe, 0x7d, 0xa5, 0xbe,
- 0xfc, 0x27, 0x7b, 0x3e, 0x8c, 0x6a, 0xdb, 0xbd, 0xe4, 0x7d, 0x4a, 0xbe,
- 0xf0, 0x15, 0x61, 0x3d, 0x81, 0x65, 0xe0, 0xbd, 0x18, 0x01, 0xb4, 0x3d,
- 0xab, 0xb6, 0xd1, 0xbe, 0x9d, 0xb1, 0x90, 0x3f, 0xfa, 0x47, 0xa6, 0xbd,
- 0x57, 0xc8, 0x13, 0x3f, 0x3f, 0x23, 0x99, 0xbd, 0x6e, 0xc9, 0x40, 0x3f,
- 0xab, 0xeb, 0x08, 0x3d, 0xef, 0xc2, 0xb1, 0x3e, 0xb6, 0xe3, 0x2d, 0xbf,
- 0x75, 0x9c, 0xed, 0xbe, 0x51, 0x6c, 0x20, 0x3f, 0xe2, 0x15, 0xfd, 0xbc,
- 0x6f, 0x5a, 0xb3, 0xbc, 0x15, 0x0c, 0xd4, 0x3e, 0xff, 0xeb, 0xa9, 0xbe,
- 0x3e, 0x2b, 0x9d, 0xbe, 0x6f, 0x70, 0x01, 0xbd, 0x5f, 0xa0, 0x15, 0xbf,
- 0xae, 0xcd, 0x07, 0xbf, 0x46, 0x2a, 0xea, 0xbe, 0x28, 0xa3, 0xef, 0x3e,
- 0x7b, 0x3d, 0xed, 0x3e, 0x66, 0x7a, 0xae, 0xbd, 0xd6, 0x14, 0xa6, 0x3c,
- 0x46, 0x57, 0x9c, 0xbe, 0x4a, 0x07, 0x54, 0x3e, 0x27, 0xf6, 0x36, 0xbe,
- 0x8e, 0xce, 0x8b, 0xbf, 0xe4, 0x34, 0x99, 0x3c, 0x04, 0x05, 0xc9, 0xbe,
- 0x33, 0xb5, 0xf4, 0x3e, 0x3f, 0xe5, 0x52, 0xbf, 0xb9, 0x8a, 0x99, 0xbd,
- 0xe3, 0x5e, 0x1f, 0x3f, 0xb2, 0xed, 0xdc, 0x3e, 0x48, 0xe9, 0x0d, 0xbf,
- 0xe7, 0x61, 0xfd, 0x3d, 0x65, 0x33, 0xc8, 0xbe, 0xd9, 0x0f, 0x46, 0xbe,
- 0xb2, 0xe0, 0x46, 0xbf, 0x1e, 0x54, 0x70, 0xbd, 0xdf, 0xa6, 0xe2, 0xbd,
- 0x84, 0x45, 0x37, 0xbe, 0xbe, 0x84, 0x8c, 0xbe, 0xe2, 0x92, 0x8b, 0x3f,
- 0xcc, 0xb6, 0xbf, 0x3e, 0x5c, 0xbd, 0x8d, 0xbe, 0x8b, 0x15, 0xc4, 0xbb,
- 0x2f, 0x5d, 0x16, 0x3e, 0x49, 0x01, 0x5e, 0xbe, 0xc7, 0xf4, 0xfb, 0xbc,
- 0xc2, 0x5f, 0x51, 0xbe, 0xb9, 0x2a, 0x4d, 0x3f, 0xb3, 0x67, 0x5e, 0xbe,
- 0x52, 0x51, 0xd0, 0xbd, 0xe6, 0xb8, 0x03, 0xbe, 0x08, 0x09, 0xbc, 0x3e,
- 0x2b, 0x9d, 0x8c, 0x3e, 0xbd, 0x9f, 0xe8, 0xbe, 0x40, 0x0b, 0x8c, 0x3e,
- 0x92, 0xf6, 0xe0, 0x3e, 0x58, 0x36, 0xc7, 0x3e, 0x78, 0x56, 0x9b, 0x3d,
- 0x2c, 0x55, 0xca, 0xbe, 0x5a, 0x02, 0xe7, 0x3c, 0xe8, 0x0e, 0xa4, 0xbd,
- 0x4d, 0x06, 0x8f, 0x3d, 0x00, 0x8d, 0xf9, 0x3d, 0x3c, 0x4b, 0x1c, 0xbf,
- 0x1e, 0x6d, 0x2b, 0x3e, 0xb2, 0xd4, 0xf3, 0x3d, 0x14, 0xf4, 0xd7, 0x3d,
- 0x19, 0x8d, 0x83, 0xbe, 0x6a, 0x54, 0x2d, 0xbe, 0xa9, 0x11, 0x0e, 0xbf,
- 0xb5, 0x07, 0x19, 0x3f, 0xb6, 0x7d, 0x25, 0x3e, 0x88, 0x48, 0x3d, 0xbf,
- 0x32, 0x92, 0xb8, 0xbe, 0xb7, 0xf3, 0xee, 0xbb, 0x0f, 0xd2, 0xf1, 0x3d,
- 0x38, 0xf9, 0x1b, 0x3c, 0xd7, 0x35, 0x8b, 0x3e, 0x12, 0xdf, 0xbd, 0xbe,
- 0x55, 0xef, 0xd0, 0x3d, 0x25, 0x3f, 0xbf, 0x3e, 0xd9, 0xf3, 0xf2, 0x3e,
- 0x27, 0x9b, 0x8f, 0x3d, 0x9e, 0x51, 0x9d, 0x3c, 0xc1, 0xb7, 0x91, 0xbe,
- 0x97, 0x9e, 0x91, 0xbe, 0x4c, 0x02, 0x37, 0xbd, 0x1b, 0x8b, 0xc6, 0xbc,
- 0x05, 0x43, 0x94, 0x3c, 0xec, 0x06, 0x86, 0x3e, 0x4f, 0x47, 0xcf, 0x3d,
- 0xe1, 0x3e, 0xec, 0x3d, 0x83, 0x82, 0xcc, 0xbe, 0x04, 0x90, 0x95, 0x3f,
- 0xcd, 0xb1, 0x98, 0xbe, 0x01, 0xc5, 0x3e, 0xbf, 0xbd, 0x89, 0x9c, 0xbe,
- 0xd8, 0xac, 0x79, 0xbe, 0xa8, 0x15, 0x3a, 0xbe, 0x51, 0xc6, 0x5d, 0xbe,
- 0x6f, 0x31, 0x34, 0xbe, 0xd2, 0xc5, 0xfb, 0x3e, 0xe7, 0xb5, 0xae, 0x3e,
- 0x26, 0x21, 0x4a, 0xbc, 0x93, 0xac, 0xfc, 0x3d, 0xd5, 0x39, 0x46, 0xbe,
- 0x16, 0x4f, 0x25, 0x3f, 0xdc, 0x40, 0x4a, 0xbd, 0x1b, 0xd4, 0x10, 0xbd,
- 0x4e, 0xcb, 0x13, 0xbe, 0xab, 0x13, 0x74, 0x3e, 0xe8, 0x13, 0x8f, 0x3d,
- 0x3d, 0xb3, 0xbe, 0xbe, 0x69, 0x71, 0xc6, 0x3a, 0xb1, 0x27, 0x10, 0xbb,
- 0xe8, 0x0b, 0x46, 0xbd, 0xfe, 0xa1, 0xd6, 0x3d, 0x32, 0xdf, 0x99, 0x3d,
- 0x89, 0x41, 0x0e, 0xbe, 0x87, 0xf5, 0xb0, 0x3e, 0xf5, 0x57, 0x1c, 0x3d,
- 0x5a, 0x4a, 0x33, 0xbe, 0xaf, 0x8c, 0x8f, 0x3e, 0x4e, 0x2c, 0x5d, 0x3d,
- 0x1e, 0x31, 0xa5, 0xbd, 0x5f, 0x19, 0x15, 0x3e, 0x05, 0x78, 0x9f, 0x3e,
- 0x97, 0xc1, 0x84, 0xbd, 0xb2, 0x05, 0xd8, 0x3e, 0x4b, 0xee, 0xb0, 0xbe,
- 0xa9, 0xfd, 0x1f, 0xbe, 0x16, 0x4f, 0x92, 0x3e, 0x04, 0x50, 0xac, 0xbe,
- 0x44, 0x44, 0x9d, 0x3e, 0x37, 0xa1, 0x48, 0xbd, 0x00, 0x31, 0x7c, 0x3d,
- 0x6c, 0x81, 0x5b, 0x3e, 0xbb, 0x68, 0xa5, 0xbd, 0x4a, 0xdc, 0xbc, 0xbd,
- 0x0a, 0xf5, 0xab, 0xbd, 0x9a, 0x40, 0x4c, 0xbd, 0x41, 0x07, 0x33, 0xbd,
- 0xb0, 0x79, 0xda, 0xbd, 0xb3, 0xbc, 0xa5, 0xbd, 0xca, 0xfa, 0xf2, 0x3d,
- 0x62, 0xf4, 0x31, 0xbe, 0x55, 0xd9, 0x42, 0x3e, 0x63, 0x5b, 0xbb, 0xbd,
- 0x9f, 0x4f, 0x91, 0xbd, 0xbe, 0xea, 0x6c, 0xbe, 0x46, 0x98, 0xf1, 0xbe,
- 0xe0, 0x80, 0x8b, 0xbe, 0x42, 0xb6, 0x00, 0x3d, 0x45, 0xa5, 0x89, 0xbd,
- 0x15, 0x4d, 0x3c, 0xbe, 0x87, 0x45, 0xf1, 0xbd, 0x34, 0x35, 0x33, 0x3c,
- 0xfd, 0x54, 0xcf, 0x3e, 0x15, 0xe0, 0x1b, 0x3d, 0x8f, 0x10, 0x26, 0x3e,
- 0x9a, 0x64, 0xb7, 0xbd, 0xa5, 0xaf, 0x95, 0xbe, 0x90, 0xaf, 0x0d, 0xbf,
- 0xaa, 0x2d, 0x28, 0x3e, 0x49, 0xd6, 0x0d, 0xbe, 0x5f, 0xf3, 0x61, 0xbe,
- 0xeb, 0xf7, 0x64, 0x3c, 0x0b, 0xb1, 0xc5, 0xbc, 0x2f, 0x30, 0x96, 0x3d,
- 0xe2, 0x57, 0x50, 0xbe, 0xc1, 0xe3, 0x2d, 0xbd, 0x54, 0x62, 0x79, 0xbe,
- 0xf3, 0x74, 0xd7, 0x3c, 0x53, 0x74, 0x03, 0x3e, 0xc9, 0x73, 0xc0, 0xbe,
- 0x61, 0x0b, 0x57, 0xbe, 0xed, 0x47, 0xa4, 0xbb, 0xb4, 0xda, 0x3a, 0xbc,
- 0x73, 0xc8, 0x67, 0xbd, 0x05, 0x23, 0x1f, 0xbd, 0xb5, 0x1c, 0x0d, 0x3e,
- 0x0b, 0x4a, 0x0a, 0xbe, 0x34, 0x42, 0xe2, 0xbd, 0xc0, 0x05, 0x08, 0x3e,
- 0x5a, 0x67, 0x10, 0x3e, 0xf1, 0x59, 0xf7, 0xbd, 0x4d, 0xf8, 0xf2, 0xbd,
- 0x20, 0xd3, 0x24, 0x3f, 0x9e, 0x41, 0x7e, 0x3e, 0xce, 0xd3, 0x3b, 0x3e,
- 0x87, 0xe0, 0x87, 0x3e, 0x09, 0x46, 0x9a, 0xbd, 0xce, 0x89, 0x42, 0x3c,
- 0xe4, 0xf7, 0xdc, 0x3d, 0x33, 0xc3, 0xae, 0xbe, 0xfc, 0x29, 0xe5, 0xbc,
- 0x66, 0x4b, 0x9a, 0xbd, 0x61, 0x22, 0x97, 0x3b, 0xb9, 0x0c, 0xdc, 0xbd,
- 0xe9, 0x76, 0x0d, 0x3f, 0xd3, 0x65, 0x7a, 0xbe, 0xdf, 0x47, 0x45, 0x3e,
- 0x4b, 0xb0, 0xa5, 0xbe, 0x2b, 0x0e, 0xb0, 0x3d, 0xef, 0x4a, 0x13, 0x3e,
- 0xf4, 0xce, 0x2c, 0xbe, 0x49, 0x85, 0xdd, 0x3e, 0x9a, 0x12, 0xc5, 0x3d,
- 0x7d, 0xe5, 0x14, 0xbf, 0xbc, 0x17, 0x6d, 0xbe, 0x44, 0x16, 0x72, 0x3e,
- 0xd4, 0x37, 0xe6, 0x3d, 0xb9, 0x0c, 0x19, 0x3e, 0x37, 0x50, 0x81, 0xbe,
- 0x8b, 0xdf, 0x2e, 0xbe, 0xeb, 0xd6, 0x57, 0xbb, 0x6a, 0xda, 0x63, 0xbd,
- 0xc8, 0xb4, 0xe4, 0x3c, 0x5f, 0x6b, 0xd4, 0x3d, 0x5d, 0xe8, 0x89, 0xbd,
- 0x9f, 0xcc, 0xba, 0xbd, 0x69, 0xca, 0x64, 0x3c, 0xaf, 0x9e, 0x5c, 0xbe,
- 0xd8, 0x93, 0x67, 0xbd, 0xb1, 0xe3, 0xd9, 0xbd, 0xa4, 0x50, 0xea, 0xbb,
- 0xa9, 0xa1, 0xbd, 0xbd, 0x4f, 0xdc, 0x4f, 0x3e, 0x20, 0x18, 0x65, 0xbe,
- 0x10, 0x04, 0x6b, 0xbd, 0x49, 0x79, 0x01, 0x3e, 0xc2, 0x10, 0xb7, 0xbb,
- 0x10, 0xa8, 0xf2, 0xbd, 0xe6, 0xc5, 0x8e, 0x3d, 0xfb, 0x02, 0xad, 0xbd,
- 0x37, 0x49, 0x2b, 0xbe, 0x2e, 0xd5, 0x71, 0xbd, 0x69, 0xe6, 0x4d, 0x3d,
- 0xf4, 0x06, 0xc9, 0xbe, 0x13, 0x80, 0x72, 0x3e, 0x6a, 0x2b, 0x65, 0x3e,
- 0x40, 0xf0, 0x60, 0x3e, 0xa4, 0x39, 0x0e, 0xbd, 0xda, 0xa4, 0x88, 0xbe,
- 0xf5, 0x12, 0x16, 0x3e, 0x93, 0x02, 0x23, 0x3e, 0x81, 0xf9, 0x1f, 0x3d,
- 0x6b, 0xf3, 0x71, 0xbd, 0x1e, 0x29, 0xb7, 0x3e, 0xbd, 0xe8, 0xc3, 0xbe,
- 0xd2, 0x78, 0x91, 0x3e, 0x23, 0xaf, 0x00, 0xbe, 0x2d, 0xe5, 0x31, 0x3e,
- 0xcd, 0xec, 0x11, 0x3e, 0x14, 0xe8, 0xfc, 0xbd, 0xb2, 0x80, 0x79, 0xbe,
- 0x22, 0x6d, 0x8b, 0xbe, 0x83, 0xf5, 0xd2, 0x3d, 0x55, 0xdd, 0x18, 0x3b,
- 0x0f, 0x07, 0x49, 0x3e, 0x15, 0x6e, 0xfe, 0xbd, 0xc8, 0x9d, 0xe2, 0x3d,
- 0x82, 0xa9, 0xb4, 0xbe, 0xfa, 0xeb, 0x7c, 0x3e, 0x70, 0x64, 0x86, 0xbe,
- 0x0e, 0xfa, 0x05, 0xbe, 0x33, 0xca, 0x36, 0xbe, 0xcc, 0x92, 0xef, 0xbe,
- 0xb1, 0xfe, 0xff, 0xbd, 0x2b, 0x1a, 0xb8, 0xbb, 0x52, 0x1d, 0xee, 0x3d,
- 0x48, 0x71, 0xb8, 0xbc, 0xb1, 0x44, 0x6f, 0xbd, 0x2e, 0x87, 0x8d, 0xbd,
- 0xfd, 0xf1, 0x71, 0x3e, 0xed, 0x6b, 0x17, 0xbe, 0x1a, 0xc9, 0xbd, 0x3d,
- 0xea, 0xff, 0x49, 0x3e, 0x3e, 0x72, 0x3d, 0xbe, 0x3e, 0x27, 0xb0, 0xbe,
- 0x42, 0xce, 0xda, 0x3d, 0x5f, 0x09, 0x78, 0x3e, 0xb0, 0x91, 0x38, 0xbe,
- 0xe5, 0xfe, 0xf4, 0x3b, 0x2c, 0xe1, 0x9d, 0x3d, 0x34, 0x42, 0x79, 0x3d,
- 0x3e, 0x7e, 0xb4, 0xbe, 0xcf, 0x5e, 0x14, 0xbe, 0x44, 0x93, 0x1b, 0x3e,
- 0xb6, 0x4f, 0x49, 0x3d, 0x01, 0xde, 0x1c, 0x3e, 0x97, 0x6a, 0x49, 0xbe,
- 0x21, 0x53, 0x61, 0xbd, 0x41, 0x5d, 0xc5, 0xbd, 0xbe, 0x14, 0x8f, 0x3b,
- 0x77, 0x18, 0x4c, 0xbd, 0x50, 0x42, 0xca, 0xbe, 0x90, 0x11, 0xac, 0xbe,
- 0x9b, 0xca, 0x8c, 0xbd, 0xeb, 0x7c, 0x96, 0x3c, 0x1f, 0x17, 0xcb, 0xbd,
- 0x36, 0x5f, 0x19, 0x3d, 0x6c, 0xe3, 0x53, 0xbd, 0x5b, 0x31, 0x14, 0xbe,
- 0x96, 0x9c, 0xe7, 0x3d, 0x08, 0x3f, 0x4f, 0x3e, 0x61, 0xf1, 0x08, 0x3e,
- 0x6b, 0x15, 0x7a, 0x3e, 0x27, 0x49, 0x03, 0xbe, 0xd9, 0x30, 0xd0, 0xbd,
- 0x76, 0xd1, 0x87, 0x3b, 0x7b, 0x2e, 0xe4, 0xbd, 0x38, 0x2e, 0x68, 0xbd,
- 0xdc, 0x82, 0x5c, 0x3d, 0x38, 0x9b, 0xc8, 0x3e, 0xf3, 0x27, 0x89, 0xbe,
- 0x42, 0xdc, 0x3b, 0xbe, 0x03, 0xde, 0x26, 0x3c, 0xd1, 0x1b, 0xe0, 0xbe,
- 0x2b, 0xdb, 0x8a, 0xbe, 0xed, 0xa5, 0x07, 0xbe, 0xc5, 0xb9, 0xa7, 0x3d,
- 0x4c, 0xb2, 0x67, 0xbe, 0xe9, 0x2e, 0x96, 0x3e, 0xfe, 0xa2, 0x76, 0x3e,
- 0xee, 0x32, 0x05, 0xbf, 0x4c, 0xf3, 0xc7, 0x3d, 0x7f, 0xf9, 0x8d, 0x3e,
- 0xac, 0x72, 0xaa, 0x3e, 0xe6, 0xb9, 0x95, 0x3d, 0x6e, 0xb4, 0x4a, 0x3e,
- 0x94, 0x5e, 0xac, 0xbc, 0x38, 0xa4, 0x87, 0x3c, 0x12, 0x90, 0x69, 0x3e,
- 0x86, 0xf8, 0xd2, 0xbd, 0x06, 0x2a, 0xb4, 0xbd, 0x86, 0x37, 0x39, 0x3e,
- 0xa7, 0x01, 0x5d, 0x3e, 0xe5, 0xb6, 0x52, 0xbd, 0x4a, 0x8b, 0x64, 0xbe,
- 0x27, 0xfe, 0x26, 0x3e, 0x36, 0x48, 0x42, 0x3b, 0x9b, 0x9b, 0x11, 0xbe,
- 0x87, 0x14, 0x70, 0xbe, 0xd7, 0xa1, 0x30, 0xbe, 0x67, 0x6f, 0x98, 0x3e,
- 0xa5, 0x0a, 0x87, 0x3e, 0x0b, 0x48, 0x92, 0x3e, 0x69, 0x67, 0x3e, 0xbe,
- 0x15, 0xff, 0x96, 0xbe, 0x86, 0xd1, 0x11, 0x3e, 0x69, 0xc4, 0x86, 0x3f,
- 0x8d, 0xa0, 0x36, 0x3e, 0x37, 0xb6, 0x93, 0x3e, 0x14, 0x1d, 0x87, 0xbf,
- 0x70, 0xb3, 0xf2, 0x3e, 0x1a, 0x01, 0x2d, 0xbf, 0x41, 0x31, 0x6c, 0xbc,
- 0x0e, 0xae, 0x38, 0x3f, 0x92, 0xe7, 0x93, 0xbd, 0x7a, 0x66, 0x2e, 0x3e,
- 0x88, 0xa3, 0xe2, 0x3e, 0x6c, 0xdd, 0x83, 0xbe, 0x76, 0x71, 0x9b, 0xbd,
- 0x8d, 0xec, 0x7b, 0xbf, 0x9a, 0x09, 0xe4, 0x3c, 0xf5, 0xe1, 0x4f, 0x3c,
- 0x55, 0xf2, 0xbb, 0x3e, 0x34, 0x5f, 0x2c, 0x3e, 0x34, 0x5c, 0x0c, 0xbe,
- 0xf2, 0x76, 0x31, 0xbf, 0x84, 0x36, 0x27, 0x3d, 0x55, 0x99, 0xd5, 0x3d,
- 0xa6, 0xf8, 0x42, 0x3e, 0xe2, 0xea, 0x2f, 0xbd, 0xf4, 0x06, 0xc8, 0x3e,
- 0xc4, 0xbb, 0x8d, 0xbe, 0x1a, 0xf6, 0xcd, 0x3e, 0xae, 0x16, 0x98, 0x3d,
- 0xd7, 0x53, 0xff, 0x3e, 0x4e, 0xd8, 0xbe, 0x3d, 0x03, 0x5f, 0x08, 0x3d,
- 0xef, 0xd2, 0x95, 0x3e, 0x3a, 0x3b, 0xcf, 0xbe, 0xbd, 0x8c, 0x8b, 0xbe,
- 0x12, 0xd7, 0xf1, 0xbe, 0x8d, 0xd7, 0x2b, 0x3e, 0x32, 0xa4, 0xc3, 0x3d,
- 0x50, 0x65, 0x89, 0x3e, 0x29, 0xf5, 0xdc, 0x3e, 0x0f, 0xc8, 0xd4, 0x3e,
- 0xf2, 0x66, 0xa2, 0x3e, 0x83, 0xb3, 0x69, 0x3d, 0xa4, 0x5b, 0x86, 0x3e,
- 0x49, 0x8d, 0x2d, 0x3f, 0x33, 0x73, 0x5b, 0x3f, 0x0f, 0x66, 0x1d, 0xbd,
- 0x34, 0xc0, 0xee, 0xbe, 0x09, 0x31, 0xd0, 0xbe, 0x6e, 0x7d, 0xb6, 0x3e,
- 0xe0, 0x32, 0x11, 0xbe, 0xeb, 0x0c, 0xe1, 0x3e, 0xb8, 0x62, 0x10, 0xbf,
- 0x94, 0xef, 0xac, 0x3e, 0xfe, 0xf2, 0x9c, 0x3f, 0x4a, 0x20, 0x4f, 0xbf,
- 0xf5, 0x09, 0x01, 0xbf, 0xc5, 0x26, 0x9a, 0xbe, 0xc0, 0x94, 0x2e, 0x3d,
- 0x0a, 0xfa, 0xa2, 0x3e, 0x90, 0x2f, 0xec, 0x3d, 0x0d, 0x35, 0x20, 0x3e,
- 0x29, 0x14, 0x94, 0x3d, 0xe7, 0x8b, 0xe8, 0xbe, 0x4e, 0xe8, 0x97, 0xbe,
- 0x1e, 0x2e, 0x87, 0xbe, 0xac, 0xaa, 0x10, 0x3d, 0x49, 0x78, 0x09, 0xbe,
- 0x6b, 0x07, 0x0d, 0x3f, 0x92, 0xd4, 0xfd, 0xbd, 0xff, 0xe6, 0x22, 0x3c,
- 0xf5, 0xf2, 0x3a, 0x3f, 0x2c, 0x97, 0x79, 0xbd, 0x90, 0x15, 0xba, 0xbe,
- 0x2e, 0x4a, 0xa5, 0x3e, 0x54, 0xac, 0x0a, 0xbc, 0x06, 0xb1, 0xfe, 0xbc,
- 0xdf, 0xc0, 0xe2, 0xbd, 0x49, 0x12, 0xcd, 0x3e, 0x7c, 0x54, 0x62, 0x3f,
- 0x1c, 0x08, 0xc4, 0x3c, 0xa0, 0x34, 0xd1, 0xbf, 0x0d, 0x55, 0x08, 0x3f,
- 0x0a, 0xd5, 0xe8, 0xbe, 0x3e, 0x8f, 0xda, 0x3e, 0x7a, 0x68, 0x87, 0xbd,
- 0x1c, 0xab, 0x6d, 0xbe, 0x25, 0xf4, 0x30, 0x3d, 0x2b, 0x0f, 0xfe, 0x3e,
- 0x6c, 0x9f, 0xc4, 0xbd, 0x0b, 0xad, 0xac, 0x3e, 0x30, 0xe1, 0xaa, 0x3e,
- 0xc7, 0x6f, 0x90, 0xbe, 0x80, 0x4d, 0x9a, 0x3e, 0x61, 0xde, 0x91, 0xbe,
- 0xf9, 0x1a, 0x41, 0xbe, 0x93, 0x25, 0x1c, 0x3f, 0xa1, 0x8c, 0x99, 0xbd,
- 0x46, 0x79, 0xc1, 0xbd, 0xa9, 0x22, 0xde, 0x3c, 0x77, 0xff, 0x84, 0xbe,
- 0x26, 0xa4, 0x26, 0xbe, 0x7b, 0xac, 0x25, 0xbe, 0x5c, 0xbe, 0x46, 0xbf,
- 0xbd, 0xcb, 0x56, 0xbf, 0x88, 0x5a, 0xc4, 0xbd, 0x7a, 0x46, 0x31, 0x3e,
- 0x59, 0xf8, 0x31, 0xbf, 0xd3, 0xd7, 0x35, 0x3d, 0x19, 0xf4, 0xb6, 0x3d,
- 0x4e, 0xd6, 0x8c, 0xbd, 0x9b, 0x02, 0xb5, 0xbe, 0x91, 0x65, 0xe5, 0x3d,
- 0xba, 0x3d, 0x86, 0x3e, 0x15, 0xd4, 0x2c, 0xbe, 0x6f, 0x3c, 0x01, 0xbe,
- 0x0a, 0xd5, 0xc9, 0x3c, 0x34, 0x25, 0x87, 0xbd, 0x2a, 0x73, 0x1f, 0xbd,
- 0xdf, 0x62, 0x1b, 0x3e, 0x98, 0x72, 0x2b, 0xbe, 0xdc, 0x60, 0x9c, 0x3d,
- 0x45, 0xce, 0x7c, 0x3d, 0xde, 0x6f, 0x63, 0x3d, 0x70, 0xd3, 0x3b, 0x3e,
- 0x5a, 0x01, 0x5c, 0xbd, 0xd8, 0xa8, 0x86, 0xbd, 0x1b, 0xe7, 0x05, 0xbd,
- 0xfd, 0x3a, 0x0b, 0x3e, 0x87, 0x30, 0xdb, 0xbc, 0x0e, 0x15, 0x64, 0x3d,
- 0xb6, 0xcb, 0x8a, 0x3d, 0x60, 0xdf, 0xcc, 0xbd, 0x90, 0x3d, 0x2d, 0x3e,
- 0x4c, 0x95, 0xdb, 0xbd, 0x90, 0x6d, 0xec, 0x3c, 0x69, 0xb4, 0x41, 0xbe,
- 0x1e, 0x86, 0x09, 0xbe, 0x67, 0xbe, 0x70, 0x3e, 0xea, 0x2f, 0x45, 0xbe,
- 0xcd, 0x0e, 0x3f, 0x3e, 0xbf, 0x9a, 0x0a, 0x3d, 0xb0, 0xa7, 0x63, 0x3b,
- 0xd4, 0x54, 0x09, 0x3e, 0x3b, 0xdb, 0x58, 0x3d, 0xa8, 0x58, 0x1b, 0xbc,
- 0xa5, 0x13, 0xc9, 0x3d, 0xe8, 0x0d, 0xcd, 0x3d, 0x1c, 0xc5, 0x06, 0x3d,
- 0x92, 0xdf, 0x94, 0x3c, 0xd9, 0x0c, 0x90, 0xbd, 0xbf, 0x7f, 0x31, 0xbe,
- 0x24, 0xc1, 0x44, 0x3d, 0xe7, 0xec, 0xaf, 0x3c, 0x95, 0x6c, 0xb1, 0xbd,
- 0x96, 0x86, 0x61, 0x3c, 0xea, 0xfd, 0xc2, 0x3c, 0xdd, 0x40, 0xbe, 0xbd,
- 0x4c, 0x6d, 0xa1, 0xbd, 0x3b, 0xf6, 0x8c, 0xbe, 0x8b, 0xac, 0xf7, 0x3d,
- 0xa6, 0x32, 0x3e, 0x3e, 0x30, 0x20, 0x96, 0x3d, 0x65, 0x38, 0xc1, 0x3d,
- 0x06, 0x14, 0x68, 0xbd, 0xfc, 0x11, 0xa0, 0x3c, 0xa0, 0x3a, 0x20, 0xbe,
- 0x72, 0x46, 0x40, 0xbd, 0x92, 0x42, 0x9c, 0xbb, 0x28, 0xb7, 0x82, 0x3e,
- 0x9a, 0x21, 0x15, 0x3e, 0xa3, 0x0a, 0x17, 0xbe, 0xfc, 0xe1, 0x93, 0xbe,
- 0x50, 0xb5, 0x1e, 0x3e, 0xf3, 0x58, 0xcf, 0xbd, 0xf8, 0xea, 0xea, 0xbd,
- 0x3e, 0xe8, 0x68, 0x3e, 0x94, 0xf5, 0x4f, 0xbe, 0xdf, 0x80, 0xb2, 0xbd,
- 0xea, 0x7e, 0x13, 0xbe, 0x8e, 0x09, 0x15, 0xbd, 0x71, 0x89, 0xa1, 0x3d,
- 0x55, 0x18, 0x6a, 0x3e, 0xd7, 0x09, 0xef, 0xbd, 0x9f, 0x2a, 0x06, 0x3d,
- 0x0c, 0xed, 0x4e, 0xbd, 0x5f, 0x06, 0xc9, 0xbd, 0x44, 0xc7, 0xda, 0x3c,
- 0x73, 0xaa, 0x87, 0x3e, 0xf9, 0x75, 0x42, 0x3d, 0xe1, 0x18, 0xdb, 0x3c,
- 0x18, 0xff, 0xd4, 0xbd, 0x28, 0x99, 0x05, 0xbe, 0x7b, 0x54, 0xef, 0xbd,
- 0x02, 0x37, 0xd8, 0xbd, 0xdc, 0xb0, 0x08, 0x3d, 0xa4, 0xdb, 0x81, 0x3c,
- 0x32, 0x78, 0xd7, 0xbc, 0x54, 0xaa, 0x66, 0xbd, 0x2c, 0xb5, 0xe9, 0x3c,
- 0x05, 0x64, 0x63, 0xbe, 0x92, 0xcc, 0x2d, 0x3e, 0x35, 0x9d, 0x26, 0x3e,
- 0x9e, 0x53, 0x2b, 0xbf, 0xf2, 0x38, 0x51, 0x3e, 0xce, 0x57, 0x24, 0x3c,
- 0xcd, 0x47, 0x36, 0xbe, 0xa6, 0x97, 0x85, 0x3e, 0x00, 0x36, 0x77, 0x3e,
- 0xff, 0xfc, 0xc3, 0xbe, 0xec, 0xd7, 0x66, 0xbd, 0x38, 0x7e, 0x3a, 0x3a,
- 0x7c, 0x75, 0x8b, 0xbe, 0xaf, 0xe4, 0xa3, 0x3b, 0x73, 0x09, 0xc9, 0x3d,
- 0xaa, 0x65, 0x26, 0xbe, 0xd1, 0x30, 0x81, 0xbd, 0x5f, 0x90, 0x1d, 0xbe,
- 0x5f, 0x13, 0xa8, 0xba, 0x0f, 0xc8, 0x31, 0x3e, 0x23, 0x15, 0x54, 0x3e,
- 0x44, 0xc7, 0x32, 0x3e, 0x93, 0xdc, 0x19, 0x3b, 0x5b, 0xa9, 0xb8, 0xbe,
- 0xa7, 0x27, 0x3b, 0x3e, 0xb5, 0x53, 0x18, 0xbe, 0x18, 0xd9, 0x11, 0xbe,
- 0x15, 0xf1, 0x37, 0x3d, 0xe3, 0xab, 0x03, 0x3e, 0x9e, 0xae, 0x55, 0x3e,
- 0xcf, 0x14, 0xa3, 0xbe, 0xe0, 0xf3, 0x8f, 0x3f, 0x8e, 0x50, 0x79, 0x3c,
- 0x3c, 0x92, 0x2c, 0x3f, 0x57, 0x04, 0xb3, 0xbd, 0xfd, 0x73, 0x25, 0x3f,
- 0xc1, 0x2e, 0x43, 0x3e, 0xea, 0xd2, 0xce, 0x3e, 0x7d, 0x44, 0x13, 0xbf,
- 0xf0, 0x0a, 0xc9, 0xbe, 0x25, 0xf0, 0x09, 0x3f, 0xb4, 0xe9, 0x95, 0xbd,
- 0x82, 0x54, 0x0c, 0x3e, 0xa8, 0x64, 0xca, 0x3e, 0x31, 0x92, 0x04, 0xbe,
- 0xdb, 0xf3, 0xbf, 0xbe, 0x2c, 0x80, 0xb1, 0x3d, 0x2f, 0x05, 0x26, 0xbf,
- 0xa3, 0x1b, 0x11, 0xbf, 0x1a, 0x48, 0xa0, 0xbe, 0x94, 0x5d, 0xc8, 0x3e,
- 0x99, 0x0d, 0xa4, 0x3e, 0x44, 0x55, 0x02, 0xbd, 0x3a, 0xd3, 0xd2, 0xba,
- 0x68, 0x7c, 0x2b, 0xbe, 0x95, 0x85, 0x8b, 0x3e, 0x56, 0x3b, 0x98, 0xbe,
- 0xed, 0x1e, 0x91, 0xbf, 0x07, 0x92, 0xff, 0xbd, 0x2e, 0x4d, 0x2c, 0xbe,
- 0x3b, 0x25, 0xee, 0x3e, 0x46, 0xc8, 0x39, 0xbf, 0xa0, 0xab, 0x44, 0x3d,
- 0xca, 0xdc, 0xf5, 0x3e, 0x07, 0x98, 0xef, 0x3e, 0x8e, 0xbb, 0xd3, 0xbe,
- 0x3c, 0x55, 0x48, 0x3e, 0x03, 0xed, 0x39, 0xbe, 0x16, 0x4e, 0x4a, 0xbd,
- 0x4c, 0x10, 0x68, 0xbf, 0xcf, 0x8e, 0x8b, 0x3d, 0x35, 0x36, 0xea, 0x3d,
- 0x30, 0xb9, 0x61, 0xbe, 0x18, 0x6b, 0x31, 0xbe, 0x40, 0x04, 0x5d, 0x3f,
- 0x5d, 0x20, 0x98, 0x3e, 0x82, 0x03, 0x40, 0xbe, 0xd2, 0xd9, 0x73, 0xbe,
- 0xc7, 0x9d, 0x89, 0x3e, 0x49, 0xa8, 0xa4, 0xbe, 0xc4, 0xdb, 0x4e, 0xbd,
- 0x80, 0x5d, 0x05, 0xbe, 0x9d, 0x69, 0x5a, 0x3f, 0xe5, 0xdf, 0xa7, 0xbe,
- 0x6b, 0xd8, 0x04, 0xbe, 0x45, 0xad, 0xa2, 0xbd, 0x4d, 0xf8, 0x05, 0x3e,
- 0x63, 0x3a, 0x92, 0x3d, 0x78, 0x67, 0xda, 0xbe, 0xd4, 0x87, 0xd6, 0x3e,
- 0xc6, 0x4b, 0x35, 0x3f, 0xdc, 0x60, 0x73, 0x3e, 0xed, 0x77, 0x98, 0x3c,
- 0xb2, 0xb0, 0x65, 0xbe, 0xda, 0xd7, 0xb7, 0xbd, 0xc5, 0x1e, 0x8c, 0x3d,
- 0x95, 0x8b, 0x9e, 0x3d, 0xa4, 0x04, 0x6f, 0x3e, 0x7b, 0xec, 0x49, 0xbf,
- 0x8d, 0xd7, 0x80, 0x3e, 0xf5, 0x47, 0x94, 0xbd, 0xb2, 0xfc, 0x01, 0x3e,
- 0xfd, 0x3d, 0x7e, 0xbe, 0x47, 0x83, 0x6a, 0x3d, 0x73, 0x53, 0xbe, 0xbe,
- 0xff, 0xa1, 0x2e, 0x3f, 0xc9, 0x58, 0x63, 0x3e, 0x5d, 0xd9, 0x6a, 0xbf,
- 0x54, 0xf2, 0x0d, 0xbf, 0xec, 0x58, 0x05, 0xbe, 0xb9, 0xca, 0x7b, 0xbd,
- 0x9b, 0xd5, 0x98, 0x3c, 0xe8, 0xe6, 0x85, 0x3d, 0x6a, 0x63, 0x55, 0xbe,
- 0x20, 0xa2, 0xf8, 0x3d, 0x00, 0x55, 0xe4, 0x3e, 0x61, 0xe7, 0x62, 0x3e,
- 0xa6, 0xfb, 0x87, 0xbd, 0x4c, 0x56, 0xc1, 0x3d, 0xf4, 0xf8, 0x93, 0xbd,
- 0x8a, 0xca, 0x13, 0xbf, 0x1f, 0x61, 0x1a, 0xbc, 0x4a, 0x28, 0xe8, 0x3c,
- 0xe0, 0xdf, 0xcd, 0xbe, 0x59, 0x1c, 0x96, 0x3e, 0xc1, 0xc0, 0x58, 0x3e,
- 0xf2, 0x43, 0x31, 0xbf, 0xbd, 0x72, 0xdd, 0xbe, 0x9b, 0x5c, 0x71, 0x3f,
- 0x08, 0x50, 0x3f, 0xbe, 0xfa, 0x00, 0x57, 0xbf, 0x03, 0x6a, 0xa1, 0xbe,
- 0x47, 0xf2, 0x66, 0xbe, 0x42, 0xc5, 0x49, 0xbe, 0xc8, 0xb8, 0x31, 0xbe,
- 0xda, 0x24, 0x0d, 0xbd, 0xa2, 0x63, 0xab, 0x3e, 0x34, 0xc3, 0x6f, 0x3e,
- 0x19, 0xe8, 0x88, 0x3e, 0xe6, 0x83, 0x11, 0x3e, 0x66, 0x5f, 0x02, 0xbe,
- 0x94, 0x00, 0x11, 0x3f, 0x00, 0xad, 0x16, 0xbd, 0xd0, 0x8d, 0x8a, 0xbe,
- 0x50, 0x6d, 0xc4, 0xbd, 0xfe, 0x59, 0x21, 0x3e, 0x5f, 0x9b, 0x4c, 0x3e,
- 0x0c, 0x94, 0x70, 0xbe, 0xad, 0xf9, 0x89, 0xbd, 0x54, 0x61, 0x0e, 0xbe,
- 0x34, 0x6d, 0xdb, 0xbd, 0xf3, 0x70, 0x0a, 0xbe, 0xf8, 0xd5, 0x15, 0x3d,
- 0xe4, 0xa9, 0xbc, 0x3d, 0x42, 0xd9, 0x2a, 0x3e, 0x67, 0x92, 0x35, 0x3e,
- 0xc0, 0xcf, 0xd3, 0xbd, 0xe8, 0x1e, 0xa0, 0x3c, 0x4f, 0x89, 0x19, 0xbf,
- 0xc8, 0x05, 0xd4, 0xbd, 0xd0, 0x3c, 0x6e, 0x3e, 0x34, 0x4a, 0x0b, 0x3f,
- 0x4d, 0xb0, 0xa7, 0xbe, 0xda, 0x71, 0xf6, 0x3e, 0x98, 0xbb, 0xcc, 0xbc,
- 0x00, 0xad, 0x3e, 0xbd, 0x6d, 0xb9, 0x56, 0x3e, 0xba, 0xfa, 0x66, 0xbe,
- 0x40, 0x82, 0x75, 0x3e, 0x19, 0x76, 0x8d, 0xbd, 0x38, 0x38, 0xa8, 0x3e,
- 0x87, 0x4a, 0xbb, 0x3d, 0xd2, 0xa2, 0x26, 0xbe, 0xac, 0xb0, 0x1e, 0xbe,
- 0xc9, 0xb9, 0x27, 0xbe, 0x67, 0x72, 0x26, 0xbd, 0x0b, 0x48, 0x87, 0x3e,
- 0xa1, 0x70, 0x94, 0xbe, 0xde, 0xf9, 0xf7, 0x3d, 0x88, 0x92, 0x9d, 0x3d,
- 0x40, 0xa4, 0xb9, 0xbd, 0x62, 0x9e, 0xc9, 0x3e, 0x91, 0xac, 0x21, 0x3e,
- 0x8a, 0x39, 0x5b, 0xbe, 0xb0, 0x26, 0x0a, 0x3e, 0xca, 0xe5, 0x80, 0xbe,
- 0x65, 0xe0, 0x3c, 0xbc, 0x53, 0x29, 0x69, 0x3e, 0x90, 0x8a, 0xe9, 0xbd,
- 0x68, 0xf7, 0x55, 0xbe, 0x77, 0x26, 0x91, 0xbd, 0xf2, 0x2b, 0xf4, 0xbc,
- 0x66, 0x12, 0xea, 0x3e, 0x3c, 0xdb, 0xed, 0x3a, 0xa0, 0x0c, 0xcf, 0x3d,
- 0x00, 0xa7, 0xde, 0x3b, 0x64, 0x4d, 0x43, 0xbe, 0x47, 0x55, 0xa7, 0x3b,
- 0x96, 0x35, 0x84, 0x3e, 0xce, 0x1f, 0xac, 0xbd, 0x03, 0x92, 0x97, 0xbd,
- 0xa1, 0x13, 0x3c, 0x3d, 0xba, 0xdd, 0x91, 0xbe, 0xa7, 0x14, 0x81, 0xbe,
- 0x57, 0xb5, 0x30, 0x3e, 0xf5, 0x73, 0x0d, 0x3e, 0x8c, 0xd3, 0xa0, 0xbe,
- 0xf7, 0xa4, 0x97, 0xbd, 0xb0, 0x25, 0x76, 0x3e, 0xbd, 0xa7, 0x48, 0xbe,
- 0x01, 0xc1, 0xc2, 0xbe, 0x9b, 0xd7, 0x69, 0x3e, 0x5e, 0xc0, 0xee, 0xbd,
- 0xe7, 0xe2, 0x13, 0xbd, 0x43, 0x36, 0xff, 0xbd, 0xd3, 0x85, 0xe7, 0x3b,
- 0xab, 0xb6, 0xa0, 0xbd, 0x82, 0x98, 0xa1, 0x3d, 0xc9, 0x69, 0xc3, 0x3d,
- 0xfa, 0x4c, 0xc7, 0x3d, 0x3d, 0x2e, 0x21, 0xbe, 0x3e, 0xfb, 0xa5, 0xbd,
- 0x28, 0xa2, 0x8e, 0x3e, 0xba, 0x6c, 0x26, 0x3e, 0xaa, 0xd6, 0x25, 0x3d,
- 0x9e, 0x3a, 0xbb, 0x3e, 0x45, 0x48, 0x08, 0x3e, 0x5b, 0x9c, 0x13, 0xbe,
- 0x10, 0x3e, 0x51, 0x3d, 0x4d, 0x78, 0x15, 0xbd, 0xb0, 0x3f, 0x8b, 0x3d,
- 0x82, 0x80, 0xcb, 0xbc, 0x61, 0x6a, 0xcf, 0xbb, 0x28, 0x48, 0xad, 0xbe,
- 0x13, 0xe3, 0xd2, 0x3e, 0x67, 0x2a, 0x56, 0xbe, 0xb6, 0xdf, 0xc0, 0x3d,
- 0x8a, 0xec, 0x24, 0xbd, 0x23, 0xb1, 0xa3, 0x3c, 0x8a, 0xbd, 0x06, 0xbe,
- 0x2d, 0x3e, 0x1f, 0xbe, 0x86, 0x9c, 0xf3, 0x3c, 0x6f, 0x48, 0x29, 0xbc,
- 0xa7, 0xfa, 0x2b, 0xbe, 0x13, 0x79, 0x28, 0xbe, 0x87, 0xd3, 0x78, 0x3d,
- 0x8b, 0xd7, 0x8d, 0x3d, 0xda, 0x8c, 0x5b, 0x3c, 0xab, 0x3c, 0x94, 0xbe,
- 0x17, 0x7b, 0xfb, 0xbd, 0x42, 0xfc, 0xb4, 0x3d, 0x42, 0x2e, 0x4b, 0x3e,
- 0x87, 0xc1, 0x4b, 0xbc, 0x55, 0x0b, 0x6d, 0x3d, 0x51, 0xb9, 0x98, 0xbd,
- 0x39, 0x1c, 0x00, 0xbd, 0xe0, 0xe2, 0x16, 0x3e, 0x11, 0xde, 0x65, 0xbe,
- 0xee, 0x98, 0x2c, 0x3d, 0x25, 0x85, 0xc7, 0x3d, 0x44, 0xb9, 0x5d, 0xbe,
- 0xf2, 0xc2, 0xd8, 0x3c, 0xc6, 0xc2, 0x5f, 0x3d, 0x84, 0xb7, 0x9c, 0xbd,
- 0xeb, 0xf9, 0x1a, 0xbd, 0xfb, 0xb9, 0xe4, 0xba, 0x35, 0x1e, 0x0e, 0x3e,
- 0xdb, 0x1f, 0x2d, 0xbe, 0x87, 0x65, 0xd1, 0x3d, 0xd9, 0xbb, 0x20, 0xbd,
- 0xf8, 0x9c, 0xf2, 0x3d, 0xee, 0x29, 0xee, 0xbd, 0x82, 0xdd, 0x05, 0x3e,
- 0xf7, 0x48, 0x04, 0xbf, 0x1a, 0xf2, 0x4a, 0x3d, 0x2e, 0xfa, 0x19, 0xbf,
- 0x27, 0xc4, 0x3c, 0xbd, 0x4e, 0x4b, 0x78, 0x3d, 0xa9, 0x7b, 0x0c, 0xbf,
- 0x5a, 0xbc, 0x13, 0xbe, 0x5b, 0x46, 0x9e, 0x3e, 0xcb, 0x30, 0x33, 0x3e,
- 0x2f, 0x0e, 0x0e, 0xbc, 0xb5, 0x2b, 0xb9, 0x3e, 0x95, 0x25, 0x4b, 0xbe,
- 0xa0, 0x15, 0x83, 0x3d, 0x8e, 0x81, 0x18, 0xbe, 0x4a, 0xd5, 0x5d, 0x3e,
- 0xb1, 0x01, 0x70, 0xbd, 0xfe, 0xad, 0x38, 0xbe, 0xc8, 0x38, 0x26, 0xbe,
- 0x4b, 0xd3, 0x28, 0xbd, 0x77, 0xbb, 0xf8, 0x3d, 0xb7, 0x5c, 0xe2, 0x3d,
- 0x4c, 0x44, 0x2f, 0x3b, 0x18, 0x4c, 0x1b, 0xbd, 0x9f, 0x74, 0xc0, 0x3d,
- 0xbf, 0x87, 0xd7, 0xbd, 0x3c, 0x93, 0xd8, 0x3e, 0x72, 0x42, 0xdb, 0x3d,
- 0xa3, 0x22, 0x67, 0xbe, 0x75, 0x40, 0xed, 0xbe, 0xe9, 0x9f, 0x58, 0xbe,
- 0xf6, 0x64, 0x98, 0xbe, 0x4f, 0xb5, 0xd6, 0xbc, 0x1c, 0xb0, 0xa2, 0x3d,
- 0x8b, 0x75, 0x1e, 0xbe, 0xcc, 0x72, 0xf9, 0x3c, 0x1b, 0x97, 0x4d, 0x3e,
- 0x9c, 0x54, 0xab, 0x3e, 0xb4, 0x7c, 0x3e, 0x3c, 0xa4, 0x23, 0xf1, 0x3d,
- 0x30, 0x44, 0x9d, 0x3e, 0xa7, 0xe9, 0x94, 0xbe, 0x50, 0x1c, 0xa2, 0xbd,
- 0x6c, 0xf9, 0x28, 0x3e, 0x7f, 0x46, 0xb5, 0x3e, 0x99, 0xce, 0x33, 0xbd,
- 0xc4, 0x44, 0x91, 0x3d, 0x70, 0x66, 0xf7, 0xbd, 0x07, 0xc8, 0xa7, 0xbe,
- 0xb3, 0xb1, 0x8b, 0x3d, 0x0b, 0x4d, 0x1a, 0xbe, 0x34, 0xe8, 0xad, 0x3e,
- 0xd7, 0x66, 0xd4, 0x3c, 0x6e, 0xb5, 0x8e, 0x3e, 0xaf, 0x17, 0x82, 0xbd,
- 0x37, 0x34, 0x3e, 0xbe, 0xe3, 0x04, 0x9b, 0x3e, 0x03, 0x1d, 0x1d, 0xbd,
- 0x02, 0xce, 0x6a, 0xbd, 0x0b, 0xa5, 0x75, 0xbe, 0x16, 0x5b, 0xf3, 0xbe,
- 0x37, 0x1b, 0x30, 0xbd, 0x8a, 0xaa, 0xf4, 0xbd, 0x90, 0x7f, 0xae, 0xbd,
- 0xe1, 0xf3, 0xc0, 0x3d, 0x26, 0x09, 0x16, 0xbe, 0xb9, 0x4c, 0x57, 0x3b,
- 0x47, 0xf4, 0x38, 0xbd, 0x62, 0x28, 0x06, 0x3f, 0xe1, 0xaa, 0x9d, 0xbb,
- 0x23, 0x2e, 0x00, 0x3f, 0x2d, 0x11, 0xae, 0x3d, 0xed, 0x6b, 0xd3, 0xbd,
- 0x88, 0x69, 0xb8, 0x3c, 0xfa, 0xd4, 0xc3, 0x3e, 0xbb, 0x7c, 0x72, 0xbd,
- 0x22, 0x77, 0x3b, 0xbd, 0x25, 0x3a, 0xcb, 0x3e, 0xf1, 0xa9, 0x37, 0xbe,
- 0xf2, 0x84, 0xcc, 0x3d, 0xb1, 0xec, 0x66, 0xbe, 0x32, 0x6a, 0x1f, 0xbf,
- 0xe3, 0x78, 0xdf, 0x3c, 0xb5, 0xd3, 0x49, 0xbe, 0x59, 0xc5, 0x57, 0xbe,
- 0xe6, 0x7b, 0x86, 0xbe, 0xce, 0xe6, 0x93, 0x3e, 0xda, 0x3e, 0x07, 0x3e,
- 0xdf, 0x54, 0x58, 0xbe, 0x2a, 0xec, 0x92, 0xbd, 0x8e, 0xa4, 0x88, 0x3e,
- 0xb1, 0x56, 0xcd, 0x3d, 0x6b, 0xc8, 0x29, 0xbe, 0xc8, 0x20, 0xa8, 0x3e,
- 0x3f, 0xb3, 0xfe, 0x3c, 0x4d, 0xf5, 0xe8, 0xbc, 0x2a, 0xe8, 0x48, 0x3d,
- 0x93, 0x1e, 0x01, 0x3e, 0xfe, 0x41, 0x2e, 0x3e, 0xc0, 0x13, 0x95, 0xbd,
- 0xea, 0xac, 0x01, 0x3f, 0x1f, 0x5f, 0xfa, 0x3d, 0x17, 0x85, 0x98, 0xbe,
- 0x6f, 0xcd, 0x62, 0x3e, 0x10, 0x25, 0x91, 0xbd, 0xb9, 0x30, 0x34, 0xbc,
- 0xa5, 0x66, 0xa2, 0x3b, 0xd3, 0x4d, 0x5c, 0xbd, 0xb7, 0x22, 0xc2, 0x3e,
- 0xc1, 0x0c, 0x9a, 0xba, 0xd0, 0x87, 0xa4, 0xbd, 0x58, 0x10, 0x24, 0x39,
- 0xfd, 0x22, 0x59, 0xbe, 0x0a, 0x93, 0x06, 0x3d, 0x54, 0x03, 0x2f, 0x3f,
- 0x5c, 0xdd, 0x37, 0x3f, 0x2d, 0xc8, 0xb8, 0x3f, 0xdd, 0x0b, 0x06, 0xbf,
- 0xa0, 0xb4, 0x26, 0xbe, 0xb5, 0x5d, 0x8a, 0x3e, 0x29, 0xf1, 0x39, 0xbe,
- 0x99, 0x25, 0x82, 0x3e, 0x1e, 0x5c, 0x06, 0x3d, 0x07, 0x24, 0xaf, 0x3e,
- 0xcc, 0x78, 0x9e, 0x3e, 0xe4, 0x40, 0x27, 0x3e, 0x25, 0xee, 0x14, 0xbf,
- 0x0f, 0x2a, 0xc8, 0xbe, 0xfb, 0x45, 0xbe, 0x3e, 0xfb, 0x65, 0x0d, 0xbe,
- 0x08, 0xe9, 0x0c, 0x3f, 0x64, 0x89, 0xbb, 0xbe, 0xa4, 0x05, 0x55, 0xbe,
- 0x1c, 0xf7, 0x9a, 0xbe, 0xc1, 0x49, 0xc1, 0x3e, 0xa6, 0x3e, 0x8a, 0xbe,
- 0xf2, 0x3c, 0xd6, 0x3e, 0x79, 0x9e, 0x0c, 0xbd, 0x54, 0x27, 0x22, 0x3e,
- 0x48, 0xf8, 0x2b, 0x3e, 0x63, 0x2c, 0x86, 0xbe, 0xe1, 0xc4, 0xed, 0xbd,
- 0x88, 0xa6, 0x5d, 0x3d, 0x50, 0x1f, 0x90, 0xbe, 0xd3, 0xee, 0x2f, 0xbe,
- 0x93, 0xd6, 0xdd, 0x3d, 0x0a, 0x0f, 0xee, 0xbe, 0xd2, 0x4b, 0xda, 0xbb,
- 0x16, 0xc6, 0x16, 0xbf, 0x77, 0x7a, 0x3b, 0x3d, 0x89, 0xe0, 0x0f, 0xbd,
- 0x13, 0xdd, 0x2c, 0x3e, 0x10, 0x88, 0xdb, 0x3e, 0x3c, 0x44, 0x07, 0x3f,
- 0x50, 0x8f, 0x8c, 0x3c, 0xdc, 0xf5, 0x33, 0xbe, 0x6b, 0xf2, 0x9b, 0x3e,
- 0x51, 0x99, 0xdd, 0x3e, 0xf0, 0x2d, 0x73, 0x3f, 0xe3, 0x7f, 0x8a, 0x3c,
- 0xa8, 0x3a, 0x85, 0xbf, 0xa9, 0x96, 0x9f, 0x3e, 0x59, 0x04, 0xbd, 0x3e,
- 0xdf, 0x35, 0x39, 0x3d, 0x35, 0x67, 0xab, 0xbe, 0xcb, 0xc7, 0x0d, 0xbf,
- 0x2c, 0x64, 0x15, 0x3f, 0x2f, 0x80, 0x4d, 0x3f, 0xf6, 0x90, 0x3b, 0xbf,
- 0xf3, 0x64, 0x31, 0xbf, 0xd3, 0xdc, 0x45, 0xbe, 0xda, 0x31, 0xf3, 0xbe,
- 0xa8, 0xf2, 0x95, 0x3e, 0xa4, 0x9a, 0x19, 0x3f, 0x0f, 0xad, 0x42, 0x3e,
- 0xbc, 0x90, 0x83, 0x3d, 0xd7, 0xcb, 0x6c, 0xbf, 0x6f, 0x46, 0xc2, 0xbe,
- 0x8f, 0x2b, 0x08, 0x3d, 0x52, 0x9d, 0x3e, 0x3e, 0x6a, 0x89, 0x86, 0xbe,
- 0xf8, 0x22, 0x59, 0xbe, 0x59, 0x6d, 0x01, 0xbd, 0xda, 0x83, 0x45, 0xbe,
- 0x96, 0x35, 0x07, 0x3f, 0xc7, 0xc1, 0x11, 0x3f, 0x44, 0x12, 0x95, 0x3d,
- 0xdb, 0x7f, 0x16, 0x3e, 0xf1, 0xed, 0x37, 0xbd, 0x3c, 0x99, 0xdb, 0x3d,
- 0x28, 0xd9, 0x02, 0x3e, 0xc4, 0xd8, 0xfb, 0x3d, 0x96, 0x3b, 0x17, 0x3f,
- 0x4f, 0x77, 0x48, 0x3d, 0xf6, 0xe2, 0x75, 0xbf, 0x86, 0xd8, 0x04, 0x3f,
- 0xdf, 0x57, 0x68, 0xbf, 0x13, 0x08, 0x06, 0xbe, 0x01, 0x75, 0x20, 0xbd,
- 0xc2, 0x30, 0x07, 0x3e, 0xe9, 0xfe, 0x24, 0xbe, 0xe6, 0x7f, 0x46, 0xbe,
- 0xf5, 0x70, 0x09, 0xbd, 0xd0, 0x55, 0xc2, 0x3e, 0x7b, 0x70, 0x2d, 0x3f,
- 0xbe, 0x31, 0x47, 0xbe, 0xf5, 0x4b, 0xcc, 0x3e, 0xd9, 0x05, 0x35, 0xbf,
- 0x0e, 0xec, 0x04, 0x3f, 0x27, 0x45, 0x36, 0x3e, 0x18, 0xd4, 0x60, 0xbe,
- 0x0d, 0x9c, 0xb2, 0x3d, 0xac, 0xa1, 0xe4, 0x3d, 0x17, 0x24, 0x3f, 0xbf,
- 0x78, 0x0d, 0x80, 0xbd, 0x02, 0xe1, 0x74, 0x3e, 0x36, 0x89, 0x36, 0xbf,
- 0x9a, 0xc3, 0x88, 0xbe, 0x17, 0x89, 0xdd, 0xbd, 0xdb, 0x64, 0xac, 0x3d,
- 0x2a, 0x8f, 0x28, 0xbf, 0x4c, 0x12, 0x3f, 0xbd, 0x4c, 0x82, 0x1c, 0xbe,
- 0x8f, 0x01, 0x87, 0x3d, 0xb0, 0xf7, 0xce, 0x3e, 0x73, 0xa9, 0xd3, 0x3e,
- 0x06, 0xe7, 0x01, 0x3f, 0xf9, 0x03, 0xb8, 0xbd, 0x81, 0x8b, 0xfd, 0xbd,
- 0x76, 0xe8, 0xa6, 0x3c, 0x51, 0xd4, 0x53, 0xbc, 0x3f, 0x53, 0xbb, 0xbd,
- 0xa8, 0x94, 0x45, 0xbe, 0x25, 0xf1, 0xd1, 0xbd, 0xcf, 0x02, 0xa5, 0x3d,
- 0x46, 0x61, 0xad, 0x3c, 0x25, 0x73, 0x91, 0x3d, 0x64, 0x2a, 0x01, 0xbf,
- 0x10, 0x14, 0xcf, 0x3d, 0x26, 0x60, 0x3a, 0x3c, 0x3d, 0xdb, 0x8c, 0xbd,
- 0xe9, 0x72, 0xfd, 0x3d, 0xbf, 0x6f, 0x77, 0xbe, 0x6d, 0x9a, 0x3a, 0xbc,
- 0x59, 0x46, 0x1c, 0x3e, 0x70, 0x78, 0x9e, 0x3d, 0x5d, 0x92, 0x31, 0x3c,
- 0x31, 0xc1, 0x10, 0x3e, 0x73, 0xcf, 0x66, 0x3e, 0x04, 0x7d, 0x9f, 0xbe,
- 0x75, 0xb5, 0xb5, 0xbc, 0x16, 0xd5, 0x80, 0x3e, 0xd0, 0x78, 0xa5, 0xbe,
- 0xf2, 0x4c, 0x21, 0x3e, 0xc8, 0x12, 0xa9, 0x3c, 0xb2, 0x3b, 0x33, 0xbc,
- 0xda, 0x73, 0x86, 0x3d, 0x84, 0xd1, 0x21, 0x3e, 0xb7, 0x2b, 0xef, 0xbd,
- 0x96, 0x63, 0x1f, 0xbe, 0xde, 0x01, 0xa7, 0xbd, 0x4c, 0xae, 0x4f, 0x3d,
- 0x60, 0x3a, 0x92, 0x3d, 0xee, 0xc6, 0x1d, 0xbd, 0xc0, 0xa5, 0xf9, 0xbb,
- 0xc8, 0x74, 0xb6, 0xbb, 0x28, 0xf7, 0x11, 0x3e, 0xba, 0x95, 0x64, 0x3d,
- 0xbd, 0xb4, 0xe7, 0xbd, 0x9d, 0x8e, 0x55, 0x3d, 0xa9, 0x63, 0x0d, 0xbe,
- 0x0e, 0x4b, 0x51, 0x3d, 0xda, 0xa2, 0xee, 0xbc, 0xfa, 0x60, 0xf2, 0x3d,
- 0x97, 0x3f, 0xda, 0x3c, 0xb0, 0xd5, 0x24, 0x3e, 0xa1, 0x49, 0xcb, 0x3d,
- 0xb6, 0x90, 0x12, 0xbe, 0x3a, 0xaa, 0x66, 0xbe, 0xfe, 0xa7, 0x9b, 0xbd,
- 0xeb, 0x47, 0xf4, 0xbd, 0xc8, 0xa9, 0x1c, 0x3d, 0x54, 0x76, 0xe2, 0xbe,
- 0xf5, 0x5c, 0x0d, 0x3e, 0xdf, 0xab, 0xa4, 0xbe, 0xb4, 0xa3, 0x0a, 0xbe,
- 0xae, 0xde, 0xdb, 0xbc, 0x1a, 0x8b, 0x9b, 0xbd, 0xe1, 0x9e, 0x14, 0xbc,
- 0xf9, 0xd2, 0xa0, 0x3e, 0xb8, 0xb5, 0x3d, 0x3e, 0xc3, 0x27, 0x89, 0xbd,
- 0x10, 0xb5, 0xc7, 0xbd, 0xc3, 0x2d, 0x1c, 0xbe, 0x97, 0xaa, 0x13, 0x3e,
- 0x76, 0x26, 0x72, 0x3e, 0x77, 0x8c, 0x1b, 0xbe, 0x05, 0x07, 0x38, 0xbe,
- 0x2f, 0x77, 0x85, 0x3c, 0xef, 0x81, 0x91, 0x3d, 0x5f, 0x2e, 0xe6, 0x3d,
- 0x25, 0x56, 0xa9, 0x3d, 0xaa, 0xb4, 0x29, 0xbd, 0x83, 0x81, 0xec, 0xbc,
- 0x76, 0xbb, 0x77, 0xbd, 0xbc, 0x4f, 0x1e, 0xbc, 0x8d, 0xbf, 0x5c, 0x3d,
- 0x6d, 0xd9, 0xcf, 0xbd, 0x6d, 0xb0, 0x9a, 0xbc, 0x73, 0x27, 0x0a, 0x3e,
- 0x1b, 0x09, 0x85, 0xbd, 0xd3, 0xc5, 0x5b, 0xbd, 0x32, 0x7c, 0x4e, 0xbd,
- 0xe3, 0x53, 0x0b, 0xbe, 0x21, 0x46, 0xc5, 0xbd, 0x24, 0x42, 0x17, 0x3e,
- 0x2c, 0x8e, 0x21, 0xbf, 0xdb, 0x98, 0x8d, 0x3e, 0xe6, 0xe5, 0x14, 0x3e,
- 0x70, 0xa1, 0x24, 0xbe, 0xc2, 0x34, 0x3a, 0x3e, 0x94, 0x3e, 0x89, 0x3e,
- 0x8f, 0xb2, 0xa6, 0xbe, 0xe9, 0x02, 0x22, 0xbe, 0xbf, 0xe8, 0x22, 0x3e,
- 0xf4, 0xfa, 0xf9, 0xbd, 0xb3, 0x8e, 0x85, 0xbd, 0x44, 0xa6, 0x68, 0x3e,
- 0x8a, 0x94, 0x7e, 0xbe, 0x8f, 0x93, 0x92, 0x3d, 0x3c, 0xbe, 0xa2, 0xbd,
- 0xc8, 0x0b, 0x97, 0x3b, 0x6f, 0x4e, 0x38, 0xbd, 0x25, 0xf4, 0xf2, 0xbd,
- 0xb0, 0x93, 0x2b, 0x3e, 0xac, 0x53, 0x40, 0xbd, 0xeb, 0xd5, 0x6d, 0xbe,
- 0xf9, 0x80, 0xac, 0x3d, 0x61, 0x0c, 0x20, 0xbe, 0x36, 0xb3, 0x09, 0xba,
- 0x48, 0xc0, 0xef, 0x3d, 0x0c, 0x63, 0x36, 0x3d, 0xa8, 0xf2, 0xd3, 0x3e,
- 0xfd, 0xfe, 0x8e, 0xbd, 0xa3, 0x6b, 0x87, 0x3f, 0xdf, 0xbf, 0x9d, 0xbd,
- 0xf2, 0x74, 0x07, 0x3f, 0xc7, 0xaf, 0xb9, 0x3c, 0xe5, 0x58, 0x29, 0x3f,
- 0x43, 0x99, 0x4a, 0x3e, 0x6a, 0x79, 0xbc, 0x3e, 0xb2, 0x26, 0x2c, 0xbf,
- 0x33, 0x6d, 0xf1, 0xbe, 0xc4, 0x19, 0x00, 0x3f, 0x40, 0x20, 0x36, 0xbf,
- 0x87, 0x39, 0xe5, 0xbd, 0x75, 0x80, 0x12, 0x3f, 0xf9, 0xc5, 0xf7, 0x3c,
- 0x78, 0xbb, 0xab, 0xbe, 0x6e, 0xd1, 0xa9, 0x3e, 0xfe, 0xd5, 0xf0, 0xbe,
- 0x78, 0xe8, 0x56, 0xbf, 0xcc, 0xff, 0x8a, 0xbc, 0xeb, 0x5e, 0xb3, 0x3e,
- 0x32, 0x2e, 0xfe, 0x3e, 0xa9, 0xc4, 0x9a, 0xbd, 0xa7, 0xde, 0xbd, 0x3d,
- 0xad, 0x45, 0xca, 0xbe, 0xd1, 0x55, 0x96, 0x3e, 0x3c, 0x35, 0xeb, 0xbe,
- 0xb6, 0xbb, 0x7f, 0xbf, 0x4a, 0x55, 0x63, 0xbd, 0xa9, 0x41, 0x5a, 0xbe,
- 0x12, 0x1c, 0x18, 0x3f, 0xd4, 0x94, 0x20, 0xbf, 0x25, 0xf2, 0x1d, 0xbc,
- 0x01, 0x2d, 0xd6, 0x3d, 0x93, 0x2f, 0xef, 0x3e, 0x5d, 0xd6, 0x8b, 0xbe,
- 0x6f, 0xa5, 0xc6, 0x3d, 0x63, 0x2f, 0x84, 0x3d, 0xe7, 0x42, 0xa7, 0x3d,
- 0x7f, 0xd2, 0x6b, 0xbf, 0x19, 0x02, 0x12, 0x3e, 0x7b, 0xde, 0x09, 0x3d,
- 0x35, 0x02, 0x8a, 0xbd, 0x38, 0x79, 0x8f, 0xbd, 0x28, 0x6f, 0x7e, 0x3f,
- 0xb0, 0x9e, 0xf1, 0x3e, 0xb2, 0x67, 0x47, 0xbd, 0x3b, 0x3b, 0x78, 0xbe,
- 0x9f, 0x0b, 0x42, 0x3e, 0xb4, 0x65, 0x01, 0xbe, 0x04, 0xf7, 0x6b, 0x3e,
- 0xb1, 0x48, 0x50, 0xbe, 0x54, 0x6d, 0x87, 0x3f, 0x7f, 0x67, 0x9a, 0xbd,
- 0x64, 0x47, 0xd9, 0x3d, 0x3c, 0x10, 0x9f, 0xbe, 0xd0, 0xf1, 0xae, 0xbe,
- 0x6c, 0x7d, 0x3b, 0x3e, 0x02, 0x0c, 0xd5, 0xbe, 0xd1, 0xc9, 0x04, 0x3f,
- 0xba, 0x6e, 0xe7, 0x3e, 0x41, 0x8f, 0x00, 0x3f, 0x56, 0x5d, 0x26, 0x3e,
- 0x98, 0x88, 0xb5, 0xbe, 0x46, 0x8b, 0x6b, 0x3e, 0xb7, 0x2b, 0x0a, 0xbe,
- 0x6d, 0xb0, 0x39, 0x3d, 0xf0, 0xe8, 0x10, 0x3e, 0x9b, 0x4d, 0x4b, 0xbf,
- 0x3f, 0x6a, 0xed, 0x3a, 0x56, 0xe1, 0x32, 0x3e, 0x73, 0x79, 0x66, 0x3e,
- 0x2f, 0x60, 0xc8, 0xbe, 0xbd, 0x0d, 0xde, 0xba, 0x94, 0x67, 0xc5, 0xbe,
- 0x76, 0x65, 0x49, 0x3e, 0x13, 0x6e, 0x07, 0x3d, 0x9a, 0x83, 0x55, 0xbf,
- 0xee, 0x10, 0x6b, 0xbe, 0x5a, 0x9e, 0x17, 0xbe, 0xc9, 0x4b, 0xf6, 0xbd,
- 0xef, 0x0f, 0xa4, 0x3d, 0xc7, 0xc5, 0x7e, 0x3e, 0xde, 0xa4, 0xa1, 0xbe,
- 0x3d, 0xaf, 0x07, 0x3e, 0x7b, 0x50, 0xfb, 0x3e, 0x2e, 0x05, 0xc3, 0xbc,
- 0x23, 0xe4, 0x36, 0xbd, 0x9b, 0xbf, 0x98, 0x3d, 0xb1, 0x11, 0x10, 0x3d,
- 0x96, 0x05, 0xf6, 0xbe, 0x4e, 0xa3, 0x5f, 0xbd, 0xa1, 0x4e, 0x07, 0x3d,
- 0x5d, 0xd3, 0x5e, 0xbe, 0x7a, 0xfa, 0xbb, 0x3e, 0x75, 0xb8, 0x5c, 0x3e,
- 0xfb, 0xcd, 0x8f, 0xbe, 0x75, 0x49, 0xb4, 0xbe, 0x69, 0x76, 0x63, 0x3f,
- 0x7f, 0x07, 0x55, 0xbb, 0xec, 0xde, 0x50, 0xbf, 0x4f, 0x7a, 0x24, 0xbe,
- 0x28, 0xe4, 0x15, 0xbc, 0xfa, 0x4b, 0x4d, 0xbe, 0x48, 0x35, 0xa3, 0xbe,
- 0xd0, 0xcc, 0xed, 0xbd, 0xf4, 0x21, 0x79, 0x3e, 0xf2, 0xe0, 0x88, 0x3d,
- 0x95, 0x0c, 0xd1, 0x3e, 0x57, 0x37, 0xde, 0x3c, 0x07, 0xe9, 0x2d, 0xbe,
- 0x19, 0x05, 0xf8, 0x3e, 0x5b, 0xf1, 0xa9, 0xbb, 0x4c, 0x46, 0xc6, 0xbd,
- 0xb5, 0x39, 0x80, 0x3c, 0x64, 0x8a, 0x57, 0x3e, 0x19, 0x7e, 0x30, 0x3e,
- 0xa8, 0x3c, 0xb6, 0xbd, 0xe5, 0xae, 0x00, 0xbe, 0x2d, 0x21, 0xe3, 0x3b,
- 0xec, 0xe1, 0x92, 0xbd, 0xf9, 0xba, 0x7a, 0xbc, 0xb0, 0x90, 0xbe, 0x3d,
- 0x1d, 0x79, 0x68, 0x3e, 0xdd, 0x69, 0x40, 0x3e, 0x7f, 0xe1, 0x4e, 0xbc,
- 0x21, 0x71, 0x0b, 0x3d, 0xd4, 0xa8, 0x1f, 0xbd, 0x7a, 0x34, 0x96, 0xbe,
- 0x7f, 0xaf, 0x22, 0xbe, 0xf5, 0x52, 0xe3, 0x3e, 0x67, 0x94, 0x45, 0x3f,
- 0x0d, 0x25, 0xe0, 0xbe, 0xed, 0xd3, 0xbc, 0x3e, 0x3f, 0x8f, 0x84, 0xbe,
- 0x37, 0x12, 0x02, 0xbe, 0x54, 0x4f, 0xc1, 0x3d, 0x5d, 0xaf, 0xb2, 0xbe,
- 0x46, 0xaf, 0xb0, 0x3d, 0xf9, 0x5d, 0x6f, 0x3e, 0x62, 0xf6, 0xce, 0x3e,
- 0x22, 0xc2, 0xed, 0x3d, 0xd8, 0x40, 0x4e, 0xbe, 0xba, 0x1a, 0x9a, 0xbe,
- 0x65, 0x65, 0xdc, 0x3d, 0x6f, 0x90, 0x0c, 0x3e, 0x77, 0xe9, 0x4a, 0x3d,
- 0x3c, 0xb2, 0xa2, 0xbe, 0x0d, 0xaf, 0x5b, 0x3e, 0x19, 0x9f, 0x27, 0x3c,
- 0x80, 0x3f, 0x68, 0xbe, 0x8b, 0x8d, 0x8e, 0x3e, 0x76, 0xb0, 0x6e, 0x3c,
- 0x7e, 0xcb, 0xa0, 0xbe, 0xad, 0x2c, 0xbe, 0x3e, 0x0f, 0xd9, 0xc2, 0xbe,
- 0xb9, 0xed, 0x1e, 0xbc, 0xdb, 0xf8, 0x62, 0x3d, 0x2e, 0x31, 0x95, 0xbc,
- 0xd7, 0x55, 0xd1, 0xbe, 0x66, 0x53, 0xb2, 0xbc, 0x36, 0xf8, 0x49, 0x3e,
- 0x7c, 0xee, 0x13, 0x3d, 0xfd, 0xa3, 0x06, 0x3e, 0x45, 0x42, 0x1c, 0x3e,
- 0xa5, 0x7f, 0xda, 0x3d, 0x05, 0xff, 0x17, 0xbe, 0x01, 0x19, 0x25, 0xbe,
- 0x1c, 0xd1, 0x01, 0x3f, 0x9e, 0x97, 0x97, 0xbe, 0xca, 0xc7, 0x32, 0xbe,
- 0x05, 0x5c, 0x30, 0xbd, 0xa9, 0xcb, 0xb6, 0xbd, 0x74, 0x59, 0x3b, 0xbd,
- 0x16, 0x8a, 0x77, 0x3e, 0x1f, 0x8b, 0x09, 0x3f, 0x2a, 0xe0, 0x0e, 0xbf,
- 0x1d, 0xd1, 0x27, 0xbe, 0x21, 0x61, 0x1f, 0x3d, 0xad, 0x72, 0x6f, 0xbd,
- 0x5f, 0xe9, 0xf3, 0xbe, 0x42, 0x67, 0xc3, 0x3e, 0xe9, 0x43, 0x37, 0x3d,
- 0xb8, 0xe5, 0x03, 0x3e, 0xb0, 0x37, 0xca, 0xbd, 0x46, 0x20, 0x99, 0x3d,
- 0x48, 0xca, 0x19, 0xbe, 0x0f, 0xb5, 0x76, 0x3d, 0xb7, 0xf3, 0x96, 0x3e,
- 0x94, 0x7c, 0x31, 0xbe, 0x55, 0xa2, 0x4f, 0xbd, 0x2e, 0x31, 0xf3, 0xbc,
- 0x81, 0x91, 0x6f, 0x3e, 0x28, 0xc4, 0x82, 0x3e, 0x9f, 0x9e, 0xca, 0x3d,
- 0xf1, 0x0c, 0x94, 0x3e, 0xec, 0x0b, 0x28, 0xbd, 0x96, 0x5a, 0x69, 0xbd,
- 0xcf, 0xb9, 0xdc, 0xbd, 0xa3, 0x56, 0x46, 0x3e, 0x44, 0x20, 0x44, 0xbc,
- 0x48, 0x05, 0xa8, 0xbd, 0xb8, 0xa3, 0x2b, 0x3d, 0x04, 0xb7, 0x42, 0xbe,
- 0xca, 0x62, 0x6c, 0x3e, 0x04, 0xfc, 0x68, 0xbe, 0xcf, 0x24, 0x85, 0x3e,
- 0x78, 0x34, 0xb6, 0xbe, 0x17, 0x14, 0x36, 0x3e, 0x80, 0x20, 0x91, 0xbe,
- 0x23, 0x7e, 0x7d, 0xbe, 0x2c, 0x2e, 0xec, 0x3d, 0xf8, 0xd0, 0x5f, 0xbd,
- 0xed, 0x2e, 0x9c, 0xbd, 0xa0, 0xdf, 0xfe, 0x3d, 0x23, 0xbf, 0x73, 0x3e,
- 0xd8, 0x90, 0x6b, 0xbb, 0x49, 0x9f, 0x2e, 0x3e, 0xdf, 0xb4, 0x1a, 0x3d,
- 0x5a, 0x49, 0xa0, 0xbd, 0xf9, 0xc9, 0x0b, 0xbe, 0x63, 0xb9, 0xa9, 0x3e,
- 0x5a, 0x82, 0x41, 0xbd, 0x2d, 0xb1, 0xf8, 0x3d, 0x0b, 0x35, 0xa7, 0xbe,
- 0xc1, 0x2b, 0xc7, 0x3d, 0xd7, 0x72, 0x71, 0x3d, 0xcb, 0x38, 0xbe, 0xbd,
- 0x81, 0x32, 0x3e, 0xbe, 0x71, 0x0e, 0x55, 0x3c, 0xa3, 0x88, 0xbc, 0xbd,
- 0x95, 0x4b, 0xc5, 0xbd, 0x74, 0xa3, 0xa8, 0x3d, 0xf9, 0xdd, 0x1f, 0x3e,
- 0x75, 0x4d, 0x8d, 0xbe, 0xa3, 0x04, 0xdf, 0x3e, 0xcf, 0x53, 0xe7, 0x3c,
- 0xbf, 0x31, 0xee, 0xbc, 0x22, 0xab, 0xd8, 0xbd, 0x87, 0xb1, 0xe0, 0xbc,
- 0xaa, 0x7d, 0x40, 0x3e, 0x2b, 0x1d, 0x7a, 0x3e, 0x45, 0x91, 0xa2, 0x3a,
- 0xad, 0x94, 0x16, 0xbf, 0x29, 0x8e, 0x30, 0xbe, 0x56, 0x58, 0xeb, 0xbe,
- 0x17, 0xad, 0x0f, 0xbd, 0xc5, 0x2c, 0x86, 0x3e, 0x12, 0x02, 0xaa, 0xbe,
- 0x56, 0x42, 0x66, 0xbe, 0x80, 0xb8, 0xc7, 0x3e, 0x4e, 0x4f, 0x0e, 0xbe,
- 0xdf, 0x2c, 0x02, 0xbd, 0x89, 0x86, 0xd1, 0x3e, 0x32, 0x53, 0x81, 0xbe,
- 0x13, 0x8c, 0x87, 0xbe, 0xb3, 0x87, 0xfb, 0xbd, 0x26, 0xaa, 0xd4, 0x3e,
- 0x62, 0x73, 0x86, 0x3e, 0xd2, 0xb9, 0x66, 0xbe, 0xc0, 0x22, 0x95, 0xbe,
- 0xe1, 0x8b, 0xf8, 0xbd, 0xab, 0xf8, 0xd5, 0x3d, 0xda, 0xce, 0x70, 0x3e,
- 0x5c, 0x71, 0xd8, 0x3c, 0x6a, 0x81, 0x0b, 0x3c, 0x3c, 0xfb, 0x08, 0xbe,
- 0xff, 0xff, 0xe3, 0xbe, 0x2c, 0xf3, 0xac, 0x3e, 0x64, 0x69, 0x96, 0xbe,
- 0xa3, 0x05, 0x73, 0xbe, 0xca, 0x64, 0x24, 0xbe, 0x03, 0x74, 0xc9, 0xbe,
- 0xf1, 0xfe, 0x6a, 0xbe, 0x36, 0x3d, 0x3d, 0x3e, 0xdc, 0x49, 0x4b, 0xbc,
- 0x21, 0xe4, 0xa6, 0xbd, 0x71, 0xc3, 0xb8, 0xbd, 0xdb, 0x1c, 0x06, 0x3f,
- 0xef, 0x25, 0x9d, 0x3d, 0x31, 0xa5, 0x99, 0x3d, 0x64, 0x50, 0x2f, 0x3c,
- 0xe8, 0x7f, 0xad, 0x3e, 0xb3, 0x19, 0x77, 0xbd, 0x83, 0xc0, 0x4e, 0xbe,
- 0xcf, 0xa9, 0xa5, 0x3e, 0xc1, 0xd6, 0xa9, 0x3e, 0x4f, 0xcb, 0xf7, 0xbd,
- 0x19, 0x63, 0x4e, 0x3d, 0xf5, 0x7f, 0xe1, 0xbd, 0xc1, 0x45, 0x37, 0xbe,
- 0x9d, 0x6e, 0x3a, 0x3e, 0xa9, 0x57, 0x49, 0x3d, 0x3b, 0x6b, 0xa7, 0x3d,
- 0x4c, 0x9b, 0x18, 0x3e, 0x73, 0x75, 0x30, 0x3d, 0x3e, 0xb5, 0x45, 0x3c,
- 0xd5, 0x87, 0xc8, 0x3d, 0xe2, 0x4e, 0x5e, 0x3e, 0xd0, 0x45, 0x30, 0xbe,
- 0xc9, 0x85, 0xae, 0x3d, 0x80, 0x78, 0xee, 0xbe, 0x0d, 0x84, 0x8e, 0xbe,
- 0xd2, 0xcf, 0x64, 0xbd, 0x39, 0x0a, 0xae, 0x3c, 0x78, 0x50, 0x02, 0xbe,
- 0x18, 0x4d, 0x83, 0x3d, 0xaf, 0x6d, 0xc8, 0xbb, 0x39, 0xa3, 0xd0, 0xbd,
- 0x48, 0x8a, 0xf8, 0xbd, 0xce, 0xfc, 0x04, 0x3f, 0x0b, 0x1d, 0xa8, 0xbd,
- 0x37, 0x89, 0x02, 0x3e, 0x15, 0xbd, 0x5f, 0xbd, 0xce, 0x2c, 0x68, 0x3d,
- 0xde, 0x5c, 0x11, 0xbc, 0x62, 0xc2, 0xf0, 0x3e, 0xbc, 0x9e, 0x18, 0xbe,
- 0x65, 0xba, 0x48, 0x3c, 0x87, 0x78, 0xef, 0x3e, 0xf9, 0xd9, 0x90, 0xbd,
- 0xc9, 0x9e, 0x3f, 0x3d, 0xdf, 0xf2, 0x61, 0xbd, 0x7f, 0xa5, 0xe1, 0xbe,
- 0x17, 0x8f, 0x5c, 0xbe, 0x63, 0x39, 0x0d, 0xbe, 0x9d, 0xbe, 0xb9, 0xbe,
- 0x43, 0x7f, 0x6f, 0xbe, 0x16, 0x17, 0x2c, 0x3e, 0x8e, 0x80, 0xff, 0xbd,
- 0xa2, 0x4a, 0x08, 0xbe, 0xe4, 0x22, 0x3c, 0x3c, 0xe6, 0x14, 0x95, 0x3e,
- 0x41, 0x5e, 0x11, 0x3c, 0x7f, 0xa0, 0xae, 0xbc, 0xbf, 0x77, 0xd7, 0x3e,
- 0x6d, 0xba, 0x49, 0xbd, 0x81, 0x27, 0xbb, 0xbc, 0x5c, 0xa5, 0x58, 0x3e,
- 0xe1, 0xef, 0xa8, 0x3d, 0x6e, 0xa5, 0x66, 0x3d, 0xca, 0xf6, 0x45, 0x3d,
- 0xa9, 0x90, 0xcb, 0x3e, 0x79, 0xb9, 0x23, 0x3e, 0xd4, 0xf9, 0x55, 0xbe,
- 0xe7, 0x42, 0x8f, 0xbc, 0x6d, 0x7e, 0x4d, 0xbd, 0xc1, 0xa6, 0x93, 0x3b,
- 0xe1, 0x21, 0xe6, 0x3c, 0x3d, 0xa3, 0x90, 0xbd, 0x8b, 0x2b, 0x00, 0x3f,
- 0x28, 0x93, 0x7e, 0xbe, 0x97, 0xf9, 0xf7, 0x3d, 0xa7, 0xec, 0xd6, 0x3e,
- 0xdc, 0xca, 0xf7, 0xbe, 0xcf, 0x20, 0x88, 0xbd, 0x57, 0x0d, 0xed, 0x3e,
- 0xbf, 0x84, 0xc3, 0x3e, 0x14, 0xba, 0xe4, 0x3e, 0x3b, 0xa9, 0xf8, 0xbe,
- 0x57, 0x89, 0x75, 0x3f, 0x4b, 0x11, 0x9e, 0xbc, 0x7c, 0x91, 0x2c, 0xbd,
- 0x3f, 0x31, 0x31, 0x3e, 0xab, 0xf8, 0x86, 0x3f, 0xba, 0x8b, 0xa7, 0x3e,
- 0xa2, 0x65, 0x4c, 0x3f, 0x06, 0x8a, 0x09, 0xbe, 0xbf, 0xdd, 0x5e, 0x3f,
- 0xda, 0xa5, 0x48, 0x3b, 0xcc, 0x24, 0xb4, 0xbe, 0x0f, 0xdd, 0x61, 0xbe,
- 0x3a, 0xa2, 0x97, 0xbe, 0xac, 0xaf, 0x07, 0x3f, 0x67, 0x47, 0x6a, 0xbe,
- 0xe7, 0xbd, 0xb7, 0x3e, 0x64, 0xb3, 0xe5, 0x3d, 0x62, 0x7d, 0x40, 0xbe,
- 0x61, 0x14, 0x56, 0xbd, 0x07, 0x58, 0x49, 0xbe, 0x7a, 0x26, 0x4c, 0x3d,
- 0x3a, 0x60, 0x4b, 0x3e, 0x28, 0x09, 0xbc, 0xbe, 0x55, 0xb3, 0x09, 0x3e,
- 0xb2, 0x9f, 0x10, 0x3f, 0xdc, 0x65, 0x3c, 0x3e, 0x5c, 0x90, 0x78, 0x3e,
- 0xb2, 0x0f, 0xb5, 0x3e, 0xfc, 0x63, 0xed, 0x3e, 0xa2, 0xd8, 0xad, 0xbe,
- 0xc3, 0x3a, 0xd7, 0x3e, 0x89, 0xde, 0xbe, 0x3e, 0x07, 0x1b, 0xfd, 0xbd,
- 0x59, 0xee, 0x79, 0xbe, 0x0d, 0x3d, 0x54, 0xbe, 0x9c, 0x9b, 0x1e, 0x3e,
- 0xcf, 0x98, 0x95, 0x3f, 0x0e, 0x1e, 0x22, 0xbf, 0x10, 0x29, 0xb3, 0x3e,
- 0x77, 0xaf, 0x83, 0x3d, 0x71, 0x02, 0xa2, 0x3e, 0x45, 0x6c, 0x71, 0x3e,
- 0x6b, 0xc9, 0xec, 0xbe, 0x73, 0xc4, 0x0f, 0x3f, 0xe3, 0xe7, 0xe5, 0x3e,
- 0xd2, 0x7d, 0x05, 0x3e, 0xf7, 0x9d, 0xa4, 0x3e, 0xdc, 0xbe, 0x24, 0xbf,
- 0x34, 0x21, 0xcd, 0xbd, 0xc5, 0x3f, 0xcc, 0x3d, 0x55, 0x49, 0xf7, 0xbe,
- 0x2f, 0x50, 0xa2, 0xbe, 0xbd, 0x30, 0x19, 0xbe, 0xc6, 0xbe, 0x87, 0x3d,
- 0x35, 0x7c, 0x22, 0xbf, 0x89, 0xdc, 0x0e, 0x3f, 0x5c, 0x07, 0x44, 0x3e,
- 0xf6, 0x42, 0xff, 0x3d, 0x4c, 0x89, 0x1e, 0xbe, 0x8b, 0x8a, 0x4d, 0xbe,
- 0xa2, 0x6a, 0x9f, 0xbf, 0xce, 0x52, 0x11, 0x3e, 0x7f, 0x96, 0x77, 0x3e,
- 0xd6, 0x5f, 0x34, 0x3f, 0xab, 0xb5, 0x3f, 0xbb, 0x26, 0x1f, 0x39, 0xbf,
- 0xd5, 0xd7, 0x67, 0xbe, 0xe9, 0x91, 0x02, 0x3f, 0x3b, 0xc5, 0x02, 0x3e,
- 0x4b, 0x9c, 0x57, 0x3f, 0xab, 0xc7, 0x21, 0x3e, 0x96, 0x46, 0xbf, 0x3d,
- 0x2e, 0x50, 0xe3, 0x3d, 0x1c, 0x43, 0x8b, 0xbe, 0xc2, 0x83, 0xe2, 0x3d,
- 0x82, 0x51, 0xcc, 0x3d, 0xe0, 0x83, 0x03, 0xbd, 0x4e, 0x68, 0x16, 0xbe,
- 0xb7, 0x17, 0xcd, 0xbe, 0x0d, 0x4c, 0x0b, 0x3e, 0xd5, 0xf0, 0xe1, 0xbd,
- 0xa6, 0x38, 0xc7, 0x3e, 0x91, 0xd8, 0x83, 0xbe, 0x54, 0x03, 0xa5, 0x3c,
- 0x65, 0x34, 0x0a, 0xbf, 0x26, 0xb7, 0xca, 0x3d, 0xf0, 0xa2, 0x70, 0x3d,
- 0xb5, 0x0b, 0xd7, 0xbd, 0x4f, 0xa0, 0xdc, 0x3e, 0x63, 0x7d, 0x18, 0x3f,
- 0x38, 0x72, 0x02, 0x3e, 0x60, 0x92, 0x2f, 0xbe, 0xe6, 0x7c, 0xbd, 0x3e,
- 0xab, 0x78, 0x66, 0x3d, 0x4f, 0x21, 0x5f, 0xbd, 0xbe, 0x32, 0x8e, 0xbe,
- 0xa7, 0xba, 0xb5, 0xbd, 0xe6, 0x3d, 0xeb, 0x3e, 0x4a, 0x98, 0xf0, 0xbe,
- 0x72, 0x69, 0xba, 0xbd, 0xaf, 0xfc, 0x5b, 0x3d, 0x83, 0x55, 0x5c, 0x3e,
- 0xe1, 0x39, 0x14, 0xbf, 0x8b, 0x2e, 0x6e, 0x3d, 0xff, 0x96, 0xf3, 0x3d,
- 0x9c, 0x09, 0x1d, 0x3e, 0x0b, 0x05, 0x0c, 0x3e, 0x8c, 0x28, 0x4b, 0x3f,
- 0x3b, 0xa5, 0x42, 0x3e, 0xbd, 0x67, 0x24, 0x3d, 0x79, 0x23, 0x9d, 0xbe,
- 0xdb, 0x74, 0x52, 0x3d, 0xf8, 0x91, 0x08, 0x3c, 0x23, 0x97, 0x7c, 0x3d,
- 0x9e, 0xe0, 0xa2, 0xbd, 0x88, 0xab, 0xab, 0xbd, 0xd4, 0x08, 0x21, 0x3e,
- 0xec, 0x1f, 0x55, 0xbe, 0xfb, 0x7e, 0x98, 0xbd, 0x76, 0xa1, 0x62, 0xbd,
- 0xdf, 0xb9, 0xdf, 0x3d, 0xcc, 0xb8, 0x7f, 0xbe, 0x2f, 0xa1, 0xfe, 0x3d,
- 0x20, 0x60, 0x0c, 0x3e, 0x4e, 0xe1, 0x12, 0xbe, 0xc0, 0x9c, 0x54, 0xbd,
- 0xe1, 0xbd, 0x24, 0x3e, 0x9d, 0xac, 0xea, 0xbd, 0x09, 0x99, 0x9a, 0xbd,
- 0x8a, 0x6d, 0x1a, 0xbe, 0xa6, 0x32, 0x05, 0x3e, 0x04, 0x2a, 0x34, 0xbe,
- 0x50, 0xb9, 0x1e, 0xbe, 0xd2, 0xab, 0x0f, 0x3e, 0x30, 0xce, 0x34, 0xbe,
- 0x7c, 0x82, 0x67, 0x3e, 0x02, 0xf2, 0x99, 0x3d, 0x09, 0x5e, 0xf8, 0xbc,
- 0xdc, 0x77, 0x66, 0x3e, 0x90, 0x99, 0xfc, 0x3d, 0x79, 0xcb, 0xe4, 0xbd,
- 0x9f, 0x62, 0x14, 0xbd, 0xe4, 0x05, 0xa3, 0xbd, 0x10, 0x99, 0x45, 0xbe,
- 0xee, 0x87, 0x5a, 0x3e, 0xaa, 0x0f, 0xff, 0xbd, 0x58, 0x0a, 0xbe, 0x3d,
- 0x2d, 0x04, 0x8d, 0x3c, 0xe4, 0xd4, 0x46, 0x3e, 0x78, 0xe4, 0x65, 0xbd,
- 0x2d, 0x05, 0x02, 0xbe, 0x57, 0xdb, 0x06, 0xbe, 0x44, 0x62, 0x03, 0xbd,
- 0xe1, 0xf8, 0xa6, 0xbe, 0x71, 0xc4, 0x16, 0xbd, 0x38, 0x48, 0xc0, 0xbd,
- 0xa9, 0xf6, 0xf8, 0x3d, 0xf2, 0x00, 0xba, 0x3e, 0xf5, 0xb1, 0xfa, 0x3a,
- 0xef, 0xd7, 0xc6, 0x3d, 0x74, 0x4d, 0x6d, 0xbe, 0xe1, 0xe7, 0x37, 0xbe,
- 0xc5, 0x90, 0x01, 0x3e, 0xc8, 0x0d, 0xa1, 0x3d, 0x19, 0x6e, 0x38, 0xbe,
- 0xc2, 0x7b, 0xe0, 0x3d, 0x4a, 0x30, 0x80, 0xbd, 0xa4, 0x7c, 0x45, 0xbe,
- 0x59, 0x4c, 0x9f, 0xbe, 0xcb, 0x4d, 0xb4, 0xbe, 0xdd, 0xe5, 0xe5, 0xbc,
- 0x17, 0x21, 0x04, 0x3f, 0x36, 0xe6, 0xb1, 0x3e, 0x5b, 0x4c, 0xfc, 0xbd,
- 0x68, 0xa2, 0xe3, 0xbc, 0x54, 0x3b, 0xe1, 0xbd, 0x8f, 0x60, 0x09, 0x3e,
- 0x86, 0x78, 0x5d, 0x3e, 0x37, 0x5e, 0x0c, 0xbe, 0x60, 0x6c, 0x22, 0xbd,
- 0x92, 0x60, 0xe1, 0x3b, 0x43, 0xc6, 0x8f, 0xbc, 0xc4, 0x6a, 0x3f, 0x3e,
- 0x9e, 0x35, 0xa8, 0x3d, 0xa6, 0x4f, 0xb2, 0x3e, 0x58, 0x8c, 0xa6, 0xbc,
- 0xad, 0x35, 0x5c, 0xbd, 0x47, 0x6d, 0xd6, 0xbc, 0x9a, 0x97, 0x12, 0xbd,
- 0x8a, 0xc0, 0xfd, 0x3c, 0x99, 0x54, 0xe9, 0xbd, 0x77, 0x03, 0x34, 0x3e,
- 0xb6, 0xe2, 0x1d, 0x3c, 0x5a, 0x6a, 0x09, 0x3e, 0xb8, 0x17, 0x8f, 0x3d,
- 0xe3, 0x84, 0x86, 0xbe, 0x92, 0x4f, 0x2c, 0x3d, 0x22, 0x00, 0x84, 0x3e,
- 0xaf, 0xb4, 0x2b, 0xbf, 0x86, 0xa8, 0xa7, 0x3e, 0xab, 0xd2, 0x4d, 0xbe,
- 0x09, 0x0c, 0x4d, 0xbe, 0xe5, 0x4f, 0x9f, 0x3e, 0xbb, 0x0a, 0xa6, 0x3e,
- 0x89, 0x88, 0x8b, 0xbe, 0x50, 0xa1, 0xb0, 0x3c, 0x44, 0x79, 0x9f, 0x3d,
- 0xf6, 0x14, 0x57, 0xbe, 0x36, 0x92, 0x53, 0x3e, 0xa1, 0x3a, 0xa7, 0x3e,
- 0x29, 0xde, 0x73, 0xbe, 0x17, 0x57, 0x81, 0x3d, 0x64, 0xce, 0xf0, 0xbe,
- 0xb9, 0xf3, 0x0c, 0xbe, 0x8a, 0x27, 0x36, 0x3c, 0x4e, 0x5e, 0x3c, 0xbe,
- 0xa8, 0x9e, 0x8a, 0x3e, 0x7f, 0x17, 0x16, 0x3e, 0x1f, 0xe4, 0x42, 0xbe,
- 0xc6, 0xde, 0x04, 0xbe, 0x55, 0x75, 0x64, 0x3d, 0x4d, 0xa5, 0xb7, 0xbd,
- 0x7a, 0x6e, 0xcb, 0xbd, 0x87, 0xf0, 0x8e, 0x3e, 0x6f, 0xfe, 0xf8, 0x3e,
- 0x19, 0xa1, 0x06, 0xbe, 0xb7, 0xaf, 0xbc, 0x3f, 0xe2, 0x89, 0x3b, 0x3c,
- 0xfd, 0xfa, 0xe3, 0x3e, 0xcc, 0x0d, 0xbe, 0xbd, 0xe1, 0xc2, 0x2a, 0x3f,
- 0x18, 0x88, 0xa4, 0x3e, 0x71, 0xd4, 0x1d, 0x3f, 0x6a, 0x0a, 0x1d, 0xbf,
- 0x13, 0xf3, 0x32, 0xbf, 0x49, 0x36, 0xec, 0x3d, 0x59, 0x56, 0xaf, 0xbe,
- 0xcc, 0x41, 0x02, 0xbe, 0x5d, 0x44, 0xbb, 0x3e, 0x06, 0xab, 0x19, 0xbd,
- 0x58, 0x54, 0x96, 0xbe, 0xd6, 0x27, 0xd2, 0x3e, 0x30, 0x54, 0x4d, 0xbf,
- 0x04, 0x80, 0x0b, 0xbf, 0xb5, 0x00, 0xdb, 0xbd, 0x27, 0x53, 0x59, 0xbd,
- 0x50, 0x02, 0x7d, 0x3c, 0xa7, 0x24, 0xda, 0xbd, 0x02, 0x7e, 0x3e, 0x3e,
- 0x15, 0x86, 0xa3, 0xbe, 0x09, 0x90, 0xb7, 0x3c, 0xe4, 0xe3, 0xe6, 0xbe,
- 0xbf, 0x90, 0x88, 0xbf, 0x93, 0x22, 0x19, 0xbd, 0x39, 0x0a, 0x9b, 0xbc,
- 0x4d, 0xe5, 0x0b, 0x3f, 0x64, 0x11, 0x39, 0xbf, 0x1c, 0x91, 0xf5, 0x3d,
- 0x92, 0x34, 0x52, 0x3c, 0x8c, 0x31, 0x8e, 0x3e, 0xbe, 0xf8, 0xd2, 0xbe,
- 0x81, 0xc3, 0x8b, 0x3e, 0x07, 0x7f, 0xfc, 0xbd, 0x72, 0x21, 0xb8, 0xbc,
- 0x4c, 0xcc, 0x51, 0xbf, 0xc5, 0x45, 0x24, 0x3d, 0xfb, 0x3b, 0x00, 0x3e,
- 0xf6, 0xb3, 0xdc, 0xbd, 0x79, 0xee, 0x26, 0xbd, 0x0a, 0x7e, 0x97, 0x3f,
- 0xa1, 0x06, 0x86, 0x3e, 0x03, 0x5d, 0x9c, 0xbe, 0x75, 0xb5, 0x3d, 0xbd,
- 0x0c, 0x74, 0x8e, 0x3e, 0xea, 0x58, 0xa4, 0xbd, 0x74, 0xfd, 0x00, 0xbc,
- 0x94, 0xc4, 0x06, 0x3e, 0x5d, 0xaf, 0x98, 0x3f, 0xfd, 0xf5, 0xb3, 0xbe,
- 0xd0, 0xd1, 0xc0, 0x38, 0xd3, 0x16, 0x84, 0xbe, 0x1c, 0x00, 0x70, 0xbe,
- 0x9c, 0xcd, 0xd2, 0x3d, 0xe5, 0xca, 0x98, 0xbe, 0xec, 0x48, 0x93, 0x3e,
- 0x85, 0x59, 0xb5, 0x3e, 0x9f, 0xdc, 0x94, 0x3e, 0x56, 0x88, 0x99, 0x3b,
- 0x01, 0x8b, 0x28, 0x3b, 0x3f, 0xe9, 0xdc, 0x3e, 0x4b, 0x74, 0x7e, 0xbd,
- 0xc8, 0xaf, 0x03, 0x3d, 0xec, 0x17, 0x50, 0x3d, 0xf3, 0x77, 0x46, 0xbf,
- 0xaf, 0x42, 0x39, 0x3d, 0x30, 0x67, 0x54, 0xbd, 0x36, 0x8f, 0xc3, 0x3e,
- 0x0e, 0x85, 0xfa, 0xbe, 0xfd, 0xae, 0xe0, 0xbc, 0x3d, 0x92, 0xbc, 0xbe,
- 0x25, 0x65, 0x1d, 0x3e, 0x62, 0x06, 0x6b, 0x3e, 0x4e, 0xb0, 0x71, 0xbf,
- 0xc7, 0xa9, 0x05, 0xbf, 0x26, 0x54, 0x99, 0x3d, 0x8c, 0x32, 0xf1, 0xbd,
- 0x2c, 0xfd, 0x06, 0xbe, 0xa2, 0x5d, 0x9b, 0x3e, 0x52, 0x3c, 0x06, 0xbe,
- 0x99, 0xd5, 0x9e, 0xbd, 0xf3, 0xd7, 0xd5, 0x3e, 0x38, 0x3a, 0xe1, 0x3d,
- 0x80, 0xec, 0x94, 0xbe, 0xe6, 0xcc, 0xd9, 0xbd, 0x28, 0x9c, 0x75, 0x3e,
- 0xdf, 0x9f, 0x18, 0xbf, 0x5c, 0x00, 0xd8, 0xbc, 0x88, 0xb8, 0x0b, 0xbd,
- 0xc0, 0x49, 0xc2, 0xbe, 0x27, 0x60, 0x04, 0x3f, 0xd1, 0x5b, 0x87, 0x3e,
- 0x3d, 0x77, 0x03, 0xbe, 0xbe, 0x89, 0x86, 0xbe, 0x0c, 0xd2, 0x9c, 0x3f,
- 0x74, 0xf1, 0x9c, 0x3d, 0xa8, 0x32, 0x37, 0xbf, 0x7a, 0x11, 0x9e, 0xbc,
- 0x1c, 0x48, 0x28, 0xbe, 0xdb, 0x9d, 0x8a, 0xba, 0xba, 0x3c, 0xed, 0xbe,
- 0x9e, 0x24, 0xeb, 0x3d, 0xdb, 0xbb, 0x0f, 0x3f, 0xe4, 0xc2, 0xa0, 0xbc,
- 0x9a, 0xbe, 0xad, 0x3e, 0x28, 0x77, 0x24, 0x3e, 0x01, 0x77, 0xb0, 0xbd,
- 0xbc, 0xa0, 0xc5, 0x3e, 0xcd, 0xd2, 0x04, 0xbe, 0xc2, 0x63, 0x31, 0xbd,
- 0x2d, 0xd4, 0x6e, 0x3d, 0xe5, 0x72, 0xb3, 0x3e, 0xe7, 0x35, 0x6b, 0x3e,
- 0x81, 0x2b, 0xcd, 0xbe, 0x9b, 0x83, 0xae, 0x3f, 0x0b, 0x12, 0x59, 0x3d,
- 0xaa, 0x0d, 0x26, 0x3f, 0x15, 0xed, 0x41, 0xbe, 0x0a, 0x04, 0x4c, 0x3f,
- 0x6f, 0x1b, 0x1c, 0x3e, 0x93, 0x17, 0x97, 0x3e, 0xd3, 0x5a, 0x10, 0xbf,
- 0x07, 0x07, 0x1b, 0xbf, 0x21, 0x82, 0xbe, 0x3e, 0xfe, 0x9d, 0x92, 0xbe,
- 0x16, 0x80, 0xe1, 0x3d, 0x87, 0xaa, 0xe8, 0x3e, 0xd7, 0xf0, 0xb2, 0xbe,
- 0xd9, 0xc7, 0x6e, 0xbe, 0xa5, 0x61, 0xc1, 0x3e, 0x17, 0xf5, 0x2e, 0xbf,
- 0x0e, 0xe7, 0xee, 0xbe, 0xcc, 0x6f, 0x8e, 0x3d, 0x1f, 0x3b, 0xda, 0x3e,
- 0x31, 0xc9, 0xd2, 0x3e, 0x66, 0xa0, 0xa1, 0xbe, 0xa9, 0x49, 0x5b, 0xbe,
- 0x65, 0x3d, 0xe8, 0xbe, 0xcf, 0x8e, 0xb6, 0x3e, 0x67, 0xfe, 0x1f, 0xbf,
- 0x81, 0x63, 0xa0, 0xbf, 0xb6, 0xe4, 0x07, 0x3d, 0xe5, 0x3f, 0xd8, 0xbe,
- 0xff, 0x28, 0xf9, 0x3e, 0x6b, 0x0c, 0x5a, 0xbf, 0x29, 0x82, 0x08, 0xbe,
- 0xe9, 0x7f, 0x29, 0x3f, 0xe0, 0x91, 0x87, 0x3e, 0xe5, 0x0d, 0xf1, 0xbe,
- 0x08, 0x66, 0xfe, 0x3d, 0xa6, 0xfb, 0x65, 0xbe, 0xa7, 0x4f, 0xa7, 0x3d,
- 0xf6, 0x7f, 0x21, 0xbf, 0x2d, 0x62, 0x3a, 0x3d, 0x64, 0xc4, 0xac, 0x3d,
- 0x64, 0xba, 0xe6, 0xbe, 0xdd, 0x2b, 0x5d, 0xbe, 0x4b, 0x67, 0x85, 0x3f,
- 0xab, 0xc1, 0xf7, 0xbd, 0xaa, 0xcf, 0xfe, 0xbc, 0x7d, 0xe7, 0xf0, 0xbd,
- 0xc8, 0x6e, 0xd3, 0x3d, 0xdd, 0x65, 0x31, 0xbc, 0x90, 0x12, 0x5b, 0x3e,
- 0xc0, 0x47, 0x39, 0xbe, 0xfb, 0x7b, 0x81, 0x3f, 0x6a, 0x34, 0xb1, 0xbd,
- 0x60, 0xeb, 0x26, 0xbe, 0x79, 0xc7, 0x9d, 0xbd, 0x24, 0x3f, 0xa5, 0x3e,
- 0xd0, 0xff, 0xda, 0x3d, 0x42, 0x1e, 0x1a, 0xbf, 0xde, 0x8a, 0x00, 0x3f,
- 0xee, 0x76, 0x14, 0x3f, 0x02, 0x94, 0x00, 0x3f, 0xdd, 0x3e, 0x8e, 0x3e,
- 0xe5, 0x56, 0x18, 0xbf, 0x45, 0xf9, 0x52, 0x3d, 0x96, 0xd5, 0x54, 0x3d,
- 0x79, 0xe0, 0x52, 0xbc, 0x86, 0xc7, 0xd5, 0x3e, 0x9f, 0x47, 0xcd, 0xbe,
- 0xa0, 0xa0, 0x65, 0x3e, 0x41, 0x31, 0x6c, 0x3d, 0x7b, 0xbd, 0x6c, 0x3e,
- 0x2b, 0x2d, 0x3e, 0xbe, 0xbe, 0x99, 0x45, 0xbe, 0x41, 0x2a, 0xf3, 0xbe,
- 0x48, 0x02, 0xca, 0x3e, 0x14, 0x88, 0x9a, 0x3d, 0xac, 0x89, 0x5d, 0xbf,
- 0x5a, 0xb9, 0xd8, 0xbe, 0x87, 0xfd, 0x21, 0xbe, 0xb2, 0x84, 0xd0, 0x3d,
- 0xa4, 0x0b, 0x34, 0x3d, 0xe6, 0xec, 0xbb, 0x3e, 0xa1, 0xcb, 0x73, 0xbe,
- 0x66, 0xc4, 0x0a, 0xbd, 0xbb, 0x8c, 0xfa, 0x3e, 0x18, 0x51, 0xad, 0x3e,
- 0x61, 0x89, 0x6e, 0x3c, 0xfc, 0xa3, 0x47, 0xbd, 0x58, 0x75, 0x34, 0xbe,
- 0x75, 0x46, 0x9c, 0x3e, 0xd3, 0xb4, 0x66, 0xbe, 0x5f, 0x7a, 0xb0, 0xbd,
- 0x3e, 0xf5, 0x87, 0xbc, 0x3f, 0x25, 0xdc, 0x3e, 0xcb, 0x19, 0x78, 0xbd,
- 0x1a, 0xfe, 0x72, 0x3d, 0xdd, 0x03, 0x3b, 0xbe, 0x64, 0xfb, 0x55, 0x3f,
- 0xd6, 0xf6, 0xea, 0xbe, 0xb0, 0x12, 0x22, 0xbf, 0xaa, 0xf8, 0x26, 0xbd,
- 0x26, 0x55, 0x13, 0x3e, 0x34, 0x2a, 0xdc, 0xbd, 0xde, 0xef, 0x15, 0xbe,
- 0x94, 0xa6, 0x16, 0xbe, 0x96, 0x4d, 0xff, 0x3e, 0x05, 0xe7, 0xf0, 0x3e,
- 0x0b, 0xc1, 0x0f, 0x3e, 0xb8, 0x66, 0xa7, 0x3d, 0x8a, 0x0f, 0x16, 0x3d,
- 0x8c, 0x47, 0x00, 0x3f, 0xd1, 0xfb, 0xda, 0xbd, 0xf7, 0x65, 0xa2, 0xbe,
- 0x7c, 0x55, 0xb2, 0xbc, 0xf7, 0x12, 0x9e, 0x3e, 0x3d, 0x7f, 0x50, 0xbe,
- 0x58, 0xec, 0x78, 0x3e, 0xa6, 0x17, 0x66, 0xbe, 0x0f, 0xc8, 0x88, 0x3e,
- 0x41, 0x6b, 0x18, 0xbc, 0x9f, 0x3a, 0xd1, 0xbd, 0xb5, 0x47, 0xb2, 0x3e,
- 0x1d, 0xbd, 0xaf, 0x3d, 0x5b, 0xf3, 0xc4, 0xbe, 0x9e, 0x43, 0xe7, 0xbe,
- 0x6f, 0x03, 0x05, 0xbe, 0x3c, 0xc8, 0x9e, 0xbf, 0x54, 0xb1, 0x39, 0x3e,
- 0x24, 0x0f, 0x0d, 0xbe, 0x51, 0x23, 0xcb, 0x3e, 0xd4, 0x63, 0xd1, 0xbe,
- 0x12, 0xac, 0x4d, 0xbd, 0xe5, 0x3a, 0x9f, 0xbd, 0x90, 0x8d, 0x42, 0x3f,
- 0xd2, 0x7c, 0xab, 0x3e, 0xb0, 0x49, 0x97, 0xbe, 0xac, 0x63, 0x83, 0x3e,
- 0x30, 0xb0, 0xb7, 0x3e, 0x99, 0xcb, 0xec, 0x3d, 0x1d, 0x37, 0x65, 0xbe,
- 0xeb, 0x61, 0x17, 0xbe, 0x98, 0xad, 0xd8, 0x3e, 0x79, 0xac, 0xcc, 0x3d,
- 0xac, 0xbf, 0x5d, 0x3e, 0xf6, 0xf1, 0x19, 0x3e, 0x40, 0xcb, 0x98, 0x3e,
- 0x73, 0xad, 0x59, 0x3e, 0xa3, 0x7e, 0xeb, 0xbe, 0x1f, 0x67, 0x19, 0x3d,
- 0xbf, 0x28, 0x1c, 0x3e, 0x23, 0x6d, 0x29, 0xbe, 0x3a, 0x21, 0x68, 0xbe,
- 0x0b, 0x0c, 0xa6, 0x3e, 0x2a, 0x23, 0xe7, 0x3e, 0x16, 0x13, 0xa3, 0xbd,
- 0x67, 0x3b, 0x46, 0xbd, 0x3d, 0x0b, 0xba, 0xbd, 0x80, 0xe5, 0xf9, 0xbc,
- 0x99, 0xf3, 0x55, 0xbd, 0xf9, 0xb5, 0xce, 0xbd, 0x3b, 0xf2, 0x2e, 0xbb,
- 0x07, 0xdf, 0xd6, 0xbc, 0xbd, 0x7c, 0x0b, 0xbf, 0xc6, 0xce, 0x96, 0xbe,
- 0xe8, 0x07, 0x06, 0x3e, 0xc1, 0xa3, 0x0a, 0x3f, 0xba, 0x87, 0x28, 0x3f,
- 0x03, 0x7f, 0x01, 0xbe, 0x3d, 0x2c, 0x19, 0xbd, 0xd9, 0x14, 0x45, 0x3e,
- 0xc5, 0x54, 0xe7, 0x3d, 0x34, 0x0f, 0x06, 0x3f, 0x6e, 0xa5, 0xfd, 0x3d,
- 0xdb, 0x51, 0x58, 0xbe, 0x6e, 0xd7, 0xe5, 0x3e, 0x94, 0xe6, 0xc4, 0xbe,
- 0xa6, 0x9a, 0x24, 0xbd, 0x4e, 0x89, 0x9d, 0x3d, 0x6c, 0x4b, 0xaf, 0xbe,
- 0xda, 0xcf, 0x91, 0xbe, 0xaf, 0xbe, 0x9b, 0x3e, 0x94, 0x9a, 0xd4, 0xbd,
- 0x62, 0x0f, 0x4b, 0xbe, 0xe0, 0x2a, 0x01, 0xbf, 0x7b, 0x1b, 0xaa, 0x3e,
- 0x58, 0x88, 0x35, 0xbf, 0xbf, 0xf8, 0x92, 0xbc, 0x64, 0x6f, 0xe1, 0xba,
- 0x0b, 0xa4, 0x07, 0x3f, 0x6d, 0x1d, 0xe1, 0xba, 0x2e, 0x68, 0x4a, 0xbe,
- 0x03, 0x2c, 0x14, 0x3e, 0x26, 0x16, 0xb8, 0x3e, 0x9b, 0xd6, 0xa5, 0xbe,
- 0xfc, 0x01, 0x2c, 0x3f, 0x63, 0x4c, 0x19, 0x3e, 0x3b, 0x38, 0x28, 0xbd,
- 0xf4, 0x6e, 0x44, 0xbc, 0x3d, 0xa2, 0xe7, 0x3e, 0xf4, 0x56, 0xbd, 0xbe,
- 0x91, 0x5f, 0xea, 0x3d, 0xe5, 0xc7, 0x43, 0xbc, 0xd6, 0x57, 0x6a, 0x3d,
- 0x1f, 0xcd, 0xbe, 0x3e, 0xad, 0x0d, 0xa4, 0xbd, 0xaa, 0x06, 0x5a, 0xbe,
- 0x12, 0xc3, 0x0a, 0xbf, 0x36, 0x93, 0xe0, 0xbe, 0x0c, 0xc1, 0x25, 0xbe,
- 0x81, 0xf2, 0x60, 0xbe, 0xee, 0xdf, 0xbd, 0x3e, 0xc5, 0x3b, 0x98, 0x3e,
- 0x73, 0xbd, 0x63, 0x3e, 0x87, 0x3c, 0x1d, 0x3c, 0xe0, 0x1d, 0xef, 0xbc,
- 0x78, 0x44, 0xf0, 0xbd, 0x34, 0xd3, 0x23, 0x3e, 0x01, 0x81, 0x49, 0xbf,
- 0xd5, 0xf2, 0x8d, 0xbe, 0x1c, 0x0b, 0x67, 0xbe, 0x98, 0xa8, 0x0c, 0xbf,
- 0x9b, 0xfc, 0xe5, 0xbd, 0xc6, 0x56, 0x83, 0xbd, 0x82, 0xa6, 0x73, 0xbd,
- 0x3b, 0x1d, 0xe9, 0x3e, 0xb9, 0xb6, 0x95, 0xbd, 0x84, 0xbe, 0x3c, 0x3e,
- 0x9d, 0x4c, 0x84, 0xbd, 0xc0, 0x42, 0x0c, 0xbe, 0xa4, 0x5b, 0xc3, 0xbd,
- 0x41, 0x40, 0x6d, 0xbe, 0x15, 0x0e, 0x24, 0xbd, 0x77, 0xfe, 0xf0, 0x3e,
- 0x75, 0x35, 0x32, 0xbf, 0xa3, 0xbb, 0x5a, 0x3e, 0x1f, 0xc7, 0xa0, 0x3c,
- 0x0b, 0x6a, 0x95, 0xbe, 0x91, 0xd1, 0x08, 0xbe, 0xed, 0x81, 0xd5, 0x3d,
- 0x11, 0x9f, 0xa9, 0x3e, 0x71, 0x3a, 0x86, 0x3e, 0x44, 0x54, 0x68, 0xbe,
- 0x5d, 0x2c, 0xfd, 0x3d, 0xda, 0xe8, 0x2b, 0xbf, 0xf8, 0x86, 0x91, 0xbe,
- 0xd7, 0x3c, 0xd6, 0xbe, 0xa7, 0xf9, 0xe8, 0x3c, 0x48, 0x4b, 0x56, 0x3f,
- 0xff, 0xaf, 0x5e, 0xbe, 0xb0, 0xcc, 0x80, 0xbf, 0x1f, 0x3d, 0x78, 0xbe,
- 0x8d, 0x79, 0xa3, 0x3e, 0xcc, 0x80, 0xa6, 0x3d, 0xfe, 0xa6, 0x94, 0xbe,
- 0x2e, 0x11, 0x85, 0xbe, 0x5d, 0x3c, 0x19, 0x3f, 0x58, 0xf3, 0x5a, 0x3d,
- 0xcf, 0x88, 0xcf, 0x3e, 0xc9, 0xed, 0x83, 0xbe, 0x97, 0x04, 0xab, 0xbd,
- 0x3c, 0xab, 0x38, 0x3e, 0x61, 0xe1, 0x2e, 0x3d, 0x89, 0xb7, 0xd4, 0x3c,
- 0x85, 0xc0, 0xfa, 0x3e, 0x34, 0x92, 0x8f, 0x3e, 0x1a, 0xc8, 0x20, 0x3d,
- 0x22, 0x52, 0x04, 0x3f, 0xc2, 0xba, 0x12, 0xbd, 0xef, 0xee, 0x83, 0xbf,
- 0x7d, 0x59, 0xe1, 0x3b, 0x41, 0xd2, 0x99, 0xbd, 0xbe, 0x44, 0x50, 0xbe,
- 0xc6, 0xe9, 0x65, 0x3d, 0x0c, 0x3f, 0xdc, 0x3d, 0xe8, 0x85, 0xa8, 0x3d,
- 0xe5, 0xe9, 0x08, 0xbf, 0x68, 0xec, 0x1b, 0x3e, 0xac, 0x0b, 0x1d, 0xbe,
- 0x75, 0x8e, 0x2d, 0x3c, 0x44, 0x65, 0xcf, 0x3e, 0xba, 0x33, 0x3e, 0xbd,
- 0xbe, 0xcf, 0x1b, 0xbc, 0x3a, 0xa5, 0x24, 0xbf, 0x72, 0xa2, 0x49, 0x3e,
- 0xcc, 0x43, 0x49, 0x3f, 0xda, 0x7b, 0xe2, 0x3e, 0x90, 0x5a, 0x0d, 0xbd,
- 0x63, 0x86, 0xc0, 0xbc, 0x0b, 0x79, 0x2e, 0xbf, 0x5a, 0x97, 0x03, 0xbf,
- 0x4a, 0x65, 0xa4, 0x3e, 0x69, 0x57, 0xcc, 0x3d, 0xaa, 0x3a, 0x0c, 0xbf,
- 0x47, 0x17, 0x8f, 0xbd, 0x54, 0x38, 0xde, 0xbe, 0x3a, 0xb0, 0xfb, 0xba,
- 0x22, 0x5f, 0x7c, 0xbe, 0xab, 0xe6, 0x9c, 0x3e, 0xc8, 0x84, 0x82, 0xba,
- 0x08, 0x41, 0xc6, 0x3d, 0x13, 0x3a, 0x31, 0xbf, 0x67, 0x9c, 0xda, 0xbd,
- 0xb8, 0x89, 0x1a, 0x3f, 0x42, 0x31, 0xf4, 0x3d, 0xbf, 0xcf, 0x0f, 0xbf,
- 0x43, 0x84, 0x93, 0x3e, 0x5a, 0x49, 0x9e, 0x3d, 0x23, 0x95, 0xac, 0xbf,
- 0xe1, 0x27, 0x84, 0x3e, 0x53, 0x22, 0xe9, 0xbe, 0x20, 0x03, 0x82, 0x3d,
- 0x89, 0xc8, 0xcf, 0xbc, 0x33, 0x89, 0x74, 0xbd, 0x7a, 0xbe, 0x45, 0x3c,
- 0x08, 0x21, 0x11, 0x3c, 0x2b, 0x1f, 0xa1, 0x3e, 0xbf, 0x13, 0xaa, 0x3f,
- 0x10, 0x65, 0x0d, 0xbd, 0x66, 0x16, 0xd5, 0x3e, 0x9f, 0x83, 0x73, 0xbf,
- 0x6d, 0x23, 0x31, 0xbe, 0xb1, 0x7c, 0x7d, 0xbe, 0xff, 0x2d, 0x1a, 0xbf,
- 0x60, 0x5d, 0x98, 0x3e, 0xe7, 0x74, 0x35, 0x3f, 0x95, 0x32, 0x0b, 0x3f,
- 0x59, 0x11, 0xd8, 0xbe, 0x7d, 0x8c, 0x09, 0xbe, 0xf3, 0x48, 0x1f, 0x3f,
- 0x13, 0xa5, 0x3a, 0xbe, 0xa2, 0xc6, 0x6b, 0x3e, 0x31, 0x44, 0xbb, 0x3b,
- 0xe5, 0x6b, 0x9f, 0x3e, 0x2f, 0xe6, 0x30, 0xbd, 0x45, 0x8e, 0x27, 0x3f,
- 0x2b, 0xd2, 0xb0, 0xbc, 0x16, 0x38, 0x07, 0x3e, 0x38, 0xcf, 0x72, 0xbf,
- 0x8c, 0x24, 0x07, 0xbe, 0xd6, 0xe5, 0xff, 0x3d, 0x9f, 0xeb, 0x7d, 0xbf,
- 0xdb, 0x70, 0x00, 0xbf, 0x68, 0x86, 0x3f, 0xba, 0x0a, 0x03, 0x2b, 0xbe,
- 0xa8, 0x26, 0x4b, 0xbe, 0x50, 0x45, 0x68, 0xbd, 0xc3, 0x9c, 0x0e, 0xbe,
- 0x80, 0x0f, 0xfb, 0xbc, 0x5a, 0xbe, 0xa7, 0x3e, 0xbd, 0x18, 0xb2, 0x3e,
+ uint8_t bytes[50184];
+ float values[12546];
+} 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,
}};
-const int32_t dnn_hiddenlayer_1_kernel_part_0_shape[2] = {117, 115};
+const int32_t dnn_hiddenlayer_2_bias_part_0_shape[1] = {132};
const union {
- uint8_t bytes[53820];
- float values[13455];
-} dnn_hiddenlayer_1_kernel_part_0 = {{
- 0x86, 0x1a, 0x51, 0xbe, 0x53, 0xae, 0x0d, 0xba, 0x7c, 0x86, 0x73, 0xbd,
- 0x50, 0x49, 0x39, 0xbf, 0xbd, 0xf7, 0x8d, 0x3e, 0x83, 0xea, 0x32, 0x3d,
- 0x84, 0x07, 0x9e, 0xbd, 0xfd, 0x79, 0x82, 0xbe, 0xed, 0x1c, 0x44, 0x3d,
- 0x81, 0x92, 0xa7, 0xbe, 0x8f, 0x04, 0xd3, 0xbd, 0x7a, 0x51, 0xab, 0xbe,
- 0xa0, 0x9c, 0xdf, 0xbd, 0x35, 0x3c, 0x1f, 0x3d, 0x4a, 0x1c, 0x41, 0xbd,
- 0xa5, 0xeb, 0xde, 0x3d, 0x44, 0x28, 0xdd, 0xbd, 0xb8, 0x66, 0xac, 0x3e,
- 0x6a, 0x84, 0x69, 0xbe, 0x62, 0x1d, 0xf0, 0x3e, 0x50, 0x6b, 0x2f, 0x3c,
- 0xaa, 0x01, 0xc7, 0xbe, 0x36, 0xb8, 0x8d, 0x3c, 0x7f, 0xfe, 0xaf, 0xbe,
- 0x7d, 0xb3, 0x2f, 0xbd, 0xff, 0x1a, 0x3c, 0xbf, 0xa3, 0xf5, 0xf1, 0x3e,
- 0x38, 0x50, 0x4d, 0xbd, 0x30, 0xce, 0xa8, 0xbe, 0x1f, 0xc4, 0xae, 0xbe,
- 0x74, 0x4b, 0x94, 0xbe, 0x11, 0xd0, 0x73, 0xbd, 0x3a, 0x05, 0x21, 0xbf,
- 0x6a, 0x37, 0xd2, 0xbe, 0x1f, 0x16, 0xbd, 0xbe, 0x22, 0xf2, 0x81, 0xbe,
- 0x19, 0x90, 0x39, 0xbe, 0xbe, 0x9d, 0xb5, 0x3d, 0x51, 0x83, 0xf4, 0x3d,
- 0x0c, 0x8f, 0x0d, 0xbf, 0xc9, 0xa7, 0x0a, 0x3e, 0x7e, 0x26, 0x16, 0xbd,
- 0x7e, 0x2d, 0x88, 0xbe, 0x85, 0x01, 0x11, 0x3f, 0x4d, 0xac, 0x94, 0x3d,
- 0xd1, 0xda, 0x33, 0xbf, 0x87, 0xde, 0xab, 0x3e, 0x68, 0x48, 0xce, 0x3e,
- 0x4f, 0x5a, 0x4b, 0xbe, 0xec, 0x0a, 0x75, 0x3e, 0x4a, 0xaa, 0xbc, 0xbd,
- 0xa3, 0xdb, 0xd8, 0xbd, 0x5c, 0xd8, 0x45, 0xbe, 0x7e, 0x48, 0xb9, 0xbd,
- 0xfb, 0xc6, 0xa5, 0x3d, 0x9a, 0x96, 0x24, 0x3e, 0x95, 0x1d, 0xdb, 0x3c,
- 0xb4, 0x28, 0x4c, 0xbd, 0xa6, 0x25, 0x22, 0xbc, 0xff, 0xb0, 0xe2, 0xbe,
- 0xfe, 0xd7, 0xaa, 0xbe, 0x9e, 0x9b, 0xea, 0x3c, 0xeb, 0xf9, 0xff, 0xbd,
- 0xf4, 0x2b, 0x52, 0x3e, 0xf8, 0xfb, 0x57, 0xbf, 0xe0, 0x5e, 0xc0, 0xbe,
- 0xd4, 0x36, 0xfe, 0x3e, 0x0b, 0x4d, 0x12, 0x3d, 0xbd, 0x76, 0x7c, 0x3c,
- 0x00, 0xde, 0xb4, 0x3b, 0x9c, 0x2f, 0xa0, 0xbd, 0x6a, 0x16, 0x33, 0xbe,
- 0xf8, 0x24, 0x26, 0xbf, 0x50, 0x19, 0x4e, 0xbd, 0xa2, 0xab, 0x03, 0xbe,
- 0x9e, 0xa2, 0xa5, 0x3e, 0x92, 0xb0, 0x45, 0x3e, 0x11, 0xf2, 0xd6, 0xbd,
- 0x01, 0xd3, 0x02, 0x3d, 0x5a, 0xcb, 0x8d, 0x3c, 0xc3, 0x6c, 0x20, 0xbf,
- 0x0e, 0x95, 0xd5, 0x3e, 0x38, 0xcd, 0x8d, 0x3d, 0x6d, 0xcf, 0xb3, 0xbe,
- 0xbb, 0x0d, 0xbc, 0xbe, 0x42, 0xad, 0x85, 0x3e, 0x46, 0xa3, 0x70, 0x3e,
- 0xa8, 0xa2, 0x21, 0xbe, 0x14, 0x52, 0xfd, 0x3e, 0xbe, 0xbe, 0xab, 0xbe,
- 0xd9, 0xb0, 0x47, 0xbf, 0x8b, 0xe1, 0x9a, 0xbb, 0x39, 0x09, 0x6b, 0x3d,
- 0x79, 0x98, 0x59, 0xbe, 0x47, 0xd2, 0xbb, 0xbe, 0x9e, 0x5b, 0x99, 0xbe,
- 0x72, 0xfd, 0x3a, 0xbd, 0x37, 0x59, 0x70, 0xbe, 0xe2, 0x84, 0xbc, 0x3d,
- 0xe7, 0xd9, 0xe4, 0x3e, 0x8d, 0xd9, 0xbe, 0x3d, 0x28, 0x3f, 0x71, 0xbe,
- 0xbe, 0x76, 0x52, 0x3e, 0xf9, 0x99, 0xed, 0x3d, 0xda, 0xf7, 0x85, 0xbe,
- 0x2b, 0x69, 0x80, 0x3e, 0xf2, 0x63, 0x64, 0x3e, 0x8c, 0xf6, 0x24, 0xbe,
- 0x23, 0xef, 0x30, 0x3d, 0x7f, 0xf2, 0x90, 0x3e, 0x7c, 0x95, 0x97, 0xbe,
- 0x00, 0x45, 0x3b, 0x3e, 0xef, 0x17, 0x23, 0x3d, 0x83, 0x66, 0x25, 0xbf,
- 0xe4, 0x9f, 0x9f, 0xbe, 0x62, 0xf8, 0x82, 0x3d, 0x75, 0x5b, 0x3a, 0xbe,
- 0xe3, 0xd5, 0x19, 0xbf, 0xb9, 0xa9, 0x6d, 0xbe, 0x68, 0xb5, 0x64, 0x3d,
- 0x9f, 0xd2, 0x98, 0xbc, 0x27, 0x8d, 0xb0, 0x3e, 0x0b, 0x2d, 0x4a, 0xbf,
- 0x28, 0x8d, 0x26, 0xbe, 0xe4, 0x57, 0x87, 0x3e, 0xdd, 0xf6, 0xa0, 0x3d,
- 0xfe, 0xf8, 0x39, 0x3e, 0x66, 0x0c, 0xc8, 0xbe, 0xac, 0x29, 0x02, 0x3f,
- 0xa0, 0xf8, 0x22, 0x3e, 0x42, 0x17, 0xbc, 0xbd, 0x7e, 0xac, 0x42, 0xbd,
- 0x4e, 0xec, 0x38, 0xbe, 0x3a, 0xa7, 0x2a, 0xbf, 0xcc, 0x13, 0x17, 0xbe,
- 0x3e, 0x9a, 0x62, 0xbe, 0x58, 0xf7, 0x73, 0xbe, 0x31, 0x66, 0xa7, 0x38,
- 0xbe, 0x14, 0x65, 0x3e, 0xd3, 0x57, 0x99, 0x3d, 0xef, 0x0e, 0x18, 0xbe,
- 0xa8, 0x42, 0x6b, 0xbe, 0xbc, 0x33, 0x59, 0xbf, 0xbb, 0xd6, 0x7f, 0xbc,
- 0x10, 0x57, 0x5b, 0xbe, 0xa1, 0xe2, 0xe9, 0xbc, 0x95, 0xa1, 0x3e, 0xbf,
- 0x7e, 0x81, 0xac, 0xbe, 0xa5, 0xb4, 0xb7, 0xbe, 0x7a, 0x0f, 0x4b, 0xbd,
- 0xa4, 0x5b, 0x6c, 0xbd, 0x31, 0x7b, 0x2a, 0xbf, 0x5e, 0xac, 0x68, 0xbe,
- 0x68, 0xca, 0xca, 0x3d, 0x2a, 0x67, 0x14, 0x3e, 0x3d, 0x24, 0x68, 0x3c,
- 0x2f, 0x09, 0xac, 0xbe, 0xe0, 0xdb, 0xfd, 0x3d, 0x69, 0xa5, 0x22, 0xbf,
- 0x6f, 0xde, 0xb1, 0x3d, 0x6a, 0xd6, 0x9f, 0xbd, 0x25, 0x8f, 0x5f, 0xbe,
- 0x3b, 0x0c, 0x42, 0xbe, 0xa2, 0xd0, 0xab, 0x3e, 0x63, 0xdc, 0x56, 0xbe,
- 0x43, 0xfa, 0x85, 0x3e, 0x26, 0xad, 0x05, 0x3e, 0x15, 0xd0, 0xdf, 0x3d,
- 0x94, 0x9f, 0x55, 0xbe, 0xee, 0xb6, 0x24, 0x3e, 0x0d, 0x4a, 0xa5, 0xbf,
- 0x23, 0x1c, 0xb5, 0x3e, 0x8f, 0xf0, 0xb7, 0xbe, 0x01, 0x80, 0x42, 0x3e,
- 0x65, 0xcb, 0xa9, 0xbe, 0x0f, 0x82, 0xf4, 0x3d, 0x3b, 0xf7, 0x02, 0x3e,
- 0x06, 0x76, 0xd5, 0xbe, 0xfa, 0xe1, 0xfc, 0xbd, 0x42, 0xdc, 0x1a, 0xbf,
- 0x78, 0xd7, 0xda, 0xbd, 0x8d, 0x40, 0x25, 0x3e, 0x17, 0x54, 0xbb, 0xbe,
- 0x02, 0x72, 0x7f, 0x3e, 0x94, 0x24, 0xf5, 0x3d, 0x38, 0x4f, 0x82, 0x3e,
- 0x47, 0x55, 0x70, 0xbe, 0xdc, 0x83, 0xaf, 0x3d, 0x93, 0x5a, 0xbb, 0x3c,
- 0xbd, 0x6b, 0x06, 0xbf, 0xb9, 0xe7, 0x02, 0x3e, 0x37, 0xc7, 0x4e, 0x3e,
- 0x95, 0xdd, 0xc4, 0xbe, 0xdc, 0xb5, 0x8b, 0x3e, 0x80, 0xd4, 0x6e, 0x3d,
- 0xa2, 0x9d, 0x9b, 0xbe, 0xf8, 0x47, 0x87, 0x3e, 0x5f, 0xf8, 0x3d, 0xbd,
- 0x6d, 0x8c, 0xb1, 0xbe, 0xd0, 0xf1, 0xc0, 0x3e, 0x40, 0x5b, 0x8d, 0x3e,
- 0x03, 0x43, 0x60, 0x3e, 0x8e, 0xfd, 0xea, 0xbd, 0x86, 0xe6, 0x89, 0x3d,
- 0x94, 0x6c, 0xb7, 0xbe, 0x91, 0xeb, 0x32, 0xbe, 0x47, 0xc1, 0x45, 0x3c,
- 0x30, 0x60, 0x59, 0xbf, 0xc3, 0x71, 0xa0, 0xbe, 0x76, 0xef, 0xcf, 0x3e,
- 0xe9, 0xc3, 0x2f, 0x3e, 0x28, 0xda, 0x5a, 0xbe, 0x6e, 0xbd, 0xc0, 0xbd,
- 0xa7, 0x2d, 0xb5, 0x3e, 0xcd, 0x27, 0x9a, 0xbe, 0x77, 0x50, 0x89, 0x3e,
- 0x5c, 0x10, 0x33, 0x3e, 0x94, 0x36, 0x6e, 0x3e, 0x50, 0x63, 0xb9, 0xbe,
- 0x11, 0x09, 0x11, 0xbe, 0xee, 0x72, 0x9a, 0xbe, 0x6c, 0x6f, 0x34, 0x3e,
- 0xa3, 0x2e, 0xd0, 0xbe, 0x8e, 0x76, 0x9c, 0xbe, 0x6e, 0x09, 0xa9, 0x3e,
- 0xc1, 0xba, 0xb1, 0xbd, 0xa8, 0xc3, 0xc1, 0xbd, 0x00, 0x05, 0xd3, 0xbd,
- 0xfd, 0xb6, 0x61, 0x3e, 0x03, 0x36, 0x85, 0xbe, 0xd6, 0x36, 0xcd, 0xbd,
- 0xcd, 0x8a, 0x2e, 0xbe, 0x09, 0xe1, 0x95, 0x3e, 0x86, 0xe6, 0x31, 0xbe,
- 0xa0, 0xd9, 0x23, 0xbe, 0xcd, 0x42, 0x01, 0xbf, 0xc6, 0x47, 0x04, 0x3d,
- 0x9a, 0x9d, 0x3b, 0x3d, 0xa9, 0x77, 0x44, 0x3c, 0xc0, 0xc7, 0x69, 0xbe,
- 0x72, 0xaf, 0xf6, 0x3d, 0x34, 0xff, 0x56, 0x3e, 0xa5, 0xe1, 0x4d, 0x3e,
- 0x6a, 0xaf, 0xda, 0x3d, 0x42, 0x4c, 0x25, 0xbe, 0x42, 0x8e, 0x82, 0x3e,
- 0x2c, 0xc2, 0xc2, 0x3d, 0xee, 0xe8, 0xca, 0x3c, 0x01, 0xb4, 0xd1, 0x3d,
- 0x37, 0xf0, 0x98, 0xbc, 0xa1, 0x1c, 0x8c, 0x3d, 0xc3, 0xf4, 0x7d, 0xbc,
- 0xe3, 0xd6, 0x82, 0xbe, 0x92, 0x7d, 0x71, 0xbd, 0x88, 0x80, 0x8f, 0xbe,
- 0x49, 0xb6, 0x36, 0x3e, 0x06, 0x73, 0x70, 0xbe, 0x2c, 0xed, 0x3f, 0x3e,
- 0x26, 0xba, 0xa4, 0x3d, 0x11, 0x95, 0xc2, 0xbd, 0x44, 0x1c, 0x82, 0x3e,
- 0xc4, 0x94, 0x2a, 0xbe, 0x32, 0xc9, 0x9a, 0x3d, 0x69, 0x88, 0xfa, 0xbd,
- 0x15, 0x43, 0x83, 0xbc, 0xee, 0x71, 0xb4, 0x3e, 0x91, 0x2d, 0x12, 0xbd,
- 0xd0, 0x6b, 0xd4, 0xbd, 0xab, 0xf9, 0xa0, 0xbd, 0xb2, 0x4b, 0xdd, 0x3e,
- 0xd3, 0xee, 0xfd, 0xbe, 0x2a, 0x09, 0x89, 0x3e, 0x16, 0x89, 0xb2, 0xbc,
- 0xc8, 0x2e, 0x98, 0x3e, 0x25, 0x91, 0x2c, 0xbd, 0xf4, 0xf7, 0x82, 0x3e,
- 0x59, 0xb6, 0xa2, 0xbe, 0x16, 0xc2, 0xe3, 0xbe, 0x4f, 0xd3, 0x98, 0x3e,
- 0x43, 0x7b, 0xaf, 0xbd, 0x1d, 0x73, 0x4d, 0x3d, 0x8b, 0xcb, 0x02, 0x3d,
- 0xb6, 0x78, 0xe6, 0xbd, 0x89, 0xbf, 0x0c, 0x3e, 0x23, 0x3b, 0x83, 0x3e,
- 0x73, 0x08, 0x7e, 0xbe, 0x5c, 0xea, 0xd3, 0xbe, 0x5c, 0xfe, 0x24, 0xbe,
- 0x29, 0xa2, 0x60, 0xbd, 0xa7, 0x80, 0x98, 0x3e, 0xec, 0x20, 0x20, 0xbe,
- 0xee, 0x6f, 0xc5, 0x3b, 0xed, 0x61, 0x3d, 0xbd, 0x5b, 0x58, 0x91, 0xbe,
- 0x4a, 0x3a, 0x9a, 0x3c, 0x7a, 0x3d, 0x9e, 0xbe, 0x32, 0x57, 0xda, 0x3c,
- 0x9f, 0x85, 0x20, 0x3e, 0xa3, 0xef, 0xdd, 0x3d, 0x30, 0x2b, 0x26, 0xbf,
- 0xb4, 0xa7, 0xd5, 0x3b, 0xde, 0x57, 0x78, 0x3d, 0x14, 0x43, 0x73, 0x3d,
- 0x69, 0x90, 0xa6, 0x3d, 0x1a, 0x85, 0xdb, 0x3e, 0x1e, 0x89, 0xae, 0xbe,
- 0xe7, 0x79, 0x6c, 0xbe, 0x14, 0x2d, 0xb2, 0xbd, 0xee, 0xb4, 0x49, 0xbe,
- 0x43, 0x56, 0x21, 0x3d, 0xd7, 0x1e, 0x19, 0xbd, 0xf1, 0x18, 0x99, 0x3d,
- 0xae, 0xe7, 0x32, 0xbe, 0x75, 0x07, 0x08, 0x3c, 0x1c, 0x18, 0xc2, 0xbd,
- 0xf7, 0xda, 0xcf, 0x3e, 0xc5, 0xfa, 0x77, 0x3d, 0xa0, 0xf3, 0xaa, 0xbd,
- 0x83, 0xcb, 0xa1, 0x3d, 0x5d, 0x26, 0xbf, 0xbd, 0x8f, 0x21, 0x7d, 0xbe,
- 0x35, 0xba, 0x62, 0x3e, 0x2f, 0x7e, 0x68, 0xbe, 0xa2, 0x25, 0x21, 0xbe,
- 0x32, 0x00, 0x14, 0xbe, 0x44, 0x48, 0x4e, 0x3d, 0xc1, 0xf2, 0x01, 0x3e,
- 0xa7, 0x93, 0x09, 0x3e, 0x1f, 0x75, 0x70, 0xbe, 0x33, 0x7b, 0x06, 0xbf,
- 0x66, 0xee, 0x02, 0x3e, 0x1a, 0xbc, 0x2c, 0xbf, 0x3f, 0xe8, 0xa4, 0x3e,
- 0xc2, 0xf3, 0x27, 0xbe, 0x34, 0xb4, 0x0e, 0xbc, 0x7a, 0xf9, 0x09, 0x3d,
- 0x1c, 0x8b, 0x8e, 0x3c, 0xf1, 0x87, 0x63, 0xbd, 0x67, 0x54, 0x25, 0xbf,
- 0x9a, 0x57, 0x00, 0xbd, 0xcd, 0xe8, 0xbc, 0x3d, 0x24, 0x7a, 0x41, 0x3e,
- 0x87, 0x32, 0xf9, 0xbc, 0xb1, 0x61, 0x3c, 0xbe, 0xee, 0x4d, 0x23, 0x3d,
- 0x37, 0xc6, 0x8d, 0x3d, 0xbf, 0x42, 0xab, 0xbd, 0x24, 0x2a, 0x05, 0x3e,
- 0xd1, 0xd9, 0x9f, 0xbe, 0x6a, 0x93, 0x1b, 0xbe, 0x29, 0x37, 0xbc, 0xbd,
- 0x2b, 0xa1, 0xa8, 0xbe, 0x29, 0x01, 0xb9, 0xbd, 0x55, 0x78, 0x09, 0xbe,
- 0x56, 0xe2, 0x31, 0xbb, 0x4e, 0xf9, 0x36, 0xbe, 0x89, 0xc0, 0xb1, 0xbe,
- 0x6f, 0xc5, 0xef, 0xbd, 0xd6, 0x52, 0x89, 0xbe, 0x3f, 0x02, 0xfb, 0x3e,
- 0xbf, 0x90, 0x06, 0x3d, 0xf7, 0x2b, 0x54, 0x3e, 0x58, 0x64, 0xb5, 0xbd,
- 0x5e, 0xfa, 0xa5, 0xbd, 0x05, 0x8a, 0x11, 0xbf, 0x42, 0xfd, 0x11, 0x3e,
- 0xeb, 0x72, 0xe1, 0x3e, 0xab, 0xc2, 0x25, 0xbd, 0x0f, 0xcb, 0xa2, 0xbc,
- 0x67, 0x3e, 0x06, 0xbe, 0x22, 0x5a, 0x85, 0xbe, 0x97, 0x49, 0xf7, 0x3e,
- 0x6f, 0x25, 0xb7, 0x3e, 0x39, 0x99, 0x3d, 0x3e, 0xb0, 0x1b, 0x26, 0xbc,
- 0x34, 0x1d, 0xb8, 0xbe, 0x1c, 0x92, 0x1e, 0x3e, 0x03, 0xbb, 0xe6, 0xbe,
- 0x6a, 0x53, 0xdf, 0xbd, 0xfc, 0xe7, 0xdc, 0x3c, 0xac, 0x7b, 0x21, 0xbe,
- 0x2e, 0xa7, 0x89, 0x3e, 0xa1, 0xa7, 0x34, 0x3e, 0xde, 0xcb, 0x8f, 0x3d,
- 0xc3, 0x4f, 0xc2, 0xbe, 0xca, 0x16, 0xbf, 0x3c, 0xef, 0xe0, 0x22, 0xbe,
- 0x46, 0x45, 0x43, 0xbe, 0x52, 0x0d, 0x89, 0x3d, 0x82, 0x68, 0x7a, 0xbd,
- 0xf3, 0x6d, 0x92, 0x3c, 0x0a, 0x04, 0x83, 0x3c, 0x80, 0x0a, 0xe7, 0xbd,
- 0xbd, 0x21, 0x34, 0xbf, 0x3f, 0xfa, 0x80, 0xbd, 0x36, 0xfc, 0xd7, 0x3d,
- 0x0d, 0xe3, 0xa6, 0xbe, 0xb3, 0xf1, 0xc0, 0x3d, 0xa4, 0x00, 0xf0, 0x3d,
- 0x0f, 0x23, 0xc3, 0xbe, 0x3d, 0x55, 0x0b, 0x3f, 0x2a, 0x6c, 0x74, 0x3e,
- 0x47, 0x11, 0x60, 0xbf, 0x0f, 0x54, 0xba, 0x3e, 0x85, 0x0e, 0x15, 0x3d,
- 0x5f, 0x98, 0xae, 0x3d, 0x8e, 0xa2, 0xd1, 0xbe, 0x07, 0xbb, 0xd3, 0xbe,
- 0x1d, 0x06, 0xa7, 0xbe, 0x81, 0x53, 0x4e, 0x3e, 0x24, 0x3c, 0x20, 0xbe,
- 0xce, 0x24, 0x12, 0x3b, 0x33, 0x56, 0x21, 0xbf, 0xea, 0x03, 0xd4, 0x3e,
- 0xea, 0x54, 0x19, 0xbf, 0x23, 0x2a, 0xf2, 0xbe, 0x01, 0x93, 0xce, 0xbe,
- 0x08, 0x2a, 0x29, 0xbe, 0x72, 0x34, 0xe8, 0xba, 0xa9, 0x30, 0x32, 0xbd,
- 0x45, 0x7a, 0x5d, 0x3e, 0x95, 0xc7, 0x27, 0xbe, 0x92, 0x9f, 0x0a, 0x3f,
- 0x04, 0x39, 0x81, 0xbd, 0x22, 0xff, 0x08, 0xbe, 0xae, 0x16, 0xf7, 0x3e,
- 0x08, 0xb3, 0x54, 0xbe, 0xd7, 0x36, 0x32, 0xbe, 0x0d, 0x7f, 0x76, 0xbb,
- 0x95, 0xd3, 0xd8, 0x3e, 0xf6, 0xfb, 0xb6, 0xbd, 0x95, 0x93, 0x98, 0x3d,
- 0x19, 0x9e, 0x0d, 0xbd, 0x1b, 0x63, 0x11, 0xbf, 0xfa, 0x72, 0x8d, 0xbe,
- 0x69, 0x8f, 0x00, 0xbf, 0xf2, 0x57, 0xa2, 0xbe, 0x34, 0xb0, 0x0b, 0xbf,
- 0x26, 0xff, 0x66, 0xbe, 0xbb, 0x44, 0x86, 0x3e, 0xec, 0x05, 0xa7, 0x3c,
- 0xdb, 0x11, 0x20, 0x3d, 0x01, 0xb3, 0x45, 0x3d, 0x9a, 0x1b, 0x72, 0xbe,
- 0xa4, 0x6c, 0x2b, 0x3e, 0xff, 0x12, 0xc8, 0xbe, 0xd6, 0x5f, 0xe7, 0xbe,
- 0xb0, 0x99, 0x1b, 0x3f, 0x8e, 0x7c, 0x03, 0xbf, 0xcd, 0xb8, 0xfa, 0xbe,
- 0xd8, 0x44, 0x03, 0x3f, 0x1c, 0x0c, 0x0f, 0x3f, 0x94, 0x87, 0x2a, 0x3e,
- 0x69, 0x7c, 0x89, 0xbe, 0x04, 0x7a, 0x2c, 0xbe, 0x35, 0x81, 0xb1, 0x3e,
- 0x5f, 0xad, 0x72, 0x3e, 0x9e, 0x31, 0x05, 0xbe, 0x41, 0x32, 0xce, 0xbd,
- 0x03, 0x26, 0x19, 0xbf, 0x40, 0xa1, 0x28, 0xbe, 0x06, 0x52, 0x6b, 0xbe,
- 0x0f, 0xc3, 0xcd, 0x3e, 0x37, 0x9b, 0xbe, 0xbd, 0x30, 0x4a, 0x97, 0xbe,
- 0x67, 0xc9, 0xc8, 0x3e, 0x1e, 0xbf, 0x9b, 0xbb, 0xa8, 0x98, 0x00, 0xbe,
- 0x33, 0x73, 0x65, 0xbe, 0x90, 0x02, 0x1b, 0xbd, 0xbe, 0xf5, 0xeb, 0x3e,
- 0x66, 0xff, 0x7f, 0xbe, 0xc2, 0x43, 0xeb, 0x3e, 0x3d, 0xff, 0x02, 0xbf,
- 0x8b, 0x2b, 0xab, 0x3e, 0x9d, 0x28, 0x89, 0x3e, 0xc3, 0xc3, 0x1c, 0x3f,
- 0xb0, 0xa9, 0x3a, 0x3e, 0x18, 0x6c, 0x85, 0x3d, 0xee, 0xb8, 0xb3, 0x3d,
- 0x4b, 0x26, 0x20, 0xbc, 0xc7, 0x38, 0x8c, 0x3d, 0x0e, 0x2e, 0x42, 0x3e,
- 0x85, 0x31, 0xb2, 0xbc, 0x31, 0xf7, 0x31, 0x3f, 0xea, 0x1f, 0x83, 0xbe,
- 0x21, 0x15, 0xcb, 0x3e, 0x69, 0x86, 0x07, 0xbe, 0xc4, 0xb8, 0xac, 0x3e,
- 0x78, 0xb1, 0x3e, 0xbf, 0x62, 0x97, 0xe2, 0xbd, 0x72, 0x81, 0xa9, 0xbe,
- 0x62, 0x5d, 0x83, 0xbd, 0x67, 0x80, 0x3a, 0x3d, 0x6f, 0x83, 0xda, 0x3e,
- 0xe5, 0x60, 0xb6, 0xbe, 0xeb, 0x36, 0xac, 0x3d, 0xce, 0x3e, 0x93, 0x3e,
- 0x55, 0xd7, 0x35, 0xbe, 0xd6, 0x93, 0x9b, 0x3d, 0x0f, 0x82, 0x79, 0xbf,
- 0x95, 0xc2, 0x47, 0xbd, 0xa6, 0x59, 0x88, 0xbd, 0xbc, 0x88, 0xd5, 0x3e,
- 0x91, 0x77, 0x82, 0x3c, 0xd5, 0x0d, 0x10, 0xbe, 0x37, 0xb6, 0x85, 0xbe,
- 0xcd, 0x52, 0xe3, 0xbd, 0x25, 0xa7, 0x03, 0xbe, 0x2a, 0xe9, 0xce, 0x3a,
- 0xa0, 0xf8, 0x93, 0xbe, 0x1f, 0xd1, 0x22, 0xbf, 0xf5, 0x1c, 0x2e, 0xbf,
- 0xdb, 0x37, 0x97, 0x3d, 0xfa, 0x0b, 0xe5, 0xbd, 0x50, 0x11, 0xa8, 0xbd,
- 0xf9, 0xb2, 0x72, 0x3e, 0x15, 0xc0, 0x06, 0xbe, 0x7e, 0x3e, 0x30, 0x3e,
- 0x6d, 0x7e, 0x5d, 0x3e, 0x61, 0x93, 0xbd, 0x3d, 0x79, 0xe9, 0xc3, 0x3e,
- 0xd2, 0xf0, 0x6e, 0xbe, 0x34, 0xfc, 0x17, 0x3f, 0xb3, 0xdd, 0x00, 0x3e,
- 0xb4, 0x2d, 0x4c, 0xbd, 0xa7, 0x49, 0xcd, 0x3e, 0x69, 0x29, 0xc7, 0xbe,
- 0x2e, 0x75, 0xdf, 0x3d, 0x1e, 0x93, 0x56, 0x3d, 0x85, 0x9f, 0xfe, 0xbb,
- 0x62, 0xe9, 0xa4, 0xbe, 0xb2, 0x8c, 0x3e, 0x3e, 0xd8, 0x55, 0x19, 0xbe,
- 0x03, 0x78, 0x75, 0x3d, 0x5f, 0xc5, 0xa4, 0x3e, 0xb8, 0xdb, 0x13, 0xbf,
- 0x42, 0xf3, 0xe2, 0x3e, 0x62, 0x16, 0x39, 0xbe, 0x0d, 0x25, 0xdd, 0xbe,
- 0xc8, 0x82, 0xd9, 0xbe, 0xc3, 0x96, 0x94, 0xbe, 0x90, 0xfa, 0x8d, 0x3d,
- 0x12, 0xa1, 0xce, 0xbe, 0x25, 0xb6, 0x4e, 0x3e, 0xd9, 0xad, 0x8f, 0xbd,
- 0xd6, 0x7f, 0x89, 0x3d, 0xb3, 0x9e, 0x3d, 0xbd, 0x52, 0xb2, 0x67, 0xbd,
- 0x63, 0xd9, 0xb2, 0x3d, 0x9a, 0xaf, 0x4b, 0xbd, 0xea, 0x1e, 0x9c, 0xbd,
- 0xc5, 0xc7, 0x10, 0xbd, 0x7c, 0x20, 0xb0, 0xbd, 0x4f, 0xa4, 0xc4, 0x3e,
- 0x70, 0x32, 0xac, 0x3d, 0x65, 0x9d, 0x9b, 0x3f, 0x16, 0xb9, 0xe7, 0x3e,
- 0xf2, 0xa1, 0x07, 0xbe, 0xd3, 0x12, 0x89, 0xbd, 0x58, 0x2b, 0x9f, 0xbe,
- 0x6f, 0x13, 0xe9, 0x3d, 0x3a, 0x28, 0x8c, 0x3e, 0xf8, 0xae, 0x13, 0xbf,
- 0x26, 0x8e, 0x32, 0xbf, 0xb9, 0x19, 0xa4, 0x3e, 0x6e, 0x4d, 0x00, 0xbf,
- 0xd8, 0x7a, 0x33, 0x3f, 0xcd, 0x2f, 0x3d, 0x3e, 0x40, 0x6b, 0x61, 0xbe,
- 0xd6, 0x06, 0xa5, 0xbe, 0x9f, 0xa6, 0x68, 0x3e, 0xf6, 0x8b, 0xc4, 0xbe,
- 0xf7, 0xcb, 0x06, 0xbf, 0x55, 0x5a, 0xc3, 0xbd, 0x66, 0x69, 0xaa, 0x3d,
- 0x56, 0x9b, 0xa5, 0xbe, 0x16, 0x6c, 0x9d, 0x3d, 0xdd, 0xf3, 0xa1, 0xbe,
- 0x64, 0x0e, 0x35, 0xbe, 0xcc, 0x14, 0xee, 0x3d, 0xfb, 0x42, 0xc4, 0xbd,
- 0x44, 0xf6, 0xab, 0xbe, 0x38, 0x03, 0x34, 0xbe, 0xb6, 0x65, 0x45, 0xbe,
- 0xdf, 0xde, 0xb8, 0x3e, 0x0c, 0x90, 0x9a, 0xbe, 0x6b, 0x0f, 0xbf, 0xbe,
- 0x1f, 0x7d, 0x98, 0x3d, 0x15, 0x1d, 0x8e, 0x3e, 0xc2, 0x5b, 0x16, 0xbe,
- 0x9c, 0xc4, 0x65, 0x3e, 0x54, 0x33, 0x03, 0xbf, 0x9d, 0x4b, 0x7a, 0x3c,
- 0xdf, 0x81, 0xef, 0x3d, 0xc2, 0xd2, 0x43, 0x3e, 0x91, 0xe4, 0x09, 0x3e,
- 0x30, 0x34, 0xeb, 0xbd, 0x7e, 0x2d, 0x8e, 0xbd, 0x1d, 0x86, 0x13, 0xbe,
- 0xff, 0x04, 0x5d, 0xbd, 0x53, 0x64, 0x45, 0x3e, 0x11, 0x90, 0x0f, 0xbe,
- 0x4a, 0x59, 0xe8, 0x3d, 0x34, 0x32, 0xc3, 0xbd, 0x75, 0x7e, 0x5f, 0xbe,
- 0xc8, 0xd5, 0x08, 0x3d, 0x29, 0x43, 0x78, 0xbd, 0xca, 0xe7, 0x9f, 0x3d,
- 0xe3, 0x0f, 0x6b, 0xbe, 0xd7, 0x3a, 0xfe, 0xbd, 0x3e, 0x01, 0x5d, 0xbe,
- 0xe0, 0x42, 0x89, 0xbe, 0x28, 0x92, 0x57, 0x3d, 0x8f, 0x38, 0x54, 0xbf,
- 0xdf, 0xd8, 0x1d, 0xbe, 0x38, 0x14, 0x0a, 0xbf, 0x80, 0xbb, 0xa6, 0x3e,
- 0x0e, 0x02, 0x11, 0xbf, 0x44, 0xef, 0xa1, 0xbd, 0x14, 0xfb, 0xa4, 0x3d,
- 0xd9, 0x2b, 0x31, 0xbe, 0xb2, 0xc4, 0xd5, 0xbc, 0x70, 0x72, 0x4d, 0xbd,
- 0xae, 0x57, 0x8b, 0x3e, 0xdc, 0xa8, 0x58, 0xbe, 0x18, 0xd4, 0x4b, 0xbe,
- 0x03, 0xa5, 0xd2, 0x3e, 0x69, 0x32, 0xc0, 0xbe, 0x81, 0xc5, 0x36, 0xbc,
- 0x5c, 0xc1, 0xd3, 0x3b, 0x84, 0x88, 0x01, 0xbe, 0x46, 0xb6, 0xab, 0x3c,
- 0x94, 0x5f, 0x21, 0xbe, 0xd4, 0x05, 0x59, 0xbf, 0x86, 0xab, 0xc2, 0xbe,
- 0x38, 0x89, 0x25, 0x3e, 0x0b, 0xb4, 0x80, 0xbe, 0x57, 0x60, 0xa2, 0xbc,
- 0xb9, 0x73, 0xa0, 0x3d, 0xbf, 0x86, 0xda, 0x3d, 0x7f, 0x2c, 0x6e, 0x3e,
- 0x20, 0xd1, 0xaa, 0x3d, 0xba, 0xc3, 0x0d, 0xbc, 0x51, 0x1b, 0x1b, 0xbf,
- 0xe5, 0xc0, 0x0b, 0xbf, 0xb2, 0x7b, 0x01, 0x3f, 0xcc, 0x7f, 0x3a, 0x3e,
- 0xc5, 0x9f, 0x2f, 0xbe, 0x8d, 0x3e, 0xc3, 0xbd, 0xc6, 0x43, 0x29, 0x3e,
- 0x3e, 0x91, 0xbe, 0xbc, 0xd7, 0xba, 0x83, 0x3e, 0x07, 0x25, 0xb8, 0x3e,
- 0xde, 0xd3, 0xed, 0xbd, 0xf0, 0x51, 0x1f, 0x3c, 0x3b, 0xb7, 0x15, 0x3d,
- 0x75, 0xee, 0xe3, 0x3b, 0xca, 0x32, 0xcd, 0x3e, 0x0e, 0x46, 0x69, 0xbe,
- 0x09, 0xaa, 0x1f, 0x3e, 0x7d, 0xe1, 0x7f, 0x3e, 0x94, 0xaa, 0xa2, 0xbc,
- 0xc7, 0xb1, 0x4b, 0x3d, 0xcd, 0xc3, 0x25, 0xbd, 0x59, 0xb9, 0x21, 0x3e,
- 0x7b, 0x49, 0x54, 0xbd, 0xe0, 0x4f, 0xed, 0xbe, 0x03, 0x9e, 0x95, 0xbd,
- 0xc6, 0x44, 0x47, 0x3c, 0x49, 0x24, 0x8b, 0x3d, 0xe7, 0xa9, 0x4f, 0xbe,
- 0x87, 0xbc, 0xb3, 0x3e, 0x81, 0xe9, 0xac, 0xbd, 0x85, 0x15, 0x7d, 0x3e,
- 0x1e, 0x3a, 0x95, 0xbe, 0xc1, 0xdb, 0xca, 0x3d, 0x33, 0xca, 0xad, 0xbd,
- 0x06, 0x5a, 0x21, 0xbe, 0x3b, 0x6c, 0x96, 0x3c, 0x63, 0x59, 0x84, 0x3e,
- 0x86, 0x79, 0x92, 0x3e, 0x8f, 0xa7, 0x19, 0xbc, 0x98, 0xbc, 0x38, 0x3d,
- 0x87, 0xd8, 0x29, 0xbe, 0xa2, 0x97, 0x0c, 0xbe, 0xea, 0xa9, 0x8f, 0xbd,
- 0x5d, 0x22, 0xba, 0x3d, 0x69, 0x18, 0xa3, 0x3d, 0x37, 0x0d, 0x8a, 0xbe,
- 0xbe, 0xbb, 0x93, 0xbe, 0x4d, 0xc8, 0x49, 0x3e, 0x0a, 0x28, 0x22, 0xbf,
- 0x01, 0x97, 0x63, 0xbd, 0x88, 0xf6, 0x4f, 0x3c, 0x99, 0x1d, 0x11, 0xbf,
- 0x03, 0xec, 0x45, 0xbe, 0xda, 0xeb, 0x52, 0x3d, 0xb1, 0xe2, 0xcf, 0x3e,
- 0xac, 0x27, 0x8c, 0x3e, 0x51, 0xfe, 0x65, 0xbe, 0x0a, 0x08, 0x3e, 0xbe,
- 0xf2, 0x3d, 0x23, 0x3e, 0xa3, 0xe2, 0x3b, 0xbd, 0xd7, 0x8b, 0x7c, 0xbe,
- 0x4f, 0x35, 0xd1, 0xbd, 0xc2, 0x57, 0x7d, 0xbd, 0xb9, 0xa6, 0x7f, 0xbe,
- 0x21, 0x5a, 0x14, 0xbf, 0x65, 0xb9, 0x15, 0x3e, 0xbe, 0x67, 0xe3, 0xbe,
- 0xd2, 0x88, 0xbd, 0xbd, 0xf5, 0xe5, 0x86, 0xbe, 0x04, 0x5f, 0x8a, 0x3e,
- 0xc7, 0xcb, 0xb3, 0xbe, 0xd3, 0x24, 0x24, 0x3c, 0x50, 0x66, 0xcb, 0xbd,
- 0x49, 0x8b, 0xc1, 0x3e, 0x55, 0x7c, 0x09, 0xbe, 0x65, 0x84, 0x3a, 0x3e,
- 0x25, 0x1a, 0x86, 0x3c, 0x33, 0xca, 0xd2, 0x3e, 0xea, 0xd7, 0x3e, 0x3e,
- 0x95, 0x1c, 0x74, 0xbf, 0x79, 0x6e, 0xb5, 0xbe, 0xcf, 0x93, 0xd4, 0x3e,
- 0xda, 0x0b, 0xc3, 0xbe, 0x7a, 0x84, 0x24, 0x3d, 0x75, 0x3d, 0x7d, 0x3d,
- 0xd5, 0x1b, 0xe3, 0xbd, 0x29, 0x53, 0x30, 0xbd, 0xbf, 0x67, 0x24, 0x3e,
- 0xd7, 0xa6, 0x84, 0xbe, 0x44, 0xbe, 0x2f, 0xbe, 0x0b, 0x47, 0x14, 0xbe,
- 0x13, 0x3f, 0x07, 0x3e, 0x9a, 0x2f, 0xfd, 0xbd, 0x6a, 0x3f, 0x86, 0x3e,
- 0xf3, 0xa5, 0xea, 0xbd, 0x49, 0x16, 0x46, 0xbf, 0x24, 0x10, 0x92, 0x3e,
- 0x71, 0x12, 0xf9, 0xbe, 0x26, 0x67, 0x44, 0xbf, 0x3f, 0xa2, 0xf5, 0x3e,
- 0xc3, 0x6f, 0x3f, 0xbf, 0x02, 0x7c, 0x60, 0x3e, 0x52, 0xd8, 0x35, 0xbe,
- 0x6f, 0x0a, 0xc7, 0xbb, 0x84, 0x9f, 0x17, 0xbf, 0x4f, 0x6a, 0x0d, 0xbd,
- 0x4d, 0x37, 0x0e, 0xbe, 0x65, 0x20, 0x00, 0xbf, 0x7a, 0xe5, 0x37, 0xbe,
- 0xd3, 0x84, 0xe5, 0x3e, 0x40, 0x1f, 0x65, 0xbe, 0x72, 0xdd, 0x94, 0x3e,
- 0x95, 0x2c, 0x06, 0xbe, 0x02, 0x0b, 0x1f, 0x3d, 0x24, 0x44, 0x34, 0x3e,
- 0x6a, 0x7e, 0x87, 0x3e, 0xc7, 0x35, 0x67, 0xbd, 0x46, 0x60, 0xd6, 0x3c,
- 0xe0, 0x35, 0x13, 0xbf, 0x73, 0x52, 0xa5, 0x3d, 0xea, 0x2e, 0xf9, 0xbe,
- 0xf9, 0xda, 0x08, 0xbd, 0x5f, 0xa4, 0x36, 0xbc, 0x1b, 0x9f, 0xb9, 0xbe,
- 0x8d, 0xd4, 0x45, 0xbd, 0x00, 0x96, 0x9f, 0x3e, 0x2c, 0x11, 0x13, 0xbe,
- 0x40, 0x79, 0xaf, 0xbe, 0xa7, 0xac, 0x5a, 0xbe, 0x65, 0x84, 0xa9, 0xbe,
- 0x22, 0xa3, 0x92, 0xbe, 0x09, 0x65, 0x90, 0xbe, 0x64, 0x54, 0xa6, 0xbe,
- 0x06, 0x16, 0x99, 0xbe, 0x57, 0x47, 0x25, 0x3e, 0x71, 0xdf, 0xae, 0xbe,
- 0xfd, 0x1f, 0x90, 0xbd, 0xcc, 0xd0, 0x68, 0x3e, 0x1f, 0x15, 0x48, 0x3e,
- 0x9a, 0x5e, 0xcc, 0xbe, 0x1c, 0x4a, 0xb6, 0x3d, 0x4d, 0x77, 0xdd, 0xbd,
- 0x40, 0x5e, 0x20, 0x3c, 0x6f, 0xbd, 0x07, 0xbb, 0x01, 0xa0, 0xcc, 0x3d,
- 0x56, 0x38, 0x39, 0xbe, 0x5a, 0xfe, 0x89, 0x3e, 0x00, 0xaa, 0x26, 0xbf,
- 0xdd, 0x6b, 0xd2, 0xbe, 0x50, 0xf3, 0x66, 0xbe, 0x86, 0xa2, 0x36, 0x3f,
- 0x5b, 0x96, 0x33, 0x3e, 0x37, 0x2c, 0x0c, 0xbd, 0x38, 0x4c, 0xbd, 0x3e,
- 0x20, 0x3c, 0x21, 0x3e, 0x81, 0xd8, 0xd8, 0xbe, 0xfe, 0x07, 0x82, 0x3e,
- 0x67, 0xeb, 0xd5, 0xbe, 0x2f, 0x11, 0xe3, 0x3e, 0xcb, 0x1a, 0x92, 0xbe,
- 0xbf, 0x55, 0xae, 0x3e, 0xa9, 0x01, 0xb9, 0xbe, 0x21, 0x20, 0xb8, 0xbb,
- 0xeb, 0xc6, 0x47, 0xbf, 0x11, 0x67, 0x8c, 0xbe, 0x00, 0x68, 0x13, 0xbd,
- 0x87, 0x13, 0x91, 0xbe, 0x97, 0x01, 0x59, 0xbd, 0x63, 0x3d, 0x14, 0xbe,
- 0xea, 0x91, 0x85, 0xbe, 0x3d, 0xfd, 0x89, 0x3e, 0x46, 0x7e, 0x38, 0x3e,
- 0xf4, 0x15, 0x17, 0xbd, 0x99, 0x5f, 0x09, 0xbe, 0x5b, 0x5e, 0xc3, 0x3d,
- 0xd3, 0xcf, 0x37, 0xbf, 0x5d, 0xd0, 0x81, 0x3e, 0xf0, 0x52, 0xd8, 0x3e,
- 0x3b, 0x09, 0x05, 0xbd, 0x2c, 0x4e, 0x64, 0x3e, 0x4b, 0x75, 0x88, 0xbe,
- 0xf7, 0x6e, 0x97, 0xbe, 0x4c, 0x70, 0xab, 0xbe, 0x29, 0x72, 0x8d, 0xbe,
- 0x04, 0xff, 0x89, 0xbc, 0xea, 0x95, 0xd0, 0x3e, 0x0e, 0xaa, 0xb2, 0xbd,
- 0xdd, 0x52, 0x75, 0xbe, 0x90, 0xa7, 0xfc, 0xbe, 0xaf, 0x0e, 0x79, 0xbd,
- 0xaf, 0x34, 0x9b, 0x3d, 0x9d, 0xc1, 0x5e, 0x3d, 0x8b, 0xff, 0x26, 0xbd,
- 0x3b, 0x33, 0x0d, 0x3c, 0x6e, 0xac, 0x2b, 0xbf, 0x82, 0x6b, 0xfa, 0xbd,
- 0x08, 0x3a, 0xde, 0x3d, 0xe3, 0x87, 0x14, 0x3e, 0x7d, 0x8b, 0xe7, 0xbe,
- 0xa2, 0xba, 0x72, 0xbd, 0x76, 0xa3, 0x9b, 0x3e, 0x50, 0x8f, 0xeb, 0xbe,
- 0x95, 0x38, 0x2b, 0xbe, 0xde, 0x3c, 0x86, 0x3c, 0x37, 0xcb, 0x30, 0xbf,
- 0x0a, 0xdb, 0x67, 0xbe, 0x34, 0x3a, 0x7b, 0xbf, 0x8a, 0x11, 0x3d, 0xbe,
- 0x64, 0xc2, 0x25, 0xbf, 0x45, 0x5e, 0x91, 0xbe, 0x31, 0xc8, 0x04, 0x3e,
- 0xb6, 0xa3, 0x3a, 0x3e, 0x04, 0x70, 0x6c, 0xbe, 0x83, 0x76, 0xbe, 0xbc,
- 0x1f, 0x3d, 0x43, 0x3e, 0xf6, 0xf6, 0x9a, 0x3e, 0x48, 0x79, 0x15, 0xbf,
- 0x08, 0xcf, 0x4b, 0xbe, 0x83, 0x40, 0x59, 0x3e, 0x47, 0xc0, 0x5c, 0x3d,
- 0x6c, 0x73, 0x08, 0xbe, 0x7f, 0xf0, 0x10, 0x3e, 0xe8, 0xa1, 0x5a, 0x3e,
- 0xb1, 0x86, 0xe4, 0xbc, 0x57, 0x36, 0x57, 0xbb, 0x9c, 0xa1, 0x57, 0xbc,
- 0xe9, 0xd2, 0x39, 0x3e, 0x7f, 0x39, 0xc2, 0xbe, 0x90, 0x97, 0xc8, 0x3b,
- 0x0c, 0xc5, 0xed, 0xbe, 0xbe, 0x4c, 0x75, 0x3e, 0x13, 0x5a, 0xf6, 0x3d,
- 0x60, 0x28, 0x4e, 0x3d, 0x4a, 0x36, 0xb0, 0xbe, 0x39, 0x64, 0x20, 0xbd,
- 0xd2, 0x5f, 0x41, 0xbe, 0x73, 0x65, 0x85, 0x3d, 0xfe, 0x98, 0xc9, 0xbd,
- 0x94, 0xaa, 0xc6, 0xbe, 0x6c, 0xe5, 0xb2, 0x3e, 0xd8, 0x9a, 0x4e, 0x3d,
- 0xed, 0xf1, 0x01, 0xbf, 0xda, 0x55, 0x6a, 0xbc, 0x96, 0xc9, 0xf0, 0xbd,
- 0xf9, 0xca, 0x56, 0xbf, 0x8e, 0x1e, 0x10, 0xbf, 0x67, 0xf5, 0x8e, 0xbe,
- 0x68, 0x16, 0x07, 0x3d, 0x5b, 0xa8, 0x0c, 0xbf, 0x7d, 0x1d, 0x05, 0x3e,
- 0x44, 0xdb, 0x94, 0x3d, 0x82, 0xbc, 0xc3, 0xbe, 0xf4, 0x6f, 0x60, 0xbe,
- 0x5c, 0x96, 0x15, 0xbf, 0x3a, 0xce, 0xb3, 0xbd, 0xd5, 0xb2, 0xc3, 0x3d,
- 0xba, 0xcd, 0xcb, 0x3d, 0xac, 0x70, 0xec, 0xbd, 0x14, 0x42, 0xde, 0xbc,
- 0xd4, 0x3c, 0x81, 0xbe, 0x30, 0x68, 0x8a, 0x3c, 0xb8, 0x1f, 0xa1, 0x3e,
- 0x8f, 0x6f, 0xf2, 0xbe, 0x62, 0xd5, 0x82, 0xbe, 0x31, 0x9e, 0x0b, 0xbf,
- 0xca, 0x8f, 0xff, 0x3d, 0xbf, 0x1a, 0x26, 0xbe, 0x1b, 0x36, 0x7b, 0xbe,
- 0x5c, 0x51, 0x21, 0x3d, 0xbd, 0x15, 0xc9, 0x3d, 0xea, 0x89, 0x87, 0x3d,
- 0x79, 0xef, 0x7a, 0x3d, 0xef, 0x0c, 0xfd, 0x3d, 0xe9, 0x4d, 0x03, 0x3d,
- 0x03, 0x18, 0xb2, 0x3c, 0x9b, 0xba, 0x99, 0xbe, 0x8b, 0x52, 0x08, 0x3e,
- 0x15, 0x35, 0xad, 0xbc, 0x88, 0xb3, 0xfb, 0x3d, 0xf1, 0xef, 0x80, 0xbe,
- 0xb5, 0x8f, 0x64, 0xbe, 0x67, 0xb2, 0x19, 0x3e, 0xa8, 0x38, 0x75, 0x3d,
- 0x5e, 0x66, 0x9e, 0xbc, 0x49, 0x94, 0x25, 0x3e, 0x92, 0xa8, 0x7e, 0x3e,
- 0x8a, 0xc0, 0x60, 0xbe, 0xc7, 0x38, 0x18, 0xbc, 0xf6, 0xd7, 0x1d, 0x3f,
- 0x7b, 0xa7, 0x17, 0xbe, 0x74, 0xe5, 0x8d, 0xbe, 0x8f, 0x3e, 0x27, 0xbc,
- 0x3f, 0xe9, 0x30, 0x3f, 0x02, 0xb3, 0xa3, 0x3e, 0xad, 0xc5, 0xdc, 0xbd,
- 0x86, 0xba, 0xbd, 0xbd, 0x90, 0x03, 0x00, 0x3e, 0xc5, 0xca, 0xb2, 0xbd,
- 0x4d, 0xfc, 0xb2, 0x3e, 0xaf, 0x6c, 0x00, 0x3e, 0xee, 0x8f, 0xb8, 0x3e,
- 0x8d, 0x47, 0x1c, 0xbf, 0x97, 0x9b, 0xee, 0x3d, 0xf5, 0xf8, 0xa1, 0x3e,
- 0x68, 0xe7, 0xfc, 0x3c, 0x75, 0xf2, 0x0d, 0xbe, 0xec, 0xbd, 0xb3, 0xbd,
- 0x11, 0x70, 0x4a, 0xbd, 0x3e, 0x04, 0xdc, 0x3e, 0x70, 0xba, 0x2d, 0x3e,
- 0xfc, 0xf6, 0x0d, 0x3f, 0x30, 0xd1, 0x1c, 0x3c, 0xff, 0x04, 0x68, 0x3d,
- 0xec, 0xf7, 0x31, 0xbe, 0x0f, 0xa8, 0x5f, 0x3e, 0x0e, 0x30, 0x9a, 0xbe,
- 0x1c, 0x2d, 0xfd, 0xbd, 0xa2, 0x5c, 0xde, 0x3d, 0x03, 0x9a, 0x8f, 0xbe,
- 0xd2, 0xe6, 0x51, 0xbd, 0xa3, 0xb1, 0xbb, 0xbe, 0xfb, 0x5c, 0x5f, 0xbf,
- 0xee, 0x2d, 0x33, 0x3e, 0x15, 0x81, 0x3f, 0x3e, 0xfb, 0xc4, 0x70, 0xbf,
- 0x07, 0xfc, 0xb9, 0x3e, 0xb5, 0xba, 0xcc, 0xbd, 0x07, 0xa3, 0xc2, 0x3d,
- 0xb5, 0x3a, 0x12, 0xbd, 0xdc, 0x44, 0xdb, 0x3e, 0xf5, 0x3b, 0xd8, 0x3d,
- 0xba, 0x20, 0x75, 0xbe, 0x76, 0x12, 0xf8, 0x3b, 0x9e, 0xd4, 0x2b, 0xbf,
- 0x32, 0xa2, 0x34, 0xbe, 0x79, 0xe1, 0x00, 0x3f, 0x1f, 0x9c, 0x13, 0x3d,
- 0x6c, 0x29, 0xa2, 0xbe, 0xe1, 0x1e, 0x83, 0x3e, 0x4e, 0x2d, 0x39, 0x3e,
- 0x21, 0x52, 0x2a, 0x3f, 0xa5, 0xf0, 0xdb, 0x3e, 0x6c, 0xce, 0xed, 0x3e,
- 0x91, 0x19, 0x04, 0xbe, 0xa8, 0xb2, 0x06, 0x3e, 0x5d, 0x6c, 0x35, 0x3e,
- 0x8f, 0x9b, 0xee, 0x3e, 0x09, 0xfb, 0xbf, 0x3d, 0xe8, 0xea, 0xd1, 0x3e,
- 0x94, 0x43, 0x27, 0xbd, 0x86, 0xa8, 0xf9, 0x3d, 0x01, 0x6f, 0xaf, 0x3e,
- 0xf2, 0x4e, 0x9d, 0xbe, 0x13, 0xea, 0xde, 0xbe, 0x0f, 0x22, 0xd0, 0xbd,
- 0x96, 0xf7, 0xe7, 0x3d, 0x8c, 0xd3, 0x25, 0xbf, 0x93, 0x1b, 0x07, 0xbf,
- 0xaa, 0x07, 0x86, 0x3e, 0xd0, 0x8b, 0x21, 0x3b, 0xaf, 0x48, 0xe1, 0xbd,
- 0x16, 0xee, 0x08, 0x3e, 0xac, 0x91, 0x96, 0xbd, 0xc8, 0x97, 0x9c, 0x3e,
- 0x89, 0x21, 0x8d, 0xbe, 0xd9, 0xe4, 0xd7, 0xbd, 0x8f, 0x94, 0xb5, 0xbd,
- 0xe7, 0x88, 0xb0, 0xbd, 0x43, 0xcb, 0xc1, 0xbe, 0x64, 0xa1, 0x55, 0x3e,
- 0xde, 0x14, 0xa9, 0xbe, 0x46, 0x8e, 0x10, 0x3d, 0x96, 0x2c, 0x2c, 0xbd,
- 0x30, 0x3f, 0x44, 0x3e, 0x1d, 0x54, 0xb6, 0xbe, 0x72, 0x0a, 0xfa, 0xbd,
- 0x99, 0x8a, 0x08, 0xbe, 0x12, 0xc4, 0xef, 0xbd, 0x1e, 0x53, 0xa9, 0x3c,
- 0x2e, 0x76, 0x6e, 0x3e, 0xe9, 0x8e, 0xb9, 0x3c, 0x06, 0x40, 0xcc, 0xbd,
- 0xef, 0x2b, 0xbe, 0xbe, 0x5c, 0xe3, 0xd9, 0x3e, 0x16, 0xb7, 0x5a, 0xbf,
- 0x00, 0x71, 0x11, 0x3f, 0xb0, 0xbe, 0xcf, 0x3a, 0x0b, 0x58, 0xfb, 0xbe,
- 0x99, 0xc9, 0xc4, 0xbd, 0xd8, 0xe0, 0x33, 0xbe, 0xba, 0x31, 0x32, 0x3e,
- 0x40, 0x7e, 0xe6, 0xbc, 0x78, 0x85, 0x97, 0x3d, 0xa4, 0x24, 0x62, 0xbe,
- 0x95, 0x41, 0x15, 0xbe, 0x3f, 0xb9, 0x5e, 0xbe, 0x23, 0xa1, 0x61, 0xbc,
- 0x69, 0x1e, 0xe8, 0xbe, 0xc2, 0xdb, 0x8a, 0xbe, 0x0b, 0x66, 0x62, 0x3e,
- 0x92, 0x71, 0xd0, 0xbd, 0x1c, 0xa8, 0x20, 0x3d, 0xb2, 0x7d, 0x07, 0xbe,
- 0x89, 0x62, 0x4f, 0xbe, 0x41, 0x6d, 0xfd, 0x3c, 0x30, 0x32, 0xda, 0xbe,
- 0xfe, 0xd7, 0x39, 0xbe, 0x56, 0x18, 0x76, 0x3c, 0x9e, 0xb6, 0x6f, 0x3e,
- 0x50, 0x3b, 0x7f, 0x3d, 0x9d, 0xea, 0x0d, 0x3e, 0x0c, 0xb4, 0x8a, 0x3e,
- 0xcf, 0x61, 0x56, 0xbe, 0xf6, 0x70, 0xd2, 0xbd, 0x19, 0x5d, 0x07, 0xbf,
- 0xf7, 0x07, 0x92, 0x3d, 0xfa, 0xaa, 0x8a, 0x3a, 0x8c, 0x12, 0x34, 0x3e,
- 0x0e, 0xa6, 0xc3, 0xbd, 0x8a, 0xf4, 0x08, 0x3d, 0x05, 0xff, 0x03, 0xbe,
- 0x68, 0x7d, 0xa0, 0xbd, 0xf9, 0xb6, 0x94, 0xbe, 0x06, 0x80, 0xe8, 0x3e,
- 0xe2, 0x6d, 0xd1, 0xbe, 0xe5, 0xb7, 0x0e, 0xbe, 0x75, 0x4d, 0xc2, 0xbc,
- 0x9a, 0x3c, 0x22, 0xbe, 0x94, 0x15, 0x27, 0xbe, 0xa1, 0x9f, 0x38, 0xbe,
- 0x1f, 0xca, 0xfa, 0xbe, 0xcf, 0xe4, 0x3d, 0xbe, 0xf6, 0x22, 0xbf, 0xbd,
- 0x8f, 0x60, 0xd9, 0xbd, 0x46, 0x05, 0x53, 0xbe, 0x07, 0x43, 0xe7, 0xbe,
- 0x1e, 0x99, 0xb1, 0xbd, 0xf6, 0x39, 0xf3, 0x3c, 0xf1, 0x70, 0x06, 0xbb,
- 0xc9, 0x25, 0x3a, 0xbe, 0x4a, 0x74, 0x32, 0x3e, 0x9b, 0xa1, 0x7a, 0xbe,
- 0x33, 0xdd, 0x41, 0x3b, 0xfe, 0xc4, 0x18, 0x3d, 0xc5, 0x33, 0x00, 0xbe,
- 0xfc, 0x63, 0xce, 0x3d, 0x1e, 0xa4, 0xd0, 0xbe, 0xf8, 0x51, 0x45, 0x3e,
- 0xa6, 0xa7, 0xc0, 0x3d, 0xbd, 0x48, 0x65, 0x3e, 0x52, 0x4b, 0x07, 0xbe,
- 0xb3, 0xb4, 0xb9, 0xbe, 0xdd, 0xf2, 0x74, 0xbe, 0x3e, 0x97, 0x59, 0x3e,
- 0xa1, 0xcf, 0x54, 0xbe, 0x93, 0x74, 0x11, 0xbf, 0x07, 0x80, 0xc5, 0xbe,
- 0x33, 0xee, 0xee, 0xb9, 0x4e, 0x69, 0xd2, 0xbd, 0x37, 0xba, 0x17, 0xbe,
- 0x58, 0x06, 0x15, 0xbe, 0x2c, 0xf9, 0x18, 0x3e, 0xdd, 0x4c, 0x86, 0xbe,
- 0x34, 0x6f, 0x95, 0x3e, 0xcf, 0xcf, 0x30, 0xbd, 0xcc, 0x55, 0x82, 0x39,
- 0x46, 0x59, 0x8f, 0xbe, 0x38, 0xf0, 0xf3, 0x3c, 0x5e, 0x48, 0xbb, 0xbc,
- 0x69, 0x0f, 0xe7, 0xbe, 0x53, 0xec, 0x2d, 0xbe, 0x4c, 0x8c, 0xfa, 0xbe,
- 0x64, 0x0f, 0x42, 0xbe, 0x2a, 0xfe, 0x77, 0xbe, 0x37, 0x5c, 0xa1, 0xbe,
- 0x11, 0x1b, 0x5a, 0xbe, 0x81, 0x42, 0x9b, 0xbe, 0xa3, 0xd8, 0x56, 0x3e,
- 0x41, 0x40, 0x0b, 0xbd, 0x98, 0x64, 0x64, 0xbe, 0xda, 0x1e, 0xa3, 0x3e,
- 0x04, 0xa7, 0x0c, 0x3e, 0xc8, 0xff, 0xe0, 0xbe, 0xe7, 0x8f, 0x38, 0x3e,
- 0x2b, 0xe5, 0x4d, 0xbc, 0x82, 0x0d, 0xa0, 0xbd, 0x6a, 0x3c, 0xc5, 0x3c,
- 0xb3, 0x83, 0x79, 0xbd, 0x71, 0x6b, 0x25, 0xbe, 0x85, 0x19, 0x75, 0x3d,
- 0xb1, 0x64, 0x18, 0x3e, 0xf2, 0x76, 0x46, 0xbe, 0xa7, 0xf9, 0x00, 0x3d,
- 0xed, 0xe5, 0x63, 0xbd, 0x4a, 0x99, 0x16, 0xbe, 0x09, 0x5f, 0x8e, 0x3e,
- 0xad, 0x68, 0x03, 0xbf, 0xdb, 0x7a, 0x05, 0xbf, 0xd7, 0x1b, 0xcb, 0xbd,
- 0xe9, 0x47, 0x92, 0x3e, 0x0d, 0x4a, 0xbb, 0xbc, 0x5b, 0xb7, 0x0c, 0xbf,
- 0x77, 0x02, 0x78, 0xbe, 0x3d, 0x2c, 0xb1, 0xbe, 0x2d, 0xaa, 0x9e, 0x3e,
- 0x4f, 0x90, 0xfe, 0xbe, 0x52, 0x39, 0xac, 0x3e, 0xc0, 0x3e, 0xdf, 0xbd,
- 0xb7, 0xaa, 0xf4, 0xbd, 0xd6, 0x12, 0xdf, 0x3e, 0x1b, 0x64, 0x36, 0x3e,
- 0xaa, 0xbd, 0x0c, 0xbe, 0x86, 0xc0, 0x4c, 0x3e, 0x0c, 0xf3, 0x16, 0xbe,
- 0x49, 0x75, 0xa5, 0x3e, 0xcb, 0xb4, 0x9d, 0xbe, 0x77, 0xf4, 0xa2, 0xbd,
- 0x2e, 0x5a, 0x7c, 0xbd, 0x23, 0x63, 0xdd, 0x3d, 0xfe, 0xeb, 0x55, 0xbe,
- 0xf2, 0x44, 0x21, 0xbd, 0x4f, 0xcf, 0xc4, 0xbe, 0x7c, 0x71, 0xce, 0xbe,
- 0xfa, 0x0c, 0x5c, 0xbd, 0xdf, 0x37, 0x58, 0x3d, 0xc7, 0x50, 0x84, 0xbe,
- 0x11, 0x62, 0x9e, 0xbd, 0x1d, 0xa4, 0xfb, 0x3d, 0x8f, 0xf0, 0x08, 0xbf,
- 0x8d, 0x58, 0x90, 0x3b, 0xa1, 0x6b, 0xc0, 0x3e, 0xb0, 0xa9, 0xbc, 0xbc,
- 0x82, 0x7c, 0xa2, 0xbd, 0x15, 0x61, 0xad, 0xbe, 0x82, 0xd4, 0xf8, 0x3d,
- 0x8a, 0x22, 0x22, 0xbe, 0xdb, 0x54, 0x9e, 0x3e, 0x2b, 0xfd, 0x09, 0xbd,
- 0xfa, 0xea, 0x15, 0xbe, 0x94, 0x78, 0x03, 0xbf, 0x20, 0x95, 0x02, 0x3e,
- 0xf0, 0x9d, 0x9b, 0x3e, 0x01, 0xc3, 0x84, 0xbb, 0xf7, 0xdb, 0xb9, 0x3e,
- 0xf7, 0xae, 0x6b, 0x3e, 0x0b, 0x61, 0x31, 0x3f, 0x34, 0xe7, 0x1a, 0x3f,
- 0x8f, 0xdb, 0x15, 0xbe, 0x34, 0x2b, 0x84, 0x3d, 0x7c, 0x62, 0xca, 0xbc,
- 0x3e, 0xb7, 0x76, 0xbe, 0x94, 0xb7, 0xe2, 0x3e, 0x80, 0xc3, 0x29, 0xbf,
- 0xc3, 0x76, 0x19, 0xbe, 0x6f, 0xb1, 0xba, 0x3c, 0x41, 0x77, 0xab, 0xbc,
- 0xb4, 0x47, 0x17, 0xbd, 0xf5, 0x16, 0xb3, 0x3e, 0xed, 0x0b, 0x9f, 0x3d,
- 0xd9, 0xd1, 0xf4, 0x3d, 0xaf, 0x31, 0x81, 0xbd, 0x22, 0x16, 0x93, 0x3e,
- 0x86, 0x6b, 0x83, 0xbe, 0x87, 0x5b, 0x6b, 0xbd, 0xb7, 0x1f, 0x92, 0xbc,
- 0x3c, 0x43, 0x9b, 0x3e, 0x0b, 0x6f, 0xe0, 0x3d, 0x40, 0x68, 0xed, 0xbd,
- 0x7b, 0x27, 0x20, 0xbe, 0x64, 0xdb, 0x20, 0xbf, 0xac, 0x94, 0xac, 0x3e,
- 0xdc, 0x90, 0x3c, 0x3e, 0xe9, 0x13, 0x52, 0xbf, 0x5a, 0x50, 0x7f, 0xbe,
- 0xd9, 0x43, 0x9d, 0x3c, 0x25, 0xf8, 0xb3, 0x3e, 0x2d, 0x94, 0x29, 0xbf,
- 0xa0, 0x38, 0x36, 0x3e, 0xed, 0x18, 0x31, 0xbe, 0x96, 0x5b, 0xe4, 0x3d,
- 0x97, 0x00, 0x9f, 0x3e, 0xe3, 0xd8, 0xc9, 0xbe, 0xcd, 0xc2, 0x04, 0xbf,
- 0x24, 0x42, 0xbc, 0xbe, 0x6c, 0x94, 0x41, 0x3e, 0xaf, 0xdb, 0xaa, 0xbe,
- 0x7c, 0x3f, 0x00, 0x3d, 0x1f, 0xea, 0x9e, 0xbc, 0xb0, 0xb6, 0x23, 0x3e,
- 0x4f, 0x8a, 0x5a, 0x3e, 0xc8, 0x88, 0x5c, 0x3d, 0x6b, 0xff, 0x82, 0xbd,
- 0x2c, 0xe7, 0x9a, 0xbc, 0x1f, 0x85, 0x27, 0x3e, 0x23, 0x34, 0x13, 0xbe,
- 0xc2, 0xad, 0x39, 0xbe, 0x50, 0xb6, 0x68, 0xbe, 0xbb, 0x86, 0xa9, 0x3d,
- 0xd4, 0xf7, 0x00, 0xbe, 0x88, 0x47, 0x3d, 0xbe, 0x0b, 0x08, 0xa5, 0x3d,
- 0x7e, 0xa4, 0x19, 0x3e, 0x22, 0x4b, 0xaf, 0xbd, 0xeb, 0x33, 0x2d, 0xbd,
- 0x82, 0xfe, 0xbf, 0xbe, 0xf1, 0x44, 0xc6, 0x3e, 0x49, 0x86, 0x13, 0xbe,
- 0x72, 0xec, 0xbd, 0x3d, 0x20, 0x24, 0x84, 0x3e, 0xc7, 0xe0, 0x8b, 0xbe,
- 0x49, 0xe4, 0xa2, 0xbd, 0x20, 0x4c, 0x41, 0xbe, 0xf9, 0x49, 0xfc, 0x39,
- 0x83, 0x86, 0xac, 0xbe, 0x90, 0xf2, 0xd0, 0xbd, 0x19, 0xd9, 0xa7, 0xbe,
- 0xc7, 0x42, 0xfe, 0x3e, 0x38, 0xd1, 0xe2, 0x3d, 0x22, 0xb0, 0xc3, 0x3d,
- 0xf3, 0x15, 0xae, 0x3e, 0xf2, 0xa5, 0xb3, 0xbe, 0x44, 0x91, 0xa1, 0xbe,
- 0x26, 0x0e, 0x98, 0x3c, 0x60, 0x8b, 0x90, 0x3d, 0x85, 0x3c, 0x7c, 0xbe,
- 0xcf, 0x84, 0x02, 0xbe, 0xc4, 0xa0, 0xc1, 0xbe, 0xd8, 0xd9, 0x9c, 0x3e,
- 0x1b, 0x58, 0x36, 0xbd, 0x40, 0x08, 0x0d, 0x3f, 0xf8, 0xcb, 0x94, 0xbc,
- 0x2b, 0xa3, 0xc9, 0xbc, 0xf0, 0x69, 0xec, 0xbc, 0x66, 0xc5, 0x02, 0x3f,
- 0xee, 0xa0, 0x0d, 0xbd, 0x1c, 0x50, 0xca, 0xbd, 0x65, 0xa6, 0x25, 0x3e,
- 0x40, 0x6e, 0x09, 0xbe, 0xca, 0xf3, 0x1f, 0xbf, 0x36, 0x36, 0xb0, 0x3d,
- 0x69, 0x32, 0xb0, 0xbe, 0x6f, 0x2b, 0x77, 0x3e, 0x1c, 0x47, 0xd4, 0x3e,
- 0x6f, 0xf4, 0x57, 0x3e, 0x1f, 0x2b, 0x99, 0xbd, 0xdc, 0x78, 0x10, 0xbd,
- 0xa8, 0xff, 0xc6, 0x3e, 0x63, 0x59, 0x08, 0xbe, 0x35, 0x27, 0x2f, 0xbf,
- 0xa9, 0xf7, 0xc3, 0xbd, 0x76, 0xb7, 0x32, 0xbe, 0xa5, 0xf0, 0xdb, 0xbd,
- 0x1b, 0x73, 0xe1, 0xbe, 0x61, 0xf4, 0x99, 0xbd, 0x27, 0xbc, 0x92, 0xbe,
- 0x60, 0x1e, 0xf6, 0x3e, 0x24, 0x3c, 0x86, 0x3d, 0x6a, 0x6b, 0xcb, 0xbe,
- 0xe6, 0x22, 0xbe, 0x3c, 0x9b, 0x9d, 0x55, 0x3e, 0x43, 0x54, 0x11, 0xbf,
- 0xb1, 0xaa, 0x41, 0x3d, 0x24, 0x56, 0x5d, 0xbe, 0xd5, 0x6f, 0x0a, 0x3f,
- 0x6c, 0xae, 0x06, 0x3d, 0x61, 0x12, 0x11, 0x3f, 0x05, 0x01, 0x04, 0x3c,
- 0x47, 0xd5, 0x09, 0x3e, 0xdb, 0xe2, 0xc6, 0xbe, 0x55, 0x5c, 0x9a, 0xbe,
- 0x6c, 0x77, 0x90, 0xbe, 0xac, 0x32, 0x5d, 0x3e, 0x01, 0xb0, 0x76, 0x3d,
- 0xaa, 0x5d, 0xaf, 0x3d, 0x66, 0x29, 0xa0, 0xbd, 0xcc, 0x30, 0xbf, 0xbd,
- 0x0f, 0xc3, 0x0b, 0x3d, 0x00, 0x29, 0xbc, 0x3e, 0x0d, 0x5d, 0xbd, 0x3e,
- 0xa4, 0xe4, 0x40, 0x3d, 0x36, 0x1d, 0x9b, 0xbe, 0x2c, 0x3d, 0xce, 0x3c,
- 0xf2, 0x1a, 0x1d, 0x3f, 0x55, 0x6d, 0xd5, 0xbe, 0x04, 0x63, 0x54, 0xbf,
- 0x5a, 0x94, 0x98, 0x3e, 0x89, 0xc2, 0x10, 0x3d, 0x4d, 0x07, 0xa5, 0x3d,
- 0xd1, 0x4d, 0x66, 0xbc, 0xa6, 0xbc, 0xcc, 0xbd, 0x42, 0x50, 0x67, 0xbd,
- 0xbe, 0x93, 0x75, 0xbe, 0x5f, 0xd7, 0xc8, 0x3e, 0x80, 0xb3, 0x30, 0x3d,
- 0x67, 0x1c, 0xd8, 0xbd, 0x2d, 0xec, 0x18, 0xbe, 0x5b, 0x1f, 0x00, 0x3e,
- 0x19, 0x22, 0xac, 0x3e, 0x9e, 0x0e, 0x47, 0x3e, 0xb0, 0xaf, 0x31, 0x38,
- 0x90, 0x40, 0x68, 0x3e, 0x29, 0xcc, 0x98, 0xbd, 0xf3, 0x4f, 0xa0, 0xbe,
- 0xb1, 0xe2, 0xf3, 0x3e, 0x95, 0x25, 0x98, 0xbe, 0x84, 0x7e, 0x61, 0x3e,
- 0xb6, 0xc9, 0x87, 0xbe, 0x6a, 0xf1, 0x95, 0xb8, 0xa5, 0x1c, 0xcd, 0x3e,
- 0x81, 0x69, 0xdd, 0xbe, 0x01, 0xbd, 0x19, 0xbf, 0xe0, 0x66, 0x42, 0xbe,
- 0xbe, 0x01, 0x3a, 0x3e, 0x88, 0x9a, 0x10, 0xbf, 0x25, 0xa6, 0x23, 0xbe,
- 0x73, 0x86, 0x30, 0xbe, 0xc6, 0x4e, 0x23, 0xbd, 0xf1, 0xab, 0x08, 0xbd,
- 0x0a, 0xcf, 0x60, 0xbe, 0x61, 0x6b, 0x93, 0xbe, 0x42, 0xda, 0xbd, 0xbe,
- 0x1b, 0xac, 0xc1, 0xbc, 0xed, 0x8d, 0xd2, 0x3e, 0x9b, 0x28, 0x0f, 0xbe,
- 0x0d, 0xe9, 0xdc, 0xbe, 0xfa, 0xda, 0xc4, 0xbe, 0x10, 0x09, 0x1b, 0x3e,
- 0xb5, 0xd5, 0x82, 0xbd, 0xd7, 0x3b, 0xa1, 0x3e, 0xdd, 0x79, 0xc5, 0xbe,
- 0x18, 0xc6, 0x0e, 0xbf, 0xfe, 0xed, 0x64, 0x3e, 0xd5, 0x25, 0xc9, 0xbe,
- 0xc2, 0xb8, 0x00, 0xbf, 0xe2, 0xef, 0xfa, 0xbc, 0x34, 0xf0, 0x08, 0x3e,
- 0x5a, 0x1d, 0x65, 0xbe, 0x73, 0x23, 0x71, 0x3d, 0x26, 0x97, 0xaa, 0xbd,
- 0x04, 0x73, 0xe6, 0x3d, 0x63, 0xa9, 0x38, 0x3e, 0x8e, 0x77, 0x85, 0x3e,
- 0xa5, 0x80, 0x9d, 0xbd, 0x49, 0x3c, 0x9a, 0x3d, 0x48, 0xf6, 0xcf, 0xbe,
- 0xd8, 0x9e, 0xfe, 0x3d, 0x8e, 0x8f, 0x2e, 0xbe, 0x20, 0x06, 0x82, 0xbe,
- 0x7a, 0x32, 0x51, 0xbe, 0x99, 0x88, 0x03, 0xbe, 0x64, 0x2f, 0xc2, 0xbe,
- 0x1d, 0x6b, 0xb0, 0x3e, 0xc5, 0xab, 0x10, 0x3e, 0x4d, 0xf6, 0x9e, 0x3e,
- 0x0e, 0x3c, 0xfc, 0xbd, 0xf5, 0x30, 0x94, 0x3e, 0xa5, 0x0c, 0x47, 0xbb,
- 0x20, 0xce, 0xf5, 0x3c, 0x0a, 0x57, 0xda, 0x3d, 0x64, 0x39, 0x7a, 0xbd,
- 0xd2, 0xf3, 0x4b, 0xbe, 0x79, 0x54, 0x33, 0xbd, 0x92, 0x78, 0x38, 0x3f,
- 0x81, 0x32, 0x82, 0x3d, 0xe5, 0x35, 0xc8, 0x3e, 0x25, 0x03, 0x2a, 0x3a,
- 0x84, 0xa3, 0x8c, 0x3e, 0x2d, 0x0c, 0xd3, 0x3d, 0x14, 0x2b, 0x4c, 0xbe,
- 0x3b, 0x15, 0x43, 0x3e, 0x70, 0x07, 0x52, 0x3e, 0xa4, 0xec, 0x60, 0xbe,
- 0x16, 0x72, 0x7e, 0xbe, 0x35, 0x83, 0x24, 0x3e, 0x5e, 0xba, 0x54, 0xbe,
- 0x6d, 0x12, 0x47, 0x3e, 0xe0, 0xa7, 0x3d, 0x3e, 0x5b, 0x30, 0xa8, 0xbe,
- 0x49, 0xb6, 0x4a, 0xbf, 0x50, 0x8e, 0x27, 0x3d, 0x62, 0x6b, 0x76, 0x3e,
- 0x7f, 0x59, 0xb8, 0xbe, 0xcc, 0xf5, 0xff, 0xbe, 0xaf, 0x25, 0xdf, 0xbe,
- 0x4e, 0x52, 0xe0, 0x3d, 0xb8, 0xe2, 0x05, 0x3e, 0xee, 0x7c, 0x3a, 0x3e,
- 0x03, 0x56, 0x2e, 0x3e, 0x81, 0x40, 0x15, 0xbf, 0xd7, 0xa5, 0x81, 0x3e,
- 0x67, 0x5e, 0x18, 0x3b, 0xbc, 0x74, 0xf1, 0x3e, 0x38, 0x45, 0xcb, 0x3e,
- 0x1d, 0x75, 0xa8, 0xbd, 0x1e, 0xd5, 0x5e, 0xbe, 0x8c, 0x17, 0xa2, 0x3c,
- 0xf7, 0xaa, 0xa3, 0x3e, 0x2d, 0x57, 0x92, 0xbe, 0x89, 0xee, 0x38, 0x3e,
- 0x15, 0xb3, 0xaa, 0x3d, 0x74, 0xf4, 0xc7, 0x3e, 0x21, 0x36, 0x5c, 0x3e,
- 0xf3, 0x06, 0xb3, 0xbd, 0xde, 0x21, 0xf3, 0x3e, 0xac, 0x32, 0xc3, 0x3e,
- 0xb7, 0x6f, 0xdc, 0x3d, 0x4a, 0xea, 0xfd, 0xbe, 0xa8, 0x50, 0x0e, 0x3f,
- 0xff, 0x37, 0xa8, 0x3e, 0x59, 0xea, 0x98, 0x3d, 0xb1, 0x83, 0x65, 0xbe,
- 0xf3, 0xb2, 0xeb, 0x3e, 0x7c, 0x9c, 0xcb, 0xbe, 0x2a, 0xde, 0xcc, 0x3e,
- 0x7e, 0xb6, 0x30, 0x3e, 0x65, 0xe4, 0xd3, 0xbd, 0xd5, 0xc0, 0xb7, 0x3e,
- 0x6f, 0xe1, 0x9b, 0x3e, 0x1d, 0x9f, 0x24, 0x3e, 0x47, 0xa1, 0x05, 0x3e,
- 0x7a, 0xcc, 0x16, 0x3e, 0x8f, 0x37, 0xdb, 0x3d, 0x04, 0x1e, 0xe9, 0x3d,
- 0x55, 0xb4, 0xa0, 0xbe, 0x26, 0xd2, 0x73, 0x3e, 0xb2, 0x58, 0x61, 0x3e,
- 0xc2, 0xee, 0x7d, 0x3d, 0x6e, 0xb2, 0x17, 0x3f, 0xbf, 0xd7, 0xf6, 0x3d,
- 0x58, 0x7f, 0x27, 0x3e, 0x3d, 0x1a, 0x41, 0x3e, 0x9e, 0xd8, 0x2d, 0xbd,
- 0x87, 0xe8, 0x62, 0x3d, 0x95, 0xb5, 0xf6, 0x3d, 0xc6, 0xd4, 0x6b, 0x3e,
- 0x33, 0xa1, 0x23, 0xbd, 0x82, 0x68, 0x0b, 0x3f, 0x20, 0xbe, 0x13, 0xbe,
- 0x51, 0x9b, 0x55, 0x3e, 0x60, 0xbe, 0x87, 0x3d, 0x51, 0xea, 0x85, 0xbe,
- 0x5d, 0x48, 0x89, 0x3e, 0x99, 0xad, 0x6f, 0x3e, 0x95, 0xd7, 0xcc, 0xbc,
- 0x82, 0xd1, 0x1d, 0xbe, 0x6a, 0x92, 0x1f, 0x3e, 0xce, 0x28, 0x08, 0xbe,
- 0x8c, 0x45, 0x4c, 0x3e, 0x3c, 0x7a, 0xd5, 0x3e, 0x18, 0xba, 0x0b, 0x3e,
- 0x03, 0x31, 0x89, 0xbb, 0xce, 0xa0, 0xfa, 0xbe, 0xd3, 0x1e, 0x5c, 0xbe,
- 0xb0, 0xa6, 0xc6, 0xbd, 0xa4, 0x12, 0x7f, 0xbe, 0x44, 0x62, 0x6d, 0x3d,
- 0x13, 0x5f, 0x38, 0xbd, 0x79, 0x66, 0x7d, 0xbe, 0xe8, 0x6b, 0x2a, 0xbe,
- 0x94, 0x50, 0xf8, 0x3c, 0x52, 0xb2, 0x67, 0x3d, 0x10, 0x4e, 0x56, 0xbe,
- 0xe1, 0x97, 0x03, 0x3e, 0x47, 0x95, 0x22, 0x3a, 0xfa, 0x70, 0x5d, 0x3e,
- 0x32, 0x34, 0xad, 0xbe, 0xdc, 0xbd, 0x4c, 0xbf, 0xda, 0x2e, 0xf2, 0xbe,
- 0xe4, 0x0e, 0x95, 0xbe, 0xa8, 0xad, 0x51, 0x3e, 0x6a, 0x1e, 0x59, 0x3e,
- 0x04, 0xeb, 0x0a, 0x3e, 0xe2, 0xf9, 0x0e, 0x3b, 0xbc, 0xe5, 0x4e, 0xbe,
- 0x93, 0x9f, 0xdb, 0x3c, 0x5d, 0x2f, 0xed, 0x3e, 0x42, 0x4b, 0xc2, 0x3d,
- 0xbc, 0x5b, 0xb1, 0xbe, 0x69, 0x0d, 0x0e, 0xbe, 0xcf, 0x34, 0x65, 0xbe,
- 0x19, 0x01, 0xfa, 0xbe, 0xc7, 0x6f, 0xee, 0xbe, 0xc6, 0x8c, 0x47, 0x3e,
- 0xb9, 0x1c, 0xd4, 0xbe, 0x75, 0x21, 0x62, 0x3d, 0x24, 0x00, 0x41, 0xbc,
- 0x94, 0x73, 0x1e, 0x3e, 0x04, 0x9b, 0x9f, 0xbe, 0x20, 0x63, 0x31, 0x3e,
- 0x2f, 0x76, 0x01, 0x3e, 0x73, 0xd3, 0x75, 0xbe, 0xc5, 0xb7, 0x08, 0xbf,
- 0x1f, 0x92, 0x41, 0xbe, 0x2c, 0x28, 0x99, 0xbe, 0xaa, 0x06, 0x76, 0xbc,
- 0xff, 0xe5, 0xd2, 0xb8, 0x9b, 0x0b, 0x70, 0xbc, 0x4e, 0x16, 0xba, 0xbd,
- 0xa6, 0xcb, 0xb3, 0xbd, 0x16, 0x0b, 0x97, 0xbd, 0x14, 0x7b, 0x96, 0x3c,
- 0xf0, 0xdf, 0xd6, 0x3d, 0x2d, 0x94, 0xbf, 0xbe, 0x92, 0x83, 0x0e, 0xbe,
- 0x16, 0x36, 0x8f, 0x3d, 0x7e, 0xde, 0xbb, 0x3d, 0x5a, 0x59, 0x62, 0x3d,
- 0xfb, 0x2a, 0x0d, 0xbf, 0x8f, 0xad, 0x56, 0x3e, 0x54, 0x4c, 0xb6, 0x3c,
- 0x12, 0x02, 0x12, 0x3c, 0x40, 0xad, 0x69, 0x3e, 0x76, 0x77, 0x55, 0x3d,
- 0x3b, 0xd4, 0x3a, 0x3e, 0xba, 0xf1, 0x07, 0x3e, 0x09, 0xc0, 0x8a, 0xbe,
- 0x07, 0x48, 0xa0, 0x3d, 0xde, 0x5e, 0x9b, 0xbe, 0x4f, 0x70, 0x5e, 0x3d,
- 0x18, 0x89, 0x14, 0xbf, 0x67, 0x9c, 0x16, 0x3e, 0x82, 0x06, 0x67, 0xbe,
- 0x06, 0x55, 0xb7, 0xbd, 0xe6, 0x23, 0xf5, 0xbd, 0xfb, 0x03, 0xf4, 0xbd,
- 0xe2, 0xf7, 0x0b, 0xbe, 0x7d, 0x4c, 0x63, 0xbd, 0x9f, 0x16, 0xd6, 0xbc,
- 0x2f, 0x7c, 0x10, 0xbf, 0x98, 0x95, 0xb4, 0xbd, 0x87, 0x3b, 0x00, 0xbe,
- 0xc5, 0x2c, 0xf9, 0x3d, 0x5b, 0xef, 0x39, 0xbe, 0x7c, 0x00, 0x1d, 0x3e,
- 0xf9, 0x8e, 0x2a, 0xbe, 0xaa, 0x52, 0x03, 0x3e, 0xdb, 0x7f, 0x04, 0xbe,
- 0xb3, 0x8c, 0x84, 0x3c, 0x93, 0x3e, 0xb3, 0x3d, 0xbe, 0x1e, 0x1a, 0xbf,
- 0x18, 0x3b, 0xbd, 0xbe, 0x89, 0xf2, 0x69, 0xbe, 0xd6, 0x89, 0x78, 0x3d,
- 0xdb, 0xca, 0x01, 0xbe, 0xeb, 0xa4, 0xfe, 0x3d, 0x11, 0xb3, 0xd1, 0xbb,
- 0xce, 0x84, 0x30, 0xbe, 0x33, 0x5e, 0x77, 0xbe, 0x6d, 0xf6, 0xfd, 0xbd,
- 0xb0, 0x53, 0x49, 0x3e, 0x17, 0xcb, 0x0c, 0x3c, 0x50, 0x32, 0x6c, 0x3b,
- 0x86, 0xe0, 0x89, 0x3e, 0x81, 0x60, 0x35, 0xbf, 0x0a, 0x9c, 0x6f, 0xbd,
- 0x2e, 0x57, 0x0f, 0xbe, 0x0c, 0xab, 0x80, 0xbe, 0xb9, 0xf2, 0xdd, 0xbe,
- 0x77, 0x97, 0x74, 0x3e, 0x37, 0xad, 0x47, 0xbf, 0xb1, 0xc0, 0x58, 0xbc,
- 0x9c, 0xdc, 0xbc, 0xbd, 0xc7, 0x9f, 0xc3, 0xbe, 0x10, 0x30, 0xb1, 0xbc,
- 0xb4, 0x25, 0x2f, 0x3d, 0x3b, 0xf8, 0xc0, 0xbd, 0x5c, 0x4b, 0x62, 0xbe,
- 0x7d, 0x0d, 0x0a, 0x3e, 0xbe, 0x3c, 0xb2, 0xbe, 0xfb, 0xb5, 0xda, 0x3d,
- 0xb4, 0x4d, 0x80, 0xbd, 0x9c, 0xb7, 0x3d, 0xbe, 0x35, 0x5c, 0x00, 0xbf,
- 0xa7, 0x46, 0x48, 0xbd, 0x6a, 0x60, 0xa0, 0x3e, 0x36, 0x72, 0x22, 0xbe,
- 0xf7, 0xfa, 0x4f, 0x3c, 0xe2, 0xf0, 0x82, 0xbd, 0xc8, 0x5c, 0x4f, 0xbe,
- 0xc1, 0xc2, 0x5c, 0xbe, 0xc4, 0xf9, 0xb9, 0x3d, 0xba, 0xc9, 0xf9, 0xbb,
- 0xfb, 0x46, 0x1f, 0x3e, 0x23, 0x7f, 0x8e, 0xbd, 0xce, 0xdc, 0xee, 0x3c,
- 0xd9, 0x1f, 0x28, 0x3d, 0x36, 0x91, 0xb7, 0x3e, 0x4e, 0x94, 0xf9, 0xbe,
- 0x6a, 0x80, 0xef, 0x3d, 0xc5, 0x2c, 0xad, 0xbd, 0xf4, 0x87, 0x8e, 0xbb,
- 0xcf, 0xe4, 0xa5, 0x3c, 0xbc, 0x22, 0x0c, 0xbd, 0xf3, 0x7f, 0x12, 0xbe,
- 0xd4, 0x90, 0x6b, 0x3d, 0xf3, 0x6e, 0x1f, 0xbf, 0x87, 0x60, 0x8c, 0x3e,
- 0x9b, 0x52, 0x3e, 0xbe, 0x90, 0xe0, 0xf7, 0xbe, 0x8c, 0x35, 0xb6, 0x3d,
- 0xc2, 0x1e, 0xa4, 0xbe, 0xe4, 0xb4, 0x7e, 0x3d, 0x86, 0xac, 0x08, 0x3d,
- 0x92, 0xd0, 0x73, 0x3e, 0xce, 0xec, 0xe3, 0x3e, 0x16, 0xf4, 0x0d, 0xbf,
- 0x97, 0x19, 0x23, 0xbe, 0xf2, 0x65, 0x81, 0xbd, 0x09, 0x54, 0x88, 0xbe,
- 0x6f, 0xcb, 0x97, 0xbe, 0x3b, 0xbf, 0xc9, 0x3d, 0xa3, 0x50, 0x99, 0xbe,
- 0x39, 0x65, 0x05, 0xbe, 0x0e, 0xa5, 0x85, 0x3e, 0xe1, 0xf1, 0xaf, 0x3d,
- 0xf6, 0x24, 0xc4, 0x3e, 0xb2, 0x76, 0xc8, 0x3d, 0x74, 0x5b, 0x0e, 0x3e,
- 0x0d, 0x88, 0xd8, 0x3d, 0x4f, 0xe8, 0xdd, 0x3e, 0xb7, 0xc0, 0xc0, 0xbe,
- 0x51, 0x2e, 0xcb, 0x3d, 0x61, 0xdc, 0xd5, 0xbe, 0x8c, 0xb9, 0xf0, 0xbb,
- 0x16, 0x1b, 0x25, 0xbe, 0x80, 0x2f, 0x9f, 0x3e, 0xd4, 0xc9, 0xec, 0xbd,
- 0xcd, 0x12, 0x17, 0xbf, 0x7e, 0xec, 0x10, 0xbd, 0xe6, 0x07, 0x7e, 0x3d,
- 0x5d, 0xe3, 0x74, 0x3e, 0x63, 0x01, 0x0d, 0xbe, 0x2d, 0x0f, 0x13, 0xbe,
- 0x19, 0xe8, 0xd7, 0x3e, 0x02, 0x04, 0x58, 0x3e, 0x1a, 0xc4, 0x88, 0xbe,
- 0x75, 0x92, 0x34, 0xbf, 0x11, 0x42, 0x98, 0xbd, 0x68, 0x5a, 0x25, 0x3e,
- 0x03, 0xe6, 0x11, 0xbd, 0x68, 0x82, 0xee, 0xbe, 0x3f, 0x11, 0x9e, 0x3c,
- 0x1f, 0x8d, 0x2c, 0xbf, 0x33, 0x9e, 0x8a, 0xbe, 0x01, 0xf4, 0x68, 0xbe,
- 0xd6, 0x9b, 0x5a, 0xbd, 0xf7, 0x9c, 0xc3, 0xbe, 0xa9, 0x73, 0x3d, 0xbe,
- 0x1c, 0xab, 0x91, 0xbe, 0x07, 0xa8, 0x61, 0x3e, 0x1d, 0xe2, 0x3e, 0x3e,
- 0x3d, 0x8e, 0x35, 0xbd, 0xb0, 0xf1, 0x5a, 0x3e, 0xab, 0x60, 0xd0, 0xbb,
- 0xcf, 0x1e, 0xc1, 0x3d, 0x6e, 0x24, 0xaf, 0x3d, 0x57, 0x21, 0x69, 0xbe,
- 0x93, 0x80, 0x37, 0x3d, 0xb4, 0xe6, 0xf7, 0x3d, 0x19, 0x11, 0x0a, 0xbf,
- 0x6e, 0x2d, 0x31, 0xbe, 0x97, 0xeb, 0xae, 0x3d, 0xc7, 0xa4, 0x46, 0xbe,
- 0x3a, 0x13, 0x57, 0x3e, 0xb3, 0x5d, 0x2c, 0x3d, 0xc6, 0x82, 0x22, 0x3e,
- 0x43, 0xc7, 0x94, 0x3e, 0x03, 0xc9, 0xfb, 0xbe, 0x2b, 0x47, 0x64, 0xbd,
- 0x48, 0x02, 0x1c, 0x3e, 0x10, 0x15, 0x00, 0xbe, 0x98, 0xb9, 0x72, 0xbe,
- 0x39, 0xf6, 0x0a, 0xbf, 0x4f, 0xc9, 0xea, 0xbe, 0xb4, 0x4c, 0x07, 0x3e,
- 0x10, 0x58, 0x8a, 0xbe, 0x6a, 0x16, 0x02, 0x3e, 0xdf, 0xb1, 0xa1, 0x3d,
- 0xe5, 0x24, 0x04, 0x3f, 0x18, 0xc5, 0xb1, 0x3e, 0xf2, 0x55, 0x03, 0xbf,
- 0x5f, 0x7f, 0xcd, 0xbe, 0xe7, 0xa4, 0xe0, 0xbe, 0x5a, 0x57, 0x66, 0xbc,
- 0x73, 0x2f, 0x5f, 0x3e, 0x1d, 0x6a, 0xbe, 0xba, 0x8b, 0xc0, 0xc4, 0xbe,
- 0xd5, 0x5f, 0xc3, 0x3e, 0xe5, 0x04, 0x79, 0xbe, 0xfd, 0x41, 0x15, 0xbb,
- 0x13, 0xba, 0x07, 0xbf, 0xad, 0x79, 0xa7, 0xbe, 0x58, 0xc4, 0x6a, 0x3e,
- 0xf3, 0x3c, 0x01, 0xbf, 0x2c, 0x8e, 0xef, 0xbd, 0x42, 0x71, 0x49, 0xbc,
- 0x17, 0x30, 0xa6, 0xbe, 0x0a, 0xdc, 0xd1, 0xbe, 0x75, 0x9a, 0x18, 0x3d,
- 0x26, 0x15, 0xf4, 0x3d, 0xe5, 0x57, 0x21, 0x3d, 0x49, 0xaf, 0x37, 0xbb,
- 0xe3, 0x3e, 0x97, 0xbe, 0xc7, 0x5c, 0x33, 0xbf, 0x2a, 0x05, 0x15, 0xbe,
- 0x04, 0x55, 0xf1, 0xbc, 0xf1, 0x99, 0xa5, 0xbe, 0x4b, 0xa5, 0x81, 0xbe,
- 0x65, 0x91, 0xe5, 0x3d, 0xfb, 0x52, 0xa3, 0xbe, 0x6e, 0xf5, 0x6c, 0x3e,
- 0x29, 0x33, 0x37, 0xbd, 0x3a, 0x27, 0xe0, 0xbd, 0x95, 0x9c, 0x06, 0xbe,
- 0x52, 0x7b, 0x12, 0xbe, 0xc9, 0xb2, 0x44, 0xbe, 0x43, 0x4e, 0xd8, 0x3e,
- 0xee, 0x86, 0x97, 0xbd, 0xe3, 0xc3, 0x86, 0xbe, 0x1b, 0x45, 0xaa, 0xbd,
- 0xd8, 0x79, 0xc8, 0xbe, 0x26, 0xce, 0x7d, 0x3e, 0xa7, 0x22, 0x59, 0x3e,
- 0xe5, 0xc3, 0x2d, 0xbe, 0x8b, 0x18, 0x16, 0x3e, 0x6f, 0x62, 0x1b, 0xbe,
- 0x31, 0x1d, 0x71, 0xbd, 0x38, 0xb5, 0x18, 0x3e, 0x0f, 0xfb, 0xb7, 0x3d,
- 0xe8, 0xb1, 0x82, 0x3e, 0x9c, 0xe2, 0x42, 0x3e, 0x22, 0x33, 0xc8, 0xbd,
- 0xe1, 0xd1, 0xb2, 0x3d, 0x29, 0x2f, 0xbc, 0xbe, 0xf9, 0x5f, 0x84, 0xbc,
- 0xe2, 0xcd, 0x3a, 0xbc, 0x00, 0x2a, 0x70, 0x3c, 0x15, 0xee, 0xa9, 0xbe,
- 0xef, 0xb2, 0xb4, 0xbd, 0xc1, 0xc3, 0x24, 0xbd, 0x06, 0xd2, 0xba, 0xbe,
- 0xc7, 0xa1, 0x9a, 0xbe, 0x29, 0x52, 0x4d, 0xbf, 0xce, 0xec, 0x07, 0x3d,
- 0xa3, 0x8e, 0x3a, 0xbe, 0x56, 0xe6, 0x90, 0x3e, 0x2a, 0x58, 0x3c, 0x3d,
- 0x07, 0x10, 0x76, 0x3d, 0xf9, 0xa2, 0x92, 0xbd, 0x67, 0x36, 0x91, 0xbb,
- 0x4b, 0xf8, 0x89, 0x3d, 0x8b, 0x43, 0xe8, 0xbd, 0x96, 0x27, 0x09, 0xbf,
- 0xd1, 0xe3, 0xc9, 0xbe, 0x81, 0xc3, 0xbb, 0xbd, 0x5b, 0x0e, 0xac, 0xbe,
- 0x4b, 0xeb, 0x8f, 0xbf, 0xaf, 0xd1, 0x46, 0xbe, 0x47, 0x5d, 0x22, 0xbe,
- 0xed, 0xa2, 0x70, 0xbc, 0x25, 0x93, 0xc0, 0x3e, 0x83, 0x78, 0x09, 0x3e,
- 0x2f, 0x1b, 0x47, 0x3e, 0x64, 0xbf, 0xa6, 0x3e, 0x45, 0x2a, 0xfd, 0x3d,
- 0x6f, 0x06, 0x9c, 0xbd, 0x89, 0x27, 0x0f, 0xbe, 0xb0, 0xfe, 0xfe, 0xbe,
- 0xec, 0x14, 0x00, 0xbf, 0xd0, 0xf2, 0x76, 0x3e, 0x23, 0x16, 0x2f, 0xbe,
- 0x75, 0x9c, 0x12, 0x3f, 0x59, 0x4e, 0xdb, 0xbe, 0x6e, 0x6e, 0x16, 0x3d,
- 0xc5, 0x7c, 0x4d, 0xbd, 0xaa, 0xe7, 0x5d, 0x3e, 0x87, 0xb6, 0x99, 0xbd,
- 0xfe, 0x8d, 0xb0, 0x3d, 0xab, 0xc1, 0x18, 0xbd, 0xe6, 0x04, 0xdf, 0xbd,
- 0xb7, 0x3b, 0xb7, 0x3d, 0xe6, 0x41, 0x1c, 0x3f, 0x3a, 0xb7, 0x6f, 0xbe,
- 0xb2, 0x5d, 0xc2, 0xbc, 0x53, 0xed, 0x28, 0x3e, 0x32, 0x29, 0x43, 0xbe,
- 0x30, 0xaa, 0x63, 0xbe, 0x02, 0xee, 0x98, 0x3d, 0x8a, 0xf3, 0x20, 0xbe,
- 0xf5, 0xe7, 0x86, 0x3d, 0x81, 0x84, 0x21, 0xbf, 0xbe, 0x71, 0xb4, 0x3d,
- 0xda, 0x69, 0x7f, 0xbe, 0x38, 0xed, 0xec, 0x3d, 0x56, 0x73, 0x39, 0xbe,
- 0x6a, 0xea, 0xad, 0xbe, 0x58, 0xab, 0x1e, 0xbe, 0x38, 0xbc, 0x08, 0xbe,
- 0x71, 0x37, 0xaa, 0x3e, 0x91, 0x6a, 0x8e, 0xbe, 0x2c, 0x26, 0xef, 0xbe,
- 0xc3, 0x1f, 0x6c, 0xbe, 0x3c, 0x20, 0x52, 0xbf, 0xb4, 0xbc, 0xec, 0xbe,
- 0x81, 0x2e, 0x5b, 0xbd, 0x91, 0xdd, 0x03, 0xbe, 0x61, 0x7d, 0x5e, 0xbb,
- 0x79, 0xfe, 0xbc, 0x3e, 0xd4, 0x2a, 0xc2, 0xbe, 0xb6, 0xd6, 0x55, 0xbe,
- 0xb4, 0x99, 0xbd, 0x3d, 0xa4, 0xcd, 0xd4, 0x3e, 0x83, 0x04, 0xb1, 0x3e,
- 0x4a, 0x73, 0x8e, 0xbc, 0x4b, 0xc1, 0xec, 0x3d, 0xa7, 0x83, 0xf3, 0x3c,
- 0xaf, 0x23, 0xd5, 0x3e, 0xf6, 0x6d, 0x3d, 0x3e, 0x75, 0xc9, 0x82, 0x3e,
- 0x6f, 0x04, 0x14, 0x3f, 0x65, 0x87, 0x25, 0x3d, 0x58, 0x14, 0xc5, 0xbe,
- 0x47, 0x01, 0x00, 0xbe, 0x40, 0x1e, 0xed, 0x3d, 0xdd, 0x9b, 0xf3, 0xbe,
- 0x83, 0xa7, 0x54, 0xbe, 0xe1, 0x6d, 0x43, 0x3e, 0x8f, 0xab, 0x59, 0x3e,
- 0x64, 0xe1, 0x9a, 0x3e, 0x21, 0xd5, 0xcc, 0xbd, 0x76, 0x53, 0xbb, 0xbb,
- 0x7c, 0x31, 0x9f, 0x3e, 0xc6, 0x36, 0x9c, 0xbe, 0x0f, 0x4b, 0x3f, 0xbf,
- 0xf2, 0x6c, 0x87, 0xbe, 0x4a, 0x52, 0xc6, 0x3e, 0xcd, 0xd5, 0x86, 0xbe,
- 0x76, 0xd1, 0x9b, 0xbe, 0x9e, 0xa6, 0x13, 0xbe, 0x1e, 0x2f, 0x64, 0x3d,
- 0xd4, 0x07, 0x54, 0x3d, 0xf0, 0x40, 0x14, 0xbe, 0x9d, 0xb5, 0x7f, 0xbd,
- 0xdb, 0x00, 0xda, 0xbe, 0x4e, 0x71, 0xba, 0xbe, 0x73, 0x60, 0x70, 0xbe,
- 0x80, 0x41, 0xae, 0xbe, 0xb8, 0x25, 0x93, 0xbe, 0xeb, 0x85, 0xa7, 0x3d,
- 0xef, 0xac, 0x24, 0xbd, 0x6f, 0x76, 0xa9, 0x3d, 0xdf, 0x3c, 0x72, 0x3e,
- 0xdb, 0xc0, 0xf0, 0xbb, 0x34, 0x8b, 0xad, 0xbe, 0xdd, 0x12, 0xfe, 0xbd,
- 0xf0, 0xa5, 0xe4, 0xbc, 0x65, 0x10, 0x17, 0xbb, 0x6b, 0xeb, 0x45, 0x3e,
- 0xe3, 0xbe, 0x08, 0x3e, 0xb6, 0xa6, 0xc1, 0x3e, 0x58, 0x34, 0x0e, 0x3f,
- 0x20, 0xa8, 0xbc, 0x3d, 0xe1, 0xdb, 0xf0, 0xbd, 0xe1, 0x8d, 0x16, 0xbf,
- 0x3d, 0xa5, 0x2c, 0xbc, 0xf3, 0x18, 0xe6, 0x3d, 0x65, 0xb6, 0x9f, 0x3c,
- 0x36, 0x84, 0xc4, 0xbe, 0x2e, 0x58, 0x2b, 0xbd, 0x53, 0xd9, 0x36, 0xbd,
- 0x4e, 0x04, 0x62, 0xbe, 0xf7, 0xac, 0x36, 0x3e, 0x62, 0x85, 0x4e, 0x3c,
- 0x97, 0xba, 0x6b, 0xbd, 0x57, 0x08, 0x94, 0xbd, 0xd7, 0xfd, 0x09, 0xbe,
- 0x38, 0x33, 0x9f, 0x3e, 0xfa, 0x1a, 0x1b, 0x3e, 0x3c, 0x66, 0xf7, 0xbe,
- 0xa4, 0x9d, 0x89, 0xbe, 0x99, 0xe0, 0x0e, 0x3e, 0x52, 0x30, 0x2f, 0x3e,
- 0x89, 0xb3, 0xa2, 0x3e, 0x02, 0xe8, 0xa6, 0xbe, 0x8d, 0xe4, 0xb8, 0xbe,
- 0x4a, 0xab, 0xc1, 0xbe, 0xda, 0x48, 0x05, 0xbe, 0x0d, 0xf0, 0xa3, 0xbd,
- 0x3f, 0x24, 0xac, 0x3d, 0xd5, 0xbe, 0x24, 0xbf, 0x40, 0x55, 0xdd, 0x3e,
- 0xf4, 0x50, 0x87, 0xbd, 0x8b, 0xd0, 0x9d, 0xbe, 0xff, 0x65, 0x6e, 0xbd,
- 0x5a, 0x1e, 0x8a, 0xbe, 0xf8, 0x18, 0x69, 0xbd, 0x55, 0xd3, 0xe3, 0xbe,
- 0x51, 0x5c, 0x03, 0x3e, 0x53, 0x80, 0xcb, 0xbd, 0xd7, 0x1c, 0x1e, 0x3d,
- 0xea, 0xd8, 0xed, 0x3d, 0xbc, 0x4d, 0x46, 0x3e, 0x05, 0x19, 0x47, 0x3e,
- 0xe1, 0xf1, 0xaa, 0xbd, 0x87, 0x88, 0x00, 0x3d, 0xc4, 0x2b, 0x57, 0xbc,
- 0xc3, 0x39, 0xa0, 0x3e, 0x54, 0x63, 0x4a, 0xbb, 0xcb, 0x48, 0x81, 0xbe,
- 0x36, 0xe2, 0x91, 0xbd, 0x97, 0xbc, 0x12, 0x3d, 0xc5, 0x64, 0x28, 0xbe,
- 0xe9, 0x65, 0x23, 0x3e, 0xd0, 0xcb, 0xde, 0x3d, 0xe7, 0x75, 0x43, 0xbf,
- 0x19, 0xca, 0xae, 0xbe, 0x8b, 0x94, 0xcf, 0x3c, 0xcf, 0x4b, 0x1a, 0xbe,
- 0x52, 0x2d, 0x14, 0xbf, 0x75, 0x7e, 0x10, 0xbf, 0x54, 0xee, 0xd0, 0x3d,
- 0xe8, 0xdd, 0x32, 0x3e, 0x7d, 0x3f, 0x21, 0xbe, 0x1d, 0x2b, 0x3e, 0xbe,
- 0xb1, 0x9d, 0x80, 0xbd, 0xc2, 0x04, 0x83, 0xbe, 0x2e, 0x1e, 0x09, 0x3d,
- 0xfb, 0xee, 0x89, 0xbd, 0xb9, 0xff, 0x84, 0xbd, 0xe6, 0xe6, 0xac, 0xbc,
- 0xf5, 0xf0, 0x1e, 0xbe, 0x01, 0x99, 0xb4, 0x3d, 0x7a, 0xe6, 0x8c, 0xbe,
- 0x86, 0x23, 0xaa, 0xbe, 0x78, 0x9d, 0x0d, 0xbe, 0x6c, 0x23, 0xb0, 0x3e,
- 0x5a, 0x8a, 0xa2, 0xbe, 0xdd, 0x2e, 0xb2, 0xbd, 0x80, 0xd7, 0xa4, 0xbc,
- 0x1d, 0x20, 0x05, 0x3c, 0x9f, 0x74, 0xf2, 0x3d, 0xfb, 0xc8, 0x95, 0xbe,
- 0x14, 0x59, 0x0b, 0xbe, 0xbc, 0xe3, 0x93, 0x3e, 0x95, 0x0d, 0xec, 0xbd,
- 0x9e, 0x6f, 0x31, 0xbf, 0xe5, 0xf2, 0x15, 0x3d, 0x66, 0xa6, 0xba, 0xbd,
- 0x1c, 0xc6, 0xbd, 0xbe, 0x50, 0xfc, 0x39, 0x3e, 0xfd, 0xfd, 0x6a, 0x3e,
- 0x34, 0xeb, 0xa4, 0x3c, 0xad, 0xef, 0x82, 0x3e, 0xf4, 0xb9, 0x44, 0x3e,
- 0xd3, 0xd8, 0x46, 0xbc, 0x5b, 0xa0, 0xfd, 0xbe, 0xec, 0x37, 0x71, 0x3e,
- 0xb7, 0x16, 0xb7, 0x3d, 0x88, 0x1c, 0x1c, 0xbd, 0x5a, 0x40, 0x36, 0x3d,
- 0x28, 0x41, 0x87, 0x3d, 0x0f, 0x2f, 0xb5, 0xbe, 0xab, 0x9b, 0xaa, 0xbe,
- 0x9f, 0x76, 0x7e, 0xbe, 0x3a, 0xba, 0x5d, 0xbd, 0x5b, 0x6b, 0x51, 0x3e,
- 0x33, 0x3e, 0x38, 0xbf, 0x4d, 0x3e, 0x5e, 0xbe, 0x13, 0xee, 0x62, 0x3d,
- 0x80, 0x0c, 0xa2, 0x3e, 0xe3, 0x3b, 0xe6, 0xbc, 0xc9, 0x06, 0xba, 0xbe,
- 0x3a, 0x97, 0x9e, 0xbd, 0x9a, 0x7d, 0x8e, 0x3e, 0x99, 0x03, 0x84, 0xbe,
- 0xde, 0xd8, 0xdc, 0xbd, 0x48, 0x11, 0x8b, 0xbe, 0x2d, 0x82, 0xf3, 0xbe,
- 0x0c, 0x8f, 0x03, 0xbf, 0xc5, 0x6e, 0x8f, 0xbe, 0x37, 0xa6, 0x84, 0xbe,
- 0x7a, 0xf2, 0xe2, 0x3c, 0x2c, 0x74, 0x8a, 0xbe, 0xe2, 0x0b, 0xc6, 0xbb,
- 0x08, 0x58, 0x15, 0xbe, 0xb0, 0x1c, 0x49, 0xbe, 0x06, 0x21, 0xcd, 0xbe,
- 0x83, 0x15, 0xa2, 0xbe, 0x8a, 0x38, 0x05, 0xbf, 0x23, 0x16, 0x76, 0x3e,
- 0x68, 0xad, 0x68, 0x3e, 0xad, 0xc5, 0x79, 0xbc, 0x2d, 0x6a, 0x39, 0xbe,
- 0xe9, 0x30, 0xa0, 0xbe, 0x3b, 0x36, 0xce, 0x3e, 0xb5, 0xc3, 0x18, 0x3e,
- 0xc8, 0x30, 0x14, 0x3e, 0x18, 0x14, 0x21, 0xbd, 0xd6, 0xdf, 0x7f, 0xbe,
- 0xb1, 0x54, 0xa9, 0xbe, 0x9a, 0x49, 0x24, 0xbe, 0x0f, 0xa4, 0xe1, 0x3d,
- 0x1f, 0x49, 0x11, 0x3e, 0xa7, 0x9d, 0x8f, 0xbe, 0xea, 0xf0, 0x99, 0xbe,
- 0xd2, 0x95, 0x9f, 0x3e, 0xb7, 0xb2, 0x0f, 0xbe, 0xde, 0xc7, 0xa7, 0x3e,
- 0xa7, 0x74, 0xaa, 0xbe, 0x6b, 0x5a, 0xfa, 0xbe, 0xb7, 0xbe, 0xec, 0xbe,
- 0x35, 0xa5, 0x34, 0x3d, 0xee, 0x10, 0x17, 0x3e, 0x01, 0x2e, 0xe6, 0xbd,
- 0x49, 0x08, 0x29, 0x3e, 0x9e, 0xfe, 0xaa, 0xbe, 0xc3, 0xa8, 0x29, 0xbe,
- 0xae, 0x7a, 0x2d, 0xbe, 0x94, 0x0c, 0xd3, 0x3b, 0x92, 0x1b, 0x27, 0xbd,
- 0x12, 0xd1, 0x95, 0xbd, 0xb5, 0x75, 0xaf, 0xbd, 0x97, 0xd4, 0x69, 0x3e,
- 0xc8, 0xde, 0x8b, 0xbd, 0x22, 0x8e, 0xa4, 0x3d, 0x61, 0xce, 0x3c, 0xbe,
- 0x76, 0x1a, 0x5f, 0x3e, 0xa7, 0xb1, 0xa9, 0x3e, 0xb3, 0x6f, 0x2f, 0xbe,
- 0x14, 0x30, 0xb1, 0xbe, 0x3e, 0x2c, 0xa7, 0xbe, 0xc5, 0x64, 0xbb, 0xbe,
- 0x3c, 0x85, 0xa4, 0xbe, 0x72, 0x90, 0xdf, 0xbb, 0x0e, 0x24, 0x3b, 0xbe,
- 0x6e, 0x58, 0xba, 0xbe, 0x7a, 0x18, 0x3e, 0xbe, 0x31, 0x03, 0x09, 0xbe,
- 0x82, 0x25, 0xc7, 0x3c, 0x7c, 0xe2, 0x13, 0x3c, 0xb9, 0xd1, 0x94, 0x3e,
- 0x97, 0x26, 0x9f, 0xbe, 0x13, 0x14, 0xf0, 0xbd, 0x37, 0x4e, 0x93, 0x3c,
- 0xc1, 0x52, 0xe0, 0x3d, 0xe4, 0xac, 0x1d, 0xbd, 0x7a, 0xcd, 0x30, 0xbe,
- 0xcb, 0xd9, 0x18, 0x3e, 0xf2, 0xf2, 0x61, 0x3d, 0x3a, 0xa4, 0x19, 0xbd,
- 0xc7, 0x98, 0xe9, 0xbd, 0xb0, 0x09, 0x02, 0x3e, 0x7b, 0xa8, 0x3f, 0xbf,
- 0x2c, 0x64, 0xff, 0xbe, 0x30, 0x2a, 0x68, 0x3e, 0xc8, 0x60, 0x04, 0xbe,
- 0x1a, 0xe1, 0x5d, 0x3d, 0xc4, 0xad, 0xcc, 0x3d, 0x60, 0xdf, 0xa8, 0x3d,
- 0x91, 0xc8, 0xcb, 0xbe, 0xfa, 0x74, 0x37, 0xbb, 0xc6, 0x90, 0xd4, 0x3e,
- 0xb4, 0xa5, 0x02, 0xbe, 0x81, 0x8a, 0x41, 0xbe, 0xd4, 0x79, 0x9e, 0xbe,
- 0xd5, 0xb2, 0x7e, 0x3c, 0xc3, 0x4e, 0xf4, 0xbe, 0xac, 0x77, 0x7a, 0x3d,
- 0xbe, 0x14, 0xea, 0xbc, 0x32, 0x0c, 0x4a, 0x3e, 0x5e, 0x56, 0xee, 0xbd,
- 0x4c, 0xbc, 0x02, 0xbe, 0xf4, 0x8a, 0x21, 0x3e, 0x85, 0x7c, 0x17, 0xbe,
- 0xb9, 0x31, 0x50, 0x3e, 0x05, 0xce, 0xda, 0xbe, 0xcd, 0xc1, 0x36, 0x3d,
- 0x05, 0xbc, 0xfa, 0x3d, 0xa3, 0x19, 0x48, 0xbe, 0x71, 0xab, 0x8a, 0xbe,
- 0x41, 0x4d, 0xd7, 0x3b, 0x6f, 0x0f, 0xdd, 0xbe, 0xcf, 0xd3, 0x0f, 0xbd,
- 0xa8, 0xee, 0x10, 0x3e, 0x4d, 0x88, 0xac, 0x3d, 0x0d, 0x89, 0x24, 0x3e,
- 0x8e, 0x34, 0x56, 0xbe, 0x62, 0xf1, 0x3d, 0xbc, 0x20, 0xf7, 0x36, 0x3e,
- 0x97, 0xf0, 0x01, 0x3e, 0x54, 0x2b, 0x96, 0x3d, 0xc9, 0xf5, 0xae, 0x3d,
- 0x44, 0x6f, 0x9d, 0xbe, 0xaf, 0x6e, 0x6c, 0xbe, 0x9c, 0x37, 0x84, 0xbe,
- 0x59, 0xbb, 0xda, 0xbe, 0xef, 0x97, 0xdc, 0x3e, 0xf3, 0xba, 0x00, 0xbf,
- 0xd6, 0xb5, 0x57, 0x3e, 0xbc, 0x6c, 0xf8, 0xbd, 0x52, 0x4e, 0x35, 0x3d,
- 0x02, 0x22, 0x56, 0xbe, 0xff, 0x47, 0x7a, 0x3d, 0x0b, 0x81, 0xe3, 0xbe,
- 0xb9, 0x86, 0x28, 0xbf, 0x2e, 0x67, 0x60, 0xbe, 0x04, 0xf3, 0x05, 0xbe,
- 0x77, 0xec, 0x51, 0xbd, 0x36, 0x1d, 0xa0, 0xbe, 0x76, 0x10, 0x45, 0xbe,
- 0x13, 0x9c, 0x4e, 0xbe, 0x6b, 0xfc, 0x28, 0xbf, 0x56, 0x4a, 0x05, 0xbf,
- 0xd6, 0xa3, 0xb6, 0x3d, 0xc6, 0x1f, 0x90, 0x3c, 0x41, 0xe2, 0xa0, 0x3d,
- 0x3b, 0xb5, 0x5d, 0xbd, 0xcf, 0xb7, 0x1e, 0xbd, 0x97, 0x78, 0x93, 0x3e,
- 0x3d, 0x7c, 0x6d, 0x3e, 0x77, 0xe7, 0x12, 0xbf, 0x3e, 0x14, 0x1d, 0xbe,
- 0xe9, 0xce, 0x4c, 0xbc, 0x5d, 0xa4, 0xe8, 0xbe, 0x64, 0x0a, 0x6e, 0x3e,
- 0x6d, 0x30, 0x52, 0xbe, 0x1e, 0x92, 0x29, 0xbe, 0x50, 0x7f, 0x8d, 0xbd,
- 0x74, 0x30, 0x86, 0xbe, 0x3d, 0x6c, 0x39, 0x3e, 0x69, 0x35, 0x2e, 0x3e,
- 0x65, 0xe0, 0x04, 0xbc, 0x36, 0x72, 0x0e, 0xbd, 0x96, 0x69, 0x3d, 0x3e,
- 0x94, 0x3b, 0xd3, 0x3d, 0x42, 0x55, 0x67, 0x3d, 0xe1, 0xec, 0x7d, 0xbe,
- 0xeb, 0x06, 0xb3, 0xbd, 0xb3, 0xd4, 0x78, 0x3e, 0x62, 0x3f, 0x93, 0xbe,
- 0x6f, 0x1c, 0x93, 0x3e, 0xcd, 0x0f, 0xf9, 0x3d, 0x4a, 0xeb, 0xc7, 0xbb,
- 0x41, 0x20, 0xef, 0x3c, 0xbc, 0x2f, 0xfd, 0x3e, 0xac, 0x51, 0x09, 0x3e,
- 0x3b, 0xac, 0x1e, 0x3e, 0x9d, 0xe0, 0xbc, 0x3d, 0x07, 0x9d, 0x8b, 0x3e,
- 0x0f, 0x3d, 0x86, 0x3e, 0x3f, 0xcc, 0x25, 0x3e, 0xa2, 0xc6, 0x9f, 0xbe,
- 0xcd, 0x37, 0x11, 0xbf, 0xb3, 0xd7, 0x96, 0xbe, 0x8c, 0xf2, 0x19, 0x3e,
- 0x21, 0xb6, 0xc5, 0xbe, 0x40, 0xdd, 0x50, 0xbe, 0xd9, 0xf5, 0x71, 0xbe,
- 0xe5, 0xee, 0x98, 0x3e, 0x9d, 0xb8, 0xe1, 0x3c, 0x42, 0xda, 0x81, 0xbd,
- 0x7e, 0xb1, 0x7a, 0x3d, 0xc8, 0x5e, 0xbf, 0xbe, 0x8e, 0xb1, 0xcc, 0xbc,
- 0x7d, 0x6a, 0xb8, 0x3e, 0x6b, 0xb6, 0xa2, 0x3e, 0x93, 0x94, 0x5a, 0x3e,
- 0xfe, 0xd6, 0x2e, 0xbe, 0xe3, 0x9f, 0x00, 0x3e, 0x88, 0x6d, 0x2f, 0xbf,
- 0x98, 0xed, 0xcf, 0xbe, 0xc7, 0x48, 0x08, 0xbe, 0x2f, 0x6b, 0x0a, 0xbf,
- 0xc6, 0xd6, 0x73, 0x3e, 0x4f, 0xd5, 0x00, 0xbe, 0x5a, 0x7e, 0x92, 0x3d,
- 0x50, 0x34, 0xaa, 0xbe, 0x30, 0x79, 0x95, 0xbe, 0xb0, 0x08, 0xf3, 0xbe,
- 0x7d, 0x5f, 0xa9, 0x3e, 0x4c, 0x9a, 0x69, 0x3e, 0x9f, 0x1f, 0x94, 0x3e,
- 0x3b, 0x15, 0x39, 0x3e, 0x2c, 0x64, 0x30, 0xbe, 0x09, 0x36, 0xe5, 0x3d,
- 0xe6, 0xba, 0x3e, 0x3d, 0xe3, 0xab, 0x25, 0xbe, 0x27, 0xb9, 0x5b, 0x3e,
- 0x37, 0xe5, 0xbd, 0x3d, 0x7b, 0x8a, 0x2c, 0xbe, 0x83, 0x03, 0x81, 0x3d,
- 0xcc, 0x0c, 0x79, 0xbe, 0x2d, 0x0a, 0x0c, 0x3f, 0xa0, 0xa2, 0x12, 0x3c,
- 0xb0, 0xfc, 0x26, 0x3e, 0x38, 0x72, 0xf8, 0xbe, 0x72, 0xf2, 0x10, 0xbe,
- 0xdc, 0x63, 0x01, 0xbf, 0x04, 0x0e, 0x3f, 0xbf, 0x77, 0xd8, 0xe9, 0xbe,
- 0x4a, 0xd0, 0x81, 0x3d, 0x4e, 0x1c, 0x53, 0x3e, 0xe6, 0xcc, 0x98, 0x3e,
- 0x93, 0x2b, 0xa5, 0x3d, 0xc0, 0x5f, 0xf0, 0x3e, 0xe3, 0x01, 0xc2, 0x3d,
- 0x5a, 0x7d, 0xc1, 0xbe, 0x99, 0x71, 0xca, 0x3e, 0x1f, 0x2c, 0x0a, 0xbd,
- 0x1c, 0x50, 0xb2, 0xbe, 0xe0, 0x70, 0x3e, 0x3e, 0x3f, 0x94, 0x1a, 0xbf,
- 0xec, 0x61, 0xd4, 0x3d, 0xdf, 0x8a, 0x89, 0x3d, 0xe6, 0x91, 0xff, 0xbd,
- 0x53, 0xfc, 0x09, 0xbe, 0x0b, 0x24, 0x12, 0x3e, 0x1a, 0x6c, 0x26, 0x3d,
- 0xf8, 0x8c, 0x7c, 0xbe, 0xf2, 0x14, 0xb6, 0x3d, 0x26, 0xa9, 0x7e, 0x3e,
- 0x7b, 0x33, 0x30, 0xbe, 0x1d, 0x58, 0x03, 0x3e, 0xad, 0x7e, 0xb2, 0x3e,
- 0x74, 0x3d, 0x80, 0xbd, 0x3f, 0xe1, 0x25, 0xbe, 0x14, 0xf4, 0x3e, 0xbf,
- 0x97, 0x20, 0x17, 0xbf, 0xdf, 0x9d, 0x87, 0xbc, 0xe4, 0x0a, 0x90, 0x3e,
- 0x1e, 0xb0, 0xba, 0xbc, 0xf6, 0x33, 0xcf, 0xbe, 0x4c, 0xd0, 0x34, 0x3d,
- 0xf8, 0x2c, 0x99, 0x3e, 0x43, 0x7c, 0xc2, 0xbd, 0x8e, 0xf0, 0x93, 0xbe,
- 0x51, 0xa4, 0xa3, 0xbe, 0x02, 0x70, 0x65, 0xbe, 0xe5, 0x81, 0xde, 0xbe,
- 0xff, 0xa1, 0x99, 0xbf, 0x23, 0xf5, 0x45, 0x3e, 0x6c, 0x5b, 0xb9, 0xbe,
- 0x1b, 0x79, 0x85, 0x3e, 0x63, 0x4a, 0x19, 0xbe, 0xe7, 0xeb, 0x0b, 0xbe,
- 0x9e, 0xcf, 0x1e, 0xbe, 0x4c, 0x39, 0x68, 0xbe, 0x40, 0xa2, 0xe6, 0xbe,
- 0xdc, 0x58, 0x22, 0xbe, 0x06, 0x3d, 0xb2, 0xbd, 0xf8, 0xc0, 0xcd, 0xbd,
- 0x66, 0x57, 0x53, 0x3e, 0x14, 0x1e, 0x0b, 0xbe, 0x05, 0x71, 0xf3, 0x3e,
- 0x29, 0xf0, 0x96, 0x3e, 0xfb, 0x60, 0xd9, 0x3b, 0xff, 0xc6, 0x86, 0xbe,
- 0x92, 0xc1, 0x19, 0x3c, 0xff, 0xba, 0x3e, 0x3e, 0x95, 0x5f, 0x2a, 0xbe,
- 0x09, 0xf8, 0x0f, 0x3e, 0x6b, 0x47, 0xc7, 0x3e, 0xab, 0x05, 0xcc, 0x3d,
- 0xa7, 0x4e, 0x14, 0xbe, 0x83, 0x6e, 0xe7, 0x3c, 0xb6, 0x0e, 0x9b, 0x3a,
- 0x7c, 0xb5, 0x08, 0x3f, 0x23, 0x26, 0x31, 0x3e, 0xa8, 0xa1, 0x30, 0x3e,
- 0x4a, 0x93, 0x9b, 0x3e, 0x8b, 0xb4, 0x01, 0xbe, 0x04, 0x06, 0x27, 0xbe,
- 0x02, 0xec, 0x4e, 0xbf, 0xce, 0xd3, 0x4f, 0x3e, 0x5d, 0xac, 0x3b, 0xbe,
- 0x17, 0xe2, 0x25, 0x3d, 0x5b, 0x1f, 0x9d, 0xbe, 0x61, 0x27, 0x41, 0x3e,
- 0x05, 0x96, 0x39, 0x3e, 0x3b, 0x9f, 0x20, 0x3d, 0x5a, 0xb9, 0x2e, 0xbe,
- 0x32, 0xc3, 0xea, 0xbe, 0x4c, 0xfc, 0x0e, 0xbb, 0xa3, 0xe9, 0xbb, 0x3e,
- 0xe2, 0xf5, 0xa3, 0xbd, 0x47, 0xbb, 0xe9, 0x3d, 0x38, 0x14, 0x03, 0x3e,
- 0xe6, 0x65, 0x1c, 0xbf, 0xb6, 0x03, 0x35, 0xbe, 0x12, 0xa5, 0x54, 0x3e,
- 0x6f, 0x32, 0x58, 0x3e, 0x4a, 0xbd, 0x12, 0x3b, 0x18, 0xb7, 0x5b, 0x3e,
- 0xb8, 0x33, 0x4e, 0xbe, 0xd2, 0x66, 0x0f, 0xbe, 0x39, 0x58, 0x6d, 0x3e,
- 0x02, 0x79, 0x58, 0x3b, 0x22, 0x5b, 0x69, 0xbe, 0x37, 0x5b, 0x2f, 0xbf,
- 0xda, 0xc7, 0x87, 0x3e, 0xd1, 0x4a, 0x98, 0x3e, 0x31, 0xfc, 0xf5, 0xbe,
- 0x0d, 0x26, 0x5b, 0xbe, 0xf9, 0x72, 0x0f, 0x3e, 0xdd, 0xcd, 0xdb, 0xbd,
- 0xa2, 0xef, 0x49, 0xbe, 0xea, 0xd9, 0x3b, 0xbe, 0x50, 0xb3, 0xfb, 0xbd,
- 0x63, 0xa9, 0xea, 0xbe, 0x83, 0xcb, 0x2a, 0xbf, 0x2b, 0xf8, 0x9d, 0xba,
- 0x8c, 0xd5, 0x07, 0x3e, 0x84, 0x35, 0x23, 0x3e, 0xcb, 0x10, 0x41, 0x3e,
- 0x4b, 0xbc, 0x63, 0x3e, 0x2d, 0x28, 0x96, 0x3e, 0xfe, 0x65, 0xae, 0xbe,
- 0x57, 0x7e, 0xa7, 0xbe, 0xe7, 0x54, 0x58, 0xbe, 0x0d, 0xa8, 0x9d, 0xbe,
- 0x00, 0x33, 0xa3, 0xbc, 0x3f, 0xbd, 0x97, 0xbc, 0xee, 0xd7, 0xd2, 0x3e,
- 0x31, 0x64, 0x1e, 0xbe, 0xff, 0x16, 0x06, 0xbd, 0xe1, 0x93, 0x56, 0x3d,
- 0x82, 0xf3, 0xa8, 0xbe, 0x7b, 0x75, 0x02, 0xbe, 0x36, 0x3c, 0xdd, 0x3e,
- 0x05, 0x0f, 0xca, 0xbd, 0x2b, 0xcb, 0x38, 0x3e, 0x04, 0x95, 0xce, 0x3e,
- 0x3c, 0xde, 0xc0, 0x3d, 0x0c, 0x60, 0x89, 0xbe, 0xf2, 0x7a, 0xa6, 0x3b,
- 0xa3, 0x5f, 0x51, 0xbf, 0x9e, 0x43, 0x91, 0x3e, 0x95, 0x84, 0x5a, 0x3c,
- 0x83, 0x1d, 0x1f, 0xbf, 0xdb, 0xec, 0x1d, 0x3e, 0x69, 0x4a, 0x55, 0xbd,
- 0x8a, 0x28, 0xc1, 0x3d, 0x8f, 0x70, 0xe9, 0xbe, 0xb8, 0x80, 0x5c, 0xbd,
- 0x73, 0x8e, 0xbd, 0xbe, 0x7c, 0x4a, 0xac, 0x3e, 0x7c, 0xc1, 0x89, 0xbe,
- 0x73, 0x11, 0xcc, 0xbc, 0x2b, 0xd2, 0x57, 0xbe, 0x77, 0xe9, 0x84, 0x3e,
- 0xd3, 0xd8, 0x8b, 0xbe, 0x69, 0xd4, 0x17, 0xbe, 0xaf, 0xf3, 0x81, 0x3e,
- 0xfc, 0x6d, 0x94, 0x3d, 0xbf, 0xc6, 0xaa, 0xbe, 0x03, 0x1a, 0x23, 0xbd,
- 0x19, 0x87, 0xf0, 0x3d, 0x7e, 0x07, 0xff, 0x3c, 0x9d, 0x0e, 0x7e, 0x3e,
- 0xeb, 0x31, 0xb7, 0x3e, 0xcb, 0x23, 0xbc, 0xbd, 0xb7, 0xd5, 0x25, 0xbd,
- 0x2f, 0x4f, 0x05, 0xbf, 0xad, 0x2e, 0xaf, 0xbc, 0xeb, 0x09, 0xf7, 0xbe,
- 0xd5, 0x85, 0xc5, 0x3e, 0xbd, 0x98, 0xd5, 0xbe, 0xfa, 0xd7, 0x68, 0x3e,
- 0x09, 0x5c, 0xb1, 0x3d, 0xd3, 0xf8, 0xa1, 0xbe, 0x36, 0x24, 0xaf, 0xbe,
- 0x80, 0x7d, 0x89, 0x3e, 0xda, 0xcc, 0x52, 0xbe, 0x5d, 0x60, 0xc2, 0xbd,
- 0xf0, 0xfd, 0xf9, 0xbe, 0x8a, 0x25, 0x2e, 0xbf, 0x4f, 0x2b, 0xb7, 0x3e,
- 0x99, 0xff, 0x91, 0x3e, 0xb0, 0xdd, 0x8d, 0x3e, 0x1d, 0xa4, 0x89, 0x3d,
- 0xe5, 0xa1, 0xfc, 0x3d, 0xd1, 0xac, 0x25, 0x3e, 0x0e, 0xb6, 0xbc, 0xbe,
- 0x3a, 0xfe, 0x81, 0x3e, 0x7d, 0x58, 0x2f, 0x3e, 0x87, 0xc4, 0xb6, 0x3d,
- 0x16, 0x3c, 0x99, 0xbd, 0xe1, 0x38, 0x22, 0xbe, 0x50, 0x85, 0x23, 0xbe,
- 0x29, 0xe0, 0x64, 0xbd, 0x53, 0x29, 0x27, 0x3e, 0xfc, 0xe2, 0x15, 0x3e,
- 0xc3, 0xa2, 0xa8, 0xbe, 0x04, 0xdb, 0xd1, 0xbe, 0x73, 0x1c, 0x05, 0x3e,
- 0x06, 0x0e, 0x2d, 0xbc, 0x5d, 0x5b, 0x06, 0xbd, 0x9d, 0x79, 0xbb, 0x3e,
- 0x6e, 0x4c, 0x35, 0x3e, 0x07, 0x39, 0x0a, 0xbf, 0x45, 0x0c, 0x09, 0x3c,
- 0x5e, 0x9d, 0x4e, 0x3d, 0x37, 0x24, 0x05, 0xbe, 0x0f, 0x3d, 0x27, 0xbc,
- 0x7b, 0x4f, 0xd7, 0xbc, 0x9d, 0x15, 0xfd, 0x3c, 0x65, 0x71, 0x56, 0x3e,
- 0xde, 0x68, 0xa7, 0x3e, 0x27, 0xbc, 0xa0, 0x3e, 0xe7, 0xc5, 0xf9, 0x3d,
- 0x72, 0x13, 0x60, 0x3c, 0x4d, 0x59, 0x0d, 0x3d, 0xde, 0x22, 0x1d, 0x3e,
- 0x1d, 0xbc, 0x52, 0xbe, 0xa9, 0x1a, 0x62, 0x3c, 0xdd, 0xde, 0x05, 0x3e,
- 0x9e, 0xab, 0x15, 0xbf, 0xa6, 0xf3, 0x01, 0x3e, 0x3c, 0xa3, 0x8b, 0x3e,
- 0x99, 0x71, 0xb5, 0xbe, 0xe5, 0xee, 0x63, 0xbd, 0xf3, 0xa8, 0x6c, 0x3e,
- 0xb6, 0x9d, 0xdf, 0x3d, 0xc4, 0xcd, 0xab, 0xbc, 0x41, 0xdb, 0x6a, 0x3e,
- 0xa9, 0x38, 0x00, 0xbe, 0x58, 0x83, 0xa0, 0xbe, 0x33, 0xc8, 0x20, 0xbd,
- 0x2b, 0x1e, 0x22, 0xbf, 0x68, 0xa7, 0xd5, 0x3e, 0x0c, 0x7c, 0x25, 0xbe,
- 0x7d, 0x2e, 0x6c, 0xbe, 0x72, 0x2b, 0x35, 0x3e, 0x32, 0x24, 0x43, 0xbd,
- 0xa3, 0x3a, 0x89, 0xbe, 0x07, 0x56, 0x3d, 0x3e, 0x94, 0x76, 0x9a, 0x3e,
- 0xf4, 0xf3, 0x36, 0x3d, 0xe0, 0x32, 0xf7, 0xbe, 0xbc, 0x2d, 0x0e, 0x3e,
- 0xe2, 0x26, 0x1c, 0xbf, 0x57, 0x9d, 0x2c, 0xbe, 0xc3, 0x50, 0x37, 0xbe,
- 0x96, 0xf7, 0x98, 0xbe, 0x47, 0xff, 0x9a, 0xbd, 0x46, 0x7b, 0x3e, 0xbe,
- 0xe8, 0x0f, 0x7e, 0xbe, 0xe7, 0x2b, 0xba, 0xbe, 0x00, 0xba, 0xc2, 0x3d,
- 0xbf, 0xfb, 0x17, 0x3d, 0x19, 0x86, 0x78, 0xbe, 0x05, 0x2b, 0x68, 0xbf,
- 0x23, 0xfa, 0x44, 0xbe, 0xc3, 0x6d, 0x8f, 0x3e, 0xa9, 0xd9, 0x45, 0xbe,
- 0x92, 0x11, 0x4d, 0xbe, 0xfe, 0xdb, 0xc9, 0x3c, 0x56, 0xea, 0x69, 0xbd,
- 0xb5, 0xae, 0xfc, 0x3d, 0x7c, 0x52, 0x01, 0xbc, 0x56, 0x1e, 0x06, 0x3e,
- 0x04, 0xbe, 0x4c, 0x3e, 0xa1, 0x52, 0x22, 0x3e, 0x39, 0xe9, 0x36, 0x3e,
- 0x70, 0x8b, 0xa9, 0xbe, 0xb0, 0x14, 0x43, 0xbe, 0x1b, 0xf2, 0x3b, 0x3e,
- 0x05, 0xf3, 0x9b, 0xbd, 0xd5, 0x50, 0xb8, 0xbd, 0x45, 0x54, 0xdc, 0xbe,
- 0x1f, 0xb7, 0x41, 0xbe, 0x11, 0x88, 0x87, 0x3e, 0x28, 0x8d, 0xfd, 0xbe,
- 0x15, 0x61, 0xcb, 0x3e, 0x88, 0x37, 0x22, 0x3c, 0xd8, 0x78, 0x35, 0x3c,
- 0x21, 0x36, 0x49, 0xbd, 0xa4, 0x6f, 0xc3, 0xbe, 0x93, 0x3c, 0x1f, 0x3e,
- 0x66, 0x91, 0x18, 0xbe, 0x0e, 0xeb, 0x65, 0x3d, 0xb4, 0x4b, 0x01, 0xbe,
- 0x14, 0xa6, 0x3d, 0x3e, 0x2b, 0x91, 0x83, 0xbd, 0x2b, 0xff, 0xc2, 0x3e,
- 0x02, 0x53, 0x51, 0xbe, 0xea, 0xc5, 0xb5, 0xbd, 0xc7, 0x58, 0xb4, 0xbc,
- 0xd2, 0xab, 0xff, 0xbe, 0xd1, 0x6b, 0xae, 0xbe, 0x06, 0x3c, 0x88, 0xbd,
- 0xf4, 0x95, 0x05, 0xbe, 0x9a, 0x10, 0xb0, 0x3e, 0xc2, 0x6b, 0x55, 0x3e,
- 0xd7, 0xe6, 0xdd, 0x3d, 0x4e, 0xb9, 0x88, 0x3e, 0x19, 0xee, 0x9b, 0xbe,
- 0x1d, 0x35, 0x29, 0xbe, 0xe3, 0xc3, 0xaa, 0x3d, 0xf3, 0x01, 0x0f, 0xbe,
- 0xde, 0xa0, 0x28, 0x3e, 0xec, 0x5a, 0xa3, 0x3e, 0x99, 0x2d, 0x2d, 0xbf,
- 0x98, 0x66, 0x4f, 0x39, 0x00, 0xd7, 0x41, 0xbe, 0x8f, 0xc8, 0xbc, 0xbc,
- 0x87, 0xdb, 0x1f, 0x3e, 0x6c, 0xce, 0x9b, 0xbe, 0xc1, 0x33, 0xc7, 0x3d,
- 0x74, 0x8e, 0xcc, 0xbd, 0xba, 0x40, 0x9e, 0x3e, 0x5b, 0xc5, 0x9d, 0xbd,
- 0x95, 0x3d, 0x83, 0xbd, 0x2d, 0x61, 0x9a, 0x3d, 0x06, 0x0b, 0xd9, 0xbd,
- 0xed, 0xca, 0x9a, 0xbe, 0xc6, 0xc8, 0xb8, 0x3e, 0x77, 0xc1, 0xcf, 0xbd,
- 0x49, 0x4b, 0x0c, 0x3e, 0x30, 0xda, 0x2a, 0xbf, 0x66, 0x61, 0x13, 0x3e,
- 0xc1, 0x66, 0xa4, 0xbc, 0x74, 0xf2, 0xd0, 0xbb, 0x28, 0x04, 0x06, 0xbc,
- 0xc2, 0x1d, 0x82, 0x3e, 0xd0, 0x0d, 0x19, 0xbe, 0x84, 0xbc, 0xec, 0x3d,
- 0xe9, 0x4d, 0x16, 0x3f, 0xad, 0x41, 0x4c, 0xbe, 0x5f, 0xc1, 0x35, 0x3e,
- 0x35, 0x55, 0x52, 0x3e, 0x7b, 0x3d, 0x25, 0x3e, 0x07, 0x9f, 0x09, 0xbd,
- 0xe9, 0xec, 0x5d, 0xbe, 0xef, 0x79, 0x9d, 0x3e, 0xa9, 0x8f, 0xa6, 0x3e,
- 0x30, 0xc6, 0xb2, 0x3e, 0x00, 0x75, 0xb5, 0x3d, 0x84, 0x83, 0xe7, 0xbe,
- 0x77, 0x5c, 0xb6, 0xba, 0x35, 0x3e, 0x9c, 0xbc, 0xad, 0xc4, 0x5c, 0x3e,
- 0x38, 0x15, 0x24, 0xbf, 0x93, 0x63, 0xbd, 0xbd, 0xad, 0x1b, 0xd4, 0x3c,
- 0x2f, 0x9d, 0x3d, 0xbc, 0x7b, 0x16, 0x81, 0xbf, 0xbc, 0x44, 0x32, 0x3e,
- 0x3a, 0x82, 0x06, 0x3c, 0x4f, 0xf4, 0x81, 0x3e, 0x20, 0x4f, 0x3e, 0x3c,
- 0x10, 0xbb, 0x06, 0xbf, 0x05, 0x3f, 0xa9, 0xbe, 0x75, 0xed, 0xe9, 0xbc,
- 0x7a, 0x0b, 0xad, 0x3e, 0xe6, 0xe9, 0xd3, 0x3d, 0x83, 0xec, 0x28, 0x3e,
- 0x11, 0xd1, 0x4b, 0x3e, 0x8b, 0x7d, 0xfb, 0xbd, 0xd3, 0x79, 0xf3, 0xbd,
- 0x50, 0x2f, 0x9b, 0xbe, 0xf7, 0x45, 0x20, 0x3e, 0xa4, 0x05, 0xb2, 0x3e,
- 0x70, 0xbd, 0x1f, 0x3d, 0x67, 0x47, 0xff, 0xbd, 0xc9, 0x31, 0x8b, 0xbe,
- 0x9e, 0xd4, 0xf0, 0xbe, 0x4b, 0xd3, 0x1c, 0x3d, 0x9c, 0xb0, 0x49, 0x3d,
- 0xab, 0x11, 0x30, 0x3e, 0x93, 0x26, 0x87, 0x3e, 0x3f, 0x6b, 0x48, 0x3e,
- 0x45, 0x96, 0xba, 0xbd, 0x8c, 0xe0, 0x4e, 0xbf, 0xd7, 0x06, 0x88, 0x3e,
- 0xb0, 0x05, 0x34, 0x3f, 0x35, 0xcd, 0x52, 0x3d, 0x2a, 0x13, 0xc9, 0xbd,
- 0xf7, 0x91, 0xad, 0xbd, 0x4e, 0x9f, 0x93, 0xbe, 0xce, 0x58, 0x88, 0xbe,
- 0x44, 0x99, 0x69, 0xbe, 0x29, 0x90, 0x2f, 0xbe, 0x02, 0x8f, 0xd9, 0x3e,
- 0x70, 0xa2, 0xec, 0xbd, 0x42, 0xd7, 0x4a, 0xbe, 0xd1, 0xc5, 0x10, 0xbd,
- 0xb1, 0x1a, 0x84, 0xbe, 0x9d, 0xb7, 0x9e, 0x3e, 0x40, 0x99, 0x13, 0x3e,
- 0x24, 0x7b, 0x36, 0xbd, 0xe2, 0xdb, 0xd3, 0xbd, 0xa2, 0xac, 0xce, 0xbd,
- 0xbe, 0x23, 0x06, 0xbf, 0xc9, 0xce, 0xcb, 0x3e, 0x59, 0xc2, 0x5f, 0xbe,
- 0xe9, 0x92, 0xf5, 0xbe, 0xea, 0xe1, 0xd3, 0x3e, 0x4c, 0x10, 0x89, 0x3e,
- 0xdb, 0x2e, 0xca, 0xbe, 0x85, 0x19, 0x0d, 0xbf, 0x7e, 0x38, 0xe9, 0xbe,
- 0xf7, 0x9c, 0xb4, 0xbc, 0xbb, 0x84, 0xb0, 0xbe, 0x57, 0xf2, 0x8f, 0xbe,
- 0xb3, 0x92, 0x5c, 0x3e, 0xf4, 0x2a, 0x68, 0xbf, 0xce, 0x78, 0x22, 0xbd,
- 0xda, 0xf9, 0xa3, 0xbd, 0xa5, 0x2a, 0xa5, 0x3e, 0x46, 0x80, 0x2b, 0x3e,
- 0x8b, 0xf4, 0x49, 0xbd, 0x86, 0xf3, 0xc3, 0xbe, 0x70, 0x0d, 0xc7, 0xbe,
- 0xda, 0x9e, 0x2d, 0x3e, 0x04, 0xdb, 0x30, 0xbe, 0xf6, 0x5e, 0x12, 0x3e,
- 0xcd, 0xe2, 0x20, 0xbf, 0xfb, 0x5b, 0x2b, 0xbe, 0xe4, 0x64, 0xa6, 0x3d,
- 0xee, 0xe5, 0x00, 0x3e, 0xf8, 0xab, 0x2f, 0xbe, 0x64, 0x0a, 0x8f, 0x3e,
- 0x7c, 0x82, 0xd3, 0xbd, 0x1d, 0x9f, 0xf0, 0x3d, 0xce, 0x89, 0xb0, 0x3e,
- 0xf0, 0x3b, 0x0c, 0x3e, 0xf6, 0xca, 0xf3, 0xbd, 0x8d, 0x8c, 0xbf, 0xbe,
- 0x69, 0x5d, 0xaf, 0x3e, 0xe1, 0x6f, 0xb9, 0xbe, 0x8f, 0x69, 0x07, 0xbf,
- 0xaa, 0x74, 0x22, 0x3e, 0x91, 0x54, 0x42, 0xbf, 0x40, 0x7f, 0xaa, 0x3b,
- 0xe8, 0x41, 0xed, 0x3d, 0xad, 0x97, 0x8b, 0x3e, 0x3b, 0x67, 0x06, 0x3f,
- 0x19, 0x10, 0x47, 0x3d, 0x8e, 0x8c, 0x88, 0x3e, 0x66, 0xe3, 0x16, 0xbd,
- 0x0c, 0x30, 0x9a, 0x3d, 0x5e, 0x3e, 0x8f, 0x3c, 0xed, 0x9d, 0x2c, 0xbf,
- 0x55, 0xff, 0x9d, 0x3e, 0xa6, 0x73, 0x7d, 0xbf, 0xa2, 0xfc, 0x74, 0xbe,
- 0xd3, 0xb4, 0x54, 0xbe, 0xd6, 0x85, 0x4e, 0xbf, 0x32, 0x74, 0x9f, 0xbe,
- 0x7c, 0x51, 0x21, 0x3f, 0x92, 0x7e, 0xf0, 0x3e, 0xa2, 0xb6, 0xc8, 0xbc,
- 0xe0, 0x74, 0x2c, 0x3e, 0x6d, 0x7a, 0xc0, 0x3d, 0xad, 0xf6, 0x32, 0xbd,
- 0x74, 0xb6, 0x96, 0x3d, 0x0a, 0x71, 0xc8, 0xbe, 0xc7, 0x66, 0xa7, 0xbe,
- 0x24, 0xd5, 0x64, 0x3d, 0x03, 0xa6, 0xa1, 0xbe, 0x46, 0xfd, 0xdc, 0x3d,
- 0x99, 0x82, 0x1c, 0x3e, 0x5a, 0xb3, 0x1a, 0x3d, 0xb2, 0x76, 0x45, 0xbe,
- 0x57, 0xf6, 0x1d, 0xbf, 0xbb, 0x62, 0xdf, 0xbd, 0x64, 0x7e, 0xbe, 0xbe,
- 0x19, 0xbc, 0xf6, 0x3e, 0x9c, 0x37, 0x5c, 0xbe, 0x3d, 0x38, 0x2b, 0x3e,
- 0x19, 0xa9, 0xfa, 0x3d, 0x49, 0x3e, 0x97, 0x3d, 0xa9, 0x36, 0x85, 0xbd,
- 0x59, 0xff, 0x96, 0xbc, 0x77, 0xa2, 0xe8, 0x3d, 0xd9, 0x7b, 0x6a, 0x3e,
- 0x73, 0xdb, 0x6e, 0xbe, 0xe2, 0x60, 0xd3, 0xbd, 0x03, 0xcc, 0xa0, 0x3d,
- 0xfb, 0x33, 0x87, 0x3e, 0x9d, 0x6d, 0x95, 0xbe, 0xd9, 0x58, 0x91, 0x3e,
- 0x4e, 0x61, 0x3f, 0x3e, 0x12, 0xa1, 0xae, 0xbd, 0x4c, 0x60, 0xa5, 0x3e,
- 0xbc, 0xa8, 0x58, 0x3d, 0x77, 0xbc, 0x2a, 0xbf, 0xc6, 0x73, 0x75, 0xbd,
- 0x8e, 0x03, 0x46, 0x3e, 0xa3, 0xa7, 0x0a, 0xbe, 0x1a, 0xef, 0xc7, 0x3e,
- 0x09, 0x4d, 0x26, 0xbc, 0xaa, 0x41, 0x2b, 0x3d, 0xc0, 0x39, 0x67, 0x3d,
- 0xc7, 0xcc, 0x58, 0xbf, 0x14, 0xc1, 0x0e, 0x3f, 0x5f, 0x85, 0x10, 0xbf,
- 0x8f, 0xc3, 0xd7, 0xbd, 0xf0, 0x5e, 0x4d, 0xbe, 0x41, 0x6d, 0x28, 0xbe,
- 0x84, 0x39, 0x5c, 0x3e, 0x14, 0x56, 0x4a, 0xbe, 0x37, 0x24, 0xbf, 0xbe,
- 0xf8, 0x3e, 0x0b, 0x3e, 0x16, 0xbe, 0x20, 0x3e, 0x6b, 0x1f, 0xf0, 0xbe,
- 0x1e, 0xe2, 0xd2, 0xbe, 0xdc, 0xe6, 0xac, 0x3d, 0xd7, 0xe3, 0x10, 0x3f,
- 0x8c, 0x25, 0x24, 0xbf, 0x1d, 0x26, 0xb4, 0x3e, 0x12, 0x70, 0x9a, 0x3c,
- 0x61, 0x35, 0x5d, 0xbe, 0x78, 0xb2, 0x62, 0x3e, 0xed, 0x0b, 0x52, 0x3e,
- 0x4b, 0x0a, 0x94, 0x3e, 0x19, 0x47, 0x1e, 0x3c, 0x5c, 0x83, 0x0f, 0x3d,
- 0xc5, 0xe8, 0xb5, 0x3e, 0x35, 0x3e, 0xe3, 0xbe, 0x14, 0xb7, 0x77, 0x3c,
- 0xc5, 0xdc, 0x92, 0xbe, 0x86, 0xdb, 0xa8, 0x3a, 0x00, 0x70, 0xef, 0xbe,
- 0x3a, 0x68, 0x1c, 0x3e, 0x86, 0x07, 0x8f, 0xbd, 0xf7, 0x5e, 0xa5, 0x3d,
- 0x26, 0x11, 0xe2, 0x3e, 0xb5, 0xb1, 0x7e, 0x3d, 0x11, 0x10, 0xaf, 0x3e,
- 0xd1, 0xa3, 0x4c, 0x3e, 0xe7, 0x81, 0xc4, 0xbd, 0x49, 0x7a, 0xe3, 0x3d,
- 0x85, 0xa5, 0x06, 0x3e, 0xba, 0xd6, 0xde, 0x3e, 0x3d, 0x81, 0xa4, 0x3c,
- 0x51, 0xf5, 0xf7, 0xbd, 0x2a, 0x02, 0x30, 0xbe, 0xf9, 0xd7, 0xd1, 0xbe,
- 0x5f, 0xfe, 0x84, 0x3e, 0x79, 0x9a, 0x19, 0xbe, 0x04, 0x3a, 0x77, 0x3e,
- 0xfa, 0x6f, 0xe3, 0x3e, 0x6b, 0xac, 0xe6, 0xbd, 0x87, 0x9e, 0x13, 0xbe,
- 0x64, 0x49, 0x4a, 0x3e, 0xd2, 0xde, 0x8d, 0xbe, 0x4f, 0x12, 0x16, 0xbd,
- 0xa9, 0xb4, 0x37, 0xbd, 0x82, 0xb6, 0x86, 0xbe, 0x0b, 0x47, 0x1e, 0xbe,
- 0xd0, 0x8d, 0xb2, 0xbd, 0x51, 0x1d, 0xcd, 0xbe, 0x9c, 0xc9, 0xcb, 0x3e,
- 0x86, 0xec, 0x19, 0xbf, 0xe7, 0xcd, 0xa9, 0x3b, 0x11, 0x1c, 0x04, 0x3f,
- 0x25, 0x10, 0x14, 0xbd, 0xc8, 0xcc, 0xc4, 0xbc, 0xe6, 0x05, 0x70, 0x3e,
- 0x27, 0xf8, 0xcd, 0xbe, 0xaf, 0x2e, 0xbc, 0xbe, 0xc3, 0xfc, 0x7a, 0xbd,
- 0x29, 0x48, 0xf8, 0xbe, 0xcf, 0x58, 0x84, 0x3e, 0x61, 0x54, 0x4e, 0xbe,
- 0xed, 0xc2, 0x9b, 0xbe, 0x4b, 0xc2, 0x9a, 0x3d, 0x3c, 0x60, 0xdd, 0xbd,
- 0x49, 0xdd, 0x01, 0x3e, 0x51, 0x9c, 0x76, 0x3e, 0x56, 0xb0, 0x68, 0x3e,
- 0x67, 0x21, 0x1a, 0xbf, 0x0f, 0xd3, 0x25, 0x3d, 0x5e, 0x9d, 0x44, 0xbe,
- 0x9a, 0xcd, 0xcb, 0xbd, 0xd1, 0x5a, 0x23, 0xbe, 0x28, 0xe6, 0x97, 0x3e,
- 0x91, 0x69, 0x38, 0x3e, 0xb5, 0x5b, 0xdc, 0x3d, 0xc3, 0xed, 0x8e, 0x3d,
- 0x7f, 0xcd, 0x58, 0x3e, 0x26, 0xd0, 0xc1, 0xbe, 0x46, 0x08, 0x39, 0x3e,
- 0x56, 0xf8, 0x8f, 0x3e, 0xd0, 0x21, 0xf9, 0x3e, 0x77, 0xaa, 0xb2, 0x3d,
- 0x69, 0xde, 0xc9, 0x3c, 0x9a, 0x25, 0x5e, 0xbe, 0x3c, 0xc3, 0x2b, 0xbd,
- 0x99, 0x1f, 0x50, 0xbf, 0x18, 0xd2, 0x2f, 0x3e, 0xe4, 0xab, 0xa6, 0xbd,
- 0x91, 0x32, 0x9b, 0xbe, 0x7d, 0x55, 0x74, 0x3d, 0x70, 0xc8, 0x8a, 0xbf,
- 0xdd, 0xaf, 0x69, 0x3e, 0x79, 0x88, 0x6f, 0x3e, 0xb2, 0x7d, 0x98, 0xbd,
- 0xb3, 0x51, 0x00, 0x3f, 0x27, 0xe9, 0xc9, 0x3c, 0xec, 0x04, 0xd1, 0x3d,
- 0x0a, 0xbb, 0x15, 0xbe, 0xc4, 0x52, 0x53, 0x3c, 0x6c, 0x30, 0x4e, 0x3c,
- 0x0a, 0xb5, 0xa1, 0x3e, 0xc1, 0x4a, 0xca, 0x3c, 0x64, 0x3a, 0x12, 0x3e,
- 0x33, 0xda, 0x40, 0xbe, 0xeb, 0xbd, 0xf0, 0xbd, 0xbc, 0x10, 0x01, 0xbd,
- 0xc0, 0x15, 0x2d, 0x3d, 0x26, 0x16, 0xcf, 0x3d, 0xd1, 0x0f, 0xe5, 0xbe,
- 0x03, 0x8b, 0xbe, 0xbe, 0xc0, 0x05, 0xca, 0x3e, 0xde, 0x04, 0x26, 0x3c,
- 0xd1, 0xde, 0x65, 0x3e, 0x85, 0xf0, 0xde, 0x3e, 0x23, 0xf9, 0x45, 0xbe,
- 0x05, 0xf9, 0x99, 0x3e, 0x9f, 0xc1, 0x02, 0x3e, 0x92, 0x99, 0xc0, 0x3b,
- 0x29, 0x83, 0xc9, 0xbe, 0x1f, 0xc0, 0x8f, 0x3e, 0xb8, 0xff, 0x36, 0xbe,
- 0xde, 0x75, 0x17, 0x3e, 0x4d, 0xcf, 0xfa, 0x3d, 0xa0, 0xbd, 0x18, 0x3e,
- 0xd1, 0x01, 0x0a, 0x3e, 0x59, 0x01, 0xa7, 0xbe, 0xc8, 0x3c, 0xe1, 0x3e,
- 0xd8, 0x5b, 0x9f, 0x3e, 0xd4, 0x50, 0xe5, 0xbe, 0xdc, 0xd5, 0x2b, 0xbf,
- 0x2f, 0xf3, 0xa0, 0x3e, 0x00, 0xfa, 0x82, 0xbe, 0x1f, 0xe1, 0xbb, 0xbe,
- 0x02, 0xce, 0x5a, 0x3e, 0x44, 0x36, 0xe4, 0x3c, 0x4b, 0x8c, 0xa4, 0x3e,
- 0x3b, 0x1c, 0x6f, 0x3d, 0x47, 0xda, 0x00, 0xbf, 0xfb, 0x21, 0x04, 0x3e,
- 0x25, 0xeb, 0x17, 0xbf, 0x26, 0xef, 0x2c, 0xbe, 0x69, 0xd4, 0x88, 0x3e,
- 0x00, 0xe2, 0xd8, 0xbd, 0xbf, 0x2a, 0x3f, 0xbe, 0xd6, 0x1e, 0x51, 0x3e,
- 0xb4, 0x9c, 0x25, 0x3e, 0xc4, 0x95, 0x45, 0x3e, 0xfe, 0xa2, 0x09, 0xbf,
- 0x4b, 0xe0, 0x3e, 0xbd, 0xc1, 0x87, 0x70, 0xbd, 0x47, 0x42, 0x3a, 0xbe,
- 0x20, 0xb3, 0x46, 0xbd, 0xb0, 0x07, 0x06, 0x3f, 0xe4, 0xe5, 0xcb, 0xbc,
- 0x1a, 0x98, 0x28, 0xbe, 0x40, 0x50, 0xc7, 0x3e, 0xfd, 0x7b, 0xf1, 0xbc,
- 0x65, 0xc9, 0xd3, 0x3e, 0xbf, 0x6a, 0xae, 0x3e, 0xb1, 0xc2, 0x32, 0x3e,
- 0xf1, 0x45, 0xd4, 0xbc, 0x14, 0xd6, 0x5f, 0xbe, 0x20, 0xc4, 0xa9, 0xbe,
- 0x1e, 0x4f, 0x85, 0x3c, 0xaf, 0x6e, 0x4a, 0x3c, 0x96, 0xad, 0x84, 0x3e,
- 0x87, 0xd5, 0xa7, 0xbd, 0x7f, 0x5d, 0xfe, 0x3d, 0xaf, 0xa9, 0xb4, 0xbe,
- 0x5a, 0xd0, 0x98, 0xbf, 0x6e, 0x4e, 0xa7, 0x3d, 0xc5, 0x03, 0xf7, 0x3d,
- 0xd2, 0x91, 0xaf, 0xbd, 0xec, 0x96, 0x9e, 0x3c, 0x15, 0x13, 0x21, 0xbe,
- 0x6b, 0x51, 0x82, 0x3e, 0x7e, 0x87, 0x54, 0xbe, 0x0e, 0x11, 0xdf, 0x3e,
- 0x3e, 0x46, 0x07, 0xbe, 0x25, 0x41, 0x76, 0xbd, 0x19, 0x03, 0xc5, 0x3c,
- 0x2f, 0xf3, 0x11, 0xbe, 0xa5, 0x44, 0x1c, 0xbf, 0x5f, 0x24, 0xea, 0x3d,
- 0x8e, 0xa4, 0xd2, 0xbb, 0x18, 0x21, 0x2f, 0x3e, 0xf8, 0xf6, 0xd0, 0xbe,
- 0x79, 0xdb, 0x97, 0x3e, 0x23, 0x1f, 0x4b, 0xbd, 0xa8, 0x75, 0x91, 0x3d,
- 0x41, 0x5d, 0xa1, 0xbe, 0x75, 0x95, 0x2c, 0x3f, 0xf3, 0xd3, 0x59, 0xbd,
- 0x78, 0xd9, 0x67, 0x3e, 0xd8, 0xdd, 0xa9, 0xbe, 0xbb, 0x93, 0x9e, 0xbe,
- 0x87, 0x72, 0x00, 0x3f, 0xbb, 0x4d, 0x59, 0xbe, 0x0f, 0x3e, 0xa7, 0x3d,
- 0xed, 0x0b, 0x68, 0xbd, 0x1b, 0x78, 0xa5, 0xbd, 0x2e, 0x1c, 0x6f, 0xbc,
- 0xdb, 0xa2, 0x37, 0x3e, 0x67, 0xdd, 0x7a, 0x3e, 0xc4, 0x72, 0x01, 0x3d,
- 0x49, 0x2b, 0xb8, 0xbe, 0x29, 0x0d, 0x9b, 0xbd, 0x36, 0x0b, 0x9c, 0x3b,
- 0xa0, 0x42, 0x5e, 0x3e, 0xbf, 0x10, 0xdb, 0xbe, 0x81, 0xea, 0x04, 0xbd,
- 0x24, 0xbc, 0xd1, 0x3d, 0x0b, 0xb7, 0xa8, 0x3e, 0x87, 0x8c, 0x15, 0xbe,
- 0x6f, 0x32, 0xb2, 0x3e, 0x02, 0x70, 0xb3, 0xbd, 0x4d, 0xba, 0x94, 0xbd,
- 0x43, 0xb8, 0x9a, 0xbf, 0xe3, 0xce, 0x5d, 0xbe, 0xd0, 0xa2, 0x8b, 0xbe,
- 0x9f, 0x80, 0x14, 0x3e, 0x74, 0x83, 0x87, 0xbe, 0x47, 0x01, 0x76, 0xbe,
- 0x5c, 0x6b, 0x07, 0x3e, 0x26, 0xdf, 0x27, 0x3e, 0xe2, 0xbb, 0x28, 0xbe,
- 0xf2, 0x36, 0x16, 0x3d, 0x39, 0x7c, 0xad, 0x3e, 0x58, 0x59, 0x0a, 0x3d,
- 0x19, 0x80, 0x4d, 0xbe, 0x84, 0x4c, 0x26, 0x3e, 0xb9, 0xbd, 0x86, 0x3d,
- 0x58, 0xd4, 0xc6, 0x3e, 0x4e, 0xf7, 0x4c, 0xbe, 0x41, 0xc2, 0x92, 0xbd,
- 0x06, 0x92, 0xa0, 0xbe, 0xd7, 0x11, 0x1c, 0xbf, 0x2f, 0x08, 0x10, 0xbc,
- 0xfc, 0x14, 0x10, 0x3e, 0xd2, 0x1c, 0x5a, 0xbe, 0x2e, 0x1b, 0xa5, 0xbe,
- 0x79, 0xb9, 0xe1, 0x3d, 0x67, 0xe9, 0xa2, 0x3d, 0x6c, 0x92, 0x15, 0xbf,
- 0x97, 0x1f, 0x11, 0xbe, 0x98, 0x5c, 0x84, 0x3e, 0x90, 0xc6, 0x66, 0xbe,
- 0xf2, 0x8a, 0x7b, 0x3c, 0x63, 0x7d, 0x01, 0x3e, 0x9a, 0xa4, 0x8f, 0xbe,
- 0x75, 0x0c, 0x5b, 0xbd, 0xfe, 0x96, 0xe9, 0xbd, 0xd2, 0x11, 0x81, 0x3e,
- 0x0c, 0x2f, 0x14, 0xbd, 0x0b, 0xb3, 0xce, 0xbe, 0x0f, 0xe4, 0x07, 0xbe,
- 0x32, 0x4b, 0x20, 0xbe, 0xbe, 0x64, 0xab, 0x3d, 0x68, 0x95, 0x45, 0x3e,
- 0xb8, 0x7f, 0x8e, 0xbe, 0x36, 0xac, 0x02, 0xbd, 0xf7, 0xc3, 0xaa, 0xbe,
- 0x62, 0xd2, 0xd7, 0xbd, 0x92, 0x68, 0xa7, 0x3d, 0xa7, 0xe5, 0x82, 0x3e,
- 0xee, 0x8a, 0x25, 0xbd, 0xa0, 0x1c, 0xca, 0x3d, 0x64, 0x8f, 0xe2, 0xbc,
- 0xc4, 0x16, 0x88, 0x3e, 0x52, 0x98, 0xb7, 0x3d, 0x4a, 0x65, 0x68, 0xbd,
- 0xa6, 0x71, 0x80, 0x3d, 0xb1, 0xc3, 0xaa, 0xbd, 0x11, 0xdf, 0xa8, 0x3e,
- 0xf6, 0xcd, 0xfd, 0x3d, 0x61, 0x69, 0x80, 0xbe, 0x84, 0x40, 0x95, 0x3c,
- 0x42, 0x58, 0x05, 0xbd, 0x81, 0x99, 0x85, 0x3d, 0x54, 0xb7, 0x2d, 0xbe,
- 0x19, 0xbe, 0x69, 0xbe, 0x4f, 0xd0, 0x87, 0xbd, 0xe6, 0xff, 0x90, 0x3b,
- 0x93, 0x70, 0x42, 0xbe, 0x39, 0x21, 0x0f, 0xbe, 0xe4, 0xf3, 0xef, 0xbe,
- 0x06, 0x44, 0x72, 0xbe, 0x62, 0xd5, 0x03, 0xbe, 0x9a, 0xaa, 0xb6, 0x3b,
- 0x31, 0x88, 0xae, 0xbd, 0x43, 0x66, 0x1c, 0xbe, 0x29, 0x77, 0xc3, 0x3d,
- 0x0b, 0x14, 0xc9, 0x3e, 0x15, 0x5d, 0x8a, 0xbe, 0x5e, 0x1d, 0x33, 0x3e,
- 0x4a, 0x89, 0x0d, 0xbe, 0x92, 0xda, 0x05, 0xbe, 0x79, 0x52, 0xbe, 0xbc,
- 0x0a, 0x78, 0x83, 0xbe, 0x6b, 0x53, 0xeb, 0xbe, 0xa2, 0x5e, 0x12, 0x3e,
- 0xb2, 0xeb, 0x18, 0x3e, 0xf6, 0x6a, 0xc8, 0xbd, 0x39, 0x2b, 0x27, 0x3e,
- 0xdf, 0x41, 0x2f, 0x3e, 0xad, 0x92, 0xb6, 0x3d, 0x97, 0x3c, 0xac, 0x3d,
- 0x78, 0xac, 0xa2, 0x3d, 0xcf, 0xf5, 0x2d, 0xbd, 0x47, 0x34, 0xa1, 0x3d,
- 0xb6, 0x54, 0xa6, 0x3c, 0x7a, 0x8b, 0xd2, 0x3c, 0x30, 0xa4, 0x4f, 0xbe,
- 0x89, 0xa9, 0x06, 0xbe, 0x92, 0x6c, 0x75, 0x3e, 0x7f, 0xd5, 0x64, 0x3d,
- 0x26, 0x90, 0x79, 0x3d, 0xbf, 0x41, 0x9c, 0x3d, 0x21, 0x2d, 0x8e, 0xbe,
- 0xa2, 0xce, 0x06, 0xbd, 0x79, 0xcc, 0xe6, 0xbd, 0x89, 0x6c, 0x5c, 0x3e,
- 0x6b, 0x54, 0x60, 0x3a, 0xa7, 0x5c, 0x4f, 0x3c, 0x82, 0x09, 0x51, 0xbe,
- 0x9b, 0x91, 0xf3, 0x3b, 0x63, 0xef, 0x9d, 0xbd, 0xf1, 0xda, 0x23, 0xbe,
- 0x29, 0xaf, 0xba, 0x3d, 0xf7, 0x82, 0x30, 0xbe, 0x32, 0xd6, 0x9a, 0x3e,
- 0x09, 0x3a, 0x44, 0xbe, 0x46, 0xc0, 0x2b, 0xbf, 0x37, 0x10, 0x32, 0xbe,
- 0x6b, 0x11, 0x5f, 0x3e, 0x2c, 0x5b, 0x20, 0x3e, 0xf1, 0x77, 0x9d, 0x3d,
- 0x6d, 0xa8, 0x3a, 0xbe, 0xb6, 0xab, 0x32, 0xbe, 0x1b, 0x97, 0x19, 0x3e,
- 0xb8, 0x46, 0xe1, 0xbd, 0x90, 0x5c, 0xde, 0xbe, 0x69, 0xa2, 0xbf, 0x3d,
- 0x17, 0x71, 0xab, 0x3e, 0x8e, 0xbb, 0x81, 0x3e, 0x4f, 0x60, 0xc2, 0xbe,
- 0x52, 0x13, 0x0a, 0xbf, 0xcf, 0x6b, 0xaa, 0x3c, 0x61, 0x7b, 0x32, 0x3e,
- 0xca, 0x28, 0x42, 0xbd, 0x20, 0xe2, 0x79, 0xbe, 0x23, 0xbe, 0x87, 0xbe,
- 0x38, 0x06, 0xb7, 0x3c, 0xaf, 0x22, 0x84, 0x3e, 0x4d, 0x86, 0x28, 0x3e,
- 0xca, 0xce, 0x3c, 0x3e, 0xe8, 0x0e, 0x84, 0x3d, 0x03, 0x76, 0x28, 0xbe,
- 0xa9, 0xd7, 0x41, 0xbe, 0x2f, 0x65, 0x23, 0x3d, 0x0a, 0x7d, 0xf1, 0xbe,
- 0x58, 0xb5, 0x08, 0x3e, 0xb8, 0x60, 0x36, 0xbe, 0x3a, 0xad, 0xd6, 0x3d,
- 0x11, 0xef, 0xad, 0xbe, 0xcf, 0xf9, 0x67, 0x3e, 0x01, 0x1f, 0x09, 0xbe,
- 0xc7, 0x01, 0x64, 0xbe, 0x55, 0x49, 0x95, 0xbd, 0xf2, 0x29, 0xaa, 0xbe,
- 0xce, 0xa4, 0xaa, 0xbe, 0x74, 0xea, 0x34, 0xbe, 0xb2, 0x25, 0xda, 0x3d,
- 0xb9, 0x17, 0x9d, 0xbe, 0x81, 0x4f, 0x8b, 0x3d, 0xcc, 0x46, 0x1d, 0xbe,
- 0x0e, 0xa6, 0x04, 0xbe, 0x87, 0xdf, 0x2d, 0xbf, 0xfb, 0x4d, 0xe3, 0xbe,
- 0xd2, 0x61, 0xda, 0xbd, 0x31, 0xf5, 0x5d, 0xbe, 0xe9, 0xb9, 0x6b, 0xbf,
- 0x62, 0x16, 0x2e, 0x3d, 0x6c, 0x54, 0x43, 0x3d, 0x03, 0xd8, 0xe6, 0xbd,
- 0xce, 0x69, 0x07, 0xbc, 0xff, 0xc4, 0x50, 0xbf, 0xbc, 0xb5, 0xd9, 0xbd,
- 0x4f, 0xf2, 0x6a, 0x3e, 0x37, 0xc7, 0x4c, 0x3d, 0xfc, 0xec, 0x09, 0x3c,
- 0x73, 0xde, 0xee, 0xbd, 0x16, 0x01, 0xff, 0xbe, 0x6c, 0x8f, 0x62, 0x3b,
- 0x98, 0xd1, 0x20, 0xbf, 0xb9, 0x7b, 0x00, 0xbe, 0x6a, 0x0c, 0x3a, 0x3d,
- 0xb8, 0x70, 0x18, 0xbe, 0x51, 0xef, 0xa7, 0xbe, 0x7e, 0xf8, 0x5a, 0xbe,
- 0xe5, 0xe7, 0x7f, 0xbe, 0xa9, 0x51, 0x75, 0x3e, 0x5f, 0x67, 0xc5, 0x3d,
- 0xad, 0x03, 0xfb, 0x3d, 0xc6, 0xc7, 0x99, 0x3e, 0xdb, 0x44, 0x61, 0xbe,
- 0xc1, 0x56, 0xf8, 0xbe, 0x9b, 0x42, 0x9e, 0xbe, 0x47, 0x54, 0x9a, 0x3d,
- 0xee, 0xfd, 0x2a, 0x3e, 0x7a, 0xef, 0xac, 0xbc, 0x2d, 0xd2, 0x82, 0xbd,
- 0x50, 0xf1, 0x53, 0xbe, 0x7d, 0x46, 0x05, 0xbf, 0xce, 0xb7, 0x0e, 0x3d,
- 0x1e, 0x3a, 0x9d, 0x3e, 0x36, 0x66, 0x4e, 0xbd, 0x2a, 0x4c, 0x0c, 0x3e,
- 0xed, 0xee, 0x17, 0x3e, 0x0e, 0xbc, 0x7b, 0xbd, 0xf6, 0x56, 0xb3, 0x3e,
- 0x25, 0x68, 0x3a, 0x3e, 0xbd, 0x55, 0xcd, 0x3e, 0xe5, 0x61, 0x76, 0xbe,
- 0x50, 0xd7, 0x34, 0x3e, 0xb0, 0x2c, 0x5d, 0xbf, 0xd0, 0x67, 0xbe, 0x3e,
- 0x33, 0xfa, 0xa0, 0xbe, 0x3d, 0x29, 0x1a, 0xbd, 0xca, 0x79, 0x94, 0xbe,
- 0x40, 0x03, 0x5a, 0xbe, 0x79, 0x84, 0x63, 0xbe, 0x8c, 0x2d, 0xf5, 0xbd,
- 0x0e, 0xd0, 0x26, 0xbf, 0x25, 0xdc, 0xfd, 0x3d, 0x0d, 0x62, 0x38, 0xbf,
- 0xff, 0x3b, 0xb1, 0x3d, 0x93, 0x1c, 0x64, 0xbe, 0x27, 0x81, 0x80, 0xbd,
- 0x60, 0x97, 0x84, 0xbe, 0xb4, 0x68, 0xb9, 0xbe, 0xd8, 0xa7, 0x5d, 0xbe,
- 0x7c, 0x71, 0x32, 0x3e, 0xa0, 0x94, 0x82, 0xbe, 0xfc, 0xaa, 0xf5, 0x3e,
- 0x3f, 0xb0, 0x4a, 0xbe, 0xb3, 0x20, 0x80, 0xbe, 0xfc, 0x72, 0x2d, 0x3e,
- 0x92, 0xbd, 0x94, 0x3d, 0x24, 0x30, 0xd6, 0xbe, 0xc0, 0xb5, 0xc4, 0xbb,
- 0x8d, 0x11, 0xb5, 0xbe, 0xa6, 0x85, 0xf3, 0xbd, 0x1c, 0x15, 0x40, 0xbe,
- 0x5c, 0xb6, 0x8d, 0x3e, 0x3b, 0xfb, 0xad, 0x3a, 0x4a, 0xdf, 0x03, 0xbf,
- 0xbc, 0x78, 0x8e, 0xbe, 0x75, 0x5b, 0x9c, 0x3d, 0x3e, 0x62, 0xa0, 0x3d,
- 0x41, 0xc5, 0xcf, 0xbe, 0x86, 0x18, 0x14, 0xbe, 0x4f, 0x9a, 0xca, 0xbc,
- 0xc8, 0x17, 0xd0, 0xbe, 0xcf, 0x8b, 0x20, 0xbe, 0x43, 0xc9, 0x8b, 0xbe,
- 0x98, 0xad, 0x1c, 0xbf, 0x86, 0xf6, 0x4e, 0x3a, 0xe0, 0x7c, 0x87, 0xbd,
- 0x6e, 0xcb, 0x25, 0x3c, 0xf0, 0x3c, 0x87, 0xbd, 0x39, 0x66, 0x2b, 0x3e,
- 0x72, 0x77, 0x05, 0xbd, 0x34, 0x2b, 0x89, 0x3d, 0x17, 0x00, 0x14, 0xbe,
- 0xae, 0x61, 0x7a, 0x3c, 0x52, 0x44, 0x66, 0x3d, 0x39, 0x21, 0xb4, 0xbc,
- 0x01, 0x1c, 0xe2, 0xbd, 0x8c, 0x28, 0x3a, 0xbe, 0x3c, 0x33, 0xe7, 0xbd,
- 0xc4, 0x96, 0xaa, 0x3d, 0xe9, 0x0f, 0x85, 0xbd, 0x30, 0x57, 0xd9, 0xbc,
- 0xd5, 0x91, 0xc3, 0xbc, 0x1b, 0xec, 0xa4, 0x3e, 0x25, 0x33, 0xc4, 0x3d,
- 0xbe, 0x17, 0xb1, 0x3c, 0x24, 0xed, 0x8e, 0xbc, 0x59, 0x61, 0x4d, 0xbe,
- 0x14, 0x7f, 0x1d, 0x3e, 0x79, 0x33, 0x24, 0xbe, 0x1b, 0x8e, 0x21, 0x3e,
- 0x41, 0x2b, 0x3d, 0x3d, 0x98, 0xdd, 0x06, 0xbd, 0x33, 0x22, 0x2e, 0x3d,
- 0x3c, 0xd0, 0x42, 0x3e, 0xeb, 0x95, 0xff, 0x3d, 0xd6, 0x5e, 0x78, 0x3c,
- 0x48, 0xd3, 0xd8, 0xbc, 0x9c, 0x65, 0xa8, 0x3d, 0x9a, 0xaf, 0x67, 0x3d,
- 0xb8, 0x7f, 0x18, 0x3d, 0x4a, 0x20, 0xdf, 0x3c, 0xd5, 0xad, 0x12, 0xbe,
- 0x45, 0xe8, 0x17, 0xbe, 0x46, 0x00, 0xfb, 0x3c, 0xf2, 0xd3, 0x07, 0xbd,
- 0xc9, 0x14, 0xdf, 0x3c, 0xa3, 0x66, 0xbb, 0x3d, 0x80, 0x1f, 0x19, 0xbd,
- 0xcd, 0x56, 0x2a, 0xbe, 0xc9, 0x2f, 0x39, 0xbe, 0xb7, 0xbf, 0xe4, 0xbd,
- 0x84, 0x9e, 0x82, 0xbd, 0x93, 0xad, 0xf2, 0x3c, 0xcd, 0x0c, 0x0b, 0x3a,
- 0x29, 0x96, 0x85, 0x3c, 0x24, 0x4b, 0x62, 0x3c, 0x06, 0xd4, 0x02, 0x3e,
- 0x96, 0x74, 0xad, 0xbc, 0x2b, 0xeb, 0x4f, 0xbd, 0x2d, 0xc6, 0xaf, 0x3d,
- 0xf7, 0x9d, 0x0a, 0x3e, 0xc2, 0xd4, 0x73, 0x3d, 0xdc, 0x60, 0xc3, 0xbd,
- 0xf9, 0x64, 0x22, 0x3d, 0x04, 0x8a, 0x3e, 0xbd, 0xd8, 0xc3, 0xa8, 0xbd,
- 0xd5, 0xdc, 0x15, 0xbe, 0x24, 0x2a, 0xa8, 0xbd, 0x6c, 0xf7, 0x68, 0x3e,
- 0xc7, 0x66, 0x9d, 0x3c, 0x3f, 0x52, 0x2d, 0x3e, 0x3f, 0x5a, 0x87, 0x3d,
- 0xc0, 0x82, 0xf5, 0xbd, 0x1e, 0x2f, 0xf5, 0xbc, 0xdb, 0xd6, 0x38, 0xbd,
- 0x1f, 0xf6, 0xff, 0x3d, 0x1d, 0xd3, 0x2e, 0x3e, 0x65, 0x82, 0x3d, 0xbb,
- 0x09, 0x6c, 0xd2, 0x3d, 0x5b, 0x60, 0xc8, 0x3d, 0x83, 0x5a, 0x89, 0xbd,
- 0x0b, 0x0d, 0xad, 0xbd, 0xbe, 0xa2, 0x8f, 0x3b, 0x7f, 0x13, 0x7c, 0xbd,
- 0x30, 0x34, 0xd0, 0x3d, 0xa4, 0xa5, 0x87, 0x3d, 0x72, 0xec, 0xd0, 0xbd,
- 0x19, 0x8d, 0x51, 0xbd, 0xbc, 0xd2, 0x13, 0x3e, 0xd2, 0x90, 0xe3, 0x3d,
- 0x72, 0xd1, 0xcf, 0xbd, 0x6d, 0xc7, 0x40, 0xbd, 0x58, 0x3b, 0x12, 0x3e,
- 0x3f, 0x5d, 0x1b, 0xbd, 0x03, 0xeb, 0x35, 0xbe, 0xe2, 0xca, 0x02, 0xbe,
- 0x9e, 0x76, 0x43, 0x3e, 0x54, 0x4d, 0x8e, 0x3d, 0x33, 0x33, 0xdf, 0x3d,
- 0x42, 0xbd, 0xd4, 0x3d, 0x5a, 0x07, 0x01, 0x3d, 0xfa, 0xb7, 0x36, 0xbc,
- 0x17, 0xe3, 0xa3, 0xbd, 0xd6, 0x2f, 0x0e, 0x3d, 0x38, 0x07, 0xdd, 0xbd,
- 0xe3, 0x8e, 0x4c, 0x3d, 0xb5, 0x3f, 0x27, 0x3e, 0x0a, 0xfa, 0xfa, 0x3d,
- 0xdd, 0x63, 0xde, 0xbd, 0x2e, 0x7d, 0x20, 0x3e, 0x89, 0x0e, 0xa2, 0xbc,
- 0xe1, 0xc7, 0xab, 0xbc, 0x89, 0xfa, 0x4c, 0x3c, 0x52, 0x01, 0x65, 0xbc,
- 0x2a, 0x58, 0x13, 0x3d, 0xce, 0xb3, 0xe5, 0xbd, 0xdc, 0x07, 0xb1, 0xbb,
- 0xce, 0xf0, 0x01, 0x3e, 0x1c, 0x18, 0xcf, 0xbc, 0x9b, 0x50, 0x21, 0x3e,
- 0x85, 0xf5, 0x02, 0x3c, 0x18, 0xea, 0xcf, 0xbd, 0x1d, 0x86, 0xd7, 0xbd,
- 0xf0, 0x34, 0x23, 0xbf, 0x76, 0x36, 0xcf, 0xbc, 0xb1, 0x92, 0x72, 0xbd,
- 0xc3, 0x21, 0x88, 0xbe, 0x5f, 0xd4, 0x8b, 0xbe, 0x24, 0xc0, 0xdb, 0x3e,
- 0xf8, 0xb4, 0x98, 0x3d, 0x0e, 0x22, 0xe8, 0xbb, 0xe7, 0x19, 0xf0, 0x3d,
- 0xf2, 0x50, 0x6f, 0xbe, 0xa7, 0x60, 0xd2, 0xbe, 0x8e, 0xf9, 0xb9, 0x3d,
- 0xaf, 0xb1, 0x7c, 0xbc, 0xc2, 0x3b, 0x1a, 0x3e, 0x19, 0x9d, 0x7b, 0x3e,
- 0x4a, 0x63, 0x64, 0x3d, 0x61, 0xaa, 0xe5, 0x3d, 0x70, 0x77, 0x12, 0x3f,
- 0x6b, 0xe8, 0x2a, 0xbd, 0x37, 0xc2, 0x00, 0x3f, 0xd7, 0x63, 0xaa, 0xbe,
- 0x59, 0x59, 0x46, 0x3e, 0x27, 0x1b, 0xc0, 0xbd, 0xbd, 0x0f, 0xad, 0xbd,
- 0x3c, 0x10, 0xef, 0x3e, 0xc5, 0xf7, 0xb1, 0xbd, 0x39, 0x41, 0x47, 0x3d,
- 0x1c, 0xb8, 0x1d, 0x3f, 0x8c, 0xf3, 0x3b, 0x3d, 0xaa, 0x8f, 0x6c, 0xbd,
- 0xb9, 0xed, 0xaf, 0xbe, 0x73, 0x3e, 0xf5, 0x3d, 0xc1, 0x4d, 0x98, 0xbe,
- 0x81, 0x19, 0x1f, 0xbe, 0xc2, 0xac, 0xd2, 0x3e, 0x23, 0x75, 0xe0, 0xbc,
- 0x1b, 0x16, 0xc7, 0xbd, 0x00, 0x19, 0xd8, 0xbd, 0x7b, 0x0f, 0x24, 0xbe,
- 0x12, 0xaa, 0x8c, 0x3c, 0x46, 0x0c, 0x84, 0xbd, 0x50, 0x2e, 0xce, 0x3d,
- 0x34, 0x83, 0x1a, 0xbd, 0xf0, 0xb8, 0x99, 0xbe, 0x26, 0x71, 0x18, 0xbe,
- 0x91, 0x1b, 0xcb, 0xbc, 0x23, 0x23, 0x12, 0x3d, 0x8e, 0x32, 0x82, 0xbe,
- 0x2f, 0x7e, 0xbd, 0xbd, 0x47, 0x23, 0x6a, 0xbe, 0x55, 0x1d, 0x7a, 0x3e,
- 0x45, 0x25, 0x67, 0x3e, 0x2f, 0x88, 0xc1, 0x3d, 0x47, 0xbe, 0xe0, 0x3e,
- 0x07, 0x56, 0x2c, 0xbe, 0xf7, 0xc9, 0xf6, 0x3c, 0x22, 0x5a, 0x87, 0xbe,
- 0x1a, 0xf5, 0xe9, 0x3d, 0x31, 0x85, 0x0c, 0xbf, 0xee, 0x9b, 0xe0, 0xbd,
- 0x8c, 0xf0, 0x10, 0x3e, 0x1c, 0xae, 0x16, 0x3e, 0x92, 0xc4, 0xc5, 0xbc,
- 0x04, 0x65, 0xb4, 0x3e, 0x93, 0x6c, 0xaf, 0xbe, 0x5b, 0x43, 0x0a, 0xbe,
- 0x18, 0x3f, 0xac, 0xbe, 0x36, 0xa6, 0x71, 0xbe, 0xcd, 0x86, 0xfe, 0xbd,
- 0xf3, 0xc6, 0x28, 0x3e, 0x5c, 0xd8, 0x90, 0x3d, 0x36, 0x46, 0x85, 0x3e,
- 0x92, 0xe5, 0xdc, 0xbd, 0xd0, 0x43, 0x2b, 0x3f, 0x62, 0xbe, 0x67, 0xbd,
- 0x79, 0x36, 0xda, 0x3b, 0xe2, 0x1e, 0xdc, 0xbe, 0x92, 0x61, 0xe8, 0xbe,
- 0x7e, 0x6d, 0x7c, 0xbe, 0xfc, 0xe9, 0xa4, 0xbe, 0x07, 0x13, 0x15, 0xbf,
- 0x28, 0xf2, 0x06, 0x3e, 0x78, 0xec, 0x8d, 0xbe, 0x24, 0x4c, 0x4a, 0x3e,
- 0xa3, 0x94, 0x61, 0xbd, 0xb7, 0xdd, 0x28, 0xbe, 0x68, 0x43, 0x63, 0x3e,
- 0x42, 0x9e, 0x4d, 0xbd, 0x18, 0x29, 0xc7, 0xbe, 0x5d, 0xc2, 0xc6, 0x3c,
- 0x00, 0x11, 0x2f, 0x3d, 0x06, 0xc5, 0xc2, 0xbd, 0x3f, 0xc9, 0xa3, 0x3e,
- 0x9f, 0x62, 0x4c, 0xbe, 0x67, 0x26, 0xec, 0x3e, 0x8a, 0xee, 0xf0, 0x3d,
- 0x4b, 0x51, 0xac, 0xbc, 0x79, 0x81, 0x33, 0x3d, 0x70, 0x1c, 0xe6, 0xbc,
- 0x0b, 0x0e, 0x31, 0x3e, 0x91, 0xdc, 0x09, 0xbf, 0x3e, 0xa1, 0x58, 0xbd,
- 0x63, 0x93, 0x0c, 0x3e, 0xe2, 0x32, 0xae, 0x3e, 0xad, 0x1b, 0x1e, 0x3e,
- 0x2d, 0x1c, 0xdf, 0xbe, 0xf8, 0xcc, 0x11, 0xbe, 0x6c, 0x34, 0xea, 0xbe,
- 0x2f, 0x0f, 0xd1, 0x3e, 0xae, 0xd0, 0x76, 0xbd, 0xd4, 0x95, 0x8c, 0xbe,
- 0xf0, 0xbd, 0x8d, 0xbe, 0x04, 0x59, 0x80, 0xbe, 0x71, 0x22, 0xa6, 0xbe,
- 0x5a, 0x4d, 0x0a, 0xbe, 0xf9, 0xe4, 0x65, 0x3e, 0x25, 0xee, 0x93, 0x3e,
- 0x98, 0x2c, 0xca, 0xbe, 0xe6, 0xcb, 0xd0, 0xbe, 0x1b, 0xb9, 0x3f, 0x3e,
- 0xff, 0x65, 0xfa, 0xbe, 0x13, 0xbc, 0x77, 0x3c, 0x41, 0xc7, 0x9e, 0x3b,
- 0x77, 0xb6, 0x23, 0x3e, 0xc0, 0xae, 0x40, 0x3e, 0xd1, 0x71, 0xa0, 0xbd,
- 0xc0, 0xcb, 0x66, 0xbd, 0x6d, 0x6f, 0xbb, 0x3e, 0x80, 0x60, 0xe6, 0xbc,
- 0x2e, 0x38, 0xa4, 0xbe, 0x74, 0xa5, 0xa4, 0xbc, 0xde, 0x63, 0x1f, 0x3e,
- 0x99, 0x12, 0x0a, 0xbe, 0xe5, 0xaa, 0xd1, 0x3e, 0x5b, 0xa4, 0x93, 0xbe,
- 0x82, 0x7f, 0x87, 0x3e, 0x0a, 0x7c, 0xa4, 0x3d, 0x5c, 0xde, 0xec, 0x3e,
- 0x19, 0x19, 0x97, 0xbe, 0x33, 0x33, 0x73, 0xbd, 0x93, 0x19, 0x96, 0xbe,
- 0x55, 0xa2, 0x01, 0xbb, 0xba, 0x42, 0xd5, 0xbe, 0x84, 0xf7, 0x03, 0x3e,
- 0xc4, 0xac, 0x87, 0x3e, 0x40, 0x46, 0x2e, 0x3e, 0x5a, 0x3c, 0x94, 0xbe,
- 0xe0, 0x95, 0x38, 0x3e, 0x03, 0xa8, 0xf9, 0x3e, 0xdf, 0xee, 0x8e, 0x3d,
- 0xba, 0xd3, 0x02, 0xbf, 0x55, 0xbd, 0x36, 0x3e, 0x63, 0x8f, 0x7b, 0x3e,
- 0xc9, 0x6c, 0x74, 0xbe, 0xd8, 0x03, 0x47, 0xbd, 0x47, 0xae, 0xb7, 0x3d,
- 0x83, 0xbc, 0xcd, 0x3e, 0xd7, 0xf6, 0x1c, 0xbe, 0x48, 0x6f, 0xbd, 0x3e,
- 0xec, 0x58, 0xe7, 0x3e, 0xeb, 0x0b, 0x41, 0x3d, 0x43, 0xfa, 0xa4, 0xbd,
- 0x5b, 0xad, 0x43, 0xbe, 0x26, 0x20, 0x3a, 0xbe, 0xcf, 0x1a, 0x53, 0xbd,
- 0x99, 0x5f, 0x34, 0x3e, 0x12, 0xca, 0x9c, 0x3d, 0x3a, 0x9d, 0xc3, 0xbe,
- 0x8d, 0x9e, 0x51, 0xbd, 0x9e, 0x20, 0xb5, 0xbe, 0x8b, 0xfb, 0x3d, 0x3c,
- 0x13, 0xa0, 0x90, 0xbe, 0x0b, 0xd2, 0x5e, 0xbe, 0x6d, 0x04, 0x83, 0x3e,
- 0x96, 0xed, 0x4c, 0x3e, 0x77, 0xe6, 0x2b, 0x3c, 0x77, 0xe1, 0xb5, 0xbd,
- 0xf0, 0xd5, 0x0c, 0xbe, 0x9d, 0x13, 0x09, 0xbd, 0xf5, 0x76, 0x98, 0x3e,
- 0x3e, 0x92, 0x65, 0xbc, 0xa4, 0x93, 0x35, 0x3d, 0x39, 0xde, 0xd3, 0xbd,
- 0x61, 0xbc, 0x3c, 0xbe, 0x69, 0x90, 0x77, 0xbe, 0xd6, 0xb0, 0xcf, 0xbc,
- 0xd6, 0xe1, 0xac, 0x3d, 0x4e, 0x0d, 0xf5, 0xbd, 0xfb, 0x0b, 0xb0, 0x3e,
- 0x3e, 0x4d, 0x85, 0xbd, 0xa1, 0x53, 0x73, 0xbe, 0x7b, 0x07, 0x4a, 0x3d,
- 0x5f, 0x47, 0x83, 0x3e, 0xda, 0xba, 0xdd, 0xbe, 0x5f, 0xc3, 0xa5, 0x3c,
- 0x82, 0x4a, 0xa3, 0x3d, 0xe7, 0x77, 0xd0, 0x3a, 0xce, 0x66, 0x47, 0xbe,
- 0x66, 0x29, 0x9d, 0x3e, 0x3d, 0x10, 0x38, 0x3d, 0x15, 0x41, 0x2d, 0x3e,
- 0x75, 0x94, 0xa1, 0xbd, 0xa0, 0x2d, 0xdb, 0xba, 0x03, 0x8c, 0xa4, 0x3c,
- 0x67, 0xe2, 0x72, 0xbd, 0x11, 0x62, 0x3a, 0x3e, 0x02, 0x14, 0x73, 0x3e,
- 0x8d, 0x67, 0x6d, 0x3d, 0x3c, 0x5e, 0x14, 0xbf, 0xb0, 0xd0, 0xd8, 0xbd,
- 0x22, 0x7e, 0x3a, 0xbe, 0xd3, 0x90, 0x0b, 0x3e, 0xcc, 0x98, 0x98, 0xbe,
- 0x79, 0x4c, 0x8d, 0x3e, 0x28, 0x4b, 0x7c, 0xbd, 0x3c, 0xb8, 0xc0, 0xbe,
- 0xba, 0x0d, 0x9b, 0x3e, 0x14, 0xdf, 0x0f, 0xbe, 0x56, 0x6c, 0xb6, 0xbe,
- 0x59, 0xd2, 0xe1, 0xbd, 0xef, 0xf3, 0xfe, 0x3d, 0x6a, 0xc0, 0x4b, 0x3b,
- 0x60, 0xe8, 0xdc, 0xbe, 0xaa, 0x59, 0x41, 0x3d, 0x43, 0xbe, 0x99, 0xbd,
- 0xe8, 0x4c, 0x1e, 0xbd, 0xcf, 0x10, 0x0f, 0x3e, 0xbd, 0xe2, 0x89, 0xbd,
- 0x32, 0xff, 0xaa, 0x3d, 0x82, 0x3a, 0x55, 0xbe, 0x75, 0x15, 0x07, 0x3e,
- 0xe3, 0xf2, 0x95, 0x3c, 0xf3, 0xbc, 0xd5, 0xbe, 0xdc, 0xee, 0x3a, 0x3e,
- 0xfe, 0xbb, 0x02, 0xbe, 0xdf, 0x4f, 0x40, 0x3e, 0x83, 0x51, 0x6b, 0xbe,
- 0x01, 0x6f, 0x9b, 0xbe, 0x7e, 0xec, 0x3d, 0x3d, 0x11, 0xd8, 0xda, 0x3d,
- 0xfc, 0xa5, 0x74, 0xbd, 0xb3, 0x3c, 0xe9, 0x3d, 0xde, 0x60, 0x2b, 0x3d,
- 0xd2, 0xea, 0x0a, 0xbe, 0x51, 0x39, 0x93, 0xbc, 0x93, 0x71, 0x9c, 0xbe,
- 0x9c, 0x7b, 0x5c, 0x3e, 0x86, 0x94, 0x19, 0x3e, 0xa0, 0x91, 0x0b, 0xbf,
- 0x6a, 0x0e, 0xc7, 0x3e, 0x61, 0xc2, 0x3b, 0xbe, 0x84, 0x83, 0xb5, 0xbc,
- 0x4f, 0x74, 0x24, 0xbe, 0xb7, 0x35, 0xae, 0x3e, 0xd4, 0xbd, 0x23, 0x3e,
- 0xbe, 0xfe, 0x83, 0x3e, 0x98, 0x54, 0x0e, 0xbe, 0x46, 0x1e, 0x48, 0xbf,
- 0xa5, 0xc2, 0x7f, 0xbe, 0x0c, 0x38, 0xf8, 0x3c, 0x00, 0xe7, 0x39, 0xbf,
- 0x9e, 0x6b, 0xdf, 0x3e, 0x52, 0x49, 0x08, 0xbf, 0x64, 0xd1, 0x05, 0x3c,
- 0xfe, 0xaf, 0x07, 0x3e, 0x76, 0x33, 0x22, 0xbe, 0x27, 0x43, 0xce, 0xbe,
- 0x24, 0x84, 0x22, 0xbe, 0x67, 0x7b, 0x25, 0x3e, 0xa4, 0x5c, 0xe6, 0xbe,
- 0x59, 0x74, 0x9e, 0x3e, 0x59, 0x9a, 0x8a, 0x3e, 0x16, 0x6e, 0x8c, 0x3e,
- 0x72, 0x70, 0xaf, 0xbe, 0xf0, 0x50, 0xeb, 0xbe, 0xe5, 0xbd, 0xa5, 0x3e,
- 0xec, 0xab, 0x13, 0xbd, 0x58, 0x76, 0x9d, 0xbe, 0x40, 0x07, 0x33, 0x3d,
- 0xa4, 0xfc, 0x59, 0x3e, 0x46, 0xda, 0x3f, 0xbd, 0x8c, 0xfd, 0x8c, 0xbe,
- 0x42, 0x88, 0x2d, 0x3e, 0x1f, 0x99, 0x1c, 0xbf, 0xa1, 0x20, 0x75, 0x3d,
- 0x1e, 0x0d, 0x22, 0xbe, 0xb4, 0x86, 0x61, 0x3e, 0x5c, 0x13, 0xed, 0x3d,
- 0xd0, 0xf8, 0xae, 0x3e, 0x5a, 0x51, 0x9f, 0xbe, 0x38, 0x63, 0x87, 0xbe,
- 0x35, 0x8d, 0x7a, 0x3b, 0x71, 0xe1, 0xa9, 0xbd, 0x3c, 0x78, 0x2c, 0xbd,
- 0x1b, 0xb4, 0x09, 0xbd, 0x7d, 0x5c, 0xca, 0xbd, 0x59, 0x94, 0x4c, 0xbf,
- 0xbe, 0xa7, 0x15, 0x3d, 0xf4, 0xa2, 0x0b, 0xbf, 0x17, 0xd4, 0x37, 0x3e,
- 0x44, 0x37, 0xd5, 0xbe, 0xc4, 0xd5, 0x09, 0xbe, 0xc1, 0xad, 0x50, 0x3c,
- 0x5d, 0xb4, 0x5f, 0x3e, 0x37, 0x38, 0xe6, 0xbe, 0x10, 0xd6, 0xc9, 0xbe,
- 0xab, 0x68, 0xbe, 0xbe, 0xe8, 0x35, 0x87, 0xbe, 0x25, 0x02, 0x43, 0xbe,
- 0x6b, 0xa8, 0x02, 0x3e, 0x6a, 0x9e, 0x12, 0xbf, 0x82, 0x2b, 0xd2, 0x3d,
- 0xd7, 0xca, 0x6c, 0x3e, 0x4c, 0x3c, 0x62, 0x3e, 0x61, 0x15, 0x48, 0xbd,
- 0xa9, 0x44, 0x09, 0x3e, 0x94, 0x59, 0x84, 0xbc, 0xa9, 0x77, 0x82, 0xbe,
- 0x1c, 0xa8, 0x65, 0xbe, 0xdd, 0x97, 0x27, 0x3e, 0x2d, 0x8e, 0xe6, 0xbe,
- 0x72, 0xaf, 0xca, 0xbe, 0x03, 0xe5, 0x42, 0x3e, 0x6e, 0xba, 0xbd, 0xbd,
- 0xbf, 0x33, 0xa6, 0x3e, 0x4f, 0xac, 0xec, 0xbe, 0xe5, 0x41, 0x44, 0xbc,
- 0x71, 0xbd, 0x7f, 0x3e, 0xdc, 0xe5, 0xbb, 0xbe, 0xc1, 0xb4, 0x09, 0xbf,
- 0xb5, 0x14, 0x38, 0x3e, 0x09, 0xb7, 0xa9, 0xbd, 0xe7, 0x7d, 0x07, 0xbe,
- 0x4e, 0x36, 0x4c, 0xbe, 0x74, 0x18, 0xe7, 0xbe, 0xb1, 0x97, 0x18, 0xbe,
- 0xd4, 0xd4, 0x1b, 0xbd, 0xfe, 0xac, 0xbb, 0x3d, 0x59, 0x05, 0x9a, 0xbe,
- 0x27, 0x53, 0x65, 0xbf, 0x79, 0x65, 0x05, 0xbe, 0x11, 0x55, 0x0d, 0xbf,
- 0x7d, 0x95, 0x04, 0xbe, 0x7f, 0xe5, 0x0e, 0xbd, 0x35, 0xea, 0xa6, 0xbb,
- 0x38, 0xe9, 0x12, 0x3e, 0x3a, 0x9b, 0x3e, 0xbe, 0xc2, 0xa9, 0xf8, 0xbd,
- 0xc9, 0x58, 0x90, 0xbe, 0x85, 0x3c, 0x87, 0xbe, 0x8b, 0x1b, 0x66, 0x3e,
- 0x0b, 0xaf, 0xf5, 0x3d, 0x13, 0x42, 0x83, 0xbd, 0x0c, 0x24, 0x56, 0x3d,
- 0x9b, 0x0d, 0xac, 0xbe, 0xd8, 0x5c, 0x2c, 0xbe, 0x64, 0xb6, 0x15, 0x3e,
- 0x87, 0xd7, 0x42, 0x3d, 0x2e, 0x4e, 0xe9, 0xbd, 0xf5, 0xf1, 0x30, 0x3e,
- 0xb8, 0xfc, 0x2f, 0x3e, 0x77, 0x55, 0x08, 0xbe, 0xa2, 0x8d, 0x0c, 0xbe,
- 0x3a, 0x53, 0xcb, 0xbe, 0xbc, 0xdb, 0xad, 0xbd, 0x1a, 0x05, 0x4f, 0xbe,
- 0xfb, 0xc5, 0x33, 0x3f, 0x3e, 0x23, 0x88, 0x3e, 0xcf, 0x37, 0x85, 0xbb,
- 0xed, 0x29, 0x35, 0x3e, 0xf4, 0x7b, 0xff, 0xbe, 0x38, 0xaa, 0xfb, 0x3d,
- 0x08, 0x38, 0x0d, 0xbe, 0x2f, 0x95, 0xa0, 0x3e, 0x72, 0xae, 0xea, 0x3e,
- 0x72, 0xe4, 0xa0, 0x3d, 0xe5, 0xca, 0xe4, 0x3c, 0x6c, 0x3f, 0x23, 0xbe,
- 0xf1, 0xcd, 0xc2, 0xbd, 0xf3, 0x69, 0x98, 0x3d, 0xdc, 0x7e, 0x86, 0x3e,
- 0x5a, 0x2d, 0x83, 0x3e, 0x99, 0x20, 0x80, 0xbe, 0x0f, 0x62, 0x03, 0x3f,
- 0xbc, 0xae, 0xee, 0xbc, 0x55, 0x03, 0xb2, 0x3e, 0x0e, 0xc1, 0x93, 0x3e,
- 0x5f, 0x87, 0x8c, 0xbe, 0xb8, 0x4f, 0xa1, 0xbe, 0x41, 0x2f, 0xc8, 0x3e,
- 0x0a, 0x46, 0x59, 0xbd, 0x56, 0xb4, 0x48, 0x3d, 0xe5, 0x3d, 0xf3, 0xbe,
- 0x56, 0x7c, 0x13, 0x3e, 0x7c, 0xaf, 0x60, 0x3d, 0x40, 0xb5, 0x6b, 0xbe,
- 0x39, 0x36, 0x57, 0x3e, 0xd3, 0x96, 0x79, 0x3e, 0x2d, 0x09, 0x08, 0xbe,
- 0x43, 0xe6, 0x47, 0xbe, 0x3d, 0x9f, 0xf6, 0xbd, 0xb4, 0xb5, 0x87, 0xbd,
- 0x53, 0x89, 0x14, 0x3e, 0x36, 0xb9, 0x23, 0xbe, 0x30, 0xae, 0xf8, 0x3d,
- 0x33, 0xda, 0x76, 0x3e, 0x98, 0x5e, 0x54, 0xbd, 0xe5, 0xe5, 0x04, 0xbe,
- 0x15, 0x88, 0xda, 0xbe, 0xab, 0x0f, 0x20, 0x3e, 0x02, 0x2c, 0xd6, 0x3d,
- 0x3a, 0xa9, 0x52, 0xbe, 0xf2, 0xd1, 0x31, 0xbd, 0xb1, 0x6d, 0x4b, 0xbc,
- 0x8b, 0x73, 0x92, 0x3d, 0x15, 0x70, 0xaf, 0x3e, 0x06, 0x8e, 0x9b, 0xbc,
- 0x89, 0x82, 0xfe, 0xbd, 0xaf, 0x5e, 0x0e, 0x3e, 0x6f, 0xb7, 0xab, 0x3e,
- 0x16, 0x5a, 0x0a, 0x3f, 0xbc, 0x14, 0xc3, 0xbe, 0xf3, 0x03, 0xe6, 0xbe,
- 0xa2, 0xfa, 0x12, 0xbe, 0xfa, 0xb9, 0x3b, 0x3e, 0x0d, 0x5e, 0x14, 0xbd,
- 0xa3, 0xd3, 0xcf, 0xbe, 0x2c, 0xc5, 0x5e, 0x3e, 0x23, 0x46, 0x2e, 0x3e,
- 0xa4, 0x73, 0xc7, 0xbe, 0xb4, 0x89, 0x17, 0x3f, 0x02, 0x0d, 0x39, 0x3e,
- 0x22, 0x5c, 0xf8, 0x3d, 0x49, 0xe4, 0x40, 0xbe, 0x3e, 0x1e, 0x85, 0xbb,
- 0x5e, 0xb3, 0x28, 0x3f, 0x07, 0xdd, 0xfc, 0xbe, 0xb5, 0xae, 0x89, 0x3e,
- 0x1b, 0x98, 0x77, 0x3e, 0x59, 0xb7, 0x8e, 0x3d, 0x70, 0x68, 0x4d, 0xbd,
- 0x9e, 0x92, 0x90, 0xbe, 0x34, 0x0a, 0x9e, 0x3e, 0x06, 0x3e, 0x08, 0x3d,
- 0xff, 0xbb, 0xa8, 0x3b, 0xac, 0xd7, 0x20, 0x3d, 0x11, 0x00, 0xd8, 0x3d,
- 0xc0, 0x11, 0x6e, 0xbd, 0x45, 0xbf, 0x9e, 0xbe, 0x08, 0x36, 0x25, 0x3e,
- 0xf0, 0x5d, 0x1a, 0x3e, 0x48, 0xc7, 0xc1, 0x3e, 0xcd, 0x36, 0x77, 0x3d,
- 0x04, 0xdf, 0xe9, 0x3d, 0x5b, 0x62, 0x68, 0xbe, 0xf1, 0x27, 0x94, 0xbe,
- 0xe7, 0x2a, 0x90, 0x3e, 0x4e, 0x5d, 0xea, 0xbe, 0xf9, 0x19, 0x4c, 0x3c,
- 0xe1, 0x05, 0x39, 0xbf, 0xcd, 0x20, 0x07, 0xbe, 0x39, 0x10, 0x2d, 0xbc,
- 0x46, 0x98, 0x16, 0x3e, 0x90, 0x9e, 0x04, 0xbf, 0x5d, 0x68, 0x19, 0x3d,
- 0x3f, 0x4b, 0x8c, 0x3e, 0x07, 0x74, 0x39, 0x3e, 0xdf, 0x7d, 0xc3, 0xbe,
- 0x9f, 0x6c, 0x84, 0x3e, 0x44, 0x1a, 0xb5, 0x3e, 0x9a, 0xba, 0x01, 0x3c,
- 0x90, 0x89, 0x82, 0xbe, 0x88, 0xd4, 0x1c, 0xbd, 0xca, 0x43, 0xca, 0x3c,
- 0x51, 0xa1, 0xac, 0xbd, 0x30, 0xe0, 0xa8, 0x3c, 0x41, 0x64, 0x66, 0xbd,
- 0xe8, 0x7a, 0xa3, 0x3e, 0x03, 0x69, 0x4a, 0x39, 0xd0, 0xe2, 0x90, 0x3e,
- 0xad, 0xb7, 0xb6, 0x3e, 0xc3, 0x1d, 0xcf, 0x36, 0xae, 0x3a, 0xa0, 0x3e,
- 0xc0, 0xe1, 0x64, 0x3e, 0x7f, 0x2d, 0x37, 0xbf, 0x62, 0x4d, 0xd1, 0x3c,
- 0xda, 0x1c, 0xdb, 0xbe, 0xcb, 0x5b, 0x49, 0x3e, 0x79, 0x22, 0xb7, 0xbe,
- 0x3f, 0x92, 0x80, 0xbf, 0x1b, 0x4d, 0xc6, 0x3e, 0x97, 0xe6, 0xdf, 0xbd,
- 0x84, 0x6b, 0x5e, 0x3d, 0xb3, 0x8c, 0x99, 0xbe, 0xc2, 0x67, 0xc9, 0xbd,
- 0xdd, 0x97, 0x62, 0x3c, 0xb2, 0xa9, 0x91, 0xbd, 0xf8, 0x6a, 0x00, 0xbe,
- 0x7b, 0x97, 0x1a, 0x3d, 0x3b, 0xb9, 0x29, 0x3d, 0xd6, 0x9b, 0xca, 0x3d,
- 0xa8, 0xe2, 0xad, 0x3c, 0x76, 0xaf, 0xe2, 0xbe, 0xec, 0xf2, 0xf5, 0x3d,
- 0xcb, 0x43, 0x90, 0xbd, 0x60, 0x72, 0xa5, 0xbe, 0x8d, 0xaa, 0x08, 0x3d,
- 0x36, 0xcf, 0x53, 0xbe, 0xef, 0xb3, 0x8e, 0x3e, 0x1b, 0x56, 0x18, 0x3d,
- 0xf1, 0x93, 0x57, 0x3c, 0x7a, 0x0c, 0x80, 0x3e, 0xb6, 0x49, 0x52, 0xbc,
- 0xf2, 0xde, 0xd6, 0x3e, 0x85, 0x33, 0x0b, 0xbf, 0xad, 0xfd, 0x4d, 0xbd,
- 0xa8, 0xb0, 0xa4, 0x3d, 0x0d, 0x14, 0xc4, 0xbe, 0x20, 0x03, 0x8e, 0xbd,
- 0x6b, 0x6f, 0xfb, 0xbc, 0xc7, 0xe4, 0x1f, 0xbe, 0x21, 0x58, 0xca, 0x3c,
- 0xbc, 0x6b, 0xd5, 0x3d, 0x45, 0x61, 0xb9, 0xbd, 0x45, 0xde, 0x2e, 0x3e,
- 0x13, 0xc6, 0x37, 0x3d, 0xe4, 0x5f, 0xb0, 0xbe, 0xee, 0x86, 0x0a, 0xbe,
- 0xf3, 0xeb, 0xa4, 0xbe, 0x51, 0xc8, 0x45, 0xbc, 0x98, 0xdf, 0xb3, 0x3e,
- 0x55, 0x54, 0xf4, 0x3c, 0x18, 0xff, 0xe1, 0xbd, 0x5c, 0x34, 0x76, 0xbe,
- 0x12, 0x18, 0x73, 0x3d, 0xae, 0x6a, 0xe8, 0xbc, 0x53, 0x83, 0x39, 0x3e,
- 0x64, 0xfc, 0xc6, 0xbd, 0x39, 0x18, 0xe3, 0xbd, 0x8b, 0xdc, 0x55, 0xbe,
- 0x96, 0xc2, 0x22, 0xbd, 0xbf, 0x58, 0x18, 0x3c, 0x67, 0xe2, 0xb8, 0x3e,
- 0x51, 0x35, 0x5e, 0x3d, 0xec, 0xa6, 0x84, 0x3c, 0xe4, 0x3b, 0x48, 0xbd,
- 0x5d, 0x46, 0x79, 0x3e, 0x1c, 0xe9, 0x2a, 0x3e, 0xe3, 0x81, 0x9b, 0xbe,
- 0xf0, 0x37, 0x30, 0x3d, 0x66, 0x95, 0xb6, 0x3d, 0x49, 0x57, 0x58, 0x3e,
- 0x9b, 0xea, 0xb7, 0xbd, 0x01, 0x8d, 0xfe, 0xbd, 0x79, 0x0e, 0x64, 0xbe,
- 0x9d, 0xa2, 0x6c, 0x3d, 0xf0, 0xb7, 0x21, 0x3d, 0x98, 0x9a, 0x0f, 0x3e,
- 0xd0, 0xec, 0x0e, 0x3c, 0x41, 0x13, 0xb2, 0x3e, 0xa8, 0x22, 0x84, 0x3e,
- 0x11, 0x5a, 0x11, 0xbc, 0xed, 0xab, 0xaa, 0x3d, 0xe8, 0xc5, 0x37, 0x3e,
- 0x9f, 0x9a, 0xaa, 0xbd, 0x56, 0x30, 0x86, 0x3e, 0x10, 0x69, 0x9e, 0xbe,
- 0xbe, 0x89, 0xa6, 0xbe, 0x0a, 0x6f, 0x1d, 0x3d, 0x2d, 0x47, 0x50, 0x3e,
- 0xdd, 0x58, 0x69, 0xbe, 0x6f, 0x2f, 0xc0, 0xbd, 0x93, 0xea, 0xdd, 0xbd,
- 0xc5, 0x28, 0xe2, 0xbe, 0x4a, 0x98, 0xa3, 0xbe, 0xb9, 0x0f, 0x5f, 0x3e,
- 0x42, 0x92, 0xc9, 0x3d, 0x08, 0x32, 0x2d, 0x3e, 0x4c, 0xaf, 0x9d, 0xbe,
- 0xa4, 0x48, 0x30, 0x3e, 0x05, 0x7b, 0x3c, 0x3c, 0xa4, 0x2d, 0x3e, 0x3d,
- 0xcb, 0x40, 0x37, 0xbe, 0x78, 0xc9, 0x11, 0xbe, 0xe0, 0xcb, 0x13, 0xbf,
- 0xfe, 0xe8, 0x23, 0xbf, 0xeb, 0x68, 0x6e, 0x3e, 0x24, 0xc8, 0x30, 0xbe,
- 0x60, 0x37, 0xed, 0x3c, 0x3d, 0x5f, 0x6d, 0x3d, 0xf0, 0xbc, 0x7a, 0xbe,
- 0x5a, 0xd9, 0x6a, 0xbe, 0x88, 0x4f, 0x0b, 0xbd, 0xf3, 0x6b, 0x4a, 0xbd,
- 0xf0, 0x27, 0x13, 0xbf, 0xcf, 0x32, 0xec, 0xbd, 0xeb, 0x06, 0xe0, 0xbe,
- 0x29, 0xd5, 0xdf, 0xbb, 0x23, 0xef, 0x5c, 0x3e, 0xa5, 0x17, 0x18, 0x3d,
- 0x2d, 0x27, 0x1f, 0x3e, 0x8e, 0xd7, 0x89, 0xbe, 0x30, 0xfe, 0x43, 0x3e,
- 0xbc, 0x6a, 0xbb, 0x3e, 0x48, 0x27, 0xd2, 0xbe, 0x21, 0x4f, 0x83, 0x3e,
- 0xca, 0xad, 0x82, 0xbd, 0xd3, 0x95, 0x2b, 0xbe, 0xc9, 0x75, 0x52, 0x3d,
- 0xd9, 0x08, 0x03, 0xbf, 0x4c, 0xc9, 0x24, 0x3d, 0xa1, 0x62, 0x28, 0x3d,
- 0x7c, 0xda, 0xa4, 0xbd, 0xdd, 0x6c, 0xfb, 0xbd, 0xd6, 0x06, 0x8a, 0xbe,
- 0x36, 0x35, 0x89, 0xbe, 0xef, 0xb8, 0xda, 0x3d, 0x31, 0x5f, 0x21, 0xbe,
- 0xf8, 0xff, 0xc9, 0xbe, 0x96, 0x2d, 0x32, 0xbf, 0x47, 0x2a, 0xf3, 0xbc,
- 0x0b, 0x94, 0x05, 0x3e, 0x15, 0xb0, 0xfb, 0x3d, 0x91, 0xf0, 0xbd, 0x3d,
- 0xa3, 0xed, 0x4a, 0x3e, 0xc6, 0x7b, 0x37, 0xbe, 0x11, 0x32, 0xa9, 0x3d,
- 0x67, 0x4d, 0xa1, 0x3e, 0xd7, 0xc1, 0x34, 0x3d, 0xfc, 0x59, 0x13, 0xbe,
- 0xce, 0x96, 0x4e, 0x3c, 0x79, 0x2e, 0x21, 0xbf, 0x7d, 0x8b, 0x97, 0x3e,
- 0x87, 0x8e, 0x1a, 0xbd, 0x13, 0x8c, 0x00, 0xbd, 0xe2, 0x28, 0xb8, 0x3e,
- 0xdb, 0x59, 0x86, 0xbd, 0xf3, 0x38, 0xa1, 0xbd, 0x9a, 0x80, 0x1f, 0x3e,
- 0xc6, 0x5f, 0xf1, 0xbd, 0xd2, 0x0c, 0x35, 0xbd, 0xda, 0x87, 0x24, 0x3e,
- 0xcf, 0x2b, 0x04, 0xbe, 0x34, 0xd4, 0x45, 0x3e, 0xc2, 0x7b, 0xe3, 0x3c,
- 0xc3, 0x2e, 0x85, 0x3e, 0x73, 0x09, 0x08, 0x3e, 0x92, 0x5a, 0x8e, 0x3c,
- 0x3f, 0x6d, 0x9b, 0x3c, 0x9c, 0x85, 0x86, 0x3e, 0x7f, 0x2e, 0x4e, 0x3e,
- 0xa9, 0xf6, 0x04, 0x3e, 0x5c, 0xde, 0x58, 0xbd, 0xc9, 0x52, 0xc0, 0xbd,
- 0x80, 0x73, 0x0a, 0x3e, 0xa0, 0xc7, 0xeb, 0x3e, 0x50, 0xc6, 0x61, 0xbd,
- 0x30, 0xe3, 0x6e, 0x3e, 0x50, 0xd8, 0x4f, 0xbe, 0x12, 0xbb, 0x65, 0x3d,
- 0xd2, 0xbc, 0x41, 0xbe, 0x93, 0x7a, 0xa6, 0xbe, 0x13, 0x0d, 0x82, 0x3e,
- 0x65, 0x57, 0x50, 0x3d, 0xfb, 0x43, 0xa2, 0xbe, 0xc0, 0xbd, 0xa0, 0x3d,
- 0x52, 0xa1, 0x4f, 0xbf, 0x5b, 0xfb, 0x95, 0xbe, 0x43, 0x90, 0x8c, 0x3e,
- 0xe7, 0x3c, 0x43, 0xbc, 0x4d, 0x1a, 0xb3, 0xbe, 0xc8, 0xf0, 0x33, 0xbe,
- 0x08, 0xfd, 0x85, 0xbe, 0xac, 0xb8, 0x0e, 0x3c, 0xb9, 0x83, 0x50, 0x3e,
- 0x8d, 0xd5, 0xa0, 0xbd, 0x8f, 0x9b, 0xf9, 0x3d, 0x3b, 0x7c, 0x82, 0x3e,
- 0x85, 0x04, 0xe7, 0x3d, 0x01, 0x61, 0x86, 0x3e, 0x7c, 0x21, 0x88, 0xbe,
- 0x62, 0x0f, 0x15, 0xbe, 0x3b, 0x4b, 0xd8, 0x3d, 0x7f, 0x2c, 0x94, 0x3e,
- 0xa0, 0x5b, 0xa8, 0x3d, 0x13, 0x24, 0x71, 0x3c, 0x4e, 0xee, 0x56, 0xbd,
- 0x51, 0x46, 0x9b, 0x3d, 0x25, 0x4c, 0x81, 0xbe, 0x4f, 0xcb, 0x2f, 0x3e,
- 0x37, 0x78, 0xb7, 0xbe, 0xaf, 0x61, 0x19, 0xbf, 0x9e, 0x96, 0x35, 0xbe,
- 0xa2, 0x49, 0xa1, 0xbe, 0x61, 0x78, 0x66, 0x3d, 0x5f, 0xc8, 0x3c, 0xbe,
- 0xca, 0x1a, 0xd1, 0x3d, 0xea, 0x1b, 0x99, 0xbe, 0xd3, 0x50, 0xa4, 0x3b,
- 0xba, 0x32, 0x05, 0x3d, 0xe5, 0x4f, 0x29, 0xbf, 0xc8, 0x9c, 0x91, 0xbc,
- 0xa6, 0x62, 0x0b, 0xbe, 0x47, 0x09, 0xfb, 0x3c, 0x1c, 0x30, 0x2e, 0xbf,
- 0xe7, 0xdd, 0x36, 0xbd, 0xe0, 0x28, 0xff, 0x3e, 0x41, 0x80, 0x67, 0xbd,
- 0xcf, 0x97, 0x63, 0xbe, 0x24, 0x83, 0x67, 0xbf, 0x15, 0xb5, 0xe9, 0xbe,
- 0xaa, 0xa5, 0xcd, 0xbd, 0xf2, 0xd3, 0x7d, 0xbe, 0xfc, 0x6d, 0x42, 0xbe,
- 0x50, 0x0c, 0x4c, 0xbe, 0x58, 0x5c, 0xb3, 0xbe, 0x2f, 0x23, 0x77, 0xbd,
- 0x3b, 0xcd, 0x83, 0x3e, 0xa6, 0x2f, 0xb0, 0xbe, 0x11, 0x29, 0x0a, 0x3f,
- 0xeb, 0x48, 0xda, 0xbd, 0x95, 0xd8, 0x18, 0x3d, 0x78, 0x9c, 0x14, 0x3e,
- 0x24, 0x23, 0x83, 0xbd, 0x9e, 0xe4, 0xaf, 0xbc, 0xe7, 0x34, 0x48, 0xbd,
- 0xdc, 0xbb, 0x12, 0x3e, 0xf3, 0xa6, 0xce, 0xbd, 0xb4, 0xa7, 0x30, 0x3e,
- 0x70, 0xfb, 0x39, 0xbf, 0x19, 0x75, 0x44, 0xbe, 0x29, 0xb9, 0x7c, 0x3e,
- 0xa5, 0xc0, 0xf6, 0x3c, 0x8d, 0xc6, 0xf4, 0x3c, 0x9e, 0xb9, 0x0d, 0xbf,
- 0x79, 0x52, 0x05, 0xbe, 0xff, 0xab, 0x09, 0x3e, 0xb0, 0xf0, 0x65, 0xbf,
- 0x94, 0x18, 0xa7, 0xbd, 0x8a, 0x45, 0xc3, 0x3e, 0x1c, 0xb3, 0xb8, 0x3e,
- 0x48, 0xce, 0x58, 0xbe, 0xfa, 0x82, 0xe9, 0x3e, 0xbb, 0x3e, 0xc4, 0xbe,
- 0x59, 0x52, 0xbc, 0x3d, 0x10, 0xef, 0xf7, 0xbd, 0xec, 0x10, 0x34, 0xbf,
- 0x6a, 0xd8, 0xac, 0xbe, 0xbb, 0x11, 0x6c, 0x3d, 0x44, 0x8f, 0x81, 0x3e,
- 0x1d, 0xa7, 0x72, 0xbe, 0x8c, 0x37, 0x6f, 0x3e, 0x80, 0x41, 0xdb, 0x3e,
- 0x59, 0xa5, 0xe9, 0x3c, 0xeb, 0x98, 0x85, 0xbe, 0x1f, 0x23, 0xf4, 0x3d,
- 0xe8, 0x5f, 0x81, 0x3d, 0x76, 0x86, 0xb5, 0xbe, 0x65, 0x83, 0x08, 0x3a,
- 0x4c, 0x93, 0xdb, 0xbe, 0xd1, 0x16, 0x71, 0x3e, 0xef, 0xae, 0x7d, 0xbb,
- 0xb0, 0x9a, 0xd7, 0xbd, 0xf9, 0xa3, 0x28, 0xbe, 0x56, 0xbe, 0xd1, 0x3e,
- 0x40, 0x51, 0x8d, 0x3c, 0xed, 0xaa, 0xe0, 0xbe, 0x49, 0xa2, 0x35, 0xbf,
- 0x67, 0xb2, 0x01, 0xbf, 0xbf, 0x25, 0x01, 0xbe, 0x6a, 0xbc, 0xa9, 0x3e,
- 0x40, 0x3e, 0xb4, 0xbe, 0x8c, 0xef, 0xae, 0x3d, 0x2a, 0xb6, 0x77, 0xbe,
- 0x21, 0x14, 0x4b, 0x3e, 0xac, 0xb3, 0xa3, 0x3e, 0x74, 0x7b, 0x09, 0xbd,
- 0x5d, 0xa8, 0x7c, 0x3e, 0x1d, 0x30, 0x77, 0xbe, 0x67, 0x68, 0xc4, 0x3d,
- 0xf6, 0xea, 0xc4, 0x3e, 0xe3, 0x56, 0xc3, 0x3d, 0x0c, 0x3f, 0xc9, 0x3e,
- 0x54, 0xf3, 0x2d, 0xbe, 0xb0, 0x04, 0x08, 0xbe, 0x17, 0xcf, 0x83, 0xbe,
- 0x16, 0xc5, 0xb7, 0xbe, 0xa3, 0x75, 0xd0, 0xbe, 0x11, 0xe8, 0xb7, 0xbe,
- 0xb6, 0x2c, 0x64, 0x3e, 0x25, 0x17, 0x5a, 0xbf, 0xd6, 0x8c, 0x33, 0xbe,
- 0xab, 0xc9, 0x43, 0xbe, 0xb4, 0x43, 0xeb, 0x3d, 0xa5, 0xac, 0xaf, 0x3e,
- 0x90, 0x4d, 0x92, 0x3e, 0x34, 0xb5, 0x8d, 0x3e, 0x0a, 0x1e, 0x88, 0xbe,
- 0xe5, 0xec, 0xbd, 0x3d, 0x91, 0xfb, 0x24, 0x3d, 0xb4, 0x81, 0x8f, 0xbe,
- 0x2e, 0x4c, 0x48, 0xbe, 0xd9, 0x46, 0xc5, 0xbc, 0x72, 0xd7, 0xbb, 0x3e,
- 0x0d, 0x02, 0xf9, 0xbd, 0x53, 0x65, 0x26, 0x3e, 0x12, 0x18, 0x77, 0x3e,
- 0xe5, 0x80, 0xd0, 0xbe, 0xa2, 0x76, 0x5b, 0xbf, 0xb5, 0xe0, 0x9c, 0x3e,
- 0xd8, 0x5d, 0xcd, 0xbe, 0xfe, 0xa5, 0x73, 0xbe, 0x9a, 0x07, 0xe8, 0xbe,
- 0x02, 0x2b, 0x03, 0xbd, 0xb5, 0xc5, 0xb2, 0xbd, 0xcd, 0xb1, 0x56, 0xbe,
- 0xfc, 0x8b, 0x3d, 0x3e, 0xe4, 0x8a, 0x65, 0xbe, 0x3b, 0x43, 0x08, 0x3d,
- 0x32, 0x44, 0xec, 0x3e, 0x02, 0x05, 0xd3, 0x3d, 0xb0, 0xbe, 0x85, 0xbd,
- 0xa9, 0xdf, 0x32, 0xbe, 0xc7, 0x74, 0x82, 0x3e, 0x03, 0x10, 0xe1, 0x3b,
- 0x75, 0x48, 0x4f, 0xbe, 0xa4, 0x61, 0x0c, 0x3d, 0x6b, 0x41, 0x0d, 0x3f,
- 0xe9, 0x06, 0x2a, 0xbe, 0x0b, 0x25, 0x41, 0x3e, 0x43, 0x25, 0x90, 0x3c,
- 0x48, 0xc1, 0x13, 0x3f, 0x73, 0x7d, 0x31, 0x3d, 0xbd, 0x6f, 0xee, 0xbe,
- 0x2a, 0x6d, 0x33, 0xbf, 0x70, 0xbc, 0xfa, 0xbe, 0xa2, 0x41, 0x2f, 0x3c,
- 0xd4, 0x17, 0x2f, 0xbe, 0x81, 0x54, 0x2e, 0x3d, 0x10, 0x99, 0x91, 0x3d,
- 0xef, 0x3a, 0x16, 0xbe, 0x5a, 0x0e, 0x8d, 0xbe, 0x79, 0xc1, 0x16, 0xbe,
- 0x3f, 0xcb, 0x71, 0xbd, 0x25, 0x89, 0x2c, 0xbd, 0x0e, 0xa5, 0xb6, 0xbd,
- 0x3a, 0xb8, 0xca, 0x3e, 0x7c, 0xc7, 0x2d, 0x3e, 0xe0, 0x82, 0xcc, 0xbe,
- 0x77, 0xda, 0xe5, 0x3e, 0x51, 0x08, 0x25, 0x3f, 0x03, 0x56, 0x06, 0xbe,
- 0x68, 0xee, 0xfd, 0xbe, 0x97, 0x44, 0x1b, 0xbd, 0xc4, 0x70, 0x08, 0x3e,
- 0x2c, 0x20, 0x83, 0x3e, 0x8e, 0x23, 0xa8, 0x3d, 0x08, 0xe1, 0x46, 0x3d,
- 0x06, 0x2b, 0x94, 0xbe, 0xb4, 0xec, 0xd9, 0xbd, 0xf9, 0xd3, 0xf8, 0xbc,
- 0xb2, 0x88, 0xb3, 0xbe, 0xa9, 0x8a, 0x2f, 0x3e, 0xb6, 0x98, 0x85, 0x3e,
- 0x7c, 0x83, 0x5d, 0xbe, 0xa6, 0x9b, 0x89, 0xbe, 0x8e, 0x8d, 0x16, 0x3e,
- 0x50, 0xa3, 0x95, 0x3c, 0x1f, 0x39, 0x91, 0xbd, 0x7f, 0x42, 0x1b, 0x3e,
- 0x2d, 0x65, 0xff, 0xbd, 0xa8, 0x73, 0xeb, 0xbd, 0x11, 0x96, 0xa1, 0x3e,
- 0x58, 0xd1, 0xac, 0x3e, 0x46, 0xc1, 0x3f, 0xbe, 0xd2, 0xa5, 0x3e, 0x3d,
- 0x7f, 0x60, 0x43, 0xbe, 0x22, 0xe9, 0x80, 0xbd, 0xbf, 0xa0, 0xbf, 0xbd,
- 0xe9, 0x52, 0x07, 0x3e, 0xfb, 0xbf, 0x5e, 0x3e, 0x1f, 0xac, 0x12, 0x3f,
- 0x7c, 0x20, 0xff, 0x3e, 0x4a, 0xb2, 0x7f, 0x3e, 0x2d, 0xa5, 0x37, 0xbf,
- 0x6a, 0xdc, 0x14, 0xbf, 0xb9, 0x52, 0x02, 0xbf, 0x3e, 0xc6, 0x11, 0x3c,
- 0x45, 0xfc, 0x43, 0x3e, 0x03, 0xa7, 0x8d, 0xbd, 0x2e, 0xd4, 0x5c, 0xbe,
- 0x4c, 0xc7, 0x82, 0xbe, 0xa4, 0xa3, 0x02, 0xbf, 0x1c, 0xe5, 0xdf, 0xbd,
- 0x71, 0xb4, 0x99, 0xbe, 0x1b, 0xba, 0xa7, 0xbd, 0xe5, 0xe1, 0x76, 0xbf,
- 0x38, 0x9b, 0x7d, 0xbe, 0xaa, 0x37, 0x50, 0x3e, 0x60, 0x3b, 0xa7, 0x3e,
- 0x46, 0xe3, 0xc9, 0x3e, 0xdf, 0xa8, 0x15, 0x3f, 0x1c, 0x10, 0x01, 0xbe,
- 0xcf, 0x34, 0x9b, 0xbe, 0x03, 0xb9, 0x2f, 0xbf, 0xfa, 0x60, 0x11, 0xbe,
- 0x4a, 0x22, 0xe6, 0x3e, 0x4d, 0x9c, 0x04, 0xbe, 0x4b, 0xfe, 0x96, 0xbd,
- 0x0e, 0xd1, 0xc5, 0x3e, 0xff, 0xc5, 0xbf, 0x3e, 0x58, 0xe2, 0xbb, 0x3e,
- 0x55, 0x34, 0x96, 0x3e, 0x2c, 0xd7, 0x65, 0xbe, 0x42, 0x58, 0x9e, 0xbc,
- 0xce, 0xf5, 0x4c, 0x3e, 0x3c, 0xba, 0x62, 0xbe, 0xdd, 0xbd, 0x02, 0xbf,
- 0x47, 0xcd, 0xb1, 0xbe, 0x54, 0x62, 0xe0, 0x3e, 0xcd, 0xb4, 0xcd, 0xbe,
- 0x8b, 0x5c, 0x45, 0xbf, 0xcb, 0xe3, 0xfb, 0xbe, 0xc2, 0x0d, 0xc2, 0x3d,
- 0xb8, 0xd7, 0x0d, 0x3d, 0x07, 0x01, 0xbb, 0x3d, 0x1b, 0xdf, 0x3b, 0x3d,
- 0xec, 0x8b, 0x48, 0x3e, 0x93, 0xa5, 0x28, 0xbf, 0x51, 0xb5, 0x9c, 0xbe,
- 0x4b, 0x41, 0x31, 0xbe, 0x32, 0xe8, 0x4a, 0x3e, 0x73, 0xe7, 0xd7, 0xbc,
- 0xe4, 0x56, 0x06, 0x3e, 0x12, 0x37, 0xef, 0x3d, 0xf8, 0x16, 0x9f, 0xbe,
- 0xa9, 0x19, 0xa8, 0xbe, 0xde, 0xb3, 0x81, 0x3e, 0x21, 0xaa, 0x8d, 0x3e,
- 0xf8, 0x8a, 0xef, 0x3d, 0x56, 0x8e, 0x79, 0x3b, 0x55, 0x19, 0xed, 0x3e,
- 0xe1, 0x84, 0xa4, 0xbc, 0xa9, 0xde, 0xcf, 0xbd, 0x3f, 0xca, 0x62, 0xbe,
- 0x40, 0x2f, 0xd1, 0x3d, 0x46, 0x34, 0x95, 0xbe, 0x23, 0x91, 0xe3, 0x3e,
- 0xfe, 0x79, 0x7d, 0xbe, 0x11, 0xfc, 0xf7, 0x3d, 0xf8, 0xe9, 0x35, 0x3e,
- 0xef, 0x25, 0x1b, 0xbe, 0xd9, 0xdf, 0xd6, 0x3d, 0x10, 0x3b, 0x98, 0xbd,
- 0x42, 0xc3, 0xb8, 0xbe, 0xf8, 0x87, 0x3f, 0xbe, 0x99, 0x7a, 0x5a, 0xbe,
- 0x6a, 0x42, 0xa7, 0xbb, 0x6b, 0x22, 0x46, 0xbf, 0xca, 0x2a, 0xc7, 0x3e,
- 0x3c, 0x06, 0xd5, 0xbe, 0xf2, 0x11, 0x70, 0xbb, 0x55, 0x1e, 0x9d, 0x3e,
- 0xa6, 0x2d, 0xef, 0xbe, 0x8b, 0x5d, 0x74, 0xbd, 0xd7, 0xf8, 0xa3, 0xbc,
- 0x0b, 0x42, 0xf1, 0xbc, 0x24, 0xfa, 0x9c, 0x3d, 0xe3, 0xa4, 0x02, 0x3e,
- 0xf4, 0x48, 0x40, 0xba, 0xb4, 0x78, 0x2c, 0xbe, 0x14, 0xc8, 0x3a, 0x3d,
- 0xa6, 0x33, 0xa5, 0x3d, 0x25, 0x5f, 0x7c, 0xbe, 0xaa, 0x9d, 0xc7, 0x3d,
- 0x5e, 0x40, 0x65, 0x3e, 0x95, 0xc8, 0xa4, 0xbe, 0x49, 0x03, 0x8f, 0xbe,
- 0xf7, 0x21, 0xcf, 0xbe, 0x19, 0x62, 0x0b, 0x3d, 0x71, 0xbd, 0x8c, 0x3e,
- 0xa9, 0xfa, 0xdc, 0x3e, 0x54, 0xbc, 0x82, 0x3d, 0xbd, 0x45, 0xd9, 0x3d,
- 0x2a, 0xd9, 0x88, 0xbf, 0x2d, 0x35, 0x3e, 0x3e, 0xe4, 0x07, 0xb8, 0x3d,
- 0x65, 0xb0, 0x2d, 0x3e, 0x96, 0xe2, 0xb2, 0xbb, 0x19, 0x82, 0xd9, 0x3e,
- 0x38, 0xf0, 0x80, 0xbe, 0x0e, 0x87, 0xd8, 0x3e, 0x03, 0xf7, 0x22, 0x3d,
- 0x68, 0x54, 0x46, 0x3e, 0x40, 0x68, 0xe8, 0xbd, 0x31, 0xb3, 0x8c, 0xbe,
- 0xb7, 0xe8, 0x05, 0xbf, 0x14, 0x92, 0xf8, 0x3d, 0xc2, 0x9d, 0xab, 0xba,
- 0x89, 0xbe, 0xf3, 0xbd, 0x66, 0x1b, 0x50, 0x3e, 0xb5, 0x44, 0x39, 0xbd,
- 0x2c, 0x9a, 0x33, 0x3d, 0xe3, 0xed, 0x1b, 0x3e, 0xf8, 0xf7, 0x1c, 0x3e,
- 0x36, 0x70, 0x5e, 0x3e, 0x0a, 0xec, 0x7f, 0xbe, 0xaf, 0x37, 0xf6, 0xbe,
- 0x69, 0x93, 0x84, 0x3e, 0xd6, 0x6e, 0x2f, 0xbf, 0x97, 0xa3, 0xd0, 0x3e,
- 0xc9, 0xc1, 0x88, 0x3d, 0xe1, 0x53, 0x65, 0xbe, 0xc6, 0x8d, 0x72, 0xbf,
- 0x4d, 0x18, 0x54, 0xbe, 0x6b, 0x1d, 0x4e, 0x3e, 0x08, 0x94, 0x77, 0x3c,
- 0x20, 0x0a, 0x98, 0xbd, 0x0d, 0xb6, 0xb4, 0xbd, 0x05, 0xc2, 0x09, 0xbf,
- 0x24, 0x15, 0xec, 0xbe, 0x61, 0x6b, 0x9b, 0xbe, 0x1e, 0x29, 0x06, 0xbf,
- 0xe5, 0x9d, 0x73, 0xbd, 0x09, 0x09, 0x9b, 0xbe, 0x0a, 0xb8, 0xa6, 0xbe,
- 0x92, 0xd5, 0x11, 0x3e, 0x08, 0x1d, 0xb2, 0xbd, 0x97, 0x13, 0x5f, 0xbe,
- 0xca, 0x9b, 0x4e, 0xbe, 0x1b, 0xf6, 0x95, 0xbe, 0x3e, 0x71, 0xec, 0xbd,
- 0xe0, 0x99, 0x36, 0x3d, 0xd1, 0x6b, 0x90, 0x3c, 0x88, 0x9d, 0xdb, 0x3c,
- 0x23, 0x90, 0xfa, 0x3d, 0x5a, 0xd7, 0xfb, 0xbd, 0x27, 0x51, 0x89, 0xbd,
- 0x6f, 0x8e, 0xe7, 0x3e, 0x18, 0xed, 0x17, 0xbe, 0xb5, 0x68, 0x65, 0xbe,
- 0x32, 0x13, 0x44, 0x3e, 0xd6, 0xdf, 0xf9, 0xbd, 0x7f, 0x85, 0x7e, 0x3e,
- 0x9f, 0x63, 0x92, 0xbe, 0x59, 0x92, 0x03, 0xbf, 0xc0, 0xe7, 0xe3, 0xbc,
- 0xa9, 0x4b, 0xa7, 0x3e, 0x57, 0xf9, 0xfd, 0x3c, 0x94, 0xcb, 0x33, 0x3d,
- 0xc6, 0xcc, 0x04, 0xbe, 0x88, 0xa2, 0x47, 0xbe, 0xb0, 0xe2, 0xfb, 0x3c,
- 0x63, 0x64, 0x9d, 0xbe, 0x73, 0x69, 0xe1, 0xbd, 0xfb, 0xd2, 0xc0, 0x3c,
- 0x48, 0xca, 0xee, 0x3d, 0xb5, 0x79, 0x0d, 0x3f, 0xca, 0x36, 0x55, 0xbe,
- 0x73, 0xd1, 0xcc, 0x3d, 0xf9, 0x4c, 0x81, 0x3e, 0x24, 0x62, 0xac, 0x3e,
- 0x08, 0xf9, 0xc2, 0x3c, 0xea, 0x60, 0x85, 0xbe, 0x36, 0x6e, 0x10, 0x3e,
- 0x13, 0x62, 0xf9, 0x3e, 0xc9, 0x3b, 0xf7, 0x3d, 0xaf, 0x27, 0xc5, 0x3c,
- 0x31, 0x30, 0x96, 0x3d, 0xbe, 0x08, 0x2b, 0xbe, 0xdb, 0x77, 0x4b, 0xbe,
- 0xf8, 0x73, 0xe7, 0x3e, 0xe2, 0x61, 0x0b, 0x3e, 0xd2, 0xc7, 0xbe, 0x3e,
- 0x3e, 0xf7, 0x24, 0xbe, 0xfb, 0xc8, 0xc5, 0x3d, 0x53, 0x37, 0xd9, 0x3e,
- 0x56, 0xcc, 0x94, 0xbd, 0x73, 0xd4, 0x89, 0x3c, 0xaa, 0x8b, 0x9b, 0x3d,
- 0x4f, 0xdd, 0xc3, 0x3c, 0x2d, 0xfa, 0x4c, 0x3e, 0xcc, 0xed, 0x3c, 0x3f,
- 0x31, 0xfa, 0x86, 0xbe, 0xe3, 0xcc, 0x30, 0x3e, 0xdf, 0xda, 0x9f, 0xbd,
- 0x49, 0x1b, 0x44, 0xbb, 0x5e, 0x93, 0x55, 0xbc, 0x68, 0xb6, 0x07, 0xbe,
- 0xda, 0xd2, 0xfa, 0xbb, 0x1b, 0xad, 0x5d, 0xbe, 0xf8, 0x44, 0xac, 0x3e,
- 0xf6, 0x80, 0xd5, 0xbe, 0x8e, 0xdd, 0xe2, 0x3d, 0x6a, 0x12, 0x57, 0x3e,
- 0x2f, 0xc5, 0x8e, 0xbe, 0x19, 0x43, 0x67, 0x3d, 0x72, 0xbd, 0xde, 0x3e,
- 0x99, 0xc4, 0x71, 0xbc, 0xdc, 0x24, 0x75, 0x3e, 0x58, 0x40, 0xcd, 0xbe,
- 0x93, 0x95, 0xbb, 0xbd, 0xa2, 0x07, 0x81, 0xbc, 0xe7, 0x43, 0xbb, 0x3e,
- 0xa1, 0xcc, 0xa6, 0xbd, 0x73, 0x7a, 0x40, 0x3e, 0xef, 0xcf, 0x66, 0xbe,
- 0x01, 0xb0, 0x14, 0xbe, 0x1e, 0x83, 0x15, 0xbd, 0xf7, 0x12, 0xcc, 0x3d,
- 0x2a, 0x51, 0x2a, 0xbe, 0x67, 0x09, 0xc6, 0xbc, 0xcc, 0x7c, 0x45, 0xbe,
- 0xee, 0x4a, 0xd8, 0xbc, 0x0b, 0xb6, 0xcb, 0xbe, 0x17, 0x80, 0xd5, 0xbe,
- 0x71, 0x2f, 0xe2, 0x3b, 0xf8, 0x66, 0xa0, 0x3e, 0x76, 0x34, 0x9c, 0x3d,
- 0xb7, 0xe7, 0x30, 0x3e, 0x6e, 0x87, 0x49, 0x3c, 0x3a, 0x00, 0xf0, 0xbe,
- 0x1f, 0xc0, 0x89, 0xbe, 0xe5, 0xac, 0x63, 0xbe, 0x06, 0x8c, 0x3f, 0xbe,
- 0x11, 0x65, 0xdf, 0xbd, 0x35, 0x27, 0x29, 0xbe, 0x6e, 0x93, 0xfb, 0xbe,
- 0xbd, 0x0f, 0x2e, 0xbe, 0xf1, 0xeb, 0x9e, 0x3e, 0x49, 0xa6, 0xff, 0x3c,
- 0x59, 0xb7, 0xda, 0xbd, 0x90, 0x3a, 0xdc, 0xbe, 0x80, 0x63, 0x0e, 0x3e,
- 0x6a, 0x87, 0x32, 0xbe, 0x59, 0x9c, 0xdb, 0xbe, 0x2d, 0xce, 0x30, 0x3e,
- 0xef, 0xd8, 0x18, 0x3e, 0xeb, 0x12, 0xf1, 0xbe, 0x89, 0xa8, 0xca, 0xbc,
- 0x95, 0x63, 0xa8, 0x3d, 0xd4, 0x85, 0xb8, 0xbc, 0x1e, 0x2c, 0x31, 0xbf,
- 0x40, 0x61, 0x3f, 0xbf, 0x31, 0x68, 0x1a, 0x3e, 0xd9, 0x33, 0x18, 0x3e,
- 0xce, 0x36, 0x9d, 0x3e, 0x8f, 0xa9, 0x8b, 0xbe, 0x29, 0x11, 0xd3, 0xbe,
- 0x7d, 0x4e, 0xc8, 0xbe, 0xca, 0xf9, 0x74, 0xbb, 0xa1, 0x46, 0x94, 0xbe,
- 0xab, 0x94, 0xaa, 0x3d, 0x2d, 0xea, 0x45, 0x3e, 0x47, 0x2e, 0x8a, 0x3e,
- 0x5b, 0xdd, 0xec, 0x3d, 0xe8, 0xbc, 0xa5, 0x3e, 0x71, 0x29, 0xac, 0x3e,
- 0x05, 0x03, 0x22, 0xbe, 0x89, 0xfc, 0x1f, 0xbe, 0xb5, 0x11, 0xea, 0x3d,
- 0x53, 0x00, 0x12, 0xbf, 0xbd, 0x79, 0x3b, 0x3b, 0xc5, 0x11, 0x8d, 0x3c,
- 0xdd, 0x67, 0xd4, 0x3d, 0x89, 0xfc, 0xa1, 0xbe, 0x6f, 0xd5, 0x8b, 0xbd,
- 0x5d, 0xc5, 0x88, 0x3e, 0x2c, 0x30, 0x20, 0x3d, 0x90, 0xdc, 0xd2, 0xbe,
- 0x76, 0x1a, 0x81, 0x3d, 0x9a, 0x2d, 0xe1, 0xbd, 0x8a, 0x41, 0xd1, 0xbe,
- 0xa2, 0x22, 0x5f, 0xbe, 0x69, 0xc1, 0xa8, 0x3c, 0xa2, 0xe3, 0xfc, 0x3d,
- 0xbe, 0xa2, 0xbf, 0x3d, 0x88, 0x70, 0x5a, 0x3e, 0x64, 0xf3, 0x95, 0xbc,
- 0xfe, 0x19, 0x8e, 0xbe, 0x91, 0xd4, 0x88, 0xbe, 0x19, 0xe0, 0xf4, 0x3d,
- 0x02, 0x98, 0xb9, 0xbe, 0x0f, 0x36, 0xbe, 0xbd, 0x39, 0x44, 0xc1, 0x3e,
- 0x30, 0xc7, 0x4b, 0xbe, 0x71, 0xae, 0xe5, 0x3a, 0x77, 0x57, 0x81, 0xbe,
- 0x72, 0x47, 0x73, 0xbe, 0x5c, 0xa9, 0x1d, 0xbe, 0x36, 0x09, 0xca, 0x3e,
- 0xd0, 0x84, 0xc7, 0xbe, 0x9c, 0x74, 0x95, 0x3e, 0xd4, 0x13, 0x8d, 0xbd,
- 0xc9, 0xe9, 0x7d, 0x3e, 0x5f, 0xbc, 0x09, 0xbe, 0xec, 0xa3, 0x34, 0x3e,
- 0x26, 0x47, 0x6b, 0xbe, 0xc8, 0xaf, 0xfe, 0xbc, 0xb0, 0x18, 0x48, 0xbd,
- 0x9f, 0xcd, 0x69, 0xbe, 0xa0, 0x9c, 0x89, 0x3e, 0x50, 0x0e, 0xd0, 0x3d,
- 0xf3, 0x51, 0xbb, 0x3e, 0x27, 0x5a, 0x8b, 0xbf, 0xf0, 0x4a, 0xbd, 0x3e,
- 0x50, 0x9b, 0x88, 0xbe, 0xeb, 0x8e, 0xa2, 0xbd, 0x09, 0xe4, 0xaa, 0xbe,
- 0xec, 0x64, 0x8b, 0xbe, 0xb1, 0xda, 0x04, 0xbf, 0x06, 0x3e, 0x3b, 0x3e,
- 0x9c, 0x72, 0x22, 0xbf, 0x3d, 0xb6, 0x78, 0x3d, 0xa7, 0xf9, 0x2c, 0xbe,
- 0x22, 0x97, 0x2d, 0xbe, 0x37, 0x95, 0x6d, 0x3e, 0x5a, 0xab, 0xe7, 0x3d,
- 0xb6, 0xc5, 0x6f, 0xbf, 0x6d, 0x07, 0x20, 0x3e, 0x67, 0x67, 0x71, 0x3d,
- 0x2e, 0x93, 0x27, 0xbf, 0xe5, 0x24, 0x62, 0xbe, 0x43, 0x42, 0x49, 0x3e,
- 0x3f, 0x93, 0x92, 0xbf, 0xf9, 0x76, 0x38, 0xbe, 0x9e, 0xf7, 0x43, 0x3e,
- 0x53, 0xb6, 0x54, 0xbe, 0x78, 0x88, 0xa2, 0xbd, 0x30, 0xb0, 0xc4, 0xbe,
- 0xbf, 0x0f, 0xab, 0xbe, 0xf4, 0xcb, 0x08, 0x3d, 0x70, 0x54, 0xf5, 0x3c,
- 0xe4, 0x40, 0xea, 0xbd, 0x99, 0x7e, 0x93, 0x3e, 0xa5, 0x56, 0x15, 0x3e,
- 0xf3, 0x49, 0x06, 0x3e, 0xe6, 0xf5, 0x7d, 0x3e, 0x78, 0x32, 0x9c, 0xbe,
- 0x26, 0xe7, 0x62, 0x3e, 0x68, 0x75, 0xa4, 0xbe, 0x0f, 0xc3, 0x1e, 0x3a,
- 0x1e, 0x3c, 0xf9, 0xbe, 0x76, 0x9f, 0x1b, 0xbe, 0xaf, 0x1d, 0x7b, 0xbe,
- 0x7f, 0xb0, 0xd4, 0x3e, 0x1e, 0x7e, 0x0a, 0xbf, 0x1b, 0x76, 0x05, 0xbf,
- 0xb6, 0x5d, 0x12, 0xbf, 0x99, 0xe0, 0x52, 0x3e, 0x93, 0x4c, 0x99, 0xbd,
- 0xaa, 0xba, 0xc8, 0xbd, 0x93, 0xca, 0x5a, 0x3e, 0x24, 0xbf, 0x0a, 0xbe,
- 0x72, 0x7a, 0x1c, 0xbe, 0x26, 0x4b, 0x0b, 0x3e, 0x4a, 0xc9, 0x8d, 0x3d,
- 0xad, 0x1d, 0xb4, 0x3e, 0xa5, 0x5e, 0x88, 0x3e, 0x84, 0x95, 0x2a, 0x3e,
- 0x82, 0xac, 0x95, 0xbe, 0xbd, 0x08, 0x83, 0xbd, 0x4f, 0x85, 0x50, 0xbe,
- 0xc0, 0xf2, 0x98, 0x3e, 0x80, 0x6c, 0x9c, 0xbe, 0xc7, 0x93, 0x9e, 0x3e,
- 0x84, 0x04, 0x4e, 0x3d, 0x6c, 0xe0, 0x6b, 0xbf, 0x1f, 0x00, 0x56, 0x3e,
- 0xfb, 0x4a, 0xbf, 0xbd, 0x0c, 0x6f, 0x61, 0x3e, 0xa5, 0x04, 0x76, 0x3e,
- 0x64, 0x77, 0xc4, 0x3e, 0xd0, 0x37, 0xbf, 0x3d, 0x41, 0xbf, 0x9a, 0x3b,
- 0x8e, 0xf3, 0x70, 0x3d, 0xcf, 0x04, 0xc6, 0x3d, 0x5c, 0x38, 0x6e, 0xbd,
- 0x66, 0xa6, 0xc8, 0x3e, 0x1f, 0xfb, 0x73, 0xbe, 0xde, 0xc5, 0xfe, 0xbd,
- 0x64, 0x43, 0xa2, 0x3e, 0x8a, 0xe7, 0x68, 0x3e, 0x46, 0x61, 0x85, 0xbe,
- 0x4f, 0xc9, 0x93, 0xbe, 0xa6, 0xbb, 0x65, 0xbd, 0x1e, 0x8b, 0x6d, 0x3c,
- 0x2f, 0x3e, 0xec, 0x3d, 0x6b, 0x58, 0x0a, 0x3f, 0xb4, 0x77, 0xc4, 0x3e,
- 0x24, 0x26, 0x21, 0x3e, 0xc9, 0xc2, 0x77, 0xbe, 0x75, 0x28, 0x00, 0x3e,
- 0xac, 0xb4, 0x27, 0xbe, 0x9e, 0xe3, 0xf3, 0x3d, 0x73, 0x41, 0xb6, 0x3e,
- 0xba, 0x45, 0x39, 0x3d, 0x52, 0xe2, 0x0c, 0xbd, 0x08, 0x81, 0x64, 0x3b,
- 0x38, 0x6f, 0x4a, 0xbe, 0x4b, 0xc9, 0xc1, 0xbd, 0xef, 0xb8, 0xee, 0x3e,
- 0xc4, 0xc1, 0x0b, 0x3f, 0x29, 0xf6, 0x1a, 0xbd, 0xfb, 0xb4, 0x2c, 0x3e,
- 0x16, 0xdb, 0xa8, 0x3e, 0xfd, 0xe2, 0x04, 0x3f, 0xe5, 0x9c, 0x1d, 0x3e,
- 0xa0, 0x82, 0xec, 0x3d, 0x4d, 0x07, 0x9a, 0x3c, 0x1f, 0x94, 0x8f, 0xbe,
- 0x19, 0x6c, 0xb5, 0x3e, 0xf0, 0x51, 0x8c, 0xbe, 0xff, 0xa1, 0x1e, 0x3f,
- 0x44, 0xbd, 0x04, 0x3e, 0xaf, 0xe4, 0x34, 0xbe, 0x20, 0x76, 0x3c, 0xbe,
- 0xd4, 0x4d, 0x87, 0x3d, 0xca, 0x78, 0x5d, 0xbe, 0x1d, 0x8e, 0x88, 0x3d,
- 0x3a, 0xf7, 0x25, 0xbe, 0x49, 0xea, 0x00, 0xbf, 0xf4, 0x11, 0x00, 0xbe,
- 0x2f, 0x40, 0xf6, 0x3e, 0xc3, 0x79, 0xbe, 0x3e, 0x57, 0xe2, 0x42, 0xbe,
- 0x1d, 0xa6, 0x0b, 0xbe, 0x17, 0x73, 0x98, 0x3e, 0x5b, 0x53, 0xa1, 0x3e,
- 0xa4, 0x67, 0x85, 0x3e, 0x95, 0xa9, 0x00, 0xbf, 0xc8, 0x13, 0x27, 0x3e,
- 0xa3, 0x10, 0xe7, 0x3e, 0x89, 0x34, 0xb2, 0xbd, 0xcb, 0x0a, 0x56, 0xbe,
- 0x79, 0xd5, 0xe3, 0x3b, 0xa3, 0x2c, 0xbb, 0x3d, 0x46, 0x45, 0x11, 0x3c,
- 0x15, 0x0c, 0x48, 0x3d, 0x4d, 0x56, 0x38, 0x3c, 0x58, 0x78, 0x4a, 0x3e,
- 0xed, 0x99, 0xa3, 0x3e, 0x7f, 0xf6, 0x88, 0xbe, 0xc6, 0xaa, 0x1b, 0x3e,
- 0x98, 0x75, 0x96, 0x3e, 0x97, 0xf3, 0xc6, 0xbc, 0xeb, 0x33, 0xe3, 0x3e,
- 0xca, 0xaa, 0x80, 0x3e, 0x67, 0x73, 0xac, 0xbe, 0xac, 0x1a, 0x70, 0xbd,
- 0x64, 0x4c, 0xec, 0x3e, 0x9b, 0x38, 0x3e, 0x3d, 0xaa, 0x7d, 0xc0, 0xbc,
- 0x1c, 0x48, 0xbe, 0xbf, 0xf9, 0xa5, 0xb9, 0xbb, 0xe6, 0xc7, 0x9c, 0x3e,
- 0xe8, 0x15, 0xa1, 0x3d, 0x30, 0xdd, 0x87, 0x3e, 0xc6, 0x4f, 0xa3, 0xbd,
- 0x59, 0xfc, 0x0a, 0x3e, 0xa9, 0x3a, 0x27, 0x3d, 0x6f, 0x5a, 0xac, 0x3d,
- 0x51, 0x52, 0x42, 0x3d, 0x7d, 0x13, 0x0c, 0xbf, 0xb5, 0x13, 0x97, 0x3e,
- 0x48, 0x35, 0xf7, 0xbe, 0x4c, 0xab, 0x09, 0xbc, 0xe1, 0x0b, 0x93, 0x3d,
- 0x35, 0xcb, 0x30, 0x3f, 0x8b, 0x4e, 0xcd, 0x3e, 0x8e, 0xac, 0x0e, 0xbf,
- 0x3f, 0xd6, 0x0b, 0x3e, 0x56, 0x22, 0x90, 0x3e, 0x0a, 0xd4, 0x70, 0x3e,
- 0xb4, 0x78, 0x08, 0x3f, 0xa6, 0xbd, 0x81, 0xbe, 0x13, 0x84, 0x1b, 0xbc,
- 0x87, 0xe2, 0x69, 0x3d, 0xee, 0x2c, 0xed, 0x3d, 0x2b, 0x08, 0x73, 0xbd,
- 0x5d, 0x33, 0xe7, 0x3d, 0x73, 0x6a, 0x1e, 0xbe, 0xbe, 0x0e, 0xea, 0xbd,
- 0xd9, 0xe5, 0xc7, 0xbd, 0xda, 0x0d, 0x39, 0x3d, 0xb4, 0xf1, 0x5c, 0x3d,
- 0x6f, 0xba, 0xd5, 0x3d, 0x8f, 0x1f, 0xe8, 0x3d, 0xc9, 0x70, 0xaf, 0x3c,
- 0x61, 0x53, 0xe6, 0xbd, 0xcf, 0x57, 0xca, 0xbd, 0x42, 0x7b, 0x15, 0xbe,
- 0x55, 0x8b, 0x0c, 0x3e, 0xa8, 0x20, 0xfc, 0x3d, 0x7f, 0xd6, 0x16, 0xbe,
- 0x38, 0x6d, 0xa8, 0xbc, 0xf5, 0x06, 0x28, 0x3e, 0x49, 0xc3, 0x88, 0xbd,
- 0xe1, 0x67, 0x04, 0xbd, 0x52, 0xb1, 0xf6, 0xbc, 0x52, 0xd9, 0xc8, 0xbd,
- 0xde, 0x58, 0xae, 0x3d, 0x2d, 0x3e, 0x55, 0xbd, 0xe0, 0x2e, 0x4e, 0x3d,
- 0x0b, 0x50, 0xdf, 0x3d, 0xff, 0x3b, 0xaf, 0x3d, 0x66, 0x9d, 0x17, 0xbd,
- 0x6a, 0x48, 0xe4, 0xbc, 0x15, 0xc0, 0x0f, 0xbe, 0xfb, 0xd4, 0x90, 0x3d,
- 0xd2, 0xa4, 0xcd, 0xbc, 0xbf, 0x7a, 0xb3, 0xbd, 0x6d, 0x14, 0xf0, 0x3d,
- 0xb9, 0xa6, 0x0a, 0xbe, 0xfb, 0x21, 0xa9, 0xbc, 0x3d, 0x71, 0x25, 0x3e,
- 0x43, 0xdd, 0x1f, 0x3e, 0xf5, 0x14, 0xfe, 0xbb, 0x4c, 0xea, 0x13, 0x3e,
- 0xae, 0x04, 0x44, 0xbd, 0x2c, 0xd1, 0xf1, 0x3d, 0x96, 0xb4, 0x0c, 0x3e,
- 0x14, 0xbc, 0xe3, 0x3d, 0x2e, 0x70, 0xb7, 0x3b, 0x8f, 0xad, 0x69, 0x3d,
- 0xdc, 0x10, 0x02, 0x3e, 0xe3, 0xf9, 0x99, 0xbc, 0x03, 0xdf, 0x0a, 0xbe,
- 0x82, 0xe2, 0x1c, 0x3e, 0x70, 0x4a, 0x62, 0xbc, 0x65, 0x36, 0x20, 0x3e,
- 0x1b, 0x1d, 0xaa, 0x3d, 0x5f, 0x58, 0xde, 0xbd, 0xa1, 0x73, 0x9b, 0x3d,
- 0x13, 0x7d, 0x43, 0x3d, 0xe5, 0xaf, 0xfc, 0xbd, 0x0c, 0xd8, 0x88, 0x3c,
- 0xdf, 0xc3, 0x45, 0xbd, 0x81, 0xc6, 0x04, 0xbe, 0x38, 0xbd, 0x8e, 0xbd,
- 0xe4, 0x29, 0x16, 0x3d, 0xc9, 0x03, 0xf3, 0x3d, 0x34, 0xf7, 0xb9, 0xba,
- 0xa4, 0xaa, 0xbe, 0xbd, 0x32, 0x40, 0x01, 0x3e, 0x05, 0x22, 0x63, 0xbd,
- 0x7a, 0xd9, 0xa5, 0x3b, 0xd9, 0x8e, 0xe4, 0x3d, 0x97, 0x95, 0xa0, 0xbd,
- 0xa0, 0xa9, 0x71, 0xb9, 0x32, 0x3a, 0x2b, 0x3d, 0x29, 0x5a, 0x06, 0xbd,
- 0x88, 0xb5, 0x8c, 0xbc, 0x46, 0x3a, 0x28, 0xbd, 0x55, 0x61, 0x56, 0x3d,
- 0xaa, 0x26, 0xb8, 0xbd, 0xe8, 0xaa, 0x89, 0x3d, 0x56, 0x0c, 0x21, 0x3e,
- 0x4b, 0x0f, 0x6a, 0x3d, 0x3e, 0xc4, 0x81, 0xbd, 0x62, 0x1e, 0x44, 0xbd,
- 0x48, 0xcc, 0xde, 0x3c, 0xc3, 0xbe, 0x27, 0xbd, 0x73, 0xa8, 0x8f, 0xbd,
- 0x8e, 0x55, 0xdd, 0xbd, 0x37, 0xbb, 0x19, 0x3e, 0x61, 0x86, 0x20, 0x3e,
- 0x14, 0x2a, 0xed, 0x3d, 0xd9, 0xd8, 0xbd, 0xbd, 0xeb, 0xe3, 0x96, 0xbd,
- 0x14, 0xf7, 0x22, 0xbc, 0xdf, 0x3f, 0x81, 0xbc, 0x70, 0x7c, 0x88, 0x3e,
- 0xec, 0x31, 0xb0, 0x3d, 0x5f, 0xc3, 0x1c, 0xbe, 0x55, 0x47, 0xda, 0xbd,
- 0x2d, 0x59, 0x50, 0xbd, 0x41, 0x34, 0x11, 0x3e, 0x46, 0xf3, 0x0c, 0xbe,
- 0x02, 0x4d, 0x1b, 0x3e, 0x3c, 0x85, 0x09, 0xbe, 0xf9, 0xa6, 0xad, 0x3d,
- 0x53, 0xd2, 0xab, 0x3d, 0x47, 0x94, 0x2d, 0x3d, 0xef, 0xcb, 0x0a, 0xbe,
- 0x72, 0xcf, 0xcf, 0xbd, 0x7f, 0xf0, 0x03, 0x3e, 0x3f, 0x2f, 0x2f, 0xbe,
- 0x15, 0x78, 0x0e, 0xbe, 0xff, 0xd1, 0xca, 0xbc, 0xd7, 0xa5, 0x8e, 0x3d,
- 0xe0, 0x20, 0xa2, 0x3d, 0x90, 0xe7, 0x3d, 0x3d, 0x93, 0x9e, 0xc3, 0x3d,
- 0x27, 0x6c, 0x84, 0xbe, 0x5b, 0x46, 0xda, 0xbe, 0x84, 0x7f, 0x88, 0x3e,
- 0x4b, 0x45, 0xaa, 0x3c, 0xcb, 0x23, 0x8f, 0xbe, 0x69, 0xbc, 0xff, 0x3e,
- 0x22, 0x6e, 0xb3, 0x3e, 0x6e, 0x1c, 0xa3, 0x3d, 0x57, 0xd4, 0x00, 0xbe,
- 0xc7, 0xa8, 0x81, 0xbe, 0xd7, 0xe6, 0x95, 0xbe, 0x8a, 0x8c, 0x80, 0xbe,
- 0xe3, 0xa0, 0xf6, 0x3d, 0x19, 0xde, 0x1e, 0xbd, 0x85, 0xa4, 0xa5, 0xbd,
- 0x39, 0x32, 0x85, 0xbd, 0x57, 0x9c, 0x85, 0x3e, 0xd3, 0x42, 0x20, 0xbd,
- 0xa9, 0xca, 0x19, 0x3d, 0x88, 0xe7, 0x81, 0xbd, 0x52, 0xf1, 0x9f, 0x3c,
- 0x30, 0x3e, 0x90, 0x3e, 0x91, 0xa3, 0x4c, 0xbe, 0xf7, 0xbe, 0x45, 0x3e,
- 0x49, 0x32, 0xcb, 0xbe, 0x91, 0x06, 0x1b, 0xbe, 0xa3, 0x45, 0x8a, 0x3e,
- 0xc8, 0xbe, 0x15, 0x3e, 0x33, 0x84, 0x78, 0xbe, 0xa2, 0x9d, 0x8c, 0xbd,
- 0x51, 0xda, 0x9c, 0x3e, 0x39, 0x9a, 0x0a, 0x3e, 0xa6, 0x9e, 0x80, 0xbe,
- 0x29, 0x9c, 0x2c, 0xbe, 0xa4, 0xfc, 0x27, 0x3d, 0xb9, 0x0e, 0x60, 0x3e,
- 0x20, 0xf4, 0xb9, 0xbd, 0xc4, 0x34, 0xc3, 0xbc, 0x43, 0x1f, 0x12, 0x3e,
- 0x91, 0x87, 0x93, 0xbe, 0xae, 0x5f, 0xa1, 0x3e, 0x4f, 0xd1, 0xde, 0xbd,
- 0x7b, 0x83, 0x96, 0xbc, 0x53, 0x4e, 0x8d, 0xbb, 0xd4, 0xec, 0xa4, 0x3e,
- 0x38, 0xab, 0x8b, 0xbe, 0x32, 0xa8, 0xb5, 0x3d, 0xb5, 0x5a, 0xa7, 0x3e,
- 0x13, 0x26, 0x2e, 0x3e, 0x02, 0xc4, 0x4a, 0xbd, 0x0f, 0x0b, 0x20, 0x3e,
- 0xb0, 0x95, 0x3d, 0x3e, 0xb4, 0x9c, 0x5d, 0x3e, 0x6a, 0xfb, 0x38, 0x3d,
- 0xf4, 0x4b, 0x63, 0xbe, 0xb5, 0xb5, 0x6e, 0x3e, 0x6c, 0x1d, 0x2c, 0x3e,
- 0xb2, 0xb9, 0x99, 0xbe, 0x6d, 0xbf, 0x93, 0x3e, 0xda, 0x5b, 0x82, 0xbc,
- 0x7a, 0x4e, 0x10, 0xbe, 0xb7, 0x38, 0xa0, 0xbe, 0x24, 0xad, 0x63, 0xbe,
- 0x94, 0x49, 0xdb, 0xbd, 0x79, 0x37, 0xa1, 0xbe, 0x5a, 0x6a, 0xca, 0x3d,
- 0x7e, 0x73, 0x27, 0xbe, 0x50, 0x50, 0xa6, 0x3d, 0xb8, 0x4c, 0xae, 0x3e,
- 0xfc, 0xca, 0x99, 0xbe, 0x9a, 0x4c, 0x20, 0xbe, 0xae, 0x0a, 0xee, 0x3d,
- 0x29, 0x7e, 0x89, 0x3e, 0x61, 0x18, 0x25, 0x3d, 0x06, 0xef, 0x33, 0x3e,
- 0xe1, 0x23, 0x27, 0x3e, 0x35, 0x36, 0xe1, 0x3d, 0x96, 0xb3, 0x21, 0xbd,
- 0x74, 0x38, 0xae, 0xbe, 0x98, 0x63, 0x98, 0xbd, 0x88, 0x39, 0xee, 0xbc,
- 0x26, 0x47, 0xaf, 0xbd, 0x4b, 0xfa, 0xeb, 0x3d, 0xd0, 0x8f, 0x8f, 0xbe,
- 0x82, 0xd5, 0xd0, 0x3d, 0xce, 0x82, 0x3c, 0x3e, 0x1e, 0xcd, 0x32, 0x3c,
- 0x65, 0x38, 0x5d, 0x3d, 0xed, 0x0b, 0xce, 0x3d, 0x63, 0xd2, 0x10, 0xbf,
- 0x7c, 0xf6, 0x4c, 0xbe, 0x18, 0xb7, 0xb0, 0xbe, 0x98, 0xe1, 0x8f, 0xbd,
- 0x65, 0x85, 0x91, 0x3e, 0xca, 0x76, 0x2a, 0xbe, 0xf8, 0x4f, 0xbf, 0xbc,
- 0xbd, 0x82, 0xbd, 0xbc, 0x18, 0x26, 0x88, 0x3c, 0x18, 0xba, 0x18, 0xbe,
- 0x51, 0x89, 0x91, 0x3e, 0x91, 0xd4, 0x3c, 0x3d, 0xb9, 0xab, 0x8e, 0xbe,
- 0xb4, 0x95, 0xea, 0x3e, 0x76, 0x84, 0x8e, 0x3d, 0x73, 0xcc, 0xd9, 0xbe,
- 0x4b, 0xf9, 0x7c, 0x3e, 0x02, 0xdf, 0x16, 0xbe, 0x04, 0xab, 0x6c, 0x3d,
- 0xb1, 0x75, 0x83, 0x3d, 0x66, 0x4e, 0x37, 0xbe, 0x46, 0x1d, 0xdc, 0xbe,
- 0x89, 0xa3, 0x94, 0x3e, 0xdb, 0xe5, 0xad, 0x3e, 0x5e, 0xf2, 0x36, 0xbe,
- 0x01, 0x01, 0x38, 0x3e, 0xa4, 0xcd, 0x0e, 0xbe, 0xaa, 0xf5, 0xf3, 0xbd,
- 0x4a, 0x7e, 0x18, 0x3d, 0x4b, 0xac, 0x86, 0x3d, 0x64, 0x9a, 0xe5, 0xbe,
- 0xbb, 0x64, 0x0b, 0xbe, 0xe4, 0x29, 0xd1, 0x3c, 0xb1, 0x3c, 0x20, 0xbd,
- 0x2d, 0x79, 0xe5, 0xbe, 0x57, 0x77, 0x03, 0x3f, 0x2c, 0xb6, 0x3c, 0xbe,
- 0x92, 0x8f, 0x88, 0xbe, 0x62, 0x6b, 0x8f, 0x3e, 0x90, 0xc9, 0x89, 0xbe,
- 0x16, 0xfa, 0x95, 0x3e, 0x7a, 0x1a, 0xd0, 0x3e, 0xfd, 0xdb, 0xee, 0x3d,
- 0x57, 0xb1, 0x52, 0xbd, 0xa8, 0xdf, 0xa6, 0x3e, 0x82, 0xd0, 0xc3, 0x3c,
- 0xd4, 0x25, 0xa3, 0xbe, 0x34, 0xe7, 0x1f, 0xbf, 0x63, 0xb9, 0xc5, 0x3e,
- 0xf5, 0x19, 0xcc, 0xbd, 0x4f, 0x87, 0x66, 0x3d, 0x5a, 0x33, 0x22, 0xbe,
- 0x4a, 0x04, 0xfe, 0x3e, 0x87, 0x8c, 0x03, 0x3f, 0xd0, 0xda, 0xbb, 0x3e,
- 0xf9, 0x64, 0x1b, 0xbe, 0x8d, 0xc0, 0xfb, 0x3d, 0xa1, 0x07, 0xcb, 0x3d,
- 0x06, 0x2e, 0xff, 0x3d, 0xaf, 0xd3, 0x80, 0x3d, 0x5c, 0x6d, 0x4f, 0x3e,
- 0x08, 0x55, 0xfa, 0xbe, 0xf7, 0xf1, 0x7d, 0xbc, 0x4a, 0x26, 0xab, 0xbd,
- 0x19, 0x45, 0x69, 0x3e, 0xd6, 0xb1, 0x3a, 0x3c, 0xa0, 0x12, 0xf5, 0x3d,
- 0x57, 0x6b, 0xed, 0x3b, 0x45, 0xa3, 0xd2, 0x3d, 0x30, 0x17, 0x3b, 0xbe,
- 0x08, 0x04, 0xc9, 0xbe, 0x15, 0x8f, 0xcd, 0xbd, 0xd2, 0x12, 0x03, 0xbf,
- 0xf3, 0xbe, 0x2f, 0xbe, 0xac, 0x09, 0xfb, 0x3b, 0x4c, 0xcf, 0x6d, 0x3e,
- 0x39, 0xa3, 0x44, 0x3e, 0x6d, 0x71, 0xc2, 0xbe, 0xb1, 0xbc, 0x39, 0x3e,
- 0x83, 0xf1, 0x3c, 0x3d, 0x77, 0xe7, 0x4f, 0xbe, 0x80, 0x52, 0xec, 0xbd,
- 0xa3, 0x0d, 0xc4, 0xbe, 0x8c, 0xc9, 0x58, 0xbc, 0xde, 0xb0, 0xe9, 0xbc,
- 0x8c, 0xfe, 0x9e, 0x3e, 0x82, 0x7b, 0xde, 0xbd, 0xd2, 0x42, 0x85, 0x3e,
- 0xc0, 0xaf, 0x05, 0x3f, 0x79, 0xb1, 0xc7, 0x3e, 0x22, 0x30, 0xd5, 0xbe,
- 0xda, 0xda, 0x88, 0x3e, 0xdb, 0x79, 0x47, 0xbb, 0x45, 0x7b, 0x31, 0x3e,
- 0x27, 0x87, 0x76, 0xbe, 0x9e, 0xaa, 0x39, 0xbe, 0x25, 0x02, 0xd0, 0xbe,
- 0xab, 0x9a, 0xa2, 0x3e, 0xec, 0xf0, 0xec, 0xbc, 0xa7, 0x7c, 0xde, 0x3d,
- 0xef, 0xba, 0x60, 0xbe, 0x9a, 0xb9, 0xa8, 0x3e, 0x3d, 0x68, 0x3a, 0xbe,
- 0x09, 0x11, 0xa8, 0xbe, 0x07, 0x53, 0x2b, 0xbf, 0x97, 0xed, 0x67, 0x3e,
- 0xe3, 0xef, 0x4a, 0x3e, 0xcd, 0xbc, 0xd4, 0xbd, 0x27, 0x19, 0x99, 0x3e,
- 0xb3, 0x24, 0x1f, 0xbe, 0x87, 0x84, 0x9f, 0xbd, 0xe5, 0xb2, 0xad, 0xbe,
- 0xe0, 0xaf, 0x97, 0xbe, 0xd1, 0x00, 0x8e, 0xbe, 0xb8, 0x55, 0xc4, 0xbd,
- 0x7e, 0x03, 0xf9, 0x3e, 0xc4, 0x13, 0x38, 0xbe, 0xbd, 0x33, 0x04, 0xbe,
- 0x8a, 0x99, 0xf4, 0x3d, 0xed, 0x6a, 0x29, 0xbe, 0x66, 0xbe, 0x6f, 0xbc,
- 0xe1, 0x80, 0xb5, 0x3e, 0x52, 0x37, 0x52, 0xbe, 0x57, 0x38, 0x02, 0xbe,
- 0x05, 0x02, 0xdc, 0x3e, 0x5a, 0x06, 0xfe, 0x3d, 0x8d, 0x5d, 0xd7, 0x3e,
- 0x60, 0xda, 0x3a, 0xbd, 0xf7, 0xa3, 0xab, 0xbd, 0x91, 0x3b, 0x13, 0xbe,
- 0x15, 0xad, 0x7d, 0xbe, 0xa5, 0x44, 0x81, 0xbd, 0xc0, 0x53, 0x4e, 0xbe,
- 0xf3, 0x69, 0x0d, 0x3d, 0xcc, 0x9a, 0x34, 0xbf, 0xa8, 0xee, 0x80, 0xbe,
- 0x76, 0x3b, 0x94, 0xbe, 0xc3, 0x5a, 0x9b, 0xbc, 0x1f, 0xbf, 0xdf, 0xbd,
- 0xd3, 0xcd, 0x47, 0x3c, 0x43, 0x26, 0x1d, 0xbe, 0x69, 0x40, 0x32, 0x3e,
- 0x34, 0x04, 0x79, 0xbe, 0x40, 0x23, 0x41, 0x3d, 0xa9, 0x18, 0x35, 0xbe,
- 0x45, 0x1c, 0x93, 0x3e, 0xc7, 0xdd, 0xcb, 0x3d, 0x1e, 0x89, 0xfb, 0xbc,
- 0x8a, 0xcf, 0xfc, 0xbe, 0x23, 0xa1, 0x94, 0xbf, 0xf6, 0xcc, 0x42, 0xbd,
- 0x48, 0x2c, 0xf2, 0x3d, 0x6f, 0x45, 0x88, 0xbe, 0x60, 0x16, 0xc3, 0x3e,
- 0xf7, 0xdc, 0x9c, 0x3e, 0x87, 0x1b, 0xf1, 0xbe, 0x30, 0xf7, 0x6a, 0xbe,
- 0x6d, 0xf0, 0x30, 0x3e, 0x13, 0xf8, 0x67, 0xbe, 0xb9, 0x13, 0x23, 0xbe,
- 0x14, 0xcf, 0x44, 0xbe, 0x24, 0xd9, 0xb7, 0xbe, 0xce, 0x58, 0xfe, 0xbd,
- 0x32, 0xb8, 0x98, 0xbe, 0xaa, 0x16, 0x9d, 0xbd, 0x9b, 0x13, 0xfc, 0xbd,
- 0xf8, 0x4f, 0xc2, 0x3d, 0x9d, 0xf0, 0x0c, 0x3d, 0x45, 0x04, 0x38, 0xbe,
- 0x16, 0xb0, 0x0a, 0x3c, 0x95, 0xe2, 0xec, 0x3e, 0xc7, 0xa6, 0x15, 0xbd,
- 0xa5, 0xee, 0x08, 0xbf, 0xb9, 0x29, 0x55, 0xbc, 0x85, 0x13, 0x17, 0x3e,
- 0xa2, 0xdf, 0xbb, 0x3d, 0x33, 0x5b, 0x91, 0xbe, 0x20, 0x34, 0xaf, 0x3e,
- 0x4a, 0xe4, 0x63, 0x3e, 0xa1, 0x48, 0x53, 0x3e, 0x5e, 0x8e, 0x4b, 0xbe,
- 0xa2, 0x26, 0x33, 0x3d, 0xeb, 0x6e, 0x71, 0xbe, 0x21, 0xc4, 0x04, 0x3e,
- 0x84, 0xa0, 0x10, 0xbc, 0xfb, 0x52, 0x07, 0x3e, 0x79, 0x68, 0x20, 0xbd,
- 0xec, 0x89, 0x8f, 0x3e, 0x9d, 0xfe, 0x40, 0xbe, 0x5a, 0x36, 0x70, 0xbe,
- 0x77, 0x54, 0xd7, 0xbe, 0xb3, 0xc3, 0x88, 0x3e, 0x8c, 0xcf, 0x05, 0xbf,
- 0xac, 0x97, 0xc2, 0x3e, 0x43, 0x61, 0x4b, 0xbd, 0x09, 0x36, 0x35, 0xbe,
- 0xea, 0x51, 0xc6, 0x3e, 0xe9, 0x79, 0x32, 0x3d, 0xc0, 0x8e, 0x87, 0x3e,
- 0x07, 0xb5, 0x23, 0x3e, 0x86, 0xc9, 0xac, 0x3c, 0x38, 0x76, 0xcf, 0x3e,
- 0xf6, 0x28, 0x5f, 0x3e, 0x93, 0x71, 0x73, 0xbe, 0x18, 0x79, 0x1c, 0xbf,
- 0xcc, 0x18, 0xef, 0x3b, 0xc4, 0x15, 0x21, 0x3e, 0xdb, 0x67, 0x14, 0x3c,
- 0x55, 0x57, 0x25, 0xbe, 0x2c, 0x18, 0x81, 0xbd, 0x7f, 0x0a, 0x93, 0x3e,
- 0x56, 0x7a, 0x4c, 0xbf, 0xd9, 0x26, 0x1d, 0xbf, 0xe4, 0xb6, 0xe8, 0xbd,
- 0x2e, 0xd6, 0x3e, 0xbd, 0x28, 0x10, 0x8f, 0xbc, 0xa3, 0x73, 0x88, 0xbd,
- 0xa5, 0x18, 0xc6, 0x3b, 0x54, 0x2d, 0xc6, 0x3d, 0x23, 0x02, 0xe0, 0x3d,
- 0xcb, 0xfe, 0x6c, 0xbd, 0x66, 0x60, 0x2a, 0x3e, 0xb7, 0xdf, 0xb7, 0x3d,
- 0x60, 0xeb, 0x3d, 0x3c, 0x56, 0x4b, 0x7b, 0xbe, 0xab, 0x5a, 0x45, 0x3e,
- 0x4e, 0x79, 0xfd, 0x3d, 0x06, 0x9b, 0xbc, 0x3e, 0xb6, 0x79, 0xf1, 0xbc,
- 0x30, 0x91, 0x65, 0xbb, 0x6a, 0x4b, 0x04, 0xbe, 0x2c, 0xe8, 0x95, 0x3d,
- 0xa6, 0xcb, 0xfd, 0xbe, 0x56, 0x0a, 0xfd, 0xbe, 0x35, 0xfb, 0x9d, 0xbe,
- 0x6c, 0x90, 0xf3, 0xbd, 0x3a, 0x4b, 0x19, 0xbc, 0x33, 0xd9, 0x85, 0x3e,
- 0x08, 0xdc, 0xa8, 0x3e, 0xa7, 0x07, 0x36, 0xbe, 0x40, 0xc9, 0x1b, 0x3c,
- 0x83, 0x46, 0x47, 0xbe, 0x6e, 0x76, 0x94, 0x3e, 0x84, 0x9e, 0x2c, 0xbe,
- 0xec, 0xde, 0x62, 0xbd, 0xe7, 0x73, 0x63, 0xbe, 0xb8, 0x6d, 0x2e, 0x3d,
- 0x08, 0xe6, 0xa8, 0x3d, 0x8a, 0x79, 0x28, 0x3e, 0x91, 0x4c, 0x1e, 0xbf,
- 0xe8, 0x74, 0x91, 0xbd, 0x3a, 0x7c, 0xc0, 0x3d, 0x6f, 0x65, 0x07, 0x3f,
- 0x90, 0xd5, 0xa8, 0x3e, 0xd4, 0x8f, 0x4c, 0xbe, 0x82, 0x7d, 0x5c, 0xbe,
- 0x12, 0xb8, 0x37, 0xbe, 0xe9, 0x49, 0xb2, 0x3e, 0x69, 0x73, 0x1f, 0xbe,
- 0x9d, 0x75, 0xb0, 0xbe, 0xfe, 0x1e, 0xff, 0x3d, 0xaa, 0xf5, 0x00, 0x3f,
- 0x3b, 0xd2, 0x49, 0xbf, 0xf3, 0x9f, 0xaa, 0xbb, 0x66, 0x45, 0xd1, 0x3c,
- 0x69, 0x79, 0xfc, 0x3d, 0x15, 0x8b, 0x0c, 0x3e, 0x9b, 0x07, 0x5a, 0xbe,
- 0x21, 0xea, 0xba, 0xbe, 0x81, 0x30, 0x5c, 0xbe, 0x19, 0xda, 0xa7, 0x3e,
- 0x31, 0x9b, 0xbe, 0x3d, 0x1c, 0xd2, 0x96, 0x3c, 0x51, 0xfc, 0xee, 0xbc,
- 0xca, 0xb5, 0x6f, 0xbe, 0xe0, 0x7c, 0xb2, 0xbe, 0xdf, 0x91, 0xd8, 0x3e,
- 0xa8, 0xb5, 0xb8, 0x3d, 0x12, 0x17, 0x5a, 0x3e, 0xea, 0xba, 0xef, 0x3d,
- 0x10, 0xd9, 0x17, 0xbe, 0xf5, 0xca, 0xd5, 0x3d, 0x05, 0xd0, 0xbd, 0xbe,
- 0x8c, 0x9f, 0xff, 0xbe, 0x38, 0xea, 0xa6, 0x3d, 0x14, 0x4e, 0x9b, 0x3e,
- 0x7e, 0x60, 0x44, 0x3e, 0x1a, 0xee, 0xe9, 0xbc, 0x5e, 0xb2, 0x8b, 0x3e,
- 0xed, 0x4e, 0x9e, 0xbe, 0x8c, 0x8d, 0x24, 0xbe, 0xb8, 0x35, 0x04, 0xbe,
- 0x0b, 0x2c, 0x89, 0x3e, 0x6b, 0xd0, 0xaf, 0x3e, 0x73, 0xc0, 0xc4, 0xbe,
- 0x06, 0x02, 0x07, 0xbe, 0x90, 0x9a, 0x36, 0xbf, 0xe4, 0x99, 0xd6, 0xbd,
- 0xe0, 0x82, 0x80, 0xbe, 0x15, 0x1a, 0xf3, 0x3d, 0x3e, 0xba, 0xef, 0x3d,
- 0x52, 0xa9, 0x38, 0xbe, 0x31, 0xc2, 0x7e, 0xbe, 0x22, 0xf2, 0x6a, 0x3e,
- 0x6a, 0xf4, 0xd1, 0x3e, 0x98, 0xc1, 0x19, 0x3c, 0x65, 0x45, 0xd2, 0xbc,
- 0x31, 0xd5, 0xa3, 0xbe, 0x0b, 0xd0, 0x8a, 0xbe, 0xd8, 0x99, 0x1a, 0xbe,
- 0x20, 0xf9, 0x0c, 0x3e, 0x8b, 0x6d, 0xfe, 0xbd, 0xaa, 0x77, 0xda, 0xbe,
- 0x75, 0xac, 0xa2, 0x3c, 0xf9, 0xcf, 0xd4, 0xbd, 0x9a, 0xac, 0x92, 0x3d,
- 0xd5, 0x06, 0xc2, 0x3e, 0xb7, 0xec, 0x73, 0xbc, 0x1d, 0x37, 0xa1, 0x3e,
- 0x1c, 0x12, 0x62, 0x3e, 0xf1, 0xd6, 0xd8, 0x3e, 0x49, 0xcf, 0x2a, 0xbe,
- 0x52, 0xb8, 0x00, 0xbe, 0x70, 0x92, 0x52, 0x3d, 0x0f, 0x27, 0x75, 0xbc,
- 0x3e, 0xdd, 0xc0, 0xbe, 0xf9, 0x52, 0xd3, 0x3d, 0x7a, 0x0c, 0x13, 0xbd,
- 0x5f, 0x5f, 0xce, 0x3d, 0x3d, 0x3a, 0x95, 0x3d, 0x06, 0xcf, 0x92, 0xbd,
- 0x1a, 0x20, 0xe9, 0x3e, 0xdc, 0x19, 0x7d, 0xbf, 0x2a, 0x48, 0x7e, 0x3d,
- 0x12, 0xf5, 0xd9, 0x3e, 0x4f, 0xab, 0x0d, 0xbe, 0x3a, 0x14, 0x37, 0x3e,
- 0xb3, 0x7b, 0x00, 0xbf, 0xb7, 0xa2, 0x4a, 0xbc, 0xef, 0xe7, 0xbb, 0x3e,
- 0x5c, 0x25, 0x11, 0xbe, 0xdc, 0x68, 0x3e, 0xbe, 0x5f, 0xdc, 0x9d, 0x3e,
- 0x4d, 0x50, 0x8c, 0xbe, 0x24, 0xdb, 0x66, 0xbe, 0x49, 0x94, 0x16, 0x3e,
- 0x25, 0xf7, 0xdb, 0xbe, 0xd2, 0x0a, 0xcf, 0x3e, 0x3e, 0x7b, 0xab, 0xbe,
- 0x05, 0x5c, 0x87, 0x3e, 0x72, 0xaf, 0x28, 0xbe, 0x2e, 0x70, 0x53, 0x3e,
- 0x83, 0x91, 0x2b, 0x3e, 0x52, 0x25, 0x00, 0xbe, 0x9a, 0x2a, 0x9a, 0xbc,
- 0x45, 0xba, 0x40, 0x3e, 0xba, 0x56, 0xb4, 0x3d, 0x7e, 0x52, 0x0f, 0xbf,
- 0x48, 0x78, 0xb4, 0x3e, 0x24, 0xb5, 0x14, 0xbb, 0x89, 0x04, 0xd9, 0x3d,
- 0x39, 0x95, 0xa0, 0x3e, 0xcc, 0x9c, 0x71, 0xbe, 0x68, 0x32, 0x7b, 0xbe,
- 0xa5, 0x49, 0x29, 0xbd, 0xee, 0xbe, 0x85, 0x3e, 0x44, 0x96, 0xd1, 0x3e,
- 0xe2, 0x52, 0xc3, 0x3c, 0xbe, 0x8f, 0x04, 0x3c, 0xa9, 0xef, 0x29, 0xbe,
- 0xc2, 0x11, 0xce, 0xbd, 0x06, 0xef, 0x9b, 0xbd, 0x05, 0xbb, 0x46, 0xbe,
- 0x2f, 0x84, 0x1f, 0x3e, 0xea, 0xc3, 0xa2, 0x3d, 0xfa, 0xdb, 0x77, 0x3e,
- 0x9f, 0xca, 0x3c, 0xbc, 0x90, 0x93, 0x00, 0xbe, 0xb5, 0x42, 0x83, 0x3e,
- 0xbc, 0x9a, 0xc1, 0xbe, 0xa3, 0xcd, 0xa4, 0x3e, 0xff, 0x46, 0x76, 0x3c,
- 0x60, 0xf4, 0x74, 0x3e, 0xd3, 0x22, 0xd8, 0x3d, 0x74, 0x89, 0x4e, 0x3e,
- 0x69, 0x74, 0x11, 0xbf, 0xde, 0xbf, 0x23, 0xbf, 0xa3, 0x98, 0xab, 0xbd,
- 0xbc, 0xe8, 0x44, 0x3e, 0xbe, 0xe2, 0xbc, 0xbe, 0xc4, 0xf1, 0x25, 0xbe,
- 0xd2, 0x1c, 0x37, 0xbe, 0xa1, 0x6c, 0x10, 0xbf, 0xc0, 0x2b, 0x28, 0xbf,
- 0x3e, 0x48, 0xe6, 0x3d, 0xd2, 0xc4, 0x57, 0x3e, 0xc8, 0xca, 0xc7, 0xbd,
- 0xc7, 0x03, 0xeb, 0xbe, 0x6e, 0xf9, 0x5a, 0x3d, 0x9b, 0x2b, 0x48, 0xbc,
- 0xbf, 0x6e, 0xe3, 0xbe, 0x59, 0x60, 0x9a, 0x3d, 0x8f, 0xcc, 0x2b, 0xbe,
- 0x3e, 0x27, 0xae, 0x3d, 0x06, 0xcf, 0xf6, 0xbb, 0x81, 0xd5, 0x51, 0x3e,
- 0xb6, 0x09, 0x26, 0x3e, 0x5d, 0x54, 0x09, 0xbf, 0x0c, 0x71, 0xb4, 0x3d,
- 0x06, 0x0d, 0x1e, 0x3c, 0x0e, 0x56, 0xb6, 0xbe, 0xed, 0x76, 0xfc, 0x3d,
- 0x6a, 0xbb, 0x4d, 0xbd, 0x72, 0x06, 0x06, 0xbf, 0x5b, 0x71, 0x57, 0x3d,
- 0x7c, 0x91, 0x58, 0xbe, 0x62, 0x4b, 0x10, 0x3e, 0xb7, 0x79, 0x34, 0xbe,
- 0xf9, 0x3b, 0x25, 0xbf, 0x6e, 0xf5, 0x3e, 0xbf, 0x53, 0x98, 0x1e, 0x3e,
- 0xd8, 0xb0, 0x28, 0x3e, 0x09, 0x45, 0x09, 0xbf, 0xef, 0xde, 0xf4, 0xbe,
- 0x1f, 0x36, 0x17, 0xbd, 0x79, 0x40, 0xc5, 0xbe, 0xef, 0x0c, 0x29, 0x3e,
- 0xcc, 0x9b, 0x94, 0xbc, 0xeb, 0x14, 0x07, 0xbf, 0x94, 0xcb, 0x13, 0x3d,
- 0x0e, 0x5d, 0x73, 0x3e, 0x8e, 0x78, 0xa3, 0x3d, 0x1d, 0x24, 0xe1, 0xbe,
- 0x95, 0x4b, 0x13, 0x3e, 0x4f, 0x55, 0xcf, 0x3e, 0xf8, 0x8a, 0x1a, 0xbe,
- 0x34, 0xdd, 0x41, 0x3e, 0xa9, 0x77, 0x3d, 0x3e, 0x1c, 0x49, 0x31, 0x3e,
- 0x44, 0xee, 0x5e, 0xbe, 0xd2, 0x8a, 0xf7, 0x3e, 0x89, 0x50, 0x41, 0x3e,
- 0xdf, 0x3c, 0xfb, 0x3e, 0xc5, 0x4d, 0x13, 0x3e, 0x50, 0x7c, 0x28, 0x3e,
- 0xeb, 0x4e, 0x1a, 0xbf, 0x4f, 0x7e, 0x3a, 0xbe, 0x5d, 0x6f, 0xac, 0xbe,
- 0x04, 0xbd, 0x8b, 0xbe, 0x64, 0x3a, 0x9d, 0xbd, 0x33, 0x5c, 0xbb, 0x3d,
- 0x74, 0xaf, 0x4e, 0xbf, 0x40, 0xbc, 0xb5, 0x3e, 0x57, 0x95, 0x3b, 0xbe,
- 0x4f, 0x31, 0x8b, 0x3d, 0x20, 0x43, 0x99, 0x3d, 0x43, 0x8a, 0x19, 0xbe,
- 0xe7, 0x24, 0x7c, 0xbe, 0x87, 0xc8, 0xd1, 0x3e, 0xa8, 0x94, 0xec, 0x3d,
- 0x95, 0x21, 0x16, 0xbf, 0x13, 0xed, 0x6f, 0x3e, 0x4e, 0x9c, 0x53, 0x3e,
- 0x06, 0x8b, 0x60, 0x3e, 0x0a, 0x82, 0x94, 0x3e, 0x92, 0x03, 0x23, 0x3f,
- 0x47, 0xf3, 0x51, 0xbc, 0x0a, 0x03, 0x85, 0xbd, 0x61, 0x33, 0x22, 0xbf,
- 0x51, 0x45, 0xb5, 0x3d, 0xc6, 0xff, 0x9a, 0x3d, 0xbc, 0xd1, 0x74, 0x3e,
- 0xe8, 0xb9, 0x9c, 0xbd, 0x56, 0xcc, 0xb9, 0xbe, 0x48, 0x0e, 0x2e, 0xbe,
- 0x33, 0x43, 0xca, 0xbd, 0xc2, 0x7f, 0x88, 0xbc, 0xe5, 0xda, 0x13, 0xbf,
- 0x1d, 0x5a, 0xad, 0xbd, 0x0e, 0xe2, 0x97, 0xbe, 0x08, 0x0d, 0x0c, 0xbe,
- 0xe1, 0x9c, 0x54, 0xbf, 0x5f, 0xe2, 0x0a, 0xbe, 0x44, 0xe6, 0x87, 0xbd,
- 0xb2, 0x6e, 0x80, 0x3e, 0x98, 0x45, 0x03, 0xbe, 0x1c, 0x0b, 0xd8, 0xbe,
- 0x1f, 0xd0, 0x22, 0x3d, 0x14, 0x17, 0xc3, 0x3e, 0xb5, 0x7d, 0x7d, 0xbe,
- 0xf4, 0xec, 0x60, 0x3e, 0x43, 0x39, 0x11, 0x3f, 0xd4, 0x81, 0x24, 0xbc,
- 0xf3, 0xca, 0xb6, 0xbd, 0x2a, 0xec, 0xf0, 0xbd, 0x56, 0xb5, 0xe4, 0xbe,
- 0xdc, 0xbf, 0x61, 0x3e, 0xa7, 0xec, 0x2a, 0x3e, 0x98, 0x7d, 0xbf, 0xbe,
- 0xda, 0x9a, 0x74, 0x3e, 0xe0, 0x8d, 0x30, 0xbe, 0x77, 0xf0, 0xd1, 0xbc,
- 0x79, 0x4e, 0x9d, 0xbe, 0xc4, 0x97, 0x51, 0x3e, 0x1a, 0x17, 0x98, 0x3e,
- 0x2e, 0x7f, 0x51, 0x3e, 0xee, 0xc6, 0x34, 0x3c, 0x30, 0x03, 0xac, 0x3d,
- 0xb5, 0x6e, 0xa7, 0x3e, 0x2f, 0x5c, 0x9c, 0xbe, 0x9f, 0x0d, 0x72, 0xbe,
- 0x11, 0x26, 0x5b, 0x3d, 0xc3, 0x7b, 0x99, 0x3e, 0x2e, 0xe9, 0x0e, 0x3f,
- 0x8d, 0x1f, 0x5b, 0xbe, 0x60, 0x5d, 0xf4, 0x3d, 0x63, 0x5e, 0x3c, 0x3e,
- 0x67, 0x5f, 0xb6, 0xbd, 0xb1, 0x59, 0xa1, 0x3e, 0x26, 0x76, 0xdf, 0x3e,
- 0xbd, 0xf0, 0xb9, 0x3d, 0x4d, 0x51, 0xba, 0xbd, 0x1d, 0xaa, 0x15, 0x3c,
- 0x49, 0x82, 0x8a, 0xbe, 0xb4, 0x05, 0x18, 0xbe, 0xd3, 0x43, 0x52, 0xbe,
- 0x1e, 0x7d, 0xf9, 0xbd, 0x43, 0x75, 0x95, 0x3e, 0x41, 0xb2, 0x0b, 0xbe,
- 0xb4, 0x62, 0x2d, 0xbf, 0xc8, 0xdc, 0xe5, 0x3d, 0xe7, 0x22, 0x0b, 0xbf,
- 0x44, 0x71, 0xb7, 0xbd, 0xab, 0xa4, 0xf2, 0xbd, 0x3b, 0x61, 0x23, 0x3d,
- 0x55, 0xc8, 0xb1, 0xbd, 0xe5, 0x8b, 0xa1, 0x3d, 0x45, 0x13, 0x24, 0x3e,
- 0x57, 0x77, 0x6d, 0xbe, 0xc5, 0x8d, 0x84, 0x3e, 0xf6, 0xb3, 0x45, 0x3e,
- 0x00, 0x15, 0xa2, 0xbe, 0x20, 0x37, 0xc7, 0xbd, 0x83, 0xca, 0xb4, 0x3e,
- 0xf8, 0xeb, 0x82, 0xbe, 0xeb, 0xdc, 0xb8, 0x3e, 0x56, 0xb0, 0x03, 0x3f,
- 0xc9, 0x10, 0xc1, 0xbe, 0xee, 0x2f, 0x99, 0xbe, 0x5e, 0x84, 0xd4, 0xbe,
- 0xd6, 0x30, 0x11, 0x3f, 0x4d, 0x23, 0x06, 0xbe, 0x35, 0x39, 0xbd, 0x3e,
- 0x4c, 0x0e, 0x6e, 0xbe, 0xc5, 0xda, 0x9a, 0xbe, 0x08, 0xfb, 0x6b, 0x3e,
- 0x5f, 0xeb, 0x25, 0x3e, 0xd0, 0x76, 0xff, 0xbe, 0xf0, 0x6b, 0xbe, 0x3e,
- 0x21, 0x81, 0x05, 0xbe, 0x04, 0xca, 0x0e, 0x3f, 0xa5, 0x34, 0x6f, 0x3d,
- 0x19, 0x35, 0x17, 0x3d, 0xa4, 0x32, 0x59, 0xbe, 0x69, 0x5e, 0x0b, 0x3f,
- 0x07, 0x75, 0xbc, 0x3d, 0xc8, 0x3c, 0xda, 0x3d, 0x46, 0x74, 0x36, 0x3d,
- 0xb5, 0x3b, 0x2f, 0x3e, 0xfc, 0x24, 0x8a, 0xbe, 0x9c, 0x2e, 0x6c, 0xbf,
- 0x18, 0x77, 0x73, 0x3e, 0x45, 0xe1, 0x37, 0xbe, 0x9d, 0x62, 0x71, 0xbc,
- 0x25, 0xba, 0x2d, 0x3f, 0xcc, 0xca, 0x87, 0xbe, 0x40, 0x4c, 0x85, 0x3d,
- 0x03, 0x2e, 0x13, 0x3e, 0x8b, 0x53, 0xa8, 0xbd, 0x89, 0x24, 0x44, 0x3e,
- 0xe7, 0xf9, 0x04, 0xbf, 0xa1, 0x33, 0xc7, 0x3d, 0x43, 0xb9, 0x2f, 0x3e,
- 0x67, 0x4e, 0x2a, 0x3d, 0x76, 0xec, 0xe7, 0x3d, 0x11, 0xdf, 0x0b, 0xbf,
- 0x8c, 0x54, 0x1e, 0xbe, 0xc6, 0x05, 0x7b, 0x3d, 0x02, 0x24, 0x31, 0xbe,
- 0xac, 0x7f, 0x14, 0xbe, 0x14, 0x40, 0xe8, 0x3e, 0xf4, 0x81, 0xd1, 0xbe,
- 0xf2, 0x19, 0x23, 0x3d, 0x14, 0x97, 0x32, 0xbe, 0x87, 0x2c, 0x94, 0x3d,
- 0xc2, 0x71, 0x16, 0x3e, 0xd3, 0xaf, 0x12, 0xbd, 0x21, 0x81, 0x15, 0x3e,
- 0x70, 0x88, 0x3b, 0x3e, 0xa7, 0xdf, 0xd4, 0xbd, 0x82, 0x5b, 0xe5, 0x3e,
- 0x09, 0x91, 0x27, 0x3e, 0xd4, 0x4e, 0x03, 0xbd, 0xaa, 0x8c, 0xb1, 0x3c,
- 0xe8, 0x27, 0x82, 0x3e, 0x83, 0xb5, 0x55, 0xbf, 0xfd, 0x37, 0x3f, 0xbc,
- 0xc0, 0x18, 0x9b, 0xbd, 0x6f, 0x71, 0xb4, 0xbe, 0x92, 0x79, 0x73, 0xbe,
- 0x49, 0xc4, 0x06, 0x3e, 0x9a, 0xd0, 0xbd, 0xbe, 0x39, 0x76, 0x30, 0x3e,
- 0x03, 0x12, 0x84, 0x3d, 0x31, 0x2f, 0x0b, 0xbe, 0x79, 0xbc, 0xe8, 0x3c,
- 0x71, 0x7a, 0x83, 0x3e, 0x7e, 0x21, 0x29, 0x3e, 0x3f, 0xbc, 0xb5, 0x3e,
- 0x8d, 0x7b, 0x67, 0x3d, 0xbc, 0xfc, 0xf9, 0xbd, 0xba, 0x74, 0x33, 0xbe,
- 0xd7, 0x43, 0x45, 0x3d, 0xeb, 0x8f, 0xbd, 0xbc, 0x4c, 0xb8, 0xcb, 0x3e,
- 0xa0, 0x26, 0x33, 0x3e, 0x0a, 0x37, 0x17, 0xbe, 0x4e, 0x64, 0x25, 0xbe,
- 0xd9, 0x41, 0x98, 0x3e, 0xe4, 0xf2, 0x2c, 0x3e, 0x8d, 0xe6, 0x34, 0x3e,
- 0x29, 0xfa, 0x8d, 0x3d, 0xe6, 0x91, 0x92, 0xbe, 0xb2, 0x2c, 0x3a, 0xbf,
- 0x3b, 0x39, 0x11, 0x3e, 0x68, 0x69, 0x20, 0x3e, 0x5a, 0xf2, 0x89, 0x3d,
- 0xb1, 0xd4, 0x29, 0x3e, 0xba, 0x6e, 0xb8, 0x3d, 0x11, 0xcd, 0xae, 0xbd,
- 0xd1, 0xaa, 0x46, 0x3d, 0x02, 0xa4, 0x79, 0x3e, 0x82, 0x26, 0xa6, 0xbd,
- 0xa8, 0x83, 0x3d, 0x3d, 0x06, 0xab, 0xed, 0xbe, 0x69, 0x5e, 0x48, 0x3e,
- 0x2c, 0xa7, 0xca, 0xbe, 0x09, 0x42, 0xa2, 0x3e, 0x0a, 0xc0, 0xe3, 0x3d,
- 0x76, 0x60, 0x62, 0xbd, 0xa8, 0x11, 0x67, 0x3c, 0x4a, 0x96, 0x60, 0x3e,
- 0x56, 0x0a, 0x98, 0xbe, 0x92, 0x82, 0xaf, 0x3d, 0x31, 0x08, 0x07, 0x3f,
- 0x46, 0xcf, 0x7a, 0xbe, 0x9c, 0x9f, 0x22, 0x3e, 0xa3, 0xef, 0x12, 0x3e,
- 0xad, 0xc1, 0xbe, 0xbe, 0xfb, 0x4e, 0xf5, 0xbc, 0x6c, 0xea, 0x9b, 0x3e,
- 0x37, 0x90, 0xb5, 0xbb, 0xa8, 0xd0, 0x2a, 0xbe, 0xee, 0x8d, 0xc7, 0x3e,
- 0x37, 0x27, 0x2d, 0x3e, 0x37, 0xb7, 0x2d, 0xbc, 0x06, 0xc3, 0x92, 0xbd,
- 0x42, 0x95, 0x55, 0x3e, 0xd9, 0x66, 0x02, 0xbf, 0xef, 0x8c, 0xc1, 0x3e,
- 0xf4, 0x84, 0x80, 0x3e, 0x3d, 0x16, 0x76, 0x3e, 0xa6, 0xd9, 0x90, 0xbe,
- 0x95, 0xbf, 0x76, 0x3e, 0x04, 0x39, 0x39, 0xbd, 0xf6, 0x42, 0xee, 0x3e,
- 0x14, 0x68, 0xaa, 0x3e, 0x05, 0xd7, 0x60, 0xbe, 0xda, 0x2e, 0x1f, 0xbf,
- 0x0b, 0x9f, 0x27, 0x3e, 0x5b, 0xcf, 0x2b, 0xbf, 0x3e, 0xad, 0x9a, 0xbf,
- 0x44, 0xb9, 0x6b, 0x3c, 0x12, 0x73, 0x9d, 0x3e, 0x2f, 0x21, 0xf0, 0xbe,
- 0x81, 0xd7, 0x06, 0xbe, 0xc6, 0xc9, 0xef, 0xbd, 0xdb, 0xa1, 0xa9, 0xbe,
- 0xd3, 0xa8, 0xf3, 0x3e, 0xee, 0x15, 0xec, 0x3e, 0x81, 0xd9, 0x00, 0xbf,
- 0xc3, 0x45, 0x77, 0x3e, 0x1a, 0xb5, 0x88, 0x3e, 0x58, 0x31, 0x16, 0x3e,
- 0x12, 0x7a, 0xb4, 0x3d, 0xb1, 0x07, 0x4c, 0xbd, 0x36, 0xf0, 0x1b, 0x3e,
- 0xe9, 0xb0, 0x49, 0x3e, 0x27, 0x3e, 0x6b, 0x3e, 0xab, 0xcf, 0xde, 0xbc,
- 0xf9, 0x20, 0x1c, 0x3f, 0xb3, 0x3b, 0x31, 0xbc, 0x1a, 0x63, 0x51, 0xbe,
- 0x23, 0xe6, 0x92, 0xbd, 0x50, 0xfb, 0x2b, 0xbe, 0x47, 0xb5, 0xe5, 0x3d,
- 0x76, 0xfa, 0x04, 0xbf, 0x46, 0xa2, 0x3a, 0xbd, 0xc7, 0xb3, 0xef, 0x3b,
- 0xb2, 0xe7, 0x55, 0xbe, 0x32, 0x40, 0xb3, 0x3e, 0xb5, 0x57, 0x36, 0x3f,
- 0xf2, 0x90, 0x79, 0x3c, 0xfc, 0x05, 0xf8, 0x3d, 0xe6, 0x79, 0xdc, 0xbd,
- 0x62, 0x75, 0x6e, 0x3d, 0xba, 0x25, 0x01, 0xbf, 0x43, 0x21, 0xa6, 0xbe,
- 0xe1, 0xa1, 0x22, 0x3e, 0x87, 0xbb, 0x22, 0xbf, 0xca, 0x54, 0xbe, 0x3d,
- 0xb2, 0x5a, 0xc0, 0x3c, 0x25, 0xde, 0xe7, 0xbd, 0x1e, 0xfc, 0xa8, 0x3e,
- 0x9b, 0xc2, 0xac, 0xbe, 0x5e, 0x67, 0x1b, 0x3c, 0xea, 0xee, 0xa9, 0xbe,
- 0xca, 0xae, 0x53, 0x3e, 0x84, 0xf7, 0xc1, 0xbe, 0x2f, 0x35, 0x8b, 0xbb,
- 0x41, 0xe0, 0x86, 0x3d, 0x11, 0x73, 0x42, 0xbf, 0x69, 0xb1, 0x69, 0xbe,
- 0x87, 0x70, 0xa3, 0xbd, 0x6e, 0xc0, 0xf7, 0xbe, 0x71, 0x3b, 0xcb, 0x3e,
- 0x06, 0x4a, 0x4a, 0x3e, 0x17, 0x7b, 0xcb, 0xbe, 0xcd, 0x79, 0x9b, 0x3e,
- 0xc0, 0xdb, 0xc2, 0xbe, 0x92, 0xcd, 0x9a, 0x3e, 0x7a, 0x83, 0x5e, 0xbd,
- 0xf3, 0x85, 0x0b, 0x3e, 0xd7, 0xe0, 0x3e, 0x3e, 0xa7, 0x2a, 0x39, 0xbe,
- 0x9f, 0x14, 0xfe, 0xbd, 0x08, 0xb7, 0x0a, 0xbf, 0x24, 0xea, 0x85, 0xbe,
- 0x59, 0x41, 0x3f, 0xbe, 0x69, 0x69, 0x14, 0xbe, 0x17, 0x57, 0x32, 0xbe,
- 0xda, 0x7a, 0x94, 0x3e, 0xff, 0xb9, 0x53, 0x3b, 0xc6, 0xa4, 0xd7, 0xbd,
- 0x87, 0xdf, 0xa2, 0xbd, 0x33, 0x78, 0x8c, 0xbe, 0x9d, 0xdc, 0xc1, 0x3d,
- 0x17, 0x99, 0xb2, 0xbe, 0xd3, 0x16, 0xca, 0xbd, 0x29, 0xf6, 0x9f, 0x3d,
- 0xc6, 0xbc, 0x7b, 0xbe, 0xdb, 0x35, 0x9f, 0x3e, 0xfe, 0x81, 0x0b, 0xbd,
- 0xec, 0xb4, 0x39, 0xbc, 0x01, 0xf6, 0x2c, 0xbe, 0x72, 0xf4, 0x6c, 0x3e,
- 0xd8, 0xb4, 0x0b, 0xbe, 0x17, 0x39, 0x0f, 0x3e, 0x66, 0xf4, 0x6d, 0x3e,
- 0xf7, 0xd1, 0xa9, 0x3d, 0x58, 0xc8, 0x05, 0x3e, 0xe7, 0x72, 0x68, 0xbd,
- 0x6e, 0xaf, 0x29, 0xbe, 0xd4, 0xd2, 0x43, 0xbe, 0x55, 0xf5, 0x38, 0x3d,
- 0xfd, 0x39, 0x23, 0xbe, 0xf0, 0xa3, 0x69, 0x3e, 0x54, 0x57, 0xa5, 0xbe,
- 0xf9, 0x07, 0x6b, 0x3e, 0x8d, 0xc4, 0xda, 0x3d, 0xf4, 0xd5, 0x57, 0xbe,
- 0x71, 0xd8, 0xf5, 0xbc, 0xd2, 0xec, 0x1f, 0x3e, 0xda, 0xe5, 0x83, 0xbe,
- 0x16, 0xf3, 0xb3, 0x3e, 0x7c, 0x7d, 0xfc, 0x3c, 0xd5, 0x17, 0x93, 0x3e,
- 0xe9, 0x16, 0xa9, 0xba, 0x2a, 0xab, 0xb5, 0x3e, 0x98, 0x22, 0x1a, 0xbe,
- 0x08, 0x6b, 0x8e, 0x3e, 0xb9, 0x79, 0x8e, 0xbc, 0x04, 0x4f, 0x1b, 0xbf,
- 0x73, 0x62, 0x4b, 0x3e, 0x75, 0x41, 0x1d, 0x3e, 0x89, 0x8a, 0x05, 0x3d,
- 0x82, 0x4a, 0xce, 0xbd, 0xd2, 0xea, 0x1f, 0x3e, 0xac, 0xc7, 0x14, 0xbe,
- 0xb1, 0x23, 0xc5, 0xbe, 0x83, 0x47, 0x02, 0x3e, 0x0b, 0xfb, 0x83, 0x3e,
- 0x9d, 0x58, 0xc7, 0xbd, 0xda, 0x7b, 0x96, 0xbe, 0x45, 0x62, 0x8b, 0x3e,
- 0x65, 0xff, 0x1d, 0xbe, 0x30, 0x4e, 0xbb, 0x3e, 0x91, 0x28, 0x10, 0x3f,
- 0xed, 0x9b, 0x6e, 0x3d, 0x5b, 0xb7, 0x12, 0x3f, 0xa8, 0x26, 0x1f, 0xbe,
- 0xf7, 0xbe, 0xcf, 0x3d, 0xd7, 0x1d, 0xa2, 0x3e, 0xce, 0x6f, 0xa2, 0x3e,
- 0x2e, 0x61, 0x9a, 0xbd, 0x71, 0xa7, 0xf2, 0x3e, 0xdf, 0x94, 0x7a, 0x3d,
- 0xeb, 0x76, 0x27, 0xbf, 0x05, 0x95, 0xf2, 0x3e, 0x3d, 0x76, 0x37, 0xbe,
- 0xbb, 0xda, 0xe2, 0xbe, 0xaf, 0x75, 0xc6, 0xbe, 0x10, 0x45, 0x2e, 0xbe,
- 0xb6, 0xf4, 0x63, 0x3d, 0xcd, 0xbc, 0x1d, 0xbd, 0x38, 0x98, 0xce, 0xbe,
- 0x6b, 0x04, 0x5d, 0x3d, 0xf2, 0x58, 0x2c, 0x3e, 0xb3, 0x16, 0x98, 0xbe,
- 0x0f, 0xdb, 0x83, 0xbd, 0x5a, 0xf1, 0xfc, 0xbe, 0x9c, 0xbc, 0x4f, 0xbd,
- 0x3f, 0x89, 0x55, 0x3e, 0xa4, 0xfa, 0x32, 0x3e, 0xe1, 0x0f, 0x31, 0x3e,
- 0x87, 0x6e, 0x97, 0xbd, 0x06, 0x19, 0xda, 0x3d, 0xf8, 0x00, 0x3d, 0x3d,
- 0x89, 0x49, 0x71, 0xbd, 0x83, 0x36, 0xba, 0x3c, 0x7d, 0x7b, 0x18, 0x3e,
- 0xc1, 0x3a, 0x61, 0xbc, 0x71, 0xdd, 0x48, 0x3b, 0x0d, 0x55, 0x26, 0xbf,
- 0x7b, 0xe6, 0x53, 0xbd, 0xf9, 0x13, 0x1b, 0x3e, 0x58, 0x97, 0x3a, 0x3e,
- 0x4b, 0xb3, 0xa9, 0xbe, 0x60, 0xf0, 0x44, 0xbe, 0x3b, 0xe1, 0xa9, 0xbc,
- 0x3d, 0x24, 0x4d, 0x3e, 0x5c, 0xca, 0xb9, 0x3c, 0xf0, 0xf9, 0xb5, 0x3e,
- 0x0f, 0xa4, 0x6f, 0x3d, 0x40, 0xf6, 0x90, 0x3e, 0xb5, 0x60, 0x4e, 0x3e,
- 0x7b, 0xaf, 0x79, 0xbd, 0x96, 0xd6, 0x8b, 0x3e, 0x8a, 0x6b, 0x98, 0x3e,
- 0xb2, 0x91, 0x9a, 0xbd, 0x79, 0xd6, 0x0e, 0xbf, 0x2f, 0x70, 0x8d, 0xbe,
- 0x53, 0x72, 0xb7, 0x3e, 0x53, 0x8b, 0x0e, 0xbf, 0x04, 0x5b, 0x0a, 0x3e,
- 0xf4, 0xe0, 0xb9, 0xbc, 0x2c, 0x52, 0x22, 0xbe, 0xb2, 0xed, 0xdc, 0xbd,
- 0x6e, 0x79, 0xe1, 0xbd, 0x59, 0x3b, 0x96, 0xbe, 0x6b, 0xf4, 0xcc, 0xbe,
- 0xa2, 0xc3, 0x6c, 0x3e, 0x1c, 0x3e, 0x9b, 0x3d, 0x2d, 0xf2, 0xe7, 0x3d,
- 0xc3, 0xcd, 0x0a, 0xbe, 0x23, 0x95, 0x4c, 0x3e, 0x09, 0x5b, 0xcf, 0x3e,
- 0xa5, 0xf2, 0x8d, 0x3d, 0x00, 0x69, 0xd8, 0xbd, 0xe8, 0xb7, 0xb5, 0xbe,
- 0xba, 0x71, 0xcf, 0xbe, 0x8a, 0xb2, 0x9b, 0xbd, 0xda, 0x4b, 0x95, 0xbe,
- 0x1d, 0xbe, 0x0c, 0xbe, 0x2d, 0xa8, 0x1b, 0xbf, 0xfb, 0xa0, 0x0f, 0x3d,
- 0x38, 0x14, 0x2e, 0x3e, 0x58, 0x3f, 0xbd, 0x3e, 0x25, 0x55, 0xcd, 0x3d,
- 0xb7, 0x8f, 0x3b, 0x3e, 0x8d, 0x6d, 0xa7, 0xbd, 0xd6, 0xa7, 0xc2, 0x3d,
- 0x8e, 0xa7, 0xba, 0xbe, 0x19, 0xff, 0x29, 0x3e, 0x51, 0x71, 0x0b, 0x3e,
- 0xbd, 0x1f, 0x9f, 0x3e, 0x7b, 0x42, 0xbc, 0x3d, 0xfe, 0xf3, 0x35, 0x3e,
- 0xde, 0x37, 0xeb, 0xbe, 0x37, 0x80, 0x82, 0x3e, 0x53, 0x7a, 0xbc, 0xbe,
- 0x37, 0x0e, 0x25, 0xbe, 0xd5, 0xad, 0x67, 0xbe, 0x2d, 0xf2, 0xdb, 0xbc,
- 0xf1, 0x41, 0x48, 0xbe, 0x76, 0x3c, 0x41, 0xbe, 0x30, 0x64, 0x17, 0x3e,
- 0xa7, 0x41, 0xc1, 0x3e, 0x43, 0xd0, 0x51, 0x3e, 0x22, 0xb1, 0x09, 0x3d,
- 0x57, 0xc9, 0x79, 0x3e, 0x47, 0x16, 0x03, 0x3f, 0xe6, 0x5d, 0x94, 0x3d,
- 0xfd, 0x23, 0x42, 0xbd, 0xfc, 0x1d, 0x7c, 0xbd, 0x2c, 0x94, 0xda, 0x3d,
- 0x22, 0x7a, 0x3c, 0xbb, 0xc6, 0x5f, 0x31, 0xbe, 0xdf, 0x97, 0x9d, 0xbe,
- 0x2a, 0x36, 0x02, 0xbe, 0x9e, 0x3e, 0x85, 0x3c, 0x92, 0x9d, 0x0b, 0xbb,
- 0x01, 0x8e, 0x55, 0x3e, 0x9b, 0x44, 0xb7, 0xbe, 0xd9, 0xcd, 0xdd, 0x3e,
- 0x4d, 0x1c, 0xcd, 0x3d, 0x49, 0x99, 0x72, 0x3e, 0x0f, 0x22, 0x0d, 0xbd,
- 0xfd, 0x2d, 0x05, 0x3e, 0x9e, 0x3e, 0xfd, 0x3d, 0xff, 0xb4, 0x51, 0xbe,
- 0x01, 0x76, 0x98, 0xbd, 0x2b, 0x34, 0x2e, 0xbe, 0x8e, 0xd1, 0x2f, 0xbd,
- 0x96, 0xa8, 0x53, 0x3e, 0x9f, 0x6c, 0x35, 0x3e, 0x57, 0xa3, 0x11, 0x3f,
- 0x7d, 0x13, 0x18, 0x3e, 0xbc, 0x00, 0x07, 0x3e, 0x83, 0x49, 0x07, 0xbf,
- 0xac, 0xd3, 0x10, 0xbf, 0x81, 0x63, 0xa6, 0x3e, 0xfe, 0x25, 0x82, 0x3d,
- 0x93, 0x00, 0xa7, 0x3e, 0x6d, 0xe0, 0x13, 0xbd, 0xc6, 0xc6, 0x3d, 0xbd,
- 0x7c, 0x59, 0xb6, 0xbe, 0x65, 0xd2, 0x98, 0xbe, 0x3f, 0x36, 0xe3, 0xbc,
- 0x73, 0xb3, 0xb6, 0xbd, 0x98, 0x90, 0x72, 0x3e, 0x8a, 0x7c, 0x94, 0x3e,
- 0x7d, 0x0f, 0x16, 0xbf, 0xd6, 0x6a, 0x04, 0xbd, 0xa0, 0xf4, 0x02, 0x3e,
- 0xe2, 0x5f, 0x12, 0x3e, 0xdc, 0x8d, 0x04, 0xbf, 0x0c, 0x9f, 0x0d, 0x3e,
- 0x5b, 0xeb, 0xd3, 0xbd, 0x1e, 0x46, 0xa3, 0xbd, 0x9d, 0xd7, 0xd4, 0xbc,
- 0x56, 0x40, 0x22, 0x3e, 0x09, 0x7d, 0xf2, 0x3b, 0x3c, 0x5c, 0x60, 0x3e,
- 0x12, 0x76, 0x05, 0xbe, 0xd2, 0x8f, 0xa5, 0xbd, 0x22, 0xa4, 0x2d, 0xbf,
- 0xb0, 0x49, 0x3c, 0x3e, 0x4f, 0x17, 0x91, 0xbe, 0x3b, 0x0c, 0x28, 0xbe,
- 0x73, 0xc0, 0xe1, 0x3e, 0x27, 0x36, 0x9c, 0x3e, 0xd6, 0x40, 0x75, 0xbc,
- 0x3e, 0x3e, 0x21, 0x3e, 0xfa, 0xfb, 0x29, 0xbe, 0x9d, 0x69, 0x64, 0x3c,
- 0x77, 0x15, 0xe0, 0x3e, 0x5a, 0x44, 0xd2, 0x3e, 0xab, 0x17, 0xe7, 0x3d,
- 0xf9, 0x64, 0xde, 0xbd, 0x0c, 0x5c, 0xb0, 0x3e, 0x69, 0xdf, 0x8c, 0xbe,
- 0x02, 0x2b, 0xdf, 0xbe, 0x32, 0x5c, 0x00, 0xbe, 0x5f, 0x70, 0xe0, 0x3d,
- 0x12, 0x06, 0x64, 0x3d, 0xf6, 0x52, 0x1d, 0x3e, 0xe5, 0x33, 0xb1, 0x3e,
- 0x09, 0x8e, 0xa4, 0xbe, 0xe4, 0xbf, 0x42, 0x3c, 0xf7, 0x22, 0x82, 0xbc,
- 0x1d, 0x69, 0x67, 0x3e, 0xa7, 0xcf, 0x72, 0xbe, 0xb2, 0xd9, 0xe2, 0x3c,
- 0xf4, 0x7a, 0x73, 0xbe, 0x3a, 0x31, 0x8a, 0x3d, 0x22, 0x3f, 0x8f, 0xbd,
- 0x82, 0xd5, 0x5b, 0x3e, 0x07, 0xa5, 0xd6, 0x3e, 0xb2, 0x51, 0x8c, 0x3e,
- 0x90, 0x32, 0x17, 0xbd, 0xc1, 0xd4, 0x0d, 0xbd, 0x23, 0xd8, 0x13, 0xbe,
- 0xc9, 0x19, 0x1e, 0x3e, 0x46, 0x33, 0xf7, 0xbd, 0xd8, 0xb8, 0x5c, 0x3e,
- 0x6f, 0x51, 0x29, 0xbf, 0xf6, 0xb2, 0x19, 0x3d, 0x60, 0x6c, 0x4e, 0x3e,
- 0x65, 0xf9, 0xc4, 0x3e, 0x58, 0x32, 0xd5, 0xbc, 0xfb, 0xf1, 0x83, 0x3d,
- 0x7f, 0x16, 0x84, 0x3e, 0xb0, 0xa1, 0x12, 0x3e, 0xd7, 0x91, 0x2c, 0x3e,
- 0xef, 0xed, 0x49, 0x3e, 0xa7, 0xca, 0x40, 0xbe, 0x8a, 0xcd, 0x86, 0x3e,
- 0x7c, 0x6d, 0x47, 0xbd, 0x2d, 0x5d, 0xc7, 0x3d, 0x31, 0xdd, 0xd9, 0x3d,
- 0xac, 0xb7, 0x99, 0x3e, 0xa7, 0xdf, 0x7c, 0xbe, 0xe9, 0x6d, 0x47, 0x3e,
- 0x36, 0xd7, 0x5c, 0x3e, 0xf8, 0xf1, 0x53, 0xbd, 0x6d, 0xd3, 0xed, 0x3d,
- 0xc4, 0x8c, 0x52, 0xbe, 0x06, 0x08, 0x65, 0xbe, 0x0c, 0xd2, 0xa2, 0xbe,
- 0x1e, 0xa8, 0x16, 0x3d, 0x13, 0xe0, 0xf0, 0x3d, 0x95, 0xa4, 0xb2, 0x3d,
- 0x82, 0x46, 0x2e, 0x3e, 0x09, 0x90, 0x5d, 0x3e, 0x50, 0x75, 0xe2, 0xbe,
- 0xec, 0x71, 0xd1, 0xbd, 0xc1, 0x0b, 0xbb, 0xbe, 0x21, 0x28, 0xb0, 0x3e,
- 0x06, 0xbd, 0x81, 0xbe, 0xac, 0x15, 0xe2, 0x3d, 0x3e, 0x9c, 0x5e, 0xbe,
- 0xb8, 0x46, 0x16, 0xbd, 0xb4, 0x72, 0xba, 0x3d, 0x50, 0x97, 0xa6, 0x3e,
- 0x4c, 0xc9, 0x36, 0xbe, 0xe5, 0x2b, 0x49, 0xbe, 0xbe, 0x70, 0xc6, 0xbe,
- 0x22, 0x7c, 0xa0, 0x3e, 0x43, 0xee, 0x64, 0x3d, 0x4c, 0xaf, 0x77, 0xbe,
- 0xae, 0x87, 0xf7, 0x3b, 0xe0, 0xa4, 0x10, 0x3d, 0x24, 0x74, 0xc0, 0xbe,
- 0xd4, 0x12, 0xce, 0xbe, 0x83, 0xfa, 0xc5, 0xbe, 0xbb, 0x75, 0x65, 0x3e,
- 0x08, 0x3c, 0x97, 0xbd, 0x14, 0x89, 0x30, 0x3e, 0x7d, 0xb0, 0x56, 0xbe,
- 0x45, 0xa8, 0xc9, 0xbc, 0x1c, 0x01, 0x6b, 0x3e, 0x88, 0x9a, 0x83, 0xbe,
- 0x4e, 0x36, 0xe5, 0xbe, 0x53, 0xde, 0x87, 0x3e, 0x91, 0x85, 0x93, 0x3e,
- 0x41, 0x1a, 0xeb, 0xbd, 0x87, 0xbd, 0xd9, 0x3d, 0xd0, 0x33, 0xc1, 0xbe,
- 0xc8, 0x78, 0x8b, 0x3e, 0xba, 0x8e, 0x81, 0x3e, 0x6b, 0x66, 0x53, 0x3e,
- 0x3c, 0x5a, 0x8b, 0x3e, 0x46, 0x15, 0x91, 0x3e, 0xbc, 0xfb, 0xa0, 0x3e,
- 0xf4, 0xc4, 0x12, 0xbd, 0xcb, 0x51, 0x1e, 0x3e, 0x1a, 0x6d, 0x0b, 0xbf,
- 0x79, 0x6a, 0x16, 0xbe, 0x88, 0x53, 0x67, 0xbe, 0xff, 0xa8, 0xe5, 0x3d,
- 0x23, 0xa8, 0x1c, 0xbf, 0x97, 0x0e, 0x80, 0x3e, 0x12, 0x0a, 0x81, 0x3e,
- 0x84, 0x00, 0x84, 0x3e, 0xa9, 0x0f, 0x5f, 0xbe, 0x9e, 0xa3, 0xe3, 0x3e,
- 0x36, 0xbb, 0x89, 0x3e, 0x99, 0x0e, 0x17, 0x3f, 0x73, 0x2b, 0x93, 0x3d,
- 0x24, 0x50, 0xf2, 0xbe, 0x10, 0xb2, 0x00, 0x3e, 0x07, 0x0c, 0x0a, 0x3f,
- 0x5f, 0xd9, 0x6a, 0xbe, 0xca, 0x5a, 0xc7, 0x3d, 0x8b, 0xed, 0x62, 0xbe,
- 0x6e, 0x42, 0xfb, 0xbd, 0xf2, 0x1f, 0x00, 0xbf, 0xff, 0x59, 0x42, 0xbd,
- 0xb4, 0xc1, 0x42, 0x3e, 0x7c, 0x01, 0x53, 0xbe, 0x15, 0x3e, 0x98, 0x3d,
- 0x56, 0x89, 0x6f, 0xbd, 0x36, 0x65, 0x4a, 0x3e, 0x00, 0x21, 0x89, 0xbe,
- 0xa6, 0x23, 0xd3, 0xbd, 0xa4, 0x85, 0x32, 0xbe, 0x68, 0x2b, 0x02, 0xbf,
- 0xe1, 0xfb, 0x4b, 0x3d, 0x23, 0x65, 0xe3, 0x3e, 0x34, 0x67, 0x6a, 0xbe,
- 0xa0, 0x86, 0xff, 0x3e, 0x57, 0xaa, 0xc8, 0xbe, 0xf9, 0x3e, 0x41, 0x3e,
- 0x51, 0xbb, 0x81, 0x3e, 0x52, 0x54, 0xa2, 0xbe, 0x4c, 0x24, 0x1a, 0xbf,
- 0xed, 0xd5, 0xb9, 0x3e, 0x37, 0x66, 0x95, 0x3e, 0xc7, 0x95, 0x59, 0x3e,
- 0x82, 0x0d, 0xa2, 0xbd, 0x32, 0xd7, 0xae, 0xbd, 0x66, 0x18, 0x33, 0xbe,
- 0x00, 0xad, 0xa1, 0xbe, 0x51, 0xd3, 0x6f, 0x3d, 0x15, 0xd2, 0x31, 0xbe,
- 0x89, 0x16, 0x18, 0xbf, 0xf6, 0xa8, 0xef, 0x3e, 0x84, 0x58, 0xf6, 0x3d,
- 0xd2, 0x4d, 0x5d, 0x3e, 0xeb, 0x2b, 0x65, 0x3d, 0x24, 0x87, 0x16, 0x3e,
- 0xc2, 0xb3, 0x77, 0x3e, 0x8e, 0x00, 0xaf, 0xbe, 0xb3, 0x0e, 0x65, 0xbb,
- 0x68, 0x36, 0xcd, 0x3d, 0x86, 0xb7, 0x0a, 0x3f, 0xd4, 0xde, 0xd0, 0xbc,
- 0x26, 0x19, 0x5c, 0x3e, 0x31, 0xad, 0xa8, 0xbd, 0xe2, 0xc1, 0xd6, 0xbd,
- 0x08, 0xcc, 0x10, 0x3f, 0xde, 0xde, 0x17, 0xbe, 0x1d, 0xae, 0x0d, 0xbf,
- 0x24, 0xd9, 0x3c, 0x3e, 0x39, 0x17, 0xf9, 0x3d, 0x26, 0x95, 0x96, 0x3e,
- 0x82, 0x48, 0x05, 0xbf, 0x58, 0xa6, 0x09, 0x3e, 0xfc, 0x72, 0x3c, 0x3e,
- 0x86, 0xec, 0x84, 0xbe, 0x68, 0xfc, 0xb9, 0x3e, 0xe2, 0x35, 0x16, 0x3f,
- 0x39, 0x0a, 0x59, 0xbe, 0xdc, 0x98, 0x0c, 0x3f, 0x01, 0x17, 0xa6, 0xbf,
- 0x88, 0x17, 0xda, 0xbe, 0x36, 0x6c, 0x6d, 0xbf, 0xd9, 0x15, 0xb3, 0x3d,
- 0xa7, 0xc9, 0xe5, 0x3e, 0x98, 0x0b, 0xb4, 0xbe, 0xda, 0xca, 0x5c, 0xbe,
- 0x2d, 0xa2, 0x99, 0xbd, 0xc9, 0x75, 0xb8, 0x3d, 0x73, 0xb6, 0x2f, 0xbe,
- 0xb6, 0xa6, 0xc2, 0x3e, 0x94, 0xfa, 0x13, 0xbf, 0x4d, 0x3a, 0x8a, 0xbe,
- 0x06, 0x05, 0xdd, 0xbd, 0x05, 0xf1, 0xc7, 0x3c, 0x61, 0x6a, 0x8a, 0xbe,
- 0x30, 0x39, 0x2a, 0x3f, 0x0c, 0x09, 0x37, 0xbd, 0xea, 0xdc, 0x99, 0x3e,
- 0x8a, 0x3b, 0x30, 0x3e, 0xd6, 0x25, 0x3c, 0xbf, 0x07, 0x2c, 0x17, 0xbe,
- 0xee, 0x80, 0x9d, 0xbd, 0x2f, 0x86, 0xa2, 0x3e, 0xa7, 0x4f, 0x2f, 0xbd,
- 0x35, 0x8b, 0x36, 0xbe, 0xd8, 0xdb, 0xe3, 0xbe, 0x0f, 0x07, 0xcd, 0xbd,
- 0x21, 0x60, 0xe3, 0x3e, 0xa1, 0xa5, 0x35, 0xbd, 0x62, 0x7b, 0xba, 0xbe,
- 0x50, 0x7e, 0xa9, 0x3d, 0xe5, 0x0d, 0xe1, 0xbc, 0x84, 0x43, 0x40, 0xbb,
- 0x87, 0x28, 0x8e, 0xbe, 0xe4, 0xaf, 0xe6, 0x3e, 0x31, 0x59, 0x75, 0xbe,
- 0x50, 0xb7, 0xe2, 0xbd, 0x9f, 0xe4, 0xae, 0x3d, 0x0b, 0x32, 0x17, 0xbe,
- 0xfc, 0x14, 0xea, 0x3d, 0xc8, 0x25, 0x28, 0xbe, 0xa2, 0xda, 0x2e, 0x3d,
- 0x33, 0x8a, 0xb0, 0xbc, 0xbd, 0xa1, 0xe9, 0xbd, 0x25, 0x1d, 0xac, 0xbd,
- 0x61, 0xdc, 0xe0, 0x3d, 0xfd, 0x22, 0x6c, 0x3e, 0x08, 0xc7, 0x48, 0x3e,
- 0x00, 0xcc, 0x69, 0xbe, 0x74, 0x51, 0xee, 0xbd, 0x22, 0xc7, 0x13, 0x3e,
- 0x2f, 0x4f, 0x03, 0x3d, 0xbc, 0x24, 0xd6, 0xbd, 0x11, 0xc7, 0xc6, 0xbd,
- 0x06, 0x51, 0x43, 0xbe, 0x2f, 0x57, 0xd1, 0x3e, 0x7e, 0x8f, 0x2c, 0x3d,
- 0x3b, 0x03, 0x0e, 0x3e, 0xca, 0x29, 0x2a, 0xbe, 0xd1, 0xdf, 0x0c, 0xbe,
- 0x1f, 0x70, 0xdc, 0xbd, 0xa5, 0x25, 0xe0, 0x3b, 0xea, 0x30, 0xa4, 0x3e,
- 0x93, 0x46, 0x48, 0xbe, 0xf9, 0xb7, 0x39, 0x3e, 0x39, 0xd1, 0x82, 0x3d,
- 0x13, 0x80, 0x15, 0x3d, 0x23, 0x43, 0x60, 0xbe, 0xdd, 0x75, 0x50, 0xbe,
- 0x72, 0xdc, 0xb3, 0xbc, 0xb4, 0x7c, 0xe6, 0x3d, 0xec, 0x13, 0xcc, 0x3d,
- 0x2a, 0x07, 0x0c, 0xbd, 0xc9, 0xe8, 0x8e, 0xbd, 0x0e, 0xee, 0x74, 0xbe,
- 0xca, 0xd1, 0x43, 0xbb, 0x78, 0xc8, 0x49, 0xbd, 0x89, 0x4c, 0xcf, 0xbe,
- 0x41, 0xd9, 0x19, 0x3e, 0xe6, 0xf1, 0x91, 0xbe, 0xe9, 0x7c, 0x7c, 0xbe,
- 0x2d, 0x3f, 0xe9, 0x3d, 0x0e, 0xc3, 0xa5, 0x3e, 0x02, 0x96, 0x68, 0x3c,
- 0xf3, 0xcd, 0xc9, 0x3d, 0x40, 0xe6, 0x41, 0x3e, 0xa6, 0x55, 0x6e, 0xbe,
- 0x87, 0xbb, 0xd1, 0x3c, 0x68, 0xe0, 0x3a, 0x3e, 0xb1, 0x5a, 0x6c, 0xbe,
- 0x03, 0x4d, 0x53, 0xbe, 0x23, 0xfe, 0xad, 0x3c, 0x55, 0xe6, 0xc2, 0x3d,
- 0x8d, 0xcf, 0x38, 0xbe, 0xb5, 0x95, 0x28, 0x3e, 0x6d, 0xd1, 0x12, 0xbe,
- 0x9a, 0x8c, 0x48, 0xbc, 0xc4, 0x9b, 0xa7, 0x3d, 0x95, 0x83, 0xd1, 0xbd,
- 0x2d, 0x9e, 0xbe, 0xbe, 0x9e, 0x7a, 0x7b, 0xbe, 0x58, 0x13, 0xce, 0x3e,
- 0xa0, 0x93, 0xfb, 0x3d, 0x77, 0x93, 0x15, 0xbd, 0xd4, 0x93, 0x2c, 0x3e,
- 0x2b, 0xf9, 0x8e, 0xbd, 0x7d, 0xa0, 0xe6, 0x3d, 0xa6, 0xb4, 0x98, 0xbd,
- 0xb3, 0x14, 0xd3, 0x3c, 0xa5, 0x41, 0x86, 0x3e, 0xa0, 0xfd, 0x06, 0x3d,
- 0x8c, 0x52, 0x9d, 0xbe, 0xd8, 0x1e, 0x18, 0xbe, 0x5a, 0xee, 0x34, 0x3e,
- 0x9d, 0x95, 0x52, 0xbe, 0x85, 0xdf, 0x0b, 0xbe, 0x30, 0x8e, 0x5e, 0xbe,
- 0xa6, 0x32, 0xea, 0xbd, 0x7d, 0xb2, 0x11, 0xbe, 0x5d, 0x16, 0x77, 0xbe,
- 0x89, 0xe7, 0x38, 0xbd, 0x9d, 0x36, 0x4c, 0xbf, 0x2c, 0x9a, 0x39, 0x3e,
- 0xeb, 0x7f, 0x2a, 0xbe, 0xc5, 0x1c, 0x88, 0xbe, 0x64, 0x76, 0x45, 0x3e,
- 0xf8, 0x5e, 0x6a, 0x3d, 0xd5, 0xc5, 0xb3, 0xbd, 0xef, 0xbb, 0x36, 0xbd,
- 0xe0, 0x7b, 0x58, 0x3d, 0x14, 0xb2, 0x33, 0x3e, 0x15, 0x81, 0x6a, 0x3e,
- 0xba, 0x1d, 0x52, 0xbc, 0x19, 0xab, 0xbf, 0xbd, 0x52, 0x74, 0x7d, 0xbd,
- 0xde, 0x27, 0x5a, 0xbc, 0x37, 0xf0, 0xf3, 0xbd, 0xfb, 0xf6, 0xd0, 0x3e,
- 0xcf, 0x47, 0x19, 0xbd, 0x01, 0xd8, 0x29, 0x3e, 0x91, 0x95, 0xcf, 0xbe,
- 0x15, 0xb0, 0x4b, 0x3e, 0x66, 0x72, 0x3e, 0xbe, 0x80, 0xea, 0x41, 0x3c,
- 0xe2, 0xd6, 0xc8, 0x3d, 0xe4, 0xad, 0x1f, 0xbf, 0x0b, 0x0d, 0xda, 0x3d,
- 0x22, 0xd8, 0x90, 0x3e, 0xc5, 0xf6, 0x24, 0xbf, 0x6f, 0x53, 0x77, 0xbe,
- 0xdf, 0x19, 0x43, 0x3f, 0x7d, 0xa3, 0x62, 0xbe, 0xd7, 0x86, 0x7d, 0xbd,
- 0xed, 0xcc, 0x8b, 0x3d, 0x98, 0x1b, 0xa6, 0xbe, 0x72, 0x0b, 0x03, 0xbe,
- 0x08, 0x49, 0xc0, 0xbe, 0xd1, 0xf5, 0x08, 0x3f, 0x3c, 0x6d, 0x1c, 0xbd,
- 0x5e, 0xfa, 0x49, 0x3d, 0x22, 0xd5, 0x00, 0x3e, 0x8b, 0xdd, 0xb8, 0xbe,
- 0x30, 0x06, 0xd7, 0x3d, 0x61, 0xe7, 0xb5, 0xbd, 0x3c, 0xd9, 0x59, 0x3d,
- 0xbc, 0x7b, 0x1f, 0xbd, 0x26, 0x9e, 0x8c, 0xbe, 0xab, 0xc2, 0xe8, 0xbd,
- 0x08, 0xcb, 0xfd, 0xbe, 0x21, 0x6b, 0xac, 0x3d, 0xb7, 0x1e, 0xbb, 0xbd,
- 0x03, 0xc6, 0x1f, 0xbe, 0xf4, 0x5c, 0x8f, 0x3e, 0x99, 0xff, 0xe7, 0x3d,
- 0x9a, 0xe6, 0xb7, 0xbe, 0x67, 0xbf, 0x62, 0xbe, 0xec, 0x59, 0xd0, 0x3d,
- 0x94, 0xad, 0xfe, 0xbd, 0x47, 0x8a, 0x1b, 0x3e, 0x66, 0xca, 0x82, 0xbd,
- 0x94, 0x52, 0x7d, 0xbd, 0x28, 0x60, 0xdf, 0xbd, 0xff, 0x13, 0xe1, 0xbe,
- 0x56, 0xe7, 0xa3, 0x3d, 0x59, 0xc0, 0x5d, 0xbe, 0x58, 0x58, 0x80, 0xbc,
- 0xb6, 0xe0, 0x89, 0x3d, 0xbf, 0x54, 0x8d, 0xbd, 0x79, 0x17, 0x90, 0x3e,
- 0xf2, 0x14, 0x0c, 0xbe, 0x0f, 0x8b, 0xcb, 0xbe, 0x02, 0x28, 0xd0, 0xbe,
- 0x0b, 0xfd, 0xb3, 0xbe, 0x30, 0xf5, 0x13, 0xbf, 0xb3, 0x72, 0x00, 0x3f,
- 0xc9, 0xad, 0x31, 0x3b, 0xb5, 0x80, 0x59, 0xbe, 0xae, 0x21, 0xbb, 0xbd,
- 0xd0, 0x9e, 0x68, 0xbd, 0xbf, 0x8f, 0x18, 0xbf, 0x90, 0xb1, 0x61, 0x3e,
- 0xa1, 0xa2, 0xc6, 0x3d, 0x98, 0x8a, 0xde, 0x3c, 0xdb, 0x83, 0xf4, 0xbe,
- 0x5b, 0x19, 0x5a, 0x3e, 0xed, 0x0c, 0xfa, 0xbb, 0xb6, 0xea, 0x42, 0x3f,
- 0x4b, 0x64, 0x52, 0xbd, 0x2c, 0xd6, 0x3b, 0x3d, 0xc7, 0x1d, 0x84, 0xbe,
- 0x94, 0xbd, 0xd6, 0x3e, 0xb0, 0xe8, 0x1f, 0xbf, 0x53, 0x95, 0x53, 0xbf,
- 0x99, 0x8e, 0x01, 0xbf, 0x65, 0x65, 0x9f, 0x3d, 0x8f, 0x96, 0x1f, 0xbe,
- 0xb9, 0x14, 0x0d, 0x3e, 0xe1, 0x49, 0x24, 0xbf, 0xc7, 0x9b, 0x63, 0xbe,
- 0x0b, 0x46, 0x93, 0x3c, 0xb6, 0x5b, 0x01, 0xbf, 0xff, 0x01, 0xad, 0xbe,
- 0xf1, 0x57, 0x11, 0x3e, 0x0c, 0xed, 0x80, 0x3d, 0xec, 0xab, 0xc1, 0xbc,
- 0x1d, 0x28, 0x63, 0xbd, 0x19, 0x8c, 0x0f, 0x3f, 0x06, 0xf7, 0xee, 0x3d,
- 0x65, 0x6d, 0x16, 0x3f, 0xb5, 0xd9, 0x12, 0xbd, 0x66, 0x64, 0x34, 0x3f,
- 0x00, 0x23, 0xdd, 0x3d, 0x52, 0x40, 0x15, 0xbf, 0xc5, 0x06, 0xec, 0xbe,
- 0xbd, 0x1b, 0x79, 0xbe, 0x3e, 0x21, 0x11, 0xbe, 0xa3, 0x7f, 0xb1, 0x3d,
- 0x52, 0x64, 0x97, 0xbe, 0xb9, 0xfc, 0x70, 0x3d, 0x40, 0x20, 0x0d, 0xbf,
- 0x74, 0xf5, 0xa1, 0xbe, 0x1f, 0xe2, 0x73, 0x3e, 0xee, 0xc6, 0x46, 0x3e,
- 0xd9, 0x5f, 0xd2, 0x3c, 0xec, 0x7f, 0x44, 0x3d, 0x6f, 0x5a, 0xdb, 0x3e,
- 0x73, 0xa1, 0x7d, 0xbe, 0x56, 0xff, 0x97, 0x3d, 0x30, 0x5e, 0xa2, 0xbe,
- 0x20, 0x20, 0x17, 0x3d, 0x8b, 0x08, 0x73, 0xbd, 0xaf, 0x66, 0x00, 0xbc,
- 0x2e, 0xb9, 0xb7, 0xbd, 0xb3, 0xae, 0xb1, 0x3d, 0xde, 0x09, 0xce, 0x3e,
- 0xa1, 0xe7, 0x83, 0xbb, 0x14, 0x02, 0x86, 0xbd, 0x15, 0x68, 0x6c, 0x3e,
- 0x90, 0x6a, 0x09, 0xbe, 0xbd, 0xb6, 0xa7, 0xbe, 0xd5, 0x4f, 0x0f, 0xbe,
- 0x4c, 0x0c, 0x93, 0xbb, 0xf0, 0xd5, 0x11, 0xbe, 0x83, 0xa9, 0x0b, 0xbe,
- 0x3d, 0xf5, 0x46, 0xbe, 0x9e, 0x88, 0x26, 0xbf, 0x73, 0x91, 0x07, 0x3e,
- 0x06, 0x2a, 0x0d, 0xbd, 0x79, 0x3b, 0xf7, 0xbe, 0x0c, 0x81, 0x0a, 0xbf,
- 0x80, 0x72, 0x3f, 0xbe, 0x93, 0x8a, 0xfa, 0xbe, 0x3c, 0x99, 0x99, 0xbe,
- 0xf7, 0x59, 0x97, 0xbd, 0x5a, 0x62, 0x36, 0xbe, 0x2d, 0xbd, 0x11, 0xbd,
- 0xb9, 0xe2, 0xbb, 0x3c, 0x50, 0x47, 0x17, 0xbf, 0x92, 0xd5, 0x64, 0xbd,
- 0x5b, 0xf0, 0xad, 0x3e, 0x6e, 0x31, 0x31, 0x3d, 0x02, 0xcf, 0x2c, 0xbd,
- 0x2c, 0x39, 0x10, 0xbe, 0x65, 0xde, 0x6b, 0xbe, 0x3a, 0x1c, 0x8c, 0xbe,
- 0xc0, 0x3c, 0xbe, 0x3d, 0xca, 0x2b, 0x3c, 0x3e, 0x90, 0xb6, 0x3f, 0x3e,
- 0x4f, 0x7e, 0x99, 0xbe, 0x87, 0x96, 0x97, 0x3c, 0x22, 0x78, 0x92, 0x3e,
- 0x3b, 0xe4, 0x9a, 0xbe, 0x90, 0x84, 0x0e, 0xbe, 0x68, 0x1d, 0x97, 0x3e,
- 0x02, 0x5b, 0x40, 0xbe, 0x7d, 0xaa, 0x68, 0xbf, 0x5f, 0x84, 0x6a, 0xbe,
- 0x3f, 0xb1, 0x2e, 0xbf, 0x0a, 0x0c, 0xce, 0x3e, 0x5e, 0xf8, 0xc3, 0x3d,
- 0x93, 0x39, 0xc4, 0x3e, 0x73, 0x70, 0x82, 0x3e, 0x04, 0x69, 0x73, 0x3d,
- 0xd5, 0xef, 0x1b, 0xbd, 0x3d, 0x10, 0xc9, 0x3d, 0x47, 0xd4, 0x27, 0xbf,
- 0xd6, 0x60, 0x89, 0x3d, 0x3f, 0x5f, 0x47, 0x3d, 0xbd, 0xd0, 0xfa, 0x3d,
- 0x2b, 0x0e, 0xc7, 0xbe, 0xbc, 0xcf, 0x44, 0xbe, 0x6a, 0xbe, 0xbc, 0x3e,
- 0x25, 0x95, 0x2d, 0xbd, 0xe8, 0xee, 0x8b, 0xbe, 0x70, 0x44, 0x2a, 0xbd,
- 0x7a, 0xa4, 0x1a, 0xbe, 0x95, 0x7b, 0xcf, 0x3d, 0x82, 0x16, 0x92, 0xbe,
- 0x9b, 0x79, 0x33, 0xbe, 0xa5, 0x45, 0x83, 0xbe, 0xdc, 0x92, 0x05, 0x3b,
- 0xe5, 0x7d, 0x83, 0xbe, 0x76, 0x0e, 0xf7, 0x3e, 0xf4, 0xb7, 0x7e, 0x3d,
- 0x07, 0x66, 0xb4, 0xbd, 0xf9, 0x57, 0x63, 0xbe, 0x0b, 0xb4, 0x12, 0xbf,
- 0x86, 0xf2, 0xff, 0xbc, 0x3c, 0x36, 0x0a, 0xbf, 0xe4, 0x04, 0x16, 0xbc,
- 0x88, 0xcd, 0x26, 0x3e, 0xbe, 0xb8, 0x3c, 0xbd, 0x95, 0x8b, 0x00, 0x3a,
- 0xc1, 0x1a, 0xf1, 0x3b, 0x43, 0xa0, 0x35, 0x3e, 0x09, 0xd2, 0x96, 0xbd,
- 0x19, 0xb1, 0xa6, 0xbe, 0xfe, 0x8a, 0x08, 0x3e, 0xd0, 0x59, 0xb5, 0xbe,
- 0x29, 0x8e, 0x33, 0xbc, 0xb0, 0x69, 0x34, 0x3e, 0x8e, 0x06, 0xb5, 0xbd,
- 0x6a, 0xbe, 0x4e, 0xbe, 0xe5, 0xaf, 0xa8, 0x3e, 0xef, 0x37, 0xf5, 0x3d,
- 0x06, 0x55, 0x3c, 0xbe, 0xfb, 0x55, 0xb9, 0xbc, 0x5e, 0x25, 0x1b, 0xbf,
- 0x71, 0x9b, 0x2a, 0x3e, 0xff, 0x5c, 0xbc, 0xbe, 0xcb, 0x0a, 0xfd, 0xbe,
- 0x3e, 0xa8, 0x3e, 0x3e, 0xa3, 0x2d, 0x89, 0xbd, 0x52, 0xdb, 0xaa, 0x3d,
- 0x99, 0x00, 0x53, 0xbe, 0x0b, 0x07, 0x5f, 0xbe, 0x9a, 0x03, 0xd5, 0xbd,
- 0xef, 0x41, 0x14, 0xbd, 0x1e, 0x40, 0x0e, 0xbe, 0xbf, 0x1c, 0x63, 0xbd,
- 0xd6, 0x0e, 0xa8, 0xbe, 0x40, 0x55, 0x82, 0xbd, 0x3a, 0xfb, 0x05, 0x3c,
- 0x44, 0x8d, 0x81, 0x3e, 0xbf, 0xf4, 0x6e, 0x3e, 0x0f, 0xcf, 0xbc, 0x3c,
- 0xa9, 0x4f, 0x46, 0x3d, 0xa0, 0x1d, 0xf7, 0x3c, 0x1b, 0xa2, 0xab, 0xbe,
- 0x69, 0xde, 0xe1, 0x3c, 0x9d, 0x74, 0xb2, 0x3e, 0x51, 0x36, 0x21, 0xbd,
- 0xef, 0xc6, 0xd3, 0xbe, 0x9a, 0x09, 0xaa, 0xbc, 0xd3, 0xe7, 0x32, 0xbc,
- 0xe4, 0xe8, 0xa2, 0x3e, 0x96, 0x5b, 0x2c, 0xbe, 0xb7, 0x57, 0x3a, 0x3e,
- 0xbd, 0xc7, 0x53, 0xbe, 0xc1, 0x43, 0x18, 0x3e, 0x71, 0x3e, 0xea, 0xbc,
- 0x7d, 0x97, 0xaa, 0x3d, 0x97, 0x32, 0x5c, 0xbe, 0x5b, 0xcd, 0xfe, 0x3d,
- 0xc8, 0xf1, 0x39, 0x3d, 0x8e, 0x39, 0x78, 0xbe, 0x6d, 0x9d, 0xbb, 0x3e,
- 0x63, 0x59, 0x6f, 0xbe, 0x05, 0x7d, 0x42, 0x3e, 0xee, 0x8e, 0x67, 0x3e,
- 0x43, 0x95, 0xcb, 0xbe, 0x4d, 0xfe, 0xd9, 0x3e, 0x58, 0x13, 0x96, 0x3e,
- 0x52, 0x8b, 0xd6, 0xbe, 0x27, 0x6f, 0x0d, 0x3e, 0xe4, 0x04, 0x84, 0xbf,
- 0x1c, 0xfb, 0xde, 0x3e, 0xa0, 0xe4, 0xe1, 0xbe, 0x7f, 0xc7, 0xe3, 0x3d,
- 0xee, 0x91, 0x03, 0xbd, 0xe1, 0x4f, 0x7d, 0xbe, 0x0c, 0xf7, 0xaf, 0xbe,
- 0x98, 0x83, 0xaa, 0xbe, 0x6a, 0xa4, 0x85, 0xbe, 0x65, 0x4b, 0x52, 0x3e,
- 0x4e, 0x93, 0x3e, 0xbf, 0x4c, 0x9c, 0x02, 0x3f, 0x78, 0x1c, 0xa9, 0xbe,
- 0x04, 0xfa, 0x00, 0xbf, 0x5f, 0x60, 0xf5, 0x3d, 0x50, 0x70, 0xca, 0x3e,
- 0x77, 0xb4, 0x1e, 0xbf, 0x55, 0xe8, 0x86, 0x3d, 0xc1, 0xed, 0x20, 0xbf,
- 0x21, 0x3a, 0xc5, 0xbe, 0x39, 0xcc, 0x3e, 0x3e, 0x9f, 0xf8, 0x99, 0xbf,
- 0x52, 0xb7, 0x2b, 0x3e, 0x6c, 0x26, 0xb6, 0x3c, 0x77, 0xa6, 0xbe, 0x3d,
- 0x47, 0x1a, 0x1f, 0xbe, 0x62, 0xec, 0x8f, 0x3e, 0x9b, 0x7b, 0xe2, 0x3d,
- 0x9f, 0xb7, 0xa4, 0x3e, 0x3f, 0x8a, 0xff, 0xbd, 0x2b, 0x48, 0x3f, 0x3e,
- 0xa7, 0x60, 0x8f, 0x3d, 0x1e, 0xb4, 0xbb, 0xbe, 0x68, 0xb5, 0x28, 0xbf,
- 0x97, 0x70, 0xc2, 0x3e, 0xf5, 0x26, 0x88, 0x3d, 0xd4, 0xfb, 0x8e, 0x3d,
- 0x12, 0x25, 0xf1, 0xbe, 0x81, 0xb7, 0x3e, 0x3e, 0x3f, 0x3b, 0xa1, 0x3d,
- 0x12, 0xf1, 0x91, 0xbe, 0xdc, 0x6f, 0xa4, 0x3e, 0x93, 0x7e, 0x57, 0xbe,
- 0xf1, 0xb4, 0x3b, 0xbe, 0x75, 0xea, 0x90, 0xbd, 0xf6, 0x85, 0xbf, 0xbe,
- 0x97, 0x31, 0x2b, 0x3e, 0x84, 0xa8, 0x9a, 0xbd, 0x82, 0xb5, 0xbf, 0x3e,
- 0x34, 0x86, 0x05, 0xbf, 0x8b, 0xf1, 0xad, 0x3c, 0x63, 0xd4, 0xe7, 0xbd,
- 0x55, 0xb4, 0x88, 0x3e, 0xa4, 0x91, 0x08, 0x3e, 0x5c, 0xee, 0xa9, 0xbe,
- 0xd7, 0xa3, 0x56, 0x3e, 0xe2, 0x85, 0x7c, 0x3e, 0x6e, 0xa7, 0xa6, 0xbd,
- 0xb4, 0xa6, 0x2a, 0xbf, 0x93, 0xaa, 0x1a, 0xbe, 0x66, 0x57, 0xfd, 0xbe,
- 0xa5, 0x77, 0x74, 0xbd, 0x51, 0xeb, 0xca, 0xbd, 0x8c, 0xa1, 0x38, 0xbf,
- 0x99, 0xb7, 0xae, 0x3e, 0x37, 0x05, 0x37, 0xbd, 0x55, 0x82, 0xd4, 0x3d,
- 0xec, 0x77, 0x3c, 0x3e, 0xd4, 0x6c, 0xce, 0x3d, 0xbe, 0xce, 0x6a, 0xbe,
- 0x9d, 0xe5, 0xb7, 0x3e, 0xe5, 0x65, 0x1b, 0x3d, 0x83, 0x92, 0x59, 0x3e,
- 0x3d, 0xa1, 0x9c, 0xbe, 0x83, 0x9d, 0x1f, 0xbe, 0xe2, 0xdf, 0xc3, 0x3c,
- 0x88, 0x03, 0xb5, 0x3e, 0xf6, 0xd2, 0xd3, 0xbe, 0xe4, 0x03, 0x97, 0xbf,
- 0x29, 0xd7, 0xac, 0xbe, 0xd2, 0x37, 0x63, 0xbd, 0x92, 0x47, 0x84, 0x3e,
- 0x53, 0xcb, 0x17, 0xbf, 0xa4, 0xfe, 0x76, 0x3d, 0x3a, 0xac, 0x84, 0x3e,
- 0x23, 0xec, 0xa8, 0x3e, 0xfa, 0xe9, 0xf9, 0x3d, 0xbd, 0xf0, 0x8f, 0x3d,
- 0x73, 0x3f, 0x80, 0x3d, 0x9d, 0xb4, 0x1d, 0xbf, 0x2d, 0x82, 0xa3, 0xbe,
- 0x00, 0x12, 0xbc, 0x3d, 0x76, 0x22, 0xd5, 0xbd, 0x56, 0x19, 0x3f, 0x3e,
- 0x14, 0x9a, 0xee, 0x3e, 0x38, 0x32, 0x88, 0xbd, 0x53, 0x44, 0x06, 0x3e,
- 0xbe, 0x63, 0x14, 0xbf, 0x09, 0xa2, 0xc4, 0xbd, 0x96, 0x3a, 0xd3, 0xbe,
- 0x6c, 0xe9, 0xb4, 0xbd, 0xe0, 0xf2, 0xd1, 0x3c, 0x41, 0x03, 0x12, 0x3e,
- 0x48, 0xa3, 0xc0, 0xbe, 0xe3, 0x71, 0x86, 0xbe, 0x86, 0x74, 0x07, 0xbf,
- 0x92, 0x1c, 0xa2, 0x3d, 0x11, 0x97, 0x09, 0x3d, 0xab, 0x5a, 0x25, 0x3d,
- 0x92, 0x36, 0xc2, 0xbd, 0xed, 0x5c, 0x4a, 0xbe, 0x3b, 0xb3, 0x1c, 0xbf,
- 0xc7, 0x65, 0x15, 0xbf, 0x2e, 0xc2, 0x45, 0x3e, 0x72, 0x8f, 0x8b, 0xbc,
- 0xc3, 0x86, 0x90, 0xbd, 0xe4, 0x2d, 0x99, 0x3e, 0xd6, 0xa3, 0x6f, 0xbd,
- 0x7f, 0xad, 0xb4, 0x3e, 0x77, 0xed, 0x8c, 0x3d, 0x3f, 0xb7, 0xe8, 0x3d,
- 0x52, 0xde, 0x2b, 0x3e, 0xec, 0xda, 0x63, 0x3e, 0x5c, 0xae, 0x97, 0x3e,
- 0xdb, 0x3a, 0x16, 0xbe, 0x7f, 0x82, 0xb3, 0xbe, 0x7a, 0x6d, 0x7a, 0x3e,
- 0xc7, 0x36, 0x91, 0xbe, 0x0c, 0xe9, 0x73, 0xbe, 0xc3, 0xc3, 0xd9, 0x3e,
- 0x8a, 0xb0, 0xf5, 0x3e, 0xb4, 0x9a, 0x18, 0xbd, 0x18, 0x94, 0xe2, 0xbe,
- 0x02, 0xa9, 0xab, 0xbc, 0x94, 0x2c, 0x25, 0x3e, 0xbf, 0x1c, 0x60, 0x3e,
- 0x20, 0x44, 0x1c, 0x3e, 0xc4, 0x4b, 0x87, 0x3e, 0xcc, 0xb9, 0xa8, 0x3d,
- 0xf5, 0x10, 0xcc, 0xbe, 0x2e, 0x1d, 0xec, 0x3c, 0xed, 0xb3, 0x0c, 0x3e,
- 0x84, 0x07, 0x29, 0x3e, 0x8c, 0x74, 0x5e, 0xbf, 0xd1, 0x02, 0x13, 0x3e,
- 0x8c, 0xdd, 0xfc, 0x3d, 0x83, 0x12, 0xbf, 0x3d, 0xc3, 0xa3, 0x8e, 0xbd,
- 0x33, 0x0d, 0x25, 0x3e, 0x4b, 0x1d, 0x19, 0xbe, 0x79, 0xbc, 0x61, 0x3e,
- 0x72, 0xea, 0x3b, 0xbe, 0x1a, 0x9e, 0x18, 0xbe, 0x50, 0x93, 0x17, 0xbf,
- 0x49, 0x54, 0xa4, 0xbe, 0x65, 0x0f, 0x89, 0x3d, 0x78, 0x5b, 0x0b, 0x3e,
- 0xb4, 0x6c, 0x2e, 0xbe, 0x73, 0x02, 0x45, 0xbe, 0x8e, 0x5c, 0x7c, 0xbe,
- 0xcd, 0x8b, 0x0a, 0xbd, 0xce, 0xe2, 0x61, 0x3e, 0x7f, 0xe3, 0xce, 0xbc,
- 0x3e, 0x5f, 0xa7, 0x3d, 0xac, 0x6a, 0x9a, 0xbe, 0x50, 0xb7, 0x94, 0xbe,
- 0x70, 0x15, 0xd0, 0xbd, 0x5b, 0x26, 0xf6, 0xbd, 0x13, 0xaa, 0x8b, 0xbd,
- 0x94, 0xa0, 0x5e, 0xbe, 0xcd, 0xe1, 0xd5, 0xbd, 0x79, 0xbe, 0x1a, 0xbe,
- 0x84, 0x96, 0x79, 0xbe, 0x74, 0x6d, 0x89, 0x3d, 0x79, 0xba, 0x1f, 0xbe,
- 0x00, 0xe9, 0xd0, 0xbe, 0xca, 0xf5, 0x10, 0x3e, 0x1b, 0xcf, 0x98, 0x3e,
- 0xe9, 0x40, 0x2d, 0xbe, 0xae, 0xec, 0x4b, 0xbf, 0x7a, 0x41, 0x8b, 0xbe,
- 0xd9, 0x25, 0x82, 0xbe, 0x92, 0xd8, 0x41, 0xbe, 0xac, 0x31, 0xd3, 0x3b,
- 0x19, 0x81, 0xac, 0xbc, 0x21, 0x4f, 0x94, 0x3e, 0x20, 0xf5, 0x23, 0xbe,
- 0x86, 0x05, 0xb8, 0xbe, 0x1f, 0xb7, 0x01, 0x3d, 0xe7, 0xea, 0x8a, 0x3d,
- 0xc5, 0xdc, 0xb3, 0x3b, 0xac, 0x4e, 0xcd, 0x3e, 0xcf, 0x03, 0x58, 0x3e,
- 0x44, 0xe7, 0x8f, 0xbe, 0x57, 0xae, 0x1b, 0xbe, 0xd9, 0x41, 0x43, 0x3e,
- 0xce, 0x0c, 0xaf, 0xbd, 0x6a, 0x10, 0x58, 0xbd, 0x3c, 0xc9, 0xfd, 0xbe,
- 0x44, 0x0f, 0xaa, 0x3e, 0x18, 0x3e, 0x0a, 0x3e, 0x7e, 0x9f, 0x0f, 0x3d,
- 0xba, 0x2d, 0xbc, 0x3d, 0xdf, 0x2a, 0xb5, 0xbd, 0x9f, 0xd5, 0xfe, 0xbe,
- 0x7b, 0xf4, 0xae, 0xbd, 0x9f, 0xdf, 0x4d, 0xbd, 0x3b, 0xb2, 0x0d, 0xbd,
- 0x65, 0xfe, 0xa5, 0x3e, 0x54, 0x69, 0x92, 0x3d, 0x58, 0xf1, 0x3d, 0xbc,
- 0xe0, 0x63, 0x33, 0x3e, 0x3c, 0xc9, 0x9a, 0x3c, 0x0e, 0xe5, 0x61, 0xbe,
- 0x6d, 0x90, 0x9e, 0x3c, 0xc1, 0x2d, 0x9c, 0xbd, 0xfa, 0xff, 0x96, 0xbd,
- 0x49, 0x84, 0x29, 0xbd, 0xb7, 0x1c, 0x9d, 0xbe, 0xae, 0x82, 0x2f, 0x3e,
- 0xad, 0xd7, 0xa5, 0xbd, 0x41, 0x11, 0xdc, 0x3c, 0x2a, 0xb7, 0x22, 0xbe,
- 0xb8, 0x31, 0x78, 0xbd, 0xdb, 0xbf, 0x58, 0xbd, 0xa3, 0x60, 0xd0, 0x3d,
- 0x17, 0x8d, 0x52, 0xbf, 0x0f, 0xaf, 0x33, 0x3e, 0xb9, 0x59, 0x59, 0xbd,
- 0x0f, 0x16, 0x91, 0x3e, 0xb6, 0x02, 0xb5, 0x3d, 0x44, 0x51, 0xa6, 0xbe,
- 0x6f, 0xf4, 0x2a, 0xbe, 0x9f, 0x12, 0x2f, 0x3d, 0x0e, 0x4f, 0xd1, 0x3d,
- 0x68, 0x83, 0xa9, 0x3d, 0x75, 0x41, 0x10, 0xbe, 0x49, 0x86, 0x81, 0x3e,
- 0x8b, 0x2e, 0xa1, 0x3e, 0xa6, 0xcf, 0xa9, 0xbd, 0xe3, 0xef, 0x63, 0xbe,
- 0x14, 0x94, 0x26, 0x3d, 0x76, 0x77, 0x7e, 0xbc, 0x6b, 0xdf, 0x30, 0xbe,
- 0x8d, 0xa7, 0x93, 0xbb, 0x5c, 0x4c, 0x8a, 0x3e, 0x6d, 0xff, 0xdb, 0x3d,
- 0x69, 0xb2, 0x01, 0x3f, 0x2c, 0xf2, 0x59, 0xbe, 0x02, 0xbf, 0xc6, 0x3d,
- 0xee, 0xaf, 0x13, 0xbd, 0xab, 0xad, 0x09, 0xbf, 0x4d, 0x46, 0x1b, 0x3e,
- 0x8e, 0x9b, 0x1c, 0x3e, 0x4a, 0x9e, 0x28, 0x3b, 0x2e, 0x9b, 0x13, 0xbf,
- 0xd0, 0x85, 0xc7, 0x3e, 0x16, 0xbd, 0xc4, 0xbe, 0xfc, 0xf5, 0x8a, 0xbe,
- 0x32, 0x4f, 0x84, 0xbd, 0xf4, 0x7e, 0x9d, 0x3e, 0x23, 0xdc, 0xa1, 0xbd,
- 0xca, 0xe2, 0x46, 0x3e, 0x08, 0x6b, 0x53, 0xbd, 0x07, 0x3a, 0x02, 0xbd,
- 0x86, 0xa6, 0xdf, 0xbc, 0x44, 0x5c, 0x85, 0xbe, 0x4f, 0xf8, 0xa5, 0xbd,
- 0xac, 0xf6, 0x3f, 0xbe, 0x34, 0xb0, 0x48, 0x3c, 0xeb, 0x5b, 0x18, 0xbe,
- 0x41, 0x3b, 0x87, 0xbe, 0x20, 0x62, 0x24, 0xbe, 0xdc, 0x92, 0xc6, 0xbc,
- 0x1e, 0x0b, 0x06, 0xbf, 0x7d, 0x68, 0x9a, 0xbe, 0xa6, 0x9e, 0xcc, 0xbd,
- 0xac, 0x22, 0x3d, 0xbf, 0x2d, 0x82, 0xbc, 0x3c, 0x30, 0x15, 0xc4, 0xbe,
- 0x01, 0x27, 0x3c, 0xbf, 0xca, 0x88, 0xa6, 0xbe, 0x21, 0x00, 0x09, 0xbf,
- 0x00, 0xbb, 0x73, 0xbe, 0x27, 0x84, 0x8d, 0xbe, 0x25, 0x69, 0xab, 0x3d,
- 0x55, 0x61, 0xf2, 0xbc, 0x38, 0x5f, 0xdb, 0x3d, 0x3a, 0x66, 0x84, 0xbd,
- 0x6c, 0x87, 0x01, 0x3e, 0xa1, 0x96, 0x29, 0x3e, 0x4b, 0x7e, 0x1f, 0xbd,
- 0xf4, 0x25, 0x9e, 0x3e, 0x41, 0x27, 0xcd, 0x3d, 0x50, 0xf9, 0x91, 0xbe,
- 0x14, 0xa6, 0x19, 0xbd, 0x01, 0xa8, 0xa5, 0x3d, 0x20, 0xeb, 0xe2, 0xbd,
- 0x6d, 0x0d, 0xde, 0xbe, 0xc0, 0x44, 0x93, 0x3d, 0xf5, 0xd9, 0x90, 0x3e,
- 0xa9, 0xe4, 0xee, 0xbd, 0xa6, 0x89, 0xe0, 0xbe, 0x19, 0xfe, 0xf5, 0x3c,
- 0xbe, 0x07, 0x26, 0x3e, 0xb7, 0xb5, 0x8e, 0xbe, 0x0c, 0xdb, 0x1a, 0xbd,
- 0x55, 0xf3, 0x4e, 0x3e, 0x54, 0x18, 0xf2, 0xbe, 0x3e, 0xda, 0x22, 0x3e,
- 0xb9, 0x3d, 0x61, 0x3e, 0xed, 0xd9, 0x21, 0xbe, 0xb2, 0x88, 0xce, 0x3d,
- 0x07, 0x65, 0xc6, 0xbc, 0x0d, 0xa2, 0x10, 0x3e, 0x20, 0xd2, 0x1d, 0xbe,
- 0x90, 0x19, 0x1b, 0xbe, 0x72, 0xb2, 0x22, 0x3d, 0x1e, 0x54, 0x05, 0xbe,
- 0xc1, 0x4f, 0x84, 0x3e, 0x00, 0x4b, 0x8c, 0x39, 0x1c, 0xcb, 0x1a, 0xbf,
- 0xda, 0xd0, 0x91, 0xbd, 0x86, 0x0a, 0xc8, 0xbe, 0x8b, 0x02, 0x3f, 0xbe,
- 0x30, 0x1f, 0x26, 0xbd, 0x8f, 0x94, 0xa3, 0x3d, 0x5b, 0x0d, 0x83, 0xbe,
- 0xd8, 0xec, 0xc3, 0x3c, 0x43, 0xe1, 0x59, 0xbe, 0xde, 0xbe, 0x2a, 0xbd,
- 0xdc, 0xa0, 0xcf, 0x3e, 0xca, 0xb2, 0x84, 0x3e, 0x3b, 0x90, 0x94, 0xbe,
- 0xeb, 0x1a, 0x8d, 0xbe, 0xf0, 0xe6, 0x8b, 0xbe, 0x5d, 0xff, 0xaa, 0x3d,
- 0x6b, 0x83, 0xd1, 0x3d, 0x9f, 0x09, 0x94, 0x3d, 0x9c, 0x03, 0x09, 0x3e,
- 0x89, 0xd4, 0x7d, 0xbd, 0xcf, 0x15, 0xc2, 0x3d, 0x64, 0x99, 0x43, 0x3e,
- 0xbb, 0x73, 0x4f, 0xbe, 0xbc, 0xb2, 0x31, 0xbd, 0x20, 0xcd, 0x6e, 0xbe,
- 0x6a, 0xe3, 0xc6, 0x3e, 0x1d, 0x0b, 0xd0, 0x3d, 0x67, 0x7a, 0x3a, 0xbd,
- 0x23, 0x82, 0x29, 0xbe, 0xb2, 0xe1, 0xf3, 0xbd, 0x5c, 0x47, 0x96, 0xbd,
- 0x65, 0x62, 0xff, 0x3b, 0x53, 0x70, 0xa2, 0x3e, 0x18, 0xf7, 0xa7, 0xbe,
- 0xcf, 0x2e, 0x5a, 0x3d, 0xaa, 0x49, 0xcc, 0xbe, 0xba, 0x93, 0x45, 0xbf,
- 0x10, 0xec, 0xfb, 0xbd, 0xc7, 0xf6, 0xc4, 0xbe, 0x2e, 0xdb, 0xea, 0xbd,
- 0x3b, 0xeb, 0x73, 0x3e, 0xb9, 0xe2, 0x0e, 0x3e, 0xd2, 0x37, 0xe0, 0xbd,
- 0xf8, 0x91, 0x3d, 0xbe, 0x33, 0x67, 0xbe, 0xbe, 0xc5, 0xd5, 0x50, 0x3e,
- 0x01, 0xeb, 0x00, 0x3e, 0x68, 0xac, 0xbd, 0xbe, 0xd0, 0x55, 0x90, 0xbe,
- 0x21, 0x9a, 0xfc, 0x3d, 0x8a, 0x8e, 0x4f, 0x3e, 0x6b, 0x5f, 0x4c, 0x3e,
- 0x2a, 0x7b, 0x3b, 0xbe, 0xa5, 0x89, 0x42, 0x3e, 0xce, 0xa6, 0x1f, 0xbf,
- 0x1c, 0xee, 0x88, 0xbe, 0x67, 0xe8, 0xdc, 0x3c, 0x85, 0x8c, 0x5e, 0xbd,
- 0xad, 0xba, 0xf2, 0xbe, 0x0a, 0x20, 0xab, 0x3e, 0xec, 0x54, 0x43, 0xbd,
- 0x9c, 0xed, 0xf4, 0x3d, 0xa1, 0xb5, 0x1e, 0xbd, 0x72, 0x7e, 0xb7, 0xbd,
- 0x22, 0xd6, 0xa9, 0x3e, 0xdf, 0x7c, 0x9e, 0xbe, 0xea, 0x68, 0x29, 0x3e,
- 0x7b, 0x6b, 0x1e, 0xbe, 0x63, 0x43, 0x3c, 0xbe, 0x40, 0x0c, 0xe1, 0xbe,
- 0x79, 0x84, 0x14, 0xbe, 0xca, 0x2e, 0x69, 0x3e, 0xc3, 0xc7, 0x8b, 0x3d,
- 0x56, 0x30, 0xb2, 0x3e, 0x6e, 0xab, 0xab, 0x3d, 0x37, 0xd5, 0x4c, 0x3e,
- 0x06, 0x50, 0x78, 0x3d, 0x48, 0xe0, 0xa4, 0x3d, 0xa3, 0xce, 0x07, 0x3e,
- 0x73, 0x03, 0xaa, 0xbe, 0x37, 0xe3, 0x3b, 0xbe, 0x54, 0xca, 0x04, 0xbf,
- 0x48, 0xf0, 0x9d, 0x3d, 0x89, 0x4d, 0x88, 0x3e, 0x2c, 0xe9, 0xc6, 0x3d,
- 0xe5, 0xd2, 0x7f, 0xbe, 0x6c, 0x6c, 0x82, 0x3e, 0x7d, 0x25, 0x7a, 0x3e,
- 0xfa, 0x5d, 0x99, 0x3e, 0xb6, 0x8c, 0x96, 0x3d, 0xbb, 0x50, 0xfb, 0xbe,
- 0x3b, 0x8b, 0xba, 0xbd, 0x94, 0x18, 0x5f, 0x3e, 0x02, 0xf3, 0xc5, 0xbe,
- 0x82, 0x31, 0x8c, 0xbe, 0x53, 0x41, 0x57, 0xbe, 0x9c, 0x53, 0x01, 0x3e,
- 0x81, 0xba, 0x96, 0xbd, 0xd4, 0x89, 0x83, 0x3d, 0xd4, 0xae, 0x80, 0xbe,
- 0x53, 0x1f, 0x8c, 0xbe, 0x13, 0xbd, 0x35, 0x3e, 0x2b, 0xf4, 0x1c, 0x3e,
- 0x0f, 0xe3, 0x19, 0x3e, 0x96, 0xd1, 0xed, 0xbc, 0x55, 0x42, 0x3e, 0xbd,
- 0x1c, 0x34, 0x40, 0xbd, 0xd5, 0xa2, 0x19, 0xbf, 0xc1, 0x20, 0xd7, 0xbe,
- 0x33, 0x74, 0x0d, 0x3e, 0x4f, 0x8c, 0x10, 0xbd, 0x36, 0x6e, 0x69, 0x3d,
- 0x2f, 0xd2, 0xc1, 0xbd, 0x89, 0xa8, 0x1d, 0x3e, 0xcc, 0xf7, 0x0f, 0x3d,
- 0xe6, 0x6b, 0xb7, 0x3c, 0x2d, 0xd9, 0x11, 0x3d, 0x80, 0xb1, 0x0e, 0x3e,
- 0xd5, 0xfd, 0x0e, 0x3d, 0x3b, 0xd7, 0x3e, 0x3e, 0x3d, 0xff, 0x45, 0x3c,
- 0x6d, 0x1e, 0xec, 0xbd, 0xa3, 0xaa, 0x71, 0x3d, 0xb7, 0x26, 0x88, 0xbd,
- 0x82, 0x20, 0xbd, 0xbd, 0x64, 0xd4, 0x62, 0x3e, 0xb5, 0xe9, 0x27, 0x3e,
- 0x4e, 0x0c, 0xfe, 0x3c, 0x6b, 0x50, 0x85, 0xbd, 0xde, 0x88, 0x20, 0xbe,
- 0x9d, 0xc5, 0x0b, 0xbe, 0x08, 0x0c, 0x55, 0xbd, 0xc0, 0x46, 0x63, 0x3e,
- 0x53, 0xd5, 0x94, 0xbd, 0x58, 0x09, 0x4d, 0x3e, 0xae, 0x19, 0x6b, 0xbe,
- 0xfa, 0xc8, 0x57, 0xbe, 0xf5, 0x1b, 0x5b, 0xbc, 0x87, 0x4d, 0x4d, 0x3e,
- 0x4f, 0xa5, 0x59, 0xbe, 0xb6, 0x8b, 0x91, 0x3d, 0xdf, 0x70, 0x5d, 0x3e,
- 0x0e, 0xea, 0x05, 0x3e, 0x7c, 0x07, 0xfe, 0xbc, 0xc3, 0x0a, 0x62, 0xbe,
- 0xe3, 0x56, 0x76, 0x3d, 0x94, 0x1d, 0xa9, 0xbe, 0xa8, 0xdb, 0x52, 0xbd,
- 0x79, 0x0b, 0x8a, 0x3e, 0x8d, 0x10, 0x8c, 0xbc, 0x64, 0xce, 0x28, 0xbe,
- 0x7b, 0x36, 0x48, 0xbe, 0xd9, 0xc7, 0x0e, 0xbd, 0x8f, 0x55, 0x85, 0xbe,
- 0x28, 0x05, 0xb3, 0xbe, 0x0e, 0x48, 0xbe, 0xbc, 0x9b, 0x65, 0x6b, 0x3c,
- 0x9c, 0xcb, 0x9e, 0x3d, 0x70, 0x0e, 0x16, 0xbd, 0x54, 0xec, 0xa0, 0x3c,
- 0xd6, 0xc0, 0xa5, 0x3d, 0x3f, 0xd1, 0xfd, 0xbd, 0x4c, 0xbe, 0xad, 0xbd,
- 0xda, 0x51, 0x35, 0x3e, 0xed, 0x35, 0x77, 0xbe, 0x14, 0x33, 0xbf, 0x3d,
- 0x8d, 0x48, 0xc7, 0xbb, 0x67, 0xc5, 0x9a, 0x3e, 0x43, 0x08, 0x85, 0xbe,
- 0x48, 0x1d, 0x41, 0xbe, 0xa5, 0x30, 0x90, 0x3e, 0x20, 0xdc, 0x6c, 0xbe,
- 0x59, 0xe0, 0xe9, 0xbb, 0xd5, 0x7e, 0xb5, 0x3d, 0xaf, 0x92, 0x05, 0xbe,
- 0xb4, 0xc6, 0x39, 0x3e, 0xb0, 0xee, 0x24, 0x3d, 0x76, 0x3c, 0x85, 0xbc,
- 0x86, 0x85, 0xad, 0xbe, 0xf0, 0xa7, 0x07, 0x3e, 0x8b, 0xba, 0x1d, 0x3e,
- 0xb6, 0xb6, 0x25, 0x3e, 0x3c, 0x2b, 0xe8, 0xbd, 0x38, 0x44, 0x5e, 0xbd,
- 0x7d, 0x59, 0xa8, 0x3e, 0x4a, 0x80, 0x81, 0x3d, 0xd0, 0x30, 0x11, 0xbd,
- 0x7b, 0x75, 0x1f, 0xbe, 0x07, 0xea, 0xcd, 0xbd, 0x91, 0xd9, 0x1e, 0x3d,
- 0x59, 0xbb, 0x6a, 0x3e, 0x8a, 0xca, 0xb9, 0x3d, 0xc6, 0x8f, 0x4a, 0x3d,
- 0xa8, 0xa1, 0x2d, 0xbe, 0x22, 0x45, 0xfc, 0xbd, 0x4c, 0xf0, 0x0d, 0xbe,
- 0xb0, 0xd9, 0x4a, 0x3e, 0x27, 0xbe, 0x9a, 0x3e, 0x53, 0x6c, 0x5b, 0x3e,
- 0x30, 0x79, 0x72, 0xbc, 0xe2, 0x63, 0x9f, 0x3d, 0x72, 0x6a, 0x6c, 0x3d,
- 0x4d, 0xab, 0xeb, 0xbd, 0xb6, 0x4b, 0x87, 0x3e, 0x1d, 0xe6, 0x5e, 0xbd,
- 0xdc, 0xea, 0x70, 0x3e, 0xab, 0xc3, 0x0a, 0x3e, 0x07, 0x00, 0x12, 0xbe,
- 0xf5, 0x61, 0x0d, 0xbe, 0x01, 0x3a, 0x05, 0xbe, 0x5a, 0xb9, 0x61, 0xbe,
- 0xe9, 0x6d, 0x56, 0xbd, 0xdc, 0xd8, 0x83, 0xbd, 0x93, 0xa3, 0xfe, 0xbc,
- 0xf6, 0x50, 0x12, 0x3e, 0xb1, 0x2b, 0x08, 0x3e, 0xc9, 0xf0, 0x08, 0x3e,
- 0x6c, 0x20, 0x94, 0x3b, 0xd1, 0xeb, 0x83, 0xbd, 0x58, 0x25, 0xa4, 0xbe,
- 0x7d, 0x75, 0xd1, 0xbd, 0xcc, 0x00, 0x27, 0xbe, 0x7e, 0x3c, 0x10, 0xbe,
- 0x7f, 0xa8, 0x6a, 0xba, 0xce, 0xda, 0x8d, 0x3e, 0xed, 0xbd, 0x72, 0x3e,
- 0x9a, 0x23, 0x89, 0xbd, 0x2a, 0x92, 0xad, 0x3e, 0x1b, 0x33, 0xcd, 0x3d,
- 0x98, 0x5b, 0x3f, 0xbf, 0x11, 0xf8, 0x17, 0xbf, 0x18, 0x1f, 0x16, 0xbf,
- 0x9f, 0x0f, 0x6e, 0xbe, 0xb8, 0x06, 0x77, 0xbe, 0x7f, 0xf3, 0xf1, 0xbe,
- 0xed, 0x04, 0x25, 0xbe, 0xf8, 0x57, 0x99, 0x3d, 0xac, 0xa3, 0x12, 0x3e,
- 0xe1, 0xe4, 0x07, 0x3e, 0xb1, 0x1b, 0x28, 0xbc, 0xfa, 0x0f, 0x3b, 0x3e,
- 0xa4, 0xd6, 0x09, 0xbc, 0x8e, 0x14, 0xc4, 0xbe, 0xaf, 0xa7, 0xfd, 0xbe,
- 0x31, 0xd3, 0x1a, 0x3e, 0xa4, 0x24, 0x91, 0xbe, 0x4e, 0x41, 0x93, 0x3d,
- 0xe0, 0x2f, 0x77, 0x3d, 0x12, 0xac, 0xab, 0x3e, 0x08, 0xfb, 0xaf, 0x3e,
- 0xd5, 0x09, 0x9d, 0xbd, 0x3a, 0x99, 0x42, 0xbf, 0xac, 0x96, 0x93, 0xbc,
- 0x2e, 0x28, 0x17, 0xbe, 0xba, 0x0b, 0x57, 0x3e, 0xfd, 0x45, 0xa0, 0xbe,
- 0xb3, 0xf3, 0x0a, 0xbe, 0x27, 0xbf, 0xd2, 0x3d, 0xda, 0x9c, 0x31, 0x3e,
- 0x57, 0x9f, 0x1e, 0x3e, 0x02, 0xe7, 0xd9, 0xbc, 0xe0, 0xfd, 0x99, 0x3c,
- 0x9a, 0x3b, 0x91, 0xbe, 0xf0, 0xa6, 0x83, 0x3d, 0xad, 0x2e, 0xd4, 0x3c,
- 0xcf, 0x79, 0xbe, 0xbe, 0x7f, 0x8a, 0xac, 0x3e, 0x0e, 0x66, 0x66, 0x3e,
- 0x68, 0xfb, 0xfa, 0xbc, 0x8c, 0x4b, 0x40, 0xbe, 0x11, 0xca, 0x87, 0x3e,
- 0x67, 0x74, 0x59, 0x3e, 0x0b, 0x3b, 0x5b, 0x3c, 0x23, 0x79, 0x37, 0x3e,
- 0xdb, 0x02, 0x44, 0x3e, 0xb3, 0x10, 0x13, 0x3e, 0x20, 0xc3, 0x7b, 0x3e,
- 0x34, 0x2f, 0xe8, 0xbd, 0xe9, 0xfb, 0xf7, 0x3b, 0x3f, 0x4f, 0xbf, 0xbe,
- 0x68, 0x74, 0x09, 0xbf, 0xf6, 0xbc, 0xf8, 0x3d, 0xec, 0x2d, 0x25, 0xbf,
- 0x58, 0x1b, 0xf4, 0xbd, 0x88, 0x34, 0x1f, 0xbe, 0x96, 0x04, 0x8c, 0x3d,
- 0x4e, 0xdb, 0x66, 0xbe, 0x05, 0x3c, 0x3a, 0x3d, 0x47, 0xac, 0x05, 0xbe,
- 0xc6, 0xf0, 0xbc, 0xbe, 0x5d, 0x45, 0x43, 0xbb, 0xbe, 0x7a, 0x86, 0xbe,
- 0x11, 0xe6, 0x14, 0xbf, 0x39, 0x10, 0x15, 0xbe, 0xd9, 0xaa, 0x8d, 0xbd,
- 0x88, 0x5e, 0x72, 0xbe, 0x36, 0x3a, 0x36, 0xbe, 0xa0, 0x51, 0xb9, 0xbd,
- 0xe4, 0xe9, 0x2c, 0x3e, 0x6c, 0xd5, 0xff, 0x3d, 0x20, 0x30, 0x49, 0x3e,
- 0x78, 0xef, 0x8a, 0x3e, 0x97, 0xa2, 0x87, 0xbe, 0x12, 0x06, 0xe9, 0xbc,
- 0xfd, 0xde, 0x10, 0x3e, 0xe0, 0x40, 0x90, 0xbe, 0xf5, 0xad, 0xc3, 0x3d,
- 0x98, 0x00, 0xac, 0x3e, 0xaa, 0xaf, 0xa4, 0xbd, 0x65, 0x3f, 0xa4, 0xbe,
- 0x0d, 0x59, 0xb0, 0x3d, 0xac, 0xd0, 0x3a, 0xbe, 0x8e, 0xed, 0x68, 0xbd,
- 0x2c, 0x9c, 0x3a, 0x3e, 0x0a, 0x9d, 0x70, 0xbe, 0x82, 0x80, 0x58, 0xbd,
- 0x6c, 0xb0, 0x7c, 0xbe, 0x24, 0xa4, 0x29, 0x3e, 0xd7, 0xcd, 0xe3, 0x3d,
- 0xb3, 0x48, 0xb4, 0x3e, 0x9e, 0x3e, 0x96, 0x3e, 0xf0, 0x6d, 0x7a, 0xbe,
- 0x3b, 0x35, 0xbb, 0x3e, 0x63, 0x60, 0xac, 0xbd, 0x58, 0xb4, 0x43, 0xbe,
- 0x85, 0x61, 0x17, 0x3e, 0x5f, 0x3f, 0x08, 0xbf, 0x95, 0x47, 0x00, 0x3e,
- 0x44, 0x2c, 0xb7, 0x3e, 0xbf, 0x82, 0x80, 0xbe, 0xfb, 0x98, 0x12, 0xbc,
- 0xaf, 0x07, 0x30, 0xbc, 0xba, 0x50, 0xac, 0xbe, 0x40, 0x5a, 0x72, 0x3d,
- 0x30, 0x3c, 0x52, 0x3e, 0x1f, 0xe5, 0xb0, 0x3e, 0xbd, 0x57, 0x8b, 0xbe,
- 0xe5, 0x2c, 0x24, 0xbf, 0x6f, 0xbf, 0xdf, 0xbd, 0xdb, 0xe0, 0xae, 0xbe,
- 0x87, 0xe9, 0x13, 0x3e, 0x2a, 0x27, 0x81, 0xbe, 0xbf, 0x36, 0xcd, 0xbe,
- 0xd9, 0xcc, 0x1a, 0x3d, 0x68, 0xaf, 0x6c, 0xbe, 0x21, 0x43, 0x4d, 0xbf,
- 0x3f, 0x03, 0x6c, 0x3d, 0x52, 0x82, 0x5d, 0xbe, 0x30, 0xc3, 0xcd, 0x3e,
- 0xa7, 0x4b, 0x82, 0xbd, 0x1d, 0x01, 0x57, 0xbc, 0x11, 0x99, 0x22, 0x3e,
- 0xd5, 0x07, 0xed, 0x3d, 0x6a, 0x26, 0x26, 0xbe, 0x52, 0x2d, 0x32, 0x3d,
- 0xc2, 0x9e, 0x57, 0x3e, 0x3d, 0xd9, 0x1e, 0x3d, 0xce, 0xf9, 0xa2, 0x3e,
- 0xdb, 0x98, 0xc7, 0xbe, 0xc8, 0x09, 0xbe, 0x3e, 0x20, 0x56, 0x8d, 0x3d,
- 0x36, 0xc2, 0x11, 0xbe, 0x73, 0x44, 0x03, 0xbe, 0xdd, 0x80, 0x7b, 0xbc,
- 0x7a, 0x0a, 0x2f, 0xbe, 0x5b, 0x35, 0x48, 0x3d, 0x17, 0x70, 0x6e, 0xbc,
- 0xc0, 0xcd, 0x42, 0xbe, 0xa7, 0x5f, 0xab, 0x3d, 0x78, 0x08, 0xfe, 0x3d,
- 0x22, 0x77, 0x02, 0x3e, 0x84, 0xbd, 0xce, 0x3d, 0x44, 0x00, 0x31, 0xbe,
- 0x3e, 0x8c, 0x2b, 0x3e, 0xde, 0x4c, 0x33, 0xbe, 0x76, 0x51, 0xcb, 0x3e,
- 0x08, 0x6f, 0xb7, 0x3d, 0x29, 0xc9, 0x2a, 0xbe, 0x9c, 0xa2, 0x13, 0xbe,
- 0x49, 0xe4, 0x0f, 0xbf, 0x72, 0x60, 0x7c, 0x3d, 0x8d, 0xac, 0x17, 0x3e,
- 0xb8, 0x85, 0xa3, 0xbd, 0x42, 0xa3, 0x50, 0x3e, 0xc1, 0x2a, 0x94, 0x3c,
- 0x15, 0x77, 0xd2, 0x3e, 0x66, 0x50, 0x62, 0xbe, 0x65, 0xe7, 0x95, 0x3e,
- 0x62, 0x09, 0xeb, 0xbb, 0xe4, 0xbc, 0x14, 0x3e, 0x49, 0xd1, 0x90, 0x3e,
- 0x89, 0x80, 0x56, 0xbc, 0x06, 0xb0, 0x18, 0xbe, 0xc4, 0x5f, 0x9e, 0x3e,
- 0x03, 0x34, 0x15, 0xbf, 0xad, 0xf7, 0xac, 0xbd, 0xf6, 0x60, 0x15, 0x3f,
- 0x88, 0xd6, 0xb1, 0xbe, 0x2c, 0x40, 0x14, 0xbe, 0xd3, 0x93, 0xde, 0x3d,
- 0x67, 0x59, 0xf4, 0x3e, 0x17, 0x5e, 0xa4, 0xbe, 0x2a, 0xe2, 0x20, 0x3e,
- 0x52, 0x2b, 0xbb, 0x3c, 0xe1, 0xfa, 0x5f, 0xbe, 0xa0, 0x1f, 0xb9, 0x3d,
- 0x90, 0xf8, 0x9d, 0x3e, 0xc4, 0xf8, 0x08, 0x3e, 0xc4, 0xa4, 0x0a, 0xbf,
- 0x75, 0xc3, 0xca, 0x3e, 0xa1, 0xae, 0xf3, 0x3d, 0xb4, 0x02, 0x68, 0xbe,
- 0xff, 0x26, 0xb6, 0xbd, 0x90, 0xc0, 0x17, 0x3f, 0x24, 0xd7, 0x1b, 0xbe,
- 0x77, 0x99, 0xfe, 0x3d, 0x05, 0xc2, 0xbf, 0xbd, 0x63, 0x66, 0x98, 0xbd,
- 0x39, 0xc5, 0x89, 0x3e, 0x1a, 0x0e, 0x21, 0xbf, 0xb2, 0x71, 0xc0, 0xbd,
- 0x9a, 0xfa, 0x26, 0x3d, 0x63, 0xc8, 0x7a, 0xbe, 0x92, 0x5b, 0x1d, 0x3e,
- 0x05, 0x32, 0xa0, 0xbd, 0x16, 0xa9, 0xed, 0x3e, 0x84, 0xa1, 0x2b, 0xbf,
- 0x60, 0x2f, 0x2f, 0x3e, 0x8e, 0xcf, 0x7f, 0x3e, 0x46, 0x43, 0x2c, 0x3e,
- 0x38, 0x37, 0xa3, 0xbe, 0xfb, 0x75, 0x87, 0x3e, 0xd7, 0x79, 0x1f, 0x3d,
- 0x72, 0xa6, 0x16, 0xbe, 0x2b, 0x98, 0xc2, 0x3e, 0x0e, 0x14, 0x3e, 0x3c,
- 0x02, 0x59, 0xed, 0xbe, 0x2f, 0xa2, 0x53, 0xbe, 0x66, 0x6e, 0xad, 0xbe,
- 0x70, 0x30, 0x0b, 0x3d, 0x0b, 0xcf, 0xe4, 0xbd, 0x8f, 0x44, 0x28, 0x3d,
- 0x5f, 0x36, 0x33, 0xbe, 0xbf, 0x58, 0x95, 0xbd, 0xb5, 0x93, 0x95, 0x3d,
- 0x9f, 0xa4, 0xba, 0x3d, 0x10, 0xac, 0xdb, 0xbe, 0x7c, 0x70, 0xa8, 0xbe,
- 0x61, 0xd2, 0x7a, 0xbe, 0x0a, 0x3b, 0xb5, 0x3d, 0x21, 0xea, 0x74, 0xba,
- 0xcc, 0xef, 0x53, 0xbe, 0xa2, 0xa7, 0x27, 0xbe, 0x20, 0x43, 0xb9, 0xbe,
- 0xa3, 0x87, 0x55, 0xbc, 0xbe, 0x0f, 0x3a, 0x3e, 0x8a, 0xc8, 0x04, 0xbf,
- 0x56, 0x46, 0xbe, 0x3d, 0xa4, 0x1d, 0x25, 0x3e, 0x26, 0x96, 0xfe, 0xbe,
- 0xe0, 0xa4, 0xc1, 0x3e, 0xf3, 0xd2, 0x1f, 0x3e, 0x44, 0xee, 0x2f, 0x3d,
- 0x3c, 0x2c, 0x2a, 0xbe, 0x0b, 0x3f, 0x9c, 0x3e, 0x94, 0xea, 0x06, 0xbe,
- 0xc2, 0x01, 0x1a, 0xbf, 0x40, 0xc2, 0x15, 0xbe, 0x71, 0xed, 0x38, 0xbe,
- 0xa4, 0x40, 0xfd, 0xbe, 0x4c, 0x37, 0x0d, 0x3e, 0x32, 0x71, 0x9a, 0x3e,
- 0x85, 0xb2, 0x93, 0xbe, 0xee, 0x78, 0x1c, 0xbe, 0x16, 0x9d, 0xb2, 0xbe,
- 0xca, 0x9c, 0x43, 0xbd, 0x69, 0x89, 0xe5, 0xbd, 0x32, 0xa6, 0x6e, 0xbc,
- 0xf5, 0x6a, 0x6b, 0xbd, 0x75, 0x80, 0x8d, 0xbe, 0x3a, 0x6e, 0x23, 0xbf,
- 0xcc, 0x55, 0x0e, 0xbe, 0xe1, 0x6e, 0x6d, 0x3e, 0xff, 0xda, 0x2b, 0x3e,
- 0x33, 0xa0, 0x8d, 0xbe, 0x2f, 0xee, 0xc2, 0xbe, 0xa6, 0x01, 0x27, 0x3e,
- 0x63, 0x16, 0x9a, 0xbe, 0x39, 0xaa, 0x22, 0xbe, 0xa3, 0x69, 0xd8, 0x3c,
- 0x27, 0xa5, 0x58, 0x3e, 0x3f, 0x1a, 0xe2, 0xbe, 0x43, 0xcb, 0xce, 0xbe,
- 0x14, 0x15, 0xc6, 0xbe, 0x7d, 0xc2, 0x40, 0xbe, 0xa0, 0xaf, 0x7a, 0x3e,
- 0x25, 0xcf, 0xf1, 0x3d, 0xe8, 0xe8, 0xd6, 0xbd, 0x16, 0x76, 0x7e, 0x3e,
- 0x0b, 0xf5, 0x01, 0xbf, 0x5c, 0xf9, 0x93, 0x3e, 0x77, 0x1a, 0xef, 0x3d,
- 0x54, 0xa2, 0x94, 0x3d, 0x10, 0x2e, 0x10, 0x3e, 0xfa, 0x12, 0x30, 0x3d,
- 0x7a, 0x88, 0xe2, 0xbe, 0xee, 0xe9, 0x6a, 0xbe, 0x34, 0x00, 0xb2, 0xbe,
- 0x7a, 0x69, 0x73, 0x3e, 0x30, 0x92, 0x19, 0xbe, 0x5c, 0xac, 0x23, 0xbe,
- 0x7d, 0xa5, 0x5d, 0xbe, 0xe1, 0x93, 0xe8, 0xbe, 0xbe, 0xa5, 0xa2, 0xbe,
- 0x77, 0x98, 0x14, 0x3e, 0x98, 0x95, 0x53, 0xbe, 0xe4, 0x98, 0x8d, 0xbe,
- 0x9c, 0x8b, 0x08, 0x3e, 0x95, 0xb3, 0x75, 0xbd, 0x4b, 0xd0, 0x30, 0xbe,
- 0xd0, 0xe3, 0x38, 0x3e, 0x2b, 0x4c, 0xa3, 0xbd, 0x6e, 0x9c, 0xc5, 0xbe,
- 0x81, 0x17, 0xef, 0xbd, 0xce, 0x8e, 0x07, 0x3e, 0x8e, 0xcd, 0x5d, 0x3d,
- 0x88, 0xbf, 0x09, 0xbe, 0xa8, 0x84, 0xab, 0xbd, 0x9c, 0x1b, 0x36, 0xbe,
- 0x37, 0x2c, 0x2d, 0xbc, 0xb8, 0x65, 0x9d, 0x3d, 0xfc, 0x99, 0x3e, 0xbe,
- 0x58, 0x2f, 0x3a, 0xbf, 0xdc, 0x45, 0x6e, 0xbd, 0x87, 0x8d, 0xbb, 0xbd,
- 0x6a, 0x76, 0x74, 0x3e, 0x13, 0x22, 0x2d, 0x3e, 0xc1, 0x14, 0x11, 0xbf,
- 0x41, 0x49, 0xa4, 0xbe, 0x09, 0x47, 0x0a, 0xbf, 0xa8, 0x18, 0x69, 0xbe,
- 0x61, 0x35, 0xed, 0xbd, 0x2b, 0xd4, 0x01, 0x3e, 0x74, 0x94, 0x7b, 0xbe,
- 0xd1, 0xe9, 0x88, 0x3d, 0x20, 0x18, 0xaa, 0xbe, 0x05, 0xf0, 0x70, 0xbc,
- 0xb9, 0xcb, 0xda, 0xbe, 0xe1, 0x69, 0x24, 0xbf, 0x2e, 0x31, 0xa3, 0xbd,
- 0xc3, 0x63, 0xc2, 0x3d, 0x54, 0xa1, 0xf6, 0xbe, 0x44, 0x27, 0xf4, 0x3c,
- 0x34, 0x64, 0x25, 0xbe, 0x7b, 0xd4, 0xd7, 0xbe, 0xfa, 0x57, 0xb7, 0xbe,
- 0xab, 0xc3, 0xe1, 0xbe, 0x4b, 0x08, 0x07, 0x3e, 0xf2, 0x85, 0x3f, 0x3e,
- 0x04, 0x94, 0x94, 0xbe, 0x5d, 0x23, 0x50, 0xbe, 0xb6, 0xa4, 0x62, 0xbe,
- 0x18, 0x40, 0x71, 0x3d, 0x64, 0xb6, 0xd7, 0xbc, 0x63, 0xb5, 0xc9, 0x3c,
- 0xf6, 0x73, 0xb5, 0xbe, 0xb6, 0x20, 0x9b, 0x3d, 0x1c, 0xd9, 0x07, 0xbf,
- 0xb1, 0xa7, 0x14, 0x3e, 0x23, 0x00, 0xb3, 0xbe, 0x32, 0xa0, 0x0c, 0x3f,
- 0xee, 0x02, 0xc1, 0xbd, 0x46, 0xed, 0xc5, 0x3d, 0xd7, 0x75, 0xce, 0xbd,
- 0xa8, 0xf6, 0xe3, 0x3a, 0x05, 0x66, 0x9a, 0xbe, 0xe6, 0xaa, 0x56, 0xbe,
- 0x96, 0x17, 0xe9, 0x3d, 0xbb, 0x30, 0xb3, 0xbd, 0xb7, 0xb5, 0x28, 0x3c,
- 0xfe, 0x7b, 0x9e, 0x3e, 0x05, 0x72, 0x0b, 0x3e, 0x3e, 0xdc, 0x3d, 0xbe,
- 0xe0, 0x26, 0x6c, 0xbe, 0x29, 0x47, 0xce, 0xbb, 0xa7, 0x96, 0xe9, 0xbe,
- 0xc7, 0xca, 0x12, 0xbf, 0x50, 0xe7, 0x83, 0x3d, 0x2f, 0x89, 0x23, 0x3f,
- 0x06, 0x3a, 0x18, 0x3d, 0x90, 0xeb, 0xb5, 0x3d, 0x47, 0xe2, 0x6a, 0x3e,
- 0x86, 0x48, 0x98, 0x3d, 0x6b, 0xea, 0x92, 0x3e, 0x01, 0x41, 0x63, 0xbe,
- 0xf3, 0xff, 0x9b, 0x3d, 0x8c, 0xeb, 0xa0, 0x3c, 0xd7, 0xc4, 0xbc, 0x3e,
- 0x40, 0x86, 0x9f, 0x3e, 0x5b, 0xb9, 0x38, 0x3c, 0xd7, 0x53, 0x20, 0xbf,
- 0x4d, 0xb9, 0x57, 0x3d, 0x0e, 0x3e, 0x16, 0xbe, 0x75, 0xf9, 0xbf, 0xbe,
- 0x0a, 0x3d, 0xea, 0x3d, 0x4c, 0x2e, 0x74, 0x3d, 0x13, 0x83, 0x3a, 0xbe,
- 0x5a, 0x77, 0x4e, 0x3d, 0xe8, 0x99, 0x03, 0xbe, 0x22, 0x26, 0x83, 0xbe,
- 0x00, 0x97, 0xc0, 0xbe, 0x5f, 0x77, 0xe0, 0xbe, 0xcd, 0xdd, 0x94, 0xbd,
- 0x26, 0x3e, 0xd9, 0xbe, 0x88, 0x3d, 0x08, 0x3c, 0x7f, 0xf2, 0xb8, 0x3d,
- 0x7b, 0x93, 0x35, 0xbe, 0xd1, 0xbc, 0x61, 0xbd, 0xcd, 0x73, 0xcf, 0x3e,
- 0x25, 0x2d, 0x1c, 0x3e, 0xb9, 0x1a, 0x58, 0xbe, 0x43, 0x52, 0x78, 0xbd,
- 0xc4, 0x93, 0xaa, 0x3e, 0x24, 0x6d, 0x8d, 0xbe, 0x4b, 0xa3, 0xef, 0x3c,
- 0x68, 0x71, 0x0b, 0x3d, 0xf5, 0x21, 0xbc, 0xbe, 0xe2, 0x0d, 0x3b, 0xbe,
- 0x00, 0xe5, 0x80, 0x3e, 0xff, 0x1e, 0xa0, 0xbd, 0x35, 0xa0, 0xd9, 0x3d,
- 0x6f, 0x52, 0x94, 0x3e, 0x44, 0x23, 0x4d, 0x3e, 0xcd, 0xfa, 0x15, 0x3f,
- 0xbd, 0x65, 0x90, 0xbe, 0x74, 0x83, 0xb9, 0xbc, 0xa1, 0x89, 0x8d, 0xbe,
- 0xb2, 0x3c, 0x78, 0x3e, 0x52, 0x08, 0xb1, 0xbe, 0xdd, 0x2d, 0x58, 0x3f,
- 0xd5, 0xe0, 0xd7, 0x3e, 0x2b, 0x9e, 0xe2, 0x3e, 0x27, 0x25, 0x51, 0x3d,
- 0x17, 0xbf, 0x80, 0x3e, 0x5b, 0x9a, 0x1a, 0x3e, 0x89, 0x06, 0x1f, 0x3e,
- 0x63, 0x57, 0x29, 0xbe, 0x7e, 0x3b, 0xfa, 0x3e, 0xfd, 0x16, 0x33, 0xbe,
- 0xe1, 0x27, 0xd0, 0x3c, 0x61, 0x74, 0x8b, 0x3e, 0xfb, 0xeb, 0xfa, 0x3d,
- 0xda, 0x0d, 0xc4, 0x3e, 0xe3, 0x89, 0x74, 0xbe, 0xeb, 0xb3, 0x92, 0x3e,
- 0x41, 0xdf, 0xd5, 0x3e, 0x79, 0x11, 0xf6, 0x3d, 0x79, 0xd3, 0x94, 0xbe,
- 0xa1, 0x12, 0xca, 0xbd, 0x96, 0xca, 0xa1, 0xbe, 0xa5, 0xf3, 0x00, 0x3f,
- 0xd2, 0xee, 0xfe, 0x3d, 0x8e, 0x9f, 0x98, 0x3e, 0xfb, 0x8e, 0xe9, 0x3a,
- 0x94, 0xec, 0xd1, 0xbd, 0xf6, 0xe4, 0x42, 0xbe, 0x8a, 0xe2, 0x3b, 0xbc,
- 0xb0, 0x6c, 0xa7, 0xbe, 0x52, 0x9f, 0xfc, 0x3d, 0xe6, 0xb2, 0x84, 0xbd,
- 0x35, 0x95, 0x8c, 0x3b, 0xd8, 0x84, 0xf6, 0x3d, 0x77, 0xe5, 0x9b, 0xbd,
- 0x82, 0x79, 0x41, 0xbe, 0xea, 0x31, 0x2f, 0x3e, 0x66, 0x41, 0xc9, 0xbc,
- 0x0e, 0xa4, 0x7b, 0x3d, 0x69, 0x23, 0xb0, 0xbc, 0x73, 0xb6, 0x80, 0x3e,
- 0xa7, 0xa0, 0x10, 0xbe, 0xd8, 0x4a, 0x5e, 0x3e, 0x2d, 0x20, 0xa3, 0x3e,
- 0x15, 0x8f, 0x0e, 0x3c, 0x5a, 0x6f, 0xf7, 0xbd, 0x9f, 0xef, 0xda, 0xbd,
- 0xe1, 0xa9, 0x0b, 0xbe, 0x76, 0x26, 0xdf, 0x3e, 0x04, 0x56, 0x89, 0xbe,
- 0xd6, 0xe8, 0x69, 0xbf, 0x83, 0xbe, 0x0e, 0xbf, 0x70, 0x75, 0x86, 0x3c,
- 0x83, 0xbc, 0xf5, 0x3c, 0x48, 0x40, 0xbe, 0xbd, 0x63, 0x91, 0x06, 0xbe,
- 0xa2, 0xb0, 0x74, 0xbe, 0xc2, 0xd2, 0xaf, 0xbe, 0x21, 0xcb, 0x1d, 0x3e,
- 0x6f, 0x5d, 0xcc, 0xbd, 0x5e, 0x89, 0x86, 0xbe, 0x44, 0xcd, 0x0d, 0x3f,
- 0x0e, 0x42, 0xe7, 0xbd, 0xcc, 0xaa, 0x56, 0xbc, 0xce, 0x7c, 0x97, 0x3d,
- 0x4a, 0x0c, 0x92, 0xbd, 0xfb, 0x7d, 0xa7, 0xbd, 0x4e, 0xa3, 0x3c, 0xbe,
- 0x6b, 0x41, 0x9f, 0x3e, 0xa0, 0x58, 0xf2, 0xbd, 0x69, 0xbd, 0x0a, 0xbf,
- 0x4a, 0x33, 0x38, 0xbd, 0xc4, 0xdc, 0xca, 0xbe, 0xb4, 0xd4, 0x07, 0xbe,
- 0xf4, 0xc8, 0x15, 0xbb, 0xa3, 0xf2, 0x51, 0x3e, 0x5c, 0x10, 0x71, 0x3c,
- 0x07, 0x3f, 0x1d, 0x3e, 0xae, 0x15, 0x22, 0xbe, 0xc9, 0xb1, 0x44, 0xbe,
- 0xd1, 0x8c, 0x53, 0x3e, 0x4e, 0xe7, 0x87, 0xbe, 0x24, 0x9a, 0xe1, 0x3d,
- 0x77, 0x02, 0x08, 0xbe, 0x18, 0x3d, 0x17, 0xbe, 0x69, 0x66, 0x8f, 0x3e,
- 0x1a, 0x70, 0x92, 0xbe, 0xf4, 0xba, 0xea, 0x3e, 0x7d, 0xe0, 0x93, 0x3e,
- 0x73, 0xc9, 0x92, 0xbe, 0x0a, 0xa9, 0x83, 0xbe, 0xd7, 0xc7, 0xd0, 0x3c,
- 0x13, 0x85, 0x24, 0x3d, 0xa0, 0x85, 0xdf, 0xbe, 0xfd, 0x71, 0x9d, 0xbe,
- 0xd2, 0xad, 0xaa, 0x3e, 0xca, 0xfd, 0x0b, 0x3e, 0x29, 0xe4, 0x9e, 0xbb,
- 0x32, 0x77, 0x4b, 0xbf, 0x7f, 0xee, 0xe6, 0x3e, 0xe1, 0xf3, 0x51, 0x3d,
- 0xe1, 0x2f, 0x18, 0x3d, 0xb3, 0x7f, 0x38, 0xbe, 0x58, 0x1b, 0xb4, 0xbe,
- 0x39, 0x12, 0x92, 0xbe, 0x80, 0x61, 0x22, 0x3f, 0x8d, 0x46, 0x9e, 0x3d,
- 0x88, 0x62, 0xbc, 0xbc, 0x38, 0x0b, 0xe9, 0xbd, 0xd7, 0xb4, 0x04, 0x3c,
- 0x2e, 0x5d, 0x92, 0xbe, 0x48, 0x0a, 0x2b, 0x3d, 0x8a, 0xe6, 0x86, 0x3e,
- 0xc6, 0x66, 0xb7, 0x3c, 0x92, 0x73, 0x1d, 0x3d, 0x12, 0x9d, 0x89, 0x3e,
- 0xff, 0xe4, 0xef, 0x3c, 0x0d, 0xe4, 0x1a, 0x3f, 0xb1, 0xd8, 0x76, 0x3e,
- 0x86, 0x3d, 0x11, 0xbe, 0x9c, 0x22, 0x19, 0x3e, 0xb9, 0x51, 0xdc, 0x3e,
- 0x8d, 0xbd, 0x01, 0xbf, 0xf2, 0x48, 0xfa, 0xbe, 0x78, 0x87, 0x4b, 0x3c,
- 0x1d, 0x94, 0xb0, 0xbe, 0xf0, 0x6d, 0x9d, 0xbe, 0xb4, 0xa3, 0xc0, 0xbd,
- 0xc4, 0x48, 0x5b, 0xbe, 0x0b, 0xad, 0x82, 0xbe, 0x13, 0x39, 0xa8, 0x3d,
- 0x9e, 0x0c, 0xde, 0xbe, 0x7f, 0x4e, 0x52, 0x3e, 0x3c, 0xfd, 0xdf, 0xbd,
- 0x15, 0xec, 0x2e, 0x3d, 0xde, 0x54, 0x30, 0xbe, 0xbf, 0xf8, 0x85, 0x3d,
- 0x91, 0x00, 0x28, 0x3f, 0xf1, 0xe1, 0x19, 0x3d, 0x1b, 0x62, 0x1f, 0x3e,
- 0x1a, 0x18, 0xb7, 0x3d, 0xc5, 0x10, 0xc6, 0x3e, 0x48, 0x45, 0x39, 0xbe,
- 0x09, 0x9f, 0x91, 0xbd, 0x05, 0x47, 0x97, 0x3e, 0x15, 0xf6, 0x25, 0xbb,
- 0x47, 0xa6, 0x8d, 0xbe, 0x2a, 0x3e, 0xbc, 0x39, 0xc7, 0x0f, 0xc1, 0xbe,
- 0x9c, 0xee, 0xcd, 0x3c, 0xce, 0xe7, 0x12, 0x3e, 0x5a, 0x47, 0x2f, 0x3d,
- 0x44, 0x1a, 0x55, 0xbe, 0x63, 0x58, 0x16, 0xbd, 0xec, 0x76, 0x0b, 0x3e,
- 0x68, 0xb0, 0x70, 0x3e, 0x4e, 0xf0, 0x99, 0x3e, 0x3a, 0xe0, 0xc0, 0xbe,
- 0x73, 0xbf, 0xff, 0xbd, 0x54, 0x54, 0xbf, 0x3e, 0x10, 0x5b, 0x8d, 0x3c,
- 0xe9, 0xb3, 0xd5, 0x3c, 0x5a, 0x36, 0xcd, 0xbd, 0x9d, 0x95, 0x4f, 0xbe,
- 0x8a, 0x61, 0x9a, 0x3a, 0xc7, 0x9a, 0x40, 0xbf, 0x1d, 0x30, 0xff, 0xbe,
- 0x30, 0x71, 0x5a, 0x3e, 0x0b, 0x22, 0x8a, 0xbd, 0x44, 0xea, 0x10, 0x3f,
- 0x7d, 0x49, 0x1c, 0xbe, 0x93, 0x52, 0x9b, 0x3d, 0x54, 0x60, 0x42, 0xbe,
- 0x2f, 0x9e, 0x0d, 0xbf, 0xac, 0x52, 0x1a, 0xbf, 0xed, 0x05, 0xe7, 0x3c,
- 0xaf, 0x84, 0xd7, 0x3e, 0x77, 0x2b, 0x7c, 0x3e, 0x80, 0xaa, 0x51, 0xbe,
- 0x21, 0x03, 0x0a, 0xbd, 0xb0, 0x53, 0x57, 0x3e, 0x1e, 0x66, 0xa6, 0xbc,
- 0xd9, 0x38, 0x15, 0xbc, 0x90, 0xb7, 0x00, 0x3f, 0xf3, 0xf2, 0xa0, 0x3e,
- 0x90, 0x31, 0xe5, 0x3d, 0x85, 0x16, 0xe5, 0x3e, 0xc8, 0xd2, 0xc4, 0x3e,
- 0x1a, 0xab, 0xc9, 0x3e, 0xe0, 0x6c, 0x65, 0x3e, 0x4d, 0x33, 0x2f, 0x3e,
- 0x1b, 0xa4, 0x40, 0xbf, 0xb4, 0x8f, 0x25, 0x3f, 0x06, 0x04, 0xa8, 0xbc,
- 0x7d, 0x9a, 0xa6, 0xbc, 0x56, 0xea, 0x30, 0xbe, 0xd4, 0x59, 0x94, 0xbe,
- 0xd6, 0xbd, 0xc1, 0xbe, 0xc3, 0x9c, 0x63, 0xbd, 0xdb, 0x35, 0x24, 0x3f,
- 0x17, 0x58, 0xf1, 0xbe, 0xf2, 0xfe, 0x3f, 0xbd, 0xa5, 0x81, 0x70, 0x3f,
- 0x2d, 0xab, 0x47, 0xbf, 0xdf, 0xab, 0xd2, 0xbe, 0x18, 0x88, 0xb3, 0xbe,
- 0x8a, 0xae, 0x0b, 0xbf, 0x61, 0xb8, 0xa7, 0xbc, 0x5d, 0x02, 0x13, 0x3e,
- 0xf6, 0xad, 0x1c, 0xbf, 0xa4, 0xff, 0xdc, 0x3d, 0x2b, 0x21, 0x4e, 0xbe,
- 0x69, 0x70, 0xe8, 0xbe, 0xaa, 0xd9, 0x89, 0xbd, 0xd6, 0xce, 0x98, 0xbe,
- 0xdf, 0x45, 0x60, 0xbd, 0xf2, 0xdd, 0xe0, 0x3e, 0xe0, 0x19, 0xa9, 0xbe,
- 0x98, 0x49, 0x1b, 0x3f, 0xf0, 0x38, 0x9c, 0xbe, 0x1a, 0x5a, 0x29, 0xbe,
- 0xf5, 0x9b, 0x05, 0xbf, 0xdf, 0xda, 0x2e, 0xbe, 0x0a, 0x2a, 0x43, 0xbc,
- 0x6c, 0x5a, 0xff, 0x3e, 0x3b, 0x88, 0x3c, 0x3e, 0x46, 0x1a, 0x0b, 0x3f,
- 0x74, 0x28, 0xbb, 0x3e, 0x2b, 0x89, 0x34, 0xbe, 0x9d, 0x55, 0xe7, 0x3e,
- 0x8a, 0x41, 0x13, 0xbe, 0xe1, 0x97, 0x03, 0xbe, 0x23, 0xac, 0x83, 0x3e,
- 0x35, 0x69, 0x25, 0x3f, 0xb2, 0xae, 0x76, 0x3d, 0x93, 0x88, 0x97, 0xbf,
- 0x48, 0x26, 0x00, 0x3f, 0xb0, 0x8e, 0x08, 0x3e, 0x09, 0x36, 0xb5, 0x3e,
- 0x1f, 0x6a, 0x8c, 0x3e, 0x31, 0x47, 0x71, 0x3e, 0x97, 0x0f, 0xb5, 0xbf,
- 0xcc, 0xdb, 0x41, 0xbf, 0x45, 0x3c, 0xb1, 0xbc, 0x4e, 0xcf, 0x8a, 0x3d,
- 0x1a, 0xdd, 0x91, 0xbd, 0xcc, 0xdf, 0xc2, 0x3d, 0x85, 0xb5, 0x7a, 0x3e,
- 0x53, 0x5f, 0x9b, 0x3d, 0x6a, 0x59, 0xeb, 0x3e, 0xa8, 0x28, 0x77, 0x3d,
- 0xcb, 0xfe, 0xe3, 0xbd, 0xd0, 0x50, 0xa3, 0xbd, 0x9a, 0xb0, 0xcb, 0x3e,
- 0xcd, 0x5e, 0x27, 0xbe, 0x3d, 0x65, 0x49, 0xbd, 0x16, 0x4a, 0x5e, 0x3e,
- 0x1b, 0xa9, 0x67, 0x3e, 0xb9, 0x06, 0x5d, 0x3d, 0x93, 0x0a, 0xa9, 0x3e,
- 0x73, 0x2d, 0xd1, 0xbd, 0x6f, 0xff, 0xab, 0x3b, 0x03, 0x9b, 0x49, 0xbe,
- 0x47, 0xc8, 0x0a, 0x3e, 0x1e, 0x42, 0x0a, 0xbf, 0x14, 0x27, 0x17, 0x3f,
- 0x36, 0x8f, 0x20, 0xbc, 0x2e, 0x9e, 0x68, 0x3e, 0x4f, 0x4b, 0x0a, 0xbe,
- 0x71, 0xa3, 0x2f, 0xbd, 0x88, 0xda, 0xb6, 0xbd, 0x74, 0x48, 0x27, 0x3e,
- 0x7b, 0x2e, 0x36, 0xbe, 0xbb, 0x94, 0x64, 0x3e, 0x4e, 0xf2, 0x94, 0xbd,
- 0x7f, 0xe0, 0x9d, 0x3e, 0xb2, 0x86, 0xbf, 0xbe, 0xe5, 0x3f, 0xb5, 0xbd,
- 0x2b, 0xea, 0x1b, 0xbd, 0x44, 0xc8, 0x8f, 0x3d, 0x06, 0x52, 0x10, 0xbd,
- 0x65, 0x41, 0x2f, 0x3d, 0xe5, 0x3d, 0x69, 0xbe, 0x56, 0x74, 0x9b, 0x3d,
- 0xf5, 0x18, 0xf4, 0xbe, 0x10, 0xa5, 0x26, 0x3e, 0x4f, 0x03, 0x69, 0x3d,
- 0x54, 0x81, 0x05, 0x3e, 0x84, 0x39, 0x32, 0x3e, 0x56, 0xc4, 0xc4, 0x3e,
- 0x63, 0x64, 0x7f, 0xbe, 0x01, 0x30, 0xb5, 0xbd, 0x1d, 0x32, 0x16, 0xbe,
- 0xfa, 0x20, 0x90, 0xbd, 0x0a, 0x97, 0x38, 0xbe, 0x18, 0x93, 0xc5, 0xbd,
- 0x0f, 0xe6, 0x4d, 0x3e, 0xc6, 0x94, 0x60, 0xbe, 0x9c, 0x14, 0xd4, 0xbe,
- 0xe1, 0x56, 0x7a, 0x3e, 0x98, 0x9f, 0x13, 0x3e, 0xda, 0xcc, 0x5d, 0xbd,
- 0x84, 0xb8, 0xa0, 0xbc, 0xe8, 0x85, 0x2f, 0x3e, 0x06, 0xa3, 0xbe, 0x3d,
- 0x19, 0x2a, 0x76, 0xbe, 0xe5, 0x4f, 0x80, 0xbf, 0x60, 0x00, 0x9d, 0x3e,
- 0xc4, 0x58, 0x9a, 0xbd, 0x43, 0xfa, 0x1f, 0xbf, 0xc8, 0x0a, 0x16, 0xbe,
- 0x7f, 0xcf, 0x88, 0x3d, 0x81, 0x05, 0x47, 0x3d, 0x24, 0x9c, 0x78, 0xbd,
- 0x20, 0x4b, 0xde, 0x3d, 0x32, 0xa3, 0x31, 0x3e, 0xb8, 0xe4, 0x48, 0xbe,
- 0xf9, 0x92, 0xa6, 0x3d, 0x13, 0x21, 0xbe, 0x3d, 0xcd, 0xf0, 0xc6, 0x3e,
- 0xe1, 0x1e, 0xae, 0xbd, 0xf7, 0x41, 0x65, 0xbe, 0xde, 0x8c, 0xea, 0xbc,
- 0xc0, 0x90, 0x9c, 0x3e, 0x48, 0xbb, 0x7b, 0xbf, 0x33, 0x79, 0x07, 0xbe,
- 0x07, 0x1b, 0xf5, 0xbd, 0x50, 0x78, 0xb5, 0xbe, 0x22, 0x3f, 0x1a, 0x3b,
- 0xb6, 0x2f, 0x0a, 0x3c, 0xb4, 0x2c, 0x82, 0x3d, 0x94, 0x43, 0xe4, 0xbe,
- 0xd9, 0x7a, 0x28, 0xbe, 0xed, 0x58, 0xc6, 0x3c, 0x48, 0x59, 0x18, 0x3e,
- 0xcf, 0xdf, 0x91, 0x3e, 0x20, 0x0b, 0x08, 0xbf, 0x1b, 0xdf, 0x9e, 0xbd,
- 0xc3, 0x3f, 0xaf, 0xbe, 0x93, 0x55, 0x46, 0xbf, 0x9a, 0xee, 0x1c, 0xbe,
- 0xad, 0xab, 0x6b, 0xbe, 0x33, 0x2e, 0x50, 0x3e, 0x6c, 0xfd, 0x8e, 0xbe,
- 0xeb, 0x5f, 0x94, 0x3d, 0x81, 0xc1, 0x91, 0x3e, 0x96, 0x5d, 0x42, 0x3e,
- 0xb5, 0xf4, 0xee, 0xbd, 0x55, 0x01, 0x20, 0x3d, 0xc9, 0xc3, 0x06, 0xbe,
- 0x23, 0xaa, 0x55, 0xbe, 0x81, 0x4f, 0x38, 0x3e, 0x74, 0x19, 0x61, 0x3e,
- 0xcf, 0x5d, 0x3d, 0x3c, 0xd9, 0x38, 0xc6, 0xbb, 0x0d, 0x9d, 0x00, 0xbf,
- 0xf1, 0x5f, 0xad, 0x3d, 0xe4, 0xa8, 0x8a, 0xbe, 0xe6, 0xa1, 0x25, 0xbb,
- 0x4f, 0x94, 0x1f, 0xbe, 0xa0, 0xc9, 0xae, 0xbe, 0x7a, 0x32, 0x80, 0x3e,
- 0x90, 0xc8, 0x1b, 0x3e, 0x9e, 0x08, 0xfe, 0x3c, 0x30, 0xb5, 0xb0, 0x3d,
- 0xb1, 0xe7, 0x47, 0x3d, 0xa0, 0x72, 0x8a, 0xbe, 0x20, 0x3d, 0x92, 0x3e,
- 0x09, 0x7c, 0xb9, 0x3d, 0x2a, 0x49, 0xd6, 0x3c, 0x26, 0x8f, 0xbc, 0xbe,
- 0x65, 0x88, 0xe4, 0x3d, 0xfe, 0x8d, 0x81, 0x3d, 0x32, 0x6b, 0x1b, 0xbd,
- 0x4f, 0x98, 0xa4, 0x3e, 0x8a, 0x1f, 0xb1, 0x3e, 0xf1, 0x02, 0x6c, 0x3e,
- 0xcb, 0xbd, 0x26, 0xbf, 0x53, 0x7f, 0x48, 0x3e, 0x9c, 0x57, 0x55, 0x3e,
- 0x87, 0x65, 0x97, 0xbb, 0x91, 0x98, 0x10, 0x3e, 0x3c, 0x5f, 0x86, 0xbd,
- 0x66, 0x83, 0x50, 0xbc, 0x07, 0xd9, 0xbd, 0xbd, 0x6c, 0xf4, 0x06, 0xbd,
- 0x90, 0x9a, 0xd4, 0xbe, 0xa1, 0x72, 0x8e, 0x3e, 0x64, 0x7c, 0x4f, 0x3a,
- 0xf9, 0xca, 0x1c, 0xbe, 0xe6, 0x60, 0xd8, 0xbd, 0xa6, 0x51, 0x26, 0xbe,
- 0x45, 0xdb, 0x9d, 0x3e, 0x1c, 0xa4, 0x2a, 0x3e, 0x4c, 0x32, 0x12, 0xbe,
- 0xfb, 0xdf, 0x34, 0xbf, 0xee, 0x0d, 0xb7, 0x3e, 0xf7, 0x73, 0x29, 0xbe,
- 0xbd, 0x3a, 0x1d, 0x3e, 0xe6, 0x43, 0xb4, 0xbc, 0xdf, 0xd7, 0xe7, 0xbe,
- 0x98, 0x96, 0xce, 0x3d, 0x3c, 0x2c, 0xf9, 0xbc, 0x3b, 0xf8, 0xcc, 0x3c,
- 0x29, 0x2f, 0xc8, 0xbe, 0x42, 0x28, 0x26, 0xbe, 0xc2, 0x30, 0x0a, 0xbf,
- 0x8d, 0x2d, 0x61, 0x3e, 0x64, 0x57, 0x95, 0x3e, 0x4a, 0x3e, 0x8e, 0x3d,
- 0x47, 0x67, 0xbc, 0xbd, 0x37, 0x94, 0x71, 0xbb, 0x2d, 0x41, 0x22, 0xbd,
- 0x26, 0x33, 0x5f, 0xbe, 0x4b, 0xec, 0x3c, 0xbb, 0x78, 0x5a, 0x9c, 0x3d,
- 0x33, 0x96, 0x51, 0x3c, 0xa3, 0x6c, 0x83, 0xbc, 0x19, 0x16, 0x38, 0x3e,
- 0xbd, 0x41, 0x1a, 0x3e, 0x1a, 0x89, 0x98, 0xbd, 0x22, 0x9d, 0x14, 0x3e,
- 0xca, 0x03, 0x2a, 0xbe, 0x2d, 0xc7, 0x59, 0xbf, 0xa7, 0xa0, 0x22, 0xbe,
- 0x00, 0x32, 0x4a, 0x3e, 0x7a, 0x56, 0x57, 0xbe, 0x6e, 0x04, 0x30, 0xbc,
- 0xe3, 0xf4, 0x3d, 0x3d, 0x08, 0x48, 0x84, 0xbe, 0xa4, 0x69, 0xa4, 0x3c,
- 0x59, 0xf6, 0xcf, 0x3d, 0x62, 0x04, 0x97, 0xbd, 0x22, 0xa1, 0x15, 0x3e,
- 0x2e, 0x75, 0x02, 0xbe, 0xe5, 0xca, 0xb5, 0xbe, 0x34, 0xd3, 0xbc, 0xbe,
- 0xd3, 0x17, 0xf2, 0xbe, 0x3e, 0x3a, 0x77, 0xbe, 0x3b, 0x37, 0xcc, 0xbe,
- 0x2f, 0x8e, 0x13, 0x3e, 0x92, 0x16, 0xaf, 0x3c, 0xe8, 0x14, 0x58, 0x3d,
- 0x86, 0xc4, 0x3f, 0x3d, 0xaa, 0x34, 0x05, 0xbe, 0x9c, 0xa6, 0x3b, 0x3e,
- 0x3d, 0x78, 0x56, 0xbe, 0x37, 0xd7, 0x71, 0x3e, 0x24, 0x8c, 0x86, 0x3e,
- 0x44, 0x80, 0x84, 0xbc, 0xbe, 0x05, 0x9b, 0xbe, 0x6a, 0xac, 0x93, 0xbc,
- 0x73, 0xfd, 0x20, 0x3d, 0x1e, 0x95, 0xde, 0x3e, 0x30, 0x1c, 0x7f, 0x3e,
- 0xc3, 0x0f, 0xa2, 0xbe, 0x37, 0x41, 0xdd, 0x3e, 0x1c, 0x6d, 0x9e, 0xbe,
- 0xab, 0x46, 0xc8, 0x3d, 0x3a, 0xe5, 0x67, 0x3e, 0x9d, 0xce, 0x24, 0xbd,
- 0x8d, 0x0a, 0xa5, 0xbe, 0xda, 0xaa, 0xf9, 0x3e, 0x26, 0x92, 0x84, 0xbe,
- 0x56, 0x00, 0x90, 0x3d, 0x3d, 0xf8, 0x5f, 0x3e, 0x91, 0xdc, 0x40, 0x3e,
- 0xc7, 0x0e, 0x90, 0xbd, 0x07, 0x2f, 0xab, 0x3d, 0x41, 0xc3, 0xd4, 0x3d,
- 0x6c, 0x45, 0x70, 0x3e, 0x88, 0x8a, 0x6e, 0xbe, 0xd8, 0x2c, 0x1e, 0x3e,
- 0xeb, 0x3f, 0xa9, 0xbd, 0x74, 0x54, 0xfe, 0xbe, 0x0f, 0x37, 0xa1, 0xbe,
- 0x1a, 0x25, 0x0f, 0x3e, 0x6d, 0xfb, 0x0a, 0xbf, 0x23, 0xb8, 0x82, 0x3e,
- 0x70, 0xae, 0x5d, 0xbe, 0x29, 0x4e, 0x22, 0x3d, 0x70, 0xb9, 0x8b, 0xbe,
- 0xf1, 0x8e, 0x27, 0x3e, 0x25, 0x21, 0x64, 0xbc, 0xf0, 0x99, 0xcc, 0xbe,
- 0x51, 0x08, 0x97, 0xbf, 0xa3, 0xdb, 0xb5, 0xbd, 0xf9, 0xd8, 0xa2, 0xbe,
- 0xf2, 0x5a, 0xbf, 0xbe, 0x50, 0x87, 0xb1, 0xbe, 0xf8, 0xaa, 0x89, 0xbe,
- 0x32, 0x26, 0x30, 0x38, 0xbf, 0x44, 0x69, 0x3e, 0x3d, 0x59, 0x9c, 0x3a,
- 0xbc, 0x7f, 0x0d, 0xbc, 0x67, 0x96, 0xb6, 0xbe, 0x25, 0xf8, 0x72, 0x3d,
- 0x16, 0x62, 0x9b, 0x3c, 0xce, 0xda, 0x09, 0xbf, 0xc4, 0x71, 0xb3, 0x3e,
- 0x0a, 0xd4, 0xac, 0x3e, 0x3b, 0x91, 0x4e, 0xbe, 0x33, 0xa4, 0x90, 0x3d,
- 0x11, 0x67, 0x2e, 0xbd, 0x24, 0xf7, 0x15, 0x3e, 0x8c, 0x23, 0x63, 0x3e,
- 0xe2, 0x7a, 0x85, 0x3e, 0x86, 0x10, 0xe1, 0xbc, 0xd4, 0xc8, 0xed, 0xbe,
- 0x2f, 0x00, 0x53, 0xbe, 0x24, 0xd8, 0x65, 0xbd, 0xc4, 0x34, 0xc0, 0x3e,
- 0x24, 0x4b, 0xe1, 0x3c, 0xdc, 0x1f, 0x5c, 0x3e, 0x4b, 0x6c, 0xa3, 0x3d,
- 0xcb, 0xca, 0xcc, 0x3e, 0xf2, 0x28, 0x23, 0x3d, 0x35, 0xbf, 0xa9, 0x3e,
- 0x58, 0xbf, 0x50, 0x3f, 0x8e, 0xbc, 0x1c, 0xbf, 0xa5, 0xe9, 0x29, 0x3e,
- 0x15, 0x5b, 0x19, 0xbb, 0x15, 0x9f, 0xb3, 0xbd, 0xcc, 0x12, 0x34, 0x3e,
- 0xba, 0x9c, 0x83, 0xbe, 0xa6, 0xd2, 0x4b, 0xbe, 0x65, 0x4b, 0x1c, 0x3d,
- 0x97, 0x99, 0x3d, 0x3d, 0x3c, 0xd5, 0x6a, 0xbe, 0x4c, 0x1a, 0x8e, 0xbd,
- 0xbb, 0x81, 0x9d, 0x3e, 0x2c, 0x67, 0xfe, 0xbe, 0xa6, 0xab, 0xa0, 0x3e,
- 0x70, 0x7b, 0x09, 0xbe, 0x34, 0x73, 0x03, 0xbe, 0x5a, 0xd2, 0x6b, 0xbc,
- 0x8f, 0x40, 0x30, 0xbd, 0xa9, 0x6c, 0x09, 0x3e, 0xbe, 0xfe, 0xc5, 0x3d,
- 0x25, 0x8c, 0xb7, 0x3e, 0x43, 0xef, 0x25, 0x3d, 0xb7, 0x3d, 0x1a, 0xbe,
- 0xa6, 0xca, 0x26, 0xbd, 0xcb, 0x95, 0x06, 0x3f, 0x51, 0x84, 0x73, 0xbe,
- 0xd5, 0x0e, 0x01, 0xbf, 0x6d, 0x34, 0x19, 0xbe, 0x7b, 0xdd, 0xd5, 0xbc,
- 0x9a, 0x83, 0x83, 0x3e, 0xc1, 0x71, 0x79, 0x3d, 0xfc, 0x82, 0xcf, 0xbe,
- 0x92, 0xbe, 0x99, 0xbd, 0x06, 0xdc, 0x2b, 0xbc, 0x31, 0x71, 0x5e, 0x3e,
- 0xca, 0xed, 0x90, 0xbe, 0x6d, 0x57, 0xe0, 0x3d, 0x24, 0x86, 0xe7, 0xbd,
- 0xda, 0xfc, 0xf4, 0xbd, 0xdd, 0x5a, 0x3b, 0x3e, 0x59, 0xa0, 0x0a, 0xbe,
- 0x59, 0xab, 0x4e, 0xbe, 0x47, 0x0a, 0x89, 0xbd, 0xfb, 0x05, 0x97, 0xbc,
- 0xbd, 0x10, 0x54, 0xbe, 0x9b, 0x22, 0x10, 0x3e, 0x20, 0x2e, 0x04, 0xbe,
- 0xe3, 0x60, 0x92, 0x3d, 0xc1, 0xd3, 0x98, 0xbd, 0x2e, 0xa4, 0xc0, 0xbd,
- 0x5c, 0x87, 0xa9, 0x3d, 0x4a, 0xd7, 0x21, 0x3e, 0xa3, 0xf4, 0x6a, 0x3e,
- 0xaf, 0x0c, 0xbc, 0x3e, 0x71, 0xaa, 0x43, 0xbc, 0x41, 0x0a, 0xcc, 0x3d,
- 0xac, 0x05, 0x91, 0xbe, 0x1c, 0x8d, 0x06, 0xbe, 0x9b, 0x6f, 0x40, 0x3e,
- 0x8a, 0x21, 0x35, 0xbd, 0xcd, 0x44, 0xdf, 0xbd, 0x1d, 0x97, 0xb5, 0x3e,
- 0x01, 0x25, 0x2c, 0xbf, 0x28, 0xd3, 0x06, 0xbe, 0xc8, 0x5d, 0x65, 0x3e,
- 0x77, 0x7d, 0xe1, 0xbe, 0x9b, 0x60, 0xca, 0xbc, 0x45, 0xcc, 0x13, 0xbf,
- 0xbb, 0xfb, 0xe8, 0x3d, 0xb9, 0x2f, 0x6d, 0x3e, 0x28, 0x93, 0x84, 0xbe,
- 0xb9, 0x38, 0xea, 0xbd, 0xe5, 0xca, 0xc9, 0xbd, 0x64, 0xea, 0xa7, 0x3d,
- 0xae, 0x82, 0x0a, 0xbe, 0x2a, 0xb6, 0xa1, 0xbc, 0x2d, 0x7d, 0xf6, 0x3d,
- 0xb4, 0x99, 0x57, 0xbe, 0xfb, 0x47, 0x32, 0x3f, 0xce, 0xf9, 0xdf, 0x3e,
- 0x3f, 0x84, 0x52, 0xbe, 0xb6, 0xaf, 0x0a, 0xbe, 0x6d, 0x76, 0x6b, 0x3e,
- 0x88, 0xcc, 0xef, 0x3d, 0x4d, 0xde, 0xc1, 0x3d, 0xe7, 0xdc, 0xcf, 0x3d,
- 0xa5, 0x07, 0x86, 0x3d, 0xd6, 0x98, 0x4e, 0xbf, 0x85, 0x9c, 0x07, 0x3d,
- 0x70, 0x75, 0x8c, 0x3e, 0x0e, 0x19, 0x53, 0xbf, 0xad, 0x96, 0x8e, 0xbe,
- 0x97, 0x2f, 0x2f, 0x3e, 0xef, 0x4e, 0xcc, 0xbe, 0x5b, 0xe5, 0xc5, 0xbe,
- 0xae, 0xbe, 0x51, 0x3c, 0xd6, 0x6d, 0x82, 0x3d, 0x8f, 0xf4, 0x20, 0x3e,
- 0xc6, 0x1b, 0xf2, 0x3d, 0x61, 0x99, 0x19, 0xbf, 0x1e, 0xa0, 0x4b, 0xbf,
- 0xc1, 0x37, 0x02, 0xbd, 0x73, 0x05, 0xf7, 0xbd, 0x67, 0xf3, 0x96, 0xbd,
- 0xae, 0xea, 0x76, 0xbe, 0x41, 0x3e, 0xd2, 0xbd, 0xda, 0x27, 0x72, 0x3e,
- 0x30, 0xd5, 0x1e, 0x3d, 0x60, 0xbf, 0xda, 0x3d, 0x15, 0xdb, 0x0a, 0x3d,
- 0xb2, 0x1d, 0xad, 0x3c, 0x9a, 0x4b, 0x6e, 0x3e, 0xf1, 0x9a, 0x37, 0x3d,
- 0xb6, 0xf8, 0x2d, 0x3e, 0xdf, 0xa2, 0xee, 0x3d, 0x10, 0x4d, 0x00, 0xbe,
- 0xef, 0x6a, 0x31, 0xbd, 0xf6, 0x15, 0x83, 0xbe, 0x0c, 0x64, 0x2f, 0x3c,
- 0x1a, 0x01, 0xd5, 0xbc, 0x7b, 0x60, 0xcf, 0x3d, 0x01, 0x84, 0x08, 0xbe,
- 0xc0, 0x27, 0x75, 0x3e, 0xec, 0x26, 0x22, 0x3e, 0x1e, 0xdb, 0x7e, 0x3e,
- 0xeb, 0xe5, 0x51, 0xbe, 0x30, 0xe0, 0x4e, 0x3e, 0x4e, 0xe0, 0x95, 0x3d,
- 0x65, 0x0a, 0x9e, 0xbd, 0x3c, 0x71, 0xb8, 0x3d, 0x66, 0xcc, 0x28, 0xbe,
- 0xc7, 0x96, 0x4d, 0xbd, 0x59, 0xae, 0xe3, 0xbd, 0x17, 0x67, 0x49, 0x3e,
- 0x26, 0x9f, 0x93, 0x3d, 0xd1, 0x23, 0x2b, 0xbe, 0xbc, 0x5d, 0xca, 0x3d,
- 0xa7, 0x18, 0x31, 0x3e, 0x12, 0x38, 0x93, 0x3e, 0xd9, 0xff, 0x34, 0x3c,
- 0x94, 0x10, 0xad, 0x3c, 0x83, 0x5c, 0x6f, 0x3e, 0x6c, 0x68, 0x84, 0xbe,
- 0x10, 0x41, 0xe8, 0x3d, 0xe1, 0x32, 0x54, 0xbe, 0x23, 0xef, 0x7e, 0xbe,
- 0x4f, 0xcd, 0x7e, 0x3e, 0xc7, 0x74, 0xe7, 0xbe, 0x2b, 0x88, 0x30, 0x3d,
- 0xf8, 0x9d, 0xd4, 0xbd, 0xd2, 0x8d, 0x07, 0x3c, 0xbc, 0x0c, 0xa6, 0xbe,
- 0x80, 0xbc, 0xf0, 0xbd, 0xb1, 0xd7, 0x6d, 0x3c, 0xc2, 0x8b, 0xb6, 0xbc,
- 0x9a, 0x53, 0x88, 0x3e, 0x4a, 0x42, 0x82, 0xbe, 0x73, 0xa7, 0xf6, 0xbd,
- 0xf0, 0x0e, 0xa9, 0x3d, 0x8b, 0x58, 0x8c, 0xbe, 0xef, 0x76, 0x4b, 0xbe,
- 0x9f, 0xcb, 0xa1, 0x3d, 0x17, 0xf9, 0xa2, 0x3d, 0x99, 0xa7, 0xfa, 0xbc,
- 0xef, 0x92, 0xbc, 0xbd, 0xf4, 0xf3, 0x04, 0x3e, 0x32, 0x2b, 0x8d, 0x3e,
- 0xbf, 0x38, 0xf9, 0x3d, 0x65, 0x75, 0x28, 0xbd, 0x7b, 0x8e, 0x15, 0x3c,
- 0x6e, 0xa1, 0x80, 0x3d, 0x2f, 0x96, 0x2f, 0xbe, 0x71, 0xba, 0x90, 0xbd,
- 0x2b, 0x3d, 0xc0, 0xbe, 0x91, 0xd2, 0x0e, 0x3e, 0x78, 0xe7, 0xc3, 0x3c,
- 0x2a, 0x82, 0x3b, 0x3f, 0xea, 0x5c, 0x10, 0xbe, 0x19, 0x76, 0x16, 0xbd,
- 0x94, 0xad, 0x64, 0xbc, 0x92, 0x56, 0xe2, 0x3d, 0x60, 0x8a, 0x9d, 0x3d,
- 0x3f, 0x32, 0x08, 0x3e, 0x24, 0x96, 0xe5, 0xbc, 0xfa, 0x4b, 0x93, 0x3e,
- 0xe8, 0xbb, 0xa3, 0xbe, 0x6e, 0x4c, 0xac, 0xbd, 0xf6, 0x43, 0x33, 0x3e,
- 0x76, 0x2f, 0x8d, 0x3e, 0xb2, 0x70, 0x6a, 0xbe, 0xc5, 0x5a, 0x1f, 0x3e,
- 0x2f, 0xd3, 0x8b, 0xbc, 0x8f, 0x24, 0xc8, 0xbc, 0xd0, 0xae, 0x1f, 0x3f,
- 0x56, 0x14, 0x52, 0xbe, 0xee, 0x0b, 0x86, 0x3e, 0x70, 0x3d, 0x24, 0xbe,
- 0xc1, 0xba, 0x13, 0x3e, 0x67, 0xee, 0x67, 0x3e, 0x56, 0x70, 0xc4, 0xbc,
- 0xbd, 0xdb, 0x76, 0x3d, 0x88, 0xe9, 0x86, 0x3e, 0x57, 0x13, 0x0a, 0x3e,
- 0xbf, 0x42, 0xba, 0xbd, 0x5f, 0xff, 0x03, 0xbd, 0xda, 0x28, 0xe7, 0x3b,
- 0x01, 0x8f, 0x04, 0x3d, 0x14, 0x7e, 0x1c, 0x3e, 0xd4, 0xf0, 0xa1, 0xbd,
- 0x18, 0x6d, 0xb9, 0x3d, 0xdf, 0x3a, 0x6f, 0x3d, 0xe5, 0x8f, 0x05, 0x3e,
- 0x97, 0x14, 0xed, 0xbe, 0x2f, 0x7c, 0x06, 0xbe, 0x0a, 0x1f, 0x8a, 0x3e,
- 0x6c, 0xd7, 0x2e, 0xbe, 0x15, 0x26, 0xc5, 0x3d, 0x3f, 0xf0, 0xee, 0xbe,
- 0xe9, 0xa1, 0x8b, 0x3d, 0x43, 0xf7, 0x34, 0xbe, 0x41, 0x37, 0xd4, 0x3e,
- 0xfb, 0x74, 0x21, 0xbe, 0x19, 0x32, 0x88, 0x3d, 0x67, 0x1d, 0x34, 0x3e,
- 0x32, 0x28, 0x9f, 0x3e, 0xa1, 0x52, 0xae, 0xbd, 0x5d, 0x2a, 0x09, 0xbf,
- 0x84, 0x95, 0x2e, 0xbe, 0x32, 0x19, 0x19, 0x3e, 0x9c, 0x85, 0x9f, 0xba,
- 0xb7, 0x33, 0xd0, 0xbe, 0x18, 0x00, 0xbb, 0xbd, 0xc1, 0x29, 0xf1, 0xbd,
- 0xf2, 0x46, 0xce, 0x3a, 0xa0, 0x48, 0xe0, 0xbc, 0xb8, 0x98, 0x12, 0xbe,
- 0xcd, 0xd3, 0x71, 0xbd, 0xae, 0x61, 0x6f, 0x3d, 0xa2, 0x22, 0xed, 0xbe,
- 0xa5, 0xdd, 0x35, 0x3e, 0x22, 0x06, 0x4b, 0x3e, 0x4e, 0xe3, 0x56, 0x3d,
- 0xb3, 0xa9, 0xdb, 0x3e, 0x68, 0x13, 0xc1, 0xbd, 0xc2, 0x57, 0x14, 0x3d,
- 0x5f, 0xac, 0xba, 0x3d, 0xcb, 0xae, 0xb1, 0x3e, 0x2d, 0x65, 0x63, 0x3e,
- 0x65, 0xf6, 0x0f, 0xbe, 0x6c, 0x1f, 0x89, 0xbe, 0xb5, 0xf3, 0x27, 0xbf,
- 0x9b, 0xdf, 0x9d, 0xbe, 0xa8, 0x7e, 0x81, 0x3d, 0xfb, 0x59, 0x5c, 0x3d,
- 0x68, 0x46, 0x1f, 0x3e, 0x8d, 0xa6, 0x47, 0x3d, 0x50, 0x18, 0x90, 0xbe,
- 0x7a, 0x12, 0x8a, 0x3e, 0x74, 0x9f, 0xf9, 0xbe, 0xc5, 0x32, 0x1e, 0xbe,
- 0x76, 0x14, 0xc1, 0x3e, 0x39, 0x7e, 0x14, 0xbf, 0x73, 0x31, 0x0d, 0xbf,
- 0x90, 0xb7, 0xb7, 0x3c, 0x2b, 0x9e, 0x8c, 0xbd, 0x69, 0x7c, 0x66, 0xbd,
- 0x5a, 0x76, 0xdb, 0x3c, 0x61, 0x08, 0x04, 0xbe, 0x08, 0x48, 0x34, 0x3e,
- 0x56, 0x9f, 0x7d, 0xbe, 0xd7, 0x9c, 0xe1, 0x3d, 0x42, 0x97, 0xd1, 0xbd,
- 0x7f, 0xc1, 0x09, 0x3e, 0x7a, 0xd3, 0xd9, 0x3d, 0x4d, 0x14, 0x83, 0xbf,
- 0x9e, 0xc1, 0x9d, 0xbd, 0x31, 0x06, 0xde, 0xbe, 0x9c, 0x49, 0x0f, 0xbf,
- 0x9e, 0x4f, 0x64, 0xbd, 0xba, 0x20, 0x95, 0x3e, 0xa4, 0xab, 0xe1, 0x3d,
- 0xca, 0x79, 0xd0, 0x3d, 0x88, 0xab, 0x5d, 0xbe, 0xff, 0xde, 0xec, 0x3d,
- 0x00, 0x4e, 0xca, 0x3d, 0x74, 0x1a, 0xcc, 0xb8, 0xee, 0x4d, 0x50, 0xbf,
- 0x08, 0x54, 0x6c, 0x3e, 0xad, 0x20, 0x29, 0x3e, 0xaf, 0x83, 0x58, 0x3e,
- 0x60, 0xac, 0xae, 0x3c, 0x01, 0xaf, 0xc7, 0x3b, 0xb3, 0xef, 0x65, 0xbf,
- 0x0e, 0x03, 0x5c, 0x3e, 0xb0, 0x17, 0x03, 0x3e, 0x9c, 0x96, 0xc5, 0xbc,
- 0x00, 0x76, 0x41, 0xbe, 0x2f, 0x0f, 0x64, 0x3e, 0x54, 0x16, 0x33, 0x3e,
- 0x44, 0xc6, 0x15, 0xbd, 0xcf, 0x38, 0x87, 0xbd, 0x1b, 0xb0, 0xc6, 0xbe,
- 0x2d, 0xd6, 0x82, 0xbe, 0xc1, 0x8b, 0xa5, 0xbe, 0x54, 0xa9, 0x08, 0xbf,
- 0x00, 0x8a, 0x20, 0x3e, 0xa1, 0x54, 0x04, 0x3e, 0x3e, 0xe2, 0x09, 0xbe,
- 0xee, 0x06, 0xc9, 0x3d, 0x79, 0xd8, 0x10, 0xbe, 0x15, 0xc0, 0xda, 0xbd,
- 0x35, 0xfc, 0x38, 0x3c, 0x89, 0xda, 0xb7, 0xbd, 0xee, 0x51, 0x14, 0x3e,
- 0xf0, 0x43, 0x8c, 0xba, 0xf0, 0xe2, 0xec, 0xbe, 0xd9, 0xa5, 0x1e, 0xbe,
- 0x08, 0x5b, 0x34, 0x3e, 0x7f, 0x8a, 0xb8, 0xbd, 0x1c, 0xdc, 0xee, 0x3d,
- 0xa0, 0xd6, 0x48, 0x3d, 0xf0, 0x22, 0x0f, 0x3e, 0x01, 0xa4, 0x81, 0x3d,
- 0xef, 0x2b, 0xf8, 0x3d, 0xa1, 0xb5, 0x0f, 0x3e, 0x00, 0x88, 0x01, 0xbe,
- 0x62, 0x65, 0x82, 0x3d, 0xc4, 0x00, 0xe5, 0x3c, 0x16, 0x18, 0x49, 0x3e,
- 0x32, 0x44, 0x94, 0x3d, 0x77, 0x66, 0x36, 0xbe, 0x8b, 0x46, 0xe3, 0x3d,
- 0xfe, 0xe3, 0x2c, 0x3d, 0x94, 0x36, 0xc8, 0x3e, 0xa9, 0x5b, 0x99, 0x3d,
- 0x43, 0xe6, 0x5f, 0x3e, 0x13, 0x75, 0xc6, 0xbe, 0xde, 0xc7, 0x21, 0xbe,
- 0x04, 0xb2, 0x13, 0xbf, 0x79, 0x11, 0x53, 0x3c, 0xdf, 0xb6, 0xcd, 0xbc,
- 0xf6, 0x40, 0x33, 0xbe, 0xf2, 0xdd, 0xae, 0x3e, 0xae, 0xc6, 0x70, 0x3e,
- 0xbb, 0xf2, 0xe0, 0xbe, 0x9e, 0xb4, 0x28, 0x3e, 0xd4, 0xdf, 0x8e, 0xbe,
- 0x8e, 0x40, 0x11, 0xbe, 0xb2, 0x3d, 0x4e, 0xbd, 0x11, 0x05, 0xb2, 0xbd,
- 0x9b, 0xd8, 0x19, 0xbf, 0x44, 0xed, 0x42, 0x3d, 0xa7, 0x10, 0x8f, 0x3e,
- 0x3c, 0x18, 0xc9, 0xbe, 0xdc, 0x44, 0x4e, 0xbd, 0x11, 0x88, 0xe0, 0x3c,
- 0x2f, 0xfc, 0x8f, 0xbd, 0xb2, 0x96, 0x5c, 0x3e, 0x62, 0xbe, 0x2d, 0xbe,
- 0x2c, 0xfd, 0x80, 0x3e, 0xba, 0x96, 0x92, 0x3d, 0xa4, 0x62, 0x09, 0x3e,
- 0x13, 0x89, 0x45, 0x3e, 0x92, 0xcc, 0x05, 0xbd, 0xf6, 0xbd, 0x5c, 0xbe,
- 0xc7, 0x1c, 0x40, 0x3c, 0x25, 0xfe, 0x7b, 0x3d, 0x6d, 0xd3, 0x7e, 0xbc,
- 0x08, 0xe9, 0xbc, 0x3d, 0xb8, 0x55, 0x91, 0xbe, 0xf4, 0x57, 0x4c, 0xbd,
- 0xf7, 0x61, 0xf1, 0xbe, 0x73, 0xdc, 0x8e, 0x3d, 0x4b, 0x91, 0x53, 0xbd,
- 0xe9, 0xb1, 0x8f, 0x3e, 0xc1, 0xc9, 0x46, 0xbe, 0xa1, 0x7f, 0xf3, 0xbe,
- 0x47, 0x01, 0xf1, 0x3d, 0x40, 0x25, 0x83, 0xbe, 0x2f, 0x18, 0x80, 0x3e,
- 0x63, 0x27, 0x1f, 0x3d, 0xe9, 0xd0, 0xa3, 0x3e, 0x59, 0xd5, 0x0c, 0xbf,
- 0xc2, 0x37, 0x08, 0x3e, 0x8e, 0xae, 0x43, 0x3e, 0x82, 0x9d, 0x86, 0xbe,
- 0x2f, 0x28, 0xf0, 0x3d, 0x76, 0x06, 0x79, 0xbe, 0xd0, 0xa0, 0xe5, 0xbd,
- 0x11, 0x29, 0xf2, 0xbe, 0xfd, 0xae, 0x4c, 0x3e, 0x5e, 0xc9, 0x81, 0xbe,
- 0xf1, 0x63, 0x9b, 0xbe, 0x9c, 0x56, 0xcc, 0xbd, 0x35, 0x49, 0x84, 0xbd,
- 0x70, 0x52, 0x80, 0xbd, 0x67, 0x45, 0x73, 0xbd, 0xf0, 0x45, 0x9b, 0x3c,
- 0x6b, 0xfb, 0x2a, 0x3d, 0xa6, 0x6f, 0xa0, 0x3e, 0xe5, 0x16, 0xed, 0x3d,
- 0x6e, 0xe7, 0xbc, 0xbe, 0xde, 0x4c, 0xe3, 0xbe, 0x22, 0xa2, 0x64, 0x3e,
- 0x69, 0xc8, 0x17, 0x3e, 0xd7, 0x4c, 0xbc, 0xbc, 0xa0, 0x43, 0x36, 0x3e,
- 0x1d, 0xaa, 0xd7, 0xbd, 0x83, 0xf1, 0x9f, 0xbc, 0xaf, 0xcb, 0x59, 0xbe,
- 0x03, 0x9d, 0x33, 0x3d, 0x8c, 0xc2, 0x18, 0xbe, 0xec, 0xb0, 0x9a, 0xbd,
- 0xf4, 0x45, 0x49, 0x3e, 0x1f, 0xec, 0xb3, 0xbe, 0xf9, 0x06, 0x16, 0x3e,
- 0xf0, 0xd9, 0x32, 0xbe, 0x4f, 0xfd, 0xa9, 0x3d, 0x39, 0x6b, 0x26, 0x3d,
- 0x9a, 0x81, 0x6c, 0xbe, 0x79, 0x83, 0xa8, 0x3d, 0xef, 0x2d, 0x90, 0x3e,
- 0xff, 0xd2, 0xfe, 0xbc, 0xc2, 0x75, 0xbf, 0xbe, 0xcc, 0x9b, 0x5c, 0xbd,
- 0xf8, 0x23, 0xac, 0xbd, 0x37, 0xce, 0xba, 0x3d, 0xd5, 0xb0, 0x56, 0xbf,
- 0xab, 0xe8, 0x25, 0x3e, 0x49, 0x05, 0xdd, 0x3d, 0x73, 0xa0, 0x97, 0xbd,
- 0x0a, 0x2f, 0xd1, 0xbd, 0xdb, 0xaf, 0xca, 0xbd, 0x23, 0x08, 0xd4, 0xbd,
- 0xd6, 0x0a, 0x41, 0xbd, 0xa4, 0x49, 0xc7, 0x3d, 0x1d, 0x02, 0x69, 0xbe,
- 0x91, 0x50, 0xda, 0xbd, 0x66, 0x7b, 0x91, 0xbe, 0x58, 0x10, 0xb2, 0x3c,
- 0x8c, 0xb4, 0x94, 0xbe, 0x73, 0x97, 0x28, 0x3e, 0x15, 0xa9, 0x86, 0xbe,
- 0xbd, 0xe9, 0x19, 0xbd, 0x0a, 0x30, 0xb9, 0x3d, 0xbc, 0xd9, 0x0a, 0xbe,
- 0x74, 0xa0, 0xfd, 0xbe, 0x77, 0x12, 0x36, 0x3d, 0x55, 0x8d, 0x23, 0x3e,
- 0xb1, 0xca, 0x09, 0x3e, 0x29, 0xd3, 0x65, 0x3c, 0xf3, 0xf0, 0x40, 0x3e,
- 0x84, 0x8c, 0xdb, 0x3e, 0x29, 0x20, 0x18, 0x3f, 0xb8, 0x27, 0x75, 0xbd,
- 0x21, 0xde, 0x2c, 0x3d, 0xe1, 0x33, 0xa2, 0x3e, 0xf7, 0x6b, 0x6d, 0x3e,
- 0x99, 0xc9, 0x92, 0x3d, 0xc7, 0x3c, 0x1f, 0x3e, 0x10, 0xab, 0xa3, 0x3d,
- 0xb2, 0xf8, 0x0e, 0xbc, 0xb9, 0x5e, 0xbe, 0xbe, 0xe9, 0x82, 0x3b, 0x3e,
- 0xa7, 0x1d, 0x83, 0xbe, 0xc3, 0x08, 0xc0, 0xbd, 0xae, 0x51, 0x2a, 0xbe,
- 0x69, 0x82, 0x22, 0xbe, 0xb9, 0x9b, 0x55, 0x3f, 0x54, 0xd1, 0x89, 0x3a,
- 0xfd, 0x75, 0xa0, 0xbe, 0x59, 0xa9, 0xc9, 0x3d, 0xf9, 0x6f, 0xc3, 0x3d,
- 0x59, 0x45, 0xaa, 0x3e, 0x49, 0xd9, 0x34, 0x3e, 0xdd, 0xc0, 0xe9, 0x3b,
- 0x2c, 0x7d, 0xd5, 0xbe, 0xb7, 0x2a, 0x81, 0x3d, 0xc9, 0x2d, 0x98, 0x3e,
- 0x03, 0x83, 0xe8, 0x3c, 0x58, 0x79, 0x80, 0xbd, 0x30, 0x26, 0x22, 0x3f,
- 0x34, 0x63, 0x6f, 0x3e, 0x7f, 0xcb, 0x3a, 0xbf, 0xad, 0xba, 0x26, 0xbe,
- 0x9f, 0x7c, 0x48, 0xbd, 0xfb, 0x38, 0x7d, 0xbe, 0xe6, 0x3b, 0xf1, 0x3d,
- 0xa7, 0x30, 0xa1, 0xbe, 0xdb, 0xce, 0x02, 0x3e, 0x92, 0x76, 0x79, 0x3d,
- 0x46, 0x57, 0xb0, 0x3e, 0x0a, 0xea, 0xd4, 0x3d, 0xb1, 0xe6, 0x64, 0xbd,
- 0xed, 0xf5, 0x19, 0x3d, 0x23, 0x07, 0x0c, 0xbf, 0x28, 0xe0, 0x3c, 0x3e,
- 0x68, 0xf3, 0x89, 0xbe, 0x34, 0xb8, 0xd5, 0x3d, 0xbf, 0xa1, 0xa9, 0x3c,
- 0x5f, 0xeb, 0x36, 0xbf, 0x1a, 0x23, 0x3f, 0xbd, 0x97, 0x07, 0x22, 0x3f,
- 0xfa, 0x7d, 0xaa, 0x3e, 0x98, 0x81, 0xa8, 0x3e, 0xed, 0xad, 0x8e, 0x3e,
- 0x48, 0x4f, 0xf2, 0xbe, 0x0b, 0x34, 0xc7, 0xbd, 0x81, 0x8b, 0x9f, 0xbd,
- 0x9b, 0x30, 0x43, 0x3e, 0x04, 0xa6, 0xf5, 0x3c, 0x32, 0xac, 0xdf, 0xbe,
- 0xce, 0x80, 0x98, 0xbd, 0xfe, 0xdf, 0x08, 0x3e, 0x95, 0x43, 0x0b, 0xbe,
- 0xe1, 0x12, 0x8b, 0x3e, 0x01, 0x5e, 0x09, 0xbf, 0xa5, 0xfb, 0x1a, 0xbe,
- 0x4b, 0x2e, 0x1b, 0xbf, 0x15, 0x60, 0x14, 0x3e, 0x45, 0x7c, 0xdd, 0xbd,
- 0xe8, 0x97, 0xe5, 0xbe, 0x45, 0x4f, 0x70, 0xbf, 0x68, 0xbe, 0x17, 0x3f,
- 0x27, 0x6b, 0x69, 0x3e, 0x21, 0x42, 0x25, 0xbe, 0x7f, 0x0c, 0x4e, 0x3e,
- 0xea, 0x5c, 0x30, 0x3d, 0xce, 0x50, 0x92, 0x3d, 0x29, 0x68, 0xdd, 0x3d,
- 0xb2, 0x4a, 0xba, 0xbd, 0xac, 0xe5, 0x17, 0x3e, 0x55, 0x46, 0x8f, 0x3e,
- 0x39, 0xce, 0x0a, 0x3f, 0xf9, 0xee, 0x57, 0xbe, 0x2b, 0xb9, 0x94, 0x3c,
- 0xe5, 0x05, 0x3f, 0x3c, 0xc7, 0x0f, 0xa0, 0x3d, 0x2a, 0xdf, 0x7f, 0xbe,
- 0x66, 0x43, 0xfb, 0x3d, 0xad, 0xe9, 0xa1, 0x3e, 0x03, 0xe7, 0xc9, 0x3e,
- 0xae, 0x67, 0xe5, 0xbe, 0x48, 0xcf, 0x6a, 0x3e, 0xa6, 0x6d, 0x3b, 0x3e,
- 0x86, 0x37, 0xf3, 0x3e, 0xb7, 0x11, 0xe9, 0xbd, 0xc0, 0xec, 0x1e, 0xbe,
- 0xb9, 0xf6, 0xfa, 0xbd, 0x3d, 0xa6, 0x0c, 0x3d, 0xc8, 0x88, 0xd0, 0x3a,
- 0xb2, 0xe4, 0xae, 0xbd, 0x1d, 0x82, 0xe1, 0x3d, 0x18, 0x19, 0x2a, 0xbe,
- 0x7a, 0xbd, 0x1a, 0x3e, 0x6b, 0x78, 0xa2, 0xbd, 0x2c, 0xf8, 0x64, 0xbd,
- 0xe1, 0x44, 0x1a, 0xbf, 0xe4, 0x8c, 0xc3, 0x3e, 0x11, 0x71, 0x03, 0xbe,
- 0x36, 0xb0, 0x84, 0xbe, 0x7c, 0xf4, 0xdb, 0x3d, 0xc7, 0x22, 0x81, 0x3d,
- 0x1d, 0x81, 0x01, 0xbe, 0x89, 0xdd, 0x08, 0xbf, 0x6d, 0x2a, 0x46, 0xbe,
- 0x96, 0xa6, 0xa0, 0x3e, 0x52, 0xac, 0x0c, 0xbf, 0xe3, 0xc2, 0x62, 0x3e,
- 0x76, 0x1d, 0xd2, 0x3d, 0x26, 0x3d, 0x03, 0x3f, 0x04, 0xf5, 0x55, 0xbd,
- 0x5f, 0xf3, 0xbd, 0xbe, 0xc9, 0x59, 0xcb, 0xbd, 0xf3, 0x93, 0xfb, 0xbe,
- 0x15, 0xb1, 0x5c, 0xbe, 0xb4, 0x4a, 0xfa, 0x3e, 0x9c, 0xd1, 0x3a, 0x3b,
- 0xd0, 0x31, 0xd9, 0x3c, 0xbb, 0x72, 0xfc, 0x3e, 0x7e, 0xdc, 0xf5, 0xbc,
- 0x8a, 0x14, 0xf3, 0x3b, 0x17, 0x09, 0x01, 0xbf, 0xd6, 0xda, 0xb6, 0xbe,
- 0x3f, 0xd1, 0x60, 0x3e, 0x82, 0x51, 0x22, 0xbe, 0x1c, 0x83, 0xe3, 0xbd,
- 0xba, 0x99, 0x92, 0x3d, 0x10, 0x18, 0xef, 0xbe, 0xa0, 0x8b, 0xa2, 0xbc,
- 0x65, 0xd1, 0xf7, 0xbe, 0xdb, 0x78, 0x8e, 0x3e, 0x4e, 0xad, 0x82, 0x3e,
- 0xe9, 0xfc, 0x52, 0x3e, 0x78, 0x62, 0xe9, 0x3d, 0x07, 0x92, 0x5b, 0xbd,
- 0x77, 0xab, 0x58, 0x3e, 0xd9, 0xe6, 0x1c, 0xbc, 0xf6, 0x6b, 0x08, 0x3e,
- 0x04, 0x3d, 0xa7, 0xbd, 0x33, 0xbe, 0x41, 0xbc, 0x60, 0x5a, 0x00, 0xbe,
- 0xf1, 0x81, 0x8e, 0xbe, 0xd7, 0xa5, 0x33, 0xbe, 0xbc, 0x30, 0x0f, 0x3d,
- 0x31, 0x49, 0xf2, 0x3c, 0x40, 0x1b, 0xc4, 0xbd, 0xc6, 0x0d, 0xbe, 0xbe,
- 0x9f, 0x39, 0xfb, 0x3d, 0x33, 0xa3, 0xbe, 0xbe, 0xc3, 0x65, 0x98, 0x3e,
- 0xe2, 0xb0, 0x95, 0xbe, 0xfb, 0x88, 0x0d, 0x3e, 0x77, 0x19, 0xeb, 0x3d,
- 0x12, 0xff, 0x1a, 0x3e, 0x68, 0x17, 0x48, 0x3c, 0xb3, 0x1b, 0xc1, 0xbd,
- 0x5f, 0x0b, 0x1f, 0xbf, 0xbf, 0x29, 0x36, 0xbe, 0xd6, 0xe1, 0x66, 0xbe,
- 0xa0, 0x2b, 0x2c, 0xbc, 0x48, 0x3f, 0xf7, 0xbd, 0x83, 0x13, 0x53, 0x3e,
- 0x5f, 0x8b, 0xa3, 0xbe, 0xfb, 0x43, 0xe9, 0x3d, 0xed, 0x00, 0xf0, 0x3d,
- 0xa3, 0x3f, 0x17, 0x3e, 0x33, 0xdd, 0xb9, 0x3c, 0xd4, 0x55, 0x45, 0xbe,
- 0x45, 0x38, 0x1f, 0xbf, 0xce, 0x34, 0x62, 0xbe, 0x6d, 0x4f, 0x58, 0xbe,
- 0x8b, 0x88, 0x14, 0x3e, 0xf3, 0x2e, 0xa7, 0xbd, 0x55, 0xcb, 0x75, 0x3e,
- 0x6c, 0x40, 0x1e, 0xbd, 0x8a, 0xf9, 0xb8, 0xbe, 0xb3, 0xb7, 0x3c, 0xbd,
- 0xe8, 0x18, 0xd1, 0x3d, 0x5e, 0x8d, 0x04, 0xbe, 0x7e, 0x6e, 0x8c, 0xbc,
- 0x2b, 0x23, 0x7a, 0xbe, 0x4f, 0xc3, 0x51, 0xbd, 0x10, 0xd3, 0x8c, 0x3e,
- 0x21, 0xb8, 0x80, 0xbd, 0x08, 0x1c, 0x1b, 0xbf, 0x57, 0x54, 0x8a, 0xbc,
- 0x7d, 0x3b, 0xd0, 0x3d, 0xc4, 0x23, 0x49, 0x3e, 0x52, 0x24, 0xbb, 0xbe,
- 0x21, 0x49, 0x34, 0xbe, 0x4b, 0x10, 0x74, 0xbe, 0x5a, 0xd4, 0x83, 0xbd,
- 0x06, 0x30, 0xb4, 0xbc, 0x1a, 0x96, 0x60, 0x3e, 0xf2, 0xa0, 0x12, 0x3e,
- 0x10, 0xf5, 0xb3, 0x3c, 0x6b, 0x57, 0x1b, 0x3e, 0xee, 0x4e, 0x04, 0xbf,
- 0x42, 0x7e, 0x99, 0xbe, 0x52, 0x8d, 0x9c, 0xbb, 0xb8, 0xe5, 0xc4, 0xbe,
- 0xe1, 0x82, 0xa4, 0xbe, 0x66, 0xd5, 0x89, 0xbe, 0x1e, 0xb0, 0xa9, 0x3c,
- 0xfd, 0x67, 0x4a, 0xbe, 0x5b, 0xd7, 0x85, 0x3e, 0x29, 0x56, 0x81, 0x3e,
- 0x28, 0x3e, 0x0b, 0x3e, 0xdc, 0xb3, 0x84, 0x3e, 0xd8, 0xea, 0xa8, 0x3d,
- 0xfd, 0xa7, 0xf2, 0x3d, 0x41, 0xfc, 0x39, 0xbd, 0x0c, 0x66, 0xcc, 0xbe,
- 0x24, 0x9f, 0xc8, 0xbe, 0x1d, 0x37, 0xd7, 0x3c, 0x33, 0x2b, 0xdf, 0x3e,
- 0xac, 0xfd, 0xdd, 0xbe, 0xcd, 0x8d, 0x15, 0xbd, 0x42, 0x5c, 0x52, 0x3e,
- 0x79, 0x98, 0x15, 0x3e, 0x46, 0x3c, 0x77, 0x3e, 0x92, 0x2d, 0xd4, 0x3d,
- 0x1e, 0x50, 0x30, 0xbf, 0x86, 0x2d, 0x99, 0xbe, 0xe9, 0x99, 0x74, 0xbd,
- 0xe1, 0xdc, 0xb9, 0xbd, 0xe8, 0x0e, 0x94, 0x3d, 0x69, 0x4c, 0x88, 0xbe,
- 0x8a, 0x1f, 0xdb, 0x3d, 0x54, 0xcd, 0x7b, 0xbd, 0xee, 0x6c, 0x20, 0x3f,
- 0xa1, 0x17, 0xa5, 0x3e, 0xf5, 0x49, 0xb9, 0x3d, 0xc7, 0x5c, 0x98, 0x3d,
- 0x57, 0x56, 0xe0, 0xbd, 0xca, 0x1c, 0x92, 0xbe, 0x00, 0x89, 0x24, 0xbe,
- 0xc9, 0x57, 0xad, 0x3e, 0xbe, 0x10, 0x9f, 0xbe, 0x93, 0x29, 0x10, 0xbd,
- 0x37, 0xd8, 0x58, 0x3d, 0xa5, 0xbf, 0x11, 0xbf, 0x3d, 0x89, 0xc6, 0xbe,
- 0x68, 0xcf, 0x9d, 0x3e, 0xea, 0x5e, 0x89, 0xbe, 0xea, 0x4a, 0x8c, 0x3c,
- 0x38, 0xcb, 0xc4, 0xbe, 0xc7, 0xea, 0x2c, 0x3e, 0x3a, 0x0f, 0xb0, 0xbe,
- 0x72, 0x66, 0x12, 0xbe, 0xdb, 0x79, 0x2e, 0xbd, 0xf2, 0x42, 0x8c, 0xbe,
- 0xd7, 0x1a, 0x2e, 0xbe, 0xa5, 0x8f, 0x8a, 0x3d, 0x2d, 0x31, 0xcf, 0x3e,
- 0x92, 0x0f, 0xa1, 0xbe, 0xe4, 0xb3, 0xd3, 0x3d, 0x1c, 0x6c, 0x6a, 0x3d,
- 0xa4, 0x60, 0x63, 0x3d, 0xd6, 0xbc, 0xfe, 0xbd, 0xbf, 0xb2, 0xd4, 0x3d,
- 0x15, 0x48, 0xb5, 0x3d, 0x3c, 0x2c, 0x85, 0xbe, 0x4d, 0x5f, 0xd4, 0x3e,
- 0xe0, 0x5f, 0xf7, 0xbe, 0x1d, 0x88, 0xed, 0x3d, 0xcb, 0xb0, 0xca, 0x3d,
- 0x22, 0x0a, 0xfc, 0xbe, 0xa8, 0xa0, 0x58, 0x3e, 0x4a, 0xc7, 0x04, 0x3f,
- 0xb3, 0x04, 0xed, 0xbd, 0xd3, 0xcc, 0xf7, 0xbe, 0x8f, 0x14, 0x5e, 0xbe,
- 0xdc, 0x89, 0x14, 0xbe, 0x6b, 0xe1, 0xbd, 0xbe, 0x3e, 0x99, 0x36, 0xbe,
- 0xe0, 0x21, 0x8b, 0x3e, 0xf4, 0x91, 0xaf, 0x3d, 0x3b, 0x89, 0x85, 0xbe,
- 0x6e, 0x01, 0x13, 0x3e, 0x41, 0xec, 0x5c, 0x3d, 0x57, 0x13, 0xa7, 0x3d,
- 0xe9, 0xf0, 0x02, 0xbe, 0x9b, 0xa2, 0xe7, 0xbe, 0x0b, 0x6c, 0x66, 0xbe,
- 0xcb, 0x12, 0xf7, 0xbc, 0xc7, 0x62, 0x41, 0x3e, 0xd7, 0xba, 0x3a, 0xbd,
- 0x68, 0x9d, 0xbb, 0xbe, 0x0c, 0x49, 0x60, 0xbe, 0xc4, 0x92, 0x81, 0xbe,
- 0xc2, 0x39, 0x62, 0xbe, 0x25, 0x90, 0xde, 0xbe, 0x19, 0x85, 0xfc, 0xbd,
- 0xda, 0x67, 0xf2, 0xba, 0x35, 0x53, 0xc5, 0x3e, 0x1d, 0xbb, 0xa9, 0xbe,
- 0x43, 0xbe, 0xf5, 0xbe, 0xdb, 0xdb, 0xba, 0x3d, 0x3b, 0x08, 0xb0, 0x3e,
- 0x06, 0xc2, 0x71, 0x3e, 0xf0, 0xab, 0x74, 0x3e, 0xef, 0x03, 0xbf, 0xbe,
- 0xe2, 0x1b, 0x03, 0xbb, 0x2b, 0x8a, 0x83, 0x3e, 0xc4, 0xd8, 0x9a, 0xbe,
- 0x61, 0xa9, 0x1c, 0xbe, 0x8a, 0x08, 0x16, 0x3f, 0x58, 0x0a, 0x11, 0xbf,
- 0x40, 0x2d, 0xbf, 0x3e, 0xc8, 0x52, 0xda, 0x3d, 0x6e, 0xe9, 0xcd, 0x3d,
- 0xa6, 0xe0, 0x6c, 0xbe, 0x31, 0x1a, 0x36, 0x3c, 0xe8, 0x8d, 0xb4, 0xbe,
- 0x54, 0xf4, 0xfe, 0xbd, 0x75, 0x5e, 0xe0, 0xbe, 0x9a, 0x5b, 0xb0, 0x3c,
- 0x70, 0x6f, 0x60, 0x3e, 0xcf, 0x44, 0xd7, 0x3c, 0x92, 0xf1, 0xad, 0x3e,
- 0x81, 0xdc, 0x59, 0xbe, 0x5c, 0x95, 0x3d, 0xbe, 0x6e, 0xdf, 0x2c, 0x3e,
- 0xd4, 0xcc, 0xac, 0x3d, 0xf3, 0x10, 0x95, 0x3c, 0x33, 0x8b, 0x26, 0x3e,
- 0x4c, 0xd7, 0x7d, 0xbe, 0x7e, 0x9d, 0x3e, 0x3e, 0x0b, 0xba, 0xa5, 0xbd,
- 0x4b, 0x89, 0x42, 0xbc, 0x38, 0x58, 0x1b, 0x3f, 0x0d, 0x2b, 0xf3, 0x3d,
- 0xda, 0x9c, 0x71, 0x3e, 0xd6, 0xbe, 0xd6, 0xbe, 0x1f, 0x72, 0x3f, 0xbf,
- 0x10, 0x30, 0x51, 0x3e, 0xd5, 0xf8, 0x90, 0xbd, 0xf6, 0x00, 0x02, 0x3f,
- 0x45, 0xc2, 0xb0, 0x3d, 0xde, 0xd4, 0x40, 0x3e, 0x74, 0x36, 0x72, 0xbe,
- 0x42, 0x39, 0xea, 0xbd, 0xc1, 0xdd, 0x7d, 0x3e, 0x42, 0x53, 0xbb, 0xbc,
- 0xfc, 0xcf, 0xe3, 0x3e, 0x79, 0xcc, 0xdc, 0x3c, 0x47, 0xa0, 0xb5, 0x3e,
- 0x65, 0xe8, 0x59, 0x3b, 0xd1, 0x94, 0x4e, 0xbe, 0x90, 0xce, 0x89, 0xbe,
- 0x69, 0xac, 0x8f, 0x3d, 0xa7, 0xc7, 0x41, 0xbf, 0x60, 0xe5, 0x4e, 0x3e,
- 0xfe, 0x22, 0x03, 0xbe, 0xfb, 0xac, 0xa4, 0xbe, 0x60, 0x4e, 0xcb, 0x3b,
- 0xb1, 0x90, 0x2e, 0x3e, 0x11, 0x72, 0xe3, 0x3d, 0x27, 0xfb, 0xb9, 0xbe,
- 0x57, 0x59, 0xac, 0xbe, 0x1f, 0xeb, 0x01, 0xbf, 0x26, 0x41, 0xab, 0x3e,
- 0x04, 0x28, 0xe7, 0xbe, 0x03, 0x3e, 0x8a, 0xbe, 0x36, 0x3c, 0x37, 0xbe,
- 0xb9, 0x5a, 0xba, 0xbd, 0x07, 0xdd, 0x07, 0xbf, 0xc4, 0xf5, 0x86, 0xbe,
- 0x14, 0x04, 0x23, 0x3e, 0x55, 0xb6, 0x29, 0xbe, 0x8a, 0xee, 0x7c, 0xbe,
- 0x85, 0x68, 0xe8, 0xbd, 0x76, 0x49, 0x39, 0x3e, 0xc6, 0x0f, 0x6f, 0x3e,
- 0x08, 0x81, 0xc1, 0xbe, 0xbf, 0xf2, 0x97, 0xbe, 0x0f, 0x22, 0x3a, 0xbf,
- 0x84, 0x37, 0xb8, 0x3e, 0x4c, 0x7e, 0x0c, 0x3f, 0x9e, 0x9c, 0x30, 0xbe,
- 0x6e, 0xde, 0x6f, 0x3e, 0x57, 0x24, 0x96, 0x3e, 0xc3, 0xdd, 0x90, 0x3d,
- 0x33, 0x61, 0x94, 0xbe, 0x85, 0x63, 0xec, 0x3c, 0xaa, 0x90, 0xd2, 0x3e,
- 0xd0, 0xf9, 0xf4, 0xbd, 0x06, 0x57, 0x3e, 0xbe, 0xab, 0x7b, 0x78, 0x3e,
- 0xa0, 0xf2, 0x88, 0x3e, 0x12, 0x99, 0xe3, 0xbe, 0x8a, 0x69, 0xfe, 0xbc,
- 0xf6, 0x47, 0x30, 0xbf, 0x7b, 0xdc, 0x69, 0x3e, 0xb2, 0xa3, 0xa6, 0xbd,
- 0x6a, 0xb7, 0x71, 0x3c, 0xd2, 0x18, 0x2a, 0xbe, 0xe3, 0x04, 0x35, 0x3e,
- 0xb4, 0x6b, 0xb2, 0x3e, 0x5d, 0x4f, 0xcf, 0x3d, 0xa4, 0x41, 0xa3, 0xbe,
- 0x19, 0x46, 0x84, 0x3e, 0x9e, 0x1a, 0x81, 0xbe, 0x3a, 0x72, 0x18, 0x3e,
- 0x83, 0x2c, 0x23, 0xbe, 0x92, 0xec, 0xae, 0x3e, 0xc6, 0xe0, 0x6a, 0xbe,
- 0xe9, 0x9e, 0xb5, 0x3e, 0x8e, 0xf8, 0x6c, 0xbd, 0x78, 0xe1, 0x4f, 0x3d,
- 0xd3, 0x6c, 0x4c, 0xbf, 0x10, 0x65, 0xe8, 0x3e, 0x4a, 0x56, 0x05, 0x3f,
- 0xf7, 0x1e, 0x27, 0xbe, 0x16, 0x13, 0x2a, 0x3e, 0xeb, 0x91, 0x2b, 0x3f,
- 0xf1, 0x8e, 0x60, 0xbe, 0xf8, 0xec, 0x11, 0x3f, 0xe3, 0xc7, 0x0e, 0x3e,
- 0xf8, 0x0a, 0xad, 0xbd, 0x11, 0x0e, 0x98, 0x3e, 0x04, 0x65, 0x42, 0x3e,
- 0xa8, 0x82, 0x24, 0x3f, 0xa8, 0x72, 0x2d, 0xbd, 0x79, 0x8b, 0xf7, 0xbd,
- 0x22, 0x92, 0x3c, 0xbf, 0x4a, 0x31, 0xfa, 0xbe, 0x96, 0x98, 0x1b, 0x3f,
- 0x0e, 0x6b, 0x6a, 0xbe, 0xe0, 0x62, 0xfd, 0xbd, 0x06, 0x70, 0x5d, 0xbe,
- 0xd4, 0x1a, 0x0d, 0xbe, 0x0c, 0xa3, 0x26, 0xbd, 0x7d, 0x3b, 0x22, 0xbe,
- 0xec, 0x04, 0x7e, 0xbe, 0x71, 0x19, 0x0a, 0xbe, 0xea, 0xd4, 0x17, 0x3e,
- 0xbd, 0x1f, 0xd6, 0xbc, 0x3a, 0xbf, 0x80, 0x3e, 0x5d, 0x86, 0xdf, 0x3e,
- 0x85, 0x74, 0x12, 0x3f, 0x0a, 0x01, 0x3e, 0x3e, 0xc2, 0xd6, 0xdc, 0x3d,
- 0x3e, 0xad, 0x28, 0x3e, 0x5a, 0x8f, 0xf3, 0x3e, 0x96, 0x8c, 0xd8, 0xbe,
- 0x8d, 0x1e, 0x06, 0xbe, 0x3f, 0x4a, 0x2c, 0xbe, 0x6d, 0x54, 0x18, 0x3d,
- 0x66, 0xd6, 0xaa, 0x3d, 0x61, 0x7f, 0x8e, 0xbe, 0x01, 0xef, 0xd3, 0xbe,
- 0xff, 0xec, 0xe9, 0xbb, 0x25, 0x2f, 0x41, 0xbf, 0x5a, 0xd7, 0xb5, 0xbe,
- 0x2b, 0xa1, 0x9e, 0xbe, 0x1c, 0x79, 0xcd, 0x3d, 0x98, 0x71, 0xee, 0x3d,
- 0xd9, 0xe9, 0x8c, 0x3e, 0xfd, 0x69, 0xab, 0xbd, 0x84, 0x91, 0x5d, 0xbf,
- 0xfb, 0x62, 0xa0, 0xbe, 0x83, 0x17, 0xff, 0xbd, 0xb0, 0x5a, 0x5e, 0xbe,
- 0xfb, 0xeb, 0x24, 0x3e, 0x70, 0xa7, 0x5c, 0xbe, 0x5c, 0xb6, 0x8b, 0xbe,
- 0xcc, 0xab, 0xb7, 0xbe, 0x3f, 0x48, 0xfb, 0xbe, 0x99, 0x68, 0x79, 0xbd,
- 0x0e, 0xc5, 0x94, 0x3d, 0x92, 0x1f, 0x4c, 0xbf, 0xf3, 0x31, 0xa4, 0xbe,
- 0xb7, 0x6e, 0x1b, 0xbb, 0x95, 0x69, 0xe7, 0xbe, 0x07, 0xbd, 0xb2, 0xbd,
- 0xca, 0x60, 0x93, 0xbe, 0xb4, 0xf6, 0x16, 0xbf, 0xfd, 0x5b, 0x54, 0xbf,
- 0x3f, 0x1c, 0x84, 0xbe, 0x7b, 0xf3, 0x80, 0x3d, 0xf1, 0x5d, 0x5f, 0xbe,
- 0x72, 0x3d, 0x75, 0x3e, 0xaf, 0x07, 0x1a, 0xbe, 0x20, 0x59, 0xb2, 0x3c,
- 0xfa, 0x4a, 0xdf, 0xbd, 0xfa, 0xe2, 0xa8, 0x3d, 0x7d, 0xbc, 0x4f, 0x3e,
- 0xa6, 0xd4, 0x22, 0x3e, 0x34, 0x81, 0x80, 0xbe, 0x53, 0x91, 0x6d, 0x3e,
- 0x13, 0x19, 0xa2, 0x3d, 0xc8, 0xc1, 0x9d, 0xbe, 0xb2, 0xea, 0x8b, 0xbc,
- 0x69, 0x93, 0x2f, 0x3d, 0xf5, 0x5e, 0x94, 0xbe, 0xe6, 0xcd, 0x4e, 0x3e,
- 0x3f, 0xe5, 0x56, 0x3e, 0xda, 0xed, 0x47, 0xbd, 0x5e, 0xe9, 0x9d, 0xbd,
- 0x15, 0x24, 0xf5, 0xbe, 0xbc, 0x21, 0x41, 0xbf, 0x7a, 0x69, 0x0f, 0x3e,
- 0x6f, 0xcb, 0x08, 0xbe, 0x94, 0x50, 0xe8, 0x3d, 0xf7, 0x24, 0xb6, 0x3e,
- 0xc4, 0x40, 0x22, 0xbd, 0xd6, 0x2c, 0x07, 0x3e, 0xc0, 0xcb, 0x65, 0xbe,
- 0x66, 0x3b, 0xae, 0x3d, 0x9c, 0x20, 0x6a, 0xbc, 0x41, 0x24, 0xcc, 0xbc,
- 0x6a, 0xe6, 0x7d, 0x3e, 0x58, 0x48, 0xad, 0xbe, 0x0e, 0xfd, 0x68, 0xbe,
- 0xb0, 0x09, 0x8c, 0xbe, 0xd3, 0x96, 0xed, 0xbe, 0xeb, 0x20, 0xbf, 0xbe,
- 0xbe, 0x60, 0x42, 0xbd, 0xb1, 0x1c, 0xcc, 0xbd, 0xef, 0x8f, 0x10, 0xbf,
- 0x50, 0xfe, 0x85, 0x3e, 0xe0, 0x3f, 0x3e, 0xbe, 0x99, 0xbf, 0x83, 0x3e,
- 0x51, 0x4e, 0x4a, 0x3d, 0xbf, 0xa1, 0x5a, 0xbe, 0x1a, 0x47, 0xb7, 0xbd,
- 0x56, 0x59, 0x1f, 0xbe, 0xfb, 0x45, 0x93, 0x3d, 0xba, 0xac, 0xf3, 0xbe,
- 0xcf, 0x42, 0x14, 0x3d, 0x27, 0xcd, 0x91, 0xbd, 0x55, 0x96, 0xf9, 0x3d,
- 0xef, 0x83, 0x28, 0xbe, 0x22, 0x61, 0x57, 0x3e, 0xc9, 0x74, 0x57, 0xbd,
- 0x9e, 0x36, 0xdd, 0xbe, 0x86, 0x27, 0x21, 0xbe, 0x2a, 0x2c, 0x11, 0xbe,
- 0x77, 0xe5, 0x35, 0x3d, 0xe5, 0x5a, 0x13, 0xbf, 0x1e, 0x27, 0x87, 0x3e,
- 0x31, 0x31, 0x21, 0xbf, 0xa2, 0x72, 0x14, 0xbf, 0x6d, 0xd2, 0x13, 0x3a,
- 0xf2, 0x1f, 0x3f, 0x3d, 0x42, 0x88, 0x8b, 0xbe, 0xcb, 0x06, 0xb4, 0xbe,
- 0xe9, 0x85, 0x6e, 0x3e, 0x88, 0xc6, 0x97, 0xbe, 0x67, 0xd7, 0x24, 0x3e,
- 0x55, 0x90, 0xed, 0xbc, 0x55, 0x41, 0x62, 0x3d, 0xf7, 0x47, 0x42, 0xbe,
- 0xb3, 0x6c, 0x01, 0x3e, 0xce, 0x72, 0x13, 0xbe, 0x8c, 0x17, 0x84, 0xbe,
- 0xc0, 0x58, 0x5c, 0x3d, 0xe4, 0x48, 0x4a, 0x3e, 0xad, 0x4d, 0x31, 0x3e,
- 0xe0, 0xe9, 0xe4, 0x3d, 0x34, 0xa6, 0x1c, 0x3e, 0x0f, 0xe5, 0xf1, 0xbe,
- 0xe9, 0xf9, 0xa9, 0xbe, 0x51, 0x31, 0x6e, 0xbe, 0xdc, 0x5c, 0xc1, 0xbe,
- 0xc1, 0x22, 0x1c, 0xbd, 0x4d, 0x76, 0xde, 0xbe, 0xe1, 0xca, 0xcf, 0x3d,
- 0x03, 0x38, 0x85, 0x3e, 0xb1, 0xf7, 0xf5, 0xbe, 0xe1, 0x0e, 0xa3, 0xbc,
- 0x70, 0x1c, 0x47, 0x3c, 0x92, 0xff, 0x62, 0xbd, 0xce, 0x75, 0x63, 0xbc,
- 0xcd, 0x6d, 0x9d, 0xbc, 0xfe, 0x6b, 0x0d, 0xbf, 0xe0, 0x8f, 0xc8, 0xbe,
- 0xe0, 0x72, 0x96, 0xbe, 0x02, 0x98, 0xbb, 0x3e, 0x0a, 0x1d, 0x7d, 0x3e,
- 0x7b, 0x28, 0x89, 0xbd, 0x83, 0x15, 0x57, 0xbd, 0xe2, 0xe1, 0x22, 0x3e,
- 0xf8, 0xd9, 0x33, 0x3d, 0x73, 0x0c, 0x39, 0x3d, 0xa6, 0xa0, 0xfd, 0xbe,
- 0xd3, 0xf7, 0xcc, 0xbe, 0x60, 0x08, 0x00, 0x3e, 0xb7, 0xb1, 0xa5, 0x3d,
- 0xb0, 0x72, 0x27, 0xbd, 0x6d, 0x90, 0xeb, 0xbd, 0x7a, 0x4a, 0x20, 0xbe,
- 0xf2, 0xba, 0x0a, 0x3e, 0xa0, 0x26, 0xf2, 0xbd, 0x0f, 0xf7, 0x63, 0xbe,
- 0x1a, 0xe0, 0x1a, 0xbf, 0xf3, 0x00, 0xa4, 0xbe, 0x01, 0x8d, 0xa4, 0x3d,
- 0x16, 0x8c, 0x3c, 0x3d, 0x47, 0x24, 0x74, 0x3e, 0x11, 0x3f, 0x1a, 0xbe,
- 0xd7, 0xa2, 0x1e, 0xbd, 0x13, 0x0c, 0x42, 0x3e, 0xc5, 0xe8, 0x21, 0x3e,
- 0xd3, 0xc5, 0xa2, 0x3e, 0xa9, 0x65, 0xb1, 0xbe, 0x45, 0x64, 0x1f, 0xbe,
- 0x6f, 0xd9, 0x41, 0x3c, 0x9a, 0x46, 0x95, 0x3e, 0xb6, 0x11, 0xb8, 0x3d,
- 0xd3, 0x4b, 0x98, 0xbe, 0xa8, 0x4f, 0x67, 0xbb, 0x32, 0xc0, 0x84, 0x3d,
- 0x6a, 0x42, 0xb4, 0x3e, 0x66, 0x54, 0xa3, 0x3d, 0xde, 0x33, 0xf2, 0xbe,
- 0x87, 0xb7, 0x39, 0xbe, 0xff, 0x95, 0xd8, 0xbd, 0xd2, 0xe6, 0xc8, 0xbc,
- 0xa0, 0x82, 0x30, 0x3d, 0x92, 0x45, 0x2f, 0x3e, 0xa5, 0xee, 0xd3, 0xbc,
- 0x7b, 0x60, 0xba, 0x3d, 0x6c, 0xed, 0x64, 0xbe, 0xc1, 0x85, 0x9e, 0xbc,
- 0x88, 0xe2, 0x06, 0x3e, 0xc7, 0xe5, 0xb4, 0x3d, 0x3a, 0xaa, 0x90, 0xbe,
- 0x7e, 0x6d, 0xd2, 0x3d, 0xd6, 0xbf, 0x19, 0xbe, 0x86, 0x46, 0x97, 0xbe,
- 0x33, 0x18, 0x07, 0xbc, 0xa5, 0x5c, 0xfc, 0xbd, 0x4c, 0xc1, 0xe4, 0xbe,
- 0xef, 0x06, 0x09, 0xbe, 0x09, 0x0a, 0x73, 0x3d, 0xdb, 0x2f, 0x10, 0xbe,
- 0x2d, 0x3b, 0x89, 0xbe, 0xb1, 0x70, 0x9a, 0x3c, 0xb5, 0xda, 0xfc, 0xbe,
- 0x36, 0x4d, 0x8d, 0xbd, 0x89, 0x78, 0xb8, 0xbe, 0xe5, 0xf9, 0xac, 0xbe,
- 0xaf, 0x5f, 0xa3, 0xbe, 0x59, 0x16, 0x9b, 0xbe, 0x7f, 0x39, 0xfb, 0xbd,
- 0x33, 0xb9, 0x97, 0xbd, 0x8b, 0xcf, 0x9c, 0xbe, 0x7a, 0x8b, 0x0e, 0x3e,
- 0x8f, 0xf9, 0x77, 0xbe, 0x49, 0x98, 0xcf, 0x3d, 0xc5, 0xd7, 0xc6, 0x3d,
- 0x61, 0x35, 0xa2, 0xbd, 0xaf, 0xef, 0x03, 0xbe, 0x7a, 0x0a, 0x1c, 0x3d,
- 0xcf, 0x7a, 0xfc, 0xbe, 0xc6, 0x70, 0xb8, 0x3d, 0x58, 0x7f, 0x14, 0x3e,
- 0x06, 0xda, 0x57, 0x3e, 0x8c, 0xea, 0xe2, 0x3d, 0x6f, 0x83, 0xde, 0xbe,
- 0xa0, 0xa6, 0x03, 0xbf, 0x54, 0x52, 0xf4, 0x3d, 0x7b, 0x61, 0x75, 0x3d,
- 0x81, 0xbc, 0x04, 0x3d, 0x1a, 0x08, 0xc2, 0xbe, 0xf4, 0xdb, 0xa6, 0xbc,
- 0x64, 0xeb, 0x19, 0xbf, 0x98, 0xe3, 0x71, 0x3e, 0x9a, 0x5a, 0xd9, 0x3d,
- 0x44, 0xbc, 0x03, 0x3d, 0x52, 0x4d, 0x19, 0x3e, 0x73, 0xf1, 0x4e, 0x3e,
- 0x77, 0x34, 0x11, 0x3e, 0x37, 0x75, 0xab, 0xbb, 0x81, 0x43, 0xb1, 0xbc,
- 0xae, 0x9b, 0xd4, 0x3c, 0xf1, 0x28, 0x61, 0xbd, 0x77, 0x9a, 0x8b, 0xbd,
- 0x7a, 0x16, 0xde, 0xbe, 0x26, 0x83, 0xbb, 0xbd, 0x70, 0x49, 0x2d, 0xbe,
- 0x3e, 0x05, 0xf4, 0xbc, 0x9b, 0x60, 0xea, 0x3e, 0x54, 0xf6, 0x87, 0x3d,
- 0x01, 0x1e, 0x81, 0xbc, 0xf4, 0x0f, 0xb6, 0xbd, 0xf3, 0xc3, 0x3b, 0x3e,
- 0x16, 0xac, 0x0c, 0xbc, 0x2f, 0x83, 0x67, 0x3e, 0xba, 0xf9, 0x0e, 0x3d,
- 0x39, 0x00, 0x43, 0xbb, 0x8b, 0x9d, 0x9f, 0x3b, 0x60, 0xbe, 0x55, 0xbe,
- 0x2e, 0x53, 0xbf, 0x3e, 0x66, 0x21, 0xcf, 0xbd, 0x01, 0x17, 0xc0, 0x3e,
- 0x01, 0xc6, 0x30, 0x3d, 0x12, 0xbe, 0xb5, 0xbe, 0x4e, 0xd6, 0xf2, 0x3e,
- 0x17, 0x58, 0x34, 0xbf, 0xaf, 0x49, 0x1d, 0xbe, 0x62, 0x0f, 0x1a, 0xbe,
- 0xbf, 0x9a, 0x3b, 0x3d, 0x6e, 0x19, 0x5c, 0x3d, 0xea, 0xc6, 0x55, 0xbe,
- 0x29, 0x4c, 0x48, 0xbe, 0x2d, 0x9e, 0x89, 0xbc, 0xff, 0x5f, 0x4f, 0xbe,
- 0xc6, 0x97, 0xa2, 0x3e, 0xcb, 0x44, 0xbe, 0x3e, 0x60, 0xe6, 0x75, 0x3e,
- 0xa4, 0xda, 0x0f, 0xbd, 0xc8, 0x34, 0xac, 0x3e, 0xbf, 0xdb, 0x0b, 0x3c,
- 0xb5, 0xab, 0xc2, 0x3e, 0x39, 0x25, 0x37, 0x3e, 0xfe, 0xee, 0x03, 0xbe,
- 0x09, 0xfb, 0x3f, 0xbe, 0xb2, 0x2c, 0xb0, 0x3e, 0xdf, 0xf5, 0x9d, 0xbe,
- 0x60, 0xf7, 0x96, 0x3e, 0x3b, 0x5a, 0xe0, 0x3d, 0x93, 0x58, 0x02, 0x3e,
- 0xc0, 0x6c, 0xc7, 0xbe, 0x97, 0x5f, 0x21, 0xbe, 0xeb, 0x13, 0x88, 0x3e,
- 0x27, 0x3e, 0x0b, 0x3f, 0x43, 0xa1, 0x08, 0xbe, 0x5d, 0x3c, 0xdd, 0xbe,
- 0x4c, 0xf1, 0x4c, 0xbd, 0x19, 0xb5, 0x94, 0xbe, 0x5b, 0xba, 0x83, 0xbe,
- 0xcd, 0xc5, 0xdf, 0x3d, 0x8e, 0x55, 0xe4, 0xbd, 0x03, 0xe4, 0xb7, 0x3e,
- 0xc1, 0xab, 0x86, 0xbe, 0xec, 0xe2, 0x1a, 0xbd, 0xab, 0x67, 0x3a, 0x3d,
- 0x2f, 0xc0, 0xf6, 0x3c, 0xb6, 0xa0, 0xf8, 0xbd, 0xf7, 0x58, 0x35, 0x3e,
- 0x69, 0x86, 0x91, 0xbe, 0xee, 0x90, 0xeb, 0xbe, 0x2f, 0x2d, 0xe4, 0x3c,
- 0x6d, 0x58, 0xb4, 0x3e, 0xfc, 0xa0, 0xad, 0x3e, 0x76, 0xbd, 0xa5, 0xbd,
- 0xd0, 0x1c, 0x1b, 0x3f, 0x8d, 0x63, 0x63, 0x3c, 0x72, 0xb1, 0xaa, 0x3e,
- 0x39, 0xae, 0xd1, 0xbe, 0x89, 0x44, 0x9f, 0x3c, 0x1c, 0xcf, 0xbf, 0xbd,
- 0x3e, 0x45, 0x87, 0x3c, 0x2b, 0xf3, 0x74, 0x3e, 0x12, 0x0c, 0x12, 0x3f,
- 0x9e, 0x24, 0xe5, 0xbe, 0x21, 0x93, 0xb6, 0x3e, 0x2e, 0xee, 0xba, 0xbd,
- 0x0c, 0xfc, 0x5f, 0xbd, 0x7a, 0x53, 0xb9, 0x3d, 0x72, 0x34, 0xf0, 0x3e,
- 0xa8, 0xd2, 0x52, 0xbe, 0xba, 0xdb, 0x52, 0x3d, 0x3c, 0xcf, 0x04, 0x3f,
- 0x34, 0xa6, 0x52, 0xbe, 0x5e, 0xe6, 0xb8, 0x3e, 0xde, 0x2e, 0x9b, 0x3d,
- 0xfd, 0xe6, 0x29, 0x3e, 0xc9, 0x57, 0xc3, 0x3e, 0x39, 0xda, 0x7e, 0xbe,
- 0x83, 0x26, 0xb6, 0xbd, 0xd7, 0x8a, 0x97, 0x3d, 0x7b, 0x99, 0x4d, 0xbe,
- 0xfd, 0xd5, 0x80, 0xbe, 0x9d, 0xc5, 0xed, 0x3d, 0xa8, 0xa4, 0xe6, 0xbe,
- 0x44, 0x78, 0xcc, 0xbe, 0x99, 0x45, 0xd7, 0xbd, 0x9d, 0xd1, 0x4a, 0x3e,
- 0x92, 0x70, 0xc6, 0xbd, 0xa1, 0xd7, 0x12, 0xbe, 0x1d, 0x9e, 0x6e, 0x3e,
- 0x56, 0xa0, 0xb4, 0xbe, 0xd2, 0x3e, 0x89, 0xbd, 0x21, 0x37, 0xa2, 0xbe,
- 0x16, 0x89, 0x4f, 0x3d, 0xbd, 0x35, 0xde, 0xbd, 0x06, 0x49, 0x38, 0x3c,
- 0xb4, 0x86, 0xcf, 0xbc, 0x89, 0x1e, 0xc9, 0xbd, 0x5c, 0xa2, 0x13, 0xbe,
- 0x44, 0x3b, 0xa2, 0xbd, 0xd6, 0xf9, 0xd2, 0x3d, 0x7e, 0x69, 0x15, 0x3e,
- 0xb7, 0xb1, 0x95, 0xbc, 0xa0, 0x5e, 0xc0, 0x3b, 0x59, 0xf3, 0x20, 0x3d,
- 0x49, 0x24, 0xb8, 0xbd, 0xa3, 0x22, 0x2b, 0x3e, 0xb2, 0xa9, 0x28, 0x3e,
- 0x62, 0x97, 0xa7, 0x3d, 0x17, 0x21, 0xae, 0xbd, 0x90, 0x58, 0x42, 0xbd,
- 0xf8, 0x59, 0x93, 0xbd, 0x17, 0x27, 0x14, 0x3e, 0xc0, 0xe5, 0x23, 0xbc,
- 0xe2, 0xc4, 0x81, 0x3d, 0xf0, 0x30, 0x32, 0xbd, 0xf2, 0x48, 0xb6, 0x3c,
- 0xa3, 0x6a, 0x9a, 0xbd, 0x08, 0xe5, 0x9d, 0xbd, 0x41, 0xf4, 0x26, 0xbe,
- 0xa3, 0x22, 0x16, 0x3e, 0xdd, 0x21, 0xfa, 0xbd, 0x35, 0x20, 0x15, 0x3e,
- 0x57, 0x16, 0x6d, 0x3d, 0x3b, 0x17, 0xb9, 0xbd, 0xc4, 0x74, 0xf4, 0x3d,
- 0x98, 0x7a, 0xc2, 0x3d, 0x6d, 0x7f, 0xec, 0x3d, 0xac, 0x58, 0xaa, 0xbd,
- 0xa5, 0x7f, 0xa8, 0x3d, 0xe1, 0xb9, 0x0e, 0xbe, 0x4d, 0x24, 0xb5, 0x3c,
- 0xa1, 0x3d, 0x0b, 0xbb, 0x6e, 0x90, 0x23, 0x3c, 0xa7, 0x78, 0x34, 0x3d,
- 0xb3, 0xdd, 0x02, 0x3e, 0x52, 0x12, 0x00, 0xbe, 0x2e, 0x98, 0x48, 0xbd,
- 0xe5, 0x51, 0x70, 0xbd, 0x68, 0x9a, 0xa8, 0xbd, 0x58, 0xf2, 0x32, 0x3d,
- 0x8c, 0x69, 0x0f, 0x3e, 0x8f, 0xf2, 0x18, 0xbe, 0x15, 0x18, 0xaa, 0xbb,
- 0xb2, 0xc6, 0xe4, 0xbd, 0x70, 0x46, 0xf5, 0xbc, 0x2e, 0x4d, 0x48, 0xbd,
- 0xd3, 0x8d, 0x3c, 0x3c, 0x0b, 0xcc, 0x12, 0xbe, 0x7c, 0xbe, 0xc1, 0xbd,
- 0x94, 0xf5, 0x90, 0x3d, 0x49, 0x4f, 0xad, 0x3c, 0xfd, 0x04, 0x0f, 0x3e,
- 0x88, 0x78, 0x81, 0xbc, 0x4c, 0x2a, 0x6e, 0xbd, 0xc9, 0x94, 0x9f, 0xbd,
- 0xd6, 0x0f, 0xcd, 0x3c, 0x08, 0x08, 0xd5, 0x3c, 0x25, 0x57, 0xc0, 0x3c,
- 0x34, 0x17, 0xff, 0x3d, 0xa1, 0xc8, 0xea, 0xbc, 0xc1, 0xe7, 0xbd, 0xbd,
- 0x92, 0xf8, 0x14, 0x3e, 0x98, 0xb5, 0x36, 0xbd, 0x06, 0x9d, 0x1d, 0xbe,
- 0x9a, 0x37, 0x1d, 0x3e, 0x98, 0x6b, 0xea, 0x3d, 0x5d, 0x91, 0x8e, 0x3d,
- 0xfc, 0xa2, 0xd4, 0xbd, 0x58, 0x0a, 0xa4, 0x3c, 0x72, 0xf0, 0x63, 0xbc,
- 0x22, 0xc7, 0x8f, 0xbd, 0x60, 0xb6, 0xce, 0x3d, 0xf0, 0xa7, 0x80, 0x3b,
- 0xf7, 0x09, 0x89, 0xbd, 0x20, 0x85, 0x9e, 0xbb, 0xb6, 0x19, 0xb3, 0x3d,
- 0xf8, 0x84, 0xa7, 0x3c, 0x70, 0x74, 0x27, 0x3e, 0x14, 0x43, 0x03, 0x3e,
- 0xe4, 0xf8, 0x6b, 0x3d, 0xd4, 0x3e, 0x28, 0x3d, 0x1f, 0x52, 0xc2, 0xbd,
- 0xc5, 0xfa, 0x23, 0xbe, 0x70, 0x08, 0xd1, 0xbd, 0xf1, 0xb1, 0xaf, 0xbc,
- 0x1c, 0x82, 0x81, 0x3d, 0x51, 0xcc, 0xb6, 0xbd, 0xee, 0x63, 0xb2, 0x3d,
- 0xf8, 0x0a, 0xf4, 0x3d, 0x00, 0xa9, 0x62, 0xba, 0x1d, 0x38, 0x1c, 0xbe,
- 0x07, 0x09, 0x08, 0xbe, 0x68, 0x37, 0xc9, 0xbc, 0x40, 0x23, 0x87, 0xbc,
- 0xfd, 0x4f, 0x65, 0x3c, 0x88, 0xdc, 0x85, 0x3d, 0x45, 0x5d, 0xe7, 0xbc,
- 0x09, 0x74, 0x74, 0xbd, 0x00, 0x49, 0x21, 0x3e, 0x56, 0x14, 0xda, 0xbd,
- 0x9c, 0xba, 0x13, 0xbe, 0x6e, 0x29, 0xdd, 0x3d, 0x20, 0x19, 0x4a, 0xbd,
- 0x73, 0x9d, 0xe4, 0x3d, 0x1f, 0xae, 0x10, 0xbe, 0x4a, 0xd1, 0x93, 0x3d,
- 0x1c, 0xeb, 0xdb, 0x3d, 0x7e, 0x60, 0x8b, 0x3d, 0x10, 0x9a, 0xbd, 0x3c,
- 0x80, 0xff, 0x15, 0x3e, 0x19, 0xcf, 0xdf, 0xbd, 0xc2, 0x21, 0x81, 0xbe,
- 0x34, 0x05, 0x6a, 0xbc, 0xa6, 0x82, 0x93, 0xbe, 0xac, 0x1c, 0x78, 0xbe,
- 0x8f, 0xaf, 0x1f, 0x3c, 0xf6, 0x43, 0x5d, 0xbd, 0x8d, 0x44, 0x15, 0xbe,
- 0xf2, 0xb2, 0xb1, 0xbd, 0x8f, 0x3b, 0xe6, 0x3d, 0x38, 0xec, 0x37, 0xbf,
- 0x74, 0x4d, 0x9c, 0x3e, 0xd5, 0xe2, 0x3b, 0xbe, 0xe2, 0x55, 0x10, 0xbd,
- 0x89, 0x38, 0xde, 0x3c, 0x76, 0x84, 0xc7, 0x3d, 0x38, 0xd0, 0x90, 0x3d,
- 0xc6, 0xd2, 0x7f, 0x3d, 0xad, 0x33, 0xde, 0x3d, 0x97, 0x84, 0x0f, 0x3e,
- 0x5c, 0x01, 0x1e, 0x3e, 0x44, 0x22, 0x40, 0x3e, 0x82, 0x57, 0xd6, 0xbd,
- 0x2b, 0x08, 0x35, 0xbd, 0xce, 0xca, 0xb7, 0xbd, 0x20, 0xab, 0xe2, 0xbd,
- 0xc7, 0x26, 0x86, 0xbe, 0xd7, 0x69, 0x03, 0x3c, 0xb9, 0x74, 0xea, 0x3d,
- 0xff, 0x1a, 0x0c, 0xbd, 0x3d, 0xc9, 0x87, 0xbe, 0x8e, 0x68, 0xc1, 0x3d,
- 0xa7, 0xeb, 0xfb, 0xbd, 0x4f, 0x57, 0xe4, 0x3c, 0x89, 0x23, 0x32, 0x3e,
- 0xf8, 0xa3, 0x57, 0x3e, 0x52, 0xa5, 0x61, 0xbb, 0x21, 0x7a, 0x48, 0x3e,
- 0x87, 0x50, 0x96, 0x3e, 0xae, 0xba, 0x35, 0xbd, 0x70, 0xae, 0x95, 0x3d,
- 0x6e, 0x26, 0x7d, 0x3e, 0xa9, 0xc3, 0x78, 0xbd, 0xa2, 0x7f, 0x09, 0xbf,
- 0x41, 0x2c, 0x9f, 0xbe, 0xcb, 0x04, 0xac, 0x3c, 0x20, 0x2c, 0x08, 0xbe,
- 0xf5, 0x38, 0x8c, 0xbe, 0xb2, 0x50, 0x82, 0xbe, 0x3d, 0x29, 0x13, 0x3e,
- 0x88, 0x90, 0x50, 0x3e, 0x4e, 0x5a, 0xad, 0x3d, 0x88, 0x90, 0x06, 0x3e,
- 0xab, 0x08, 0x26, 0x3e, 0x13, 0xb7, 0x16, 0x3e, 0x0e, 0x39, 0xb2, 0xbd,
- 0x69, 0x31, 0x31, 0x3e, 0x3f, 0x50, 0xc9, 0xbe, 0xfb, 0xe3, 0x58, 0x3e,
- 0xa3, 0x66, 0x8e, 0xbe, 0x1c, 0xd5, 0x59, 0xbe, 0xb0, 0xf9, 0x1e, 0x3e,
- 0xea, 0xfc, 0x9f, 0x3d, 0x7f, 0x64, 0x2f, 0x3e, 0xc6, 0x47, 0x94, 0x3e,
- 0xc7, 0xf2, 0x2e, 0x3e, 0x4b, 0x50, 0x8c, 0x3d, 0x65, 0xd5, 0x33, 0xbd,
- 0x96, 0xbc, 0xd1, 0x3d, 0xef, 0xae, 0xda, 0xbd, 0x4b, 0xcc, 0x6f, 0x3e,
- 0xe9, 0x59, 0xbb, 0x3e, 0x00, 0x9c, 0x54, 0x3c, 0x6c, 0x14, 0xdd, 0xbd,
- 0xe7, 0xd0, 0x1e, 0xbb, 0xd3, 0x37, 0xa1, 0xbe, 0x34, 0xee, 0x59, 0xbd,
- 0x4e, 0xff, 0x86, 0x3e, 0x32, 0xb9, 0x77, 0xbd, 0x59, 0x16, 0xc2, 0xbe,
- 0x6e, 0x86, 0x06, 0x3f, 0x27, 0xea, 0x14, 0xbe, 0xca, 0x74, 0x31, 0x3d,
- 0x68, 0x0f, 0xf2, 0x3d, 0x83, 0x68, 0x02, 0xbe, 0x32, 0x8b, 0x90, 0xbc,
- 0x95, 0xae, 0xb9, 0xbe, 0x31, 0x6a, 0x45, 0x3d, 0x48, 0xe7, 0xbb, 0xbe,
- 0x26, 0xb3, 0xaa, 0xbd, 0xd8, 0x63, 0xc3, 0x3e, 0x1c, 0xe9, 0x2d, 0x3e,
- 0x3f, 0x15, 0xf0, 0x3d, 0x6b, 0x13, 0xdd, 0x3d, 0xb1, 0x9d, 0x0c, 0x3e,
- 0xf2, 0xe4, 0x1d, 0xbd, 0x37, 0xe5, 0x1f, 0xbe, 0x89, 0x89, 0x30, 0x3d,
- 0x4e, 0xa4, 0x82, 0xbe, 0x77, 0xcc, 0x2f, 0x3e, 0xe9, 0xcd, 0x24, 0xbe,
- 0xf0, 0x90, 0x21, 0x3c, 0xba, 0x6f, 0xd8, 0x3b, 0x6f, 0x0a, 0x7c, 0x3e,
- 0xb5, 0x3d, 0x95, 0x3e, 0xdf, 0xde, 0x65, 0xbe, 0xb8, 0x5a, 0x15, 0x3d,
- 0x97, 0x0b, 0xe6, 0x3d, 0x0c, 0x67, 0x14, 0x3e, 0x97, 0x6a, 0x48, 0x3d,
- 0x9e, 0xa1, 0xa6, 0xbe, 0x45, 0x27, 0x8d, 0x3d, 0x0b, 0xda, 0x57, 0x3e,
- 0x10, 0x54, 0xaf, 0xbc, 0x9d, 0x21, 0xa2, 0x3e, 0x27, 0xf4, 0xf9, 0xbd,
- 0x8a, 0x53, 0x02, 0x3f, 0x51, 0x7e, 0xea, 0xbd, 0x09, 0xc4, 0x3b, 0x3e,
- 0x63, 0xe7, 0xc3, 0x3e, 0xe4, 0x2e, 0xae, 0xbc, 0xbf, 0x8b, 0xac, 0xbd,
- 0x53, 0xf0, 0xd9, 0x3d, 0x1e, 0xd0, 0xc5, 0xbd, 0x0f, 0x94, 0x9a, 0xbd,
- 0x9c, 0xaf, 0x71, 0xbd, 0xdf, 0x27, 0x58, 0xbe, 0x72, 0xcf, 0x2e, 0xbf,
- 0x16, 0x58, 0x0e, 0xbe, 0x58, 0x75, 0x16, 0x3e, 0x69, 0xbd, 0x89, 0x3d,
- 0xb2, 0x28, 0x68, 0xbd, 0x20, 0x1c, 0x7e, 0xbe, 0xa8, 0xd6, 0x14, 0xbc,
- 0xac, 0xc6, 0x0c, 0x3e, 0x8e, 0x1f, 0x56, 0xbe, 0xfb, 0xc5, 0x17, 0xbe,
- 0x0a, 0xad, 0x0b, 0xbe, 0x64, 0x56, 0x03, 0xbe, 0xcf, 0xc0, 0x7f, 0xbe,
- 0x37, 0xd2, 0x3a, 0x3e, 0x53, 0xf7, 0xa3, 0x3e, 0xe8, 0xcb, 0xc5, 0x3e,
- 0x5e, 0xc3, 0x54, 0x3d, 0xec, 0xf4, 0x4a, 0xbe, 0xb6, 0x42, 0x02, 0x3e,
- 0x6d, 0x9c, 0x47, 0x3e, 0x2d, 0x3f, 0x80, 0xbe, 0xa4, 0xea, 0xb1, 0x3e,
- 0x3f, 0x5b, 0x3d, 0xbe, 0x86, 0xc0, 0x72, 0x3d, 0xfa, 0x31, 0x5a, 0xbd,
- 0x05, 0x3b, 0xdd, 0xba, 0xaf, 0x0a, 0x1e, 0xbe, 0x61, 0x05, 0x87, 0xbe,
- 0x80, 0xdc, 0x41, 0xbd, 0x79, 0x6d, 0x92, 0x3e, 0x4f, 0x01, 0xa8, 0xbe,
- 0xdf, 0x8d, 0xd3, 0xbe, 0x54, 0xfe, 0xed, 0x3e, 0x56, 0x68, 0x92, 0xbe,
- 0x23, 0xdd, 0xae, 0x3d, 0xc3, 0x4f, 0x84, 0x3b, 0xd6, 0xb1, 0xa2, 0x3e,
- 0xcc, 0x18, 0x5b, 0xbe, 0x71, 0x3c, 0x9c, 0x3e, 0x29, 0xff, 0x84, 0xbe,
- 0xa3, 0x13, 0x09, 0x3d, 0x8d, 0xc2, 0xc1, 0xbc, 0x60, 0x9e, 0xa4, 0x3d,
- 0x73, 0x2d, 0xb8, 0xbd, 0x5a, 0x4a, 0xfa, 0xbc, 0x83, 0x90, 0x4e, 0xbd,
- 0x8d, 0x3a, 0x3e, 0xbe, 0xa5, 0xec, 0x34, 0x3d, 0x62, 0x2b, 0x85, 0x3d,
- 0x48, 0xde, 0xe4, 0xbe, 0x82, 0x44, 0x60, 0x3e, 0xb0, 0x5c, 0x06, 0xbe,
- 0xae, 0x14, 0x11, 0xbd, 0xec, 0x69, 0xa2, 0xbe, 0xce, 0x7d, 0x32, 0xbe,
- 0x88, 0x43, 0xbc, 0x3e, 0x33, 0x2e, 0xe6, 0xbd, 0x3c, 0x1f, 0x63, 0xbe,
- 0x6d, 0xcc, 0xda, 0x3d, 0xd9, 0x28, 0x04, 0x3e, 0x94, 0x31, 0x04, 0xbe,
- 0x1c, 0x06, 0x17, 0xbd, 0xe5, 0x23, 0xe4, 0x3e, 0x28, 0x54, 0xe5, 0xbe,
- 0x0c, 0x37, 0xe4, 0xbb, 0xc4, 0x4d, 0x98, 0x3d, 0x1e, 0xf1, 0x0d, 0x3e,
- 0x05, 0x8f, 0x08, 0xbe, 0x9c, 0x29, 0xe7, 0x3d, 0xa1, 0x7b, 0x16, 0xbe,
- 0x38, 0x8c, 0xda, 0x3c, 0x1d, 0x47, 0xaf, 0x3d, 0x93, 0x0a, 0x1f, 0xbf,
- 0x39, 0xe3, 0x77, 0xbe, 0xb0, 0x18, 0x7d, 0xbd, 0xc0, 0x50, 0x91, 0x3e,
- 0x3c, 0x49, 0x0e, 0xbf, 0x6e, 0x49, 0x07, 0x3e, 0x9c, 0xcd, 0x13, 0x3f,
- 0xd5, 0xd8, 0x94, 0xbe, 0x27, 0xe0, 0x11, 0x3f, 0xe7, 0x1f, 0x6d, 0xbe,
- 0x7d, 0x86, 0xea, 0xbc, 0xcc, 0x90, 0x1c, 0xbe, 0x51, 0x31, 0xbb, 0x3b,
- 0xe8, 0x88, 0xf7, 0x3e, 0xb0, 0x2a, 0xab, 0x3e, 0x88, 0x34, 0x1b, 0x3f,
- 0x01, 0x4f, 0x06, 0xbf, 0xf4, 0xdf, 0xab, 0x3e, 0xce, 0xf5, 0xd8, 0xbe,
- 0x0e, 0xf1, 0x8d, 0xbe, 0xf2, 0xac, 0x96, 0xbe, 0x0c, 0xf9, 0xab, 0xbe,
- 0xb7, 0x6d, 0x86, 0x3e, 0xf8, 0x36, 0xcd, 0x3d, 0x5a, 0x3b, 0xda, 0xbe,
- 0x6c, 0x2b, 0x3b, 0xbe, 0xdb, 0x2b, 0x9f, 0x3c, 0x20, 0x80, 0xd4, 0xbd,
- 0xa4, 0x73, 0xca, 0xbd, 0x75, 0x4b, 0x3d, 0xbe, 0x72, 0xb4, 0x4f, 0xbe,
- 0xb6, 0x7d, 0x5e, 0xbe, 0x84, 0x3a, 0xe5, 0xbe, 0x72, 0xee, 0x27, 0x3e,
- 0x03, 0x98, 0x98, 0xbe, 0x85, 0x78, 0xa0, 0xbe, 0xaa, 0x99, 0xb5, 0xbd,
- 0x81, 0x4f, 0x2a, 0xbf, 0xba, 0xe9, 0x8b, 0xbe, 0x4e, 0x73, 0x7a, 0xbe,
- 0xfa, 0x1e, 0x97, 0x3d, 0xd3, 0x81, 0x35, 0x3d, 0xc4, 0x07, 0x34, 0x3d,
- 0x16, 0xf7, 0x08, 0x3e, 0x49, 0xe6, 0x1c, 0xbf, 0x6e, 0xc2, 0x9b, 0x3d,
- 0xa2, 0x48, 0x3a, 0x3e, 0x40, 0x61, 0x9c, 0xbe, 0x23, 0x37, 0x8c, 0xbd,
- 0x5f, 0x6d, 0x12, 0x3d, 0xb5, 0x43, 0xb8, 0x3e, 0x20, 0x13, 0x1e, 0xbe,
- 0xcb, 0x07, 0x4a, 0xbd, 0xbd, 0xa9, 0xb4, 0xbd, 0xa1, 0x2f, 0xe5, 0xbc,
- 0x39, 0xfa, 0x57, 0xbe, 0x19, 0xdf, 0xdd, 0xbe, 0x0f, 0x42, 0x11, 0xbe,
- 0xc5, 0x4d, 0x00, 0xbd, 0x95, 0x67, 0x16, 0xbf, 0x33, 0x37, 0x31, 0xbe,
- 0x2a, 0x94, 0xde, 0x3c, 0xd9, 0x9f, 0xfa, 0xbe, 0x66, 0x88, 0xa1, 0xbc,
- 0x3f, 0x92, 0x76, 0xbe, 0x8c, 0xa6, 0x67, 0xbe, 0x80, 0xe7, 0x10, 0xbf,
- 0xb4, 0xb5, 0x6e, 0xb9, 0x73, 0x8e, 0x49, 0x3e, 0xbe, 0xce, 0x7c, 0xbe,
- 0x04, 0x06, 0x6b, 0xbd, 0x97, 0x03, 0x84, 0x3e, 0xd0, 0x79, 0x78, 0x3e,
- 0x9b, 0x6e, 0x00, 0xbf, 0x3e, 0xa8, 0xd1, 0xbd, 0x6e, 0x46, 0x67, 0xbd,
- 0x36, 0x86, 0x28, 0x3e, 0x35, 0x78, 0x8e, 0x3d, 0xd2, 0x0f, 0xad, 0x3d,
- 0x83, 0x3e, 0xb5, 0x3b, 0x58, 0xaf, 0x43, 0x3c, 0x3c, 0x23, 0x11, 0xbe,
- 0x66, 0x8b, 0x0a, 0xbc, 0x9c, 0x02, 0xcc, 0x3d, 0x32, 0xa0, 0xd2, 0xbe,
- 0xc9, 0x65, 0x7f, 0x3e, 0xdb, 0x9d, 0x92, 0x3d, 0x6b, 0x9a, 0x3a, 0xbf,
- 0x9d, 0x39, 0x13, 0xbf, 0x79, 0x90, 0x00, 0xbe, 0x4f, 0x17, 0x93, 0x3d,
- 0x1f, 0x1c, 0x76, 0xbe, 0xfa, 0x0d, 0xee, 0x3d, 0x42, 0xa2, 0x04, 0xbd,
- 0x8d, 0x45, 0x0d, 0xbe, 0xf9, 0x7c, 0x2a, 0xbe, 0x2d, 0x51, 0xb7, 0xbe,
- 0x82, 0x8d, 0x66, 0x3c, 0x5f, 0xce, 0xa6, 0xbe, 0x85, 0x66, 0x65, 0xbc,
- 0x54, 0xe9, 0x9d, 0xbe, 0x8c, 0x24, 0x83, 0xbe, 0x27, 0x7c, 0xcb, 0xbc,
- 0x34, 0x9a, 0x4a, 0xbe, 0x54, 0xce, 0x5b, 0xbf, 0x58, 0x07, 0x11, 0xbf,
- 0xd5, 0xd3, 0x6e, 0xbe, 0x7c, 0x6f, 0xe0, 0xbe, 0x8a, 0xab, 0x31, 0xbe,
- 0x88, 0xb3, 0xcc, 0x3d, 0xc5, 0xd7, 0xca, 0xbe, 0xbf, 0xcf, 0x6a, 0xbe,
- 0x16, 0xf6, 0xdb, 0xbe, 0xab, 0x19, 0x81, 0xbd, 0x12, 0x3d, 0xe5, 0xbd,
- 0x81, 0x5e, 0xe8, 0x3c, 0x5b, 0xdd, 0x22, 0xbe, 0xfd, 0x1f, 0x7d, 0x3e,
- 0x32, 0x9d, 0xb5, 0xbe, 0x52, 0xf2, 0xe9, 0x3d, 0xd1, 0x3a, 0x70, 0x3d,
- 0x73, 0x59, 0x40, 0xbd, 0x74, 0xc6, 0xa0, 0xbe, 0x71, 0x71, 0xb6, 0xbe,
- 0x23, 0x5a, 0x92, 0x3e, 0x07, 0x01, 0xac, 0xbe, 0xb7, 0xdd, 0x60, 0xbe,
- 0x3a, 0xca, 0x86, 0x3d, 0xd4, 0xa3, 0xf9, 0x3d, 0x04, 0x77, 0x82, 0x3e,
- 0x5c, 0x62, 0x25, 0x3e, 0x65, 0x66, 0x7e, 0x3d, 0x4c, 0xa1, 0x88, 0xbe,
- 0x8c, 0xb1, 0xc1, 0x3d, 0x77, 0x05, 0x1e, 0xbe, 0x41, 0x00, 0x43, 0xbe,
- 0x93, 0xc1, 0x51, 0xbe, 0xc3, 0x00, 0x5f, 0x3d, 0xe7, 0x4f, 0xdd, 0xbc,
- 0xd4, 0x0b, 0x95, 0xbd, 0x7c, 0xdb, 0x8b, 0xbd, 0x19, 0x5d, 0xf2, 0x3c,
- 0x4d, 0xa7, 0x8b, 0x3d, 0x70, 0xf6, 0xad, 0xbe, 0xe0, 0xe0, 0xce, 0xbb,
- 0xc9, 0x4d, 0xa3, 0x3d, 0x90, 0x8c, 0xf6, 0x3e, 0x7d, 0x23, 0x2c, 0x3d,
- 0x60, 0x49, 0x0f, 0xbe, 0xf9, 0x19, 0xe5, 0x3d, 0xbe, 0xd8, 0x50, 0xbe,
- 0xfc, 0xc5, 0xe7, 0x3e, 0xcf, 0x61, 0x8e, 0x3d, 0x16, 0xa9, 0x91, 0xbe,
- 0xf0, 0x5c, 0xb3, 0xbd, 0xc5, 0x40, 0xd8, 0xbe, 0x94, 0xe3, 0xb4, 0x3d,
- 0xc3, 0xc8, 0x87, 0x3e, 0x1b, 0x8a, 0x69, 0xbe, 0x53, 0x6f, 0x0e, 0x3e,
- 0x0d, 0x84, 0xb2, 0x3e, 0xfe, 0xf7, 0x6d, 0xbe, 0xb7, 0x4d, 0x49, 0x3d,
- 0x6f, 0x4f, 0x44, 0xbd, 0xcd, 0x47, 0x74, 0xbe, 0x6c, 0x43, 0x6f, 0x3e,
- 0x5f, 0xa9, 0xa8, 0xbc, 0x92, 0xc8, 0x0c, 0x3f, 0x25, 0x92, 0xc3, 0x3c,
- 0x4c, 0xb7, 0x07, 0x3e, 0x21, 0xc7, 0xa2, 0x3e, 0x2f, 0x42, 0x6a, 0x3e,
- 0xb6, 0x79, 0x7c, 0x3d, 0xef, 0x5f, 0x73, 0x3e, 0x93, 0xd2, 0x55, 0xbe,
- 0xbd, 0x02, 0xc1, 0x3d, 0x4b, 0xbc, 0x1c, 0x3f, 0xc7, 0x39, 0x8d, 0x3d,
- 0xe3, 0xd0, 0x26, 0xbe, 0x73, 0x1d, 0xd5, 0x3e, 0x1d, 0xdd, 0x6f, 0xbe,
- 0x31, 0xfd, 0x71, 0x3e, 0x2e, 0xbc, 0x4f, 0x3e, 0xab, 0x61, 0x49, 0xbe,
- 0x0d, 0x9d, 0xbb, 0x3c, 0x03, 0x7e, 0x2a, 0xbe, 0xb5, 0x16, 0x53, 0x3e,
- 0x0f, 0xeb, 0xbc, 0x3d, 0xf5, 0xe5, 0xba, 0xbe, 0x87, 0x4d, 0x00, 0xbe,
- 0x3f, 0x59, 0xa6, 0xbd, 0x1e, 0xc2, 0x02, 0xbe, 0xa2, 0x85, 0x90, 0x3e,
- 0xf5, 0xd0, 0x34, 0xbd, 0x50, 0x9b, 0x76, 0x3d, 0xcc, 0x94, 0x1d, 0xbe,
- 0xde, 0xb7, 0x94, 0xbe, 0x1f, 0x63, 0x8b, 0x3d, 0xb9, 0x97, 0x87, 0x3e,
- 0xb5, 0x7d, 0xb7, 0xbe, 0x0c, 0x41, 0x2a, 0xbe, 0x11, 0xe3, 0xf5, 0x3d,
- 0x20, 0xc5, 0xac, 0xbc, 0x12, 0xf7, 0x06, 0xbe, 0x61, 0x01, 0x93, 0x3e,
- 0x3a, 0x06, 0xe5, 0xbd, 0x44, 0x8b, 0xaf, 0x3e, 0x5b, 0xa0, 0x8c, 0xbe,
- 0x27, 0x3c, 0x39, 0x3e, 0x77, 0xdd, 0xd0, 0x3e, 0xb0, 0x03, 0x96, 0x3d,
- 0xb6, 0x1a, 0x48, 0xbe, 0x6a, 0xfe, 0xae, 0x3e, 0x4b, 0x1c, 0x4c, 0x3e,
- 0x66, 0x6c, 0x8a, 0xbc, 0xc7, 0xf6, 0x31, 0x3d, 0x04, 0x95, 0x87, 0xbd,
- 0x43, 0x78, 0x2c, 0xbd, 0xee, 0x13, 0x0a, 0xbd, 0x4d, 0x46, 0xe5, 0x3e,
- 0xc4, 0xd4, 0x09, 0x3f, 0x1d, 0x9a, 0x5d, 0x3e, 0xb9, 0x17, 0x47, 0xbd,
- 0x8a, 0x18, 0xce, 0xbe, 0x0e, 0xaf, 0x81, 0x3b, 0x80, 0xf7, 0x52, 0x3e,
- 0xb6, 0xe6, 0xa7, 0xbc, 0x14, 0x65, 0xaf, 0xbd, 0xe6, 0x4d, 0x3e, 0x3e,
- 0x2a, 0x9c, 0x03, 0xbd, 0x49, 0x2e, 0xae, 0x3d, 0x44, 0x2c, 0xf3, 0x3e,
- 0x67, 0x5b, 0xbb, 0xbe, 0x9b, 0x6d, 0x80, 0xbe, 0xa8, 0x04, 0x22, 0x3d,
- 0x52, 0xcf, 0xf4, 0xbd, 0x92, 0x63, 0xce, 0x3e, 0xcc, 0x25, 0x40, 0xbd,
- 0xe4, 0xfd, 0x4b, 0xbe, 0x8b, 0x1d, 0xe3, 0xbe, 0x85, 0xf0, 0x1d, 0x3d,
- 0x65, 0x54, 0x87, 0xbd, 0x49, 0x2f, 0xcc, 0x3d, 0xb4, 0x11, 0x44, 0x3e,
- 0x04, 0x61, 0x92, 0xbd, 0x83, 0x66, 0xe3, 0xbd, 0x5c, 0x6c, 0xd4, 0xbd,
- 0x99, 0xeb, 0x16, 0x3e, 0xd1, 0xa8, 0x4c, 0xbe, 0x78, 0x07, 0x8a, 0x3e,
- 0xe5, 0xf3, 0x0d, 0x3f, 0xe6, 0xa0, 0x93, 0x3e, 0x86, 0x62, 0xfe, 0x3e,
- 0xfc, 0x4d, 0x12, 0x3e, 0x8d, 0x8c, 0x9b, 0x3d, 0xb0, 0xa5, 0x4b, 0xbe,
- 0x84, 0x4b, 0x50, 0xbe, 0xec, 0xbe, 0xbb, 0x3d, 0xf2, 0x43, 0x40, 0x3e,
- 0x9a, 0x47, 0x82, 0x3e, 0x97, 0xdd, 0x49, 0xbd, 0x7c, 0x89, 0x86, 0x3e,
- 0x15, 0x06, 0x1c, 0x3e, 0x3d, 0x9f, 0xcf, 0x3b, 0xac, 0x19, 0x48, 0xbf,
- 0x22, 0x2f, 0x2f, 0x3e, 0xa1, 0xe0, 0x62, 0x3d, 0x1d, 0x09, 0x45, 0xbe,
- 0xb1, 0x58, 0xe1, 0xbe, 0x29, 0xe7, 0x0f, 0xbe, 0x1b, 0x51, 0xa8, 0x3d,
- 0x4b, 0xfc, 0xde, 0xbd, 0x59, 0xf9, 0x1e, 0x3e, 0xd4, 0x03, 0x96, 0x3e,
- 0x37, 0x31, 0x4c, 0xbf, 0xa4, 0x69, 0xe2, 0x3b, 0x2c, 0x7d, 0x16, 0x3e,
- 0xb6, 0xbe, 0xa1, 0xbe, 0x11, 0xa3, 0x55, 0x3e, 0x0a, 0xe9, 0xdd, 0xbd,
- 0x41, 0x87, 0x80, 0xbe, 0x0c, 0x1c, 0xe0, 0xbd, 0xf8, 0xa1, 0xae, 0xbe,
- 0x84, 0xe6, 0x55, 0xbd, 0x51, 0x96, 0xf2, 0xbd, 0x2d, 0x2e, 0x88, 0x3e,
- 0x7d, 0x46, 0x0d, 0xbf, 0x5e, 0xc1, 0xab, 0xbe, 0x8e, 0x01, 0x73, 0xbe,
- 0x47, 0x31, 0x8b, 0xba, 0x7a, 0x0f, 0xd0, 0xbe, 0x61, 0xe8, 0x6e, 0x3d,
- 0xec, 0x04, 0x53, 0xbe, 0x95, 0x50, 0x53, 0xbd, 0x5a, 0xc5, 0xe8, 0x3c,
- 0x70, 0x45, 0x9f, 0xbe, 0x2f, 0xf3, 0x1e, 0xbe, 0x47, 0x81, 0x11, 0xbc,
- 0x7c, 0x71, 0xbe, 0x3e, 0x5b, 0xb0, 0x66, 0x3e, 0x55, 0x8b, 0x67, 0x3e,
- 0xe9, 0xad, 0xdd, 0x3d, 0x02, 0xcb, 0x04, 0xbe, 0x76, 0xa8, 0xcf, 0xbd,
- 0x39, 0x30, 0xee, 0x3e, 0xad, 0x42, 0x75, 0x3e, 0x93, 0x18, 0xf4, 0xbc,
- 0x38, 0x48, 0x40, 0xbf, 0x9d, 0xdf, 0x6a, 0x3e, 0xd0, 0x27, 0x57, 0xbe,
- 0x2f, 0xdd, 0x59, 0xbe, 0x7f, 0x5f, 0x83, 0x3e, 0x9d, 0x8e, 0x3c, 0x3e,
- 0x43, 0x5d, 0xb7, 0x3d, 0xd6, 0x0a, 0x27, 0xbe, 0xed, 0xcb, 0x06, 0xbf,
- 0x40, 0x4a, 0x1d, 0xbf, 0x95, 0xaf, 0xfc, 0xbe, 0x9b, 0xde, 0xe9, 0xbe,
- 0x32, 0xd7, 0x37, 0xbd, 0x95, 0x71, 0xbc, 0xbe, 0xe9, 0x02, 0x0e, 0xbe,
- 0xef, 0xaa, 0x0d, 0x3e, 0x7b, 0x47, 0xc1, 0xbe, 0x4c, 0x2e, 0x1f, 0xbc,
- 0x1b, 0x7a, 0x04, 0x3e, 0xa4, 0x9d, 0xb4, 0x3c, 0xfc, 0xa9, 0x55, 0xbe,
- 0x56, 0xa3, 0x25, 0xbe, 0x4c, 0xe3, 0x24, 0xbe, 0x99, 0xe6, 0xbf, 0xbe,
- 0x53, 0x8c, 0x24, 0xbe, 0xbd, 0x86, 0x42, 0x3c, 0x8e, 0x29, 0x43, 0x3d,
- 0x51, 0x0f, 0xf2, 0xbc, 0xdf, 0xb6, 0xbc, 0xbd, 0xec, 0xf7, 0x1e, 0xbf,
- 0xb2, 0x55, 0x03, 0xbe, 0x38, 0xba, 0x3e, 0xbd, 0xc3, 0x0c, 0x26, 0x3e,
- 0x1d, 0xa3, 0x59, 0xbb, 0xd2, 0x70, 0x5c, 0xbc, 0x26, 0xb5, 0x9e, 0x3e,
- 0x90, 0xf1, 0x34, 0x3d, 0xb8, 0xb2, 0x22, 0xbf, 0x3d, 0xd7, 0xc0, 0x3d,
- 0x6c, 0x5c, 0xf9, 0xbe, 0x64, 0x12, 0x77, 0x3e, 0x6a, 0x88, 0x3c, 0xbe,
- 0xbf, 0x63, 0x44, 0xbd, 0xa4, 0x13, 0x27, 0xbe, 0x4b, 0x1a, 0x0e, 0xbe,
- 0x8a, 0x90, 0x0b, 0xbf, 0x74, 0x8a, 0xaf, 0xbe, 0xa4, 0x12, 0x24, 0xbe,
- 0xdc, 0xea, 0x3d, 0xbd, 0x08, 0x10, 0x3a, 0xbe, 0x75, 0x4d, 0xd6, 0xbe,
- 0x80, 0x71, 0x35, 0xbe, 0x69, 0x42, 0x86, 0xbd, 0x93, 0xcd, 0x23, 0xbe,
- 0x03, 0x89, 0xf1, 0xbe, 0x39, 0xa3, 0x0b, 0x3e, 0xed, 0x5a, 0xff, 0xbd,
- 0x3b, 0xa9, 0x02, 0xbe, 0xe0, 0x44, 0x93, 0x3e, 0x24, 0x28, 0x95, 0x3e,
- 0x11, 0x40, 0xd3, 0xbe, 0x20, 0x0c, 0x3e, 0x3e, 0xc5, 0x3e, 0x36, 0x3e,
- 0xe9, 0xa7, 0xcb, 0xbc, 0x4d, 0x5b, 0x7b, 0xbe, 0xf5, 0xec, 0x71, 0xbe,
- 0x47, 0x0b, 0x2c, 0x3d, 0x51, 0xde, 0xe7, 0x3d, 0x78, 0x2d, 0x09, 0xbf,
- 0x97, 0x2e, 0xf4, 0xbd, 0xde, 0xcc, 0xe5, 0xbd, 0x88, 0xf8, 0x9b, 0xbe,
- 0x99, 0x33, 0x88, 0x3e, 0x09, 0x11, 0x53, 0xbd, 0x5f, 0x7f, 0xaf, 0x3e,
- 0x6c, 0x0f, 0x8a, 0x3e, 0x82, 0x7e, 0xa7, 0x3e, 0x3c, 0x0a, 0x5d, 0x3d,
- 0x3d, 0x3b, 0xb8, 0x3e, 0x55, 0x9e, 0xac, 0x3d, 0xa8, 0xad, 0xe7, 0x3d,
- 0x7c, 0xe6, 0x21, 0xbe, 0x59, 0x49, 0x83, 0xbe, 0x4f, 0x06, 0x12, 0x3c,
- 0xe1, 0x8e, 0x1c, 0xbf, 0x07, 0xdd, 0x1e, 0x3e, 0xe1, 0xbf, 0x66, 0xbe,
- 0x2e, 0x35, 0xcf, 0x3d, 0xa2, 0xd9, 0x4b, 0x3d, 0xc1, 0xcc, 0x55, 0xbe,
- 0x9a, 0x80, 0x11, 0xbe, 0xc2, 0xa5, 0x01, 0x3f, 0x7b, 0x1b, 0x58, 0x3e,
- 0x48, 0x36, 0x39, 0x3e, 0x67, 0xf7, 0xc3, 0xbe, 0xc2, 0xf6, 0x03, 0xbd,
- 0x6f, 0x75, 0xe0, 0x3d, 0xbc, 0xb3, 0x87, 0xbd, 0xef, 0xc7, 0xbb, 0xbe,
- 0xa1, 0x09, 0xd2, 0xbe, 0x54, 0x1e, 0xab, 0x3d, 0xac, 0x3e, 0x38, 0x3e,
- 0x61, 0x24, 0xa5, 0xbd, 0x0e, 0xa4, 0x26, 0x3e, 0xf0, 0x72, 0x38, 0x3e,
- 0x13, 0x2f, 0x02, 0x3d, 0x6e, 0x53, 0x94, 0xbe, 0xa6, 0xd7, 0x48, 0x3d,
- 0x27, 0x8a, 0xcd, 0x3d, 0x51, 0xb6, 0x94, 0x3d, 0xdb, 0x78, 0x9e, 0x3c,
- 0x9f, 0xcd, 0x28, 0x3e, 0x6d, 0x31, 0xc8, 0x3e, 0x73, 0xb3, 0xdb, 0xbc,
- 0x63, 0x37, 0x5b, 0xbe, 0x88, 0x7b, 0x58, 0xbd, 0xf5, 0xd3, 0x0c, 0xbf,
- 0x8e, 0x2b, 0xcd, 0xbd, 0x43, 0x6b, 0x20, 0xbe, 0xb8, 0x8d, 0xe5, 0xbc,
- 0x2c, 0x12, 0x8c, 0xbd, 0x36, 0x28, 0xab, 0x3d, 0x6d, 0x28, 0x0b, 0xbb,
- 0xe6, 0x33, 0x9a, 0x3c, 0x25, 0xb0, 0x20, 0xbe, 0x73, 0x6d, 0x92, 0x3e,
- 0x13, 0xd1, 0x3a, 0xbe, 0x86, 0xe2, 0xf4, 0xbc, 0xbd, 0xd9, 0x17, 0x3e,
- 0xec, 0x95, 0xf0, 0x3d, 0x65, 0xcc, 0xd9, 0xbd, 0x84, 0x96, 0xd5, 0xbc,
- 0x16, 0x2c, 0xc0, 0x3d, 0x89, 0xbd, 0x6d, 0x3e, 0x4b, 0xe7, 0x82, 0xbe,
- 0xe2, 0x51, 0x7d, 0x3c, 0x9d, 0xb4, 0xa8, 0xbe, 0xdd, 0xd4, 0xdc, 0x3e,
- 0x49, 0x44, 0xb5, 0x3d, 0x85, 0x12, 0xaa, 0x3d, 0xb3, 0x7c, 0xdd, 0xbe,
- 0xaa, 0x0b, 0x4e, 0xbe, 0xb7, 0xfb, 0x1e, 0xbe, 0x00, 0xa8, 0x49, 0x3c,
- 0x84, 0x36, 0x6e, 0x3e, 0x71, 0x94, 0x10, 0xbf, 0x80, 0x52, 0xd4, 0xbd,
- 0x9f, 0xd6, 0x28, 0x3e, 0x06, 0x2e, 0x2b, 0x3c, 0xf4, 0xa1, 0x66, 0x3c,
- 0x10, 0x7c, 0x6c, 0xbf, 0x49, 0xe6, 0x07, 0xbe, 0xe8, 0x1b, 0xd2, 0x3e,
- 0xb4, 0xaf, 0xb8, 0xbe, 0xdc, 0x2f, 0x64, 0xbd, 0x6a, 0x84, 0x28, 0x3e,
- 0x7a, 0xcc, 0x9e, 0xbe, 0xa8, 0xe4, 0xb1, 0xbe, 0x63, 0x47, 0x3c, 0x3c,
- 0xeb, 0xa2, 0xcf, 0x3c, 0x3d, 0x8b, 0x80, 0xbe, 0x1c, 0xce, 0x74, 0x3e,
- 0x26, 0xd2, 0xca, 0xbb, 0x09, 0x95, 0xad, 0xbe, 0xbe, 0x6f, 0x16, 0xbd,
- 0x38, 0x32, 0xac, 0x3d, 0x4b, 0xb4, 0x8d, 0x3b, 0x9d, 0x42, 0xe4, 0x3d,
- 0x61, 0x04, 0x53, 0x3e, 0x8b, 0x07, 0x92, 0x3d, 0x5a, 0x34, 0x87, 0xbe,
- 0xe5, 0x23, 0x29, 0xbd, 0x46, 0x40, 0xca, 0x3e, 0xe8, 0xb1, 0x09, 0xbf,
- 0xd9, 0x1e, 0x3e, 0xbe, 0x2e, 0x86, 0xb8, 0x3e, 0x0b, 0xb8, 0x96, 0xbe,
- 0x80, 0x5a, 0xb3, 0x3e, 0xc4, 0xc6, 0x35, 0x3d, 0x62, 0x6c, 0x64, 0x3e,
- 0xbb, 0xfa, 0xb7, 0x3d, 0xbf, 0xc7, 0xec, 0x3e, 0xc4, 0xdb, 0x19, 0x3e,
- 0xcc, 0x3c, 0x87, 0x3d, 0xe7, 0xb2, 0x6a, 0xbe, 0x27, 0x8e, 0x95, 0xbe,
- 0x25, 0xcd, 0xf1, 0xbd, 0x2c, 0x6e, 0xfc, 0xbd, 0x34, 0x0f, 0x22, 0xbf,
- 0xe4, 0x43, 0x04, 0xbd, 0x74, 0xb0, 0x30, 0x3e, 0xb2, 0x75, 0x76, 0x3c,
- 0xa2, 0x72, 0x3c, 0xbe, 0x54, 0xbf, 0x7b, 0xbe, 0x47, 0xe8, 0x00, 0xbf,
- 0xe8, 0xcc, 0xe4, 0xbe, 0x81, 0x02, 0x06, 0x3d, 0x51, 0xa4, 0xf3, 0xbc,
- 0xd0, 0xc5, 0xa6, 0xbd, 0x79, 0x9a, 0x5d, 0x3e, 0x44, 0xdd, 0xbf, 0xbe,
- 0xe5, 0xaa, 0x76, 0xbe, 0xdc, 0x5a, 0x98, 0xbd, 0x15, 0x1c, 0x03, 0xbe,
- 0xcb, 0x7d, 0xf5, 0x3d, 0xbd, 0x19, 0x8a, 0xbe, 0x35, 0xf1, 0xa3, 0x3d,
- 0xa3, 0x85, 0xe3, 0x3d, 0xf8, 0xbf, 0x1a, 0xbe, 0x32, 0xbc, 0xe9, 0xbe,
- 0xe1, 0x21, 0xa2, 0xbe, 0x1e, 0xc3, 0xe1, 0x3e, 0xcc, 0xb5, 0x9b, 0x3e,
- 0x80, 0xdc, 0x9e, 0x3c, 0x0e, 0xa1, 0xe1, 0x3d, 0x42, 0x08, 0x63, 0xbd,
- 0xc5, 0x28, 0xfb, 0x3d, 0x9f, 0xcf, 0x9f, 0xbd, 0x24, 0xa3, 0x51, 0xbe,
- 0x8e, 0x52, 0x9a, 0x3e, 0xd5, 0xe3, 0x41, 0x3e, 0xf0, 0x29, 0xa8, 0xbd,
- 0xaa, 0x8e, 0xa5, 0x3e, 0x1a, 0x6e, 0xd1, 0x3d, 0xa7, 0x43, 0x98, 0xbe,
- 0x65, 0x52, 0x18, 0xbf, 0x5a, 0x16, 0xc1, 0x3e, 0xe2, 0xac, 0xaf, 0xbe,
- 0x12, 0x74, 0x5d, 0xbe, 0x57, 0x56, 0xe6, 0xbe, 0x2d, 0xa4, 0x0a, 0xbf,
- 0x76, 0x2e, 0x8b, 0x3e, 0x1f, 0x37, 0x3d, 0xbe, 0xdf, 0x7a, 0x36, 0x3d,
- 0x5d, 0x44, 0x58, 0x3e, 0x2a, 0x8a, 0x6d, 0x3b, 0xde, 0x2c, 0x3a, 0x3d,
- 0xcc, 0xf1, 0x28, 0xbe, 0x98, 0x88, 0xfa, 0xbe, 0x77, 0x83, 0xe4, 0xbe,
- 0xca, 0x07, 0x94, 0x3e, 0x2f, 0x8b, 0x1f, 0x3e, 0xda, 0xc7, 0xe6, 0x3d,
- 0xeb, 0xae, 0x96, 0xbe, 0x58, 0x3c, 0x9d, 0x3d, 0xfa, 0xa4, 0x64, 0x3e,
- 0x45, 0x2d, 0x3d, 0xbe, 0xba, 0xdc, 0x51, 0x3b, 0x30, 0x0a, 0xee, 0xbc,
- 0xb2, 0x53, 0x5d, 0x3e, 0x8b, 0xb8, 0x75, 0xbe, 0x79, 0xc8, 0xd1, 0xbe,
- 0xc7, 0x83, 0x41, 0xbe, 0xc6, 0x5a, 0xc0, 0x3d, 0xc9, 0xec, 0xb9, 0x3e,
- 0x68, 0x98, 0x82, 0xbe, 0x85, 0x92, 0x20, 0xbc, 0xc8, 0x6e, 0xdf, 0xbd,
- 0x0f, 0x90, 0x77, 0xbe, 0xd7, 0xfb, 0x03, 0xbe, 0xf6, 0xef, 0x6a, 0xbe,
- 0xff, 0x2a, 0xb9, 0xbc, 0x1b, 0x93, 0x11, 0x3e, 0xa3, 0xc7, 0xed, 0x3d,
- 0xb0, 0xaa, 0x03, 0xbe, 0x93, 0x94, 0x7a, 0xbe, 0xcd, 0x8c, 0x4c, 0x3d,
- 0xe1, 0xc3, 0xa6, 0xbe, 0x10, 0x01, 0x72, 0x3e, 0x87, 0x51, 0x63, 0x3e,
- 0x71, 0xf8, 0xb6, 0x3e, 0x8e, 0x13, 0x80, 0x3e, 0xc4, 0x79, 0x70, 0xbd,
- 0x10, 0xed, 0x9c, 0x3d, 0xeb, 0x00, 0xfb, 0x3d, 0x94, 0x80, 0x9a, 0xbe,
- 0xac, 0x91, 0xbf, 0x3d, 0x18, 0xe3, 0xa7, 0xbe, 0xd2, 0x4a, 0x0d, 0xbf,
- 0x96, 0x90, 0xd1, 0xbd, 0x00, 0xb8, 0xe9, 0x3c, 0xf6, 0x2d, 0xb6, 0x3d,
- 0x20, 0xd5, 0xd1, 0xbe, 0x7f, 0x37, 0x9c, 0x3e, 0x89, 0x6c, 0x79, 0xbe,
- 0xcb, 0x74, 0xcc, 0xbe, 0xa4, 0x55, 0xfa, 0x3d, 0x17, 0x3b, 0x46, 0x3e,
- 0x87, 0x75, 0xcc, 0xbc, 0x82, 0xe9, 0xa6, 0x3d, 0x5c, 0x1f, 0xe4, 0x3d,
- 0x5c, 0x3e, 0xcf, 0xbd, 0x30, 0x3e, 0x2d, 0x3e, 0xf9, 0xa4, 0x84, 0x3e,
- 0x31, 0x44, 0x39, 0xbe, 0xe5, 0xfd, 0x2f, 0xbc, 0x02, 0x09, 0xc8, 0x3d,
- 0xba, 0xbf, 0xd7, 0x3e, 0x3b, 0x30, 0x79, 0xbd, 0x39, 0xce, 0x23, 0x3e,
- 0x6c, 0x7c, 0x8f, 0xbe, 0x2a, 0xc3, 0xab, 0xbe, 0xde, 0xe3, 0xe7, 0xbd,
- 0x31, 0x7f, 0x4c, 0xbe, 0x49, 0xb1, 0x3d, 0xbd, 0xa2, 0x6a, 0x21, 0x3e,
- 0x86, 0x36, 0x71, 0xbe, 0xe4, 0x89, 0x16, 0x3e, 0xba, 0x05, 0x2c, 0xbd,
- 0xf8, 0xd3, 0x9d, 0x3e, 0xa0, 0x98, 0x2c, 0xbd, 0x2f, 0xf4, 0x6f, 0xbe,
- 0x63, 0xba, 0x42, 0x3e, 0x63, 0x64, 0x3b, 0x3d, 0xe3, 0xea, 0xf3, 0x3d,
- 0x97, 0x4b, 0x49, 0x3e, 0x7e, 0xe1, 0x24, 0xbe, 0x28, 0xd1, 0xb7, 0xbe,
- 0xad, 0x1c, 0xa4, 0x3d, 0x27, 0x74, 0x52, 0x3e, 0x55, 0xa3, 0x91, 0xbe,
- 0x38, 0x00, 0x74, 0x3e, 0x79, 0x54, 0x02, 0x3f, 0x84, 0xf6, 0x28, 0x3c,
- 0x60, 0x34, 0xa0, 0xbd, 0xa7, 0x16, 0xf9, 0xbe, 0xca, 0xa1, 0x55, 0xbe,
- 0x03, 0x67, 0xb3, 0xbe, 0x4a, 0xb1, 0x00, 0x3d, 0x60, 0xa5, 0xa1, 0xbe,
- 0x7f, 0xbd, 0x45, 0x3e, 0xa1, 0x19, 0x96, 0xbc, 0x68, 0xe5, 0xc7, 0x3e,
- 0xe2, 0x85, 0x03, 0xbf, 0xcc, 0x27, 0xd8, 0x3c, 0x96, 0x8e, 0x22, 0xbf,
- 0xa9, 0x71, 0xb2, 0x3e, 0x90, 0xdb, 0x86, 0x3e, 0x32, 0x2b, 0xfc, 0xbe,
- 0x21, 0x87, 0x2a, 0x3e, 0x37, 0x24, 0x7c, 0xbe, 0x2b, 0x81, 0x8f, 0xbb,
- 0xc9, 0x58, 0xa2, 0xbe, 0x6d, 0xe5, 0x2b, 0xbe, 0x0c, 0xd6, 0xd6, 0xbc,
- 0x50, 0xbf, 0xa9, 0x3d, 0xe8, 0xcc, 0xa9, 0x3e, 0x54, 0x92, 0xdd, 0xbd,
- 0xd4, 0xe2, 0x19, 0x3d, 0xe6, 0x1a, 0x7f, 0x3d, 0xd9, 0x6c, 0x24, 0x3e,
- 0x23, 0x86, 0xbe, 0xbd, 0x18, 0x2d, 0x28, 0xbe, 0xe6, 0xa2, 0x08, 0x3f,
- 0x5b, 0x2e, 0xf6, 0xbd, 0x20, 0xbf, 0xc2, 0x3e, 0x7f, 0x5d, 0x12, 0xbe,
- 0x17, 0x49, 0x74, 0x3c, 0x8c, 0x79, 0x23, 0x3d, 0x50, 0xdf, 0xe8, 0xbc,
- 0x1c, 0xaf, 0x3b, 0xbb, 0xe0, 0xb7, 0x51, 0x3e, 0x37, 0x6f, 0xc3, 0xbe,
- 0xe8, 0xd5, 0x25, 0xbe, 0x96, 0x8c, 0x19, 0xbd, 0x4c, 0xd6, 0xad, 0xbb,
- 0xa2, 0x00, 0x03, 0x3d, 0x59, 0x04, 0x33, 0xbe, 0x89, 0xa6, 0x84, 0xbe,
- 0x7e, 0x95, 0x35, 0x3e, 0x25, 0xe5, 0x25, 0xbe, 0xb4, 0x9e, 0xf8, 0xbd,
- 0xfa, 0xa2, 0x78, 0x3d, 0x75, 0x64, 0x14, 0x3b, 0x11, 0x4e, 0x81, 0xbe,
- 0x28, 0xac, 0x82, 0xbe, 0x75, 0x93, 0xa8, 0xbe, 0x4f, 0xb7, 0x1a, 0xbe,
- 0x4e, 0x7a, 0x59, 0xbe, 0xf8, 0xdd, 0xc1, 0x3e, 0x0d, 0xf4, 0x18, 0x3e,
- 0xeb, 0xe5, 0x99, 0xbe, 0x53, 0x7a, 0xc8, 0x3e, 0x1f, 0xe3, 0x4d, 0x3e,
- 0x04, 0x3a, 0x1a, 0x3d, 0x63, 0xa9, 0x11, 0xbf, 0x94, 0x0a, 0x5a, 0xbe,
- 0x82, 0x1f, 0x2a, 0x3e, 0xb9, 0x61, 0xef, 0x3d, 0x38, 0x4a, 0x30, 0xbe,
- 0xce, 0x88, 0x4e, 0xbe, 0x51, 0xed, 0x9f, 0xbd, 0x79, 0xac, 0x3a, 0x3e,
- 0x13, 0xef, 0xd1, 0x3c, 0x05, 0xd2, 0x81, 0x3d, 0x65, 0xa8, 0x6f, 0x3b,
- 0xa1, 0xb3, 0x71, 0xbe, 0x2d, 0xcc, 0x42, 0xbf, 0x33, 0x02, 0x55, 0x3e,
- 0xca, 0x19, 0x20, 0x3e, 0xe9, 0x40, 0x96, 0xbc, 0x7c, 0x22, 0xc5, 0xbd,
- 0x04, 0xb7, 0xb2, 0x3d, 0xd1, 0x33, 0xd5, 0x3e, 0x87, 0x98, 0xbf, 0xbe,
- 0x4c, 0x14, 0x51, 0xbf, 0x5e, 0x6d, 0x42, 0x3c, 0xed, 0xd6, 0x0e, 0x3e,
- 0x2e, 0x66, 0xc2, 0x3d, 0xc4, 0x66, 0xa7, 0x3d, 0xd0, 0x2a, 0xf5, 0xbd,
- 0x69, 0xd2, 0x2d, 0xbe, 0x74, 0xa9, 0xae, 0xbd, 0x60, 0x0c, 0xa2, 0xbe,
- 0x17, 0xab, 0xe6, 0x3c, 0xef, 0xd7, 0x9c, 0xbe, 0xa8, 0x5b, 0xbd, 0x3d,
- 0x06, 0xe9, 0x0d, 0x3e, 0x1e, 0x8a, 0x36, 0xbe, 0x88, 0x9c, 0x48, 0x3c,
- 0xb8, 0x63, 0x26, 0x3d, 0xcd, 0x1c, 0x91, 0xbe, 0xe4, 0xfa, 0xd4, 0x3e,
- 0x6b, 0x0d, 0xf0, 0xbc, 0x00, 0xb5, 0xb2, 0xbe, 0xcf, 0xc0, 0x57, 0xbd,
- 0xeb, 0x0e, 0x57, 0x3c, 0xf8, 0xd7, 0x3f, 0x3e, 0xa2, 0xa5, 0x66, 0x3e,
- 0x20, 0x6b, 0xeb, 0xbb, 0x08, 0x0f, 0xba, 0x3d, 0x00, 0x83, 0x74, 0xb8,
- 0x6b, 0x6f, 0xed, 0xbc, 0x1f, 0xec, 0x43, 0x3e, 0x42, 0x6a, 0x14, 0xbe,
- 0x3e, 0xe3, 0x35, 0x3e, 0xc0, 0xaa, 0x21, 0x3e, 0xc4, 0x42, 0x1d, 0xbe,
- 0x3b, 0x7e, 0x26, 0xbb, 0xb8, 0x26, 0x3b, 0xbe, 0x3c, 0xad, 0x2b, 0xbe,
- 0x0d, 0x25, 0x52, 0xbf, 0x4f, 0x51, 0xc9, 0xbd, 0xbc, 0xd2, 0x95, 0x3e,
- 0xf6, 0xeb, 0x87, 0x3e, 0xae, 0x01, 0x84, 0xbe, 0x53, 0xf4, 0x97, 0x3c,
- 0x5e, 0x2b, 0x9f, 0xbd, 0x5a, 0xfb, 0x2d, 0xbc, 0xdf, 0x37, 0xfa, 0xbe,
- 0x37, 0x75, 0x8d, 0xbe, 0x91, 0xb0, 0x00, 0x3e, 0xef, 0x89, 0x80, 0xbe,
- 0x0a, 0xa4, 0x0e, 0xbf, 0xa3, 0x01, 0x21, 0xbe, 0xf2, 0x34, 0xb5, 0x3d,
- 0x57, 0xeb, 0x5f, 0x3d, 0x8e, 0x02, 0x0d, 0xbd, 0xa7, 0xb3, 0xc7, 0xbe,
- 0x56, 0x16, 0x64, 0x3e, 0x0c, 0xd6, 0x62, 0x3e, 0x11, 0x3b, 0xc1, 0xbd,
- 0x0d, 0x85, 0xb4, 0xbd, 0xbb, 0x25, 0xd0, 0x3d, 0x56, 0x65, 0x64, 0x3d,
- 0xf4, 0xe8, 0x87, 0xbe, 0xd5, 0x63, 0xd3, 0x3e, 0xf4, 0xd1, 0xc7, 0xbe,
- 0xfa, 0x3c, 0x9b, 0xbd, 0x19, 0x25, 0x53, 0xbe, 0x8a, 0xaf, 0x93, 0xbd,
- 0xb8, 0x80, 0xa7, 0xbd, 0x3d, 0x89, 0xd9, 0x3a, 0x6d, 0x55, 0x12, 0xbe,
- 0xcc, 0x7e, 0x20, 0x3e, 0x60, 0x95, 0xfb, 0x3c, 0x54, 0xee, 0x16, 0x3c,
- 0x29, 0x4d, 0x78, 0xbd, 0x37, 0x04, 0xe9, 0x3c, 0x96, 0xc2, 0xab, 0xbe,
- 0x69, 0x1f, 0xfe, 0xbe, 0xf0, 0xea, 0x30, 0xbd, 0xd3, 0xc2, 0x03, 0xbf,
- 0xe3, 0x5d, 0x0b, 0xbf, 0x8b, 0xf9, 0x87, 0x3e, 0x7e, 0xfe, 0x9f, 0x3d,
- 0xa2, 0x92, 0x6e, 0xbe, 0x1b, 0x6c, 0x4c, 0x3e, 0x37, 0x3d, 0x58, 0xbe,
- 0x6a, 0x5c, 0xf0, 0xbe, 0xdd, 0x1c, 0x9e, 0x3a, 0x61, 0x0f, 0xbc, 0xbe,
- 0xf0, 0xcf, 0xc9, 0xbc, 0x0c, 0x9e, 0x63, 0x3e, 0x94, 0xc5, 0x04, 0xbf,
- 0x59, 0x96, 0x81, 0x3e, 0x23, 0x70, 0xf7, 0xbe, 0x3d, 0x7e, 0x34, 0xbe,
- 0x8d, 0x55, 0x5c, 0x3e, 0x64, 0xc4, 0xd8, 0x3e, 0xe5, 0xfe, 0xe5, 0xbe,
- 0xf2, 0xa7, 0x91, 0x3d, 0x05, 0x04, 0x6e, 0xbd, 0xa3, 0x0b, 0x8c, 0xbe,
- 0xd8, 0x0d, 0x53, 0xbe, 0x72, 0x0a, 0x0d, 0xbf, 0xf7, 0xb2, 0x92, 0x3e,
- 0x5f, 0x2c, 0x3d, 0xbd, 0x1e, 0x2b, 0x31, 0x3e, 0x7c, 0x2d, 0x9a, 0x3e,
- 0x7a, 0xc1, 0x13, 0x3d, 0x6d, 0x53, 0x99, 0xbe, 0x4d, 0x98, 0x19, 0xbf,
- 0x9f, 0x56, 0x91, 0x3d, 0x2a, 0xff, 0xc2, 0xbe, 0xb6, 0xfa, 0x8e, 0x3e,
- 0x91, 0x8a, 0x28, 0xbd, 0x5c, 0xe5, 0x4a, 0x3d, 0x5c, 0xd1, 0x9b, 0xbd,
- 0x27, 0x91, 0x07, 0xbe, 0xec, 0x6f, 0xd4, 0x3e, 0x34, 0x06, 0x6f, 0xbe,
- 0xba, 0x76, 0xb4, 0x3e, 0x22, 0x7e, 0xb8, 0xbd, 0x38, 0x62, 0x06, 0x3e,
- 0x0b, 0x57, 0x0a, 0x3e, 0x2f, 0x1b, 0x52, 0x3d, 0x12, 0x5b, 0x7d, 0x3e,
- 0xf0, 0x1a, 0x9a, 0x3d, 0x18, 0x70, 0x36, 0x3c, 0xc3, 0xe7, 0x11, 0x3e,
- 0xe9, 0x01, 0x89, 0xbe, 0xa1, 0x4c, 0xae, 0xbe, 0xc1, 0x9c, 0x5b, 0x3d,
- 0x11, 0xde, 0x25, 0xbb, 0xcc, 0x31, 0x83, 0xbe, 0xf7, 0x24, 0xf0, 0x3d,
- 0xc6, 0x6f, 0x14, 0xbe, 0x0e, 0x4d, 0x9d, 0xbe, 0x0e, 0x1c, 0xf0, 0xbd,
- 0x2c, 0xc1, 0xdb, 0x3e, 0x34, 0x27, 0x14, 0xbe, 0x21, 0x9f, 0xdd, 0xbd,
- 0x24, 0xcf, 0x10, 0x3e, 0xcc, 0xfe, 0x12, 0x3e, 0x9f, 0x3d, 0x7b, 0x3e,
- 0x32, 0x6b, 0xf5, 0x3d, 0x24, 0xf7, 0x77, 0x3e, 0x6d, 0x1a, 0xe7, 0x3c,
- 0x30, 0xdf, 0xfe, 0xbd, 0x9f, 0x59, 0x02, 0x3e, 0x4e, 0x60, 0x39, 0x3e,
- 0xa6, 0xce, 0x76, 0xbc, 0x57, 0xf2, 0x39, 0x3e, 0x70, 0x8a, 0xd6, 0x3e,
- 0x34, 0xb7, 0x0a, 0x3e, 0x38, 0x16, 0x2a, 0x3f, 0x69, 0xa7, 0x22, 0xbe,
- 0x8b, 0xba, 0x34, 0xbd, 0x95, 0x0f, 0x24, 0x3e, 0xbf, 0x01, 0x1a, 0xbe,
- 0x6c, 0xcc, 0xa3, 0xbe, 0x7f, 0x98, 0xa2, 0x3d, 0x52, 0x67, 0xf4, 0xbe,
- 0x48, 0xb9, 0x06, 0x3e, 0xd0, 0x63, 0xf1, 0x3d, 0xd1, 0xc8, 0x13, 0xbe,
- 0xc9, 0x22, 0x9b, 0x3e, 0x2e, 0x32, 0x39, 0xbd, 0x2a, 0x06, 0xea, 0xbe,
- 0xa5, 0x87, 0xa6, 0xbe, 0xe4, 0x1f, 0x5d, 0xbd, 0x8a, 0x60, 0x16, 0xbf,
- 0x22, 0x57, 0xb7, 0xbe, 0x93, 0xd1, 0xdd, 0xbe, 0x98, 0xd6, 0x79, 0x3e,
- 0x9b, 0x93, 0x99, 0x3e, 0xe1, 0xd5, 0x26, 0x3e, 0xb2, 0xd7, 0x99, 0xbe,
- 0x29, 0xe7, 0x87, 0x3e, 0x4b, 0x9d, 0x9c, 0x3e, 0x20, 0xba, 0x67, 0x3d,
- 0x14, 0xf0, 0x9c, 0xbe, 0x62, 0x2c, 0x9f, 0x3e, 0xed, 0xe1, 0x05, 0x3c,
- 0x89, 0x7c, 0x24, 0x3e, 0x49, 0x16, 0x5a, 0x3d, 0x8a, 0x27, 0xd9, 0x3d,
- 0x8a, 0x6a, 0x81, 0x3d, 0xad, 0x51, 0x0e, 0x3d, 0x4d, 0x85, 0x59, 0x3e,
- 0x68, 0x26, 0x5a, 0x3e, 0xfd, 0x4a, 0xf6, 0x3d, 0x6b, 0xbb, 0x39, 0xbe,
- 0x4d, 0x1e, 0x49, 0xbe, 0xf4, 0xe2, 0x96, 0xbe, 0xc1, 0x99, 0x08, 0x3e,
- 0x22, 0xd3, 0x8e, 0x3d, 0x02, 0x7d, 0xe9, 0xbd, 0x30, 0x1d, 0x02, 0x3c,
- 0xb9, 0x64, 0xc9, 0xbc, 0x12, 0x37, 0xff, 0xbd, 0x85, 0xc8, 0xcd, 0x3d,
- 0xd2, 0x72, 0x93, 0x3e, 0xbe, 0x5d, 0x8d, 0xbe, 0x35, 0xf3, 0x52, 0x3e,
- 0x2b, 0x15, 0xe4, 0xbe, 0xb1, 0x5d, 0x42, 0xbe, 0xa0, 0xf5, 0x85, 0xbe,
- 0xcf, 0xdd, 0x33, 0x3e, 0x01, 0x49, 0x02, 0x3f, 0x24, 0x4c, 0xa6, 0x3e,
- 0x4b, 0x65, 0x6a, 0xbe, 0xb0, 0xbd, 0x34, 0x3d, 0xe7, 0x00, 0x9d, 0x3e,
- 0x44, 0x50, 0x05, 0xbe, 0xfc, 0x4d, 0xf5, 0x3e, 0x78, 0xf2, 0x17, 0xbe,
- 0x10, 0xed, 0xb6, 0x3e, 0xb0, 0x13, 0x41, 0xbc, 0x6e, 0xe5, 0xaf, 0xbe,
- 0x10, 0x6d, 0xaa, 0x3d, 0xe0, 0xda, 0xbc, 0x3d, 0x83, 0x16, 0xcb, 0x3d,
- 0x26, 0x7c, 0xb8, 0xbd, 0xc2, 0x54, 0x0c, 0x3e, 0x89, 0x9d, 0x03, 0x3f,
- 0x36, 0xe4, 0xa1, 0xbe, 0x0c, 0x87, 0x64, 0x3e, 0xde, 0x46, 0xad, 0x3c,
- 0x52, 0x46, 0x55, 0x3d, 0x5f, 0x1d, 0x0f, 0xbd, 0x9e, 0x86, 0x11, 0x3e,
- 0x4b, 0x8d, 0x43, 0xbe, 0xa0, 0x5b, 0xe8, 0xbc, 0x29, 0x8f, 0xe2, 0xbe,
- 0xf6, 0x4e, 0x44, 0x3d, 0x3d, 0xdc, 0xf5, 0x3d, 0x17, 0xa0, 0xa2, 0xbb,
- 0xf6, 0x05, 0x66, 0x3e, 0x83, 0x34, 0xc4, 0x3d, 0xdd, 0x81, 0xea, 0x3e,
- 0x11, 0x98, 0x91, 0x3c, 0x8f, 0xfa, 0xed, 0x3d, 0x8c, 0x98, 0xb4, 0xbe,
- 0x47, 0x49, 0x61, 0x3e, 0xa6, 0x61, 0x28, 0xbf, 0x84, 0x06, 0x2d, 0xbe,
- 0xbd, 0xa0, 0x19, 0xbf, 0x43, 0xb3, 0x69, 0xbd, 0x73, 0xe4, 0x55, 0xbd,
- 0x88, 0x0e, 0x20, 0xbe, 0x2c, 0x4e, 0x8d, 0xbe, 0x42, 0xb4, 0xb3, 0x3d,
- 0xcf, 0xa6, 0xc7, 0xbe, 0x6e, 0xad, 0x9d, 0xbe, 0xef, 0xcd, 0x8a, 0xbd,
- 0x59, 0xc5, 0x80, 0x3e, 0x30, 0x39, 0xa0, 0xbd, 0xd5, 0x8e, 0xa4, 0x3d,
- 0xe5, 0xaf, 0x31, 0xbb, 0x21, 0x70, 0x16, 0x3e, 0xf6, 0x61, 0x3f, 0xbf,
- 0xe8, 0x26, 0x92, 0xbe, 0x9e, 0xd1, 0xbe, 0xbe, 0xc8, 0xd6, 0x02, 0xbf,
- 0xe6, 0xd0, 0xfd, 0xbc, 0x07, 0xde, 0x8e, 0x3d, 0xfa, 0x54, 0xae, 0xbd,
- 0x6f, 0x8c, 0x85, 0xbe, 0x48, 0x1e, 0x02, 0xbe, 0x1a, 0xbd, 0x66, 0xbe,
- 0x9c, 0xb0, 0x8a, 0xbe, 0xa8, 0x16, 0xd4, 0xbd, 0x95, 0x15, 0x37, 0x3f,
- 0x9a, 0x8a, 0x00, 0x3e, 0x6b, 0x17, 0x5f, 0x3d, 0x31, 0x37, 0x27, 0x3e,
- 0x29, 0x31, 0x11, 0x3e, 0x08, 0x05, 0xa8, 0xbc, 0xad, 0x75, 0x14, 0xbd,
- 0xac, 0x55, 0x3e, 0xbf, 0x79, 0x88, 0x22, 0x3e, 0xcb, 0xbb, 0x16, 0xbf,
- 0xbd, 0x8d, 0x08, 0x3e, 0x1a, 0x39, 0x19, 0xbe, 0x3b, 0x87, 0x60, 0xbe,
- 0x92, 0x1c, 0x12, 0xbf, 0x71, 0x60, 0x20, 0xbf, 0x40, 0x78, 0x5e, 0x3e,
- 0x5f, 0x8d, 0x18, 0xbf, 0x85, 0x80, 0xde, 0xbc, 0xc1, 0x67, 0x04, 0xbd,
- 0x51, 0x16, 0xf9, 0x3d, 0x16, 0x00, 0x53, 0x3d, 0x0e, 0xe5, 0xe7, 0xbc,
- 0x34, 0xbc, 0x01, 0xbe, 0x38, 0xa5, 0xcf, 0x3c, 0x9f, 0xda, 0x06, 0xbe,
- 0x0f, 0x23, 0xc4, 0x3e, 0xa0, 0x6d, 0x22, 0x3e, 0x65, 0x16, 0x67, 0xbe,
- 0x83, 0x5c, 0x79, 0x3e, 0x9b, 0x85, 0xb8, 0x3b, 0x40, 0x04, 0x95, 0x3d,
- 0x8f, 0x26, 0xac, 0xbe, 0xe6, 0xa0, 0x9a, 0xbe, 0x19, 0x89, 0xb5, 0x3e,
- 0xdb, 0xb9, 0x28, 0x3c, 0xf7, 0xd3, 0xa4, 0xbc, 0x9d, 0x1e, 0x83, 0xbe,
- 0x5d, 0x53, 0xbc, 0xbd, 0xe9, 0x4d, 0xf8, 0xbe, 0xad, 0x31, 0x0f, 0xbd,
- 0x41, 0x4e, 0x80, 0xbd, 0x31, 0x2e, 0x4f, 0xbe, 0xc5, 0xb6, 0xa6, 0x3d,
- 0x00, 0xd4, 0x90, 0xbe, 0x30, 0xf2, 0x49, 0xbe, 0x77, 0xa7, 0x71, 0x3e,
- 0xd9, 0x81, 0xe1, 0xbd, 0x0f, 0x05, 0x79, 0xbe, 0xa6, 0xdf, 0xae, 0xbd,
- 0xd2, 0x92, 0x1b, 0xbf, 0x9f, 0x0a, 0x2a, 0xbe, 0x6c, 0xcb, 0xc4, 0xbd,
- 0xa4, 0xd0, 0x67, 0xbe, 0x91, 0xb5, 0xdc, 0xbe, 0x59, 0xeb, 0xb1, 0xbd,
- 0x48, 0x07, 0xbd, 0x3e, 0xd6, 0x59, 0xac, 0x3e, 0x0f, 0x67, 0x62, 0xbe,
- 0x7d, 0x45, 0x06, 0x3e, 0x5e, 0x34, 0x8d, 0x3e, 0xaf, 0xdd, 0x8b, 0xbd,
- 0x13, 0x71, 0x93, 0x3d, 0x2b, 0x0c, 0xaa, 0xbd, 0xf9, 0x8d, 0x18, 0xbf,
- 0x05, 0x26, 0x3f, 0x3e, 0xaf, 0xc5, 0x2a, 0xbe, 0x45, 0x79, 0xde, 0xbe,
- 0xa7, 0x7a, 0xe1, 0xbd, 0xee, 0x83, 0x42, 0xbd, 0xe7, 0x18, 0xb2, 0xbe,
- 0x8c, 0x4e, 0x69, 0xbf, 0xec, 0xb7, 0x8a, 0xbe, 0xa4, 0x39, 0x0a, 0xbd,
- 0x9b, 0xbd, 0xbf, 0x3d, 0x2f, 0x40, 0x88, 0xbd, 0xa6, 0x0d, 0x87, 0x3e,
- 0x5a, 0xe2, 0xc0, 0x3d, 0x58, 0xa3, 0xa5, 0x3e, 0x2d, 0x27, 0xad, 0xbe,
- 0x89, 0x21, 0xf4, 0xbd, 0x8b, 0x2e, 0x6b, 0xbf, 0xbf, 0x9c, 0xfa, 0xbe,
- 0xb2, 0x32, 0x9c, 0xbd, 0xc6, 0xf4, 0x47, 0x3e, 0x3c, 0xf7, 0x52, 0xbe,
- 0xdb, 0x85, 0x7e, 0x3e, 0x76, 0x06, 0xb3, 0x3e, 0xd1, 0x20, 0x15, 0xbc,
- 0x8a, 0xdf, 0xd6, 0xbe, 0x7d, 0xa9, 0xd5, 0x3e, 0x04, 0x63, 0x70, 0x3d,
- 0x49, 0x33, 0x14, 0x3e, 0xa9, 0xa1, 0x1c, 0x3d, 0x8a, 0xa2, 0xce, 0xbd,
- 0x0e, 0x72, 0x19, 0xbe, 0x6e, 0x51, 0x41, 0xbe, 0x7a, 0x99, 0x62, 0xbd,
- 0x1a, 0x40, 0x1a, 0xbc, 0xda, 0x07, 0x45, 0xbe, 0x95, 0xe8, 0x15, 0x3e,
- 0xbb, 0x69, 0x18, 0x3d, 0x3f, 0x4b, 0x90, 0x3e, 0x48, 0x2e, 0x9c, 0xbb,
- 0x0d, 0x64, 0x13, 0xbf, 0x9e, 0x4d, 0x73, 0x3e, 0xa8, 0x6d, 0xea, 0xbd,
- 0x47, 0xce, 0x05, 0x3e, 0x33, 0x6e, 0x08, 0x3e, 0xbd, 0x8e, 0xd0, 0xbe,
- 0x40, 0x6b, 0x39, 0xbd, 0x7a, 0xec, 0x55, 0x3e, 0xaa, 0x57, 0x17, 0x3d,
- 0xf5, 0xcc, 0xe5, 0x3d, 0x56, 0x71, 0x7c, 0x3e, 0x10, 0xd1, 0xcc, 0x3e,
- 0xb8, 0x6f, 0xa3, 0xbd, 0x39, 0x52, 0x1a, 0x3c, 0xbe, 0x50, 0x32, 0xbf,
- 0x95, 0xa4, 0x71, 0x3e, 0x14, 0x24, 0x0a, 0xbf, 0xe1, 0xc8, 0xaa, 0x3e,
- 0x60, 0x8d, 0x75, 0x3e, 0xd2, 0x74, 0x0a, 0xbf, 0xef, 0xaa, 0xb7, 0x3c,
- 0x11, 0x0d, 0x49, 0xbe, 0x44, 0xa9, 0xca, 0x3d, 0xe7, 0x6f, 0x13, 0x3e,
- 0x3f, 0xf2, 0xcf, 0xbd, 0xb0, 0xf0, 0xa1, 0xbe, 0x51, 0xb1, 0x8c, 0x3c,
- 0x01, 0xe6, 0x6f, 0xbe, 0x86, 0x63, 0x92, 0x3e, 0x38, 0x9e, 0x42, 0x3d,
- 0x8e, 0x42, 0x62, 0x3e, 0xe2, 0xd3, 0xde, 0x3d, 0x3a, 0xc7, 0x22, 0xbe,
- 0xc4, 0x56, 0xef, 0x3d, 0x0a, 0x27, 0x3a, 0x3e, 0x59, 0x23, 0x3d, 0xbc,
- 0x5b, 0xc5, 0x9b, 0x3e, 0xe1, 0x4f, 0xaa, 0x3e, 0xda, 0x09, 0x51, 0x3e,
- 0x9f, 0x47, 0xc4, 0xbd, 0x2d, 0x2d, 0x72, 0xbd, 0x9b, 0xbf, 0x74, 0xbd,
- 0x97, 0x6b, 0xa0, 0x3c, 0xfe, 0xc3, 0xd7, 0x3e, 0xf1, 0x2c, 0xda, 0x3e,
- 0x96, 0x43, 0x12, 0xbd, 0xf7, 0x7d, 0x9b, 0xbd, 0xa1, 0xfc, 0xae, 0x3d,
- 0xdd, 0x30, 0xf3, 0xbd, 0x5a, 0x75, 0x65, 0x3e, 0x4a, 0x25, 0xaa, 0xbd,
- 0x5c, 0x14, 0xeb, 0x3d, 0xe1, 0x1d, 0xa8, 0x3d, 0x31, 0xc1, 0xbc, 0x3e,
- 0xf1, 0x8a, 0xa0, 0xbc, 0x4e, 0x79, 0x25, 0x3d, 0x22, 0x68, 0x4b, 0x3e,
- 0xc1, 0xa6, 0x87, 0xbe, 0x90, 0x73, 0xa5, 0xbd, 0x91, 0xf7, 0xf0, 0x3b,
- 0x43, 0xd6, 0x0b, 0xbe, 0x3e, 0xda, 0x3c, 0xbe, 0xd8, 0x21, 0xaa, 0xbd,
- 0x08, 0xbf, 0x81, 0x3e, 0xdf, 0xcb, 0x41, 0x3d, 0xa5, 0xf8, 0xec, 0x3e,
- 0xa7, 0x66, 0x31, 0x3e, 0x61, 0x81, 0x3e, 0x3f, 0xac, 0xfb, 0x81, 0x3d,
- 0x55, 0xd3, 0x96, 0x3d, 0x81, 0x09, 0xb6, 0x3e, 0x67, 0x76, 0xcf, 0x3e,
- 0x33, 0x81, 0x9a, 0x3e, 0xe0, 0x59, 0x09, 0xbe, 0x1d, 0x8d, 0x2a, 0x3e,
- 0xeb, 0x8a, 0x29, 0xbe, 0x95, 0xd6, 0x78, 0x3e, 0x35, 0x87, 0x11, 0xbe,
- 0xa1, 0xce, 0x86, 0xbe, 0xac, 0x18, 0xf8, 0xbe, 0xba, 0x94, 0x14, 0x3e,
- 0x62, 0xfa, 0xd5, 0xbe, 0xe1, 0xfc, 0x9c, 0xbe, 0xc7, 0x1e, 0x78, 0x3e,
- 0xd7, 0x8a, 0x93, 0xbd, 0x31, 0x87, 0x02, 0xbe, 0xe5, 0x15, 0x78, 0x3e,
- 0x3f, 0x3d, 0xae, 0x3e, 0xd9, 0x37, 0xa0, 0xbd, 0x42, 0x9b, 0x87, 0xbe,
- 0xe0, 0xe9, 0x52, 0x3e, 0xeb, 0xf9, 0x40, 0xbe, 0xdb, 0x14, 0x6c, 0x3d,
- 0xf2, 0x5b, 0x6c, 0xbd, 0x53, 0x72, 0x7d, 0xbe, 0x8e, 0xd9, 0x35, 0xbd,
- 0xc9, 0x08, 0xa2, 0xbd, 0x1c, 0xe5, 0x02, 0xbe, 0xc4, 0x08, 0x84, 0x3e,
- 0xec, 0xdb, 0x16, 0x3e, 0xeb, 0x1f, 0xbb, 0xbe, 0x86, 0x74, 0x0c, 0x3d,
- 0xfe, 0x6c, 0x2e, 0x3e, 0x57, 0x0b, 0x16, 0xbd, 0x48, 0x02, 0xd7, 0x3d,
- 0x6f, 0x63, 0x0c, 0xbd, 0x0c, 0xa0, 0x4a, 0xbb, 0x2f, 0x79, 0x94, 0xbe,
- 0x7c, 0x05, 0x24, 0xbe, 0xae, 0x5a, 0x4a, 0x3e, 0xe9, 0x5c, 0xf7, 0xbc,
- 0xf3, 0x3e, 0x60, 0x3e, 0x05, 0x96, 0xf4, 0xbe, 0x72, 0xfc, 0x79, 0x3d,
- 0xf1, 0x19, 0x09, 0x3e, 0x3f, 0x05, 0x42, 0xbe, 0x28, 0x3e, 0x7d, 0xbd,
- 0x19, 0xc9, 0x12, 0xbe, 0xc3, 0x9c, 0x4c, 0x3e, 0x1d, 0x38, 0x5b, 0xbe,
- 0x5e, 0x1e, 0x1f, 0x3e, 0x5f, 0x8e, 0x6e, 0x3e, 0x96, 0x04, 0x76, 0x3e,
- 0xcd, 0xb9, 0x09, 0x3e, 0x54, 0xee, 0x51, 0xbe, 0x68, 0xf2, 0xe1, 0xbd,
- 0xa8, 0xdb, 0x42, 0x3e, 0x01, 0x65, 0xb6, 0xba, 0x77, 0x7f, 0xd2, 0xbe,
- 0x15, 0x9b, 0x65, 0x3e, 0xac, 0x73, 0xc3, 0xbd, 0x7a, 0x8e, 0xfd, 0xbe,
- 0xb3, 0x76, 0xe1, 0x3d, 0x07, 0xc8, 0xa3, 0xbb, 0xfa, 0x74, 0x24, 0x3e,
- 0xe4, 0xa3, 0xcd, 0xbe, 0xf9, 0x54, 0x8e, 0x3e, 0x36, 0x97, 0xba, 0xbe,
- 0xe7, 0x40, 0xd1, 0x3e, 0x59, 0x1f, 0x5d, 0xbe, 0x7e, 0x11, 0x3f, 0xbe,
- 0x6c, 0xa7, 0xaa, 0x3e, 0xae, 0xf6, 0x91, 0xbe, 0xf7, 0x75, 0x05, 0xbf,
- 0xc7, 0x1f, 0x0c, 0x3f, 0x15, 0x8b, 0x45, 0xbe, 0xbe, 0xf1, 0x2d, 0x3e,
- 0x32, 0x98, 0x0d, 0xbe, 0x01, 0x01, 0x93, 0x3d, 0x07, 0xb9, 0x05, 0xbe,
- 0x90, 0x3b, 0x99, 0x3d, 0x86, 0x14, 0xfb, 0xbe, 0x3a, 0x5f, 0x12, 0xbe,
- 0x8f, 0x9e, 0x59, 0xbe, 0x4a, 0x2c, 0xee, 0x3d, 0xc4, 0x7d, 0xe6, 0x3e,
- 0x9a, 0x1c, 0x25, 0xbf, 0xae, 0x12, 0xf3, 0xbc, 0x04, 0x5b, 0x40, 0xbe,
- 0x62, 0x94, 0x26, 0x3e, 0x3c, 0x12, 0x4c, 0xbe, 0x65, 0xd8, 0xfc, 0xbd,
- 0x4b, 0x24, 0x1a, 0x3e, 0x5b, 0x9d, 0x2a, 0x3e, 0x20, 0xf5, 0xb2, 0x3e,
- 0x7b, 0xa3, 0x0d, 0x3f, 0x68, 0x6a, 0x2c, 0x3e, 0xfd, 0xc5, 0x47, 0x3c,
- 0xb4, 0xe0, 0x9e, 0x3e, 0x71, 0xac, 0x05, 0xbe, 0x1a, 0xfc, 0xac, 0x3a,
- 0x27, 0x96, 0xa7, 0x3c, 0xfb, 0x8a, 0x83, 0xbe, 0x15, 0x0e, 0x0c, 0x3d,
- 0xae, 0x3f, 0x30, 0x3e, 0x74, 0x72, 0x85, 0x3e, 0x1f, 0x21, 0x50, 0xbe,
- 0x7f, 0x48, 0xfb, 0x3d, 0xb9, 0x69, 0x83, 0x3e, 0x66, 0x41, 0x3b, 0xbe,
- 0x44, 0xfe, 0xc4, 0x3c, 0x27, 0x36, 0xe6, 0xbe, 0x94, 0xb0, 0x1d, 0x3e,
- 0xe9, 0x55, 0x51, 0x3e, 0x97, 0xd0, 0x59, 0xbe, 0x4e, 0x2d, 0x01, 0xbf,
- 0xfb, 0x47, 0x7f, 0xbd, 0xd5, 0x11, 0x06, 0x3e, 0x29, 0xc2, 0x11, 0xbf,
- 0x38, 0x2b, 0x38, 0x3e, 0x65, 0x9b, 0x46, 0x3e, 0x99, 0xb5, 0xcb, 0xbe,
- 0x7d, 0x74, 0xe4, 0xbc, 0x66, 0x72, 0x5c, 0x3d, 0x84, 0xd0, 0xfb, 0xbe,
- 0x27, 0x13, 0x86, 0xbd, 0x76, 0x83, 0x2e, 0xbc, 0x7b, 0xce, 0x23, 0x3d,
- 0x94, 0x7d, 0x6e, 0x3e, 0x76, 0xd2, 0x34, 0xbf, 0x10, 0x9a, 0x47, 0xbd,
- 0x46, 0xca, 0x8a, 0x3e, 0x85, 0x8c, 0xc6, 0x3d, 0x2e, 0xf0, 0x64, 0xbe,
- 0x45, 0x13, 0x6b, 0x3d, 0x40, 0x18, 0x6d, 0x3b, 0xd1, 0xdd, 0x20, 0x3f,
- 0xab, 0x95, 0x7c, 0x3e, 0x3e, 0x45, 0x72, 0x3d, 0x11, 0xdf, 0xad, 0x3d,
- 0xdb, 0xb1, 0x65, 0xbe, 0x4d, 0x9e, 0x5a, 0xbf, 0x2c, 0x2f, 0xa7, 0x3d,
- 0x49, 0xc7, 0xe2, 0x3e, 0x70, 0x3f, 0xc9, 0xbd, 0x55, 0x86, 0x71, 0x3e,
- 0x6f, 0x6d, 0x7e, 0x3e, 0x9a, 0x63, 0xb5, 0xbd, 0x0a, 0x1a, 0x10, 0xbf,
- 0x8b, 0xf0, 0xbb, 0x3e, 0x7b, 0xdb, 0xc7, 0xbb, 0xcb, 0x1d, 0xbf, 0xbe,
- 0xff, 0xb3, 0x1a, 0xbe, 0x74, 0x07, 0x8b, 0xbe, 0xd9, 0x0f, 0x4e, 0xbd,
- 0xdc, 0x34, 0x4b, 0xbd, 0x88, 0x16, 0x29, 0xbe, 0x0c, 0xff, 0x30, 0x3d,
- 0x14, 0xff, 0x9e, 0xbe, 0xf6, 0x98, 0x3e, 0xbe, 0xf4, 0x7a, 0x23, 0xbe,
- 0x78, 0x82, 0xed, 0xbd, 0xa0, 0xcf, 0xab, 0xbe, 0xa9, 0x30, 0x18, 0xbe,
- 0xba, 0x8c, 0x72, 0xbe, 0x25, 0xe0, 0x9e, 0xbc, 0x85, 0x86, 0x0a, 0x3c,
- 0xea, 0x5c, 0x94, 0x3e, 0x0f, 0x17, 0x37, 0xbe, 0x20, 0x49, 0x8c, 0xbe,
- 0xbb, 0x8e, 0x71, 0xbc, 0xa3, 0x06, 0xb4, 0x3e, 0x78, 0xad, 0xbd, 0x3d,
- 0x7b, 0xbb, 0x00, 0x3c, 0x19, 0x93, 0x10, 0x3d, 0x1f, 0xab, 0x54, 0xbe,
- 0x22, 0x28, 0xba, 0xbd, 0xd3, 0x8e, 0x80, 0x3e, 0x83, 0x9e, 0x0c, 0x3e,
- 0xe8, 0x68, 0xed, 0xbd, 0xe7, 0x90, 0x97, 0x3d, 0x87, 0x54, 0xae, 0x3e,
- 0xbb, 0x26, 0x8c, 0xbd, 0x36, 0x83, 0xde, 0x3e, 0x5e, 0x33, 0x1e, 0xbe,
- 0x8b, 0x75, 0xc3, 0xbe, 0x2c, 0xd3, 0x01, 0xbf, 0x55, 0x20, 0x3d, 0xbe,
- 0x19, 0x16, 0x1e, 0xbe, 0x10, 0x60, 0xde, 0x3d, 0x52, 0x6e, 0xf5, 0x3d,
- 0xea, 0x6b, 0xb8, 0x3e, 0x8e, 0xf1, 0x22, 0x3e, 0x6d, 0x70, 0xe6, 0xbd,
- 0x16, 0x2b, 0xc9, 0xbe, 0x08, 0x5e, 0x6c, 0xbe, 0x52, 0x40, 0x7b, 0x3e,
- 0xfd, 0x80, 0x31, 0x3d, 0x46, 0x21, 0xd9, 0x3d, 0x13, 0x74, 0xd7, 0xbe,
- 0x43, 0x6e, 0xdb, 0xbd, 0xaa, 0x31, 0x7b, 0x3e, 0x47, 0xf8, 0x28, 0xbe,
- 0xa7, 0x3e, 0x68, 0xbd, 0x66, 0x30, 0xf5, 0x3d, 0x8a, 0x2c, 0x04, 0x3c,
- 0xfb, 0xd1, 0x53, 0xbd, 0x0c, 0xaa, 0x29, 0xbe, 0x28, 0x5e, 0xf9, 0xbb,
- 0x30, 0x48, 0x05, 0xbe, 0x75, 0xbd, 0x1a, 0xbf, 0x2c, 0x4f, 0x07, 0xbf,
- 0xbf, 0x6c, 0xeb, 0xbd, 0xa9, 0x06, 0xb8, 0x3e, 0xdc, 0x89, 0xbf, 0xbd,
- 0x83, 0xbe, 0x37, 0xbe, 0x85, 0xa6, 0x1b, 0xbe, 0x1b, 0x1b, 0x27, 0x3e,
- 0xfa, 0x4d, 0x91, 0x3d, 0x0d, 0x3f, 0xad, 0x3e, 0x24, 0xff, 0x41, 0x3e,
- 0x8c, 0x78, 0xd4, 0x3e, 0x8a, 0x9f, 0x98, 0xbd, 0x6a, 0x2d, 0x21, 0x3e,
- 0x6e, 0x3e, 0xac, 0x3e, 0x43, 0xf4, 0x19, 0xbf, 0x6b, 0x45, 0xd5, 0xbe,
- 0xe1, 0x15, 0x08, 0xbd, 0xf6, 0x45, 0x98, 0xbd, 0xa4, 0x18, 0x00, 0xbd,
- 0x46, 0x26, 0x85, 0x3e, 0xf4, 0x83, 0xec, 0xbd, 0xf8, 0xdf, 0x1a, 0x3e,
- 0x8d, 0xa9, 0x02, 0xbc, 0xd2, 0x15, 0x97, 0x3e, 0xfe, 0xef, 0x0c, 0xbf,
- 0x61, 0x68, 0x2b, 0xbd, 0x27, 0x98, 0xab, 0xbd, 0xf3, 0x21, 0x77, 0x3e,
- 0x49, 0x28, 0x14, 0x3e, 0xea, 0xf7, 0x4f, 0xbe, 0x80, 0x5b, 0xc4, 0xbd,
- 0x9b, 0xb1, 0x4d, 0xbe, 0x01, 0xef, 0x2b, 0x3e, 0xbe, 0xa1, 0xb7, 0xbe,
- 0x40, 0x00, 0xf6, 0x3d, 0x61, 0x0f, 0x36, 0xbe, 0x8d, 0xf5, 0x46, 0x3e,
- 0x9f, 0x8e, 0x1c, 0x3e, 0x4e, 0x69, 0x52, 0x3e, 0xc2, 0xdd, 0x54, 0xbe,
- 0x60, 0xdc, 0x16, 0xbf, 0xac, 0xe5, 0x58, 0xbf, 0xb5, 0xf1, 0x83, 0x3d,
- 0x67, 0x7e, 0x77, 0xbd, 0xfe, 0x4b, 0x2a, 0xbe, 0x90, 0xe0, 0x12, 0x3e,
- 0x1f, 0x29, 0x1f, 0x3e, 0x54, 0x1b, 0x65, 0x3d, 0xf4, 0xe8, 0x0c, 0xbe,
- 0xab, 0xf2, 0x6d, 0xbe, 0xfc, 0xa4, 0x07, 0xbe, 0x4c, 0xb2, 0x3f, 0xbc,
- 0xfb, 0x36, 0xa7, 0xbe, 0x60, 0xaf, 0x74, 0xbe, 0xfd, 0x73, 0xb1, 0x3e,
- 0x8c, 0xc3, 0x9e, 0x3b, 0xb6, 0x7b, 0x14, 0x3f, 0x11, 0x5d, 0x23, 0x3e,
- 0x5c, 0xd0, 0x18, 0xbc, 0xda, 0xa3, 0x43, 0xbe, 0x13, 0x44, 0x7a, 0xbe,
- 0x17, 0x91, 0x09, 0xbd, 0x83, 0x40, 0xb7, 0x3e, 0x0e, 0xb0, 0xb7, 0x3e,
- 0x83, 0xd7, 0xe6, 0xbe, 0x9a, 0x4a, 0x1a, 0x3e, 0x4f, 0xbf, 0x90, 0xbe,
- 0xc4, 0xb3, 0xcb, 0xbc, 0x7d, 0xc7, 0x7c, 0x3e, 0x21, 0x1a, 0x6c, 0x3e,
- 0x90, 0x71, 0x28, 0x3c, 0xc4, 0xe0, 0xb2, 0xbd, 0x51, 0x2c, 0x5f, 0xbe,
- 0xd4, 0x6a, 0x24, 0xbf, 0xb8, 0xe9, 0x42, 0xbd, 0x01, 0x79, 0x86, 0xbd,
- 0x34, 0xe6, 0xb3, 0xbe, 0x03, 0x2d, 0xd8, 0x3c, 0xd6, 0x3b, 0xe5, 0x3d,
- 0xa9, 0xee, 0xbf, 0x3e, 0xc1, 0xb7, 0x9f, 0xbe, 0x7a, 0x0b, 0x79, 0xbe,
- 0x69, 0xbf, 0x15, 0x3e, 0x1a, 0x9f, 0x42, 0xbf, 0xe6, 0xf7, 0x41, 0x3e,
- 0xee, 0x29, 0x66, 0xbe, 0x82, 0xc7, 0x57, 0x3e, 0xa0, 0xbb, 0x51, 0xbd,
- 0xc1, 0x06, 0x9a, 0xbe, 0x5c, 0x2d, 0x88, 0xbd, 0x83, 0x91, 0x73, 0x3e,
- 0xd6, 0xc1, 0x2f, 0xbe, 0x6b, 0xb6, 0xcc, 0x3e, 0x86, 0x64, 0x84, 0x3e,
- 0x3c, 0x18, 0x62, 0x3d, 0x99, 0x84, 0x3c, 0x3c, 0x99, 0x23, 0x65, 0xbe,
- 0xd7, 0x35, 0x2e, 0x3e, 0x74, 0x4f, 0x00, 0x3d, 0x53, 0xa2, 0x58, 0xbe,
- 0x59, 0xee, 0x71, 0x3d, 0x4b, 0xc6, 0xae, 0xbd, 0x3a, 0x29, 0x62, 0xbe,
- 0x4c, 0x8e, 0x3b, 0xbd, 0x3a, 0x44, 0x9c, 0x3e, 0x47, 0x7e, 0x74, 0xbe,
- 0xe7, 0x77, 0x06, 0xbe, 0x5d, 0xba, 0x77, 0xbe, 0x1d, 0x04, 0xa0, 0x3e,
- 0xfb, 0xc8, 0xc7, 0x3e, 0xdc, 0x40, 0x1e, 0xbd, 0x06, 0x44, 0x07, 0x3d,
- 0xae, 0xd8, 0x90, 0xbe, 0x17, 0xeb, 0x89, 0xbd, 0x65, 0x63, 0x34, 0x3e,
- 0x4c, 0xfe, 0xa4, 0xbd, 0x35, 0xcf, 0xc6, 0x3d, 0x68, 0x04, 0x6f, 0xbc,
- 0xbc, 0xc6, 0xed, 0x3d, 0x02, 0x23, 0x2e, 0xbe, 0x31, 0x7a, 0x58, 0x3e,
- 0x0a, 0x1f, 0xdf, 0xbe, 0xc4, 0xf8, 0x89, 0xbe, 0x5a, 0x9f, 0xab, 0xbe,
- 0x19, 0x88, 0x12, 0xbd, 0xac, 0x6a, 0xf3, 0xbd, 0xdb, 0xe2, 0x94, 0x3e,
- 0x01, 0x2e, 0x0d, 0xbe, 0x6b, 0xe5, 0xb9, 0xbd, 0xc7, 0x6a, 0x85, 0xbd,
- 0x47, 0x24, 0xef, 0x3c, 0x90, 0x3a, 0x6a, 0xbc, 0xbd, 0xc6, 0x41, 0x3d,
- 0x2d, 0xdc, 0x6a, 0x3e, 0x1c, 0x7d, 0x8b, 0x3d, 0x7e, 0xb6, 0x0f, 0x3e,
- 0x15, 0x40, 0x5e, 0x3e, 0xf2, 0x54, 0x1f, 0xbf, 0x80, 0x33, 0x6e, 0xbe,
- 0x30, 0x21, 0xe1, 0x3d, 0xb3, 0x5e, 0x9e, 0xb9, 0x68, 0x0a, 0xaf, 0x3e,
- 0x21, 0xb6, 0xb2, 0xbc, 0x86, 0x52, 0xcf, 0xbe, 0x23, 0x69, 0xa6, 0x3e,
- 0x31, 0x60, 0xd5, 0xbd, 0xcb, 0x6e, 0xa8, 0xbd, 0xb8, 0xbb, 0x8f, 0x3e,
- 0x47, 0xb4, 0xf2, 0xbd, 0x32, 0x66, 0xf9, 0x3d, 0x8e, 0x40, 0x32, 0xbe,
- 0xf0, 0x44, 0x0a, 0xbe, 0x01, 0x5b, 0xb4, 0x3d, 0x18, 0xda, 0x84, 0xbe,
- 0x43, 0xac, 0x4c, 0x3d, 0xf2, 0x84, 0xb9, 0x3e, 0xd1, 0x8d, 0x20, 0x3e,
- 0x29, 0x5e, 0x9c, 0xbe, 0xe1, 0xb2, 0xa0, 0x3d, 0xfa, 0xc4, 0xd1, 0x3e,
- 0xfe, 0x02, 0xd0, 0xbe, 0xed, 0x86, 0xb4, 0xbe, 0x94, 0xe0, 0x8d, 0xbe,
- 0x7b, 0x68, 0xde, 0xbd, 0xad, 0x13, 0x07, 0x3d, 0x7c, 0xc6, 0x29, 0x3e,
- 0x1f, 0xa6, 0xdb, 0x3d, 0x5a, 0x7b, 0xcd, 0xbd, 0x44, 0x79, 0xe3, 0x3d,
- 0x9e, 0x14, 0x28, 0xbe, 0x74, 0xd1, 0xc0, 0xbc, 0x8e, 0x48, 0x82, 0x3e,
- 0x3d, 0x35, 0x5f, 0x3d, 0x77, 0xaa, 0x2c, 0x3e, 0x7d, 0xd8, 0x03, 0xbe,
- 0x2f, 0x5e, 0x95, 0xbe, 0x03, 0xbb, 0x0c, 0x3e, 0xba, 0xb4, 0xc8, 0xbe,
- 0x74, 0xfd, 0xa1, 0xbd, 0xcb, 0x90, 0xf7, 0xbe, 0xc5, 0xcc, 0xd4, 0x3d,
- 0xa2, 0x71, 0x41, 0x3e, 0x81, 0xe3, 0x01, 0xbe, 0x92, 0xfb, 0xf5, 0xbe,
- 0xb3, 0x4a, 0xb6, 0xbe, 0x16, 0x6e, 0xa2, 0x3e, 0x29, 0x19, 0x38, 0x3d,
- 0xe0, 0xd6, 0x60, 0x3e, 0x29, 0x04, 0x8e, 0x3d, 0x90, 0x16, 0xcb, 0xbe,
- 0x5c, 0x70, 0xce, 0xbd, 0xf1, 0x9f, 0xb3, 0x3d, 0xa5, 0x88, 0x5b, 0x3d,
- 0x61, 0x0d, 0x09, 0x3e, 0x76, 0x26, 0x19, 0xbe, 0xad, 0x24, 0x8e, 0xbd,
- 0x7b, 0xba, 0x8c, 0x3e, 0xa9, 0x82, 0xab, 0xbe, 0x6c, 0x89, 0xa1, 0xbe,
- 0x6b, 0x0a, 0x9b, 0xbe, 0x08, 0xa7, 0xa2, 0xbe, 0x89, 0x31, 0xc0, 0xbe,
- 0x47, 0x21, 0x1c, 0xbd, 0x4e, 0xcf, 0x27, 0xbd, 0xd8, 0xbd, 0x87, 0x3e,
- 0xcf, 0x73, 0x01, 0x3e, 0xda, 0x7f, 0xa7, 0x3d, 0x82, 0xe2, 0x96, 0x3d,
- 0xf5, 0xbd, 0x4c, 0xbf, 0x24, 0x2a, 0x4a, 0xbc, 0x6a, 0x07, 0x3e, 0x3d,
- 0xd6, 0xaf, 0x68, 0x3e, 0xa1, 0xcf, 0x46, 0xbe, 0xb5, 0xf1, 0x2a, 0xbd,
- 0xde, 0x1e, 0x1e, 0xbf, 0x4d, 0x97, 0xd9, 0x3e, 0x81, 0x66, 0xc6, 0xbd,
- 0xf6, 0x1e, 0x22, 0xbf, 0xbc, 0x02, 0x94, 0x3d, 0x09, 0x8d, 0xcf, 0xbe,
- 0x65, 0x79, 0x34, 0xbf, 0x52, 0xf4, 0x37, 0xbf, 0xbb, 0xff, 0x91, 0xbe,
- 0x6a, 0x8c, 0xaa, 0xbe, 0x21, 0xee, 0xcc, 0xbe, 0xc3, 0x5d, 0x1c, 0xbf,
- 0x01, 0x55, 0xd5, 0x3d, 0xdf, 0x97, 0xb8, 0x3d, 0xba, 0xab, 0x55, 0x3e,
- 0xe8, 0x1f, 0x4d, 0xbe, 0x99, 0xfa, 0xe0, 0xbe, 0xb6, 0xf2, 0xfb, 0xbe,
- 0xa0, 0x22, 0x62, 0xbf, 0x1b, 0x56, 0x90, 0xbc, 0x0a, 0xe0, 0xe7, 0x3d,
- 0x3a, 0x76, 0x45, 0xbd, 0xf1, 0x4a, 0x83, 0xbd, 0x58, 0x12, 0x1d, 0x3e,
- 0x60, 0x59, 0x7d, 0xbe, 0xe8, 0x12, 0xfc, 0x3d, 0x46, 0x57, 0x9a, 0x3e,
- 0x34, 0x14, 0x69, 0xbd, 0xc5, 0xb3, 0x51, 0x3e, 0x54, 0xa8, 0xaa, 0xbe,
- 0x58, 0x39, 0x87, 0x3e, 0x19, 0xa7, 0xad, 0x3e, 0x2b, 0x77, 0xb2, 0xbd,
- 0x97, 0x38, 0xc1, 0xbd, 0xc6, 0xde, 0xd0, 0x3b, 0x81, 0x38, 0x92, 0x3d,
- 0x95, 0xe5, 0xed, 0xbd, 0x1d, 0x89, 0x8a, 0x3e, 0xf6, 0x67, 0x94, 0xbe,
- 0xd5, 0x39, 0x99, 0xbe, 0xc1, 0xc3, 0x7c, 0xbc, 0x81, 0x8b, 0xd1, 0xbd,
- 0xd7, 0xdb, 0x58, 0xbe, 0x14, 0x70, 0x92, 0x3e, 0x93, 0xe4, 0x09, 0xbf,
- 0x4b, 0x57, 0x1b, 0xbe, 0xca, 0x7a, 0xca, 0x3e, 0xeb, 0x90, 0x7b, 0xbd,
- 0x50, 0x5f, 0x32, 0x3e, 0x4b, 0x29, 0x18, 0xbe, 0xa5, 0x5a, 0x6f, 0xbe,
- 0x00, 0xb6, 0x97, 0xbe, 0x8b, 0x5f, 0x92, 0x3e, 0x78, 0x01, 0xba, 0xbd,
- 0xaa, 0x73, 0x9c, 0x3e, 0xcf, 0x06, 0x5a, 0xbf, 0xed, 0x85, 0x6b, 0xbe,
- 0x30, 0x93, 0x03, 0xbe, 0xbf, 0x6a, 0x7a, 0x3e, 0xf1, 0x03, 0x94, 0xbe,
- 0x69, 0xe0, 0x57, 0xbe, 0x5f, 0x50, 0x96, 0xbd, 0x6f, 0x50, 0x62, 0xbe,
- 0x2d, 0x24, 0xa3, 0x3d, 0xd8, 0x26, 0x32, 0x3f, 0x47, 0x53, 0x8d, 0xbe,
- 0xe8, 0x35, 0x6d, 0xbe, 0x3a, 0x9f, 0x02, 0x3e, 0x48, 0xad, 0x91, 0x3d,
- 0xee, 0x7c, 0xb5, 0x3b, 0xe1, 0xd7, 0x95, 0x3e, 0x68, 0x8b, 0xa1, 0x3c,
- 0x8b, 0x12, 0x26, 0xbe, 0x4f, 0x89, 0xad, 0xbe, 0x73, 0xc0, 0xbc, 0xbe,
- 0xac, 0x1a, 0x7f, 0x3e, 0x40, 0x28, 0x07, 0x3e, 0x15, 0xb3, 0xb7, 0xbc,
- 0x19, 0x1a, 0x31, 0x3c, 0xa9, 0xdb, 0x9e, 0x3d, 0x45, 0x5a, 0x51, 0x3e,
- 0xad, 0x42, 0x26, 0xbe, 0x5f, 0x74, 0x92, 0xbe, 0xa0, 0x7a, 0xc4, 0x3d,
- 0xb5, 0x1f, 0x87, 0xbd, 0x8e, 0x99, 0x2a, 0xbe, 0x2e, 0xf4, 0x89, 0xbd,
- 0x60, 0x97, 0xc5, 0xbd, 0x96, 0x49, 0xa5, 0x3e, 0xaf, 0xf6, 0x02, 0xbd,
- 0xe4, 0x0a, 0xf2, 0xbd, 0x5e, 0xaf, 0x3c, 0x3e, 0x65, 0x5f, 0x5f, 0x3e,
- 0xfd, 0x7b, 0x2f, 0x3e, 0xe5, 0x04, 0x6e, 0x3e, 0xb8, 0x6c, 0x69, 0x3d,
- 0x45, 0x79, 0x49, 0x3e, 0x28, 0xf8, 0x07, 0xbe, 0xf6, 0xe0, 0x67, 0xbe,
- 0x3f, 0x46, 0x1f, 0xbe, 0xde, 0xfe, 0xb6, 0x3e, 0xe6, 0x7c, 0x01, 0xbe,
- 0xaf, 0x24, 0xf4, 0xbd, 0xc5, 0x47, 0x08, 0x3e, 0xb0, 0x9a, 0xd1, 0xbc,
- 0xcb, 0x5f, 0x37, 0xbe, 0x0e, 0xa8, 0x98, 0xbe, 0xf3, 0x27, 0x07, 0xbe,
- 0x05, 0xc8, 0xbe, 0xbe, 0x75, 0xfe, 0xde, 0xbe, 0xbe, 0x7b, 0xdd, 0xbd,
- 0x99, 0x1f, 0x82, 0x3e, 0x7e, 0x77, 0x90, 0x3c, 0x44, 0xbf, 0x52, 0x3e,
- 0x0c, 0xaa, 0xc0, 0x3e, 0x8b, 0xea, 0x3a, 0x3d, 0xed, 0xfa, 0x3d, 0x3e,
- 0x13, 0x49, 0x31, 0x3b, 0x54, 0xd7, 0xf6, 0xbd, 0xf6, 0xea, 0x26, 0xbe,
- 0x8d, 0x6d, 0x79, 0x3e, 0x74, 0xe2, 0x52, 0xbe, 0x51, 0xfd, 0x47, 0xbe,
- 0x10, 0x2a, 0xba, 0x3e, 0xbb, 0x81, 0x2e, 0xbe, 0x5e, 0x2f, 0x6f, 0xbe,
- 0xfa, 0x71, 0x37, 0xbe, 0x09, 0x0c, 0x09, 0xbf, 0xbd, 0xe6, 0xa4, 0x3d,
- 0x42, 0xe0, 0x0c, 0x3d, 0xd9, 0xb6, 0x53, 0xbe, 0xce, 0xa8, 0x71, 0x3e,
- 0x12, 0x45, 0xa6, 0xbe, 0x99, 0x38, 0x44, 0xbd, 0x10, 0x0f, 0x43, 0xbe,
- 0xc5, 0xa4, 0xc4, 0xbe, 0x5d, 0x95, 0xc1, 0xbe, 0x87, 0x69, 0x98, 0x3e,
- 0x2d, 0x0f, 0x23, 0xbe, 0xa0, 0x2f, 0xb1, 0xbc, 0x04, 0x4e, 0x1c, 0x3d,
- 0x4d, 0xed, 0x1f, 0xbe, 0x36, 0x7c, 0xe0, 0x3d, 0x65, 0x11, 0xb8, 0xbd,
- 0x58, 0xbe, 0x0c, 0xbd, 0x71, 0x4f, 0xaf, 0xbd, 0x57, 0x15, 0x79, 0x3e,
- 0xac, 0x4b, 0x3a, 0x3d, 0x54, 0x86, 0x53, 0x3e, 0x1a, 0x62, 0x8e, 0xbe,
- 0xdb, 0xff, 0xa6, 0x3d, 0x58, 0xaa, 0x84, 0x3e, 0x09, 0x65, 0xc5, 0xbe,
- 0x21, 0xf1, 0x8f, 0xbd, 0x90, 0x69, 0xb5, 0xbe, 0xc5, 0x7f, 0x29, 0xbe,
- 0x63, 0x07, 0x61, 0x3e, 0x11, 0xc3, 0xb8, 0xbd, 0x8a, 0x16, 0x90, 0xbe,
- 0xa3, 0x42, 0x13, 0xbe, 0x02, 0x56, 0xff, 0x3d, 0x22, 0x5b, 0x74, 0x3e,
- 0x6a, 0xb3, 0x02, 0xbf, 0xa7, 0xb3, 0x27, 0xbe, 0xa2, 0x84, 0x95, 0xbd,
- 0x39, 0x76, 0xd6, 0xbd, 0xc2, 0xd5, 0x09, 0x3c, 0xf2, 0x64, 0x7d, 0x3d,
- 0x92, 0xbc, 0xb1, 0xbe, 0x68, 0xad, 0x78, 0x3e, 0x8f, 0x14, 0x05, 0x3e,
- 0x12, 0x2e, 0x63, 0xbd, 0x5a, 0xfc, 0x88, 0xbe, 0x6d, 0xeb, 0x54, 0xbd,
- 0x83, 0xc9, 0x93, 0x3e, 0x49, 0xbd, 0x0d, 0xbb, 0xc0, 0x45, 0x18, 0xbf,
- 0x3a, 0xe3, 0xe9, 0xbe, 0x57, 0x22, 0x02, 0xbf, 0x59, 0x5f, 0xf4, 0x3e,
- 0x1d, 0x8e, 0xf3, 0x3d, 0x20, 0x97, 0xed, 0xbc, 0x1d, 0x3d, 0xc3, 0xbe,
- 0xc7, 0x05, 0xcf, 0x3e, 0xe4, 0x36, 0x73, 0x3d, 0x9b, 0x16, 0xff, 0xbc,
- 0xe4, 0x5b, 0xd1, 0x3e, 0x4a, 0x88, 0x49, 0x3e, 0xc5, 0x0b, 0x1c, 0x3d,
- 0x09, 0xe2, 0x18, 0x3f, 0x46, 0x0c, 0xbd, 0x3d, 0x16, 0x1e, 0x49, 0x3f,
- 0x45, 0x6e, 0xb7, 0xbe, 0xb1, 0x2b, 0x2e, 0x3e, 0x9b, 0x74, 0x54, 0xbe,
- 0x25, 0xf0, 0x23, 0xbf, 0x60, 0x1e, 0xc0, 0xbe, 0x7b, 0x19, 0xdd, 0xbe,
- 0x24, 0x5a, 0xe1, 0x3e, 0xe6, 0xef, 0xc0, 0x3e, 0xc6, 0x29, 0xef, 0x3c,
- 0xd0, 0x91, 0xa4, 0xbe, 0x66, 0x45, 0xde, 0x3e, 0xd2, 0x0c, 0x00, 0xbf,
- 0xfe, 0x7e, 0x79, 0xbe, 0xe7, 0xad, 0xc6, 0xbe, 0xdf, 0xdf, 0xf2, 0x3e,
- 0xa7, 0xfc, 0x23, 0x3e, 0x2b, 0x54, 0x39, 0xbf, 0x70, 0xf0, 0x92, 0x3e,
- 0x17, 0x75, 0x99, 0xbd, 0x7f, 0x94, 0xc8, 0x3c, 0x64, 0x9e, 0x31, 0xbf,
- 0xf2, 0xba, 0x0e, 0xbd, 0x80, 0x24, 0x13, 0xbd, 0x23, 0x66, 0x53, 0xbf,
- 0x5c, 0x00, 0xce, 0xbe, 0xc9, 0x8a, 0x80, 0xbe, 0x23, 0x9d, 0x3d, 0x3e,
- 0xb7, 0x5b, 0x1e, 0x3e, 0xdc, 0x9a, 0x52, 0x3e, 0x0b, 0x02, 0xba, 0x3e,
- 0x57, 0xc0, 0xd1, 0xbe, 0x92, 0xfe, 0x4e, 0xbe, 0x1b, 0x15, 0xa1, 0x3d,
- 0x3c, 0xbd, 0xcf, 0xbe, 0x17, 0xd4, 0x8d, 0x3d, 0x3b, 0x4f, 0x95, 0x3e,
- 0xbf, 0x07, 0x36, 0x3d, 0x08, 0xe9, 0xed, 0xbd, 0x8e, 0xb0, 0xae, 0xbd,
- 0x8e, 0x99, 0xa9, 0xbe, 0x38, 0x20, 0xb1, 0x3c, 0x5a, 0x3b, 0x8c, 0x3e,
- 0xd0, 0x78, 0xdd, 0xbe, 0x2a, 0xcd, 0x29, 0xbd, 0xcb, 0xc3, 0x01, 0x3f,
- 0x85, 0xb9, 0x4a, 0x3e, 0xae, 0x2a, 0x45, 0xbd, 0x78, 0x13, 0x2a, 0xbe,
- 0x28, 0x2c, 0xfb, 0x3d, 0x10, 0xe7, 0x21, 0xbd, 0x78, 0x7b, 0x38, 0x3e,
- 0x1f, 0xc9, 0x04, 0x3e, 0xef, 0xee, 0x24, 0x3d, 0x71, 0x35, 0x55, 0xbd,
- 0xf8, 0xad, 0x80, 0xbe, 0x4e, 0x12, 0x3e, 0xbd, 0x62, 0x73, 0x0a, 0x3e,
- 0xd0, 0x51, 0xdc, 0xbd, 0x0f, 0xf2, 0xf9, 0xbe, 0xc4, 0x42, 0x46, 0x3e,
- 0x6c, 0xcc, 0x0f, 0x3f, 0x53, 0xb3, 0xfb, 0x3e, 0x53, 0xa4, 0x11, 0xbd,
- 0xcd, 0xce, 0x97, 0x3e, 0x77, 0xe9, 0x8a, 0x3e, 0xac, 0xfa, 0xf4, 0xbd,
- 0x7b, 0xcb, 0xc3, 0xbe, 0x09, 0x08, 0x87, 0x3d, 0xe5, 0xd1, 0xbb, 0x3e,
- 0xa7, 0x4d, 0xff, 0xbd, 0x0b, 0xc5, 0x2c, 0xbf, 0x4d, 0xbb, 0xb0, 0xbe,
- 0x75, 0x50, 0xe8, 0xbc, 0x63, 0x31, 0x21, 0xbe, 0xb9, 0xb5, 0x28, 0xbe,
- 0x30, 0x75, 0x5e, 0x3e, 0x1a, 0x20, 0x55, 0x3e, 0x67, 0x8d, 0x5c, 0x3e,
- 0xb7, 0x39, 0x20, 0x3e, 0xe6, 0xdd, 0x4d, 0xbe, 0x35, 0x67, 0xa4, 0xbe,
- 0x2f, 0x56, 0xd8, 0xbd, 0xda, 0x86, 0x3e, 0xbe, 0xe5, 0xa3, 0xe8, 0xbe,
- 0x12, 0x43, 0x0a, 0xbf, 0x7d, 0x05, 0x15, 0x3f, 0xe1, 0xe8, 0x41, 0x3e,
- 0x20, 0x5b, 0x23, 0x3d, 0x71, 0x83, 0xdf, 0xbd, 0x76, 0x37, 0x96, 0x3e,
- 0x60, 0xdb, 0x31, 0xbe, 0x12, 0x9e, 0x7c, 0x3d, 0xe3, 0xf2, 0xdd, 0xbe,
- 0x03, 0xf0, 0xc7, 0xbe, 0x89, 0x8c, 0x0f, 0x3d, 0x2a, 0x50, 0x0d, 0xbd,
- 0xc7, 0x3a, 0xbc, 0xbe, 0x1c, 0x7e, 0xe4, 0x3b, 0xce, 0xc8, 0x82, 0x3e,
- 0xdf, 0xa3, 0xeb, 0x3d, 0x65, 0xab, 0x8a, 0x3e, 0x4f, 0xe8, 0x10, 0xbd,
- 0x1b, 0x39, 0x17, 0xbf, 0x89, 0xd2, 0x9c, 0x3d, 0x8a, 0xbd, 0xca, 0xbe,
- 0x78, 0xff, 0xed, 0xbe, 0xf3, 0xf9, 0x2b, 0xbf, 0x1f, 0x96, 0xa8, 0x3e,
- 0x63, 0x95, 0x66, 0x3e, 0x69, 0xfd, 0xa8, 0xbd, 0x79, 0x2e, 0x3a, 0x3e,
- 0xce, 0x1b, 0x3e, 0x3d, 0x5e, 0x19, 0x4c, 0xbd, 0x09, 0x5e, 0x15, 0xbb,
- 0xa5, 0x12, 0x5d, 0xbe, 0xae, 0xff, 0xb6, 0xbe, 0x29, 0x1c, 0xa4, 0xbd,
- 0x97, 0x91, 0x1f, 0xbe, 0xc2, 0xc6, 0x1e, 0xbe, 0xc8, 0x7b, 0x13, 0xbe,
- 0x76, 0x28, 0xbb, 0xbe, 0xae, 0x33, 0xc8, 0x3e, 0x44, 0x8e, 0x08, 0x3d,
- 0x03, 0xe8, 0x6b, 0x3d, 0x9a, 0x0f, 0x8f, 0x3e, 0x95, 0x0d, 0xbc, 0xbe,
- 0x27, 0x2a, 0xaa, 0xbe, 0x40, 0x0a, 0x24, 0xbd, 0x12, 0x8d, 0x19, 0xbe,
- 0xc2, 0xbb, 0x53, 0x3e, 0xd3, 0x45, 0x52, 0xbf, 0xc9, 0xef, 0xa7, 0x3e,
- 0xf4, 0x5c, 0x80, 0xbe, 0xe0, 0xca, 0x61, 0x3d, 0x3c, 0xbc, 0x0c, 0x3d,
- 0x94, 0x81, 0x19, 0xbf, 0x1b, 0x00, 0x76, 0x3e, 0x52, 0x3a, 0x9e, 0xbe,
- 0x3c, 0xb3, 0xb0, 0x3d, 0xf0, 0x2f, 0x98, 0xbe, 0xa7, 0xe0, 0xca, 0xbd,
- 0x98, 0xea, 0x35, 0xbf, 0x78, 0x0d, 0x00, 0xbf, 0x01, 0xc3, 0xab, 0xbe,
- 0x1e, 0x51, 0xf6, 0xbe, 0x59, 0x79, 0x95, 0xbb, 0x9e, 0x4d, 0x49, 0xbe,
- 0x37, 0x0b, 0x14, 0xbd, 0x1f, 0x54, 0x9e, 0x3e, 0xe5, 0xce, 0x2f, 0xbc,
- 0xd1, 0xb0, 0x1c, 0x3e, 0x7a, 0xea, 0x8a, 0xbe, 0x98, 0xaa, 0xbb, 0xbe,
- 0xb3, 0xc1, 0x7a, 0xbd, 0x37, 0x28, 0xcc, 0xbe, 0xbc, 0xa8, 0x36, 0xbe,
- 0x2b, 0x73, 0xcd, 0x3e, 0x62, 0x1d, 0xd4, 0xbe, 0xb6, 0x12, 0x3a, 0xbe,
- 0xb8, 0x4c, 0xd6, 0xbd, 0x63, 0x51, 0xce, 0x3e, 0x88, 0xec, 0x0f, 0x3e,
- 0xc4, 0xab, 0x81, 0xbe, 0x14, 0xb6, 0x07, 0xbe, 0x3c, 0x92, 0xdd, 0x3d,
- 0x7c, 0xe5, 0x1d, 0xbd, 0xd8, 0x88, 0xc4, 0xbe, 0xca, 0xeb, 0x11, 0xbf,
- 0xf4, 0xef, 0xfe, 0xbc, 0x4a, 0x87, 0x83, 0xbd, 0x82, 0x9c, 0x8d, 0xbe,
- 0x8b, 0xa2, 0xae, 0xbe, 0x69, 0xd3, 0x32, 0xbe, 0xde, 0xaa, 0x68, 0x3e,
- 0xf6, 0x30, 0xbc, 0xbd, 0x27, 0x84, 0xb7, 0xbd, 0xcc, 0xda, 0x44, 0xbe,
- 0x6e, 0xb8, 0x85, 0xbe, 0xaa, 0x90, 0xb7, 0x3e, 0xfe, 0x8b, 0x24, 0x3e,
- 0x8e, 0x97, 0x66, 0x3e, 0xe1, 0x93, 0x0c, 0x3d, 0xda, 0xf9, 0x25, 0xbd,
- 0xd8, 0x5e, 0x93, 0xbe, 0xac, 0x41, 0x06, 0x3e, 0xaa, 0xf6, 0x5e, 0xbe,
- 0xff, 0xac, 0x36, 0xbe, 0xca, 0x0e, 0x50, 0x3e, 0xfa, 0x1c, 0x47, 0x3d,
- 0xc3, 0x7d, 0x13, 0xbf, 0xf5, 0xe2, 0x74, 0x3e, 0xb6, 0x51, 0x1d, 0x3c,
- 0x25, 0xbc, 0x1b, 0xbe, 0xb6, 0xe7, 0x2b, 0xbf, 0xf2, 0xd3, 0xe0, 0x3e,
- 0x0c, 0x9e, 0x0c, 0xbe, 0x1c, 0xc8, 0x59, 0xbf, 0xda, 0x7f, 0x75, 0xbe,
- 0x58, 0x80, 0x4d, 0x3e, 0x50, 0x0f, 0xa3, 0xbd, 0xec, 0x39, 0x3d, 0x3d,
- 0x42, 0xb9, 0x16, 0xbf, 0x4e, 0x28, 0xa0, 0x3e, 0x63, 0x75, 0x13, 0xbf,
- 0xc5, 0x1d, 0x9e, 0xbe, 0xd8, 0xf5, 0x7a, 0x3d, 0xbc, 0xd7, 0x59, 0xbe,
- 0x53, 0x55, 0xbb, 0xbc, 0x2d, 0x79, 0xae, 0xbe, 0xeb, 0x7d, 0x68, 0xbd,
- 0x82, 0x27, 0x6c, 0xbb, 0x76, 0x92, 0x8f, 0xbe, 0x58, 0x65, 0x0a, 0x3d,
- 0x97, 0xf1, 0x3c, 0xbf, 0xd7, 0xe1, 0x93, 0xbe, 0xe9, 0x09, 0x58, 0x3d,
- 0x23, 0x43, 0xa2, 0xbd, 0xf6, 0x7d, 0x60, 0xbe, 0xca, 0x52, 0xf4, 0xbe,
- 0xae, 0x5c, 0xbd, 0xbe, 0xa4, 0x8d, 0x2f, 0x3e, 0x79, 0x38, 0x8d, 0x3c,
- 0xbb, 0x09, 0xdf, 0xba, 0x5b, 0x92, 0x58, 0x3e, 0x6a, 0xb9, 0x40, 0xbe,
- 0xd9, 0x05, 0x28, 0x3e, 0x6b, 0x7e, 0x1c, 0xbc, 0x9d, 0xd5, 0xa9, 0xbe,
- 0xdc, 0x17, 0x19, 0xbb, 0x9d, 0xa0, 0xb3, 0xbe, 0xa9, 0x5f, 0x84, 0xbe,
- 0x2d, 0x82, 0xd1, 0xbe, 0x75, 0x97, 0x84, 0x3e, 0xba, 0xa3, 0xb4, 0x3c,
- 0x0c, 0x56, 0xfb, 0x3e, 0x76, 0xe2, 0x57, 0xbe, 0xca, 0x48, 0x15, 0xbe,
- 0x94, 0x66, 0x1d, 0xbe, 0xbe, 0x32, 0x52, 0x3e, 0x41, 0xb6, 0x83, 0xbd,
- 0xf4, 0x82, 0x0f, 0xbf, 0xaf, 0xae, 0x00, 0xbf, 0xa6, 0xdb, 0x8c, 0xbd,
- 0xd6, 0x67, 0x30, 0x3e, 0x64, 0x03, 0xa2, 0xbe, 0x1e, 0xa6, 0x7b, 0xbe,
- 0xce, 0xcc, 0x0f, 0xbf, 0x74, 0x11, 0xac, 0xbe, 0xdc, 0xeb, 0x3b, 0xbe,
- 0xf9, 0x96, 0xcb, 0xbc, 0x9c, 0x3c, 0x0c, 0xbe, 0x8c, 0x14, 0x1a, 0x3e,
- 0x14, 0x97, 0xa0, 0x3e, 0x46, 0x50, 0x33, 0xbe, 0x00, 0x4f, 0x4a, 0xbe,
- 0x61, 0x3e, 0x74, 0xbf, 0x0f, 0x6c, 0xad, 0xbe, 0x42, 0x16, 0xbe, 0xbd,
- 0x6f, 0x9b, 0x20, 0xbe, 0xc3, 0x86, 0xc0, 0xbc, 0x51, 0xf0, 0x87, 0x3e,
- 0xe7, 0x0e, 0x0e, 0xbe, 0x4a, 0xe5, 0xe8, 0xbd, 0x03, 0x1b, 0xc7, 0x3e,
- 0x3f, 0x41, 0x6e, 0x3e, 0xfa, 0xc0, 0x8e, 0xbd, 0xf5, 0xce, 0x43, 0xbe,
- 0x2e, 0x2c, 0x92, 0xbd, 0xf1, 0xc6, 0x40, 0x3e, 0x4a, 0x76, 0x53, 0x3e,
- 0xa7, 0x2f, 0xf1, 0x3d, 0x2f, 0xde, 0xf1, 0x3c, 0xff, 0xb6, 0x6f, 0xbf,
- 0xd8, 0xfe, 0x8c, 0x3d, 0xd7, 0x83, 0x5e, 0x3d, 0xb1, 0xbf, 0xa2, 0x3e,
- 0xea, 0xf0, 0x49, 0x3e, 0xb2, 0xeb, 0xc0, 0x3d, 0x57, 0xcd, 0x7e, 0xbe,
- 0xf5, 0x8a, 0xba, 0x3e, 0x2e, 0x5b, 0x48, 0xbe, 0x05, 0xfa, 0x93, 0xbe,
- 0x5e, 0x93, 0xb8, 0xbe, 0xfd, 0x5c, 0x40, 0x3e, 0x27, 0xfb, 0x83, 0xbe,
- 0x6f, 0x08, 0x07, 0x3e, 0x01, 0x2c, 0xdb, 0x3e, 0xf2, 0x5a, 0x0b, 0xbe,
- 0xc8, 0x85, 0x32, 0xbe, 0xf5, 0xfc, 0x65, 0x3d, 0x4c, 0x3a, 0x15, 0x3f,
- 0x08, 0x8b, 0xfc, 0xbe, 0xa3, 0xae, 0x27, 0x3e, 0x53, 0x59, 0x81, 0x3d,
- 0xa3, 0x16, 0x71, 0x3e, 0xb5, 0x9b, 0x18, 0x3e, 0xd0, 0x77, 0xec, 0x3d,
- 0x49, 0xbd, 0x82, 0xbe, 0x3c, 0x4a, 0xbb, 0xbe, 0x45, 0x2c, 0x3e, 0xbe,
- 0x3c, 0x60, 0x62, 0xbc, 0x4a, 0x71, 0x80, 0xbe, 0x6b, 0x43, 0xf6, 0x3d,
- 0x31, 0x3b, 0x28, 0xbe, 0x0c, 0x86, 0x83, 0xbd, 0x1f, 0x5a, 0x4b, 0xbe,
- 0xb6, 0xcb, 0x20, 0xbf, 0x4b, 0x76, 0x6b, 0x3e, 0x13, 0x6a, 0xca, 0xbe,
- 0x07, 0x27, 0xa7, 0xbd, 0xce, 0x3c, 0x51, 0x3e, 0x51, 0xea, 0x10, 0xbd,
- 0x48, 0x16, 0x1f, 0xbe, 0x62, 0xbb, 0xa9, 0x3e, 0xdd, 0x29, 0x2a, 0x3d,
- 0x8f, 0x6e, 0x12, 0xbf, 0xe4, 0x90, 0x11, 0xbf, 0x85, 0xe4, 0xc0, 0xbe,
- 0xbc, 0xe3, 0x34, 0xbe, 0xf9, 0x4e, 0x99, 0x3e, 0xa4, 0xeb, 0x3b, 0x3e,
- 0x72, 0x1f, 0x2f, 0xbe, 0x56, 0xef, 0xfd, 0xbd, 0x07, 0xdd, 0xfb, 0xbc,
- 0x34, 0xfd, 0x03, 0xbf, 0x2f, 0x1d, 0x80, 0xbe, 0x35, 0xad, 0xb6, 0xbe,
- 0x5e, 0x4a, 0x07, 0x3f, 0x9b, 0x2b, 0x8a, 0xbe, 0xf0, 0xa7, 0x37, 0xb8,
- 0xf8, 0x22, 0x8a, 0xbc, 0xef, 0x46, 0x19, 0xbf, 0x30, 0x45, 0xb5, 0xbc,
- 0xe6, 0x5f, 0x03, 0xbe, 0x57, 0xae, 0x86, 0xbd, 0xb6, 0x94, 0xd7, 0xbe,
- 0xd5, 0x43, 0xd0, 0xbe, 0x59, 0xc9, 0x14, 0xbe, 0xdb, 0x65, 0xed, 0xbd,
- 0xbd, 0xe9, 0xf3, 0xbd, 0x70, 0x7b, 0x8e, 0x3e, 0x2d, 0xfa, 0x48, 0x3e,
- 0xdd, 0xe2, 0x6d, 0xbe, 0x9c, 0xb4, 0x8c, 0x3e, 0x0a, 0xd4, 0xa5, 0x3c,
- 0x16, 0x01, 0x28, 0xbe, 0xb9, 0x36, 0xaf, 0x3d, 0x27, 0xdc, 0xb9, 0x3e,
- 0x06, 0xcf, 0x82, 0x3e, 0x93, 0x31, 0x0d, 0xbf, 0xe3, 0x5a, 0xc3, 0xbe,
- 0x14, 0x63, 0xc2, 0x3d, 0x23, 0x11, 0x57, 0xbe, 0x61, 0x6d, 0xa0, 0xbe,
- 0x1d, 0x4a, 0x1b, 0xbc, 0x34, 0x12, 0xa0, 0xbd, 0xe5, 0xe6, 0x28, 0xbf,
- 0xea, 0x73, 0x32, 0x3e, 0xb3, 0x4f, 0x8c, 0xbd, 0x3e, 0x9b, 0x8b, 0x3d,
- 0xbb, 0x38, 0xfe, 0x3c, 0xd5, 0xa9, 0xa5, 0xbe, 0x06, 0xac, 0x88, 0xbe,
- 0x67, 0xba, 0xd2, 0xbe, 0x29, 0x0e, 0x8b, 0x3b, 0x45, 0x8a, 0x1b, 0x3e,
- 0x39, 0x2a, 0xf1, 0xbc, 0x4c, 0xa0, 0x96, 0xbe, 0xc1, 0xef, 0x31, 0x3e,
- 0xfa, 0xca, 0x58, 0xbe, 0x06, 0x3c, 0x97, 0xbd, 0xaf, 0xb3, 0x44, 0xbe,
- 0xe7, 0x6b, 0x42, 0xbe, 0x25, 0x0f, 0x11, 0xbf, 0xc4, 0x4b, 0x6f, 0x3c,
- 0x3a, 0xe9, 0xe5, 0xbc, 0xfd, 0xa7, 0xe3, 0xbe, 0x4d, 0x99, 0x9f, 0x3e,
- 0x9f, 0x77, 0xf9, 0x3d, 0x49, 0x7e, 0x53, 0xbe, 0x52, 0x82, 0x61, 0x3e,
- 0xa1, 0x01, 0xc7, 0xbc, 0x01, 0x4b, 0x83, 0x3e, 0x2d, 0x41, 0x85, 0xbe,
- 0x6b, 0x91, 0x8e, 0x3d, 0x20, 0x81, 0x6a, 0x3e, 0xd9, 0x14, 0xb5, 0x3e,
- 0x67, 0xfa, 0xf9, 0xbe, 0x63, 0x7f, 0x87, 0x3e, 0xb4, 0xb2, 0x80, 0xbe,
- 0xcc, 0x4d, 0xc6, 0x3e, 0x99, 0x66, 0xc6, 0xbd, 0x17, 0x23, 0x27, 0x3e,
- 0x21, 0x73, 0x47, 0xbe, 0x80, 0x5a, 0x8b, 0x3e, 0x51, 0x36, 0xa4, 0x3e,
- 0xd2, 0x97, 0x51, 0xbe, 0xa2, 0x12, 0xde, 0xbe, 0x38, 0x2f, 0xca, 0xbe,
- 0xd6, 0xf0, 0x21, 0xbf, 0x31, 0x20, 0xb2, 0xbe, 0xb1, 0x07, 0x0f, 0xbe,
- 0x72, 0x9e, 0x7d, 0x3d, 0x89, 0x8b, 0x2d, 0x3e, 0x84, 0x73, 0xc1, 0xbe,
- 0x1b, 0x1b, 0x07, 0x3e, 0xa1, 0xe7, 0x4f, 0xbc, 0xbb, 0x01, 0x84, 0x3e,
- 0xf1, 0x7f, 0x52, 0x3e, 0xaf, 0xf2, 0xac, 0x3d, 0x11, 0x58, 0x5e, 0xbe,
- 0x3f, 0xce, 0xef, 0xbe, 0x2b, 0xac, 0x0e, 0xbf, 0x8c, 0x48, 0x21, 0xbf,
- 0x1f, 0x12, 0x2e, 0xbf, 0xe6, 0xec, 0x64, 0xbe, 0x23, 0x5a, 0xe7, 0xb9,
- 0x07, 0x6f, 0x0b, 0xbe, 0x58, 0x33, 0xf5, 0xbd, 0x25, 0x0c, 0xd9, 0xbd,
- 0xa3, 0xe2, 0x29, 0xbe, 0xc6, 0xd0, 0x9f, 0x3e, 0x4a, 0x6e, 0xaf, 0x3c,
- 0xb5, 0x32, 0x87, 0xbd, 0xf7, 0xf0, 0x07, 0xbc, 0xc1, 0x80, 0x51, 0x3d,
- 0xa2, 0xbf, 0x23, 0xbf, 0x37, 0xdb, 0x63, 0x3d, 0xcf, 0xd4, 0xf9, 0x3d,
- 0x5f, 0x76, 0x38, 0xbe, 0x5f, 0x10, 0xaf, 0xbe, 0x01, 0x0a, 0xa0, 0xbe,
- 0x60, 0x7a, 0xdb, 0x3c, 0xa0, 0xf9, 0x37, 0x3e, 0xdf, 0xe5, 0x26, 0xbd,
- 0xc5, 0xf8, 0x50, 0xbf, 0x7f, 0xbf, 0x89, 0xbe, 0x2c, 0x7e, 0xe3, 0x3e,
- 0x43, 0x59, 0x2e, 0xbd, 0x08, 0x24, 0xf0, 0xbd, 0x63, 0x66, 0xaa, 0xbe,
- 0xb3, 0x30, 0xac, 0xbd, 0x96, 0x1f, 0x16, 0xbf, 0x40, 0x82, 0x7f, 0xbc,
- 0x64, 0x04, 0x5f, 0xbd, 0xb6, 0xfa, 0x1b, 0xbd, 0x4d, 0x80, 0x74, 0xbc,
- 0x0a, 0x4d, 0x22, 0x3e, 0x0c, 0x6b, 0x8d, 0xbe, 0x57, 0x3f, 0x32, 0x3e,
- 0x94, 0xd1, 0x77, 0xbf, 0x43, 0xe6, 0x92, 0xbe, 0x7d, 0x34, 0x1d, 0xbf,
- 0xfd, 0xf6, 0xa4, 0xbe, 0x4c, 0x5c, 0x4a, 0xbe, 0x6d, 0xb0, 0x99, 0x3e,
- 0xde, 0x9a, 0x53, 0xbe, 0x5a, 0x1e, 0xef, 0x3d, 0x80, 0xb7, 0xfc, 0x3d,
- 0x5d, 0xb3, 0x1a, 0x3e, 0x5c, 0xe3, 0x08, 0x3e, 0x02, 0xdd, 0x79, 0x3e,
- 0x2f, 0x22, 0x38, 0x3e, 0xbf, 0x8b, 0x69, 0xbd, 0x97, 0x27, 0x04, 0x3d,
- 0xc3, 0xe2, 0x1f, 0x3e, 0x03, 0x3e, 0xde, 0xbd, 0x8b, 0x37, 0xd7, 0xbc,
- 0xb9, 0xbc, 0x6e, 0xbe, 0xc9, 0xa0, 0x04, 0xbf, 0xb8, 0xf3, 0xc7, 0x3e,
- 0xc7, 0xbc, 0x06, 0xbe, 0xa4, 0xc4, 0x4c, 0xbe, 0x03, 0x70, 0x26, 0x3d,
- 0x2e, 0x58, 0x4d, 0x3e, 0x1f, 0xe4, 0xad, 0x3e, 0x25, 0xc5, 0x40, 0x3e,
- 0x66, 0x14, 0x31, 0xbd, 0x0d, 0x74, 0x76, 0x3e, 0xe7, 0x06, 0xa8, 0x3d,
- 0xb1, 0xa8, 0x73, 0xbe, 0xc0, 0xeb, 0xcc, 0xbc, 0xc0, 0x35, 0x99, 0x3e,
- 0xda, 0xc8, 0x7c, 0x3e, 0x90, 0x6a, 0xe2, 0x3e, 0x97, 0x07, 0xbf, 0xbe,
- 0x77, 0x6b, 0xd8, 0xbd, 0x73, 0x00, 0x54, 0x3e, 0xa7, 0xd9, 0x86, 0xbc,
- 0xc0, 0x48, 0x73, 0xbd, 0xbf, 0xba, 0xa0, 0x3c, 0x37, 0x80, 0xa2, 0xbc,
- 0x1e, 0x20, 0xb8, 0xbe, 0x1e, 0xf4, 0x6e, 0xbe, 0x9c, 0xaf, 0xbb, 0xbe,
- 0xa5, 0x30, 0x11, 0xbe, 0xe2, 0xe5, 0x14, 0xbd, 0xd3, 0x9e, 0xd4, 0xbe,
- 0x68, 0x3a, 0x7f, 0xbd, 0x8f, 0x6c, 0xd0, 0xbe, 0xe0, 0x2a, 0xc1, 0xbd,
- 0x94, 0x08, 0xba, 0x3d, 0x63, 0x1e, 0x23, 0xbe, 0x5b, 0x1a, 0x0f, 0x3d,
- 0x32, 0x08, 0x03, 0xbd, 0xa2, 0xf1, 0x62, 0x3e, 0x24, 0x3a, 0xc6, 0x3c,
- 0x31, 0x5f, 0xc6, 0xbd, 0x8e, 0xae, 0x50, 0x3c, 0xe4, 0x6b, 0x89, 0xbd,
- 0x9c, 0x8f, 0x8e, 0x3c, 0x65, 0x63, 0xcd, 0x3d, 0x65, 0x93, 0x2e, 0xbd,
- 0x18, 0xe7, 0x13, 0x3f, 0xc1, 0xe8, 0x13, 0x3e, 0xcd, 0x4c, 0x0d, 0x3e,
- 0x70, 0x16, 0xa5, 0x3d, 0x68, 0xe6, 0x20, 0x3d, 0xa1, 0x0b, 0x5e, 0xbe,
- 0x3d, 0x9a, 0xa0, 0xbe, 0x59, 0x95, 0xc4, 0x3e, 0xf4, 0xdf, 0x87, 0xbd,
- 0xc7, 0x1b, 0xef, 0x3c, 0xe3, 0x4e, 0x78, 0xbe, 0x68, 0x13, 0x01, 0xbf,
- 0x5f, 0xd2, 0x30, 0x3d, 0x03, 0xc3, 0xb6, 0xbd, 0x84, 0xe0, 0x9d, 0x3e,
- 0x7c, 0x8c, 0xc3, 0xbe, 0x62, 0xf3, 0x1e, 0x3e, 0xf7, 0x1b, 0x64, 0x3e,
- 0x3f, 0xb6, 0x24, 0xbe, 0xb5, 0x8b, 0x61, 0xbd, 0x0f, 0x9b, 0xdf, 0x3e,
- 0xa6, 0x9e, 0x98, 0x3e, 0x4c, 0xd4, 0x8d, 0xbd, 0x4e, 0x08, 0xb3, 0x3e,
- 0xaf, 0xca, 0x8b, 0x3d, 0xd8, 0x92, 0x4f, 0xbe, 0xc6, 0x7c, 0x64, 0x3e,
- 0x44, 0xf5, 0x92, 0x3b, 0x58, 0x68, 0x47, 0x3e, 0xce, 0x85, 0xba, 0x3d,
- 0xe3, 0x69, 0x8c, 0x3e, 0xe7, 0x7e, 0x80, 0xbe, 0x26, 0x3c, 0x85, 0x3e,
- 0xb3, 0x30, 0x21, 0x3e, 0x97, 0xc3, 0x92, 0x3e, 0x47, 0x0f, 0x33, 0x3e,
- 0xc8, 0x77, 0xd2, 0xbd, 0xa2, 0x9a, 0x08, 0x3f, 0xfa, 0x56, 0x64, 0xbe,
- 0x72, 0xa9, 0x4b, 0x3e, 0x88, 0x90, 0x0d, 0xbe, 0xd7, 0xde, 0x92, 0x3d,
- 0x07, 0xa2, 0xe7, 0xbe, 0x75, 0x3a, 0x92, 0xbe, 0xc2, 0x0f, 0xd4, 0x3d,
- 0xb4, 0x27, 0xde, 0xbd, 0xeb, 0xcd, 0x43, 0x3d, 0xda, 0x8e, 0xcb, 0x3e,
- 0x66, 0x79, 0x60, 0xbd, 0x7a, 0x46, 0xc0, 0x3e, 0x65, 0x16, 0x9a, 0xbd,
- 0xb8, 0x3d, 0xf3, 0x3e, 0xe0, 0x84, 0x03, 0x3f, 0x32, 0x59, 0xb8, 0xbd,
- 0xc8, 0x17, 0xde, 0xbe, 0x75, 0x41, 0x15, 0x3f, 0x8b, 0xff, 0x7e, 0xbf,
- 0xf9, 0x3f, 0x90, 0xbe, 0xb6, 0xbc, 0xef, 0x3e, 0x42, 0x94, 0x3e, 0xbf,
- 0x76, 0xea, 0x15, 0xbb, 0x20, 0x49, 0x13, 0x3e, 0xde, 0xc6, 0x1e, 0x3f,
- 0x9a, 0x76, 0x30, 0x3d, 0x5c, 0x01, 0x65, 0xbe, 0xe5, 0x18, 0xec, 0x3d,
- 0x62, 0x30, 0x38, 0x3e, 0x2b, 0x11, 0x05, 0x3f, 0x58, 0x8f, 0x78, 0xbc,
- 0x5b, 0xc0, 0x52, 0x3e, 0x13, 0xc5, 0xa1, 0xbf, 0x5d, 0x5c, 0x05, 0xbf,
- 0x85, 0xb0, 0xec, 0x3e, 0x8f, 0xb3, 0x84, 0xbe, 0xad, 0xbc, 0x82, 0x3e,
- 0xd5, 0xc8, 0x2b, 0xbe, 0xec, 0x42, 0x42, 0xbf, 0x7a, 0x28, 0x44, 0xbe,
- 0xf5, 0x90, 0x15, 0xbd, 0x0d, 0x04, 0xa2, 0xbe, 0xf7, 0x48, 0xff, 0xbc,
- 0x1c, 0x50, 0x96, 0xbc, 0xe3, 0xd6, 0x5e, 0x3d, 0xbd, 0x93, 0x1b, 0x3e,
- 0x7d, 0x9d, 0xa1, 0xbe, 0x72, 0x1a, 0xe5, 0x3e, 0xc6, 0x3a, 0x29, 0x3e,
- 0x5f, 0x9c, 0x28, 0x3f, 0x1b, 0x29, 0x0a, 0x3e, 0xb7, 0x80, 0xf5, 0xbe,
- 0xab, 0x25, 0x09, 0x3f, 0x47, 0xe6, 0xde, 0x3b, 0x35, 0x81, 0x98, 0xbd,
- 0xed, 0x8e, 0xdd, 0x3c, 0x84, 0x19, 0x5f, 0x3d, 0x7e, 0x33, 0x55, 0x3e,
- 0xa1, 0x8f, 0xea, 0x3e, 0x45, 0x62, 0x55, 0xbf, 0x10, 0xc8, 0x07, 0xbf,
- 0x88, 0xa2, 0xc6, 0x3e, 0x8e, 0xeb, 0x3e, 0xbe, 0x67, 0xf3, 0x95, 0x3e,
- 0xe4, 0x88, 0x09, 0x3f, 0xb2, 0x22, 0xcb, 0x3d, 0xd5, 0x8b, 0xcb, 0x3d,
- 0x69, 0xf2, 0x70, 0xbd, 0x78, 0xa8, 0x46, 0xbf, 0x72, 0x6d, 0x3d, 0x3e,
- 0xc0, 0x9b, 0xb7, 0xbe, 0x5c, 0x0e, 0xc0, 0xbe, 0x73, 0x52, 0xde, 0x3d,
- 0xdd, 0x29, 0xd2, 0x3e, 0xb8, 0x71, 0xc9, 0xbe, 0x1d, 0x9b, 0x0a, 0xbf,
- 0x03, 0xc4, 0xfc, 0x3e, 0x3a, 0x1a, 0x9e, 0x3e, 0xae, 0xd7, 0xbb, 0xbc,
- 0x83, 0xb6, 0x7f, 0x3e, 0x40, 0x3c, 0x15, 0xbe, 0xbe, 0x83, 0xd5, 0xbd,
- 0x5b, 0x33, 0xd4, 0x3e, 0x98, 0x6b, 0x79, 0xbd, 0x2f, 0x8c, 0x0e, 0x3f,
- 0xb4, 0x90, 0x0a, 0x3e, 0xe5, 0x66, 0x82, 0xbd, 0x74, 0xb7, 0x0f, 0xbf,
- 0x74, 0xbe, 0x2b, 0xbe, 0x4c, 0x72, 0x8f, 0xbe, 0x29, 0xd2, 0x86, 0xbe,
- 0x3d, 0x03, 0x05, 0xbe, 0x8c, 0x55, 0xa3, 0xbe, 0xc4, 0x06, 0xcd, 0x3e,
- 0x3d, 0x35, 0x69, 0x3e, 0x09, 0xf8, 0x92, 0xbd, 0x0e, 0x87, 0xb4, 0xbe,
- 0x61, 0x32, 0x47, 0xbf, 0x58, 0xfb, 0xf0, 0xbe, 0x1c, 0xa7, 0xaf, 0x3e,
- 0xc3, 0xfd, 0x02, 0x3f, 0x25, 0x0c, 0x18, 0xbe, 0xe0, 0x97, 0x30, 0xbf,
- 0x1e, 0x52, 0xdb, 0x3c, 0xf4, 0x11, 0x19, 0x3f, 0xda, 0x40, 0xcd, 0x3e,
- 0xc8, 0x22, 0xa7, 0x3e, 0xc8, 0x0d, 0xd3, 0xbe, 0x61, 0x98, 0xc2, 0x3e,
- 0xb4, 0xd1, 0xa4, 0x3d, 0x6a, 0x51, 0x74, 0x3d, 0xe5, 0xae, 0x4a, 0x3d,
- 0x18, 0x57, 0xc9, 0xbe, 0xef, 0x48, 0xb4, 0x3e, 0xb3, 0xfa, 0x12, 0x3f,
- 0xd8, 0xa7, 0x47, 0x3e, 0xd7, 0x78, 0x1d, 0xbf, 0x0e, 0x8c, 0xcd, 0xbc,
- 0x1a, 0x95, 0x06, 0x3d, 0x05, 0x8b, 0xe3, 0xbe, 0xbb, 0x3a, 0xcb, 0xbc,
- 0x25, 0xaf, 0x31, 0x3d, 0x36, 0x35, 0x24, 0x3e, 0x1a, 0xa0, 0x34, 0xbd,
- 0x13, 0x73, 0xed, 0x3e, 0xae, 0x8d, 0x14, 0xbe, 0x21, 0x8c, 0x6f, 0xbf,
- 0x40, 0x01, 0x82, 0xbb, 0x97, 0x1f, 0x37, 0xbf, 0x20, 0x60, 0x01, 0xbf,
- 0xf2, 0x81, 0xca, 0xbe, 0xbe, 0x08, 0x0c, 0xbe, 0xc0, 0x25, 0xcc, 0x3d,
- 0xab, 0x98, 0x42, 0x3d, 0xb8, 0x5b, 0x36, 0x3e, 0x75, 0xf6, 0xa1, 0x3e,
- 0x71, 0xf3, 0xcf, 0xbd, 0x57, 0x3e, 0x70, 0xbe, 0xa1, 0xac, 0x09, 0xbd,
- 0x70, 0xdb, 0x19, 0x3e, 0x1e, 0x7a, 0xa0, 0x3e, 0x62, 0x93, 0xa0, 0x3e,
- 0xa1, 0x21, 0x33, 0x3e, 0x9f, 0x91, 0x94, 0xbe, 0x51, 0x4c, 0x1a, 0xbe,
- 0x11, 0xbd, 0xaa, 0x3e, 0xf4, 0x43, 0x68, 0xbd, 0x69, 0x12, 0x4a, 0x3e,
- 0x72, 0x45, 0x9c, 0x3e, 0xdf, 0x4d, 0x1a, 0x3e, 0x66, 0xea, 0x3c, 0xbf,
- 0x80, 0x15, 0x96, 0xbe, 0x98, 0x5f, 0x57, 0x3b, 0xe7, 0x75, 0x1d, 0x3e,
- 0x64, 0x43, 0x11, 0xbe, 0x4b, 0xf1, 0x1e, 0x3d, 0x38, 0x6e, 0x9e, 0x3d,
- 0xc8, 0xbf, 0xa5, 0xbe, 0x85, 0x32, 0xd7, 0xbe, 0xaa, 0x65, 0xbb, 0x3e,
- 0x58, 0xa2, 0xbe, 0x3e, 0xfc, 0xbe, 0xc9, 0x3e, 0xb5, 0x6e, 0xd9, 0x3d,
- 0x08, 0x2f, 0x76, 0xbe, 0x3a, 0xd5, 0x84, 0xbe, 0x3c, 0xf4, 0x2e, 0xbf,
- 0x72, 0x22, 0x56, 0x3d, 0x0e, 0x64, 0x67, 0xbb, 0xb7, 0xe4, 0x9f, 0x3e,
- 0xfa, 0x85, 0x93, 0x3e, 0x24, 0xfb, 0x95, 0xbe, 0x65, 0x7b, 0x87, 0x3e,
- 0x4d, 0x72, 0x3b, 0x3e, 0x58, 0x51, 0xaf, 0xbe, 0x02, 0x8a, 0x95, 0xbd,
- 0xfc, 0x5b, 0x32, 0x3d, 0x22, 0x0f, 0x92, 0x3e, 0x76, 0x93, 0x43, 0xbe,
- 0x3a, 0xa4, 0x9d, 0xbe, 0x59, 0xb7, 0x65, 0xbe, 0x21, 0x03, 0x8e, 0xbd,
- 0x2b, 0x39, 0x86, 0x3c, 0x6e, 0xe3, 0xea, 0xbd, 0xe5, 0x95, 0x94, 0xbd,
- 0xa5, 0xf5, 0x08, 0xbe, 0x46, 0x0f, 0x16, 0x3e, 0xd9, 0x8e, 0x97, 0x3e,
- 0x2a, 0x3c, 0x30, 0xbf, 0x6e, 0xb5, 0xfb, 0x3b, 0xc7, 0xf3, 0xc2, 0xbd,
- 0x29, 0x08, 0xf7, 0xbe, 0x7e, 0xa1, 0x2f, 0xbe, 0xa3, 0x8c, 0xa9, 0x3d,
- 0x74, 0x4e, 0x38, 0xbf, 0x22, 0xab, 0x64, 0xbf, 0xad, 0xb0, 0x74, 0x3d,
- 0xe1, 0xd9, 0x53, 0xbe, 0xc2, 0x4a, 0x15, 0x3e, 0xa4, 0x5b, 0x93, 0xbe,
- 0x5b, 0x87, 0x63, 0xbe, 0xf4, 0x88, 0x07, 0x3f, 0x89, 0xe1, 0x1a, 0xbe,
- 0x6a, 0x0e, 0x99, 0x3e, 0x02, 0xde, 0xc9, 0xbd, 0x7c, 0x69, 0x02, 0x3e,
- 0xd6, 0x54, 0x24, 0x3e, 0x1e, 0xfa, 0xc1, 0xbd, 0x0e, 0x4c, 0x6f, 0xbe,
- 0x23, 0x03, 0x08, 0xbe, 0xf9, 0x23, 0xa1, 0x3d, 0x0c, 0xda, 0xe1, 0xbe,
- 0xcc, 0x4c, 0xdc, 0x3e, 0xa8, 0x66, 0xdb, 0xbd, 0xb5, 0x7c, 0x60, 0xbe,
- 0x13, 0x52, 0x33, 0xbd, 0xb0, 0x5e, 0xc1, 0x3e, 0xcd, 0x11, 0x65, 0x3e,
- 0x45, 0xa1, 0x3e, 0x3b, 0xe0, 0x5f, 0xde, 0x3d, 0xce, 0xb6, 0x01, 0xbe,
- 0x10, 0xed, 0xbb, 0xbe, 0x60, 0x90, 0x36, 0xbe, 0x95, 0x31, 0x89, 0xbe,
- 0x94, 0x37, 0x5c, 0xbe, 0x01, 0xc9, 0xf6, 0x3d, 0x1c, 0xc1, 0x8a, 0xbe,
- 0xfb, 0x28, 0x26, 0xbe, 0x9a, 0x91, 0x03, 0x3d, 0x71, 0x0d, 0x66, 0x3e,
- 0x1c, 0x4e, 0xb4, 0xbe, 0x20, 0x1c, 0x18, 0x3e, 0xe4, 0x61, 0x93, 0xbd,
- 0x4f, 0xfd, 0x42, 0xbe, 0x7b, 0x55, 0x85, 0x3e, 0x38, 0xe7, 0xb1, 0x3e,
- 0xdc, 0x7a, 0xec, 0xbe, 0x47, 0x4c, 0x0d, 0x3d, 0x6a, 0x0c, 0x19, 0x3d,
- 0x52, 0xc4, 0x7f, 0xbb, 0x2c, 0x84, 0xe0, 0xb9, 0x25, 0x5c, 0x2a, 0x3e,
- 0x58, 0xcf, 0x8c, 0xbd, 0xa5, 0xdd, 0x11, 0xbf, 0x0b, 0x13, 0x4d, 0x3d,
- 0x06, 0x5e, 0x52, 0x3e, 0x8a, 0x13, 0xbb, 0x3d, 0x18, 0x09, 0x6a, 0xbe,
- 0x15, 0x9e, 0x73, 0x3e, 0x35, 0xdd, 0xce, 0x3e, 0x83, 0xed, 0x20, 0xbf,
- 0xcc, 0xbf, 0xc0, 0xbe, 0xd4, 0x5f, 0xbf, 0xbe, 0xc4, 0x45, 0x25, 0xbe,
- 0x98, 0x29, 0xfe, 0xbe, 0x21, 0xc4, 0x0d, 0x3e, 0x7d, 0xf6, 0xd8, 0xbc,
- 0x93, 0xe1, 0x2a, 0x3e, 0x4b, 0x2b, 0x38, 0xbc, 0xf8, 0x0a, 0x6f, 0x3e,
- 0x9e, 0xa1, 0xcf, 0xbe, 0x1a, 0x90, 0x10, 0x3d, 0x94, 0xf3, 0x3f, 0x3d,
- 0x38, 0x52, 0x5f, 0xbe, 0x35, 0x18, 0xa4, 0xbe, 0x61, 0x30, 0xa9, 0x3d,
- 0x9b, 0x85, 0xb1, 0x3d, 0xfc, 0xf7, 0xd1, 0xbd, 0xdc, 0x15, 0x34, 0x3e,
- 0xd8, 0xdf, 0x6d, 0xbe, 0x59, 0x67, 0xd8, 0xbe, 0x4d, 0xc4, 0xcf, 0xbd,
- 0x2b, 0xf2, 0x34, 0xbe, 0x86, 0x7f, 0xe3, 0xbd, 0x69, 0x41, 0xf7, 0xbd,
- 0xa0, 0x02, 0x8d, 0xbe, 0xa5, 0x13, 0x18, 0xbf, 0xfa, 0xa1, 0x69, 0xbe,
- 0xbf, 0x95, 0x95, 0xbd, 0xaa, 0xd8, 0xd9, 0xbe, 0x56, 0xdd, 0x36, 0x3e,
- 0xcb, 0x8a, 0x84, 0xbe, 0x9d, 0x3f, 0x81, 0xbe, 0x9e, 0x71, 0x29, 0x3e,
- 0x86, 0x80, 0xce, 0xbe, 0xb0, 0x80, 0x8c, 0x3e, 0x91, 0xae, 0x0c, 0xbf,
- 0x20, 0x78, 0x12, 0x3e, 0x1c, 0x69, 0xdf, 0xbe, 0xd9, 0xaf, 0x54, 0x3b,
- 0x98, 0x61, 0x0e, 0x3e, 0xb3, 0xb9, 0x34, 0x3e, 0x7c, 0x88, 0x60, 0xbd,
- 0xff, 0x3a, 0xe0, 0x3e, 0xed, 0x99, 0x27, 0xbf, 0x93, 0xa6, 0x89, 0xbc,
- 0xd2, 0x49, 0x43, 0xbf, 0xbf, 0xa1, 0x8f, 0x3e, 0xbf, 0x9e, 0x6f, 0xbe,
- 0xcd, 0x4e, 0x99, 0xbb, 0x2e, 0x10, 0x8a, 0xbe, 0x95, 0x0a, 0x33, 0x3e,
- 0xe9, 0x70, 0xe5, 0xbd, 0x11, 0x1f, 0xb1, 0x3c, 0x59, 0xad, 0x7e, 0xbe,
- 0x66, 0x03, 0x5d, 0xbd, 0x4d, 0x36, 0x81, 0xbe, 0xff, 0x49, 0x13, 0x3c,
- 0xa4, 0x89, 0x80, 0xbd, 0x59, 0x69, 0x1b, 0xbe, 0x7e, 0x50, 0x1b, 0xbf,
- 0xa1, 0xb0, 0x57, 0xbe, 0xb6, 0x26, 0x05, 0xbe, 0x6e, 0xfe, 0x75, 0xbe,
- 0xd8, 0xf1, 0x80, 0xbf, 0x10, 0xcc, 0x81, 0xbe, 0x2f, 0x69, 0x35, 0x3e,
- 0x4f, 0x99, 0x40, 0x3e, 0xfd, 0x79, 0x1c, 0xbf, 0xca, 0xcd, 0x65, 0x3e,
- 0xd5, 0x1b, 0x27, 0x3e, 0xff, 0x62, 0xd1, 0x3d, 0x0c, 0x6f, 0xd6, 0x3b,
- 0xfa, 0xae, 0xf8, 0xbd, 0xbe, 0x1d, 0xe1, 0x3d, 0x01, 0x5a, 0xe0, 0x3d,
- 0xf5, 0xd0, 0xdd, 0xbe, 0xee, 0xed, 0x71, 0xbe, 0x57, 0x92, 0x39, 0x3d,
- 0xff, 0x2a, 0xde, 0xbd, 0x9f, 0x1a, 0x99, 0x3d, 0x27, 0x00, 0x41, 0xbf,
- 0xb3, 0x82, 0x2a, 0xbf, 0xce, 0x2d, 0x70, 0xbe, 0xe8, 0xae, 0x65, 0xbe,
- 0x69, 0xb1, 0x13, 0x3c, 0x7f, 0xf7, 0x37, 0xbe, 0xaa, 0xe5, 0xa0, 0xbe,
- 0xd3, 0x55, 0x15, 0x3e, 0x8f, 0x7d, 0x15, 0xbe, 0xa0, 0xb7, 0x63, 0xbd,
- 0x50, 0x1a, 0x8e, 0x3d, 0x08, 0xcb, 0xd2, 0xbd, 0xae, 0x79, 0x9a, 0xbe,
- 0xad, 0x20, 0xb1, 0xbd, 0xe0, 0xa5, 0xba, 0x3e, 0x80, 0x39, 0xfb, 0xbe,
- 0xba, 0xe9, 0x29, 0x3e, 0xc2, 0xaf, 0x3e, 0xbd, 0x0b, 0xa2, 0xbc, 0x3d,
- 0x16, 0xa7, 0xbf, 0xbd, 0x03, 0xdd, 0x18, 0xbf, 0x3c, 0xc1, 0x1e, 0xbe,
- 0x5b, 0x84, 0x27, 0x3e, 0x54, 0x95, 0xdf, 0xbc, 0x4e, 0xc9, 0x89, 0xbb,
- 0xc1, 0x79, 0x1b, 0x3e, 0x72, 0xfc, 0xb2, 0x3d, 0xf5, 0x1e, 0x0d, 0xbe,
- 0x02, 0xa9, 0x3e, 0x3e, 0x1c, 0x10, 0x50, 0x3e, 0x66, 0xbd, 0xcb, 0xbe,
- 0xeb, 0xce, 0x71, 0xbe, 0xbe, 0xfd, 0x2f, 0xbf, 0x05, 0xc6, 0x39, 0xbd,
- 0x49, 0x0c, 0xb5, 0xbe, 0x5b, 0x43, 0x1c, 0x3d, 0x21, 0x43, 0xb5, 0x3d,
- 0x2c, 0x19, 0xee, 0xbe, 0xa6, 0x3a, 0x3a, 0xbe, 0xf9, 0xdd, 0x84, 0x3d,
- 0x71, 0xd9, 0x71, 0xbe, 0x24, 0x7d, 0xbc, 0xbd, 0x7d, 0xd8, 0xcc, 0x3c,
- 0xad, 0x9f, 0x8b, 0xbc, 0x60, 0x1e, 0x77, 0xbd, 0x9f, 0xe0, 0xb4, 0xbd,
- 0x4f, 0x60, 0x3d, 0x3e, 0xbf, 0xf6, 0xa2, 0xbc, 0x28, 0x0e, 0xc8, 0xbe,
- 0xce, 0xff, 0x0b, 0xbe, 0x41, 0x2a, 0x42, 0x3e, 0x40, 0x64, 0x3a, 0x3e,
- 0x8d, 0xdf, 0xc5, 0x3d, 0x89, 0x56, 0xeb, 0xbd, 0x11, 0xf8, 0xb7, 0xbd,
- 0x5f, 0xac, 0x38, 0xbe, 0x9f, 0x02, 0xad, 0x3d, 0x16, 0x2a, 0x8b, 0xbd,
- 0x07, 0x6d, 0x49, 0xbd, 0x00, 0x8e, 0x6f, 0x3d, 0x62, 0xdf, 0xcd, 0xbd,
- 0xed, 0x5a, 0xf5, 0xbe, 0xef, 0xc8, 0x07, 0xbe, 0x6c, 0x0d, 0x57, 0x3d,
- 0x62, 0x9e, 0xd0, 0xbd, 0x82, 0x9f, 0x48, 0x3d, 0x29, 0x84, 0x3f, 0xbe,
- 0x0a, 0xfc, 0x2d, 0x3e, 0x59, 0x76, 0x7b, 0xbe, 0xac, 0xf3, 0x01, 0xbe,
- 0x8f, 0xc9, 0xaa, 0xbe, 0x80, 0x2a, 0x48, 0xbd, 0x83, 0xb4, 0xfc, 0xbd,
- 0xf1, 0xa7, 0x66, 0x3e, 0x2e, 0xe5, 0x08, 0xbe, 0x2c, 0xbc, 0x54, 0x3e,
- 0x77, 0x12, 0xd3, 0x3d, 0xd9, 0x06, 0x9a, 0x3e, 0xc5, 0x23, 0x03, 0x3d,
- 0x23, 0x64, 0x85, 0xbe, 0x3e, 0xda, 0xf9, 0xbd, 0x58, 0x18, 0x74, 0xbe,
- 0xb1, 0xf1, 0xd7, 0xbd, 0x63, 0x1b, 0x3f, 0x3e, 0xa2, 0xb6, 0xc8, 0x3e,
- 0x96, 0x20, 0x6b, 0xbe, 0xcc, 0xa3, 0x59, 0xbe, 0x53, 0x3f, 0x9f, 0x3e,
- 0xe3, 0x36, 0x35, 0xbe, 0x9d, 0x5f, 0x8a, 0x3d, 0xf1, 0xd0, 0x13, 0x3e,
- 0x78, 0x02, 0x88, 0xbe, 0xce, 0x28, 0xe3, 0x3d, 0x05, 0xbc, 0xa2, 0xbe,
- 0xdc, 0xac, 0x06, 0xbd, 0x47, 0x72, 0x81, 0x3e, 0xa9, 0x76, 0xb3, 0xbd,
- 0x3a, 0xd6, 0xa2, 0xbd, 0xde, 0xd5, 0xf3, 0xbb, 0x1a, 0x5a, 0xd7, 0xbd,
- 0xf1, 0xfd, 0x51, 0xbe, 0x88, 0x1d, 0x01, 0x3e, 0xbe, 0x5f, 0x56, 0xbc,
- 0xa0, 0x50, 0x4f, 0x3e, 0x7d, 0x3d, 0x0e, 0xbe, 0xd4, 0x8d, 0x2c, 0xbf,
- 0x62, 0x02, 0x1b, 0x3e, 0x9d, 0x2f, 0xbf, 0xbe, 0x92, 0x22, 0x2d, 0x3e,
- 0xb5, 0xde, 0x63, 0xbc, 0xcb, 0xf6, 0x96, 0x3e, 0x2f, 0xf9, 0x74, 0xbe,
- 0xb2, 0xaa, 0xa0, 0x3d, 0xa8, 0x0c, 0x46, 0xbe, 0xa3, 0x3e, 0xcf, 0x3d,
- 0x1b, 0x1a, 0x0c, 0xbf, 0x40, 0xe0, 0x78, 0xbe, 0x58, 0xc6, 0x2b, 0xbe,
- 0xe9, 0x39, 0xcb, 0xbe, 0xbd, 0x4e, 0xaa, 0x3c, 0x65, 0x7d, 0xcd, 0xbb,
- 0x05, 0xea, 0x25, 0xbe, 0x52, 0xba, 0x9f, 0x3d, 0x30, 0x3e, 0x85, 0xbe,
- 0x9a, 0x4d, 0x8f, 0xbe, 0x35, 0x1c, 0xf2, 0xbe, 0xb2, 0x90, 0x62, 0x3e,
- 0xe9, 0xea, 0xe0, 0x3d, 0x98, 0x08, 0x1a, 0xbe, 0x62, 0x43, 0x0f, 0xbe,
- 0x13, 0x66, 0x54, 0x3e, 0x77, 0xc0, 0x96, 0xbe, 0xf2, 0x91, 0x11, 0x3d,
- 0x20, 0x68, 0x07, 0xbe, 0xa4, 0x4b, 0x6b, 0xbd, 0x8d, 0xf4, 0x55, 0x3c,
- 0x66, 0x90, 0x26, 0x3d, 0x1b, 0x5c, 0x87, 0x3d, 0x73, 0x35, 0x29, 0x3e,
- 0xcf, 0xbe, 0x96, 0x3e, 0xe0, 0xa9, 0x42, 0xbe, 0x78, 0x96, 0x17, 0x3e,
- 0xec, 0xe5, 0xc6, 0xbd, 0xa2, 0x59, 0x94, 0x3e, 0x53, 0xcf, 0xb0, 0xbe,
- 0x19, 0x90, 0x3a, 0xbe, 0xa6, 0x7b, 0xa5, 0x3d, 0x48, 0xa0, 0x00, 0xbf,
- 0x0c, 0x9d, 0x96, 0xbd, 0xd0, 0x94, 0x6e, 0x3d, 0x59, 0xc4, 0xd6, 0xbe,
- 0xa4, 0xde, 0xe2, 0xbc, 0xa7, 0x69, 0x14, 0xbe, 0x51, 0xfc, 0x26, 0x3d,
- 0xf6, 0x9d, 0x80, 0x3d, 0xd3, 0xcc, 0xa8, 0x3c, 0xec, 0x74, 0x86, 0xbe,
- 0x1a, 0xea, 0xcc, 0xbe, 0x61, 0x58, 0xf3, 0x3d, 0xec, 0xb7, 0xd0, 0xbc,
- 0x10, 0xa8, 0x52, 0xbb, 0x43, 0x20, 0x79, 0xbe, 0xa3, 0xb3, 0x07, 0xbf,
- 0xc5, 0x89, 0x32, 0xbf, 0xa5, 0xb8, 0xa8, 0x3d, 0xe8, 0xfa, 0x0f, 0x3e,
- 0xc5, 0xe4, 0xa4, 0xbe, 0x38, 0x61, 0x6a, 0x3e, 0xb1, 0xb6, 0x23, 0xbe,
- 0x19, 0x95, 0x83, 0x3e, 0xe0, 0xa2, 0x0e, 0xbd, 0xf3, 0xb8, 0x97, 0xbd,
- 0x2d, 0xff, 0x77, 0x3c, 0x39, 0x77, 0xf2, 0x3e, 0xdf, 0x1e, 0xa6, 0xbe,
- 0x8d, 0x2c, 0x5d, 0xbe, 0xbb, 0x7b, 0x34, 0xbe, 0xfa, 0x30, 0xb2, 0xbe,
- 0x60, 0x98, 0x94, 0x3d, 0xd0, 0xb4, 0x72, 0xbe, 0x27, 0x7a, 0x67, 0xbe,
- 0x69, 0xe8, 0xa0, 0x3d, 0x64, 0x7b, 0x71, 0x3d, 0x88, 0x3d, 0x15, 0xbe,
- 0xe5, 0x0a, 0x91, 0x3d, 0x15, 0xae, 0xad, 0xbd, 0xb0, 0xc2, 0xe4, 0xbe,
- 0x9b, 0x7c, 0x0e, 0xbf, 0x75, 0x92, 0xe0, 0xbe, 0x3a, 0x99, 0xe3, 0x3e,
- 0x27, 0xf6, 0x3f, 0xbb, 0x55, 0x8c, 0xc8, 0xbd, 0x6b, 0x98, 0xd3, 0xbd,
- 0xe7, 0xcf, 0xc6, 0xbd, 0xdf, 0xa3, 0x76, 0x3e, 0x72, 0x1f, 0xc8, 0xbd,
- 0xd6, 0x00, 0x17, 0xbe, 0xf8, 0xa5, 0x7b, 0xbe, 0x0c, 0x7c, 0xf1, 0xbe,
- 0x68, 0x14, 0x38, 0x3c, 0xba, 0x22, 0xa6, 0xbe, 0xeb, 0x5a, 0xe8, 0xbd,
- 0x88, 0x83, 0x87, 0x3d, 0x7f, 0x17, 0x95, 0x3d, 0x26, 0xa1, 0xa2, 0xbd,
- 0xf5, 0x81, 0x1b, 0x3d, 0x70, 0x42, 0x3e, 0x3d, 0x23, 0xe9, 0x0b, 0xbf,
- 0x32, 0x5f, 0x2a, 0xbf, 0xfa, 0x37, 0xc4, 0xbe, 0xb6, 0xcb, 0x65, 0xbe,
- 0xac, 0x69, 0x9e, 0xbd, 0x5d, 0x61, 0x22, 0x3e, 0xa2, 0x3d, 0xa1, 0xbe,
- 0xf3, 0xf4, 0x93, 0xbe, 0xd1, 0xdc, 0xfa, 0x3d, 0x14, 0xfb, 0x01, 0x3d,
- 0x5f, 0x42, 0xb2, 0xbc, 0xf3, 0x93, 0xf9, 0x3e, 0x6c, 0x78, 0xf4, 0x3e,
- 0xfa, 0x1b, 0x9a, 0xbd, 0xad, 0xec, 0x98, 0xbe, 0x79, 0x94, 0x82, 0xbe,
- 0x37, 0x5b, 0x59, 0x3d, 0xde, 0x7b, 0x0b, 0xbf, 0x32, 0x5b, 0x2a, 0xbe,
- 0xc3, 0x26, 0xc1, 0xbe, 0x2d, 0x0e, 0x30, 0xbe, 0x37, 0x13, 0x72, 0xbc,
- 0x50, 0x54, 0x64, 0xbf, 0x26, 0x02, 0x89, 0xbe, 0xf1, 0x8f, 0x37, 0x3d,
- 0x8c, 0x5d, 0x86, 0x3d, 0xef, 0xa6, 0x50, 0xbe, 0x5c, 0xb8, 0x56, 0x3e,
- 0xa2, 0xd0, 0x2d, 0xbd, 0x28, 0x4d, 0x37, 0xbf, 0x0e, 0xaf, 0x02, 0x3e,
- 0x73, 0x48, 0xa3, 0xbe, 0x1a, 0x96, 0xa9, 0x3e, 0xca, 0x7d, 0x35, 0x3e,
- 0x07, 0x98, 0x0f, 0x3d, 0x72, 0xb1, 0x98, 0x3e, 0xcf, 0xae, 0xc5, 0xbd,
- 0xbd, 0x80, 0x4a, 0x3d, 0x06, 0xde, 0x11, 0xbc, 0x05, 0x5e, 0x37, 0x3e,
- 0xfc, 0x01, 0x90, 0x3e, 0x2b, 0x67, 0xa2, 0xbe, 0xba, 0x55, 0x63, 0x3e,
- 0x85, 0x04, 0x07, 0xbf, 0xb8, 0x8e, 0xf1, 0xbd, 0xa1, 0xf8, 0x31, 0xbe,
- 0x9a, 0x81, 0x28, 0x3e, 0xbd, 0xf2, 0x85, 0xbe, 0x34, 0x96, 0xa8, 0xbe,
- 0x10, 0xa5, 0x04, 0xbf, 0x8b, 0x5e, 0x92, 0xbd, 0xed, 0xe3, 0xb3, 0x3d,
- 0x0e, 0x19, 0x5f, 0xbe, 0x07, 0xd7, 0x13, 0xbc, 0x33, 0x2a, 0x2b, 0xbf,
- 0xf2, 0xbc, 0x24, 0xbd, 0xe5, 0x67, 0xa5, 0x3e, 0x92, 0x5a, 0x2c, 0x3e,
- 0x89, 0xce, 0x61, 0x3d, 0x66, 0x07, 0xd4, 0x3d, 0x3a, 0xf6, 0x12, 0x3f,
- 0xa5, 0x7c, 0xb8, 0xbe, 0xa9, 0x2a, 0x7e, 0xbe, 0xff, 0x02, 0xc5, 0xbd,
- 0x4f, 0x81, 0x17, 0x3c, 0x28, 0xa9, 0x7b, 0x3e, 0xca, 0x01, 0xe8, 0xbe,
- 0x37, 0x8f, 0xfe, 0x3d, 0xb1, 0xad, 0xa2, 0xbe, 0xda, 0xae, 0x44, 0x3e,
- 0x2e, 0x8f, 0xe6, 0xbe, 0x62, 0xbb, 0xa4, 0xbd, 0x74, 0x46, 0xb3, 0xbe,
- 0xa8, 0x6d, 0xdb, 0xbd, 0x51, 0x2b, 0xd2, 0xbc, 0x3d, 0x16, 0x72, 0x3e,
- 0xfa, 0xc3, 0x58, 0xbe, 0xed, 0xfa, 0xb0, 0xbe, 0xbd, 0xd9, 0x91, 0x3e,
- 0x5d, 0x50, 0x6d, 0xbd, 0xdc, 0x75, 0x21, 0xbc, 0x14, 0xf6, 0x6a, 0x3d,
- 0x6f, 0xc2, 0x33, 0xbe, 0xcf, 0x3e, 0x73, 0xbe, 0x59, 0x04, 0x01, 0x3e,
- 0x4d, 0x8e, 0x3c, 0x3d, 0x36, 0x4e, 0x8e, 0x3d, 0x09, 0x3b, 0x91, 0xbd,
- 0xd0, 0xaf, 0x2d, 0xbe, 0x0b, 0xfc, 0x23, 0xbe, 0x0e, 0x52, 0x73, 0xbd,
- 0xa9, 0x52, 0x92, 0x3e, 0xf2, 0x54, 0x4c, 0x3e, 0x58, 0x04, 0xa6, 0x3d,
- 0x1f, 0x8e, 0xe7, 0xbd, 0x5c, 0x8c, 0x8f, 0xbe, 0x9a, 0x66, 0xb7, 0xbe,
- 0x64, 0x7e, 0xd7, 0xbd, 0xa4, 0xf9, 0xe1, 0x3d, 0x6a, 0x1b, 0xb8, 0xbe,
- 0xa4, 0xa1, 0x6f, 0x3e, 0x0a, 0xf3, 0xe7, 0x3d, 0xbd, 0xe1, 0x95, 0x3e,
- 0x33, 0x8d, 0xa7, 0xbd, 0xd8, 0x28, 0x14, 0xbc, 0x0b, 0xb1, 0xed, 0xbe,
- 0x9f, 0x8e, 0xfe, 0x3d, 0x15, 0xff, 0x11, 0x3e, 0xe4, 0xfe, 0xcd, 0x3e,
- 0x16, 0x51, 0xa5, 0xbc, 0x6c, 0x08, 0xc0, 0xbd, 0x1f, 0xfa, 0x36, 0xbd,
- 0xa8, 0x2c, 0xbf, 0x3e, 0x73, 0xf6, 0x25, 0x3e, 0x71, 0xb4, 0x7c, 0xbc,
- 0x63, 0xf7, 0xc7, 0x3d, 0x30, 0x37, 0x9b, 0xbe, 0x49, 0x7f, 0x95, 0xbd,
- 0x5b, 0xd0, 0xf4, 0x3d, 0x13, 0x10, 0x51, 0xbe, 0x2f, 0x7a, 0xbd, 0xbe,
- 0x88, 0xd1, 0x18, 0xbe, 0xdc, 0xca, 0xd4, 0xbe, 0x6e, 0x53, 0xad, 0xbd,
- 0xa5, 0x0a, 0x8b, 0x3e, 0x16, 0x66, 0xb7, 0xbc, 0xa2, 0x9c, 0xae, 0xbd,
- 0xde, 0xe9, 0x6f, 0x3e, 0x95, 0xc0, 0xa2, 0xbd, 0x02, 0xd9, 0x5f, 0xbe,
- 0xa8, 0x50, 0x2a, 0xbe, 0xab, 0x9c, 0x87, 0xbc, 0xe7, 0xff, 0x8b, 0xbe,
- 0xa3, 0xee, 0x1c, 0xbe, 0x04, 0xa6, 0x90, 0x3e, 0x0d, 0x23, 0x54, 0x3d,
- 0xf6, 0xac, 0x6d, 0xbc, 0x17, 0x71, 0xbd, 0xbe, 0xb7, 0x9e, 0x20, 0xbd,
- 0x56, 0x79, 0x31, 0xbe, 0x06, 0xc9, 0xd8, 0x3e, 0x05, 0x3c, 0xa9, 0xbe,
- 0x4d, 0x14, 0x82, 0xbe, 0x94, 0xe0, 0x62, 0xbe, 0x28, 0x68, 0xce, 0xbe,
- 0xe0, 0xea, 0xbf, 0x3d, 0xf0, 0x97, 0x2e, 0xbe, 0xf2, 0xd6, 0xd4, 0xbd,
- 0x2a, 0xbc, 0x55, 0x3e, 0x6a, 0xd9, 0x80, 0xbc, 0x1d, 0x41, 0x71, 0xbe,
- 0xe9, 0x97, 0x45, 0xbe, 0xe3, 0xa7, 0x77, 0x3e, 0xd0, 0xf6, 0x88, 0x3e,
- 0xcd, 0x80, 0x94, 0xbd, 0x3c, 0x5c, 0x2f, 0xbd, 0x58, 0x68, 0xad, 0xbe,
- 0x12, 0xf8, 0xd4, 0x3c, 0x22, 0xd9, 0x26, 0x3d, 0x8f, 0x85, 0x64, 0x3e,
- 0xb4, 0x3d, 0xc3, 0xbd, 0x72, 0xd1, 0xfa, 0xbc, 0xf4, 0x47, 0x8f, 0xbe,
- 0x16, 0x96, 0x88, 0x3e, 0xf9, 0x1e, 0x93, 0xbe, 0x44, 0x9a, 0x22, 0xbe,
- 0x07, 0xe5, 0x96, 0xbe, 0x3a, 0x6b, 0x80, 0x3e, 0x89, 0x8a, 0xc5, 0xbd,
- 0x2b, 0x75, 0x64, 0xbd, 0x21, 0x2e, 0xcb, 0xbc, 0x16, 0xe8, 0xad, 0xbe,
- 0x01, 0x7d, 0x2c, 0x3e, 0xa2, 0x44, 0x00, 0x3f, 0x85, 0x78, 0x45, 0xbe,
- 0x5d, 0xcc, 0xc4, 0xbd, 0xb8, 0xd1, 0x1e, 0x3f, 0xfc, 0x16, 0x8b, 0xbe,
- 0xd1, 0x74, 0xdf, 0x3d, 0xc4, 0xaf, 0xef, 0x3c, 0x1a, 0x51, 0x77, 0xbe,
- 0x6a, 0x8a, 0x34, 0xbe, 0x36, 0x23, 0xda, 0xbe, 0x00, 0x9f, 0xd9, 0x3e,
- 0x65, 0x78, 0x13, 0xbe, 0xc2, 0xa3, 0x1d, 0xbd, 0xeb, 0xee, 0x72, 0xbe,
- 0x1c, 0xcf, 0xf7, 0xbd, 0x8b, 0x20, 0xbc, 0x3d, 0x8a, 0xa3, 0x8d, 0xbe,
- 0x93, 0x3e, 0x5d, 0x3e, 0x5a, 0x8a, 0xac, 0xbc, 0x71, 0x61, 0x92, 0xbe,
- 0xb7, 0xdb, 0xc7, 0xbc, 0x4b, 0xe8, 0x6f, 0xbe, 0x36, 0xed, 0xa6, 0x3d,
- 0xda, 0xb2, 0x81, 0xbd, 0x77, 0x37, 0x82, 0x3d, 0x2d, 0xd8, 0xbd, 0xbd,
- 0x1a, 0x53, 0x81, 0xbd, 0x34, 0x63, 0xc8, 0x3d, 0x97, 0x04, 0x23, 0xbd,
- 0xdd, 0x7f, 0x01, 0xbe, 0xf0, 0x80, 0x85, 0x3d, 0xb2, 0xf1, 0xe0, 0xbb,
- 0xcc, 0x12, 0xc6, 0xbe, 0x87, 0x26, 0xe6, 0xbd, 0x1d, 0x03, 0x1a, 0xbe,
- 0x29, 0x15, 0x61, 0xbe, 0x28, 0xeb, 0x47, 0x3e, 0xc2, 0x12, 0xab, 0xbd,
- 0xf5, 0x89, 0x66, 0xbe, 0x48, 0xcd, 0x7c, 0x3c, 0x5c, 0x28, 0x6f, 0xbe,
- 0x75, 0x64, 0xe0, 0xbd, 0x74, 0x5c, 0x44, 0xbe, 0x0a, 0x7f, 0xc1, 0xbe,
- 0x01, 0x5a, 0x97, 0xbe, 0x64, 0x3c, 0xc8, 0xbc, 0xf6, 0xd8, 0x8e, 0xbe,
- 0x88, 0x51, 0xee, 0x3e, 0x27, 0xd7, 0x7d, 0xbd, 0x39, 0xb5, 0xad, 0x3d,
- 0xe4, 0x88, 0x2e, 0x3d, 0x63, 0x27, 0x0f, 0x3e, 0xef, 0xd4, 0xdc, 0xbe,
- 0xb1, 0xaf, 0xcf, 0xbe, 0x7c, 0x9b, 0xcf, 0x3e, 0x7b, 0xf0, 0x82, 0xbb,
- 0xa2, 0xaa, 0xf2, 0xbe, 0x4b, 0x06, 0x4a, 0xbe, 0xa5, 0x4c, 0xb3, 0xbd,
- 0x39, 0xac, 0x66, 0x3f, 0x15, 0xd4, 0xda, 0xbc, 0x50, 0x54, 0x9c, 0x3c,
- 0x50, 0x10, 0x79, 0xbe, 0x4e, 0x84, 0x22, 0x3f, 0xf8, 0xd6, 0x0f, 0xbf,
- 0x30, 0xe3, 0x54, 0xbf, 0x8a, 0xb2, 0x01, 0xbf, 0x1c, 0xb0, 0x5b, 0xbd,
- 0x4c, 0x0a, 0x0b, 0xbe, 0xde, 0xaa, 0x64, 0xbe, 0x07, 0xf7, 0x80, 0xbe,
- 0x96, 0xe0, 0xc1, 0x3d, 0xac, 0x6d, 0xc2, 0x3d, 0x7f, 0x5f, 0x4c, 0xbb,
- 0x0b, 0xcf, 0x83, 0xbd, 0x5e, 0x7b, 0x25, 0x3c, 0x32, 0x9e, 0x33, 0x3e,
- 0xd1, 0x8e, 0x36, 0x3e, 0xeb, 0x41, 0x6f, 0x3e, 0xa0, 0xf9, 0x19, 0x3f,
- 0xb8, 0x7d, 0x8b, 0xbd, 0xd7, 0x00, 0x4f, 0x3f, 0xc6, 0x22, 0x50, 0xbd,
- 0xcf, 0x76, 0x16, 0x3f, 0xd8, 0xc5, 0x90, 0x3e, 0xe6, 0x71, 0x89, 0xbe,
- 0xd0, 0x50, 0x1d, 0xbf, 0x97, 0xa8, 0x21, 0x3e, 0x56, 0x7e, 0x93, 0xbe,
- 0xa1, 0xd6, 0xcb, 0x3e, 0x6a, 0xcc, 0x0f, 0xbe, 0x17, 0xcf, 0xfd, 0xbc,
- 0xb6, 0x53, 0xb8, 0xbe, 0x39, 0x2d, 0xbb, 0xbe, 0x02, 0xc4, 0x9f, 0x3d,
- 0xc6, 0x0d, 0x44, 0xbd, 0xa9, 0x05, 0x99, 0x3b, 0x28, 0xb1, 0xed, 0xbd,
- 0x0c, 0xe0, 0x94, 0x3e, 0xed, 0x18, 0x20, 0xbe, 0xf3, 0xb5, 0x92, 0xbe,
- 0x8a, 0x1c, 0x2a, 0xbf, 0x8c, 0xae, 0xf9, 0x3d, 0x0f, 0x1f, 0x59, 0x3e,
- 0x23, 0x0f, 0x2e, 0xbf, 0x55, 0xb1, 0x17, 0xbf, 0xdf, 0xea, 0xfb, 0x3d,
- 0x55, 0xf1, 0x76, 0x3e, 0x6d, 0x81, 0xb9, 0xbd, 0x92, 0xf8, 0x2b, 0xbd,
- 0x6e, 0x32, 0xa4, 0x3e, 0xc1, 0xcd, 0x94, 0x3d, 0xa4, 0x89, 0xcd, 0xbe,
- 0xc3, 0xbc, 0x21, 0x3f, 0xea, 0x6b, 0x4a, 0x3e, 0x0b, 0x75, 0xe6, 0x3e,
- 0x0a, 0xcc, 0x24, 0x3f, 0xb5, 0xa0, 0x61, 0x3d, 0x65, 0x60, 0x64, 0xbe,
- 0x75, 0xce, 0xe5, 0xbd, 0xf1, 0xe5, 0x88, 0xbe, 0x02, 0x28, 0xff, 0xbe,
- 0xd8, 0x36, 0xe6, 0x3c, 0x05, 0x4a, 0xca, 0x3e, 0xe8, 0x21, 0xa9, 0xbd,
- 0xe0, 0x92, 0x94, 0x3e, 0x77, 0xd8, 0x8b, 0xbd, 0x4c, 0x9c, 0x16, 0xbe,
- 0x85, 0xa6, 0xba, 0x3e, 0x38, 0x9a, 0xa0, 0x3e, 0x06, 0x66, 0x1d, 0x3e,
- 0x33, 0x2b, 0x80, 0xbe, 0x7f, 0x12, 0x57, 0x3e, 0x3a, 0xf5, 0x09, 0xbf,
- 0x2c, 0xaa, 0x14, 0x3e, 0x7d, 0xaf, 0x6f, 0xbe, 0x17, 0x04, 0xb2, 0xbe,
- 0x98, 0x0f, 0x0e, 0x3e, 0x1e, 0x7c, 0x3b, 0x3e, 0xa8, 0xa4, 0x82, 0x3d,
- 0xde, 0x02, 0xd6, 0xbe, 0x87, 0x72, 0x95, 0xbd, 0xf8, 0xd2, 0x45, 0x3d,
- 0xcf, 0x5e, 0x05, 0xbf, 0xbd, 0xcb, 0x34, 0xbd, 0xec, 0xb4, 0xbf, 0x3e,
- 0xe2, 0x66, 0x2a, 0xbe, 0x65, 0x09, 0x37, 0xbe, 0xee, 0x87, 0x73, 0xbe,
- 0x34, 0xe6, 0x48, 0x3e, 0x91, 0xdb, 0x8a, 0x3e, 0x19, 0x92, 0xac, 0x3c,
- 0x7d, 0xdc, 0x19, 0xbe, 0x03, 0xbf, 0x03, 0x3e, 0x8a, 0xc0, 0xeb, 0xbe,
- 0x3b, 0xee, 0x20, 0xbc, 0xf7, 0xfa, 0x47, 0x3e, 0x8e, 0x33, 0x08, 0x3e,
- 0x18, 0x09, 0x02, 0xbe, 0x20, 0xe2, 0x3c, 0xbd, 0x96, 0xe2, 0xee, 0xbd,
- 0x50, 0xb7, 0x56, 0xbd, 0x60, 0xdf, 0xc1, 0x3e, 0x4f, 0xf2, 0xaa, 0x3e,
- 0x65, 0x1f, 0x8f, 0xbe, 0xd3, 0x5b, 0x0e, 0x3e, 0xb3, 0x9e, 0xfd, 0xbe,
- 0xbb, 0xad, 0x06, 0xbf, 0xfc, 0x9d, 0xac, 0xbc, 0x39, 0x55, 0x23, 0xbc,
- 0xe0, 0xd8, 0x04, 0xbf, 0xd6, 0xf8, 0x34, 0x3e, 0x54, 0xd9, 0x0c, 0x3e,
- 0x97, 0x6a, 0xa2, 0xbd, 0x18, 0x1d, 0x9e, 0x3e, 0x1c, 0x57, 0x0e, 0x3e,
- 0x76, 0xef, 0x15, 0xbe, 0x8e, 0x36, 0x94, 0x3e, 0x13, 0x46, 0x9b, 0xbe,
- 0x55, 0x51, 0xb8, 0xbe, 0x2e, 0xda, 0x55, 0xbd, 0xe8, 0x3e, 0x16, 0x3f,
- 0x28, 0xc5, 0x58, 0xbf, 0x37, 0x2f, 0xa3, 0xbe, 0xd6, 0x8a, 0x32, 0xbf,
- 0xbc, 0x05, 0x5b, 0xbe, 0xa0, 0x52, 0x02, 0xbe, 0x5b, 0xe5, 0x34, 0x3e,
- 0x12, 0xc2, 0x7d, 0x3e, 0x4e, 0x5d, 0x37, 0xbb, 0x87, 0x9e, 0x79, 0xbe,
- 0xce, 0x02, 0xeb, 0xbd, 0x9e, 0xe9, 0x84, 0x3e, 0x73, 0x55, 0xd3, 0x3e,
- 0x38, 0xee, 0x0a, 0x3f, 0x62, 0xa3, 0x8c, 0xbe, 0x4e, 0xfb, 0xac, 0x3e,
- 0x23, 0xc0, 0x93, 0xbe, 0xd7, 0x0c, 0x8e, 0xbe, 0xf8, 0x4b, 0xa3, 0xbd,
- 0x6b, 0x22, 0xd7, 0xbd, 0xcc, 0x3c, 0x0c, 0xbe, 0x84, 0x0c, 0xe7, 0x3e,
- 0x20, 0x96, 0x18, 0x3f, 0x80, 0xe2, 0x07, 0xbf, 0xcf, 0x74, 0x8a, 0x3e,
- 0xf2, 0x12, 0x8a, 0x3d, 0x79, 0x61, 0x27, 0x3d, 0xc9, 0xd8, 0xc8, 0x3d,
- 0xe2, 0xff, 0x11, 0xbf, 0x61, 0xce, 0x8e, 0xbe, 0xdc, 0x71, 0xe7, 0x3c,
- 0x8f, 0xe4, 0xd1, 0x3d, 0x10, 0x79, 0xeb, 0xbe, 0x5d, 0x95, 0x71, 0x3e,
- 0xf5, 0x98, 0x16, 0xbc, 0x28, 0x9f, 0x2b, 0x3e, 0xf1, 0xe2, 0x03, 0x3e,
- 0x5c, 0x67, 0xfb, 0x3e, 0x86, 0x37, 0x87, 0x3e, 0x73, 0x91, 0xd2, 0x3e,
- 0x3b, 0x70, 0x88, 0xbe, 0x4d, 0x94, 0xf9, 0x3d, 0x0a, 0xd4, 0xd5, 0x3d,
- 0x4a, 0x3f, 0x2c, 0xbf, 0xc7, 0x9c, 0xd6, 0xbe, 0x23, 0xe5, 0x77, 0x3e,
- 0x3f, 0x2f, 0x2b, 0x3e, 0xb9, 0x1b, 0x27, 0xbe, 0x65, 0xe2, 0x3c, 0x3e,
- 0x0f, 0xc0, 0xce, 0xbe, 0x7f, 0x36, 0xde, 0xbd, 0xe7, 0x4e, 0x05, 0xbe,
- 0xbe, 0x7c, 0xe7, 0xbc, 0x44, 0x7b, 0x71, 0xbd, 0xda, 0x1a, 0xfd, 0x3d,
- 0xb0, 0x24, 0x68, 0xbe, 0xbd, 0x86, 0xdb, 0xbe, 0xf5, 0x96, 0xd4, 0xbd,
- 0x5c, 0x74, 0xd4, 0xbd, 0xca, 0x3e, 0x01, 0xbe, 0x32, 0x55, 0xa3, 0xbd,
- 0xf2, 0x18, 0x8e, 0xbd, 0x96, 0x3e, 0x5f, 0x3e, 0x53, 0x6d, 0xc3, 0x3e,
- 0x8b, 0xbb, 0x80, 0xbd, 0x1d, 0x1a, 0xba, 0x3e, 0xe5, 0xfc, 0x9f, 0xbd,
- 0x69, 0x0f, 0x4b, 0xbd, 0xea, 0x00, 0xc9, 0xbe, 0xe5, 0xcc, 0x35, 0xbf,
- 0x5f, 0x3d, 0x26, 0x3e, 0x57, 0x0d, 0x9d, 0xbe, 0x69, 0x86, 0xee, 0xbd,
- 0x12, 0x31, 0x27, 0x3d, 0x11, 0x53, 0x35, 0x3e, 0x64, 0x71, 0x97, 0x3e,
- 0xc4, 0x14, 0x95, 0xbe, 0x31, 0x23, 0x70, 0x3e, 0xa9, 0xd9, 0xe0, 0x3d,
- 0xd2, 0xf9, 0x3e, 0xbd, 0x85, 0x78, 0xf7, 0xbc, 0xca, 0x68, 0xde, 0xbd,
- 0x20, 0x9e, 0x3d, 0xbf, 0x52, 0x9c, 0x01, 0xbf, 0xac, 0x45, 0xb8, 0xbd,
- 0x74, 0x64, 0x18, 0xbf, 0x56, 0x3f, 0x52, 0x3e, 0xf7, 0x4d, 0x89, 0x3e,
- 0xa7, 0xfb, 0x1f, 0xbd, 0x10, 0xff, 0x29, 0x3e, 0x59, 0x34, 0xc6, 0xbd,
- 0x87, 0x28, 0xdc, 0x3e, 0xd3, 0x2f, 0x08, 0xbe, 0xe7, 0xc9, 0x4f, 0xbe,
- 0xa1, 0x20, 0x75, 0xbf, 0x68, 0x1b, 0x4f, 0x3e, 0x79, 0xe6, 0x40, 0xbe,
- 0x6b, 0xdb, 0xa8, 0xbe, 0xdd, 0x92, 0x0b, 0x3d, 0x4d, 0xf4, 0x8b, 0x3c,
- 0xcb, 0xe8, 0x06, 0x3f, 0x6a, 0x11, 0xf4, 0xbd, 0x96, 0x3c, 0xc5, 0xbb,
- 0x12, 0x95, 0x55, 0xbf, 0x4a, 0x0c, 0xc2, 0xbd, 0xfb, 0x79, 0x94, 0x3d,
- 0xe1, 0x31, 0x02, 0xbe, 0xeb, 0x80, 0x02, 0xbf, 0x89, 0x23, 0x3e, 0x3e,
- 0xcb, 0x9a, 0x6d, 0xbd, 0xfd, 0xf5, 0x14, 0x3c, 0xd0, 0x96, 0xa0, 0x3b,
- 0x34, 0x7b, 0x93, 0xbe, 0xd2, 0x04, 0x40, 0xbe, 0x85, 0x96, 0xf5, 0x3d,
- 0x43, 0xf4, 0xc3, 0xbe, 0xda, 0xef, 0x2e, 0x3d, 0xd5, 0x27, 0x6d, 0xbe,
- 0xdf, 0x65, 0xae, 0xbe, 0x71, 0x91, 0x62, 0x3e, 0xca, 0xe8, 0x8c, 0x3e,
- 0x4e, 0xe6, 0xba, 0xbd, 0x14, 0xc8, 0x81, 0x3d, 0x4b, 0xfb, 0xba, 0x3d,
- 0x13, 0x49, 0x9e, 0xbc, 0xb6, 0xb6, 0xbb, 0x3e, 0xb8, 0xd9, 0xb1, 0x3c,
- 0x8b, 0x01, 0x81, 0xbe, 0xf2, 0xdf, 0xe5, 0xbb, 0x34, 0x9a, 0x7a, 0xbf,
- 0x97, 0x28, 0x35, 0xbc, 0xd6, 0x4c, 0x9d, 0x3e, 0x85, 0x4e, 0x8d, 0xbd,
- 0x37, 0xcd, 0x11, 0xbf, 0xd0, 0xf1, 0x5e, 0x3d, 0x65, 0xf2, 0xff, 0xbc,
- 0xc3, 0x72, 0xc8, 0xbc, 0xe1, 0xab, 0xb7, 0x3b, 0x58, 0x99, 0x59, 0x3e,
- 0x5e, 0x5e, 0xee, 0x3e, 0xed, 0xdf, 0x2c, 0x3e, 0x2a, 0x3f, 0xad, 0xbe,
- 0x8a, 0xf4, 0x86, 0x3e, 0xb3, 0x3b, 0xeb, 0x3d, 0x44, 0xeb, 0x5b, 0x3e,
- 0x10, 0x1e, 0x3a, 0xbe, 0xa6, 0xfd, 0x64, 0x3e, 0x9e, 0xb2, 0xa3, 0xbe,
- 0x7c, 0xe9, 0x3b, 0x3e, 0x4a, 0x17, 0x66, 0xbe, 0xeb, 0xa5, 0x22, 0xbd,
- 0x36, 0x91, 0xfd, 0xbd, 0x49, 0xcf, 0xad, 0xbe, 0x54, 0x43, 0x33, 0x3e,
- 0x0a, 0x4b, 0x52, 0x3e, 0x0a, 0x4e, 0x04, 0xbf, 0x03, 0x10, 0xb3, 0x3d,
- 0xb8, 0xf5, 0xe4, 0xbd, 0x34, 0xb4, 0x2b, 0x3e, 0x10, 0x99, 0x09, 0x3e,
- 0xcb, 0xf4, 0x99, 0x3e, 0xa8, 0xcb, 0xe5, 0x3d, 0xd8, 0xb2, 0x0b, 0x3d,
- 0x8c, 0xf7, 0x9a, 0xbd, 0x53, 0x3d, 0x8d, 0xbe, 0xa6, 0x6f, 0x9e, 0xbe,
- 0x1c, 0x47, 0xae, 0xbe, 0x9d, 0xc8, 0x41, 0xbe, 0x66, 0x85, 0x01, 0x3f,
- 0x22, 0xa8, 0xd2, 0x3c, 0x7e, 0x40, 0x96, 0x3e, 0x01, 0xe3, 0xdb, 0xbd,
- 0x97, 0x50, 0xa4, 0xbd, 0xba, 0xd4, 0x55, 0xbe, 0x40, 0xa5, 0x3b, 0x3d,
- 0x55, 0x5b, 0x50, 0x3e, 0x4d, 0x0f, 0x32, 0x3e, 0xef, 0xb3, 0xfa, 0xbd,
- 0x6e, 0x90, 0x5d, 0xbe, 0x33, 0xce, 0x25, 0xbf, 0xb9, 0x7c, 0xf9, 0xbd,
- 0x8c, 0x52, 0x3d, 0x3e, 0x86, 0xdc, 0x09, 0xbe, 0x78, 0x37, 0x66, 0xbe,
- 0x0c, 0x83, 0x4d, 0xbf, 0x22, 0x5f, 0xb1, 0xbd, 0x24, 0x96, 0x67, 0x3e,
- 0x45, 0x42, 0x4c, 0xbe, 0x1d, 0x61, 0x4f, 0xbc, 0x55, 0xe4, 0xdd, 0xbd,
- 0xe2, 0xfa, 0x0b, 0x3e, 0x8a, 0xe6, 0xa3, 0x3e, 0x10, 0xa0, 0xf3, 0xbe,
- 0x18, 0x0b, 0xa3, 0x3e, 0x54, 0x9b, 0x39, 0xbc, 0x41, 0x37, 0xb1, 0xbd,
- 0x92, 0x33, 0x3e, 0x3e, 0x6f, 0x6c, 0x8a, 0xbe, 0xc4, 0x52, 0x5c, 0xbf,
- 0x92, 0x34, 0x30, 0xbd, 0xb1, 0xd7, 0xd6, 0xbd, 0x7b, 0x53, 0xdd, 0xbc,
- 0xfc, 0x33, 0x50, 0x3d, 0x36, 0x3d, 0x34, 0xbd, 0xb3, 0x6d, 0x4f, 0x3e,
- 0x02, 0xd1, 0x64, 0x3e, 0x23, 0xda, 0x18, 0x3f, 0x80, 0x06, 0x07, 0xbf,
- 0x76, 0xf4, 0xcc, 0x3d, 0xa4, 0x42, 0x5a, 0x3e, 0xca, 0x1e, 0x87, 0x3d,
- 0x35, 0xdb, 0x50, 0x3d, 0xdd, 0xf2, 0x86, 0x3e, 0xa6, 0x28, 0xe4, 0x3e,
- 0xae, 0x1b, 0xfd, 0xbe, 0xa5, 0x12, 0xbb, 0xbd, 0xb4, 0xfc, 0x19, 0x3c,
- 0xea, 0x13, 0x35, 0xbe, 0x8d, 0xaa, 0x83, 0xbd, 0x6b, 0x76, 0x5c, 0xbe,
- 0x8b, 0x4b, 0x94, 0xbe, 0xb8, 0x08, 0x7e, 0xbd, 0xea, 0xe4, 0xe0, 0xbd,
- 0x4c, 0x61, 0xfc, 0x3d, 0x51, 0xf0, 0x94, 0xbe, 0x9c, 0x7d, 0xfc, 0xbd,
- 0x09, 0x1f, 0xdf, 0x3c, 0x5b, 0xe7, 0x00, 0xbf, 0x6d, 0xff, 0x6e, 0x3e,
- 0xf4, 0x90, 0xa3, 0x3c, 0x93, 0xe4, 0x5c, 0x3e, 0x3a, 0xd1, 0xa0, 0xbe,
- 0x97, 0xdf, 0x86, 0x3d, 0xec, 0xcd, 0xc4, 0x3c, 0x25, 0x8b, 0x18, 0x3f,
- 0xaa, 0xc6, 0x9d, 0x3c, 0x6f, 0xb0, 0xce, 0xbd, 0xb3, 0x98, 0x9f, 0xbd,
- 0xd1, 0xcd, 0x8b, 0xbe, 0x5b, 0x4c, 0x5c, 0xbe, 0x63, 0xef, 0x97, 0xbe,
- 0x98, 0xba, 0x40, 0xbe, 0xa4, 0xc6, 0x39, 0xbe, 0xdc, 0xe5, 0xc2, 0xbd,
- 0xc7, 0x72, 0xac, 0xbe, 0x20, 0xd6, 0xb0, 0xbe, 0xca, 0x3e, 0xcf, 0xbe,
- 0x44, 0xe9, 0x6a, 0xbe, 0xb4, 0xce, 0xa2, 0x3d, 0xe4, 0xb4, 0xc2, 0xbe,
- 0x4a, 0x21, 0x00, 0xbe, 0xeb, 0xde, 0xa2, 0xbd, 0x9d, 0x1d, 0x80, 0xbe,
- 0x9f, 0x15, 0x6c, 0x3e, 0x0e, 0x0e, 0xb4, 0xbe, 0x79, 0x4f, 0x57, 0xbf,
- 0x6b, 0x3a, 0x32, 0x3e, 0x2a, 0xff, 0x08, 0x3d, 0x42, 0x6f, 0xc7, 0x3d,
- 0xae, 0xbe, 0x6a, 0xbd, 0x10, 0x02, 0x59, 0xbe, 0xc7, 0xd6, 0x00, 0xbd,
- 0xdc, 0xb0, 0x98, 0x3e, 0xc0, 0x93, 0x7c, 0xbe, 0x0d, 0x95, 0xa5, 0xbd,
- 0xb7, 0xb3, 0xd0, 0x3d, 0x86, 0x12, 0x49, 0x3c, 0xf1, 0xad, 0x0a, 0x3e,
- 0xef, 0x48, 0x26, 0x3f, 0x22, 0x3c, 0x12, 0x3c, 0x19, 0x5e, 0x06, 0xbf,
- 0x3d, 0x0c, 0xf0, 0x3e, 0xb2, 0xe3, 0x8b, 0x3c, 0xea, 0xea, 0x8d, 0x3e,
- 0x82, 0xc8, 0x4a, 0x3d, 0x97, 0xbe, 0xc1, 0xbe, 0x86, 0xa3, 0x93, 0xbe,
- 0xda, 0xdd, 0x78, 0xbe, 0x6d, 0x74, 0x09, 0xbf, 0x57, 0xc9, 0x5f, 0xbc,
- 0x47, 0xfb, 0xb7, 0xbe, 0x2c, 0x04, 0x53, 0x3e, 0x08, 0xd2, 0xce, 0x3e,
- 0x81, 0xa9, 0x88, 0x3e, 0x2a, 0x85, 0x08, 0x3b, 0xf3, 0x5f, 0x55, 0xbe,
- 0x83, 0x11, 0x97, 0x3e, 0xe8, 0x34, 0x46, 0x3d, 0xba, 0x0c, 0x7b, 0xbd,
- 0x97, 0xb5, 0xed, 0xbd, 0x07, 0x4c, 0x44, 0x3e, 0x56, 0x20, 0x11, 0xbe,
- 0x44, 0x21, 0x10, 0xbd, 0x61, 0xd9, 0xce, 0x3e, 0xd8, 0x50, 0xa8, 0x3e,
- 0xa4, 0x8d, 0x64, 0x3e, 0xbf, 0x09, 0x68, 0xbe, 0xfd, 0x70, 0xe4, 0x3d,
- 0x46, 0x6f, 0x98, 0x3d, 0xca, 0xba, 0x9f, 0x3d, 0x71, 0xd0, 0xfc, 0x3d,
- 0x9c, 0xa2, 0x85, 0x3d, 0x6b, 0x32, 0x91, 0xbd, 0x75, 0xb1, 0x08, 0xbe,
- 0xe0, 0x56, 0xb0, 0x3e, 0x62, 0xa8, 0x1d, 0x3e, 0x78, 0xd0, 0xf4, 0xbd,
- 0x38, 0x63, 0x60, 0xbe, 0x71, 0xd2, 0x75, 0xbe, 0xf8, 0xbb, 0x76, 0xbe,
- 0xa5, 0x1b, 0x8b, 0xbe, 0xf8, 0x88, 0x6e, 0xbe, 0xde, 0x44, 0x2c, 0x3f,
- 0xca, 0x90, 0xbd, 0xbe, 0x6c, 0x03, 0x18, 0x3e, 0xb4, 0x90, 0xd9, 0xbb,
- 0x4a, 0x60, 0x3c, 0xbd, 0xd4, 0xda, 0xb4, 0xbe, 0x47, 0x1b, 0x0a, 0xbe,
- 0xe7, 0xd5, 0xf2, 0x3c, 0xca, 0x0d, 0x5c, 0x3e, 0xa2, 0xcf, 0xb0, 0xbe,
- 0x39, 0xba, 0x7f, 0xbe, 0xdb, 0xf4, 0x9f, 0x3d, 0xc5, 0xb6, 0x42, 0xbd,
- 0xaa, 0xf3, 0x2d, 0x3e, 0x8d, 0x20, 0xfb, 0x3e, 0xe3, 0x62, 0x60, 0x3e,
- 0x84, 0x1f, 0x86, 0x3e, 0xfd, 0xb9, 0x58, 0xbe, 0x68, 0xda, 0xd5, 0x3e,
- 0xfe, 0x8c, 0xf3, 0x3d, 0x9a, 0xba, 0xbf, 0x3d, 0x33, 0x53, 0x09, 0x3e,
- 0xe6, 0xb3, 0x7b, 0xbc, 0xa4, 0x78, 0x05, 0x3d, 0x48, 0xda, 0x14, 0xbe,
- 0x39, 0x92, 0x0f, 0xbe, 0x28, 0x11, 0x78, 0x3e, 0x34, 0x77, 0x7c, 0x3d,
- 0xfc, 0xe1, 0x41, 0xbd, 0x11, 0x56, 0x46, 0xbe, 0xae, 0x5f, 0x4d, 0xbe,
- 0xdf, 0x75, 0xfa, 0x3e, 0xae, 0xe7, 0x7a, 0x3e, 0xa3, 0x48, 0x14, 0x3f,
- 0x05, 0xdb, 0xc5, 0x3d, 0x85, 0x88, 0x60, 0xbd, 0x66, 0x85, 0xdc, 0xbe,
- 0x3d, 0x76, 0x22, 0xbd, 0xd2, 0x29, 0x7f, 0xbe, 0x7b, 0x3d, 0xc5, 0x3d,
- 0x3d, 0xd7, 0x76, 0xbe, 0x90, 0x68, 0x82, 0xba, 0xea, 0x96, 0xb0, 0xbd,
- 0x9e, 0x25, 0x84, 0xbe, 0x7e, 0xcf, 0x81, 0x3e, 0x1b, 0x61, 0xfa, 0xbd,
- 0xcb, 0xe6, 0x7b, 0x3c, 0x5a, 0xb0, 0x17, 0x3c, 0xfa, 0x79, 0xa3, 0xbc,
- 0x62, 0x90, 0x1e, 0xbe, 0x3e, 0x8f, 0xc7, 0xbc, 0x34, 0x14, 0x61, 0xbd,
- 0x1c, 0x9f, 0xc4, 0x3e, 0x4f, 0x89, 0x0d, 0xbd, 0x62, 0x5f, 0x6a, 0xbe,
- 0xe0, 0xc4, 0xb9, 0x3d, 0x66, 0x06, 0x18, 0xbe, 0xee, 0x9e, 0xa8, 0x3e,
- 0xc5, 0x51, 0xb9, 0xbe, 0xf5, 0x8f, 0x87, 0x3d, 0x48, 0xae, 0xbc, 0x3e,
- 0xbb, 0x9e, 0xb4, 0xbf, 0xe7, 0x8c, 0xc5, 0x3e, 0x37, 0x6c, 0x19, 0x3c,
- 0xa3, 0x1e, 0x1a, 0x3e, 0x98, 0xe4, 0x6f, 0xbd, 0x87, 0x19, 0x9b, 0x3e,
- 0xbb, 0xc9, 0xf3, 0x3d, 0xae, 0x5e, 0x90, 0x3e, 0x65, 0x26, 0xa5, 0xbd,
- 0xac, 0xbb, 0xf9, 0x3c, 0xd3, 0x60, 0x69, 0xbe, 0xe2, 0x66, 0xea, 0xbd,
- 0x4d, 0x50, 0x2b, 0xbf, 0x7a, 0x7d, 0x6c, 0x3e, 0xea, 0x97, 0xdb, 0x3e,
- 0xa8, 0xc3, 0xcb, 0x3e, 0x52, 0xb1, 0xc7, 0x3d, 0x55, 0xa0, 0x89, 0xbe,
- 0x62, 0x23, 0x8c, 0x3e, 0x36, 0x6d, 0x88, 0x3e, 0x90, 0x94, 0x72, 0xbe,
- 0xef, 0x1b, 0xaf, 0xbe, 0xf0, 0x7a, 0x57, 0xbe, 0xd9, 0xc9, 0xf0, 0x3e,
- 0x10, 0x5a, 0xd2, 0x3e, 0xb4, 0x57, 0xec, 0x3e, 0x28, 0x16, 0xc0, 0xbd,
- 0x8b, 0x56, 0x51, 0x3d, 0xe9, 0xe1, 0x98, 0x3d, 0x5e, 0xdc, 0x98, 0x3d,
- 0x7f, 0xdb, 0xb8, 0x3e, 0x8c, 0x7e, 0x90, 0x3e, 0x08, 0x52, 0x8f, 0x3e,
- 0x48, 0xed, 0xb6, 0xbe, 0x7f, 0x45, 0x8b, 0xbe, 0x8a, 0xad, 0x86, 0x3e,
- 0xd7, 0xf7, 0x03, 0x3f, 0x83, 0xd6, 0x85, 0x3e, 0xa9, 0x58, 0xa1, 0xbc,
- 0x73, 0xb9, 0x14, 0x3c, 0x5c, 0xbb, 0xf0, 0x3e, 0x49, 0x5e, 0xa3, 0xbd,
- 0xdb, 0xbf, 0xb0, 0x3d, 0xc6, 0xb3, 0x8d, 0xbd, 0x8f, 0xd9, 0xae, 0x3e,
- 0x7d, 0x5c, 0x9b, 0xbe, 0xfd, 0xe4, 0x7b, 0xbe, 0xe0, 0x32, 0xa9, 0xbe,
- 0x3d, 0x50, 0x46, 0xbf, 0x6a, 0x4a, 0x9f, 0xbf, 0x8d, 0x7c, 0xc0, 0xbe,
- 0x72, 0x95, 0xcb, 0x3e, 0x17, 0x06, 0x9b, 0xbd, 0xb6, 0x18, 0xe7, 0xbd,
- 0xb2, 0x14, 0x8d, 0xbc, 0x1e, 0x6a, 0x34, 0xbd, 0xd4, 0xe8, 0x3e, 0x3e,
- 0x81, 0x40, 0xf7, 0xbd, 0x49, 0x07, 0x12, 0xbf, 0xff, 0xd5, 0xc9, 0x3c,
- 0xb5, 0x6b, 0x6f, 0x3e, 0x51, 0x19, 0xe3, 0xbe, 0xbb, 0x67, 0x81, 0xbf,
- 0xf1, 0x59, 0xb2, 0x3d, 0x12, 0x30, 0xef, 0x3e, 0xd3, 0xd8, 0x9a, 0x3e,
- 0x08, 0xad, 0x9f, 0xbe, 0xb8, 0x75, 0x41, 0x3d, 0xd2, 0xb7, 0x61, 0xbe,
- 0xe2, 0x84, 0x6d, 0xbf, 0x95, 0x6f, 0x31, 0xbe, 0xe0, 0x0c, 0x95, 0xbc,
- 0xa3, 0x14, 0xda, 0xbd, 0x9c, 0xd0, 0x16, 0xbe, 0x1e, 0xa0, 0xdd, 0x3c,
- 0x96, 0x37, 0x81, 0xbe, 0x35, 0x9e, 0x82, 0xbe, 0x25, 0xfb, 0x93, 0xbd,
- 0x70, 0xda, 0xfb, 0xbd, 0x99, 0xb1, 0x2e, 0x3e, 0x6e, 0xde, 0x56, 0xbf,
- 0x27, 0x48, 0x08, 0x3d, 0x10, 0x15, 0x64, 0x3c, 0x0c, 0x4b, 0x89, 0xbe,
- 0x3a, 0xf4, 0xa4, 0x3e, 0x38, 0xde, 0x99, 0x3d, 0x80, 0x16, 0x95, 0x3e,
- 0x60, 0xab, 0x80, 0x3e, 0x52, 0xa3, 0xe2, 0x3e, 0x68, 0x45, 0xaa, 0x3e,
- 0xee, 0xa3, 0x94, 0xbe, 0xa1, 0x1d, 0x89, 0x3e, 0xfc, 0xa0, 0xe6, 0xbe,
- 0xbd, 0xe3, 0x3c, 0x3d, 0xff, 0x35, 0x03, 0x3e, 0x6a, 0x00, 0x44, 0xbd,
- 0xc3, 0x30, 0xb6, 0x3d, 0x95, 0xae, 0x9c, 0xbe, 0x1b, 0x83, 0x5c, 0xbe,
- 0x48, 0x92, 0x63, 0x3c, 0xf1, 0x54, 0xfc, 0xbe, 0x48, 0xa7, 0xbc, 0x3e,
- 0xc9, 0x14, 0x82, 0x3e, 0x7c, 0x07, 0xb2, 0x3e, 0x97, 0x7b, 0x29, 0x3e,
- 0xc6, 0x1c, 0x66, 0xbe, 0x91, 0x89, 0xa5, 0x3c, 0x95, 0xd5, 0xe0, 0xbc,
- 0x9c, 0xfb, 0xf4, 0xbe, 0xed, 0x7d, 0xf2, 0x3d, 0xf0, 0x78, 0x91, 0xbd,
- 0x4f, 0x97, 0x3a, 0x3d, 0xd2, 0x64, 0x09, 0xbf, 0x63, 0x35, 0xbd, 0x3e,
- 0x3f, 0x86, 0x84, 0xbd, 0x0d, 0xc5, 0x67, 0x3e, 0x73, 0xcc, 0x86, 0xbe,
- 0x5e, 0x47, 0x6c, 0xbf, 0xd5, 0x1b, 0x9b, 0xbe, 0xed, 0xf1, 0x78, 0xbd,
- 0x22, 0x53, 0x84, 0xbe, 0xb7, 0x8b, 0xd9, 0x3d, 0xad, 0xa9, 0x82, 0x3e,
- 0xc0, 0x5f, 0xa0, 0xbe, 0x14, 0xa2, 0xda, 0xbe, 0xf3, 0x4f, 0xfc, 0xbd,
- 0x6f, 0xc9, 0x72, 0xbe, 0x3b, 0xbd, 0xc1, 0x3d, 0x57, 0x4a, 0x41, 0x3e,
- 0x82, 0xa3, 0x07, 0x3e, 0xf2, 0x64, 0x48, 0xbd, 0xd0, 0xa6, 0x2f, 0xbe,
- 0x17, 0xf0, 0x2d, 0xbe, 0x01, 0x2d, 0xc2, 0xbe, 0x6b, 0xdb, 0xa5, 0x3c,
- 0x39, 0xb3, 0x6c, 0xbe, 0xe9, 0xf1, 0xa9, 0xbe, 0xaa, 0x99, 0x29, 0x3e,
- 0x2b, 0xf5, 0xbc, 0xbd, 0xa7, 0xad, 0xee, 0x3d, 0xcc, 0xea, 0x75, 0x3e,
- 0x66, 0x65, 0x92, 0xbd, 0x95, 0xec, 0x7e, 0xbe, 0x4f, 0x13, 0xc0, 0x3e,
- 0x95, 0xee, 0xcd, 0x3d, 0xef, 0x56, 0x76, 0xbe, 0xdf, 0xb1, 0x35, 0x3c,
- 0x0d, 0x29, 0x9f, 0xbc, 0xe4, 0x0c, 0x00, 0xbe, 0x7c, 0x33, 0x36, 0xbe,
- 0xfa, 0x5c, 0x67, 0xbe, 0xf3, 0x08, 0x50, 0x3d, 0x02, 0x67, 0x51, 0xbd,
- 0xca, 0x4c, 0x97, 0xbd, 0xa5, 0xae, 0x5f, 0x3e, 0x8b, 0xef, 0x63, 0x3c,
- 0x7a, 0x58, 0xb9, 0xbe, 0x3f, 0x28, 0xd8, 0x3d, 0xf4, 0xba, 0x50, 0xbe,
- 0xf1, 0x04, 0x57, 0x3e, 0xa5, 0x7a, 0xc3, 0x3c, 0x94, 0xf6, 0xfb, 0xbd,
- 0x5c, 0xef, 0x03, 0xbe, 0xbc, 0x47, 0x80, 0xbe, 0x41, 0xd4, 0xea, 0x3d,
- 0xce, 0x38, 0xfa, 0x3c, 0x87, 0xb0, 0xdd, 0xbd, 0x21, 0x3d, 0x73, 0xbd,
- 0x0c, 0x9f, 0xae, 0xbc, 0x4e, 0x79, 0xaa, 0xbe, 0x03, 0x98, 0x1a, 0xbd,
- 0x19, 0xd0, 0x1d, 0xbf, 0x17, 0xec, 0x45, 0x3e, 0xbd, 0x54, 0xdc, 0xbd,
- 0x71, 0xcb, 0x44, 0xbd, 0x0b, 0x62, 0xa1, 0x3e, 0x88, 0x9d, 0xa4, 0xbe,
- 0xad, 0x02, 0xab, 0x3d, 0xf4, 0x28, 0x9a, 0xbe, 0x96, 0xfd, 0xa7, 0x3d,
- 0x45, 0x51, 0x9f, 0xbe, 0xf6, 0xca, 0x1e, 0xbd, 0x41, 0x26, 0xaa, 0x3e,
- 0x30, 0xc8, 0x1f, 0x3e, 0x0f, 0xed, 0x73, 0xbe, 0x52, 0x81, 0xd6, 0xbe,
- 0x77, 0xd5, 0x65, 0x3e, 0x69, 0xab, 0x2b, 0xbe, 0xe3, 0x49, 0x36, 0xbe,
- 0x86, 0xc4, 0xa1, 0x3e, 0x3b, 0x7e, 0xe7, 0xbc, 0x5d, 0xb4, 0x15, 0x3e,
- 0xb6, 0x48, 0x86, 0x3d, 0xea, 0x13, 0xea, 0xbe, 0xfe, 0xd5, 0x15, 0xbe,
- 0xfa, 0x24, 0xb6, 0x3c, 0xc5, 0xa5, 0xb5, 0xbd, 0x52, 0x13, 0x3f, 0xbd,
- 0x5b, 0x3d, 0x0c, 0xbe, 0xdb, 0xd3, 0xca, 0xbe, 0xc0, 0xcd, 0xaa, 0xbe,
- 0x74, 0x62, 0xe8, 0x3b, 0xe7, 0x9c, 0x24, 0x3d, 0x7e, 0xc3, 0x93, 0x3c,
- 0x22, 0x94, 0xb3, 0x3d, 0x04, 0x34, 0xb8, 0xbd, 0x57, 0x0c, 0xde, 0xbe,
- 0x54, 0xac, 0x50, 0xbe, 0x5a, 0xb3, 0x00, 0xbe, 0x75, 0xf7, 0x3a, 0xbf,
- 0xe1, 0xe2, 0xef, 0x3d, 0x80, 0x56, 0x2b, 0xbd, 0x20, 0xf4, 0xab, 0xbe,
- 0x82, 0xb7, 0x85, 0xbc, 0x99, 0xc0, 0x67, 0xbd, 0xb5, 0x1e, 0xce, 0xbc,
- 0x47, 0x6a, 0x29, 0xbd, 0x5e, 0x23, 0x05, 0x3d, 0xbe, 0xa7, 0x36, 0xbd,
- 0xc8, 0x01, 0xe2, 0xbe, 0x40, 0xc2, 0x92, 0xbd, 0xae, 0xf7, 0x30, 0xbe,
- 0x34, 0xc4, 0xde, 0x3c, 0xc8, 0x59, 0x49, 0x3e, 0x22, 0x42, 0x91, 0x3c,
- 0x85, 0xaa, 0x23, 0xbf, 0x1c, 0x7e, 0x10, 0x3e, 0xd8, 0x83, 0x4d, 0xbe,
- 0xcb, 0x06, 0x52, 0x3e, 0x35, 0x62, 0xbb, 0xbd, 0xa9, 0xea, 0x3d, 0x3e,
- 0x2b, 0x5c, 0x3d, 0xbe, 0x3f, 0x7d, 0xc0, 0xbb, 0x77, 0x14, 0x93, 0x3d,
- 0xe1, 0x16, 0x7d, 0x3b, 0x14, 0x82, 0xf8, 0x3d, 0x00, 0x37, 0xd8, 0x3d,
- 0xd8, 0x2f, 0x50, 0x3e, 0x2b, 0x42, 0x04, 0xbe, 0xfa, 0x16, 0x59, 0xbe,
- 0x6e, 0xa3, 0x00, 0x3e, 0x03, 0x61, 0x88, 0x3e, 0x74, 0xb3, 0xe8, 0xbd,
- 0xd3, 0xbd, 0x5b, 0xbf, 0x71, 0xcc, 0x2e, 0x3d, 0x0f, 0xf6, 0x3a, 0xbd,
- 0xee, 0x9b, 0x22, 0xbf, 0xa1, 0x83, 0xd5, 0xbe, 0x1d, 0xdd, 0x85, 0x3d,
- 0xfd, 0xf9, 0xf9, 0x3c, 0x66, 0xf3, 0x03, 0x3c, 0xed, 0xd9, 0x63, 0xbe,
- 0xfe, 0xa7, 0x8b, 0xbe, 0xf5, 0x68, 0xd5, 0xbe, 0xd6, 0xe8, 0x38, 0xbe,
- 0x67, 0xcc, 0x77, 0x3d, 0xe7, 0xe9, 0x99, 0xbe, 0x16, 0xee, 0x14, 0xbe,
- 0xed, 0x96, 0xfb, 0x3d, 0x43, 0xc6, 0x05, 0x3e, 0xaf, 0x9f, 0x98, 0x3e,
- 0xa1, 0xb7, 0x15, 0x3f, 0xae, 0xf7, 0x45, 0xbe, 0x25, 0x9a, 0xcd, 0x3e,
- 0x73, 0xa7, 0x23, 0xbe, 0xe3, 0xe5, 0x02, 0xbe, 0x33, 0x8f, 0x87, 0x3c,
- 0x00, 0xc9, 0x25, 0x3f, 0x1f, 0x91, 0x9c, 0x3e, 0xf3, 0x77, 0xf3, 0x3c,
- 0x6a, 0x34, 0x97, 0xbe, 0xa0, 0x73, 0xa1, 0x3e, 0x4d, 0xe9, 0x96, 0x3e,
- 0x5f, 0x1f, 0xdc, 0xbd, 0xa3, 0x66, 0x99, 0x3e, 0xdc, 0x94, 0x31, 0xbe,
- 0xb6, 0xbe, 0x0b, 0xbe, 0x91, 0xb7, 0x90, 0x3e, 0x1c, 0xef, 0xae, 0x3e,
- 0x8a, 0xc2, 0x5c, 0xbd, 0xe4, 0xe9, 0x01, 0x3f, 0x07, 0x63, 0xac, 0xbd,
- 0x6e, 0xf4, 0xd7, 0xbe, 0x73, 0xbe, 0xf9, 0x3d, 0x9f, 0x83, 0x0f, 0xbf,
- 0x43, 0x34, 0x3a, 0x3d, 0x54, 0x61, 0x6e, 0x3d, 0xa2, 0xf0, 0x8d, 0xbd,
- 0x1e, 0xc6, 0x85, 0x3e, 0x6b, 0x73, 0x1a, 0xbe, 0xb2, 0x00, 0x80, 0x3e,
- 0x59, 0x50, 0xf6, 0x3d, 0xe0, 0x7f, 0xd9, 0x3e, 0x4c, 0x3e, 0xdd, 0xbe,
- 0x3f, 0x2a, 0x9a, 0xbe, 0x54, 0x0a, 0x32, 0x3e, 0x65, 0xf7, 0xcf, 0x3c,
- 0xf4, 0xf8, 0x3b, 0x3e, 0x1a, 0x26, 0x83, 0xbe, 0xed, 0xa9, 0x2d, 0x3e,
- 0x1b, 0x67, 0xb3, 0xbe, 0x0e, 0xf0, 0xaf, 0x3e, 0x83, 0x24, 0xaf, 0xbe,
- 0x5f, 0xf0, 0x69, 0xbe, 0x77, 0xac, 0x83, 0x3e, 0x32, 0x57, 0x18, 0xbf,
- 0xb6, 0x2f, 0xbf, 0x3d, 0xba, 0x8d, 0xf0, 0x3d, 0xc6, 0xba, 0x48, 0xbe,
- 0xe2, 0x8c, 0x28, 0x3e, 0xcd, 0xdf, 0x67, 0xba, 0x12, 0x41, 0x97, 0xbe,
- 0x56, 0xdf, 0x06, 0xbd, 0x18, 0x04, 0x83, 0x3e, 0x58, 0xc4, 0x6f, 0xbe,
- 0x5c, 0x01, 0x0f, 0x3d, 0x63, 0x4d, 0x5e, 0x3e, 0xef, 0xc9, 0xc9, 0xbc,
- 0xf7, 0x0b, 0x17, 0xbf, 0x69, 0x1c, 0xc6, 0xbe, 0x26, 0x8e, 0x22, 0xbe,
- 0x1d, 0xef, 0x56, 0x3d, 0x8c, 0x73, 0xdd, 0x3e, 0x88, 0xdb, 0x56, 0xbd,
- 0x6c, 0x89, 0xba, 0x3d, 0xa3, 0xb4, 0x44, 0xbd, 0x5f, 0x4a, 0x86, 0x3d,
- 0x15, 0x65, 0xd3, 0x3e, 0xf3, 0x07, 0x33, 0x3e, 0x41, 0x33, 0x89, 0xbe,
- 0xde, 0x60, 0x78, 0x3e, 0xcd, 0x74, 0xba, 0xbe, 0x24, 0x08, 0xf7, 0x3d,
- 0xe2, 0xea, 0x96, 0x3d, 0x10, 0x60, 0x03, 0x3c, 0x7e, 0xa5, 0x7e, 0xbc,
- 0xb7, 0x99, 0x0a, 0xbe, 0x36, 0x25, 0xf6, 0x3d, 0xd9, 0xd9, 0xb7, 0xbe,
- 0x78, 0x95, 0x9e, 0x3d, 0xca, 0x51, 0x71, 0xbd, 0x98, 0x55, 0xee, 0x3c,
- 0xfe, 0xb0, 0xc2, 0x39, 0xfe, 0x4f, 0x05, 0x3e, 0xd1, 0xde, 0x96, 0xbe,
- 0x77, 0xc3, 0x36, 0x3e, 0xc1, 0x9b, 0x15, 0x3e, 0x79, 0xc0, 0x7b, 0x3d,
- 0xd2, 0xec, 0x31, 0x3e, 0x7b, 0x91, 0xee, 0xbc, 0xfa, 0x13, 0x0f, 0x3e,
- 0xbb, 0x44, 0x36, 0xbd, 0x3e, 0x1c, 0x19, 0xbe, 0x98, 0xf1, 0x2c, 0x3e,
+ uint8_t bytes[528];
+ float values[132];
+} 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,
}};
-const int32_t dnn_hiddenlayer_0_bias_part_0_shape[1] = {117};
+const int32_t dnn_hiddenlayer_2_kernel_part_0_shape[2] = {123, 132};
const union {
- uint8_t bytes[468];
- float values[117];
-} dnn_hiddenlayer_0_bias_part_0 = {{
- 0x59, 0x5b, 0xb5, 0xbe, 0xc0, 0x8d, 0xa1, 0x3f, 0x64, 0xf8, 0x08, 0xbc,
- 0x1c, 0x24, 0xce, 0x3f, 0x08, 0x17, 0x52, 0x3f, 0x5b, 0xf8, 0x27, 0x3f,
- 0x7e, 0x38, 0x8b, 0x3e, 0xa4, 0xeb, 0x49, 0x3d, 0x5e, 0xe4, 0xfb, 0xbe,
- 0x91, 0xd7, 0xb1, 0xbf, 0x59, 0x8a, 0x0f, 0xbd, 0x3b, 0x5c, 0xb5, 0xbd,
- 0x15, 0xef, 0x30, 0x3f, 0x6b, 0xd3, 0x29, 0xbf, 0x0c, 0xb3, 0x8e, 0xbf,
- 0x7b, 0xef, 0x0d, 0xbf, 0x91, 0x4d, 0x1a, 0xbe, 0xd3, 0xe4, 0xf1, 0xbe,
- 0x66, 0x12, 0x88, 0xbf, 0x24, 0xac, 0x00, 0xbf, 0x71, 0xad, 0x00, 0x3f,
- 0x9a, 0x90, 0x12, 0x3f, 0xcc, 0xd3, 0xab, 0xbe, 0x52, 0xd9, 0xbd, 0xbe,
- 0x4b, 0x1b, 0x38, 0xbe, 0xe3, 0x85, 0x82, 0x3e, 0xfd, 0x66, 0xf3, 0xbe,
- 0x2b, 0x35, 0x08, 0xc0, 0x32, 0xab, 0x5f, 0xbd, 0x23, 0xfa, 0xb1, 0xbe,
- 0xb4, 0x90, 0x20, 0xbe, 0x1d, 0x0d, 0x52, 0xbf, 0x03, 0xbe, 0x79, 0x3e,
- 0xc2, 0x32, 0xb1, 0x3e, 0x10, 0x9d, 0xe8, 0xbd, 0xee, 0xd1, 0x87, 0xbf,
- 0xea, 0xa3, 0x30, 0x3f, 0x13, 0x07, 0xe6, 0xbd, 0x0f, 0xed, 0xa9, 0x3e,
- 0x35, 0x0a, 0x28, 0xbf, 0x59, 0x04, 0x3c, 0xbe, 0x0a, 0x3e, 0x4b, 0xbc,
- 0x94, 0x3a, 0x8b, 0x3e, 0x3a, 0x26, 0xd6, 0x3e, 0x7f, 0x9c, 0x69, 0x3f,
- 0x20, 0x15, 0x68, 0xbe, 0x31, 0x4d, 0x93, 0xbf, 0xae, 0x07, 0x27, 0xbd,
- 0x9d, 0x76, 0xbe, 0x3e, 0x06, 0xdb, 0xd2, 0xbe, 0x4c, 0xe2, 0xc6, 0x3f,
- 0x8e, 0xe4, 0x34, 0x3d, 0x3a, 0xbe, 0x90, 0x3f, 0x94, 0xb3, 0x1e, 0x3e,
- 0x4f, 0x59, 0xff, 0x3e, 0xff, 0x31, 0xf7, 0xbe, 0x9b, 0xf5, 0xb5, 0x3f,
- 0x8b, 0x3f, 0x2e, 0x3e, 0xb2, 0xbd, 0x91, 0xbf, 0x29, 0xb0, 0x2a, 0x3f,
- 0xaf, 0x1e, 0xae, 0x3d, 0xca, 0x0d, 0xe4, 0xbe, 0xc2, 0xe0, 0x63, 0xbd,
- 0xaf, 0x2d, 0x39, 0xbf, 0xf3, 0x64, 0x12, 0xbe, 0x43, 0x02, 0xd9, 0x3e,
- 0xbf, 0x43, 0x86, 0x3f, 0x90, 0xad, 0xd2, 0x3e, 0x9d, 0x11, 0xde, 0xbe,
- 0x65, 0xdd, 0x62, 0x3e, 0x1f, 0xd1, 0xaa, 0xbe, 0x8f, 0x24, 0x0d, 0x3e,
- 0x7b, 0xfd, 0x65, 0xbf, 0x1c, 0xbd, 0x83, 0x3e, 0x59, 0xe9, 0xdb, 0xbe,
- 0x96, 0x5c, 0x16, 0xbe, 0x42, 0x37, 0x8b, 0x3f, 0x7f, 0x6d, 0xaa, 0xbf,
- 0xc7, 0xa2, 0x9f, 0xbf, 0x69, 0x82, 0x98, 0x3c, 0xeb, 0xc0, 0x12, 0xbc,
- 0xd6, 0x1a, 0xa9, 0xbc, 0x5c, 0xbc, 0xb4, 0x3e, 0x13, 0x5e, 0x31, 0xbf,
- 0xde, 0x96, 0x9e, 0x3e, 0x79, 0x2e, 0xf6, 0x3e, 0x6b, 0xd9, 0x8a, 0xbe,
- 0x1a, 0x80, 0x87, 0xbd, 0x69, 0x8e, 0xfb, 0xbc, 0xcf, 0x7d, 0x9d, 0xbe,
- 0x92, 0x05, 0x50, 0x3f, 0x57, 0xe9, 0x32, 0xbe, 0x21, 0x52, 0x02, 0xbe,
- 0x04, 0x34, 0xbf, 0x3e, 0xd9, 0x69, 0xe7, 0x3e, 0x3e, 0x31, 0x5f, 0xbe,
- 0x38, 0x34, 0x8a, 0x3f, 0x13, 0xd2, 0xd3, 0xbe, 0x10, 0xd0, 0x52, 0x3f,
- 0x7e, 0x50, 0xad, 0xbf, 0xe4, 0x53, 0x01, 0xbf, 0x9f, 0x3a, 0x4f, 0xbf,
- 0xe9, 0xc6, 0x23, 0x3e, 0x78, 0x48, 0xcc, 0x3f, 0xa1, 0x87, 0x2f, 0xbf,
- 0x26, 0x2e, 0x01, 0xbd, 0xbe, 0xc4, 0x08, 0x3e, 0x66, 0x64, 0x17, 0x3f,
- 0x49, 0x17, 0x81, 0xbe, 0x83, 0xcd, 0x0e, 0x3f, 0xad, 0x57, 0xa7, 0xbe,
- 0x5c, 0xee, 0x45, 0x3f, 0x20, 0x5c, 0xb3, 0xbd, 0xcb, 0x3c, 0x16, 0x3f,
- 0x36, 0x62, 0x8e, 0x3f, 0x9f, 0x86, 0xcb, 0xbe, 0x14, 0xd8, 0x46, 0xbe,
+ uint8_t bytes[64944];
+ float values[16236];
+} 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,
}};
-const int32_t dnn_hiddenlayer_1_bias_part_0_shape[1] = {115};
+const int32_t dnn_logits_bias_part_0_shape[1] = {1};
const union {
- uint8_t bytes[460];
- float values[115];
-} dnn_hiddenlayer_1_bias_part_0 = {{
- 0x10, 0xe3, 0x39, 0xbe, 0x4f, 0x03, 0x09, 0xbf, 0x7e, 0x13, 0xb4, 0xbd,
- 0x6f, 0xdb, 0x2a, 0x3f, 0xeb, 0x70, 0x30, 0x3e, 0xba, 0xaa, 0x2f, 0x3f,
- 0x76, 0x64, 0x94, 0x3e, 0x17, 0xf9, 0xf9, 0xbd, 0x47, 0x74, 0x47, 0x3d,
- 0xce, 0x3a, 0x01, 0xbf, 0xaf, 0xc0, 0x15, 0x3f, 0x5f, 0x00, 0x29, 0xbe,
- 0x75, 0x06, 0xca, 0x3d, 0x75, 0xf6, 0x3d, 0x3f, 0x02, 0x00, 0x17, 0x3d,
- 0x30, 0x02, 0xbe, 0x3c, 0xb9, 0x3f, 0x8a, 0x3f, 0xcf, 0x28, 0x9f, 0xbf,
- 0xb0, 0x86, 0x4c, 0xbe, 0x28, 0xc3, 0x18, 0xbf, 0x39, 0xa3, 0xe9, 0xbe,
- 0x40, 0x66, 0x0c, 0x3f, 0xb4, 0x96, 0xa0, 0xbe, 0xc8, 0x64, 0x7e, 0x3f,
- 0xf5, 0x84, 0xfc, 0xbe, 0x6c, 0x24, 0xb7, 0xbd, 0xb6, 0x80, 0x53, 0x3f,
- 0xf5, 0x86, 0x24, 0x3f, 0x82, 0x18, 0x04, 0xbf, 0x56, 0x1c, 0x30, 0xbe,
- 0x10, 0x5f, 0x6a, 0xbf, 0xd2, 0xe5, 0xa4, 0x3f, 0x35, 0xc2, 0xbd, 0xbe,
- 0xe1, 0x22, 0x90, 0x3d, 0xb8, 0x65, 0x2e, 0xbe, 0x9e, 0xe9, 0x94, 0xbe,
- 0x7f, 0x10, 0xd7, 0xbc, 0x13, 0x33, 0x27, 0xbb, 0xf1, 0x3b, 0xe2, 0x3d,
- 0x21, 0xfd, 0x8e, 0xbd, 0x3c, 0x10, 0xcc, 0x3e, 0x0e, 0xcb, 0x81, 0xbf,
- 0xff, 0x10, 0x27, 0x3f, 0x4b, 0x28, 0xa9, 0x3e, 0x19, 0xfb, 0x11, 0x3f,
- 0xb5, 0x04, 0xca, 0x3e, 0xd2, 0x61, 0x9b, 0xbf, 0x16, 0xd5, 0x48, 0x3c,
- 0x7d, 0xff, 0x0c, 0x3e, 0x35, 0xdd, 0xb6, 0xbf, 0xcb, 0x11, 0xbe, 0xbe,
- 0x06, 0x39, 0x65, 0xbf, 0x0c, 0xe7, 0xa1, 0x3e, 0xda, 0x60, 0x2e, 0xbf,
- 0x04, 0xbc, 0xc7, 0xbe, 0x0d, 0x33, 0x5c, 0x3f, 0x8a, 0xae, 0x39, 0x3f,
- 0xc4, 0xfc, 0x4b, 0x3f, 0xe9, 0x40, 0x19, 0x3f, 0x00, 0xe0, 0x00, 0xbf,
- 0xb1, 0xc1, 0x81, 0x3e, 0xa7, 0x8e, 0x93, 0xbe, 0xe3, 0x0c, 0xc2, 0xbf,
- 0x37, 0x6c, 0xbc, 0xbf, 0x75, 0x72, 0x88, 0xbe, 0x9d, 0x22, 0x24, 0x3d,
- 0xb5, 0xd3, 0xff, 0xbe, 0xc7, 0xdd, 0x4e, 0xbf, 0xd7, 0x29, 0x5c, 0x3f,
- 0xb1, 0x8a, 0x06, 0xbf, 0x2b, 0xef, 0x9a, 0x3d, 0x6b, 0xb1, 0x1d, 0xbe,
- 0xde, 0xfc, 0x79, 0xbe, 0xe0, 0x4d, 0xf6, 0xbd, 0x5d, 0x27, 0x77, 0xbe,
- 0xe8, 0xff, 0x2e, 0xbd, 0xe7, 0x06, 0x47, 0xbd, 0x30, 0xd1, 0x6d, 0x3f,
- 0x21, 0xa8, 0x4b, 0x3f, 0x2e, 0x72, 0xa7, 0x3e, 0x9b, 0x2b, 0x8c, 0x3f,
- 0x85, 0x29, 0xaf, 0xbe, 0x21, 0xd4, 0x15, 0x3f, 0xfd, 0x06, 0x06, 0xbe,
- 0xc6, 0x89, 0xc3, 0x3e, 0x2a, 0xef, 0x69, 0x3d, 0x59, 0xe2, 0x3b, 0xbf,
- 0x9e, 0xe5, 0x73, 0xbe, 0x19, 0x07, 0xa3, 0xbe, 0xd7, 0xcb, 0x94, 0xbf,
- 0xad, 0xd9, 0x05, 0xbf, 0xaf, 0xed, 0x20, 0xbe, 0x60, 0x61, 0x81, 0xbe,
- 0x8b, 0x98, 0x1c, 0xbf, 0xd0, 0x76, 0xfb, 0x3e, 0x41, 0x5e, 0x8f, 0xbe,
- 0x83, 0x0d, 0xe7, 0x3e, 0xc1, 0x5e, 0x0e, 0x3f, 0xbe, 0x45, 0x84, 0x3e,
- 0x19, 0x8a, 0x81, 0xbf, 0x0f, 0xc7, 0x6e, 0xbe, 0x2d, 0x0f, 0x2b, 0x3f,
- 0xe8, 0x59, 0x25, 0x3f, 0xfc, 0x87, 0x0e, 0xbf, 0x00, 0x30, 0x01, 0x3f,
- 0x5a, 0x84, 0x94, 0x3e, 0x7e, 0x26, 0x51, 0x3f, 0xd7, 0xf7, 0x4b, 0xbd,
- 0x20, 0x77, 0x29, 0xbf, 0x70, 0x0f, 0x36, 0x3c, 0x18, 0xe6, 0x33, 0x3f,
- 0x89, 0xb3, 0x14, 0x3f, 0xdf, 0xaa, 0x8e, 0x3e, 0xa5, 0x8b, 0xd7, 0xbe,
- 0x95, 0xee, 0x68, 0xbf,
+ uint8_t bytes[4];
+ float values[1];
+} dnn_logits_bias_part_0 = {{
+ 0x8a,
+ 0x71,
+ 0x85,
+ 0xbd,
}};
-const int32_t dnn_hiddenlayer_2_kernel_part_0_shape[2] = {115, 59};
+const int32_t dnn_logits_kernel_part_0_shape[2] = {132, 1};
const union {
- uint8_t bytes[27140];
- float values[6785];
-} dnn_hiddenlayer_2_kernel_part_0 = {{
- 0x23, 0x6e, 0x75, 0xbc, 0x56, 0x0d, 0xca, 0xbe, 0xb1, 0x1b, 0xa1, 0x3e,
- 0x13, 0xc7, 0xf7, 0x3d, 0x20, 0xdd, 0x41, 0xbe, 0xa1, 0x1e, 0x6d, 0x3e,
- 0x55, 0x32, 0xe1, 0xbe, 0x44, 0xf3, 0x4c, 0x3e, 0x44, 0x41, 0x31, 0xbd,
- 0xbc, 0x4d, 0xe2, 0xbd, 0x07, 0x11, 0x32, 0x3e, 0xee, 0x0d, 0x42, 0x3e,
- 0xb1, 0x9c, 0xe0, 0x3c, 0x09, 0xd3, 0x9a, 0x3e, 0x70, 0x93, 0x99, 0xbe,
- 0xe3, 0xa2, 0x10, 0xbf, 0xf9, 0x58, 0xd6, 0xbe, 0x08, 0xec, 0x16, 0x3f,
- 0x43, 0x33, 0x8b, 0x3e, 0xaa, 0xd7, 0x61, 0x3e, 0xa0, 0x7f, 0xf0, 0xbe,
- 0xdd, 0x6f, 0x10, 0x3e, 0xb6, 0xc2, 0x8f, 0xbd, 0x38, 0x1d, 0x2b, 0x3e,
- 0xfc, 0x63, 0x6a, 0x3e, 0x36, 0xea, 0x24, 0xbd, 0x54, 0x5e, 0x1d, 0xbe,
- 0x4e, 0x31, 0x70, 0xbe, 0xfe, 0x12, 0xb0, 0x3e, 0x7d, 0x07, 0x12, 0x3e,
- 0x2f, 0xd8, 0xe3, 0x3e, 0x60, 0xa7, 0x13, 0x3f, 0xae, 0xc3, 0xca, 0x3d,
- 0x15, 0xdd, 0xf1, 0xbe, 0x33, 0x2f, 0x30, 0xbe, 0x21, 0x91, 0x8c, 0x3e,
- 0x43, 0x17, 0xbd, 0xbd, 0x9f, 0x88, 0xed, 0xbd, 0x82, 0xd9, 0x43, 0x3e,
- 0x35, 0xde, 0x94, 0xbd, 0xa7, 0x42, 0xa6, 0xbe, 0x24, 0x8a, 0x22, 0xbe,
- 0xda, 0x7b, 0xb3, 0x3e, 0x41, 0x3c, 0x85, 0x3d, 0x61, 0x74, 0x7f, 0x3e,
- 0x36, 0x0f, 0xdb, 0x3d, 0xdc, 0xce, 0x36, 0xbf, 0x32, 0xe5, 0x25, 0xbf,
- 0xf8, 0xd3, 0x9a, 0xbe, 0xe8, 0x90, 0xe8, 0x3e, 0x2d, 0x83, 0xa5, 0xbe,
- 0x6d, 0xb6, 0x11, 0xbd, 0xd0, 0x81, 0x69, 0x3d, 0x6f, 0xdc, 0x1f, 0xbd,
- 0x44, 0x73, 0x07, 0xbe, 0x94, 0xba, 0xae, 0x3d, 0xb5, 0xd9, 0xbb, 0xbe,
- 0x46, 0x2e, 0xaf, 0xbe, 0x56, 0xaf, 0x1e, 0x3e, 0xf7, 0xf0, 0x31, 0x3e,
- 0xf0, 0xf8, 0x6c, 0x3d, 0xb2, 0x70, 0x5d, 0x3d, 0xbb, 0x6c, 0x04, 0xbe,
- 0x34, 0x33, 0x29, 0x3e, 0x33, 0xcc, 0x6f, 0x3e, 0xf3, 0xec, 0x49, 0x3e,
- 0xf7, 0x60, 0x28, 0x3e, 0x71, 0xcb, 0x21, 0x3e, 0xaf, 0xcc, 0x3a, 0xbf,
- 0x3c, 0xed, 0x42, 0x3e, 0x15, 0x55, 0x85, 0x3b, 0x1a, 0x69, 0x42, 0xbf,
- 0x12, 0x8c, 0x8f, 0xbe, 0x8f, 0xa9, 0x84, 0xbd, 0xf4, 0x0c, 0x95, 0xbc,
- 0x22, 0x88, 0x04, 0x3e, 0x2c, 0xb4, 0x9f, 0x3d, 0x4b, 0xbe, 0xd5, 0x3b,
- 0x16, 0x26, 0xb7, 0xbe, 0x0a, 0x39, 0xc8, 0x3d, 0x76, 0x21, 0x55, 0x3d,
- 0x6d, 0x11, 0x02, 0xbe, 0x50, 0xde, 0x90, 0xbd, 0xae, 0xf1, 0x17, 0x3d,
- 0x9c, 0xf2, 0xc3, 0x3d, 0x91, 0x8a, 0xbf, 0xbe, 0xd5, 0x76, 0xa7, 0xbd,
- 0xa6, 0xa1, 0xbd, 0xbe, 0x7c, 0xaf, 0x0c, 0xbe, 0x54, 0x05, 0x77, 0xbe,
- 0x66, 0x41, 0x85, 0xbe, 0x4f, 0xa7, 0x27, 0xbd, 0x21, 0x4f, 0xbb, 0xbe,
- 0x4d, 0x4b, 0x27, 0xbf, 0xcf, 0xa9, 0x50, 0xbe, 0x7d, 0xa0, 0xca, 0x3b,
- 0x87, 0x70, 0x84, 0x3b, 0x59, 0x7a, 0x29, 0xbe, 0x53, 0xc6, 0x66, 0x3d,
- 0x45, 0x25, 0x96, 0xbe, 0xe6, 0x8b, 0x6a, 0xbd, 0x65, 0xf5, 0xa6, 0x3b,
- 0x17, 0x5f, 0x3e, 0x3d, 0x11, 0x79, 0xe0, 0xbc, 0x46, 0x53, 0x65, 0xbb,
- 0x23, 0x85, 0x5c, 0xbe, 0x94, 0x49, 0x8f, 0x3e, 0x7b, 0x64, 0x11, 0xbe,
- 0x34, 0x7b, 0x3c, 0xbf, 0x7e, 0x6d, 0x34, 0x3e, 0x50, 0xcf, 0x60, 0xbe,
- 0xd0, 0xbe, 0xb7, 0xbe, 0x07, 0xff, 0x3d, 0x3e, 0x2d, 0x6f, 0x80, 0x3e,
- 0x01, 0x52, 0xcb, 0xbe, 0xcd, 0xa0, 0x24, 0xbd, 0x2d, 0xd2, 0x15, 0xbe,
- 0xad, 0x52, 0xe6, 0xbd, 0x9a, 0x11, 0xa9, 0xbe, 0x76, 0xc8, 0x4f, 0xbe,
- 0x0b, 0x04, 0x2b, 0xbe, 0x33, 0x5a, 0x0d, 0xbf, 0x48, 0x9e, 0xc2, 0x3e,
- 0x8a, 0x81, 0xba, 0xbe, 0x05, 0xdc, 0xbb, 0x3e, 0x57, 0x4a, 0x89, 0xbd,
- 0x84, 0x12, 0x89, 0xbe, 0xcb, 0xb9, 0x47, 0x3d, 0x77, 0xbb, 0xb6, 0x3c,
- 0x64, 0x95, 0x45, 0xbd, 0x09, 0xdb, 0x91, 0xbe, 0x95, 0x51, 0xeb, 0xbe,
- 0xdf, 0x0a, 0x13, 0x3e, 0xc3, 0x40, 0xe2, 0xbd, 0xbd, 0x4e, 0x81, 0x3e,
- 0xf8, 0x49, 0x08, 0xbc, 0x5f, 0x23, 0xa4, 0x3e, 0x4f, 0x34, 0xdb, 0x3e,
- 0x86, 0xb4, 0xb0, 0xbe, 0xef, 0xb7, 0xd9, 0x3d, 0x5a, 0xd2, 0x9f, 0xbd,
- 0x82, 0x3f, 0x3f, 0xbe, 0xd3, 0x2f, 0xa2, 0x3e, 0x99, 0x69, 0x4b, 0xbe,
- 0xe7, 0xa0, 0x83, 0xbd, 0xfe, 0x72, 0x2a, 0xbe, 0x49, 0x2d, 0x9f, 0xbe,
- 0x4c, 0x1f, 0x59, 0xbe, 0x7e, 0x98, 0xff, 0x3d, 0x0c, 0x03, 0xa6, 0x3e,
- 0x5c, 0xbe, 0x1c, 0x3d, 0x1a, 0xed, 0x95, 0x3d, 0x4a, 0x7e, 0xdf, 0xbd,
- 0xa8, 0x6a, 0x25, 0xbe, 0x2d, 0xb7, 0xe8, 0xbe, 0x5a, 0x4b, 0xd2, 0xbd,
- 0x4c, 0x2f, 0xa5, 0x3e, 0x1a, 0x51, 0x3b, 0xbd, 0x20, 0xd8, 0x84, 0x3e,
- 0x3b, 0xe3, 0x2f, 0xbe, 0x55, 0xd3, 0x91, 0xbe, 0xa2, 0x27, 0x6a, 0xbe,
- 0xa8, 0x5f, 0x41, 0xbe, 0x4d, 0xcc, 0xff, 0x3e, 0xa2, 0xf5, 0xf5, 0xbe,
- 0x11, 0xbd, 0xfd, 0x3d, 0x76, 0x19, 0x3e, 0xbe, 0x36, 0xd3, 0xc6, 0xbe,
- 0x98, 0x17, 0x8c, 0xbd, 0x76, 0x4a, 0x75, 0xbe, 0x2a, 0x5f, 0x45, 0xbf,
- 0xce, 0xe0, 0xcd, 0xbe, 0x94, 0x2f, 0x82, 0xbc, 0x60, 0xd9, 0xed, 0xbd,
- 0x91, 0x88, 0x4f, 0x3e, 0xa2, 0x11, 0x86, 0xbc, 0x21, 0xb6, 0xb7, 0x3e,
- 0x19, 0xb9, 0x32, 0x3e, 0x2f, 0xd1, 0xa6, 0x3e, 0x7a, 0xab, 0xbc, 0x3d,
- 0x43, 0xe1, 0x8f, 0x3e, 0xc6, 0xf0, 0xf1, 0xbe, 0xa4, 0x19, 0x84, 0x3b,
- 0x7a, 0x00, 0x0c, 0x3f, 0x40, 0x0a, 0x79, 0x3e, 0x12, 0xfd, 0x37, 0xbf,
- 0xa3, 0x0e, 0x8b, 0xbd, 0xb2, 0xcb, 0x65, 0xbe, 0x06, 0x8e, 0x94, 0xbe,
- 0xd2, 0x68, 0x3d, 0x3e, 0x0a, 0x0a, 0x7c, 0xbd, 0x97, 0x8d, 0x14, 0xbf,
- 0xda, 0x48, 0x40, 0x3f, 0x60, 0xad, 0xfe, 0x3d, 0x40, 0x06, 0x2e, 0xbe,
- 0x47, 0x07, 0x81, 0xbe, 0xc6, 0x32, 0x30, 0x3f, 0xc7, 0x60, 0xf6, 0x3d,
- 0xd0, 0x82, 0x3f, 0xbf, 0xc1, 0x51, 0xb9, 0x3e, 0xbf, 0xcc, 0x9a, 0xbe,
- 0x2a, 0xd2, 0x03, 0xbd, 0x59, 0xd6, 0x2c, 0x3f, 0x81, 0x84, 0x81, 0xbe,
- 0x82, 0x1b, 0x93, 0x3d, 0x54, 0xf3, 0x90, 0xbe, 0x6a, 0xad, 0x4d, 0x3d,
- 0x53, 0x57, 0xdb, 0x3e, 0x05, 0x89, 0xa7, 0xbe, 0xfa, 0x8f, 0xce, 0x3e,
- 0x3e, 0xca, 0xaf, 0xbd, 0xa9, 0xeb, 0x22, 0xbf, 0x1d, 0xa7, 0xaf, 0x3d,
- 0xcc, 0x5c, 0x07, 0x3e, 0x86, 0x02, 0x09, 0x3e, 0x93, 0xa0, 0x5e, 0xbe,
- 0x8c, 0x0f, 0x1d, 0xbf, 0x0f, 0x82, 0xbd, 0x3d, 0x08, 0xe9, 0x64, 0xbd,
- 0xa9, 0x20, 0x4c, 0xbd, 0x26, 0x1f, 0xe6, 0xbc, 0x86, 0x0e, 0x9a, 0x3e,
- 0x9d, 0x75, 0xc1, 0xbd, 0xbb, 0x71, 0xe9, 0xbe, 0xd7, 0x98, 0x83, 0x3e,
- 0xcd, 0x51, 0x29, 0xbe, 0x7b, 0xb4, 0x98, 0xbd, 0xd5, 0xdc, 0xb1, 0xbe,
- 0xf6, 0xc5, 0x2b, 0x3d, 0xb4, 0x93, 0x2b, 0x3e, 0xd0, 0x52, 0xf0, 0x3d,
- 0x94, 0x3c, 0x25, 0xba, 0xf9, 0xd0, 0x92, 0xbd, 0xf4, 0xb2, 0xac, 0xbe,
- 0x3b, 0x3b, 0xda, 0xbe, 0x2a, 0x0d, 0x07, 0xbe, 0xc5, 0x4b, 0x29, 0xbe,
- 0x6e, 0x52, 0x97, 0x3c, 0x19, 0xbd, 0x9e, 0xbc, 0x8d, 0x35, 0x45, 0xbc,
- 0x18, 0x5d, 0xe4, 0x3b, 0xc2, 0xe7, 0xe9, 0xbe, 0xda, 0x74, 0xd6, 0xbe,
- 0x1c, 0xaa, 0x6f, 0xbe, 0x1f, 0x74, 0x0c, 0x3e, 0x19, 0x38, 0x4a, 0xbe,
- 0xf7, 0xf4, 0x0a, 0xbf, 0x06, 0xa5, 0x23, 0xbe, 0xc7, 0xef, 0x22, 0x3d,
- 0x5f, 0x9a, 0xfa, 0x3b, 0xeb, 0xa7, 0x90, 0xbe, 0xec, 0x2d, 0x6f, 0xbe,
- 0xbb, 0x4e, 0x43, 0x3e, 0x89, 0x8f, 0x19, 0xbe, 0xbd, 0xc4, 0x1f, 0xbf,
- 0x44, 0x05, 0x8a, 0x3e, 0x2f, 0xdf, 0x96, 0x3b, 0x65, 0x95, 0xc8, 0x3d,
- 0xb6, 0x09, 0xaf, 0xbd, 0x36, 0x39, 0xa9, 0xbe, 0x8e, 0x9d, 0x6e, 0xbe,
- 0x7b, 0x92, 0x00, 0xbf, 0x77, 0xd8, 0x90, 0xbe, 0x9e, 0xd4, 0x2c, 0x3e,
- 0x55, 0x9f, 0xc4, 0xbe, 0xf4, 0x0d, 0xcc, 0xbe, 0xac, 0x37, 0xa5, 0xbe,
- 0xe9, 0xee, 0x02, 0xbf, 0x55, 0x9d, 0xbc, 0xbd, 0x9b, 0x79, 0x18, 0xbe,
- 0x6b, 0x13, 0xcd, 0x3d, 0x95, 0xe5, 0x9a, 0x3e, 0x0e, 0xb6, 0xb4, 0x3e,
- 0x46, 0xc9, 0x80, 0xbe, 0xf8, 0x2d, 0xc7, 0xbd, 0x5a, 0xa3, 0x93, 0x3c,
- 0x89, 0x34, 0xc2, 0x3d, 0x3e, 0x66, 0x03, 0xbd, 0x1c, 0x34, 0xd4, 0xbe,
- 0x0d, 0x4e, 0xe5, 0x3d, 0x57, 0xde, 0x47, 0x3e, 0xdf, 0xf4, 0x12, 0xbf,
- 0xff, 0xfa, 0x27, 0xbf, 0xda, 0x21, 0x28, 0xbe, 0x19, 0x65, 0x0a, 0x3e,
- 0xa6, 0x23, 0x93, 0xbe, 0x16, 0x8c, 0xba, 0xbe, 0x62, 0x81, 0x30, 0xbe,
- 0xd0, 0x27, 0x66, 0x3d, 0x28, 0x22, 0x07, 0xbd, 0x49, 0xba, 0x00, 0xbf,
- 0xe9, 0x72, 0x21, 0x3e, 0x96, 0x0f, 0x10, 0x3e, 0xa5, 0xd1, 0xd6, 0xbe,
- 0xb5, 0xde, 0xfa, 0x3d, 0x0b, 0x4a, 0x8e, 0xbe, 0x0d, 0x10, 0x49, 0x3e,
- 0x7a, 0x4f, 0x08, 0xbf, 0xce, 0x19, 0xc6, 0xbe, 0xbf, 0x5c, 0x6e, 0x3d,
- 0x1f, 0x60, 0x5b, 0xbe, 0x1b, 0x19, 0x49, 0xbc, 0x5b, 0x90, 0x08, 0xbf,
- 0xca, 0x50, 0xd7, 0xbe, 0x44, 0x6b, 0xb7, 0xbe, 0x88, 0xbf, 0x8e, 0x3e,
- 0x68, 0xb0, 0xb4, 0xbe, 0xd7, 0x9b, 0x5f, 0x3e, 0x90, 0x35, 0x13, 0x3e,
- 0xfd, 0x2f, 0x31, 0x3c, 0xee, 0x28, 0xeb, 0xbe, 0x93, 0x8a, 0x86, 0x3d,
- 0x13, 0xc0, 0xbe, 0x3e, 0xf0, 0x93, 0xf0, 0x3e, 0xc4, 0x20, 0x7c, 0xbc,
- 0xa2, 0x71, 0x86, 0x3d, 0x7b, 0x80, 0x8e, 0xbe, 0x76, 0x06, 0x84, 0x3e,
- 0xea, 0x44, 0x0c, 0xbd, 0xf6, 0xd2, 0xe5, 0xbe, 0x3e, 0x68, 0x24, 0x3d,
- 0x8f, 0xa3, 0x58, 0xbe, 0xd3, 0xd4, 0xca, 0xbc, 0xf1, 0x59, 0xb3, 0xbe,
- 0x98, 0x9f, 0x34, 0x3d, 0x40, 0x95, 0x82, 0xbb, 0x7c, 0x5d, 0x2f, 0xbf,
- 0xe2, 0x16, 0x99, 0x3e, 0xc7, 0xf8, 0x30, 0xbe, 0x41, 0x50, 0xe2, 0x3e,
- 0x96, 0x94, 0x83, 0xbe, 0x74, 0x78, 0xaf, 0xbe, 0xce, 0x8e, 0xe4, 0xbd,
- 0x1b, 0x27, 0x58, 0xbd, 0x55, 0x99, 0x37, 0xbe, 0x77, 0xbb, 0x0e, 0xbe,
- 0xe7, 0x61, 0xfc, 0xbd, 0x30, 0x0f, 0x10, 0xbf, 0x4a, 0xc8, 0x2d, 0xbe,
- 0x1f, 0xfe, 0x9d, 0xbe, 0x76, 0xad, 0xd5, 0xbe, 0x66, 0x97, 0x0f, 0xbf,
- 0x4d, 0xd4, 0xe8, 0xbd, 0x5a, 0xb2, 0x06, 0x3e, 0xbf, 0x2f, 0x2d, 0xbf,
- 0x77, 0x21, 0xb1, 0x3e, 0xdb, 0x5a, 0x1d, 0xbe, 0xa0, 0x4f, 0x20, 0xbf,
- 0x1e, 0x15, 0x30, 0xbe, 0xb8, 0x40, 0xd2, 0xbe, 0x11, 0x91, 0x1b, 0xbd,
- 0x0e, 0xd6, 0x52, 0x3e, 0xf0, 0x79, 0x94, 0x3e, 0x90, 0xd6, 0xc1, 0xbe,
- 0x56, 0x78, 0x8a, 0xbd, 0x37, 0x52, 0xfb, 0xbe, 0x29, 0xdc, 0x27, 0x3e,
- 0x24, 0x6d, 0xda, 0xbe, 0xa1, 0x03, 0xc4, 0xbd, 0x64, 0xe6, 0x85, 0xbd,
- 0x24, 0x23, 0x90, 0xbe, 0xe8, 0xed, 0x14, 0xbf, 0xc6, 0x39, 0x31, 0xbe,
- 0x94, 0xfa, 0xd1, 0x3c, 0x11, 0x0e, 0xb6, 0x3e, 0xe7, 0x09, 0xc5, 0xbc,
- 0x64, 0x22, 0xc9, 0xbe, 0xad, 0xbe, 0xad, 0xbd, 0xac, 0x73, 0xc9, 0x3c,
- 0xf2, 0xe7, 0xad, 0x3e, 0xe9, 0x7e, 0xbd, 0x3e, 0x54, 0x05, 0x33, 0x3d,
- 0x57, 0x6b, 0x63, 0x3e, 0xef, 0x26, 0xa9, 0x3d, 0xd2, 0x3a, 0xe1, 0x3e,
- 0x0e, 0x6f, 0x66, 0xbe, 0xc4, 0x1e, 0xbb, 0x3d, 0x53, 0x5a, 0x0c, 0x3e,
- 0x3e, 0x72, 0xab, 0xbd, 0x1c, 0x95, 0xa9, 0x3c, 0x4c, 0xe4, 0xc4, 0xbe,
- 0xdc, 0x3c, 0x21, 0xbf, 0x76, 0x46, 0x41, 0x3c, 0xde, 0xdb, 0x4c, 0x3e,
- 0x5f, 0x60, 0x13, 0x3e, 0xc3, 0x78, 0xc3, 0x3b, 0x0e, 0xb3, 0xdd, 0x3c,
- 0x40, 0xf4, 0x71, 0x3d, 0x61, 0x7c, 0xd3, 0x3d, 0x71, 0x05, 0xd3, 0xbb,
- 0x3b, 0x92, 0xca, 0xbe, 0xb6, 0xf6, 0xe8, 0xbe, 0x87, 0x7b, 0x3a, 0xbe,
- 0xa6, 0xbb, 0xc2, 0x3d, 0x44, 0x26, 0x1e, 0xbf, 0x9c, 0x3a, 0x1b, 0xbc,
- 0x27, 0x46, 0xa1, 0x3e, 0x94, 0x33, 0xf5, 0x3d, 0x2f, 0xfa, 0xc3, 0xbd,
- 0xda, 0xab, 0xba, 0x3d, 0xba, 0x4a, 0xa4, 0x3e, 0x1d, 0x2f, 0x04, 0x3f,
- 0x08, 0x3e, 0xad, 0x3c, 0xa7, 0x77, 0x28, 0x3e, 0x14, 0x71, 0x11, 0xbd,
- 0x0f, 0x48, 0x19, 0x3e, 0x0b, 0xf4, 0x65, 0x3e, 0xaf, 0x6a, 0x0b, 0x3e,
- 0x7b, 0x8b, 0xe8, 0xbe, 0x6a, 0x85, 0x8c, 0xbd, 0x7d, 0x62, 0xeb, 0xbe,
- 0x43, 0x12, 0x11, 0xbe, 0x06, 0x1a, 0xf9, 0xbe, 0xcb, 0x5b, 0xe0, 0xbd,
- 0xf4, 0x9b, 0xb0, 0xbe, 0xf8, 0xe6, 0x27, 0xbf, 0xc5, 0x24, 0x05, 0xbe,
- 0x04, 0xd8, 0x75, 0xbe, 0x48, 0x81, 0xd4, 0xbe, 0xe9, 0x79, 0x09, 0xbf,
- 0x3f, 0x35, 0xa0, 0x3d, 0x7f, 0x4a, 0x3e, 0xbe, 0xfa, 0xc2, 0x3d, 0xbe,
- 0xf0, 0xb2, 0xe6, 0xbd, 0xee, 0xde, 0x6e, 0xbe, 0x2e, 0xae, 0xb2, 0xbe,
- 0x1a, 0xec, 0xda, 0xbe, 0x64, 0xca, 0xbe, 0xbe, 0x94, 0x55, 0x8f, 0xbe,
- 0x62, 0xab, 0xf2, 0xbc, 0x4b, 0xb2, 0xf5, 0x3e, 0x4a, 0x64, 0x3c, 0x3e,
- 0xd3, 0x2a, 0xe5, 0x3e, 0x52, 0xa9, 0xc2, 0xbd, 0x9e, 0xc0, 0x9f, 0xbc,
- 0x9a, 0x06, 0x2f, 0xbe, 0x20, 0xe5, 0xf0, 0x3e, 0x88, 0xd4, 0x4b, 0x3e,
- 0x2b, 0xa4, 0xc4, 0x3e, 0x1a, 0x19, 0xaa, 0xbe, 0x8f, 0x48, 0x19, 0x3e,
- 0x51, 0x6b, 0x6d, 0x3e, 0x64, 0x56, 0x8f, 0x3d, 0x6d, 0x76, 0x3a, 0xbd,
- 0xb4, 0x4e, 0xb4, 0x3e, 0x28, 0x06, 0x62, 0x3d, 0x08, 0xaf, 0xba, 0xbe,
- 0x4a, 0xd2, 0x04, 0xbf, 0x9e, 0xee, 0xff, 0x3e, 0x95, 0x6d, 0xec, 0xbe,
- 0xc4, 0x01, 0xd8, 0xbb, 0xbc, 0xc1, 0x15, 0x3c, 0xc4, 0x9b, 0xd3, 0xbb,
- 0xe7, 0x86, 0xe9, 0x3d, 0xed, 0x91, 0xba, 0x3e, 0xff, 0x54, 0x8c, 0x3c,
- 0xc2, 0xe6, 0xf4, 0xbd, 0x52, 0xe6, 0x61, 0xbe, 0xbf, 0xe9, 0x2e, 0x3c,
- 0x87, 0xb6, 0x60, 0xbf, 0x77, 0xdc, 0x26, 0xbf, 0x43, 0x18, 0x30, 0x3e,
- 0xff, 0x41, 0xe6, 0xbe, 0x3e, 0x1e, 0xec, 0x3d, 0x08, 0x23, 0x0b, 0xbf,
- 0x97, 0x40, 0x65, 0x3e, 0x39, 0x90, 0x19, 0xbe, 0xe1, 0xcd, 0x16, 0xbe,
- 0x2c, 0x19, 0x7f, 0xbe, 0x59, 0x4b, 0x97, 0xbe, 0x0d, 0xda, 0x9c, 0x3e,
- 0xc7, 0x11, 0x23, 0xbe, 0x23, 0x80, 0xa9, 0xbd, 0x45, 0xb2, 0x75, 0xbe,
- 0x84, 0xdc, 0xe1, 0x3e, 0xc5, 0x8f, 0xbc, 0x3d, 0xae, 0x21, 0x23, 0xbd,
- 0xec, 0x8b, 0xeb, 0xbe, 0xba, 0xd0, 0xf8, 0x3e, 0xab, 0x91, 0xbd, 0xbe,
- 0xc5, 0xb8, 0xa0, 0xbe, 0xf5, 0x0a, 0x75, 0xbe, 0xe6, 0x8a, 0x34, 0xbf,
- 0x93, 0x05, 0x04, 0x3f, 0xa7, 0x21, 0x6b, 0xbf, 0xb9, 0x3c, 0x60, 0xbe,
- 0x62, 0x59, 0x80, 0xbd, 0xfd, 0xb5, 0x6d, 0xbe, 0xe1, 0x14, 0x24, 0x3f,
- 0x89, 0xbb, 0xfb, 0xbd, 0x21, 0xf6, 0x1a, 0xbe, 0x35, 0x92, 0x23, 0xbe,
- 0x4c, 0x97, 0x2c, 0xbf, 0x6b, 0xbd, 0x13, 0xbe, 0xad, 0xe6, 0xb8, 0x3e,
- 0xba, 0xe5, 0x82, 0x3e, 0x4f, 0xa3, 0x78, 0xbe, 0x43, 0x06, 0x6b, 0xbf,
- 0x4e, 0xfb, 0xa7, 0xbe, 0x07, 0x9d, 0x9a, 0x3e, 0xfa, 0x8d, 0x89, 0x3e,
- 0x53, 0x47, 0x09, 0xbd, 0x16, 0xe3, 0x36, 0xbf, 0x47, 0x13, 0x69, 0xbf,
- 0xa6, 0x7c, 0xe0, 0x3e, 0x1a, 0x37, 0xb9, 0x3e, 0xe6, 0x06, 0xb7, 0x3d,
- 0x7e, 0xee, 0x8d, 0x3e, 0x8c, 0x24, 0x57, 0xbe, 0x77, 0x6f, 0x8a, 0x3e,
- 0xbe, 0xce, 0x47, 0xbd, 0xa8, 0x7e, 0x08, 0xbc, 0x7a, 0xea, 0xce, 0xbc,
- 0x58, 0x1d, 0xcc, 0xbe, 0x2c, 0x1f, 0x9f, 0x3e, 0xe4, 0x37, 0xa7, 0xbb,
- 0x43, 0x60, 0x7b, 0xbd, 0xdb, 0x1c, 0x00, 0xbe, 0xc2, 0x8e, 0x2d, 0xbf,
- 0x6b, 0x81, 0x2c, 0x3e, 0xf9, 0x5b, 0x11, 0x3f, 0x73, 0x6c, 0x42, 0xbf,
- 0x03, 0x9a, 0xa9, 0x3d, 0xb9, 0x5b, 0x68, 0x3d, 0x02, 0xce, 0x0a, 0xbf,
- 0x41, 0x95, 0x8e, 0xbd, 0x68, 0xd2, 0x14, 0x3e, 0x5b, 0x3a, 0xc3, 0x3d,
- 0x0a, 0xf6, 0x5e, 0xbe, 0x96, 0x06, 0xae, 0x3e, 0xf5, 0x0f, 0xcb, 0x3d,
- 0xa3, 0x92, 0x36, 0xbe, 0x98, 0xa3, 0x05, 0x3c, 0x9d, 0x45, 0x8f, 0xbe,
- 0x5c, 0xb4, 0x4b, 0x3e, 0xdd, 0xce, 0x11, 0x3e, 0x44, 0x1c, 0x06, 0xbf,
- 0xde, 0xf8, 0x62, 0x3c, 0xc7, 0xad, 0x5a, 0x3e, 0x55, 0x33, 0xb1, 0x3d,
- 0xa5, 0x62, 0xe5, 0x3d, 0xc3, 0x1f, 0x3f, 0xbe, 0xda, 0xfc, 0x46, 0xbe,
- 0xca, 0x1f, 0x5f, 0xbe, 0x12, 0x54, 0xe5, 0xbe, 0x5b, 0x91, 0x69, 0x3e,
- 0x60, 0x5e, 0x2d, 0xbf, 0x97, 0x3f, 0x19, 0x3e, 0x0a, 0xdf, 0x3a, 0xbe,
- 0xd6, 0xc6, 0xc3, 0xbd, 0x88, 0x38, 0x0f, 0x3e, 0xbd, 0x19, 0x1f, 0x3e,
- 0x8b, 0x82, 0x86, 0xbe, 0x4a, 0x9b, 0xe9, 0x3d, 0x15, 0xf6, 0x6d, 0x3e,
- 0x18, 0x99, 0x69, 0x3e, 0xac, 0xb1, 0x2a, 0xbf, 0x57, 0x4b, 0x81, 0xbd,
- 0xee, 0x0f, 0x47, 0x3e, 0xf9, 0x97, 0x66, 0x3e, 0x6e, 0xf8, 0x9d, 0x3d,
- 0x17, 0x8e, 0x85, 0xbd, 0xaf, 0xd3, 0x96, 0xbe, 0xfd, 0x90, 0xcc, 0xbd,
- 0x4f, 0x7e, 0xaf, 0xbc, 0x25, 0x1b, 0x6f, 0x3e, 0x25, 0x95, 0x49, 0xbe,
- 0xfb, 0x28, 0x11, 0x3e, 0xa4, 0xd0, 0xcd, 0xbe, 0x08, 0x2d, 0xbb, 0xbe,
- 0x5e, 0x32, 0x52, 0x3e, 0xb1, 0x49, 0x18, 0x3e, 0x2a, 0x65, 0x84, 0x3d,
- 0xf4, 0x70, 0xab, 0x3c, 0x2d, 0xf2, 0xd8, 0xbc, 0xa6, 0xc2, 0xcf, 0x3e,
- 0x37, 0x29, 0xc3, 0x3d, 0xdc, 0x35, 0x52, 0xbe, 0x94, 0xa3, 0x18, 0xbf,
- 0xa4, 0x2e, 0x1a, 0x3e, 0x96, 0x16, 0x23, 0xbe, 0x1c, 0x2b, 0x1e, 0x3e,
- 0x87, 0xae, 0x3e, 0x3e, 0x96, 0x09, 0x87, 0x3c, 0xd3, 0x02, 0x27, 0xbf,
- 0x06, 0x47, 0x08, 0xbd, 0x82, 0x20, 0x86, 0x3d, 0x28, 0x27, 0x17, 0x3c,
- 0x0f, 0x14, 0x81, 0x3e, 0xbd, 0xf5, 0xa9, 0x3e, 0x8b, 0xa0, 0xfe, 0xbe,
- 0xbd, 0xbf, 0x64, 0x3e, 0xca, 0x3c, 0xdd, 0x3e, 0xcf, 0x54, 0x46, 0x3e,
- 0x4e, 0x98, 0xa7, 0xbe, 0xe1, 0x05, 0xa9, 0xbe, 0x90, 0xb7, 0xb4, 0xbc,
- 0x78, 0xce, 0xc3, 0x3e, 0x91, 0x20, 0x29, 0x3e, 0x7f, 0x57, 0xfb, 0xbd,
- 0xcc, 0x62, 0x4a, 0x3e, 0xd1, 0x8f, 0x17, 0x3e, 0xb6, 0x50, 0x91, 0xbe,
- 0xf1, 0x4e, 0x0b, 0x3c, 0x53, 0xba, 0x48, 0xbc, 0x92, 0xaa, 0xed, 0xbd,
- 0xcd, 0xa8, 0xe6, 0xbe, 0x78, 0xc4, 0xd9, 0xbd, 0x49, 0x45, 0x05, 0x3d,
- 0xdc, 0x15, 0x4b, 0xbe, 0x21, 0xc3, 0xa8, 0x3e, 0xe7, 0xec, 0x91, 0x3d,
- 0x62, 0x31, 0x38, 0xbd, 0x9e, 0x82, 0x2f, 0x3e, 0x1d, 0x5a, 0x51, 0x3e,
- 0x17, 0x1b, 0x01, 0x3c, 0x50, 0xfa, 0x91, 0xbe, 0x84, 0x69, 0x11, 0xbc,
- 0x3c, 0xdc, 0x3e, 0x3d, 0x88, 0x34, 0xd9, 0x3d, 0x86, 0x74, 0x9d, 0xbd,
- 0xbb, 0xf8, 0xc5, 0x3e, 0xe4, 0x67, 0x9c, 0x3e, 0x93, 0xf8, 0x1d, 0x3e,
- 0x0a, 0xee, 0xbf, 0xbd, 0x1f, 0x4e, 0xe7, 0xbe, 0x91, 0x47, 0x80, 0xbe,
- 0x4c, 0xa7, 0x96, 0x3d, 0x42, 0x20, 0x62, 0x3d, 0xa2, 0xc5, 0x7c, 0xbd,
- 0x0b, 0x0b, 0x1f, 0x3e, 0xd0, 0x7a, 0xf1, 0xbd, 0x3c, 0xb0, 0x86, 0x3e,
- 0x81, 0xb1, 0x69, 0xbe, 0x3e, 0xac, 0x09, 0xbe, 0x44, 0xa8, 0x79, 0x3e,
- 0x3e, 0xb3, 0xe7, 0xbe, 0x99, 0xa4, 0x10, 0x3e, 0xc3, 0x24, 0xe1, 0x3d,
- 0x37, 0xa5, 0x61, 0x3e, 0xf7, 0xab, 0x74, 0x3c, 0x57, 0x18, 0xf6, 0x3d,
- 0x6c, 0xdb, 0x11, 0xbf, 0xe4, 0x6c, 0x22, 0x3e, 0xfa, 0x48, 0x1f, 0x3d,
- 0xe3, 0xe9, 0x0f, 0xbd, 0x5d, 0x02, 0xec, 0xbe, 0x5e, 0x12, 0xbe, 0xbd,
- 0x2d, 0xe0, 0xc4, 0xbd, 0xeb, 0x57, 0x84, 0xbd, 0xd3, 0xab, 0x19, 0xbe,
- 0x61, 0x92, 0x7a, 0x3d, 0x72, 0x06, 0x34, 0x3e, 0xd7, 0xd0, 0x8f, 0x3d,
- 0x50, 0x5a, 0xc9, 0x3c, 0x8c, 0xd5, 0x0a, 0xbd, 0x44, 0xe4, 0x50, 0x3e,
- 0xd1, 0x2b, 0x1b, 0xbd, 0x2c, 0xdf, 0xa6, 0xbd, 0x89, 0xbd, 0x84, 0x3e,
- 0xc1, 0x7e, 0x9f, 0xbd, 0x61, 0x3e, 0x40, 0x3e, 0x7c, 0x6f, 0x63, 0xbe,
- 0x10, 0x2a, 0x8e, 0xbd, 0x37, 0x3a, 0x05, 0xbe, 0xc4, 0xb4, 0x7c, 0x3e,
- 0x33, 0x7e, 0x87, 0x3e, 0x08, 0x07, 0xa7, 0xbe, 0x20, 0xb2, 0x16, 0xbe,
- 0x0d, 0xb5, 0x22, 0xbe, 0x05, 0xd9, 0xa2, 0x3d, 0xfd, 0x14, 0x78, 0xbe,
- 0x6d, 0x99, 0x7e, 0xbe, 0x37, 0x62, 0x15, 0xbf, 0x66, 0xf9, 0x64, 0x3e,
- 0x29, 0x52, 0x06, 0xbf, 0xe8, 0x1f, 0x04, 0xbf, 0x13, 0x04, 0x15, 0x3e,
- 0x80, 0xc5, 0xfc, 0xbc, 0xd4, 0x36, 0xb5, 0x3e, 0xfb, 0x1e, 0x29, 0x3d,
- 0xa7, 0x4f, 0x84, 0x3e, 0x01, 0x16, 0x56, 0xbe, 0xd4, 0x88, 0x56, 0xbc,
- 0x51, 0x41, 0x09, 0xbf, 0xf8, 0x13, 0xa1, 0x3c, 0x40, 0xba, 0x0b, 0xbe,
- 0xe5, 0xc4, 0x24, 0xbe, 0x58, 0xec, 0x9a, 0xbe, 0x99, 0x2d, 0x62, 0x3e,
- 0x83, 0x34, 0x83, 0x3d, 0xa0, 0xf4, 0xe7, 0x3d, 0x35, 0x7c, 0x8f, 0x3d,
- 0x2e, 0x99, 0xe8, 0x3b, 0x70, 0xba, 0x93, 0xbd, 0xf7, 0x50, 0x60, 0x3c,
- 0x9f, 0xb6, 0x83, 0x3c, 0x5f, 0x17, 0x82, 0xbd, 0x60, 0x3e, 0x4c, 0xbc,
- 0x3d, 0x63, 0xc7, 0xba, 0x72, 0x30, 0xfd, 0xbe, 0xba, 0x53, 0xc1, 0xbe,
- 0xef, 0x5b, 0x3a, 0x3e, 0x56, 0x81, 0x84, 0xbd, 0x7e, 0x55, 0x93, 0x3d,
- 0x42, 0x9a, 0x18, 0xbe, 0x2c, 0x1a, 0xa1, 0xbc, 0x04, 0x3d, 0xb8, 0x3e,
- 0xb0, 0xf1, 0x8e, 0xbd, 0xaf, 0x98, 0x2c, 0x3d, 0xfb, 0x81, 0x03, 0xbe,
- 0x94, 0x5b, 0xac, 0xbd, 0xe7, 0xd6, 0xca, 0xbb, 0xde, 0x30, 0xf6, 0xbe,
- 0x19, 0xa0, 0x21, 0xbf, 0xe9, 0xe7, 0xb1, 0x3d, 0xe3, 0x6d, 0x80, 0x3e,
- 0x82, 0xea, 0x9f, 0xbc, 0x6b, 0x4c, 0xe0, 0x3c, 0x35, 0xe6, 0x98, 0x3d,
- 0x29, 0x95, 0x24, 0xbe, 0x86, 0x73, 0x84, 0x3b, 0xc3, 0x39, 0xa7, 0xbe,
- 0xc7, 0xa8, 0xd8, 0xbd, 0x03, 0x4b, 0x3b, 0x3e, 0x38, 0x68, 0xfe, 0x3d,
- 0x87, 0xc7, 0x03, 0xbe, 0xb8, 0x4d, 0xc4, 0xbc, 0xac, 0x1c, 0x32, 0xbe,
- 0x3a, 0xa5, 0x2a, 0x3f, 0x63, 0x21, 0x8f, 0x3e, 0xf9, 0x2d, 0x9b, 0xbe,
- 0x41, 0xce, 0xcf, 0xbe, 0x05, 0xee, 0x3a, 0xbe, 0x0c, 0xc9, 0xd6, 0x3e,
- 0xca, 0x4f, 0xe4, 0xbc, 0xa5, 0xdf, 0xe9, 0xbd, 0x5b, 0x39, 0x7e, 0xbe,
- 0x0e, 0xd6, 0xc0, 0x3d, 0x8f, 0xc4, 0x30, 0xbf, 0x81, 0x1b, 0xc0, 0xbc,
- 0x88, 0x6a, 0x91, 0x3e, 0x9e, 0xd2, 0xd5, 0x3d, 0xf3, 0xc3, 0x97, 0xbe,
- 0xd7, 0x98, 0x0a, 0x3e, 0x0e, 0xe8, 0x48, 0xbe, 0xf9, 0xa6, 0xae, 0xbb,
- 0x8e, 0x38, 0x42, 0xbe, 0x44, 0x36, 0xb9, 0x3e, 0xb0, 0x73, 0x51, 0x3e,
- 0xcf, 0x0a, 0xf9, 0xbe, 0x04, 0xf2, 0x92, 0x3d, 0x2f, 0x89, 0xfb, 0xbc,
- 0xc9, 0x28, 0xed, 0xbe, 0x3a, 0xc8, 0x39, 0xbf, 0xd7, 0x55, 0xf3, 0xbe,
- 0xb7, 0x4a, 0x47, 0x3e, 0x1a, 0x73, 0x23, 0xbf, 0xcc, 0x0d, 0x23, 0x3e,
- 0x1f, 0xd0, 0xe7, 0xbd, 0x6f, 0x6a, 0x23, 0x3e, 0x6f, 0x52, 0xc0, 0xbe,
- 0x24, 0x81, 0x51, 0x3d, 0x67, 0xb5, 0x52, 0xbe, 0xee, 0x89, 0xe5, 0x3e,
- 0xaa, 0x67, 0x1f, 0xbd, 0xce, 0x9f, 0x81, 0x3e, 0xa4, 0x4e, 0x93, 0xbe,
- 0x95, 0xea, 0x08, 0x3e, 0xe0, 0xb9, 0x21, 0xbe, 0x79, 0x62, 0xef, 0x3d,
- 0x03, 0xb2, 0x8f, 0xbe, 0xf8, 0x2a, 0x6e, 0xbd, 0xe1, 0xa6, 0x9b, 0x3e,
- 0x59, 0x5b, 0xe4, 0xbc, 0x2d, 0x35, 0x36, 0xbd, 0xe5, 0x8c, 0x99, 0xbe,
- 0xb6, 0xc3, 0x03, 0xbf, 0xb0, 0x6e, 0xdb, 0xbe, 0x97, 0xe0, 0x68, 0x3d,
- 0xda, 0xb6, 0xb1, 0x3e, 0x88, 0x95, 0xd0, 0xbe, 0xb1, 0xac, 0x0e, 0xbc,
- 0x5f, 0xab, 0x9b, 0xbe, 0x79, 0xba, 0x6e, 0xbe, 0x2c, 0x7b, 0xfd, 0xbe,
- 0xf8, 0x44, 0xbf, 0xbe, 0x07, 0x81, 0x48, 0x3e, 0x73, 0x1d, 0x66, 0xbe,
- 0x0f, 0xdf, 0xf6, 0xbd, 0xea, 0x10, 0x11, 0x3e, 0xab, 0x2a, 0xf3, 0xbd,
- 0x2a, 0xc3, 0x6a, 0x3e, 0x91, 0xeb, 0x93, 0xbd, 0xdc, 0x24, 0xad, 0xbe,
- 0x1a, 0xee, 0xac, 0xbd, 0x8c, 0x01, 0x08, 0xbf, 0x9f, 0xc4, 0xea, 0x3d,
- 0x36, 0xb9, 0xc8, 0x3d, 0xe7, 0x72, 0x4a, 0x3c, 0x7b, 0x14, 0x79, 0xbe,
- 0x7c, 0xf0, 0x60, 0xbe, 0xb9, 0x93, 0xd6, 0xbd, 0xd8, 0x1d, 0xa7, 0x3e,
- 0xc0, 0xda, 0x83, 0xbd, 0xc0, 0x6b, 0x56, 0xbd, 0xd2, 0x87, 0x02, 0x3e,
- 0x66, 0x93, 0xe6, 0xbd, 0xd8, 0x4c, 0x34, 0x3b, 0xf1, 0xa6, 0x70, 0x3e,
- 0x51, 0x70, 0x31, 0xbf, 0xa7, 0x62, 0x37, 0xbe, 0x4f, 0x06, 0x4d, 0x3e,
- 0x06, 0x42, 0x44, 0x3e, 0x94, 0xc3, 0xc8, 0x3d, 0x96, 0xb4, 0x24, 0x3c,
- 0x16, 0xd6, 0x77, 0xbd, 0xd4, 0x39, 0x0d, 0x3d, 0xd0, 0x4e, 0xae, 0xbd,
- 0xeb, 0x4b, 0x56, 0x3d, 0xda, 0x9e, 0xbc, 0x3c, 0xde, 0x9c, 0x97, 0xbe,
- 0x95, 0x49, 0xae, 0x3d, 0xe3, 0x27, 0xd2, 0xbe, 0xed, 0x99, 0x24, 0x3d,
- 0x34, 0x73, 0x41, 0x3e, 0x99, 0x56, 0x88, 0xbe, 0x0a, 0xfc, 0x2b, 0x3f,
- 0x2b, 0x1e, 0x19, 0x3f, 0x42, 0xc0, 0x61, 0x3e, 0xc4, 0xa7, 0x65, 0x3e,
- 0xd5, 0xdf, 0x01, 0xbe, 0x38, 0x19, 0x8e, 0xbe, 0x6d, 0x20, 0xaf, 0xbe,
- 0xe2, 0xeb, 0x61, 0xbe, 0x95, 0x33, 0x92, 0xbd, 0x75, 0x5b, 0x9a, 0x3e,
- 0x12, 0x62, 0x34, 0xbe, 0x0b, 0x44, 0x3d, 0x3e, 0x3a, 0x8d, 0x32, 0xbe,
- 0x61, 0x46, 0x1a, 0xbd, 0xee, 0x15, 0x9f, 0x3e, 0xa1, 0x6c, 0xd9, 0xbe,
- 0xd2, 0x90, 0x46, 0xbe, 0x3d, 0x42, 0x4a, 0x3e, 0x6c, 0xc8, 0x1b, 0xbd,
- 0x12, 0xeb, 0xd6, 0xbe, 0x19, 0x7d, 0xe0, 0xbe, 0xb2, 0xa9, 0xbc, 0x3e,
- 0x41, 0x75, 0x6a, 0xbe, 0xdf, 0x56, 0x00, 0x3f, 0xa5, 0x62, 0xf4, 0x3e,
- 0xea, 0x37, 0x88, 0x3d, 0x5d, 0x8e, 0x1e, 0x3d, 0xec, 0x8d, 0xc4, 0x3c,
- 0x84, 0x10, 0x0a, 0x3e, 0xb0, 0x5a, 0xc7, 0x3d, 0x5e, 0x08, 0xec, 0x3e,
- 0x4e, 0x74, 0x2d, 0xbe, 0xf9, 0x4b, 0xc7, 0xbe, 0x0b, 0xdd, 0x84, 0xbe,
- 0xbe, 0x8a, 0x0a, 0x3f, 0x06, 0xab, 0x1b, 0xbe, 0xe5, 0x99, 0x37, 0xbe,
- 0x9e, 0x26, 0x2b, 0x3e, 0x64, 0x86, 0xa1, 0x3e, 0x42, 0xaf, 0xbc, 0xbe,
- 0x99, 0x75, 0x00, 0xbe, 0x05, 0x0b, 0x9c, 0xbd, 0x0d, 0x6c, 0xb5, 0xbd,
- 0xb7, 0x3f, 0xdc, 0x3e, 0x6f, 0xd6, 0x50, 0x3e, 0xf2, 0xaf, 0xb5, 0xbe,
- 0x2f, 0x3c, 0x0d, 0x3e, 0xb5, 0xf9, 0x01, 0x3d, 0xbc, 0x0a, 0xf2, 0x3d,
- 0x9b, 0x94, 0x13, 0x3c, 0xc5, 0xf3, 0xdc, 0xbd, 0xd7, 0x84, 0x7a, 0xbe,
- 0x9b, 0x91, 0x5e, 0x3f, 0xce, 0xd1, 0xfc, 0xbe, 0xa2, 0x10, 0x0e, 0x3e,
- 0x54, 0xeb, 0x97, 0x3c, 0x27, 0x7c, 0x71, 0xbe, 0x80, 0x4d, 0xce, 0x3b,
- 0x5e, 0xf5, 0x15, 0x3f, 0xe4, 0xb5, 0x2a, 0xbf, 0xa5, 0xb1, 0x67, 0x3e,
- 0xc4, 0xef, 0x38, 0x3e, 0x39, 0xbb, 0xf3, 0xbd, 0x57, 0xf2, 0xba, 0x3e,
- 0x01, 0x52, 0x4f, 0x3e, 0x69, 0x31, 0xd8, 0x3e, 0x5f, 0x1b, 0x2c, 0x3d,
- 0x87, 0x26, 0x93, 0x3e, 0xfe, 0xd8, 0x1f, 0xbf, 0xb1, 0xc7, 0xa2, 0x3c,
- 0xb6, 0xd6, 0x45, 0xbf, 0xdb, 0x1e, 0xc7, 0xbe, 0xe4, 0xbd, 0x20, 0xbf,
- 0xa8, 0x76, 0x20, 0x3e, 0xd7, 0x78, 0x12, 0xbf, 0xe6, 0xbb, 0xfa, 0xbe,
- 0xf0, 0x55, 0x1b, 0xbe, 0x88, 0x1c, 0x2a, 0xbf, 0x2c, 0x4e, 0x27, 0x3f,
- 0x08, 0x71, 0xf5, 0xbd, 0xf3, 0xca, 0x01, 0xbf, 0x6d, 0x10, 0x6f, 0x3c,
- 0xbc, 0xf3, 0x45, 0x3e, 0xbf, 0x23, 0x28, 0x3e, 0x18, 0xde, 0x87, 0x3e,
- 0xea, 0x18, 0x3c, 0x3d, 0x3e, 0x51, 0x54, 0x3f, 0x87, 0x9d, 0x9f, 0x3d,
- 0x5a, 0x99, 0xc0, 0xbe, 0xf3, 0xc0, 0xb5, 0x3e, 0x1d, 0xd9, 0xe5, 0xbd,
- 0xb9, 0x0e, 0xd9, 0x3e, 0xa6, 0xb9, 0xb4, 0xbe, 0x25, 0x6c, 0x31, 0xbe,
- 0x53, 0xf2, 0xa7, 0xbe, 0xb7, 0x89, 0xdb, 0x3e, 0x4e, 0x52, 0x12, 0xbf,
- 0x7a, 0x41, 0xee, 0x3d, 0x48, 0x45, 0xe8, 0x3e, 0x50, 0xde, 0xc9, 0x3e,
- 0x31, 0xdf, 0x79, 0xbe, 0x49, 0xee, 0xb5, 0xbd, 0xf9, 0xca, 0x8c, 0x3c,
- 0xb0, 0x00, 0x30, 0x3d, 0xea, 0xb5, 0x77, 0x3d, 0x87, 0xa3, 0xa5, 0xbd,
- 0x0e, 0x46, 0xb9, 0xbd, 0x97, 0x11, 0x13, 0x3e, 0xdc, 0x2a, 0xbe, 0x3d,
- 0x4d, 0xf6, 0x4a, 0x3e, 0xa8, 0x84, 0x92, 0xbd, 0x22, 0xd8, 0x76, 0xbe,
- 0x5f, 0x70, 0x83, 0xbe, 0x30, 0x23, 0xa4, 0x3f, 0xe7, 0x7f, 0x96, 0x3e,
- 0xe7, 0xfc, 0x89, 0xbe, 0x31, 0xec, 0x7f, 0x3e, 0x91, 0xba, 0x6a, 0xbd,
- 0x8b, 0x83, 0x81, 0xbe, 0xee, 0xce, 0x9d, 0x3e, 0xa6, 0xcb, 0xdc, 0xbd,
- 0x9e, 0xc4, 0x15, 0xbd, 0x13, 0x82, 0x98, 0x3e, 0xb5, 0x02, 0x2b, 0x3e,
- 0xb9, 0x80, 0x43, 0xbd, 0x06, 0x7d, 0x98, 0xbd, 0x9e, 0x60, 0xdf, 0x3e,
- 0x23, 0x5b, 0x1d, 0x3e, 0x57, 0xc0, 0x9a, 0xbe, 0x87, 0xc8, 0xba, 0x3e,
- 0x63, 0x75, 0x05, 0xbf, 0xde, 0x0c, 0xac, 0xbe, 0x48, 0xc9, 0x60, 0x3e,
- 0x31, 0xa1, 0x98, 0xbe, 0x90, 0x26, 0x93, 0xbe, 0xa4, 0x25, 0x11, 0x3e,
- 0xb3, 0x94, 0xfa, 0xbd, 0xb8, 0x1d, 0x64, 0xbe, 0x37, 0xbb, 0x9e, 0xbe,
- 0x99, 0x07, 0x28, 0x3e, 0x19, 0x13, 0x26, 0xbf, 0x92, 0x2a, 0x4d, 0x3e,
- 0x79, 0xff, 0xbf, 0xbb, 0xf0, 0x9d, 0x8a, 0xbe, 0x68, 0xa1, 0xd9, 0xbe,
- 0x2e, 0x75, 0xed, 0x3d, 0xb0, 0xe3, 0xdb, 0xbe, 0x21, 0x18, 0x84, 0x3e,
- 0x07, 0x84, 0x28, 0x3e, 0x9c, 0xe7, 0x11, 0xbd, 0x1d, 0xcc, 0x0e, 0x3f,
- 0xac, 0x15, 0x3e, 0x3d, 0x3c, 0xdb, 0x65, 0xbe, 0x89, 0x0c, 0xd9, 0xbe,
- 0xb5, 0x71, 0x9a, 0xbe, 0x8e, 0x21, 0x04, 0x3e, 0xee, 0x07, 0x94, 0x3e,
- 0xc8, 0x33, 0x28, 0xbe, 0xd9, 0xc1, 0xbc, 0xbe, 0x29, 0xd9, 0xa2, 0x3e,
- 0x88, 0xde, 0x23, 0xbf, 0x7b, 0xce, 0x38, 0xbd, 0xf7, 0x4d, 0xf2, 0xbd,
- 0xdb, 0x9b, 0x5b, 0xbf, 0x98, 0xb0, 0xcc, 0xbe, 0x86, 0xaa, 0xd5, 0x3d,
- 0xd2, 0x63, 0xd9, 0xbe, 0x0a, 0x5b, 0xc9, 0xbd, 0x31, 0xd5, 0xf6, 0xbe,
- 0x96, 0x37, 0x9d, 0xbe, 0x6b, 0xc0, 0x26, 0x3e, 0x88, 0x60, 0x8a, 0xbe,
- 0x3a, 0xaa, 0x71, 0xbe, 0xe2, 0x33, 0x00, 0xbf, 0xc3, 0xea, 0x82, 0xbe,
- 0x3b, 0x2b, 0xef, 0x3d, 0x0f, 0x43, 0x8d, 0xbd, 0x22, 0x39, 0xa9, 0xbe,
- 0x6a, 0xe2, 0x5b, 0xbe, 0x8f, 0x50, 0x20, 0xbf, 0xef, 0xed, 0x98, 0x3e,
- 0xc5, 0x15, 0x28, 0xbe, 0x8d, 0x46, 0x3b, 0xbe, 0x29, 0x2d, 0x45, 0x3c,
- 0xe9, 0x23, 0xf0, 0x3d, 0x2a, 0x10, 0xcc, 0xbe, 0xd8, 0xbe, 0x3c, 0x3d,
- 0xa4, 0xc5, 0xd9, 0x3d, 0x4b, 0xbc, 0xd5, 0xbd, 0xd3, 0x4c, 0xcc, 0xbe,
- 0xdb, 0x86, 0xe7, 0xbc, 0x64, 0x5d, 0x8d, 0xbf, 0xc4, 0xf2, 0xae, 0xbc,
- 0xcf, 0xb4, 0xe5, 0x3d, 0x9d, 0xed, 0x45, 0x3e, 0xcd, 0xb7, 0x2b, 0xbe,
- 0x66, 0xe9, 0x20, 0xbe, 0xf3, 0x82, 0x00, 0xbb, 0xc2, 0x60, 0xed, 0xbe,
- 0xfe, 0x52, 0xf0, 0xbe, 0x11, 0x7e, 0x61, 0x3e, 0x8f, 0x91, 0x3c, 0xbe,
- 0xa1, 0x6f, 0xf7, 0x3d, 0x5f, 0xce, 0x97, 0xbe, 0xf2, 0x76, 0xdb, 0xbe,
- 0xd6, 0xcc, 0x7d, 0x3d, 0xf1, 0x15, 0x5a, 0x3d, 0x3e, 0xa7, 0xb5, 0x3c,
- 0x65, 0x60, 0x82, 0xbe, 0x04, 0x92, 0xbd, 0xbe, 0xbe, 0x13, 0xb8, 0xbe,
- 0x65, 0xa8, 0x9a, 0x3d, 0x2f, 0x5e, 0x95, 0xbd, 0x4a, 0x58, 0xcf, 0x3d,
- 0xdb, 0xd6, 0x48, 0xbe, 0x1a, 0x5f, 0xdd, 0x3c, 0x51, 0x8e, 0xdc, 0x3c,
- 0xaa, 0xed, 0x1d, 0x3d, 0x2b, 0x67, 0x82, 0xbd, 0x06, 0x46, 0x14, 0x3e,
- 0xff, 0xbe, 0x0a, 0xbe, 0x05, 0xde, 0x40, 0xbd, 0x60, 0x1b, 0xe6, 0xbd,
- 0xca, 0x15, 0xee, 0xbe, 0xf2, 0xf9, 0x4e, 0xbd, 0xe0, 0xda, 0x84, 0xbd,
- 0x20, 0x64, 0xc5, 0xbd, 0xcf, 0xc6, 0x5d, 0xbe, 0x8a, 0x4b, 0x3a, 0x3e,
- 0x59, 0x14, 0x1c, 0xbf, 0x2c, 0xe8, 0x83, 0x3e, 0x7c, 0x9d, 0xbe, 0x3e,
- 0xec, 0x86, 0xae, 0x3e, 0x7b, 0x77, 0xac, 0x3c, 0x00, 0x5a, 0x4c, 0xbd,
- 0xa1, 0xfe, 0x11, 0xbe, 0xbd, 0x25, 0xc1, 0xbe, 0xab, 0x04, 0x95, 0x3d,
- 0x44, 0x4c, 0x0f, 0xbd, 0xa9, 0x0a, 0x48, 0x3e, 0x38, 0xa9, 0xb0, 0x3e,
- 0xa8, 0x02, 0x00, 0xbf, 0xac, 0xd8, 0x54, 0x3d, 0xbf, 0x37, 0x60, 0x3e,
- 0x86, 0x59, 0xea, 0x3d, 0x89, 0x4d, 0x7a, 0x3d, 0x1b, 0xf8, 0x8e, 0xbc,
- 0xf7, 0x24, 0x45, 0xbf, 0x69, 0xf5, 0x6b, 0x3e, 0xc3, 0x13, 0x1f, 0xbe,
- 0x2a, 0x2c, 0x94, 0x3d, 0x19, 0xf8, 0xa5, 0x3e, 0x61, 0xb7, 0x1c, 0x3e,
- 0x8d, 0x19, 0x90, 0x3e, 0x02, 0x57, 0x03, 0xbe, 0xe9, 0x31, 0x28, 0xbe,
- 0x17, 0xb7, 0xb0, 0x3d, 0x4e, 0x7f, 0x7a, 0x3d, 0x5e, 0x86, 0x3a, 0xbe,
- 0x77, 0xd3, 0xa4, 0xbe, 0x5c, 0x78, 0x87, 0xbe, 0x1e, 0x68, 0x4a, 0x3e,
- 0x3e, 0x09, 0x7d, 0xbe, 0x12, 0x9b, 0x54, 0x3e, 0xca, 0x70, 0x75, 0xbe,
- 0x48, 0xc7, 0x07, 0x3e, 0x6c, 0xe3, 0x88, 0xbd, 0x13, 0xf0, 0xc9, 0x3e,
- 0x4a, 0x60, 0x02, 0x3e, 0x0d, 0xdd, 0x55, 0x3e, 0x14, 0x5c, 0x87, 0x3e,
- 0x47, 0x04, 0x2c, 0xbd, 0x5f, 0x84, 0xba, 0x3e, 0xa4, 0xb3, 0x1f, 0xbe,
- 0xfd, 0xfa, 0x47, 0x3e, 0x4d, 0x5f, 0xe8, 0x3d, 0x6e, 0x59, 0x06, 0xbf,
- 0xea, 0xa9, 0xd2, 0xbe, 0x2b, 0x62, 0x92, 0xbd, 0xed, 0x96, 0x10, 0xbe,
- 0xff, 0xee, 0x03, 0x3e, 0x0f, 0x20, 0xbb, 0x3e, 0x93, 0xee, 0xa8, 0x3e,
- 0x5f, 0x8b, 0xa0, 0x3e, 0x52, 0x5c, 0xb0, 0xbe, 0xd7, 0xc3, 0xc2, 0xbd,
- 0x9a, 0x3c, 0x18, 0x3e, 0x6d, 0x43, 0x59, 0xbe, 0xba, 0x75, 0x36, 0xbe,
- 0x7a, 0xb8, 0x02, 0x3e, 0xbb, 0x97, 0x9c, 0xbe, 0x44, 0x84, 0xa8, 0xbe,
- 0x06, 0x6f, 0xab, 0xbe, 0x1a, 0x37, 0x40, 0xbe, 0x4f, 0xf2, 0x18, 0x3d,
- 0x83, 0xa4, 0x2e, 0x3e, 0xc2, 0xb9, 0xab, 0xbc, 0xea, 0x1d, 0xce, 0x3d,
- 0x0c, 0xf2, 0xbf, 0xbe, 0x72, 0x49, 0xa8, 0xbe, 0x8d, 0xce, 0x8d, 0xbd,
- 0xf9, 0xb2, 0x20, 0x3e, 0x19, 0x49, 0x63, 0x3e, 0x24, 0x19, 0x8b, 0x3d,
- 0x4c, 0x17, 0xea, 0x3d, 0xd0, 0x7e, 0x5e, 0x3d, 0x4e, 0x34, 0x2d, 0xbe,
- 0xf1, 0xcc, 0x8f, 0x3e, 0x6c, 0xf2, 0x7a, 0xbe, 0xa9, 0x99, 0x8d, 0xbe,
- 0xdc, 0x4d, 0xa8, 0xbe, 0x15, 0x0b, 0xa2, 0xbe, 0x89, 0x4d, 0x03, 0x3d,
- 0x28, 0x7f, 0xbd, 0xbd, 0x19, 0xb3, 0x61, 0xbd, 0xf1, 0x5d, 0xc9, 0x3e,
- 0xac, 0x46, 0xf4, 0xbe, 0x56, 0x01, 0xf5, 0x3e, 0xe1, 0xd5, 0x3d, 0xbe,
- 0x0a, 0x4d, 0x4e, 0xbd, 0x26, 0x7e, 0x49, 0x3d, 0xcd, 0xad, 0x0a, 0x3e,
- 0x3e, 0x2c, 0x84, 0xbc, 0x33, 0x0d, 0xb0, 0xbe, 0x53, 0x36, 0x0f, 0xbe,
- 0x5c, 0x3d, 0xfe, 0x3b, 0x83, 0x12, 0x05, 0x3e, 0x2e, 0xdd, 0x57, 0x3e,
- 0x82, 0x31, 0x19, 0xbf, 0x77, 0x03, 0x90, 0x3d, 0x67, 0x19, 0x81, 0xbe,
- 0x32, 0x6d, 0x77, 0x3e, 0xdd, 0x5a, 0x34, 0x3e, 0x78, 0x03, 0xb3, 0xbc,
- 0x5d, 0xb5, 0x7a, 0xbe, 0x60, 0x4a, 0xdc, 0x3d, 0xe0, 0x0e, 0xf7, 0x3b,
- 0x5d, 0x7b, 0x81, 0x3e, 0x22, 0x03, 0x59, 0xbe, 0x3c, 0xe8, 0xe0, 0xbe,
- 0x05, 0x72, 0xe3, 0xbe, 0x69, 0x66, 0x86, 0xbe, 0x53, 0x69, 0x81, 0xbe,
- 0x22, 0x16, 0x30, 0x3e, 0xdb, 0x98, 0x2a, 0x3e, 0x37, 0x5d, 0x99, 0xbe,
- 0xed, 0x98, 0x2c, 0xbe, 0xc1, 0x42, 0xdf, 0xbc, 0x65, 0x88, 0x55, 0x3e,
- 0x77, 0x95, 0x61, 0xbf, 0x84, 0x9f, 0xde, 0x3d, 0xa5, 0x6e, 0x51, 0xbe,
- 0x28, 0xd1, 0xce, 0x3c, 0xa6, 0x71, 0x36, 0xbe, 0xc7, 0xaa, 0xd8, 0xbe,
- 0xbc, 0x06, 0x1d, 0xbf, 0xb3, 0xa3, 0x7e, 0xbe, 0x24, 0x79, 0x93, 0x3e,
- 0x6c, 0xa3, 0x74, 0x3e, 0x0b, 0xe0, 0x7d, 0xbe, 0xfc, 0xe7, 0x7e, 0x3e,
- 0x1d, 0xca, 0x51, 0x3e, 0xd7, 0xb3, 0x70, 0xbe, 0x2c, 0x91, 0xcc, 0xbe,
- 0x70, 0x03, 0x42, 0xbf, 0x3f, 0x76, 0xd9, 0xbe, 0xbe, 0x8b, 0xc3, 0x3e,
- 0x59, 0xdd, 0xbd, 0xbd, 0x5c, 0xbf, 0x74, 0x3d, 0xa6, 0x06, 0x1f, 0xbe,
- 0x3c, 0xdc, 0xcc, 0x3d, 0xb6, 0xba, 0x2d, 0x3e, 0x13, 0xe7, 0xbd, 0x3e,
- 0x24, 0x43, 0x82, 0xbe, 0x6d, 0xc5, 0x62, 0x3c, 0x2f, 0xba, 0x27, 0x3d,
- 0x97, 0x21, 0x39, 0xbe, 0x58, 0x9b, 0x0c, 0xbe, 0xcd, 0xfb, 0xf6, 0xbe,
- 0xf9, 0xfe, 0xc3, 0xbd, 0x1d, 0xfa, 0xa7, 0x3e, 0x85, 0xbd, 0xbf, 0x3d,
- 0x27, 0x4e, 0x25, 0xbe, 0x5e, 0x4a, 0x51, 0x3e, 0x2b, 0xb1, 0x2d, 0xbe,
- 0xac, 0xe6, 0xed, 0xbe, 0x88, 0x7a, 0x81, 0xbe, 0x53, 0xac, 0xc0, 0xbe,
- 0x61, 0x8f, 0xaf, 0x3d, 0xe2, 0x68, 0x1c, 0x3e, 0x60, 0x80, 0xd1, 0xbe,
- 0x2c, 0x76, 0xd5, 0x3d, 0xc4, 0xd5, 0x2d, 0xbe, 0x3f, 0x33, 0x8d, 0x3e,
- 0x46, 0x20, 0x9f, 0x3e, 0x9a, 0xc4, 0xe4, 0xbe, 0x97, 0xb9, 0x1b, 0xbe,
- 0xde, 0x9e, 0x4f, 0xbd, 0x4d, 0x2c, 0xa3, 0xbc, 0xc9, 0x27, 0xed, 0xbe,
- 0xfa, 0x4b, 0xbd, 0xbe, 0x3a, 0xe0, 0x11, 0xbf, 0x35, 0xf6, 0x94, 0xbe,
- 0x9f, 0xc1, 0x7d, 0x3e, 0x0a, 0x8f, 0x15, 0x3e, 0x4d, 0x2c, 0xa9, 0xbe,
- 0x0d, 0x49, 0x06, 0xbf, 0xd5, 0x09, 0xf4, 0x3e, 0x61, 0x39, 0x88, 0x3e,
- 0xcc, 0x7e, 0xef, 0x3d, 0x4a, 0x67, 0x16, 0x3c, 0x6d, 0x1b, 0x7d, 0x3e,
- 0xe2, 0xfe, 0x9d, 0xbe, 0x70, 0xd5, 0x3b, 0x3f, 0x63, 0x67, 0x56, 0x3e,
- 0x5f, 0x27, 0x21, 0xbd, 0x28, 0x51, 0xcb, 0xbe, 0x8e, 0xe5, 0xeb, 0x3e,
- 0xe6, 0x37, 0xc6, 0xbd, 0x92, 0x49, 0xce, 0xbe, 0x31, 0x31, 0x59, 0x3e,
- 0x96, 0x2a, 0x87, 0xbd, 0xf4, 0x38, 0xd1, 0x3e, 0xba, 0xa0, 0x49, 0xbe,
- 0xbd, 0x53, 0x9a, 0x3e, 0xb8, 0xd2, 0xf6, 0xbd, 0xdb, 0x11, 0xdd, 0xbe,
- 0x6f, 0xf5, 0xc1, 0x3e, 0x05, 0xfe, 0x48, 0xba, 0xc7, 0x4c, 0x08, 0x3f,
- 0x71, 0xb4, 0xf3, 0xbd, 0xbb, 0x77, 0x14, 0x3f, 0x23, 0x36, 0xbb, 0xbd,
- 0xff, 0x70, 0x1a, 0xbe, 0x06, 0x90, 0xb7, 0x3d, 0x07, 0x05, 0x07, 0xbc,
- 0x56, 0x86, 0x2f, 0x3d, 0x2e, 0xf2, 0xd8, 0x3e, 0xed, 0x2f, 0x0d, 0xbe,
- 0x5e, 0xa6, 0x67, 0xbd, 0x5a, 0xa2, 0x27, 0x3d, 0x38, 0xdf, 0x04, 0xbf,
- 0xb4, 0xfb, 0x77, 0x3e, 0x5d, 0xee, 0x4b, 0x3b, 0x3e, 0x88, 0x9f, 0xbe,
- 0x27, 0x25, 0x70, 0xbe, 0xf3, 0xa7, 0x0f, 0x3f, 0x10, 0x3e, 0xad, 0xbe,
- 0xd9, 0x00, 0x08, 0xbd, 0x53, 0x8f, 0x3c, 0xbd, 0x18, 0xf3, 0xc9, 0x3e,
- 0xbc, 0x3d, 0xbc, 0x3e, 0xf2, 0xb5, 0xc6, 0xbe, 0xf1, 0xa1, 0xc7, 0xbe,
- 0x58, 0x28, 0xd3, 0x3e, 0x59, 0x12, 0xdd, 0xbe, 0xd9, 0x84, 0x85, 0x3e,
- 0x4b, 0xea, 0x5b, 0x3e, 0x52, 0xb9, 0x66, 0xbe, 0x54, 0x00, 0xd8, 0x3e,
- 0x38, 0xb7, 0x3a, 0x3d, 0xcd, 0x62, 0xa2, 0xbe, 0x7d, 0x11, 0x38, 0xbe,
- 0x98, 0xe4, 0xa3, 0xbe, 0x26, 0x52, 0x27, 0xbc, 0xb6, 0xf6, 0x82, 0x3e,
- 0x73, 0xaf, 0x05, 0xbd, 0xd7, 0x3b, 0x24, 0x3e, 0x20, 0xe8, 0x55, 0xbb,
- 0xd7, 0x09, 0x1e, 0x3f, 0xc1, 0x1e, 0x0d, 0xbe, 0x23, 0xc9, 0xe9, 0x3c,
- 0x99, 0x14, 0x48, 0x3e, 0x20, 0x4c, 0x9d, 0xbe, 0xa2, 0x0b, 0xe0, 0x3d,
- 0xcb, 0x3f, 0x99, 0x3d, 0x51, 0xd9, 0x00, 0xbf, 0xe6, 0xa4, 0xb4, 0xbe,
- 0x95, 0x61, 0x57, 0x3e, 0x89, 0x04, 0xbe, 0xbd, 0x43, 0x54, 0x2c, 0xbe,
- 0x89, 0xa6, 0x3e, 0xbc, 0xd4, 0x4d, 0x04, 0xbe, 0x31, 0x8b, 0x71, 0xbe,
- 0x37, 0x56, 0xad, 0xbd, 0xd5, 0x6c, 0xe2, 0xbb, 0x0a, 0x60, 0xde, 0xbd,
- 0x20, 0xb3, 0xa0, 0xbd, 0xd8, 0xa5, 0x3e, 0x3e, 0x08, 0xd8, 0xbd, 0x3d,
- 0xee, 0x96, 0x90, 0xbe, 0x9f, 0x48, 0x60, 0x3d, 0xd9, 0x11, 0xb4, 0x3e,
- 0x12, 0x4b, 0x04, 0xbf, 0x30, 0xbe, 0x73, 0x3e, 0xd1, 0x2c, 0x74, 0x3e,
- 0x17, 0xff, 0x3a, 0x3e, 0xd1, 0x26, 0x7e, 0x3d, 0x4d, 0x0e, 0x8d, 0xbe,
- 0xd8, 0x4c, 0x07, 0x3f, 0x74, 0x34, 0xe2, 0x3c, 0x49, 0xd3, 0xe9, 0xbe,
- 0xea, 0x74, 0x4b, 0xbd, 0x38, 0x8e, 0x8b, 0x3e, 0x71, 0xe6, 0x05, 0x3c,
- 0x3e, 0x56, 0x07, 0x3d, 0xd6, 0x30, 0x0a, 0xbf, 0x6d, 0x10, 0x00, 0x3d,
- 0xa4, 0xf9, 0xd0, 0xbc, 0x12, 0xd6, 0x0d, 0xbe, 0xce, 0xbe, 0x4a, 0x3e,
- 0xdc, 0xe5, 0x8d, 0xbe, 0x35, 0x78, 0x52, 0x3e, 0x29, 0x8e, 0xf2, 0xbc,
- 0xed, 0x49, 0x91, 0x3e, 0xf8, 0x23, 0xb1, 0xbd, 0x7f, 0xff, 0x41, 0x3e,
- 0x9a, 0x21, 0x3b, 0xbd, 0xc2, 0xde, 0x1a, 0xbd, 0x22, 0x03, 0xe9, 0x3e,
- 0x99, 0x38, 0xa5, 0x3e, 0x3b, 0xdb, 0xa4, 0xbd, 0x81, 0x00, 0x1c, 0xbe,
- 0xaa, 0xce, 0xe6, 0xbd, 0xcd, 0x83, 0x33, 0xbe, 0x75, 0xb4, 0xb2, 0x3e,
- 0x16, 0x1c, 0x2d, 0xbe, 0x8c, 0xa4, 0xeb, 0x3d, 0xa1, 0x45, 0x34, 0xbe,
- 0x37, 0x22, 0x14, 0x3d, 0xf8, 0x70, 0xee, 0x3d, 0xee, 0xb6, 0x9a, 0x3c,
- 0x3c, 0x9d, 0xaf, 0x3d, 0xa1, 0xfe, 0xd1, 0xbe, 0x7e, 0x64, 0xab, 0x3e,
- 0xae, 0x36, 0x62, 0x3e, 0x97, 0xd1, 0x91, 0x3d, 0x7d, 0x8b, 0xc9, 0x3d,
- 0xe4, 0x1e, 0x52, 0xbe, 0x51, 0xda, 0x1f, 0xbf, 0x6b, 0xa4, 0x09, 0x3e,
- 0x56, 0x8b, 0x57, 0x3d, 0x5e, 0xff, 0x89, 0xbe, 0x2e, 0x31, 0x53, 0xbc,
- 0xe5, 0x86, 0x85, 0xbe, 0x5d, 0x96, 0x38, 0xbe, 0xd2, 0x2c, 0x8e, 0xbe,
- 0xdb, 0x7c, 0x20, 0x3d, 0xf7, 0xcc, 0xa6, 0xbe, 0x46, 0x90, 0x72, 0xbe,
- 0xa9, 0x05, 0xe5, 0xbe, 0x40, 0xbd, 0x5b, 0xbd, 0x9d, 0xb6, 0xb7, 0xbe,
- 0xea, 0x5f, 0x14, 0xbf, 0xc8, 0x5b, 0xb1, 0xbe, 0xcf, 0xe2, 0x8f, 0x3e,
- 0x0e, 0xa1, 0x88, 0x3d, 0x83, 0xd7, 0xff, 0x3d, 0xd3, 0xcd, 0x91, 0x3d,
- 0x6e, 0x01, 0xe7, 0xbc, 0xd3, 0xf1, 0x28, 0xbf, 0x25, 0x6e, 0x80, 0x3d,
- 0xdf, 0x71, 0xcc, 0xbd, 0xd6, 0x56, 0x4b, 0xbe, 0xbb, 0x45, 0x8e, 0xbc,
- 0x04, 0x17, 0xc5, 0xbe, 0x23, 0xc7, 0x84, 0xbe, 0x02, 0xde, 0xfa, 0xbe,
- 0x37, 0xdd, 0xc2, 0xbe, 0x72, 0xbe, 0x74, 0xbe, 0xab, 0x03, 0xc0, 0x3c,
- 0x66, 0x5f, 0x5a, 0x3e, 0x0b, 0xa1, 0xd0, 0x3d, 0x61, 0x9e, 0x34, 0xbd,
- 0xd0, 0xc0, 0xf8, 0x3d, 0x1d, 0x5c, 0x5f, 0x3d, 0x1d, 0x52, 0x30, 0xbf,
- 0x79, 0x81, 0xb3, 0x3d, 0x01, 0x70, 0x30, 0xbf, 0xaa, 0x96, 0x65, 0xbd,
- 0x8f, 0x91, 0x4c, 0x3e, 0xbd, 0x57, 0x21, 0xbe, 0xdf, 0x70, 0x30, 0x3e,
- 0x6f, 0x58, 0x4a, 0xbe, 0x2c, 0xc6, 0x1a, 0xbd, 0x41, 0xc8, 0x47, 0xbe,
- 0x65, 0x39, 0xec, 0x3c, 0xd0, 0x3e, 0x19, 0xbf, 0xd7, 0x21, 0x15, 0x3e,
- 0xb6, 0x8a, 0xc7, 0xbe, 0x43, 0x38, 0xab, 0xbd, 0x0f, 0x09, 0xba, 0x3d,
- 0x34, 0x3e, 0x15, 0xbf, 0x9c, 0x9c, 0xd5, 0x3c, 0x76, 0xc6, 0xa7, 0x3c,
- 0x1c, 0x91, 0x12, 0x3e, 0x2b, 0x63, 0x44, 0x3c, 0x4c, 0x6e, 0x1f, 0x3e,
- 0xee, 0x12, 0x07, 0x3e, 0xc0, 0x4b, 0xab, 0x3d, 0xc8, 0x26, 0x86, 0x3e,
- 0x56, 0x43, 0xd8, 0xbe, 0x9b, 0xd3, 0x20, 0xbe, 0xd6, 0xcb, 0xf5, 0xbe,
- 0xb2, 0xfb, 0xaf, 0xbd, 0x55, 0xda, 0x02, 0xbe, 0xa1, 0x58, 0x02, 0xbe,
- 0xb6, 0xc2, 0xcb, 0xbe, 0xb7, 0x35, 0xa7, 0xbe, 0xa2, 0xbc, 0x73, 0xbe,
- 0x87, 0xed, 0xdf, 0x3d, 0xa5, 0xa1, 0xec, 0xbe, 0xa7, 0x8f, 0xb2, 0xbe,
- 0x93, 0x0b, 0x8e, 0x3d, 0x6e, 0xc4, 0x68, 0xbc, 0x01, 0xd9, 0x33, 0xbe,
- 0xfa, 0xc6, 0x8d, 0xbe, 0x3f, 0xe1, 0x3b, 0x3e, 0xbb, 0x1c, 0x89, 0xbe,
- 0xe2, 0x9b, 0x12, 0x3d, 0xf1, 0x3e, 0x85, 0xbd, 0xb4, 0xb7, 0xc4, 0xbe,
- 0x42, 0x67, 0x0f, 0xbe, 0x22, 0xf9, 0x14, 0xbe, 0x27, 0x55, 0x61, 0xbe,
- 0x8e, 0x1e, 0x77, 0xbe, 0x07, 0xcd, 0x2b, 0xbe, 0x9c, 0x11, 0x49, 0xbe,
- 0x7d, 0xbc, 0x83, 0x3e, 0x4d, 0x26, 0x03, 0x3e, 0xf0, 0xc8, 0xb8, 0x3c,
- 0xcc, 0x8f, 0x0d, 0xbe, 0x36, 0xfa, 0xc6, 0xbe, 0xf9, 0xcb, 0x8d, 0xbe,
- 0x20, 0x8b, 0x81, 0xbe, 0xed, 0x68, 0x67, 0xbd, 0x92, 0x63, 0x1a, 0x3e,
- 0xb8, 0x78, 0x4e, 0xbf, 0x91, 0x7c, 0x3a, 0xbe, 0x55, 0x66, 0x0c, 0xbe,
- 0x68, 0x1c, 0xe0, 0x3d, 0xe8, 0x52, 0xdc, 0xbe, 0x90, 0x15, 0x5d, 0xbe,
- 0x76, 0xad, 0x85, 0xbe, 0x17, 0x88, 0x62, 0xbe, 0x82, 0x02, 0xcf, 0x3d,
- 0xac, 0x32, 0x74, 0x3e, 0x1d, 0x13, 0x62, 0x3d, 0xbf, 0xd0, 0x75, 0x3e,
- 0x44, 0x6b, 0x1e, 0xbd, 0x3f, 0xe7, 0x4f, 0x3e, 0x44, 0xa7, 0x87, 0x3e,
- 0xfe, 0xd8, 0x61, 0xbd, 0xa7, 0xf3, 0x40, 0xbe, 0x4e, 0x52, 0x61, 0xbe,
- 0xd3, 0xb2, 0x95, 0xbe, 0x0f, 0xcb, 0x4e, 0x3e, 0x59, 0x9a, 0x51, 0x3d,
- 0x79, 0xe4, 0x12, 0xbf, 0xa0, 0x32, 0xe3, 0x3e, 0x2e, 0xa5, 0x3c, 0xbe,
- 0xdf, 0x1c, 0xca, 0xbd, 0xd9, 0xbe, 0x82, 0xbe, 0xae, 0x0e, 0x9f, 0xbd,
- 0x44, 0x09, 0xef, 0x3d, 0xbc, 0xad, 0xc5, 0xbe, 0x49, 0xf4, 0x1b, 0xbe,
- 0xc9, 0x6d, 0xec, 0xbe, 0x0e, 0xd5, 0xba, 0xbd, 0x36, 0x65, 0x0f, 0x3d,
- 0x24, 0xbd, 0x8d, 0xbe, 0xed, 0xbf, 0x66, 0xbe, 0x3a, 0xcd, 0x0d, 0xbf,
- 0x56, 0x68, 0xee, 0xbe, 0xd5, 0x6e, 0xe0, 0x3c, 0xe7, 0xa6, 0x8a, 0xbe,
- 0x66, 0xdb, 0x29, 0x3e, 0x5d, 0x18, 0x3d, 0x3e, 0x9b, 0xdb, 0xf9, 0xbe,
- 0x12, 0x57, 0x84, 0x3d, 0xe6, 0x00, 0xd1, 0xbd, 0x32, 0xe6, 0x22, 0x3d,
- 0x5d, 0x01, 0xed, 0x3e, 0xf6, 0x46, 0x90, 0xbe, 0xba, 0x3f, 0x84, 0xbd,
- 0x64, 0xe8, 0xca, 0x3c, 0x36, 0x9b, 0x6d, 0x3e, 0xa0, 0x94, 0xd3, 0x3e,
- 0xf1, 0xc0, 0x23, 0xbb, 0xcc, 0xdb, 0x60, 0x3d, 0xab, 0xea, 0x59, 0x3e,
- 0x06, 0x18, 0xd2, 0x3b, 0x2e, 0x1f, 0x07, 0xbe, 0x76, 0xad, 0x88, 0xbd,
- 0x93, 0xbe, 0x26, 0xbe, 0xb1, 0x38, 0x33, 0x3e, 0x24, 0xbf, 0x81, 0x3e,
- 0x10, 0x78, 0x41, 0xbf, 0x21, 0x71, 0x08, 0xbf, 0xa6, 0x1f, 0xa1, 0x3e,
- 0x23, 0x32, 0xd3, 0xbe, 0x6a, 0xb4, 0xc6, 0xbe, 0x5d, 0x40, 0x4f, 0x3e,
- 0x8f, 0xb6, 0x1c, 0x3e, 0x29, 0x5a, 0x21, 0x3e, 0x8d, 0xab, 0x1c, 0xbf,
- 0xf2, 0xd5, 0x79, 0x3e, 0x21, 0x04, 0x01, 0xbf, 0x7a, 0x38, 0x36, 0x3e,
- 0xea, 0x85, 0x57, 0x3e, 0x8b, 0xd6, 0x0b, 0xbe, 0x57, 0xa2, 0xcf, 0xbe,
- 0x2a, 0x6b, 0x77, 0xbb, 0xc3, 0xf1, 0x18, 0xbf, 0xa4, 0x44, 0x49, 0xbf,
- 0xbe, 0x5f, 0xf7, 0xbe, 0x9a, 0x0c, 0x83, 0xbf, 0x31, 0xf8, 0x8d, 0xbe,
- 0x12, 0xcb, 0x8f, 0x3c, 0xdb, 0x58, 0x27, 0xbe, 0x1a, 0xbf, 0x81, 0xbf,
- 0xbd, 0x8b, 0x97, 0xbd, 0xed, 0xdc, 0xf1, 0x3d, 0x95, 0xe1, 0xf3, 0x3c,
- 0x28, 0x0b, 0xd8, 0xbe, 0x94, 0xf6, 0x8a, 0x3d, 0xf8, 0x83, 0x7b, 0x3e,
- 0x3a, 0x4a, 0xdc, 0x3e, 0x6a, 0xfd, 0xf3, 0xbe, 0x5f, 0x0a, 0x2f, 0x3d,
- 0xbb, 0x2a, 0xe4, 0xbe, 0x86, 0xe4, 0x31, 0xbf, 0x7d, 0x02, 0x04, 0x3e,
- 0x9f, 0x4e, 0x15, 0xbe, 0xd0, 0x7c, 0x9a, 0x3d, 0x08, 0xa5, 0x31, 0x3e,
- 0xad, 0x73, 0x4d, 0xbf, 0x3a, 0x97, 0x6f, 0xbe, 0x6c, 0x49, 0x23, 0xbf,
- 0xfb, 0x84, 0x33, 0xbe, 0xac, 0x58, 0x75, 0xbe, 0x2b, 0xc0, 0xb9, 0x3d,
- 0x79, 0x7b, 0x59, 0xbe, 0x63, 0x06, 0xb7, 0x3d, 0x98, 0x20, 0x10, 0xbe,
- 0xcf, 0x04, 0x19, 0x3e, 0xfb, 0x13, 0x25, 0xbf, 0x66, 0xaa, 0x60, 0x3e,
- 0x30, 0xe8, 0x21, 0xbf, 0xaf, 0xd9, 0xea, 0xbe, 0x4a, 0x89, 0x69, 0xbf,
- 0x0d, 0x5b, 0x90, 0x3d, 0x2f, 0xb0, 0xad, 0xbe, 0xe4, 0xd4, 0x04, 0x3f,
- 0x8f, 0x20, 0x19, 0x3e, 0xbb, 0xde, 0x2d, 0xbe, 0x6d, 0x4d, 0xce, 0xbe,
- 0xcf, 0x9f, 0xdb, 0xbe, 0x2b, 0x0a, 0x97, 0xbe, 0x00, 0x54, 0xfc, 0x3d,
- 0xaa, 0xa0, 0x3a, 0x3d, 0x44, 0xc2, 0x12, 0x3d, 0x0f, 0x71, 0x8d, 0xbc,
- 0x7b, 0x55, 0x24, 0xbe, 0xf2, 0xfb, 0x10, 0x3d, 0x2e, 0x9b, 0x3d, 0x3b,
- 0x16, 0x45, 0x4b, 0x3d, 0xc1, 0x98, 0xf3, 0xbe, 0xcf, 0x3d, 0x5f, 0x3d,
- 0x97, 0x4b, 0x2d, 0xbf, 0xce, 0x01, 0xd1, 0xbe, 0x58, 0xe4, 0xa5, 0xbc,
- 0xd5, 0xf9, 0x27, 0x3e, 0x54, 0xb4, 0xf9, 0xbe, 0xa9, 0xc5, 0xba, 0xbd,
- 0xaf, 0xb4, 0x36, 0xbf, 0x90, 0x4d, 0xdb, 0xbc, 0x9b, 0x21, 0xa5, 0xbe,
- 0x7a, 0x80, 0xdb, 0xbc, 0x1d, 0x1c, 0xee, 0x3c, 0xc7, 0xe4, 0xb4, 0xbd,
- 0x58, 0xae, 0x1f, 0x3e, 0xad, 0xc2, 0x96, 0x3e, 0xd7, 0x55, 0x97, 0x3c,
- 0x60, 0xe6, 0x1d, 0x3c, 0xfe, 0xea, 0x51, 0xbe, 0x17, 0x2c, 0xd0, 0x3e,
- 0x31, 0x7d, 0x13, 0xbf, 0x9b, 0x5f, 0x09, 0x3e, 0xb2, 0x62, 0x81, 0x3e,
- 0x4d, 0x88, 0x10, 0x3e, 0x25, 0xcf, 0x26, 0x3e, 0x62, 0x60, 0x80, 0xbd,
- 0xb5, 0x92, 0x86, 0xbf, 0x92, 0xd6, 0x00, 0xbe, 0x4a, 0x8a, 0xf7, 0xbe,
- 0x0d, 0x2a, 0xae, 0xbe, 0x1b, 0x6e, 0xca, 0x3e, 0xba, 0x27, 0x3f, 0xbe,
- 0x75, 0xd0, 0xb9, 0xbe, 0xc3, 0x5a, 0x5f, 0x3c, 0x71, 0x99, 0x71, 0x3e,
- 0x3e, 0xf5, 0xa3, 0xbe, 0x51, 0xc6, 0x38, 0xbe, 0xf2, 0x32, 0x3f, 0x3d,
- 0x0a, 0xc0, 0xf5, 0xbd, 0xe0, 0x91, 0x05, 0xbf, 0xe0, 0x0a, 0x9f, 0xbe,
- 0x24, 0x12, 0x9d, 0x3e, 0x88, 0xbf, 0x59, 0x3c, 0x4a, 0x81, 0x16, 0xbb,
- 0xc3, 0x93, 0xd9, 0x3e, 0x40, 0x2a, 0x62, 0xbf, 0x6a, 0x24, 0x9e, 0x3b,
- 0xcd, 0xcd, 0x23, 0xbf, 0x32, 0xf0, 0x32, 0xbe, 0x35, 0x1e, 0x98, 0xbd,
- 0x6e, 0x72, 0x0d, 0xbe, 0x8e, 0x1c, 0x9a, 0x3e, 0x93, 0x9b, 0x6c, 0xbf,
- 0xd4, 0xcf, 0x37, 0xbf, 0x8a, 0x09, 0x53, 0x3e, 0x12, 0x88, 0x29, 0xbd,
- 0x1c, 0x3a, 0x7f, 0x3e, 0x8c, 0xfc, 0x2d, 0xbf, 0xcf, 0xc3, 0x18, 0xbe,
- 0x4e, 0xb4, 0x51, 0xbe, 0xc3, 0x45, 0xa5, 0x3c, 0x3f, 0x19, 0x4e, 0xbb,
- 0x95, 0xf1, 0xa5, 0xbe, 0xcc, 0x13, 0xb8, 0xbe, 0x9c, 0xa1, 0xf4, 0xbe,
- 0x1b, 0x2d, 0x42, 0xbe, 0x6f, 0x1f, 0xfa, 0x3d, 0xa3, 0x0e, 0xc0, 0x3b,
- 0x7f, 0x16, 0x99, 0x3e, 0xaf, 0x73, 0x0f, 0x3d, 0x73, 0xcc, 0x41, 0xbe,
- 0x4e, 0x6e, 0x67, 0x3e, 0x9a, 0x8f, 0x2c, 0xbd, 0x38, 0xf7, 0x95, 0xbe,
- 0x92, 0x25, 0x18, 0x3d, 0xfd, 0x94, 0xf8, 0xbe, 0x70, 0x6d, 0xf7, 0x3d,
- 0x0d, 0xb6, 0x88, 0xbe, 0x59, 0xea, 0x2d, 0xbe, 0x37, 0x07, 0x40, 0xbe,
- 0x48, 0x32, 0x99, 0x3e, 0xc1, 0x1b, 0xb2, 0xbd, 0x32, 0x5b, 0xea, 0x3d,
- 0x91, 0xa4, 0xcd, 0xbe, 0xf9, 0xb5, 0x25, 0x3e, 0xd4, 0x7d, 0xc8, 0x3e,
- 0xc0, 0x02, 0xea, 0xbc, 0xa6, 0x47, 0x56, 0xbe, 0x53, 0xc6, 0x71, 0x3e,
- 0x5c, 0x43, 0x8d, 0x3c, 0x80, 0xfb, 0x39, 0xbe, 0x6b, 0x17, 0x4b, 0x3e,
- 0x57, 0xde, 0x76, 0xbe, 0xf0, 0xf7, 0xd6, 0xbd, 0x45, 0x27, 0xb8, 0xbe,
- 0xf4, 0xbb, 0x85, 0x3e, 0xac, 0xb4, 0x71, 0xbe, 0x56, 0x65, 0x26, 0xbf,
- 0x4d, 0xa3, 0xe8, 0xbd, 0x71, 0x19, 0xc8, 0xbd, 0x8e, 0x01, 0x2e, 0xbe,
- 0xf7, 0x9b, 0xeb, 0xbe, 0xe7, 0x0f, 0x70, 0xbe, 0xfc, 0xc1, 0x24, 0x3e,
- 0xa0, 0x11, 0xa2, 0xbe, 0x67, 0x2e, 0x9a, 0x3d, 0xd6, 0xe2, 0x84, 0x3e,
- 0x77, 0x50, 0x50, 0x3e, 0x86, 0x85, 0x07, 0xbd, 0x41, 0x63, 0xa4, 0xbe,
- 0x59, 0x18, 0x56, 0x3e, 0x13, 0x02, 0x8d, 0xbe, 0xfb, 0xa5, 0x3d, 0x3e,
- 0xfd, 0x3f, 0x6e, 0xbe, 0xd6, 0x7b, 0x11, 0xbc, 0x3e, 0xb4, 0x91, 0xbe,
- 0x44, 0xa5, 0x28, 0xbd, 0xae, 0x79, 0xcc, 0x3e, 0x73, 0xbc, 0x77, 0xbe,
- 0xf0, 0x0c, 0xa4, 0xbe, 0x78, 0x91, 0x1a, 0x3e, 0x5b, 0x70, 0xc8, 0x3d,
- 0x1e, 0x2a, 0x29, 0xbe, 0x4a, 0xe0, 0x45, 0xbe, 0xc5, 0xca, 0xbc, 0x3e,
- 0x6f, 0x36, 0xa5, 0x3e, 0xd2, 0x62, 0x34, 0xbd, 0x04, 0xe9, 0x1e, 0xbe,
- 0xca, 0x81, 0x82, 0xbb, 0x8b, 0x69, 0x3e, 0xbe, 0x0a, 0xdd, 0xd1, 0xbe,
- 0xf4, 0x42, 0x44, 0x3e, 0xd6, 0xa5, 0x70, 0x3e, 0x08, 0x89, 0x78, 0xbe,
- 0xde, 0x8d, 0xea, 0xbd, 0xc6, 0xaa, 0x96, 0xbd, 0x77, 0x7c, 0xf3, 0xbd,
- 0x4b, 0xea, 0xf4, 0xbc, 0x0c, 0xa4, 0xf1, 0x3e, 0x4a, 0x4c, 0x78, 0xbe,
- 0x21, 0xc2, 0x1c, 0x3e, 0x87, 0xb3, 0x11, 0xbe, 0xe0, 0x95, 0xe9, 0xbd,
- 0x35, 0xe7, 0xa9, 0x3d, 0x55, 0x3b, 0x86, 0x3e, 0x65, 0x7b, 0x16, 0x3f,
- 0xb5, 0xd3, 0x06, 0x3f, 0x70, 0x3c, 0x0a, 0x3d, 0x01, 0x18, 0x52, 0x3c,
- 0xb6, 0xc7, 0x4d, 0xbe, 0x42, 0xe4, 0x55, 0xbe, 0x57, 0xc6, 0xd5, 0x3e,
- 0xed, 0x93, 0x56, 0xbe, 0x3e, 0xc3, 0x04, 0x3d, 0xf5, 0x99, 0x89, 0xbc,
- 0xdd, 0x44, 0x87, 0xbd, 0xbd, 0x21, 0x4e, 0xbe, 0x06, 0xdf, 0x8a, 0x3e,
- 0x69, 0xe6, 0xf6, 0x3e, 0x49, 0x13, 0x99, 0xbe, 0xc0, 0x81, 0x4e, 0x3e,
- 0x04, 0x49, 0xb7, 0x3e, 0x53, 0x21, 0x54, 0x3d, 0xfb, 0x1f, 0x3b, 0xbe,
- 0x7a, 0x4a, 0x18, 0xbe, 0x3f, 0x85, 0x3c, 0x3e, 0xab, 0xac, 0xc9, 0xbd,
- 0xf2, 0x5a, 0x16, 0x3e, 0x50, 0x1d, 0x8d, 0x3e, 0x71, 0xdf, 0x0f, 0x3e,
- 0xd2, 0x18, 0x31, 0x3e, 0x1c, 0x33, 0x81, 0x3e, 0x1a, 0x76, 0xae, 0x3d,
- 0x6b, 0xdd, 0xb7, 0x3e, 0x51, 0x35, 0xd3, 0xbc, 0x6f, 0xbc, 0x03, 0xbf,
- 0x89, 0xce, 0xa6, 0xbd, 0x02, 0x0f, 0xed, 0xbe, 0x02, 0xc3, 0x01, 0xbf,
- 0xe4, 0x22, 0x20, 0x3e, 0x2b, 0xe9, 0x81, 0x3e, 0xbe, 0x47, 0x52, 0xbe,
- 0x6c, 0x26, 0x63, 0xbe, 0x60, 0x59, 0x89, 0xbe, 0x78, 0xdd, 0x23, 0x3e,
- 0xa8, 0x7c, 0x83, 0x3e, 0xba, 0x0a, 0x3b, 0x3e, 0x24, 0x63, 0x6b, 0xbe,
- 0xc2, 0x5e, 0x9f, 0xbe, 0x96, 0x12, 0x33, 0xbf, 0x2d, 0xfb, 0xd6, 0xbe,
- 0xad, 0xa7, 0x9a, 0xbe, 0x78, 0x01, 0x00, 0x3d, 0xfb, 0x49, 0x57, 0x3e,
- 0x68, 0x8a, 0x8e, 0x3e, 0x12, 0x07, 0x58, 0xbe, 0x95, 0x71, 0x53, 0xbe,
- 0x6e, 0x26, 0x3c, 0xbe, 0x0d, 0x4b, 0x18, 0xbe, 0xf3, 0x6c, 0xa6, 0xbd,
- 0x04, 0xaa, 0x65, 0xbe, 0x96, 0xe1, 0x1e, 0xbe, 0x85, 0xc2, 0x94, 0x3e,
- 0xe9, 0xd4, 0xfb, 0xbd, 0x48, 0x5a, 0xc4, 0x3d, 0x27, 0x4d, 0x05, 0x3e,
- 0xc3, 0x4c, 0x59, 0xbc, 0xd8, 0x4c, 0xbf, 0xbe, 0x32, 0xd0, 0xbf, 0x3d,
- 0x8a, 0xc7, 0x66, 0x3a, 0x66, 0x09, 0x89, 0xbc, 0x9c, 0x5c, 0x76, 0xbe,
- 0x32, 0x66, 0x52, 0xbe, 0x74, 0xd7, 0xfc, 0x3d, 0xc5, 0x30, 0xd8, 0xbe,
- 0x7f, 0x69, 0x20, 0xbd, 0x08, 0xe5, 0xc8, 0x3e, 0xcd, 0xe1, 0x3e, 0x3c,
- 0x8b, 0xae, 0x6b, 0xbe, 0xe1, 0x74, 0x12, 0xbf, 0x0f, 0x09, 0xf8, 0xbe,
- 0x79, 0xb3, 0xc4, 0xbe, 0xf9, 0x3a, 0xd4, 0xbe, 0xfb, 0x64, 0x24, 0xbf,
- 0x92, 0xea, 0x09, 0x3f, 0x43, 0x5d, 0xe3, 0x3c, 0x59, 0xe1, 0x95, 0xbd,
- 0xe7, 0xa7, 0xed, 0x3b, 0x47, 0x27, 0x46, 0x3e, 0xd0, 0xba, 0x3e, 0xbf,
- 0x0e, 0x67, 0xc0, 0x3e, 0x4c, 0x1c, 0xbb, 0x3e, 0x44, 0x8f, 0x73, 0x3e,
- 0x4b, 0x7d, 0x1a, 0x3e, 0x7f, 0xdb, 0xac, 0x3e, 0x10, 0xb7, 0x57, 0xbe,
- 0xde, 0x0c, 0xf7, 0x3e, 0xd4, 0xbc, 0x1d, 0x3f, 0x9d, 0x9d, 0xf3, 0xbe,
- 0x54, 0xee, 0xb3, 0x3d, 0xb4, 0x5c, 0xcf, 0xbe, 0xe3, 0x33, 0xa0, 0xbe,
- 0x4b, 0xfd, 0x08, 0xbe, 0x89, 0xde, 0xc5, 0xbe, 0xb6, 0x91, 0x96, 0xbc,
- 0xb8, 0xb8, 0xef, 0xbe, 0xd9, 0x19, 0x08, 0x3f, 0xad, 0x26, 0x7c, 0x3e,
- 0xf2, 0xb1, 0x6c, 0x3e, 0x9a, 0x89, 0xb2, 0x3e, 0xf1, 0xce, 0xe9, 0x3b,
- 0xa3, 0xcc, 0x16, 0xbf, 0x61, 0xf0, 0x57, 0xbf, 0xbe, 0xf2, 0x2d, 0xbf,
- 0x30, 0xa8, 0x3d, 0xbc, 0x11, 0x54, 0x11, 0x3d, 0xab, 0xf4, 0xb8, 0xbe,
- 0x8c, 0x0f, 0x2a, 0xbf, 0x56, 0x35, 0x9b, 0xbe, 0xbf, 0x7c, 0x2b, 0x3e,
- 0x31, 0xc2, 0x2c, 0xbf, 0xb1, 0x85, 0x76, 0xbe, 0xa7, 0x24, 0x15, 0xbe,
- 0x1d, 0x09, 0xd0, 0xbe, 0xc2, 0xdf, 0xb6, 0x3c, 0x90, 0xd4, 0x1f, 0x3e,
- 0x80, 0xb0, 0x8b, 0x3e, 0xdc, 0xa6, 0x32, 0xbf, 0xb3, 0x4e, 0x11, 0x3e,
- 0x77, 0xb6, 0x92, 0xbe, 0x8e, 0xd7, 0x11, 0xbe, 0x4c, 0xf6, 0x47, 0xbf,
- 0x1e, 0x57, 0x00, 0xbf, 0x34, 0x21, 0x43, 0xbe, 0xc7, 0xc5, 0xda, 0x3e,
- 0xb2, 0x99, 0x78, 0xbe, 0x7f, 0xeb, 0x92, 0xbd, 0xdb, 0x14, 0xe7, 0x3e,
- 0xa4, 0xe5, 0x8e, 0x3e, 0x7b, 0xeb, 0x05, 0x3f, 0x31, 0xb5, 0x52, 0xbf,
- 0x87, 0x93, 0x3c, 0xbf, 0x81, 0xcb, 0x05, 0x3f, 0x2d, 0xf7, 0x4b, 0x3e,
- 0xa4, 0x60, 0x33, 0x3e, 0x7f, 0x6c, 0xba, 0x3d, 0x6a, 0xca, 0x30, 0xbd,
- 0x51, 0xfe, 0xc4, 0x3d, 0x7f, 0x45, 0x4a, 0x3e, 0x82, 0x8e, 0x9b, 0xbe,
- 0x21, 0x96, 0x82, 0x3e, 0x78, 0x86, 0x43, 0xbe, 0x1b, 0x40, 0x2a, 0xbf,
- 0x31, 0xe7, 0x0d, 0xbf, 0x38, 0xb6, 0x76, 0x3e, 0x3d, 0x89, 0x9a, 0xbd,
- 0x5b, 0xfb, 0xce, 0xbd, 0x0f, 0x82, 0x39, 0x3e, 0xa4, 0x78, 0x26, 0x3d,
- 0xbb, 0x88, 0x90, 0xbe, 0x68, 0xca, 0xc6, 0x3d, 0x43, 0xbc, 0x2a, 0xbd,
- 0xb1, 0x15, 0xed, 0x3d, 0xaa, 0xc2, 0x87, 0x3d, 0xa1, 0x72, 0x3b, 0xbf,
- 0xd3, 0x30, 0x18, 0xbe, 0x79, 0xd4, 0x00, 0xbf, 0xbd, 0x1c, 0xbf, 0xbd,
- 0x20, 0x0c, 0x54, 0xbe, 0xa6, 0x5e, 0x71, 0xbe, 0xa2, 0x36, 0xf2, 0xbe,
- 0x64, 0x0f, 0xd6, 0x3d, 0x49, 0x7d, 0x84, 0xbe, 0xab, 0x88, 0xd6, 0xbe,
- 0x36, 0x55, 0x43, 0x3e, 0xdf, 0x56, 0x25, 0xbe, 0xdf, 0x81, 0xb8, 0xbe,
- 0xad, 0x21, 0x9c, 0xbe, 0xf8, 0x90, 0xb3, 0xbd, 0x33, 0x16, 0xae, 0x3e,
- 0x5f, 0xf2, 0x82, 0x3b, 0xfe, 0x2d, 0x62, 0xbe, 0x31, 0xa7, 0x99, 0xbe,
- 0x41, 0xe4, 0x0f, 0x3e, 0xc7, 0x1e, 0x04, 0xbf, 0x69, 0x36, 0x80, 0xbe,
- 0x82, 0x34, 0x0c, 0x3d, 0x12, 0xef, 0xdb, 0x3d, 0x5e, 0xa8, 0x05, 0x3f,
- 0x80, 0x1a, 0x75, 0xbe, 0xf8, 0x9a, 0xeb, 0xbe, 0x24, 0x16, 0xb2, 0xbd,
- 0xb3, 0x1c, 0x87, 0xbe, 0x5c, 0x03, 0x05, 0x3f, 0xf6, 0x41, 0xb9, 0xbe,
- 0x16, 0xbc, 0x9b, 0x3e, 0x15, 0x41, 0x4c, 0xbd, 0x40, 0x00, 0x1b, 0xbe,
- 0x42, 0x0b, 0xe0, 0xbe, 0x3f, 0x2f, 0x84, 0x3e, 0xaa, 0x88, 0xed, 0x3e,
- 0xb1, 0x56, 0x63, 0xbe, 0x48, 0x97, 0xa8, 0x3e, 0x20, 0x20, 0xf6, 0xbe,
- 0x1e, 0xcb, 0x98, 0x3e, 0x9f, 0x86, 0x78, 0x3e, 0xce, 0x66, 0xe8, 0xbe,
- 0xfb, 0x1e, 0xd5, 0x3d, 0x41, 0x14, 0x34, 0x3e, 0x71, 0xfd, 0x42, 0xbe,
- 0x15, 0xf8, 0xbc, 0x3e, 0x27, 0xbc, 0x02, 0xbd, 0xf8, 0x01, 0x20, 0xbf,
- 0x8c, 0x73, 0x3e, 0x3e, 0x45, 0x29, 0xd0, 0x3e, 0x67, 0xa1, 0xfa, 0x3e,
- 0x1a, 0x79, 0xd5, 0x3c, 0xd7, 0x4f, 0x5f, 0x3d, 0x94, 0x4c, 0xf2, 0xbe,
- 0xe4, 0x58, 0x42, 0x3e, 0xc1, 0x4e, 0x5c, 0x3e, 0xad, 0x0f, 0xb4, 0xbd,
- 0x5e, 0x72, 0xc7, 0x3e, 0xeb, 0x75, 0x97, 0x3e, 0xca, 0xb1, 0xa4, 0x3e,
- 0xa0, 0x9c, 0x3b, 0xbe, 0x0f, 0xdc, 0x59, 0xbd, 0x64, 0xb9, 0xae, 0xbd,
- 0x6d, 0xa1, 0xac, 0xbe, 0x67, 0xfc, 0xc4, 0x3e, 0x0c, 0x03, 0xdb, 0xbd,
- 0x9a, 0x4d, 0x00, 0x3f, 0xda, 0x1c, 0x85, 0x3e, 0xa6, 0x33, 0x51, 0x3e,
- 0x25, 0xdd, 0x61, 0xbe, 0x66, 0x53, 0xac, 0xbe, 0x89, 0xc9, 0x4b, 0x3e,
- 0x8e, 0x3d, 0x9e, 0x3e, 0x25, 0x3f, 0xe6, 0xbc, 0xed, 0x04, 0xe2, 0xbd,
- 0xfe, 0x72, 0x84, 0xbe, 0xf3, 0x50, 0x06, 0x3e, 0x3a, 0x85, 0x8d, 0x3e,
- 0x3b, 0x21, 0xe3, 0x3e, 0x20, 0xbf, 0xb8, 0x3c, 0xfe, 0x41, 0x82, 0x3e,
- 0xc0, 0xc0, 0x54, 0x3e, 0xce, 0xde, 0xb4, 0xb7, 0x3d, 0xee, 0x3d, 0xbe,
- 0x16, 0xa3, 0xea, 0xbe, 0x96, 0x51, 0x0b, 0xbe, 0x9f, 0x03, 0x8c, 0x3d,
- 0xd3, 0x1e, 0x1a, 0x3e, 0x70, 0x73, 0x7e, 0xbe, 0xcb, 0xea, 0x20, 0xbe,
- 0xd2, 0xf1, 0x04, 0x3e, 0x8b, 0xfa, 0xfb, 0xbd, 0xf9, 0x88, 0xd2, 0x3e,
- 0x5f, 0x92, 0x10, 0x3f, 0x35, 0xdc, 0xaa, 0xbe, 0x66, 0xd6, 0x22, 0x3e,
- 0x7a, 0xef, 0xcc, 0xbd, 0xd0, 0xf4, 0x34, 0x3e, 0x5a, 0xe3, 0x7e, 0x3e,
- 0xb9, 0xf7, 0x2e, 0xbe, 0xae, 0x93, 0xf6, 0x3d, 0xae, 0x54, 0xc5, 0xbe,
- 0x65, 0x54, 0x7f, 0xbe, 0xa2, 0x17, 0x36, 0x3e, 0x58, 0xf2, 0xde, 0xbe,
- 0x01, 0x52, 0x89, 0x3e, 0x69, 0x7f, 0xda, 0xbe, 0x76, 0x83, 0x8e, 0xbe,
- 0x7d, 0x9d, 0xb0, 0xbb, 0xba, 0x04, 0x7c, 0xbe, 0x9f, 0xb7, 0xe1, 0xbd,
- 0xdb, 0x37, 0x8c, 0xbb, 0xdd, 0x62, 0x36, 0xbe, 0x2d, 0x3b, 0xcf, 0x3e,
- 0x48, 0xe4, 0xba, 0x3e, 0xa4, 0x15, 0x39, 0x3e, 0xf4, 0x3c, 0x07, 0x3f,
- 0xc0, 0xd9, 0x19, 0xbe, 0xb0, 0x8c, 0x43, 0x3b, 0xdd, 0x0c, 0x73, 0x3e,
- 0xa9, 0xb5, 0x2c, 0xbe, 0xc2, 0x51, 0x3f, 0x3e, 0x37, 0x2c, 0x80, 0xbe,
- 0xc6, 0xfd, 0x8b, 0x3e, 0x68, 0x76, 0x52, 0x3e, 0x52, 0x2b, 0x9b, 0xbe,
- 0x2b, 0xa7, 0x39, 0x3e, 0x4f, 0xa0, 0x71, 0xbe, 0x19, 0x66, 0x67, 0x3e,
- 0x79, 0x2c, 0x61, 0xbe, 0xbc, 0xed, 0x30, 0x3e, 0x5c, 0xdf, 0x84, 0x3d,
- 0x9b, 0xd9, 0x41, 0x3c, 0x6a, 0x4d, 0x59, 0xbe, 0x9b, 0xee, 0x47, 0xbe,
- 0x93, 0x9c, 0x11, 0x3f, 0xcc, 0xe8, 0xcd, 0x3e, 0x90, 0x14, 0xa2, 0xbd,
- 0xbc, 0xe4, 0x8e, 0xbe, 0xdd, 0x54, 0x49, 0x3e, 0xad, 0xa6, 0xb5, 0x3e,
- 0x16, 0x92, 0xb4, 0xbd, 0xdf, 0xdb, 0x51, 0xbe, 0x08, 0x6b, 0x1b, 0xbe,
- 0x0b, 0xc4, 0xc4, 0xbc, 0x25, 0x53, 0x8d, 0xbd, 0x11, 0x1d, 0xc4, 0x3e,
- 0xfc, 0x40, 0xcd, 0xbc, 0x94, 0x11, 0x62, 0x3e, 0xff, 0x82, 0x9f, 0x3d,
- 0xf7, 0xa1, 0x49, 0x3e, 0x40, 0x32, 0xc2, 0x3d, 0x9b, 0x9a, 0x82, 0xbd,
- 0x76, 0xfc, 0xe1, 0xbd, 0xfb, 0xc4, 0x00, 0xbf, 0x6c, 0x13, 0x41, 0x3e,
- 0x92, 0x0b, 0x08, 0x3d, 0x4d, 0xcf, 0xad, 0x3c, 0xdb, 0x49, 0x1a, 0xbe,
- 0xdf, 0xfe, 0x2f, 0xbd, 0xac, 0x65, 0x5b, 0xbd, 0x89, 0x84, 0x4e, 0xbe,
- 0xfa, 0x5b, 0xe3, 0x3e, 0x9d, 0x1f, 0xa5, 0xbd, 0x20, 0x3b, 0xd6, 0xbd,
- 0xd5, 0x5c, 0xcb, 0xbd, 0xda, 0x28, 0xed, 0xbe, 0x64, 0x13, 0x21, 0xbe,
- 0x1a, 0x64, 0x7e, 0x3d, 0x44, 0x7a, 0x9c, 0x3e, 0xa2, 0x5a, 0x6c, 0x3e,
- 0x47, 0x19, 0x00, 0x3d, 0xfb, 0x60, 0x82, 0xbe, 0x3e, 0xcf, 0x10, 0xbf,
- 0xa2, 0x16, 0xdf, 0x3d, 0xda, 0xe1, 0x0f, 0x3e, 0x89, 0x48, 0x8f, 0xbd,
- 0xdb, 0x21, 0x26, 0x3d, 0xf1, 0x15, 0x39, 0xbf, 0x1a, 0xdd, 0xde, 0x3d,
- 0x21, 0x20, 0x73, 0xbe, 0xe4, 0xe6, 0xa7, 0xbe, 0x14, 0x85, 0x41, 0x3d,
- 0xac, 0x75, 0x98, 0x3d, 0x92, 0x89, 0x82, 0xbe, 0x2f, 0xae, 0xd0, 0xbe,
- 0xae, 0x76, 0x66, 0xbe, 0x81, 0xc0, 0x8a, 0xbd, 0x65, 0x9e, 0xda, 0xbe,
- 0xc5, 0xb8, 0x9d, 0x3d, 0x73, 0x93, 0x50, 0x3c, 0x3f, 0x76, 0xf0, 0x3c,
- 0x84, 0xff, 0x78, 0xbd, 0x23, 0xf0, 0xbe, 0x3d, 0x52, 0x2f, 0xdd, 0xbe,
- 0xd9, 0x3d, 0xbe, 0xbe, 0xe5, 0x26, 0x88, 0xbe, 0x52, 0xe4, 0x77, 0x3d,
- 0x38, 0x63, 0x6c, 0xbe, 0x15, 0xe4, 0x36, 0xbe, 0x83, 0x74, 0x4c, 0xbc,
- 0x52, 0x4d, 0x78, 0xbe, 0xa0, 0xd8, 0x53, 0x3e, 0x7a, 0x6e, 0xfb, 0xbc,
- 0x11, 0x30, 0x08, 0xbe, 0x04, 0x95, 0xb4, 0xbe, 0x44, 0xed, 0x97, 0x3d,
- 0xae, 0x9c, 0x34, 0x3d, 0x49, 0x98, 0x55, 0x3e, 0x3c, 0x48, 0x15, 0xbd,
- 0xc9, 0x5b, 0x1d, 0xbe, 0xac, 0xa6, 0xbe, 0xbe, 0x3a, 0x10, 0x22, 0xbe,
- 0xed, 0x2a, 0xe8, 0xbb, 0x73, 0x9e, 0x53, 0xbd, 0x70, 0x8c, 0x71, 0x3d,
- 0x2b, 0xe8, 0x47, 0xbe, 0xf9, 0x86, 0x99, 0xbe, 0x44, 0xa0, 0x8b, 0xbd,
- 0xd4, 0x54, 0x14, 0xbc, 0x1b, 0x2e, 0x04, 0xbf, 0x3b, 0xf5, 0x8c, 0xbe,
- 0x72, 0x3e, 0xe4, 0xbe, 0xa5, 0x8d, 0x16, 0xbe, 0x28, 0x2c, 0x3a, 0x3e,
- 0x59, 0x95, 0x17, 0x3e, 0x9e, 0xd0, 0x7a, 0x3e, 0x78, 0x84, 0xa5, 0x3e,
- 0x78, 0x12, 0xa1, 0xbe, 0xa2, 0xb5, 0xc0, 0xbd, 0xb8, 0xa1, 0x0b, 0xbe,
- 0xb5, 0x9e, 0x6c, 0x3e, 0xdb, 0x84, 0xa7, 0x3d, 0xf3, 0xde, 0x05, 0xbe,
- 0x12, 0x43, 0xce, 0xbd, 0xca, 0xb8, 0x9e, 0x3e, 0xa3, 0x65, 0x84, 0x3d,
- 0x85, 0xa1, 0x0c, 0x3f, 0x2f, 0x60, 0xe2, 0x3e, 0x1e, 0xa6, 0x2b, 0xbe,
- 0x1c, 0x67, 0x8c, 0xbe, 0xf2, 0xe5, 0x33, 0xbe, 0x03, 0xe7, 0x21, 0xbf,
- 0x8c, 0xed, 0xad, 0xbe, 0xd8, 0xe7, 0x0c, 0xbf, 0x12, 0x84, 0x2e, 0x3d,
- 0xb2, 0x1e, 0xf6, 0x3c, 0xe7, 0x61, 0x87, 0xbe, 0x9a, 0xf0, 0x3a, 0x3e,
- 0xb2, 0x96, 0x28, 0x3c, 0x45, 0xfc, 0x41, 0xbe, 0xe6, 0x81, 0x97, 0xbd,
- 0x74, 0x19, 0xf0, 0xbd, 0x49, 0x91, 0xc3, 0xbe, 0x18, 0xb2, 0xcb, 0x3e,
- 0x7c, 0x42, 0x9a, 0x3e, 0xd8, 0xa2, 0x95, 0x3e, 0x4c, 0x52, 0xd9, 0x3d,
- 0xa0, 0x2a, 0x57, 0x3d, 0x98, 0xb2, 0xaa, 0xbe, 0xcd, 0x74, 0xf6, 0x3e,
- 0xd8, 0xe7, 0x70, 0xbe, 0x37, 0x8c, 0xc7, 0x3e, 0x5f, 0xc8, 0x28, 0x3d,
- 0xfd, 0x87, 0x11, 0xbd, 0x26, 0x6a, 0x54, 0x3d, 0xd5, 0xe4, 0xd9, 0x3d,
- 0x7c, 0x10, 0x18, 0xbe, 0xce, 0x0c, 0x9e, 0x3e, 0xec, 0x7e, 0x6a, 0x3e,
- 0x91, 0xf0, 0xdf, 0x3d, 0xb6, 0x9d, 0xa9, 0xbe, 0x00, 0xe1, 0x72, 0x3d,
- 0x75, 0x7d, 0x5f, 0x3e, 0x5c, 0xc3, 0x16, 0xbf, 0x6d, 0x1a, 0x35, 0x3e,
- 0xa5, 0x01, 0xba, 0x3d, 0x33, 0x32, 0x61, 0xbc, 0x0b, 0x98, 0xc1, 0xbe,
- 0xb4, 0xf1, 0x02, 0xbe, 0xd7, 0x8d, 0x59, 0x3e, 0x2f, 0xbb, 0x1e, 0x3e,
- 0xd3, 0x7f, 0x07, 0xbe, 0xc1, 0x68, 0x69, 0xbd, 0xdc, 0xcc, 0x02, 0x3e,
- 0x7f, 0x8f, 0x2b, 0xbe, 0xfb, 0x52, 0xff, 0xbd, 0x69, 0xc2, 0x18, 0xbf,
- 0x87, 0xb7, 0xe4, 0x3d, 0x65, 0x47, 0xb9, 0xbd, 0x06, 0x32, 0x34, 0xbd,
- 0xde, 0xdd, 0x5c, 0x3c, 0x81, 0xd1, 0x0c, 0x3c, 0x4e, 0x97, 0xcb, 0xbe,
- 0x63, 0xac, 0xe8, 0xbe, 0xe9, 0x4e, 0x04, 0xbd, 0x43, 0xb5, 0x68, 0x3e,
- 0x73, 0x7c, 0xef, 0xbe, 0xe0, 0xd6, 0x99, 0x3c, 0x9f, 0x7a, 0x95, 0xbe,
- 0xf9, 0x2e, 0xca, 0xbd, 0x0f, 0x9f, 0x44, 0xbf, 0xa6, 0x24, 0x11, 0xbe,
- 0x37, 0xe1, 0x76, 0x3c, 0x2a, 0xcc, 0xcd, 0xbe, 0xd1, 0xb9, 0x53, 0xbe,
- 0x70, 0x36, 0xf9, 0xbe, 0x30, 0x83, 0xfe, 0xbb, 0x51, 0x13, 0xca, 0x3e,
- 0xd1, 0x66, 0xe9, 0xbe, 0xb2, 0xa8, 0x66, 0x3e, 0x7e, 0xd1, 0xa7, 0x3d,
- 0xec, 0x2e, 0xfb, 0xbd, 0xd9, 0x70, 0x9d, 0xbe, 0x52, 0x80, 0x4b, 0xbf,
- 0x9f, 0x44, 0xb6, 0x3e, 0x3f, 0xc0, 0x9c, 0xbe, 0x5d, 0x37, 0x00, 0xbf,
- 0xb3, 0x2c, 0x90, 0x3e, 0xa4, 0xa2, 0xc5, 0xbd, 0x1a, 0x26, 0x60, 0x3e,
- 0x63, 0xb7, 0x07, 0x3e, 0x42, 0x58, 0x39, 0x3e, 0x63, 0xbe, 0x83, 0x3c,
- 0xf6, 0xe6, 0x32, 0xbe, 0xf3, 0xae, 0x42, 0x3e, 0x05, 0x57, 0x9d, 0x3e,
- 0x52, 0x86, 0x84, 0xbe, 0x98, 0x16, 0x58, 0xbe, 0x32, 0xfe, 0x37, 0x3e,
- 0x6c, 0xeb, 0xb2, 0xbd, 0x3b, 0x9f, 0x86, 0x3e, 0xaa, 0xa9, 0x90, 0xbe,
- 0xd3, 0x96, 0xc8, 0xbe, 0xcf, 0x55, 0x25, 0x3e, 0x44, 0x78, 0x81, 0x3e,
- 0xa1, 0x00, 0x3c, 0x3d, 0x02, 0xde, 0x8c, 0x3e, 0xc9, 0xfc, 0xee, 0xbd,
- 0x9e, 0xa5, 0x11, 0x3e, 0x03, 0xbd, 0xf9, 0x3e, 0x9e, 0x18, 0x46, 0x3e,
- 0x9f, 0x8b, 0x0a, 0x3d, 0x76, 0x1a, 0xdd, 0xbd, 0x92, 0xc6, 0x32, 0x3e,
- 0xc1, 0xbf, 0x31, 0xbd, 0xb8, 0x0d, 0xaa, 0xbe, 0xef, 0xb4, 0x24, 0xbe,
- 0x64, 0xa2, 0xa7, 0xbe, 0x0b, 0xe4, 0x1b, 0xbd, 0x62, 0xe1, 0x12, 0xbf,
- 0x21, 0xea, 0xe3, 0x3d, 0xde, 0x09, 0xd4, 0xbe, 0x98, 0x0d, 0x76, 0xbd,
- 0x76, 0xed, 0x89, 0x3d, 0x9a, 0xc3, 0x2b, 0x3e, 0x9b, 0x9e, 0x42, 0x3e,
- 0x8f, 0xcb, 0xf7, 0x3e, 0x44, 0x08, 0x00, 0xbe, 0x0a, 0x66, 0xaa, 0x3a,
- 0x35, 0x88, 0x96, 0x3e, 0xcd, 0x4e, 0x99, 0x3d, 0xad, 0x0b, 0x73, 0x3d,
- 0x13, 0x54, 0x49, 0x3d, 0x29, 0xc8, 0x29, 0xbe, 0x73, 0xbf, 0x61, 0x3d,
- 0xb3, 0x18, 0x8b, 0xbe, 0x6e, 0x5a, 0xf4, 0xbe, 0xe1, 0x76, 0x03, 0xbf,
- 0x25, 0x0c, 0x57, 0x3e, 0xd7, 0xbe, 0xc4, 0xbe, 0x50, 0x96, 0x0b, 0xbf,
- 0x78, 0x37, 0xf2, 0x3d, 0x1c, 0xba, 0xe9, 0x3d, 0xac, 0x10, 0x3b, 0x3e,
- 0xd3, 0xfd, 0x4d, 0xbe, 0xca, 0x2e, 0xdb, 0x3d, 0xb6, 0x69, 0x89, 0x3c,
- 0x45, 0x31, 0xf9, 0x3d, 0x7c, 0xcb, 0x31, 0x3e, 0x8f, 0x30, 0xdb, 0xbe,
- 0xe4, 0xee, 0x16, 0xbe, 0xb3, 0x94, 0xab, 0x3d, 0xe0, 0xad, 0xbc, 0x3e,
- 0xa4, 0x2a, 0x31, 0xbd, 0xa0, 0xf1, 0x32, 0xbd, 0xee, 0xf1, 0x3a, 0xbe,
- 0x6d, 0x93, 0x01, 0xbe, 0x95, 0xfb, 0xfe, 0xbe, 0xec, 0x7c, 0x23, 0xbf,
- 0x53, 0xbd, 0x5a, 0x3e, 0xb4, 0x84, 0xc0, 0xbe, 0x31, 0xde, 0xc5, 0x3d,
- 0x24, 0x01, 0x1a, 0xbe, 0x31, 0x35, 0x89, 0x3e, 0x35, 0x82, 0x4f, 0xbf,
- 0x94, 0xb1, 0x0a, 0xbe, 0x08, 0xb8, 0x7a, 0xbd, 0x3e, 0xad, 0x53, 0xbd,
- 0x40, 0x04, 0x77, 0xbe, 0x03, 0x7a, 0x49, 0x3e, 0xe8, 0x8f, 0xda, 0xbd,
- 0xc3, 0x11, 0x8d, 0x3e, 0x9a, 0xb0, 0x09, 0xbe, 0xf0, 0x90, 0x0e, 0x3d,
- 0xe5, 0x75, 0x41, 0xbe, 0xbe, 0xff, 0x55, 0xbd, 0xf6, 0x54, 0xaa, 0x3e,
- 0xb9, 0xdd, 0xf1, 0x3a, 0xdd, 0x09, 0x3f, 0xbd, 0x96, 0x71, 0x43, 0xbe,
- 0x8c, 0x18, 0x8b, 0x3e, 0x83, 0xc5, 0x4b, 0x3e, 0xa7, 0x44, 0x90, 0xbe,
- 0xee, 0xb4, 0x47, 0x3e, 0x4a, 0x05, 0x51, 0x3e, 0x06, 0xc2, 0xb7, 0xbe,
- 0x1a, 0x5e, 0x67, 0xbe, 0xc5, 0x75, 0x31, 0xbf, 0x2c, 0x25, 0xaa, 0x3d,
- 0xee, 0xdf, 0xc5, 0xbe, 0x53, 0xcd, 0xc8, 0xbe, 0x3f, 0x2d, 0x62, 0xbd,
- 0xb5, 0xad, 0x12, 0xbf, 0xba, 0x4c, 0xed, 0x3d, 0x1a, 0x3a, 0x68, 0x3e,
- 0x9a, 0xc6, 0xce, 0x3e, 0xe6, 0x1f, 0xc2, 0xbd, 0x24, 0xde, 0x57, 0x3d,
- 0x74, 0xf8, 0xcb, 0x3c, 0xd1, 0xfd, 0xd4, 0xbe, 0x2f, 0x91, 0xaf, 0xbe,
- 0xa9, 0x9b, 0x83, 0xbe, 0x49, 0x39, 0x1e, 0x3e, 0x81, 0x4f, 0x1d, 0xbf,
- 0xc2, 0x3b, 0x2c, 0xb9, 0x1f, 0xe3, 0x4f, 0xbe, 0x35, 0xff, 0xb1, 0xbf,
- 0x29, 0xaf, 0x1d, 0xbf, 0x49, 0x06, 0xa2, 0xbe, 0xd3, 0xfb, 0xe1, 0xbe,
- 0x95, 0xbd, 0xfa, 0xbe, 0xec, 0x88, 0xba, 0xbe, 0xf9, 0x37, 0x39, 0x3e,
- 0x80, 0x77, 0x85, 0xbe, 0xac, 0x75, 0x53, 0x3e, 0xcf, 0xf7, 0x8e, 0x3e,
- 0x44, 0x40, 0x4f, 0x3e, 0x55, 0x2a, 0xfa, 0x3d, 0x62, 0xf6, 0x01, 0xbf,
- 0x52, 0x37, 0x44, 0x3e, 0xdf, 0x21, 0xb5, 0xbd, 0x25, 0x9d, 0x72, 0x3e,
- 0x95, 0x34, 0xa4, 0x3e, 0xd4, 0x71, 0xbf, 0x3e, 0x03, 0xd4, 0x40, 0xbe,
- 0x76, 0x54, 0x1b, 0x3e, 0xd2, 0x11, 0x0f, 0xbf, 0xdc, 0xaf, 0xb6, 0xbe,
- 0x2b, 0xb2, 0x4f, 0x3d, 0x36, 0x21, 0xc3, 0xbd, 0x02, 0x81, 0x49, 0xbe,
- 0xa6, 0x4a, 0x64, 0xbf, 0x9a, 0xe3, 0xa2, 0xbd, 0xa7, 0x15, 0x2b, 0x3e,
- 0xb4, 0x76, 0x9e, 0x3e, 0x71, 0x52, 0x09, 0x3e, 0xde, 0x7c, 0xc8, 0x3e,
- 0x57, 0xbe, 0x99, 0xbe, 0x32, 0x52, 0x8e, 0xbe, 0x95, 0xd8, 0xf8, 0x3d,
- 0x2f, 0xe8, 0x3a, 0xbe, 0x29, 0x9f, 0xc0, 0xbe, 0x1f, 0xb1, 0x58, 0xbe,
- 0xa9, 0xc4, 0x00, 0xbe, 0x63, 0x60, 0x76, 0xbf, 0x49, 0xc0, 0xf4, 0x3e,
- 0x6f, 0xbb, 0x0a, 0xbd, 0xc4, 0x6e, 0x28, 0xbe, 0xeb, 0xf8, 0xee, 0x3d,
- 0x33, 0xc2, 0x91, 0x3e, 0x7c, 0xfa, 0xb6, 0xbe, 0xdf, 0x4c, 0x2e, 0x3e,
- 0xba, 0xfd, 0x19, 0xbe, 0x73, 0xb6, 0x79, 0x3c, 0xd0, 0xed, 0x83, 0x3d,
- 0x48, 0xa2, 0x6f, 0x3e, 0x30, 0x62, 0x0b, 0x3f, 0x45, 0xe9, 0x66, 0xbe,
- 0x05, 0x20, 0x6d, 0xbe, 0xd8, 0xe5, 0x84, 0x3e, 0x7b, 0x01, 0x08, 0xbf,
- 0x50, 0xb4, 0x85, 0xbd, 0xf2, 0x4d, 0x40, 0xbe, 0x5a, 0x55, 0x5a, 0xbe,
- 0x0b, 0x5a, 0xce, 0xbe, 0x35, 0x95, 0xd3, 0xbe, 0x05, 0xfa, 0xba, 0xbd,
- 0xe2, 0xef, 0x09, 0xbd, 0x8e, 0x9c, 0xb1, 0xbe, 0xe4, 0xd9, 0xd1, 0x3e,
- 0x1f, 0x34, 0x63, 0x3d, 0xf5, 0x60, 0x97, 0x3d, 0xea, 0x1a, 0x91, 0xbd,
- 0x00, 0x65, 0x01, 0xbe, 0x34, 0xa7, 0x0a, 0xbd, 0xe5, 0x1b, 0x07, 0x3e,
- 0xb7, 0x13, 0xdf, 0x3d, 0x95, 0xff, 0x8f, 0xbe, 0x96, 0x3c, 0xaa, 0x3e,
- 0xd5, 0x8e, 0x43, 0x3e, 0xe7, 0x2a, 0xc9, 0x3e, 0x7c, 0xc9, 0xf0, 0x3e,
- 0x6e, 0xa3, 0xe6, 0x3e, 0x69, 0x67, 0xda, 0x3e, 0x4a, 0xae, 0xa0, 0x3d,
- 0x7e, 0x84, 0x13, 0xbf, 0x48, 0x43, 0xf7, 0xbc, 0xcd, 0x9f, 0x40, 0x3e,
- 0x78, 0x6e, 0x7b, 0xbe, 0xe2, 0xbf, 0x96, 0x3e, 0xe2, 0x2b, 0x1a, 0xbe,
- 0x06, 0x7e, 0xb5, 0xbe, 0x49, 0xbf, 0xca, 0xbc, 0xd1, 0x24, 0x09, 0xbe,
- 0x34, 0x7b, 0x80, 0xbd, 0x09, 0x5e, 0xcd, 0xbd, 0xc7, 0x26, 0x56, 0xbe,
- 0xa3, 0xd6, 0x74, 0x3e, 0xac, 0x9f, 0x53, 0x3e, 0x56, 0xf9, 0xc7, 0x3d,
- 0xbe, 0xb1, 0x22, 0x3d, 0x3a, 0x7a, 0x2a, 0xbe, 0x63, 0x4c, 0x65, 0x3d,
- 0x29, 0x05, 0x6e, 0xbe, 0xd9, 0x4d, 0x9e, 0x3d, 0xbf, 0x24, 0xaf, 0xbe,
- 0x3c, 0xa1, 0x76, 0xbe, 0x7d, 0xc2, 0x17, 0x3e, 0xf4, 0x4f, 0xd7, 0x3d,
- 0x6f, 0x5a, 0x1d, 0x3d, 0xb0, 0x2f, 0xcb, 0xbc, 0x1a, 0x27, 0xab, 0xbe,
- 0x93, 0xa1, 0x37, 0xbe, 0xeb, 0xc4, 0x88, 0xbe, 0xba, 0x2e, 0x8d, 0xbe,
- 0xa4, 0x52, 0xc1, 0xbd, 0x89, 0x2f, 0xed, 0xbd, 0xde, 0x4e, 0x00, 0x3f,
- 0x7f, 0xb4, 0x1f, 0xbf, 0xb0, 0xf9, 0x05, 0xbf, 0x0a, 0x71, 0x1c, 0xbe,
- 0x7d, 0x0c, 0xcf, 0x3e, 0x4b, 0x51, 0x3e, 0x3e, 0xf0, 0xc8, 0x60, 0xbb,
- 0xc7, 0x4f, 0x88, 0xbe, 0x47, 0x87, 0x9d, 0x3d, 0xc0, 0x00, 0x26, 0xbe,
- 0xa5, 0x63, 0x8a, 0xbe, 0xf5, 0x8c, 0x20, 0x3e, 0x40, 0x70, 0x38, 0x3d,
- 0xf3, 0x05, 0x42, 0x3e, 0x13, 0x5f, 0xe4, 0xbd, 0xbc, 0x31, 0x53, 0xbd,
- 0x04, 0x89, 0xea, 0x3d, 0xfc, 0x53, 0x0b, 0xbe, 0x67, 0x83, 0xbe, 0xbd,
- 0xb4, 0x92, 0x51, 0xbf, 0x14, 0x47, 0xa2, 0xbe, 0x9e, 0x41, 0xfa, 0x3d,
- 0xad, 0xba, 0x5d, 0x3e, 0xde, 0xba, 0x96, 0x3e, 0xd0, 0xb0, 0x82, 0xbe,
- 0xff, 0xeb, 0x8a, 0xbd, 0xaa, 0xe2, 0xbc, 0x3e, 0xf2, 0x91, 0x2b, 0xbf,
- 0x8a, 0x31, 0x37, 0xbd, 0x2f, 0x5e, 0x0d, 0xbf, 0x03, 0xf6, 0x57, 0x3e,
- 0xdb, 0xb2, 0x85, 0xbe, 0x01, 0xfb, 0xf7, 0x3e, 0x5e, 0x35, 0xbc, 0x3e,
- 0x82, 0xb7, 0xf3, 0xbe, 0x9e, 0x49, 0x3d, 0x3e, 0x63, 0x13, 0x2e, 0xbe,
- 0xd3, 0xd8, 0xb6, 0xbc, 0x5e, 0x5e, 0x70, 0x3d, 0x46, 0xc3, 0x80, 0xbe,
- 0xb1, 0xf8, 0x58, 0x3e, 0xaa, 0x05, 0x38, 0xbf, 0x73, 0x5c, 0xce, 0xbd,
- 0x0a, 0x92, 0xcb, 0x3d, 0x41, 0x4f, 0x56, 0x3e, 0x62, 0xfe, 0xa0, 0xbe,
- 0xc8, 0xd9, 0xa9, 0x3d, 0xb2, 0x8b, 0x46, 0xbe, 0x04, 0x7f, 0x0f, 0xbf,
- 0x36, 0xe6, 0x0d, 0xbe, 0x81, 0x23, 0xa7, 0x3d, 0x02, 0xe9, 0xe0, 0xbd,
- 0x95, 0xf4, 0x61, 0xbe, 0xe6, 0x8d, 0x9f, 0x3e, 0x81, 0xb7, 0xc8, 0xbe,
- 0x67, 0x11, 0x8b, 0xbe, 0xf8, 0xf6, 0xa8, 0x3d, 0x36, 0x31, 0x3d, 0xbe,
- 0x24, 0x1b, 0x30, 0xbe, 0x96, 0x1d, 0x56, 0xbc, 0x92, 0x82, 0x8c, 0xbe,
- 0xda, 0xbb, 0xa5, 0xbe, 0xba, 0x0d, 0xe2, 0x3d, 0x27, 0x91, 0x0d, 0x3d,
- 0xbb, 0xb5, 0x8c, 0x3e, 0xd7, 0x59, 0xf3, 0xbe, 0x38, 0x68, 0x9d, 0x3d,
- 0x85, 0x05, 0x6e, 0x3e, 0x06, 0x70, 0x17, 0xbe, 0x15, 0x4e, 0x89, 0xbe,
- 0x6d, 0xcc, 0x0d, 0x3e, 0xb5, 0x0a, 0xe9, 0x3e, 0xea, 0xf9, 0x00, 0xbe,
- 0xeb, 0xe5, 0x28, 0xbe, 0x3f, 0x3a, 0xcc, 0xbd, 0xa5, 0xc9, 0x48, 0x3e,
- 0xb3, 0x30, 0x86, 0x3e, 0x99, 0x7b, 0x97, 0xbe, 0x6d, 0x0e, 0x10, 0xbe,
- 0x94, 0xa9, 0x0c, 0x3c, 0x88, 0x55, 0x97, 0xbc, 0x95, 0x7f, 0x91, 0xbe,
- 0xbb, 0xa5, 0x54, 0xbd, 0x0b, 0x60, 0x3d, 0xbe, 0x09, 0xea, 0xea, 0x3d,
- 0x98, 0x45, 0x41, 0x3e, 0xfa, 0x15, 0xcd, 0x3d, 0xd7, 0xd6, 0x9f, 0xbe,
- 0x94, 0x6e, 0x17, 0xbf, 0x95, 0x4b, 0xac, 0xbc, 0x3f, 0x22, 0xdb, 0xbd,
- 0x72, 0x6b, 0xd4, 0xbe, 0x5a, 0x2e, 0xb5, 0xbe, 0xe0, 0x95, 0x13, 0xbe,
- 0x56, 0x35, 0x65, 0x3e, 0x4c, 0x56, 0x39, 0xbf, 0x71, 0xaa, 0x6e, 0xbe,
- 0xba, 0x4d, 0x6e, 0x3c, 0x74, 0xb7, 0xac, 0xbc, 0xe1, 0xc5, 0xb2, 0xbe,
- 0xa6, 0xb2, 0xee, 0x3d, 0xb2, 0x3b, 0x12, 0x3e, 0xc5, 0xe5, 0x05, 0xbe,
- 0x40, 0x95, 0x85, 0xbd, 0x79, 0x4c, 0x5d, 0xbf, 0xa8, 0xac, 0x22, 0xbf,
- 0xe8, 0x80, 0x55, 0xbe, 0xe9, 0xb7, 0x47, 0x3e, 0x68, 0x6a, 0x9d, 0x3d,
- 0xee, 0x2a, 0x95, 0xbd, 0x08, 0x75, 0x15, 0xbe, 0xa8, 0xc9, 0x24, 0x3d,
- 0xf6, 0xbd, 0x46, 0xbe, 0x68, 0x6f, 0x83, 0xbe, 0x0b, 0xed, 0x0e, 0x3e,
- 0xea, 0x87, 0x99, 0xbe, 0x2f, 0x60, 0x94, 0xbe, 0xec, 0x06, 0xa0, 0xbe,
- 0xf3, 0xd0, 0x06, 0x3e, 0xe1, 0xfd, 0x38, 0xbe, 0xa3, 0x6f, 0x66, 0xbe,
- 0x5a, 0x74, 0xb9, 0x3d, 0xa0, 0x87, 0xc2, 0xbd, 0xa0, 0x29, 0x97, 0xbd,
- 0x0f, 0x90, 0x66, 0x3e, 0xda, 0xfe, 0xc3, 0x3d, 0x6c, 0x2c, 0xb1, 0x3e,
- 0x2f, 0x54, 0x3a, 0x3b, 0xd3, 0x68, 0x30, 0xbd, 0x73, 0x8e, 0x16, 0xbf,
- 0x0c, 0xcd, 0x8f, 0x3d, 0x25, 0xda, 0x00, 0xbe, 0xdd, 0x58, 0x18, 0xbd,
- 0x36, 0xb8, 0x94, 0x3e, 0x96, 0xc0, 0xbc, 0x3d, 0x82, 0x1c, 0x61, 0x3e,
- 0xe1, 0xff, 0x58, 0xbe, 0x4c, 0x50, 0x17, 0xbf, 0xe4, 0x58, 0xe5, 0xbe,
- 0x75, 0x30, 0x13, 0x3e, 0x9f, 0xe0, 0x6f, 0xbe, 0x72, 0x00, 0x5e, 0xbe,
- 0x24, 0x4c, 0xf9, 0x3d, 0x1a, 0xb4, 0xa8, 0xbd, 0xbf, 0xcf, 0x23, 0xbe,
- 0xf9, 0x13, 0x15, 0x3e, 0xbf, 0x23, 0xb7, 0xbc, 0xab, 0x14, 0x84, 0xbe,
- 0x37, 0xb2, 0x98, 0x3e, 0x7c, 0x81, 0xd1, 0x3e, 0x0f, 0x63, 0x50, 0xbe,
- 0x48, 0xdf, 0xb8, 0xbd, 0xd9, 0xaa, 0x49, 0xbe, 0x05, 0x1a, 0x84, 0xbd,
- 0xc8, 0x52, 0x89, 0xbe, 0x65, 0xc2, 0x46, 0x3e, 0x50, 0x81, 0xd9, 0xbd,
- 0xdf, 0xeb, 0xe3, 0xbe, 0x4b, 0xd0, 0x22, 0x3e, 0xed, 0xf0, 0x98, 0xbd,
- 0x88, 0x6f, 0x96, 0x3e, 0x54, 0x91, 0x0e, 0x3e, 0x88, 0xb0, 0xac, 0xbe,
- 0xd9, 0x21, 0x5d, 0xbe, 0x86, 0x4f, 0x89, 0x3e, 0xc6, 0xdc, 0x15, 0xbe,
- 0xbb, 0xba, 0x19, 0x3f, 0x91, 0x63, 0x1e, 0xbf, 0x2b, 0x11, 0xd5, 0x3e,
- 0x4b, 0x6a, 0xb9, 0xbc, 0x2f, 0xb2, 0x4c, 0xbe, 0xd6, 0xf7, 0x84, 0x3d,
- 0x90, 0xff, 0x9b, 0xbe, 0x58, 0x5e, 0xb0, 0x3e, 0x16, 0x95, 0xd7, 0x3e,
- 0xe7, 0x85, 0x47, 0x3e, 0xd4, 0x08, 0x5b, 0xbd, 0xc0, 0x3d, 0x86, 0xbb,
- 0x23, 0x78, 0x29, 0xbe, 0x01, 0x79, 0x8b, 0xbe, 0x61, 0xef, 0x99, 0x3c,
- 0x6b, 0xf1, 0x89, 0xbd, 0xee, 0xc7, 0x18, 0x3e, 0xd6, 0xac, 0x9d, 0x3e,
- 0x66, 0x74, 0x10, 0xbd, 0xee, 0xa1, 0x82, 0xbd, 0x94, 0xce, 0xe0, 0x3d,
- 0xe8, 0xab, 0x25, 0xbe, 0xb2, 0x47, 0x78, 0xbe, 0x2a, 0x7e, 0x6d, 0xbe,
- 0x6d, 0x83, 0x0f, 0xbe, 0xe5, 0xb6, 0x6b, 0x3e, 0x90, 0x23, 0xee, 0xbe,
- 0x1e, 0x06, 0xde, 0xbe, 0x19, 0x1c, 0x18, 0x3f, 0xa6, 0xed, 0x48, 0xbf,
- 0xec, 0xcb, 0x67, 0x3e, 0x57, 0xff, 0xd4, 0xbe, 0xbb, 0xd5, 0x0c, 0xbe,
- 0x32, 0xba, 0xe9, 0x3b, 0x9b, 0x67, 0x0b, 0x3f, 0x06, 0x19, 0x59, 0xbd,
- 0x5d, 0x6c, 0x2f, 0x3b, 0x90, 0x6c, 0x72, 0x3d, 0xd5, 0xb9, 0xbe, 0xbe,
- 0xfd, 0x0d, 0x9d, 0xbe, 0xee, 0xa2, 0x34, 0x3f, 0x5f, 0x5f, 0x81, 0xbe,
- 0xfe, 0x14, 0x05, 0xbe, 0x24, 0xc9, 0x9f, 0x3e, 0x76, 0xaf, 0xc8, 0x3e,
- 0xf0, 0x3b, 0x95, 0xbd, 0x6e, 0x6f, 0x8f, 0x3d, 0x71, 0x01, 0xab, 0xbe,
- 0x1e, 0x3a, 0x78, 0xbd, 0xce, 0x38, 0xfb, 0x3d, 0xb8, 0x76, 0xf3, 0xbe,
- 0xa3, 0x49, 0x51, 0x3e, 0xb7, 0xfa, 0xf2, 0x3e, 0xb6, 0x6a, 0x1e, 0xbf,
- 0xbc, 0x76, 0x9f, 0xbe, 0x2c, 0xc4, 0x11, 0xbf, 0x03, 0x5a, 0x63, 0xbe,
- 0x7e, 0xbc, 0xc3, 0xbd, 0x58, 0x14, 0x1b, 0xbf, 0xce, 0x0f, 0x33, 0xbf,
- 0xd4, 0x73, 0x26, 0x3f, 0xd7, 0x0e, 0x67, 0x3d, 0xda, 0x4e, 0xc8, 0xbe,
- 0x09, 0x13, 0x90, 0xbe, 0x90, 0x46, 0xf9, 0xbe, 0x56, 0x72, 0xca, 0xbe,
- 0xf5, 0x4e, 0xc4, 0xbe, 0x96, 0x84, 0xcc, 0x3e, 0xb2, 0x30, 0xac, 0xbe,
- 0x17, 0x07, 0x62, 0xbc, 0x93, 0x3f, 0x2b, 0xbe, 0xf5, 0x79, 0x82, 0xbe,
- 0xc6, 0xe1, 0x02, 0xbd, 0x69, 0x2c, 0x27, 0x3f, 0xa1, 0xfd, 0xc8, 0xbe,
- 0xcc, 0x93, 0x48, 0xbe, 0xdc, 0xb8, 0x33, 0xbe, 0x96, 0xef, 0x7b, 0xbe,
- 0xc7, 0x02, 0xa7, 0xbe, 0xfe, 0x9a, 0x42, 0xbe, 0x22, 0x29, 0xe6, 0x3e,
- 0xac, 0x8a, 0xb3, 0xbe, 0x23, 0xbe, 0xce, 0xbe, 0xdf, 0xe9, 0x6b, 0xbe,
- 0xe7, 0x9d, 0xdf, 0x3e, 0xa9, 0x1b, 0x86, 0xbe, 0x6a, 0xc9, 0xba, 0x3e,
- 0x57, 0x4f, 0x78, 0xbf, 0x63, 0x86, 0xd3, 0xbe, 0x7d, 0x7b, 0x22, 0xbf,
- 0x2d, 0x99, 0xc9, 0x3d, 0x1d, 0x93, 0x2c, 0x3e, 0x7c, 0x22, 0xe0, 0x3c,
- 0xa8, 0xad, 0x04, 0xbf, 0xe0, 0xf1, 0x72, 0xbd, 0x4c, 0xe3, 0x5c, 0x3e,
- 0x41, 0xaa, 0xc3, 0xbe, 0x7b, 0x4f, 0x3b, 0xbd, 0xcc, 0xdb, 0x73, 0xbd,
- 0xd3, 0xad, 0x98, 0x3e, 0x08, 0x6e, 0xde, 0xbe, 0x9b, 0x88, 0xd5, 0xbc,
- 0x57, 0x5b, 0x2b, 0xbf, 0x93, 0x74, 0x82, 0xbe, 0x2f, 0x70, 0xf5, 0xbc,
- 0x40, 0xf9, 0x3b, 0x3e, 0xdb, 0x16, 0x62, 0xbd, 0xae, 0x90, 0x92, 0xbe,
- 0xc1, 0xc6, 0xe3, 0xbe, 0x71, 0xf9, 0x54, 0x3e, 0x98, 0xed, 0x1f, 0xbe,
- 0x68, 0xee, 0x8f, 0xbe, 0x1d, 0x63, 0xfd, 0xbd, 0x8e, 0x3b, 0x5e, 0x3d,
- 0x18, 0x5b, 0xaa, 0xbd, 0x62, 0x90, 0x8b, 0x3d, 0xfb, 0x79, 0x54, 0xbd,
- 0x3e, 0x27, 0x0a, 0xbf, 0x4c, 0x76, 0x83, 0x3e, 0x05, 0x63, 0x25, 0x3e,
- 0x43, 0xbb, 0x57, 0xbe, 0x96, 0x32, 0x9b, 0x3d, 0xbb, 0x47, 0x92, 0x3d,
- 0x40, 0x3b, 0x3f, 0x3e, 0x53, 0xdd, 0x03, 0x3e, 0x4e, 0xe4, 0x86, 0xbe,
- 0xfe, 0x56, 0xef, 0xbd, 0xc5, 0xf8, 0xd9, 0xbe, 0x14, 0x3e, 0x40, 0xbe,
- 0x09, 0xca, 0x85, 0x3d, 0xa7, 0x59, 0xa1, 0x3c, 0xa2, 0x08, 0x4e, 0xbd,
- 0x25, 0x23, 0xe6, 0xbb, 0xe7, 0x1b, 0xe8, 0xbd, 0xf9, 0xea, 0x0c, 0x3d,
- 0x81, 0x28, 0xd4, 0xbe, 0x68, 0xea, 0x09, 0xbb, 0xde, 0x2e, 0x1d, 0x3e,
- 0xf5, 0xeb, 0xeb, 0xbe, 0x62, 0x55, 0xbf, 0xbe, 0xa8, 0xcd, 0x6f, 0x3e,
- 0x55, 0xaf, 0xd1, 0xbc, 0x8e, 0x3f, 0x9f, 0xbe, 0xdf, 0x55, 0x85, 0xbd,
- 0xc6, 0x8e, 0x64, 0xbd, 0x35, 0xf8, 0x46, 0xbe, 0x21, 0xd6, 0x05, 0xbf,
- 0x96, 0x1b, 0x90, 0x3e, 0x8a, 0x48, 0x2e, 0xbf, 0x11, 0xef, 0xc5, 0xbe,
- 0x5e, 0xfe, 0x1f, 0xbf, 0x13, 0xcb, 0xb8, 0x3d, 0x39, 0xa8, 0x2a, 0xbe,
- 0x1c, 0x4c, 0xc9, 0xbe, 0xb3, 0xa0, 0xad, 0xbe, 0x6c, 0xa7, 0xbd, 0xbe,
- 0x05, 0x8a, 0x09, 0x3e, 0x79, 0x7d, 0xc3, 0xbd, 0xda, 0xbd, 0x40, 0xbf,
- 0xb5, 0x75, 0xd7, 0xbc, 0xf3, 0xa8, 0xc7, 0x3e, 0xc6, 0x78, 0x8a, 0x3d,
- 0xa3, 0x61, 0x79, 0x3e, 0x6e, 0x45, 0xd1, 0x3e, 0xd3, 0xff, 0x9e, 0x3d,
- 0xba, 0xca, 0xc7, 0xbd, 0x6d, 0xa8, 0x5f, 0xbe, 0x15, 0xf2, 0xb9, 0x3e,
- 0x46, 0x81, 0xb7, 0xbd, 0xa3, 0x65, 0xbf, 0xbe, 0xf7, 0x50, 0xe7, 0xbe,
- 0x46, 0x90, 0xab, 0xbd, 0xc7, 0x5f, 0x09, 0x3f, 0x11, 0x78, 0xb2, 0xbc,
- 0x8b, 0x12, 0xb1, 0xbe, 0x25, 0x88, 0x79, 0xbe, 0x76, 0xad, 0xac, 0x3e,
- 0x81, 0xcf, 0x13, 0xbf, 0x3f, 0x4f, 0x1e, 0x3e, 0x92, 0x30, 0x23, 0x3e,
- 0xbc, 0x21, 0xeb, 0xbe, 0xa1, 0x5a, 0x17, 0x3e, 0x89, 0x93, 0xc3, 0x3e,
- 0x4b, 0x78, 0x9e, 0xbd, 0xa6, 0x02, 0xe2, 0x3d, 0x87, 0xe4, 0x78, 0xbe,
- 0xa5, 0x9b, 0x3b, 0xbe, 0xa7, 0x2a, 0xf0, 0xbe, 0xb0, 0x5a, 0xda, 0xbe,
- 0x19, 0xfe, 0x0d, 0xbd, 0xd4, 0x74, 0x16, 0x3e, 0xbe, 0x6d, 0xea, 0x3d,
- 0xb9, 0xe6, 0xb9, 0x3e, 0xd3, 0x39, 0xdb, 0xbd, 0xa5, 0x43, 0x81, 0xbe,
- 0xb4, 0x5a, 0xa8, 0x3e, 0xba, 0x6f, 0x1d, 0xba, 0x34, 0xac, 0x44, 0x3e,
- 0x71, 0x2e, 0x67, 0xbe, 0xee, 0x20, 0xbd, 0xbe, 0xbd, 0x67, 0x01, 0x3e,
- 0x15, 0xd2, 0x35, 0xbe, 0xe6, 0xe6, 0x31, 0xbf, 0xae, 0x33, 0x7c, 0xbe,
- 0x60, 0x20, 0x3e, 0x3d, 0x60, 0x14, 0x54, 0x3e, 0x6f, 0xfc, 0x7d, 0x3d,
- 0x65, 0xd2, 0x96, 0xbe, 0xf2, 0x3d, 0x83, 0x3e, 0x48, 0x6b, 0x9d, 0x3e,
- 0xb9, 0xbd, 0x17, 0x3e, 0xe9, 0x93, 0xf9, 0x3d, 0xad, 0xf7, 0x7b, 0x3e,
- 0x10, 0x8b, 0x34, 0xbe, 0x7a, 0x24, 0x28, 0x3e, 0x4b, 0x89, 0x1b, 0x3e,
- 0xf2, 0xce, 0x4f, 0x3e, 0xb3, 0x6c, 0x41, 0x3e, 0xb6, 0xdb, 0x82, 0x3e,
- 0x9e, 0x5c, 0xa4, 0xbe, 0x24, 0x70, 0x21, 0xbf, 0x48, 0x50, 0xed, 0xbe,
- 0x43, 0xb0, 0x8b, 0xbd, 0x5e, 0x04, 0x55, 0xbd, 0xf6, 0x70, 0x20, 0x3d,
- 0x90, 0x0f, 0x9c, 0x3d, 0x44, 0x99, 0x47, 0xbe, 0x6d, 0xcd, 0x5f, 0xbe,
- 0xc1, 0xcf, 0x19, 0xbd, 0xf1, 0x1e, 0x84, 0x3e, 0x68, 0x94, 0x09, 0xbf,
- 0xae, 0x9e, 0x9b, 0x3e, 0x86, 0x97, 0x01, 0x3e, 0x21, 0xc1, 0x49, 0x3e,
- 0x81, 0xb9, 0x34, 0xbe, 0x05, 0x0d, 0x90, 0xbe, 0xf6, 0xb8, 0x94, 0xbe,
- 0xc1, 0x9e, 0x10, 0xbe, 0xb0, 0x30, 0x0a, 0x3d, 0xc7, 0xfc, 0x54, 0xbe,
- 0x83, 0xad, 0x63, 0xbe, 0x23, 0x06, 0x04, 0xbf, 0x1b, 0x4d, 0x81, 0xbe,
- 0x40, 0x59, 0x4e, 0xbe, 0x72, 0x84, 0x38, 0x3e, 0x35, 0x71, 0x6e, 0xbb,
- 0x3f, 0xc0, 0x9a, 0x3d, 0xe3, 0x11, 0x5d, 0x3e, 0xb8, 0xfc, 0xcd, 0x3d,
- 0x63, 0x3c, 0xf9, 0x3d, 0x36, 0x43, 0x20, 0x3e, 0xee, 0xd9, 0x6b, 0x3e,
- 0x71, 0xdf, 0x14, 0x3d, 0x6b, 0x2c, 0x45, 0xbe, 0xbf, 0xcf, 0x5e, 0x3e,
- 0xf1, 0x6c, 0xbb, 0xbe, 0x7b, 0x94, 0x8b, 0x3d, 0x41, 0xa6, 0xb8, 0xbd,
- 0x3c, 0x30, 0x80, 0x3d, 0x7f, 0xc9, 0x6d, 0xbe, 0xdd, 0x70, 0x41, 0xbf,
- 0x2c, 0xc3, 0xe2, 0x3e, 0x28, 0xbb, 0xa5, 0x3c, 0x00, 0x0e, 0x37, 0xbd,
- 0xfe, 0x6b, 0x72, 0xbe, 0x55, 0x8b, 0xec, 0x3d, 0x86, 0x6e, 0x4b, 0x3d,
- 0x8c, 0x98, 0x3b, 0x3e, 0x28, 0xa1, 0x89, 0x3e, 0xee, 0xe3, 0xc0, 0x3e,
- 0x25, 0xb8, 0x06, 0x3e, 0x21, 0x26, 0x7b, 0x3e, 0x69, 0xee, 0x81, 0x3d,
- 0x59, 0x71, 0x87, 0x3e, 0x1e, 0x0e, 0xc8, 0xbe, 0x1e, 0x38, 0xe5, 0x3d,
- 0x49, 0x9f, 0xd1, 0x3e, 0x89, 0xfe, 0x96, 0xbe, 0x2e, 0x36, 0x40, 0xbe,
- 0x04, 0x9b, 0x8e, 0xbc, 0x2e, 0x72, 0x07, 0xbe, 0xd1, 0xa0, 0x58, 0x3d,
- 0xb4, 0xdf, 0x89, 0xbe, 0xeb, 0xb1, 0xb3, 0xbe, 0x21, 0x89, 0x91, 0xbe,
- 0x05, 0xfe, 0x6f, 0xbc, 0x18, 0xc9, 0x83, 0x3e, 0x1f, 0x35, 0x55, 0xbf,
- 0xda, 0x3b, 0xe2, 0xbe, 0x2b, 0xed, 0x33, 0xbe, 0x27, 0xe7, 0x9d, 0x3d,
- 0xce, 0x90, 0x98, 0xbe, 0xb0, 0xbb, 0x77, 0x3d, 0xab, 0x8e, 0xa4, 0xbd,
- 0x54, 0x7c, 0xf0, 0x3d, 0xcc, 0xc2, 0x21, 0xbf, 0xc8, 0xf0, 0x02, 0xbe,
- 0x95, 0x6b, 0x64, 0xbe, 0xc1, 0xfa, 0xbb, 0xbe, 0x37, 0x1a, 0x4b, 0x3e,
- 0xb4, 0xcb, 0x20, 0xbe, 0x1e, 0xc3, 0x78, 0xbe, 0xd5, 0x1a, 0xc7, 0xbe,
- 0x61, 0xc6, 0xab, 0xbe, 0xb2, 0x7f, 0x76, 0x3d, 0x6f, 0xeb, 0x62, 0xbe,
- 0x68, 0x6b, 0xe3, 0xbe, 0x48, 0x33, 0x0a, 0xbd, 0xdb, 0xcc, 0x6d, 0xbd,
- 0x53, 0x36, 0xff, 0xbd, 0xfe, 0xa4, 0x92, 0x3d, 0x38, 0x08, 0x1b, 0xbf,
- 0xa4, 0x51, 0xbc, 0x3d, 0x04, 0x30, 0xa9, 0x3d, 0x6a, 0x74, 0x12, 0xbf,
- 0xf1, 0x01, 0xec, 0x3e, 0xdd, 0x82, 0x85, 0xbd, 0x14, 0x85, 0x82, 0xbc,
- 0x97, 0xd6, 0xd8, 0xbe, 0xab, 0x17, 0x45, 0x3e, 0x0b, 0x9e, 0x54, 0xbe,
- 0xf0, 0xa1, 0xf4, 0xbe, 0xdb, 0x88, 0x2a, 0xbd, 0xd6, 0x1e, 0x21, 0xbe,
- 0xa1, 0x32, 0x9b, 0x3d, 0x82, 0xc0, 0xbe, 0x3d, 0x1e, 0x61, 0x5c, 0x3c,
- 0xff, 0xdc, 0x9a, 0xbe, 0x4c, 0x52, 0x54, 0xbe, 0x66, 0xf5, 0x99, 0xbe,
- 0xb2, 0x60, 0x8e, 0xbd, 0x89, 0x13, 0x6a, 0xbe, 0x2c, 0x6b, 0x18, 0xbc,
- 0xae, 0x27, 0x80, 0xbe, 0x20, 0xaf, 0xf5, 0x3c, 0x6a, 0xba, 0xa4, 0xbe,
- 0xe5, 0x07, 0x1a, 0x3e, 0x26, 0x31, 0x14, 0x3e, 0x8c, 0xf2, 0xa5, 0xbe,
- 0xb8, 0x5e, 0x0d, 0x3d, 0x62, 0xe5, 0x14, 0x3e, 0x13, 0xf6, 0x08, 0xbe,
- 0x98, 0xe9, 0x17, 0x3e, 0xc2, 0x4c, 0x2b, 0xbe, 0xcd, 0x14, 0x68, 0xbe,
- 0x9d, 0xc9, 0xa2, 0xbd, 0x3d, 0x2e, 0xa8, 0xbe, 0xce, 0xa5, 0x73, 0xbe,
- 0x06, 0x93, 0x07, 0x3e, 0x22, 0x7d, 0xb8, 0x3e, 0x30, 0xb0, 0x4e, 0xbe,
- 0xc5, 0x8e, 0xc6, 0xbe, 0xc3, 0xdd, 0xa3, 0xbd, 0xe8, 0xcb, 0x93, 0x3e,
- 0xd1, 0x58, 0x26, 0x3e, 0x10, 0x3f, 0x01, 0xbe, 0x5b, 0x79, 0x4c, 0x3e,
- 0xc3, 0xba, 0x6f, 0x3d, 0x5c, 0x3a, 0xaf, 0x3d, 0x8b, 0x14, 0x43, 0xbe,
- 0x13, 0xb4, 0x31, 0xbe, 0xfd, 0x02, 0xb0, 0xbe, 0x21, 0x73, 0x35, 0xbe,
- 0xdb, 0xbd, 0x69, 0x3e, 0x58, 0xb6, 0xb7, 0xbd, 0xb3, 0xf8, 0xf3, 0xbc,
- 0x24, 0xd7, 0x2e, 0xbe, 0x76, 0x24, 0xc6, 0x3d, 0xc4, 0xc8, 0x69, 0x3d,
- 0xea, 0xc9, 0x80, 0xbe, 0x2d, 0x7f, 0xaf, 0x3d, 0xe8, 0x27, 0xe5, 0xbc,
- 0xb6, 0x5d, 0x88, 0x3e, 0x1f, 0xb0, 0x37, 0x3e, 0xe8, 0xb5, 0xc7, 0xbe,
- 0xa2, 0x92, 0x80, 0xbe, 0xbb, 0xd8, 0x86, 0x3c, 0xb8, 0x3a, 0xd5, 0xbd,
- 0x22, 0x00, 0x74, 0x3e, 0x20, 0x42, 0xd7, 0x3d, 0x82, 0x06, 0x58, 0x3d,
- 0x38, 0x88, 0xda, 0xbe, 0x02, 0x1f, 0x00, 0xbf, 0x56, 0x5b, 0x95, 0xbf,
- 0x21, 0x97, 0x9d, 0xbe, 0x0a, 0x91, 0xb7, 0xbe, 0x24, 0x8c, 0x22, 0xbf,
- 0xa6, 0x09, 0xad, 0x3b, 0x60, 0x1d, 0x21, 0x3e, 0x9d, 0x96, 0xc3, 0x3d,
- 0x84, 0xe3, 0x25, 0xbe, 0xc0, 0xda, 0xbc, 0xbe, 0x3d, 0x1c, 0xb3, 0xbe,
- 0xe7, 0x48, 0x72, 0xbc, 0x2d, 0x65, 0x06, 0xbe, 0x28, 0x1f, 0x86, 0x3c,
- 0x5e, 0xc4, 0xa0, 0xbd, 0xdd, 0xb5, 0xf2, 0xbc, 0x7d, 0xf9, 0xa1, 0xbe,
- 0xa7, 0xb7, 0x99, 0x3d, 0xc9, 0x40, 0x31, 0x3e, 0x3b, 0x25, 0x67, 0xbf,
- 0x72, 0x78, 0x5b, 0x3d, 0xa8, 0x36, 0x53, 0x3e, 0x1a, 0xa8, 0xca, 0x3e,
- 0x54, 0x60, 0x81, 0xbd, 0x84, 0x35, 0x65, 0x3d, 0x29, 0x30, 0xa5, 0xbe,
- 0x80, 0x11, 0x22, 0xbf, 0xfa, 0xef, 0xe1, 0x3d, 0x8f, 0x09, 0x95, 0x3e,
- 0x17, 0xfa, 0xf8, 0xbd, 0x5f, 0x9c, 0x8a, 0xbe, 0x1a, 0x20, 0x22, 0x3e,
- 0x69, 0x68, 0x9f, 0x3e, 0x1a, 0x80, 0x1d, 0x3d, 0xba, 0xf9, 0x85, 0x3d,
- 0xb2, 0x7e, 0x1e, 0xbf, 0xb8, 0xcb, 0xc4, 0xbd, 0xd3, 0xe5, 0xc2, 0xbb,
- 0xe7, 0x5f, 0x04, 0x3e, 0x35, 0x03, 0x82, 0xbd, 0xa9, 0x70, 0x8b, 0x3e,
- 0x23, 0x2f, 0xcb, 0x3d, 0x11, 0xbe, 0x59, 0xbe, 0xa2, 0xef, 0x96, 0x3c,
- 0x2c, 0x7a, 0x95, 0x3e, 0x6b, 0x36, 0xbf, 0xbd, 0xb4, 0x0d, 0xee, 0xbe,
- 0x3e, 0x64, 0x87, 0xbe, 0xf0, 0x72, 0x94, 0xbe, 0x0b, 0xac, 0x86, 0xbd,
- 0x34, 0x1c, 0x61, 0x3c, 0x19, 0x5e, 0x73, 0x3d, 0xf6, 0x9c, 0x88, 0xbe,
- 0xd1, 0x40, 0x56, 0xbe, 0xdf, 0x9e, 0xfb, 0xbd, 0x34, 0x2a, 0xc0, 0x3d,
- 0x03, 0x3b, 0xbf, 0xbe, 0x10, 0xd9, 0x0a, 0xbf, 0xb3, 0xe7, 0x8b, 0xbc,
- 0xb1, 0xa5, 0x85, 0xbe, 0x91, 0xcb, 0x89, 0xbe, 0x28, 0xc1, 0x8f, 0xbf,
- 0x14, 0x7d, 0xc3, 0x3d, 0xa0, 0x62, 0xaf, 0xbe, 0xaa, 0x26, 0xae, 0x3e,
- 0xc4, 0x08, 0xb8, 0xbc, 0x28, 0xab, 0xf7, 0xbd, 0x89, 0x0b, 0x2b, 0xbe,
- 0xb2, 0x3e, 0xf7, 0x3c, 0xa8, 0x9e, 0x15, 0xbf, 0xbf, 0xba, 0x97, 0x3e,
- 0x00, 0xdb, 0x73, 0x3c, 0x0b, 0x7f, 0xab, 0x3e, 0x13, 0x88, 0xf7, 0xbe,
- 0xf7, 0x88, 0x2e, 0x3e, 0xb5, 0x34, 0xbe, 0x3d, 0xfb, 0x0c, 0x4e, 0xbe,
- 0x41, 0x2a, 0xc1, 0xba, 0xf9, 0x27, 0x59, 0x3e, 0xeb, 0xc2, 0x85, 0xbe,
- 0x18, 0xc9, 0x14, 0xbe, 0x29, 0x3e, 0x0a, 0x3e, 0xd8, 0x15, 0x2f, 0x3e,
- 0xc3, 0x1e, 0x06, 0xbd, 0x61, 0x91, 0x8b, 0xbe, 0x5c, 0x13, 0x6d, 0x3e,
- 0xde, 0x2f, 0x89, 0x3e, 0x02, 0xd1, 0x86, 0xbe, 0xb7, 0xa0, 0x63, 0x3e,
- 0xad, 0x8b, 0xcf, 0xbe, 0x84, 0x74, 0x9e, 0xbe, 0xc5, 0x93, 0x43, 0x3e,
- 0x87, 0x84, 0x50, 0xbd, 0x59, 0x66, 0x11, 0xbf, 0x02, 0x38, 0x3b, 0x3e,
- 0x3d, 0x0b, 0x17, 0xbe, 0xb4, 0x0e, 0x8c, 0x3e, 0x86, 0x27, 0xbf, 0xbe,
- 0x70, 0x9d, 0xb8, 0x3c, 0x68, 0xb9, 0x6c, 0xbe, 0x28, 0x3d, 0x51, 0x3d,
- 0x5e, 0xad, 0x15, 0xbf, 0x08, 0x5d, 0x3a, 0xbe, 0xcb, 0x93, 0x1f, 0x3e,
- 0x0f, 0xc5, 0x0a, 0x3e, 0x52, 0x55, 0xeb, 0xbe, 0x9b, 0x3a, 0x29, 0xbe,
- 0x3e, 0xb9, 0xb4, 0xbe, 0xc2, 0x42, 0x5a, 0xbd, 0x21, 0x54, 0x06, 0xbd,
- 0xa5, 0x42, 0xa3, 0x3d, 0xeb, 0x92, 0x86, 0xbd, 0xbc, 0x51, 0xb2, 0x3d,
- 0x8f, 0xa8, 0x9e, 0x3d, 0x82, 0x69, 0x47, 0xbe, 0x36, 0xd9, 0xe0, 0x3c,
- 0x54, 0xd4, 0x6f, 0x3c, 0x93, 0x4d, 0xd0, 0x3d, 0x45, 0x18, 0xf9, 0xbe,
- 0x2a, 0xd1, 0xa7, 0xbe, 0xcb, 0x47, 0x87, 0xbe, 0x10, 0xbc, 0x86, 0xbb,
- 0x32, 0x2e, 0xea, 0xbe, 0x45, 0xf1, 0x7e, 0xbe, 0x51, 0xc7, 0x87, 0x3d,
- 0xeb, 0xe4, 0xd9, 0xbe, 0xe4, 0x43, 0x35, 0x3e, 0xb7, 0x1e, 0xd0, 0xbd,
- 0x50, 0x94, 0xa7, 0xbe, 0x76, 0x92, 0xdf, 0xbd, 0x65, 0x7e, 0x9a, 0xbe,
- 0x69, 0x34, 0xa8, 0x3e, 0x52, 0xcc, 0x55, 0x3e, 0x94, 0xea, 0x43, 0xbe,
- 0x5d, 0x8e, 0x11, 0xbe, 0xd1, 0x48, 0xcb, 0xbe, 0x12, 0xca, 0x3d, 0xbf,
- 0xe1, 0x7a, 0xe0, 0x3d, 0x72, 0xa4, 0xa9, 0x3d, 0xb1, 0xee, 0xa1, 0xbe,
- 0x3e, 0xe0, 0x0e, 0x3d, 0xd6, 0xe2, 0x66, 0x3e, 0x3b, 0x20, 0x89, 0xbe,
- 0xf9, 0xd0, 0x22, 0x3d, 0x9e, 0x46, 0x80, 0xbe, 0xcf, 0xdd, 0x06, 0xbd,
- 0x37, 0x26, 0x81, 0x3d, 0xcb, 0xa8, 0x74, 0x3c, 0x72, 0xb7, 0xc5, 0x3c,
- 0xe0, 0x7b, 0x20, 0x3e, 0xb0, 0xda, 0x55, 0xbd, 0x2e, 0xbb, 0xa4, 0xbe,
- 0xbb, 0x17, 0x20, 0xbe, 0x86, 0x02, 0x80, 0xbe, 0x81, 0xb5, 0xd5, 0xbe,
- 0x59, 0xff, 0x1f, 0xbe, 0x66, 0x0f, 0x5c, 0xbd, 0x28, 0xf2, 0x7f, 0x3e,
- 0xd7, 0xa6, 0x9b, 0x3e, 0x88, 0x57, 0x43, 0xbd, 0xf8, 0xcd, 0x50, 0xbe,
- 0x30, 0x78, 0xd7, 0xbe, 0xdc, 0x92, 0x99, 0xbe, 0x0d, 0x5e, 0x40, 0xbe,
- 0x32, 0x82, 0x80, 0xbe, 0x6a, 0x76, 0x49, 0xbd, 0xa6, 0x88, 0xfa, 0xbd,
- 0xfa, 0x17, 0x9c, 0xbe, 0x2e, 0xaf, 0x43, 0xbe, 0xdb, 0x4a, 0x07, 0x3b,
- 0xa0, 0x0b, 0xee, 0xbd, 0xa5, 0x72, 0x14, 0x3e, 0xdd, 0x09, 0xaf, 0xbe,
- 0xc2, 0x11, 0x53, 0xbe, 0xe2, 0x9f, 0x4e, 0x3c, 0x6d, 0x0b, 0xd9, 0xbe,
- 0xfc, 0xa3, 0x40, 0x3e, 0x1f, 0x28, 0x5e, 0x3e, 0xf3, 0xbb, 0x30, 0x3e,
- 0xe7, 0x9a, 0xc0, 0xbe, 0x09, 0xc2, 0x82, 0xbe, 0xfe, 0x95, 0x71, 0xbe,
- 0xa4, 0xa4, 0x7f, 0x3e, 0x39, 0x91, 0xf7, 0x3d, 0x89, 0x99, 0x0a, 0xbf,
- 0x75, 0x4c, 0x39, 0xbd, 0x54, 0xc4, 0x3f, 0xbe, 0xe9, 0x28, 0xf6, 0xbe,
- 0x02, 0x6a, 0x01, 0x3e, 0xf9, 0x0b, 0x55, 0xbf, 0xb2, 0x07, 0xc5, 0xbe,
- 0x40, 0x2c, 0x17, 0xbc, 0x07, 0x59, 0xd9, 0xbc, 0x8f, 0x7a, 0x02, 0x3e,
- 0x39, 0xa7, 0x72, 0x3e, 0xe9, 0xa5, 0x0c, 0xbe, 0xbc, 0xd2, 0x33, 0xbe,
- 0x86, 0xbd, 0xce, 0xbe, 0x4c, 0xd6, 0xe3, 0x3e, 0xac, 0x31, 0x5e, 0x3c,
- 0xbd, 0xbb, 0x41, 0xbf, 0x03, 0xf3, 0x3b, 0x3c, 0xc2, 0xb6, 0xb7, 0x3b,
- 0x38, 0x8f, 0x95, 0xbc, 0x98, 0x3f, 0x81, 0x3c, 0xe0, 0xac, 0x62, 0x3e,
- 0xe8, 0x0d, 0x33, 0xbe, 0xc3, 0x21, 0x03, 0x3e, 0x55, 0x53, 0x80, 0xbe,
- 0x21, 0xb8, 0x46, 0x3e, 0x0e, 0x08, 0xba, 0xbe, 0x7e, 0x7e, 0x92, 0x3e,
- 0xe7, 0xf9, 0x7c, 0xbe, 0x05, 0x22, 0xbe, 0x3d, 0x94, 0x11, 0x29, 0xbe,
- 0xd1, 0x2f, 0xaa, 0x3e, 0xfd, 0x75, 0x0d, 0xbe, 0xe8, 0x05, 0x0c, 0xbf,
- 0xb9, 0x93, 0xff, 0xbb, 0x9e, 0x65, 0x1f, 0xbe, 0x6c, 0xeb, 0xe3, 0x3d,
- 0x29, 0xb1, 0x03, 0xbf, 0x71, 0xfb, 0x5d, 0xbd, 0x9b, 0xb0, 0x04, 0xbc,
- 0xaf, 0x21, 0x50, 0x3e, 0x7c, 0x5c, 0x53, 0xbd, 0xbe, 0x1d, 0xb0, 0x3d,
- 0x30, 0x84, 0x3f, 0x3e, 0x22, 0xce, 0x91, 0x3e, 0x1e, 0x4e, 0x4f, 0xba,
- 0xfb, 0x7e, 0x9f, 0xbd, 0x60, 0x6e, 0x11, 0xbe, 0x53, 0x39, 0x91, 0xbe,
- 0xe7, 0x7f, 0x3e, 0x3d, 0xad, 0x16, 0xc9, 0x3c, 0x90, 0x77, 0xb0, 0xbe,
- 0x7c, 0x06, 0xca, 0xbe, 0x3a, 0x6b, 0x2f, 0xbf, 0xfb, 0x0a, 0x73, 0xbe,
- 0xa4, 0x72, 0x50, 0x3e, 0xaf, 0xc0, 0xc5, 0xbe, 0x48, 0xd4, 0x07, 0xbf,
- 0x6c, 0x5c, 0x10, 0xbe, 0xe0, 0xb4, 0x07, 0x3f, 0xc1, 0xb9, 0xd3, 0xbe,
- 0x1c, 0x79, 0x72, 0x3e, 0xee, 0xd9, 0xc7, 0x3d, 0x52, 0x75, 0x68, 0xbe,
- 0x86, 0x4e, 0xbc, 0xbe, 0xfa, 0x2c, 0x53, 0x3e, 0x8f, 0x4d, 0x9e, 0xbe,
- 0xbf, 0x19, 0x51, 0x3e, 0x06, 0xf2, 0xd0, 0x3e, 0x95, 0x21, 0xc8, 0xbe,
- 0xb7, 0x7b, 0xf9, 0xbd, 0x9d, 0x3b, 0x85, 0x3e, 0x1d, 0x54, 0xa0, 0xbe,
- 0xd3, 0x60, 0xa2, 0x3d, 0xa8, 0x68, 0x47, 0xbe, 0xc7, 0xc5, 0xb3, 0xbe,
- 0x0a, 0x5e, 0xa0, 0xbe, 0x08, 0x55, 0x18, 0xbe, 0xb3, 0xdc, 0x04, 0x3f,
- 0x75, 0x9a, 0x22, 0x3d, 0x75, 0xfd, 0x2c, 0x3d, 0x4b, 0x7f, 0x12, 0x3e,
- 0x0b, 0xa0, 0xa9, 0xbe, 0x20, 0x3a, 0x65, 0xbd, 0x10, 0x62, 0x30, 0xbf,
- 0x38, 0x92, 0x3b, 0x3e, 0x72, 0xa3, 0x94, 0xbe, 0x5e, 0x9f, 0xb2, 0xbe,
- 0xf7, 0x4a, 0x15, 0xbe, 0x3c, 0xdf, 0x73, 0xbf, 0xb2, 0x78, 0xfa, 0x3d,
- 0x15, 0x79, 0x20, 0xbb, 0xc2, 0x01, 0xdd, 0xbd, 0x06, 0xc5, 0xb6, 0xbe,
- 0x7c, 0x02, 0xa3, 0xbe, 0xb5, 0x7c, 0x81, 0x3e, 0x14, 0x11, 0x15, 0x3d,
- 0x0c, 0x75, 0x40, 0x3e, 0x55, 0x87, 0xdc, 0xbe, 0xf4, 0xcb, 0x58, 0xbc,
- 0x41, 0xf9, 0xc5, 0xbe, 0xe7, 0xcd, 0xf9, 0xbd, 0x78, 0x42, 0x7b, 0xbd,
- 0x65, 0x9b, 0x10, 0x3f, 0x42, 0x2c, 0x0f, 0x3e, 0x5c, 0x1a, 0xc2, 0xbe,
- 0x4b, 0x9a, 0x8a, 0xbe, 0x20, 0xf5, 0xfc, 0xbe, 0x4e, 0x9e, 0xc9, 0x3e,
- 0x42, 0x83, 0x0c, 0x3f, 0x71, 0x99, 0x29, 0x3e, 0x3d, 0xe5, 0x5e, 0xbe,
- 0xbd, 0x26, 0x8b, 0xbf, 0xd7, 0xb5, 0x52, 0xbd, 0x80, 0xdb, 0x97, 0xbe,
- 0x0f, 0xa4, 0xc0, 0xbe, 0x4c, 0x44, 0xae, 0xbe, 0xaa, 0x0d, 0x87, 0xbe,
- 0x56, 0xca, 0x9e, 0x3e, 0x53, 0xf5, 0x92, 0x3e, 0x57, 0x44, 0x8e, 0xbe,
- 0x63, 0x5d, 0xa4, 0x3e, 0x87, 0xbd, 0xb2, 0xbe, 0x8e, 0x54, 0xd3, 0xbe,
- 0x81, 0xaf, 0x11, 0xbf, 0xf0, 0x66, 0x22, 0xbd, 0x87, 0x69, 0x61, 0x3c,
- 0xab, 0xfe, 0x1d, 0x3e, 0x73, 0x38, 0x4b, 0xbd, 0x36, 0xc8, 0x04, 0xbf,
- 0x80, 0xc0, 0x30, 0xbf, 0xd7, 0x11, 0x10, 0xbf, 0xe5, 0xfb, 0x92, 0x3e,
- 0xf7, 0x76, 0xe1, 0xbd, 0x09, 0x59, 0x0e, 0xbf, 0x5c, 0x51, 0xf7, 0x3e,
- 0x4c, 0x84, 0x9a, 0xbd, 0x15, 0x1b, 0x82, 0xbe, 0x2b, 0x00, 0xa4, 0x3d,
- 0xbe, 0xfd, 0x4c, 0xbd, 0x88, 0xa3, 0xc5, 0xbe, 0xb8, 0xa8, 0xb9, 0x3e,
- 0x29, 0x80, 0x14, 0xbe, 0xf8, 0xaa, 0xa5, 0x3d, 0xbe, 0xd1, 0xac, 0x3e,
- 0x5e, 0x0c, 0x06, 0xbd, 0xf4, 0x86, 0x81, 0x3c, 0xf7, 0x9c, 0x8e, 0x3e,
- 0x1a, 0xfb, 0xea, 0xbe, 0xf1, 0x4b, 0x85, 0x3e, 0xa5, 0x46, 0xa3, 0xbe,
- 0x98, 0x8b, 0xee, 0x3d, 0x49, 0x1c, 0xc5, 0xbe, 0x9e, 0x3d, 0xb2, 0xbd,
- 0x7a, 0x02, 0xbb, 0xbc, 0x50, 0xe9, 0xaa, 0xbe, 0x3f, 0xdd, 0x6e, 0x3e,
- 0xba, 0xc2, 0x87, 0xbe, 0xe8, 0xf2, 0xed, 0xbe, 0x73, 0x66, 0xed, 0x3e,
- 0x44, 0xcf, 0x7c, 0xbc, 0x32, 0x21, 0x83, 0x3e, 0x81, 0x66, 0x2b, 0x3e,
- 0xab, 0xe3, 0x92, 0xbe, 0xb3, 0x84, 0x2b, 0xbd, 0x7e, 0xe4, 0x38, 0xbd,
- 0x3a, 0xec, 0xe1, 0x3d, 0x2b, 0x3c, 0xe9, 0xbd, 0x33, 0xf0, 0xc1, 0xbe,
- 0x02, 0x93, 0xb9, 0xbd, 0x43, 0x06, 0xb4, 0x3c, 0x9f, 0x8f, 0xe0, 0x3d,
- 0x2d, 0xd3, 0x47, 0x3e, 0xea, 0x44, 0xee, 0xbe, 0xa7, 0x81, 0x2b, 0xbe,
- 0x02, 0x04, 0x9b, 0xbe, 0x94, 0x25, 0xff, 0x3d, 0x1f, 0x26, 0xd9, 0xbe,
- 0x34, 0x36, 0xa0, 0x3e, 0x39, 0x8a, 0x22, 0xbe, 0xbc, 0x8f, 0xa9, 0x3e,
- 0xc4, 0x74, 0x83, 0xbe, 0x5f, 0xc2, 0xb2, 0x3e, 0x51, 0x39, 0x15, 0xbd,
- 0xef, 0xf6, 0xd5, 0xbe, 0xa2, 0xdf, 0xe4, 0x3e, 0x3c, 0x33, 0x99, 0x3e,
- 0x8b, 0x98, 0xdb, 0xbd, 0x2d, 0xb3, 0xe9, 0xbe, 0x04, 0xde, 0x48, 0xbf,
- 0x26, 0x41, 0x26, 0x3e, 0x63, 0xcc, 0x7c, 0xbe, 0xe9, 0x4e, 0xa9, 0xbe,
- 0x6d, 0xbd, 0x1a, 0x3e, 0xfb, 0xff, 0xb5, 0x3e, 0x5d, 0x33, 0xa1, 0x3e,
- 0xb4, 0x96, 0xf7, 0xbe, 0x6f, 0xba, 0xc5, 0xbe, 0x02, 0xa8, 0xd3, 0x3e,
- 0x14, 0xdb, 0x07, 0x3f, 0x8d, 0xa6, 0x38, 0xbf, 0xf6, 0x04, 0xff, 0xbb,
- 0xe8, 0x5e, 0xa4, 0xbe, 0x81, 0xe7, 0x87, 0xbd, 0x8c, 0x6f, 0xc6, 0xbe,
- 0x90, 0xa1, 0x38, 0xbf, 0x27, 0xe0, 0x22, 0x3f, 0x3f, 0x22, 0x6b, 0x3e,
- 0xf0, 0x56, 0x00, 0x3e, 0x5e, 0x61, 0xf1, 0xbc, 0x86, 0xc6, 0x14, 0x3e,
- 0x1a, 0x2b, 0x4b, 0xbe, 0x93, 0x5e, 0x43, 0x3e, 0xbc, 0x1a, 0xf0, 0xbc,
- 0xa1, 0x6c, 0x95, 0x3e, 0x67, 0xd9, 0x30, 0x3c, 0x7e, 0x13, 0x1d, 0xbf,
- 0x07, 0xf0, 0x1c, 0x3e, 0xfc, 0x75, 0xd4, 0xbe, 0x4e, 0x2a, 0xa3, 0x3e,
- 0xee, 0xf7, 0x52, 0x3d, 0x4f, 0xc5, 0x38, 0x3e, 0xe1, 0xf8, 0xb9, 0x3e,
- 0x30, 0x66, 0xb8, 0x3e, 0x16, 0xc6, 0xf4, 0xbd, 0xf6, 0xab, 0xc8, 0xbe,
- 0x33, 0x50, 0x01, 0xbd, 0xee, 0x26, 0xcc, 0xbe, 0x4b, 0x40, 0x06, 0x3f,
- 0xbd, 0x32, 0x03, 0x3e, 0x42, 0x77, 0xfe, 0xbe, 0xbd, 0x6d, 0x39, 0x3e,
- 0xc5, 0x47, 0x48, 0xbe, 0x12, 0x67, 0x0f, 0xbe, 0xcd, 0x09, 0x00, 0xbd,
- 0x62, 0x6e, 0x03, 0xbf, 0x75, 0x27, 0xd2, 0x3e, 0x9f, 0x5d, 0x77, 0xbe,
- 0x75, 0x68, 0x05, 0xbf, 0xab, 0x95, 0x5c, 0x3e, 0x6a, 0x7d, 0x81, 0xbe,
- 0xf7, 0x2c, 0x20, 0xbf, 0xbe, 0x9e, 0x29, 0xbf, 0x0b, 0xff, 0xe7, 0xbd,
- 0x4a, 0x3c, 0x85, 0xbe, 0x4a, 0xda, 0x90, 0x3e, 0x2d, 0x10, 0x56, 0xbe,
- 0xab, 0x56, 0x36, 0x3e, 0xa8, 0x18, 0x53, 0xbf, 0xb5, 0x84, 0x66, 0xbd,
- 0xbd, 0x88, 0x1e, 0xbf, 0xfe, 0x28, 0x38, 0xbe, 0x4b, 0x5a, 0xa5, 0xbd,
- 0xf8, 0x37, 0x36, 0x3e, 0x3f, 0xea, 0x50, 0x3d, 0x40, 0xf9, 0xa3, 0x3e,
- 0xaf, 0xc9, 0x2a, 0xbf, 0x24, 0x5e, 0xc4, 0xbe, 0x02, 0xe8, 0x9e, 0xbe,
- 0xf4, 0xa3, 0x5e, 0xbe, 0x0b, 0xab, 0x8e, 0x3d, 0x3b, 0x53, 0xc6, 0xbd,
- 0x77, 0xd1, 0x3d, 0x3e, 0x12, 0x5e, 0xd5, 0x3d, 0xde, 0x8f, 0x50, 0xbe,
- 0x28, 0xb2, 0x18, 0xbc, 0xad, 0xf4, 0xd8, 0x3d, 0xe9, 0x0b, 0xcb, 0x3c,
- 0x07, 0x75, 0x76, 0x3e, 0xc4, 0x84, 0x14, 0x3e, 0x60, 0xb0, 0xa6, 0xbe,
- 0x7a, 0xde, 0xed, 0x3d, 0x48, 0x52, 0x8e, 0xbe, 0x74, 0x05, 0x8c, 0x3e,
- 0xd8, 0xd9, 0xca, 0x3e, 0x56, 0x02, 0x07, 0x3e, 0x2e, 0x15, 0x8b, 0xbd,
- 0x52, 0x6e, 0xbf, 0x3d, 0x4c, 0x20, 0x7d, 0xbe, 0xb9, 0x2f, 0x99, 0xbe,
- 0x59, 0xde, 0xda, 0xbe, 0x2c, 0x27, 0x97, 0xbc, 0x68, 0x27, 0x05, 0x3d,
- 0x2b, 0xda, 0x64, 0xbe, 0xaa, 0xc6, 0x19, 0xbe, 0xba, 0xd8, 0xec, 0x3e,
- 0xc4, 0x06, 0xb2, 0xbb, 0x26, 0x7a, 0x81, 0xbe, 0xbd, 0x98, 0x94, 0xbd,
- 0xbf, 0xf6, 0x9a, 0x3e, 0xdb, 0xc1, 0x99, 0x3d, 0xe0, 0xb9, 0x8c, 0x3e,
- 0x1a, 0xb6, 0x67, 0xbe, 0xc8, 0x0b, 0x45, 0x3d, 0xa4, 0x24, 0x5f, 0xbc,
- 0x1b, 0x99, 0xb1, 0xbe, 0xdc, 0xeb, 0xef, 0xbe, 0x09, 0x97, 0x7b, 0x3e,
- 0x53, 0xc9, 0xaa, 0xbd, 0x1c, 0x7d, 0xbd, 0x3c, 0xfd, 0xe5, 0x5c, 0xbe,
- 0x30, 0x4c, 0xa7, 0xbe, 0x51, 0x20, 0xf9, 0xbc, 0x31, 0xcb, 0x98, 0xbe,
- 0xbc, 0xd8, 0x4f, 0x3d, 0x00, 0x0d, 0x5e, 0xbe, 0x1a, 0xb3, 0x0e, 0xbf,
- 0x0d, 0x5f, 0x05, 0xbf, 0x5c, 0x0a, 0xe4, 0x3c, 0xf1, 0xbc, 0x3e, 0xbd,
- 0x1d, 0x15, 0x53, 0x3d, 0xac, 0x3e, 0x75, 0xbe, 0x16, 0x7d, 0x09, 0x3d,
- 0x45, 0x9c, 0x84, 0xbe, 0x54, 0x39, 0x55, 0xbd, 0x68, 0x01, 0xf9, 0xbe,
- 0x02, 0x85, 0x26, 0x3e, 0x1b, 0x6b, 0xae, 0xbe, 0x1c, 0xed, 0x3e, 0x3e,
- 0x95, 0xc9, 0x20, 0xbd, 0xd6, 0xe3, 0xc1, 0xbd, 0x0b, 0x08, 0x8b, 0xbd,
- 0x8e, 0x55, 0x10, 0x3e, 0xe2, 0x0e, 0xcb, 0x3c, 0x4b, 0xce, 0x95, 0xbe,
- 0x74, 0x92, 0x29, 0xbe, 0xe5, 0x9e, 0x8c, 0x3e, 0xf3, 0x62, 0x78, 0xbe,
- 0x49, 0xfa, 0xb0, 0x3e, 0x56, 0xde, 0x93, 0x3e, 0x7e, 0x6d, 0x64, 0xbe,
- 0x8b, 0xec, 0x3b, 0xbc, 0xbd, 0x63, 0x4b, 0xbe, 0x35, 0x44, 0x2c, 0xbe,
- 0x0d, 0x11, 0x64, 0x3e, 0xcf, 0xfb, 0x8c, 0x3e, 0x7e, 0xe1, 0x3f, 0x3e,
- 0x12, 0x6a, 0x97, 0xbe, 0x8c, 0x74, 0x1a, 0x3e, 0x3c, 0x01, 0x52, 0xbb,
- 0x18, 0xf8, 0x68, 0xbe, 0x94, 0x74, 0x76, 0xbe, 0x9e, 0xa0, 0xa4, 0x3c,
- 0x5b, 0xb3, 0x11, 0x3e, 0x2a, 0x3e, 0x48, 0xbe, 0x4a, 0x46, 0xe3, 0xbe,
- 0xbc, 0x8d, 0xc6, 0xbe, 0xb8, 0xf9, 0x01, 0x3f, 0x57, 0xa0, 0xab, 0xbd,
- 0x09, 0x78, 0xe5, 0xbe, 0xa1, 0x93, 0xa7, 0x3e, 0x89, 0x43, 0xc0, 0xbd,
- 0x64, 0xdc, 0x53, 0x3e, 0xf5, 0x9e, 0x30, 0x3d, 0x4e, 0x2c, 0x24, 0x3e,
- 0x47, 0x90, 0x69, 0xbe, 0xdb, 0x78, 0x20, 0x3e, 0x72, 0x8e, 0x0b, 0x3e,
- 0xb5, 0xab, 0xf9, 0xbe, 0x23, 0xb9, 0x65, 0xbe, 0x32, 0x9c, 0x22, 0xbc,
- 0x2b, 0x5b, 0x95, 0x3e, 0x61, 0xcd, 0x4b, 0xbe, 0x2e, 0x40, 0x2d, 0xbe,
- 0xce, 0x0d, 0xfa, 0x3c, 0x69, 0x69, 0x98, 0x3d, 0xe7, 0x33, 0x89, 0x3e,
- 0x7d, 0xf7, 0x9f, 0x3d, 0xb6, 0x25, 0x9b, 0xbe, 0x26, 0xdf, 0x13, 0xbe,
- 0x88, 0x52, 0x22, 0xbe, 0x9d, 0xfe, 0x0a, 0xbe, 0xd4, 0x09, 0xc0, 0x3d,
- 0xaa, 0x2f, 0x87, 0xbe, 0x8a, 0xf1, 0xf8, 0xbe, 0xe7, 0x9b, 0x80, 0x3d,
- 0x00, 0xfe, 0x15, 0x3e, 0xb4, 0x4c, 0x36, 0x3e, 0x46, 0xc8, 0xff, 0xbe,
- 0x12, 0x2e, 0xc8, 0xbe, 0x0b, 0x2d, 0xc5, 0xbd, 0xe0, 0xbd, 0x9f, 0x3d,
- 0xe2, 0xb9, 0xe3, 0xbe, 0xce, 0x24, 0xa9, 0x3d, 0x9c, 0xd0, 0x00, 0xbe,
- 0x30, 0x74, 0xba, 0xbe, 0xa3, 0x93, 0x23, 0xbe, 0xf9, 0xd8, 0x45, 0x3e,
- 0xba, 0x6f, 0xc0, 0x3d, 0x4d, 0x31, 0x6f, 0xbe, 0x8d, 0xbe, 0xc6, 0x3b,
- 0x6f, 0x99, 0xe5, 0xbe, 0xa0, 0x56, 0x85, 0x3e, 0x95, 0x06, 0x8e, 0x3d,
- 0x66, 0xf6, 0x48, 0x3e, 0x4d, 0x6a, 0xe1, 0x3e, 0x1b, 0x89, 0xec, 0xbe,
- 0x9b, 0x0e, 0x41, 0xbf, 0xb4, 0x2a, 0x55, 0x3d, 0x87, 0x9e, 0xce, 0x3d,
- 0x4b, 0xb3, 0x07, 0xbf, 0x7a, 0x4c, 0xfc, 0xbe, 0x2d, 0x1e, 0xb5, 0xbe,
- 0x31, 0xb0, 0xbf, 0x3e, 0xd7, 0x1f, 0x4c, 0x3e, 0xa5, 0xc3, 0xda, 0xbe,
- 0xcf, 0x4d, 0x96, 0xbe, 0xd8, 0xbb, 0x5f, 0xbf, 0x02, 0xae, 0xbc, 0x3d,
- 0x7c, 0x6c, 0xb8, 0xbe, 0x12, 0xeb, 0x93, 0x3d, 0x89, 0x02, 0x61, 0x3d,
- 0x77, 0xb8, 0x18, 0xbf, 0x0f, 0xb5, 0x92, 0xbe, 0x1f, 0xda, 0xf6, 0x3d,
- 0x48, 0x86, 0x3c, 0x3e, 0x3d, 0xbe, 0x91, 0x3d, 0x53, 0xda, 0xf3, 0x3d,
- 0xcf, 0xd8, 0x1e, 0xbc, 0x0f, 0x3f, 0x77, 0xbe, 0x94, 0x56, 0x1b, 0x3d,
- 0x22, 0xa9, 0x93, 0x3c, 0xfd, 0x41, 0x43, 0x3e, 0xb7, 0xa2, 0x4d, 0xbe,
- 0xd3, 0x0e, 0x69, 0x3e, 0x8a, 0xe1, 0x62, 0x3e, 0x29, 0x63, 0xc1, 0x3e,
- 0xd9, 0x09, 0xfc, 0x3e, 0xae, 0x41, 0xc5, 0x3c, 0xc6, 0x88, 0xc6, 0xbe,
- 0x40, 0xdd, 0xfc, 0x3e, 0x25, 0x17, 0x4d, 0xbe, 0xe2, 0x57, 0x11, 0xbf,
- 0x1c, 0x10, 0x1d, 0xbe, 0xe2, 0x85, 0xb4, 0xbb, 0x41, 0x26, 0xdc, 0xbc,
- 0x9c, 0xa2, 0x79, 0xbe, 0xc8, 0xde, 0x31, 0xbe, 0xe5, 0x8f, 0x30, 0x3e,
- 0x8f, 0x13, 0x15, 0xbe, 0x62, 0x88, 0x7c, 0xbe, 0x24, 0xcb, 0x25, 0xbe,
- 0x35, 0x5d, 0x8f, 0x3d, 0x82, 0x9e, 0x84, 0xbe, 0x41, 0xf0, 0x48, 0x3d,
- 0x16, 0x15, 0x30, 0xbe, 0x93, 0x99, 0x89, 0xbe, 0x21, 0x07, 0xba, 0x3c,
- 0xc2, 0xc0, 0x75, 0xbd, 0xbe, 0xab, 0x11, 0x3e, 0x43, 0x07, 0x1f, 0xbd,
- 0xdd, 0xe7, 0xf0, 0x3d, 0xca, 0xeb, 0x5b, 0xbe, 0x04, 0x09, 0xca, 0xbe,
- 0x8e, 0x25, 0x53, 0xbf, 0x82, 0x43, 0xdb, 0x3d, 0x83, 0x87, 0x87, 0xbe,
- 0x50, 0xd8, 0xaf, 0x3e, 0x27, 0x62, 0x31, 0x3e, 0x12, 0x76, 0x0f, 0xbd,
- 0xcb, 0xdc, 0xb7, 0x3e, 0x91, 0x23, 0x58, 0xbe, 0xd7, 0xc8, 0xb3, 0xbe,
- 0xf4, 0xa4, 0xd5, 0xbe, 0x61, 0x07, 0x23, 0x3e, 0x10, 0xd0, 0x0a, 0xbf,
- 0xa3, 0x2c, 0xb6, 0xbe, 0x03, 0xc7, 0x2d, 0xbe, 0x45, 0xfe, 0x8f, 0x3e,
- 0xf1, 0xad, 0xb5, 0x3e, 0x62, 0x26, 0xcd, 0xbe, 0x4d, 0x64, 0x5e, 0xbe,
- 0x39, 0x33, 0x22, 0x3e, 0x61, 0x98, 0xa2, 0xbe, 0xa4, 0x7b, 0x91, 0xbc,
- 0x6a, 0x5f, 0x22, 0xbe, 0xe6, 0xfe, 0x02, 0x3e, 0x08, 0x3e, 0xf6, 0xbe,
- 0x80, 0x52, 0x89, 0x3e, 0x7d, 0x7f, 0xb0, 0xbe, 0x20, 0xf6, 0xed, 0xbe,
- 0x6c, 0x72, 0x0e, 0xbe, 0xd3, 0xee, 0x73, 0xbe, 0xde, 0x03, 0xab, 0xbe,
- 0x74, 0x9f, 0x09, 0x3d, 0xd7, 0xf3, 0xfa, 0x3c, 0xa8, 0x22, 0x74, 0x3e,
- 0xfe, 0x58, 0x3c, 0x3e, 0x5c, 0xe4, 0xd4, 0x3c, 0x95, 0x15, 0xf6, 0xbe,
- 0x56, 0x2f, 0xb0, 0xbe, 0x1e, 0xe2, 0xba, 0xbd, 0x5d, 0xf0, 0x87, 0xbe,
- 0x52, 0x32, 0xab, 0xbd, 0xcc, 0x14, 0x0e, 0xbe, 0x4c, 0xd5, 0xa3, 0xbe,
- 0x58, 0x25, 0xa3, 0xbe, 0xdc, 0x51, 0xce, 0x3d, 0xa3, 0xf0, 0xb8, 0xbe,
- 0x67, 0xea, 0xf8, 0xbd, 0x39, 0x30, 0x0a, 0xbe, 0x52, 0x04, 0x16, 0xbf,
- 0xfe, 0x6a, 0xd3, 0x3c, 0x29, 0x57, 0x43, 0xbe, 0xab, 0x31, 0x12, 0xbe,
- 0x81, 0x0e, 0xe3, 0xbd, 0x1d, 0x8b, 0x31, 0x3e, 0x8a, 0x17, 0x9c, 0x3e,
- 0x81, 0xc3, 0xbe, 0xbe, 0xda, 0x4d, 0xed, 0xbe, 0x2b, 0x29, 0x1e, 0xbe,
- 0x33, 0x17, 0xd6, 0xbd, 0xe0, 0x24, 0x6e, 0xbd, 0xe2, 0x3a, 0x36, 0x3e,
- 0xf0, 0xc6, 0x33, 0xbe, 0x6a, 0x36, 0x76, 0x3d, 0xf0, 0x7e, 0x9f, 0xbe,
- 0x20, 0x0d, 0xbf, 0xbc, 0x93, 0x40, 0x04, 0xbd, 0x85, 0x27, 0xb2, 0x3d,
- 0x0c, 0xfa, 0xbf, 0xbd, 0xc0, 0x3d, 0x4e, 0x3d, 0xc4, 0xa3, 0x23, 0xbe,
- 0xba, 0xb9, 0xc4, 0xbd, 0xa3, 0x3e, 0xc4, 0xbd, 0x0c, 0xe3, 0x61, 0x3e,
- 0xbe, 0x89, 0x12, 0xbf, 0xb8, 0x3c, 0x20, 0xbe, 0x6f, 0x54, 0x78, 0xbd,
- 0xa2, 0x60, 0xdc, 0xbe, 0x30, 0x7e, 0x73, 0x3d, 0x0a, 0x7b, 0xc0, 0xbd,
- 0x4c, 0x96, 0xad, 0xbe, 0x17, 0x15, 0x46, 0x3e, 0xd2, 0x4c, 0x72, 0xbe,
- 0xbc, 0x79, 0xe0, 0xbd, 0xa6, 0xf9, 0x9b, 0xbe, 0xd9, 0x94, 0x10, 0xbd,
- 0x57, 0x1f, 0x93, 0xbd, 0xab, 0x16, 0xad, 0xbe, 0x1c, 0xaa, 0x01, 0xbf,
- 0xef, 0x7a, 0xa2, 0x3e, 0xcf, 0x13, 0x23, 0x3e, 0x08, 0xc6, 0x38, 0xbe,
- 0x6c, 0xb9, 0x48, 0x3e, 0xd7, 0xe2, 0x30, 0x3e, 0x73, 0xbc, 0xd4, 0x3d,
- 0xe6, 0xc1, 0x9d, 0xbe, 0xfc, 0x69, 0xc9, 0xbe, 0x97, 0x66, 0x36, 0xbe,
- 0x1b, 0xd4, 0x0c, 0xbf, 0x90, 0x5c, 0x10, 0xbf, 0x7c, 0x4b, 0x89, 0x3e,
- 0x07, 0x0f, 0x48, 0xbe, 0x24, 0xde, 0x41, 0xbd, 0x3f, 0x36, 0xf1, 0x3d,
- 0x03, 0xe1, 0xf3, 0x3c, 0xf7, 0x54, 0xa1, 0xbe, 0xe1, 0xa2, 0xfd, 0xbd,
- 0xe3, 0xe1, 0xe5, 0xbe, 0x48, 0x81, 0x1f, 0x3e, 0xa7, 0x49, 0x7f, 0x3e,
- 0x8a, 0x79, 0x43, 0x3e, 0x9d, 0x72, 0x48, 0xbe, 0xb4, 0x50, 0x84, 0x3d,
- 0x45, 0x9f, 0xf2, 0x3d, 0xa5, 0x1f, 0xba, 0x3e, 0xdc, 0x85, 0xfd, 0xbe,
- 0xc0, 0x31, 0xbb, 0xbe, 0xce, 0xe3, 0xe8, 0xbe, 0x6c, 0x9a, 0x51, 0xbe,
- 0x79, 0xc6, 0xe6, 0xbe, 0xab, 0x14, 0x53, 0xbe, 0x7e, 0xe2, 0x95, 0xbd,
- 0x62, 0xf5, 0xf8, 0x3d, 0xa6, 0x9f, 0x1a, 0xbc, 0x7e, 0x7c, 0x86, 0xbe,
- 0x13, 0x83, 0xe9, 0xbc, 0x86, 0x07, 0x13, 0x3e, 0x46, 0xd3, 0x18, 0xb9,
- 0x22, 0xd5, 0x5d, 0xbe, 0x48, 0x7a, 0xbc, 0xbe, 0xc2, 0x13, 0xa0, 0x3d,
- 0xb7, 0xea, 0x56, 0xbe, 0x23, 0x94, 0x46, 0xbf, 0xbc, 0x3e, 0x11, 0xbe,
- 0xd0, 0xb8, 0xf6, 0xbe, 0x15, 0xad, 0x8c, 0x3d, 0x71, 0xd2, 0x36, 0x3e,
- 0x02, 0x5d, 0x84, 0xbe, 0xe7, 0x05, 0x65, 0xbe, 0xeb, 0xba, 0x3e, 0xbe,
- 0x0c, 0x4e, 0xe9, 0x3d, 0xb1, 0xd2, 0x8b, 0xbc, 0xa9, 0x57, 0xba, 0x3d,
- 0xca, 0xc4, 0x93, 0xbe, 0x63, 0x8b, 0x5a, 0xbc, 0xa4, 0x2e, 0x0c, 0xbd,
- 0x96, 0x15, 0xc8, 0xbd, 0x0a, 0x1d, 0x22, 0x3d, 0x1e, 0x43, 0xe6, 0x3c,
- 0xfd, 0x2a, 0xd8, 0x3d, 0xd1, 0x25, 0x05, 0xbf, 0xa5, 0x6e, 0x24, 0x3b,
- 0xab, 0xc9, 0xbe, 0x3e, 0xa8, 0xb4, 0x8c, 0x3d, 0xfe, 0xf2, 0xa2, 0x3d,
- 0x14, 0x61, 0xda, 0xbd, 0xad, 0x2b, 0x1a, 0xbc, 0xb2, 0x35, 0x3c, 0x3e,
- 0xf6, 0x98, 0x95, 0x3e, 0x91, 0x66, 0xa2, 0xbe, 0x7a, 0x55, 0x97, 0x3c,
- 0x25, 0x37, 0x62, 0x3d, 0x37, 0x96, 0x1c, 0xbe, 0x3d, 0xc7, 0x42, 0xbe,
- 0x5b, 0x71, 0xfd, 0x3d, 0xe1, 0x92, 0xf7, 0x3d, 0x21, 0xb2, 0xba, 0x3d,
- 0xc1, 0xfd, 0x8b, 0x3e, 0xe7, 0xf0, 0xa0, 0xbd, 0x74, 0xc9, 0x3d, 0x3d,
- 0x69, 0xeb, 0x58, 0x3d, 0x87, 0xe3, 0xb5, 0x3d, 0xc6, 0xba, 0x01, 0x3f,
- 0x46, 0xe9, 0x22, 0xbf, 0xb8, 0x2d, 0x14, 0x3f, 0xc8, 0x7f, 0xca, 0xbd,
- 0x35, 0x4d, 0x84, 0xbe, 0xfc, 0x46, 0xb9, 0xbd, 0xce, 0xee, 0xb0, 0xbd,
- 0x05, 0xa3, 0xe0, 0xbd, 0x67, 0x30, 0x4d, 0xbe, 0x4b, 0xf3, 0x5c, 0x3e,
- 0x7b, 0x6d, 0x56, 0xbe, 0xf6, 0x7d, 0x3c, 0xbd, 0xa1, 0xb0, 0xd8, 0xbe,
- 0x66, 0xd6, 0xcb, 0x3e, 0xf0, 0xab, 0x87, 0xbd, 0x22, 0x4e, 0x37, 0xbe,
- 0x91, 0x14, 0xab, 0x3e, 0x53, 0x7b, 0xc8, 0x3d, 0xb6, 0x61, 0xdc, 0xbc,
- 0xec, 0x10, 0x13, 0xbf, 0x55, 0x59, 0xc8, 0xbe, 0x30, 0xcf, 0xd6, 0xbe,
- 0x1d, 0xbf, 0xcf, 0xbd, 0x1d, 0x00, 0x0f, 0xbe, 0x3a, 0xe5, 0xc0, 0x3c,
- 0xe1, 0x34, 0x4c, 0xbe, 0xf0, 0xc5, 0xbc, 0xbd, 0x3b, 0x3b, 0xdb, 0x3c,
- 0x7c, 0xfe, 0x22, 0xbe, 0x46, 0xc7, 0x59, 0x3e, 0x46, 0xc5, 0x03, 0xbc,
- 0x4b, 0xc1, 0xa3, 0x3e, 0x73, 0xf4, 0x96, 0x3d, 0x13, 0x8a, 0x1d, 0xbd,
- 0xb6, 0x5a, 0x26, 0xbe, 0xc8, 0x92, 0x9f, 0xbc, 0x7b, 0x5a, 0xb4, 0xbe,
- 0x29, 0xd0, 0x22, 0xbe, 0x2f, 0x0e, 0xff, 0x3d, 0x99, 0x96, 0xa9, 0x3d,
- 0xf3, 0xce, 0x4d, 0x3d, 0x9d, 0x14, 0x11, 0xbd, 0x72, 0xe0, 0x64, 0xbd,
- 0x01, 0x03, 0xff, 0xbd, 0xa1, 0x2a, 0xa7, 0xbb, 0x19, 0x92, 0x99, 0xbe,
- 0xf4, 0x25, 0x99, 0xbd, 0x3d, 0x0d, 0xce, 0xbd, 0x19, 0x43, 0x36, 0xbd,
- 0x2d, 0x2c, 0x3a, 0xbe, 0xd4, 0x8e, 0x1c, 0x3d, 0x51, 0x20, 0x60, 0xbe,
- 0xe0, 0x04, 0x29, 0xbe, 0xdc, 0xcc, 0x1b, 0x3d, 0xfd, 0xe5, 0x9e, 0xbe,
- 0x6c, 0x28, 0x97, 0xbe, 0x09, 0x5e, 0x78, 0xbe, 0xb0, 0x6f, 0x78, 0x3d,
- 0xe9, 0x96, 0x91, 0x3c, 0x2f, 0x06, 0x74, 0x3e, 0xaa, 0xaf, 0x21, 0xbf,
- 0x2d, 0x59, 0xa9, 0x3d, 0x79, 0x25, 0x6c, 0xbd, 0xb4, 0x27, 0x07, 0x3e,
- 0xca, 0x35, 0xa5, 0xbe, 0xe5, 0x77, 0xa1, 0x3c, 0x3e, 0xdf, 0x5b, 0xbe,
- 0x63, 0xd2, 0x0c, 0xbe, 0xe1, 0x1c, 0xe7, 0xbe, 0x1f, 0x34, 0x11, 0xbe,
- 0x41, 0x03, 0xea, 0x3c, 0xb4, 0xb8, 0x0f, 0xbf, 0x9d, 0x61, 0x40, 0x3d,
- 0x7f, 0x10, 0xa4, 0x3e, 0x35, 0xfa, 0x53, 0x3e, 0x38, 0xf7, 0x22, 0xbd,
- 0x65, 0xcc, 0xca, 0xbd, 0x17, 0xcd, 0x8b, 0xbc, 0xfe, 0xee, 0x00, 0x3e,
- 0x73, 0x76, 0x06, 0xbe, 0x9f, 0x0c, 0xda, 0xbc, 0xf6, 0x8f, 0x24, 0xbe,
- 0xc6, 0x12, 0x14, 0xbf, 0xa7, 0x3b, 0x56, 0x3e, 0x6c, 0x1a, 0x92, 0xbe,
- 0xb2, 0x84, 0x0a, 0x3e, 0xc4, 0xe0, 0xfd, 0xbc, 0xe8, 0x58, 0xa4, 0xbe,
- 0x79, 0x33, 0x11, 0xbc, 0x43, 0xd0, 0x3e, 0x3c, 0xe1, 0x37, 0x8e, 0x3e,
- 0x01, 0xe7, 0x87, 0x3b, 0x4e, 0xe5, 0xf7, 0xbe, 0x77, 0xf0, 0xcc, 0xbd,
- 0x39, 0x4a, 0xba, 0xbe, 0x50, 0x3a, 0x31, 0xbe, 0x3b, 0xf9, 0x94, 0xbe,
- 0xd3, 0x5f, 0xce, 0xbb, 0x14, 0x5b, 0x98, 0xbd, 0x12, 0xdc, 0x08, 0x3e,
- 0xe4, 0xf6, 0x55, 0xbe, 0x37, 0xbd, 0x2d, 0x3e, 0x8f, 0xf5, 0x9f, 0xbf,
- 0xaa, 0x2e, 0x15, 0xbe, 0x35, 0x50, 0x78, 0x3e, 0xf4, 0x58, 0xc4, 0xbe,
- 0x66, 0xc9, 0x87, 0xbe, 0xe5, 0x9b, 0x60, 0xbd, 0xb5, 0x9c, 0x8a, 0xbd,
- 0x7d, 0xad, 0x05, 0x3d, 0x15, 0x45, 0xe4, 0xbd, 0xd9, 0xb5, 0x80, 0x3e,
- 0x3f, 0x33, 0x5a, 0x3e, 0x40, 0xa3, 0xe5, 0x3d, 0xcd, 0xed, 0x13, 0xbe,
- 0xa0, 0xdb, 0x19, 0x3e, 0xf4, 0x6e, 0x1d, 0xbe, 0x3f, 0x86, 0x25, 0x3d,
- 0x96, 0x15, 0x7e, 0xbe, 0x74, 0x0a, 0xc0, 0xbe, 0x9f, 0x85, 0x3f, 0x3e,
- 0x11, 0xc4, 0xb1, 0xbd, 0xf8, 0xe0, 0xb2, 0xbe, 0x5f, 0xf1, 0xdc, 0x3b,
- 0xca, 0x8f, 0xa7, 0xbe, 0x60, 0x3c, 0xc1, 0x3d, 0x1e, 0xe5, 0x1d, 0x3e,
- 0x5c, 0xfc, 0x5b, 0xbf, 0x48, 0xae, 0x22, 0xbe, 0xe2, 0x4f, 0x86, 0xbd,
- 0xbf, 0x50, 0x33, 0x3d, 0x20, 0xe2, 0x80, 0xbe, 0xa6, 0xe2, 0x87, 0x3c,
- 0x3f, 0x8f, 0x02, 0xbf, 0xe8, 0x7f, 0xb2, 0xbd, 0xcc, 0x64, 0x01, 0xbe,
- 0x0e, 0xff, 0x87, 0xba, 0x34, 0x6b, 0x15, 0xbf, 0xd3, 0xf1, 0x94, 0xbe,
- 0xe3, 0x20, 0x2d, 0x3e, 0xa6, 0x6a, 0x16, 0x3e, 0xfd, 0x0f, 0x73, 0xbd,
- 0x45, 0x03, 0x1d, 0xbe, 0x62, 0xa3, 0x95, 0x3e, 0x35, 0xa5, 0x09, 0xbf,
- 0xbd, 0x6e, 0x4d, 0xbd, 0xdc, 0x25, 0xfa, 0xbe, 0x53, 0xc5, 0xc2, 0xbe,
- 0x2a, 0x6d, 0x6c, 0xba, 0xf6, 0x0d, 0xf4, 0xbd, 0xd1, 0xfe, 0xd9, 0x3d,
- 0x5f, 0xf3, 0x4f, 0xbf, 0x7d, 0xa4, 0xa2, 0xbc, 0x11, 0xc5, 0xcf, 0xbd,
- 0x39, 0xed, 0x74, 0xbd, 0xf9, 0xcf, 0x01, 0x3e, 0xac, 0xb8, 0x9f, 0xbe,
- 0x3e, 0x11, 0xc8, 0x3e, 0xee, 0xab, 0x8a, 0x3b, 0x36, 0x94, 0x89, 0x3e,
- 0xc4, 0x0f, 0xde, 0xbd, 0x89, 0x85, 0x96, 0xbe, 0x17, 0x2c, 0x28, 0xbf,
- 0x8f, 0x07, 0xc4, 0xbd, 0x19, 0xf3, 0x43, 0x3e, 0xfa, 0x58, 0xbc, 0xbe,
- 0x18, 0x49, 0xd3, 0x3c, 0x9c, 0x76, 0x0a, 0xbd, 0x3b, 0x35, 0xed, 0xbe,
- 0xc7, 0xdc, 0x92, 0x3e, 0x01, 0xbb, 0x3a, 0x3e, 0xae, 0x49, 0xc6, 0x3b,
- 0xd1, 0xfa, 0xae, 0xbd, 0xe9, 0x7e, 0x48, 0xbb, 0xa7, 0x14, 0xbe, 0x3e,
- 0x38, 0xf8, 0x8c, 0xbe, 0xf2, 0x5d, 0x83, 0x3e, 0xe1, 0x21, 0x9c, 0x3e,
- 0x87, 0x11, 0x9a, 0xbe, 0x12, 0xe3, 0xde, 0x3d, 0x31, 0x62, 0x92, 0xbd,
- 0x9b, 0xc9, 0xa4, 0xbe, 0x15, 0xe0, 0x30, 0xbd, 0x2d, 0x94, 0x91, 0x3e,
- 0x77, 0xea, 0x05, 0xbe, 0x11, 0xd0, 0x03, 0xbf, 0xe1, 0x73, 0x64, 0x3e,
- 0x66, 0xa1, 0xb1, 0x3d, 0x1d, 0x29, 0x38, 0x3d, 0x19, 0xc8, 0xbf, 0xbe,
- 0xda, 0x4b, 0x99, 0xbe, 0x18, 0x43, 0xca, 0xbd, 0x21, 0xbe, 0x82, 0xbe,
- 0xc0, 0x40, 0xb6, 0xbe, 0x93, 0xef, 0x29, 0xbe, 0xe5, 0xd3, 0x20, 0x3c,
- 0xd2, 0x1e, 0x49, 0xbf, 0x4e, 0x60, 0xe0, 0xbe, 0xfc, 0xec, 0x15, 0xbd,
- 0xc3, 0xb3, 0x58, 0xbc, 0x02, 0xce, 0x85, 0xbe, 0xd1, 0x4f, 0xc9, 0xbd,
- 0x7d, 0xfa, 0x45, 0x3e, 0x5d, 0xf0, 0x33, 0xbe, 0x2a, 0xab, 0xe9, 0xbd,
- 0x92, 0xab, 0xb8, 0xbc, 0x22, 0xf8, 0x90, 0x3e, 0xef, 0x0c, 0xf2, 0xbc,
- 0x1b, 0xf6, 0x72, 0x3e, 0x33, 0x96, 0x05, 0x3e, 0x52, 0x69, 0x35, 0x3e,
- 0x22, 0xc5, 0xa7, 0xbd, 0xf1, 0x7a, 0x63, 0xbd, 0x41, 0x77, 0x83, 0xbe,
- 0x9f, 0x23, 0x9e, 0x3c, 0x20, 0x32, 0xd1, 0xbd, 0x43, 0x02, 0xda, 0xbe,
- 0x39, 0x5a, 0x61, 0xbe, 0x8c, 0x75, 0x09, 0xbf, 0xc4, 0x2e, 0xc8, 0xbc,
- 0x8f, 0x1e, 0x00, 0xbe, 0x4e, 0x0f, 0xae, 0x3e, 0x96, 0x28, 0x09, 0x3d,
- 0x44, 0x35, 0x99, 0xbe, 0x94, 0x2f, 0x26, 0x3e, 0x72, 0x68, 0x3e, 0xbb,
- 0x5d, 0xa4, 0x48, 0xbd, 0x4c, 0xee, 0x91, 0xbc, 0xcd, 0xc8, 0x52, 0x3e,
- 0xd1, 0x70, 0xd1, 0x3d, 0x9a, 0x8b, 0x76, 0xbd, 0x28, 0x3d, 0x4e, 0x3e,
- 0x7b, 0x92, 0x18, 0xbc, 0x04, 0x45, 0x70, 0x3e, 0x01, 0x80, 0x5e, 0xbc,
- 0xce, 0xb8, 0x95, 0x3d, 0x2e, 0xb5, 0x82, 0x3e, 0xca, 0x6a, 0x33, 0xbe,
- 0x4b, 0x7a, 0x62, 0x3e, 0xf6, 0x6d, 0xb2, 0x3d, 0x25, 0x75, 0x9d, 0x3e,
- 0x62, 0x19, 0x10, 0x3e, 0xe9, 0x0e, 0x92, 0xbd, 0xf6, 0xe8, 0xb8, 0x3d,
- 0xfe, 0x14, 0xe6, 0xbe, 0x30, 0x71, 0xd3, 0xbd, 0xad, 0x91, 0x7e, 0xbe,
- 0xf9, 0x9a, 0xc8, 0x3d, 0x38, 0x82, 0xba, 0xbd, 0x7b, 0x62, 0x08, 0xbe,
- 0x33, 0xc6, 0x04, 0x3e, 0x7e, 0x0b, 0x39, 0x3d, 0x3f, 0x81, 0x33, 0xbf,
- 0xc2, 0xc4, 0xce, 0xbd, 0x19, 0xf8, 0x9b, 0xbd, 0x46, 0x17, 0x39, 0x3d,
- 0xda, 0x49, 0xc9, 0x3e, 0x18, 0xd4, 0x17, 0xbf, 0x66, 0x17, 0xef, 0xbe,
- 0x5a, 0xee, 0x0b, 0xbf, 0x8f, 0x01, 0x4a, 0xbe, 0x72, 0x6a, 0x89, 0x3e,
- 0x84, 0x68, 0x1f, 0xbe, 0x69, 0xf2, 0xb4, 0xbe, 0x17, 0xb1, 0xb7, 0xbd,
- 0xff, 0xa3, 0xd9, 0xbe, 0xdb, 0x7e, 0x37, 0x3e, 0xc3, 0x20, 0xb4, 0xbe,
- 0xda, 0x8c, 0xea, 0x3d, 0x98, 0x86, 0xbd, 0xbe, 0xec, 0x14, 0xbd, 0xbe,
- 0xb0, 0x02, 0x1f, 0xbe, 0x36, 0xd4, 0xad, 0x3e, 0x4f, 0xb4, 0xa5, 0xbe,
- 0x89, 0x2e, 0xba, 0xbe, 0x72, 0x1f, 0xd7, 0x3e, 0x13, 0x7d, 0x95, 0x3e,
- 0x4f, 0x72, 0x1a, 0x3e, 0x76, 0x7c, 0xa1, 0x3e, 0xe9, 0xc1, 0x16, 0xbf,
- 0xa2, 0x26, 0x8e, 0x3e, 0xec, 0x4b, 0x42, 0xbe, 0xea, 0xbb, 0xd9, 0xbe,
- 0x01, 0x22, 0xbe, 0xbd, 0xd0, 0x13, 0x82, 0x3e, 0xbf, 0x9d, 0xbc, 0xbd,
- 0x2d, 0x00, 0x42, 0x3f, 0xa3, 0xd6, 0x79, 0xbe, 0x52, 0x06, 0xd4, 0xbe,
- 0xbb, 0x94, 0xef, 0x3e, 0x83, 0x8d, 0xbc, 0x3c, 0x52, 0xe1, 0x90, 0xbe,
- 0x91, 0x64, 0x13, 0x3d, 0x77, 0xe4, 0x8c, 0xbe, 0x92, 0x1b, 0x6d, 0x3e,
- 0x56, 0xdc, 0x9d, 0x3e, 0xcf, 0x09, 0x87, 0x3e, 0x5d, 0x3a, 0x5f, 0xbe,
- 0x80, 0xfa, 0x17, 0xbd, 0x04, 0x19, 0x38, 0xbe, 0x64, 0x37, 0xc1, 0x3e,
- 0x5e, 0x80, 0x96, 0xbd, 0x19, 0x9b, 0xdb, 0xbd, 0xd6, 0xbb, 0xb9, 0x3e,
- 0x22, 0x69, 0xc1, 0xbe, 0x9c, 0x07, 0x9c, 0xbc, 0xc6, 0x98, 0xa0, 0xbe,
- 0x58, 0x71, 0x45, 0xbe, 0x51, 0xbb, 0x45, 0x3e, 0x23, 0xc3, 0x87, 0x3e,
- 0xc4, 0x16, 0x72, 0xbe, 0xdf, 0x62, 0x17, 0xbf, 0xa7, 0xee, 0x19, 0xbe,
- 0x2b, 0x80, 0x45, 0xbd, 0xaa, 0x3f, 0x2c, 0xbf, 0x6a, 0x59, 0x72, 0xbd,
- 0x5c, 0xee, 0x5a, 0xbc, 0x69, 0xf1, 0x27, 0xbc, 0xae, 0x43, 0x35, 0x3e,
- 0xf2, 0xe7, 0x3d, 0x3d, 0x10, 0xc1, 0x31, 0xbe, 0x9f, 0x86, 0x46, 0x3d,
- 0xaf, 0x5b, 0x86, 0x3d, 0x5b, 0x86, 0x9e, 0x3d, 0x08, 0x12, 0xe2, 0x3e,
- 0xaa, 0x39, 0xab, 0xbe, 0x5b, 0x34, 0x2b, 0x3e, 0x46, 0xdd, 0xa5, 0xbe,
- 0xde, 0x40, 0xa1, 0x3e, 0xff, 0x8f, 0xdd, 0x3e, 0x33, 0xc6, 0x94, 0x3e,
- 0x3b, 0xbf, 0x9a, 0xbe, 0x59, 0xcf, 0x07, 0xbf, 0x41, 0x91, 0x01, 0x3f,
- 0xbb, 0x68, 0xd7, 0xbc, 0x9f, 0x0f, 0xff, 0xbe, 0xaa, 0x3f, 0x1a, 0xbd,
- 0x85, 0xc0, 0xa9, 0xbe, 0x0a, 0x10, 0xec, 0x3e, 0xe3, 0x7d, 0x9f, 0x3b,
- 0x19, 0xa5, 0xba, 0x3e, 0x97, 0xe2, 0x10, 0xbf, 0x9c, 0x94, 0xe7, 0xbc,
- 0x01, 0x10, 0x16, 0xbe, 0x82, 0xfc, 0x22, 0xbe, 0x9c, 0xca, 0x72, 0xbd,
- 0xbe, 0xf3, 0x06, 0xbe, 0x75, 0x1b, 0xd3, 0x3d, 0xf0, 0xa6, 0xd0, 0xbe,
- 0xd1, 0xc9, 0x79, 0xbc, 0xf4, 0x27, 0xb0, 0xbd, 0xd2, 0xd0, 0x69, 0x3d,
- 0x46, 0x16, 0x16, 0x3f, 0x6b, 0xbd, 0x13, 0xbf, 0xa9, 0xe3, 0x90, 0xbe,
- 0xc6, 0x27, 0x4c, 0xbe, 0x7d, 0x28, 0x97, 0x3d, 0x74, 0x7e, 0x49, 0xbe,
- 0x0b, 0x76, 0x1c, 0xbf, 0xee, 0xf2, 0x9e, 0xbd, 0x55, 0x0e, 0x6c, 0xbe,
- 0x8f, 0x33, 0x53, 0x3f, 0xab, 0x54, 0xf8, 0xbd, 0x11, 0x00, 0x73, 0xbe,
- 0x3a, 0xba, 0x1f, 0x3e, 0x2f, 0xa1, 0xed, 0x3d, 0x05, 0x70, 0x77, 0xbe,
- 0x1e, 0x84, 0xb5, 0xbe, 0xd4, 0xf3, 0x1a, 0xbe, 0x8d, 0x33, 0xd5, 0xbd,
- 0xc5, 0x1e, 0x87, 0x3d, 0x07, 0x97, 0x87, 0xbd, 0xeb, 0x1f, 0xf2, 0x3e,
- 0x44, 0x48, 0x47, 0xbf, 0x7f, 0xb8, 0xa1, 0x3d, 0xeb, 0x8c, 0x85, 0x3d,
- 0x2d, 0x70, 0xc9, 0xbc, 0x36, 0x17, 0xe6, 0xbd, 0x1b, 0xa3, 0x95, 0xbd,
- 0x63, 0x6a, 0xe1, 0xbe, 0xdc, 0xc7, 0xb5, 0x3e, 0x1a, 0xee, 0x57, 0x3e,
- 0xd1, 0x03, 0xcd, 0xbe, 0x10, 0xd1, 0xb7, 0xbd, 0x62, 0xb7, 0x4d, 0x3e,
- 0x1a, 0x5b, 0x34, 0xbf, 0xe4, 0x81, 0x8c, 0x3e, 0x63, 0xb5, 0x1e, 0xbf,
- 0x87, 0xd5, 0xcb, 0xbe, 0xa2, 0xf9, 0x2e, 0x3d, 0xdb, 0x39, 0xc8, 0x3d,
- 0xef, 0xaa, 0xab, 0x3e, 0xfe, 0x5b, 0x08, 0xbf, 0x5b, 0xa9, 0x9c, 0x3e,
- 0x20, 0x56, 0xa1, 0x3d, 0x86, 0x84, 0xd8, 0xbe, 0x9b, 0x69, 0xc5, 0xbe,
- 0xf7, 0x35, 0x08, 0xbf, 0x68, 0x39, 0x11, 0x3f, 0xd7, 0x09, 0x74, 0x3e,
- 0x90, 0x52, 0x63, 0xbe, 0x7b, 0x86, 0x0f, 0xbf, 0xb8, 0xea, 0x9e, 0xbe,
- 0x53, 0xb4, 0x93, 0x3e, 0xca, 0xf9, 0xfa, 0x3e, 0x5d, 0xad, 0x5a, 0xbd,
- 0xf4, 0xf8, 0x79, 0x3e, 0x37, 0x68, 0x76, 0x3e, 0x2c, 0xbf, 0xdb, 0xbe,
- 0xd4, 0x07, 0xca, 0x3e, 0x5c, 0x58, 0x3c, 0xbe, 0x24, 0x86, 0xc1, 0xbe,
- 0xc4, 0x30, 0xd0, 0xbd, 0xda, 0x00, 0xea, 0x3e, 0xf4, 0x6f, 0xa5, 0xbe,
- 0x8f, 0xa4, 0xa2, 0x3d, 0x85, 0x8b, 0x89, 0x3c, 0x51, 0xe5, 0x42, 0xbf,
- 0xc3, 0xf1, 0x34, 0x3d, 0xbe, 0x88, 0xc8, 0xbd, 0xf1, 0x06, 0xca, 0x3e,
- 0xe7, 0xfd, 0x95, 0x3e, 0xca, 0xee, 0x32, 0xbf, 0x46, 0xe4, 0x5d, 0x3c,
- 0x67, 0x42, 0xbd, 0xbe, 0x28, 0x33, 0x3c, 0xbe, 0xe4, 0x55, 0x28, 0x3e,
- 0x4b, 0xd4, 0x79, 0x3e, 0x51, 0xdd, 0x8f, 0x3d, 0x08, 0xf5, 0x34, 0x3e,
- 0xbe, 0xa5, 0x85, 0xbd, 0xbb, 0x0c, 0xb2, 0xbe, 0x7d, 0x12, 0x4c, 0xbf,
- 0x9f, 0x78, 0x80, 0xbe, 0xef, 0x65, 0x73, 0xbe, 0xc9, 0x5c, 0xed, 0xbe,
- 0xb0, 0x1a, 0x00, 0x3f, 0x77, 0xbb, 0xc5, 0xbd, 0x24, 0x44, 0xdb, 0xbe,
- 0xa5, 0xad, 0x08, 0x3f, 0x13, 0xe1, 0xf1, 0x3d, 0x16, 0x34, 0x41, 0x3e,
- 0xb4, 0x4b, 0x98, 0x3e, 0xe6, 0xfc, 0x07, 0xbf, 0x8f, 0x5b, 0x79, 0xbe,
- 0x4b, 0xe9, 0xb2, 0x3d, 0x1f, 0xf3, 0x76, 0x3d, 0x7d, 0x81, 0xac, 0xbc,
- 0x34, 0x03, 0x65, 0xbd, 0x58, 0xae, 0xb9, 0xbc, 0x39, 0x91, 0x99, 0xbe,
- 0x6f, 0x18, 0xc5, 0x3d, 0x19, 0x41, 0x04, 0x3f, 0xd0, 0x40, 0xa9, 0x3e,
- 0x9a, 0x32, 0x7d, 0x3e, 0x53, 0x72, 0x6c, 0xbe, 0x7d, 0xc0, 0x30, 0x3d,
- 0x24, 0x7c, 0x9e, 0x3e, 0xdc, 0x6a, 0x39, 0x3e, 0xa5, 0x64, 0x20, 0xbf,
- 0x58, 0x8f, 0xbc, 0x3e, 0xad, 0xe0, 0x87, 0xbe, 0x30, 0x21, 0x53, 0xbe,
- 0xaf, 0x04, 0x42, 0x3d, 0x31, 0x9b, 0x8a, 0x3e, 0x00, 0x0f, 0x76, 0xbd,
- 0x3b, 0x79, 0xaa, 0xbe, 0x89, 0x18, 0xe6, 0x3d, 0x81, 0x95, 0x6d, 0x3e,
- 0x24, 0x22, 0x65, 0xbe, 0x91, 0xfe, 0xf3, 0xbd, 0x9b, 0x90, 0xc6, 0xbd,
- 0x8b, 0x12, 0x5a, 0xbd, 0xb2, 0x94, 0x90, 0x3e, 0x0d, 0x7c, 0xcb, 0x3e,
- 0x57, 0xed, 0x4c, 0xbe, 0x32, 0x6b, 0x94, 0xbe, 0x97, 0xf1, 0x60, 0xbd,
- 0xed, 0xb9, 0x03, 0xbc, 0xc6, 0xf5, 0x24, 0xbe, 0x53, 0x07, 0x5d, 0xbd,
- 0x48, 0x9b, 0x3d, 0x3e, 0x77, 0x43, 0x94, 0x3e, 0xf8, 0x94, 0x35, 0xbe,
- 0x85, 0xcd, 0x6c, 0xbe, 0x09, 0xaf, 0xb8, 0xbe, 0x50, 0x26, 0x46, 0x3e,
- 0xd4, 0x32, 0x26, 0xbe, 0x7a, 0x33, 0x77, 0xbc, 0xb4, 0x27, 0xb5, 0xbd,
- 0x59, 0xd5, 0xcc, 0xbe, 0x6e, 0x2f, 0x0f, 0xbe, 0x50, 0xb7, 0xa6, 0xbd,
- 0x89, 0xb8, 0x76, 0xbe, 0xc9, 0x15, 0x3b, 0xbc, 0x93, 0xb5, 0x0a, 0x3e,
- 0x92, 0xd0, 0xc0, 0xbd, 0x42, 0x3b, 0x02, 0xbf, 0x74, 0x3f, 0x9d, 0xbe,
- 0x96, 0x29, 0x42, 0xbd, 0xd7, 0x11, 0x42, 0x3e, 0x29, 0x88, 0x34, 0xbe,
- 0x59, 0xfa, 0x98, 0xbe, 0xf3, 0xe0, 0x94, 0x3d, 0x07, 0xff, 0x7a, 0x3e,
- 0x23, 0xdd, 0x1c, 0xbd, 0xe4, 0x23, 0x9e, 0xbd, 0x6d, 0xd9, 0x80, 0xbd,
- 0x35, 0x3e, 0xc6, 0x3c, 0x44, 0x76, 0x2d, 0x3e, 0x94, 0x49, 0x81, 0xbd,
- 0xe8, 0xfc, 0x62, 0x3e, 0x23, 0x87, 0x12, 0x3e, 0xdd, 0x48, 0xa8, 0x3d,
- 0x7f, 0xcb, 0xbf, 0xbc, 0xa2, 0x57, 0x36, 0x3d, 0x7b, 0x53, 0xa5, 0x3d,
- 0x18, 0x03, 0x3d, 0xbb, 0x65, 0x35, 0x82, 0x3e, 0xf7, 0x25, 0x07, 0x3e,
- 0xd4, 0x0c, 0x32, 0x3e, 0xf0, 0x29, 0x0a, 0x3e, 0x7a, 0x38, 0x04, 0x3d,
- 0x30, 0x7e, 0x95, 0x3e, 0x08, 0x90, 0x31, 0x3a, 0xc6, 0xce, 0x56, 0x3e,
- 0x63, 0xf9, 0x1f, 0xbd, 0x5e, 0x37, 0xb9, 0x3d, 0x35, 0xa5, 0xf5, 0xba,
- 0xa0, 0xc1, 0x7d, 0xbd, 0xd5, 0x52, 0xc2, 0xbd, 0xb5, 0x85, 0x8e, 0x3d,
- 0xc3, 0xdd, 0x0a, 0xbe, 0xf2, 0x1f, 0x68, 0xbd, 0xdf, 0x6a, 0x86, 0x3e,
- 0x09, 0x4f, 0xe6, 0xbc, 0xf3, 0xbc, 0x49, 0x3e, 0x94, 0x52, 0xfe, 0x3d,
- 0x66, 0xbd, 0x26, 0xbe, 0x8d, 0x6f, 0x5c, 0xbe, 0x7c, 0x2b, 0x89, 0x3d,
- 0xe8, 0xd4, 0x5b, 0x3e, 0x75, 0x47, 0x44, 0xbe, 0x45, 0xfb, 0x0a, 0x3e,
- 0xc5, 0xbb, 0x83, 0x3e, 0xba, 0x55, 0x43, 0x3e, 0xf0, 0x40, 0x89, 0xbc,
- 0x57, 0xef, 0x38, 0xbd, 0x5a, 0x02, 0xd8, 0xbb, 0xa3, 0x60, 0x96, 0xbd,
- 0x30, 0x08, 0x04, 0xbe, 0x74, 0x12, 0x0c, 0x3e, 0xa2, 0x3e, 0x55, 0x3d,
- 0x94, 0xc8, 0xa6, 0xbc, 0xfc, 0x43, 0x50, 0x3e, 0xd4, 0x66, 0x64, 0x3e,
- 0x29, 0x6c, 0x11, 0x3b, 0x09, 0x45, 0xf5, 0xbd, 0xc8, 0x97, 0xca, 0x3d,
- 0xa3, 0x79, 0xc7, 0x3d, 0xc9, 0x59, 0xc5, 0xbc, 0x75, 0x2b, 0x29, 0x3d,
- 0xde, 0xf4, 0x6d, 0x3e, 0x30, 0x83, 0x4c, 0x3e, 0x70, 0x3c, 0x4d, 0xbe,
- 0xf9, 0xc9, 0x98, 0xbe, 0xe9, 0xe9, 0x1e, 0xbe, 0xaa, 0xee, 0xae, 0xbe,
- 0xf9, 0x55, 0xd6, 0xbe, 0xea, 0x6a, 0x72, 0x3e, 0x38, 0x82, 0x06, 0x3e,
- 0x22, 0x26, 0x51, 0x3d, 0x1b, 0xf3, 0xaa, 0x3e, 0xdf, 0x0e, 0x23, 0x3a,
- 0x41, 0xfc, 0x1d, 0xbf, 0x26, 0xae, 0x50, 0xbe, 0xd7, 0x89, 0x61, 0xbd,
- 0x11, 0x61, 0x96, 0xbc, 0x46, 0xb8, 0x48, 0x3d, 0x8c, 0x0c, 0xe9, 0x3b,
- 0x98, 0x25, 0xb2, 0xbe, 0x47, 0x2d, 0x66, 0x3e, 0x08, 0x63, 0x21, 0x3e,
- 0x2e, 0x94, 0x2f, 0x3d, 0x2f, 0xbb, 0x95, 0xbe, 0x67, 0x42, 0x31, 0xbe,
- 0x01, 0xe2, 0x82, 0xbe, 0x71, 0x53, 0x77, 0x3e, 0x13, 0x12, 0x09, 0xbe,
- 0xe3, 0x3e, 0xaf, 0x3d, 0x24, 0x1c, 0xdf, 0x3d, 0x1b, 0x6f, 0x3a, 0xbe,
- 0xf9, 0x57, 0xa2, 0xbd, 0x50, 0xcd, 0x9f, 0x3e, 0xdb, 0x81, 0x15, 0x3e,
- 0x14, 0x51, 0x06, 0x3c, 0x8e, 0x1d, 0xa5, 0x3d, 0x97, 0x95, 0xa5, 0xbe,
- 0x0f, 0xd0, 0x22, 0x3d, 0x22, 0xa4, 0x85, 0x3e, 0x23, 0xa2, 0xd6, 0x3e,
- 0x9d, 0x13, 0x21, 0xbd, 0x7c, 0xa2, 0xbf, 0xbe, 0xc2, 0xb1, 0xbc, 0xbe,
- 0xed, 0x5e, 0xfe, 0xbe, 0xa9, 0x41, 0x97, 0xbd, 0x4b, 0x5c, 0x6f, 0x3e,
- 0x0d, 0x92, 0x80, 0x3c, 0x55, 0x54, 0x90, 0xbe, 0xb2, 0xb0, 0x09, 0xbf,
- 0xbf, 0x35, 0xd5, 0xbe, 0x00, 0x5b, 0xaf, 0x3e, 0x9d, 0xa7, 0x25, 0xbe,
- 0x99, 0xfc, 0x62, 0x3e, 0x5e, 0xaf, 0xb3, 0x3c, 0x77, 0x51, 0xc2, 0xbd,
- 0xa9, 0xe2, 0x0b, 0xbe, 0xa5, 0x6a, 0x87, 0xbb, 0xad, 0xb3, 0xc9, 0x3c,
- 0xf7, 0x60, 0xa4, 0xbe, 0x82, 0x7c, 0x35, 0x3e, 0x6b, 0x4c, 0x04, 0xbe,
- 0x91, 0xc7, 0xc2, 0xbd, 0x09, 0x3d, 0x2d, 0xbe, 0xab, 0xf7, 0xcb, 0xbd,
- 0xc6, 0x75, 0x74, 0x3d, 0x77, 0x80, 0x06, 0x3e, 0x5f, 0x94, 0x84, 0xbf,
- 0x0f, 0x15, 0x40, 0xbd, 0x0b, 0x5f, 0xca, 0xbc, 0x33, 0x49, 0x16, 0xbe,
- 0x7d, 0x04, 0x69, 0xbd, 0xcb, 0x45, 0xd9, 0xbc, 0xca, 0x9f, 0x62, 0xbe,
- 0x05, 0x31, 0xae, 0xbe, 0xa1, 0xc9, 0x02, 0x3e, 0x46, 0x9f, 0xb6, 0xbe,
- 0x6c, 0x9b, 0xf4, 0xbe, 0x87, 0x24, 0x8d, 0x3e, 0xf8, 0xcd, 0x9f, 0xbc,
- 0x87, 0xb4, 0xa1, 0xbe, 0x70, 0x7a, 0x2f, 0xbf, 0x93, 0xd5, 0x7c, 0x3d,
- 0x93, 0x87, 0x11, 0xbe, 0x37, 0x59, 0x09, 0xbf, 0xbc, 0x48, 0x0e, 0x3c,
- 0x47, 0x23, 0x26, 0xbe, 0xb3, 0xaf, 0xe2, 0xbe, 0xb7, 0x23, 0x9a, 0x3e,
- 0x47, 0xa8, 0xbf, 0x3e, 0x35, 0x8f, 0xd9, 0x3e, 0x42, 0x42, 0x08, 0xbd,
- 0x87, 0x13, 0x67, 0xbc, 0xe7, 0x2c, 0xa9, 0x3e, 0x72, 0x5a, 0x0e, 0xbf,
- 0x40, 0xdf, 0x78, 0x3e, 0xe6, 0x59, 0xfd, 0xbe, 0x61, 0x2b, 0x94, 0x3e,
- 0xd2, 0x8e, 0x83, 0xbe, 0x3b, 0x0b, 0xd4, 0xbd, 0x38, 0x16, 0x2b, 0xbd,
- 0x95, 0x82, 0x00, 0x3f, 0x38, 0x95, 0xb8, 0xbe, 0xd4, 0xe1, 0xf0, 0xbd,
- 0xa9, 0x25, 0x22, 0xbf, 0x7d, 0x27, 0x00, 0xbf, 0x5a, 0xbc, 0x24, 0xbf,
- 0x46, 0xb8, 0xd1, 0x3e, 0xc3, 0xb8, 0x6f, 0x3e, 0x4e, 0x47, 0xbf, 0xbe,
- 0x9e, 0xe8, 0x87, 0xbd, 0xe3, 0x6c, 0x00, 0x3f, 0xfb, 0x34, 0xec, 0x3d,
- 0x98, 0xbb, 0xa5, 0xbe, 0x96, 0x2b, 0x22, 0x3f, 0x42, 0x78, 0xd7, 0xbe,
- 0xc7, 0x8b, 0x17, 0x3c, 0xa9, 0xc3, 0x4a, 0x3e, 0x85, 0x7f, 0xdc, 0x3d,
- 0xab, 0x12, 0x0c, 0xbe, 0xaa, 0xc5, 0xec, 0xbd, 0x71, 0x87, 0x66, 0xbe,
- 0xe1, 0xbe, 0x76, 0x3e, 0xd1, 0x91, 0xf0, 0x3e, 0x3f, 0x33, 0x00, 0x3e,
- 0xb5, 0xc8, 0xd2, 0x3d, 0xcb, 0xf5, 0x00, 0x3f, 0x78, 0xfc, 0x9c, 0xbe,
- 0x3a, 0x4d, 0x06, 0xbf, 0xa6, 0x59, 0x3b, 0xbe, 0x5e, 0x80, 0x79, 0x3d,
- 0x89, 0x60, 0x99, 0xbe, 0x38, 0x64, 0x0a, 0x3e, 0x75, 0x73, 0x8d, 0xbe,
- 0x50, 0x60, 0x21, 0xbe, 0xd5, 0xfb, 0x92, 0xbd, 0xa8, 0x14, 0x63, 0x3c,
- 0xc1, 0x99, 0xb2, 0x3e, 0x3a, 0x18, 0xb2, 0xbd, 0xe5, 0xfe, 0x39, 0x3e,
- 0x29, 0x73, 0x0b, 0x3f, 0x59, 0xfb, 0xa9, 0x3d, 0xd6, 0x14, 0x7e, 0xbe,
- 0x21, 0xbc, 0xad, 0x3e, 0x91, 0xec, 0xa3, 0xbc, 0xff, 0x73, 0x22, 0xbf,
- 0x0a, 0xeb, 0x64, 0xbe, 0x0f, 0x23, 0xb4, 0xbe, 0x22, 0x7e, 0xab, 0xbe,
- 0xd0, 0x33, 0xa8, 0xbd, 0xff, 0xfd, 0xb5, 0xbd, 0x7f, 0x2c, 0x86, 0xbd,
- 0x82, 0x5c, 0xc0, 0xbc, 0x50, 0x0c, 0xa1, 0x3e, 0x42, 0x30, 0x35, 0x3e,
- 0xd2, 0x44, 0x87, 0x3c, 0xe5, 0x92, 0xce, 0x3e, 0xe2, 0xad, 0x67, 0xbc,
- 0xbf, 0xdc, 0x08, 0xbe, 0x01, 0xd6, 0xe4, 0x3e, 0xca, 0xb2, 0x23, 0xbe,
- 0xf2, 0xbd, 0x0b, 0xbe, 0xb8, 0xb9, 0xd2, 0xbe, 0xf5, 0x17, 0xce, 0x3e,
- 0xfc, 0x8f, 0x66, 0xbe, 0x43, 0xc9, 0x9f, 0xbd, 0xd8, 0x57, 0x01, 0xbe,
- 0x38, 0x9c, 0x16, 0xbf, 0x09, 0xa7, 0x11, 0xbf, 0x09, 0x26, 0x5b, 0x3e,
- 0x43, 0xf7, 0x4a, 0x3e, 0x9d, 0xc7, 0xd6, 0xbd, 0xb1, 0x62, 0x2d, 0x3e,
- 0x71, 0x29, 0xb0, 0x3e, 0x87, 0xf1, 0x52, 0xbe, 0xa5, 0xdb, 0x10, 0xbe,
- 0x50, 0x3a, 0x83, 0xbd, 0x87, 0x9d, 0x4d, 0xbd, 0x6e, 0xdc, 0xa1, 0xbe,
- 0x2e, 0xc6, 0xa7, 0xbe, 0x74, 0x0e, 0xc3, 0xbe, 0xc0, 0x0b, 0xdd, 0x3e,
- 0xe3, 0x9c, 0x54, 0x3e, 0x4e, 0xe6, 0xf4, 0xbd, 0xc3, 0x46, 0x3f, 0xbf,
- 0x36, 0xd7, 0xa8, 0x3e, 0x87, 0xee, 0x96, 0x3d, 0xcd, 0x0c, 0xaa, 0xbe,
- 0x51, 0xf9, 0x43, 0xbe, 0xc5, 0xcf, 0xe4, 0x3e, 0x7b, 0x37, 0x2f, 0x3d,
- 0x05, 0xc1, 0x93, 0x3e, 0x3a, 0x7e, 0x03, 0x3e, 0xda, 0x09, 0x20, 0x3e,
- 0xc6, 0xaa, 0x06, 0x3d, 0xaf, 0xb5, 0x02, 0xbd, 0x55, 0x67, 0xc9, 0xbd,
- 0xda, 0xb5, 0x91, 0x3d, 0x70, 0x3d, 0x21, 0x3e, 0x27, 0xbc, 0x56, 0x3e,
- 0x36, 0x97, 0x17, 0xbd, 0xa5, 0xe8, 0x6d, 0x3d, 0xa2, 0x62, 0x8c, 0x3e,
- 0xef, 0x14, 0xcc, 0xbe, 0x1e, 0x77, 0x6f, 0xbe, 0x88, 0xe0, 0x82, 0xbe,
- 0xbd, 0x0f, 0xf4, 0xbe, 0x2e, 0x13, 0xb8, 0x3d, 0xec, 0x65, 0xe0, 0xbe,
- 0x67, 0x8e, 0x97, 0x3e, 0x70, 0xb1, 0xfb, 0x3d, 0x26, 0x6b, 0x14, 0x3e,
- 0x5a, 0x2d, 0xd7, 0x3d, 0x26, 0x0f, 0x96, 0xbe, 0xb5, 0xe4, 0x8f, 0x3e,
- 0xd5, 0x78, 0xc3, 0x3e, 0x2d, 0xad, 0xb4, 0x3e, 0xb5, 0xfc, 0x85, 0xbe,
- 0x5d, 0xa2, 0x42, 0x3e, 0x50, 0xd1, 0x0b, 0xbe, 0x23, 0x0e, 0x77, 0xbe,
- 0x50, 0x93, 0x7b, 0xbd, 0x44, 0xa8, 0x18, 0x3e, 0xfa, 0x98, 0xa7, 0xbf,
- 0x4a, 0x02, 0x31, 0xbd, 0x2e, 0x24, 0xad, 0xbe, 0xfd, 0x2e, 0x42, 0xbf,
- 0x93, 0x19, 0xef, 0x3e, 0xf6, 0x66, 0x5f, 0xbf, 0xbe, 0x3b, 0x39, 0x3e,
- 0x4d, 0x4b, 0xa0, 0xbe, 0x4f, 0x19, 0x50, 0x3e, 0xe6, 0x63, 0x92, 0xbf,
- 0xa1, 0x71, 0xcf, 0x3c, 0xce, 0xca, 0x43, 0xbd, 0x79, 0xaf, 0x04, 0xc0,
- 0x84, 0x3c, 0xb3, 0xbc, 0xea, 0x2b, 0x11, 0x3c, 0x0d, 0x69, 0xaf, 0xbe,
- 0x70, 0xca, 0x09, 0x3f, 0x81, 0x75, 0x67, 0x3d, 0xfd, 0x01, 0xc6, 0x3c,
- 0x3f, 0xf6, 0xd7, 0xbd, 0x91, 0x58, 0x4c, 0xbe, 0x8b, 0x3f, 0x72, 0xbe,
- 0xe9, 0xd2, 0x70, 0x3e, 0x49, 0x97, 0x6b, 0x3e, 0x36, 0x37, 0x2d, 0xbe,
- 0xdf, 0xcb, 0x30, 0xbf, 0xf0, 0xa5, 0xa2, 0x3d, 0x18, 0x47, 0x08, 0xbf,
- 0x99, 0xc2, 0xaf, 0x3e, 0x04, 0x1f, 0x6a, 0x3e, 0x65, 0xda, 0x38, 0xbe,
- 0xf9, 0x81, 0xa1, 0x3e, 0x78, 0x0f, 0xd8, 0x3e, 0xd9, 0xb5, 0x63, 0xbd,
- 0x48, 0x60, 0xdb, 0xbd, 0x85, 0x12, 0x96, 0x3e, 0xaa, 0xb6, 0x92, 0x3e,
- 0xfc, 0x3f, 0x02, 0x3d, 0xee, 0x02, 0x39, 0xbd, 0x02, 0x0f, 0x35, 0xbe,
- 0x29, 0x2d, 0x7f, 0x3e, 0xd7, 0x53, 0x63, 0x3d, 0x09, 0xb3, 0xba, 0x3e,
- 0x4f, 0x3d, 0x50, 0x3e, 0x8c, 0x52, 0x04, 0xbe, 0x58, 0xae, 0xbe, 0xbc,
- 0x81, 0x3c, 0xd2, 0x3e, 0xf4, 0xda, 0xc4, 0xbe, 0xaa, 0x7a, 0x9a, 0x3e,
- 0x3c, 0x7c, 0x21, 0x3f, 0x8f, 0x32, 0xf5, 0x3d, 0xb1, 0xbd, 0x88, 0xbe,
- 0x7b, 0xa7, 0xe4, 0xbe, 0x03, 0xda, 0x0c, 0x3c, 0x24, 0xde, 0x2a, 0x3d,
- 0x80, 0x89, 0x38, 0xbd, 0xd3, 0xbc, 0x4d, 0xbe, 0x6c, 0x82, 0x7d, 0xbe,
- 0xe6, 0xcf, 0x24, 0xbe, 0xb1, 0xd4, 0x14, 0x3f, 0x70, 0x7c, 0x2c, 0x3e,
- 0xed, 0x9d, 0x03, 0xbc, 0xb5, 0x08, 0x98, 0x3e, 0x9c, 0xfe, 0x4c, 0x3e,
- 0x78, 0x14, 0x41, 0xbf, 0x4e, 0xfd, 0x6b, 0x3e, 0xa2, 0x3a, 0xa8, 0x3e,
- 0xc0, 0xda, 0xfe, 0xbd, 0xfb, 0x8f, 0xab, 0x3e, 0x12, 0x34, 0x19, 0xbe,
- 0x21, 0xef, 0x03, 0x3f, 0x7b, 0x1e, 0x83, 0xbe, 0x76, 0x9a, 0xb6, 0x3d,
- 0xb2, 0x9e, 0xea, 0x3e, 0x79, 0xcb, 0x8c, 0xbe, 0x9a, 0xd0, 0x6f, 0xbe,
- 0xf6, 0xa4, 0xe7, 0xbb, 0x14, 0x23, 0xaf, 0xbc, 0x97, 0x72, 0x88, 0xbc,
- 0xcd, 0x6d, 0xb8, 0xbe, 0x73, 0xf9, 0x01, 0xbd, 0x51, 0x69, 0x14, 0x3e,
- 0x28, 0xce, 0xeb, 0x3c, 0xa1, 0xa1, 0x86, 0x3d, 0x12, 0x9c, 0xc4, 0xbe,
- 0x53, 0x33, 0xa7, 0xbe, 0x2f, 0x22, 0xb5, 0xbe, 0x15, 0xbc, 0x45, 0x3e,
- 0xf1, 0x15, 0x6b, 0xbe, 0x15, 0xac, 0x10, 0x3e, 0x61, 0x22, 0x27, 0xbe,
- 0x5a, 0x4a, 0x4d, 0xbc, 0x53, 0x84, 0x63, 0xbe, 0xda, 0x27, 0x31, 0xbe,
- 0x71, 0x8d, 0x7c, 0xbe, 0x8f, 0xa5, 0xa3, 0xbe, 0xdb, 0xe0, 0x4d, 0x3b,
- 0xe6, 0xfe, 0x97, 0xbe, 0x35, 0xc1, 0xe3, 0x3d, 0x83, 0xec, 0x60, 0x3d,
- 0x77, 0xd6, 0x49, 0x3e, 0x72, 0x09, 0xa0, 0xbe, 0x2d, 0x0a, 0x4d, 0xbe,
- 0x17, 0x07, 0x18, 0xbd, 0xd2, 0xa4, 0x8c, 0xbe, 0x97, 0x09, 0xa1, 0xbc,
- 0xd6, 0x63, 0x9a, 0xbe, 0x66, 0x96, 0xa2, 0x3e, 0x83, 0xa5, 0x39, 0xbf,
- 0x94, 0x9a, 0x05, 0xbf, 0x0a, 0x39, 0xf0, 0xbe, 0x0a, 0x05, 0x52, 0xbc,
- 0x4d, 0x95, 0x31, 0x3c, 0x86, 0x66, 0x92, 0xbe, 0xb4, 0x2b, 0x11, 0x3e,
- 0x74, 0x5d, 0x74, 0xbd, 0x06, 0x55, 0x38, 0xbc, 0xb6, 0xca, 0x05, 0x3e,
- 0x1f, 0x23, 0x81, 0xbf, 0x21, 0xe8, 0x9a, 0xbd, 0x69, 0xe5, 0x14, 0x3e,
- 0x43, 0x47, 0xb2, 0x3d, 0x05, 0x8c, 0x57, 0xbe, 0x87, 0x1a, 0x2c, 0x3e,
- 0xb2, 0x3a, 0x80, 0x3e, 0x63, 0xd1, 0xa4, 0xbe, 0x43, 0xdd, 0x66, 0xbe,
- 0x9f, 0xdf, 0x51, 0x3e, 0x55, 0x97, 0x16, 0xbe, 0x7f, 0x3e, 0xa5, 0xbe,
- 0x56, 0x82, 0x78, 0xbe, 0x83, 0xd8, 0xe4, 0x3d, 0x3c, 0xa0, 0x6f, 0xbd,
- 0xe7, 0x9c, 0x01, 0x3e, 0xe1, 0x9b, 0xd9, 0x3d, 0x37, 0x67, 0x0d, 0xbe,
- 0x88, 0xde, 0xe3, 0xbe, 0x14, 0xe7, 0x8e, 0x3e, 0xaf, 0x5b, 0xc5, 0xbe,
- 0x29, 0x89, 0x66, 0xbe, 0xc4, 0x15, 0x57, 0xbe, 0x0a, 0x5d, 0x14, 0x3f,
- 0xd6, 0x33, 0xbd, 0xbe, 0x52, 0x93, 0xa8, 0x3e, 0xda, 0xe4, 0x9f, 0x3d,
- 0xdf, 0x18, 0x88, 0x3e, 0x7a, 0xa6, 0x15, 0xbe, 0xd0, 0x57, 0xd4, 0x3e,
- 0xe7, 0x19, 0xf1, 0x3e, 0xe8, 0xe1, 0x02, 0x3e, 0x86, 0x9c, 0x3e, 0xbd,
- 0xfc, 0x36, 0x3c, 0x3e, 0x05, 0x92, 0x2f, 0x3e, 0xb7, 0x23, 0x4a, 0xbe,
- 0x7f, 0x1b, 0x53, 0xbf, 0xde, 0xbf, 0x45, 0xbf, 0x94, 0x7b, 0xd4, 0x3d,
- 0xa1, 0x61, 0x27, 0xbe, 0x16, 0x12, 0xd8, 0xbe, 0xd6, 0xeb, 0xfc, 0x3d,
- 0x7d, 0x1f, 0xca, 0xbe, 0xcb, 0x97, 0xf7, 0x3e, 0xbe, 0x96, 0x8a, 0xbd,
- 0x0e, 0x81, 0x6a, 0x3e, 0xd6, 0x19, 0x77, 0xbe, 0x0e, 0xf6, 0x36, 0xbf,
- 0x39, 0x85, 0xd3, 0xbd, 0xc9, 0x51, 0x0e, 0xbf, 0x9d, 0x01, 0xda, 0x3e,
- 0xc8, 0x67, 0x9e, 0x3c, 0x82, 0x0d, 0x48, 0x3e, 0x60, 0x1c, 0x0c, 0xbd,
- 0x47, 0x7d, 0xc8, 0xbb, 0x66, 0xaa, 0xd6, 0xbe, 0x70, 0xc6, 0x01, 0x3d,
- 0x98, 0xf0, 0x12, 0xbf, 0xd3, 0xab, 0x1b, 0xbf, 0x05, 0x73, 0x5d, 0x3e,
- 0x8e, 0xb5, 0x11, 0xbf, 0x63, 0x5c, 0xac, 0x3d, 0xf7, 0xc0, 0x58, 0xbe,
- 0x1e, 0x17, 0xa3, 0x39, 0x3f, 0x97, 0x6e, 0x3d, 0x56, 0x7d, 0xa1, 0xbe,
- 0x5f, 0x3b, 0xb7, 0xbe, 0x57, 0x4b, 0x08, 0xbf, 0x07, 0x5d, 0x5f, 0xbd,
- 0x66, 0x2f, 0x44, 0xbe, 0x34, 0x4a, 0x0c, 0x3e, 0xfc, 0x80, 0x3f, 0x3e,
- 0xea, 0xa0, 0xca, 0xbe, 0x04, 0xe5, 0x84, 0x3e, 0xa5, 0x65, 0xfc, 0x3c,
- 0x82, 0xa4, 0x82, 0xbe, 0xe5, 0x47, 0xd3, 0xbe, 0x68, 0x4f, 0x33, 0x3d,
- 0xc3, 0x86, 0xfb, 0xbe, 0xa2, 0x42, 0x37, 0x3e, 0x2c, 0x03, 0x5e, 0xbe,
- 0x88, 0x85, 0xed, 0x3d, 0x11, 0x70, 0xde, 0x3a, 0xf7, 0xb4, 0x33, 0x3e,
- 0x98, 0x47, 0x26, 0xbe, 0x9a, 0x82, 0x88, 0xbe, 0x44, 0xbd, 0xab, 0xbe,
- 0xb4, 0xb7, 0x07, 0x3e, 0x33, 0x0e, 0xf3, 0x3d, 0xf1, 0xcf, 0x5d, 0x3e,
- 0x13, 0x3a, 0x9d, 0xbe, 0x6a, 0x32, 0xb6, 0xbd, 0x0e, 0x60, 0x45, 0xbe,
- 0x71, 0x0c, 0x1c, 0xbe, 0x8a, 0x6f, 0xc0, 0xbd, 0x8d, 0x23, 0x2d, 0xbc,
- 0xb3, 0xf4, 0xd5, 0x3a, 0x88, 0xbc, 0x3f, 0xbd, 0xab, 0xf3, 0x34, 0xbe,
- 0x6f, 0x6f, 0x7a, 0x3e, 0x24, 0xe6, 0x44, 0xbd, 0x59, 0x5c, 0xd9, 0xbe,
- 0x97, 0xe9, 0xf2, 0x3d, 0x67, 0x57, 0x99, 0xbe, 0x0b, 0x39, 0x8b, 0x3e,
- 0xb8, 0x3a, 0x86, 0xbd, 0x7d, 0x3b, 0xb5, 0xbe, 0xdf, 0xc5, 0x2b, 0xbe,
- 0xf6, 0xeb, 0xa3, 0xbe, 0xc4, 0x2e, 0xa6, 0x3e, 0x97, 0x5e, 0xf7, 0x3d,
- 0xd4, 0x65, 0x40, 0xbe, 0xdc, 0xe0, 0xe0, 0xbe, 0x57, 0x19, 0xfa, 0xbe,
- 0xdb, 0xf1, 0x0b, 0xbf, 0x5a, 0xdc, 0x32, 0x3e, 0x53, 0x8c, 0x9c, 0xbd,
- 0x24, 0x77, 0xbc, 0xbe, 0xb5, 0x2a, 0x27, 0x3e, 0x50, 0x73, 0x50, 0x3d,
- 0x38, 0x92, 0x33, 0xbe, 0x58, 0x06, 0x87, 0x3e, 0xc8, 0xb7, 0xfe, 0xbc,
- 0xb9, 0x63, 0x6b, 0x3e, 0xc3, 0xb4, 0x13, 0xbf, 0x69, 0xbf, 0xf3, 0xbc,
- 0x6c, 0x21, 0x00, 0xbf, 0xe4, 0x64, 0x88, 0xbd, 0x1b, 0xa0, 0x62, 0x3b,
- 0xdd, 0x89, 0x1e, 0xbe, 0xc2, 0x4f, 0x17, 0x3d, 0xf9, 0xe6, 0xcc, 0xbd,
- 0x24, 0x5c, 0xab, 0x3d, 0x2d, 0x42, 0xba, 0xbd, 0x22, 0xbe, 0x85, 0x3d,
- 0x96, 0x83, 0xc1, 0x3c, 0xc7, 0x93, 0x04, 0xbd, 0xf0, 0x78, 0xa9, 0x3d,
- 0xb1, 0x64, 0xb3, 0xbd, 0x71, 0x02, 0x6f, 0xb9, 0x8f, 0xad, 0x12, 0xbf,
- 0xac, 0x16, 0x52, 0x3d, 0xdb, 0x55, 0x0c, 0xbe, 0xfc, 0xb9, 0xd3, 0xbd,
- 0xc2, 0xe4, 0xb1, 0xbe, 0x06, 0x87, 0xeb, 0x3e, 0xfb, 0x93, 0x58, 0xbf,
- 0x2e, 0x70, 0x74, 0xbc, 0x06, 0x5d, 0xd8, 0x3d, 0x08, 0x41, 0x0e, 0x3e,
- 0x6c, 0x0c, 0x56, 0xbc, 0x1c, 0x5e, 0x75, 0x3e, 0x4d, 0x2a, 0xd8, 0x3d,
- 0x71, 0x0c, 0xe7, 0x3e, 0x5f, 0x7d, 0x8e, 0x3e, 0x82, 0x83, 0xe2, 0xbe,
- 0x65, 0xea, 0xc4, 0x3e, 0x8a, 0x0a, 0x11, 0xbe, 0x77, 0xd7, 0xc2, 0xbc,
- 0x77, 0xb8, 0x5a, 0x3e, 0x8e, 0xe7, 0x95, 0x3e, 0x40, 0x25, 0xbc, 0xbe,
- 0x0b, 0xf4, 0x7c, 0xbe, 0x4c, 0xbf, 0x0c, 0xbe, 0xe1, 0xe3, 0x93, 0xbd,
- 0x9a, 0xae, 0xc8, 0xbe, 0x54, 0xfc, 0x06, 0x3e, 0xad, 0x95, 0xa1, 0x3e,
- 0x28, 0x8b, 0x39, 0xbe, 0xbf, 0x95, 0xaf, 0x3e, 0xa4, 0x2d, 0x13, 0xbe,
- 0xda, 0x1c, 0x0b, 0xbf, 0xb8, 0x1c, 0xad, 0x3d, 0xd6, 0xe5, 0xd3, 0xbe,
- 0xc2, 0x72, 0xed, 0xbe, 0xda, 0x37, 0x4c, 0x3e, 0x25, 0x0d, 0xef, 0x3e,
- 0xe6, 0x44, 0x46, 0xbe, 0xfb, 0xb2, 0xbc, 0xbd, 0x90, 0xda, 0xab, 0x3e,
- 0xf4, 0xaa, 0x44, 0x3f, 0x49, 0x96, 0x0d, 0x3f, 0x86, 0x85, 0xc0, 0xbd,
- 0xff, 0x75, 0x8d, 0xbd, 0xa0, 0x36, 0xaa, 0xbe, 0x14, 0x3e, 0x65, 0x3e,
- 0x1d, 0x71, 0x2d, 0xbf, 0x62, 0x7e, 0xad, 0x3e, 0xad, 0x87, 0x8c, 0x3e,
- 0x00, 0x72, 0x3d, 0xbe, 0xe3, 0x2a, 0x1b, 0xbf, 0xf8, 0x9a, 0x5e, 0x3e,
- 0xc2, 0x72, 0x5d, 0x3e, 0xaf, 0x9e, 0x4e, 0xbe, 0x1a, 0x8b, 0xc7, 0xbd,
- 0xf6, 0x92, 0xc5, 0xbb, 0x81, 0xa1, 0xc1, 0xbc, 0x8c, 0xe9, 0x80, 0x3d,
- 0xf9, 0x39, 0x04, 0xbf, 0x94, 0x14, 0xd1, 0xbc, 0x08, 0x14, 0x92, 0x3d,
- 0x57, 0x82, 0x4a, 0xbe, 0xa7, 0xa6, 0x93, 0x3c, 0x96, 0x7f, 0x67, 0x3e,
- 0x37, 0xd0, 0x83, 0x3e, 0xa1, 0xb5, 0xc7, 0xbe, 0xef, 0xe3, 0xb9, 0x3e,
- 0xf7, 0x45, 0xc7, 0xbe, 0xdb, 0x57, 0xac, 0xbd, 0xd7, 0x84, 0x19, 0xbe,
- 0x58, 0xcf, 0x31, 0x3e, 0x3f, 0x13, 0x22, 0x3e, 0x6a, 0x1d, 0xfe, 0x3d,
- 0x91, 0x44, 0xeb, 0xbe, 0xec, 0xaf, 0xa4, 0x3e, 0xbb, 0x06, 0x27, 0xbe,
- 0x65, 0xb2, 0x09, 0xbf, 0xee, 0x03, 0xbf, 0xbd, 0x8c, 0x28, 0xc2, 0xbe,
- 0xa2, 0x1a, 0x11, 0xbe, 0x69, 0x7a, 0x51, 0x3d, 0x62, 0xaf, 0xc1, 0xbe,
- 0xc5, 0x55, 0x01, 0x3f, 0x99, 0xf5, 0x05, 0xbf, 0x5d, 0x58, 0xb1, 0xbe,
- 0xd2, 0xf3, 0x09, 0xbe, 0xd3, 0xdd, 0xad, 0xbe, 0x60, 0xd0, 0xc2, 0x3e,
- 0x67, 0x08, 0x3d, 0x3e, 0xa8, 0x3e, 0xac, 0xbe, 0xd1, 0x08, 0xb2, 0x3e,
- 0xc2, 0xfd, 0x05, 0x3e, 0xd3, 0xfd, 0x80, 0xbe, 0x9a, 0xc7, 0x11, 0xbe,
- 0x2e, 0x4a, 0x68, 0x3e, 0x78, 0x59, 0xaa, 0x3d, 0x20, 0xe4, 0x6c, 0x3c,
- 0x8a, 0x7e, 0x82, 0x3e, 0xaf, 0xc7, 0x98, 0x3d, 0xc9, 0xa4, 0x28, 0xbf,
- 0x00, 0xd7, 0xca, 0xbe, 0xe0, 0xbb, 0xb0, 0xbe, 0xa7, 0xff, 0xd1, 0x3e,
- 0xbf, 0x27, 0xc2, 0xbe, 0x57, 0xe4, 0xee, 0xbd, 0x17, 0xdc, 0x16, 0xbf,
- 0x9d, 0xe6, 0x62, 0xbe, 0x0d, 0xec, 0x61, 0xbe, 0x52, 0x3a, 0x3c, 0xbe,
- 0x65, 0x5d, 0x4c, 0x3e, 0x40, 0x57, 0xc4, 0xbd, 0x69, 0xc2, 0x2f, 0xbe,
- 0xeb, 0x68, 0x58, 0x3e, 0xfb, 0xcc, 0xa2, 0xbe, 0xe6, 0xf4, 0x23, 0xbf,
- 0x13, 0xd2, 0x23, 0x3e, 0xf4, 0xd4, 0xfb, 0xbd, 0x8c, 0x4f, 0x3e, 0x3f,
- 0x29, 0x73, 0xce, 0x3e, 0xf5, 0x96, 0xf9, 0xbe, 0xe5, 0x9e, 0xad, 0x3d,
- 0x8d, 0x93, 0xab, 0xbd, 0x7c, 0xbd, 0x62, 0xbd, 0x82, 0x0d, 0x97, 0xbe,
- 0x4f, 0x7a, 0xda, 0xbd, 0x4a, 0x2b, 0xe0, 0xbd, 0x8a, 0xf6, 0xc5, 0x3e,
- 0x31, 0x2b, 0x99, 0xbe, 0xa3, 0x2b, 0x63, 0xbe, 0x92, 0xf5, 0xe4, 0x3e,
- 0x61, 0x7b, 0x07, 0x3e, 0xc6, 0x6c, 0xcc, 0x3d, 0x80, 0xfa, 0x95, 0x3a,
- 0xe4, 0xdf, 0x96, 0xbe, 0xe0, 0x6c, 0x50, 0x3e, 0xda, 0xa7, 0x36, 0x3e,
- 0x65, 0x18, 0xe1, 0x3d, 0xe3, 0x31, 0xcd, 0x3c, 0x63, 0x11, 0x77, 0x3e,
- 0x67, 0xed, 0xce, 0x3e, 0xd6, 0x7d, 0x30, 0xbe, 0x56, 0x1a, 0xd2, 0x3d,
- 0x54, 0xaf, 0x10, 0x3e, 0x4d, 0xb5, 0x9a, 0x3d, 0xaf, 0x81, 0xc7, 0x3d,
- 0xe8, 0xcf, 0x56, 0xbe, 0xec, 0xff, 0xb6, 0xbe, 0x35, 0xa9, 0x63, 0xbe,
- 0x4d, 0xe6, 0xcb, 0x3e, 0x73, 0x21, 0xbf, 0x3d, 0x2a, 0xfb, 0x64, 0xbe,
- 0x29, 0x3c, 0x14, 0x3e, 0x14, 0x70, 0xf2, 0xbe, 0xa9, 0x64, 0x9f, 0xbe,
- 0x6c, 0x55, 0x0e, 0x3d, 0xba, 0xe2, 0xc2, 0xbd, 0xca, 0xfd, 0x24, 0x3c,
- 0xfd, 0x95, 0xc9, 0x3d, 0x2e, 0x24, 0x5b, 0xbf, 0x1b, 0x63, 0x14, 0xbf,
- 0x51, 0x19, 0x83, 0x3e, 0xb3, 0xbc, 0x81, 0x3c, 0x62, 0x3f, 0x4c, 0xbd,
- 0x69, 0xa6, 0xb2, 0xbe, 0x12, 0x86, 0x0e, 0x3e, 0x40, 0x69, 0xa2, 0xbe,
- 0x91, 0x72, 0xfa, 0xbd, 0xa4, 0xbc, 0x9c, 0xbe, 0x34, 0x13, 0x05, 0xbe,
- 0xa1, 0x71, 0x0c, 0x3f, 0xc0, 0xbb, 0x55, 0xbd, 0x2f, 0x26, 0xc5, 0xbc,
- 0x27, 0x37, 0x90, 0xbe, 0x60, 0xa0, 0x3e, 0xbf, 0x5a, 0xf8, 0xac, 0xbe,
- 0x03, 0x9c, 0x08, 0xbd, 0xa9, 0xa5, 0x9a, 0xbe, 0x48, 0xf9, 0x17, 0xbf,
- 0xe5, 0xa6, 0xe4, 0xbc, 0x1b, 0x68, 0x12, 0x3e, 0xa0, 0xaa, 0xcf, 0x3e,
- 0xc5, 0xc8, 0xe5, 0x3c, 0x6b, 0xfc, 0x7c, 0x3e, 0x4d, 0x2d, 0x01, 0xbe,
- 0x04, 0x03, 0x0c, 0x3e, 0xf1, 0xbe, 0x31, 0x3e, 0x8e, 0x97, 0xf3, 0xbe,
- 0x67, 0x9d, 0xf0, 0xbe, 0x96, 0xb3, 0x52, 0x3e, 0xc9, 0x41, 0x80, 0x3d,
- 0xcb, 0x78, 0x10, 0x3f, 0xb2, 0xc9, 0x05, 0xbe, 0xab, 0xae, 0xac, 0x3e,
- 0x7d, 0x8d, 0xd6, 0x3d, 0xf4, 0x5f, 0xc2, 0xbe, 0x05, 0x83, 0x39, 0x3d,
- 0xe7, 0xb3, 0xab, 0xbd, 0x8a, 0xb6, 0x46, 0x3c, 0x07, 0xb8, 0xa4, 0xbd,
- 0xdd, 0x60, 0xaf, 0xbd, 0xeb, 0x6b, 0x24, 0x3d, 0xa8, 0x96, 0x8d, 0xbe,
- 0x49, 0x1a, 0xea, 0x3c, 0x4c, 0x4a, 0xdb, 0x3d, 0x1c, 0x3d, 0x5c, 0x3e,
- 0xe2, 0xe8, 0xc5, 0xbd, 0xf8, 0xbe, 0xf3, 0xbd, 0xca, 0x1a, 0x6f, 0xbd,
- 0xca, 0x47, 0xe5, 0xbe, 0x46, 0x5f, 0xe3, 0xbd, 0x02, 0x58, 0xa4, 0x3e,
- 0x4a, 0xf9, 0x60, 0xbd, 0x84, 0x6c, 0xa3, 0xbe, 0xa7, 0x8d, 0xb2, 0xbd,
- 0xad, 0xc1, 0x7d, 0x3c, 0x9c, 0x32, 0x23, 0x3e, 0xb5, 0x10, 0xd5, 0x3d,
- 0x15, 0xb3, 0xb0, 0xbe, 0x89, 0xad, 0x93, 0xbd, 0x6c, 0x3c, 0x11, 0x3f,
- 0xe7, 0x5b, 0x5d, 0xbd, 0xa1, 0x2c, 0x36, 0x3e, 0x7d, 0x10, 0xc6, 0x3e,
- 0xfc, 0x32, 0x92, 0x3d, 0x3d, 0x17, 0x17, 0xbf, 0x32, 0x52, 0xbd, 0x3c,
- 0xcb, 0x51, 0x59, 0xbd, 0xe3, 0x94, 0x02, 0x3e, 0x38, 0x75, 0x91, 0x3d,
- 0x9b, 0x6c, 0xe3, 0x3d, 0xaa, 0xe0, 0x51, 0xbe, 0xb9, 0x19, 0x82, 0xbe,
- 0x41, 0x51, 0x51, 0xbe, 0xe9, 0x70, 0x19, 0x3d, 0x3d, 0xeb, 0xeb, 0xbd,
- 0x6c, 0x55, 0xf3, 0xbb, 0x33, 0x16, 0xdc, 0xbe, 0xd5, 0xab, 0x15, 0x3f,
- 0xdb, 0x2c, 0x6c, 0x3e, 0x20, 0xb6, 0x1a, 0x3f, 0x12, 0x5f, 0x5f, 0x3e,
- 0xbd, 0x5c, 0xf3, 0xbe, 0xc8, 0xaf, 0x34, 0xbe, 0xa4, 0xbe, 0xe1, 0x3d,
- 0x51, 0xed, 0xad, 0xbe, 0xc5, 0xe8, 0xd2, 0x3d, 0xac, 0x5c, 0x6b, 0xbe,
- 0xb4, 0x91, 0x57, 0x3d, 0xbc, 0x57, 0x82, 0x3e, 0x91, 0x82, 0xfb, 0x3c,
- 0x34, 0xe5, 0x76, 0xbe, 0x31, 0xd1, 0x9f, 0xbe, 0x53, 0x34, 0xac, 0x3d,
- 0x55, 0xf8, 0x91, 0xbe, 0xf9, 0x8e, 0x8d, 0xbe, 0x98, 0xde, 0xc5, 0xbe,
- 0x3c, 0x2a, 0xdf, 0xbe, 0x74, 0xb1, 0x6d, 0xbe, 0xe3, 0xd4, 0xf9, 0x3e,
- 0x0d, 0xef, 0xf1, 0x3d, 0x24, 0x19, 0x09, 0x3e, 0x04, 0x42, 0x2c, 0xbd,
- 0x22, 0x3b, 0x3e, 0x3d, 0x48, 0x69, 0x13, 0xbf, 0x81, 0x2a, 0x03, 0x3e,
- 0xf8, 0x7b, 0x90, 0xbc, 0x14, 0x7a, 0x4f, 0x3d, 0x2c, 0x7a, 0x10, 0x3e,
- 0xaa, 0xd7, 0x2d, 0x3d, 0x66, 0x72, 0xef, 0x3e, 0x42, 0x36, 0x83, 0xbe,
- 0x7a, 0xd2, 0x25, 0x3d, 0x6e, 0x33, 0xfe, 0xbd, 0x81, 0xe8, 0x95, 0x3d,
- 0x17, 0xc8, 0x87, 0x3e, 0x20, 0x8b, 0x8d, 0xbd, 0xd2, 0xbc, 0xca, 0xbd,
- 0x18, 0xf2, 0xf4, 0xbe, 0x22, 0x70, 0xdb, 0xbc, 0x60, 0x6a, 0xc1, 0xbe,
- 0x99, 0x35, 0x94, 0x3e, 0xea, 0x17, 0x62, 0x3e, 0xfc, 0x37, 0x81, 0x3d,
- 0xeb, 0xdc, 0xc5, 0x3d, 0x80, 0x49, 0x36, 0xbe, 0x7d, 0xc7, 0x03, 0x3d,
- 0xea, 0x7e, 0x6e, 0x3d, 0x39, 0xc9, 0x85, 0xbe, 0xb1, 0x43, 0xe7, 0xbe,
- 0x0e, 0x9c, 0xba, 0xbd, 0xa0, 0xdc, 0x00, 0xbd, 0x9c, 0x76, 0xcb, 0x3d,
- 0xf6, 0xa7, 0xc7, 0x3d, 0xfd, 0x42, 0x17, 0xbe, 0xcd, 0xdc, 0xcb, 0x3d,
- 0xd0, 0x70, 0xf9, 0xbe, 0xa6, 0xea, 0x9a, 0x3c, 0x17, 0x68, 0x39, 0x3e,
- 0x2b, 0xf4, 0x5b, 0x3e, 0x93, 0x52, 0x06, 0xbe, 0x56, 0x83, 0x15, 0x3e,
- 0xd3, 0xb4, 0x7d, 0xbe, 0xd0, 0xa0, 0x27, 0x3e, 0x98, 0x83, 0x6f, 0x3e,
- 0x0a, 0x62, 0x1b, 0xbd, 0x80, 0x45, 0xa0, 0xbe, 0x08, 0xe9, 0xfe, 0xbe,
- 0x13, 0xc3, 0x0a, 0xbe, 0x22, 0x17, 0xb8, 0x3e, 0x2e, 0x40, 0xbb, 0xbc,
- 0xb9, 0x5a, 0xad, 0xbc, 0x8d, 0xd3, 0x2c, 0xbf, 0xb7, 0xb3, 0xe2, 0xb9,
- 0x6a, 0xb6, 0x6f, 0xbe, 0x33, 0x95, 0x87, 0xbd, 0xa4, 0xda, 0xd8, 0x3c,
- 0xaf, 0x9c, 0xd7, 0xbd, 0x48, 0xd6, 0x69, 0x3e, 0xe5, 0x5e, 0x41, 0x3e,
- 0xfc, 0x2a, 0x26, 0x3c, 0xa3, 0xfb, 0x07, 0xbf, 0xa1, 0x83, 0x78, 0x3e,
- 0xe6, 0x1c, 0xda, 0xbd, 0x0d, 0x38, 0xcc, 0x3e, 0x3e, 0x9e, 0x27, 0xbf,
- 0xe4, 0x3b, 0x6d, 0x3e, 0x28, 0x92, 0x69, 0xbd, 0xfd, 0xf0, 0xae, 0x3d,
- 0x9a, 0xe8, 0xcf, 0xbc, 0x10, 0x26, 0xf6, 0x3c, 0x0d, 0x1f, 0x52, 0xbe,
- 0x27, 0x93, 0x39, 0xbe, 0xd2, 0x33, 0x9d, 0xbe, 0x0c, 0x6a, 0x0a, 0x3e,
- 0x36, 0xdd, 0x45, 0xbe, 0x75, 0x1e, 0x3f, 0xbf, 0x4a, 0x64, 0x32, 0x3e,
- 0xb7, 0xee, 0xf8, 0x3d, 0x21, 0xab, 0xf1, 0xbe, 0x92, 0x6f, 0x16, 0x3e,
- 0x52, 0x94, 0x45, 0x3e, 0xbf, 0xe7, 0xd9, 0x3d, 0x51, 0x55, 0x67, 0x3e,
- 0xdb, 0xda, 0xef, 0xbe, 0xbe, 0x58, 0x9d, 0x3c, 0x11, 0x35, 0x56, 0xbe,
- 0x92, 0x7a, 0xe5, 0x3e, 0xfd, 0x0a, 0xd2, 0xbe, 0x1d, 0xfe, 0x27, 0x3e,
- 0x1c, 0xcc, 0x17, 0xbf, 0x00, 0xec, 0x22, 0xbf, 0xcf, 0x66, 0xa1, 0xbb,
- 0xf1, 0x2a, 0xdb, 0xbd, 0x34, 0xf9, 0x8d, 0x3d, 0xaa, 0xee, 0x91, 0xbe,
- 0x8c, 0x76, 0x4a, 0xbb, 0x7a, 0xa2, 0x7e, 0x3e, 0xbd, 0x42, 0x6c, 0xbe,
- 0x03, 0x0f, 0xa1, 0xbc, 0x4f, 0xdb, 0xc5, 0xbe, 0x86, 0xa6, 0x90, 0xbe,
- 0xa9, 0x5a, 0x72, 0xbd, 0xd5, 0x02, 0x94, 0x3e, 0x75, 0x55, 0x8a, 0xbd,
- 0x1f, 0x06, 0x27, 0xbc, 0x7a, 0xac, 0x60, 0x3e, 0xb9, 0xf1, 0x3a, 0xbe,
- 0x26, 0x45, 0x01, 0xbe, 0x45, 0xad, 0xde, 0xbc, 0x94, 0xad, 0x8c, 0x3e,
- 0x65, 0x0a, 0x40, 0x3e, 0xb7, 0x29, 0x3d, 0xbe, 0x0e, 0xea, 0xa7, 0x3d,
- 0xab, 0x82, 0xd9, 0x3d, 0xbc, 0x34, 0x28, 0x3e, 0xdd, 0x0e, 0x61, 0x3d,
- 0xa2, 0x4d, 0x73, 0xbe, 0x95, 0xe0, 0x59, 0x3e, 0xff, 0xe1, 0x26, 0xbd,
- 0x95, 0x27, 0x22, 0xbe, 0xf2, 0x97, 0x19, 0x3e, 0x39, 0x41, 0x7d, 0xbe,
- 0xe2, 0x51, 0xbb, 0xbe, 0x4f, 0x2c, 0x3f, 0x3e, 0x00, 0xec, 0x06, 0x3f,
- 0x9e, 0x8e, 0xec, 0xbd, 0xcd, 0xce, 0xa9, 0x3d, 0xb0, 0xe8, 0x71, 0xbe,
- 0x7d, 0xbc, 0x20, 0x3d, 0xe3, 0x34, 0xd6, 0x3e, 0x76, 0x07, 0x20, 0xbe,
- 0xea, 0xcb, 0x91, 0x3e, 0x34, 0x76, 0xec, 0xbe, 0x54, 0x0d, 0x50, 0x3e,
- 0xce, 0xea, 0xf6, 0xbe, 0x5f, 0xd1, 0xfd, 0x3c, 0xe2, 0xb8, 0x0f, 0x3e,
- 0x8e, 0x51, 0x1d, 0xbf, 0x75, 0x14, 0x1f, 0x3e, 0xb0, 0x9a, 0x22, 0x3d,
- 0x5c, 0x3c, 0x8f, 0x3d, 0x51, 0xb3, 0x85, 0xbe, 0xcf, 0x5c, 0x64, 0x3e,
- 0xd2, 0xfe, 0xb8, 0xbe, 0xaf, 0xee, 0xac, 0x3d, 0xab, 0x05, 0x80, 0x3e,
- 0xf0, 0x42, 0x06, 0x3e, 0x75, 0xf2, 0x6f, 0x3d, 0x60, 0xf5, 0x16, 0xbd,
- 0xac, 0xf8, 0xf8, 0xbd, 0x4e, 0x6b, 0x03, 0x3c, 0xbb, 0x35, 0x91, 0x3e,
- 0xd6, 0x00, 0xa3, 0xbe, 0x7d, 0x93, 0x98, 0x3d, 0x6e, 0xae, 0x6b, 0x3e,
- 0x30, 0xa8, 0x2a, 0x3e, 0x45, 0x91, 0x1f, 0xbf, 0x5c, 0xa7, 0x1d, 0x3c,
- 0x88, 0xb9, 0x6e, 0xbe, 0xda, 0xe2, 0xc3, 0x3d, 0xee, 0x3e, 0x9a, 0xbe,
- 0x21, 0xb4, 0x09, 0xbe, 0xf9, 0x0d, 0x9e, 0xbe, 0xb8, 0x71, 0xb5, 0xbe,
- 0x6b, 0x73, 0xa1, 0xbd, 0x4c, 0x78, 0xc4, 0xbd, 0x6d, 0x81, 0x39, 0xbe,
- 0xc2, 0xbc, 0x2a, 0x3e, 0xfa, 0xae, 0x42, 0xbe, 0x59, 0xff, 0x90, 0x3d,
- 0x5f, 0x1a, 0x2d, 0x3e, 0xf5, 0x9d, 0x7a, 0xbe, 0xf3, 0x4b, 0xca, 0x3d,
- 0x95, 0xd1, 0x65, 0xbe, 0x95, 0xd5, 0x4f, 0xbe, 0xbd, 0x6f, 0x04, 0xbe,
- 0x86, 0x5c, 0xc5, 0xbe, 0x52, 0x28, 0xab, 0x3e, 0x66, 0x85, 0xcc, 0x3d,
- 0xb9, 0x5a, 0x99, 0xbe, 0xd0, 0xff, 0x0a, 0xbe, 0x34, 0x1d, 0x7a, 0xbd,
- 0x3f, 0xe3, 0x72, 0x3d, 0xe5, 0x13, 0x85, 0xbe, 0x9e, 0x6a, 0x4e, 0xbe,
- 0x02, 0xa1, 0x92, 0xbe, 0x00, 0x67, 0x57, 0xbe, 0xf0, 0xdb, 0x32, 0xbe,
- 0x2a, 0x3f, 0x3b, 0x3e, 0x07, 0xa7, 0x21, 0xbf, 0xca, 0x26, 0x3b, 0xbe,
- 0xd9, 0x9b, 0x03, 0xbe, 0xaf, 0x11, 0xf3, 0xbe, 0x41, 0x59, 0x61, 0xbe,
- 0x7c, 0x4c, 0x62, 0xbd, 0xfb, 0x42, 0xc4, 0xbd, 0x41, 0x11, 0x45, 0xbe,
- 0x84, 0x82, 0xf5, 0x3d, 0x9a, 0xe2, 0x07, 0xbe, 0xcd, 0x3e, 0x75, 0x3e,
- 0xde, 0xcf, 0x91, 0xbe, 0xb2, 0x9b, 0xe7, 0x3d, 0xc9, 0x51, 0xd5, 0xbe,
- 0x67, 0x10, 0x36, 0x3e, 0x89, 0x2a, 0xda, 0x3e, 0x6f, 0x87, 0x0e, 0xbe,
- 0x06, 0x21, 0x87, 0xbe, 0xa5, 0xf4, 0x95, 0xbe, 0xf3, 0xbb, 0xe8, 0xbe,
- 0x40, 0x36, 0x2c, 0x3e, 0x95, 0xc5, 0xaf, 0x3d, 0x2a, 0x87, 0xa2, 0xbd,
- 0x4c, 0x18, 0x81, 0xb9, 0xab, 0x44, 0x66, 0xbe, 0xcd, 0x39, 0x40, 0x3e,
- 0xaf, 0xf2, 0x2b, 0x3c, 0x5c, 0x14, 0x02, 0xbe, 0x2c, 0xd6, 0xa9, 0xbe,
- 0x20, 0xde, 0xe6, 0x3c, 0xb0, 0x51, 0xfb, 0xbe, 0xcb, 0x40, 0x29, 0x3c,
- 0x5b, 0x25, 0x0c, 0x3e, 0x27, 0xf5, 0x16, 0xbd, 0x71, 0x73, 0xd0, 0x3c,
- 0x75, 0x4b, 0x6d, 0xbd, 0x59, 0xbc, 0x76, 0x3e, 0xb6, 0x1d, 0x99, 0xbe,
- 0x10, 0xfc, 0x8b, 0xbe, 0xa7, 0x73, 0xbd, 0xbb, 0xdb, 0xc3, 0xed, 0x3e,
- 0xe3, 0xd8, 0x87, 0xbd, 0xe4, 0x38, 0xb2, 0xbe, 0xd2, 0x3b, 0x46, 0xbe,
- 0xb2, 0x95, 0x50, 0xbd, 0xa2, 0x32, 0x67, 0x3e, 0x2b, 0xda, 0x62, 0xbe,
- 0xb9, 0xcd, 0xcb, 0xbe, 0x4d, 0x3d, 0xaf, 0xbe, 0x95, 0xc9, 0x71, 0xbe,
- 0xf3, 0x1d, 0x57, 0xbe, 0x0b, 0x97, 0xc6, 0x3d, 0x96, 0xc1, 0xf2, 0x3d,
- 0x98, 0xf0, 0x0b, 0xbd, 0xc0, 0x3b, 0xd9, 0x39, 0x2a, 0xe4, 0x60, 0x3e,
- 0x3c, 0xde, 0x84, 0x3e, 0xe4, 0x84, 0x32, 0x3e, 0xf0, 0x85, 0x9a, 0xbe,
- 0x26, 0x1e, 0x36, 0xbe, 0x96, 0x6f, 0x89, 0xbe, 0xaf, 0xb9, 0x06, 0xbe,
- 0x86, 0x5c, 0xbe, 0xbb, 0xba, 0xe8, 0x63, 0xbf, 0x0d, 0x81, 0xd1, 0xbe,
- 0xa5, 0xba, 0x28, 0xbe, 0x17, 0x86, 0x41, 0x3d, 0xc2, 0xa3, 0x14, 0xbd,
- 0xb6, 0xf9, 0xe5, 0xbc, 0xd2, 0xa2, 0x45, 0x3d, 0x9d, 0x1b, 0xf2, 0xbe,
- 0x6f, 0x66, 0x81, 0xbe, 0xf9, 0xd2, 0x22, 0x3e, 0xa1, 0x56, 0x8f, 0xbd,
- 0x08, 0x2d, 0x8b, 0x3e, 0x06, 0x18, 0x16, 0x3d, 0x6f, 0xf5, 0x1a, 0x3f,
- 0xe6, 0xb3, 0x2a, 0xbe, 0x8f, 0x72, 0x05, 0xbf, 0x56, 0x3e, 0x20, 0x3e,
- 0xce, 0xfe, 0x88, 0x3e, 0x27, 0x64, 0xc6, 0xbe, 0x43, 0xcd, 0x18, 0xbe,
- 0xea, 0x09, 0xd7, 0x3e, 0x97, 0x69, 0x29, 0xbd, 0x5c, 0x63, 0x03, 0x3d,
- 0x4a, 0x62, 0xc5, 0x3e, 0x94, 0x06, 0x2c, 0xbd, 0x4c, 0x38, 0xba, 0xbe,
- 0x17, 0x08, 0x0f, 0x3e, 0xb4, 0x7f, 0xed, 0xbd, 0xd9, 0x33, 0xa1, 0xbe,
- 0x84, 0x67, 0xc4, 0xbd, 0x83, 0xec, 0xed, 0xbc, 0x69, 0xce, 0x8b, 0x3d,
- 0xeb, 0xe0, 0x34, 0x3d, 0x78, 0x93, 0x5e, 0xbe, 0xcc, 0xe7, 0x12, 0xbe,
- 0x3e, 0x53, 0xdd, 0xbd, 0xf3, 0xc1, 0xad, 0xbe, 0xce, 0xf9, 0x79, 0xbe,
- 0xfa, 0xa4, 0xf1, 0xbe, 0x40, 0x0f, 0xd5, 0x3e, 0x43, 0x3f, 0xa9, 0x3d,
- 0xbc, 0x31, 0x78, 0x3e, 0x98, 0x7f, 0x28, 0x3d, 0x22, 0x77, 0x14, 0xbe,
- 0x0d, 0x47, 0xe0, 0xbe, 0x62, 0x97, 0xa2, 0xbe, 0x7f, 0x6f, 0xf5, 0xbc,
- 0x08, 0x04, 0x9a, 0x3d, 0xa8, 0x54, 0xed, 0xbe, 0x71, 0x36, 0x47, 0x3d,
- 0x5c, 0x18, 0xe3, 0x3e, 0xc0, 0xbc, 0xb9, 0xbd, 0xe0, 0x79, 0x32, 0x3e,
- 0x7a, 0xff, 0xa5, 0xbd, 0x73, 0xe2, 0x98, 0xbe, 0xa4, 0xfa, 0x89, 0x3d,
- 0x64, 0xf8, 0xd3, 0xbe, 0xd3, 0xbc, 0x1c, 0xbe, 0x27, 0xff, 0xc4, 0xbe,
- 0x3f, 0xac, 0x98, 0x3c, 0xf0, 0x1a, 0x28, 0xbe, 0xa0, 0xf8, 0xcd, 0x3e,
- 0x29, 0xeb, 0x34, 0xbe, 0x75, 0xbd, 0xb3, 0x3e, 0x95, 0x48, 0xa8, 0x3d,
- 0xe8, 0xec, 0x0b, 0xbe, 0x02, 0x97, 0x57, 0x3e, 0x1d, 0xbd, 0x1b, 0xbd,
- 0xe2, 0x8e, 0xbf, 0x3e, 0xde, 0x21, 0x36, 0x3e, 0x60, 0xf3, 0x87, 0xbe,
- 0x4c, 0x05, 0x80, 0x3e, 0x80, 0x53, 0xf4, 0x39, 0xfc, 0xdd, 0xcc, 0x3e,
- 0x89, 0x6c, 0x6e, 0x3e, 0x49, 0xad, 0xdf, 0xbd, 0x84, 0xf1, 0x5f, 0xbc,
- 0xb2, 0x4d, 0x23, 0xbf, 0xcf, 0x0f, 0x4d, 0x3e, 0xc2, 0x49, 0x19, 0xbf,
- 0xc0, 0x19, 0x63, 0xbe, 0xac, 0x3e, 0xe0, 0xbd, 0x6e, 0xa5, 0x7b, 0x3e,
- 0x0b, 0x25, 0x6f, 0xbe, 0xb8, 0x8e, 0x4b, 0x3e, 0xf0, 0x31, 0x4f, 0x3e,
- 0xd5, 0x30, 0xa5, 0x3d, 0x80, 0x0d, 0xf5, 0xbd, 0x1e, 0x2c, 0x5d, 0x3e,
- 0xc7, 0x93, 0xba, 0x3d, 0xcf, 0xa3, 0x86, 0x3e, 0x5d, 0x6f, 0xf1, 0xbe,
- 0xf7, 0x76, 0x6e, 0x3e, 0x58, 0x70, 0xc3, 0xbe, 0x5c, 0x32, 0x26, 0xbf,
- 0x47, 0x09, 0x3f, 0xbe, 0xc8, 0xab, 0xf7, 0x3d, 0x96, 0xba, 0xbb, 0xbd,
- 0x52, 0x6b, 0xeb, 0xbe, 0x5b, 0xa7, 0x2b, 0xbf, 0x0f, 0x42, 0x8d, 0x3e,
- 0x76, 0x68, 0xff, 0xbe, 0xa6, 0xb6, 0x85, 0xbd, 0x4a, 0x92, 0x8e, 0x3e,
- 0xc8, 0x69, 0x95, 0x3e, 0xca, 0x90, 0x0a, 0xbf, 0x3b, 0x43, 0xd8, 0xbe,
- 0x12, 0xef, 0xa2, 0x3e, 0xb7, 0x6e, 0x87, 0xbd, 0x82, 0x16, 0xfb, 0xbd,
- 0x9b, 0xb6, 0x82, 0x3d, 0x68, 0x46, 0x6a, 0x3c, 0x79, 0xf9, 0xc1, 0x3b,
- 0xf7, 0xbd, 0xd4, 0xbe, 0x75, 0xbb, 0x4c, 0x3e, 0x79, 0x12, 0x28, 0x3d,
- 0xb8, 0xee, 0xbb, 0x3d, 0xde, 0x5b, 0x79, 0xbc, 0x72, 0x7d, 0xd8, 0xbe,
- 0x6a, 0xfa, 0x1d, 0x3e, 0x78, 0x72, 0x9c, 0xbd, 0x52, 0xd3, 0xf5, 0xbe,
- 0x83, 0x6f, 0x37, 0x3e, 0x7e, 0x19, 0xb6, 0x3d, 0xb5, 0xac, 0x44, 0x3c,
- 0xc4, 0x01, 0x39, 0x3f, 0x4d, 0x7e, 0xd6, 0xbc, 0xb3, 0x3d, 0xe8, 0xbe,
- 0xd1, 0x0c, 0x2a, 0xbe, 0xb3, 0x7e, 0x90, 0x3e, 0x99, 0xfc, 0xe8, 0xbe,
- 0xd4, 0x61, 0x9b, 0x3e, 0x2b, 0x04, 0x88, 0x3e, 0xb8, 0x1c, 0x28, 0x3e,
- 0x62, 0xaa, 0x0f, 0xbf, 0xc8, 0xe8, 0xfd, 0xbc, 0x6f, 0x05, 0x08, 0xbf,
- 0x38, 0xa5, 0x47, 0xbd, 0xe1, 0xdb, 0x9a, 0x3d, 0xcd, 0xa4, 0x20, 0x3e,
- 0x81, 0x9d, 0x80, 0x3d, 0xe0, 0x3f, 0x38, 0xbf, 0xb4, 0xf1, 0xe3, 0xbe,
- 0x85, 0x0f, 0x98, 0x3d, 0x09, 0x8b, 0x85, 0xbe, 0x33, 0x88, 0xff, 0xbd,
- 0x5c, 0xdf, 0xe4, 0xbe, 0x02, 0x07, 0x7d, 0x3b, 0x1d, 0x7b, 0x4c, 0xbe,
- 0x33, 0xbd, 0x2b, 0xbf, 0x5b, 0xbd, 0x95, 0xbd, 0xb6, 0xd4, 0x50, 0x3d,
- 0xa1, 0x65, 0x9e, 0xbe, 0xde, 0xe0, 0x56, 0xbe, 0x51, 0x79, 0x80, 0x3e,
- 0x5d, 0x06, 0x2b, 0xbf, 0xcc, 0x60, 0x1b, 0x3e, 0xdb, 0xe7, 0x84, 0x3e,
- 0xae, 0xbe, 0x0d, 0xbe, 0xa8, 0x92, 0x0a, 0x3f, 0x2b, 0x34, 0xed, 0xbe,
- 0x41, 0x59, 0x11, 0xbf, 0x66, 0xb6, 0xbe, 0x3d, 0xab, 0xe7, 0xf7, 0xbe,
- 0x89, 0x46, 0x42, 0x3e, 0x10, 0x9c, 0x31, 0xbe, 0x44, 0x7b, 0x30, 0x3e,
- 0x64, 0x68, 0x82, 0x3e, 0x4a, 0x40, 0xb9, 0x3c, 0xf2, 0x2f, 0x20, 0xbe,
- 0x59, 0x38, 0xbf, 0xbe, 0x57, 0x55, 0x82, 0x3d, 0x4c, 0x1c, 0x95, 0xbc,
- 0x6d, 0xef, 0x88, 0xbe, 0x23, 0x30, 0x4b, 0x3e, 0xad, 0x0a, 0x90, 0x3e,
- 0xf3, 0x5f, 0x99, 0xbe, 0xf8, 0x24, 0xe8, 0xbe, 0xf4, 0x8b, 0x84, 0xbd,
- 0xd6, 0x2f, 0x0a, 0xbf, 0x84, 0xc4, 0x7c, 0x3b, 0xb5, 0x38, 0x9f, 0xbd,
- 0x39, 0x39, 0xe8, 0xbd, 0x7f, 0x4b, 0x04, 0xbe, 0x3f, 0xbe, 0xb6, 0x3e,
- 0xd5, 0xa8, 0x96, 0xbd, 0xe6, 0xfe, 0xe6, 0x3e, 0x8a, 0x24, 0xbd, 0xbd,
- 0x1d, 0xf8, 0xc3, 0xbd, 0x7f, 0x8b, 0xc1, 0x3d, 0x59, 0x52, 0xd3, 0xbd,
- 0xa0, 0x2f, 0x7f, 0xbe, 0x68, 0x6b, 0xb8, 0x3d, 0x95, 0xc8, 0x5c, 0x3e,
- 0x37, 0xba, 0xfc, 0xbd, 0x8a, 0x3f, 0xd8, 0x3e, 0xdf, 0x95, 0x88, 0x3d,
- 0x8d, 0x98, 0x6a, 0x3d, 0xb7, 0x50, 0xe0, 0xbe, 0x58, 0x30, 0x0d, 0x3e,
- 0x10, 0xaa, 0xdc, 0xbe, 0xaf, 0xfb, 0x9a, 0xbe, 0xda, 0x3a, 0x99, 0xbe,
- 0x9a, 0xe2, 0x72, 0xbe, 0x79, 0xad, 0x06, 0x3f, 0x1c, 0xe7, 0x00, 0x3e,
- 0xbf, 0x04, 0x97, 0x3d, 0xb7, 0xa7, 0xc3, 0x3e, 0x57, 0x5c, 0x0d, 0x3f,
- 0x97, 0x85, 0xfd, 0xbd, 0xfd, 0x5f, 0x25, 0xbe, 0xf7, 0x68, 0xa2, 0xbe,
- 0xe0, 0x52, 0x10, 0xbe, 0x0c, 0x60, 0xd8, 0x3e, 0x1e, 0x42, 0x72, 0x3c,
- 0x7b, 0xbb, 0xa1, 0x3d, 0xdb, 0x0a, 0xc8, 0x39, 0xd6, 0x30, 0xa2, 0xbd,
- 0x05, 0x37, 0xb3, 0xbe, 0x12, 0x31, 0x03, 0x3e, 0x53, 0x29, 0xdd, 0x3e,
- 0x02, 0x67, 0x44, 0x3e, 0xcb, 0x7e, 0x46, 0xbe, 0xac, 0x71, 0x6b, 0x3e,
- 0x98, 0x73, 0x1b, 0x3e, 0x3b, 0x8c, 0x00, 0xbf, 0xde, 0x2d, 0xa5, 0xbc,
- 0xcf, 0x14, 0xdb, 0xbc, 0x00, 0x30, 0x0d, 0x3f, 0x5a, 0x61, 0x07, 0xbd,
- 0x6e, 0x42, 0x98, 0xbe, 0x1d, 0xc7, 0x86, 0xbe, 0x7f, 0xb5, 0x88, 0x3e,
- 0xbe, 0x96, 0xab, 0xbb, 0x10, 0x43, 0xa3, 0x3e, 0x7c, 0x15, 0x95, 0xbe,
- 0xb7, 0x5d, 0xb3, 0xbe, 0x49, 0x45, 0x52, 0x3e, 0x6a, 0x8c, 0xd5, 0x3e,
- 0xa2, 0x74, 0xcc, 0x3e, 0x2a, 0x38, 0xdf, 0xbd, 0x39, 0xed, 0x22, 0x3e,
- 0x19, 0x5e, 0xcb, 0x3d, 0xc0, 0x3a, 0x7c, 0x3e, 0x83, 0x48, 0x78, 0xbc,
- 0x78, 0x00, 0x5b, 0x3e, 0x50, 0xae, 0x8c, 0x3d, 0xc9, 0xd1, 0x17, 0xbe,
- 0x87, 0x27, 0x25, 0xbf, 0x6a, 0x53, 0xaf, 0x3d, 0xb6, 0x3e, 0x00, 0xbe,
- 0xf4, 0x78, 0x1f, 0xbe, 0xa7, 0xe9, 0x09, 0xbe, 0x24, 0x01, 0x0a, 0xbd,
- 0x29, 0x95, 0x36, 0xbf, 0x16, 0xed, 0xaf, 0xbe, 0x97, 0xf3, 0x8e, 0xbd,
- 0xab, 0x6c, 0xee, 0x3d, 0xbd, 0xd6, 0x49, 0x3e, 0x66, 0xe2, 0x39, 0xbf,
- 0xdf, 0x8c, 0xa7, 0xbd, 0x71, 0x40, 0x79, 0xbf, 0x41, 0xd0, 0x30, 0xbf,
- 0x37, 0x33, 0xab, 0xbd, 0x34, 0xd2, 0x2f, 0xbf, 0x23, 0x86, 0x9c, 0x3e,
- 0x88, 0x6d, 0xec, 0xbe, 0xa0, 0x19, 0xc2, 0xbc, 0xb4, 0xc7, 0x91, 0x3d,
- 0xab, 0x2e, 0xe2, 0x3e, 0x56, 0x37, 0x8c, 0xbd, 0x02, 0x49, 0xe3, 0xbe,
- 0x13, 0x6c, 0xeb, 0x3c, 0xfe, 0xad, 0x3a, 0xbf, 0x48, 0xad, 0xf2, 0x3c,
- 0x0a, 0xbe, 0x76, 0xbc, 0x64, 0x0b, 0xbe, 0xbe, 0x07, 0x6e, 0xa7, 0x3e,
- 0x0e, 0x15, 0x1d, 0x3e, 0x3e, 0x8c, 0x4b, 0x3e, 0xa0, 0xea, 0xee, 0xbc,
- 0x4d, 0x19, 0xd6, 0x3e, 0x28, 0x24, 0xe6, 0x3e, 0xc0, 0x97, 0x68, 0x3c,
- 0x54, 0x3f, 0x15, 0x3f, 0xc0, 0xc9, 0xbc, 0x3d, 0xf2, 0x29, 0x48, 0x3e,
- 0x07, 0xd7, 0x98, 0xbe, 0x4a, 0x61, 0xb2, 0x3e, 0xd7, 0x3e, 0xa9, 0x3e,
- 0xed, 0xf5, 0x5b, 0xbd, 0xdb, 0x87, 0xc6, 0xbe, 0x8e, 0xf0, 0x8e, 0x3e,
- 0x7d, 0x6b, 0x04, 0xbe, 0xa9, 0x60, 0x02, 0xbe, 0x29, 0x1e, 0xce, 0xbe,
- 0x5c, 0x70, 0x18, 0xbe, 0xe5, 0x01, 0x42, 0x3e, 0x1d, 0xc7, 0x17, 0xbe,
- 0xeb, 0x44, 0x3a, 0xbd, 0xa8, 0x4d, 0xb4, 0x3e, 0x29, 0xbf, 0x12, 0xbf,
- 0x24, 0x4b, 0xb2, 0xbe, 0x4b, 0x89, 0x67, 0xbe, 0xae, 0xc0, 0x9b, 0xbc,
- 0xb7, 0xb3, 0xe2, 0xbd, 0xa4, 0x9c, 0xf2, 0xbe, 0xdb, 0x16, 0x5e, 0x3e,
- 0x7b, 0xfa, 0x85, 0xbe, 0x5f, 0x8c, 0xb5, 0xbe, 0xd2, 0xaf, 0x19, 0xbf,
- 0x0c, 0x3a, 0x9d, 0x3e, 0xde, 0xdc, 0x86, 0x3d, 0x52, 0x21, 0xb0, 0x3d,
- 0x97, 0x9d, 0xa3, 0xbd, 0x01, 0x49, 0xb8, 0x3d, 0xb4, 0xa8, 0x2c, 0x3c,
- 0xb4, 0x6f, 0x97, 0x3d, 0x61, 0xcd, 0x01, 0xbf, 0x33, 0x37, 0xd9, 0xbe,
- 0xfa, 0xe1, 0x9a, 0xbd, 0x6a, 0x52, 0xdd, 0x3e, 0xd7, 0x7c, 0x0c, 0xbe,
- 0x92, 0xc5, 0xbf, 0xbd, 0x82, 0x9a, 0x6e, 0x3d, 0x44, 0x3c, 0xac, 0xbe,
- 0x49, 0xe6, 0x13, 0xbc, 0x3d, 0x26, 0x51, 0xbe, 0xdc, 0x86, 0x90, 0xbd,
- 0x80, 0x87, 0xbe, 0xbd, 0xd9, 0xa5, 0x4a, 0xbe, 0x47, 0xbb, 0x89, 0x3d,
- 0x76, 0x5d, 0x61, 0xbe, 0xdd, 0xce, 0x16, 0x3d, 0x60, 0x57, 0x05, 0xbe,
- 0xbc, 0x7e, 0x05, 0xbc, 0xdd, 0x18, 0x87, 0xbe, 0x54, 0x46, 0x7e, 0xbe,
- 0x74, 0x68, 0x8b, 0xbe, 0x61, 0x0a, 0x4f, 0xbe, 0x37, 0x04, 0xbc, 0xbd,
- 0x93, 0x69, 0x5a, 0xbe, 0x73, 0xb2, 0x7e, 0x3e, 0xed, 0xaf, 0x53, 0xbe,
- 0xe4, 0xc7, 0x26, 0x3e, 0x12, 0xe5, 0x15, 0x3e, 0x87, 0xd4, 0x8f, 0xbe,
- 0xb4, 0x6a, 0x96, 0xbe, 0x31, 0x05, 0x2f, 0xbc, 0xde, 0x97, 0x0a, 0xbe,
- 0x81, 0x4b, 0x9e, 0x3e, 0x30, 0xa6, 0xab, 0x3e, 0xdf, 0x2a, 0xa7, 0xbe,
- 0x4b, 0xa3, 0x66, 0xbd, 0xeb, 0xa7, 0x0c, 0x3f, 0xb2, 0xbe, 0x34, 0xbf,
- 0xf9, 0x90, 0x02, 0xbe, 0xe7, 0x4d, 0x1b, 0xbe, 0xc1, 0x86, 0x04, 0x3e,
- 0x03, 0x29, 0x19, 0x3d, 0x0f, 0x01, 0x3b, 0x3e, 0x8e, 0xad, 0x7d, 0xbe,
- 0x17, 0x36, 0x26, 0xbe, 0x31, 0xf7, 0x6f, 0xbc, 0x4f, 0xbe, 0x05, 0xbf,
- 0x0d, 0xfe, 0x30, 0x3e, 0x03, 0xaf, 0x90, 0x3d, 0xc9, 0xc1, 0x09, 0xbe,
- 0x6b, 0x6e, 0xc5, 0x3c, 0xfe, 0xbb, 0x32, 0x3e, 0xce, 0xff, 0xb5, 0xbe,
- 0x0e, 0x64, 0x25, 0xbd, 0x69, 0xc9, 0x29, 0x3f, 0x0a, 0x0a, 0xe9, 0xbb,
- 0x49, 0x17, 0x80, 0x3e, 0x9d, 0x76, 0x72, 0xbe, 0x42, 0x88, 0x53, 0x3d,
- 0x2d, 0x35, 0xcf, 0x3d, 0x15, 0x76, 0xb2, 0x3d, 0x45, 0xc9, 0x09, 0x3d,
- 0xd8, 0x7a, 0x05, 0xbf, 0x06, 0xee, 0x39, 0xbe, 0x29, 0x8b, 0x39, 0x3e,
- 0x1f, 0xa4, 0x24, 0x3e, 0x02, 0x9d, 0x9e, 0x3e, 0xf3, 0x89, 0x50, 0xbe,
- 0x8a, 0x23, 0x2c, 0x3f, 0xd3, 0xdc, 0xb6, 0xbd, 0x8f, 0x59, 0x99, 0xbe,
- 0x86, 0x33, 0x1a, 0x3f, 0x70, 0x8e, 0x43, 0x3e, 0xd2, 0x14, 0xec, 0x3d,
- 0x2e, 0xd1, 0xfc, 0x3d, 0x26, 0xb8, 0x77, 0xbe, 0xcf, 0x8a, 0x1a, 0xbe,
- 0x12, 0x81, 0x9b, 0xbd, 0xc5, 0x4f, 0x0c, 0xbe, 0xe8, 0x18, 0x3f, 0x3e,
- 0xca, 0xa5, 0x16, 0xbe, 0x4f, 0xc7, 0x76, 0xbe, 0x5a, 0x15, 0x6d, 0xbe,
- 0xe9, 0xee, 0x49, 0x3e, 0x31, 0x09, 0xfd, 0x3e, 0x3a, 0x32, 0xb1, 0xbe,
- 0x3a, 0xb3, 0x1e, 0x3d, 0x67, 0x52, 0x18, 0xbe, 0x84, 0x36, 0x0b, 0x3e,
- 0x68, 0x00, 0x1f, 0xbe, 0xe8, 0xaf, 0xc8, 0xbd, 0xe9, 0x6c, 0xc1, 0xbc,
- 0x8c, 0x02, 0x09, 0x3d, 0x0c, 0x81, 0xb6, 0x3d, 0x52, 0x13, 0x99, 0x3e,
- 0x73, 0x0f, 0x90, 0x3d, 0xf5, 0xaa, 0x7c, 0xbe, 0x08, 0xfb, 0x94, 0x3e,
- 0xb7, 0x60, 0x90, 0xbe, 0x99, 0x72, 0xa1, 0xbe, 0x30, 0xaa, 0x9d, 0x3d,
- 0x1a, 0xa9, 0x1b, 0xbe, 0x19, 0x41, 0x17, 0x3c, 0x8a, 0xdb, 0x7b, 0xbe,
- 0xff, 0x12, 0x64, 0x3e, 0x2f, 0x6c, 0x93, 0xbc, 0x3f, 0x02, 0x95, 0x3e,
- 0x1b, 0xae, 0x87, 0xbe, 0x8c, 0x04, 0x88, 0xbe, 0xcd, 0xce, 0xc8, 0x3e,
- 0x83, 0x8d, 0xbd, 0xbd, 0x95, 0xc1, 0xa3, 0x3e, 0xcb, 0xb0, 0x3a, 0xbe,
- 0xde, 0x41, 0xfb, 0x3e, 0x4f, 0xb4, 0x6b, 0x3e, 0xaa, 0xe9, 0xd1, 0x3d,
- 0x29, 0xf1, 0xa6, 0xbe, 0x5e, 0x95, 0xa1, 0xbd, 0xba, 0x3c, 0xf3, 0x3e,
- 0x65, 0xf4, 0xb8, 0xbd, 0x1f, 0xcc, 0x4a, 0xbd, 0x2c, 0x1c, 0x32, 0xbe,
- 0x61, 0x52, 0x87, 0x3e, 0x47, 0xfb, 0xbf, 0xbd, 0x32, 0x75, 0x0c, 0xbf,
- 0x96, 0x74, 0x17, 0xbf, 0x5e, 0xee, 0x62, 0xbe, 0xae, 0x02, 0x47, 0x3e,
- 0xfb, 0x51, 0x9f, 0xbe, 0xde, 0xa3, 0x83, 0xbe, 0x4a, 0x5f, 0xb0, 0x3e,
- 0x58, 0xaf, 0xeb, 0x3d, 0x9c, 0xdc, 0xfd, 0xbe, 0x89, 0x1c, 0x46, 0x3e,
- 0x8a, 0x2d, 0x8a, 0xbe, 0x13, 0x68, 0xc9, 0x3e, 0x2c, 0x04, 0x25, 0xbe,
- 0x4a, 0x89, 0x4b, 0xbe, 0xf1, 0xf0, 0xf6, 0x3e, 0x20, 0x3b, 0xb8, 0x3e,
- 0x71, 0xcf, 0xec, 0xbd, 0xbf, 0x30, 0x20, 0xbe, 0xc9, 0x7e, 0xc2, 0x3d,
- 0xfb, 0x26, 0x5d, 0x3e, 0x54, 0xed, 0xcc, 0x3d, 0x0a, 0x1b, 0x9d, 0xbe,
- 0xe3, 0xa4, 0x0a, 0x3e, 0x8f, 0x3d, 0x1b, 0xbf, 0x84, 0x7a, 0x41, 0xbd,
- 0x31, 0xb6, 0xba, 0xbe, 0x45, 0xe3, 0xe3, 0x3e, 0x8f, 0xa9, 0x5d, 0x3c,
- 0xea, 0x19, 0xb4, 0x3d, 0x00, 0x56, 0xa5, 0xbe, 0x83, 0x81, 0xf3, 0xbe,
- 0x4e, 0xcf, 0xbb, 0xbe, 0xbf, 0xb8, 0xdc, 0x3e, 0xa0, 0x18, 0xcd, 0x3e,
- 0xa8, 0xa7, 0x2e, 0xbe, 0x24, 0x20, 0x92, 0xbe, 0xf5, 0x17, 0x23, 0x3d,
- 0x35, 0xb2, 0xea, 0xbe, 0x69, 0x7e, 0x2c, 0x3e, 0x3e, 0xf6, 0xa9, 0x3d,
- 0xaa, 0x5f, 0x30, 0xbe, 0xa8, 0x7e, 0x1b, 0x3e, 0xd4, 0x8f, 0x1e, 0xbe,
- 0xac, 0xb3, 0xa8, 0x3d, 0x10, 0xa9, 0x8c, 0xbe, 0x97, 0xee, 0x21, 0xbe,
- 0x88, 0xfe, 0xa4, 0xbe, 0x3d, 0xaf, 0x97, 0x3e, 0x76, 0x41, 0x8b, 0xbd,
- 0x10, 0x25, 0xa2, 0xbe, 0xf3, 0x20, 0xa7, 0xbe, 0x51, 0x39, 0xa0, 0x3e,
- 0x50, 0x26, 0xf0, 0x3d, 0xf1, 0x4c, 0x79, 0xbd, 0xdb, 0x68, 0x2f, 0xbe,
- 0x58, 0x98, 0xf4, 0xbe, 0xdf, 0x7b, 0xb2, 0xbe, 0x1b, 0x6e, 0x3d, 0x3e,
- 0x94, 0x97, 0xd0, 0x3c, 0xf5, 0x6c, 0x83, 0xbc, 0x49, 0xb7, 0x16, 0xbf,
- 0x5f, 0xf8, 0xa5, 0xbe, 0x08, 0x60, 0x5b, 0xbe, 0x63, 0xe0, 0x8c, 0xbe,
- 0x23, 0x74, 0x28, 0x3e, 0xa3, 0x68, 0x44, 0xbe, 0xee, 0x8a, 0xd6, 0xbd,
- 0xcb, 0xb0, 0x79, 0xbe, 0x98, 0x0f, 0xa6, 0xbd, 0x50, 0xb9, 0xb0, 0xbe,
- 0x97, 0xa7, 0xc0, 0xbe, 0x8f, 0x2b, 0x3b, 0x3e, 0x38, 0x0b, 0x00, 0x3f,
- 0xd4, 0xf9, 0xf5, 0xbc, 0x7c, 0x13, 0xed, 0xbe, 0xaf, 0xf1, 0x77, 0xbe,
- 0x0f, 0xc6, 0xa1, 0xbe, 0x0c, 0x27, 0x4c, 0x3e, 0x96, 0xc8, 0xce, 0xbe,
- 0x38, 0xe1, 0x07, 0x3e, 0x08, 0xf1, 0x35, 0x3d, 0xa6, 0x28, 0xb5, 0xbc,
- 0xc7, 0x7c, 0xcd, 0xbc, 0x8a, 0x7e, 0x20, 0x3e, 0x75, 0x34, 0x3a, 0xbe,
- 0x80, 0xb1, 0xee, 0x3d, 0xd0, 0x98, 0xab, 0xbe, 0x24, 0xc3, 0xc5, 0xbe,
- 0x52, 0xcf, 0x94, 0xbe, 0x52, 0x46, 0x00, 0xbf, 0xf3, 0x0f, 0x05, 0x3e,
- 0x57, 0xf7, 0xc1, 0x3e, 0xf1, 0xe2, 0x84, 0x3e, 0xd2, 0x75, 0xd2, 0x3c,
- 0x37, 0xf0, 0xaf, 0xbd, 0xfa, 0xd8, 0xdb, 0xbd, 0x04, 0x43, 0x6a, 0x3d,
- 0x9e, 0x4e, 0x84, 0x3e, 0x17, 0xb1, 0xf1, 0x3e, 0xf8, 0x2b, 0x29, 0x3d,
- 0xf0, 0x22, 0x3f, 0x3d, 0x34, 0x54, 0x1e, 0x3e, 0xf8, 0xa1, 0xa3, 0x3d,
- 0x73, 0xc2, 0x40, 0x3d, 0x8c, 0x64, 0x09, 0xbe, 0x10, 0xc3, 0x50, 0x3e,
- 0xc7, 0xf2, 0x8c, 0x3e, 0xdb, 0xc9, 0x6a, 0xbf, 0x3c, 0x8f, 0xa1, 0xbe,
- 0x25, 0xa0, 0xd0, 0x3d, 0xa6, 0x9b, 0xb5, 0x3e, 0x5c, 0x7d, 0x2a, 0xbe,
- 0x20, 0xc7, 0x68, 0xbe, 0x1f, 0x45, 0x75, 0xbe, 0x0d, 0xbd, 0xca, 0xbd,
- 0x7e, 0x19, 0x8a, 0x3d, 0xc6, 0x17, 0x18, 0x3d, 0x77, 0x5a, 0x6e, 0xbd,
- 0x78, 0xde, 0xb9, 0xbe, 0x34, 0x6e, 0x03, 0xbe, 0x76, 0x03, 0xad, 0xbd,
- 0x19, 0xc5, 0x3a, 0x37, 0x24, 0x01, 0x02, 0xbf, 0x4f, 0x93, 0x39, 0x3e,
- 0x30, 0x70, 0xe6, 0x3d, 0x55, 0x2b, 0xcb, 0xbd, 0x14, 0x41, 0x91, 0x3e,
- 0x2b, 0x8b, 0xf7, 0xbe, 0x06, 0x16, 0x1a, 0x3e, 0x2a, 0x69, 0x9e, 0x3e,
- 0x38, 0xf7, 0x7b, 0x3d, 0xff, 0x56, 0x3e, 0xbe, 0x19, 0x04, 0xe3, 0xbd,
- 0x77, 0x34, 0x76, 0x3e, 0x41, 0x3d, 0x15, 0xbe, 0x3b, 0xb4, 0x09, 0x3e,
- 0x35, 0x1d, 0x8e, 0xbe, 0xd6, 0xc3, 0xc0, 0xbe, 0x2f, 0xaf, 0xcf, 0xbd,
- 0x7d, 0x38, 0xa3, 0xbe, 0x40, 0x7a, 0x11, 0xbc, 0xbc, 0xd7, 0x65, 0xbe,
- 0xb9, 0x04, 0xdf, 0x3e, 0xa4, 0xdf, 0x8e, 0x3e, 0x2d, 0x6e, 0xe4, 0x3c,
- 0x2e, 0x64, 0x99, 0xbe, 0x62, 0xbd, 0x39, 0xbb, 0xa4, 0x54, 0x08, 0x3e,
- 0x8c, 0xc0, 0xe0, 0x3e, 0x9d, 0xad, 0xdb, 0xbd, 0x54, 0xea, 0x0c, 0x3e,
- 0x28, 0xe6, 0x2a, 0xbe, 0x4c, 0x18, 0x10, 0xbe, 0xfe, 0xa6, 0x4b, 0x3d,
- 0x71, 0x70, 0x26, 0x3e, 0x1c, 0x44, 0x61, 0x3e, 0xf9, 0x69, 0x8f, 0x3e,
- 0x46, 0x96, 0xfd, 0xbc, 0x38, 0x71, 0x0b, 0x3c, 0x1b, 0x74, 0x0f, 0x3e,
- 0x6d, 0xe9, 0xe0, 0x3e, 0xcf, 0xd7, 0x9c, 0x3d, 0x16, 0xe2, 0x21, 0x3d,
- 0x23, 0xce, 0xe4, 0xbe, 0xa5, 0x8c, 0x89, 0xbe, 0x83, 0xec, 0x85, 0x3d,
- 0xe2, 0xc7, 0xdc, 0x3e, 0x2c, 0xca, 0x53, 0x3e, 0xd3, 0xe4, 0xb2, 0x3e,
- 0xa1, 0xc5, 0xde, 0xbd, 0x4c, 0x87, 0x16, 0x3e, 0xb0, 0xcc, 0x26, 0xbe,
- 0x87, 0x16, 0x39, 0x3e, 0x49, 0x43, 0xd3, 0xbe, 0x09, 0x19, 0xb6, 0xbd,
- 0xaf, 0xd3, 0xcc, 0x3e, 0xec, 0x57, 0x0f, 0x3f, 0x91, 0xff, 0xed, 0xbe,
- 0xf4, 0x69, 0x6d, 0x3e, 0x6d, 0xf6, 0xb2, 0x3e, 0xad, 0x69, 0x86, 0x3d,
- 0x72, 0x39, 0x4f, 0x3e, 0x75, 0x9a, 0xfe, 0x3d, 0xec, 0x0a, 0x35, 0x3e,
- 0xbd, 0x26, 0x3a, 0xbe, 0x44, 0x6b, 0x4f, 0x3e, 0xaa, 0x25, 0xb9, 0xbc,
- 0xc6, 0x80, 0xf4, 0xbe, 0x55, 0xa1, 0xbb, 0xbe, 0xef, 0x22, 0x97, 0x3e,
- 0x61, 0x71, 0x21, 0xbe, 0x66, 0xf3, 0x82, 0x3e, 0x75, 0x8d, 0xb8, 0xbe,
- 0x35, 0x28, 0x6d, 0xbe, 0xc7, 0x45, 0xc6, 0xbd, 0x89, 0x9a, 0x51, 0xbe,
- 0x96, 0x62, 0x14, 0x3f, 0xe7, 0x84, 0x65, 0x3e, 0x4d, 0x1e, 0xac, 0xbe,
- 0x15, 0x59, 0x9f, 0x3e, 0x8b, 0xaf, 0x9a, 0xbe, 0xca, 0x81, 0x2f, 0x3d,
- 0x73, 0x28, 0x57, 0x3e, 0x43, 0x3e, 0x3d, 0xbf, 0x21, 0x38, 0xb6, 0x3c,
- 0xe2, 0x62, 0x62, 0x3e, 0x74, 0x42, 0x1d, 0xbf, 0x29, 0xb5, 0xac, 0x3d,
- 0x9d, 0x30, 0xe3, 0x3d, 0xf1, 0xda, 0x88, 0x3e, 0x58, 0x0c, 0x49, 0xbe,
- 0xa4, 0xe6, 0x56, 0x3e, 0xd3, 0x42, 0xf3, 0x3c, 0xed, 0xcc, 0x3d, 0xbf,
- 0xfb, 0x6e, 0x0b, 0xbf, 0x70, 0x3e, 0xd5, 0xbe, 0x82, 0x6b, 0x38, 0xbe,
- 0xa9, 0x3f, 0x14, 0x3f, 0x4e, 0x11, 0xbb, 0x3d, 0xed, 0x67, 0x0a, 0xbe,
- 0xbe, 0x9f, 0xf2, 0xbe, 0x36, 0x90, 0xc3, 0xbc, 0x19, 0xd9, 0xf3, 0xbe,
- 0x0c, 0x0d, 0xaf, 0x3e, 0xb4, 0x5e, 0x40, 0xbf, 0x62, 0xfb, 0x8e, 0xbe,
- 0x0a, 0x8e, 0x13, 0x3e, 0x4c, 0x3f, 0xfe, 0xbe, 0x65, 0xaf, 0x8e, 0xbe,
- 0x7e, 0xfb, 0x07, 0x3e, 0x6d, 0xd2, 0x82, 0x3e, 0x1b, 0xf2, 0x0a, 0xbe,
- 0x0f, 0xde, 0xa2, 0xbd, 0xd0, 0xfb, 0x39, 0xbe, 0x09, 0x93, 0xdc, 0xbe,
- 0xeb, 0x38, 0xcc, 0xbe, 0x0d, 0x7a, 0xc4, 0x3c, 0x83, 0xd2, 0xb4, 0x3e,
- 0x86, 0xd2, 0xc2, 0x3e, 0x0b, 0xf9, 0x6c, 0xbd, 0xfb, 0x88, 0x38, 0x3e,
- 0x07, 0x32, 0x34, 0xbe, 0x82, 0x9c, 0xb6, 0x3e, 0x23, 0x61, 0x26, 0x3e,
- 0xec, 0x62, 0x44, 0x3e, 0xfd, 0xcc, 0xb0, 0xbd, 0x00, 0xb8, 0xcd, 0x3d,
- 0x1f, 0x2b, 0x36, 0xbe, 0x20, 0x63, 0x24, 0x3e, 0xc1, 0x65, 0x4f, 0xbe,
- 0x9e, 0xc7, 0x78, 0x3e, 0x4a, 0xff, 0x94, 0x3e, 0x08, 0x27, 0x8f, 0xbd,
- 0x9d, 0x6b, 0x1f, 0xbd, 0x65, 0x86, 0x68, 0xbe, 0xe8, 0x1c, 0x46, 0xbf,
- 0x34, 0x46, 0x81, 0xbe, 0x03, 0x82, 0x99, 0xbe, 0xc7, 0x2a, 0x4d, 0x3d,
- 0xe9, 0xa9, 0x4e, 0xbb, 0x50, 0x1d, 0xb7, 0xbe, 0x85, 0xff, 0x12, 0xbd,
- 0xc0, 0x62, 0x92, 0x3d, 0x4c, 0x97, 0x36, 0xbf, 0xa2, 0xd6, 0x9a, 0xbd,
- 0x50, 0x1a, 0xa5, 0xbe, 0x2b, 0xd8, 0x94, 0xbd, 0x72, 0x23, 0xf7, 0x3d,
- 0x4a, 0x19, 0xdf, 0xbe, 0x30, 0x1d, 0x2e, 0xbe, 0x11, 0xf4, 0x3b, 0xbe,
- 0x10, 0x89, 0x43, 0x3e, 0xf3, 0x7e, 0x9e, 0xbf, 0x19, 0xb8, 0x41, 0xbf,
- 0x7c, 0xac, 0x93, 0xbe, 0x36, 0xfe, 0x20, 0xbe, 0x82, 0x3f, 0xba, 0xbe,
- 0x85, 0x8f, 0xcc, 0x3d, 0x55, 0x92, 0xcf, 0xbe, 0x23, 0x1f, 0x0f, 0xbf,
- 0x15, 0x7c, 0x2a, 0xbe, 0x6d, 0xa1, 0x13, 0xbe, 0x9b, 0x1a, 0x73, 0x3d,
- 0xe3, 0x95, 0xf3, 0xbd, 0xf1, 0x97, 0x8d, 0xbe, 0xa0, 0x67, 0x10, 0x3e,
- 0xc1, 0x68, 0xfe, 0xbd, 0xe8, 0xfd, 0xde, 0x3d, 0x1e, 0x47, 0x01, 0xbe,
- 0xd3, 0x81, 0xb8, 0xbd, 0x99, 0xed, 0x01, 0x3d, 0x09, 0x01, 0xf5, 0xbe,
- 0x76, 0x98, 0x32, 0x3e, 0x15, 0x62, 0x6a, 0x3d, 0x45, 0x18, 0x07, 0xbe,
- 0x04, 0x06, 0x09, 0xbe, 0x6a, 0x55, 0x5f, 0xbe, 0xcf, 0x62, 0x1e, 0xbf,
- 0xe8, 0x32, 0x80, 0xbe, 0x56, 0xf1, 0x28, 0x3c, 0x97, 0x95, 0x9f, 0xbc,
- 0xd2, 0x48, 0x73, 0x3d, 0x0e, 0x0a, 0x87, 0xbe, 0xbf, 0x7e, 0xde, 0xbd,
- 0x99, 0x31, 0x11, 0x3c, 0xd2, 0xd1, 0x4c, 0xbe, 0x27, 0xf3, 0x2f, 0xbe,
- 0x73, 0xb3, 0xd0, 0xbb, 0xa7, 0x49, 0x52, 0xbd, 0xe9, 0x5d, 0x89, 0x3c,
- 0xec, 0x6f, 0xfe, 0x3b, 0x0c, 0x2d, 0x9b, 0x3e, 0xaa, 0x7a, 0x37, 0x3e,
- 0xd6, 0x8f, 0xd8, 0x3d, 0x13, 0x48, 0x80, 0x3d, 0x02, 0x14, 0x41, 0x3e,
- 0x0c, 0xe5, 0x49, 0x3e, 0xa0, 0x79, 0x81, 0x3d, 0x9e, 0x04, 0x83, 0xbe,
- 0x53, 0x2c, 0xd8, 0x3d, 0x9f, 0xac, 0xa7, 0xbe, 0xf7, 0x8d, 0x1a, 0xbe,
- 0xb5, 0xd9, 0x45, 0xbe, 0xce, 0x55, 0x90, 0xbe, 0xc4, 0x9e, 0xed, 0xbd,
- 0x2b, 0x27, 0xac, 0x3d, 0x27, 0xdd, 0x83, 0xbd, 0x71, 0x5d, 0xa2, 0xbe,
- 0x3e, 0x82, 0xc0, 0xbe, 0x85, 0x64, 0x0e, 0xbf, 0x9e, 0xa3, 0x01, 0x3e,
- 0x4b, 0x16, 0xc8, 0x3d, 0x65, 0x2e, 0xc7, 0xbe, 0xbd, 0xb2, 0x7b, 0xbe,
- 0xa7, 0x41, 0x5f, 0xbe, 0xcb, 0xb4, 0x0f, 0xbe, 0x9e, 0x74, 0x19, 0xbe,
- 0xbb, 0x1e, 0xe0, 0x3d, 0xa0, 0xea, 0xb8, 0xbc, 0x03, 0x06, 0x8f, 0x3e,
- 0x58, 0x96, 0x47, 0x3e, 0xfd, 0xbd, 0x0e, 0xbd, 0x37, 0x5c, 0x96, 0x3d,
- 0xe8, 0x2d, 0xff, 0x3c, 0xc5, 0x6e, 0x99, 0xbd, 0xa9, 0x68, 0x03, 0xbf,
- 0x5b, 0x92, 0x35, 0xbe, 0x1a, 0xcc, 0x4c, 0xbd, 0xe7, 0x92, 0x4c, 0x3e,
- 0x4e, 0x77, 0xbf, 0xbd, 0xf7, 0x6b, 0xae, 0x3d, 0x6a, 0x10, 0xcd, 0xbe,
- 0xd7, 0x5f, 0x9d, 0x3c, 0x33, 0xc1, 0x51, 0xbe, 0x25, 0x64, 0x32, 0xbb,
- 0x3a, 0x96, 0xa9, 0xbe, 0x40, 0xfc, 0x65, 0xbe, 0xa0, 0x91, 0x45, 0xbd,
- 0xb7, 0xcd, 0x1c, 0xbf, 0xec, 0x08, 0x9d, 0xbd, 0x08, 0x32, 0x73, 0x3d,
- 0x6f, 0x08, 0xae, 0x3c, 0xe3, 0x25, 0x4f, 0xbe, 0xc3, 0x14, 0xe3, 0xbd,
- 0x19, 0x63, 0x87, 0x3e, 0x68, 0xb7, 0x8c, 0x3e, 0x35, 0xd0, 0xa7, 0xbd,
- 0x3a, 0x5a, 0xb8, 0x3d, 0x88, 0x64, 0xeb, 0x3c, 0xef, 0xce, 0xb0, 0x3e,
- 0x77, 0xe9, 0x70, 0xbd, 0x61, 0x44, 0x22, 0xbf, 0x86, 0x54, 0xe2, 0xbe,
- 0xab, 0xfe, 0xb0, 0x3b, 0xb9, 0xe5, 0x77, 0x3e, 0x88, 0xea, 0x55, 0xbe,
- 0x22, 0x71, 0x20, 0xbe, 0xca, 0x1e, 0x44, 0xbe, 0x9f, 0x84, 0x26, 0xbe,
- 0x2d, 0xfa, 0xf3, 0x3c, 0x61, 0x95, 0x0f, 0x3e, 0xc2, 0x45, 0x6a, 0xbe,
- 0x5b, 0x26, 0x6e, 0xbe, 0x0b, 0x95, 0x49, 0xbd, 0xf5, 0xa5, 0x67, 0xbf,
- 0x94, 0x43, 0x82, 0xbe, 0x74, 0x99, 0x46, 0x3e, 0xa5, 0x18, 0xa8, 0xbe,
- 0x6d, 0x21, 0x69, 0x3e, 0x76, 0x42, 0xd8, 0xbd, 0x06, 0xb6, 0xdd, 0xbd,
- 0x28, 0xd3, 0xb2, 0xbe, 0xf0, 0xcc, 0x02, 0x3e, 0x3a, 0xb6, 0x7f, 0xbe,
- 0x7b, 0x83, 0xd0, 0x3e, 0xb1, 0x6c, 0xa4, 0xbd, 0x0e, 0xd6, 0xa3, 0xbe,
- 0x9e, 0xbe, 0xfc, 0xbd, 0x81, 0xd8, 0xef, 0x3d, 0x76, 0xfc, 0xda, 0x3d,
- 0xc9, 0x87, 0x3c, 0xbe, 0x48, 0xd0, 0x91, 0x3c, 0x17, 0x12, 0x18, 0xbf,
- 0xb4, 0x3e, 0x4a, 0xbf, 0x46, 0x60, 0x6a, 0x3e, 0x92, 0xb2, 0x30, 0xbe,
- 0x53, 0xeb, 0x83, 0xbe, 0xd1, 0x06, 0x81, 0x3c, 0x19, 0x46, 0x70, 0xbc,
- 0x4f, 0xbc, 0xf6, 0x3d, 0xe3, 0x2f, 0x6e, 0x3c, 0xc4, 0x8d, 0x36, 0xbe,
- 0xfc, 0x1f, 0x98, 0xbe, 0x61, 0xca, 0x03, 0xbe, 0x64, 0x50, 0x04, 0xbe,
- 0x76, 0xaf, 0x02, 0x3f, 0x93, 0x5d, 0x32, 0xbd, 0x1a, 0xb6, 0x1b, 0x3d,
- 0x5e, 0x37, 0xad, 0xbd, 0xd5, 0xd6, 0xd1, 0x3e, 0x0b, 0xb5, 0x62, 0x3e,
- 0xf6, 0x9a, 0x43, 0xbe, 0xe1, 0xdb, 0xb1, 0xbe, 0xd2, 0x8b, 0x53, 0xbe,
- 0x88, 0x36, 0x53, 0xbe, 0x2f, 0xae, 0xb7, 0xbe, 0x61, 0x88, 0x36, 0x3e,
- 0xf3, 0x51, 0xc3, 0xbd, 0xbc, 0xb8, 0x4a, 0x3e, 0x65, 0x32, 0xd7, 0x3d,
- 0x0b, 0x8a, 0x0f, 0xbe, 0xec, 0x81, 0x14, 0x3e, 0x11, 0x8e, 0x0b, 0x3e,
- 0x8f, 0x3a, 0xc9, 0x3e, 0xd0, 0xd2, 0x2d, 0xbe, 0x61, 0xf0, 0x09, 0x3f,
- 0xfa, 0xee, 0x67, 0xbd, 0xfb, 0x9e, 0xec, 0xbd, 0xce, 0xd9, 0x84, 0xbe,
- 0x73, 0x99, 0x3e, 0xbb, 0xcd, 0x9f, 0xa9, 0x3d, 0x0c, 0x4b, 0x11, 0x3d,
- 0x1e, 0xb1, 0x20, 0xbe, 0x1a, 0x42, 0x56, 0xbe, 0x0c, 0x07, 0xfc, 0xbd,
- 0x43, 0x1e, 0x26, 0x3d, 0x01, 0x95, 0x2e, 0x3d, 0x04, 0xe5, 0x8b, 0xbe,
- 0x51, 0xd2, 0x98, 0xbe, 0x21, 0x11, 0x8b, 0x3c, 0x43, 0x9b, 0xb2, 0x3e,
- 0x0e, 0x57, 0x1a, 0xbe, 0x22, 0xda, 0x45, 0x3e, 0x65, 0xbb, 0x02, 0xbe,
- 0x47, 0x95, 0x1a, 0xbe, 0xff, 0x2c, 0x5f, 0xbe, 0x52, 0x27, 0x7f, 0x3e,
- 0x64, 0x93, 0xb3, 0x3e, 0xb3, 0xde, 0xa6, 0x3d, 0x9b, 0xe5, 0x89, 0xbe,
- 0x6e, 0xd3, 0x74, 0xbe, 0x40, 0x02, 0x4d, 0xbf, 0xa2, 0x6d, 0x64, 0x3e,
- 0x90, 0xa0, 0xae, 0xbe, 0x80, 0xe7, 0x68, 0xbe, 0x0e, 0x22, 0xdc, 0x38,
- 0x3d, 0xce, 0x03, 0xbe, 0xd9, 0x4b, 0xdb, 0xbd, 0xcc, 0xc0, 0xcf, 0x3e,
- 0x03, 0x6b, 0xbd, 0x3e, 0x7a, 0x5c, 0xc8, 0xbd, 0xa7, 0x4c, 0xd7, 0xbe,
- 0x9b, 0xd5, 0x35, 0x3e, 0x68, 0x83, 0xb0, 0xbc, 0x33, 0xe3, 0x64, 0x3e,
- 0x96, 0x62, 0x08, 0x3e, 0x10, 0x15, 0x12, 0x3f, 0x60, 0x39, 0x64, 0xbe,
- 0xac, 0x12, 0x98, 0xbd, 0x8d, 0x7f, 0xed, 0xbe, 0x8f, 0xe3, 0x8a, 0xbe,
- 0x5c, 0x01, 0x2e, 0x3d, 0x2d, 0xbe, 0x93, 0x3e, 0xa9, 0xe6, 0xd6, 0xbd,
- 0xdc, 0x6b, 0x7f, 0x3e, 0xb5, 0x03, 0x82, 0xbe, 0x87, 0x61, 0xc6, 0xbc,
- 0x9e, 0x2a, 0x00, 0xbe, 0x59, 0xa5, 0x05, 0xbf, 0x4f, 0x0f, 0x0c, 0xbd,
- 0x3d, 0xe8, 0x13, 0x3e, 0xf6, 0x13, 0x8d, 0xbe, 0x5e, 0x62, 0xa5, 0x3e,
- 0xd7, 0x32, 0x37, 0xbe, 0x01, 0xdd, 0xbc, 0x3d, 0x06, 0x2a, 0x5d, 0x3c,
- 0xc7, 0x08, 0xec, 0xbc, 0xf4, 0xec, 0x32, 0xbe, 0x74, 0xb1, 0xbc, 0x3b,
- 0x35, 0x57, 0x04, 0x3f, 0x49, 0x5d, 0x62, 0x3d, 0x98, 0x12, 0x51, 0xbe,
- 0x3e, 0x77, 0x9f, 0xbe, 0xb9, 0xb1, 0x7c, 0x3e, 0x46, 0x8d, 0x84, 0xbe,
- 0xf8, 0x66, 0x05, 0x3e, 0x6c, 0x71, 0xa0, 0xbe, 0xc6, 0x98, 0xf3, 0x3c,
- 0x4f, 0x0b, 0x3e, 0xbf, 0x3f, 0x98, 0x4d, 0x3e, 0x7f, 0xa6, 0x13, 0x3e,
- 0xba, 0x51, 0x14, 0x3f, 0x02, 0x5e, 0x05, 0x3e, 0xb1, 0x9c, 0x7a, 0xbe,
- 0x84, 0xbd, 0x84, 0xbe, 0x12, 0xa6, 0x7b, 0xbe, 0x37, 0xa2, 0x3b, 0x3e,
- 0x41, 0x37, 0x11, 0x3d, 0x16, 0xb5, 0x84, 0x3d, 0xed, 0xbb, 0xc0, 0xbe,
- 0xec, 0xd8, 0x55, 0xbe, 0x70, 0xc2, 0x34, 0xbd, 0x52, 0x34, 0x14, 0xbf,
- 0x9b, 0x37, 0xb5, 0x3d, 0xaf, 0x5f, 0x4b, 0xbe, 0x0a, 0x3a, 0x2c, 0x3e,
- 0x07, 0xbb, 0xa8, 0xbe, 0x01, 0x9d, 0xda, 0xbe, 0xb2, 0x3b, 0x5e, 0xbe,
- 0x49, 0x86, 0xb5, 0xbd, 0x93, 0xdb, 0x17, 0x3e, 0x33, 0x70, 0x27, 0xbf,
- 0x19, 0x96, 0xbe, 0x3c, 0x26, 0x26, 0x34, 0xbe, 0x26, 0x78, 0x89, 0xbe,
- 0x33, 0x68, 0x71, 0x3e, 0xb4, 0x0c, 0x6c, 0xbe, 0x95, 0xc1, 0x55, 0x3e,
- 0x26, 0xe4, 0x1e, 0x3e, 0xdb, 0x85, 0x23, 0x3e, 0xd4, 0xab, 0x88, 0xbd,
- 0x14, 0xb7, 0x46, 0xbd, 0xdc, 0x40, 0x45, 0x3e, 0x19, 0xaa, 0x45, 0x3e,
- 0x72, 0x82, 0x9f, 0xbe, 0xc0, 0x20, 0xd4, 0x3d, 0x17, 0x20, 0x32, 0xbd,
- 0xc4, 0x1a, 0xb4, 0xbd, 0xb3, 0xca, 0x2c, 0x3e, 0xbe, 0x88, 0xeb, 0x3c,
- 0x95, 0xc7, 0x07, 0xbf, 0x40, 0x02, 0x90, 0x3e, 0x2f, 0x19, 0x4c, 0xbe,
- 0xd4, 0x93, 0x30, 0xbe, 0x73, 0xa0, 0x5c, 0xbe, 0xfd, 0x04, 0xb9, 0xbd,
- 0x93, 0xc8, 0x89, 0x3d, 0xb2, 0xa2, 0x2d, 0xbe, 0xbc, 0x39, 0x5e, 0x3d,
- 0x91, 0xc0, 0x93, 0xbd, 0x5c, 0xc8, 0xfc, 0xbc, 0x06, 0xd7, 0x8d, 0xbe,
- 0xa5, 0xc6, 0xc5, 0x3e, 0x67, 0xca, 0xaf, 0xbe, 0x23, 0x8c, 0x69, 0x3e,
- 0xe5, 0x7a, 0xcb, 0xbd, 0x63, 0xa7, 0x1d, 0xbf, 0x77, 0x3d, 0xa2, 0xbd,
- 0x21, 0x94, 0xa9, 0x3d, 0x06, 0x53, 0x76, 0xbe, 0xb1, 0xa3, 0x0f, 0x3e,
- 0xbe, 0x9a, 0x27, 0x3e, 0x83, 0x17, 0xa7, 0xbd, 0x91, 0x1a, 0x01, 0x3e,
- 0xce, 0xc3, 0x0c, 0xbf, 0x0b, 0x83, 0xc2, 0x3e, 0x64, 0x41, 0x05, 0xbf,
- 0x0d, 0x1b, 0x76, 0xbd, 0x06, 0x89, 0x00, 0x3f, 0xd2, 0xfd, 0x4a, 0x3e,
- 0x51, 0x9d, 0x86, 0xbe, 0x2a, 0x84, 0x70, 0x3e, 0xc6, 0xc9, 0xb3, 0x3d,
- 0xfa, 0x2a, 0xfb, 0x3d, 0xc2, 0x13, 0xbd, 0xbe, 0x63, 0x50, 0x88, 0xbe,
- 0x14, 0xa3, 0x97, 0xbe, 0xcb, 0x23, 0x86, 0xbf, 0x58, 0xf4, 0x6a, 0x3e,
- 0xed, 0x96, 0xe9, 0xbe, 0x03, 0xeb, 0x9c, 0xbe, 0xd3, 0x2a, 0xa0, 0xbe,
- 0x99, 0x13, 0x18, 0xbe, 0x19, 0x65, 0x18, 0x3e, 0xb5, 0x76, 0x39, 0x3e,
- 0xdc, 0x79, 0xc4, 0xbe, 0x2f, 0xb8, 0xdd, 0xbe, 0x9d, 0xa3, 0x64, 0xbe,
- 0xe8, 0x1e, 0x83, 0xbe, 0xab, 0xd9, 0x1c, 0xbd, 0x1c, 0xd0, 0x9d, 0x3d,
- 0xcb, 0x5f, 0x66, 0x3d, 0x13, 0xbe, 0x15, 0xbe, 0xe7, 0xfc, 0x66, 0x3e,
- 0x15, 0x9b, 0x1f, 0xbf, 0x9c, 0x4b, 0xef, 0xbe, 0x3e, 0xd0, 0x47, 0x3e,
- 0x3d, 0xf2, 0xde, 0x3e, 0x18, 0x69, 0x8a, 0x3e, 0x68, 0xad, 0x20, 0xbf,
- 0x4d, 0xee, 0x27, 0xbe, 0xd5, 0x55, 0x19, 0xbe, 0xe0, 0xfc, 0x28, 0xbe,
- 0x04, 0xc6, 0x3c, 0xbe, 0x95, 0xd0, 0x13, 0xbf, 0x69, 0xdb, 0x1c, 0x3e,
- 0xbc, 0x16, 0xf4, 0xbe, 0x26, 0x6c, 0x4a, 0x3e, 0x53, 0xc2, 0x7c, 0x3d,
- 0xc8, 0xe5, 0xcd, 0x3e, 0x42, 0x93, 0x32, 0x3e, 0x6f, 0x6b, 0x4b, 0xbd,
- 0x5e, 0x7c, 0xbc, 0xbc, 0x60, 0xa8, 0xe5, 0xbd, 0x1a, 0x22, 0xb0, 0x3e,
- 0x8f, 0x8c, 0xe3, 0xbc, 0x53, 0x08, 0x0a, 0xbf, 0xb6, 0x16, 0xbc, 0xbe,
- 0xc5, 0x37, 0xa1, 0xbe, 0x0a, 0x51, 0x8a, 0xbe, 0xea, 0xea, 0x9e, 0xbe,
- 0xc2, 0x15, 0x0d, 0xbe, 0xdb, 0x4e, 0x20, 0x3e, 0xac, 0x13, 0x83, 0xbe,
- 0x89, 0xdf, 0x95, 0x3d, 0xc9, 0x01, 0x64, 0x3d, 0x49, 0xdf, 0x39, 0xbd,
- 0xed, 0x23, 0x8e, 0xbe, 0xca, 0xf1, 0x3c, 0x3e, 0xe1, 0x47, 0xaa, 0xbc,
- 0x9b, 0x63, 0x98, 0x3e, 0x96, 0x2a, 0x9d, 0x3e, 0xfb, 0x15, 0xc2, 0xbe,
- 0x39, 0x0b, 0x5a, 0x3c, 0xf7, 0x44, 0x2a, 0xbd, 0x8f, 0x63, 0xe8, 0xbd,
- 0x6a, 0x35, 0x86, 0x3d, 0xec, 0xdc, 0x9f, 0x3d, 0x16, 0x3f, 0x3e, 0xbe,
- 0x34, 0x86, 0xbe, 0x3d, 0xd2, 0x8b, 0x1e, 0xbd, 0x11, 0xe7, 0x7d, 0xbe,
- 0x11, 0x03, 0xf7, 0xbe, 0x6b, 0x36, 0xbd, 0xbe, 0x7f, 0xa2, 0xc6, 0xbd,
- 0x0e, 0x52, 0x17, 0xbf, 0xa2, 0xc8, 0xa5, 0x3d, 0x05, 0x03, 0x5d, 0x3d,
- 0xfb, 0xfa, 0x52, 0x3d, 0xfc, 0x76, 0xe0, 0xbb, 0x50, 0x7a, 0x7f, 0x3d,
- 0x57, 0x6e, 0x99, 0x3e, 0x00, 0xdf, 0x36, 0x3c, 0xdf, 0x84, 0x73, 0xbe,
- 0xa5, 0x62, 0x9a, 0xbd, 0xf8, 0x8e, 0x00, 0xbf, 0xe3, 0x1a, 0x85, 0x3e,
- 0xf2, 0x3f, 0x4c, 0xbe, 0x26, 0x98, 0xbb, 0xbe, 0xc2, 0xfc, 0x94, 0x3d,
- 0x21, 0x04, 0x86, 0xbe, 0x0a, 0x80, 0x0d, 0xbd, 0x39, 0xf8, 0x88, 0xbe,
- 0x4f, 0x8f, 0x0f, 0xbe, 0x51, 0x0a, 0x23, 0xbe, 0xd4, 0x4e, 0xd8, 0x3c,
- 0x58, 0x62, 0x41, 0xbe, 0xe9, 0x15, 0xba, 0xbd, 0xe1, 0xce, 0xec, 0xbb,
- 0xa7, 0x29, 0x8e, 0x3c, 0x7c, 0x8c, 0x29, 0x3e, 0xfe, 0xff, 0x19, 0xbe,
- 0x27, 0x4a, 0x96, 0x3c, 0xf8, 0x59, 0xac, 0xbe, 0xf1, 0x1a, 0x0f, 0xbf,
- 0x3a, 0x1f, 0x16, 0x3d, 0x6f, 0x38, 0x0d, 0xbe, 0xc4, 0x91, 0x9f, 0x3e,
- 0x13, 0xc3, 0x96, 0xbe, 0x4c, 0x43, 0x31, 0xbb, 0xcb, 0x90, 0x2e, 0x3c,
- 0xa8, 0xae, 0x03, 0x3d, 0x75, 0xad, 0x8e, 0x3e, 0x88, 0x2d, 0x9d, 0x3e,
- 0xa0, 0xa9, 0x42, 0x3e, 0x38, 0x72, 0xd7, 0xbe, 0xeb, 0xdc, 0x7f, 0x3c,
- 0x99, 0xb9, 0xc3, 0x3e, 0x46, 0x37, 0x6c, 0xbe, 0x25, 0xeb, 0xa4, 0xbe,
- 0x65, 0x76, 0xe5, 0xbe, 0xd9, 0x33, 0x94, 0xbe, 0x5f, 0x0a, 0xa2, 0xbe,
- 0x1d, 0x40, 0xed, 0x3e, 0x60, 0xab, 0x12, 0xbf, 0x30, 0xf1, 0xba, 0xbc,
- 0x1d, 0xa9, 0xdf, 0x3d, 0x82, 0x99, 0x2c, 0xbd, 0x40, 0xc0, 0x8e, 0xbe,
- 0xce, 0x55, 0x34, 0xbe, 0xd5, 0x7e, 0xe7, 0xbd, 0x0d, 0x25, 0x5c, 0xbe,
- 0xaf, 0xc4, 0x4c, 0x3d, 0xc3, 0x58, 0x87, 0xbe, 0x0b, 0xbb, 0xa9, 0x3c,
- 0xa7, 0xfd, 0x10, 0xbf, 0x89, 0xe6, 0xb8, 0x3d, 0x26, 0xda, 0x26, 0x3c,
- 0xf1, 0x1e, 0xb0, 0x3e, 0xc2, 0x9c, 0x1f, 0x3e, 0x6b, 0x70, 0xaa, 0xbe,
- 0xad, 0x91, 0x56, 0xbe, 0x2d, 0x71, 0x56, 0xbe, 0x05, 0xe9, 0x7e, 0xbe,
- 0xc3, 0x47, 0x06, 0xbf, 0x08, 0xf5, 0xfb, 0xbe, 0x5d, 0x4b, 0x21, 0xbf,
- 0xb6, 0xa3, 0xad, 0xbd, 0x8e, 0x11, 0xd1, 0xbd, 0xf6, 0x99, 0xe6, 0xbe,
- 0xbb, 0xc4, 0x13, 0x3d, 0xb4, 0x62, 0x85, 0x3b, 0xd6, 0x66, 0x3c, 0xbe,
- 0x75, 0x90, 0xef, 0x3d, 0xbd, 0x5f, 0x75, 0x3d, 0xda, 0xaf, 0x4c, 0xbe,
- 0x68, 0x52, 0xee, 0x3e, 0x3f, 0x75, 0x81, 0xbe, 0x18, 0xf3, 0x2d, 0x3e,
- 0x6c, 0xad, 0x43, 0x3e, 0xed, 0xe2, 0x0b, 0xbe, 0x61, 0xf4, 0xa2, 0x3d,
- 0x12, 0xb4, 0xa7, 0x3e, 0xaf, 0xf7, 0xe5, 0x3d, 0x56, 0x86, 0x2b, 0xbe,
- 0x86, 0xc7, 0x2e, 0x3e, 0x2d, 0x99, 0x8b, 0xbd, 0x25, 0xfd, 0xe6, 0x3c,
- 0xc1, 0x27, 0x7c, 0xbd, 0x87, 0x82, 0x9a, 0xbe, 0x7c, 0x00, 0x7b, 0xbe,
- 0x9b, 0xd1, 0xb5, 0xbe, 0x07, 0x51, 0x93, 0xbd, 0xc3, 0xc4, 0xcb, 0x3e,
- 0x89, 0xf3, 0xa6, 0x3d, 0x0b, 0x69, 0x19, 0xbb, 0x69, 0xed, 0xb4, 0xbc,
- 0x85, 0x5b, 0xa3, 0x3e, 0x35, 0x92, 0x24, 0x3e, 0x06, 0xf4, 0x05, 0x3d,
- 0x6c, 0x73, 0x82, 0xbe, 0x9e, 0xe4, 0x57, 0x3e, 0x37, 0xa2, 0xd1, 0x3e,
- 0xdb, 0xa6, 0x09, 0xbf, 0x07, 0x2f, 0xb9, 0x3e, 0x57, 0xd4, 0xc8, 0x3d,
- 0xee, 0x34, 0x5f, 0x3e, 0x4b, 0xae, 0x6b, 0x3e, 0x75, 0x69, 0xe4, 0x3d,
- 0x87, 0xdd, 0x2c, 0x3e, 0x9c, 0x13, 0x37, 0x3e, 0x7d, 0xd7, 0x03, 0xbe,
- 0x57, 0x3f, 0x91, 0xbd, 0xf2, 0x31, 0x98, 0x3e, 0x81, 0x34, 0xb5, 0xbe,
- 0x86, 0xfd, 0xa2, 0x3e, 0x69, 0x2f, 0x8a, 0xbd, 0x2b, 0x33, 0x15, 0xbe,
- 0x62, 0xd8, 0x27, 0xbe, 0xb8, 0xaf, 0xe4, 0xbc, 0x39, 0x3b, 0xb1, 0xbe,
- 0x71, 0x88, 0xb7, 0x3e, 0xcd, 0x10, 0x0e, 0x3e, 0xef, 0xbd, 0xd0, 0x3c,
- 0x1d, 0x91, 0xae, 0x3d, 0x36, 0x3d, 0x11, 0x3e, 0x11, 0x2e, 0x1b, 0x3e,
- 0xa9, 0xf8, 0x1a, 0xbd, 0xc3, 0xa7, 0x98, 0x3e, 0x77, 0xb0, 0x48, 0xbe,
- 0xac, 0x33, 0x7e, 0xbd, 0x9a, 0x6b, 0x6b, 0xbe, 0x45, 0x83, 0x43, 0xbd,
- 0xf2, 0xf5, 0xcb, 0xbe, 0x5b, 0x42, 0x83, 0x3e, 0xd4, 0x94, 0x91, 0x3e,
- 0x20, 0x89, 0xd5, 0x3d, 0xfa, 0x78, 0xef, 0xbe, 0xde, 0xa9, 0x8c, 0x3c,
- 0xb1, 0x31, 0xf5, 0xbe, 0xaa, 0xea, 0x8d, 0xbe, 0xd5, 0xbd, 0x04, 0xbf,
- 0xa1, 0xb2, 0xf5, 0x3d, 0xf7, 0xdc, 0x40, 0xbf, 0xad, 0x0f, 0x93, 0x3d,
- 0xdf, 0x07, 0xac, 0x3c, 0x31, 0x4f, 0xf5, 0x3d, 0xd3, 0x52, 0xac, 0xbe,
- 0x9e, 0xbb, 0xc0, 0x3e, 0xb0, 0x6a, 0x54, 0x3e, 0x71, 0xf5, 0x75, 0x3e,
- 0x12, 0x6f, 0x92, 0x3c, 0x19, 0xb6, 0x13, 0x3e, 0x99, 0x10, 0x8c, 0x3e,
- 0xa6, 0x51, 0x02, 0xbd, 0xa0, 0xaa, 0x34, 0x3e, 0xe2, 0xd0, 0x3e, 0x3d,
- 0x23, 0x34, 0xf1, 0xbe, 0x09, 0x75, 0x93, 0x3d, 0x57, 0xe6, 0x8b, 0xbe,
- 0x8d, 0xe2, 0x27, 0xbe, 0x8d, 0xe7, 0xb9, 0xbe, 0x1f, 0x7b, 0xac, 0xbe,
- 0x5c, 0x29, 0x27, 0x3c, 0x93, 0x14, 0x67, 0x3e, 0x95, 0xd4, 0x25, 0xbd,
- 0xdf, 0x24, 0xe9, 0xbd, 0x38, 0x61, 0x0d, 0xbf, 0xc8, 0x3e, 0x2d, 0xbf,
- 0x09, 0x2c, 0x5a, 0x3e, 0x84, 0x18, 0xa0, 0xbe, 0x59, 0xdf, 0x0b, 0x3c,
- 0xac, 0xc4, 0xb6, 0x3d, 0xa6, 0x8c, 0xcd, 0x3c, 0x03, 0x73, 0x87, 0x3e,
- 0x01, 0x57, 0xb7, 0x3e, 0xf3, 0x34, 0x14, 0x3e, 0x63, 0x4a, 0xab, 0xbe,
- 0x6a, 0x8f, 0x85, 0x3d, 0x24, 0xd0, 0x74, 0xbe, 0xbc, 0x9b, 0x6e, 0xbe,
- 0x00, 0xd4, 0x15, 0xbe, 0x9e, 0x77, 0xf2, 0xbe, 0x8c, 0x45, 0x4c, 0x3e,
- 0x21, 0x70, 0x3e, 0xbf, 0x10, 0x9b, 0x9e, 0xbe, 0x4f, 0xc0, 0x25, 0xbd,
- 0x56, 0x8a, 0x16, 0xbe, 0x78, 0xc5, 0x84, 0xbc, 0x91, 0xa7, 0x91, 0xbe,
- 0xb5, 0x48, 0x42, 0xbe, 0x29, 0xd7, 0x5b, 0xbd, 0xde, 0x9a, 0x15, 0xbe,
- 0x66, 0x9c, 0x91, 0x3c, 0x3f, 0x5f, 0x17, 0x3e, 0xdf, 0x03, 0xe1, 0x3e,
- 0xc5, 0x8a, 0x36, 0xbf, 0x71, 0xe1, 0x83, 0xbe, 0x6c, 0xab, 0x0e, 0x3e,
- 0x67, 0xfa, 0xab, 0xbe, 0x11, 0x0a, 0x41, 0x3e, 0x74, 0x1e, 0xd9, 0xbe,
- 0x8b, 0x43, 0x8f, 0x3d, 0x53, 0xb5, 0x90, 0xbd, 0xc1, 0x68, 0x19, 0xbe,
- 0xd9, 0x4d, 0xb5, 0xbc, 0xcd, 0x95, 0xa6, 0x3e, 0x1f, 0xb5, 0x9e, 0x3d,
- 0x6e, 0x80, 0x11, 0xbe, 0x13, 0xd6, 0x5e, 0x3e, 0x9e, 0x73, 0x8f, 0xbe,
- 0x90, 0x0c, 0x2e, 0x3e, 0xe8, 0x8f, 0x82, 0xbe, 0xb4, 0x20, 0x08, 0xbe,
- 0xb4, 0xf9, 0xb4, 0xbe, 0x7a, 0xac, 0x9d, 0xbd, 0xac, 0x9b, 0x39, 0x3e,
- 0x16, 0x68, 0x1f, 0x3e, 0xdc, 0x9d, 0x7a, 0x3e, 0xad, 0xa5, 0x68, 0xbe,
- 0x92, 0x1d, 0xdb, 0xbd, 0x30, 0x96, 0x8c, 0xbc, 0xe9, 0x1e, 0xa1, 0x3e,
- 0x35, 0xc1, 0xb1, 0x3d, 0x44, 0xe6, 0xb2, 0xbd, 0x00, 0xde, 0xba, 0xbd,
- 0x9d, 0x4a, 0x14, 0xbd, 0xe2, 0xd6, 0x20, 0xbe, 0x24, 0x39, 0xd3, 0xbe,
- 0x4c, 0x9b, 0x9c, 0xbe, 0x8f, 0xc3, 0x13, 0xbe, 0x6a, 0xf9, 0xf3, 0x3d,
- 0x02, 0x29, 0x93, 0x3e, 0x98, 0x0e, 0x22, 0xbf, 0xd5, 0x4a, 0xb8, 0xbe,
- 0x18, 0xb2, 0xbb, 0x3d, 0x66, 0x2c, 0x9f, 0xbd, 0xea, 0x5e, 0x20, 0x3e,
- 0xc9, 0xa7, 0xa6, 0xbe, 0xcd, 0x3e, 0x6e, 0x3e, 0x09, 0x5b, 0xd3, 0xbd,
- 0x3d, 0x38, 0x11, 0xbe, 0xd2, 0x08, 0xbb, 0xbd, 0xff, 0x90, 0xbc, 0xbe,
- 0x3e, 0xdd, 0x60, 0xbe, 0x66, 0x34, 0x72, 0x3e, 0x89, 0xf4, 0x2b, 0x3e,
- 0x5a, 0xf4, 0xa6, 0x3e, 0x9d, 0x3e, 0x36, 0xbe, 0x6b, 0x9c, 0x32, 0xbd,
- 0xf1, 0x83, 0xa5, 0x3d, 0xdd, 0x50, 0xfb, 0xbe, 0xda, 0x4f, 0x07, 0x3e,
- 0x2f, 0x1c, 0xb3, 0xbe, 0xce, 0x06, 0x0b, 0xbf, 0xb5, 0x1a, 0x68, 0xbe,
- 0x55, 0xb6, 0x42, 0x3d, 0x05, 0xe0, 0x51, 0x3e, 0x70, 0xc1, 0x03, 0x3f,
- 0xa5, 0x66, 0x89, 0x3e, 0xec, 0x45, 0x07, 0xbe, 0xaa, 0x2d, 0x3c, 0x3e,
- 0x2b, 0x7b, 0x8e, 0x3e, 0x14, 0xc4, 0xa3, 0x3b, 0x69, 0x4e, 0x24, 0xbe,
- 0xb6, 0x79, 0x26, 0x3e, 0x2b, 0xb5, 0x08, 0xbf, 0x45, 0x73, 0xd5, 0x3b,
- 0xd9, 0x7c, 0xa0, 0x3e, 0x8c, 0x5f, 0x51, 0xbd, 0x42, 0x88, 0xb3, 0x3d,
- 0xb5, 0xc6, 0x00, 0x3f, 0x22, 0x14, 0x97, 0xbe, 0xad, 0xcd, 0xbe, 0xbe,
- 0xb9, 0x5a, 0x9a, 0xbe, 0x25, 0xc8, 0x25, 0xbe, 0xb9, 0x51, 0x72, 0x3e,
- 0x43, 0xbd, 0xd0, 0x3e, 0x92, 0x9d, 0xd3, 0xbe, 0x28, 0xa4, 0x56, 0x3e,
- 0x10, 0xcc, 0xa0, 0xbd, 0xc5, 0xd4, 0x0a, 0x3d, 0xd9, 0xaa, 0xed, 0x3e,
- 0x92, 0xd2, 0x50, 0x3e, 0x82, 0xfc, 0x87, 0xbe, 0xd6, 0x32, 0x36, 0x3e,
- 0x09, 0xfe, 0x4d, 0xbd, 0xfe, 0x15, 0x31, 0xbe, 0x10, 0x9c, 0xa6, 0x3d,
- 0xb6, 0x00, 0x09, 0x3e, 0x8b, 0x37, 0x6f, 0x3e, 0xa7, 0xb1, 0x0b, 0xbf,
- 0x60, 0x4e, 0x25, 0x3e, 0xe1, 0xa1, 0x21, 0xbe, 0xfb, 0x73, 0xe2, 0xbd,
- 0xbd, 0x92, 0xde, 0x3d, 0x3f, 0x16, 0x22, 0x3e, 0x0e, 0xed, 0x43, 0x3e,
- 0xab, 0x82, 0xa6, 0xbe, 0xc9, 0x60, 0xd3, 0x3d, 0x84, 0xa6, 0x9c, 0x3e,
- 0xa1, 0xda, 0x91, 0xbd, 0xa3, 0xee, 0xff, 0xbe, 0xa4, 0x6e, 0x95, 0x3e,
- 0x46, 0xdf, 0x88, 0x3e, 0x36, 0xf8, 0x75, 0xbe, 0xcb, 0xa2, 0x2b, 0x3e,
- 0x74, 0xc1, 0x8c, 0x3e, 0x06, 0xb9, 0x60, 0xbe, 0x48, 0xe7, 0x9b, 0xbe,
- 0x9e, 0xeb, 0x30, 0xbf, 0x9b, 0x1d, 0x8f, 0xbe, 0x58, 0xf0, 0x6b, 0x3e,
- 0x0b, 0x08, 0x06, 0xbe, 0x7e, 0x5f, 0x79, 0xbe, 0xdf, 0x82, 0x6d, 0xbe,
- 0x50, 0xf2, 0xfe, 0xbd, 0x8b, 0x7b, 0xfb, 0xbd, 0xb9, 0xc1, 0x9d, 0xbd,
- 0x7b, 0x11, 0x00, 0xbb, 0xb9, 0xca, 0x24, 0x3e, 0x14, 0x20, 0xc4, 0xbe,
- 0x68, 0x60, 0xf8, 0x3b, 0xbf, 0xbe, 0xa2, 0xbe, 0x30, 0x5b, 0xdd, 0xbd,
- 0xad, 0x9b, 0xbc, 0x3d, 0x8d, 0x36, 0x61, 0xbc,
+ uint8_t bytes[528];
+ float values[132];
+} 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,
}};
} // anonymous namespace
@@ -15726,6 +17859,7 @@ 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 */
@@ -15751,7 +17885,7 @@ void Inference(
fixed->alloc0);
fixed->shape0[0] = 1;
- fixed->shape0[1] = 117;
+ fixed->shape0[1] = 102;
// dnn/hiddenlayer_0/Relu
Relu<float>(2, // rank
@@ -15765,7 +17899,7 @@ void Inference(
dnn_hiddenlayer_1_bias_part_0.values, fixed->alloc1);
fixed->shape0[0] = 1;
- fixed->shape0[1] = 115;
+ fixed->shape0[1] = 123;
// dnn/hiddenlayer_1/Relu
Relu<float>(2, // rank
@@ -15779,7 +17913,7 @@ void Inference(
dnn_hiddenlayer_2_bias_part_0.values, fixed->alloc0);
fixed->shape0[0] = 1;
- fixed->shape0[1] = 59;
+ fixed->shape0[1] = 132;
// 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 8f6d1a6e7c4..6ec265662e0 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[117];
- float alloc1[115];
+ float alloc0[132];
+ float alloc1[123];
int32_t shape0[2];
};
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc b/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc
index 9cc21624e39..fc4a4c05959 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc
+++ b/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc
@@ -58,6 +58,7 @@ OneDeviceTrainNeuralStylusPalmDetectionFilterModel::
config_.max_dead_neighbor_time = base::TimeDelta::FromMillisecondsD(100.0f);
config_.heuristic_palm_touch_limit = 20.0f;
config_.heuristic_palm_area_limit = 400.0f;
+ config_.max_blank_time = base::TimeDelta::FromMillisecondsD(100.0f);
}
OneDeviceTrainNeuralStylusPalmDetectionFilterModel::
diff --git a/chromium/ui/events/ozone/events_ozone.cc b/chromium/ui/events/ozone/events_ozone.cc
index a9dae509d19..fd91a8f4383 100644
--- a/chromium/ui/events/ozone/events_ozone.cc
+++ b/chromium/ui/events/ozone/events_ozone.cc
@@ -8,35 +8,44 @@
namespace ui {
-void DispatchEventFromNativeUiEvent(
+bool DispatchEventFromNativeUiEvent(
const PlatformEvent& event,
base::OnceCallback<void(ui::Event*)> callback) {
// NB: ui::Events are constructed here using the overload that takes a
// const PlatformEvent& (here ui::Event* const&) rather than the copy
// constructor. This has side effects and cannot be changed to use the
// copy constructor or Event::Clone.
+ bool handled = false;
if (event->IsKeyEvent()) {
ui::KeyEvent key_event(event);
std::move(callback).Run(&key_event);
+ handled = key_event.handled();
} else if (event->IsMouseWheelEvent()) {
ui::MouseWheelEvent wheel_event(event);
std::move(callback).Run(&wheel_event);
+ handled = wheel_event.handled();
} else if (event->IsMouseEvent()) {
ui::MouseEvent mouse_event(event);
std::move(callback).Run(&mouse_event);
+ handled = mouse_event.handled();
} else if (event->IsTouchEvent()) {
ui::TouchEvent touch_event(event);
std::move(callback).Run(&touch_event);
+ handled = touch_event.handled();
} else if (event->IsScrollEvent()) {
ui::ScrollEvent scroll_event(event);
std::move(callback).Run(&scroll_event);
+ handled = scroll_event.handled();
} else if (event->IsGestureEvent()) {
std::move(callback).Run(event);
+ handled = event->handled();
// TODO(mohsen): Use the same pattern for scroll/touch/wheel events.
// Apparently, there is no need for them to wrap the |event|.
} else {
NOTREACHED();
}
+
+ return handled;
}
} // namespace ui
diff --git a/chromium/ui/events/ozone/events_ozone.h b/chromium/ui/events/ozone/events_ozone.h
index 6a893e1e42b..d54dc56bbde 100644
--- a/chromium/ui/events/ozone/events_ozone.h
+++ b/chromium/ui/events/ozone/events_ozone.h
@@ -30,7 +30,8 @@ class Event;
// We are trying to fix both of these issues, but in the meantime we
// define NativeEvent == ui::Event.
//
-EVENTS_EXPORT void DispatchEventFromNativeUiEvent(
+// Returns true iff the event was handled.
+EVENTS_EXPORT bool DispatchEventFromNativeUiEvent(
const PlatformEvent& native_event,
base::OnceCallback<void(ui::Event*)> callback);
diff --git a/chromium/ui/events/ozone/features.cc b/chromium/ui/events/ozone/features.cc
index 85a406afab8..0c160ac930e 100644
--- a/chromium/ui/events/ozone/features.cc
+++ b/chromium/ui/events/ozone/features.cc
@@ -41,4 +41,9 @@ const base::FeatureParam<double> kHeuristicHoldThresholdSeconds{
const base::FeatureParam<int> kHeuristicStrokeCount{
&kEnableHeuristicPalmDetectionFilter, "heuristic_palm_stroke_count", 0};
+constexpr char kOzoneNNPalmSwitchName[] = "ozone-nnpalm-properties";
+
+constexpr char kOzoneNNPalmTouchCompatibleProperty[] = "touch-compatible";
+constexpr char kOzoneNNPalmRadiusPolynomialProperty[] = "radius-polynomial";
+
} // namespace ui
diff --git a/chromium/ui/events/ozone/features.h b/chromium/ui/events/ozone/features.h
index 41938a3ba86..9832b90bdac 100644
--- a/chromium/ui/events/ozone/features.h
+++ b/chromium/ui/events/ozone/features.h
@@ -43,6 +43,15 @@ extern const base::FeatureParam<double> kHeuristicHoldThresholdSeconds;
COMPONENT_EXPORT(EVENTS_OZONE)
extern const base::FeatureParam<int> kHeuristicStrokeCount;
+COMPONENT_EXPORT(EVENTS_OZONE)
+extern const char kOzoneNNPalmSwitchName[];
+
+COMPONENT_EXPORT(EVENTS_OZONE)
+extern const char kOzoneNNPalmTouchCompatibleProperty[];
+
+COMPONENT_EXPORT(EVENTS_OZONE)
+extern const char kOzoneNNPalmRadiusPolynomialProperty[];
+
} // namespace ui
#endif // UI_EVENTS_OZONE_FEATURES_H_
diff --git a/chromium/ui/events/ozone/gamepad/gamepad_observer.h b/chromium/ui/events/ozone/gamepad/gamepad_observer.h
index 7b2f53e84cc..6d640f7618d 100644
--- a/chromium/ui/events/ozone/gamepad/gamepad_observer.h
+++ b/chromium/ui/events/ozone/gamepad/gamepad_observer.h
@@ -5,7 +5,6 @@
#ifndef UI_EVENTS_OZONE_GAMEPAD_GAMEPAD_OBSERVER_H_
#define UI_EVENTS_OZONE_GAMEPAD_GAMEPAD_OBSERVER_H_
-#include "base/logging.h"
#include "base/time/time.h"
#include "ui/events/ozone/gamepad/gamepad_event.h"
diff --git a/chromium/ui/events/ozone/layout/keyboard_layout_engine_manager.h b/chromium/ui/events/ozone/layout/keyboard_layout_engine_manager.h
index 0ff61437716..5625dcaecd3 100644
--- a/chromium/ui/events/ozone/layout/keyboard_layout_engine_manager.h
+++ b/chromium/ui/events/ozone/layout/keyboard_layout_engine_manager.h
@@ -7,8 +7,8 @@
#include <memory>
+#include "base/check.h"
#include "base/component_export.h"
-#include "base/logging.h"
#include "base/macros.h"
namespace ui {
diff --git a/chromium/ui/events/platform/platform_event_source.cc b/chromium/ui/events/platform/platform_event_source.cc
index dfded71d596..adebfa68ad2 100644
--- a/chromium/ui/events/platform/platform_event_source.cc
+++ b/chromium/ui/events/platform/platform_event_source.cc
@@ -27,8 +27,7 @@ base::LazyInstance<base::ThreadLocalPointer<PlatformEventSource>>::Leaky
bool PlatformEventSource::ignore_native_platform_events_ = false;
PlatformEventSource::PlatformEventSource()
- : overridden_dispatcher_(NULL),
- overridden_dispatcher_restored_(false) {
+ : overridden_dispatcher_(nullptr), overridden_dispatcher_restored_(false) {
CHECK(!lazy_tls_ptr.Pointer()->Get())
<< "Only one platform event source can be created.";
lazy_tls_ptr.Pointer()->Set(this);
diff --git a/chromium/ui/events/platform/x11/x11_event_source.cc b/chromium/ui/events/platform/x11/x11_event_source.cc
index 91df6daefd9..4922e59c450 100644
--- a/chromium/ui/events/platform/x11/x11_event_source.cc
+++ b/chromium/ui/events/platform/x11/x11_event_source.cc
@@ -7,9 +7,13 @@
#include <X11/Xlib-xcb.h>
#include <xcb/xcb.h>
#include <xcb/xcbext.h>
+#include <xcb/xproto.h>
+#include <algorithm>
+#include <memory>
#include <type_traits>
+#include "base/auto_reset.h"
#include "base/logging.h"
#include "base/memory/free_deleter.h"
#include "base/metrics/histogram_macros.h"
@@ -22,8 +26,10 @@
#include "ui/events/x/events_x_utils.h"
#include "ui/events/x/x11_event_translation.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/x11_atom_cache.h"
+#include "ui/gfx/x/xproto.h"
#if defined(USE_GLIB)
#include "ui/events/platform/x11/x11_event_watcher_glib.h"
@@ -39,27 +45,6 @@ namespace ui {
namespace {
-// 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
-// prevent bugs caused by comparing two differently sized sequences. Also
-// handles rollover. To use, compare the result of this function with 0. For
-// example, to compare seq1 <= seq2, use CompareSequenceIds(seq1, seq2) <= 0.
-template <typename T, typename U>
-auto CompareSequenceIds(T t, U u) {
- static_assert(std::is_unsigned<T>::value, "");
- static_assert(std::is_unsigned<U>::value, "");
- // Cast to the smaller of the two types so that comparisons will always work.
- // If we casted to the larger type, then the smaller type will be zero-padded
- // and may incorrectly compare less than the other value.
- using SmallerType =
- typename std::conditional<sizeof(T) <= sizeof(U), T, U>::type;
- SmallerType t0 = static_cast<SmallerType>(t);
- SmallerType u0 = static_cast<SmallerType>(u);
- using SignedType = typename std::make_signed<SmallerType>::type;
- return static_cast<SignedType>(t0 - u0);
-}
-
bool InitializeXkb(XDisplay* display) {
if (!display)
return false;
@@ -83,29 +68,31 @@ bool InitializeXkb(XDisplay* display) {
return true;
}
-Time ExtractTimeFromXEvent(const XEvent& xevent) {
+Time ExtractTimeFromXEvent(const x11::Event& x11_event) {
+ const XEvent& xevent = x11_event.xlib_event();
+
switch (xevent.type) {
- case KeyPress:
- case KeyRelease:
+ case x11::KeyEvent::Press:
+ case x11::KeyEvent::Release:
return xevent.xkey.time;
- case ButtonPress:
- case ButtonRelease:
+ case x11::ButtonEvent::Press:
+ case x11::ButtonEvent::Release:
return xevent.xbutton.time;
- case MotionNotify:
+ case x11::MotionNotifyEvent::opcode:
return xevent.xmotion.time;
- case EnterNotify:
- case LeaveNotify:
+ case x11::CrossingEvent::EnterNotify:
+ case x11::CrossingEvent::LeaveNotify:
return xevent.xcrossing.time;
- case PropertyNotify:
+ case x11::PropertyNotifyEvent::opcode:
return xevent.xproperty.time;
- case SelectionClear:
+ case x11::SelectionClearEvent::opcode:
return xevent.xselectionclear.time;
- case SelectionRequest:
+ case x11::SelectionRequestEvent::opcode:
return xevent.xselectionrequest.time;
- case SelectionNotify:
+ case x11::SelectionNotifyEvent::opcode:
return xevent.xselection.time;
- case GenericEvent:
- if (DeviceDataManagerX11::GetInstance()->IsXIDeviceEvent(xevent))
+ case x11::GeGenericEvent::opcode:
+ if (DeviceDataManagerX11::GetInstance()->IsXIDeviceEvent(x11_event))
return static_cast<XIDeviceEvent*>(xevent.xcookie.data)->time;
else
break;
@@ -120,27 +107,8 @@ void UpdateDeviceList() {
DeviceDataManagerX11::GetInstance()->UpdateDeviceList(display);
}
-x11::Bool IsPropertyNotifyForTimestamp(Display* display,
- XEvent* event,
- XPointer arg) {
- return event->type == PropertyNotify &&
- event->xproperty.window == *reinterpret_cast<Window*>(arg);
-}
-
} // namespace
-X11EventSource::Request::Request(bool is_void,
- unsigned int sequence,
- ResponseCallback callback)
- : is_void(is_void), sequence(sequence), callback(std::move(callback)) {}
-
-X11EventSource::Request::Request(Request&& other)
- : is_void(other.is_void),
- sequence(other.sequence),
- callback(std::move(other.callback)) {}
-
-X11EventSource::Request::~Request() = default;
-
#if defined(USE_GLIB)
using X11EventWatcherImpl = X11EventWatcherGlib;
#else
@@ -154,7 +122,6 @@ X11EventSource::X11EventSource(XDisplay* display)
display_(display),
dispatching_event_(nullptr),
dummy_initialized_(false),
- continue_stream_(true),
distribution_(0, 999) {
DCHECK(!instance_);
instance_ = this;
@@ -170,7 +137,7 @@ X11EventSource::~X11EventSource() {
DCHECK_EQ(this, instance_);
instance_ = nullptr;
if (dummy_initialized_)
- XDestroyWindow(display_, dummy_window_);
+ XDestroyWindow(display_, static_cast<uint32_t>(dummy_window_));
}
bool X11EventSource::HasInstance() {
@@ -187,63 +154,8 @@ X11EventSource* X11EventSource::GetInstance() {
// X11EventSource, public
void X11EventSource::DispatchXEvents() {
- 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(request.is_void || raw_reply || raw_error);
-
- std::move(request.callback)
- .Run(Reply{reinterpret_cast<uint8_t*>(raw_reply)}, Error{raw_error});
- };
-
- auto process_next_event = [&]() {
- XEvent xevent;
- XNextEvent(display_, &xevent);
- ExtractCookieDataDispatchEvent(&xevent);
- };
-
- // Handle all pending events.
continue_stream_ = true;
- while (continue_stream_) {
- bool has_next_response =
- !requests_.empty() &&
- CompareSequenceIds(XLastKnownRequestProcessed(display_),
- requests_.front().sequence) >= 0;
- bool has_next_event = XPending(display_);
-
- if (has_next_response && has_next_event) {
- auto next_response_sequence = requests_.front().sequence;
-
- XEvent event;
- XPeekEvent(display_, &event);
- auto next_event_sequence = event.xany.serial;
-
- // All events have the sequence number of the last processed request
- // included in them. So if a reply and an event have the same sequence,
- // the reply must have been received first.
- if (CompareSequenceIds(next_event_sequence, next_response_sequence) <= 0)
- process_next_response();
- else
- process_next_event();
- } else if (has_next_response) {
- process_next_response();
- } else if (has_next_event) {
- process_next_event();
- } else {
- break;
- }
- }
-}
-
-void X11EventSource::DispatchXEventNow(XEvent* event) {
- ExtractCookieDataDispatchEvent(event);
+ x11::Connection::Get()->Dispatch(this);
}
Time X11EventSource::GetCurrentServerTime() {
@@ -251,11 +163,11 @@ Time X11EventSource::GetCurrentServerTime() {
if (!dummy_initialized_) {
// Create a new Window and Atom that will be used for the property change.
- dummy_window_ = XCreateSimpleWindow(display_, DefaultRootWindow(display_),
- 0, 0, 1, 1, 0, 0, 0);
+ dummy_window_ = static_cast<x11::Window>(XCreateSimpleWindow(
+ display_, DefaultRootWindow(display_), 0, 0, 1, 1, 0, 0, 0));
dummy_atom_ = gfx::GetAtom("CHROMIUM_TIMESTAMP");
- dummy_window_events_.reset(
- new XScopedEventSelector(dummy_window_, PropertyChangeMask));
+ dummy_window_events_ = std::make_unique<XScopedEventSelector>(
+ dummy_window_, PropertyChangeMask);
dummy_initialized_ = true;
}
@@ -268,21 +180,41 @@ Time X11EventSource::GetCurrentServerTime() {
start = base::TimeTicks::Now();
// Make a no-op property change on |dummy_window_|.
- XChangeProperty(display_, dummy_window_, dummy_atom_, XA_STRING, 8,
- PropModeAppend, nullptr, 0);
+ auto* connection = x11::Connection::Get();
+ connection->ChangeProperty({
+ .window = static_cast<x11::Window>(dummy_window_),
+ .property = dummy_atom_,
+ .type = x11::Atom::STRING,
+ .format = CHAR_BIT,
+ .data_len = 1,
+ .data = std::vector<uint8_t>{0},
+ });
// Observe the resulting PropertyNotify event to obtain the timestamp.
- XEvent event;
- XIfEvent(display_, &event, IsPropertyNotifyForTimestamp,
- reinterpret_cast<XPointer>(&dummy_window_));
-
+ connection->Sync();
if (measure_rtt) {
UMA_HISTOGRAM_CUSTOM_COUNTS(
"Linux.X11.ServerRTT",
(base::TimeTicks::Now() - start).InMicroseconds(), 1,
base::TimeDelta::FromMilliseconds(50).InMicroseconds(), 50);
}
- return event.xproperty.time;
+ connection->ReadResponses();
+
+ Time time = x11::CurrentTime;
+ auto pred = [&](const x11::Event& event) {
+ if (event.xlib_event().type == x11::PropertyNotifyEvent::opcode &&
+ event.xlib_event().xproperty.window ==
+ static_cast<uint32_t>(dummy_window_)) {
+ time = event.xlib_event().xproperty.time;
+ return true;
+ }
+ return false;
+ };
+
+ auto& events = connection->events();
+ events.erase(std::remove_if(events.begin(), events.end(), pred),
+ events.end());
+ return time;
}
Time X11EventSource::GetTimestamp() {
@@ -300,26 +232,26 @@ X11EventSource::GetRootCursorLocationFromCurrentEvent() const {
if (!dispatching_event_)
return base::nullopt;
- XEvent* event = dispatching_event_;
- DCHECK(event);
+ DCHECK(dispatching_event_);
+ XEvent* event = &dispatching_event_->xlib_event();
- bool is_xi2_event = event->type == GenericEvent;
+ bool is_xi2_event = event->type == x11::GeGenericEvent::opcode;
int event_type = is_xi2_event
? reinterpret_cast<XIDeviceEvent*>(event)->evtype
: event->type;
bool is_valid_event = false;
- static_assert(XI_ButtonPress == ButtonPress, "");
- static_assert(XI_ButtonRelease == ButtonRelease, "");
- static_assert(XI_Motion == MotionNotify, "");
- static_assert(XI_Enter == EnterNotify, "");
- static_assert(XI_Leave == LeaveNotify, "");
+ static_assert(XI_ButtonPress == x11::ButtonEvent::Press, "");
+ static_assert(XI_ButtonRelease == x11::ButtonEvent::Release, "");
+ static_assert(XI_Motion == x11::MotionNotifyEvent::opcode, "");
+ static_assert(XI_Enter == x11::CrossingEvent::EnterNotify, "");
+ static_assert(XI_Leave == x11::CrossingEvent::LeaveNotify, "");
switch (event_type) {
- case ButtonPress:
- case ButtonRelease:
- case MotionNotify:
- case EnterNotify:
- case LeaveNotify:
+ case x11::ButtonEvent::Press:
+ case x11::ButtonEvent::Release:
+ case x11::MotionNotifyEvent::opcode:
+ case x11::CrossingEvent::EnterNotify:
+ case x11::CrossingEvent::LeaveNotify:
is_valid_event =
is_xi2_event
? ui::TouchFactory::GetInstance()->ShouldProcessXI2Event(event)
@@ -327,7 +259,7 @@ X11EventSource::GetRootCursorLocationFromCurrentEvent() const {
}
if (is_valid_event)
- return ui::EventSystemLocationFromXEvent(*event);
+ return ui::EventSystemLocationFromXEvent(*dispatching_event_);
return base::nullopt;
}
@@ -371,7 +303,7 @@ void X11EventSource::RestoreOverridenXEventDispatcher() {
}
void X11EventSource::DispatchPlatformEvent(const PlatformEvent& event,
- XEvent* xevent) {
+ x11::Event* xevent) {
DCHECK(event);
// First, tell the XEventDispatchers, which can have PlatformEventDispatcher,
@@ -390,7 +322,7 @@ void X11EventSource::DispatchPlatformEvent(const PlatformEvent& event,
dispatcher.PlatformEventDispatchFinished();
}
-void X11EventSource::DispatchXEventToXEventDispatchers(XEvent* xevent) {
+void X11EventSource::DispatchXEventToXEventDispatchers(x11::Event* xevent) {
bool stop_dispatching = false;
for (auto& observer : observers_)
@@ -421,7 +353,7 @@ void X11EventSource::DispatchXEventToXEventDispatchers(XEvent* xevent) {
overridden_dispatcher_restored_ = false;
}
-void XEventDispatcher::CheckCanDispatchNextPlatformEvent(XEvent* xev) {}
+void XEventDispatcher::CheckCanDispatchNextPlatformEvent(x11::Event* xev) {}
void XEventDispatcher::PlatformEventDispatchFinished() {}
@@ -429,8 +361,14 @@ PlatformEventDispatcher* XEventDispatcher::GetPlatformEventDispatcher() {
return nullptr;
}
-void X11EventSource::ProcessXEvent(XEvent* xevent) {
+void X11EventSource::ProcessXEvent(x11::Event* xevent) {
auto translated_event = ui::BuildEventFromXEvent(*xevent);
+ // Ignore native platform-events only if they correspond to mouse events.
+ // Allow other types of events to still be handled
+ if (ui::PlatformEventSource::ShouldIgnoreNativePlatformEvents() &&
+ translated_event && translated_event->IsMouseEvent()) {
+ return;
+ }
if (translated_event && translated_event->type() != ET_UNKNOWN) {
#if defined(OS_CHROMEOS)
if (translated_event->IsLocatedEvent()) {
@@ -449,28 +387,11 @@ void X11EventSource::ProcessXEvent(XEvent* xevent) {
////////////////////////////////////////////////////////////////////////////////
// X11EventSource, protected
-void X11EventSource::ExtractCookieDataDispatchEvent(XEvent* xevent) {
- bool have_cookie = false;
- if (xevent->type == GenericEvent &&
- XGetEventData(xevent->xgeneric.display, &xevent->xcookie)) {
- have_cookie = true;
- }
-
- dispatching_event_ = xevent;
-
- ProcessXEvent(xevent);
- PostDispatchEvent(xevent);
-
- dispatching_event_ = nullptr;
-
- if (have_cookie)
- XFreeEventData(xevent->xgeneric.display, &xevent->xcookie);
-}
-
-void X11EventSource::PostDispatchEvent(XEvent* xevent) {
+void X11EventSource::PostDispatchEvent(x11::Event* x11_event) {
+ XEvent* xevent = &x11_event->xlib_event();
bool should_update_device_list = false;
- if (xevent->type == GenericEvent) {
+ if (xevent->type == x11::GeGenericEvent::opcode) {
if (xevent->xgeneric.evtype == XI_HierarchyChanged) {
should_update_device_list = true;
} else if (xevent->xgeneric.evtype == XI_DeviceChanged) {
@@ -490,7 +411,7 @@ void X11EventSource::PostDispatchEvent(XEvent* xevent) {
hotplug_event_handler_->OnHotplugEvent();
}
- if (xevent->type == EnterNotify &&
+ if (xevent->type == x11::CrossingEvent::EnterNotify &&
xevent->xcrossing.detail != NotifyInferior &&
xevent->xcrossing.mode != NotifyUngrab) {
// Clear stored scroll data
@@ -513,13 +434,21 @@ void X11EventSource::OnDispatcherListChanged() {
}
}
-void X11EventSource::AddRequest(bool is_void,
- unsigned int sequence,
- ResponseCallback callback) {
- DCHECK(requests_.empty() ||
- CompareSequenceIds(requests_.back().sequence, sequence) < 0);
+bool X11EventSource::ShouldContinueStream() const {
+ return continue_stream_;
+}
+
+void X11EventSource::DispatchXEvent(x11::Event* event) {
+ // NB: The event should be reset to nullptr when this function
+ // returns, not to its initial value, otherwise nested message loops
+ // will incorrectly think that the current event being dispatched is
+ // an old event. This means base::AutoReset should not be used.
+ dispatching_event_ = event;
- requests_.emplace(is_void, sequence, std::move(callback));
+ ProcessXEvent(event);
+ PostDispatchEvent(event);
+
+ dispatching_event_ = nullptr;
}
// ScopedXEventDispatcher implementation
diff --git a/chromium/ui/events/platform/x11/x11_event_source.h b/chromium/ui/events/platform/x11/x11_event_source.h
index e1673c2a44c..c8bb6e0c1ce 100644
--- a/chromium/ui/events/platform/x11/x11_event_source.h
+++ b/chromium/ui/events/platform/x11/x11_event_source.h
@@ -8,7 +8,6 @@
#include <stdint.h>
#include <memory>
-#include <queue>
#include <random>
#include "base/auto_reset.h"
@@ -17,13 +16,11 @@
#include "base/optional.h"
#include "ui/events/events_export.h"
#include "ui/events/platform/platform_event_source.h"
-#include "ui/gfx/x/request_queue.h"
+#include "ui/gfx/x/event.h"
#include "ui/gfx/x/x11_types.h"
using Time = unsigned long;
using XEvent = union _XEvent;
-using XID = unsigned long;
-using XWindow = unsigned long;
namespace gfx {
class Point;
@@ -37,21 +34,20 @@ class PlatformEventDispatcher;
class ScopedXEventDispatcher;
// The XEventDispatcher interface is used in two different ways: the first is
-// when classes want to receive XEvent directly and second is to say if classes,
-// which also implement the PlatformEventDispatcher interface, are able to
-// process next translated from XEvent to ui::Event events. Only used with Ozone
-// X11 currently.
+// when classes want to receive x11::Event directly and second is to say if
+// classes, which also implement the PlatformEventDispatcher interface, are able
+// to process next translated from x11::Event to ui::Event events.
class EVENTS_EXPORT XEventDispatcher {
public:
- // Sends XEvent to XEventDispatcher for handling. Returns true if the XEvent
- // was dispatched, otherwise false. After the first XEventDispatcher returns
- // true XEvent dispatching stops.
- virtual bool DispatchXEvent(XEvent* xevent) = 0;
+ // Sends x11::Event to XEventDispatcher for handling. Returns true if the
+ // x11::Event was dispatched, otherwise false. After the first
+ // XEventDispatcher returns true x11::Event dispatching stops.
+ virtual bool DispatchXEvent(x11::Event* xevent) = 0;
// XEventDispatchers can be used to test if they are able to process next
// translated event sent by a PlatformEventSource. If so, they must make a
// promise internally to process next event sent by PlatformEventSource.
- virtual void CheckCanDispatchNextPlatformEvent(XEvent* xev);
+ virtual void CheckCanDispatchNextPlatformEvent(x11::Event* xev);
// Tells that an event has been dispatched and an event handling promise must
// be removed.
@@ -64,7 +60,7 @@ class EVENTS_EXPORT XEventDispatcher {
virtual PlatformEventDispatcher* GetPlatformEventDispatcher();
protected:
- virtual ~XEventDispatcher() {}
+ virtual ~XEventDispatcher() = default;
};
// XEventObserver can be installed on a X11EventSource, and it
@@ -72,17 +68,17 @@ class EVENTS_EXPORT XEventDispatcher {
class EVENTS_EXPORT XEventObserver {
public:
// Called before the dispatchers receive the event.
- virtual void WillProcessXEvent(XEvent* event) = 0;
+ virtual void WillProcessXEvent(x11::Event* event) = 0;
// Called after the event has been dispatched.
- virtual void DidProcessXEvent(XEvent* event) = 0;
+ virtual void DidProcessXEvent(x11::Event* event) = 0;
protected:
- virtual ~XEventObserver() {}
+ virtual ~XEventObserver() = default;
};
-// Responsible for notifying X11EventSource when new XEvents are available to
-// be processed/dispatched.
+// Responsible for notifying X11EventSource when new x11::Events are available
+// to be processed/dispatched.
class X11EventWatcher {
public:
X11EventWatcher() = default;
@@ -124,7 +120,7 @@ class EVENTS_EXPORT ScopedXEventDispatcher {
// {Platform,X}EventDispatchers. Handles receiving, pre-process, translation
// and post-processing of XEvents.
class EVENTS_EXPORT X11EventSource : public PlatformEventSource,
- x11::RequestQueue {
+ public x11::Connection::Delegate {
public:
explicit X11EventSource(XDisplay* display);
~X11EventSource() override;
@@ -136,11 +132,6 @@ class EVENTS_EXPORT X11EventSource : public PlatformEventSource,
// available X events.
void DispatchXEvents();
- // Dispatches a given event immediately. This is to facilitate sequential
- // interaction between the gtk event loop (used for IME) and the
- // main X11 event loop.
- void DispatchXEventNow(XEvent* event);
-
XDisplay* display() { return display_; }
// Returns the timestamp of the event currently being dispatched. Falls back
@@ -156,18 +147,18 @@ class EVENTS_EXPORT X11EventSource : public PlatformEventSource,
// |last_seen_server_time_| with this value.
Time GetCurrentServerTime();
- // Adds a XEvent dispatcher to the XEvent dispatcher list.
+ // Adds a x11::Event dispatcher to the x11::Event dispatcher list.
// Also calls XEventDispatcher::GetPlatformEventDispatcher
// to explicitly add this |dispatcher| to a list of PlatformEventDispatchers
// in case if XEventDispatcher has a PlatformEventDispatcher. Thus,
// there is no need to separately add self to the list of
// PlatformEventDispatchers. This is needed because XEventDispatchers are
- // tested if they can receive an XEvent based on a XID target. If so, the
- // translated XEvent into a PlatformEvent is sent to that
+ // tested if they can receive an x11::Event based on a x11::Window target. If
+ // so, the translated x11::Event into a PlatformEvent is sent to that
// PlatformEventDispatcher.
void AddXEventDispatcher(XEventDispatcher* dispatcher);
- // Removes an XEvent dispatcher from the XEvent dispatcher list.
+ // Removes an x11::Event dispatcher from the x11::Event dispatcher list.
// Also explicitly removes an XEventDispatcher from a PlatformEventDispatcher
// list if the XEventDispatcher has a PlatformEventDispatcher.
void RemoveXEventDispatcher(XEventDispatcher* dispatcher);
@@ -184,48 +175,32 @@ class EVENTS_EXPORT X11EventSource : public PlatformEventSource,
std::unique_ptr<ScopedXEventDispatcher> OverrideXEventDispatcher(
XEventDispatcher* dispatcher);
- void ProcessXEvent(XEvent* xevent);
+ void ProcessXEvent(x11::Event* xevent);
- protected:
- // Extracts cookie data from |xevent| if it's of GenericType, and dispatches
- // the event. This function also frees up the cookie data after dispatch is
- // complete.
- void ExtractCookieDataDispatchEvent(XEvent* xevent);
+ // x11::Connection::Delegate:
+ bool ShouldContinueStream() const override;
+ void DispatchXEvent(x11::Event* event) override;
+ protected:
// Handles updates after event has been dispatched.
- void PostDispatchEvent(XEvent* xevent);
+ void PostDispatchEvent(x11::Event* xevent);
private:
friend class ScopedXEventDispatcher;
- struct Request {
- Request(bool is_void, unsigned int sequence, ResponseCallback callback);
- Request(Request&& other);
- ~Request();
-
- const bool is_void;
- const unsigned int sequence;
- ResponseCallback callback;
- };
-
// Tells XEventDispatchers, which can also have PlatformEventDispatchers, that
// a translated event is going to be sent next, then dispatches the event and
// notifies XEventDispatchers the event has been sent out and, most probably,
// consumed.
- void DispatchPlatformEvent(const PlatformEvent& event, XEvent* xevent);
+ void DispatchPlatformEvent(const PlatformEvent& event, x11::Event* xevent);
// Sends XEvent to registered XEventDispatchers.
- void DispatchXEventToXEventDispatchers(XEvent* xevent);
+ void DispatchXEventToXEventDispatchers(x11::Event* xevent);
// PlatformEventSource:
void StopCurrentEventStream() override;
void OnDispatcherListChanged() override;
- // x11::RequestQueue
- void AddRequest(bool is_void,
- unsigned int sequence,
- ResponseCallback callback) override;
-
void RestoreOverridenXEventDispatcher();
static X11EventSource* instance_;
@@ -236,12 +211,12 @@ class EVENTS_EXPORT X11EventSource : public PlatformEventSource,
XDisplay* display_;
// Event currently being dispatched.
- XEvent* dispatching_event_;
+ x11::Event* dispatching_event_;
// State necessary for UpdateLastSeenServerTime
bool dummy_initialized_;
- ::XWindow dummy_window_;
- ::XAtom dummy_atom_;
+ x11::Window dummy_window_;
+ x11::Atom dummy_atom_;
std::unique_ptr<XScopedEventSelector> dummy_window_events_;
// Keeps track of whether this source should continue to dispatch all the
@@ -262,8 +237,6 @@ class EVENTS_EXPORT X11EventSource : public PlatformEventSource,
XEventDispatcher* overridden_dispatcher_ = nullptr;
bool overridden_dispatcher_restored_ = false;
- std::queue<Request> requests_;
-
DISALLOW_COPY_AND_ASSIGN(X11EventSource);
};
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 fa33d543e56..bedf678b167 100644
--- a/chromium/ui/events/platform/x11/x11_event_watcher_glib.cc
+++ b/chromium/ui/events/platform/x11/x11_event_watcher_glib.cc
@@ -15,22 +15,25 @@ namespace {
struct GLibX11Source : public GSource {
// Note: The GLibX11Source is created and destroyed by GLib. So its
// constructor/destructor may or may not get called.
- XDisplay* display;
+ x11::Connection* connection;
GPollFD* poll_fd;
};
gboolean XSourcePrepare(GSource* source, gint* timeout_ms) {
GLibX11Source* gxsource = static_cast<GLibX11Source*>(source);
- if (XPending(gxsource->display))
- *timeout_ms = 0;
- else
- *timeout_ms = -1;
+ gxsource->connection->Flush();
+ gxsource->connection->ReadResponses();
+ if (gxsource->connection->HasPendingResponses())
+ return TRUE;
+ *timeout_ms = -1;
return FALSE;
}
gboolean XSourceCheck(GSource* source) {
GLibX11Source* gxsource = static_cast<GLibX11Source*>(source);
- return XPending(gxsource->display);
+ gxsource->connection->Flush();
+ gxsource->connection->ReadResponses();
+ return gxsource->connection->HasPendingResponses();
}
gboolean XSourceDispatch(GSource* source,
@@ -67,7 +70,7 @@ void X11EventWatcherGlib::StartWatching() {
GLibX11Source* glib_x_source = static_cast<GLibX11Source*>(
g_source_new(&XSourceFuncs, sizeof(GLibX11Source)));
- glib_x_source->display = display;
+ glib_x_source->connection = x11::Connection::Get();
glib_x_source->poll_fd = x_poll_.get();
x_source_ = glib_x_source;
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 80487ce53b3..1a4c8dc35b7 100644
--- a/chromium/ui/events/platform/x11/x11_hotplug_event_handler.cc
+++ b/chromium/ui/events/platform/x11/x11_hotplug_event_handler.cc
@@ -43,12 +43,9 @@ namespace {
// Names of all known internal devices that should not be considered as
// keyboards.
// TODO(rsadam@): Identify these devices using udev rules. (Crbug.com/420728.)
-const char* kKnownInvalidKeyboardDeviceNames[] = {"Power Button",
- "Sleep Button",
- "Video Bus",
- "gpio-keys.5",
- "gpio-keys.12",
- "ROCKCHIP-I2S Headset Jack"};
+const char* kKnownInvalidKeyboardDeviceNames[] = {
+ "Power Button", "Sleep Button", "Video Bus",
+ "gpio-keys.5", "gpio-keys.12", "ROCKCHIP-I2S Headset Jack"};
enum DeviceType {
DEVICE_TYPE_KEYBOARD,
@@ -80,14 +77,14 @@ struct UiCallbacks {
// Stores a copy of the XIValuatorClassInfo values so X11 device processing can
// happen on a worker thread. This is needed since X11 structs are not copyable.
struct ValuatorClassInfo {
- ValuatorClassInfo(const XIValuatorClassInfo& info)
- : label(info.label),
+ explicit ValuatorClassInfo(const XIValuatorClassInfo& info)
+ : label(static_cast<x11::Atom>(info.label)),
max(info.max),
min(info.min),
mode(info.mode),
number(info.number) {}
- Atom label;
+ x11::Atom label;
double max;
double min;
int mode;
@@ -157,8 +154,8 @@ struct DeviceInfo {
// X11 display cache used on worker threads. This is filled on the UI thread and
// passed in to the worker threads.
struct DisplayState {
- Atom mt_position_x;
- Atom mt_position_y;
+ x11::Atom mt_position_x;
+ x11::Atom mt_position_y;
};
// Returns true if |name| is the name of a known invalid keyboard device. Note,
@@ -187,8 +184,8 @@ base::FilePath GetDevicePath(XDisplay* dpy, const XIDeviceInfo& device) {
// Input device has a property "Device Node" pointing to its dev input node,
// e.g. Device Node (250): "/dev/input/event8"
- Atom device_node = gfx::GetAtom("Device Node");
- if (device_node == x11::None)
+ x11::Atom device_node = gfx::GetAtom("Device Node");
+ if (device_node == x11::Atom::None)
return base::FilePath();
Atom actual_type;
@@ -203,9 +200,10 @@ base::FilePath GetDevicePath(XDisplay* dpy, const XIDeviceInfo& device) {
if (!dev || dev->device_id != base::checked_cast<XID>(device.deviceid))
return base::FilePath();
- if (XGetDeviceProperty(dpy, dev, device_node, 0, 1000, x11::False,
- AnyPropertyType, &actual_type, &actual_format, &nitems,
- &bytes_after, &data) != x11::Success) {
+ if (XGetDeviceProperty(dpy, dev, static_cast<uint32_t>(device_node), 0, 1000,
+ x11::False, AnyPropertyType, &actual_type,
+ &actual_format, &nitems, &bytes_after,
+ &data) != x11::Success) {
XCloseDevice(dpy, dev);
return base::FilePath();
}
@@ -292,8 +290,8 @@ void HandleTouchscreenDevicesInWorker(
scoped_refptr<base::TaskRunner> reply_runner,
TouchscreenDeviceCallback callback) {
std::vector<TouchscreenDevice> devices;
- if (display_state.mt_position_x == x11::None ||
- display_state.mt_position_y == x11::None)
+ if (display_state.mt_position_x == x11::Atom::None ||
+ display_state.mt_position_y == x11::Atom::None)
return;
for (const DeviceInfo& device_info : device_infos) {
@@ -387,10 +385,9 @@ void OnHotplugFinished() {
} // namespace
-X11HotplugEventHandler::X11HotplugEventHandler() {}
+X11HotplugEventHandler::X11HotplugEventHandler() = default;
-X11HotplugEventHandler::~X11HotplugEventHandler() {
-}
+X11HotplugEventHandler::~X11HotplugEventHandler() = default;
void X11HotplugEventHandler::OnHotplugEvent() {
Display* display = gfx::GetXDisplay();
@@ -401,15 +398,15 @@ void X11HotplugEventHandler::OnHotplugEvent() {
const int kMaxDeviceNum = 128;
DeviceType device_types[kMaxDeviceNum];
- for (int i = 0; i < kMaxDeviceNum; ++i)
- device_types[i] = DEVICE_TYPE_OTHER;
+ for (auto& device_type : device_types)
+ device_type = DEVICE_TYPE_OTHER;
for (int i = 0; i < device_list_xi.count; ++i) {
int id = device_list_xi[i].id;
if (id < 0 || id >= kMaxDeviceNum)
continue;
- Atom type = device_list_xi[i].type;
+ x11::Atom type = static_cast<x11::Atom>(device_list_xi[i].type);
if (type == gfx::GetAtom(XI_KEYBOARD))
device_types[id] = DEVICE_TYPE_KEYBOARD;
else if (type == gfx::GetAtom(XI_MOUSE))
diff --git a/chromium/ui/events/scoped_target_handler.cc b/chromium/ui/events/scoped_target_handler.cc
index f9cacaa46d3..f5ee457e077 100644
--- a/chromium/ui/events/scoped_target_handler.cc
+++ b/chromium/ui/events/scoped_target_handler.cc
@@ -12,7 +12,7 @@ namespace ui {
ScopedTargetHandler::ScopedTargetHandler(EventTarget* target,
EventHandler* handler)
- : destroyed_flag_(NULL), target_(target), new_handler_(handler) {
+ : destroyed_flag_(nullptr), target_(target), new_handler_(handler) {
original_handler_ = target_->SetTargetHandler(this);
}
diff --git a/chromium/ui/events/win/keyboard_hook_win_base.cc b/chromium/ui/events/win/keyboard_hook_win_base.cc
index dbf5545cdef..985460707f2 100644
--- a/chromium/ui/events/win/keyboard_hook_win_base.cc
+++ b/chromium/ui/events/win/keyboard_hook_win_base.cc
@@ -4,6 +4,8 @@
#include "ui/events/win/keyboard_hook_win_base.h"
+#include "base/logging.h"
+
namespace ui {
KeyboardHookWinBase::KeyboardHookWinBase(
diff --git a/chromium/ui/events/win/keyboard_hook_win_base.h b/chromium/ui/events/win/keyboard_hook_win_base.h
index c9da794ae06..cf55d1e5a31 100644
--- a/chromium/ui/events/win/keyboard_hook_win_base.h
+++ b/chromium/ui/events/win/keyboard_hook_win_base.h
@@ -9,8 +9,8 @@
#include <windows.h>
+#include "base/check.h"
#include "base/containers/flat_set.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/optional.h"
#include "base/threading/thread_checker.h"
diff --git a/chromium/ui/events/x/events_x_unittest.cc b/chromium/ui/events/x/events_x_unittest.cc
index 9c71502843e..6933f8fbba9 100644
--- a/chromium/ui/events/x/events_x_unittest.cc
+++ b/chromium/ui/events/x/events_x_unittest.cc
@@ -4,6 +4,7 @@
#include <stddef.h>
#include <stdint.h>
+#include <xcb/xcb.h>
#include <cstring>
#include <memory>
@@ -26,46 +27,57 @@
#include "ui/events/x/events_x_utils.h"
#include "ui/events/x/x11_event_translation.h"
#include "ui/gfx/geometry/point.h"
+#include "ui/gfx/x/connection.h"
+#include "ui/gfx/x/event.h"
#include "ui/gfx/x/x11.h"
+#include "ui/gfx/x/xproto.h"
namespace ui {
namespace {
// Initializes the passed-in Xlib event.
-void InitButtonEvent(XEvent* event,
+void InitButtonEvent(x11::Event* event,
bool is_press,
const gfx::Point& location,
int button,
int state) {
- memset(event, 0, sizeof(*event));
+ xcb_generic_event_t generic_event;
+ memset(&generic_event, 0, sizeof(generic_event));
+ auto* button_event =
+ reinterpret_cast<xcb_button_press_event_t*>(&generic_event);
// We don't bother setting fields that the event code doesn't use, such as
// x_root/y_root and window/root/subwindow.
- XButtonEvent* button_event = &(event->xbutton);
- button_event->type = is_press ? ButtonPress : ButtonRelease;
- button_event->x = location.x();
- button_event->y = location.y();
- button_event->button = button;
+ button_event->response_type =
+ is_press ? x11::ButtonEvent::Press : x11::ButtonEvent::Release;
+ button_event->event_x = location.x();
+ button_event->event_y = location.y();
+ button_event->detail = button;
button_event->state = state;
+
+ *event = x11::Event(&generic_event, x11::Connection::Get());
}
#if !defined(OS_CHROMEOS)
// Initializes the passed-in Xlib event.
void InitKeyEvent(Display* display,
- XEvent* event,
+ x11::Event* event,
bool is_press,
int keycode,
int state) {
- memset(event, 0, sizeof(*event));
+ xcb_generic_event_t generic_event;
+ memset(&generic_event, 0, sizeof(generic_event));
+ auto* key_event = reinterpret_cast<xcb_key_press_event_t*>(&generic_event);
// We don't bother setting fields that the event code doesn't use, such as
// x_root/y_root and window/root/subwindow.
- XKeyEvent* key_event = &(event->xkey);
- key_event->display = display;
- key_event->type = is_press ? KeyPress : KeyRelease;
- key_event->keycode = keycode;
+ key_event->response_type =
+ is_press ? x11::KeyEvent::Press : x11::KeyEvent::Release;
+ key_event->detail = keycode;
key_event->state = state;
+
+ *event = x11::Event(&generic_event, x11::Connection::Get());
}
#endif
@@ -78,7 +90,7 @@ float ComputeRotationAngle(float twist) {
return rotation_angle;
}
-std::string FlooredEventLocationString(const XEvent& xev) {
+std::string FlooredEventLocationString(const x11::Event& xev) {
return gfx::ToFlooredPoint(gfx::PointF(ui::EventLocationFromXEvent(xev)))
.ToString();
}
@@ -87,8 +99,8 @@ std::string FlooredEventLocationString(const XEvent& xev) {
class EventsXTest : public testing::Test {
public:
- EventsXTest() {}
- ~EventsXTest() override {}
+ EventsXTest() = default;
+ ~EventsXTest() override = default;
void SetUp() override {
DeviceDataManagerX11::CreateInstance();
@@ -102,7 +114,7 @@ class EventsXTest : public testing::Test {
};
TEST_F(EventsXTest, ButtonEvents) {
- XEvent event;
+ x11::Event event;
gfx::Point location(5, 10);
gfx::Vector2d offset;
@@ -173,7 +185,7 @@ TEST_F(EventsXTest, ButtonEvents) {
}
TEST_F(EventsXTest, AvoidExtraEventsOnWheelRelease) {
- XEvent event;
+ x11::Event event;
gfx::Point location(5, 10);
InitButtonEvent(&event, true, location, 4, 0);
@@ -188,12 +200,16 @@ TEST_F(EventsXTest, AvoidExtraEventsOnWheelRelease) {
}
TEST_F(EventsXTest, EnterLeaveEvent) {
- XEvent event;
- event.xcrossing.type = EnterNotify;
- event.xcrossing.x = 10;
- event.xcrossing.y = 20;
- event.xcrossing.x_root = 110;
- event.xcrossing.y_root = 120;
+ auto* connection = x11::Connection::Get();
+ xcb_generic_event_t ge;
+ memset(&ge, 0, sizeof(ge));
+ auto* enter = reinterpret_cast<xcb_enter_notify_event_t*>(&ge);
+ enter->response_type = x11::CrossingEvent::EnterNotify;
+ enter->event_x = 10;
+ enter->event_y = 20;
+ enter->root_x = 110;
+ enter->root_y = 120;
+ x11::Event event(&ge, connection);
// Mouse enter events are converted to mouse move events to be consistent with
// the way views handle mouse enter. See comments for EnterNotify case in
@@ -203,18 +219,19 @@ TEST_F(EventsXTest, EnterLeaveEvent) {
EXPECT_EQ("10,20", ui::EventLocationFromXEvent(event).ToString());
EXPECT_EQ("110,120", ui::EventSystemLocationFromXEvent(event).ToString());
- event.xcrossing.type = LeaveNotify;
- event.xcrossing.x = 30;
- event.xcrossing.y = 40;
- event.xcrossing.x_root = 230;
- event.xcrossing.y_root = 240;
+ enter->response_type = x11::CrossingEvent::LeaveNotify;
+ enter->event_x = 30;
+ enter->event_y = 40;
+ enter->root_x = 230;
+ enter->root_y = 240;
+ event = x11::Event(&ge, connection);
EXPECT_EQ(ui::ET_MOUSE_EXITED, ui::EventTypeFromXEvent(event));
EXPECT_EQ("30,40", ui::EventLocationFromXEvent(event).ToString());
EXPECT_EQ("230,240", ui::EventSystemLocationFromXEvent(event).ToString());
}
TEST_F(EventsXTest, ClickCount) {
- XEvent event;
+ x11::Event event;
gfx::Point location(5, 10);
base::TimeDelta time_stamp = base::TimeTicks::Now().since_origin() -
@@ -222,7 +239,9 @@ TEST_F(EventsXTest, ClickCount) {
for (int i = 1; i <= 3; ++i) {
InitButtonEvent(&event, true, location, 1, 0);
{
- event.xbutton.time = time_stamp.InMilliseconds() & UINT32_MAX;
+ uint32_t time = time_stamp.InMilliseconds() & UINT32_MAX;
+ event.xlib_event().xbutton.time = time;
+ event.As<x11::ButtonEvent>()->time = static_cast<x11::Time>(time);
auto mouseev = ui::BuildMouseEventFromXEvent(event);
EXPECT_EQ(ui::ET_MOUSE_PRESSED, mouseev->type());
EXPECT_EQ(i, mouseev->GetClickCount());
@@ -230,7 +249,9 @@ TEST_F(EventsXTest, ClickCount) {
InitButtonEvent(&event, false, location, 1, 0);
{
- event.xbutton.time = time_stamp.InMilliseconds();
+ uint32_t time = time_stamp.InMilliseconds() & UINT32_MAX;
+ event.xlib_event().xbutton.time = time;
+ event.As<x11::ButtonEvent>()->time = static_cast<x11::Time>(time);
auto mouseev = ui::BuildMouseEventFromXEvent(event);
EXPECT_EQ(ui::ET_MOUSE_RELEASED, mouseev->type());
EXPECT_EQ(i, mouseev->GetClickCount());
@@ -246,13 +267,12 @@ TEST_F(EventsXTest, TouchEventBasic) {
std::vector<Valuator> valuators;
// Init touch begin with tracking id 5, touch id 0.
- valuators.push_back(Valuator(DeviceDataManagerX11::DT_TOUCH_MAJOR, 20));
- valuators.push_back(
- Valuator(DeviceDataManagerX11::DT_TOUCH_ORIENTATION, 0.3f));
- valuators.push_back(Valuator(DeviceDataManagerX11::DT_TOUCH_PRESSURE, 100));
+ valuators.emplace_back(DeviceDataManagerX11::DT_TOUCH_MAJOR, 20);
+ valuators.emplace_back(DeviceDataManagerX11::DT_TOUCH_ORIENTATION, 0.3f);
+ valuators.emplace_back(DeviceDataManagerX11::DT_TOUCH_PRESSURE, 100);
ui::ScopedXI2Event scoped_xevent;
- scoped_xevent.InitTouchEvent(
- 0, XI_TouchBegin, 5, gfx::Point(10, 10), valuators);
+ scoped_xevent.InitTouchEvent(0, XI_TouchBegin, 5, gfx::Point(10, 10),
+ valuators);
EXPECT_EQ(ui::ET_TOUCH_PRESSED, ui::EventTypeFromXEvent(*scoped_xevent));
EXPECT_EQ("10,10", FlooredEventLocationString(*scoped_xevent));
EXPECT_EQ(GetTouchIdFromXEvent(*scoped_xevent), 0);
@@ -264,10 +284,9 @@ TEST_F(EventsXTest, TouchEventBasic) {
// Touch update, with new orientation info.
valuators.clear();
- valuators.push_back(
- Valuator(DeviceDataManagerX11::DT_TOUCH_ORIENTATION, 0.5f));
- scoped_xevent.InitTouchEvent(
- 0, XI_TouchUpdate, 5, gfx::Point(20, 20), valuators);
+ valuators.emplace_back(DeviceDataManagerX11::DT_TOUCH_ORIENTATION, 0.5f);
+ scoped_xevent.InitTouchEvent(0, XI_TouchUpdate, 5, gfx::Point(20, 20),
+ valuators);
EXPECT_EQ(ui::ET_TOUCH_MOVED, ui::EventTypeFromXEvent(*scoped_xevent));
EXPECT_EQ("20,20", FlooredEventLocationString(*scoped_xevent));
EXPECT_EQ(GetTouchIdFromXEvent(*scoped_xevent), 0);
@@ -278,12 +297,11 @@ TEST_F(EventsXTest, TouchEventBasic) {
// Another touch with tracking id 6, touch id 1.
valuators.clear();
- valuators.push_back(Valuator(DeviceDataManagerX11::DT_TOUCH_MAJOR, 100));
- valuators.push_back(Valuator(
- DeviceDataManagerX11::DT_TOUCH_ORIENTATION, 0.9f));
- valuators.push_back(Valuator(DeviceDataManagerX11::DT_TOUCH_PRESSURE, 500));
- scoped_xevent.InitTouchEvent(
- 0, XI_TouchBegin, 6, gfx::Point(200, 200), valuators);
+ valuators.emplace_back(DeviceDataManagerX11::DT_TOUCH_MAJOR, 100);
+ valuators.emplace_back(DeviceDataManagerX11::DT_TOUCH_ORIENTATION, 0.9f);
+ valuators.emplace_back(DeviceDataManagerX11::DT_TOUCH_PRESSURE, 500);
+ scoped_xevent.InitTouchEvent(0, XI_TouchBegin, 6, gfx::Point(200, 200),
+ valuators);
EXPECT_EQ(ui::ET_TOUCH_PRESSED, ui::EventTypeFromXEvent(*scoped_xevent));
EXPECT_EQ("200,200", FlooredEventLocationString(*scoped_xevent));
EXPECT_EQ(GetTouchIdFromXEvent(*scoped_xevent), 1);
@@ -295,9 +313,9 @@ TEST_F(EventsXTest, TouchEventBasic) {
// Touch with tracking id 5 should have old radius/angle value and new pressue
// value.
valuators.clear();
- valuators.push_back(Valuator(DeviceDataManagerX11::DT_TOUCH_PRESSURE, 50));
- scoped_xevent.InitTouchEvent(
- 0, XI_TouchEnd, 5, gfx::Point(30, 30), valuators);
+ valuators.emplace_back(DeviceDataManagerX11::DT_TOUCH_PRESSURE, 50);
+ scoped_xevent.InitTouchEvent(0, XI_TouchEnd, 5, gfx::Point(30, 30),
+ valuators);
EXPECT_EQ(ui::ET_TOUCH_RELEASED, ui::EventTypeFromXEvent(*scoped_xevent));
EXPECT_EQ("30,30", FlooredEventLocationString(*scoped_xevent));
EXPECT_EQ(GetTouchIdFromXEvent(*scoped_xevent), 0);
@@ -309,9 +327,9 @@ TEST_F(EventsXTest, TouchEventBasic) {
// Touch with tracking id 6 should have old angle/pressure value and new
// radius value.
valuators.clear();
- valuators.push_back(Valuator(DeviceDataManagerX11::DT_TOUCH_MAJOR, 50));
- scoped_xevent.InitTouchEvent(
- 0, XI_TouchEnd, 6, gfx::Point(200, 200), valuators);
+ valuators.emplace_back(DeviceDataManagerX11::DT_TOUCH_MAJOR, 50);
+ scoped_xevent.InitTouchEvent(0, XI_TouchEnd, 6, gfx::Point(200, 200),
+ valuators);
EXPECT_EQ(ui::ET_TOUCH_RELEASED, ui::EventTypeFromXEvent(*scoped_xevent));
EXPECT_EQ("200,200", FlooredEventLocationString(*scoped_xevent));
EXPECT_EQ(GetTouchIdFromXEvent(*scoped_xevent), 1);
@@ -384,8 +402,7 @@ TEST_F(EventsXTest, CopiedTouchEventNotRemovingFromXEventMapping) {
// that an exception list of keys can still be processed.
TEST_F(EventsXTest, DisableKeyboard) {
DeviceDataManagerX11* device_data_manager =
- static_cast<DeviceDataManagerX11*>(
- DeviceDataManager::GetInstance());
+ static_cast<DeviceDataManagerX11*>(DeviceDataManager::GetInstance());
int blocked_device_id = 1;
int other_device_id = 2;
int master_device_id = 3;
@@ -398,52 +415,36 @@ TEST_F(EventsXTest, DisableKeyboard) {
ScopedXI2Event xev;
// A is not allowed on the blocked keyboard, and should return ET_UNKNOWN.
- xev.InitGenericKeyEvent(master_device_id,
- blocked_device_id,
- ui::ET_KEY_PRESSED,
- ui::VKEY_A,
- 0);
+ xev.InitGenericKeyEvent(master_device_id, blocked_device_id,
+ ui::ET_KEY_PRESSED, ui::VKEY_A, 0);
EXPECT_EQ(ui::ET_UNKNOWN, ui::EventTypeFromXEvent(*xev));
// The B key is allowed as an exception, and should return KEY_PRESSED.
- xev.InitGenericKeyEvent(master_device_id,
- blocked_device_id,
- ui::ET_KEY_PRESSED,
- ui::VKEY_B,
- 0);
+ xev.InitGenericKeyEvent(master_device_id, blocked_device_id,
+ ui::ET_KEY_PRESSED, ui::VKEY_B, 0);
EXPECT_EQ(ui::ET_KEY_PRESSED, ui::EventTypeFromXEvent(*xev));
// Both A and B are allowed on an unblocked keyboard device.
- xev.InitGenericKeyEvent(master_device_id,
- other_device_id,
- ui::ET_KEY_PRESSED,
- ui::VKEY_A,
- 0);
+ xev.InitGenericKeyEvent(master_device_id, other_device_id, ui::ET_KEY_PRESSED,
+ ui::VKEY_A, 0);
EXPECT_EQ(ui::ET_KEY_PRESSED, ui::EventTypeFromXEvent(*xev));
- xev.InitGenericKeyEvent(master_device_id,
- other_device_id,
- ui::ET_KEY_PRESSED,
- ui::VKEY_B,
- 0);
+ xev.InitGenericKeyEvent(master_device_id, other_device_id, ui::ET_KEY_PRESSED,
+ ui::VKEY_B, 0);
EXPECT_EQ(ui::ET_KEY_PRESSED, ui::EventTypeFromXEvent(*xev));
device_data_manager->EnableDevice(blocked_device_id);
device_data_manager->SetDisabledKeyboardAllowedKeys(nullptr);
// A key returns KEY_PRESSED as per usual now that keyboard was re-enabled.
- xev.InitGenericKeyEvent(master_device_id,
- blocked_device_id,
- ui::ET_KEY_PRESSED,
- ui::VKEY_A,
- 0);
+ xev.InitGenericKeyEvent(master_device_id, blocked_device_id,
+ ui::ET_KEY_PRESSED, ui::VKEY_A, 0);
EXPECT_EQ(ui::ET_KEY_PRESSED, ui::EventTypeFromXEvent(*xev));
}
// Verifies that the type of events from a disabled mouse is ET_UNKNOWN.
TEST_F(EventsXTest, DisableMouse) {
DeviceDataManagerX11* device_data_manager =
- static_cast<DeviceDataManagerX11*>(
- DeviceDataManager::GetInstance());
+ static_cast<DeviceDataManagerX11*>(DeviceDataManager::GetInstance());
int blocked_device_id = 1;
int other_device_id = 2;
std::vector<int> device_list;
@@ -455,17 +456,17 @@ TEST_F(EventsXTest, DisableMouse) {
ScopedXI2Event xev;
xev.InitGenericButtonEvent(blocked_device_id, ET_MOUSE_PRESSED, gfx::Point(),
- EF_LEFT_MOUSE_BUTTON);
+ EF_LEFT_MOUSE_BUTTON);
EXPECT_EQ(ui::ET_UNKNOWN, ui::EventTypeFromXEvent(*xev));
xev.InitGenericButtonEvent(other_device_id, ET_MOUSE_PRESSED, gfx::Point(),
- EF_LEFT_MOUSE_BUTTON);
+ EF_LEFT_MOUSE_BUTTON);
EXPECT_EQ(ui::ET_MOUSE_PRESSED, ui::EventTypeFromXEvent(*xev));
device_data_manager->EnableDevice(blocked_device_id);
xev.InitGenericButtonEvent(blocked_device_id, ET_MOUSE_PRESSED, gfx::Point(),
- EF_LEFT_MOUSE_BUTTON);
+ EF_LEFT_MOUSE_BUTTON);
EXPECT_EQ(ui::ET_MOUSE_PRESSED, ui::EventTypeFromXEvent(*xev));
}
@@ -474,12 +475,14 @@ TEST_F(EventsXTest, ImeFabricatedKeyEvents) {
Display* display = gfx::GetXDisplay();
unsigned int state_to_be_fabricated[] = {
- 0, ShiftMask, LockMask, ShiftMask | LockMask,
+ 0,
+ ShiftMask,
+ LockMask,
+ ShiftMask | LockMask,
};
- for (size_t i = 0; i < base::size(state_to_be_fabricated); ++i) {
- unsigned int state = state_to_be_fabricated[i];
+ for (unsigned int state : state_to_be_fabricated) {
for (int is_char = 0; is_char < 2; ++is_char) {
- XEvent x_event;
+ x11::Event x_event;
InitKeyEvent(display, &x_event, true, 0, state);
auto key_event = ui::BuildKeyEventFromXEvent(x_event);
if (is_char) {
@@ -491,12 +494,14 @@ TEST_F(EventsXTest, ImeFabricatedKeyEvents) {
}
unsigned int state_to_be_not_fabricated[] = {
- ControlMask, Mod1Mask, Mod2Mask, ShiftMask | ControlMask,
+ ControlMask,
+ Mod1Mask,
+ Mod2Mask,
+ ShiftMask | ControlMask,
};
- for (size_t i = 0; i < base::size(state_to_be_not_fabricated); ++i) {
- unsigned int state = state_to_be_not_fabricated[i];
+ for (unsigned int state : state_to_be_not_fabricated) {
for (int is_char = 0; is_char < 2; ++is_char) {
- XEvent x_event;
+ x11::Event x_event;
InitKeyEvent(display, &x_event, true, 0, state);
auto key_event = ui::BuildKeyEventFromXEvent(x_event);
if (is_char) {
@@ -532,41 +537,46 @@ base::TimeTicks TimeTicksFromMillis(int64_t millis) {
} // namespace
TEST_F(EventsXTest, TimestampRolloverAndAdjustWhenDecreasing) {
- XEvent event;
+ x11::Event event;
InitButtonEvent(&event, true, gfx::Point(5, 10), 1, 0);
test::ScopedEventTestTickClock clock;
clock.SetNowTicks(TimeTicksFromMillis(0x100000001));
ResetTimestampRolloverCountersForTesting();
- event.xbutton.time = 0xFFFFFFFF;
+ event.xlib_event().xbutton.time = 0xFFFFFFFF;
+ event.As<x11::ButtonEvent>()->time = static_cast<x11::Time>(0xFFFFFFFF);
EXPECT_EQ(TimeTicksFromMillis(0xFFFFFFFF), ui::EventTimeFromXEvent(event));
clock.SetNowTicks(TimeTicksFromMillis(0x100000007));
ResetTimestampRolloverCountersForTesting();
- event.xbutton.time = 3;
+ event.xlib_event().xbutton.time = 3;
+ event.As<x11::ButtonEvent>()->time = static_cast<x11::Time>(3);
EXPECT_EQ(TimeTicksFromMillis(0x100000000 + 3),
ui::EventTimeFromXEvent(event));
}
TEST_F(EventsXTest, NoTimestampRolloverWhenMonotonicIncreasing) {
- XEvent event;
+ x11::Event event;
InitButtonEvent(&event, true, gfx::Point(5, 10), 1, 0);
test::ScopedEventTestTickClock clock;
clock.SetNowTicks(TimeTicksFromMillis(10));
ResetTimestampRolloverCountersForTesting();
- event.xbutton.time = 6;
+ event.xlib_event().xbutton.time = 6;
+ event.As<x11::ButtonEvent>()->time = static_cast<x11::Time>(6);
EXPECT_EQ(TimeTicksFromMillis(6), ui::EventTimeFromXEvent(event));
- event.xbutton.time = 7;
+ event.xlib_event().xbutton.time = 7;
+ event.As<x11::ButtonEvent>()->time = static_cast<x11::Time>(7);
EXPECT_EQ(TimeTicksFromMillis(7), ui::EventTimeFromXEvent(event));
clock.SetNowTicks(TimeTicksFromMillis(0x100000005));
ResetTimestampRolloverCountersForTesting();
- event.xbutton.time = 0xFFFFFFFF;
+ event.xlib_event().xbutton.time = 0xFFFFFFFF;
+ event.As<x11::ButtonEvent>()->time = static_cast<x11::Time>(0xFFFFFFFF);
EXPECT_EQ(TimeTicksFromMillis(0xFFFFFFFF), ui::EventTimeFromXEvent(event));
}
diff --git a/chromium/ui/events/x/events_x_utils.cc b/chromium/ui/events/x/events_x_utils.cc
index e07b8b2c1ce..4229fe4adae 100644
--- a/chromium/ui/events/x/events_x_utils.cc
+++ b/chromium/ui/events/x/events_x_utils.cc
@@ -58,7 +58,8 @@ class XModifierStateWatcher {
}
}
- void UpdateStateFromXEvent(const XEvent& xev) {
+ void UpdateStateFromXEvent(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
ui::KeyboardCode keyboard_code = ui::KeyboardCodeFromXKeyEvent(&xev);
unsigned int mask = StateFromKeyboardCode(keyboard_code);
// Floating device can't access the modifer state from master device.
@@ -66,13 +67,13 @@ class XModifierStateWatcher {
// floating devices such as touch screen. Issue 106426 is one example
// of why we need the modifier states for floating device.
switch (xev.type) {
- case KeyPress:
+ case x11::KeyEvent::Press:
state_ = xev.xkey.state | mask;
break;
- case KeyRelease:
+ case x11::KeyEvent::Release:
state_ = xev.xkey.state & ~mask;
break;
- case GenericEvent: {
+ case x11::GeGenericEvent::opcode: {
XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev.xcookie.data);
switch (xievent->evtype) {
case XI_KeyPress:
@@ -100,9 +101,9 @@ class XModifierStateWatcher {
private:
friend struct base::DefaultSingletonTraits<XModifierStateWatcher>;
- XModifierStateWatcher() : state_(0) {}
+ XModifierStateWatcher() = default;
- unsigned int state_;
+ unsigned int state_{};
DISALLOW_COPY_AND_ASSIGN(XModifierStateWatcher);
};
@@ -111,20 +112,21 @@ class XModifierStateWatcher {
// A 'special event' is a touch event with maximum radius and pressure at
// location (0, 0).
// This needs to be done in a cleaner way: http://crbug.com/169256
-bool TouchEventIsGeneratedHack(const XEvent& xev) {
+bool TouchEventIsGeneratedHack(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
XIDeviceEvent* event = static_cast<XIDeviceEvent*>(xev.xcookie.data);
CHECK(event->evtype == XI_TouchBegin || event->evtype == XI_TouchUpdate ||
event->evtype == XI_TouchEnd);
// Force is normalized to [0, 1].
- if (ui::GetTouchForceFromXEvent(xev) < 1.0f)
+ if (ui::GetTouchForceFromXEvent(x11_event) < 1.0f)
return false;
- if (ui::EventLocationFromXEvent(xev) != gfx::Point())
+ if (ui::EventLocationFromXEvent(x11_event) != gfx::Point())
return false;
// Radius is in pixels, and the valuator is the diameter in pixels.
- double radius = ui::GetTouchRadiusXFromXEvent(xev), min, max;
+ double radius = ui::GetTouchRadiusXFromXEvent(x11_event), min, max;
unsigned int deviceid =
static_cast<XIDeviceEvent*>(xev.xcookie.data)->sourceid;
if (!ui::DeviceDataManagerX11::GetInstance()->GetDataRange(
@@ -164,8 +166,10 @@ int GetEventFlagsFromXState(unsigned int state) {
return flags;
}
-int GetEventFlagsFromXKeyEvent(const XEvent& xev) {
- DCHECK(xev.type == KeyPress || xev.type == KeyRelease);
+int GetEventFlagsFromXKeyEvent(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
+ DCHECK(xev.type == x11::KeyEvent::Press ||
+ xev.type == x11::KeyEvent::Release);
#if defined(OS_CHROMEOS)
const int ime_fabricated_flag = 0;
@@ -190,8 +194,9 @@ int GetEventFlagsFromXKeyEvent(const XEvent& xev) {
(xev.xkey.send_event ? ui::EF_FINAL : 0) | ime_fabricated_flag;
}
-int GetEventFlagsFromXGenericEvent(const XEvent& xev) {
- DCHECK(xev.type == GenericEvent);
+int GetEventFlagsFromXGenericEvent(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
+ DCHECK(xev.type == x11::GeGenericEvent::opcode);
XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev.xcookie.data);
DCHECK((xievent->evtype == XI_KeyPress) ||
(xievent->evtype == XI_KeyRelease));
@@ -238,18 +243,19 @@ int GetButtonMaskForX2Event(XIDeviceEvent* xievent) {
return buttonflags;
}
-ui::EventType GetTouchEventType(const XEvent& xev) {
+ui::EventType GetTouchEventType(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
XIDeviceEvent* event = static_cast<XIDeviceEvent*>(xev.xcookie.data);
switch (event->evtype) {
case XI_TouchBegin:
- return TouchEventIsGeneratedHack(xev) ? ui::ET_UNKNOWN
- : ui::ET_TOUCH_PRESSED;
+ return TouchEventIsGeneratedHack(x11_event) ? ui::ET_UNKNOWN
+ : ui::ET_TOUCH_PRESSED;
case XI_TouchUpdate:
- return TouchEventIsGeneratedHack(xev) ? ui::ET_UNKNOWN
- : ui::ET_TOUCH_MOVED;
+ return TouchEventIsGeneratedHack(x11_event) ? ui::ET_UNKNOWN
+ : ui::ET_TOUCH_MOVED;
case XI_TouchEnd:
- return TouchEventIsGeneratedHack(xev) ? ui::ET_TOUCH_CANCELLED
- : ui::ET_TOUCH_RELEASED;
+ return TouchEventIsGeneratedHack(x11_event) ? ui::ET_TOUCH_CANCELLED
+ : ui::ET_TOUCH_RELEASED;
}
DCHECK(ui::TouchFactory::GetInstance()->IsTouchDevice(event->sourceid));
@@ -279,7 +285,7 @@ ui::EventType GetTouchEventType(const XEvent& xev) {
return ui::ET_UNKNOWN;
}
-double GetTouchParamFromXEvent(const XEvent& xev,
+double GetTouchParamFromXEvent(const x11::Event& xev,
ui::DeviceDataManagerX11::DataType val,
double default_value) {
ui::DeviceDataManagerX11::GetInstance()->GetEventData(xev, val,
@@ -287,14 +293,17 @@ double GetTouchParamFromXEvent(const XEvent& xev,
return default_value;
}
-void ScaleTouchRadius(const XEvent& xev, double* radius) {
- DCHECK_EQ(GenericEvent, xev.type);
+void ScaleTouchRadius(const x11::Event& x11_event, double* radius) {
+ const XEvent& xev = x11_event.xlib_event();
+ DCHECK_EQ(x11::GeGenericEvent::opcode, xev.type);
XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev.xcookie.data);
ui::DeviceDataManagerX11::GetInstance()->ApplyTouchRadiusScale(xiev->sourceid,
radius);
}
-bool GetGestureTimes(const XEvent& xev, double* start_time, double* end_time) {
+bool GetGestureTimes(const x11::Event& xev,
+ double* start_time,
+ double* end_time) {
if (!ui::DeviceDataManagerX11::GetInstance()->HasGestureTimes(xev))
return false;
@@ -345,27 +354,29 @@ base::TimeTicks TimeTicksFromXEventTime(Time timestamp) {
return base::TimeTicks() + base::TimeDelta::FromMilliseconds(now_ms - delta);
}
-base::TimeTicks TimeTicksFromXEvent(const XEvent& xev) {
+base::TimeTicks TimeTicksFromXEvent(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
switch (xev.type) {
- case KeyPress:
- case KeyRelease:
+ case x11::KeyEvent::Press:
+ case x11::KeyEvent::Release:
return TimeTicksFromXEventTime(xev.xkey.time);
- case ButtonPress:
- case ButtonRelease:
+ case x11::ButtonEvent::Press:
+ case x11::ButtonEvent::Release:
return TimeTicksFromXEventTime(xev.xbutton.time);
- case MotionNotify:
+ case x11::MotionNotifyEvent::opcode:
return TimeTicksFromXEventTime(xev.xmotion.time);
- case EnterNotify:
- case LeaveNotify:
+ case x11::CrossingEvent::EnterNotify:
+ case x11::CrossingEvent::LeaveNotify:
return TimeTicksFromXEventTime(xev.xcrossing.time);
- case GenericEvent: {
+ case x11::GeGenericEvent::opcode: {
double start, end;
double touch_timestamp;
- if (GetGestureTimes(xev, &start, &end)) {
+ if (GetGestureTimes(x11_event, &start, &end)) {
// If the driver supports gesture times, use them.
return ui::EventTimeStampFromSeconds(end);
} else if (ui::DeviceDataManagerX11::GetInstance()->GetEventData(
- xev, ui::DeviceDataManagerX11::DT_TOUCH_RAW_TIMESTAMP,
+ x11_event,
+ ui::DeviceDataManagerX11::DT_TOUCH_RAW_TIMESTAMP,
&touch_timestamp)) {
return ui::EventTimeStampFromSeconds(touch_timestamp);
}
@@ -381,43 +392,44 @@ base::TimeTicks TimeTicksFromXEvent(const XEvent& xev) {
namespace ui {
-EventType EventTypeFromXEvent(const XEvent& xev) {
+EventType EventTypeFromXEvent(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
// Allow the DeviceDataManager to block the event. If blocked return
// ET_UNKNOWN as the type so this event will not be further processed.
// NOTE: During some events unittests there is no device data manager.
if (DeviceDataManager::HasInstance() &&
- DeviceDataManagerX11::GetInstance()->IsEventBlocked(xev)) {
+ DeviceDataManagerX11::GetInstance()->IsEventBlocked(x11_event)) {
return ET_UNKNOWN;
}
switch (xev.type) {
- case KeyPress:
+ case x11::KeyEvent::Press:
return ET_KEY_PRESSED;
- case KeyRelease:
+ case x11::KeyEvent::Release:
return ET_KEY_RELEASED;
- case ButtonPress:
+ case x11::ButtonEvent::Press:
if (static_cast<int>(xev.xbutton.button) >= kMinWheelButton &&
static_cast<int>(xev.xbutton.button) <= kMaxWheelButton)
return ET_MOUSEWHEEL;
return ET_MOUSE_PRESSED;
- case ButtonRelease:
+ case x11::ButtonEvent::Release:
// Drop wheel events; we should've already scrolled on the press.
if (static_cast<int>(xev.xbutton.button) >= kMinWheelButton &&
static_cast<int>(xev.xbutton.button) <= kMaxWheelButton)
return ET_UNKNOWN;
return ET_MOUSE_RELEASED;
- case MotionNotify:
+ case x11::MotionNotifyEvent::opcode:
if (xev.xmotion.state & (Button1Mask | Button2Mask | Button3Mask))
return ET_MOUSE_DRAGGED;
return ET_MOUSE_MOVED;
- case EnterNotify:
+ case x11::CrossingEvent::EnterNotify:
// The standard on Windows is to send a MouseMove event when the mouse
// first enters a window instead of sending a special mouse enter event.
// To be consistent we follow the same style.
return ET_MOUSE_MOVED;
- case LeaveNotify:
+ case x11::CrossingEvent::LeaveNotify:
return ET_MOUSE_EXITED;
- case GenericEvent: {
+ case x11::GeGenericEvent::opcode: {
TouchFactory* factory = TouchFactory::GetInstance();
if (!factory->ShouldProcessXI2Event(const_cast<XEvent*>(&xev)))
return ET_UNKNOWN;
@@ -428,7 +440,7 @@ EventType EventTypeFromXEvent(const XEvent& xev) {
// why it is necessary to check for the XI_Touch* events in the following
// switch statement to account for attached-slave touchscreens.
if (factory->IsTouchDevice(xievent->sourceid))
- return GetTouchEventType(xev);
+ return GetTouchEventType(x11_event);
switch (xievent->evtype) {
case XI_TouchBegin:
@@ -438,13 +450,13 @@ EventType EventTypeFromXEvent(const XEvent& xev) {
case XI_TouchEnd:
return ui::ET_TOUCH_RELEASED;
case XI_ButtonPress: {
- int button = EventButtonFromXEvent(xev);
+ int button = EventButtonFromXEvent(x11_event);
if (button >= kMinWheelButton && button <= kMaxWheelButton)
return ET_MOUSEWHEEL;
return ET_MOUSE_PRESSED;
}
case XI_ButtonRelease: {
- int button = EventButtonFromXEvent(xev);
+ int button = EventButtonFromXEvent(x11_event);
// Drop wheel events; we should've already scrolled on the press.
if (button >= kMinWheelButton && button <= kMaxWheelButton)
return ET_UNKNOWN;
@@ -453,18 +465,19 @@ EventType EventTypeFromXEvent(const XEvent& xev) {
case XI_Motion: {
bool is_cancel;
DeviceDataManagerX11* devices = DeviceDataManagerX11::GetInstance();
- if (GetFlingDataFromXEvent(xev, NULL, NULL, NULL, NULL, &is_cancel))
+ if (GetFlingDataFromXEvent(x11_event, nullptr, nullptr, nullptr,
+ nullptr, &is_cancel))
return is_cancel ? ET_SCROLL_FLING_CANCEL : ET_SCROLL_FLING_START;
- if (devices->IsScrollEvent(xev)) {
- return devices->IsTouchpadXInputEvent(xev) ? ET_SCROLL
- : ET_MOUSEWHEEL;
+ if (devices->IsScrollEvent(x11_event)) {
+ return devices->IsTouchpadXInputEvent(x11_event) ? ET_SCROLL
+ : ET_MOUSEWHEEL;
}
- if (devices->GetScrollClassEventDetail(xev) !=
+ if (devices->GetScrollClassEventDetail(x11_event) !=
SCROLL_TYPE_NO_SCROLL) {
- return devices->IsTouchpadXInputEvent(xev) ? ET_SCROLL
- : ET_MOUSEWHEEL;
+ return devices->IsTouchpadXInputEvent(x11_event) ? ET_SCROLL
+ : ET_MOUSEWHEEL;
}
- if (devices->IsCMTMetricsEvent(xev))
+ if (devices->IsCMTMetricsEvent(x11_event))
return ET_UMA_DATA;
if (GetButtonMaskForX2Event(xievent))
return ET_MOUSE_DRAGGED;
@@ -490,30 +503,31 @@ EventType EventTypeFromXEvent(const XEvent& xev) {
return ET_UNKNOWN;
}
-int EventFlagsFromXEvent(const XEvent& xev) {
+int EventFlagsFromXEvent(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
switch (xev.type) {
- case KeyPress:
- case KeyRelease: {
- XModifierStateWatcher::GetInstance()->UpdateStateFromXEvent(xev);
- return GetEventFlagsFromXKeyEvent(xev);
+ case x11::KeyEvent::Press:
+ case x11::KeyEvent::Release: {
+ XModifierStateWatcher::GetInstance()->UpdateStateFromXEvent(x11_event);
+ return GetEventFlagsFromXKeyEvent(x11_event);
}
- case ButtonPress:
- case ButtonRelease: {
+ case x11::ButtonEvent::Press:
+ case x11::ButtonEvent::Release: {
int flags = GetEventFlagsFromXState(xev.xbutton.state);
- const EventType type = EventTypeFromXEvent(xev);
+ const EventType type = EventTypeFromXEvent(x11_event);
if (type == ET_MOUSE_PRESSED || type == ET_MOUSE_RELEASED)
flags |= GetEventFlagsForButton(xev.xbutton.button);
return flags;
}
- case EnterNotify:
+ case x11::CrossingEvent::EnterNotify:
// EnterNotify creates ET_MOUSE_MOVED. Mark as synthesized as this is not
// a real mouse move event.
return GetEventFlagsFromXState(xev.xcrossing.state) | EF_IS_SYNTHESIZED;
- case LeaveNotify:
+ case x11::CrossingEvent::LeaveNotify:
return GetEventFlagsFromXState(xev.xcrossing.state);
- case MotionNotify:
+ case x11::MotionNotifyEvent::opcode:
return GetEventFlagsFromXState(xev.xmotion.state);
- case GenericEvent: {
+ case x11::GeGenericEvent::opcode: {
XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev.xcookie.data);
switch (xievent->evtype) {
@@ -535,8 +549,8 @@ int EventFlagsFromXEvent(const XEvent& xev) {
XModifierStateWatcher::GetInstance()->state());
}
- const EventType type = EventTypeFromXEvent(xev);
- int button = EventButtonFromXEvent(xev);
+ const EventType type = EventTypeFromXEvent(x11_event);
+ int button = EventButtonFromXEvent(x11_event);
if ((type == ET_MOUSE_PRESSED || type == ET_MOUSE_RELEASED) && !touch)
flags |= GetEventFlagsForButton(button);
return flags;
@@ -546,8 +560,9 @@ int EventFlagsFromXEvent(const XEvent& xev) {
GetEventFlagsFromXState(xievent->mods.effective);
case XI_KeyPress:
case XI_KeyRelease: {
- XModifierStateWatcher::GetInstance()->UpdateStateFromXEvent(xev);
- return GetEventFlagsFromXGenericEvent(xev);
+ XModifierStateWatcher::GetInstance()->UpdateStateFromXEvent(
+ x11_event);
+ return GetEventFlagsFromXGenericEvent(x11_event);
}
}
}
@@ -555,23 +570,24 @@ int EventFlagsFromXEvent(const XEvent& xev) {
return 0;
}
-base::TimeTicks EventTimeFromXEvent(const XEvent& xev) {
+base::TimeTicks EventTimeFromXEvent(const x11::Event& xev) {
auto timestamp = TimeTicksFromXEvent(xev);
ValidateEventTimeClock(&timestamp);
return timestamp;
}
-gfx::Point EventLocationFromXEvent(const XEvent& xev) {
+gfx::Point EventLocationFromXEvent(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
switch (xev.type) {
- case EnterNotify:
- case LeaveNotify:
+ case x11::CrossingEvent::EnterNotify:
+ case x11::CrossingEvent::LeaveNotify:
return gfx::Point(xev.xcrossing.x, xev.xcrossing.y);
- case ButtonPress:
- case ButtonRelease:
+ case x11::ButtonEvent::Press:
+ case x11::ButtonEvent::Release:
return gfx::Point(xev.xbutton.x, xev.xbutton.y);
- case MotionNotify:
+ case x11::MotionNotifyEvent::opcode:
return gfx::Point(xev.xmotion.x, xev.xmotion.y);
- case GenericEvent: {
+ case x11::GeGenericEvent::opcode: {
XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev.xcookie.data);
float x = xievent->event_x;
float y = xievent->event_y;
@@ -593,20 +609,21 @@ gfx::Point EventLocationFromXEvent(const XEvent& xev) {
return gfx::Point();
}
-gfx::Point EventSystemLocationFromXEvent(const XEvent& xev) {
+gfx::Point EventSystemLocationFromXEvent(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
switch (xev.type) {
- case EnterNotify:
- case LeaveNotify: {
+ case x11::CrossingEvent::EnterNotify:
+ case x11::CrossingEvent::LeaveNotify: {
return gfx::Point(xev.xcrossing.x_root, xev.xcrossing.y_root);
}
- case ButtonPress:
- case ButtonRelease: {
+ case x11::ButtonEvent::Press:
+ case x11::ButtonEvent::Release: {
return gfx::Point(xev.xbutton.x_root, xev.xbutton.y_root);
}
- case MotionNotify: {
+ case x11::MotionNotifyEvent::opcode: {
return gfx::Point(xev.xmotion.x_root, xev.xmotion.y_root);
}
- case GenericEvent: {
+ case x11::GeGenericEvent::opcode: {
XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev.xcookie.data);
return gfx::Point(xievent->root_x, xievent->root_y);
}
@@ -615,8 +632,9 @@ gfx::Point EventSystemLocationFromXEvent(const XEvent& xev) {
return gfx::Point();
}
-int EventButtonFromXEvent(const XEvent& xev) {
- CHECK_EQ(GenericEvent, xev.type);
+int EventButtonFromXEvent(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
+ CHECK_EQ(x11::GeGenericEvent::opcode, xev.type);
XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev.xcookie.data);
int button = xievent->detail;
@@ -625,17 +643,18 @@ int EventButtonFromXEvent(const XEvent& xev) {
: button;
}
-int GetChangedMouseButtonFlagsFromXEvent(const XEvent& xev) {
+int GetChangedMouseButtonFlagsFromXEvent(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
switch (xev.type) {
- case ButtonPress:
- case ButtonRelease:
+ case x11::ButtonEvent::Press:
+ case x11::ButtonEvent::Release:
return GetEventFlagsForButton(xev.xbutton.button);
- case GenericEvent: {
+ case x11::GeGenericEvent::opcode: {
XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev.xcookie.data);
switch (xievent->evtype) {
case XI_ButtonPress:
case XI_ButtonRelease:
- return GetEventFlagsForButton(EventButtonFromXEvent(xev));
+ return GetEventFlagsForButton(EventButtonFromXEvent(x11_event));
default:
break;
}
@@ -647,20 +666,24 @@ int GetChangedMouseButtonFlagsFromXEvent(const XEvent& xev) {
return 0;
}
-gfx::Vector2d GetMouseWheelOffsetFromXEvent(const XEvent& xev) {
+gfx::Vector2d GetMouseWheelOffsetFromXEvent(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
float x_offset, y_offset;
- if (GetScrollOffsetsFromXEvent(xev, &x_offset, &y_offset, NULL, NULL, NULL)) {
+ if (GetScrollOffsetsFromXEvent(x11_event, &x_offset, &y_offset, nullptr,
+ nullptr, nullptr)) {
return gfx::Vector2d(static_cast<int>(x_offset),
static_cast<int>(y_offset));
}
- int button = xev.type == GenericEvent ? EventButtonFromXEvent(xev)
- : xev.xbutton.button;
+ int button = xev.type == x11::GeGenericEvent::opcode
+ ? EventButtonFromXEvent(x11_event)
+ : xev.xbutton.button;
// If this is an xinput1 scroll event from an xinput2 mouse then we need to
// block the legacy scroll events for the necessary axes.
int scroll_class_type =
- DeviceDataManagerX11::GetInstance()->GetScrollClassDeviceDetail(xev);
+ DeviceDataManagerX11::GetInstance()->GetScrollClassDeviceDetail(
+ x11_event);
bool xi2_vertical = scroll_class_type & SCROLL_TYPE_VERTICAL;
bool xi2_horizontal = scroll_class_type & SCROLL_TYPE_HORIZONTAL;
@@ -678,7 +701,7 @@ gfx::Vector2d GetMouseWheelOffsetFromXEvent(const XEvent& xev) {
}
}
-int GetTouchIdFromXEvent(const XEvent& xev) {
+int GetTouchIdFromXEvent(const x11::Event& xev) {
double slot = 0;
ui::DeviceDataManagerX11* manager = ui::DeviceDataManagerX11::GetInstance();
double tracking_id;
@@ -692,7 +715,7 @@ int GetTouchIdFromXEvent(const XEvent& xev) {
return slot;
}
-float GetTouchRadiusXFromXEvent(const XEvent& xev) {
+float GetTouchRadiusXFromXEvent(const x11::Event& xev) {
double radius = GetTouchParamFromXEvent(
xev, ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, 0.0) /
2.0;
@@ -700,7 +723,7 @@ float GetTouchRadiusXFromXEvent(const XEvent& xev) {
return radius;
}
-float GetTouchRadiusYFromXEvent(const XEvent& xev) {
+float GetTouchRadiusYFromXEvent(const x11::Event& xev) {
double radius = GetTouchParamFromXEvent(
xev, ui::DeviceDataManagerX11::DT_TOUCH_MINOR, 0.0) /
2.0;
@@ -708,19 +731,20 @@ float GetTouchRadiusYFromXEvent(const XEvent& xev) {
return radius;
}
-float GetTouchAngleFromXEvent(const XEvent& xev) {
+float GetTouchAngleFromXEvent(const x11::Event& xev) {
return GetTouchParamFromXEvent(
xev, ui::DeviceDataManagerX11::DT_TOUCH_ORIENTATION, 0.0) /
2.0;
}
-float GetTouchForceFromXEvent(const XEvent& xev) {
+float GetTouchForceFromXEvent(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
XIDeviceEvent* event = static_cast<XIDeviceEvent*>(xev.xcookie.data);
if (event->evtype == XI_TouchEnd)
return 0.0;
double force = 0.0;
force = GetTouchParamFromXEvent(
- xev, ui::DeviceDataManagerX11::DT_TOUCH_PRESSURE, 0.0);
+ x11_event, ui::DeviceDataManagerX11::DT_TOUCH_PRESSURE, 0.0);
unsigned int deviceid =
static_cast<XIDeviceEvent*>(xev.xcookie.data)->sourceid;
// Force is normalized to fall into [0, 1]
@@ -730,27 +754,28 @@ float GetTouchForceFromXEvent(const XEvent& xev) {
return force;
}
-EventPointerType GetTouchPointerTypeFromXEvent(const XEvent& xev) {
+EventPointerType GetTouchPointerTypeFromXEvent(const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
XIDeviceEvent* event = static_cast<XIDeviceEvent*>(xev.xcookie.data);
DCHECK(ui::TouchFactory::GetInstance()->IsTouchDevice(event->sourceid));
return ui::TouchFactory::GetInstance()->GetTouchDevicePointerType(
event->sourceid);
}
-PointerDetails GetTouchPointerDetailsFromXEvent(const XEvent& xev) {
+PointerDetails GetTouchPointerDetailsFromXEvent(const x11::Event& xev) {
return PointerDetails(
EventPointerType::kTouch, GetTouchIdFromXEvent(xev),
GetTouchRadiusXFromXEvent(xev), GetTouchRadiusYFromXEvent(xev),
GetTouchForceFromXEvent(xev), GetTouchAngleFromXEvent(xev));
}
-bool GetScrollOffsetsFromXEvent(const XEvent& xev,
+bool GetScrollOffsetsFromXEvent(const x11::Event& xev,
float* x_offset,
float* y_offset,
float* x_offset_ordinal,
float* y_offset_ordinal,
int* finger_count) {
- // Temp values to prevent passing NULLs to DeviceDataManager.
+ // Temp values to prevent passing nullptrs to DeviceDataManager.
float x_scroll_offset, y_scroll_offset;
float x_scroll_offset_ordinal, y_scroll_offset_ordinal;
int finger;
@@ -793,7 +818,7 @@ bool GetScrollOffsetsFromXEvent(const XEvent& xev,
return false;
}
-bool GetFlingDataFromXEvent(const XEvent& xev,
+bool GetFlingDataFromXEvent(const x11::Event& xev,
float* vx,
float* vy,
float* vx_ordinal,
diff --git a/chromium/ui/events/x/events_x_utils.h b/chromium/ui/events/x/events_x_utils.h
index a7a34c5b1d0..6fb201cfa6e 100644
--- a/chromium/ui/events/x/events_x_utils.h
+++ b/chromium/ui/events/x/events_x_utils.h
@@ -16,73 +16,75 @@
#include "ui/events/types/event_type.h"
#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"
namespace ui {
-// Gets the EventType from a XEvent.
-EVENTS_X_EXPORT EventType EventTypeFromXEvent(const XEvent& xev);
+// Gets the EventType from a x11::Event.
+EVENTS_X_EXPORT EventType EventTypeFromXEvent(const x11::Event& xev);
-// Gets the EventFlags from a XEvent.
-EVENTS_X_EXPORT int EventFlagsFromXEvent(const XEvent& xev);
+// Gets the EventFlags from a x11::Event.
+EVENTS_X_EXPORT int EventFlagsFromXEvent(const x11::Event& xev);
-// Gets the timestamp from a XEvent.
-EVENTS_X_EXPORT base::TimeTicks EventTimeFromXEvent(const XEvent& xev);
+// Gets the timestamp from a x11::Event.
+EVENTS_X_EXPORT base::TimeTicks EventTimeFromXEvent(const x11::Event& xev);
-// Gets the location from a XEvent. The coordinate system of the resultant
+// Gets the location from a x11::Event. The coordinate system of the resultant
// |Point| has the origin at top-left of the "root window". The nature of
// this "root window" and how it maps to platform-specific drawing surfaces is
// defined in ui/aura/root_window.* and ui/aura/window_tree_host*.
-EVENTS_X_EXPORT gfx::Point EventLocationFromXEvent(const XEvent& xev);
+EVENTS_X_EXPORT gfx::Point EventLocationFromXEvent(const x11::Event& xev);
// Gets the location in native system coordinate space.
-EVENTS_X_EXPORT gfx::Point EventSystemLocationFromXEvent(const XEvent& xev);
+EVENTS_X_EXPORT gfx::Point EventSystemLocationFromXEvent(const x11::Event& xev);
// Returns the 'real' button for an event. The button reported in slave events
// does not take into account any remapping (e.g. using xmodmap), while the
// button reported in master events do. This is a utility function to always
// return the mapped button.
-EVENTS_X_EXPORT int EventButtonFromXEvent(const XEvent& xev);
+EVENTS_X_EXPORT int EventButtonFromXEvent(const x11::Event& xev);
// Returns the flags of the button that changed during a press/release.
-EVENTS_X_EXPORT int GetChangedMouseButtonFlagsFromXEvent(const XEvent& xev);
+EVENTS_X_EXPORT int GetChangedMouseButtonFlagsFromXEvent(const x11::Event& xev);
-// Gets the mouse wheel offsets from a XEvent.
-EVENTS_X_EXPORT gfx::Vector2d GetMouseWheelOffsetFromXEvent(const XEvent& xev);
+// Gets the mouse wheel offsets from a x11::Event.
+EVENTS_X_EXPORT gfx::Vector2d GetMouseWheelOffsetFromXEvent(
+ const x11::Event& xev);
-// Gets the touch id from a XEvent.
-EVENTS_X_EXPORT int GetTouchIdFromXEvent(const XEvent& xev);
+// Gets the touch id from a x11::Event.
+EVENTS_X_EXPORT int GetTouchIdFromXEvent(const x11::Event& xev);
-// Gets the radius along the X/Y axis from a XEvent. Default is 1.0.
-EVENTS_X_EXPORT float GetTouchRadiusXFromXEvent(const XEvent& xev);
-EVENTS_X_EXPORT float GetTouchRadiusYFromXEvent(const XEvent& xev);
+// Gets the radius along the X/Y axis from a x11::Event. Default is 1.0.
+EVENTS_X_EXPORT float GetTouchRadiusXFromXEvent(const x11::Event& xev);
+EVENTS_X_EXPORT float GetTouchRadiusYFromXEvent(const x11::Event& xev);
// Gets the angle of the major axis away from the X axis. Default is 0.0.
-EVENTS_X_EXPORT float GetTouchAngleFromXEvent(const XEvent& xev);
+EVENTS_X_EXPORT float GetTouchAngleFromXEvent(const x11::Event& xev);
// Gets the force from a native_event. Normalized to be [0, 1]. Default is 0.0.
-EVENTS_X_EXPORT float GetTouchForceFromXEvent(const XEvent& xev);
+EVENTS_X_EXPORT float GetTouchForceFromXEvent(const x11::Event& xev);
// Gets the pointer type from a native_event.
EVENTS_X_EXPORT EventPointerType
-GetTouchPointerTypeFromXEvent(const XEvent& xev);
+GetTouchPointerTypeFromXEvent(const x11::Event& xev);
-// Gets the pointer details from an XEvent.
+// Gets the pointer details from an x11::Event.
EVENTS_X_EXPORT PointerDetails
-GetTouchPointerDetailsFromXEvent(const XEvent& xev);
+GetTouchPointerDetailsFromXEvent(const x11::Event& xev);
// Returns whether this is a scroll event and optionally gets the amount to be
// scrolled. |x_offset|, |y_offset| and |finger_count| can be NULL.
-EVENTS_X_EXPORT bool GetScrollOffsetsFromXEvent(const XEvent& xev,
+EVENTS_X_EXPORT bool GetScrollOffsetsFromXEvent(const x11::Event& xev,
float* x_offset,
float* y_offset,
float* x_offset_ordinal,
float* y_offset_ordinal,
int* finger_count);
-// Gets the fling velocity from a XEvent. is_cancel is set to true if
+// Gets the fling velocity from a x11::Event. is_cancel is set to true if
// this was a tap down, intended to stop an ongoing fling.
-EVENTS_X_EXPORT bool GetFlingDataFromXEvent(const XEvent& xev,
+EVENTS_X_EXPORT bool GetFlingDataFromXEvent(const x11::Event& xev,
float* vx,
float* vy,
float* vx_ordinal,
diff --git a/chromium/ui/events/x/keyboard_hook_x11.cc b/chromium/ui/events/x/keyboard_hook_x11.cc
index fb2bccea047..ac4b00dd22f 100644
--- a/chromium/ui/events/x/keyboard_hook_x11.cc
+++ b/chromium/ui/events/x/keyboard_hook_x11.cc
@@ -99,7 +99,8 @@ KeyboardHookX11::~KeyboardHookX11() {
// loops, however in practice the keys are not actually released.
for (int native_key_code : grabbed_keys_) {
for (uint32_t modifier : kModifierMasks) {
- XUngrabKey(x_display_, native_key_code, modifier, x_window_);
+ XUngrabKey(x_display_, native_key_code, modifier,
+ static_cast<uint32_t>(x_window_));
}
}
}
@@ -144,7 +145,8 @@ void KeyboardHookX11::CaptureKeyForDomCode(DomCode dom_code) {
// XGrabKey always returns 1 so we can't rely on the return value to
// determine if the grab succeeded. Errors are reported to the global
// error handler for debugging purposes but are not used to judge success.
- XGrabKey(x_display_, native_key_code, modifier, x_window_,
+ XGrabKey(x_display_, native_key_code, modifier,
+ static_cast<uint32_t>(x_window_),
/*owner_events=*/x11::False,
/*pointer_mode=*/GrabModeAsync,
/*keyboard_mode=*/GrabModeAsync);
diff --git a/chromium/ui/events/x/x11_event_translation.cc b/chromium/ui/events/x/x11_event_translation.cc
index 6bb5a30376e..fcff13c80e6 100644
--- a/chromium/ui/events/x/x11_event_translation.cc
+++ b/chromium/ui/events/x/x11_event_translation.cc
@@ -43,7 +43,8 @@ class TouchEventX11 : public ui::TouchEvent {
};
Event::Properties GetEventPropertiesFromXEvent(EventType type,
- const XEvent& xev) {
+ const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
using Values = std::vector<uint8_t>;
Event::Properties properties;
if (type == ET_KEY_PRESSED || type == ET_KEY_RELEASED) {
@@ -75,66 +76,74 @@ Event::Properties GetEventPropertiesFromXEvent(EventType type,
}
std::unique_ptr<KeyEvent> CreateKeyEvent(EventType event_type,
- const XEvent& xev) {
+ const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
KeyboardCode key_code = KeyboardCodeFromXKeyEvent(&xev);
- int event_flags = EventFlagsFromXEvent(xev);
+ int event_flags = EventFlagsFromXEvent(x11_event);
// In Ozone builds, keep DomCode/DomKey unset, so they are extracted lazily
// in KeyEvent::ApplyLayout() which makes it possible for CrOS/Linux, for
// example, to support host system keyboard layouts.
#if defined(USE_OZONE)
auto event = std::make_unique<KeyEvent>(event_type, key_code, event_flags,
- EventTimeFromXEvent(xev));
+ EventTimeFromXEvent(x11_event));
#else
auto event = std::make_unique<KeyEvent>(
event_type, key_code, CodeFromXEvent(&xev), event_flags,
- GetDomKeyFromXEvent(&xev), EventTimeFromXEvent(xev));
+ GetDomKeyFromXEvent(&xev), EventTimeFromXEvent(x11_event));
#endif
DCHECK(event);
- event->SetProperties(GetEventPropertiesFromXEvent(event_type, xev));
+ event->SetProperties(GetEventPropertiesFromXEvent(event_type, x11_event));
event->InitializeNative();
return event;
}
-void SetEventSourceDeviceId(MouseEvent* event, const XEvent& xev) {
+void SetEventSourceDeviceId(MouseEvent* event, const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
DCHECK(event);
- if (xev.type == GenericEvent) {
+ if (xev.type == x11::GeGenericEvent::opcode) {
XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev.xcookie.data);
event->set_source_device_id(xiev->sourceid);
}
}
std::unique_ptr<MouseEvent> CreateMouseEvent(EventType type,
- const XEvent& xev) {
+ const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
// Ignore EventNotify and LeaveNotify events from children of |xwindow_|.
// NativeViewGLSurfaceGLX adds a child to |xwindow_|.
// https://crbug.com/792322
- bool enter_or_leave = xev.type == EnterNotify || xev.type == LeaveNotify;
+ bool enter_or_leave = xev.type == x11::CrossingEvent::EnterNotify ||
+ xev.type == x11::CrossingEvent::LeaveNotify;
if (enter_or_leave && xev.xcrossing.detail == NotifyInferior)
return nullptr;
PointerDetails details{EventPointerType::kMouse};
auto event = std::make_unique<MouseEvent>(
- type, EventLocationFromXEvent(xev), EventSystemLocationFromXEvent(xev),
- EventTimeFromXEvent(xev), EventFlagsFromXEvent(xev),
- GetChangedMouseButtonFlagsFromXEvent(xev), details);
+ type, EventLocationFromXEvent(x11_event),
+ EventSystemLocationFromXEvent(x11_event), EventTimeFromXEvent(x11_event),
+ EventFlagsFromXEvent(x11_event),
+ GetChangedMouseButtonFlagsFromXEvent(x11_event), details);
DCHECK(event);
- SetEventSourceDeviceId(event.get(), xev);
- event->SetProperties(GetEventPropertiesFromXEvent(type, xev));
+ SetEventSourceDeviceId(event.get(), x11_event);
+ event->SetProperties(GetEventPropertiesFromXEvent(type, x11_event));
event->InitializeNative();
return event;
}
-std::unique_ptr<MouseWheelEvent> CreateMouseWheelEvent(const XEvent& xev) {
- int button_flags = (xev.type == GenericEvent)
- ? GetChangedMouseButtonFlagsFromXEvent(xev)
+std::unique_ptr<MouseWheelEvent> CreateMouseWheelEvent(
+ const x11::Event& x11_event) {
+ const XEvent& xev = x11_event.xlib_event();
+ int button_flags = (xev.type == x11::GeGenericEvent::opcode)
+ ? GetChangedMouseButtonFlagsFromXEvent(x11_event)
: 0;
auto event = std::make_unique<MouseWheelEvent>(
- GetMouseWheelOffsetFromXEvent(xev), EventLocationFromXEvent(xev),
- EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev),
- EventFlagsFromXEvent(xev), button_flags);
+ GetMouseWheelOffsetFromXEvent(x11_event),
+ EventLocationFromXEvent(x11_event),
+ EventSystemLocationFromXEvent(x11_event), EventTimeFromXEvent(x11_event),
+ EventFlagsFromXEvent(x11_event), button_flags);
DCHECK(event);
event->InitializeNative();
@@ -142,7 +151,7 @@ std::unique_ptr<MouseWheelEvent> CreateMouseWheelEvent(const XEvent& xev) {
}
std::unique_ptr<TouchEvent> CreateTouchEvent(EventType type,
- const XEvent& xev) {
+ const x11::Event& xev) {
auto event = std::make_unique<TouchEventX11>(
type, EventLocationFromXEvent(xev), EventTimeFromXEvent(xev),
GetTouchPointerDetailsFromXEvent(xev));
@@ -156,7 +165,7 @@ std::unique_ptr<TouchEvent> CreateTouchEvent(EventType type,
}
std::unique_ptr<ScrollEvent> CreateScrollEvent(EventType type,
- const XEvent& xev) {
+ const x11::Event& xev) {
float x_offset, y_offset, x_offset_ordinal, y_offset_ordinal;
int finger_count = 0;
@@ -182,7 +191,7 @@ std::unique_ptr<ScrollEvent> CreateScrollEvent(EventType type,
}
// Translates XI2 XEvent into a ui::Event.
-std::unique_ptr<ui::Event> TranslateFromXI2Event(const XEvent& xev,
+std::unique_ptr<ui::Event> TranslateFromXI2Event(const x11::Event& xev,
EventType event_type) {
switch (event_type) {
case ET_KEY_PRESSED:
@@ -214,18 +223,18 @@ std::unique_ptr<ui::Event> TranslateFromXI2Event(const XEvent& xev,
return nullptr;
}
-std::unique_ptr<Event> TranslateFromXEvent(const XEvent& xev) {
+std::unique_ptr<Event> TranslateFromXEvent(const x11::Event& xev) {
EventType event_type = EventTypeFromXEvent(xev);
- switch (xev.type) {
- case LeaveNotify:
- case EnterNotify:
- case MotionNotify:
+ switch (xev.xlib_event().type) {
+ case x11::CrossingEvent::LeaveNotify:
+ case x11::CrossingEvent::EnterNotify:
+ case x11::MotionNotifyEvent::opcode:
return CreateMouseEvent(event_type, xev);
- case KeyPress:
- case KeyRelease:
+ case x11::KeyEvent::Press:
+ case x11::KeyEvent::Release:
return CreateKeyEvent(event_type, xev);
- case ButtonPress:
- case ButtonRelease: {
+ case x11::ButtonEvent::Press:
+ case x11::ButtonEvent::Release: {
switch (event_type) {
case ET_MOUSEWHEEL:
return CreateMouseWheelEvent(xev);
@@ -241,7 +250,7 @@ std::unique_ptr<Event> TranslateFromXEvent(const XEvent& xev) {
}
break;
}
- case GenericEvent:
+ case x11::GeGenericEvent::opcode:
return TranslateFromXI2Event(xev, event_type);
}
return nullptr;
@@ -250,7 +259,7 @@ std::unique_ptr<Event> TranslateFromXEvent(const XEvent& xev) {
} // namespace
// Translates a XEvent into a ui::Event.
-std::unique_ptr<Event> BuildEventFromXEvent(const XEvent& xev) {
+std::unique_ptr<Event> BuildEventFromXEvent(const x11::Event& xev) {
auto event = TranslateFromXEvent(xev);
if (event)
ui::ComputeEventLatencyOS(event.get());
@@ -258,7 +267,7 @@ std::unique_ptr<Event> BuildEventFromXEvent(const XEvent& xev) {
}
// Convenience function that translates XEvent into ui::KeyEvent
-std::unique_ptr<KeyEvent> BuildKeyEventFromXEvent(const XEvent& xev) {
+std::unique_ptr<KeyEvent> BuildKeyEventFromXEvent(const x11::Event& xev) {
auto event = BuildEventFromXEvent(xev);
if (!event || !event->IsKeyEvent())
return nullptr;
@@ -266,7 +275,7 @@ std::unique_ptr<KeyEvent> BuildKeyEventFromXEvent(const XEvent& xev) {
}
// Convenience function that translates XEvent into ui::MouseEvent
-std::unique_ptr<MouseEvent> BuildMouseEventFromXEvent(const XEvent& xev) {
+std::unique_ptr<MouseEvent> BuildMouseEventFromXEvent(const x11::Event& xev) {
auto event = BuildEventFromXEvent(xev);
if (!event || !event->IsMouseEvent())
return nullptr;
@@ -274,7 +283,7 @@ std::unique_ptr<MouseEvent> BuildMouseEventFromXEvent(const XEvent& xev) {
}
// Convenience function that translates XEvent into ui::TouchEvent
-std::unique_ptr<TouchEvent> BuildTouchEventFromXEvent(const XEvent& xev) {
+std::unique_ptr<TouchEvent> BuildTouchEventFromXEvent(const x11::Event& xev) {
auto event = BuildEventFromXEvent(xev);
if (!event || !event->IsTouchEvent())
return nullptr;
@@ -283,7 +292,7 @@ std::unique_ptr<TouchEvent> BuildTouchEventFromXEvent(const XEvent& xev) {
// Convenience function that translates XEvent into ui::MouseWheelEvent
std::unique_ptr<MouseWheelEvent> BuildMouseWheelEventFromXEvent(
- const XEvent& xev) {
+ const x11::Event& xev) {
auto event = BuildEventFromXEvent(xev);
if (!event || !event->IsMouseWheelEvent())
return nullptr;
diff --git a/chromium/ui/events/x/x11_event_translation.h b/chromium/ui/events/x/x11_event_translation.h
index 446175ef046..13f425607eb 100644
--- a/chromium/ui/events/x/x11_event_translation.h
+++ b/chromium/ui/events/x/x11_event_translation.h
@@ -10,7 +10,8 @@
#include "base/component_export.h"
#include "ui/events/event.h"
#include "ui/events/events_export.h"
-#include "ui/gfx/x/x11_types.h"
+#include "ui/gfx/x/event.h"
+#include "ui/gfx/x/x11.h"
namespace ui {
@@ -21,23 +22,24 @@ class MouseWheelEvent;
class TouchEvent;
// Translates a XEvent into a ui::Event.
-EVENTS_EXPORT std::unique_ptr<Event> BuildEventFromXEvent(const XEvent& xev);
+EVENTS_EXPORT std::unique_ptr<Event> BuildEventFromXEvent(
+ const x11::Event& xev);
// Convenience function that translates XEvent into ui::KeyEvent
EVENTS_EXPORT std::unique_ptr<KeyEvent> BuildKeyEventFromXEvent(
- const XEvent& xev);
+ const x11::Event& xev);
// Convenience function that translates XEvent into ui::MouseEvent
EVENTS_EXPORT std::unique_ptr<MouseEvent> BuildMouseEventFromXEvent(
- const XEvent& xev);
+ const x11::Event& xev);
// Convenience function that translates XEvent into ui::MouseWheelEvent
EVENTS_EXPORT std::unique_ptr<MouseWheelEvent> BuildMouseWheelEventFromXEvent(
- const XEvent& xev);
+ const x11::Event& xev);
// Convenience function that translates XEvent into ui::TouchEvent
EVENTS_EXPORT std::unique_ptr<TouchEvent> BuildTouchEventFromXEvent(
- const XEvent& xev);
+ const x11::Event& xev);
} // namespace ui
diff --git a/chromium/ui/events/x/x11_event_translation_unittest.cc b/chromium/ui/events/x/x11_event_translation_unittest.cc
index 88bfc404a99..5f43a97bf90 100644
--- a/chromium/ui/events/x/x11_event_translation_unittest.cc
+++ b/chromium/ui/events/x/x11_event_translation_unittest.cc
@@ -4,6 +4,8 @@
#include "ui/events/x/x11_event_translation.h"
+#include <xcb/xcb.h>
+
#include "base/time/time.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/events/base_event_utils.h"
@@ -19,7 +21,10 @@
#include "ui/events/test/keyboard_layout.h"
#include "ui/events/test/scoped_event_test_tick_clock.h"
#include "ui/events/types/event_type.h"
+#include "ui/gfx/x/connection.h"
+#include "ui/gfx/x/event.h"
#include "ui/gfx/x/x11.h"
+#include "ui/gfx/x/xproto.h"
namespace ui {
@@ -52,12 +57,14 @@ TEST(XEventTranslationTest, KeyEventXEventPropertiesSet) {
ScopedXI2Event scoped_xev;
scoped_xev.InitKeyEvent(ET_KEY_PRESSED, VKEY_A, EF_NONE);
- XEvent* xev = scoped_xev;
- XDisplay* xdisplay = xev->xkey.display;
+ x11::Event* xev = scoped_xev;
+ XDisplay* xdisplay = xev->xlib_event().xkey.display;
// Set keyboard group in XKeyEvent
- xev->xkey.state = XkbBuildCoreState(xev->xkey.state, 2u);
+ uint32_t state = XkbBuildCoreState(xev->xlib_event().xkey.state, 2u);
// Set IBus-specific flags
- xev->xkey.state |= 0x3 << ui::kPropertyKeyboardIBusFlagOffset;
+ state |= 0x3 << ui::kPropertyKeyboardIBusFlagOffset;
+ xev->xlib_event().xkey.state = state;
+ xev->As<x11::KeyEvent>()->state = static_cast<x11::KeyButMask>(state);
auto keyev = ui::BuildKeyEventFromXEvent(*xev);
EXPECT_TRUE(keyev);
@@ -93,7 +100,7 @@ TEST(XEventTranslationTest, BogusTimestampCorrection) {
ui::ScopedKeyboardLayout keyboard_layout(ui::KEYBOARD_LAYOUT_ENGLISH_US);
ScopedXI2Event scoped_xev;
scoped_xev.InitKeyEvent(ET_KEY_PRESSED, VKEY_RETURN, EF_NONE);
- XEvent* xev = scoped_xev;
+ x11::Event* xev = scoped_xev;
test::ScopedEventTestTickClock test_clock;
test_clock.Advance(TimeDelta::FromSeconds(1));
@@ -105,7 +112,8 @@ TEST(XEventTranslationTest, BogusTimestampCorrection) {
// Emulate XEvent generated 500ms before current time (non-bogus) and verify
// the translated Event uses native event's timestamp.
- xev->xkey.time = 500;
+ xev->xlib_event().xkey.time = 500;
+ xev->As<x11::KeyEvent>()->time = static_cast<x11::Time>(500);
auto keyev = ui::BuildKeyEventFromXEvent(*xev);
EXPECT_TRUE(keyev);
EXPECT_EQ(now_ticks - TimeDelta::FromMilliseconds(500), keyev->time_stamp());
@@ -113,7 +121,8 @@ TEST(XEventTranslationTest, BogusTimestampCorrection) {
// Emulate XEvent generated 1000ms ahead in time (bogus timestamp) and verify
// the translated Event's timestamp is fixed using (i.e: EventTimeForNow()
// instead of the original XEvent's time)
- xev->xkey.time = 2000;
+ xev->xlib_event().xkey.time = 2000;
+ xev->As<x11::KeyEvent>()->time = static_cast<x11::Time>(2000);
auto keyev2 = ui::BuildKeyEventFromXEvent(*xev);
EXPECT_TRUE(keyev2);
EXPECT_EQ(EventTimeForNow(), keyev2->time_stamp());
@@ -124,7 +133,8 @@ TEST(XEventTranslationTest, BogusTimestampCorrection) {
// advance the clock by 5 minutes and set the XEvent's time to 1min, so delta
// is 4min 1sec.
test_clock.Advance(TimeDelta::FromMinutes(5));
- xev->xkey.time = 1000 * 60;
+ xev->xlib_event().xkey.time = 1000 * 60;
+ xev->As<x11::KeyEvent>()->time = static_cast<x11::Time>(1000 * 60);
auto keyev3 = ui::BuildKeyEventFromXEvent(*xev);
EXPECT_TRUE(keyev3);
EXPECT_EQ(EventTimeForNow(), keyev3->time_stamp());
@@ -142,17 +152,22 @@ TEST(XEventTranslationTest, ChangedMouseButtonFlags) {
EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, mouseev->changed_button_flags());
// Taking in a ButtonPress XEvent, with no button pressed.
- static_cast<XEvent*>(event)->xbutton.button = 0;
+ x11::Event& x11_event = *event;
+ x11_event.xlib_event().xbutton.button = 0;
+ x11_event.As<x11::ButtonEvent>()->detail = static_cast<x11::Button>(0);
auto mouseev2 = ui::BuildMouseEventFromXEvent(*event);
EXPECT_TRUE(mouseev2);
EXPECT_EQ(0, mouseev2->changed_button_flags());
// Taking in a EnterNotify XEvent
- auto enter_event = std::make_unique<XEvent>();
- memset(enter_event.get(), 0, sizeof(XEvent));
- enter_event->type = EnterNotify;
- enter_event->xcrossing.detail = NotifyVirtual;
- auto mouseev3 = ui::BuildMouseEventFromXEvent(*enter_event);
+ xcb_generic_event_t ge;
+ memset(&ge, 0, sizeof(ge));
+ auto* enter = reinterpret_cast<xcb_enter_notify_event_t*>(&ge);
+ enter->response_type = x11::CrossingEvent::EnterNotify;
+ enter->detail = NotifyVirtual;
+ x11::Event enter_event(&ge, x11::Connection::Get());
+
+ auto mouseev3 = ui::BuildMouseEventFromXEvent(enter_event);
EXPECT_TRUE(mouseev3);
EXPECT_EQ(0, mouseev3->changed_button_flags());
}
diff --git a/chromium/ui/events/x/x11_window_event_manager.cc b/chromium/ui/events/x/x11_window_event_manager.cc
index 751c240571c..f1375ce461a 100644
--- a/chromium/ui/events/x/x11_window_event_manager.cc
+++ b/chromium/ui/events/x/x11_window_event_manager.cc
@@ -14,13 +14,13 @@ namespace ui {
namespace {
-// Asks the X server to set |xid|'s event mask to |new_mask|.
-void SetEventMask(XID xid, uint32_t new_mask) {
+// Asks the X server to set |window|'s event mask to |new_mask|.
+void SetEventMask(x11::Window window, uint32_t new_mask) {
XDisplay* display = gfx::GetXDisplay();
xcb_connection_t* connection = XGetXCBConnection(display);
- auto cookie = xcb_change_window_attributes(connection, xid, XCB_CW_EVENT_MASK,
- &new_mask);
- // Window |xid| may already be destroyed at this point, so the
+ auto cookie = xcb_change_window_attributes(
+ connection, static_cast<uint32_t>(window), XCB_CW_EVENT_MASK, &new_mask);
+ // Window |window| may already be destroyed at this point, so the
// change_attributes request may give a BadWindow error. In this case, just
// ignore the error.
xcb_discard_reply(connection, cookie.sequence);
@@ -28,17 +28,18 @@ void SetEventMask(XID xid, uint32_t new_mask) {
} // anonymous namespace
-XScopedEventSelector::XScopedEventSelector(XID xid, uint32_t event_mask)
- : xid_(xid),
+XScopedEventSelector::XScopedEventSelector(x11::Window window,
+ uint32_t event_mask)
+ : window_(window),
event_mask_(event_mask),
event_manager_(
XWindowEventManager::GetInstance()->weak_ptr_factory_.GetWeakPtr()) {
- event_manager_->SelectEvents(xid_, event_mask_);
+ event_manager_->SelectEvents(window_, event_mask_);
}
XScopedEventSelector::~XScopedEventSelector() {
if (event_manager_)
- event_manager_->DeselectEvents(xid_, event_mask_);
+ event_manager_->DeselectEvents(window_, event_mask_);
}
// static
@@ -48,12 +49,9 @@ XWindowEventManager* XWindowEventManager::GetInstance() {
class XWindowEventManager::MultiMask {
public:
- MultiMask() {
- for (int i = 0; i < kMaskSize; i++)
- mask_bits_[i] = 0;
- }
+ MultiMask() { memset(mask_bits_, 0, sizeof(mask_bits_)); }
- ~MultiMask() {}
+ ~MultiMask() = default;
void AddMask(uint32_t mask) {
for (int i = 0; i < kMaskSize; i++) {
@@ -88,7 +86,7 @@ class XWindowEventManager::MultiMask {
DISALLOW_COPY_AND_ASSIGN(MultiMask);
};
-XWindowEventManager::XWindowEventManager() {}
+XWindowEventManager::XWindowEventManager() = default;
XWindowEventManager::~XWindowEventManager() {
// Clear events still requested by not-yet-deleted XScopedEventSelectors.
@@ -96,32 +94,35 @@ XWindowEventManager::~XWindowEventManager() {
SetEventMask(mask_pair.first, NoEventMask);
}
-void XWindowEventManager::SelectEvents(XID xid, uint32_t event_mask) {
- std::unique_ptr<MultiMask>& mask = mask_map_[xid];
+void XWindowEventManager::SelectEvents(x11::Window window,
+ uint32_t event_mask) {
+ std::unique_ptr<MultiMask>& mask = mask_map_[window];
if (!mask)
mask = std::make_unique<MultiMask>();
- uint32_t old_mask = mask_map_[xid]->ToMask();
+ uint32_t old_mask = mask_map_[window]->ToMask();
mask->AddMask(event_mask);
- AfterMaskChanged(xid, old_mask);
+ AfterMaskChanged(window, old_mask);
}
-void XWindowEventManager::DeselectEvents(XID xid, uint32_t event_mask) {
- DCHECK(mask_map_.find(xid) != mask_map_.end());
- std::unique_ptr<MultiMask>& mask = mask_map_[xid];
+void XWindowEventManager::DeselectEvents(x11::Window window,
+ uint32_t event_mask) {
+ DCHECK(mask_map_.find(window) != mask_map_.end());
+ std::unique_ptr<MultiMask>& mask = mask_map_[window];
uint32_t old_mask = mask->ToMask();
mask->RemoveMask(event_mask);
- AfterMaskChanged(xid, old_mask);
+ AfterMaskChanged(window, old_mask);
}
-void XWindowEventManager::AfterMaskChanged(XID xid, uint32_t old_mask) {
- uint32_t new_mask = mask_map_[xid]->ToMask();
+void XWindowEventManager::AfterMaskChanged(x11::Window window,
+ uint32_t old_mask) {
+ uint32_t new_mask = mask_map_[window]->ToMask();
if (new_mask == old_mask)
return;
- SetEventMask(xid, new_mask);
+ SetEventMask(window, new_mask);
if (new_mask == NoEventMask)
- mask_map_.erase(xid);
+ mask_map_.erase(window);
}
} // namespace ui
diff --git a/chromium/ui/events/x/x11_window_event_manager.h b/chromium/ui/events/x/x11_window_event_manager.h
index af777a97db0..26c74d42c5b 100644
--- a/chromium/ui/events/x/x11_window_event_manager.h
+++ b/chromium/ui/events/x/x11_window_event_manager.h
@@ -22,15 +22,15 @@ namespace ui {
class XWindowEventManager;
-// Ensures events in |event_mask| are selected on |xid| for the duration of this
-// object's lifetime.
+// Ensures events in |event_mask| are selected on |window| for the duration of
+// this object's lifetime.
class EVENTS_X_EXPORT XScopedEventSelector {
public:
- XScopedEventSelector(XID xid, uint32_t event_mask);
+ XScopedEventSelector(x11::Window window, uint32_t event_mask);
~XScopedEventSelector();
private:
- XID xid_;
+ x11::Window window_;
uint32_t event_mask_;
base::WeakPtr<XWindowEventManager> event_manager_;
@@ -52,18 +52,18 @@ class XWindowEventManager {
~XWindowEventManager();
// Guarantees that events in |event_mask| will be reported to Chrome.
- void SelectEvents(XID xid, uint32_t event_mask);
+ void SelectEvents(x11::Window window, uint32_t event_mask);
// Deselects events on |event_mask|. Chrome will stop receiving events for
// any set bit in |event_mask| only if no other client has selected that bit.
- void DeselectEvents(XID xid, uint32_t event_mask);
+ void DeselectEvents(x11::Window window, uint32_t event_mask);
// Helper method called by SelectEvents and DeselectEvents whenever the mask
- // corresponding to window |xid| might have changed. Calls SetEventMask if
+ // corresponding to |window| might have changed. Calls SetEventMask if
// necessary.
- void AfterMaskChanged(XID xid, uint32_t old_mask);
+ void AfterMaskChanged(x11::Window window, uint32_t old_mask);
- std::map<XID, std::unique_ptr<MultiMask>> mask_map_;
+ std::map<x11::Window, std::unique_ptr<MultiMask>> mask_map_;
// This is used to set XScopedEventSelector::event_manager_. If |this| is
// destroyed before any XScopedEventSelector, the |event_manager_| will become
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 e15d0f63c0c..ca79955ec83 100644
--- a/chromium/ui/file_manager/file_manager/background/js/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/background/js/BUILD.gn
@@ -219,6 +219,7 @@ js_library("drive_sync_handler") {
js_unittest("drive_sync_handler_unittest") {
deps = [
":drive_sync_handler",
+ ":file_operation_util",
":mock_progress_center",
"//ui/file_manager/base/js:mock_chrome",
"//ui/file_manager/base/js:test_error_reporting",
@@ -374,6 +375,7 @@ js_library("media_import_handler") {
js_unittest("media_import_handler_unittest") {
deps = [
+ ":file_operation_util",
":media_import_handler",
":mock_drive_sync_handler",
":mock_media_scanner",
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 ff2352ac56e..8cc31e64297 100644
--- a/chromium/ui/file_manager/file_manager/foreground/elements/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/foreground/elements/BUILD.gn
@@ -103,6 +103,10 @@ js_library("files_spinner") {
# TODO(tapted): Move this to //ui/file_manager/base.
js_library("files_toast") {
visibility += [ "//ui/file_manager/gallery/*" ]
+ deps = [
+ "//ui/webui/resources/cr_elements/cr_button:cr_button",
+ "//ui/webui/resources/cr_elements/cr_toast:cr_toast",
+ ]
}
# TODO(tapted): Move this to //ui/file_manager/base.
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 17706b170b7..338795f93e7 100644
--- a/chromium/ui/file_manager/file_manager/foreground/js/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/foreground/js/BUILD.gn
@@ -30,6 +30,7 @@ js_type_check("closure_compile_module") {
":closure_compile_externs",
":column_visibility_controller",
":constants",
+ ":crostini_controller",
":dialog_action_controller",
":dialog_type",
":directory_contents",
@@ -59,6 +60,7 @@ js_type_check("closure_compile_module") {
":naming_controller",
":navigation_list_model",
":navigation_uma",
+ ":path_component",
":progress_center_item_group",
":providers_model",
":quick_view_controller",
@@ -232,6 +234,15 @@ js_library("column_visibility_controller") {
js_library("constants") {
}
+js_library("crostini_controller") {
+ deps = [
+ ":directory_model",
+ ":file_manager_commands",
+ "ui:directory_tree",
+ "//ui/file_manager/file_manager/foreground/elements:files_message",
+ ]
+}
+
js_library("dialog_action_controller") {
deps = [
":dialog_type",
@@ -256,6 +267,7 @@ js_library("directory_contents") {
":file_list_model",
"metadata:metadata_model",
"//ui/file_manager/base/js:volume_manager_types",
+ "//ui/file_manager/externs:volume_manager",
"//ui/file_manager/file_manager/common/js:async_util",
"//ui/file_manager/file_manager/common/js:metrics",
"//ui/file_manager/file_manager/common/js:util",
@@ -264,6 +276,16 @@ js_library("directory_contents") {
]
}
+js_unittest("directory_contents_unittest") {
+ deps = [
+ ":directory_contents",
+ ":directory_model",
+ "//ui/file_manager/base/js:test_error_reporting",
+ "//ui/file_manager/base/js:volume_manager_types",
+ "//ui/file_manager/externs:volume_manager",
+ ]
+}
+
js_library("directory_model") {
deps = [
":directory_contents",
@@ -328,6 +350,7 @@ js_library("file_manager") {
":android_app_list_model",
":app_state_controller",
":column_visibility_controller",
+ ":crostini_controller",
":dialog_action_controller",
":dialog_type",
":directory_model",
@@ -371,6 +394,7 @@ js_library("file_manager_commands") {
":directory_model",
":directory_tree_naming_controller",
":file_selection",
+ ":file_tasks",
":file_transfer_controller",
":naming_controller",
":providers_model",
@@ -378,15 +402,18 @@ js_library("file_manager_commands") {
":task_controller",
"ui:directory_tree",
"ui:file_manager_ui",
+ "//ui/file_manager/file_manager/common/js:progress_center_common",
"//ui/webui/resources/cr_elements/cr_input:cr_input",
]
- externs_list = [ "//ui/file_manager/externs/command_handler_deps.js" ]
+ externs_list = [
+ "//ui/file_manager/externs/background/progress_center.js",
+ "//ui/file_manager/externs/command_handler_deps.js",
+ ]
}
js_unittest("file_manager_commands_unittest") {
deps = [
":file_manager_commands",
- ":file_tasks",
"//ui/file_manager/file_manager/background/js:mock_volume_manager",
"//ui/webui/resources/js:webui_resource_test",
]
@@ -409,12 +436,16 @@ js_library("file_selection") {
js_library("file_tasks") {
deps = [
":directory_model",
+ ":file_transfer_controller",
":naming_controller",
":task_history",
"metadata:metadata_model",
"ui:file_manager_ui",
]
- externs_list = [ "//ui/file_manager/externs/background/crostini.js" ]
+ externs_list = [
+ "//ui/file_manager/externs/background/crostini.js",
+ "//ui/file_manager/externs/background/progress_center.js",
+ ]
}
js_unittest("file_tasks_unittest") {
@@ -631,6 +662,10 @@ js_unittest("navigation_list_model_unittest") {
]
}
+js_library("path_component") {
+ deps = [ "//ui/file_manager/base/js:volume_manager_types" ]
+}
+
js_library("progress_center_item_group") {
deps = [
"//ui/file_manager/file_manager/common/js:progress_center_common",
@@ -745,6 +780,7 @@ js_library("task_controller") {
"metadata:metadata_model",
"ui:file_manager_ui",
]
+ externs_list = [ "//ui/file_manager/externs/background/progress_center.js" ]
}
js_unittest("task_controller_unittest") {
@@ -806,6 +842,7 @@ js_library("webui_command_extender") {
js_test_gen_html("js_test_gen_html") {
deps = [
":actions_model_unittest",
+ ":directory_contents_unittest",
":file_list_model_unittest",
":file_manager_commands_unittest",
":file_tasks_unittest",
@@ -819,4 +856,5 @@ js_test_gen_html("js_test_gen_html") {
":task_controller_unittest",
":thumbnail_loader_unittest",
]
+ mocks = [ "$externs_path/file_manager_private.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 2d16ed8d869..422d15d2972 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
@@ -48,6 +48,7 @@ js_type_check("closure_compile_module") {
":list_container",
":location_line",
":multi_menu",
+ ":multi_menu_button",
":progress_center_panel",
":providers_menu",
":search_box",
@@ -138,6 +139,7 @@ js_library("combobutton") {
deps = [
":files_menu",
":multi_menu",
+ ":multi_menu_button",
"//ui/file_manager/file_manager/foreground/elements:files_toggle_ripple",
]
externs_list = [ "//ui/file_manager/externs/paper_elements.js" ]
@@ -277,6 +279,7 @@ js_library("file_manager_ui") {
":list_container",
":location_line",
":multi_menu",
+ ":multi_menu_button",
":progress_center_panel",
":providers_menu",
":search_box",
@@ -427,6 +430,7 @@ js_library("location_line") {
"//ui/file_manager/file_manager/common/js:files_app_entry_types",
"//ui/file_manager/file_manager/common/js:metrics",
"//ui/file_manager/file_manager/common/js:util",
+ "//ui/file_manager/file_manager/foreground/js:path_component",
]
}
@@ -434,6 +438,16 @@ js_library("multi_menu") {
deps = [
"//ui/webui/resources/js:event_tracker",
"//ui/webui/resources/js/cr/ui:menu",
+ "//ui/webui/resources/js/cr/ui:menu_item",
+ "//ui/webui/resources/js/cr/ui:position_util",
+ ]
+ externs_list = [ "$externs_path/pending.js" ]
+}
+
+js_library("multi_menu_button") {
+ deps = [
+ "//ui/webui/resources/js:event_tracker",
+ "//ui/webui/resources/js/cr/ui:menu",
"//ui/webui/resources/js/cr/ui:menu_button",
"//ui/webui/resources/js/cr/ui:menu_item",
"//ui/webui/resources/js/cr/ui:position_util",
@@ -444,6 +458,7 @@ js_library("multi_menu") {
js_unittest("multi_menu_unittest") {
deps = [
":multi_menu",
+ ":multi_menu_button",
"//ui/file_manager/base/js:test_error_reporting",
"//ui/file_manager/file_manager/common/js:util",
"//ui/webui/resources/js:webui_resource_test",
diff --git a/chromium/ui/file_manager/file_manager/test/BUILD.gn b/chromium/ui/file_manager/file_manager/test/BUILD.gn
index f2a23d787d5..7f65381103e 100644
--- a/chromium/ui/file_manager/file_manager/test/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/test/BUILD.gn
@@ -19,7 +19,6 @@ action("create_test_main") {
"//ui/file_manager/file_manager/foreground/js/elements_importer.js",
"//ui/file_manager/file_manager/foreground/js/main_scripts.js",
"//ui/file_manager/file_manager/main.html",
- "//ui/webui/resources/css/text_defaults.css",
"check_select.js",
"crostini_mount.js",
"crostini_share.js",
diff --git a/chromium/ui/file_manager/image_loader/BUILD.gn b/chromium/ui/file_manager/image_loader/BUILD.gn
index 567b2e8d651..072214e21ed 100644
--- a/chromium/ui/file_manager/image_loader/BUILD.gn
+++ b/chromium/ui/file_manager/image_loader/BUILD.gn
@@ -14,9 +14,9 @@ js_type_check("closure_compile_module") {
":image_loader",
":image_loader_client",
":image_loader_util",
+ ":image_request_task",
":load_image_request",
":piex_loader",
- ":request",
":scheduler",
]
}
@@ -39,9 +39,9 @@ js_unittest("cache_unittest") {
js_library("image_loader") {
deps = [
":cache",
+ ":image_request_task",
":load_image_request",
":piex_loader",
- ":request",
":scheduler",
"//ui/file_manager/externs:file_manager_private",
]
@@ -96,7 +96,7 @@ js_library("piex_loader") {
externs_list = [ "//ui/file_manager/externs/platform.js" ]
}
-js_library("request") {
+js_library("image_request_task") {
deps = [
":cache",
":image_loader_util",
@@ -108,7 +108,14 @@ js_library("request") {
}
js_library("scheduler") {
- deps = [ ":request" ]
+ deps = [ ":image_request_task" ]
+}
+
+js_unittest("scheduler_unittest") {
+ deps = [
+ ":scheduler",
+ "//ui/webui/resources/js:webui_resource_test",
+ ]
}
js_test_gen_html("js_test_gen_html") {
@@ -117,6 +124,7 @@ js_test_gen_html("js_test_gen_html") {
":cache_unittest",
":image_loader_client_unittest",
":image_loader_unittest",
+ ":scheduler_unittest",
]
}
diff --git a/chromium/ui/file_manager/integration_tests/BUILD.gn b/chromium/ui/file_manager/integration_tests/BUILD.gn
index 5f56947117e..c294aeea41d 100644
--- a/chromium/ui/file_manager/integration_tests/BUILD.gn
+++ b/chromium/ui/file_manager/integration_tests/BUILD.gn
@@ -26,6 +26,6 @@ js_library("test_util") {
testonly = true
externs_list = [
"$externs_path/chrome_extensions.js",
- "//ui/file_manager/externs/chrome_test.js",
+ "$externs_path/test.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 3110468a322..bad7ab9a689 100644
--- a/chromium/ui/file_manager/integration_tests/file_manager/BUILD.gn
+++ b/chromium/ui/file_manager/integration_tests/file_manager/BUILD.gn
@@ -14,7 +14,40 @@ js_type_check("closure_compile") {
":create_new_folder",
":crostini",
":directory_tree",
+ ":directory_tree_context_menu",
+ ":drive_specific",
":file_dialog",
+ ":file_display",
+ ":file_list",
+ ":files_tooltip",
+ ":folder_shortcuts",
+ ":format_dialog",
+ ":gear_menu",
+ ":grid_view",
+ ":install_linux_package_dialog",
+ ":keyboard_operations",
+ ":launcher_search",
+ ":metadata",
+ ":metrics",
+ ":my_files",
+ ":open_audio_files",
+ ":open_image_files",
+ ":open_video_files",
+ ":providers",
+ ":quick_view",
+ ":recents",
+ ":restore_geometry",
+ ":restore_prefs",
+ ":search",
+ ":share_and_manage_dialog",
+ ":sort_columns",
+ ":suggest_app_dialog",
+ ":tab_index",
+ ":tasks",
+ ":toolbar",
+ ":transfer",
+ ":traverse",
+ ":zip_files",
]
}
@@ -27,11 +60,6 @@ js_library("background") {
]
}
-js_library("file_dialog") {
- testonly = true
- deps = []
-}
-
js_library("breadcrumbs") {
testonly = true
deps = []
@@ -61,3 +89,178 @@ js_library("directory_tree") {
testonly = true
deps = []
}
+
+js_library("directory_tree_context_menu") {
+ testonly = true
+ deps = []
+}
+
+js_library("drive_specific") {
+ testonly = true
+ deps = []
+}
+
+js_library("file_dialog") {
+ testonly = true
+ deps = []
+}
+
+js_library("file_display") {
+ testonly = true
+ deps = []
+}
+
+js_library("file_list") {
+ testonly = true
+ deps = []
+}
+
+js_library("files_tooltip") {
+ testonly = true
+ deps = []
+}
+
+js_library("folder_shortcuts") {
+ testonly = true
+ deps = []
+}
+
+js_library("format_dialog") {
+ testonly = true
+ deps = []
+}
+
+js_library("gear_menu") {
+ testonly = true
+ deps = []
+}
+
+js_library("grid_view") {
+ testonly = true
+ deps = []
+}
+
+js_library("install_linux_package_dialog") {
+ testonly = true
+ deps = []
+}
+
+js_library("keyboard_operations") {
+ testonly = true
+ deps = []
+}
+
+js_library("launcher_search") {
+ testonly = true
+ deps = []
+}
+
+js_library("metadata") {
+ testonly = true
+ deps = []
+}
+
+js_library("metrics") {
+ testonly = true
+ deps = []
+}
+
+js_library("my_files") {
+ testonly = true
+ deps = []
+}
+
+js_library("open_audio_files") {
+ testonly = true
+ deps = []
+}
+
+js_library("open_image_files") {
+ testonly = true
+ deps = []
+}
+
+js_library("open_sniffed_files") {
+ testonly = true
+ deps = []
+}
+
+js_library("open_video_files") {
+ testonly = true
+ deps = []
+}
+
+js_library("providers") {
+ testonly = true
+ deps = []
+}
+
+js_library("quick_view") {
+ testonly = true
+ deps = []
+}
+
+js_library("recents") {
+ testonly = true
+ deps = []
+}
+
+js_library("restore_geometry") {
+ testonly = true
+ deps = []
+}
+
+js_library("restore_prefs") {
+ testonly = true
+ deps = []
+}
+
+js_library("search") {
+ testonly = true
+ deps = []
+}
+
+js_library("share_and_manage_dialog") {
+ testonly = true
+ deps = []
+}
+
+js_library("sort_columns") {
+ testonly = true
+ deps = []
+}
+
+js_library("suggest_app_dialog") {
+ testonly = true
+ deps = []
+}
+
+js_library("tab_index") {
+ testonly = true
+ deps = []
+}
+
+js_library("tasks") {
+ testonly = true
+ deps = []
+}
+
+js_library("toolbar") {
+ testonly = true
+ deps = []
+}
+
+js_library("transfer") {
+ testonly = true
+ deps = []
+}
+
+js_library("traverse") {
+ testonly = true
+ deps = []
+}
+
+js_library("zip_files") {
+ testonly = true
+ deps = []
+}
diff --git a/chromium/ui/gfx/BUILD.gn b/chromium/ui/gfx/BUILD.gn
index 31f3b93e51b..86e50da4cb0 100644
--- a/chromium/ui/gfx/BUILD.gn
+++ b/chromium/ui/gfx/BUILD.gn
@@ -127,6 +127,7 @@ jumbo_component("gfx") {
"shadow_value.h",
"skbitmap_operations.cc",
"skbitmap_operations.h",
+ "swap_result.cc",
"sys_color_change_listener.cc",
"sys_color_change_listener.h",
"text_constants.h",
@@ -170,8 +171,6 @@ jumbo_component("gfx") {
"image/image_skia_util_mac.h",
"image/image_skia_util_mac.mm",
"image/image_util_mac.mm",
- "mac/cocoa_scrollbar_painter.cc",
- "mac/cocoa_scrollbar_painter.h",
"mac/coordinate_conversion.h",
"mac/coordinate_conversion.mm",
"mac/nswindow_frame_controls.h",
diff --git a/chromium/ui/gfx/animation/animation.cc b/chromium/ui/gfx/animation/animation.cc
index b216afb5cf2..0b1d4f22cc5 100644
--- a/chromium/ui/gfx/animation/animation.cc
+++ b/chromium/ui/gfx/animation/animation.cc
@@ -26,8 +26,7 @@ base::Optional<bool> Animation::prefers_reduced_motion_;
Animation::Animation(base::TimeDelta timer_interval)
: timer_interval_(timer_interval),
is_animating_(false),
- delegate_(NULL) {
-}
+ delegate_(nullptr) {}
Animation::~Animation() {
// Don't send out notification from the destructor. Chances are the delegate
diff --git a/chromium/ui/gfx/animation/animation_delegate_notifier.h b/chromium/ui/gfx/animation/animation_delegate_notifier.h
index 6121c7c8d58..7983a70fc39 100644
--- a/chromium/ui/gfx/animation/animation_delegate_notifier.h
+++ b/chromium/ui/gfx/animation/animation_delegate_notifier.h
@@ -5,7 +5,7 @@
#ifndef UI_GFX_ANIMATION_ANIMATION_DELEGATE_NOTIFIER_H_
#define UI_GFX_ANIMATION_ANIMATION_DELEGATE_NOTIFIER_H_
-#include "base/logging.h"
+#include "base/check.h"
#include "ui/gfx/animation/animation_delegate.h"
namespace gfx {
diff --git a/chromium/ui/gfx/break_list.h b/chromium/ui/gfx/break_list.h
index cb3de2b76de..19c947f5afa 100644
--- a/chromium/ui/gfx/break_list.h
+++ b/chromium/ui/gfx/break_list.h
@@ -10,7 +10,7 @@
#include <utility>
#include <vector>
-#include "base/logging.h"
+#include "base/check_op.h"
#include "ui/gfx/range/range.h"
namespace gfx {
diff --git a/chromium/ui/gfx/codec/jpeg_codec.cc b/chromium/ui/gfx/codec/jpeg_codec.cc
index ea7c0dcab69..d1fbdd7f562 100644
--- a/chromium/ui/gfx/codec/jpeg_codec.cc
+++ b/chromium/ui/gfx/codec/jpeg_codec.cc
@@ -7,6 +7,7 @@
#include <setjmp.h>
#include <memory>
+#include <ostream>
#include "base/notreached.h"
#include "third_party/skia/include/core/SkBitmap.h"
diff --git a/chromium/ui/gfx/codec/png_codec.cc b/chromium/ui/gfx/codec/png_codec.cc
index f2176e92024..bcaaaa38f36 100644
--- a/chromium/ui/gfx/codec/png_codec.cc
+++ b/chromium/ui/gfx/codec/png_codec.cc
@@ -8,6 +8,7 @@
#include "base/logging.h"
#include "base/macros.h"
+#include "base/notreached.h"
#include "base/strings/string_util.h"
#include "third_party/libpng/png.h"
#include "third_party/skia/include/core/SkBitmap.h"
@@ -39,13 +40,12 @@ class PngDecoderState {
PngDecoderState(PNGCodec::ColorFormat ofmt, std::vector<unsigned char>* o)
: output_format(ofmt),
output_channels(0),
- bitmap(NULL),
+ bitmap(nullptr),
is_opaque(true),
output(o),
width(0),
height(0),
- done(false) {
- }
+ done(false) {}
// Output is an SkBitmap.
explicit PngDecoderState(SkBitmap* skbitmap)
@@ -53,11 +53,10 @@ class PngDecoderState {
output_channels(0),
bitmap(skbitmap),
is_opaque(true),
- output(NULL),
+ output(nullptr),
width(0),
height(0),
- done(false) {
- }
+ done(false) {}
PNGCodec::ColorFormat output_format;
int output_channels;
diff --git a/chromium/ui/gfx/codec/vector_wstream.h b/chromium/ui/gfx/codec/vector_wstream.h
index 5a20c470e1a..56f9712a6d6 100644
--- a/chromium/ui/gfx/codec/vector_wstream.h
+++ b/chromium/ui/gfx/codec/vector_wstream.h
@@ -9,7 +9,7 @@
#include <vector>
-#include "base/logging.h"
+#include "base/check_op.h"
#include "third_party/skia/include/core/SkStream.h"
namespace gfx {
diff --git a/chromium/ui/gfx/color_palette.h b/chromium/ui/gfx/color_palette.h
index 127ae855d5c..8cdcba3187c 100644
--- a/chromium/ui/gfx/color_palette.h
+++ b/chromium/ui/gfx/color_palette.h
@@ -29,7 +29,7 @@ constexpr SkColor kGoogleBlue900 = SkColorSetRGB(0x17, 0x4E, 0xA6);
constexpr SkColor kGoogleBlueDark400 = SkColorSetRGB(0x6B, 0xA5, 0xED);
constexpr SkColor kGoogleBlueDark600 = SkColorSetRGB(0x25, 0x81, 0xDF);
-constexpr SkColor kGoogleRed050 = SkColorSetRGB(0xFC, 0x8E, 0xE6);
+constexpr SkColor kGoogleRed050 = SkColorSetRGB(0xFC, 0xE8, 0xE6);
constexpr SkColor kGoogleRed100 = SkColorSetRGB(0xFA, 0xD2, 0xCF);
constexpr SkColor kGoogleRed200 = SkColorSetRGB(0xF6, 0xAE, 0xA9);
constexpr SkColor kGoogleRed300 = SkColorSetRGB(0xF2, 0x8B, 0x82);
diff --git a/chromium/ui/gfx/color_space.cc b/chromium/ui/gfx/color_space.cc
index dab693d3d0a..1a4c33cd1b9 100644
--- a/chromium/ui/gfx/color_space.cc
+++ b/chromium/ui/gfx/color_space.cc
@@ -630,7 +630,7 @@ sk_sp<SkColorSpace> ColorSpace::ToSkColorSpace() const {
gamut = SkNamedGamut::kAdobeRGB;
break;
case PrimaryID::SMPTEST432_1:
- gamut = SkNamedGamut::kDCIP3;
+ gamut = SkNamedGamut::kDisplayP3;
break;
case PrimaryID::BT2020:
gamut = SkNamedGamut::kRec2020;
@@ -893,7 +893,7 @@ bool ColorSpace::GetTransferFunction(TransferID transfer,
// software uses the sRGB transfer function.
// * User studies shows that users don't really care.
// * Apple's CoreVideo uses gamma=1.961.
- // Bearing all of that in mind, use the same transfer funciton as sRGB,
+ // Bearing all of that in mind, use the same transfer function as sRGB,
// which will allow more optimization, and will more closely match other
// media players.
case ColorSpace::TransferID::IEC61966_2_1:
@@ -908,8 +908,7 @@ bool ColorSpace::GetTransferFunction(TransferID transfer,
fn->g = 1.961000000000f;
return true;
case ColorSpace::TransferID::SMPTEST428_1:
- fn->a = 0.225615407568f;
- fn->e = -1.091041666667f;
+ fn->a = 1.034080527699f; // (52.37 / 48.0) ^ (1.0 / 2.6) per ITU-T H.273.
fn->g = 2.600000000000f;
return true;
case ColorSpace::TransferID::IEC61966_2_4:
@@ -1021,9 +1020,9 @@ void ColorSpace::GetTransferMatrix(SkMatrix44* matrix) const {
case ColorSpace::MatrixID::YCOCG: {
float data[16] = {
- 0.25f, 0.5f, 0.25f, 0.5f, // Y
+ 0.25f, 0.5f, 0.25f, 0.0f, // Y
-0.25f, 0.5f, -0.25f, 0.5f, // Cg
- 0.5f, 0.0f, -0.5f, 0.0f, // Co
+ 0.5f, 0.0f, -0.5f, 0.5f, // Co
0.0f, 0.0f, 0.0f, 1.0f
};
matrix->setRowMajorf(data);
@@ -1081,7 +1080,8 @@ void ColorSpace::GetTransferMatrix(SkMatrix44* matrix) const {
matrix->setRowMajorf(data);
}
-void ColorSpace::GetRangeAdjustMatrix(SkMatrix44* matrix) const {
+void ColorSpace::GetRangeAdjustMatrix(int bit_depth, SkMatrix44* matrix) const {
+ DCHECK_GE(bit_depth, 8);
switch (range_) {
case RangeID::FULL:
case RangeID::INVALID:
@@ -1093,33 +1093,21 @@ void ColorSpace::GetRangeAdjustMatrix(SkMatrix44* matrix) const {
break;
}
- // Note: The values below assume an 8-bit range and aren't entirely correct
- // for higher bit depths. They are close enough though (with a relative error
- // of ~2.9% for 10-bit and ~3.7% for 12-bit) that it's not worth adding a
- // |bit_depth| field to gfx::ColorSpace yet.
- //
- // The limited ranges are [64,940] and [256, 3760] for 10 and 12 bit content
- // respectively. So the final values end up being:
- //
- // 16 / 255 = 0.06274509803921569
- // 64 / 1023 = 0.06256109481915934
- // 256 / 4095 = 0.06251526251526252
- //
- // 235 / 255 = 0.9215686274509803
- // 940 / 1023 = 0.9188660801564027
- // 3760 / 4095 = 0.9181929181929182
- //
- // Relative error (same for min/max):
- // 10 bit: abs(16/235 - 64/1023)/(64/1023) = 0.0029411764705882222
- // 12 bit: abs(16/235 - 256/4095)/(256/4095) = 0.003676470588235281
+ // See ITU-T H.273 (2016), Section 8.3. The following is derived from
+ // Equations 20-31.
+ const int shift = bit_depth - 8;
+ const float a_y = 219 << shift;
+ const float c = (1 << bit_depth) - 1;
+ const float scale_y = c / a_y;
switch (matrix_) {
case MatrixID::RGB:
case MatrixID::GBR:
case MatrixID::INVALID:
- case MatrixID::YCOCG:
- matrix->setScale(255.0f/219.0f, 255.0f/219.0f, 255.0f/219.0f);
- matrix->postTranslate(-16.0f/219.0f, -16.0f/219.0f, -16.0f/219.0f);
+ case MatrixID::YCOCG: {
+ matrix->setScale(scale_y, scale_y, scale_y);
+ matrix->postTranslate(-16.0f / 219.0f, -16.0f / 219.0f, -16.0f / 219.0f);
break;
+ }
case MatrixID::BT709:
case MatrixID::FCC:
@@ -1128,18 +1116,23 @@ void ColorSpace::GetRangeAdjustMatrix(SkMatrix44* matrix) const {
case MatrixID::SMPTE240M:
case MatrixID::BT2020_NCL:
case MatrixID::BT2020_CL:
- case MatrixID::YDZDX:
- matrix->setScale(255.0f/219.0f, 255.0f/224.0f, 255.0f/224.0f);
- matrix->postTranslate(-16.0f/219.0f, -15.5f/224.0f, -15.5f/224.0f);
+ case MatrixID::YDZDX: {
+ const float a_uv = 224 << shift;
+ const float scale_uv = c / a_uv;
+ const float translate_uv = (a_uv - c) / (2.0f * a_uv);
+ matrix->setScale(scale_y, scale_uv, scale_uv);
+ matrix->postTranslate(-16.0f / 219.0f, translate_uv, translate_uv);
break;
+ }
}
}
bool ColorSpace::ToSkYUVColorSpace(SkYUVColorSpace* out) const {
if (range_ == RangeID::FULL) {
- // TODO(dalecurtis): This is probably not right for BT.2020.
- *out = kJPEG_SkYUVColorSpace;
- return true;
+ if (matrix_ == MatrixID::BT470BG || matrix_ == MatrixID::SMPTE170M) {
+ *out = kJPEG_SkYUVColorSpace;
+ return true;
+ }
}
switch (matrix_) {
case MatrixID::BT709:
@@ -1148,7 +1141,6 @@ bool ColorSpace::ToSkYUVColorSpace(SkYUVColorSpace* out) const {
case MatrixID::BT470BG:
case MatrixID::SMPTE170M:
- case MatrixID::SMPTE240M:
*out = kRec601_SkYUVColorSpace;
return true;
diff --git a/chromium/ui/gfx/color_space.h b/chromium/ui/gfx/color_space.h
index 6c123f494e8..425f88769c2 100644
--- a/chromium/ui/gfx/color_space.h
+++ b/chromium/ui/gfx/color_space.h
@@ -305,7 +305,35 @@ class COLOR_SPACE_EXPORT ColorSpace {
// For most formats, this is the RGB to YUV matrix.
void GetTransferMatrix(SkMatrix44* matrix) const;
- void GetRangeAdjustMatrix(SkMatrix44* matrix) const;
+
+ // Returns the range adjust matrix that converts from |range_| to full range
+ // for |bit_depth|.
+ void GetRangeAdjustMatrix(int bit_depth, SkMatrix44* matrix) const;
+
+ // Returns the range adjust matrix that converts from |range_| to full range
+ // for bit depth 8.
+ //
+ // WARNING: The returned matrix assumes an 8-bit range and isn't entirely
+ // correct for higher bit depths, with a relative error of ~2.9% for 10-bit
+ // and ~3.7% for 12-bit. Use the above GetRangeAdjustMatrix() method instead.
+ //
+ // The limited ranges are [64,940] and [256, 3760] for 10 and 12 bit content
+ // respectively. So the final values end up being:
+ //
+ // 16 / 255 = 0.06274509803921569
+ // 64 / 1023 = 0.06256109481915934
+ // 256 / 4095 = 0.06251526251526252
+ //
+ // 235 / 255 = 0.9215686274509803
+ // 940 / 1023 = 0.9188660801564027
+ // 3760 / 4095 = 0.9181929181929182
+ //
+ // Relative error (same for min/max):
+ // 10 bit: abs(16/235 - 64/1023)/(64/1023) = 0.0029411764705882222
+ // 12 bit: abs(16/235 - 256/4095)/(256/4095) = 0.003676470588235281
+ void GetRangeAdjustMatrix(SkMatrix44* matrix) const {
+ GetRangeAdjustMatrix(kDefaultBitDepth, matrix);
+ }
// Returns the current primary ID.
// Note: if SetCustomPrimaries() has been used, the primary ID returned
@@ -327,6 +355,9 @@ class COLOR_SPACE_EXPORT ColorSpace {
bool HasExtendedSkTransferFn() const;
private:
+ // The default bit depth assumed by GetRangeAdjustMatrix().
+ static constexpr int kDefaultBitDepth = 8;
+
static void GetPrimaryMatrix(PrimaryID, skcms_Matrix3x3* to_XYZD50);
static bool GetTransferFunction(TransferID, skcms_TransferFunction* fn);
static size_t TransferParamCount(TransferID);
diff --git a/chromium/ui/gfx/color_space_unittest.cc b/chromium/ui/gfx/color_space_unittest.cc
index b73880861bc..b790f8f834d 100644
--- a/chromium/ui/gfx/color_space_unittest.cc
+++ b/chromium/ui/gfx/color_space_unittest.cc
@@ -81,6 +81,104 @@ TEST(ColorSpace, RGBToYUV) {
}
}
+TEST(ColorSpace, RangeAdjust) {
+ const size_t kNumTestYUVs = 2;
+ SkVector4 test_yuvs[kNumTestYUVs] = {
+ SkVector4(1.f, 1.f, 1.f, 1.f),
+ SkVector4(0.f, 0.f, 0.f, 1.f),
+ };
+
+ const size_t kNumBitDepths = 3;
+ int bit_depths[kNumBitDepths] = {8, 10, 12};
+
+ const size_t kNumColorSpaces = 3;
+ ColorSpace color_spaces[kNumColorSpaces] = {
+ ColorSpace::CreateREC601(),
+ ColorSpace::CreateJpeg(),
+ ColorSpace(ColorSpace::PrimaryID::INVALID,
+ ColorSpace::TransferID::INVALID, ColorSpace::MatrixID::YCOCG,
+ ColorSpace::RangeID::LIMITED),
+ };
+
+ SkVector4 expected_yuvs[kNumColorSpaces][kNumBitDepths][kNumTestYUVs] = {
+ // REC601
+ {
+ // 8bpc
+ {
+ SkVector4(235.f / 255.f, 239.5f / 255.f, 239.5f / 255.f, 1.0000f),
+ SkVector4(16.f / 255.f, 15.5f / 255.f, 15.5f / 255.f, 1.0000f),
+ },
+ // 10bpc
+ {
+ SkVector4(940.f / 1023.f, 959.5f / 1023.f, 959.5f / 1023.f,
+ 1.0000f),
+ SkVector4(64.f / 1023.f, 63.5f / 1023.f, 63.5f / 1023.f, 1.0000f),
+ },
+ // 12bpc
+ {
+ SkVector4(3760.f / 4095.f, 3839.5f / 4095.f, 3839.5f / 4095.f,
+ 1.0000f),
+ SkVector4(256.f / 4095.f, 255.5f / 4095.f, 255.5f / 4095.f,
+ 1.0000f),
+ },
+ },
+ // Jpeg
+ {
+ // 8bpc
+ {
+ SkVector4(1.0000f, 1.0000f, 1.0000f, 1.0000f),
+ SkVector4(0.0000f, 0.0000f, 0.0000f, 1.0000f),
+ },
+ // 10bpc
+ {
+ SkVector4(1.0000f, 1.0000f, 1.0000f, 1.0000f),
+ SkVector4(0.0000f, 0.0000f, 0.0000f, 1.0000f),
+ },
+ // 12bpc
+ {
+ SkVector4(1.0000f, 1.0000f, 1.0000f, 1.0000f),
+ SkVector4(0.0000f, 0.0000f, 0.0000f, 1.0000f),
+ },
+ },
+ // YCoCg
+ {
+ // 8bpc
+ {
+ SkVector4(235.f / 255.f, 235.f / 255.f, 235.f / 255.f, 1.0000f),
+ SkVector4(16.f / 255.f, 16.f / 255.f, 16.f / 255.f, 1.0000f),
+ },
+ // 10bpc
+ {
+ SkVector4(940.f / 1023.f, 940.f / 1023.f, 940.f / 1023.f,
+ 1.0000f),
+ SkVector4(64.f / 1023.f, 64.f / 1023.f, 64.f / 1023.f, 1.0000f),
+ },
+ // 12bpc
+ {
+ SkVector4(3760.f / 4095.f, 3760.f / 4095.f, 3760.f / 4095.f,
+ 1.0000f),
+ SkVector4(256.f / 4095.f, 256.f / 4095.f, 256.f / 4095.f,
+ 1.0000f),
+ },
+ },
+ };
+
+ for (size_t i = 0; i < kNumColorSpaces; ++i) {
+ for (size_t j = 0; j < kNumBitDepths; ++j) {
+ SkMatrix44 range_adjust;
+ color_spaces[i].GetRangeAdjustMatrix(bit_depths[j], &range_adjust);
+
+ SkMatrix44 range_adjust_inv;
+ range_adjust.invert(&range_adjust_inv);
+
+ for (size_t k = 0; k < kNumTestYUVs; ++k) {
+ SkVector4 yuv = range_adjust_inv * test_yuvs[k];
+ EXPECT_LT(Diff(yuv, expected_yuvs[i][j][k]), kEpsilon);
+ }
+ }
+ }
+}
+
TEST(ColorSpace, RasterAndBlend) {
ColorSpace display_color_space;
@@ -120,7 +218,8 @@ TEST(ColorSpace, ConversionToAndFromSkColorSpace) {
sk_sp<SkColorSpace> sk_color_spaces[kNumTests] = {
SkColorSpace::MakeSRGB(),
SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kAdobeRGB),
- SkColorSpace::MakeRGB(SkNamedTransferFn::kLinear, SkNamedGamut::kDCIP3),
+ SkColorSpace::MakeRGB(SkNamedTransferFn::kLinear,
+ SkNamedGamut::kDisplayP3),
SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kRec2020),
SkColorSpace::MakeRGB(transfer_fn, primary_matrix),
};
diff --git a/chromium/ui/gfx/color_transform.cc b/chromium/ui/gfx/color_transform.cc
index c99c4b506cb..981d2f8386b 100644
--- a/chromium/ui/gfx/color_transform.cc
+++ b/chromium/ui/gfx/color_transform.cc
@@ -12,6 +12,7 @@
#include <utility>
#include "base/logging.h"
+#include "base/notreached.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/third_party/skcms/skcms.h"
#include "ui/gfx/color_space.h"
@@ -170,9 +171,10 @@ Transform GetTransferMatrix(const gfx::ColorSpace& color_space) {
return Transform(transfer_matrix);
}
-Transform GetRangeAdjustMatrix(const gfx::ColorSpace& color_space) {
+Transform GetRangeAdjustMatrix(const gfx::ColorSpace& color_space,
+ int bit_depth) {
SkMatrix44 range_adjust_matrix;
- color_space.GetRangeAdjustMatrix(&range_adjust_matrix);
+ color_space.GetRangeAdjustMatrix(bit_depth, &range_adjust_matrix);
return Transform(range_adjust_matrix);
}
@@ -224,7 +226,9 @@ class ColorTransformStep {
class ColorTransformInternal : public ColorTransform {
public:
ColorTransformInternal(const ColorSpace& src,
+ int src_bit_depth,
const ColorSpace& dst,
+ int dst_bit_depth,
Intent intent);
~ColorTransformInternal() override;
@@ -243,7 +247,9 @@ class ColorTransformInternal : public ColorTransform {
private:
void AppendColorSpaceToColorSpaceTransform(const ColorSpace& src,
- const ColorSpace& dst);
+ int src_bit_depth,
+ const ColorSpace& dst,
+ int dst_bit_depth);
void Simplify();
std::list<std::unique_ptr<ColorTransformStep>> steps_;
@@ -891,9 +897,11 @@ class ColorTransformFromBT2020CL : public ColorTransformStep {
void ColorTransformInternal::AppendColorSpaceToColorSpaceTransform(
const ColorSpace& src,
- const ColorSpace& dst) {
- steps_.push_back(
- std::make_unique<ColorTransformMatrix>(GetRangeAdjustMatrix(src)));
+ int src_bit_depth,
+ const ColorSpace& dst,
+ int dst_bit_depth) {
+ steps_.push_back(std::make_unique<ColorTransformMatrix>(
+ GetRangeAdjustMatrix(src, src_bit_depth)));
if (src.GetMatrixID() == ColorSpace::MatrixID::BT2020_CL) {
// BT2020 CL is a special case.
@@ -972,18 +980,21 @@ void ColorTransformInternal::AppendColorSpaceToColorSpaceTransform(
}
steps_.push_back(std::make_unique<ColorTransformMatrix>(
- Invert(GetRangeAdjustMatrix(dst))));
+ Invert(GetRangeAdjustMatrix(dst, dst_bit_depth))));
}
ColorTransformInternal::ColorTransformInternal(const ColorSpace& src,
+ int src_bit_depth,
const ColorSpace& dst,
+ int dst_bit_depth,
Intent intent)
: src_(src), dst_(dst) {
// If no source color space is specified, do no transformation.
// TODO(ccameron): We may want dst assume sRGB at some point in the future.
if (!src_.IsValid())
return;
- AppendColorSpaceToColorSpaceTransform(src_, dst_);
+ AppendColorSpaceToColorSpaceTransform(src_, src_bit_depth, dst_,
+ dst_bit_depth);
if (intent != Intent::TEST_NO_OPT)
Simplify();
}
@@ -1046,10 +1057,12 @@ void ColorTransformInternal::Simplify() {
// static
std::unique_ptr<ColorTransform> ColorTransform::NewColorTransform(
const ColorSpace& src,
+ int src_bit_depth,
const ColorSpace& dst,
+ int dst_bit_depth,
Intent intent) {
- return std::unique_ptr<ColorTransform>(
- new ColorTransformInternal(src, dst, intent));
+ return std::make_unique<ColorTransformInternal>(src, src_bit_depth, dst,
+ dst_bit_depth, intent);
}
ColorTransform::ColorTransform() {}
diff --git a/chromium/ui/gfx/color_transform.h b/chromium/ui/gfx/color_transform.h
index db7d75d8335..2ed1da72d41 100644
--- a/chromium/ui/gfx/color_transform.h
+++ b/chromium/ui/gfx/color_transform.h
@@ -44,12 +44,33 @@ class GFX_EXPORT ColorTransform {
virtual size_t NumberOfStepsForTesting() const = 0;
+ // Two special cases:
+ // 1. If no source color space is specified (i.e., src.IsValid() is false), do
+ // no transformation.
+ // 2. If the target color space is not defined (i.e., dst.IsValid() is false),
+ // just apply the range adjust and inverse transfer matrices. This can be used
+ // for YUV to RGB color conversion.
static std::unique_ptr<ColorTransform> NewColorTransform(
- const ColorSpace& from,
- const ColorSpace& to,
+ const ColorSpace& src,
+ int src_bit_depth,
+ const ColorSpace& dst,
+ int dst_bit_depth,
Intent intent);
+ // Assumes bit depth 8. For higher bit depths, use above NewColorTransform()
+ // method instead.
+ static std::unique_ptr<ColorTransform> NewColorTransform(
+ const ColorSpace& src,
+ const ColorSpace& dst,
+ Intent intent) {
+ return NewColorTransform(src, kDefaultBitDepth, dst, kDefaultBitDepth,
+ intent);
+ }
+
private:
+ // The default bit depth assumed by NewColorTransform().
+ static constexpr int kDefaultBitDepth = 8;
+
DISALLOW_COPY_AND_ASSIGN(ColorTransform);
};
diff --git a/chromium/ui/gfx/color_transform_fuzzer.cc b/chromium/ui/gfx/color_transform_fuzzer.cc
index aa26e79d2a0..8f4011804b4 100644
--- a/chromium/ui/gfx/color_transform_fuzzer.cc
+++ b/chromium/ui/gfx/color_transform_fuzzer.cc
@@ -7,6 +7,7 @@
#include <random>
#include "base/at_exit.h"
+#include "base/logging.h"
#include "ui/gfx/color_space.h"
#include "ui/gfx/color_transform.h"
#include "ui/gfx/icc_profile.h"
diff --git a/chromium/ui/gfx/color_transform_unittest.cc b/chromium/ui/gfx/color_transform_unittest.cc
index 314a8768709..372c3ca1c03 100644
--- a/chromium/ui/gfx/color_transform_unittest.cc
+++ b/chromium/ui/gfx/color_transform_unittest.cc
@@ -40,6 +40,7 @@ ColorSpace::TransferID simple_transfers[] = {
ColorSpace::TransferID::GAMMA28,
ColorSpace::TransferID::SMPTE170M,
ColorSpace::TransferID::SMPTE240M,
+ ColorSpace::TransferID::SMPTEST428_1,
ColorSpace::TransferID::LINEAR,
ColorSpace::TransferID::LOG,
ColorSpace::TransferID::LOG_SQRT,
@@ -53,29 +54,16 @@ ColorSpace::TransferID simple_transfers[] = {
ColorSpace::TransferID::IEC61966_2_1_HDR,
};
-// This one is weird as the non-linear numbers are not between 0 and 1.
-ColorSpace::TransferID noninvertible_transfers[] = {
- ColorSpace::TransferID::SMPTEST428_1,
-};
-
ColorSpace::TransferID extended_transfers[] = {
ColorSpace::TransferID::LINEAR_HDR,
ColorSpace::TransferID::IEC61966_2_1_HDR,
};
ColorSpace::MatrixID all_matrices[] = {
- ColorSpace::MatrixID::RGB,
- ColorSpace::MatrixID::BT709,
- ColorSpace::MatrixID::FCC,
- ColorSpace::MatrixID::BT470BG,
- ColorSpace::MatrixID::SMPTE170M,
- ColorSpace::MatrixID::SMPTE240M,
-
- // YCOCG produces lots of negative values which isn't compatible with many
- // transfer functions.
- // TODO(hubbe): Test this separately.
- // ColorSpace::MatrixID::YCOCG,
- ColorSpace::MatrixID::BT2020_NCL,
+ ColorSpace::MatrixID::RGB, ColorSpace::MatrixID::BT709,
+ ColorSpace::MatrixID::FCC, ColorSpace::MatrixID::BT470BG,
+ ColorSpace::MatrixID::SMPTE170M, ColorSpace::MatrixID::SMPTE240M,
+ ColorSpace::MatrixID::YCOCG, ColorSpace::MatrixID::BT2020_NCL,
ColorSpace::MatrixID::YDZDX,
};
@@ -388,6 +376,12 @@ TEST(SimpleColorSpace, ToUndefined) {
ColorTransform::NewColorTransform(
video, null, ColorTransform::Intent::INTENT_PERCEPTUAL));
EXPECT_EQ(video_to_null->NumberOfStepsForTesting(), 1u);
+ // Without optimization, video should have 2 steps: limited range to full
+ // range, and YUV to RGB.
+ std::unique_ptr<ColorTransform> video_to_null_no_opt(
+ ColorTransform::NewColorTransform(video, null,
+ ColorTransform::Intent::TEST_NO_OPT));
+ EXPECT_EQ(video_to_null_no_opt->NumberOfStepsForTesting(), 2u);
// Test with an ICC profile that can't be represented as matrix+transfer.
ColorSpace luttrcicc = ICCProfileForTestingNoAnalyticTrFn().GetColorSpace();
@@ -412,15 +406,15 @@ TEST(SimpleColorSpace, ToUndefined) {
EXPECT_GT(adobeicc_to_nonnull->NumberOfStepsForTesting(), 0u);
// And with something analytic.
- ColorSpace srgb = gfx::ColorSpace::CreateXYZD50();
- std::unique_ptr<ColorTransform> srgb_to_null(
+ ColorSpace xyzd50 = gfx::ColorSpace::CreateXYZD50();
+ std::unique_ptr<ColorTransform> xyzd50_to_null(
ColorTransform::NewColorTransform(
- srgb, null, ColorTransform::Intent::INTENT_PERCEPTUAL));
- EXPECT_EQ(srgb_to_null->NumberOfStepsForTesting(), 0u);
- std::unique_ptr<ColorTransform> srgb_to_nonnull(
+ xyzd50, null, ColorTransform::Intent::INTENT_PERCEPTUAL));
+ EXPECT_EQ(xyzd50_to_null->NumberOfStepsForTesting(), 0u);
+ std::unique_ptr<ColorTransform> xyzd50_to_nonnull(
ColorTransform::NewColorTransform(
- srgb, nonnull, ColorTransform::Intent::INTENT_PERCEPTUAL));
- EXPECT_GT(srgb_to_nonnull->NumberOfStepsForTesting(), 0u);
+ xyzd50, nonnull, ColorTransform::Intent::INTENT_PERCEPTUAL));
+ EXPECT_GT(xyzd50_to_nonnull->NumberOfStepsForTesting(), 0u);
}
TEST(SimpleColorSpace, DefaultToSRGB) {
@@ -572,35 +566,6 @@ INSTANTIATE_TEST_SUITE_P(ColorSpace,
TransferTest,
testing::ValuesIn(simple_transfers));
-class NonInvertibleTransferTest
- : public testing::TestWithParam<ColorSpace::TransferID> {};
-
-TEST_P(NonInvertibleTransferTest, basicTest) {
- gfx::ColorSpace space_with_transfer(ColorSpace::PrimaryID::BT709, GetParam(),
- ColorSpace::MatrixID::RGB,
- ColorSpace::RangeID::FULL);
- gfx::ColorSpace space_linear(
- ColorSpace::PrimaryID::BT709, ColorSpace::TransferID::LINEAR,
- ColorSpace::MatrixID::RGB, ColorSpace::RangeID::FULL);
-
- std::unique_ptr<ColorTransform> to_linear(ColorTransform::NewColorTransform(
- space_with_transfer, space_linear,
- ColorTransform::Intent::INTENT_ABSOLUTE));
-
- std::unique_ptr<ColorTransform> from_linear(ColorTransform::NewColorTransform(
- space_linear, space_with_transfer,
- ColorTransform::Intent::INTENT_ABSOLUTE));
-
- // These transforms should not crash when created or applied.
- float x = 0.5;
- ColorTransform::TriStim tristim(x, x, x);
- to_linear->Transform(&tristim, 1);
- from_linear->Transform(&tristim, 1);
-}
-
-INSTANTIATE_TEST_SUITE_P(ColorSpace,
- NonInvertibleTransferTest,
- testing::ValuesIn(noninvertible_transfers));
class ExtendedTransferTest
: public testing::TestWithParam<ColorSpace::TransferID> {};
diff --git a/chromium/ui/gfx/geometry/matrix3_f.h b/chromium/ui/gfx/geometry/matrix3_f.h
index fea4852cf74..0b5cc128466 100644
--- a/chromium/ui/gfx/geometry/matrix3_f.h
+++ b/chromium/ui/gfx/geometry/matrix3_f.h
@@ -5,7 +5,7 @@
#ifndef UI_GFX_GEOMETRY_MATRIX3_F_H_
#define UI_GFX_GEOMETRY_MATRIX3_F_H_
-#include "base/logging.h"
+#include "base/check.h"
#include "ui/gfx/geometry/vector3d_f.h"
namespace gfx {
diff --git a/chromium/ui/gfx/geometry/mojom/geometry.mojom b/chromium/ui/gfx/geometry/mojom/geometry.mojom
index 78d28f07773..82218aef7f6 100644
--- a/chromium/ui/gfx/geometry/mojom/geometry.mojom
+++ b/chromium/ui/gfx/geometry/mojom/geometry.mojom
@@ -4,18 +4,13 @@
module gfx.mojom;
-// Don't make backwards-incompatible changes to this definition!
-// It's used in PageState serialization, so backwards incompatible changes
-// would cause stored PageState objects to be un-parseable.
+[Stable]
struct Point {
int32 x;
int32 y;
};
-// Don't make backwards-incompatible changes to this definition!
-// It's used in PageState serialization, so backwards incompatible changes
-// would cause stored PageState objects to be un-parseable. Please contact the
-// page state serialization owners before making such a change.
+[Stable]
struct PointF {
float x;
float y;
diff --git a/chromium/ui/gfx/geometry/quad_f.h b/chromium/ui/gfx/geometry/quad_f.h
index 00ade0e3749..3fe8cf10d5d 100644
--- a/chromium/ui/gfx/geometry/quad_f.h
+++ b/chromium/ui/gfx/geometry/quad_f.h
@@ -12,7 +12,7 @@
#include <iosfwd>
#include <string>
-#include "base/logging.h"
+#include "base/check_op.h"
#include "ui/gfx/geometry/geometry_export.h"
#include "ui/gfx/geometry/point_f.h"
#include "ui/gfx/geometry/rect_f.h"
diff --git a/chromium/ui/gfx/geometry/rect.h b/chromium/ui/gfx/geometry/rect.h
index 7fa7045f6f4..3ec89df0d47 100644
--- a/chromium/ui/gfx/geometry/rect.h
+++ b/chromium/ui/gfx/geometry/rect.h
@@ -16,7 +16,7 @@
#include <iosfwd>
#include <string>
-#include "base/logging.h"
+#include "base/check.h"
#include "build/build_config.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/safe_integer_conversions.h"
diff --git a/chromium/ui/gfx/gpu_fence.cc b/chromium/ui/gfx/gpu_fence.cc
index 7d38c0eb906..87fc6d10761 100644
--- a/chromium/ui/gfx/gpu_fence.cc
+++ b/chromium/ui/gfx/gpu_fence.cc
@@ -5,6 +5,8 @@
#include "ui/gfx/gpu_fence.h"
#include "base/logging.h"
+#include "base/notreached.h"
+#include "base/time/time.h"
#if defined(OS_LINUX) || defined(OS_ANDROID)
#include <sync/sync.h>
@@ -73,4 +75,49 @@ void GpuFence::Wait() {
}
}
+// static
+GpuFence::FenceStatus GpuFence::GetStatusChangeTime(int fd,
+ base::TimeTicks* time) {
+ DCHECK_NE(fd, -1);
+#if defined(OS_LINUX) || defined(OS_ANDROID)
+ auto info =
+ std::unique_ptr<sync_fence_info_data, void (*)(sync_fence_info_data*)>{
+ sync_fence_info(fd), sync_fence_info_free};
+ if (!info) {
+ LOG(ERROR) << "sync_fence_info returned null for fd : " << fd;
+ return FenceStatus::kInvalid;
+ }
+
+ // Not signalled yet.
+ if (info->status != 1) {
+ return FenceStatus::kNotSignaled;
+ }
+
+ uint64_t timestamp_ns = 0u;
+ struct sync_pt_info* pt_info = nullptr;
+ while ((pt_info = sync_pt_info(info.get(), pt_info)))
+ timestamp_ns = std::max(timestamp_ns, pt_info->timestamp_ns);
+
+ if (timestamp_ns == 0u) {
+ LOG(ERROR) << "No timestamp provided from sync_pt_info for fd : " << fd;
+ return FenceStatus::kInvalid;
+ }
+ *time = base::TimeTicks() + base::TimeDelta::FromNanoseconds(timestamp_ns);
+ return FenceStatus::kSignaled;
+#endif
+ NOTREACHED();
+ return FenceStatus::kInvalid;
+}
+
+base::TimeTicks GpuFence::GetMaxTimestamp() const {
+ base::TimeTicks timestamp;
+#if defined(OS_LINUX) || defined(OS_ANDROID)
+ FenceStatus status = GetStatusChangeTime(owned_fd_.get(), &timestamp);
+ DCHECK_EQ(status, FenceStatus::kSignaled);
+ return timestamp;
+#endif
+ NOTREACHED();
+ return timestamp;
+}
+
} // namespace gfx
diff --git a/chromium/ui/gfx/gpu_fence.h b/chromium/ui/gfx/gpu_fence.h
index de4e81fea29..2d2a24be612 100644
--- a/chromium/ui/gfx/gpu_fence.h
+++ b/chromium/ui/gfx/gpu_fence.h
@@ -12,6 +12,10 @@
extern "C" typedef struct _ClientGpuFence* ClientGpuFence;
+namespace base {
+class TimeTicks;
+} // namespace base
+
namespace gfx {
// GpuFence objects own a GpuFenceHandle and release the resources in it when
@@ -35,6 +39,11 @@ class GFX_EXPORT GpuFence {
// Wait for the GpuFence to become ready.
void Wait();
+ enum FenceStatus { kSignaled, kNotSignaled, kInvalid };
+ static FenceStatus GetStatusChangeTime(int fd, base::TimeTicks* time);
+
+ base::TimeTicks GetMaxTimestamp() const;
+
private:
gfx::GpuFenceHandleType type_;
#if defined(OS_POSIX)
diff --git a/chromium/ui/gfx/image/image_generic.cc b/chromium/ui/gfx/image/image_generic.cc
index d7606e1d8cd..3115fecfb8d 100644
--- a/chromium/ui/gfx/image/image_generic.cc
+++ b/chromium/ui/gfx/image/image_generic.cc
@@ -8,6 +8,7 @@
#include <set>
#include <utility>
+#include "base/logging.h"
#include "ui/gfx/codec/png_codec.h"
#include "ui/gfx/image/image_skia_source.h"
diff --git a/chromium/ui/gfx/image/image_util.cc b/chromium/ui/gfx/image/image_util.cc
index d21fb445716..0b6cacfca49 100644
--- a/chromium/ui/gfx/image/image_util.cc
+++ b/chromium/ui/gfx/image/image_util.cc
@@ -85,9 +85,15 @@ Image ResizedImageForSearchByImageSkiaRepresentation(const Image& image) {
if (bitmap.height() * bitmap.width() > kSearchByImageMaxImageArea &&
(bitmap.width() > kSearchByImageMaxImageWidth ||
bitmap.height() > kSearchByImageMaxImageHeight)) {
+ double scale = std::min(
+ static_cast<double>(kSearchByImageMaxImageWidth) / bitmap.width(),
+ static_cast<double>(kSearchByImageMaxImageHeight) / bitmap.height());
+ int width = base::ClampToRange<int>(scale * bitmap.width(), 1,
+ kSearchByImageMaxImageWidth);
+ int height = base::ClampToRange<int>(scale * bitmap.height(), 1,
+ kSearchByImageMaxImageHeight);
SkBitmap new_bitmap = skia::ImageOperations::Resize(
- bitmap, skia::ImageOperations::RESIZE_GOOD, kSearchByImageMaxImageWidth,
- kSearchByImageMaxImageHeight);
+ bitmap, skia::ImageOperations::RESIZE_GOOD, width, height);
return Image(ImageSkia(ImageSkiaRep(new_bitmap, 0.0f)));
}
diff --git a/chromium/ui/gfx/image/image_util_unittest.cc b/chromium/ui/gfx/image/image_util_unittest.cc
index 40efde273aa..0ef65fdbb81 100644
--- a/chromium/ui/gfx/image/image_util_unittest.cc
+++ b/chromium/ui/gfx/image/image_util_unittest.cc
@@ -139,10 +139,21 @@ TEST(ImageUtilTest, ResizedImageForSearchByImage) {
// Make sure the image large enough to let ResizedImageForSearchByImage to
// resize the image.
gfx::Image original_image =
- gfx::test::CreateImage(gfx::kSearchByImageMaxImageHeight + 10,
- gfx::kSearchByImageMaxImageWidth + 10);
+ gfx::test::CreateImage(gfx::kSearchByImageMaxImageWidth * 2,
+ gfx::kSearchByImageMaxImageHeight * 2);
gfx::Image resized_image = gfx::ResizedImageForSearchByImage(original_image);
- EXPECT_NE(original_image.Size(), resized_image.Size());
EXPECT_FALSE(resized_image.IsEmpty());
+ EXPECT_EQ(resized_image.Width(), gfx::kSearchByImageMaxImageWidth);
+ EXPECT_EQ(resized_image.Height(), gfx::kSearchByImageMaxImageHeight);
+}
+
+TEST(ImageUtilTest, ResizedImageForSearchByImageShouldKeepRatio) {
+ // Make sure the image large enough to let ResizedImageForSearchByImage to
+ // resize the image.
+ gfx::Image original_image = gfx::test::CreateImage(600, 600);
+
+ gfx::Image resized_image = gfx::ResizedImageForSearchByImage(original_image);
+ EXPECT_EQ(resized_image.Width(), 400);
+ EXPECT_EQ(resized_image.Height(), 400);
}
diff --git a/chromium/ui/gfx/linux/client_native_pixmap_dmabuf.cc b/chromium/ui/gfx/linux/client_native_pixmap_dmabuf.cc
index 88c16776abd..ed404cd52f8 100644
--- a/chromium/ui/gfx/linux/client_native_pixmap_dmabuf.cc
+++ b/chromium/ui/gfx/linux/client_native_pixmap_dmabuf.cc
@@ -14,6 +14,7 @@
#include <utility>
#include "base/command_line.h"
+#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/numerics/safe_conversions.h"
#include "base/posix/eintr_wrapper.h"
@@ -102,6 +103,20 @@ bool ClientNativePixmapDmaBuf::IsConfigurationSupported(
}
#endif
+ bool disable_yuv_biplanar = true;
+#if defined(OS_CHROMEOS)
+ // IsConfigurationSupported(SCANOUT_CPU_READ_WRITE) is used by the renderer
+ // to tell whether the platform supports sampling a given format. Zero-copy
+ // video capture and encoding requires gfx::BufferFormat::YUV_420_BIPLANAR to
+ // be supported by the renderer. Most of Chrome OS platforms support it, so
+ // enable it by default, with a switch that allows an explicit disable on
+ // platforms known to have problems, e.g. the Tegra-based nyan."
+ // TODO(crbug.com/982201): move gfx::BufferFormat::YUV_420_BIPLANAR out
+ // of if defined(ARCH_CPU_X86_FAMLIY) when Tegra is no longer supported.
+ disable_yuv_biplanar = base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kDisableYuv420Biplanar);
+#endif
+
switch (usage) {
case gfx::BufferUsage::GPU_READ:
return format == gfx::BufferFormat::BGR_565 ||
@@ -124,10 +139,15 @@ bool ClientNativePixmapDmaBuf::IsConfigurationSupported(
if (format == gfx::BufferFormat::RG_88 && !AllowCpuMappableBuffers())
return false;
+ if (!disable_yuv_biplanar &&
+ format == gfx::BufferFormat::YUV_420_BIPLANAR) {
+ return true;
+ }
+
return
#if defined(ARCH_CPU_X86_FAMILY)
- // Currently only Intel driver (i.e. minigbm and Mesa) supports
- // R_8 RG_88, NV12 and XB30/XR30.
+ // The minigbm backends and Mesa drivers commonly used on x86 systems
+ // support the following formats.
format == gfx::BufferFormat::R_8 ||
format == gfx::BufferFormat::RG_88 ||
format == gfx::BufferFormat::YUV_420_BIPLANAR ||
@@ -145,10 +165,16 @@ bool ClientNativePixmapDmaBuf::IsConfigurationSupported(
case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
if (!AllowCpuMappableBuffers())
return false;
+
+ if (!disable_yuv_biplanar &&
+ format == gfx::BufferFormat::YUV_420_BIPLANAR) {
+ return true;
+ }
+
return
#if defined(ARCH_CPU_X86_FAMILY)
- // Only the Intel stack (i.e. minigbm and Mesa) supports the formats
- // below.
+ // The minigbm backends and Mesa drivers commonly used on x86 systems
+ // support the following formats.
format == gfx::BufferFormat::R_8 ||
format == gfx::BufferFormat::RG_88 ||
format == gfx::BufferFormat::YUV_420_BIPLANAR ||
diff --git a/chromium/ui/gfx/linux/drm_util_linux.cc b/chromium/ui/gfx/linux/drm_util_linux.cc
index 7482722b128..e1372b68092 100644
--- a/chromium/ui/gfx/linux/drm_util_linux.cc
+++ b/chromium/ui/gfx/linux/drm_util_linux.cc
@@ -8,15 +8,6 @@
#include "base/notreached.h"
-#ifndef DRM_FORMAT_INVALID
-// TODO(mcasas): Remove when uprevving //third_party/libdrm.
-#define DRM_FORMAT_INVALID 0
-#endif
-
-#ifndef DRM_FORMAT_P010
-#define DRM_FORMAT_P010 fourcc_code('P', '0', '1', '0')
-#endif
-
namespace ui {
int GetFourCCFormatFromBufferFormat(gfx::BufferFormat format) {
diff --git a/chromium/ui/gfx/linux/gbm_util.cc b/chromium/ui/gfx/linux/gbm_util.cc
index cd9d13b55df..c516c13fafa 100644
--- a/chromium/ui/gfx/linux/gbm_util.cc
+++ b/chromium/ui/gfx/linux/gbm_util.cc
@@ -28,7 +28,8 @@ uint32_t BufferUsageToGbmFlags(gfx::BufferUsage usage) {
case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
return GBM_BO_USE_LINEAR | GBM_BO_USE_TEXTURING;
case gfx::BufferUsage::SCANOUT_VEA_READ_CAMERA_AND_CPU_READ_WRITE:
- return GBM_BO_USE_TEXTURING | GBM_BO_USE_HW_VIDEO_ENCODER;
+ return GBM_BO_USE_LINEAR | GBM_BO_USE_CAMERA_WRITE | GBM_BO_USE_SCANOUT |
+ GBM_BO_USE_TEXTURING | GBM_BO_USE_HW_VIDEO_ENCODER;
default:
NOTREACHED();
return 0;
diff --git a/chromium/ui/gfx/mac/cocoa_scrollbar_painter.cc b/chromium/ui/gfx/mac/cocoa_scrollbar_painter.cc
deleted file mode 100644
index 34218498007..00000000000
--- a/chromium/ui/gfx/mac/cocoa_scrollbar_painter.cc
+++ /dev/null
@@ -1,334 +0,0 @@
-// 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/mac/cocoa_scrollbar_painter.h"
-
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/skia_util.h"
-
-namespace gfx {
-
-using Params = CocoaScrollbarPainter::Params;
-using Orientation = CocoaScrollbarPainter::Orientation;
-
-namespace {
-
-// The width of the scroller track border.
-constexpr int kTrackBorderWidth = 1;
-
-// The amount the thumb is inset from the ends and the inside edge of track
-// border.
-constexpr int kThumbInset = 3;
-constexpr int kThumbInsetOverlay = 2;
-
-// The minimum sizes for the thumb. We will not inset the thumb if it will
-// be smaller than this size.
-constexpr int kThumbMinGirth = 6;
-constexpr int kThumbMinLength = 18;
-
-// Scrollbar thumb colors.
-constexpr SkColor kThumbColorDefault = SkColorSetARGB(0x3A, 0, 0, 0);
-constexpr SkColor kThumbColorHover = SkColorSetARGB(0x80, 0, 0, 0);
-constexpr SkColor kThumbColorDarkMode = SkColorSetRGB(0x6B, 0x6B, 0x6B);
-constexpr SkColor kThumbColorDarkModeHover = SkColorSetRGB(0x93, 0x93, 0x93);
-constexpr SkColor kThumbColorOverlay = SkColorSetARGB(0x80, 0, 0, 0);
-constexpr SkColor kThumbColorOverlayDarkMode =
- SkColorSetARGB(0x80, 0xFF, 0xFF, 0xFF);
-
-// Non-overlay scroller track colors are not transparent. On Safari, they are,
-// but on all other macOS applications they are not.
-constexpr SkColor kTrackGradientColors[] = {
- SkColorSetRGB(0xFA, 0xFA, 0xFA),
- SkColorSetRGB(0xFA, 0xFA, 0xFA),
-};
-constexpr SkColor kTrackInnerBorderColor = SkColorSetRGB(0xE8, 0xE8, 0xE8);
-constexpr SkColor kTrackOuterBorderColor = SkColorSetRGB(0xED, 0xED, 0xED);
-
-// Non-overlay dark mode scroller track colors.
-constexpr SkColor kTrackGradientColorsDarkMode[] = {
- SkColorSetRGB(0x2D, 0x2D, 0x2D),
- SkColorSetRGB(0x2B, 0x2B, 0x2B),
-};
-constexpr SkColor kTrackInnerBorderColorDarkMode =
- SkColorSetRGB(0x3D, 0x3D, 0x3D);
-constexpr SkColor kTrackOuterBorderColorDarkMode =
- SkColorSetRGB(0x51, 0x51, 0x51);
-
-// Overlay scroller track colors are transparent.
-constexpr SkColor kTrackGradientColorsOverlay[] = {
- SkColorSetARGB(0xC6, 0xF8, 0xF8, 0xF8),
- SkColorSetARGB(0xC2, 0xF8, 0xF8, 0xF8),
- SkColorSetARGB(0xC2, 0xF8, 0xF8, 0xF8),
- SkColorSetARGB(0xC2, 0xF8, 0xF8, 0xF8),
-};
-constexpr SkColor kTrackInnerBorderColorOverlay =
- SkColorSetARGB(0xF9, 0xDF, 0xDF, 0xDF);
-constexpr SkColor kTrackOuterBorderColorOverlay =
- SkColorSetARGB(0xC6, 0xE8, 0xE8, 0xE8);
-
-// Dark mode overlay scroller track colors.
-constexpr SkColor kTrackGradientColorsOverlayDarkMode[] = {
- SkColorSetARGB(0x28, 0xD8, 0xD8, 0xD8),
- SkColorSetARGB(0x26, 0xCC, 0xCC, 0xCC),
- SkColorSetARGB(0x26, 0xCC, 0xCC, 0xCC),
- SkColorSetARGB(0x26, 0xCC, 0xCC, 0xCC),
-};
-constexpr SkColor kTrackInnerBorderColorOverlayDarkMode =
- SkColorSetARGB(0x33, 0xE5, 0xE5, 0xE5);
-constexpr SkColor kTrackOuterBorderColorOverlayDarkMode =
- SkColorSetARGB(0x28, 0xD8, 0xD8, 0xD8);
-
-void ConstrainInsets(int old_width, int min_width, int* left, int* right) {
- int requested_total_inset = *left + *right;
- if (requested_total_inset == 0)
- return;
- int max_total_inset = old_width - min_width;
- if (requested_total_inset < max_total_inset)
- return;
- if (max_total_inset < 0) {
- *left = *right = 0;
- return;
- }
- // Multiply the right/bottom inset by the ratio by which we need to shrink the
- // total inset. This has the effect of rounding down the right/bottom inset,
- // if the two sides are to be affected unevenly.
- *right *= max_total_inset * 1.f / requested_total_inset;
- *left = max_total_inset - *right;
-}
-
-void ConstrainedInset(gfx::Rect* rect,
- int min_width,
- int min_height,
- int inset_left,
- int inset_top,
- int inset_right,
- int inset_bottom) {
- ConstrainInsets(rect->width(), min_width, &inset_left, &inset_right);
- ConstrainInsets(rect->height(), min_height, &inset_top, &inset_bottom);
- rect->Inset(inset_left, inset_top, inset_right, inset_bottom);
-}
-
-void PaintTrackGradient(gfx::Canvas* canvas,
- const gfx::Rect& rect,
- const Params& params,
- bool is_corner) {
- // Select colors.
- const SkColor* gradient_colors = nullptr;
- size_t gradient_stops = 0;
- if (params.overlay) {
- if (params.dark_mode) {
- gradient_colors = kTrackGradientColorsOverlayDarkMode;
- gradient_stops = base::size(kTrackGradientColorsOverlayDarkMode);
- } else {
- gradient_colors = kTrackGradientColorsOverlay;
- gradient_stops = base::size(kTrackGradientColorsOverlay);
- }
- } else {
- if (params.dark_mode) {
- gradient_colors = kTrackGradientColorsDarkMode;
- gradient_stops = base::size(kTrackGradientColorsDarkMode);
- } else {
- gradient_colors = kTrackGradientColors;
- gradient_stops = base::size(kTrackGradientColors);
- }
- }
-
- // Set the gradient direction.
- const SkPoint gradient_bounds_vertical[] = {
- gfx::PointToSkPoint(rect.origin()),
- gfx::PointToSkPoint(rect.bottom_left()),
- };
- const SkPoint gradient_bounds_horizontal[] = {
- gfx::PointToSkPoint(rect.origin()),
- gfx::PointToSkPoint(rect.top_right()),
- };
- const SkPoint gradient_bounds_corner_right[] = {
- gfx::PointToSkPoint(rect.origin()),
- gfx::PointToSkPoint(rect.bottom_right()),
- };
- const SkPoint gradient_bounds_corner_left[] = {
- gfx::PointToSkPoint(rect.top_right()),
- gfx::PointToSkPoint(rect.bottom_left()),
- };
- const SkPoint* gradient_bounds = nullptr;
- if (is_corner) {
- if (params.orientation == Orientation::kVerticalOnRight)
- gradient_bounds = gradient_bounds_corner_right;
- else
- gradient_bounds = gradient_bounds_corner_left;
- } else {
- if (params.orientation == Orientation::kHorizontal)
- gradient_bounds = gradient_bounds_horizontal;
- else
- gradient_bounds = gradient_bounds_vertical;
- }
-
- // And draw.
- cc::PaintFlags gradient;
- gradient.setShader(cc::PaintShader::MakeLinearGradient(
- gradient_bounds, gradient_colors, nullptr, gradient_stops,
- SkTileMode::kClamp));
- canvas->DrawRect(rect, gradient);
-}
-
-void PaintTrackInnerBorder(gfx::Canvas* canvas,
- const gfx::Rect& rect,
- const Params& params,
- bool is_corner) {
- // Select the color.
- SkColor inner_border_color = 0;
- if (params.overlay) {
- if (params.dark_mode)
- inner_border_color = kTrackInnerBorderColorOverlayDarkMode;
- else
- inner_border_color = kTrackInnerBorderColorOverlay;
- } else {
- if (params.dark_mode)
- inner_border_color = kTrackInnerBorderColorDarkMode;
- else
- inner_border_color = kTrackInnerBorderColor;
- }
-
- // Compute the rect for the border.
- gfx::Rect inner_border(rect);
- if (params.orientation == Orientation::kVerticalOnLeft)
- inner_border.set_x(rect.right() - kTrackBorderWidth);
- if (is_corner || params.orientation == Orientation::kHorizontal)
- inner_border.set_height(kTrackBorderWidth);
- if (is_corner || params.orientation != Orientation::kHorizontal)
- inner_border.set_width(kTrackBorderWidth);
-
- // And draw.
- cc::PaintFlags flags;
- flags.setColor(inner_border_color);
- canvas->DrawRect(inner_border, flags);
-}
-
-void PaintTrackOuterBorder(gfx::Canvas* canvas,
- const gfx::Rect& rect,
- const Params& params,
- bool is_corner) {
- // Select the color.
- SkColor outer_border_color = 0;
- if (params.overlay) {
- if (params.dark_mode)
- outer_border_color = kTrackOuterBorderColorOverlayDarkMode;
- else
- outer_border_color = kTrackOuterBorderColorOverlay;
- } else {
- if (params.dark_mode)
- outer_border_color = kTrackOuterBorderColorDarkMode;
- else
- outer_border_color = kTrackOuterBorderColor;
- }
- cc::PaintFlags flags;
- flags.setColor(outer_border_color);
-
- // Draw the horizontal outer border.
- if (is_corner || params.orientation == Orientation::kHorizontal) {
- gfx::Rect outer_border(rect);
- outer_border.set_height(kTrackBorderWidth);
- outer_border.set_y(rect.bottom() - kTrackBorderWidth);
- canvas->DrawRect(outer_border, flags);
- }
-
- // Draw the vertial outer border.
- if (is_corner || params.orientation != Orientation::kHorizontal) {
- gfx::Rect outer_border(rect);
- outer_border.set_width(kTrackBorderWidth);
- if (params.orientation == Orientation::kVerticalOnRight)
- outer_border.set_x(rect.right() - kTrackBorderWidth);
- canvas->DrawRect(outer_border, flags);
- }
-}
-
-} // namespace
-
-// static
-void CocoaScrollbarPainter::PaintTrack(cc::PaintCanvas* cc_canvas,
- const SkIRect& sk_track_rect,
- const Params& params) {
- gfx::Canvas canvas(cc_canvas, 1.f);
- const gfx::Rect track_rect(SkIRectToRect(sk_track_rect));
- constexpr bool is_corner = false;
- PaintTrackGradient(&canvas, track_rect, params, is_corner);
- PaintTrackInnerBorder(&canvas, track_rect, params, is_corner);
- PaintTrackOuterBorder(&canvas, track_rect, params, is_corner);
-}
-
-// static
-void CocoaScrollbarPainter::PaintCorner(cc::PaintCanvas* cc_canvas,
- const SkIRect& sk_corner_rect,
- const Params& params) {
- // Overlay scrollbars don't have a corner.
- if (params.overlay)
- return;
- gfx::Canvas canvas(cc_canvas, 1.f);
- const gfx::Rect corner_rect(SkIRectToRect(sk_corner_rect));
- constexpr bool is_corner = true;
- PaintTrackGradient(&canvas, corner_rect, params, is_corner);
- PaintTrackInnerBorder(&canvas, corner_rect, params, is_corner);
- PaintTrackOuterBorder(&canvas, corner_rect, params, is_corner);
-}
-
-// static
-void CocoaScrollbarPainter::PaintThumb(cc::PaintCanvas* cc_canvas,
- const SkIRect& sk_bounds,
- const Params& params) {
- gfx::Canvas canvas(cc_canvas, 1.f);
-
- // Select the color.
- SkColor thumb_color = 0;
- if (params.overlay) {
- if (params.dark_mode)
- thumb_color = kThumbColorOverlayDarkMode;
- else
- thumb_color = kThumbColorOverlay;
- } else {
- if (params.dark_mode) {
- if (params.hovered)
- thumb_color = kThumbColorDarkModeHover;
- else
- thumb_color = kThumbColorDarkMode;
- } else {
- if (params.hovered)
- thumb_color = kThumbColorHover;
- else
- thumb_color = kThumbColorDefault;
- }
- }
-
- // Compute the bounds for the rounded rect for the thumb from the bounds of
- // the thumb.
- gfx::Rect bounds(SkIRectToRect(sk_bounds));
- {
- // Shrink the thumb evenly in length and girth to fit within the track.
- const int thumb_inset = params.overlay ? kThumbInsetOverlay : kThumbInset;
- int inset_left = thumb_inset;
- int inset_top = thumb_inset;
- int inset_right = thumb_inset;
- int inset_bottom = thumb_inset;
-
- // Also shrink the thumb in girth to not touch the border.
- if (params.orientation == Orientation::kHorizontal) {
- inset_top += kTrackBorderWidth;
- ConstrainedInset(&bounds, kThumbMinLength, kThumbMinGirth, inset_left,
- inset_top, inset_right, inset_bottom);
- } else {
- inset_left += kTrackBorderWidth;
- ConstrainedInset(&bounds, kThumbMinGirth, kThumbMinLength, inset_left,
- inset_top, inset_right, inset_bottom);
- }
- }
-
- // Draw.
- cc::PaintFlags flags;
- flags.setAntiAlias(true);
- flags.setStyle(cc::PaintFlags::kFill_Style);
- flags.setColor(thumb_color);
- const SkScalar radius = std::min(bounds.width(), bounds.height());
- canvas.DrawRoundRect(bounds, radius, flags);
-}
-
-} // namespace gfx
diff --git a/chromium/ui/gfx/mac/cocoa_scrollbar_painter.h b/chromium/ui/gfx/mac/cocoa_scrollbar_painter.h
deleted file mode 100644
index ea4c5232732..00000000000
--- a/chromium/ui/gfx/mac/cocoa_scrollbar_painter.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// 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_MAC_COCOA_SCROLLBAR_PAINTER_H_
-#define UI_GFX_MAC_COCOA_SCROLLBAR_PAINTER_H_
-
-#include "cc/paint/paint_canvas.h"
-#include "third_party/skia/include/core/SkRect.h"
-#include "ui/gfx/gfx_export.h"
-
-namespace gfx {
-
-class GFX_EXPORT CocoaScrollbarPainter {
- public:
- enum class Orientation {
- // Vertical scrollbar on the right side of content.
- kVerticalOnRight,
- // Vertical scrollbar on the left side of content.
- kVerticalOnLeft,
- // Horizontal scrollbar (on the bottom of content).
- kHorizontal,
- };
-
- struct Params {
- // The orientation of the scrollbar.
- Orientation orientation = Orientation::kVerticalOnRight;
-
- // Whether or not this is an overlay scrollbar.
- bool overlay = false;
-
- // Scrollbars change color in dark mode.
- bool dark_mode = false;
-
- // Non-overlay scrollbars change thumb color when they are hovered (or
- // pressed).
- bool hovered = false;
- };
-
- // Paint the thumb. The |thumb_bounds| changes over time when the thumb
- // engorges during hover.
- static void PaintThumb(cc::PaintCanvas* canvas,
- const SkIRect& thumb_bounds,
- const Params& params);
- // Paint the track. |track_bounds| is the bounds for the track.
- static void PaintTrack(cc::PaintCanvas* canvas,
- const SkIRect& track_bounds,
- const Params& params);
- // Paint the corner. |corner_bounds| is the bounds for the corner.
- static void PaintCorner(cc::PaintCanvas* canvas,
- const SkIRect& corner_bounds,
- const Params& params);
-};
-
-} // namespace gfx
-
-#endif // UI_GFX_MAC_COCOA_SCROLLBAR_PAINTER_H_
diff --git a/chromium/ui/gfx/mac/display_icc_profiles.cc b/chromium/ui/gfx/mac/display_icc_profiles.cc
index 822924229f2..119b652bb87 100644
--- a/chromium/ui/gfx/mac/display_icc_profiles.cc
+++ b/chromium/ui/gfx/mac/display_icc_profiles.cc
@@ -4,6 +4,7 @@
#include "ui/gfx/mac/display_icc_profiles.h"
+#include "base/notreached.h"
#include "ui/gfx/icc_profile.h"
namespace gfx {
diff --git a/chromium/ui/gfx/mojom/BUILD.gn b/chromium/ui/gfx/mojom/BUILD.gn
index eec21020c9c..f8d73762c53 100644
--- a/chromium/ui/gfx/mojom/BUILD.gn
+++ b/chromium/ui/gfx/mojom/BUILD.gn
@@ -87,6 +87,26 @@ mojom("mojom") {
{
types = [
{
+ mojom = "gfx.mojom.PresentationFeedback"
+ cpp = "::gfx::PresentationFeedback"
+ },
+ ]
+ traits_headers = [ "presentation_feedback_mojom_traits.h" ]
+ traits_public_deps = [ "//ui/gfx" ]
+ },
+ {
+ types = [
+ {
+ mojom = "gfx.mojom.SwapTimings"
+ cpp = "::gfx::SwapTimings"
+ },
+ ]
+ traits_headers = [ "swap_timings_mojom_traits.h" ]
+ traits_public_deps = [ "//ui/gfx" ]
+ },
+ {
+ types = [
+ {
mojom = "gfx.mojom.Transform"
cpp = "::gfx::Transform"
},
@@ -157,16 +177,6 @@ mojom("mojom") {
{
types = [
{
- mojom = "gfx.mojom.PresentationFeedback"
- cpp = "::gfx::PresentationFeedback"
- },
- ]
- traits_headers = [ "presentation_feedback_mojom_traits.h" ]
- traits_public_deps = [ "//ui/gfx" ]
- },
- {
- types = [
- {
mojom = "gfx.mojom.RRectF"
cpp = "::gfx::RRectF"
},
@@ -194,16 +204,6 @@ mojom("mojom") {
traits_headers = [ "swap_result_mojom_traits.h" ]
traits_public_deps = [ "//ui/gfx" ]
},
- {
- types = [
- {
- mojom = "gfx.mojom.SwapTimings"
- cpp = "::gfx::SwapTimings"
- },
- ]
- traits_headers = [ "swap_timings_mojom_traits.h" ]
- traits_public_deps = [ "//ui/gfx" ]
- },
]
cpp_typemaps += shared_cpp_typemaps
diff --git a/chromium/ui/gfx/mojom/mojom_traits_unittest.cc b/chromium/ui/gfx/mojom/mojom_traits_unittest.cc
index dfe551e3061..4bd41e851d7 100644
--- a/chromium/ui/gfx/mojom/mojom_traits_unittest.cc
+++ b/chromium/ui/gfx/mojom/mojom_traits_unittest.cc
@@ -245,12 +245,21 @@ TEST_F(StructTraitsTest, PresentationFeedback) {
uint32_t flags =
PresentationFeedback::kVSync | PresentationFeedback::kZeroCopy;
PresentationFeedback input{timestamp, interval, flags};
+ input.available_timestamp =
+ base::TimeTicks() + base::TimeDelta::FromMilliseconds(20);
+ input.ready_timestamp =
+ base::TimeTicks() + base::TimeDelta::FromMilliseconds(21);
+ input.latch_timestamp =
+ base::TimeTicks() + base::TimeDelta::FromMilliseconds(22);
PresentationFeedback output;
mojo::test::SerializeAndDeserialize<gfx::mojom::PresentationFeedback>(
&input, &output);
EXPECT_EQ(timestamp, output.timestamp);
EXPECT_EQ(interval, output.interval);
EXPECT_EQ(flags, output.flags);
+ EXPECT_EQ(input.available_timestamp, output.available_timestamp);
+ EXPECT_EQ(input.ready_timestamp, output.ready_timestamp);
+ EXPECT_EQ(input.latch_timestamp, output.latch_timestamp);
}
TEST_F(StructTraitsTest, RRectF) {
diff --git a/chromium/ui/gfx/mojom/presentation_feedback.mojom b/chromium/ui/gfx/mojom/presentation_feedback.mojom
index 49233c72bd1..d91fe6a4be6 100644
--- a/chromium/ui/gfx/mojom/presentation_feedback.mojom
+++ b/chromium/ui/gfx/mojom/presentation_feedback.mojom
@@ -11,4 +11,8 @@ struct PresentationFeedback {
mojo_base.mojom.TimeTicks timestamp;
mojo_base.mojom.TimeDelta interval;
uint32 flags;
+
+ mojo_base.mojom.TimeTicks available_timestamp;
+ mojo_base.mojom.TimeTicks ready_timestamp;
+ mojo_base.mojom.TimeTicks latch_timestamp;
};
diff --git a/chromium/ui/gfx/mojom/presentation_feedback_mojom_traits.h b/chromium/ui/gfx/mojom/presentation_feedback_mojom_traits.h
index 14b726b4090..26b0f2e7fe9 100644
--- a/chromium/ui/gfx/mojom/presentation_feedback_mojom_traits.h
+++ b/chromium/ui/gfx/mojom/presentation_feedback_mojom_traits.h
@@ -27,11 +27,29 @@ struct StructTraits<gfx::mojom::PresentationFeedbackDataView,
return input.flags;
}
+ static base::TimeTicks available_timestamp(
+ const gfx::PresentationFeedback& input) {
+ return input.available_timestamp;
+ }
+
+ static base::TimeTicks ready_timestamp(
+ const gfx::PresentationFeedback& input) {
+ return input.ready_timestamp;
+ }
+
+ static base::TimeTicks latch_timestamp(
+ const gfx::PresentationFeedback& input) {
+ return input.latch_timestamp;
+ }
+
static bool Read(gfx::mojom::PresentationFeedbackDataView data,
gfx::PresentationFeedback* out) {
out->flags = data.flags();
return data.ReadTimestamp(&out->timestamp) &&
- data.ReadInterval(&out->interval);
+ data.ReadInterval(&out->interval) &&
+ data.ReadAvailableTimestamp(&out->available_timestamp) &&
+ data.ReadReadyTimestamp(&out->ready_timestamp) &&
+ data.ReadLatchTimestamp(&out->latch_timestamp);
}
};
diff --git a/chromium/ui/gfx/native_widget_types.h b/chromium/ui/gfx/native_widget_types.h
index 32929a7124c..eb5af9df8ee 100644
--- a/chromium/ui/gfx/native_widget_types.h
+++ b/chromium/ui/gfx/native_widget_types.h
@@ -7,7 +7,6 @@
#include <stdint.h>
-#include "base/logging.h"
#include "build/build_config.h"
#include "ui/gfx/gfx_export.h"
@@ -100,7 +99,7 @@ struct ANativeWindow;
namespace ui {
class WindowAndroid;
class ViewAndroid;
-}
+} // namespace ui
#endif
class SkBitmap;
@@ -111,6 +110,12 @@ typedef struct _AtkObject AtkObject;
}
#endif
+#if defined(USE_X11)
+namespace x11 {
+enum class Window : uint32_t;
+}
+#endif
+
namespace gfx {
#if defined(USE_AURA)
@@ -220,7 +225,7 @@ typedef UnimplementedNativeViewAccessible* NativeViewAccessible;
const ui::mojom::CursorType kNullCursor =
static_cast<ui::mojom::CursorType>(-1);
#else
-const gfx::NativeCursor kNullCursor = static_cast<gfx::NativeCursor>(NULL);
+const gfx::NativeCursor kNullCursor = static_cast<gfx::NativeCursor>(nullptr);
#endif
// Note: for test_shell we're packing a pointer into the NativeViewId. So, if
@@ -233,10 +238,11 @@ typedef intptr_t NativeViewId;
// AcceleratedWidget provides a surface to compositors to paint pixels.
#if defined(OS_WIN)
typedef HWND AcceleratedWidget;
-constexpr AcceleratedWidget kNullAcceleratedWidget = NULL;
+constexpr AcceleratedWidget kNullAcceleratedWidget = nullptr;
#elif defined(USE_X11)
-typedef unsigned long AcceleratedWidget;
-constexpr AcceleratedWidget kNullAcceleratedWidget = 0;
+typedef x11::Window AcceleratedWidget;
+constexpr AcceleratedWidget kNullAcceleratedWidget =
+ static_cast<x11::Window>(0);
#elif defined(OS_IOS)
typedef UIView* AcceleratedWidget;
constexpr AcceleratedWidget kNullAcceleratedWidget = 0;
diff --git a/chromium/ui/gfx/nine_image_painter.h b/chromium/ui/gfx/nine_image_painter.h
index 9a579edb8ff..36321dc40d7 100644
--- a/chromium/ui/gfx/nine_image_painter.h
+++ b/chromium/ui/gfx/nine_image_painter.h
@@ -10,7 +10,6 @@
#include <vector>
#include "base/gtest_prod_util.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "ui/gfx/gfx_export.h"
#include "ui/gfx/image/image_skia.h"
diff --git a/chromium/ui/gfx/paint_throbber.cc b/chromium/ui/gfx/paint_throbber.cc
index 83a31693365..e59b25bf820 100644
--- a/chromium/ui/gfx/paint_throbber.cc
+++ b/chromium/ui/gfx/paint_throbber.cc
@@ -4,6 +4,8 @@
#include "ui/gfx/paint_throbber.h"
+#include <algorithm>
+
#include "base/time/time.h"
#include "cc/paint/paint_flags.h"
#include "third_party/skia/include/core/SkPath.h"
@@ -18,14 +20,14 @@ namespace gfx {
namespace {
// The maximum size of the "spinning" state arc, in degrees.
-const int64_t kMaxArcSize = 270;
+constexpr int64_t kMaxArcSize = 270;
// The amount of time it takes to grow the "spinning" arc from 0 to 270 degrees.
-const int64_t kArcTimeMs = 666;
+constexpr auto kArcTime = base::TimeDelta::FromSecondsD(2.0 / 3.0);
// The amount of time it takes for the "spinning" throbber to make a full
// rotation.
-const int64_t kRotationTimeMs = 1568;
+constexpr auto kRotationTime = base::TimeDelta::FromMilliseconds(1568);
void PaintArc(Canvas* canvas,
const Rect& bounds,
@@ -44,7 +46,7 @@ void PaintArc(Canvas* canvas,
Rect oval = bounds;
// Inset by half the stroke width to make sure the whole arc is inside
// the visible rect.
- int inset = SkScalarCeilToInt(*stroke_width / 2.0);
+ const int inset = SkScalarCeilToInt(*stroke_width / 2.0);
oval.Inset(inset, inset);
SkPath path;
@@ -66,10 +68,10 @@ void CalculateWaitingAngles(const base::TimeDelta& elapsed_time,
// the throbber spins counter-clockwise. The finish angle starts at 12 o'clock
// (90 degrees) and rotates steadily. The start angle trails 180 degrees
// behind, except for the first half revolution, when it stays at 12 o'clock.
- base::TimeDelta revolution_time = base::TimeDelta::FromMilliseconds(1320);
+ constexpr auto kRevolutionTime = base::TimeDelta::FromMilliseconds(1320);
int64_t twelve_oclock = 90;
int64_t finish_angle_cc =
- twelve_oclock + 360 * elapsed_time / revolution_time;
+ twelve_oclock + 360 * elapsed_time / kRevolutionTime;
int64_t start_angle_cc = std::max(finish_angle_cc - 180, twelve_oclock);
// Negate the angles to convert to the clockwise numbers Skia expects.
@@ -91,31 +93,29 @@ void PaintThrobberSpinningWithStartAngle(
// The sweep angle ranges from -270 to 270 over 1333ms. CSS
// animation timing functions apply in between key frames, so we have to
// break up the 1333ms into two keyframes (-270 to 0, then 0 to 270).
- base::TimeDelta arc_time = base::TimeDelta::FromMilliseconds(kArcTimeMs);
- double arc_size_progress = static_cast<double>(elapsed_time.InMicroseconds() %
- arc_time.InMicroseconds()) /
- arc_time.InMicroseconds();
+ const double arc_progress =
+ (elapsed_time % kArcTime).InMicrosecondsF() / kArcTime.InMicrosecondsF();
// This tween is equivalent to cubic-bezier(0.4, 0.0, 0.2, 1).
- double sweep = kMaxArcSize * Tween::CalculateValue(Tween::FAST_OUT_SLOW_IN,
- arc_size_progress);
- int64_t sweep_keyframe = (elapsed_time / arc_time) % 2;
+ double sweep = kMaxArcSize *
+ Tween::CalculateValue(Tween::FAST_OUT_SLOW_IN, arc_progress);
+ const int64_t sweep_keyframe = (elapsed_time / kArcTime) % 2;
if (sweep_keyframe == 0)
sweep -= kMaxArcSize;
// This part makes sure the sweep is at least 5 degrees long. Roughly
// equivalent to the "magic constants" in SVG's fillunfill animation.
- const double min_sweep_length = 5.0;
- if (sweep >= 0.0 && sweep < min_sweep_length) {
- start_angle -= (min_sweep_length - sweep);
- sweep = min_sweep_length;
- } else if (sweep <= 0.0 && sweep > -min_sweep_length) {
- start_angle += (-min_sweep_length - sweep);
- sweep = -min_sweep_length;
+ constexpr double kMinSweepLength = 5.0;
+ if (sweep >= 0.0 && sweep < kMinSweepLength) {
+ start_angle -= (kMinSweepLength - sweep);
+ sweep = kMinSweepLength;
+ } else if (sweep <= 0.0 && sweep > -kMinSweepLength) {
+ start_angle += (-kMinSweepLength - sweep);
+ sweep = -kMinSweepLength;
}
// To keep the sweep smooth, we have an additional rotation after each
- // |arc_time| period has elapsed. See SVG's 'rot' animation.
- int64_t rot_keyframe = (elapsed_time / (arc_time * 2)) % 4;
+ // arc period has elapsed. See SVG's 'rot' animation.
+ const int64_t rot_keyframe = (elapsed_time / (kArcTime * 2)) % 4;
PaintArc(canvas, bounds, color, start_angle + rot_keyframe * kMaxArcSize,
sweep, stroke_width);
}
@@ -127,9 +127,7 @@ void PaintThrobberSpinning(Canvas* canvas,
SkColor color,
const base::TimeDelta& elapsed_time,
base::Optional<SkScalar> stroke_width) {
- base::TimeDelta rotation_time =
- base::TimeDelta::FromMilliseconds(kRotationTimeMs);
- int64_t start_angle = 270 + 360 * elapsed_time / rotation_time;
+ const int64_t start_angle = 270 + 360 * elapsed_time / kRotationTime;
PaintThrobberSpinningWithStartAngle(canvas, bounds, color, elapsed_time,
start_angle, stroke_width);
}
@@ -157,35 +155,34 @@ void PaintThrobberSpinningAfterWaiting(Canvas* canvas,
// |arc_time_offset| is the effective amount of time one would have to wait
// for the "spinning" sweep to match |waiting_sweep|. Brute force calculation.
if (waiting_state->arc_time_offset.is_zero()) {
- for (int64_t arc_time_it = 0; arc_time_it <= kArcTimeMs; ++arc_time_it) {
- double arc_size_progress = static_cast<double>(arc_time_it) / kArcTimeMs;
+ for (int64_t arc_ms = 0; arc_ms <= kArcTime.InMillisecondsRoundedUp();
+ ++arc_ms) {
+ double arc_size_progress =
+ std::min(1.0, arc_ms / kArcTime.InMillisecondsF());
if (kMaxArcSize * Tween::CalculateValue(Tween::FAST_OUT_SLOW_IN,
arc_size_progress) >=
waiting_sweep) {
- // Add kArcTimeMs to sidestep the |sweep_keyframe == 0| offset below.
- waiting_state->arc_time_offset =
- base::TimeDelta::FromMilliseconds(arc_time_it + kArcTimeMs);
+ // Add kArcTime to sidestep the |sweep_keyframe == 0| offset below.
+ waiting_state->arc_time_offset = kArcTime * (arc_size_progress + 1);
break;
}
}
}
// Blend the color between "waiting" and "spinning" states.
- base::TimeDelta color_fade_time = base::TimeDelta::FromMilliseconds(900);
+ constexpr auto kColorFadeTime = base::TimeDelta::FromMilliseconds(900);
float color_progress = 1.0f;
- if (elapsed_time < color_fade_time) {
- color_progress = static_cast<float>(Tween::CalculateValue(
+ if (elapsed_time < kColorFadeTime) {
+ color_progress = float{Tween::CalculateValue(
Tween::LINEAR_OUT_SLOW_IN,
- static_cast<double>(elapsed_time.InMicroseconds()) /
- color_fade_time.InMicroseconds()));
+ elapsed_time.InMicrosecondsF() / kColorFadeTime.InMicrosecondsF())};
}
- SkColor blend_color =
+ const SkColor blend_color =
color_utils::AlphaBlend(color, waiting_state->color, color_progress);
- int64_t start_angle =
- waiting_start_angle +
- 360 * elapsed_time / base::TimeDelta::FromMilliseconds(kRotationTimeMs);
- base::TimeDelta effective_elapsed_time =
+ const int64_t start_angle =
+ waiting_start_angle + 360 * elapsed_time / kRotationTime;
+ const base::TimeDelta effective_elapsed_time =
elapsed_time + waiting_state->arc_time_offset;
PaintThrobberSpinningWithStartAngle(canvas, bounds, blend_color,
@@ -197,13 +194,15 @@ GFX_EXPORT void PaintNewThrobberWaiting(Canvas* canvas,
const RectF& throbber_container_bounds,
SkColor color,
const base::TimeDelta& elapsed_time) {
+ // Cycle time for the waiting throbber.
+ constexpr auto kNewThrobberWaitingCycleTime = base::TimeDelta::FromSeconds(1);
+
// The throbber bounces back and forth. We map the elapsed time to 0->2. Time
// 0->1 represents when the throbber moves left to right, time 1->2 represents
// right to left.
- float time =
- 2.0f *
- (elapsed_time.InMilliseconds() % kNewThrobberWaitingAnimationCycleMs) /
- kNewThrobberWaitingAnimationCycleMs;
+ float time = 2.0f *
+ (elapsed_time % kNewThrobberWaitingCycleTime).InMicrosecondsF() /
+ kNewThrobberWaitingCycleTime.InMicrosecondsF();
// 1 -> 2 values mirror back to 1 -> 0 values to represent right-to-left.
const bool going_back = time > 1.0f;
if (going_back)
diff --git a/chromium/ui/gfx/paint_throbber.h b/chromium/ui/gfx/paint_throbber.h
index a6603757b5b..c5370c40452 100644
--- a/chromium/ui/gfx/paint_throbber.h
+++ b/chromium/ui/gfx/paint_throbber.h
@@ -68,10 +68,6 @@ GFX_EXPORT void PaintNewThrobberWaiting(Canvas* canvas,
SkColor color,
const base::TimeDelta& elapsed_time);
-// Cycle time for the throbber above. Used to be able to smoothly transition
-// between the throbber and the determinite progress-bar animation.
-constexpr int kNewThrobberWaitingAnimationCycleMs = 1000;
-
} // namespace gfx
#endif // UI_GFX_PAINT_THROBBER_H_
diff --git a/chromium/ui/gfx/path_mac.mm b/chromium/ui/gfx/path_mac.mm
index e74aa2906a2..ae108175d70 100644
--- a/chromium/ui/gfx/path_mac.mm
+++ b/chromium/ui/gfx/path_mac.mm
@@ -4,8 +4,11 @@
#import "ui/gfx/path_mac.h"
+#include <ostream>
+
#import <Cocoa/Cocoa.h>
+#include "base/notreached.h"
#include "base/stl_util.h"
#include "third_party/skia/include/core/SkPath.h"
#include "third_party/skia/include/core/SkRegion.h"
diff --git a/chromium/ui/gfx/path_mac_unittest.mm b/chromium/ui/gfx/path_mac_unittest.mm
index 0953cc82d68..1f2dff5696d 100644
--- a/chromium/ui/gfx/path_mac_unittest.mm
+++ b/chromium/ui/gfx/path_mac_unittest.mm
@@ -9,6 +9,7 @@
#import <Cocoa/Cocoa.h>
+#include "base/check_op.h"
#include "base/stl_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkPath.h"
diff --git a/chromium/ui/gfx/platform_font_ios.mm b/chromium/ui/gfx/platform_font_ios.mm
index 018899651bb..5a59235b5d9 100644
--- a/chromium/ui/gfx/platform_font_ios.mm
+++ b/chromium/ui/gfx/platform_font_ios.mm
@@ -9,6 +9,7 @@
#include <cmath>
#import "base/mac/foundation_util.h"
+#include "base/notreached.h"
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "third_party/skia/include/ports/SkTypeface_mac.h"
diff --git a/chromium/ui/gfx/presentation_feedback.h b/chromium/ui/gfx/presentation_feedback.h
index f4a6cdde750..8e6e2ad03d2 100644
--- a/chromium/ui/gfx/presentation_feedback.h
+++ b/chromium/ui/gfx/presentation_feedback.h
@@ -48,6 +48,8 @@ struct PresentationFeedback {
return {base::TimeTicks::Now(), base::TimeDelta(), Flags::kFailure};
}
+ bool failed() const { return !!(flags & Flags::kFailure); }
+
// The time when a buffer begins scan-out. If a buffer is never presented on
// a screen, the |timestamp| will be set to the time of the failure.
base::TimeTicks timestamp;
@@ -57,12 +59,38 @@ struct PresentationFeedback {
// A combination of Flags. It indicates the kind of the |timestamp|.
uint32_t flags = 0;
+
+ // The following are additional timestamps that are reported if available on
+ // the underlying platform. If not available, the timestamp is set to 0.
+
+ // A buffer sent to the system compositor or display controller for
+ // presentation is returned to chromium's compositor with an out fence for
+ // synchronization. This fence indicates when reads from this buffer for
+ // presentation (on the GPU or display controller) have been finished and it
+ // is safe to write new data to this buffer. Since this fence may not have
+ // been signalled when the swap for a new frame is issued, this timestamp is
+ // meant to track the latency from when a swap is issued on the GPU thread to
+ // when the GPU can start rendering to this buffer.
+ base::TimeTicks available_timestamp;
+
+ // The time when the GPU has finished completing all the drawing commands on
+ // the primary plane. On Android, SurfaceFlinger does not latch to a buffer
+ // until this fence has been signalled.
+ base::TimeTicks ready_timestamp;
+
+ // The time when the primary plane is latched by the system compositor for its
+ // next rendering update. On Android this corresponds to the SurfaceFlinger
+ // latch time.
+ base::TimeTicks latch_timestamp;
};
inline bool operator==(const PresentationFeedback& lhs,
const PresentationFeedback& rhs) {
return lhs.timestamp == rhs.timestamp && lhs.interval == rhs.interval &&
- lhs.flags == rhs.flags;
+ lhs.flags == rhs.flags &&
+ lhs.available_timestamp == rhs.available_timestamp &&
+ lhs.ready_timestamp == rhs.ready_timestamp &&
+ lhs.latch_timestamp == rhs.latch_timestamp;
}
inline bool operator!=(const PresentationFeedback& lhs,
diff --git a/chromium/ui/gfx/range/mojom/BUILD.gn b/chromium/ui/gfx/range/mojom/BUILD.gn
index 497acbc59cb..8f58cfd9e09 100644
--- a/chromium/ui/gfx/range/mojom/BUILD.gn
+++ b/chromium/ui/gfx/range/mojom/BUILD.gn
@@ -7,6 +7,7 @@ import("//mojo/public/tools/bindings/mojom.gni")
# This target does NOT depend on skia. One can depend on this target to avoid
# picking up a dependency on skia.
mojom("mojom") {
+ generate_java = true
sources = [ "range.mojom" ]
shared_cpp_typemap = {
diff --git a/chromium/ui/gfx/render_text.cc b/chromium/ui/gfx/render_text.cc
index ddbad437878..38394380939 100644
--- a/chromium/ui/gfx/render_text.cc
+++ b/chromium/ui/gfx/render_text.cc
@@ -48,23 +48,11 @@ namespace {
// Replacement codepoint for elided text.
constexpr base::char16 kEllipsisCodepoint = 0x2026;
-// Default color used for the text and cursor.
-const SkColor kDefaultColor = SK_ColorBLACK;
-
-// Default color used for drawing selection background.
-const SkColor kDefaultSelectionBackgroundColor = SK_ColorGRAY;
-
// Fraction of the text size to raise the center of a strike-through line above
// the baseline.
const SkScalar kStrikeThroughOffset = (SK_Scalar1 * 65 / 252);
// Fraction of the text size to lower an underline below the baseline.
const SkScalar kUnderlineOffset = (SK_Scalar1 / 9);
-// Default fraction of the text size to use for a strike-through or underline.
-const SkScalar kLineThicknessFactor = (SK_Scalar1 / 18);
-
-// Invalid value of baseline. Assigning this value to |baseline_| causes
-// re-calculation of baseline.
-const int kInvalidBaseline = INT_MAX;
// Float comparison needs epsilon to consider rounding errors in float
// arithmetic. Epsilon should be dependent on the context and here, we are
@@ -338,7 +326,8 @@ void SkiaTextRenderer::DrawUnderline(int x,
SkRect r = SkRect::MakeLTRB(
x_scalar, y + text_size * kUnderlineOffset, x_scalar + width,
y + (text_size *
- (kUnderlineOffset + (thickness_factor * kLineThicknessFactor))));
+ (kUnderlineOffset +
+ (thickness_factor * RenderText::kLineThicknessFactor))));
canvas_skia_->drawRect(r, flags_);
}
@@ -359,7 +348,7 @@ StyleIterator::StyleIterator(const BreakList<SkColor>* colors,
const BreakList<BaselineStyle>* baselines,
const BreakList<int>* font_size_overrides,
const BreakList<Font::Weight>* weights,
- const std::vector<BreakList<bool>>* styles)
+ const StyleArray* styles)
: colors_(colors),
baselines_(baselines),
font_size_overrides_(font_size_overrides),
@@ -370,7 +359,7 @@ StyleIterator::StyleIterator(const BreakList<SkColor>* colors,
font_size_override_ = font_size_overrides_->breaks().begin();
weight_ = weights_->breaks().begin();
for (size_t i = 0; i < styles_->size(); ++i)
- style_.push_back((*styles_)[i].breaks().begin());
+ style_[i] = (*styles_)[i].breaks().begin();
}
StyleIterator::StyleIterator(const StyleIterator& style) = default;
@@ -385,7 +374,7 @@ Range StyleIterator::GetTextBreakingRange() const {
Range range = baselines_->GetRange(baseline_);
range = range.Intersect(font_size_overrides_->GetRange(font_size_override_));
range = range.Intersect(weights_->GetRange(weight_));
- for (size_t i = 0; i < TEXT_STYLE_COUNT; ++i)
+ for (size_t i = 0; i < styles_->size(); ++i)
range = range.Intersect((*styles_)[i].GetRange(style_[i]));
return range;
}
@@ -397,7 +386,7 @@ void StyleIterator::IncrementToPosition(size_t position) {
font_size_override_ = IncrementBreakListIteratorToPosition(
*font_size_overrides_, font_size_override_, position);
weight_ = IncrementBreakListIteratorToPosition(*weights_, weight_, position);
- for (size_t i = 0; i < TEXT_STYLE_COUNT; ++i) {
+ for (size_t i = 0; i < styles_->size(); ++i) {
style_[i] = IncrementBreakListIteratorToPosition((*styles_)[i], style_[i],
position);
}
@@ -439,9 +428,12 @@ void ApplyRenderParams(const FontRenderParams& params,
// static
constexpr base::char16 RenderText::kPasswordReplacementChar;
constexpr bool RenderText::kDragToEndIfOutsideVerticalBounds;
+constexpr SkColor RenderText::kDefaultColor;
+constexpr SkColor RenderText::kDefaultSelectionBackgroundColor;
+constexpr int RenderText::kInvalidBaseline;
+constexpr SkScalar RenderText::kLineThicknessFactor;
-RenderText::~RenderText() {
-}
+RenderText::~RenderText() = default;
// static
std::unique_ptr<RenderText> RenderText::CreateRenderText() {
@@ -475,12 +467,12 @@ void RenderText::SetText(const base::string16& text) {
// Clear style ranges as they might break new text graphemes and apply
// the first style to the whole text instead.
- colors_.SetValue(colors_.breaks().begin()->second);
- baselines_.SetValue(baselines_.breaks().begin()->second);
- font_size_overrides_.SetValue(font_size_overrides_.breaks().begin()->second);
- weights_.SetValue(weights_.breaks().begin()->second);
- for (size_t style = 0; style < TEXT_STYLE_COUNT; ++style)
- styles_[style].SetValue(styles_[style].breaks().begin()->second);
+ colors_.SetValue(colors_.breaks().front().second);
+ baselines_.SetValue(baselines_.breaks().front().second);
+ font_size_overrides_.SetValue(font_size_overrides_.breaks().front().second);
+ weights_.SetValue(weights_.breaks().front().second);
+ for (auto& style : styles_)
+ style.SetValue(style.breaks().front().second);
cached_bounds_and_offset_valid_ = false;
// Reset selection model. SetText should always followed by SetSelectionModel
@@ -500,6 +492,11 @@ void RenderText::AppendText(const base::string16& text) {
UpdateStyleLengths();
cached_bounds_and_offset_valid_ = false;
obscured_reveal_index_ = -1;
+
+ // Invalidate the cached text direction if it depends on the text contents.
+ if (directionality_mode_ == DIRECTIONALITY_FROM_TEXT)
+ text_direction_ = base::i18n::UNKNOWN_DIRECTION;
+
OnTextAttributeChanged();
}
@@ -577,6 +574,13 @@ size_t RenderText::GetNumLines() {
return GetShapedText()->lines().size();
}
+size_t RenderText::GetTextIndexOfLine(size_t line) {
+ const std::vector<internal::Line>& lines = GetShapedText()->lines();
+ if (line >= lines.size())
+ return text_.size();
+ return DisplayIndexToTextIndex(lines[line].display_text_index);
+}
+
void RenderText::SetWordWrapBehavior(WordWrapBehavior behavior) {
if (word_wrap_behavior_ != behavior) {
word_wrap_behavior_ = behavior;
@@ -876,8 +880,17 @@ void RenderText::SetDirectionalityMode(DirectionalityMode mode) {
}
}
+base::i18n::TextDirection RenderText::GetTextDirection() const {
+ if (text_direction_ == base::i18n::UNKNOWN_DIRECTION)
+ text_direction_ = GetTextDirectionForGivenText(text_);
+ return text_direction_;
+}
+
base::i18n::TextDirection RenderText::GetDisplayTextDirection() {
- return GetTextDirection(GetDisplayText());
+ EnsureLayout();
+ if (display_text_direction_ == base::i18n::UNKNOWN_DIRECTION)
+ display_text_direction_ = GetTextDirectionForGivenText(GetDisplayText());
+ return display_text_direction_;
}
VisualCursorDirection RenderText::GetVisualDirectionOfLogicalEnd() {
@@ -1325,37 +1338,7 @@ Range RenderText::GetLineRange(const base::string16& text,
return Range(min_index, max_index);
}
-RenderText::RenderText()
- : horizontal_alignment_(base::i18n::IsRTL() ? ALIGN_RIGHT : ALIGN_LEFT),
- vertical_alignment_(ALIGN_MIDDLE),
- directionality_mode_(DIRECTIONALITY_FROM_TEXT),
- text_direction_(base::i18n::UNKNOWN_DIRECTION),
- cursor_enabled_(true),
- has_directed_selection_(kSelectionIsAlwaysDirected),
- selection_color_(kDefaultColor),
- selection_background_focused_color_(kDefaultSelectionBackgroundColor),
- focused_(false),
- composition_range_(Range::InvalidRange()),
- colors_(kDefaultColor),
- baselines_(NORMAL_BASELINE),
- font_size_overrides_(0),
- weights_(Font::Weight::NORMAL),
- styles_(TEXT_STYLE_COUNT),
- layout_styles_(TEXT_STYLE_COUNT),
- obscured_(false),
- obscured_reveal_index_(-1),
- truncate_length_(0),
- elide_behavior_(NO_ELIDE),
- text_elided_(false),
- min_line_height_(0),
- multiline_(false),
- max_lines_(0),
- word_wrap_behavior_(IGNORE_LONG_WORDS),
- subpixel_rendering_suppressed_(false),
- clip_to_display_rect_(true),
- baseline_(kInvalidBaseline),
- cached_bounds_and_offset_valid_(false),
- strike_thickness_factor_(kLineThicknessFactor) {}
+RenderText::RenderText() = default;
internal::StyleIterator RenderText::GetTextStyleIterator() const {
return internal::StyleIterator(&colors_, &baselines_, &font_size_overrides_,
@@ -1372,13 +1355,13 @@ internal::StyleIterator RenderText::GetLayoutTextStyleIterator() const {
bool RenderText::IsHomogeneous() const {
if (colors().breaks().size() > 1 || baselines().breaks().size() > 1 ||
font_size_overrides().breaks().size() > 1 ||
- weights().breaks().size() > 1)
+ weights().breaks().size() > 1) {
return false;
- for (size_t style = 0; style < TEXT_STYLE_COUNT; ++style) {
- if (styles()[style].breaks().size() > 1)
- return false;
}
- return true;
+
+ return std::none_of(
+ styles().cbegin(), styles().cend(),
+ [](const auto& style) { return style.breaks().size() > 1; });
}
internal::ShapedText* RenderText::GetShapedText() {
@@ -1474,6 +1457,8 @@ void RenderText::EnsureLayoutTextUpdated() const {
layout_text_.clear();
text_to_display_indices_.clear();
+ display_text_direction_ = base::i18n::UNKNOWN_DIRECTION;
+
// Reset the previous layout text attributes. Allocate enough space for
// layout text attributes (upper limit to 2x characters per codepoint). The
// actual size will be updated at the end of the function.
@@ -1577,7 +1562,7 @@ void RenderText::EnsureLayoutTextUpdated() const {
layout_font_size_overrides_.ApplyValue(styles.font_size_override(),
range);
layout_weights_.ApplyValue(styles.weight(), range);
- for (size_t i = 0; i < TEXT_STYLE_COUNT; ++i) {
+ for (size_t i = 0; i < layout_styles_.size(); ++i) {
layout_styles_[i].ApplyValue(styles.style(static_cast<TextStyle>(i)),
range);
}
@@ -1850,53 +1835,44 @@ void RenderText::ApplyTextShadows(internal::SkiaTextRenderer* renderer) {
renderer->SetDrawLooper(CreateShadowDrawLooper(shadows_));
}
-base::i18n::TextDirection RenderText::GetTextDirection(
- const base::string16& text) {
- if (text_direction_ == base::i18n::UNKNOWN_DIRECTION) {
- switch (directionality_mode_) {
- case DIRECTIONALITY_FROM_TEXT:
- // Derive the direction from the display text, which differs from text()
- // in the case of obscured (password) textfields.
- text_direction_ =
- base::i18n::GetFirstStrongCharacterDirection(text);
- break;
- case DIRECTIONALITY_FROM_UI:
- text_direction_ = base::i18n::IsRTL() ? base::i18n::RIGHT_TO_LEFT :
- base::i18n::LEFT_TO_RIGHT;
- break;
- case DIRECTIONALITY_FORCE_LTR:
- text_direction_ = base::i18n::LEFT_TO_RIGHT;
- break;
- case DIRECTIONALITY_FORCE_RTL:
- text_direction_ = base::i18n::RIGHT_TO_LEFT;
- break;
- case DIRECTIONALITY_AS_URL:
- // Rendering as a URL implies left-to-right paragraph direction.
- // URL Standard specifies that a URL "should be rendered as if it were
- // in a left-to-right embedding".
- // https://url.spec.whatwg.org/#url-rendering
- //
- // Consider logical string for domain "ABC.com/hello" (where ABC are
- // Hebrew (RTL) characters). The normal Bidi algorithm renders this as
- // "com/hello.CBA"; by forcing LTR, it is rendered as "CBA.com/hello".
- //
- // Note that this only applies a LTR embedding at the top level; it
- // doesn't change the Bidi algorithm, so there are still some URLs that
- // will render in a confusing order. Consider the logical string
- // "abc.COM/HELLO/world", which will render as "abc.OLLEH/MOC/world".
- // See https://crbug.com/351639.
- //
- // Note that the LeftToRightUrls feature flag enables additional
- // behaviour for DIRECTIONALITY_AS_URL, but the left-to-right embedding
- // behaviour is always enabled, regardless of the flag.
- text_direction_ = base::i18n::LEFT_TO_RIGHT;
- break;
- default:
- NOTREACHED();
- }
+base::i18n::TextDirection RenderText::GetTextDirectionForGivenText(
+ const base::string16& text) const {
+ switch (directionality_mode_) {
+ case DIRECTIONALITY_FROM_TEXT:
+ // Derive the direction from the display text, which differs from text()
+ // in the case of obscured (password) textfields.
+ return base::i18n::GetFirstStrongCharacterDirection(text);
+ case DIRECTIONALITY_FROM_UI:
+ return base::i18n::IsRTL() ? base::i18n::RIGHT_TO_LEFT
+ : base::i18n::LEFT_TO_RIGHT;
+ case DIRECTIONALITY_FORCE_LTR:
+ return base::i18n::LEFT_TO_RIGHT;
+ case DIRECTIONALITY_FORCE_RTL:
+ return base::i18n::RIGHT_TO_LEFT;
+ case DIRECTIONALITY_AS_URL:
+ // Rendering as a URL implies left-to-right paragraph direction.
+ // URL Standard specifies that a URL "should be rendered as if it were
+ // in a left-to-right embedding".
+ // https://url.spec.whatwg.org/#url-rendering
+ //
+ // Consider logical string for domain "ABC.com/hello" (where ABC are
+ // Hebrew (RTL) characters). The normal Bidi algorithm renders this as
+ // "com/hello.CBA"; by forcing LTR, it is rendered as "CBA.com/hello".
+ //
+ // Note that this only applies a LTR embedding at the top level; it
+ // doesn't change the Bidi algorithm, so there are still some URLs that
+ // will render in a confusing order. Consider the logical string
+ // "abc.COM/HELLO/world", which will render as "abc.OLLEH/MOC/world".
+ // See https://crbug.com/351639.
+ //
+ // Note that the LeftToRightUrls feature flag enables additional
+ // behaviour for DIRECTIONALITY_AS_URL, but the left-to-right embedding
+ // behaviour is always enabled, regardless of the flag.
+ return base::i18n::LEFT_TO_RIGHT;
+ default:
+ NOTREACHED();
+ return base::i18n::UNKNOWN_DIRECTION;
}
-
- return text_direction_;
}
void RenderText::UpdateStyleLengths() {
@@ -2041,7 +2017,7 @@ base::string16 RenderText::Elide(const base::string16& text,
// length of text.length(), not text.length()-1.
float lo_width = 0;
float hi_width = text_width;
- const base::i18n::TextDirection text_direction = GetTextDirection(text);
+ const base::i18n::TextDirection text_direction = GetTextDirection();
while (lo <= hi) {
// Linearly interpolate between |lo| and |hi|, which correspond to widths
// of |lo_width| and |hi_width| to estimate at what position
@@ -2100,8 +2076,8 @@ base::string16 RenderText::Elide(const base::string16& text,
// Restore styles and baselines without breaking multi-character graphemes.
render_text->styles_ = styles_;
- for (size_t style = 0; style < TEXT_STYLE_COUNT; ++style)
- RestoreBreakList(render_text.get(), &render_text->styles_[style]);
+ for (auto& style : render_text->styles_)
+ RestoreBreakList(render_text.get(), &style);
RestoreBreakList(render_text.get(), &render_text->baselines_);
RestoreBreakList(render_text.get(), &render_text->font_size_overrides_);
render_text->weights_ = weights_;
@@ -2237,7 +2213,7 @@ internal::GraphemeIterator RenderText::GetGraphemeIteratorAtIndex(
}
void RenderText::DrawSelections(Canvas* canvas,
- const std::vector<Range> selections) {
+ const std::vector<Range>& selections) {
for (auto selection : selections) {
if (!selection.is_empty()) {
for (Rect s : GetSubstringBounds(selection)) {
diff --git a/chromium/ui/gfx/render_text.h b/chromium/ui/gfx/render_text.h
index 8cfbd5c5c4a..9ef49c1dfda 100644
--- a/chromium/ui/gfx/render_text.h
+++ b/chromium/ui/gfx/render_text.h
@@ -9,6 +9,7 @@
#include <stdint.h>
#include <algorithm>
+#include <array>
#include <cstring>
#include <memory>
#include <string>
@@ -91,6 +92,7 @@ struct TextToDisplayIndex {
};
using TextToDisplaySequence = std::vector<TextToDisplayIndex>;
using GraphemeIterator = TextToDisplaySequence::const_iterator;
+using StyleArray = std::array<BreakList<bool>, TEXT_STYLE_COUNT>;
// Internal helper class used to iterate colors, baselines, and styles.
class StyleIterator {
@@ -99,7 +101,7 @@ class StyleIterator {
const BreakList<BaselineStyle>* baselines,
const BreakList<int>* font_size_overrides,
const BreakList<Font::Weight>* weights,
- const std::vector<BreakList<bool>>* styles);
+ const StyleArray* styles);
StyleIterator(const StyleIterator& style);
~StyleIterator();
StyleIterator& operator=(const StyleIterator& style);
@@ -128,13 +130,13 @@ class StyleIterator {
const BreakList<BaselineStyle>* baselines_;
const BreakList<int>* font_size_overrides_;
const BreakList<Font::Weight>* weights_;
- const std::vector<BreakList<bool>>* styles_;
+ const StyleArray* styles_;
BreakList<SkColor>::const_iterator color_;
BreakList<BaselineStyle>::const_iterator baseline_;
BreakList<int>::const_iterator font_size_override_;
BreakList<Font::Weight>::const_iterator weight_;
- std::vector<BreakList<bool>::const_iterator> style_;
+ std::array<BreakList<bool>::const_iterator, TEXT_STYLE_COUNT> style_;
};
// Line segments are slices of the display text to be rendered on a single line.
@@ -172,6 +174,9 @@ struct Line {
// Maximum baseline of all segments on this line.
int baseline;
+
+ // The text index of this line in |text_|.
+ int display_text_index = 0;
};
// Internal class that contains the results of the text layout and shaping.
@@ -217,6 +222,19 @@ class GFX_EXPORT RenderText {
static constexpr bool kSelectionIsAlwaysDirected = true;
#endif
+ // Default color used for the text and cursor.
+ static constexpr SkColor kDefaultColor = SK_ColorBLACK;
+
+ // Default color used for drawing selection background.
+ static constexpr SkColor kDefaultSelectionBackgroundColor = SK_ColorGRAY;
+
+ // Invalid value of baseline. Assigning this value to |baseline_| causes
+ // re-calculation of baseline.
+ static constexpr int kInvalidBaseline = INT_MAX;
+
+ // Default fraction of the text size to use for a strike-through or underline.
+ static constexpr SkScalar kLineThicknessFactor = (SK_Scalar1 / 18);
+
// The character used for displaying obscured text. Use a bullet character.
// TODO(pbos): This is highly font dependent, consider replacing the character
// with a vector glyph.
@@ -298,6 +316,10 @@ class GFX_EXPORT RenderText {
// Returns the actual number of lines, broken by |lines_|.
size_t GetNumLines();
+ // Returns the text index of the given line |line|. Returns the text length
+ // for any |line| above the number of lines.
+ size_t GetTextIndexOfLine(size_t line);
+
// TODO(mukai): ELIDE_LONG_WORDS is not supported.
WordWrapBehavior word_wrap_behavior() const { return word_wrap_behavior_; }
void SetWordWrapBehavior(WordWrapBehavior behavior);
@@ -434,6 +456,8 @@ class GFX_EXPORT RenderText {
DirectionalityMode directionality_mode() const {
return directionality_mode_;
}
+
+ base::i18n::TextDirection GetTextDirection() const;
base::i18n::TextDirection GetDisplayTextDirection();
// Returns the visual movement direction corresponding to the logical
@@ -632,7 +656,7 @@ class GFX_EXPORT RenderText {
return font_size_overrides_;
}
const BreakList<Font::Weight>& weights() const { return weights_; }
- const std::vector<BreakList<bool>>& styles() const { return styles_; }
+ const internal::StyleArray& styles() const { return styles_; }
SkScalar strike_thickness_factor() const { return strike_thickness_factor_; }
const BreakList<SkColor>& layout_colors() const { return layout_colors_; }
@@ -730,7 +754,7 @@ class GFX_EXPORT RenderText {
// Draw all text and make the given ranges appear selected.
virtual void DrawVisualText(internal::SkiaTextRenderer* renderer,
- const std::vector<Range> selections) = 0;
+ const std::vector<Range>& selections) = 0;
// Update the display text.
void UpdateDisplayText(float text_width);
@@ -756,7 +780,8 @@ class GFX_EXPORT RenderText {
// Get the text direction for the current directionality mode and given
// |text|.
- base::i18n::TextDirection GetTextDirection(const base::string16& text);
+ base::i18n::TextDirection GetTextDirectionForGivenText(
+ const base::string16& text) const;
// Adjust ranged styles to accommodate a new |text_| length.
void UpdateStyleLengths();
@@ -821,7 +846,7 @@ class GFX_EXPORT RenderText {
void UpdateCachedBoundsAndOffset();
// Draws the specified ranges of text with a selected appearance.
- void DrawSelections(Canvas* canvas, const std::vector<Range> selections);
+ void DrawSelections(Canvas* canvas, const std::vector<Range>& selections);
// Returns a grapheme iterator that contains the codepoint at |index|.
internal::GraphemeIterator GetGraphemeIteratorAtIndex(
@@ -857,18 +882,22 @@ class GFX_EXPORT RenderText {
// Horizontal alignment of the text with respect to |display_rect_|. The
// default is to align left if the application UI is LTR and right if RTL.
- HorizontalAlignment horizontal_alignment_;
+ HorizontalAlignment horizontal_alignment_{base::i18n::IsRTL() ? ALIGN_RIGHT
+ : ALIGN_LEFT};
// Vertical alignment of the text with respect to |display_rect_|. Only
// applicable when |multiline_| is true. The default is to align center.
- VerticalAlignment vertical_alignment_;
+ VerticalAlignment vertical_alignment_ = ALIGN_MIDDLE;
// The text directionality mode, defaults to DIRECTIONALITY_FROM_TEXT.
- DirectionalityMode directionality_mode_;
+ DirectionalityMode directionality_mode_ = DIRECTIONALITY_FROM_TEXT;
// The cached text direction, potentially computed from the text or UI locale.
// Use GetTextDirection(), do not use this potentially invalid value directly!
- base::i18n::TextDirection text_direction_;
+ mutable base::i18n::TextDirection text_direction_ =
+ base::i18n::UNKNOWN_DIRECTION;
+ mutable base::i18n::TextDirection display_text_direction_ =
+ base::i18n::UNKNOWN_DIRECTION;
// A list of fonts used to render |text_|.
FontList font_list_;
@@ -881,19 +910,20 @@ class GFX_EXPORT RenderText {
// Specifies whether the cursor is enabled. If disabled, no space is reserved
// for the cursor when positioning text.
- bool cursor_enabled_;
+ bool cursor_enabled_ = true;
// Whether the current selection has a known direction. That is, whether a
// directional input (e.g. arrow key) has been received for the current
// selection to indicate which end of the selection has the caret. When true,
// directed inputs preserve (rather than replace) the selection affinity.
- bool has_directed_selection_;
+ bool has_directed_selection_ = kSelectionIsAlwaysDirected;
// The color used for drawing selected text.
- SkColor selection_color_;
+ SkColor selection_color_ = kDefaultColor;
// The background color used for drawing the selection when focused.
- SkColor selection_background_focused_color_;
+ SkColor selection_background_focused_color_ =
+ kDefaultSelectionBackgroundColor;
// Whether the selection visual bounds should be expanded vertically to be
// vertically symmetric with respect to the display rect. Note this flag has
@@ -901,25 +931,25 @@ class GFX_EXPORT RenderText {
bool symmetric_selection_visual_bounds_ = false;
// The focus state of the text.
- bool focused_;
+ bool focused_ = false;
// Composition text range.
- Range composition_range_;
+ Range composition_range_ = Range::InvalidRange();
// Color, baseline, and style breaks, used to modify ranges of text.
// BreakList positions are stored with text indices, not display indices.
// TODO(msw): Expand to support cursor, selection, background, etc. colors.
- BreakList<SkColor> colors_;
- BreakList<BaselineStyle> baselines_;
- BreakList<int> font_size_overrides_;
- BreakList<Font::Weight> weights_;
- std::vector<BreakList<bool>> styles_;
+ BreakList<SkColor> colors_{kDefaultColor};
+ BreakList<BaselineStyle> baselines_{NORMAL_BASELINE};
+ BreakList<int> font_size_overrides_{0};
+ BreakList<Font::Weight> weights_{Font::Weight::NORMAL};
+ internal::StyleArray styles_;
mutable BreakList<SkColor> layout_colors_;
mutable BreakList<BaselineStyle> layout_baselines_;
mutable BreakList<int> layout_font_size_overrides_;
mutable BreakList<Font::Weight> layout_weights_;
- mutable std::vector<BreakList<bool>> layout_styles_;
+ mutable internal::StyleArray layout_styles_;
// A mapping from text to display text indices for each grapheme. The vector
// contains an ordered sequence of indice pairs. Both sequence |text_index|
@@ -927,12 +957,12 @@ class GFX_EXPORT RenderText {
mutable internal::TextToDisplaySequence text_to_display_indices_;
// A flag to obscure actual text with asterisks for password fields.
- bool obscured_;
+ bool obscured_ = false;
// The index at which the char should be revealed in the obscured text.
- int obscured_reveal_index_;
+ int obscured_reveal_index_ = -1;
// The maximum length of text to display, 0 forgoes a hard limit.
- size_t truncate_length_;
+ size_t truncate_length_ = 0;
// The obscured and/or truncated text used to layout the text to display.
mutable base::string16 layout_text_;
@@ -945,31 +975,31 @@ class GFX_EXPORT RenderText {
mutable base::string16 display_text_;
// The behavior for eliding, fading, or truncating.
- ElideBehavior elide_behavior_;
+ ElideBehavior elide_behavior_ = NO_ELIDE;
// The behavior for eliding whitespace when eliding or truncating.
- base::Optional<bool> whitespace_elision_ = base::nullopt;
+ base::Optional<bool> whitespace_elision_;
// True if the text is elided given the current behavior and display area.
- bool text_elided_;
+ bool text_elided_ = false;
// The minimum height a line should have.
- int min_line_height_;
+ int min_line_height_ = 0;
// Whether the text should be broken into multiple lines. Uses the width of
// |display_rect_| as the width cap.
- bool multiline_;
+ bool multiline_ = false;
// If multiple lines, the maximum number of lines to render, or 0.
- size_t max_lines_;
+ size_t max_lines_ = 0;
// The wrap behavior when the text is broken into lines. Do nothing unless
// |multiline_| is set. The default value is IGNORE_LONG_WORDS.
- WordWrapBehavior word_wrap_behavior_;
+ WordWrapBehavior word_wrap_behavior_ = IGNORE_LONG_WORDS;
// Set to true to suppress subpixel rendering due to non-font reasons (eg.
// if the background is transparent). The default value is false.
- bool subpixel_rendering_suppressed_;
+ bool subpixel_rendering_suppressed_ = false;
// The local display area for rendering the text.
Rect display_rect_;
@@ -978,7 +1008,7 @@ class GFX_EXPORT RenderText {
// that results in incorrect clipping when drawing to the document margins.
// This field allows disabling clipping to work around the issue.
// TODO(asvitkine): Remove this when the underlying Skia bug is fixed.
- bool clip_to_display_rect_;
+ bool clip_to_display_rect_ = true;
// The offset for the text to be drawn, relative to the display area.
// Get this point with GetUpdatedDisplayOffset (or risk using a stale value).
@@ -987,11 +1017,11 @@ class GFX_EXPORT RenderText {
// The baseline of the text. This is determined from the height of the
// display area and the cap height of the font list so the text is vertically
// centered.
- int baseline_;
+ int baseline_ = kInvalidBaseline;
// The cached bounds and offset are invalidated by changes to the cursor,
// selection, font, and other operations that adjust the visible text bounds.
- bool cached_bounds_and_offset_valid_;
+ bool cached_bounds_and_offset_valid_ = false;
// Text shadows to be drawn.
ShadowValues shadows_;
@@ -1004,7 +1034,7 @@ class GFX_EXPORT RenderText {
std::unique_ptr<internal::ShapedText> shaped_text_;
// The ratio of strike-through line thickness to text height.
- SkScalar strike_thickness_factor_;
+ SkScalar strike_thickness_factor_ = kLineThicknessFactor;
// Extra spacing placed between glyphs; used only for obscured text styling.
int obscured_glyph_spacing_ = 0;
diff --git a/chromium/ui/gfx/render_text_api_fuzzer.cc b/chromium/ui/gfx/render_text_api_fuzzer.cc
index 834a6fc8092..fc642e160bf 100644
--- a/chromium/ui/gfx/render_text_api_fuzzer.cc
+++ b/chromium/ui/gfx/render_text_api_fuzzer.cc
@@ -9,6 +9,7 @@
#include "base/at_exit.h"
#include "base/command_line.h"
#include "base/i18n/icu_util.h"
+#include "base/logging.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/task_environment.h"
#include "base/test/test_timeouts.h"
diff --git a/chromium/ui/gfx/render_text_fuzzer.cc b/chromium/ui/gfx/render_text_fuzzer.cc
index a4b430d3aa7..9ce8bc6680d 100644
--- a/chromium/ui/gfx/render_text_fuzzer.cc
+++ b/chromium/ui/gfx/render_text_fuzzer.cc
@@ -5,6 +5,7 @@
#include "base/at_exit.h"
#include "base/command_line.h"
#include "base/i18n/icu_util.h"
+#include "base/logging.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/task_environment.h"
#include "base/test/test_timeouts.h"
diff --git a/chromium/ui/gfx/render_text_harfbuzz.cc b/chromium/ui/gfx/render_text_harfbuzz.cc
index 540c1fc200f..64d00af2c83 100644
--- a/chromium/ui/gfx/render_text_harfbuzz.cc
+++ b/chromium/ui/gfx/render_text_harfbuzz.cc
@@ -485,6 +485,14 @@ class HarfBuzzLineBreaker {
// Finishes line breaking and outputs the results. Can be called at most once.
void FinalizeLines(std::vector<internal::Line>* lines, SizeF* size) {
DCHECK(!lines_.empty());
+ // If the last character of the text is a new line character, then the last
+ // line is any empty string, which contains no segments. This means that the
+ // display_text_index will not have been set in AdvanceLine. So here, set
+ // display_text_index to the text length, which is the true text index of
+ // the final line.
+ internal::Line* line = &lines_.back();
+ if (line->display_text_index == 0)
+ line->display_text_index = text_.size();
// Add an empty line to finish the line size calculation and remove it.
AdvanceLine();
lines_.pop_back();
@@ -505,6 +513,11 @@ class HarfBuzzLineBreaker {
void AdvanceLine() {
if (!lines_.empty()) {
internal::Line* line = &lines_.back();
+ // Compute the line start while the line segments are in the logical order
+ // so that the start of the line is the start of the char range,
+ // regardless of i18n.
+ if (!line->segments.empty())
+ line->display_text_index = line->segments[0].char_range.start();
std::sort(line->segments.begin(), line->segments.end(),
[this](const internal::LineSegment& s1,
const internal::LineSegment& s2) -> bool {
@@ -1685,7 +1698,7 @@ void RenderTextHarfBuzz::EnsureLayout() {
}
void RenderTextHarfBuzz::DrawVisualText(internal::SkiaTextRenderer* renderer,
- const std::vector<Range> selections) {
+ const std::vector<Range>& selections) {
DCHECK(!update_layout_run_list_);
DCHECK(!update_display_run_list_);
DCHECK(!update_display_text_);
@@ -1834,7 +1847,7 @@ void RenderTextHarfBuzz::ItemizeTextToRuns(
// to misbehave since they expect non-zero text metrics from a non-empty text.
ui::gfx::BiDiLineIterator bidi_iterator;
- if (!bidi_iterator.Open(text, GetTextDirection(text))) {
+ if (!bidi_iterator.Open(text, GetTextDirectionForGivenText(text))) {
auto run = std::make_unique<internal::TextRunHarfBuzz>(
font_list().GetPrimaryFont());
run->range = Range(0, text.length());
diff --git a/chromium/ui/gfx/render_text_harfbuzz.h b/chromium/ui/gfx/render_text_harfbuzz.h
index d6ae49ec29b..00e51764481 100644
--- a/chromium/ui/gfx/render_text_harfbuzz.h
+++ b/chromium/ui/gfx/render_text_harfbuzz.h
@@ -229,7 +229,7 @@ class GFX_EXPORT RenderTextHarfBuzz : public RenderText {
void OnDisplayTextAttributeChanged() override;
void EnsureLayout() override;
void DrawVisualText(internal::SkiaTextRenderer* renderer,
- const std::vector<Range> selections) override;
+ const std::vector<Range>& selections) override;
private:
friend class test::RenderTextTestApi;
diff --git a/chromium/ui/gfx/render_text_test_api.h b/chromium/ui/gfx/render_text_test_api.h
index 1bffccea4a9..3111f1d494c 100644
--- a/chromium/ui/gfx/render_text_test_api.h
+++ b/chromium/ui/gfx/render_text_test_api.h
@@ -60,9 +60,7 @@ class RenderTextTestApi {
return render_text_->weights();
}
- const std::vector<BreakList<bool>>& styles() const {
- return render_text_->styles();
- }
+ const internal::StyleArray& styles() const { return render_text_->styles(); }
const std::vector<internal::Line>& lines() const {
return render_text_->GetShapedText()->lines();
diff --git a/chromium/ui/gfx/render_text_unittest.cc b/chromium/ui/gfx/render_text_unittest.cc
index 092e40ae6e9..2fd63b1b75f 100644
--- a/chromium/ui/gfx/render_text_unittest.cc
+++ b/chromium/ui/gfx/render_text_unittest.cc
@@ -72,6 +72,9 @@ const char kLtrRtlLtr[] = "a\u05d1b";
const char kRtlLtr[] = "\u05d0\u05d1a";
const char kRtlLtrRtl[] = "\u05d0a\u05d1";
+constexpr bool kUseWordWrap = true;
+constexpr bool kUseObscuredText = true;
+
// Bitmasks based on gfx::TextStyle.
enum {
ITALIC_MASK = 1 << TEXT_STYLE_ITALIC,
@@ -2194,7 +2197,7 @@ TEST_F(RenderTextTest, MultilineElideBiDi) {
render_text->SetMaxLines(2);
render_text->SetElideBehavior(ELIDE_TAIL);
render_text->SetDisplayRect(Rect(30, 0));
- render_text->GetStringSize();
+ test_api()->EnsureLayout();
EXPECT_EQ(render_text->GetDisplayText(),
UTF8ToUTF16("אa\nbcdבג") + base::string16(kEllipsisUTF16));
@@ -2890,6 +2893,94 @@ TEST_F(RenderTextTest, MoveCursor_UpDown_Cache) {
&expected_range);
}
+TEST_F(RenderTextTest, GetTextDirectionInvalidation) {
+ RenderText* render_text = GetRenderText();
+ ASSERT_EQ(render_text->directionality_mode(), DIRECTIONALITY_FROM_TEXT);
+
+ const base::i18n::TextDirection original_text_direction =
+ render_text->GetTextDirection();
+
+ render_text->SetText(ASCIIToUTF16("a"));
+ EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetTextDirection());
+
+ render_text->SetText(WideToUTF16(L"\u05d0"));
+ EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, render_text->GetTextDirection());
+
+ // The codepoints u+2026 (ellipsis) has no strong direction.
+ render_text->SetText(WideToUTF16(L"\u2026"));
+ EXPECT_EQ(original_text_direction, render_text->GetTextDirection());
+ render_text->AppendText(ASCIIToUTF16("a"));
+ EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetTextDirection());
+
+ render_text->SetText(WideToUTF16(L"\u2026"));
+ EXPECT_EQ(original_text_direction, render_text->GetTextDirection());
+ render_text->AppendText(WideToUTF16(L"\u05d0"));
+ EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, render_text->GetTextDirection());
+}
+
+TEST_F(RenderTextTest, GetDisplayTextDirectionInvalidation) {
+ RenderText* render_text = GetRenderText();
+ ASSERT_EQ(render_text->directionality_mode(), DIRECTIONALITY_FROM_TEXT);
+
+ const base::i18n::TextDirection original_text_direction =
+ render_text->GetDisplayTextDirection();
+
+ render_text->SetText(ASCIIToUTF16("a"));
+ EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetDisplayTextDirection());
+
+ render_text->SetText(WideToUTF16(L"\u05d0"));
+ EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, render_text->GetDisplayTextDirection());
+
+ // The codepoints u+2026 (ellipsis) has no strong direction.
+ render_text->SetText(WideToUTF16(L"\u2026"));
+ EXPECT_EQ(original_text_direction, render_text->GetDisplayTextDirection());
+ render_text->AppendText(ASCIIToUTF16("a"));
+ EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetDisplayTextDirection());
+
+ render_text->SetText(WideToUTF16(L"\u2026"));
+ EXPECT_EQ(original_text_direction, render_text->GetDisplayTextDirection());
+ render_text->AppendText(WideToUTF16(L"\u05d0"));
+ EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, render_text->GetDisplayTextDirection());
+}
+
+TEST_F(RenderTextTest, GetTextDirectionWithDifferentDirection) {
+ SetGlyphWidth(10);
+ RenderText* render_text = GetRenderText();
+ ASSERT_EQ(render_text->directionality_mode(), DIRECTIONALITY_FROM_TEXT);
+ render_text->SetWhitespaceElision(false);
+ render_text->SetText(WideToUTF16(L"123\u0638xyz"));
+ render_text->SetElideBehavior(ELIDE_HEAD);
+ render_text->SetDisplayRect(Rect(25, 100));
+
+ // The elided text is an ellipsis with neutral directionality, and a 'z' with
+ // a strong LTR directionality.
+ EXPECT_EQ(WideToUTF16(L"\u2026z"), render_text->GetDisplayText());
+ EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, render_text->GetTextDirection());
+ EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetDisplayTextDirection());
+}
+
+TEST_F(RenderTextTest, DirectionalityInvalidation) {
+ RenderText* render_text = GetRenderText();
+ ASSERT_EQ(render_text->directionality_mode(), DIRECTIONALITY_FROM_TEXT);
+
+ // The codepoints u+2026 (ellipsis) has weak directionality.
+ render_text->SetText(WideToUTF16(L"\u2026"));
+ const base::i18n::TextDirection original_text_direction =
+ render_text->GetTextDirection();
+
+ render_text->SetDirectionalityMode(DIRECTIONALITY_FORCE_LTR);
+ EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetTextDirection());
+ EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetDisplayTextDirection());
+
+ render_text->SetDirectionalityMode(DIRECTIONALITY_FORCE_RTL);
+ EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, render_text->GetTextDirection());
+ EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, render_text->GetDisplayTextDirection());
+
+ render_text->SetDirectionalityMode(DIRECTIONALITY_FROM_TEXT);
+ EXPECT_EQ(original_text_direction, render_text->GetTextDirection());
+ EXPECT_EQ(original_text_direction, render_text->GetDisplayTextDirection());
+}
+
TEST_F(RenderTextTest, GetDisplayTextDirection) {
struct {
const char* text;
@@ -2946,6 +3037,96 @@ TEST_F(RenderTextTest, GetDisplayTextDirection) {
EXPECT_EQ(render_text->GetDisplayTextDirection(), base::i18n::RIGHT_TO_LEFT);
}
+struct GetTextIndexOfLineCase {
+ const char* test_name;
+ const wchar_t* const text;
+ const std::vector<size_t> line_breaks;
+ const bool set_word_wrap = false;
+ const bool set_obscured = false;
+};
+
+class RenderTextTestWithGetTextIndexOfLineCase
+ : public RenderTextTest,
+ public ::testing::WithParamInterface<GetTextIndexOfLineCase> {
+ public:
+ static std::string ParamInfoToString(
+ ::testing::TestParamInfo<GetTextIndexOfLineCase> param_info) {
+ return param_info.param.test_name;
+ }
+};
+
+TEST_P(RenderTextTestWithGetTextIndexOfLineCase, GetTextIndexOfLine) {
+ GetTextIndexOfLineCase param = GetParam();
+ RenderText* render_text = GetRenderText();
+ render_text->SetMultiline(true);
+ SetGlyphWidth(10);
+ if (param.set_word_wrap) {
+ render_text->SetDisplayRect(Rect(1, 1000));
+ render_text->SetWordWrapBehavior(WRAP_LONG_WORDS);
+ }
+ render_text->SetObscured(param.set_obscured);
+ render_text->SetText(base::WideToUTF16(param.text));
+ for (size_t i = 0; i < param.line_breaks.size(); ++i) {
+ EXPECT_EQ(param.line_breaks[i], render_text->GetTextIndexOfLine(i));
+ }
+}
+
+const GetTextIndexOfLineCase kGetTextIndexOfLineCases[] = {
+ {"emptyString", L"", {0}},
+ // The following test strings are three character strings.
+ // The word wrap makes each character fall on a new line.
+ {"kWeak_minWidth", L" . ", {0, 1, 2}, kUseWordWrap},
+ {"kLtr_minWidth", L"abc", {0, 1, 2}, kUseWordWrap},
+ {"kLtrRtl_minWidth", L"a\u05d0\u05d1", {0, 1, 2}, kUseWordWrap},
+ {"kLtrRtlLtr_minWidth", L"a\u05d1b", {0, 1, 2}, kUseWordWrap},
+ {"kRtl_minWidth", L"\u05d0\u05d1\u05d2", {0, 1, 2}, kUseWordWrap},
+ {"kRtlLtr_minWidth", L"\u05d0\u05d1a", {0, 1, 2}, kUseWordWrap},
+ {"kRtlLtrRtl_minWidth", L"\u05d0a\u05d1", {0, 1, 2}, kUseWordWrap},
+ // The following test strings have 2 graphemes separated by a newline.
+ // The obscured text replace each grapheme by a single codepoint.
+ {"grapheme_unobscured",
+ L"\U0001F601\n\U0001F468\u200D\u2708\uFE0F\nx",
+ {0, 3, 9}},
+ {"grapheme_obscured",
+ L"\U0001F601\n\U0001F468\u200D\u2708\uFE0F\nx",
+ {0, 3, 9},
+ !kUseWordWrap,
+ kUseObscuredText},
+ // The following test strings have a new line character.
+ {"basic_newLine", L"abc\ndef", {0, 4}},
+ {"basic_newLineWindows", L"abc\r\ndef", {0, 5}},
+ {"spaces_newLine", L"a \n b ", {0, 3}},
+ {"spaces_newLineWindows", L"a \r\n b ", {0, 4}},
+ {"double_newLine", L"a\n\nb", {0, 2, 3}},
+ {"double_newLineWindows", L"a\r\n\r\nb", {0, 3, 5}},
+ {"start_newLine", L"\nab", {0, 1}},
+ {"start_newLineWindows", L"\r\nab", {0, 2}},
+ {"end_newLine", L"ab\n", {0}},
+ {"end_newLineWindows", L"ab\r\n", {0}},
+ {"isolated_newLine", L"\n", {0}},
+ {"isolated_newLineWindows", L"\r\n", {0}},
+ {"isolatedDouble_newLine", L"\n\n", {0, 1}},
+ {"isolatedDouble_newLineWindows", L"\r\n\r\n", {0, 2}},
+ // The following test strings have unicode characters.
+ {"playSymbol_unicode", L"x\n\u25B6\ny", {0, 2, 4}},
+ {"emoji_unicode", L"x\n\U0001F601\ny\n\u2728\nz", {0, 2, 5, 7, 9}},
+ {"flag_unicode", L"🇬🇧\n🇯🇵", {0, 5}, false, false},
+ // The following cases test that GetTextIndexOfLine returns the length of
+ // the text when passed a line index larger than the number of lines.
+ {"basic_outsideRange", L"abc", {0, 1, 2, 3, 3}, kUseWordWrap},
+ {"emptyString_outsideRange", L"", {0, 0, 0}},
+ {"newLine_outsideRange", L"\n", {0, 1, 1}},
+ {"newLineWindows_outsideRange", L"\r\n", {0, 2, 2, 2}},
+ {"doubleNewLine_outsideRange", L"\n\n", {0, 1, 2, 2}},
+ {"doubleNewLineWindows_outsideRange", L"\r\n\r\n", {0, 2, 4, 4}},
+};
+
+INSTANTIATE_TEST_SUITE_P(
+ GetTextIndexOfLine,
+ RenderTextTestWithGetTextIndexOfLineCase,
+ ::testing::ValuesIn(kGetTextIndexOfLineCases),
+ RenderTextTestWithGetTextIndexOfLineCase::ParamInfoToString);
+
TEST_F(RenderTextTest, MoveCursorLeftRightInLtr) {
RenderText* render_text = GetRenderText();
// Pure LTR.
@@ -5963,8 +6144,8 @@ TEST_F(RenderTextTest, EmojiFlagGlyphCount) {
const internal::TextRunList* run_list = GetHarfBuzzRunList();
ASSERT_EQ(1U, run_list->runs().size());
-#if defined(OS_MACOSX)
- // On Mac, the flags should be found, so two glyphs result.
+#if defined(OS_LINUX) || defined(OS_MACOSX)
+ // On Linux and macOS, the flags should be found, so two glyphs result.
EXPECT_EQ(2u, run_list->runs()[0]->shape.glyph_count);
#elif defined(OS_ANDROID)
// It seems that some versions of android support the flags. Older versions
diff --git a/chromium/ui/gfx/rrect_f.cc b/chromium/ui/gfx/rrect_f.cc
index c9b643ca2f9..c58e0cfdad4 100644
--- a/chromium/ui/gfx/rrect_f.cc
+++ b/chromium/ui/gfx/rrect_f.cc
@@ -128,7 +128,7 @@ void RRectF::Scale(float x_scale, float y_scale) {
skrrect_ = SkRRect::MakeEmpty();
return;
}
- SkMatrix scale = SkMatrix::MakeScale(x_scale, y_scale);
+ SkMatrix scale = SkMatrix::Scale(x_scale, y_scale);
SkRRect result;
bool success = skrrect_.transform(scale, &result);
DCHECK(success);
diff --git a/chromium/ui/gfx/selection_model.cc b/chromium/ui/gfx/selection_model.cc
index e91342bda1e..a792731f0fc 100644
--- a/chromium/ui/gfx/selection_model.cc
+++ b/chromium/ui/gfx/selection_model.cc
@@ -6,8 +6,8 @@
#include <ostream>
+#include "base/check.h"
#include "base/format_macros.h"
-#include "base/logging.h"
#include "base/strings/stringprintf.h"
namespace gfx {
diff --git a/chromium/ui/gfx/swap_result.cc b/chromium/ui/gfx/swap_result.cc
new file mode 100644
index 00000000000..f5c91451939
--- /dev/null
+++ b/chromium/ui/gfx/swap_result.cc
@@ -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.
+
+#include "ui/gfx/swap_result.h"
+
+#include "ui/gfx/ca_layer_params.h"
+#include "ui/gfx/gpu_fence.h"
+
+namespace gfx {
+
+SwapCompletionResult::SwapCompletionResult(gfx::SwapResult swap_result)
+ : swap_result(swap_result) {}
+
+SwapCompletionResult::SwapCompletionResult(
+ gfx::SwapResult swap_result,
+ std::unique_ptr<gfx::GpuFence> gpu_fence)
+ : swap_result(swap_result), gpu_fence(std::move(gpu_fence)) {}
+
+SwapCompletionResult::SwapCompletionResult(
+ gfx::SwapResult swap_result,
+ std::unique_ptr<gfx::CALayerParams> ca_layer_params)
+ : swap_result(swap_result), ca_layer_params(std::move(ca_layer_params)) {}
+
+SwapCompletionResult::SwapCompletionResult(SwapCompletionResult&& other) =
+ default;
+SwapCompletionResult::~SwapCompletionResult() = default;
+
+} // namespace gfx
diff --git a/chromium/ui/gfx/swap_result.h b/chromium/ui/gfx/swap_result.h
index 027a1914ae7..1a71e4ec174 100644
--- a/chromium/ui/gfx/swap_result.h
+++ b/chromium/ui/gfx/swap_result.h
@@ -5,10 +5,16 @@
#ifndef UI_GFX_SWAP_RESULT_H_
#define UI_GFX_SWAP_RESULT_H_
+#include <memory>
+
#include "base/time/time.h"
+#include "ui/gfx/gfx_export.h"
namespace gfx {
+struct CALayerParams;
+class GpuFence;
+
enum class SwapResult {
SWAP_ACK,
SWAP_FAILED,
@@ -38,12 +44,32 @@ struct SwapResponse {
uint64_t swap_id;
// Indicates whether the swap succeeded or not.
+ // TODO(https://crbug.com/894929): It may be more reasonable to add
+ // a full SwapCompletionResult as a member.
SwapResult result;
// Timing information about the given swap.
SwapTimings timings;
};
+// Sent by GLImages to their GLImage::SwapCompletionCallbacks.
+struct GFX_EXPORT SwapCompletionResult {
+ explicit SwapCompletionResult(gfx::SwapResult swap_result);
+ SwapCompletionResult(gfx::SwapResult swap_result,
+ std::unique_ptr<gfx::GpuFence> gpu_fence);
+ SwapCompletionResult(gfx::SwapResult swap_result,
+ std::unique_ptr<gfx::CALayerParams> ca_layer_params);
+ SwapCompletionResult(SwapCompletionResult&& other);
+ ~SwapCompletionResult();
+
+ SwapCompletionResult(const SwapCompletionResult& other) = delete;
+ SwapCompletionResult& operator=(const SwapCompletionResult other) = delete;
+
+ gfx::SwapResult swap_result = SwapResult::SWAP_FAILED;
+ std::unique_ptr<GpuFence> gpu_fence;
+ std::unique_ptr<CALayerParams> ca_layer_params;
+};
+
} // namespace gfx
#endif // UI_GFX_SWAP_RESULT_H_
diff --git a/chromium/ui/gfx/switches.cc b/chromium/ui/gfx/switches.cc
index 0f746ead72a..16eeda0d910 100644
--- a/chromium/ui/gfx/switches.cc
+++ b/chromium/ui/gfx/switches.cc
@@ -16,6 +16,10 @@ const char kAnimationDurationScale[] = "animation-duration-scale";
const char kDisableFontSubpixelPositioning[] =
"disable-font-subpixel-positioning";
+// Disable a NV12 format buffer allocation with
+// gfx::BufferUsage::SCANOUT_CPU_READ_WRITE usage.
+const char kDisableYuv420Biplanar[] = "disable-yuv420-biplanar";
+
// Enable native CPU-mappable GPU memory buffer support on Linux.
const char kEnableNativeGpuMemoryBuffers[] = "enable-native-gpu-memory-buffers";
diff --git a/chromium/ui/gfx/switches.h b/chromium/ui/gfx/switches.h
index abe0a58a9cc..fa86fc52621 100644
--- a/chromium/ui/gfx/switches.h
+++ b/chromium/ui/gfx/switches.h
@@ -12,10 +12,10 @@ namespace switches {
GFX_SWITCHES_EXPORT extern const char kAnimationDurationScale[];
GFX_SWITCHES_EXPORT extern const char kDisableFontSubpixelPositioning[];
+GFX_SWITCHES_EXPORT extern const char kDisableYuv420Biplanar[];
GFX_SWITCHES_EXPORT extern const char kEnableNativeGpuMemoryBuffers[];
GFX_SWITCHES_EXPORT extern const char kForcePrefersReducedMotion[];
GFX_SWITCHES_EXPORT extern const char kHeadless[];
-
} // namespace switches
#endif // UI_GFX_SWITCHES_H_
diff --git a/chromium/ui/gfx/system_fonts_win.cc b/chromium/ui/gfx/system_fonts_win.cc
index 5454e39befe..58b498b8144 100644
--- a/chromium/ui/gfx/system_fonts_win.cc
+++ b/chromium/ui/gfx/system_fonts_win.cc
@@ -7,6 +7,7 @@
#include <windows.h>
#include "base/containers/flat_map.h"
+#include "base/logging.h"
#include "base/no_destructor.h"
#include "base/strings/sys_string_conversions.h"
#include "base/trace_event/trace_event.h"
diff --git a/chromium/ui/gfx/text_utils.cc b/chromium/ui/gfx/text_utils.cc
index fa062ea8972..dba839e87eb 100644
--- a/chromium/ui/gfx/text_utils.cc
+++ b/chromium/ui/gfx/text_utils.cc
@@ -11,6 +11,10 @@
#include "base/numerics/safe_conversions.h"
#include "third_party/icu/source/common/unicode/uchar.h"
#include "third_party/icu/source/common/unicode/utf16.h"
+#include "ui/gfx/font_list.h"
+#include "ui/gfx/geometry/insets.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/size.h"
namespace gfx {
@@ -126,4 +130,36 @@ HorizontalAlignment MaybeFlipForRTL(HorizontalAlignment alignment) {
return alignment;
}
+Size GetStringSize(const base::string16& text, const FontList& font_list) {
+ return Size(GetStringWidth(text, font_list), font_list.GetHeight());
+}
+
+Insets AdjustVisualBorderForFont(const FontList& font_list,
+ const Insets& desired_visual_padding) {
+ Insets result = desired_visual_padding;
+ const int baseline = font_list.GetBaseline();
+ const int leading_space = baseline - font_list.GetCapHeight();
+ const int descender = font_list.GetHeight() - baseline;
+ result.set_top(std::max(0, result.top() - leading_space));
+ result.set_bottom(std::max(0, result.bottom() - descender));
+ return result;
+}
+
+int GetFontCapHeightCenterOffset(const gfx::FontList& original_font,
+ const gfx::FontList& to_center) {
+ const int original_cap_height = original_font.GetCapHeight();
+ const int original_cap_leading =
+ original_font.GetBaseline() - original_cap_height;
+ const int to_center_cap_height = to_center.GetCapHeight();
+ const int to_center_leading = to_center.GetBaseline() - to_center_cap_height;
+
+ const int cap_height_diff = original_cap_height - to_center_cap_height;
+ const int new_cap_top =
+ original_cap_leading + std::lround(cap_height_diff / 2.0f);
+ const int new_top = new_cap_top - to_center_leading;
+
+ // Since we assume the old font starts at zero, the new top is the adjustment.
+ return new_top;
+}
+
} // namespace gfx
diff --git a/chromium/ui/gfx/text_utils.h b/chromium/ui/gfx/text_utils.h
index 4b6b5cae13e..ea342ee5a8c 100644
--- a/chromium/ui/gfx/text_utils.h
+++ b/chromium/ui/gfx/text_utils.h
@@ -14,6 +14,8 @@
namespace gfx {
class FontList;
+class Insets;
+class Size;
// Strip the accelerator char (typically '&') from a menu string. A double
// accelerator char ('&&') will be converted to a single char. The out params
@@ -31,6 +33,12 @@ GFX_EXPORT base::string16 RemoveAcceleratorChar(const base::string16& s,
GFX_EXPORT int GetStringWidth(const base::string16& text,
const FontList& font_list);
+// Returns the size required to render |text| in |font_list|. This includes all
+// leading space, descender area, etc. even if the text to render does not
+// contain characters with ascenders or descenders.
+GFX_EXPORT Size GetStringSize(const base::string16& text,
+ const FontList& font_list);
+
// This is same as GetStringWidth except that fractional width is returned.
GFX_EXPORT float GetStringWidthF(const base::string16& text,
const FontList& font_list);
@@ -50,6 +58,72 @@ GFX_EXPORT size_t FindValidBoundaryAfter(const base::string16& text,
// If the UI layout is right-to-left, flip the alignment direction.
GFX_EXPORT HorizontalAlignment MaybeFlipForRTL(HorizontalAlignment alignment);
+// Returns insets that can be used to draw a highlight or border that appears to
+// be distance |desired_visual_padding| from the body of a string of text
+// rendered using |font_list|. The insets are adjusted based on the box used to
+// render capital letters (or the bodies of most letters in non-capital fonts
+// like Hebrew and Devanagari), in order to give the best visual appearance.
+//
+// That is, any portion of |desired_visual_padding| overlapping the font's
+// leading space or descender area are truncated, to a minimum of zero.
+//
+// In this example, the text is rendered in a highlight that stretches above and
+// below the height of the H as well as to the left and right of the text
+// (|desired_visual_padding| = {2, 2, 2, 2}). Note that the descender of the 'y'
+// overlaps with the padding, as it is outside the capital letter box.
+//
+// The resulting padding is {1, 2, 1, 2}.
+//
+// . . . . . . . . . . | actual top
+// . . | | leading space
+// . | | _ . | font | capital
+// . |--| /_\ \ / . | height | height
+// . | | \_ \/ . | |
+// . / . | | descender
+// . . . . . . . . . . | actual bottom
+// ___ ___
+// actual actual
+// left right
+//
+GFX_EXPORT Insets
+AdjustVisualBorderForFont(const FontList& font_list,
+ const Insets& desired_visual_padding);
+
+// Returns the y adjustment necessary to align the center of the "cap size" box
+// - the space between a capital letter's top and bottom - between two fonts.
+// For non-capital scripts (e.g. Hebrew, Devanagari) the box containing the body
+// of most letters is used.
+//
+// A positive return value means the font |to_center| needs to be moved down
+// relative to the font |original_font|, while a negative value means it needs
+// to be moved up.
+//
+// Illustration:
+//
+// original_font to_center
+// ---------- ] - return value (+1)
+// leading ----------
+// ---------- leading
+// ----------
+//
+// cap-height cap-height
+//
+// ----------
+// ---------- descent
+// descent ----------
+// ----------
+//
+// Visual result: Non-Latin example (Devanagari ऐ "ai"):
+// \
+// |\ | ------ \
+// | \ | |\ | | | ----
+// | \ | | \| \ / \|
+// | \| \ /
+// /
+//
+GFX_EXPORT int GetFontCapHeightCenterOffset(const gfx::FontList& original_font,
+ const gfx::FontList& to_center);
+
} // namespace gfx
#endif // UI_GFX_TEXT_UTILS_H_
diff --git a/chromium/ui/gfx/text_utils_unittest.cc b/chromium/ui/gfx/text_utils_unittest.cc
index 564ec40bd0f..ed1eb98a45c 100644
--- a/chromium/ui/gfx/text_utils_unittest.cc
+++ b/chromium/ui/gfx/text_utils_unittest.cc
@@ -6,12 +6,17 @@
#include <stddef.h>
+#include <vector>
+
#include "base/logging.h"
#include "base/stl_util.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/font_list.h"
+#include "ui/gfx/geometry/insets.h"
+#include "ui/gfx/geometry/point.h"
+#include "ui/gfx/geometry/rect.h"
namespace gfx {
namespace {
@@ -37,6 +42,81 @@ TEST(TextUtilsTest, GetStringWidth) {
GetStringWidth(base::ASCIIToUTF16("ab"), font_list));
}
+TEST(TextUtilsTest, GetStringSize) {
+ std::vector<base::string16> strings{
+ base::string16(),
+ base::ASCIIToUTF16("a"),
+ base::ASCIIToUTF16("abc"),
+ };
+
+ FontList font_list;
+ for (base::string16 string : strings) {
+ gfx::Size size = GetStringSize(string, font_list);
+ EXPECT_EQ(GetStringWidth(string, font_list), size.width())
+ << " input string is \"" << string << "\"";
+ EXPECT_EQ(font_list.GetHeight(), size.height())
+ << " input string is \"" << string << "\"";
+ }
+}
+
+TEST(TextUtilsTest, AdjustVisualBorderForFont_BorderLargerThanFont) {
+ FontList font_list;
+
+ // We will make some assumptions about the default font - specifically that it
+ // has leading space and space for the descender.
+ DCHECK_GT(font_list.GetBaseline(), font_list.GetCapHeight());
+ DCHECK_LT(font_list.GetBaseline(), font_list.GetHeight());
+
+ // Adjust a large border for the default font. Using a large number means that
+ // the border will extend outside the leading and descender area of the font.
+ constexpr gfx::Insets kOriginalBorder(20);
+ const gfx::Insets result =
+ AdjustVisualBorderForFont(font_list, kOriginalBorder);
+ EXPECT_EQ(result.left(), kOriginalBorder.left());
+ EXPECT_EQ(result.right(), kOriginalBorder.right());
+ EXPECT_LT(result.top(), kOriginalBorder.top());
+ EXPECT_LT(result.bottom(), kOriginalBorder.bottom());
+}
+
+TEST(TextUtilsTest, AdjustVisualBorderForFont_BorderSmallerThanFont) {
+ FontList font_list;
+
+ // We will make some assumptions about the default font - specifically that it
+ // has leading space and space for the descender.
+ DCHECK_GT(font_list.GetBaseline(), font_list.GetCapHeight());
+ DCHECK_LT(font_list.GetBaseline(), font_list.GetHeight());
+
+ // Adjust a border with a small vertical component. The vertical component
+ // should go to zero because it overlaps the leading and descender areas of
+ // the font.
+ constexpr gfx::Insets kSmallVerticalInsets(1, 20);
+ const gfx::Insets result =
+ AdjustVisualBorderForFont(font_list, kSmallVerticalInsets);
+ EXPECT_EQ(result.left(), kSmallVerticalInsets.left());
+ EXPECT_EQ(result.right(), kSmallVerticalInsets.right());
+ EXPECT_EQ(result.top(), 0);
+ EXPECT_EQ(result.bottom(), 0);
+}
+
+TEST(TextUtilsTest, GetFontCapHeightCenterOffset_SecondFontIsSmaller) {
+ FontList original_font;
+ FontList smaller_font = original_font.DeriveWithSizeDelta(-3);
+ DCHECK_LT(smaller_font.GetCapHeight(), original_font.GetCapHeight());
+ EXPECT_GT(GetFontCapHeightCenterOffset(original_font, smaller_font), 0);
+}
+
+TEST(TextUtilsTest, GetFontCapHeightCenterOffset_SecondFontIsLarger) {
+ FontList original_font;
+ FontList larger_font = original_font.DeriveWithSizeDelta(3);
+ DCHECK_GT(larger_font.GetCapHeight(), original_font.GetCapHeight());
+ EXPECT_LT(GetFontCapHeightCenterOffset(original_font, larger_font), 0);
+}
+
+TEST(TextUtilsTest, GetFontCapHeightCenterOffset_SameSize) {
+ FontList original_font;
+ EXPECT_EQ(0, GetFontCapHeightCenterOffset(original_font, original_font));
+}
+
class RemoveAcceleratorCharTest
: public testing::TestWithParam<RemoveAcceleratorCharData> {
public:
diff --git a/chromium/ui/gfx/transform.cc b/chromium/ui/gfx/transform.cc
index e0f0b4a3925..58b662123d6 100644
--- a/chromium/ui/gfx/transform.cc
+++ b/chromium/ui/gfx/transform.cc
@@ -245,19 +245,28 @@ bool Transform::IsApproximatelyIdentityOrTranslation(SkScalar tolerance) const {
matrix_.get(3, 3) == 1;
}
+bool Transform::IsApproximatelyIdentityOrIntegerTranslation(
+ SkScalar tolerance) const {
+ if (!IsApproximatelyIdentityOrTranslation(tolerance))
+ return false;
+
+ for (float t : {matrix_.get(0, 3), matrix_.get(1, 3), matrix_.get(2, 3)}) {
+ if (!base::IsValueInRangeForNumericType<int>(t) ||
+ std::abs(std::round(t) - t) > tolerance)
+ return false;
+ }
+ return true;
+}
+
bool Transform::IsIdentityOrIntegerTranslation() const {
if (!IsIdentityOrTranslation())
return false;
- float t[] = {matrix_.get(0, 3), matrix_.get(1, 3), matrix_.get(2, 3)};
- bool no_fractional_translation =
- base::IsValueInRangeForNumericType<int>(t[0]) &&
- base::IsValueInRangeForNumericType<int>(t[1]) &&
- base::IsValueInRangeForNumericType<int>(t[2]) &&
- static_cast<int>(t[0]) == t[0] && static_cast<int>(t[1]) == t[1] &&
- static_cast<int>(t[2]) == t[2];
-
- return no_fractional_translation;
+ for (float t : {matrix_.get(0, 3), matrix_.get(1, 3), matrix_.get(2, 3)}) {
+ if (!base::IsValueInRangeForNumericType<int>(t) || static_cast<int>(t) != t)
+ return false;
+ }
+ return true;
}
bool Transform::IsBackFaceVisible() const {
diff --git a/chromium/ui/gfx/transform.h b/chromium/ui/gfx/transform.h
index 94fe601155b..c056ab0f854 100644
--- a/chromium/ui/gfx/transform.h
+++ b/chromium/ui/gfx/transform.h
@@ -147,6 +147,7 @@ class GEOMETRY_SKIA_EXPORT Transform {
// Returns true if the matrix is either identity or pure translation,
// allowing for an amount of inaccuracy as specified by the parameter.
bool IsApproximatelyIdentityOrTranslation(SkScalar tolerance) const;
+ bool IsApproximatelyIdentityOrIntegerTranslation(SkScalar tolerance) const;
// Returns true if the matrix is either a positive scale and/or a translation.
bool IsPositiveScaleOrTranslation() const {
diff --git a/chromium/ui/gfx/transform_unittest.cc b/chromium/ui/gfx/transform_unittest.cc
index ee8406500b6..35a3fca60b0 100644
--- a/chromium/ui/gfx/transform_unittest.cc
+++ b/chromium/ui/gfx/transform_unittest.cc
@@ -2220,6 +2220,21 @@ TEST(XFormTest, verifyIsApproximatelyIdentityOrTranslation) {
// Exact pure translation.
A.MakeIdentity();
+ EXPECT_TRUE(A.IsApproximatelyIdentityOrTranslation(0));
+ EXPECT_TRUE(A.IsApproximatelyIdentityOrTranslation(kApproxZero));
+ EXPECT_TRUE(A.IsApproximatelyIdentityOrIntegerTranslation(0));
+ EXPECT_TRUE(A.IsApproximatelyIdentityOrIntegerTranslation(kApproxZero));
+
+ // Set translate values to integer values other than 0 or 1.
+ matrix.set(0, 3, 3);
+ matrix.set(1, 3, 4);
+ matrix.set(2, 3, 5);
+
+ EXPECT_TRUE(A.IsApproximatelyIdentityOrTranslation(0));
+ EXPECT_TRUE(A.IsApproximatelyIdentityOrTranslation(kApproxZero));
+ EXPECT_TRUE(A.IsApproximatelyIdentityOrIntegerTranslation(0));
+ EXPECT_TRUE(A.IsApproximatelyIdentityOrIntegerTranslation(kApproxZero));
+
// Set translate values to values other than 0 or 1.
matrix.set(0, 3, 3.4f);
matrix.set(1, 3, 4.4f);
@@ -2227,16 +2242,38 @@ TEST(XFormTest, verifyIsApproximatelyIdentityOrTranslation) {
EXPECT_TRUE(A.IsApproximatelyIdentityOrTranslation(0));
EXPECT_TRUE(A.IsApproximatelyIdentityOrTranslation(kApproxZero));
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrIntegerTranslation(0));
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrIntegerTranslation(kApproxZero));
// Approximately pure translation.
InitializeApproxIdentityMatrix(&A);
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrTranslation(0));
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrTranslation(kApproxZero));
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrIntegerTranslation(0));
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrIntegerTranslation(kApproxZero));
+
// Some values must be exact.
matrix.set(3, 0, 0);
matrix.set(3, 1, 0);
matrix.set(3, 2, 0);
matrix.set(3, 3, 1);
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrTranslation(0));
+ EXPECT_TRUE(A.IsApproximatelyIdentityOrTranslation(kApproxZero));
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrIntegerTranslation(0));
+ EXPECT_TRUE(A.IsApproximatelyIdentityOrIntegerTranslation(kApproxZero));
+
+ // Set translate values to values other than 0 or 1.
+ matrix.set(0, 3, matrix.get(0, 3) + 3);
+ matrix.set(1, 3, matrix.get(1, 3) + 4);
+ matrix.set(2, 3, matrix.get(2, 3) + 5);
+
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrTranslation(0));
+ EXPECT_TRUE(A.IsApproximatelyIdentityOrTranslation(kApproxZero));
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrIntegerTranslation(0));
+ EXPECT_TRUE(A.IsApproximatelyIdentityOrIntegerTranslation(kApproxZero));
+
// Set translate values to values other than 0 or 1.
matrix.set(0, 3, 3.4f);
matrix.set(1, 3, 4.4f);
@@ -2244,6 +2281,8 @@ TEST(XFormTest, verifyIsApproximatelyIdentityOrTranslation) {
EXPECT_FALSE(A.IsApproximatelyIdentityOrTranslation(0));
EXPECT_TRUE(A.IsApproximatelyIdentityOrTranslation(kApproxZero));
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrIntegerTranslation(0));
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrIntegerTranslation(kApproxZero));
// Not approximately pure translation.
InitializeApproxIdentityMatrix(&A);
@@ -2261,6 +2300,8 @@ TEST(XFormTest, verifyIsApproximatelyIdentityOrTranslation) {
EXPECT_FALSE(A.IsApproximatelyIdentityOrTranslation(0));
EXPECT_FALSE(A.IsApproximatelyIdentityOrTranslation(kApproxZero));
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrIntegerTranslation(0));
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrIntegerTranslation(kApproxZero));
}
TEST(XFormTest, verifyIsScaleOrTranslation) {
diff --git a/chromium/ui/gfx/win/hwnd_util.cc b/chromium/ui/gfx/win/hwnd_util.cc
index 069968c3b24..9730ad7cfa1 100644
--- a/chromium/ui/gfx/win/hwnd_util.cc
+++ b/chromium/ui/gfx/win/hwnd_util.cc
@@ -4,7 +4,11 @@
#include "ui/gfx/win/hwnd_util.h"
+#include <windows.h>
+
+#include "base/debug/alias.h"
#include "base/logging.h"
+#include "base/notreached.h"
#include "base/strings/string_util.h"
#include "base/win/win_util.h"
#include "ui/gfx/geometry/rect.h"
@@ -50,17 +54,31 @@ void AdjustWindowToFit(HWND hwnd, const RECT& bounds, bool fit_to_monitor) {
// Don't inline these functions so they show up in crash reports.
-NOINLINE void CrashOutOfMemory() {
- PLOG(FATAL);
+NOINLINE void CrashOutOfMemory(DWORD last_error) {
+ // Record Graphics Device Interface (GDI) object counts so they are visible in
+ // the crash's minidump. By default, GDI and USER handles are limited to
+ // 10,000 each per process and 65,535 each globally, exceeding which typically
+ // indicates a leak of GDI resources.
+ const HANDLE process = ::GetCurrentProcess();
+ DWORD num_process_gdi_handles = ::GetGuiResources(process, GR_GDIOBJECTS);
+ DWORD num_process_user_handles = ::GetGuiResources(process, GR_USEROBJECTS);
+ DWORD num_global_gdi_handles = ::GetGuiResources(GR_GLOBAL, GR_GDIOBJECTS);
+ DWORD num_global_user_handles = ::GetGuiResources(GR_GLOBAL, GR_USEROBJECTS);
+ base::debug::Alias(&num_process_gdi_handles);
+ base::debug::Alias(&num_process_user_handles);
+ base::debug::Alias(&num_global_gdi_handles);
+ base::debug::Alias(&num_global_user_handles);
+
+ LOG(FATAL) << last_error;
}
-NOINLINE void CrashAccessDenied() {
- PLOG(FATAL);
+NOINLINE void CrashAccessDenied(DWORD last_error) {
+ LOG(FATAL) << last_error;
}
// Crash isn't one of the ones we commonly see.
-NOINLINE void CrashOther() {
- PLOG(FATAL);
+NOINLINE void CrashOther(DWORD last_error) {
+ LOG(FATAL) << last_error;
}
} // namespace
@@ -182,20 +200,20 @@ void CenterAndSizeWindow(HWND parent,
AdjustWindowToFit(window, window_bounds, !parent);
}
-void CheckWindowCreated(HWND hwnd) {
+void CheckWindowCreated(HWND hwnd, DWORD last_error) {
if (!hwnd) {
- switch (GetLastError()) {
+ switch (last_error) {
case ERROR_NOT_ENOUGH_MEMORY:
- CrashOutOfMemory();
+ CrashOutOfMemory(last_error);
break;
case ERROR_ACCESS_DENIED:
- CrashAccessDenied();
+ CrashAccessDenied(last_error);
break;
default:
- CrashOther();
+ CrashOther(last_error);
break;
}
- PLOG(FATAL);
+ LOG(FATAL) << last_error;
}
}
diff --git a/chromium/ui/gfx/win/hwnd_util.h b/chromium/ui/gfx/win/hwnd_util.h
index 5351d9467f0..18b386208a0 100644
--- a/chromium/ui/gfx/win/hwnd_util.h
+++ b/chromium/ui/gfx/win/hwnd_util.h
@@ -35,9 +35,9 @@ GFX_EXPORT void CenterAndSizeWindow(HWND parent,
HWND window,
const gfx::Size& pref);
-// If |hwnd| is NULL logs various thing and CHECKs. Invoke right after calling
-// CreateWindow.
-GFX_EXPORT void CheckWindowCreated(HWND hwnd);
+// If |hwnd| is nullptr logs various thing and CHECKs. |last_error| must contain
+// the result of ::GetLastError(), called immediately after CreateWindow().
+GFX_EXPORT void CheckWindowCreated(HWND hwnd, DWORD last_error);
// Returns the window you can use to parent a top level window.
// Note that in some cases we create child windows not parented to its final
diff --git a/chromium/ui/gfx/win/rendering_window_manager.cc b/chromium/ui/gfx/win/rendering_window_manager.cc
index 1483e9883c3..85368828682 100644
--- a/chromium/ui/gfx/win/rendering_window_manager.cc
+++ b/chromium/ui/gfx/win/rendering_window_manager.cc
@@ -5,6 +5,7 @@
#include "ui/gfx/win/rendering_window_manager.h"
#include "base/bind.h"
+#include "base/logging.h"
#include "base/no_destructor.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
diff --git a/chromium/ui/gfx/win/scoped_set_map_mode.h b/chromium/ui/gfx/win/scoped_set_map_mode.h
index 253eca8a072..5ab40bc60c8 100644
--- a/chromium/ui/gfx/win/scoped_set_map_mode.h
+++ b/chromium/ui/gfx/win/scoped_set_map_mode.h
@@ -7,7 +7,7 @@
#include <windows.h>
-#include "base/logging.h"
+#include "base/check_op.h"
#include "base/macros.h"
namespace gfx {
diff --git a/chromium/ui/gfx/win/window_impl.cc b/chromium/ui/gfx/win/window_impl.cc
index 8df35cdc651..9c4de6c604d 100644
--- a/chromium/ui/gfx/win/window_impl.cc
+++ b/chromium/ui/gfx/win/window_impl.cc
@@ -217,6 +217,8 @@ void WindowImpl::Init(HWND parent, const Rect& bounds) {
reinterpret_cast<wchar_t*>(atom), NULL,
window_style_, x, y, width, height,
parent, NULL, NULL, this);
+ const DWORD create_window_error = ::GetLastError();
+
// First nccalcszie (during CreateWindow) for captioned windows is
// deliberately ignored so force a second one here to get the right
// non-client set up.
@@ -226,7 +228,7 @@ void WindowImpl::Init(HWND parent, const Rect& bounds) {
SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW);
}
- if (!hwnd_ && GetLastError() == 0) {
+ if (!hwnd_ && create_window_error == 0) {
base::debug::Alias(&destroyed);
base::debug::Alias(&hwnd);
bool got_create = got_create_;
@@ -248,7 +250,7 @@ void WindowImpl::Init(HWND parent, const Rect& bounds) {
if (!destroyed)
destroyed_ = NULL;
- CheckWindowCreated(hwnd_);
+ CheckWindowCreated(hwnd_, create_window_error);
// The window procedure should have set the data for us.
CHECK_EQ(this, GetWindowUserData(hwnd));
diff --git a/chromium/ui/gfx/win/window_impl.h b/chromium/ui/gfx/win/window_impl.h
index 268ca081016..d34c649708a 100644
--- a/chromium/ui/gfx/win/window_impl.h
+++ b/chromium/ui/gfx/win/window_impl.h
@@ -7,7 +7,7 @@
#include <string>
-#include "base/logging.h"
+#include "base/check_op.h"
#include "base/macros.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/gfx_export.h"
diff --git a/chromium/ui/gfx/x/BUILD.gn b/chromium/ui/gfx/x/BUILD.gn
index 5369e38efed..24d36ecba8a 100644
--- a/chromium/ui/gfx/x/BUILD.gn
+++ b/chromium/ui/gfx/x/BUILD.gn
@@ -3,23 +3,12 @@
# found in the LICENSE file.
import("//build/config/jumbo.gni")
-import("//build/config/sysroot.gni")
import("//build/config/ui.gni")
import("//ui/ozone/ozone.gni")
assert(use_x11 || ozone_platform_x11)
-declare_args() {
- xcbproto_path = ""
-}
-
-if (xcbproto_path == "") {
- if (use_sysroot) {
- xcbproto_path = "$sysroot/usr/share/xcb"
- } else {
- xcbproto_path = "/usr/share/xcb"
- }
-}
+xcbproto_path = "//third_party/xcbproto/src"
config("x11_private_config") {
cflags = [
@@ -32,54 +21,62 @@ config("x11_private_config") {
defines = [ "IS_X11_IMPL" ]
}
-action_foreach("gen_xprotos") {
+action("gen_xprotos") {
visibility = [ ":xprotos" ]
script = "gen_xproto.py"
- sources = [
- "$xcbproto_path/bigreq.xml",
- "$xcbproto_path/composite.xml",
- "$xcbproto_path/damage.xml",
- "$xcbproto_path/dpms.xml",
- "$xcbproto_path/dri2.xml",
- "$xcbproto_path/dri3.xml",
- "$xcbproto_path/ge.xml",
- "$xcbproto_path/glx.xml",
- "$xcbproto_path/present.xml",
- "$xcbproto_path/randr.xml",
- "$xcbproto_path/record.xml",
- "$xcbproto_path/render.xml",
- "$xcbproto_path/res.xml",
- "$xcbproto_path/screensaver.xml",
- "$xcbproto_path/shape.xml",
- "$xcbproto_path/shm.xml",
- "$xcbproto_path/sync.xml",
- "$xcbproto_path/xc_misc.xml",
- "$xcbproto_path/xevie.xml",
- "$xcbproto_path/xf86dri.xml",
- "$xcbproto_path/xf86vidmode.xml",
- "$xcbproto_path/xfixes.xml",
- "$xcbproto_path/xinerama.xml",
- "$xcbproto_path/xinput.xml",
- "$xcbproto_path/xkb.xml",
- "$xcbproto_path/xprint.xml",
- "$xcbproto_path/xproto.xml",
- "$xcbproto_path/xselinux.xml",
- "$xcbproto_path/xtest.xml",
- "$xcbproto_path/xv.xml",
- "$xcbproto_path/xvmc.xml",
+ protos = [
+ "bigreq",
+ "composite",
+ "damage",
+ "dpms",
+ "dri2",
+ "dri3",
+ "ge",
+ "glx",
+ "present",
+ "randr",
+ "record",
+ "render",
+ "res",
+ "screensaver",
+ "shape",
+ "shm",
+ "sync",
+ "xc_misc",
+ "xevie",
+ "xf86dri",
+ "xf86vidmode",
+ "xfixes",
+ "xinerama",
+ "xinput",
+ "xkb",
+ "xprint",
+ "xproto",
+ "xselinux",
+ "xtest",
+ "xv",
+ "xvmc",
]
+ sources = []
outputs = [
- "$target_gen_dir/{{source_name_part}}_undef.h",
- "$target_gen_dir/{{source_name_part}}.h",
- "$target_gen_dir/{{source_name_part}}.cc",
+ "$target_gen_dir/read_event.cc",
+ "$target_gen_dir/extension_manager.h",
+ "$target_gen_dir/extension_manager.cc",
]
- args = [ "{{source}}" ] + rebase_path(outputs, root_build_dir)
- if (use_sysroot) {
- args += [
- "--sysroot",
- rebase_path(sysroot, root_build_dir),
+ foreach(proto, protos) {
+ sources += [ "$xcbproto_path/src/${proto}.xml" ]
+ outputs += [
+ "$target_gen_dir/${proto}_undef.h",
+ "$target_gen_dir/${proto}.h",
+ "$target_gen_dir/${proto}.cc",
]
}
+
+ args = rebase_path([
+ xcbproto_path,
+ target_gen_dir,
+ ],
+ root_build_dir) + protos
}
component("xprotos") {
@@ -90,12 +87,13 @@ component("xprotos") {
sources = get_target_outputs(":gen_xprotos") + [
"xproto_internal.h",
"xproto_types.h",
- "request_queue.h",
- "request_queue.cc",
+ "xproto_types.cc",
"xproto_util.h",
"xproto_util.cc",
"connection.h",
"connection.cc",
+ "event.h",
+ "event.cc",
"x11_switches.cc",
"x11_switches.h",
]
@@ -131,3 +129,12 @@ jumbo_component("x") {
]
public_deps = [ ":xprotos" ]
}
+
+source_set("unit_test") {
+ testonly = true
+ sources = [ "connection_unittest.cc" ]
+ deps = [
+ "//testing/gtest",
+ "//ui/gfx/x",
+ ]
+}
diff --git a/chromium/ui/gfx/x/connection.cc b/chromium/ui/gfx/x/connection.cc
index 6dd336cac57..af5b6bfb1ae 100644
--- a/chromium/ui/gfx/x/connection.cc
+++ b/chromium/ui/gfx/x/connection.cc
@@ -4,13 +4,44 @@
#include "ui/gfx/x/connection.h"
+#include <X11/Xlib-xcb.h>
+#include <X11/Xlib.h>
+#include <xcb/xcb.h>
+
+#include <algorithm>
+
#include "base/command_line.h"
+#include "ui/gfx/x/bigreq.h"
+#include "ui/gfx/x/event.h"
+#include "ui/gfx/x/randr.h"
#include "ui/gfx/x/x11_switches.h"
+#include "ui/gfx/x/xproto_types.h"
namespace x11 {
namespace {
+// 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
+// prevent bugs caused by comparing two differently sized sequences. Also
+// handles rollover. To use, compare the result of this function with 0. For
+// example, to compare seq1 <= seq2, use CompareSequenceIds(seq1, seq2) <= 0.
+template <typename T, typename U>
+auto CompareSequenceIds(T t, U u) {
+ static_assert(std::is_unsigned<T>::value, "");
+ static_assert(std::is_unsigned<U>::value, "");
+ // Cast to the smaller of the two types so that comparisons will always work.
+ // If we casted to the larger type, then the smaller type will be zero-padded
+ // and may incorrectly compare less than the other value.
+ using SmallerType =
+ typename std::conditional<sizeof(T) <= sizeof(U), T, U>::type;
+ SmallerType t0 = static_cast<SmallerType>(t);
+ SmallerType u0 = static_cast<SmallerType>(u);
+ using SignedType = typename std::make_signed<SmallerType>::type;
+ return static_cast<SignedType>(t0 - u0);
+}
+
XDisplay* OpenNewXDisplay() {
if (!XInitThreads())
return nullptr;
@@ -23,10 +54,197 @@ XDisplay* OpenNewXDisplay() {
} // namespace
Connection* Connection::Get() {
- static Connection* instance = new Connection(OpenNewXDisplay());
+ static Connection* instance = new Connection;
return instance;
}
-Connection::Connection(XDisplay* display) : XProto(display) {}
+Connection::Connection() : XProto(this), display_(OpenNewXDisplay()) {
+ if (display_) {
+ XSetEventQueueOwner(display_, XCBOwnsEventQueue);
+
+ setup_ = Read<Setup>(
+ reinterpret_cast<const uint8_t*>(xcb_get_setup(XcbConnection())));
+ default_screen_ = &setup_.roots[DefaultScreenId()];
+ default_root_depth_ = &*std::find_if(
+ default_screen_->allowed_depths.begin(),
+ default_screen_->allowed_depths.end(), [&](const Depth& depth) {
+ return depth.depth == default_screen_->root_depth;
+ });
+ default_root_visual_ = &*std::find_if(
+ default_root_depth_->visuals.begin(),
+ default_root_depth_->visuals.end(), [&](const VisualType visual) {
+ return visual.visual_id == default_screen_->root_visual;
+ });
+ } else {
+ // Default-initialize the setup data so we always have something to return.
+ setup_.roots.emplace_back();
+ default_screen_ = &setup_.roots[0];
+ default_screen_->allowed_depths.emplace_back();
+ default_root_depth_ = &default_screen_->allowed_depths[0];
+ default_root_depth_->visuals.emplace_back();
+ default_root_visual_ = &default_root_depth_->visuals[0];
+ }
+
+ ExtensionManager::Init(this);
+ if (auto response = bigreq().Enable({}).Sync())
+ extended_max_request_length_ = response->maximum_request_length;
+}
+
+Connection::~Connection() {
+ if (display_)
+ XCloseDisplay(display_);
+}
+
+xcb_connection_t* Connection::XcbConnection() {
+ if (!display())
+ return nullptr;
+ return XGetXCBConnection(display());
+}
+
+Connection::Request::Request(unsigned int sequence,
+ FutureBase::ResponseCallback callback)
+ : sequence(sequence), callback(std::move(callback)) {}
+
+Connection::Request::Request(Request&& other)
+ : sequence(other.sequence), callback(std::move(other.callback)) {}
+
+Connection::Request::~Request() = default;
+
+bool Connection::HasNextResponse() const {
+ return !requests_.empty() &&
+ CompareSequenceIds(XLastKnownRequestProcessed(display_),
+ requests_.front().sequence) >= 0;
+}
+
+int Connection::DefaultScreenId() const {
+ // This is not part of the setup data as the server has no concept of a
+ // default screen. Instead, it's part of the display name. Eg in
+ // "localhost:0.0", the screen ID is the second "0".
+ return DefaultScreen(display_);
+}
+
+bool Connection::Ready() const {
+ return display_ && !xcb_connection_has_error(XGetXCBConnection(display_));
+}
+
+void Connection::Flush() {
+ XFlush(display_);
+}
+
+void Connection::Sync() {
+ GetInputFocus({}).Sync();
+}
+
+void Connection::ReadResponses() {
+ while (auto* event = xcb_poll_for_event(XcbConnection())) {
+ events_.emplace_back(event, this);
+ free(event);
+ }
+}
+
+bool Connection::HasPendingResponses() const {
+ return !events_.empty() || HasNextResponse();
+}
+
+void Connection::Dispatch(Delegate* delegate) {
+ 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);
+
+ std::move(request.callback)
+ .Run(FutureBase::RawReply{reinterpret_cast<uint8_t*>(raw_reply)},
+ FutureBase::RawError{raw_error});
+ };
+
+ auto process_next_event = [&] {
+ DCHECK(!events_.empty());
+
+ Event event = std::move(events_.front());
+ events_.pop_front();
+ PreDispatchEvent(event);
+ delegate->DispatchXEvent(&event);
+ };
+
+ // Handle all pending events.
+ while (delegate->ShouldContinueStream()) {
+ Flush();
+ ReadResponses();
+
+ if (HasNextResponse() && !events_.empty()) {
+ if (!events_.front().sequence_valid()) {
+ process_next_event();
+ continue;
+ }
+
+ auto next_response_sequence = requests_.front().sequence;
+ auto next_event_sequence = events_.front().sequence();
+
+ // All events have the sequence number of the last processed request
+ // included in them. So if a reply and an event have the same sequence,
+ // the reply must have been received first.
+ if (CompareSequenceIds(next_event_sequence, next_response_sequence) <= 0)
+ process_next_response();
+ else
+ process_next_event();
+ } else if (HasNextResponse()) {
+ process_next_response();
+ } else if (!events_.empty()) {
+ process_next_event();
+ } else {
+ break;
+ }
+ }
+}
+
+void Connection::AddRequest(unsigned int sequence,
+ FutureBase::ResponseCallback callback) {
+ DCHECK(requests_.empty() ||
+ CompareSequenceIds(requests_.back().sequence, sequence) < 0);
+
+ requests_.emplace(sequence, std::move(callback));
+}
+
+void Connection::PreDispatchEvent(const Event& event) {
+ // This is adapted from XRRUpdateConfiguration.
+ if (auto* configure = event.As<x11::ConfigureNotifyEvent>()) {
+ int index = ScreenIndexFromRootWindow(configure->window);
+ if (index != -1) {
+ setup_.roots[index].width_in_pixels = configure->width;
+ setup_.roots[index].height_in_pixels = configure->height;
+ }
+ } else if (auto* screen = event.As<x11::RandR::ScreenChangeNotifyEvent>()) {
+ int index = ScreenIndexFromRootWindow(screen->root);
+ DCHECK_GE(index, 0);
+ bool portrait = static_cast<bool>(
+ screen->rotation &
+ (x11::RandR::Rotation::Rotate_90 | x11::RandR::Rotation::Rotate_270));
+ if (portrait) {
+ setup_.roots[index].width_in_pixels = screen->height;
+ setup_.roots[index].height_in_pixels = screen->width;
+ setup_.roots[index].width_in_millimeters = screen->mheight;
+ setup_.roots[index].height_in_millimeters = screen->mwidth;
+ } else {
+ setup_.roots[index].width_in_pixels = screen->width;
+ setup_.roots[index].height_in_pixels = screen->height;
+ setup_.roots[index].width_in_millimeters = screen->mwidth;
+ setup_.roots[index].height_in_millimeters = screen->mheight;
+ }
+ }
+}
+
+int Connection::ScreenIndexFromRootWindow(x11::Window root) const {
+ for (size_t i = 0; i < setup_.roots.size(); i++) {
+ if (setup_.roots[i].root == root)
+ return i;
+ }
+ return -1;
+}
} // namespace x11
diff --git a/chromium/ui/gfx/x/connection.h b/chromium/ui/gfx/x/connection.h
index 2e9baf64464..a103b431d71 100644
--- a/chromium/ui/gfx/x/connection.h
+++ b/chromium/ui/gfx/x/connection.h
@@ -5,25 +5,113 @@
#ifndef UI_GFX_X_CONNECTION_H_
#define UI_GFX_X_CONNECTION_H_
+#include <list>
+#include <queue>
+
#include "base/component_export.h"
+#include "ui/gfx/x/event.h"
+#include "ui/gfx/x/extension_manager.h"
#include "ui/gfx/x/xproto.h"
namespace x11 {
-using Atom = XProto::Atom;
-using Window = XProto::Window;
-
// Represents a socket to the X11 server.
-class COMPONENT_EXPORT(X11) Connection : public XProto {
+class COMPONENT_EXPORT(X11) Connection : public XProto,
+ public ExtensionManager {
public:
- // Gets or creates the singeton connection.
+ class Delegate {
+ public:
+ virtual bool ShouldContinueStream() const = 0;
+ virtual void DispatchXEvent(x11::Event* event) = 0;
+
+ protected:
+ virtual ~Delegate() = default;
+ };
+
+ // Gets or creates the singleton connection.
static Connection* Get();
+ explicit Connection();
+ ~Connection();
+
Connection(const Connection&) = delete;
Connection(Connection&&) = delete;
+ XDisplay* display() const { return display_; }
+ xcb_connection_t* XcbConnection();
+
+ uint32_t extended_max_request_length() const {
+ return extended_max_request_length_;
+ }
+
+ const Setup& setup() const { return setup_; }
+ const Screen& default_screen() const { return *default_screen_; }
+ x11::Window default_root() const { return default_screen().root; }
+ const Depth& default_root_depth() const { return *default_root_depth_; }
+ const VisualType& default_root_visual() const {
+ return *default_root_visual_;
+ }
+
+ int DefaultScreenId() const;
+
+ template <typename T>
+ T GenerateId() {
+ return static_cast<T>(xcb_generate_id(XcbConnection()));
+ }
+
+ // Is the connection up and error-free?
+ bool Ready() const;
+
+ // Write all requests to the socket.
+ void Flush();
+
+ // Flush and block until the server has responded to all requests.
+ void Sync();
+
+ // Read all responses from the socket without blocking.
+ void ReadResponses();
+
+ // Are there any events, errors, or replies already buffered?
+ bool HasPendingResponses() const;
+
+ // Dispatch any buffered events, errors, or replies.
+ void Dispatch(Delegate* delegate);
+
+ // Access the event buffer. Clients can add, delete, or modify events.
+ std::list<Event>& events() { return events_; }
+
private:
- explicit Connection(XDisplay* display);
+ friend class FutureBase;
+
+ struct Request {
+ Request(unsigned int sequence, FutureBase::ResponseCallback callback);
+ Request(Request&& other);
+ ~Request();
+
+ const unsigned int sequence;
+ FutureBase::ResponseCallback callback;
+ };
+
+ void AddRequest(unsigned int sequence, FutureBase::ResponseCallback callback);
+
+ bool HasNextResponse() const;
+
+ void PreDispatchEvent(const Event& event);
+
+ int ScreenIndexFromRootWindow(x11::Window root) const;
+
+ XDisplay* const display_;
+
+ uint32_t extended_max_request_length_ = 0;
+
+ Setup setup_;
+ Screen* default_screen_ = nullptr;
+ Depth* default_root_depth_ = nullptr;
+ VisualType* default_root_visual_ = nullptr;
+
+ std::list<Event> events_;
+
+ std::queue<Request> requests_;
};
} // namespace x11
diff --git a/chromium/ui/gfx/x/connection_unittest.cc b/chromium/ui/gfx/x/connection_unittest.cc
new file mode 100644
index 00000000000..de2285911a4
--- /dev/null
+++ b/chromium/ui/gfx/x/connection_unittest.cc
@@ -0,0 +1,108 @@
+// 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/connection.h"
+#include "ui/gfx/x/xproto.h"
+
+#undef Bool
+
+#include <xcb/xcb.h>
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace x11 {
+
+namespace {
+
+Window CreateWindow(Connection* connection) {
+ Window window = connection->GenerateId<Window>();
+ auto create_window_future = connection->CreateWindow({
+ .depth = connection->default_root_depth().depth,
+ .wid = window,
+ .parent = connection->default_screen().root,
+ .width = 1,
+ .height = 1,
+ .override_redirect = Bool32(true),
+ });
+ auto create_window_response = create_window_future.Sync();
+ EXPECT_FALSE(create_window_response.error);
+ return window;
+}
+
+} // namespace
+
+// Connection setup and teardown.
+TEST(X11ConnectionTest, Basic) {
+ Connection connection;
+ ASSERT_TRUE(connection.XcbConnection());
+ EXPECT_FALSE(xcb_connection_has_error(connection.XcbConnection()));
+}
+
+TEST(X11ConnectionTest, Request) {
+ Connection connection;
+ ASSERT_TRUE(connection.XcbConnection());
+ EXPECT_FALSE(xcb_connection_has_error(connection.XcbConnection()));
+
+ Window window = CreateWindow(&connection);
+
+ auto attributes = connection.GetWindowAttributes({window}).Sync();
+ ASSERT_TRUE(attributes);
+ EXPECT_EQ(attributes->map_state, MapState::Unmapped);
+ EXPECT_TRUE(attributes->override_redirect);
+
+ auto geometry = connection.GetGeometry({window}).Sync();
+ ASSERT_TRUE(geometry);
+ EXPECT_EQ(geometry->x, 0);
+ EXPECT_EQ(geometry->y, 0);
+ EXPECT_EQ(geometry->width, 1u);
+ EXPECT_EQ(geometry->height, 1u);
+}
+
+TEST(X11ConnectionTest, Event) {
+ Connection connection;
+ ASSERT_TRUE(connection.XcbConnection());
+ EXPECT_FALSE(xcb_connection_has_error(connection.XcbConnection()));
+
+ Window window = CreateWindow(&connection);
+
+ auto cwa_future = connection.ChangeWindowAttributes({
+ .window = window,
+ .event_mask = EventMask::PropertyChange,
+ });
+ EXPECT_FALSE(cwa_future.Sync().error);
+
+ auto prop_future = connection.ChangeProperty({
+ .window = static_cast<x11::Window>(window),
+ .property = x11::Atom::WM_NAME,
+ .type = x11::Atom::STRING,
+ .format = CHAR_BIT,
+ .data_len = 1,
+ .data = std::vector<uint8_t>{0},
+ });
+ EXPECT_FALSE(prop_future.Sync().error);
+
+ connection.ReadResponses();
+ ASSERT_EQ(connection.events().size(), 1u);
+ XEvent& event = connection.events().front().xlib_event();
+ auto property_notify_opcode = PropertyNotifyEvent::opcode;
+ EXPECT_EQ(event.type, property_notify_opcode);
+ EXPECT_EQ(event.xproperty.atom, static_cast<uint32_t>(x11::Atom::WM_NAME));
+ EXPECT_EQ(event.xproperty.state, static_cast<int>(Property::NewValue));
+}
+
+TEST(X11ConnectionTest, Error) {
+ Connection connection;
+ ASSERT_TRUE(connection.XcbConnection());
+ EXPECT_FALSE(xcb_connection_has_error(connection.XcbConnection()));
+
+ 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));
+}
+
+} // namespace x11
diff --git a/chromium/ui/gfx/x/event.cc b/chromium/ui/gfx/x/event.cc
new file mode 100644
index 00000000000..238e06bb656
--- /dev/null
+++ b/chromium/ui/gfx/x/event.cc
@@ -0,0 +1,103 @@
+// 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/event.h"
+
+#include <X11/Xlibint.h>
+#include <X11/extensions/XInput2.h>
+
+// Xlibint.h defines those as macros, which breaks the C++ versions in
+// the std namespace.
+#undef max
+#undef min
+
+#include <cstring>
+
+#include "ui/gfx/x/connection.h"
+
+namespace x11 {
+
+Event::Event() = default;
+
+Event::Event(xcb_generic_event_t* xcb_event,
+ x11::Connection* connection,
+ bool sequence_valid) {
+ XDisplay* display = connection->display();
+
+ sequence_valid_ = sequence_valid;
+ sequence_ = xcb_event->full_sequence;
+ // KeymapNotify events are the only events that don't have a sequence.
+ if ((xcb_event->response_type & ~kSendEventMask) !=
+ x11::KeymapNotifyEvent::opcode) {
+ // Rewrite the sequence to the last seen sequence so that Xlib doesn't
+ // think the sequence wrapped around.
+ xcb_event->sequence = XLastKnownRequestProcessed(display);
+
+ // On the wire, events are 32 bytes except for generic events which are
+ // trailed by additional data. XCB inserts an extended 4-byte sequence
+ // between the 32-byte event and the additional data, so we need to shift
+ // the additional data over by 4 bytes so the event is back in its wire
+ // format, which is what Xlib and XProto are expecting.
+ if ((xcb_event->response_type & ~kSendEventMask) ==
+ x11::GeGenericEvent::opcode) {
+ auto* ge = reinterpret_cast<xcb_ge_event_t*>(xcb_event);
+ memmove(&ge->full_sequence, &ge[1], ge->length * 4);
+ }
+ }
+
+ // Xlib sometimes modifies |xcb_event|, so let it handle the event after
+ // we parse it with ReadEvent().
+ ReadEvent(this, connection, reinterpret_cast<uint8_t*>(xcb_event));
+
+ _XEnq(display, reinterpret_cast<xEvent*>(xcb_event));
+ if (!XEventsQueued(display, QueuedAlready)) {
+ // If Xlib gets an event it doesn't recognize (eg. from an
+ // extension it doesn't know about), it won't add the event to the
+ // queue. In this case, zero-out the event data. This will set
+ // the event type to 0, which does not correspond to any event.
+ // This is safe because event handlers should always check the
+ // event type before downcasting to a concrete event.
+ memset(&xlib_event_, 0, sizeof(xlib_event_));
+ return;
+ }
+ XNextEvent(display, &xlib_event_);
+ if (xlib_event_.type == x11::GeGenericEvent::opcode)
+ XGetEventData(display, &xlib_event_.xcookie);
+}
+
+Event::Event(Event&& event) {
+ memcpy(this, &event, sizeof(Event));
+ memset(&event, 0, sizeof(Event));
+}
+
+Event& Event::operator=(Event&& event) {
+ Dealloc();
+ memcpy(this, &event, sizeof(Event));
+ memset(&event, 0, sizeof(Event));
+ return *this;
+}
+
+Event::~Event() {
+ Dealloc();
+}
+
+void Event::Dealloc() {
+ if (xlib_event_.type == x11::GeGenericEvent::opcode &&
+ xlib_event_.xcookie.data) {
+ if (custom_allocated_xlib_event_) {
+ XIDeviceEvent* xiev =
+ static_cast<XIDeviceEvent*>(xlib_event_.xcookie.data);
+ delete[] xiev->valuators.mask;
+ delete[] xiev->valuators.values;
+ delete[] xiev->buttons.mask;
+ delete xiev;
+ } else {
+ XFreeEventData(xlib_event_.xcookie.display, &xlib_event_.xcookie);
+ }
+ }
+ if (deleter_)
+ deleter_(event_);
+}
+
+} // namespace x11
diff --git a/chromium/ui/gfx/x/event.h b/chromium/ui/gfx/x/event.h
new file mode 100644
index 00000000000..37073dbd584
--- /dev/null
+++ b/chromium/ui/gfx/x/event.h
@@ -0,0 +1,92 @@
+// 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_EVENT_H_
+#define UI_GFX_X_EVENT_H_
+
+#include <X11/Xlib.h>
+#include <xcb/xcb.h>
+
+#include <cstdint>
+#include <utility>
+
+#include "base/component_export.h"
+
+namespace x11 {
+
+class Connection;
+class Event;
+
+COMPONENT_EXPORT(X11)
+void ReadEvent(Event* event, Connection* connection, const uint8_t* buffer);
+
+class COMPONENT_EXPORT(X11) Event {
+ public:
+ // Used to create events for testing.
+ template <typename T>
+ Event(XEvent* xlib_event, T&& xproto_event) {
+ sequence_valid_ = true;
+ sequence_ = xlib_event_.xany.serial;
+ custom_allocated_xlib_event_ = true;
+ xlib_event_ = *xlib_event;
+ type_id_ = T::type_id;
+ deleter_ = [](void* event) { delete reinterpret_cast<T*>(event); };
+ event_ = new T(std::forward<T>(xproto_event));
+ }
+
+ Event();
+ Event(xcb_generic_event_t* xcb_event,
+ Connection* connection,
+ bool sequence_valid = true);
+
+ Event(const Event&) = delete;
+ Event& operator=(const Event&) = delete;
+
+ Event(Event&& event);
+ Event& operator=(Event&& event);
+
+ ~Event();
+
+ template <typename T>
+ T* As() {
+ if (type_id_ == T::type_id)
+ return reinterpret_cast<T*>(event_);
+ return nullptr;
+ }
+
+ template <typename T>
+ const T* As() const {
+ return const_cast<Event*>(this)->As<T>();
+ }
+
+ bool sequence_valid() const { return sequence_valid_; }
+ uint32_t sequence() const { return sequence_; }
+
+ const XEvent& xlib_event() const { return xlib_event_; }
+ XEvent& xlib_event() { return xlib_event_; }
+
+ private:
+ friend void ReadEvent(Event* event,
+ Connection* connection,
+ const uint8_t* buffer);
+
+ void Dealloc();
+
+ bool sequence_valid_ = false;
+ uint32_t sequence_ = 0;
+
+ // Indicates if |xlib_event_| was allocated manually and therefore
+ // needs to be freed manually.
+ bool custom_allocated_xlib_event_ = false;
+ XEvent xlib_event_{};
+
+ // XProto event state.
+ int type_id_ = 0;
+ void (*deleter_)(void*) = nullptr;
+ void* event_ = nullptr;
+};
+
+} // namespace x11
+
+#endif // UI_GFX_X_EVENT_H_
diff --git a/chromium/ui/gfx/x/gen_xproto.py b/chromium/ui/gfx/x/gen_xproto.py
index 4a34901012d..24a2efcc245 100644
--- a/chromium/ui/gfx/x/gen_xproto.py
+++ b/chromium/ui/gfx/x/gen_xproto.py
@@ -23,15 +23,15 @@
# #include "base/component_export.h"
# #include "ui/gfx/x/xproto_types.h"
#
-# typedef struct _XDisplay XDisplay;
-#
# namespace x11 {
#
+# class Connection;
+#
# class COMPONENT_EXPORT(X11) XProto {
# public:
-# explicit XProto(XDisplay* display);
+# explicit XProto(Connection* connection);
#
-# XDisplay* display() { return display_; }
+# Connection* connection() const { return connection_; }
#
# struct RGB {
# uint16_t red{};
@@ -54,7 +54,7 @@
# Future<QueryColorsReply> QueryColors(const QueryColorsRequest& request);
#
# private:
-# XDisplay* display_;
+# Connection* const connection_;
# };
#
# } // namespace x11
@@ -66,12 +66,13 @@
# #include <xcb/xcb.h>
# #include <xcb/xcbext.h>
#
-# #include "base/logging.h"
+# #include "base/notreached.h"
+# #include "base/check_op.h"
# #include "ui/gfx/x/xproto_internal.h"
#
# namespace x11 {
#
-# XProto::XProto(XDisplay* display) : display_(display) {}
+# XProto::XProto(Connection* connection) : connection_(connection) {}
#
# Future<XProto::QueryColorsReply>
# XProto::QueryColors(
@@ -102,7 +103,7 @@
# Write(&pixels_elem, &buf);
# }
#
-# return x11::SendRequest<XProto::QueryColorsReply>(display_, &buf);
+# return x11::SendRequest<XProto::QueryColorsReply>(connection_, &buf);
# }
#
# template<> COMPONENT_EXPORT(X11)
@@ -168,6 +169,8 @@ from __future__ import print_function
import argparse
import collections
+import functools
+import itertools
import os
import re
import sys
@@ -177,61 +180,106 @@ import types
# so this global is unavoidable.
output = collections.defaultdict(int)
-UPPER_CASE_PATTERN = re.compile(r'^[A-Z0-9_]+$')
-
-
-def adjust_type_case(name):
- if UPPER_CASE_PATTERN.match(name):
- SPECIAL = {
- 'ANIMCURSORELT': 'AnimationCursorElement',
- 'CA': 'ChangeAlarmAttribute',
- 'CHAR2B': 'Char16',
- 'CHARINFO': 'CharInfo',
- 'COLORITEM': 'ColorItem',
- 'COLORMAP': 'ColorMap',
- 'CP': 'CreatePictureAttribute',
- 'CW': 'CreateWindowAttribute',
- 'DAMAGE': 'DamageId',
- 'DIRECTFORMAT': 'DirectFormat',
- 'DOTCLOCK': 'DotClock',
- 'FBCONFIG': 'FbConfig',
- 'FLOAT32': 'float',
- 'FLOAT64': 'double',
- 'FONTPROP': 'FontProperty',
- 'GC': 'GraphicsContextAttribute',
- 'GCONTEXT': 'GraphicsContext',
- 'GLYPHINFO': 'GlyphInfo',
- 'GLYPHSET': 'GlyphSet',
- 'INDEXVALUE': 'IndexValue',
- 'KB': 'Keyboard',
- 'KEYCODE': 'KeyCode',
- 'KEYCODE32': 'KeyCode32',
- 'KEYSYM': 'KeySym',
- 'LINEFIX': 'LineFix',
- 'OP': 'Operation',
- 'PBUFFER': 'PBuffer',
- 'PCONTEXT': 'PContext',
- 'PICTDEPTH': 'PictDepth',
- 'PICTFORMAT': 'PictFormat',
- 'PICTFORMINFO': 'PictFormInfo',
- 'PICTSCREEN': 'PictScreen',
- 'PICTVISUAL': 'PictVisual',
- 'POINTFIX': 'PointFix',
- 'SEGMENT': 'SEGMENT',
- 'SPANFIX': 'SpanFix',
- 'SUBPICTURE': 'SubPicture',
- 'SYSTEMCOUNTER': 'SystemCounter',
- 'TIMECOORD': 'TimeCoord',
- 'TIMESTAMP': 'TimeStamp',
- 'VISUALID': 'VisualId',
- 'VISUALTYPE': 'VisualType',
- 'WAITCONDITION': 'WaitCondition',
- }
- if name in SPECIAL:
- return SPECIAL[name]
+RENAME = {
+ 'ANIMCURSORELT': 'AnimationCursorElement',
+ 'CA': 'ChangeAlarmAttribute',
+ 'CHAR2B': 'Char16',
+ 'CHARINFO': 'CharInfo',
+ 'COLORITEM': 'ColorItem',
+ 'COLORMAP': 'ColorMap',
+ 'Connection': 'RandRConnection',
+ 'CP': 'CreatePictureAttribute',
+ 'CW': 'CreateWindowAttribute',
+ 'DAMAGE': 'DamageId',
+ 'DIRECTFORMAT': 'DirectFormat',
+ 'DOTCLOCK': 'DotClock',
+ 'FBCONFIG': 'FbConfig',
+ 'FLOAT32': 'float',
+ 'FLOAT64': 'double',
+ 'FONTPROP': 'FontProperty',
+ 'GC': 'GraphicsContextAttribute',
+ 'GCONTEXT': 'GraphicsContext',
+ 'GLYPHINFO': 'GlyphInfo',
+ 'GLYPHSET': 'GlyphSet',
+ 'INDEXVALUE': 'IndexValue',
+ 'KB': 'Keyboard',
+ 'KEYCODE': 'KeyCode',
+ 'KEYCODE32': 'KeyCode32',
+ 'KEYSYM': 'KeySym',
+ 'LINEFIX': 'LineFix',
+ 'OP': 'Operation',
+ 'PBUFFER': 'PBuffer',
+ 'PCONTEXT': 'PContext',
+ 'PICTDEPTH': 'PictDepth',
+ 'PICTFORMAT': 'PictFormat',
+ 'PICTFORMINFO': 'PictFormInfo',
+ 'PICTSCREEN': 'PictScreen',
+ 'PICTVISUAL': 'PictVisual',
+ 'POINTFIX': 'PointFix',
+ 'SPANFIX': 'SpanFix',
+ 'SUBPICTURE': 'SubPicture',
+ 'SYSTEMCOUNTER': 'SystemCounter',
+ 'TIMECOORD': 'TimeCoord',
+ 'TIMESTAMP': 'Time',
+ 'VISUALID': 'VisualId',
+ 'VISUALTYPE': 'VisualType',
+ 'WAITCONDITION': 'WaitCondition',
+}
+
+READ_SPECIAL = set([
+ ('xcb', 'Setup'),
+])
+
+WRITE_SPECIAL = set([
+ ('xcb', 'ClientMessage'),
+ ('xcb', 'UnmapNotify'),
+ ('xcb', 'SelectionNotify'),
+])
+
+
+def adjust_type_name(name):
+ if name in RENAME:
+ return RENAME[name]
+ # If there's an underscore, then this is either snake case or upper case.
+ if '_' in name:
return ''.join([
token[0].upper() + token[1:].lower() for token in name.split('_')
])
+ if name.isupper():
+ name = name.lower()
+ # Now the only possibilities are caml case and pascal case. It could also
+ # be snake case with a single word, but that would be same as caml case.
+ # To convert all of these, just capitalize the first letter.
+ return name[0].upper() + name[1:]
+
+
+# Given a list of event names like ["KeyPress", "KeyRelease"], returns a name
+# suitable for use as a base event like "Key".
+def event_base_name(names):
+ # If there's only one event in this group, the "common name" is just
+ # the event name.
+ if len(names) == 1:
+ return names[0]
+
+ # Handle a few special cases where the longest common prefix is empty: eg.
+ # EnterNotify/LeaveNotify/FocusIn/FocusOut -> Crossing.
+ EVENT_NAMES = [
+ ('TouchBegin', 'Device'),
+ ('RawTouchBegin', 'RawDevice'),
+ ('Enter', 'Crossing'),
+ ('EnterNotify', 'Crossing'),
+ ('DeviceButtonPress', 'LegacyDevice'),
+ ]
+ for name, rename in EVENT_NAMES:
+ if name in names:
+ return rename
+
+ # Use the longest common prefix of the event names as the base name.
+ name = ''.join(
+ chars[0]
+ for chars in itertools.takewhile(lambda chars: len(set(chars)) == 1,
+ zip(*names)))
+ assert name
return name
@@ -251,17 +299,6 @@ class Indent:
self.xproto.write(self.closing_line)
-class NullContext:
- def __init__(self):
- pass
-
- def __enter__(self):
- pass
-
- def __exit__(self, exc_type, exc_value, exc_traceback):
- pass
-
-
# Make all members of |obj|, given by |fields|, visible in
# the local scope while this class is alive.
class ScopedFields:
@@ -302,20 +339,37 @@ def safe_name(name):
return name
-class GenXproto:
- def __init__(self, args, xcbgen):
+class FileWriter:
+ def __init__(self):
+ self.indent = 0
+
+ # Write a line to the current file.
+ def write(self, line=''):
+ indent = self.indent if line and not line.startswith('#') else 0
+ print((' ' * indent) + line, file=self.file)
+
+
+class GenXproto(FileWriter):
+ def __init__(self, proto, proto_dir, gen_dir, xcbgen, all_types):
+ FileWriter.__init__(self)
+
# Command line arguments
- self.args = args
+ self.proto = proto
+ self.xml_filename = os.path.join(proto_dir, '%s.xml' % proto)
+ self.header_file = open(os.path.join(gen_dir, '%s.h' % proto), 'w')
+ self.source_file = open(os.path.join(gen_dir, '%s.cc' % proto), 'w')
+ self.undef_file = open(os.path.join(gen_dir, '%s_undef.h' % proto),
+ 'w')
# Top-level xcbgen python module
self.xcbgen = xcbgen
+ # Types for every module including this one
+ self.all_types = all_types
+
# The last used UID for making unique names
self.prev_id = -1
- # Current indentation level
- self.indent = 0
-
# Current file to write to
self.file = None
@@ -331,7 +385,7 @@ class GenXproto:
# Map from type names to a set of types. Certain types
# like enums and simple types can alias each other.
- self.types = collections.defaultdict(set)
+ self.types = collections.defaultdict(list)
# Set of names of simple types to be replaced with enums
self.replace_with_enum = set()
@@ -339,10 +393,11 @@ class GenXproto:
# Map of enums to their underlying types
self.enum_types = collections.defaultdict(set)
- # Write a line to the current file.
- def write(self, line=''):
- indent = self.indent if line and not line.startswith('#') else 0
- print((' ' * indent) + line, file=self.file)
+ # Map from (XML tag, XML name) to XML element
+ self.module_names = {}
+
+ # Enums that represent bit masks.
+ self.bitenums = []
# Geenerate an ID suitable for use in temporary variable names.
def new_uid(self, ):
@@ -361,57 +416,70 @@ class GenXproto:
return ''
def rename_type(self, t, name):
- name = list(name)
- for i in range(1, len(name)):
- name[i] = adjust_type_case(name[i])
- name[-1] += self.type_suffix(t)
- return name
-
- # Given an xcbgen.xtypes.Type, returns a C++-namespace-qualified
- # string that looks like Input::InputClass::Key.
- def qualtype(self, t, name):
# Work around a bug in xcbgen: ('int') should have been ('int',)
if name == 'int':
name = ('int', )
- name = self.rename_type(t, name)
+ name = list(name)
if name[0] == 'xcb':
# Use namespace x11 instead of xcb.
name[0] = 'x11'
- # We want the non-extension X11 structures to live in a class too.
- if len(name) == 2:
- name[1:1] = ['XProto']
+ for i in range(1, len(name)):
+ name[i] = adjust_type_name(name[i])
+ name[-1] += self.type_suffix(t)
+ return name
+
+ # Given an unqualified |name| like ('Window') and a namespace like ['x11'],
+ # returns a fully qualified name like ('x11', 'Window').
+ def qualify_type(self, name, namespace):
+ if tuple(namespace + name) in self.all_types:
+ return namespace + name
+ return self.qualify_type(name, namespace[:-1])
+
+ # Given an xcbgen.xtypes.Type, returns a C++-namespace-qualified
+ # string that looks like Input::InputClass::Key.
+ def qualtype(self, t, name):
+ name = self.rename_type(t, name)
# Try to avoid adding namespace qualifiers if they're not necessary.
chop = 0
for t1, t2 in zip(name, self.namespace):
if t1 != t2:
break
+ if self.qualify_type(name[chop + 1:], self.namespace) != name:
+ break
chop += 1
return '::'.join(name[chop:])
def fieldtype(self, field):
- return self.qualtype(field.type, field.field_type)
+ return self.qualtype(field.type,
+ field.enum if field.enum else field.field_type)
+
+ def switch_fields(self, switch):
+ fields = []
+ for case in switch.bitcases:
+ if case.field_name:
+ fields.append(case)
+ else:
+ fields.extend(case.type.fields)
+ return fields
def add_field_to_scope(self, field, obj):
- if not field.visible or not field.wire:
+ if not field.visible or (not field.wire and not field.isfd):
+ return 0
+
+ field_name = safe_name(field.field_name)
+
+ if field.type.is_switch:
+ self.write('auto& %s = %s;' % (field_name, obj))
return 0
self.scope.append(field)
- field_name = safe_name(field.field_name)
- # There's one case where we would have generated:
- # auto& enable = enable.enable;
- # To prevent a compiler error from trying to use the variable
- # in its own definition, save to a temporary variable first.
- if field_name == obj:
- tmp_id = self.new_uid()
- self.write('auto& tmp%d = %s.%s;' % (tmp_id, obj, field_name))
- self.write('auto& %s = tmp%d;' % (field_name, tmp_id))
- elif field.for_list:
- self.write('%s %s;' % (self.fieldtype(field), field_name))
+ if field.for_list or field.for_switch:
+ self.write('%s %s{};' % (self.fieldtype(field), field_name))
else:
self.write('auto& %s = %s.%s;' % (field_name, obj, field_name))
@@ -432,9 +500,9 @@ class GenXproto:
# Work around conflicts caused by Xlib's liberal use of macros.
def undef(self, name):
- print('#ifdef %s' % name, file=self.args.undeffile)
- print('#undef %s' % name, file=self.args.undeffile)
- print('#endif', file=self.args.undeffile)
+ print('#ifdef %s' % name, file=self.undef_file)
+ print('#undef %s' % name, file=self.undef_file)
+ print('#endif', file=self.undef_file)
def expr(self, expr):
if expr.op == 'popcount':
@@ -476,16 +544,53 @@ class GenXproto:
assert expr.lenfield_name
return expr.lenfield_name
+ def get_xidunion_element(self, name):
+ key = ('xidunion', name[-1])
+ return self.module_names.get(key, None)
+
+ def declare_xidunion(self, xidunion, xidname):
+ names = [type_element.text for type_element in xidunion]
+ types = list(set([self.module.get_type(name) for name in names]))
+ assert len(types) == 1
+ value_type = types[0]
+ value_typename = self.qualtype(value_type, value_type.name)
+ with Indent(self, 'struct %s {' % xidname, '};'):
+ self.write('%s() : value{} {}' % xidname)
+ self.write()
+ for name in names:
+ cpp_name = self.module.get_type_name(name)
+ typename = self.qualtype(value_type, cpp_name)
+ self.write('%s(%s value) : value{static_cast<%s>(value)} {}' %
+ (xidname, typename, value_typename))
+ self.write(
+ 'operator %s() const { return static_cast<%s>(value); }' %
+ (typename, typename))
+ self.write()
+ self.write('%s value{};' % value_typename)
+
def declare_simple(self, item, name):
# The underlying type of an enum must be integral, so avoid defining
# FLOAT32 or FLOAT64. Usages are renamed to float and double instead.
renamed = tuple(self.rename_type(item, name))
- if name[-1] not in ('FLOAT32', 'FLOAT64'
- ) and renamed not in self.replace_with_enum:
- self.write(
- 'enum class %s : %s {};' %
- (adjust_type_case(name[-1]), self.qualtype(item, item.name)))
+ if (name[-1] in ('FLOAT32', 'FLOAT64')
+ or renamed in self.replace_with_enum):
+ return
+ elif name[-1] == 'FP1616':
+ # Xcbproto defines FP1616 as uint32_t instead of a struct of
+ # two 16-bit ints, which is how it's intended to be used.
+ with Indent(self, 'struct Fp1616 {', '};'):
+ self.write('int16_t integral;')
+ self.write('uint16_t frac;')
self.write()
+ return
+
+ xidunion = self.get_xidunion_element(name)
+ if xidunion:
+ self.declare_xidunion(xidunion, renamed[-1])
+ else:
+ self.write('enum class %s : %s {};' %
+ (renamed[-1], self.qualtype(item, item.name)))
+ self.write()
def copy_primitive(self, name):
self.write('%s(&%s, &buf);' %
@@ -495,28 +600,36 @@ class GenXproto:
type_name = self.fieldtype(field)
name = safe_name(field.field_name)
+ def copy_basic():
+ self.write('%s %s;' % (type_name, name))
+ self.copy_primitive(name)
+
if name in ('major_opcode', 'minor_opcode'):
assert not self.is_read
- is_ext = any(
- [f.field_name == 'minor_opcode' for f in field.parent.fields])
- if is_ext and name == 'major_opcode':
- self.write('// Caller fills in extension major opcode.')
- self.write('Pad(&buf, sizeof(%s));' % type_name)
+ is_ext = self.module.namespace.is_ext
+ self.write(
+ '%s %s = %s;' %
+ (type_name, name, 'info_.major_opcode' if is_ext
+ and name == 'major_opcode' else field.parent[0].opcode))
+ self.copy_primitive(name)
+ elif name == 'response_type':
+ if self.is_read:
+ copy_basic()
else:
- self.write('%s %s = %s;' %
- (type_name, name, field.parent.opcode))
+ container_type, container_name = field.parent
+ assert container_type.is_event
+ opcode = container_type.opcodes[container_name]
+ self.write('%s %s = %s;' % (type_name, name, opcode))
self.copy_primitive(name)
- elif name in ('response_type', 'sequence', 'extension'):
+ elif name in ('extension', 'error_code', 'event_type'):
assert self.is_read
- self.write('%s %s;' % (type_name, name))
- self.copy_primitive(name)
+ copy_basic()
elif name == 'length':
if not self.is_read:
self.write('// Caller fills in length for writes.')
self.write('Pad(&buf, sizeof(%s));' % type_name)
else:
- self.write('%s %s;' % (type_name, name))
- self.copy_primitive(name)
+ copy_basic()
else:
assert field.type.is_expr
assert (not isinstance(field.type, self.xcbgen.xtypes.Enum))
@@ -527,48 +640,52 @@ class GenXproto:
def declare_case(self, case):
assert case.type.is_case != case.type.is_bitcase
- with (Indent(self, 'struct {', '} %s;' % safe_name(case.field_name))
- if case.field_name else NullContext()):
- for case_field in case.type.fields:
- self.declare_field(case_field)
-
- def copy_case(self, case, switch_var):
- op = 'CaseEq' if case.type.is_case else 'BitAnd'
+ fields = [
+ field for case_field in case.type.fields
+ for field in self.declare_field(case_field)
+ ]
+ if not case.field_name:
+ return fields
+ name = safe_name(case.field_name)
+ with Indent(self, 'struct %s_t {' % name, '};'):
+ for field in fields:
+ self.write('%s %s{};' % field)
+ return [(name + '_t', name)]
+
+ def copy_case(self, case, switch_name):
+ op = 'CaseEq' if case.type.is_case else 'CaseAnd'
condition = ' || '.join([
- '%s(%s, %s)' % (op, switch_var, self.expr(expr))
+ '%s(%s_expr, %s)' % (op, switch_name, self.expr(expr))
for expr in case.type.expr
])
with Indent(self, 'if (%s) {' % condition, '}'):
- with (ScopedFields(self, case.field_name, case.type.fields)
- if case.field_name else NullContext()):
+ if case.field_name:
+ fields = [case]
+ obj = '(*%s.%s)' % (switch_name, safe_name(case.field_name))
+ else:
+ fields = case.type.fields
+ obj = '*' + switch_name
+ for case_field in fields:
+ name = safe_name(case_field.field_name)
+ if case_field.visible and self.is_read:
+ self.write('%s.%s.emplace();' % (switch_name, name))
+ with ScopedFields(self, obj, case.type.fields):
for case_field in case.type.fields:
- assert case_field.wire
self.copy_field(case_field)
def declare_switch(self, field):
- t = field.type
- name = safe_name(field.field_name)
-
- with Indent(self, 'struct {', '} %s;' % name):
- for case in t.bitcases:
- self.declare_case(case)
+ return [('base::Optional<%s>' % field_type, field_name)
+ for case in field.type.bitcases
+ for field_type, field_name in self.declare_case(case)]
def copy_switch(self, field):
t = field.type
name = safe_name(field.field_name)
- scope_fields = []
+ self.write('auto %s_expr = %s;' % (name, self.expr(t.expr)))
for case in t.bitcases:
- if case.field_name:
- scope_fields.append(case)
- else:
- scope_fields.extend(case.type.fields)
- with Indent(self, '{', '}'), ScopedFields(self, name, scope_fields):
- switch_var = name + '_expr'
- self.write('auto %s = %s;' % (switch_var, self.expr(t.expr)))
- for case in t.bitcases:
- self.copy_case(case, switch_var)
+ self.copy_case(case, name)
def declare_list(self, field):
t = field.type
@@ -588,7 +705,7 @@ class GenXproto:
type_name = 'std::string'
else:
type_name = 'std::vector<%s>' % type_name
- self.write('%s %s{};' % (type_name, name))
+ return [(type_name, name)]
def copy_list(self, field):
t = field.type
@@ -604,35 +721,60 @@ class GenXproto:
with Indent(self, 'for (auto& %s_elem : %s) {' % (name, name), '}'):
elem_name = name + '_elem'
elem_type = t.member
- if elem_type.is_simple or elem_type.is_union:
- assert (not isinstance(elem_type, self.xcbgen.xtypes.Enum))
- self.copy_primitive(elem_name)
- else:
- assert elem_type.is_container
- self.copy_container(elem_type, elem_name)
+ elem_field = self.xcbgen.expr.Field(elem_type, field.field_type,
+ elem_name, field.visible,
+ field.wire, field.auto,
+ field.enum, field.isfd)
+ elem_field.for_list = None
+ elem_field.for_switch = None
+ self.copy_field(elem_field)
+
+ def generate_switch_var(self, field):
+ name = safe_name(field.field_name)
+ for case in field.for_switch.type.bitcases:
+ case_field = case if case.field_name else case.type.fields[0]
+ self.write('SwitchVar(%s, %s.%s.has_value(), %s, &%s);' %
+ (self.expr(case.type.expr[0]),
+ safe_name(field.for_switch.field_name),
+ safe_name(case_field.field_name),
+ 'true' if case.type.is_bitcase else 'false', name))
def declare_field(self, field):
t = field.type
name = safe_name(field.field_name)
- if not field.wire or not field.visible or field.for_list:
- return
+ if not field.visible or field.for_list or field.for_switch:
+ return []
if t.is_switch:
- self.declare_switch(field)
- elif t.is_list:
- self.declare_list(field)
- else:
- self.write(
- '%s %s{};' %
- (self.qualtype(field.type, field.enum
- if field.enum else field.field_type), name))
+ return self.declare_switch(field)
+ if t.is_list:
+ return self.declare_list(field)
+ return [(self.fieldtype(field), name)]
def copy_field(self, field):
+ if not field.wire and not field.isfd:
+ return
+
t = field.type
+ renamed = tuple(self.rename_type(field.type, field.field_type))
+ if t.is_list:
+ t.member = self.all_types.get(renamed, t.member)
+ else:
+ t = self.all_types.get(renamed, t)
name = safe_name(field.field_name)
self.write('// ' + name)
+
+ # If this is a generated field, initialize the value of the field
+ # variable from the given context.
+ if not self.is_read:
+ if field.for_list:
+ self.write('%s = %s.size();' %
+ (name, safe_name(field.for_list.field_name)))
+ if field.for_switch:
+ self.generate_switch_var(field)
+
if t.is_pad:
if t.align > 1:
assert t.nmemb == 1
@@ -642,11 +784,6 @@ class GenXproto:
self.write('Pad(&buf, %d);' % t.nmemb)
elif not field.visible:
self.copy_special_field(field)
- elif field.for_list:
- if not self.is_read:
- self.write('%s = %s.size();' %
- (name, safe_name(field.for_list.field_name)))
- self.copy_primitive(name)
elif t.is_switch:
self.copy_switch(field)
elif t.is_list:
@@ -656,6 +793,9 @@ class GenXproto:
elif t.is_container:
with Indent(self, '{', '}'):
self.copy_container(t, name)
+ elif t.is_fd:
+ # TODO(https://crbug.com/1066670): Copy FDs out of band.
+ self.write('NOTIMPLEMENTED();')
else:
assert t.is_simple
if field.enum:
@@ -663,6 +803,8 @@ class GenXproto:
else:
self.copy_primitive(name)
+ self.write()
+
def declare_enum(self, enum):
def declare_enum_entry(name, value):
name = safe_name(name)
@@ -672,7 +814,7 @@ class GenXproto:
self.undef(enum.name[-1])
with Indent(
self, 'enum class %s : %s {' %
- (adjust_type_case(enum.name[-1]), self.enum_types[enum.name][0]
+ (adjust_type_name(enum.name[-1]), self.enum_types[enum.name][0]
if enum.name in self.enum_types else 'int'), '};'):
bitnames = set([name for name, _ in enum.bits])
for name, value in enum.values:
@@ -686,7 +828,7 @@ class GenXproto:
# The size of enum types may be different depending on the
# context, so they should always be casted to the contextual
# underlying type before calling Read() or Write().
- underlying_type = self.fieldtype(field)
+ underlying_type = self.qualtype(field.type, field.type.name)
tmp_name = 'tmp%d' % self.new_uid()
real_name = safe_name(field.field_name)
self.write('%s %s;' % (underlying_type, tmp_name))
@@ -699,30 +841,84 @@ class GenXproto:
self.write('%s = static_cast<%s>(%s);' %
(real_name, enum_type, tmp_name))
- def declare_container(self, struct):
- name = struct.name[-1] + self.type_suffix(struct)
+ def declare_fields(self, fields):
+ for field in fields:
+ for field_type_name in self.declare_field(field):
+ self.write('%s %s{};' % field_type_name)
+
+ def declare_event(self, event, name):
+ event_name = name[-1] + 'Event'
+ self.undef(event_name)
+ with Indent(self, 'struct %s {' % adjust_type_name(event_name), '};'):
+ self.write('static constexpr int type_id = %d;' % event.type_id)
+ if len(event.opcodes) == 1:
+ self.write('static constexpr uint8_t opcode = %s;' %
+ event.opcodes[name])
+ else:
+ with Indent(self, 'enum Opcode {', '} opcode{};'):
+ items = [(int(x), y)
+ for (y, x) in event.enum_opcodes.items()]
+ for opcode, opname in sorted(items):
+ self.undef(opname)
+ self.write('%s = %s,' % (opname, opcode))
+ self.write('bool send_event{};')
+ self.declare_fields(event.fields)
+ self.write()
+
+ def declare_container(self, struct, struct_name):
+ name = struct_name[-1] + self.type_suffix(struct)
self.undef(name)
- with Indent(self, 'struct %s {' % adjust_type_case(name), '};'):
- for field in struct.fields:
- self.declare_field(field)
+ with Indent(self, 'struct %s {' % adjust_type_name(name), '};'):
+ self.declare_fields(struct.fields)
self.write()
def copy_container(self, struct, name):
assert not struct.is_union
with ScopedFields(self, name, struct.fields):
for field in struct.fields:
- if field.wire:
- self.copy_field(field)
- self.write()
+ self.copy_field(field)
+
+ def read_special_container(self, struct, name):
+ self.namespace = ['x11']
+ name = self.qualtype(struct, name)
+ self.write('template <> COMPONENT_EXPORT(X11)')
+ self.write('%s Read<%s>(' % (name, name))
+ with Indent(self, ' const uint8_t* buffer) {', '}'):
+ self.write('ReadBuffer buf{buffer, 0UL};')
+ self.write('%s obj;' % name)
+ self.write()
+ self.is_read = True
+ self.copy_container(struct, 'obj')
+ self.write('return obj;')
+ self.write()
+
+ def write_special_container(self, struct, name):
+ self.namespace = ['x11']
+ name = self.qualtype(struct, name)
+ self.write('template <> COMPONENT_EXPORT(X11)')
+ self.write('std::vector<uint8_t> Write<%s>(' % name)
+ with Indent(self, ' const %s& obj) {' % name, '}'):
+ self.write('WriteBuffer buf;')
+ self.write()
+ self.is_read = False
+ self.copy_container(struct, 'obj')
+ self.write('return buf;')
+ self.write()
def declare_union(self, union):
name = union.name[-1]
+ if union.elt.tag == 'eventstruct':
+ # There's only one of these in all of the protocol descriptions.
+ # It's just used to represent any 32-byte event for XInput.
+ self.write('using %s = std::array<uint8_t, 32>;' % name)
+ return
with Indent(self, 'union %s {' % name, '};'):
self.write('%s() { memset(this, 0, sizeof(*this)); }' % name)
self.write()
for field in union.fields:
- type_name = self.fieldtype(field)
- self.write('%s %s;' % (type_name, safe_name(field.field_name)))
+ field_type_names = self.declare_field(field)
+ assert len(field_type_names) == 1
+ self.write('%s %s;' % field_type_names[0])
self.write(
'static_assert(std::is_trivially_copyable<%s>::value, "");' % name)
self.write()
@@ -730,26 +926,30 @@ class GenXproto:
def declare_request(self, request):
method_name = request.name[-1]
request_name = method_name + 'Request'
- reply_name = method_name + 'Reply'
+ reply_name = method_name + 'Reply' if request.reply else 'void'
- self.declare_container(request)
- if request.reply:
- self.declare_container(request.reply)
- else:
- reply_name = 'void'
+ in_class = self.namespace == ['x11', self.class_name]
- self.write('using %sResponse = Response<%s>;' %
- (method_name, reply_name))
- self.write()
+ if not in_class or self.module.namespace.is_ext:
+ self.declare_container(request, request.name)
+ if request.reply:
+ self.declare_container(request.reply, request.reply.name)
- self.write('Future<%s> %s(' % (reply_name, method_name))
- self.write(' const %s& request);' % request_name)
- self.write()
+ self.write('using %sResponse = Response<%s>;' %
+ (method_name, reply_name))
+ self.write()
+
+ if in_class:
+ self.write('Future<%s> %s(' % (reply_name, method_name))
+ self.write(' const %s& request);' % request_name)
+ self.write()
def define_request(self, request):
method_name = '%s::%s' % (self.class_name, request.name[-1])
- request_name = method_name + 'Request'
- reply_name = method_name + 'Reply'
+ prefix = (method_name
+ if self.module.namespace.is_ext else request.name[-1])
+ request_name = prefix + 'Request'
+ reply_name = prefix + 'Reply'
reply = request.reply
if not reply:
@@ -758,6 +958,12 @@ class GenXproto:
self.write('Future<%s>' % reply_name)
self.write('%s(' % method_name)
with Indent(self, ' const %s& request) {' % request_name, '}'):
+ cond = '!connection_->Ready()'
+ if self.module.namespace.is_ext:
+ cond += ' || !present()'
+ self.write('if (%s)' % cond)
+ self.write(' return {};')
+ self.write()
self.namespace = ['x11', self.class_name]
self.write('WriteBuffer buf;')
self.write()
@@ -765,7 +971,7 @@ class GenXproto:
self.copy_container(request, 'request')
self.write('Align(&buf, 4);')
self.write()
- self.write('return x11::SendRequest<%s>(display_, &buf);' %
+ self.write('return x11::SendRequest<%s>(connection_, &buf);' %
reply_name)
self.write()
@@ -789,14 +995,38 @@ class GenXproto:
self.write('return reply;')
self.write()
+ def define_event(self, event, name):
+ self.namespace = ['x11']
+ name = self.qualtype(event, name)
+ self.write('template <> COMPONENT_EXPORT(X11)')
+ self.write('void ReadEvent<%s>(' % name)
+ with Indent(self, ' %s* event_, const uint8_t* buffer) {' % name,
+ '}'):
+ self.write('ReadBuffer buf{buffer, 0UL};')
+ self.write()
+ self.is_read = True
+ self.copy_container(event, '(*event_)')
+ self.write()
+
+ def define_type(self, item, name):
+ if name in READ_SPECIAL:
+ self.read_special_container(item, name)
+ if name in WRITE_SPECIAL:
+ self.write_special_container(item, name)
+ if isinstance(item, self.xcbgen.xtypes.Request):
+ self.define_request(item)
+ elif item.is_event:
+ self.define_event(item, name)
+
def declare_type(self, item, name):
if item.is_union:
self.declare_union(item)
elif isinstance(item, self.xcbgen.xtypes.Request):
self.declare_request(item)
+ elif item.is_event:
+ self.declare_event(item, name)
elif item.is_container:
- item.name = name
- self.declare_container(item)
+ self.declare_container(item, name)
elif isinstance(item, self.xcbgen.xtypes.Enum):
self.declare_enum(item)
else:
@@ -823,72 +1053,141 @@ class GenXproto:
if enums:
assert len(enums) == 1
enum = enums[0]
- field.enum = self.module.get_type(enum).name if enums else None
+ field.enum = self.module.get_type(enum).name
self.enum_types[enum].add(field.type.name)
+ else:
+ field.enum = None
def resolve_type(self, t, name):
renamed = tuple(self.rename_type(t, name))
- if t in self.types[renamed]:
- return
- self.types[renamed].add(t)
+ assert renamed[0] == 'x11'
+ assert t not in self.types[renamed]
+ self.types[renamed].append(t)
+ self.all_types[renamed] = t
+
+ if isinstance(t, self.xcbgen.xtypes.Enum):
+ self.bitenums.append((t, name))
if not t.is_container:
return
- if t.is_switch:
- fields = {}
- for case in t.bitcases:
- if case.field_name:
- fields[case.field_name] = case
- else:
- for field in case.type.fields:
- fields[field.field_name] = field
- else:
- fields = {field.field_name: field for field in t.fields}
+ fields = {
+ field.field_name: field
+ for field in (self.switch_fields(t) if t.is_switch else t.fields)
+ }
self.resolve_element(t.elt, fields)
for field in fields.values():
- field.parent = t
- field.for_list = None
+ if field.field_name == 'sequence':
+ field.visible = True
+ field.parent = (t, name)
+ # |for_list| and |for_switch| may have already been set when
+ # processing other fields in this structure.
+ field.for_list = getattr(field, 'for_list', None)
+ field.for_switch = getattr(field, 'for_switch', None)
+
+ for is_type, for_type in ((field.type.is_list, 'for_list'),
+ (field.type.is_switch, 'for_switch')):
+ if not is_type:
+ continue
+ expr = field.type.expr
+ field_name = expr.lenfield_name
+ if (expr.op in (None, 'calculate_len')
+ and field_name in fields):
+ setattr(fields[field_name], for_type, field)
+
if field.type.is_switch or field.type.is_case_or_bitcase:
self.resolve_type(field.type, field.field_type)
- elif field.type.is_list:
- self.resolve_type(field.type.member, field.type.member.name)
- expr = field.type.expr
- if not expr.op and expr.lenfield_name in fields:
- fields[expr.lenfield_name].for_list = field
- else:
- self.resolve_type(field.type, field.type.name)
if isinstance(t, self.xcbgen.xtypes.Request) and t.reply:
self.resolve_type(t.reply, t.reply.name)
+ # Multiple event names may map to the same underlying event. For these
+ # cases, we want to avoid duplicating the event structure. Instead, put
+ # all of these events under one structure with an additional opcode field
+ # to indicate the type of event.
+ def uniquify_events(self):
+ # Manually merge some events in XInput. These groups of 8 events have
+ # idential structure, and are merged as XIDeviceEvent in Xlib. To avoid
+ # duplication, and to ease the transition from Xlib to XProto, we merge
+ # the events here too.
+ # TODO(thomasanderson): We should avoid adding workarounds for xcbproto.
+ # Instead, the protocol files should be modified directly. However,
+ # some of the changes we want to make change the API, so the changes
+ # should be made in a fork in //third_party rather than upstreamed.
+ MERGE = [
+ ([
+ 'KeyPress', 'KeyRelease', 'ButtonPress', 'ButtonRelease',
+ 'Motion', 'TouchBegin', 'TouchUpdate', 'TouchEnd'
+ ], []),
+ ([
+ 'RawKeyPress', 'RawKeyRelease', 'RawButtonPress',
+ 'RawButtonRelease', 'RawMotion', 'RawTouchBegin',
+ 'RawTouchUpdate', 'RawTouchEnd'
+ ], []),
+ ]
+ for i, (name, t) in enumerate(self.module.all):
+ if t.is_event and name[1] == 'Input':
+ for names, event in MERGE:
+ if name[-1] in names:
+ if event:
+ event[0].opcodes.update(t.opcodes)
+ self.module.all[i] = name, event[0]
+ else:
+ event.append(t)
+
+ types = []
+ events = set()
+ for name, t in self.module.all:
+ if not t.is_event or len(t.opcodes) == 1:
+ types.append((name, t))
+ continue
+
+ renamed = tuple(self.rename_type(t, name))
+ self.all_types[renamed] = t
+ if t in events:
+ continue
+ events.add(t)
+
+ names = [name[-1] for name in t.opcodes.keys()]
+ name = name[:-1] + (event_base_name(names), )
+ types.append((name, t))
+
+ t.enum_opcodes = {}
+ for opname in t.opcodes:
+ opcode = t.opcodes[opname]
+ opname = opname[-1]
+ if opname.startswith(name[-1]):
+ opname = opname[len(name[-1]):]
+ t.enum_opcodes[opname] = opcode
+ self.module.all = types
+
# Perform preprocessing like renaming, reordering, and adding additional
# data fields.
def resolve(self):
- for name, t in self.module.all:
+ self.class_name = (adjust_type_name(self.module.namespace.ext_name)
+ if self.module.namespace.is_ext else 'XProto')
+
+ self.uniquify_events()
+
+ for i, (name, t) in enumerate(self.module.all):
+ # Work around a name conflict: the type ScreenSaver has the same
+ # name as the extension, so rename the type.
+ if name == ('xcb', 'ScreenSaver'):
+ name = ('xcb', 'ScreenSaverMode')
+ t.name = name
+ self.module.all[i] = (name, t)
self.resolve_type(t, name)
- to_delete = []
- for enum in self.enum_types:
- types = self.enum_types[enum]
+ for enum, types in list(self.enum_types.items()):
if len(types) == 1:
self.enum_types[enum] = list(types)[0]
else:
- to_delete.append(enum)
- for x in to_delete:
- del self.enum_types[x]
+ del self.enum_types[enum]
for t in self.types:
- # Lots of fields have types like uint8_t. Ignore these.
- if len(t) == 1:
- continue
- l = list(self.types[t])
- # For some reason, FDs always have distint types so they appear
- # duplicated in the set. If the set contains only FDs, then bail.
- if all(x.is_fd for x in l):
- continue
+ l = self.types[t]
if len(l) == 1:
continue
@@ -908,26 +1207,34 @@ class GenXproto:
self.replace_with_enum.add(t)
self.enum_types[enum.name] = simple.name
+ for node in self.module.namespace.root:
+ if 'name' in node.attrib:
+ key = (node.tag, node.attrib['name'])
+ assert key not in self.module_names
+ self.module_names[key] = node
+
# The order of types in xcbproto's xml files are inconsistent, so sort
- # them in the order {type aliases, enums, structs, requests/replies}.
- def type_order_priority(item):
+ # them in the order {type aliases, enums, xidunions, structs,
+ # requests/replies}.
+ def type_order_priority(module_type):
+ name, item = module_type
if item.is_simple:
- return 0
+ return 2 if self.get_xidunion_element(name) else 0
if isinstance(item, self.xcbgen.xtypes.Enum):
return 1
if isinstance(item, self.xcbgen.xtypes.Request):
- return 3
- return 2
+ return 4
+ return 3
- def cmp((_1, item1), (_2, item2)):
- return type_order_priority(item1) - type_order_priority(item2)
+ def cmp(type1, type2):
+ return type_order_priority(type1) - type_order_priority(type2)
# sort() is guaranteed to be stable.
- self.module.all.sort(cmp=cmp)
+ self.module.all.sort(key=functools.cmp_to_key(cmp))
def gen_header(self):
- self.file = self.args.headerfile
- include_guard = self.args.headerfile.name.replace('/', '_').replace(
+ self.file = self.header_file
+ include_guard = self.header_file.name.replace('/', '_').replace(
'.', '_').upper() + '_'
self.write('#ifndef ' + include_guard)
self.write('#define ' + include_guard)
@@ -939,37 +1246,86 @@ class GenXproto:
self.write('#include <vector>')
self.write()
self.write('#include "base/component_export.h"')
+ self.write('#include "base/optional.h"')
self.write('#include "ui/gfx/x/xproto_types.h"')
- for direct_import in self.module.direct_imports:
+ imports = set(self.module.direct_imports)
+ if self.module.namespace.is_ext:
+ imports.add(('xproto', 'xproto'))
+ for direct_import in sorted(list(imports)):
self.write('#include "%s.h"' % direct_import[-1])
self.write('#include "%s_undef.h"' % self.module.namespace.header)
self.write()
- self.write('typedef struct _XDisplay XDisplay;')
- self.write()
self.write('namespace x11 {')
self.write()
+ self.write('class Connection;')
+ self.write()
+
+ self.namespace = ['x11']
+ if not self.module.namespace.is_ext:
+ for (name, item) in self.module.all:
+ self.declare_type(item, name)
name = self.class_name
self.undef(name)
with Indent(self, 'class COMPONENT_EXPORT(X11) %s {' % name, '};'):
self.namespace = ['x11', self.class_name]
self.write('public:')
- self.write('explicit %s(XDisplay* display);' % name)
+ if self.module.namespace.is_ext:
+ self.write('static constexpr unsigned major_version = %s;' %
+ self.module.namespace.major_version)
+ self.write('static constexpr unsigned minor_version = %s;' %
+ self.module.namespace.minor_version)
+ self.write()
+ self.write(name + '(Connection* connection,')
+ self.write(' const x11::QueryExtensionReply& info);')
+ self.write()
+ with Indent(self, 'uint8_t present() const {', '}'):
+ self.write('return info_.present;')
+ with Indent(self, 'uint8_t major_opcode() const {', '}'):
+ self.write('return info_.major_opcode;')
+ with Indent(self, 'uint8_t first_event() const {', '}'):
+ self.write('return info_.first_event;')
+ with Indent(self, 'uint8_t first_error() const {', '}'):
+ self.write('return info_.first_error;')
+ else:
+ self.write('explicit %s(Connection* connection);' % name)
self.write()
- self.write('XDisplay* display() { return display_; }')
+ self.write(
+ 'Connection* connection() const { return connection_; }')
self.write()
for (name, item) in self.module.all:
- self.declare_type(item, name)
+ if self.module.namespace.is_ext:
+ self.declare_type(item, name)
+ elif isinstance(item, self.xcbgen.xtypes.Request):
+ self.declare_request(item)
self.write('private:')
- self.write('XDisplay* const display_;')
+ self.write('x11::Connection* const connection_;')
+ if self.module.namespace.is_ext:
+ self.write('x11::QueryExtensionReply info_{};')
self.write()
self.write('} // namespace x11')
self.write()
+ self.namespace = []
+
+ def binop(op, name):
+ self.write('inline constexpr %s operator%s(' % (name, op))
+ with Indent(self, ' {0} l, {0} r)'.format(name) + ' {', '}'):
+ self.write('using T = std::underlying_type_t<%s>;' % name)
+ self.write('return static_cast<%s>(' % name)
+ self.write(' static_cast<T>(l) %s static_cast<T>(r));' % op)
+ self.write()
+
+ for enum, name in self.bitenums:
+ name = self.qualtype(enum, name)
+ binop('|', name)
+ binop('&', name)
+
+ self.write()
self.write('#endif // ' + include_guard)
def gen_source(self):
- self.file = self.args.sourcefile
+ self.file = self.source_file
self.write('#include "%s.h"' % self.module.namespace.header)
self.write()
self.write('#include <xcb/xcb.h>')
@@ -980,46 +1336,246 @@ class GenXproto:
self.write()
self.write('namespace x11 {')
self.write()
- name = self.class_name
- self.write('%s::%s(XDisplay* display) : display_(display) {}' %
- (name, name))
+ ctor = '%s::%s' % (self.class_name, self.class_name)
+ if self.module.namespace.is_ext:
+ self.write(ctor + '(x11::Connection* connection,')
+ self.write(' const x11::QueryExtensionReply& info)')
+ self.write(' : connection_(connection), info_(info) {}')
+ else:
+ self.write(ctor +
+ '(Connection* connection) : connection_(connection) {}')
self.write()
for (name, item) in self.module.all:
- if isinstance(item, self.xcbgen.xtypes.Request):
- self.define_request(item)
+ self.define_type(item, name)
self.write('} // namespace x11')
- def generate(self):
- self.module = self.xcbgen.state.Module(self.args.xmlfile.name, None)
+ def parse(self):
+ self.module = self.xcbgen.state.Module(self.xml_filename, None)
self.module.register()
self.module.resolve()
- self.resolve()
- self.class_name = (adjust_type_case(self.module.namespace.ext_name)
- if self.module.namespace.is_ext else 'XProto')
+ def generate(self):
self.gen_header()
self.gen_source()
+class GenExtensionManager(FileWriter):
+ def __init__(self, gen_dir, genprotos):
+ FileWriter.__init__(self)
+
+ self.gen_dir = gen_dir
+ self.genprotos = genprotos
+ self.extensions = [
+ proto for proto in genprotos if proto.module.namespace.is_ext
+ ]
+
+ def gen_header(self):
+ self.file = open(os.path.join(self.gen_dir, 'extension_manager.h'),
+ 'w')
+ self.write('#ifndef UI_GFX_X_EXTENSION_MANAGER_H_')
+ self.write('#define UI_GFX_X_EXTENSION_MANAGER_H_')
+ self.write()
+ self.write('#include <memory>')
+ self.write()
+ self.write('#include "base/component_export.h"')
+ self.write()
+ self.write('// Avoid conflicts caused by the GenericEvent macro.')
+ self.write('#include "ui/gfx/x/ge_undef.h"')
+ self.write()
+ self.write('namespace x11 {')
+ self.write()
+ self.write('class Connection;')
+ self.write()
+ for genproto in self.genprotos:
+ self.write('class %s;' % genproto.class_name)
+ self.write()
+ with Indent(self, 'class COMPONENT_EXPORT(X11) ExtensionManager {',
+ '};'):
+ self.write('public:')
+ self.write('ExtensionManager();')
+ self.write('~ExtensionManager();')
+ self.write()
+ for extension in self.extensions:
+ name = extension.proto
+ self.write('%s& %s() { return *%s_; }' %
+ (extension.class_name, name, name))
+ self.write()
+ self.write('protected:')
+ self.write('void Init(Connection* conn);')
+ self.write()
+ self.write('private:')
+ for extension in self.extensions:
+ self.write('std::unique_ptr<%s> %s_;' %
+ (extension.class_name, extension.proto))
+ self.write()
+ self.write('} // namespace x11')
+ self.write()
+ self.write('#endif // UI_GFX_X_EXTENSION_MANAGER_H_')
+
+ def gen_source(self):
+ self.file = open(os.path.join(self.gen_dir, 'extension_manager.cc'),
+ 'w')
+ self.write('#include "ui/gfx/x/extension_manager.h"')
+ self.write()
+ self.write('#include "ui/gfx/x/connection.h"')
+ self.write('#include "ui/gfx/x/xproto_internal.h"')
+ for genproto in self.genprotos:
+ self.write('#include "ui/gfx/x/%s.h"' % genproto.proto)
+ self.write()
+ self.write('namespace x11 {')
+ self.write()
+ init = 'void ExtensionManager::Init'
+ with Indent(self, init + '(Connection* conn) {', '}'):
+ for extension in self.extensions:
+ self.write(
+ 'auto %s_future = conn->QueryExtension({"%s"});' %
+ (extension.proto, extension.module.namespace.ext_xname))
+ self.write()
+ for extension in self.extensions:
+ name = extension.proto
+ self.write(
+ '%s_ = MakeExtension<%s>(conn, std::move(%s_future));' %
+ (name, extension.class_name, name))
+ self.write()
+ self.write('ExtensionManager::ExtensionManager() = default;')
+ self.write('ExtensionManager::~ExtensionManager() = default;')
+ self.write()
+ self.write('} // namespace x11')
+
+
+class GenReadEvent(FileWriter):
+ def __init__(self, gen_dir, genprotos):
+ FileWriter.__init__(self)
+
+ self.gen_dir = gen_dir
+ self.genprotos = genprotos
+
+ self.events = []
+ for proto in self.genprotos:
+ for name, item in proto.module.all:
+ if item.is_event:
+ self.events.append((name, item, proto))
+
+ def event_condition(self, event, typename, proto):
+ ext = 'conn->%s()' % proto.proto
+
+ conds = []
+ if not proto.module.namespace.is_ext:
+ # Core protocol event
+ opcode = 'evtype'
+ elif event.is_ge_event:
+ # GenericEvent extension event
+ conds.extend([
+ 'evtype == GeGenericEvent::opcode',
+ '%s.present()' % ext,
+ 'ge->extension == %s.major_opcode()' % ext,
+ ])
+ opcode = 'ge->event_type'
+ else:
+ # Extension event
+ opcode = 'evtype - %s.first_event()' % ext
+ conds.append('%s.present()' % ext)
+
+ if len(event.opcodes) == 1:
+ conds.append('%s == %s::opcode' % (opcode, typename))
+ else:
+ conds.append('(%s)' % ' || '.join([
+ '%s == %s::%s' % (opcode, typename, opname)
+ for opname in event.enum_opcodes.keys()
+ ]))
+
+ return ' && '.join(conds), opcode
+
+ def gen_event(self, name, event, proto):
+ # We can't ever have a plain generic event. It must be a concrete
+ # event provided by an extension.
+ if name == ('xcb', 'GeGeneric'):
+ return
+
+ name = [adjust_type_name(part) for part in name[1:]]
+ typename = '::'.join(name) + 'Event'
+
+ cond, opcode = self.event_condition(event, typename, proto)
+ with Indent(self, 'if (%s) {' % cond, '}'):
+ self.write('event->type_id_ = %d;' % event.type_id)
+ with Indent(self, 'event->deleter_ = [](void* event) {', '};'):
+ self.write('delete reinterpret_cast<%s*>(event);' % typename)
+ self.write('auto* event_ = new %s;' % typename)
+ self.write('ReadEvent(event_, buf);')
+ if len(event.opcodes) > 1:
+ self.write('{0} = static_cast<decltype({0})>({1});'.format(
+ 'event_->opcode', opcode))
+ self.write('event_->send_event = send_event;')
+ self.write('event->event_ = event_;')
+ self.write('return;')
+ self.write()
+
+ def gen_source(self):
+ 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 "ui/gfx/x/connection.h"')
+ 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('void ReadEvent(')
+ args = 'Event* event, Connection* conn, const uint8_t* buf'
+ with Indent(self, ' %s) {' % args, '}'):
+ cast = 'auto* %s = reinterpret_cast<const %s*>(buf);'
+ self.write(cast % ('ev', 'xcb_generic_event_t'))
+ self.write(cast % ('ge', 'xcb_ge_generic_event_t'))
+ self.write('auto evtype = ev->response_type & ~kSendEventMask;')
+ self.write('bool send_event = ev->response_type & kSendEventMask;')
+ self.write()
+ for name, event, proto in self.events:
+ self.gen_event(name, event, proto)
+ self.write('NOTREACHED();')
+ self.write()
+ self.write('} // namespace x11')
+
+
def main():
parser = argparse.ArgumentParser()
- parser.add_argument('xmlfile', type=argparse.FileType('r'))
- parser.add_argument('undeffile', type=argparse.FileType('w'))
- parser.add_argument('headerfile', type=argparse.FileType('w'))
- parser.add_argument('sourcefile', type=argparse.FileType('w'))
- parser.add_argument('--sysroot')
+ parser.add_argument('xcbproto_dir', type=str)
+ parser.add_argument('gen_dir', type=str)
+ parser.add_argument('protos', type=str, nargs='*')
args = parser.parse_args()
- if args.sysroot:
- path = os.path.join(args.sysroot, 'usr', 'lib', 'python2.7',
- 'dist-packages')
- sys.path.insert(1, path)
-
+ sys.path.insert(1, args.xcbproto_dir)
import xcbgen.xtypes
import xcbgen.state
- generator = GenXproto(args, xcbgen)
- generator.generate()
+ all_types = {}
+ proto_src_dir = os.path.join(args.xcbproto_dir, 'src')
+ genprotos = [
+ GenXproto(proto, proto_src_dir, args.gen_dir, xcbgen, all_types)
+ for proto in args.protos
+ ]
+ for genproto in genprotos:
+ genproto.parse()
+ for genproto in genprotos:
+ genproto.resolve()
+
+ # Give each event a unique type ID. This is used by x11::Event to
+ # implement downcasting for events.
+ type_id = 1
+ for proto in genprotos:
+ for _, item in proto.module.all:
+ if item.is_event:
+ item.type_id = type_id
+ type_id += 1
+
+ for genproto in genprotos:
+ genproto.generate()
+
+ gen_extension_manager = GenExtensionManager(args.gen_dir, genprotos)
+ gen_extension_manager.gen_header()
+ gen_extension_manager.gen_source()
+
+ gen_read_event = GenReadEvent(args.gen_dir, genprotos)
+ gen_read_event.gen_source()
return 0
diff --git a/chromium/ui/gfx/x/request_queue.cc b/chromium/ui/gfx/x/request_queue.cc
deleted file mode 100644
index 9bd3ab2f248..00000000000
--- a/chromium/ui/gfx/x/request_queue.cc
+++ /dev/null
@@ -1,29 +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/request_queue.h"
-
-#include "base/check_op.h"
-
-namespace x11 {
-
-// static
-RequestQueue* RequestQueue::instance_ = nullptr;
-
-RequestQueue::RequestQueue() {
- DCHECK(!instance_);
- instance_ = this;
-}
-
-RequestQueue::~RequestQueue() {
- DCHECK_EQ(instance_, this);
- instance_ = nullptr;
-}
-
-// static
-RequestQueue* RequestQueue::GetInstance() {
- return instance_;
-}
-
-} // namespace x11
diff --git a/chromium/ui/gfx/x/request_queue.h b/chromium/ui/gfx/x/request_queue.h
deleted file mode 100644
index b48b1c031de..00000000000
--- a/chromium/ui/gfx/x/request_queue.h
+++ /dev/null
@@ -1,51 +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_GFX_X_REQUEST_QUEUE_H_
-#define UI_GFX_X_REQUEST_QUEUE_H_
-
-#include <xcb/xcb.h>
-
-#include <memory>
-
-#include "base/callback_forward.h"
-#include "base/component_export.h"
-#include "base/memory/free_deleter.h"
-
-namespace ui {
-class X11EventSource;
-}
-
-namespace x11 {
-
-// This interface allows //ui/gfx/x to call into //ui/events/platform/x11 which
-// is at a higher layer. It should not be used by client code.
-class COMPONENT_EXPORT(X11) RequestQueue {
- private:
- friend class ui::X11EventSource;
- template <typename T>
- friend class Future;
-
- using Reply = std::unique_ptr<uint8_t, base::FreeDeleter>;
- using Error = std::unique_ptr<xcb_generic_error_t, base::FreeDeleter>;
- using ResponseCallback = base::OnceCallback<void(Reply reply, Error error)>;
-
- RequestQueue();
- virtual ~RequestQueue();
-
- // Adds a request to the queue. |is_void| indicates if a reply is generated
- // for this request. |sequence| is the ID of the request. |callback| will
- // be called upon request completion (or failure).
- virtual void AddRequest(bool is_void,
- unsigned int sequence,
- ResponseCallback callback) = 0;
-
- static RequestQueue* GetInstance();
-
- static RequestQueue* instance_;
-};
-
-} // namespace x11
-
-#endif // UI_GFX_X_REQUEST_QUEUE_H_
diff --git a/chromium/ui/gfx/x/x11.h b/chromium/ui/gfx/x/x11.h
index b163f788d98..2cae7c5b3ee 100644
--- a/chromium/ui/gfx/x/x11.h
+++ b/chromium/ui/gfx/x/x11.h
@@ -31,11 +31,8 @@ extern "C" {
#include <X11/extensions/XShm.h>
#include <X11/extensions/XTest.h>
#include <X11/extensions/Xfixes.h>
-#include <X11/extensions/Xrandr.h>
#include <X11/extensions/Xrender.h>
#include <X11/extensions/record.h>
-#include <X11/extensions/scrnsaver.h>
-#include <X11/extensions/shape.h>
#include <X11/extensions/sync.h>
// Define XK_xxx before the #include of <X11/keysym.h> so that <X11/keysym.h>
@@ -76,6 +73,9 @@ extern "C" {
#include <X11/Sunkeysym.h>
#include <X11/XF86keysym.h>
#include <X11/keysym.h>
+}
+
+#include "ui/gfx/x/connection.h"
// These commonly used names are undefined and if necessary recreated
// in the x11 namespace below. This is the main purpose of this header
@@ -97,14 +97,13 @@ extern "C" {
#undef DeviceAdded // Defined by X11/extensions/XI.h to 0
#undef DeviceMode // Defined by X11/extensions/XI.h to 1
#undef DeviceRemoved // Defined by X11/extensions/XI.h to 1
-#undef FocusIn // Defined by X.h to 9
-#undef FocusOut // Defined by X.h to 10
-#undef None // Defined by X11/X.h to 0L
-#undef True // Defined by X11/Xlib.h to 1
-#undef False // Defined by X11/Xlib.h to 0
-#undef CurrentTime // Defined by X11/X.h to 0L
-#undef Success // Defined by X11/X.h to 0
-}
+#undef FocusIn // Defined by X.h to 9
+#undef FocusOut // Defined by X.h to 10
+#undef None // Defined by X11/X.h to 0L
+#undef True // Defined by X11/Xlib.h to 1
+#undef False // Defined by X11/Xlib.h to 0
+#undef CurrentTime // Defined by X11/X.h to 0L
+#undef Success // Defined by X11/X.h to 0
// The x11 namespace allows to scope X11 constants and types that
// would be problematic at the default preprocessor level.
diff --git a/chromium/ui/gfx/x/x11_atom_cache.cc b/chromium/ui/gfx/x/x11_atom_cache.cc
index 75f18c1b57a..2e09c095eea 100644
--- a/chromium/ui/gfx/x/x11_atom_cache.cc
+++ b/chromium/ui/gfx/x/x11_atom_cache.cc
@@ -20,76 +20,76 @@ namespace {
struct {
const char* atom_name;
- Atom atom_value;
+ x11::Atom atom_value;
} const kPredefinedAtoms[] = {
- // {"PRIMARY", XA_PRIMARY},
- // {"SECONDARY", XA_SECONDARY},
- // {"ARC", XA_ARC},
- {"ATOM", XA_ATOM},
- // {"BITMAP", XA_BITMAP},
- {"CARDINAL", XA_CARDINAL},
- // {"COLORMAP", XA_COLORMAP},
- // {"CURSOR", XA_CURSOR},
- // {"CUT_BUFFER0", XA_CUT_BUFFER0},
- // {"CUT_BUFFER1", XA_CUT_BUFFER1},
- // {"CUT_BUFFER2", XA_CUT_BUFFER2},
- // {"CUT_BUFFER3", XA_CUT_BUFFER3},
- // {"CUT_BUFFER4", XA_CUT_BUFFER4},
- // {"CUT_BUFFER5", XA_CUT_BUFFER5},
- // {"CUT_BUFFER6", XA_CUT_BUFFER6},
- // {"CUT_BUFFER7", XA_CUT_BUFFER7},
- // {"DRAWABLE", XA_DRAWABLE},
- // {"FONT", XA_FONT},
- // {"INTEGER", XA_INTEGER},
- // {"PIXMAP", XA_PIXMAP},
- // {"POINT", XA_POINT},
- // {"RECTANGLE", XA_RECTANGLE},
- // {"RESOURCE_MANAGER", XA_RESOURCE_MANAGER},
- // {"RGB_COLOR_MAP", XA_RGB_COLOR_MAP},
- // {"RGB_BEST_MAP", XA_RGB_BEST_MAP},
- // {"RGB_BLUE_MAP", XA_RGB_BLUE_MAP},
- // {"RGB_DEFAULT_MAP", XA_RGB_DEFAULT_MAP},
- // {"RGB_GRAY_MAP", XA_RGB_GRAY_MAP},
- // {"RGB_GREEN_MAP", XA_RGB_GREEN_MAP},
- // {"RGB_RED_MAP", XA_RGB_RED_MAP},
- {"STRING", XA_STRING},
- // {"VISUALID", XA_VISUALID},
- // {"WINDOW", XA_WINDOW},
- // {"WM_COMMAND", XA_WM_COMMAND},
- // {"WM_HINTS", XA_WM_HINTS},
- // {"WM_CLIENT_MACHINE", XA_WM_CLIENT_MACHINE},
- // {"WM_ICON_NAME", XA_WM_ICON_NAME},
- // {"WM_ICON_SIZE", XA_WM_ICON_SIZE},
- // {"WM_NAME", XA_WM_NAME},
- // {"WM_NORMAL_HINTS", XA_WM_NORMAL_HINTS},
- // {"WM_SIZE_HINTS", XA_WM_SIZE_HINTS},
- // {"WM_ZOOM_HINTS", XA_WM_ZOOM_HINTS},
- // {"MIN_SPACE", XA_MIN_SPACE},
- // {"NORM_SPACE", XA_NORM_SPACE},
- // {"MAX_SPACE", XA_MAX_SPACE},
- // {"END_SPACE", XA_END_SPACE},
- // {"SUPERSCRIPT_X", XA_SUPERSCRIPT_X},
- // {"SUPERSCRIPT_Y", XA_SUPERSCRIPT_Y},
- // {"SUBSCRIPT_X", XA_SUBSCRIPT_X},
- // {"SUBSCRIPT_Y", XA_SUBSCRIPT_Y},
- // {"UNDERLINE_POSITION", XA_UNDERLINE_POSITION},
- // {"UNDERLINE_THICKNESS", XA_UNDERLINE_THICKNESS},
- // {"STRIKEOUT_ASCENT", XA_STRIKEOUT_ASCENT},
- // {"STRIKEOUT_DESCENT", XA_STRIKEOUT_DESCENT},
- // {"ITALIC_ANGLE", XA_ITALIC_ANGLE},
- // {"X_HEIGHT", XA_X_HEIGHT},
- // {"QUAD_WIDTH", XA_QUAD_WIDTH},
- // {"WEIGHT", XA_WEIGHT},
- // {"POINT_SIZE", XA_POINT_SIZE},
- // {"RESOLUTION", XA_RESOLUTION},
- // {"COPYRIGHT", XA_COPYRIGHT},
- // {"NOTICE", XA_NOTICE},
- // {"FONT_NAME", XA_FONT_NAME},
- // {"FAMILY_NAME", XA_FAMILY_NAME},
- // {"FULL_NAME", XA_FULL_NAME},
- // {"CAP_HEIGHT", XA_CAP_HEIGHT},
- {"WM_CLASS", XA_WM_CLASS},
- // {"WM_TRANSIENT_FOR", XA_WM_TRANSIENT_FOR},
+ // {"PRIMARY", x11::Atom::PRIMARY},
+ // {"SECONDARY", x11::Atom::SECONDARY},
+ // {"ARC", x11::Atom::ARC},
+ {"ATOM", x11::Atom::ATOM},
+ // {"BITMAP", x11::Atom::BITMAP},
+ {"CARDINAL", x11::Atom::CARDINAL},
+ // {"COLORMAP", x11::Atom::COLORMAP},
+ // {"CURSOR", x11::Atom::CURSOR},
+ // {"CUT_BUFFER0", x11::Atom::CUT_BUFFER0},
+ // {"CUT_BUFFER1", x11::Atom::CUT_BUFFER1},
+ // {"CUT_BUFFER2", x11::Atom::CUT_BUFFER2},
+ // {"CUT_BUFFER3", x11::Atom::CUT_BUFFER3},
+ // {"CUT_BUFFER4", x11::Atom::CUT_BUFFER4},
+ // {"CUT_BUFFER5", x11::Atom::CUT_BUFFER5},
+ // {"CUT_BUFFER6", x11::Atom::CUT_BUFFER6},
+ // {"CUT_BUFFER7", x11::Atom::CUT_BUFFER7},
+ // {"DRAWABLE", x11::Atom::DRAWABLE},
+ // {"FONT", x11::Atom::FONT},
+ // {"INTEGER", x11::Atom::INTEGER},
+ // {"PIXMAP", x11::Atom::PIXMAP},
+ // {"POINT", x11::Atom::POINT},
+ // {"RECTANGLE", x11::Atom::RECTANGLE},
+ // {"RESOURCE_MANAGER", x11::Atom::RESOURCE_MANAGER},
+ // {"RGB_COLOR_MAP", x11::Atom::RGB_COLOR_MAP},
+ // {"RGB_BEST_MAP", x11::Atom::RGB_BEST_MAP},
+ // {"RGB_BLUE_MAP", x11::Atom::RGB_BLUE_MAP},
+ // {"RGB_DEFAULT_MAP", x11::Atom::RGB_DEFAULT_MAP},
+ // {"RGB_GRAY_MAP", x11::Atom::RGB_GRAY_MAP},
+ // {"RGB_GREEN_MAP", x11::Atom::RGB_GREEN_MAP},
+ // {"RGB_RED_MAP", x11::Atom::RGB_RED_MAP},
+ {"STRING", x11::Atom::STRING},
+ // {"VISUALID", x11::Atom::VISUALID},
+ // {"WINDOW", x11::Atom::WINDOW},
+ // {"WM_COMMAND", x11::Atom::WM_COMMAND},
+ // {"WM_HINTS", x11::Atom::WM_HINTS},
+ // {"WM_CLIENT_MACHINE", x11::Atom::WM_CLIENT_MACHINE},
+ // {"WM_ICON_NAME", x11::Atom::WM_ICON_NAME},
+ // {"WM_ICON_SIZE", x11::Atom::WM_ICON_SIZE},
+ // {"WM_NAME", x11::Atom::WM_NAME},
+ // {"WM_NORMAL_HINTS", x11::Atom::WM_NORMAL_HINTS},
+ // {"WM_SIZE_HINTS", x11::Atom::WM_SIZE_HINTS},
+ // {"WM_ZOOM_HINTS", x11::Atom::WM_ZOOM_HINTS},
+ // {"MIN_SPACE", x11::Atom::MIN_SPACE},
+ // {"NORM_SPACE", x11::Atom::NORM_SPACE},
+ // {"MAX_SPACE", x11::Atom::MAX_SPACE},
+ // {"END_SPACE", x11::Atom::END_SPACE},
+ // {"SUPERSCRIPT_X", x11::Atom::SUPERSCRIPT_X},
+ // {"SUPERSCRIPT_Y", x11::Atom::SUPERSCRIPT_Y},
+ // {"SUBSCRIPT_X", x11::Atom::SUBSCRIPT_X},
+ // {"SUBSCRIPT_Y", x11::Atom::SUBSCRIPT_Y},
+ // {"UNDERLINE_POSITION", x11::Atom::UNDERLINE_POSITION},
+ // {"UNDERLINE_THICKNESS", x11::Atom::UNDERLINE_THICKNESS},
+ // {"STRIKEOUT_ASCENT", x11::Atom::STRIKEOUT_ASCENT},
+ // {"STRIKEOUT_DESCENT", x11::Atom::STRIKEOUT_DESCENT},
+ // {"ITALIC_ANGLE", x11::Atom::ITALIC_ANGLE},
+ // {"X_HEIGHT", x11::Atom::X_HEIGHT},
+ // {"QUAD_WIDTH", x11::Atom::QUAD_WIDTH},
+ // {"WEIGHT", x11::Atom::WEIGHT},
+ // {"POINT_SIZE", x11::Atom::POINT_SIZE},
+ // {"RESOLUTION", x11::Atom::RESOLUTION},
+ // {"COPYRIGHT", x11::Atom::COPYRIGHT},
+ // {"NOTICE", x11::Atom::NOTICE},
+ // {"FONT_NAME", x11::Atom::FONT_NAME},
+ // {"FAMILY_NAME", x11::Atom::FAMILY_NAME},
+ // {"FULL_NAME", x11::Atom::FULL_NAME},
+ // {"CAP_HEIGHT", x11::Atom::CAP_HEIGHT},
+ {"WM_CLASS", x11::Atom::WM_CLASS},
+ // {"WM_TRANSIENT_FOR", x11::Atom::WM_TRANSIENT_FOR},
};
constexpr const char* kAtomsToCache[] = {
@@ -244,7 +244,7 @@ constexpr int kCacheCount = base::size(kAtomsToCache);
namespace gfx {
-XAtom GetAtom(const char* name) {
+x11::Atom GetAtom(const std::string& name) {
return X11AtomCache::GetInstance()->GetAtom(name);
}
@@ -256,27 +256,26 @@ X11AtomCache::X11AtomCache() : connection_(x11::Connection::Get()) {
for (const auto& predefined_atom : kPredefinedAtoms)
cached_atoms_[predefined_atom.atom_name] = predefined_atom.atom_value;
- std::vector<x11::Future<x11::XProto::InternAtomReply>> requests;
+ std::vector<x11::Future<x11::InternAtomReply>> requests;
requests.reserve(kCacheCount);
for (const char* name : kAtomsToCache)
requests.push_back(connection_->InternAtom({.name = name}));
for (size_t i = 0; i < kCacheCount; ++i) {
if (auto response = requests[i].Sync())
- cached_atoms_[kAtomsToCache[i]] = static_cast<XAtom>(response->atom);
+ cached_atoms_[kAtomsToCache[i]] = static_cast<x11::Atom>(response->atom);
}
}
X11AtomCache::~X11AtomCache() = default;
-XAtom X11AtomCache::GetAtom(const char* name) const {
- DCHECK(name);
+x11::Atom X11AtomCache::GetAtom(const std::string& name) const {
const auto it = cached_atoms_.find(name);
if (it != cached_atoms_.end())
return it->second;
- XAtom atom = 0;
+ x11::Atom atom = x11::Atom::None;
if (auto response = connection_->InternAtom({.name = name}).Sync()) {
- atom = static_cast<XAtom>(response->atom);
+ atom = static_cast<x11::Atom>(response->atom);
cached_atoms_.emplace(name, atom);
} else {
static int error_count = 0;
diff --git a/chromium/ui/gfx/x/x11_atom_cache.h b/chromium/ui/gfx/x/x11_atom_cache.h
index b04608a783c..53fb799875f 100644
--- a/chromium/ui/gfx/x/x11_atom_cache.h
+++ b/chromium/ui/gfx/x/x11_atom_cache.h
@@ -24,7 +24,7 @@ class Connection;
namespace gfx {
// Gets the X atom for default display corresponding to atom_name.
-GFX_EXPORT XAtom GetAtom(const char* atom_name);
+GFX_EXPORT x11::Atom GetAtom(const std::string& atom_name);
// Pre-caches all Atoms on first use to minimize roundtrips to the X11
// server. By default, GetAtom() will CHECK() that atoms accessed through
@@ -35,7 +35,7 @@ class GFX_EXPORT X11AtomCache {
static X11AtomCache* GetInstance();
private:
- friend XAtom GetAtom(const char* atom_name);
+ friend x11::Atom GetAtom(const std::string& atom_name);
friend struct base::DefaultSingletonTraits<X11AtomCache>;
X11AtomCache();
@@ -43,12 +43,12 @@ class GFX_EXPORT X11AtomCache {
// Returns the pre-interned Atom without having to go to the x server.
// On failure, x11::None is returned.
- XAtom GetAtom(const char*) const;
+ x11::Atom GetAtom(const std::string&) const;
x11::Connection* connection_;
// Using std::map, as it is possible for thousands of atoms to be registered.
- mutable std::map<std::string, XAtom> cached_atoms_;
+ mutable std::map<std::string, x11::Atom> cached_atoms_;
DISALLOW_COPY_AND_ASSIGN(X11AtomCache);
};
diff --git a/chromium/ui/gfx/x/x11_error_tracker.cc b/chromium/ui/gfx/x/x11_error_tracker.cc
index a6f054f5ba2..6592ae04838 100644
--- a/chromium/ui/gfx/x/x11_error_tracker.cc
+++ b/chromium/ui/gfx/x/x11_error_tracker.cc
@@ -10,7 +10,7 @@
namespace {
unsigned char g_x11_error_code = 0;
-static gfx::X11ErrorTracker* g_handler = NULL;
+static gfx::X11ErrorTracker* g_handler = nullptr;
int X11ErrorHandler(Display* display, XErrorEvent* error) {
g_x11_error_code = error->error_code;
@@ -24,7 +24,7 @@ namespace gfx {
X11ErrorTracker::X11ErrorTracker() {
// This is a non-exhaustive check for incorrect usage. It disallows nested
// X11ErrorTracker instances on the same thread.
- DCHECK(g_handler == NULL);
+ DCHECK(g_handler == nullptr);
g_handler = this;
XSync(GetXDisplay(), False);
old_handler_ = XSetErrorHandler(X11ErrorHandler);
@@ -32,7 +32,7 @@ X11ErrorTracker::X11ErrorTracker() {
}
X11ErrorTracker::~X11ErrorTracker() {
- g_handler = NULL;
+ g_handler = nullptr;
XSetErrorHandler(old_handler_);
}
diff --git a/chromium/ui/gfx/x/x11_path.cc b/chromium/ui/gfx/x/x11_path.cc
index 4a171dbc564..937e206007e 100644
--- a/chromium/ui/gfx/x/x11_path.cc
+++ b/chromium/ui/gfx/x/x11_path.cc
@@ -12,8 +12,9 @@
namespace gfx {
-Region CreateRegionFromSkRegion(const SkRegion& region) {
- Region result = XCreateRegion();
+std::unique_ptr<std::vector<x11::Rectangle>> CreateRegionFromSkRegion(
+ const SkRegion& region) {
+ auto result = std::make_unique<std::vector<x11::Rectangle>>();
for (SkRegion::Iterator i(region); !i.done(); i.next()) {
XRectangle rect;
@@ -21,23 +22,23 @@ Region CreateRegionFromSkRegion(const SkRegion& region) {
rect.y = i.rect().y();
rect.width = i.rect().width();
rect.height = i.rect().height();
- XUnionRectWithRegion(&rect, result, result);
+ result->push_back({
+ .x = i.rect().x(),
+ .y = i.rect().y(),
+ .width = i.rect().width(),
+ .height = i.rect().height(),
+ });
}
return result;
}
-Region CreateRegionFromSkPath(const SkPath& path) {
- int point_count = path.getPoints(nullptr, 0);
- std::unique_ptr<SkPoint[]> points(new SkPoint[point_count]);
- path.getPoints(points.get(), point_count);
- std::unique_ptr<XPoint[]> x11_points(new XPoint[point_count]);
- for (int i = 0; i < point_count; ++i) {
- x11_points[i].x = SkScalarRoundToInt(points[i].fX);
- x11_points[i].y = SkScalarRoundToInt(points[i].fY);
- }
-
- return XPolygonRegion(x11_points.get(), point_count, EvenOddRule);
+std::unique_ptr<std::vector<x11::Rectangle>> CreateRegionFromSkPath(
+ const SkPath& path) {
+ SkRegion clip{path.getBounds().roundOut()};
+ SkRegion region;
+ region.setPath(path, clip);
+ return CreateRegionFromSkRegion(region);
}
} // namespace gfx
diff --git a/chromium/ui/gfx/x/x11_path.h b/chromium/ui/gfx/x/x11_path.h
index a85e67a287e..9e5d4be9bae 100644
--- a/chromium/ui/gfx/x/x11_path.h
+++ b/chromium/ui/gfx/x/x11_path.h
@@ -6,7 +6,7 @@
#define UI_GFX_X_X11_PATH_H_
#include "ui/gfx/gfx_export.h"
-#include "ui/gfx/x/x11_types.h"
+#include "ui/gfx/x/xproto.h"
class SkPath;
class SkRegion;
@@ -15,11 +15,13 @@ namespace gfx {
// Creates a new XRegion given |region|. The caller is responsible for
// destroying the returned region.
-GFX_EXPORT XRegion* CreateRegionFromSkRegion(const SkRegion& region);
+GFX_EXPORT std::unique_ptr<std::vector<x11::Rectangle>>
+CreateRegionFromSkRegion(const SkRegion& region);
// Creates a new XRegion given |path|. The caller is responsible for destroying
// the returned region.
-GFX_EXPORT XRegion* CreateRegionFromSkPath(const SkPath& path);
+GFX_EXPORT std::unique_ptr<std::vector<x11::Rectangle>> CreateRegionFromSkPath(
+ const SkPath& path);
} // namespace gfx
diff --git a/chromium/ui/gfx/x/x11_types.cc b/chromium/ui/gfx/x/x11_types.cc
index ebbe076ab6b..ad41a13dff3 100644
--- a/chromium/ui/gfx/x/x11_types.cc
+++ b/chromium/ui/gfx/x/x11_types.cc
@@ -77,10 +77,10 @@ void PutARGBImage(XDisplay* display,
image.width = data_width;
image.height = data_height;
- image.format = static_cast<int>(x11::XProto::ImageFormat::ZPixmap);
- image.byte_order = static_cast<int>(x11::XProto::ImageOrder::LSBFirst);
+ image.format = static_cast<int>(x11::ImageFormat::ZPixmap);
+ image.byte_order = static_cast<int>(x11::ImageOrder::LSBFirst);
image.bitmap_unit = 8;
- image.bitmap_bit_order = static_cast<int>(x11::XProto::ImageOrder::LSBFirst);
+ image.bitmap_bit_order = static_cast<int>(x11::ImageOrder::LSBFirst);
image.depth = depth;
image.bits_per_pixel = pixmap_bpp;
image.bytes_per_line = data_width * pixmap_bpp / 8;
diff --git a/chromium/ui/gfx/x/x11_types.h b/chromium/ui/gfx/x/x11_types.h
index 8ea0ca4ca49..a1886764342 100644
--- a/chromium/ui/gfx/x/x11_types.h
+++ b/chromium/ui/gfx/x/x11_types.h
@@ -10,9 +10,8 @@
#include <memory>
#include "ui/gfx/gfx_export.h"
+#include "ui/gfx/x/connection.h"
-typedef unsigned long XAtom;
-typedef unsigned long XID;
typedef unsigned long VisualID;
typedef struct _XcursorImage XcursorImage;
typedef union _XEvent XEvent;
diff --git a/chromium/ui/gfx/x/xproto_internal.h b/chromium/ui/gfx/x/xproto_internal.h
index f76ebe5ecac..32c68b4f801 100644
--- a/chromium/ui/gfx/x/xproto_internal.h
+++ b/chromium/ui/gfx/x/xproto_internal.h
@@ -20,7 +20,9 @@
#include <type_traits>
#include "base/component_export.h"
+#include "base/logging.h"
#include "base/optional.h"
+#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/xproto_types.h"
namespace x11 {
@@ -49,11 +51,17 @@ struct ReadBuffer {
};
template <typename T>
-void Write(const T* t, WriteBuffer* buf) {
- static_assert(std::is_trivially_copyable<T>::value, "");
+void VerifyAlignment(T* t, size_t offset) {
// On the wire, X11 types are always aligned to their size. This is a sanity
// check to ensure padding etc are working properly.
- DCHECK_EQ(buf->size() % sizeof(*t), 0UL);
+ if (sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8)
+ DCHECK_EQ(offset % sizeof(*t), 0UL);
+}
+
+template <typename T>
+void Write(const T* t, WriteBuffer* buf) {
+ static_assert(std::is_trivially_copyable<T>::value, "");
+ VerifyAlignment(t, buf->size());
const uint8_t* start = reinterpret_cast<const uint8_t*>(t);
std::copy(start, start + sizeof(*t), std::back_inserter(*buf));
}
@@ -61,9 +69,7 @@ void Write(const T* t, WriteBuffer* buf) {
template <typename T>
void Read(T* t, ReadBuffer* buf) {
static_assert(std::is_trivially_copyable<T>::value, "");
- // On the wire, X11 types are always aligned to their size. This is a sanity
- // check to ensure padding etc are working properly.
- DCHECK_EQ(buf->offset % sizeof(*t), 0UL);
+ VerifyAlignment(t, buf->offset);
memcpy(t, buf->data + buf->offset, sizeof(*t));
buf->offset += sizeof(*t);
}
@@ -85,12 +91,11 @@ inline void Align(ReadBuffer* buf, size_t align) {
}
template <typename Reply>
-Future<Reply> SendRequest(XDisplay* display, WriteBuffer* buf) {
+Future<Reply> SendRequest(x11::Connection* connection, WriteBuffer* buf) {
// Clang crashes when the value of |is_void| is inlined below,
// so keep this variable outside of |xpr|.
constexpr bool is_void = std::is_void<Reply>::value;
xcb_protocol_request_t xpr{
- .count = 1,
.ext = nullptr,
.isvoid = is_void,
};
@@ -101,23 +106,46 @@ Future<Reply> SendRequest(XDisplay* display, WriteBuffer* buf) {
uint16_t length;
};
- auto* header = reinterpret_cast<RequestHeader*>(buf->data());
+ struct ExtendedRequestHeader {
+ RequestHeader header;
+ uint32_t long_length;
+ };
+ static_assert(sizeof(ExtendedRequestHeader) == 8, "");
+
+ auto* old_header = reinterpret_cast<RequestHeader*>(buf->data());
+ ExtendedRequestHeader new_header{*old_header, 0};
+
// Requests are always a multiple of 4 bytes on the wire. Because of this,
// the length field represents the size in chunks of 4 bytes.
DCHECK_EQ(buf->size() % 4, 0UL);
- DCHECK_LE(buf->size() / 4, std::numeric_limits<uint16_t>::max());
- header->length = buf->size() / 4;
+ size_t size32 = buf->size() / 4;
+
+ struct iovec io[4];
+ memset(&io, 0, sizeof(io));
+ if (size32 < connection->setup().maximum_request_length) {
+ xpr.count = 1;
+ old_header->length = size32;
+ io[2].iov_base = buf->data();
+ io[2].iov_len = buf->size();
+ } else if (size32 < connection->extended_max_request_length()) {
+ xpr.count = 2;
+ DCHECK_EQ(new_header.header.length, 0U);
+ new_header.long_length = size32 + 1;
+ io[2].iov_base = &new_header;
+ io[2].iov_len = sizeof(ExtendedRequestHeader);
+ io[3].iov_base = buf->data() + sizeof(RequestHeader);
+ io[3].iov_len = buf->size() - sizeof(RequestHeader);
+ } else {
+ LOG(ERROR) << "Cannot send request of length " << buf->size();
+ return {nullptr, base::nullopt};
+ }
- struct iovec io[3];
- io[2].iov_base = buf->data();
- io[2].iov_len = buf->size();
+ xcb_connection_t* conn = connection->XcbConnection();
auto flags = XCB_REQUEST_CHECKED | XCB_REQUEST_RAW;
-
- xcb_connection_t* conn = XGetXCBConnection(display);
auto sequence = xcb_send_request(conn, flags, &io[2], &xpr);
if (xcb_connection_has_error(conn))
return {nullptr, base::nullopt};
- return {display, sequence};
+ return {connection, sequence};
}
// Helper function for xcbproto popcount. Given an integral type, returns the
@@ -143,19 +171,51 @@ bool CaseEq(T t, S s) {
return t == static_cast<decltype(t)>(s);
}
-// Helper function for xcbproto bitcase and & expressions. Checks if the
-// bitmasks |t| and |s| have any intersection.
+// Helper function for xcbproto bitcase expressions. Checks if the bitmasks |t|
+// and |s| have any intersection.
+template <typename T, typename S>
+bool CaseAnd(T t, S s) {
+ return static_cast<EnumBaseType<T>>(t) & static_cast<EnumBaseType<T>>(s);
+}
+
+// Helper function for xcbproto & expressions. Computes |t| & |s|.
template <typename T, typename S>
-bool BitAnd(T t, S s) {
+auto BitAnd(T t, S s) {
return static_cast<EnumBaseType<T>>(t) & static_cast<EnumBaseType<T>>(s);
}
-// Helper function for ~ expressions.
+// Helper function for xcbproto ~ expressions.
template <typename T>
-bool BitNot(T t) {
+auto BitNot(T t) {
return ~static_cast<EnumBaseType<T>>(t);
}
+// Helper function for generating switch values. |switch_var| is the value to
+// modify. |enum_val| is the value to set |switch_var| to if this is a regular
+// case, or the bit to be set in |switch_var| if this is a bit case. This
+// function is a no-op when |condition| is false.
+template <typename T>
+auto SwitchVar(T enum_val, bool condition, bool is_bitcase, T* switch_var) {
+ using EnumInt = EnumBaseType<T>;
+ if (!condition)
+ return;
+ EnumInt switch_int = static_cast<EnumInt>(*switch_var);
+ if (is_bitcase) {
+ *switch_var = static_cast<T>(switch_int | static_cast<EnumInt>(enum_val));
+ } else {
+ DCHECK(!switch_int);
+ *switch_var = enum_val;
+ }
+}
+
+template <typename T>
+std::unique_ptr<T> MakeExtension(Connection* connection,
+ Future<QueryExtensionReply> future) {
+ auto reply = future.Sync();
+ return std::make_unique<T>(connection,
+ reply ? *reply.reply : QueryExtensionReply{});
+}
+
} // namespace x11
#endif // UI_GFX_X_XPROTO_INTERNAL_H_
diff --git a/chromium/ui/gfx/x/xproto_types.cc b/chromium/ui/gfx/x/xproto_types.cc
new file mode 100644
index 00000000000..0fc634cecf3
--- /dev/null
+++ b/chromium/ui/gfx/x/xproto_types.cc
@@ -0,0 +1,76 @@
+// 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_types.h"
+
+#include "ui/gfx/x/connection.h"
+
+namespace x11 {
+
+FutureBase::FutureBase(Connection* connection,
+ base::Optional<unsigned int> sequence)
+ : connection_(connection), sequence_(sequence) {}
+
+// 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
+// handler throws away the reply and prints the error if there is one.
+FutureBase::~FutureBase() {
+ if (!sequence_)
+ return;
+
+ OnResponseImpl(base::BindOnce(
+ [](Connection* connection, RawReply reply, RawError error) {
+ if (!error)
+ return;
+
+ x11::LogErrorEventDescription(XErrorEvent({
+ .type = error->response_type,
+ .display = connection->display(),
+ .resourceid = error->resource_id,
+ .serial = error->full_sequence,
+ .error_code = error->error_code,
+ .request_code = error->major_code,
+ .minor_code = error->minor_code,
+ }));
+ },
+ connection_));
+}
+
+FutureBase::FutureBase(FutureBase&& future)
+ : connection_(future.connection_), sequence_(future.sequence_) {
+ future.connection_ = nullptr;
+ future.sequence_ = base::nullopt;
+}
+
+FutureBase& FutureBase::operator=(FutureBase&& future) {
+ connection_ = future.connection_;
+ sequence_ = future.sequence_;
+ future.connection_ = nullptr;
+ future.sequence_ = base::nullopt;
+ return *this;
+}
+
+void FutureBase::SyncImpl(Error** raw_error, uint8_t** raw_reply) {
+ if (!sequence_)
+ return;
+ *raw_reply = reinterpret_cast<uint8_t*>(
+ xcb_wait_for_reply(connection_->XcbConnection(), *sequence_, raw_error));
+ sequence_ = base::nullopt;
+}
+
+void FutureBase::SyncImpl(Error** raw_error) {
+ if (!sequence_)
+ return;
+ *raw_error = xcb_request_check(connection_->XcbConnection(), {*sequence_});
+ sequence_ = base::nullopt;
+}
+
+void FutureBase::OnResponseImpl(ResponseCallback callback) {
+ if (!sequence_)
+ return;
+ connection_->AddRequest(*sequence_, std::move(callback));
+ sequence_ = base::nullopt;
+}
+
+} // namespace x11
diff --git a/chromium/ui/gfx/x/xproto_types.h b/chromium/ui/gfx/x/xproto_types.h
index 9e5dfe09534..415c2146481 100644
--- a/chromium/ui/gfx/x/xproto_types.h
+++ b/chromium/ui/gfx/x/xproto_types.h
@@ -16,25 +16,37 @@
#include "base/callback.h"
#include "base/memory/free_deleter.h"
#include "base/optional.h"
-#include "ui/gfx/x/request_queue.h"
#include "ui/gfx/x/xproto_util.h"
typedef struct _XDisplay XDisplay;
namespace x11 {
+class Connection;
+
+constexpr uint8_t kSendEventMask = 0x80;
+
namespace detail {
template <typename Reply>
std::unique_ptr<Reply> ReadReply(const uint8_t* buffer);
-}
+} // namespace detail
using Error = xcb_generic_error_t;
template <class Reply>
class Future;
+template <typename T>
+T Read(const uint8_t* buf);
+
+template <typename T>
+std::vector<uint8_t> Write(const T& t);
+
+template <typename T>
+void ReadEvent(T* event, const uint8_t* buf);
+
template <typename Reply>
struct Response {
operator bool() const { return reply.get(); }
@@ -62,66 +74,48 @@ struct Response<void> {
: error(std::move(error)) {}
};
+class COMPONENT_EXPORT(X11) FutureBase {
+ public:
+ using RawReply = std::unique_ptr<uint8_t, base::FreeDeleter>;
+ using RawError = std::unique_ptr<xcb_generic_error_t, base::FreeDeleter>;
+ using ResponseCallback =
+ base::OnceCallback<void(RawReply reply, RawError error)>;
+
+ FutureBase(const FutureBase&) = delete;
+ FutureBase& operator=(const FutureBase&) = delete;
+
+ protected:
+ FutureBase(Connection* connection, base::Optional<unsigned int> sequence);
+ ~FutureBase();
+
+ FutureBase(FutureBase&& future);
+ FutureBase& operator=(FutureBase&& future);
+
+ void SyncImpl(Error** raw_error, uint8_t** raw_reply);
+ void SyncImpl(Error** raw_error);
+
+ void OnResponseImpl(ResponseCallback callback);
+
+ private:
+ Connection* connection_;
+ base::Optional<unsigned int> sequence_;
+};
+
// An x11::Future wraps an asynchronous response from the X11 server. The
// response may be waited-for with Sync(), or asynchronously handled by
// installing a response handler using OnResponse().
template <typename Reply>
-class Future {
+class Future : public FutureBase {
public:
using Callback = base::OnceCallback<void(Response<Reply> response)>;
- using RQ = RequestQueue;
-
- // 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
- // handler throws away the reply and prints the error if there is one.
- ~Future() {
- if (!sequence_)
- return;
-
- EnqueueRequest(base::BindOnce(
- [](XDisplay* display, RQ::Reply reply, RQ::Error error) {
- if (!error)
- return;
-
- x11::LogErrorEventDescription(XErrorEvent({
- .type = error->response_type,
- .display = display,
- .resourceid = error->resource_id,
- .serial = error->full_sequence,
- .error_code = error->error_code,
- .request_code = error->major_code,
- .minor_code = error->minor_code,
- }));
- },
- display_));
- }
-
- Future(const Future&) = delete;
- Future& operator=(const Future&) = delete;
-
- Future(Future&& future)
- : display_(future.display_), sequence_(future.sequence_) {
- future.display_ = nullptr;
- future.sequence_ = base::nullopt;
- }
- Future& operator=(Future&& future) {
- display_ = future.display_;
- sequence_ = future.sequence_;
- future.display_ = nullptr;
- future.sequence_ = base::nullopt;
- }
- xcb_connection_t* connection() { return XGetXCBConnection(display_); }
+ Future() : FutureBase(nullptr, base::nullopt) {}
// Blocks until we receive the response from the server. Returns the response.
Response<Reply> Sync() {
- if (!sequence_)
- return {{}, {}};
-
Error* raw_error = nullptr;
- uint8_t* raw_reply = reinterpret_cast<uint8_t*>(
- xcb_wait_for_reply(connection(), *sequence_, &raw_error));
- sequence_ = base::nullopt;
+ uint8_t* raw_reply = nullptr;
+ SyncImpl(&raw_error, &raw_reply);
std::unique_ptr<Reply> reply;
if (raw_reply) {
@@ -138,47 +132,37 @@ class Future {
// Installs |callback| to be run when the response is received.
void OnResponse(Callback callback) {
- if (!sequence_)
- return;
-
// This intermediate callback handles the conversion from |raw_reply| to a
// 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, RQ::Reply raw_reply, RQ::Error error) {
+ auto wrapper = [](Callback callback, RawReply raw_reply, RawError error) {
std::unique_ptr<Reply> reply =
raw_reply ? detail::ReadReply<Reply>(raw_reply.get()) : nullptr;
std::move(callback).Run({std::move(reply), std::move(error)});
};
- EnqueueRequest(base::BindOnce(wrapper, std::move(callback)));
+ OnResponseImpl(base::BindOnce(wrapper, std::move(callback)));
+ }
- sequence_ = base::nullopt;
+ void IgnoreError() {
+ OnResponse(base::BindOnce([](Response<Reply>) {}));
}
private:
template <typename R>
- friend Future<R> SendRequest(XDisplay*, std::vector<uint8_t>*);
-
- Future(XDisplay* display, base::Optional<unsigned int> sequence)
- : display_(display), sequence_(sequence) {}
-
- void EnqueueRequest(RQ::ResponseCallback callback) {
- RQ::GetInstance()->AddRequest(std::is_void<Reply>::value, *sequence_,
- std::move(callback));
- }
+ friend Future<R> SendRequest(Connection*, std::vector<uint8_t>*);
- XDisplay* display_;
- base::Optional<unsigned int> sequence_;
+ Future(Connection* connection, base::Optional<unsigned int> sequence)
+ : FutureBase(connection, sequence) {}
};
// 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() {
- if (!sequence_)
- return Response<void>(nullptr);
+ Error* raw_error = nullptr;
+ SyncImpl(&raw_error);
- Error* raw_error = xcb_request_check(connection(), {*sequence_});
std::unique_ptr<Error, base::FreeDeleter> error;
if (raw_error)
error.reset(raw_error);
@@ -190,18 +174,18 @@ inline Response<void> Future<void>::Sync() {
// response argument to |callback| will only contain an error if there was one.
template <>
inline void Future<void>::OnResponse(Callback callback) {
- if (!sequence_)
- return;
-
// See Future<Reply>::OnResponse() for an explanation of why
// this wrapper is necessary.
- auto wrapper = [](Callback callback, RQ::Reply reply, RQ::Error error) {
+ auto wrapper = [](Callback callback, RawReply reply, RawError error) {
DCHECK(!reply);
std::move(callback).Run(Response<void>{std::move(error)});
};
- EnqueueRequest(base::BindOnce(wrapper, std::move(callback)));
+ OnResponseImpl(base::BindOnce(wrapper, std::move(callback)));
+}
- sequence_ = base::nullopt;
+template <>
+inline void Future<void>::IgnoreError() {
+ OnResponse(base::BindOnce([](Response<void>) {}));
}
} // namespace x11
diff --git a/chromium/ui/gfx/x/xproto_util.cc b/chromium/ui/gfx/x/xproto_util.cc
index 495e4a64221..e08bf4f6b5a 100644
--- a/chromium/ui/gfx/x/xproto_util.cc
+++ b/chromium/ui/gfx/x/xproto_util.cc
@@ -4,8 +4,10 @@
#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/xproto.h"
namespace x11 {
@@ -21,7 +23,7 @@ void LogErrorEventDescription(const XErrorEvent& error_event) {
char request_str[256];
XDisplay* dpy = error_event.display;
- XProto conn{dpy};
+ x11::Connection* conn = x11::Connection::Get();
XGetErrorText(dpy, error_event.error_code, error_str, sizeof(error_str));
strncpy(request_str, "Unknown", sizeof(request_str));
@@ -30,7 +32,7 @@ void LogErrorEventDescription(const XErrorEvent& error_event) {
XGetErrorDatabaseText(dpy, "XRequest", num.c_str(), "Unknown", request_str,
sizeof(request_str));
} else {
- if (auto response = conn.ListExtensions({}).Sync()) {
+ if (auto response = conn->ListExtensions({}).Sync()) {
for (const auto& str : response->names) {
int ext_code, first_event, first_error;
const char* name = str.name.c_str();
diff --git a/chromium/ui/gl/BUILD.gn b/chromium/ui/gl/BUILD.gn
index b707e157ddb..fb084016885 100644
--- a/chromium/ui/gl/BUILD.gn
+++ b/chromium/ui/gl/BUILD.gn
@@ -4,6 +4,7 @@
import("//build/buildflag_header.gni")
import("//build/config/chrome_build.gni")
+import("//build/config/chromecast_build.gni")
import("//build/config/jumbo.gni")
import("//build/config/linux/pkg_config.gni")
import("//build/config/ui.gni")
@@ -395,6 +396,10 @@ jumbo_component("gl") {
deps += [ ":gl_jni_headers" ]
}
+
+ if (is_chromecast) {
+ defines += [ "CHROMECAST_BUILD" ]
+ }
}
if (is_mac && use_egl) {
diff --git a/chromium/ui/gl/DEPS b/chromium/ui/gl/DEPS
index e2673ea5193..1c7a89763c2 100644
--- a/chromium/ui/gl/DEPS
+++ b/chromium/ui/gl/DEPS
@@ -11,7 +11,7 @@ include_rules = [
specific_include_rules = {
# Allow us to include ANGLE's base platform implementation.
"angle_platform_impl.cc": [
- "+third_party/angle/include/platform/Platform.h",
+ "+third_party/angle/include/platform/PlatformMethods.h",
],
"direct_composition_surface_win_unittest.cc": [
"+ui/base/win/hidden_window.h",
diff --git a/chromium/ui/gl/android/android_surface_control_compat.cc b/chromium/ui/gl/android/android_surface_control_compat.cc
index 70a2f706f41..26aebb5dc8f 100644
--- a/chromium/ui/gl/android/android_surface_control_compat.cc
+++ b/chromium/ui/gl/android/android_surface_control_compat.cc
@@ -11,6 +11,7 @@
#include "base/atomic_sequence_num.h"
#include "base/bind.h"
#include "base/debug/crash_logging.h"
+#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/no_destructor.h"
#include "base/strings/string_number_conversions.h"
@@ -49,9 +50,6 @@ using pASurfaceTransaction_delete = void (*)(ASurfaceTransaction*);
using pASurfaceTransaction_apply = int64_t (*)(ASurfaceTransaction*);
using pASurfaceTransaction_setOnComplete =
void (*)(ASurfaceTransaction*, void* ctx, ASurfaceTransaction_OnComplete);
-using pASurfaceTransaction_reparent = void (*)(ASurfaceTransaction*,
- ASurfaceControl* surface_control,
- ASurfaceControl* new_parent);
using pASurfaceTransaction_setVisibility = void (*)(ASurfaceTransaction*,
ASurfaceControl*,
int8_t visibility);
@@ -146,7 +144,6 @@ struct SurfaceControlMethods {
LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_delete);
LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_apply);
LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_setOnComplete);
- LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_reparent);
LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_setVisibility);
LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_setZOrder);
LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_setBuffer);
@@ -178,7 +175,6 @@ struct SurfaceControlMethods {
pASurfaceTransaction_delete ASurfaceTransaction_deleteFn;
pASurfaceTransaction_apply ASurfaceTransaction_applyFn;
pASurfaceTransaction_setOnComplete ASurfaceTransaction_setOnCompleteFn;
- pASurfaceTransaction_reparent ASurfaceTransaction_reparentFn;
pASurfaceTransaction_setVisibility ASurfaceTransaction_setVisibilityFn;
pASurfaceTransaction_setZOrder ASurfaceTransaction_setZOrderFn;
pASurfaceTransaction_setBuffer ASurfaceTransaction_setBufferFn;
@@ -354,14 +350,8 @@ SurfaceControl::Surface::Surface(ANativeWindow* parent, const char* name) {
}
SurfaceControl::Surface::~Surface() {
- if (surface_) {
- // It is important to detach the surface from the tree before deleting it.
- Transaction transaction;
- transaction.SetParent(*this, nullptr);
- transaction.Apply();
-
+ if (surface_)
SurfaceControlMethods::Get().ASurfaceControl_releaseFn(surface_);
- }
}
SurfaceControl::SurfaceStats::SurfaceStats() = default;
@@ -491,13 +481,6 @@ void SurfaceControl::Transaction::SetOnCompleteCb(
transaction_, ack_ctx, &OnTransactionCompletedOnAnyThread);
}
-void SurfaceControl::Transaction::SetParent(const Surface& surface,
- const Surface* new_parent) {
- SurfaceControlMethods::Get().ASurfaceTransaction_reparentFn(
- transaction_, surface.surface(),
- new_parent ? new_parent->surface() : nullptr);
-}
-
void SurfaceControl::Transaction::Apply() {
TRACE_EVENT_ASYNC_BEGIN0("gpu,benchmark", "SurfaceControlTransaction", id_);
SurfaceControlMethods::Get().ASurfaceTransaction_applyFn(transaction_);
diff --git a/chromium/ui/gl/android/android_surface_control_compat.h b/chromium/ui/gl/android/android_surface_control_compat.h
index c5baeb7807d..2ee53e69f28 100644
--- a/chromium/ui/gl/android/android_surface_control_compat.h
+++ b/chromium/ui/gl/android/android_surface_control_compat.h
@@ -130,7 +130,6 @@ class GL_EXPORT SurfaceControl {
void SetOnCompleteCb(
OnCompleteCb cb,
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
- void SetParent(const Surface& surface, const Surface* new_parent);
void Apply();
diff --git a/chromium/ui/gl/angle_platform_impl.cc b/chromium/ui/gl/angle_platform_impl.cc
index 881934cd956..ff4b4a73c12 100644
--- a/chromium/ui/gl/angle_platform_impl.cc
+++ b/chromium/ui/gl/angle_platform_impl.cc
@@ -5,13 +5,16 @@
#include "ui/gl/angle_platform_impl.h"
#include "base/base64.h"
+#include "base/bind.h"
#include "base/callback.h"
#include "base/compiler_specific.h"
#include "base/lazy_instance.h"
#include "base/metrics/histogram.h"
#include "base/metrics/histogram_functions.h"
+#include "base/task/post_task.h"
+#include "base/task/thread_pool/thread_pool_instance.h"
#include "base/trace_event/trace_event.h"
-#include "third_party/angle/include/platform/Platform.h"
+#include "third_party/angle/include/platform/PlatformMethods.h"
#include "ui/gl/gl_bindings.h"
namespace angle {
@@ -120,6 +123,19 @@ void ANGLEPlatformImpl_histogramBoolean(PlatformMethods* platform,
ANGLEPlatformImpl_histogramEnumeration(platform, name, sample ? 1 : 0, 2);
}
+void ANGLEPlatformImpl_postWorkerTask(PlatformMethods* platform,
+ PostWorkerTaskCallback callback,
+ void* user_data) {
+ base::ThreadPool::PostTask(
+ FROM_HERE, {base::TaskPriority::USER_VISIBLE},
+ base::BindOnce(
+ [](PostWorkerTaskCallback callback, void* user_data) {
+ TRACE_EVENT0("toplevel", "ANGLEPlatformImpl::RunWorkerTask");
+ callback(user_data);
+ },
+ callback, user_data));
+}
+
} // anonymous namespace
NO_SANITIZE("cfi-icall")
@@ -155,6 +171,11 @@ bool InitializePlatform(EGLDisplay display) {
ANGLEPlatformImpl_monotonicallyIncreasingTime;
platformMethods->updateTraceEventDuration =
ANGLEPlatformImpl_updateTraceEventDuration;
+
+ // Initialize the delegate to allow posting tasks in the Chromium thread pool.
+ // The thread pool is not available in some unittests.
+ if (base::ThreadPoolInstance::Get())
+ platformMethods->postWorkerTask = ANGLEPlatformImpl_postWorkerTask;
return true;
}
diff --git a/chromium/ui/gl/buffer_format_utils.cc b/chromium/ui/gl/buffer_format_utils.cc
index d071b415c66..e3947290645 100644
--- a/chromium/ui/gl/buffer_format_utils.cc
+++ b/chromium/ui/gl/buffer_format_utils.cc
@@ -4,6 +4,7 @@
#include "ui/gl/buffer_format_utils.h"
+#include "base/notreached.h"
#include "ui/gl/gl_bindings.h"
namespace gl {
diff --git a/chromium/ui/gl/child_window_win.cc b/chromium/ui/gl/child_window_win.cc
index e17931dbb5d..3b9654af9ce 100644
--- a/chromium/ui/gl/child_window_win.cc
+++ b/chromium/ui/gl/child_window_win.cc
@@ -124,9 +124,9 @@ void DestroyWindowsOnThread(HWND child_window, HWND hidden_popup_window) {
ChildWindowWin::ChildWindowWin(HWND parent_window)
: parent_window_(parent_window) {}
-bool ChildWindowWin::Initialize() {
+void ChildWindowWin::Initialize() {
if (window_)
- return true;
+ return;
thread_ = std::make_unique<base::Thread>("Window owner thread");
base::Thread::Options options(base::MessagePumpType::UI, 0);
@@ -143,8 +143,6 @@ bool ChildWindowWin::Initialize() {
base::BindOnce(&CreateWindowsOnThread, gfx::Rect(window_rect).size(),
&event, &window_, &initial_parent_window_));
event.Wait();
-
- return true;
}
ChildWindowWin::~ChildWindowWin() {
diff --git a/chromium/ui/gl/child_window_win.h b/chromium/ui/gl/child_window_win.h
index c977e76bdb8..81bd99a8683 100644
--- a/chromium/ui/gl/child_window_win.h
+++ b/chromium/ui/gl/child_window_win.h
@@ -8,6 +8,7 @@
#include "base/memory/weak_ptr.h"
#include "base/task_runner.h"
#include "base/threading/thread.h"
+#include "ui/gl/gl_export.h"
#include <windows.h>
@@ -16,12 +17,12 @@ namespace gl {
// The window DirectComposition renders into needs to be owned by the process
// that's currently doing the rendering. The class creates and owns a window
// which is reparented by the browser to be a child of its window.
-class ChildWindowWin {
+class GL_EXPORT ChildWindowWin {
public:
explicit ChildWindowWin(HWND parent_window);
~ChildWindowWin();
- bool Initialize();
+ void Initialize();
HWND window() const { return window_; }
scoped_refptr<base::TaskRunner> GetTaskRunnerForTesting();
diff --git a/chromium/ui/gl/dc_layer_tree.cc b/chromium/ui/gl/dc_layer_tree.cc
index b97cf126264..f3548fbca02 100644
--- a/chromium/ui/gl/dc_layer_tree.cc
+++ b/chromium/ui/gl/dc_layer_tree.cc
@@ -4,8 +4,10 @@
#include "ui/gl/dc_layer_tree.h"
+#include "base/metrics/histogram_functions.h"
#include "base/trace_event/trace_event.h"
#include "ui/gl/direct_composition_child_surface_win.h"
+#include "ui/gl/direct_composition_surface_win.h"
#include "ui/gl/swap_chain_presenter.h"
namespace gl {
@@ -63,6 +65,8 @@ bool DCLayerTree::InitializeVideoProcessor(const gfx::Size& input_size,
// This can fail if the D3D device is "Microsoft Basic Display Adapter".
if (FAILED(d3d11_device_.As(&video_device_))) {
DLOG(ERROR) << "Failed to retrieve video device from D3D11 device";
+ DCHECK(false);
+ DirectCompositionSurfaceWin::DisableOverlays();
return false;
}
DCHECK(video_device_);
@@ -97,17 +101,27 @@ bool DCLayerTree::InitializeVideoProcessor(const gfx::Size& input_size,
desc.Usage = D3D11_VIDEO_USAGE_PLAYBACK_NORMAL;
HRESULT hr = video_device_->CreateVideoProcessorEnumerator(
&desc, &video_processor_enumerator_);
+ base::UmaHistogramSparse(
+ "GPU.DirectComposition.CreateVideoProcessorEnumerator", hr);
if (FAILED(hr)) {
DLOG(ERROR) << "CreateVideoProcessorEnumerator failed with error 0x"
<< std::hex << hr;
+ // It might fail again next time. Disable overlay support so
+ // overlay processor will stop sending down overlay frames.
+ DirectCompositionSurfaceWin::DisableOverlays();
return false;
}
hr = video_device_->CreateVideoProcessor(video_processor_enumerator_.Get(), 0,
&video_processor_);
+ base::UmaHistogramSparse(
+ "GPU.DirectComposition.VideoDeviceCreateVideoProcessor", hr);
if (FAILED(hr)) {
DLOG(ERROR) << "CreateVideoProcessor failed with error 0x" << std::hex
<< hr;
+ // It might fail again next time. Disable overlay support so
+ // overlay processor will stop sending down overlay frames.
+ DirectCompositionSurfaceWin::DisableOverlays();
return false;
}
diff --git a/chromium/ui/gl/direct_composition_child_surface_win.cc b/chromium/ui/gl/direct_composition_child_surface_win.cc
index 197d9798cb5..4c0c3441eb8 100644
--- a/chromium/ui/gl/direct_composition_child_surface_win.cc
+++ b/chromium/ui/gl/direct_composition_child_surface_win.cc
@@ -45,6 +45,8 @@ namespace {
// is made current, then this surface will be suspended.
IDCompositionSurface* g_current_surface = nullptr;
+bool g_direct_composition_swap_chain_failed = false;
+
} // namespace
DirectCompositionChildSurfaceWin::DirectCompositionChildSurfaceWin(
@@ -282,8 +284,13 @@ bool DirectCompositionChildSurfaceWin::SetDrawRectangle(
HRESULT hr = dcomp_device_->CreateSurface(
size_.width(), size_.height(), dxgi_format,
DXGI_ALPHA_MODE_PREMULTIPLIED, &dcomp_surface_);
+ base::UmaHistogramSparse("GPU.DirectComposition.DcompDeviceCreateSurface",
+ hr);
if (FAILED(hr)) {
DLOG(ERROR) << "CreateSurface failed with error " << std::hex << hr;
+ // Disable direct composition because CreateSurface might fail again next
+ // time.
+ g_direct_composition_swap_chain_failed = true;
return false;
}
} else if (!swap_chain_ && !enable_dc_layers_) {
@@ -323,9 +330,17 @@ bool DirectCompositionChildSurfaceWin::SetDrawRectangle(
"GPU.DirectComposition.CreateSwapChainForComposition", hr);
// If CreateSwapChainForComposition fails, we cannot draw to the
- // browser window. Failure here is indicative of an unrecoverable driver
- // bug.
- CHECK(SUCCEEDED(hr));
+ // browser window. Return false after disabling Direct Composition support
+ // and let the Renderer handle it. Either the GPU command buffer or the GPU
+ // process will be restarted.
+ if (FAILED(hr)) {
+ DLOG(ERROR) << "CreateSwapChainForComposition failed with error "
+ << std::hex << hr;
+ // Disable direct composition because SwapChain creation might fail again
+ // next time.
+ g_direct_composition_swap_chain_failed = true;
+ return false;
+ }
Microsoft::WRL::ComPtr<IDXGISwapChain3> swap_chain;
if (SUCCEEDED(swap_chain_.As(&swap_chain))) {
@@ -458,4 +473,9 @@ bool DirectCompositionChildSurfaceWin::SetEnableDCLayers(bool enable) {
return true;
}
+// static
+bool DirectCompositionChildSurfaceWin::IsDirectCompositionSwapChainFailed() {
+ return g_direct_composition_swap_chain_failed;
+}
+
} // namespace gl
diff --git a/chromium/ui/gl/direct_composition_child_surface_win.h b/chromium/ui/gl/direct_composition_child_surface_win.h
index 8708087a1dd..98a38f54be9 100644
--- a/chromium/ui/gl/direct_composition_child_surface_win.h
+++ b/chromium/ui/gl/direct_composition_child_surface_win.h
@@ -38,6 +38,7 @@ class GL_EXPORT DirectCompositionChildSurfaceWin : public GLSurfaceEGL {
const gfx::ColorSpace& color_space,
bool has_alpha) override;
bool SetEnableDCLayers(bool enable) override;
+ static bool IsDirectCompositionSwapChainFailed();
const Microsoft::WRL::ComPtr<IDCompositionSurface>& dcomp_surface() const {
return dcomp_surface_;
diff --git a/chromium/ui/gl/direct_composition_surface_win.cc b/chromium/ui/gl/direct_composition_surface_win.cc
index 94d32c59d67..7ace65466d0 100644
--- a/chromium/ui/gl/direct_composition_surface_win.cc
+++ b/chromium/ui/gl/direct_composition_surface_win.cc
@@ -63,19 +63,41 @@ void SetOverlayCapsValid(bool valid) {
base::AutoLock auto_lock(GetOverlayLock());
g_overlay_caps_valid = valid;
}
+// A warpper of IDXGIOutput4::CheckOverlayColorSpaceSupport()
+bool CheckOverlayColorSpaceSupport(
+ DXGI_FORMAT dxgi_format,
+ DXGI_COLOR_SPACE_TYPE dxgi_color_space,
+ Microsoft::WRL::ComPtr<IDXGIOutput> output,
+ Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device) {
+ UINT color_space_support_flags = 0;
+ Microsoft::WRL::ComPtr<IDXGIOutput4> output4;
+ if (FAILED(output.As(&output4)) ||
+ FAILED(output4->CheckOverlayColorSpaceSupport(
+ dxgi_format, dxgi_color_space, d3d11_device.Get(),
+ &color_space_support_flags)))
+ return false;
+ return (color_space_support_flags &
+ DXGI_OVERLAY_COLOR_SPACE_SUPPORT_FLAG_PRESENT);
+}
// Used for workaround limiting overlay size to monitor size.
gfx::Size g_overlay_monitor_size;
+DirectCompositionSurfaceWin::OverlayHDRInfoUpdateCallback
+ g_overlay_hdr_gpu_info_callback;
+
// Preferred overlay format set when detecting overlay support during
// initialization. Set to NV12 by default so that it's used when enabling
// overlays using command line flags.
DXGI_FORMAT g_overlay_format_used = DXGI_FORMAT_NV12;
+DXGI_FORMAT g_overlay_format_used_hdr = DXGI_FORMAT_UNKNOWN;
// These are the raw support info, which shouldn't depend on field trial state,
// or command line flags.
UINT g_nv12_overlay_support_flags = 0;
UINT g_yuy2_overlay_support_flags = 0;
+UINT g_bgra8_overlay_support_flags = 0;
+UINT g_rgb10a2_overlay_support_flags = 0;
bool FlagsSupportsOverlays(UINT flags) {
return (flags & (DXGI_OVERLAY_SUPPORT_FLAG_DIRECT |
@@ -84,14 +106,20 @@ bool FlagsSupportsOverlays(UINT flags) {
void GetGpuDriverOverlayInfo(bool* supports_overlays,
DXGI_FORMAT* overlay_format_used,
+ DXGI_FORMAT* overlay_format_used_hdr,
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) {
// Initialization
*supports_overlays = false;
*overlay_format_used = DXGI_FORMAT_NV12;
+ *overlay_format_used_hdr = DXGI_FORMAT_R10G10B10A2_UNORM;
*nv12_overlay_support_flags = 0;
*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.
@@ -143,6 +171,13 @@ void GetGpuDriverOverlayInfo(bool* supports_overlays,
nv12_overlay_support_flags);
output3->CheckOverlaySupport(DXGI_FORMAT_YUY2, d3d11_device.Get(),
yuy2_overlay_support_flags);
+ output3->CheckOverlaySupport(DXGI_FORMAT_B8G8R8A8_UNORM, d3d11_device.Get(),
+ bgra8_overlay_support_flags);
+ // Today it still returns false, which blocks Chrome from using HDR
+ // 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)) {
@@ -152,14 +187,9 @@ void GetGpuDriverOverlayInfo(bool* supports_overlays,
// COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709 is also supported. Rec 709 is
// commonly used for H.264 and HEVC. At least one Intel Gen9 SKU will not
// support NV12 overlays.
- UINT color_space_support_flags = 0;
- Microsoft::WRL::ComPtr<IDXGIOutput4> output4;
- if (SUCCEEDED(output.As(&output4)) &&
- SUCCEEDED(output4->CheckOverlayColorSpaceSupport(
+ if (CheckOverlayColorSpaceSupport(
DXGI_FORMAT_NV12, DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709,
- d3d11_device.Get(), &color_space_support_flags)) &&
- (color_space_support_flags &
- DXGI_OVERLAY_COLOR_SPACE_SUPPORT_FLAG_PRESENT)) {
+ output, d3d11_device)) {
// Some new Intel drivers only claim to support unscaled overlays, but
// scaled overlays still work. It's possible DWM works around it by
// performing an extra scaling Blt before calling the driver. Even when
@@ -182,6 +212,15 @@ void GetGpuDriverOverlayInfo(bool* supports_overlays,
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.
+ if (FlagsSupportsOverlays(*rgb10a2_overlay_support_flags)) {
+ if (!CheckOverlayColorSpaceSupport(
+ DXGI_FORMAT_R10G10B10A2_UNORM,
+ DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020, output, d3d11_device))
+ *rgb10a2_overlay_support_flags = 0;
+ }
// Early out after the first output that reports overlay support. All
// outputs are expected to report the same overlay support according to
@@ -202,6 +241,8 @@ void GetGpuDriverOverlayInfo(bool* supports_overlays,
*supports_overlays = true;
*nv12_overlay_support_flags = 0;
*yuy2_overlay_support_flags = 0;
+ *bgra8_overlay_support_flags = 0;
+ *rgb10a2_overlay_support_flags = 0;
// Software overlays always use NV12 because it's slightly more efficient and
// YUY2 was only used because Skylake doesn't support NV12 hardware overlays.
@@ -219,13 +260,18 @@ void UpdateOverlaySupport() {
bool supports_overlays = false;
DXGI_FORMAT overlay_format_used = DXGI_FORMAT_NV12;
+ DXGI_FORMAT overlay_format_used_hdr = DXGI_FORMAT_R10G10B10A2_UNORM;
UINT nv12_overlay_support_flags = 0;
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,
- &nv12_overlay_support_flags,
- &yuy2_overlay_support_flags, &overlay_monitor_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);
if (supports_overlays != SupportsOverlays() ||
overlay_format_used != g_overlay_format_used) {
@@ -241,8 +287,11 @@ void UpdateOverlaySupport() {
// Update global caps
SetSupportsOverlays(supports_overlays);
g_overlay_format_used = overlay_format_used;
+ g_overlay_format_used_hdr = overlay_format_used_hdr;
g_nv12_overlay_support_flags = nv12_overlay_support_flags;
g_yuy2_overlay_support_flags = yuy2_overlay_support_flags;
+ g_bgra8_overlay_support_flags = bgra8_overlay_support_flags;
+ g_rgb10a2_overlay_support_flags = rgb10a2_overlay_support_flags;
g_overlay_monitor_size = overlay_monitor_size;
}
@@ -257,6 +306,11 @@ bool SupportsLowLatencyPresentation() {
features::kDirectCompositionLowLatencyPresentation) &&
SupportsPresentationFeedback();
}
+
+void RunOverlayHdrGpuInfoUpdateCallback() {
+ if (g_overlay_hdr_gpu_info_callback)
+ g_overlay_hdr_gpu_info_callback.Run();
+}
} // namespace
DirectCompositionSurfaceWin::PendingFrame::PendingFrame(
@@ -351,7 +405,8 @@ bool DirectCompositionSurfaceWin::IsDirectCompositionSupported() {
return true;
}();
- return supported;
+ return supported && !DirectCompositionChildSurfaceWin::
+ IsDirectCompositionSwapChainFailed();
}
// static
@@ -384,6 +439,7 @@ bool DirectCompositionSurfaceWin::IsDecodeSwapChainSupported() {
// static
void DirectCompositionSurfaceWin::DisableOverlays() {
SetSupportsOverlays(false);
+ RunOverlayHdrGpuInfoUpdateCallback();
}
// static
@@ -407,10 +463,25 @@ bool DirectCompositionSurfaceWin::AreScaledOverlaysSupported() {
// static
UINT DirectCompositionSurfaceWin::GetOverlaySupportFlags(DXGI_FORMAT format) {
UpdateOverlaySupport();
- if (format == DXGI_FORMAT_NV12)
- return g_nv12_overlay_support_flags;
- DCHECK_EQ(DXGI_FORMAT_YUY2, format);
- return g_yuy2_overlay_support_flags;
+ UINT support_flag = 0;
+ switch (format) {
+ case DXGI_FORMAT_NV12:
+ support_flag = g_nv12_overlay_support_flags;
+ break;
+ case DXGI_FORMAT_YUY2:
+ support_flag = g_yuy2_overlay_support_flags;
+ break;
+ case DXGI_FORMAT_B8G8R8A8_UNORM:
+ support_flag = g_bgra8_overlay_support_flags;
+ break;
+ case DXGI_FORMAT_R10G10B10A2_UNORM:
+ support_flag = g_rgb10a2_overlay_support_flags;
+ break;
+ default:
+ NOTREACHED();
+ break;
+ }
+ return support_flag;
}
// static
@@ -430,9 +501,11 @@ void DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(
if (supported) {
g_nv12_overlay_support_flags |= DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
g_yuy2_overlay_support_flags |= DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
+ g_rgb10a2_overlay_support_flags |= DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
} else {
g_nv12_overlay_support_flags &= ~DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
g_yuy2_overlay_support_flags &= ~DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
+ g_rgb10a2_overlay_support_flags &= ~DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
}
DCHECK_EQ(supported, AreScaledOverlaysSupported());
}
@@ -457,8 +530,8 @@ bool DirectCompositionSurfaceWin::IsHDRSupported() {
return false;
HRESULT hr = S_OK;
- Microsoft::WRL::ComPtr<IDXGIFactory> factory;
- hr = CreateDXGIFactory(IID_PPV_ARGS(&factory));
+ Microsoft::WRL::ComPtr<IDXGIFactory1> factory;
+ hr = CreateDXGIFactory1(IID_PPV_ARGS(&factory));
if (FAILED(hr)) {
DLOG(ERROR) << "Failed to create DXGI factory.";
return false;
@@ -556,6 +629,12 @@ bool DirectCompositionSurfaceWin::AllowTearing() {
DirectCompositionSurfaceWin::IsSwapChainTearingSupported();
}
+// static
+void DirectCompositionSurfaceWin::SetOverlayHDRGpuInfoUpdateCallback(
+ OverlayHDRInfoUpdateCallback callback) {
+ g_overlay_hdr_gpu_info_callback = std::move(callback);
+}
+
bool DirectCompositionSurfaceWin::Initialize(GLSurfaceFormat format) {
d3d11_device_ = QueryD3D11DeviceObjectFromANGLE();
if (!d3d11_device_) {
@@ -570,10 +649,8 @@ bool DirectCompositionSurfaceWin::Initialize(GLSurfaceFormat format) {
return false;
}
- if (!child_window_.Initialize()) {
- DLOG(ERROR) << "Failed to initialize native window";
- return false;
- }
+ child_window_.Initialize();
+
window_ = child_window_.window();
if (!layer_tree_->Initialize(window_, d3d11_device_, dcomp_device_))
@@ -719,7 +796,13 @@ bool DirectCompositionSurfaceWin::SupportsProtectedVideo() const {
}
bool DirectCompositionSurfaceWin::SetDrawRectangle(const gfx::Rect& rectangle) {
- return root_surface_->SetDrawRectangle(rectangle);
+ bool result = root_surface_->SetDrawRectangle(rectangle);
+ if (!result &&
+ DirectCompositionChildSurfaceWin::IsDirectCompositionSwapChainFailed()) {
+ RunOverlayHdrGpuInfoUpdateCallback();
+ }
+
+ return result;
}
gfx::Vector2d DirectCompositionSurfaceWin::GetDrawOffset() const {
@@ -847,11 +930,13 @@ void DirectCompositionSurfaceWin::OnGpuSwitched(
void DirectCompositionSurfaceWin::OnDisplayAdded() {
InvalidateOverlayCaps();
UpdateOverlaySupport();
+ RunOverlayHdrGpuInfoUpdateCallback();
}
void DirectCompositionSurfaceWin::OnDisplayRemoved() {
InvalidateOverlayCaps();
UpdateOverlaySupport();
+ RunOverlayHdrGpuInfoUpdateCallback();
}
scoped_refptr<base::TaskRunner>
diff --git a/chromium/ui/gl/direct_composition_surface_win.h b/chromium/ui/gl/direct_composition_surface_win.h
index aeef4c28d6f..82d17af5964 100644
--- a/chromium/ui/gl/direct_composition_surface_win.h
+++ b/chromium/ui/gl/direct_composition_surface_win.h
@@ -31,6 +31,8 @@ class GL_EXPORT DirectCompositionSurfaceWin : public GLSurfaceEGL,
using VSyncCallback =
base::RepeatingCallback<void(base::TimeTicks, base::TimeDelta)>;
+ using OverlayHDRInfoUpdateCallback = base::RepeatingClosure;
+
struct Settings {
bool disable_nv12_dynamic_textures = false;
bool disable_larger_than_screen_overlays = false;
@@ -92,6 +94,9 @@ class GL_EXPORT DirectCompositionSurfaceWin : public GLSurfaceEGL,
static void SetOverlayFormatUsedForTesting(DXGI_FORMAT format);
+ static void SetOverlayHDRGpuInfoUpdateCallback(
+ OverlayHDRInfoUpdateCallback callback);
+
// GLSurfaceEGL implementation.
bool Initialize(GLSurfaceFormat format) override;
void Destroy() override;
diff --git a/chromium/ui/gl/egl_bindings_autogen_mock.cc b/chromium/ui/gl/egl_bindings_autogen_mock.cc
index d4d3a043df9..a8045b39904 100644
--- a/chromium/ui/gl/egl_bindings_autogen_mock.cc
+++ b/chromium/ui/gl/egl_bindings_autogen_mock.cc
@@ -10,6 +10,7 @@
#include <string.h>
+#include "base/notreached.h"
#include "ui/gl/egl_mock.h"
namespace {
@@ -355,6 +356,12 @@ MockEGLInterface::Mock_eglGetSyncValuesCHROMIUM(EGLDisplay dpy,
return interface_->GetSyncValuesCHROMIUM(dpy, surface, ust, msc, sbc);
}
+void GL_BINDING_CALL
+MockEGLInterface::Mock_eglHandleGPUSwitchANGLE(EGLDisplay dpy) {
+ MakeEglMockFunctionUnique("eglHandleGPUSwitchANGLE");
+ interface_->HandleGPUSwitchANGLE(dpy);
+}
+
EGLBoolean GL_BINDING_CALL
MockEGLInterface::Mock_eglImageFlushExternalEXT(EGLDisplay dpy,
EGLImageKHR image,
@@ -492,6 +499,20 @@ MockEGLInterface::Mock_eglQuerySurfacePointerANGLE(EGLDisplay dpy,
return interface_->QuerySurfacePointerANGLE(dpy, surface, attribute, value);
}
+void GL_BINDING_CALL
+MockEGLInterface::Mock_eglReacquireHighPowerGPUANGLE(EGLDisplay dpy,
+ EGLContext ctx) {
+ MakeEglMockFunctionUnique("eglReacquireHighPowerGPUANGLE");
+ interface_->ReacquireHighPowerGPUANGLE(dpy, ctx);
+}
+
+void GL_BINDING_CALL
+MockEGLInterface::Mock_eglReleaseHighPowerGPUANGLE(EGLDisplay dpy,
+ EGLContext ctx) {
+ MakeEglMockFunctionUnique("eglReleaseHighPowerGPUANGLE");
+ interface_->ReleaseHighPowerGPUANGLE(dpy, ctx);
+}
+
EGLBoolean GL_BINDING_CALL
MockEGLInterface::Mock_eglReleaseTexImage(EGLDisplay dpy,
EGLSurface surface,
@@ -723,6 +744,9 @@ MockEGLInterface::GetGLProcAddress(const char* name) {
if (strcmp(name, "eglGetSyncValuesCHROMIUM") == 0)
return reinterpret_cast<GLFunctionPointerType>(
Mock_eglGetSyncValuesCHROMIUM);
+ if (strcmp(name, "eglHandleGPUSwitchANGLE") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(
+ Mock_eglHandleGPUSwitchANGLE);
if (strcmp(name, "eglImageFlushExternalEXT") == 0)
return reinterpret_cast<GLFunctionPointerType>(
Mock_eglImageFlushExternalEXT);
@@ -761,6 +785,12 @@ MockEGLInterface::GetGLProcAddress(const char* name) {
if (strcmp(name, "eglQuerySurfacePointerANGLE") == 0)
return reinterpret_cast<GLFunctionPointerType>(
Mock_eglQuerySurfacePointerANGLE);
+ if (strcmp(name, "eglReacquireHighPowerGPUANGLE") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(
+ Mock_eglReacquireHighPowerGPUANGLE);
+ if (strcmp(name, "eglReleaseHighPowerGPUANGLE") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(
+ Mock_eglReleaseHighPowerGPUANGLE);
if (strcmp(name, "eglReleaseTexImage") == 0)
return reinterpret_cast<GLFunctionPointerType>(Mock_eglReleaseTexImage);
if (strcmp(name, "eglReleaseThread") == 0)
diff --git a/chromium/ui/gl/egl_bindings_autogen_mock.h b/chromium/ui/gl/egl_bindings_autogen_mock.h
index 4b7eb01109b..61840ea51d6 100644
--- a/chromium/ui/gl/egl_bindings_autogen_mock.h
+++ b/chromium/ui/gl/egl_bindings_autogen_mock.h
@@ -157,6 +157,7 @@ Mock_eglGetSyncValuesCHROMIUM(EGLDisplay dpy,
EGLuint64CHROMIUM* ust,
EGLuint64CHROMIUM* msc,
EGLuint64CHROMIUM* sbc);
+static void GL_BINDING_CALL Mock_eglHandleGPUSwitchANGLE(EGLDisplay dpy);
static EGLBoolean GL_BINDING_CALL
Mock_eglImageFlushExternalEXT(EGLDisplay dpy,
EGLImageKHR image,
@@ -217,6 +218,10 @@ Mock_eglQuerySurfacePointerANGLE(EGLDisplay dpy,
EGLSurface surface,
EGLint attribute,
void** value);
+static void GL_BINDING_CALL Mock_eglReacquireHighPowerGPUANGLE(EGLDisplay dpy,
+ EGLContext ctx);
+static void GL_BINDING_CALL Mock_eglReleaseHighPowerGPUANGLE(EGLDisplay dpy,
+ EGLContext ctx);
static EGLBoolean GL_BINDING_CALL Mock_eglReleaseTexImage(EGLDisplay dpy,
EGLSurface surface,
EGLint buffer);
diff --git a/chromium/ui/gl/generate_bindings.py b/chromium/ui/gl/generate_bindings.py
index c682b59b2d0..4b02fa80d3d 100755
--- a/chromium/ui/gl/generate_bindings.py
+++ b/chromium/ui/gl/generate_bindings.py
@@ -160,16 +160,49 @@ GL_FUNCTIONS = [
'names': ['glBlendEquation'],
'arguments': ' GLenum mode ', },
{ 'return_type': 'void',
+ 'known_as': 'glBlendEquationiOES',
+ 'versions': [
+ { 'name': 'glBlendEquationi' },
+ { 'name': 'glBlendEquationiOES', 'extensions':
+ ['GL_OES_draw_buffers_indexed'] }
+ ],
+ 'arguments': ' GLuint buf, GLenum mode ', },
+{ 'return_type': 'void',
'names': ['glBlendEquationSeparate'],
'arguments': 'GLenum modeRGB, GLenum modeAlpha', },
{ 'return_type': 'void',
+ 'known_as': 'glBlendEquationSeparateiOES',
+ 'versions': [
+ { 'name': 'glBlendEquationSeparatei' },
+ { 'name': 'glBlendEquationSeparateiOES', 'extensions':
+ ['GL_OES_draw_buffers_indexed'] }
+ ],
+ 'arguments': 'GLuint buf, GLenum modeRGB, GLenum modeAlpha', },
+{ 'return_type': 'void',
'names': ['glBlendFunc'],
'arguments': 'GLenum sfactor, GLenum dfactor', },
{ 'return_type': 'void',
+ 'known_as': 'glBlendFunciOES',
+ 'versions': [
+ { 'name': 'glBlendFunci' },
+ { 'name': 'glBlendFunciOES', 'extensions': ['GL_OES_draw_buffers_indexed'] }
+ ],
+ 'arguments': 'GLuint buf, GLenum sfactor, GLenum dfactor', },
+{ 'return_type': 'void',
'names': ['glBlendFuncSeparate'],
'arguments':
'GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha', },
{ 'return_type': 'void',
+ 'known_as': 'glBlendFuncSeparateiOES',
+ 'versions': [
+ { 'name': 'glBlendFuncSeparatei' },
+ { 'name': 'glBlendFuncSeparateiOES', 'extensions':
+ ['GL_OES_draw_buffers_indexed'] }
+ ],
+ 'arguments':
+ 'GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, '
+ 'GLenum dstAlpha', },
+{ 'return_type': 'void',
'versions' : [{'name': 'glBlitFramebuffer',
'extensions': ['GL_ARB_framebuffer_object']},
{'name': 'glBlitFramebufferANGLE'},
@@ -251,6 +284,15 @@ GL_FUNCTIONS = [
'arguments':
'GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha', },
{ 'return_type': 'void',
+ 'known_as': 'glColorMaskiOES',
+ 'versions': [
+ { 'name': 'glColorMaski' },
+ { 'name': 'glColorMaskiOES', 'extensions': ['GL_OES_draw_buffers_indexed'] }
+ ],
+ 'arguments':
+ 'GLuint buf, GLboolean red, GLboolean green, GLboolean blue, '
+ 'GLboolean alpha', },
+{ 'return_type': 'void',
'names': ['glCompileShader'],
'arguments': 'GLuint shader', },
{ 'return_type': 'void',
@@ -513,6 +555,13 @@ GL_FUNCTIONS = [
'extensions': ['GL_ANGLE_request_extension'] }],
'arguments': 'const char* name', },
{ 'return_type': 'void',
+ 'known_as': 'glDisableiOES',
+ 'versions': [
+ { 'name': 'glDisablei' },
+ { 'name': 'glDisableiOES', 'extensions': ['GL_OES_draw_buffers_indexed'] }
+ ],
+ 'arguments': 'GLenum target, GLuint index', },
+{ 'return_type': 'void',
'names': ['glDisableVertexAttribArray'],
'arguments': 'GLuint index', },
{ 'return_type': 'void',
@@ -592,6 +641,13 @@ GL_FUNCTIONS = [
'names': ['glEnable'],
'arguments': 'GLenum cap', },
{ 'return_type': 'void',
+ 'known_as': 'glEnableiOES',
+ 'versions': [
+ { 'name': 'glEnablei' },
+ { 'name': 'glEnableiOES', 'extensions': ['GL_OES_draw_buffers_indexed'] }
+ ],
+ 'arguments': 'GLenum target, GLuint index', },
+{ 'return_type': 'void',
'names': ['glEnableVertexAttribArray'],
'arguments': 'GLuint index', },
{ 'return_type': 'void',
@@ -1335,6 +1391,13 @@ GL_FUNCTIONS = [
'names': ['glIsEnabled'],
'arguments': 'GLenum cap', },
{ 'return_type': 'GLboolean',
+ 'known_as': 'glIsEnablediOES',
+ 'versions': [
+ { 'name': 'glIsEnabledi' },
+ { 'name': 'glIsEnablediOES', 'extensions': ['GL_OES_draw_buffers_indexed'] }
+ ],
+ 'arguments': 'GLenum target, GLuint index', },
+{ 'return_type': 'GLboolean',
'known_as': 'glIsFenceAPPLE',
'versions': [{ 'name': 'glIsFenceAPPLE',
'extensions': ['GL_APPLE_fence'] }],
@@ -1501,6 +1564,9 @@ GL_FUNCTIONS = [
'extensions': ['GL_KHR_debug'] }],
'arguments': 'void* ptr, GLsizei length, const char* label', },
{ 'return_type': 'void',
+ 'names': ['glPatchParameteri'],
+ 'arguments': 'GLenum pname, GLint value', },
+{ 'return_type': 'void',
'names': ['glPathCommandsNV'],
'versions': [{ 'name': 'glPathCommandsNV',
'extensions': ['GL_NV_path_rendering'] },
@@ -2505,6 +2571,10 @@ EGL_FUNCTIONS = [
'EGLDisplay dpy, EGLSurface surface, '
'EGLuint64CHROMIUM* ust, EGLuint64CHROMIUM* msc, '
'EGLuint64CHROMIUM* sbc', },
+{ 'return_type': 'void',
+ 'versions': [{ 'name': 'eglHandleGPUSwitchANGLE',
+ 'extensions': ['EGL_ANGLE_power_preference'] }],
+ 'arguments': 'EGLDisplay dpy' },
{ 'return_type': 'EGLBoolean',
'versions': [{ 'name': 'eglImageFlushExternalEXT',
'extensions': ['EGL_EXT_image_flush_external'] }],
@@ -2581,6 +2651,14 @@ EGL_FUNCTIONS = [
'names': ['eglQuerySurfacePointerANGLE'],
'arguments':
'EGLDisplay dpy, EGLSurface surface, EGLint attribute, void** value', },
+{ 'return_type': 'void',
+ 'versions': [{ 'name': 'eglReacquireHighPowerGPUANGLE',
+ 'extensions': ['EGL_ANGLE_power_preference'] }],
+ 'arguments': 'EGLDisplay dpy, EGLContext ctx' },
+{ 'return_type': 'void',
+ 'versions': [{ 'name': 'eglReleaseHighPowerGPUANGLE',
+ 'extensions': ['EGL_ANGLE_power_preference'] }],
+ 'arguments': 'EGLDisplay dpy, EGLContext ctx' },
{ 'return_type': 'EGLBoolean',
'names': ['eglReleaseTexImage'],
'arguments': 'EGLDisplay dpy, EGLSurface surface, EGLint buffer', },
@@ -3586,6 +3664,7 @@ def GenerateMockBindingsSource(file, functions, set_name):
#include <string.h>
+#include "base/notreached.h"
#include "ui/gl/%s_mock.h"
namespace {
diff --git a/chromium/ui/gl/gl_bindings.h b/chromium/ui/gl/gl_bindings.h
index 8fb6b5c16d2..85e92fc5865 100644
--- a/chromium/ui/gl/gl_bindings.h
+++ b/chromium/ui/gl/gl_bindings.h
@@ -418,6 +418,17 @@
#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC
#endif /* GL_EXT_blend_func_extended */
+#ifndef GL_OES_draw_buffers_indexed
+#define GL_OES_draw_buffers_indexed 1
+#define GL_BLEND_EQUATION_RGB 0x8009
+#define GL_BLEND_EQUATION_ALPHA 0x883D
+#define GL_BLEND_SRC_RGB 0x80C9
+#define GL_BLEND_SRC_ALPHA 0x80CB
+#define GL_BLEND_DST_RGB 0x80C8
+#define GL_BLEND_DST_ALPHA 0x80CA
+#define GL_COLOR_WRITEMASK 0x0C23
+#endif /* GL_OES_draw_buffers_indexed */
+
#ifndef GL_EXT_window_rectangles
#define GL_EXT_window_rectangles 1
#define GL_INCLUSIVE_EXT 0x8F10
@@ -448,6 +459,7 @@
#define GL_CHROMIUM_shared_image 1
#define GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM 0x8AF6
#define GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM 0x8AF7
+#define GL_SHARED_IMAGE_ACCESS_MODE_OVERLAY_CHROMIUM 0x8AF8
#endif /* GL_CHROMIUM_shared_image */
#ifndef GL_NV_internalformat_sample_query
diff --git a/chromium/ui/gl/gl_bindings_api_autogen_egl.h b/chromium/ui/gl/gl_bindings_api_autogen_egl.h
index 30b0ba80492..ff1e581ee70 100644
--- a/chromium/ui/gl/gl_bindings_api_autogen_egl.h
+++ b/chromium/ui/gl/gl_bindings_api_autogen_egl.h
@@ -134,6 +134,7 @@ EGLBoolean eglGetSyncValuesCHROMIUMFn(EGLDisplay dpy,
EGLuint64CHROMIUM* ust,
EGLuint64CHROMIUM* msc,
EGLuint64CHROMIUM* sbc) override;
+void eglHandleGPUSwitchANGLEFn(EGLDisplay dpy) override;
EGLBoolean eglImageFlushExternalEXTFn(EGLDisplay dpy,
EGLImageKHR image,
const EGLAttrib* attrib_list) override;
@@ -188,6 +189,8 @@ EGLBoolean eglQuerySurfacePointerANGLEFn(EGLDisplay dpy,
EGLSurface surface,
EGLint attribute,
void** value) override;
+void eglReacquireHighPowerGPUANGLEFn(EGLDisplay dpy, EGLContext ctx) override;
+void eglReleaseHighPowerGPUANGLEFn(EGLDisplay dpy, EGLContext ctx) override;
EGLBoolean eglReleaseTexImageFn(EGLDisplay dpy,
EGLSurface surface,
EGLint buffer) override;
diff --git a/chromium/ui/gl/gl_bindings_api_autogen_gl.h b/chromium/ui/gl/gl_bindings_api_autogen_gl.h
index 50f66d83266..102e3f99a87 100644
--- a/chromium/ui/gl/gl_bindings_api_autogen_gl.h
+++ b/chromium/ui/gl/gl_bindings_api_autogen_gl.h
@@ -64,12 +64,22 @@ void glBlendColorFn(GLclampf red,
GLclampf blue,
GLclampf alpha) override;
void glBlendEquationFn(GLenum mode) override;
+void glBlendEquationiOESFn(GLuint buf, GLenum mode) override;
void glBlendEquationSeparateFn(GLenum modeRGB, GLenum modeAlpha) override;
+void glBlendEquationSeparateiOESFn(GLuint buf,
+ GLenum modeRGB,
+ GLenum modeAlpha) override;
void glBlendFuncFn(GLenum sfactor, GLenum dfactor) override;
+void glBlendFunciOESFn(GLuint buf, GLenum sfactor, GLenum dfactor) override;
void glBlendFuncSeparateFn(GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
GLenum dstAlpha) override;
+void glBlendFuncSeparateiOESFn(GLuint buf,
+ GLenum srcRGB,
+ GLenum dstRGB,
+ GLenum srcAlpha,
+ GLenum dstAlpha) override;
void glBlitFramebufferFn(GLint srcX0,
GLint srcY0,
GLint srcX1,
@@ -136,6 +146,11 @@ void glColorMaskFn(GLboolean red,
GLboolean green,
GLboolean blue,
GLboolean alpha) override;
+void glColorMaskiOESFn(GLuint buf,
+ GLboolean red,
+ GLboolean green,
+ GLboolean blue,
+ GLboolean alpha) override;
void glCompileShaderFn(GLuint shader) override;
void glCompressedTexImage2DFn(GLenum target,
GLint level,
@@ -334,6 +349,7 @@ void glDepthRangefFn(GLclampf zNear, GLclampf zFar) override;
void glDetachShaderFn(GLuint program, GLuint shader) override;
void glDisableFn(GLenum cap) override;
void glDisableExtensionANGLEFn(const char* name) override;
+void glDisableiOESFn(GLenum target, GLuint index) override;
void glDisableVertexAttribArrayFn(GLuint index) override;
void glDiscardFramebufferEXTFn(GLenum target,
GLsizei numAttachments,
@@ -386,6 +402,7 @@ void glEGLImageTargetRenderbufferStorageOESFn(GLenum target,
void glEGLImageTargetTexture2DOESFn(GLenum target,
GLeglImageOES image) override;
void glEnableFn(GLenum cap) override;
+void glEnableiOESFn(GLenum target, GLuint index) override;
void glEnableVertexAttribArrayFn(GLuint index) override;
void glEndQueryFn(GLenum target) override;
void glEndTilingQCOMFn(GLbitfield preserveMask) override;
@@ -912,6 +929,7 @@ void glInvalidateSubFramebufferFn(GLenum target,
void glInvalidateTextureANGLEFn(GLenum target) override;
GLboolean glIsBufferFn(GLuint buffer) override;
GLboolean glIsEnabledFn(GLenum cap) override;
+GLboolean glIsEnablediOESFn(GLenum target, GLuint index) override;
GLboolean glIsFenceAPPLEFn(GLuint fence) override;
GLboolean glIsFenceNVFn(GLuint fence) override;
GLboolean glIsFramebufferEXTFn(GLuint framebuffer) override;
@@ -984,6 +1002,7 @@ void glObjectLabelFn(GLenum identifier,
GLsizei length,
const char* label) override;
void glObjectPtrLabelFn(void* ptr, GLsizei length, const char* label) override;
+void glPatchParameteriFn(GLenum pname, GLint value) override;
void glPathCommandsNVFn(GLuint path,
GLsizei numCommands,
const GLubyte* commands,
diff --git a/chromium/ui/gl/gl_bindings_autogen_egl.cc b/chromium/ui/gl/gl_bindings_autogen_egl.cc
index 184442231da..43135771bd0 100644
--- a/chromium/ui/gl/gl_bindings_autogen_egl.cc
+++ b/chromium/ui/gl/gl_bindings_autogen_egl.cc
@@ -181,6 +181,8 @@ void DriverEGL::InitializeExtensionBindings() {
gfx::HasExtension(extensions, "EGL_ANDROID_native_fence_sync");
ext.b_EGL_ANGLE_d3d_share_handle_client_buffer =
gfx::HasExtension(extensions, "EGL_ANGLE_d3d_share_handle_client_buffer");
+ ext.b_EGL_ANGLE_power_preference =
+ gfx::HasExtension(extensions, "EGL_ANGLE_power_preference");
ext.b_EGL_ANGLE_query_surface_pointer =
gfx::HasExtension(extensions, "EGL_ANGLE_query_surface_pointer");
ext.b_EGL_ANGLE_stream_producer_d3d_texture =
@@ -303,6 +305,12 @@ void DriverEGL::InitializeExtensionBindings() {
GetGLProcAddress("eglGetSyncValuesCHROMIUM"));
}
+ if (ext.b_EGL_ANGLE_power_preference) {
+ fn.eglHandleGPUSwitchANGLEFn =
+ reinterpret_cast<eglHandleGPUSwitchANGLEProc>(
+ GetGLProcAddress("eglHandleGPUSwitchANGLE"));
+ }
+
if (ext.b_EGL_EXT_image_flush_external) {
fn.eglImageFlushExternalEXTFn =
reinterpret_cast<eglImageFlushExternalEXTProc>(
@@ -330,6 +338,18 @@ void DriverEGL::InitializeExtensionBindings() {
GetGLProcAddress("eglQuerySurfacePointerANGLE"));
}
+ if (ext.b_EGL_ANGLE_power_preference) {
+ fn.eglReacquireHighPowerGPUANGLEFn =
+ reinterpret_cast<eglReacquireHighPowerGPUANGLEProc>(
+ GetGLProcAddress("eglReacquireHighPowerGPUANGLE"));
+ }
+
+ if (ext.b_EGL_ANGLE_power_preference) {
+ fn.eglReleaseHighPowerGPUANGLEFn =
+ reinterpret_cast<eglReleaseHighPowerGPUANGLEProc>(
+ GetGLProcAddress("eglReleaseHighPowerGPUANGLE"));
+ }
+
if (ext.b_EGL_ANDROID_blob_cache) {
fn.eglSetBlobCacheFuncsANDROIDFn =
reinterpret_cast<eglSetBlobCacheFuncsANDROIDProc>(
@@ -649,6 +669,10 @@ EGLBoolean EGLApiBase::eglGetSyncValuesCHROMIUMFn(EGLDisplay dpy,
return driver_->fn.eglGetSyncValuesCHROMIUMFn(dpy, surface, ust, msc, sbc);
}
+void EGLApiBase::eglHandleGPUSwitchANGLEFn(EGLDisplay dpy) {
+ driver_->fn.eglHandleGPUSwitchANGLEFn(dpy);
+}
+
EGLBoolean EGLApiBase::eglImageFlushExternalEXTFn(
EGLDisplay dpy,
EGLImageKHR image,
@@ -756,6 +780,15 @@ EGLBoolean EGLApiBase::eglQuerySurfacePointerANGLEFn(EGLDisplay dpy,
value);
}
+void EGLApiBase::eglReacquireHighPowerGPUANGLEFn(EGLDisplay dpy,
+ EGLContext ctx) {
+ driver_->fn.eglReacquireHighPowerGPUANGLEFn(dpy, ctx);
+}
+
+void EGLApiBase::eglReleaseHighPowerGPUANGLEFn(EGLDisplay dpy, EGLContext ctx) {
+ driver_->fn.eglReleaseHighPowerGPUANGLEFn(dpy, ctx);
+}
+
EGLBoolean EGLApiBase::eglReleaseTexImageFn(EGLDisplay dpy,
EGLSurface surface,
EGLint buffer) {
@@ -1171,6 +1204,11 @@ EGLBoolean TraceEGLApi::eglGetSyncValuesCHROMIUMFn(EGLDisplay dpy,
return egl_api_->eglGetSyncValuesCHROMIUMFn(dpy, surface, ust, msc, sbc);
}
+void TraceEGLApi::eglHandleGPUSwitchANGLEFn(EGLDisplay dpy) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceEGLAPI::eglHandleGPUSwitchANGLE")
+ egl_api_->eglHandleGPUSwitchANGLEFn(dpy);
+}
+
EGLBoolean TraceEGLApi::eglImageFlushExternalEXTFn(
EGLDisplay dpy,
EGLImageKHR image,
@@ -1297,6 +1335,20 @@ EGLBoolean TraceEGLApi::eglQuerySurfacePointerANGLEFn(EGLDisplay dpy,
value);
}
+void TraceEGLApi::eglReacquireHighPowerGPUANGLEFn(EGLDisplay dpy,
+ EGLContext ctx) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+ "TraceEGLAPI::eglReacquireHighPowerGPUANGLE")
+ egl_api_->eglReacquireHighPowerGPUANGLEFn(dpy, ctx);
+}
+
+void TraceEGLApi::eglReleaseHighPowerGPUANGLEFn(EGLDisplay dpy,
+ EGLContext ctx) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+ "TraceEGLAPI::eglReleaseHighPowerGPUANGLE")
+ egl_api_->eglReleaseHighPowerGPUANGLEFn(dpy, ctx);
+}
+
EGLBoolean TraceEGLApi::eglReleaseTexImageFn(EGLDisplay dpy,
EGLSurface surface,
EGLint buffer) {
@@ -1901,6 +1953,12 @@ EGLBoolean LogEGLApi::eglGetSyncValuesCHROMIUMFn(EGLDisplay dpy,
return result;
}
+void LogEGLApi::eglHandleGPUSwitchANGLEFn(EGLDisplay dpy) {
+ GL_SERVICE_LOG("eglHandleGPUSwitchANGLE"
+ << "(" << dpy << ")");
+ egl_api_->eglHandleGPUSwitchANGLEFn(dpy);
+}
+
EGLBoolean LogEGLApi::eglImageFlushExternalEXTFn(EGLDisplay dpy,
EGLImageKHR image,
const EGLAttrib* attrib_list) {
@@ -2098,6 +2156,19 @@ EGLBoolean LogEGLApi::eglQuerySurfacePointerANGLEFn(EGLDisplay dpy,
return result;
}
+void LogEGLApi::eglReacquireHighPowerGPUANGLEFn(EGLDisplay dpy,
+ EGLContext ctx) {
+ GL_SERVICE_LOG("eglReacquireHighPowerGPUANGLE"
+ << "(" << dpy << ", " << ctx << ")");
+ egl_api_->eglReacquireHighPowerGPUANGLEFn(dpy, ctx);
+}
+
+void LogEGLApi::eglReleaseHighPowerGPUANGLEFn(EGLDisplay dpy, EGLContext ctx) {
+ GL_SERVICE_LOG("eglReleaseHighPowerGPUANGLE"
+ << "(" << dpy << ", " << ctx << ")");
+ egl_api_->eglReleaseHighPowerGPUANGLEFn(dpy, ctx);
+}
+
EGLBoolean LogEGLApi::eglReleaseTexImageFn(EGLDisplay dpy,
EGLSurface surface,
EGLint buffer) {
diff --git a/chromium/ui/gl/gl_bindings_autogen_egl.h b/chromium/ui/gl/gl_bindings_autogen_egl.h
index 6cafd14601f..538fff97cf1 100644
--- a/chromium/ui/gl/gl_bindings_autogen_egl.h
+++ b/chromium/ui/gl/gl_bindings_autogen_egl.h
@@ -168,6 +168,7 @@ typedef EGLBoolean(GL_BINDING_CALL* eglGetSyncValuesCHROMIUMProc)(
EGLuint64CHROMIUM* ust,
EGLuint64CHROMIUM* msc,
EGLuint64CHROMIUM* sbc);
+typedef void(GL_BINDING_CALL* eglHandleGPUSwitchANGLEProc)(EGLDisplay dpy);
typedef EGLBoolean(GL_BINDING_CALL* eglImageFlushExternalEXTProc)(
EGLDisplay dpy,
EGLImageKHR image,
@@ -230,6 +231,11 @@ typedef EGLBoolean(GL_BINDING_CALL* eglQuerySurfacePointerANGLEProc)(
EGLSurface surface,
EGLint attribute,
void** value);
+typedef void(GL_BINDING_CALL* eglReacquireHighPowerGPUANGLEProc)(
+ EGLDisplay dpy,
+ EGLContext ctx);
+typedef void(GL_BINDING_CALL* eglReleaseHighPowerGPUANGLEProc)(EGLDisplay dpy,
+ EGLContext ctx);
typedef EGLBoolean(GL_BINDING_CALL* eglReleaseTexImageProc)(EGLDisplay dpy,
EGLSurface surface,
EGLint buffer);
@@ -293,6 +299,7 @@ struct ExtensionsEGL {
bool b_EGL_ANDROID_get_native_client_buffer;
bool b_EGL_ANDROID_native_fence_sync;
bool b_EGL_ANGLE_d3d_share_handle_client_buffer;
+ bool b_EGL_ANGLE_power_preference;
bool b_EGL_ANGLE_query_surface_pointer;
bool b_EGL_ANGLE_stream_producer_d3d_texture;
bool b_EGL_ANGLE_surface_d3d_texture_2d_share_handle;
@@ -359,6 +366,7 @@ struct ProcsEGL {
eglGetProcAddressProc eglGetProcAddressFn;
eglGetSyncAttribKHRProc eglGetSyncAttribKHRFn;
eglGetSyncValuesCHROMIUMProc eglGetSyncValuesCHROMIUMFn;
+ eglHandleGPUSwitchANGLEProc eglHandleGPUSwitchANGLEFn;
eglImageFlushExternalEXTProc eglImageFlushExternalEXTFn;
eglInitializeProc eglInitializeFn;
eglLabelObjectKHRProc eglLabelObjectKHRFn;
@@ -376,6 +384,8 @@ struct ProcsEGL {
eglQueryStringiANGLEProc eglQueryStringiANGLEFn;
eglQuerySurfaceProc eglQuerySurfaceFn;
eglQuerySurfacePointerANGLEProc eglQuerySurfacePointerANGLEFn;
+ eglReacquireHighPowerGPUANGLEProc eglReacquireHighPowerGPUANGLEFn;
+ eglReleaseHighPowerGPUANGLEProc eglReleaseHighPowerGPUANGLEFn;
eglReleaseTexImageProc eglReleaseTexImageFn;
eglReleaseThreadProc eglReleaseThreadFn;
eglSetBlobCacheFuncsANDROIDProc eglSetBlobCacheFuncsANDROIDFn;
@@ -536,6 +546,7 @@ class GL_EXPORT EGLApi {
EGLuint64CHROMIUM* ust,
EGLuint64CHROMIUM* msc,
EGLuint64CHROMIUM* sbc) = 0;
+ virtual void eglHandleGPUSwitchANGLEFn(EGLDisplay dpy) = 0;
virtual EGLBoolean eglImageFlushExternalEXTFn(
EGLDisplay dpy,
EGLImageKHR image,
@@ -591,6 +602,10 @@ class GL_EXPORT EGLApi {
EGLSurface surface,
EGLint attribute,
void** value) = 0;
+ virtual void eglReacquireHighPowerGPUANGLEFn(EGLDisplay dpy,
+ EGLContext ctx) = 0;
+ virtual void eglReleaseHighPowerGPUANGLEFn(EGLDisplay dpy,
+ EGLContext ctx) = 0;
virtual EGLBoolean eglReleaseTexImageFn(EGLDisplay dpy,
EGLSurface surface,
EGLint buffer) = 0;
@@ -697,6 +712,8 @@ class GL_EXPORT EGLApi {
#define eglGetSyncAttribKHR ::gl::g_current_egl_context->eglGetSyncAttribKHRFn
#define eglGetSyncValuesCHROMIUM \
::gl::g_current_egl_context->eglGetSyncValuesCHROMIUMFn
+#define eglHandleGPUSwitchANGLE \
+ ::gl::g_current_egl_context->eglHandleGPUSwitchANGLEFn
#define eglImageFlushExternalEXT \
::gl::g_current_egl_context->eglImageFlushExternalEXTFn
#define eglInitialize ::gl::g_current_egl_context->eglInitializeFn
@@ -718,6 +735,10 @@ class GL_EXPORT EGLApi {
#define eglQuerySurface ::gl::g_current_egl_context->eglQuerySurfaceFn
#define eglQuerySurfacePointerANGLE \
::gl::g_current_egl_context->eglQuerySurfacePointerANGLEFn
+#define eglReacquireHighPowerGPUANGLE \
+ ::gl::g_current_egl_context->eglReacquireHighPowerGPUANGLEFn
+#define eglReleaseHighPowerGPUANGLE \
+ ::gl::g_current_egl_context->eglReleaseHighPowerGPUANGLEFn
#define eglReleaseTexImage ::gl::g_current_egl_context->eglReleaseTexImageFn
#define eglReleaseThread ::gl::g_current_egl_context->eglReleaseThreadFn
#define eglSetBlobCacheFuncsANDROID \
diff --git a/chromium/ui/gl/gl_bindings_autogen_gl.cc b/chromium/ui/gl/gl_bindings_autogen_gl.cc
index 67d468b0c34..96a8926f7cb 100644
--- a/chromium/ui/gl/gl_bindings_autogen_gl.cc
+++ b/chromium/ui/gl/gl_bindings_autogen_gl.cc
@@ -447,6 +447,8 @@ void DriverGL::InitializeDynamicBindings(const GLVersionInfo* ver,
ext.b_GL_NV_path_rendering =
gfx::HasExtension(extensions, "GL_NV_path_rendering");
ext.b_GL_OES_EGL_image = gfx::HasExtension(extensions, "GL_OES_EGL_image");
+ ext.b_GL_OES_draw_buffers_indexed =
+ gfx::HasExtension(extensions, "GL_OES_draw_buffers_indexed");
ext.b_GL_OES_get_program_binary =
gfx::HasExtension(extensions, "GL_OES_get_program_binary");
ext.b_GL_OES_mapbuffer = gfx::HasExtension(extensions, "GL_OES_mapbuffer");
@@ -600,6 +602,42 @@ void DriverGL::InitializeDynamicBindings(const GLVersionInfo* ver,
GetGLProcAddress("glBlendBarrierKHR"));
}
+ if (ver->IsAtLeastGLES(3u, 2u) || ver->IsAtLeastGL(4u, 0u)) {
+ fn.glBlendEquationiOESFn = reinterpret_cast<glBlendEquationiOESProc>(
+ GetGLProcAddress("glBlendEquationi"));
+ } else if (ext.b_GL_OES_draw_buffers_indexed) {
+ fn.glBlendEquationiOESFn = reinterpret_cast<glBlendEquationiOESProc>(
+ GetGLProcAddress("glBlendEquationiOES"));
+ }
+
+ if (ver->IsAtLeastGLES(3u, 2u) || ver->IsAtLeastGL(4u, 0u)) {
+ fn.glBlendEquationSeparateiOESFn =
+ reinterpret_cast<glBlendEquationSeparateiOESProc>(
+ GetGLProcAddress("glBlendEquationSeparatei"));
+ } else if (ext.b_GL_OES_draw_buffers_indexed) {
+ fn.glBlendEquationSeparateiOESFn =
+ reinterpret_cast<glBlendEquationSeparateiOESProc>(
+ GetGLProcAddress("glBlendEquationSeparateiOES"));
+ }
+
+ if (ver->IsAtLeastGLES(3u, 2u) || ver->IsAtLeastGL(4u, 0u)) {
+ fn.glBlendFunciOESFn =
+ reinterpret_cast<glBlendFunciOESProc>(GetGLProcAddress("glBlendFunci"));
+ } else if (ext.b_GL_OES_draw_buffers_indexed) {
+ fn.glBlendFunciOESFn = reinterpret_cast<glBlendFunciOESProc>(
+ GetGLProcAddress("glBlendFunciOES"));
+ }
+
+ if (ver->IsAtLeastGLES(3u, 2u) || ver->IsAtLeastGL(4u, 0u)) {
+ fn.glBlendFuncSeparateiOESFn =
+ reinterpret_cast<glBlendFuncSeparateiOESProc>(
+ GetGLProcAddress("glBlendFuncSeparatei"));
+ } else if (ext.b_GL_OES_draw_buffers_indexed) {
+ fn.glBlendFuncSeparateiOESFn =
+ reinterpret_cast<glBlendFuncSeparateiOESProc>(
+ GetGLProcAddress("glBlendFuncSeparateiOES"));
+ }
+
if (ver->IsAtLeastGL(3u, 0u) || ver->IsAtLeastGLES(3u, 0u) ||
ext.b_GL_ARB_framebuffer_object) {
fn.glBlitFramebufferFn = reinterpret_cast<glBlitFramebufferProc>(
@@ -674,6 +712,14 @@ void DriverGL::InitializeDynamicBindings(const GLVersionInfo* ver,
GetGLProcAddress("glClientWaitSyncAPPLE"));
}
+ if (ver->IsAtLeastGL(3u, 0u) || ver->IsAtLeastGLES(3u, 2u)) {
+ fn.glColorMaskiOESFn =
+ reinterpret_cast<glColorMaskiOESProc>(GetGLProcAddress("glColorMaski"));
+ } else if (ext.b_GL_OES_draw_buffers_indexed) {
+ fn.glColorMaskiOESFn = reinterpret_cast<glColorMaskiOESProc>(
+ GetGLProcAddress("glColorMaskiOES"));
+ }
+
if (ext.b_GL_ANGLE_robust_client_memory) {
fn.glCompressedTexImage2DRobustANGLEFn =
reinterpret_cast<glCompressedTexImage2DRobustANGLEProc>(
@@ -926,6 +972,14 @@ void DriverGL::InitializeDynamicBindings(const GLVersionInfo* ver,
GetGLProcAddress("glDisableExtensionANGLE"));
}
+ if (ver->IsAtLeastGL(3u, 0u) || ver->IsAtLeastGLES(3u, 2u)) {
+ fn.glDisableiOESFn =
+ reinterpret_cast<glDisableiOESProc>(GetGLProcAddress("glDisablei"));
+ } else if (ext.b_GL_OES_draw_buffers_indexed) {
+ fn.glDisableiOESFn =
+ reinterpret_cast<glDisableiOESProc>(GetGLProcAddress("glDisableiOES"));
+ }
+
if (ext.b_GL_EXT_discard_framebuffer) {
fn.glDiscardFramebufferEXTFn =
reinterpret_cast<glDiscardFramebufferEXTProc>(
@@ -1042,6 +1096,14 @@ void DriverGL::InitializeDynamicBindings(const GLVersionInfo* ver,
GetGLProcAddress("glEGLImageTargetTexture2DOES"));
}
+ if (ver->IsAtLeastGL(3u, 0u) || ver->IsAtLeastGLES(3u, 2u)) {
+ fn.glEnableiOESFn =
+ reinterpret_cast<glEnableiOESProc>(GetGLProcAddress("glEnablei"));
+ } else if (ext.b_GL_OES_draw_buffers_indexed) {
+ fn.glEnableiOESFn =
+ reinterpret_cast<glEnableiOESProc>(GetGLProcAddress("glEnableiOES"));
+ }
+
if (!ver->is_es || ver->IsAtLeastGLES(3u, 0u)) {
fn.glEndQueryFn =
reinterpret_cast<glEndQueryProc>(GetGLProcAddress("glEndQuery"));
@@ -1897,6 +1959,14 @@ void DriverGL::InitializeDynamicBindings(const GLVersionInfo* ver,
GetGLProcAddress("glInvalidateTextureANGLE"));
}
+ if (ver->IsAtLeastGL(3u, 0u) || ver->IsAtLeastGLES(3u, 2u)) {
+ fn.glIsEnablediOESFn =
+ reinterpret_cast<glIsEnablediOESProc>(GetGLProcAddress("glIsEnabledi"));
+ } else if (ext.b_GL_OES_draw_buffers_indexed) {
+ fn.glIsEnablediOESFn = reinterpret_cast<glIsEnablediOESProc>(
+ GetGLProcAddress("glIsEnablediOES"));
+ }
+
if (ext.b_GL_APPLE_fence) {
fn.glIsFenceAPPLEFn = reinterpret_cast<glIsFenceAPPLEProc>(
GetGLProcAddress("glIsFenceAPPLE"));
@@ -2103,6 +2173,11 @@ void DriverGL::InitializeDynamicBindings(const GLVersionInfo* ver,
GetGLProcAddress("glObjectPtrLabelKHR"));
}
+ if (ver->IsAtLeastGLES(3u, 2u) || ver->IsAtLeastGL(4u, 0u)) {
+ fn.glPatchParameteriFn = reinterpret_cast<glPatchParameteriProc>(
+ GetGLProcAddress("glPatchParameteri"));
+ }
+
if (ext.b_GL_NV_path_rendering) {
fn.glPathCommandsNVFn = reinterpret_cast<glPathCommandsNVProc>(
GetGLProcAddress("glPathCommandsNV"));
@@ -3067,14 +3142,28 @@ void GLApiBase::glBlendEquationFn(GLenum mode) {
driver_->fn.glBlendEquationFn(mode);
}
+void GLApiBase::glBlendEquationiOESFn(GLuint buf, GLenum mode) {
+ driver_->fn.glBlendEquationiOESFn(buf, mode);
+}
+
void GLApiBase::glBlendEquationSeparateFn(GLenum modeRGB, GLenum modeAlpha) {
driver_->fn.glBlendEquationSeparateFn(modeRGB, modeAlpha);
}
+void GLApiBase::glBlendEquationSeparateiOESFn(GLuint buf,
+ GLenum modeRGB,
+ GLenum modeAlpha) {
+ driver_->fn.glBlendEquationSeparateiOESFn(buf, modeRGB, modeAlpha);
+}
+
void GLApiBase::glBlendFuncFn(GLenum sfactor, GLenum dfactor) {
driver_->fn.glBlendFuncFn(sfactor, dfactor);
}
+void GLApiBase::glBlendFunciOESFn(GLuint buf, GLenum sfactor, GLenum dfactor) {
+ driver_->fn.glBlendFunciOESFn(buf, sfactor, dfactor);
+}
+
void GLApiBase::glBlendFuncSeparateFn(GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
@@ -3082,6 +3171,15 @@ void GLApiBase::glBlendFuncSeparateFn(GLenum srcRGB,
driver_->fn.glBlendFuncSeparateFn(srcRGB, dstRGB, srcAlpha, dstAlpha);
}
+void GLApiBase::glBlendFuncSeparateiOESFn(GLuint buf,
+ GLenum srcRGB,
+ GLenum dstRGB,
+ GLenum srcAlpha,
+ GLenum dstAlpha) {
+ driver_->fn.glBlendFuncSeparateiOESFn(buf, srcRGB, dstRGB, srcAlpha,
+ dstAlpha);
+}
+
void GLApiBase::glBlitFramebufferFn(GLint srcX0,
GLint srcY0,
GLint srcX1,
@@ -3204,6 +3302,14 @@ void GLApiBase::glColorMaskFn(GLboolean red,
driver_->fn.glColorMaskFn(red, green, blue, alpha);
}
+void GLApiBase::glColorMaskiOESFn(GLuint buf,
+ GLboolean red,
+ GLboolean green,
+ GLboolean blue,
+ GLboolean alpha) {
+ driver_->fn.glColorMaskiOESFn(buf, red, green, blue, alpha);
+}
+
void GLApiBase::glCompileShaderFn(GLuint shader) {
driver_->fn.glCompileShaderFn(shader);
}
@@ -3589,6 +3695,10 @@ void GLApiBase::glDisableExtensionANGLEFn(const char* name) {
driver_->fn.glDisableExtensionANGLEFn(name);
}
+void GLApiBase::glDisableiOESFn(GLenum target, GLuint index) {
+ driver_->fn.glDisableiOESFn(target, index);
+}
+
void GLApiBase::glDisableVertexAttribArrayFn(GLuint index) {
driver_->fn.glDisableVertexAttribArrayFn(index);
}
@@ -3698,6 +3808,10 @@ void GLApiBase::glEnableFn(GLenum cap) {
driver_->fn.glEnableFn(cap);
}
+void GLApiBase::glEnableiOESFn(GLenum target, GLuint index) {
+ driver_->fn.glEnableiOESFn(target, index);
+}
+
void GLApiBase::glEnableVertexAttribArrayFn(GLuint index) {
driver_->fn.glEnableVertexAttribArrayFn(index);
}
@@ -4790,6 +4904,10 @@ GLboolean GLApiBase::glIsEnabledFn(GLenum cap) {
return driver_->fn.glIsEnabledFn(cap);
}
+GLboolean GLApiBase::glIsEnablediOESFn(GLenum target, GLuint index) {
+ return driver_->fn.glIsEnablediOESFn(target, index);
+}
+
GLboolean GLApiBase::glIsFenceAPPLEFn(GLuint fence) {
return driver_->fn.glIsFenceAPPLEFn(fence);
}
@@ -4973,6 +5091,10 @@ void GLApiBase::glObjectPtrLabelFn(void* ptr,
driver_->fn.glObjectPtrLabelFn(ptr, length, label);
}
+void GLApiBase::glPatchParameteriFn(GLenum pname, GLint value) {
+ driver_->fn.glPatchParameteriFn(pname, value);
+}
+
void GLApiBase::glPathCommandsNVFn(GLuint path,
GLsizei numCommands,
const GLubyte* commands,
@@ -6395,16 +6517,34 @@ void TraceGLApi::glBlendEquationFn(GLenum mode) {
gl_api_->glBlendEquationFn(mode);
}
+void TraceGLApi::glBlendEquationiOESFn(GLuint buf, GLenum mode) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBlendEquationiOES")
+ gl_api_->glBlendEquationiOESFn(buf, mode);
+}
+
void TraceGLApi::glBlendEquationSeparateFn(GLenum modeRGB, GLenum modeAlpha) {
TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBlendEquationSeparate")
gl_api_->glBlendEquationSeparateFn(modeRGB, modeAlpha);
}
+void TraceGLApi::glBlendEquationSeparateiOESFn(GLuint buf,
+ GLenum modeRGB,
+ GLenum modeAlpha) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+ "TraceGLAPI::glBlendEquationSeparateiOES")
+ gl_api_->glBlendEquationSeparateiOESFn(buf, modeRGB, modeAlpha);
+}
+
void TraceGLApi::glBlendFuncFn(GLenum sfactor, GLenum dfactor) {
TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBlendFunc")
gl_api_->glBlendFuncFn(sfactor, dfactor);
}
+void TraceGLApi::glBlendFunciOESFn(GLuint buf, GLenum sfactor, GLenum dfactor) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBlendFunciOES")
+ gl_api_->glBlendFunciOESFn(buf, sfactor, dfactor);
+}
+
void TraceGLApi::glBlendFuncSeparateFn(GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
@@ -6413,6 +6553,15 @@ void TraceGLApi::glBlendFuncSeparateFn(GLenum srcRGB,
gl_api_->glBlendFuncSeparateFn(srcRGB, dstRGB, srcAlpha, dstAlpha);
}
+void TraceGLApi::glBlendFuncSeparateiOESFn(GLuint buf,
+ GLenum srcRGB,
+ GLenum dstRGB,
+ GLenum srcAlpha,
+ GLenum dstAlpha) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBlendFuncSeparateiOES")
+ gl_api_->glBlendFuncSeparateiOESFn(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
void TraceGLApi::glBlitFramebufferFn(GLint srcX0,
GLint srcY0,
GLint srcX1,
@@ -6554,6 +6703,15 @@ void TraceGLApi::glColorMaskFn(GLboolean red,
gl_api_->glColorMaskFn(red, green, blue, alpha);
}
+void TraceGLApi::glColorMaskiOESFn(GLuint buf,
+ GLboolean red,
+ GLboolean green,
+ GLboolean blue,
+ GLboolean alpha) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glColorMaskiOES")
+ gl_api_->glColorMaskiOESFn(buf, red, green, blue, alpha);
+}
+
void TraceGLApi::glCompileShaderFn(GLuint shader) {
TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glCompileShader")
gl_api_->glCompileShaderFn(shader);
@@ -6998,6 +7156,11 @@ void TraceGLApi::glDisableExtensionANGLEFn(const char* name) {
gl_api_->glDisableExtensionANGLEFn(name);
}
+void TraceGLApi::glDisableiOESFn(GLenum target, GLuint index) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDisableiOES")
+ gl_api_->glDisableiOESFn(target, index);
+}
+
void TraceGLApi::glDisableVertexAttribArrayFn(GLuint index) {
TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDisableVertexAttribArray")
gl_api_->glDisableVertexAttribArrayFn(index);
@@ -7130,6 +7293,11 @@ void TraceGLApi::glEnableFn(GLenum cap) {
gl_api_->glEnableFn(cap);
}
+void TraceGLApi::glEnableiOESFn(GLenum target, GLuint index) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glEnableiOES")
+ gl_api_->glEnableiOESFn(target, index);
+}
+
void TraceGLApi::glEnableVertexAttribArrayFn(GLuint index) {
TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glEnableVertexAttribArray")
gl_api_->glEnableVertexAttribArrayFn(index);
@@ -8421,6 +8589,11 @@ GLboolean TraceGLApi::glIsEnabledFn(GLenum cap) {
return gl_api_->glIsEnabledFn(cap);
}
+GLboolean TraceGLApi::glIsEnablediOESFn(GLenum target, GLuint index) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsEnablediOES")
+ return gl_api_->glIsEnablediOESFn(target, index);
+}
+
GLboolean TraceGLApi::glIsFenceAPPLEFn(GLuint fence) {
TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsFenceAPPLE")
return gl_api_->glIsFenceAPPLEFn(fence);
@@ -8645,6 +8818,11 @@ void TraceGLApi::glObjectPtrLabelFn(void* ptr,
gl_api_->glObjectPtrLabelFn(ptr, length, label);
}
+void TraceGLApi::glPatchParameteriFn(GLenum pname, GLint value) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glPatchParameteri")
+ gl_api_->glPatchParameteriFn(pname, value);
+}
+
void TraceGLApi::glPathCommandsNVFn(GLuint path,
GLsizei numCommands,
const GLubyte* commands,
@@ -10308,6 +10486,12 @@ void LogGLApi::glBlendEquationFn(GLenum mode) {
gl_api_->glBlendEquationFn(mode);
}
+void LogGLApi::glBlendEquationiOESFn(GLuint buf, GLenum mode) {
+ GL_SERVICE_LOG("glBlendEquationiOES"
+ << "(" << buf << ", " << GLEnums::GetStringEnum(mode) << ")");
+ gl_api_->glBlendEquationiOESFn(buf, mode);
+}
+
void LogGLApi::glBlendEquationSeparateFn(GLenum modeRGB, GLenum modeAlpha) {
GL_SERVICE_LOG("glBlendEquationSeparate"
<< "(" << GLEnums::GetStringEnum(modeRGB) << ", "
@@ -10315,6 +10499,15 @@ void LogGLApi::glBlendEquationSeparateFn(GLenum modeRGB, GLenum modeAlpha) {
gl_api_->glBlendEquationSeparateFn(modeRGB, modeAlpha);
}
+void LogGLApi::glBlendEquationSeparateiOESFn(GLuint buf,
+ GLenum modeRGB,
+ GLenum modeAlpha) {
+ GL_SERVICE_LOG("glBlendEquationSeparateiOES"
+ << "(" << buf << ", " << GLEnums::GetStringEnum(modeRGB)
+ << ", " << GLEnums::GetStringEnum(modeAlpha) << ")");
+ gl_api_->glBlendEquationSeparateiOESFn(buf, modeRGB, modeAlpha);
+}
+
void LogGLApi::glBlendFuncFn(GLenum sfactor, GLenum dfactor) {
GL_SERVICE_LOG("glBlendFunc"
<< "(" << GLEnums::GetStringEnum(sfactor) << ", "
@@ -10322,6 +10515,13 @@ void LogGLApi::glBlendFuncFn(GLenum sfactor, GLenum dfactor) {
gl_api_->glBlendFuncFn(sfactor, dfactor);
}
+void LogGLApi::glBlendFunciOESFn(GLuint buf, GLenum sfactor, GLenum dfactor) {
+ GL_SERVICE_LOG("glBlendFunciOES"
+ << "(" << buf << ", " << GLEnums::GetStringEnum(sfactor)
+ << ", " << GLEnums::GetStringEnum(dfactor) << ")");
+ gl_api_->glBlendFunciOESFn(buf, sfactor, dfactor);
+}
+
void LogGLApi::glBlendFuncSeparateFn(GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
@@ -10334,6 +10534,19 @@ void LogGLApi::glBlendFuncSeparateFn(GLenum srcRGB,
gl_api_->glBlendFuncSeparateFn(srcRGB, dstRGB, srcAlpha, dstAlpha);
}
+void LogGLApi::glBlendFuncSeparateiOESFn(GLuint buf,
+ GLenum srcRGB,
+ GLenum dstRGB,
+ GLenum srcAlpha,
+ GLenum dstAlpha) {
+ GL_SERVICE_LOG("glBlendFuncSeparateiOES"
+ << "(" << buf << ", " << GLEnums::GetStringEnum(srcRGB) << ", "
+ << GLEnums::GetStringEnum(dstRGB) << ", "
+ << GLEnums::GetStringEnum(srcAlpha) << ", "
+ << GLEnums::GetStringEnum(dstAlpha) << ")");
+ gl_api_->glBlendFuncSeparateiOESFn(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
void LogGLApi::glBlitFramebufferFn(GLint srcX0,
GLint srcY0,
GLint srcX1,
@@ -10523,6 +10736,19 @@ void LogGLApi::glColorMaskFn(GLboolean red,
gl_api_->glColorMaskFn(red, green, blue, alpha);
}
+void LogGLApi::glColorMaskiOESFn(GLuint buf,
+ GLboolean red,
+ GLboolean green,
+ GLboolean blue,
+ GLboolean alpha) {
+ GL_SERVICE_LOG("glColorMaskiOES"
+ << "(" << buf << ", " << GLEnums::GetStringBool(red) << ", "
+ << GLEnums::GetStringBool(green) << ", "
+ << GLEnums::GetStringBool(blue) << ", "
+ << GLEnums::GetStringBool(alpha) << ")");
+ gl_api_->glColorMaskiOESFn(buf, red, green, blue, alpha);
+}
+
void LogGLApi::glCompileShaderFn(GLuint shader) {
GL_SERVICE_LOG("glCompileShader"
<< "(" << shader << ")");
@@ -11105,6 +11331,13 @@ void LogGLApi::glDisableExtensionANGLEFn(const char* name) {
gl_api_->glDisableExtensionANGLEFn(name);
}
+void LogGLApi::glDisableiOESFn(GLenum target, GLuint index) {
+ GL_SERVICE_LOG("glDisableiOES"
+ << "(" << GLEnums::GetStringEnum(target) << ", " << index
+ << ")");
+ gl_api_->glDisableiOESFn(target, index);
+}
+
void LogGLApi::glDisableVertexAttribArrayFn(GLuint index) {
GL_SERVICE_LOG("glDisableVertexAttribArray"
<< "(" << index << ")");
@@ -11271,6 +11504,13 @@ void LogGLApi::glEnableFn(GLenum cap) {
gl_api_->glEnableFn(cap);
}
+void LogGLApi::glEnableiOESFn(GLenum target, GLuint index) {
+ GL_SERVICE_LOG("glEnableiOES"
+ << "(" << GLEnums::GetStringEnum(target) << ", " << index
+ << ")");
+ gl_api_->glEnableiOESFn(target, index);
+}
+
void LogGLApi::glEnableVertexAttribArrayFn(GLuint index) {
GL_SERVICE_LOG("glEnableVertexAttribArray"
<< "(" << index << ")");
@@ -12976,6 +13216,15 @@ GLboolean LogGLApi::glIsEnabledFn(GLenum cap) {
return result;
}
+GLboolean LogGLApi::glIsEnablediOESFn(GLenum target, GLuint index) {
+ GL_SERVICE_LOG("glIsEnablediOES"
+ << "(" << GLEnums::GetStringEnum(target) << ", " << index
+ << ")");
+ GLboolean result = gl_api_->glIsEnablediOESFn(target, index);
+ GL_SERVICE_LOG("GL_RESULT: " << result);
+ return result;
+}
+
GLboolean LogGLApi::glIsFenceAPPLEFn(GLuint fence) {
GL_SERVICE_LOG("glIsFenceAPPLE"
<< "(" << fence << ")");
@@ -13291,6 +13540,13 @@ void LogGLApi::glObjectPtrLabelFn(void* ptr,
gl_api_->glObjectPtrLabelFn(ptr, length, label);
}
+void LogGLApi::glPatchParameteriFn(GLenum pname, GLint value) {
+ GL_SERVICE_LOG("glPatchParameteri"
+ << "(" << GLEnums::GetStringEnum(pname) << ", " << value
+ << ")");
+ gl_api_->glPatchParameteriFn(pname, value);
+}
+
void LogGLApi::glPathCommandsNVFn(GLuint path,
GLsizei numCommands,
const GLubyte* commands,
@@ -15324,15 +15580,31 @@ void NoContextGLApi::glBlendEquationFn(GLenum mode) {
NoContextHelper("glBlendEquation");
}
+void NoContextGLApi::glBlendEquationiOESFn(GLuint buf, GLenum mode) {
+ NoContextHelper("glBlendEquationiOES");
+}
+
void NoContextGLApi::glBlendEquationSeparateFn(GLenum modeRGB,
GLenum modeAlpha) {
NoContextHelper("glBlendEquationSeparate");
}
+void NoContextGLApi::glBlendEquationSeparateiOESFn(GLuint buf,
+ GLenum modeRGB,
+ GLenum modeAlpha) {
+ NoContextHelper("glBlendEquationSeparateiOES");
+}
+
void NoContextGLApi::glBlendFuncFn(GLenum sfactor, GLenum dfactor) {
NoContextHelper("glBlendFunc");
}
+void NoContextGLApi::glBlendFunciOESFn(GLuint buf,
+ GLenum sfactor,
+ GLenum dfactor) {
+ NoContextHelper("glBlendFunciOES");
+}
+
void NoContextGLApi::glBlendFuncSeparateFn(GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
@@ -15340,6 +15612,14 @@ void NoContextGLApi::glBlendFuncSeparateFn(GLenum srcRGB,
NoContextHelper("glBlendFuncSeparate");
}
+void NoContextGLApi::glBlendFuncSeparateiOESFn(GLuint buf,
+ GLenum srcRGB,
+ GLenum dstRGB,
+ GLenum srcAlpha,
+ GLenum dstAlpha) {
+ NoContextHelper("glBlendFuncSeparateiOES");
+}
+
void NoContextGLApi::glBlitFramebufferFn(GLint srcX0,
GLint srcY0,
GLint srcX1,
@@ -15463,6 +15743,14 @@ void NoContextGLApi::glColorMaskFn(GLboolean red,
NoContextHelper("glColorMask");
}
+void NoContextGLApi::glColorMaskiOESFn(GLuint buf,
+ GLboolean red,
+ GLboolean green,
+ GLboolean blue,
+ GLboolean alpha) {
+ NoContextHelper("glColorMaskiOES");
+}
+
void NoContextGLApi::glCompileShaderFn(GLuint shader) {
NoContextHelper("glCompileShader");
}
@@ -15832,6 +16120,10 @@ void NoContextGLApi::glDisableExtensionANGLEFn(const char* name) {
NoContextHelper("glDisableExtensionANGLE");
}
+void NoContextGLApi::glDisableiOESFn(GLenum target, GLuint index) {
+ NoContextHelper("glDisableiOES");
+}
+
void NoContextGLApi::glDisableVertexAttribArrayFn(GLuint index) {
NoContextHelper("glDisableVertexAttribArray");
}
@@ -15940,6 +16232,10 @@ void NoContextGLApi::glEnableFn(GLenum cap) {
NoContextHelper("glEnable");
}
+void NoContextGLApi::glEnableiOESFn(GLenum target, GLuint index) {
+ NoContextHelper("glEnableiOES");
+}
+
void NoContextGLApi::glEnableVertexAttribArrayFn(GLuint index) {
NoContextHelper("glEnableVertexAttribArray");
}
@@ -17002,6 +17298,11 @@ GLboolean NoContextGLApi::glIsEnabledFn(GLenum cap) {
return GL_FALSE;
}
+GLboolean NoContextGLApi::glIsEnablediOESFn(GLenum target, GLuint index) {
+ NoContextHelper("glIsEnablediOES");
+ return GL_FALSE;
+}
+
GLboolean NoContextGLApi::glIsFenceAPPLEFn(GLuint fence) {
NoContextHelper("glIsFenceAPPLE");
return GL_FALSE;
@@ -17197,6 +17498,10 @@ void NoContextGLApi::glObjectPtrLabelFn(void* ptr,
NoContextHelper("glObjectPtrLabel");
}
+void NoContextGLApi::glPatchParameteriFn(GLenum pname, GLint value) {
+ NoContextHelper("glPatchParameteri");
+}
+
void NoContextGLApi::glPathCommandsNVFn(GLuint path,
GLsizei numCommands,
const GLubyte* commands,
diff --git a/chromium/ui/gl/gl_bindings_autogen_gl.h b/chromium/ui/gl/gl_bindings_autogen_gl.h
index 498ba7d718b..76825eda5f4 100644
--- a/chromium/ui/gl/gl_bindings_autogen_gl.h
+++ b/chromium/ui/gl/gl_bindings_autogen_gl.h
@@ -80,13 +80,26 @@ typedef void(GL_BINDING_CALL* glBlendColorProc)(GLclampf red,
GLclampf blue,
GLclampf alpha);
typedef void(GL_BINDING_CALL* glBlendEquationProc)(GLenum mode);
+typedef void(GL_BINDING_CALL* glBlendEquationiOESProc)(GLuint buf, GLenum mode);
typedef void(GL_BINDING_CALL* glBlendEquationSeparateProc)(GLenum modeRGB,
GLenum modeAlpha);
+typedef void(GL_BINDING_CALL* glBlendEquationSeparateiOESProc)(
+ GLuint buf,
+ GLenum modeRGB,
+ GLenum modeAlpha);
typedef void(GL_BINDING_CALL* glBlendFuncProc)(GLenum sfactor, GLenum dfactor);
+typedef void(GL_BINDING_CALL* glBlendFunciOESProc)(GLuint buf,
+ GLenum sfactor,
+ GLenum dfactor);
typedef void(GL_BINDING_CALL* glBlendFuncSeparateProc)(GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
GLenum dstAlpha);
+typedef void(GL_BINDING_CALL* glBlendFuncSeparateiOESProc)(GLuint buf,
+ GLenum srcRGB,
+ GLenum dstRGB,
+ GLenum srcAlpha,
+ GLenum dstAlpha);
typedef void(GL_BINDING_CALL* glBlitFramebufferProc)(GLint srcX0,
GLint srcY0,
GLint srcX1,
@@ -153,6 +166,11 @@ typedef void(GL_BINDING_CALL* glColorMaskProc)(GLboolean red,
GLboolean green,
GLboolean blue,
GLboolean alpha);
+typedef void(GL_BINDING_CALL* glColorMaskiOESProc)(GLuint buf,
+ GLboolean red,
+ GLboolean green,
+ GLboolean blue,
+ GLboolean alpha);
typedef void(GL_BINDING_CALL* glCompileShaderProc)(GLuint shader);
typedef void(GL_BINDING_CALL* glCompressedTexImage2DProc)(GLenum target,
GLint level,
@@ -384,6 +402,7 @@ typedef void(GL_BINDING_CALL* glDetachShaderProc)(GLuint program,
GLuint shader);
typedef void(GL_BINDING_CALL* glDisableProc)(GLenum cap);
typedef void(GL_BINDING_CALL* glDisableExtensionANGLEProc)(const char* name);
+typedef void(GL_BINDING_CALL* glDisableiOESProc)(GLenum target, GLuint index);
typedef void(GL_BINDING_CALL* glDisableVertexAttribArrayProc)(GLuint index);
typedef void(GL_BINDING_CALL* glDiscardFramebufferEXTProc)(
GLenum target,
@@ -447,6 +466,7 @@ typedef void(GL_BINDING_CALL* glEGLImageTargetTexture2DOESProc)(
GLenum target,
GLeglImageOES image);
typedef void(GL_BINDING_CALL* glEnableProc)(GLenum cap);
+typedef void(GL_BINDING_CALL* glEnableiOESProc)(GLenum target, GLuint index);
typedef void(GL_BINDING_CALL* glEnableVertexAttribArrayProc)(GLuint index);
typedef void(GL_BINDING_CALL* glEndQueryProc)(GLenum target);
typedef void(GL_BINDING_CALL* glEndTilingQCOMProc)(GLbitfield preserveMask);
@@ -1077,6 +1097,8 @@ typedef void(GL_BINDING_CALL* glInvalidateSubFramebufferProc)(
typedef void(GL_BINDING_CALL* glInvalidateTextureANGLEProc)(GLenum target);
typedef GLboolean(GL_BINDING_CALL* glIsBufferProc)(GLuint buffer);
typedef GLboolean(GL_BINDING_CALL* glIsEnabledProc)(GLenum cap);
+typedef GLboolean(GL_BINDING_CALL* glIsEnablediOESProc)(GLenum target,
+ GLuint index);
typedef GLboolean(GL_BINDING_CALL* glIsFenceAPPLEProc)(GLuint fence);
typedef GLboolean(GL_BINDING_CALL* glIsFenceNVProc)(GLuint fence);
typedef GLboolean(GL_BINDING_CALL* glIsFramebufferEXTProc)(GLuint framebuffer);
@@ -1158,6 +1180,7 @@ typedef void(GL_BINDING_CALL* glObjectLabelProc)(GLenum identifier,
typedef void(GL_BINDING_CALL* glObjectPtrLabelProc)(void* ptr,
GLsizei length,
const char* label);
+typedef void(GL_BINDING_CALL* glPatchParameteriProc)(GLenum pname, GLint value);
typedef void(GL_BINDING_CALL* glPathCommandsNVProc)(GLuint path,
GLsizei numCommands,
const GLubyte* commands,
@@ -2007,6 +2030,7 @@ struct ExtensionsGL {
bool b_GL_NV_internalformat_sample_query;
bool b_GL_NV_path_rendering;
bool b_GL_OES_EGL_image;
+ bool b_GL_OES_draw_buffers_indexed;
bool b_GL_OES_get_program_binary;
bool b_GL_OES_mapbuffer;
bool b_GL_OES_texture_buffer;
@@ -2042,9 +2066,13 @@ struct ProcsGL {
glBlendBarrierKHRProc glBlendBarrierKHRFn;
glBlendColorProc glBlendColorFn;
glBlendEquationProc glBlendEquationFn;
+ glBlendEquationiOESProc glBlendEquationiOESFn;
glBlendEquationSeparateProc glBlendEquationSeparateFn;
+ glBlendEquationSeparateiOESProc glBlendEquationSeparateiOESFn;
glBlendFuncProc glBlendFuncFn;
+ glBlendFunciOESProc glBlendFunciOESFn;
glBlendFuncSeparateProc glBlendFuncSeparateFn;
+ glBlendFuncSeparateiOESProc glBlendFuncSeparateiOESFn;
glBlitFramebufferProc glBlitFramebufferFn;
glBufferDataProc glBufferDataFn;
glBufferSubDataProc glBufferSubDataFn;
@@ -2063,6 +2091,7 @@ struct ProcsGL {
glClientWaitSyncProc glClientWaitSyncFn;
glClientWaitSyncAPPLEProc glClientWaitSyncAPPLEFn;
glColorMaskProc glColorMaskFn;
+ glColorMaskiOESProc glColorMaskiOESFn;
glCompileShaderProc glCompileShaderFn;
glCompressedTexImage2DProc glCompressedTexImage2DFn;
glCompressedTexImage2DRobustANGLEProc glCompressedTexImage2DRobustANGLEFn;
@@ -2118,6 +2147,7 @@ struct ProcsGL {
glDetachShaderProc glDetachShaderFn;
glDisableProc glDisableFn;
glDisableExtensionANGLEProc glDisableExtensionANGLEFn;
+ glDisableiOESProc glDisableiOESFn;
glDisableVertexAttribArrayProc glDisableVertexAttribArrayFn;
glDiscardFramebufferEXTProc glDiscardFramebufferEXTFn;
glDispatchComputeProc glDispatchComputeFn;
@@ -2139,6 +2169,7 @@ struct ProcsGL {
glEGLImageTargetRenderbufferStorageOESFn;
glEGLImageTargetTexture2DOESProc glEGLImageTargetTexture2DOESFn;
glEnableProc glEnableFn;
+ glEnableiOESProc glEnableiOESFn;
glEnableVertexAttribArrayProc glEnableVertexAttribArrayFn;
glEndQueryProc glEndQueryFn;
glEndTilingQCOMProc glEndTilingQCOMFn;
@@ -2307,6 +2338,7 @@ struct ProcsGL {
glInvalidateTextureANGLEProc glInvalidateTextureANGLEFn;
glIsBufferProc glIsBufferFn;
glIsEnabledProc glIsEnabledFn;
+ glIsEnablediOESProc glIsEnablediOESFn;
glIsFenceAPPLEProc glIsFenceAPPLEFn;
glIsFenceNVProc glIsFenceNVFn;
glIsFramebufferEXTProc glIsFramebufferEXTFn;
@@ -2343,6 +2375,7 @@ struct ProcsGL {
glMultiDrawElementsInstancedBaseVertexBaseInstanceANGLEFn;
glObjectLabelProc glObjectLabelFn;
glObjectPtrLabelProc glObjectPtrLabelFn;
+ glPatchParameteriProc glPatchParameteriFn;
glPathCommandsNVProc glPathCommandsNVFn;
glPathParameterfNVProc glPathParameterfNVFn;
glPathParameteriNVProc glPathParameteriNVFn;
@@ -2591,12 +2624,24 @@ class GL_EXPORT GLApi {
GLclampf blue,
GLclampf alpha) = 0;
virtual void glBlendEquationFn(GLenum mode) = 0;
+ virtual void glBlendEquationiOESFn(GLuint buf, GLenum mode) = 0;
virtual void glBlendEquationSeparateFn(GLenum modeRGB, GLenum modeAlpha) = 0;
+ virtual void glBlendEquationSeparateiOESFn(GLuint buf,
+ GLenum modeRGB,
+ GLenum modeAlpha) = 0;
virtual void glBlendFuncFn(GLenum sfactor, GLenum dfactor) = 0;
+ virtual void glBlendFunciOESFn(GLuint buf,
+ GLenum sfactor,
+ GLenum dfactor) = 0;
virtual void glBlendFuncSeparateFn(GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
GLenum dstAlpha) = 0;
+ virtual void glBlendFuncSeparateiOESFn(GLuint buf,
+ GLenum srcRGB,
+ GLenum dstRGB,
+ GLenum srcAlpha,
+ GLenum dstAlpha) = 0;
virtual void glBlitFramebufferFn(GLint srcX0,
GLint srcY0,
GLint srcX1,
@@ -2663,6 +2708,11 @@ class GL_EXPORT GLApi {
GLboolean green,
GLboolean blue,
GLboolean alpha) = 0;
+ virtual void glColorMaskiOESFn(GLuint buf,
+ GLboolean red,
+ GLboolean green,
+ GLboolean blue,
+ GLboolean alpha) = 0;
virtual void glCompileShaderFn(GLuint shader) = 0;
virtual void glCompressedTexImage2DFn(GLenum target,
GLint level,
@@ -2864,6 +2914,7 @@ class GL_EXPORT GLApi {
virtual void glDetachShaderFn(GLuint program, GLuint shader) = 0;
virtual void glDisableFn(GLenum cap) = 0;
virtual void glDisableExtensionANGLEFn(const char* name) = 0;
+ virtual void glDisableiOESFn(GLenum target, GLuint index) = 0;
virtual void glDisableVertexAttribArrayFn(GLuint index) = 0;
virtual void glDiscardFramebufferEXTFn(GLenum target,
GLsizei numAttachments,
@@ -2918,6 +2969,7 @@ class GL_EXPORT GLApi {
virtual void glEGLImageTargetTexture2DOESFn(GLenum target,
GLeglImageOES image) = 0;
virtual void glEnableFn(GLenum cap) = 0;
+ virtual void glEnableiOESFn(GLenum target, GLuint index) = 0;
virtual void glEnableVertexAttribArrayFn(GLuint index) = 0;
virtual void glEndQueryFn(GLenum target) = 0;
virtual void glEndTilingQCOMFn(GLbitfield preserveMask) = 0;
@@ -3467,6 +3519,7 @@ class GL_EXPORT GLApi {
virtual void glInvalidateTextureANGLEFn(GLenum target) = 0;
virtual GLboolean glIsBufferFn(GLuint buffer) = 0;
virtual GLboolean glIsEnabledFn(GLenum cap) = 0;
+ virtual GLboolean glIsEnablediOESFn(GLenum target, GLuint index) = 0;
virtual GLboolean glIsFenceAPPLEFn(GLuint fence) = 0;
virtual GLboolean glIsFenceNVFn(GLuint fence) = 0;
virtual GLboolean glIsFramebufferEXTFn(GLuint framebuffer) = 0;
@@ -3542,6 +3595,7 @@ class GL_EXPORT GLApi {
virtual void glObjectPtrLabelFn(void* ptr,
GLsizei length,
const char* label) = 0;
+ virtual void glPatchParameteriFn(GLenum pname, GLint value) = 0;
virtual void glPathCommandsNVFn(GLuint path,
GLsizei numCommands,
const GLubyte* commands,
@@ -4273,10 +4327,16 @@ class GL_EXPORT GLApi {
#define glBlendBarrierKHR ::gl::g_current_gl_context->glBlendBarrierKHRFn
#define glBlendColor ::gl::g_current_gl_context->glBlendColorFn
#define glBlendEquation ::gl::g_current_gl_context->glBlendEquationFn
+#define glBlendEquationiOES ::gl::g_current_gl_context->glBlendEquationiOESFn
#define glBlendEquationSeparate \
::gl::g_current_gl_context->glBlendEquationSeparateFn
+#define glBlendEquationSeparateiOES \
+ ::gl::g_current_gl_context->glBlendEquationSeparateiOESFn
#define glBlendFunc ::gl::g_current_gl_context->glBlendFuncFn
+#define glBlendFunciOES ::gl::g_current_gl_context->glBlendFunciOESFn
#define glBlendFuncSeparate ::gl::g_current_gl_context->glBlendFuncSeparateFn
+#define glBlendFuncSeparateiOES \
+ ::gl::g_current_gl_context->glBlendFuncSeparateiOESFn
#define glBlitFramebuffer ::gl::g_current_gl_context->glBlitFramebufferFn
#define glBufferData ::gl::g_current_gl_context->glBufferDataFn
#define glBufferSubData ::gl::g_current_gl_context->glBufferSubDataFn
@@ -4297,6 +4357,7 @@ class GL_EXPORT GLApi {
#define glClientWaitSyncAPPLE \
::gl::g_current_gl_context->glClientWaitSyncAPPLEFn
#define glColorMask ::gl::g_current_gl_context->glColorMaskFn
+#define glColorMaskiOES ::gl::g_current_gl_context->glColorMaskiOESFn
#define glCompileShader ::gl::g_current_gl_context->glCompileShaderFn
#define glCompressedTexImage2D \
::gl::g_current_gl_context->glCompressedTexImage2DFn
@@ -4375,6 +4436,7 @@ class GL_EXPORT GLApi {
#define glDisable ::gl::g_current_gl_context->glDisableFn
#define glDisableExtensionANGLE \
::gl::g_current_gl_context->glDisableExtensionANGLEFn
+#define glDisableiOES ::gl::g_current_gl_context->glDisableiOESFn
#define glDisableVertexAttribArray \
::gl::g_current_gl_context->glDisableVertexAttribArrayFn
#define glDiscardFramebufferEXT \
@@ -4404,6 +4466,7 @@ class GL_EXPORT GLApi {
#define glEGLImageTargetTexture2DOES \
::gl::g_current_gl_context->glEGLImageTargetTexture2DOESFn
#define glEnable ::gl::g_current_gl_context->glEnableFn
+#define glEnableiOES ::gl::g_current_gl_context->glEnableiOESFn
#define glEnableVertexAttribArray \
::gl::g_current_gl_context->glEnableVertexAttribArrayFn
#define glEndQuery ::gl::g_current_gl_context->glEndQueryFn
@@ -4659,6 +4722,7 @@ class GL_EXPORT GLApi {
::gl::g_current_gl_context->glInvalidateTextureANGLEFn
#define glIsBuffer ::gl::g_current_gl_context->glIsBufferFn
#define glIsEnabled ::gl::g_current_gl_context->glIsEnabledFn
+#define glIsEnablediOES ::gl::g_current_gl_context->glIsEnablediOESFn
#define glIsFenceAPPLE ::gl::g_current_gl_context->glIsFenceAPPLEFn
#define glIsFenceNV ::gl::g_current_gl_context->glIsFenceNVFn
#define glIsFramebufferEXT ::gl::g_current_gl_context->glIsFramebufferEXTFn
@@ -4705,6 +4769,7 @@ class GL_EXPORT GLApi {
->glMultiDrawElementsInstancedBaseVertexBaseInstanceANGLEFn
#define glObjectLabel ::gl::g_current_gl_context->glObjectLabelFn
#define glObjectPtrLabel ::gl::g_current_gl_context->glObjectPtrLabelFn
+#define glPatchParameteri ::gl::g_current_gl_context->glPatchParameteriFn
#define glPathCommandsNV ::gl::g_current_gl_context->glPathCommandsNVFn
#define glPathParameterfNV ::gl::g_current_gl_context->glPathParameterfNVFn
#define glPathParameteriNV ::gl::g_current_gl_context->glPathParameteriNVFn
diff --git a/chromium/ui/gl/gl_bindings_autogen_mock.cc b/chromium/ui/gl/gl_bindings_autogen_mock.cc
index b712d5c1851..afd8a2a6809 100644
--- a/chromium/ui/gl/gl_bindings_autogen_mock.cc
+++ b/chromium/ui/gl/gl_bindings_autogen_mock.cc
@@ -10,6 +10,7 @@
#include <string.h>
+#include "base/notreached.h"
#include "ui/gl/gl_mock.h"
namespace {
@@ -296,6 +297,34 @@ MockGLInterface::Mock_glBlendEquationSeparate(GLenum modeRGB,
interface_->BlendEquationSeparate(modeRGB, modeAlpha);
}
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBlendEquationSeparatei(GLuint buf,
+ GLenum modeRGB,
+ GLenum modeAlpha) {
+ MakeGlMockFunctionUnique("glBlendEquationSeparatei");
+ interface_->BlendEquationSeparateiOES(buf, modeRGB, modeAlpha);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBlendEquationSeparateiOES(GLuint buf,
+ GLenum modeRGB,
+ GLenum modeAlpha) {
+ MakeGlMockFunctionUnique("glBlendEquationSeparateiOES");
+ interface_->BlendEquationSeparateiOES(buf, modeRGB, modeAlpha);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glBlendEquationi(GLuint buf,
+ GLenum mode) {
+ MakeGlMockFunctionUnique("glBlendEquationi");
+ interface_->BlendEquationiOES(buf, mode);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glBlendEquationiOES(GLuint buf,
+ GLenum mode) {
+ MakeGlMockFunctionUnique("glBlendEquationiOES");
+ interface_->BlendEquationiOES(buf, mode);
+}
+
void GL_BINDING_CALL MockGLInterface::Mock_glBlendFunc(GLenum sfactor,
GLenum dfactor) {
MakeGlMockFunctionUnique("glBlendFunc");
@@ -311,6 +340,40 @@ MockGLInterface::Mock_glBlendFuncSeparate(GLenum srcRGB,
interface_->BlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
}
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBlendFuncSeparatei(GLuint buf,
+ GLenum srcRGB,
+ GLenum dstRGB,
+ GLenum srcAlpha,
+ GLenum dstAlpha) {
+ MakeGlMockFunctionUnique("glBlendFuncSeparatei");
+ interface_->BlendFuncSeparateiOES(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+void GL_BINDING_CALL
+MockGLInterface::Mock_glBlendFuncSeparateiOES(GLuint buf,
+ GLenum srcRGB,
+ GLenum dstRGB,
+ GLenum srcAlpha,
+ GLenum dstAlpha) {
+ MakeGlMockFunctionUnique("glBlendFuncSeparateiOES");
+ interface_->BlendFuncSeparateiOES(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glBlendFunci(GLuint buf,
+ GLenum sfactor,
+ GLenum dfactor) {
+ MakeGlMockFunctionUnique("glBlendFunci");
+ interface_->BlendFunciOES(buf, sfactor, dfactor);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glBlendFunciOES(GLuint buf,
+ GLenum sfactor,
+ GLenum dfactor) {
+ MakeGlMockFunctionUnique("glBlendFunciOES");
+ interface_->BlendFunciOES(buf, sfactor, dfactor);
+}
+
void GL_BINDING_CALL MockGLInterface::Mock_glBlitFramebuffer(GLint srcX0,
GLint srcY0,
GLint srcX1,
@@ -521,6 +584,24 @@ void GL_BINDING_CALL MockGLInterface::Mock_glColorMask(GLboolean red,
interface_->ColorMask(red, green, blue, alpha);
}
+void GL_BINDING_CALL MockGLInterface::Mock_glColorMaski(GLuint buf,
+ GLboolean red,
+ GLboolean green,
+ GLboolean blue,
+ GLboolean alpha) {
+ MakeGlMockFunctionUnique("glColorMaski");
+ interface_->ColorMaskiOES(buf, red, green, blue, alpha);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glColorMaskiOES(GLuint buf,
+ GLboolean red,
+ GLboolean green,
+ GLboolean blue,
+ GLboolean alpha) {
+ MakeGlMockFunctionUnique("glColorMaskiOES");
+ interface_->ColorMaskiOES(buf, red, green, blue, alpha);
+}
+
void GL_BINDING_CALL MockGLInterface::Mock_glCompileShader(GLuint shader) {
MakeGlMockFunctionUnique("glCompileShader");
interface_->CompileShader(shader);
@@ -1127,6 +1208,18 @@ MockGLInterface::Mock_glDisableVertexAttribArray(GLuint index) {
interface_->DisableVertexAttribArray(index);
}
+void GL_BINDING_CALL MockGLInterface::Mock_glDisablei(GLenum target,
+ GLuint index) {
+ MakeGlMockFunctionUnique("glDisablei");
+ interface_->DisableiOES(target, index);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glDisableiOES(GLenum target,
+ GLuint index) {
+ MakeGlMockFunctionUnique("glDisableiOES");
+ interface_->DisableiOES(target, index);
+}
+
void GL_BINDING_CALL
MockGLInterface::Mock_glDiscardFramebufferEXT(GLenum target,
GLsizei numAttachments,
@@ -1372,6 +1465,18 @@ MockGLInterface::Mock_glEnableVertexAttribArray(GLuint index) {
interface_->EnableVertexAttribArray(index);
}
+void GL_BINDING_CALL MockGLInterface::Mock_glEnablei(GLenum target,
+ GLuint index) {
+ MakeGlMockFunctionUnique("glEnablei");
+ interface_->EnableiOES(target, index);
+}
+
+void GL_BINDING_CALL MockGLInterface::Mock_glEnableiOES(GLenum target,
+ GLuint index) {
+ MakeGlMockFunctionUnique("glEnableiOES");
+ interface_->EnableiOES(target, index);
+}
+
void GL_BINDING_CALL MockGLInterface::Mock_glEndQuery(GLenum target) {
MakeGlMockFunctionUnique("glEndQuery");
interface_->EndQuery(target);
@@ -3014,6 +3119,18 @@ GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsEnabled(GLenum cap) {
return interface_->IsEnabled(cap);
}
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsEnabledi(GLenum target,
+ GLuint index) {
+ MakeGlMockFunctionUnique("glIsEnabledi");
+ return interface_->IsEnablediOES(target, index);
+}
+
+GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsEnablediOES(GLenum target,
+ GLuint index) {
+ MakeGlMockFunctionUnique("glIsEnablediOES");
+ return interface_->IsEnablediOES(target, index);
+}
+
GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsFenceAPPLE(GLuint fence) {
MakeGlMockFunctionUnique("glIsFenceAPPLE");
return interface_->IsFenceAPPLE(fence);
@@ -3337,6 +3454,12 @@ MockGLInterface::Mock_glObjectPtrLabelKHR(void* ptr,
interface_->ObjectPtrLabel(ptr, length, label);
}
+void GL_BINDING_CALL MockGLInterface::Mock_glPatchParameteri(GLenum pname,
+ GLint value) {
+ MakeGlMockFunctionUnique("glPatchParameteri");
+ interface_->PatchParameteri(pname, value);
+}
+
void GL_BINDING_CALL
MockGLInterface::Mock_glPathCommandsCHROMIUM(GLuint path,
GLsizei numCommands,
@@ -5302,10 +5425,29 @@ MockGLInterface::GetGLProcAddress(const char* name) {
if (strcmp(name, "glBlendEquationSeparate") == 0)
return reinterpret_cast<GLFunctionPointerType>(
Mock_glBlendEquationSeparate);
+ if (strcmp(name, "glBlendEquationSeparatei") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(
+ Mock_glBlendEquationSeparatei);
+ if (strcmp(name, "glBlendEquationSeparateiOES") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(
+ Mock_glBlendEquationSeparateiOES);
+ if (strcmp(name, "glBlendEquationi") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(Mock_glBlendEquationi);
+ if (strcmp(name, "glBlendEquationiOES") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(Mock_glBlendEquationiOES);
if (strcmp(name, "glBlendFunc") == 0)
return reinterpret_cast<GLFunctionPointerType>(Mock_glBlendFunc);
if (strcmp(name, "glBlendFuncSeparate") == 0)
return reinterpret_cast<GLFunctionPointerType>(Mock_glBlendFuncSeparate);
+ if (strcmp(name, "glBlendFuncSeparatei") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(Mock_glBlendFuncSeparatei);
+ if (strcmp(name, "glBlendFuncSeparateiOES") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(
+ Mock_glBlendFuncSeparateiOES);
+ if (strcmp(name, "glBlendFunci") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(Mock_glBlendFunci);
+ if (strcmp(name, "glBlendFunciOES") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(Mock_glBlendFunciOES);
if (strcmp(name, "glBlitFramebuffer") == 0)
return reinterpret_cast<GLFunctionPointerType>(Mock_glBlitFramebuffer);
if (strcmp(name, "glBlitFramebufferANGLE") == 0)
@@ -5354,6 +5496,10 @@ MockGLInterface::GetGLProcAddress(const char* name) {
return reinterpret_cast<GLFunctionPointerType>(Mock_glClientWaitSyncAPPLE);
if (strcmp(name, "glColorMask") == 0)
return reinterpret_cast<GLFunctionPointerType>(Mock_glColorMask);
+ if (strcmp(name, "glColorMaski") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(Mock_glColorMaski);
+ if (strcmp(name, "glColorMaskiOES") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(Mock_glColorMaskiOES);
if (strcmp(name, "glCompileShader") == 0)
return reinterpret_cast<GLFunctionPointerType>(Mock_glCompileShader);
if (strcmp(name, "glCompressedTexImage2D") == 0)
@@ -5519,6 +5665,10 @@ MockGLInterface::GetGLProcAddress(const char* name) {
if (strcmp(name, "glDisableVertexAttribArray") == 0)
return reinterpret_cast<GLFunctionPointerType>(
Mock_glDisableVertexAttribArray);
+ if (strcmp(name, "glDisablei") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(Mock_glDisablei);
+ if (strcmp(name, "glDisableiOES") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(Mock_glDisableiOES);
if (strcmp(name, "glDiscardFramebufferEXT") == 0)
return reinterpret_cast<GLFunctionPointerType>(
Mock_glDiscardFramebufferEXT);
@@ -5591,6 +5741,10 @@ MockGLInterface::GetGLProcAddress(const char* name) {
if (strcmp(name, "glEnableVertexAttribArray") == 0)
return reinterpret_cast<GLFunctionPointerType>(
Mock_glEnableVertexAttribArray);
+ if (strcmp(name, "glEnablei") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(Mock_glEnablei);
+ if (strcmp(name, "glEnableiOES") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(Mock_glEnableiOES);
if (strcmp(name, "glEndQuery") == 0)
return reinterpret_cast<GLFunctionPointerType>(Mock_glEndQuery);
if (strcmp(name, "glEndQueryARB") == 0)
@@ -6075,6 +6229,10 @@ MockGLInterface::GetGLProcAddress(const char* name) {
return reinterpret_cast<GLFunctionPointerType>(Mock_glIsBuffer);
if (strcmp(name, "glIsEnabled") == 0)
return reinterpret_cast<GLFunctionPointerType>(Mock_glIsEnabled);
+ if (strcmp(name, "glIsEnabledi") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(Mock_glIsEnabledi);
+ if (strcmp(name, "glIsEnablediOES") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(Mock_glIsEnablediOES);
if (strcmp(name, "glIsFenceAPPLE") == 0)
return reinterpret_cast<GLFunctionPointerType>(Mock_glIsFenceAPPLE);
if (strcmp(name, "glIsFenceNV") == 0)
@@ -6182,6 +6340,8 @@ MockGLInterface::GetGLProcAddress(const char* name) {
return reinterpret_cast<GLFunctionPointerType>(Mock_glObjectPtrLabel);
if (strcmp(name, "glObjectPtrLabelKHR") == 0)
return reinterpret_cast<GLFunctionPointerType>(Mock_glObjectPtrLabelKHR);
+ if (strcmp(name, "glPatchParameteri") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(Mock_glPatchParameteri);
if (strcmp(name, "glPathCommandsCHROMIUM") == 0)
return reinterpret_cast<GLFunctionPointerType>(Mock_glPathCommandsCHROMIUM);
if (strcmp(name, "glPathCommandsNV") == 0)
diff --git a/chromium/ui/gl/gl_bindings_autogen_mock.h b/chromium/ui/gl/gl_bindings_autogen_mock.h
index 1387c72f19b..304adb20e58 100644
--- a/chromium/ui/gl/gl_bindings_autogen_mock.h
+++ b/chromium/ui/gl/gl_bindings_autogen_mock.h
@@ -109,11 +109,35 @@ static void GL_BINDING_CALL Mock_glBlendColor(GLclampf red,
static void GL_BINDING_CALL Mock_glBlendEquation(GLenum mode);
static void GL_BINDING_CALL Mock_glBlendEquationSeparate(GLenum modeRGB,
GLenum modeAlpha);
+static void GL_BINDING_CALL Mock_glBlendEquationSeparatei(GLuint buf,
+ GLenum modeRGB,
+ GLenum modeAlpha);
+static void GL_BINDING_CALL Mock_glBlendEquationSeparateiOES(GLuint buf,
+ GLenum modeRGB,
+ GLenum modeAlpha);
+static void GL_BINDING_CALL Mock_glBlendEquationi(GLuint buf, GLenum mode);
+static void GL_BINDING_CALL Mock_glBlendEquationiOES(GLuint buf, GLenum mode);
static void GL_BINDING_CALL Mock_glBlendFunc(GLenum sfactor, GLenum dfactor);
static void GL_BINDING_CALL Mock_glBlendFuncSeparate(GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
GLenum dstAlpha);
+static void GL_BINDING_CALL Mock_glBlendFuncSeparatei(GLuint buf,
+ GLenum srcRGB,
+ GLenum dstRGB,
+ GLenum srcAlpha,
+ GLenum dstAlpha);
+static void GL_BINDING_CALL Mock_glBlendFuncSeparateiOES(GLuint buf,
+ GLenum srcRGB,
+ GLenum dstRGB,
+ GLenum srcAlpha,
+ GLenum dstAlpha);
+static void GL_BINDING_CALL Mock_glBlendFunci(GLuint buf,
+ GLenum sfactor,
+ GLenum dfactor);
+static void GL_BINDING_CALL Mock_glBlendFunciOES(GLuint buf,
+ GLenum sfactor,
+ GLenum dfactor);
static void GL_BINDING_CALL Mock_glBlitFramebuffer(GLint srcX0,
GLint srcY0,
GLint srcX1,
@@ -217,6 +241,16 @@ static void GL_BINDING_CALL Mock_glColorMask(GLboolean red,
GLboolean green,
GLboolean blue,
GLboolean alpha);
+static void GL_BINDING_CALL Mock_glColorMaski(GLuint buf,
+ GLboolean red,
+ GLboolean green,
+ GLboolean blue,
+ GLboolean alpha);
+static void GL_BINDING_CALL Mock_glColorMaskiOES(GLuint buf,
+ GLboolean red,
+ GLboolean green,
+ GLboolean blue,
+ GLboolean alpha);
static void GL_BINDING_CALL Mock_glCompileShader(GLuint shader);
static void GL_BINDING_CALL Mock_glCompressedTexImage2D(GLenum target,
GLint level,
@@ -488,6 +522,8 @@ static void GL_BINDING_CALL Mock_glDetachShader(GLuint program, GLuint shader);
static void GL_BINDING_CALL Mock_glDisable(GLenum cap);
static void GL_BINDING_CALL Mock_glDisableExtensionANGLE(const char* name);
static void GL_BINDING_CALL Mock_glDisableVertexAttribArray(GLuint index);
+static void GL_BINDING_CALL Mock_glDisablei(GLenum target, GLuint index);
+static void GL_BINDING_CALL Mock_glDisableiOES(GLenum target, GLuint index);
static void GL_BINDING_CALL
Mock_glDiscardFramebufferEXT(GLenum target,
GLsizei numAttachments,
@@ -596,6 +632,8 @@ static void GL_BINDING_CALL
Mock_glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image);
static void GL_BINDING_CALL Mock_glEnable(GLenum cap);
static void GL_BINDING_CALL Mock_glEnableVertexAttribArray(GLuint index);
+static void GL_BINDING_CALL Mock_glEnablei(GLenum target, GLuint index);
+static void GL_BINDING_CALL Mock_glEnableiOES(GLenum target, GLuint index);
static void GL_BINDING_CALL Mock_glEndQuery(GLenum target);
static void GL_BINDING_CALL Mock_glEndQueryARB(GLenum target);
static void GL_BINDING_CALL Mock_glEndQueryEXT(GLenum target);
@@ -1316,6 +1354,9 @@ Mock_glInvalidateSubFramebuffer(GLenum target,
static void GL_BINDING_CALL Mock_glInvalidateTextureANGLE(GLenum target);
static GLboolean GL_BINDING_CALL Mock_glIsBuffer(GLuint buffer);
static GLboolean GL_BINDING_CALL Mock_glIsEnabled(GLenum cap);
+static GLboolean GL_BINDING_CALL Mock_glIsEnabledi(GLenum target, GLuint index);
+static GLboolean GL_BINDING_CALL Mock_glIsEnablediOES(GLenum target,
+ GLuint index);
static GLboolean GL_BINDING_CALL Mock_glIsFenceAPPLE(GLuint fence);
static GLboolean GL_BINDING_CALL Mock_glIsFenceNV(GLuint fence);
static GLboolean GL_BINDING_CALL Mock_glIsFramebuffer(GLuint framebuffer);
@@ -1420,6 +1461,7 @@ static void GL_BINDING_CALL Mock_glObjectPtrLabel(void* ptr,
static void GL_BINDING_CALL Mock_glObjectPtrLabelKHR(void* ptr,
GLsizei length,
const char* label);
+static void GL_BINDING_CALL Mock_glPatchParameteri(GLenum pname, GLint value);
static void GL_BINDING_CALL Mock_glPathCommandsCHROMIUM(GLuint path,
GLsizei numCommands,
const GLubyte* commands,
diff --git a/chromium/ui/gl/gl_context.cc b/chromium/ui/gl/gl_context.cc
index 94cf06ed56c..60c4665776f 100644
--- a/chromium/ui/gl/gl_context.cc
+++ b/chromium/ui/gl/gl_context.cc
@@ -201,7 +201,7 @@ void GLContext::DirtyVirtualContextState() {
constexpr uint64_t kInvalidFenceId = 0;
uint64_t GLContext::BackpressureFenceCreate() {
- TRACE_EVENT0("gpu", "GLContextEGL::BackpressureFenceCreate");
+ TRACE_EVENT0("gpu", "GLContext::BackpressureFenceCreate");
// This flush will trigger a crash if FlushForDriverCrashWorkaround is not
// called sufficiently frequently.
@@ -392,6 +392,9 @@ bool GLContext::MakeVirtuallyCurrent(
GLContext* virtual_context, GLSurface* surface) {
if (!ForceGpuSwitchIfNeeded())
return false;
+ if (virtual_context_lost_)
+ return false;
+
bool switched_real_contexts = GLContext::GetRealCurrent() != this;
if (switched_real_contexts || !surface->IsCurrent()) {
GLSurface* current_surface = GLSurface::GetCurrent();
@@ -401,6 +404,7 @@ bool GLContext::MakeVirtuallyCurrent(
if (switched_real_contexts || !current_surface ||
!virtual_context->IsCurrent(surface)) {
if (!MakeCurrent(surface)) {
+ virtual_context_lost_ = true;
return false;
}
}
@@ -441,6 +445,7 @@ bool GLContext::MakeVirtuallyCurrent(
virtual_context->SetCurrent(surface);
if (!surface->OnMakeCurrent(virtual_context)) {
LOG(ERROR) << "Could not make GLSurface current.";
+ virtual_context_lost_ = true;
return false;
}
return true;
diff --git a/chromium/ui/gl/gl_context.h b/chromium/ui/gl/gl_context.h
index 48e9dd36276..a7dd9c470b1 100644
--- a/chromium/ui/gl/gl_context.h
+++ b/chromium/ui/gl/gl_context.h
@@ -277,6 +277,8 @@ class GL_EXPORT GLContext : public base::RefCounted<GLContext>,
void DestroyBackpressureFences();
#endif
+ void MarkVirtualContextLost() { virtual_context_lost_ = true; }
+
private:
friend class base::RefCounted<GLContext>;
@@ -309,6 +311,9 @@ class GL_EXPORT GLContext : public base::RefCounted<GLContext>,
bool state_dirtied_externally_ = false;
std::unique_ptr<GLStateRestorer> state_restorer_;
std::unique_ptr<GLVersionInfo> version_info_;
+ // This bit allows us to avoid virtual context state restoration in the case
+ // where this underlying context becomes lost. https://crbug.com/1061442
+ bool virtual_context_lost_ = false;
#if defined(OS_MACOSX)
std::map<uint64_t, std::unique_ptr<GLFence>> backpressure_fences_;
diff --git a/chromium/ui/gl/gl_context_egl.cc b/chromium/ui/gl/gl_context_egl.cc
index cbcb9bc6bdd..329fbfbf938 100644
--- a/chromium/ui/gl/gl_context_egl.cc
+++ b/chromium/ui/gl/gl_context_egl.cc
@@ -269,6 +269,18 @@ YUVToRGBConverter* GLContextEGL::GetYUVToRGBConverter(
return yuv_to_rgb_converter.get();
}
+void GLContextEGL::SetVisibility(bool visibility) {
+ if (GLSurfaceEGL::IsANGLEPowerPreferenceSupported()) {
+ // It doesn't matter whether this context was explicitly allocated
+ // with a power preference - ANGLE will take care of any default behavior.
+ if (visibility) {
+ eglReacquireHighPowerGPUANGLE(display_, context_);
+ } else {
+ eglReleaseHighPowerGPUANGLE(display_, context_);
+ }
+ }
+}
+
void GLContextEGL::ReleaseYUVToRGBConvertersAndBackpressureFences() {
#if defined(OS_MACOSX)
bool has_backpressure_fences = HasBackpressureFences();
diff --git a/chromium/ui/gl/gl_context_egl.h b/chromium/ui/gl/gl_context_egl.h
index 31945fdd498..ce18596b67d 100644
--- a/chromium/ui/gl/gl_context_egl.h
+++ b/chromium/ui/gl/gl_context_egl.h
@@ -37,6 +37,7 @@ class GL_EXPORT GLContextEGL : public GLContextReal {
void SetUnbindFboOnMakeCurrent() override;
YUVToRGBConverter* GetYUVToRGBConverter(
const gfx::ColorSpace& color_space) override;
+ void SetVisibility(bool visibility) override;
protected:
~GLContextEGL() override;
diff --git a/chromium/ui/gl/gl_context_glx.h b/chromium/ui/gl/gl_context_glx.h
index ed203cb607a..47beb46b14c 100644
--- a/chromium/ui/gl/gl_context_glx.h
+++ b/chromium/ui/gl/gl_context_glx.h
@@ -9,6 +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/gl/gl_context.h"
#include "ui/gl/gl_export.h"
diff --git a/chromium/ui/gl/gl_context_glx_unittest.cc b/chromium/ui/gl/gl_context_glx_unittest.cc
index ce3dedb0f15..5fc733ba5f0 100644
--- a/chromium/ui/gl/gl_context_glx_unittest.cc
+++ b/chromium/ui/gl/gl_context_glx_unittest.cc
@@ -35,21 +35,19 @@ TEST(GLContextGLXTest, MAYBE_DoNotDestroyOnFailedMakeCurrent) {
memset(&swa, 0, sizeof(swa));
swa.background_pixmap = 0;
swa.override_redirect = x11::True;
- auto xwindow = XCreateWindow(xdisplay, DefaultRootWindow(xdisplay), 0, 0, 10,
- 10, // x, y, width, height
- 0, // border width
- CopyFromParent, // depth
- InputOutput,
- CopyFromParent, // visual
- CWBackPixmap | CWOverrideRedirect, &swa);
- XSelectInput(xdisplay, xwindow, StructureNotifyMask);
+ auto xwindow = static_cast<x11::Window>(XCreateWindow(
+ xdisplay, DefaultRootWindow(xdisplay), 0, 0, 10,
+ 10, // x, y, width, height
+ 0, // border width
+ static_cast<int>(x11::WindowClass::CopyFromParent), // depth
+ static_cast<int>(x11::WindowClass::InputOutput),
+ nullptr, // visual
+ CWBackPixmap | CWOverrideRedirect, &swa));
- XEvent xevent;
- XMapWindow(xdisplay, xwindow);
- // Wait until the window is mapped.
- while (XNextEvent(xdisplay, &xevent) && xevent.type != MapNotify &&
- xevent.xmap.window != xwindow) {
- }
+ XMapWindow(xdisplay, static_cast<uint32_t>(xwindow));
+ // Since this window is override-redirect, syncing is sufficient
+ // to ensure the map is complete.
+ XSync(xdisplay, x11::False);
GLImageTestSupport::InitializeGL(base::nullopt);
auto surface =
@@ -62,12 +60,11 @@ TEST(GLContextGLXTest, MAYBE_DoNotDestroyOnFailedMakeCurrent) {
ASSERT_TRUE(context->MakeCurrent(surface.get()));
EXPECT_TRUE(context->GetHandle());
- // Destroy the window, and wait until the window is unmapped. There should be
- // no x11 errors.
context->ReleaseCurrent(surface.get());
- XDestroyWindow(xdisplay, xwindow);
- while (XNextEvent(xdisplay, &xevent) && xevent.type != UnmapNotify) {
- }
+ XDestroyWindow(xdisplay, static_cast<uint32_t>(xwindow));
+ // Since this window is override-redirect, syncing is sufficient
+ // to ensure the window is destroyed and unmapped.
+ XSync(xdisplay, x11::False);
ASSERT_FALSE(error_tracker.FoundNewError());
if (context->MakeCurrent(surface.get())) {
diff --git a/chromium/ui/gl/gl_features.cc b/chromium/ui/gl/gl_features.cc
index a3fcbf5f6dc..b59542f01d1 100644
--- a/chromium/ui/gl/gl_features.cc
+++ b/chromium/ui/gl/gl_features.cc
@@ -13,7 +13,7 @@ namespace features {
// Launched on Windows, still experimental on other platforms.
const base::Feature kDefaultPassthroughCommandDecoder{
"DefaultPassthroughCommandDecoder",
-#if defined(OS_WIN)
+#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(CHROMECAST_BUILD))
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
diff --git a/chromium/ui/gl/gl_fence_android_native_fence_sync.cc b/chromium/ui/gl/gl_fence_android_native_fence_sync.cc
index c59e65ee792..64d1e6e1d07 100644
--- a/chromium/ui/gl/gl_fence_android_native_fence_sync.cc
+++ b/chromium/ui/gl/gl_fence_android_native_fence_sync.cc
@@ -10,6 +10,7 @@
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/time/time.h"
+#include "ui/gfx/gpu_fence.h"
#include "ui/gfx/gpu_fence_handle.h"
#include "ui/gl/gl_surface_egl.h"
@@ -77,41 +78,8 @@ base::TimeTicks GLFenceAndroidNativeFenceSync::GetStatusChangeTime() {
base::ScopedFD scoped_fd(sync_fd);
base::TimeTicks time;
- GetStatusChangeTimeForFence(sync_fd, &time);
+ gfx::GpuFence::GetStatusChangeTime(sync_fd, &time);
return time;
}
-// static
-GLFenceAndroidNativeFenceSync::Status
-GLFenceAndroidNativeFenceSync::GetStatusChangeTimeForFence(
- int fd,
- base::TimeTicks* time) {
- DCHECK_NE(fd, -1);
-
- auto info =
- std::unique_ptr<sync_fence_info_data, void (*)(sync_fence_info_data*)>{
- sync_fence_info(fd), sync_fence_info_free};
- if (!info) {
- LOG(ERROR) << "sync_fence_info returned null for fd : " << fd;
- return Status::kInvalid;
- }
-
- const bool signaled = info->status == 1;
- if (!signaled)
- return Status::kNotSignaled;
-
- struct sync_pt_info* pt_info = nullptr;
- uint64_t timestamp_ns = 0u;
- while ((pt_info = sync_pt_info(info.get(), pt_info)))
- timestamp_ns = std::max(timestamp_ns, pt_info->timestamp_ns);
-
- if (timestamp_ns == 0u) {
- LOG(ERROR) << "No timestamp provided from sync_pt_info for fd : " << fd;
- return Status::kInvalid;
- }
-
- *time = base::TimeTicks() + base::TimeDelta::FromNanoseconds(timestamp_ns);
- return Status::kSignaled;
-}
-
} // namespace gl
diff --git a/chromium/ui/gl/gl_fence_android_native_fence_sync.h b/chromium/ui/gl/gl_fence_android_native_fence_sync.h
index ee083074684..a271beefde3 100644
--- a/chromium/ui/gl/gl_fence_android_native_fence_sync.h
+++ b/chromium/ui/gl/gl_fence_android_native_fence_sync.h
@@ -28,9 +28,6 @@ class GL_EXPORT GLFenceAndroidNativeFenceSync : public GLFenceEGL {
// TimeTicks will be returned in that case.
base::TimeTicks GetStatusChangeTime();
- enum Status { kSignaled, kNotSignaled, kInvalid };
- static Status GetStatusChangeTimeForFence(int fd, base::TimeTicks* time);
-
private:
GLFenceAndroidNativeFenceSync();
static std::unique_ptr<GLFenceAndroidNativeFenceSync> CreateInternal(
diff --git a/chromium/ui/gl/gl_gl_api_implementation.cc b/chromium/ui/gl/gl_gl_api_implementation.cc
index b2f8fbf596d..aa43cde2ffb 100644
--- a/chromium/ui/gl/gl_gl_api_implementation.cc
+++ b/chromium/ui/gl/gl_gl_api_implementation.cc
@@ -247,9 +247,7 @@ GLApi::GLApi() {
GLApi::~GLApi() {
}
-GLApiBase::GLApiBase()
- : driver_(NULL) {
-}
+GLApiBase::GLApiBase() : driver_(nullptr) {}
GLApiBase::~GLApiBase() {
}
diff --git a/chromium/ui/gl/gl_image_ahardwarebuffer.cc b/chromium/ui/gl/gl_image_ahardwarebuffer.cc
index a07f2882f2c..93c0e1aee9c 100644
--- a/chromium/ui/gl/gl_image_ahardwarebuffer.cc
+++ b/chromium/ui/gl/gl_image_ahardwarebuffer.cc
@@ -61,7 +61,10 @@ class GLImageAHardwareBuffer::ScopedHardwareBufferFenceSyncImpl
ScopedHardwareBufferFenceSyncImpl(
scoped_refptr<GLImageAHardwareBuffer> image,
base::android::ScopedHardwareBufferHandle handle)
- : ScopedHardwareBufferFenceSync(std::move(handle), base::ScopedFD()),
+ : ScopedHardwareBufferFenceSync(std::move(handle),
+ base::ScopedFD(),
+ base::ScopedFD(),
+ false /* is_video */),
image_(std::move(image)) {}
~ScopedHardwareBufferFenceSyncImpl() override = default;
diff --git a/chromium/ui/gl/gl_image_io_surface_egl.mm b/chromium/ui/gl/gl_image_io_surface_egl.mm
index f89f115876e..38ba2029b04 100644
--- a/chromium/ui/gl/gl_image_io_surface_egl.mm
+++ b/chromium/ui/gl/gl_image_io_surface_egl.mm
@@ -182,8 +182,10 @@ bool GLImageIOSurfaceEGL::BindTexImageImpl(unsigned target,
// DrawingBuffer::SetupRGBEmulationForBlitFramebuffer to bind an RGBA
// IOSurface as RGB. We should support this.
- if (texture_bound_)
+ if (texture_bound_) {
+ LOG(ERROR) << "Cannot re-bind already bound IOSurface.";
return false;
+ }
GLenum target_getter = TargetGetterFromGLTarget(target);
EGLint target_egl = EGLTargetFromGLTarget(target);
diff --git a/chromium/ui/gl/gl_image_memory.cc b/chromium/ui/gl/gl_image_memory.cc
index 433dae32f13..2a5849f9c82 100644
--- a/chromium/ui/gl/gl_image_memory.cc
+++ b/chromium/ui/gl/gl_image_memory.cc
@@ -12,7 +12,7 @@
#include "base/numerics/safe_conversions.h"
#include "base/synchronization/waitable_event.h"
#include "base/system/sys_info.h"
-#include "base/task/post_task.h"
+#include "base/task/thread_pool.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "ui/gfx/buffer_format_util.h"
@@ -383,8 +383,9 @@ bool GLImageMemory::CopyTexImage(unsigned target) {
memcpy_tasks_, base::BindOnce(&base::WaitableEvent::Signal,
base::Unretained(&event)));
for (int i = 1; i < memcpy_tasks_; ++i) {
- base::PostTask(FROM_HERE, base::BindOnce(&MemcpyTask, src, dst, size, i,
- memcpy_tasks_, &barrier));
+ base::ThreadPool::PostTask(
+ FROM_HERE, base::BindOnce(&MemcpyTask, src, dst, size, i,
+ memcpy_tasks_, &barrier));
}
MemcpyTask(src, dst, size, 0, memcpy_tasks_, &barrier);
event.Wait();
diff --git a/chromium/ui/gl/gl_implementation_wrapper.h b/chromium/ui/gl/gl_implementation_wrapper.h
index ce8dd5d204c..d4656b0e7ae 100644
--- a/chromium/ui/gl/gl_implementation_wrapper.h
+++ b/chromium/ui/gl/gl_implementation_wrapper.h
@@ -8,7 +8,6 @@
#include <memory>
#include "base/command_line.h"
-#include "base/logging.h"
#include "ui/gl/gl_switches.h"
#define GL_IMPL_WRAPPER_TYPE(name) \
diff --git a/chromium/ui/gl/gl_mock.h b/chromium/ui/gl/gl_mock.h
index 1049ebae2f8..7669731688e 100644
--- a/chromium/ui/gl/gl_mock.h
+++ b/chromium/ui/gl/gl_mock.h
@@ -9,6 +9,7 @@
#ifndef UI_GL_GL_MOCK_H_
#define UI_GL_GL_MOCK_H_
+#include "base/notreached.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "ui/gl/gl_bindings.h"
diff --git a/chromium/ui/gl/gl_mock_autogen_egl.h b/chromium/ui/gl/gl_mock_autogen_egl.h
index ba2f95f308b..07dbdb2d1a6 100644
--- a/chromium/ui/gl/gl_mock_autogen_egl.h
+++ b/chromium/ui/gl/gl_mock_autogen_egl.h
@@ -149,6 +149,7 @@ MOCK_METHOD5(GetSyncValuesCHROMIUM,
EGLuint64CHROMIUM* ust,
EGLuint64CHROMIUM* msc,
EGLuint64CHROMIUM* sbc));
+MOCK_METHOD1(HandleGPUSwitchANGLE, void(EGLDisplay dpy));
MOCK_METHOD3(ImageFlushExternalEXT,
EGLBoolean(EGLDisplay dpy,
EGLImageKHR image,
@@ -210,6 +211,8 @@ MOCK_METHOD4(QuerySurfacePointerANGLE,
EGLSurface surface,
EGLint attribute,
void** value));
+MOCK_METHOD2(ReacquireHighPowerGPUANGLE, void(EGLDisplay dpy, EGLContext ctx));
+MOCK_METHOD2(ReleaseHighPowerGPUANGLE, void(EGLDisplay dpy, EGLContext ctx));
MOCK_METHOD3(ReleaseTexImage,
EGLBoolean(EGLDisplay dpy, EGLSurface surface, EGLint buffer));
MOCK_METHOD0(ReleaseThread, EGLBoolean());
diff --git a/chromium/ui/gl/gl_mock_autogen_gl.h b/chromium/ui/gl/gl_mock_autogen_gl.h
index 23861cae559..c92ea02d6b7 100644
--- a/chromium/ui/gl/gl_mock_autogen_gl.h
+++ b/chromium/ui/gl/gl_mock_autogen_gl.h
@@ -58,11 +58,21 @@ MOCK_METHOD0(BlendBarrierKHR, void());
MOCK_METHOD4(BlendColor,
void(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha));
MOCK_METHOD1(BlendEquation, void(GLenum mode));
+MOCK_METHOD2(BlendEquationiOES, void(GLuint buf, GLenum mode));
MOCK_METHOD2(BlendEquationSeparate, void(GLenum modeRGB, GLenum modeAlpha));
+MOCK_METHOD3(BlendEquationSeparateiOES,
+ void(GLuint buf, GLenum modeRGB, GLenum modeAlpha));
MOCK_METHOD2(BlendFunc, void(GLenum sfactor, GLenum dfactor));
+MOCK_METHOD3(BlendFunciOES, void(GLuint buf, GLenum sfactor, GLenum dfactor));
MOCK_METHOD4(
BlendFuncSeparate,
void(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha));
+MOCK_METHOD5(BlendFuncSeparateiOES,
+ void(GLuint buf,
+ GLenum srcRGB,
+ GLenum dstRGB,
+ GLenum srcAlpha,
+ GLenum dstAlpha));
MOCK_METHOD10(BlitFramebuffer,
void(GLint srcX0,
GLint srcY0,
@@ -111,6 +121,12 @@ MOCK_METHOD3(ClientWaitSyncAPPLE,
MOCK_METHOD4(
ColorMask,
void(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha));
+MOCK_METHOD5(ColorMaskiOES,
+ void(GLuint buf,
+ GLboolean red,
+ GLboolean green,
+ GLboolean blue,
+ GLboolean alpha));
MOCK_METHOD1(CompileShader, void(GLuint shader));
MOCK_METHOD8(CompressedTexImage2D,
void(GLenum target,
@@ -293,6 +309,7 @@ MOCK_METHOD2(DepthRangef, void(GLclampf zNear, GLclampf zFar));
MOCK_METHOD2(DetachShader, void(GLuint program, GLuint shader));
MOCK_METHOD1(Disable, void(GLenum cap));
MOCK_METHOD1(DisableExtensionANGLE, void(const char* name));
+MOCK_METHOD2(DisableiOES, void(GLenum target, GLuint index));
MOCK_METHOD1(DisableVertexAttribArray, void(GLuint index));
MOCK_METHOD3(DiscardFramebufferEXT,
void(GLenum target,
@@ -344,6 +361,7 @@ MOCK_METHOD2(EGLImageTargetRenderbufferStorageOES,
MOCK_METHOD2(EGLImageTargetTexture2DOES,
void(GLenum target, GLeglImageOES image));
MOCK_METHOD1(Enable, void(GLenum cap));
+MOCK_METHOD2(EnableiOES, void(GLenum target, GLuint index));
MOCK_METHOD1(EnableVertexAttribArray, void(GLuint index));
MOCK_METHOD1(EndQuery, void(GLenum target));
MOCK_METHOD1(EndTilingQCOM, void(GLbitfield preserveMask));
@@ -900,6 +918,7 @@ MOCK_METHOD7(InvalidateSubFramebuffer,
MOCK_METHOD1(InvalidateTextureANGLE, void(GLenum target));
MOCK_METHOD1(IsBuffer, GLboolean(GLuint buffer));
MOCK_METHOD1(IsEnabled, GLboolean(GLenum cap));
+MOCK_METHOD2(IsEnablediOES, GLboolean(GLenum target, GLuint index));
MOCK_METHOD1(IsFenceAPPLE, GLboolean(GLuint fence));
MOCK_METHOD1(IsFenceNV, GLboolean(GLuint fence));
MOCK_METHOD1(IsFramebufferEXT, GLboolean(GLuint framebuffer));
@@ -976,6 +995,7 @@ MOCK_METHOD4(
void(GLenum identifier, GLuint name, GLsizei length, const char* label));
MOCK_METHOD3(ObjectPtrLabel,
void(void* ptr, GLsizei length, const char* label));
+MOCK_METHOD2(PatchParameteri, void(GLenum pname, GLint value));
MOCK_METHOD6(PathCommandsNV,
void(GLuint path,
GLsizei numCommands,
diff --git a/chromium/ui/gl/gl_share_group.h b/chromium/ui/gl/gl_share_group.h
index 3a5c6220418..d3f606d7f4a 100644
--- a/chromium/ui/gl/gl_share_group.h
+++ b/chromium/ui/gl/gl_share_group.h
@@ -8,7 +8,6 @@
#include <set>
#include <unordered_map>
-#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "build/build_config.h"
diff --git a/chromium/ui/gl/gl_stub_autogen_gl.cc b/chromium/ui/gl/gl_stub_autogen_gl.cc
index 3fee2b30af7..95ab0007c78 100644
--- a/chromium/ui/gl/gl_stub_autogen_gl.cc
+++ b/chromium/ui/gl/gl_stub_autogen_gl.cc
@@ -126,6 +126,10 @@ GLboolean GLStubApiBase::glIsEnabledFn(GLenum cap) {
return 0;
}
+GLboolean GLStubApiBase::glIsEnablediOESFn(GLenum target, GLuint index) {
+ return 0;
+}
+
GLboolean GLStubApiBase::glIsFenceAPPLEFn(GLuint fence) {
return 0;
}
diff --git a/chromium/ui/gl/gl_stub_autogen_gl.h b/chromium/ui/gl/gl_stub_autogen_gl.h
index a175caed59f..7fc5200c4ba 100644
--- a/chromium/ui/gl/gl_stub_autogen_gl.h
+++ b/chromium/ui/gl/gl_stub_autogen_gl.h
@@ -63,12 +63,22 @@ void glBlendColorFn(GLclampf red,
GLclampf blue,
GLclampf alpha) override {}
void glBlendEquationFn(GLenum mode) override {}
+void glBlendEquationiOESFn(GLuint buf, GLenum mode) override {}
void glBlendEquationSeparateFn(GLenum modeRGB, GLenum modeAlpha) override {}
+void glBlendEquationSeparateiOESFn(GLuint buf,
+ GLenum modeRGB,
+ GLenum modeAlpha) override {}
void glBlendFuncFn(GLenum sfactor, GLenum dfactor) override {}
+void glBlendFunciOESFn(GLuint buf, GLenum sfactor, GLenum dfactor) override {}
void glBlendFuncSeparateFn(GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
GLenum dstAlpha) override {}
+void glBlendFuncSeparateiOESFn(GLuint buf,
+ GLenum srcRGB,
+ GLenum dstRGB,
+ GLenum srcAlpha,
+ GLenum dstAlpha) override {}
void glBlitFramebufferFn(GLint srcX0,
GLint srcY0,
GLint srcX1,
@@ -135,6 +145,11 @@ void glColorMaskFn(GLboolean red,
GLboolean green,
GLboolean blue,
GLboolean alpha) override {}
+void glColorMaskiOESFn(GLuint buf,
+ GLboolean red,
+ GLboolean green,
+ GLboolean blue,
+ GLboolean alpha) override {}
void glCompileShaderFn(GLuint shader) override {}
void glCompressedTexImage2DFn(GLenum target,
GLint level,
@@ -334,6 +349,7 @@ void glDepthRangefFn(GLclampf zNear, GLclampf zFar) override {}
void glDetachShaderFn(GLuint program, GLuint shader) override {}
void glDisableFn(GLenum cap) override {}
void glDisableExtensionANGLEFn(const char* name) override {}
+void glDisableiOESFn(GLenum target, GLuint index) override {}
void glDisableVertexAttribArrayFn(GLuint index) override {}
void glDiscardFramebufferEXTFn(GLenum target,
GLsizei numAttachments,
@@ -386,6 +402,7 @@ void glEGLImageTargetRenderbufferStorageOESFn(GLenum target,
void glEGLImageTargetTexture2DOESFn(GLenum target,
GLeglImageOES image) override {}
void glEnableFn(GLenum cap) override {}
+void glEnableiOESFn(GLenum target, GLuint index) override {}
void glEnableVertexAttribArrayFn(GLuint index) override {}
void glEndQueryFn(GLenum target) override {}
void glEndTilingQCOMFn(GLbitfield preserveMask) override {}
@@ -921,6 +938,7 @@ void glInvalidateSubFramebufferFn(GLenum target,
void glInvalidateTextureANGLEFn(GLenum target) override {}
GLboolean glIsBufferFn(GLuint buffer) override;
GLboolean glIsEnabledFn(GLenum cap) override;
+GLboolean glIsEnablediOESFn(GLenum target, GLuint index) override;
GLboolean glIsFenceAPPLEFn(GLuint fence) override;
GLboolean glIsFenceNVFn(GLuint fence) override;
GLboolean glIsFramebufferEXTFn(GLuint framebuffer) override;
@@ -994,6 +1012,7 @@ void glObjectLabelFn(GLenum identifier,
const char* label) override {}
void glObjectPtrLabelFn(void* ptr, GLsizei length, const char* label) override {
}
+void glPatchParameteriFn(GLenum pname, GLint value) override {}
void glPathCommandsNVFn(GLuint path,
GLsizei numCommands,
const GLubyte* commands,
diff --git a/chromium/ui/gl/gl_surface.h b/chromium/ui/gl/gl_surface.h
index b150a76b0d5..44ad2952959 100644
--- a/chromium/ui/gl/gl_surface.h
+++ b/chromium/ui/gl/gl_surface.h
@@ -131,7 +131,8 @@ class GL_EXPORT GLSurface : public base::RefCounted<GLSurface>,
// progress when this callback is invoked, and the signaling of the gpu fence
// will mark the completion of the swap operation.
using SwapCompletionCallback =
- base::OnceCallback<void(gfx::SwapResult, std::unique_ptr<gfx::GpuFence>)>;
+ base::OnceCallback<void(gfx::SwapCompletionResult)>;
+
// Swaps front and back buffers. This has no effect for off-screen
// contexts. On some platforms, we want to send SwapBufferAck only after the
// surface is displayed on screen. The callback can be used to delay sending
diff --git a/chromium/ui/gl/gl_surface_egl.cc b/chromium/ui/gl/gl_surface_egl.cc
index 07cd11466e3..beda0520c09 100644
--- a/chromium/ui/gl/gl_surface_egl.cc
+++ b/chromium/ui/gl/gl_surface_egl.cc
@@ -35,6 +35,7 @@
#include "ui/gl/gl_surface_presentation_helper.h"
#include "ui/gl/gl_surface_stub.h"
#include "ui/gl/gl_utils.h"
+#include "ui/gl/gpu_switching_manager.h"
#include "ui/gl/scoped_make_current.h"
#include "ui/gl/sync_control_vsync_provider.h"
@@ -88,6 +89,12 @@
#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_REFERENCE_ANGLE 0x320C
#endif /* EGL_ANGLE_platform_angle_d3d */
+#ifndef EGL_ANGLE_platform_angle_d3d_luid
+#define EGL_ANGLE_platform_angle_d3d_luid 1
+#define EGL_PLATFORM_ANGLE_D3D_LUID_HIGH_ANGLE 0x34A0
+#define EGL_PLATFORM_ANGLE_D3D_LUID_LOW_ANGLE 0x34A1
+#endif /* EGL_ANGLE_platform_angle_d3d_luid */
+
#ifndef EGL_ANGLE_platform_angle_d3d11on12
#define EGL_ANGLE_platform_angle_d3d11on12 1
#define EGL_PLATFORM_ANGLE_D3D11ON12_ANGLE 0x3488
@@ -160,6 +167,8 @@ bool GLSurfaceEGL::initialized_ = false;
namespace {
+class EGLGpuSwitchingObserver;
+
EGLDisplay g_egl_display = EGL_NO_DISPLAY;
EGLDisplayPlatform g_native_display(EGL_DEFAULT_DISPLAY);
@@ -184,6 +193,7 @@ bool g_egl_android_native_fence_sync_supported = false;
bool g_egl_ext_pixel_format_float_supported = false;
bool g_egl_angle_feature_control_supported = false;
bool g_egl_angle_power_preference_supported = false;
+EGLGpuSwitchingObserver* g_egl_gpu_switching_observer = nullptr;
constexpr const char kSwapEventTraceCategories[] = "gpu";
@@ -248,6 +258,14 @@ class EGLSyncControlVSyncProvider : public SyncControlVSyncProvider {
DISALLOW_COPY_AND_ASSIGN(EGLSyncControlVSyncProvider);
};
+class EGLGpuSwitchingObserver final : public ui::GpuSwitchingObserver {
+ public:
+ void OnGpuSwitched(gl::GpuPreference active_gpu_heuristic) override {
+ DCHECK(GLSurfaceEGL::IsANGLEPowerPreferenceSupported());
+ eglHandleGPUSwitchANGLE(g_egl_display);
+ }
+};
+
std::vector<const char*> GetAttribArrayFromStringVector(
const std::vector<std::string>& strings) {
std::vector<const char*> attribs;
@@ -277,6 +295,30 @@ EGLDisplay GetPlatformANGLEDisplay(
display_attribs.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE);
display_attribs.push_back(static_cast<EGLAttrib>(platform_type));
+ if (platform_type == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) {
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ if (command_line->HasSwitch(switches::kUseAdapterLuid)) {
+ // If the LUID is specified, the format is <high part>,<low part>. Split
+ // and add them to the EGL_ANGLE_platform_angle_d3d_luid ext attributes.
+ std::string luid =
+ command_line->GetSwitchValueASCII(switches::kUseAdapterLuid);
+ size_t comma = luid.find(',');
+ if (comma != std::string::npos) {
+ int32_t high;
+ uint32_t low;
+ if (!base::StringToInt(luid.substr(0, comma), &high) ||
+ !base::StringToUint(luid.substr(comma + 1), &low))
+ return EGL_NO_DISPLAY;
+
+ display_attribs.push_back(EGL_PLATFORM_ANGLE_D3D_LUID_HIGH_ANGLE);
+ display_attribs.push_back(high);
+
+ display_attribs.push_back(EGL_PLATFORM_ANGLE_D3D_LUID_LOW_ANGLE);
+ display_attribs.push_back(low);
+ }
+ }
+ }
+
GLDisplayEglUtil::GetInstance()->GetPlatformExtraDisplayAttribs(
platform_type, &display_attribs);
@@ -963,6 +1005,12 @@ bool GLSurfaceEGL::InitializeOneOffCommon() {
g_egl_angle_power_preference_supported =
HasEGLExtension("EGL_ANGLE_power_preference");
+ if (g_egl_angle_power_preference_supported) {
+ g_egl_gpu_switching_observer = new EGLGpuSwitchingObserver();
+ ui::GpuSwitchingManager::GetInstance()->AddObserver(
+ g_egl_gpu_switching_observer);
+ }
+
initialized_ = true;
return true;
}
@@ -979,6 +1027,13 @@ bool GLSurfaceEGL::InitializeExtensionSettingsOneOff() {
// static
void GLSurfaceEGL::ShutdownOneOff() {
+ if (g_egl_gpu_switching_observer) {
+ ui::GpuSwitchingManager::GetInstance()->RemoveObserver(
+ g_egl_gpu_switching_observer);
+ delete g_egl_gpu_switching_observer;
+ g_egl_gpu_switching_observer = nullptr;
+ }
+
angle::ResetPlatform(g_egl_display);
if (g_egl_display != EGL_NO_DISPLAY) {
diff --git a/chromium/ui/gl/gl_surface_egl_surface_control.cc b/chromium/ui/gl/gl_surface_egl_surface_control.cc
index b07b18a93e6..cf43491e721 100644
--- a/chromium/ui/gl/gl_surface_egl_surface_control.cc
+++ b/chromium/ui/gl/gl_surface_egl_surface_control.cc
@@ -10,6 +10,7 @@
#include "base/android/build_info.h"
#include "base/android/scoped_hardware_buffer_fence_sync.h"
#include "base/bind.h"
+#include "base/posix/eintr_wrapper.h"
#include "base/strings/strcat.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
@@ -39,6 +40,18 @@ std::string BuildSurfaceName(const char* suffix) {
{base::android::BuildInfo::GetInstance()->package_name(), "/", suffix});
}
+base::TimeTicks GetSignalTime(const base::ScopedFD& fence) {
+ if (!fence.is_valid())
+ return base::TimeTicks();
+
+ base::TimeTicks signal_time;
+ auto status = gfx::GpuFence::GetStatusChangeTime(fence.get(), &signal_time);
+ if (status != gfx::GpuFence::kSignaled)
+ return base::TimeTicks();
+
+ return signal_time;
+}
+
} // namespace
GLSurfaceEGLSurfaceControl::GLSurfaceEGLSurfaceControl(
@@ -187,7 +200,8 @@ void GLSurfaceEGLSurfaceControl::CommitPendingTransaction(
LOG(ERROR) << "CommitPendingTransaction failed because surface is lost";
surface_lost_ = true;
- std::move(completion_callback).Run(gfx::SwapResult::SWAP_FAILED, nullptr);
+ std::move(completion_callback)
+ .Run(gfx::SwapCompletionResult(gfx::SwapResult::SWAP_FAILED));
std::move(present_callback).Run(gfx::PresentationFeedback::Failure());
return;
}
@@ -232,7 +246,9 @@ void GLSurfaceEGLSurfaceControl::CommitPendingTransaction(
SurfaceControl::Transaction::OnCompleteCb callback = base::BindOnce(
&GLSurfaceEGLSurfaceControl::OnTransactionAckOnGpuThread,
weak_factory_.GetWeakPtr(), std::move(completion_callback),
- std::move(present_callback), std::move(resources_to_release));
+ std::move(present_callback), std::move(resources_to_release),
+ std::move(primary_plane_fences_));
+ primary_plane_fences_.reset();
pending_transaction_->SetOnCompleteCb(std::move(callback), gpu_task_runner_);
// Cache only those surfaces which were used in this transaction. The surfaces
@@ -299,10 +315,20 @@ bool GLSurfaceEGLSurfaceControl::ScheduleOverlayPlane(
AHardwareBuffer* hardware_buffer = nullptr;
base::ScopedFD fence_fd;
auto scoped_hardware_buffer = image->GetAHardwareBuffer();
+ bool is_primary_plane = false;
if (scoped_hardware_buffer) {
hardware_buffer = scoped_hardware_buffer->buffer();
fence_fd = scoped_hardware_buffer->TakeFence();
+ // We currently only promote the display compositor's buffer or a video
+ // buffer to an overlay. So if this buffer is not for video then it implies
+ // its the primary plane.
+ is_primary_plane = !scoped_hardware_buffer->is_video();
+ DCHECK(!is_primary_plane || !primary_plane_fences_);
+ primary_plane_fences_.emplace();
+ primary_plane_fences_->available_fence =
+ scoped_hardware_buffer->TakeAvailableFence();
+
auto* a_surface = surface_state.surface->surface();
DCHECK_EQ(pending_frame_resources_.count(a_surface), 0u);
@@ -324,6 +350,11 @@ bool GLSurfaceEGLSurfaceControl::ScheduleOverlayPlane(
base::ScopedFD(fence_handle.native_fd.fd));
}
+ if (is_primary_plane) {
+ primary_plane_fences_->ready_fence =
+ base::ScopedFD(HANDLE_EINTR(dup(fence_fd.get())));
+ }
+
pending_transaction_->SetBuffer(*surface_state.surface,
surface_state.hardware_buffer,
std::move(fence_fd));
@@ -411,6 +442,7 @@ void GLSurfaceEGLSurfaceControl::OnTransactionAckOnGpuThread(
SwapCompletionCallback completion_callback,
PresentationCallback presentation_callback,
ResourceRefs released_resources,
+ base::Optional<PrimaryPlaneFences> primary_plane_fences,
SurfaceControl::TransactionStats transaction_stats) {
TRACE_EVENT0("gpu",
"GLSurfaceEGLSurfaceControl::OnTransactionAckOnGpuThread");
@@ -448,9 +480,15 @@ void GLSurfaceEGLSurfaceControl::OnTransactionAckOnGpuThread(
released_resources.clear();
// The presentation feedback callback must run after swap completion.
- std::move(completion_callback).Run(gfx::SwapResult::SWAP_ACK, nullptr);
+ std::move(completion_callback)
+ .Run(gfx::SwapCompletionResult(gfx::SwapResult::SWAP_ACK));
PendingPresentationCallback pending_cb;
+ if (primary_plane_fences) {
+ pending_cb.available_time =
+ GetSignalTime(primary_plane_fences->available_fence);
+ pending_cb.ready_time = GetSignalTime(primary_plane_fences->ready_fence);
+ }
pending_cb.latch_time = transaction_stats.latch_time;
pending_cb.present_fence = std::move(transaction_stats.present_fence);
pending_cb.callback = std::move(presentation_callback);
@@ -474,17 +512,16 @@ void GLSurfaceEGLSurfaceControl::CheckPendingPresentationCallbacks() {
auto& pending_cb = pending_presentation_callback_queue_.front();
base::TimeTicks signal_time;
- auto status =
- pending_cb.present_fence.is_valid()
- ? GLFenceAndroidNativeFenceSync::GetStatusChangeTimeForFence(
- pending_cb.present_fence.get(), &signal_time)
- : GLFenceAndroidNativeFenceSync::kInvalid;
- if (status == GLFenceAndroidNativeFenceSync::kNotSignaled)
+ auto status = pending_cb.present_fence.is_valid()
+ ? gfx::GpuFence::GetStatusChangeTime(
+ pending_cb.present_fence.get(), &signal_time)
+ : gfx::GpuFence::kInvalid;
+ if (status == gfx::GpuFence::kNotSignaled)
break;
auto flags = gfx::PresentationFeedback::kHWCompletion |
gfx::PresentationFeedback::kVSync;
- if (status == GLFenceAndroidNativeFenceSync::kInvalid) {
+ if (status == gfx::GpuFence::kInvalid) {
signal_time = pending_cb.latch_time;
flags = 0u;
}
@@ -495,6 +532,10 @@ void GLSurfaceEGLSurfaceControl::CheckPendingPresentationCallbacks() {
"presentation_feedback",
TRACE_EVENT_SCOPE_THREAD);
gfx::PresentationFeedback feedback(signal_time, base::TimeDelta(), flags);
+ feedback.available_timestamp = pending_cb.available_time;
+ feedback.ready_timestamp = pending_cb.ready_time;
+ feedback.latch_timestamp = pending_cb.latch_time;
+
std::move(pending_cb.callback).Run(feedback);
pending_presentation_callback_queue_.pop();
}
@@ -591,4 +632,12 @@ GLSurfaceEGLSurfaceControl::PendingPresentationCallback&
GLSurfaceEGLSurfaceControl::PendingPresentationCallback::operator=(
PendingPresentationCallback&& other) = default;
+GLSurfaceEGLSurfaceControl::PrimaryPlaneFences::PrimaryPlaneFences() = default;
+GLSurfaceEGLSurfaceControl::PrimaryPlaneFences::~PrimaryPlaneFences() = default;
+GLSurfaceEGLSurfaceControl::PrimaryPlaneFences::PrimaryPlaneFences(
+ PrimaryPlaneFences&& other) = default;
+GLSurfaceEGLSurfaceControl::PrimaryPlaneFences&
+GLSurfaceEGLSurfaceControl::PrimaryPlaneFences::operator=(
+ PrimaryPlaneFences&& other) = default;
+
} // 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 425e679e3bd..a82390e3df3 100644
--- a/chromium/ui/gl/gl_surface_egl_surface_control.h
+++ b/chromium/ui/gl/gl_surface_egl_surface_control.h
@@ -132,11 +132,25 @@ class GL_EXPORT GLSurfaceEGLSurfaceControl : public GLSurfaceEGL {
PendingPresentationCallback(PendingPresentationCallback&& other);
PendingPresentationCallback& operator=(PendingPresentationCallback&& other);
+ base::TimeTicks available_time;
+ base::TimeTicks ready_time;
base::TimeTicks latch_time;
+
base::ScopedFD present_fence;
PresentationCallback callback;
};
+ struct PrimaryPlaneFences {
+ PrimaryPlaneFences();
+ ~PrimaryPlaneFences();
+
+ PrimaryPlaneFences(PrimaryPlaneFences&& other);
+ PrimaryPlaneFences& operator=(PrimaryPlaneFences&& other);
+
+ base::ScopedFD available_fence;
+ base::ScopedFD ready_fence;
+ };
+
void CommitPendingTransaction(const gfx::Rect& damage_rect,
SwapCompletionCallback completion_callback,
PresentationCallback callback);
@@ -147,6 +161,7 @@ class GL_EXPORT GLSurfaceEGLSurfaceControl : public GLSurfaceEGL {
SwapCompletionCallback completion_callback,
PresentationCallback presentation_callback,
ResourceRefs released_resources,
+ base::Optional<PrimaryPlaneFences> primary_plane_fences,
SurfaceControl::TransactionStats transaction_stats);
void CheckPendingPresentationCallbacks();
@@ -170,6 +185,10 @@ class GL_EXPORT GLSurfaceEGLSurfaceControl : public GLSurfaceEGL {
// transferred to the framework.
ResourceRefs pending_frame_resources_;
+ // The fences associated with the primary plane (renderer by the display
+ // compositor) for the pending frame.
+ base::Optional<PrimaryPlaneFences> primary_plane_fences_;
+
// Transactions waiting to be applied once the previous transaction is acked.
std::queue<SurfaceControl::Transaction> pending_transaction_queue_;
diff --git a/chromium/ui/gl/gl_surface_egl_x11.cc b/chromium/ui/gl/gl_surface_egl_x11.cc
index 2dd6ea790e2..55071e3ff10 100644
--- a/chromium/ui/gl/gl_surface_egl_x11.cc
+++ b/chromium/ui/gl/gl_surface_egl_x11.cc
@@ -6,6 +6,7 @@
#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/xproto.h"
#include "ui/gl/egl_util.h"
@@ -17,12 +18,12 @@ namespace {
class XrandrIntervalOnlyVSyncProvider : public gfx::VSyncProvider {
public:
explicit XrandrIntervalOnlyVSyncProvider(Display* display)
- : display_(display), interval_(base::TimeDelta::FromSeconds(1 / 60.)) {}
+ : interval_(base::TimeDelta::FromSeconds(1 / 60.)) {}
void GetVSyncParameters(UpdateVSyncCallback callback) override {
if (++calls_since_last_update_ >= kCallsBetweenUpdates) {
calls_since_last_update_ = 0;
- interval_ = ui::GetPrimaryDisplayRefreshIntervalFromXrandr(display_);
+ interval_ = ui::GetPrimaryDisplayRefreshIntervalFromXrandr();
}
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
@@ -37,7 +38,6 @@ class XrandrIntervalOnlyVSyncProvider : public gfx::VSyncProvider {
bool IsHWClock() const override { return false; }
private:
- Display* const display_ = nullptr;
base::TimeDelta interval_;
static const int kCallsBetweenUpdates = 100;
int calls_since_last_update_ = kCallsBetweenUpdates;
@@ -45,8 +45,8 @@ class XrandrIntervalOnlyVSyncProvider : public gfx::VSyncProvider {
} // namespace
-NativeViewGLSurfaceEGLX11::NativeViewGLSurfaceEGLX11(EGLNativeWindowType window)
- : NativeViewGLSurfaceEGL(window, nullptr) {}
+NativeViewGLSurfaceEGLX11::NativeViewGLSurfaceEGLX11(x11::Window window)
+ : NativeViewGLSurfaceEGL(static_cast<uint32_t>(window), nullptr) {}
bool NativeViewGLSurfaceEGLX11::Initialize(GLSurfaceFormat format) {
if (!NativeViewGLSurfaceEGL::Initialize(format))
@@ -104,7 +104,8 @@ NativeViewGLSurfaceEGLX11::CreateVsyncProviderInternal() {
return std::make_unique<XrandrIntervalOnlyVSyncProvider>(GetXNativeDisplay());
}
-bool NativeViewGLSurfaceEGLX11::DispatchXEvent(XEvent* x_event) {
+bool NativeViewGLSurfaceEGLX11::DispatchXEvent(x11::Event* x11_event) {
+ XEvent* x_event = &x11_event->xlib_event();
// When ANGLE is used for EGL, it creates an X11 child window. Expose events
// from this window need to be forwarded to this class.
bool can_dispatch =
diff --git a/chromium/ui/gl/gl_surface_egl_x11.h b/chromium/ui/gl/gl_surface_egl_x11.h
index e16ef3f7ff1..01dbe8d332e 100644
--- a/chromium/ui/gl/gl_surface_egl_x11.h
+++ b/chromium/ui/gl/gl_surface_egl_x11.h
@@ -12,6 +12,7 @@
#include "base/macros.h"
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/gfx/x/connection.h"
+#include "ui/gfx/x/event.h"
#include "ui/gl/gl_export.h"
#include "ui/gl/gl_surface_egl.h"
@@ -21,7 +22,7 @@ namespace gl {
class GL_EXPORT NativeViewGLSurfaceEGLX11 : public NativeViewGLSurfaceEGL,
public ui::XEventDispatcher {
public:
- explicit NativeViewGLSurfaceEGLX11(EGLNativeWindowType window);
+ explicit NativeViewGLSurfaceEGLX11(x11::Window window);
NativeViewGLSurfaceEGLX11(const NativeViewGLSurfaceEGLX11& other) = delete;
NativeViewGLSurfaceEGLX11& operator=(const NativeViewGLSurfaceEGLX11& rhs) =
delete;
@@ -41,7 +42,7 @@ class GL_EXPORT NativeViewGLSurfaceEGLX11 : public NativeViewGLSurfaceEGL,
std::unique_ptr<gfx::VSyncProvider> CreateVsyncProviderInternal() override;
// XEventDispatcher:
- bool DispatchXEvent(XEvent* xev) override;
+ bool DispatchXEvent(x11::Event* xev) override;
std::vector<x11::Window> children_;
diff --git a/chromium/ui/gl/gl_surface_egl_x11_gles2.cc b/chromium/ui/gl/gl_surface_egl_x11_gles2.cc
index 000b7fd362d..9ddce7c2dff 100644
--- a/chromium/ui/gl/gl_surface_egl_x11_gles2.cc
+++ b/chromium/ui/gl/gl_surface_egl_x11_gles2.cc
@@ -13,15 +13,16 @@ using ui::X11EventSource;
namespace gl {
NativeViewGLSurfaceEGLX11GLES2::NativeViewGLSurfaceEGLX11GLES2(
- EGLNativeWindowType window)
- : NativeViewGLSurfaceEGLX11(0), parent_window_(window) {}
+ x11::Window window)
+ : NativeViewGLSurfaceEGLX11(x11::Window::None), parent_window_(window) {}
bool NativeViewGLSurfaceEGLX11GLES2::InitializeNativeWindow() {
Display* x11_display = GetXNativeDisplay();
XWindowAttributes attributes;
- if (!XGetWindowAttributes(x11_display, parent_window_, &attributes)) {
- LOG(ERROR) << "XGetWindowAttributes failed for window " << parent_window_
- << ".";
+ if (!XGetWindowAttributes(x11_display, static_cast<uint32_t>(parent_window_),
+ &attributes)) {
+ LOG(ERROR) << "XGetWindowAttributes failed for window "
+ << static_cast<uint32_t>(parent_window_) << ".";
return false;
}
@@ -35,10 +36,11 @@ bool NativeViewGLSurfaceEGLX11GLES2::InitializeNativeWindow() {
memset(&swa, 0, sizeof(swa));
swa.background_pixmap = 0;
swa.bit_gravity = NorthWestGravity;
- window_ = XCreateWindow(x11_display, parent_window_, 0, 0, size_.width(),
- size_.height(), 0, 0 /* CopyFromParent */,
- 1 /* InputOutput */, 0 /* CopyFromParent */,
- CWBackPixmap | CWBitGravity, &swa);
+ window_ = XCreateWindow(x11_display, static_cast<uint32_t>(parent_window_), 0,
+ 0, size_.width(), size_.height(), 0,
+ static_cast<int>(x11::WindowClass::CopyFromParent),
+ static_cast<int>(x11::WindowClass::InputOutput),
+ nullptr, CWBackPixmap | CWBitGravity, &swa);
XMapWindow(x11_display, window_);
XSelectInput(x11_display, window_, ExposureMask);
XFlush(x11_display);
@@ -71,16 +73,21 @@ EGLConfig NativeViewGLSurfaceEGLX11GLES2::GetConfig() {
// constrain blending precision.
const int kBufferSizeOffset = 1;
const int kAlphaSizeOffset = 3;
- EGLint config_attribs[] = {
- EGL_BUFFER_SIZE, ~0,
- EGL_ALPHA_SIZE, 8,
- EGL_BLUE_SIZE, 8,
- EGL_GREEN_SIZE, 8,
- EGL_RED_SIZE, 8,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
- EGL_NONE
- };
+ EGLint config_attribs[] = {EGL_BUFFER_SIZE,
+ ~0,
+ EGL_ALPHA_SIZE,
+ 8,
+ EGL_BLUE_SIZE,
+ 8,
+ EGL_GREEN_SIZE,
+ 8,
+ EGL_RED_SIZE,
+ 8,
+ EGL_RENDERABLE_TYPE,
+ EGL_OPENGL_ES2_BIT,
+ EGL_SURFACE_TYPE,
+ EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
+ EGL_NONE};
config_attribs[kBufferSizeOffset] = win_attribs.depth;
EGLDisplay display = GetHardwareDisplay();
@@ -137,14 +144,16 @@ bool NativeViewGLSurfaceEGLX11GLES2::Resize(const gfx::Size& size,
return true;
}
-bool NativeViewGLSurfaceEGLX11GLES2::DispatchXEvent(XEvent* xev) {
+bool NativeViewGLSurfaceEGLX11GLES2::DispatchXEvent(x11::Event* x11_event) {
+ XEvent* xev = &x11_event->xlib_event();
if (xev->type != Expose ||
xev->xexpose.window != static_cast<Window>(window_))
return false;
- xev->xexpose.window = parent_window_;
+ xev->xexpose.window = static_cast<uint32_t>(parent_window_);
Display* x11_display = GetXNativeDisplay();
- XSendEvent(x11_display, parent_window_, x11::False, ExposureMask, xev);
+ XSendEvent(x11_display, static_cast<uint32_t>(parent_window_), x11::False,
+ ExposureMask, xev);
XFlush(x11_display);
return true;
}
diff --git a/chromium/ui/gl/gl_surface_egl_x11_gles2.h b/chromium/ui/gl/gl_surface_egl_x11_gles2.h
index ac4f26c534b..f52ddddb3b9 100644
--- a/chromium/ui/gl/gl_surface_egl_x11_gles2.h
+++ b/chromium/ui/gl/gl_surface_egl_x11_gles2.h
@@ -10,6 +10,7 @@
#include <string>
#include "base/macros.h"
+#include "ui/gfx/x/event.h"
#include "ui/gl/gl_export.h"
#include "ui/gl/gl_surface_egl_x11.h"
@@ -19,7 +20,7 @@ namespace gl {
class GL_EXPORT NativeViewGLSurfaceEGLX11GLES2
: public NativeViewGLSurfaceEGLX11 {
public:
- explicit NativeViewGLSurfaceEGLX11GLES2(EGLNativeWindowType window);
+ explicit NativeViewGLSurfaceEGLX11GLES2(x11::Window window);
// NativeViewGLSurfaceEGL overrides.
EGLConfig GetConfig() override;
@@ -35,9 +36,9 @@ class GL_EXPORT NativeViewGLSurfaceEGLX11GLES2
private:
// XEventDispatcher:
- bool DispatchXEvent(XEvent* xev) override;
+ bool DispatchXEvent(x11::Event* xev) override;
- EGLNativeWindowType parent_window_;
+ x11::Window parent_window_;
DISALLOW_COPY_AND_ASSIGN(NativeViewGLSurfaceEGLX11GLES2);
};
diff --git a/chromium/ui/gl/gl_surface_glx.cc b/chromium/ui/gl/gl_surface_glx.cc
index 09a91304794..cbb7513809d 100644
--- a/chromium/ui/gl/gl_surface_glx.cc
+++ b/chromium/ui/gl/gl_surface_glx.cc
@@ -25,6 +25,7 @@
#include "ui/base/x/x11_display_util.h"
#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/x11.h"
#include "ui/gfx/x/x11_types.h"
#include "ui/gl/gl_bindings.h"
@@ -55,12 +56,12 @@ bool g_glx_sgi_video_sync_supported = false;
// A 24-bit RGB visual and colormap to use when creating offscreen surfaces.
Visual* g_visual = nullptr;
-int g_depth = CopyFromParent;
-Colormap g_colormap = CopyFromParent;
+int g_depth = static_cast<int>(x11::WindowClass::CopyFromParent);
+Colormap g_colormap = static_cast<int>(x11::WindowClass::CopyFromParent);
GLXFBConfig GetConfigForWindow(Display* display,
gfx::AcceleratedWidget window) {
- DCHECK(window != 0);
+ DCHECK(window != gfx::kNullAcceleratedWidget);
// This code path is expensive, but we only take it when
// attempting to use GLX_ARB_create_context_robustness, in which
@@ -75,8 +76,10 @@ GLXFBConfig GetConfigForWindow(Display* display,
// it.
XWindowAttributes attributes;
- if (!XGetWindowAttributes(display, window, &attributes)) {
- LOG(ERROR) << "XGetWindowAttributes failed for window " << window << ".";
+ if (!XGetWindowAttributes(display, static_cast<uint32_t>(window),
+ &attributes)) {
+ LOG(ERROR) << "XGetWindowAttributes failed for window "
+ << static_cast<uint32_t>(window) << ".";
return nullptr;
}
@@ -115,29 +118,31 @@ GLXFBConfig GetConfigForWindow(Display* display,
bool CreateDummyWindow(Display* display) {
DCHECK(display);
- gfx::AcceleratedWidget parent_window =
- XRootWindow(display, DefaultScreen(display));
- gfx::AcceleratedWidget window =
- XCreateWindow(display, parent_window, 0, 0, 1, 1, 0, CopyFromParent,
- InputOutput, CopyFromParent, 0, nullptr);
- if (!window) {
+ auto parent_window = ui::GetX11RootWindow();
+ gfx::AcceleratedWidget window = static_cast<gfx::AcceleratedWidget>(
+ XCreateWindow(display, static_cast<uint32_t>(parent_window), 0, 0, 1, 1,
+ 0, static_cast<int>(x11::WindowClass::CopyFromParent),
+ static_cast<int>(x11::WindowClass::InputOutput), nullptr, 0,
+ nullptr));
+ if (window == gfx::kNullAcceleratedWidget) {
LOG(ERROR) << "XCreateWindow failed";
return false;
}
GLXFBConfig config = GetConfigForWindow(display, window);
if (!config) {
LOG(ERROR) << "Failed to get GLXConfig";
- XDestroyWindow(display, window);
+ XDestroyWindow(display, static_cast<uint32_t>(window));
return false;
}
- GLXWindow glx_window = glXCreateWindow(display, config, window, nullptr);
+ GLXWindow glx_window =
+ glXCreateWindow(display, config, static_cast<uint32_t>(window), nullptr);
if (!glx_window) {
LOG(ERROR) << "glXCreateWindow failed";
- XDestroyWindow(display, window);
+ XDestroyWindow(display, static_cast<uint32_t>(window));
return false;
}
glXDestroyWindow(display, glx_window);
- XDestroyWindow(display, window);
+ XDestroyWindow(display, static_cast<uint32_t>(window));
return true;
}
@@ -146,7 +151,7 @@ class OMLSyncControlVSyncProvider : public SyncControlVSyncProvider {
explicit OMLSyncControlVSyncProvider(GLXWindow glx_window)
: SyncControlVSyncProvider(), glx_window_(glx_window) {}
- ~OMLSyncControlVSyncProvider() override {}
+ ~OMLSyncControlVSyncProvider() override = default;
protected:
bool GetSyncValues(int64_t* system_time,
@@ -249,7 +254,7 @@ class SGIVideoSyncThread : public base::Thread,
}
static SGIVideoSyncThread* g_video_sync_thread;
- GLXContext context_ = 0;
+ GLXContext context_ = nullptr;
THREAD_CHECKER(thread_checker_);
@@ -262,7 +267,7 @@ class SGIVideoSyncProviderThreadShim {
SGIVideoSyncThread* vsync_thread)
: parent_window_(parent_window),
vsync_thread_(vsync_thread),
- window_(0),
+ window_(gfx::kNullAcceleratedWidget),
glx_window_(0),
task_runner_(base::ThreadTaskRunnerHandle::Get()),
cancel_vsync_flag_(),
@@ -276,8 +281,10 @@ class SGIVideoSyncProviderThreadShim {
if (glx_window_)
glXDestroyWindow(vsync_thread_->GetDisplay(), glx_window_);
- if (window_)
- XDestroyWindow(vsync_thread_->GetDisplay(), window_);
+ if (window_ != gfx::kNullAcceleratedWidget) {
+ XDestroyWindow(vsync_thread_->GetDisplay(),
+ static_cast<uint32_t>(window_));
+ }
}
base::AtomicFlag* cancel_vsync_flag() { return &cancel_vsync_flag_; }
@@ -287,10 +294,11 @@ class SGIVideoSyncProviderThreadShim {
void Initialize() {
DCHECK(vsync_thread_->GetDisplay());
- window_ = XCreateWindow(vsync_thread_->GetDisplay(), parent_window_, 0, 0,
- 1, 1, 0, CopyFromParent, InputOutput,
- CopyFromParent, 0, nullptr);
- if (!window_) {
+ window_ = static_cast<gfx::AcceleratedWidget>(XCreateWindow(
+ vsync_thread_->GetDisplay(), static_cast<uint32_t>(parent_window_), 0,
+ 0, 1, 1, 0, static_cast<int>(x11::WindowClass::CopyFromParent),
+ static_cast<int>(x11::WindowClass::InputOutput), nullptr, 0, nullptr));
+ if (window_ == gfx::kNullAcceleratedWidget) {
LOG(ERROR) << "video_sync: XCreateWindow failed";
return;
}
@@ -302,8 +310,8 @@ class SGIVideoSyncProviderThreadShim {
return;
}
- glx_window_ =
- glXCreateWindow(vsync_thread_->GetDisplay(), config, window_, nullptr);
+ glx_window_ = glXCreateWindow(vsync_thread_->GetDisplay(), config,
+ static_cast<uint32_t>(window_), nullptr);
if (!glx_window_) {
LOG(ERROR) << "video_sync: glXCreateWindow failed";
return;
@@ -319,8 +327,7 @@ class SGIVideoSyncProviderThreadShim {
if (!vsync_thread_->GetGLXContext() || cancel_vsync_flag_.IsSet())
return;
- base::TimeDelta interval = ui::GetPrimaryDisplayRefreshIntervalFromXrandr(
- vsync_thread_->GetDisplay());
+ base::TimeDelta interval = ui::GetPrimaryDisplayRefreshIntervalFromXrandr();
glXMakeContextCurrent(vsync_thread_->GetDisplay(), glx_window_, glx_window_,
vsync_thread_->GetGLXContext());
@@ -430,7 +437,7 @@ SGIVideoSyncThread* SGIVideoSyncThread::g_video_sync_thread = nullptr;
bool GLSurfaceGLX::initialized_ = false;
-GLSurfaceGLX::GLSurfaceGLX() {}
+GLSurfaceGLX::GLSurfaceGLX() = default;
bool GLSurfaceGLX::InitializeOneOff() {
if (initialized_)
@@ -524,8 +531,8 @@ void GLSurfaceGLX::ShutdownOneOff() {
g_glx_sgi_video_sync_supported = false;
g_visual = nullptr;
- g_depth = CopyFromParent;
- g_colormap = CopyFromParent;
+ g_depth = static_cast<int>(x11::WindowClass::CopyFromParent);
+ g_colormap = static_cast<int>(x11::WindowClass::CopyFromParent);
}
// static
@@ -597,20 +604,22 @@ void* GLSurfaceGLX::GetDisplay() {
return gfx::GetXDisplay();
}
-GLSurfaceGLX::~GLSurfaceGLX() {}
+GLSurfaceGLX::~GLSurfaceGLX() = default;
NativeViewGLSurfaceGLX::NativeViewGLSurfaceGLX(gfx::AcceleratedWidget window)
: parent_window_(window),
- window_(0),
+ window_(gfx::kNullAcceleratedWidget),
glx_window_(0),
config_(nullptr),
has_swapped_buffers_(false) {}
bool NativeViewGLSurfaceGLX::Initialize(GLSurfaceFormat format) {
XWindowAttributes attributes;
- if (!XGetWindowAttributes(gfx::GetXDisplay(), parent_window_, &attributes)) {
- LOG(ERROR) << "XGetWindowAttributes failed for window " << parent_window_
- << ".";
+ if (!XGetWindowAttributes(gfx::GetXDisplay(),
+ static_cast<uint32_t>(parent_window_),
+ &attributes)) {
+ LOG(ERROR) << "XGetWindowAttributes failed for window "
+ << static_cast<uint32_t>(parent_window_) << ".";
return false;
}
size_ = gfx::Size(attributes.width, attributes.height);
@@ -635,15 +644,16 @@ bool NativeViewGLSurfaceGLX::Initialize(GLSurfaceFormat format) {
value_mask |= CWBackPixel;
}
- window_ =
- XCreateWindow(gfx::GetXDisplay(), parent_window_, 0 /* x */, 0 /* y */,
- size_.width(), size_.height(), 0 /* border_width */,
- g_depth, InputOutput, g_visual, value_mask, &swa);
- if (!window_) {
+ window_ = static_cast<gfx::AcceleratedWidget>(XCreateWindow(
+ gfx::GetXDisplay(), static_cast<uint32_t>(parent_window_), 0 /* x */,
+ 0 /* y */, size_.width(), size_.height(), 0 /* border_width */, g_depth,
+ static_cast<int>(x11::WindowClass::InputOutput), g_visual, value_mask,
+ &swa));
+ if (window_ == gfx::kNullAcceleratedWidget) {
LOG(ERROR) << "XCreateWindow failed";
return false;
}
- XMapWindow(gfx::GetXDisplay(), window_);
+ XMapWindow(gfx::GetXDisplay(), static_cast<uint32_t>(window_));
RegisterEvents();
XFlush(gfx::GetXDisplay());
@@ -653,7 +663,8 @@ bool NativeViewGLSurfaceGLX::Initialize(GLSurfaceFormat format) {
LOG(ERROR) << "Failed to get GLXConfig";
return false;
}
- glx_window_ = glXCreateWindow(gfx::GetXDisplay(), config_, window_, NULL);
+ glx_window_ = glXCreateWindow(gfx::GetXDisplay(), config_,
+ static_cast<uint32_t>(window_), nullptr);
if (!glx_window_) {
LOG(ERROR) << "glXCreateWindow failed";
return false;
@@ -694,10 +705,10 @@ void NativeViewGLSurfaceGLX::Destroy() {
glXDestroyWindow(gfx::GetXDisplay(), glx_window_);
glx_window_ = 0;
}
- if (window_) {
+ if (window_ != gfx::kNullAcceleratedWidget) {
UnregisterEvents();
- XDestroyWindow(gfx::GetXDisplay(), window_);
- window_ = 0;
+ XDestroyWindow(gfx::GetXDisplay(), static_cast<uint32_t>(window_));
+ window_ = gfx::kNullAcceleratedWidget;
XFlush(gfx::GetXDisplay());
}
}
@@ -708,7 +719,8 @@ bool NativeViewGLSurfaceGLX::Resize(const gfx::Size& size,
bool has_alpha) {
size_ = size;
glXWaitGL();
- XResizeWindow(gfx::GetXDisplay(), window_, size.width(), size.height());
+ XResizeWindow(gfx::GetXDisplay(), static_cast<uint32_t>(window_),
+ size.width(), size.height());
glXWaitX();
return true;
}
@@ -732,7 +744,8 @@ gfx::SwapResult NativeViewGLSurfaceGLX::SwapBuffers(
// XWindow associated to this surface after the first SwapBuffers has
// happened, to avoid showing a weird white background while resizing.
if (!has_swapped_buffers_) {
- XSetWindowBackgroundPixmap(display, parent_window_, 0);
+ XSetWindowBackgroundPixmap(display, static_cast<uint32_t>(parent_window_),
+ 0);
has_swapped_buffers_ = true;
}
@@ -802,15 +815,16 @@ NativeViewGLSurfaceGLX::~NativeViewGLSurfaceGLX() {
Destroy();
}
-void NativeViewGLSurfaceGLX::ForwardExposeEvent(XEvent* event) {
- XEvent forwarded_event = *event;
- forwarded_event.xexpose.window = parent_window_;
- XSendEvent(gfx::GetXDisplay(), parent_window_, x11::False, ExposureMask,
- &forwarded_event);
+void NativeViewGLSurfaceGLX::ForwardExposeEvent(x11::Event* event) {
+ XEvent& forwarded_event = event->xlib_event();
+ forwarded_event.xexpose.window = static_cast<uint32_t>(parent_window_);
+ XSendEvent(gfx::GetXDisplay(), static_cast<uint32_t>(parent_window_),
+ x11::False, ExposureMask, &forwarded_event);
XFlush(gfx::GetXDisplay());
}
-bool NativeViewGLSurfaceGLX::CanHandleEvent(XEvent* event) {
+bool NativeViewGLSurfaceGLX::CanHandleEvent(x11::Event* x11_event) {
+ XEvent* event = &x11_event->xlib_event();
return event->type == Expose &&
event->xexpose.window == static_cast<Window>(window_);
}
@@ -821,24 +835,29 @@ GLXDrawable NativeViewGLSurfaceGLX::GetDrawableHandle() const {
UnmappedNativeViewGLSurfaceGLX::UnmappedNativeViewGLSurfaceGLX(
const gfx::Size& size)
- : size_(size), config_(nullptr), window_(0), glx_window_(0) {
+ : size_(size),
+ config_(nullptr),
+ window_(gfx::kNullAcceleratedWidget),
+ glx_window_(0) {
// Ensure that we don't create a window with zero size.
if (size_.GetArea() == 0)
size_.SetSize(1, 1);
}
bool UnmappedNativeViewGLSurfaceGLX::Initialize(GLSurfaceFormat format) {
- DCHECK(!window_);
+ DCHECK_EQ(window_, gfx::kNullAcceleratedWidget);
- gfx::AcceleratedWidget parent_window = DefaultRootWindow(gfx::GetXDisplay());
+ auto parent_window = ui::GetX11RootWindow();
XSetWindowAttributes attrs;
attrs.border_pixel = 0;
attrs.colormap = g_colormap;
- window_ = XCreateWindow(
- gfx::GetXDisplay(), parent_window, 0, 0, size_.width(), size_.height(), 0,
- g_depth, InputOutput, g_visual, CWBorderPixel | CWColormap, &attrs);
- if (!window_) {
+ window_ = static_cast<gfx::AcceleratedWidget>(
+ XCreateWindow(gfx::GetXDisplay(), static_cast<uint32_t>(parent_window), 0,
+ 0, size_.width(), size_.height(), 0, g_depth,
+ static_cast<int>(x11::WindowClass::InputOutput), g_visual,
+ CWBorderPixel | CWColormap, &attrs));
+ if (window_ == gfx::kNullAcceleratedWidget) {
LOG(ERROR) << "XCreateWindow failed";
return false;
}
@@ -847,7 +866,8 @@ bool UnmappedNativeViewGLSurfaceGLX::Initialize(GLSurfaceFormat format) {
LOG(ERROR) << "Failed to get GLXConfig";
return false;
}
- glx_window_ = glXCreateWindow(gfx::GetXDisplay(), config_, window_, NULL);
+ glx_window_ = glXCreateWindow(gfx::GetXDisplay(), config_,
+ static_cast<uint32_t>(window_), nullptr);
if (!glx_window_) {
LOG(ERROR) << "glXCreateWindow failed";
return false;
@@ -861,9 +881,9 @@ void UnmappedNativeViewGLSurfaceGLX::Destroy() {
glXDestroyWindow(gfx::GetXDisplay(), glx_window_);
glx_window_ = 0;
}
- if (window_) {
- XDestroyWindow(gfx::GetXDisplay(), window_);
- window_ = 0;
+ if (window_ != gfx::kNullAcceleratedWidget) {
+ XDestroyWindow(gfx::GetXDisplay(), static_cast<uint32_t>(window_));
+ window_ = gfx::kNullAcceleratedWidget;
}
}
diff --git a/chromium/ui/gl/gl_surface_glx.h b/chromium/ui/gl/gl_surface_glx.h
index b891b7a3bcc..f09b3455ce0 100644
--- a/chromium/ui/gl/gl_surface_glx.h
+++ b/chromium/ui/gl/gl_surface_glx.h
@@ -14,6 +14,7 @@
#include "base/macros.h"
#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/gl/gl_export.h"
#include "ui/gl/gl_surface.h"
@@ -100,10 +101,10 @@ class GL_EXPORT NativeViewGLSurfaceGLX : public GLSurfaceGLX {
virtual void UnregisterEvents() = 0;
// Forwards Expose event to child window.
- void ForwardExposeEvent(XEvent* xevent);
+ void ForwardExposeEvent(x11::Event* xevent);
// Checks if event is Expose for child window.
- bool CanHandleEvent(XEvent* xevent);
+ bool CanHandleEvent(x11::Event* xevent);
gfx::AcceleratedWidget window() const { return window_; }
diff --git a/chromium/ui/gl/gl_surface_glx_x11.cc b/chromium/ui/gl/gl_surface_glx_x11.cc
index 5b45a38660c..8ec86dfc04e 100644
--- a/chromium/ui/gl/gl_surface_glx_x11.cc
+++ b/chromium/ui/gl/gl_surface_glx_x11.cc
@@ -21,7 +21,8 @@ GLSurfaceGLXX11::~GLSurfaceGLXX11() {
void GLSurfaceGLXX11::RegisterEvents() {
// Can be null in tests, when we don't care about Exposes.
if (X11EventSource::HasInstance()) {
- XSelectInput(gfx::GetXDisplay(), window(), ExposureMask);
+ XSelectInput(gfx::GetXDisplay(), static_cast<uint32_t>(window()),
+ ExposureMask);
X11EventSource::GetInstance()->AddXEventDispatcher(this);
}
}
@@ -31,7 +32,7 @@ void GLSurfaceGLXX11::UnregisterEvents() {
X11EventSource::GetInstance()->RemoveXEventDispatcher(this);
}
-bool GLSurfaceGLXX11::DispatchXEvent(XEvent* event) {
+bool GLSurfaceGLXX11::DispatchXEvent(x11::Event* event) {
if (!CanHandleEvent(event))
return false;
ForwardExposeEvent(event);
diff --git a/chromium/ui/gl/gl_surface_glx_x11.h b/chromium/ui/gl/gl_surface_glx_x11.h
index 82d09c62777..6b2a4ac5dc8 100644
--- a/chromium/ui/gl/gl_surface_glx_x11.h
+++ b/chromium/ui/gl/gl_surface_glx_x11.h
@@ -8,6 +8,7 @@
#include "base/macros.h"
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/gfx/native_widget_types.h"
+#include "ui/gfx/x/event.h"
#include "ui/gl/gl_export.h"
#include "ui/gl/gl_surface_glx.h"
@@ -28,7 +29,7 @@ class GL_EXPORT GLSurfaceGLXX11 : public NativeViewGLSurfaceGLX,
void UnregisterEvents() override;
// XEventDispatcher:
- bool DispatchXEvent(XEvent* event) override;
+ bool DispatchXEvent(x11::Event* event) override;
private:
DISALLOW_COPY_AND_ASSIGN(GLSurfaceGLXX11);
diff --git a/chromium/ui/gl/gl_surface_overlay.h b/chromium/ui/gl/gl_surface_overlay.h
index 4d174ce490f..5b7214f33b2 100644
--- a/chromium/ui/gl/gl_surface_overlay.h
+++ b/chromium/ui/gl/gl_surface_overlay.h
@@ -42,6 +42,9 @@ class GL_EXPORT GLSurfaceOverlay {
void Flush() const;
+ gfx::GpuFence* gpu_fence() const { return gpu_fence_.get(); }
+ int z_order() const { return z_order_; }
+
private:
int z_order_;
gfx::OverlayTransform transform_;
diff --git a/chromium/ui/gl/gl_surface_presentation_helper.cc b/chromium/ui/gl/gl_surface_presentation_helper.cc
index 61a745ae80a..0521b51d4ad 100644
--- a/chromium/ui/gl/gl_surface_presentation_helper.cc
+++ b/chromium/ui/gl/gl_surface_presentation_helper.cc
@@ -7,6 +7,7 @@
#include <utility>
#include "base/bind.h"
+#include "base/logging.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
#include "ui/gfx/vsync_provider.h"
diff --git a/chromium/ui/gl/gl_switches.cc b/chromium/ui/gl/gl_switches.cc
index c047cd9a82b..f50a1528af6 100644
--- a/chromium/ui/gl/gl_switches.cc
+++ b/chromium/ui/gl/gl_switches.cc
@@ -141,6 +141,10 @@ const char kEnableDirectCompositionVideoOverlays[] =
const char kDisableDirectCompositionVideoOverlays[] =
"disable-direct-composition-video-overlays";
+// Initialize the GPU process using the adapter with the specified LUID. This is
+// only used on Windows, as LUID is a Windows specific structure.
+const char kUseAdapterLuid[] = "use-adapter-luid";
+
// 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.
@@ -201,6 +205,12 @@ const base::Feature kDirectCompositionPresentationFeedback{
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",
diff --git a/chromium/ui/gl/gl_switches.h b/chromium/ui/gl/gl_switches.h
index 05df4c6e069..775c6c702c2 100644
--- a/chromium/ui/gl/gl_switches.h
+++ b/chromium/ui/gl/gl_switches.h
@@ -69,6 +69,7 @@ GL_EXPORT extern const char kEnableSwapBuffersWithBounds[];
GL_EXPORT extern const char kDisableDirectComposition[];
GL_EXPORT extern const char kEnableDirectCompositionVideoOverlays[];
GL_EXPORT extern const char kDisableDirectCompositionVideoOverlays[];
+GL_EXPORT extern const char kUseAdapterLuid[];
// These flags are used by the test harness code, not passed in by users.
GL_EXPORT extern const char kDisableGLDrawingForTests[];
@@ -87,6 +88,7 @@ GL_EXPORT extern const base::Feature kDirectCompositionNonrootOverlays;
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;
extern const base::Feature kTrackCurrentShaders;
diff --git a/chromium/ui/gl/gl_visual_picker_glx.cc b/chromium/ui/gl/gl_visual_picker_glx.cc
index d3bd21b11c5..4e836e9be78 100644
--- a/chromium/ui/gl/gl_visual_picker_glx.cc
+++ b/chromium/ui/gl/gl_visual_picker_glx.cc
@@ -133,9 +133,9 @@ XVisualInfo GLVisualPickerGLX::PickBestRgbaVisual(
auto score = [](int c_class) {
// A higher score is more preferable.
switch (c_class) {
- case TrueColor:
+ case static_cast<int>(x11::VisualClass::TrueColor):
return 1;
- case DirectColor:
+ case static_cast<int>(x11::VisualClass::DirectColor):
return 0;
default:
return -1;
diff --git a/chromium/ui/gl/init/BUILD.gn b/chromium/ui/gl/init/BUILD.gn
index 72a840d78fa..9141ba379fd 100644
--- a/chromium/ui/gl/init/BUILD.gn
+++ b/chromium/ui/gl/init/BUILD.gn
@@ -56,12 +56,36 @@ jumbo_component("init") {
]
libs = [ "OpenGL.framework" ]
- } else if (use_x11) {
+ } else if (use_ozone) {
+ sources += [
+ "gl_display_egl_util_ozone.cc",
+ "gl_display_egl_util_ozone.h",
+ "ozone_util.h",
+ ]
+ deps += [ "//ui/ozone" ]
+ }
+
+ # Allow X11 to use Ozone implementation of gl_factory and gl_initializer.
+ # This is needed temporarily to allow use_x11 && use_ozone build. Once
+ # use_x11 goes away, this will be removed. Internally, it checks whether
+ # it should use pure X11 implementation or Ozone implementation based on
+ # IsUsingOzonePlatform feature flag.
+ if (use_x11 || use_ozone) {
+ sources += [
+ "gl_factory_ozone.cc",
+ "gl_initializer_ozone.cc",
+ ]
+ deps += [ "//ui/base:features" ]
+ }
+
+ if (use_x11) {
sources += [
"gl_display_egl_util_x11.cc",
"gl_display_egl_util_x11.h",
- "gl_factory_x11.cc",
- "gl_initializer_x11.cc",
+ "gl_factory_linux_x11.cc",
+ "gl_factory_linux_x11.h",
+ "gl_initializer_linux_x11.cc",
+ "gl_initializer_linux_x11.h",
]
deps += [
@@ -69,15 +93,5 @@ jumbo_component("init") {
"//ui/base/x:gl",
"//ui/gfx/x",
]
- } else if (use_ozone) {
- sources += [
- "gl_display_egl_util_ozone.cc",
- "gl_display_egl_util_ozone.h",
- "gl_factory_ozone.cc",
- "gl_initializer_ozone.cc",
- "ozone_util.h",
- ]
-
- deps += [ "//ui/ozone" ]
}
}
diff --git a/chromium/ui/gl/init/DEPS b/chromium/ui/gl/init/DEPS
index 6b2bc9584ad..82a1175c23c 100644
--- a/chromium/ui/gl/init/DEPS
+++ b/chromium/ui/gl/init/DEPS
@@ -1,4 +1,5 @@
include_rules = [
+ "+ui/base/ui_base_features.h",
"+ui/ozone/gl",
"+ui/ozone/public",
]
diff --git a/chromium/ui/gl/init/create_gr_gl_interface.cc b/chromium/ui/gl/init/create_gr_gl_interface.cc
index d71dd24f871..cb283629719 100644
--- a/chromium/ui/gl/init/create_gr_gl_interface.cc
+++ b/chromium/ui/gl/init/create_gr_gl_interface.cc
@@ -426,6 +426,7 @@ sk_sp<GrGLInterface> CreateGrGLInterface(
// functions->fMultiDrawArraysIndirect = gl->glMultiDrawArraysIndirectFn;
// functions->fMultiDrawElementsIndirect = gl->glMultiDrawElementsIndirectFn;
+ functions->fPatchParameteri = gl->glPatchParameteriFn;
functions->fPixelStorei = gl->glPixelStoreiFn;
functions->fPolygonMode = gl->glPolygonModeFn;
functions->fProgramBinary = gl->glProgramBinaryFn;
diff --git a/chromium/ui/gl/init/gl_factory_x11.cc b/chromium/ui/gl/init/gl_factory_linux_x11.cc
index 4bebef1a31d..ed722461046 100644
--- a/chromium/ui/gl/init/gl_factory_x11.cc
+++ b/chromium/ui/gl/init/gl_factory_linux_x11.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/gl/init/gl_factory.h"
+#include "ui/gl/init/gl_factory_linux_x11.h"
#include "base/trace_event/trace_event.h"
#include "ui/gl/gl_context.h"
@@ -23,7 +23,7 @@
namespace gl {
namespace init {
-std::vector<GLImplementation> GetAllowedGLImplementations() {
+std::vector<GLImplementation> GetAllowedGLImplementationsX11() {
std::vector<GLImplementation> impls;
impls.push_back(kGLImplementationDesktopGL);
impls.push_back(kGLImplementationEGLGLES2);
@@ -32,8 +32,8 @@ std::vector<GLImplementation> GetAllowedGLImplementations() {
return impls;
}
-bool GetGLWindowSystemBindingInfo(const GLVersionInfo& gl_info,
- GLWindowSystemBindingInfo* info) {
+bool GetGLWindowSystemBindingInfoX11(const GLVersionInfo& gl_info,
+ GLWindowSystemBindingInfo* info) {
switch (GetGLImplementation()) {
case kGLImplementationDesktopGL:
return GetGLWindowSystemBindingInfoGLX(gl_info, info);
@@ -45,9 +45,9 @@ bool GetGLWindowSystemBindingInfo(const GLVersionInfo& gl_info,
}
}
-scoped_refptr<GLContext> CreateGLContext(GLShareGroup* share_group,
- GLSurface* compatible_surface,
- const GLContextAttribs& attribs) {
+scoped_refptr<GLContext> CreateGLContextX11(GLShareGroup* share_group,
+ GLSurface* compatible_surface,
+ const GLContextAttribs& attribs) {
TRACE_EVENT0("gpu", "gl::init::CreateGLContext");
switch (GetGLImplementation()) {
case kGLImplementationDesktopGL:
@@ -72,7 +72,7 @@ scoped_refptr<GLContext> CreateGLContext(GLShareGroup* share_group,
}
}
-scoped_refptr<GLSurface> CreateViewGLSurface(gfx::AcceleratedWidget window) {
+scoped_refptr<GLSurface> CreateViewGLSurfaceX11(gfx::AcceleratedWidget window) {
TRACE_EVENT0("gpu", "gl::init::CreateViewGLSurface");
switch (GetGLImplementation()) {
case kGLImplementationDesktopGL:
@@ -93,8 +93,9 @@ scoped_refptr<GLSurface> CreateViewGLSurface(gfx::AcceleratedWidget window) {
}
}
-scoped_refptr<GLSurface> CreateOffscreenGLSurfaceWithFormat(
- const gfx::Size& size, GLSurfaceFormat format) {
+scoped_refptr<GLSurface> CreateOffscreenGLSurfaceWithFormatX11(
+ const gfx::Size& size,
+ GLSurfaceFormat format) {
TRACE_EVENT0("gpu", "gl::init::CreateOffscreenGLSurface");
switch (GetGLImplementation()) {
case kGLImplementationDesktopGL:
@@ -119,7 +120,7 @@ scoped_refptr<GLSurface> CreateOffscreenGLSurfaceWithFormat(
}
}
-void SetDisabledExtensionsPlatform(const std::string& disabled_extensions) {
+void SetDisabledExtensionsPlatformX11(const std::string& disabled_extensions) {
GLImplementation implementation = GetGLImplementation();
DCHECK_NE(kGLImplementationNone, implementation);
switch (implementation) {
@@ -139,7 +140,7 @@ void SetDisabledExtensionsPlatform(const std::string& disabled_extensions) {
}
}
-bool InitializeExtensionSettingsOneOffPlatform() {
+bool InitializeExtensionSettingsOneOffPlatformX11() {
GLImplementation implementation = GetGLImplementation();
DCHECK_NE(kGLImplementationNone, implementation);
switch (implementation) {
diff --git a/chromium/ui/gl/init/gl_factory_linux_x11.h b/chromium/ui/gl/init/gl_factory_linux_x11.h
new file mode 100644
index 00000000000..ce6519ef58b
--- /dev/null
+++ b/chromium/ui/gl/init/gl_factory_linux_x11.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_GL_INIT_GL_FACTORY_LINUX_X11_H_
+#define UI_GL_INIT_GL_FACTORY_LINUX_X11_H_
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/memory/ref_counted.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/native_widget_types.h"
+#include "ui/gl/gl_implementation.h"
+#include "ui/gl/gl_surface_format.h"
+#include "ui/gl/gpu_preference.h"
+
+namespace gl {
+
+class GLContext;
+class GLShareGroup;
+class GLSurface;
+
+struct GLContextAttribs;
+struct GLVersionInfo;
+
+// Note that this is a temporary implementation for Linux/X11 GL. It is called
+// through GLFactoryOzone, and will be removed as soon as Linux/Ozone is
+// the default. Comments have been copied from gl_factory.h
+//
+// TODO(msisov): remove this once Ozone is the default on Linux.
+namespace init {
+
+// Returns a list of allowed GL implementations. The default implementation will
+// be the first item.
+std::vector<GLImplementation> GetAllowedGLImplementationsX11();
+
+// Initializes GL bindings and extension settings.
+bool InitializeGLOneOffX11();
+
+// Initializes GL bindings without initializing extension settings.
+bool InitializeGLNoExtensionsOneOffX11(bool init_bindings);
+
+// Initializes GL bindings - load dlls and get proc address according to gl
+// command line switch.
+bool InitializeStaticGLBindingsOneOffX11();
+
+// Initialize plaiform dependent extension settings, including bindings,
+// capabilities, etc.
+bool InitializeExtensionSettingsOneOffPlatformX11();
+
+// Initializes GL bindings using the provided parameters. This might be required
+// for use in tests.
+bool InitializeStaticGLBindingsImplementationX11(GLImplementation impl,
+ bool fallback_to_software_gl);
+
+// Initializes GL platform using the provided parameters. This might be required
+// for use in tests. This should be called only after GL bindings are initilzed
+// successfully.
+bool InitializeGLOneOffPlatformImplementationX11(bool fallback_to_software_gl,
+ bool disable_gl_drawing,
+ bool init_extensions);
+
+// Clears GL bindings and resets GL implementation.
+void ShutdownGLX11(bool due_to_fallback);
+
+// Return information about the GL window system binding implementation (e.g.,
+// EGL, GLX, WGL). Returns true if the information was retrieved successfully.
+bool GetGLWindowSystemBindingInfoX11(const GLVersionInfo& gl_info,
+ GLWindowSystemBindingInfo* info);
+
+// Creates a GL context that is compatible with the given surface.
+// |share_group|, if non-null, is a group of contexts which the internally
+// created OpenGL context shares textures and other resources.
+scoped_refptr<GLContext> CreateGLContextX11(GLShareGroup* share_group,
+ GLSurface* compatible_surface,
+ const GLContextAttribs& attribs);
+
+// Creates a GL surface that renders directly to a view.
+scoped_refptr<GLSurface> CreateViewGLSurfaceX11(gfx::AcceleratedWidget window);
+
+// Creates a GL surface used for offscreen rendering.
+scoped_refptr<GLSurface> CreateOffscreenGLSurfaceX11(const gfx::Size& size);
+
+scoped_refptr<GLSurface> CreateOffscreenGLSurfaceWithFormatX11(
+ const gfx::Size& size,
+ GLSurfaceFormat format);
+
+// Set platform dependent disabled extensions and re-initialize extension
+// bindings.
+void SetDisabledExtensionsPlatformX11(const std::string& disabled_extensions);
+
+} // namespace init
+
+} // namespace gl
+
+#endif // UI_GL_INIT_GL_FACTORY_LINUX_X11_H_
diff --git a/chromium/ui/gl/init/gl_factory_ozone.cc b/chromium/ui/gl/init/gl_factory_ozone.cc
index cd64372831f..a53de798086 100644
--- a/chromium/ui/gl/init/gl_factory_ozone.cc
+++ b/chromium/ui/gl/init/gl_factory_ozone.cc
@@ -14,20 +14,45 @@
#include "ui/gl/gl_share_group.h"
#include "ui/gl/gl_surface.h"
#include "ui/gl/gl_surface_stub.h"
+
+#if defined(USE_OZONE)
#include "ui/gl/init/ozone_util.h"
+#endif
+
+#if defined(USE_X11)
+#include "ui/base/ui_base_features.h"
+#include "ui/gl/init/gl_factory_linux_x11.h"
+#endif
namespace gl {
namespace init {
std::vector<GLImplementation> GetAllowedGLImplementations() {
+#if defined(USE_X11)
+ if (!features::IsUsingOzonePlatform())
+ return gl::init::GetAllowedGLImplementationsX11();
+#endif
+
+#if defined(USE_OZONE)
DCHECK(GetSurfaceFactoryOzone());
return GetSurfaceFactoryOzone()->GetAllowedGLImplementations();
+#else
+ NOTREACHED();
+ return {};
+#endif
}
bool GetGLWindowSystemBindingInfo(const GLVersionInfo& gl_info,
GLWindowSystemBindingInfo* info) {
+#if defined(USE_X11)
+ if (!features::IsUsingOzonePlatform())
+ return gl::init::GetGLWindowSystemBindingInfoX11(gl_info, info);
+#endif
+
+#if defined(USE_OZONE)
if (HasGLOzone())
return GetGLOzone()->GetGLWindowSystemBindingInfo(gl_info, info);
+#endif
return false;
}
@@ -35,6 +60,13 @@ bool GetGLWindowSystemBindingInfo(const GLVersionInfo& gl_info,
scoped_refptr<GLContext> CreateGLContext(GLShareGroup* share_group,
GLSurface* compatible_surface,
const GLContextAttribs& attribs) {
+#if defined(USE_X11)
+ if (!features::IsUsingOzonePlatform())
+ return gl::init::CreateGLContextX11(share_group, compatible_surface,
+ attribs);
+#endif
+
+#if defined(USE_OZONE)
TRACE_EVENT0("gpu", "gl::init::CreateGLContext");
if (HasGLOzone()) {
@@ -56,10 +88,18 @@ scoped_refptr<GLContext> CreateGLContext(GLShareGroup* share_group,
default:
NOTREACHED() << "Expected Mock or Stub, actual:" << GetGLImplementation();
}
+#endif
+
return nullptr;
}
scoped_refptr<GLSurface> CreateViewGLSurface(gfx::AcceleratedWidget window) {
+#if defined(USE_X11)
+ if (!features::IsUsingOzonePlatform())
+ return gl::init::CreateViewGLSurfaceX11(window);
+#endif
+
+#if defined(USE_OZONE)
TRACE_EVENT0("gpu", "gl::init::CreateViewGLSurface");
if (HasGLOzone())
@@ -72,22 +112,37 @@ scoped_refptr<GLSurface> CreateViewGLSurface(gfx::AcceleratedWidget window) {
default:
NOTREACHED() << "Expected Mock or Stub, actual:" << GetGLImplementation();
}
+#endif
return nullptr;
}
scoped_refptr<GLSurface> CreateSurfacelessViewGLSurface(
gfx::AcceleratedWidget window) {
+#if defined(USE_X11)
+ if (!features::IsUsingOzonePlatform()) {
+ return nullptr;
+ }
+#endif
+
+#if defined(USE_OZONE)
TRACE_EVENT0("gpu", "gl::init::CreateSurfacelessViewGLSurface");
if (HasGLOzone())
return GetGLOzone()->CreateSurfacelessViewGLSurface(window);
+#endif
return nullptr;
}
scoped_refptr<GLSurface> CreateOffscreenGLSurfaceWithFormat(
const gfx::Size& size, GLSurfaceFormat format) {
+#if defined(USE_X11)
+ if (!features::IsUsingOzonePlatform())
+ return gl::init::CreateOffscreenGLSurfaceWithFormatX11(size, format);
+#endif
+
+#if defined(USE_OZONE)
TRACE_EVENT0("gpu", "gl::init::CreateOffscreenGLSurface");
if (!format.IsCompatible(GLSurfaceFormat())) {
@@ -105,11 +160,20 @@ scoped_refptr<GLSurface> CreateOffscreenGLSurfaceWithFormat(
default:
NOTREACHED() << "Expected Mock or Stub, actual:" << GetGLImplementation();
}
+#endif
return nullptr;
}
void SetDisabledExtensionsPlatform(const std::string& disabled_extensions) {
+#if defined(USE_X11)
+ if (!features::IsUsingOzonePlatform()) {
+ gl::init::SetDisabledExtensionsPlatformX11(disabled_extensions);
+ return;
+ }
+#endif
+
+#if defined(USE_OZONE)
if (HasGLOzone()) {
GetGLOzone()->SetDisabledExtensionsPlatform(disabled_extensions);
return;
@@ -122,9 +186,16 @@ void SetDisabledExtensionsPlatform(const std::string& disabled_extensions) {
default:
NOTREACHED() << "Expected Mock or Stub, actual:" << GetGLImplementation();
}
+#endif
}
bool InitializeExtensionSettingsOneOffPlatform() {
+#if defined(USE_X11)
+ if (!features::IsUsingOzonePlatform())
+ return gl::init::InitializeExtensionSettingsOneOffPlatformX11();
+#endif
+
+#if defined(USE_OZONE)
if (HasGLOzone())
return GetGLOzone()->InitializeExtensionSettingsOneOffPlatform();
@@ -136,6 +207,8 @@ bool InitializeExtensionSettingsOneOffPlatform() {
NOTREACHED() << "Expected Mock or Stub, actual:" << GetGLImplementation();
return false;
}
+#endif
+ return false;
}
} // namespace init
diff --git a/chromium/ui/gl/init/gl_initializer_x11.cc b/chromium/ui/gl/init/gl_initializer_linux_x11.cc
index d76d146b0d8..0c57d500c0d 100644
--- a/chromium/ui/gl/init/gl_initializer_x11.cc
+++ b/chromium/ui/gl/init/gl_initializer_linux_x11.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/gl/init/gl_initializer.h"
+#include "ui/gl/init/gl_initializer_linux_x11.h"
#include "base/command_line.h"
#include "base/logging.h"
@@ -45,7 +45,7 @@ const char kEGLSwiftShaderLibraryName[] = "libEGL.so";
#endif
bool InitializeStaticGLXInternal() {
- base::NativeLibrary library = NULL;
+ base::NativeLibrary library = nullptr;
const base::CommandLine* command_line =
base::CommandLine::ForCurrentProcess();
@@ -142,7 +142,7 @@ bool InitializeStaticEGLInternal(GLImplementation implementation) {
} // namespace
-bool InitializeGLOneOffPlatform() {
+bool InitializeGLOneOffPlatformX11() {
switch (GetGLImplementation()) {
case kGLImplementationDesktopGL:
if (!GLSurfaceGLX::InitializeOneOff()) {
@@ -155,8 +155,8 @@ bool InitializeGLOneOffPlatform() {
case kGLImplementationEGLANGLE:
// Set utility class that helps to initialize egl platform.
gl::GLDisplayEglUtil::SetInstance(gl::GLDisplayEglUtilX11::GetInstance());
- if (!GLSurfaceEGL::InitializeOneOff(
- EGLDisplayPlatform(gfx::GetXDisplay()))) {
+ if (!GLSurfaceEGL::InitializeOneOff(EGLDisplayPlatform(
+ reinterpret_cast<EGLNativeDisplayType>(gfx::GetXDisplay())))) {
LOG(ERROR) << "GLSurfaceEGL::InitializeOneOff failed.";
return false;
}
@@ -166,7 +166,7 @@ bool InitializeGLOneOffPlatform() {
}
}
-bool InitializeStaticGLBindings(GLImplementation implementation) {
+bool InitializeStaticGLBindingsX11(GLImplementation implementation) {
// Prevent reinitialization with a different implementation. Once the gpu
// unit tests have initialized with kGLImplementationMock, we don't want to
// later switch to another GL implementation.
@@ -197,7 +197,7 @@ bool InitializeStaticGLBindings(GLImplementation implementation) {
return false;
}
-void ShutdownGLPlatform() {
+void ShutdownGLPlatformX11() {
GLSurfaceEGL::ShutdownOneOff();
GLSurfaceGLX::ShutdownOneOff();
ClearBindingsEGL();
diff --git a/chromium/ui/gl/init/gl_initializer_linux_x11.h b/chromium/ui/gl/init/gl_initializer_linux_x11.h
new file mode 100644
index 00000000000..07e0f8654de
--- /dev/null
+++ b/chromium/ui/gl/init/gl_initializer_linux_x11.h
@@ -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.
+
+#ifndef UI_GL_INIT_GL_INITIALIZER_LINUX_X11_H_
+#define UI_GL_INIT_GL_INITIALIZER_LINUX_X11_H_
+
+#include "ui/gl/gl_implementation.h"
+
+namespace gl {
+
+// Note that this is a temporary gl implementation for Linux/X11 GL. It is
+// called through GLFactoryOzone, and will be removed as soon as Linux/Ozone is
+// default.
+//
+// TODO(msisov): remove this once Ozone is default on Linux.
+namespace init {
+
+// Performs platform dependent one-off GL initialization, calling into the
+// appropriate GLSurface code to initialize it. To perform one-off GL
+// initialization you should use InitializeGLOneOff() or
+// InitializeStaticGLBindingsOneOff() +
+// InitializeGLNoExtensionsOneOff(). For tests possibly
+// InitializeStaticGLBindingsImplementation() +
+// InitializeGLOneOffPlatformImplementation() instead.
+bool InitializeGLOneOffPlatformX11();
+
+// Initializes a particular GL implementation.
+bool InitializeStaticGLBindingsX11(GLImplementation implementation);
+
+// Clears GL bindings for all implementations supported by platform.
+void ShutdownGLPlatformX11();
+
+} // namespace init
+
+} // namespace gl
+
+#endif // UI_GL_INIT_GL_INITIALIZER_LINUX_X11_H_
diff --git a/chromium/ui/gl/init/gl_initializer_mac.cc b/chromium/ui/gl/init/gl_initializer_mac.cc
index 0deebafe135..d8ad42a0755 100644
--- a/chromium/ui/gl/init/gl_initializer_mac.cc
+++ b/chromium/ui/gl/init/gl_initializer_mac.cc
@@ -226,6 +226,7 @@ bool InitializeStaticGLBindings(GLImplementation implementation) {
void ShutdownGLPlatform() {
ClearBindingsGL();
#if defined(USE_EGL)
+ GLSurfaceEGL::ShutdownOneOff();
ClearBindingsEGL();
#endif // defined(USE_EGL)
}
diff --git a/chromium/ui/gl/init/gl_initializer_ozone.cc b/chromium/ui/gl/init/gl_initializer_ozone.cc
index a94b6d4b7cb..aac4833f6c9 100644
--- a/chromium/ui/gl/init/gl_initializer_ozone.cc
+++ b/chromium/ui/gl/init/gl_initializer_ozone.cc
@@ -9,14 +9,28 @@
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_gl_api_implementation.h"
#include "ui/gl/gl_surface.h"
+
+#if defined(USE_OZONE)
#include "ui/gl/init/gl_display_egl_util_ozone.h"
#include "ui/gl/init/ozone_util.h"
#include "ui/ozone/public/ozone_platform.h"
+#endif
+
+#if defined(USE_X11)
+#include "ui/base/ui_base_features.h"
+#include "ui/gl/init/gl_initializer_linux_x11.h"
+#endif
namespace gl {
namespace init {
bool InitializeGLOneOffPlatform() {
+#if defined(USE_X11)
+ if (!features::IsUsingOzonePlatform())
+ return gl::init::InitializeGLOneOffPlatformX11();
+#endif
+
+#if defined(USE_OZONE)
if (HasGLOzone()) {
gl::GLDisplayEglUtil::SetInstance(gl::GLDisplayEglUtilOzone::GetInstance());
return GetGLOzone()->InitializeGLOneOffPlatform();
@@ -29,10 +43,17 @@ bool InitializeGLOneOffPlatform() {
default:
NOTREACHED();
}
+#endif
return false;
}
bool InitializeStaticGLBindings(GLImplementation implementation) {
+#if defined(USE_X11)
+ if (!features::IsUsingOzonePlatform())
+ return gl::init::InitializeStaticGLBindingsX11(implementation);
+#endif
+
+#if defined(USE_OZONE)
// Prevent reinitialization with a different implementation. Once the gpu
// unit tests have initialized with kGLImplementationMock, we don't want to
// later switch to another GL implementation.
@@ -52,17 +73,25 @@ bool InitializeStaticGLBindings(GLImplementation implementation) {
default:
NOTREACHED();
}
+#endif
return false;
}
void ShutdownGLPlatform() {
+#if defined(USE_X11)
+ if (!features::IsUsingOzonePlatform())
+ return gl::init::ShutdownGLPlatformX11();
+#endif
+
+#if defined(USE_OZONE)
if (HasGLOzone()) {
GetGLOzone()->ShutdownGL();
return;
}
ClearBindingsGL();
+#endif
}
} // namespace init
diff --git a/chromium/ui/gl/scoped_binders.cc b/chromium/ui/gl/scoped_binders.cc
index f44272e878e..9375094bb01 100644
--- a/chromium/ui/gl/scoped_binders.cc
+++ b/chromium/ui/gl/scoped_binders.cc
@@ -11,7 +11,7 @@ namespace gl {
ScopedFramebufferBinder::ScopedFramebufferBinder(unsigned int fbo)
: state_restorer_(!GLContext::GetCurrent()
- ? NULL
+ ? nullptr
: GLContext::GetCurrent()->GetGLStateRestorer()),
old_fbo_(-1) {
if (!state_restorer_)
@@ -31,7 +31,7 @@ ScopedFramebufferBinder::~ScopedFramebufferBinder() {
ScopedActiveTexture::ScopedActiveTexture(unsigned int texture)
: state_restorer_(!GLContext::GetCurrent()
- ? NULL
+ ? nullptr
: GLContext::GetCurrent()->GetGLStateRestorer()),
old_texture_(-1) {
if (!state_restorer_)
@@ -51,7 +51,7 @@ ScopedActiveTexture::~ScopedActiveTexture() {
ScopedTextureBinder::ScopedTextureBinder(unsigned int target, unsigned int id)
: state_restorer_(!GLContext::GetCurrent()
- ? NULL
+ ? nullptr
: GLContext::GetCurrent()->GetGLStateRestorer()),
target_(target),
old_id_(-1) {
@@ -90,7 +90,7 @@ ScopedTextureBinder::~ScopedTextureBinder() {
ScopedUseProgram::ScopedUseProgram(unsigned int program)
: state_restorer_(!GLContext::GetCurrent()
- ? NULL
+ ? nullptr
: GLContext::GetCurrent()->GetGLStateRestorer()),
old_program_(-1) {
if (!state_restorer_)
@@ -115,7 +115,7 @@ ScopedVertexAttribArray::ScopedVertexAttribArray(unsigned int index,
int stride,
const void* pointer)
: state_restorer_(!GLContext::GetCurrent()
- ? NULL
+ ? nullptr
: GLContext::GetCurrent()->GetGLStateRestorer()),
buffer_(0),
enabled_(GL_FALSE),
@@ -124,7 +124,7 @@ ScopedVertexAttribArray::ScopedVertexAttribArray(unsigned int index,
type_(-1),
normalized_(GL_FALSE),
stride_(0),
- pointer_(0) {
+ pointer_(nullptr) {
if (!state_restorer_) {
glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &buffer_);
glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &enabled_);
@@ -154,7 +154,7 @@ ScopedVertexAttribArray::~ScopedVertexAttribArray() {
ScopedBufferBinder::ScopedBufferBinder(unsigned int target, unsigned int id)
: state_restorer_(!GLContext::GetCurrent()
- ? NULL
+ ? nullptr
: GLContext::GetCurrent()->GetGLStateRestorer()),
target_(target),
old_id_(-1) {
diff --git a/chromium/ui/gl/scoped_cgl.cc b/chromium/ui/gl/scoped_cgl.cc
index db7a62e2185..6be02ab3afc 100644
--- a/chromium/ui/gl/scoped_cgl.cc
+++ b/chromium/ui/gl/scoped_cgl.cc
@@ -3,6 +3,9 @@
// found in the LICENSE file.
#include "ui/gl/scoped_cgl.h"
+
+#include <ostream>
+
#include "base/check_op.h"
namespace gl {
diff --git a/chromium/ui/gl/swap_chain_presenter.cc b/chromium/ui/gl/swap_chain_presenter.cc
index 40851d765bd..d5ba73d26a3 100644
--- a/chromium/ui/gl/swap_chain_presenter.cc
+++ b/chromium/ui/gl/swap_chain_presenter.cc
@@ -259,9 +259,12 @@ Microsoft::WRL::ComPtr<ID3D11Texture2D> SwapChainPresenter::UploadVideoImages(
copy_texture_.Reset();
HRESULT hr =
d3d11_device_->CreateTexture2D(&desc, nullptr, &staging_texture_);
+ base::UmaHistogramSparse(
+ "GPU.DirectComposition.UploadVideoImages.CreateStagingTexture", hr);
if (FAILED(hr)) {
DLOG(ERROR) << "Creating D3D11 video staging texture failed: " << std::hex
<< hr;
+ DirectCompositionSurfaceWin::DisableOverlays();
return nullptr;
}
DCHECK(staging_texture_);
@@ -311,9 +314,12 @@ Microsoft::WRL::ComPtr<ID3D11Texture2D> SwapChainPresenter::UploadVideoImages(
desc.BindFlags = D3D11_BIND_DECODER;
desc.CPUAccessFlags = 0;
HRESULT hr = d3d11_device_->CreateTexture2D(&desc, nullptr, &copy_texture_);
+ base::UmaHistogramSparse(
+ "GPU.DirectComposition.UploadVideoImages.CreateCopyTexture", hr);
if (FAILED(hr)) {
DLOG(ERROR) << "Creating D3D11 video upload texture failed: " << std::hex
<< hr;
+ DirectCompositionSurfaceWin::DisableOverlays();
return nullptr;
}
DCHECK(copy_texture_);
@@ -587,7 +593,11 @@ bool SwapChainPresenter::PresentToDecodeSwapChain(
DCHECK(media_factory);
DXGI_DECODE_SWAP_CHAIN_DESC desc = {};
- desc.Flags = 0;
+ // Set the DXGI_SWAP_CHAIN_FLAG_FULLSCREEN_VIDEO flag to mark this surface
+ // as a candidate for full screen video optimizations. If the surface
+ // does not qualify as fullscreen by DWM's logic then the flag will have
+ // no effects.
+ desc.Flags = DXGI_SWAP_CHAIN_FLAG_FULLSCREEN_VIDEO;
HRESULT hr =
media_factory->CreateDecodeSwapChainForCompositionSurfaceHandle(
d3d11_device_.Get(), swap_chain_handle_.Get(), &desc,
@@ -606,8 +616,8 @@ bool SwapChainPresenter::PresentToDecodeSwapChain(
dcomp_device_.As(&desktop_device);
DCHECK(desktop_device);
- desktop_device->CreateSurfaceFromHandle(swap_chain_handle_.Get(),
- &decode_surface_);
+ hr = desktop_device->CreateSurfaceFromHandle(swap_chain_handle_.Get(),
+ &decode_surface_);
if (FAILED(hr)) {
DLOG(ERROR) << "CreateSurfaceFromHandle failed with error 0x" << std::hex
<< hr;
diff --git a/chromium/ui/gl/vsync_thread_win.cc b/chromium/ui/gl/vsync_thread_win.cc
index 9502606f05d..ec027e3339d 100644
--- a/chromium/ui/gl/vsync_thread_win.cc
+++ b/chromium/ui/gl/vsync_thread_win.cc
@@ -5,6 +5,7 @@
#include "ui/gl/vsync_thread_win.h"
#include "base/bind.h"
+#include "base/logging.h"
#include "base/memory/singleton.h"
#include "base/stl_util.h"
#include "ui/gl/gl_angle_util_win.h"
@@ -54,6 +55,7 @@ VSyncThreadWin* VSyncThreadWin::GetInstance() {
VSyncThreadWin::VSyncThreadWin()
: vsync_thread_("GpuVSyncThread"),
+ vsync_provider_(gfx::kNullAcceleratedWidget),
d3d11_device_(QueryD3D11DeviceObjectFromANGLE()) {
DCHECK(d3d11_device_);
base::Thread::Options options;
@@ -86,32 +88,23 @@ void VSyncThreadWin::RemoveObserver(VSyncObserver* obs) {
}
void VSyncThreadWin::WaitForVSync() {
+ base::TimeTicks vsync_phase;
+ base::TimeDelta vsync_interval;
+ const bool get_vsync_params_succeeded =
+ vsync_provider_.GetVSyncParametersIfAvailable(&vsync_phase,
+ &vsync_interval);
+ DCHECK(get_vsync_params_succeeded);
+
// From Raymond Chen's blog "How do I get a handle to the primary monitor?"
// https://devblogs.microsoft.com/oldnewthing/20141106-00/?p=43683
- HMONITOR monitor = MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY);
+ const HMONITOR monitor = MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY);
if (primary_monitor_ != monitor) {
primary_monitor_ = monitor;
primary_output_ = DXGIOutputFromMonitor(monitor, d3d11_device_);
}
- base::TimeDelta interval = base::TimeDelta::FromSecondsD(1.0 / 60);
-
- MONITORINFOEX monitor_info = {};
- monitor_info.cbSize = sizeof(MONITORINFOEX);
- if (monitor && GetMonitorInfo(monitor, &monitor_info)) {
- DEVMODE display_info = {};
- display_info.dmSize = sizeof(DEVMODE);
- display_info.dmDriverExtra = 0;
- if (EnumDisplaySettings(monitor_info.szDevice, ENUM_CURRENT_SETTINGS,
- &display_info) &&
- display_info.dmDisplayFrequency > 1) {
- interval =
- base::TimeDelta::FromSecondsD(1.0 / display_info.dmDisplayFrequency);
- }
- }
-
- base::TimeTicks wait_for_vblank_start_time = base::TimeTicks::Now();
- bool wait_for_vblank_succeeded =
+ const base::TimeTicks wait_for_vblank_start_time = base::TimeTicks::Now();
+ const bool wait_for_vblank_succeeded =
primary_output_ && SUCCEEDED(primary_output_->WaitForVBlank());
// WaitForVBlank returns very early instead of waiting until vblank when the
@@ -119,13 +112,13 @@ void VSyncThreadWin::WaitForVSync() {
// WaitForVBlank and fallback to Sleep() if it returns before that. This
// could happen during normal operation for the first call after the vsync
// thread becomes non-idle, but it shouldn't happen often.
- const auto kVBlankIntervalThreshold = base::TimeDelta::FromMilliseconds(1);
- base::TimeDelta wait_for_vblank_elapsed_time =
+ constexpr auto kVBlankIntervalThreshold =
+ base::TimeDelta::FromMilliseconds(1);
+ const base::TimeDelta wait_for_vblank_elapsed_time =
base::TimeTicks::Now() - wait_for_vblank_start_time;
-
if (!wait_for_vblank_succeeded ||
wait_for_vblank_elapsed_time < kVBlankIntervalThreshold) {
- Sleep(static_cast<DWORD>(interval.InMillisecondsRoundedUp()));
+ Sleep(static_cast<DWORD>(vsync_interval.InMillisecondsRoundedUp()));
}
base::AutoLock auto_lock(lock_);
@@ -133,9 +126,9 @@ void VSyncThreadWin::WaitForVSync() {
vsync_thread_.task_runner()->PostTask(
FROM_HERE,
base::BindOnce(&VSyncThreadWin::WaitForVSync, base::Unretained(this)));
- base::TimeTicks vsync_time = base::TimeTicks::Now();
+ const base::TimeTicks vsync_time = base::TimeTicks::Now();
for (auto* obs : observers_)
- obs->OnVSync(vsync_time, interval);
+ obs->OnVSync(vsync_time, vsync_interval);
} else {
is_idle_ = true;
}
diff --git a/chromium/ui/gl/vsync_thread_win.h b/chromium/ui/gl/vsync_thread_win.h
index d148353ddc3..e3d65f122c2 100644
--- a/chromium/ui/gl/vsync_thread_win.h
+++ b/chromium/ui/gl/vsync_thread_win.h
@@ -12,6 +12,7 @@
#include "base/containers/flat_set.h"
#include "base/threading/thread.h"
#include "ui/gl/gl_export.h"
+#include "ui/gl/vsync_provider_win.h"
namespace base {
template <typename T>
@@ -46,6 +47,7 @@ class GL_EXPORT VSyncThreadWin {
base::Thread vsync_thread_;
// Used on vsync thread only after initialization.
+ VSyncProviderWin vsync_provider_;
const Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device_;
HMONITOR primary_monitor_ = nullptr;
Microsoft::WRL::ComPtr<IDXGIOutput> primary_output_;
diff --git a/chromium/ui/gl/yuv_to_rgb_converter.cc b/chromium/ui/gl/yuv_to_rgb_converter.cc
index 5e2c4e23e2a..e76c9410523 100644
--- a/chromium/ui/gl/yuv_to_rgb_converter.cc
+++ b/chromium/ui/gl/yuv_to_rgb_converter.cc
@@ -4,6 +4,7 @@
#include "ui/gl/yuv_to_rgb_converter.h"
+#include "base/notreached.h"
#include "base/strings/stringize_macros.h"
#include "base/strings/stringprintf.h"
#include "ui/gfx/color_transform.h"
@@ -119,7 +120,7 @@ STRINGIZE(
} // namespace
YUVToRGBConverter::YUVToRGBConverter(const GLVersionInfo& gl_version_info,
- const gfx::ColorSpace color_space) {
+ const gfx::ColorSpace& color_space) {
std::unique_ptr<gfx::ColorTransform> color_transform =
gfx::ColorTransform::NewColorTransform(
color_space, color_space.GetAsFullRangeRGB(),
diff --git a/chromium/ui/gl/yuv_to_rgb_converter.h b/chromium/ui/gl/yuv_to_rgb_converter.h
index 3c8178db823..d228de30e59 100644
--- a/chromium/ui/gl/yuv_to_rgb_converter.h
+++ b/chromium/ui/gl/yuv_to_rgb_converter.h
@@ -18,7 +18,7 @@ struct GLVersionInfo;
class YUVToRGBConverter {
public:
explicit YUVToRGBConverter(const GLVersionInfo& gl_version_info,
- const gfx::ColorSpace color_space);
+ const gfx::ColorSpace& color_space);
~YUVToRGBConverter();
// The input Y and UV textures should be bound to these texture objects
diff --git a/chromium/ui/gtk/BUILD.gn b/chromium/ui/gtk/BUILD.gn
index 99d97e9c145..02e12b9db88 100644
--- a/chromium/ui/gtk/BUILD.gn
+++ b/chromium/ui/gtk/BUILD.gn
@@ -35,10 +35,10 @@ jumbo_component("gtk") {
"native_theme_gtk.h",
"nav_button_provider_gtk.cc",
"nav_button_provider_gtk.h",
- "print_dialog_gtk.cc",
- "print_dialog_gtk.h",
- "printing_gtk_util.cc",
- "printing_gtk_util.h",
+ "printing/print_dialog_gtk.cc",
+ "printing/print_dialog_gtk.h",
+ "printing/printing_gtk_util.cc",
+ "printing/printing_gtk_util.h",
"select_file_dialog_impl.cc",
"select_file_dialog_impl.h",
"select_file_dialog_impl_gtk.cc",
@@ -76,6 +76,7 @@ jumbo_component("gtk") {
"//ui/aura",
"//ui/base",
"//ui/base:buildflags",
+ "//ui/base/cursor:theme_manager",
"//ui/base/ime",
"//ui/base/ime/linux",
"//ui/display",
@@ -85,7 +86,6 @@ jumbo_component("gtk") {
"//ui/gfx",
"//ui/gfx:native_widget_types",
"//ui/gfx/geometry",
- "//ui/gfx/x",
"//ui/native_theme",
"//ui/shell_dialogs",
"//ui/strings",
diff --git a/chromium/ui/gtk/gtk_ui.cc b/chromium/ui/gtk/gtk_ui.cc
index 77d2c7633af..69d7afecc3a 100644
--- a/chromium/ui/gtk/gtk_ui.cc
+++ b/chromium/ui/gtk/gtk_ui.cc
@@ -29,7 +29,7 @@
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkShader.h"
-#include "ui/base/cursor/cursor_theme_manager_linux_observer.h"
+#include "ui/base/cursor/cursor_theme_manager_observer.h"
#include "ui/base/ime/linux/fake_input_method_context.h"
#include "ui/base/ime/linux/linux_input_method_context.h"
#include "ui/base/ime/linux/linux_input_method_context_factory.h"
@@ -51,8 +51,8 @@
#include "ui/gtk/input_method_context_impl_gtk.h"
#include "ui/gtk/native_theme_gtk.h"
#include "ui/gtk/nav_button_provider_gtk.h"
-#include "ui/gtk/print_dialog_gtk.h"
-#include "ui/gtk/printing_gtk_util.h"
+#include "ui/gtk/printing/print_dialog_gtk.h"
+#include "ui/gtk/printing/printing_gtk_util.h"
#include "ui/gtk/select_file_dialog_impl.h"
#include "ui/gtk/settings_provider_gtk.h"
#include "ui/native_theme/native_theme.h"
diff --git a/chromium/ui/gtk/printing/OWNERS b/chromium/ui/gtk/printing/OWNERS
new file mode 100644
index 00000000000..d50bb849014
--- /dev/null
+++ b/chromium/ui/gtk/printing/OWNERS
@@ -0,0 +1,3 @@
+file://printing/OWNERS
+
+# COMPONENT: Internals>Printing
diff --git a/chromium/ui/gtk/print_dialog_gtk.cc b/chromium/ui/gtk/printing/print_dialog_gtk.cc
index 7368b297a54..57900d2854d 100644
--- a/chromium/ui/gtk/print_dialog_gtk.cc
+++ b/chromium/ui/gtk/printing/print_dialog_gtk.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/gtk/print_dialog_gtk.h"
+#include "ui/gtk/printing/print_dialog_gtk.h"
#include <gtk/gtkunixprint.h>
@@ -31,7 +31,7 @@
#include "ui/gtk/gtk_ui.h"
#include "ui/gtk/gtk_ui_delegate.h"
#include "ui/gtk/gtk_util.h"
-#include "ui/gtk/printing_gtk_util.h"
+#include "ui/gtk/printing/printing_gtk_util.h"
#if defined(USE_CUPS)
#include "printing/mojom/print.mojom.h"
@@ -184,7 +184,7 @@ PrintDialogGtk::PrintDialogGtk(PrintingContextLinux* context)
context_(context) {}
PrintDialogGtk::~PrintDialogGtk() {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+ DCHECK(owning_task_runner()->RunsTasksInCurrentSequence());
if (dialog_) {
aura::Window* parent = gtk::GetAuraTransientParent(dialog_);
@@ -241,6 +241,17 @@ void PrintDialogGtk::UpdateSettings(
gtk_print_settings_set_collate(gtk_settings_, settings->collate());
#if defined(USE_CUPS)
+ // Set advanced settings first so they can be overridden by user applied
+ // settings.
+ for (const auto& pair : settings->advanced_settings()) {
+ if (!pair.second.is_string())
+ continue;
+ static constexpr char kSettingNamePrefix[] = "cups-";
+ const std::string setting_name = kSettingNamePrefix + pair.first;
+ gtk_print_settings_set(gtk_settings_, setting_name.c_str(),
+ pair.second.GetString().c_str());
+ }
+
std::string color_value;
std::string color_setting_name;
printing::GetColorModelForMode(settings->color(), &color_setting_name,
@@ -363,7 +374,7 @@ void PrintDialogGtk::ShowDialog(
void PrintDialogGtk::PrintDocument(const printing::MetafilePlayer& metafile,
const base::string16& document_name) {
// This runs on the print worker thread, does not block the UI thread.
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+ DCHECK(!owning_task_runner()->RunsTasksInCurrentSequence());
// The document printing tasks can outlive the PrintingContext that created
// this dialog.
@@ -389,7 +400,7 @@ void PrintDialogGtk::PrintDocument(const printing::MetafilePlayer& metafile,
}
// No errors, continue printing.
- base::SequencedTaskRunnerHandle::Get()->PostTask(
+ owning_task_runner()->PostTask(
FROM_HERE, base::BindOnce(&PrintDialogGtk::SendDocumentToPrinter, this,
document_name));
}
@@ -487,7 +498,7 @@ static void OnJobCompletedThunk(GtkPrintJob* print_job,
}
void PrintDialogGtk::SendDocumentToPrinter(
const base::string16& document_name) {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+ DCHECK(owning_task_runner()->RunsTasksInCurrentSequence());
// If |printer_| is nullptr then somehow the GTK printer list changed out
// under us. In which case, just bail out.
@@ -519,8 +530,7 @@ void PrintDialogGtk::OnJobCompleted(GtkPrintJob* print_job,
FROM_HERE,
{base::MayBlock(), base::TaskPriority::BEST_EFFORT,
base::TaskShutdownBehavior::BLOCK_SHUTDOWN},
- base::BindOnce(base::IgnoreResult(&base::DeleteFile), path_to_pdf_,
- false));
+ base::BindOnce(base::GetDeleteFileCallback(), path_to_pdf_));
// Printing finished. Matches AddRef() in PrintDocument();
Release();
}
diff --git a/chromium/ui/gtk/print_dialog_gtk.h b/chromium/ui/gtk/printing/print_dialog_gtk.h
index b7874e587f5..f065848a163 100644
--- a/chromium/ui/gtk/print_dialog_gtk.h
+++ b/chromium/ui/gtk/printing/print_dialog_gtk.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_GTK_PRINT_DIALOG_GTK_H_
-#define UI_GTK_PRINT_DIALOG_GTK_H_
+#ifndef UI_GTK_PRINTING_PRINT_DIALOG_GTK_H_
+#define UI_GTK_PRINTING_PRINT_DIALOG_GTK_H_
#include <gtk/gtk.h>
#include <gtk/gtkunixprint.h>
@@ -13,7 +13,6 @@
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/memory/ref_counted_delete_on_sequence.h"
-#include "base/sequenced_task_runner_helpers.h"
#include "printing/print_dialog_gtk_interface.h"
#include "printing/printing_context_linux.h"
#include "ui/aura/window_observer.h"
@@ -84,9 +83,7 @@ class PrintDialogGtk : public printing::PrintDialogGtkInterface,
base::FilePath path_to_pdf_;
- SEQUENCE_CHECKER(sequence_checker_);
-
DISALLOW_COPY_AND_ASSIGN(PrintDialogGtk);
};
-#endif // UI_GTK_PRINT_DIALOG_GTK_H_
+#endif // UI_GTK_PRINTING_PRINT_DIALOG_GTK_H_
diff --git a/chromium/ui/gtk/printing_gtk_util.cc b/chromium/ui/gtk/printing/printing_gtk_util.cc
index efacf89c209..fe3771f808b 100644
--- a/chromium/ui/gtk/printing_gtk_util.cc
+++ b/chromium/ui/gtk/printing/printing_gtk_util.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/gtk/printing_gtk_util.h"
+#include "ui/gtk/printing/printing_gtk_util.h"
#include <gtk/gtk.h>
#include <gtk/gtkunixprint.h>
diff --git a/chromium/ui/gtk/printing_gtk_util.h b/chromium/ui/gtk/printing/printing_gtk_util.h
index 4dce6f8613f..7b41010d94a 100644
--- a/chromium/ui/gtk/printing_gtk_util.h
+++ b/chromium/ui/gtk/printing/printing_gtk_util.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_GTK_PRINTING_GTK_UTIL_H_
-#define UI_GTK_PRINTING_GTK_UTIL_H_
+#ifndef UI_GTK_PRINTING_PRINTING_GTK_UTIL_H_
+#define UI_GTK_PRINTING_PRINTING_GTK_UTIL_H_
#include "ui/gfx/geometry/size.h"
@@ -24,4 +24,4 @@ void InitPrintSettingsGtk(GtkPrintSettings* settings,
GtkPageSetup* page_setup,
printing::PrintSettings* print_settings);
-#endif // UI_GTK_PRINTING_GTK_UTIL_H_
+#endif // UI_GTK_PRINTING_PRINTING_GTK_UTIL_H_
diff --git a/chromium/ui/gtk/select_file_dialog_impl_kde.cc b/chromium/ui/gtk/select_file_dialog_impl_kde.cc
index f09501d6cd8..4eba97d573d 100644
--- a/chromium/ui/gtk/select_file_dialog_impl_kde.cc
+++ b/chromium/ui/gtk/select_file_dialog_impl_kde.cc
@@ -75,7 +75,7 @@ class SelectFileDialogImplKDE : public SelectFileDialogImpl {
KDialogParams(const std::string& type,
const std::string& title,
const base::FilePath& default_path,
- XID parent,
+ gfx::AcceleratedWidget parent,
bool file_operation,
bool multiple_selection)
: type(type),
@@ -88,7 +88,7 @@ class SelectFileDialogImplKDE : public SelectFileDialogImpl {
std::string type;
std::string title;
base::FilePath default_path;
- XID parent;
+ gfx::AcceleratedWidget parent;
bool file_operation;
bool multiple_selection;
};
@@ -106,7 +106,7 @@ class SelectFileDialogImplKDE : public SelectFileDialogImpl {
void GetKDialogCommandLine(const std::string& type,
const std::string& title,
const base::FilePath& default_path,
- XID parent,
+ gfx::AcceleratedWidget parent,
bool file_operation,
bool multiple_selection,
base::CommandLine* command_line);
@@ -130,22 +130,22 @@ class SelectFileDialogImplKDE : public SelectFileDialogImpl {
void CreateSelectFolderDialog(Type type,
const std::string& title,
const base::FilePath& default_path,
- XID parent,
+ gfx::AcceleratedWidget parent,
void* params);
void CreateFileOpenDialog(const std::string& title,
const base::FilePath& default_path,
- XID parent,
+ gfx::AcceleratedWidget parent,
void* params);
void CreateMultiFileOpenDialog(const std::string& title,
const base::FilePath& default_path,
- XID parent,
+ gfx::AcceleratedWidget parent,
void* params);
void CreateSaveAsDialog(const std::string& title,
const base::FilePath& default_path,
- XID parent,
+ gfx::AcceleratedWidget parent,
void* params);
// Common function for OnSelectSingleFileDialogResponse and
@@ -155,15 +155,15 @@ class SelectFileDialogImplKDE : public SelectFileDialogImpl {
std::unique_ptr<KDialogOutputParams> results);
void OnSelectSingleFileDialogResponse(
- XID parent,
+ gfx::AcceleratedWidget parent,
void* params,
std::unique_ptr<KDialogOutputParams> results);
void OnSelectMultiFileDialogResponse(
- XID parent,
+ gfx::AcceleratedWidget parent,
void* params,
std::unique_ptr<KDialogOutputParams> results);
void OnSelectSingleFolderDialogResponse(
- XID parent,
+ gfx::AcceleratedWidget parent,
void* params,
std::unique_ptr<KDialogOutputParams> results);
@@ -172,7 +172,7 @@ class SelectFileDialogImplKDE : public SelectFileDialogImpl {
// The set of all parent windows for which we are currently running
// dialogs. This should only be accessed on the UI thread.
- std::set<XID> parents_;
+ std::set<gfx::AcceleratedWidget> parents_;
// A task runner for blocking pipe reads.
scoped_refptr<base::SequencedTaskRunner> pipe_task_runner_;
@@ -218,13 +218,13 @@ SelectFileDialogImplKDE::SelectFileDialogImplKDE(
desktop_ == base::nix::DESKTOP_ENVIRONMENT_KDE5);
}
-SelectFileDialogImplKDE::~SelectFileDialogImplKDE() {}
+SelectFileDialogImplKDE::~SelectFileDialogImplKDE() = default;
bool SelectFileDialogImplKDE::IsRunning(gfx::NativeWindow parent_window) const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (parent_window && parent_window->GetHost()) {
- XID xid = parent_window->GetHost()->GetAcceleratedWidget();
- return parents_.find(xid) != parents_.end();
+ auto window = parent_window->GetHost()->GetAcceleratedWidget();
+ return parents_.find(window) != parents_.end();
}
return false;
@@ -243,13 +243,13 @@ void SelectFileDialogImplKDE::SelectFileImpl(
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
type_ = type;
- XID window_xid = x11::None;
+ gfx::AcceleratedWidget window = gfx::kNullAcceleratedWidget;
if (owning_window && owning_window->GetHost()) {
// |owning_window| can be null when user right-clicks on a downloadable item
// and chooses 'Open Link in New Tab' when 'Ask where to save each file
// before downloading.' preference is turned on. (http://crbug.com/29213)
- window_xid = owning_window->GetHost()->GetAcceleratedWidget();
- parents_.insert(window_xid);
+ window = owning_window->GetHost()->GetAcceleratedWidget();
+ parents_.insert(window);
}
std::string title_string = base::UTF16ToUTF8(title);
@@ -264,17 +264,17 @@ void SelectFileDialogImplKDE::SelectFileImpl(
case SELECT_FOLDER:
case SELECT_UPLOAD_FOLDER:
case SELECT_EXISTING_FOLDER:
- CreateSelectFolderDialog(type, title_string, default_path, window_xid,
+ CreateSelectFolderDialog(type, title_string, default_path, window,
params);
return;
case SELECT_OPEN_FILE:
- CreateFileOpenDialog(title_string, default_path, window_xid, params);
+ CreateFileOpenDialog(title_string, default_path, window, params);
return;
case SELECT_OPEN_MULTI_FILE:
- CreateMultiFileOpenDialog(title_string, default_path, window_xid, params);
+ CreateMultiFileOpenDialog(title_string, default_path, window, params);
return;
case SELECT_SAVEAS_FILE:
- CreateSaveAsDialog(title_string, default_path, window_xid, params);
+ CreateSaveAsDialog(title_string, default_path, window, params);
return;
case SELECT_NONE:
NOTREACHED();
@@ -290,12 +290,11 @@ std::string SelectFileDialogImplKDE::GetMimeTypeFilterString() {
DCHECK(pipe_task_runner_->RunsTasksInCurrentSequence());
// We need a filter set because the same mime type can appear multiple times.
std::set<std::string> filter_set;
- for (size_t i = 0; i < file_types_.extensions.size(); ++i) {
- for (size_t j = 0; j < file_types_.extensions[i].size(); ++j) {
- if (!file_types_.extensions[i][j].empty()) {
- std::string mime_type =
- base::nix::GetFileMimeType(base::FilePath("name").ReplaceExtension(
- file_types_.extensions[i][j]));
+ for (auto& extensions : file_types_.extensions) {
+ for (auto& extension : extensions) {
+ if (!extension.empty()) {
+ std::string mime_type = base::nix::GetFileMimeType(
+ base::FilePath("name").ReplaceExtension(extension));
filter_set.insert(mime_type);
}
}
@@ -335,18 +334,18 @@ void SelectFileDialogImplKDE::GetKDialogCommandLine(
const std::string& type,
const std::string& title,
const base::FilePath& path,
- XID parent,
+ gfx::AcceleratedWidget parent,
bool file_operation,
bool multiple_selection,
base::CommandLine* command_line) {
CHECK(command_line);
// Attach to the current Chrome window.
- if (parent != x11::None) {
+ if (parent != gfx::kNullAcceleratedWidget) {
command_line->AppendSwitchNative(
desktop_ == base::nix::DESKTOP_ENVIRONMENT_KDE3 ? "--embed"
: "--attach",
- base::NumberToString(parent));
+ base::NumberToString(static_cast<uint32_t>(parent)));
}
// Set the correct title for the dialog.
@@ -404,7 +403,7 @@ void SelectFileDialogImplKDE::CreateSelectFolderDialog(
Type type,
const std::string& title,
const base::FilePath& default_path,
- XID parent,
+ gfx::AcceleratedWidget parent,
void* params) {
int title_message_id = (type == SELECT_UPLOAD_FOLDER)
? IDS_SELECT_UPLOAD_FOLDER_DIALOG_TITLE
@@ -425,7 +424,7 @@ void SelectFileDialogImplKDE::CreateSelectFolderDialog(
void SelectFileDialogImplKDE::CreateFileOpenDialog(
const std::string& title,
const base::FilePath& default_path,
- XID parent,
+ gfx::AcceleratedWidget parent,
void* params) {
pipe_task_runner_->PostTaskAndReplyWithResult(
FROM_HERE,
@@ -442,7 +441,7 @@ void SelectFileDialogImplKDE::CreateFileOpenDialog(
void SelectFileDialogImplKDE::CreateMultiFileOpenDialog(
const std::string& title,
const base::FilePath& default_path,
- XID parent,
+ gfx::AcceleratedWidget parent,
void* params) {
pipe_task_runner_->PostTaskAndReplyWithResult(
FROM_HERE,
@@ -459,7 +458,7 @@ void SelectFileDialogImplKDE::CreateMultiFileOpenDialog(
void SelectFileDialogImplKDE::CreateSaveAsDialog(
const std::string& title,
const base::FilePath& default_path,
- XID parent,
+ gfx::AcceleratedWidget parent,
void* params) {
pipe_task_runner_->PostTaskAndReplyWithResult(
FROM_HERE,
@@ -496,7 +495,7 @@ void SelectFileDialogImplKDE::SelectSingleFileHelper(
}
void SelectFileDialogImplKDE::OnSelectSingleFileDialogResponse(
- XID parent,
+ gfx::AcceleratedWidget parent,
void* params,
std::unique_ptr<KDialogOutputParams> results) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -505,7 +504,7 @@ void SelectFileDialogImplKDE::OnSelectSingleFileDialogResponse(
}
void SelectFileDialogImplKDE::OnSelectSingleFolderDialogResponse(
- XID parent,
+ gfx::AcceleratedWidget parent,
void* params,
std::unique_ptr<KDialogOutputParams> results) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -514,7 +513,7 @@ void SelectFileDialogImplKDE::OnSelectSingleFolderDialogResponse(
}
void SelectFileDialogImplKDE::OnSelectMultiFileDialogResponse(
- XID parent,
+ gfx::AcceleratedWidget parent,
void* params,
std::unique_ptr<KDialogOutputParams> results) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/chromium/ui/gtk/x/gtk_event_loop_x11.cc b/chromium/ui/gtk/x/gtk_event_loop_x11.cc
index aab1a9c3581..abda48cbf04 100644
--- a/chromium/ui/gtk/x/gtk_event_loop_x11.cc
+++ b/chromium/ui/gtk/x/gtk_event_loop_x11.cc
@@ -7,9 +7,12 @@
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <gtk/gtk.h>
+#include <xcb/xcb.h>
+#include <xcb/xproto.h>
#include "base/memory/singleton.h"
#include "ui/events/platform/x11/x11_event_source.h"
+#include "ui/gfx/x/event.h"
#include "ui/gfx/x/x11.h"
namespace ui {
@@ -66,26 +69,42 @@ void GtkEventLoopX11::ProcessGdkEventKey(const GdkEventKey& gdk_event_key) {
// corresponding key event in the X event queue. So we have to handle this
// case. ibus-gtk is used through gtk-immodule to support IMEs.
- XEvent x_event;
- x_event.xkey = {};
- x_event.xkey.type =
- gdk_event_key.type == GDK_KEY_PRESS ? KeyPress : KeyRelease;
- x_event.xkey.send_event = gdk_event_key.send_event;
- x_event.xkey.display = gfx::GetXDisplay();
- x_event.xkey.window = GDK_WINDOW_XID(gdk_event_key.window);
- x_event.xkey.root = DefaultRootWindow(x_event.xkey.display);
- x_event.xkey.time = gdk_event_key.time;
- x_event.xkey.keycode = gdk_event_key.hardware_keycode;
- x_event.xkey.same_screen = true;
- x_event.xkey.state =
+ auto* conn = x11::Connection::Get();
+ XDisplay* display = conn->display();
+
+ xcb_generic_event_t generic_event;
+ memset(&generic_event, 0, sizeof(generic_event));
+ auto* key_event = reinterpret_cast<xcb_key_press_event_t*>(&generic_event);
+ key_event->response_type = gdk_event_key.type == GDK_KEY_PRESS
+ ? x11::KeyEvent::Press
+ : x11::KeyEvent::Release;
+ if (gdk_event_key.send_event)
+ key_event->response_type |= x11::kSendEventMask;
+ key_event->event = GDK_WINDOW_XID(gdk_event_key.window);
+ key_event->root = DefaultRootWindow(display);
+ key_event->time = gdk_event_key.time;
+ key_event->detail = gdk_event_key.hardware_keycode;
+ key_event->same_screen = true;
+
+ x11::Event event(&generic_event, conn, false);
+
+ // The key state is 16 bits on the wire, but ibus-gtk adds additional flags
+ // that may be outside this range, so set the state after conversion from
+ // the wire format.
+ // TODO(https://crbug.com/1066670): Add a test to ensure this subtle logic
+ // doesn't regress after all X11 event code is refactored from using Xlib to
+ // XProto.
+ int state =
BuildXkbStateFromGdkEvent(gdk_event_key.state, gdk_event_key.group);
+ event.xlib_event().xkey.state = state;
+ event.As<x11::KeyEvent>()->state = static_cast<x11::KeyButMask>(state);
// We want to process the gtk event; mapped to an X11 event immediately
// otherwise if we put it back on the queue we may get items out of order.
if (ui::X11EventSource* x11_source = ui::X11EventSource::GetInstance())
- x11_source->DispatchXEventNow(&x_event);
+ x11_source->DispatchXEvent(&event);
else
- XPutBackEvent(x_event.xkey.display, &x_event);
+ conn->events().push_front(std::move(event));
}
} // 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 8967d4af8ac..8ae0f44fe54 100644
--- a/chromium/ui/gtk/x/gtk_ui_delegate_x11.cc
+++ b/chromium/ui/gtk/x/gtk_ui_delegate_x11.cc
@@ -33,17 +33,20 @@ GdkKeymap* GtkUiDelegateX11::GetGdkKeymap() {
GdkWindow* GtkUiDelegateX11::GetGdkWindow(gfx::AcceleratedWidget window_id) {
GdkDisplay* display = GetGdkDisplay();
- GdkWindow* gdk_window = gdk_x11_window_lookup_for_display(display, window_id);
+ GdkWindow* gdk_window = gdk_x11_window_lookup_for_display(
+ display, static_cast<uint32_t>(window_id));
if (gdk_window)
g_object_ref(gdk_window);
else
- gdk_window = gdk_x11_window_foreign_new_for_display(display, window_id);
+ gdk_window = gdk_x11_window_foreign_new_for_display(
+ display, static_cast<uint32_t>(window_id));
return gdk_window;
}
bool GtkUiDelegateX11::SetGdkWindowTransientFor(GdkWindow* window,
gfx::AcceleratedWidget parent) {
- XSetTransientForHint(xdisplay_, GDK_WINDOW_XID(window), parent);
+ XSetTransientForHint(xdisplay_, GDK_WINDOW_XID(window),
+ static_cast<uint32_t>(parent));
return true;
}
diff --git a/chromium/ui/latency/average_lag_tracker.cc b/chromium/ui/latency/average_lag_tracker.cc
index 4c8c7ef82b0..347b32d3050 100644
--- a/chromium/ui/latency/average_lag_tracker.cc
+++ b/chromium/ui/latency/average_lag_tracker.cc
@@ -26,78 +26,10 @@ void AverageLagTracker::AddLatencyInFrame(
return;
if (scroll_name == "ScrollBegin") {
- // Flush all unfinished frames.
- while (!frame_lag_infos_.empty()) {
- frame_lag_infos_.front().lag_area += LagForUnfinishedFrame(
- frame_lag_infos_.front().rendered_accumulated_delta);
- frame_lag_infos_.front().lag_area_no_prediction += LagForUnfinishedFrame(
- frame_lag_infos_.front().rendered_accumulated_delta_no_prediction);
-
- // Record UMA when it's the last item in queue.
- CalculateAndReportAverageLagUma(frame_lag_infos_.size() == 1);
- }
- // |accumulated_lag_| should be cleared/reset.
- DCHECK(accumulated_lag_ == 0);
-
- // Create ScrollBegin report, with report time equals to gpu swap time.
- LagAreaInFrame first_frame(gpu_swap_begin_timestamp);
- frame_lag_infos_.push_back(first_frame);
-
- // Reset fields.
- last_reported_time_ = event_timestamp;
- last_finished_frame_time_ = event_timestamp;
- last_event_accumulated_delta_ = 0;
- last_rendered_accumulated_delta_ = 0;
- is_begin_ = true;
+ AddScrollBeginInFrame(gpu_swap_begin_timestamp, event_timestamp);
} else if (scroll_name == "ScrollUpdate" &&
!last_event_timestamp_.is_null()) {
- // Only accept events in nondecreasing order.
- if ((event_timestamp - last_event_timestamp_).InMilliseconds() < 0)
- return;
-
- // Pop all frames where frame_time <= event_timestamp.
- while (!frame_lag_infos_.empty() &&
- frame_lag_infos_.front().frame_time <= event_timestamp) {
- base::TimeTicks front_time =
- std::max(last_event_timestamp_, last_finished_frame_time_);
- base::TimeTicks back_time = frame_lag_infos_.front().frame_time;
- frame_lag_infos_.front().lag_area +=
- LagBetween(front_time, back_time, latency, event_timestamp,
- frame_lag_infos_.front().rendered_accumulated_delta);
- frame_lag_infos_.front().lag_area_no_prediction += LagBetween(
- front_time, back_time, latency, event_timestamp,
- frame_lag_infos_.front().rendered_accumulated_delta_no_prediction);
-
- CalculateAndReportAverageLagUma();
- }
-
- // Initialize a new LagAreaInFrame when current_frame_time > frame_time.
- if (frame_lag_infos_.empty() ||
- gpu_swap_begin_timestamp > frame_lag_infos_.back().frame_time) {
- LagAreaInFrame new_frame(gpu_swap_begin_timestamp,
- last_rendered_accumulated_delta_,
- last_event_accumulated_delta_);
- frame_lag_infos_.push_back(new_frame);
- }
-
- // last_frame_time <= event_timestamp < frame_time
- if (!frame_lag_infos_.empty()) {
- // The front element in queue (if any) must satisfy frame_time >
- // event_timestamp, otherwise it would be popped in the while loop.
- DCHECK(last_finished_frame_time_ <= event_timestamp &&
- event_timestamp <= frame_lag_infos_.front().frame_time);
- base::TimeTicks front_time =
- std::max(last_finished_frame_time_, last_event_timestamp_);
- base::TimeTicks back_time = event_timestamp;
-
- frame_lag_infos_.front().lag_area +=
- LagBetween(front_time, back_time, latency, event_timestamp,
- frame_lag_infos_.front().rendered_accumulated_delta);
-
- frame_lag_infos_.front().lag_area_no_prediction += LagBetween(
- front_time, back_time, latency, event_timestamp,
- frame_lag_infos_.front().rendered_accumulated_delta_no_prediction);
- }
+ AddScrollUpdateInFrame(latency, gpu_swap_begin_timestamp, event_timestamp);
}
last_event_timestamp_ = event_timestamp;
@@ -105,6 +37,87 @@ void AverageLagTracker::AddLatencyInFrame(
last_rendered_accumulated_delta_ += latency.predicted_scroll_update_delta();
}
+void AverageLagTracker::AddScrollBeginInFrame(
+ base::TimeTicks gpu_swap_begin_timestamp,
+ base::TimeTicks event_timestamp) {
+ // Flush all unfinished frames.
+ while (!frame_lag_infos_.empty()) {
+ frame_lag_infos_.front().lag_area += LagForUnfinishedFrame(
+ frame_lag_infos_.front().rendered_accumulated_delta);
+ frame_lag_infos_.front().lag_area_no_prediction += LagForUnfinishedFrame(
+ frame_lag_infos_.front().rendered_accumulated_delta_no_prediction);
+
+ // Record UMA when it's the last item in queue.
+ CalculateAndReportAverageLagUma(frame_lag_infos_.size() == 1);
+ }
+ // |accumulated_lag_| should be cleared/reset.
+ DCHECK(accumulated_lag_ == 0);
+
+ // Create ScrollBegin report, with report time equals to gpu swap time.
+ LagAreaInFrame first_frame(gpu_swap_begin_timestamp);
+ frame_lag_infos_.push_back(first_frame);
+
+ // Reset fields.
+ last_reported_time_ = event_timestamp;
+ last_finished_frame_time_ = event_timestamp;
+ last_event_accumulated_delta_ = 0;
+ last_rendered_accumulated_delta_ = 0;
+ is_begin_ = true;
+}
+
+void AverageLagTracker::AddScrollUpdateInFrame(
+ const LatencyInfo& latency,
+ base::TimeTicks gpu_swap_begin_timestamp,
+ base::TimeTicks event_timestamp) {
+ // Only accept events in nondecreasing order.
+ if ((event_timestamp - last_event_timestamp_).InMilliseconds() < 0)
+ return;
+
+ // Pop all frames where frame_time <= event_timestamp.
+ while (!frame_lag_infos_.empty() &&
+ frame_lag_infos_.front().frame_time <= event_timestamp) {
+ base::TimeTicks front_time =
+ std::max(last_event_timestamp_, last_finished_frame_time_);
+ base::TimeTicks back_time = frame_lag_infos_.front().frame_time;
+ frame_lag_infos_.front().lag_area +=
+ LagBetween(front_time, back_time, latency, event_timestamp,
+ frame_lag_infos_.front().rendered_accumulated_delta);
+ frame_lag_infos_.front().lag_area_no_prediction += LagBetween(
+ front_time, back_time, latency, event_timestamp,
+ frame_lag_infos_.front().rendered_accumulated_delta_no_prediction);
+
+ CalculateAndReportAverageLagUma();
+ }
+
+ // Initialize a new LagAreaInFrame when current_frame_time > frame_time.
+ if (frame_lag_infos_.empty() ||
+ gpu_swap_begin_timestamp > frame_lag_infos_.back().frame_time) {
+ LagAreaInFrame new_frame(gpu_swap_begin_timestamp,
+ last_rendered_accumulated_delta_,
+ last_event_accumulated_delta_);
+ frame_lag_infos_.push_back(new_frame);
+ }
+
+ // last_frame_time <= event_timestamp < frame_time
+ if (!frame_lag_infos_.empty()) {
+ // The front element in queue (if any) must satisfy frame_time >
+ // event_timestamp, otherwise it would be popped in the while loop.
+ DCHECK(last_finished_frame_time_ <= event_timestamp &&
+ event_timestamp <= frame_lag_infos_.front().frame_time);
+ base::TimeTicks front_time =
+ std::max(last_finished_frame_time_, last_event_timestamp_);
+ base::TimeTicks back_time = event_timestamp;
+
+ frame_lag_infos_.front().lag_area +=
+ LagBetween(front_time, back_time, latency, event_timestamp,
+ frame_lag_infos_.front().rendered_accumulated_delta);
+
+ frame_lag_infos_.front().lag_area_no_prediction += LagBetween(
+ front_time, back_time, latency, event_timestamp,
+ frame_lag_infos_.front().rendered_accumulated_delta_no_prediction);
+ }
+}
+
float AverageLagTracker::LagBetween(base::TimeTicks front_time,
base::TimeTicks back_time,
const LatencyInfo& latency,
diff --git a/chromium/ui/latency/average_lag_tracker.h b/chromium/ui/latency/average_lag_tracker.h
index 80244d90233..f97738f17cf 100644
--- a/chromium/ui/latency/average_lag_tracker.h
+++ b/chromium/ui/latency/average_lag_tracker.h
@@ -50,6 +50,12 @@ class AverageLagTracker {
float lag_area_no_prediction;
} LagAreaInFrame;
+ void AddScrollBeginInFrame(base::TimeTicks gpu_swap_begin_timestamp,
+ base::TimeTicks event_timestamp);
+ void AddScrollUpdateInFrame(const LatencyInfo& latency,
+ base::TimeTicks gpu_swap_begin_timestamp,
+ base::TimeTicks event_timestamp);
+
// Calculate lag in 1 seconds intervals and report UMA.
void CalculateAndReportAverageLagUma(bool send_anyway = false);
diff --git a/chromium/ui/latency/latency_info.cc b/chromium/ui/latency/latency_info.cc
index 8be273a5529..f369ec6df9f 100644
--- a/chromium/ui/latency/latency_info.cc
+++ b/chromium/ui/latency/latency_info.cc
@@ -12,6 +12,7 @@
#include "base/json/json_writer.h"
#include "base/lazy_instance.h"
+#include "base/logging.h"
#include "base/macros.h"
#include "base/strings/stringprintf.h"
#include "base/trace_event/trace_event.h"
diff --git a/chromium/ui/latency/latency_tracker.cc b/chromium/ui/latency/latency_tracker.cc
index 0a0eb4b4c5b..a724b21d32e 100644
--- a/chromium/ui/latency/latency_tracker.cc
+++ b/chromium/ui/latency/latency_tracker.cc
@@ -63,11 +63,6 @@ void RecordUmaEventLatencyScrollWheelTimeToScrollUpdateSwapBegin2Histogram(
1000000, 100);
}
-LatencyTracker::LatencyInfoProcessor& GetLatencyInfoProcessor() {
- static base::NoDestructor<LatencyTracker::LatencyInfoProcessor> processor;
- return *processor;
-}
-
bool LatencyTraceIdCompare(const LatencyInfo& i, const LatencyInfo& j) {
return i.trace_id() < j.trace_id();
}
@@ -80,9 +75,6 @@ LatencyTracker::~LatencyTracker() = default;
void LatencyTracker::OnGpuSwapBuffersCompleted(
const std::vector<ui::LatencyInfo>& latency_info,
bool top_controls_visible_height_changed) {
- auto& callback = GetLatencyInfoProcessor();
- if (!callback.is_null())
- callback.Run(latency_info);
// Sort latency_info as they can be in incorrect order.
std::vector<ui::LatencyInfo> latency_infos(latency_info);
std::sort(latency_infos.begin(), latency_infos.end(), LatencyTraceIdCompare);
@@ -391,10 +383,4 @@ void LatencyTracker::ComputeEndToEndLatencyHistograms(
gpu_swap_begin_timestamp, gpu_swap_end_timestamp);
}
-// static
-void LatencyTracker::SetLatencyInfoProcessorForTesting(
- const LatencyInfoProcessor& processor) {
- GetLatencyInfoProcessor() = processor;
-}
-
} // namespace ui
diff --git a/chromium/ui/latency/latency_tracker.h b/chromium/ui/latency/latency_tracker.h
index cb3898ba5d5..e0bb699a1f3 100644
--- a/chromium/ui/latency/latency_tracker.h
+++ b/chromium/ui/latency/latency_tracker.h
@@ -25,14 +25,6 @@ class LatencyTracker {
void OnGpuSwapBuffersCompleted(
const std::vector<LatencyInfo>& latency_info,
bool top_controls_visible_height_changed = false);
- void OnGpuSwapBuffersCompleted(
- const LatencyInfo& latency,
- bool top_controls_visible_height_changed = false);
-
- using LatencyInfoProcessor =
- base::RepeatingCallback<void(const std::vector<ui::LatencyInfo>&)>;
- static void SetLatencyInfoProcessorForTesting(
- const LatencyInfoProcessor& processor);
private:
enum class InputMetricEvent {
@@ -44,6 +36,9 @@ class LatencyTracker {
INPUT_METRIC_EVENT_MAX = SCROLL_UPDATE_WHEEL
};
+ void OnGpuSwapBuffersCompleted(const LatencyInfo& latency,
+ bool top_controls_visible_height_changed);
+
void ReportUkmScrollLatency(
const InputMetricEvent& metric_event,
base::TimeTicks start_timestamp,
diff --git a/chromium/ui/latency/mojom/BUILD.gn b/chromium/ui/latency/mojom/BUILD.gn
index f8aeb4c757e..e829e4c5281 100644
--- a/chromium/ui/latency/mojom/BUILD.gn
+++ b/chromium/ui/latency/mojom/BUILD.gn
@@ -4,6 +4,20 @@
import("//mojo/public/tools/bindings/mojom.gni")
+component("shared_mojom_traits") {
+ output_name = "latency_shared_mojom_traits"
+ defines = [ "IS_LATENCY_SHARED_MOJOM_TRAITS_IMPL" ]
+ sources = [
+ "latency_info_mojom_traits.cc",
+ "latency_info_mojom_traits.h",
+ ]
+ public_deps = [
+ ":mojom_shared",
+ "//ipc:param_traits",
+ "//ui/latency",
+ ]
+}
+
mojom("mojom") {
generate_java = true
sources = [ "latency_info.mojom" ]
@@ -22,12 +36,14 @@ mojom("mojom") {
cpp = "::ui::LatencyInfo"
},
]
- traits_sources = [ "latency_info_mojom_traits.cc" ]
traits_headers = [ "latency_info_mojom_traits.h" ]
- traits_public_deps = [ "//ui/latency" ]
- traits_deps = [ "//ipc:param_traits" ]
+ traits_public_deps = [
+ ":shared_mojom_traits",
+ "//ui/latency",
+ ]
},
]
+ blink_cpp_typemaps = cpp_typemaps
}
mojom("test_interfaces") {
diff --git a/chromium/ui/latency/mojom/latency_info_mojom_traits.h b/chromium/ui/latency/mojom/latency_info_mojom_traits.h
index 5bc2a683060..bde8c125520 100644
--- a/chromium/ui/latency/mojom/latency_info_mojom_traits.h
+++ b/chromium/ui/latency/mojom/latency_info_mojom_traits.h
@@ -5,6 +5,7 @@
#ifndef UI_LATENCY_MOJOM_LATENCY_INFO_MOJOM_TRAITS_H_
#define UI_LATENCY_MOJOM_LATENCY_INFO_MOJOM_TRAITS_H_
+#include "base/component_export.h"
#include "ui/latency/latency_info.h"
#include "ui/latency/mojom/latency_info.mojom-shared.h"
@@ -19,7 +20,8 @@ static_assert(static_cast<int>(ui::mojom::SourceEventType::kMaxValue) ==
"Enum size mismatch");
template <>
-struct ArrayTraits<ui::LatencyInfo::LatencyMap> {
+struct COMPONENT_EXPORT(LATENCY_SHARED_MOJOM_TRAITS)
+ ArrayTraits<ui::LatencyInfo::LatencyMap> {
using Element = ui::LatencyInfo::LatencyMap::value_type;
using Iterator = ui::LatencyInfo::LatencyMap::iterator;
using ConstIterator = ui::LatencyInfo::LatencyMap::const_iterator;
@@ -43,7 +45,8 @@ struct ArrayTraits<ui::LatencyInfo::LatencyMap> {
};
template <>
-struct StructTraits<ui::mojom::LatencyInfoDataView, ui::LatencyInfo> {
+struct COMPONENT_EXPORT(LATENCY_SHARED_MOJOM_TRAITS)
+ StructTraits<ui::mojom::LatencyInfoDataView, ui::LatencyInfo> {
static const ui::LatencyInfo::LatencyMap& latency_components(
const ui::LatencyInfo& info);
static int64_t trace_id(const ui::LatencyInfo& info);
@@ -60,7 +63,8 @@ struct StructTraits<ui::mojom::LatencyInfoDataView, ui::LatencyInfo> {
};
template <>
-struct EnumTraits<ui::mojom::LatencyComponentType, ui::LatencyComponentType> {
+struct COMPONENT_EXPORT(LATENCY_SHARED_MOJOM_TRAITS)
+ EnumTraits<ui::mojom::LatencyComponentType, ui::LatencyComponentType> {
static ui::mojom::LatencyComponentType ToMojom(ui::LatencyComponentType type);
static bool FromMojom(ui::mojom::LatencyComponentType input,
ui::LatencyComponentType* output);
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 4f41e1e6d1f..90981aa758e 100644
--- a/chromium/ui/login/account_picker/chromeos_user_pod_row.js
+++ b/chromium/ui/login/account_picker/chromeos_user_pod_row.js
@@ -1635,9 +1635,8 @@ cr.define('login', function() {
if (this.user.legacySupervisedUser && !this.user.isDesktopUser) {
this.showSupervisedUserSigninWarning();
} else {
- // Special case for multi-profiles sign in. We show users even if they
- // are not allowed per policy. Restrict those users from starting GAIA.
- if (this.multiProfilesPolicyApplied)
+ // Disable online sign-in flow for user-adding screen.
+ if (Oobe.getInstance().displayType == DISPLAY_TYPE.USER_ADDING)
return;
this.parentNode.showSigninUI(this.user.emailAddress);
diff --git a/chromium/ui/login/display_manager.js b/chromium/ui/login/display_manager.js
index 6857c87482c..a57441e1816 100644
--- a/chromium/ui/login/display_manager.js
+++ b/chromium/ui/login/display_manager.js
@@ -13,9 +13,9 @@
/** @const */ var SCREEN_OOBE_HID_DETECTION = 'hid-detection';
/** @const */ var SCREEN_OOBE_EULA = 'eula';
/** @const */ var SCREEN_OOBE_ENABLE_DEBUGGING = 'debugging';
-/** @const */ var SCREEN_OOBE_UPDATE = 'update';
+/** @const */ var SCREEN_OOBE_UPDATE = 'oobe-update';
/** @const */ var SCREEN_OOBE_RESET = 'reset';
-/** @const */ var SCREEN_OOBE_ENROLLMENT = 'oauth-enrollment';
+/** @const */ var SCREEN_OOBE_ENROLLMENT = 'enterprise-enrollment';
/** @const */ var SCREEN_OOBE_DEMO_SETUP = 'demo-setup';
/** @const */ var SCREEN_OOBE_DEMO_PREFERENCES = 'demo-preferences';
/** @const */ var SCREEN_OOBE_KIOSK_ENABLE = 'kiosk-enable';
@@ -24,15 +24,13 @@
/** @const */ var SCREEN_GAIA_SIGNIN = 'gaia-signin';
/** @const */ var SCREEN_ACCOUNT_PICKER = 'account-picker';
/** @const */ var SCREEN_ERROR_MESSAGE = 'error-message';
-/** @const */ var SCREEN_TPM_ERROR = 'tpm-error-message';
-/** @const */ var SCREEN_PASSWORD_CHANGED = 'password-changed';
+/** @const */ var SCREEN_PASSWORD_CHANGED = 'gaia-password-changed';
/** @const */ var SCREEN_APP_LAUNCH_SPLASH = 'app-launch-splash';
-/** @const */ var SCREEN_CONFIRM_PASSWORD = 'confirm-password';
+/** @const */ var SCREEN_CONFIRM_PASSWORD = 'saml-confirm-password';
/** @const */ var SCREEN_FATAL_ERROR = 'fatal-error';
/** @const */ var SCREEN_KIOSK_ENABLE = 'kiosk-enable';
/** @const */ var SCREEN_TERMS_OF_SERVICE = 'terms-of-service';
/** @const */ var SCREEN_ARC_TERMS_OF_SERVICE = 'arc-tos';
-/** @const */ var SCREEN_WRONG_HWID = 'wrong-hwid';
/** @const */ var SCREEN_DEVICE_DISABLED = 'device-disabled';
/** @const */ var SCREEN_UPDATE_REQUIRED = 'update-required';
/** @const */ var SCREEN_ACTIVE_DIRECTORY_PASSWORD_CHANGE =
@@ -96,22 +94,17 @@ cr.define('cr.ui.login', function() {
var RESET_AVAILABLE_SCREEN_GROUP = [
SCREEN_OOBE_NETWORK,
SCREEN_OOBE_EULA,
- SCREEN_OOBE_UPDATE,
- SCREEN_OOBE_ENROLLMENT,
SCREEN_OOBE_AUTO_ENROLLMENT_CHECK,
SCREEN_GAIA_SIGNIN,
SCREEN_ACCOUNT_PICKER,
SCREEN_KIOSK_ENABLE,
SCREEN_ERROR_MESSAGE,
- SCREEN_TPM_ERROR,
SCREEN_PASSWORD_CHANGED,
SCREEN_ARC_TERMS_OF_SERVICE,
- SCREEN_WRONG_HWID,
SCREEN_CONFIRM_PASSWORD,
SCREEN_UPDATE_REQUIRED,
SCREEN_FATAL_ERROR,
SCREEN_SYNC_CONSENT,
- SCREEN_RECOMMEND_APPS,
SCREEN_APP_DOWNLOADING,
SCREEN_DISCOVER,
SCREEN_MARKETING_OPT_IN,
@@ -131,15 +124,36 @@ cr.define('cr.ui.login', function() {
];
/**
- * Group of screens (screen IDs) that are not participating in
- * left-current-right animation.
- * @type Array<string>
- * @const
+ * As Polymer behaviors do not provide true inheritance, when two behaviors
+ * would declare same method one of them will be hidden. Also, if element
+ * re-declares the method it needs explicitly iterate over behaviors and call
+ * method on them. This function simplifies such interaction by calling
+ * method on element and all behaviors in the same order as lifecycle
+ * callbacks are called.
+ * @param {Element} element
+ * @param {string} name function name
+ * @param {...*} arguments arguments for the function
*/
- var NOT_ANIMATED_SCREEN_GROUP = [
- SCREEN_OOBE_ENABLE_DEBUGGING,
- SCREEN_OOBE_RESET,
- ];
+ var invokePolymerMethod = function(element, name, ...arguments) {
+ let method = element[name];
+ if (!method || typeof method !== 'function')
+ return;
+ method.apply(element, arguments);
+ if (!element.behaviors)
+ return;
+
+ // If element has behaviors call functions on them in reverse order,
+ // ignoring case when method on element was derived from behavior.
+ for (var i = element.behaviors.length - 1; i >= 0; i--) {
+ let behavior = element.behaviors[i];
+ let b_method = behavior[name];
+ if (!b_method || typeof b_method !== 'function')
+ continue;
+ if (b_method == method)
+ continue;
+ b_method.apply(element, arguments);
+ }
+ };
/**
* Constructor a display manager that manages initialization of screens,
@@ -267,9 +281,10 @@ cr.define('cr.ui.login', function() {
* @return {boolean}
*/
get hasUserPods() {
- var userCount =
- this.showingViewsLogin ? this.userCount_ : $('pod-row').pods.length;
- return !!userCount;
+ if (this.showingViewsLogin)
+ return this.userCount_ > 0;
+ return this.displayType_ == DISPLAY_TYPE.USER_ADDING &&
+ $('pod-row').pods.length > 0;
},
/**
@@ -462,35 +477,6 @@ cr.define('cr.ui.login', function() {
}
},
- screenIsAnimated_: function(screenId) {
- return NOT_ANIMATED_SCREEN_GROUP.indexOf(screenId) != -1;
- },
-
- /**
- * Updates a step's css classes to reflect left, current, or right position.
- * @param {number} stepIndex step index.
- * @param {string} state one of 'left', 'current', 'right'.
- */
- updateStep_: function(stepIndex, state) {
- var stepId = this.screens_[stepIndex];
- var step = $(stepId);
- var header = $('header-' + stepId);
- var states = ['left', 'right', 'current'];
- for (var i = 0; i < states.length; ++i) {
- if (states[i] != state) {
- step.classList.remove(states[i]);
- if (header) {
- header.classList.remove(states[i]);
- }
- }
- }
-
- step.classList.add(state);
- if (header) {
- header.classList.add(state);
- }
- },
-
/**
* Switches to the next OOBE step.
* @param {number} nextStepIndex Index of the next step.
@@ -507,11 +493,10 @@ cr.define('cr.ui.login', function() {
// Disable controls before starting animation.
this.disableButtons_(oldStep, true);
- if (oldStep.onBeforeHide)
- oldStep.onBeforeHide();
+ invokePolymerMethod(oldStep, 'onBeforeHide');
- if (oldStep.defaultControl && oldStep.defaultControl.onBeforeHide)
- oldStep.defaultControl.onBeforeHide();
+ if (oldStep.defaultControl)
+ invokePolymerMethod(oldStep.defaultControl, 'onBeforeHide');
$('oobe').className = nextStepId;
@@ -525,8 +510,7 @@ cr.define('cr.ui.login', function() {
this.setOobeUIState(OOBE_UI_STATE.HIDDEN);
}
- if (newStep.onBeforeShow)
- newStep.onBeforeShow(screenData);
+ invokePolymerMethod(newStep, 'onBeforeShow', screenData);
// We still have several screens that are not implemented as a single
// Polymer-element, so we need to explicitly inform all oobe-dialogs.
@@ -534,39 +518,16 @@ cr.define('cr.ui.login', function() {
// TODO(alemate): make every screen a single Polymer element, so that
// we could simply use OobeDialogHostBehavior in stead of this.
for(let dialog of newStep.getElementsByTagName('oobe-dialog'))
- dialog.onBeforeShow(screenData);
+ invokePolymerMethod(dialog, 'onBeforeShow', screenData);
- if (newStep.defaultControl && newStep.defaultControl.onBeforeShow)
- newStep.defaultControl.onBeforeShow(screenData);
+ if (newStep.defaultControl)
+ invokePolymerMethod(newStep.defaultControl, 'onBeforeShow', screenData);
newStep.classList.remove('hidden');
- var currentIsAnimated = !currentStepAttributes.noAnimatedTransition &&
- this.screenIsAnimated_(currentStepId);
- var newIsAnimated = !newStepAttributes.noAnimatedTransition &&
- this.screenIsAnimated_(nextStepId);
-
- if (this.isOobeUI() && currentIsAnimated && newIsAnimated) {
- // Start gliding animation for OOBE steps.
- if (nextStepIndex > this.currentStep_) {
- for (var i = this.currentStep_; i < nextStepIndex; ++i)
- this.updateStep_(i, 'left');
- this.updateStep_(nextStepIndex, 'current');
- } else if (nextStepIndex < this.currentStep_) {
- for (var i = this.currentStep_; i > nextStepIndex; --i)
- this.updateStep_(i, 'right');
- this.updateStep_(nextStepIndex, 'current');
- }
- } else {
- // Start fading animation for login display or reset screen.
- oldStep.classList.add('faded');
- newStep.classList.remove('faded');
- if (newStepAttributes.noAnimatedTransition ||
- !this.screenIsAnimated_(nextStepId)) {
- newStep.classList.remove('left');
- newStep.classList.remove('right');
- }
- }
+ // Start fading animation for login display or reset screen.
+ oldStep.classList.add('faded');
+ newStep.classList.remove('faded');
this.disableButtons_(newStep, false);
@@ -581,30 +542,10 @@ cr.define('cr.ui.login', function() {
var isOOBE = this.isOobeUI();
if (this.currentStep_ != nextStepIndex &&
!oldStep.classList.contains('hidden')) {
- if (oldStep.classList.contains('animated')) {
- innerContainer.classList.add('animation');
- oldStep.addEventListener('transitionend', function f(e) {
- oldStep.removeEventListener('transitionend', f);
- if (oldStep.classList.contains('faded') ||
- oldStep.classList.contains('left') ||
- oldStep.classList.contains('right')) {
- innerContainer.classList.remove('animation');
- oldStep.classList.add('hidden');
- if (!isOOBE)
- oldStep.hidden = true;
- }
- // Refresh defaultControl. It could have changed.
- var defaultControl = newStep.defaultControl;
- if (defaultControl)
- defaultControl.focus();
- });
- ensureTransitionEndEvent(oldStep, MAX_SCREEN_TRANSITION_DURATION);
- } else {
- oldStep.classList.add('hidden');
- oldStep.hidden = true;
- if (defaultControl)
- defaultControl.focus();
- }
+ oldStep.classList.add('hidden');
+ oldStep.hidden = true;
+ if (defaultControl)
+ defaultControl.focus();
} else {
// First screen on OOBE launch.
if (this.isOobeUI() && innerContainer.classList.contains('down')) {
@@ -629,8 +570,7 @@ cr.define('cr.ui.login', function() {
// Call onAfterShow after currentStep_ so that the step can have a
// post-set hook.
- if (newStep.onAfterShow)
- newStep.onAfterShow(screenData);
+ invokePolymerMethod(newStep, 'onAfterShow', screenData);
var stepLogo = $('step-logo');
if (stepLogo) {
@@ -845,12 +785,6 @@ cr.define('cr.ui.login', function() {
* Prepares screens to use in login display.
*/
prepareForLoginDisplay_: function() {
- for (var i = 0, screenId; screenId = this.screens_[i]; ++i) {
- var screen = $(screenId);
- screen.classList.add('faded');
- screen.classList.remove('right');
- screen.classList.remove('left');
- }
if (this.showingViewsLogin) {
$('top-header-bar').hidden = true;
}
@@ -1179,32 +1113,6 @@ cr.define('cr.ui.login', function() {
};
/**
- * Shows password changed screen that offers migration.
- * @param {boolean} showError Whether to show the incorrect password error.
- * @param {string} email What user does reauth. Being used for display in the
- * new UI.
- */
- DisplayManager.showPasswordChangedScreen = function(showError, email) {
- login.PasswordChangedScreen.show(showError, email);
- };
-
- /**
- * Shows TPM error screen.
- */
- DisplayManager.showTpmError = function() {
- login.TPMErrorMessageScreen.show();
- };
-
- /**
- * Shows password change screen for Active Directory users.
- * @param {string} username Display name of the user whose password is being
- * changed.
- */
- DisplayManager.showActiveDirectoryPasswordChangeScreen = function(username) {
- login.ActiveDirectoryPasswordChangeScreen.show(username);
- };
-
- /**
* Clears error bubble.
*/
DisplayManager.clearErrors = function() {
@@ -1261,6 +1169,7 @@ cr.define('cr.ui.login', function() {
// Export
return {
- DisplayManager: DisplayManager
+ DisplayManager: DisplayManager,
+ invokePolymerMethod: invokePolymerMethod,
};
});
diff --git a/chromium/ui/login/display_manager_types.js b/chromium/ui/login/display_manager_types.js
index 54ace1e3fbf..d94b11a1d8e 100644
--- a/chromium/ui/login/display_manager_types.js
+++ b/chromium/ui/login/display_manager_types.js
@@ -11,7 +11,6 @@
* @typedef {{
* enableDebuggingAllowed: (boolean|undefined),
* enterDemoModeAllowed: (boolean|undefined),
- * noAnimatedTransition: (boolean|undefined),
* postponeEnrollmentAllowed: (boolean|undefined),
* resetAllowed: (boolean|undefined),
* startEnrollmentAllowed: (boolean|undefined),
@@ -34,12 +33,6 @@ DisplayManagerScreenAttributes.enableDebuggingAllowed;
DisplayManagerScreenAttributes.enterDemoModeAllowed;
/**
- * True if screen does not use left-current-right animation.
- * @type {boolean|undefined}
- */
-DisplayManagerScreenAttributes.noAnimatedTransition;
-
-/**
* True if enrollment accelerator should schedule postponed enrollment.
* @type {boolean|undefined}
*/
diff --git a/chromium/ui/login/screen_container.css b/chromium/ui/login/screen_container.css
index 0da5e26ae8f..b16ec265c40 100644
--- a/chromium/ui/login/screen_container.css
+++ b/chromium/ui/login/screen_container.css
@@ -66,21 +66,21 @@
/* Screens that have a border and background. */
#oobe.auto-enrollment-check #inner-container,
#oobe.autolaunch #inner-container,
-#oobe.confirm-password #inner-container,
+#oobe.saml-confirm-password #inner-container,
#oobe.debugging #inner-container,
#oobe.enrollment #inner-container,
#oobe.fatal-error #inner-container,
#oobe.gaia-signin #inner-container,
#oobe.hid-detection #inner-container,
#oobe.kiosk-enable #inner-container,
-#oobe.oauth-enrollment #inner-container,
+#oobe.enterprise-enrollment #inner-container,
#oobe.password-changed #inner-container,
#oobe.ad-password-change #inner-container,
#oobe.supervised-user-creation #inner-container,
#oobe.supervised-user-creation-dialog #inner-container,
#oobe.terms-of-service #inner-container,
#oobe.arc-tos #inner-container,
-#oobe.update #inner-container,
+#oobe.oobe-update #inner-container,
#oobe.update-required #inner-container,
#oobe.user-image #inner-container,
#oobe.wrong-hwid #inner-container,
diff --git a/chromium/ui/message_center/notification_list.cc b/chromium/ui/message_center/notification_list.cc
index 2e283dd0094..b381a669625 100644
--- a/chromium/ui/message_center/notification_list.cc
+++ b/chromium/ui/message_center/notification_list.cc
@@ -321,10 +321,18 @@ void NotificationList::PushNotification(
state = iter->second;
EraseNotification(iter);
} else {
+ // For critical ChromeOS system notifications, we ignore the standard quiet
+ // mode behaviour and show the notification anyways.
+ bool effective_quiet_mode = quiet_mode_;
+#if defined(OS_CHROMEOS)
+ effective_quiet_mode &= notification->system_notification_warning_level() !=
+ SystemNotificationWarningLevel::CRITICAL_WARNING;
+#endif
+
// TODO(mukai): needs to distinguish if a notification is dismissed by
// the quiet mode or user operation.
state.shown_as_popup =
- message_center_->IsMessageCenterVisible() || quiet_mode_;
+ message_center_->IsMessageCenterVisible() || effective_quiet_mode;
}
if (notification->priority() == MIN_PRIORITY)
state.is_read = true;
diff --git a/chromium/ui/message_center/public/cpp/message_center_constants.h b/chromium/ui/message_center/public/cpp/message_center_constants.h
index 9b585cbba68..b912fa72a42 100644
--- a/chromium/ui/message_center/public/cpp/message_center_constants.h
+++ b/chromium/ui/message_center/public/cpp/message_center_constants.h
@@ -69,9 +69,6 @@ constexpr SkColor kSmallImageMaskForegroundColor = SK_ColorWHITE;
constexpr SkColor kSmallImageMaskBackgroundColor =
SkColorSetRGB(0xa3, 0xa3, 0xa3);
-// Default accent color of notifications that are not generated by system.
-constexpr SkColor kNotificationDefaultAccentColor = gfx::kChromeIconGrey;
-
// For list notifications.
// Not used when --enabled-new-style-notification is set.
const size_t kNotificationMaximumItems = 5;
diff --git a/chromium/ui/message_center/public/cpp/notification.h b/chromium/ui/message_center/public/cpp/notification.h
index 9a374b2bc07..4214799f36f 100644
--- a/chromium/ui/message_center/public/cpp/notification.h
+++ b/chromium/ui/message_center/public/cpp/notification.h
@@ -433,6 +433,17 @@ class MESSAGE_CENTER_PUBLIC_EXPORT Notification {
// method explicitly, to avoid setting it accidentally.
void SetSystemPriority();
+#if defined(OS_CHROMEOS)
+ void set_system_notification_warning_level(
+ SystemNotificationWarningLevel warning_level) {
+ system_notification_warning_level_ = warning_level;
+ }
+
+ SystemNotificationWarningLevel system_notification_warning_level() const {
+ return system_notification_warning_level_;
+ }
+#endif // defined(OS_CHROMEOS)
+
const std::string& custom_view_type() const { return custom_view_type_; }
void set_custom_view_type(const std::string& custom_view_type) {
DCHECK_EQ(type(), NotificationType::NOTIFICATION_TYPE_CUSTOM);
@@ -475,6 +486,12 @@ class MESSAGE_CENTER_PUBLIC_EXPORT Notification {
// creating the view for this notification. The type should match the type
// used to register the factory in MessageViewFactory.
std::string custom_view_type_;
+
+#if defined(OS_CHROMEOS)
+ // The warning level of a system notification.
+ SystemNotificationWarningLevel system_notification_warning_level_ =
+ SystemNotificationWarningLevel::NORMAL;
+#endif // defined(OS_CHROMEOS)
};
} // namespace message_center
diff --git a/chromium/ui/message_center/vector_icons/vector_icons.cc.template b/chromium/ui/message_center/vector_icons/vector_icons.cc.template
index 7c12b34bfad..17fae3bd6a0 100644
--- a/chromium/ui/message_center/vector_icons/vector_icons.cc.template
+++ b/chromium/ui/message_center/vector_icons/vector_icons.cc.template
@@ -7,7 +7,6 @@
#include "ui/message_center/vector_icons.h"
-#include "base/logging.h"
#include "components/vector_icons/cc_macros.h"
#include "ui/gfx/vector_icon_types.h"
diff --git a/chromium/ui/message_center/views/message_popup_collection.cc b/chromium/ui/message_center/views/message_popup_collection.cc
index 95fd1e78b37..87c96aa4acb 100644
--- a/chromium/ui/message_center/views/message_popup_collection.cc
+++ b/chromium/ui/message_center/views/message_popup_collection.cc
@@ -226,8 +226,19 @@ void MessagePopupCollection::TransitionFromAnimation() {
UpdateByAnimation();
// If FADE_OUT animation is finished, remove the animated popup.
- if (state_ == State::FADE_OUT)
+ if (state_ == State::FADE_OUT) {
+ // In inverse mode if the popups are not removed in the order they were
+ // added (the ones on the top are removed while the ones at the bottom stay)
+ // we need to move the remaining popups down. This might happen if the
+ // popups have different TTL.
+ bool move_down_needed = inverse_ && !AreAllAnimatingPopupsFirst();
CloseAnimatingPopups();
+ if (move_down_needed) {
+ state_ = State::MOVE_DOWN;
+ MoveDownPopups();
+ return;
+ }
+ }
if (state_ == State::FADE_IN || state_ == State::MOVE_DOWN ||
(state_ == State::FADE_OUT && popup_items_.empty())) {
@@ -536,6 +547,16 @@ void MessagePopupCollection::ResetHotMode() {
hot_top_ = 0;
}
+bool MessagePopupCollection::AreAllAnimatingPopupsFirst() const {
+ bool previous_item_was_animating = true;
+ for (const auto& item : popup_items_) {
+ if (item.is_animating && !previous_item_was_animating)
+ return false;
+ previous_item_was_animating = item.is_animating;
+ }
+ return true;
+}
+
void MessagePopupCollection::CloseAnimatingPopups() {
for (auto& item : popup_items_) {
if (!item.is_animating)
diff --git a/chromium/ui/message_center/views/message_popup_collection.h b/chromium/ui/message_center/views/message_popup_collection.h
index b3c1381bf0b..c64fa55ffcf 100644
--- a/chromium/ui/message_center/views/message_popup_collection.h
+++ b/chromium/ui/message_center/views/message_popup_collection.h
@@ -229,6 +229,11 @@ class MESSAGE_CENTER_EXPORT MessagePopupCollection
void ClosePopupsOutsideWorkArea();
void RemoveClosedPopupItems();
+ // Returns true if all the animating popups are at the beginning of the
+ // collection or the queue is empty. Returns false only if there is an
+ // animating popup after a non-animating one.
+ bool AreAllAnimatingPopupsFirst() const;
+
// Stops all the animation and closes all the popups immediately.
void CloseAllPopupsNow();
diff --git a/chromium/ui/message_center/views/message_popup_collection_unittest.cc b/chromium/ui/message_center/views/message_popup_collection_unittest.cc
index a79a6379d58..9d5a3d675b9 100644
--- a/chromium/ui/message_center/views/message_popup_collection_unittest.cc
+++ b/chromium/ui/message_center/views/message_popup_collection_unittest.cc
@@ -571,6 +571,48 @@ TEST_F(MessagePopupCollectionTest, NotificationsMoveDown) {
EXPECT_FALSE(IsAnimating());
}
+TEST_F(MessagePopupCollectionTest, NotificationsMoveDownInverse) {
+ popup_collection()->set_inverse();
+
+ std::vector<std::string> ids;
+ for (size_t i = 0; i < kMaxVisiblePopupNotifications; ++i)
+ ids.push_back(AddNotification());
+
+ std::string dismissed_id = ids[kMaxVisiblePopupNotifications - 1];
+ std::string new_bottom_id = ids[kMaxVisiblePopupNotifications - 2];
+
+ AnimateUntilIdle();
+
+ EXPECT_EQ(kMaxVisiblePopupNotifications, GetPopupCounts());
+ EXPECT_FALSE(IsAnimating());
+
+ gfx::Rect dismissed = GetPopup(dismissed_id)->GetBoundsInScreen();
+
+ MessageCenter::Get()->MarkSinglePopupAsShown(dismissed_id, false);
+ EXPECT_TRUE(IsAnimating());
+
+ AnimateToMiddle();
+ EXPECT_GT(1.0f, GetPopup(dismissed_id)->GetOpacity());
+ EXPECT_EQ(dismissed_id, GetPopup(dismissed_id)->id());
+
+ AnimateToEnd();
+ EXPECT_EQ(ids[1], GetPopup(new_bottom_id)->id());
+ EXPECT_TRUE(IsAnimating());
+
+ gfx::Rect before = GetPopup(new_bottom_id)->GetBoundsInScreen();
+
+ AnimateToMiddle();
+ gfx::Rect moving = GetPopup(new_bottom_id)->GetBoundsInScreen();
+ EXPECT_GT(moving.bottom(), before.bottom());
+ EXPECT_GT(dismissed.bottom(), moving.bottom());
+
+ AnimateToEnd();
+ gfx::Rect after = GetPopup(new_bottom_id)->GetBoundsInScreen();
+ EXPECT_EQ(dismissed, after);
+ EXPECT_EQ(kMaxVisiblePopupNotifications - 1, GetPopupCounts());
+ EXPECT_FALSE(IsAnimating());
+}
+
TEST_F(MessagePopupCollectionTest, NotificationsMoveUpForInverse) {
popup_collection()->set_inverse();
diff --git a/chromium/ui/message_center/views/message_view.h b/chromium/ui/message_center/views/message_view.h
index 51e6c26377a..0aea059a420 100644
--- a/chromium/ui/message_center/views/message_view.h
+++ b/chromium/ui/message_center/views/message_view.h
@@ -189,7 +189,7 @@ class MESSAGE_CENTER_EXPORT MessageView
bool is_nested() const { return is_nested_; }
- views::FocusRing* focus_ring() { return focus_ring_.get(); }
+ views::FocusRing* focus_ring() { return focus_ring_; }
private:
friend class test::MessagePopupCollectionTest;
@@ -230,7 +230,7 @@ class MESSAGE_CENTER_EXPORT MessageView
bool disable_slide_ = false;
views::FocusManager* focus_manager_ = nullptr;
- std::unique_ptr<views::FocusRing> focus_ring_;
+ views::FocusRing* focus_ring_ = nullptr;
// Radius values used to determine the rounding for the rounded rectangular
// shape of the notification.
diff --git a/chromium/ui/message_center/views/notification_header_view.cc b/chromium/ui/message_center/views/notification_header_view.cc
index 11cb93f4b5f..a9f6984e6cb 100644
--- a/chromium/ui/message_center/views/notification_header_view.cc
+++ b/chromium/ui/message_center/views/notification_header_view.cc
@@ -150,7 +150,6 @@ gfx::Insets CalculateTopPadding(int font_list_height) {
}
#endif
- DCHECK_EQ(15, font_list_height);
return kTextViewPaddingDefault;
}
@@ -193,7 +192,6 @@ NotificationHeaderView::NotificationHeaderView(views::ButtonListener* listener)
label->SetLineHeight(font_list_height);
label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
label->SetBorder(views::CreateEmptyBorder(text_view_padding));
- DCHECK_EQ(kInnerHeaderHeight, label->GetPreferredSize().height());
return label;
};
@@ -250,7 +248,6 @@ NotificationHeaderView::NotificationHeaderView(views::ButtonListener* listener)
spacer->SetProperty(views::kFlexBehaviorKey, kSpacerFlex);
AddChildView(spacer);
- SetAccentColor(accent_color_);
SetPreferredSize(gfx::Size(kNotificationWidth, kHeaderHeight));
}
@@ -262,9 +259,8 @@ void NotificationHeaderView::SetAppIcon(const gfx::ImageSkia& img) {
}
void NotificationHeaderView::ClearAppIcon() {
- app_icon_view_->SetImage(
- gfx::CreateVectorIcon(kProductIcon, kSmallImageSizeMD, accent_color_));
using_default_app_icon_ = true;
+ UpdateColors();
}
void NotificationHeaderView::SetAppName(const base::string16& name) {
@@ -309,6 +305,11 @@ void NotificationHeaderView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
node_data->AddState(ax::mojom::State::kExpanded);
}
+void NotificationHeaderView::OnThemeChanged() {
+ Button::OnThemeChanged();
+ UpdateColors();
+}
+
void NotificationHeaderView::SetTimestamp(base::Time timestamp) {
base::string16 relative_time;
base::TimeDelta next_update;
@@ -343,9 +344,7 @@ void NotificationHeaderView::SetExpandButtonEnabled(bool enabled) {
void NotificationHeaderView::SetExpanded(bool expanded) {
is_expanded_ = expanded;
- expand_button_->SetImage(gfx::CreateVectorIcon(
- expanded ? kNotificationExpandLessIcon : kNotificationExpandMoreIcon,
- kExpandIconSize, accent_color_));
+ UpdateColors();
expand_button_->set_tooltip_text(l10n_util::GetStringUTF16(
expanded ? IDS_MESSAGE_CENTER_COLLAPSE_NOTIFICATION
: IDS_MESSAGE_CENTER_EXPAND_NOTIFICATION));
@@ -354,15 +353,7 @@ void NotificationHeaderView::SetExpanded(bool expanded) {
void NotificationHeaderView::SetAccentColor(SkColor color) {
accent_color_ = color;
- app_name_view_->SetEnabledColor(accent_color_);
- summary_text_view_->SetEnabledColor(accent_color_);
- summary_text_divider_->SetEnabledColor(accent_color_);
- SetExpanded(is_expanded_);
-
- // If we are using the default app icon we should clear it so we refresh it
- // with the new accent color.
- if (using_default_app_icon_)
- ClearAppIcon();
+ UpdateColors();
}
void NotificationHeaderView::SetBackgroundColor(SkColor color) {
@@ -406,4 +397,21 @@ void NotificationHeaderView::UpdateSummaryTextVisibility() {
detail_views_->InvalidateLayout();
}
+void NotificationHeaderView::UpdateColors() {
+ SkColor color = accent_color_.value_or(GetNativeTheme()->GetSystemColor(
+ ui::NativeTheme::kColorId_NotificationDefaultAccentColor));
+ app_name_view_->SetEnabledColor(color);
+ summary_text_view_->SetEnabledColor(color);
+ summary_text_divider_->SetEnabledColor(color);
+
+ expand_button_->SetImage(gfx::CreateVectorIcon(
+ is_expanded_ ? kNotificationExpandLessIcon : kNotificationExpandMoreIcon,
+ kExpandIconSize, color));
+
+ if (using_default_app_icon_) {
+ app_icon_view_->SetImage(
+ gfx::CreateVectorIcon(kProductIcon, kSmallImageSizeMD, color));
+ }
+}
+
} // namespace message_center
diff --git a/chromium/ui/message_center/views/notification_header_view.h b/chromium/ui/message_center/views/notification_header_view.h
index b5c9dace7b4..f3285564b70 100644
--- a/chromium/ui/message_center/views/notification_header_view.h
+++ b/chromium/ui/message_center/views/notification_header_view.h
@@ -41,8 +41,8 @@ class MESSAGE_CENTER_EXPORT NotificationHeaderView : public views::Button {
void SetExpandButtonEnabled(bool enabled);
void SetExpanded(bool expanded);
- // Set the unified theme color used among the app icon, app name, and expand
- // button.
+ // Calls UpdateColors() to set the unified theme color used among the
+ // app icon, app name, and expand button.
void SetAccentColor(SkColor color);
// Sets the background color of the notification. This is used to ensure that
@@ -57,10 +57,11 @@ class MESSAGE_CENTER_EXPORT NotificationHeaderView : public views::Button {
// views::View:
void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
+ void OnThemeChanged() override;
views::ImageView* expand_button() { return expand_button_; }
- SkColor accent_color_for_testing() { return accent_color_; }
+ base::Optional<SkColor> accent_color_for_testing() { return accent_color_; }
const views::Label* summary_text_for_testing() const {
return summary_text_view_;
@@ -84,7 +85,9 @@ class MESSAGE_CENTER_EXPORT NotificationHeaderView : public views::Button {
// Update visibility for both |summary_text_view_| and |timestamp_view_|.
void UpdateSummaryTextVisibility();
- SkColor accent_color_ = kNotificationDefaultAccentColor;
+ void UpdateColors();
+
+ base::Optional<SkColor> accent_color_;
// Timer that updates the timestamp over time.
base::OneShotTimer timestamp_update_timer_;
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 26520d11392..20c2e115401 100644
--- a/chromium/ui/message_center/views/notification_header_view_unittest.cc
+++ b/chromium/ui/message_center/views/notification_header_view_unittest.cc
@@ -32,8 +32,8 @@ class NotificationHeaderViewTest : public views::ViewsTestBase {
params.bounds = gfx::Rect(200, 200);
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget_.Init(std::move(params));
- views::View* container = new views::View();
- widget_.SetContentsView(container);
+ views::View* container =
+ widget_.SetContentsView(std::make_unique<views::View>());
notification_header_view_ = new NotificationHeaderView(nullptr);
container->AddChildView(notification_header_view_);
diff --git a/chromium/ui/message_center/views/notification_view_md.cc b/chromium/ui/message_center/views/notification_view_md.cc
index eadc6d89ea7..606a596838c 100644
--- a/chromium/ui/message_center/views/notification_view_md.cc
+++ b/chromium/ui/message_center/views/notification_view_md.cc
@@ -586,13 +586,10 @@ NotificationViewMD::NotificationViewMD(const Notification& notification)
AddChildView(ink_drop_container_);
- control_buttons_view_ =
- std::make_unique<NotificationControlButtonsView>(this);
- control_buttons_view_->set_owned_by_client();
-
// |header_row_| contains app_icon, app_name, control buttons, etc...
header_row_ = new NotificationHeaderView(this);
- header_row_->AddChildView(control_buttons_view_.get());
+ control_buttons_view_ = header_row_->AddChildView(
+ std::make_unique<NotificationControlButtonsView>(this));
AddChildView(header_row_);
// |content_row_| contains title, message, image, progressbar, etc...
@@ -864,9 +861,8 @@ void NotificationViewMD::OnNotificationInputSubmit(size_t index,
void NotificationViewMD::CreateOrUpdateContextTitleView(
const Notification& notification) {
- header_row_->SetAccentColor(notification.accent_color() == SK_ColorTRANSPARENT
- ? kNotificationDefaultAccentColor
- : notification.accent_color());
+ if (notification.accent_color() != SK_ColorTRANSPARENT)
+ header_row_->SetAccentColor(notification.accent_color());
header_row_->SetTimestamp(notification.timestamp());
header_row_->SetAppNameElideBehavior(gfx::ELIDE_TAIL);
header_row_->SetSummaryText(base::string16());
@@ -1090,9 +1086,11 @@ void NotificationViewMD::CreateOrUpdateSmallIconView(
// TODO(knollr): figure out if this has a performance impact and
// cache images if so. (crbug.com/768748)
gfx::Image masked_small_icon = notification.GenerateMaskedSmallIcon(
- kSmallImageSizeMD, notification.accent_color() == SK_ColorTRANSPARENT
- ? message_center::kNotificationDefaultAccentColor
- : notification.accent_color());
+ kSmallImageSizeMD,
+ notification.accent_color() == SK_ColorTRANSPARENT
+ ? GetNativeTheme()->GetSystemColor(
+ ui::NativeTheme::kColorId_NotificationDefaultAccentColor)
+ : notification.accent_color());
if (masked_small_icon.IsEmpty()) {
header_row_->ClearAppIcon();
@@ -1395,7 +1393,7 @@ void NotificationViewMD::UpdateCornerRadius(int top_radius, int bottom_radius) {
NotificationControlButtonsView* NotificationViewMD::GetControlButtonsView()
const {
- return control_buttons_view_.get();
+ return control_buttons_view_;
}
bool NotificationViewMD::IsExpanded() const {
@@ -1436,6 +1434,11 @@ void NotificationViewMD::OnThemeChanged() {
inline_settings_visible
? ui::NativeTheme::kColorId_NotificationInlineSettingsBackground
: ui::NativeTheme::kColorId_NotificationDefaultBackground));
+
+ auto* notification =
+ MessageCenter::Get()->FindVisibleNotificationById(notification_id());
+ if (notification)
+ CreateOrUpdateSmallIconView(*notification);
}
void NotificationViewMD::Activate() {
diff --git a/chromium/ui/message_center/views/notification_view_md.h b/chromium/ui/message_center/views/notification_view_md.h
index bc0520e7bf5..bb92431650e 100644
--- a/chromium/ui/message_center/views/notification_view_md.h
+++ b/chromium/ui/message_center/views/notification_view_md.h
@@ -276,7 +276,7 @@ class MESSAGE_CENTER_EXPORT NotificationViewMD
views::InkDropContainerView* const ink_drop_container_;
// View containing close and settings buttons
- std::unique_ptr<NotificationControlButtonsView> control_buttons_view_;
+ NotificationControlButtonsView* control_buttons_view_;
// Whether this notification is expanded or not.
bool expanded_ = false;
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 66d0f5e7f04..77311c9aafa 100644
--- a/chromium/ui/message_center/views/notification_view_md_unittest.cc
+++ b/chromium/ui/message_center/views/notification_view_md_unittest.cc
@@ -117,13 +117,7 @@ class NotificationViewMDTest : public views::InkDropObserver,
// Overridden from views::ViewObserver:
void OnViewPreferredSizeChanged(views::View* observed_view) override;
- NotificationViewMD* notification_view() const {
- return notification_view_.get();
- }
- views::Widget* widget() const {
- DCHECK_EQ(widget_, notification_view()->GetWidget());
- return widget_;
- }
+ NotificationViewMD* notification_view() const { return notification_view_; }
// Overridden from message_center::MessageCenterObserver:
void OnNotificationRemoved(const std::string& notification_id,
@@ -168,8 +162,7 @@ class NotificationViewMDTest : public views::InkDropObserver,
bool delete_on_notification_removed_ = false;
std::set<std::string> removed_ids_;
scoped_refptr<NotificationTestDelegate> delegate_;
- std::unique_ptr<NotificationViewMD> notification_view_;
- views::Widget* widget_;
+ NotificationViewMD* notification_view_ = nullptr;
private:
DISALLOW_COPY_AND_ASSIGN(NotificationViewMDTest);
@@ -215,9 +208,9 @@ void NotificationViewMDTest::TearDown() {
delete_on_notification_removed_);
if (notification_view_) {
notification_view_->SetInkDropMode(MessageView::InkDropMode::OFF);
- static_cast<views::View*>(notification_view_.get())->RemoveObserver(this);
- widget()->Close();
- notification_view_.reset();
+ static_cast<views::View*>(notification_view_)->RemoveObserver(this);
+ notification_view_->GetWidget()->Close();
+ notification_view_ = nullptr;
}
MessageCenter::Shutdown();
views::ViewsTestBase::TearDown();
@@ -227,19 +220,20 @@ void NotificationViewMDTest::OnViewPreferredSizeChanged(
views::View* observed_view) {
EXPECT_EQ(observed_view, notification_view());
if (delete_on_preferred_size_changed_) {
- widget()->CloseNow();
- notification_view_.reset();
+ notification_view_->GetWidget()->CloseNow();
+ notification_view_ = nullptr;
return;
}
- widget()->SetSize(notification_view()->GetPreferredSize());
+ notification_view_->GetWidget()->SetSize(
+ notification_view()->GetPreferredSize());
}
void NotificationViewMDTest::OnNotificationRemoved(
const std::string& notification_id,
bool by_user) {
if (delete_on_notification_removed_) {
- widget()->CloseNow();
- notification_view_.reset();
+ notification_view_->GetWidget()->CloseNow();
+ notification_view_ = nullptr;
return;
}
}
@@ -309,19 +303,19 @@ void NotificationViewMDTest::UpdateNotificationViews(
// MessageViewFactory::Create.
// TODO(tetsui): Confirm that NotificationViewMD options are same as one
// created by the method.
- notification_view_ = std::make_unique<NotificationViewMD>(notification);
- static_cast<views::View*>(notification_view_.get())->AddObserver(this);
- notification_view_->set_owned_by_client();
+ auto notification_view = std::make_unique<NotificationViewMD>(notification);
+ static_cast<views::View*>(notification_view.get())->AddObserver(this);
views::Widget::InitParams init_params(
CreateParams(views::Widget::InitParams::TYPE_POPUP));
- widget_ = new views::Widget();
- widget_->Init(std::move(init_params));
- widget_->SetContentsView(notification_view_.get());
- widget_->SetSize(notification_view_->GetPreferredSize());
- widget_->Show();
- widget_->widget_delegate()->SetCanActivate(true);
- widget_->Activate();
+ // The native widget owns |widget| and |widget| owns |notification_view_|.
+ auto* widget = new views::Widget();
+ widget->Init(std::move(init_params));
+ notification_view_ = widget->SetContentsView(std::move(notification_view));
+ widget->SetSize(notification_view_->GetPreferredSize());
+ widget->Show();
+ widget->widget_delegate()->SetCanActivate(true);
+ widget->Activate();
} else {
notification_view_->UpdateWithNotification(notification);
}
@@ -472,7 +466,7 @@ TEST_F(NotificationViewMDTest, TestIconSizing) {
TEST_F(NotificationViewMDTest, UpdateButtonsStateTest) {
std::unique_ptr<Notification> notification = CreateSimpleNotification();
notification_view()->CreateOrUpdateViews(*notification);
- widget()->Show();
+ notification_view()->GetWidget()->Show();
// When collapsed, new buttons are not shown.
EXPECT_FALSE(notification_view()->expanded_);
@@ -526,7 +520,7 @@ TEST_F(NotificationViewMDTest, UpdateButtonCountTest) {
std::unique_ptr<Notification> notification = CreateSimpleNotification();
notification->set_buttons(CreateButtons(2));
UpdateNotificationViews(*notification);
- widget()->Show();
+ notification_view()->GetWidget()->Show();
// Action buttons are hidden by collapsed state.
if (!notification_view()->expanded_)
@@ -576,9 +570,10 @@ TEST_F(NotificationViewMDTest, TestActionButtonClick) {
notification->set_buttons(CreateButtons(2));
UpdateNotificationViews(*notification);
- widget()->Show();
+ notification_view()->GetWidget()->Show();
- ui::test::EventGenerator generator(GetRootWindow(widget()));
+ ui::test::EventGenerator generator(
+ GetRootWindow(notification_view()->GetWidget()));
// Action buttons are hidden by collapsed state.
if (!notification_view()->expanded_)
@@ -604,9 +599,10 @@ TEST_F(NotificationViewMDTest, TestInlineReply) {
buttons[1].placeholder = base::string16();
notification->set_buttons(buttons);
UpdateNotificationViews(*notification);
- widget()->Show();
+ notification_view()->GetWidget()->Show();
- ui::test::EventGenerator generator(GetRootWindow(widget()));
+ ui::test::EventGenerator generator(
+ GetRootWindow(notification_view()->GetWidget()));
// Action buttons are hidden by collapsed state.
if (!notification_view()->expanded_)
@@ -691,9 +687,10 @@ TEST_F(NotificationViewMDTest, TestInlineReplyRemovedByUpdate) {
buttons[1].placeholder = base::string16();
notification->set_buttons(buttons);
UpdateNotificationViews(*notification);
- widget()->Show();
+ notification_view()->GetWidget()->Show();
- ui::test::EventGenerator generator(GetRootWindow(widget()));
+ ui::test::EventGenerator generator(
+ GetRootWindow(notification_view()->GetWidget()));
// Action buttons are hidden by collapsed state.
if (!notification_view()->expanded_)
@@ -740,13 +737,14 @@ TEST_F(NotificationViewMDTest, TestInlineReplyActivateWithKeyPress) {
buttons[1].placeholder = base::string16();
notification->set_buttons(buttons);
UpdateNotificationViews(*notification);
- widget()->Show();
+ notification_view()->GetWidget()->Show();
// Action buttons are hidden by collapsed state.
if (!notification_view()->expanded_)
notification_view()->ToggleExpanded();
- ui::test::EventGenerator generator(GetRootWindow(widget()));
+ ui::test::EventGenerator generator(
+ GetRootWindow(notification_view()->GetWidget()));
// Press and release space key to open inline reply text field.
// Note: VKEY_RETURN should work too, but triggers a click on MacOS.
@@ -968,7 +966,8 @@ TEST_F(NotificationViewMDTest, ExpandLongMessage) {
gfx::Point done_cursor_location(1, 1);
views::View::ConvertPointToScreen(notification_view()->header_row_,
&done_cursor_location);
- ui::test::EventGenerator generator(GetRootWindow(widget()));
+ ui::test::EventGenerator generator(
+ GetRootWindow(notification_view()->GetWidget()));
generator.MoveMouseTo(done_cursor_location);
generator.ClickLeftButton();
@@ -982,17 +981,16 @@ TEST_F(NotificationViewMDTest, TestAccentColor) {
std::unique_ptr<Notification> notification = CreateSimpleNotification();
notification->set_buttons(CreateButtons(2));
UpdateNotificationViews(*notification);
- widget()->Show();
+ notification_view()->GetWidget()->Show();
// Action buttons are hidden by collapsed state.
if (!notification_view()->expanded_)
notification_view()->ToggleExpanded();
EXPECT_TRUE(notification_view()->actions_row_->GetVisible());
- // By default, header does not have accent color (default grey), and
- // buttons have default accent color.
- EXPECT_EQ(kNotificationDefaultAccentColor,
- notification_view()->header_row_->accent_color_for_testing());
+ // By default, header does not have accent color.
+ EXPECT_FALSE(
+ notification_view()->header_row_->accent_color_for_testing().has_value());
EXPECT_EQ(
kActionButtonTextColor,
notification_view()->action_buttons_[0]->enabled_color_for_testing());
@@ -1004,8 +1002,10 @@ TEST_F(NotificationViewMDTest, TestAccentColor) {
// same accent color.
notification->set_accent_color(kCustomAccentColor);
UpdateNotificationViews(*notification);
- EXPECT_EQ(kCustomAccentColor,
- notification_view()->header_row_->accent_color_for_testing());
+ auto accent_color =
+ notification_view()->header_row_->accent_color_for_testing();
+ ASSERT_TRUE(accent_color.has_value());
+ EXPECT_EQ(kCustomAccentColor, accent_color.value());
EXPECT_EQ(
kCustomAccentColor,
notification_view()->action_buttons_[0]->enabled_color_for_testing());
@@ -1097,7 +1097,8 @@ TEST_F(NotificationViewMDTest, UpdateInSettings) {
notification->set_type(NOTIFICATION_TYPE_SIMPLE);
UpdateNotificationViews(*notification);
- ui::test::EventGenerator generator(GetRootWindow(widget()));
+ ui::test::EventGenerator generator(
+ GetRootWindow(notification_view()->GetWidget()));
// Inline settings will be shown by clicking settings button.
EXPECT_FALSE(notification_view()->settings_row_->GetVisible());
@@ -1124,7 +1125,8 @@ TEST_F(NotificationViewMDTest, InlineSettings) {
notification->set_type(NOTIFICATION_TYPE_SIMPLE);
UpdateNotificationViews(*notification);
- ui::test::EventGenerator generator(GetRootWindow(widget()));
+ ui::test::EventGenerator generator(
+ GetRootWindow(notification_view()->GetWidget()));
// Inline settings will be shown by clicking settings button.
EXPECT_FALSE(notification_view()->settings_row_->GetVisible());
@@ -1183,7 +1185,8 @@ TEST_F(NotificationViewMDTest, InlineSettingsInkDropAnimation) {
notification->set_type(NOTIFICATION_TYPE_SIMPLE);
UpdateNotificationViews(*notification);
- ui::test::EventGenerator generator(GetRootWindow(widget()));
+ ui::test::EventGenerator generator(
+ GetRootWindow(notification_view()->GetWidget()));
// Inline settings will be shown by clicking settings button.
EXPECT_FALSE(notification_view()->settings_row_->GetVisible());
@@ -1198,9 +1201,9 @@ TEST_F(NotificationViewMDTest, InlineSettingsInkDropAnimation) {
notification_view()->GetInkDrop()->AddObserver(this);
// Resize the widget by 1px to simulate the expand animation.
- gfx::Rect size = widget()->GetWindowBoundsInScreen();
+ gfx::Rect size = notification_view()->GetWidget()->GetWindowBoundsInScreen();
size.Inset(0, 0, 0, 1);
- widget()->SetBounds(size);
+ notification_view()->GetWidget()->SetBounds(size);
notification_view()->GetInkDrop()->RemoveObserver(this);
@@ -1213,7 +1216,7 @@ TEST_F(NotificationViewMDTest, TestClick) {
delegate_->set_expecting_click(true);
UpdateNotificationViews(*notification);
- widget()->Show();
+ notification_view()->GetWidget()->Show();
ui::test::EventGenerator generator(
GetRootWindow(notification_view()->GetWidget()));
@@ -1237,9 +1240,10 @@ TEST_F(NotificationViewMDTest, TestClickExpanded) {
delegate_->set_expecting_click(true);
UpdateNotificationViews(*notification);
- widget()->Show();
+ notification_view()->GetWidget()->Show();
- ui::test::EventGenerator generator(GetRootWindow(widget()));
+ ui::test::EventGenerator generator(
+ GetRootWindow(notification_view()->GetWidget()));
// Expand the notification if it's collapsed.
if (!notification_view()->expanded_)
diff --git a/chromium/ui/native_theme/common_theme.cc b/chromium/ui/native_theme/common_theme.cc
index 5820f4ab68b..e0f4ef443d3 100644
--- a/chromium/ui/native_theme/common_theme.cc
+++ b/chromium/ui/native_theme/common_theme.cc
@@ -431,6 +431,8 @@ SkColor GetDefaultColor(NativeTheme::ColorId color_id,
case NativeTheme::kColorId_NotificationButtonBackground:
return SkColorSetA(SK_ColorWHITE, 0.9 * 0xff);
#endif
+ case NativeTheme::kColorId_NotificationDefaultAccentColor:
+ return gfx::kChromeIconGrey;
// Scrollbar
case NativeTheme::kColorId_OverlayScrollbarThumbBackground:
@@ -573,6 +575,10 @@ SkColor GetDefaultColor(NativeTheme::ColorId color_id,
case NativeTheme::kColorId_MenuIconColor:
case NativeTheme::kColorId_DefaultIconColor:
return gfx::kGoogleGrey700;
+ case NativeTheme::kColorId_DisabledIconColor:
+ return SkColorSetA(
+ base_theme->GetSystemColor(NativeTheme::kColorId_DefaultIconColor),
+ gfx::kDisabledControlAlpha);
// Sync info container
case NativeTheme::kColorId_SyncInfoContainerPaused:
diff --git a/chromium/ui/native_theme/native_theme.cc b/chromium/ui/native_theme/native_theme.cc
index 1d9716fc421..150f4455d49 100644
--- a/chromium/ui/native_theme/native_theme.cc
+++ b/chromium/ui/native_theme/native_theme.cc
@@ -254,20 +254,13 @@ bool NativeTheme::UsesHighContrastColors() const {
return is_high_contrast_;
}
-NativeTheme::HighContrastColorScheme NativeTheme::GetHighContrastColorScheme()
- const {
- if (!UsesHighContrastColors())
- return NativeTheme::HighContrastColorScheme::kNone;
- switch (GetPreferredColorScheme()) {
- case NativeTheme::PreferredColorScheme::kDark:
- return HighContrastColorScheme::kDark;
- case NativeTheme::PreferredColorScheme::kLight:
- return HighContrastColorScheme::kLight;
- case NativeTheme::PreferredColorScheme::kNoPreference:
- return NativeTheme::HighContrastColorScheme::kCustom;
- }
- NOTREACHED();
- return NativeTheme::HighContrastColorScheme::kNone;
+NativeTheme::PlatformHighContrastColorScheme
+NativeTheme::GetPlatformHighContrastColorScheme() const {
+ if (GetDefaultSystemColorScheme() != ColorScheme::kPlatformHighContrast)
+ return PlatformHighContrastColorScheme::kNone;
+ return (GetPreferredColorScheme() == PreferredColorScheme::kDark)
+ ? PlatformHighContrastColorScheme::kDark
+ : PlatformHighContrastColorScheme::kLight;
}
NativeTheme::PreferredColorScheme NativeTheme::GetPreferredColorScheme() const {
diff --git a/chromium/ui/native_theme/native_theme.h b/chromium/ui/native_theme/native_theme.h
index 82751ea52da..f4e9cc14b0b 100644
--- a/chromium/ui/native_theme/native_theme.h
+++ b/chromium/ui/native_theme/native_theme.h
@@ -108,7 +108,6 @@ class NATIVE_THEME_EXPORT NativeTheme {
// OS-level preferred color scheme. (Ex. high contrast or dark mode color
// preference.)
enum PreferredColorScheme {
- kNoPreference,
kDark,
kLight,
kMaxValue = kLight,
@@ -118,14 +117,13 @@ class NATIVE_THEME_EXPORT NativeTheme {
// This enum is reporting in metrics. Do not reorder; add additional values at
// the end.
//
- // This represents the OS-level high contrast theme. kNone if high contrast is
- // not enabled.
- enum class HighContrastColorScheme {
+ // This represents the OS-level high contrast theme. kNone unless the default
+ // system color scheme is kPlatformHighContrast.
+ enum class PlatformHighContrastColorScheme {
kNone = 0,
kDark = 1,
kLight = 2,
- kCustom = 3,
- kMaxValue = kCustom,
+ kMaxValue = kLight,
};
// The color scheme used for painting the native controls.
@@ -251,12 +249,32 @@ class NATIVE_THEME_EXPORT NativeTheme {
ScrollbarOverlayColorTheme scrollbar_theme;
};
+#if defined(OS_MACOSX)
+ enum ScrollbarOrientation {
+ // Vertical scrollbar on the right side of content.
+ kVerticalOnRight,
+ // Vertical scrollbar on the left side of content.
+ kVerticalOnLeft,
+ // Horizontal scrollbar (on the bottom of content).
+ kHorizontal,
+ };
+
+ // A unique set of scrollbar params. Currently needed for Mac.
+ struct ScrollbarExtraParams {
+ bool is_hovering;
+ bool is_overlay;
+ ScrollbarOverlayColorTheme scrollbar_theme;
+ ScrollbarOrientation orientation; // Used on Mac for drawing gradients.
+ };
+#endif
+
struct SliderExtraParams {
bool vertical;
bool in_drag;
int thumb_x;
int thumb_y;
float zoom;
+ bool right_to_left;
};
struct TextFieldExtraParams {
@@ -292,6 +310,9 @@ class NATIVE_THEME_EXPORT NativeTheme {
MenuBackgroundExtraParams menu_background;
ProgressBarExtraParams progress_bar;
ScrollbarArrowExtraParams scrollbar_arrow;
+#if defined(OS_MACOSX)
+ ScrollbarExtraParams scrollbar_extra;
+#endif
ScrollbarTrackExtraParams scrollbar_track;
ScrollbarThumbExtraParams scrollbar_thumb;
SliderExtraParams slider;
@@ -399,9 +420,10 @@ class NATIVE_THEME_EXPORT NativeTheme {
// system accessibility settings and the system theme.
virtual bool UsesHighContrastColors() const;
- // Returns the HighContrastColorScheme used by the OS. Returns kNone if high
- // contrast is not enabled.
- HighContrastColorScheme GetHighContrastColorScheme() const;
+ // Returns the PlatformHighContrastColorScheme used by the OS. Returns a value
+ // other than kNone only if the default system color scheme is
+ // kPlatformHighContrast.
+ PlatformHighContrastColorScheme GetPlatformHighContrastColorScheme() const;
// Returns true when the NativeTheme uses a light-on-dark color scheme. If
// you're considering using this function to choose between two hard-coded
@@ -465,12 +487,9 @@ class NATIVE_THEME_EXPORT NativeTheme {
// Some platforms override this behavior. On Windows, for example, we also
// look at the high contrast setting. If high contrast is enabled, the
// preferred color scheme calculation will ignore the state of dark mode.
- // Instead, preferred color scheme will be light, dark, or no-preference
- // depending on the OS high contrast theme. If high contrast is off, the
- // preferred color scheme calculation will follow the default behavior.
- //
- // Note, if the preferred color scheme is based on dark mode, it will never
- // be set to no-preference.
+ // Instead, preferred color scheme will be light, or dark depending on the OS
+ // high contrast theme. If high contrast is off, the preferred color scheme
+ // calculation will follow the default behavior.
virtual PreferredColorScheme CalculatePreferredColorScheme() const;
// A function to be called by native theme instances that need to set state
@@ -506,8 +525,7 @@ class NATIVE_THEME_EXPORT NativeTheme {
bool should_use_dark_colors_ = false;
bool is_high_contrast_ = false;
- PreferredColorScheme preferred_color_scheme_ =
- PreferredColorScheme::kNoPreference;
+ PreferredColorScheme preferred_color_scheme_ = PreferredColorScheme::kLight;
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 c9f858e69e7..ff92427546f 100644
--- a/chromium/ui/native_theme/native_theme_aura.cc
+++ b/chromium/ui/native_theme/native_theme_aura.cc
@@ -40,7 +40,6 @@ constexpr int kOverlayScrollbarMinimumLength = 32;
// color. This prevents color interpolation between the patches.
constexpr int kOverlayScrollbarBorderPatchWidth = 2;
constexpr int kOverlayScrollbarCenterPatchSize = 1;
-const SkColor kTrackColor = SkColorSetRGB(0xF1, 0xF1, 0xF1);
const SkScalar kScrollRadius =
1; // select[multiple] radius+width are set in css
} // namespace
@@ -145,9 +144,7 @@ void NativeThemeAura::PaintArrowButton(
State state,
ColorScheme color_scheme,
const ScrollbarArrowExtraParams& arrow) const {
- SkColor bg_color = color_scheme == ui::NativeTheme::ColorScheme::kDark
- ? SkColorSetRGB(0x42, 0x42, 0x42)
- : kTrackColor;
+ SkColor bg_color = GetControlColor(kScrollbarArrowBackground, color_scheme);
// Aura-win uses slightly different arrow colors.
SkColor arrow_color = gfx::kPlaceholderColor;
switch (state) {
@@ -155,22 +152,17 @@ void NativeThemeAura::PaintArrowButton(
arrow_color = GetArrowColor(state, color_scheme);
break;
case kHovered:
- bg_color = color_scheme == ui::NativeTheme::ColorScheme::kDark
- ? SkColorSetRGB(0x4F, 0x4F, 0x4F)
- : SkColorSetRGB(0xD2, 0xD2, 0xD2);
- FALLTHROUGH;
+ bg_color =
+ GetControlColor(kScrollbarArrowBackgroundHovered, color_scheme);
+ arrow_color = GetControlColor(kScrollbarArrowHovered, color_scheme);
+ break;
case kNormal:
- arrow_color = color_scheme == ui::NativeTheme::ColorScheme::kDark
- ? SK_ColorWHITE
- : SkColorSetRGB(0x50, 0x50, 0x50);
+ arrow_color = GetControlColor(kScrollbarArrow, color_scheme);
break;
case kPressed:
- bg_color = color_scheme == ui::NativeTheme::ColorScheme::kDark
- ? SkColorSetRGB(0xB1, 0xB1, 0xB1)
- : SkColorSetRGB(0x78, 0x78, 0x78);
- arrow_color = color_scheme == ui::NativeTheme::ColorScheme::kDark
- ? SK_ColorBLACK
- : SK_ColorWHITE;
+ bg_color =
+ GetControlColor(kScrollbarArrowBackgroundPressed, color_scheme);
+ arrow_color = GetControlColor(kScrollbarArrowPressed, color_scheme);
break;
case kNumStates:
break;
@@ -220,9 +212,7 @@ void NativeThemeAura::PaintScrollbarTrack(
// Overlay Scrollbar should never paint a scrollbar track.
DCHECK(!use_overlay_scrollbars_);
cc::PaintFlags flags;
- SkColor track_color = color_scheme == ui::NativeTheme::ColorScheme::kDark
- ? SkColorSetRGB(0x42, 0x42, 0x42)
- : kTrackColor;
+ SkColor track_color = GetControlColor(kScrollbarTrack, color_scheme);
flags.setColor(track_color);
canvas->drawIRect(gfx::RectToSkIRect(rect), flags);
}
@@ -300,17 +290,20 @@ void NativeThemeAura::PaintScrollbarThumb(cc::PaintCanvas* canvas,
gfx::Insets fill_insets(kStrokeWidth);
thumb_rect.Inset(fill_insets + edge_adjust_insets);
} else {
+ ControlColorId color_id = kScrollbarThumb;
switch (state) {
case NativeTheme::kDisabled:
thumb_alpha = SK_AlphaTRANSPARENT;
break;
case NativeTheme::kHovered:
+ color_id = kScrollbarThumbHovered;
thumb_alpha = 0x4D;
break;
case NativeTheme::kNormal:
thumb_alpha = 0x33;
break;
case NativeTheme::kPressed:
+ color_id = kScrollbarThumbPressed;
thumb_alpha = 0x80;
break;
case NativeTheme::kNumStates:
@@ -327,9 +320,12 @@ void NativeThemeAura::PaintScrollbarThumb(cc::PaintCanvas* canvas,
else
thumb_rect.Inset(extra_padding, kThumbPadding);
- thumb_color = color_scheme == ui::NativeTheme::ColorScheme::kDark
- ? SK_ColorWHITE
- : SK_ColorBLACK;
+ if (UsesHighContrastColors() && features::IsForcedColorsEnabled()) {
+ thumb_alpha = 0xFF;
+ thumb_color = GetControlColor(color_id, color_scheme);
+ } else {
+ thumb_color = GetControlColor(kScrollbarThumb, color_scheme);
+ }
}
cc::PaintFlags flags;
diff --git a/chromium/ui/native_theme/native_theme_base.cc b/chromium/ui/native_theme/native_theme_base.cc
index d13499976b8..57bd8bf9905 100644
--- a/chromium/ui/native_theme/native_theme_base.cc
+++ b/chromium/ui/native_theme/native_theme_base.cc
@@ -1416,7 +1416,8 @@ SkColor NativeThemeBase::GetArrowColor(State state,
SkColorToHSV(GetColor(kTrackColor, color_scheme), track_hsv);
SkScalar thumb_hsv[3];
- SkColorToHSV(GetColor(kThumbInactiveColor, color_scheme), thumb_hsv);
+ SkColorToHSV(GetControlColor(kScrollbarThumbInactive, color_scheme),
+ thumb_hsv);
return OutlineColor(track_hsv, thumb_hsv);
}
@@ -1619,6 +1620,24 @@ SkColor NativeThemeBase::GetControlColor(ControlColorId color_id,
return SkColorSetRGB(0xCB, 0xCB, 0xCB);
case kAutoCompleteBackground:
return SkColorSetRGB(0xE8, 0xF0, 0xFE);
+ case kScrollbarArrowBackground:
+ case kScrollbarTrack:
+ return SkColorSetRGB(0xF1, 0xF1, 0xF1);
+ case kScrollbarArrowBackgroundHovered:
+ return SkColorSetRGB(0xD2, 0xD2, 0xD2);
+ case kScrollbarArrowBackgroundPressed:
+ return SkColorSetRGB(0x78, 0x78, 0x78);
+ case kScrollbarArrowHovered:
+ case kScrollbarArrow:
+ return SkColorSetRGB(0x50, 0x50, 0x50);
+ case kScrollbarArrowPressed:
+ return SK_ColorWHITE;
+ case kScrollbarThumbInactive:
+ return SkColorSetRGB(0xEA, 0xEA, 0xEA);
+ case kScrollbarThumbHovered:
+ case kScrollbarThumbPressed:
+ case kScrollbarThumb:
+ return SK_ColorBLACK;
}
NOTREACHED();
return gfx::kPlaceholderColor;
@@ -1665,6 +1684,24 @@ SkColor NativeThemeBase::GetDarkModeControlColor(
return SkColorSetRGB(0x45, 0x45, 0x45);
case kDisabledFill:
return SkColorSetARGB(0x4D, 0x3B, 0x3B, 0x3B);
+ case kScrollbarArrowBackground:
+ return SkColorSetRGB(0x42, 0x42, 0x42);
+ case kScrollbarArrowBackgroundHovered:
+ return SkColorSetRGB(0x4F, 0x4F, 0x4F);
+ case kScrollbarArrowBackgroundPressed:
+ return SkColorSetRGB(0xB1, 0xB1, 0xB1);
+ case kScrollbarArrowHovered:
+ case kScrollbarArrow:
+ return SK_ColorWHITE;
+ case kScrollbarArrowPressed:
+ return SK_ColorBLACK;
+ case kScrollbarTrack:
+ return SkColorSetRGB(0x42, 0x42, 0x42);
+ case kScrollbarThumbInactive:
+ case kScrollbarThumbHovered:
+ case kScrollbarThumbPressed:
+ case kScrollbarThumb:
+ return SK_ColorWHITE;
}
NOTREACHED();
return gfx::kPlaceholderColor;
@@ -1690,6 +1727,10 @@ SkColor NativeThemeBase::GetHighContrastControlColor(
case kSlider:
case kHoveredSlider:
case kPressedSlider:
+ case kScrollbarThumbHovered:
+ case kScrollbarThumbPressed:
+ case kScrollbarArrowBackgroundHovered:
+ case kScrollbarArrowBackgroundPressed:
return system_colors_[SystemThemeColor::kHighlight];
case kBackground:
case kDisabledBackground:
@@ -1699,10 +1740,19 @@ SkColor NativeThemeBase::GetHighContrastControlColor(
case kDisabledFill:
case kAutoCompleteBackground:
case kLightenLayer:
+ case kScrollbarArrowBackground:
+ case kScrollbarTrack:
return system_colors_[SystemThemeColor::kWindow];
+ case kScrollbarArrow:
+ case kScrollbarThumb:
+ case kScrollbarThumbInactive:
+ return system_colors_[SystemThemeColor::kWindowText];
+ case kScrollbarArrowHovered:
+ case kScrollbarArrowPressed:
+ return system_colors_[SystemThemeColor::kButtonFace];
}
} else {
- // Default high contrast colors (used in web test mode)
+ // // Default high contrast colors (used in web test mode)
switch (color_id) {
case kDisabledBorder:
case kDisabledAccent:
@@ -1711,6 +1761,9 @@ SkColor NativeThemeBase::GetHighContrastControlColor(
case kBorder:
case kHoveredBorder:
case kPressedBorder:
+ case kScrollbarThumbInactive:
+ case kScrollbarArrowBackground:
+ case kScrollbarTrack:
return SK_ColorWHITE;
case kAccent:
case kHoveredAccent:
@@ -1728,7 +1781,16 @@ SkColor NativeThemeBase::GetHighContrastControlColor(
case kDisabledFill:
case kAutoCompleteBackground:
case kLightenLayer:
+ case kScrollbarThumb:
+ case kScrollbarArrow:
+ case kScrollbarArrowHovered:
+ case kScrollbarArrowPressed:
return SK_ColorBLACK;
+ case kScrollbarThumbHovered:
+ case kScrollbarThumbPressed:
+ case kScrollbarArrowBackgroundHovered:
+ case kScrollbarArrowBackgroundPressed:
+ return SkColorSetRGB(0x1A, 0xEB, 0xFF);
}
}
NOTREACHED();
@@ -1769,11 +1831,16 @@ SkRect NativeThemeBase::AlignSliderTrack(
std::min(float(slider_rect.right()), mid_x + kAlignment),
slider_rect.bottom());
} else {
- const float right = is_value ? slider_rect.x() + slider.thumb_x + kAlignment
- : slider_rect.right();
+ const float right = is_value && !slider.right_to_left
+ ? slider_rect.x() + slider.thumb_x + kAlignment
+ : slider_rect.right();
+ const float left = is_value && slider.right_to_left
+ ? slider_rect.x() + slider.thumb_x + kAlignment
+ : slider_rect.x();
+
aligned_rect.setLTRB(
- slider_rect.x(), std::max(float(slider_rect.y()), mid_y - kAlignment),
- right, std::min(float(slider_rect.bottom()), mid_y + kAlignment));
+ left, std::max(float(slider_rect.y()), mid_y - kAlignment), right,
+ std::min(float(slider_rect.bottom()), mid_y + kAlignment));
}
return aligned_rect;
diff --git a/chromium/ui/native_theme/native_theme_base.h b/chromium/ui/native_theme/native_theme_base.h
index 9cc9c2d8884..ea2989929e4 100644
--- a/chromium/ui/native_theme/native_theme_base.h
+++ b/chromium/ui/native_theme/native_theme_base.h
@@ -65,7 +65,18 @@ class NATIVE_THEME_EXPORT NativeThemeBase : public NativeTheme {
kDisabledSlider,
kHoveredSlider,
kPressedSlider,
- kAutoCompleteBackground
+ kAutoCompleteBackground,
+ kScrollbarArrowBackground,
+ kScrollbarArrowBackgroundHovered,
+ kScrollbarArrowBackgroundPressed,
+ kScrollbarArrow,
+ kScrollbarArrowHovered,
+ kScrollbarArrowPressed,
+ kScrollbarTrack,
+ kScrollbarThumb,
+ kScrollbarThumbHovered,
+ kScrollbarThumbPressed,
+ kScrollbarThumbInactive
};
using NativeTheme::NativeTheme;
@@ -213,6 +224,8 @@ class NATIVE_THEME_EXPORT NativeThemeBase : public NativeTheme {
// Returns the color used to draw the arrow.
SkColor GetArrowColor(State state, ColorScheme color_scheme) const;
+ SkColor GetControlColor(ControlColorId color_id,
+ ColorScheme color_scheme) const;
int scrollbar_width_ = 15;
@@ -260,8 +273,7 @@ class NATIVE_THEME_EXPORT NativeThemeBase : public NativeTheme {
SkColor GetHighContrastControlColor(ControlColorId color_id,
ColorScheme color_scheme) const;
SkColor GetDarkModeControlColor(ControlColorId color_id) const;
- SkColor GetControlColor(ControlColorId color_id,
- ColorScheme color_scheme) const;
+
SkRect AlignSliderTrack(const gfx::Rect& slider_rect,
const NativeTheme::SliderExtraParams& slider,
bool is_value,
diff --git a/chromium/ui/native_theme/native_theme_color_id.h b/chromium/ui/native_theme/native_theme_color_id.h
index 9b3d8039bc2..60fb0ea1010 100644
--- a/chromium/ui/native_theme/native_theme_color_id.h
+++ b/chromium/ui/native_theme/native_theme_color_id.h
@@ -91,6 +91,7 @@
OP(kColorId_NotificationLargeImageBackground), \
OP(kColorId_NotificationPlaceholderIconColor), \
OP(kColorId_NotificationEmptyPlaceholderIconColor), \
+ OP(kColorId_NotificationDefaultAccentColor), \
/* Slider */ \
OP(kColorId_SliderThumbDefault), \
OP(kColorId_SliderTroughDefault), \
@@ -154,7 +155,8 @@
OP(kColorId_AlertSeverityMedium), \
OP(kColorId_AlertSeverityHigh), \
/* Colors for icons in non-menu contexts. */ \
- OP(kColorId_DefaultIconColor)
+ OP(kColorId_DefaultIconColor), \
+ OP(kColorId_DisabledIconColor)
#if defined(OS_CHROMEOS)
#define NATIVE_THEME_CHROMEOS_COLOR_IDS \
diff --git a/chromium/ui/native_theme/native_theme_mac.h b/chromium/ui/native_theme/native_theme_mac.h
index 4804b26ba82..fbaa33f4c9a 100644
--- a/chromium/ui/native_theme/native_theme_mac.h
+++ b/chromium/ui/native_theme/native_theme_mac.h
@@ -8,6 +8,7 @@
#include "base/mac/scoped_nsobject.h"
#include "base/macros.h"
#include "base/no_destructor.h"
+#include "ui/gfx/geometry/size.h"
#include "ui/native_theme/native_theme_base.h"
#include "ui/native_theme/native_theme_export.h"
@@ -44,6 +45,12 @@ class NATIVE_THEME_EXPORT NativeThemeMac : public NativeThemeBase {
SkColor GetSystemButtonPressedColor(SkColor base_color) const override;
// Overridden from NativeThemeBase:
+ void Paint(cc::PaintCanvas* canvas,
+ Part part,
+ State state,
+ const gfx::Rect& rect,
+ const ExtraParams& extra,
+ ColorScheme color_scheme) const override;
void PaintMenuPopupBackground(
cc::PaintCanvas* canvas,
const gfx::Size& size,
@@ -54,6 +61,20 @@ class NATIVE_THEME_EXPORT NativeThemeMac : public NativeThemeBase {
const gfx::Rect& rect,
const MenuItemExtraParams& menu_item,
ColorScheme color_scheme) const override;
+ void PaintMacScrollbarThumb(cc::PaintCanvas* canvas,
+ Part part,
+ State state,
+ const gfx::Rect& rect,
+ const ScrollbarExtraParams& scroll_thumb,
+ ColorScheme color_scheme) const;
+ // Paint the track. |track_bounds| is the bounds for the track.
+ void PaintMacScrollBarTrackOrCorner(cc::PaintCanvas* canvas,
+ Part part,
+ State state,
+ const ScrollbarExtraParams& extra_params,
+ const gfx::Rect& rect,
+ ColorScheme color_scheme,
+ bool is_corner) const;
// Paints the styled button shape used for default controls on Mac. The basic
// style is used for dialog buttons, comboboxes, and tabbed pane tabs.
@@ -81,6 +102,22 @@ class NATIVE_THEME_EXPORT NativeThemeMac : public NativeThemeBase {
const gfx::Rect& rect,
ColorScheme color_scheme) const;
+ void PaintScrollBarTrackGradient(cc::PaintCanvas* canvas,
+ const gfx::Rect& rect,
+ const ScrollbarExtraParams& extra_params,
+ bool is_corner,
+ ColorScheme color_scheme) const;
+ void PaintScrollbarTrackInnerBorder(cc::PaintCanvas* canvas,
+ const gfx::Rect& rect,
+ const ScrollbarExtraParams& extra_params,
+ bool is_corner,
+ ColorScheme color_scheme) const;
+ void PaintScrollbarTrackOuterBorder(cc::PaintCanvas* canvas,
+ const gfx::Rect& rect,
+ const ScrollbarExtraParams& extra_params,
+ bool is_corner,
+ ColorScheme color_scheme) const;
+
void InitializeDarkModeStateAndObserver();
void ConfigureWebInstance() override;
@@ -91,6 +128,29 @@ class NATIVE_THEME_EXPORT NativeThemeMac : public NativeThemeBase {
base::Optional<SkColor> GetOSColor(ColorId color_id,
ColorScheme color_scheme) const;
+ enum ScrollbarPart {
+ kThumb,
+ kTrackInnerBorder,
+ kTrackOuterBorder,
+ };
+
+ base::Optional<SkColor> GetScrollbarColor(
+ ScrollbarPart part,
+ ColorScheme color_scheme,
+ const ScrollbarExtraParams& extra_params) const;
+
+ int ScrollbarTrackBorderWidth() const { return 1; }
+
+ // The amount the thumb is inset from the ends and the inside edge of track
+ // border.
+ int GetScrollbarThumbInset(bool is_overlay) const {
+ return is_overlay ? 2 : 3;
+ }
+
+ // Returns the minimum size for the thumb. We will not inset the thumb if it
+ // will be smaller than this size.
+ gfx::Size GetThumbMinSize(bool vertical) const;
+
base::scoped_nsobject<NativeThemeEffectiveAppearanceObserver>
appearance_observer_;
id high_contrast_notification_token_;
diff --git a/chromium/ui/native_theme/native_theme_mac.mm b/chromium/ui/native_theme/native_theme_mac.mm
index fc84f17cd4d..1fda9fe5d26 100644
--- a/chromium/ui/native_theme/native_theme_mac.mm
+++ b/chromium/ui/native_theme/native_theme_mac.mm
@@ -6,6 +6,7 @@
#import <Cocoa/Cocoa.h>
#include <stddef.h>
+#include <vector>
#include "base/command_line.h"
#include "base/mac/mac_util.h"
@@ -15,8 +16,10 @@
#include "ui/base/ui_base_features.h"
#include "ui/base/ui_base_switches.h"
#include "ui/color/mac/scoped_current_nsappearance.h"
+#include "ui/gfx/canvas.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/color_utils.h"
+#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/skia_util.h"
#include "ui/native_theme/common_theme.h"
@@ -237,6 +240,299 @@ base::Optional<SkColor> NativeThemeMac::GetOSColor(
}
}
+void NativeThemeMac::Paint(cc::PaintCanvas* canvas,
+ Part part,
+ State state,
+ const gfx::Rect& rect,
+ const ExtraParams& extra,
+ ColorScheme color_scheme) const {
+ ColorScheme color_scheme_updated = color_scheme;
+ if (color_scheme_updated == ColorScheme::kDefault)
+ color_scheme_updated = GetDefaultSystemColorScheme();
+
+ if (rect.IsEmpty())
+ return;
+
+ switch (part) {
+ case kScrollbarHorizontalThumb:
+ case kScrollbarVerticalThumb:
+ PaintMacScrollbarThumb(canvas, part, state, rect, extra.scrollbar_extra,
+ color_scheme_updated);
+ break;
+ case kScrollbarHorizontalTrack:
+ case kScrollbarVerticalTrack:
+ PaintMacScrollBarTrackOrCorner(canvas, part, state, extra.scrollbar_extra,
+ rect, color_scheme_updated, false);
+ break;
+ case kScrollbarCorner:
+ PaintMacScrollBarTrackOrCorner(canvas, part, state, extra.scrollbar_extra,
+ rect, color_scheme_updated, true);
+ break;
+ default:
+ NativeThemeBase::Paint(canvas, part, state, rect, extra, color_scheme);
+ break;
+ }
+}
+
+void ConstrainInsets(int old_width, int min_width, int* left, int* right) {
+ int requested_total_inset = *left + *right;
+ if (requested_total_inset == 0)
+ return;
+ int max_total_inset = old_width - min_width;
+ if (requested_total_inset < max_total_inset)
+ return;
+ if (max_total_inset < 0) {
+ *left = *right = 0;
+ return;
+ }
+ // Multiply the right/bottom inset by the ratio by which we need to shrink the
+ // total inset. This has the effect of rounding down the right/bottom inset,
+ // if the two sides are to be affected unevenly.
+ // This is done instead of using inset scale functions to maintain expected
+ // behavior and to map to how it looks like other scrollbars work on MacOS.
+ *right *= max_total_inset * 1.0f / requested_total_inset;
+ *left = max_total_inset - *right;
+}
+
+void ConstrainedInset(gfx::Rect* rect,
+ gfx::Size min_size,
+ gfx::Insets initial_insets) {
+ int inset_left = initial_insets.left();
+ int inset_right = initial_insets.right();
+ int inset_top = initial_insets.top();
+ int inset_bottom = initial_insets.bottom();
+
+ ConstrainInsets(rect->width(), min_size.width(), &inset_left, &inset_right);
+ ConstrainInsets(rect->height(), min_size.height(), &inset_top, &inset_bottom);
+ rect->Inset(inset_left, inset_top, inset_right, inset_bottom);
+}
+
+void NativeThemeMac::PaintMacScrollBarTrackOrCorner(
+ cc::PaintCanvas* canvas,
+ Part part,
+ State state,
+ const ScrollbarExtraParams& extra_params,
+ const gfx::Rect& rect,
+ ColorScheme color_scheme,
+ bool is_corner) const {
+ if (is_corner && extra_params.is_overlay)
+ return;
+ PaintScrollBarTrackGradient(canvas, rect, extra_params, is_corner,
+ color_scheme);
+ PaintScrollbarTrackInnerBorder(canvas, rect, extra_params, is_corner,
+ color_scheme);
+ PaintScrollbarTrackOuterBorder(canvas, rect, extra_params, is_corner,
+ color_scheme);
+}
+
+void NativeThemeMac::PaintScrollBarTrackGradient(
+ cc::PaintCanvas* canvas,
+ const gfx::Rect& rect,
+ const ScrollbarExtraParams& extra_params,
+ bool is_corner,
+ ColorScheme color_scheme) const {
+ gfx::Canvas paint_canvas(canvas, 1.0f);
+ // Select colors.
+ std::vector<SkColor> gradient_colors;
+ bool dark_mode = color_scheme == ColorScheme::kDark;
+ if (extra_params.is_overlay) {
+ if (dark_mode) {
+ gradient_colors = {SkColorSetARGB(0x28, 0xD8, 0xD8, 0xD8),
+ SkColorSetARGB(0x26, 0xCC, 0xCC, 0xCC),
+ SkColorSetARGB(0x26, 0xCC, 0xCC, 0xCC),
+ SkColorSetARGB(0x26, 0xCC, 0xCC, 0xCC)};
+ } else {
+ gradient_colors = {SkColorSetARGB(0xC6, 0xF8, 0xF8, 0xF8),
+ SkColorSetARGB(0xC2, 0xF8, 0xF8, 0xF8),
+ SkColorSetARGB(0xC2, 0xF8, 0xF8, 0xF8),
+ SkColorSetARGB(0xC2, 0xF8, 0xF8, 0xF8)};
+ }
+ } else {
+ // Non-overlay scroller track colors are not transparent. On Safari, they
+ // are, but on all other macOS applications they are not.
+ if (dark_mode) {
+ gradient_colors = {SkColorSetRGB(0x2D, 0x2D, 0x2D),
+ SkColorSetRGB(0x2B, 0x2B, 0x2B)};
+ } else {
+ gradient_colors = {SkColorSetRGB(0xFA, 0xFA, 0xFA),
+ SkColorSetRGB(0xFA, 0xFA, 0xFA)};
+ }
+ }
+
+ // Set the gradient direction.
+ std::vector<SkPoint> gradient_bounds;
+ if (is_corner) {
+ if (extra_params.orientation == ScrollbarOrientation::kVerticalOnRight) {
+ gradient_bounds = {gfx::PointToSkPoint(rect.origin()),
+ gfx::PointToSkPoint(rect.bottom_right())};
+ } else {
+ gradient_bounds = {gfx::PointToSkPoint(rect.top_right()),
+ gfx::PointToSkPoint(rect.bottom_left())};
+ }
+ } else {
+ if (extra_params.orientation == ScrollbarOrientation::kHorizontal) {
+ gradient_bounds = {gfx::PointToSkPoint(rect.origin()),
+ gfx::PointToSkPoint(rect.top_right())};
+ } else {
+ gradient_bounds = {gfx::PointToSkPoint(rect.origin()),
+ gfx::PointToSkPoint(rect.bottom_left())};
+ }
+ }
+
+ // And draw.
+ cc::PaintFlags gradient;
+ gradient.setShader(cc::PaintShader::MakeLinearGradient(
+ gradient_bounds.data(), gradient_colors.data(), nullptr,
+ gradient_colors.size(), SkTileMode::kClamp));
+ paint_canvas.DrawRect(rect, gradient);
+}
+
+void NativeThemeMac::PaintScrollbarTrackInnerBorder(
+ cc::PaintCanvas* canvas,
+ const gfx::Rect& rect,
+ const ScrollbarExtraParams& extra_params,
+ bool is_corner,
+ ColorScheme color_scheme) const {
+ gfx::Canvas paint_canvas(canvas, 1.0f);
+
+ // Compute the rect for the border.
+ gfx::Rect inner_border(rect);
+ if (extra_params.orientation == ScrollbarOrientation::kVerticalOnLeft)
+ inner_border.set_x(rect.right() - ScrollbarTrackBorderWidth());
+ if (is_corner ||
+ extra_params.orientation == ScrollbarOrientation::kHorizontal)
+ inner_border.set_height(ScrollbarTrackBorderWidth());
+ if (is_corner ||
+ extra_params.orientation != ScrollbarOrientation::kHorizontal)
+ inner_border.set_width(ScrollbarTrackBorderWidth());
+
+ // And draw.
+ cc::PaintFlags flags;
+ SkColor inner_border_color =
+ GetScrollbarColor(ScrollbarPart::kTrackInnerBorder, color_scheme,
+ extra_params)
+ .value();
+ flags.setColor(inner_border_color);
+ paint_canvas.DrawRect(inner_border, flags);
+}
+
+void NativeThemeMac::PaintScrollbarTrackOuterBorder(
+ cc::PaintCanvas* canvas,
+ const gfx::Rect& rect,
+ const ScrollbarExtraParams& extra_params,
+ bool is_corner,
+ ColorScheme color_scheme) const {
+ gfx::Canvas paint_canvas(canvas, 1.0f);
+ cc::PaintFlags flags;
+ SkColor outer_border_color =
+ GetScrollbarColor(ScrollbarPart::kTrackOuterBorder, color_scheme,
+ extra_params)
+ .value();
+ flags.setColor(outer_border_color);
+
+ // Draw the horizontal outer border.
+ if (is_corner ||
+ extra_params.orientation == ScrollbarOrientation::kHorizontal) {
+ gfx::Rect outer_border(rect);
+ outer_border.set_height(ScrollbarTrackBorderWidth());
+ outer_border.set_y(rect.bottom() - ScrollbarTrackBorderWidth());
+ paint_canvas.DrawRect(outer_border, flags);
+ }
+
+ // Draw the vertial outer border.
+ if (is_corner ||
+ extra_params.orientation != ScrollbarOrientation::kHorizontal) {
+ gfx::Rect outer_border(rect);
+ outer_border.set_width(ScrollbarTrackBorderWidth());
+ if (extra_params.orientation == ScrollbarOrientation::kVerticalOnRight)
+ outer_border.set_x(rect.right() - ScrollbarTrackBorderWidth());
+ paint_canvas.DrawRect(outer_border, flags);
+ }
+}
+
+gfx::Size NativeThemeMac::GetThumbMinSize(bool vertical) const {
+ constexpr int kLength = 18;
+ constexpr int kGirth = 6;
+
+ return vertical ? gfx::Size(kGirth, kLength) : gfx::Size(kLength, kGirth);
+}
+
+void NativeThemeMac::PaintMacScrollbarThumb(
+ cc::PaintCanvas* canvas,
+ Part part,
+ State state,
+ const gfx::Rect& rect,
+ const ScrollbarExtraParams& scroll_thumb,
+ ColorScheme color_scheme) const {
+ gfx::Canvas paint_canvas(canvas, 1.0f);
+
+ // Compute the bounds for the rounded rect for the thumb from the bounds of
+ // the thumb.
+ gfx::Rect bounds(rect);
+ {
+ // Shrink the thumb evenly in length and girth to fit within the track.
+ gfx::Insets thumb_insets(GetScrollbarThumbInset(scroll_thumb.is_overlay));
+
+ // Also shrink the thumb in girth to not touch the border.
+ if (scroll_thumb.orientation == ScrollbarOrientation::kHorizontal) {
+ thumb_insets.set_top(thumb_insets.top() + ScrollbarTrackBorderWidth());
+ ConstrainedInset(&bounds, GetThumbMinSize(false), thumb_insets);
+ } else {
+ thumb_insets.set_left(thumb_insets.left() + ScrollbarTrackBorderWidth());
+ ConstrainedInset(&bounds, GetThumbMinSize(true), thumb_insets);
+ }
+ }
+
+ // Draw.
+ cc::PaintFlags flags;
+ flags.setAntiAlias(true);
+ flags.setStyle(cc::PaintFlags::kFill_Style);
+ SkColor thumb_color =
+ GetScrollbarColor(ScrollbarPart::kThumb, color_scheme, scroll_thumb)
+ .value();
+ flags.setColor(thumb_color);
+ const SkScalar radius = std::min(bounds.width(), bounds.height());
+ paint_canvas.DrawRoundRect(bounds, radius, flags);
+}
+
+base::Optional<SkColor> NativeThemeMac::GetScrollbarColor(
+ ScrollbarPart part,
+ ColorScheme color_scheme,
+ const ScrollbarExtraParams& extra_params) const {
+ // This function is called from the renderer process through the scrollbar
+ // drawing functions. Due to this, it cannot use any of the dynamic NS system
+ // colors.
+ bool dark_mode = color_scheme == ColorScheme::kDark;
+ if (part == ScrollbarPart::kThumb) {
+ if (extra_params.is_overlay)
+ return dark_mode ? SkColorSetARGB(0x80, 0xFF, 0xFF, 0xFF)
+ : SkColorSetARGB(0x80, 0, 0, 0);
+
+ if (dark_mode)
+ return extra_params.is_hovering ? SkColorSetRGB(0x93, 0x93, 0x93)
+ : SkColorSetRGB(0x6B, 0x6B, 0x6B);
+
+ return extra_params.is_hovering ? SkColorSetARGB(0x80, 0, 0, 0)
+ : SkColorSetARGB(0x3A, 0, 0, 0);
+ } else if (part == ScrollbarPart::kTrackInnerBorder) {
+ if (extra_params.is_overlay)
+ return dark_mode ? SkColorSetARGB(0x33, 0xE5, 0xE5, 0xE5)
+ : SkColorSetARGB(0xF9, 0xDF, 0xDF, 0xDF);
+
+ return dark_mode ? SkColorSetRGB(0x3D, 0x3D, 0x3D)
+ : SkColorSetRGB(0xE8, 0xE8, 0xE8);
+ } else if (part == ScrollbarPart::kTrackOuterBorder) {
+ if (extra_params.is_overlay)
+ return dark_mode ? SkColorSetARGB(0x28, 0xD8, 0xD8, 0xD8)
+ : SkColorSetARGB(0xC6, 0xE8, 0xE8, 0xE8);
+
+ return dark_mode ? SkColorSetRGB(0x51, 0x51, 0x51)
+ : SkColorSetRGB(0xED, 0xED, 0xED);
+ }
+
+ return base::nullopt;
+}
+
SkColor NativeThemeMac::GetSystemButtonPressedColor(SkColor base_color) const {
// TODO crbug.com/1003612: This should probably be replaced with a color
// transform.
diff --git a/chromium/ui/native_theme/native_theme_mac_unittest.cc b/chromium/ui/native_theme/native_theme_mac_unittest.cc
index 5ac53bdaf04..d6d3327bb1c 100644
--- a/chromium/ui/native_theme/native_theme_mac_unittest.cc
+++ b/chromium/ui/native_theme/native_theme_mac_unittest.cc
@@ -24,4 +24,31 @@ TEST(NativeThemeMacTest, SystemColorsExist) {
}
}
+TEST(NativeThemeMacTest, GetPlatformHighContrastColorScheme) {
+ using PrefScheme = NativeTheme::PreferredColorScheme;
+
+ constexpr NativeTheme::PlatformHighContrastColorScheme kNone =
+ NativeTheme::PlatformHighContrastColorScheme::kNone;
+
+ NativeTheme* native_theme = NativeTheme::GetInstanceForNativeUi();
+ ASSERT_TRUE(native_theme);
+
+ native_theme->set_high_contrast(false);
+ native_theme->set_preferred_color_scheme(PrefScheme::kDark);
+ EXPECT_EQ(native_theme->GetPlatformHighContrastColorScheme(), kNone);
+
+ native_theme->set_preferred_color_scheme(PrefScheme::kLight);
+ EXPECT_EQ(native_theme->GetPlatformHighContrastColorScheme(), kNone);
+
+ native_theme->set_high_contrast(true);
+ native_theme->set_preferred_color_scheme(PrefScheme::kDark);
+ EXPECT_EQ(native_theme->GetPlatformHighContrastColorScheme(), kNone);
+
+ native_theme->set_preferred_color_scheme(PrefScheme::kLight);
+ EXPECT_EQ(native_theme->GetPlatformHighContrastColorScheme(), kNone);
+
+ native_theme->set_high_contrast(false);
+ EXPECT_EQ(native_theme->GetPlatformHighContrastColorScheme(), kNone);
+}
+
} // namespace ui
diff --git a/chromium/ui/native_theme/native_theme_win.cc b/chromium/ui/native_theme/native_theme_win.cc
index 8cc9cdc5eab..91c5532be89 100644
--- a/chromium/ui/native_theme/native_theme_win.cc
+++ b/chromium/ui/native_theme/native_theme_win.cc
@@ -730,17 +730,16 @@ NativeThemeWin::CalculatePreferredColorScheme() const {
if (!UsesHighContrastColors())
return NativeTheme::CalculatePreferredColorScheme();
- // The Windows SystemParametersInfo API will return the high contrast theme
- // as a string. However, this string is language dependent. Instead, to
- // account for non-English systems, sniff out the system colors to
- // determine the high contrast color scheme.
- SkColor fg_color = system_colors_[SystemThemeColor::kWindowText];
+ // According to the spec, the preferred color scheme for web content is 'dark'
+ // if 'Canvas' has L<33% and 'light' if L>67%. On Windows, the 'Canvas'
+ // keyword is mapped to the 'Window' system color. As such, we use the
+ // luminance of 'Window' to calculate the corresponding luminance of 'Canvas'.
+ // https://www.w3.org/TR/css-color-adjust-1/#forced
SkColor bg_color = system_colors_[SystemThemeColor::kWindow];
- if (bg_color == SK_ColorWHITE && fg_color == SK_ColorBLACK)
- return NativeTheme::PreferredColorScheme::kLight;
- if (bg_color == SK_ColorBLACK && fg_color == SK_ColorWHITE)
+ float luminance = color_utils::GetRelativeLuminance(bg_color);
+ if (luminance < 0.33)
return NativeTheme::PreferredColorScheme::kDark;
- return NativeTheme::PreferredColorScheme::kNoPreference;
+ return NativeTheme::PreferredColorScheme::kLight;
}
NativeTheme::ColorScheme NativeThemeWin::GetDefaultSystemColorScheme() const {
diff --git a/chromium/ui/native_theme/native_theme_win_unittest.cc b/chromium/ui/native_theme/native_theme_win_unittest.cc
index 7d6b0dd60d9..5f0d0e842d8 100644
--- a/chromium/ui/native_theme/native_theme_win_unittest.cc
+++ b/chromium/ui/native_theme/native_theme_win_unittest.cc
@@ -9,10 +9,8 @@
namespace ui {
-using ColorScheme = NativeTheme::ColorScheme;
using PrefScheme = NativeTheme::PreferredColorScheme;
using SystemThemeColor = NativeTheme::SystemThemeColor;
-using ColorId = NativeTheme::ColorId;
class TestNativeThemeWin : public NativeThemeWin {
public:
@@ -20,108 +18,122 @@ class TestNativeThemeWin : public NativeThemeWin {
~TestNativeThemeWin() override = default;
// NativeTheme:
- bool UsesHighContrastColors() const override { return high_contrast_; }
- bool ShouldUseDarkColors() const override { return dark_mode_; }
-
- void SetDarkMode(bool dark_mode) { dark_mode_ = dark_mode; }
- void SetUsesHighContrastColors(bool high_contrast) {
- high_contrast_ = high_contrast;
- }
void SetSystemColor(SystemThemeColor system_color, SkColor color) {
system_colors_[system_color] = color;
}
- private:
- bool dark_mode_ = false;
- bool high_contrast_ = false;
-
DISALLOW_COPY_AND_ASSIGN(TestNativeThemeWin);
};
TEST(NativeThemeWinTest, CalculatePreferredColorScheme) {
TestNativeThemeWin theme;
- theme.SetUsesHighContrastColors(false);
- theme.SetDarkMode(true);
- ASSERT_EQ(theme.CalculatePreferredColorScheme(), PrefScheme::kDark);
+ theme.set_high_contrast(false);
+ theme.set_use_dark_colors(true);
+ EXPECT_EQ(theme.CalculatePreferredColorScheme(), PrefScheme::kDark);
- theme.SetDarkMode(false);
- ASSERT_EQ(theme.CalculatePreferredColorScheme(), PrefScheme::kLight);
+ theme.set_use_dark_colors(false);
+ EXPECT_EQ(theme.CalculatePreferredColorScheme(), PrefScheme::kLight);
- theme.SetUsesHighContrastColors(true);
+ theme.set_high_contrast(true);
theme.SetSystemColor(SystemThemeColor::kWindow, SK_ColorBLACK);
- theme.SetSystemColor(SystemThemeColor::kWindowText, SK_ColorWHITE);
- ASSERT_EQ(theme.CalculatePreferredColorScheme(), PrefScheme::kDark);
+ EXPECT_EQ(theme.CalculatePreferredColorScheme(), PrefScheme::kDark);
theme.SetSystemColor(SystemThemeColor::kWindow, SK_ColorWHITE);
- theme.SetSystemColor(SystemThemeColor::kWindowText, SK_ColorBLACK);
- ASSERT_EQ(theme.CalculatePreferredColorScheme(), PrefScheme::kLight);
+ EXPECT_EQ(theme.CalculatePreferredColorScheme(), PrefScheme::kLight);
- theme.SetSystemColor(SystemThemeColor::kWindowText, SK_ColorBLUE);
- ASSERT_EQ(theme.CalculatePreferredColorScheme(), PrefScheme::kNoPreference);
+ theme.SetSystemColor(SystemThemeColor::kWindow, SK_ColorBLUE);
+ EXPECT_EQ(theme.CalculatePreferredColorScheme(), PrefScheme::kDark);
+
+ theme.SetSystemColor(SystemThemeColor::kWindow, SK_ColorYELLOW);
+ EXPECT_EQ(theme.CalculatePreferredColorScheme(), PrefScheme::kLight);
- theme.SetUsesHighContrastColors(false);
- ASSERT_EQ(theme.CalculatePreferredColorScheme(), PrefScheme::kLight);
+ theme.set_high_contrast(false);
+ EXPECT_EQ(theme.CalculatePreferredColorScheme(), PrefScheme::kLight);
}
TEST(NativeThemeWinTest, GetDefaultSystemColorScheme) {
- TestNativeThemeWin theme;
+ using ColorScheme = NativeTheme::ColorScheme;
- theme.SetUsesHighContrastColors(false);
- theme.SetDarkMode(true);
- ASSERT_EQ(theme.GetDefaultSystemColorScheme(), ColorScheme::kDark);
+ TestNativeThemeWin theme;
+ theme.set_high_contrast(false);
+ theme.set_use_dark_colors(true);
+ EXPECT_EQ(theme.GetDefaultSystemColorScheme(), ColorScheme::kDark);
- theme.SetDarkMode(false);
- ASSERT_EQ(theme.GetDefaultSystemColorScheme(), ColorScheme::kLight);
+ theme.set_use_dark_colors(false);
+ EXPECT_EQ(theme.GetDefaultSystemColorScheme(), ColorScheme::kLight);
- theme.SetUsesHighContrastColors(true);
+ theme.set_high_contrast(true);
theme.SetSystemColor(SystemThemeColor::kWindow, SK_ColorBLACK);
theme.SetSystemColor(SystemThemeColor::kWindowText, SK_ColorWHITE);
- ASSERT_EQ(theme.GetDefaultSystemColorScheme(),
+ EXPECT_EQ(theme.GetDefaultSystemColorScheme(),
ColorScheme::kPlatformHighContrast);
theme.SetSystemColor(SystemThemeColor::kWindow, SK_ColorWHITE);
theme.SetSystemColor(SystemThemeColor::kWindowText, SK_ColorBLACK);
- ASSERT_EQ(theme.GetDefaultSystemColorScheme(),
+ EXPECT_EQ(theme.GetDefaultSystemColorScheme(),
ColorScheme::kPlatformHighContrast);
theme.SetSystemColor(SystemThemeColor::kWindowText, SK_ColorBLUE);
- ASSERT_EQ(theme.GetDefaultSystemColorScheme(),
+ EXPECT_EQ(theme.GetDefaultSystemColorScheme(),
ColorScheme::kPlatformHighContrast);
- theme.SetUsesHighContrastColors(false);
- ASSERT_EQ(theme.GetDefaultSystemColorScheme(), ColorScheme::kLight);
+ theme.set_high_contrast(false);
+ EXPECT_EQ(theme.GetDefaultSystemColorScheme(), ColorScheme::kLight);
}
TEST(NativeThemeWinTest, GetPlatformHighContrastColor) {
- TestNativeThemeWin theme;
+ using ColorId = NativeTheme::ColorId;
// These specific colors don't matter, but should be unique.
constexpr SkColor kWindowTextColor = SK_ColorGREEN;
constexpr SkColor kHighlightColor = SK_ColorYELLOW;
constexpr SkColor kHighlightTextColor = SK_ColorBLUE;
+ TestNativeThemeWin theme;
theme.SetSystemColor(SystemThemeColor::kWindowText, kWindowTextColor);
theme.SetSystemColor(SystemThemeColor::kHighlight, kHighlightColor);
theme.SetSystemColor(SystemThemeColor::kHighlightText, kHighlightTextColor);
// Test that we get regular colors when HC is off.
- theme.SetUsesHighContrastColors(false);
- ASSERT_NE(theme.GetSystemColor(ColorId::kColorId_LabelEnabledColor),
+ theme.set_high_contrast(false);
+ EXPECT_NE(theme.GetSystemColor(ColorId::kColorId_LabelEnabledColor),
kWindowTextColor);
- ASSERT_NE(theme.GetSystemColor(ColorId::kColorId_ProminentButtonColor),
+ EXPECT_NE(theme.GetSystemColor(ColorId::kColorId_ProminentButtonColor),
kHighlightColor);
- ASSERT_NE(theme.GetSystemColor(ColorId::kColorId_TextOnProminentButtonColor),
+ EXPECT_NE(theme.GetSystemColor(ColorId::kColorId_TextOnProminentButtonColor),
kHighlightTextColor);
// Test that we get HC colors when HC is on.
- theme.SetUsesHighContrastColors(true);
- ASSERT_EQ(theme.GetSystemColor(ColorId::kColorId_LabelEnabledColor),
+ theme.set_high_contrast(true);
+ EXPECT_EQ(theme.GetSystemColor(ColorId::kColorId_LabelEnabledColor),
kWindowTextColor);
- ASSERT_EQ(theme.GetSystemColor(ColorId::kColorId_ProminentButtonColor),
+ EXPECT_EQ(theme.GetSystemColor(ColorId::kColorId_ProminentButtonColor),
kHighlightColor);
- ASSERT_EQ(theme.GetSystemColor(ColorId::kColorId_TextOnProminentButtonColor),
+ EXPECT_EQ(theme.GetSystemColor(ColorId::kColorId_TextOnProminentButtonColor),
kHighlightTextColor);
}
+TEST(NativeThemeWinTest, GetPlatformHighContrastColorScheme) {
+ using HCColorScheme = NativeTheme::PlatformHighContrastColorScheme;
+
+ TestNativeThemeWin theme;
+ theme.set_high_contrast(false);
+ theme.set_preferred_color_scheme(PrefScheme::kDark);
+ EXPECT_EQ(theme.GetPlatformHighContrastColorScheme(), HCColorScheme::kNone);
+
+ theme.set_preferred_color_scheme(PrefScheme::kLight);
+ EXPECT_EQ(theme.GetPlatformHighContrastColorScheme(), HCColorScheme::kNone);
+
+ theme.set_high_contrast(true);
+ theme.set_preferred_color_scheme(PrefScheme::kDark);
+ EXPECT_EQ(theme.GetPlatformHighContrastColorScheme(), HCColorScheme::kDark);
+
+ theme.set_preferred_color_scheme(PrefScheme::kLight);
+ EXPECT_EQ(theme.GetPlatformHighContrastColorScheme(), HCColorScheme::kLight);
+
+ theme.set_high_contrast(false);
+ EXPECT_EQ(theme.GetPlatformHighContrastColorScheme(), HCColorScheme::kNone);
+}
+
} // namespace ui
diff --git a/chromium/ui/native_theme/themed_vector_icon.cc b/chromium/ui/native_theme/themed_vector_icon.cc
index 3881f84d423..bf3b0e65d9f 100644
--- a/chromium/ui/native_theme/themed_vector_icon.cc
+++ b/chromium/ui/native_theme/themed_vector_icon.cc
@@ -43,13 +43,14 @@ ThemedVectorIcon::ThemedVectorIcon(ThemedVectorIcon&&) = default;
ThemedVectorIcon& ThemedVectorIcon::operator=(ThemedVectorIcon&&) = default;
-const gfx::ImageSkia ThemedVectorIcon::GetImageSkia(NativeTheme* theme) const {
+const gfx::ImageSkia ThemedVectorIcon::GetImageSkia(
+ const NativeTheme* theme) const {
DCHECK(!empty());
return icon_size_ > 0 ? CreateVectorIcon(*icon_, icon_size_, GetColor(theme))
: CreateVectorIcon(*icon_, GetColor(theme));
}
-const gfx::ImageSkia ThemedVectorIcon::GetImageSkia(NativeTheme* theme,
+const gfx::ImageSkia ThemedVectorIcon::GetImageSkia(const NativeTheme* theme,
int icon_size) const {
DCHECK(!empty());
return CreateVectorIcon(*icon_, icon_size, GetColor(theme));
@@ -61,7 +62,7 @@ const gfx::ImageSkia ThemedVectorIcon::GetImageSkia(SkColor color) const {
: CreateVectorIcon(*icon_, color);
}
-SkColor ThemedVectorIcon::GetColor(NativeTheme* theme) const {
+SkColor ThemedVectorIcon::GetColor(const NativeTheme* theme) const {
DCHECK(color_id_ || color_);
return color_id_ ? theme->GetSystemColor(color_id_.value()) : color_.value();
}
diff --git a/chromium/ui/native_theme/themed_vector_icon.h b/chromium/ui/native_theme/themed_vector_icon.h
index e65348c9fde..bf929d6af94 100644
--- a/chromium/ui/native_theme/themed_vector_icon.h
+++ b/chromium/ui/native_theme/themed_vector_icon.h
@@ -40,12 +40,13 @@ class NATIVE_THEME_EXPORT ThemedVectorIcon {
void clear() { icon_ = nullptr; }
bool empty() const { return !icon_; }
- const gfx::ImageSkia GetImageSkia(NativeTheme* theme) const;
- const gfx::ImageSkia GetImageSkia(NativeTheme* theme, int icon_size) const;
+ const gfx::ImageSkia GetImageSkia(const NativeTheme* theme) const;
+ const gfx::ImageSkia GetImageSkia(const NativeTheme* theme,
+ int icon_size) const;
const gfx::ImageSkia GetImageSkia(SkColor color) const;
private:
- SkColor GetColor(NativeTheme* theme) const;
+ SkColor GetColor(const NativeTheme* theme) const;
const gfx::VectorIcon* icon_ = nullptr;
int icon_size_ = 0;
diff --git a/chromium/ui/ozone/BUILD.gn b/chromium/ui/ozone/BUILD.gn
index a3e07b47d27..e3eb1e17596 100644
--- a/chromium/ui/ozone/BUILD.gn
+++ b/chromium/ui/ozone/BUILD.gn
@@ -66,8 +66,6 @@ constructor_list_cc_file = "$target_gen_dir/constructor_list.cc"
jumbo_component("ozone_base") {
sources = [
- "public/cursor_factory_ozone.cc",
- "public/cursor_factory_ozone.h",
"public/gl_ozone.h",
"public/gpu_platform_support_host.cc",
"public/gpu_platform_support_host.h",
@@ -105,7 +103,6 @@ jumbo_component("ozone_base") {
"//ipc",
"//skia",
"//ui/base/clipboard:clipboard_types",
- "//ui/base/cursor/mojom:cursor_type",
"//ui/display",
"//ui/display/types",
"//ui/display/util",
@@ -125,11 +122,13 @@ jumbo_component("ozone_base") {
public_deps += [ "//gpu/vulkan" ]
}
+ if (is_fuchsia) {
+ public_deps += [ "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.images" ]
+ }
+
visibility += [
# Everyone should depend on //ui/ozone instead except a handful of
# things that would otherwise create a cycle.
- "//ui/base",
- "//ui/base/cursor",
"//ui/events/ozone/*",
"//ui/ozone/common/*",
"//ui/ozone/public/mojom",
diff --git a/chromium/ui/ozone/demo/gl_renderer.cc b/chromium/ui/ozone/demo/gl_renderer.cc
index c5812189846..c25b8f9c15d 100644
--- a/chromium/ui/ozone/demo/gl_renderer.cc
+++ b/chromium/ui/ozone/demo/gl_renderer.cc
@@ -46,7 +46,7 @@ bool GlRenderer::Initialize() {
gl_surface_->Resize(size_, 1.f, gfx::ColorSpace(), true);
// Schedule the initial render.
- PostRenderFrameTask(gfx::SwapResult::SWAP_ACK, nullptr);
+ PostRenderFrameTask(gfx::SwapCompletionResult(gfx::SwapResult::SWAP_ACK));
return true;
}
@@ -69,16 +69,14 @@ void GlRenderer::RenderFrame() {
weak_ptr_factory_.GetWeakPtr()));
} else {
PostRenderFrameTask(
- gl_surface_->SwapBuffers(base::BindOnce(
- &GlRenderer::OnPresentation, weak_ptr_factory_.GetWeakPtr())),
- nullptr);
+ gfx::SwapCompletionResult(gl_surface_->SwapBuffers(base::BindOnce(
+ &GlRenderer::OnPresentation, weak_ptr_factory_.GetWeakPtr()))));
}
}
-void GlRenderer::PostRenderFrameTask(gfx::SwapResult result,
- std::unique_ptr<gfx::GpuFence> gpu_fence) {
- if (gpu_fence)
- gpu_fence->Wait();
+void GlRenderer::PostRenderFrameTask(gfx::SwapCompletionResult result) {
+ if (result.gpu_fence)
+ result.gpu_fence->Wait();
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
diff --git a/chromium/ui/ozone/demo/gl_renderer.h b/chromium/ui/ozone/demo/gl_renderer.h
index c5a6a3b2ada..62d391b0f1d 100644
--- a/chromium/ui/ozone/demo/gl_renderer.h
+++ b/chromium/ui/ozone/demo/gl_renderer.h
@@ -14,7 +14,6 @@
#include "ui/ozone/demo/renderer_base.h"
namespace gfx {
-class GpuFence;
struct PresentationFeedback;
} // namespace gfx
@@ -39,8 +38,7 @@ class GlRenderer : public RendererBase {
private:
void RenderFrame();
- void PostRenderFrameTask(gfx::SwapResult result,
- std::unique_ptr<gfx::GpuFence> gpu_fence);
+ void PostRenderFrameTask(gfx::SwapCompletionResult result);
void OnPresentation(const gfx::PresentationFeedback& feedback);
std::unique_ptr<PlatformWindowSurface> window_surface_;
diff --git a/chromium/ui/ozone/demo/skia/skia_gl_renderer.cc b/chromium/ui/ozone/demo/skia/skia_gl_renderer.cc
index ceb5cc4f5f2..c5be0bb4632 100644
--- a/chromium/ui/ozone/demo/skia/skia_gl_renderer.cc
+++ b/chromium/ui/ozone/demo/skia/skia_gl_renderer.cc
@@ -76,7 +76,7 @@ bool SkiaGlRenderer::Initialize() {
gr_context_ = GrContext::MakeGL(std::move(native_interface), options);
DCHECK(gr_context_);
- PostRenderFrameTask(gfx::SwapResult::SWAP_ACK, nullptr);
+ PostRenderFrameTask(gfx::SwapCompletionResult(gfx::SwapResult::SWAP_ACK));
return true;
}
@@ -106,7 +106,7 @@ void SkiaGlRenderer::RenderFrame() {
} else {
Draw(sk_surface_->getCanvas(), NextFraction());
}
- gr_context_->flush();
+ gr_context_->flushAndSubmit();
glFinish();
if (gl_surface_->SupportsAsyncSwap()) {
@@ -117,17 +117,14 @@ void SkiaGlRenderer::RenderFrame() {
weak_ptr_factory_.GetWeakPtr()));
} else {
PostRenderFrameTask(
- gl_surface_->SwapBuffers(base::BindOnce(
- &SkiaGlRenderer::OnPresentation, weak_ptr_factory_.GetWeakPtr())),
- nullptr);
+ gfx::SwapCompletionResult(gl_surface_->SwapBuffers(base::BindOnce(
+ &SkiaGlRenderer::OnPresentation, weak_ptr_factory_.GetWeakPtr()))));
}
}
-void SkiaGlRenderer::PostRenderFrameTask(
- gfx::SwapResult result,
- std::unique_ptr<gfx::GpuFence> gpu_fence) {
- if (gpu_fence)
- gpu_fence->Wait();
+void SkiaGlRenderer::PostRenderFrameTask(gfx::SwapCompletionResult result) {
+ if (result.gpu_fence)
+ result.gpu_fence->Wait();
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(&SkiaGlRenderer::RenderFrame,
diff --git a/chromium/ui/ozone/demo/skia/skia_gl_renderer.h b/chromium/ui/ozone/demo/skia/skia_gl_renderer.h
index 8abcc67d6cf..08195eebf87 100644
--- a/chromium/ui/ozone/demo/skia/skia_gl_renderer.h
+++ b/chromium/ui/ozone/demo/skia/skia_gl_renderer.h
@@ -21,7 +21,6 @@
#include "ui/ozone/demo/renderer_base.h"
namespace gfx {
-class GpuFence;
struct PresentationFeedback;
} // namespace gfx
@@ -47,8 +46,7 @@ class SkiaGlRenderer : public RendererBase,
protected:
virtual void RenderFrame();
- virtual void PostRenderFrameTask(gfx::SwapResult result,
- std::unique_ptr<gfx::GpuFence>);
+ virtual void PostRenderFrameTask(gfx::SwapCompletionResult result);
void Draw(SkCanvas* canvas, float fraction);
void StartDDLRenderThreadIfNecessary(SkSurface* sk_surface);
diff --git a/chromium/ui/ozone/demo/skia/skia_renderer_factory.h b/chromium/ui/ozone/demo/skia/skia_renderer_factory.h
index 192c12d67af..029211cad06 100644
--- a/chromium/ui/ozone/demo/skia/skia_renderer_factory.h
+++ b/chromium/ui/ozone/demo/skia/skia_renderer_factory.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/macros.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/ozone/demo/renderer_factory.h"
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 e2ee9432d98..ec083066e53 100644
--- a/chromium/ui/ozone/demo/skia/skia_surfaceless_gl_renderer.cc
+++ b/chromium/ui/ozone/demo/skia/skia_surfaceless_gl_renderer.cc
@@ -244,7 +244,7 @@ void SurfacelessSkiaGlRenderer::RenderFrame() {
} else {
Draw(sk_surface->getCanvas(), NextFraction());
}
- gr_context_->flush();
+ gr_context_->flushAndSubmit();
glFinish();
if (!disable_primary_plane_) {
@@ -270,9 +270,8 @@ void SurfacelessSkiaGlRenderer::RenderFrame() {
}
void SurfacelessSkiaGlRenderer::PostRenderFrameTask(
- gfx::SwapResult result,
- std::unique_ptr<gfx::GpuFence> gpu_fence) {
- switch (result) {
+ gfx::SwapCompletionResult result) {
+ switch (result.swap_result) {
case gfx::SwapResult::SWAP_NAK_RECREATE_BUFFERS:
for (size_t i = 0; i < base::size(buffers_); ++i) {
buffers_[i] = std::make_unique<BufferWrapper>();
@@ -282,7 +281,7 @@ void SurfacelessSkiaGlRenderer::PostRenderFrameTask(
}
FALLTHROUGH; // We want to render a new frame anyways.
case gfx::SwapResult::SWAP_ACK:
- SkiaGlRenderer::PostRenderFrameTask(result, std::move(gpu_fence));
+ SkiaGlRenderer::PostRenderFrameTask(std::move(result));
break;
case gfx::SwapResult::SWAP_FAILED:
LOG(FATAL) << "Failed to swap buffers";
diff --git a/chromium/ui/ozone/demo/skia/skia_surfaceless_gl_renderer.h b/chromium/ui/ozone/demo/skia/skia_surfaceless_gl_renderer.h
index e24652c26a5..469083f14dd 100644
--- a/chromium/ui/ozone/demo/skia/skia_surfaceless_gl_renderer.h
+++ b/chromium/ui/ozone/demo/skia/skia_surfaceless_gl_renderer.h
@@ -30,8 +30,7 @@ class SurfacelessSkiaGlRenderer : public SkiaGlRenderer {
private:
// SkiaGlRenderer:
void RenderFrame() override;
- void PostRenderFrameTask(gfx::SwapResult result,
- std::unique_ptr<gfx::GpuFence>) override;
+ void PostRenderFrameTask(gfx::SwapCompletionResult result) override;
class BufferWrapper;
diff --git a/chromium/ui/ozone/demo/surfaceless_gl_renderer.cc b/chromium/ui/ozone/demo/surfaceless_gl_renderer.cc
index 6117ac4f0f3..bc45833e24b 100644
--- a/chromium/ui/ozone/demo/surfaceless_gl_renderer.cc
+++ b/chromium/ui/ozone/demo/surfaceless_gl_renderer.cc
@@ -202,7 +202,7 @@ bool SurfacelessGlRenderer::Initialize() {
use_gpu_fences_ = gl_surface_->SupportsPlaneGpuFences();
// Schedule the initial render.
- PostRenderFrameTask(gfx::SwapResult::SWAP_ACK, nullptr);
+ PostRenderFrameTask(gfx::SwapCompletionResult(gfx::SwapResult::SWAP_ACK));
return true;
}
@@ -288,12 +288,11 @@ void SurfacelessGlRenderer::RenderFrame() {
}
void SurfacelessGlRenderer::PostRenderFrameTask(
- gfx::SwapResult result,
- std::unique_ptr<gfx::GpuFence> gpu_fence) {
- if (gpu_fence)
- gpu_fence->Wait();
+ gfx::SwapCompletionResult result) {
+ if (result.gpu_fence)
+ result.gpu_fence->Wait();
- switch (result) {
+ switch (result.swap_result) {
case gfx::SwapResult::SWAP_NAK_RECREATE_BUFFERS:
for (size_t i = 0; i < base::size(buffers_); ++i) {
buffers_[i] = std::make_unique<BufferWrapper>();
diff --git a/chromium/ui/ozone/demo/surfaceless_gl_renderer.h b/chromium/ui/ozone/demo/surfaceless_gl_renderer.h
index ba6d12a24e5..af3a3b2c690 100644
--- a/chromium/ui/ozone/demo/surfaceless_gl_renderer.h
+++ b/chromium/ui/ozone/demo/surfaceless_gl_renderer.h
@@ -34,8 +34,7 @@ class SurfacelessGlRenderer : public RendererBase {
private:
void RenderFrame();
- void PostRenderFrameTask(gfx::SwapResult result,
- std::unique_ptr<gfx::GpuFence> gpu_fence);
+ void PostRenderFrameTask(gfx::SwapCompletionResult result);
void OnPresentation(const gfx::PresentationFeedback& feedback);
class BufferWrapper {
diff --git a/chromium/ui/ozone/demo/vulkan_renderer.cc b/chromium/ui/ozone/demo/vulkan_renderer.cc
index 6d778ce8e98..04235e74ee3 100644
--- a/chromium/ui/ozone/demo/vulkan_renderer.cc
+++ b/chromium/ui/ozone/demo/vulkan_renderer.cc
@@ -10,6 +10,7 @@
#include "base/bind.h"
#include "base/location.h"
+#include "base/logging.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
#include "gpu/vulkan/init/vulkan_factory.h"
diff --git a/chromium/ui/ozone/ozone.gni b/chromium/ui/ozone/ozone.gni
index 13fecf9038a..05d59e73fad 100644
--- a/chromium/ui/ozone/ozone.gni
+++ b/chromium/ui/ozone/ozone.gni
@@ -4,6 +4,7 @@
import("//build/config/chromecast_build.gni")
import("//build/config/ui.gni")
+import("//build/toolchain/kythe.gni")
import("//build/toolchain/toolchain.gni")
declare_args() {
@@ -65,6 +66,12 @@ declare_args() {
ozone_platform = "x11"
ozone_platform_gbm = true
ozone_platform_x11 = true
+
+ # Enable the Ozone Wayland platform for ChromiumOS codesearch-gen bots
+ # so we get cross-references in codesearch. We can remove this once
+ # we can compile both x11 and Ozone on desktop Linux Chrome.
+ # TODO(crbug.com/1085700): Remove enable_kythe_annotations here.
+ ozone_platform_wayland = enable_kythe_annotations
} else if (is_desktop_linux) {
ozone_platform = "x11"
ozone_platform_wayland = true
diff --git a/chromium/ui/ozone/platform/cast/BUILD.gn b/chromium/ui/ozone/platform/cast/BUILD.gn
index 54d03308b82..22ef134ffb2 100644
--- a/chromium/ui/ozone/platform/cast/BUILD.gn
+++ b/chromium/ui/ozone/platform/cast/BUILD.gn
@@ -43,6 +43,7 @@ source_set("cast") {
"//chromecast:chromecast_buildflags",
"//chromecast/base:base",
"//chromecast/graphics:libcast_graphics_1.0",
+ "//ui/base/cursor:cursor_base",
"//ui/base/ime",
"//ui/events/ozone",
"//ui/events/ozone/evdev",
diff --git a/chromium/ui/ozone/platform/cast/ozone_platform_cast.cc b/chromium/ui/ozone/platform/cast/ozone_platform_cast.cc
index a2ce0266582..b5702ad228d 100644
--- a/chromium/ui/ozone/platform/cast/ozone_platform_cast.cc
+++ b/chromium/ui/ozone/platform/cast/ozone_platform_cast.cc
@@ -14,6 +14,7 @@
#include "chromecast/chromecast_buildflags.h"
#include "chromecast/public/cast_egl_platform.h"
#include "chromecast/public/cast_egl_platform_shlib.h"
+#include "ui/base/cursor/cursor_factory.h"
#include "ui/base/ime/input_method_minimal.h"
#include "ui/display/types/native_display_delegate.h"
#include "ui/events/ozone/device/device_manager.h"
@@ -24,7 +25,6 @@
#include "ui/ozone/platform/cast/overlay_manager_cast.h"
#include "ui/ozone/platform/cast/platform_window_cast.h"
#include "ui/ozone/platform/cast/surface_factory_cast.h"
-#include "ui/ozone/public/cursor_factory_ozone.h"
#include "ui/ozone/public/gpu_platform_support_host.h"
#include "ui/ozone/public/input_controller.h"
#include "ui/ozone/public/ozone_platform.h"
@@ -83,9 +83,7 @@ class OzonePlatformCast : public OzonePlatform {
OverlayManagerOzone* GetOverlayManager() override {
return overlay_manager_.get();
}
- CursorFactoryOzone* GetCursorFactoryOzone() override {
- return cursor_factory_.get();
- }
+ CursorFactory* GetCursorFactory() override { return cursor_factory_.get(); }
InputController* GetInputController() override {
return event_factory_ozone_->input_controller();
}
@@ -123,7 +121,7 @@ class OzonePlatformCast : public OzonePlatform {
void InitializeUI(const InitParams& params) override {
device_manager_ = CreateDeviceManager();
- cursor_factory_ = std::make_unique<CursorFactoryOzone>();
+ cursor_factory_ = std::make_unique<CursorFactory>();
gpu_platform_support_host_.reset(CreateStubGpuPlatformSupportHost());
// Enable dummy software rendering support if GPU process disabled
@@ -157,7 +155,7 @@ class OzonePlatformCast : public OzonePlatform {
std::unique_ptr<DeviceManager> device_manager_;
std::unique_ptr<CastEglPlatform> egl_platform_;
std::unique_ptr<SurfaceFactoryCast> surface_factory_;
- std::unique_ptr<CursorFactoryOzone> cursor_factory_;
+ std::unique_ptr<CursorFactory> cursor_factory_;
std::unique_ptr<GpuPlatformSupportHost> gpu_platform_support_host_;
std::unique_ptr<OverlayManagerOzone> overlay_manager_;
std::unique_ptr<EventFactoryEvdev> event_factory_ozone_;
diff --git a/chromium/ui/ozone/platform/drm/BUILD.gn b/chromium/ui/ozone/platform/drm/BUILD.gn
index 0ef7cd7e786..01ed60608fd 100644
--- a/chromium/ui/ozone/platform/drm/BUILD.gn
+++ b/chromium/ui/ozone/platform/drm/BUILD.gn
@@ -127,6 +127,8 @@ source_set("gbm") {
"//third_party/libsync",
"//third_party/minigbm",
"//ui/base",
+ "//ui/base/cursor",
+ "//ui/base/cursor:cursor_base",
"//ui/base/ime",
"//ui/display",
"//ui/display/types",
@@ -178,6 +180,7 @@ source_set("gbm_unittests") {
testonly = true
sources = [
"common/drm_util_unittest.cc",
+ "gpu/drm_display_unittest.cc",
"gpu/drm_overlay_manager_unittest.cc",
"gpu/drm_overlay_validator_unittest.cc",
"gpu/drm_thread_unittest.cc",
diff --git a/chromium/ui/ozone/platform/drm/common/drm_util.cc b/chromium/ui/ozone/platform/drm/common/drm_util.cc
index 7ac144c6bdf..656330d42bf 100644
--- a/chromium/ui/ozone/platform/drm/common/drm_util.cc
+++ b/chromium/ui/ozone/platform/drm/common/drm_util.cc
@@ -18,6 +18,7 @@
#include "base/containers/flat_map.h"
#include "base/logging.h"
#include "base/metrics/histogram_functions.h"
+#include "base/notreached.h"
#include "ui/display/types/display_constants.h"
#include "ui/display/types/display_mode.h"
#include "ui/display/util/display_util.h"
@@ -210,7 +211,7 @@ display::PanelOrientation GetPanelOrientation(int fd,
int index = GetDrmProperty(fd, connector, "panel orientation", &property);
if (index < 0)
return display::PanelOrientation::kNormal;
- DCHECK_LT(connector->prop_values[index], display::PanelOrientation::kLast);
+ DCHECK_LE(connector->prop_values[index], display::PanelOrientation::kLast);
return static_cast<display::PanelOrientation>(connector->prop_values[index]);
}
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_device.h b/chromium/ui/ozone/platform/drm/gpu/drm_device.h
index 0cbcca2fe96..fdc7f2d0a38 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_device.h
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_device.h
@@ -240,6 +240,7 @@ class DrmDevice : public base::RefCountedThreadSafe<DrmDevice> {
protected:
friend class base::RefCountedThreadSafe<DrmDevice>;
+ friend class DrmDisplayTest;
virtual ~DrmDevice();
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_device_manager.cc b/chromium/ui/ozone/platform/drm/gpu/drm_device_manager.cc
index 5d879fa9853..9b1a8b2a4a6 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_device_manager.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_device_manager.cc
@@ -8,6 +8,7 @@
#include <utility>
#include "base/file_descriptor_posix.h"
+#include "base/logging.h"
#include "base/single_thread_task_runner.h"
#include "ui/ozone/platform/drm/gpu/drm_device.h"
#include "ui/ozone/platform/drm/gpu/drm_device_generator.h"
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_display.cc b/chromium/ui/ozone/platform/drm/gpu/drm_display.cc
index 89b9ea98bb4..0866e1989ed 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_display.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_display.cc
@@ -7,10 +7,13 @@
#include <xf86drmMode.h>
#include <memory>
+#include "base/logging.h"
#include "base/stl_util.h"
#include "base/trace_event/trace_event.h"
+#include "ui/display/display_features.h"
#include "ui/display/types/display_snapshot.h"
#include "ui/display/types/gamma_ramp_rgb_entry.h"
+#include "ui/gfx/color_space.h"
#include "ui/ozone/platform/drm/common/drm_util.h"
#include "ui/ozone/platform/drm/gpu/drm_device.h"
#include "ui/ozone/platform/drm/gpu/screen_manager.h"
@@ -82,12 +85,24 @@ std::vector<drmModeModeInfo> GetDrmModeVector(drmModeConnector* connector) {
return modes;
}
+void FillLinearValues(std::vector<display::GammaRampRGBEntry>* table,
+ size_t table_size,
+ float max_value) {
+ for (size_t i = 0; i < table_size; i++) {
+ const uint16_t v =
+ max_value * std::numeric_limits<uint16_t>::max() * i / (table_size - 1);
+ struct display::GammaRampRGBEntry gamma_entry = {v, v, v};
+ table->push_back(gamma_entry);
+ }
+}
+
} // namespace
DrmDisplay::DrmDisplay(ScreenManager* screen_manager,
const scoped_refptr<DrmDevice>& drm)
- : screen_manager_(screen_manager), drm_(drm) {
-}
+ : screen_manager_(screen_manager),
+ drm_(drm),
+ current_color_space_(gfx::ColorSpace::CreateSRGB()) {}
DrmDisplay::~DrmDisplay() {
}
@@ -112,6 +127,14 @@ std::unique_ptr<display::DisplaySnapshot> DrmDisplay::Update(
display_id_ = params->display_id();
modes_ = GetDrmModeVector(info->connector());
+ is_hdr_capable_ =
+ params->bits_per_channel() > 8 && params->color_space().IsHDR();
+#if defined(OS_CHROMEOS)
+ is_hdr_capable_ =
+ is_hdr_capable_ &&
+ base::FeatureList::IsEnabled(display::features::kUseHDRTransferFunction);
+#endif
+
return params;
}
@@ -202,10 +225,14 @@ void DrmDisplay::SetBackgroundColor(const uint64_t background_color) {
void DrmDisplay::SetGammaCorrection(
const std::vector<display::GammaRampRGBEntry>& degamma_lut,
const std::vector<display::GammaRampRGBEntry>& gamma_lut) {
- if (!drm_->plane_manager()->SetGammaCorrection(crtc_, degamma_lut,
- gamma_lut)) {
- LOG(ERROR) << "Failed to set gamma tables for display: crtc_id = " << crtc_;
- }
+ // When both |degamma_lut| and |gamma_lut| are empty they are interpreted as
+ // "linear/pass-thru" [1]. If the display |is_hdr_capable_| we have to make
+ // sure the |current_color_space_| is considered properly.
+ // [1] https://www.kernel.org/doc/html/v4.19/gpu/drm-kms.html#color-management-properties
+ if (degamma_lut.empty() && gamma_lut.empty() && is_hdr_capable_)
+ SetColorSpace(current_color_space_);
+ else
+ CommitGammaCorrection(degamma_lut, gamma_lut);
}
// TODO(gildekel): consider reformatting this to use the new DRM API or cache
@@ -229,4 +256,35 @@ void DrmDisplay::SetPrivacyScreen(bool enabled) {
}
}
+void DrmDisplay::SetColorSpace(const gfx::ColorSpace& color_space) {
+ // There's only something to do if the display supports HDR.
+ if (!is_hdr_capable_)
+ return;
+ current_color_space_ = color_space;
+
+ // When |color_space| is HDR we can simply leave the gamma tables empty, which
+ // is interpreted as "linear/pass-thru", see [1]. However when we have an SDR
+ // |color_space|, we need to write a scaled down |gamma| function to prevent
+ // the mode change brightness to be visible.
+ std::vector<display::GammaRampRGBEntry> degamma;
+ std::vector<display::GammaRampRGBEntry> gamma;
+ if (current_color_space_.IsHDR())
+ return CommitGammaCorrection(degamma, gamma);
+
+ // TODO(mcasas) This should be the same value as in DisplayChangeObservers's
+ // FillDisplayColorSpaces, move to a common place.
+ constexpr float kHDRLevel = 2.0;
+ // TODO(mcasas): Retrieve this from the |drm_| HardwareDisplayPlaneManager.
+ constexpr size_t kNumGammaSamples = 16ul;
+ FillLinearValues(&gamma, kNumGammaSamples, 1.0 / kHDRLevel);
+ CommitGammaCorrection(degamma, gamma);
+}
+
+void DrmDisplay::CommitGammaCorrection(
+ const std::vector<display::GammaRampRGBEntry>& degamma_lut,
+ const std::vector<display::GammaRampRGBEntry>& gamma_lut) {
+ if (!drm_->plane_manager()->SetGammaCorrection(crtc_, degamma_lut, gamma_lut))
+ LOG(ERROR) << "Failed to set gamma tables for display: crtc_id = " << crtc_;
+}
+
} // namespace ui
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_display.h b/chromium/ui/ozone/platform/drm/gpu/drm_display.h
index de721282b28..a658477fc2d 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_display.h
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_display.h
@@ -13,6 +13,7 @@
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "ui/display/types/display_constants.h"
+#include "ui/gfx/color_space.h"
#include "ui/gfx/geometry/point.h"
#include "ui/ozone/platform/drm/common/scoped_drm_types.h"
@@ -24,7 +25,6 @@ struct GammaRampRGBEntry;
}
namespace ui {
-
class DrmDevice;
class HardwareDisplayControllerInfo;
class ScreenManager;
@@ -54,8 +54,15 @@ class DrmDisplay {
const std::vector<display::GammaRampRGBEntry>& degamma_lut,
const std::vector<display::GammaRampRGBEntry>& gamma_lut);
void SetPrivacyScreen(bool enabled);
+ void SetColorSpace(const gfx::ColorSpace& color_space);
+
+ void set_is_hdr_capable_for_testing(bool value) { is_hdr_capable_ = value; }
private:
+ void CommitGammaCorrection(
+ const std::vector<display::GammaRampRGBEntry>& degamma_lut,
+ const std::vector<display::GammaRampRGBEntry>& gamma_lut);
+
ScreenManager* screen_manager_; // Not owned.
int64_t display_id_ = -1;
@@ -64,6 +71,8 @@ class DrmDisplay {
ScopedDrmConnectorPtr connector_;
std::vector<drmModeModeInfo> modes_;
gfx::Point origin_;
+ bool is_hdr_capable_ = false;
+ gfx::ColorSpace current_color_space_;
DISALLOW_COPY_AND_ASSIGN(DrmDisplay);
};
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_display_unittest.cc b/chromium/ui/ozone/platform/drm/gpu/drm_display_unittest.cc
new file mode 100644
index 00000000000..30e8c7ef8bc
--- /dev/null
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_display_unittest.cc
@@ -0,0 +1,192 @@
+// 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/drm/gpu/drm_display.h"
+
+#include <utility>
+
+#include "base/test/task_environment.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/color_space.h"
+#include "ui/gfx/linux/test/mock_gbm_device.h"
+#include "ui/ozone/platform/drm/gpu/hardware_display_plane.h"
+#include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h"
+#include "ui/ozone/platform/drm/gpu/mock_drm_device.h"
+#include "ui/ozone/platform/drm/gpu/screen_manager.h"
+
+using ::testing::_;
+using ::testing::SizeIs;
+
+// Verifies that the argument goes from 0 to the maximum uint16_t times |scale|.
+MATCHER_P(MatchesLinearRamp, scale, "") {
+ EXPECT_FALSE(arg.empty());
+
+ EXPECT_EQ(arg.front().r, 0);
+ EXPECT_EQ(arg.front().g, 0);
+ EXPECT_EQ(arg.front().b, 0);
+
+ const uint16_t max_value = std::numeric_limits<uint16_t>::max() * scale;
+
+ const auto middle_element = arg[arg.size() / 2];
+ const uint16_t middle_value = max_value * (arg.size() / 2) / (arg.size() - 1);
+ EXPECT_NEAR(middle_element.r, middle_value, 1);
+ EXPECT_NEAR(middle_element.g, middle_value, 1);
+ EXPECT_NEAR(middle_element.b, middle_value, 1);
+
+ const uint16_t last_value = max_value;
+ EXPECT_EQ(arg.back().r, last_value);
+ EXPECT_EQ(arg.back().g, last_value);
+ EXPECT_EQ(arg.back().b, last_value);
+
+ return true;
+}
+
+namespace ui {
+
+namespace {
+
+class MockHardwareDisplayPlaneManager : public HardwareDisplayPlaneManager {
+ public:
+ explicit MockHardwareDisplayPlaneManager(DrmDevice* drm)
+ : HardwareDisplayPlaneManager(drm) {}
+ ~MockHardwareDisplayPlaneManager() override = default;
+
+ MOCK_METHOD3(SetGammaCorrection,
+ bool(uint32_t crtc_id,
+ const std::vector<display::GammaRampRGBEntry>& degamma_lut,
+ const std::vector<display::GammaRampRGBEntry>& gamma_lut));
+
+ bool Modeset(uint32_t crtc_id,
+ uint32_t framebuffer_id,
+ uint32_t connector_id,
+ const drmModeModeInfo& mode,
+ const HardwareDisplayPlaneList& plane_list) override {
+ return false;
+ }
+ bool DisableModeset(uint32_t crtc_id, uint32_t connector) override {
+ return false;
+ }
+ bool Commit(HardwareDisplayPlaneList* plane_list,
+ scoped_refptr<PageFlipRequest> page_flip_request,
+ std::unique_ptr<gfx::GpuFence>* out_fence) override {
+ return false;
+ }
+ bool DisableOverlayPlanes(HardwareDisplayPlaneList* plane_list) override {
+ return false;
+ }
+ bool SetColorCorrectionOnAllCrtcPlanes(
+ uint32_t crtc_id,
+ ScopedDrmColorCtmPtr ctm_blob_data) override {
+ return false;
+ }
+ bool ValidatePrimarySize(const DrmOverlayPlane& primary,
+ const drmModeModeInfo& mode) override {
+ return false;
+ }
+ void RequestPlanesReadyCallback(
+ DrmOverlayPlaneList planes,
+ base::OnceCallback<void(DrmOverlayPlaneList planes)> callback) override {
+ return;
+ }
+ bool InitializePlanes() override { return false; }
+ bool SetPlaneData(HardwareDisplayPlaneList* plane_list,
+ HardwareDisplayPlane* hw_plane,
+ const DrmOverlayPlane& overlay,
+ uint32_t crtc_id,
+ const gfx::Rect& src_rect) override {
+ return false;
+ }
+ std::unique_ptr<HardwareDisplayPlane> CreatePlane(
+ uint32_t plane_id) override {
+ return nullptr;
+ }
+ bool IsCompatible(HardwareDisplayPlane* plane,
+ const DrmOverlayPlane& overlay,
+ uint32_t crtc_index) const override {
+ return false;
+ }
+ bool CommitColorMatrix(const CrtcProperties& crtc_props) override {
+ return false;
+ }
+ bool CommitGammaCorrection(const CrtcProperties& crtc_props) override {
+ return false;
+ }
+};
+
+} // namespace
+
+class DrmDisplayTest : public testing::Test {
+ protected:
+ DrmDisplayTest()
+ : mock_drm_device_(base::MakeRefCounted<MockDrmDevice>(
+ std::make_unique<MockGbmDevice>())),
+ drm_display_(&screen_manager_, mock_drm_device_) {}
+
+ MockHardwareDisplayPlaneManager* AddMockHardwareDisplayPlaneManager() {
+ auto mock_hardware_display_plane_manager =
+ std::make_unique<MockHardwareDisplayPlaneManager>(
+ mock_drm_device_.get());
+ MockHardwareDisplayPlaneManager* pointer =
+ mock_hardware_display_plane_manager.get();
+ mock_drm_device_->plane_manager_ =
+ std::move(mock_hardware_display_plane_manager);
+ return pointer;
+ }
+
+ base::test::TaskEnvironment env_;
+ scoped_refptr<DrmDevice> mock_drm_device_;
+ ScreenManager screen_manager_;
+ DrmDisplay drm_display_;
+};
+
+TEST_F(DrmDisplayTest, SetColorSpace) {
+ drm_display_.set_is_hdr_capable_for_testing(true);
+ MockHardwareDisplayPlaneManager* plane_manager =
+ AddMockHardwareDisplayPlaneManager();
+
+ ON_CALL(*plane_manager, SetGammaCorrection(_, SizeIs(0), _))
+ .WillByDefault(::testing::Return(true));
+
+ const auto kHDRColorSpace = gfx::ColorSpace::CreateHDR10();
+ EXPECT_CALL(*plane_manager, SetGammaCorrection(_, SizeIs(0), SizeIs(0)));
+ drm_display_.SetColorSpace(kHDRColorSpace);
+
+ const auto kSDRColorSpace = gfx::ColorSpace::CreateREC709();
+ constexpr float kHDRLevel = 2.0;
+ EXPECT_CALL(
+ *plane_manager,
+ SetGammaCorrection(_, SizeIs(0), MatchesLinearRamp(1.0 / kHDRLevel)));
+ drm_display_.SetColorSpace(kSDRColorSpace);
+}
+
+TEST_F(DrmDisplayTest, SetEmptyGammaCorrectionNonHDRDisplay) {
+ MockHardwareDisplayPlaneManager* plane_manager =
+ AddMockHardwareDisplayPlaneManager();
+
+ ON_CALL(*plane_manager, SetGammaCorrection(_, _, _))
+ .WillByDefault(::testing::Return(true));
+
+ EXPECT_CALL(*plane_manager, SetGammaCorrection(_, SizeIs(0), SizeIs(0)));
+ drm_display_.SetGammaCorrection(std::vector<display::GammaRampRGBEntry>(),
+ std::vector<display::GammaRampRGBEntry>());
+}
+
+TEST_F(DrmDisplayTest, SetEmptyGammaCorrectionHDRDisplay) {
+ drm_display_.set_is_hdr_capable_for_testing(true);
+ MockHardwareDisplayPlaneManager* plane_manager =
+ AddMockHardwareDisplayPlaneManager();
+
+ ON_CALL(*plane_manager, SetGammaCorrection(_, _, _))
+ .WillByDefault(::testing::Return(true));
+
+ constexpr float kHDRLevel = 2.0;
+ EXPECT_CALL(
+ *plane_manager,
+ SetGammaCorrection(_, SizeIs(0), MatchesLinearRamp(1.0 / kHDRLevel)));
+ drm_display_.SetGammaCorrection(std::vector<display::GammaRampRGBEntry>(),
+ std::vector<display::GammaRampRGBEntry>());
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_framebuffer.cc b/chromium/ui/ozone/platform/drm/gpu/drm_framebuffer.cc
index 772786b42ed..bdf7db0ec19 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_framebuffer.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_framebuffer.cc
@@ -6,6 +6,7 @@
#include <utility>
+#include "base/logging.h"
#include "ui/gfx/buffer_format_util.h"
#include "ui/gfx/linux/drm_util_linux.h"
#include "ui/gfx/linux/gbm_buffer.h"
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 74a5f19d91c..e7642e41351 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
@@ -8,6 +8,7 @@
#include <memory>
#include <utility>
+#include "base/logging.h"
#include "ui/display/types/display_mode.h"
#include "ui/display/types/display_snapshot.h"
#include "ui/display/types/gamma_ramp_rgb_entry.h"
@@ -250,6 +251,17 @@ void DrmGpuDisplayManager::SetPrivacyScreen(int64_t display_id, bool enabled) {
display->SetPrivacyScreen(enabled);
}
+void DrmGpuDisplayManager::SetColorSpace(int64_t crtc_id,
+ const gfx::ColorSpace& color_space) {
+ for (const auto& display : displays_) {
+ if (display->crtc() == crtc_id) {
+ display->SetColorSpace(color_space);
+ return;
+ }
+ }
+ LOG(ERROR) << __func__ << " there is no display with CRTC ID " << crtc_id;
+}
+
DrmDisplay* DrmGpuDisplayManager::FindDisplay(int64_t display_id) {
for (const auto& display : displays_) {
if (display->display_id() == display_id)
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h b/chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h
index 5efd37fde04..6bc0d2472ea 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h
@@ -21,6 +21,10 @@ class DisplayMode;
struct GammaRampRGBEntry;
}
+namespace gfx {
+class ColorSpace;
+}
+
namespace ui {
class DrmDeviceManager;
@@ -61,6 +65,8 @@ class DrmGpuDisplayManager {
const std::vector<display::GammaRampRGBEntry>& gamma_lut);
void SetPrivacyScreen(int64_t display_id, bool enabled);
+ void SetColorSpace(int64_t crtc_id, const gfx::ColorSpace& color_space);
+
private:
DrmDisplay* FindDisplay(int64_t display_id);
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_gpu_util.cc b/chromium/ui/ozone/platform/drm/gpu/drm_gpu_util.cc
index bc1ab154808..4e70e45f0c1 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_gpu_util.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_gpu_util.cc
@@ -9,6 +9,7 @@
#include <xf86drmMode.h>
#include "base/files/scoped_file.h"
+#include "base/logging.h"
#include "base/trace_event/trace_event.h"
#include "ui/display/types/gamma_ramp_rgb_entry.h"
#include "ui/ozone/platform/drm/gpu/drm_device.h"
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_thread.cc b/chromium/ui/ozone/platform/drm/gpu/drm_thread.cc
index 181fcd86a18..13b3dd7a141 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_thread.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_thread.cc
@@ -5,6 +5,7 @@
#include "ui/ozone/platform/drm/gpu/drm_thread.h"
#include <gbm.h>
+
#include <memory>
#include <utility>
@@ -22,6 +23,7 @@
#include "ui/gfx/linux/gbm_util.h"
#include "ui/gfx/presentation_feedback.h"
#include "ui/ozone/platform/drm/common/drm_util.h"
+#include "ui/ozone/platform/drm/gpu/crtc_controller.h"
#include "ui/ozone/platform/drm/gpu/drm_device_generator.h"
#include "ui/ozone/platform/drm/gpu/drm_device_manager.h"
#include "ui/ozone/platform/drm/gpu/drm_dumb_buffer.h"
@@ -108,8 +110,8 @@ void DrmThread::Init() {
device_manager_ =
std::make_unique<DrmDeviceManager>(std::move(device_generator_));
screen_manager_ = std::make_unique<ScreenManager>();
- display_manager_.reset(
- new DrmGpuDisplayManager(screen_manager_.get(), device_manager_.get()));
+ display_manager_ = std::make_unique<DrmGpuDisplayManager>(
+ screen_manager_.get(), device_manager_.get());
DCHECK(task_runner())
<< "DrmThread::Init -- thread doesn't have a task_runner";
@@ -276,8 +278,8 @@ void DrmThread::SetCursor(gfx::AcceleratedWidget widget,
const gfx::Point& location,
int32_t frame_delay_ms) {
TRACE_EVENT0("drm", "DrmThread::SetCursor");
- screen_manager_->GetWindow(widget)
- ->SetCursor(bitmaps, location, frame_delay_ms);
+ screen_manager_->GetWindow(widget)->SetCursor(bitmaps, location,
+ frame_delay_ms);
}
void DrmThread::MoveCursor(gfx::AcceleratedWidget widget,
@@ -324,20 +326,21 @@ void DrmThread::RefreshNativeDisplays(
}
void DrmThread::ConfigureNativeDisplay(
- int64_t id,
- std::unique_ptr<display::DisplayMode> mode,
- const gfx::Point& origin,
+ const display::DisplayConfigurationParams& display_config_params,
base::OnceCallback<void(int64_t, bool)> callback) {
TRACE_EVENT0("drm", "DrmThread::ConfigureNativeDisplay");
- std::move(callback).Run(
- id, display_manager_->ConfigureDisplay(id, *mode, origin));
-}
-void DrmThread::DisableNativeDisplay(
- int64_t id,
- base::OnceCallback<void(int64_t, bool)> callback) {
- TRACE_EVENT0("drm", "DrmThread::DisableNativeDisplay");
- std::move(callback).Run(id, display_manager_->DisableDisplay(id));
+ if (display_config_params.mode) {
+ std::move(callback).Run(
+ display_config_params.id,
+ display_manager_->ConfigureDisplay(display_config_params.id,
+ *display_config_params.mode.value(),
+ display_config_params.origin));
+ } else {
+ std::move(callback).Run(
+ display_config_params.id,
+ display_manager_->DisableDisplay(display_config_params.id));
+ }
}
void DrmThread::TakeDisplayControl(base::OnceCallback<void(bool)> callback) {
@@ -418,4 +421,17 @@ void DrmThread::ProcessPendingTasks() {
pending_tasks_.clear();
}
+void DrmThread::SetColorSpace(gfx::AcceleratedWidget widget,
+ const gfx::ColorSpace& color_space) {
+ DCHECK(screen_manager_->GetWindow(widget));
+ HardwareDisplayController* controller =
+ screen_manager_->GetWindow(widget)->GetController();
+ if (!controller)
+ return;
+
+ const auto& crtc_controllers = controller->crtc_controllers();
+ for (const auto& crtc_controller : crtc_controllers)
+ display_manager_->SetColorSpace(crtc_controller->crtc(), color_space);
+}
+
} // namespace ui
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_thread.h b/chromium/ui/ozone/platform/drm/gpu/drm_thread.h
index b4ec4298339..71457f24c99 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_thread.h
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_thread.h
@@ -6,6 +6,7 @@
#define UI_OZONE_PLATFORM_DRM_GPU_DRM_THREAD_H_
#include <stdint.h>
+
#include <memory>
#include "base/files/file.h"
@@ -17,6 +18,7 @@
#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
+#include "ui/display/types/display_configuration_params.h"
#include "ui/gfx/native_pixmap_handle.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/vsync_provider.h"
@@ -32,14 +34,13 @@ class FilePath;
}
namespace display {
-class DisplayMode;
struct GammaRampRGBEntry;
-}
+} // namespace display
namespace gfx {
class Point;
class Rect;
-}
+} // namespace gfx
namespace ui {
@@ -107,6 +108,9 @@ class DrmThread : public base::Thread,
void AddDrmDeviceReceiver(
mojo::PendingReceiver<ozone::mojom::DrmDevice> receiver);
+ void SetColorSpace(gfx::AcceleratedWidget widget,
+ const gfx::ColorSpace& color_space);
+
// Verifies if the display controller can successfully scanout the given set
// of OverlaySurfaceCandidates and return the status associated with each
// candidate.
@@ -143,13 +147,8 @@ class DrmThread : public base::Thread,
base::OnceCallback<void(MovableDisplaySnapshots)> callback) override;
void AddGraphicsDevice(const base::FilePath& path, base::File file) override;
void RemoveGraphicsDevice(const base::FilePath& path) override;
- void DisableNativeDisplay(
- int64_t id,
- base::OnceCallback<void(int64_t, bool)> callback) override;
void ConfigureNativeDisplay(
- int64_t id,
- std::unique_ptr<display::DisplayMode> mode,
- const gfx::Point& origin,
+ const display::DisplayConfigurationParams& display_config_params,
base::OnceCallback<void(int64_t, bool)> callback) override;
void GetHDCPState(int64_t display_id,
base::OnceCallback<void(int64_t, bool, display::HDCPState)>
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_window_proxy.cc b/chromium/ui/ozone/platform/drm/gpu/drm_window_proxy.cc
index f94428bf86f..64751f39426 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_window_proxy.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_window_proxy.cc
@@ -52,4 +52,11 @@ bool DrmWindowProxy::SupportsGpuFences() const {
switches::kDisableExplicitDmaFences);
}
+void DrmWindowProxy::SetColorSpace(const gfx::ColorSpace& color_space) const {
+ drm_thread_->task_runner()->PostTask(
+ FROM_HERE,
+ base::BindOnce(&DrmThread::SetColorSpace, base::Unretained(drm_thread_),
+ widget_, color_space));
+}
+
} // namespace ui
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_window_proxy.h b/chromium/ui/ozone/platform/drm/gpu/drm_window_proxy.h
index 303051c1c25..8bb036e0ef9 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_window_proxy.h
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_window_proxy.h
@@ -12,6 +12,10 @@
#include "ui/gfx/vsync_provider.h"
#include "ui/ozone/public/swap_completion_callback.h"
+namespace gfx {
+class ColorSpace;
+}
+
namespace ui {
class DrmThread;
@@ -30,6 +34,8 @@ class DrmWindowProxy {
bool SupportsGpuFences() const;
+ void SetColorSpace(const gfx::ColorSpace& color_space) const;
+
private:
const gfx::AcceleratedWidget widget_;
diff --git a/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc b/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
index 8c32abbafef..29b76be970e 100644
--- a/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
@@ -79,6 +79,16 @@ bool GbmSurfaceless::ScheduleOverlayPlane(
return true;
}
+bool GbmSurfaceless::Resize(const gfx::Size& size,
+ float scale_factor,
+ const gfx::ColorSpace& color_space,
+ bool has_alpha) {
+ if (window_)
+ window_->SetColorSpace(color_space);
+
+ return SurfacelessEGL::Resize(size, scale_factor, color_space, has_alpha);
+}
+
bool GbmSurfaceless::IsOffscreen() {
return false;
}
@@ -111,7 +121,8 @@ void GbmSurfaceless::SwapBuffersAsync(
TRACE_EVENT0("drm", "GbmSurfaceless::SwapBuffersAsync");
// If last swap failed, don't try to schedule new ones.
if (!last_swap_buffers_result_) {
- std::move(completion_callback).Run(gfx::SwapResult::SWAP_FAILED, nullptr);
+ std::move(completion_callback)
+ .Run(gfx::SwapCompletionResult(gfx::SwapResult::SWAP_FAILED));
// Notify the caller, the buffer is never presented on a screen.
std::move(presentation_callback).Run(gfx::PresentationFeedback::Failure());
return;
@@ -230,6 +241,13 @@ void GbmSurfaceless::SubmitFrame() {
DCHECK(!unsubmitted_frames_.empty());
if (unsubmitted_frames_.front()->ready && !submitted_frame_) {
+ for (auto& overlay : unsubmitted_frames_.front()->overlays) {
+ if (overlay.z_order() == 0 && overlay.gpu_fence()) {
+ submitted_frame_gpu_fence_ = std::make_unique<gfx::GpuFence>(
+ gfx::CloneHandleForIPC(overlay.gpu_fence()->GetGpuFenceHandle()));
+ break;
+ }
+ }
submitted_frame_ = std::move(unsubmitted_frames_.front());
unsubmitted_frames_.erase(unsubmitted_frames_.begin());
@@ -270,12 +288,19 @@ void GbmSurfaceless::OnSubmission(gfx::SwapResult result,
}
void GbmSurfaceless::OnPresentation(const gfx::PresentationFeedback& feedback) {
- // Explicitly destroy overlays to free resources (e.g., fences) early.
+ gfx::PresentationFeedback feedback_copy = feedback;
+
+ if (submitted_frame_gpu_fence_) {
+ feedback_copy.ready_timestamp =
+ submitted_frame_gpu_fence_->GetMaxTimestamp();
+ }
+ submitted_frame_gpu_fence_.reset();
submitted_frame_->overlays.clear();
gfx::SwapResult result = submitted_frame_->swap_result;
- std::move(submitted_frame_->completion_callback).Run(result, nullptr);
- std::move(submitted_frame_->presentation_callback).Run(feedback);
+ std::move(submitted_frame_->completion_callback)
+ .Run(gfx::SwapCompletionResult(result));
+ std::move(submitted_frame_->presentation_callback).Run(feedback_copy);
submitted_frame_.reset();
if (result == gfx::SwapResult::SWAP_FAILED) {
diff --git a/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.h b/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.h
index 2bfbf347f2e..9b638ef08ff 100644
--- a/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.h
+++ b/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.h
@@ -17,6 +17,10 @@
#include "ui/gl/scoped_binders.h"
#include "ui/ozone/platform/drm/gpu/drm_overlay_plane.h"
+namespace gfx {
+class GpuFence;
+} // namespace gfx
+
namespace ui {
class DrmWindowProxy;
@@ -44,6 +48,10 @@ class GbmSurfaceless : public gl::SurfacelessEGL {
const gfx::RectF& crop_rect,
bool enable_blend,
std::unique_ptr<gfx::GpuFence> gpu_fence) override;
+ bool Resize(const gfx::Size& size,
+ float scale_factor,
+ const gfx::ColorSpace& color_space,
+ bool has_alpha) override;
bool IsOffscreen() override;
bool SupportsAsyncSwap() override;
bool SupportsPostSubBuffer() override;
@@ -104,6 +112,7 @@ class GbmSurfaceless : public gl::SurfacelessEGL {
std::unique_ptr<gfx::VSyncProvider> vsync_provider_;
std::vector<std::unique_ptr<PendingFrame>> unsubmitted_frames_;
std::unique_ptr<PendingFrame> submitted_frame_;
+ std::unique_ptr<gfx::GpuFence> submitted_frame_gpu_fence_;
const bool has_implicit_external_sync_;
const bool has_image_flush_external_;
bool last_swap_buffers_result_ = true;
diff --git a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane.cc b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane.cc
index 2d19a1a8b26..6505127b024 100644
--- a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane.cc
@@ -126,11 +126,12 @@ std::vector<uint64_t> HardwareDisplayPlane::ModifiersForFormat(
uint32_t format) const {
std::vector<uint64_t> modifiers;
- uint32_t format_index =
- std::find(supported_formats_.begin(), supported_formats_.end(), format) -
- supported_formats_.begin();
- DCHECK_LT(format_index, supported_formats_.size());
+ auto it =
+ std::find(supported_formats_.begin(), supported_formats_.end(), format);
+ if (it == supported_formats_.end())
+ return modifiers;
+ uint32_t format_index = it - supported_formats_.begin();
for (const auto& modifier : supported_format_modifiers_) {
// modifier.formats is a bitmask of the formats the modifier
// applies to, starting at format modifier.offset. That is, if bit
diff --git a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc
index 28d692268d7..1899daf4e7c 100644
--- a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc
@@ -4,6 +4,7 @@
#include "ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.h"
+#include "base/logging.h"
#include "ui/ozone/platform/drm/gpu/drm_device.h"
#include "ui/ozone/platform/drm/gpu/drm_gpu_util.h"
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 b1070a0d89e..b2443c90b07 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
@@ -84,7 +84,7 @@ class HardwareDisplayPlaneManager {
void SetBackgroundColor(uint32_t crtc_id, const uint64_t background_color);
// Sets the degamma/gamma luts on the CRTC object with ID |crtc_id|.
- bool SetGammaCorrection(
+ virtual bool SetGammaCorrection(
uint32_t crtc_id,
const std::vector<display::GammaRampRGBEntry>& degamma_lut,
const std::vector<display::GammaRampRGBEntry>& gamma_lut);
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 4ec9db772db..2bdf60aba9d 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
@@ -12,6 +12,7 @@
#include "base/bind.h"
#include "base/files/platform_file.h"
+#include "base/logging.h"
#include "base/stl_util.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "ui/gfx/gpu_fence.h"
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 4bbd89541aa..91926a0d2b2 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
@@ -10,6 +10,7 @@
#include <utility>
#include "base/bind.h"
+#include "base/logging.h"
#include "base/posix/eintr_wrapper.h"
#include "base/task/post_task.h"
#include "base/task/thread_pool.h"
diff --git a/chromium/ui/ozone/platform/drm/gpu/screen_manager.cc b/chromium/ui/ozone/platform/drm/gpu/screen_manager.cc
index 42473035751..342bad7004f 100644
--- a/chromium/ui/ozone/platform/drm/gpu/screen_manager.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/screen_manager.cc
@@ -9,6 +9,7 @@
#include <utility>
#include "base/files/platform_file.h"
+#include "base/logging.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "ui/display/types/display_snapshot.h"
diff --git a/chromium/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.cc b/chromium/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.cc
index 601cdb36873..e3792ee932d 100644
--- a/chromium/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.cc
@@ -7,6 +7,7 @@
#include <memory>
#include "base/files/file_path.h"
+#include "base/logging.h"
#include "base/native_library.h"
#include "gpu/vulkan/vulkan_function_pointers.h"
#include "gpu/vulkan/vulkan_image.h"
diff --git a/chromium/ui/ozone/platform/drm/host/drm_device_handle.cc b/chromium/ui/ozone/platform/drm/host/drm_device_handle.cc
index 7e2a58d4a32..c052a5d1bcb 100644
--- a/chromium/ui/ozone/platform/drm/host/drm_device_handle.cc
+++ b/chromium/ui/ozone/platform/drm/host/drm_device_handle.cc
@@ -10,6 +10,7 @@
#include <utility>
#include "base/files/file_path.h"
+#include "base/logging.h"
#include "base/posix/eintr_wrapper.h"
#include "base/threading/scoped_blocking_call.h"
#include "base/time/time.h"
diff --git a/chromium/ui/ozone/platform/drm/host/drm_display_host.cc b/chromium/ui/ozone/platform/drm/host/drm_display_host.cc
index 3c84a92181f..3da0ad8e912 100644
--- a/chromium/ui/ozone/platform/drm/host/drm_display_host.cc
+++ b/chromium/ui/ozone/platform/drm/host/drm_display_host.cc
@@ -9,7 +9,9 @@
#include "base/bind.h"
#include "base/location.h"
+#include "base/logging.h"
#include "base/threading/thread_task_runner_handle.h"
+#include "ui/display/types/display_configuration_params.h"
#include "ui/display/types/display_mode.h"
#include "ui/display/types/display_snapshot.h"
#include "ui/ozone/platform/drm/common/drm_util.h"
@@ -44,12 +46,10 @@ void DrmDisplayHost::Configure(const display::DisplayMode* mode,
configure_callback_ = std::move(callback);
bool status = false;
- if (mode) {
- status = sender_->GpuConfigureNativeDisplay(snapshot_->display_id(), *mode,
- origin);
- } else {
- status = sender_->GpuDisableNativeDisplay(snapshot_->display_id());
- }
+
+ display::DisplayConfigurationParams display_config_params(
+ snapshot_->display_id(), origin, mode);
+ status = sender_->GpuConfigureNativeDisplay(display_config_params);
if (!status)
OnDisplayConfigured(false);
diff --git a/chromium/ui/ozone/platform/drm/host/gpu_thread_adapter.h b/chromium/ui/ozone/platform/drm/host/gpu_thread_adapter.h
index d6c6804a586..8b9b8a39eea 100644
--- a/chromium/ui/ozone/platform/drm/host/gpu_thread_adapter.h
+++ b/chromium/ui/ozone/platform/drm/host/gpu_thread_adapter.h
@@ -6,15 +6,12 @@
#define UI_OZONE_PLATFORM_DRM_HOST_GPU_THREAD_ADAPTER_H_
#include "base/file_descriptor_posix.h"
+#include "ui/display/types/display_configuration_params.h"
#include "ui/display/types/display_constants.h"
#include "ui/display/types/gamma_ramp_rgb_entry.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/native_widget_types.h"
-namespace display {
-class DisplayMode;
-} // namespace display
-
namespace ui {
class DrmDisplayHostManager;
@@ -46,10 +43,8 @@ class GpuThreadAdapter {
virtual bool GpuRemoveGraphicsDevice(const base::FilePath& path) = 0;
// Services needed by DrmDisplayHost
- virtual bool GpuConfigureNativeDisplay(int64_t display_id,
- const display::DisplayMode& pmode,
- const gfx::Point& point) = 0;
- virtual bool GpuDisableNativeDisplay(int64_t display_id) = 0;
+ virtual bool GpuConfigureNativeDisplay(
+ const display::DisplayConfigurationParams& display_config_params) = 0;
virtual bool GpuGetHDCPState(int64_t display_id) = 0;
virtual bool GpuSetHDCPState(int64_t display_id,
display::HDCPState state) = 0;
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 a2ca1364f51..58bd76117d4 100644
--- a/chromium/ui/ozone/platform/drm/host/host_drm_device.cc
+++ b/chromium/ui/ozone/platform/drm/host/host_drm_device.cc
@@ -128,36 +128,21 @@ bool HostDrmDevice::GpuRefreshNativeDisplays() {
return true;
}
-bool HostDrmDevice::GpuConfigureNativeDisplay(int64_t id,
- const display::DisplayMode& pmode,
- const gfx::Point& origin) {
+bool HostDrmDevice::GpuConfigureNativeDisplay(
+ const display::DisplayConfigurationParams& display_config_params) {
DCHECK_CALLED_ON_VALID_THREAD(on_ui_thread_);
if (!IsConnected())
return false;
- auto mode = std::make_unique<display::DisplayMode>(
- pmode.size(), pmode.is_interlaced(), pmode.refresh_rate());
auto callback =
base::BindOnce(&HostDrmDevice::GpuConfigureNativeDisplayCallback, this);
- drm_device_->ConfigureNativeDisplay(id, std::move(mode), origin,
+ drm_device_->ConfigureNativeDisplay(display_config_params,
std::move(callback));
return true;
}
-bool HostDrmDevice::GpuDisableNativeDisplay(int64_t id) {
- DCHECK_CALLED_ON_VALID_THREAD(on_ui_thread_);
- if (!IsConnected())
- return false;
- auto callback =
- base::BindOnce(&HostDrmDevice::GpuDisableNativeDisplayCallback, this);
-
- drm_device_->DisableNativeDisplay(id, std::move(callback));
-
- return true;
-}
-
bool HostDrmDevice::GpuTakeDisplayControl() {
DCHECK_CALLED_ON_VALID_THREAD(on_ui_thread_);
if (!IsConnected())
@@ -278,12 +263,6 @@ void HostDrmDevice::GpuRefreshNativeDisplaysCallback(
display_manager_->GpuHasUpdatedNativeDisplays(std::move(displays));
}
-void HostDrmDevice::GpuDisableNativeDisplayCallback(int64_t display_id,
- bool success) const {
- DCHECK_CALLED_ON_VALID_THREAD(on_ui_thread_);
- display_manager_->GpuConfiguredDisplay(display_id, success);
-}
-
void HostDrmDevice::GpuTakeDisplayControlCallback(bool success) const {
DCHECK_CALLED_ON_VALID_THREAD(on_ui_thread_);
display_manager_->GpuTookDisplayControl(success);
diff --git a/chromium/ui/ozone/platform/drm/host/host_drm_device.h b/chromium/ui/ozone/platform/drm/host/host_drm_device.h
index fbe3723e419..a21505193c6 100644
--- a/chromium/ui/ozone/platform/drm/host/host_drm_device.h
+++ b/chromium/ui/ozone/platform/drm/host/host_drm_device.h
@@ -65,10 +65,8 @@ class HostDrmDevice : public base::RefCountedThreadSafe<HostDrmDevice>,
bool GpuRemoveGraphicsDevice(const base::FilePath& path) override;
// Services needed by DrmDisplayHost
- bool GpuConfigureNativeDisplay(int64_t display_id,
- const display::DisplayMode& pmode,
- const gfx::Point& point) override;
- bool GpuDisableNativeDisplay(int64_t display_id) override;
+ bool GpuConfigureNativeDisplay(const display::DisplayConfigurationParams&
+ display_config_params) override;
bool GpuGetHDCPState(int64_t display_id) override;
bool GpuSetHDCPState(int64_t display_id, display::HDCPState state) override;
bool GpuSetColorMatrix(int64_t display_id,
@@ -98,7 +96,6 @@ class HostDrmDevice : public base::RefCountedThreadSafe<HostDrmDevice>,
bool success) const;
void GpuRefreshNativeDisplaysCallback(MovableDisplaySnapshots displays) const;
- void GpuDisableNativeDisplayCallback(int64_t display_id, bool success) const;
void GpuTakeDisplayControlCallback(bool success) const;
void GpuRelinquishDisplayControlCallback(bool success) const;
void GpuGetHDCPStateCallback(int64_t display_id,
diff --git a/chromium/ui/ozone/platform/drm/ozone_platform_gbm.cc b/chromium/ui/ozone/platform/drm/ozone_platform_gbm.cc
index 23786834484..9e0cc71662e 100644
--- a/chromium/ui/ozone/platform/drm/ozone_platform_gbm.cc
+++ b/chromium/ui/ozone/platform/drm/ozone_platform_gbm.cc
@@ -21,6 +21,7 @@
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "ui/base/buildflags.h"
+#include "ui/base/cursor/cursor_factory.h"
#include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
#include "ui/events/ozone/device/device_manager.h"
#include "ui/events/ozone/evdev/event_factory_evdev.h"
@@ -43,7 +44,6 @@
#include "ui/ozone/platform/drm/host/drm_window_host.h"
#include "ui/ozone/platform/drm/host/drm_window_host_manager.h"
#include "ui/ozone/platform/drm/host/host_drm_device.h"
-#include "ui/ozone/public/cursor_factory_ozone.h"
#include "ui/ozone/public/gpu_platform_support_host.h"
#include "ui/ozone/public/mojom/drm_device.mojom.h"
#include "ui/ozone/public/ozone_platform.h"
@@ -80,9 +80,7 @@ class OzonePlatformGbm : public OzonePlatform {
OverlayManagerOzone* GetOverlayManager() override {
return overlay_manager_.get();
}
- CursorFactoryOzone* GetCursorFactoryOzone() override {
- return cursor_factory_ozone_.get();
- }
+ CursorFactory* GetCursorFactory() override { return cursor_factory_.get(); }
InputController* GetInputController() override {
return event_factory_ozone_->input_controller();
}
@@ -202,7 +200,7 @@ class OzonePlatformGbm : public OzonePlatform {
display_manager_ = std::make_unique<DrmDisplayHostManager>(
adapter, device_manager_.get(), &host_properties_,
event_factory_ozone_->input_controller());
- cursor_factory_ozone_ = std::make_unique<BitmapCursorFactoryOzone>();
+ cursor_factory_ = std::make_unique<BitmapCursorFactoryOzone>();
host_drm_device_->SetDisplayManager(display_manager_.get());
}
@@ -307,7 +305,7 @@ class OzonePlatformGbm : public OzonePlatform {
scoped_refptr<HostDrmDevice> host_drm_device_;
base::PlatformThreadRef host_thread_;
std::unique_ptr<DeviceManager> device_manager_;
- std::unique_ptr<BitmapCursorFactoryOzone> cursor_factory_ozone_;
+ std::unique_ptr<CursorFactory> cursor_factory_;
std::unique_ptr<DrmWindowHostManager> window_manager_;
std::unique_ptr<DrmCursor> cursor_;
std::unique_ptr<EventFactoryEvdev> event_factory_ozone_;
diff --git a/chromium/ui/ozone/platform/headless/BUILD.gn b/chromium/ui/ozone/platform/headless/BUILD.gn
index 9465b52ff12..ca02e70c2cd 100644
--- a/chromium/ui/ozone/platform/headless/BUILD.gn
+++ b/chromium/ui/ozone/platform/headless/BUILD.gn
@@ -26,6 +26,8 @@ source_set("headless") {
"//base",
"//skia",
"//ui/base",
+ "//ui/base/cursor",
+ "//ui/base/cursor:cursor_base",
"//ui/base/ime",
"//ui/events",
"//ui/events/ozone/layout",
diff --git a/chromium/ui/ozone/platform/headless/ozone_platform_headless.cc b/chromium/ui/ozone/platform/headless/ozone_platform_headless.cc
index 9d356f701e3..707948351e0 100644
--- a/chromium/ui/ozone/platform/headless/ozone_platform_headless.cc
+++ b/chromium/ui/ozone/platform/headless/ozone_platform_headless.cc
@@ -10,6 +10,7 @@
#include "base/files/file_path.h"
#include "base/macros.h"
#include "build/build_config.h"
+#include "ui/base/cursor/cursor_factory.h"
#include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
#include "ui/base/ime/input_method_minimal.h"
#include "ui/display/types/native_display_delegate.h"
@@ -21,7 +22,6 @@
#include "ui/ozone/platform/headless/headless_surface_factory.h"
#include "ui/ozone/platform/headless/headless_window.h"
#include "ui/ozone/platform/headless/headless_window_manager.h"
-#include "ui/ozone/public/cursor_factory_ozone.h"
#include "ui/ozone/public/gpu_platform_support_host.h"
#include "ui/ozone/public/input_controller.h"
#include "ui/ozone/public/ozone_platform.h"
@@ -63,9 +63,7 @@ class OzonePlatformHeadless : public OzonePlatform {
OverlayManagerOzone* GetOverlayManager() override {
return overlay_manager_.get();
}
- CursorFactoryOzone* GetCursorFactoryOzone() override {
- return cursor_factory_ozone_.get();
- }
+ CursorFactory* GetCursorFactory() override { return cursor_factory_.get(); }
InputController* GetInputController() override {
return input_controller_.get();
}
@@ -110,7 +108,7 @@ class OzonePlatformHeadless : public OzonePlatform {
overlay_manager_ = std::make_unique<StubOverlayManager>();
input_controller_ = CreateStubInputController();
- cursor_factory_ozone_ = std::make_unique<BitmapCursorFactoryOzone>();
+ cursor_factory_ = std::make_unique<BitmapCursorFactoryOzone>();
gpu_platform_support_host_.reset(CreateStubGpuPlatformSupportHost());
}
@@ -124,7 +122,7 @@ class OzonePlatformHeadless : public OzonePlatform {
std::unique_ptr<HeadlessWindowManager> window_manager_;
std::unique_ptr<HeadlessSurfaceFactory> surface_factory_;
std::unique_ptr<PlatformEventSource> platform_event_source_;
- std::unique_ptr<CursorFactoryOzone> cursor_factory_ozone_;
+ std::unique_ptr<CursorFactory> cursor_factory_;
std::unique_ptr<InputController> input_controller_;
std::unique_ptr<GpuPlatformSupportHost> gpu_platform_support_host_;
std::unique_ptr<OverlayManagerOzone> overlay_manager_;
diff --git a/chromium/ui/ozone/platform/scenic/BUILD.gn b/chromium/ui/ozone/platform/scenic/BUILD.gn
index ed6dd8a0f29..32792aaf31a 100644
--- a/chromium/ui/ozone/platform/scenic/BUILD.gn
+++ b/chromium/ui/ozone/platform/scenic/BUILD.gn
@@ -55,6 +55,8 @@ source_set("scenic") {
"//third_party/fuchsia-sdk/sdk/pkg/scenic_cpp",
"//third_party/fuchsia-sdk/sdk/pkg/sys_cpp",
"//ui/base",
+ "//ui/base/cursor",
+ "//ui/base/cursor:cursor_base",
"//ui/base/ime/fuchsia",
"//ui/display/fake",
"//ui/events:dom_keycode_converter",
diff --git a/chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc b/chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc
index c9f0f74031d..fcd5d1ccf32 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/message_loop/message_pump_type.h"
#include "base/notreached.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"
#include "ui/base/ime/fuchsia/input_method_fuchsia.h"
#include "ui/display/fake/fake_display_delegate.h"
@@ -30,7 +31,6 @@
#include "ui/ozone/platform/scenic/scenic_window_manager.h"
#include "ui/ozone/platform/scenic/sysmem_buffer_collection.h"
#include "ui/ozone/platform_selection.h"
-#include "ui/ozone/public/cursor_factory_ozone.h"
#include "ui/ozone/public/gpu_platform_support_host.h"
#include "ui/ozone/public/input_controller.h"
#include "ui/ozone/public/mojom/scenic_gpu_service.mojom.h"
@@ -77,9 +77,7 @@ class OzonePlatformScenic
return overlay_manager_.get();
}
- CursorFactoryOzone* GetCursorFactoryOzone() override {
- return cursor_factory_ozone_.get();
- }
+ CursorFactory* GetCursorFactory() override { return cursor_factory_.get(); }
InputController* GetInputController() override {
return input_controller_.get();
@@ -137,7 +135,7 @@ class OzonePlatformScenic
window_manager_ = std::make_unique<ScenicWindowManager>();
overlay_manager_ = std::make_unique<StubOverlayManager>();
input_controller_ = CreateStubInputController();
- cursor_factory_ozone_ = std::make_unique<BitmapCursorFactoryOzone>();
+ cursor_factory_ = std::make_unique<BitmapCursorFactoryOzone>();
scenic_gpu_host_ = std::make_unique<ScenicGpuHost>(window_manager_.get());
@@ -208,7 +206,7 @@ class OzonePlatformScenic
std::unique_ptr<KeyboardLayoutEngine> keyboard_layout_engine_;
std::unique_ptr<PlatformEventSource> platform_event_source_;
- std::unique_ptr<CursorFactoryOzone> cursor_factory_ozone_;
+ std::unique_ptr<CursorFactory> cursor_factory_;
std::unique_ptr<InputController> input_controller_;
std::unique_ptr<OverlayManagerOzone> overlay_manager_;
std::unique_ptr<ScenicGpuHost> scenic_gpu_host_;
diff --git a/chromium/ui/ozone/platform/scenic/scenic_surface.cc b/chromium/ui/ozone/platform/scenic/scenic_surface.cc
index 2d75a091190..dc7fd2ec10f 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_surface.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_surface.cc
@@ -19,11 +19,13 @@ ScenicSurface::ScenicSurface(
scenic::SessionPtrAndListenerRequest sesion_and_listener_request)
: scenic_session_(std::move(sesion_and_listener_request)),
shape_(&scenic_session_),
- 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(material_);
+ shape_.SetMaterial(transparent_material);
scenic_surface_factory->AddSurface(window, this);
scenic_session_.SetDebugName("Chromium ScenicSurface");
}
@@ -33,23 +35,28 @@ ScenicSurface::~ScenicSurface() {
scenic_surface_factory_->RemoveSurface(window_);
}
-void ScenicSurface::SetTextureToNewImagePipe(
+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)));
- material_.SetTexture(image_pipe_id);
+ scenic::Material image_material(&scenic_session_);
+ image_material.SetTexture(image_pipe_id);
+ shape_.SetMaterial(image_material);
scenic_session_.ReleaseResource(image_pipe_id);
scenic_session_.Present2(
/*requested_presentation_time=*/0,
/*requested_prediction_span=*/0,
[](fuchsia::scenic::scheduling::FuturePresentationTimes info) {});
+ return true;
}
void ScenicSurface::SetTextureToImage(const scenic::Image& image) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
- material_.SetTexture(image);
+ scenic::Material image_material(&scenic_session_);
+ image_material.SetTexture(image);
+ shape_.SetMaterial(image_material);
}
mojo::PlatformHandle ScenicSurface::CreateView() {
diff --git a/chromium/ui/ozone/platform/scenic/scenic_surface.h b/chromium/ui/ozone/platform/scenic/scenic_surface.h
index d9b730ae611..3264a594fc0 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_surface.h
+++ b/chromium/ui/ozone/platform/scenic/scenic_surface.h
@@ -35,8 +35,9 @@ class ScenicSurface : public ui::PlatformWindowSurface {
~ScenicSurface() override;
// Sets the texture of the surface to a new image pipe.
- void SetTextureToNewImagePipe(
- fidl::InterfaceRequest<fuchsia::images::ImagePipe2> image_pipe_request);
+ bool SetTextureToNewImagePipe(
+ fidl::InterfaceRequest<fuchsia::images::ImagePipe2> image_pipe_request)
+ override;
// Sets the texture of the surface to an image resource.
void SetTextureToImage(const scenic::Image& image);
@@ -58,7 +59,6 @@ class ScenicSurface : public ui::PlatformWindowSurface {
scenic::Session scenic_session_;
std::unique_ptr<scenic::View> parent_;
scenic::ShapeNode shape_;
- scenic::Material material_;
ScenicSurfaceFactory* const scenic_surface_factory_;
const gfx::AcceleratedWidget window_;
diff --git a/chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc b/chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc
index 7280c5e154f..7719bac9d88 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc
@@ -9,8 +9,8 @@
#include <memory>
#include "base/bind.h"
-#include "base/fuchsia/default_context.h"
#include "base/fuchsia/fuchsia_logging.h"
+#include "base/fuchsia/process_context.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "third_party/angle/src/common/fuchsia_egl/fuchsia_egl.h"
@@ -43,7 +43,7 @@ struct FuchsiaEGLWindowDeleter {
fuchsia::ui::scenic::ScenicPtr ConnectToScenic() {
fuchsia::ui::scenic::ScenicPtr scenic =
- base::fuchsia::ComponentContextForCurrentProcess()
+ base::ComponentContextForProcess()
->svc()
->Connect<fuchsia::ui::scenic::Scenic>();
scenic.set_error_handler([](zx_status_t status) {
@@ -130,8 +130,7 @@ class GLOzoneEGLScenic : public GLOzoneEGL {
fuchsia::sysmem::AllocatorHandle ConnectSysmemAllocator() {
fuchsia::sysmem::AllocatorHandle allocator;
- base::fuchsia::ComponentContextForCurrentProcess()->svc()->Connect(
- allocator.NewRequest());
+ base::ComponentContextForProcess()->svc()->Connect(allocator.NewRequest());
return allocator;
}
diff --git a/chromium/ui/ozone/platform/scenic/scenic_window.cc b/chromium/ui/ozone/platform/scenic/scenic_window.cc
index 0de00de69aa..81cafe89676 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_window.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_window.cc
@@ -37,8 +37,7 @@ ScenicWindow::ScenicWindow(ScenicWindowManager* window_manager,
"chromium window"),
node_(&scenic_session_),
input_node_(&scenic_session_),
- render_node_(&scenic_session_),
- background_node_(&scenic_session_) {
+ render_node_(&scenic_session_) {
scenic_session_.set_error_handler(
fit::bind_member(this, &ScenicWindow::OnScenicError));
scenic_session_.set_event_handler(
@@ -52,28 +51,8 @@ ScenicWindow::ScenicWindow(ScenicWindowManager* window_manager,
// Add input shape.
node_.AddChild(input_node_);
- // Add rendering subtree, rooted at Z=-2 to make room for background layers in
- // the Z-order (lesser values are higher in the visual ordering).
- constexpr float kRenderNodeZPosition = -2.;
- constexpr float kBackgroundNodeZPosition = kRenderNodeZPosition + 1.;
- render_node_.SetTranslation(0., 0., kRenderNodeZPosition);
node_.AddChild(render_node_);
- // Initialize a black background to be just behind |render_node_|.
- scenic::Material background_color(&scenic_session_);
- background_color.SetColor(0, 0, 0, 255); // RGBA (0,0,0,255) = opaque black.
- background_node_.SetMaterial(background_color);
- scenic::Rectangle background_shape(&scenic_session_, 1., 1.);
- background_node_.SetShape(background_shape);
- background_node_.SetTranslation(0., 0., kBackgroundNodeZPosition);
- node_.AddChild(background_node_);
-
- // Render the background immediately.
- scenic_session_.Present2(
- /*requested_presentation_time=*/0,
- /*requested_prediction_span=*/0,
- [](fuchsia::scenic::scheduling::FuturePresentationTimes info) {});
-
delegate_->OnAcceleratedWidgetAvailable(window_id_);
}
@@ -247,9 +226,6 @@ void ScenicWindow::UpdateSize() {
size_dips_.height());
input_node_.SetShape(window_rect);
- // Resize the input and background nodes to cover the whole surface.
- background_node_.SetShape(window_rect);
-
// This is necessary when using vulkan because ImagePipes are presented
// separately and we need to make sure our sizes change is committed.
scenic_session_.Present2(
diff --git a/chromium/ui/ozone/platform/scenic/scenic_window.h b/chromium/ui/ozone/platform/scenic/scenic_window.h
index d70d88b218f..2edac2d4e7e 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_window.h
+++ b/chromium/ui/ozone/platform/scenic/scenic_window.h
@@ -119,10 +119,6 @@ class COMPONENT_EXPORT(OZONE) ScenicWindow
// Node in |scenic_session_| for rendering (hit testing disabled).
scenic::EntityNode render_node_;
- // Node in |scenic_session_| for rendering a solid color, placed just behind
- // |render_node_| in the Z order.
- scenic::ShapeNode background_node_;
-
std::unique_ptr<scenic::ViewHolder> surface_view_holder_;
// The ratio used for translating device-independent coordinates to absolute
diff --git a/chromium/ui/ozone/platform/scenic/scenic_window_manager.cc b/chromium/ui/ozone/platform/scenic/scenic_window_manager.cc
index b8a8c539251..6a0a177b10d 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_window_manager.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_window_manager.cc
@@ -7,8 +7,8 @@
#include <lib/sys/cpp/component_context.h>
#include <memory>
-#include "base/fuchsia/default_context.h"
#include "base/fuchsia/fuchsia_logging.h"
+#include "base/fuchsia/process_context.h"
#include "ui/ozone/platform/scenic/ozone_platform_scenic.h"
namespace ui {
@@ -33,7 +33,7 @@ std::unique_ptr<PlatformScreen> ScenicWindowManager::CreateScreen() {
fuchsia::ui::scenic::Scenic* ScenicWindowManager::GetScenic() {
if (!scenic_) {
- scenic_ = base::fuchsia::ComponentContextForCurrentProcess()
+ scenic_ = base::ComponentContextForProcess()
->svc()
->Connect<fuchsia::ui::scenic::Scenic>();
scenic_.set_error_handler(
diff --git a/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc b/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc
index a1a51db49d0..d320987b58e 100644
--- a/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc
+++ b/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc
@@ -116,7 +116,8 @@ bool SysmemBufferCollection::IsNativePixmapConfigSupported(
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_CPU_READ_WRITE ||
+ usage == gfx::BufferUsage::GPU_READ;
return format_supported && usage_supported;
}
@@ -142,7 +143,7 @@ bool SysmemBufferCollection::Initialize(
if (vk_device == VK_NULL_HANDLE)
return false;
- size_ = size;
+ min_size_ = size;
format_ = format;
usage_ = usage;
vk_device_ = vk_device;
@@ -163,15 +164,24 @@ bool SysmemBufferCollection::Initialize(
bool SysmemBufferCollection::Initialize(
fuchsia::sysmem::Allocator_Sync* allocator,
VkDevice vk_device,
- zx::channel token_handle) {
+ zx::channel token_handle,
+ gfx::BufferFormat format,
+ gfx::BufferUsage usage,
+ bool force_protected) {
DCHECK(!collection_);
DCHECK(!vk_buffer_collection_);
- usage_ = gfx::BufferUsage::GPU_READ;
- vk_device_ = vk_device;
+ // Set nominal size of 1x1, which will be used only for
+ // vkSetBufferCollectionConstraintsFUCHSIA(). The actual size of the allocated
+ // buffers is determined by constraints set by other sysmem clients for the
+ // same collection. Size of the Vulkan image is determined by the valus passed
+ // to CreateVkImage().
+ min_size_ = gfx::Size(1, 1);
- // Assume that all imported collections are in NV12 format.
- format_ = gfx::BufferFormat::YUV_420_BIPLANAR;
+ vk_device_ = vk_device;
+ format_ = format;
+ usage_ = usage;
+ is_protected_ = force_protected;
fuchsia::sysmem::BufferCollectionTokenSyncPtr token;
token.Bind(std::move(token_handle));
@@ -206,18 +216,12 @@ scoped_refptr<gfx::NativePixmap> SysmemBufferCollection::CreateNativePixmap(
buffers_info_.settings.image_format_constraints;
// The logic should match LogicalBufferCollection::Allocate().
- size_t width =
- RoundUp(std::max(format.min_coded_width, format.required_max_coded_width),
- format.coded_width_divisor);
- size_t stride =
- RoundUp(std::max(static_cast<size_t>(format.min_bytes_per_row),
- gfx::RowSizeForBufferFormat(width, format_, 0)),
- format.bytes_per_row_divisor);
- size_t height = RoundUp(
- std::max(format.min_coded_height, format.required_max_coded_height),
- format.coded_height_divisor);
+ size_t stride = RoundUp(
+ std::max(static_cast<size_t>(format.min_bytes_per_row),
+ gfx::RowSizeForBufferFormat(image_size_.width(), format_, 0)),
+ format.bytes_per_row_divisor);
size_t plane_offset = buffers_info_.buffers[buffer_index].vmo_usable_start;
- size_t plane_size = stride * height;
+ size_t plane_size = stride * image_size_.height();
handle.planes.emplace_back(stride, plane_offset, plane_size,
std::move(main_plane_vmo));
@@ -421,7 +425,7 @@ bool SysmemBufferCollection::InitializeInternal(
ignore_result(token_channel.release());
VkImageCreateInfo image_create_info;
- InitializeImageCreateInfo(&image_create_info, size_);
+ InitializeImageCreateInfo(&image_create_info, min_size_);
if (vkSetBufferCollectionConstraintsFUCHSIA(vk_device_, vk_buffer_collection_,
&image_create_info) !=
@@ -446,6 +450,16 @@ bool SysmemBufferCollection::InitializeInternal(
DCHECK_GE(buffers_info_.buffer_count, buffers_for_camping);
DCHECK(buffers_info_.settings.has_image_format_constraints);
+ // The logic should match LogicalBufferCollection::Allocate().
+ const fuchsia::sysmem::ImageFormatConstraints& format =
+ buffers_info_.settings.image_format_constraints;
+ size_t width =
+ RoundUp(std::max(format.min_coded_width, format.required_max_coded_width),
+ format.coded_width_divisor);
+ size_t height = RoundUp(
+ std::max(format.min_coded_height, format.required_max_coded_height),
+ format.coded_height_divisor);
+ image_size_ = gfx::Size(width, height);
buffer_size_ = buffers_info_.settings.buffer_settings.size_bytes;
is_protected_ = buffers_info_.settings.buffer_settings.is_secure;
@@ -469,7 +483,13 @@ void SysmemBufferCollection::InitializeImageCreateInfo(
vk_image_info->samples = VK_SAMPLE_COUNT_1_BIT;
vk_image_info->tiling =
is_mappable() ? VK_IMAGE_TILING_LINEAR : VK_IMAGE_TILING_OPTIMAL;
+
vk_image_info->usage = VK_IMAGE_USAGE_SAMPLED_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->sharingMode = VK_SHARING_MODE_EXCLUSIVE;
vk_image_info->initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
}
diff --git a/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h b/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h
index 1bfed23b840..34628685327 100644
--- a/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h
+++ b/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h
@@ -48,7 +48,10 @@ class SysmemBufferCollection
bool Initialize(fuchsia::sysmem::Allocator_Sync* allocator,
VkDevice vk_device,
- zx::channel token);
+ zx::channel token,
+ gfx::BufferFormat format,
+ gfx::BufferUsage usage,
+ bool force_protected);
// Must not be called more than once.
void SetOnDeletedCallback(base::OnceClosure on_deleted);
@@ -70,7 +73,7 @@ class SysmemBufferCollection
gfx::SysmemBufferCollectionId id() const { return id_; }
size_t num_buffers() const { return buffers_info_.buffer_count; }
- gfx::Size size() const { return size_; }
+ gfx::Size size() const { return image_size_; }
gfx::BufferFormat format() const { return format_; }
size_t buffer_size() const {
return buffers_info_.settings.buffer_settings.size_bytes;
@@ -96,10 +99,11 @@ class SysmemBufferCollection
const gfx::SysmemBufferCollectionId id_;
- gfx::Size size_;
+ // Image size passed to vkSetBufferCollectionConstraintsFUCHSIA(). The actual
+ // buffers size may be larger depending on constraints set by other
+ // sysmem clients. Size of the image is passed to CreateVkImage().
+ gfx::Size min_size_;
- // Valid only for owned buffer collections, i.e. those that that were
- // initialized using the first Initialize() methods.
gfx::BufferFormat format_ = gfx::BufferFormat::RGBA_8888;
gfx::BufferUsage usage_ = gfx::BufferUsage::GPU_READ_CPU_READ_WRITE;
@@ -118,6 +122,7 @@ class SysmemBufferCollection
// threads.
THREAD_CHECKER(vulkan_thread_checker_);
+ gfx::Size image_size_;
size_t buffer_size_ = 0;
bool is_protected_ = false;
diff --git a/chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.cc b/chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.cc
index 2d0a2d5869a..b1bdfb23b55 100644
--- a/chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.cc
+++ b/chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.cc
@@ -51,9 +51,13 @@ scoped_refptr<SysmemBufferCollection>
SysmemBufferManager::ImportSysmemBufferCollection(
VkDevice vk_device,
gfx::SysmemBufferCollectionId id,
- zx::channel token) {
+ zx::channel token,
+ gfx::BufferFormat format,
+ gfx::BufferUsage usage,
+ bool force_protected) {
auto result = base::MakeRefCounted<SysmemBufferCollection>(id);
- if (!result->Initialize(allocator_.get(), vk_device, std::move(token))) {
+ if (!result->Initialize(allocator_.get(), vk_device, std::move(token), format,
+ usage, force_protected)) {
return nullptr;
}
RegisterCollection(result.get());
diff --git a/chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.h b/chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.h
index b726855beb2..9bc6fe9bd35 100644
--- a/chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.h
+++ b/chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.h
@@ -46,7 +46,10 @@ class SysmemBufferManager {
scoped_refptr<SysmemBufferCollection> ImportSysmemBufferCollection(
VkDevice vk_device,
gfx::SysmemBufferCollectionId id,
- zx::channel token);
+ zx::channel token,
+ gfx::BufferFormat format,
+ gfx::BufferUsage usage,
+ bool force_protected);
scoped_refptr<SysmemBufferCollection> GetCollectionById(
gfx::SysmemBufferCollectionId id);
diff --git a/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc b/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
index ce74e4b9cf8..9152a959c73 100644
--- a/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
+++ b/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
@@ -269,7 +269,7 @@ VulkanImplementationScenic::CreateImageFromGpuMemoryHandle(
auto image = gpu::VulkanImage::Create(
device_queue, vk_image, vk_device_memory, size, vk_image_info.format,
vk_image_info.tiling, vk_device_size, 0 /* memory_type_index */,
- ycbcr_info);
+ ycbcr_info, vk_image_info.flags);
if (image->format() != vk_format) {
DLOG(ERROR) << "Unexpected format " << vk_format << " vs "
@@ -298,10 +298,16 @@ std::unique_ptr<gpu::SysmemBufferCollection>
VulkanImplementationScenic::RegisterSysmemBufferCollection(
VkDevice device,
gfx::SysmemBufferCollectionId id,
- zx::channel token) {
+ zx::channel token,
+ gfx::BufferFormat format,
+ gfx::BufferUsage usage) {
+ // SCANOUT images must be protected in protected mode.
+ bool force_protected =
+ usage == gfx::BufferUsage::SCANOUT && enforce_protected_memory();
+
return std::make_unique<SysmemBufferCollectionImpl>(
- sysmem_buffer_manager_->ImportSysmemBufferCollection(device, id,
- std::move(token)));
+ sysmem_buffer_manager_->ImportSysmemBufferCollection(
+ device, id, std::move(token), format, usage, force_protected));
}
} // namespace ui
diff --git a/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.h b/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.h
index 6b1a1afa1f1..cbc7e0d111b 100644
--- a/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.h
+++ b/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.h
@@ -56,7 +56,9 @@ class VulkanImplementationScenic : public gpu::VulkanImplementation {
std::unique_ptr<gpu::SysmemBufferCollection> RegisterSysmemBufferCollection(
VkDevice device,
gfx::SysmemBufferCollectionId id,
- zx::channel token) override;
+ zx::channel token,
+ gfx::BufferFormat format,
+ gfx::BufferUsage usage) override;
private:
ScenicSurfaceFactory* const scenic_surface_factory_;
diff --git a/chromium/ui/ozone/platform/wayland/BUILD.gn b/chromium/ui/ozone/platform/wayland/BUILD.gn
index b0ec8a82a5e..e0d30f2575c 100644
--- a/chromium/ui/ozone/platform/wayland/BUILD.gn
+++ b/chromium/ui/ozone/platform/wayland/BUILD.gn
@@ -18,6 +18,8 @@ source_set("wayland") {
sources = [
"client_native_pixmap_factory_wayland.cc",
"client_native_pixmap_factory_wayland.h",
+ "common/data_util.cc",
+ "common/data_util.h",
"common/wayland_object.cc",
"common/wayland_object.h",
"common/wayland_util.cc",
@@ -41,8 +43,6 @@ source_set("wayland") {
"host/gtk_primary_selection_device_manager.h",
"host/gtk_primary_selection_offer.cc",
"host/gtk_primary_selection_offer.h",
- "host/gtk_primary_selection_source.cc",
- "host/gtk_primary_selection_source.h",
"host/shell_object_factory.cc",
"host/shell_object_factory.h",
"host/shell_popup_wrapper.cc",
@@ -67,14 +67,14 @@ source_set("wayland") {
"host/wayland_data_device_base.h",
"host/wayland_data_device_manager.cc",
"host/wayland_data_device_manager.h",
+ "host/wayland_data_drag_controller.cc",
+ "host/wayland_data_drag_controller.h",
"host/wayland_data_offer.cc",
"host/wayland_data_offer.h",
"host/wayland_data_offer_base.cc",
"host/wayland_data_offer_base.h",
"host/wayland_data_source.cc",
"host/wayland_data_source.h",
- "host/wayland_data_source_base.cc",
- "host/wayland_data_source_base.h",
"host/wayland_drm.cc",
"host/wayland_drm.h",
"host/wayland_event_source.cc",
@@ -105,10 +105,14 @@ source_set("wayland") {
"host/wayland_subsurface.h",
"host/wayland_surface.cc",
"host/wayland_surface.h",
+ "host/wayland_toplevel_window.cc",
+ "host/wayland_toplevel_window.h",
"host/wayland_touch.cc",
"host/wayland_touch.h",
"host/wayland_window.cc",
"host/wayland_window.h",
+ "host/wayland_window_drag_controller.cc",
+ "host/wayland_window_drag_controller.h",
"host/wayland_window_factory.cc",
"host/wayland_window_manager.cc",
"host/wayland_window_manager.h",
@@ -140,6 +144,7 @@ source_set("wayland") {
"//skia",
"//third_party/wayland:wayland_client",
"//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:presentation_time_protocol",
"//third_party/wayland-protocols:text_input_protocol",
@@ -147,6 +152,8 @@ source_set("wayland") {
"//third_party/wayland-protocols:xdg_shell_protocol",
"//ui/base",
"//ui/base:buildflags",
+ "//ui/base/cursor",
+ "//ui/base/cursor:cursor_base",
"//ui/base/ime/linux",
"//ui/events",
"//ui/events:dom_keycode_converter",
@@ -242,6 +249,8 @@ source_set("test_support") {
"test/mock_zwp_linux_dmabuf.h",
"test/mock_zwp_text_input.cc",
"test/mock_zwp_text_input.h",
+ "test/scoped_wl_array.cc",
+ "test/scoped_wl_array.h",
"test/server_object.cc",
"test/server_object.h",
"test/test_compositor.cc",
@@ -306,12 +315,14 @@ source_set("wayland_unittests") {
"gpu/wayland_surface_factory_unittest.cc",
"host/wayland_connection_unittest.cc",
"host/wayland_data_device_unittest.cc",
+ "host/wayland_data_drag_controller_unittest.cc",
"host/wayland_event_source_unittest.cc",
"host/wayland_input_method_context_unittest.cc",
"host/wayland_keyboard_unittest.cc",
"host/wayland_pointer_unittest.cc",
"host/wayland_screen_unittest.cc",
"host/wayland_touch_unittest.cc",
+ "host/wayland_window_drag_controller_unittest.cc",
"host/wayland_window_manager_unittests.cc",
"host/wayland_window_unittest.cc",
"test/wayland_test.cc",
@@ -326,11 +337,13 @@ source_set("wayland_unittests") {
"//testing/gmock",
"//testing/gtest",
"//third_party/wayland:wayland_server",
+ "//third_party/wayland-protocols:keyboard_extension_protocol",
"//third_party/wayland-protocols:linux_dmabuf_protocol",
"//third_party/wayland-protocols:text_input_protocol",
"//third_party/wayland-protocols:xdg_shell_protocol",
"//ui/base",
"//ui/base:buildflags",
+ "//ui/base/cursor",
"//ui/base/ime/linux",
"//ui/events/ozone/layout",
"//ui/gfx/linux:drm",
diff --git a/chromium/ui/ozone/platform/wayland/DEPS b/chromium/ui/ozone/platform/wayland/DEPS
index d61519af80c..44ef7beabfd 100644
--- a/chromium/ui/ozone/platform/wayland/DEPS
+++ b/chromium/ui/ozone/platform/wayland/DEPS
@@ -8,5 +8,5 @@ include_rules = [
"+ui/base/dragdrop/drag_drop_types.h",
"+ui/base/dragdrop/file_info/file_info.h",
"+ui/base/dragdrop/os_exchange_data.h",
- "+ui/base/dragdrop/os_exchange_data_provider_aura.h",
+ "+ui/base/dragdrop/os_exchange_data_provider_non_backed.h",
]
diff --git a/chromium/ui/ozone/platform/wayland/OWNERS b/chromium/ui/ozone/platform/wayland/OWNERS
index ac018fd66db..1aa8e7e3f6f 100644
--- a/chromium/ui/ozone/platform/wayland/OWNERS
+++ b/chromium/ui/ozone/platform/wayland/OWNERS
@@ -1,2 +1,3 @@
msisov@igalia.com
+nickdiego@igalia.com
tonikitoo@igalia.com
diff --git a/chromium/ui/ozone/platform/wayland/common/data_util.cc b/chromium/ui/ozone/platform/wayland/common/data_util.cc
new file mode 100644
index 00000000000..55e594a07e3
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/common/data_util.cc
@@ -0,0 +1,218 @@
+// 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/common/data_util.h"
+
+#include <vector>
+
+#include "base/check.h"
+#include "base/logging.h"
+#include "base/strings/string16.h"
+#include "base/strings/string_split.h"
+#include "base/strings/utf_string_conversions.h"
+#include "ui/base/clipboard/clipboard_constants.h"
+#include "ui/base/dragdrop/file_info/file_info.h"
+#include "ui/base/dragdrop/os_exchange_data.h"
+#include "ui/base/dragdrop/os_exchange_data_provider_non_backed.h"
+#include "ui/ozone/public/platform_clipboard.h"
+#include "url/gurl.h"
+#include "url/url_canon.h"
+#include "url/url_util.h"
+
+namespace wl {
+
+namespace {
+
+using ui::OSExchangeData;
+using ui::PlatformClipboard;
+
+constexpr ui::FilenameToURLPolicy kFilenameToURLPolicy =
+ ui::FilenameToURLPolicy::CONVERT_FILENAMES;
+
+// Converts mime type string to OSExchangeData::Format, if supported, otherwise
+// 0 is returned.
+int MimeTypeToFormat(const std::string& mime_type) {
+ if (mime_type == ui::kMimeTypeText || mime_type == ui::kMimeTypeTextUtf8)
+ return OSExchangeData::STRING;
+ if (mime_type == ui::kMimeTypeURIList)
+ return OSExchangeData::FILE_NAME;
+ if (mime_type == ui::kMimeTypeMozillaURL)
+ return OSExchangeData::URL;
+ if (mime_type == ui::kMimeTypeHTML)
+ return OSExchangeData::HTML;
+ return 0;
+}
+
+// Converts raw data to either narrow or wide string.
+template <typename StringType>
+StringType BytesTo(const PlatformClipboard::Data& bytes) {
+ if (bytes.size() % sizeof(typename StringType::value_type) != 0U) {
+ // This is suspicious.
+ LOG(WARNING)
+ << "Data is possibly truncated, or a wrong conversion is requested.";
+ }
+
+ StringType result;
+ result.assign(reinterpret_cast<typename StringType::const_pointer>(&bytes[0]),
+ bytes.size() / sizeof(typename StringType::value_type));
+ return result;
+}
+
+void AddString(const PlatformClipboard::Data& data,
+ OSExchangeData* os_exchange_data) {
+ DCHECK(os_exchange_data);
+
+ if (data.empty())
+ return;
+
+ os_exchange_data->SetString(base::UTF8ToUTF16(BytesTo<std::string>(data)));
+}
+
+void AddHtml(const PlatformClipboard::Data& data,
+ OSExchangeData* os_exchange_data) {
+ DCHECK(os_exchange_data);
+
+ if (data.empty())
+ return;
+
+ os_exchange_data->SetHtml(base::UTF8ToUTF16(BytesTo<std::string>(data)),
+ GURL());
+}
+
+// Parses |data| as if it had text/uri-list format. Its brief spec is:
+// 1. Any lines beginning with the '#' character are comment lines.
+// 2. Non-comment lines shall be URIs (URNs or URLs).
+// 3. Lines are terminated with a CRLF pair.
+// 4. URL encoding is used.
+void AddFiles(const PlatformClipboard::Data& data,
+ OSExchangeData* os_exchange_data) {
+ DCHECK(os_exchange_data);
+
+ std::string data_as_string = BytesTo<std::string>(data);
+
+ const auto lines = base::SplitString(
+ data_as_string, "\r\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+ std::vector<ui::FileInfo> filenames;
+ for (const auto& line : lines) {
+ if (line.empty() || line[0] == '#')
+ continue;
+ GURL url(line);
+ if (!url.is_valid() || !url.SchemeIsFile()) {
+ LOG(WARNING) << "Invalid URI found: " << line;
+ continue;
+ }
+
+ std::string url_path = url.path();
+ url::RawCanonOutputT<base::char16> unescaped;
+ url::DecodeURLEscapeSequences(url_path.data(), url_path.size(),
+ url::DecodeURLMode::kUTF8OrIsomorphic,
+ &unescaped);
+
+ std::string path8;
+ base::UTF16ToUTF8(unescaped.data(), unescaped.length(), &path8);
+ const base::FilePath path(path8);
+ filenames.push_back({path, path.BaseName()});
+ }
+ if (filenames.empty())
+ return;
+
+ os_exchange_data->SetFilenames(filenames);
+}
+
+// Parses |data| as if it had text/x-moz-url format, which is basically
+// two lines separated with newline, where the first line is the URL and
+// the second one is page title. The unpleasant feature of text/x-moz-url is
+// that the URL has UTF-16 encoding.
+void AddUrl(const PlatformClipboard::Data& data,
+ OSExchangeData* os_exchange_data) {
+ DCHECK(os_exchange_data);
+
+ if (data.empty())
+ return;
+
+ base::string16 data_as_string16 = BytesTo<base::string16>(data);
+
+ const auto lines =
+ base::SplitString(data_as_string16, base::ASCIIToUTF16("\r\n"),
+ base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+ if (lines.size() != 2U) {
+ LOG(WARNING) << "Invalid data passed as text/x-moz-url; it must contain "
+ << "exactly 2 lines but has " << lines.size() << " instead.";
+ return;
+ }
+ GURL url(lines[0]);
+ if (!url.is_valid()) {
+ LOG(WARNING) << "Invalid data passed as text/x-moz-url; the first line "
+ << "must contain a valid URL but it doesn't.";
+ return;
+ }
+
+ os_exchange_data->SetURL(url, lines[1]);
+}
+
+} // namespace
+
+bool IsMimeTypeSupported(const std::string& mime_type) {
+ return MimeTypeToFormat(mime_type) != 0;
+}
+
+bool ContainsMimeType(const OSExchangeData& exchange_data,
+ const std::string& mime_type) {
+ DCHECK(IsMimeTypeSupported(mime_type));
+ return exchange_data.HasAnyFormat(MimeTypeToFormat(mime_type), {});
+}
+
+void AddToOSExchangeData(const PlatformClipboard::Data& data,
+ const std::string& mime_type,
+ OSExchangeData* exchange_data) {
+ DCHECK(IsMimeTypeSupported(mime_type));
+ DCHECK(exchange_data);
+ int format = MimeTypeToFormat(mime_type);
+ switch (format) {
+ case OSExchangeData::STRING:
+ AddString(data, exchange_data);
+ break;
+ case OSExchangeData::HTML:
+ AddHtml(data, exchange_data);
+ break;
+ case OSExchangeData::URL:
+ AddUrl(data, exchange_data);
+ break;
+ case OSExchangeData::FILE_NAME:
+ AddFiles(data, exchange_data);
+ break;
+ }
+}
+
+bool ExtractOSExchangeData(const OSExchangeData& exchange_data,
+ const std::string& mime_type,
+ std::string* out_content) {
+ DCHECK(out_content);
+ DCHECK(IsMimeTypeSupported(mime_type));
+
+ if (mime_type == ui::kMimeTypeMozillaURL &&
+ exchange_data.HasURL(kFilenameToURLPolicy)) {
+ GURL url;
+ base::string16 title;
+ exchange_data.GetURLAndTitle(kFilenameToURLPolicy, &url, &title);
+ out_content->append(url.spec());
+ return true;
+ }
+ if (mime_type == ui::kMimeTypeHTML && exchange_data.HasHtml()) {
+ base::string16 data;
+ GURL base_url;
+ exchange_data.GetHtml(&data, &base_url);
+ out_content->append(base::UTF16ToUTF8(data));
+ return true;
+ }
+ if (exchange_data.HasString()) {
+ base::string16 data;
+ exchange_data.GetString(&data);
+ out_content->append(base::UTF16ToUTF8(data));
+ return true;
+ }
+ return false;
+}
+
+} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/common/data_util.h b/chromium/ui/ozone/platform/wayland/common/data_util.h
new file mode 100644
index 00000000000..d6c2d10e7f5
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/common/data_util.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_OZONE_PLATFORM_WAYLAND_COMMON_DATA_UTIL_H_
+#define UI_OZONE_PLATFORM_WAYLAND_COMMON_DATA_UTIL_H_
+
+#include <string>
+
+#include "ui/ozone/public/platform_clipboard.h"
+
+namespace ui {
+class OSExchangeData;
+} // namespace ui
+
+namespace wl {
+
+// Tells if |mime_type| is supported for Drag and Drop operations.
+bool IsMimeTypeSupported(const std::string& mime_type);
+
+// Tells if |exchange_data| contains |mime_type| content.
+bool ContainsMimeType(const ui::OSExchangeData& exchange_data,
+ const std::string& mime_type);
+
+// Add clipboard |data| content with |mime_type| format to the |exchange_data|.
+// |mime_type| is assumed to be supported (See IsMimeTypeSupported for more).
+void AddToOSExchangeData(const ui::PlatformClipboard::Data& data,
+ const std::string& mime_type,
+ ui::OSExchangeData* exchange_data);
+
+// Extract |exchange_data| of type |mime_type| and put it into |buffer|. If such
+// mime type is not present, false is returned and |buffer| keeps untouched.
+// |mime_type| is assumed to be supported (See IsMimeTypeSupported for more).
+bool ExtractOSExchangeData(const ui::OSExchangeData& exchange_data,
+ const std::string& mime_type,
+ std::string* buffer);
+
+} // namespace wl
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_COMMON_DATA_UTIL_H_
diff --git a/chromium/ui/ozone/platform/wayland/common/wayland_object.cc b/chromium/ui/ozone/platform/wayland/common/wayland_object.cc
index d0db0924463..9f9efeae72e 100644
--- a/chromium/ui/ozone/platform/wayland/common/wayland_object.cc
+++ b/chromium/ui/ozone/platform/wayland/common/wayland_object.cc
@@ -5,6 +5,7 @@
#include "ui/ozone/platform/wayland/common/wayland_object.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 <presentation-time-client-protocol.h>
#include <text-input-unstable-v1-client-protocol.h>
@@ -189,6 +190,16 @@ const wl_interface* ObjectTraits<xdg_positioner>::interface =
void (*ObjectTraits<xdg_positioner>::deleter)(xdg_positioner*) =
&xdg_positioner_destroy;
+const wl_interface* ObjectTraits<zcr_keyboard_extension_v1>::interface =
+ &zcr_keyboard_extension_v1_interface;
+void (*ObjectTraits<zcr_keyboard_extension_v1>::deleter)(
+ zcr_keyboard_extension_v1*) = &zcr_keyboard_extension_v1_destroy;
+
+const wl_interface* ObjectTraits<zcr_extended_keyboard_v1>::interface =
+ &zcr_extended_keyboard_v1_interface;
+void (*ObjectTraits<zcr_extended_keyboard_v1>::deleter)(
+ zcr_extended_keyboard_v1*) = &zcr_extended_keyboard_v1_destroy;
+
const wl_interface* ObjectTraits<zwp_linux_dmabuf_v1>::interface =
&zwp_linux_dmabuf_v1_interface;
void (*ObjectTraits<zwp_linux_dmabuf_v1>::deleter)(zwp_linux_dmabuf_v1*) =
diff --git a/chromium/ui/ozone/platform/wayland/common/wayland_object.h b/chromium/ui/ozone/platform/wayland/common/wayland_object.h
index 2d048ee3c5b..5c639f2db81 100644
--- a/chromium/ui/ozone/platform/wayland/common/wayland_object.h
+++ b/chromium/ui/ozone/platform/wayland/common/wayland_object.h
@@ -39,6 +39,8 @@ struct xdg_surface;
struct xdg_toplevel;
struct xdg_popup;
struct xdg_positioner;
+struct zcr_keyboard_extension_v1;
+struct zcr_extended_keyboard_v1;
struct zwp_linux_dmabuf_v1;
struct zxdg_shell_v6;
struct zxdg_surface_v6;
@@ -246,6 +248,18 @@ struct ObjectTraits<xdg_positioner> {
};
template <>
+struct ObjectTraits<zcr_keyboard_extension_v1> {
+ static const wl_interface* interface;
+ static void (*deleter)(zcr_keyboard_extension_v1*);
+};
+
+template <>
+struct ObjectTraits<zcr_extended_keyboard_v1> {
+ static const wl_interface* interface;
+ static void (*deleter)(zcr_extended_keyboard_v1*);
+};
+
+template <>
struct ObjectTraits<zwp_linux_dmabuf_v1> {
static const wl_interface* interface;
static void (*deleter)(zwp_linux_dmabuf_v1*);
diff --git a/chromium/ui/ozone/platform/wayland/gpu/drm_render_node_handle.cc b/chromium/ui/ozone/platform/wayland/gpu/drm_render_node_handle.cc
index a049ee5be98..87ec9b08f00 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/drm_render_node_handle.cc
+++ b/chromium/ui/ozone/platform/wayland/gpu/drm_render_node_handle.cc
@@ -7,6 +7,8 @@
#include <fcntl.h>
#include <xf86drm.h>
+#include "base/logging.h"
+
namespace ui {
DrmRenderNodeHandle::DrmRenderNodeHandle() = default;
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 95c840cbf77..734e8b2b699 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc
+++ b/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc
@@ -18,12 +18,17 @@ namespace ui {
namespace {
-void WaitForFence(EGLDisplay display, EGLSyncKHR fence) {
+void WaitForEGLFence(EGLDisplay display, EGLSyncKHR fence) {
eglClientWaitSyncKHR(display, fence, EGL_SYNC_FLUSH_COMMANDS_BIT_KHR,
EGL_FOREVER_KHR);
eglDestroySyncKHR(display, fence);
}
+void WaitForGpuFences(std::vector<std::unique_ptr<gfx::GpuFence>> fences) {
+ for (auto& fence : fences)
+ fence->Wait();
+}
+
} // namespace
GbmSurfacelessWayland::GbmSurfacelessWayland(
@@ -41,7 +46,7 @@ GbmSurfacelessWayland::GbmSurfacelessWayland(
void GbmSurfacelessWayland::QueueOverlayPlane(OverlayPlane plane,
uint32_t buffer_id) {
- planes_.push_back({std::move(plane), buffer_id});
+ unsubmitted_frames_.back()->planes.push_back({std::move(plane), buffer_id});
}
bool GbmSurfacelessWayland::ScheduleOverlayPlane(
@@ -87,7 +92,8 @@ void GbmSurfacelessWayland::SwapBuffersAsync(
TRACE_EVENT0("wayland", "GbmSurfacelessWayland::SwapBuffersAsync");
// If last swap failed, don't try to schedule new ones.
if (!last_swap_buffers_result_) {
- std::move(completion_callback).Run(gfx::SwapResult::SWAP_FAILED, nullptr);
+ std::move(completion_callback)
+ .Run(gfx::SwapCompletionResult(gfx::SwapResult::SWAP_FAILED));
// Notify the caller, the buffer is never presented on a screen.
std::move(presentation_callback).Run(gfx::PresentationFeedback::Failure());
return;
@@ -102,21 +108,35 @@ void GbmSurfacelessWayland::SwapBuffersAsync(
PendingFrame* frame = unsubmitted_frames_.back().get();
frame->completion_callback = std::move(completion_callback);
frame->presentation_callback = std::move(presentation_callback);
+ frame->ScheduleOverlayPlanes(widget_);
+
unsubmitted_frames_.push_back(std::make_unique<PendingFrame>());
- if (!use_egl_fence_sync_) {
+ if (!use_egl_fence_sync_ || !frame->schedule_planes_succeeded) {
frame->ready = true;
SubmitFrame();
return;
}
- // TODO: the following should be replaced by a per surface flush as it gets
- // implemented in GL drivers.
- EGLSyncKHR fence = InsertFence(has_implicit_external_sync_);
- CHECK_NE(fence, EGL_NO_SYNC_KHR) << "eglCreateSyncKHR failed";
+ std::vector<std::unique_ptr<gfx::GpuFence>> fences;
+ // Uset in-fences provided in the overlays. If there are none, we insert our
+ // own fence and wait.
+ for (auto& plane : frame->planes) {
+ if (plane.plane.gpu_fence)
+ fences.push_back(std::move(plane.plane.gpu_fence));
+ }
+
+ base::OnceClosure fence_wait_task;
+ if (!fences.empty()) {
+ fence_wait_task = base::BindOnce(&WaitForGpuFences, std::move(fences));
+ } else {
+ // TODO: the following should be replaced by a per surface flush as it gets
+ // implemented in GL drivers.
+ EGLSyncKHR fence = InsertFence(has_implicit_external_sync_);
+ CHECK_NE(fence, EGL_NO_SYNC_KHR) << "eglCreateSyncKHR failed";
- base::OnceClosure fence_wait_task =
- base::BindOnce(&WaitForFence, GetDisplay(), fence);
+ fence_wait_task = base::BindOnce(&WaitForEGLFence, GetDisplay(), fence);
+ }
base::OnceClosure fence_retired_callback = base::BindOnce(
&GbmSurfacelessWayland::FenceRetired, weak_factory_.GetWeakPtr(), frame);
@@ -181,12 +201,14 @@ GbmSurfacelessWayland::PendingFrame::PendingFrame() {}
GbmSurfacelessWayland::PendingFrame::~PendingFrame() {}
-bool GbmSurfacelessWayland::PendingFrame::ScheduleOverlayPlanes(
+void GbmSurfacelessWayland::PendingFrame::ScheduleOverlayPlanes(
gfx::AcceleratedWidget widget) {
- for (auto& overlay : overlays)
+ for (auto& overlay : overlays) {
if (!overlay.ScheduleOverlayPlane(widget))
- return false;
- return true;
+ return;
+ }
+ schedule_planes_succeeded = true;
+ return;
}
void GbmSurfacelessWayland::PendingFrame::Flush() {
@@ -201,14 +223,11 @@ void GbmSurfacelessWayland::SubmitFrame() {
submitted_frame_ = std::move(unsubmitted_frames_.front());
unsubmitted_frames_.erase(unsubmitted_frames_.begin());
- bool schedule_planes_succeeded =
- submitted_frame_->ScheduleOverlayPlanes(widget_);
-
- if (!schedule_planes_succeeded) {
+ if (!submitted_frame_->schedule_planes_succeeded) {
last_swap_buffers_result_ = false;
std::move(submitted_frame_->completion_callback)
- .Run(gfx::SwapResult::SWAP_FAILED, nullptr);
+ .Run(gfx::SwapCompletionResult(gfx::SwapResult::SWAP_FAILED));
// Notify the caller, the buffer is never presented on a screen.
std::move(submitted_frame_->presentation_callback)
.Run(gfx::PresentationFeedback::Failure());
@@ -217,11 +236,13 @@ void GbmSurfacelessWayland::SubmitFrame() {
return;
}
- submitted_frame_->buffer_id = planes_.back().buffer_id;
- buffer_manager_->CommitBuffer(widget_, submitted_frame_->buffer_id,
+ DCHECK_EQ(submitted_frame_->planes.size(), 1u);
+ submitted_frame_->buffer_id = submitted_frame_->planes.back().buffer_id;
+ buffer_manager_->CommitBuffer(widget_,
+ submitted_frame_->planes.back().buffer_id,
submitted_frame_->damage_region_);
- planes_.clear();
+ submitted_frame_->planes.clear();
}
}
@@ -247,7 +268,8 @@ void GbmSurfacelessWayland::OnSubmission(uint32_t buffer_id,
submitted_frame_->overlays.clear();
DCHECK_EQ(submitted_frame_->buffer_id, buffer_id);
- std::move(submitted_frame_->completion_callback).Run(swap_result, nullptr);
+ std::move(submitted_frame_->completion_callback)
+ .Run(gfx::SwapCompletionResult(swap_result));
pending_presentation_frames_.push_back(std::move(submitted_frame_));
diff --git a/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.h b/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.h
index 991d1718fad..137bea20432 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.h
+++ b/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.h
@@ -71,11 +71,19 @@ class GbmSurfacelessWayland : public gl::SurfacelessEGL,
void OnPresentation(uint32_t buffer_id,
const gfx::PresentationFeedback& feedback) override;
+ struct PlaneData {
+ OverlayPlane plane;
+ // The id of the buffer, which represents buffer that backs this overlay
+ // plane.
+ const uint32_t buffer_id;
+ };
+
struct PendingFrame {
PendingFrame();
~PendingFrame();
- bool ScheduleOverlayPlanes(gfx::AcceleratedWidget widget);
+ // Queues overlay configs to |planes|.
+ void ScheduleOverlayPlanes(gfx::AcceleratedWidget widget);
void Flush();
bool ready = false;
@@ -90,11 +98,9 @@ class GbmSurfacelessWayland : public gl::SurfacelessEGL,
std::vector<gl::GLSurfaceOverlay> overlays;
SwapCompletionCallback completion_callback;
PresentationCallback presentation_callback;
- };
- struct PlaneData {
- OverlayPlane plane;
- const uint32_t buffer_id;
+ bool schedule_planes_succeeded = false;
+ std::vector<PlaneData> planes;
};
void SubmitFrame();
@@ -106,7 +112,6 @@ class GbmSurfacelessWayland : public gl::SurfacelessEGL,
void SetNoGLFlushForTests();
WaylandBufferManagerGpu* const buffer_manager_;
- std::vector<PlaneData> planes_;
// The native surface. Deleting this is allowed to free the EGLNativeWindow.
gfx::AcceleratedWidget widget_;
diff --git a/chromium/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.cc b/chromium/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.cc
index 60c70c7e82e..195d061926c 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.cc
+++ b/chromium/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.cc
@@ -145,7 +145,8 @@ void GLSurfaceEglReadbackWayland::OnSubmission(
in_flight_pixel_buffers_.pop_front();
DCHECK(!completion_callbacks_.empty());
- std::move(completion_callbacks_.front()).Run(swap_result, nullptr);
+ std::move(completion_callbacks_.front())
+ .Run(gfx::SwapCompletionResult(swap_result));
completion_callbacks_.erase(completion_callbacks_.begin());
}
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 585e5666283..aa649253a68 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
@@ -21,6 +21,7 @@
#include "ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h"
#include "ui/ozone/platform/wayland/host/wayland_window.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_wayland_server_thread.h"
#include "ui/ozone/platform/wayland/test/test_zwp_linux_buffer_params.h"
#include "ui/ozone/platform/wayland/test/wayland_test.h"
@@ -126,8 +127,7 @@ class CallbacksHelper {
// way.
void FinishSwapBuffersAsync(uint32_t local_swap_id,
scoped_refptr<FakeGLImageNativePixmap> gl_image,
- gfx::SwapResult result,
- std::unique_ptr<gfx::GpuFence> gpu_fence) {
+ gfx::SwapCompletionResult result) {
last_finish_swap_id_ = pending_local_swap_ids_.front();
pending_local_swap_ids_.pop();
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 23e2eaf306f..1a68f9da34e 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
@@ -8,6 +8,7 @@
#include "ui/ozone/platform/wayland/host/gtk_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 {
@@ -25,6 +26,14 @@ GtkPrimarySelectionDevice::GtkPrimarySelectionDevice(
GtkPrimarySelectionDevice::~GtkPrimarySelectionDevice() = default;
+void GtkPrimarySelectionDevice::SetSelectionSource(
+ GtkPrimarySelectionSource* source) {
+ DCHECK(source);
+ gtk_primary_selection_device_set_selection(
+ data_device_.get(), source->data_source(), connection()->serial());
+ connection()->ScheduleFlush();
+}
+
// static
void GtkPrimarySelectionDevice::OnDataOffer(
void* data,
diff --git a/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device.h b/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device.h
index fc567936fe3..4bb586bffc3 100644
--- a/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device.h
+++ b/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device.h
@@ -13,6 +13,7 @@
#include "base/macros.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 gtk_primary_selection_device;
@@ -31,6 +32,8 @@ class GtkPrimarySelectionDevice : public WaylandDataDeviceBase {
return data_device_.get();
}
+ void SetSelectionSource(GtkPrimarySelectionSource* source);
+
private:
// gtk_primary_selection_device_listener callbacks
static void OnDataOffer(void* data,
diff --git a/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.cc b/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.cc
index 90a8225bd73..3d49d7a4576 100644
--- a/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.cc
+++ b/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.cc
@@ -6,33 +6,42 @@
#include <gtk-primary-selection-client-protocol.h>
-#include "ui/ozone/platform/wayland/host/gtk_primary_selection_source.h"
+#include <memory>
+
+#include "ui/ozone/platform/wayland/host/gtk_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 {
GtkPrimarySelectionDeviceManager::GtkPrimarySelectionDeviceManager(
gtk_primary_selection_device_manager* manager,
WaylandConnection* connection)
- : gtk_primary_selection_device_manager_(manager), connection_(connection) {
+ : device_manager_(manager), connection_(connection) {
DCHECK(connection_);
- DCHECK(gtk_primary_selection_device_manager_);
+ DCHECK(device_manager_);
}
GtkPrimarySelectionDeviceManager::~GtkPrimarySelectionDeviceManager() = default;
-gtk_primary_selection_device* GtkPrimarySelectionDeviceManager::GetDevice() {
+GtkPrimarySelectionDevice* GtkPrimarySelectionDeviceManager::GetDevice() {
DCHECK(connection_->seat());
- return gtk_primary_selection_device_manager_get_device(
- gtk_primary_selection_device_manager_.get(), connection_->seat());
+ if (!device_) {
+ device_ = std::make_unique<GtkPrimarySelectionDevice>(
+ connection_, gtk_primary_selection_device_manager_get_device(
+ device_manager_.get(), connection_->seat()));
+ }
+ DCHECK(device_);
+ return device_.get();
}
std::unique_ptr<GtkPrimarySelectionSource>
-GtkPrimarySelectionDeviceManager::CreateSource() {
- gtk_primary_selection_source* data_source =
- gtk_primary_selection_device_manager_create_source(
- gtk_primary_selection_device_manager_.get());
- return std::make_unique<GtkPrimarySelectionSource>(data_source, connection_);
+GtkPrimarySelectionDeviceManager::CreateSource(
+ GtkPrimarySelectionSource::Delegate* delegate) {
+ auto* data_source =
+ gtk_primary_selection_device_manager_create_source(device_manager_.get());
+ return std::make_unique<GtkPrimarySelectionSource>(data_source, connection_,
+ delegate);
}
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.h b/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.h
index ea05aa38882..b059c2c8621 100644
--- a/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.h
+++ b/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.h
@@ -7,34 +7,38 @@
#include <memory>
-#include "base/macros.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
-
-struct gtk_primary_selection_device_manager;
-struct gtk_primary_selection_device;
+#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
namespace ui {
-class GtkPrimarySelectionSource;
+class GtkPrimarySelectionDevice;
class WaylandConnection;
class GtkPrimarySelectionDeviceManager {
public:
+ using DataSource = GtkPrimarySelectionSource;
+ using DataDevice = GtkPrimarySelectionDevice;
+
GtkPrimarySelectionDeviceManager(
gtk_primary_selection_device_manager* manager,
WaylandConnection* connection);
+ GtkPrimarySelectionDeviceManager(const GtkPrimarySelectionDeviceManager&) =
+ delete;
+ GtkPrimarySelectionDeviceManager& operator=(
+ const GtkPrimarySelectionDeviceManager&) = delete;
~GtkPrimarySelectionDeviceManager();
- gtk_primary_selection_device* GetDevice();
- std::unique_ptr<GtkPrimarySelectionSource> CreateSource();
+ GtkPrimarySelectionDevice* GetDevice();
+ std::unique_ptr<GtkPrimarySelectionSource> CreateSource(
+ GtkPrimarySelectionSource::Delegate* delegate);
private:
- wl::Object<gtk_primary_selection_device_manager>
- gtk_primary_selection_device_manager_;
+ wl::Object<gtk_primary_selection_device_manager> device_manager_;
- WaylandConnection* connection_;
+ WaylandConnection* const connection_;
- DISALLOW_COPY_AND_ASSIGN(GtkPrimarySelectionDeviceManager);
+ std::unique_ptr<GtkPrimarySelectionDevice> device_;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_source.cc b/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_source.cc
deleted file mode 100644
index 7160cdd83fa..00000000000
--- a/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_source.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-// 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/ozone/platform/wayland/host/gtk_primary_selection_source.h"
-
-#include <gtk-primary-selection-client-protocol.h>
-
-#include "base/check.h"
-#include "base/files/file_util.h"
-#include "ui/base/clipboard/clipboard_constants.h"
-#include "ui/ozone/platform/wayland/host/wayland_connection.h"
-
-namespace ui {
-
-GtkPrimarySelectionSource::GtkPrimarySelectionSource(
- gtk_primary_selection_source* data_source,
- WaylandConnection* connection)
- : data_source_(data_source), connection_(connection) {
- DCHECK(connection_);
- DCHECK(data_source_);
-
- static const struct gtk_primary_selection_source_listener
- kDataSourceListener = {GtkPrimarySelectionSource::OnSend,
- GtkPrimarySelectionSource::OnCancelled};
- gtk_primary_selection_source_add_listener(data_source_.get(),
- &kDataSourceListener, this);
-}
-
-GtkPrimarySelectionSource::~GtkPrimarySelectionSource() = default;
-
-// static
-void GtkPrimarySelectionSource::OnSend(void* data,
- gtk_primary_selection_source* source,
- const char* mime_type,
- int32_t fd) {
- GtkPrimarySelectionSource* self =
- static_cast<GtkPrimarySelectionSource*>(data);
- std::string contents;
- base::Optional<std::vector<uint8_t>> mime_data;
- self->GetClipboardData(mime_type, &mime_data);
- if (!mime_data.has_value() && strcmp(mime_type, kMimeTypeTextUtf8) == 0)
- self->GetClipboardData(kMimeTypeText, &mime_data);
- contents.assign(mime_data->begin(), mime_data->end());
- bool result =
- base::WriteFileDescriptor(fd, contents.data(), contents.length());
- DCHECK(result);
- close(fd);
-}
-
-// static
-void GtkPrimarySelectionSource::OnCancelled(
- void* data,
- gtk_primary_selection_source* source) {
- GtkPrimarySelectionSource* self =
- static_cast<GtkPrimarySelectionSource*>(data);
- self->connection_->clipboard()->DataSourceCancelled(
- ClipboardBuffer::kSelection);
-}
-
-void GtkPrimarySelectionSource::WriteToClipboard(
- const PlatformClipboard::DataMap& data_map) {
- for (const auto& data : data_map) {
- gtk_primary_selection_source_offer(data_source_.get(), data.first.c_str());
- if (strcmp(data.first.c_str(), kMimeTypeText) == 0)
- gtk_primary_selection_source_offer(data_source_.get(), kMimeTypeTextUtf8);
- }
-
- gtk_primary_selection_device_set_selection(
- connection_->primary_selection_device(), data_source_.get(),
- connection_->serial());
-
- connection_->ScheduleFlush();
-}
-
-} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_source.h b/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_source.h
deleted file mode 100644
index 994fffa25d3..00000000000
--- a/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_source.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// 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_OZONE_PLATFORM_WAYLAND_HOST_GTK_PRIMARY_SELECTION_SOURCE_H_
-#define UI_OZONE_PLATFORM_WAYLAND_HOST_GTK_PRIMARY_SELECTION_SOURCE_H_
-
-#include "base/macros.h"
-#include "ui/ozone/platform/wayland/common/wayland_object.h"
-#include "ui/ozone/platform/wayland/host/wayland_data_source_base.h"
-#include "ui/ozone/public/platform_clipboard.h"
-
-struct gtk_primary_selection_source;
-
-namespace ui {
-
-class WaylandConnection;
-
-class GtkPrimarySelectionSource : public WaylandDataSourceBase {
- public:
- // Takes ownership of data_source.
- GtkPrimarySelectionSource(gtk_primary_selection_source* data_source,
- WaylandConnection* connection);
- ~GtkPrimarySelectionSource() override;
-
- void WriteToClipboard(const PlatformClipboard::DataMap& data_map) override;
-
- private:
- // gtk_primary_selection_source_listener callbacks
- static void OnSend(void* data,
- gtk_primary_selection_source* source,
- const char* mime_type,
- int32_t fd);
- static void OnCancelled(void* data, gtk_primary_selection_source* source);
-
- // The gtk_primary_selection_source wrapped by this instance.
- wl::Object<gtk_primary_selection_source> data_source_;
-
- WaylandConnection* connection_ = nullptr;
-
- DISALLOW_COPY_AND_ASSIGN(GtkPrimarySelectionSource);
-};
-
-} // namespace ui
-
-#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_GTK_PRIMARY_SELECTION_SOURCE_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/shell_object_factory.cc b/chromium/ui/ozone/platform/wayland/host/shell_object_factory.cc
index 57383be20da..dea71480eb6 100644
--- a/chromium/ui/ozone/platform/wayland/host/shell_object_factory.cc
+++ b/chromium/ui/ozone/platform/wayland/host/shell_object_factory.cc
@@ -4,6 +4,7 @@
#include "ui/ozone/platform/wayland/host/shell_object_factory.h"
+#include "base/logging.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
#include "ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.h"
#include "ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.h"
@@ -44,4 +45,4 @@ std::unique_ptr<ShellPopupWrapper> ShellObjectFactory::CreateShellPopupWrapper(
return nullptr;
}
-} // namespace ui \ No newline at end of file
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/shell_popup_wrapper.cc b/chromium/ui/ozone/platform/wayland/host/shell_popup_wrapper.cc
index 1dc1f4d4f76..f9f5aaa0825 100644
--- a/chromium/ui/ozone/platform/wayland/host/shell_popup_wrapper.cc
+++ b/chromium/ui/ozone/platform/wayland/host/shell_popup_wrapper.cc
@@ -4,6 +4,9 @@
#include "ui/ozone/platform/wayland/host/shell_popup_wrapper.h"
+#include "base/check_op.h"
+#include "base/notreached.h"
+
namespace ui {
constexpr uint32_t kAnchorDefaultWidth = 1;
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 96c4099fdb8..8320574a540 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
@@ -16,6 +16,7 @@
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
#include "ui/ozone/platform/wayland/host/wayland_drm.h"
#include "ui/ozone/platform/wayland/host/wayland_shm.h"
+#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_zwp_linux_dmabuf.h"
@@ -55,10 +56,10 @@ std::string NumberToString(uint32_t number) {
class WaylandBufferManagerHost::Surface {
public:
- Surface(WaylandWindow* window,
+ Surface(WaylandSurface* wayland_surface,
WaylandConnection* connection,
WaylandBufferManagerHost* buffer_manager)
- : window_(window),
+ : wayland_surface_(wayland_surface),
connection_(connection),
buffer_manager_(buffer_manager) {}
~Surface() = default;
@@ -67,7 +68,7 @@ class WaylandBufferManagerHost::Surface {
DCHECK(!pending_buffer_);
// The window has already been destroyed.
- if (!window_)
+ if (!wayland_surface_)
return true;
WaylandBuffer* buffer = GetBuffer(buffer_id);
@@ -95,23 +96,9 @@ class WaylandBufferManagerHost::Surface {
if (buffer->attached && !buffer->wl_buffer)
return false;
- // This request may come earlier than the Wayland compositor has imported a
- // wl_buffer. Wait until the buffer is created. The wait takes place only
- // once. Though, the case when a request to attach a buffer comes earlier
- // than the wl_buffer is created does not happen often. 1) Depending on the
- // zwp linux dmabuf protocol version, the wl_buffer can be created
- // immediately without asynchronous wait 2) the wl_buffer can have been
- // created by this time.
- //
- // Another case, which always happen is waiting until the frame callback is
- // completed. Thus, wait here when the Wayland compositor fires the frame
- // callback.
- if (!buffer->wl_buffer || wl_frame_callback_) {
- pending_buffer_ = buffer;
- return true;
- }
-
- return CommitBufferInternal(buffer);
+ pending_buffer_ = buffer;
+ MaybeProcessPendingBuffer();
+ return true;
}
bool CreateBuffer(const gfx::Size& size, uint32_t buffer_id) {
@@ -140,7 +127,7 @@ class WaylandBufferManagerHost::Surface {
// the client about successful swap.
// If the window has already been destroyed, no need to complete the
// submission.
- if (buffer && !buffer->released && submitted_buffer_ && window_)
+ if (buffer && !buffer->released && submitted_buffer_ && wayland_surface_)
CompleteSubmission();
if (prev_submitted_buffer_ == buffer)
@@ -167,8 +154,8 @@ class WaylandBufferManagerHost::Surface {
if (buffer->wl_buffer)
SetupBufferReleaseListener(buffer);
- if (pending_buffer_ == buffer && !wl_frame_callback_)
- ProcessPendingBuffer();
+ if (pending_buffer_ == buffer)
+ MaybeProcessPendingBuffer();
}
void ClearState() {
@@ -186,17 +173,23 @@ class WaylandBufferManagerHost::Surface {
}
void ResetSurfaceContents() {
- if (!window_)
+ if (!wayland_surface_)
return;
- wl_surface_attach(window_->surface(), nullptr, 0, 0);
- wl_surface_commit(window_->surface());
+ wl_surface_attach(wayland_surface_->surface(), nullptr, 0, 0);
+ wl_surface_commit(wayland_surface_->surface());
// We cannot reset |prev_submitted_buffer_| here as long as the surface
// might have attached a new buffer and is about to receive a release
// callback. Check more comments below where the variable is declared.
contents_reset_ = true;
+ // ResetSurfaceContents happens upon WaylandWindow::Hide call, which
+ // destroyes xdg_surface, xdg_popup, etc. They are going to be reinitialized
+ // once WaylandWindow::Show is called. Thus, they will have to be configured
+ // once again before buffers can be attached.
+ configured_ = false;
+
connection_->ScheduleFlush();
}
@@ -207,8 +200,16 @@ class WaylandBufferManagerHost::Surface {
bool HasBuffers() const { return !buffers_.empty(); }
- void OnWindowRemoved() { window_ = nullptr; }
- bool HasWindow() const { return !!window_; }
+ void OnWindowRemoved() { wayland_surface_ = nullptr; }
+ bool HasWindow() const { return !!wayland_surface_; }
+
+ void OnWindowConfigured() {
+ if (configured_)
+ return;
+
+ configured_ = true;
+ MaybeProcessPendingBuffer();
+ }
private:
struct FeedbackInfo {
@@ -226,7 +227,7 @@ class WaylandBufferManagerHost::Surface {
using PresentationFeedbackQueue = std::vector<FeedbackInfo>;
bool CommitBufferInternal(WaylandBuffer* buffer) {
- DCHECK(buffer && window_);
+ DCHECK(buffer && wayland_surface_);
DCHECK(!pending_buffer_);
DCHECK(!submitted_buffer_);
@@ -274,7 +275,7 @@ class WaylandBufferManagerHost::Surface {
}
void DamageBuffer(WaylandBuffer* buffer) {
- DCHECK(window_);
+ DCHECK(wayland_surface_);
gfx::Rect pending_damage_region = std::move(buffer->damage_region);
// If the size of the damage region is empty, wl_surface_damage must be
@@ -290,10 +291,10 @@ class WaylandBufferManagerHost::Surface {
// https://bit.ly/2u00lv6 for details.
// We don't need to apply any scaling because pending_damage_region is
// already in buffer coordinates.
- wl_surface_damage_buffer(window_->surface(), pending_damage_region.x(),
- pending_damage_region.y(),
- pending_damage_region.width(),
- pending_damage_region.height());
+ wl_surface_damage_buffer(
+ wayland_surface_->surface(), pending_damage_region.x(),
+ pending_damage_region.y(), pending_damage_region.width(),
+ pending_damage_region.height());
} else {
// The calculation for damage region relies on two assumptions:
// 1) The buffer is always attached at surface location (0, 0)
@@ -304,8 +305,9 @@ class WaylandBufferManagerHost::Surface {
// Note: The damage region may not be an integer multiple of scale. To
// keep the implementation simple, the x() and y() coordinates round down,
// and the width() and height() calculations always add an extra pixel.
- int scale = window_->buffer_scale();
- wl_surface_damage(window_->surface(), pending_damage_region.x() / scale,
+ int scale = wayland_surface_->buffer_scale();
+ wl_surface_damage(wayland_surface_->surface(),
+ pending_damage_region.x() / scale,
pending_damage_region.y() / scale,
pending_damage_region.width() / scale + 1,
pending_damage_region.height() / scale + 1);
@@ -313,31 +315,32 @@ class WaylandBufferManagerHost::Surface {
}
void AttachBuffer(WaylandBuffer* buffer) {
- DCHECK(window_);
+ DCHECK(wayland_surface_ && configured_);
// The logic in DamageBuffer currently relies on attachment coordinates of
// (0, 0). If this changes, then the calculation in DamageBuffer will also
// need to be updated.
- wl_surface_attach(window_->surface(), buffer->wl_buffer.get(), 0, 0);
+ wl_surface_attach(wayland_surface_->surface(), buffer->wl_buffer.get(), 0,
+ 0);
}
void CommitSurface() {
- DCHECK(window_);
- wl_surface_commit(window_->surface());
+ DCHECK(wayland_surface_);
+ wl_surface_commit(wayland_surface_->surface());
}
void SetupFrameCallback() {
- DCHECK(window_);
+ DCHECK(wayland_surface_);
static const wl_callback_listener frame_listener = {
&Surface::FrameCallbackDone};
DCHECK(!wl_frame_callback_);
- wl_frame_callback_.reset(wl_surface_frame(window_->surface()));
+ wl_frame_callback_.reset(wl_surface_frame(wayland_surface_->surface()));
wl_callback_add_listener(wl_frame_callback_.get(), &frame_listener, this);
}
void SetupPresentationFeedback(uint32_t buffer_id) {
- DCHECK(window_);
+ DCHECK(wayland_surface_);
// Set up presentation feedback.
if (!connection_->presentation())
return;
@@ -348,7 +351,7 @@ class WaylandBufferManagerHost::Surface {
feedback_queue_.push_back(
{wl::Object<struct wp_presentation_feedback>(wp_presentation_feedback(
- connection_->presentation(), window_->surface())),
+ connection_->presentation(), wayland_surface_->surface())),
buffer_id, /*feedback=*/base::nullopt,
/*submission_completed=*/false});
wp_presentation_feedback_add_listener(
@@ -372,7 +375,7 @@ class WaylandBufferManagerHost::Surface {
DCHECK(wl_frame_callback_.get() == callback);
wl_frame_callback_.reset();
- ProcessPendingBuffer();
+ MaybeProcessPendingBuffer();
}
// wl_callback_listener
@@ -438,13 +441,13 @@ class WaylandBufferManagerHost::Surface {
prev_submitted_buffer_ = submitted_buffer_;
submitted_buffer_ = nullptr;
- if (!window_)
+ if (!wayland_surface_)
return;
// We can now complete the latest submission. We had to wait for this
// release because SwapCompletionCallback indicates to the client that the
// previous buffer is available for reuse.
- buffer_manager_->OnSubmission(window_->GetWidget(), id,
+ buffer_manager_->OnSubmission(wayland_surface_->GetRootWidget(), id,
gfx::SwapResult::SWAP_ACK);
// If presentation feedback is not supported, use a fake feedback. This
@@ -452,7 +455,7 @@ class WaylandBufferManagerHost::Surface {
if (!connection_->presentation()) {
DCHECK(feedback_queue_.empty());
buffer_manager_->OnPresentation(
- window_->GetWidget(), id,
+ wayland_surface_->GetWidget(), id,
gfx::PresentationFeedback(base::TimeTicks::Now(), base::TimeDelta(),
GetPresentationKindFlags(0)));
} else {
@@ -468,13 +471,20 @@ class WaylandBufferManagerHost::Surface {
}
void OnPresentation(struct wp_presentation_feedback* wp_presentation_feedback,
- const gfx::PresentationFeedback& feedback) {
+ const gfx::PresentationFeedback& feedback,
+ bool discarded = false) {
FeedbackInfo* feedback_info = nullptr;
for (auto& info : feedback_queue_) {
if (info.wp_presentation_feedback.get() == wp_presentation_feedback) {
feedback_info = &info;
break;
- } else if (!info.feedback.has_value()) { // Feedback must come in order.
+ } else if (!info.feedback.has_value() && !discarded) {
+ // Feedback must come in order. However, if one of the feedbacks was
+ // discarded and the previous feedbacks haven't been received yet, don't
+ // mark previous feedbacks as failed as they will come later. For
+ // example, imagine you are waiting for f[0], f[1] and f[2]. f[2] gets
+ // discarded, previous ones mustn't be marked as failed as they will
+ // come later.
info.feedback = gfx::PresentationFeedback::Failure();
}
}
@@ -499,15 +509,15 @@ class WaylandBufferManagerHost::Surface {
// This function ensures that we send OnPresentation for each buffer that
// already has had OnSubmission called for it (condition #2).
void ProcessPresentationFeedbacks() {
- if (!window_)
+ if (!wayland_surface_)
return;
while (!feedback_queue_.empty()) {
const auto& info = feedback_queue_.front();
if (!info.submission_completed || !info.feedback.has_value())
break;
- buffer_manager_->OnPresentation(window_->GetWidget(), info.buffer_id,
- *info.feedback);
+ buffer_manager_->OnPresentation(wayland_surface_->GetWidget(),
+ info.buffer_id, *info.feedback);
feedback_queue_.erase(feedback_queue_.begin());
}
// This queue should be small - if not it's likely a bug.
@@ -546,11 +556,31 @@ class WaylandBufferManagerHost::Surface {
Surface* self = static_cast<Surface*>(data);
DCHECK(self);
self->OnPresentation(wp_presentation_feedback,
- gfx::PresentationFeedback::Failure());
+ gfx::PresentationFeedback::Failure(),
+ true /* discarded */);
}
- void ProcessPendingBuffer() {
- if (!pending_buffer_ || !window_)
+ void MaybeProcessPendingBuffer() {
+ // There is nothing to process if there is no pending buffer or the window
+ // has been destroyed.
+ if (!pending_buffer_ || !wayland_surface_)
+ return;
+
+ // This request may come earlier than the Wayland compositor has imported a
+ // wl_buffer. Wait until the buffer is created. The wait takes place only
+ // once. Though, the case when a request to attach a buffer comes earlier
+ // than the wl_buffer is created does not happen often. 1) Depending on the
+ // zwp linux dmabuf protocol version, the wl_buffer can be created
+ // immediately without asynchronous wait 2) the wl_buffer can have been
+ // created by this time.
+ //
+ // Another case, which always happen is waiting until the frame callback is
+ // completed. Thus, wait here when the Wayland compositor fires the frame
+ // callback.
+ //
+ // The third case happens if the window hasn't been configured until a
+ // request to attach a buffer to its surface is sent.
+ if (!pending_buffer_->wl_buffer || wl_frame_callback_ || !configured_)
return;
auto* buffer = pending_buffer_;
@@ -562,7 +592,7 @@ class WaylandBufferManagerHost::Surface {
// WaylandWindow.
// Non-owned. The window this helper surface stores and submits buffers for.
- const WaylandWindow* window_;
+ const WaylandSurface* wayland_surface_;
// Non-owned pointer to the connection.
WaylandConnection* const connection_;
@@ -598,6 +628,11 @@ class WaylandBufferManagerHost::Surface {
// a need to call submission callback manually.
bool contents_reset_ = false;
+ // If WaylandWindow has never been configured, do not try to attach
+ // buffers to its surface. Otherwise, Wayland server will drop the connection
+ // and send an error - "The surface has never been configured.".
+ bool configured_ = false;
+
DISALLOW_COPY_AND_ASSIGN(Surface);
};
@@ -619,7 +654,7 @@ WaylandBufferManagerHost::~WaylandBufferManagerHost() {
void WaylandBufferManagerHost::OnWindowAdded(WaylandWindow* window) {
DCHECK(window);
surfaces_[window->GetWidget()] =
- std::make_unique<Surface>(window, connection_, this);
+ std::make_unique<Surface>(window->wayland_surface(), connection_, this);
}
void WaylandBufferManagerHost::OnWindowRemoved(WaylandWindow* window) {
@@ -632,6 +667,13 @@ void WaylandBufferManagerHost::OnWindowRemoved(WaylandWindow* window) {
surfaces_.erase(it);
}
+void WaylandBufferManagerHost::OnWindowConfigured(WaylandWindow* window) {
+ DCHECK(window);
+ auto it = surfaces_.find(window->GetWidget());
+ DCHECK(it != surfaces_.end());
+ it->second->OnWindowConfigured();
+}
+
void WaylandBufferManagerHost::SetTerminateGpuCallback(
base::OnceCallback<void(std::string)> terminate_callback) {
terminate_gpu_cb_ = std::move(terminate_callback);
@@ -923,11 +965,10 @@ bool WaylandBufferManagerHost::ValidateBufferIdFromGpu(uint32_t buffer_id) {
return true;
}
-bool WaylandBufferManagerHost::ValidateDataFromGpu(
- const base::ScopedFD& fd,
- size_t length,
- const gfx::Size& size,
- uint32_t buffer_id) {
+bool WaylandBufferManagerHost::ValidateDataFromGpu(const base::ScopedFD& fd,
+ size_t length,
+ const gfx::Size& size,
+ uint32_t buffer_id) {
if (!ValidateBufferIdFromGpu(buffer_id))
return false;
@@ -952,21 +993,20 @@ bool WaylandBufferManagerHost::ValidateDataFromGpu(
void WaylandBufferManagerHost::OnCreateBufferComplete(
uint32_t buffer_id,
wl::Object<struct wl_buffer> new_buffer) {
- auto it = anonymous_buffers_.find(buffer_id);
- // It might have already been destroyed or stored by any of the surfaces.
- if (it != anonymous_buffers_.end()) {
- it->second->wl_buffer = std::move(new_buffer);
- } else {
- for (auto& surface : surfaces_) {
- if (surface.second->BufferExists(buffer_id)) {
- surface.second.get()->AttachWlBuffer(buffer_id,
- std::move(new_buffer));
- break;
- }
+ auto it = anonymous_buffers_.find(buffer_id);
+ // It might have already been destroyed or stored by any of the surfaces.
+ if (it != anonymous_buffers_.end()) {
+ it->second->wl_buffer = std::move(new_buffer);
+ } else {
+ for (auto& surface : surfaces_) {
+ if (surface.second->BufferExists(buffer_id)) {
+ surface.second.get()->AttachWlBuffer(buffer_id, std::move(new_buffer));
+ break;
}
}
- // There is no need for the buffer anymore. Let it go out of the scope and
- // be destroyed.
+ }
+ // There is no need for the buffer anymore. Let it go out of the scope and
+ // be destroyed.
}
void WaylandBufferManagerHost::OnSubmission(
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h
index c0c6809cad2..b467835f726 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h
@@ -81,6 +81,7 @@ class WaylandBufferManagerHost : public ozone::mojom::WaylandBufferManagerHost,
// WaylandWindowObserver implements:
void OnWindowAdded(WaylandWindow* window) override;
void OnWindowRemoved(WaylandWindow* window) override;
+ void OnWindowConfigured(WaylandWindow* window) override;
void SetTerminateGpuCallback(
base::OnceCallback<void(std::string)> terminate_gpu_cb);
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.cc b/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.cc
index 11add83d1b0..a0e848a216d 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.cc
@@ -4,28 +4,137 @@
#include "ui/ozone/platform/wayland/host/wayland_clipboard.h"
+#include <memory>
#include <string>
+#include "base/check.h"
+#include "base/notreached.h"
+#include "ui/base/clipboard/clipboard_buffer.h"
+#include "ui/base/clipboard/clipboard_constants.h"
+#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/gtk_primary_selection_source.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"
-#include "ui/ozone/platform/wayland/host/wayland_data_source_base.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
+#include "ui/ozone/public/platform_clipboard.h"
+
+namespace wl {
+
+// Internal Wayland Clipboard interface. A wl::Clipboard implementation handles
+// a single ui::ClipboardBuffer. With this common interface it is possible to
+// seamlessly support different clipboard buffers backed by different underlying
+// Wayland protocol objects.
+class Clipboard {
+ public:
+ virtual ~Clipboard() = default;
+
+ // Synchronously retrieves the mime types list currently available to be read.
+ virtual std::vector<std::string> ReadMimeTypes() = 0;
+
+ // Asynchronously reads clipboard content with |mime_type| format. The result
+ // data is expected to arrive through WaylandClipboard::SetData().
+ // TODO(nickdiego): Decouple DataDevice impls from WaylandClipboard.
+ virtual bool Read(const std::string& mime_type) = 0;
+
+ // Synchronously stores and announces |data| as available from this clipboard.
+ virtual void Write(const ui::PlatformClipboard::DataMap* data) = 0;
+
+ // Tells if this clipboard instance is the current selection owner.
+ virtual bool IsSelectionOwner() const = 0;
+};
+
+// Templated wl::Clipboard implementation. Whereas DataSource is the data source
+// class capable of creating data offers upon clipboard writes and communicates
+// events through DataSource::Delegate, and DataDevice is its device counterpart
+// providing read and write access to the underlying data selection-related
+// protocol objects. See *_data_{source,device}.h for more details.
+template <typename Manager,
+ typename DataSource = typename Manager::DataSource,
+ typename DataDevice = typename Manager::DataDevice>
+class ClipboardImpl final : public Clipboard, public DataSource::Delegate {
+ public:
+ explicit ClipboardImpl(Manager* manager) : manager_(manager) {}
+ ClipboardImpl(const ClipboardImpl&) = delete;
+ ClipboardImpl& operator=(const ClipboardImpl&) = delete;
+ virtual ~ClipboardImpl() = default;
+
+ virtual bool Read(const std::string& mime_type) override {
+ return GetDevice()->RequestSelectionData(mime_type);
+ }
+
+ std::vector<std::string> ReadMimeTypes() override {
+ return GetDevice()->GetAvailableMimeTypes();
+ }
+
+ virtual void Write(const ui::PlatformClipboard::DataMap* data) override {
+ if (!data || data->empty()) {
+ data_.clear();
+ source_.reset();
+ } else {
+ data_ = *data;
+ if (!source_)
+ source_ = manager_->CreateSource(this);
+ source_->Offer(GetMimeTypes());
+ GetDevice()->SetSelectionSource(source_.get());
+ }
+ }
+
+ bool IsSelectionOwner() const override { return !!source_; }
+
+ private:
+ DataDevice* GetDevice() { return manager_->GetDevice(); }
+
+ std::vector<std::string> GetMimeTypes() {
+ std::vector<std::string> mime_types;
+ for (const auto& data : data_) {
+ mime_types.push_back(data.first);
+ if (data.first == ui::kMimeTypeText)
+ mime_types.push_back(ui::kMimeTypeTextUtf8);
+ }
+ return mime_types;
+ }
+
+ // WaylandDataSource::Delegate:
+ void OnDataSourceFinish(bool completed) override {
+ if (!completed)
+ Write(nullptr);
+ }
+
+ void OnDataSourceSend(const std::string& mime_type,
+ std::string* contents) override {
+ DCHECK(contents);
+ auto it = data_.find(mime_type);
+ if (it == data_.end() && mime_type == ui::kMimeTypeTextUtf8)
+ it = data_.find(ui::kMimeTypeText);
+ if (it != data_.end())
+ contents->assign(it->second.begin(), it->second.end());
+ }
+
+ // The device manager used to access data device and create data sources.
+ Manager* const manager_;
+
+ // The current data source used to offer clipboard data.
+ std::unique_ptr<DataSource> source_;
+
+ // The data currently stored in a given clipboard buffer.
+ ui::PlatformClipboard::DataMap data_;
+};
+
+} // namespace wl
namespace ui {
-WaylandClipboard::WaylandClipboard(
- WaylandDataDeviceManager* data_device_manager,
- WaylandDataDevice* data_device,
- GtkPrimarySelectionDeviceManager* primary_selection_device_manager,
- GtkPrimarySelectionDevice* primary_selection_device)
- : data_device_manager_(data_device_manager),
- data_device_(data_device),
- primary_selection_device_manager_(primary_selection_device_manager),
- primary_selection_device_(primary_selection_device) {
- DCHECK(data_device_manager_);
- DCHECK(data_device_);
+WaylandClipboard::WaylandClipboard(WaylandConnection* connection,
+ WaylandDataDeviceManager* manager)
+ : connection_(connection),
+ copypaste_clipboard_(
+ std::make_unique<wl::ClipboardImpl<WaylandDataDeviceManager>>(
+ manager)) {
+ DCHECK(manager);
+ DCHECK(connection_);
+ DCHECK(copypaste_clipboard_);
}
WaylandClipboard::~WaylandClipboard() = default;
@@ -34,25 +143,8 @@ void WaylandClipboard::OfferClipboardData(
ClipboardBuffer buffer,
const PlatformClipboard::DataMap& data_map,
PlatformClipboard::OfferDataClosure callback) {
- WaylandDataSourceBase* data_source = nullptr;
- if (buffer == ClipboardBuffer::kCopyPaste) {
- if (!clipboard_data_source_)
- clipboard_data_source_ = data_device_manager_->CreateSource();
- data_source = clipboard_data_source_.get();
- } else {
- if (!IsPrimarySelectionSupported()) {
- std::move(callback).Run();
- return;
- }
- if (!primary_data_source_)
- primary_data_source_ = primary_selection_device_manager_->CreateSource();
- data_source = primary_data_source_.get();
- }
-
- DCHECK(data_source);
- data_source->WriteToClipboard(data_map);
- data_source->set_data_map(data_map);
-
+ if (auto* clipboard = GetClipboard(buffer))
+ clipboard->Write(&data_map);
std::move(callback).Run();
}
@@ -61,25 +153,18 @@ void WaylandClipboard::RequestClipboardData(
const std::string& mime_type,
PlatformClipboard::DataMap* data_map,
PlatformClipboard::RequestDataClosure callback) {
- read_clipboard_closure_ = std::move(callback);
DCHECK(data_map);
data_map_ = data_map;
- if (buffer == ClipboardBuffer::kCopyPaste) {
- if (!data_device_->RequestSelectionData(mime_type))
- SetData({}, mime_type);
- } else {
- if (!IsPrimarySelectionSupported() ||
- !primary_selection_device_->RequestSelectionData(mime_type)) {
- SetData({}, mime_type);
- }
- }
+ read_clipboard_closure_ = std::move(callback);
+ auto* clipboard = GetClipboard(buffer);
+ if (!clipboard || !clipboard->Read(mime_type))
+ SetData({}, mime_type);
}
bool WaylandClipboard::IsSelectionOwner(ClipboardBuffer buffer) {
- if (buffer == ClipboardBuffer::kCopyPaste)
- return !!clipboard_data_source_;
- else
- return !!primary_data_source_;
+ if (auto* clipboard = GetClipboard(buffer))
+ return clipboard->IsSelectionOwner();
+ return false;
}
void WaylandClipboard::SetSequenceNumberUpdateCb(
@@ -92,26 +177,10 @@ void WaylandClipboard::SetSequenceNumberUpdateCb(
void WaylandClipboard::GetAvailableMimeTypes(
ClipboardBuffer buffer,
PlatformClipboard::GetMimeTypesClosure callback) {
- if (buffer == ClipboardBuffer::kCopyPaste) {
- std::move(callback).Run(data_device_->GetAvailableMimeTypes());
- } else {
- std::move(callback).Run(
- IsPrimarySelectionSupported()
- ? primary_selection_device_->GetAvailableMimeTypes()
- : std::vector<std::string>{});
- }
-}
-
-void WaylandClipboard::DataSourceCancelled(ClipboardBuffer buffer) {
- if (buffer == ClipboardBuffer::kCopyPaste) {
- DCHECK(clipboard_data_source_);
- SetData({}, {});
- clipboard_data_source_.reset();
- } else {
- DCHECK(primary_data_source_);
- SetData({}, {});
- primary_data_source_.reset();
- }
+ std::vector<std::string> mime_types;
+ if (auto* clipboard = GetClipboard(buffer))
+ mime_types = clipboard->ReadMimeTypes();
+ std::move(callback).Run(mime_types);
}
void WaylandClipboard::SetData(const std::vector<uint8_t>& contents,
@@ -134,8 +203,24 @@ void WaylandClipboard::UpdateSequenceNumber(ClipboardBuffer buffer) {
update_sequence_cb_.Run(buffer);
}
-bool WaylandClipboard::IsPrimarySelectionSupported() const {
- return primary_selection_device_manager_ && primary_selection_device_;
+wl::Clipboard* WaylandClipboard::GetClipboard(ClipboardBuffer buffer) {
+ if (buffer == ClipboardBuffer::kCopyPaste)
+ return copypaste_clipboard_.get();
+
+ if (buffer == ClipboardBuffer::kSelection) {
+ if (auto* manager = connection_->primary_selection_device_manager()) {
+ if (!primary_selection_clipboard_) {
+ primary_selection_clipboard_ = std::make_unique<
+ wl::ClipboardImpl<GtkPrimarySelectionDeviceManager>>(manager);
+ }
+ return primary_selection_clipboard_.get();
+ }
+ // Primary selection extension not available.
+ return nullptr;
+ }
+
+ NOTREACHED() << "Unsupported clipboard buffer: " << static_cast<int>(buffer);
+ return nullptr;
}
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.h b/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.h
index a4482490071..d4641406e0c 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.h
@@ -5,33 +5,36 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_CLIPBOARD_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_CLIPBOARD_H_
+#include <memory>
#include <string>
#include <vector>
#include "base/callback.h"
+#include "base/containers/flat_map.h"
#include "base/macros.h"
-#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
+#include "base/optional.h"
+#include "ui/base/clipboard/clipboard_buffer.h"
#include "ui/ozone/public/platform_clipboard.h"
+namespace wl {
+class Clipboard;
+} // namespace wl
+
namespace ui {
-class GtkPrimarySelectionDevice;
-class GtkPrimarySelectionDeviceManager;
-class GtkPrimarySelectionSource;
-class WaylandDataDevice;
+class WaylandConnection;
class WaylandDataDeviceManager;
// Handles clipboard operations.
//
-// Owned by WaylandConnection, which provides a data device and a data device
-// manager.
+// WaylandDataDeviceManager singleton is required to be up and running for
+// WaylandClipboard to be minimally functional.
class WaylandClipboard : public PlatformClipboard {
public:
- WaylandClipboard(
- WaylandDataDeviceManager* data_device_manager,
- WaylandDataDevice* data_device,
- GtkPrimarySelectionDeviceManager* primary_selection_device_manager,
- GtkPrimarySelectionDevice* primary_selection_device);
+ WaylandClipboard(WaylandConnection* connection,
+ WaylandDataDeviceManager* device_manager);
+ WaylandClipboard(const WaylandClipboard&) = delete;
+ WaylandClipboard& operator=(const WaylandClipboard&) = delete;
~WaylandClipboard() override;
// PlatformClipboard.
@@ -51,35 +54,34 @@ class WaylandClipboard : public PlatformClipboard {
void SetSequenceNumberUpdateCb(
PlatformClipboard::SequenceNumberUpdateCb cb) override;
- void DataSourceCancelled(ClipboardBuffer buffer);
+ // TODO(nickdiego): Get rid of these methods once DataDevice implementations
+ // are decoupled from WaylandClipboard.
void SetData(const std::vector<uint8_t>& contents,
const std::string& mime_type);
void UpdateSequenceNumber(ClipboardBuffer buffer);
private:
- bool IsPrimarySelectionSupported() const;
+ // Get the wl::Clipboard instance owning a given |buffer|. Can return null in
+ // case |buffer| is unsupported. E.g: primary selection is not available.
+ wl::Clipboard* GetClipboard(ClipboardBuffer buffer);
+
+ // WaylandConnection providing optional data device managers, e.g: gtk
+ // primary selection.
+ WaylandConnection* const connection_;
// Holds a temporary instance of the client's clipboard content
// so that we can asynchronously write to it.
PlatformClipboard::DataMap* data_map_ = nullptr;
- // Notifies whenever clipboard sequence number is changed. Can be empty if not
- // set.
+ // Notifies whenever clipboard sequence number is changed. Can be empty if
+ // not set.
PlatformClipboard::SequenceNumberUpdateCb update_sequence_cb_;
// Stores the callback to be invoked upon data reading from clipboard.
PlatformClipboard::RequestDataClosure read_clipboard_closure_;
- std::unique_ptr<WaylandDataSource> clipboard_data_source_;
- std::unique_ptr<GtkPrimarySelectionSource> primary_data_source_;
-
- // These four instances are owned by the connection.
- WaylandDataDeviceManager* const data_device_manager_;
- WaylandDataDevice* const data_device_;
- GtkPrimarySelectionDeviceManager* const primary_selection_device_manager_;
- GtkPrimarySelectionDevice* const primary_selection_device_;
-
- DISALLOW_COPY_AND_ASSIGN(WaylandClipboard);
+ const std::unique_ptr<wl::Clipboard> copypaste_clipboard_;
+ std::unique_ptr<wl::Clipboard> primary_selection_clipboard_;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_connection.cc b/chromium/ui/ozone/platform/wayland/host/wayland_connection.cc
index d6c27854df9..0246bc58695 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_connection.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_connection.cc
@@ -9,7 +9,7 @@
#include <algorithm>
#include <memory>
-#include <utility>
+#include <vector>
#include "base/bind.h"
#include "base/logging.h"
@@ -17,12 +17,16 @@
#include "base/message_loop/message_loop_current.h"
#include "base/strings/string_util.h"
#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/system/platform_handle.h"
#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
-#include "ui/gfx/swap_result.h"
+#include "ui/gfx/geometry/point.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
+#include "ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.h"
#include "ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h"
+#include "ui/ozone/platform/wayland/host/wayland_clipboard.h"
#include "ui/ozone/platform/wayland/host/wayland_cursor.h"
+#include "ui/ozone/platform/wayland/host/wayland_cursor_position.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_device_manager.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_drag_controller.h"
#include "ui/ozone/platform/wayland/host/wayland_drm.h"
#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
#include "ui/ozone/platform/wayland/host/wayland_input_method_context.h"
@@ -32,6 +36,7 @@
#include "ui/ozone/platform/wayland/host/wayland_shm.h"
#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_zwp_linux_dmabuf.h"
namespace ui {
@@ -39,6 +44,7 @@ namespace ui {
namespace {
constexpr uint32_t kMaxCompositorVersion = 4;
constexpr uint32_t kMaxGtkPrimarySelectionDeviceManagerVersion = 1;
+constexpr uint32_t kMaxKeyboardExtensionVersion = 1;
constexpr uint32_t kMaxLinuxDmabufVersion = 3;
constexpr uint32_t kMaxSeatVersion = 4;
constexpr uint32_t kMaxShmVersion = 1;
@@ -128,39 +134,10 @@ void WaylandConnection::SetCursorBitmap(const std::vector<SkBitmap>& bitmaps,
cursor_->UpdateBitmap(bitmaps, location, serial_);
}
-void WaylandConnection::StartDrag(const ui::OSExchangeData& data,
- int operation) {
- if (!dragdrop_data_source_)
- dragdrop_data_source_ = data_device_manager_->CreateSource();
- dragdrop_data_source_->Offer(data);
- dragdrop_data_source_->SetAction(operation);
- data_device_->StartDrag(dragdrop_data_source_->data_source(), data);
-}
-
-void WaylandConnection::FinishDragSession(uint32_t dnd_action,
- WaylandWindow* source_window) {
- if (source_window)
- source_window->OnDragSessionClose(dnd_action);
- data_device_->ResetSourceData();
- dragdrop_data_source_.reset();
-}
-
-void WaylandConnection::DeliverDragData(const std::string& mime_type,
- std::string* buffer) {
- data_device_->DeliverDragData(mime_type, buffer);
-}
-
-void WaylandConnection::RequestDragData(
- const std::string& mime_type,
- base::OnceCallback<void(const std::vector<uint8_t>&)> callback) {
- data_device_->RequestDragData(mime_type, std::move(callback));
-}
-
-bool WaylandConnection::IsDragInProgress() {
- // |data_device_| can be null when running on headless weston.
- if (!data_device_)
- return false;
- return data_device_->IsDragEntered() || drag_data_source();
+bool WaylandConnection::IsDragInProgress() const {
+ // |data_drag_controller_| can be null when running on headless weston.
+ return data_drag_controller_ && data_drag_controller_->state() !=
+ WaylandDataDragController::State::kIdle;
}
void WaylandConnection::Flush() {
@@ -190,13 +167,8 @@ void WaylandConnection::UpdateInputDevices(wl_seat* seat,
if (!has_keyboard) {
keyboard_.reset();
- } else if (wl_keyboard* keyboard = wl_seat_get_keyboard(seat)) {
- auto* layout_engine =
- KeyboardLayoutEngineManager::GetKeyboardLayoutEngine();
- keyboard_ = std::make_unique<WaylandKeyboard>(keyboard, this, layout_engine,
- event_source());
- } else {
- LOG(ERROR) << "Failed to get wl_keyboard from seat";
+ } else if (!CreateKeyboard()) {
+ LOG(ERROR) << "Failed to create WaylandKeyboard";
}
if (!has_touch) {
@@ -208,21 +180,34 @@ void WaylandConnection::UpdateInputDevices(wl_seat* seat,
}
}
-void WaylandConnection::EnsureDataDevice() {
- if (!data_device_manager_ || !seat_)
- return;
- DCHECK(!data_device_);
- wl_data_device* data_device = data_device_manager_->GetDevice();
- data_device_ = std::make_unique<WaylandDataDevice>(this, data_device);
+bool WaylandConnection::CreateKeyboard() {
+ wl_keyboard* keyboard = wl_seat_get_keyboard(seat_.get());
+ if (!keyboard)
+ return false;
- if (primary_selection_device_manager_) {
- primary_selection_device_ = std::make_unique<GtkPrimarySelectionDevice>(
- this, primary_selection_device_manager_->GetDevice());
- }
+ auto* layout_engine = KeyboardLayoutEngineManager::GetKeyboardLayoutEngine();
+ // Make sure to destroy the old WaylandKeyboard (if it exists) before creating
+ // the new one.
+ keyboard_.reset();
+ keyboard_.reset(new WaylandKeyboard(keyboard, keyboard_extension_v1_.get(),
+ this, layout_engine, event_source()));
+ return true;
+}
- clipboard_ = std::make_unique<WaylandClipboard>(
- data_device_manager_.get(), data_device_.get(),
- primary_selection_device_manager_.get(), primary_selection_device_.get());
+void WaylandConnection::CreateDataObjectsIfReady() {
+ if (data_device_manager_ && seat_) {
+ DCHECK(!data_drag_controller_);
+ data_drag_controller_ = std::make_unique<WaylandDataDragController>(
+ this, data_device_manager_.get());
+
+ DCHECK(!window_drag_controller_);
+ window_drag_controller_ = std::make_unique<WaylandWindowDragController>(
+ this, data_device_manager_.get(), event_source());
+
+ DCHECK(!clipboard_);
+ clipboard_ =
+ std::make_unique<WaylandClipboard>(this, data_device_manager_.get());
+ }
}
// static
@@ -268,7 +253,7 @@ void WaylandConnection::Global(void* data,
return;
}
wl_seat_add_listener(connection->seat_.get(), &seat_listener, connection);
- connection->EnsureDataDevice();
+ connection->CreateDataObjectsIfReady();
} else if (!connection->shell_v6_ &&
strcmp(interface, "zxdg_shell_v6") == 0) {
// Check for zxdg_shell_v6 first.
@@ -323,7 +308,7 @@ void WaylandConnection::Global(void* data,
connection->data_device_manager_ =
std::make_unique<WaylandDataDeviceManager>(
data_device_manager.release(), connection);
- connection->EnsureDataDevice();
+ connection->CreateDataObjectsIfReady();
} else if (!connection->primary_selection_device_manager_ &&
strcmp(interface, "gtk_primary_selection_device_manager") == 0) {
wl::Object<gtk_primary_selection_device_manager> manager =
@@ -343,6 +328,17 @@ void WaylandConnection::Global(void* data,
(strcmp(interface, "wp_presentation") == 0)) {
connection->presentation_ =
wl::Bind<wp_presentation>(registry, name, kMaxWpPresentationVersion);
+ } else if (!connection->keyboard_extension_v1_ &&
+ strcmp(interface, "zcr_keyboard_extension_v1") == 0) {
+ connection->keyboard_extension_v1_ = wl::Bind<zcr_keyboard_extension_v1>(
+ registry, name, kMaxKeyboardExtensionVersion);
+ if (!connection->keyboard_extension_v1_) {
+ LOG(ERROR) << "Failed to bind zcr_keyboard_extension_v1";
+ return;
+ }
+ // CreateKeyboard may fail if we do not have keyboard seat capabilities yet.
+ // We will create the keyboard when get them in that case.
+ connection->CreateKeyboard();
} else if (!connection->text_input_manager_v1_ &&
strcmp(interface, "zwp_text_input_manager_v1") == 0) {
connection->text_input_manager_v1_ = wl::Bind<zwp_text_input_manager_v1>(
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_connection.h b/chromium/ui/ozone/platform/wayland/host/wayland_connection.h
index b3e0a8a6c3d..5c5754dd2fa 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_connection.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_connection.h
@@ -6,21 +6,19 @@
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_CONNECTION_H_
#include <memory>
-#include <string>
#include <vector>
-#include "ui/gfx/buffer_types.h"
-#include "ui/gfx/native_widget_types.h"
+#include "third_party/skia/include/core/SkBitmap.h"
#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/wayland_clipboard.h"
-#include "ui/ozone/platform/wayland/host/wayland_cursor_position.h"
-#include "ui/ozone/platform/wayland/host/wayland_data_device.h"
-#include "ui/ozone/platform/wayland/host/wayland_data_device_manager.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_drag_controller.h"
#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
#include "ui/ozone/platform/wayland/host/wayland_window_manager.h"
+namespace gfx {
+class Point;
+}
+
namespace ui {
class WaylandBufferManagerHost;
@@ -32,8 +30,11 @@ class WaylandOutputManager;
class WaylandPointer;
class WaylandShm;
class WaylandTouch;
-class WaylandWindow;
class WaylandZwpLinuxDmabuf;
+class WaylandDataDeviceManager;
+class WaylandCursorPosition;
+class WaylandWindowDragController;
+class GtkPrimarySelectionDeviceManager;
class WaylandConnection {
public:
@@ -54,10 +55,6 @@ class WaylandConnection {
xdg_wm_base* shell() const { return shell_.get(); }
zxdg_shell_v6* shell_v6() const { return shell_v6_.get(); }
wl_seat* seat() const { return seat_.get(); }
- wl_data_device* data_device() const { return data_device_->data_device(); }
- gtk_primary_selection_device* primary_selection_device() const {
- return primary_selection_device_->data_device();
- }
wp_presentation* presentation() const { return presentation_.get(); }
zwp_text_input_manager_v1* text_input_manager_v1() const {
return text_input_manager_v1_.get();
@@ -82,10 +79,6 @@ class WaylandConnection {
WaylandClipboard* clipboard() const { return clipboard_.get(); }
- WaylandDataSource* drag_data_source() const {
- return dragdrop_data_source_.get();
- }
-
WaylandOutputManager* wayland_output_manager() const {
return wayland_output_manager_.get();
}
@@ -109,35 +102,36 @@ class WaylandConnection {
return &wayland_window_manager_;
}
- WaylandDataDevice* wayland_data_device() const { return data_device_.get(); }
-
- // Starts drag with |data| to be delivered, |operation| supported by the
- // source side initiated the dragging.
- void StartDrag(const ui::OSExchangeData& data, int operation);
- // Finishes drag and drop session. It happens when WaylandDataSource gets
- // 'OnDnDFinished' or 'OnCancel', which means the drop is performed or
- // canceled on others.
- void FinishDragSession(uint32_t dnd_action, WaylandWindow* source_window);
- // Delivers the data owned by Chromium which initiates drag-and-drop. |buffer|
- // is an output parameter and it should be filled with the data corresponding
- // to mime_type.
- void DeliverDragData(const std::string& mime_type, std::string* buffer);
- // Requests the data to the platform when Chromium gets drag-and-drop started
- // by others. Once reading the data from platform is done, |callback| should
- // be called with the data.
- void RequestDragData(
- const std::string& mime_type,
- base::OnceCallback<void(const std::vector<uint8_t>&)> callback);
+ WaylandDataDeviceManager* data_device_manager() const {
+ return data_device_manager_.get();
+ }
+
+ GtkPrimarySelectionDeviceManager* primary_selection_device_manager() const {
+ return primary_selection_device_manager_.get();
+ }
+
+ WaylandDataDragController* data_drag_controller() const {
+ return data_drag_controller_.get();
+ }
+
+ WaylandWindowDragController* window_drag_controller() const {
+ return window_drag_controller_.get();
+ }
// Returns true when dragging is entered or started.
- bool IsDragInProgress();
+ bool IsDragInProgress() const;
private:
void Flush();
void UpdateInputDevices(wl_seat* seat, uint32_t capabilities);
- // Make sure data device is properly initialized
- void EnsureDataDevice();
+ // Initialize data-related objects if required protocol objects are already
+ // in place, i.e: wl_seat and wl_data_device_manager.
+ void CreateDataObjectsIfReady();
+
+ // Creates WaylandKeyboard with the currently acquired protocol objects, if
+ // possible. Returns true iff WaylandKeyboard was created.
+ bool CreateKeyboard();
// wl_registry_listener
static void Global(void* data,
@@ -166,10 +160,11 @@ class WaylandConnection {
wl::Object<xdg_wm_base> shell_;
wl::Object<zxdg_shell_v6> shell_v6_;
wl::Object<wp_presentation> presentation_;
+ wl::Object<zcr_keyboard_extension_v1> keyboard_extension_v1_;
wl::Object<zwp_text_input_manager_v1> text_input_manager_v1_;
- // Event source instance. Must be declared before input objects so it outlives
- // them so thus being able to properly handle their destruction.
+ // Event source instance. Must be declared before input objects so it
+ // outlives them so thus being able to properly handle their destruction.
std::unique_ptr<WaylandEventSource> event_source_;
// Input device objects.
@@ -179,9 +174,7 @@ class WaylandConnection {
std::unique_ptr<WaylandCursor> cursor_;
std::unique_ptr<WaylandDataDeviceManager> data_device_manager_;
- std::unique_ptr<WaylandDataDevice> data_device_;
std::unique_ptr<WaylandClipboard> clipboard_;
- std::unique_ptr<WaylandDataSource> dragdrop_data_source_;
std::unique_ptr<WaylandOutputManager> wayland_output_manager_;
std::unique_ptr<WaylandCursorPosition> wayland_cursor_position_;
std::unique_ptr<WaylandZwpLinuxDmabuf> zwp_dmabuf_;
@@ -191,7 +184,9 @@ class WaylandConnection {
std::unique_ptr<GtkPrimarySelectionDeviceManager>
primary_selection_device_manager_;
- std::unique_ptr<GtkPrimarySelectionDevice> primary_selection_device_;
+
+ std::unique_ptr<WaylandDataDragController> data_drag_controller_;
+ std::unique_ptr<WaylandWindowDragController> window_drag_controller_;
// Manages Wayland windows.
WaylandWindowManager wayland_window_manager_;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_cursor.cc b/chromium/ui/ozone/platform/wayland/host/wayland_cursor.cc
index 0d495501f06..7ffd900fcae 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_cursor.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_cursor.cc
@@ -7,6 +7,7 @@
#include <memory>
#include <vector>
+#include "base/logging.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/skia_util.h"
#include "ui/ozone/platform/wayland/common/wayland_util.h"
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_device.cc b/chromium/ui/ozone/platform/wayland/host/wayland_data_device.cc
index 361ffa519f1..1edd356006b 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_device.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_device.cc
@@ -5,209 +5,62 @@
#include "ui/ozone/platform/wayland/host/wayland_data_device.h"
#include <memory>
+#include <string>
#include <utility>
-#include <vector>
#include "base/bind.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_split.h"
-#include "base/strings/utf_string_conversions.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "third_party/skia/include/core/SkCanvas.h"
-#include "ui/base/clipboard/clipboard_constants.h"
-#include "ui/base/dragdrop/drag_drop_types.h"
-#include "ui/base/dragdrop/file_info/file_info.h"
-#include "ui/base/dragdrop/os_exchange_data.h"
-#include "ui/base/dragdrop/os_exchange_data_provider_aura.h"
+#include "base/files/scoped_file.h"
+#include "ui/base/clipboard/clipboard_buffer.h"
+#include "ui/gfx/geometry/point_f.h"
+#include "ui/ozone/platform/wayland/common/data_util.h"
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/common/wayland_util.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
#include "ui/ozone/platform/wayland/host/wayland_data_offer.h"
-#include "ui/ozone/platform/wayland/host/wayland_shm_buffer.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
#include "ui/ozone/platform/wayland/host/wayland_window.h"
-#include "url/gurl.h"
-#include "url/url_canon.h"
-#include "url/url_util.h"
namespace ui {
-namespace {
-
-constexpr FilenameToURLPolicy kFilenameToURLPolicy = CONVERT_FILENAMES;
-
-// Converts raw data to either narrow or wide string.
-template <typename StringType>
-StringType BytesTo(const PlatformClipboard::Data& bytes) {
- if (bytes.size() % sizeof(typename StringType::value_type) != 0U) {
- // This is suspicious.
- LOG(WARNING)
- << "Data is possibly truncated, or a wrong conversion is requested.";
- }
-
- StringType result;
- result.assign(reinterpret_cast<typename StringType::const_pointer>(&bytes[0]),
- bytes.size() / sizeof(typename StringType::value_type));
- return result;
-}
-
-// Returns actions possible with the given source and drag'n'drop actions.
-// Also converts enums: input params are wl_data_device_manager_dnd_action but
-// the result is ui::DragDropTypes.
-int GetPossibleActions(uint32_t source_actions, uint32_t dnd_action) {
- // If drag'n'drop action is set, use it but check for ASK action (see below).
- uint32_t action = dnd_action != WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE
- ? dnd_action
- : source_actions;
-
- // We accept any action except ASK (see below).
- int operation = DragDropTypes::DRAG_NONE;
- if (action & WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY)
- operation |= DragDropTypes::DRAG_COPY;
- if (action & WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE)
- operation |= DragDropTypes::DRAG_MOVE;
- if (action & WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK) {
- // This is very rare and non-standard. Chromium doesn't set this when
- // anything is dragged from it, neither it provides any UI for asking
- // the user about the desired drag'n'drop action when data is dragged
- // from an external source.
- // We are safe with not adding anything here. However, keep NOTIMPLEMENTED
- // for an (unlikely) event of this being hit in distant future.
- NOTIMPLEMENTED_LOG_ONCE();
- }
- return operation;
-}
-
-void AddString(const PlatformClipboard::Data& data,
- OSExchangeData* os_exchange_data) {
- DCHECK(os_exchange_data);
-
- if (data.empty())
- return;
-
- os_exchange_data->SetString(base::UTF8ToUTF16(BytesTo<std::string>(data)));
-}
-
-void AddHtml(const PlatformClipboard::Data& data,
- OSExchangeData* os_exchange_data) {
- DCHECK(os_exchange_data);
-
- if (data.empty())
- return;
-
- os_exchange_data->SetHtml(base::UTF8ToUTF16(BytesTo<std::string>(data)),
- GURL());
-}
-
-// Parses |data| as if it had text/uri-list format. Its brief spec is:
-// 1. Any lines beginning with the '#' character are comment lines.
-// 2. Non-comment lines shall be URIs (URNs or URLs).
-// 3. Lines are terminated with a CRLF pair.
-// 4. URL encoding is used.
-void AddFiles(const PlatformClipboard::Data& data,
- OSExchangeData* os_exchange_data) {
- DCHECK(os_exchange_data);
-
- std::string data_as_string = BytesTo<std::string>(data);
-
- const auto lines = base::SplitString(
- data_as_string, "\r\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
- std::vector<FileInfo> filenames;
- for (const auto& line : lines) {
- if (line.empty() || line[0] == '#')
- continue;
- GURL url(line);
- if (!url.is_valid() || !url.SchemeIsFile()) {
- LOG(WARNING) << "Invalid URI found: " << line;
- continue;
- }
-
- std::string url_path = url.path();
- url::RawCanonOutputT<base::char16> unescaped;
- url::DecodeURLEscapeSequences(url_path.data(), url_path.size(),
- url::DecodeURLMode::kUTF8OrIsomorphic,
- &unescaped);
-
- std::string path8;
- base::UTF16ToUTF8(unescaped.data(), unescaped.length(), &path8);
- const base::FilePath path(path8);
- filenames.push_back({path, path.BaseName()});
- }
- if (filenames.empty())
- return;
-
- os_exchange_data->SetFilenames(filenames);
-}
-
-// Parses |data| as if it had text/x-moz-url format, which is basically
-// two lines separated with newline, where the first line is the URL and
-// the second one is page title. The unpleasant feature of text/x-moz-url is
-// that the URL has UTF-16 encoding.
-void AddUrl(const PlatformClipboard::Data& data,
- OSExchangeData* os_exchange_data) {
- DCHECK(os_exchange_data);
-
- if (data.empty())
- return;
-
- base::string16 data_as_string16 = BytesTo<base::string16>(data);
-
- const auto lines =
- base::SplitString(data_as_string16, base::ASCIIToUTF16("\r\n"),
- base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
- if (lines.size() != 2U) {
- LOG(WARNING) << "Invalid data passed as text/x-moz-url; it must contain "
- << "exactly 2 lines but has " << lines.size() << " instead.";
- return;
- }
- GURL url(lines[0]);
- if (!url.is_valid()) {
- LOG(WARNING) << "Invalid data passed as text/x-moz-url; the first line "
- << "must contain a valid URL but it doesn't.";
- return;
- }
-
- os_exchange_data->SetURL(url, lines[1]);
-}
-
-void AddToOSExchangeData(const PlatformClipboard::Data& data,
- const std::string& mime_type,
- OSExchangeData* os_exchange_data) {
- DCHECK(os_exchange_data);
- if ((mime_type == kMimeTypeText || mime_type == kMimeTypeTextUtf8)) {
- DCHECK(!os_exchange_data->HasString());
- AddString(data, os_exchange_data);
- } else if (mime_type == kMimeTypeHTML) {
- DCHECK(!os_exchange_data->HasHtml());
- AddHtml(data, os_exchange_data);
- } else if (mime_type == kMimeTypeMozillaURL) {
- DCHECK(!os_exchange_data->HasURL(kFilenameToURLPolicy));
- AddUrl(data, os_exchange_data);
- } else if (mime_type == kMimeTypeURIList) {
- DCHECK(!os_exchange_data->HasFile());
- AddFiles(data, os_exchange_data);
- } else {
- LOG(WARNING) << "Unhandled MIME type: " << mime_type;
- }
-}
-
-} // namespace
-
-// static
WaylandDataDevice::WaylandDataDevice(WaylandConnection* connection,
wl_data_device* data_device)
: WaylandDataDeviceBase(connection), data_device_(data_device) {
static const struct wl_data_device_listener kDataDeviceListener = {
- WaylandDataDevice::OnDataOffer, WaylandDataDevice::OnEnter,
- WaylandDataDevice::OnLeave, WaylandDataDevice::OnMotion,
- WaylandDataDevice::OnDrop, WaylandDataDevice::OnSelection};
+ WaylandDataDevice::OnOffer, WaylandDataDevice::OnEnter,
+ WaylandDataDevice::OnLeave, WaylandDataDevice::OnMotion,
+ WaylandDataDevice::OnDrop, WaylandDataDevice::OnSelection};
wl_data_device_add_listener(data_device_.get(), &kDataDeviceListener, this);
}
WaylandDataDevice::~WaylandDataDevice() = default;
-void WaylandDataDevice::RequestDragData(
- const std::string& mime_type,
- base::OnceCallback<void(const PlatformClipboard::Data&)> callback) {
- base::ScopedFD fd = drag_offer_->Receive(mime_type);
+void WaylandDataDevice::StartDrag(const WaylandDataSource& data_source,
+ const WaylandWindow& origin_window,
+ wl_surface* icon_surface,
+ DragDelegate* delegate) {
+ DCHECK(delegate);
+ DCHECK(!drag_delegate_);
+ drag_delegate_ = delegate;
+
+ wl_data_device_start_drag(data_device_.get(), data_source.data_source(),
+ origin_window.surface(), icon_surface,
+ connection()->serial());
+ drag_delegate_->DrawIcon();
+ connection()->ScheduleFlush();
+}
+
+void WaylandDataDevice::ResetDragDelegate() {
+ DCHECK(drag_delegate_);
+ drag_delegate_ = nullptr;
+}
+
+void WaylandDataDevice::RequestData(WaylandDataOffer* offer,
+ const std::string& mime_type,
+ RequestDataCallback callback) {
+ DCHECK(offer);
+ DCHECK(wl::IsMimeTypeSupported(mime_type));
+
+ base::ScopedFD fd = offer->Receive(mime_type);
if (!fd.is_valid()) {
LOG(ERROR) << "Failed to open file descriptor.";
return;
@@ -221,55 +74,13 @@ void WaylandDataDevice::RequestDragData(
RegisterDeferredReadCallback();
}
-void WaylandDataDevice::DeliverDragData(const std::string& mime_type,
- std::string* buffer) {
- DCHECK(buffer);
- DCHECK(source_data_);
-
- if (mime_type == kMimeTypeMozillaURL &&
- source_data_->HasURL(kFilenameToURLPolicy)) {
- GURL url;
- base::string16 title;
- source_data_->GetURLAndTitle(kFilenameToURLPolicy, &url, &title);
- buffer->append(url.spec());
- } else if (mime_type == kMimeTypeHTML && source_data_->HasHtml()) {
- base::string16 data;
- GURL base_url;
- source_data_->GetHtml(&data, &base_url);
- buffer->append(base::UTF16ToUTF8(data));
- } else if (source_data_->HasString()) {
- base::string16 data;
- source_data_->GetString(&data);
- buffer->append(base::UTF16ToUTF8(data));
- } else {
- LOG(WARNING) << "Cannot deliver data of type " << mime_type
- << " and no text representation is available.";
- }
-}
-
-void WaylandDataDevice::StartDrag(wl_data_source* data_source,
- const ui::OSExchangeData& data) {
- DCHECK(data_source);
-
- WaylandWindow* window =
- connection()->wayland_window_manager()->GetCurrentFocusedWindow();
- if (!window) {
- LOG(ERROR) << "Failed to get focused window.";
- return;
- }
- const SkBitmap* icon = PrepareDragIcon(data);
- source_data_ = std::make_unique<ui::OSExchangeData>(data.provider().Clone());
- wl_data_device_start_drag(data_device_.get(), data_source, window->surface(),
- icon_surface_.get(), connection()->serial());
- if (icon)
- DrawDragIcon(icon);
+void WaylandDataDevice::SetSelectionSource(WaylandDataSource* source) {
+ DCHECK(source);
+ wl_data_device_set_selection(data_device_.get(), source->data_source(),
+ connection()->serial());
connection()->ScheduleFlush();
}
-void WaylandDataDevice::ResetSourceData() {
- source_data_.reset();
-}
-
void WaylandDataDevice::ReadDragDataFromFD(
base::ScopedFD fd,
base::OnceCallback<void(const PlatformClipboard::Data&)> callback) {
@@ -278,17 +89,10 @@ void WaylandDataDevice::ReadDragDataFromFD(
std::move(callback).Run(contents);
}
-void WaylandDataDevice::HandleDeferredLeaveIfNeeded() {
- if (!is_leaving_)
- return;
-
- OnLeave(this, data_device_.get());
-}
-
// static
-void WaylandDataDevice::OnDataOffer(void* data,
- wl_data_device* data_device,
- wl_data_offer* offer) {
+void WaylandDataDevice::OnOffer(void* data,
+ wl_data_device* data_device,
+ wl_data_offer* offer) {
auto* self = static_cast<WaylandDataDevice*>(data);
self->connection()->clipboard()->UpdateSequenceNumber(
@@ -305,40 +109,24 @@ void WaylandDataDevice::OnEnter(void* data,
wl_fixed_t x,
wl_fixed_t y,
wl_data_offer* offer) {
- WaylandWindow* window =
- static_cast<WaylandWindow*>(wl_surface_get_user_data(surface));
+ WaylandWindow* window = WaylandWindow::FromSurface(surface);
if (!window) {
LOG(ERROR) << "Failed to get window.";
return;
}
auto* self = static_cast<WaylandDataDevice*>(data);
+
+ // Null |drag_delegate_| here means that the DND session has been initiated by
+ // an external application. In this case, use the default data drag delegate.
+ if (!self->drag_delegate_)
+ self->drag_delegate_ = self->connection()->data_drag_controller();
+
DCHECK(self->new_offer_);
- DCHECK(!self->drag_offer_);
- self->drag_offer_ = std::move(self->new_offer_);
- self->window_ = window;
-
- // TODO(crbug.com/1004715): Set mime type the client can accept. Now it sets
- // all mime types offered because current implementation doesn't decide
- // action based on mime type.
- self->unprocessed_mime_types_.clear();
- for (auto mime : self->drag_offer_->mime_types()) {
- self->unprocessed_mime_types_.push_back(mime);
- self->drag_offer_->Accept(serial, mime);
- }
+ self->drag_delegate_->OnDragOffer(std::move(self->new_offer_));
gfx::PointF point(wl_fixed_to_double(x), wl_fixed_to_double(y));
-
- // If |source_data_| is set, it means that dragging is started from the
- // same window and it's not needed to read data through Wayland.
- std::unique_ptr<OSExchangeData> dragged_data;
- if (!self->IsDraggingExternalData())
- dragged_data = std::make_unique<OSExchangeData>(
- self->source_data_->provider().Clone());
- self->window_->OnDragEnter(
- point, std::move(dragged_data),
- GetPossibleActions(self->drag_offer_->source_actions(),
- self->drag_offer_->dnd_action()));
+ self->drag_delegate_->OnDragEnter(window, point, serial);
}
void WaylandDataDevice::OnMotion(void* data,
@@ -347,65 +135,31 @@ void WaylandDataDevice::OnMotion(void* data,
wl_fixed_t x,
wl_fixed_t y) {
auto* self = static_cast<WaylandDataDevice*>(data);
- if (!self->window_) {
- LOG(ERROR) << "Failed to get window.";
- return;
+ if (self->drag_delegate_) {
+ gfx::PointF point(wl_fixed_to_double(x), wl_fixed_to_double(y));
+ self->drag_delegate_->OnDragMotion(point);
}
-
- gfx::PointF point(wl_fixed_to_double(x), wl_fixed_to_double(y));
- int client_operation = self->window_->OnDragMotion(
- point, time,
- GetPossibleActions(self->drag_offer_->source_actions(),
- self->drag_offer_->dnd_action()));
- self->SetOperation(client_operation);
}
void WaylandDataDevice::OnDrop(void* data, wl_data_device* data_device) {
auto* self = static_cast<WaylandDataDevice*>(data);
- if (!self->window_) {
- LOG(ERROR) << "Failed to get window.";
- return;
- }
- if (self->IsDraggingExternalData()) {
- // We are about to accept data dragged from another application.
- // Reading all the data may take some time so we set
- // |is_handling_dropped_data_| that will postpone handling of OnLeave
- // until reading is completed.
- self->is_handling_dropped_data_ = true;
- self->received_data_ = std::make_unique<OSExchangeData>(
- std::make_unique<OSExchangeDataProviderAura>());
- self->HandleUnprocessedMimeTypes();
- } else {
- // If the drag session had been started internally by chromium,
- // |source_data_| already holds the data, and it is already forwarded to the
- // delegate through OnDragEnter, so here we short-cut the data transfer by
- // sending nullptr.
- self->HandleReceivedData(nullptr);
- }
+ if (self->drag_delegate_)
+ self->drag_delegate_->OnDragDrop();
}
void WaylandDataDevice::OnLeave(void* data, wl_data_device* data_device) {
- // While reading data, it could get OnLeave event. We don't handle OnLeave
- // event directly if |is_handling_dropped_data_| is set.
auto* self = static_cast<WaylandDataDevice*>(data);
- if (!self->window_) {
- LOG(ERROR) << "Failed to get window.";
- return;
- }
+ if (self->drag_delegate_) {
+ self->drag_delegate_->OnDragLeave();
- if (self->is_handling_dropped_data_) {
- self->is_leaving_ = true;
- return;
+ // When in a DND session initiated by an external application,
+ // |drag_delegate_| is set at OnEnter, and must be reset here to avoid
+ // potential use-after-free.
+ if (!self->drag_delegate_->IsDragSource())
+ self->drag_delegate_ = nullptr;
}
-
- self->window_->OnDragLeave();
- self->window_ = nullptr;
- self->drag_offer_.reset();
- self->is_handling_dropped_data_ = false;
- self->is_leaving_ = false;
}
-// static
void WaylandDataDevice::OnSelection(void* data,
wl_data_device* data_device,
wl_data_offer* offer) {
@@ -428,106 +182,4 @@ void WaylandDataDevice::OnSelection(void* data,
self->data_offer()->EnsureTextMimeTypeIfNeeded();
}
-const SkBitmap* WaylandDataDevice::PrepareDragIcon(const OSExchangeData& data) {
- const SkBitmap* icon_bitmap = data.provider().GetDragImage().bitmap();
- if (!icon_bitmap || icon_bitmap->empty())
- return nullptr;
- icon_surface_.reset(wl_compositor_create_surface(connection()->compositor()));
- DCHECK(icon_surface_);
- return icon_bitmap;
-}
-
-void WaylandDataDevice::DrawDragIcon(const SkBitmap* icon_bitmap) {
- DCHECK(icon_bitmap);
- DCHECK(!icon_bitmap->empty());
- gfx::Size size(icon_bitmap->width(), icon_bitmap->height());
-
- if (!shm_buffer_ || shm_buffer_->size() != size) {
- shm_buffer_ = std::make_unique<WaylandShmBuffer>(connection()->shm(), size);
- if (!shm_buffer_->IsValid()) {
- LOG(ERROR) << "Failed to create drag icon buffer.";
- return;
- }
- }
- wl::DrawBitmap(*icon_bitmap, shm_buffer_.get());
-
- wl_surface* surface = icon_surface_.get();
- wl_surface_attach(surface, shm_buffer_->get(), 0, 0);
- wl_surface_damage(surface, 0, 0, size.width(), size.height());
- wl_surface_commit(surface);
-}
-
-void WaylandDataDevice::HandleUnprocessedMimeTypes() {
- std::string mime_type = SelectNextMimeType();
- if (mime_type.empty()) {
- HandleReceivedData(std::move(received_data_));
- } else {
- RequestDragData(mime_type,
- base::BindOnce(&WaylandDataDevice::OnDragDataReceived,
- base::Unretained(this)));
- }
-}
-
-void WaylandDataDevice::OnDragDataReceived(
- const PlatformClipboard::Data& contents) {
- if (!contents.empty()) {
- AddToOSExchangeData(contents, unprocessed_mime_types_.front(),
- received_data_.get());
- }
-
- unprocessed_mime_types_.pop_front();
-
- // Continue reading data for other negotiated mime types.
- HandleUnprocessedMimeTypes();
-}
-
-void WaylandDataDevice::HandleReceivedData(
- std::unique_ptr<ui::OSExchangeData> received_data) {
- unprocessed_mime_types_.clear();
-
- window_->OnDragDrop(std::move(received_data));
- drag_offer_->FinishOffer();
- is_handling_dropped_data_ = false;
- HandleDeferredLeaveIfNeeded();
-}
-
-std::string WaylandDataDevice::SelectNextMimeType() {
- while (!unprocessed_mime_types_.empty()) {
- const std::string& mime_type = unprocessed_mime_types_.front();
- if ((mime_type == kMimeTypeText || mime_type == kMimeTypeTextUtf8) &&
- !received_data_->HasString()) {
- return mime_type;
- }
- if (mime_type == kMimeTypeURIList && !received_data_->HasFile()) {
- return mime_type;
- }
- if (mime_type == kMimeTypeMozillaURL &&
- !received_data_->HasURL(kFilenameToURLPolicy)) {
- return mime_type;
- }
- if (mime_type == kMimeTypeHTML && !received_data_->HasHtml()) {
- return mime_type;
- }
- unprocessed_mime_types_.pop_front();
- }
- return {};
-}
-
-void WaylandDataDevice::SetOperation(const int operation) {
- uint32_t dnd_actions = WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE;
- uint32_t preferred_action = WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE;
-
- if (operation & DragDropTypes::DRAG_COPY) {
- dnd_actions |= WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY;
- preferred_action = WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY;
- }
-
- if (operation & DragDropTypes::DRAG_MOVE) {
- dnd_actions |= WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE;
- if (preferred_action == WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE)
- preferred_action = WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE;
- }
- drag_offer_->SetAction(dnd_actions, preferred_action);
-}
-
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_device.h b/chromium/ui/ozone/platform/wayland/host/wayland_data_device.h
index cf2e8cc7a65..5512f4c4480 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_device.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_device.h
@@ -7,73 +7,84 @@
#include <wayland-client.h>
-#include <list>
+#include <cstdint>
#include <memory>
#include <string>
#include "base/callback.h"
#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_device_base.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
#include "ui/ozone/public/platform_clipboard.h"
-class SkBitmap;
+namespace gfx {
+class PointF;
+} // namespace gfx
namespace ui {
-class OSExchangeData;
class WaylandDataOffer;
class WaylandConnection;
-class WaylandShmBuffer;
class WaylandWindow;
// This class provides access to inter-client data transfer mechanisms
// such as copy-and-paste and drag-and-drop mechanisms.
class WaylandDataDevice : public WaylandDataDeviceBase {
public:
+ using RequestDataCallback =
+ base::OnceCallback<void(const PlatformClipboard::Data&)>;
+
+ // DragDelegate is responsible for handling drag and drop sessions.
+ class DragDelegate {
+ public:
+ virtual bool IsDragSource() const = 0;
+ virtual void DrawIcon() = 0;
+ virtual void OnDragOffer(std::unique_ptr<WaylandDataOffer> offer) = 0;
+ virtual void OnDragEnter(WaylandWindow* window,
+ const gfx::PointF& location,
+ uint32_t serial) = 0;
+ virtual void OnDragMotion(const gfx::PointF& location) = 0;
+ virtual void OnDragLeave() = 0;
+ virtual void OnDragDrop() = 0;
+
+ protected:
+ virtual ~DragDelegate() = default;
+ };
+
WaylandDataDevice(WaylandConnection* connection, wl_data_device* data_device);
+ WaylandDataDevice(const WaylandDataDevice&) = delete;
+ WaylandDataDevice& operator=(const WaylandDataDevice&) = delete;
~WaylandDataDevice() override;
- // Requests the data to the platform when Chromium gets drag-and-drop started
- // by others. Once reading the data from platform is done, |callback| should
- // be called with the data.
- void RequestDragData(
- const std::string& mime_type,
- base::OnceCallback<void(const PlatformClipboard::Data&)> callback);
- // Delivers the data owned by Chromium which initiates drag-and-drop. |buffer|
- // is an output parameter and it should be filled with the data corresponding
- // to mime_type.
- void DeliverDragData(const std::string& mime_type, std::string* buffer);
- // Starts drag with |data| to be delivered, |operation| supported by the
- // source side initiated the dragging.
- void StartDrag(wl_data_source* data_source, const ui::OSExchangeData& data);
- // Resets |source_data_| when the dragging is finished.
- void ResetSourceData();
-
- wl_data_device* data_device() const { return data_device_.get(); }
+ // Starts a wayland drag and drop session, controlled by |delegate|.
+ void StartDrag(const WaylandDataSource& data_source,
+ const WaylandWindow& origin_window,
+ wl_surface* icon_surface,
+ DragDelegate* delegate);
- bool IsDragEntered() { return drag_offer_ != nullptr; }
+ // Reset the drag delegate, assuming there is one set. Any wl_data_device
+ // event received after this will be ignored until a new delegate is set.
+ void ResetDragDelegate();
- WaylandWindow* entered_window() const { return window_; }
+ // Requests data for an |offer| in a format specified by |mime_type|. The
+ // transfer happens asynchronously and |callback| is called when it is done.
+ void RequestData(WaylandDataOffer* offer,
+ const std::string& mime_type,
+ RequestDataCallback callback);
- private:
- void ReadDragDataFromFD(
- base::ScopedFD fd,
- base::OnceCallback<void(const PlatformClipboard::Data&)> callback);
+ // Returns the underlying wl_data_device singleton object.
+ wl_data_device* data_device() const { return data_device_.get(); }
- // If source_data_ is not set, data is being dragged from an external
- // application (non-chromium).
- bool IsDraggingExternalData() const { return !source_data_; }
+ void SetSelectionSource(WaylandDataSource* source);
- // If OnLeave event occurs while it's reading drag data, it defers handling
- // it. Once reading data is completed, it's handled.
- void HandleDeferredLeaveIfNeeded();
+ private:
+ void ReadDragDataFromFD(base::ScopedFD fd, RequestDataCallback callback);
// wl_data_device_listener callbacks
- static void OnDataOffer(void* data,
- wl_data_device* data_device,
- wl_data_offer* id);
+ static void OnOffer(void* data,
+ wl_data_device* data_device,
+ wl_data_offer* id);
static void OnEnter(void* data,
wl_data_device* data_device,
@@ -101,60 +112,18 @@ class WaylandDataDevice : public WaylandDataDeviceBase {
wl_data_device* data_device,
wl_data_offer* id);
- // Returns the drag icon bitmap and creates and wayland surface to draw it
- // on, if a valid drag image is present in |data|; otherwise returns null.
- const SkBitmap* PrepareDragIcon(const OSExchangeData& data);
- void DrawDragIcon(const SkBitmap* bitmap);
-
- void OnDragDataReceived(const PlatformClipboard::Data& contents);
-
- // HandleUnprocessedMimeTypes asynchronously request and read data for every
- // negotiated mime type, one after another (OnDragDataReceived calls back
- // HandleUnprocessedMimeTypes so it finish only when there's no more items in
- // unprocessed_mime_types_ vector). HandleReceivedData is called once the
- // process is finished.
- void HandleUnprocessedMimeTypes();
- void HandleReceivedData(std::unique_ptr<ui::OSExchangeData> received_data);
- // Returns the next MIME type to be received from the source process, or an
- // empty string if there are no more interesting MIME types left to process.
- std::string SelectNextMimeType();
-
- // Set drag operation decided by client.
- void SetOperation(const int operation);
-
// The wl_data_device wrapped by this WaylandDataDevice.
wl::Object<wl_data_device> data_device_;
+ DragDelegate* drag_delegate_ = nullptr;
+
// There are two separate data offers at a time, the drag offer and the
// selection offer, each with independent lifetimes. When we receive a new
- // offer, it is not immediately possible to know whether the new offer is the
- // drag offer or the selection offer. This variable is used to store ownership
- // of new data offers temporarily until its identity becomes known.
+ // offer, it is not immediately possible to know whether the new offer is
+ // the drag offer or the selection offer. This variable is used to store
+ // new data offers temporarily until it is possible to determine which kind
+ // session it belongs to.
std::unique_ptr<WaylandDataOffer> new_offer_;
-
- // Offer to receive data from another process via drag-and-drop, or null if no
- // drag-and-drop from another process is in progress.
- std::unique_ptr<WaylandDataOffer> drag_offer_;
-
- WaylandWindow* window_ = nullptr;
-
- bool is_handling_dropped_data_ = false;
- bool is_leaving_ = false;
-
- std::unique_ptr<WaylandShmBuffer> shm_buffer_;
- wl::Object<wl_surface> icon_surface_;
-
- // Mime types to be handled.
- std::list<std::string> unprocessed_mime_types_;
-
- // The data delivered from Wayland
- std::unique_ptr<ui::OSExchangeData> received_data_;
-
- // When dragging is started from Chromium, |source_data_| is forwarded to
- // Wayland when they are ready to get the data.
- std::unique_ptr<ui::OSExchangeData> source_data_;
-
- DISALLOW_COPY_AND_ASSIGN(WaylandDataDevice);
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_device_base.cc b/chromium/ui/ozone/platform/wayland/host/wayland_data_device_base.cc
index e61c9b53816..3e020a31134 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_device_base.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_device_base.cc
@@ -7,6 +7,7 @@
#include <utility>
#include "base/bind.h"
+#include "base/logging.h"
#include "ui/ozone/platform/wayland/common/wayland_util.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
@@ -64,7 +65,7 @@ void WaylandDataDeviceBase::RegisterDeferredReadCallback() {
deferred_read_callback_.reset(wl_display_sync(connection_->display()));
static const wl_callback_listener kListener = {
- GtkPrimarySelectionDevice::DeferredReadCallback};
+ WaylandDataDeviceBase::DeferredReadCallback};
wl_callback_add_listener(deferred_read_callback_.get(), &kListener, this);
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_device_base.h b/chromium/ui/ozone/platform/wayland/host/wayland_data_device_base.h
index 78abf99aec9..e331243fc5e 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_device_base.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_device_base.h
@@ -25,6 +25,7 @@ class WaylandDataDeviceBase {
// Returns MIME types given by the current data offer.
const std::vector<std::string>& GetAvailableMimeTypes() const;
+
// Extracts data of the specified MIME type from the data offer.
bool RequestSelectionData(const std::string& mime_type);
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_device_manager.cc b/chromium/ui/ozone/platform/wayland/host/wayland_data_device_manager.cc
index 5b4a79d7979..6c283794473 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_device_manager.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_device_manager.cc
@@ -4,7 +4,12 @@
#include "ui/ozone/platform/wayland/host/wayland_data_device_manager.h"
+#include <wayland-client-protocol.h>
+
+#include <memory>
+
#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_source.h"
namespace ui {
@@ -19,16 +24,23 @@ WaylandDataDeviceManager::WaylandDataDeviceManager(
WaylandDataDeviceManager::~WaylandDataDeviceManager() = default;
-wl_data_device* WaylandDataDeviceManager::GetDevice() {
+WaylandDataDevice* WaylandDataDeviceManager::GetDevice() {
DCHECK(connection_->seat());
- return wl_data_device_manager_get_data_device(device_manager_.get(),
- connection_->seat());
+ if (!device_) {
+ device_ = std::make_unique<WaylandDataDevice>(
+ connection_, wl_data_device_manager_get_data_device(
+ device_manager_.get(), connection_->seat()));
+ }
+ DCHECK(device_);
+ return device_.get();
}
-std::unique_ptr<WaylandDataSource> WaylandDataDeviceManager::CreateSource() {
+std::unique_ptr<WaylandDataSource> WaylandDataDeviceManager::CreateSource(
+ WaylandDataSource::Delegate* delegate) {
wl_data_source* data_source =
wl_data_device_manager_create_data_source(device_manager_.get());
- return std::make_unique<WaylandDataSource>(data_source, connection_);
+ return std::make_unique<WaylandDataSource>(data_source, connection_,
+ delegate);
}
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_device_manager.h b/chromium/ui/ozone/platform/wayland/host/wayland_data_device_manager.h
index ea37eee0ba3..7ed3a330ea3 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_device_manager.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_device_manager.h
@@ -5,33 +5,37 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_DATA_DEVICE_MANAGER_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_DATA_DEVICE_MANAGER_H_
-#include <wayland-client.h>
-
#include <memory>
-#include "base/macros.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
namespace ui {
class WaylandConnection;
-class WaylandDataSource;
+class WaylandDataDevice;
class WaylandDataDeviceManager {
public:
+ using DataSource = WaylandDataSource;
+ using DataDevice = WaylandDataDevice;
+
WaylandDataDeviceManager(wl_data_device_manager* device_manager,
WaylandConnection* connection);
+ WaylandDataDeviceManager(const WaylandDataDeviceManager&) = delete;
+ WaylandDataDeviceManager& operator=(const WaylandDataDeviceManager&) = delete;
~WaylandDataDeviceManager();
- wl_data_device* GetDevice();
- std::unique_ptr<WaylandDataSource> CreateSource();
+ WaylandDataDevice* GetDevice();
+ std::unique_ptr<WaylandDataSource> CreateSource(
+ WaylandDataSource::Delegate* delegate);
private:
wl::Object<wl_data_device_manager> device_manager_;
- WaylandConnection* connection_;
+ WaylandConnection* const connection_;
- DISALLOW_COPY_AND_ASSIGN(WaylandDataDeviceManager);
+ std::unique_ptr<WaylandDataDevice> device_;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_device_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_data_device_unittest.cc
index 9195d876030..b4bedb59ac9 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_device_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_device_unittest.cc
@@ -14,9 +14,6 @@
#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/clipboard/clipboard_constants.h"
-#include "ui/base/dragdrop/drag_drop_types.h"
-#include "ui/base/dragdrop/file_info/file_info.h"
-#include "ui/base/dragdrop/os_exchange_data.h"
#include "ui/events/base_event_utils.h"
#include "ui/ozone/platform/wayland/test/constants.h"
#include "ui/ozone/platform/wayland/test/mock_surface.h"
@@ -27,8 +24,6 @@
#include "ui/ozone/platform/wayland/test/test_wayland_server_thread.h"
#include "ui/ozone/platform/wayland/test/wayland_test.h"
#include "ui/ozone/public/platform_clipboard.h"
-#include "ui/platform_window/platform_window_handler/wm_drop_handler.h"
-#include "url/gurl.h"
using testing::_;
using testing::Mock;
@@ -37,8 +32,6 @@ namespace ui {
namespace {
-constexpr FilenameToURLPolicy kFilenameToURLPolicy = CONVERT_FILENAMES;
-
template <typename StringType>
ui::PlatformClipboard::Data ToClipboardData(const StringType& data_string) {
ui::PlatformClipboard::Data result;
@@ -52,39 +45,6 @@ ui::PlatformClipboard::Data ToClipboardData(const StringType& data_string) {
} // namespace
-class MockDropHandler : public WmDropHandler {
- public:
- MockDropHandler() = default;
- ~MockDropHandler() override {}
-
- MOCK_METHOD3(OnDragEnter,
- void(const gfx::PointF& point,
- std::unique_ptr<OSExchangeData> data,
- int operation));
- MOCK_METHOD2(OnDragMotion, int(const gfx::PointF& point, int operation));
- MOCK_METHOD0(MockOnDragDrop, void());
- MOCK_METHOD0(OnDragLeave, void());
-
- void SetOnDropClosure(base::RepeatingClosure closure) {
- on_drop_closure_ = closure;
- }
-
- ui::OSExchangeData* dropped_data() { return dropped_data_.get(); }
-
- protected:
- void OnDragDrop(std::unique_ptr<ui::OSExchangeData> data) override {
- dropped_data_ = std::move(data);
- MockOnDragDrop();
- on_drop_closure_.Run();
- on_drop_closure_.Reset();
- }
-
- private:
- base::RepeatingClosure on_drop_closure_;
-
- std::unique_ptr<ui::OSExchangeData> dropped_data_;
-};
-
// This class mocks how a real clipboard/ozone client would
// hook to PlatformClipboard, with one difference: real clients
// have no access to the WaylandConnection instance like this
@@ -143,15 +103,11 @@ class WaylandDataDeviceManagerTest : public WaylandTest {
clipboard_client_ =
std::make_unique<MockClipboardClient>(connection_.get());
-
- drop_handler_ = std::make_unique<MockDropHandler>();
- SetWmDropHandler(window_.get(), drop_handler_.get());
}
protected:
wl::TestDataDeviceManager* data_device_manager_;
std::unique_ptr<MockClipboardClient> clipboard_client_;
- std::unique_ptr<MockDropHandler> drop_handler_;
private:
DISALLOW_COPY_AND_ASSIGN(WaylandDataDeviceManagerTest);
@@ -231,255 +187,6 @@ TEST_P(WaylandDataDeviceManagerTest, IsSelectionOwner) {
ASSERT_FALSE(clipboard_client_->IsSelectionOwner());
}
-TEST_P(WaylandDataDeviceManagerTest, StartDrag) {
- bool restored_focus = window_->has_pointer_focus();
- window_->SetPointerFocus(true);
-
- // The client starts dragging.
- OSExchangeData os_exchange_data;
- int operation = DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_MOVE;
- connection_->StartDrag(os_exchange_data, operation);
-
- WaylandDataSource::DragDataMap data;
- data[wl::kTextMimeTypeUtf8] = wl::kSampleTextForDragAndDrop;
- connection_->drag_data_source()->SetDragData(data);
- Sync();
-
- // The server reads the data and the callback gets it.
- base::RunLoop run_loop;
- auto callback = base::BindOnce(
- [](base::RunLoop* loop, PlatformClipboard::Data&& data) {
- std::string result(data.begin(), data.end());
- EXPECT_EQ(wl::kSampleTextForDragAndDrop, result);
- loop->Quit();
- },
- &run_loop);
- data_device_manager_->data_source()->ReadData(wl::kTextMimeTypeUtf8,
- std::move(callback));
- run_loop.Run();
- window_->SetPointerFocus(restored_focus);
-}
-
-TEST_P(WaylandDataDeviceManagerTest, StartDragWithWrongMimeType) {
- bool restored_focus = window_->has_pointer_focus();
- window_->SetPointerFocus(true);
-
- // The client starts dragging offering data with wl::kTextMimeTypeUtf8
- // mime type.
- OSExchangeData os_exchange_data;
- int operation = DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_MOVE;
- connection_->StartDrag(os_exchange_data, operation);
-
- WaylandDataSource::DragDataMap data;
- data[wl::kTextMimeTypeUtf8] = wl::kSampleTextForDragAndDrop;
- connection_->drag_data_source()->SetDragData(data);
- Sync();
-
- // The server should get an empty data buffer in ReadData callback
- // when trying to read it.
- base::RunLoop run_loop;
- auto callback = base::BindOnce(
- [](base::RunLoop* loop, PlatformClipboard::Data&& data) {
- std::string result(data.begin(), data.end());
- EXPECT_EQ("", result);
- loop->Quit();
- },
- &run_loop);
- data_device_manager_->data_source()->ReadData(ui::kMimeTypeText,
- std::move(callback));
- run_loop.Run();
- window_->SetPointerFocus(restored_focus);
-}
-
-TEST_P(WaylandDataDeviceManagerTest, ReceiveDrag) {
- auto* data_offer = data_device_manager_->data_device()->OnDataOffer();
- data_offer->OnOffer(
- ui::kMimeTypeText,
- ToClipboardData(std::string(wl::kSampleTextForDragAndDrop)));
-
- gfx::Point entered_point(10, 10);
- // The server sends an enter event.
- data_device_manager_->data_device()->OnEnter(
- 1002, surface_->resource(), wl_fixed_from_int(entered_point.x()),
- wl_fixed_from_int(entered_point.y()), data_offer);
-
- int64_t time =
- (ui::EventTimeForNow() - base::TimeTicks()).InMilliseconds() & UINT32_MAX;
- gfx::Point motion_point(11, 11);
-
- // The server sends an motion event.
- data_device_manager_->data_device()->OnMotion(
- time, wl_fixed_from_int(motion_point.x()),
- wl_fixed_from_int(motion_point.y()));
-
- Sync();
-
- auto callback = base::BindOnce([](const PlatformClipboard::Data& contents) {
- std::string result;
- result.assign(reinterpret_cast<std::string::const_pointer>(&contents[0]),
- contents.size());
- EXPECT_EQ(wl::kSampleTextForDragAndDrop, result);
- });
-
- // The client requests the data and gets callback with it.
- connection_->RequestDragData(ui::kMimeTypeText, std::move(callback));
- Sync();
-
- data_device_manager_->data_device()->OnLeave();
-}
-
-TEST_P(WaylandDataDeviceManagerTest, DropSeveralMimeTypes) {
- auto* data_offer = data_device_manager_->data_device()->OnDataOffer();
- data_offer->OnOffer(
- ui::kMimeTypeText,
- ToClipboardData(std::string(wl::kSampleTextForDragAndDrop)));
- data_offer->OnOffer(
- ui::kMimeTypeMozillaURL,
- ToClipboardData(base::UTF8ToUTF16("https://sample.com/\r\n"
- "Sample")));
- data_offer->OnOffer(
- ui::kMimeTypeURIList,
- ToClipboardData(std::string("file:///home/user/file\r\n")));
-
- EXPECT_CALL(*drop_handler_, OnDragEnter(_, _, _)).Times(1);
- gfx::Point entered_point(10, 10);
- data_device_manager_->data_device()->OnEnter(
- 1002, surface_->resource(), wl_fixed_from_int(entered_point.x()),
- wl_fixed_from_int(entered_point.y()), data_offer);
- Sync();
- Mock::VerifyAndClearExpectations(drop_handler_.get());
-
- EXPECT_CALL(*drop_handler_, MockOnDragDrop()).Times(1);
- base::RunLoop loop;
- drop_handler_->SetOnDropClosure(loop.QuitClosure());
- data_device_manager_->data_device()->OnDrop();
-
- // Here we are expecting three data items, so there will be three roundtrips
- // to the Wayland and back. Hence Sync() three times.
- Sync();
- Sync();
- Sync();
- loop.Run();
- Mock::VerifyAndClearExpectations(drop_handler_.get());
-
- EXPECT_TRUE(drop_handler_->dropped_data()->HasString());
- EXPECT_TRUE(drop_handler_->dropped_data()->HasFile());
- EXPECT_TRUE(drop_handler_->dropped_data()->HasURL(kFilenameToURLPolicy));
-
- data_device_manager_->data_device()->OnLeave();
-}
-
-// Tests URI validation for text/uri-list MIME type. Log warnings rendered in
-// the console when this test is running are the expected and valid side effect.
-TEST_P(WaylandDataDeviceManagerTest, ValidateDroppedUriList) {
- const struct {
- std::string content;
- base::flat_set<std::string> expected_uris;
- } kCases[] = {{{}, {}},
- {"file:///home/user/file\r\n", {"/home/user/file"}},
- {"# Comment\r\n"
- "file:///home/user/file\r\n"
- "file:///home/guest/file\r\n"
- "not a filename at all\r\n"
- "https://valid.url/but/scheme/is/not/file/so/invalid\r\n",
- {"/home/user/file", "/home/guest/file"}}};
-
- for (const auto& kCase : kCases) {
- auto* data_offer = data_device_manager_->data_device()->OnDataOffer();
- data_offer->OnOffer(ui::kMimeTypeURIList, ToClipboardData(kCase.content));
-
- EXPECT_CALL(*drop_handler_, OnDragEnter(_, _, _)).Times(1);
- gfx::Point entered_point(10, 10);
- data_device_manager_->data_device()->OnEnter(
- 1002, surface_->resource(), wl_fixed_from_int(entered_point.x()),
- wl_fixed_from_int(entered_point.y()), data_offer);
- Sync();
- Mock::VerifyAndClearExpectations(drop_handler_.get());
-
- EXPECT_CALL(*drop_handler_, MockOnDragDrop()).Times(1);
- base::RunLoop loop;
- drop_handler_->SetOnDropClosure(loop.QuitClosure());
- data_device_manager_->data_device()->OnDrop();
-
- Sync();
- loop.Run();
- Mock::VerifyAndClearExpectations(drop_handler_.get());
-
- if (kCase.expected_uris.empty()) {
- EXPECT_FALSE(drop_handler_->dropped_data()->HasFile());
- } else {
- EXPECT_TRUE(drop_handler_->dropped_data()->HasFile());
- std::vector<FileInfo> filenames;
- EXPECT_TRUE(drop_handler_->dropped_data()->GetFilenames(&filenames));
- EXPECT_EQ(filenames.size(), kCase.expected_uris.size());
- for (const auto& filename : filenames)
- EXPECT_EQ(kCase.expected_uris.count(filename.path.AsUTF8Unsafe()), 1U);
- }
-
- EXPECT_CALL(*drop_handler_, OnDragLeave()).Times(1);
- data_device_manager_->data_device()->OnLeave();
- Sync();
- Mock::VerifyAndClearExpectations(drop_handler_.get());
- }
-}
-
-// Tests URI validation for text/x-moz-url MIME type. Log warnings rendered in
-// the console when this test is running are the expected and valid side effect.
-TEST_P(WaylandDataDeviceManagerTest, ValidateDroppedXMozUrl) {
- const struct {
- std::string content;
- std::string expected_url;
- std::string expected_title;
- } kCases[] = {
- {{}, {}, {}},
- {"http://sample.com/\r\nSample", "http://sample.com/", "Sample"},
- {"http://title.must.be.set/", {}, {}},
- {"url.must.be.valid/and/have.scheme\r\nInvalid URL", {}, {}},
- {"file:///files/are/ok\r\nThe policy allows that", "file:///files/are/ok",
- "The policy allows that"}};
-
- for (const auto& kCase : kCases) {
- auto* data_offer = data_device_manager_->data_device()->OnDataOffer();
- data_offer->OnOffer(ui::kMimeTypeMozillaURL,
- ToClipboardData(base::UTF8ToUTF16(kCase.content)));
-
- EXPECT_CALL(*drop_handler_, OnDragEnter(_, _, _)).Times(1);
- gfx::Point entered_point(10, 10);
- data_device_manager_->data_device()->OnEnter(
- 1002, surface_->resource(), wl_fixed_from_int(entered_point.x()),
- wl_fixed_from_int(entered_point.y()), data_offer);
- Sync();
- Mock::VerifyAndClearExpectations(drop_handler_.get());
-
- EXPECT_CALL(*drop_handler_, MockOnDragDrop()).Times(1);
- base::RunLoop loop;
- drop_handler_->SetOnDropClosure(loop.QuitClosure());
- data_device_manager_->data_device()->OnDrop();
-
- Sync();
- loop.Run();
- Mock::VerifyAndClearExpectations(drop_handler_.get());
-
- const auto* const dropped_data = drop_handler_->dropped_data();
- if (kCase.expected_url.empty()) {
- EXPECT_FALSE(dropped_data->HasURL(kFilenameToURLPolicy));
- } else {
- EXPECT_TRUE(dropped_data->HasURL(kFilenameToURLPolicy));
- GURL url;
- base::string16 title;
- EXPECT_TRUE(
- dropped_data->GetURLAndTitle(kFilenameToURLPolicy, &url, &title));
- EXPECT_EQ(url.spec(), kCase.expected_url);
- EXPECT_EQ(title, base::UTF8ToUTF16(kCase.expected_title));
- }
-
- EXPECT_CALL(*drop_handler_, OnDragLeave()).Times(1);
- data_device_manager_->data_device()->OnLeave();
- Sync();
- Mock::VerifyAndClearExpectations(drop_handler_.get());
- }
-}
-
INSTANTIATE_TEST_SUITE_P(XdgVersionStableTest,
WaylandDataDeviceManagerTest,
::testing::Values(kXdgShellStable));
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc b/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc
new file mode 100644
index 00000000000..ec14c3e3b7f
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc
@@ -0,0 +1,355 @@
+// 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_data_drag_controller.h"
+
+#include <wayland-client-protocol.h>
+
+#include <cstdint>
+
+#include "base/check.h"
+#include "base/notreached.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/base/clipboard/clipboard_constants.h"
+#include "ui/base/dragdrop/drag_drop_types.h"
+#include "ui/base/dragdrop/os_exchange_data.h"
+#include "ui/base/dragdrop/os_exchange_data_provider_non_backed.h"
+#include "ui/gfx/geometry/point_f.h"
+#include "ui/ozone/platform/wayland/common/data_util.h"
+#include "ui/ozone/platform/wayland/common/wayland_util.h"
+#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_device_manager.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_offer.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
+#include "ui/ozone/platform/wayland/host/wayland_shm_buffer.h"
+#include "ui/ozone/platform/wayland/host/wayland_window.h"
+#include "ui/ozone/platform/wayland/host/wayland_window_manager.h"
+
+namespace ui {
+
+namespace {
+
+// Returns actions possible with the given source and drag'n'drop actions.
+// Also converts enums: input params are wl_data_device_manager_dnd_action but
+// the result is ui::DragDropTypes.
+int GetPossibleActions(uint32_t source_actions, uint32_t dnd_action) {
+ // If drag'n'drop action is set, use it but check for ASK action (see below).
+ uint32_t action = dnd_action != WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE
+ ? dnd_action
+ : source_actions;
+
+ // We accept any action except ASK (see below).
+ int operation = DragDropTypes::DRAG_NONE;
+ if (action & WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY)
+ operation |= DragDropTypes::DRAG_COPY;
+ if (action & WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE)
+ operation |= DragDropTypes::DRAG_MOVE;
+ if (action & WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK) {
+ // This is very rare and non-standard. Chromium doesn't set this when
+ // anything is dragged from it, neither it provides any UI for asking
+ // the user about the desired drag'n'drop action when data is dragged
+ // from an external source.
+ // We are safe with not adding anything here. However, keep NOTIMPLEMENTED
+ // for an (unlikely) event of this being hit in distant future.
+ NOTIMPLEMENTED_LOG_ONCE();
+ }
+ return operation;
+}
+
+const SkBitmap* GetDragImage(const OSExchangeData& data) {
+ const SkBitmap* icon_bitmap = data.provider().GetDragImage().bitmap();
+ return icon_bitmap && !icon_bitmap->empty() ? icon_bitmap : nullptr;
+}
+
+} // namespace
+
+WaylandDataDragController::WaylandDataDragController(
+ WaylandConnection* connection,
+ WaylandDataDeviceManager* data_device_manager)
+ : connection_(connection),
+ data_device_manager_(data_device_manager),
+ data_device_(data_device_manager->GetDevice()),
+ window_manager_(connection->wayland_window_manager()) {
+ DCHECK(connection_);
+ DCHECK(window_manager_);
+ DCHECK(data_device_manager_);
+ DCHECK(data_device_);
+}
+
+WaylandDataDragController::~WaylandDataDragController() = default;
+
+void WaylandDataDragController::StartSession(const OSExchangeData& data,
+ int operation) {
+ DCHECK_EQ(state_, State::kIdle);
+ DCHECK(!origin_window_);
+
+ origin_window_ = window_manager_->GetCurrentFocusedWindow();
+ if (!origin_window_) {
+ LOG(ERROR) << "Failed to get focused window.";
+ return;
+ }
+
+ // Create new new data source and offers |data|.
+ if (!data_source_)
+ data_source_ = data_device_manager_->CreateSource(this);
+ Offer(data, operation);
+
+ // Create drag icon surface (if any) and store the data to be exchanged.
+ icon_surface_.reset(CreateIconSurfaceIfNeeded(data));
+ data_ = std::make_unique<OSExchangeData>(data.provider().Clone());
+
+ // Starts the wayland drag session setting |this| object as delegate.
+ state_ = State::kStarted;
+ data_device_->StartDrag(*data_source_, *origin_window_, icon_surface_.get(),
+ this);
+}
+
+// Sessions initiated from Chromium, will have |origin_window_| pointing to the
+// window where the drag started in. In such cases, |data_| is expected to be
+// non-null, which can be used to save some IO cycles.
+bool WaylandDataDragController::IsDragSource() const {
+ DCHECK(!origin_window_ || data_);
+ return !!origin_window_;
+}
+
+void WaylandDataDragController::DrawIcon() {
+ if (!icon_bitmap_)
+ return;
+
+ DCHECK(!icon_bitmap_->empty());
+ gfx::Size size(icon_bitmap_->width(), icon_bitmap_->height());
+
+ if (!shm_buffer_ || shm_buffer_->size() != size) {
+ shm_buffer_ = std::make_unique<WaylandShmBuffer>(connection_->shm(), size);
+ if (!shm_buffer_->IsValid()) {
+ LOG(ERROR) << "Failed to create drag icon buffer.";
+ return;
+ }
+ }
+ // TODO(crbug.com/1085418): Fix drag icon scaling
+ wl::DrawBitmap(*icon_bitmap_, shm_buffer_.get());
+ wl_surface_attach(icon_surface_.get(), shm_buffer_->get(), 0, 0);
+ wl_surface_damage(icon_surface_.get(), 0, 0, size.width(), size.height());
+ wl_surface_commit(icon_surface_.get());
+}
+
+void WaylandDataDragController::OnDragOffer(
+ std::unique_ptr<WaylandDataOffer> offer) {
+ DCHECK(!data_offer_);
+ data_offer_ = std::move(offer);
+}
+
+void WaylandDataDragController::OnDragEnter(WaylandWindow* window,
+ const gfx::PointF& location,
+ uint32_t serial) {
+ DCHECK(window);
+ window_ = window;
+
+ // TODO(crbug.com/1004715): Set mime type the client can accept. Now it sets
+ // all mime types offered because current implementation doesn't decide
+ // action based on mime type.
+ unprocessed_mime_types_.clear();
+ for (auto mime : data_offer_->mime_types()) {
+ unprocessed_mime_types_.push_back(mime);
+ data_offer_->Accept(serial, mime);
+ }
+
+ std::unique_ptr<OSExchangeData> dragged_data;
+ // If the DND session was initiated from a Chromium window, |data_| already
+ // holds the data to be exchanged, so no needed to read it through Wayland,
+ // thus just copy it here.
+ if (IsDragSource())
+ dragged_data = std::make_unique<OSExchangeData>(data_->provider().Clone());
+ window_->OnDragEnter(location, std::move(dragged_data),
+ GetPossibleActions(data_offer_->source_actions(),
+ data_offer_->dnd_action()));
+}
+
+void WaylandDataDragController::OnDragMotion(const gfx::PointF& location) {
+ if (!window_)
+ return;
+
+ int client_operation = window_->OnDragMotion(
+ location, GetPossibleActions(data_offer_->source_actions(),
+ data_offer_->dnd_action()));
+ SetOperation(client_operation);
+}
+
+void WaylandDataDragController::OnDragLeave() {
+ if (!window_)
+ return;
+
+ // Leave event can arrive while data is being transferred. As it cannot be
+ // handled right away, just mark it to be processed when the data is ready.
+ if (state_ == State::kTransferring) {
+ is_leave_pending_ = true;
+ return;
+ }
+
+ window_->OnDragLeave();
+ window_ = nullptr;
+ data_offer_.reset();
+ is_leave_pending_ = false;
+}
+
+void WaylandDataDragController::OnDragDrop() {
+ if (!window_)
+ return;
+
+ if (IsDragSource()) {
+ // This means the data is being exchanged between Chromium windows. In this
+ // case, data is supposed to have already been sent to the drop handler
+ // before (see OnDragEnter()), expecting to receive null at this stage.
+ OnDataTransferFinished(nullptr);
+ return;
+ }
+
+ // Otherwise, we are about to accept data dragged from another application.
+ // Reading the data may take some time so set |state_| to |kTrasfering|, which
+ // will make final "leave" event handling to be postponed until data is ready.
+ state_ = State::kTransferring;
+ received_data_ = std::make_unique<OSExchangeData>(
+ std::make_unique<OSExchangeDataProviderNonBacked>());
+ HandleUnprocessedMimeTypes();
+}
+
+void WaylandDataDragController::OnDataSourceFinish(bool completed) {
+ DCHECK(data_source_);
+ if (origin_window_)
+ origin_window_->OnDragSessionClose(data_source_->dnd_action());
+
+ origin_window_ = nullptr;
+ data_source_.reset();
+ data_offer_.reset();
+ data_.reset();
+ state_ = State::kIdle;
+}
+
+void WaylandDataDragController::OnDataSourceSend(const std::string& mime_type,
+ std::string* buffer) {
+ DCHECK(data_source_);
+ DCHECK(buffer);
+ DCHECK(data_);
+ if (!wl::ExtractOSExchangeData(*data_, mime_type, buffer)) {
+ LOG(WARNING) << "Cannot deliver data of type " << mime_type
+ << " and no text representation is available.";
+ }
+}
+
+void WaylandDataDragController::Offer(const OSExchangeData& data,
+ int operation) {
+ DCHECK(data_source_);
+
+ // Drag'n'drop manuals usually suggest putting data in order so the more
+ // specific a MIME type is, the earlier it occurs in the list. Wayland
+ // specs don't say anything like that, but here we follow that common
+ // practice: begin with URIs and end with plain text. Just in case.
+ std::vector<std::string> mime_types;
+ if (data.HasFile()) {
+ mime_types.push_back(kMimeTypeURIList);
+ }
+ if (data.HasURL(FilenameToURLPolicy::CONVERT_FILENAMES)) {
+ mime_types.push_back(kMimeTypeMozillaURL);
+ }
+ if (data.HasHtml()) {
+ mime_types.push_back(kMimeTypeHTML);
+ }
+ if (data.HasString()) {
+ mime_types.push_back(kMimeTypeTextUtf8);
+ mime_types.push_back(kMimeTypeText);
+ }
+
+ DCHECK(!mime_types.empty());
+ data_source_->Offer(mime_types);
+ data_source_->SetAction(operation);
+}
+
+wl_surface* WaylandDataDragController::CreateIconSurfaceIfNeeded(
+ const OSExchangeData& data) {
+ icon_bitmap_ = GetDragImage(data);
+ return icon_bitmap_ ? wl_compositor_create_surface(connection_->compositor())
+ : nullptr;
+}
+
+// Asynchronously requests and reads data for every negotiated/supported mime
+// type, one after another, OnMimeTypeDataTransferred calls back into this
+// function once it finishes reading data for each mime type, until there is no
+// more unprocessed mime types on the |unprocessed_mime_types_| queue. Once this
+// process is finished, OnDataTransferFinished is called to deliver the
+// |received_data_| to the drop handler.
+void WaylandDataDragController::HandleUnprocessedMimeTypes() {
+ DCHECK_EQ(state_, State::kTransferring);
+ std::string mime_type = GetNextUnprocessedMimeType();
+ if (mime_type.empty()) {
+ OnDataTransferFinished(std::move(received_data_));
+ } else {
+ DCHECK(data_offer_);
+ data_device_->RequestData(
+ data_offer_.get(), mime_type,
+ base::BindOnce(&WaylandDataDragController::OnMimeTypeDataTransferred,
+ weak_factory_.GetWeakPtr()));
+ }
+}
+
+void WaylandDataDragController::OnMimeTypeDataTransferred(
+ const PlatformClipboard::Data& contents) {
+ DCHECK_EQ(state_, State::kTransferring);
+ if (!contents.empty()) {
+ std::string mime_type = unprocessed_mime_types_.front();
+ wl::AddToOSExchangeData(contents, mime_type, received_data_.get());
+ }
+ unprocessed_mime_types_.pop_front();
+
+ // Continue reading data for other negotiated mime types.
+ HandleUnprocessedMimeTypes();
+}
+
+void WaylandDataDragController::OnDataTransferFinished(
+ std::unique_ptr<OSExchangeData> received_data) {
+ data_offer_->FinishOffer();
+ window_->OnDragDrop(std::move(received_data));
+
+ unprocessed_mime_types_.clear();
+ state_ = State::kIdle;
+
+ // If |is_leave_pending_| is set, it means a 'leave' event was fired while
+ // data was on transit, so process it here (See OnDragLeave for more context).
+ if (is_leave_pending_)
+ OnDragLeave();
+}
+
+// Returns the next MIME type to be received from the source process, or an
+// empty string if there are no more interesting MIME types left to process.
+std::string WaylandDataDragController::GetNextUnprocessedMimeType() {
+ while (!unprocessed_mime_types_.empty()) {
+ const std::string& mime_type = unprocessed_mime_types_.front();
+ // Skip unsupported or already processed mime types.
+ if (!wl::IsMimeTypeSupported(mime_type) ||
+ wl::ContainsMimeType(*received_data_, mime_type)) {
+ unprocessed_mime_types_.pop_front();
+ continue;
+ }
+ return mime_type;
+ }
+ return {};
+}
+
+void WaylandDataDragController::SetOperation(const int operation) {
+ uint32_t dnd_actions = WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE;
+ uint32_t preferred_action = WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE;
+
+ if (operation & DragDropTypes::DRAG_COPY) {
+ dnd_actions |= WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY;
+ preferred_action = WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY;
+ }
+
+ if (operation & DragDropTypes::DRAG_MOVE) {
+ dnd_actions |= WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE;
+ if (preferred_action == WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE)
+ preferred_action = WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE;
+ }
+ data_offer_->SetAction(dnd_actions, preferred_action);
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.h b/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.h
new file mode 100644
index 00000000000..2d1e1b09d6d
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.h
@@ -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.
+
+#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_DATA_DRAG_CONTROLLER_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_DATA_DRAG_CONTROLLER_H_
+
+#include <list>
+#include <memory>
+#include <string>
+
+#include "base/gtest_prod_util.h"
+#include "base/memory/weak_ptr.h"
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_device.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
+
+struct wl_surface;
+class SkBitmap;
+
+namespace ui {
+
+class OSExchangeData;
+class WaylandConnection;
+class WaylandDataDeviceManager;
+class WaylandDataOffer;
+class WaylandWindow;
+class WaylandWindowManager;
+class WaylandShmBuffer;
+
+// WaylandDataDragController implements regular data exchanging between Chromium
+// and other client applications on top of the Wayland Drag and Drop protocol.
+// By implementing both DataDevice::DragDelegate and DataSource::Delegate,
+// it is responsible for handling both DND sessions initiated from Chromium
+// windows as well as those triggered by other clients.
+class WaylandDataDragController : public WaylandDataDevice::DragDelegate,
+ public WaylandDataSource::Delegate {
+ public:
+ enum class State { kIdle, kStarted, kTransferring };
+
+ WaylandDataDragController(WaylandConnection* connection,
+ WaylandDataDeviceManager* data_device_manager);
+ WaylandDataDragController(const WaylandDataDragController&) = delete;
+ WaylandDataDragController& operator=(const WaylandDataDragController&) =
+ delete;
+ ~WaylandDataDragController() override;
+
+ // Starts a data drag and drop session for |data|. Only one DND session can
+ // run at a given time.
+ void StartSession(const ui::OSExchangeData& data, int operation);
+
+ State state() const { return state_; }
+
+ // TODO(crbug.com/896640): Remove once focus is fixed during DND sessions.
+ WaylandWindow* entered_window() const { return window_; }
+
+ private:
+ FRIEND_TEST_ALL_PREFIXES(WaylandDataDragControllerTest, ReceiveDrag);
+ FRIEND_TEST_ALL_PREFIXES(WaylandDataDragControllerTest, StartDrag);
+ FRIEND_TEST_ALL_PREFIXES(WaylandDataDragControllerTest, StartDragWithText);
+ FRIEND_TEST_ALL_PREFIXES(WaylandDataDragControllerTest,
+ StartDragWithWrongMimeType);
+
+ // WaylandDataDevice::DragDelegate:
+ bool IsDragSource() const override;
+ void DrawIcon() override;
+ void OnDragOffer(std::unique_ptr<WaylandDataOffer> offer) override;
+ void OnDragEnter(WaylandWindow* window,
+ const gfx::PointF& location,
+ uint32_t serial) override;
+ void OnDragMotion(const gfx::PointF& location) override;
+ void OnDragLeave() override;
+ void OnDragDrop() override;
+
+ // WaylandDataSource::Delegate:
+ void OnDataSourceFinish(bool completed) override;
+ void OnDataSourceSend(const std::string& mime_type,
+ std::string* contents) override;
+
+ void Offer(const OSExchangeData& data, int operation);
+ wl_surface* CreateIconSurfaceIfNeeded(const OSExchangeData& data);
+ void HandleUnprocessedMimeTypes();
+ void OnMimeTypeDataTransferred(const PlatformClipboard::Data& contents);
+ void OnDataTransferFinished(
+ std::unique_ptr<ui::OSExchangeData> received_data);
+ std::string GetNextUnprocessedMimeType();
+ void SetOperation(const int operation);
+
+ WaylandConnection* const connection_;
+ WaylandDataDeviceManager* const data_device_manager_;
+ WaylandDataDevice* const data_device_;
+ WaylandWindowManager* const window_manager_;
+
+ State state_ = State::kIdle;
+
+ std::unique_ptr<WaylandDataSource> data_source_;
+
+ // When dragging is started from Chromium, |data_| holds the data to be sent
+ // through wl_data_device instance.
+ std::unique_ptr<ui::OSExchangeData> data_;
+
+ // Offer to receive data from another process via drag-and-drop, or null if
+ // no drag-and-drop from another process is in progress.
+ //
+ // The data offer from another Wayland client through wl_data_device, that
+ // triggered the current drag and drop session. If null, either there is no
+ // dnd session running or Chromium is the data source.
+ std::unique_ptr<WaylandDataOffer> data_offer_;
+
+ // Mime types to be handled.
+ std::list<std::string> unprocessed_mime_types_;
+
+ // The window that initiated the drag session. Can be null when the session
+ // has been started by an external Wayland client.
+ WaylandWindow* origin_window_ = nullptr;
+
+ // Current window under pointer.
+ WaylandWindow* window_ = nullptr;
+
+ // The data delivered from Wayland
+ std::unique_ptr<ui::OSExchangeData> received_data_;
+
+ // Set when 'leave' event is fired while data is being transferred.
+ bool is_leave_pending_ = false;
+
+ // Drag icon related variables.
+ wl::Object<wl_surface> icon_surface_;
+ std::unique_ptr<WaylandShmBuffer> shm_buffer_;
+ const SkBitmap* icon_bitmap_ = nullptr;
+
+ base::WeakPtrFactory<WaylandDataDragController> weak_factory_{this};
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_DATA_DRAG_CONTROLLER_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc
new file mode 100644
index 00000000000..a320c70dd1d
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc
@@ -0,0 +1,406 @@
+// Copyright 2018 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 <wayland-server.h>
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/containers/flat_set.h"
+#include "base/strings/string16.h"
+#include "base/strings/utf_string_conversions.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/clipboard/clipboard_constants.h"
+#include "ui/base/dragdrop/drag_drop_types.h"
+#include "ui/base/dragdrop/file_info/file_info.h"
+#include "ui/base/dragdrop/os_exchange_data.h"
+#include "ui/events/base_event_utils.h"
+#include "ui/ozone/platform/wayland/common/data_util.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_device.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_device_manager.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_drag_controller.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
+#include "ui/ozone/platform/wayland/test/constants.h"
+#include "ui/ozone/platform/wayland/test/mock_surface.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"
+#include "ui/ozone/platform/wayland/test/test_data_source.h"
+#include "ui/ozone/platform/wayland/test/test_wayland_server_thread.h"
+#include "ui/ozone/platform/wayland/test/wayland_test.h"
+#include "ui/ozone/public/platform_clipboard.h"
+#include "ui/platform_window/platform_window_handler/wm_drop_handler.h"
+#include "url/gurl.h"
+
+using testing::_;
+using testing::Mock;
+
+namespace ui {
+
+namespace {
+
+constexpr FilenameToURLPolicy kFilenameToURLPolicy =
+ FilenameToURLPolicy::CONVERT_FILENAMES;
+
+template <typename StringType>
+PlatformClipboard::Data ToClipboardData(const StringType& data_string) {
+ PlatformClipboard::Data result;
+ auto* begin =
+ reinterpret_cast<typename PlatformClipboard::Data::const_pointer>(
+ data_string.data());
+ result.assign(begin, begin + (data_string.size() *
+ sizeof(typename StringType::value_type)));
+ return result;
+}
+
+} // namespace
+
+class MockDropHandler : public WmDropHandler {
+ public:
+ MockDropHandler() = default;
+ ~MockDropHandler() override = default;
+
+ MOCK_METHOD3(OnDragEnter,
+ void(const gfx::PointF& point,
+ std::unique_ptr<OSExchangeData> data,
+ int operation));
+ MOCK_METHOD2(OnDragMotion, int(const gfx::PointF& point, int operation));
+ MOCK_METHOD0(MockOnDragDrop, void());
+ MOCK_METHOD0(OnDragLeave, void());
+
+ void SetOnDropClosure(base::RepeatingClosure closure) {
+ on_drop_closure_ = closure;
+ }
+
+ OSExchangeData* dropped_data() { return dropped_data_.get(); }
+
+ protected:
+ void OnDragDrop(std::unique_ptr<OSExchangeData> data) override {
+ dropped_data_ = std::move(data);
+ MockOnDragDrop();
+ on_drop_closure_.Run();
+ on_drop_closure_.Reset();
+ }
+
+ private:
+ base::RepeatingClosure on_drop_closure_;
+
+ std::unique_ptr<OSExchangeData> dropped_data_;
+};
+
+class WaylandDataDragControllerTest : public WaylandTest {
+ public:
+ WaylandDataDragControllerTest() = default;
+
+ void SetUp() override {
+ WaylandTest::SetUp();
+
+ Sync();
+
+ data_device_manager_ = server_.data_device_manager();
+ DCHECK(data_device_manager_);
+
+ drop_handler_ = std::make_unique<MockDropHandler>();
+ SetWmDropHandler(window_.get(), drop_handler_.get());
+ }
+
+ WaylandDataDragController* drag_controller() const {
+ return connection_->data_drag_controller();
+ }
+
+ WaylandDataDevice* data_device() const {
+ return connection_->data_device_manager()->GetDevice();
+ }
+
+ base::string16 sample_text_for_dnd() const {
+ static auto text = base::ASCIIToUTF16(wl::kSampleTextForDragAndDrop);
+ return text;
+ }
+
+ protected:
+ wl::TestDataDeviceManager* data_device_manager_;
+ std::unique_ptr<MockDropHandler> drop_handler_;
+};
+
+TEST_P(WaylandDataDragControllerTest, StartDrag) {
+ bool restored_focus = window_->has_pointer_focus();
+ window_->SetPointerFocus(true);
+
+ // The client starts dragging.
+ OSExchangeData os_exchange_data;
+ os_exchange_data.SetString(sample_text_for_dnd());
+ int operation = DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_MOVE;
+ drag_controller()->StartSession(os_exchange_data, operation);
+ Sync();
+
+ // The server reads the data and the callback gets it.
+ base::RunLoop run_loop;
+ auto callback = base::BindOnce(
+ [](base::RunLoop* loop, PlatformClipboard::Data&& data) {
+ std::string result(data.begin(), data.end());
+ EXPECT_EQ(wl::kSampleTextForDragAndDrop, result);
+ loop->Quit();
+ },
+ &run_loop);
+ data_device_manager_->data_source()->ReadData(wl::kTextMimeTypeUtf8,
+ std::move(callback));
+ run_loop.Run();
+ window_->SetPointerFocus(restored_focus);
+}
+
+TEST_P(WaylandDataDragControllerTest, StartDragWithWrongMimeType) {
+ bool restored_focus = window_->has_pointer_focus();
+ window_->SetPointerFocus(true);
+
+ // The client starts dragging offering data with |kMimeTypeHTML|
+ OSExchangeData os_exchange_data;
+ os_exchange_data.SetHtml(sample_text_for_dnd(), {});
+ int operation = DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_MOVE;
+ drag_controller()->StartSession(os_exchange_data, operation);
+ Sync();
+
+ // The server should get an empty data buffer in ReadData callback when trying
+ // to read it with a different mime type.
+ base::RunLoop run_loop;
+ auto callback = base::BindOnce(
+ [](base::RunLoop* loop, PlatformClipboard::Data&& data) {
+ std::string result(data.begin(), data.end());
+ EXPECT_TRUE(result.empty());
+ loop->Quit();
+ },
+ &run_loop);
+ data_device_manager_->data_source()->ReadData(kMimeTypeText,
+ std::move(callback));
+ run_loop.Run();
+ window_->SetPointerFocus(restored_focus);
+}
+
+TEST_P(WaylandDataDragControllerTest, StartDragWithText) {
+ bool restored_focus = window_->has_pointer_focus();
+ window_->SetPointerFocus(true);
+
+ // The client starts dragging offering text mime type.
+ OSExchangeData os_exchange_data;
+ os_exchange_data.SetString(sample_text_for_dnd());
+ int operation = DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_MOVE;
+ drag_controller()->StartSession(os_exchange_data, operation);
+ Sync();
+
+ // The server should get a "text" representation in ReadData callback when
+ // trying to read it as mime type other than |kMimeTypeText| and
+ // |kTextMimeTypeUtf8|.
+ base::RunLoop run_loop;
+ auto callback = base::BindOnce(
+ [](base::RunLoop* loop, PlatformClipboard::Data&& data) {
+ std::string result(data.begin(), data.end());
+ EXPECT_EQ(wl::kSampleTextForDragAndDrop, result);
+ loop->Quit();
+ },
+ &run_loop);
+ data_device_manager_->data_source()->ReadData(kMimeTypeMozillaURL,
+ std::move(callback));
+ run_loop.Run();
+ window_->SetPointerFocus(restored_focus);
+}
+
+TEST_P(WaylandDataDragControllerTest, ReceiveDrag) {
+ auto* data_offer = data_device_manager_->data_device()->OnDataOffer();
+ data_offer->OnOffer(
+ kMimeTypeText,
+ ToClipboardData(std::string(wl::kSampleTextForDragAndDrop)));
+
+ gfx::Point entered_point(10, 10);
+ // The server sends an enter event.
+ data_device_manager_->data_device()->OnEnter(
+ 1002, surface_->resource(), wl_fixed_from_int(entered_point.x()),
+ wl_fixed_from_int(entered_point.y()), data_offer);
+
+ int64_t time =
+ (EventTimeForNow() - base::TimeTicks()).InMilliseconds() & UINT32_MAX;
+ gfx::Point motion_point(11, 11);
+
+ // The server sends an motion event.
+ data_device_manager_->data_device()->OnMotion(
+ time, wl_fixed_from_int(motion_point.x()),
+ wl_fixed_from_int(motion_point.y()));
+
+ Sync();
+
+ auto callback = base::BindOnce([](const PlatformClipboard::Data& contents) {
+ std::string result;
+ result.assign(reinterpret_cast<std::string::const_pointer>(&contents[0]),
+ contents.size());
+ EXPECT_EQ(wl::kSampleTextForDragAndDrop, result);
+ });
+
+ // The client requests the data and gets callback with it.
+ data_device()->RequestData(drag_controller()->data_offer_.get(),
+ kMimeTypeText, std::move(callback));
+ Sync();
+
+ data_device_manager_->data_device()->OnLeave();
+}
+
+TEST_P(WaylandDataDragControllerTest, DropSeveralMimeTypes) {
+ auto* data_offer = data_device_manager_->data_device()->OnDataOffer();
+ data_offer->OnOffer(
+ kMimeTypeText,
+ ToClipboardData(std::string(wl::kSampleTextForDragAndDrop)));
+ data_offer->OnOffer(kMimeTypeMozillaURL, ToClipboardData(base::UTF8ToUTF16(
+ "https://sample.com/\r\n"
+ "Sample")));
+ data_offer->OnOffer(
+ kMimeTypeURIList,
+ ToClipboardData(std::string("file:///home/user/file\r\n")));
+
+ EXPECT_CALL(*drop_handler_, OnDragEnter(_, _, _)).Times(1);
+ gfx::Point entered_point(10, 10);
+ data_device_manager_->data_device()->OnEnter(
+ 1002, surface_->resource(), wl_fixed_from_int(entered_point.x()),
+ wl_fixed_from_int(entered_point.y()), data_offer);
+ Sync();
+ Mock::VerifyAndClearExpectations(drop_handler_.get());
+
+ EXPECT_CALL(*drop_handler_, MockOnDragDrop()).Times(1);
+ base::RunLoop loop;
+ drop_handler_->SetOnDropClosure(loop.QuitClosure());
+ data_device_manager_->data_device()->OnDrop();
+
+ // Here we are expecting three data items, so there will be three roundtrips
+ // to the Wayland and back. Hence Sync() three times.
+ Sync();
+ Sync();
+ Sync();
+ loop.Run();
+ Mock::VerifyAndClearExpectations(drop_handler_.get());
+
+ EXPECT_TRUE(drop_handler_->dropped_data()->HasString());
+ EXPECT_TRUE(drop_handler_->dropped_data()->HasFile());
+ EXPECT_TRUE(drop_handler_->dropped_data()->HasURL(kFilenameToURLPolicy));
+
+ data_device_manager_->data_device()->OnLeave();
+}
+
+// Tests URI validation for text/uri-list MIME type. Log warnings rendered in
+// the console when this test is running are the expected and valid side effect.
+TEST_P(WaylandDataDragControllerTest, ValidateDroppedUriList) {
+ const struct {
+ std::string content;
+ base::flat_set<std::string> expected_uris;
+ } kCases[] = {{{}, {}},
+ {"file:///home/user/file\r\n", {"/home/user/file"}},
+ {"# Comment\r\n"
+ "file:///home/user/file\r\n"
+ "file:///home/guest/file\r\n"
+ "not a filename at all\r\n"
+ "https://valid.url/but/scheme/is/not/file/so/invalid\r\n",
+ {"/home/user/file", "/home/guest/file"}}};
+
+ for (const auto& kCase : kCases) {
+ auto* data_offer = data_device_manager_->data_device()->OnDataOffer();
+ data_offer->OnOffer(kMimeTypeURIList, ToClipboardData(kCase.content));
+
+ EXPECT_CALL(*drop_handler_, OnDragEnter(_, _, _)).Times(1);
+ gfx::Point entered_point(10, 10);
+ data_device_manager_->data_device()->OnEnter(
+ 1002, surface_->resource(), wl_fixed_from_int(entered_point.x()),
+ wl_fixed_from_int(entered_point.y()), data_offer);
+ Sync();
+ Mock::VerifyAndClearExpectations(drop_handler_.get());
+
+ EXPECT_CALL(*drop_handler_, MockOnDragDrop()).Times(1);
+ base::RunLoop loop;
+ drop_handler_->SetOnDropClosure(loop.QuitClosure());
+ data_device_manager_->data_device()->OnDrop();
+
+ Sync();
+ loop.Run();
+ Mock::VerifyAndClearExpectations(drop_handler_.get());
+
+ if (kCase.expected_uris.empty()) {
+ EXPECT_FALSE(drop_handler_->dropped_data()->HasFile());
+ } else {
+ EXPECT_TRUE(drop_handler_->dropped_data()->HasFile());
+ std::vector<FileInfo> filenames;
+ EXPECT_TRUE(drop_handler_->dropped_data()->GetFilenames(&filenames));
+ EXPECT_EQ(filenames.size(), kCase.expected_uris.size());
+ for (const auto& filename : filenames)
+ EXPECT_EQ(kCase.expected_uris.count(filename.path.AsUTF8Unsafe()), 1U);
+ }
+
+ EXPECT_CALL(*drop_handler_, OnDragLeave()).Times(1);
+ data_device_manager_->data_device()->OnLeave();
+ Sync();
+ Mock::VerifyAndClearExpectations(drop_handler_.get());
+ }
+}
+
+// Tests URI validation for text/x-moz-url MIME type. Log warnings rendered in
+// the console when this test is running are the expected and valid side effect.
+TEST_P(WaylandDataDragControllerTest, ValidateDroppedXMozUrl) {
+ const struct {
+ std::string content;
+ std::string expected_url;
+ std::string expected_title;
+ } kCases[] = {
+ {{}, {}, {}},
+ {"http://sample.com/\r\nSample", "http://sample.com/", "Sample"},
+ {"http://title.must.be.set/", {}, {}},
+ {"url.must.be.valid/and/have.scheme\r\nInvalid URL", {}, {}},
+ {"file:///files/are/ok\r\nThe policy allows that", "file:///files/are/ok",
+ "The policy allows that"}};
+
+ for (const auto& kCase : kCases) {
+ auto* data_offer = data_device_manager_->data_device()->OnDataOffer();
+ data_offer->OnOffer(kMimeTypeMozillaURL,
+ ToClipboardData(base::UTF8ToUTF16(kCase.content)));
+
+ EXPECT_CALL(*drop_handler_, OnDragEnter(_, _, _)).Times(1);
+ gfx::Point entered_point(10, 10);
+ data_device_manager_->data_device()->OnEnter(
+ 1002, surface_->resource(), wl_fixed_from_int(entered_point.x()),
+ wl_fixed_from_int(entered_point.y()), data_offer);
+ Sync();
+ Mock::VerifyAndClearExpectations(drop_handler_.get());
+
+ EXPECT_CALL(*drop_handler_, MockOnDragDrop()).Times(1);
+ base::RunLoop loop;
+ drop_handler_->SetOnDropClosure(loop.QuitClosure());
+ data_device_manager_->data_device()->OnDrop();
+
+ Sync();
+ loop.Run();
+ Mock::VerifyAndClearExpectations(drop_handler_.get());
+
+ const auto* const dropped_data = drop_handler_->dropped_data();
+ if (kCase.expected_url.empty()) {
+ EXPECT_FALSE(dropped_data->HasURL(kFilenameToURLPolicy));
+ } else {
+ EXPECT_TRUE(dropped_data->HasURL(kFilenameToURLPolicy));
+ GURL url;
+ base::string16 title;
+ EXPECT_TRUE(
+ dropped_data->GetURLAndTitle(kFilenameToURLPolicy, &url, &title));
+ EXPECT_EQ(url.spec(), kCase.expected_url);
+ EXPECT_EQ(title, base::UTF8ToUTF16(kCase.expected_title));
+ }
+
+ EXPECT_CALL(*drop_handler_, OnDragLeave()).Times(1);
+ data_device_manager_->data_device()->OnLeave();
+ Sync();
+ Mock::VerifyAndClearExpectations(drop_handler_.get());
+ }
+}
+
+INSTANTIATE_TEST_SUITE_P(XdgVersionStableTest,
+ WaylandDataDragControllerTest,
+ ::testing::Values(kXdgShellStable));
+
+INSTANTIATE_TEST_SUITE_P(XdgVersionV6Test,
+ WaylandDataDragControllerTest,
+ ::testing::Values(kXdgShellV6));
+
+} // namespace ui
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 0b92ceaeba7..1d66a9f74cb 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_source.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_source.cc
@@ -4,156 +4,148 @@
#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
+#include <gtk-primary-selection-client-protocol.h>
+#include <wayland-client-protocol.h>
+
+#include <cstdint>
#include <vector>
#include "base/files/file_util.h"
-#include "base/optional.h"
-#include "ui/base/clipboard/clipboard_constants.h"
#include "ui/base/dragdrop/drag_drop_types.h"
-#include "ui/base/dragdrop/os_exchange_data.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
-#include "ui/ozone/platform/wayland/host/wayland_window.h"
-namespace ui {
+namespace wl {
-WaylandDataSource::WaylandDataSource(wl_data_source* data_source,
- WaylandConnection* connection)
- : data_source_(data_source), connection_(connection) {
- static const struct wl_data_source_listener kDataSourceListener = {
- WaylandDataSource::OnTarget, WaylandDataSource::OnSend,
- WaylandDataSource::OnCancel, WaylandDataSource::OnDnDDropPerformed,
- WaylandDataSource::OnDnDFinished, WaylandDataSource::OnAction};
- wl_data_source_add_listener(data_source, &kDataSourceListener, this);
+template <typename T>
+DataSource<T>::DataSource(T* data_source,
+ ui::WaylandConnection* connection,
+ Delegate* delegate)
+ : data_source_(data_source), connection_(connection), delegate_(delegate) {
+ DCHECK(data_source_);
+ DCHECK(connection_);
+ DCHECK(delegate_);
+
+ Initialize();
}
-WaylandDataSource::~WaylandDataSource() = default;
+template <typename T>
+void DataSource<T>::HandleFinishEvent(bool completed) {
+ delegate_->OnDataSourceFinish(/*completed=*/false);
+}
-void WaylandDataSource::WriteToClipboard(
- const PlatformClipboard::DataMap& data_map) {
- for (const auto& data : data_map) {
- wl_data_source_offer(data_source_.get(), data.first.c_str());
- if (strcmp(data.first.c_str(), kMimeTypeText) == 0)
- wl_data_source_offer(data_source_.get(), kMimeTypeTextUtf8);
- }
- wl_data_device_set_selection(connection_->data_device(), data_source_.get(),
- connection_->serial());
+template <typename T>
+void DataSource<T>::HandleSendEvent(const std::string& mime_type, int32_t fd) {
+ std::string contents;
+ delegate_->OnDataSourceSend(mime_type, &contents);
+ bool done = base::WriteFileDescriptor(fd, contents.data(), contents.length());
+ DCHECK(done);
+ close(fd);
+}
- connection_->ScheduleFlush();
+// static
+template <typename T>
+void DataSource<T>::OnSend(void* data,
+ T* source,
+ const char* mime_type,
+ int32_t fd) {
+ auto* self = static_cast<DataSource<T>*>(data);
+ self->HandleSendEvent(mime_type, fd);
}
-void WaylandDataSource::Offer(const ui::OSExchangeData& data) {
- // Drag'n'drop manuals usually suggest putting data in order so the more
- // specific a MIME type is, the earlier it occurs in the list. Wayland specs
- // don't say anything like that, but here we follow that common practice:
- // begin with URIs and end with plain text. Just in case.
- std::vector<std::string> mime_types;
- if (data.HasFile()) {
- mime_types.push_back(kMimeTypeURIList);
- }
- if (data.HasURL(ui::CONVERT_FILENAMES)) {
- mime_types.push_back(kMimeTypeMozillaURL);
- }
- if (data.HasHtml()) {
- mime_types.push_back(kMimeTypeHTML);
- }
- if (data.HasString()) {
- mime_types.push_back(kMimeTypeTextUtf8);
- mime_types.push_back(kMimeTypeText);
- }
+template <typename T>
+void DataSource<T>::OnCancel(void* data, T* source) {
+ auto* self = static_cast<DataSource<T>*>(data);
+ self->HandleFinishEvent(/*completed=*/false);
+}
- source_window_ =
- connection_->wayland_window_manager()->GetCurrentFocusedWindow();
- for (auto& mime_type : mime_types)
- wl_data_source_offer(data_source_.get(), mime_type.data());
+template <typename T>
+void DataSource<T>::OnDnDFinished(void* data, T* source) {
+ auto* self = static_cast<DataSource<T>*>(data);
+ self->HandleFinishEvent(/*completed=*/true);
}
-void WaylandDataSource::SetDragData(const DragDataMap& data_map) {
- DCHECK(drag_data_map_.empty());
- drag_data_map_ = data_map;
+template <typename T>
+void DataSource<T>::OnAction(void* data, T* source, uint32_t dnd_action) {
+ auto* self = static_cast<DataSource<T>*>(data);
+ self->dnd_action_ = dnd_action;
}
-void WaylandDataSource::SetAction(int operation) {
- if (wl_data_source_get_version(data_source_.get()) >=
- WL_DATA_SOURCE_SET_ACTIONS_SINCE_VERSION) {
- uint32_t dnd_actions = WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE;
- if (operation & DragDropTypes::DRAG_COPY)
- dnd_actions |= WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY;
- if (operation & DragDropTypes::DRAG_MOVE)
- dnd_actions |= WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE;
- wl_data_source_set_actions(data_source_.get(), dnd_actions);
- }
+template <typename T>
+void DataSource<T>::OnTarget(void* data, T* source, const char* mime_type) {
+ NOTIMPLEMENTED_LOG_ONCE();
}
-// static
-void WaylandDataSource::OnTarget(void* data,
- wl_data_source* source,
- const char* mime_type) {
+template <typename T>
+void DataSource<T>::OnDnDDropPerformed(void* data, T* source) {
NOTIMPLEMENTED_LOG_ONCE();
}
-// static
-void WaylandDataSource::OnSend(void* data,
- wl_data_source* source,
- const char* mime_type,
- int32_t fd) {
- WaylandDataSource* self = static_cast<WaylandDataSource*>(data);
- std::string contents;
- if (self->source_window_) {
- // If |source_window_| is valid when OnSend() is called, it means that DnD
- // is working.
- self->GetDragData(mime_type, &contents);
- } else {
- base::Optional<std::vector<uint8_t>> mime_data;
- self->GetClipboardData(mime_type, &mime_data);
- if (!mime_data.has_value() && strcmp(mime_type, kMimeTypeTextUtf8) == 0)
- self->GetClipboardData(kMimeTypeText, &mime_data);
- contents.assign(mime_data->begin(), mime_data->end());
- }
- bool result =
- base::WriteFileDescriptor(fd, contents.data(), contents.length());
- DCHECK(result);
- close(fd);
+//////////////////////////////////////////////////////////////////////////////
+// wl_data_source specializations and instantiation
+//////////////////////////////////////////////////////////////////////////////
+
+template <>
+void DataSource<wl_data_source>::Initialize() {
+ static const struct wl_data_source_listener kDataSourceListener = {
+ DataSource<wl_data_source>::OnTarget,
+ DataSource<wl_data_source>::OnSend,
+ DataSource<wl_data_source>::OnCancel,
+ DataSource<wl_data_source>::OnDnDDropPerformed,
+ DataSource<wl_data_source>::OnDnDFinished,
+ DataSource<wl_data_source>::OnAction};
+ wl_data_source_add_listener(data_source_.get(), &kDataSourceListener, this);
}
-// static
-void WaylandDataSource::OnCancel(void* data, wl_data_source* source) {
- WaylandDataSource* self = static_cast<WaylandDataSource*>(data);
- if (self->source_window_) {
- // If it has |source_window_|, it is in the middle of 'drag and drop'. it
- // cancels 'drag and drop'.
- self->connection_->FinishDragSession(self->dnd_action_,
- self->source_window_);
- } else {
- self->connection_->clipboard()->DataSourceCancelled(
- ClipboardBuffer::kCopyPaste);
- }
+template <>
+void DataSource<wl_data_source>::Offer(
+ const std::vector<std::string>& mime_types) {
+ for (auto& mime_type : mime_types)
+ wl_data_source_offer(data_source_.get(), mime_type.c_str());
+ connection_->ScheduleFlush();
}
-void WaylandDataSource::OnDnDDropPerformed(void* data, wl_data_source* source) {
+template <typename T>
+void DataSource<T>::SetAction(int operation) {
NOTIMPLEMENTED_LOG_ONCE();
}
-void WaylandDataSource::OnDnDFinished(void* data, wl_data_source* source) {
- WaylandDataSource* self = static_cast<WaylandDataSource*>(data);
- self->connection_->FinishDragSession(self->dnd_action_, self->source_window_);
+template <>
+void DataSource<wl_data_source>::SetAction(int operation) {
+ if (wl_data_source_get_version(data_source_.get()) >=
+ WL_DATA_SOURCE_SET_ACTIONS_SINCE_VERSION) {
+ uint32_t dnd_actions = WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE;
+ if (operation & ui::DragDropTypes::DRAG_COPY)
+ dnd_actions |= WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY;
+ if (operation & ui::DragDropTypes::DRAG_MOVE)
+ dnd_actions |= WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE;
+ wl_data_source_set_actions(data_source_.get(), dnd_actions);
+ }
}
-void WaylandDataSource::OnAction(void* data,
- wl_data_source* source,
- uint32_t dnd_action) {
- WaylandDataSource* self = static_cast<WaylandDataSource*>(data);
- self->dnd_action_ = dnd_action;
-}
+template class DataSource<wl_data_source>;
-void WaylandDataSource::GetDragData(const std::string& mime_type,
- std::string* contents) {
- auto it = drag_data_map_.find(mime_type);
- if (it != drag_data_map_.end()) {
- *contents = it->second;
- return;
- }
+//////////////////////////////////////////////////////////////////////////////
+// gtk_primary_selection_source specializations and instantiation
+//////////////////////////////////////////////////////////////////////////////
+
+template <>
+void DataSource<gtk_primary_selection_source>::Initialize() {
+ static const struct gtk_primary_selection_source_listener
+ kDataSourceListener = {
+ DataSource<gtk_primary_selection_source>::OnSend,
+ DataSource<gtk_primary_selection_source>::OnCancel};
+ gtk_primary_selection_source_add_listener(data_source_.get(),
+ &kDataSourceListener, this);
+}
- connection_->DeliverDragData(mime_type, contents);
+template <>
+void DataSource<gtk_primary_selection_source>::Offer(
+ const std::vector<std::string>& mime_types) {
+ for (const auto& mime_type : mime_types)
+ gtk_primary_selection_source_offer(data_source_.get(), mime_type.c_str());
+ connection_->ScheduleFlush();
}
-} // namespace ui
+template class DataSource<gtk_primary_selection_source>;
+
+} // 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 4f66465a699..2bcee213cc5 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_source.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_source.h
@@ -5,76 +5,98 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_DATA_SOURCE_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_DATA_SOURCE_H_
-#include <wayland-client.h>
-
-#include <map>
+#include <cstdint>
#include <string>
+#include <vector>
-#include "base/logging.h"
#include "base/macros.h"
-#include "base/optional.h"
+#include "base/notreached.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
-#include "ui/ozone/platform/wayland/host/wayland_data_source_base.h"
-#include "ui/ozone/public/platform_clipboard.h"
+
+struct wl_data_source;
+struct gtk_primary_selection_source;
+
+namespace wl {
+template <typename T>
+class DataSource;
+} // namespace wl
namespace ui {
-class OSExchangeData;
class WaylandConnection;
-class WaylandWindow;
-
-// The WaylandDataSource object represents the source side of a
-// WaylandDataOffer. It is created by the source client in a data
-// transfer and provides a way to describe the offered data
-// (wl_data_source_offer) // and a way to respond to requests to
-// transfer the data (OnSend listener).
-class WaylandDataSource : public WaylandDataSourceBase {
- public:
- using DragDataMap = std::map<std::string, std::string>;
- // Takes ownership of data_source.
- explicit WaylandDataSource(wl_data_source* data_source,
- WaylandConnection* connection);
- ~WaylandDataSource() override;
+// DataSource represents the source side of a DataOffer. It is created by the
+// source client in a data transfer and provides a way to describe the offered
+// data and a way to respond to requests to transfer the data. There are a few
+// variants of Wayland protocol objects and extensions supporting different
+// features. E.g: regular copy/paste and drag operations are implemented by
+// wl_data_source (along with its _device and _offer counterparts), etc.
+// 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>;
+
+} // namespace ui
- void set_connection(WaylandConnection* connection) {
- DCHECK(connection);
- connection_ = connection;
- }
+namespace wl {
- void WriteToClipboard(const PlatformClipboard::DataMap& data_map) override;
- void Offer(const ui::OSExchangeData& data);
+// Template class implementing DataSource, whereas T is the underlying source
+// type, e.g: wl_data_source, gtk_primary_selection_source, etc. This class
+// is not supposed to be used directly, instead use the aliases defined above.
+template <typename T>
+class DataSource {
+ public:
+ class Delegate {
+ public:
+ virtual void OnDataSourceFinish(bool completed) = 0;
+ virtual void OnDataSourceSend(const std::string& mime_type,
+ std::string* contents) = 0;
+
+ protected:
+ virtual ~Delegate() = default;
+ };
+
+ // Takes ownership of |data_source|.
+ DataSource(T* data_source,
+ ui::WaylandConnection* connection,
+ Delegate* delegate);
+ DataSource(const DataSource<T>&) = delete;
+ DataSource& operator=(const DataSource<T>&) = delete;
+ ~DataSource() = default;
+
+ void Initialize();
+ void Offer(const std::vector<std::string>& mime_types);
void SetAction(int operation);
- void SetDragData(const DragDataMap& data_map);
- wl_data_source* data_source() const { return data_source_.get(); }
+ uint32_t dnd_action() const { return dnd_action_; }
+ T* data_source() const { return data_source_.get(); }
private:
- static void OnTarget(void* data,
- wl_data_source* source,
- const char* mime_type);
- static void OnSend(void* data,
- wl_data_source* source,
- const char* mime_type,
- int32_t fd);
- static void OnCancel(void* data, wl_data_source* source);
- static void OnDnDDropPerformed(void* data, wl_data_source* source);
- static void OnDnDFinished(void* data, wl_data_source* source);
- static void OnAction(void* data, wl_data_source* source, uint32_t dnd_action);
-
- void GetDragData(const std::string& mime_type, std::string* contents);
-
- wl::Object<wl_data_source> data_source_;
- WaylandConnection* connection_ = nullptr;
- WaylandWindow* source_window_ = nullptr;
-
- DragDataMap drag_data_map_;
+ void HandleFinishEvent(bool completed);
+ void HandleSendEvent(const std::string& mime_type, int32_t fd);
+
+ static void OnSend(void* data, T* source, const char* mime_type, int32_t fd);
+ static void OnCancel(void* data, T* source);
+ static void OnDnDFinished(void* data, T* source);
+ static void OnAction(void* data, T* source, uint32_t dnd_action);
+ static void OnTarget(void* data, T* source, const char* mime_type);
+ static void OnDnDDropPerformed(void* data, T* source);
+
+ wl::Object<T> data_source_;
+
+ ui::WaylandConnection* const connection_;
+
+ Delegate* const delegate_;
+
// Action selected by the compositor
uint32_t dnd_action_;
-
- DISALLOW_COPY_AND_ASSIGN(WaylandDataSource);
};
-} // namespace ui
+} // namespace wl
#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_DATA_SOURCE_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_source_base.cc b/chromium/ui/ozone/platform/wayland/host/wayland_data_source_base.cc
deleted file mode 100644
index c7bba1d2538..00000000000
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_source_base.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-// 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/ozone/platform/wayland/host/wayland_data_source_base.h"
-
-namespace ui {
-
-WaylandDataSourceBase::WaylandDataSourceBase() = default;
-WaylandDataSourceBase::~WaylandDataSourceBase() = default;
-
-void WaylandDataSourceBase::GetClipboardData(
- const std::string& mime_type,
- base::Optional<std::vector<uint8_t>>* data) const {
- auto it = data_map_.find(mime_type);
- if (it == data_map_.end())
- return;
- data->emplace(it->second);
-}
-
-} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_source_base.h b/chromium/ui/ozone/platform/wayland/host/wayland_data_source_base.h
deleted file mode 100644
index 4e4d66b1607..00000000000
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_source_base.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// 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_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_DATA_SOURCE_BASE_H_
-#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_DATA_SOURCE_BASE_H_
-
-#include "base/macros.h"
-#include "ui/ozone/public/platform_clipboard.h"
-
-namespace ui {
-
-// Implements high level (protocol-agnostic) interface to a Wayland data source.
-class WaylandDataSourceBase {
- public:
- WaylandDataSourceBase();
- virtual ~WaylandDataSourceBase();
-
- void set_data_map(const PlatformClipboard::DataMap& data_map) {
- data_map_ = data_map;
- }
-
- // Writes data to the system clipboard using the protocol-defined data source.
- virtual void WriteToClipboard(const PlatformClipboard::DataMap& data_map) = 0;
-
- protected:
- void GetClipboardData(const std::string& mime_type,
- base::Optional<std::vector<uint8_t>>* data) const;
-
- private:
- PlatformClipboard::DataMap data_map_;
-
- DISALLOW_COPY_AND_ASSIGN(WaylandDataSourceBase);
-};
-
-} // namespace ui
-
-#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_DATA_SOURCE_BASE_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_drm.cc b/chromium/ui/ozone/platform/wayland/host/wayland_drm.cc
index 12a91eed83a..e387e48c686 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_drm.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_drm.cc
@@ -8,6 +8,7 @@
#include <xf86drm.h>
#include "base/files/scoped_file.h"
+#include "base/logging.h"
#include "ui/gfx/buffer_format_util.h"
#include "ui/gfx/linux/drm_util_linux.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_event_source.cc b/chromium/ui/ozone/platform/wayland/host/wayland_event_source.cc
index a83c0bfe87c..48d500ae5fb 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_event_source.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_event_source.cc
@@ -96,21 +96,21 @@ void WaylandEventSource::OnKeyboardModifiersChanged(int modifiers) {
keyboard_modifiers_ = modifiers;
}
-void WaylandEventSource::OnKeyboardKeyEvent(EventType type,
- DomCode dom_code,
- DomKey dom_key,
- KeyboardCode key_code,
- bool repeat,
- base::TimeTicks timestamp) {
+uint32_t WaylandEventSource::OnKeyboardKeyEvent(EventType type,
+ DomCode dom_code,
+ DomKey dom_key,
+ KeyboardCode key_code,
+ bool repeat,
+ base::TimeTicks timestamp) {
DCHECK(type == ET_KEY_PRESSED || type == ET_KEY_RELEASED);
if (!keyboard_)
- return;
+ return POST_DISPATCH_NONE;
// try to decode key, if not yet.
if (dom_key == DomKey::NONE &&
!keyboard_->Decode(dom_code, keyboard_modifiers_, &dom_key, &key_code)) {
LOG(ERROR) << "Failed to decode key event.";
- return;
+ return POST_DISPATCH_NONE;
}
if (!repeat) {
@@ -121,7 +121,7 @@ void WaylandEventSource::OnKeyboardKeyEvent(EventType type,
KeyEvent event(type, key_code, dom_code, keyboard_modifiers_, dom_key,
timestamp);
event.set_source_device_id(keyboard_->device_id());
- DispatchEvent(&event);
+ return DispatchEvent(&event);
}
void WaylandEventSource::OnPointerCreated(WaylandPointer* pointer) {
@@ -133,15 +133,13 @@ void WaylandEventSource::OnPointerDestroyed(WaylandPointer* pointer) {
DCHECK_EQ(pointer_, pointer);
// Clear focused window, if any.
- if (auto* focused_window = window_manager_->GetCurrentFocusedWindow())
- HandlePointerFocusChange(focused_window, false);
+ HandlePointerFocusChange(nullptr);
ResetPointerFlags();
pointer_ = nullptr;
}
void WaylandEventSource::OnPointerFocusChanged(WaylandWindow* window,
- bool focused,
const gfx::PointF& location) {
if (!pointer_)
return;
@@ -149,8 +147,9 @@ void WaylandEventSource::OnPointerFocusChanged(WaylandWindow* window,
// Save new pointer location.
pointer_location_ = location;
+ bool focused = !!window;
if (focused)
- HandlePointerFocusChange(window, focused);
+ HandlePointerFocusChange(window);
EventType type = focused ? ET_MOUSE_ENTERED : ET_MOUSE_EXITED;
MouseEvent event(type, location, location, EventTimeForNow(), pointer_flags_,
@@ -158,7 +157,7 @@ void WaylandEventSource::OnPointerFocusChanged(WaylandWindow* window,
DispatchEvent(&event);
if (!focused)
- HandlePointerFocusChange(window, focused);
+ HandlePointerFocusChange(nullptr);
}
void WaylandEventSource::OnPointerButtonEvent(EventType type,
@@ -172,6 +171,7 @@ void WaylandEventSource::OnPointerButtonEvent(EventType type,
pointer_flags_ = type == ET_MOUSE_PRESSED
? (pointer_flags_ | changed_button)
: (pointer_flags_ & ~changed_button);
+ last_pointer_button_pressed_ = changed_button;
// MouseEvent's flags should contain the button that was released too.
int flags = pointer_flags_ | keyboard_modifiers_ | changed_button;
MouseEvent event(type, pointer_location_, pointer_location_,
@@ -322,22 +322,16 @@ void WaylandEventSource::HandleKeyboardFocusChange(WaylandWindow* window,
window->set_keyboard_focus(focused);
}
-void WaylandEventSource::HandlePointerFocusChange(WaylandWindow* window,
- bool focused) {
- // window can be null on wl_pointer::leave events, for example.
- if (window)
- window->SetPointerFocus(focused);
-
- if (focused) {
- DCHECK(window);
- window_with_pointer_focus_ = window;
- } else {
- // Focused window might have been destroyed at this point (eg: context
- // menus), in this case, |window| is null, otherwise it must be equal to
- // |window_with_pointer_focus_|. In both cases, they must be equal.
- DCHECK_EQ(window_with_pointer_focus_, window);
- window_with_pointer_focus_ = nullptr;
- }
+void WaylandEventSource::HandlePointerFocusChange(WaylandWindow* window) {
+ // Focused window might have been destroyed at this point (eg: context menus),
+ // in this case, |window| is null.
+ if (window_with_pointer_focus_)
+ window_with_pointer_focus_->SetPointerFocus(false);
+
+ window_with_pointer_focus_ = window;
+
+ if (window_with_pointer_focus_)
+ window_with_pointer_focus_->SetPointerFocus(true);
}
void WaylandEventSource::HandleTouchFocusChange(WaylandWindow* window,
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_event_source.h b/chromium/ui/ozone/platform/wayland/host/wayland_event_source.h
index 7f1a565c613..7c9c409e702 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_event_source.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_event_source.h
@@ -55,6 +55,10 @@ class WaylandEventSource : public PlatformEventSource,
WaylandEventSource& operator=(const WaylandEventSource&) = delete;
~WaylandEventSource() override;
+ int last_pointer_button_pressed() const {
+ return last_pointer_button_pressed_;
+ }
+
// Starts polling for events from the wayland connection file descriptor.
// This method assumes connection is already estabilished and input objects
// are already bound and properly initialized.
@@ -76,18 +80,17 @@ class WaylandEventSource : public PlatformEventSource,
void OnKeyboardDestroyed(WaylandKeyboard* keyboard) override;
void OnKeyboardFocusChanged(WaylandWindow* window, bool focused) override;
void OnKeyboardModifiersChanged(int modifiers) override;
- void OnKeyboardKeyEvent(EventType type,
- DomCode dom_code,
- DomKey dom_key,
- KeyboardCode key_code,
- bool repeat,
- base::TimeTicks timestamp) override;
+ uint32_t OnKeyboardKeyEvent(EventType type,
+ DomCode dom_code,
+ DomKey dom_key,
+ KeyboardCode key_code,
+ bool repeat,
+ base::TimeTicks timestamp) override;
// WaylandPointer::Delegate
void OnPointerCreated(WaylandPointer* pointer) override;
void OnPointerDestroyed(WaylandPointer* pointer) override;
void OnPointerFocusChanged(WaylandWindow* window,
- bool focused,
const gfx::PointF& location) override;
void OnPointerButtonEvent(EventType evtype, int changed_button) override;
void OnPointerMotionEvent(const gfx::PointF& location) override;
@@ -117,7 +120,7 @@ class WaylandEventSource : public PlatformEventSource,
void UpdateKeyboardModifiers(int modifier, bool down);
void HandleKeyboardFocusChange(WaylandWindow* window, bool focused);
- void HandlePointerFocusChange(WaylandWindow* window, bool focused);
+ void HandlePointerFocusChange(WaylandWindow* window);
void HandleTouchFocusChange(WaylandWindow* window,
bool focused,
base::Optional<PointerId> id = base::nullopt);
@@ -133,6 +136,9 @@ class WaylandEventSource : public PlatformEventSource,
// Bitmask of EventFlags used to keep track of the the pointer state.
int pointer_flags_ = 0;
+ // Bitmask of EventFlags used to keep track of the last changed button.
+ int last_pointer_button_pressed_ = 0;
+
// Bitmask of EventFlags used to keep track of the the keyboard state.
int keyboard_modifiers_ = 0;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.cc b/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.cc
index 0258d157776..7de0fe694d7 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.cc
@@ -34,10 +34,12 @@ const wl_callback_listener WaylandKeyboard::callback_listener_ = {
WaylandKeyboard::SyncCallback,
};
-WaylandKeyboard::WaylandKeyboard(wl_keyboard* keyboard,
- WaylandConnection* connection,
- KeyboardLayoutEngine* layout_engine,
- Delegate* delegate)
+WaylandKeyboard::WaylandKeyboard(
+ wl_keyboard* keyboard,
+ zcr_keyboard_extension_v1* keyboard_extension_v1,
+ WaylandConnection* connection,
+ KeyboardLayoutEngine* layout_engine,
+ Delegate* delegate)
: obj_(keyboard),
connection_(connection),
delegate_(delegate),
@@ -58,6 +60,10 @@ WaylandKeyboard::WaylandKeyboard(wl_keyboard* keyboard,
wl_keyboard_add_listener(obj_.get(), &listener, this);
// TODO(tonikitoo): Default auto-repeat to ON here?
+
+ if (keyboard_extension_v1)
+ extended_keyboard_v1_.reset(zcr_keyboard_extension_v1_get_extended_keyboard(
+ keyboard_extension_v1, obj_.get()));
}
WaylandKeyboard::~WaylandKeyboard() {
@@ -193,9 +199,15 @@ void WaylandKeyboard::DispatchKey(uint32_t key,
// Pass empty DomKey and KeyboardCode here so the delegate can pre-process
// and decode it when needed.
- delegate_->OnKeyboardKeyEvent(down ? ET_KEY_PRESSED : ET_KEY_RELEASED,
- dom_code, DomKey::NONE,
- KeyboardCode::VKEY_UNKNOWN, repeat, timestamp);
+ uint32_t result = delegate_->OnKeyboardKeyEvent(
+ down ? ET_KEY_PRESSED : ET_KEY_RELEASED, dom_code, DomKey::NONE,
+ KeyboardCode::VKEY_UNKNOWN, repeat, timestamp);
+
+ if (extended_keyboard_v1_) {
+ bool handled = result & POST_DISPATCH_STOP_PROPAGATION;
+ zcr_extended_keyboard_v1_ack_key(extended_keyboard_v1_.get(),
+ connection_->serial(), handled);
+ }
}
bool WaylandKeyboard::Decode(DomCode dom_code,
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.h b/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.h
index 1630d8aa681..e449da0be85 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_KEYBOARD_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_KEYBOARD_H_
+#include <keyboard-extension-unstable-v1-client-protocol.h>
#include <wayland-client.h>
#include "base/time/time.h"
@@ -30,6 +31,7 @@ class WaylandKeyboard : public EventAutoRepeatHandler::Delegate {
class Delegate;
WaylandKeyboard(wl_keyboard* keyboard,
+ zcr_keyboard_extension_v1* keyboard_extension_v1,
WaylandConnection* connection,
KeyboardLayoutEngine* keyboard_layout_engine,
Delegate* delegate);
@@ -88,6 +90,7 @@ class WaylandKeyboard : public EventAutoRepeatHandler::Delegate {
int flags) override;
wl::Object<wl_keyboard> obj_;
+ wl::Object<zcr_extended_keyboard_v1> extended_keyboard_v1_;
WaylandConnection* const connection_;
Delegate* const delegate_;
@@ -110,12 +113,18 @@ class WaylandKeyboard::Delegate {
virtual void OnKeyboardDestroyed(WaylandKeyboard* keyboard) = 0;
virtual void OnKeyboardFocusChanged(WaylandWindow* window, bool focused) = 0;
virtual void OnKeyboardModifiersChanged(int modifiers) = 0;
- virtual void OnKeyboardKeyEvent(EventType type,
- DomCode dom_code,
- DomKey dom_key,
- KeyboardCode key_code,
- bool repeat,
- base::TimeTicks timestamp) = 0;
+ // Returns a mask of ui::PostDispatchAction indicating how the event was
+ // dispatched.
+ virtual uint32_t OnKeyboardKeyEvent(EventType type,
+ DomCode dom_code,
+ DomKey dom_key,
+ KeyboardCode key_code,
+ bool repeat,
+ base::TimeTicks timestamp) = 0;
+
+ protected:
+ // Prevent deletion through a WaylandKeyboard::Delegate pointer.
+ virtual ~Delegate() = default;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_pointer.cc b/chromium/ui/ozone/platform/wayland/host/wayland_pointer.cc
index 8a2da9f409a..1658a68cc93 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_pointer.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_pointer.cc
@@ -45,10 +45,10 @@ void WaylandPointer::Enter(void* data,
wl_fixed_t surface_y) {
DCHECK(data);
WaylandPointer* pointer = static_cast<WaylandPointer*>(data);
- gfx::PointF location(wl_fixed_to_double(surface_x),
- wl_fixed_to_double(surface_y));
- pointer->delegate_->OnPointerFocusChanged(WaylandWindow::FromSurface(surface),
- /*focused=*/true, location);
+ WaylandWindow* window = WaylandWindow::FromSurface(surface);
+ gfx::PointF location{wl_fixed_to_double(surface_x),
+ wl_fixed_to_double(surface_y)};
+ pointer->delegate_->OnPointerFocusChanged(window, location);
}
// static
@@ -58,8 +58,7 @@ void WaylandPointer::Leave(void* data,
wl_surface* surface) {
DCHECK(data);
WaylandPointer* pointer = static_cast<WaylandPointer*>(data);
- pointer->delegate_->OnPointerFocusChanged(WaylandWindow::FromSurface(surface),
- /*focused=*/false, {});
+ pointer->delegate_->OnPointerFocusChanged(nullptr, {});
}
// static
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_pointer.h b/chromium/ui/ozone/platform/wayland/host/wayland_pointer.h
index c4c9ecfbc35..b3f3a6ccbfa 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_pointer.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_pointer.h
@@ -73,7 +73,6 @@ class WaylandPointer::Delegate {
virtual void OnPointerCreated(WaylandPointer* pointer) = 0;
virtual void OnPointerDestroyed(WaylandPointer* pointer) = 0;
virtual void OnPointerFocusChanged(WaylandWindow* window,
- bool focused,
const gfx::PointF& location) = 0;
virtual void OnPointerButtonEvent(EventType evtype, int changed_button) = 0;
virtual void OnPointerMotionEvent(const gfx::PointF& location) = 0;
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 f20ee54c250..cf12f91f1b7 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc
@@ -237,7 +237,7 @@ TEST_P(WaylandPointerTest, SetBitmapOnPointerFocus) {
BitmapCursorFactoryOzone cursor_factory;
PlatformCursor cursor =
- cursor_factory.CreateImageCursor(dummy_cursor, gfx::Point(5, 8), 1.0f);
+ cursor_factory.CreateImageCursor(dummy_cursor, gfx::Point(5, 8));
scoped_refptr<BitmapCursorOzone> bitmap =
BitmapCursorFactoryOzone::GetBitmapCursor(cursor);
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_popup.cc b/chromium/ui/ozone/platform/wayland/host/wayland_popup.cc
index 116c7be47d1..ba52979990a 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_popup.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_popup.cc
@@ -144,9 +144,7 @@ bool WaylandPopup::OnInitialize(PlatformWindowInitProperties properties) {
}
gfx::Rect WaylandPopup::AdjustPopupWindowPosition() {
- auto* top_level_parent = wl::IsMenuType(parent_window()->type())
- ? parent_window()->parent_window()
- : parent_window();
+ auto* top_level_parent = GetRootParentWindow();
DCHECK(top_level_parent);
DCHECK(buffer_scale() == top_level_parent->buffer_scale());
DCHECK(ui_scale() == top_level_parent->ui_scale());
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_shm_buffer.cc b/chromium/ui/ozone/platform/wayland/host/wayland_shm_buffer.cc
index 298ea68b29f..e4fa21fa09a 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_shm_buffer.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_shm_buffer.cc
@@ -4,6 +4,7 @@
#include "ui/ozone/platform/wayland/host/wayland_shm_buffer.h"
+#include "base/logging.h"
#include "base/memory/platform_shared_memory_region.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "ui/gfx/skia_util.h"
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_subsurface.cc b/chromium/ui/ozone/platform/wayland/host/wayland_subsurface.cc
index 28f435f39de..e76aa6376dd 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_subsurface.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_subsurface.cc
@@ -7,6 +7,7 @@
#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"
+#include "ui/ozone/platform/wayland/host/wayland_data_drag_controller.h"
#include "ui/ozone/platform/wayland/host/wayland_window_manager.h"
namespace ui {
@@ -15,7 +16,7 @@ namespace {
gfx::Rect AdjustSubsurfaceBounds(const gfx::Rect& bounds_px,
const gfx::Rect& parent_bounds_px,
- int32_t ui_scale,
+ float ui_scale,
int32_t buffer_scale) {
const auto parent_bounds_dip =
gfx::ScaleToRoundedRect(parent_bounds_px, 1.0 / ui_scale);
@@ -78,7 +79,7 @@ void WaylandSubsurface::CreateSubsurface() {
// windows. If we are in a drag process, use the entered window. Otherwise,
// it must be a tooltip.
if (connection()->IsDragInProgress()) {
- parent = connection()->wayland_data_device()->entered_window();
+ parent = connection()->data_drag_controller()->entered_window();
set_parent_window(parent);
} else {
// If Aura does not not provide a reference parent window, needed by
@@ -114,6 +115,11 @@ void WaylandSubsurface::CreateSubsurface() {
wl_subsurface_set_desync(subsurface_.get());
wl_surface_commit(parent->surface());
connection()->ScheduleFlush();
+
+ // Notify the observers the window has been configured. Please note that
+ // subsurface doesn't send ack configure events. Thus, notify the observers as
+ // soon as the subsurface is created.
+ connection()->wayland_window_manager()->NotifyWindowConfigured(this);
}
bool WaylandSubsurface::OnInitialize(PlatformWindowInitProperties properties) {
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_surface.cc b/chromium/ui/ozone/platform/wayland/host/wayland_surface.cc
index 6f72776d0d3..c2cf21baf62 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_surface.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_surface.cc
@@ -4,350 +4,21 @@
#include "ui/ozone/platform/wayland/host/wayland_surface.h"
-#include "ui/base/dragdrop/drag_drop_types.h"
-#include "ui/base/dragdrop/os_exchange_data.h"
-#include "ui/base/hit_test.h"
-#include "ui/gfx/native_widget_types.h"
-#include "ui/ozone/platform/wayland/host/shell_object_factory.h"
-#include "ui/ozone/platform/wayland/host/shell_surface_wrapper.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/platform_window/platform_window_handler/wm_drop_handler.h"
+#include "ui/ozone/platform/wayland/host/wayland_window.h"
namespace ui {
-WaylandSurface::WaylandSurface(PlatformWindowDelegate* delegate,
- WaylandConnection* connection)
- : WaylandWindow(delegate, connection),
- state_(PlatformWindowState::kNormal) {
- // Set a class property key, which allows |this| to be used for interactive
- // events, e.g. move or resize.
- SetWmMoveResizeHandler(this, AsWmMoveResizeHandler());
+WaylandSurface::WaylandSurface() = default;
+WaylandSurface::~WaylandSurface() = default;
- // Set a class property key, which allows |this| to be used for drag action.
- SetWmDragHandler(this, this);
+gfx::AcceleratedWidget WaylandSurface::GetWidget() const {
+ if (!surface_)
+ return gfx::kNullAcceleratedWidget;
+ return surface_.id();
}
-WaylandSurface::~WaylandSurface() {
- if (drag_closed_callback_) {
- std::move(drag_closed_callback_)
- .Run(DragDropTypes::DragOperation::DRAG_NONE);
- }
-}
-
-bool WaylandSurface::CreateShellSurface() {
- ShellObjectFactory factory;
- shell_surface_ = factory.CreateShellSurfaceWrapper(connection(), this);
- if (!shell_surface_) {
- LOG(ERROR) << "Failed to create a ShellSurface.";
- return false;
- }
-
- shell_surface_->SetAppId(app_id_);
- shell_surface_->SetTitle(window_title_);
- SetSizeConstraints();
- TriggerStateChanges();
- return true;
-}
-
-void WaylandSurface::ApplyPendingBounds() {
- if (pending_bounds_dip_.IsEmpty())
- return;
- DCHECK(shell_surface_);
-
- SetBoundsDip(pending_bounds_dip_);
- shell_surface_->SetWindowGeometry(pending_bounds_dip_);
- pending_bounds_dip_ = gfx::Rect();
- connection()->ScheduleFlush();
-}
-
-void WaylandSurface::DispatchHostWindowDragMovement(
- int hittest,
- const gfx::Point& pointer_location_in_px) {
- DCHECK(shell_surface_);
-
- connection()->event_source()->ResetPointerFlags();
- if (hittest == HTCAPTION)
- shell_surface_->SurfaceMove(connection());
- else
- shell_surface_->SurfaceResize(connection(), hittest);
-
- connection()->ScheduleFlush();
-}
-
-void WaylandSurface::StartDrag(const ui::OSExchangeData& data,
- int operation,
- gfx::NativeCursor cursor,
- base::OnceCallback<void(int)> callback) {
- DCHECK(!drag_closed_callback_);
- drag_closed_callback_ = std::move(callback);
- connection()->StartDrag(data, operation);
-}
-
-void WaylandSurface::Show(bool inactive) {
- if (shell_surface_)
- return;
-
- if (!CreateShellSurface()) {
- Close();
- return;
- }
-
- UpdateBufferScale(false);
-}
-
-void WaylandSurface::Hide() {
- if (!shell_surface_)
- return;
-
- if (child_window()) {
- child_window()->Hide();
- set_child_window(nullptr);
- }
-
- shell_surface_.reset();
- connection()->ScheduleFlush();
-
- // Detach buffer from surface in order to completely shutdown menus and
- // tooltips, and release resources.
- connection()->buffer_manager_host()->ResetSurfaceContents(GetWidget());
-}
-
-bool WaylandSurface::IsVisible() const {
- // X and Windows return true if the window is minimized. For consistency, do
- // the same.
- return !!shell_surface_ || state_ == PlatformWindowState::kMinimized;
-}
-
-void WaylandSurface::SetTitle(const base::string16& title) {
- if (window_title_ == title)
- return;
-
- window_title_ = title;
-
- if (shell_surface_) {
- shell_surface_->SetTitle(title);
- connection()->ScheduleFlush();
- }
-}
-
-void WaylandSurface::ToggleFullscreen() {
- // TODO(msisov, tonikitoo): add multiscreen support. As the documentation says
- // if xdg_toplevel_set_fullscreen() is not provided with wl_output, it's up
- // to the compositor to choose which display will be used to map this surface.
-
- // We must track the previous state to correctly say our state as long as it
- // can be the maximized instead of normal one.
- PlatformWindowState new_state = PlatformWindowState::kUnknown;
- if (state_ == PlatformWindowState::kFullScreen) {
- if (previous_state_ == PlatformWindowState::kMaximized)
- new_state = previous_state_;
- else
- new_state = PlatformWindowState::kNormal;
- } else {
- new_state = PlatformWindowState::kFullScreen;
- }
-
- SetWindowState(new_state);
-}
-
-void WaylandSurface::Maximize() {
- SetWindowState(PlatformWindowState::kMaximized);
-}
-
-void WaylandSurface::Minimize() {
- SetWindowState(PlatformWindowState::kMinimized);
-}
-
-void WaylandSurface::Restore() {
- DCHECK(shell_surface_);
- SetWindowState(PlatformWindowState::kNormal);
-}
-
-PlatformWindowState WaylandSurface::GetPlatformWindowState() const {
- return state_;
-}
-
-void WaylandSurface::SizeConstraintsChanged() {
- // Size constraints only make sense for normal windows.
- if (!shell_surface_)
- return;
-
- DCHECK(delegate());
- min_size_ = delegate()->GetMinimumSizeForWindow();
- max_size_ = delegate()->GetMaximumSizeForWindow();
- SetSizeConstraints();
-}
-
-void WaylandSurface::HandleSurfaceConfigure(int32_t width,
- int32_t height,
- bool is_maximized,
- bool is_fullscreen,
- bool is_activated) {
- // Store the old state to propagte state changes if Wayland decides to change
- // the state to something else.
- PlatformWindowState old_state = state_;
- if (state_ == PlatformWindowState::kMinimized && !is_activated) {
- state_ = PlatformWindowState::kMinimized;
- } else if (is_fullscreen) {
- state_ = PlatformWindowState::kFullScreen;
- } else if (is_maximized) {
- state_ = PlatformWindowState::kMaximized;
- } else {
- state_ = PlatformWindowState::kNormal;
- }
-
- const bool state_changed = old_state != state_;
- const bool is_normal = state_ == PlatformWindowState::kNormal;
-
- // Update state before notifying delegate.
- const bool did_active_change = is_active_ != is_activated;
- is_active_ = is_activated;
-
- // Rather than call SetBounds here for every configure event, just save the
- // most recent bounds, and have WaylandConnection call ApplyPendingBounds
- // when it has finished processing events. We may get many configure events
- // in a row during an interactive resize, and only the last one matters.
- //
- // Width or height set to 0 means that we should decide on width and height by
- // ourselves, but we don't want to set them to anything else. Use restored
- // bounds size or the current bounds iff the current state is normal (neither
- // maximized nor fullscreen).
- //
- // Note: if the browser was started with --start-fullscreen and a user exits
- // the fullscreen mode, wayland may set the width and height to be 1. Instead,
- // explicitly set the bounds to the current desired ones or the previous
- // bounds.
- if (width > 1 && height > 1) {
- pending_bounds_dip_ = gfx::Rect(0, 0, width, height);
- } else if (is_normal) {
- pending_bounds_dip_.set_size(
- gfx::ScaleToRoundedSize(GetRestoredBoundsInPixels().IsEmpty()
- ? GetBounds().size()
- : GetRestoredBoundsInPixels().size(),
-
- 1.0 / buffer_scale()));
- }
-
- // Store the restored bounds of current state differs from the normal state.
- // It can be client or compositor side change from normal to something else.
- // Thus, we must store previous bounds to restore later.
- SetOrResetRestoredBounds();
- ApplyPendingBounds();
-
- if (state_changed)
- delegate()->OnWindowStateChanged(state_);
-
- if (did_active_change)
- delegate()->OnActivationChanged(is_active_);
-}
-
-void WaylandSurface::OnDragEnter(const gfx::PointF& point,
- std::unique_ptr<OSExchangeData> data,
- int operation) {
- WmDropHandler* drop_handler = GetWmDropHandler(*this);
- if (!drop_handler)
- return;
-
- // Wayland sends locations in DIP so they need to be translated to
- // physical pixels.
- drop_handler->OnDragEnter(
- gfx::ScalePoint(point, buffer_scale(), buffer_scale()), std::move(data),
- operation);
-}
-
-int WaylandSurface::OnDragMotion(const gfx::PointF& point,
- uint32_t time,
- int operation) {
- WmDropHandler* drop_handler = GetWmDropHandler(*this);
- if (!drop_handler)
- return 0;
-
- // Wayland sends locations in DIP so they need to be translated to
- // physical pixels.
- return drop_handler->OnDragMotion(
- gfx::ScalePoint(point, buffer_scale(), buffer_scale()), operation);
-}
-
-void WaylandSurface::OnDragDrop(std::unique_ptr<OSExchangeData> data) {
- WmDropHandler* drop_handler = GetWmDropHandler(*this);
- if (!drop_handler)
- return;
- drop_handler->OnDragDrop(std::move(data));
-}
-
-void WaylandSurface::OnDragLeave() {
- WmDropHandler* drop_handler = GetWmDropHandler(*this);
- if (!drop_handler)
- return;
- drop_handler->OnDragLeave();
-}
-
-void WaylandSurface::OnDragSessionClose(uint32_t dnd_action) {
- std::move(drag_closed_callback_).Run(dnd_action);
- connection()->event_source()->ResetPointerFlags();
-}
-
-bool WaylandSurface::OnInitialize(PlatformWindowInitProperties properties) {
- app_id_ = properties.wm_class_class;
- return true;
-}
-
-void WaylandSurface::TriggerStateChanges() {
- if (!shell_surface_)
- return;
-
- if (state_ == PlatformWindowState::kFullScreen)
- shell_surface_->SetFullscreen();
- else
- shell_surface_->UnSetFullscreen();
-
- // Call UnSetMaximized only if current state is normal. Otherwise, if the
- // current state is fullscreen and the previous is maximized, calling
- // UnSetMaximized may result in wrong restored window position that clients
- // are not allowed to know about.
- if (state_ == PlatformWindowState::kMaximized)
- shell_surface_->SetMaximized();
- else if (state_ == PlatformWindowState::kNormal)
- shell_surface_->UnSetMaximized();
-
- if (state_ == PlatformWindowState::kMinimized)
- shell_surface_->SetMinimized();
-
- connection()->ScheduleFlush();
-}
-
-void WaylandSurface::SetWindowState(PlatformWindowState state) {
- previous_state_ = state_;
- state_ = state;
- TriggerStateChanges();
-}
-
-WmMoveResizeHandler* WaylandSurface::AsWmMoveResizeHandler() {
- return static_cast<WmMoveResizeHandler*>(this);
-}
-
-void WaylandSurface::SetSizeConstraints() {
- if (min_size_.has_value())
- shell_surface_->SetMinSize(min_size_->width(), min_size_->height());
- if (max_size_.has_value())
- shell_surface_->SetMaxSize(max_size_->width(), max_size_->height());
-
- connection()->ScheduleFlush();
-}
-
-void WaylandSurface::SetOrResetRestoredBounds() {
- // The |restored_bounds_| are used when the window gets back to normal
- // state after it went maximized or fullscreen. So we reset these if the
- // window has just become normal and store the current bounds if it is
- // either going out of normal state or simply changes the state and we don't
- // have any meaningful value stored.
- if (GetPlatformWindowState() == PlatformWindowState::kNormal) {
- SetRestoredBoundsInPixels({});
- } else if (GetRestoredBoundsInPixels().IsEmpty()) {
- SetRestoredBoundsInPixels(GetBounds());
- }
+gfx::AcceleratedWidget WaylandSurface::GetRootWidget() const {
+ return root_window_->GetWidget();
}
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_surface.h b/chromium/ui/ozone/platform/wayland/host/wayland_surface.h
index ceda32d24a7..e432ceb7e7d 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_surface.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_surface.h
@@ -5,121 +5,38 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_SURFACE_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_SURFACE_H_
-#include "ui/ozone/platform/wayland/host/wayland_window.h"
-
-#include "ui/platform_window/platform_window_handler/wm_drag_handler.h"
-#include "ui/platform_window/platform_window_handler/wm_move_resize_handler.h"
+#include "ui/gfx/native_widget_types.h"
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
namespace ui {
-class ShellSurfaceWrapper;
+class WaylandWindow;
-class WaylandSurface : public WaylandWindow,
- public WmMoveResizeHandler,
- public WmDragHandler {
+// Wrapper of a wl_surface, owned by a WaylandWindow or a WlSubsurface.
+class WaylandSurface {
public:
- WaylandSurface(PlatformWindowDelegate* delegate,
- WaylandConnection* connection);
- ~WaylandSurface() override;
-
- ShellSurfaceWrapper* shell_surface() const { return shell_surface_.get(); }
-
- // Apply the bounds specified in the most recent configure event. This should
- // be called after processing all pending events in the wayland connection.
- void ApplyPendingBounds();
+ WaylandSurface();
+ WaylandSurface(const WaylandSurface&) = delete;
+ WaylandSurface& operator=(const WaylandSurface&) = delete;
+ ~WaylandSurface();
- // WmMoveResizeHandler
- void DispatchHostWindowDragMovement(
- int hittest,
- const gfx::Point& pointer_location_in_px) override;
+ WaylandWindow* root_window() const { return root_window_; }
+ wl_surface* surface() const { return surface_.get(); }
+ int32_t buffer_scale() const { return buffer_scale_; }
- // WmDragHandler
- void StartDrag(const ui::OSExchangeData& data,
- int operation,
- gfx::NativeCursor cursor,
- base::OnceCallback<void(int)> callback) override;
-
- // PlatformWindow
- void Show(bool inactive) override;
- void Hide() override;
- bool IsVisible() const override;
- void SetTitle(const base::string16& title) override;
- void ToggleFullscreen() override;
- void Maximize() override;
- void Minimize() override;
- void Restore() override;
- PlatformWindowState GetPlatformWindowState() const override;
- void SizeConstraintsChanged() override;
+ // gfx::AcceleratedWidget identifies a wl_surface or a ui::WaylandWindow. Note
+ // that GetWidget() and GetRootWidget() do not necessarily return the same
+ // result.
+ gfx::AcceleratedWidget GetWidget() const;
+ gfx::AcceleratedWidget GetRootWidget() const;
private:
- // WaylandWindow overrides:
- void HandleSurfaceConfigure(int32_t widht,
- int32_t height,
- bool is_maximized,
- bool is_fullscreen,
- bool is_activated) override;
- void OnDragEnter(const gfx::PointF& point,
- std::unique_ptr<OSExchangeData> data,
- int operation) override;
- int OnDragMotion(const gfx::PointF& point,
- uint32_t time,
- int operation) override;
- void OnDragDrop(std::unique_ptr<OSExchangeData> data) override;
- void OnDragLeave() override;
- void OnDragSessionClose(uint32_t dnd_action) override;
- bool OnInitialize(PlatformWindowInitProperties properties) override;
-
- void TriggerStateChanges();
- void SetWindowState(PlatformWindowState state);
-
- // Creates a surface window, which is visible as a main window.
- bool CreateShellSurface();
-
- WmMoveResizeHandler* AsWmMoveResizeHandler();
-
- // Propagates the |min_size_| and |max_size_| to the ShellSurface.
- void SetSizeConstraints();
-
- void SetOrResetRestoredBounds();
-
- // Wrappers around shell surface.
- std::unique_ptr<ShellSurfaceWrapper> shell_surface_;
-
- base::OnceCallback<void(int)> drag_closed_callback_;
-
- // These bounds attributes below have suffices that indicate units used.
- // Wayland operates in DIP but the platform operates in physical pixels so
- // our WaylandSurface is the link that has to translate the units. See also
- // comments in the implementation.
- //
- // Bounds that will be applied when the window state is finalized. The window
- // may get several configuration events that update the pending bounds, and
- // only upon finalizing the state is the latest value stored as the current
- // bounds via |ApplyPendingBounds|. Measured in DIP because updated in the
- // handler that receives DIP from Wayland.
- gfx::Rect pending_bounds_dip_;
-
- // Contains the current state of the window.
- PlatformWindowState state_;
- // Contains the previous state of the window.
- PlatformWindowState previous_state_;
-
- bool is_active_ = false;
-
- // Id of the chromium app passed through
- // PlatformWindowInitProperties::wm_class_class. This is used by Wayland
- // compositor to identify the app, unite it's windows into the same stack of
- // windows and find *.desktop file to set various preferences including icons.
- std::string app_id_;
-
- // Title of the ShellSurface.
- base::string16 window_title_;
-
- // Max and min sizes of the WaylandSurface window.
- base::Optional<gfx::Size> min_size_;
- base::Optional<gfx::Size> max_size_;
-
- DISALLOW_COPY_AND_ASSIGN(WaylandSurface);
+ WaylandWindow* root_window_ = nullptr;
+ wl::Object<wl_surface> surface_;
+ // Wayland's scale factor for the output that this window currently belongs
+ // to.
+ int32_t buffer_scale_ = 1;
+ friend class WaylandWindow;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc b/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
new file mode 100644
index 00000000000..10ecbcf7b47
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
@@ -0,0 +1,368 @@
+// 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_toplevel_window.h"
+
+#include "ui/base/dragdrop/drag_drop_types.h"
+#include "ui/base/dragdrop/os_exchange_data.h"
+#include "ui/base/hit_test.h"
+#include "ui/gfx/native_widget_types.h"
+#include "ui/ozone/platform/wayland/host/shell_object_factory.h"
+#include "ui/ozone/platform/wayland/host/shell_surface_wrapper.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_data_drag_controller.h"
+#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
+#include "ui/ozone/platform/wayland/host/wayland_window_drag_controller.h"
+#include "ui/platform_window/platform_window_handler/wm_drop_handler.h"
+
+namespace ui {
+
+WaylandToplevelWindow::WaylandToplevelWindow(PlatformWindowDelegate* delegate,
+ WaylandConnection* connection)
+ : WaylandWindow(delegate, connection),
+ state_(PlatformWindowState::kNormal) {
+ // Set a class property key, which allows |this| to be used for interactive
+ // events, e.g. move or resize.
+ SetWmMoveResizeHandler(this, AsWmMoveResizeHandler());
+
+ // Set a class property key, which allows |this| to be used for drag action.
+ SetWmDragHandler(this, this);
+}
+
+WaylandToplevelWindow::~WaylandToplevelWindow() {
+ if (drag_handler_delegate_) {
+ drag_handler_delegate_->OnDragFinished(
+ DragDropTypes::DragOperation::DRAG_NONE);
+ }
+}
+
+bool WaylandToplevelWindow::CreateShellSurface() {
+ ShellObjectFactory factory;
+ shell_surface_ = factory.CreateShellSurfaceWrapper(connection(), this);
+ if (!shell_surface_) {
+ LOG(ERROR) << "Failed to create a ShellSurface.";
+ return false;
+ }
+
+ shell_surface_->SetAppId(app_id_);
+ shell_surface_->SetTitle(window_title_);
+ SetSizeConstraints();
+ TriggerStateChanges();
+ return true;
+}
+
+void WaylandToplevelWindow::ApplyPendingBounds() {
+ if (pending_bounds_dip_.IsEmpty())
+ return;
+ DCHECK(shell_surface_);
+
+ SetBoundsDip(pending_bounds_dip_);
+ shell_surface_->SetWindowGeometry(pending_bounds_dip_);
+ pending_bounds_dip_ = gfx::Rect();
+ connection()->ScheduleFlush();
+}
+
+void WaylandToplevelWindow::DispatchHostWindowDragMovement(
+ int hittest,
+ const gfx::Point& pointer_location_in_px) {
+ DCHECK(shell_surface_);
+
+ connection()->event_source()->ResetPointerFlags();
+ if (hittest == HTCAPTION)
+ shell_surface_->SurfaceMove(connection());
+ else
+ shell_surface_->SurfaceResize(connection(), hittest);
+
+ connection()->ScheduleFlush();
+}
+
+void WaylandToplevelWindow::StartDrag(const ui::OSExchangeData& data,
+ int operation,
+ gfx::NativeCursor cursor,
+ WmDragHandler::Delegate* delegate) {
+ DCHECK(!drag_handler_delegate_);
+ drag_handler_delegate_ = delegate;
+ connection()->data_drag_controller()->StartSession(data, operation);
+}
+
+void WaylandToplevelWindow::Show(bool inactive) {
+ if (shell_surface_)
+ return;
+
+ if (!CreateShellSurface()) {
+ Close();
+ return;
+ }
+
+ UpdateBufferScale(false);
+}
+
+void WaylandToplevelWindow::Hide() {
+ if (!shell_surface_)
+ return;
+
+ if (child_window()) {
+ child_window()->Hide();
+ set_child_window(nullptr);
+ }
+
+ shell_surface_.reset();
+ connection()->ScheduleFlush();
+
+ // Detach buffer from surface in order to completely shutdown menus and
+ // tooltips, and release resources.
+ connection()->buffer_manager_host()->ResetSurfaceContents(GetWidget());
+}
+
+bool WaylandToplevelWindow::IsVisible() const {
+ // X and Windows return true if the window is minimized. For consistency, do
+ // the same.
+ return !!shell_surface_ || state_ == PlatformWindowState::kMinimized;
+}
+
+void WaylandToplevelWindow::SetTitle(const base::string16& title) {
+ if (window_title_ == title)
+ return;
+
+ window_title_ = title;
+
+ if (shell_surface_) {
+ shell_surface_->SetTitle(title);
+ connection()->ScheduleFlush();
+ }
+}
+
+void WaylandToplevelWindow::ToggleFullscreen() {
+ // TODO(msisov, tonikitoo): add multiscreen support. As the documentation says
+ // if xdg_toplevel_set_fullscreen() is not provided with wl_output, it's up
+ // to the compositor to choose which display will be used to map this surface.
+
+ // We must track the previous state to correctly say our state as long as it
+ // can be the maximized instead of normal one.
+ PlatformWindowState new_state = PlatformWindowState::kUnknown;
+ if (state_ == PlatformWindowState::kFullScreen) {
+ if (previous_state_ == PlatformWindowState::kMaximized)
+ new_state = previous_state_;
+ else
+ new_state = PlatformWindowState::kNormal;
+ } else {
+ new_state = PlatformWindowState::kFullScreen;
+ }
+
+ SetWindowState(new_state);
+}
+
+void WaylandToplevelWindow::Maximize() {
+ SetWindowState(PlatformWindowState::kMaximized);
+}
+
+void WaylandToplevelWindow::Minimize() {
+ SetWindowState(PlatformWindowState::kMinimized);
+}
+
+void WaylandToplevelWindow::Restore() {
+ DCHECK(shell_surface_);
+ SetWindowState(PlatformWindowState::kNormal);
+}
+
+PlatformWindowState WaylandToplevelWindow::GetPlatformWindowState() const {
+ return state_;
+}
+
+void WaylandToplevelWindow::SizeConstraintsChanged() {
+ // Size constraints only make sense for normal windows.
+ if (!shell_surface_)
+ return;
+
+ DCHECK(delegate());
+ min_size_ = delegate()->GetMinimumSizeForWindow();
+ max_size_ = delegate()->GetMaximumSizeForWindow();
+ SetSizeConstraints();
+}
+
+void WaylandToplevelWindow::HandleSurfaceConfigure(int32_t width,
+ int32_t height,
+ bool is_maximized,
+ bool is_fullscreen,
+ bool is_activated) {
+ // Store the old state to propagte state changes if Wayland decides to change
+ // the state to something else.
+ PlatformWindowState old_state = state_;
+ if (state_ == PlatformWindowState::kMinimized && !is_activated) {
+ state_ = PlatformWindowState::kMinimized;
+ } else if (is_fullscreen) {
+ state_ = PlatformWindowState::kFullScreen;
+ } else if (is_maximized) {
+ state_ = PlatformWindowState::kMaximized;
+ } else {
+ state_ = PlatformWindowState::kNormal;
+ }
+
+ const bool state_changed = old_state != state_;
+ const bool is_normal = state_ == PlatformWindowState::kNormal;
+
+ // Update state before notifying delegate.
+ const bool did_active_change = is_active_ != is_activated;
+ is_active_ = is_activated;
+
+ // Rather than call SetBounds here for every configure event, just save the
+ // most recent bounds, and have WaylandConnection call ApplyPendingBounds
+ // when it has finished processing events. We may get many configure events
+ // in a row during an interactive resize, and only the last one matters.
+ //
+ // Width or height set to 0 means that we should decide on width and height by
+ // ourselves, but we don't want to set them to anything else. Use restored
+ // bounds size or the current bounds iff the current state is normal (neither
+ // maximized nor fullscreen).
+ //
+ // Note: if the browser was started with --start-fullscreen and a user exits
+ // the fullscreen mode, wayland may set the width and height to be 1. Instead,
+ // explicitly set the bounds to the current desired ones or the previous
+ // bounds.
+ if (width > 1 && height > 1) {
+ pending_bounds_dip_ = gfx::Rect(0, 0, width, height);
+ } else if (is_normal) {
+ pending_bounds_dip_.set_size(
+ gfx::ScaleToRoundedSize(GetRestoredBoundsInPixels().IsEmpty()
+ ? GetBounds().size()
+ : GetRestoredBoundsInPixels().size(),
+
+ 1.0 / buffer_scale()));
+ }
+
+ // Store the restored bounds of current state differs from the normal state.
+ // It can be client or compositor side change from normal to something else.
+ // Thus, we must store previous bounds to restore later.
+ SetOrResetRestoredBounds();
+ ApplyPendingBounds();
+
+ if (state_changed)
+ delegate()->OnWindowStateChanged(state_);
+
+ if (did_active_change)
+ delegate()->OnActivationChanged(is_active_);
+}
+
+void WaylandToplevelWindow::OnDragEnter(const gfx::PointF& point,
+ std::unique_ptr<OSExchangeData> data,
+ int operation) {
+ WmDropHandler* drop_handler = GetWmDropHandler(*this);
+ if (!drop_handler)
+ return;
+
+ // Wayland sends locations in DIP so they need to be translated to
+ // physical pixels.
+ drop_handler->OnDragEnter(
+ gfx::ScalePoint(point, buffer_scale(), buffer_scale()), std::move(data),
+ operation);
+}
+
+int WaylandToplevelWindow::OnDragMotion(const gfx::PointF& point,
+ int operation) {
+ WmDropHandler* drop_handler = GetWmDropHandler(*this);
+ if (!drop_handler)
+ return 0;
+
+ // Wayland sends locations in DIP so they need to be translated to
+ // physical pixels.
+ return drop_handler->OnDragMotion(
+ gfx::ScalePoint(point, buffer_scale(), buffer_scale()), operation);
+}
+
+void WaylandToplevelWindow::OnDragDrop(std::unique_ptr<OSExchangeData> data) {
+ WmDropHandler* drop_handler = GetWmDropHandler(*this);
+ if (!drop_handler)
+ return;
+ drop_handler->OnDragDrop(std::move(data));
+}
+
+void WaylandToplevelWindow::OnDragLeave() {
+ WmDropHandler* drop_handler = GetWmDropHandler(*this);
+ if (!drop_handler)
+ return;
+ drop_handler->OnDragLeave();
+}
+
+void WaylandToplevelWindow::OnDragSessionClose(uint32_t dnd_action) {
+ DCHECK(drag_handler_delegate_);
+ drag_handler_delegate_->OnDragFinished(dnd_action);
+ drag_handler_delegate_ = nullptr;
+ connection()->event_source()->ResetPointerFlags();
+}
+
+bool WaylandToplevelWindow::OnInitialize(
+ PlatformWindowInitProperties properties) {
+ app_id_ = properties.wm_class_class;
+ SetWmMoveLoopHandler(this, static_cast<WmMoveLoopHandler*>(this));
+ return true;
+}
+
+bool WaylandToplevelWindow::RunMoveLoop(const gfx::Vector2d& drag_offset) {
+ DCHECK(connection()->window_drag_controller());
+ return connection()->window_drag_controller()->Drag(this, drag_offset);
+}
+
+void WaylandToplevelWindow::EndMoveLoop() {
+ DCHECK(connection()->window_drag_controller());
+ connection()->window_drag_controller()->StopDragging();
+}
+
+void WaylandToplevelWindow::TriggerStateChanges() {
+ if (!shell_surface_)
+ return;
+
+ if (state_ == PlatformWindowState::kFullScreen)
+ shell_surface_->SetFullscreen();
+ else
+ shell_surface_->UnSetFullscreen();
+
+ // Call UnSetMaximized only if current state is normal. Otherwise, if the
+ // current state is fullscreen and the previous is maximized, calling
+ // UnSetMaximized may result in wrong restored window position that clients
+ // are not allowed to know about.
+ if (state_ == PlatformWindowState::kMaximized)
+ shell_surface_->SetMaximized();
+ else if (state_ == PlatformWindowState::kNormal)
+ shell_surface_->UnSetMaximized();
+
+ if (state_ == PlatformWindowState::kMinimized)
+ shell_surface_->SetMinimized();
+
+ connection()->ScheduleFlush();
+}
+
+void WaylandToplevelWindow::SetWindowState(PlatformWindowState state) {
+ previous_state_ = state_;
+ state_ = state;
+ TriggerStateChanges();
+}
+
+WmMoveResizeHandler* WaylandToplevelWindow::AsWmMoveResizeHandler() {
+ return static_cast<WmMoveResizeHandler*>(this);
+}
+
+void WaylandToplevelWindow::SetSizeConstraints() {
+ if (min_size_.has_value())
+ shell_surface_->SetMinSize(min_size_->width(), min_size_->height());
+ if (max_size_.has_value())
+ shell_surface_->SetMaxSize(max_size_->width(), max_size_->height());
+
+ connection()->ScheduleFlush();
+}
+
+void WaylandToplevelWindow::SetOrResetRestoredBounds() {
+ // The |restored_bounds_| are used when the window gets back to normal
+ // state after it went maximized or fullscreen. So we reset these if the
+ // window has just become normal and store the current bounds if it is
+ // either going out of normal state or simply changes the state and we don't
+ // have any meaningful value stored.
+ if (GetPlatformWindowState() == PlatformWindowState::kNormal) {
+ SetRestoredBoundsInPixels({});
+ } else if (GetRestoredBoundsInPixels().IsEmpty()) {
+ SetRestoredBoundsInPixels(GetBounds());
+ }
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.h b/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.h
new file mode 100644
index 00000000000..0455078ee38
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.h
@@ -0,0 +1,131 @@
+// 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_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_TOPLEVEL_WINDOW_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_TOPLEVEL_WINDOW_H_
+
+#include "ui/gfx/geometry/vector2d.h"
+#include "ui/ozone/platform/wayland/host/wayland_window.h"
+#include "ui/platform_window/platform_window_handler/wm_drag_handler.h"
+#include "ui/platform_window/platform_window_handler/wm_move_loop_handler.h"
+#include "ui/platform_window/platform_window_handler/wm_move_resize_handler.h"
+
+namespace ui {
+
+class ShellSurfaceWrapper;
+
+class WaylandToplevelWindow : public WaylandWindow,
+ public WmMoveResizeHandler,
+ public WmDragHandler,
+ public WmMoveLoopHandler {
+ public:
+ WaylandToplevelWindow(PlatformWindowDelegate* delegate,
+ WaylandConnection* connection);
+ WaylandToplevelWindow(const WaylandToplevelWindow&) = delete;
+ WaylandToplevelWindow& operator=(const WaylandToplevelWindow&) = delete;
+ ~WaylandToplevelWindow() override;
+
+ ShellSurfaceWrapper* shell_surface() const { return shell_surface_.get(); }
+
+ // Apply the bounds specified in the most recent configure event. This should
+ // be called after processing all pending events in the wayland connection.
+ void ApplyPendingBounds();
+
+ // WmMoveResizeHandler
+ void DispatchHostWindowDragMovement(
+ int hittest,
+ const gfx::Point& pointer_location_in_px) override;
+
+ // WmDragHandler
+ void StartDrag(const ui::OSExchangeData& data,
+ int operation,
+ gfx::NativeCursor cursor,
+ WmDragHandler::Delegate* delegate) override;
+
+ // PlatformWindow
+ void Show(bool inactive) override;
+ void Hide() override;
+ bool IsVisible() const override;
+ void SetTitle(const base::string16& title) override;
+ void ToggleFullscreen() override;
+ void Maximize() override;
+ void Minimize() override;
+ void Restore() override;
+ PlatformWindowState GetPlatformWindowState() const override;
+ void SizeConstraintsChanged() override;
+
+ private:
+ // WaylandWindow overrides:
+ void HandleSurfaceConfigure(int32_t widht,
+ int32_t height,
+ bool is_maximized,
+ bool is_fullscreen,
+ bool is_activated) override;
+ void OnDragEnter(const gfx::PointF& point,
+ std::unique_ptr<OSExchangeData> data,
+ int operation) override;
+ int OnDragMotion(const gfx::PointF& point, int operation) override;
+ void OnDragDrop(std::unique_ptr<OSExchangeData> data) override;
+ void OnDragLeave() override;
+ void OnDragSessionClose(uint32_t dnd_action) override;
+ bool OnInitialize(PlatformWindowInitProperties properties) override;
+
+ // WmMoveLoopHandler:
+ bool RunMoveLoop(const gfx::Vector2d& drag_offset) override;
+ void EndMoveLoop() override;
+
+ void TriggerStateChanges();
+ void SetWindowState(PlatformWindowState state);
+
+ // Creates a surface window, which is visible as a main window.
+ bool CreateShellSurface();
+
+ WmMoveResizeHandler* AsWmMoveResizeHandler();
+
+ // Propagates the |min_size_| and |max_size_| to the ShellSurface.
+ void SetSizeConstraints();
+
+ void SetOrResetRestoredBounds();
+
+ // Wrappers around shell surface.
+ std::unique_ptr<ShellSurfaceWrapper> shell_surface_;
+
+ WmDragHandler::Delegate* drag_handler_delegate_ = nullptr;
+
+ // These bounds attributes below have suffices that indicate units used.
+ // Wayland operates in DIP but the platform operates in physical pixels so
+ // our WaylandToplevelWindow is the link that has to translate the units. See
+ // also comments in the implementation.
+ //
+ // Bounds that will be applied when the window state is finalized. The window
+ // may get several configuration events that update the pending bounds, and
+ // only upon finalizing the state is the latest value stored as the current
+ // bounds via |ApplyPendingBounds|. Measured in DIP because updated in the
+ // handler that receives DIP from Wayland.
+ gfx::Rect pending_bounds_dip_;
+
+ // Contains the current state of the window.
+ PlatformWindowState state_;
+ // Contains the previous state of the window.
+ PlatformWindowState previous_state_;
+
+ bool is_active_ = false;
+
+ // Id of the chromium app passed through
+ // PlatformWindowInitProperties::wm_class_class. This is used by Wayland
+ // compositor to identify the app, unite it's windows into the same stack of
+ // windows and find *.desktop file to set various preferences including icons.
+ std::string app_id_;
+
+ // Title of the ShellSurface.
+ base::string16 window_title_;
+
+ // Max and min sizes of the WaylandToplevelWindow window.
+ base::Optional<gfx::Size> min_size_;
+ base::Optional<gfx::Size> max_size_;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_TOPLEVEL_WINDOW_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window.cc b/chromium/ui/ozone/platform/wayland/host/wayland_window.cc
index 9298cb3acbc..21ebb192e5a 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -30,7 +30,7 @@ WaylandWindow::WaylandWindow(PlatformWindowDelegate* delegate,
WaylandWindow::~WaylandWindow() {
PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
- if (surface_)
+ if (surface())
connection_->wayland_window_manager()->RemoveWindow(GetWidget());
if (parent_window_)
@@ -61,7 +61,7 @@ void WaylandWindow::UpdateBufferScale(bool update_bounds) {
int32_t new_scale = 0;
if (parent_window_) {
- new_scale = parent_window_->buffer_scale_;
+ new_scale = parent_window_->buffer_scale();
ui_scale_ = parent_window_->ui_scale_;
} else {
const auto display = (widget == gfx::kNullAcceleratedWidget)
@@ -80,9 +80,7 @@ void WaylandWindow::UpdateBufferScale(bool update_bounds) {
}
gfx::AcceleratedWidget WaylandWindow::GetWidget() const {
- if (!surface_)
- return gfx::kNullAcceleratedWidget;
- return surface_.id();
+ return wayland_surface_.GetWidget();
}
void WaylandWindow::SetPointerFocus(bool focus) {
has_pointer_focus_ = focus;
@@ -163,7 +161,7 @@ void WaylandWindow::Restore() {}
PlatformWindowState WaylandWindow::GetPlatformWindowState() const {
// Remove normal state for all the other types of windows as it's only the
- // WaylandSurface that supports state changes.
+ // WaylandToplevelWindow that supports state changes.
return PlatformWindowState::kNormal;
}
@@ -250,6 +248,12 @@ uint32_t WaylandWindow::DispatchEvent(const PlatformEvent& native_event) {
auto* event_grabber =
connection_->wayland_window_manager()->located_events_grabber();
auto* root_parent_window = GetRootParentWindow();
+
+ // Wayland sends locations in DIP so they need to be translated to
+ // physical pixels.
+ event->AsLocatedEvent()->set_location_f(gfx::ScalePoint(
+ event->AsLocatedEvent()->location_f(), buffer_scale(), buffer_scale()));
+
// We must reroute the events to the event grabber iff these windows belong
// to the same root parent window. For example, there are 2 top level
// Wayland windows. One of them (window_1) has a child menu window that is
@@ -297,9 +301,7 @@ void WaylandWindow::OnDragEnter(const gfx::PointF& point,
std::unique_ptr<OSExchangeData> data,
int operation) {}
-int WaylandWindow::OnDragMotion(const gfx::PointF& point,
- uint32_t time,
- int operation) {
+int WaylandWindow::OnDragMotion(const gfx::PointF& point, int operation) {
return -1;
}
@@ -310,24 +312,26 @@ void WaylandWindow::OnDragLeave() {}
void WaylandWindow::OnDragSessionClose(uint32_t dnd_action) {}
void WaylandWindow::SetBoundsDip(const gfx::Rect& bounds_dip) {
- SetBounds(gfx::ScaleToRoundedRect(bounds_dip, buffer_scale_));
+ SetBounds(gfx::ScaleToRoundedRect(bounds_dip, buffer_scale()));
}
bool WaylandWindow::Initialize(PlatformWindowInitProperties properties) {
// Properties contain DIP bounds but the buffer scale is initially 1 so it's
// OK to assign. The bounds will be recalculated when the buffer scale
// changes.
- DCHECK_EQ(buffer_scale_, 1);
+ DCHECK_EQ(buffer_scale(), 1);
bounds_px_ = properties.bounds;
opacity_ = properties.opacity;
type_ = properties.type;
- surface_.reset(wl_compositor_create_surface(connection_->compositor()));
- if (!surface_) {
+ wayland_surface_.surface_.reset(
+ wl_compositor_create_surface(connection_->compositor()));
+ wayland_surface_.root_window_ = this;
+ if (!surface()) {
LOG(ERROR) << "Failed to create wl_surface";
return false;
}
- wl_surface_set_user_data(surface_.get(), this);
+ wl_surface_set_user_data(surface(), this);
AddSurfaceListener();
connection_->wayland_window_manager()->AddWindow(GetWidget(), this);
@@ -350,16 +354,16 @@ bool WaylandWindow::Initialize(PlatformWindowInitProperties properties) {
void WaylandWindow::SetBufferScale(int32_t new_scale, bool update_bounds) {
DCHECK_GT(new_scale, 0);
- if (new_scale == buffer_scale_)
+ if (new_scale == buffer_scale())
return;
- auto old_scale = buffer_scale_;
- buffer_scale_ = new_scale;
+ auto old_scale = buffer_scale();
+ wayland_surface_.buffer_scale_ = new_scale;
if (update_bounds)
SetBoundsDip(gfx::ScaleToRoundedRect(bounds_px_, 1.0 / old_scale));
DCHECK(surface());
- wl_surface_set_buffer_scale(surface(), buffer_scale_);
+ wl_surface_set_buffer_scale(surface(), buffer_scale());
connection_->ScheduleFlush();
}
@@ -377,11 +381,12 @@ WaylandWindow* WaylandWindow::GetParentWindow(
// Another case is a notifcation window or a drop down window, which do not
// have a parent in aura. In this case, take the current focused window as a
// parent.
- if (parent_window && parent_window->child_window_)
- return parent_window->child_window_;
+
if (!parent_window)
- return connection_->wayland_window_manager()->GetCurrentFocusedWindow();
- return parent_window;
+ parent_window =
+ connection_->wayland_window_manager()->GetCurrentFocusedWindow();
+
+ return parent_window ? parent_window->GetTopMostChildWindow() : nullptr;
}
WaylandWindow* WaylandWindow::GetRootParentWindow() {
@@ -393,7 +398,7 @@ void WaylandWindow::AddSurfaceListener() {
&WaylandWindow::Enter,
&WaylandWindow::Leave,
};
- wl_surface_add_listener(surface_.get(), &surface_listener, this);
+ wl_surface_add_listener(surface(), &surface_listener, this);
}
void WaylandWindow::AddEnteredOutputId(struct wl_output* output) {
@@ -468,6 +473,10 @@ WaylandWindow* WaylandWindow::GetTopLevelWindow() {
return parent_window_ ? parent_window_->GetTopLevelWindow() : this;
}
+WaylandWindow* WaylandWindow::GetTopMostChildWindow() {
+ return child_window_ ? child_window_->GetTopMostChildWindow() : this;
+}
+
void WaylandWindow::MaybeUpdateOpaqueRegion() {
if (!IsOpaqueWindow())
return;
@@ -490,10 +499,10 @@ uint32_t WaylandWindow::DispatchEventToDelegate(
if (event->IsLocatedEvent())
UpdateCursorPositionFromEvent(Event::Clone(*event));
- DispatchEventFromNativeUiEvent(
+ bool handled = DispatchEventFromNativeUiEvent(
native_event, base::BindOnce(&PlatformWindowDelegate::DispatchEvent,
base::Unretained(delegate_)));
- return POST_DISPATCH_STOP_PROPAGATION;
+ return handled ? POST_DISPATCH_STOP_PROPAGATION : POST_DISPATCH_NONE;
}
// static
@@ -502,7 +511,7 @@ void WaylandWindow::Enter(void* data,
struct wl_output* output) {
auto* window = static_cast<WaylandWindow*>(data);
if (window) {
- DCHECK(window->surface_.get() == wl_surface);
+ DCHECK(window->surface() == wl_surface);
window->AddEnteredOutputId(output);
}
}
@@ -513,7 +522,7 @@ void WaylandWindow::Leave(void* data,
struct wl_output* output) {
auto* window = static_cast<WaylandWindow*>(data);
if (window) {
- DCHECK(window->surface_.get() == wl_surface);
+ DCHECK(window->surface() == wl_surface);
window->RemoveEnteredOutputId(output);
}
}
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window.h b/chromium/ui/ozone/platform/wayland/host/wayland_window.h
index 43cfa54d4cc..9c42eb59c80 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window.h
@@ -17,6 +17,7 @@
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
+#include "ui/ozone/platform/wayland/host/wayland_surface.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"
@@ -36,7 +37,7 @@ class WaylandWindow : public PlatformWindow, public PlatformEventDispatcher {
~WaylandWindow() override;
// A factory method that can create any of the derived types of WaylandWindow
- // (WaylandSurface, WaylandPopup and WaylandSubsurface).
+ // (WaylandToplevelWindow, WaylandPopup and WaylandSubsurface).
static std::unique_ptr<WaylandWindow> Create(
PlatformWindowDelegate* delegate,
WaylandConnection* connection,
@@ -53,7 +54,8 @@ class WaylandWindow : public PlatformWindow, public PlatformEventDispatcher {
// to do so (this is not needed upon window initialization).
void UpdateBufferScale(bool update_bounds);
- wl_surface* surface() const { return surface_.get(); }
+ WaylandSurface* wayland_surface() { return &wayland_surface_; }
+ wl_surface* surface() const { return wayland_surface_.surface(); }
void set_parent_window(WaylandWindow* parent_window) {
parent_window_ = parent_window;
@@ -80,7 +82,7 @@ class WaylandWindow : public PlatformWindow, public PlatformEventDispatcher {
void set_child_window(WaylandWindow* window) { child_window_ = window; }
WaylandWindow* child_window() const { return child_window_; }
- int32_t buffer_scale() const { return buffer_scale_; }
+ int32_t buffer_scale() const { return wayland_surface_.buffer_scale(); }
int32_t ui_scale() const { return ui_scale_; }
const base::flat_set<uint32_t>& entered_outputs_ids() const {
@@ -144,12 +146,17 @@ class WaylandWindow : public PlatformWindow, public PlatformEventDispatcher {
std::unique_ptr<OSExchangeData> data,
int operation);
virtual int OnDragMotion(const gfx::PointF& point,
- uint32_t time,
int operation);
virtual void OnDragDrop(std::unique_ptr<OSExchangeData> data);
virtual void OnDragLeave();
virtual void OnDragSessionClose(uint32_t dnd_action);
+ // Returns a root parent window within the same hierarchy.
+ WaylandWindow* GetRootParentWindow();
+
+ // Returns a top most child window within the same hierarchy.
+ WaylandWindow* GetTopMostChildWindow();
+
protected:
WaylandWindow(PlatformWindowDelegate* delegate,
WaylandConnection* connection);
@@ -175,9 +182,6 @@ class WaylandWindow : public PlatformWindow, public PlatformEventDispatcher {
// Initializes the WaylandWindow with supplied properties.
bool Initialize(PlatformWindowInitProperties properties);
- // Returns a root parent window.
- WaylandWindow* GetRootParentWindow();
-
// Install a surface listener and start getting wl_output enter/leave events.
void AddSurfaceListener();
@@ -212,7 +216,7 @@ class WaylandWindow : public PlatformWindow, public PlatformEventDispatcher {
WaylandWindow* parent_window_ = nullptr;
WaylandWindow* child_window_ = nullptr;
- wl::Object<wl_surface> surface_;
+ WaylandSurface wayland_surface_;
// The current cursor bitmap (immutable).
scoped_refptr<BitmapCursorOzone> bitmap_;
@@ -225,9 +229,6 @@ class WaylandWindow : public PlatformWindow, public PlatformEventDispatcher {
bool has_pointer_focus_ = false;
bool has_keyboard_focus_ = false;
bool has_touch_focus_ = false;
- // Wayland's scale factor for the output that this window currently belongs
- // to.
- int32_t buffer_scale_ = 1;
// The UI scale may be forced through the command line, which means that it
// replaces the default value that is equal to the natural device scale.
// We need it to place and size the menus properly.
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
new file mode 100644
index 00000000000..08d5cb633ca
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc
@@ -0,0 +1,325 @@
+// 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_window_drag_controller.h"
+
+#include <cstdint>
+#include <memory>
+#include <ostream>
+#include <utility>
+
+#include "base/callback.h"
+#include "base/check.h"
+#include "base/memory/weak_ptr.h"
+#include "base/message_loop/message_loop_current.h"
+#include "base/notreached.h"
+#include "base/run_loop.h"
+#include "ui/base/dragdrop/drag_drop_types.h"
+#include "ui/events/event.h"
+#include "ui/events/event_constants.h"
+#include "ui/events/platform/platform_event_dispatcher.h"
+#include "ui/events/platform/platform_event_source.h"
+#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_f.h"
+#include "ui/gfx/geometry/vector2d.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"
+#include "ui/ozone/platform/wayland/host/wayland_data_offer.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
+#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
+#include "ui/ozone/platform/wayland/host/wayland_pointer.h"
+#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"
+
+namespace ui {
+
+namespace {
+
+// Custom mime type used for window dragging DND sessions.
+constexpr char kMimeTypeChromiumWindow[] = "chromium/x-window";
+
+// DND action used in window dragging DND sessions.
+constexpr uint32_t kDndActionWindowDrag =
+ WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE;
+
+} // namespace
+
+WaylandWindowDragController::WaylandWindowDragController(
+ WaylandConnection* connection,
+ WaylandDataDeviceManager* device_manager,
+ WaylandPointer::Delegate* pointer_delegate)
+ : connection_(connection),
+ data_device_manager_(device_manager),
+ data_device_(device_manager->GetDevice()),
+ window_manager_(connection_->wayland_window_manager()),
+ pointer_delegate_(pointer_delegate) {
+ DCHECK(data_device_);
+ DCHECK(pointer_delegate_);
+}
+
+WaylandWindowDragController::~WaylandWindowDragController() = default;
+
+bool WaylandWindowDragController::Drag(WaylandToplevelWindow* window,
+ const gfx::Vector2d& offset) {
+ DCHECK_LE(state_, State::kAttached);
+ DCHECK(window);
+
+ if (!OfferWindow())
+ return false;
+
+ DCHECK_EQ(state_, State::kAttached);
+ dragged_window_ = window;
+ drag_offset_ = offset;
+ RunLoop();
+
+ DCHECK(state_ == State::kAttached || state_ == State::kDropped);
+ bool dropped = state_ == State::kDropped;
+ if (dropped)
+ HandleDropAndResetState();
+ return dropped;
+}
+
+void WaylandWindowDragController::StopDragging() {
+ if (state_ != State::kDetached)
+ return;
+
+ VLOG(1) << "End drag loop requested. state=" << state_;
+
+ // This function is supposed to be called to indicate that the window was just
+ // snapped into a tab strip. So switch to |kAttached| state and ask to quit
+ // the nested loop.
+ state_ = State::kAttached;
+ QuitLoop();
+}
+
+bool WaylandWindowDragController::IsDragSource() const {
+ DCHECK(data_source_);
+ return true;
+}
+
+// Icon drawing and update for window/tab dragging is handled by buffer manager.
+void WaylandWindowDragController::DrawIcon() {}
+
+void WaylandWindowDragController::OnDragOffer(
+ std::unique_ptr<WaylandDataOffer> offer) {
+ DCHECK_GE(state_, State::kAttached);
+ DCHECK(offer);
+ DCHECK(!data_offer_);
+ data_offer_ = std::move(offer);
+}
+
+void WaylandWindowDragController::OnDragEnter(WaylandWindow* window,
+ const gfx::PointF& location,
+ uint32_t serial) {
+ DCHECK_GE(state_, State::kAttached);
+ DCHECK(window);
+
+ // Forward focus change event to the input delegate, so other components, such
+ // as WaylandScreen, are able to properly retrieve focus related info during
+ // window dragging sesstions.
+ pointer_delegate_->OnPointerFocusChanged(window, location);
+
+ VLOG(1) << "OnEnter. widget=" << window->GetWidget();
+
+ // Ensure this is a valid "window drag" offer.
+ DCHECK(data_offer_);
+ DCHECK_EQ(data_offer_->mime_types().size(), 1u);
+ DCHECK_EQ(data_offer_->mime_types().front(), kMimeTypeChromiumWindow);
+
+ // Accept the offer and set the dnd action.
+ data_offer_->SetAction(kDndActionWindowDrag, kDndActionWindowDrag);
+ data_offer_->Accept(serial, kMimeTypeChromiumWindow);
+}
+
+void WaylandWindowDragController::OnDragMotion(const gfx::PointF& location) {
+ DCHECK_GE(state_, State::kAttached);
+ VLOG(2) << "OnMotion. location=" << location.ToString();
+
+ // Forward cursor location update info to the input handling delegate.
+ pointer_delegate_->OnPointerMotionEvent(location);
+}
+
+void WaylandWindowDragController::OnDragLeave() {
+ DCHECK_GE(state_, State::kAttached);
+ DCHECK_LE(state_, State::kDetached);
+
+ // In order to guarantee ET_MOUSE_RELEASED event is delivered once the DND
+ // session finishes, the focused window is not reset here. This is similar to
+ // the "implicit grab" behavior implemented by Wayland compositors for
+ // wl_pointer events. Additionally, this makes it possible for the drag
+ // controller to overcome deviations in the order that wl_data_source and
+ // wl_pointer events arrive when the drop happens. For example, unlike Weston
+ // and Sway, Gnome Shell <= 2.26 sends them in the following order:
+ //
+ // wl_data_device.leave > wl_pointer.enter > wl_data_source.cancel/finish
+ //
+ // which would require hacky workarounds in HandleDropAndResetState function
+ // to properly detect and handle such cases.
+
+ VLOG(1) << "OnLeave";
+
+ data_offer_.reset();
+}
+
+void WaylandWindowDragController::OnDragDrop() {
+ // Not used for window dragging sessions. Handling of drop events is fully
+ // done at OnDataSourceFinish function, i.e: wl_data_source::{cancel,finish}.
+}
+
+void WaylandWindowDragController::OnDataSourceFinish(bool completed) {
+ DCHECK_GE(state_, State::kAttached);
+ DCHECK(data_source_);
+
+ VLOG(1) << "Drop received. state=" << state_;
+
+ // Release DND objects.
+ data_offer_.reset();
+ data_source_.reset();
+ icon_surface_.reset();
+ dragged_window_ = nullptr;
+
+ // Transition to |kDropped| state and determine the next action to take. If
+ // drop happened while the move loop was running (i.e: kDetached), ask to quit
+ // the loop, otherwise notify session end and reset state right away.
+ State state_when_dropped = std::exchange(state_, State::kDropped);
+ if (state_when_dropped == State::kDetached)
+ QuitLoop();
+ else
+ HandleDropAndResetState();
+
+ data_device_->ResetDragDelegate();
+}
+
+void WaylandWindowDragController::OnDataSourceSend(const std::string& mime_type,
+ std::string* contents) {
+ // There is no actual data exchange in DnD window dragging sessions. Window
+ // snapping, for example, is supposed to be handled at higher level UI layers.
+}
+
+bool WaylandWindowDragController::CanDispatchEvent(const PlatformEvent& event) {
+ return state_ == State::kDetached;
+}
+
+uint32_t WaylandWindowDragController::DispatchEvent(
+ const PlatformEvent& event) {
+ DCHECK_EQ(state_, State::kDetached);
+ DCHECK(base::MessageLoopCurrentForUI::IsSet());
+
+ VLOG(2) << "Dispatch. event=" << event->GetName();
+
+ if (event->type() == ET_MOUSE_MOVED || event->type() == ET_MOUSE_DRAGGED) {
+ HandleMotionEvent(event->AsMouseEvent());
+ return POST_DISPATCH_STOP_PROPAGATION;
+ }
+ return POST_DISPATCH_PERFORM_DEFAULT;
+}
+
+bool WaylandWindowDragController::OfferWindow() {
+ DCHECK_LE(state_, State::kAttached);
+
+ auto* window = window_manager_->GetCurrentFocusedWindow();
+ if (!window) {
+ LOG(ERROR) << "Failed to get focused window.";
+ return false;
+ }
+
+ if (!data_source_)
+ data_source_ = data_device_manager_->CreateSource(this);
+
+ if (state_ == State::kIdle) {
+ DCHECK(!icon_surface_);
+ icon_surface_.reset(
+ wl_compositor_create_surface(connection_->compositor()));
+
+ VLOG(1) << "Starting DND session.";
+ state_ = State::kAttached;
+ data_source_->Offer({kMimeTypeChromiumWindow});
+ data_source_->SetAction(DragDropTypes::DRAG_MOVE);
+ data_device_->StartDrag(*data_source_, *window, icon_surface_.get(), this);
+ }
+ return true;
+}
+
+void WaylandWindowDragController::HandleMotionEvent(MouseEvent* event) {
+ DCHECK_EQ(state_, State::kDetached);
+ DCHECK(dragged_window_);
+ DCHECK(event);
+
+ // Update current cursor position, so it can be retrieved later on through
+ // |Screen::GetCursorScreenPoint| API.
+ int32_t scale = dragged_window_->buffer_scale();
+ gfx::PointF scaled_location =
+ gfx::ScalePoint(event->location_f(), scale, scale);
+ connection_->wayland_cursor_position()->OnCursorPositionChanged(
+ gfx::ToFlooredPoint(scaled_location));
+
+ // Notify listeners about window bounds change (i.e: re-positioning) event.
+ // To do so, set the new bounds as per the motion event location and the drag
+ // offset. Note that setting a new location (i.e: bounds.origin()) for a
+ // surface has no visual effect in ozone/wayland backend. Actual window
+ // re-positioning during dragging session is done through the drag icon.
+ gfx::Point new_location = event->location() - drag_offset_;
+ gfx::Size size = dragged_window_->GetBounds().size();
+ dragged_window_->SetBounds({new_location, size});
+}
+
+// Dispatch mouse release event (to tell clients that the drop just happened)
+// clear focus and reset internal state. Must be called when the session is
+// about to finish.
+void WaylandWindowDragController::HandleDropAndResetState() {
+ DCHECK_EQ(state_, State::kDropped);
+ DCHECK(window_manager_->GetCurrentFocusedWindow());
+ VLOG(1) << "Notifying drop. window="
+ << window_manager_->GetCurrentFocusedWindow();
+
+ EventFlags pointer_button = EF_LEFT_MOUSE_BUTTON;
+ DCHECK(connection_->event_source()->IsPointerButtonPressed(pointer_button));
+ pointer_delegate_->OnPointerButtonEvent(ET_MOUSE_RELEASED, pointer_button);
+
+ state_ = State::kIdle;
+}
+
+void WaylandWindowDragController::RunLoop() {
+ DCHECK_EQ(state_, State::kAttached);
+ DCHECK(dragged_window_);
+
+ VLOG(1) << "Starting drag loop. widget=" << dragged_window_->GetWidget();
+
+ // 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();
+
+ if (!alive)
+ return;
+
+ nested_dispatcher_ = std::move(old_dispatcher);
+
+ VLOG(1) << "Quitting drag loop " << state_;
+}
+
+void WaylandWindowDragController::QuitLoop() {
+ DCHECK(!quit_loop_closure_.is_null());
+
+ nested_dispatcher_.reset();
+ std::move(quit_loop_closure_).Run();
+}
+
+std::ostream& operator<<(std::ostream& out,
+ WaylandWindowDragController::State state) {
+ return out << static_cast<int>(state);
+}
+
+} // namespace ui
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
new file mode 100644
index 00000000000..071cc9672bc
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.h
@@ -0,0 +1,126 @@
+// 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_WINDOW_DRAG_CONTROLLER_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_WINDOW_DRAG_CONTROLLER_H_
+
+#include <cstdint>
+#include <iosfwd>
+#include <memory>
+#include <string>
+
+#include "base/callback_forward.h"
+#include "base/memory/weak_ptr.h"
+#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/vector2d.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"
+#include "ui/ozone/platform/wayland/host/wayland_pointer.h"
+#include "ui/ozone/platform/wayland/host/wayland_toplevel_window.h"
+
+namespace ui {
+
+class WaylandConnection;
+class WaylandDataDeviceManager;
+class WaylandDataOffer;
+class WaylandWindow;
+class WaylandWindowManager;
+
+// Drag controller implementation that drives window moving sessions (aka: tab
+// dragging). Wayland Drag and Drop protocol is used, under the hood, to keep
+// track of cursor location and surface focus.
+//
+// TODO(crbug.com/896640): Use drag icon to emulate window moving.
+class WaylandWindowDragController : public WaylandDataDevice::DragDelegate,
+ public WaylandDataSource::Delegate,
+ public PlatformEventDispatcher {
+ public:
+ // Constants used to keep track of the drag controller state.
+ enum class State {
+ kIdle, // No DnD session nor drag loop running.
+ kAttached, // DnD session ongoing but no drag loop running.
+ kDetached, // Drag loop running. ie: blocked in a Drag() call.
+ kDropped // Drop event was just received.
+ };
+
+ WaylandWindowDragController(WaylandConnection* connection,
+ WaylandDataDeviceManager* device_manager,
+ WaylandPointer::Delegate* pointer_delegate);
+ WaylandWindowDragController(const WaylandWindowDragController&) = delete;
+ WaylandWindowDragController& operator=(const WaylandWindowDragController&) =
+ delete;
+ ~WaylandWindowDragController() override;
+
+ bool Drag(WaylandToplevelWindow* surface, const gfx::Vector2d& offset);
+ void StopDragging();
+
+ State state() const { return state_; }
+
+ private:
+ // WaylandDataDevice::DragDelegate:
+ bool IsDragSource() const override;
+ void DrawIcon() override;
+ void OnDragOffer(std::unique_ptr<WaylandDataOffer> offer) override;
+ void OnDragEnter(WaylandWindow* window,
+ const gfx::PointF& location,
+ uint32_t serial) override;
+ void OnDragMotion(const gfx::PointF& location) override;
+ void OnDragLeave() override;
+ void OnDragDrop() override;
+
+ // WaylandDataSource::Delegate
+ void OnDataSourceFinish(bool completed) override;
+ void OnDataSourceSend(const std::string& mime_type,
+ std::string* contents) override;
+
+ // PlatformEventDispatcher
+ bool CanDispatchEvent(const PlatformEvent& event) override;
+ uint32_t DispatchEvent(const PlatformEvent& event) override;
+
+ // Offers the focused window as available to be dragged. A new data source is
+ // setup and the underlying DnD session is started, if not done yet.
+ bool OfferWindow();
+ // Handles drag/move mouse |event|, while in |kDetached| mode, forwarding it
+ // as a bounds change event to the upper layer handlers.
+ void HandleMotionEvent(MouseEvent* event);
+ // Handles the mouse button release (i.e: drop). Dispatches the required
+ // events and resets the internal state.
+ void HandleDropAndResetState();
+ // Registers as the top level PlatformEvent dispatcher and runs a nested
+ // RunLoop, which blocks until the DnD session finishes.
+ void RunLoop();
+ // Unregisters the internal event dispatcher and asks to quit the nested loop.
+ void QuitLoop();
+
+ WaylandConnection* const connection_;
+ WaylandDataDeviceManager* const data_device_manager_;
+ WaylandDataDevice* const data_device_;
+ WaylandWindowManager* const window_manager_;
+ WaylandPointer::Delegate* const pointer_delegate_;
+
+ State state_ = State::kIdle;
+ WaylandToplevelWindow* dragged_window_ = nullptr;
+ gfx::Vector2d drag_offset_;
+
+ std::unique_ptr<WaylandDataSource> data_source_;
+ std::unique_ptr<WaylandDataOffer> data_offer_;
+ wl::Object<wl_surface> icon_surface_;
+
+ std::unique_ptr<ScopedEventDispatcher> nested_dispatcher_;
+ base::OnceClosure quit_loop_closure_;
+
+ base::WeakPtrFactory<WaylandWindowDragController> weak_factory_{this};
+};
+
+// Stream operator so WaylandWindowDragController::State can be used in
+// log/assertion statements.
+std::ostream& operator<<(std::ostream& out,
+ WaylandWindowDragController::State state);
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_WINDOW_DRAG_CONTROLLER_H_
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
new file mode 100644
index 00000000000..56a13b46e48
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc
@@ -0,0 +1,519 @@
+// 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 <linux/input-event-codes.h>
+#include <wayland-server-protocol.h>
+#include <wayland-server.h>
+#include <wayland-util.h>
+
+#include <cstdint>
+
+#include "base/notreached.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/events/base_event_utils.h"
+#include "ui/events/event.h"
+#include "ui/events/types/event_type.h"
+#include "ui/gfx/geometry/point.h"
+#include "ui/gfx/native_widget_types.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_device.h"
+#include "ui/ozone/platform/wayland/host/wayland_screen.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_window_manager.h"
+#include "ui/ozone/platform/wayland/test/constants.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_data_device.h"
+#include "ui/ozone/platform/wayland/test/test_data_device_manager.h"
+#include "ui/ozone/platform/wayland/test/test_data_offer.h"
+#include "ui/ozone/platform/wayland/test/test_data_source.h"
+#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_delegate.h"
+#include "ui/platform_window/platform_window_handler/wm_move_loop_handler.h"
+
+using testing::_;
+using testing::Mock;
+
+namespace ui {
+
+class WaylandWindowDragControllerTest : public WaylandTest,
+ public wl::TestDataDevice::Delegate {
+ public:
+ WaylandWindowDragControllerTest() = default;
+ ~WaylandWindowDragControllerTest() override = default;
+
+ void SetUp() override {
+ WaylandTest::SetUp();
+ screen_ = std::make_unique<WaylandScreen>(connection_.get());
+
+ wl_seat_send_capabilities(server_.seat()->resource(),
+ WL_SEAT_CAPABILITY_POINTER);
+ Sync();
+ pointer_ = server_.seat()->pointer();
+ ASSERT_TRUE(pointer_);
+
+ EXPECT_FALSE(window_->has_pointer_focus());
+ EXPECT_EQ(State::kIdle, drag_controller()->state());
+
+ data_device_manager_ = server_.data_device_manager();
+ DCHECK(data_device_manager_);
+
+ source_ = nullptr;
+ data_device_manager_->data_device()->set_delegate(this);
+ }
+
+ void TearDown() override {
+ data_device_manager_->data_device()->set_delegate(nullptr);
+ }
+
+ WaylandWindowDragController* drag_controller() const {
+ return connection_->window_drag_controller();
+ }
+
+ WaylandWindowManager* window_manager() const {
+ return connection_->wayland_window_manager();
+ }
+
+ uint32_t NextSerial() const {
+ static uint32_t serial = 0;
+ return ++serial;
+ }
+
+ uint32_t NextTime() const {
+ static uint32_t timestamp = 0;
+ return ++timestamp;
+ }
+
+ protected:
+ using State = WaylandWindowDragController::State;
+
+ // wl::TestDataDevice::Delegate:
+ void StartDrag(wl::TestDataSource* source,
+ wl::MockSurface* origin,
+ uint32_t serial) override {
+ EXPECT_FALSE(source_);
+ source_ = source;
+ OfferAndEnter(origin);
+ }
+
+ // Helper functions
+ void SendDndMotion(const gfx::Point& location) {
+ EXPECT_TRUE(source_);
+ wl_fixed_t x = wl_fixed_from_int(location.x());
+ wl_fixed_t y = wl_fixed_from_int(location.y());
+ data_device_manager_->data_device()->OnMotion(NextTime(), x, y);
+ }
+
+ void SendDndEnter(WaylandWindow* window) {
+ EXPECT_TRUE(window);
+ OfferAndEnter(server_.GetObject<wl::MockSurface>(window->GetWidget()));
+ }
+
+ void SendDndLeave() {
+ EXPECT_TRUE(source_);
+ data_device_manager_->data_device()->OnLeave();
+ }
+
+ void SendDndDrop() {
+ EXPECT_TRUE(source_);
+ source_->OnCancelled();
+ }
+
+ void SendPointerEnter(WaylandWindow* window,
+ MockPlatformWindowDelegate* delegate) {
+ auto* surface = server_.GetObject<wl::MockSurface>(window->GetWidget());
+ wl_pointer_send_enter(pointer_->resource(), NextSerial(),
+ surface->resource(), 0, 0);
+ EXPECT_CALL(*delegate, DispatchEvent(_)).Times(1);
+ Sync();
+
+ EXPECT_EQ(window, window_manager()->GetCurrentFocusedWindow());
+ }
+
+ void SendPointerPress(WaylandWindow* window,
+ MockPlatformWindowDelegate* delegate,
+ int button) {
+ wl_pointer_send_button(pointer_->resource(), NextSerial(), NextTime(),
+ button, WL_POINTER_BUTTON_STATE_PRESSED);
+ EXPECT_CALL(*delegate, DispatchEvent(_)).Times(1);
+ Sync();
+
+ EXPECT_EQ(window, window_manager()->GetCurrentFocusedWindow());
+ }
+
+ void SendPointerMotion(WaylandWindow* window,
+ MockPlatformWindowDelegate* delegate,
+ gfx::Point location) {
+ 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);
+ EXPECT_CALL(*delegate, DispatchEvent(_)).WillOnce([](Event* event) {
+ EXPECT_TRUE(event->IsMouseEvent());
+ EXPECT_EQ(ET_MOUSE_DRAGGED, event->type());
+ });
+ Sync();
+
+ EXPECT_EQ(window->GetWidget(),
+ screen_->GetLocalProcessWidgetAtPoint(location, {}));
+ }
+
+ void OfferAndEnter(wl::MockSurface* surface) {
+ EXPECT_TRUE(source_);
+ auto* data_device = data_device_manager_->data_device();
+ auto* offer = data_device->OnDataOffer();
+ EXPECT_EQ(1u, source_->mime_types().size());
+ for (const auto& mime_type : source_->mime_types())
+ offer->OnOffer(mime_type, {});
+
+ wl_data_device_send_enter(data_device->resource(), NextSerial(),
+ surface->resource(), 0, 0, offer->resource());
+ }
+
+ // client objects
+ std::unique_ptr<WaylandScreen> screen_;
+
+ // server objects
+ wl::TestDataDeviceManager* data_device_manager_;
+ wl::TestDataSource* source_;
+ wl::MockPointer* pointer_;
+};
+
+// 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 within the window bounds and drop.
+TEST_P(WaylandWindowDragControllerTest, DragInsideWindowAndDrop) {
+ // Ensure there is no window currently focused
+ EXPECT_FALSE(window_manager()->GetCurrentFocusedWindow());
+ EXPECT_EQ(gfx::kNullAcceleratedWidget,
+ screen_->GetLocalProcessWidgetAtPoint({10, 10}, {}));
+
+ SendPointerEnter(window_.get(), &delegate_);
+ SendPointerPress(window_.get(), &delegate_, BTN_LEFT);
+ SendPointerMotion(window_.get(), &delegate_, {10, 10});
+
+ // Set up an "interaction flow" and RunMoveLoop:
+ // - 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* 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({10, 10}, {}));
+ // Drag it a bit more.
+ SendDndMotion({20, 20});
+ test_step = kDragging;
+ break;
+ case kDropping:
+ EXPECT_EQ(ET_MOUSE_RELEASED, event->type());
+ EXPECT_EQ(State::kDropped, drag_controller()->state());
+ // Ensure PlatformScreen keeps consistent.
+ EXPECT_EQ(gfx::Point(20, 20), screen_->GetCursorScreenPoint());
+ EXPECT_EQ(window_->GetWidget(),
+ screen_->GetLocalProcessWidgetAtPoint({20, 20}, {}));
+ test_step = kDone;
+ break;
+ case kDone:
+ EXPECT_EQ(ET_MOUSE_EXITED, event->type());
+ EXPECT_EQ(window_->GetWidget(),
+ screen_->GetLocalProcessWidgetAtPoint({20, 20}, {}));
+ break;
+ case kDragging:
+ default:
+ FAIL() << " event=" << event->GetName()
+ << " 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(20, 20), bounds.origin());
+
+ 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({20, 20}, {}));
+}
+
+// Check the following flow works as expected:
+// 1. With only 1 window open;
+// 2. Move pointer into it, press left button, move cursor a bit (drag);
+// 3. Run move loop,
+// 4. Drag pointer to outside the window and release the mouse button, and make
+// sure RELEASE and EXIT mouse events are delivered even when the drop
+// happens outside the bounds of any surface.
+TEST_P(WaylandWindowDragControllerTest, DragExitWindowAndDrop) {
+ // Ensure there is no window currently focused
+ EXPECT_FALSE(window_manager()->GetCurrentFocusedWindow());
+ EXPECT_EQ(gfx::kNullAcceleratedWidget,
+ screen_->GetLocalProcessWidgetAtPoint({10, 10}, {}));
+
+ SendPointerEnter(window_.get(), &delegate_);
+ SendPointerPress(window_.get(), &delegate_, BTN_LEFT);
+ SendPointerMotion(window_.get(), &delegate_, {10, 10});
+
+ // Sets up an "interaction flow" and RunMoveLoop:
+ // - Event dispatching and bounds changes are monitored
+ // - At each event, emulates a new event on server side and proceeds to the
+ // next test step.
+ auto* move_loop_handler = GetWmMoveLoopHandler(*window_);
+ DCHECK(move_loop_handler);
+
+ enum {
+ kStarted,
+ kDragging,
+ kExitedWindow,
+ 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({10, 10}, {}));
+ // Drag window a bit more.
+ SendDndMotion({20, 20});
+ test_step = kDragging;
+ break;
+ case kExitedWindow:
+ EXPECT_EQ(ET_MOUSE_EXITED, event->type());
+ // Release mouse button with no window foucsed.
+ SendDndDrop();
+ test_step = kDropping;
+ break;
+ case kDropping:
+ EXPECT_EQ(ET_MOUSE_RELEASED, event->type());
+ EXPECT_EQ(State::kDropped, drag_controller()->state());
+ // Ensure PlatformScreen keeps consistent.
+ EXPECT_EQ(gfx::Point(20, 20), screen_->GetCursorScreenPoint());
+ EXPECT_EQ(window_->GetWidget(),
+ screen_->GetLocalProcessWidgetAtPoint({20, 20}, {}));
+ test_step = kDone;
+ break;
+ case kDone:
+ EXPECT_EQ(ET_MOUSE_EXITED, event->type());
+ break;
+ case kDragging:
+ default:
+ FAIL() << " event=" << event->GetName()
+ << " 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(20, 20), bounds.origin());
+
+ SendDndDrop();
+ test_step = kDropping;
+ });
+
+ // RunMoveLoop() blocks until the dragging sessions 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({20, 20}, {}));
+}
+
+// Check the following flow works as expected:
+// 1. With 2 windows open,
+// 2. Focus window 1, starts dragging,
+// 3. Run move loop,
+// 4. Drag the pointer out of window 1 and then into window 2,
+// 5. Drag it a bit more (within window 2) and then calls EndMoveLoop(),
+// emulating a window snap), and then
+// 6. With the window in "snapped" state, drag it further and then drop.
+TEST_P(WaylandWindowDragControllerTest, DragToOtherWindowSnapDragDrop) {
+ // Init and open |target_window|.
+ PlatformWindowInitProperties properties{gfx::Rect{80, 80}};
+ properties.type = PlatformWindowType::kWindow;
+ EXPECT_CALL(delegate_, OnAcceleratedWidgetAvailable(_)).Times(1);
+ auto window_2 = WaylandWindow::Create(&delegate_, connection_.get(),
+ std::move(properties));
+ ASSERT_NE(gfx::kNullAcceleratedWidget, window_2->GetWidget());
+ Sync();
+
+ // Ensure there is no window currently focused
+ EXPECT_FALSE(window_manager()->GetCurrentFocusedWindow());
+ EXPECT_EQ(gfx::kNullAcceleratedWidget,
+ screen_->GetLocalProcessWidgetAtPoint({10, 10}, {}));
+
+ auto* source_window = window_.get();
+ auto* target_window = window_2.get();
+ EXPECT_TRUE(source_window);
+ EXPECT_TRUE(target_window);
+
+ SendPointerEnter(source_window, &delegate_);
+ SendPointerPress(source_window, &delegate_, BTN_LEFT);
+ SendPointerMotion(source_window, &delegate_, {10, 10});
+
+ // Sets up an "interaction flow" and RunMoveLoop:
+ // - Event dispatching and bounds changes are monitored
+ // - At each event, emulates a new event on server side and proceeds to the
+ // next test step.
+ auto* move_loop_handler = GetWmMoveLoopHandler(*window_);
+ DCHECK(move_loop_handler);
+
+ enum {
+ kStarted,
+ kDragging,
+ kEnteredTarget,
+ kSnapped,
+ 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(source_window->GetWidget(),
+ screen_->GetLocalProcessWidgetAtPoint({10, 10}, {}));
+ // Drag window a bit more.
+ SendDndMotion({50, 50});
+ test_step = kDragging;
+ break;
+ case kEnteredTarget:
+ EXPECT_EQ(ET_MOUSE_ENTERED, event->type());
+ EXPECT_EQ(State::kDetached, drag_controller()->state());
+ // Ensure PlatformScreen keeps consistent.
+ EXPECT_EQ(target_window->GetWidget(),
+ screen_->GetLocalProcessWidgetAtPoint({10, 10}, {}));
+
+ move_loop_handler->EndMoveLoop();
+ test_step = kSnapped;
+ break;
+ default:
+ FAIL() << " event=" << event->GetName()
+ << " 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(50, 50), bounds.origin());
+
+ // Exit |source_window| and enter the |target_window|.
+ SendDndLeave();
+ SendDndEnter(target_window);
+ test_step = kEnteredTarget;
+ });
+
+ // RunMoveLoop() blocks until the dragging sessions ends, so resume test
+ // server's run loop until it returns.
+ server_.Resume();
+ move_loop_handler->RunMoveLoop({});
+ server_.Pause();
+
+ // Continue the dragging session after "snapping" the window. At this point,
+ // the DND session is expected to be still alive and responding normally to
+ // data object events.
+ EXPECT_EQ(State::kAttached, drag_controller()->state());
+ EXPECT_EQ(kSnapped, test_step);
+
+ // Drag the pointer a bit more within |target_window| and then releases the
+ // mouse button and ensures drag controller delivers the events properly and
+ // exit gracefully.
+ SendDndMotion({30, 30});
+ SendDndMotion({30, 33});
+ SendDndMotion({30, 36});
+ SendDndMotion({30, 39});
+ SendDndMotion({30, 42});
+ EXPECT_CALL(delegate_, DispatchEvent(_)).Times(5);
+ Sync();
+
+ EXPECT_EQ(gfx::Point(30, 42), screen_->GetCursorScreenPoint());
+ EXPECT_EQ(target_window->GetWidget(),
+ screen_->GetLocalProcessWidgetAtPoint({50, 50}, {}));
+
+ SendDndDrop();
+ EXPECT_CALL(delegate_, DispatchEvent(_)).WillRepeatedly([&](Event* event) {
+ EXPECT_TRUE(event->IsMouseEvent());
+ switch (test_step) {
+ case kSnapped:
+ EXPECT_EQ(ET_MOUSE_RELEASED, event->type());
+ EXPECT_EQ(State::kDropped, drag_controller()->state());
+ test_step = kDone;
+ break;
+ case kDone:
+ EXPECT_EQ(ET_MOUSE_EXITED, event->type());
+ EXPECT_EQ(target_window->GetWidget(),
+ screen_->GetLocalProcessWidgetAtPoint({30, 42}, {}));
+ break;
+ default:
+ FAIL() << " event=" << event->GetName()
+ << " state=" << drag_controller()->state()
+ << " step=" << static_cast<int>(test_step);
+ return;
+ }
+ });
+ Sync();
+
+ SendPointerEnter(target_window, &delegate_);
+ EXPECT_EQ(target_window, window_manager()->GetCurrentFocusedWindow());
+ EXPECT_EQ(target_window->GetWidget(),
+ screen_->GetLocalProcessWidgetAtPoint({20, 20}, {}));
+}
+
+INSTANTIATE_TEST_SUITE_P(XdgVersionStableTest,
+ WaylandWindowDragControllerTest,
+ ::testing::Values(kXdgShellStable));
+
+INSTANTIATE_TEST_SUITE_P(XdgVersionV6Test,
+ WaylandWindowDragControllerTest,
+ ::testing::Values(kXdgShellV6));
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_factory.cc b/chromium/ui/ozone/platform/wayland/host/wayland_window_factory.cc
index f74df68dbff..29d70dbdc39 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_factory.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_factory.cc
@@ -8,7 +8,7 @@
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
#include "ui/ozone/platform/wayland/host/wayland_popup.h"
#include "ui/ozone/platform/wayland/host/wayland_subsurface.h"
-#include "ui/ozone/platform/wayland/host/wayland_surface.h"
+#include "ui/ozone/platform/wayland/host/wayland_toplevel_window.h"
#include "ui/ozone/platform/wayland/host/wayland_window.h"
namespace ui {
@@ -26,7 +26,7 @@ std::unique_ptr<WaylandWindow> WaylandWindow::Create(
// parent window to be set. Thus, create a normal window instead then.
if (properties.parent_widget == gfx::kNullAcceleratedWidget &&
!connection->wayland_window_manager()->GetCurrentFocusedWindow()) {
- window.reset(new WaylandSurface(delegate, connection));
+ window.reset(new WaylandToplevelWindow(delegate, connection));
} else if (connection->IsDragInProgress()) {
// We are in the process of drag and requested a popup. Most probably,
// it is an arrow window.
@@ -43,7 +43,7 @@ std::unique_ptr<WaylandWindow> WaylandWindow::Create(
case PlatformWindowType::kDrag:
// TODO(msisov): Figure out what kind of surface we need to create for
// bubble and drag windows.
- window.reset(new WaylandSurface(delegate, connection));
+ window.reset(new WaylandToplevelWindow(delegate, connection));
break;
default:
NOTREACHED();
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_manager.cc b/chromium/ui/ozone/platform/wayland/host/wayland_window_manager.cc
index bd7050813b2..51f07bbc27a 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_manager.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_manager.cc
@@ -20,6 +20,11 @@ void WaylandWindowManager::RemoveObserver(WaylandWindowObserver* observer) {
observers_.RemoveObserver(observer);
}
+void WaylandWindowManager::NotifyWindowConfigured(WaylandWindow* window) {
+ for (WaylandWindowObserver& observer : observers_)
+ observer.OnWindowConfigured(window);
+}
+
void WaylandWindowManager::GrabLocatedEvents(WaylandWindow* window) {
DCHECK_NE(located_events_grabber_, window);
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_manager.h b/chromium/ui/ozone/platform/wayland/host/wayland_window_manager.h
index 1873c907a68..1f4cad045ca 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_manager.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_manager.h
@@ -27,6 +27,10 @@ class WaylandWindowManager {
void AddObserver(WaylandWindowObserver* observer);
void RemoveObserver(WaylandWindowObserver* observer);
+ // Notifies observers that the Window has been ack configured and
+ // WaylandBufferManagerHost can start attaching buffers to the |surface_|.
+ void NotifyWindowConfigured(WaylandWindow* window);
+
// Stores the window that should grab the located events.
void GrabLocatedEvents(WaylandWindow* event_grabber);
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_observer.cc b/chromium/ui/ozone/platform/wayland/host/wayland_window_observer.cc
index d81f991e080..e289ea88e3d 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_observer.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_observer.cc
@@ -12,4 +12,6 @@ void WaylandWindowObserver::OnWindowAdded(WaylandWindow* window) {}
void WaylandWindowObserver::OnWindowRemoved(WaylandWindow* window) {}
+void WaylandWindowObserver::OnWindowConfigured(WaylandWindow* window) {}
+
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_observer.h b/chromium/ui/ozone/platform/wayland/host/wayland_window_observer.h
index 0f81b8b5731..c461b03114e 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_observer.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_observer.h
@@ -20,6 +20,9 @@ class WaylandWindowObserver : public base::CheckedObserver {
// Called when |window| has been removed.
virtual void OnWindowRemoved(WaylandWindow* window);
+ // Called when |window| has been ack configured.
+ virtual void OnWindowConfigured(WaylandWindow* window);
+
protected:
~WaylandWindowObserver() override;
};
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 9a1112a1bd8..d7c533edc09 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
@@ -98,25 +98,6 @@ class WaylandWindowTest : public WaylandTest {
}
protected:
- void SendConfigureEvent(int width,
- int height,
- uint32_t serial,
- struct wl_array* states) {
- // In xdg_shell_v6+, both surfaces send serial configure event and toplevel
- // surfaces send other data like states, heights and widths.
- if (GetParam() == kXdgShellV6) {
- zxdg_surface_v6_send_configure(xdg_surface_->resource(), serial);
- ASSERT_TRUE(xdg_surface_->xdg_toplevel());
- zxdg_toplevel_v6_send_configure(xdg_surface_->xdg_toplevel()->resource(),
- width, height, states);
- } else {
- xdg_surface_send_configure(xdg_surface_->resource(), serial);
- ASSERT_TRUE(xdg_surface_->xdg_toplevel());
- xdg_toplevel_send_configure(xdg_surface_->xdg_toplevel()->resource(),
- width, height, states);
- }
- }
-
void SendConfigureEventPopup(gfx::AcceleratedWidget menu_widget,
const gfx::Rect bounds) {
auto* popup = GetPopupByWidget(menu_widget);
@@ -253,12 +234,20 @@ TEST_P(WaylandWindowTest, MaximizeAndRestore) {
const auto kNormalBounds = gfx::Rect{0, 0, 500, 300};
const auto kMaximizedBounds = gfx::Rect{0, 0, 800, 600};
+ uint32_t serial = 0;
+
// Make sure the window has normal state initially.
EXPECT_CALL(delegate_, OnBoundsChanged(kNormalBounds));
window_->SetBounds(kNormalBounds);
EXPECT_EQ(PlatformWindowState::kNormal, window_->GetPlatformWindowState());
VerifyAndClearExpectations();
+ // Deactivate the surface.
+ auto empty_state = MakeStateArray({});
+ SendConfigureEvent(xdg_surface_, 0, 0, ++serial, empty_state.get());
+
+ Sync();
+
auto active_maximized = MakeStateArray(
{XDG_TOPLEVEL_STATE_ACTIVATED, XDG_TOPLEVEL_STATE_MAXIMIZED});
EXPECT_CALL(*GetXdgToplevel(), SetMaximized());
@@ -268,7 +257,8 @@ TEST_P(WaylandWindowTest, MaximizeAndRestore) {
EXPECT_CALL(delegate_, OnBoundsChanged(kMaximizedBounds));
EXPECT_CALL(delegate_, OnWindowStateChanged(_)).Times(0);
window_->Maximize();
- SendConfigureEvent(kMaximizedBounds.width(), kMaximizedBounds.height(), 1,
+ SendConfigureEvent(xdg_surface_, kMaximizedBounds.width(),
+ kMaximizedBounds.height(), ++serial,
active_maximized.get());
Sync();
VerifyAndClearExpectations();
@@ -278,7 +268,8 @@ TEST_P(WaylandWindowTest, MaximizeAndRestore) {
kMaximizedBounds.height()));
EXPECT_CALL(delegate_, OnActivationChanged(Eq(false)));
EXPECT_CALL(delegate_, OnBoundsChanged(_)).Times(0);
- SendConfigureEvent(kMaximizedBounds.width(), kMaximizedBounds.height(), 2,
+ SendConfigureEvent(xdg_surface_, kMaximizedBounds.width(),
+ kMaximizedBounds.height(), ++serial,
inactive_maximized.get());
Sync();
VerifyAndClearExpectations();
@@ -287,7 +278,8 @@ TEST_P(WaylandWindowTest, MaximizeAndRestore) {
kMaximizedBounds.height()));
EXPECT_CALL(delegate_, OnActivationChanged(Eq(true)));
EXPECT_CALL(delegate_, OnBoundsChanged(_)).Times(0);
- SendConfigureEvent(kMaximizedBounds.width(), kMaximizedBounds.height(), 3,
+ SendConfigureEvent(xdg_surface_, kMaximizedBounds.width(),
+ kMaximizedBounds.height(), ++serial,
active_maximized.get());
Sync();
VerifyAndClearExpectations();
@@ -301,7 +293,7 @@ TEST_P(WaylandWindowTest, MaximizeAndRestore) {
window_->Restore();
// Reinitialize wl_array, which removes previous old states.
auto active = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(0, 0, 4, active.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, ++serial, active.get());
Sync();
}
@@ -310,7 +302,7 @@ TEST_P(WaylandWindowTest, Minimize) {
// Make sure the window is initialized to normal state from the beginning.
EXPECT_EQ(PlatformWindowState::kNormal, window_->GetPlatformWindowState());
- SendConfigureEvent(0, 0, 1, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 1, states.get());
Sync();
EXPECT_CALL(*GetXdgToplevel(), SetMinimized());
@@ -320,24 +312,24 @@ TEST_P(WaylandWindowTest, Minimize) {
// Reinitialize wl_array, which removes previous old states.
states = ScopedWlArray();
- SendConfigureEvent(0, 0, 2, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 2, states.get());
Sync();
// Wayland compositor doesn't notify clients about minimized state, but rather
- // if a window is not activated. Thus, a WaylandSurface marks itself as being
- // minimized and and sets state to minimized. Thus, the state mustn't change
- // after the configuration event is sent.
+ // if a window is not activated. Thus, a WaylandToplevelWindow marks itself as
+ // being minimized and and sets state to minimized. Thus, the state mustn't
+ // change after the configuration event is sent.
EXPECT_EQ(window_->GetPlatformWindowState(), PlatformWindowState::kMinimized);
// Send one additional empty configuration event (which means the surface is
// not maximized, fullscreen or activated) to ensure, WaylandWindow stays in
// the same minimized state and doesn't notify its delegate.
EXPECT_CALL(delegate_, OnWindowStateChanged(_)).Times(0);
- SendConfigureEvent(0, 0, 3, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 3, states.get());
Sync();
// And one last time to ensure the behaviour.
- SendConfigureEvent(0, 0, 4, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 4, states.get());
Sync();
}
@@ -346,7 +338,7 @@ TEST_P(WaylandWindowTest, SetFullscreenAndRestore) {
EXPECT_EQ(PlatformWindowState::kNormal, window_->GetPlatformWindowState());
ScopedWlArray states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(0, 0, 1, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 1, states.get());
Sync();
AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, states.get());
@@ -358,7 +350,7 @@ TEST_P(WaylandWindowTest, SetFullscreenAndRestore) {
// comment in the WaylandWindow::ToggleFullscreen.
EXPECT_EQ(window_->GetPlatformWindowState(),
PlatformWindowState::kFullScreen);
- SendConfigureEvent(0, 0, 2, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 2, states.get());
Sync();
EXPECT_CALL(*GetXdgToplevel(), UnsetFullscreen());
@@ -367,7 +359,7 @@ TEST_P(WaylandWindowTest, SetFullscreenAndRestore) {
EXPECT_EQ(window_->GetPlatformWindowState(), PlatformWindowState::kNormal);
// Reinitialize wl_array, which removes previous old states.
states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(0, 0, 3, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 3, states.get());
Sync();
EXPECT_EQ(window_->GetPlatformWindowState(), PlatformWindowState::kNormal);
}
@@ -408,7 +400,7 @@ TEST_P(WaylandWindowTest, StartWithFullscreen) {
// Activate the surface.
ScopedWlArray states = InitializeWlArrayWithActivatedState();
AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, states.get());
- SendConfigureEvent(0, 0, 1, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 1, states.get());
Sync();
@@ -454,7 +446,7 @@ TEST_P(WaylandWindowTest, StartMaximized) {
// Activate the surface.
ScopedWlArray states = InitializeWlArrayWithActivatedState();
AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED, states.get());
- SendConfigureEvent(0, 0, 1, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 1, states.get());
Sync();
@@ -467,7 +459,7 @@ TEST_P(WaylandWindowTest, CompositorSideStateChanges) {
ScopedWlArray states = InitializeWlArrayWithActivatedState();
AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED, states.get());
- SendConfigureEvent(2000, 2000, 1, states.get());
+ SendConfigureEvent(xdg_surface_, 2000, 2000, 1, states.get());
EXPECT_CALL(delegate_,
OnWindowStateChanged(Eq(PlatformWindowState::kMaximized)))
@@ -480,7 +472,7 @@ TEST_P(WaylandWindowTest, CompositorSideStateChanges) {
// Unmaximize
states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(0, 0, 2, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 2, states.get());
EXPECT_CALL(delegate_, OnWindowStateChanged(Eq(PlatformWindowState::kNormal)))
.Times(1);
@@ -489,7 +481,7 @@ TEST_P(WaylandWindowTest, CompositorSideStateChanges) {
// Now, set to fullscreen.
AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, states.get());
- SendConfigureEvent(2005, 2005, 3, states.get());
+ SendConfigureEvent(xdg_surface_, 2005, 2005, 3, states.get());
EXPECT_CALL(delegate_,
OnWindowStateChanged(Eq(PlatformWindowState::kFullScreen)))
.Times(1);
@@ -499,7 +491,7 @@ TEST_P(WaylandWindowTest, CompositorSideStateChanges) {
// Unfullscreen
states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(0, 0, 4, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 4, states.get());
EXPECT_CALL(delegate_, OnWindowStateChanged(Eq(PlatformWindowState::kNormal)))
.Times(1);
@@ -511,7 +503,7 @@ TEST_P(WaylandWindowTest, CompositorSideStateChanges) {
// Now, maximize, fullscreen and restore.
states = InitializeWlArrayWithActivatedState();
AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED, states.get());
- SendConfigureEvent(2000, 2000, 1, states.get());
+ SendConfigureEvent(xdg_surface_, 2000, 2000, 1, states.get());
EXPECT_CALL(delegate_,
OnWindowStateChanged(Eq(PlatformWindowState::kMaximized)))
@@ -521,7 +513,7 @@ TEST_P(WaylandWindowTest, CompositorSideStateChanges) {
Sync();
AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, states.get());
- SendConfigureEvent(2005, 2005, 1, states.get());
+ SendConfigureEvent(xdg_surface_, 2005, 2005, 1, states.get());
EXPECT_CALL(delegate_,
OnWindowStateChanged(Eq(PlatformWindowState::kFullScreen)))
@@ -530,7 +522,7 @@ TEST_P(WaylandWindowTest, CompositorSideStateChanges) {
// Restore
states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(0, 0, 4, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 4, states.get());
EXPECT_CALL(delegate_, OnWindowStateChanged(Eq(PlatformWindowState::kNormal)))
.Times(1);
@@ -544,12 +536,19 @@ TEST_P(WaylandWindowTest, SetMaximizedFullscreenAndRestore) {
const auto kNormalBounds = gfx::Rect{0, 0, 500, 300};
const auto kMaximizedBounds = gfx::Rect{0, 0, 800, 600};
+ uint32_t serial = 0;
+
// Make sure the window has normal state initially.
EXPECT_CALL(delegate_, OnBoundsChanged(kNormalBounds));
window_->SetBounds(kNormalBounds);
EXPECT_EQ(PlatformWindowState::kNormal, window_->GetPlatformWindowState());
VerifyAndClearExpectations();
+ // Deactivate the surface.
+ ScopedWlArray empty_state;
+ SendConfigureEvent(xdg_surface_, 0, 0, ++serial, empty_state.get());
+ Sync();
+
auto active_maximized = MakeStateArray(
{XDG_TOPLEVEL_STATE_ACTIVATED, XDG_TOPLEVEL_STATE_MAXIMIZED});
EXPECT_CALL(*GetXdgToplevel(), SetMaximized());
@@ -561,7 +560,8 @@ TEST_P(WaylandWindowTest, SetMaximizedFullscreenAndRestore) {
window_->Maximize();
// State changes are synchronous.
EXPECT_EQ(PlatformWindowState::kMaximized, window_->GetPlatformWindowState());
- SendConfigureEvent(kMaximizedBounds.width(), kMaximizedBounds.height(), 2,
+ SendConfigureEvent(xdg_surface_, kMaximizedBounds.width(),
+ kMaximizedBounds.height(), ++serial,
active_maximized.get());
Sync();
// Verify that the state has not been changed.
@@ -578,7 +578,8 @@ TEST_P(WaylandWindowTest, SetMaximizedFullscreenAndRestore) {
EXPECT_EQ(PlatformWindowState::kFullScreen,
window_->GetPlatformWindowState());
AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, active_maximized.get());
- SendConfigureEvent(kMaximizedBounds.width(), kMaximizedBounds.height(), 3,
+ SendConfigureEvent(xdg_surface_, kMaximizedBounds.width(),
+ kMaximizedBounds.height(), ++serial,
active_maximized.get());
Sync();
// Verify that the state has not been changed.
@@ -596,7 +597,7 @@ TEST_P(WaylandWindowTest, SetMaximizedFullscreenAndRestore) {
EXPECT_EQ(PlatformWindowState::kNormal, window_->GetPlatformWindowState());
// Reinitialize wl_array, which removes previous old states.
auto active = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(0, 0, 4, active.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, ++serial, active.get());
Sync();
EXPECT_EQ(PlatformWindowState::kNormal, window_->GetPlatformWindowState());
}
@@ -614,8 +615,8 @@ TEST_P(WaylandWindowTest, RestoreBoundsAfterMaximize) {
EXPECT_CALL(delegate_, OnBoundsChanged(Eq(maximized_bounds)));
window_->Maximize();
AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED, states.get());
- SendConfigureEvent(maximized_bounds.width(), maximized_bounds.height(), 1,
- states.get());
+ SendConfigureEvent(xdg_surface_, maximized_bounds.width(),
+ maximized_bounds.height(), 1, states.get());
Sync();
restored_bounds = window_->GetRestoredBoundsInPixels();
EXPECT_EQ(bounds, restored_bounds);
@@ -629,7 +630,7 @@ TEST_P(WaylandWindowTest, RestoreBoundsAfterMaximize) {
window_->Restore();
// Reinitialize wl_array, which removes previous old states.
states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(0, 0, 2, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 2, states.get());
Sync();
bounds = window_->GetBounds();
EXPECT_EQ(bounds, restored_bounds);
@@ -641,7 +642,7 @@ TEST_P(WaylandWindowTest, RestoreBoundsAfterFullscreen) {
const gfx::Rect current_bounds = window_->GetBounds();
ScopedWlArray states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(0, 0, 1, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 1, states.get());
Sync();
gfx::Rect restored_bounds = window_->GetRestoredBoundsInPixels();
@@ -652,8 +653,8 @@ TEST_P(WaylandWindowTest, RestoreBoundsAfterFullscreen) {
EXPECT_CALL(delegate_, OnBoundsChanged(Eq(fullscreen_bounds)));
window_->ToggleFullscreen();
AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, states.get());
- SendConfigureEvent(fullscreen_bounds.width(), fullscreen_bounds.height(), 2,
- states.get());
+ SendConfigureEvent(xdg_surface_, fullscreen_bounds.width(),
+ fullscreen_bounds.height(), 2, states.get());
Sync();
restored_bounds = window_->GetRestoredBoundsInPixels();
EXPECT_EQ(bounds, restored_bounds);
@@ -667,7 +668,7 @@ TEST_P(WaylandWindowTest, RestoreBoundsAfterFullscreen) {
window_->Restore();
// Reinitialize wl_array, which removes previous old states.
states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(0, 0, 3, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 3, states.get());
Sync();
bounds = window_->GetBounds();
EXPECT_EQ(bounds, restored_bounds);
@@ -688,8 +689,8 @@ TEST_P(WaylandWindowTest, RestoreBoundsAfterMaximizeAndFullscreen) {
EXPECT_CALL(delegate_, OnBoundsChanged(Eq(maximized_bounds)));
window_->Maximize();
AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED, states.get());
- SendConfigureEvent(maximized_bounds.width(), maximized_bounds.height(), 1,
- states.get());
+ SendConfigureEvent(xdg_surface_, maximized_bounds.width(),
+ maximized_bounds.height(), 1, states.get());
Sync();
restored_bounds = window_->GetRestoredBoundsInPixels();
EXPECT_EQ(bounds, restored_bounds);
@@ -698,8 +699,8 @@ TEST_P(WaylandWindowTest, RestoreBoundsAfterMaximizeAndFullscreen) {
EXPECT_CALL(delegate_, OnBoundsChanged(Eq(fullscreen_bounds)));
window_->ToggleFullscreen();
AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, states.get());
- SendConfigureEvent(fullscreen_bounds.width(), fullscreen_bounds.height(), 2,
- states.get());
+ SendConfigureEvent(xdg_surface_, fullscreen_bounds.width(),
+ fullscreen_bounds.height(), 2, states.get());
Sync();
gfx::Rect fullscreen_restore_bounds = window_->GetRestoredBoundsInPixels();
EXPECT_EQ(restored_bounds, fullscreen_restore_bounds);
@@ -709,8 +710,8 @@ TEST_P(WaylandWindowTest, RestoreBoundsAfterMaximizeAndFullscreen) {
// Reinitialize wl_array, which removes previous old states.
states = InitializeWlArrayWithActivatedState();
AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED, states.get());
- SendConfigureEvent(maximized_bounds.width(), maximized_bounds.height(), 3,
- states.get());
+ SendConfigureEvent(xdg_surface_, maximized_bounds.width(),
+ maximized_bounds.height(), 3, states.get());
Sync();
restored_bounds = window_->GetRestoredBoundsInPixels();
EXPECT_EQ(restored_bounds, fullscreen_restore_bounds);
@@ -724,7 +725,7 @@ TEST_P(WaylandWindowTest, RestoreBoundsAfterMaximizeAndFullscreen) {
window_->Restore();
// Reinitialize wl_array, which removes previous old states.
states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(0, 0, 4, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 4, states.get());
Sync();
bounds = window_->GetBounds();
EXPECT_EQ(bounds, restored_bounds);
@@ -747,7 +748,7 @@ TEST_P(WaylandWindowTest, SendsBoundsOnRequest) {
EXPECT_CALL(*xdg_surface_,
SetWindowGeometry(0, 0, new_bounds.width(), new_bounds.height()))
.Times(2);
- SendConfigureEvent(0, 0, 2, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 2, states.get());
Sync();
// Restored bounds should keep empty value.
@@ -757,7 +758,7 @@ TEST_P(WaylandWindowTest, SendsBoundsOnRequest) {
// Second case is when Wayland sends a configure event with 1, 1 height and
// width. It looks more like a bug in Gnome Shell with Wayland as long as the
// documentation says it must be set to 0, 0, when wayland requests bounds.
- SendConfigureEvent(0, 0, 3, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 3, states.get());
Sync();
// Restored bounds should keep empty value.
@@ -818,14 +819,14 @@ TEST_P(WaylandWindowTest, ConfigureEvent) {
// xdg_toplevel in xdg_shell_v6 and by xdg_surface_ in xdg_shell_v5.
EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, 1000, 1000)).Times(1);
EXPECT_CALL(*xdg_surface_, AckConfigure(12));
- SendConfigureEvent(1000, 1000, 12, states.get());
+ SendConfigureEvent(xdg_surface_, 1000, 1000, 12, states.get());
Sync();
EXPECT_CALL(delegate_, OnBoundsChanged(Eq(gfx::Rect(0, 0, 1500, 1000))));
EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, 1500, 1000)).Times(1);
EXPECT_CALL(*xdg_surface_, AckConfigure(13));
- SendConfigureEvent(1500, 1000, 13, states.get());
+ SendConfigureEvent(xdg_surface_, 1500, 1000, 13, states.get());
}
TEST_P(WaylandWindowTest, ConfigureEventWithNulledSize) {
@@ -834,7 +835,7 @@ TEST_P(WaylandWindowTest, ConfigureEventWithNulledSize) {
// If Wayland sends configure event with 0 width and 0 size, client should
// call back with desired sizes. In this case, that's the actual size of
// the window.
- SendConfigureEvent(0, 0, 14, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, 14, states.get());
// |xdg_surface_| must receive the following calls in both xdg_shell_v5 and
// xdg_shell_v6. Other calls like SetTitle or SetMaximized are recieved by
// xdg_toplevel in xdg_shell_v6 and by xdg_surface_ in xdg_shell_v5.
@@ -843,16 +844,23 @@ TEST_P(WaylandWindowTest, ConfigureEventWithNulledSize) {
}
TEST_P(WaylandWindowTest, OnActivationChanged) {
+ uint32_t serial = 0;
+
+ // Deactivate the surface.
+ ScopedWlArray empty_state;
+ SendConfigureEvent(xdg_surface_, 0, 0, ++serial, empty_state.get());
+ Sync();
+
{
ScopedWlArray states = InitializeWlArrayWithActivatedState();
EXPECT_CALL(delegate_, OnActivationChanged(Eq(true)));
- SendConfigureEvent(0, 0, 1, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, ++serial, states.get());
Sync();
}
ScopedWlArray states;
EXPECT_CALL(delegate_, OnActivationChanged(Eq(false)));
- SendConfigureEvent(0, 0, 2, states.get());
+ SendConfigureEvent(xdg_surface_, 0, 0, ++serial, states.get());
Sync();
}
@@ -1275,7 +1283,8 @@ TEST_P(WaylandWindowTest, CanDispatchEvent) {
TEST_P(WaylandWindowTest, DispatchWindowMove) {
EXPECT_CALL(*GetXdgToplevel(), Move(_));
- ui::GetWmMoveResizeHandler(*window_)->DispatchHostWindowDragMovement(HTCAPTION, gfx::Point());
+ ui::GetWmMoveResizeHandler(*window_)->DispatchHostWindowDragMovement(
+ HTCAPTION, gfx::Point());
}
// Makes sure hit tests are converted into right edges.
@@ -1482,7 +1491,7 @@ TEST_P(WaylandWindowTest, SetOpaqueRegion) {
gfx::Rect new_bounds(0, 0, 500, 600);
auto state_array = MakeStateArray({XDG_TOPLEVEL_STATE_ACTIVATED});
- SendConfigureEvent(new_bounds.width(), new_bounds.height(), 1,
+ SendConfigureEvent(xdg_surface_, new_bounds.width(), new_bounds.height(), 1,
state_array.get());
SkIRect rect =
@@ -1494,7 +1503,7 @@ TEST_P(WaylandWindowTest, SetOpaqueRegion) {
VerifyAndClearExpectations();
new_bounds.set_size(gfx::Size(1000, 534));
- SendConfigureEvent(new_bounds.width(), new_bounds.height(), 2,
+ SendConfigureEvent(xdg_surface_, new_bounds.width(), new_bounds.height(), 2,
state_array.get());
rect = SkIRect::MakeXYWH(0, 0, new_bounds.width(), new_bounds.height());
@@ -1922,8 +1931,8 @@ TEST_P(WaylandWindowTest, SetsPropertiesOnShow) {
// We can't mock all those methods above as long as the xdg_toplevel is
// created and destroyed on each show and hide call. However, it is the same
- // WaylandSurface object that cached the values we set and must restore them
- // on Show().
+ // WaylandToplevelWindow object that cached the values we set and must restore
+ // them on Show().
EXPECT_EQ(mock_xdg_toplevel->min_size(), min_size.value());
EXPECT_EQ(mock_xdg_toplevel->max_size(), max_size.value());
EXPECT_EQ(std::string(kAppId), mock_xdg_toplevel->app_id());
@@ -2018,6 +2027,59 @@ TEST_P(WaylandWindowTest, CreatesPopupOnTouchDownSerial) {
EXPECT_EQ(test_popup->grab_serial(), touch_down_serial);
}
+// Tests nested menu windows get the topmost window in the stack of windows
+// within the same family/tree.
+TEST_P(WaylandWindowTest, NestedPopupWindowsGetCorrectParent) {
+ VerifyAndClearExpectations();
+
+ gfx::Rect menu_window_bounds(gfx::Rect(10, 20, 20, 20));
+ std::unique_ptr<WaylandWindow> menu_window = CreateWaylandWindowWithParams(
+ PlatformWindowType::kMenu, window_->GetWidget(), menu_window_bounds,
+ &delegate_);
+ EXPECT_TRUE(menu_window);
+
+ EXPECT_TRUE(menu_window->parent_window() == window_.get());
+
+ gfx::Rect menu_window_bounds2(gfx::Rect(20, 40, 30, 20));
+ std::unique_ptr<WaylandWindow> menu_window2 = CreateWaylandWindowWithParams(
+ PlatformWindowType::kMenu, window_->GetWidget(), menu_window_bounds2,
+ &delegate_);
+ EXPECT_TRUE(menu_window2);
+
+ EXPECT_TRUE(menu_window2->parent_window() == menu_window.get());
+
+ gfx::Rect menu_window_bounds3(gfx::Rect(30, 40, 30, 20));
+ std::unique_ptr<WaylandWindow> menu_window3 = CreateWaylandWindowWithParams(
+ PlatformWindowType::kMenu, window_->GetWidget(), menu_window_bounds3,
+ &delegate_);
+ EXPECT_TRUE(menu_window3);
+
+ EXPECT_TRUE(menu_window3->parent_window() == menu_window2.get());
+
+ gfx::Rect menu_window_bounds4(gfx::Rect(40, 40, 30, 20));
+ std::unique_ptr<WaylandWindow> menu_window4 = CreateWaylandWindowWithParams(
+ PlatformWindowType::kMenu, window_->GetWidget(), menu_window_bounds4,
+ &delegate_);
+ EXPECT_TRUE(menu_window4);
+
+ EXPECT_TRUE(menu_window4->parent_window() == menu_window3.get());
+}
+
+TEST_P(WaylandWindowTest, DoesNotGrabPopupIfNoSeat) {
+ // Create a popup window and verify the grab serial is not set.
+ MockPlatformWindowDelegate delegate;
+ auto popup = CreateWaylandWindowWithParams(
+ PlatformWindowType::kMenu, window_->GetWidget(), gfx::Rect(0, 0, 50, 50),
+ &delegate);
+ ASSERT_TRUE(popup);
+
+ Sync();
+
+ auto* test_popup = GetPopupByWidget(popup->GetWidget());
+ ASSERT_TRUE(test_popup);
+ EXPECT_EQ(test_popup->grab_serial(), 0u);
+}
+
INSTANTIATE_TEST_SUITE_P(XdgVersionStableTest,
WaylandWindowTest,
::testing::Values(kXdgShellStable));
diff --git a/chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.cc b/chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.cc
index 1e81f70b003..758ae1f222e 100644
--- a/chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.cc
+++ b/chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.cc
@@ -18,7 +18,7 @@
#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
#include "ui/ozone/platform/wayland/host/wayland_pointer.h"
#include "ui/ozone/platform/wayland/host/wayland_popup.h"
-#include "ui/ozone/platform/wayland/host/wayland_surface.h"
+#include "ui/ozone/platform/wayland/host/wayland_toplevel_window.h"
#include "ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.h"
namespace ui {
@@ -286,8 +286,8 @@ bool XDGPopupWrapperImpl::Initialize(WaylandConnection* connection,
static_cast<XDGPopupWrapperImpl*>(wayland_popup->shell_popup());
parent_xdg_surface = popup->xdg_surface();
} else {
- WaylandSurface* wayland_surface =
- static_cast<WaylandSurface*>(wayland_window_->parent_window());
+ WaylandToplevelWindow* wayland_surface =
+ static_cast<WaylandToplevelWindow*>(wayland_window_->parent_window());
parent_xdg_surface =
static_cast<XDGSurfaceWrapperImpl*>(wayland_surface->shell_surface());
}
@@ -324,41 +324,8 @@ bool XDGPopupWrapperImpl::InitializeStable(
xdg_positioner_destroy(positioner);
- // According to the spec, the grab call can only be done on a key press, mouse
- // press or touch down. However, there is a problem with popup windows and
- // touch events so long as Chromium creates them only on consequent touch up
- // events. That results in Wayland compositors dismissing popups. To fix
- // the issue, do not use grab with touch events. Please note that explicit
- // grab means that a Wayland compositor dismisses a popup whenever the user
- // clicks outside the created surfaces. If the explicit grab is not used, the
- // popups are not dismissed in such cases. What is more, current non-ozone X11
- // implementation does the same. This means there is no functionality changes
- // and we do things right.
- //
- // We cannot know what was the last event. Instead, we can check if the window
- // has pointer or keyboard focus. If so, the popup will be explicitly grabbed.
- //
- // There is a bug in the gnome/mutter - if explicit grab is not used,
- // unmapping of a wl_surface (aka destroying xdg_popup and surface) to hide a
- // window results in weird behaviour. That is, a popup continues to be visible
- // on a display and it results in a crash of the entire session. Thus, just
- // continue to use grab here and avoid showing popups for touch events on
- // gnome/mutter. That is better than crashing the entire system. Otherwise,
- // Chromium has to change the way how it reacts on touch events - instead of
- // creating a menu on touch up, it must do it on touch down events.
- // https://gitlab.gnome.org/GNOME/mutter/issues/698#note_562601.
- std::unique_ptr<base::Environment> env(base::Environment::Create());
- if ((base::nix::GetDesktopEnvironment(env.get()) ==
- base::nix::DESKTOP_ENVIRONMENT_GNOME) ||
- (wayland_window_->parent_window()->has_pointer_focus() ||
- wayland_window_->parent_window()->has_keyboard_focus())) {
- // When drag process starts, as described the protocol -
- // https://goo.gl/1Mskq3, the client must have an active implicit grab. If
- // we try to create a popup and grab it, it will be immediately dismissed.
- // Thus, do not take explicit grab during drag process.
- if (!connection->IsDragInProgress())
- xdg_popup_grab(xdg_popup_.get(), connection->seat(),
- connection->serial());
+ if (CanGrabPopup(connection)) {
+ xdg_popup_grab(xdg_popup_.get(), connection->seat(), connection->serial());
}
xdg_popup_add_listener(xdg_popup_.get(), &xdg_popup_listener, this);
@@ -375,18 +342,11 @@ struct xdg_positioner* XDGPopupWrapperImpl::CreatePositionerStable(
if (!positioner)
return nullptr;
- bool is_right_click_menu =
- connection->event_source()->IsPointerButtonPressed(EF_RIGHT_MOUSE_BUTTON);
+ auto menu_type = GetMenuTypeForPositioner(connection, parent_window);
- // Different types of menu require different anchors, constraint adjustments,
- // gravity and etc.
- MenuType menu_type = MenuType::TYPE_UNKNOWN;
- if (is_right_click_menu)
- menu_type = MenuType::TYPE_RIGHT_CLICK;
- else if (wl::IsMenuType(parent_window->type()))
- menu_type = MenuType::TYPE_3DOT_CHILD_MENU;
- else
- menu_type = MenuType::TYPE_3DOT_PARENT_MENU;
+ // The parent we got must be the topmost in the stack of the same family
+ // windows.
+ DCHECK_EQ(parent_window->GetTopMostChildWindow(), parent_window);
// Place anchor to the end of the possible position.
gfx::Rect anchor_rect = GetAnchorRect(
@@ -426,34 +386,7 @@ bool XDGPopupWrapperImpl::InitializeV6(
zxdg_positioner_v6_destroy(positioner);
- // According to the spec, the grab call can only be done on a key press, mouse
- // press or touch down. However, there is a problem with popup windows and
- // touch events so long as Chromium creates them only on consequent touch up
- // events. That results in Wayland compositors dismissing popups. To fix
- // the issue, do not use grab with touch events. Please note that explicit
- // grab means that a Wayland compositor dismisses a popup whenever the user
- // clicks outside the created surfaces. If the explicit grab is not used, the
- // popups are not dismissed in such cases. What is more, current non-ozone X11
- // implementation does the same. This means there is no functionality changes
- // and we do things right.
- //
- // We cannot know what was the last event. Instead, we can check if the window
- // has pointer or keyboard focus. If so, the popup will be explicitly grabbed.
- //
- // There is a bug in the gnome/mutter - if explicit grab is not used,
- // unmapping of a wl_surface (aka destroying xdg_popup and surface) to hide a
- // window results in weird behaviour. That is, a popup continues to be visible
- // on a display and it results in a crash of the entire session. Thus, just
- // continue to use grab here and avoid showing popups for touch events on
- // gnome/mutter. That is better than crashing the entire system. Otherwise,
- // Chromium has to change the way how it reacts on touch events - instead of
- // creating a menu on touch up, it must do it on touch down events.
- // https://gitlab.gnome.org/GNOME/mutter/issues/698#note_562601.
- std::unique_ptr<base::Environment> env(base::Environment::Create());
- if ((base::nix::GetDesktopEnvironment(env.get()) ==
- base::nix::DESKTOP_ENVIRONMENT_GNOME) ||
- (wayland_window_->parent_window()->has_pointer_focus() ||
- wayland_window_->parent_window()->has_keyboard_focus())) {
+ if (CanGrabPopup(connection)) {
zxdg_popup_v6_grab(zxdg_popup_v6_.get(), connection->seat(),
connection->serial());
}
@@ -473,18 +406,11 @@ zxdg_positioner_v6* XDGPopupWrapperImpl::CreatePositionerV6(
if (!positioner)
return nullptr;
- bool is_right_click_menu =
- connection->event_source()->IsPointerButtonPressed(EF_RIGHT_MOUSE_BUTTON);
+ auto menu_type = GetMenuTypeForPositioner(connection, parent_window);
- // Different types of menu require different anchors, constraint adjustments,
- // gravity and etc.
- MenuType menu_type = MenuType::TYPE_UNKNOWN;
- if (is_right_click_menu)
- menu_type = MenuType::TYPE_RIGHT_CLICK;
- else if (wl::IsMenuType(parent_window->type()))
- menu_type = MenuType::TYPE_3DOT_CHILD_MENU;
- else
- menu_type = MenuType::TYPE_3DOT_PARENT_MENU;
+ // The parent we got must be the topmost in the stack of the same family
+ // windows.
+ DCHECK_EQ(parent_window->GetTopMostChildWindow(), parent_window);
// Place anchor to the end of the possible position.
gfx::Rect anchor_rect = GetAnchorRect(
@@ -505,6 +431,61 @@ zxdg_positioner_v6* XDGPopupWrapperImpl::CreatePositionerV6(
return positioner;
}
+MenuType XDGPopupWrapperImpl::GetMenuTypeForPositioner(
+ WaylandConnection* connection,
+ WaylandWindow* parent_window) const {
+ bool is_right_click_menu =
+ connection->event_source()->last_pointer_button_pressed() &
+ EF_RIGHT_MOUSE_BUTTON;
+
+ // Different types of menu require different anchors, constraint adjustments,
+ // gravity and etc.
+ if (is_right_click_menu)
+ return MenuType::TYPE_RIGHT_CLICK;
+ else if (!wl::IsMenuType(parent_window->type()))
+ return MenuType::TYPE_3DOT_PARENT_MENU;
+ else
+ return MenuType::TYPE_3DOT_CHILD_MENU;
+}
+
+bool XDGPopupWrapperImpl::CanGrabPopup(WaylandConnection* connection) const {
+ // When drag process starts, as described the protocol -
+ // https://goo.gl/1Mskq3, the client must have an active implicit grab. If
+ // we try to create a popup and grab it, it will be immediately dismissed.
+ // Thus, do not take explicit grab during drag process.
+ if (connection->IsDragInProgress() || !connection->seat())
+ return false;
+
+ // According to the spec, the grab call can only be done on a key press, mouse
+ // press or touch down. However, there is a problem with popup windows and
+ // touch events so long as Chromium creates them only on consequent touch up
+ // events. That results in Wayland compositors dismissing popups. To fix the
+ // issue, do not use grab with touch events. Please note that explicit grab
+ // means that a Wayland compositor dismisses a popup whenever the user clicks
+ // outside the created surfaces. If the explicit grab is not used, the popups
+ // are not dismissed in such cases. What is more, current non-ozone X11
+ // implementation does the same. This means there is no functionality changes
+ // and we do things right.
+ //
+ // We cannot know what was the last event. Instead, we can check if the window
+ // has pointer or keyboard focus. If so, the popup will be explicitly grabbed.
+ //
+ // There is a bug in the gnome/mutter - if explicit grab is not used,
+ // unmapping of a wl_surface (aka destroying xdg_popup and surface) to hide a
+ // window results in weird behaviour. That is, a popup continues to be visible
+ // on a display and it results in a crash of the entire session. Thus, just
+ // continue to use grab here and avoid showing popups for touch events on
+ // gnome/mutter. That is better than crashing the entire system. Otherwise,
+ // Chromium has to change the way how it reacts on touch events - instead of
+ // creating a menu on touch up, it must do it on touch down events.
+ // https://gitlab.gnome.org/GNOME/mutter/issues/698#note_562601.
+ std::unique_ptr<base::Environment> env(base::Environment::Create());
+ return (base::nix::GetDesktopEnvironment(env.get()) ==
+ base::nix::DESKTOP_ENVIRONMENT_GNOME) ||
+ (wayland_window_->parent_window()->has_pointer_focus() ||
+ wayland_window_->parent_window()->has_keyboard_focus());
+}
+
void XDGPopupWrapperImpl::Configure(void* data,
int32_t x,
int32_t y,
diff --git a/chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.h b/chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.h
index c0479cfff7f..62f38a2dc6a 100644
--- a/chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.h
+++ b/chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/macros.h"
#include "ui/ozone/platform/wayland/host/shell_popup_wrapper.h"
namespace ui {
@@ -41,6 +42,11 @@ class XDGPopupWrapperImpl : public ShellPopupWrapper {
WaylandWindow* parent_window,
const gfx::Rect& bounds);
+ MenuType GetMenuTypeForPositioner(WaylandConnection* connection,
+ WaylandWindow* parent_window) const;
+
+ bool CanGrabPopup(WaylandConnection* connection) const;
+
// xdg_popup_listener
static void Configure(void* data,
int32_t x,
diff --git a/chromium/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.cc b/chromium/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.cc
index e7df772ae47..ae1ca159fd4 100644
--- a/chromium/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.cc
+++ b/chromium/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.cc
@@ -119,6 +119,8 @@ void XDGSurfaceWrapperImpl::AckConfigure() {
zxdg_surface_v6_ack_configure(zxdg_surface_v6_.get(),
pending_configure_serial_);
}
+ connection_->wayland_window_manager()->NotifyWindowConfigured(
+ wayland_window_);
}
void XDGSurfaceWrapperImpl::SetWindowGeometry(const gfx::Rect& bounds) {
diff --git a/chromium/ui/ozone/platform/wayland/ozone_platform_wayland.cc b/chromium/ui/ozone/platform/wayland/ozone_platform_wayland.cc
index 8ffb52c5213..894166db3f9 100644
--- a/chromium/ui/ozone/platform/wayland/ozone_platform_wayland.cc
+++ b/chromium/ui/ozone/platform/wayland/ozone_platform_wayland.cc
@@ -14,6 +14,7 @@
#include "base/message_loop/message_pump_type.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "ui/base/buildflags.h"
+#include "ui/base/cursor/cursor_factory.h"
#include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
#include "ui/base/ime/linux/input_method_auralinux.h"
#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
@@ -98,9 +99,7 @@ class OzonePlatformWayland : public OzonePlatform {
return overlay_manager_.get();
}
- CursorFactoryOzone* GetCursorFactoryOzone() override {
- return cursor_factory_.get();
- }
+ CursorFactory* GetCursorFactory() override { return cursor_factory_.get(); }
InputController* GetInputController() override {
return input_controller_.get();
@@ -249,7 +248,7 @@ class OzonePlatformWayland : public OzonePlatform {
std::unique_ptr<KeyboardLayoutEngine> keyboard_layout_engine_;
std::unique_ptr<WaylandConnection> connection_;
std::unique_ptr<WaylandSurfaceFactory> surface_factory_;
- std::unique_ptr<BitmapCursorFactoryOzone> cursor_factory_;
+ std::unique_ptr<CursorFactory> cursor_factory_;
std::unique_ptr<StubOverlayManager> overlay_manager_;
std::unique_ptr<InputController> input_controller_;
std::unique_ptr<GpuPlatformSupportHost> gpu_platform_support_host_;
diff --git a/chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.cc b/chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.cc
index d24c13658aa..cd87cb8aafc 100644
--- a/chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.cc
+++ b/chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.cc
@@ -36,6 +36,12 @@ MockWpPresentation::MockWpPresentation()
MockWpPresentation::~MockWpPresentation() {}
+wl_resource* MockWpPresentation::ReleasePresentationCallback() {
+ auto* presentation_callback = presentation_callback_;
+ presentation_callback_ = nullptr;
+ return presentation_callback;
+}
+
void MockWpPresentation::SendPresentationCallback() {
if (!presentation_callback_)
return;
@@ -50,4 +56,14 @@ void MockWpPresentation::SendPresentationCallback() {
presentation_callback_ = nullptr;
}
+void MockWpPresentation::SendPresentationCallbackDiscarded() {
+ if (!presentation_callback_)
+ return;
+
+ wp_presentation_feedback_send_discarded(presentation_callback_);
+ wl_client_flush(wl_resource_get_client(presentation_callback_));
+ wl_resource_destroy(presentation_callback_);
+ presentation_callback_ = nullptr;
+}
+
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.h b/chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.h
index 616cd6e3fe1..64d09ab4f8e 100644
--- a/chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.h
+++ b/chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.h
@@ -7,7 +7,7 @@
#include <presentation-time-server-protocol.h>
-#include "base/logging.h"
+#include "base/check.h"
#include "base/macros.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "ui/ozone/platform/wayland/test/global_object.h"
@@ -34,7 +34,10 @@ class MockWpPresentation : public GlobalObject {
presentation_callback_ = callback_resource;
}
+ wl_resource* ReleasePresentationCallback();
+
void SendPresentationCallback();
+ void SendPresentationCallbackDiscarded();
private:
wl_resource* presentation_callback_ = nullptr;
diff --git a/chromium/ui/ozone/platform/wayland/test/scoped_wl_array.cc b/chromium/ui/ozone/platform/wayland/test/scoped_wl_array.cc
new file mode 100644
index 00000000000..9977ca1db17
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/test/scoped_wl_array.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/ozone/platform/wayland/test/scoped_wl_array.h"
+
+#include <wayland-server-core.h>
+
+namespace wl {
+
+ScopedWlArray::ScopedWlArray(const std::vector<int32_t> states) {
+ wl_array_init(&array_);
+ for (const auto& state : states)
+ AddStateToWlArray(state);
+}
+
+ScopedWlArray::ScopedWlArray(ScopedWlArray&& rhs) {
+ array_ = rhs.array_;
+ // wl_array_init sets rhs.array_'s fields to nullptr, so that
+ // the free() in wl_array_release() is a no-op.
+ wl_array_init(&rhs.array_);
+}
+
+ScopedWlArray& ScopedWlArray::operator=(ScopedWlArray&& rhs) {
+ wl_array_release(&array_);
+ array_ = rhs.array_;
+ // wl_array_init sets rhs.array_'s fields to nullptr, so that
+ // the free() in wl_array_release() is a no-op.
+ wl_array_init(&rhs.array_);
+ return *this;
+}
+
+ScopedWlArray::~ScopedWlArray() {
+ wl_array_release(&array_);
+}
+
+void ScopedWlArray::AddStateToWlArray(uint32_t state) {
+ *static_cast<uint32_t*>(wl_array_add(&array_, sizeof array_)) = state;
+}
+
+} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/scoped_wl_array.h b/chromium/ui/ozone/platform/wayland/test/scoped_wl_array.h
new file mode 100644
index 00000000000..d9c86f99265
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/test/scoped_wl_array.h
@@ -0,0 +1,31 @@
+// 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_TEST_SCOPED_WL_ARRAY_H_
+#define UI_OZONE_PLATFORM_WAYLAND_TEST_SCOPED_WL_ARRAY_H_
+
+#include <wayland-server-core.h>
+
+#include <vector>
+
+namespace wl {
+
+class ScopedWlArray {
+ public:
+ explicit ScopedWlArray(const std::vector<int32_t> states);
+ ScopedWlArray(ScopedWlArray&& rhs);
+ ScopedWlArray& operator=(ScopedWlArray&& rhs);
+ ~ScopedWlArray();
+
+ wl_array* get() { return &array_; }
+
+ void AddStateToWlArray(uint32_t state);
+
+ private:
+ wl_array array_;
+};
+
+} // namespace wl
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_TEST_SCOPED_WL_ARRAY_H_
diff --git a/chromium/ui/ozone/platform/wayland/test/test_data_device.cc b/chromium/ui/ozone/platform/wayland/test/test_data_device.cc
index fcd71d6e9c5..6fc8a3e464d 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_data_device.cc
+++ b/chromium/ui/ozone/platform/wayland/test/test_data_device.cc
@@ -6,8 +6,13 @@
#include <wayland-server-core.h>
+#include <cstdint>
+
#include "base/notreached.h"
+#include "ui/ozone/platform/wayland/test/mock_surface.h"
+#include "ui/ozone/platform/wayland/test/server_object.h"
#include "ui/ozone/platform/wayland/test/test_data_offer.h"
+#include "ui/ozone/platform/wayland/test/test_data_source.h"
namespace wl {
@@ -19,7 +24,11 @@ void DataDeviceStartDrag(wl_client* client,
wl_resource* origin,
wl_resource* icon,
uint32_t serial) {
- NOTIMPLEMENTED();
+ auto* data_source = GetUserDataAs<TestDataSource>(source);
+ auto* origin_surface = GetUserDataAs<MockSurface>(origin);
+
+ GetUserDataAs<TestDataDevice>(resource)->StartDrag(data_source,
+ origin_surface, serial);
}
void DataDeviceSetSelection(wl_client* client,
@@ -50,6 +59,16 @@ void TestDataDevice::SetSelection(TestDataSource* data_source,
NOTIMPLEMENTED();
}
+void TestDataDevice::StartDrag(TestDataSource* source,
+ MockSurface* origin,
+ uint32_t serial) {
+ DCHECK(source);
+ DCHECK(origin);
+ if (delegate_)
+ delegate_->StartDrag(source, origin, serial);
+ wl_client_flush(client_);
+}
+
TestDataOffer* TestDataDevice::OnDataOffer() {
wl_resource* data_offer_resource = CreateResourceWithImpl<TestDataOffer>(
client_, &wl_data_offer_interface, wl_resource_get_version(resource()),
diff --git a/chromium/ui/ozone/platform/wayland/test/test_data_device.h b/chromium/ui/ozone/platform/wayland/test/test_data_device.h
index 9ac3357ed53..85ad4af518a 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_data_device.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_data_device.h
@@ -7,7 +7,10 @@
#include <wayland-server-protocol.h>
+#include <cstdint>
+
#include "base/macros.h"
+#include "ui/ozone/platform/wayland/test/mock_surface.h"
#include "ui/ozone/platform/wayland/test/server_object.h"
struct wl_client;
@@ -22,10 +25,21 @@ class TestDataSource;
class TestDataDevice : public ServerObject {
public:
+ struct Delegate {
+ virtual void StartDrag(TestDataSource* source,
+ MockSurface* origin,
+ uint32_t serial) = 0;
+ };
+
TestDataDevice(wl_resource* resource, wl_client* client);
~TestDataDevice() override;
+ void set_delegate(Delegate* delegate) { delegate_ = delegate; }
+
void SetSelection(TestDataSource* data_source, uint32_t serial);
+ void StartDrag(TestDataSource* data_source,
+ MockSurface* origin,
+ uint32_t serial);
TestDataOffer* OnDataOffer();
void OnEnter(uint32_t serial,
@@ -41,6 +55,7 @@ class TestDataDevice : public ServerObject {
private:
TestDataOffer* data_offer_;
wl_client* client_ = nullptr;
+ Delegate* delegate_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(TestDataDevice);
};
diff --git a/chromium/ui/ozone/platform/wayland/test/test_data_source.cc b/chromium/ui/ozone/platform/wayland/test/test_data_source.cc
index 530a2e443c7..4d11ec8e9b1 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_data_source.cc
+++ b/chromium/ui/ozone/platform/wayland/test/test_data_source.cc
@@ -5,6 +5,8 @@
#include "ui/ozone/platform/wayland/test/test_data_source.h"
#include <wayland-server-core.h>
+
+#include <cstdint>
#include <utility>
#include "base/bind.h"
@@ -51,16 +53,16 @@ void DataSourceDestroy(wl_client* client, wl_resource* resource) {
wl_resource_destroy(resource);
}
-void SetActions(wl_client* client,
- wl_resource* resource,
- uint32_t dnd_actions) {
- NOTIMPLEMENTED();
+void DataSourceSetActions(wl_client* client,
+ wl_resource* resource,
+ uint32_t dnd_actions) {
+ GetUserDataAs<TestDataSource>(resource)->SetActions(dnd_actions);
}
} // namespace
const struct wl_data_source_interface kTestDataSourceImpl = {
- DataSourceOffer, DataSourceDestroy, SetActions};
+ DataSourceOffer, DataSourceDestroy, DataSourceSetActions};
TestDataSource::TestDataSource(wl_resource* resource)
: ServerObject(resource),
@@ -70,7 +72,11 @@ TestDataSource::TestDataSource(wl_resource* resource)
TestDataSource::~TestDataSource() {}
void TestDataSource::Offer(const std::string& mime_type) {
- NOTIMPLEMENTED();
+ mime_types_.push_back(mime_type);
+}
+
+void TestDataSource::SetActions(uint32_t dnd_actions) {
+ actions_ |= dnd_actions;
}
void TestDataSource::ReadData(const std::string& mime_type,
diff --git a/chromium/ui/ozone/platform/wayland/test/test_data_source.h b/chromium/ui/ozone/platform/wayland/test/test_data_source.h
index 3cfdbff7a69..bcf66c3c26a 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_data_source.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_data_source.h
@@ -7,10 +7,12 @@
#include <wayland-server-protocol.h>
+#include <cstdint>
#include <memory>
#include <string>
#include <vector>
+#include "base/callback_forward.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "ui/ozone/platform/wayland/test/server_object.h"
@@ -31,15 +33,23 @@ class TestDataSource : public ServerObject {
~TestDataSource() override;
void Offer(const std::string& mime_type);
+ void SetActions(uint32_t dnd_actions);
using ReadDataCallback = base::OnceCallback<void(std::vector<uint8_t>&&)>;
void ReadData(const std::string& mime_type, ReadDataCallback callback);
void OnCancelled();
+ std::vector<std::string> mime_types() const { return mime_types_; }
+
+ uint32_t actions() const { return actions_; }
+
private:
const scoped_refptr<base::SequencedTaskRunner> task_runner_;
+ std::vector<std::string> mime_types_;
+ uint32_t actions_ = WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE;
+
DISALLOW_COPY_AND_ASSIGN(TestDataSource);
};
diff --git a/chromium/ui/ozone/platform/wayland/test/test_subsurface.cc b/chromium/ui/ozone/platform/wayland/test/test_subsurface.cc
index 1609bb2012a..73773c773b1 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_subsurface.cc
+++ b/chromium/ui/ozone/platform/wayland/test/test_subsurface.cc
@@ -4,7 +4,7 @@
#include "ui/ozone/platform/wayland/test/mock_surface.h"
-#include "base/logging.h"
+#include "base/notreached.h"
namespace wl {
diff --git a/chromium/ui/ozone/platform/wayland/test/wayland_test.cc b/chromium/ui/ozone/platform/wayland/test/wayland_test.cc
index 2866ab6a07f..67c8f2bbaf2 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/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"
+#include "ui/ozone/platform/wayland/test/scoped_wl_array.h"
#include "ui/platform_window/platform_window_init_properties.h"
#if BUILDFLAG(USE_XKBCOMMON)
@@ -66,6 +67,11 @@ void WaylandTest::SetUp() {
surface_ = server_.GetObject<wl::MockSurface>(widget_);
ASSERT_TRUE(surface_);
+ // The surface must be activated before buffers are attached.
+ ActivateSurface(server_.GetObject<wl::MockSurface>(widget_)->xdg_surface());
+
+ Sync();
+
initialized_ = true;
}
@@ -86,4 +92,33 @@ void WaylandTest::Sync() {
server_.Pause();
}
+void WaylandTest::SendConfigureEvent(wl::MockXdgSurface* xdg_surface,
+ int width,
+ int height,
+ uint32_t serial,
+ struct wl_array* states) {
+ // In xdg_shell_v6+, both surfaces send serial configure event and toplevel
+ // surfaces send other data like states, heights and widths.
+ // Please note that toplevel surfaces may not exist if the surface was created
+ // for the popup role.
+ if (GetParam() == kXdgShellV6) {
+ zxdg_surface_v6_send_configure(xdg_surface->resource(), serial);
+ if (xdg_surface->xdg_toplevel()) {
+ zxdg_toplevel_v6_send_configure(xdg_surface->xdg_toplevel()->resource(),
+ width, height, states);
+ }
+ } else {
+ xdg_surface_send_configure(xdg_surface->resource(), serial);
+ if (xdg_surface->xdg_toplevel()) {
+ xdg_toplevel_send_configure(xdg_surface->xdg_toplevel()->resource(),
+ width, height, states);
+ }
+ }
+}
+
+void WaylandTest::ActivateSurface(wl::MockXdgSurface* xdg_surface) {
+ wl::ScopedWlArray state({XDG_TOPLEVEL_STATE_ACTIVATED});
+ SendConfigureEvent(xdg_surface, 0, 0, 1, state.get());
+}
+
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/test/wayland_test.h b/chromium/ui/ozone/platform/wayland/test/wayland_test.h
index fc8161eb51d..97df3efbade 100644
--- a/chromium/ui/ozone/platform/wayland/test/wayland_test.h
+++ b/chromium/ui/ozone/platform/wayland/test/wayland_test.h
@@ -24,6 +24,7 @@
namespace wl {
class MockSurface;
+class MockXdgSurface;
} // namespace wl
namespace ui {
@@ -47,6 +48,18 @@ class WaylandTest : public ::testing::TestWithParam<uint32_t> {
void Sync();
protected:
+ // Sends configure event for the |xdg_surface|.
+ void SendConfigureEvent(wl::MockXdgSurface* xdg_surface,
+ int width,
+ int height,
+ uint32_t serial,
+ struct wl_array* states);
+
+ // Sends XDG_TOPLEVEL_STATE_ACTIVATED to the |xdg_surface| with width and
+ // height set to 0, which results in asking the client to set the width and
+ // height of the surface.
+ void ActivateSurface(wl::MockXdgSurface* xdg_surface);
+
base::test::TaskEnvironment task_environment_;
wl::TestWaylandServerThread server_;
diff --git a/chromium/ui/ozone/platform/wayland/wayland_buffer_manager_unittest.cc b/chromium/ui/ozone/platform/wayland/wayland_buffer_manager_unittest.cc
index de10370fe69..acf7594d5e2 100644
--- a/chromium/ui/ozone/platform/wayland/wayland_buffer_manager_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/wayland_buffer_manager_unittest.cc
@@ -125,7 +125,7 @@ class WaylandBufferManagerTest : public WaylandTest {
}
}
- void CreateDmabufBasedBufferAndSetTerminateExpecation(
+ void CreateDmabufBasedBufferAndSetTerminateExpectation(
bool fail,
uint32_t buffer_id,
base::ScopedFD fd = base::ScopedFD(),
@@ -187,11 +187,14 @@ class WaylandBufferManagerTest : public WaylandTest {
}
}
- std::unique_ptr<WaylandWindow> CreateWindow() {
+ std::unique_ptr<WaylandWindow> CreateWindow(
+ PlatformWindowType type = PlatformWindowType::kWindow,
+ gfx::AcceleratedWidget parent_widget = gfx::kNullAcceleratedWidget) {
testing::Mock::VerifyAndClearExpectations(&delegate_);
PlatformWindowInitProperties properties;
properties.bounds = gfx::Rect(0, 0, 800, 600);
- properties.type = PlatformWindowType::kWindow;
+ properties.type = type;
+ properties.parent_widget = parent_widget;
auto new_window = WaylandWindow::Create(&delegate_, connection_.get(),
std::move(properties));
EXPECT_TRUE(new_window);
@@ -214,8 +217,8 @@ TEST_P(WaylandBufferManagerTest, CreateDmabufBasedBuffers) {
EXPECT_CALL(*server_.zwp_linux_dmabuf_v1(), CreateParams(_, _, _)).Times(1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/,
- kDmabufBufferId);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/,
+ kDmabufBufferId);
DestroyBufferAndSetTerminateExpectation(gfx::kNullAcceleratedWidget,
kDmabufBufferId, false /*fail*/);
}
@@ -255,7 +258,7 @@ TEST_P(WaylandBufferManagerTest, VerifyModifiers) {
EXPECT_CALL(*server_.zwp_linux_dmabuf_v1(), CreateParams(_, _, _)).Times(1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(
+ CreateDmabufBasedBufferAndSetTerminateExpectation(
false /*fail*/, kDmabufBufferId, base::ScopedFD(), kDefaultSize, {1}, {2},
{kFormatModiferLinear}, kFourccFormatR8, 1);
@@ -304,7 +307,7 @@ TEST_P(WaylandBufferManagerTest, ValidateDataFromGpu) {
for (const auto& bad : kBadInputs) {
EXPECT_CALL(*server_.zwp_linux_dmabuf_v1(), CreateParams(_, _, _)).Times(0);
base::ScopedFD dummy;
- CreateDmabufBasedBufferAndSetTerminateExpecation(
+ CreateDmabufBasedBufferAndSetTerminateExpectation(
true /*fail*/, bad.buffer_id,
bad.has_file ? MakeFD() : std::move(dummy), bad.size, bad.strides,
bad.offsets, bad.modifiers, bad.format, bad.planes_count);
@@ -321,25 +324,27 @@ TEST_P(WaylandBufferManagerTest, CreateAndDestroyBuffer) {
// id if they haven't been assigned to any surfaces yet.
{
EXPECT_CALL(*server_.zwp_linux_dmabuf_v1(), CreateParams(_, _, _)).Times(2);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/,
- kBufferId1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/,
- kBufferId2);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/,
+ kBufferId1);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/,
+ kBufferId2);
// Can't create buffer with existing id.
- CreateDmabufBasedBufferAndSetTerminateExpecation(true /*fail*/, kBufferId2);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(true /*fail*/,
+ kBufferId2);
}
// ... impossible to create buffers with the same id if one of them
// has already been attached to a surface.
{
EXPECT_CALL(*server_.zwp_linux_dmabuf_v1(), CreateParams(_, _, _)).Times(1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/,
- kBufferId1);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/,
+ kBufferId1);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, window_->GetBounds());
- CreateDmabufBasedBufferAndSetTerminateExpecation(true /*fail*/, kBufferId1);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(true /*fail*/,
+ kBufferId1);
}
// ... impossible to destroy non-existing buffer.
@@ -356,8 +361,8 @@ TEST_P(WaylandBufferManagerTest, CreateAndDestroyBuffer) {
// specified.
{
EXPECT_CALL(*server_.zwp_linux_dmabuf_v1(), CreateParams(_, _, _)).Times(1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/,
- kBufferId1);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/,
+ kBufferId1);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, window_->GetBounds());
@@ -369,22 +374,22 @@ TEST_P(WaylandBufferManagerTest, CreateAndDestroyBuffer) {
// widgets.
{
EXPECT_CALL(*server_.zwp_linux_dmabuf_v1(), CreateParams(_, _, _)).Times(1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/,
- kBufferId1);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/,
+ kBufferId1);
DestroyBufferAndSetTerminateExpectation(widget, kBufferId1, false /*fail*/);
}
// ... impossible to destroy buffers twice.
{
EXPECT_CALL(*server_.zwp_linux_dmabuf_v1(), CreateParams(_, _, _)).Times(3);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/,
- kBufferId1);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/,
+ kBufferId1);
// Attach to a surface.
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, window_->GetBounds());
// Created non-attached buffer as well.
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/,
- kBufferId2);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/,
+ kBufferId2);
DestroyBufferAndSetTerminateExpectation(widget, kBufferId1, false /*fail*/);
// Can't destroy the buffer with non-existing id (the manager cleared the
@@ -397,8 +402,8 @@ TEST_P(WaylandBufferManagerTest, CreateAndDestroyBuffer) {
kBufferId2, true /*fail*/);
// Create and destroy non-attached buffer twice.
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/,
- kBufferId2);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/,
+ kBufferId2);
DestroyBufferAndSetTerminateExpectation(gfx::kNullAcceleratedWidget,
kBufferId2, false /*fail*/);
DestroyBufferAndSetTerminateExpectation(gfx::kNullAcceleratedWidget,
@@ -408,7 +413,7 @@ TEST_P(WaylandBufferManagerTest, CreateAndDestroyBuffer) {
TEST_P(WaylandBufferManagerTest, CommitBufferNonExistingBufferId) {
EXPECT_CALL(*server_.zwp_linux_dmabuf_v1(), CreateParams(_, _, _)).Times(1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/, 1u);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, 1u);
// Can't commit for non-existing buffer id.
SetTerminateCallbackExpectationAndDestroyChannel(&callback_, true /*fail*/);
@@ -421,7 +426,7 @@ TEST_P(WaylandBufferManagerTest, CommitBufferNonExistingBufferId) {
TEST_P(WaylandBufferManagerTest, CommitBufferNullWidget) {
constexpr uint32_t kBufferId = 1;
EXPECT_CALL(*server_.zwp_linux_dmabuf_v1(), CreateParams(_, _, _)).Times(1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/, kBufferId);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId);
// Can't commit for non-existing widget.
SetTerminateCallbackExpectationAndDestroyChannel(&callback_, true /*fail*/);
@@ -443,8 +448,8 @@ TEST_P(WaylandBufferManagerTest, EnsureCorrectOrderOfCallbacks) {
auto* linux_dmabuf = server_.zwp_linux_dmabuf_v1();
EXPECT_CALL(*linux_dmabuf, CreateParams(_, _, _)).Times(2);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/, kBufferId1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/, kBufferId2);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId1);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId2);
Sync();
@@ -551,9 +556,9 @@ TEST_P(WaylandBufferManagerTest,
auto* linux_dmabuf = server_.zwp_linux_dmabuf_v1();
EXPECT_CALL(*linux_dmabuf, CreateParams(_, _, _)).Times(3);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/, kBufferId1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/, kBufferId2);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/, kBufferId3);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId1);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId2);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId3);
Sync();
@@ -650,7 +655,149 @@ TEST_P(WaylandBufferManagerTest,
DestroyBufferAndSetTerminateExpectation(widget, kBufferId3, false /*fail*/);
}
-TEST_P(WaylandBufferManagerTest, MultiplePendingPresentationsForSameBuffer) {}
+// This test ensures that a discarded presentation feedback sent prior receiving
+// results for the previous presentation feedback does not make them
+// automatically failed.
+TEST_P(WaylandBufferManagerTest,
+ EnsureDiscardedPresentationDoesNotMakePreviousFeedbacksFailed) {
+ constexpr uint32_t kBufferId1 = 1;
+ constexpr uint32_t kBufferId2 = 2;
+ constexpr uint32_t kBufferId3 = 3;
+
+ // Enable wp_presentation support.
+ auto* mock_wp_presentation = server_.EnsureWpPresentation();
+ ASSERT_TRUE(mock_wp_presentation);
+
+ const gfx::AcceleratedWidget widget = window_->GetWidget();
+ const gfx::Rect bounds = gfx::Rect({0, 0}, kDefaultSize);
+ window_->SetBounds(bounds);
+
+ MockSurfaceGpu mock_surface_gpu(buffer_manager_gpu_.get(), widget_);
+
+ auto* linux_dmabuf = server_.zwp_linux_dmabuf_v1();
+ EXPECT_CALL(*linux_dmabuf, CreateParams(_, _, _)).Times(3);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId1);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId2);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId3);
+
+ Sync();
+
+ ProcessCreatedBufferResourcesWithExpectation(3u /* expected size */,
+ false /* fail */);
+
+ auto* mock_surface = server_.GetObject<wl::MockSurface>(widget);
+
+ constexpr uint32_t kNumberOfCommits = 3;
+ EXPECT_CALL(*mock_surface, Attach(_, _, _)).Times(kNumberOfCommits);
+ EXPECT_CALL(*mock_surface, Frame(_)).Times(kNumberOfCommits);
+ EXPECT_CALL(*mock_surface, Commit()).Times(kNumberOfCommits);
+
+ // All the other expectations must come in order.
+ ::testing::InSequence sequence;
+ EXPECT_CALL(mock_surface_gpu,
+ OnSubmission(kBufferId1, gfx::SwapResult::SWAP_ACK))
+ .Times(1);
+ EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0);
+
+ // Commit first buffer
+ buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds);
+
+ Sync();
+
+ // Will be sent later.
+ auto* presentation_callback1 =
+ mock_wp_presentation->ReleasePresentationCallback();
+
+ mock_surface->SendFrameCallback();
+
+ Sync();
+
+ EXPECT_CALL(mock_surface_gpu,
+ OnSubmission(kBufferId2, gfx::SwapResult::SWAP_ACK))
+ .Times(1);
+ EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0);
+
+ // Commit second buffer
+ buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, bounds);
+
+ Sync();
+
+ // Will be sent later.
+ auto* presentation_callback2 =
+ mock_wp_presentation->ReleasePresentationCallback();
+
+ // Release previous buffer and commit third buffer.
+ mock_surface->ReleasePrevAttachedBuffer();
+ mock_surface->SendFrameCallback();
+
+ Sync();
+
+ EXPECT_CALL(mock_surface_gpu,
+ OnSubmission(kBufferId3, gfx::SwapResult::SWAP_ACK))
+ .Times(1);
+ EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0);
+
+ // Commit third buffer
+ buffer_manager_gpu_->CommitBuffer(widget, kBufferId3, bounds);
+
+ Sync();
+
+ mock_surface->ReleasePrevAttachedBuffer();
+
+ Sync();
+
+ // Even though WaylandBufferManagerHost stores the previous stores
+ // presentation feedbacks and waits for their value, the current last one
+ // mustn't result in the previous marked as failed. Thus, no feedback must be
+ // actually sent to the MockSurfaceGpu as it's required to send feedbacks in
+ // order.
+ EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0);
+
+ mock_wp_presentation->SendPresentationCallbackDiscarded();
+
+ Sync();
+
+ // Now, start to send all the previous callbacks.
+ EXPECT_CALL(mock_surface_gpu,
+ OnPresentation(
+ kBufferId1,
+ ::testing::Field(
+ &gfx::PresentationFeedback::flags,
+ ::testing::Eq(gfx::PresentationFeedback::Flags::kVSync))))
+ .Times(1);
+
+ mock_wp_presentation->set_presentation_callback(presentation_callback1);
+ mock_wp_presentation->SendPresentationCallback();
+
+ Sync();
+
+ // Now, send the second presentation feedback. It will send both second and
+ // third feedback that was discarded.
+ EXPECT_CALL(mock_surface_gpu,
+ OnPresentation(
+ kBufferId2,
+ ::testing::Field(
+ &gfx::PresentationFeedback::flags,
+ ::testing::Eq(gfx::PresentationFeedback::Flags::kVSync))))
+ .Times(1);
+ EXPECT_CALL(
+ mock_surface_gpu,
+ OnPresentation(
+ kBufferId3,
+ ::testing::Field(
+ &gfx::PresentationFeedback::flags,
+ ::testing::Eq(gfx::PresentationFeedback::Flags::kFailure))))
+ .Times(1);
+
+ mock_wp_presentation->set_presentation_callback(presentation_callback2);
+ mock_wp_presentation->SendPresentationCallback();
+
+ Sync();
+
+ DestroyBufferAndSetTerminateExpectation(widget, kBufferId1, false /*fail*/);
+ DestroyBufferAndSetTerminateExpectation(widget, kBufferId2, false /*fail*/);
+ DestroyBufferAndSetTerminateExpectation(widget, kBufferId3, false /*fail*/);
+}
TEST_P(WaylandBufferManagerTest, TestCommitBufferConditions) {
constexpr uint32_t kDmabufBufferId = 1;
@@ -662,8 +809,8 @@ TEST_P(WaylandBufferManagerTest, TestCommitBufferConditions) {
auto* linux_dmabuf = server_.zwp_linux_dmabuf_v1();
EXPECT_CALL(*linux_dmabuf, CreateParams(_, _, _)).Times(1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/,
- kDmabufBufferId);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/,
+ kDmabufBufferId);
// Part 1: the surface mustn't have a buffer attached until
// zwp_linux_buffer_params_v1_send_created is called. Instead, the buffer must
@@ -694,8 +841,8 @@ TEST_P(WaylandBufferManagerTest, TestCommitBufferConditions) {
// sent by the server.
EXPECT_CALL(*linux_dmabuf, CreateParams(_, _, _)).Times(1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/,
- kDmabufBufferId2);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/,
+ kDmabufBufferId2);
ProcessCreatedBufferResourcesWithExpectation(1u /* expected size */,
false /* fail */);
@@ -726,6 +873,77 @@ TEST_P(WaylandBufferManagerTest, TestCommitBufferConditions) {
false /*fail*/);
}
+// Tests the surface does not have buffers attached until it's configured at
+// least once.
+TEST_P(WaylandBufferManagerTest, TestCommitBufferConditionsAckConfigured) {
+ constexpr uint32_t kDmabufBufferId = 1;
+
+ // Exercise three window types that create different windows - toplevel, popup
+ // and subsurface.
+ std::vector<PlatformWindowType> window_types{PlatformWindowType::kWindow,
+ PlatformWindowType::kPopup,
+ PlatformWindowType::kTooltip};
+
+ for (const auto& type : window_types) {
+ // If the type is not kWindow, provide default created window as parent of
+ // the newly created window.
+ auto temp_window = CreateWindow(type, type != PlatformWindowType::kWindow
+ ? widget_
+ : gfx::kNullAcceleratedWidget);
+ auto widget = temp_window->GetWidget();
+
+ // Subsurface doesn't have an interface for sending configure events.
+ // Thus, WaylandSubsurface notifies the manager that the window is
+ // activated upon creation of the subsurface. Skip calling Show() and call
+ // later then.
+ if (type != PlatformWindowType::kTooltip)
+ temp_window->Show(false);
+
+ Sync();
+
+ auto* mock_surface = server_.GetObject<wl::MockSurface>(widget);
+
+ auto* linux_dmabuf = server_.zwp_linux_dmabuf_v1();
+ EXPECT_CALL(*linux_dmabuf, CreateParams(_, _, _)).Times(1);
+
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/,
+ kDmabufBufferId);
+
+ Sync();
+
+ ProcessCreatedBufferResourcesWithExpectation(1u /* expected size */,
+ false /* fail */);
+
+ EXPECT_CALL(*mock_surface, Attach(_, _, _)).Times(0);
+ EXPECT_CALL(*mock_surface, Frame(_)).Times(0);
+ EXPECT_CALL(*mock_surface, Commit()).Times(0);
+
+ buffer_manager_gpu_->CommitBuffer(widget, kDmabufBufferId,
+ window_->GetBounds());
+ Sync();
+
+ if (type != PlatformWindowType::kTooltip) {
+ DCHECK(mock_surface->xdg_surface());
+ ActivateSurface(mock_surface->xdg_surface());
+ } else {
+ // See the comment near Show() call above.
+ temp_window->Show(false);
+ }
+
+ EXPECT_CALL(*mock_surface, Attach(_, _, _)).Times(1);
+ EXPECT_CALL(*mock_surface, Frame(_)).Times(1);
+ EXPECT_CALL(*mock_surface, Commit()).Times(1);
+
+ Sync();
+
+ temp_window.reset();
+ DestroyBufferAndSetTerminateExpectation(widget, kDmabufBufferId,
+ false /*fail*/);
+
+ Sync();
+ }
+}
+
// The buffer that is not originally attached to any of the surfaces,
// must be attached when a commit request comes. Also, it must setup a buffer
// release listener and OnSubmission must be called for that buffer if it is
@@ -743,7 +961,7 @@ TEST_P(WaylandBufferManagerTest, AnonymousBufferAttachedAndReleased) {
auto* linux_dmabuf = server_.zwp_linux_dmabuf_v1();
EXPECT_CALL(*linux_dmabuf, CreateParams(_, _, _)).Times(1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/, kBufferId1);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId1);
Sync();
@@ -776,7 +994,7 @@ TEST_P(WaylandBufferManagerTest, AnonymousBufferAttachedAndReleased) {
// Now synchronously create a second buffer and commit it. The release
// callback must be setup and OnSubmission must be called.
EXPECT_CALL(*linux_dmabuf, CreateParams(_, _, _)).Times(1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/, kBufferId2);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId2);
Sync();
@@ -804,7 +1022,7 @@ TEST_P(WaylandBufferManagerTest, AnonymousBufferAttachedAndReleased) {
// released once the buffer is committed and processed (that is, it must be
// able to setup a buffer release callback).
EXPECT_CALL(*linux_dmabuf, CreateParams(_, _, _)).Times(1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/, kBufferId3);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId3);
Sync();
@@ -845,7 +1063,7 @@ TEST_P(WaylandBufferManagerTest, DestroyBufferForDestroyedWindow) {
auto widget = temp_window->GetWidget();
EXPECT_CALL(*server_.zwp_linux_dmabuf_v1(), CreateParams(_, _, _)).Times(1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/, kBufferId);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId);
Sync();
@@ -866,7 +1084,7 @@ TEST_P(WaylandBufferManagerTest, DestroyedWindowNoSubmissionSingleBuffer) {
auto bounds = temp_window->GetBounds();
EXPECT_CALL(*server_.zwp_linux_dmabuf_v1(), CreateParams(_, _, _)).Times(1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/, kBufferId);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId);
ProcessCreatedBufferResourcesWithExpectation(1u /* expected size */,
false /* fail */);
@@ -894,11 +1112,22 @@ TEST_P(WaylandBufferManagerTest, DestroyedWindowNoSubmissionMultipleBuffers) {
constexpr uint32_t kBufferId2 = 2;
auto temp_window = CreateWindow();
+ temp_window->Show(false);
+
+ Sync();
+
auto widget = temp_window->GetWidget();
auto bounds = temp_window->GetBounds();
+ auto* mock_surface = server_.GetObject<wl::MockSurface>(widget);
+ ASSERT_TRUE(mock_surface);
+
+ ActivateSurface(mock_surface->xdg_surface());
+
+ Sync();
+
EXPECT_CALL(*server_.zwp_linux_dmabuf_v1(), CreateParams(_, _, _)).Times(1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/, kBufferId1);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId1);
ProcessCreatedBufferResourcesWithExpectation(1u /* expected size */,
false /* fail */);
@@ -915,13 +1144,12 @@ TEST_P(WaylandBufferManagerTest, DestroyedWindowNoSubmissionMultipleBuffers) {
Sync();
- auto* mock_surface = server_.GetObject<wl::MockSurface>(widget);
mock_surface->SendFrameCallback();
Sync();
EXPECT_CALL(*server_.zwp_linux_dmabuf_v1(), CreateParams(_, _, _)).Times(1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/, kBufferId2);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId2);
ProcessCreatedBufferResourcesWithExpectation(1u /* expected size */,
false /* fail */);
@@ -966,8 +1194,8 @@ TEST_P(WaylandBufferManagerTest, SubmitSameBufferMultipleTimes) {
auto* linux_dmabuf = server_.zwp_linux_dmabuf_v1();
EXPECT_CALL(*linux_dmabuf, CreateParams(_, _, _)).Times(2);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/, kBufferId1);
- CreateDmabufBasedBufferAndSetTerminateExpecation(false /*fail*/, kBufferId2);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId1);
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId2);
Sync();
diff --git a/chromium/ui/ozone/platform/windows/BUILD.gn b/chromium/ui/ozone/platform/windows/BUILD.gn
index 766c32795be..72fb3aae39a 100644
--- a/chromium/ui/ozone/platform/windows/BUILD.gn
+++ b/chromium/ui/ozone/platform/windows/BUILD.gn
@@ -24,6 +24,8 @@ source_set("windows") {
"//base",
"//skia",
"//ui/base",
+ "//ui/base/cursor",
+ "//ui/base/cursor:cursor_base",
"//ui/display/fake",
"//ui/events",
"//ui/events/ozone/layout",
diff --git a/chromium/ui/ozone/platform/windows/ozone_platform_windows.cc b/chromium/ui/ozone/platform/windows/ozone_platform_windows.cc
index d6dee8a511c..5a686f01622 100644
--- a/chromium/ui/ozone/platform/windows/ozone_platform_windows.cc
+++ b/chromium/ui/ozone/platform/windows/ozone_platform_windows.cc
@@ -10,6 +10,7 @@
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
+#include "ui/base/cursor/cursor_factory.h"
#include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
#include "ui/display/fake/fake_display_delegate.h"
#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
@@ -20,7 +21,6 @@
#include "ui/ozone/platform/windows/windows_surface_factory.h"
#include "ui/ozone/platform/windows/windows_window.h"
#include "ui/ozone/platform/windows/windows_window_manager.h"
-#include "ui/ozone/public/cursor_factory_ozone.h"
#include "ui/ozone/public/gpu_platform_support_host.h"
#include "ui/ozone/public/input_controller.h"
#include "ui/ozone/public/ozone_platform.h"
@@ -56,9 +56,7 @@ class OzonePlatformWindows : public OzonePlatform {
OverlayManagerOzone* GetOverlayManager() override {
return overlay_manager_.get();
}
- CursorFactoryOzone* GetCursorFactoryOzone() override {
- return cursor_factory_ozone_.get();
- }
+ CursorFactory* GetCursorFactory() override { return cursor_factory_.get(); }
InputController* GetInputController() override {
return input_controller_.get();
}
@@ -96,7 +94,7 @@ class OzonePlatformWindows : public OzonePlatform {
overlay_manager_ = std::make_unique<StubOverlayManager>();
input_controller_ = CreateStubInputController();
- cursor_factory_ozone_ = std::make_unique<BitmapCursorFactoryOzone>();
+ cursor_factory_ = std::make_unique<BitmapCursorFactory>();
gpu_platform_support_host_.reset(CreateStubGpuPlatformSupportHost());
}
@@ -110,7 +108,7 @@ class OzonePlatformWindows : public OzonePlatform {
std::unique_ptr<WindowsWindowManager> window_manager_;
std::unique_ptr<WindowsSurfaceFactory> surface_factory_;
std::unique_ptr<PlatformEventSource> platform_event_source_;
- std::unique_ptr<CursorFactoryOzone> cursor_factory_ozone_;
+ std::unique_ptr<CursorFactory> cursor_factory_;
std::unique_ptr<InputController> input_controller_;
std::unique_ptr<GpuPlatformSupportHost> gpu_platform_support_host_;
std::unique_ptr<OverlayManagerOzone> overlay_manager_;
diff --git a/chromium/ui/ozone/platform/x11/BUILD.gn b/chromium/ui/ozone/platform/x11/BUILD.gn
index fcdb99cdf60..35b64eb2caa 100644
--- a/chromium/ui/ozone/platform/x11/BUILD.gn
+++ b/chromium/ui/ozone/platform/x11/BUILD.gn
@@ -24,18 +24,12 @@ source_set("x11") {
"x11_canvas_surface.h",
"x11_clipboard_ozone.cc",
"x11_clipboard_ozone.h",
- "x11_cursor_factory_ozone.cc",
- "x11_cursor_factory_ozone.h",
- "x11_cursor_ozone.cc",
- "x11_cursor_ozone.h",
"x11_screen_ozone.cc",
"x11_screen_ozone.h",
"x11_surface_factory.cc",
"x11_surface_factory.h",
]
- public_deps = [ "//ui/base/cursor/mojom:cursor_type" ]
-
deps = [
"//base",
"//build:chromecast_buildflags",
@@ -45,6 +39,7 @@ source_set("x11") {
"//ui/base:buildflags",
"//ui/base:data_exchange",
"//ui/base/clipboard:clipboard_types",
+ "//ui/base/cursor:cursor_base",
"//ui/base/ime",
"//ui/base/x",
"//ui/base/x:gl",
@@ -68,17 +63,11 @@ source_set("x11") {
]
if (is_chromeos) {
- sources += [
- "x11_window_ozone_chromeos.cc",
- "x11_window_ozone_chromeos.h",
- ]
deps += [ "//ui/base/ime/chromeos" ]
} else {
sources += [
"x11_os_exchange_data_provider_ozone.cc",
"x11_os_exchange_data_provider_ozone.h",
- "x11_window_ozone.cc",
- "x11_window_ozone.h",
]
deps += [ "//ui/base/ime/linux" ]
}
@@ -101,7 +90,6 @@ source_set("x11") {
source_set("x11_unittests") {
testonly = true
sources = [
- "x11_cursor_factory_ozone_unittest.cc",
"x11_screen_ozone_unittest.cc",
"x11_window_ozone_unittest.cc",
]
diff --git a/chromium/ui/ozone/platform/x11/ozone_platform_x11.cc b/chromium/ui/ozone/platform/x11/ozone_platform_x11.cc
index 2d26ced5587..394ef374c81 100644
--- a/chromium/ui/ozone/platform/x11/ozone_platform_x11.cc
+++ b/chromium/ui/ozone/platform/x11/ozone_platform_x11.cc
@@ -11,9 +11,11 @@
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "ui/base/buildflags.h"
+#include "ui/base/cursor/cursor_factory.h"
#include "ui/base/dragdrop/os_exchange_data_provider_factory.h"
#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"
@@ -25,22 +27,22 @@
#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_cursor_factory_ozone.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_window_ozone.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/system_input_injector.h"
#include "ui/platform_window/platform_window.h"
#include "ui/platform_window/platform_window_init_properties.h"
+#include "ui/platform_window/x11/x11_window.h"
#if defined(OS_CHROMEOS)
-#include "ui/base/dragdrop/os_exchange_data_provider_aura.h"
+#include "ui/base/dragdrop/os_exchange_data_provider_non_backed.h"
#include "ui/base/ime/chromeos/input_method_chromeos.h"
#else
-#include "ui/base/ime/linux/input_method_auralinux.h"
+#include "ui/base/ime/linux/input_method_auralinux.h" // nogncheck
+#include "ui/base/ime/linux/linux_input_method_context_factory.h" // nogncheck
#include "ui/ozone/platform/x11/x11_os_exchange_data_provider_ozone.h"
#endif
@@ -88,9 +90,7 @@ class OzonePlatformX11 : public OzonePlatform,
return overlay_manager_.get();
}
- CursorFactoryOzone* GetCursorFactoryOzone() override {
- return cursor_factory_ozone_.get();
- }
+ CursorFactory* GetCursorFactory() override { return cursor_factory_.get(); }
std::unique_ptr<SystemInputInjector> CreateSystemInputInjector() override {
return nullptr;
@@ -107,8 +107,7 @@ class OzonePlatformX11 : public OzonePlatform,
std::unique_ptr<PlatformWindow> CreatePlatformWindow(
PlatformWindowDelegate* delegate,
PlatformWindowInitProperties properties) override {
- std::unique_ptr<X11WindowOzone> window =
- std::make_unique<X11WindowOzone>(delegate);
+ auto window = std::make_unique<X11Window>(delegate);
window->Initialize(std::move(properties));
window->SetTitle(base::ASCIIToUTF16("Ozone X11"));
return std::move(window);
@@ -151,7 +150,7 @@ class OzonePlatformX11 : public OzonePlatform,
std::unique_ptr<OSExchangeDataProvider> CreateProvider() override {
#if defined(OS_CHROMEOS)
- return std::make_unique<OSExchangeDataProviderAura>();
+ return std::make_unique<OSExchangeDataProviderNonBacked>();
#else
return std::make_unique<X11OSExchangeDataProviderOzone>();
#endif
@@ -167,7 +166,7 @@ class OzonePlatformX11 : public OzonePlatform,
overlay_manager_ = std::make_unique<StubOverlayManager>();
input_controller_ = CreateStubInputController();
clipboard_ = std::make_unique<X11ClipboardOzone>();
- cursor_factory_ozone_ = std::make_unique<X11CursorFactoryOzone>();
+ cursor_factory_ = std::make_unique<X11CursorFactory>();
gpu_platform_support_host_.reset(CreateStubGpuPlatformSupportHost());
#if BUILDFLAG(USE_XKBCOMMON)
@@ -202,6 +201,28 @@ class OzonePlatformX11 : public OzonePlatform,
gl_egl_utility_ = std::make_unique<GLEGLUtilityX11>();
}
+ void PostMainMessageLoopStart(
+ base::OnceCallback<void()> shutdown_cb) override {
+ // 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));
+ }
+
+ 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();
+ }
+
private:
// Performs initialization steps need by both UI and GPU.
void InitializeCommon(const InitParams& params) {
@@ -238,7 +259,7 @@ class OzonePlatformX11 : public OzonePlatform,
std::unique_ptr<OverlayManagerOzone> overlay_manager_;
std::unique_ptr<InputController> input_controller_;
std::unique_ptr<X11ClipboardOzone> clipboard_;
- std::unique_ptr<X11CursorFactoryOzone> cursor_factory_ozone_;
+ std::unique_ptr<CursorFactory> cursor_factory_;
std::unique_ptr<GpuPlatformSupportHost> gpu_platform_support_host_;
// Objects in the GPU process.
diff --git a/chromium/ui/ozone/platform/x11/x11_clipboard_ozone.cc b/chromium/ui/ozone/platform/x11/x11_clipboard_ozone.cc
index 0f8b04c4f59..bea9cffe465 100644
--- a/chromium/ui/ozone/platform/x11/x11_clipboard_ozone.cc
+++ b/chromium/ui/ozone/platform/x11/x11_clipboard_ozone.cc
@@ -8,10 +8,14 @@
#include <vector>
#include "base/containers/span.h"
+#include "base/logging.h"
#include "base/stl_util.h"
#include "ui/base/clipboard/clipboard_constants.h"
+#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"
using base::Contains;
@@ -42,13 +46,6 @@ void ExpandTypes(std::vector<std::string>* list) {
list->push_back(kMimeTypeTextUtf8);
}
-XID FindXEventTarget(const XEvent& xev) {
- XID target = xev.xany.window;
- if (xev.type == GenericEvent)
- target = static_cast<XIDeviceEvent*>(xev.xcookie.data)->event;
- return target;
-}
-
} // namespace
// Maintains state of a single selection (aka system clipboard buffer).
@@ -79,7 +76,7 @@ struct X11ClipboardOzone::SelectionState {
PlatformClipboard::RequestDataClosure request_clipboard_data_callback;
// The time that this instance took ownership of the clipboard.
- Time acquired_selection_timestamp;
+ x11::Time acquired_selection_timestamp;
};
X11ClipboardOzone::X11ClipboardOzone()
@@ -87,32 +84,21 @@ X11ClipboardOzone::X11ClipboardOzone()
atom_targets_(gfx::GetAtom(kTargets)),
atom_timestamp_(gfx::GetAtom(kTimestamp)),
x_property_(gfx::GetAtom(kChromeSelection)),
- x_display_(gfx::GetXDisplay()),
- x_window_(XCreateSimpleWindow(x_display_,
- DefaultRootWindow(x_display_),
- /*x=*/-100,
- /*y=*/-100,
- /*width=*/10,
- /*height=*/10,
- /*border_width=*/0,
- /*border=*/0,
- /*background=*/0)) {
- int ignored; // xfixes_error_base.
- if (!XFixesQueryExtension(x_display_, &xfixes_event_base_, &ignored)) {
- LOG(ERROR) << "X server does not support XFixes.";
+ connection_(x11::Connection::Get()),
+ x_window_(CreateDummyWindow("Chromium Clipboard Window")) {
+ if (!connection_->xfixes().present())
return;
- }
using_xfixes_ = true;
// Register to receive standard X11 events.
X11EventSource::GetInstance()->AddXEventDispatcher(this);
- for (auto atom : {atom_clipboard_, XA_PRIMARY}) {
+ for (auto atom : {atom_clipboard_, x11::Atom::PRIMARY}) {
// Register the selection state.
selection_state_.emplace(atom, std::make_unique<SelectionState>());
// Register to receive XFixes notification when selection owner changes.
- XFixesSelectSelectionInput(x_display_, x_window_, atom,
- XFixesSetSelectionOwnerNotifyMask);
+ connection_->xfixes().SelectSelectionInput(
+ {x_window_, atom, x11::XFixes::SelectionEventMask::SetSelectionOwner});
// Prefetch the current remote clipboard contents.
QueryTargets(atom);
}
@@ -122,21 +108,13 @@ X11ClipboardOzone::~X11ClipboardOzone() {
X11EventSource::GetInstance()->RemoveXEventDispatcher(this);
}
-bool X11ClipboardOzone::DispatchXEvent(XEvent* xev) {
- if (FindXEventTarget(*xev) != x_window_)
- return false;
-
- switch (xev->type) {
- case SelectionRequest:
- return OnSelectionRequest(xev->xselectionrequest);
- case SelectionNotify:
- return OnSelectionNotify(xev->xselection);
- }
-
- if (using_xfixes_ &&
- xev->type == xfixes_event_base_ + XFixesSetSelectionOwnerNotify) {
- return OnSetSelectionOwnerNotify(xev);
- }
+bool X11ClipboardOzone::DispatchXEvent(x11::Event* xev) {
+ if (auto* request = xev->As<x11::SelectionRequestEvent>())
+ return request->owner == x_window_ && OnSelectionRequest(*request);
+ if (auto* notify = xev->As<x11::SelectionNotifyEvent>())
+ return notify->requestor == x_window_ && OnSelectionNotify(*notify);
+ if (auto* notify = xev->As<x11::XFixes::SelectionNotifyEvent>())
+ return notify->owner == x_window_ && OnSetSelectionOwnerNotify(*notify);
return false;
}
@@ -146,15 +124,17 @@ bool X11ClipboardOzone::DispatchXEvent(XEvent* xev) {
// TIMESTAMP: Time when we took ownership of the clipboard.
// <mime-type>: Mime type to receive clipboard as.
bool X11ClipboardOzone::OnSelectionRequest(
- const XSelectionRequestEvent& event) {
+ const x11::SelectionRequestEvent& event) {
// The property must be set.
- if (event.property == x11::None)
+ if (event.property == x11::Atom::None)
return false;
// target=TARGETS.
- auto& selection_state = GetSelectionState(event.selection);
+ auto& selection_state =
+ GetSelectionState(static_cast<x11::Atom>(event.selection));
+ auto target = static_cast<x11::Atom>(event.target);
PlatformClipboard::DataMap& offer_data_map = selection_state.offer_data_map;
- if (event.target == atom_targets_) {
+ if (target == atom_targets_) {
std::vector<std::string> targets;
// Add TIMESTAMP.
targets.push_back(kTimestamp);
@@ -163,26 +143,21 @@ bool X11ClipboardOzone::OnSelectionRequest(
}
// Expand types, then convert from string to atom.
ExpandTypes(&targets);
- std::vector<XAtom> atoms;
- for (auto& entry : targets) {
+ std::vector<x11::Atom> atoms;
+ for (auto& entry : targets)
atoms.push_back(gfx::GetAtom(entry.c_str()));
- }
- XChangeProperty(x_display_, event.requestor, event.property, XA_ATOM,
- /*format=*/32, PropModeReplace,
- reinterpret_cast<unsigned char*>(atoms.data()),
- atoms.size());
+ ui::SetArrayProperty(event.requestor, event.property, x11::Atom::ATOM,
+ atoms);
- } else if (event.target == atom_timestamp_) {
+ } else if (target == atom_timestamp_) {
// target=TIMESTAMP.
- XChangeProperty(x_display_, event.requestor, event.property, XA_INTEGER,
- /*format=*/32, PropModeReplace,
- reinterpret_cast<unsigned char*>(
- &selection_state.acquired_selection_timestamp),
- 1);
-
+ ui::SetProperty(event.requestor, event.property, x11::Atom::INTEGER,
+ selection_state.acquired_selection_timestamp);
} else {
// Send clipboard data.
- char* target_name = XGetAtomName(x_display_, event.target);
+ std::string target_name;
+ if (auto reply = connection_->GetAtomName({event.target}).Sync())
+ target_name = std::move(reply->name);
std::string key = target_name;
// Allow conversions for text/plain[;charset=utf-8] <=> [UTF8_]STRING.
@@ -193,58 +168,41 @@ bool X11ClipboardOzone::OnSelectionRequest(
}
auto it = offer_data_map.find(key);
if (it != offer_data_map.end()) {
- XChangeProperty(x_display_, event.requestor, event.property, event.target,
- /*format=*/8, PropModeReplace,
- const_cast<unsigned char*>(it->second.data()),
- it->second.size());
+ ui::SetArrayProperty(event.requestor, event.property, event.target,
+ it->second);
}
- XFree(target_name);
}
// Notify remote peer that clipboard has been sent.
- XSelectionEvent selection_event;
- selection_event.type = SelectionNotify;
- selection_event.display = event.display;
- selection_event.requestor = event.requestor;
- selection_event.selection = event.selection;
- selection_event.target = event.target;
- selection_event.property = event.property;
- selection_event.time = event.time;
- XSendEvent(x_display_, selection_event.requestor, /*propagate=*/x11::False,
- /*event_mask=*/0, reinterpret_cast<XEvent*>(&selection_event));
+ x11::SelectionNotifyEvent selection_event{
+ .time = event.time,
+ .requestor = event.requestor,
+ .selection = event.selection,
+ .target = event.target,
+ .property = event.property,
+ };
+ SendEvent(selection_event, selection_event.requestor,
+ x11::EventMask::NoEvent);
return true;
}
// A remote peer owns the clipboard. This event is received in response to
// our request for TARGETS (GetAvailableMimeTypes), or a specific mime type
// (RequestClipboardData).
-bool X11ClipboardOzone::OnSelectionNotify(const XSelectionEvent& event) {
+bool X11ClipboardOzone::OnSelectionNotify(
+ const x11::SelectionNotifyEvent& event) {
// GetAvailableMimeTypes.
- auto& selection_state = GetSelectionState(event.selection);
- if (event.target == atom_targets_) {
- XAtom type;
- int format;
- unsigned long item_count, after;
- unsigned char* data = nullptr;
-
- if (XGetWindowProperty(x_display_, x_window_, x_property_,
- /*long_offset=*/0,
- /*long_length=*/256 * sizeof(XAtom),
- /*delete=*/x11::False, XA_ATOM, &type, &format,
- &item_count, &after, &data) != x11::Success) {
- return false;
- }
+ auto selection = static_cast<x11::Atom>(event.selection);
+ auto& selection_state = GetSelectionState(selection);
+ if (static_cast<x11::Atom>(event.target) == atom_targets_) {
+ std::vector<x11::Atom> targets;
+ ui::GetArrayProperty(x_window_, x_property_, &targets);
selection_state.mime_types.clear();
- base::span<XAtom> targets(reinterpret_cast<XAtom*>(data), item_count);
for (auto target : targets) {
- char* atom_name = XGetAtomName(x_display_, target);
- if (atom_name) {
- selection_state.mime_types.push_back(atom_name);
- XFree(atom_name);
- }
+ if (auto reply = connection_->GetAtomName({target}).Sync())
+ selection_state.mime_types.push_back(std::move(reply->name));
}
- XFree(data);
// If we have a saved callback, invoke it now with expanded types, otherwise
// guess that we will want 'text/plain' and fetch it now.
@@ -255,27 +213,20 @@ bool X11ClipboardOzone::OnSelectionNotify(const XSelectionEvent& event) {
.Run(std::move(result));
} else {
selection_state.data_mime_type = kMimeTypeText;
- ReadRemoteClipboard(event.selection);
+ ReadRemoteClipboard(selection);
}
return true;
}
// RequestClipboardData.
- if (event.property == x_property_) {
- XAtom type;
- int format;
- unsigned long item_count, after;
- unsigned char* data;
- XGetWindowProperty(x_display_, x_window_, x_property_,
- /*long_offset=*/0, /*long_length=*/~0L,
- /*delete=*/x11::True, AnyPropertyType, &type, &format,
- &item_count, &after, &data);
- if (type != x11::None && format == 8) {
- std::vector<unsigned char> tmp(data, data + item_count);
- selection_state.data = tmp;
- }
- XFree(data);
+ if (static_cast<x11::Atom>(event.property) == x_property_) {
+ x11::Atom type;
+ std::vector<uint8_t> data;
+ ui::GetArrayProperty(x_window_, x_property_, &data, &type);
+ ui::DeleteProperty(x_window_, x_property_);
+ if (type != x11::Atom::None)
+ selection_state.data = std::move(data);
// If we have a saved callback, invoke it now, otherwise this was a prefetch
// and we have already saved |data_| for the next call to
@@ -292,41 +243,41 @@ bool X11ClipboardOzone::OnSelectionNotify(const XSelectionEvent& event) {
return false;
}
-bool X11ClipboardOzone::OnSetSelectionOwnerNotify(XEvent* xev) {
- XFixesSelectionNotifyEvent* event =
- reinterpret_cast<XFixesSelectionNotifyEvent*>(xev);
-
+bool X11ClipboardOzone::OnSetSelectionOwnerNotify(
+ const x11::XFixes::SelectionNotifyEvent& event) {
// Reset state and fetch remote clipboard if there is a new remote owner.
- if (!IsSelectionOwner(BufferForSelectionAtom(event->selection))) {
- auto& selection_state = GetSelectionState(event->selection);
+ x11::Atom selection = event.selection;
+ if (!IsSelectionOwner(BufferForSelectionAtom(selection))) {
+ auto& selection_state = GetSelectionState(selection);
selection_state.mime_types.clear();
selection_state.data_mime_type.clear();
selection_state.data.clear();
- QueryTargets(event->selection);
+ QueryTargets(selection);
}
// Increase the sequence number if the callback is set.
if (update_sequence_cb_)
- update_sequence_cb_.Run(BufferForSelectionAtom(event->selection));
+ update_sequence_cb_.Run(BufferForSelectionAtom(selection));
return true;
}
-XAtom X11ClipboardOzone::SelectionAtomForBuffer(ClipboardBuffer buffer) const {
+x11::Atom X11ClipboardOzone::SelectionAtomForBuffer(
+ ClipboardBuffer buffer) const {
switch (buffer) {
case ClipboardBuffer::kCopyPaste:
return atom_clipboard_;
case ClipboardBuffer::kSelection:
- return XA_PRIMARY;
+ return x11::Atom::PRIMARY;
default:
NOTREACHED();
- return x11::None;
+ return x11::Atom::None;
}
}
ClipboardBuffer X11ClipboardOzone::BufferForSelectionAtom(
- XAtom selection) const {
- if (selection == XA_PRIMARY)
+ x11::Atom selection) const {
+ if (selection == x11::Atom::PRIMARY)
return ClipboardBuffer::kSelection;
if (selection == atom_clipboard_)
return ClipboardBuffer::kCopyPaste;
@@ -335,18 +286,18 @@ ClipboardBuffer X11ClipboardOzone::BufferForSelectionAtom(
}
X11ClipboardOzone::SelectionState& X11ClipboardOzone::GetSelectionState(
- XAtom selection) {
+ x11::Atom selection) {
DCHECK(Contains(selection_state_, selection));
return *selection_state_[selection];
}
-void X11ClipboardOzone::QueryTargets(XAtom selection) {
+void X11ClipboardOzone::QueryTargets(x11::Atom selection) {
GetSelectionState(selection).mime_types.clear();
- XConvertSelection(x_display_, selection, atom_targets_, x_property_,
- x_window_, x11::CurrentTime);
+ connection_->ConvertSelection({x_window_, selection, atom_targets_,
+ x_property_, x11::Time::CurrentTime});
}
-void X11ClipboardOzone::ReadRemoteClipboard(XAtom selection) {
+void X11ClipboardOzone::ReadRemoteClipboard(x11::Atom selection) {
auto& selection_state = GetSelectionState(selection);
selection_state.data.clear();
// Allow conversions for text/plain[;charset=utf-8] <=> [UTF8_]STRING.
@@ -359,23 +310,24 @@ void X11ClipboardOzone::ReadRemoteClipboard(XAtom selection) {
}
}
- XConvertSelection(x_display_, selection, gfx::GetAtom(target.c_str()),
- x_property_, x_window_, x11::CurrentTime);
+ connection_->ConvertSelection({x_window_, selection, gfx::GetAtom(target),
+ x_property_, x11::Time::CurrentTime});
}
void X11ClipboardOzone::OfferClipboardData(
ClipboardBuffer buffer,
const PlatformClipboard::DataMap& data_map,
PlatformClipboard::OfferDataClosure callback) {
- const XAtom selection = SelectionAtomForBuffer(buffer);
+ const x11::Atom selection = SelectionAtomForBuffer(buffer);
auto& selection_state = GetSelectionState(selection);
- const auto timestamp = X11EventSource::GetInstance()->GetTimestamp();
+ const auto timestamp =
+ static_cast<x11::Time>(X11EventSource::GetInstance()->GetTimestamp());
selection_state.acquired_selection_timestamp = timestamp;
selection_state.offer_data_map = data_map;
// Only take ownership if we are using xfixes.
// TODO(joelhockey): Make clipboard work without xfixes.
if (using_xfixes_) {
- XSetSelectionOwner(x_display_, selection, x_window_, timestamp);
+ connection_->SetSelectionOwner({x_window_, selection, timestamp});
}
std::move(callback).Run();
}
@@ -385,7 +337,7 @@ void X11ClipboardOzone::RequestClipboardData(
const std::string& mime_type,
PlatformClipboard::DataMap* data_map,
PlatformClipboard::RequestDataClosure callback) {
- const XAtom selection = SelectionAtomForBuffer(buffer);
+ const x11::Atom selection = SelectionAtomForBuffer(buffer);
auto& selection_state = GetSelectionState(selection);
// If we are not using xfixes, return empty data.
// TODO(joelhockey): Make clipboard work without xfixes.
@@ -408,7 +360,7 @@ void X11ClipboardOzone::RequestClipboardData(
void X11ClipboardOzone::GetAvailableMimeTypes(
ClipboardBuffer buffer,
PlatformClipboard::GetMimeTypesClosure callback) {
- const XAtom selection = SelectionAtomForBuffer(buffer);
+ const x11::Atom selection = SelectionAtomForBuffer(buffer);
auto& selection_state = GetSelectionState(selection);
// If we are not using xfixes, return empty data.
// TODO(joelhockey): Make clipboard work without xfixes.
@@ -432,8 +384,9 @@ bool X11ClipboardOzone::IsSelectionOwner(ClipboardBuffer buffer) {
if (!using_xfixes_)
return true;
- return XGetSelectionOwner(x_display_, SelectionAtomForBuffer(buffer)) ==
- x_window_;
+ auto reply =
+ connection_->GetSelectionOwner({SelectionAtomForBuffer(buffer)}).Sync();
+ return reply && reply->owner == x_window_;
}
void X11ClipboardOzone::SetSequenceNumberUpdateCb(
diff --git a/chromium/ui/ozone/platform/x11/x11_clipboard_ozone.h b/chromium/ui/ozone/platform/x11/x11_clipboard_ozone.h
index 8743c6cc53a..478205cd472 100644
--- a/chromium/ui/ozone/platform/x11/x11_clipboard_ozone.h
+++ b/chromium/ui/ozone/platform/x11/x11_clipboard_ozone.h
@@ -11,8 +11,11 @@
#include "base/callback.h"
#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"
namespace ui {
@@ -51,61 +54,59 @@ class X11ClipboardOzone : public PlatformClipboard, public XEventDispatcher {
struct SelectionState;
// XEventDispatcher:
- bool DispatchXEvent(XEvent* xev) override;
+ bool DispatchXEvent(x11::Event* xev) override;
- bool OnSelectionRequest(const XSelectionRequestEvent& event);
- bool OnSelectionNotify(const XSelectionEvent& event);
- bool OnSetSelectionOwnerNotify(XEvent* xev);
+ bool OnSelectionRequest(const x11::SelectionRequestEvent& event);
+ bool OnSelectionNotify(const x11::SelectionNotifyEvent& event);
+ bool OnSetSelectionOwnerNotify(
+ const x11::XFixes::SelectionNotifyEvent& event);
// Returns an X atom for a clipboard buffer type.
- XAtom SelectionAtomForBuffer(ClipboardBuffer buffer) const;
+ x11::Atom SelectionAtomForBuffer(ClipboardBuffer buffer) const;
// Returns a clipboard buffer type for an X atom for a selection name of the
// system clipboard buffer.
- ClipboardBuffer BufferForSelectionAtom(XAtom selection) const;
+ ClipboardBuffer BufferForSelectionAtom(x11::Atom selection) const;
// Returns the state for the given selection;
- SelectionState& GetSelectionState(XAtom selection);
+ SelectionState& GetSelectionState(x11::Atom selection);
// Queries the current clipboard owner for what mime types are available by
// sending XConvertSelection with target=TARGETS. After sending this, we
// will receive a SelectionNotify event with xselection.target=TARGETS which
// is processed in |OnSelectionNotify|.
- void QueryTargets(XAtom selection);
+ void QueryTargets(x11::Atom selection);
// Reads the contents of the remote clipboard by sending XConvertSelection
// with target=<mime-type>. After sending this, we will receive a
// SelectionNotify event with xselection.target=<mime-type> which is processed
// in |OnSelectionNotify|.
- void ReadRemoteClipboard(XAtom selection);
+ void ReadRemoteClipboard(x11::Atom selection);
// Local cache of atoms.
- const XAtom atom_clipboard_;
- const XAtom atom_targets_;
- const XAtom atom_timestamp_;
+ const x11::Atom atom_clipboard_;
+ const x11::Atom atom_targets_;
+ const x11::Atom atom_timestamp_;
// The property on |x_window_| which will receive remote clipboard contents.
- const XAtom x_property_;
+ const x11::Atom x_property_;
// Our X11 state.
- Display* const x_display_;
+ x11::Connection* connection_;
// Input-only window used as a selection owner.
- const XID x_window_;
+ const x11::Window x_window_;
// If XFixes is unavailable, this clipboard window will not register to
// receive events and no processing will take place.
// TODO(joelhockey): Make clipboard work without xfixes.
bool using_xfixes_ = false;
- // The event base returned by XFixesQueryExtension().
- int xfixes_event_base_;
-
// Notifies whenever clipboard sequence number is changed.
PlatformClipboard::SequenceNumberUpdateCb update_sequence_cb_;
// State of selections served by this instance.
- base::flat_map<XAtom, std::unique_ptr<SelectionState>> selection_state_;
+ base::flat_map<x11::Atom, std::unique_ptr<SelectionState>> selection_state_;
DISALLOW_COPY_AND_ASSIGN(X11ClipboardOzone);
};
diff --git a/chromium/ui/ozone/platform/x11/x11_cursor_factory_ozone.cc b/chromium/ui/ozone/platform/x11/x11_cursor_factory_ozone.cc
deleted file mode 100644
index 1b9b47ff5f9..00000000000
--- a/chromium/ui/ozone/platform/x11/x11_cursor_factory_ozone.cc
+++ /dev/null
@@ -1,118 +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.
-
-#include "ui/ozone/platform/x11/x11_cursor_factory_ozone.h"
-
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/base/cursor/cursor_lookup.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 {
-
-X11CursorOzone* ToX11CursorOzone(PlatformCursor cursor) {
- return static_cast<X11CursorOzone*>(cursor);
-}
-
-PlatformCursor ToPlatformCursor(X11CursorOzone* cursor) {
- return static_cast<PlatformCursor>(cursor);
-}
-
-// Gets default aura cursor bitmap/hotspot and creates a X11CursorOzone with it.
-scoped_refptr<X11CursorOzone> CreateAuraX11Cursor(mojom::CursorType type) {
- Cursor cursor(type);
- cursor.set_image_scale_factor(1);
- SkBitmap bitmap = GetCursorBitmap(cursor);
- gfx::Point hotspot = GetCursorHotspot(cursor);
- if (!bitmap.isNull())
- return new X11CursorOzone(bitmap, hotspot);
- return nullptr;
-}
-
-} // namespace
-
-X11CursorFactoryOzone::X11CursorFactoryOzone()
- : invisible_cursor_(X11CursorOzone::CreateInvisible()) {}
-
-X11CursorFactoryOzone::~X11CursorFactoryOzone() {}
-
-PlatformCursor X11CursorFactoryOzone::GetDefaultCursor(mojom::CursorType type) {
- return ToPlatformCursor(GetDefaultCursorInternal(type).get());
-}
-
-PlatformCursor X11CursorFactoryOzone::CreateImageCursor(
- const SkBitmap& bitmap,
- const gfx::Point& hotspot,
- float bitmap_dpi) {
- // 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
- // image. Return invisible cursor here instead.
- if (bitmap.drawsNothing()) {
- // The result of |invisible_cursor_| is owned by the caller, and will be
- // Unref()ed by code far away. (Usually in web_cursor.cc in content, among
- // others.) If we don't manually add another reference before we cast this
- // to a void*, we can end up with |invisible_cursor_| being freed out from
- // under us.
- invisible_cursor_->AddRef();
- return ToPlatformCursor(invisible_cursor_.get());
- }
-
- X11CursorOzone* cursor = new X11CursorOzone(bitmap, hotspot);
- cursor->AddRef();
- return ToPlatformCursor(cursor);
-}
-
-PlatformCursor X11CursorFactoryOzone::CreateAnimatedCursor(
- const std::vector<SkBitmap>& bitmaps,
- const gfx::Point& hotspot,
- int frame_delay_ms,
- float bitmap_dpi) {
- X11CursorOzone* cursor = new X11CursorOzone(bitmaps, hotspot, frame_delay_ms);
- cursor->AddRef();
- return ToPlatformCursor(cursor);
-}
-
-void X11CursorFactoryOzone::RefImageCursor(PlatformCursor cursor) {
- ToX11CursorOzone(cursor)->AddRef();
-}
-
-void X11CursorFactoryOzone::UnrefImageCursor(PlatformCursor cursor) {
- ToX11CursorOzone(cursor)->Release();
-}
-
-scoped_refptr<X11CursorOzone> X11CursorFactoryOzone::GetDefaultCursorInternal(
- mojom::CursorType type) {
- if (type == mojom::CursorType::kNone)
- return invisible_cursor_;
-
- if (!default_cursors_.count(type)) {
- // First try to load a predefined X11 cursor.
- auto cursor =
- base::MakeRefCounted<X11CursorOzone>(CursorCssNameFromId(type));
- if (cursor->xcursor() != x11::None) {
- default_cursors_[type] = cursor;
- return cursor;
- }
-
- // Loads the default aura cursor bitmap for cursor type. Falls back on
- // pointer cursor then invisible cursor if this fails.
- cursor = CreateAuraX11Cursor(type);
- if (!cursor.get()) {
- if (type != mojom::CursorType::kPointer) {
- cursor = GetDefaultCursorInternal(mojom::CursorType::kPointer);
- } else {
- NOTREACHED() << "Failed to load default cursor bitmap";
- }
- }
- default_cursors_[type] = cursor;
- }
-
- // Returns owned default cursor for this type.
- return default_cursors_[type];
-}
-
-} // namespace ui
diff --git a/chromium/ui/ozone/platform/x11/x11_cursor_factory_ozone.h b/chromium/ui/ozone/platform/x11/x11_cursor_factory_ozone.h
deleted file mode 100644
index 76efeeb526d..00000000000
--- a/chromium/ui/ozone/platform/x11/x11_cursor_factory_ozone.h
+++ /dev/null
@@ -1,55 +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.
-
-#ifndef UI_OZONE_PLATFORM_X11_X11_CURSOR_FACTORY_OZONE_H_
-#define UI_OZONE_PLATFORM_X11_X11_CURSOR_FACTORY_OZONE_H_
-
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "base/macros.h"
-#include "ui/base/cursor/cursor.h"
-#include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/ozone/platform/x11/x11_cursor_ozone.h"
-#include "ui/ozone/public/cursor_factory_ozone.h"
-
-namespace ui {
-
-// CursorFactoryOzone implementation for X11 cursors.
-class X11CursorFactoryOzone : public CursorFactoryOzone {
- public:
- X11CursorFactoryOzone();
- ~X11CursorFactoryOzone() override;
-
- // CursorFactoryOzone:
- PlatformCursor GetDefaultCursor(mojom::CursorType type) override;
- PlatformCursor CreateImageCursor(const SkBitmap& bitmap,
- const gfx::Point& hotspot,
- float bitmap_dpi) override;
- PlatformCursor CreateAnimatedCursor(const std::vector<SkBitmap>& bitmaps,
- const gfx::Point& hotspot,
- int frame_delay_ms,
- float bitmap_dpi) override;
- void RefImageCursor(PlatformCursor cursor) override;
- void UnrefImageCursor(PlatformCursor cursor) override;
-
- private:
- // Loads/caches default cursor or returns cached version.
- scoped_refptr<X11CursorOzone> GetDefaultCursorInternal(
- mojom::CursorType type);
-
- // Holds a single instance of the invisible cursor. X11 has no way to hide
- // the cursor so an invisible cursor mimics that.
- scoped_refptr<X11CursorOzone> invisible_cursor_;
-
- std::map<mojom::CursorType, scoped_refptr<X11CursorOzone>> default_cursors_;
-
- DISALLOW_COPY_AND_ASSIGN(X11CursorFactoryOzone);
-};
-
-} // namespace ui
-
-#endif // UI_OZONE_PLATFORM_X11_X11_CURSOR_FACTORY_OZONE_H_
diff --git a/chromium/ui/ozone/platform/x11/x11_cursor_ozone.h b/chromium/ui/ozone/platform/x11/x11_cursor_ozone.h
deleted file mode 100644
index 6718abae17d..00000000000
--- a/chromium/ui/ozone/platform/x11/x11_cursor_ozone.h
+++ /dev/null
@@ -1,55 +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.
-
-#ifndef UI_OZONE_PLATFORM_X11_X11_CURSOR_OZONE_H_
-#define UI_OZONE_PLATFORM_X11_X11_CURSOR_OZONE_H_
-
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "ui/base/cursor/cursor.h"
-#include "ui/gfx/x/x11.h"
-
-class SkBitmap;
-
-namespace gfx {
-class Point;
-}
-
-namespace ui {
-
-// Ref counted class to hold an X11 cursor resource. Clears the X11 resources
-// on destruction
-class X11CursorOzone : public base::RefCounted<X11CursorOzone> {
- public:
- // Handles creating X11 cursor resources from SkBitmap/hotspot.
- X11CursorOzone(const SkBitmap& bitmap, const gfx::Point& hotspot);
- X11CursorOzone(const std::vector<SkBitmap>& bitmaps,
- const gfx::Point& hotspot,
- int frame_delay_ms);
- // Loads an X11 cursor named |name| by calling XcursorLibraryLoadCursor().
- // May end up wrapping an x11::None so validity must be checked after using
- // this constructor.
- explicit X11CursorOzone(const char* name);
-
- // Creates a new cursor that is invisible.
- static scoped_refptr<X11CursorOzone> CreateInvisible();
-
- XID xcursor() const { return xcursor_; }
-
- private:
- friend class base::RefCounted<X11CursorOzone>;
-
- X11CursorOzone();
- ~X11CursorOzone();
-
- XID xcursor_ = x11::None;
-
- DISALLOW_COPY_AND_ASSIGN(X11CursorOzone);
-};
-
-} // namespace ui
-
-#endif // UI_OZONE_PLATFORM_X11_X11_CURSOR_OZONE_H_
diff --git a/chromium/ui/ozone/platform/x11/x11_os_exchange_data_provider_ozone.cc b/chromium/ui/ozone/platform/x11/x11_os_exchange_data_provider_ozone.cc
index 7a31cb62ec9..7ede65f0e9c 100644
--- a/chromium/ui/ozone/platform/x11/x11_os_exchange_data_provider_ozone.cc
+++ b/chromium/ui/ozone/platform/x11/x11_os_exchange_data_provider_ozone.cc
@@ -6,13 +6,14 @@
#include <utility>
-#include "base/logging.h"
+#include "base/check.h"
+#include "base/notreached.h"
#include "ui/base/x/selection_utils.h"
namespace ui {
X11OSExchangeDataProviderOzone::X11OSExchangeDataProviderOzone(
- XID x_window,
+ x11::Window x_window,
const SelectionFormatMap& selection)
: XOSExchangeDataProvider(x_window, selection) {}
@@ -34,13 +35,14 @@ std::unique_ptr<OSExchangeDataProvider> X11OSExchangeDataProviderOzone::Clone()
return std::move(ret);
}
-bool X11OSExchangeDataProviderOzone::DispatchXEvent(XEvent* xev) {
- if (xev->xany.window != x_window())
+bool X11OSExchangeDataProviderOzone::DispatchXEvent(x11::Event* x11_event) {
+ XEvent* xev = &x11_event->xlib_event();
+ if (xev->xany.window != static_cast<uint32_t>(x_window()))
return false;
switch (xev->type) {
- case SelectionRequest:
- selection_owner().OnSelectionRequest(*xev);
+ case x11::SelectionRequestEvent::opcode:
+ selection_owner().OnSelectionRequest(*x11_event);
return true;
default:
NOTIMPLEMENTED();
diff --git a/chromium/ui/ozone/platform/x11/x11_os_exchange_data_provider_ozone.h b/chromium/ui/ozone/platform/x11/x11_os_exchange_data_provider_ozone.h
index 7a0637318fc..65542ea14d3 100644
--- a/chromium/ui/ozone/platform/x11/x11_os_exchange_data_provider_ozone.h
+++ b/chromium/ui/ozone/platform/x11/x11_os_exchange_data_provider_ozone.h
@@ -7,6 +7,7 @@
#include "ui/base/x/x11_os_exchange_data_provider.h"
#include "ui/events/platform/x11/x11_event_source.h"
+#include "ui/gfx/x/event.h"
namespace ui {
@@ -14,7 +15,7 @@ namespace ui {
class X11OSExchangeDataProviderOzone : public XOSExchangeDataProvider,
public XEventDispatcher {
public:
- X11OSExchangeDataProviderOzone(XID x_window,
+ X11OSExchangeDataProviderOzone(x11::Window x_window,
const SelectionFormatMap& selection);
X11OSExchangeDataProviderOzone();
~X11OSExchangeDataProviderOzone() override;
@@ -27,7 +28,7 @@ class X11OSExchangeDataProviderOzone : public XOSExchangeDataProvider,
std::unique_ptr<OSExchangeDataProvider> Clone() const override;
// XEventDispatcher:
- bool DispatchXEvent(XEvent* xev) override;
+ bool DispatchXEvent(x11::Event* xev) override;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/x11/x11_screen_ozone.cc b/chromium/ui/ozone/platform/x11/x11_screen_ozone.cc
index 5e9cf05b0a3..76aeb9e1c14 100644
--- a/chromium/ui/ozone/platform/x11/x11_screen_ozone.cc
+++ b/chromium/ui/ozone/platform/x11/x11_screen_ozone.cc
@@ -10,8 +10,9 @@
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/gfx/font_render_params.h"
#include "ui/gfx/geometry/dip_util.h"
-#include "ui/ozone/platform/x11/x11_window_ozone.h"
+#include "ui/gfx/native_widget_types.h"
#include "ui/platform_window/x11/x11_topmost_window_finder.h"
+#include "ui/platform_window/x11/x11_window.h"
#include "ui/platform_window/x11/x11_window_manager.h"
namespace ui {
@@ -86,14 +87,15 @@ gfx::Point X11ScreenOzone::GetCursorScreenPoint() const {
gfx::AcceleratedWidget X11ScreenOzone::GetAcceleratedWidgetAtScreenPoint(
const gfx::Point& point) const {
X11TopmostWindowFinder finder;
- return finder.FindWindowAt(point);
+ return static_cast<gfx::AcceleratedWidget>(finder.FindWindowAt(point));
}
gfx::AcceleratedWidget X11ScreenOzone::GetLocalProcessWidgetAtPoint(
const gfx::Point& point,
const std::set<gfx::AcceleratedWidget>& ignore) const {
X11TopmostWindowFinder finder;
- return finder.FindLocalProcessWindowAt(point, ignore);
+ return static_cast<gfx::AcceleratedWidget>(
+ finder.FindLocalProcessWindowAt(point, ignore));
}
display::Display X11ScreenOzone::GetDisplayNearestPoint(
@@ -125,7 +127,7 @@ std::string X11ScreenOzone::GetCurrentWorkspace() {
return x11_display_manager_->GetCurrentWorkspace();
}
-bool X11ScreenOzone::DispatchXEvent(XEvent* xev) {
+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 02806ba53fc..de7d392d17b 100644
--- a/chromium/ui/ozone/platform/x11/x11_screen_ozone.h
+++ b/chromium/ui/ozone/platform/x11/x11_screen_ozone.h
@@ -14,6 +14,7 @@
#include "ui/base/x/x11_display_manager.h"
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/gfx/geometry/point.h"
+#include "ui/gfx/x/event.h"
#include "ui/ozone/public/platform_screen.h"
namespace ui {
@@ -51,7 +52,7 @@ class X11ScreenOzone : public PlatformScreen,
std::string GetCurrentWorkspace() override;
// Overridden from ui::XEventDispatcher:
- bool DispatchXEvent(XEvent* event) override;
+ bool DispatchXEvent(x11::Event* event) override;
private:
friend class X11ScreenOzoneTest;
diff --git a/chromium/ui/ozone/platform/x11/x11_screen_ozone_unittest.cc b/chromium/ui/ozone/platform/x11/x11_screen_ozone_unittest.cc
index 121a6ccc77c..5b2ac245341 100644
--- a/chromium/ui/ozone/platform/x11/x11_screen_ozone_unittest.cc
+++ b/chromium/ui/ozone/platform/x11/x11_screen_ozone_unittest.cc
@@ -13,10 +13,10 @@
#include "ui/display/display.h"
#include "ui/display/display_observer.h"
#include "ui/events/platform/x11/x11_event_source.h"
-#include "ui/ozone/platform/x11/x11_window_ozone.h"
#include "ui/ozone/test/mock_platform_window_delegate.h"
#include "ui/platform_window/platform_window_delegate.h"
#include "ui/platform_window/platform_window_init_properties.h"
+#include "ui/platform_window/x11/x11_window.h"
#include "ui/platform_window/x11/x11_window_manager.h"
using ::testing::_;
@@ -95,14 +95,14 @@ class X11ScreenOzoneTest : public testing::Test {
manager->displays_);
}
- std::unique_ptr<X11WindowOzone> CreatePlatformWindow(
+ std::unique_ptr<X11Window> CreatePlatformWindow(
MockPlatformWindowDelegate* delegate,
const gfx::Rect& bounds,
gfx::AcceleratedWidget* widget = nullptr) {
EXPECT_CALL(*delegate, OnAcceleratedWidgetAvailable(_))
.WillOnce(StoreWidget(widget));
PlatformWindowInitProperties init_params(bounds);
- auto window = std::make_unique<X11WindowOzone>(delegate);
+ auto window = std::make_unique<X11Window>(delegate);
window->Initialize(std::move(init_params));
return window;
}
diff --git a/chromium/ui/ozone/platform/x11/x11_surface_factory.cc b/chromium/ui/ozone/platform/x11/x11_surface_factory.cc
index a0daef0e754..d747464e40f 100644
--- a/chromium/ui/ozone/platform/x11/x11_surface_factory.cc
+++ b/chromium/ui/ozone/platform/x11/x11_surface_factory.cc
@@ -43,7 +43,8 @@ class GLOzoneEGLX11 : public GLOzoneEGL {
base::MakeRefCounted<GLSurfaceEglReadbackX11>(window));
} else {
return gl::InitializeGLSurface(
- base::MakeRefCounted<gl::NativeViewGLSurfaceEGLX11GLES2>(window));
+ base::MakeRefCounted<gl::NativeViewGLSurfaceEGLX11GLES2>(
+ static_cast<x11::Window>(window)));
}
}
diff --git a/chromium/ui/ozone/platform/x11/x11_window_ozone.cc b/chromium/ui/ozone/platform/x11/x11_window_ozone.cc
deleted file mode 100644
index 66658dc1d92..00000000000
--- a/chromium/ui/ozone/platform/x11/x11_window_ozone.cc
+++ /dev/null
@@ -1,158 +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/ozone/platform/x11/x11_window_ozone.h"
-
-#include "ui/base/dragdrop/os_exchange_data.h"
-#include "ui/base/x/x11_os_exchange_data_provider.h"
-#include "ui/base/x/x11_pointer_grab.h"
-#include "ui/base/x/x11_topmost_window_finder.h"
-#include "ui/events/event.h"
-#include "ui/events/platform/scoped_event_dispatcher.h"
-#include "ui/events/platform/x11/x11_event_source.h"
-#include "ui/events/x/x11_window_event_manager.h"
-#include "ui/ozone/platform/x11/x11_cursor_ozone.h"
-#include "ui/platform_window/platform_window_delegate.h"
-#include "ui/platform_window/platform_window_handler/wm_drop_handler.h"
-#include "ui/platform_window/x11/x11_topmost_window_finder.h"
-#include "ui/platform_window/x11/x11_window_manager.h"
-
-namespace ui {
-
-X11WindowOzone::X11WindowOzone(PlatformWindowDelegate* delegate)
- : X11Window(delegate) {}
-
-X11WindowOzone::~X11WindowOzone() = default;
-
-void X11WindowOzone::SetCursor(PlatformCursor cursor) {
- X11CursorOzone* cursor_ozone = static_cast<X11CursorOzone*>(cursor);
- XWindow::SetCursor(cursor_ozone->xcursor());
-}
-
-void X11WindowOzone::Initialize(PlatformWindowInitProperties properties) {
- X11Window::Initialize(std::move(properties));
- // Set a class property key that allows |this| to be used for drag action.
- SetWmDragHandler(this, this);
-
- drag_drop_client_ =
- std::make_unique<XDragDropClient>(this, display(), window());
-}
-
-void X11WindowOzone::StartDrag(const ui::OSExchangeData& data,
- int operation,
- gfx::NativeCursor cursor,
- base::OnceCallback<void(int)> callback) {
- DCHECK(drag_drop_client_);
-
- end_drag_callback_ = std::move(callback);
- drag_drop_client_->InitDrag(operation, &data);
-
- SetCapture();
-
- dragging_ = true;
-}
-
-std::unique_ptr<ui::XTopmostWindowFinder> X11WindowOzone::CreateWindowFinder() {
- return std::make_unique<X11TopmostWindowFinder>();
-}
-
-int X11WindowOzone::UpdateDrag(const gfx::Point& screen_point) {
- WmDropHandler* drop_handler = GetWmDropHandler(*this);
- if (!drop_handler)
- return ui::DragDropTypes::DRAG_NONE;
- // TODO: calculate the appropriate drag operation here.
- return drop_handler->OnDragMotion(gfx::PointF(screen_point),
- ui::DragDropTypes::DRAG_COPY);
-}
-
-void X11WindowOzone::UpdateCursor(
- ui::DragDropTypes::DragOperation negotiated_operation) {
- NOTIMPLEMENTED_LOG_ONCE();
-}
-
-void X11WindowOzone::OnBeginForeignDrag(XID window) {
- NOTIMPLEMENTED_LOG_ONCE();
-}
-
-void X11WindowOzone::OnEndForeignDrag() {
- NOTIMPLEMENTED_LOG_ONCE();
-}
-
-void X11WindowOzone::OnBeforeDragLeave() {
- NOTIMPLEMENTED_LOG_ONCE();
-}
-
-int X11WindowOzone::PerformDrop() {
- WmDropHandler* drop_handler = GetWmDropHandler(*this);
- if (!drop_handler)
- return ui::DragDropTypes::DRAG_NONE;
-
- DCHECK(drag_drop_client_);
- auto* target_current_context = drag_drop_client_->target_current_context();
- DCHECK(target_current_context);
-
- int drag_operation = ui::DragDropTypes::DRAG_NONE;
-
- drop_handler->OnDragDrop(std::make_unique<ui::OSExchangeData>(
- std::make_unique<ui::XOSExchangeDataProvider>(
- drag_drop_client_->xwindow(),
- target_current_context->fetched_targets())));
- return drag_operation;
-}
-
-void X11WindowOzone::EndMoveLoop() {
- std::move(end_drag_callback_).Run(0);
-}
-
-bool X11WindowOzone::DispatchDraggingUiEvent(ui::Event* event) {
- // Drag and drop have a priority over other processing.
- if (dragging_) {
- DCHECK(drag_drop_client_);
-
- switch (event->type()) {
- case ui::ET_MOUSE_MOVED:
- case ui::ET_MOUSE_DRAGGED: {
- drag_drop_client_->HandleMouseMovement(
- event->AsLocatedEvent()->root_location(),
- event->AsMouseEvent()->flags(),
- event->AsMouseEvent()->time_stamp());
- return true;
- }
- case ui::ET_MOUSE_RELEASED:
- if (!event->AsMouseEvent()->IsLeftMouseButton())
- break;
- // Assume that drags are being done with the left mouse button. Only
- // break the drag if the left mouse button was released.
- drag_drop_client_->HandleMouseReleased();
- dragging_ = false;
- ReleaseCapture();
- return true;
- case ui::ET_KEY_PRESSED:
- if (event->AsKeyEvent()->key_code() != ui::VKEY_ESCAPE)
- break;
- EndMoveLoop();
- drag_drop_client_->HandleMoveLoopEnded();
- dragging_ = false;
- ReleaseCapture();
- return true;
- default:
- break;
- }
- }
- return false;
-}
-
-void X11WindowOzone::OnXWindowSelectionEvent(XEvent* xev) {
- X11Window::OnXWindowSelectionEvent(xev);
- DCHECK(drag_drop_client_);
- drag_drop_client_->OnSelectionNotify(xev->xselection);
-}
-
-void X11WindowOzone::OnXWindowDragDropEvent(XEvent* xev) {
- X11Window::OnXWindowDragDropEvent(xev);
- DCHECK(drag_drop_client_);
- drag_drop_client_->HandleXdndEvent(xev->xclient);
-}
-
-} // namespace ui
diff --git a/chromium/ui/ozone/platform/x11/x11_window_ozone.h b/chromium/ui/ozone/platform/x11/x11_window_ozone.h
deleted file mode 100644
index 3e2a83fe42d..00000000000
--- a/chromium/ui/ozone/platform/x11/x11_window_ozone.h
+++ /dev/null
@@ -1,66 +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_OZONE_PLATFORM_X11_X11_WINDOW_OZONE_H_
-#define UI_OZONE_PLATFORM_X11_X11_WINDOW_OZONE_H_
-
-#include "ui/base/x/x11_drag_drop_client.h"
-#include "ui/platform_window/platform_window_handler/wm_drag_handler.h"
-#include "ui/platform_window/x11/x11_window.h"
-
-namespace ui {
-
-class PlatformWindowDelegate;
-
-// PlatformWindow implementation for non-ChromeOS X11 Ozone.
-// PlatformEvents are ui::Events.
-class X11WindowOzone : public X11Window,
- public WmDragHandler,
- public XDragDropClient::Delegate {
- public:
- explicit X11WindowOzone(PlatformWindowDelegate* delegate);
- ~X11WindowOzone() override;
-
- X11WindowOzone(const X11WindowOzone&) = delete;
- X11WindowOzone& operator=(const X11WindowOzone&) = delete;
-
- // Overridden from PlatformWindow:
- void SetCursor(PlatformCursor cursor) override;
-
- // Overridden from X11Window:
- void Initialize(PlatformWindowInitProperties properties) override;
-
- private:
- // WmDragHandler
- void StartDrag(const ui::OSExchangeData& data,
- int operation,
- gfx::NativeCursor cursor,
- base::OnceCallback<void(int)> callback) override;
-
- // ui::XDragDropClient::Delegate
- std::unique_ptr<ui::XTopmostWindowFinder> CreateWindowFinder() override;
- int UpdateDrag(const gfx::Point& screen_point) override;
- void UpdateCursor(
- ui::DragDropTypes::DragOperation negotiated_operation) override;
- void OnBeginForeignDrag(XID window) override;
- void OnEndForeignDrag() override;
- void OnBeforeDragLeave() override;
- int PerformDrop() override;
- void EndMoveLoop() override;
-
- // X11Window:
- bool DispatchDraggingUiEvent(ui::Event* event) override;
- void OnXWindowSelectionEvent(XEvent* xev) override;
- void OnXWindowDragDropEvent(XEvent* xev) override;
-
- // True while the drag initiated in this window is in progress.
- bool dragging_ = false;
-
- std::unique_ptr<XDragDropClient> drag_drop_client_;
- base::OnceCallback<void(int)> end_drag_callback_;
-};
-
-} // namespace ui
-
-#endif // UI_OZONE_PLATFORM_X11_X11_WINDOW_OZONE_H_
diff --git a/chromium/ui/ozone/platform/x11/x11_window_ozone_chromeos.cc b/chromium/ui/ozone/platform/x11/x11_window_ozone_chromeos.cc
deleted file mode 100644
index d4f22451189..00000000000
--- a/chromium/ui/ozone/platform/x11/x11_window_ozone_chromeos.cc
+++ /dev/null
@@ -1,28 +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.
-
-#include "ui/ozone/platform/x11/x11_window_ozone_chromeos.h"
-
-#include "ui/events/event.h"
-#include "ui/ozone/platform/x11/x11_cursor_ozone.h"
-#include "ui/platform_window/platform_window_delegate.h"
-#include "ui/platform_window/x11/x11_window_manager.h"
-
-namespace ui {
-
-X11WindowOzone::X11WindowOzone(PlatformWindowDelegate* delegate)
- : X11Window(delegate) {}
-
-X11WindowOzone::~X11WindowOzone() = default;
-
-void X11WindowOzone::SetCursor(PlatformCursor cursor) {
- X11CursorOzone* cursor_ozone = static_cast<X11CursorOzone*>(cursor);
- XWindow::SetCursor(cursor_ozone->xcursor());
-}
-
-void X11WindowOzone::Initialize(PlatformWindowInitProperties properties) {
- X11Window::Initialize(std::move(properties));
-}
-
-} // namespace ui
diff --git a/chromium/ui/ozone/platform/x11/x11_window_ozone_chromeos.h b/chromium/ui/ozone/platform/x11/x11_window_ozone_chromeos.h
deleted file mode 100644
index 3bcdec53c3c..00000000000
--- a/chromium/ui/ozone/platform/x11/x11_window_ozone_chromeos.h
+++ /dev/null
@@ -1,33 +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.
-
-#ifndef UI_OZONE_PLATFORM_X11_X11_WINDOW_OZONE_CHROMEOS_H_
-#define UI_OZONE_PLATFORM_X11_X11_WINDOW_OZONE_CHROMEOS_H_
-
-#include "base/macros.h"
-#include "ui/platform_window/x11/x11_window.h"
-
-namespace ui {
-
-class PlatformWindowDelegate;
-
-// PlatformWindow implementation for ChromeOS X11 Ozone.
-// PlatformEvents are ui::Events.
-class X11WindowOzone : public X11Window {
- public:
- explicit X11WindowOzone(PlatformWindowDelegate* delegate);
- ~X11WindowOzone() override;
-
- // Overridden from PlatformWindow:
- void SetCursor(PlatformCursor cursor) override;
-
- // Overridden from X11Window:
- void Initialize(PlatformWindowInitProperties properties) override;
-
- DISALLOW_COPY_AND_ASSIGN(X11WindowOzone);
-};
-
-} // namespace ui
-
-#endif // UI_OZONE_PLATFORM_X11_X11_WINDOW_OZONE_CHROMEOS_H_
diff --git a/chromium/ui/ozone/platform/x11/x11_window_ozone_unittest.cc b/chromium/ui/ozone/platform/x11/x11_window_ozone_unittest.cc
index e2c5fb1f609..ddf6448c669 100644
--- a/chromium/ui/ozone/platform/x11/x11_window_ozone_unittest.cc
+++ b/chromium/ui/ozone/platform/x11/x11_window_ozone_unittest.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/ozone/platform/x11/x11_window_ozone.h"
+#include "ui/platform_window/x11/x11_window.h"
#include <memory>
#include <utility>
@@ -16,6 +16,7 @@
#include "ui/events/event.h"
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/events/test/events_test_utils_x11.h"
+#include "ui/gfx/x/event.h"
#include "ui/ozone/test/mock_platform_window_delegate.h"
#include "ui/platform_window/platform_window_delegate.h"
#include "ui/platform_window/platform_window_init_properties.h"
@@ -45,9 +46,7 @@ ACTION_P(CloneEvent, event_ptr) {
// is more than enough.
class TestScreen : public display::ScreenBase {
public:
- TestScreen() {
- ProcessDisplayChanged({}, true);
- }
+ TestScreen() { ProcessDisplayChanged({}, true); }
~TestScreen() override = default;
TestScreen(const TestScreen& screen) = delete;
TestScreen& operator=(const TestScreen& screen) = delete;
@@ -88,16 +87,18 @@ class X11WindowOzoneTest : public testing::Test {
EXPECT_CALL(*delegate, OnAcceleratedWidgetAvailable(_))
.WillOnce(StoreWidget(widget));
PlatformWindowInitProperties init_params(bounds);
- auto window = std::make_unique<X11WindowOzone>(delegate);
+ auto window = std::make_unique<X11Window>(delegate);
window->Initialize(std::move(init_params));
return std::move(window);
}
- void DispatchXEvent(XEvent* event, gfx::AcceleratedWidget widget) {
- DCHECK_EQ(GenericEvent, event->type);
+ void DispatchXEvent(x11::Event* event, gfx::AcceleratedWidget widget) {
+ DCHECK_EQ(x11::GeGenericEvent::opcode, event->xlib_event().type);
XIDeviceEvent* device_event =
- static_cast<XIDeviceEvent*>(event->xcookie.data);
+ static_cast<XIDeviceEvent*>(event->xlib_event().xcookie.data);
device_event->event = widget;
+ event->As<x11::Input::DeviceEvent>()->event =
+ static_cast<x11::Window>(widget);
event_source_->ProcessXEvent(event);
}
@@ -186,8 +187,8 @@ TEST_F(X11WindowOzoneTest, SendPlatformEventToCapturedWindow) {
EXPECT_EQ(gfx::Point(-277, 215), event->AsLocatedEvent()->location());
}
-// This test case ensures window_manager properly provides X11WindowOzone
-// instances as they are created/destroyed.
+// This test case ensures window_manager properly provides X11Window instances
+// as they are created/destroyed.
TEST_F(X11WindowOzoneTest, GetWindowFromAcceleratedWigets) {
MockPlatformWindowDelegate delegate;
gfx::Rect bounds(0, 0, 100, 100);
@@ -225,12 +226,12 @@ TEST_F(X11WindowOzoneTest, MouseEnterAndDelete) {
auto window_2 = CreatePlatformWindow(&delegate_2, bounds_2, &widget_2);
EXPECT_CALL(delegate_1, OnMouseEnter()).Times(1);
- window_manager()->MouseOnWindow(static_cast<X11WindowOzone*>(window_1.get()));
+ window_manager()->MouseOnWindow(static_cast<X11Window*>(window_1.get()));
// The mouse is already on window_1, and this should not call OnMouseEnter.
- window_manager()->MouseOnWindow(static_cast<X11WindowOzone*>(window_1.get()));
+ window_manager()->MouseOnWindow(static_cast<X11Window*>(window_1.get()));
EXPECT_CALL(delegate_2, OnMouseEnter()).Times(1);
- window_manager()->MouseOnWindow(static_cast<X11WindowOzone*>(window_2.get()));
+ window_manager()->MouseOnWindow(static_cast<X11Window*>(window_2.get()));
EXPECT_EQ(window_2.get(),
window_manager()->window_mouse_currently_on_for_test());
diff --git a/chromium/ui/ozone/public/cursor_factory_ozone.cc b/chromium/ui/ozone/public/cursor_factory_ozone.cc
deleted file mode 100644
index 95caf2a8a0b..00000000000
--- a/chromium/ui/ozone/public/cursor_factory_ozone.cc
+++ /dev/null
@@ -1,63 +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/ozone/public/cursor_factory_ozone.h"
-
-#include "base/check_op.h"
-#include "base/notreached.h"
-
-namespace ui {
-
-namespace {
-
-CursorFactoryOzone* g_instance = nullptr;
-
-} // namespace
-
-CursorFactoryOzone::CursorFactoryOzone() {
- DCHECK(!g_instance)
- << "There should only be a single CursorFactoryOzone per thread.";
- g_instance = this;
-}
-
-CursorFactoryOzone::~CursorFactoryOzone() {
- DCHECK_EQ(g_instance, this);
- g_instance = nullptr;
-}
-
-CursorFactoryOzone* CursorFactoryOzone::GetInstance() {
- DCHECK(g_instance);
- return g_instance;
-}
-
-PlatformCursor CursorFactoryOzone::GetDefaultCursor(mojom::CursorType type) {
- NOTIMPLEMENTED();
- return NULL;
-}
-
-PlatformCursor CursorFactoryOzone::CreateImageCursor(const SkBitmap& bitmap,
- const gfx::Point& hotspot,
- float bitmap_dpi) {
- NOTIMPLEMENTED();
- return NULL;
-}
-
-PlatformCursor CursorFactoryOzone::CreateAnimatedCursor(
- const std::vector<SkBitmap>& bitmaps,
- const gfx::Point& hotspot,
- int frame_delay_ms,
- float bitmap_dpi) {
- NOTIMPLEMENTED();
- return NULL;
-}
-
-void CursorFactoryOzone::RefImageCursor(PlatformCursor cursor) {
- NOTIMPLEMENTED();
-}
-
-void CursorFactoryOzone::UnrefImageCursor(PlatformCursor cursor) {
- NOTIMPLEMENTED();
-}
-
-} // namespace ui
diff --git a/chromium/ui/ozone/public/input_controller.cc b/chromium/ui/ozone/public/input_controller.cc
index 2f2bd8688a3..6b12bb5dff6 100644
--- a/chromium/ui/ozone/public/input_controller.cc
+++ b/chromium/ui/ozone/public/input_controller.cc
@@ -46,6 +46,8 @@ class StubInputController : public InputController {
void SetPrimaryButtonRight(bool right) override {}
void SetMouseReverseScroll(bool enabled) override {}
void SetMouseAcceleration(bool enabled) override {}
+ void SuspendMouseAcceleration() override {}
+ void EndMouseAccelerationSuspension() override {}
void SetMouseScrollAcceleration(bool enabled) override {}
void SetTouchpadAcceleration(bool enabled) override {}
void SetTouchpadScrollAcceleration(bool enabled) override {}
diff --git a/chromium/ui/ozone/public/input_controller.h b/chromium/ui/ozone/public/input_controller.h
index cc7c323f683..6de884cb29f 100644
--- a/chromium/ui/ozone/public/input_controller.h
+++ b/chromium/ui/ozone/public/input_controller.h
@@ -73,6 +73,8 @@ class COMPONENT_EXPORT(OZONE_BASE) InputController {
virtual void SetPrimaryButtonRight(bool right) = 0;
virtual void SetMouseReverseScroll(bool enabled) = 0;
virtual void SetMouseAcceleration(bool enabled) = 0;
+ virtual void SuspendMouseAcceleration() = 0;
+ virtual void EndMouseAccelerationSuspension() = 0;
virtual void SetMouseScrollAcceleration(bool enabled) = 0;
// Touch log collection.
diff --git a/chromium/ui/ozone/public/mojom/drm_device.mojom b/chromium/ui/ozone/public/mojom/drm_device.mojom
index c9b31a6c68c..9f67565431c 100644
--- a/chromium/ui/ozone/public/mojom/drm_device.mojom
+++ b/chromium/ui/ozone/public/mojom/drm_device.mojom
@@ -6,6 +6,7 @@ module ui.ozone.mojom;
import "mojo/public/mojom/base/file.mojom";
import "mojo/public/mojom/base/file_path.mojom";
+import "ui/display/mojom/display_configuration_params.mojom";
import "ui/display/mojom/display_constants.mojom";
import "ui/display/mojom/display_mode.mojom";
import "ui/display/mojom/display_snapshot.mojom";
@@ -50,13 +51,9 @@ interface DrmDevice {
// Instructs the GPU to abandon a DRM device.
RemoveGraphicsDevice(mojo_base.mojom.FilePath path);
- // Instructs the GPU to disable a DRM device.
- DisableNativeDisplay(int64 display_id) => (int64 display_id, bool success);
-
- // Configures a DRM display returning true on success.
- ConfigureNativeDisplay(int64 display_id,
- display.mojom.DisplayMode display_mode,
- gfx.mojom.Point point) =>
+ // Configures (Enables/Disables) a DRM display, returning true on success.
+ ConfigureNativeDisplay(
+ display.mojom.DisplayConfigurationParams display_config_params) =>
(int64 display_id, bool success);
// Gets or sets high-definition content protection (HDCP) (DRM as in
diff --git a/chromium/ui/ozone/public/ozone_platform.cc b/chromium/ui/ozone/public/ozone_platform.cc
index 0309fc67128..f08c81e9fc3 100644
--- a/chromium/ui/ozone/public/ozone_platform.cc
+++ b/chromium/ui/ozone/public/ozone_platform.cc
@@ -18,7 +18,6 @@
namespace ui {
namespace {
-
OzonePlatform* g_instance = nullptr;
void EnsureInstance() {
@@ -45,6 +44,15 @@ OzonePlatform::OzonePlatform() {
OzonePlatform::~OzonePlatform() = default;
// static
+void OzonePlatform::PreEarlyInitialization() {
+ EnsureInstance();
+ if (g_instance->prearly_initialized_)
+ return;
+ g_instance->prearly_initialized_ = true;
+ g_instance->PreEarlyInitialize();
+}
+
+// static
void OzonePlatform::InitializeForUI(const InitParams& args) {
EnsureInstance();
if (g_instance->initialized_ui_)
@@ -115,4 +123,11 @@ void OzonePlatform::AfterSandboxEntry() {
DCHECK(!single_process_);
}
+void OzonePlatform::PostMainMessageLoopStart(
+ base::OnceCallback<void()> shutdown_cb) {}
+
+void OzonePlatform::PostMainMessageLoopRun() {}
+
+void OzonePlatform::PreEarlyInitialize() {}
+
} // namespace ui
diff --git a/chromium/ui/ozone/public/ozone_platform.h b/chromium/ui/ozone/public/ozone_platform.h
index afb9099af3b..f1bbc12cf0c 100644
--- a/chromium/ui/ozone/public/ozone_platform.h
+++ b/chromium/ui/ozone/public/ozone_platform.h
@@ -23,8 +23,7 @@ class NativeDisplayDelegate;
}
namespace ui {
-
-class CursorFactoryOzone;
+class CursorFactory;
class InputController;
class GpuPlatformSupportHost;
class OverlayManagerOzone;
@@ -104,6 +103,30 @@ class COMPONENT_EXPORT(OZONE) OzonePlatform {
bool supports_overlays = false;
};
+ // Corresponds to chrome_browser_main_extra_parts.h.
+ //
+ // The browser process' initialization involves several steps -
+ // PreEarlyInitialization, PostMainMessageLoopStart, PostMainMessageLoopRun,
+ // etc. In order to be consistent with that and allow platform specific
+ // initialization steps, the OzonePlatform has three methods - one static
+ // PreEarlyInitialization that is expected to do some early non-ui
+ // initialization (like error handlers that X11 sets), and two non-static
+ // methods - PostMainmessageLoopStart and PostMainMessageLoopRun. The latter
+ // two are supposed to be called on a post start and a post-run of the
+ // MessageLoop. Please note that this methods must be run on the browser' UI
+ // thread.
+ //
+ // Creates OzonePlatform and does pre-early initialization (internally, sets
+ // error handlers if supported so that we can print errors during the browser
+ // process' start up).
+ static void PreEarlyInitialization();
+ // Sets error handlers if supported for the browser process after the message
+ // loop started. It's required to call this so that we can exit cleanly if the
+ // server can exit before we do.
+ virtual void PostMainMessageLoopStart(base::OnceCallback<void()> shutdown_cb);
+ // Resets the error handlers if set.
+ virtual void PostMainMessageLoopRun();
+
// Initializes the subsystems/resources necessary for the UI process (e.g.
// events) with additional properties to customize the ozone platform
// implementation. Ozone will not retain InitParams after returning from
@@ -129,7 +152,7 @@ class COMPONENT_EXPORT(OZONE) OzonePlatform {
// inject these objects themselves. Ownership is retained by OzonePlatform.
virtual ui::SurfaceFactoryOzone* GetSurfaceFactoryOzone() = 0;
virtual ui::OverlayManagerOzone* GetOverlayManager() = 0;
- virtual ui::CursorFactoryOzone* GetCursorFactoryOzone() = 0;
+ virtual ui::CursorFactory* GetCursorFactory() = 0;
virtual ui::InputController* GetInputController() = 0;
virtual ui::GpuPlatformSupportHost* GetGpuPlatformSupportHost() = 0;
virtual std::unique_ptr<SystemInputInjector> CreateSystemInputInjector() = 0;
@@ -189,11 +212,16 @@ class COMPONENT_EXPORT(OZONE) OzonePlatform {
bool single_process() const { return single_process_; }
private:
+ // Optional method for pre-early initialization. In case of X11, sets X11
+ // error handlers so that errors can be caught if early initialization fails.
+ virtual void PreEarlyInitialize();
+
virtual void InitializeUI(const InitParams& params) = 0;
virtual void InitializeGPU(const InitParams& params) = 0;
bool initialized_ui_ = false;
bool initialized_gpu_ = false;
+ bool prearly_initialized_ = false;
bool single_process_ = false;
diff --git a/chromium/ui/ozone/public/platform_clipboard.h b/chromium/ui/ozone/public/platform_clipboard.h
index 0962bc9fd78..5ef3fb3d939 100644
--- a/chromium/ui/ozone/public/platform_clipboard.h
+++ b/chromium/ui/ozone/public/platform_clipboard.h
@@ -9,6 +9,7 @@
#include <unordered_map>
#include <vector>
+#include "base/callback_forward.h"
#include "base/component_export.h"
#include "base/macros.h"
#include "base/optional.h"
diff --git a/chromium/ui/ozone/public/platform_screen.cc b/chromium/ui/ozone/public/platform_screen.cc
index a95cfae1322..c2440a5b237 100644
--- a/chromium/ui/ozone/public/platform_screen.cc
+++ b/chromium/ui/ozone/public/platform_screen.cc
@@ -4,7 +4,7 @@
#include "ui/ozone/public/platform_screen.h"
-#include "base/logging.h"
+#include "base/notreached.h"
namespace ui {
diff --git a/chromium/ui/ozone/public/platform_window_surface.h b/chromium/ui/ozone/public/platform_window_surface.h
index f804dd1f795..b316e3ecbdb 100644
--- a/chromium/ui/ozone/public/platform_window_surface.h
+++ b/chromium/ui/ozone/public/platform_window_surface.h
@@ -6,6 +6,11 @@
#define UI_OZONE_PUBLIC_PLATFORM_WINDOW_SURFACE_H_
#include "base/component_export.h"
+#include "build/build_config.h"
+
+#if defined(OS_FUCHSIA)
+#include <fuchsia/images/cpp/fidl.h>
+#endif // defined(OS_FUCHSIA)
namespace ui {
@@ -28,9 +33,14 @@ class COMPONENT_EXPORT(OZONE_BASE) PlatformWindowSurface {
public:
virtual ~PlatformWindowSurface() {}
- // Note: GL & Vulkan surface are created through the GLOzone &
- // VulkanImplementation interfaces, respectively.
- //
+#if defined(OS_FUCHSIA)
+ // Sets the texture of the surface to a new image pipe.
+ virtual bool SetTextureToNewImagePipe(
+ fidl::InterfaceRequest<fuchsia::images::ImagePipe2>
+ image_pipe_request) = 0;
+#endif // defined(OS_FUCHSIA)
+
+ // Note: GL surface may be created through the GLOzone interface.
// However, you must still create a PlatformWindowSurface and keep it alive in
// order to present.
};
diff --git a/chromium/ui/platform_window/BUILD.gn b/chromium/ui/platform_window/BUILD.gn
index 4a96342b2ec..f06af0fb93c 100644
--- a/chromium/ui/platform_window/BUILD.gn
+++ b/chromium/ui/platform_window/BUILD.gn
@@ -16,6 +16,8 @@ component("platform_window") {
defines = [ "IS_PLATFORM_WINDOW_IMPL" ]
+ public_deps = [ "//ui/base/cursor:cursor_base" ]
+
deps = [
"//base",
"//ui/base",
@@ -28,7 +30,7 @@ component("platform_window") {
"fuchsia/initialize_presenter_api_view.h",
]
- public_deps = [
+ public_deps += [
"//third_party/fuchsia-sdk/sdk/fidl/fuchsia.ui.policy",
"//third_party/fuchsia-sdk/sdk/fidl/fuchsia.ui.views",
"//third_party/fuchsia-sdk/sdk/pkg/scenic_cpp",
diff --git a/chromium/ui/platform_window/fuchsia/initialize_presenter_api_view.cc b/chromium/ui/platform_window/fuchsia/initialize_presenter_api_view.cc
index 292c4ae2cca..7500fcb198e 100644
--- a/chromium/ui/platform_window/fuchsia/initialize_presenter_api_view.cc
+++ b/chromium/ui/platform_window/fuchsia/initialize_presenter_api_view.cc
@@ -5,13 +5,14 @@
#include "ui/platform_window/fuchsia/initialize_presenter_api_view.h"
#include <fuchsia/ui/policy/cpp/fidl.h>
-#include <fuchsia/ui/views/cpp/fidl.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/ui/scenic/cpp/view_ref_pair.h>
#include <lib/ui/scenic/cpp/view_token_pair.h>
-#include "base/fuchsia/default_context.h"
+#include <utility>
+
#include "base/fuchsia/fuchsia_logging.h"
+#include "base/fuchsia/process_context.h"
namespace ui {
namespace fuchsia {
@@ -21,19 +22,19 @@ void InitializeViewTokenAndPresentView(
DCHECK(window_properties_out);
// Generate ViewToken and ViewHolderToken for the new view.
- ::fuchsia::ui::views::ViewHolderToken view_holder_token;
- std::tie(window_properties_out->view_token, view_holder_token) =
- scenic::NewViewTokenPair();
+ auto view_tokens = scenic::ViewTokenPair::New();
+ window_properties_out->view_token = std::move(view_tokens.view_token);
// Create a ViewRefPair so the view can be registered to the SemanticsManager.
window_properties_out->view_ref_pair = scenic::ViewRefPair::New();
// Request Presenter to show the view full-screen.
- auto presenter = base::fuchsia::ComponentContextForCurrentProcess()
+ auto presenter = base::ComponentContextForProcess()
->svc()
->Connect<::fuchsia::ui::policy::Presenter>();
- presenter->PresentView(std::move(view_holder_token), nullptr);
+ presenter->PresentOrReplaceView(std::move(view_tokens.view_holder_token),
+ nullptr);
}
} // namespace fuchsia
diff --git a/chromium/ui/platform_window/platform_window_handler/wm_drag_handler.cc b/chromium/ui/platform_window/platform_window_handler/wm_drag_handler.cc
index f559d426b49..5dafa35363a 100644
--- a/chromium/ui/platform_window/platform_window_handler/wm_drag_handler.cc
+++ b/chromium/ui/platform_window/platform_window_handler/wm_drag_handler.cc
@@ -13,6 +13,8 @@ namespace ui {
DEFINE_UI_CLASS_PROPERTY_KEY(WmDragHandler*, kWmDragHandlerKey, nullptr)
+WmDragHandler::Delegate::~Delegate() = default;
+
void SetWmDragHandler(PlatformWindow* platform_window,
WmDragHandler* drag_handler) {
platform_window->SetProperty(kWmDragHandlerKey, drag_handler);
diff --git a/chromium/ui/platform_window/platform_window_handler/wm_drag_handler.h b/chromium/ui/platform_window/platform_window_handler/wm_drag_handler.h
index 7f7d7933fab..d1f7510e0c2 100644
--- a/chromium/ui/platform_window/platform_window_handler/wm_drag_handler.h
+++ b/chromium/ui/platform_window/platform_window_handler/wm_drag_handler.h
@@ -6,6 +6,8 @@
#define UI_PLATFORM_WINDOW_PLATFORM_WINDOW_HANDLER_WM_DRAG_HANDLER_H_
#include "base/bind.h"
+#include "ui/base/dragdrop/drag_drop_types.h"
+#include "ui/gfx/geometry/point.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/platform_window/platform_window_handler/wm_platform_export.h"
@@ -15,15 +17,31 @@ class OSExchangeData;
class WM_PLATFORM_EXPORT WmDragHandler {
public:
+ // During the drag operation, the handler may send updates
+ class Delegate {
+ public:
+ // Called every time when the drag location has changed.
+ virtual void OnDragLocationChanged(const gfx::Point& screen_point_px) = 0;
+ // Called when the currently negotiated operation has changed.
+ virtual void OnDragOperationChanged(
+ DragDropTypes::DragOperation operation) = 0;
+ // Called once when the operation has finished.
+ virtual void OnDragFinished(int operation) = 0;
+
+ protected:
+ virtual ~Delegate();
+ };
+
// Starts dragging with |data| which it wants to deliver to the destination.
// |operation| is the suggested operation which is bitmask of DRAG_NONE,
// DRAG_MOVE, DRAG_COPY and DRAG_LINK in DragDropTypes::DragOperation to the
// destination and the destination sets the final operation when the drop
- // action is performed.
+ // action is performed. In progress updates on the drag operation come back
+ // through the |delegate|.
virtual void StartDrag(const OSExchangeData& data,
int operation,
gfx::NativeCursor cursor,
- base::OnceCallback<void(int)> callback) = 0;
+ Delegate* delegate) = 0;
protected:
virtual ~WmDragHandler() {}
diff --git a/chromium/ui/platform_window/x11/BUILD.gn b/chromium/ui/platform_window/x11/BUILD.gn
index 60228f2c548..a9d6bc31204 100644
--- a/chromium/ui/platform_window/x11/BUILD.gn
+++ b/chromium/ui/platform_window/x11/BUILD.gn
@@ -4,6 +4,7 @@
import("//build/config/jumbo.gni")
import("//build/config/ui.gni")
+import("//testing/test.gni")
import("//ui/ozone/ozone.gni")
assert(use_x11 || ozone_platform_x11)
@@ -49,3 +50,37 @@ jumbo_component("x11") {
deps += [ "//ui/events/x" ]
}
}
+
+test("x11_unittests") {
+ sources = [ "test/x11_window_unittest.cc" ]
+ deps = [
+ ":x11",
+ "//base/test:run_all_unittests",
+ "//base/test:test_support",
+ "//skia",
+ "//testing/gmock",
+ "//testing/gtest",
+ "//ui/base/x",
+ "//ui/base/x:test_support",
+ "//ui/events:test_support",
+ "//ui/events/platform/x11",
+ "//ui/events/x",
+ "//ui/gfx:test_support",
+ "//ui/gfx/x",
+ "//ui/platform_window",
+ "//ui/platform_window/extensions",
+ ]
+ configs += [ "//build/config:precompiled_headers" ]
+
+ # Needed for tests. Please note that if you want to run tests locally,
+ # ensure that you start them from your out directory with the xvfb
+ # script so that openbox has time to start. Otherwise, the x11_unittests
+ # will time out. e.g. -
+ #
+ # 1) cd out/Debug.
+ # 2) ../../testing/xvfb.py ./x11_unittests.
+ #
+ #TODO(dpranke): move that to appropriate place after test() template is
+ # reworked.
+ data_deps = [ "//ui/base/x/xwmstartupcheck" ]
+}
diff --git a/chromium/ui/platform_window/x11/atk_event_conversion.cc b/chromium/ui/platform_window/x11/atk_event_conversion.cc
index b79fff06bb0..6b5a82dbfe7 100644
--- a/chromium/ui/platform_window/x11/atk_event_conversion.cc
+++ b/chromium/ui/platform_window/x11/atk_event_conversion.cc
@@ -10,13 +10,15 @@
namespace ui {
-std::unique_ptr<AtkKeyEventStruct> AtkKeyEventFromXEvent(XEvent* xevent) {
- DCHECK(xevent);
+std::unique_ptr<AtkKeyEventStruct> AtkKeyEventFromXEvent(
+ x11::Event* x11_event) {
+ DCHECK(x11_event);
+ XEvent* xevent = &x11_event->xlib_event();
auto atk_key_event = std::make_unique<AtkKeyEventStruct>();
- if (xevent->type == KeyPress)
+ if (xevent->type == x11::KeyEvent::Press)
atk_key_event->type = ATK_KEY_EVENT_PRESS;
- else if (xevent->type == KeyRelease)
+ else if (xevent->type == x11::KeyEvent::Release)
atk_key_event->type = ATK_KEY_EVENT_RELEASE;
else
NOTREACHED() << xevent->type;
@@ -35,7 +37,7 @@ std::unique_ptr<AtkKeyEventStruct> AtkKeyEventFromXEvent(XEvent* xevent) {
atk_key_event->string = nullptr;
atk_key_event->length = 0;
- int flags = ui::EventFlagsFromXEvent(*xevent);
+ int flags = ui::EventFlagsFromXEvent(*x11_event);
if (flags & ui::EF_SHIFT_DOWN)
atk_key_event->state |= AtkKeyModifierMask::kAtkShiftMask;
if (flags & ui::EF_CAPS_LOCK_ON)
diff --git a/chromium/ui/platform_window/x11/atk_event_conversion.h b/chromium/ui/platform_window/x11/atk_event_conversion.h
index 6a2dce7fbe6..ad15f27db48 100644
--- a/chromium/ui/platform_window/x11/atk_event_conversion.h
+++ b/chromium/ui/platform_window/x11/atk_event_conversion.h
@@ -9,6 +9,7 @@
#include <memory>
+#include "ui/gfx/x/event.h"
#include "ui/gfx/x/x11.h"
namespace ui {
@@ -27,7 +28,7 @@ typedef enum {
KAtkMod5Mask = 1 << 7,
} AtkKeyModifierMask;
-std::unique_ptr<AtkKeyEventStruct> AtkKeyEventFromXEvent(XEvent* xev);
+std::unique_ptr<AtkKeyEventStruct> AtkKeyEventFromXEvent(x11::Event* xev);
} // namespace ui
diff --git a/chromium/ui/platform_window/x11/x11_topmost_window_finder.cc b/chromium/ui/platform_window/x11/x11_topmost_window_finder.cc
index 4163e3b9db3..2b8edfc02db 100644
--- a/chromium/ui/platform_window/x11/x11_topmost_window_finder.cc
+++ b/chromium/ui/platform_window/x11/x11_topmost_window_finder.cc
@@ -8,6 +8,7 @@
#include <vector>
+#include "ui/gfx/native_widget_types.h"
#include "ui/platform_window/x11/x11_window.h"
#include "ui/platform_window/x11/x11_window_manager.h"
@@ -17,7 +18,7 @@ X11TopmostWindowFinder::X11TopmostWindowFinder() = default;
X11TopmostWindowFinder::~X11TopmostWindowFinder() = default;
-XID X11TopmostWindowFinder::FindLocalProcessWindowAt(
+x11::Window X11TopmostWindowFinder::FindLocalProcessWindowAt(
const gfx::Point& screen_loc_in_pixels,
const std::set<gfx::AcceleratedWidget>& ignore) {
screen_loc_in_pixels_ = screen_loc_in_pixels;
@@ -28,35 +29,37 @@ XID X11TopmostWindowFinder::FindLocalProcessWindowAt(
if (std::none_of(local_process_windows.cbegin(), local_process_windows.cend(),
[this](auto* window) {
return ShouldStopIteratingAtLocalProcessWindow(window);
- }))
- return gfx::kNullAcceleratedWidget;
+ })) {
+ return x11::Window::None;
+ }
EnumerateTopLevelWindows(this);
return toplevel_;
}
-XID X11TopmostWindowFinder::FindWindowAt(
+x11::Window X11TopmostWindowFinder::FindWindowAt(
const gfx::Point& screen_loc_in_pixels) {
screen_loc_in_pixels_ = screen_loc_in_pixels;
EnumerateTopLevelWindows(this);
return toplevel_;
}
-bool X11TopmostWindowFinder::ShouldStopIterating(XID xid) {
- if (!IsWindowVisible(xid))
+bool X11TopmostWindowFinder::ShouldStopIterating(x11::Window xwindow) {
+ if (!IsWindowVisible(xwindow))
return false;
- auto* window = X11WindowManager::GetInstance()->GetWindow(xid);
+ auto* window = X11WindowManager::GetInstance()->GetWindow(
+ static_cast<gfx::AcceleratedWidget>(xwindow));
if (window) {
if (ShouldStopIteratingAtLocalProcessWindow(window)) {
- toplevel_ = xid;
+ toplevel_ = xwindow;
return true;
}
return false;
}
- if (WindowContainsPoint(xid, screen_loc_in_pixels_)) {
- toplevel_ = xid;
+ if (WindowContainsPoint(xwindow, screen_loc_in_pixels_)) {
+ toplevel_ = xwindow;
return true;
}
return false;
@@ -72,7 +75,7 @@ bool X11TopmostWindowFinder::ShouldStopIteratingAtLocalProcessWindow(
if (!window->IsVisible())
return false;
- gfx::Rect window_bounds = window->GetOutterBounds();
+ gfx::Rect window_bounds = window->GetOuterBounds();
if (!window_bounds.Contains(screen_loc_in_pixels_))
return false;
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 62c9e138d72..0ad199f5ccf 100644
--- a/chromium/ui/platform_window/x11/x11_topmost_window_finder.h
+++ b/chromium/ui/platform_window/x11/x11_topmost_window_finder.h
@@ -30,15 +30,16 @@ class X11_WINDOW_EXPORT X11TopmostWindowFinder
// Returns the topmost window at |screen_loc_in_pixels|, ignoring the windows
// in |ignore|. Returns null widget if the topmost window at
// |screen_loc_in_pixels| does not belong to Chrome.
- XID FindLocalProcessWindowAt(const gfx::Point& screen_loc_in_pixels,
- const std::set<gfx::AcceleratedWidget>& ignore);
+ x11::Window FindLocalProcessWindowAt(
+ const gfx::Point& screen_loc_in_pixels,
+ const std::set<gfx::AcceleratedWidget>& ignore);
// Returns the topmost window at |screen_loc_in_pixels|.
- XID FindWindowAt(const gfx::Point& screen_loc_in_pixels) override;
+ x11::Window FindWindowAt(const gfx::Point& screen_loc_in_pixels) override;
private:
// ui::EnumerateWindowsDelegate:
- bool ShouldStopIterating(XID xid) override;
+ bool ShouldStopIterating(x11::Window window) override;
// Returns true if |window| does not not belong to |ignore|, is visible and
// contains |screen_loc_|.
@@ -46,7 +47,7 @@ class X11_WINDOW_EXPORT X11TopmostWindowFinder
gfx::Point screen_loc_in_pixels_;
std::set<gfx::AcceleratedWidget> ignore_;
- XID toplevel_ = x11::None;
+ x11::Window toplevel_ = x11::Window::None;
DISALLOW_COPY_AND_ASSIGN(X11TopmostWindowFinder);
};
diff --git a/chromium/ui/platform_window/x11/x11_window.cc b/chromium/ui/platform_window/x11/x11_window.cc
index c9fc5e2670d..bc2c18233b7 100644
--- a/chromium/ui/platform_window/x11/x11_window.cc
+++ b/chromium/ui/platform_window/x11/x11_window.cc
@@ -7,6 +7,7 @@
#include "base/strings/string_number_conversions.h"
#include "base/trace_event/trace_event.h"
#include "ui/base/buildflags.h"
+#include "ui/base/x/x11_cursor.h"
#include "ui/base/x/x11_desktop_window_move_client.h"
#include "ui/base/x/x11_util.h"
#include "ui/base/x/x11_util_internal.h"
@@ -24,7 +25,15 @@
#include "ui/platform_window/x11/x11_window_manager.h"
#if defined(USE_OZONE)
+#include "ui/base/dragdrop/os_exchange_data.h"
+#include "ui/base/x/x11_os_exchange_data_provider.h"
+#include "ui/base/x/x11_pointer_grab.h"
+#include "ui/base/x/x11_topmost_window_finder.h"
#include "ui/events/ozone/events_ozone.h"
+#include "ui/platform_window/platform_window_handler/wm_drop_handler.h"
+#include "ui/platform_window/x11/x11_topmost_window_finder.h"
+#else
+#include "ui/base/dragdrop/os_exchange_data_provider_x11.h"
#endif // defined(USE_OZONE)
#if BUILDFLAG(USE_ATK)
@@ -35,6 +44,9 @@ namespace ui {
namespace {
+// Opacity for drag widget windows.
+constexpr float kDragWidgetOpacity = .75f;
+
XWindow::WindowOpacity GetXWindowOpacity(PlatformWindowOpacity opacity) {
using WindowOpacity = XWindow::WindowOpacity;
switch (opacity) {
@@ -91,12 +103,15 @@ ui::XWindow::Configuration ConvertInitPropertiesToXWindowConfig(
}
// Coalesce touch/mouse events if needed
-bool CoalesceEventsIfNeeded(XEvent* const xev, EventType type, XEvent* out) {
- if (xev->type == MotionNotify ||
- (xev->type == GenericEvent &&
+bool CoalesceEventsIfNeeded(x11::Event* const x11_event,
+ EventType type,
+ x11::Event* out) {
+ XEvent* xev = &x11_event->xlib_event();
+ if (xev->type == x11::MotionNotifyEvent::opcode ||
+ (xev->type == x11::GeGenericEvent::opcode &&
(type == ui::ET_TOUCH_MOVED || type == ui::ET_MOUSE_MOVED ||
type == ui::ET_MOUSE_DRAGGED))) {
- return ui::CoalescePendingMotionEvents(xev, out) > 0;
+ return ui::CoalescePendingMotionEvents(x11_event, out) > 0;
}
return false;
}
@@ -130,11 +145,27 @@ void X11Window::Initialize(PlatformWindowInitProperties properties) {
config.override_redirect =
properties.x11_extension_delegate &&
properties.x11_extension_delegate->IsOverrideRedirect(IsWmTiling());
+ if (config.type == WindowType::kDrag) {
+ config.opacity = ui::IsCompositingManagerPresent()
+ ? WindowOpacity::kTranslucentWindow
+ : WindowOpacity::kOpaqueWindow;
+ }
workspace_extension_delegate_ = properties.workspace_extension_delegate;
x11_extension_delegate_ = properties.x11_extension_delegate;
Init(config);
+
+ if (config.type == WindowType::kDrag &&
+ config.opacity == WindowOpacity::kTranslucentWindow) {
+ SetOpacity(kDragWidgetOpacity);
+ }
+
+#if defined(USE_OZONE)
+ SetWmDragHandler(this, this);
+
+ drag_drop_client_ = std::make_unique<XDragDropClient>(this, window());
+#endif
}
void X11Window::SetXEventDelegate(XEventDelegate* delegate) {
@@ -359,11 +390,7 @@ bool X11Window::ShouldUseNativeFrame() const {
}
void X11Window::SetCursor(PlatformCursor cursor) {
- // X11PlatformWindowOzone has different type of PlatformCursor. Thus, use this
- // only for X11 and Ozone will manage this by itself.
-#if defined(USE_X11)
- XWindow::SetCursor(cursor);
-#endif
+ XWindow::SetCursor(static_cast<X11Cursor*>(cursor)->xcursor());
}
void X11Window::MoveCursorTo(const gfx::Point& location) {
@@ -409,8 +436,8 @@ ZOrderLevel X11Window::GetZOrderLevel() const {
}
void X11Window::StackAbove(gfx::AcceleratedWidget widget) {
- // Check comment in the GetWidget method about this this cast.
- XWindow::StackXWindowAbove(static_cast<::Window>(widget));
+ // Check comment in the GetWidget method about this cast.
+ XWindow::StackXWindowAbove(static_cast<x11::Window>(widget));
}
void X11Window::StackAtTop() {
@@ -482,7 +509,7 @@ void X11Window::OnCompleteSwapAfterResize() {
}
gfx::Rect X11Window::GetXRootWindowOuterBounds() const {
- return XWindow::GetOutterBounds();
+ return XWindow::GetOuterBounds();
}
bool X11Window::ContainsPointInXRegion(const gfx::Point& point) const {
@@ -501,17 +528,19 @@ void X11Window::SetX11ExtensionDelegate(X11ExtensionDelegate* delegate) {
x11_extension_delegate_ = delegate;
}
-bool X11Window::HandleAsAtkEvent(XEvent* xev) {
+bool X11Window::HandleAsAtkEvent(x11::Event* x11_event) {
#if !BUILDFLAG(USE_ATK)
// TODO(crbug.com/1014934): Support ATK in Ozone/X11.
NOTREACHED();
return false;
#else
+ XEvent* xev = &x11_event->xlib_event();
DCHECK(xev);
- if (!x11_extension_delegate_ ||
- (xev->type != KeyPress && xev->type != KeyRelease))
+ if (!x11_extension_delegate_ || (xev->type != x11::KeyEvent::Press &&
+ xev->type != x11::KeyEvent::Release)) {
return false;
- auto atk_key_event = AtkKeyEventFromXEvent(xev);
+ }
+ auto atk_key_event = AtkKeyEventFromXEvent(x11_event);
return x11_extension_delegate_->OnAtkKeyEvent(atk_key_event.get());
#endif
}
@@ -521,7 +550,7 @@ bool X11Window::HandleAsAtkEvent(XEvent* xev) {
// able to process next translated event sent by it. So, it's done through
// |handle_next_event_| internal flag, used in subsequent CanDispatchEvent
// call.
-void X11Window::CheckCanDispatchNextPlatformEvent(XEvent* xev) {
+void X11Window::CheckCanDispatchNextPlatformEvent(x11::Event* xev) {
if (is_shutting_down_)
return;
current_xevent_ = XWindow::IsTargetedBy(*xev) ? xev : nullptr;
@@ -535,7 +564,7 @@ PlatformEventDispatcher* X11Window::GetPlatformEventDispatcher() {
return this;
}
-bool X11Window::DispatchXEvent(XEvent* xev) {
+bool X11Window::DispatchXEvent(x11::Event* xev) {
if (!XWindow::IsTargetedBy(*xev))
return false;
XWindow::ProcessEvent(xev);
@@ -543,7 +572,7 @@ bool X11Window::DispatchXEvent(XEvent* xev) {
}
bool X11Window::CanDispatchEvent(const PlatformEvent& xev) {
- DCHECK_NE(window(), x11::None);
+ DCHECK_NE(window(), x11::Window::None);
return !!current_xevent_;
}
@@ -551,7 +580,7 @@ uint32_t X11Window::DispatchEvent(const PlatformEvent& event) {
TRACE_EVENT1("views", "X11PlatformWindow::Dispatch", "event->type()",
event->type());
- DCHECK_NE(window(), x11::None);
+ DCHECK_NE(window(), x11::Window::None);
DCHECK(event);
DCHECK(current_xevent_);
@@ -567,7 +596,7 @@ uint32_t X11Window::DispatchEvent(const PlatformEvent& event) {
return POST_DISPATCH_STOP_PROPAGATION;
}
-void X11Window::DispatchUiEvent(ui::Event* event, XEvent* xev) {
+void X11Window::DispatchUiEvent(ui::Event* event, x11::Event* xev) {
auto* window_manager = X11WindowManager::GetInstance();
DCHECK(window_manager);
@@ -595,7 +624,7 @@ void X11Window::DispatchUiEvent(ui::Event* event, XEvent* xev) {
return located_events_grabber->DispatchUiEvent(event, xev);
}
- XEvent last_xev;
+ x11::Event last_xev;
std::unique_ptr<ui::Event> last_motion;
bool coalesced = CoalesceEventsIfNeeded(xev, event->type(), &last_xev);
if (coalesced) {
@@ -619,9 +648,6 @@ void X11Window::DispatchUiEvent(ui::Event* event, XEvent* xev) {
platform_window_delegate_->DispatchEvent(event);
#endif
}
-
- if (coalesced)
- XFreeEventData(last_xev.xgeneric.display, &last_xev.xcookie);
}
void X11Window::OnXWindowCreated() {
@@ -640,10 +666,6 @@ void X11Window::OnXWindowCreated() {
platform_window_delegate_->OnAcceleratedWidgetAvailable(GetWidget());
}
-bool X11Window::DispatchDraggingUiEvent(ui::Event* event) {
- return false;
-}
-
void X11Window::OnXWindowStateChanged() {
// Determine the new window state information to be propagated to the client.
// Note that the order of checks is important here, because window can have
@@ -728,14 +750,22 @@ void X11Window::OnXWindowLostPointerGrab() {
x11_extension_delegate_->OnLostMouseGrab();
}
-void X11Window::OnXWindowSelectionEvent(XEvent* xev) {
+void X11Window::OnXWindowSelectionEvent(x11::Event* xev) {
if (x_event_delegate_)
x_event_delegate_->OnXWindowSelectionEvent(xev);
+#if defined(USE_OZONE)
+ DCHECK(drag_drop_client_);
+ drag_drop_client_->OnSelectionNotify(*xev->As<x11::SelectionNotifyEvent>());
+#endif
}
-void X11Window::OnXWindowDragDropEvent(XEvent* xev) {
+void X11Window::OnXWindowDragDropEvent(x11::Event* xev) {
if (x_event_delegate_)
x_event_delegate_->OnXWindowDragDropEvent(xev);
+#if defined(USE_OZONE)
+ DCHECK(drag_drop_client_);
+ drag_drop_client_->HandleXdndEvent(*xev->As<x11::ClientMessageEvent>());
+#endif
}
base::Optional<gfx::Size> X11Window::GetMinimumSizeForXWindow() {
@@ -766,6 +796,136 @@ void X11Window::EndMoveLoop() {
x11_window_move_client_->EndMoveLoop();
}
+#if defined(USE_OZONE)
+void X11Window::StartDrag(const OSExchangeData& data,
+ int operation,
+ gfx::NativeCursor cursor,
+ WmDragHandler::Delegate* delegate) {
+ DCHECK(drag_drop_client_);
+ DCHECK(!drag_handler_delegate_);
+
+ drag_handler_delegate_ = delegate;
+ drag_drop_client_->InitDrag(operation, &data);
+ drag_operation_ = 0;
+ notified_enter_ = false;
+
+ SetCapture();
+
+ dragging_ = true;
+}
+
+std::unique_ptr<XTopmostWindowFinder> X11Window::CreateWindowFinder() {
+ return std::make_unique<X11TopmostWindowFinder>();
+}
+
+int X11Window::UpdateDrag(const gfx::Point& screen_point) {
+ WmDropHandler* drop_handler = GetWmDropHandler(*this);
+ if (!drop_handler)
+ return DragDropTypes::DRAG_NONE;
+ if (!notified_enter_) {
+ DCHECK(drag_drop_client_);
+ auto* target_current_context = drag_drop_client_->target_current_context();
+ DCHECK(target_current_context);
+ drop_handler->OnDragEnter(
+ gfx::PointF(screen_point),
+ std::make_unique<ui::OSExchangeData>(
+ std::make_unique<ui::XOSExchangeDataProvider>(
+ drag_drop_client_->xwindow(),
+ target_current_context->fetched_targets())),
+ ui::DragDropTypes::DRAG_COPY);
+ notified_enter_ = true;
+ }
+
+ drag_operation_ = drop_handler->OnDragMotion(gfx::PointF(screen_point),
+ ui::DragDropTypes::DRAG_COPY);
+ return drag_operation_;
+}
+
+void X11Window::UpdateCursor(
+ DragDropTypes::DragOperation negotiated_operation) {
+ DCHECK(drag_handler_delegate_);
+ drag_handler_delegate_->OnDragOperationChanged(negotiated_operation);
+}
+
+void X11Window::OnBeginForeignDrag(x11::Window window) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+void X11Window::OnEndForeignDrag() {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+void X11Window::OnBeforeDragLeave() {
+ WmDropHandler* drop_handler = GetWmDropHandler(*this);
+ if (!drop_handler)
+ return;
+ drop_handler->OnDragLeave();
+ notified_enter_ = false;
+}
+
+int X11Window::PerformDrop() {
+ WmDropHandler* drop_handler = GetWmDropHandler(*this);
+ if (!drop_handler)
+ return DragDropTypes::DRAG_NONE;
+
+ DCHECK(notified_enter_);
+
+ // The drop data has been supplied on entering the window. The drop handler
+ // should have it since then.
+ drop_handler->OnDragDrop({});
+ notified_enter_ = false;
+ return drag_operation_;
+}
+
+void X11Window::EndDragLoop() {
+ DCHECK(drag_handler_delegate_);
+ drag_handler_delegate_->OnDragFinished(drag_operation_);
+ drag_handler_delegate_ = nullptr;
+}
+#endif // defined(USE_OZONE)
+
+bool X11Window::DispatchDraggingUiEvent(Event* event) {
+#if defined(USE_OZONE)
+ // Drag and drop have a priority over other processing.
+ if (dragging_) {
+ DCHECK(drag_drop_client_);
+
+ switch (event->type()) {
+ case ET_MOUSE_MOVED:
+ case ET_MOUSE_DRAGGED: {
+ drag_handler_delegate_->OnDragLocationChanged(
+ event->AsLocatedEvent()->root_location());
+ drag_drop_client_->HandleMouseMovement(
+ event->AsLocatedEvent()->root_location(),
+ event->AsMouseEvent()->flags(),
+ event->AsMouseEvent()->time_stamp());
+ return true;
+ }
+ case ET_MOUSE_RELEASED:
+ if (!event->AsMouseEvent()->IsLeftMouseButton())
+ break;
+ // Assume that drags are being done with the left mouse button. Only
+ // break the drag if the left mouse button was released.
+ drag_drop_client_->HandleMouseReleased();
+ dragging_ = false;
+ ReleaseCapture();
+ return true;
+ case ET_KEY_PRESSED:
+ if (event->AsKeyEvent()->key_code() != VKEY_ESCAPE)
+ break;
+ EndMoveLoop();
+ drag_drop_client_->HandleMoveLoopEnded();
+ dragging_ = false;
+ ReleaseCapture();
+ return true;
+ default:
+ break;
+ }
+ }
+#endif // defined(USE_OZONE)
+ return false;
+}
+
gfx::Size X11Window::AdjustSizeForDisplay(
const gfx::Size& requested_size_in_pixels) {
#if defined(OS_CHROMEOS)
@@ -795,7 +955,7 @@ gfx::Size X11Window::AdjustSizeForDisplay(
void X11Window::ConvertEventLocationToTargetLocation(
const gfx::Rect& target_window_bounds,
const gfx::Rect& current_window_bounds,
- ui::LocatedEvent* located_event) {
+ LocatedEvent* located_event) {
// TODO(msisov): for ozone, we need to access PlatformScreen instead and get
// the displays.
auto* display = display::Screen::GetScreen();
diff --git a/chromium/ui/platform_window/x11/x11_window.h b/chromium/ui/platform_window/x11/x11_window.h
index 378512c1676..011fbee55c3 100644
--- a/chromium/ui/platform_window/x11/x11_window.h
+++ b/chromium/ui/platform_window/x11/x11_window.h
@@ -9,6 +9,7 @@
#include "ui/base/x/x11_window.h"
#include "ui/events/platform/platform_event_dispatcher.h"
#include "ui/events/platform/x11/x11_event_source.h"
+#include "ui/gfx/x/event.h"
#include "ui/platform_window/extensions/workspace_extension.h"
#include "ui/platform_window/extensions/x11_extension.h"
#include "ui/platform_window/platform_window.h"
@@ -17,26 +18,32 @@
#include "ui/platform_window/platform_window_init_properties.h"
#include "ui/platform_window/x11/x11_window_export.h"
+#if defined(USE_OZONE)
+#include "ui/base/x/x11_drag_drop_client.h"
+#include "ui/platform_window/platform_window_handler/wm_drag_handler.h"
+#endif
+
namespace ui {
+class PlatformWindowDelegate;
class X11ExtensionDelegate;
class X11DesktopWindowMoveClient;
class LocatedEvent;
class WorkspaceExtensionDelegate;
// Delegate interface used to communicate the X11PlatformWindow API client about
-// XEvents of interest.
+// x11::Events of interest.
class X11_WINDOW_EXPORT XEventDelegate {
public:
- virtual ~XEventDelegate() {}
+ virtual ~XEventDelegate() = default;
// TODO(crbug.com/990756): We need to implement/reuse ozone interface for
// these.
- virtual void OnXWindowSelectionEvent(XEvent* xev) = 0;
- virtual void OnXWindowDragDropEvent(XEvent* xev) = 0;
+ virtual void OnXWindowSelectionEvent(x11::Event* xev) = 0;
+ virtual void OnXWindowDragDropEvent(x11::Event* xev) = 0;
};
-// PlatformWindow implementation for X11. PlatformEvents are XEvents.
+// PlatformWindow implementation for X11.
class X11_WINDOW_EXPORT X11Window : public PlatformWindow,
public WmMoveResizeHandler,
public XWindow,
@@ -44,6 +51,10 @@ class X11_WINDOW_EXPORT X11Window : public PlatformWindow,
public XEventDispatcher,
public WorkspaceExtension,
public X11Extension,
+#if defined(USE_OZONE)
+ public WmDragHandler,
+ public XDragDropClient::Delegate,
+#endif
public WmMoveLoopHandler {
public:
explicit X11Window(PlatformWindowDelegate* platform_window_delegate);
@@ -120,10 +131,10 @@ class X11_WINDOW_EXPORT X11Window : public PlatformWindow,
void SetX11ExtensionDelegate(X11ExtensionDelegate* delegate) override;
// Overridden from ui::XEventDispatcher:
- void CheckCanDispatchNextPlatformEvent(XEvent* xev) override;
+ void CheckCanDispatchNextPlatformEvent(x11::Event* xev) override;
void PlatformEventDispatchFinished() override;
PlatformEventDispatcher* GetPlatformEventDispatcher() override;
- bool DispatchXEvent(XEvent* event) override;
+ bool DispatchXEvent(x11::Event* event) override;
protected:
PlatformWindowDelegate* platform_window_delegate() const {
@@ -145,8 +156,8 @@ class X11_WINDOW_EXPORT X11Window : public PlatformWindow,
void OnXWindowIsActiveChanged(bool active) override;
void OnXWindowWorkspaceChanged() override;
void OnXWindowLostPointerGrab() override;
- void OnXWindowSelectionEvent(XEvent* xev) override;
- void OnXWindowDragDropEvent(XEvent* xev) override;
+ void OnXWindowSelectionEvent(x11::Event* xev) override;
+ void OnXWindowDragDropEvent(x11::Event* xev) override;
base::Optional<gfx::Size> GetMinimumSizeForXWindow() override;
base::Optional<gfx::Size> GetMaximumSizeForXWindow() override;
void GetWindowMaskForXWindow(const gfx::Size& size,
@@ -157,7 +168,7 @@ class X11_WINDOW_EXPORT X11Window : public PlatformWindow,
bool CanDispatchEvent(const PlatformEvent& event) override;
uint32_t DispatchEvent(const PlatformEvent& event) override;
- void DispatchUiEvent(ui::Event* event, XEvent* xev);
+ void DispatchUiEvent(ui::Event* event, x11::Event* xev);
// WmMoveResizeHandler
void DispatchHostWindowDragMovement(
@@ -168,8 +179,27 @@ class X11_WINDOW_EXPORT X11Window : public PlatformWindow,
bool RunMoveLoop(const gfx::Vector2d& drag_offset) override;
void EndMoveLoop() override;
+#if defined(USE_OZONE)
+ // WmDragHandler
+ void StartDrag(const ui::OSExchangeData& data,
+ int operation,
+ gfx::NativeCursor cursor,
+ WmDragHandler::Delegate* delegate) override;
+
+ // ui::XDragDropClient::Delegate
+ std::unique_ptr<ui::XTopmostWindowFinder> CreateWindowFinder() override;
+ int UpdateDrag(const gfx::Point& screen_point) override;
+ void UpdateCursor(
+ ui::DragDropTypes::DragOperation negotiated_operation) override;
+ void OnBeginForeignDrag(x11::Window window) override;
+ void OnEndForeignDrag() override;
+ void OnBeforeDragLeave() override;
+ int PerformDrop() override;
+ void EndDragLoop() override;
+#endif // defined(USE_OZONE)
+
// Handles |xevent| as a Atk Key Event
- bool HandleAsAtkEvent(XEvent* xevent);
+ bool HandleAsAtkEvent(x11::Event* xevent);
// Adjusts |requested_size_in_pixels| to avoid the WM "feature" where setting
// the window size to the monitor size causes the WM to set the EWMH for
@@ -205,12 +235,25 @@ class X11_WINDOW_EXPORT X11Window : public PlatformWindow,
gfx::Rect restored_bounds_in_pixels_;
// Tells if this dispatcher can process next translated event based on a
- // previous check in ::CheckCanDispatchNextPlatformEvent based on a XID
- // target.
- XEvent* current_xevent_ = nullptr;
+ // previous check in ::CheckCanDispatchNextPlatformEvent based on a
+ // x11::Window target.
+ x11::Event* current_xevent_ = nullptr;
std::unique_ptr<X11DesktopWindowMoveClient> x11_window_move_client_;
+#if defined(USE_OZONE)
+ // True while the drag initiated in this window is in progress.
+ bool dragging_ = false;
+ // Whether the drop handler has notified that the drag has entered.
+ bool notified_enter_ = false;
+ // Keeps the last negotiated operation returned by the drop handler.
+ int drag_operation_ = 0;
+
+ // Handles XDND events going through this window.
+ std::unique_ptr<XDragDropClient> drag_drop_client_;
+ WmDragHandler::Delegate* drag_handler_delegate_ = nullptr;
+#endif // defined(USE_OZONE)
+
DISALLOW_COPY_AND_ASSIGN(X11Window);
};
diff --git a/chromium/ui/shell_dialogs/BUILD.gn b/chromium/ui/shell_dialogs/BUILD.gn
index 1fc50d45d85..84a9a652ea9 100644
--- a/chromium/ui/shell_dialogs/BUILD.gn
+++ b/chromium/ui/shell_dialogs/BUILD.gn
@@ -2,6 +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/chromeos/ui_mode.gni")
import("//build/config/jumbo.gni")
import("//build/config/ui.gni")
import("//testing/test.gni")
@@ -106,6 +107,14 @@ jumbo_component("shell_dialogs") {
if (is_fuchsia) {
sources += [ "select_file_dialog_fuchsia.cc" ]
}
+
+ # TODO(crbug.com/1052397): Rename chromeos_is_browser_only.
+ if (chromeos_is_browser_only) {
+ sources += [
+ "select_file_dialog_lacros.cc",
+ "select_file_dialog_lacros.h",
+ ]
+ }
}
test("shell_dialogs_unittests") {
diff --git a/chromium/ui/shell_dialogs/select_file_dialog_android.cc b/chromium/ui/shell_dialogs/select_file_dialog_android.cc
index 0a0c2989ea3..66500a99be7 100644
--- a/chromium/ui/shell_dialogs/select_file_dialog_android.cc
+++ b/chromium/ui/shell_dialogs/select_file_dialog_android.cc
@@ -48,7 +48,7 @@ void SelectFileDialogImpl::OnFileSelected(
if (!file_name.empty())
file_info.display_name = file_name;
- listener_->FileSelectedWithExtraInfo(file_info, 0, NULL);
+ listener_->FileSelectedWithExtraInfo(file_info, 0, nullptr);
}
void SelectFileDialogImpl::OnMultipleFilesSelected(
@@ -83,14 +83,14 @@ void SelectFileDialogImpl::OnMultipleFilesSelected(
selected_files.push_back(file_info);
}
- listener_->MultiFilesSelectedWithExtraInfo(selected_files, NULL);
+ listener_->MultiFilesSelectedWithExtraInfo(selected_files, nullptr);
}
void SelectFileDialogImpl::OnFileNotSelected(
JNIEnv* env,
const JavaParamRef<jobject>& java_object) {
if (listener_)
- listener_->FileSelectionCanceled(NULL);
+ listener_->FileSelectionCanceled(nullptr);
}
void SelectFileDialogImpl::OnContactsSelected(
@@ -107,7 +107,7 @@ bool SelectFileDialogImpl::IsRunning(gfx::NativeWindow) const {
}
void SelectFileDialogImpl::ListenerDestroyed() {
- listener_ = NULL;
+ listener_ = nullptr;
}
void SelectFileDialogImpl::SelectFileImpl(
diff --git a/chromium/ui/shell_dialogs/select_file_dialog_lacros.cc b/chromium/ui/shell_dialogs/select_file_dialog_lacros.cc
new file mode 100644
index 00000000000..53d0cdbe8a3
--- /dev/null
+++ b/chromium/ui/shell_dialogs/select_file_dialog_lacros.cc
@@ -0,0 +1,60 @@
+// 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/shell_dialogs/select_file_dialog_lacros.h"
+
+#include "base/bind.h"
+#include "base/notreached.h"
+#include "base/task/thread_pool.h"
+#include "ui/shell_dialogs/select_file_policy.h"
+
+namespace ui {
+
+SelectFileDialogLacros::Factory::Factory() = default;
+SelectFileDialogLacros::Factory::~Factory() = default;
+
+ui::SelectFileDialog* SelectFileDialogLacros::Factory::Create(
+ ui::SelectFileDialog::Listener* listener,
+ std::unique_ptr<ui::SelectFilePolicy> policy) {
+ return new SelectFileDialogLacros(listener, std::move(policy));
+}
+
+SelectFileDialogLacros::SelectFileDialogLacros(
+ Listener* listener,
+ std::unique_ptr<ui::SelectFilePolicy> policy)
+ : ui::SelectFileDialog(listener, std::move(policy)) {}
+
+SelectFileDialogLacros::~SelectFileDialogLacros() = default;
+
+bool SelectFileDialogLacros::HasMultipleFileTypeChoicesImpl() {
+ return true;
+}
+
+bool SelectFileDialogLacros::IsRunning(gfx::NativeWindow owning_window) const {
+ return true;
+}
+
+void SelectFileDialogLacros::SelectFileImpl(
+ Type type,
+ const base::string16& title,
+ const base::FilePath& default_path,
+ const FileTypeInfo* file_types,
+ int file_type_index,
+ const base::FilePath::StringType& default_extension,
+ gfx::NativeWindow owning_window,
+ void* params) {
+ // TODO(https://crbug.com/1090587): Proxy the request over IPC to ash-chrome.
+ NOTIMPLEMENTED();
+ // Until we have an implementation, pretend the user cancelled the dialog.
+ // Post a task to avoid reentrancy issues. |this| is ref-counted.
+ base::ThreadPool::PostTask(
+ FROM_HERE, base::BindOnce(&SelectFileDialogLacros::Cancel, this, params));
+}
+
+void SelectFileDialogLacros::Cancel(void* params) {
+ if (listener_)
+ listener_->FileSelectionCanceled(params);
+}
+
+} // namespace ui
diff --git a/chromium/ui/shell_dialogs/select_file_dialog_lacros.h b/chromium/ui/shell_dialogs/select_file_dialog_lacros.h
new file mode 100644
index 00000000000..145781b7a7e
--- /dev/null
+++ b/chromium/ui/shell_dialogs/select_file_dialog_lacros.h
@@ -0,0 +1,60 @@
+// 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_SHELL_DIALOGS_SELECT_FILE_DIALOG_LACROS_H_
+#define UI_SHELL_DIALOGS_SELECT_FILE_DIALOG_LACROS_H_
+
+#include "ui/shell_dialogs/select_file_dialog.h"
+#include "ui/shell_dialogs/select_file_dialog_factory.h"
+#include "ui/shell_dialogs/shell_dialogs_export.h"
+
+namespace ui {
+
+// SelectFileDialogLacros implements file open and save dialogs for the
+// lacros-chrome binary. The dialog itself is handled by the file manager in
+// ash-chrome.
+class SelectFileDialogLacros : public SelectFileDialog {
+ public:
+ class SHELL_DIALOGS_EXPORT Factory : public SelectFileDialogFactory {
+ public:
+ Factory();
+ Factory(const Factory&) = delete;
+ Factory& operator=(const Factory&) = delete;
+ ~Factory() override;
+
+ // SelectFileDialogFactory:
+ ui::SelectFileDialog* Create(
+ ui::SelectFileDialog::Listener* listener,
+ std::unique_ptr<ui::SelectFilePolicy> policy) override;
+ };
+
+ SelectFileDialogLacros(Listener* listener,
+ std::unique_ptr<SelectFilePolicy> policy);
+ SelectFileDialogLacros(const SelectFileDialogLacros&) = delete;
+ SelectFileDialogLacros& operator=(const SelectFileDialogLacros&) = delete;
+
+ // SelectFileDialog:
+ void SelectFileImpl(Type type,
+ const base::string16& title,
+ const base::FilePath& default_path,
+ const FileTypeInfo* file_types,
+ int file_type_index,
+ const base::FilePath::StringType& default_extension,
+ gfx::NativeWindow owning_window,
+ void* params) override;
+ bool HasMultipleFileTypeChoicesImpl() override;
+ bool IsRunning(gfx::NativeWindow owning_window) const override;
+ void ListenerDestroyed() override {}
+
+ private:
+ // Private because SelectFileDialog is ref-counted.
+ ~SelectFileDialogLacros() override;
+
+ // Calls the listener's cancel method with |params|.
+ void Cancel(void* params);
+};
+
+} // namespace ui
+
+#endif // UI_SHELL_DIALOGS_SELECT_FILE_DIALOG_LACROS_H_
diff --git a/chromium/ui/shell_dialogs/select_file_dialog_mac.mm b/chromium/ui/shell_dialogs/select_file_dialog_mac.mm
index 1b48a3a0be3..9b16bab3b3b 100644
--- a/chromium/ui/shell_dialogs/select_file_dialog_mac.mm
+++ b/chromium/ui/shell_dialogs/select_file_dialog_mac.mm
@@ -37,7 +37,7 @@ bool SelectFileDialogImpl::IsRunning(gfx::NativeWindow parent_window) const {
}
void SelectFileDialogImpl::ListenerDestroyed() {
- listener_ = NULL;
+ listener_ = nullptr;
}
void SelectFileDialogImpl::FileWasSelected(
diff --git a/chromium/ui/shell_dialogs/select_file_dialog_win.cc b/chromium/ui/shell_dialogs/select_file_dialog_win.cc
index e85d95fc680..2ea1f94ad3b 100644
--- a/chromium/ui/shell_dialogs/select_file_dialog_win.cc
+++ b/chromium/ui/shell_dialogs/select_file_dialog_win.cc
@@ -41,9 +41,10 @@ bool GetRegistryDescriptionFromExtension(const base::string16& file_ext,
DCHECK(reg_description);
base::win::RegKey reg_ext(HKEY_CLASSES_ROOT, file_ext.c_str(), KEY_READ);
base::string16 reg_app;
- if (reg_ext.ReadValue(NULL, &reg_app) == ERROR_SUCCESS && !reg_app.empty()) {
+ if (reg_ext.ReadValue(nullptr, &reg_app) == ERROR_SUCCESS &&
+ !reg_app.empty()) {
base::win::RegKey reg_link(HKEY_CLASSES_ROOT, reg_app.c_str(), KEY_READ);
- if (reg_link.ReadValue(NULL, reg_description) == ERROR_SUCCESS)
+ if (reg_link.ReadValue(nullptr, reg_description) == ERROR_SUCCESS)
return true;
}
return false;
@@ -234,7 +235,7 @@ void SelectFileDialogImpl::SelectFileImpl(
std::vector<FileFilterSpec> filter = GetFilterForFileTypes(file_types);
HWND owner = owning_window && owning_window->GetRootWindow()
? owning_window->GetHost()->GetAcceleratedWidget()
- : NULL;
+ : nullptr;
std::unique_ptr<RunState> run_state = BeginRun(owner);
@@ -264,7 +265,7 @@ bool SelectFileDialogImpl::IsRunning(gfx::NativeWindow owning_window) const {
void SelectFileDialogImpl::ListenerDestroyed() {
// Our associated listener has gone away, so we shouldn't call back to it if
// our worker thread returns after the listener is dead.
- listener_ = NULL;
+ listener_ = nullptr;
}
void SelectFileDialogImpl::OnSelectFileExecuted(
diff --git a/chromium/ui/snapshot/snapshot_aura.cc b/chromium/ui/snapshot/snapshot_aura.cc
index 38d18b2a86e..d5709d30d3d 100644
--- a/chromium/ui/snapshot/snapshot_aura.cc
+++ b/chromium/ui/snapshot/snapshot_aura.cc
@@ -10,6 +10,7 @@
#include "base/bind.h"
#include "base/callback.h"
#include "base/task_runner_util.h"
+#include "base/threading/sequenced_task_runner_handle.h"
#include "components/viz/common/frame_sinks/copy_output_request.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/aura/window.h"
@@ -37,6 +38,8 @@ static void MakeAsyncCopyRequest(
viz::CopyOutputRequest::ResultFormat::RGBA_BITMAP,
std::move(callback));
request->set_area(source_rect);
+ request->set_result_task_runner(
+ base::SequencedTaskRunnerHandle::Get());
layer->RequestCopyOfOutput(std::move(request));
}
diff --git a/chromium/ui/strings/translations/ui_strings_af.xtb b/chromium/ui/strings/translations/ui_strings_af.xtb
index 9a9550186f7..62da5987a30 100644
--- a/chromium/ui/strings/translations/ui_strings_af.xtb
+++ b/chromium/ui/strings/translations/ui_strings_af.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibrering is voltooi</translation>
<translation id="252373100621549798">Onbekende skerm</translation>
<translation id="2545651323591713692">Sluimer</translation>
+<translation id="2570734079541893434">Bestuur instellings</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{oor 1 u.}other{oor # u.}}</translation>
<translation id="2583543531130364912">Kalibreer jou raakskerm</translation>
<translation id="2666092431469916601">Top</translation>
<translation id="2701330563083355633">Gedeel vanaf <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Nuut</translation>
<translation id="2743387203779672305">Kopieer na knipbord</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Maak vouer oop</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emosiekone en simbole</translation>
<translation id="5476505524087279545">ontmerk</translation>
<translation id="547979256943495781">Rak aan regterkant</translation>
+<translation id="5528053674512161860">Bladsy kon nie laai nie omdat die ontwikkelaar-UI-modus (dev_ui) nie geïnstalleer is nie</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" />-stelsel</translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Linkerpyltjie</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Maak toe</translation>
<translation id="6119846243427417423">aktiveer</translation>
<translation id="6129953537138746214">Spasie</translation>
+<translation id="6134259848159370930">Deursoek jou toestel, programme en die web.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Brei uit na alle programme</translation>
<translation id="6165508094623778733">Kom meer te wete</translation>
+<translation id="6166852626429024716">Deursoek jou toestel, programme, instellings en die web …</translation>
<translation id="6264365405983206840">Kies alles</translation>
<translation id="6351032674660237738">PROGRAMVOORSTELLE</translation>
<translation id="6364916375976753737">Rollees na links</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 min. oor}other{# min. oor}}</translation>
<translation id="7319740667687257810">Lanseerder, gedeeltelike aansig</translation>
-<translation id="7352651011704765696">Iets het verkeerd geloop</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 min. gelede}other{# min. gelede}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 minuut oor}other{# minute oor}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Is geskuif na Bladsy <ph name="PAGE_NUMBER" />, ry <ph name="ROW_NUMBER" />, kolom <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Moenie blokkeer nie</translation>
<translation id="7907591526440419938">Maak lêer oop</translation>
+<translation id="7952747673138230804">Chrome-bedryfstelsel wys voorstelle vir nuwe inhoud om te verken. Stuur net statistieke om gehalte beter te maak as jy gekies het om gebruiksdata te deel. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Meer as 1 ongelese kennisgewing}other{Meer as # ongelese kennisgewings}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{oor 1 m.}other{oor # m.}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Lêer (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Rak word altyd gewys</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Deursoek jou toestel, programme, instellings en die web. Gebruik die pylsleutels om deur jou programme te navigeer.</translation>
<translation id="8725488761726303204">+nog <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Gedoen</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 u.}other{# u.}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_am.xtb b/chromium/ui/strings/translations/ui_strings_am.xtb
index 06c30e45540..f6f6635df42 100644
--- a/chromium/ui/strings/translations/ui_strings_am.xtb
+++ b/chromium/ui/strings/translations/ui_strings_am.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">ልኬት ማስተካከል ተጠናቅቋል</translation>
<translation id="252373100621549798">ያልታወቀ ማሳያ</translation>
<translation id="2545651323591713692">አሸልብ</translation>
+<translation id="2570734079541893434">ቅንብሮችን ያቀናብሩ</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{በ 1ሰ ውስጥ}one{በ #ሰ ውስጥ}other{በ #ሰ ውስጥ}}</translation>
<translation id="2583543531130364912">የእርስዎን ማያንካ ልኬት ያስተካክሉ</translation>
<translation id="2666092431469916601">ላይ</translation>
<translation id="2701330563083355633">በ <ph name="DEVICE_NAME" /> የተጋራ</translation>
+<translation id="271033894570825754">አዲስ</translation>
<translation id="2743387203779672305">ወደ ቅንጥብ ሰሌዳ ገልብጥ</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />፣ <ph name="PRICE" /></translation>
<translation id="2803313416453193357">አቃፊ ክፈት</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">ስሜት ገላጭ ምስሎች እና ምልክቶች</translation>
<translation id="5476505524087279545">አታመልክት</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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">ዝጋ</translation>
<translation id="6119846243427417423">አንቃ</translation>
<translation id="6129953537138746214">ባዶ ቦታ</translation>
+<translation id="6134259848159370930">የእርስዎን መሣሪያ፣ መተግበሪያዎች፣ ቅንብሮች እና ድር ይፈልጉ።</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> ባ/ሰ</translation>
<translation id="6156262341071374681">ወደ ሁሉም መተግበሪያዎች ዘርጋ</translation>
<translation id="6165508094623778733">የበለጠ ለመረዳት</translation>
+<translation id="6166852626429024716">የእርስዎን መሣሪያ፣ መተግበሪያዎች፣ ቅንብሮች፣ ድር ይፈልጉ...</translation>
<translation id="6264365405983206840">&amp;ሁሉንም ምረጥ</translation>
<translation id="6351032674660237738">የመተግበሪያ አስተያየት ጥቆማዎች</translation>
<translation id="6364916375976753737">ወደ ግራ ሸብልል</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 ደቂቃ ቀርቷል}one{# ደቂቃዎች ቀርቷል}other{# ደቂቃዎች ቀርተዋል}}</translation>
<translation id="7319740667687257810">ማስጀመሪያ፣ ከፊል እይታ</translation>
-<translation id="7352651011704765696">የሆነ ችግር ተፈጥሯል</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 ደቂቃ በፊት}one{# ደቂቃዎች በፊት}other{# ደቂቃዎች በፊት}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 ደቂቃ ቀርቷል}one{# ደቂቃዎች ቀርቷል}other{# ደቂቃዎች ቀርተዋል}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">ወደ ገጽ <ph name="PAGE_NUMBER" />፣ ረድፍ <ph name="ROW_NUMBER" />፣ ዓምድ <ph name="COLUMN_NUMBER" /> ተንቀሳቅሷል።</translation>
<translation id="7879499977785298635">አታግድ</translation>
<translation id="7907591526440419938">ፋይል ክፈት</translation>
+<translation id="7952747673138230804">Chrome OS አዲስ የሚታሰሱ የይዘት አስተያየት ጥቆማዎችን ያሳያል። የአጠቃቀም ውሂብን ለማጋራት ከመረጡ ብቻ የአስተያየት ጥቆማዎችን ለማሻሻል ስታትስቲክስን ይልካል። <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">ትእዛዝ</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{ከ1 በላይ ያልተነበበ ማሳወቂያ}one{ከ# በላይ ያልተነበበቡ ማሳወቂያዎች}other{ከ# በላይ ያልተነበበቡ ማሳወቂያዎች}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{በ 1ደ ውስጥ}one{በ #ደ ውስጥ}other{በ #ደ ውስጥ}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ፋይል(.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">መደርደሪያ ሁልጊዜ ይታያል</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> ኪባ/ሰ</translation>
+<translation id="8685326675965865247">የእርስዎን መሣሪያ፣ መተግበሪያዎች እና ድርን ይፈልጉ። በእርስዎ መተግበሪያዎች መካከል አሰሳ ለማድረግ የቀስት ቁልፎቹን ይጠቀሙ።</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> ተጨማሪ</translation>
<translation id="8730621377337864115">ተከናውኗል</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1ሰ}one{#ሰ}other{#ሰ}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ar.xtb b/chromium/ui/strings/translations/ui_strings_ar.xtb
index 5b6cf00971e..7e276400199 100644
--- a/chromium/ui/strings/translations/ui_strings_ar.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ar.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">اكتملت المعايرة</translation>
<translation id="252373100621549798">شاشة عرض غير معروفة</translation>
<translation id="2545651323591713692">تأجيل</translation>
+<translation id="2570734079541893434">إدارة الإعدادات</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{خلال ساعة واحدة}zero{خلال # ساعة}two{خلال ساعتين (#)}few{خلال # ساعات}many{خلال # ساعة}other{خلال # ساعة}}</translation>
<translation id="2583543531130364912">معايرة الشاشة التي تعمل باللمس</translation>
<translation id="2666092431469916601">أعلى</translation>
<translation id="2701330563083355633">تمت المشاركة من <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">جديدة</translation>
<translation id="2743387203779672305">نسخ إلى الحافظة</translation>
<translation id="2749082172777216925">التطبيق <ph name="APP_NAME_INFO" />، <ph name="PRICE" /></translation>
<translation id="2803313416453193357">فتح المجلد</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">الرموز التعبيرية والرموز</translation>
<translation id="5476505524087279545">إزالة علامة الاختيار</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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">إغلاق</translation>
<translation id="6119846243427417423">تفعيل</translation>
<translation id="6129953537138746214">مسافة</translation>
+<translation id="6134259848159370930">يمكنك البحث في الجهاز والتطبيقات والإعدادات والويب.</translation>
<translation id="6135826906199951471">‏مفتاح Del (حذف)</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> بايت/ثانية</translation>
<translation id="6156262341071374681">التوسيع لعرض كل التطبيقات</translation>
<translation id="6165508094623778733">مزيد من المعلومات</translation>
+<translation id="6166852626429024716">البحث في الجهاز والتطبيقات والإعدادات والويب...</translation>
<translation id="6264365405983206840">تحديد &amp;الكل</translation>
<translation id="6351032674660237738">اقتراحات التطبيقات</translation>
<translation id="6364916375976753737">التمرير إلى اليمين</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{يتبقى دقيقة واحدة}zero{يتبقى # من الدقائق}two{يتبقى دقيقتان (#)}few{يتبقى # دقائق}many{يتبقى # دقيقة}other{يتبقى # من الدقائق}}</translation>
<translation id="7319740667687257810">‏Launcher، عرض جزئي</translation>
-<translation id="7352651011704765696">حدث خطأ ما</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{قبل دقيقة واحدة}zero{قبل # من الدقاق}two{قبل دقيقتين (#)}few{قبل # دقائق}many{قبل # دقيقة}other{قبل # من الدقائق}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{يتبقى دقيقة واحدة}zero{يتبقى # من الدقائق}two{يتبقى دقيقتان (#)}few{يتبقى # دقائق}many{يتبقى # دقيقة}other{يتبقى # من الدقائق}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">تم الانتقال إلى الصفحة رقم <ph name="PAGE_NUMBER" />، الصف رقم <ph name="ROW_NUMBER" /> والعمود رقم <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">عدم الحظر</translation>
<translation id="7907591526440419938">فتح ملف</translation>
+<translation id="7952747673138230804">‏يعرِض "نظام التشغيل Chrome" اقتراحات لاستكشاف محتوى جديد. ولا يُرسِل إحصاءات لتحسين المحتوى المُقترح إلا إذا اختَرت مشاركة بيانات الاستخدام. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{أكثر من إشعار واحد غير مقروء}zero{أكثر من # إشعار غير مقروء}two{أكثر من إشعارين غير مقروءين (#)}few{أكثر من # إشعارات غير مقروءة}many{أكثر من # إشعارًا غير مقروء}other{أكثر من # إشعار غير مقروء}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{خلال دقيقة واحدة}zero{خلال # دقيقة}two{خلال دقيقتين (#)}few{خلال # دقائق}many{خلال # دقيقة}other{خلال # دقيقة}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">ملف <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">إظهار الرف دائمًا</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> كيلوبايت/ثانية</translation>
+<translation id="8685326675965865247">يمكنك البحث في جهازك والتطبيقات والإعدادات والويب. ويمكنك استخادم مفاتيح الأسهم للتنقُّل بين تطبيقاتك.</translation>
<translation id="8725488761726303204"><ph name="NUMBER" />+ أخرى</translation>
<translation id="8730621377337864115">تم</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{ساعة واحدة}zero{# ساعة}two{ساعتان (#)}few{# ساعات}many{# ساعةً}other{# ساعة}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_as.xtb b/chromium/ui/strings/translations/ui_strings_as.xtb
index 4ad11b378a9..1415e565576 100644
--- a/chromium/ui/strings/translations/ui_strings_as.xtb
+++ b/chromium/ui/strings/translations/ui_strings_as.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">কেলিব্ৰে’শ্বন সম্পূৰ্ণ হ’ল</translation>
<translation id="252373100621549798">অজ্ঞাত ডিছপ্লে’</translation>
<translation id="2545651323591713692">স্নুজ কৰক</translation>
+<translation id="2570734079541893434">ছেটিংসমূহ পৰিচালনা কৰক</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{১ ঘণ্টাত}one{# ঘণ্টাত}other{# ঘণ্টাত}}</translation>
<translation id="2583543531130364912">আপোনাৰ টাচ্চ স্ক্ৰীণ কেলিব্ৰেট কৰক</translation>
<translation id="2666092431469916601">শীর্ষ</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" />ৰ পৰা শ্বেয়াৰ কৰা হৈছে</translation>
+<translation id="271033894570825754">নতুন</translation>
<translation id="2743387203779672305">ক্লিপব'ৰ্ডত প্ৰতিলিপি কৰক</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">ফ'ল্ডাৰ খোলক</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">ইম’জি &amp;&amp; চিহ্ন</translation>
<translation id="5476505524087279545">আনচ্চেক কৰক</translation>
<translation id="547979256943495781">শ্বেল্ফ সোঁফালে আছে</translation>
+<translation id="5528053674512161860">বিকাশকর্তাৰ UI মডিউলটো (dev_ui) ইনষ্টল কৰা নাই বাবে পৃষ্ঠাখন ল'ড হোৱাত বিফল হ'ল</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> ছিষ্টেম</translation>
<translation id="5583640892426849032">বেকস্পেচ</translation>
<translation id="5613020302032141669">বাওঁমুৱা কাঁড়</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">বন্ধ কৰক</translation>
<translation id="6119846243427417423">সক্ৰিয় কৰক</translation>
<translation id="6129953537138746214">স্পেচ</translation>
+<translation id="6134259848159370930">আপোনাৰ ডিভাইচ, এপ্‌, ছেটিংসমূহ আৰু ৱেব সন্ধান কৰক।</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">সূচীখন সকলো এপ্‌ দেখুৱাকৈ বিস্তাৰ কৰক</translation>
<translation id="6165508094623778733">অধিক জানক</translation>
+<translation id="6166852626429024716">আপোনাৰ ডিভাইচ, এপ্‌, ছেটিংসমূহ, ৱেব সন্ধান কৰক...</translation>
<translation id="6264365405983206840">&amp;সকলো বাছনি কৰক</translation>
<translation id="6351032674660237738">এপৰ পৰামৰ্শ</translation>
<translation id="6364916375976753737">বাওঁফাললৈ স্ক্ৰ’ল কৰক</translation>
@@ -191,7 +196,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{১ মিনিট বাকী আছে}one{# মিনিট বাকী আছে}other{# মিনিট বাকী আছে}}</translation>
<translation id="7319740667687257810">লঞ্চাৰ, আংশিক ভিউ</translation>
-<translation id="7352651011704765696">কিবা সমস্যা হৈছে</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{১মিনিট পূৰ্বে}one{#মিনিট পূৰ্বে}other{#মিনিট পূৰ্বে}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{১ মিনিট বাকী আছে}one{# মিনিট বাকী আছে}other{# মিনিট বাকী আছে}}</translation>
@@ -204,6 +208,7 @@
<translation id="7848989271541991537">পৃষ্ঠা <ph name="PAGE_NUMBER" />, শাৰী <ph name="ROW_NUMBER" />, স্তম্ভ <ph name="COLUMN_NUMBER" />লৈ স্থানান্তৰ কৰা হৈছে।</translation>
<translation id="7879499977785298635">অৱৰোধ নকৰিব</translation>
<translation id="7907591526440419938">ফাইল খোলক</translation>
+<translation id="7952747673138230804">Chrome OSএ অন্বেষণ কৰিবৰ বাবে নতুন সমলৰ পৰামৰ্শ দিয়ে। আপুনি ব্যৱহাৰৰ ডেটা শ্বেয়াৰ কৰিবলৈ বাছনি কৰিলেহে পৰামৰ্শিত সমলৰ গুণাগুণ উন্নত কৰিবলৈ পৰিসংখ্যা পঠিয়ায়। <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">নিৰ্দেশনা</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{১টাতকৈ অধিক নপঢ়া জাননী}one{#টাতকৈ অধিক নপঢ়া জাননী}other{#টাতকৈ অধিক নপঢ়া জাননী}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{১ মিনিটত}one{# মিনিটত}other{# মিনিটত}}</translation>
@@ -229,6 +234,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ফাইল (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">শ্বেল্ফ সদায়েই দেখুওৱা হয়</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> কেবি/ছেকেণ্ড</translation>
+<translation id="8685326675965865247">আপোনাৰ ডিভাইচ, এপ্‌, ছেটিংসমূহ আৰু ৱেব সন্ধান কৰক। আপোনাৰ এপ্‌সমূহ নেভিগে’ট কৰিবলৈ এৰ’ কীসমূহ ব্যৱহাৰ কৰক।</translation>
<translation id="8725488761726303204">আৰু +<ph name="NUMBER" />টা</translation>
<translation id="8730621377337864115">হ’ল</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{১ঘ}one{#ঘ}other{#ঘ}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_az.xtb b/chromium/ui/strings/translations/ui_strings_az.xtb
index bd5dd78d368..6d7dbb99723 100644
--- a/chromium/ui/strings/translations/ui_strings_az.xtb
+++ b/chromium/ui/strings/translations/ui_strings_az.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibrləmə tamamlandı</translation>
<translation id="252373100621549798">Naməlum Displey</translation>
<translation id="2545651323591713692">Ertələyin</translation>
+<translation id="2570734079541893434">Ayarları idarə edin</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 saatda}other{# saatda}}</translation>
<translation id="2583543531130364912">Sensor ekranı kalibrləyin</translation>
<translation id="2666092431469916601">Yuxarı</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> adlı cihazdan paylaşıldı</translation>
+<translation id="271033894570825754">Yeni</translation>
<translation id="2743387203779672305">Buferə kopyalayın</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Qovluğu açın</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji və Simvollar</translation>
<translation id="5476505524087279545">qeydi qaldırın</translation>
<translation id="547979256943495781">Rəf sağdadır</translation>
+<translation id="5528053674512161860">Tərtibatçı UI modulu (dev_ui) quraşdırılmadığına görə səhifə yüklənmədi</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> sistemi</translation>
<translation id="5583640892426849032">Geri silmə</translation>
<translation id="5613020302032141669">Sol Ox</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Qapat</translation>
<translation id="6119846243427417423">aktivləşdirin</translation>
<translation id="6129953537138746214">Boşluq</translation>
+<translation id="6134259848159370930">Cihaz, tətbiqlər, ayarlar və vebdə axtarın.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Bütün tətbiqləri genişləndirin</translation>
<translation id="6165508094623778733">Ətraflı öyrənin</translation>
+<translation id="6166852626429024716">Cihaz, tətbiqlər, ayarlar, vebdə və s. axtarın</translation>
<translation id="6264365405983206840">Hamısını seçin</translation>
<translation id="6351032674660237738">TƏTBİQ TƏKLİFLƏRİ</translation>
<translation id="6364916375976753737">Sola Sürüşdürün</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 dəq qalıb}other{# dəq qalıb}}</translation>
<translation id="7319740667687257810">İşə salan, yarımçıq görüntü</translation>
-<translation id="7352651011704765696">Xəta oldu</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 dəq öncə}other{# dəqiqə öncə}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 dəqiqə qalıb}other{# dəqiqə qalıb}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Buraya köçürüldü: Səhifə <ph name="PAGE_NUMBER" />, sıra <ph name="ROW_NUMBER" />, sütun <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Bloklamayın</translation>
<translation id="7907591526440419938">Faylı Açın</translation>
+<translation id="7952747673138230804">Chrome ƏS yeni məzmun üçün təklifləri göstərir. Yalnız istifadə datasını paylaşmağı seçdiyiniz zaman keyfiyyəti yaxşılaşdırmaq üçün statistika göndərir. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{1-dən çox oxunmamış bildiriş}other{# ədəddən çox oxunmamış bildiriş}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 dəqiqədə}other{# dəqiqədə}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Fayl (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Rəf həmişə göstərilir</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Cihaz, tətbiqlər, ayarlar və vebdə axtarın. Tətbiqləri axtarmaq üçün ox düymələrindən istifadə edin.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> əlavə</translation>
<translation id="8730621377337864115">Tamamdır</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1saat}other{#saat}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_be.xtb b/chromium/ui/strings/translations/ui_strings_be.xtb
index 3105cb0f18b..467e6d4ac72 100644
--- a/chromium/ui/strings/translations/ui_strings_be.xtb
+++ b/chromium/ui/strings/translations/ui_strings_be.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Каліброўка завершана</translation>
<translation id="252373100621549798">Невядомы дысплэй</translation>
<translation id="2545651323591713692">Адкласці</translation>
+<translation id="2570734079541893434">Кіраваць наладамі</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{праз 1 гадз}one{праз # гадз}few{праз # гадз}many{праз # гадз}other{праз # гадз}}</translation>
<translation id="2583543531130364912">Адкалібруйце сэнсарны экран</translation>
<translation id="2666092431469916601">Зверху</translation>
<translation id="2701330563083355633">Абагулена з прылады <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Новае</translation>
<translation id="2743387203779672305">Скапіраваць у буфер абмену</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Адкрыць папку</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Эмодзі і сімвалы</translation>
<translation id="5476505524087279545">зняць птушку</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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Закрыць</translation>
<translation id="6119846243427417423">актываваць</translation>
<translation id="6129953537138746214">Прабел</translation>
+<translation id="6134259848159370930">Пошук на прыладзе, у праграмах, наладах і інтэрнэце.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> біт/с</translation>
<translation id="6156262341071374681">Разгарнуць да ўсіх праграм</translation>
<translation id="6165508094623778733">Даведацца больш</translation>
+<translation id="6166852626429024716">Пошук на прыладзе, у праграмах, наладах і інтэрнэце...</translation>
<translation id="6264365405983206840">Выбраць &amp;усё</translation>
<translation id="6351032674660237738">ПРАПАНОВЫ ПРАГРАМ</translation>
<translation id="6364916375976753737">Прагартаць улева</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Засталася 1 хв}one{Засталася # хв}few{Засталося # хв}many{Засталося # хв}other{Засталося # хв}}</translation>
<translation id="7319740667687257810">Панэль запуску, частковы рэжым</translation>
-<translation id="7352651011704765696">Нешта пайшло не так</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 хвіліну таму}one{# хвіліну таму}few{# хвіліны таму}many{# хвілін таму}other{# хвіліны таму}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Засталася 1 хвіліна}one{Засталася # хвіліна}few{Засталося # хвіліны}many{Засталося # хвілін}other{Засталося # хвіліны}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Перамешчана на старонку <ph name="PAGE_NUMBER" />, радок <ph name="ROW_NUMBER" />, слупок <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Не блакіраваць</translation>
<translation id="7907591526440419938">Адкрыць файл</translation>
+<translation id="7952747673138230804">Chrome OS паказвае прапановы для азнаямлення з новым змесцівам. Статыстыка для паляпшэння якасці прапаноў будзе адпраўляцца, толькі калі вы згадзіліся на абагульванне даных пра выкарыстанне. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Больш чым 1 непрачытанае апавяшчэнне}one{Больш чым # непрачытанае апавяшчэнне}few{Больш чым # непрачытаныя апавяшчэнні}many{Больш чым # непрачытаных апавяшчэнняў}other{Больш чым # непрачытанага апавяшчэння}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{праз 1 хв}one{праз # хв}few{праз # хв}many{праз # хв}other{праз # хв}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Файл <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Паліца заўсёды паказваецца</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> КБ/с</translation>
+<translation id="8685326675965865247">Пошук на прыладзе, у праграмах, наладах і інтэрнэце. Для пераходу паміж праграмамі выкарыстоўвайце клавішы са стрэлкамі.</translation>
<translation id="8725488761726303204">+ яшчэ <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Гатова</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1гадз}one{#гадз}few{#гадз}many{#гадз}other{#гадз}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_bg.xtb b/chromium/ui/strings/translations/ui_strings_bg.xtb
index aadf3339ae8..d70a6ba77b2 100644
--- a/chromium/ui/strings/translations/ui_strings_bg.xtb
+++ b/chromium/ui/strings/translations/ui_strings_bg.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Калибрирането завърши</translation>
<translation id="252373100621549798">Неизвестен дисплей</translation>
<translation id="2545651323591713692">Отлагане</translation>
+<translation id="2570734079541893434">Управление на настройките</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{след 1 ч}other{след # ч}}</translation>
<translation id="2583543531130364912">Калибриране на сензорния екран</translation>
<translation id="2666092431469916601">Най-горе</translation>
<translation id="2701330563083355633">Споделено от <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Създаване</translation>
<translation id="2743387203779672305">Копиране в буферната памет</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Отваряне на папката</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Емоджи и символи</translation>
<translation id="5476505524087279545">премахване на отметката</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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Затваряне</translation>
<translation id="6119846243427417423">активиране</translation>
<translation id="6129953537138746214">Интервал</translation>
+<translation id="6134259848159370930">Търсете в устройството, приложенията, настройките и мрежата.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> Б/сек</translation>
<translation id="6156262341071374681">Разгъване на списъка с всички приложения</translation>
<translation id="6165508094623778733">Научете повече</translation>
+<translation id="6166852626429024716">Търсете в устройството, приложенията, настройките и мрежата...</translation>
<translation id="6264365405983206840">Избиране на &amp;всички</translation>
<translation id="6351032674660237738">ПРЕДЛОЖЕНИЯ ЗА ПРИЛОЖЕНИЯ</translation>
<translation id="6364916375976753737">Превъртане наляво</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Остава 1 мин}other{Остават # мин}}</translation>
<translation id="7319740667687257810">Стартов панел, частичен изглед</translation>
-<translation id="7352651011704765696">Нещо се обърка</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Преди 1 мин}other{Преди # мин}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Остава 1 минута}other{Остават # минути}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Преместено на страница <ph name="PAGE_NUMBER" />, ред <ph name="ROW_NUMBER" />, колона <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Без блокиране</translation>
<translation id="7907591526440419938">Отваряне на файл</translation>
+<translation id="7952747673138230804">Chrome OS показва предложения за ново съдържание. Изпраща статистически данни, за да подобри качеството на предложенията, само ако сте избрали да споделяте данни за употребата. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Повече от 1 непрочетено известие}other{Повече от # непрочетени известия}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{след 1 м}other{след # м}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> файл (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Лавицата се показва винаги</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> КБ/сек</translation>
+<translation id="8685326675965865247">Търсете в устройството, приложенията, настройките и мрежата. Използвайте клавишите със стрелки, за да се придвижвате в приложенията.</translation>
<translation id="8725488761726303204">+ още <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Готово</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 ч}other{# ч}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_bn.xtb b/chromium/ui/strings/translations/ui_strings_bn.xtb
index 04b70eaa7d9..d906dea96bb 100644
--- a/chromium/ui/strings/translations/ui_strings_bn.xtb
+++ b/chromium/ui/strings/translations/ui_strings_bn.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">ক্রমাঙ্কন সম্পূর্ণ হয়েছে</translation>
<translation id="252373100621549798">অজানা প্রদর্শন</translation>
<translation id="2545651323591713692">স্নুজ করুন</translation>
+<translation id="2570734079541893434">সেটিংস ম্যানেজ করুন</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{১ ঘণ্টার মধ্যে}one{# ঘণ্টার মধ্যে}other{# ঘণ্টার মধ্যে}}</translation>
<translation id="2583543531130364912">আপনার টাচস্ক্রীন ক্যালিব্রেট করুন</translation>
<translation id="2666092431469916601">শীর্ষ</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> থেকে শেয়ার করা হয়েছে</translation>
+<translation id="271033894570825754">নতুন</translation>
<translation id="2743387203779672305">ক্লিপবোর্ডে কপি করুন</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">ফোল্ডার খুলুন</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">ইমোজি ও প্রতীকগুলি</translation>
<translation id="5476505524087279545">আনচেক</translation>
<translation id="547979256943495781">শেল্ফ ডান দিকে দেখানো হচ্ছে</translation>
+<translation id="5528053674512161860">পৃষ্ঠা লোড করা যায়নি কারণ UI মডিউল (dev_ui) ইনস্টল করা নেই</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> সিস্টেম</translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Left Arrow</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">বন্ধ</translation>
<translation id="6119846243427417423">সক্রিয় করুন</translation>
<translation id="6129953537138746214">ব্যবধান</translation>
+<translation id="6134259848159370930">আপনার ডিভাইস, অ্যাপ, সেটিংস এবং ওয়েবে সার্চ করুন।</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">সমস্ত অ্যাপ দেখুন</translation>
<translation id="6165508094623778733">আরও জানুন</translation>
+<translation id="6166852626429024716">আপনার ডিভাইস, অ্যাপ, সেটিংস, ওয়েবে সার্চ করুন...</translation>
<translation id="6264365405983206840">&amp;সকল বেছে নিন</translation>
<translation id="6351032674660237738">অ্যাপের প্রস্তাবনা</translation>
<translation id="6364916375976753737">বাঁ দিকে স্ক্রল করুন</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{১ মিনিট বাকি}one{# মিনিট বাকি}other{# মিনিট বাকি}}</translation>
<translation id="7319740667687257810">লঞ্চার, আংশিক দেখুন</translation>
-<translation id="7352651011704765696">কিছু সমস্যা হয়েছে</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{১ মিনিট পূর্বে}one{# মিনিট পূর্বে}other{# মিনিট পূর্বে}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{১ মিনিট বাকি}one{# মিনিট বাকি}other{# মিনিট বাকি}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537"><ph name="PAGE_NUMBER" /> নম্বর পৃষ্ঠার <ph name="ROW_NUMBER" /> নম্বর সারির <ph name="COLUMN_NUMBER" /> নম্বর কলামে সরানো হয়েছে।</translation>
<translation id="7879499977785298635">ব্লক করবেন না</translation>
<translation id="7907591526440419938">খোলা ফাইল</translation>
+<translation id="7952747673138230804">Chrome OS নতুন কন্টেন্ট দেখার সাজেশন দেয়। আপনি ব্যবহারের ডেটা শেয়ার করার বিকল্প বেছে নিলে তবেই এটি সাজেশন আরও উন্নত করার উদ্দেশ্যে পরিসংখ্যান পাঠায়। <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">কমান্ড</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{১টির বেশি অপঠিত বিজ্ঞপ্তি}one{#টির বেশি অপঠিত বিজ্ঞপ্তি}other{#টির বেশি অপঠিত বিজ্ঞপ্তি}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{১ মিনিটের মধ্যে}one{# মিনিটের মধ্যে}other{# মিনিটের মধ্যে}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ফাইল (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">শেল্ফ সবসময় দেখানো হয়</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> কেবি/সেকেণ্ড</translation>
+<translation id="8685326675965865247">আপনার ডিভাইস, অ্যাপ, সেটিংস এবং ওয়েবে সার্চ করুন। আপনার অ্যাপগুলি নেভিগেট করতে তীরচিহ্ন কী ব্যবহার করুন।</translation>
<translation id="8725488761726303204">আরও <ph name="NUMBER" />টি</translation>
<translation id="8730621377337864115">হয়ে গেছে</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{১ ঘণ্টা}one{# ঘণ্টা}other{# ঘণ্টা}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_bs.xtb b/chromium/ui/strings/translations/ui_strings_bs.xtb
index 985ced59676..9326f90bada 100644
--- a/chromium/ui/strings/translations/ui_strings_bs.xtb
+++ b/chromium/ui/strings/translations/ui_strings_bs.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibracija je završena</translation>
<translation id="252373100621549798">Nepoznati zaslon</translation>
<translation id="2545651323591713692">Odgodite</translation>
+<translation id="2570734079541893434">Upravljajte postavkama</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{za 1h}one{za # h}few{za # h}other{za # h}}</translation>
<translation id="2583543531130364912">Kalibrirajte dodirni ekran</translation>
<translation id="2666092431469916601">Gornji</translation>
<translation id="2701330563083355633">Dijeljeno s uređaja: <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Novo</translation>
<translation id="2743387203779672305">Kopiraj u međumemoriju</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Otvori folder</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji sličice i simboli</translation>
<translation id="5476505524087279545">uklonite oznaku</translation>
<translation id="547979256943495781">Polica je na desnoj strani</translation>
+<translation id="5528053674512161860">Učitavanje stranice nije uspjelo jer programerski UI modul (dev_ui) nije instaliran</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> sistem</translation>
<translation id="5583640892426849032">Tipka za brisanje</translation>
<translation id="5613020302032141669">Strelica ulijevo</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Zatvori</translation>
<translation id="6119846243427417423">aktiviraj</translation>
<translation id="6129953537138746214">Razmaknica</translation>
+<translation id="6134259848159370930">Pretražite uređaj, aplikacije, postavke i web.</translation>
<translation id="6135826906199951471">Izbr</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Proširite na sve aplikacije</translation>
<translation id="6165508094623778733">Saznajte više</translation>
+<translation id="6166852626429024716">Pretražite uređaj, aplikacije, postavke, web...</translation>
<translation id="6264365405983206840">Odaberi &amp;sve</translation>
<translation id="6351032674660237738">PRIJEDLOZI APLIKACIJA</translation>
<translation id="6364916375976753737">Pomakni se lijevo</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Ostala je još 1 min}one{Ostala je još # min}few{Ostale su još # min}other{Ostalo je još # min}}</translation>
<translation id="7319740667687257810">Pokretač, djelimični prikaz</translation>
-<translation id="7352651011704765696">Nešto nije uredu</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Prije 1 min}one{Prije # min}few{Prije # min}other{Prije # min}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Još 1 minuta}one{Još # minuta}few{Još # minute}other{Još # minuta}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Premješteno je na <ph name="PAGE_NUMBER" />. stranicu, <ph name="ROW_NUMBER" />. red, <ph name="COLUMN_NUMBER" />. kolonu.</translation>
<translation id="7879499977785298635">Nemoj blokirati</translation>
<translation id="7907591526440419938">Otvori fajl</translation>
+<translation id="7952747673138230804">Chrome OS prikazuje prijedloge novog sadržaja za istraživanje. Statistika se šalje radi poboljšanja kvaliteta isključivo ako ste odabrali da dijelite podatke o korištenju. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Komanda</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Više od 1 nepročitanog obavještenja}one{Više od # nepročitanog obavještenja}few{Više od # nepročitana obavještenja}other{Više od # nepročitanih obavještenja}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{za 1 m}one{za # m}few{za # m}other{za # m}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Fajl (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Polica se uvijek prikazuje</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Pretražite uređaj, aplikacije, postavke i web. Koristite tipke sa strelicama za kretanje kroz aplikacije.</translation>
<translation id="8725488761726303204">Još <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Gotovo</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}one{# h}few{# h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ca.xtb b/chromium/ui/strings/translations/ui_strings_ca.xtb
index 323446c182b..45b4857abff 100644
--- a/chromium/ui/strings/translations/ui_strings_ca.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ca.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">S'ha acabat de calibrar</translation>
<translation id="252373100621549798">Pantalla desconeguda</translation>
<translation id="2545651323591713692">Posposa</translation>
+<translation id="2570734079541893434">Gestiona la configuració</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{d'aquí a 1 h}other{d'aquí a # h}}</translation>
<translation id="2583543531130364912">Calibra la pantalla tàctil</translation>
<translation id="2666092431469916601">Superior</translation>
<translation id="2701330563083355633">S'ha compartit des del dispositiu <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Nou</translation>
<translation id="2743387203779672305">Copia al porta-retalls</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Obre la carpeta</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emojis i símbols</translation>
<translation id="5476505524087279545">desmarca</translation>
<translation id="547979256943495781">El prestatge és a la dreta</translation>
+<translation id="5528053674512161860">La càrrega de la pàgina ha fallat perquè el mòdul de la interfície d'usuari per a desenvolupadors (dev_ui) no està instal·lat.</translation>
<translation id="5574202486608032840">Sistema <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Retrocés</translation>
<translation id="5613020302032141669">Fletxa esquerra</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Tanca</translation>
<translation id="6119846243427417423">activa</translation>
<translation id="6129953537138746214">Espai</translation>
+<translation id="6134259848159370930">Cerca al dispositiu, en aplicacions, a la configuració i al web.</translation>
<translation id="6135826906199951471">Supr</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Amplia a totes les aplicacions</translation>
<translation id="6165508094623778733">Més informació</translation>
+<translation id="6166852626429024716">Cerca al dispositiu, en aplicacions, a la configuració i al web...</translation>
<translation id="6264365405983206840">Selecciona-ho &amp;tot</translation>
<translation id="6351032674660237738">SUGGERIMENTS D'APLICACIONS</translation>
<translation id="6364916375976753737">Desplaçament a l'esquerra</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 min restant}other{# min restants}}</translation>
<translation id="7319740667687257810">Menú d'aplicacions, visualització parcial</translation>
-<translation id="7352651011704765696">S'ha produït un error</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{fa 1 min}other{fa # min}}</translation>
<translation id="7389409599945284130">: <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 minut restant}other{# minuts restants}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">S'ha mogut a la pàgina <ph name="PAGE_NUMBER" />, fila <ph name="ROW_NUMBER" />, columna <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">No bloquegis</translation>
<translation id="7907591526440419938">Obre un fitxer</translation>
+<translation id="7952747673138230804">Chrome OS mostra suggeriments de contingut nou per explorar. Només envia les estadístiques per millorar la qualitat si has triat compartir les dades d'ús. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Ordre</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Més d'una notificació no llegida}other{Més de # notificacions no llegides}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{d'aquí a 1 min}other{d'aquí a # min}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Fitxer <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">El prestatge es mostra sempre</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Fes cerques al dispositiu, en aplicacions, a la configuració i al web. Fes servir les tecles de fletxa per navegar per les aplicacions.</translation>
<translation id="8725488761726303204">i <ph name="NUMBER" /> més</translation>
<translation id="8730621377337864115">Fet</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_cs.xtb b/chromium/ui/strings/translations/ui_strings_cs.xtb
index 40476f83f4a..f4e3da81a7c 100644
--- a/chromium/ui/strings/translations/ui_strings_cs.xtb
+++ b/chromium/ui/strings/translations/ui_strings_cs.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibrace je dokončena</translation>
<translation id="252373100621549798">Neznámý displej</translation>
<translation id="2545651323591713692">Odložit</translation>
+<translation id="2570734079541893434">Spravovat nastavení</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{za 1 h}few{za # h}many{za # h}other{za # h}}</translation>
<translation id="2583543531130364912">Zkalibrujte dotykovou obrazovku</translation>
<translation id="2666092431469916601">Nahoru</translation>
<translation id="2701330563083355633">Sdíleno ze zařízení <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Nové</translation>
<translation id="2743387203779672305">Zkopírovat do schránky</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Otevřít složku</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emodži a symboly</translation>
<translation id="5476505524087279545">odstranit zaškrtnutí</translation>
<translation id="547979256943495781">Polička vpravo</translation>
+<translation id="5528053674512161860">Načtení stránky se nezdařilo, protože není nainstalovaný modul uživatelského rozhraní pro vývojáře (dev_ui)</translation>
<translation id="5574202486608032840">Systém <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Klávesa šipka vlevo</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Zavřít</translation>
<translation id="6119846243427417423">aktivovat</translation>
<translation id="6129953537138746214">Mezera</translation>
+<translation id="6134259848159370930">Prohledejte zařízení, aplikace, nastavení a internet.</translation>
<translation id="6135826906199951471">Klávesa Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Rozšířit na všechny aplikace</translation>
<translation id="6165508094623778733">Další informace</translation>
+<translation id="6166852626429024716">Prohledejte zařízení, aplikace, nastavení, internet…</translation>
<translation id="6264365405983206840">Vybr&amp;at vše</translation>
<translation id="6351032674660237738">NÁVRHY APLIKACÍ</translation>
<translation id="6364916375976753737">Posuv doleva</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Zbývá 1 min}few{Zbývají # min}many{Zbývá # min}other{Zbývá # min}}</translation>
<translation id="7319740667687257810">Spouštěč, částečné zobrazení</translation>
-<translation id="7352651011704765696">Něco se pokazilo</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Před 1 min}few{Před # min}many{Před # min}other{Před # min}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Zbývá 1 minuta}few{Zbývají # minuty}many{Zbývá # minuty}other{Zbývá # minut}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Přesunuto na stránku <ph name="PAGE_NUMBER" />, řádek <ph name="ROW_NUMBER" />, sloupec <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Neblokovat</translation>
<translation id="7907591526440419938">Otevřít soubor</translation>
+<translation id="7952747673138230804">Chrome OS zobrazuje návrhy nového obsahu k prozkoumání. Statistiky k vylepšení kvality se odesílají, pouze pokud jste povolili sdílení údajů o využití. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Víc než 1 nepřečtené oznámení}few{Víc než # nepřečtená oznámení}many{Víc než # nepřečteného oznámení}other{Víc než # nepřečtených oznámení}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{za 1 min}few{za # min}many{za # min}other{za # min}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Soubor <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Polička se vždy zobrazuje</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> kB/s</translation>
+<translation id="8685326675965865247">Prohledejte zařízení, aplikace, nastavení a internet. Mezi aplikacemi se můžete pohybovat pomocí kláves.</translation>
<translation id="8725488761726303204">a ještě <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Hotovo</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}few{# h}many{# h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_da.xtb b/chromium/ui/strings/translations/ui_strings_da.xtb
index 40441af95ba..5d947bb43a0 100644
--- a/chromium/ui/strings/translations/ui_strings_da.xtb
+++ b/chromium/ui/strings/translations/ui_strings_da.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibreringen er fuldført</translation>
<translation id="252373100621549798">Ukendt skærm</translation>
<translation id="2545651323591713692">Udsæt</translation>
+<translation id="2570734079541893434">Administrer indstillinger</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{om 1 t.}one{om # t.}other{om # t.}}</translation>
<translation id="2583543531130364912">Kalibrer din touchskærm</translation>
<translation id="2666092431469916601">Top</translation>
<translation id="2701330563083355633">Delt fra <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Nyt</translation>
<translation id="2743387203779672305">Kopiér til udklipsholderen</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Åbn mappe</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emojis og symboler</translation>
<translation id="5476505524087279545">fjern markering</translation>
<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="5613020302032141669">Venstrepil</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Luk</translation>
<translation id="6119846243427417423">aktivér</translation>
<translation id="6129953537138746214">Mellemrum</translation>
+<translation id="6134259848159370930">Søg på din enhed, i dine apps, i indstillingerne og på nettet.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/sek.</translation>
<translation id="6156262341071374681">Vis alle apps</translation>
<translation id="6165508094623778733">Flere oplysninger</translation>
+<translation id="6166852626429024716">Søg på din enhed, i dine apps, i indstillingerne, på nettet...</translation>
<translation id="6264365405983206840">Vælg &amp;alle</translation>
<translation id="6351032674660237738">APPFORSLAG</translation>
<translation id="6364916375976753737">Scroll Left</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 min. tilbage}one{# min. tilbage}other{# min. tilbage}}</translation>
<translation id="7319740667687257810">Appliste, delvis visning</translation>
-<translation id="7352651011704765696">Der opstod en fejl</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{for 1 min. siden}one{for # min. siden}other{for # min. siden}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 minut tilbage}one{# minutter tilbage}other{# minutter tilbage}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Flyttet til side <ph name="PAGE_NUMBER" />, række <ph name="ROW_NUMBER" />, kolonne <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Bloker ikke</translation>
<translation id="7907591526440419938">Åbn fil</translation>
+<translation id="7952747673138230804">Chrome OS viser forslag til nyt indhold, du kan tjekke ud. Der sendes kun statistik til forbedring af forslag, hvis du har valgt at dele dine brugsdata. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Kommando</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Der er mere end 1 ulæst notifikation}one{Der er mere end # ulæst notifikation}other{Der er mere end # ulæste notifikationer}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{om 1 min}one{om # min}other{om # min}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Fil (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Hylden vises altid</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> kB/sek.</translation>
+<translation id="8685326675965865247">Søg på din enhed, i dine apps, i indstillingerne og på nettet. Brug piletasterne til at navigere i dine apps.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> mere</translation>
<translation id="8730621377337864115">Udfør</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 t}one{# t}other{# t}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_de.xtb b/chromium/ui/strings/translations/ui_strings_de.xtb
index e1b4b988535..d478a9a902d 100644
--- a/chromium/ui/strings/translations/ui_strings_de.xtb
+++ b/chromium/ui/strings/translations/ui_strings_de.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Die Kalibrierung ist abgeschlossen</translation>
<translation id="252373100621549798">Display unbekannt</translation>
<translation id="2545651323591713692">Erneut erinnern</translation>
+<translation id="2570734079541893434">Einstellungen verwalten</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{in 1 h}other{in # h}}</translation>
<translation id="2583543531130364912">Touchscreen kalibrieren</translation>
<translation id="2666092431469916601">Oben</translation>
<translation id="2701330563083355633">Geteilt von <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Neu</translation>
<translation id="2743387203779672305">In Zwischenablage kopieren</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Ordner öffnen</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emojis &amp;&amp; Symbole</translation>
<translation id="5476505524087279545">Auswahl aufheben</translation>
<translation id="547979256943495781">Ablage rechts</translation>
+<translation id="5528053674512161860">Seitenaufbau fehlgeschlagen: Entwickler-UI-Modul (dev_ui) ist nicht installiert</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" />-System</translation>
<translation id="5583640892426849032">Rücktaste</translation>
<translation id="5613020302032141669">Linkspfeil</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Schließen</translation>
<translation id="6119846243427417423">aktivieren</translation>
<translation id="6129953537138746214">Leertaste</translation>
+<translation id="6134259848159370930">Auf Ihrem Gerät, in Apps, Einstellungen und im Web suchen.</translation>
<translation id="6135826906199951471">Entf</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> Byte/s</translation>
<translation id="6156262341071374681">Maximieren und alle Apps anzeigen</translation>
<translation id="6165508094623778733">Weitere Informationen</translation>
+<translation id="6166852626429024716">Auf Ihrem Gerät, in Apps, Einstellungen oder im Web suchen…</translation>
<translation id="6264365405983206840">&amp;Alles auswählen</translation>
<translation id="6351032674660237738">APP-VORSCHLÄGE</translation>
<translation id="6364916375976753737">Nach links blättern</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 min übrig}other{# min übrig}}</translation>
<translation id="7319740667687257810">Übersicht, Teilansicht</translation>
-<translation id="7352651011704765696">Ein Problem ist aufgetreten.</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{vor 1 min}other{vor # min}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 Minute übrig}other{# Minuten übrig}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Auf Seite <ph name="PAGE_NUMBER" />, Zeile <ph name="ROW_NUMBER" />, Spalte <ph name="COLUMN_NUMBER" /> verschoben.</translation>
<translation id="7879499977785298635">Nicht blockieren</translation>
<translation id="7907591526440419938">Datei öffnen</translation>
+<translation id="7952747673138230804">Chrome OS zeigt Vorschläge zum Entdecken neuer Inhalte. Statistiken zur Verbesserung von Vorschlägen werden nur gesendet, wenn Sie der Freigabe von Nutzungsdaten zugestimmt haben. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Befehl</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Mehr als 1 ungelesene Benachrichtigung}other{Mehr als # ungelesene Benachrichtigungen}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{in 1 min}other{in # min}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" />-Datei (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Ablage immer eingeblendet</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Sie können auf Ihrem Gerät, in Ihren Apps und Einstellungen sowie im Web suchen. Gehen Sie mit den Pfeiltasten die entsprechenden Apps durch.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> weitere</translation>
<translation id="8730621377337864115">Fertig</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_el.xtb b/chromium/ui/strings/translations/ui_strings_el.xtb
index 301e7da5418..a523839b9a8 100644
--- a/chromium/ui/strings/translations/ui_strings_el.xtb
+++ b/chromium/ui/strings/translations/ui_strings_el.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Η βαθμονόμηση ολοκληρώθηκε</translation>
<translation id="252373100621549798">Άγνωστη οθόνη</translation>
<translation id="2545651323591713692">Αναβολή</translation>
+<translation id="2570734079541893434">Διαχείριση ρυθμίσεων</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{σε 1 ω.}other{σε # ω.}}</translation>
<translation id="2583543531130364912">Βαθμονόμηση οθόνης αφής</translation>
<translation id="2666092431469916601">Κορυφή</translation>
<translation id="2701330563083355633">Κοινοποιήθηκε από <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Νέο</translation>
<translation id="2743387203779672305">Αντιγραφή στο πρόχειρο</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Άνοιγμα φακέλου</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji και σύμβολα</translation>
<translation id="5476505524087279545">απενεργοποίηση</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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Κλείσιμο</translation>
<translation id="6119846243427417423">ενεργοποίηση</translation>
<translation id="6129953537138746214">Κενό</translation>
+<translation id="6134259848159370930">Κάντε αναζήτηση στη συσκευή, στις εφαρμογές, στις ρυθμίσεις και στον ιστό.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Επέκταση σε όλες τις εφαρμογές</translation>
<translation id="6165508094623778733">Μάθετε περισσότερα</translation>
+<translation id="6166852626429024716">Κάντε αναζήτηση στη συσκευή, στις εφαρμογές, στις ρυθμίσεις και στον ιστό…</translation>
<translation id="6264365405983206840">Επιλογή Όλ&amp;ων</translation>
<translation id="6351032674660237738">ΠΡΟΤΑΣΕΙΣ ΕΦΑΡΜΟΓΩΝ</translation>
<translation id="6364916375976753737">Κύλιση αριστερά</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Απομένει 1 λεπτό}other{Απομένουν # λεπτά}}</translation>
<translation id="7319740667687257810">Εφαρμογή εκκίνησης, μερική προβολή</translation>
-<translation id="7352651011704765696">Παρουσιάστηκε κάποιο πρόβλημα</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Πριν από 1 λεπτό}other{Πριν από # λεπτά}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Απομένει 1 λεπτό}other{Απομένουν # λεπτά}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Μετάβαση στη σελίδα <ph name="PAGE_NUMBER" />, σειρά <ph name="ROW_NUMBER" />, στήλη <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Να μην γίνει αποκλεισμός</translation>
<translation id="7907591526440419938">Άνοιγμα αρχείου</translation>
+<translation id="7952747673138230804">Το Chrome OS εμφανίζει προτάσεις για νέο περιεχόμενο για εξερεύνηση. Στέλνει στατιστικά στοιχεία για τη βελτίωση της ποιότητας, μόνο σε περίπτωση που έχετε επιλέξει να κοινοποιείτε δεδομένα χρήσης. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Πλήκτρο Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Περισσότερες από 1 μη αναγνωσμένες ειδοποιήσεις}other{Περισσότερες από # μη αναγνωσμένες ειδοποιήσεις}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{σε 1 λ.}other{σε # λ.}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Αρχείο <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Το ράφι είναι πάντα ορατό</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Κάντε αναζήτηση στη συσκευή, στις εφαρμογές, στις ρυθμίσεις και στον ιστό. Χρησιμοποιήστε τα πλήκτρα βέλους για πλοήγηση στις εφαρμογές σας.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> ακόμη</translation>
<translation id="8730621377337864115">Ολοκληρώθηκε</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1ώρ.}other{#ώρ.}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_en-GB.xtb b/chromium/ui/strings/translations/ui_strings_en-GB.xtb
index 1c42aad9603..8e98369cfb3 100644
--- a/chromium/ui/strings/translations/ui_strings_en-GB.xtb
+++ b/chromium/ui/strings/translations/ui_strings_en-GB.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Calibration is completed</translation>
<translation id="252373100621549798">Unknown Display</translation>
<translation id="2545651323591713692">Snooze</translation>
+<translation id="2570734079541893434">Manage settings</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{in 1 h}other{in # h}}</translation>
<translation id="2583543531130364912">Calibrate your touchscreen</translation>
<translation id="2666092431469916601">Top</translation>
<translation id="2701330563083355633">Shared from <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">New</translation>
<translation id="2743387203779672305">Copy to clipboard</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Open folder</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji &amp;&amp; Symbols</translation>
<translation id="5476505524087279545">untick</translation>
<translation id="547979256943495781">Shelf on right</translation>
+<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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Close</translation>
<translation id="6119846243427417423">activate</translation>
<translation id="6129953537138746214">Space</translation>
+<translation id="6134259848159370930">Search your device, apps, settings and web.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Expand to all apps</translation>
<translation id="6165508094623778733">Learn more</translation>
+<translation id="6166852626429024716">Search your device, apps, settings, web…</translation>
<translation id="6264365405983206840">Select &amp;All</translation>
<translation id="6351032674660237738">APP SUGGESTIONS</translation>
<translation id="6364916375976753737">Scroll Left</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 min left}other{# mins left}}</translation>
<translation id="7319740667687257810">Launcher, partial view</translation>
-<translation id="7352651011704765696">Something went wrong</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 min ago}other{# mins ago}}</translation>
<translation id="7389409599945284130"><ph name="MESSAGE" />..</translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 minute left}other{# minutes left}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Moved to page <ph name="PAGE_NUMBER" />, row <ph name="ROW_NUMBER" />, column <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Don't block</translation>
<translation id="7907591526440419938">Open File</translation>
+<translation id="7952747673138230804">Chrome OS shows suggestions for new content to explore. Sends statistics to improve quality only if you’ve chosen to share usage data. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{More than 1 unread notification}other{More than # unread notifications}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{in 1 m}other{in # m}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> File (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Shelf always shown</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Search your device, apps, settings and web. Use the arrow keys to navigate your apps.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> more</translation>
<translation id="8730621377337864115">Done</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1h}other{#h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_es-419.xtb b/chromium/ui/strings/translations/ui_strings_es-419.xtb
index 34546c73205..69cdba8bc87 100644
--- a/chromium/ui/strings/translations/ui_strings_es-419.xtb
+++ b/chromium/ui/strings/translations/ui_strings_es-419.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Se completó la calibración</translation>
<translation id="252373100621549798">Pantalla desconocida</translation>
<translation id="2545651323591713692">Posponer</translation>
+<translation id="2570734079541893434">Administrar configuración</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{en 1 h}other{en # h}}</translation>
<translation id="2583543531130364912">Calibrar la pantalla táctil</translation>
<translation id="2666092431469916601">Superior</translation>
<translation id="2701330563083355633">Se compartió de <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Nuevo</translation>
<translation id="2743387203779672305">Copiar al portapapeles</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Abrir carpeta</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji y símbolos</translation>
<translation id="5476505524087279545">desmarcar</translation>
<translation id="547979256943495781">Biblioteca a la derecha</translation>
+<translation id="5528053674512161860">No se pudo cargar la página porque el módulo de IU del desarrollador (dev_ui) no está instalado</translation>
<translation id="5574202486608032840">Sistema <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Tecla de retroceso</translation>
<translation id="5613020302032141669">Flecha izquierda</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Cerrar</translation>
<translation id="6119846243427417423">activar</translation>
<translation id="6129953537138746214">Espacio</translation>
+<translation id="6134259848159370930">Realiza búsquedas en tu dispositivo, apps, configuración y la Web.</translation>
<translation id="6135826906199951471">Supr</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Expande la lista a todas las apps</translation>
<translation id="6165508094623778733">Más información</translation>
+<translation id="6166852626429024716">Buscar en el dispositivo, en su configuración y apps, y en la Web…</translation>
<translation id="6264365405983206840">Seleccion&amp;ar todo</translation>
<translation id="6351032674660237738">SUGERENCIAS DE APPS</translation>
<translation id="6364916375976753737">Desplazar hacia la izquierda</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Falta 1 min.}other{Faltan # min.}}</translation>
<translation id="7319740667687257810">Launcher, vista parcial</translation>
-<translation id="7352651011704765696">Se produjo un error</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Hace 1 min.}other{Hace # min.}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Falta 1 minuto.}other{Faltan # minutos.}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Se movió a la página <ph name="PAGE_NUMBER" />, fila <ph name="ROW_NUMBER" />, columna <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">No bloquear</translation>
<translation id="7907591526440419938">Abrir archivo</translation>
+<translation id="7952747673138230804">El Sistema operativo Chrome muestra sugerencias para que explores nuevo contenido. Envía estadísticas para mejorar la calidad de las sugerencias solo si elegiste compartir los datos de uso. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Comando</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Más de 1 notificación sin leer}other{Más de # notificaciones sin leer}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{en 1 min}other{en # min}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Archivo (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">La biblioteca se muestra siempre</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Realiza búsquedas en el dispositivo, en su configuración y apps, y en la Web. Usa las flechas para navegar por las apps.</translation>
<translation id="8725488761726303204"><ph name="NUMBER" /> más</translation>
<translation id="8730621377337864115">Listo</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_es.xtb b/chromium/ui/strings/translations/ui_strings_es.xtb
index 28decd8b3bf..ff2b36457d0 100644
--- a/chromium/ui/strings/translations/ui_strings_es.xtb
+++ b/chromium/ui/strings/translations/ui_strings_es.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Se ha completado la calibración</translation>
<translation id="252373100621549798">Pantalla desconocida</translation>
<translation id="2545651323591713692">Posponer</translation>
+<translation id="2570734079541893434">Gestionar configuración</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{en 1 h.}other{en # h.}}</translation>
<translation id="2583543531130364912">Calibra la pantalla táctil</translation>
<translation id="2666092431469916601">Superior</translation>
<translation id="2701330563083355633">Compartido desde <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Nuevo</translation>
<translation id="2743387203779672305">Copiar en el portapapeles</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Abrir carpeta</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emojis y símbolos</translation>
<translation id="5476505524087279545">desmarcar</translation>
<translation id="547979256943495781">La estantería está en la parte derecha</translation>
+<translation id="5528053674512161860">No se ha podido cargar la página porque el módulo de interfaz de usuario del desarrollador (dev_ui) no está instalado</translation>
<translation id="5574202486608032840">Sistema <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Tecla de retroceso</translation>
<translation id="5613020302032141669">Flecha izquierda</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Cerrar</translation>
<translation id="6119846243427417423">activar</translation>
<translation id="6129953537138746214">Espacio</translation>
+<translation id="6134259848159370930">Busca en el dispositivo, en las aplicaciones, en los ajustes y en la Web.</translation>
<translation id="6135826906199951471">Supr</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Mostrar todas las aplicaciones</translation>
<translation id="6165508094623778733">Más información</translation>
+<translation id="6166852626429024716">Busca en el dispositivo, en las aplicaciones, en los ajustes, en la Web…</translation>
<translation id="6264365405983206840">Seleccionar &amp;todo</translation>
<translation id="6351032674660237738">SUGERENCIAS DE APLICACIONES</translation>
<translation id="6364916375976753737">Desplazar hacia la izquierda</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Queda 1 min}other{Quedan # min}}</translation>
<translation id="7319740667687257810">Menú de aplicaciones, vista parcial</translation>
-<translation id="7352651011704765696">Se ha producido un problema</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Hace 1 min}other{Hace # min}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Queda 1 minuto}other{Quedan # minutos}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Se ha movido a la página <ph name="PAGE_NUMBER" />, fila <ph name="ROW_NUMBER" />, columna <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">No bloquear</translation>
<translation id="7907591526440419938">Abrir archivo</translation>
+<translation id="7952747673138230804">Chrome OS muestra sugerencias sobre nuevos contenidos por descubrir. Envía estadísticas para mejorar la calidad solo si has elegido compartir datos de uso. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Comando</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Más de una 1 notificación no leída}other{Más de # notificaciones no leídas}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{en 1 min}other{en # min}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Archivo <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">La estantería se muestra siempre</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Busca en el dispositivo, en las aplicaciones, en los ajustes y en la Web. Usa las teclas de flecha para desplazarte por las aplicaciones.</translation>
<translation id="8725488761726303204"><ph name="NUMBER" /> más</translation>
<translation id="8730621377337864115">Listo</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_et.xtb b/chromium/ui/strings/translations/ui_strings_et.xtb
index fb176475f0d..e050c6d39e1 100644
--- a/chromium/ui/strings/translations/ui_strings_et.xtb
+++ b/chromium/ui/strings/translations/ui_strings_et.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibreerimine on lõpetatud</translation>
<translation id="252373100621549798">Tundmatu ekraan</translation>
<translation id="2545651323591713692">Edasilükkamine</translation>
+<translation id="2570734079541893434">Seadete haldamine</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 h pärast}other{# h pärast}}</translation>
<translation id="2583543531130364912">Kalibreerige puuteekraan</translation>
<translation id="2666092431469916601">Üles</translation>
<translation id="2701330563083355633">Jagas <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Uus</translation>
<translation id="2743387203779672305">Kopeeri lõikelauale</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Kausta avamine</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emotikonid ja sümbolid</translation>
<translation id="5476505524087279545">eemalda mrgistus</translation>
<translation id="547979256943495781">Riiul asub paremal</translation>
+<translation id="5528053674512161860">Lehe laadimine ebaõnnestus, kuna arendaja kasutajaliidese moodulit (dev_ui) pole installitud</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" />-i süsteem</translation>
<translation id="5583640892426849032">Tagasilükkeklahv</translation>
<translation id="5613020302032141669">Vasaknool</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Sulge</translation>
<translation id="6119846243427417423">aktiveeri</translation>
<translation id="6129953537138746214">Tühik</translation>
+<translation id="6134259848159370930">Otsige oma seadmest, rakendustest, seadetest ja veebist.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Laiendage kõikide rakenduste kuvamiseks</translation>
<translation id="6165508094623778733">Lisateave</translation>
+<translation id="6166852626429024716">Otsige oma seadmest, rakendustest, seadetest, veebist …</translation>
<translation id="6264365405983206840">Vali &amp;kõik</translation>
<translation id="6351032674660237738">RAKENDUSTE SOOVITUSED</translation>
<translation id="6364916375976753737">Keri vasakule</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 min on jäänud}other{# min on jäänud}}</translation>
<translation id="7319740667687257810">Käivitusprogramm, osaline vaade</translation>
-<translation id="7352651011704765696">Midagi läks valesti</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 min tagasi}other{# min tagasi}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 minut on jäänud}other{# minutit on jäänud}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Teisaldatud lehele <ph name="PAGE_NUMBER" />, reale <ph name="ROW_NUMBER" />, veergu <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Ära blokeeri</translation>
<translation id="7907591526440419938">Faili avamine</translation>
+<translation id="7952747673138230804">Chrome OS näitab soovitusi uue sisu kohta, mida avastada. Saadab kvaliteedi parandamiseks statistikat ainult siis, kui olete valinud kasutusandmete jagamise. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Käsuklahv</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Rohkem kui 1 lugemata märguanne}other{Rohkem kui # lugemata märguannet}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 min pärast}other{# min pärast}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Fail (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Riiul on alati kuvatud</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> kB/s</translation>
+<translation id="8685326675965865247">Otsige oma seadmest, rakendustest, seadetest ja veebist. Rakendustes navigeerimiseks kasutage nooleklahve.</translation>
<translation id="8725488761726303204">ja veel <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Valmis</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1h}other{#h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_eu.xtb b/chromium/ui/strings/translations/ui_strings_eu.xtb
index d2713304f4d..a9b7305b27c 100644
--- a/chromium/ui/strings/translations/ui_strings_eu.xtb
+++ b/chromium/ui/strings/translations/ui_strings_eu.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibratu da</translation>
<translation id="252373100621549798">Pantaila ezezaguna</translation>
<translation id="2545651323591713692">Atzeratu</translation>
+<translation id="2570734079541893434">Kudeatu ezarpenak</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 h barru}other{# h barru}}</translation>
<translation id="2583543531130364912">Kalibratu ukipen-pantaila</translation>
<translation id="2666092431469916601">Goiko elementua</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> gailutik partekatu da</translation>
+<translation id="271033894570825754">Berria</translation>
<translation id="2743387203779672305">Kopiatu arbelean</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" /> (<ph name="PRICE" />)</translation>
<translation id="2803313416453193357">Ireki karpeta</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emojiak eta ikurrak</translation>
<translation id="5476505524087279545">desautatu</translation>
<translation id="547979256943495781">Biltegia 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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Itxi</translation>
<translation id="6119846243427417423">aktibatu</translation>
<translation id="6129953537138746214">Zuriunea</translation>
+<translation id="6134259848159370930">Bilatu gailuan, aplikazioetan, ezarpenetan eta sarean</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/seg</translation>
<translation id="6156262341071374681">Erakutsi aplikazio guztiak</translation>
<translation id="6165508094623778733">Lortu informazio gehiago</translation>
+<translation id="6166852626429024716">Bilatu gailuan, aplikazioetan, ezarpenetan, sarean…</translation>
<translation id="6264365405983206840">Hautatu &amp;guztiak</translation>
<translation id="6351032674660237738">APLIKAZIOEN IRADOKIZUNAK</translation>
<translation id="6364916375976753737">Joan ezkerrera</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 minutu gelditzen da}other{# minutu gelditzen dira}}</translation>
<translation id="7319740667687257810">Abiarazlea, ikuspegi partziala</translation>
-<translation id="7352651011704765696">Arazoren bat izan da</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Duela 1 min}other{Duela # min}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 minutu bat gelditzen da}other{# minutu gelditzen dira}}</translation>
@@ -205,6 +209,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="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>
@@ -231,6 +236,7 @@
<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="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>
<translation id="8730621377337864115">Eginda</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_fa.xtb b/chromium/ui/strings/translations/ui_strings_fa.xtb
index 3a4b227337b..eb8d03290fc 100644
--- a/chromium/ui/strings/translations/ui_strings_fa.xtb
+++ b/chromium/ui/strings/translations/ui_strings_fa.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">کالیبراسیون تمام شد</translation>
<translation id="252373100621549798">نمایش ناشناس</translation>
<translation id="2545651323591713692">تعویق</translation>
+<translation id="2570734079541893434">مدیریت تنظیمات</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{تا ۱ ساعت دیگر}one{تا # ساعت دیگر}other{تا # ساعت دیگر}}</translation>
<translation id="2583543531130364912">کالیبراسیون صفحه لمسی</translation>
<translation id="2666092431469916601">بالا</translation>
<translation id="2701330563083355633">هم‌رسانی‌شده از <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">جدید</translation>
<translation id="2743387203779672305">کپی در بریده‌دان</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />، <ph name="PRICE" /></translation>
<translation id="2803313416453193357">بازکردن پوشه</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">اموجی و نمادها</translation>
<translation id="5476505524087279545">برداشتن علامت</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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">بستن</translation>
<translation id="6119846243427417423">فعالسازی</translation>
<translation id="6129953537138746214">فاصله</translation>
+<translation id="6134259848159370930">دستگاه، برنامه‌ها، تنظیمات، و وب را جستجو کنید.</translation>
<translation id="6135826906199951471">حذف</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> بایت/ثانیه</translation>
<translation id="6156262341071374681">بزرگ کردن برای مشاهده همه برنامه‌ها</translation>
<translation id="6165508094623778733">بیشتر بدانید</translation>
+<translation id="6166852626429024716">جستجوی دستگاه، برنامه‌ها، تنظیمات، وب، و غیره</translation>
<translation id="6264365405983206840">انتخاب &amp;همه</translation>
<translation id="6351032674660237738">پیشنهادات برنامه</translation>
<translation id="6364916375976753737">پیمایش به چپ</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{۱ دقیقه باقی مانده است}one{# دقیقه باقی مانده است}other{# دقیقه باقی مانده است}}</translation>
<translation id="7319740667687257810">راه‌انداز، نمای جزئی</translation>
-<translation id="7352651011704765696">مشکلی پیش آمد</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{۱ دقیقه قبل}one{# دقیقه قبل}other{# دقیقه قبل}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{۱ دقیقه باقی مانده است}one{# دقیقه باقی مانده است}other{# دقیقه باقی مانده است}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">به صفحه <ph name="PAGE_NUMBER" />، ردیف <ph name="ROW_NUMBER" />، ستون <ph name="COLUMN_NUMBER" />.منتقل شد.</translation>
<translation id="7879499977785298635">مسدود نکنید</translation>
<translation id="7907591526440419938">باز کردن فایل</translation>
+<translation id="7952747673138230804">‏سیستم‌عامل Chrome محتوای جدید برای کاوش پیشنهاد می‌دهد. تنها اگر هم‌رسانی داده‌های استفاده را انتخاب کرده باشید، داده‌های آماری را برای بهبود کیفیت ارسال می‌کند. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">فرمان</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{بیش از ۱ اعلان خوانده‌نشده}one{بیش از # اعلان خوانده‌نشده}other{بیش از # اعلان خوانده‌نشده}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{تا ۱ دقیقه دیگر}one{تا # دقیقه دیگر}other{تا # دقیقه دیگر}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">فایل <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">قفسه همیشه نمایش داده می‌شود</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> کیلوبایت/ثانیه</translation>
+<translation id="8685326675965865247">دستگاه، برنامه‌ها، تنظیمات، و وب را جستجو کنید. با کلیدهای پیکانی، برنامه‌هایتان را پیمایش کنید.</translation>
<translation id="8725488761726303204"><ph name="NUMBER" /> مورد دیگر</translation>
<translation id="8730621377337864115">تمام</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{۱ ساعت}one{# ساعت}other{# ساعت}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_fi.xtb b/chromium/ui/strings/translations/ui_strings_fi.xtb
index 7a8049602f7..2e803dc1fb8 100644
--- a/chromium/ui/strings/translations/ui_strings_fi.xtb
+++ b/chromium/ui/strings/translations/ui_strings_fi.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibrointi on valmis.</translation>
<translation id="252373100621549798">Tuntematon näyttö</translation>
<translation id="2545651323591713692">Torkuta</translation>
+<translation id="2570734079541893434">Muuta asetuksia</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 h:n päästä}other{# h:n päästä}}</translation>
<translation id="2583543531130364912">Kalibroi kosketusnäyttö</translation>
<translation id="2666092431469916601">Yleisin</translation>
<translation id="2701330563083355633">Jaettu: <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Uusi</translation>
<translation id="2743387203779672305">Kopioi leikepöydälle</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Avaa kansio</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emojit ja merkit</translation>
<translation id="5476505524087279545">poista valinta</translation>
<translation id="547979256943495781">Hylly oikealla</translation>
+<translation id="5528053674512161860">Sivun lataus ei onnistunut, koska kehittäjän käyttöliittymämoduulia (dev_ui) ei ole asennettu</translation>
<translation id="5574202486608032840">Järjestelmä <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Askelpalautin</translation>
<translation id="5613020302032141669">Nuoli vas.</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Sulje</translation>
<translation id="6119846243427417423">aktivoi</translation>
<translation id="6129953537138746214">Välilyönti</translation>
+<translation id="6134259848159370930">Hae laitteelta, sovelluksista, asetuksista ja verkosta.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> t/s</translation>
<translation id="6156262341071374681">Laajenna ja näytä kaikki sovellukset.</translation>
<translation id="6165508094623778733">Lisätietoja</translation>
+<translation id="6166852626429024716">Hae laitteelta, sovelluksista, asetuksista, verkosta…</translation>
<translation id="6264365405983206840">Valitse k&amp;aikki</translation>
<translation id="6351032674660237738">SOVELLUSEHDOTUKSET</translation>
<translation id="6364916375976753737">Vieritä vasemmalle</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 min jäljellä}other{# min jäljellä}}</translation>
<translation id="7319740667687257810">Käynnistysohjelma, osittainen näkymä</translation>
-<translation id="7352651011704765696">Tapahtui jokin virhe</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 min sitten}other{# min sitten}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 minuutti jäljellä}other{# minuuttia jäljellä}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Siirretty, nyt sivulla <ph name="PAGE_NUMBER" />, rivillä <ph name="ROW_NUMBER" />, sarakkeessa <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Älä estä</translation>
<translation id="7907591526440419938">Avaa tiedosto</translation>
+<translation id="7952747673138230804">Chrome-käyttöjärjestelmä näyttää ehdotuksia uudesta sisällöstä. Lähettää tilastoja laadun parantamiseksi vain, jos olet sallinut käyttödatan jakamisen. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Komento</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Enemmän kuin 1 lukematon ilmoitus}other{Enemmän kuin # lukematonta ilmoitusta}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 min päästä}other{# min päästä}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" />-tiedosto (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Hylly näytetään aina</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> kt/s</translation>
+<translation id="8685326675965865247">Hae laitteelta, sovelluksista, asetuksista ja verkosta. Siirry sovellusten välillä nuolinäppäimillä.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> lisää</translation>
<translation id="8730621377337864115">Valmis</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_fil.xtb b/chromium/ui/strings/translations/ui_strings_fil.xtb
index 5b2d5f01301..b4993a7b745 100644
--- a/chromium/ui/strings/translations/ui_strings_fil.xtb
+++ b/chromium/ui/strings/translations/ui_strings_fil.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Nakumpleto na ang pag-calibrate</translation>
<translation id="252373100621549798">Hindi Kilalang Display</translation>
<translation id="2545651323591713692">I-snooze</translation>
+<translation id="2570734079541893434">Pamahalaan ang mga setting</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{sa loob ng 1 oras}one{sa loob ng # oras}other{sa loob ng # na oras}}</translation>
<translation id="2583543531130364912">I-calibrate ang iyong touchscreen</translation>
<translation id="2666092431469916601">Tuktok</translation>
<translation id="2701330563083355633">Ibinahagi mula kay <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Bago</translation>
<translation id="2743387203779672305">Kopyahin sa clipboard</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Buksan ang folder</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji at Mga Simbolo</translation>
<translation id="5476505524087279545">i-uncheck</translation>
<translation id="547979256943495781">Nasa kanan ang shelf</translation>
+<translation id="5528053674512161860">Hindi na-load ang page dahil hindi naka-install ang developer UI module (dev_ui)</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> system</translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">KAliwang Arrow</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Isara</translation>
<translation id="6119846243427417423">isaaktibo</translation>
<translation id="6129953537138746214">Puwang</translation>
+<translation id="6134259848159370930">Maghanap sa iyong device, mga app, mga setting, at web.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> (na) B/s</translation>
<translation id="6156262341071374681">Palawakin sa lahat ng app</translation>
<translation id="6165508094623778733">Matuto pa</translation>
+<translation id="6166852626429024716">Maghanap sa iyong device, mga app, mga setting, web...</translation>
<translation id="6264365405983206840">Piliin &amp;Lahat</translation>
<translation id="6351032674660237738">MGA IMINUMUNGKAHING APP</translation>
<translation id="6364916375976753737">Mag-scroll Pakaliwa</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 minuto na lang ang natitira}one{# minuto na lang ang natitira}other{# na minuto na lang ang natitira}}</translation>
<translation id="7319740667687257810">Launcher, hindi kumpletong view</translation>
-<translation id="7352651011704765696">Nagkaroon ng problema</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 minuto ang nakalipas}one{# minuto ang nakalipas}other{# na minuto ang nakalipas}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 minuto na lang ang natitira}one{# minuto na lang ang natitira}other{# na minuto na lang ang natitira}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Inilipat sa Page <ph name="PAGE_NUMBER" />, row <ph name="ROW_NUMBER" />, column <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Huwag i-block</translation>
<translation id="7907591526440419938">Buksan ang File</translation>
+<translation id="7952747673138230804">Nagpapakita ang Chrome OS ng mga suhestyon para sa bagong content na ie-explore. Magpapadala lang ng mga istatistika para mapahusay ang kalidad kung pinili mong ibahagi ang data ng paggamit. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Mahigit sa 1 hindi pa nababasang notification}one{Mahigit sa # hindi pa nababasang notification}other{Mahigit sa # na hindi pa nababasang notification}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{sa loob ng 1 minuto}one{sa loob ng # minuto}other{sa loob ng # na minuto}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> File (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Palaging ipinapakita ang shelf</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Maghanap sa iyong device, mga app, mga setting, at web. Gamitin ang mga arrow key para i-navigate ang iyong mga app.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> pa</translation>
<translation id="8730621377337864115">Tapos na</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 oras}one{# oras}other{# na oras}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_fr-CA.xtb b/chromium/ui/strings/translations/ui_strings_fr-CA.xtb
index aa9267d58b7..9d7bd6abebd 100644
--- a/chromium/ui/strings/translations/ui_strings_fr-CA.xtb
+++ b/chromium/ui/strings/translations/ui_strings_fr-CA.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Le calibrage est terminé</translation>
<translation id="252373100621549798">Écran inconnu</translation>
<translation id="2545651323591713692">Reporter</translation>
+<translation id="2570734079541893434">Gérer les paramètres</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{dans 1 h}one{dans # h}other{dans # h}}</translation>
<translation id="2583543531130364912">Calibrez votre écran tactile</translation>
<translation id="2666092431469916601">Haut</translation>
<translation id="2701330563083355633">Partagé à partir de l'appareil suivant : <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Nouveau</translation>
<translation id="2743387203779672305">Copier dans le presse-papiers</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Ouvrir le dossier</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji et symboles</translation>
<translation id="5476505524087279545">décocher</translation>
<translation id="547979256943495781">Étagère à droite</translation>
+<translation id="5528053674512161860">Le chargement de la page a échoué parce que le module d'IU de concepteur (dev_ui) n'est pas installé</translation>
<translation id="5574202486608032840">Système <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Effacement arrière</translation>
<translation id="5613020302032141669">Flèche gauche</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Fermer</translation>
<translation id="6119846243427417423">Activer</translation>
<translation id="6129953537138746214">Espace</translation>
+<translation id="6134259848159370930">Recherchez dans votre appareil, dans vos applications, dans vos paramètres et sur le Web.</translation>
<translation id="6135826906199951471">Suppr</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> o/s</translation>
<translation id="6156262341071374681">Afficher toutes les applications</translation>
<translation id="6165508094623778733">En savoir plus</translation>
+<translation id="6166852626429024716">Rechercher sur votre appareil, dans vos applications, dans vos paramètres, sur le Web…</translation>
<translation id="6264365405983206840">Tout &amp;sélectionner</translation>
<translation id="6351032674660237738">SUGGESTIONS D'APPLICATIONS</translation>
<translation id="6364916375976753737">Défilement vers la gauche</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 min restante}one{# min restante}other{# min restantes}}</translation>
<translation id="7319740667687257810">Lanceur d'applications, affichage partiel</translation>
-<translation id="7352651011704765696">Une erreur s’est produite</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Il y a 1 min}one{Il y a # min}other{Il y a # min}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 minute restante}one{# minute restante}other{# minutes restantes}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Déplacée à la page <ph name="PAGE_NUMBER" />, ligne <ph name="ROW_NUMBER" />, colonne <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Ne pas bloquer</translation>
<translation id="7907591526440419938">Ouvrir un fichier</translation>
+<translation id="7952747673138230804">Chrome OS affiche des suggestions de nouveau contenu à explorer. Envoie des statistiques afin d'améliorer la qualité seulement si vous avez choisi de partager les données d'utilisation. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Commande</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Vous avez plus d'une notification non lue}one{Vous avez plus de # notification non lue}other{Vous avez plus de # notifications non lues}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{dans 1 min}one{dans # min}other{dans # min}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Fichier <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">L'étagère est toujours affichée</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> ko/s</translation>
+<translation id="8685326675965865247">Recherchez dans votre appareil, dans vos applications, dans vos paramètres et sur le Web. Utilisez les touches fléchées pour naviguer dans vos applications.</translation>
<translation id="8725488761726303204"><ph name="NUMBER" /> autres</translation>
<translation id="8730621377337864115">Terminé</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}one{# h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_fr.xtb b/chromium/ui/strings/translations/ui_strings_fr.xtb
index 56f8f0b1a26..d0b4c41482a 100644
--- a/chromium/ui/strings/translations/ui_strings_fr.xtb
+++ b/chromium/ui/strings/translations/ui_strings_fr.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Calibrage terminé</translation>
<translation id="252373100621549798">Écran inconnu</translation>
<translation id="2545651323591713692">Répéter</translation>
+<translation id="2570734079541893434">Gérer les paramètres</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{dans 1 h}one{dans # h}other{dans # h}}</translation>
<translation id="2583543531130364912">Calibrer votre écran tactile</translation>
<translation id="2666092431469916601">En haut</translation>
<translation id="2701330563083355633">Partagé par <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Nouveau</translation>
<translation id="2743387203779672305">Copier dans le presse-papiers</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Ouvrir le dossier</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji et symboles</translation>
<translation id="5476505524087279545">décocher</translation>
<translation id="547979256943495781">Étagère à droite</translation>
+<translation id="5528053674512161860">Le chargement de la page a échoué, car le module d'interface graphique pour les développeurs (dev_ui) n'est pas installé</translation>
<translation id="5574202486608032840">Système <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Retour</translation>
<translation id="5613020302032141669">Gauche</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Fermer</translation>
<translation id="6119846243427417423">activer</translation>
<translation id="6129953537138746214">Espace</translation>
+<translation id="6134259848159370930">Effectuez des recherches sur votre appareil, dans vos applications et paramètres, et sur le Web.</translation>
<translation id="6135826906199951471">Suppr</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> o/s</translation>
<translation id="6156262341071374681">Développer pour afficher toutes les applications</translation>
<translation id="6165508094623778733">En savoir plus</translation>
+<translation id="6166852626429024716">Faire des recherches sur votre appareil, dans vos applications et paramètres, sur le Web, etc.</translation>
<translation id="6264365405983206840">Tout &amp;sélectionner</translation>
<translation id="6351032674660237738">SUGGESTIONS D'APPLICATIONS</translation>
<translation id="6364916375976753737">Défilement vers la gauche</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 min restante}one{# min restante}other{# min restantes}}</translation>
<translation id="7319740667687257810">Lanceur d'applications, vue partielle</translation>
-<translation id="7352651011704765696">Un problème est survenu</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Il y a 1 min}one{Il y a # min}other{Il y a # min}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 minute restante}one{# minute restante}other{# minutes restantes}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Application déplacée vers la page <ph name="PAGE_NUMBER" />, ligne <ph name="ROW_NUMBER" />, colonne <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Ne pas bloquer</translation>
<translation id="7907591526440419938">Ouvrir le fichier</translation>
+<translation id="7952747673138230804">Chrome OS affiche des suggestions de nouveaux contenus à explorer. Si vous avez choisi de partager les données d'utilisation, des statistiques sont envoyées pour améliorer ces suggestions. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Commande</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Plus de 1 notification non lue}one{Plus de # notification non lue}other{Plus de # notifications non lues}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{dans 1 m}one{dans # m}other{dans # m}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Fichier <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Étagère toujours affichée</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> Ko/s</translation>
+<translation id="8685326675965865247">Effectuez des recherches sur votre appareil, dans vos applications et sur le Web. Utilisez les touches fléchées pour naviguer dans vos applications.</translation>
<translation id="8725488761726303204"><ph name="NUMBER" /> autres</translation>
<translation id="8730621377337864115">OK</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}one{# h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_gl.xtb b/chromium/ui/strings/translations/ui_strings_gl.xtb
index 7548a4463fb..ea317b3e9e4 100644
--- a/chromium/ui/strings/translations/ui_strings_gl.xtb
+++ b/chromium/ui/strings/translations/ui_strings_gl.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Completouse a calibración</translation>
<translation id="252373100621549798">Pantalla descoñecida</translation>
<translation id="2545651323591713692">Adiar</translation>
+<translation id="2570734079541893434">Xestionar configuración</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{en 1 h}other{en # h}}</translation>
<translation id="2583543531130364912">Calibra a pantalla táctil</translation>
<translation id="2666092431469916601">Parte superior</translation>
<translation id="2701330563083355633">Contido compartido desde <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Novo</translation>
<translation id="2743387203779672305">Copiar no portapapeis</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Abrir cartafol</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emojis e símbolos</translation>
<translation id="5476505524087279545">desmarcar</translation>
<translation id="547979256943495781">O estante está na parte dereita</translation>
+<translation id="5528053674512161860">Produciuse un erro ao cargar a páxina porque o módulo da interface para programadores (dev_ui) non está instalado</translation>
<translation id="5574202486608032840">Sistema <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Retroceso</translation>
<translation id="5613020302032141669">Frecha para a esquerda</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Pechar</translation>
<translation id="6119846243427417423">activar</translation>
<translation id="6129953537138746214">Espazo</translation>
+<translation id="6134259848159370930">Realiza buscas no teu dispositivo, nas aplicacións, nas opcións de configuración e na Web.</translation>
<translation id="6135826906199951471">Supr</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Despregar todas as aplicacións</translation>
<translation id="6165508094623778733">Máis información</translation>
+<translation id="6166852626429024716">Realiza buscas no teu dispositivo, nas aplicacións, nas opcións de configuración, na Web…</translation>
<translation id="6264365405983206840">Seleccionar &amp;todo</translation>
<translation id="6351032674660237738">SUXESTIÓNS DE APLICACIÓNS</translation>
<translation id="6364916375976753737">Desprazar cara á esquerda</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Queda un minuto}other{Quedan # minutos}}</translation>
<translation id="7319740667687257810">Menú de aplicacións, vista parcial</translation>
-<translation id="7352651011704765696">Produciuse un erro</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Hai un minuto}other{Hai # minutos}}</translation>
<translation id="7389409599945284130">: <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Queda un minuto}other{Quedan # minutos}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Moveuse á páxina <ph name="PAGE_NUMBER" />, fila <ph name="ROW_NUMBER" />, columna <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Non bloquear</translation>
<translation id="7907591526440419938">Abrir ficheiro</translation>
+<translation id="7952747673138230804">Chrome OS mostra suxestións de contido novo que podes explorar. Envía estatísticas para mellorar a calidade só se escolliches compartir os datos de uso. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Comando</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Máis de 1 notificación sen ler}other{Máis de # notificacións sen ler}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{en 1 m}other{en # m}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Ficheiro <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">O estante móstrase sempre</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> kB/s</translation>
+<translation id="8685326675965865247">Realiza buscas no teu dispositivo, nas aplicacións, nas opcións de configuración e na Web. Utiliza as teclas das frechas para navegar polas aplicacións.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> máis</translation>
<translation id="8730621377337864115">Feito</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_gu.xtb b/chromium/ui/strings/translations/ui_strings_gu.xtb
index b2533b4b1ec..adc23acf5ec 100644
--- a/chromium/ui/strings/translations/ui_strings_gu.xtb
+++ b/chromium/ui/strings/translations/ui_strings_gu.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">કૅલિબ્રેશન પૂર્ણ થયું</translation>
<translation id="252373100621549798">અજાણ્યું ડિસ્પ્લે</translation>
<translation id="2545651323591713692">સ્નૂઝ કરો</translation>
+<translation id="2570734079541893434">સેટિંગને મેનેજ કરો</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1ક. માં}one{#ક. માં}other{#ક. માં}}</translation>
<translation id="2583543531130364912">તમારી ટચસ્ક્રીનને કેલિબ્રેટ કરો</translation>
<translation id="2666092431469916601">ઉપર</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" />માંથી શેર કર્યું</translation>
+<translation id="271033894570825754">નવું</translation>
<translation id="2743387203779672305">ક્લિપબોર્ડ પર કૉપિ કરો</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">ફોલ્ડર ખોલો</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">ઇમોજી અને પ્રતીકો</translation>
<translation id="5476505524087279545">અનચેક કરો</translation>
<translation id="547979256943495781">શેલ્ફ જમણી બાજુએ છે</translation>
+<translation id="5528053674512161860">ડેવલપર યૂઝર ઇન્ટરફેસ (UI) મૉડ્યૂલ (dev_ui) ઇન્સ્ટૉલ ન કરેલું હોવાથી પેજ લોડ કરવાનું નિષ્ફળ થયું</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> સિસ્ટમ</translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">ડાબો એરો</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">બંધ કરો</translation>
<translation id="6119846243427417423">સક્રિય કરો</translation>
<translation id="6129953537138746214">જગ્યા</translation>
+<translation id="6134259848159370930">તમારા ડિવાઇસ, ઍપ, સેટિંગ અને વેબ પર શોધો.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">બધી ઍપ માટે વિસ્તૃત કરો</translation>
<translation id="6165508094623778733">વધુ જાણો</translation>
+<translation id="6166852626429024716">તમારા ડિવાઇસ, ઍપ, સેટિંગ અને વેબ પર શોધો...</translation>
<translation id="6264365405983206840">&amp;બધા પસંદ કરો</translation>
<translation id="6351032674660237738">ઍપ સૂચનો</translation>
<translation id="6364916375976753737">ડાબે સ્ક્રોલ કરો</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 મિ બાકી}one{# મિ બાકી}other{# મિ બાકી}}</translation>
<translation id="7319740667687257810">લૉન્ચર, આંશિક દૃશ્ય</translation>
-<translation id="7352651011704765696">કંઈક ખોટું થયું હતું</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 મિ પહેલાં}one{# મિ પહેલાં}other{# મિ પહેલાં}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 મિનિટ બાકી}one{# મિનિટ બાકી}other{# મિનિટ બાકી}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">પેજ <ph name="PAGE_NUMBER" />, પંક્તિ <ph name="ROW_NUMBER" />, કૉલમ <ph name="COLUMN_NUMBER" /> પર ખસેડી.</translation>
<translation id="7879499977785298635">બ્લૉક કરશો નહીં</translation>
<translation id="7907591526440419938">ફાઇલ ખોલો</translation>
+<translation id="7952747673138230804">Chrome OS શોધખોળ કરવાના નવા કન્ટેન્ટ માટે સૂચનો બતાવે છે. જો તમે વપરાશનો ડેટા શેર કરવાનું પસંદ કર્યું હોય, તો જ તે ક્વૉલિટીને બહેતર બનાવવા માટે આંકડા મોકલે છે. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">આદેશ</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{1 કરતાં વઘુ વાંચ્યા વગરના નોટિફિકેશન}one{# કરતાં વઘુ વાંચ્યા વગરના નોટિફિકેશન}other{# કરતાં વઘુ વાંચ્યા વગરના નોટિફિકેશન}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1મિ માં}one{#મિ માં}other{#મિ માં}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ફાઇલ (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">શેલ્ફ હંમેશાં બતાવવામાં આવે છે</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">તમારા ડિવાઇસ, ઍપ, સેટિંગ અને વેબ પર શોધો. તમારી ઍપ પર નૅવિગેટ કરવા માટે ઍરો કીનો ઉપયોગ કરો.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> વધુ</translation>
<translation id="8730621377337864115">થઈ ગયું</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 ક}one{# ક}other{# ક}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_hi.xtb b/chromium/ui/strings/translations/ui_strings_hi.xtb
index e5ac8baf2c9..6a419668fbe 100644
--- a/chromium/ui/strings/translations/ui_strings_hi.xtb
+++ b/chromium/ui/strings/translations/ui_strings_hi.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">कैलिब्रेशन पूरा हो गया</translation>
<translation id="252373100621549798">अनजान डिस्प्ले</translation>
<translation id="2545651323591713692">स्नूज़ करें</translation>
+<translation id="2570734079541893434">सेटिंग को प्रबंधित करें</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 घंटे में}one{#घंटे में}other{#घंटे में}}</translation>
<translation id="2583543531130364912">अपनी टचस्क्रीन कैलिब्रेट करें</translation>
<translation id="2666092431469916601">शीर्ष</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> से शेयर किया</translation>
+<translation id="271033894570825754">नया</translation>
<translation id="2743387203779672305">क्लिपबोर्ड में कॉपी करें</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">फ़ोल्डर खोलें</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">इमोजी और चिह्न</translation>
<translation id="5476505524087279545">सही का निशान हटाएं</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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">बंद करें</translation>
<translation id="6119846243427417423">सक्रिय करें</translation>
<translation id="6129953537138746214">Space</translation>
+<translation id="6134259848159370930">अपने डिवाइस, ऐप्लिकेशन, सेटिंग, के साथ-साथ वेब पर भी खोजें.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">सभी ऐप्लिकेशन दिखाएं</translation>
<translation id="6165508094623778733">ज़्यादा जानें</translation>
+<translation id="6166852626429024716">अपने डिवाइस, ऐप्लिकेशन, सेटिंग के साथ-साथ वेब पर भी खोजें...</translation>
<translation id="6264365405983206840">&amp;सभी को चुनें</translation>
<translation id="6351032674660237738">ऐप्लिकेशन सुझाव</translation>
<translation id="6364916375976753737">बाएं स्क्रोल करें</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 मिनट शेष}one{# मिनट शेष}other{# मिनट शेष}}</translation>
<translation id="7319740667687257810">लॉन्चर, आंशिक व्यू</translation>
-<translation id="7352651011704765696">कुछ गलत हुआ</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 मिनट पहले}one{# मिनट पहले}other{# मिनट पहले}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 मिनट शेष}one{# मिनट शेष}other{# मिनट शेष}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">पेज <ph name="PAGE_NUMBER" />, लाइन <ph name="ROW_NUMBER" />, कॉलम <ph name="COLUMN_NUMBER" /> पर जाएं.</translation>
<translation id="7879499977785298635">ब्लॉक नहीं करें</translation>
<translation id="7907591526440419938">फ़ाइल खोलें</translation>
+<translation id="7952747673138230804">Chrome OS नए कॉन्टेंट के बारे में जानकारी के लिए सुझाव दिखाता है. यह क्वालिटी को बेहतर बनाने के लिए आंकड़े सिर्फ़ तब भेजता है, जब आपने इस्तेमाल के बारे में जानकारी देने वाला डेटा शेयर करने का विकल्प चुना हो. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">निर्देश</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{1 से ज़्यादा न पढ़ी गई सूचना}one{# से ज़्यादा न पढ़ी गई सूचनाएं}other{# से ज़्यादा न पढ़ी गई सूचनाएं}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 मिनट में}one{# मिनट में}other{# मिनट में}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> फ़ाइल (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">अब शेल्फ़ हर समय उपलब्ध है</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> केबी/सेकंड</translation>
+<translation id="8685326675965865247">अपने डिवाइस, ऐप्लिकेशन, सेटिंग के साथ-साथ वेब पर भी खोजें. अपने ऐप्लिकेशन नेविगेट करने के लिए, तीर के निशान वाले बटन का इस्तेमाल करें.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> और</translation>
<translation id="8730621377337864115">हो गया</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1h}one{#h}other{#h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_hr.xtb b/chromium/ui/strings/translations/ui_strings_hr.xtb
index 4929ea69b2b..3164de3bbfc 100644
--- a/chromium/ui/strings/translations/ui_strings_hr.xtb
+++ b/chromium/ui/strings/translations/ui_strings_hr.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibracija je gotova</translation>
<translation id="252373100621549798">Nepoznati zaslon</translation>
<translation id="2545651323591713692">Odgodi alarm</translation>
+<translation id="2570734079541893434">Upravljajte postavkama</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{za 1 h}one{za # h}few{za # h}other{za # h}}</translation>
<translation id="2583543531130364912">Kalibrirajte dodirni zaslon</translation>
<translation id="2666092431469916601">Gornji</translation>
<translation id="2701330563083355633">Podijeljeno s uređaja <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Novo</translation>
<translation id="2743387203779672305">Kopiraj u međuspremnik</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Otvori mapu</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji i simboli</translation>
<translation id="5476505524087279545">ukloni oznaku</translation>
<translation id="547979256943495781">Polica na desnoj strani</translation>
+<translation id="5528053674512161860">Učitavanje stranice nije uspjelo jer modul korisničkog sučelja za razvojne programere (dev_ui) nije instaliran</translation>
<translation id="5574202486608032840">Sustav <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Strelica lijevo</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Zatvori</translation>
<translation id="6119846243427417423">aktiviraj</translation>
<translation id="6129953537138746214">Razmak</translation>
+<translation id="6134259848159370930">Pretražite uređaj, aplikacije, postavke i web.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Proširivanje na sve aplikacije</translation>
<translation id="6165508094623778733">Saznajte više</translation>
+<translation id="6166852626429024716">Pretražite uređaj, aplikacije, postavke, web...</translation>
<translation id="6264365405983206840">Odaberi &amp;sve</translation>
<translation id="6351032674660237738">PRIJEDLOZI APLIKACIJA</translation>
<translation id="6364916375976753737">Pomakni se lijevo</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Još 1 min}one{Još # min}few{Još # min}other{Još # min}}</translation>
<translation id="7319740667687257810">Pokretač, djelomični prikaz</translation>
-<translation id="7352651011704765696">Nešto nije u redu</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Prije 1 min}one{Prije # min}few{Prije # min}other{Prije # min}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Još 1 minuta}one{Još # minuta}few{Još # minute}other{Još # minuta}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Premješteno na <ph name="PAGE_NUMBER" />. stranicu, redak <ph name="ROW_NUMBER" />, stupac <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Ne blokiraj</translation>
<translation id="7907591526440419938">Otvori datoteku</translation>
+<translation id="7952747673138230804">OS Chrome prikazuje prijedloge za istraživanje novog sadržaja. Statistiku za poboljšanje kvalitete šalje samo ako ste odabrali dijeljenje podataka o upotrebi. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Tipka Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Više od jedne nepročitane obavijesti}one{Više od # nepročitane obavijesti}few{Više od # nepročitane obavijesti}other{Više od # nepročitanih obavijesti}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{za 1 m}one{za # m}few{za # m}other{za # m}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Datoteka (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Polica se uvijek prikazuje</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Pretražite uređaj, aplikacije, postavke i web. Za kretanje po aplikacijama koristite tipke sa strelicama.</translation>
<translation id="8725488761726303204">Još <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Gotovo</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}one{# h}few{# h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_hu.xtb b/chromium/ui/strings/translations/ui_strings_hu.xtb
index beca5d45d35..1e3a0267ff3 100644
--- a/chromium/ui/strings/translations/ui_strings_hu.xtb
+++ b/chromium/ui/strings/translations/ui_strings_hu.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">A kalibrálás befejeződött</translation>
<translation id="252373100621549798">Ismeretlen kijelző</translation>
<translation id="2545651323591713692">Halasztás</translation>
+<translation id="2570734079541893434">Beállítások kezelése</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 óra múlva}other{# óra múlva}}</translation>
<translation id="2583543531130364912">Az érintőképernyő kalibrálása</translation>
<translation id="2666092431469916601">Felülre</translation>
<translation id="2701330563083355633">Megosztva a következő eszközről: <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Új</translation>
<translation id="2743387203779672305">Másolás a vágólapra</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Mappa megnyitása</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Hangulatjelek és szimbólumok</translation>
<translation id="5476505524087279545">Megjelölés eltávolítása</translation>
<translation id="547979256943495781">A polc a jobb oldalon található</translation>
+<translation id="5528053674512161860">Az oldal betöltése nem sikerült, mert nincs telepítve a fejlesztői UI-modul (dev_ui)</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> rendszer</translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Bal nyíl</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Bezárás</translation>
<translation id="6119846243427417423">Aktiválás</translation>
<translation id="6129953537138746214">Szóköz</translation>
+<translation id="6134259848159370930">Kereshet az eszközén, az alkalmazások és a beállítások között, valamint az interneten.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Összes alkalmazás kibontása</translation>
<translation id="6165508094623778733">További információ</translation>
+<translation id="6166852626429024716">Kereshet az eszközén, az alkalmazások és a beállítások között, az interneten…</translation>
<translation id="6264365405983206840">Össz&amp;es kiválasztása</translation>
<translation id="6351032674660237738">ALKALMAZÁSJAVASLATOK</translation>
<translation id="6364916375976753737">Görgetés balra</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 perc van hátra}other{# perc van hátra}}</translation>
<translation id="7319740667687257810">Indító, részleges nézet</translation>
-<translation id="7352651011704765696">Valami nem működik</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 perce}other{# perce}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 perc van hátra}other{# perc van hátra}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Áthelyezve ide: <ph name="PAGE_NUMBER" />. oldal, <ph name="ROW_NUMBER" />. sor, <ph name="COLUMN_NUMBER" />. oszlop.</translation>
<translation id="7879499977785298635">Nincs tiltás</translation>
<translation id="7907591526440419938">Fájl megnyitása</translation>
+<translation id="7952747673138230804">A Chrome OS új, felfedezhető tartalmakat javasol. Csak akkor küld statisztikákat a javaslatok javítása érdekében, ha Ön a használati adatok megosztása mellett döntött. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Több mint 1 olvasatlan értesítés}other{Több mint # olvasatlan értesítés}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 perc múlva}other{# perc múlva}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> fájl (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">A polc mindig látható</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> kB/s</translation>
+<translation id="8685326675965865247">Kereshet eszközén, az alkalmazások és a beállítások között, valamint az interneten. A nyílbillentyűkkel navigálhat az alkalmazások között.</translation>
<translation id="8725488761726303204">és <ph name="NUMBER" /> további</translation>
<translation id="8730621377337864115">Kész</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 ó}other{# ó}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_hy.xtb b/chromium/ui/strings/translations/ui_strings_hy.xtb
index 3e327981b95..f4fcbbd631a 100644
--- a/chromium/ui/strings/translations/ui_strings_hy.xtb
+++ b/chromium/ui/strings/translations/ui_strings_hy.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Չափաբերումն ավարտվեց</translation>
<translation id="252373100621549798">Անհայտ էկրան</translation>
<translation id="2545651323591713692">Հետաձգել</translation>
+<translation id="2570734079541893434">Կառավարել կարգավորումները</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 ժ-ից}one{# ժ-ից}other{# ժ-ից}}</translation>
<translation id="2583543531130364912">Հպէկրանի չափաբերում</translation>
<translation id="2666092431469916601">Վերին</translation>
<translation id="2701330563083355633">Ուղարկվել է <ph name="DEVICE_NAME" />-ի միջոցով</translation>
+<translation id="271033894570825754">New</translation>
<translation id="2743387203779672305">Պատճենել սեղմատախտակին</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Բացել պանակը</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Զմայլիկներ և նշաններ</translation>
<translation id="5476505524087279545">ապանշել</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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Փակել</translation>
<translation id="6119846243427417423">ակտիվացնել</translation>
<translation id="6129953537138746214">Բացատ</translation>
+<translation id="6134259848159370930">Որոնեք սարքում, հավելվածներում, կարգավորումներում և համացանցում։</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> Բ/վ</translation>
<translation id="6156262341071374681">Ցուցադրել բոլոր հավելվածները</translation>
<translation id="6165508094623778733">Իմանալ ավելին</translation>
+<translation id="6166852626429024716">Որոնեք սարքում, հավելվածներում, կարգավորումներում, համացանցում…</translation>
<translation id="6264365405983206840">Ընտրել &amp;բոլորը</translation>
<translation id="6351032674660237738">ՀԱՎԵԼՎԱԾՆԵՐԻ ԱՌԱՋԱՐԿՆԵՐ</translation>
<translation id="6364916375976753737">Ոլորել ձախ</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Մնացել է 1 րոպե}one{Մնացել է # րոպե}other{Մնացել է # րոպե}}</translation>
<translation id="7319740667687257810">Launcher՝ մասնակի տարբերակ</translation>
-<translation id="7352651011704765696">Ինչ-որ սխալ տեղի ունեցավ</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 րոպե առաջ}one{# րոպե առաջ}other{# րոպե առաջ}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Մնացել է 1 րոպե}one{Մնացել է # րոպե}other{Մնացել է # րոպե}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Հավելվածը տեղափոխվել է էջ <ph name="PAGE_NUMBER" />, շարք <ph name="ROW_NUMBER" />, սյունակ <ph name="COLUMN_NUMBER" />։</translation>
<translation id="7879499977785298635">Չարգելափակել</translation>
<translation id="7907591526440419938">Ֆայլի բացում</translation>
+<translation id="7952747673138230804">Chrome OS-ը ցուցադրում է նոր բովանդակության առաջարկներ։ Ուղարկում է վիճակագրություն՝ ծառայությունների որակը բարելավելու համար, միայն եթե դուք որոշել եք կիսվել օգտագործման տվյալներով։ <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Ավելի քան 1 չկարդացված ծանուցում}one{Ավելի քան # չկարդացված ծանուցում}other{Ավելի քան # չկարդացված ծանուցում}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 ր-ից}one{# ր-ից}other{# ր-ից}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ֆայլ (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Դարակը միշտ ցուցադրված է</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> ԿԲ/վ</translation>
+<translation id="8685326675965865247">Որոնեք սարքում, հավելվածներում, կարգավորումներում և համացանցում։ Մեկ հավելվածից մյուսին անցնելու համար օգտագործեք սլաքներով ստեղները։</translation>
<translation id="8725488761726303204">ևս <ph name="NUMBER" /> տարր</translation>
<translation id="8730621377337864115">Պատրաստ է</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 ժ}one{# ժ}other{# ժ}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_id.xtb b/chromium/ui/strings/translations/ui_strings_id.xtb
index dc1ab9af24d..14fc6f4b7b7 100644
--- a/chromium/ui/strings/translations/ui_strings_id.xtb
+++ b/chromium/ui/strings/translations/ui_strings_id.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibrasi selesai</translation>
<translation id="252373100621549798">Tampilan yang Tidak Diketahui</translation>
<translation id="2545651323591713692">Tunda</translation>
+<translation id="2570734079541893434">Kelola setelan</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{dalam 1 jam}other{dalam # jam}}</translation>
<translation id="2583543531130364912">Kalibrasi layar sentuh</translation>
<translation id="2666092431469916601">Atas</translation>
<translation id="2701330563083355633">Dibagikan dari <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Baru</translation>
<translation id="2743387203779672305">Salin ke papan klip</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Buka folder</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji &amp;&amp; Simbol</translation>
<translation id="5476505524087279545">batalkan centang</translation>
<translation id="547979256943495781">Rak di bagian kanan</translation>
+<translation id="5528053674512161860">Gagal memuat halaman karena modul UI developer (dev_ui) tidak diinstal</translation>
<translation id="5574202486608032840">Sistem <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Panah Kiri</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Tutup</translation>
<translation id="6119846243427417423">aktifkan</translation>
<translation id="6129953537138746214">Spasi</translation>
+<translation id="6134259848159370930">Telusuri perangkat, aplikasi, setelan, dan web.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/dtk</translation>
<translation id="6156262341071374681">Tampilkan semua aplikasi</translation>
<translation id="6165508094623778733">Pelajari selengkapnya</translation>
+<translation id="6166852626429024716">Telusuri perangkat, aplikasi, setelan, web ...</translation>
<translation id="6264365405983206840">Pilih Semu&amp;a</translation>
<translation id="6351032674660237738">SARAN APLIKASI</translation>
<translation id="6364916375976753737">Gulir ke Kiri</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 mnt lagi}other{# mnt lagi}}</translation>
<translation id="7319740667687257810">Peluncur, tampilan sebagian</translation>
-<translation id="7352651011704765696">Ada yang tidak beres</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 mnt yang lalu}other{# mnt yang lalu}}</translation>
<translation id="7389409599945284130"><ph name="MESSAGE" /> -</translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 menit lagi}other{# menit lagi}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Dipindahkan ke Halaman <ph name="PAGE_NUMBER" />, baris <ph name="ROW_NUMBER" />, kolom <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Jangan diblokir</translation>
<translation id="7907591526440419938">Buka File</translation>
+<translation id="7952747673138230804">Chrome OS akan menampilkan saran konten baru untuk dijelajahi. Mengirimkan statistik untuk menyempurnakan kualitas hanya jika Anda memilih untuk membagikan data penggunaan. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Tombol Perintah</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Lebih dari 1 notifikasi belum dibaca}other{Lebih dari # notifikasi belum dibaca}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{dalam 1 m}other{dalam # m}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> File (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Rak selalu ditampilkan</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/dtk</translation>
+<translation id="8685326675965865247">Telusuri perangkat, aplikasi, setelan, dan web Anda. Gunakan tombol panah untuk membuka berbagai bagian aplikasi.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> lagi</translation>
<translation id="8730621377337864115">Selesai</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1j}other{#j}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_is.xtb b/chromium/ui/strings/translations/ui_strings_is.xtb
index 72dddca578a..4947b167810 100644
--- a/chromium/ui/strings/translations/ui_strings_is.xtb
+++ b/chromium/ui/strings/translations/ui_strings_is.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kvörðun er lokið</translation>
<translation id="252373100621549798">Óþekktur skjár</translation>
<translation id="2545651323591713692">Þagga tímabundið</translation>
+<translation id="2570734079541893434">Stjórna stillingum</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{eftir 1 klst.}one{eftir # klst.}other{eftir # klst.}}</translation>
<translation id="2583543531130364912">Kvarðaðu snertiskjáinn</translation>
<translation id="2666092431469916601">Efst</translation>
<translation id="2701330563083355633">Deilt úr <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Nýtt</translation>
<translation id="2743387203779672305">Afrita á klippiborð</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Opna möppu</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji og tákn</translation>
<translation id="5476505524087279545">ekki velja</translation>
<translation id="547979256943495781">Hilla til hægri</translation>
+<translation id="5528053674512161860">Ekki tókst að hlaða síðu þar sem notendaviðmót forritara (dev_ui) er ekki uppsett</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> stýrikerfi</translation>
<translation id="5583640892426849032">Bakklykill</translation>
<translation id="5613020302032141669">Ör til vinstri</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Loka</translation>
<translation id="6119846243427417423">virkja</translation>
<translation id="6129953537138746214">Bil</translation>
+<translation id="6134259848159370930">Leitaðu í tækinu þínu, forritum, stillingum og á netinu.</translation>
<translation id="6135826906199951471">Delete</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> b/sek.</translation>
<translation id="6156262341071374681">Fara í öll forrit</translation>
<translation id="6165508094623778733">Frekari upplýsingar</translation>
+<translation id="6166852626429024716">Leitaðu í tækinu þínu, forritum, stillingum, á vefnum...</translation>
<translation id="6264365405983206840">Velja &amp;allt</translation>
<translation id="6351032674660237738">TILLÖGUR AÐ FORRITUM</translation>
<translation id="6364916375976753737">Fletta til vinstri</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 mín. eftir}one{# mín. eftir}other{# mín. eftir}}</translation>
<translation id="7319740667687257810">Ræsiforrit, lítið yfirlit</translation>
-<translation id="7352651011704765696">Eitthvað fór úrskeiðis</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Fyrir 1 mín.}one{Fyrir # mín.}other{Fyrir # mín.}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 mínúta eftir}one{# mínúta eftir}other{# mínútur eftir}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Fært á síðu <ph name="PAGE_NUMBER" />, línu <ph name="ROW_NUMBER" />, dálk <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Ekki útiloka</translation>
<translation id="7907591526440419938">Opna skrá</translation>
+<translation id="7952747673138230804">Chrome OS birtir tillögur að nýju efni sem hægt er að skoða. Sendir aðeins tölfræðiupplýsingar sem eru notaðar til að auka gæði ef þú hefur valið að deila notkunarupplýsingum. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Skipun</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Fleiri en 1 ólesin tilkynning}one{Fleiri en # ólesin tilkynning}other{Fleiri en # ólesnar tilkynningar}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{eftir 1 mín.}one{eftir # mín.}other{eftir # mín.}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> skrá (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Hilla alltaf sýnileg</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> kB/sek.</translation>
+<translation id="8685326675965865247">Leitaðu í tækinu þínu, forritum, stillingum og á vefnum. Notaðu örvatakkana til að fletta í gegnum forritin þín.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> í viðbót</translation>
<translation id="8730621377337864115">Lokið</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1k}one{#k}other{#k}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_it.xtb b/chromium/ui/strings/translations/ui_strings_it.xtb
index ab36b7284b6..68407d4adb4 100644
--- a/chromium/ui/strings/translations/ui_strings_it.xtb
+++ b/chromium/ui/strings/translations/ui_strings_it.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Calibrazione completata</translation>
<translation id="252373100621549798">Display sconosciuto</translation>
<translation id="2545651323591713692">Posticipa</translation>
+<translation id="2570734079541893434">Gestisci impostazioni</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{tra 1 h}other{tra # h}}</translation>
<translation id="2583543531130364912">Calibra il touchscreen</translation>
<translation id="2666092431469916601">In alto</translation>
<translation id="2701330563083355633">Condivisione da <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Nuovo</translation>
<translation id="2743387203779672305">Copia negli appunti</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Apri cartella</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji e simboli</translation>
<translation id="5476505524087279545">deseleziona</translation>
<translation id="547979256943495781">Shelf a destra</translation>
+<translation id="5528053674512161860">Impossibile caricare la pagina perché il modulo UI sviluppatore (dev_ui) non è installato</translation>
<translation id="5574202486608032840">Sistema <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Freccia sinistra</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Chiudi</translation>
<translation id="6119846243427417423">attiva</translation>
<translation id="6129953537138746214">Spazio</translation>
+<translation id="6134259848159370930">Cerca sul dispositivo, nelle app, nelle impostazioni e sul Web.</translation>
<translation id="6135826906199951471">Canc</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Espandi per vedere tutte le app</translation>
<translation id="6165508094623778733">Ulteriori informazioni</translation>
+<translation id="6166852626429024716">Cerca sul dispositivo, nelle app, nelle impostazioni e sul Web.</translation>
<translation id="6264365405983206840">Seleziona &amp;tutto</translation>
<translation id="6351032674660237738">APP SUGGERITE</translation>
<translation id="6364916375976753737">Scorri a sinistra</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 min rimanente}other{# min rimanenti}}</translation>
<translation id="7319740667687257810">Avvio applicazioni, visualizzazione parziale</translation>
-<translation id="7352651011704765696">Si è verificato un problema</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 min fa}other{# min fa}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 minuto rimanente}other{# minuti rimanenti}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Spostata alla Pagina <ph name="PAGE_NUMBER" />, riga <ph name="ROW_NUMBER" />, colonna <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Non bloccare</translation>
<translation id="7907591526440419938">Apri file</translation>
+<translation id="7952747673138230804">Chrome OS mostra suggerimenti relativi a nuovi contenuti da esplorare. Vengono inviate statistiche per migliorare la qualità solo se hai scelto di condividere i dati sull'utilizzo. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Comando</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Più di 1 notifica da leggere}other{Più di # notifiche da leggere}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{tra 1 m}other{tra # m}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">File <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Shelf sempre visualizzato</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> kB/s</translation>
+<translation id="8685326675965865247">Cerca sul dispositivo, nelle app, nelle impostazioni e sul Web. Usa i tasti freccia per esplorare le tue app.</translation>
<translation id="8725488761726303204">+ altre <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Fine</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_iw.xtb b/chromium/ui/strings/translations/ui_strings_iw.xtb
index feba6d0ae1d..01756aedac4 100644
--- a/chromium/ui/strings/translations/ui_strings_iw.xtb
+++ b/chromium/ui/strings/translations/ui_strings_iw.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">הכיול הושלם</translation>
<translation id="252373100621549798">תצוגה לא ידועה</translation>
<translation id="2545651323591713692">הפעלת נודניק</translation>
+<translation id="2570734079541893434">ניהול ההגדרות</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{עוד שעה}two{עוד 2 שעות}many{עוד # שעות}other{עוד # שעות}}</translation>
<translation id="2583543531130364912">כיול מסך המגע</translation>
<translation id="2666092431469916601">למעלה</translation>
<translation id="2701330563083355633">שותפה מהמכשיר <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">חדש</translation>
<translation id="2743387203779672305">העתקה ללוח</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />,‏ <ph name="PRICE" /></translation>
<translation id="2803313416453193357">פתח את התיקייה</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">אמוג'י וסמלים</translation>
<translation id="5476505524087279545">ביטול הסימון</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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">סגור</translation>
<translation id="6119846243427417423">הפעל</translation>
<translation id="6129953537138746214">רווח</translation>
+<translation id="6134259848159370930">אפשר לחפש במכשיר, באפליקציות ובאינטרנט.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">הרחב לכל האפליקציות</translation>
<translation id="6165508094623778733">למידע נוסף</translation>
+<translation id="6166852626429024716">חיפוש במכשיר, באפליקציות, בהגדרות, באינטרנט...</translation>
<translation id="6264365405983206840">בחר &amp;הכל</translation>
<translation id="6351032674660237738">הצעות לאפליקציות</translation>
<translation id="6364916375976753737">גלול שמאלה</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{נותרה דק‘ אחת}two{נותרו # דק‘}many{נותרו # דק‘}other{נותרו # דק‘}}</translation>
<translation id="7319740667687257810">מרכז האפליקציות, תצוגה חלקית</translation>
-<translation id="7352651011704765696">משהו השתבש</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{לפני דק‘ אחת}two{לפני # דק‘}many{לפני # דק‘}other{לפני # דק‘}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{נותרה דקה אחת}two{נותרו # דקות}many{נותרו # דקות}other{נותרו # דקות}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">עברה לדף <ph name="PAGE_NUMBER" />, שורה <ph name="ROW_NUMBER" />, עמודה <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">ללא חסימה</translation>
<translation id="7907591526440419938">פתח קובץ</translation>
+<translation id="7952747673138230804">‏Chrome OS מציג הצעות לתוכן חדש שעשוי לעניין אותך. נתונים סטטיסטיים יישלחו כדי לשפר את האיכות רק אם בחרת לשתף נתוני שימוש במכשיר. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">פקודה</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{יותר מהודעה אחת שלא נקראה}two{יותר מ-2 הודעות שלא נקראו}many{יותר מ-# הודעות שלא נקראו}other{יותר מ-# הודעות שלא נקראו}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{עוד דקה}two{עוד 2 דקות}many{עוד # דקות}other{עוד # דקות}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">קובץ <ph name="SAVEAS_EXTENSION_TYPE" /> (<ph name="SAVEAS_EXTENSION_NAME" />.)</translation>
<translation id="8649597172973390955">המדף תמיד מוצג</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s‎</translation>
+<translation id="8685326675965865247">אפשר לחפש במכשיר, באפליקציות, בהגדרות ובאינטרנט. בעזרת מקשי החיצים ניתן לעבור בין האפליקציות.</translation>
<translation id="8725488761726303204">ועוד <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">בוצע</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{שעה}two{# שע}many{# שע}other{# שע}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ja.xtb b/chromium/ui/strings/translations/ui_strings_ja.xtb
index 832ab9ebddf..722f1fa07fe 100644
--- a/chromium/ui/strings/translations/ui_strings_ja.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ja.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">キャリブレーションが完了しました</translation>
<translation id="252373100621549798">不明なディスプレイ</translation>
<translation id="2545651323591713692">スヌーズ</translation>
+<translation id="2570734079541893434">設定を管理</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1時間}other{#時間}}</translation>
<translation id="2583543531130364912">タッチスクリーンのキャリブレーション</translation>
<translation id="2666092431469916601">一番上</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> から共有しました</translation>
+<translation id="271033894570825754">新しいファイル</translation>
<translation id="2743387203779672305">クリップボードにコピー</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />、<ph name="PRICE" /></translation>
<translation id="2803313416453193357">フォルダを開く</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">絵文字と記号</translation>
<translation id="5476505524087279545">チェックを外す</translation>
<translation id="547979256943495781">シェルフは右側にあります</translation>
+<translation id="5528053674512161860">デベロッパー UI モジュール(dev_ui)がインストールされていないため、ページを読み込めませんでした</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> システム</translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">左矢印キー</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">閉じる</translation>
<translation id="6119846243427417423">アクティブにする</translation>
<translation id="6129953537138746214">Space</translation>
+<translation id="6134259848159370930">デバイス、アプリ、設定、ウェブを検索します。</translation>
<translation id="6135826906199951471">Delete</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/秒</translation>
<translation id="6156262341071374681">すべてのアプリを表示</translation>
<translation id="6165508094623778733">詳細</translation>
+<translation id="6166852626429024716">デバイス、アプリ、設定、ウェブを検索...</translation>
<translation id="6264365405983206840">すべて選択(&amp;A)</translation>
<translation id="6351032674660237738">アプリの候補</translation>
<translation id="6364916375976753737">左にスクロール</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{残り 1 分}other{残り # 分}}</translation>
<translation id="7319740667687257810">ランチャー、一部のみ表示</translation>
-<translation id="7352651011704765696">問題が発生しました</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 分前}other{# 分前}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{残り 1 分}other{残り # 分}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537"><ph name="PAGE_NUMBER" /> ページの行 <ph name="ROW_NUMBER" />、列 <ph name="COLUMN_NUMBER" /> に移動しました。</translation>
<translation id="7879499977785298635">ブロックしない</translation>
<translation id="7907591526440419938">ファイルを開く</translation>
+<translation id="7952747673138230804">Chrome OS により新しいコンテンツの検索候補を表示します。使用状況データを共有するよう指定した場合のみ、検索候補の精度を向上させるために統計情報を送信します。<ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">コマンド</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{1 件以上の未読の通知}other{# 件以上の未読の通知}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1分}other{#分}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ファイル (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">シェルフは常に表示されます</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/秒</translation>
+<translation id="8685326675965865247">デバイス、アプリ、設定、ウェブを検索します。アプリに移動するには矢印キーを使用します。</translation>
<translation id="8725488761726303204">他 <ph name="NUMBER" /> 件</translation>
<translation id="8730621377337864115">完了</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1時間}other{#時間}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ka.xtb b/chromium/ui/strings/translations/ui_strings_ka.xtb
index e114b8a1408..d2070179304 100644
--- a/chromium/ui/strings/translations/ui_strings_ka.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ka.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">კალიბრაცია დასრულდა</translation>
<translation id="252373100621549798">უცნობი ეკრანი</translation>
<translation id="2545651323591713692">ჩაჩუმება</translation>
+<translation id="2570734079541893434">პარამეტრების მართვა</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 სთ-ში}other{# სთ-ში}}</translation>
<translation id="2583543531130364912">განახორციელეთ თქვენი სენსორული ეკრანის კალიბრაცია</translation>
<translation id="2666092431469916601">ზედა</translation>
<translation id="2701330563083355633">გაზიარებულია <ph name="DEVICE_NAME" />-დან</translation>
+<translation id="271033894570825754">ახალი</translation>
<translation id="2743387203779672305">კოპირება გაცვლის ბუფერში</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">გახსენით საქაღალდე</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji-ები და სიმბოლოები</translation>
<translation id="5476505524087279545">მონიშვნის მოხსნა</translation>
<translation id="547979256943495781">თარო მდებარეობს მარჯვენა ნაწილში</translation>
+<translation id="5528053674512161860">გვერდის ჩატვირთვა ვერ მოხერხდა, რადგან დეველოპერული UI-მოდული (dev_ui) დაინსტალირებული არ არის</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> სისტემა</translation>
<translation id="5583640892426849032">უკუშლა</translation>
<translation id="5613020302032141669">მარცხენა ისარი</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">დახურვა</translation>
<translation id="6119846243427417423">გააქტიურება</translation>
<translation id="6129953537138746214">ინტერვალი</translation>
+<translation id="6134259848159370930">წამოიწყეთ ძიება თქვენს მოწყობილობაში, აპებში, პარამეტრებსა და ვებში.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> ბაიტი/წმ</translation>
<translation id="6156262341071374681">გაშლა ყველა აპის გამოსაჩენად</translation>
<translation id="6165508094623778733">შეიტყვეთ მეტი</translation>
+<translation id="6166852626429024716">წამოიწყეთ ძიება თქვენს მოწყობილობაში, აპებში, პარამეტრებსა და ვებში...</translation>
<translation id="6264365405983206840">ყ&amp;ველას არჩევა</translation>
<translation id="6351032674660237738">აპების შემოთავაზებები</translation>
<translation id="6364916375976753737">გადაადგილება მარცხნივ</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{დარჩენილია 1 წთ}other{დარჩენილია # წთ}}</translation>
<translation id="7319740667687257810">გამშვები, ნაწილობრივი ხედი</translation>
-<translation id="7352651011704765696">რაღაც არასწორად წარიმართა</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 წუთის წინ}other{# წუთის წინ}}</translation>
<translation id="7389409599945284130">— <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{დარჩენილია 1 წუთი}other{დარჩენილია # წუთი}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">გადატანილია გვერდზე <ph name="PAGE_NUMBER" />, მწკრივზე <ph name="ROW_NUMBER" />, სვეტზე <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">არ დაიბლოკოს</translation>
<translation id="7907591526440419938">ფაილის გახსნა</translation>
+<translation id="7952747673138230804">Chrome OS გთავაზობთ ახალ კონტენტს. ხარისხის გაუმჯობესების მიზნით, გაგზავნის სტატისტიკას (მხოლოდ იმ შემთხვევაში, თუ არჩეული გაქვთ გამოყენების მონაცემების გაზიარება). <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{1-ზე მეტი წაუკითხავი შეტყობინება}other{#-ზე მეტი წაუკითხავი შეტყობინება}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 წუთში}other{# წუთში}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ფაილი (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">თარო ყოველთვის გამოჩნდება</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> კბ/წ</translation>
+<translation id="8685326675965865247">წამოიწყეთ ძიება თქვენს მოწყობილობაში, აპებში, პარამეტრებსა და ვებში. აპებში ნავიგაციისთვის გამოიყენეთ ისრიანი კლავიშები.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> სხვა</translation>
<translation id="8730621377337864115">მზადაა</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 სთ}other{# სთ}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_kk.xtb b/chromium/ui/strings/translations/ui_strings_kk.xtb
index db897f0f342..a9629a05813 100644
--- a/chromium/ui/strings/translations/ui_strings_kk.xtb
+++ b/chromium/ui/strings/translations/ui_strings_kk.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Калибрлеу аяқталды</translation>
<translation id="252373100621549798">Белгісіз дисплей</translation>
<translation id="2545651323591713692">Кідірту</translation>
+<translation id="2570734079541893434">Параметрлерді басқару</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 сағатта}other{# сағатта}}</translation>
<translation id="2583543531130364912">Сенсорлық экранды калибрлеңіз</translation>
<translation id="2666092431469916601">Жоғары</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> құрылғысынан бөлісілді.</translation>
+<translation id="271033894570825754">Жаңа</translation>
<translation id="2743387203779672305">Буферге көшіру</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Қалтаны ашу</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Эмодзи және таңбалар</translation>
<translation id="5476505524087279545">құсбелгіні алу</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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Жабу</translation>
<translation id="6119846243427417423">белсендіру</translation>
<translation id="6129953537138746214">Бос орын</translation>
+<translation id="6134259848159370930">Құрылғыдан, қолданбалардан, параметрлерден және интернеттен іздеңіз.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> Б/с</translation>
<translation id="6156262341071374681">Барлық қолданбаларды көрсету</translation>
<translation id="6165508094623778733">Толығырақ</translation>
+<translation id="6166852626429024716">Құрылғыдан, қолданбалардан, параметрлерден және интернеттен іздеу...</translation>
<translation id="6264365405983206840">&amp;Барлығын таңдау</translation>
<translation id="6351032674660237738">ҚОЛДАНБА ҰСЫНЫСТАРЫ</translation>
<translation id="6364916375976753737">Солға айналдыру</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 мин қалды}other{# мин қалды}}</translation>
<translation id="7319740667687257810">Launcher, жартылай көрініс</translation>
-<translation id="7352651011704765696">Бірнәрсе дұрыс емес</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 мин бұрын}other{# мин бұрын}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 минут қалды}other{# минут қалды}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Мына жерге жылжытылды: <ph name="PAGE_NUMBER" />-бет, <ph name="ROW_NUMBER" />-жол, <ph name="COLUMN_NUMBER" />-баған.</translation>
<translation id="7879499977785298635">Бөгемеу</translation>
<translation id="7907591526440419938">Файлды ашу</translation>
+<translation id="7952747673138230804">Қарап шығуыңыз үшін, Chrome OS браузері жаңа мазмұнды ұсынады. Пайдаланылуы туралы деректерді бөлісуді таңдасаңыз ғана, ұсыныстарды жақсарту үшін статистиканы жібереді. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Пәрмен</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{1-ден аса хабарландыру оқылмаған}other{#-ден аса хабарландыру оқылмаған}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 минутта}other{# минутта}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> файлы (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Сөре әрдайым көрсетіліп тұрады.</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> КБ/с</translation>
+<translation id="8685326675965865247">Құрылғыдан, қолданбалардан, параметрлерден және интернеттен іздеңіз. Қолданбадан қолданбаға өту үшін көрсеткі пернелерін пайдаланыңыз.</translation>
<translation id="8725488761726303204">+ тағы <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Дайын</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 сағ}other{# сағ}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_km.xtb b/chromium/ui/strings/translations/ui_strings_km.xtb
index 52dd9d009f8..75f5e85eaf2 100644
--- a/chromium/ui/strings/translations/ui_strings_km.xtb
+++ b/chromium/ui/strings/translations/ui_strings_km.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">ការ​ក្រិត​​ខ្នាត​ត្រូវបានបញ្ចប់</translation>
<translation id="252373100621549798">អេក្រង់មិនស្គាល់</translation>
<translation id="2545651323591713692">ផ្អាក</translation>
+<translation id="2570734079541893434">គ្រប់គ្រង​ការកំណត់</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 ម៉ោងទៀត}other{# ម៉ោងទៀត}}</translation>
<translation id="2583543531130364912">ក្រិត​អេក្រង់​ចុច​របស់​អ្នក</translation>
<translation id="2666092431469916601">ខាងលើ</translation>
<translation id="2701330563083355633">បាន​ចែករំលែក​ពី <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">ថ្មី</translation>
<translation id="2743387203779672305">ចម្លងទៅផ្ទាំងឃ្លីបបត</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">បើកថតឯកសារ</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">រូប​អារម្មណ៍ និង​និមិត្តសញ្ញា</translation>
<translation id="5476505524087279545">ដកធីក</translation>
<translation id="547979256943495781">ធ្នើ​នៅខាង​ស្ដាំ</translation>
+<translation id="5528053674512161860">ការផ្ទុក​ទំព័រ​មិនបានសម្រេច​ទេ ដោយសារ​មិនបានដំឡើង​ម៉ូឌុល UI អ្នកអភិវឌ្ឍន៍ (dev_ui)</translation>
<translation id="5574202486608032840">ប្រព័ន្ធ <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">ព្រួញខាងឆ្វេង</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">បិទ</translation>
<translation id="6119846243427417423">ធ្វើសកម្មភាព</translation>
<translation id="6129953537138746214">ដកឃ្លា</translation>
+<translation id="6134259848159370930">ស្វែងរក​ឧបករណ៍ កម្មវិធី ការកំណត់ និង​បណ្ដាញ​របស់អ្នក​។</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/វិនាទី</translation>
<translation id="6156262341071374681">ពង្រីកទៅកម្មវិធីទាំងអស់</translation>
<translation id="6165508094623778733">ស្វែងយល់​បន្ថែម</translation>
+<translation id="6166852626429024716">ស្វែងរក​ឧបករណ៍ កម្មវិធី ការកំណត់ បណ្ដាញ​របស់អ្នក...</translation>
<translation id="6264365405983206840">ជ្រើសរើសទាំងអស់</translation>
<translation id="6351032674660237738">ការណែនាំកម្មវិធី</translation>
<translation id="6364916375976753737">ទាញទៅឆ្វេង</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{នៅសល់ 1 នាទីទៀត}other{នៅសល់ # នាទីទៀត}}</translation>
<translation id="7319740667687257810">កម្មវិធី​ចាប់ផ្ដើម ទិដ្ឋភាព​ដោយផ្នែក</translation>
-<translation id="7352651011704765696">មានបញ្ហាអ្វីមួយកើតឡើង</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 នាទីមុន}other{# នាទីមុន}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{នៅសល់ 1 នាទីទៀត}other{នៅសល់ # នាទីទៀត}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">បានផ្លាស់ទី​ទៅទំព័រទី <ph name="PAGE_NUMBER" /> ជួរដេកទី <ph name="ROW_NUMBER" /> ជួរឈរទី <ph name="COLUMN_NUMBER" />។</translation>
<translation id="7879499977785298635">កុំទប់ស្កាត់</translation>
<translation id="7907591526440419938">បើកឯកសារ</translation>
+<translation id="7952747673138230804">Chrome OS បង្ហាញការណែនាំខ្លឹមសារថ្មី សម្រាប់ធ្វើការរុករក។ ផ្ញើ​ស្ថិតិ ដើម្បីកែលម្អគុណភាព ប្រសិនបើអ្នកបានជ្រើសរើស​ចែករំលែកទិន្នន័យ​ប្រើប្រាស់តែប៉ុណ្ណោះ។ <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">បញ្ជា</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{ការជូនដំណឹង​ដែលមិនទាន់អាន​ច្រើនជាង 1}other{ការជូនដំណឹង​ដែលមិនទាន់អាន​ច្រើនជាង #}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 នាទីទៀត}other{# នាទីទៀត}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ឯកសារ (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">បង្ហាញធ្នើ​ជានិច្ច</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/វិនាទី</translation>
+<translation id="8685326675965865247">ស្វែងរក​ឧបករណ៍ កម្មវិធី ការកំណត់ និង​បណ្ដាញ​របស់អ្នក។ សូមប្រើ​គ្រាប់ចុច​ព្រួញ ដើម្បីរុករក​កម្មវិធី​របស់អ្នក។</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> ទៀត</translation>
<translation id="8730621377337864115">រួចរាល់</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 ម៉}other{# ម៉}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_kn.xtb b/chromium/ui/strings/translations/ui_strings_kn.xtb
index 8573b7d1cc9..23e9dbc4eea 100644
--- a/chromium/ui/strings/translations/ui_strings_kn.xtb
+++ b/chromium/ui/strings/translations/ui_strings_kn.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">ಮಾಪನಾಂಕವು ಪೂರ್ಣಗೊಂಡಿದೆ</translation>
<translation id="252373100621549798">ಅಪರಿಚಿತ ಡಿಸ್‌ಪ್ಲೇ</translation>
<translation id="2545651323591713692">ಸ್ನೂಜ್ ಮಾಡಿ</translation>
+<translation id="2570734079541893434">ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1ಗಂ. ಯಲ್ಲಿ}one{#ಗಂ. ಗಳಲ್ಲಿ}other{#ಗಂ. ಗಳಲ್ಲಿ}}</translation>
<translation id="2583543531130364912">ನಿಮ್ಮ ಟಚ್‌ಸ್ಕ್ರೀನ್ ಕ್ಯಾಲಿಬ್ರೇಟ್ ಮಾಡಿ</translation>
<translation id="2666092431469916601">ಮೇಲೆ</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> ನಿಂದ ಹಂಚಿಕೊಳ್ಳಲಾಗಿದೆ</translation>
+<translation id="271033894570825754">ಹೊಸತು</translation>
<translation id="2743387203779672305">ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ನಕಲಿಸಿ</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">ಫೋಲ್ಡರ್ ತೆರೆಯಿರಿ</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">ಎಮೋಜಿ ಮತ್ತು ಸಂಕೇತಗಳು</translation>
<translation id="5476505524087279545">ಪರೀಕ್ಷಿಸಬೇಡಿ</translation>
<translation id="547979256943495781">ಪರದೆಯ ಬಲಭಾಗದಲ್ಲಿ ಶೆಲ್ಫ್ ಇದೆ</translation>
+<translation id="5528053674512161860">ಡೆವಲಪರ್ UI ಮಾಡ್ಯುಲ್‌ (dev_ui) ಅನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿಲ್ಲದಿರುವುದರಿಂದ ಪುಟ ಲೋಡ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> ಸಿಸ್ಟಂ</translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">ಎಡ ಬಾಣದ ಗುರುತು</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">ಮುಚ್ಚಿರಿ</translation>
<translation id="6119846243427417423">ಸಕ್ರಿಯಗೊಳಿಸು</translation>
<translation id="6129953537138746214">ಸ್ಪೇಸ್</translation>
+<translation id="6134259848159370930">ನಿಮ್ಮ ಸಾಧನ, ಆ್ಯಪ್‌ಗಳು, ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ನಲ್ಲಿ ಹುಡುಕಿ.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ವಿಸ್ತೃತಗೊಳಿಸಿ</translation>
<translation id="6165508094623778733">ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</translation>
+<translation id="6166852626429024716">ನಿಮ್ಮ ಸಾಧನ, ಆ್ಯಪ್‌ಗಳು, ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ನಲ್ಲಿ ಹುಡುಕಿ...</translation>
<translation id="6264365405983206840">&amp;ಎಲ್ಲ ಆಯ್ಕೆ ಮಾಡಿ</translation>
<translation id="6351032674660237738">ಅಪ್ಲಿಕೇಶನ್ ಸಲಹೆಗಳು</translation>
<translation id="6364916375976753737">ಎಡಕ್ಕೆ ಸ್ಕ್ರೋಲ್ ಮಾಡಿ</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 ನಿಮಿಷ ಬಾಕಿ ಉಳಿದಿದೆ}one{# ನಿಮಿಷಗಳು ಬಾಕಿ ಉಳಿದಿವೆ}other{# ನಿಮಿಷಗಳು ಬಾಕಿ ಉಳಿದಿವೆ}}</translation>
<translation id="7319740667687257810">ಲಾಂಚರ್, ಭಾಗಶಃ ವೀಕ್ಷಣೆ</translation>
-<translation id="7352651011704765696">ಯಾವುದೋ ತಪ್ಪು ಸಂಭವಿಸಿದೆ</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 ನಿಮಿ ಹಿಂದೆ}one{# ನಿಮಿಷಗಳ ಹಿಂದೆ}other{# ನಿಮಿಷಗಳ ಹಿಂದೆ}}</translation>
<translation id="7389409599945284130"><ph name="MESSAGE" /> -</translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 ನಿಮಿಷ ಉಳಿದಿದೆ}one{# ನಿಮಿಷಗಳು ಉಳಿದಿವೆ}other{# ನಿಮಿಷಗಳು ಉಳಿದಿವೆ}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">ಪುಟ <ph name="PAGE_NUMBER" />, ಸಾಲು <ph name="ROW_NUMBER" />, ಕಾಲಮ್ <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">ನಿರ್ಬಂಧಿಸಬೇಡಿ</translation>
<translation id="7907591526440419938">ಫೈಲ್ ತೆರೆಯಿರಿ</translation>
+<translation id="7952747673138230804">ಹೊಸ ವಿಷಯವನ್ನು ಅನ್ವೇಷಿಸಲು Chrome OS ಸಲಹೆಗಳನ್ನು ತೋರಿಸುತ್ತದೆ. ಬಳಕೆಯ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ನೀವು ಆರಿಸಿದ್ದರೆ ಮಾತ್ರ ಗುಣಮಟ್ಟವನ್ನು ಸುಧಾರಿಸಲು ಅಂಕಿಅಂಶಗಳನ್ನು ಕಳುಹಿಸುತ್ತದೆ. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">ಕಮಾಂಡ್</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{1 ಕ್ಕಿಂತ ಹೆಚ್ಚು ಓದದಿರುವ ಅಧಿಸೂಚನೆ}one{# ಕ್ಕಿಂತ ಹೆಚ್ಚು ಓದದಿರುವ ಅಧಿಸೂಚನೆಗಳು}other{# ಕ್ಕಿಂತ ಹೆಚ್ಚು ಓದದಿರುವ ಅಧಿಸೂಚನೆಗಳು}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1ನಿ ದಲ್ಲಿ}one{#ನಿ ಗಳಲ್ಲಿ}other{#ನಿ ಗಳಲ್ಲಿ}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ಫೈಲ್ (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">ಶೆಲ್ಪ್ ಯಾವಾಗಲೂ ತೋರಿಸಲಾಗಿದೆ</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s </translation>
+<translation id="8685326675965865247">ನಿಮ್ಮ ಸಾಧನ, ಆ್ಯಪ್‌ಗಳು, ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ನಲ್ಲಿ ಹುಡುಕಿ. ನಿಮ್ಮ ಆ್ಯಪ್‌ಗಳನ್ನು ನ್ಯಾವಿಗೇಟ್ ಮಾಡಲು ಬಾಣದ ಗುರುತಿನ ಕೀಗಳನ್ನು ಬಳಸಿ.</translation>
<translation id="8725488761726303204">+ <ph name="NUMBER" /> ಇನ್ನಷ್ಟು</translation>
<translation id="8730621377337864115">ಮುಗಿದಿದೆ</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1ಗಂ}one{#ಗಂ}other{#ಗಂ}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ko.xtb b/chromium/ui/strings/translations/ui_strings_ko.xtb
index 50e8b72cfde..4b9ecdfb2a7 100644
--- a/chromium/ui/strings/translations/ui_strings_ko.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ko.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">보정이 완료되었습니다.</translation>
<translation id="252373100621549798">알 수 없는 디스플레이</translation>
<translation id="2545651323591713692">알림 일시 중지</translation>
+<translation id="2570734079541893434">설정 관리하기</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1시간 후}other{#시간 후}}</translation>
<translation id="2583543531130364912">터치스크린 보정</translation>
<translation id="2666092431469916601">맨 위</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" />에서 공유함</translation>
+<translation id="271033894570825754">새 파일</translation>
<translation id="2743387203779672305">클립보드로 복사</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">폴더 열기</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">그림 이모티콘 &amp;&amp; 기호</translation>
<translation id="5476505524087279545">선택 해제</translation>
<translation id="547979256943495781">오른쪽에 실행기 표시</translation>
+<translation id="5528053674512161860">개발자 UI 모듈(dev_ui)이 설치되지 않아 페이지를 로드할 수 없습니다</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> 시스템</translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">왼쪽 화살표</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">닫기</translation>
<translation id="6119846243427417423">활성화</translation>
<translation id="6129953537138746214">Space</translation>
+<translation id="6134259848159370930">기기, 앱, 설정, 웹에서 검색합니다.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" />B/s</translation>
<translation id="6156262341071374681">펼쳐서 모든 앱 보기</translation>
<translation id="6165508094623778733">자세히 알아보기</translation>
+<translation id="6166852626429024716">기기, 앱, 설정, 웹에서 검색...</translation>
<translation id="6264365405983206840">모두 선택(&amp;A)</translation>
<translation id="6351032674660237738">앱 추천</translation>
<translation id="6364916375976753737">왼쪽으로 스크롤</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1분 남음}other{#분 남음}}</translation>
<translation id="7319740667687257810">런처, 부분 뷰</translation>
-<translation id="7352651011704765696">문제가 발생한 경우</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1분 전}other{#분 전}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1분 남음}other{#분 남음}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537"><ph name="PAGE_NUMBER" />페이지, <ph name="ROW_NUMBER" />행, <ph name="COLUMN_NUMBER" />열로 이동합니다.</translation>
<translation id="7879499977785298635">차단하지 않음</translation>
<translation id="7907591526440419938">파일 열기</translation>
+<translation id="7952747673138230804">Chrome OS에서 탐색할 새 추천 콘텐츠를 표시합니다. 사용 데이터를 공유하기로 선택한 경우에만 추천 기능 개선을 위해 통계를 전송합니다. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{읽지 않은 알림이 1개 이상 있음}other{읽지 않은 알림이 #개 이상 있음}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1분 후}other{#분 후}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> 파일(.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">실행기 항상 표시</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" />KB/초</translation>
+<translation id="8685326675965865247">기기, 앱, 설정, 웹에서 검색합니다. 앱에서 탐색하려면 화살표 키를 사용하세요.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" />개</translation>
<translation id="8730621377337864115">완료</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1시간}other{#시간}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ky.xtb b/chromium/ui/strings/translations/ui_strings_ky.xtb
index 5f0b2739254..a76448cb702 100644
--- a/chromium/ui/strings/translations/ui_strings_ky.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ky.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Калибрлөө аяктады</translation>
<translation id="252373100621549798">Белгисиз дисплей</translation>
<translation id="2545651323591713692">Тындыруу</translation>
+<translation id="2570734079541893434">Жөндөөлөрдү башкаруу</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 с. кийин}other{# с. кийин}}</translation>
<translation id="2583543531130364912">Сенсордук экраныңызды калибрлеп алыңыз</translation>
<translation id="2666092431469916601">Өйдө</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> аркылуу бөлүшүлдү</translation>
+<translation id="271033894570825754">Жаңы</translation>
<translation id="2743387203779672305">Алмашуу буферине көчүрүү</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Куржунду ачуу</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Быйтыкчалар жана Символдор</translation>
<translation id="5476505524087279545">белгилебөө</translation>
<translation id="547979256943495781">Текче экрандын оң жагында</translation>
+<translation id="5528053674512161860">Иштеп чыгаруучунун колдонуучу интерфейсинин модулу орнотулган эмес, андыктан барак жүктөлбөй калды</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> тутуму</translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Сол жебе</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Жабуу</translation>
<translation id="6119846243427417423">жандыруу</translation>
<translation id="6129953537138746214">Боштук</translation>
+<translation id="6134259848159370930">Түзмөктөн, колдонмолордон, жөндөөлөрдөн жана Интернеттен издеңиз.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> Б/сек</translation>
<translation id="6156262341071374681">Бардык колдонмолорду көрсөтүү</translation>
<translation id="6165508094623778733">Кошумча маалымат</translation>
+<translation id="6166852626429024716">Түзмөктөн, колдонмолордон, жөндөөлөрдөн жана Интернеттен издеңиз...</translation>
<translation id="6264365405983206840">&amp;Баарын тандоо</translation>
<translation id="6351032674660237738">СУНУШТАЛГАН КОЛДОНМОЛОР</translation>
<translation id="6364916375976753737">Солго сыдырып кароо</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 мүн. калды}other{# мүн. калды}}</translation>
<translation id="7319740667687257810">Жүргүзгүч, жарым-жартылай көрүнүш</translation>
-<translation id="7352651011704765696">Бир жерден ката кетти</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 мүн. мурун}other{# мүн. мурун}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 мүнөт калды}other{# мүнөт калды}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537"><ph name="PAGE_NUMBER" />-бетке, <ph name="ROW_NUMBER" />-сапка, <ph name="COLUMN_NUMBER" />-тилкеге жылдырылды.</translation>
<translation id="7879499977785298635">Бөгөттөлбөсүн</translation>
<translation id="7907591526440419938">Файлды ачуу</translation>
+<translation id="7952747673138230804">Chrome OS изилдөө үчүн жаңы мазмундарды сунуштайт. Сапатын жакшыртуу максатында колдонуу статистикаңыз жөнөтүлөт (статистиканы бөлүшүүнү тандаган болсоңуз гана). <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Буйрук</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{1 ашык окулбаган билдирме}other{# ашык окулбаган билдирме}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 мүн. кийин}other{# мүн. кийин}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> файл (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Текче ар дайым көрсөтүлүп турат</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> Кб/сек</translation>
+<translation id="8685326675965865247">Түзмөктөн, колдонмолордон, жөндөөлөрдөн жана Интернеттен издеңиз. Колдонмолоруңузда чабыттоо үчүн жебе баскычтарын пайдаланыңыз.</translation>
<translation id="8725488761726303204">дагы <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Бүттү</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 с.}other{# с.}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_lo.xtb b/chromium/ui/strings/translations/ui_strings_lo.xtb
index 64c3d3fa0ae..f124f948571 100644
--- a/chromium/ui/strings/translations/ui_strings_lo.xtb
+++ b/chromium/ui/strings/translations/ui_strings_lo.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">ການປັບຕັ້ງຄ່າສຳເລັດແລ້ວ</translation>
<translation id="252373100621549798">ການສະແດງທີ່ບໍ່ຮູ້ຈັກ</translation>
<translation id="2545651323591713692">ເລື່ອນໄປກ່ອນ</translation>
+<translation id="2570734079541893434">ຈັດການການຕັ້ງຄ່າ</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{ໃນ 1 ຊມ}other{ໃນ # ຊມ}}</translation>
<translation id="2583543531130364912">ປັບຕັ້ງຄ່າໜ້າຈໍສຳຜັດຂອງທ່ານ</translation>
<translation id="2666092431469916601">ດ້ານເທິງ</translation>
<translation id="2701330563083355633">ແບ່ງປັນຈາກ <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">ໃຫມ່</translation>
<translation id="2743387203779672305">ກັອບປີ້ໄປໃສ່ຄລິບບອດ</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">ເປີດ​ໂຟລເດີ</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">ອີໂມຈິ ແລະ ສັນຍາລັກ</translation>
<translation id="5476505524087279545">ຖອນໝາຍຕິກ</translation>
<translation id="547979256943495781">ຊັ້ນວາງຢູ່ເບື້ອງຂວາ</translation>
+<translation id="5528053674512161860">ໂຫຼດໜ້າບໍ່ສຳເລັດ ເພາະວ່າບໍ່ໄດ້ຕິດຕັ້ງໂມດູນ UI ຂອງນັກພັດທະນາ (dev_ui)</translation>
<translation id="5574202486608032840">ລະບົບ <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">ລຶບຄືນຫຼັງ</translation>
<translation id="5613020302032141669">ລູກສອນຊ້າຍ</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">ປິດ</translation>
<translation id="6119846243427417423">ເປີດໃຊ້ງານ</translation>
<translation id="6129953537138746214">ຍະຫວ່າງ</translation>
+<translation id="6134259848159370930">ຊອກຫາໃນອຸປະກອນ, ແອັບ, ການຕັ້ງຄ່າ ແລະ ເວັບ.</translation>
<translation id="6135826906199951471">ລຶບ</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> ໄບ້ທ໌/ວິນາທີ</translation>
<translation id="6156262341071374681">ຂະຫຍາຍກວມເອົາທຸກແອັບ</translation>
<translation id="6165508094623778733">ສຶກສາ​ເພີ່ມ​ເຕີມ</translation>
+<translation id="6166852626429024716">ຊອກຫາອຸປະກອນ, ແອັບ, ການຕັ້ງຄ່າ, ເວັບຂອງທ່ານ...</translation>
<translation id="6264365405983206840">ເລືອກ​ທັງ​ຫມົດ</translation>
<translation id="6351032674660237738">ການແນະນຳແອັບ</translation>
<translation id="6364916375976753737">ເລື່ອນທາງຊ້າຍ</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{ຍັ​ງ​ເຫຼືອ 1 ນາ​ທີ}other{ຍັງ​ເຫຼືອ # ນາ​ທີ}}</translation>
<translation id="7319740667687257810">ຕົວເປີດນຳໃຊ້, ມຸມມອງບາງສ່ວນ</translation>
-<translation id="7352651011704765696">ມີ​ບາງ​ອັນ​ຜິດ​ພາດ</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 ນາ​ທີ​ກ່ອນ​​ນີ້}other{# ນາ​ທີ​ກ່ອນ​ນີ້}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{ຍັງ​ເຫຼືອ 1 ນາ​ທີ​}other{ຍັງ​ເຫຼືອ # ນາ​ທີ}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">ຍ້າຍໜ້າ <ph name="PAGE_NUMBER" />, ແຖວ <ph name="ROW_NUMBER" />, ຖັນ <ph name="COLUMN_NUMBER" /> ແລ້ວ.</translation>
<translation id="7879499977785298635">ບໍ່ບລັອກ</translation>
<translation id="7907591526440419938">ເປີດ​ໄຟລ​໌​</translation>
+<translation id="7952747673138230804">Chrome OS ຈະສະແດງການແນະນຳເນື້ອຫາໃໝ່ໃຫ້ສຳຫຼວດເບິ່ງ. ສົ່ງສະຖິຕິເພື່ອປັບປຸງຄຸນນະພາບພຽງແຕ່ຖ້າທ່ານໄດ້ເລືອກແບ່ງປັນຂໍ້ມູນການນຳໃຊ້ເທົ່ານັ້ນ. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">ຄຳສັ່ງ</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{ມີການແຈ້ງເຕືອນທີ່ບໍ່ທັນໄດ້ອ່ານຫຼາຍກວ່າ 1 ລາຍການ}other{ມີການແຈ້ງເຕືອນທີ່ບໍ່ທັນໄດ້ອ່ານຫຼາຍກວ່າ # ລາຍການ}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{ໃນ 1 ນທ}other{ໃນ # ນທ}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">ໄຟລ໌ <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">ສະແດງຊັ້ນວາງທຸກເທື່ອ</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/ວິນາທີ</translation>
+<translation id="8685326675965865247">ຊອກຫາໃນອຸປະກອນ, ແອັບ, ການຕັ້ງຄ່າ ແລະ ເວັບຂອງທ່ານ. ໃຊ້ປຸ່ມລູກສອນເພື່ອນຳທາງໃນແອັບຂອງທ່ານ.</translation>
<translation id="8725488761726303204">ອີກ +<ph name="NUMBER" /></translation>
<translation id="8730621377337864115">ສໍາເລັດ</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 ຊົ່ວໂມງ}other{# ຊົ່ວໂມງ}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_lt.xtb b/chromium/ui/strings/translations/ui_strings_lt.xtb
index d46786abc41..490295e3316 100644
--- a/chromium/ui/strings/translations/ui_strings_lt.xtb
+++ b/chromium/ui/strings/translations/ui_strings_lt.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibravimas baigtas</translation>
<translation id="252373100621549798">Nežinoma pateiktis</translation>
<translation id="2545651323591713692">Atidėti</translation>
+<translation id="2570734079541893434">Tvarkyti nustatymus</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{po 1 val.}one{po # val.}few{po # val.}many{po # val.}other{po # val.}}</translation>
<translation id="2583543531130364912">Jutiklinio ekrano kalibravimas</translation>
<translation id="2666092431469916601">Į viršų</translation>
<translation id="2701330563083355633">Bendrinta iš „<ph name="DEVICE_NAME" />“</translation>
+<translation id="271033894570825754">Naujiena</translation>
<translation id="2743387203779672305">Kopijuoti į iškarpinę</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Atidaryti aplanką</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Jaustukai ir simboliai</translation>
<translation id="5476505524087279545">Nuimti žymėjimą</translation>
<translation id="547979256943495781">Lentyna dešinėje</translation>
+<translation id="5528053674512161860">Nepavyko įkelti puslapio, nes neįdiegtas kūrėjo NS modulis (dev_ui)</translation>
<translation id="5574202486608032840">„<ph name="IDS_SHORT_PRODUCT_OS_NAME" />“ sistema</translation>
<translation id="5583640892426849032">Grįžties klavišas</translation>
<translation id="5613020302032141669">Rodyklė į kairę</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Uždaryti</translation>
<translation id="6119846243427417423">suaktyvinti</translation>
<translation id="6129953537138746214">Tarpas</translation>
+<translation id="6134259848159370930">Ieškokite įrenginyje, programose, nustatymuose ir žiniatinklyje.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Išskleisti, kad būtų rodomos visos programos</translation>
<translation id="6165508094623778733">Sužinokite daugiau</translation>
+<translation id="6166852626429024716">Ieškokite įrenginyje, programose, nustatymuose, žiniatinklyje...</translation>
<translation id="6264365405983206840">Pasirinkti &amp;viską</translation>
<translation id="6351032674660237738">PROGRAMŲ PASIŪLYMAI</translation>
<translation id="6364916375976753737">Slinkti į kairę</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Liko 1 min.}one{Liko # min.}few{Liko # min.}many{Liko # min.}other{Liko # min.}}</translation>
<translation id="7319740667687257810">Paleidimo priemonė, dalinis rodinys</translation>
-<translation id="7352651011704765696">Kažkas negerai</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Prieš 1 min.}one{Prieš # min.}few{Prieš # min.}many{Prieš # min.}other{Prieš # min.}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Liko 1 minutė}one{Liko # minutė}few{Liko # minutės}many{Liko # minutės}other{Liko # minučių}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Perkelta į <ph name="PAGE_NUMBER" /> puslapį, <ph name="ROW_NUMBER" /> eilutę, <ph name="COLUMN_NUMBER" /> stulpelį.</translation>
<translation id="7879499977785298635">Neblokuoti</translation>
<translation id="7907591526440419938">Atidaryti failą</translation>
+<translation id="7952747673138230804">„Chrome“ OS rodomi naujo turinio, kurį galite naršyti, pasiūlymai. Statistika siunčiama padedant tobulinti kokybę, tik jei pasirinkote bendrinti naudojimo duomenis. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Komanda</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Daugiau nei 1 neskaitytas pranešimas}one{Daugiau nei # neskaitytas pranešimas}few{Daugiau nei # neskaityti pranešimai}many{Daugiau nei # neskaityto pranešimo}other{Daugiau nei # neskaitytų pranešimų}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{po 1 min.}one{po # min.}few{po # min.}many{po # min.}other{po # min.}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> failas (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Lentyna visada rodoma</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB per sek.</translation>
+<translation id="8685326675965865247">Ieškokite įrenginyje, programose, nustatymuose ir žiniatinklyje. Naudodami rodyklių klavišus naršykite programas.</translation>
<translation id="8725488761726303204">Dar <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Atlikta</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 val.}one{# val.}few{# val.}many{# val.}other{# val.}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_lv.xtb b/chromium/ui/strings/translations/ui_strings_lv.xtb
index a9eca465e8c..9e0ab437246 100644
--- a/chromium/ui/strings/translations/ui_strings_lv.xtb
+++ b/chromium/ui/strings/translations/ui_strings_lv.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibrēšana ir pabeigta.</translation>
<translation id="252373100621549798">Nezināms displejs</translation>
<translation id="2545651323591713692">Atlikt</translation>
+<translation id="2570734079541893434">Pārvaldīt iestatījumus</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{pēc 1 h}zero{pēc # h}one{pēc # h}other{pēc # h}}</translation>
<translation id="2583543531130364912">Skārienekrāna kalibrēšana</translation>
<translation id="2666092431469916601">Augša</translation>
<translation id="2701330563083355633">Kopīgota no: <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Jauns</translation>
<translation id="2743387203779672305">Kopēt starpliktuvē</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Atvērt mapi</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emocijzīmes un simboli</translation>
<translation id="5476505524087279545">neprbaudt</translation>
<translation id="547979256943495781">Plaukts tiek rādīts labajā pusē</translation>
+<translation id="5528053674512161860">Neizdevās ielādēt lapu, jo nav instalēts izstrādātāja lietotāja saskarnes modulis (dev_ui)</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> sistēma</translation>
<translation id="5583640892426849032">Atkāpšanās taustiņš</translation>
<translation id="5613020302032141669">Kreisā bulta</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Aizvērt</translation>
<translation id="6119846243427417423">aktivizt</translation>
<translation id="6129953537138746214">Atstarpe</translation>
+<translation id="6134259848159370930">Varat meklēt ierīcē, lietotnēs, iestatījumos un tīmeklī.</translation>
<translation id="6135826906199951471">Dzēst</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Skatīt visas lietotnes</translation>
<translation id="6165508094623778733">Uzzināt vairāk</translation>
+<translation id="6166852626429024716">Varat meklēt ierīcē, lietotnēs, iestatījumos, tīmeklī…</translation>
<translation id="6264365405983206840">&amp;Atlasīt visu</translation>
<translation id="6351032674660237738">LIETOTŅU IETEIKUMI</translation>
<translation id="6364916375976753737">Ritināt pa kreisi</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Atlikusi 1 min}zero{Atlikušas # min}one{Atlikusi # min}other{Atlikušas # min}}</translation>
<translation id="7319740667687257810">Palaišanas programma, daļējs skats</translation>
-<translation id="7352651011704765696">Radās problēma</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Pirms 1 min}zero{Pirms # min}one{Pirms # min}other{Pirms # min}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Atlikusi 1 minūte}zero{Atlikušas # minūtes}one{Atlikusi # minūte}other{Atlikušas # minūtes}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Pārvietota uz <ph name="PAGE_NUMBER" />. lapu, <ph name="ROW_NUMBER" />. rindu, <ph name="COLUMN_NUMBER" />. sleju.</translation>
<translation id="7879499977785298635">Nebloķēt</translation>
<translation id="7907591526440419938">Atvērt failu</translation>
+<translation id="7952747673138230804">Chrome OS rāda ieteikumus jaunam pieejamajam saturam. Statistikas dati kvalitātes uzlabošanai tiek sūtīti tikai tad, ja esat piekritis kopīgot lietojuma datus. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Komandtaustiņš</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Vairāk nekā 1 nelasīts paziņojums}zero{Vairāk nekā # nelasīti paziņojumi}one{Vairāk nekā # nelasīts paziņojums}other{Vairāk nekā # nelasīti paziņojumi}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{pēc 1 min}zero{pēc # min}one{pēc # min}other{pēc # min}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Fails <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Plaukts tiek rādīts vienmēr</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Varat meklēt savā ierīcē, lietotnēs, iestatījumos un tīmeklī. Lai pārvietotos lietotnēs, izmantojiet bulttaustiņus.</translation>
<translation id="8725488761726303204">vēl <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Gatavs</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}zero{# h}one{# h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_mk.xtb b/chromium/ui/strings/translations/ui_strings_mk.xtb
index c021fee91cc..d3f6c8ba29b 100644
--- a/chromium/ui/strings/translations/ui_strings_mk.xtb
+++ b/chromium/ui/strings/translations/ui_strings_mk.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Калибрацијата е завршена</translation>
<translation id="252373100621549798">Непознат екран</translation>
<translation id="2545651323591713692">Одложи</translation>
+<translation id="2570734079541893434">Управувајте со поставките</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{за 1 ч.}one{за # ч.}other{за # ч.}}</translation>
<translation id="2583543531130364912">Калибрирање на екранот на допир</translation>
<translation id="2666092431469916601">Горе</translation>
<translation id="2701330563083355633">Споделено од <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Ново</translation>
<translation id="2743387203779672305">Копирај на клип-табла</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Отвори папка</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Емотикони и симболи</translation>
<translation id="5476505524087279545">поништи избор</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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Затвори</translation>
<translation id="6119846243427417423">активирај</translation>
<translation id="6129953537138746214">Празно место</translation>
+<translation id="6134259848159370930">Пребарувајте низ уредот, апликациите, поставките и на интернет.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Прошири за приказ на сите апликации</translation>
<translation id="6165508094623778733">Дознајте повеќе</translation>
+<translation id="6166852626429024716">Пребарувајте низ уредот, апликациите, поставките, на интернет…</translation>
<translation id="6264365405983206840">Избери ги &amp;сите</translation>
<translation id="6351032674660237738">ПРЕДЛОЗИ ЗА АПЛИКАЦИИ</translation>
<translation id="6364916375976753737">Лизгај налево</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Преостана 1 мин.}one{Преостана # мин.}other{Преостанаа # мин.}}</translation>
<translation id="7319740667687257810">Стартер, делумен приказ</translation>
-<translation id="7352651011704765696">Нешто не е во ред</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Пред 1 мин.}one{Пред # мин.}other{Пред # мин.}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Преостана 1 минута}one{Преостана # минута}other{Преостанаа # минути}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Преместена на страница <ph name="PAGE_NUMBER" />, ред <ph name="ROW_NUMBER" />, колона <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Не блокирај</translation>
<translation id="7907591526440419938">Отвори датотека</translation>
+<translation id="7952747673138230804">Chrome OS прикажува предлози за нови содржини за разгледување. Статистикa за подобрување на квалитетот се испраќа само ако сте одбрале споделување на податоците за користење. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Наредба</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Повеќе од 1 непрочитано известување}one{Повеќе од # непрочитано известување}other{Повеќе од # непрочитани известувања}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{за 1 м.}one{за # м.}other{за # м.}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Датотека <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Полицата е секогаш прикажана</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/с</translation>
+<translation id="8685326675965865247">Пребарувајте низ уредот, апликациите, поставките и на интернет. Користете ги копчињата со стрелки за навигација низ апликациите.</translation>
<translation id="8725488761726303204">Уште <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Готово</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 ч.}one{# ч.}other{# ч.}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ml.xtb b/chromium/ui/strings/translations/ui_strings_ml.xtb
index 9dcea7f76bd..2799f9051a3 100644
--- a/chromium/ui/strings/translations/ui_strings_ml.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ml.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">കാലിബറേഷൻ പൂർത്തിയായി</translation>
<translation id="252373100621549798">അജ്ഞാത പ്രദർശനം</translation>
<translation id="2545651323591713692">സ്‌നൂസ് ചെയ്യുക</translation>
+<translation id="2570734079541893434">ക്രമീകരണം മാനേജ് ചെയ്യുക</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{ഒരു മണിക്കൂറിനുള്ളിൽ}other{# മണിക്കൂറിനുള്ളിൽ}}</translation>
<translation id="2583543531130364912">നിങ്ങളുടെ ടച്ച്സ്‌ക്രീൻ കാലിബറേറ്റ് ചെയ്യുക</translation>
<translation id="2666092431469916601">മുകളിലേക്ക്</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> ഉപകരണത്തിൽ നിന്ന് പങ്കിട്ടു</translation>
+<translation id="271033894570825754">പുതിയത്</translation>
<translation id="2743387203779672305">ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തുക</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">ഫോൾഡർ തുറക്കുക</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">ഇമോജിയും ചിഹ്നങ്ങളും</translation>
<translation id="5476505524087279545">അണ്‍ചെക്ക് ചെയ്യുക</translation>
<translation id="547979256943495781">സ്‌ക്രീനിൻ്റെ വലതുഭാഗത്താണ് ഷെൽഫ്</translation>
+<translation id="5528053674512161860">ഡെവലപ്പര്‍ UI മൊഡ്യൂള്‍ (dev_ui) ഇൻസ്‌റ്റാൾ ചെയ്‌തിട്ടില്ലാത്തതിനാൽ, പേജ് ലോഡ് ചെയ്യാനായില്ല</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> സിസ്‌റ്റം</translation>
<translation id="5583640892426849032">ബാക്ക്‌സ്പെയ്‌സ്</translation>
<translation id="5613020302032141669">ഇടത് ആരോ അടയാളം</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">അടയ്ക്കുക</translation>
<translation id="6119846243427417423">ആക്റ്റിവേറ്റ് ചെയ്യുക</translation>
<translation id="6129953537138746214">സ്പെയ്സ്</translation>
+<translation id="6134259848159370930">നിങ്ങളുടെ ഉപകരണവും ആപ്പുകളും ക്രമീകരണവും വെബും തിരയുക.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">എല്ലാ ആപ്പുകളിലേക്കും വികസിപ്പിക്കുക</translation>
<translation id="6165508094623778733">കൂടുതലറിയുക</translation>
+<translation id="6166852626429024716">നിങ്ങളുടെ ഉപകരണവും ആപ്പുകളും ക്രമീകരണവും വെബും തിരയുക...</translation>
<translation id="6264365405983206840">എല്ലാം &amp;തിരഞ്ഞെടുക്കുക</translation>
<translation id="6351032674660237738">ആപ്പ് നിർദ്ദേശങ്ങൾ</translation>
<translation id="6364916375976753737">ഇടത്തേക്ക് സ്ക്രോള്‍ ചെയ്യുക</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{ഒരു മിനിറ്റ് ശേഷിക്കുന്നു}other{# മിനിറ്റ് ശേഷിക്കുന്നു}}</translation>
<translation id="7319740667687257810">ലോഞ്ചർ, ഭാഗിക കാഴ്ച</translation>
-<translation id="7352651011704765696">എന്തോ കുഴപ്പം സംഭവിച്ചു</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{ഒരു മിനിറ്റ് മുമ്പ്}other{# മിനിറ്റ് മുമ്പ്}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{ഒരു മിനിറ്റ് ശേഷിക്കുന്നു}other{# മിനിറ്റ് ശേഷിക്കുന്നു}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">പേജ് <ph name="PAGE_NUMBER" />, വരി <ph name="ROW_NUMBER" />, കോളം <ph name="COLUMN_NUMBER" /> എന്നതിലേക്ക് നീക്കി.</translation>
<translation id="7879499977785298635">ബ്ലോക്ക് ചെയ്യരുത്</translation>
<translation id="7907591526440419938">ഫയല്‍ തുറക്കുക</translation>
+<translation id="7952747673138230804">പുതിയ ഉള്ളടക്കം അടുത്തറിയുന്നതിനായി Chrome OS നിർദേശങ്ങൾ കാണിക്കുന്നു. ഉപയോഗ ഡാറ്റ പങ്കിടാൻ നിങ്ങൾ തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിൽ മാത്രം, നിലവാരം മെച്ചപ്പെടുത്താനായി സ്ഥിതിവിവരക്കണക്കുകൾ അയയ്ക്കുന്നു. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">കമാൻഡ്</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{ഒന്നിലധികം വായിക്കാത്ത അറിയിപ്പ് ഉണ്ട്}other{#-ലധികം വായിക്കാത്ത അറിയിപ്പുകൾ ഉണ്ട്}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{ഒരു മിനിറ്റിൽ}other{# മിനിറ്റിൽ}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ഫയല്‍ (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">ഷെൽഫ് എപ്പോഴും ദൃശ്യമാക്കിയിരിക്കുന്നു</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">നിങ്ങളുടെ ഉപകരണവും ആപ്പുകളും ക്രമീകരണവും വെബും തിരയുക. നിങ്ങളുടെ ആപ്പുകൾ നാവിഗേറ്റ് ചെയ്യാൻ അമ്പടയാള കീകൾ ഉപയോഗിക്കുക.</translation>
<translation id="8725488761726303204"><ph name="NUMBER" /> എണ്ണം കൂടി</translation>
<translation id="8730621377337864115">പൂർത്തിയാക്കി</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 മണിക്കൂർ}other{# മണിക്കൂർ}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_mn.xtb b/chromium/ui/strings/translations/ui_strings_mn.xtb
index f5387cf901e..1a9c75f8b80 100644
--- a/chromium/ui/strings/translations/ui_strings_mn.xtb
+++ b/chromium/ui/strings/translations/ui_strings_mn.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Шалгаж дууслаа</translation>
<translation id="252373100621549798">Үл мэдэгдэх дэлгэц</translation>
<translation id="2545651323591713692">Түр хойшлуулах</translation>
+<translation id="2570734079541893434">Тохиргоог удирдах</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 цагийн дараа}other{# цагийн дараа}}</translation>
<translation id="2583543531130364912">Мэдрэмтгий дэлгэцээ шалгах</translation>
<translation id="2666092431469916601">Дээд</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" />-с хуваалцсан</translation>
+<translation id="271033894570825754">Шинэ</translation>
<translation id="2743387203779672305">Завсрын түр санах самбар луу хуулах</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Хавтсыг нээ</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Эможи, дүрс тэмдэг</translation>
<translation id="5476505524087279545">Сонголтыг буцаах</translation>
<translation id="547979256943495781">Баруун талын shelf</translation>
+<translation id="5528053674512161860">Хөгжүүлэгчийн UI-н модуль (dev_ui)-ийг суулгаагүй учир хуудсыг ачаалж чадсангүй</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> систем</translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Зүүн талын сум</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Хаах</translation>
<translation id="6119846243427417423">идэвхжүүлэх</translation>
<translation id="6129953537138746214">Space</translation>
+<translation id="6134259848159370930">Төхөөрөмж, апп, тохиргоо, вэбээс хайна уу.</translation>
<translation id="6135826906199951471">Устгах</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Бүх аппыг харуулах</translation>
<translation id="6165508094623778733">Нэмэлт мэдээлэл авах</translation>
+<translation id="6166852626429024716">Төхөөрөмж, апп, тохиргоо, вэбээс хайх...</translation>
<translation id="6264365405983206840">Бүгдийг сонгох</translation>
<translation id="6351032674660237738">АППЫН ЗӨВЛӨМЖ</translation>
<translation id="6364916375976753737">Зүүн тийш гүйлгэх</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 мин үлдсэн}other{# мин үлдсэн }}</translation>
<translation id="7319740667687257810">Эхлүүлэгч, хэсэгчлэн харах</translation>
-<translation id="7352651011704765696">Алдаа гарсан байна</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 минутын өмнө}other{# минутын өмнө}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 минут үлдсэн }other{# минут үлдсэн}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537"><ph name="PAGE_NUMBER" />-р хуудас, <ph name="ROW_NUMBER" />-р мөр, <ph name="COLUMN_NUMBER" />-р багана руу зөөсөн.</translation>
<translation id="7879499977785298635">Блоклохгүй</translation>
<translation id="7907591526440419938">Файлыг нээх</translation>
+<translation id="7952747673138230804">Chrome үйлдлийн систем нь судлах шинэ контентын зөвлөмжүүдийг харуулдаг. Та ашиглалтын өгөгдлийг хуваалцахыг сонгосон тохиолдолд л чанарыг сайжруулахын тулд статистик илгээдэг. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Тушаал</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{1-ээс олон уншаагүй мэдэгдэл байна}other{#-с олон уншаагүй мэдэгдэл байна}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 минутын дараа}other{# минутын дараа}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Файл (. <ph name="SAVEAS_EXTENSION_NAME" /> )</translation>
<translation id="8649597172973390955">Shelf-г тогтмол харуулна</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> КБ/с</translation>
+<translation id="8685326675965865247">Төхөөрөмж, апп, тохиргоо, вэбээ хайна уу. Аппуудын хооронд шилжихийн тулд сумтай товчлууруудыг ашиглана уу.</translation>
<translation id="8725488761726303204">бусад +<ph name="NUMBER" /></translation>
<translation id="8730621377337864115">хийсэн</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 цаг}other{# цаг}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_mr.xtb b/chromium/ui/strings/translations/ui_strings_mr.xtb
index bfffd0474da..ac1dbf48788 100644
--- a/chromium/ui/strings/translations/ui_strings_mr.xtb
+++ b/chromium/ui/strings/translations/ui_strings_mr.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">कॅलिब्रेशन पूर्ण झाले</translation>
<translation id="252373100621549798">अज्ञात डिस्प्ले</translation>
<translation id="2545651323591713692">स्नूझ करा</translation>
+<translation id="2570734079541893434">सेटिंग्ज व्यवस्थापित करा</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{१ता मध्ये}other{#ता मध्ये}}</translation>
<translation id="2583543531130364912">तुमची टचस्क्रीन कॅलिब्रेट करा</translation>
<translation id="2666092431469916601">शीर्ष</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> वरून शेअर केले</translation>
+<translation id="271033894570825754">नवीन</translation>
<translation id="2743387203779672305">क्लिपबोर्डवर कॉपी करा</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">फोल्डर उघडा</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">इमोजी &amp;&amp; चिन्हे</translation>
<translation id="5476505524087279545">चौकटीतली खूण काढा</translation>
<translation id="547979256943495781">शेल्फ उजवीकडे आहे</translation>
+<translation id="5528053674512161860">डेव्हलपर UI मॉड्युल (dev_ui) इंस्टॉल केले नसल्यामुळे पेज लोड करता आले नाही</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> सिस्टम</translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Left Arrow</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">बंद करा</translation>
<translation id="6119846243427417423">सक्रिय करा</translation>
<translation id="6129953537138746214">जागा</translation>
+<translation id="6134259848159370930">तुमच्या डिव्हाइस, अ‍ॅप्स, सेटिंग्ज, वेबवर शोधा.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">सर्व अ‍ॅप्सवर विस्तार करा</translation>
<translation id="6165508094623778733">अधिक जाणून घ्या</translation>
+<translation id="6166852626429024716">तुमच्या डिव्हाइस, अ‍ॅप्स, सेटिंग्ज, वेबवर शोधा...</translation>
<translation id="6264365405983206840">&amp;सर्व निवडा</translation>
<translation id="6351032674660237738">ॲप सूचना</translation>
<translation id="6364916375976753737">डावीकडे स्क्रोल करा</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 मिनिट शिल्लक}other{# मिनिटे शिल्लक}}</translation>
<translation id="7319740667687257810">लाँचर, आंशिक दृश्य</translation>
-<translation id="7352651011704765696">काहीतरी चूक झाली</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 मिनिटापूर्वी}other{# मिनिटांपूर्वी}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 मिनिट शिल्लक}other{# मिनिटे शिल्लक}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">पेज <ph name="PAGE_NUMBER" />, पंक्ती <ph name="ROW_NUMBER" />, स्तंभ <ph name="COLUMN_NUMBER" /> वर हलवले.</translation>
<translation id="7879499977785298635">ब्लॉक करू नका</translation>
<translation id="7907591526440419938">फाइल उघडा</translation>
+<translation id="7952747673138230804">Chrome OS नवीन आशय एक्सप्लोर करण्यासाठी सूचना दाखवते. तुम्ही वापर डेटा शेअर करणे निवडले असेल तरच गुणवत्तेत सुधारणा करण्यासाठी आकडेवारी पाठवते. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">कमांड</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{एकापेक्षा जास्त न वाचलेली सूचना}other{# पेक्षा जास्त न वाचलेल्या सूचना}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{१मि मध्ये}other{#मि मध्ये}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> फाइल (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">शेल्फ नेहमी दाखवले जात आहे</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">तुमच्या डिव्हाइस, अ‍ॅप्स आणि वेबवर शोधा. तुमची अ‍ॅप्स नेव्हिगेट करण्यासाठी ॲरो की वापरा.</translation>
<translation id="8725488761726303204">+आणखी <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">पूर्ण झाले</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1ता}other{#ता}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ms.xtb b/chromium/ui/strings/translations/ui_strings_ms.xtb
index 2346d6f5c13..d39fda7c385 100644
--- a/chromium/ui/strings/translations/ui_strings_ms.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ms.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Penentukuran telah selesai</translation>
<translation id="252373100621549798">Paparan Tidak Diketahui</translation>
<translation id="2545651323591713692">Tunda</translation>
+<translation id="2570734079541893434">Urus tetapan</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{dalam 1j}other{dalam #j}}</translation>
<translation id="2583543531130364912">Tentukur skrin sentuh anda</translation>
<translation id="2666092431469916601">Atas</translation>
<translation id="2701330563083355633">Dikongsi daripada <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Baharu</translation>
<translation id="2743387203779672305">Salin ke papan keratan</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Buka folder</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji &amp;&amp; Simbol</translation>
<translation id="5476505524087279545">nyahpilih</translation>
<translation id="547979256943495781">Rak di sebelah kanan</translation>
+<translation id="5528053674512161860">Pemuatan halaman gagal kerana modul UI pembangun (dev_ui) tidak dipasang</translation>
<translation id="5574202486608032840">Sistem <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Undur ruang</translation>
<translation id="5613020302032141669">Anak Panah Kiri</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Tutup</translation>
<translation id="6119846243427417423">aktifkan</translation>
<translation id="6129953537138746214">Ruang</translation>
+<translation id="6134259848159370930">Cari dalam peranti anda, apl, tetapan dan web.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Kembangkan kepada semua apl</translation>
<translation id="6165508094623778733">Ketahui lebih lanjut</translation>
+<translation id="6166852626429024716">Cari dalam peranti anda, apl, tetapan, web...</translation>
<translation id="6264365405983206840">Pilih &amp;Semua</translation>
<translation id="6351032674660237738">CADANGAN APL</translation>
<translation id="6364916375976753737">Tatal Ke Kiri</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 minit lagi}other{# minit lagi}}</translation>
<translation id="7319740667687257810">Pelancar, paparan separa</translation>
-<translation id="7352651011704765696">Kesilapan telah berlaku</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 min yang lalu}other{# min yang lalu}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 minit lagi}other{# minit lagi}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Dialihkan kepada Halaman <ph name="PAGE_NUMBER" />, baris <ph name="ROW_NUMBER" />, lajur <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Jangan sekat</translation>
<translation id="7907591526440419938">Buka Fail</translation>
+<translation id="7952747673138230804">OS Chrome menunjukkan cadangan kandungan baharu untuk diterokai. Menghantar statistik untuk meningkatkan kualiti hanya jika anda telah memilih untuk berkongsi data penggunaan. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Perintah</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Lebih daripada 1 pemberitahuan belum dibaca}other{Lebih daripada # pemberitahuan belum dibaca}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{dalam 1m}other{dalam #m}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Fail (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Rak sentiasa ditunjukkan</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Cari dalam peranti anda, apl, tetapan dan web. Gunakan kekunci anak panah untuk menavigasi apl anda.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> lagi</translation>
<translation id="8730621377337864115">Selesai</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1j}other{#j}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_my.xtb b/chromium/ui/strings/translations/ui_strings_my.xtb
index cbab5923fe2..ee32abe3891 100644
--- a/chromium/ui/strings/translations/ui_strings_my.xtb
+++ b/chromium/ui/strings/translations/ui_strings_my.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">စံကိုက်ချိန်ညှိ ပြီးပါပြီ</translation>
<translation id="252373100621549798">မသိရ ပြကွက်</translation>
<translation id="2545651323591713692">ဆိုင်းငံ့ရန်</translation>
+<translation id="2570734079541893434">ဆက်တင်များ စီမံခန့်ခွဲရန်</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{၁နာရီ အတွင်း}other{#နာရီ အတွင်း}}</translation>
<translation id="2583543531130364912">သင်၏ တို့ထိမျက်နှာပြင်ကို တိုင်းတာချိန်ညှိပါ</translation>
<translation id="2666092431469916601">ထိပ်</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> ထံမှ မျှဝေထားပါသည်</translation>
+<translation id="271033894570825754">အသစသ်</translation>
<translation id="2743387203779672305">ကလစ်ဘုဒ်သို့ ကူးယူရန်</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />၊ <ph name="PRICE" /></translation>
<translation id="2803313416453193357">ဖိုင်တွဲဖွင့်</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">အီမိုဂျီနှင့် သင်္ကေတများ</translation>
<translation id="5476505524087279545">ခြစ်ထားမှု ဖျက်ရန်</translation>
<translation id="547979256943495781">စင်ကို ညာဘက် ရွှေ့လိုက်ပါပြီ</translation>
+<translation id="5528053674512161860">ဆော့ဖ်ဝဲအင်ဂျင်နီယာ UI မော်ဂျူး (dev_ui) ထည့်သွင်းမထားသောကြောင့် စာမျက်နှာကို ဖွင့်၍မရပါ</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> စနစ်</translation>
<translation id="5583640892426849032">နောက်ပြန်</translation>
<translation id="5613020302032141669">ဘယ်မြှား</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">ပိတ်ရန်</translation>
<translation id="6119846243427417423">ဖွင့်သုံးရန်</translation>
<translation id="6129953537138746214">နေရာခြား</translation>
+<translation id="6134259848159370930">သင့်စက်ပစ္စည်း၊ အက်ပ်၊ ဆက်တင်နှင့် ဝဘ်တွင် ရှာပါ။</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">အက်ပ်အားလုံးကို ပြရန်</translation>
<translation id="6165508094623778733">ပိုမိုလေ့လာရန်</translation>
+<translation id="6166852626429024716">သင့်စက်၊ အက်ပ်၊ ဆက်တင်၊ ဝဘ်တို့ကို ရှာပါ...</translation>
<translation id="6264365405983206840">အားလုံး &amp;ရွေးရန်</translation>
<translation id="6351032674660237738">အက်ပ်အကြံပြုချက်များ</translation>
<translation id="6364916375976753737">ဘယ်သို့ လှိမ့်ရန်</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{၁ မိနစ်ကျန်၏}other{# မိနစ်ကျန်၏}}</translation>
<translation id="7319740667687257810">Launcher၊ တစ်စိတ်တစ်ပိုင်း မြင်ကွင်း</translation>
-<translation id="7352651011704765696">တစ်ခုခု မှားနေပြီ</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{၁ မိနစ်အကြာက}other{# မိနစ်အကြာက}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{၁ မိနစ်ကျန်၏}other{# မိနစ်ကျန်၏}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">စာမျက်နှာ <ph name="PAGE_NUMBER" />၊ အတန်း <ph name="ROW_NUMBER" />၊ ကော်လံ <ph name="COLUMN_NUMBER" /> သို့ ရွှေ့ထားသည်။</translation>
<translation id="7879499977785298635">မပိတ်ပါနှင့်</translation>
<translation id="7907591526440419938">ဖိုင်ဖွင့်ရန်</translation>
+<translation id="7952747673138230804">စူးစမ်းလေ့လာရန် အကြောင်းအရာအသစ်အတွက် အကြံပြုချက်များကို Chrome OS က ပြပေးသည်။ သုံးစွဲမှုဒေတာများကို မျှဝေရန် သင်ရွေးချယ်ထားမှသာ အရည်အသွေး ပိုမိုကောင်းမွန်လာစေရန် ကိန်းဂဏန်းစာရင်းများ ပို့ပါမည်။ <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">ကွန်မန်း</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{မဖတ်ရသေးသော အကြောင်းကြားချက် ၁ ခုထက်ပိုရှိသည်}other{မဖတ်ရသေးသော အကြောင်းကြားချက် # ခုထက်ပိုရှိသည်}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{၁မိနစ် အတွင်း}other{#မိနစ် အတွင်း}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ဖိုင် (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">စင်ကို အမြဲတမ်း ပြထားပါသည်</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">သင်၏ စက်ပစ္စည်း၊ အက်ပ်၊ ဆက်တင်နှင့် ဝဘ်တို့ကို ရှာပါ။ အက်ပ်များတွင် မြားခလုတ်များကို သုံးပြီး ရွှေ့ပါ။</translation>
<translation id="8725488761726303204">နောက်ထပ် +<ph name="NUMBER" /></translation>
<translation id="8730621377337864115">ပြီးပါပြီ</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{၁ နာရီ}other{# နာရီ}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ne.xtb b/chromium/ui/strings/translations/ui_strings_ne.xtb
index 65b9243e89f..536ed978abc 100644
--- a/chromium/ui/strings/translations/ui_strings_ne.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ne.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">क्यालिब्रेसन सम्पन्न गरियो</translation>
<translation id="252373100621549798">अज्ञात प्रदर्शन</translation>
<translation id="2545651323591713692">स्नुज गर्नुहोस्</translation>
+<translation id="2570734079541893434">सेटिङ व्यवस्थापन गर्नुहोस्</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{१ घन्टामा}other{#घन्टामा}}</translation>
<translation id="2583543531130364912">आफ्नो टचस्क्रिनलाई क्यालिब्रेट गर्नुहोस्</translation>
<translation id="2666092431469916601">शीर्ष</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> ले आदान प्रदान गरेको</translation>
+<translation id="271033894570825754">नयाँ</translation>
<translation id="2743387203779672305">क्लिपबोर्डमा प्रतिलिपि बनाउँनुहोस्</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">फोल्डर खोल्नुहोस्</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">इमोजी र प्रतीकहरू</translation>
<translation id="5476505524087279545">अचयनित</translation>
<translation id="547979256943495781">सेल्फ दायाँतिर छ</translation>
+<translation id="5528053674512161860">विकासकर्ताको UI मोड्युल (dev_ui) इन्स्टल नगरिएको हुनाले पृष्ठ लोड गर्न सकिएन</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> प्रणाली</translation>
<translation id="5583640892426849032">ब्याकस्पेस</translation>
<translation id="5613020302032141669">बायाँ तीर</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">बन्द गर्नुहोस्</translation>
<translation id="6119846243427417423">सक्रिय गर्नुहोस्</translation>
<translation id="6129953537138746214">क्षेत्र</translation>
+<translation id="6134259848159370930">आफ्नो यन्त्र, एप, सेटिङ र वेबमा खोज्नुहोस्।</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> बा/से</translation>
<translation id="6156262341071374681">पूर्णस्क्रिनमा अनुप्रयोगहरूको विस्तृत सूची देखाउनुहोस्</translation>
<translation id="6165508094623778733">थप जान्नुहोस्</translation>
+<translation id="6166852626429024716">आफ्नो यन्त्र, एप, सेटिङ, वेबमा खोज्नुहोस्...</translation>
<translation id="6264365405983206840">&amp;सबै चयन गर्नुहोस्</translation>
<translation id="6351032674660237738">अनुप्रयोगसम्बन्धी सुझावहरू</translation>
<translation id="6364916375976753737">बायाँ स्क्रोल गर्नुहोस्</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{ १ मिनेट बाँकी}other{ # मिनेट बाँकी}}</translation>
<translation id="7319740667687257810">लन्चर, आंशिक दृश्य</translation>
-<translation id="7352651011704765696">केही गल्ती भयो</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{ १ मिनेटअघि}other{ # मिनेटअघि}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{ १ मिनेट बाँकी}other{ # मिनेट बाँकी}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">पृष्ठ <ph name="PAGE_NUMBER" />, पङ्क्ति <ph name="ROW_NUMBER" />, स्तम्भ <ph name="COLUMN_NUMBER" /> मा सारियो।</translation>
<translation id="7879499977785298635">रोक नलगाउनुहोस्</translation>
<translation id="7907591526440419938">फाइल खोल्नुहोस्</translation>
+<translation id="7952747673138230804">Chrome OS ले अन्वेषण गर्नु पर्ने नयाँ सामग्रीसम्बन्धी सुझावहरू देखाउँछ। तपाईंले प्रयोगसम्बन्धी डेटा सेयर गर्ने निर्णय गर्नुभएको छ भने मात्र सामग्री सिफारिस गर्ने सुविधाको गुणस्तर सुधार्ने प्रयोजनका लागि तथ्याङ्क पठाउँछ। <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">आदेश</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{१ भन्दा बढी नपढिएका सूचना}other{# भन्दा बढी नपढिएका सूचनाहरू}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{१ मिनेटमा}other{# मिनेटमा}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> फाइल (। <ph name="SAVEAS_EXTENSION_NAME" /> )</translation>
<translation id="8649597172973390955">सेल्फ सधैँ देखिने छ</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">आफ्नो यन्त्र, एप, सेटिङ र वेबमा खोज्नुहोस्। आफ्ना एपहरूमा नेभिगेट गर्न तीर कुञ्जीहरू प्रयोग गर्नुहोस्।</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> थप</translation>
<translation id="8730621377337864115">गरियो</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{१ घन्टा}other{# घन्टा}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_nl.xtb b/chromium/ui/strings/translations/ui_strings_nl.xtb
index 6594b0daa54..a69ec81b4eb 100644
--- a/chromium/ui/strings/translations/ui_strings_nl.xtb
+++ b/chromium/ui/strings/translations/ui_strings_nl.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibratie is voltooid</translation>
<translation id="252373100621549798">Onbekend display</translation>
<translation id="2545651323591713692">Snoozen</translation>
+<translation id="2570734079541893434">Instellingen beheren</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{over 1 u}other{over # u}}</translation>
<translation id="2583543531130364912">Je touchscreen kalibreren</translation>
<translation id="2666092431469916601">Boven</translation>
<translation id="2701330563083355633">Gedeeld vanaf <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Nieuw</translation>
<translation id="2743387203779672305">Kopiëren naar klembord</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Map openen</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji en symbolen</translation>
<translation id="5476505524087279545">uitvinken</translation>
<translation id="547979256943495781">Plank aan rechterkant</translation>
+<translation id="5528053674512161860">Kan pagina niet laden omdat de UI-module voor ontwikkelaars (dev_ui) niet is geïnstalleerd</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" />-systeem</translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Pijl-links</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Sluiten</translation>
<translation id="6119846243427417423">Activeren</translation>
<translation id="6129953537138746214">Spatie</translation>
+<translation id="6134259848159370930">Zoek op je apparaat, in apps en instellingen en op internet.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Uitbreiden naar alle apps</translation>
<translation id="6165508094623778733">Meer informatie</translation>
+<translation id="6166852626429024716">Zoek op je apparaat, in apps en instellingen en op internet...</translation>
<translation id="6264365405983206840">&amp;Alles selecteren</translation>
<translation id="6351032674660237738">APP-SUGGESTIES</translation>
<translation id="6364916375976753737">Naar links bladeren</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 min. resterend}other{# min. resterend}}</translation>
<translation id="7319740667687257810">Launcher, gedeeltelijke weergave</translation>
-<translation id="7352651011704765696">Er is iets misgegaan</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 min. geleden}other{# min. geleden}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 minuut resterend}other{# minuten resterend}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Verplaatst naar pagina <ph name="PAGE_NUMBER" />, rij <ph name="ROW_NUMBER" />, kolom <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Niet blokkeren</translation>
<translation id="7907591526440419938">Bestand openen</translation>
+<translation id="7952747673138230804">Chrome OS geeft suggesties weer voor nieuwe content die je kunt bekijken. Stuurt alleen statistieken om de kwaliteit te verbeteren als je ervoor hebt gekozen gebruiksgegevens te delen. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Meer dan één ongelezen melding}other{Meer dan # ongelezen meldingen}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{over 1 m}other{over # m}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" />-bestand (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Plank altijd weergegeven</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Zoek op je apparaat, in apps en instellingen en op internet. Gebruik de pijltoetsen om te navigeren in je apps.</translation>
<translation id="8725488761726303204">+ nog <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Gereed</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 u}other{# u}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_no.xtb b/chromium/ui/strings/translations/ui_strings_no.xtb
index 30b913a8b13..56956acfdf7 100644
--- a/chromium/ui/strings/translations/ui_strings_no.xtb
+++ b/chromium/ui/strings/translations/ui_strings_no.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibreringen er ferdig</translation>
<translation id="252373100621549798">Ukjent skjerm</translation>
<translation id="2545651323591713692">Utsett</translation>
+<translation id="2570734079541893434">Administrer innstillinger</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{om 1 t}other{om # t}}</translation>
<translation id="2583543531130364912">Kalibrer berøringsskjermen din</translation>
<translation id="2666092431469916601">Topp</translation>
<translation id="2701330563083355633">Delt fra <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Ny</translation>
<translation id="2743387203779672305">Kopiér til utklippstavlen</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" /> – <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Åpne mappen</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji og symboler</translation>
<translation id="5476505524087279545">fjern merke</translation>
<translation id="547979256943495781">Hyllen er til høyre</translation>
+<translation id="5528053674512161860">Sideinnlastingen mislyktes fordi modulen for utvikler-UI (dev_ui) ikke er installert</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" />-systemet</translation>
<translation id="5583640892426849032">Tilbake-tasten</translation>
<translation id="5613020302032141669">Pil venstre</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Lukk</translation>
<translation id="6119846243427417423">aktiver</translation>
<translation id="6129953537138746214">Mellomrom</translation>
+<translation id="6134259848159370930">Søk på enheten, i apper, i innstillinger og på nettet.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B per sek</translation>
<translation id="6156262341071374681">Vis alle apper</translation>
<translation id="6165508094623778733">Finn ut mer</translation>
+<translation id="6166852626429024716">Søk på enheten, i apper, i innstillinger og på nettet.</translation>
<translation id="6264365405983206840">Velg &amp;alle</translation>
<translation id="6351032674660237738">APPFORSLAG</translation>
<translation id="6364916375976753737">Rull mot venstre</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 min igjen}other{# min igjen}}</translation>
<translation id="7319740667687257810">Appoversikt, delvis visning</translation>
-<translation id="7352651011704765696">Noe gikk galt</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{For 1 min siden}other{For # min siden}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 minutt igjen}other{# minutter igjen}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Flyttet til side <ph name="PAGE_NUMBER" />, rad <ph name="ROW_NUMBER" />, kolonne <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Ikke blokkér</translation>
<translation id="7907591526440419938">Åpne filen</translation>
+<translation id="7952747673138230804">Chrome OS viser forslag til nytt innhold du kan utforske. Sender statistikk for å gjøre kvaliteten bedre kun hvis du har valgt å dele bruksdata. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Kommando</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Mer enn 1 ulest varsel}other{Mer enn # uleste varsler}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{om 1 m}other{om # m}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Fil (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Hyllen vises alltid</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> kB per sek</translation>
+<translation id="8685326675965865247">Søk på enheten, i apper, i innstillinger og på nettet. Bruk piltastene til å navigere i appene.</translation>
<translation id="8725488761726303204">+ <ph name="NUMBER" /> til</translation>
<translation id="8730621377337864115">Ferdig</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 t}other{# t}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_or.xtb b/chromium/ui/strings/translations/ui_strings_or.xtb
index 89a1a6d2711..430647ac8a1 100644
--- a/chromium/ui/strings/translations/ui_strings_or.xtb
+++ b/chromium/ui/strings/translations/ui_strings_or.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">କାଲିବ୍ରାସନ୍‍ ସମ୍ପୂର୍ଣ୍ଣ ହୋ‍ଇଛି</translation>
<translation id="252373100621549798">ଅଜଣା ଡିସ୍‌ପ୍ଲେ</translation>
<translation id="2545651323591713692">ସ୍ନୁଜ୍ କରନ୍ତୁ</translation>
+<translation id="2570734079541893434">ସେଟିଂସ୍ ପରିଚାଳନା କରନ୍ତୁ</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{ଘଣ୍ଟା ମଧ୍ୟରେ}other{# ଘଣ୍ଟା ମଧ୍ୟରେ}}</translation>
<translation id="2583543531130364912">ଆପଣଙ୍କର ଟଚ୍‌ସ୍କ୍ରିନ୍‌କୁ କାଲିବ୍ରେଟ୍ କରନ୍ତୁ</translation>
<translation id="2666092431469916601">ଶୀର୍ଷ</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" />ରୁ ସେୟାର୍ କରାଯାଇଛି</translation>
+<translation id="271033894570825754">ନୂଆ</translation>
<translation id="2743387203779672305">କ୍ଲିପ୍‌ବୋର୍ଡକୁ କପି କରନ୍ତୁ</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">ଫୋଲ୍ଡର ଖୋଲନ୍ତୁ</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">ଇମୋଜି &amp;&amp; ଚିହ୍ନ</translation>
<translation id="5476505524087279545">ଯାଞ୍ଚ ରହିତ</translation>
<translation id="547979256943495781">ଡାହାଣପଟେ ସେଲ୍ଫ ଅଛି</translation>
+<translation id="5528053674512161860">ଡେଭଲପର୍ UI ମଡ୍ୟୁଲ୍ (dev_ui) ଇନଷ୍ଟଲ୍ କରାଯାଇନଥିବା ଯୋଗୁଁ ପୃଷ୍ଠା ଲୋଡ୍ ହେବା ବିଫଳ ହୋଇଛି</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> ସିଷ୍ଟମ୍</translation>
<translation id="5583640892426849032">ପଶ୍ଚାତ୍</translation>
<translation id="5613020302032141669">Left Arrow</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">ବନ୍ଦ</translation>
<translation id="6119846243427417423">କ୍ରିୟାଶୀଳ କରନ୍ତୁ</translation>
<translation id="6129953537138746214">ସ୍ପେସ୍</translation>
+<translation id="6134259848159370930">ଆପଣଙ୍କ ଡିଭାଇସ୍, ଆପ୍ସ, ସେଟିଂସ୍ ଏବଂ ୱେବରେ ସନ୍ଧାନ କରନ୍ତୁ।</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> ବା/ସେ</translation>
<translation id="6156262341071374681">ସମସ୍ତ ଆପ୍‌‍ଗୁଡ଼ିକ ପାଇଁ ବିସ୍ତାର କରନ୍ତୁ</translation>
<translation id="6165508094623778733">ଅଧିକ ଜାଣନ୍ତୁ</translation>
+<translation id="6166852626429024716">ଆପଣଙ୍କର ଡିଭାଇସ୍, ଆପ୍ସ, ସେଟିଂସ୍ ଏବଂ ୱେବରେ ସନ୍ଧାନ କରନ୍ତୁ…</translation>
<translation id="6264365405983206840">&amp;ସବୁ ଚୟନ କରନ୍ତୁ</translation>
<translation id="6351032674660237738">ଆପ୍ ପରାମର୍ଶ</translation>
<translation id="6364916375976753737">ବାମକୁ ସ୍କ୍ରୋଲ୍ କରନ୍ତୁ</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 ମିନିଟ୍ ବାକି ଅଛି}other{# ମିନିଟ୍ ବାକି ଅଛି}}</translation>
<translation id="7319740667687257810">ଲଞ୍ଚର୍, ଆଂଶିକ ଦୃଶ୍ୟ</translation>
-<translation id="7352651011704765696">କିଛି ଭୁଲ୍ ହୋଇଛି</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 ମିନିଟ୍ ପୂର୍ବେ}other{# ମିନିଟ୍ ପୂର୍ବେ}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 ମିନିଟ୍‍ ବାକି ଅଛି}other{# ମିନିଟ୍‍ ବାକି ଅଛି}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">ପୃଷ୍ଠା <ph name="PAGE_NUMBER" />, ଧାଡ଼ି <ph name="ROW_NUMBER" />, ସ୍ତମ୍ଭ <ph name="COLUMN_NUMBER" />କୁ ଘୁଞ୍ଚାଯାଇଛି।</translation>
<translation id="7879499977785298635">ଅବରୋଧ କରନ୍ତୁ ନାହିଁ</translation>
<translation id="7907591526440419938">ଫାଇଲ୍ ଖୋଲନ୍ତୁ</translation>
+<translation id="7952747673138230804">Chrome OS ଏକ୍ସପ୍ଲୋର୍ କରିବାକୁ ନୂଆ ବିଷୟବସ୍ତୁର ପ୍ରସ୍ତାବଗୁଡ଼ିକ ଦେଖାଇଥାଏ। ଯଦି ଆପଣ ବ୍ୟବହାର ଡାଟା ସେୟାର୍ କରିବାକୁ ବାଛିଥାଆନ୍ତି ତେବେ କେବଳ ଗୁଣବତ୍ତାକୁ ଉନ୍ନତ କରିବା ପାଇଁ ପରିସଂଖ୍ୟାନ ପଠାଏ। <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">କମାଣ୍ଡ</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{ଆଉ ଅଧିକ 1ଟି ପଢ଼ାଯାଇନଥିବା ବିଜ୍ଞପ୍ତି}other{ଆଉ ଅଧିକ #ଟି ପଢ଼ାଯାଇନଥିବା ବିଜ୍ଞପ୍ତି}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 ମିନିଟରେ}other{# ମିନିଟରେ}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ଫାଇଲ୍ (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">ସେଲ୍ଫ ସର୍ବଦା ଦେଖାଯାଏ</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">ଆପଣଙ୍କ ଡିଭାଇସ୍, ଆପ୍ସ, ସେଟିଂସ୍ ଏବଂ ୱେବରେ ସନ୍ଧାନ କରନ୍ତୁ। ଆପଣଙ୍କ ଆପକୁ ନାଭିଗେଟ୍ କରିବା ପାଇଁ ତୀର କୀ'ଗୁଡ଼ିକ ବ୍ୟବହାର କରନ୍ତୁ।</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> ଅଧିକ</translation>
<translation id="8730621377337864115">ସମାପ୍ତ ହୋଇଛି</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1ଘ}other{#ଘ}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_pa.xtb b/chromium/ui/strings/translations/ui_strings_pa.xtb
index 271ef331831..8683ca6048c 100644
--- a/chromium/ui/strings/translations/ui_strings_pa.xtb
+++ b/chromium/ui/strings/translations/ui_strings_pa.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">ਕੈਲੀਬਰੇਸ਼ਨ ਪੂਰਾ ਹੋ ਗਿਆ ਹੈ</translation>
<translation id="252373100621549798">ਅਗਿਆਤ ਡਿਸਪਲੇ</translation>
<translation id="2545651323591713692">ਸਨੂਜ਼ ਕਰੋ</translation>
+<translation id="2570734079541893434">ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 ਘੰ. ਵਿੱਚ}one{# ਘੰ. ਵਿੱਚ}other{# ਘੰ. ਵਿੱਚ}}</translation>
<translation id="2583543531130364912">ਆਪਣੀ ਟੱਚਸਕ੍ਰੀਨ ਨੂੰ ਕੈਲੀਬਰੇਟ ਕਰੋ</translation>
<translation id="2666092431469916601">ਟੌਪ</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> ਤੋਂ ਸਾਂਝਾ ਕੀਤਾ ਗਿਆ</translation>
+<translation id="271033894570825754">ਨਵਾਂ</translation>
<translation id="2743387203779672305">ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕਰੋ</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">ਫੋਲਡਰ ਖੋਲ੍ਹੋ</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">ਇਮੋਜੀ ਅਤੇ ਚਿੰਨ੍ਹ</translation>
<translation id="5476505524087279545">ਨਿਸ਼ਾਨ ਹਟਾਓ</translation>
<translation id="547979256943495781">ਸ਼ੈਲਫ਼ ਸੱਜੇ ਪਾਸੇ</translation>
+<translation id="5528053674512161860">ਪੰਨਾ ਲੋਡ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ ਕਿਉਂਕਿ ਵਿਕਾਸਕਾਰ UI ਮਾਡਿਊਲ (dev_ui) ਸਥਾਪਤ ਨਹੀਂ ਹੈ</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> ਸਿਸਟਮ</translation>
<translation id="5583640892426849032">ਬੈਕਸਪੇਸ</translation>
<translation id="5613020302032141669">ਖੱਬਾ ਤੀਰ</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">ਬੰਦ ਕਰੋ</translation>
<translation id="6119846243427417423">ਸਕਿਰਿਆ ਕਰੋ</translation>
<translation id="6129953537138746214">ਸਪੇਸ</translation>
+<translation id="6134259848159370930">ਆਪਣਾ ਡੀਵਾਈਸ, ਐਪਾਂ, ਸੈਟਿੰਗਾਂ ਅਤੇ ਵੈੱਬ ਖੋਜੋ।</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">ਸਾਰੀਆਂ ਐਪਾਂ ਲਈ ਵਿਸਤਾਰ ਕਰੋ</translation>
<translation id="6165508094623778733">ਹੋਰ ਜਾਣੋ</translation>
+<translation id="6166852626429024716">ਆਪਣਾ ਡੀਵਾਈਸ, ਐਪਾਂ, ਸੈਟਿੰਗਾਂ, ਵੈੱਬ ਖੋਜੋ...</translation>
<translation id="6264365405983206840">&amp;ਸਾਰੇ ਚੁਣੋ</translation>
<translation id="6351032674660237738">ਐਪ ਸੁਝਾਅ</translation>
<translation id="6364916375976753737">ਖੱਬੇ ਪਾਸੇ ਸਕ੍ਰੌਲ ਕਰੋ</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 ਮਿੰਟ ਬਾਕੀ}one{# ਮਿੰਟ ਬਾਕੀ}other{# ਮਿੰਟ ਬਾਕੀ}}</translation>
<translation id="7319740667687257810">ਲਾਂਚਰ, ਨਾਮੁਕੰਮਲ ਦ੍ਰਿਸ਼</translation>
-<translation id="7352651011704765696">ਕੁਝ ਗ਼ਲਤ ਹੋਇਆ ਸੀ</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 ਮਿੰਟ ਪਹਿਲਾਂ}one{# ਮਿੰਟ ਪਹਿਲਾਂ}other{# ਮਿੰਟ ਪਹਿਲਾਂ}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 ਮਿੰਟ ਬਾਕੀ}one{# ਮਿੰਟ ਬਾਕੀ}other{# ਮਿੰਟ ਬਾਕੀ}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">ਪੰਨਾ <ph name="PAGE_NUMBER" />, ਕਤਾਰ <ph name="ROW_NUMBER" />, ਕਾਲਮ <ph name="COLUMN_NUMBER" /> 'ਤੇ ਲਿਜਾਇਆ ਗਿਆ।</translation>
<translation id="7879499977785298635">ਬਲਾਕ ਨਾ ਕਰੋ</translation>
<translation id="7907591526440419938">ਫਾਈਲ ਖੋਲ੍ਹੋ</translation>
+<translation id="7952747673138230804">Chrome OS ਪੜਚੋਲ ਕਰਨ ਲਈ ਨਵੀਂ ਸਮੱਗਰੀ ਦੇ ਸੁਝਾਅ ਦਿਖਾਉਂਦਾ ਹੈ। ਤੁਹਾਡੇ ਵੱਲੋਂ ਵਰਤੋਂ ਡਾਟੇ ਨੂੰ ਸਾਂਝਾ ਕਰਨ ਦੀ ਚੋਣ ਕੀਤੇ ਜਾਣ 'ਤੇ ਹੀ ਕੁਆਲਿਟੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ ਅੰਕੜੇ ਭੇਜੇ ਜਾਂਦੇ ਹਨ। <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">ਆਦੇਸ਼</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{1 ਤੋਂ ਵੱਧ ਨਾ-ਪੜ੍ਹੀ ਹੋਈ ਸੂਚਨਾ}one{# ਤੋਂ ਵੱਧ ਨਾ-ਪੜ੍ਹੀ ਹੋਈ ਸੂਚਨਾ}other{# ਤੋਂ ਵੱਧ ਨਾ-ਪੜ੍ਹੀਆਂ ਹੋਈਆਂ ਸੂਚਨਾਵਾਂ}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 ਮਿੰ. ਵਿੱਚ}one{# ਮਿੰ. ਵਿੱਚ}other{# ਮਿੰ. ਵਿੱਚ}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ਫਾਈਲ (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">ਸ਼ੈਲਫ਼ ਹਮੇਸ਼ਾਂ ਦਿਖਾਈ ਜਾ ਰਹੀ ਹੈ</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">ਆਪਣਾ ਡੀਵਾਈਸ, ਐਪਾਂ, ਸੈਟਿੰਗਾਂ ਅਤੇ ਵੈੱਬ ਖੋਜੋ। ਆਪਣੀਆਂ ਐਪਾਂ ਵਿੱਚ ਨੈਵੀਗੇਟ ਕਰਨ ਲਈ ਤੀਰ ਕੁੰਜੀਆਂ ਵਰਤੋ।</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> ਹੋਰ</translation>
<translation id="8730621377337864115">ਹੋ ਗਿਆ</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 ਘੰਟਾ}one{# ਘੰਟਾ}other{# ਘੰਟੇ}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_pl.xtb b/chromium/ui/strings/translations/ui_strings_pl.xtb
index 8ab68c4217e..8e28061e538 100644
--- a/chromium/ui/strings/translations/ui_strings_pl.xtb
+++ b/chromium/ui/strings/translations/ui_strings_pl.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibracja została ukończona</translation>
<translation id="252373100621549798">Nieznany wyświetlacz</translation>
<translation id="2545651323591713692">Odłóż</translation>
+<translation id="2570734079541893434">Zarządzaj ustawieniami</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{za 1 godz.}few{za # godz.}many{za # godz.}other{za # godz.}}</translation>
<translation id="2583543531130364912">Skalibruj ekran dotykowy</translation>
<translation id="2666092431469916601">Do góry</translation>
<translation id="2701330563083355633">Tę kartę udostępnia <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Nowy</translation>
<translation id="2743387203779672305">Skopiuj do schowka</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Otwórz folder</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emotikony i symbole</translation>
<translation id="5476505524087279545">odznacz</translation>
<translation id="547979256943495781">Półka po prawej</translation>
+<translation id="5528053674512161860">Nie udało się wczytać strony, ponieważ moduł interfejsu (dev_ui) nie jest zainstalowany</translation>
<translation id="5574202486608032840">System <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Strzałka w lewo</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Zamknij</translation>
<translation id="6119846243427417423">aktywuj</translation>
<translation id="6129953537138746214">Spacja</translation>
+<translation id="6134259848159370930">Przeszukaj urządzenie, aplikacje, ustawienia i internet.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Rozwiń, by wyświetlić wszystkie aplikacje</translation>
<translation id="6165508094623778733">Dowiedz się więcej</translation>
+<translation id="6166852626429024716">Przeszukaj urządzenie, aplikacje, ustawienia, internet…</translation>
<translation id="6264365405983206840">Wybierz &amp;wszystko</translation>
<translation id="6351032674660237738">SUGEROWANE APLIKACJE</translation>
<translation id="6364916375976753737">Przewiń w lewo</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Pozostała 1 min}few{Pozostały # min}many{Pozostało # min}other{Pozostało # min}}</translation>
<translation id="7319740667687257810">Menu z aplikacjami, widok częściowy</translation>
-<translation id="7352651011704765696">Coś poszło nie tak</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 min temu}few{# min temu}many{# min temu}other{# min temu}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Pozostała 1 minuta}few{Pozostały # minuty}many{Pozostały # minut}other{Pozostało # minuty}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Przeniesiono do strony <ph name="PAGE_NUMBER" />, wiersza <ph name="ROW_NUMBER" />, kolumny <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Nie blokuj</translation>
<translation id="7907591526440419938">Otwórz plik</translation>
+<translation id="7952747673138230804">Chrome OS proponuje nowe treści, które mogą Cię zainteresować. Wysyła statystyki, by ulepszać podpowiedzi, tylko wtedy, gdy zostało wybrane udostępnianie danych o korzystaniu. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Więcej niż 1 nieprzeczytane powiadomienie}few{Więcej niż # nieprzeczytane powiadomienia}many{Więcej niż # nieprzeczytanych powiadomień}other{Więcej niż # nieprzeczytanego powiadomienia}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{za 1 min}few{za # min}many{za # min}other{za # min}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Plik <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Półka zawsze widoczna</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> kB/s</translation>
+<translation id="8685326675965865247">Przeszukaj urządzenie, aplikacje, ustawienia i internet. Aby poruszać się po aplikacjach, użyj klawiszy strzałek.</translation>
<translation id="8725488761726303204">i jeszcze <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Gotowe</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 godz.}few{# godz.}many{# godz.}other{# godz.}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_pt-BR.xtb b/chromium/ui/strings/translations/ui_strings_pt-BR.xtb
index 741561a3b69..f4e0d62f219 100644
--- a/chromium/ui/strings/translations/ui_strings_pt-BR.xtb
+++ b/chromium/ui/strings/translations/ui_strings_pt-BR.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">A calibração está concluída</translation>
<translation id="252373100621549798">Exibição desconhecida</translation>
<translation id="2545651323591713692">Soneca</translation>
+<translation id="2570734079541893434">Gerenciar configurações</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{em 1 h}one{em # h}other{em # h}}</translation>
<translation id="2583543531130364912">Calibrar a touchscreen</translation>
<translation id="2666092431469916601">Parte superior</translation>
<translation id="2701330563083355633">Compartilhada por <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Novo</translation>
<translation id="2743387203779672305">Copiar para área de transferência</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Abrir pasta</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emojis e símbolos</translation>
<translation id="5476505524087279545">desmarcar</translation>
<translation id="547979256943495781">Estante à direita</translation>
+<translation id="5528053674512161860">Falha ao carregar a página. O módulo de IU do desenvolvedor (dev_ui) não está instalado</translation>
<translation id="5574202486608032840">Sistema <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Seta para a esquerda</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Fechar</translation>
<translation id="6119846243427417423">ativar</translation>
<translation id="6129953537138746214">Espaço</translation>
+<translation id="6134259848159370930">Pesquise no dispositivo, em apps, nas configurações e na Web.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Expandir para ver todos os apps</translation>
<translation id="6165508094623778733">Saiba mais</translation>
+<translation id="6166852626429024716">Pesquisar no dispositivo, em apps, nas configurações, na Web…</translation>
<translation id="6264365405983206840">Selecionar &amp;tudo</translation>
<translation id="6351032674660237738">SUGESTÕES DE APPS</translation>
<translation id="6364916375976753737">Percorrer à esquerda</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Um minuto restante}one{# minutos restantes}other{# minutos restantes}}</translation>
<translation id="7319740667687257810">Iniciador, visualização parcial</translation>
-<translation id="7352651011704765696">Algo deu errado</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Um minuto atrás}one{# minutos atrás}other{# minutos atrás}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Um minuto restante}one{# minutos restantes}other{# minutos restantes}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Movido para página <ph name="PAGE_NUMBER" />, linha <ph name="ROW_NUMBER" />, coluna <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Não bloquear</translation>
<translation id="7907591526440419938">Abrir arquivo</translation>
+<translation id="7952747673138230804">O Chrome OS mostra sugestões de novos conteúdos para conhecer. Ele só enviará estatísticas para melhorar a qualidade se você compartilhar os dados de uso. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Mais de uma notificação não lida}one{Mais de # notificação não lida}other{Mais de # notificações não lidas}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{em 1 min}one{em # min}other{em # min}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Arquivo <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Sempre mostrar estante</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Pesquise no seu dispositivo, em apps, nas configurações e na Web. Use as teclas de seta para navegar pelos seus apps.</translation>
<translation id="8725488761726303204">mais <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Concluído</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}one{# h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_pt-PT.xtb b/chromium/ui/strings/translations/ui_strings_pt-PT.xtb
index e06348d01f9..7a524e4b382 100644
--- a/chromium/ui/strings/translations/ui_strings_pt-PT.xtb
+++ b/chromium/ui/strings/translations/ui_strings_pt-PT.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">A calibração foi concluída</translation>
<translation id="252373100621549798">Apresentação Desconhecida</translation>
<translation id="2545651323591713692">Suspender</translation>
+<translation id="2570734079541893434">Faça a gestão das definições</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{em 1 h}other{em # h}}</translation>
<translation id="2583543531130364912">Calibrar o ecrã tátil</translation>
<translation id="2666092431469916601">Parte superior</translation>
<translation id="2701330563083355633">Partilhado a partir do <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Novo</translation>
<translation id="2743387203779672305">Copiar para a área de transferência</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Abrir pasta</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji e símbolos</translation>
<translation id="5476505524087279545">desmarcar</translation>
<translation id="547979256943495781">Prateleira à direita</translation>
+<translation id="5528053674512161860">O carregamento da página falhou porque o módulo da IU do programador (dev_ui) não está instalado</translation>
<translation id="5574202486608032840">Sistema <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Retrocesso</translation>
<translation id="5613020302032141669">Seta para a esquerda</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Fechar</translation>
<translation id="6119846243427417423">activar</translation>
<translation id="6129953537138746214">Espaço</translation>
+<translation id="6134259848159370930">Pesquise no dispositivo, nas apps, nas definições e na Web.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Expandir para ver todas as aplicações</translation>
<translation id="6165508094623778733">Saiba mais</translation>
+<translation id="6166852626429024716">Pesquise no dispositivo, nas apps, nas definições, na Web…</translation>
<translation id="6264365405983206840">Seleccion&amp;ar Tudo</translation>
<translation id="6351032674660237738">SUGESTÕES DE APLICAÇÕES</translation>
<translation id="6364916375976753737">Deslocar-se para a esquerda</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Falta 1 min}other{Faltam # min}}</translation>
<translation id="7319740667687257810">Launcher, vista parcial</translation>
-<translation id="7352651011704765696">Algo correu mal</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Há 1 min}other{Há # min}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Falta 1 minuto}other{Faltam # minutos}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">A aplicação foi movida para a página <ph name="PAGE_NUMBER" />, linha <ph name="ROW_NUMBER" />, coluna <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Não bloquear</translation>
<translation id="7907591526440419938">Abrir ficheiro</translation>
+<translation id="7952747673138230804">O Chrome OS mostra sugestões de novo conteúdo a explorar. Apenas envia estatísticas para melhorar a qualidade se tiver optado por partilhar os dados de utilização. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Mais de 1 notificação não lida}other{Mais de # notificações não lidas}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{em 1 min}other{em # min}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Ficheiro <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Prateleira apresentada sempre</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Pesquise no dispositivo, nas apps e na Web. Utilize as teclas de seta para navegar nas apps.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Concluído</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ro.xtb b/chromium/ui/strings/translations/ui_strings_ro.xtb
index c73e6f783fc..199eca561aa 100644
--- a/chromium/ui/strings/translations/ui_strings_ro.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ro.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Calibrarea este finalizată</translation>
<translation id="252373100621549798">Afișaj necunoscut</translation>
<translation id="2545651323591713692">Amână</translation>
+<translation id="2570734079541893434">Gestionează setările</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{în 1 h}few{în # h}other{în # h}}</translation>
<translation id="2583543531130364912">Calibrează ecranul tactil</translation>
<translation id="2666092431469916601">Sus</translation>
<translation id="2701330563083355633">Trimis de <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Nou</translation>
<translation id="2743387203779672305">Copiați în clipboard</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Deschideți dosarul</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji și simboluri</translation>
<translation id="5476505524087279545">debifează</translation>
<translation id="547979256943495781">Raft în partea dreaptă</translation>
+<translation id="5528053674512161860">Pagina nu s-a încărcat, deoarece modulul IU pentru dezvoltatori (dev_ui) nu este instalat</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Săgeată stânga</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Închide</translation>
<translation id="6119846243427417423">activează</translation>
<translation id="6129953537138746214">Spațiu</translation>
+<translation id="6134259848159370930">Caută pe dispozitiv, în aplicații, în setări și pe web.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Extinde la toate aplicațiile</translation>
<translation id="6165508094623778733">Află mai multe</translation>
+<translation id="6166852626429024716">Caută pe dispozitiv, în aplicații, în setări și pe web...</translation>
<translation id="6264365405983206840">Select&amp;ează tot</translation>
<translation id="6351032674660237738">SUGESTII DE APLICAȚII</translation>
<translation id="6364916375976753737">Derulează spre stânga</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Un min. rămas}few{# min. rămase}other{# min. rămase}}</translation>
<translation id="7319740667687257810">Lansator, afișare parțială</translation>
-<translation id="7352651011704765696">A apărut o eroare</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Acum un min.}few{Acum # min.}other{Acum # min.}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Un minut rămas}few{# minute rămase}other{# de minute rămase}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">S-a mutat în pagina <ph name="PAGE_NUMBER" />, rândul <ph name="ROW_NUMBER" />, coloana <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Nu bloca</translation>
<translation id="7907591526440419938">Deschide fișierul</translation>
+<translation id="7952747673138230804">Sistemul de operare Chrome afișează sugestii pentru conținut nou de explorat. Trimite statistici pentru a îmbunătăți calitatea numai dacă ai ales să permiți accesul la datele de utilizare. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Tasta Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Mai mult de o notificare necitită}few{Mai mult de # notificări necitite}other{Mai mult de # de notificări necitite}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{în 1 m}few{în # m}other{în # m}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Fișier <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Raftul este afișat mereu</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KO/s</translation>
+<translation id="8685326675965865247">Caută pe dispozitiv, în aplicații, în setări și pe web. Folosește tastele săgeată ca să navighezi în aplicațiile tale.</translation>
<translation id="8725488761726303204">Peste <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Terminat</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}few{# h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ru.xtb b/chromium/ui/strings/translations/ui_strings_ru.xtb
index e0832270221..0b431f33e69 100644
--- a/chromium/ui/strings/translations/ui_strings_ru.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ru.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Калибровка завершена</translation>
<translation id="252373100621549798">Неизвестный дисплей</translation>
<translation id="2545651323591713692">Отложить</translation>
+<translation id="2570734079541893434">Настройки</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{через 1 ч.}one{через # ч.}few{через # ч.}many{через # ч.}other{через # ч.}}</translation>
<translation id="2583543531130364912">Откалибруйте сенсорный экран</translation>
<translation id="2666092431469916601">Наверх</translation>
<translation id="2701330563083355633">С устройства "<ph name="DEVICE_NAME" />"</translation>
+<translation id="271033894570825754">Новый</translation>
<translation id="2743387203779672305">Скопировать в буфер</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Открыть папку.</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Эмодзи и символы</translation>
<translation id="5476505524087279545">снять галочку</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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Закрыть</translation>
<translation id="6119846243427417423">активировать</translation>
<translation id="6129953537138746214">Пробел</translation>
+<translation id="6134259848159370930">Поиск на устройстве, в приложениях, настройках и Интернете…</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> Б/с</translation>
<translation id="6156262341071374681">Просмотреть все приложения</translation>
<translation id="6165508094623778733">Подробнее</translation>
+<translation id="6166852626429024716">Поиск на устройстве, в приложениях, настройках и Интернете…</translation>
<translation id="6264365405983206840">Выделить все</translation>
<translation id="6351032674660237738">ПРЕДЛАГАЕМЫЕ ПРИЛОЖЕНИЯ</translation>
<translation id="6364916375976753737">Прокрутка влево</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Осталась 1 мин.}one{Осталась # мин.}few{Осталось # мин.}many{Осталось # мин.}other{Осталось # мин.}}</translation>
<translation id="7319740667687257810">Панель запуска, частичный список приложений</translation>
-<translation id="7352651011704765696">Ошибка</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 мин. назад}one{# мин. назад}few{# мин. назад}many{# мин. назад}other{# мин. назад}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Осталась 1 минута}one{Осталась # минута}few{Осталось # минуты}many{Осталось # минут}other{Осталось # минуты}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Приложение перенесено на страницу <ph name="PAGE_NUMBER" />, строка <ph name="ROW_NUMBER" />, столбец <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Не блокировать</translation>
<translation id="7907591526440419938">Открытие файла</translation>
+<translation id="7952747673138230804">В Chrome OS показываются рекомендации нового контента. Статистику для улучшения рекомендаций мы будем собирать, только если вы разрешите отправку данных об использовании функции. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{У вас более 1 непрочитанного уведомления}one{У вас более # непрочитанного уведомления}few{У вас более # непрочитанных уведомлений}many{У вас более # непрочитанных уведомлений}other{У вас более # непрочитанного уведомления}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{через 1 мин.}one{через # мин.}few{через # мин.}many{через # мин.}other{через # мин.}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Файл <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Временное хранилище будет всегда отображаться</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> КБ/с</translation>
+<translation id="8685326675965865247">Поиск на устройстве, в приложениях, настройках и Интернете. Чтобы переходить от одного приложения к другому, используйте клавиши со стрелками.</translation>
<translation id="8725488761726303204">Ещё <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Готово</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 ч.}one{# ч.}few{# ч.}many{# ч.}other{# ч.}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_si.xtb b/chromium/ui/strings/translations/ui_strings_si.xtb
index b5668bdbfb7..8b54fab2a2b 100644
--- a/chromium/ui/strings/translations/ui_strings_si.xtb
+++ b/chromium/ui/strings/translations/ui_strings_si.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">ක්‍රමාංකනය සම්පූර්ණයි</translation>
<translation id="252373100621549798">නොදන්නා තිරය</translation>
<translation id="2545651323591713692">මඳක් නිද්‍රා කරන්න</translation>
+<translation id="2570734079541893434">සැකසීම් කළමනාකරණය කරන්න</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 පැයකින්}one{පැය #කින්}other{පැය #කින්}}</translation>
<translation id="2583543531130364912">ඔබේ ස්පර්ශ තිරය ක්‍රමාංකනය කරන්න</translation>
<translation id="2666092431469916601">ඉහල</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> වෙතින් බෙදා ගන්නා ලදි</translation>
+<translation id="271033894570825754">පුවත්</translation>
<translation id="2743387203779672305">ක්ලිප්බෝඩ් එකට පිටපත් කරන්න</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">ෆෝල්ඩරය විවෘත කරන්න</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">ඉමොජි &amp;&amp; සංකේත</translation>
<translation id="5476505524087279545">සලකුණු කර නොමැත</translation>
<translation id="547979256943495781">රාක්කය දකුණට</translation>
+<translation id="5528053674512161860">සංවර්ධක UI මොඩියුලය (dev_ui) ස්ථාපන කර නැති බැවින් පිටුව පූරණ කිරීම අසමත් විය</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> පද්ධතිය</translation>
<translation id="5583640892426849032">ආපසුයවනය</translation>
<translation id="5613020302032141669">වම් ඊතලය</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">වසන්න</translation>
<translation id="6119846243427417423">සක්‍රීය කරන්න</translation>
<translation id="6129953537138746214">හිඩස</translation>
+<translation id="6134259848159370930">ඔබේ උපාංගය, යෙදුම්, සැකසීම් සහ වෙබය තුළ සොයන්න.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">සියලු යෙදුම්වලට දිග හරින්න</translation>
<translation id="6165508094623778733">තව දැන ගන්න</translation>
+<translation id="6166852626429024716">ඔබේ උපාංගය, යෙදුම්, සැකසීම්, වෙබය තුළ සොයන්න...</translation>
<translation id="6264365405983206840">සියල්ල තෝරන්න</translation>
<translation id="6351032674660237738">යෙදුම් යෝජනා</translation>
<translation id="6364916375976753737">වමට ස්ක්‍රෝල් කරන්න</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{මිනිත්තු 1 ක් ඉතිරියි}one{මිනිත්තු # ක් ඉතිරියි}other{මිනිත්තු # ක් ඉතිරියි}}</translation>
<translation id="7319740667687257810">දියත්කරණය, අර්ධ දසුන</translation>
-<translation id="7352651011704765696">යමක් වැරදිනි</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{මිනි 1 කට පෙර}one{මිනි # කට පෙර}other{මිනි # කට පෙර}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{මිනිත්තු 1 ක් ඉතිරියි}one{මිනිත්තු # ක් ඉතිරියි}other{මිනිත්තු # ක් ඉතිරියි}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537"><ph name="PAGE_NUMBER" /> වෙනි පිටුව, <ph name="ROW_NUMBER" /> වෙනි පේළිය, <ph name="COLUMN_NUMBER" /> වෙනි තීරුව වෙත ගෙන ගියා.</translation>
<translation id="7879499977785298635">අවහිර නොකරන්න</translation>
<translation id="7907591526440419938">ගොනුව විවෘත කරන්න</translation>
+<translation id="7952747673138230804">Chrome OS ගවේෂණය කිරීමට නව අන්තර්ගත සඳහා යෝජනා පෙන්වයි. ඔබ භාවිත දත්ත බෙදා ගැනීමට තෝරා ගෙන ඇති නම් පමණක් ගුණත්වය වැඩි දියුණු කිරීමට සංඛ්‍යාලේඛන යවයි. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">විධානය</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{1 ට වැඩි නොකියවූ දැනුම්දීමක්}one{# ට වැඩි නොකියවූ දැනුම්දීම්}other{# ට වැඩි නොකියවූ දැනුම්දීම්}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 විනාඩියකින්}one{විනාඩි #කින්}other{විනාඩි #කින්}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ගොනුව (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">රාක්කය සැම විට පෙන්වනු ලැබේ</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">ඔබගේ උපාංගය, යෙදුම්, සැකසීම් සහ වෙබය තුළ සොයන්න. ඔබගේ යෙදුම් සංචලන කිරීමට ඊතල යතුරු භාවිත කරන්න.</translation>
<translation id="8725488761726303204">තව +<ph name="NUMBER" /></translation>
<translation id="8730621377337864115">අවසන්</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1h}one{#h}other{#h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sk.xtb b/chromium/ui/strings/translations/ui_strings_sk.xtb
index dc2fcfa2010..e8118007695 100644
--- a/chromium/ui/strings/translations/ui_strings_sk.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sk.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibrácia je dokončená</translation>
<translation id="252373100621549798">Neznáma obrazovka</translation>
<translation id="2545651323591713692">Stlmiť</translation>
+<translation id="2570734079541893434">Spravovať nastavenia</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{o 1 h}few{o # h}many{o # h}other{o # h}}</translation>
<translation id="2583543531130364912">Skalibrujte dotykovú obrazovku</translation>
<translation id="2666092431469916601">Vrch</translation>
<translation id="2701330563083355633">Zdieľané zo zariadenia <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Nové</translation>
<translation id="2743387203779672305">Kopírovať do schránky</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Otvoriť priečinok</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emodži a symboly</translation>
<translation id="5476505524087279545">zrušiť označenie</translation>
<translation id="547979256943495781">Polička vpravo</translation>
+<translation id="5528053674512161860">Načítanie stránky zlyhalo, pretože nie je nainštalovaný modul používateľského rozhrania pre vývojára (dev_ui)</translation>
<translation id="5574202486608032840">Systém <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Šípka doľava</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Zavrieť</translation>
<translation id="6119846243427417423">aktivovať</translation>
<translation id="6129953537138746214">Medzera</translation>
+<translation id="6134259848159370930">Vyhľadávajte v zariadení, aplikáciách, nastaveniach a na internete.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Rozbaliť na všetky aplikácie</translation>
<translation id="6165508094623778733">Ďalšie informácie</translation>
+<translation id="6166852626429024716">Vyhľadávajte v zariadení, aplikáciách, nastaveniach a na internete…</translation>
<translation id="6264365405983206840">Vybrať &amp;všetko</translation>
<translation id="6351032674660237738">NÁVRHY APLIKÁCIÍ</translation>
<translation id="6364916375976753737">Rolovať doľava</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Zostáva 1 min}few{Zostávajú # min}many{Zostáva # min}other{Zostáva # min}}</translation>
<translation id="7319740667687257810">Launcher, čiastočné zobrazenie</translation>
-<translation id="7352651011704765696">Vyskytla sa chyba</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Pred 1 min}few{Pred # min}many{Pred # min}other{Pred # min}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Zostáva 1 minúta}few{Zostávajú # minúty}many{Zostáva # minúty}other{Zostáva # minút}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Prechod na <ph name="PAGE_NUMBER" />. stránku, <ph name="ROW_NUMBER" />. riadok,<ph name="COLUMN_NUMBER" />. stĺpec.</translation>
<translation id="7879499977785298635">Neblokovať</translation>
<translation id="7907591526440419938">Otvoriť súbor</translation>
+<translation id="7952747673138230804">Chrome OS zobrazuje návrhy na preskúmanie nového obsahu. Odosiela štatistiky na zlepšovanie kvality iba vtedy, keď ste vybrali zdieľanie údajov o používaní. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Príkaz</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Viac ako 1 neprečítané upozornenie}few{Viac ako # neprečítané upozornenia}many{More than # unread notifications}other{Viac ako # neprečítaných upozornení}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{o 1 mes.}few{o # mes.}many{o # mes.}other{o # mes.}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Súbor (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Polička sa vždy zobrazuje</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> kB/s</translation>
+<translation id="8685326675965865247">Vyhľadávajte v zariadení, aplikáciách, nastaveniach a na internete. Medzi aplikáciami prechádzajte klávesmi so šípkami.</translation>
<translation id="8725488761726303204">ďalšie (<ph name="NUMBER" />)</translation>
<translation id="8730621377337864115">Hotovo</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}few{# h}many{# h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sl.xtb b/chromium/ui/strings/translations/ui_strings_sl.xtb
index 327990db326..dab1d0cec39 100644
--- a/chromium/ui/strings/translations/ui_strings_sl.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sl.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Umerjanje je končano</translation>
<translation id="252373100621549798">Neznan prikaz</translation>
<translation id="2545651323591713692">Preloži</translation>
+<translation id="2570734079541893434">Upravljanje nastavitev</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{čez 1 h}one{čez # h}two{čez # h}few{čez # h}other{čez # h}}</translation>
<translation id="2583543531130364912">Umerjanje zaslona na dotik</translation>
<translation id="2666092431469916601">Na vrh</translation>
<translation id="2701330563083355633">V skupno rabo dala naprava: <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Novo</translation>
<translation id="2743387203779672305">Kopiraj v odložišče</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Odpri mapo</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emodži in drugi znaki</translation>
<translation id="5476505524087279545">počisti izbor</translation>
<translation id="547979256943495781">Polica na desni</translation>
+<translation id="5528053674512161860">Nalaganje strani ni uspelo, ker modul uporabniškega vmesnika za razvijalce (dev_ui) ni nameščen</translation>
<translation id="5583640892426849032">Vračalka</translation>
<translation id="5613020302032141669">Puščica levo</translation>
<translation id="5675363643668471212">Element na polici</translation>
@@ -151,10 +154,12 @@
<translation id="6040143037577758943">Zapri</translation>
<translation id="6119846243427417423">aktiviraj</translation>
<translation id="6129953537138746214">Presledek</translation>
+<translation id="6134259848159370930">Iščite v napravi, aplikacijah, nastavitvah in spletu.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Razširitev na vse aplikacije</translation>
<translation id="6165508094623778733">Več o tem</translation>
+<translation id="6166852626429024716">Iščite v napravi, aplikacijah, nastavitvah, spletu …</translation>
<translation id="6264365405983206840">Izberi &amp;vse</translation>
<translation id="6351032674660237738">PREDLOGI ZA APLIKACIJE</translation>
<translation id="6364916375976753737">Pomik levo</translation>
@@ -191,7 +196,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Še 1 min}one{Še # min}two{Še # min}few{Še # min}other{Še # min}}</translation>
<translation id="7319740667687257810">Zaganjalnik, delni pogled</translation>
-<translation id="7352651011704765696">Prišlo je do neznane težave</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Pred 1 min}one{Pred # min}two{Pred # min}few{Pred # min}other{Pred # min}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Še 1 min}one{Še # min}two{Še # min}few{Še # min}other{Še # min}}</translation>
@@ -204,6 +208,7 @@
<translation id="7848989271541991537">Premaknjeno na <ph name="PAGE_NUMBER" />. stran, <ph name="ROW_NUMBER" />. vrstico, <ph name="COLUMN_NUMBER" />. stolpec.</translation>
<translation id="7879499977785298635">Ne blokiraj</translation>
<translation id="7907591526440419938">Odpri datoteko</translation>
+<translation id="7952747673138230804">Chrome OS prikazuje predloge za novo vsebino, ki jo lahko raziščete. Statistične podatke za izboljšanje kakovosti pošilja samo, če ste izbrali možnost deljenja podatkov o uporabi. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Več kot 1 neprebrano obvestilo}one{Več kot # neprebrano obvestilo}two{Več kot # neprebrani obvestili}few{Več kot # neprebrana obvestila}other{Več kot # neprebranih obvestil}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{čez 1 min}one{čez # min}two{čez # min}few{čez # min}other{čez # min}}</translation>
@@ -230,6 +235,7 @@
<translation id="8602707065186045623">Datoteka <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Polica je vedno prikazana</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Iščite v napravi, aplikacijah, nastavitvah in spletu. S puščičnimi tipkami se pomikajte po aplikacijah.</translation>
<translation id="8725488761726303204">in še <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Končano</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 h}one{# h}two{# h}few{# h}other{# h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sq.xtb b/chromium/ui/strings/translations/ui_strings_sq.xtb
index d9de6b93e94..958d3801534 100644
--- a/chromium/ui/strings/translations/ui_strings_sq.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sq.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibrimi përfundoi</translation>
<translation id="252373100621549798">Ekran i panjohur</translation>
<translation id="2545651323591713692">Shty alarmin</translation>
+<translation id="2570734079541893434">Menaxho cilësimet</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{në 1 orë}other{në # orë}}</translation>
<translation id="2583543531130364912">Kalibro ekranin me prekje</translation>
<translation id="2666092431469916601">I sipërm</translation>
<translation id="2701330563083355633">Ndarë nga <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">E re</translation>
<translation id="2743387203779672305">Kopjo te kujtesa e fragmenteve</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Hap dosjen</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emojit dhe simbolet</translation>
<translation id="5476505524087279545">anulo zgjedhjen</translation>
<translation id="547979256943495781">Rafti në të djathtë</translation>
+<translation id="5528053674512161860">Ngarkimi i faqes dështoi sepse moduli i ndërfaqes së përdoruesit të zhvilluesit (dev_ui) nuk është instaluar</translation>
<translation id="5574202486608032840">Sistemi <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Hapësirë prapa</translation>
<translation id="5613020302032141669">Shigjeta majtas</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Mbyll</translation>
<translation id="6119846243427417423">aktivizo</translation>
<translation id="6129953537138746214">Hapësirë</translation>
+<translation id="6134259848159370930">Kërko në pajisjen tënde, aplikacione, cilësime dhe ueb.</translation>
<translation id="6135826906199951471">Fshi</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Zgjero te të gjitha aplikacionet</translation>
<translation id="6165508094623778733">Mëso më shumë</translation>
+<translation id="6166852626429024716">Kërko në pajisjen tënde, aplikacione, cilësime, ueb...</translation>
<translation id="6264365405983206840">Zgjidh të &amp;gjitha</translation>
<translation id="6351032674660237738">SUGJERIMET E APLIKACIONEVE</translation>
<translation id="6364916375976753737">Lëvize majtas</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 min. e mbetur}other{# min. të mbetura}}</translation>
<translation id="7319740667687257810">Nisësi, pamje e pjesëshme</translation>
-<translation id="7352651011704765696">Diçka shkoi keq</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 minutë më parë}other{# minuta më parë}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 minutë e mbetur}other{# minuta të mbetura}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">U zhvendos te faqja <ph name="PAGE_NUMBER" />, radha <ph name="ROW_NUMBER" />, kolona <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Mos blloko</translation>
<translation id="7907591526440419938">Hap skedarin</translation>
+<translation id="7952747673138230804">Chrome OS shfaq sugjerimet për përmbajtje të re për të eksploruar. Dërgon statistika për të përmirësuar cilësinë vetëm nëse ke zgjedhur të ndash të dhënat e përdorimit. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Komanda</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Më shumë se 1 njoftim i palexuar}other{Më shumë se # njoftime të palexuara}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{në 1 min.}other{në # min.}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Skedar <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Rafti shfaqet gjithmonë</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Kërko në pajisjen tënde, aplikacione, cilësime dhe ueb. Përdor tastet e shigjetave për të naviguar nëpër aplikacione.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> të tjerë</translation>
<translation id="8730621377337864115">U krye</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 o}other{# o}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sr-Latn.xtb b/chromium/ui/strings/translations/ui_strings_sr-Latn.xtb
index 2716ed47e6b..21d7321b49f 100644
--- a/chromium/ui/strings/translations/ui_strings_sr-Latn.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sr-Latn.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibracija je dovršena</translation>
<translation id="252373100621549798">Nepoznati prikaz</translation>
<translation id="2545651323591713692">Odložite</translation>
+<translation id="2570734079541893434">Upravljajte podešavanjima</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{za 1 č}one{za # č}few{za # č}other{za # č}}</translation>
<translation id="2583543531130364912">Kalibracija dodirnog ekrana</translation>
<translation id="2666092431469916601">Vrh</translation>
<translation id="2701330563083355633">Deljeno sa: <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Novo</translation>
<translation id="2743387203779672305">Kopiraj u memoriju</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Otvorite direktorijum</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emodži i simboli</translation>
<translation id="5476505524087279545">opozovi izbor</translation>
<translation id="547979256943495781">Polica na desnoj strani</translation>
+<translation id="5528053674512161860">Učitavanje stranice nije uspelo jer programerov modul korisničkog interfejsa (dev_ui) nije instaliran</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> sistem</translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Strelica nalevo</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Zatvori</translation>
<translation id="6119846243427417423">aktiviraj</translation>
<translation id="6129953537138746214">Razmak</translation>
+<translation id="6134259848159370930">Pretražujte uređaj, aplikacije, podešavanja i veb.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Proširite na sve aplikacije</translation>
<translation id="6165508094623778733">Saznajte više</translation>
+<translation id="6166852626429024716">Pretražujte uređaj, aplikacije, podešavanja, veb...</translation>
<translation id="6264365405983206840">Izaberi &amp;sve</translation>
<translation id="6351032674660237738">PREDLOZI APLIKACIJA</translation>
<translation id="6364916375976753737">Pomeri nalevo</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Još 1 min}one{Još # min}few{Još # min}other{Još # min}}</translation>
<translation id="7319740667687257810">Pokretač, delimičan prikaz</translation>
-<translation id="7352651011704765696">Nešto nije u redu</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Pre 1 min}one{Pre # min}few{Pre # min}other{Pre # min}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Još 1 minut}one{Još # minut}few{Još # minuta}other{Još # minuta}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Premešteno je na <ph name="PAGE_NUMBER" />. stranicu, <ph name="ROW_NUMBER" />. red, <ph name="COLUMN_NUMBER" />. kolona.</translation>
<translation id="7879499977785298635">Ne blokiraj</translation>
<translation id="7907591526440419938">Otvaranje datoteke</translation>
+<translation id="7952747673138230804">Chrome OS prikazuje predloge za nov sadržaj za istraživanje. Šalje statistiku da bi se poboljšao kvalitet samo ako ste odabrali da delite podatke o korišćenju. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Više od 1 nepročitanog obaveštenja}one{Više od # nepročitanog obaveštenja}few{Više od # nepročitana obaveštenja}other{Više od # nepročitanih obaveštenja}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{za 1 min}one{za # min}few{za # min}other{za # min}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> datoteka (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Polica se uvek prikazuje</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Pretražujte uređaj, aplikacije, podešavanja i veb. Koristite tastere sa strelicama da biste se kretali kroz aplikacije.</translation>
<translation id="8725488761726303204">i još <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Gotovo</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 s}one{# s}few{# s}other{# s}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sr.xtb b/chromium/ui/strings/translations/ui_strings_sr.xtb
index d009f032ce0..ad630f74399 100644
--- a/chromium/ui/strings/translations/ui_strings_sr.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sr.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Калибрација је довршена</translation>
<translation id="252373100621549798">Непознати приказ</translation>
<translation id="2545651323591713692">Одложите</translation>
+<translation id="2570734079541893434">Управљајте подешавањима</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{за 1 ч}one{за # ч}few{за # ч}other{за # ч}}</translation>
<translation id="2583543531130364912">Калибрација додирног екрана</translation>
<translation id="2666092431469916601">Врх</translation>
<translation id="2701330563083355633">Дељено са: <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Ново</translation>
<translation id="2743387203779672305">Копирај у меморију</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Отворите директоријум</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Емоџи и симболи</translation>
<translation id="5476505524087279545">опозови избор</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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Затвори</translation>
<translation id="6119846243427417423">активирај</translation>
<translation id="6129953537138746214">Размак</translation>
+<translation id="6134259848159370930">Претражујте уређај, апликације, подешавања и веб.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Проширите на све апликације</translation>
<translation id="6165508094623778733">Сазнајте више</translation>
+<translation id="6166852626429024716">Претражујте уређај, апликације, подешавања, веб...</translation>
<translation id="6264365405983206840">Изабери &amp;све</translation>
<translation id="6351032674660237738">ПРЕДЛОЗИ АПЛИКАЦИЈА</translation>
<translation id="6364916375976753737">Помери налево</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Још 1 мин}one{Још # мин}few{Још # мин}other{Још # мин}}</translation>
<translation id="7319740667687257810">Покретач, делимичан приказ</translation>
-<translation id="7352651011704765696">Нешто није у реду</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Пре 1 мин}one{Пре # мин}few{Пре # мин}other{Пре # мин}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Још 1 минут}one{Још # минут}few{Још # минута}other{Још # минута}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Премештено је на <ph name="PAGE_NUMBER" />. страницу, <ph name="ROW_NUMBER" />. ред, <ph name="COLUMN_NUMBER" />. колона.</translation>
<translation id="7879499977785298635">Не блокирај</translation>
<translation id="7907591526440419938">Отварање датотеке</translation>
+<translation id="7952747673138230804">Chrome ОС приказује предлоге за нов садржај за истраживање. Шаље статистику да би се побољшао квалитет само ако сте одабрали да делите податке о коришћењу. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Више од 1 непрочитаног обавештења}one{Више од # непрочитаног обавештења}few{Више од # непрочитана обавештења}other{Више од # непрочитаних обавештења}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{за 1 мин}one{за # мин}few{за # мин}other{за # мин}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> датотека (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Полица се увек приказује</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Претражујте уређај, апликације, подешавања и веб. Користите тастере са стрелицама да бисте се кретали кроз апликације.</translation>
<translation id="8725488761726303204">и још <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Готово</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 с}one{# с}few{# с}other{# с}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sv.xtb b/chromium/ui/strings/translations/ui_strings_sv.xtb
index d7111e15e58..9bdbe567ac4 100644
--- a/chromium/ui/strings/translations/ui_strings_sv.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sv.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibreringen är slutförd</translation>
<translation id="252373100621549798">Okänd visning</translation>
<translation id="2545651323591713692">Snooza</translation>
+<translation id="2570734079541893434">Hantera inställningar</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{om 1 tim}other{om # tim}}</translation>
<translation id="2583543531130364912">Kalibrera pekskärmen</translation>
<translation id="2666092431469916601">Överst</translation>
<translation id="2701330563083355633">Delades från <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Ny</translation>
<translation id="2743387203779672305">Kopiera till Urklipp</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Öppna mappen</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji och symboler</translation>
<translation id="5476505524087279545">kryssa av</translation>
<translation id="547979256943495781">Hyllan till höger</translation>
+<translation id="5528053674512161860">Sidhämtningen misslyckades eftersom utvecklarmodulen för användargränssnitt (dev_ui) inte har installerats</translation>
<translation id="5574202486608032840">Operativsystemet <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Backsteg</translation>
<translation id="5613020302032141669">Vänsterpil</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Stäng</translation>
<translation id="6119846243427417423">aktivera</translation>
<translation id="6129953537138746214">Blanksteg</translation>
+<translation id="6134259848159370930">Sök på enheten, i appar, inställningar och på webben.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/sek</translation>
<translation id="6156262341071374681">Utöka till alla appar</translation>
<translation id="6165508094623778733">Läs mer</translation>
+<translation id="6166852626429024716">Sök på enheten, i appar, inställningar och på webben …</translation>
<translation id="6264365405983206840">Markera &amp;alla</translation>
<translation id="6351032674660237738">APPFÖRSLAG</translation>
<translation id="6364916375976753737">Rulla åt vänster</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 min kvar}other{# min kvar}}</translation>
<translation id="7319740667687257810">Översikt, delvy</translation>
-<translation id="7352651011704765696">Något gick fel</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{för 1 min sedan}other{för # min sedan}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 minut kvar}other{# minuter kvar}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Flyttades till sidan<ph name="PAGE_NUMBER" />, rad <ph name="ROW_NUMBER" />, kolumn <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Blockera inte</translation>
<translation id="7907591526440419938">Öppna fil</translation>
+<translation id="7952747673138230804">Chrome OS visar förslag på nytt innehåll du kan utforska. Skickar bara statistik för att förbättra kvaliteten om du har valt att dela data om användning. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Kommando</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Fler än en oläst avisering}other{Fler än # olästa aviseringar}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{om 1 min}other{om # min}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" />-fil (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Hyllan visas alltid</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> kB/sek</translation>
+<translation id="8685326675965865247">Sök på enheten, i appar, inställningar och på webben. Flytta mellan apparna med piltangenterna.</translation>
<translation id="8725488761726303204">och <ph name="NUMBER" /> till</translation>
<translation id="8730621377337864115">Klart</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 tim}other{# tim}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sw.xtb b/chromium/ui/strings/translations/ui_strings_sw.xtb
index da26900af01..1bab6353510 100644
--- a/chromium/ui/strings/translations/ui_strings_sw.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sw.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Imemaliza kurekebisha usahihi</translation>
<translation id="252373100621549798">Onyesho Lisilojulikana</translation>
<translation id="2545651323591713692">Ahirisha</translation>
+<translation id="2570734079541893434">Dhibiti mipangilio</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{saa 1}other{saa #}}</translation>
<translation id="2583543531130364912">Rekebisha usahihi wa skrini yako ya kugusa</translation>
<translation id="2666092431469916601">Ya Juu</translation>
<translation id="2701330563083355633">Umepokea kutoka <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Mpya</translation>
<translation id="2743387203779672305">Nakili kwenye ubao wa kunakili</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Fungua folda</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji na Ishara</translation>
<translation id="5476505524087279545">toa tiki</translation>
<translation id="547979256943495781">Rafu iko upande wa kulia</translation>
+<translation id="5528053674512161860">Imeshindwa kupakia ukurasa kwa sababu sehemu ya kiolesura cha msanidi programu (dev_ui) haijasakinishwa</translation>
<translation id="5574202486608032840">Mfumo wa <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Mshale Kushoto</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Funga</translation>
<translation id="6119846243427417423">wezesha</translation>
<translation id="6129953537138746214">Nafasi</translation>
+<translation id="6134259848159370930">Tafuta kwenye wavuti, programu, mipangilio na kifaa chako.</translation>
<translation id="6135826906199951471">Futa</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Ziangalie programu zote</translation>
<translation id="6165508094623778733">Pata maelezo zaidi</translation>
+<translation id="6166852626429024716">Tafuta kwenye programu, mipangilio, wavuti, kifaa chako...</translation>
<translation id="6264365405983206840">Chagua &amp;Zote</translation>
<translation id="6351032674660237738">MAPENDEKEZO YA PROGRAMU</translation>
<translation id="6364916375976753737">Sogeza Kushoto</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Imesalia dakika 1}other{Zimesalia dakika #}}</translation>
<translation id="7319740667687257810">Kifungua programu, mwonekano mdogo</translation>
-<translation id="7352651011704765696">Hitilafu fulani imetokea</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{Dakika 1 iliyopita}other{Dakika # zilizopita}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Imesalia dakika 1}other{Zimesalia dakika #}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Imehamishiwa kwenye Ukurasa wa <ph name="PAGE_NUMBER" />, safu mlalo ya <ph name="ROW_NUMBER" />, safu wima ya <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Usizuie</translation>
<translation id="7907591526440419938">Fungua Faili</translation>
+<translation id="7952747673138230804">Mfumo wa Uendeshaji wa Chrome huonyesha mapendekezo ya maudhui mapya ya kugundua. Hutuma takwimu za kuimarisha ubora iwapo tu umechagua kushiriki data ya matumizi. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Amri</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Hujasoma zaidi ya arifa 1}other{Hujasoma zaidi ya arifa #}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{dak 1}other{dak #}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Faili ya <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Rafu inaonyeshwa kila wakati</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Tafuta kwenye programu, mipangilio, wavuti na kifaa chako. Tumia vitufe vya vishale ili upitie programu zako.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> zaidi</translation>
<translation id="8730621377337864115">Nimemaliza</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{Saa 1}other{Saa #}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ta.xtb b/chromium/ui/strings/translations/ui_strings_ta.xtb
index 78b433b72ba..23b5f0dc726 100644
--- a/chromium/ui/strings/translations/ui_strings_ta.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ta.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">அளவுத்திருத்தம் முடிந்தது</translation>
<translation id="252373100621549798">அறியாதது</translation>
<translation id="2545651323591713692">ஒத்திவை</translation>
+<translation id="2570734079541893434">அமைப்புகளை நிர்வகியுங்கள்</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{இன்னும் 1ம}other{இன்னும் #ம}}</translation>
<translation id="2583543531130364912">டச்ஸ்கிரீனை அளவுத்திருத்தம் செய்யவும்</translation>
<translation id="2666092431469916601">மேலே</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> சாதனத்தில் இருந்து பகிரப்பட்டுள்ளது</translation>
+<translation id="271033894570825754">புதிது</translation>
<translation id="2743387203779672305">கிளிப்போர்டுக்கு நகலெடு</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">கோப்புறையைத் திற</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">ஈமோஜி &amp;&amp; குறியீடுகள்</translation>
<translation id="5476505524087279545">தேர்வு நீக்கு</translation>
<translation id="547979256943495781">ஷெல்ஃப் வலப்புறம் உள்ளது</translation>
+<translation id="5528053674512161860">டெவெலப்பர் UI மாடியூல் (dev_ui) நிறுவப்படாததால் பக்கத்தை ஏற்ற முடியவில்லை</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> சாதனம்</translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">இடது அம்பு</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">மூடு</translation>
<translation id="6119846243427417423">செயல்படுத்து</translation>
<translation id="6129953537138746214">இடைவெளி</translation>
+<translation id="6134259848159370930">உங்கள் சாதனம், ஆப்ஸ், இணையம் ஆகியவற்றில் தேடவும்.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> பை/வி</translation>
<translation id="6156262341071374681">எல்லாப் பயன்பாடுகளையும் காட்டும் பட்டன்</translation>
<translation id="6165508094623778733">மேலும் அறிக</translation>
+<translation id="6166852626429024716">உங்கள் சாதனம், ஆப்ஸ், அமைப்புகள், இணையம் ஆகியவற்றில் தேடுக...</translation>
<translation id="6264365405983206840">அ&amp;னைத்தையும் தேர்ந்தெடு</translation>
<translation id="6351032674660237738">பயன்பாட்டுப் பரிந்துரைகள்</translation>
<translation id="6364916375976753737">இடப்புறம் நகர்த்து</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 நிமிடம் உள்ளது}other{# நிமிடங்கள் உள்ளன}}</translation>
<translation id="7319740667687257810">தொடக்கி, பகுதியளவு காட்சி</translation>
-<translation id="7352651011704765696">ஏதோ தவறு ஏற்பட்டது</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 நிமிடம் முன்பு}other{# நிமிடங்கள் முன்பு}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 நிமிடம் மீதமுள்ளது}other{# நிமிடங்கள் மீதமுள்ளன}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">பக்கம் <ph name="PAGE_NUMBER" />, வரிசை <ph name="ROW_NUMBER" />, நெடுவரிசை <ph name="COLUMN_NUMBER" />க்கு நகர்த்தப்பட்டது.</translation>
<translation id="7879499977785298635">தடுக்காதே</translation>
<translation id="7907591526440419938">கோப்பைத் திற</translation>
+<translation id="7952747673138230804">உலாவுவதற்கான புதிய உள்ளடக்கப் பரிந்துரைகளை Chrome OS காட்டுகிறது. உபயோகத் தரவுப் பகிர்வை தேர்வுசெய்திருந்தால் மட்டுமே தரத்தை மேம்படுத்துவதற்காகப் புள்ளிவிவரங்களை அனுப்பும். <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">கமாண்ட்</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{1க்கு மேற்பட்ட அறிவிப்புகள் படிக்கப்படாமல் உள்ளன}other{#க்கு மேற்பட்ட அறிவிப்புகள் படிக்கப்படாமல் உள்ளன}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{இன்னும் 1நி}other{இன்னும் #நி}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" />கோப்பு(.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">ஷெல்ஃப் எப்போதும் காட்டப்படும்</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> கி.பை./வி</translation>
+<translation id="8685326675965865247">உங்கள் சாதனம், ஆப்ஸ், அமைப்புகள், இணையம் ஆகியவற்றில் தேடவும். ஆப்ஸுக்குச் செல்ல அம்புக்குறி விசைகளைப் பயன்படுத்தவும்.</translation>
<translation id="8725488761726303204">மேலும் <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">முடிந்தது</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1ம}other{#ம}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_te.xtb b/chromium/ui/strings/translations/ui_strings_te.xtb
index 5958de261d6..c0812b6e2a7 100644
--- a/chromium/ui/strings/translations/ui_strings_te.xtb
+++ b/chromium/ui/strings/translations/ui_strings_te.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">క్రమాంకనం పూర్తయింది</translation>
<translation id="252373100621549798">తెలియని ప్రదర్శన</translation>
<translation id="2545651323591713692">తాత్కాలికంగా ఆపివేయి</translation>
+<translation id="2570734079541893434">సెట్టింగ్‌లను మేనేజ్ చేయండి</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 గంటలో}other{#గంటలలో}}</translation>
<translation id="2583543531130364912">మీ టచ్‌స్క్రీన్‌ను క్రమాంకనం చేయండి</translation>
<translation id="2666092431469916601">పైన</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> నుండి షేర్ చేయబడింది</translation>
+<translation id="271033894570825754">కొత్తది</translation>
<translation id="2743387203779672305">క్లిప్‌బోర్డ్‌కు కాపీ చేయి</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">ఫోల్డర్‌ను తెరవండి</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">ఎమోజి &amp;&amp; చిహ్నాలు</translation>
<translation id="5476505524087279545">ఎంపిక చేయబడలేదు</translation>
<translation id="547979256943495781">అర కుడి వైపున ఉంది</translation>
+<translation id="5528053674512161860">డెవలపర్ UI మాడ్యూల్ (dev_ui) ఇన్‌స్టాల్ చేయనందున పేజీ లోడ్ కాలేదు</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> సిస్టమ్</translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">ఎడమ బాణం</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">మూసివేయి</translation>
<translation id="6119846243427417423">ఆక్టివేట్ చేయి</translation>
<translation id="6129953537138746214">ఖాళీ</translation>
+<translation id="6134259848159370930">మీ పరికరం, యాప్‌లు, సెట్టింగ్‌లు, వెబ్‌ను వెతకండి.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">అన్ని యాప్‌ల కోసం విస్తరించండి</translation>
<translation id="6165508094623778733">మరింత తెలుసుకోండి</translation>
+<translation id="6166852626429024716">మీ పరికరం, యాప్‌లు, సెట్టింగ్‌లు, వెబ్‌ను వెతకండి...</translation>
<translation id="6264365405983206840">&amp;అన్నీ ఎంచుకోండి</translation>
<translation id="6351032674660237738">యాప్ సూచనలు</translation>
<translation id="6364916375976753737">ఎడమకు స్క్రోల్ చేయి</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 నిమి. మిగిలి ఉంది}other{# నిమి. మిగిలి ఉన్నాయి}}</translation>
<translation id="7319740667687257810">లాంఛ‌ర్‌, పాక్షిక వీక్షణ</translation>
-<translation id="7352651011704765696">ఏదో తప్పు జరిగింది</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 నిమి. క్రితం}other{# నిమి. క్రితం}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 నిమిషం మిగిలి ఉంది}other{# నిమిషాలు మిగిలి ఉన్నాయి}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537"><ph name="PAGE_NUMBER" />వ పేజీలో <ph name="ROW_NUMBER" />వ అడ్డు వరుస, '<ph name="COLUMN_NUMBER" />' నిలువు వరుసకు తరలించబడింది.</translation>
<translation id="7879499977785298635">బ్లాక్ చేయవద్దు</translation>
<translation id="7907591526440419938">ఫైల్‌ను తెరువు</translation>
+<translation id="7952747673138230804">కొత్త కెంటెంట్‌ను అన్వేషించడానికి Chrome OS సూచనలను చూపుతుంది. మీరు డేటా వినియోగాన్ని షేర్ చేయడాన్ని ఎంచుకుంటే మాత్రమే సూచనలు మెరుగుపరచడానికి గణాంకాలను పంపుతుంది. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">ఆదేశం</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{1 కంటే ఎక్కువ చదవని నోటిఫికేషన్‌లు ఉన్నాయి}other{# కంటే ఎక్కువ చదవని నోటిఫికేషన్‌లు ఉన్నాయి}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 నిమిషంలో}other{# నిమిషంలో}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ఫైల్ (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">అర ఎల్లప్పుడూ చూపబడుతుంది</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/సె</translation>
+<translation id="8685326675965865247">మీ పరికరం, యాప్‌లు, సెట్టింగ్‌లు, వెబ్‌ను వెతకండి. మీ యాప్‌లను నావిగేట్ చేయడానికి బాణం గుర్తు ఉన్న కీలను ఉపయోగించండి.</translation>
<translation id="8725488761726303204">+ మరో <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">పూర్తయింది</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1గం}other{#గం}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_th.xtb b/chromium/ui/strings/translations/ui_strings_th.xtb
index d1574f4b7ee..e43a1cd912b 100644
--- a/chromium/ui/strings/translations/ui_strings_th.xtb
+++ b/chromium/ui/strings/translations/ui_strings_th.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">การปรับเทียบเสร็จสมบูรณ์</translation>
<translation id="252373100621549798">หน้าจอที่ไม่รู้จัก</translation>
<translation id="2545651323591713692">เลื่อนการปลุก</translation>
+<translation id="2570734079541893434">จัดการการตั้งค่า</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{ใน 1 ชม.}other{ใน # ชม.}}</translation>
<translation id="2583543531130364912">ปรับเทียบหน้าจอสัมผัส</translation>
<translation id="2666092431469916601">ด้านบน</translation>
<translation id="2701330563083355633">แชร์จาก <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">ใหม่</translation>
<translation id="2743387203779672305">คัดลอกไว้ที่คลิปบอร์ด</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">เปิดโฟลเดอร์</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">อีโมจิและสัญลักษณ์</translation>
<translation id="5476505524087279545">ยกเลิกการทำเครื่องหมาย</translation>
<translation id="547979256943495781">ชั้นวางอยู่ทางขวา</translation>
+<translation id="5528053674512161860">โหลดหน้าไม่สำเร็จเนื่องจากไม่ได้ติดตั้งโมดูล UI ของนักพัฒนาซอฟต์แวร์ (dev_ui)</translation>
<translation id="5574202486608032840">ระบบ <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">ลูกศรซ้าย</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">ปิด</translation>
<translation id="6119846243427417423">เปิดใช้งาน</translation>
<translation id="6129953537138746214">ช่องว่าง</translation>
+<translation id="6134259848159370930">ค้นหาอุปกรณ์ แอป การตั้งค่า และเว็บ</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/วินาที</translation>
<translation id="6156262341071374681">แสดงแอปทั้งหมด</translation>
<translation id="6165508094623778733">ดูข้อมูลเพิ่มเติม</translation>
+<translation id="6166852626429024716">ค้นหาอุปกรณ์ แอป การตั้งค่า เว็บ...</translation>
<translation id="6264365405983206840">เลือก&amp;ทั้งหมด</translation>
<translation id="6351032674660237738">คำแนะนำเกี่ยวกับแอป</translation>
<translation id="6364916375976753737">เลื่อนทางซ้าย</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{เหลือ 1 นาที}other{เหลือ # นาที}}</translation>
<translation id="7319740667687257810">Launcher มุมมองบางส่วน</translation>
-<translation id="7352651011704765696">มีข้อผิดพลาดเกิดขึ้น</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 นาทีที่ผ่านมา}other{# นาทีที่ผ่านมา}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{เหลือ 1 นาที}other{เหลือ # นาที}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">ย้ายไปที่หน้า <ph name="PAGE_NUMBER" /> แถว <ph name="ROW_NUMBER" /> คอลัมน์<ph name="COLUMN_NUMBER" /></translation>
<translation id="7879499977785298635">ไม่ต้องบล็อก</translation>
<translation id="7907591526440419938">เปิดไฟล์</translation>
+<translation id="7952747673138230804">Chrome OS จะแสดงคำแนะนำเนื้อหาใหม่ให้สำรวจ ส่งสถิติเพื่อปรับปรุงคุณภาพต่อเมื่อคุณเลือกที่จะแชร์ข้อมูลการใช้งาน <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{มีการแจ้งเตือนที่ยังไม่อ่านมากกว่า 1 รายการ}other{มีการแจ้งเตือนที่ยังไม่อ่านมากกว่า # รายการ}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{ใน 1 นาที}other{ใน # นาที}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">ไฟล์ <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">แสดงชั้นวางเสมอ</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/วินาที</translation>
+<translation id="8685326675965865247">ค้นหาอุปกรณ์ แอป การตั้งค่า และเว็บ ใช้แป้นลูกศรเพื่อไปยังส่วนต่างๆ ของแอป</translation>
<translation id="8725488761726303204">และอีก <ph name="NUMBER" /> รายการ</translation>
<translation id="8730621377337864115">เสร็จสิ้น</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 ชม.}other{# ชม.}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_tr.xtb b/chromium/ui/strings/translations/ui_strings_tr.xtb
index 51c10d2e5b9..26d5be2b2e7 100644
--- a/chromium/ui/strings/translations/ui_strings_tr.xtb
+++ b/chromium/ui/strings/translations/ui_strings_tr.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibrasyon tamamlandı</translation>
<translation id="252373100621549798">Bilinmeyen Görünüm</translation>
<translation id="2545651323591713692">Ertele</translation>
+<translation id="2570734079541893434">Ayarları yönet</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 saat içinde}other{# saat içinde}}</translation>
<translation id="2583543531130364912">Dokunmatik ekranınızı ayarlayın</translation>
<translation id="2666092431469916601">Üst</translation>
<translation id="2701330563083355633">Paylaşan: <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Yeni</translation>
<translation id="2743387203779672305">Panoya kopyala</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Klasörü aç</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji ve Semboller</translation>
<translation id="5476505524087279545">işareti kaldır</translation>
<translation id="547979256943495781">Raf, ekranın sağ tarafında</translation>
+<translation id="5528053674512161860">Geliştirici UI modülü (dev_ui) yüklü olmadığından sayfa yükleme başarısız oldu</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> sistemi</translation>
<translation id="5583640892426849032">Geri al tuşu</translation>
<translation id="5613020302032141669">Sol Ok</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Kapat</translation>
<translation id="6119846243427417423">etkinleştir</translation>
<translation id="6129953537138746214">Boşluk</translation>
+<translation id="6134259848159370930">Cihazınızda, uygulamalarda, ayarlarda ve web'de arama yapın.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/sn</translation>
<translation id="6156262341071374681">Tüm uygulamalara genişlet</translation>
<translation id="6165508094623778733">Daha fazla bilgi</translation>
+<translation id="6166852626429024716">Cihazınızda, uygulamalarda, ayarlarda, web'de arama yapın</translation>
<translation id="6264365405983206840">&amp;Tümünü Seç</translation>
<translation id="6351032674660237738">UYGULAMA ÖNERİLERİ</translation>
<translation id="6364916375976753737">Sola Kaydır</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 dk. kaldı}other{# dk. kaldı}}</translation>
<translation id="7319740667687257810">Launcher, kısmi görünüm</translation>
-<translation id="7352651011704765696">Bir şeyler ters gitti</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 dk. önce}other{# dk. önce}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 dakika kaldı}other{# dakika kaldı}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537"><ph name="PAGE_NUMBER" />. sayfa, <ph name="ROW_NUMBER" />. satır, <ph name="COLUMN_NUMBER" />. sütuna taşındı.</translation>
<translation id="7879499977785298635">Engelleme</translation>
<translation id="7907591526440419938">Dosya Aç</translation>
+<translation id="7952747673138230804">Chrome OS, keşfedilecek yeni içerik önerileri sunar. Yalnızca kullanım verilerini paylaşmayı seçtiyseniz önerileri iyileştirmek için istatistikleri gönderir. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Komut</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{1 taneden fazla okunmamış bildirim var}other{# taneden fazla okunmamış bildirim var}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 dakika içinde}other{# dakika içinde}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Dosyayı <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Raf her zaman gösteriliyor</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/sn</translation>
+<translation id="8685326675965865247">Cihazınızda, uygulamalarınızda, ayarlarınızda ve web'de arama yapın. Uygulamalarınız arasında gezinmek için ok tuşlarını kullanın.</translation>
<translation id="8725488761726303204"><ph name="NUMBER" /> öğe daha</translation>
<translation id="8730621377337864115">Bitti</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 sa.}other{# sa.}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_uk.xtb b/chromium/ui/strings/translations/ui_strings_uk.xtb
index 70d686cb0d8..6d2e4a137dc 100644
--- a/chromium/ui/strings/translations/ui_strings_uk.xtb
+++ b/chromium/ui/strings/translations/ui_strings_uk.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Калібрування завершено</translation>
<translation id="252373100621549798">Невідомий дисплей</translation>
<translation id="2545651323591713692">Відкласти</translation>
+<translation id="2570734079541893434">Керувати налаштуваннями</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{через 1 год}one{через # год}few{через # год}many{через # год}other{через # год}}</translation>
<translation id="2583543531130364912">Відкалібруйте сенсорний екран</translation>
<translation id="2666092431469916601">Верх</translation>
<translation id="2701330563083355633">Надіслано з пристрою "<ph name="DEVICE_NAME" />"</translation>
+<translation id="271033894570825754">Новий</translation>
<translation id="2743387203779672305">Копіювати в буфер</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Відкрити папку</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Смайли та символи</translation>
<translation id="5476505524087279545">зняти прапорець</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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Закрити</translation>
<translation id="6119846243427417423">активувати</translation>
<translation id="6129953537138746214">Пробіл</translation>
+<translation id="6134259848159370930">Шукайте на пристрої, у додатках, налаштуваннях та Інтернеті.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> б/сек.</translation>
<translation id="6156262341071374681">Розгорнути всі додатки</translation>
<translation id="6165508094623778733">Докладніше</translation>
+<translation id="6166852626429024716">Шукайте на пристрої, в додатках, налаштуваннях та Інтернеті…</translation>
<translation id="6264365405983206840">Вибрати &amp;всі</translation>
<translation id="6351032674660237738">ПРОПОЗИЦІЇ ДОДАТКІВ</translation>
<translation id="6364916375976753737">Прокрутка вліво</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Залишилась 1 хв}one{Залишилася # хв}few{Залишилося # хв}many{Залишилося # хв}other{Залишилося # хв}}</translation>
<translation id="7319740667687257810">Панель запуску, частковий перегляд</translation>
-<translation id="7352651011704765696">Виникли проблеми</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 хв тому}one{# хв тому}few{# хв тому}many{# хв тому}other{# хв тому}}</translation>
<translation id="7389409599945284130">– <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Залишилась 1 хвилина}one{Залишилася # хвилина}few{Залишилося # хвилини}many{Залишилося # хвилин}other{Залишилося # хвилини}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Переміщено на сторінку <ph name="PAGE_NUMBER" />, рядок <ph name="ROW_NUMBER" />, стовпець <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Не блокувати</translation>
<translation id="7907591526440419938">Відкрити файл</translation>
+<translation id="7952747673138230804">ОС Chrome показує пропозиції нового контенту. Система надсилає статистику для покращення цієї функції, лише якщо ви погодилися ділитися даними про використання. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Клавіша Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Понад 1 непрочитане сповіщення}one{Понад # непрочитане сповіщення}few{Понад # непрочитані сповіщення}many{Понад # непрочитаних сповіщень}other{Понад # непрочитаного сповіщення}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{через 1 хв}one{через # хв}few{через # хв}many{через # хв}other{через # хв}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">файл <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Полицю завжди видно</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> КБ/сек.</translation>
+<translation id="8685326675965865247">Шукайте на пристрої, у додатках, налаштуваннях та Інтернеті. Натискайте клавіші зі стрілками, щоб переходити між додатками.</translation>
<translation id="8725488761726303204">і ще <ph name="NUMBER" /></translation>
<translation id="8730621377337864115">Готово</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 год}one{# год}few{# год}many{# год}other{# год}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ur.xtb b/chromium/ui/strings/translations/ui_strings_ur.xtb
index d256d929380..5afe31594ba 100644
--- a/chromium/ui/strings/translations/ui_strings_ur.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ur.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">کیلیبریشن مکمل ہوگیا</translation>
<translation id="252373100621549798">نامعلوم ڈسپلے</translation>
<translation id="2545651323591713692">اسنوز کریں</translation>
+<translation id="2570734079541893434">ترتیبات کا نظم کریں</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 گھنٹے میں}other{# گھنٹے میں}}</translation>
<translation id="2583543531130364912">اپنی ٹچ اسکرین کو کیلیبریٹ کریں</translation>
<translation id="2666092431469916601">سرفہرست</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> سے اشتراک کردہ</translation>
+<translation id="271033894570825754">نیا</translation>
<translation id="2743387203779672305">کلپ بورڈ پر کاپی کریں</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />، <ph name="PRICE" /></translation>
<translation id="2803313416453193357">فولڈر کھولیں</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">‏Emoji اور علامات</translation>
<translation id="5476505524087279545">غیر نشان زد کریں</translation>
<translation id="547979256943495781">شیلف دائیں ہے</translation>
+<translation id="5528053674512161860">‏صفحہ لوڈ کرنا ناکام ہوگیا کیونکہ ڈویلپر UI ماڈیول (dev_ui) انسٹال نہیں ہے</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> سسٹم</translation>
<translation id="5583640892426849032">بیک اسپیس</translation>
<translation id="5613020302032141669">بایاں تیر کا نشان</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">بند کریں</translation>
<translation id="6119846243427417423">فعال کریں</translation>
<translation id="6129953537138746214">اسپیس</translation>
+<translation id="6134259848159370930">اپنا آلہ، ایپس، ترتیبات اور ویب تلاش کریں۔</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> بائٹس/سیکنڈ</translation>
<translation id="6156262341071374681">سبھی ایپس کے لیے پھیلائیں</translation>
<translation id="6165508094623778733">مزید جانیں</translation>
+<translation id="6166852626429024716">اپنا آلہ، ایپس، ترتیبات ویب تلاش کریں...</translation>
<translation id="6264365405983206840">&amp;سبھی کو منتخب کریں</translation>
<translation id="6351032674660237738">ایپ کی تجاویز</translation>
<translation id="6364916375976753737">بائیں سکرول کریں</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 منٹ باقی}other{# منٹ باقی}}</translation>
<translation id="7319740667687257810">لانچر، جزوی منظر</translation>
-<translation id="7352651011704765696">کچھ غلط ہو گیا</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 منٹ پہلے}other{# منٹ پہلے}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 منٹ باقی}other{# منٹ باقی}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">صفحہ <ph name="PAGE_NUMBER" />، قطار <ph name="ROW_NUMBER" />، کالم <ph name="COLUMN_NUMBER" /> میں منتقل کر دیا گیا۔</translation>
<translation id="7879499977785298635">مسدود نہ کریں</translation>
<translation id="7907591526440419938">فائل کھولیں</translation>
+<translation id="7952747673138230804">‏Chrome OS نیا مواد دریافت کرنے کیلئے تجاویز دکھاتا ہے۔ یہ کوالٹی کو بہتر بنانے کے لیے اعداد و شمار صرف تب بھیجتا ہے جب آپ نے استعمال کے ڈیٹا کا اشتراک کرنے کو منتخب کیا ہو۔ <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">کمانڈ</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{1 سے زیادہ بغیر پڑھی ہوئی اطلاع}other{# سے زیادہ بغیر پڑھی ہوئی اطلاعات}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 منٹ میں}other{# منٹ میں}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">‏<ph name="SAVEAS_EXTENSION_TYPE" /> فائل (‎.<ph name="SAVEAS_EXTENSION_NAME" />‎)</translation>
<translation id="8649597172973390955">شیلف ہمیشہ دکھایا جاتا ہے</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">اپنا آلہ، ایپس، ترتیبات اور ویب تلاش کریں۔ اپنی ایپس کو نیویگیٹ کرنے کے لیے تیر کے نشان والی کلیدیں استعمال کریں۔</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> مزید</translation>
<translation id="8730621377337864115">ہوگیا</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1h}other{#h}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_uz.xtb b/chromium/ui/strings/translations/ui_strings_uz.xtb
index 89e19b92af2..73eb3291e5a 100644
--- a/chromium/ui/strings/translations/ui_strings_uz.xtb
+++ b/chromium/ui/strings/translations/ui_strings_uz.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Kalibrlash yakunlandi</translation>
<translation id="252373100621549798">Noma’lum displey</translation>
<translation id="2545651323591713692">Kechiktirish</translation>
+<translation id="2570734079541893434">Sozlamalarni boshqarish</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 soatdan keyin}other{# soatdan keyin}}</translation>
<translation id="2583543531130364912">Sensorli ekranni kalibrlang</translation>
<translation id="2666092431469916601">Tepaga</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> orqali ulashilgan</translation>
+<translation id="271033894570825754">Yangi</translation>
<translation id="2743387203779672305">Vaqtincha xotiraga nusxalash</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Jildni ochish</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji va maxsus belgilar</translation>
<translation id="5476505524087279545">belgini olib tashlash</translation>
<translation id="547979256943495781">Javon oʻngda</translation>
+<translation id="5528053674512161860">Dasturchilar UI moduli (dev_ui) oʻrnatilmagani sababli sahifa yuklanmadi</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> tizimi</translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Chap strelka</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Yopish</translation>
<translation id="6119846243427417423">faollashtirish</translation>
<translation id="6129953537138746214">Bo‘shliq</translation>
+<translation id="6134259848159370930">Qurilma, ilovalar, sozlamalar va internetdan qidirish.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Barcha ilovalarni ko‘rish</translation>
<translation id="6165508094623778733">Batafsil</translation>
+<translation id="6166852626429024716">Qurilma, ilovalar va internetdan qidirish...</translation>
<translation id="6264365405983206840">&amp;Barchasini tanlash</translation>
<translation id="6351032674660237738">ILOVA TAKLIFLARI</translation>
<translation id="6364916375976753737">Chapga o‘tkazish</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 daqiqa qoldi}other{# daqiqa qoldi}}</translation>
<translation id="7319740667687257810">Launcher, ajratib ko‘rsatish</translation>
-<translation id="7352651011704765696">Xatolik yuz berdi.</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 daqiqa oldin}other{# daqiqa oldin}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 daqiqa qoldi}other{# daqiqa qoldi}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537"><ph name="PAGE_NUMBER" />-sahifa, <ph name="ROW_NUMBER" />-qator, <ph name="COLUMN_NUMBER" />-ustunga olindi.</translation>
<translation id="7879499977785298635">Bloklanmasin</translation>
<translation id="7907591526440419938">Faylni ochish</translation>
+<translation id="7952747673138230804">Chrome OS yangi kontent bilan tanishuvni taklif qiladi. Takliflar sifatini yaxshilash maqsadida faqat siz tanlagan statistik axborotlar yuboriladi. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{1 tadan ortiq bildirishnoma}other{# tadan ortiq bildirishnoma}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 daqiqadan keyin}other{# daqiqadan keyin}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> fayl (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Javon doim chiqadi</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Qurilma, ilovalar, sozlamalar va internetdan qidiring. Ilovalaringiz boʻylab strelkalar yordamida kezing.</translation>
<translation id="8725488761726303204">yana <ph name="NUMBER" /> ta</translation>
<translation id="8730621377337864115">Tayyor</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 soat}other{# soat}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_vi.xtb b/chromium/ui/strings/translations/ui_strings_vi.xtb
index f9cf5356e7d..7640c124cd8 100644
--- a/chromium/ui/strings/translations/ui_strings_vi.xtb
+++ b/chromium/ui/strings/translations/ui_strings_vi.xtb
@@ -64,10 +64,12 @@
<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="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="2666092431469916601">Hàng đầu</translation>
<translation id="2701330563083355633">Chia sẻ từ <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Mới</translation>
<translation id="2743387203779672305">Sao chép vào khay nhớ tạm</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Mở thư mục</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Các ký hiệu &amp;&amp; biểu tượng cảm xúc</translation>
<translation id="5476505524087279545">bỏ chọn</translation>
<translation id="547979256943495781">Giá ở bên phải</translation>
+<translation id="5528053674512161860">Không tải được trang do bạn chưa cài đặt mô-đun giao diện người dùng dành cho nhà phát triển (dev_ui)</translation>
<translation id="5574202486608032840">Hệ thống <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Mũi tên trái</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Đóng</translation>
<translation id="6119846243427417423">kích hoạt</translation>
<translation id="6129953537138746214">Dấu cách</translation>
+<translation id="6134259848159370930">Tìm kiếm trong thiết bị, ứng dụng, tùy chọn cài đặt và trên web.</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/giây</translation>
<translation id="6156262341071374681">Mở rộng cho tất cả ứng dụng</translation>
<translation id="6165508094623778733">Tìm hiểu thêm</translation>
+<translation id="6166852626429024716">Tìm kiếm trong thiết bị, ứng dụng, tùy chọn cài đặt, trên web...</translation>
<translation id="6264365405983206840">Chọn &amp;Tất cả</translation>
<translation id="6351032674660237738">ĐỀ XUẤT ỨNG DỤNG</translation>
<translation id="6364916375976753737">Cuộn qua Trái</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{Còn 1 phút}other{Còn # phút}}</translation>
<translation id="7319740667687257810">Trình khởi chạy, chế độ xem một phần</translation>
-<translation id="7352651011704765696">Đã xảy ra lỗi</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 phút trước}other{# phút trước}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{Còn 1 phút}other{Còn # phút}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Đã di chuyển sang Trang <ph name="PAGE_NUMBER" />, hàng <ph name="ROW_NUMBER" />, cột <ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Không chặn</translation>
<translation id="7907591526440419938">Mở Tệp</translation>
+<translation id="7952747673138230804">Chrome OS hiển thị các đề xuất về nội dung mới để khám phá. Hệ thống chỉ gửi số liệu thống kê để cải thiện chất lượng khi bạn chọn chia sẻ dữ liệu sử dụng. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Phím Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Bạn có hơn 1 thông báo chưa đọc}other{Bạn có hơn # thông báo chưa đọc}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{trong 1 phút}other{trong # phút}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623">Tệp <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Giá luôn hiển thị</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Tìm kiếm trong thiết bị, ứng dụng, phần thông tin cài đặt và trên Internet. Hãy sử dụng các phím mũi tên để di chuyển đến các ứng dụng.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> mục khác</translation>
<translation id="8730621377337864115">Xong</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 giờ}other{# giờ}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_zh-CN.xtb b/chromium/ui/strings/translations/ui_strings_zh-CN.xtb
index 0ca6fae312c..f364c410c37 100644
--- a/chromium/ui/strings/translations/ui_strings_zh-CN.xtb
+++ b/chromium/ui/strings/translations/ui_strings_zh-CN.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">已完成校准</translation>
<translation id="252373100621549798">未知展示广告</translation>
<translation id="2545651323591713692">延后</translation>
+<translation id="2570734079541893434">管理设置</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 小时后}other{# 小时后}}</translation>
<translation id="2583543531130364912">校准您的触摸屏</translation>
<translation id="2666092431469916601">顶部</translation>
<translation id="2701330563083355633">共享自 <ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">新建</translation>
<translation id="2743387203779672305">复制到剪贴板</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />,<ph name="PRICE" /></translation>
<translation id="2803313416453193357">打开文件夹</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">表情符号与符号</translation>
<translation id="5476505524087279545">取消选中</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">退格</translation>
<translation id="5613020302032141669">向左箭头</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">关闭</translation>
<translation id="6119846243427417423">激活</translation>
<translation id="6129953537138746214">空格</translation>
+<translation id="6134259848159370930">搜索您的设备、应用、设置和网站。</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">展开以显示所有应用</translation>
<translation id="6165508094623778733">了解详情</translation>
+<translation id="6166852626429024716">搜索您的设备、应用、设置、网站…</translation>
<translation id="6264365405983206840">全选(&amp;A)</translation>
<translation id="6351032674660237738">应用推荐</translation>
<translation id="6364916375976753737">向左滚动</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{还剩 1 分钟}other{还剩 # 分钟}}</translation>
<translation id="7319740667687257810">启动器,局部视图</translation>
-<translation id="7352651011704765696">出了点问题</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 分钟前}other{# 分钟前}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{还剩 1 分钟}other{还剩 # 分钟}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">已移至第 <ph name="PAGE_NUMBER" /> 页中第 <ph name="ROW_NUMBER" /> 行与第 <ph name="COLUMN_NUMBER" /> 列的相交处。</translation>
<translation id="7879499977785298635">不屏蔽</translation>
<translation id="7907591526440419938">打开文件</translation>
+<translation id="7952747673138230804">Chrome 操作系统会显示有关新内容的建议以供探索。仅当您已选择分享使用情况数据时,系统才会向 Google 发送统计信息用于提升建议的质量。<ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Cmd 键</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{超过 1 条未读通知}other{超过 # 条未读通知}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 分钟后}other{# 分钟后}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> 文件 (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">一律显示任务栏</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">搜索您的设备、应用、设置和网站。使用箭头键可浏览各个应用。</translation>
<translation id="8725488761726303204">+ 另外 <ph name="NUMBER" /> 项</translation>
<translation id="8730621377337864115">完成</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 小时}other{# 小时}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_zh-HK.xtb b/chromium/ui/strings/translations/ui_strings_zh-HK.xtb
index 3c1230da71a..d5089bdf051 100644
--- a/chromium/ui/strings/translations/ui_strings_zh-HK.xtb
+++ b/chromium/ui/strings/translations/ui_strings_zh-HK.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">已完成校正</translation>
<translation id="252373100621549798">顯示器不明</translation>
<translation id="2545651323591713692">延後</translation>
+<translation id="2570734079541893434">管理設定</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 小時後}other{# 小時後}}</translation>
<translation id="2583543531130364912">校正您的觸控螢幕</translation>
<translation id="2666092431469916601">返回頁首</translation>
<translation id="2701330563083355633">透過 <ph name="DEVICE_NAME" /> 分享</translation>
+<translation id="271033894570825754">全新</translation>
<translation id="2743387203779672305">複製到剪貼簿</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />,<ph name="PRICE" /></translation>
<translation id="2803313416453193357">開啟資料夾</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Emoji 和符號</translation>
<translation id="5476505524087279545">取消勾選</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>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">關閉</translation>
<translation id="6119846243427417423">啟動</translation>
<translation id="6129953537138746214">空格</translation>
+<translation id="6134259848159370930">搜尋您的裝置、應用程式、設定和網絡。</translation>
<translation id="6135826906199951471">刪除鍵</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> 位元組/秒</translation>
<translation id="6156262341071374681">展開以顯示所有應用程式</translation>
<translation id="6165508094623778733">瞭解更多資料</translation>
+<translation id="6166852626429024716">搜尋您的裝置、應用程式、設定、網絡…</translation>
<translation id="6264365405983206840">全部選取(&amp;A)</translation>
<translation id="6351032674660237738">應用程式建議</translation>
<translation id="6364916375976753737">向左捲動</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{還有 1 分鐘}other{還有 # 分鐘}}</translation>
<translation id="7319740667687257810">啟動器,部分檢視</translation>
-<translation id="7352651011704765696">發生問題</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 分鐘前}other{# 分鐘前}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{還有 1 分鐘}other{還有 # 分鐘}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">移咗去第 <ph name="PAGE_NUMBER" /> 頁,第 <ph name="ROW_NUMBER" /> 行,第<ph name="COLUMN_NUMBER" /> 欄。</translation>
<translation id="7879499977785298635">不要封鎖</translation>
<translation id="7907591526440419938">開啟檔案</translation>
+<translation id="7952747673138230804">Chrome 作業系統會顯示新內容建議以供探索。只有在您選擇分享使用情況資料時,系統才會傳送統計資料以改善服務質素。<ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command 鍵</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{超過 1 個未讀通知}other{超過 # 個未讀通知}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 分鐘後}other{# 分鐘後}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> 檔案 (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">一律顯示檔案櫃</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/秒</translation>
+<translation id="8685326675965865247">搜尋您的裝置、應用程式、設定及網絡。使用箭咀鍵可瀏覽應用程式。</translation>
<translation id="8725488761726303204">還有另外 <ph name="NUMBER" /> 項</translation>
<translation id="8730621377337864115">完成</translation>
<translation id="8772073294905169192">{HOURS,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 f3b1fded5b0..70f4585fb1e 100644
--- a/chromium/ui/strings/translations/ui_strings_zh-TW.xtb
+++ b/chromium/ui/strings/translations/ui_strings_zh-TW.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">校正完成</translation>
<translation id="252373100621549798">顯示器不明</translation>
<translation id="2545651323591713692">延後</translation>
+<translation id="2570734079541893434">管理設定</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{1 小時內}other{# 小時內}}</translation>
<translation id="2583543531130364912">校正觸控螢幕</translation>
<translation id="2666092431469916601">置頂</translation>
<translation id="2701330563083355633">透過 <ph name="DEVICE_NAME" /> 分享</translation>
+<translation id="271033894570825754">新</translation>
<translation id="2743387203779672305">複製到剪貼簿</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />,<ph name="PRICE" /></translation>
<translation id="2803313416453193357">開啟資料夾</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">表情符號和符號</translation>
<translation id="5476505524087279545">取消選取</translation>
<translation id="547979256943495781">在右側顯示檔案櫃</translation>
+<translation id="5528053674512161860">未安裝開發人員 UI 模組 (dev_ui),因此無法載入網頁</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">向左鍵</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">關閉</translation>
<translation id="6119846243427417423">啟動</translation>
<translation id="6129953537138746214">空格</translation>
+<translation id="6134259848159370930">搜尋你的裝置、應用程式、設定和網路。</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/秒</translation>
<translation id="6156262341071374681">展開並顯示所有應用程式</translation>
<translation id="6165508094623778733">瞭解詳情</translation>
+<translation id="6166852626429024716">搜尋你的裝置、應用程式、設定、網路...</translation>
<translation id="6264365405983206840">選取全部(&amp;A)</translation>
<translation id="6351032674660237738">應用程式建議</translation>
<translation id="6364916375976753737">向左捲動</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{還剩 1 分鐘}other{還剩 # 分鐘}}</translation>
<translation id="7319740667687257810">啟動器,部分檢視</translation>
-<translation id="7352651011704765696">發生錯誤</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 分鐘前}other{# 分鐘前}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{還剩 1 分鐘}other{還剩 # 分鐘}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">已移至第 <ph name="PAGE_NUMBER" /> 頁,第 <ph name="ROW_NUMBER" /> 列,第 <ph name="COLUMN_NUMBER" /> 欄。</translation>
<translation id="7879499977785298635">不要封鎖</translation>
<translation id="7907591526440419938">開啟檔案</translation>
+<translation id="7952747673138230804">Chrome 作業系統會顯示建議項目,讓你探索新內容。只有當你選擇提供使用資料時,系統才會傳送統計資料用來改善建議內容的品質。<ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command 鍵</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{超過 1 則未讀通知}other{超過 # 則未讀通知}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 分鐘內}other{# 分鐘內}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> 檔案 (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">一律顯示檔案櫃</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/秒</translation>
+<translation id="8685326675965865247">搜尋你的裝置、應用程式、設定和網路。可使用方向鍵瀏覽應用程式。</translation>
<translation id="8725488761726303204">還有另外 <ph name="NUMBER" /> 個清單項目</translation>
<translation id="8730621377337864115">完成</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1 小時}other{# 小時}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_zu.xtb b/chromium/ui/strings/translations/ui_strings_zu.xtb
index cd56f77e135..06be84faade 100644
--- a/chromium/ui/strings/translations/ui_strings_zu.xtb
+++ b/chromium/ui/strings/translations/ui_strings_zu.xtb
@@ -64,10 +64,12 @@
<translation id="2522350507219695259">Ukusika kuqediwe</translation>
<translation id="252373100621549798">Ukubonisa okungaziwa</translation>
<translation id="2545651323591713692">Snuza</translation>
+<translation id="2570734079541893434">Phatha amasethingi</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{nge-1h}one{nge-#h}other{nge-#h}}</translation>
<translation id="2583543531130364912">Sika isikrini sakho esithintwayo</translation>
<translation id="2666092431469916601">Ngaphezulu</translation>
<translation id="2701330563083355633">Kwabelwe kusuka ku-<ph name="DEVICE_NAME" /></translation>
+<translation id="271033894570825754">Okusha</translation>
<translation id="2743387203779672305">Kopisha kubhodi lokunamathisela</translation>
<translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation>
<translation id="2803313416453193357">Vula ifolda</translation>
@@ -135,6 +137,7 @@
<translation id="5463830097259460683">Ama-emoji &amp;&amp; Izimpawu</translation>
<translation id="5476505524087279545">ungathikhi</translation>
<translation id="547979256943495781">Iselufu kwesokudla</translation>
+<translation id="5528053674512161860">Ukulayisha ikhasi kuhlulekile ngoba imojula ye-UI kanjiniyela (dev_ui) ayifakwanga</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> isistimu</translation>
<translation id="5583640892426849032">I-Backspace</translation>
<translation id="5613020302032141669">Umcibisholo ongakwesokunxele</translation>
@@ -152,10 +155,12 @@
<translation id="6040143037577758943">Vala</translation>
<translation id="6119846243427417423">yenza kusebenze</translation>
<translation id="6129953537138746214">Isikhala</translation>
+<translation id="6134259848159370930">Sesha idivayisi yakho, izinhlelo zokusebenza, amasethingi, newebhu.</translation>
<translation id="6135826906199951471">U-Del</translation>
<translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
<translation id="6156262341071374681">Nwebela kuzo zonke izinhlelo zokusebenza</translation>
<translation id="6165508094623778733">Funda kabanzi</translation>
+<translation id="6166852626429024716">Sesha idivayisi yakho, izinhlelo zokusebenza, amasethingi, iwebhu...</translation>
<translation id="6264365405983206840">Khetha &amp;konke</translation>
<translation id="6351032674660237738">IZIPHAKAMISO ZOHLELO LOKUSEBENZA</translation>
<translation id="6364916375976753737">Skrolela ngakwesokunxele</translation>
@@ -192,7 +197,6 @@
<translation id="7222373446505536781">F11</translation>
<translation id="7238427729722629793">{MINUTES,plural, =1{1 iminithi elisele}one{# amaminithi asele}other{# amaminithi asele}}</translation>
<translation id="7319740667687257810">Isiqalisi, ukubuka okuncane</translation>
-<translation id="7352651011704765696">Okuthile akuhambanga kahle</translation>
<translation id="7365057348334984696">{MINUTES,plural, =1{1 iminithi eledlule}one{# amaminithi adlule}other{# amaminithi adlule}}</translation>
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 iminithi elisele}one{# amaminithi asele}other{# amaminithi asele}}</translation>
@@ -205,6 +209,7 @@
<translation id="7848989271541991537">Ihanjiswe kukhasi elingu-<ph name="PAGE_NUMBER" />, umugqa ongu-<ph name="ROW_NUMBER" />, ikholomu engu-<ph name="COLUMN_NUMBER" />.</translation>
<translation id="7879499977785298635">Ungavimbeli</translation>
<translation id="7907591526440419938">Vula ifayela</translation>
+<translation id="7952747673138230804">I-Chrome OS ibonisa iziphakamiso zokuqukethwe okusha ongakuhlola. Ithumela izibalo ukuze ithuthukise ikhwalithi kuphela uma ukhethe ukwabelana ngedatha yokusetshenziswa. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Umyalo</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Ngaphezulu kwesaziso esingu-1 esingafundiwe}one{Ngaphezulu kwezaziso ezingu-# ezingafundiwe}other{Ngaphezulu kwezaziso ezingu-# ezingafundiwe}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{ku-1m}one{ku-#m}other{ku-#m}}</translation>
@@ -231,6 +236,7 @@
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Ifayela (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
<translation id="8649597172973390955">Ishelufu ihlala iboniswa</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
+<translation id="8685326675965865247">Sesha idivayisi yakho, izinhlelo zokusebenza, amasethingi, newebhu. Sebenzisa okhiye bomcibisholo ukuze uzulazulele izinhlelo zakho zokusebenza.</translation>
<translation id="8725488761726303204">+<ph name="NUMBER" /> okuningi</translation>
<translation id="8730621377337864115">Kwenziwe</translation>
<translation id="8772073294905169192">{HOURS,plural, =1{1h}one{#h}other{#h}}</translation>
diff --git a/chromium/ui/strings/ui_strings.grd b/chromium/ui/strings/ui_strings.grd
index a3fa3b94843..40994a1de67 100644
--- a/chromium/ui/strings/ui_strings.grd
+++ b/chromium/ui/strings/ui_strings.grd
@@ -367,6 +367,10 @@ need to be translated for each locale.-->
(empty)
</message>
+ <message name="IDS_MENU_ITEM_NEW_BADGE" desc="Appears as a badge on menu items denoting new features">
+ New
+ </message>
+
<!-- General application strings -->
<message name="IDS_SENTENCE_END" desc="The symbol that is used to end a sentence.">
.
@@ -979,12 +983,18 @@ need to be translated for each locale.-->
<message name="IDS_APP_LIST_LEARN_MORE" desc="Text of Learn more links.">
Learn more
</message>
+ <message name="IDS_APP_LIST_MANAGE_SETTINGS" desc="Text of Manage settings links.">
+ Manage settings
+ </message>
<message name="IDS_APP_LIST_ASSISTANT_PRIVACY_INFO" desc="Text shown in Launcher to imply Assistant search.">
Your searches are powered by the Google Assistant. <ph name="LEARN_MORE">$1<ex>Learn more</ex></ph>
</message>
<message name="IDS_APP_LIST_ASSISTANT_PRIVACY_INFO_CLOSE" desc="Close button text.">
Close
</message>
+ <message name="IDS_APP_LIST_SUGGESTED_CONTENT_INFO" desc="Text shown in launcher to notify users about Suggested Content. Suggested Content includes app search recommendations and website recommendations which can show up in places such as launcher search and suggestion chips.">
+ Chrome OS shows suggestions for new content to explore. Sends statistics to improve quality only if you’ve chosen to share usage data. <ph name="MANAGE_SETTINGS">$1<ex>Manage settings</ex></ph>
+ </message>
<message name="IDS_APP_ACCESSIBILITY_APP_WITH_STAR_RATING_ARC" desc="Accessibility text for a Play Store app with star rating.">
@@ -1005,6 +1015,16 @@ need to be translated for each locale.-->
<message name="IDS_APP_ACCESSIBILITY_APP_RECOMMENDATION_ARC" desc="Accessibility text to specify a search result is an app recommendation.">
<ph name="APP_NAME">$1<ex>Instagram</ex></ph>, App recommendation
</message>
+ <message name="IDS_APP_LIST_SEARCH_BOX_ACCESSIBILITY_NAME_CLAMSHELL" desc="Hint text for the search box in fullscreen app list window with additional instructions to use the arrow keys in Accessibility mode.">
+ Search your device, apps, settings, and web. Use the arrow keys to navigate your apps.
+ </message>
+ <message name="IDS_APP_LIST_SEARCH_BOX_ACCESSIBILITY_NAME_TABLET" desc="Hint text for the search box in fullscreen app list window. Tablet mode only, so we don't mention the arrow keys.">
+ Search your device, apps, settings, and web.
+ </message>
+ <message name="IDS_APP_LIST_SEARCH_BOX_PLACEHOLDER" desc="Placeholder text for the search box shown in the app list UI.">
+ Search your device, apps, settings, web...
+ </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.
@@ -1124,7 +1144,7 @@ need to be translated for each locale.-->
<if expr="is_android">
<!-- DevUI DFM Loader error strings -->
<message name="IDS_DEV_UI_LOADER_ERROR_HEADING" desc="Heading text for error page shown when Chrome fails to dynamically install the DevUI module.">
- Something went wrong
+ Page load failed because the developer UI module (dev_ui) is not installed
</message>
<message name="IDS_DEV_UI_LOADER_ERROR_SUGGEST_RELOAD" desc="Suggests to reload page to retry install of the DevUI module.">
Reloading this page
diff --git a/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_MANAGE_SETTINGS.png.sha1 b/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_MANAGE_SETTINGS.png.sha1
new file mode 100644
index 00000000000..262a1391f89
--- /dev/null
+++ b/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_MANAGE_SETTINGS.png.sha1
@@ -0,0 +1 @@
+3cd73865e25b96a7466310d1ecc52eb0dfbfaf41 \ No newline at end of file
diff --git a/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_SEARCH_BOX_ACCESSIBILITY_NAME_CLAMSHELL.png.sha1 b/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_SEARCH_BOX_ACCESSIBILITY_NAME_CLAMSHELL.png.sha1
new file mode 100644
index 00000000000..22ff17b28bc
--- /dev/null
+++ b/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_SEARCH_BOX_ACCESSIBILITY_NAME_CLAMSHELL.png.sha1
@@ -0,0 +1 @@
+d00e3a3db72ba44c42ab17995fc48b36b08e77f1 \ No newline at end of file
diff --git a/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_SEARCH_BOX_ACCESSIBILITY_NAME_TABLET.png.sha1 b/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_SEARCH_BOX_ACCESSIBILITY_NAME_TABLET.png.sha1
new file mode 100644
index 00000000000..1777c89bf0a
--- /dev/null
+++ b/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_SEARCH_BOX_ACCESSIBILITY_NAME_TABLET.png.sha1
@@ -0,0 +1 @@
+94285c8dcbb4c2f74c55af274c4e0850fc3347c6 \ No newline at end of file
diff --git a/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_SEARCH_BOX_PLACEHOLDER.png.sha1 b/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_SEARCH_BOX_PLACEHOLDER.png.sha1
new file mode 100644
index 00000000000..1777c89bf0a
--- /dev/null
+++ b/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_SEARCH_BOX_PLACEHOLDER.png.sha1
@@ -0,0 +1 @@
+94285c8dcbb4c2f74c55af274c4e0850fc3347c6 \ No newline at end of file
diff --git a/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_SUGGESTED_CONTENT_INFO.png.sha1 b/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_SUGGESTED_CONTENT_INFO.png.sha1
new file mode 100644
index 00000000000..262a1391f89
--- /dev/null
+++ b/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_SUGGESTED_CONTENT_INFO.png.sha1
@@ -0,0 +1 @@
+3cd73865e25b96a7466310d1ecc52eb0dfbfaf41 \ 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_MENU_ITEM_NEW_BADGE.png.sha1
new file mode 100644
index 00000000000..cfbd8f8950b
--- /dev/null
+++ b/chromium/ui/strings/ui_strings_grd/IDS_MENU_ITEM_NEW_BADGE.png.sha1
@@ -0,0 +1 @@
+c88f3adea4b633341c30b3220292ae3cfa4dd50f \ No newline at end of file
diff --git a/chromium/ui/touch_selection/touch_handle.h b/chromium/ui/touch_selection/touch_handle.h
index 3952593001c..a6a32634320 100644
--- a/chromium/ui/touch_selection/touch_handle.h
+++ b/chromium/ui/touch_selection/touch_handle.h
@@ -7,7 +7,6 @@
#include <memory>
-#include "base/logging.h"
#include "base/macros.h"
#include "base/time/time.h"
#include "ui/events/gesture_detection/motion_event.h"
diff --git a/chromium/ui/views/BUILD.gn b/chromium/ui/views/BUILD.gn
index bc19dfd88f9..3df474182de 100644
--- a/chromium/ui/views/BUILD.gn
+++ b/chromium/ui/views/BUILD.gn
@@ -255,6 +255,7 @@ jumbo_component("views") {
"widget/root_view.h",
"widget/root_view_targeter.h",
"widget/tooltip_manager.h",
+ "widget/unique_widget_ptr.h",
"widget/widget.h",
"widget/widget_delegate.h",
"widget/widget_deletion_observer.h",
@@ -380,7 +381,6 @@ jumbo_component("views") {
"controls/tree/tree_view.cc",
"controls/tree/tree_view_controller.cc",
"controls/tree/tree_view_drawing_provider.cc",
- "controls/views_text_services_context_menu.cc",
"controls/views_text_services_context_menu_base.cc",
"controls/views_text_services_context_menu_base.h",
"debug_utils.cc",
@@ -437,6 +437,7 @@ jumbo_component("views") {
"widget/root_view.cc",
"widget/root_view_targeter.cc",
"widget/tooltip_manager.cc",
+ "widget/unique_widget_ptr.cc",
"widget/widget.cc",
"widget/widget_aura_utils.cc",
"widget/widget_delegate.cc",
@@ -502,7 +503,7 @@ jumbo_component("views") {
"//ui/accessibility:ax_enums_mojo",
"//ui/base",
"//ui/base/clipboard",
- "//ui/base/cursor",
+ "//ui/base/cursor:cursor_base",
"//ui/base/ime/init",
"//ui/compositor",
"//ui/display",
@@ -513,6 +514,7 @@ jumbo_component("views") {
"//ui/gfx/animation",
"//ui/gfx/geometry",
"//ui/views/resources",
+ "//ui/views/window/vector_icons",
]
if (use_x11) {
@@ -526,6 +528,7 @@ jumbo_component("views") {
if (is_linux && !is_chromeos) {
sources -= [ "window/window_button_order_provider.cc" ]
+ public_deps += [ "//ui/base/cursor:theme_manager" ]
deps += [
"//ui/base/ime/linux",
"//ui/shell_dialogs",
@@ -587,7 +590,6 @@ jumbo_component("views") {
"widget/native_widget_mac.mm",
"widget/widget_utils_mac.mm",
]
- sources -= [ "controls/views_text_services_context_menu.cc" ]
public_deps += [ "//components/remote_cocoa/common:mojo" ]
deps += [
"//components/crash/core/common",
@@ -750,7 +752,10 @@ jumbo_component("views") {
"widget/desktop_aura/desktop_screen_position_client.cc",
"widget/desktop_aura/desktop_window_tree_host.cc",
]
- public_deps += [ "//ui/base/cursor/mojom:cursor_type" ]
+ public_deps += [
+ "//ui/base/cursor",
+ "//ui/base/cursor/mojom:cursor_type",
+ ]
if (use_x11) {
public_deps += [
"//ui/base/x",
@@ -777,7 +782,8 @@ jumbo_component("views") {
"widget/desktop_aura/desktop_window_tree_host_win.cc",
]
deps += [ "//ui/events:dom_keyboard_layout" ]
- } else if (use_ozone) {
+ }
+ if (use_ozone) {
public += [ "widget/desktop_aura/desktop_screen_ozone.h" ]
sources += [
"widget/desktop_aura/desktop_drag_drop_client_ozone.cc",
@@ -789,6 +795,7 @@ jumbo_component("views") {
public += [ "widget/desktop_aura/desktop_window_tree_host_linux.h" ]
sources += [
"style/platform_style_linux.cc",
+ "widget/desktop_aura/desktop_screen_linux.cc",
"widget/desktop_aura/desktop_window_tree_host_linux.cc",
"widget/desktop_aura/window_event_filter_linux.cc",
"widget/desktop_aura/window_event_filter_linux.h",
@@ -917,6 +924,8 @@ jumbo_source_set("test_support") {
"test/test_views_delegate.h",
"test/test_widget_observer.cc",
"test/test_widget_observer.h",
+ "test/view_metadata_test_utils.cc",
+ "test/view_metadata_test_utils.h",
"test/views_test_base.cc",
"test/views_test_base.h",
"test/views_test_helper.cc",
@@ -1000,8 +1009,6 @@ jumbo_source_set("test_support") {
]
if (use_x11) {
sources += [
- "test/desktop_screen_x11_test_api.cc",
- "test/desktop_screen_x11_test_api.h",
"test/test_desktop_screen_x11.cc",
"test/test_desktop_screen_x11.h",
"test/ui_controls_factory_desktop_aurax11.cc",
@@ -1033,6 +1040,7 @@ test("views_unittests") {
"animation/ink_drop_ripple_unittest.cc",
"animation/ink_drop_unittest.cc",
"animation/installable_ink_drop_animator_unittest.cc",
+ "animation/installable_ink_drop_painter_unittest.cc",
"animation/installable_ink_drop_unittest.cc",
"animation/slide_out_controller_unittest.cc",
"animation/square_ink_drop_ripple_unittest.cc",
@@ -1046,6 +1054,7 @@ test("views_unittests") {
"controls/button/image_button_unittest.cc",
"controls/button/label_button_label_unittest.cc",
"controls/button/label_button_unittest.cc",
+ "controls/button/md_text_button_unittest.cc",
"controls/button/menu_button_unittest.cc",
"controls/button/radio_button_unittest.cc",
"controls/button/toggle_button_unittest.cc",
@@ -1105,6 +1114,7 @@ test("views_unittests") {
"widget/any_widget_observer_unittest.cc",
"widget/native_widget_unittest.cc",
"widget/root_view_unittest.cc",
+ "widget/unique_widget_ptr_unittest.cc",
"widget/widget_unittest.cc",
"window/custom_frame_view_unittest.cc",
"window/dialog_client_view_unittest.cc",
@@ -1268,7 +1278,7 @@ test("views_unittests") {
sources += [
"widget/desktop_aura/desktop_drag_drop_client_aurax11_unittest.cc",
"widget/desktop_aura/desktop_screen_x11_unittest.cc",
- "widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc",
+ "widget/desktop_aura/x11_drag_drop_client_unittest.cc",
]
deps += [ "//ui/base/x:test_support" ]
}
@@ -1276,6 +1286,11 @@ test("views_unittests") {
sources += [
"widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc",
]
+ if (is_linux) {
+ sources += [
+ "widget/desktop_aura/desktop_window_tree_host_linux_unittest.cc",
+ ]
+ }
}
if (use_ozone) {
sources +=
diff --git a/chromium/ui/views/accessibility/ax_tree_source_views_unittest.cc b/chromium/ui/views/accessibility/ax_tree_source_views_unittest.cc
index bb90519552e..4f0f799ec48 100644
--- a/chromium/ui/views/accessibility/ax_tree_source_views_unittest.cc
+++ b/chromium/ui/views/accessibility/ax_tree_source_views_unittest.cc
@@ -50,7 +50,7 @@ class AXTreeSourceViewsTest : public ViewsTestBase {
params.bounds = gfx::Rect(11, 22, 333, 444);
params.context = GetContext();
widget_->Init(std::move(params));
- widget_->SetContentsView(new View());
+ widget_->SetContentsView(std::make_unique<View>());
label1_ = new Label(base::ASCIIToUTF16("Label 1"));
label1_->SetBounds(1, 1, 111, 111);
diff --git a/chromium/ui/views/accessibility/ax_virtual_view.cc b/chromium/ui/views/accessibility/ax_virtual_view.cc
index a222443d37e..060d4a77c65 100644
--- a/chromium/ui/views/accessibility/ax_virtual_view.cc
+++ b/chromium/ui/views/accessibility/ax_virtual_view.cc
@@ -395,7 +395,7 @@ bool AXVirtualView::AccessibilityPerformAction(const ui::AXActionData& data) {
if (custom_data_.HasAction(data.action))
result = HandleAccessibleAction(data);
if (!result && GetOwnerView())
- return GetOwnerView()->HandleAccessibleAction(data);
+ return HandleAccessibleActionInOwnerView(data);
return result;
}
@@ -449,7 +449,17 @@ bool AXVirtualView::HandleAccessibleAction(
break;
}
- return GetOwnerView()->HandleAccessibleAction(action_data);
+ return HandleAccessibleActionInOwnerView(action_data);
+}
+
+bool AXVirtualView::HandleAccessibleActionInOwnerView(
+ const ui::AXActionData& action_data) {
+ DCHECK(GetOwnerView());
+ // Save the node id so that the owner view can determine which virtual view
+ // is being targeted for action.
+ ui::AXActionData forwarded_action_data = action_data;
+ forwarded_action_data.target_node_id = GetData().id;
+ return GetOwnerView()->HandleAccessibleAction(forwarded_action_data);
}
View* AXVirtualView::GetOwnerView() const {
diff --git a/chromium/ui/views/accessibility/ax_virtual_view.h b/chromium/ui/views/accessibility/ax_virtual_view.h
index 105c961b102..6b1f9eeda4a 100644
--- a/chromium/ui/views/accessibility/ax_virtual_view.h
+++ b/chromium/ui/views/accessibility/ax_virtual_view.h
@@ -171,6 +171,11 @@ class VIEWS_EXPORT AXVirtualView : public ui::AXPlatformNodeDelegateBase {
// via NotifyAccessibilityEvent().
virtual bool HandleAccessibleAction(const ui::AXActionData& action_data);
+ protected:
+ // Forwards a request from assistive technology to perform an action on this
+ // virtual view to the owner view's accessible action handler.
+ bool HandleAccessibleActionInOwnerView(const ui::AXActionData& action_data);
+
private:
// Internal class name.
static const char kViewClassName[];
diff --git a/chromium/ui/views/accessibility/ax_virtual_view_unittest.cc b/chromium/ui/views/accessibility/ax_virtual_view_unittest.cc
index b48ada53153..23e1ba55ab2 100644
--- a/chromium/ui/views/accessibility/ax_virtual_view_unittest.cc
+++ b/chromium/ui/views/accessibility/ax_virtual_view_unittest.cc
@@ -487,6 +487,13 @@ TEST_F(AXVirtualViewTest, OverrideFocus) {
ASSERT_NE(nullptr, virtual_label_->GetNativeObject());
ExpectReceivedAccessibilityEvents({});
+ button_->SetFocusBehavior(View::FocusBehavior::ALWAYS);
+ button_->RequestFocus();
+ ExpectReceivedAccessibilityEvents(
+ {std::make_pair(GetButtonAccessibility(), ax::mojom::Event::kFocus),
+ std::make_pair(GetButtonAccessibility(),
+ ax::mojom::Event::kChildrenChanged)});
+
EXPECT_EQ(button_accessibility.GetNativeObject(),
button_accessibility.GetFocusedDescendant());
button_accessibility.OverrideFocus(virtual_label_);
@@ -536,6 +543,10 @@ TEST_F(AXVirtualViewTest, OverrideFocus) {
// Test that calling GetFocus() while the owner view is not focused will
// return nullptr.
+ button_->SetFocusBehavior(View::FocusBehavior::NEVER);
+ button_->RequestFocus();
+ ExpectReceivedAccessibilityEvents({std::make_pair(
+ GetButtonAccessibility(), ax::mojom::Event::kChildrenChanged)});
EXPECT_EQ(nullptr, virtual_label_->GetFocus());
EXPECT_EQ(nullptr, virtual_child_1->GetFocus());
EXPECT_EQ(nullptr, virtual_child_2->GetFocus());
@@ -544,7 +555,7 @@ TEST_F(AXVirtualViewTest, OverrideFocus) {
button_->SetFocusBehavior(View::FocusBehavior::ALWAYS);
button_->RequestFocus();
ExpectReceivedAccessibilityEvents(
- {std::make_pair(GetButtonAccessibility(), ax::mojom::Event::kFocus),
+ {std::make_pair(virtual_child_3, ax::mojom::Event::kFocus),
std::make_pair(GetButtonAccessibility(),
ax::mojom::Event::kChildrenChanged)});
diff --git a/chromium/ui/views/accessibility/ax_widget_obj_wrapper.cc b/chromium/ui/views/accessibility/ax_widget_obj_wrapper.cc
index 9aeeb45a0bc..c58811c8b67 100644
--- a/chromium/ui/views/accessibility/ax_widget_obj_wrapper.cc
+++ b/chromium/ui/views/accessibility/ax_widget_obj_wrapper.cc
@@ -70,6 +70,15 @@ void AXWidgetObjWrapper::OnWidgetDestroying(Widget* widget) {
aura_obj_cache_->Remove(widget);
}
+void AXWidgetObjWrapper::OnWidgetDestroyed(Widget* widget) {
+ // Normally this does not run because of OnWidgetDestroying should have
+ // removed |this| from cache. However, some code could trigger a destroying
+ // widget to be created after OnWidgetDestroying. This guards against such
+ // situation and ensures the destroyed widget is removed from cache.
+ // See https://crbug.com/1091545
+ aura_obj_cache_->Remove(widget);
+}
+
void AXWidgetObjWrapper::OnWidgetClosing(Widget* widget) {
aura_obj_cache_->Remove(widget);
}
diff --git a/chromium/ui/views/accessibility/ax_widget_obj_wrapper.h b/chromium/ui/views/accessibility/ax_widget_obj_wrapper.h
index 2f6cc93f1ef..9d768b80b85 100644
--- a/chromium/ui/views/accessibility/ax_widget_obj_wrapper.h
+++ b/chromium/ui/views/accessibility/ax_widget_obj_wrapper.h
@@ -40,6 +40,7 @@ class AXWidgetObjWrapper : public AXAuraObjWrapper,
// WidgetObserver overrides.
void OnWidgetDestroying(Widget* widget) override;
+ void OnWidgetDestroyed(Widget* widget) override;
void OnWidgetClosing(Widget* widget) override;
void OnWidgetVisibilityChanged(Widget*, bool) override;
diff --git a/chromium/ui/views/accessibility/ax_window_obj_wrapper.cc b/chromium/ui/views/accessibility/ax_window_obj_wrapper.cc
index 5e79b94b22c..bc23c390e2f 100644
--- a/chromium/ui/views/accessibility/ax_window_obj_wrapper.cc
+++ b/chromium/ui/views/accessibility/ax_window_obj_wrapper.cc
@@ -11,6 +11,7 @@
#include "base/strings/utf_string_conversions.h"
#include "ui/accessibility/aura/aura_window_properties.h"
+#include "ui/accessibility/ax_action_data.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/accessibility/ax_tree_id.h"
@@ -88,6 +89,15 @@ AXWindowObjWrapper::AXWindowObjWrapper(AXAuraObjCache* aura_obj_cache,
AXWindowObjWrapper::~AXWindowObjWrapper() = default;
+bool AXWindowObjWrapper::HandleAccessibleAction(
+ const ui::AXActionData& action) {
+ if (action.action == ax::mojom::Action::kFocus) {
+ window_->Focus();
+ return true;
+ }
+ return false;
+}
+
bool AXWindowObjWrapper::IsIgnored() {
return false;
}
@@ -160,6 +170,9 @@ void AXWindowObjWrapper::OnWindowDestroyed(aura::Window* window) {
}
void AXWindowObjWrapper::OnWindowDestroying(aura::Window* window) {
+ if (window == window_)
+ window_destroying_ = true;
+
Widget* widget = GetWidgetForWindow(window);
if (widget)
aura_obj_cache_->Remove(widget);
@@ -179,6 +192,9 @@ void AXWindowObjWrapper::OnWindowBoundsChanged(
const gfx::Rect& old_bounds,
const gfx::Rect& new_bounds,
ui::PropertyChangeReason reason) {
+ if (window_destroying_)
+ return;
+
if (window == window_)
FireLocationChangesRecursively(window_, aura_obj_cache_);
}
@@ -186,22 +202,34 @@ void AXWindowObjWrapper::OnWindowBoundsChanged(
void AXWindowObjWrapper::OnWindowPropertyChanged(aura::Window* window,
const void* key,
intptr_t old) {
+ if (window_destroying_)
+ return;
+
if (window == window_ && key == ui::kChildAXTreeID)
FireEvent(ax::mojom::Event::kChildrenChanged);
}
void AXWindowObjWrapper::OnWindowVisibilityChanged(aura::Window* window,
bool visible) {
+ if (window_destroying_)
+ return;
+
FireEvent(ax::mojom::Event::kStateChanged);
}
void AXWindowObjWrapper::OnWindowTransformed(aura::Window* window,
ui::PropertyChangeReason reason) {
+ if (window_destroying_)
+ return;
+
if (window == window_)
FireLocationChangesRecursively(window_, aura_obj_cache_);
}
void AXWindowObjWrapper::OnWindowTitleChanged(aura::Window* window) {
+ if (window_destroying_)
+ return;
+
FireEventOnWindowChildWidgetAndRootView(
window_, ax::mojom::Event::kTreeChanged, aura_obj_cache_);
}
diff --git a/chromium/ui/views/accessibility/ax_window_obj_wrapper.h b/chromium/ui/views/accessibility/ax_window_obj_wrapper.h
index 841a3d03710..7c5514b3b5e 100644
--- a/chromium/ui/views/accessibility/ax_window_obj_wrapper.h
+++ b/chromium/ui/views/accessibility/ax_window_obj_wrapper.h
@@ -30,6 +30,7 @@ class AXWindowObjWrapper : public AXAuraObjWrapper,
~AXWindowObjWrapper() override;
// AXAuraObjWrapper overrides.
+ bool HandleAccessibleAction(const ui::AXActionData& action) override;
bool IsIgnored() override;
AXAuraObjWrapper* GetParent() override;
void GetChildren(std::vector<AXAuraObjWrapper*>* out_children) override;
@@ -57,12 +58,17 @@ class AXWindowObjWrapper : public AXAuraObjWrapper,
// Fires an accessibility event.
void FireEvent(ax::mojom::Event event_type);
- aura::Window* window_;
+ aura::Window* const window_;
- bool is_root_window_;
+ const bool is_root_window_;
const ui::AXUniqueId unique_id_;
+ // Whether OnWindowDestroying has happened for |window_|. Used to suppress
+ // further events from |window| after OnWindowDestroying. Otherwise, dangling
+ // pointer could be left in |aura_obj_cache_|. See https://crbug.com/1091545
+ bool window_destroying_ = false;
+
ScopedObserver<aura::Window, aura::WindowObserver> observer_{this};
};
diff --git a/chromium/ui/views/accessibility/view_accessibility.cc b/chromium/ui/views/accessibility/view_accessibility.cc
index 4ff677b664e..5dfb136d2d1 100644
--- a/chromium/ui/views/accessibility/view_accessibility.cc
+++ b/chromium/ui/views/accessibility/view_accessibility.cc
@@ -121,6 +121,10 @@ const ui::AXUniqueId& ViewAccessibility::GetUniqueId() const {
return unique_id_;
}
+bool ViewAccessibility::IsLeaf() const {
+ return is_leaf_;
+}
+
void ViewAccessibility::GetAccessibleNodeData(ui::AXNodeData* data) const {
data->id = GetUniqueId().Get();
@@ -206,7 +210,7 @@ void ViewAccessibility::GetAccessibleNodeData(ui::AXNodeData* data) const {
return;
}
- if (view_->IsAccessibilityFocusable())
+ if (view_->IsAccessibilityFocusable() && !focused_virtual_child_)
data->AddState(ax::mojom::State::kFocusable);
if (!view_->GetEnabled())
@@ -224,13 +228,24 @@ void ViewAccessibility::OverrideFocus(AXVirtualView* virtual_view) {
<< "|virtual_view| must be nullptr or a descendant of this view.";
focused_virtual_child_ = virtual_view;
- if (focused_virtual_child_) {
- focused_virtual_child_->NotifyAccessibilityEvent(ax::mojom::Event::kFocus);
- } else {
- view_->NotifyAccessibilityEvent(ax::mojom::Event::kFocus, true);
+ if (view_->HasFocus()) {
+ if (focused_virtual_child_) {
+ focused_virtual_child_->NotifyAccessibilityEvent(
+ ax::mojom::Event::kFocus);
+ } else {
+ view_->NotifyAccessibilityEvent(ax::mojom::Event::kFocus, true);
+ }
}
}
+void ViewAccessibility::SetPopupFocusOverride() {}
+
+void ViewAccessibility::EndPopupFocusOverride() {}
+
+bool ViewAccessibility::IsFocusedForTesting() {
+ return view_->HasFocus() && !focused_virtual_child_;
+}
+
void ViewAccessibility::OverrideRole(const ax::mojom::Role role) {
DCHECK(IsValidRoleForViews(role)) << "Invalid role for Views.";
custom_data_.role = role;
diff --git a/chromium/ui/views/accessibility/view_accessibility.h b/chromium/ui/views/accessibility/view_accessibility.h
index 50fdcfef62b..69cb2423d88 100644
--- a/chromium/ui/views/accessibility/view_accessibility.h
+++ b/chromium/ui/views/accessibility/view_accessibility.h
@@ -108,7 +108,7 @@ class VIEWS_EXPORT ViewAccessibility {
View* view() const { return view_; }
AXVirtualView* FocusedVirtualChild() const { return focused_virtual_child_; }
- bool IsLeaf() const { return is_leaf_; }
+ virtual bool IsLeaf() const;
bool IsIgnored() const { return is_ignored_; }
//
@@ -144,6 +144,19 @@ class VIEWS_EXPORT ViewAccessibility {
// native accessibility object associated with this view.
gfx::NativeViewAccessible GetFocusedDescendant();
+ // Call when this is the active descendant of a popup view that temporarily
+ // takes over focus. It is only necessary to use this for menus like autofill,
+ // where the actual focus is in content.
+ // When the popup closes, call EndPopupFocusOverride().
+ virtual void SetPopupFocusOverride();
+
+ // Call when popup closes, if it used SetPopupFocusOverride().
+ virtual void EndPopupFocusOverride();
+
+ // Return true if this view is considered focused.
+ virtual bool IsFocusedForTesting();
+
+ // Call when a menu closes, to restore focus to where it was previously.
virtual void FireFocusAfterMenuClose();
// Used for testing. Allows a test to watch accessibility events.
diff --git a/chromium/ui/views/accessibility/view_ax_platform_node_delegate.cc b/chromium/ui/views/accessibility/view_ax_platform_node_delegate.cc
index 748c8569207..35dce74a77b 100644
--- a/chromium/ui/views/accessibility/view_ax_platform_node_delegate.cc
+++ b/chromium/ui/views/accessibility/view_ax_platform_node_delegate.cc
@@ -11,6 +11,7 @@
#include <vector>
#include "base/bind.h"
+#include "base/containers/adapters.h"
#include "base/lazy_instance.h"
#include "base/threading/thread_task_runner_handle.h"
#include "ui/accessibility/ax_action_data.h"
@@ -121,9 +122,6 @@ struct ViewAXPlatformNodeDelegate::ChildWidgetsResult {
bool is_tab_modal_showing;
};
-// static
-int ViewAXPlatformNodeDelegate::menu_depth_ = 0;
-
ViewAXPlatformNodeDelegate::ViewAXPlatformNodeDelegate(View* view)
: ViewAccessibility(view) {
ax_platform_node_ = ui::AXPlatformNode::Create(this);
@@ -139,7 +137,7 @@ ViewAXPlatformNodeDelegate::ViewAXPlatformNodeDelegate(View* view)
ViewAXPlatformNodeDelegate::~ViewAXPlatformNodeDelegate() {
if (ui::AXPlatformNode::GetPopupFocusOverride() == GetNativeObject())
- ui::AXPlatformNode::SetPopupFocusOverride(nullptr);
+ EndPopupFocusOverride();
ax_platform_node_->Destroy();
}
@@ -148,6 +146,21 @@ gfx::NativeViewAccessible ViewAXPlatformNodeDelegate::GetNativeObject() const {
return ax_platform_node_->GetNativeViewAccessible();
}
+void ViewAXPlatformNodeDelegate::SetPopupFocusOverride() {
+ ui::AXPlatformNode::SetPopupFocusOverride(GetNativeObject());
+}
+
+void ViewAXPlatformNodeDelegate::EndPopupFocusOverride() {
+ ui::AXPlatformNode::SetPopupFocusOverride(nullptr);
+}
+
+bool ViewAXPlatformNodeDelegate::IsFocusedForTesting() {
+ if (ui::AXPlatformNode::GetPopupFocusOverride())
+ return ui::AXPlatformNode::GetPopupFocusOverride() == GetNativeObject();
+
+ return ViewAccessibility::IsFocusedForTesting();
+}
+
void ViewAXPlatformNodeDelegate::NotifyAccessibilityEvent(
ax::mojom::Event event_type) {
DCHECK(ax_platform_node_);
@@ -160,16 +173,21 @@ void ViewAXPlatformNodeDelegate::NotifyAccessibilityEvent(
// Some events have special handling.
switch (event_type) {
- case ax::mojom::Event::kMenuStart:
- OnMenuStart();
+ case ax::mojom::Event::kFocusAfterMenuClose: {
+ DCHECK(!ui::AXPlatformNode::GetPopupFocusOverride())
+ << "Must call ViewAccessibility::EndPopupFocusOverride() as menu "
+ "closes.";
break;
- case ax::mojom::Event::kMenuEnd:
- OnMenuEnd();
- break;
- case ax::mojom::Event::kSelection: {
- ax::mojom::Role role = GetData().role;
- if (menu_depth_ && (ui::IsMenuItem(role) || ui::IsListItem(role)))
- OnMenuItemActive();
+ }
+ case ax::mojom::Event::kFocus: {
+ if (ui::AXPlatformNode::GetPopupFocusOverride()) {
+ DCHECK_EQ(ui::AXPlatformNode::GetPopupFocusOverride(),
+ GetNativeObject())
+ << "If the popup focus override is on, then the kFocus event must "
+ "match it. Most likely the popup has closed, but did not call "
+ "ViewAccessibility::EndPopupFocusOverride(), and focus has "
+ "now moved on.";
+ }
break;
}
case ax::mojom::Event::kFocusContext: {
@@ -201,27 +219,6 @@ void ViewAXPlatformNodeDelegate::AnnounceText(const base::string16& text) {
}
#endif
-void ViewAXPlatformNodeDelegate::OnMenuItemActive() {
- // When a native menu is shown and has an item selected, treat it and the
- // currently selected item as focused, even though the actual focus is in the
- // browser's currently focused textfield.
- ui::AXPlatformNode::SetPopupFocusOverride(
- ax_platform_node_->GetNativeViewAccessible());
-}
-
-void ViewAXPlatformNodeDelegate::OnMenuStart() {
- ++menu_depth_;
-}
-
-void ViewAXPlatformNodeDelegate::OnMenuEnd() {
- // When a native menu is hidden, restore accessibility focus to the current
- // focus in the document.
- if (menu_depth_ >= 1)
- --menu_depth_;
- if (menu_depth_ == 0)
- ui::AXPlatformNode::SetPopupFocusOverride(nullptr);
-}
-
void ViewAXPlatformNodeDelegate::FireFocusAfterMenuClose() {
ui::AXPlatformNodeBase* focused_node =
static_cast<ui::AXPlatformNodeBase*>(ax_platform_node_);
@@ -276,7 +273,7 @@ const ui::AXNodeData& ViewAXPlatformNodeDelegate::GetData() const {
}
int ViewAXPlatformNodeDelegate::GetChildCount() const {
- if (IsLeaf())
+ if (ViewAccessibility::IsLeaf())
return 0;
if (!virtual_children().empty()) {
@@ -371,6 +368,15 @@ gfx::NativeViewAccessible ViewAXPlatformNodeDelegate::GetParent() {
return nullptr;
}
+bool ViewAXPlatformNodeDelegate::IsChildOfLeaf() const {
+ // Needed to prevent endless loops, see: http://crbug.com/1100047
+ return false;
+}
+
+bool ViewAXPlatformNodeDelegate::IsLeaf() const {
+ return ViewAccessibility::IsLeaf() || AXPlatformNodeDelegateBase::IsLeaf();
+}
+
gfx::Rect ViewAXPlatformNodeDelegate::GetBoundsRect(
const ui::AXCoordinateSystem coordinate_system,
const ui::AXClippingBehavior clipping_behavior,
@@ -419,6 +425,22 @@ gfx::NativeViewAccessible ViewAXPlatformNodeDelegate::HitTestSync(
if (!view()->HitTestPoint(point))
return nullptr;
+ // Check if the point is within any of the virtual children of this view.
+ // AXVirtualView's HitTestSync is a recursive function that will return the
+ // deepest child, since it does not support relative bounds.
+ if (!virtual_children().empty()) {
+ // Search the greater indices first, since they're on top in the z-order.
+ for (const std::unique_ptr<AXVirtualView>& child :
+ base::Reversed(virtual_children())) {
+ gfx::NativeViewAccessible result =
+ child->HitTestSync(screen_physical_pixel_x, screen_physical_pixel_y);
+ if (result)
+ return result;
+ }
+ // If it's not inside any of our virtual children, it's inside this view.
+ return GetNativeObject();
+ }
+
// Check if the point is within any of the immediate children of this
// view. We don't have to search further because AXPlatformNode will
// do a recursive hit test if we return anything other than |this| or NULL.
@@ -426,6 +448,10 @@ gfx::NativeViewAccessible ViewAXPlatformNodeDelegate::HitTestSync(
const auto is_point_in_child = [point, v](View* child) {
if (!child->GetVisible())
return false;
+ ui::AXNodeData child_data;
+ child->GetViewAccessibility().GetAccessibleNodeData(&child_data);
+ if (child_data.HasState(ax::mojom::State::kInvisible))
+ return false;
gfx::Point point_in_child_coords = point;
v->ConvertPointToTarget(v, child, &point_in_child_coords);
return child->HitTestPoint(point_in_child_coords);
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 433ef8986f7..8d3ddca5571 100644
--- a/chromium/ui/views/accessibility/view_ax_platform_node_delegate.h
+++ b/chromium/ui/views/accessibility/view_ax_platform_node_delegate.h
@@ -61,6 +61,8 @@ class ViewAXPlatformNodeDelegate : public ViewAccessibility,
gfx::NativeViewAccessible GetNSWindow() override;
gfx::NativeViewAccessible GetNativeViewAccessible() override;
gfx::NativeViewAccessible GetParent() override;
+ bool IsChildOfLeaf() const override;
+ bool IsLeaf() const override;
gfx::Rect GetBoundsRect(
const ui::AXCoordinateSystem coordinate_system,
const ui::AXClippingBehavior clipping_behavior,
@@ -86,6 +88,10 @@ class ViewAXPlatformNodeDelegate : public ViewAccessibility,
base::Optional<int> GetPosInSet() const override;
base::Optional<int> GetSetSize() const override;
+ void SetPopupFocusOverride() override;
+ void EndPopupFocusOverride() override;
+ bool IsFocusedForTesting() override;
+
protected:
explicit ViewAXPlatformNodeDelegate(View* view);
@@ -100,18 +106,11 @@ class ViewAXPlatformNodeDelegate : public ViewAccessibility,
ChildWidgetsResult GetChildWidgets() const;
- void OnMenuItemActive();
- void OnMenuStart();
- void OnMenuEnd();
-
// We own this, but it is reference-counted on some platforms so we can't use
// a unique_ptr. It is destroyed in the destructor.
ui::AXPlatformNode* ax_platform_node_;
mutable ui::AXNodeData data_;
-
- // Levels of menu are currently open, e.g. 0: none, 1: top, 2: submenu ...
- static int32_t menu_depth_;
};
} // namespace views
diff --git a/chromium/ui/views/accessibility/view_ax_platform_node_delegate_auralinux_unittest.cc b/chromium/ui/views/accessibility/view_ax_platform_node_delegate_auralinux_unittest.cc
index f9c0de73d1b..3f8100365a7 100644
--- a/chromium/ui/views/accessibility/view_ax_platform_node_delegate_auralinux_unittest.cc
+++ b/chromium/ui/views/accessibility/view_ax_platform_node_delegate_auralinux_unittest.cc
@@ -5,6 +5,7 @@
#include "ui/views/accessibility/view_ax_platform_node_delegate.h"
#include <atk/atk.h>
+#include <memory>
#include "ui/accessibility/platform/ax_platform_node.h"
#include "ui/views/controls/textfield/textfield.h"
@@ -29,12 +30,10 @@ TEST_F(ViewAXPlatformNodeDelegateAuraLinuxTest, TextfieldAccessibility) {
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget.Init(std::move(init_params));
- View* content = new View;
- widget.SetContentsView(content);
+ View* content = widget.SetContentsView(std::make_unique<View>());
Textfield* textfield = new Textfield;
textfield->SetAccessibleName(base::UTF8ToUTF16("Name"));
- textfield->SetText(base::UTF8ToUTF16("Value"));
content->AddChildView(textfield);
AtkText* atk_text = ATK_TEXT(textfield->GetNativeViewAccessible());
@@ -56,49 +55,44 @@ TEST_F(ViewAXPlatformNodeDelegateAuraLinuxTest, TextfieldAccessibility) {
g_signal_connect(atk_text, "text-insert", callback, &text_insert_events);
g_signal_connect(atk_text, "text-remove", callback, &text_remove_events);
- textfield->NotifyAccessibilityEvent(ax::mojom::Event::kValueChanged, true);
+ textfield->SetText(base::UTF8ToUTF16("Value"));
ASSERT_EQ(text_remove_events.size(), 0ul);
ASSERT_EQ(text_insert_events.size(), 1ul);
- ASSERT_EQ(text_insert_events[0].position, 0);
- ASSERT_EQ(text_insert_events[0].length, 5);
- ASSERT_EQ(text_insert_events[0].text, "Value");
+ EXPECT_EQ(text_insert_events[0].position, 0);
+ EXPECT_EQ(text_insert_events[0].length, 5);
+ EXPECT_EQ(text_insert_events[0].text, "Value");
text_insert_events.clear();
textfield->SetText(base::UTF8ToUTF16("Value A"));
- textfield->NotifyAccessibilityEvent(ax::mojom::Event::kValueChanged, true);
-
ASSERT_EQ(text_remove_events.size(), 0ul);
ASSERT_EQ(text_insert_events.size(), 1ul);
- ASSERT_EQ(text_insert_events[0].position, 5);
- ASSERT_EQ(text_insert_events[0].length, 2);
- ASSERT_EQ(text_insert_events[0].text, " A");
+ EXPECT_EQ(text_insert_events[0].position, 5);
+ EXPECT_EQ(text_insert_events[0].length, 2);
+ EXPECT_EQ(text_insert_events[0].text, " A");
text_insert_events.clear();
textfield->SetText(base::UTF8ToUTF16("Value"));
- textfield->NotifyAccessibilityEvent(ax::mojom::Event::kValueChanged, true);
ASSERT_EQ(text_remove_events.size(), 1ul);
ASSERT_EQ(text_insert_events.size(), 0ul);
- ASSERT_EQ(text_remove_events[0].position, 5);
- ASSERT_EQ(text_remove_events[0].length, 2);
- ASSERT_EQ(text_remove_events[0].text, " A");
+ EXPECT_EQ(text_remove_events[0].position, 5);
+ EXPECT_EQ(text_remove_events[0].length, 2);
+ EXPECT_EQ(text_remove_events[0].text, " A");
text_remove_events.clear();
textfield->SetText(base::UTF8ToUTF16("Prefix Value"));
- textfield->NotifyAccessibilityEvent(ax::mojom::Event::kValueChanged, true);
ASSERT_EQ(text_remove_events.size(), 0ul);
ASSERT_EQ(text_insert_events.size(), 1ul);
- ASSERT_EQ(text_insert_events[0].position, 0);
- ASSERT_EQ(text_insert_events[0].length, 7);
- ASSERT_EQ(text_insert_events[0].text, "Prefix ");
+ EXPECT_EQ(text_insert_events[0].position, 0);
+ EXPECT_EQ(text_insert_events[0].length, 7);
+ EXPECT_EQ(text_insert_events[0].text, "Prefix ");
text_insert_events.clear();
textfield->SetText(base::UTF8ToUTF16("Value"));
- textfield->NotifyAccessibilityEvent(ax::mojom::Event::kValueChanged, true);
ASSERT_EQ(text_remove_events.size(), 1ul);
ASSERT_EQ(text_insert_events.size(), 0ul);
- ASSERT_EQ(text_remove_events[0].position, 0);
- ASSERT_EQ(text_remove_events[0].length, 7);
- ASSERT_EQ(text_remove_events[0].text, "Prefix ");
+ EXPECT_EQ(text_remove_events[0].position, 0);
+ EXPECT_EQ(text_remove_events[0].length, 7);
+ EXPECT_EQ(text_remove_events[0].text, "Prefix ");
text_insert_events.clear();
}
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 797c0eb5482..00ffe077cd7 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
@@ -7,6 +7,7 @@
#include <oleacc.h>
#include <wrl/client.h>
+#include <memory>
#include <utility>
#include "base/win/scoped_bstr.h"
@@ -69,8 +70,7 @@ TEST_F(ViewAXPlatformNodeDelegateWinTest, TextfieldAccessibility) {
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget.Init(std::move(init_params));
- View* content = new View;
- widget.SetContentsView(content);
+ View* content = widget.SetContentsView(std::make_unique<View>());
Textfield* textfield = new Textfield;
textfield->SetAccessibleName(L"Name");
@@ -112,8 +112,7 @@ TEST_F(ViewAXPlatformNodeDelegateWinTest, TextfieldAssociatedLabel) {
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget.Init(std::move(init_params));
- View* content = new View;
- widget.SetContentsView(content);
+ View* content = widget.SetContentsView(std::make_unique<View>());
Label* label = new Label(L"Label");
content->AddChildView(label);
@@ -259,8 +258,7 @@ TEST_F(ViewAXPlatformNodeDelegateWinTest, DISABLED_RetrieveAllAlerts) {
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget.Init(std::move(init_params));
- View* content = new View;
- widget.SetContentsView(content);
+ View* content = widget.SetContentsView(std::make_unique<View>());
View* infobar = new View;
content->AddChildView(infobar);
@@ -358,8 +356,7 @@ TEST_F(ViewAXPlatformNodeDelegateWinTest, Overrides) {
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget.Init(std::move(init_params));
- View* contents_view = new View;
- widget.SetContentsView(contents_view);
+ View* contents_view = widget.SetContentsView(std::make_unique<View>());
View* alert_view = new ScrollView;
alert_view->GetViewAccessibility().OverrideRole(ax::mojom::Role::kAlert);
@@ -417,8 +414,7 @@ TEST_F(ViewAXPlatformNodeDelegateWinTest, GridRowColumnCount) {
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget.Init(std::move(init_params));
- View* content = new View;
- widget.SetContentsView(content);
+ View* content = widget.SetContentsView(std::make_unique<View>());
TestListGridView* grid = new TestListGridView();
content->AddChildView(grid);
diff --git a/chromium/ui/views/animation/animation_delegate_views.cc b/chromium/ui/views/animation/animation_delegate_views.cc
index 815dc341dad..67399e294eb 100644
--- a/chromium/ui/views/animation/animation_delegate_views.cc
+++ b/chromium/ui/views/animation/animation_delegate_views.cc
@@ -41,7 +41,7 @@ void AnimationDelegateViews::OnViewAddedToWidget(View* observed_view) {
}
void AnimationDelegateViews::OnViewRemovedFromWidget(View* observed_view) {
- UpdateAnimationRunner();
+ ClearAnimationRunner();
}
void AnimationDelegateViews::OnViewIsDeleting(View* observed_view) {
@@ -53,7 +53,7 @@ void AnimationDelegateViews::OnViewIsDeleting(View* observed_view) {
void AnimationDelegateViews::AnimationContainerShuttingDown(
gfx::AnimationContainer* container) {
container_ = nullptr;
- compositor_animation_runner_ = nullptr;
+ ClearAnimationRunner();
}
base::TimeDelta AnimationDelegateViews::GetAnimationDurationForReporting()
@@ -76,18 +76,12 @@ void AnimationDelegateViews::SetAnimationMetricsReporter(
}
void AnimationDelegateViews::UpdateAnimationRunner() {
- if (!container_)
- return;
-
if (!view_ || !view_->GetWidget() || !view_->GetWidget()->GetCompositor()) {
- // TODO(https://crbug.com/960621): make sure the container has a correct
- // compositor-assisted runner.
- container_->SetAnimationRunner(nullptr);
- compositor_animation_runner_ = nullptr;
+ ClearAnimationRunner();
return;
}
- if (container_->has_custom_animation_runner())
+ if (!container_ || container_->has_custom_animation_runner())
return;
auto compositor_animation_runner =
@@ -98,4 +92,12 @@ void AnimationDelegateViews::UpdateAnimationRunner() {
container_->SetAnimationRunner(std::move(compositor_animation_runner));
}
+void AnimationDelegateViews::ClearAnimationRunner() {
+ // TODO(https://crbug.com/960621): make sure the container has a correct
+ // compositor-assisted runner.
+ if (container_)
+ container_->SetAnimationRunner(nullptr);
+ compositor_animation_runner_ = nullptr;
+}
+
} // namespace views
diff --git a/chromium/ui/views/animation/animation_delegate_views.h b/chromium/ui/views/animation/animation_delegate_views.h
index 8cc9fb504fa..df98f3fb536 100644
--- a/chromium/ui/views/animation/animation_delegate_views.h
+++ b/chromium/ui/views/animation/animation_delegate_views.h
@@ -60,10 +60,10 @@ class VIEWS_EXPORT AnimationDelegateViews
// Sets CompositorAnimationRunner to |container_| if possible. Otherwise,
// clears AnimationRunner of |container_|.
void UpdateAnimationRunner();
+ void ClearAnimationRunner();
View* view_;
gfx::AnimationContainer* container_ = nullptr;
-
ui::AnimationMetricsReporter* animation_metrics_reporter_ = nullptr;
// The animation runner that |container_| uses.
diff --git a/chromium/ui/views/animation/bounds_animator.cc b/chromium/ui/views/animation/bounds_animator.cc
index cf2598680d4..2f360194f0e 100644
--- a/chromium/ui/views/animation/bounds_animator.cc
+++ b/chromium/ui/views/animation/bounds_animator.cc
@@ -41,9 +41,15 @@ void BoundsAnimator::AnimateViewTo(
DCHECK(view);
DCHECK_EQ(view->parent(), parent_);
- Data existing_data;
+ const bool is_animating = IsAnimating(view);
+
+ // Return early if the existing animation on |view| has the same target
+ // bounds.
+ if (is_animating && target == data_[view].target_bounds)
+ return;
- if (IsAnimating(view)) {
+ Data existing_data;
+ if (is_animating) {
DCHECK(base::Contains(data_, view));
const bool used_transforms = data_[view].target_transform.has_value();
if (used_transforms) {
@@ -75,8 +81,14 @@ void BoundsAnimator::AnimateViewTo(
// If the start bounds are empty we cannot derive a transform from start to
// target. Views with existing transforms are not supported. Default back to
// using the bounds update animation in these cases.
+ // Note that transform is not used if bounds animation requires scaling.
+ // Because for some views, their children cannot be scaled with the same scale
+ // factor. For example, ShelfAppButton's size in normal state and dense state
+ // is 56 and 48 respectively while the size of icon image, the child of
+ // ShelfAppButton, is 44 and 36 respectively.
if (use_transforms_ && !data.start_bounds.IsEmpty() &&
- view->GetTransform().IsIdentity()) {
+ view->GetTransform().IsIdentity() &&
+ data.start_bounds.size() == data.target_bounds.size()) {
// Calculate the target transform. Note that we don't reset the transform if
// there already was one, otherwise users will end up with visual bounds
// different than what they set.
diff --git a/chromium/ui/views/animation/bounds_animator_unittest.cc b/chromium/ui/views/animation/bounds_animator_unittest.cc
index c09736c4572..2042d98b677 100644
--- a/chromium/ui/views/animation/bounds_animator_unittest.cc
+++ b/chromium/ui/views/animation/bounds_animator_unittest.cc
@@ -152,6 +152,42 @@ class BoundsAnimatorTest : public testing::Test {
animator_->SetAnimationDuration(base::TimeDelta::FromMilliseconds(10));
}
+ // Animates |child_| to |target_bounds|. Returns the repaint time.
+ // |use_long_duration| indicates whether long or short bounds animation is
+ // created.
+ int GetRepaintTimeFromBoundsAnimation(const gfx::Rect& target_bounds,
+ bool use_long_duration) {
+ child()->set_repaint_count(0);
+
+ const base::TimeDelta animation_duration =
+ base::TimeDelta::FromMilliseconds(use_long_duration ? 2000 : 10);
+ animator()->SetAnimationDuration(animation_duration);
+
+ animator()->AnimateViewTo(child(), target_bounds);
+ animator()->SetAnimationDelegate(child(),
+ std::make_unique<TestAnimationDelegate>());
+
+ // The animator should be animating now.
+ EXPECT_TRUE(animator()->IsAnimating());
+ EXPECT_TRUE(animator()->IsAnimating(child()));
+
+ // Run the message loop; the delegate exits the loop when the animation is
+ // done.
+ if (use_long_duration)
+ task_environment_.FastForwardBy(animation_duration);
+ base::RunLoop().Run();
+
+ // Make sure the bounds match of the view that was animated match and the
+ // layer is destroyed.
+ EXPECT_EQ(target_bounds, child()->bounds());
+ EXPECT_FALSE(child()->layer());
+
+ // |child| shouldn't be animating anymore.
+ EXPECT_FALSE(animator()->IsAnimating(child()));
+
+ return child()->repaint_count();
+ }
+
base::test::SingleThreadTaskEnvironment task_environment_;
private:
@@ -221,19 +257,38 @@ TEST_F(BoundsAnimatorTest, DeleteDelegateOnCancel) {
EXPECT_TRUE(OwnedDelegate::GetAndClearDeleted());
}
-// Make sure an AnimationDelegate is deleted when another animation is
-// scheduled.
+// Make sure that the AnimationDelegate of the running animation is deleted when
+// a new animation is scheduled.
TEST_F(BoundsAnimatorTest, DeleteDelegateOnNewAnimate) {
- animator()->AnimateViewTo(child(), gfx::Rect(0, 0, 10, 10));
+ const gfx::Rect target_bounds_first(0, 0, 10, 10);
+ animator()->AnimateViewTo(child(), target_bounds_first);
animator()->SetAnimationDelegate(child(), std::make_unique<OwnedDelegate>());
- animator()->AnimateViewTo(child(), gfx::Rect(0, 0, 10, 10));
+ // Start an animation on the same view with different target bounds.
+ const gfx::Rect target_bounds_second(0, 5, 10, 10);
+ animator()->AnimateViewTo(child(), target_bounds_second);
// Starting a new animation should both cancel the delegate and delete it.
EXPECT_TRUE(OwnedDelegate::GetAndClearDeleted());
EXPECT_TRUE(OwnedDelegate::GetAndClearCanceled());
}
+// Make sure that the duplicate animation request does not interrupt the running
+// animation.
+TEST_F(BoundsAnimatorTest, HandleDuplicateAnimation) {
+ const gfx::Rect target_bounds(0, 0, 10, 10);
+
+ animator()->AnimateViewTo(child(), target_bounds);
+ animator()->SetAnimationDelegate(child(), std::make_unique<OwnedDelegate>());
+
+ // Request the animation with the same view/target bounds.
+ animator()->AnimateViewTo(child(), target_bounds);
+
+ // Verify that the existing animation is not interrupted.
+ EXPECT_FALSE(OwnedDelegate::GetAndClearDeleted());
+ EXPECT_FALSE(OwnedDelegate::GetAndClearCanceled());
+}
+
// Makes sure StopAnimating works.
TEST_F(BoundsAnimatorTest, StopAnimating) {
std::unique_ptr<OwnedDelegate> delegate(std::make_unique<OwnedDelegate>());
@@ -252,47 +307,57 @@ TEST_F(BoundsAnimatorTest, StopAnimating) {
EXPECT_TRUE(OwnedDelegate::GetAndClearCanceled());
}
-// Tests using the transforms option.
+// Verify that transform is used when the animation target bounds have the
+// same size with the current bounds' meanwhile having the transform option
+// enabled.
TEST_F(BoundsAnimatorTest, UseTransformsAnimateViewTo) {
RecreateAnimator(/*use_transforms=*/true);
- gfx::Rect initial_bounds(0, 0, 10, 10);
+ const gfx::Rect initial_bounds(0, 0, 10, 10);
child()->SetBoundsRect(initial_bounds);
- gfx::Rect target_bounds(10, 10, 20, 20);
- child()->set_repaint_count(0);
- animator()->AnimateViewTo(child(), target_bounds);
- animator()->SetAnimationDelegate(child(),
- std::make_unique<TestAnimationDelegate>());
-
- // The animator should be animating now.
- EXPECT_TRUE(animator()->IsAnimating());
- EXPECT_TRUE(animator()->IsAnimating(child()));
-
- // Run the message loop; the delegate exits the loop when the animation is
- // done.
- base::RunLoop().Run();
+ // Ensure that the target bounds have the same size with the initial bounds'
+ // to apply transform to bounds animation.
+ const gfx::Rect target_bounds_without_resize(gfx::Point(10, 10),
+ initial_bounds.size());
+
+ const int repaint_time_from_short_animation =
+ GetRepaintTimeFromBoundsAnimation(target_bounds_without_resize,
+ /*use_long_duration=*/false);
+ const int repaint_time_from_long_animation =
+ GetRepaintTimeFromBoundsAnimation(initial_bounds,
+ /*use_long_duration=*/true);
+
+ // The number of repaints in long animation should be the same as with the
+ // short animation.
+ EXPECT_EQ(repaint_time_from_short_animation,
+ repaint_time_from_long_animation);
+}
- // Make sure the bounds match of the view that was animated match and the
- // layer is destroyed.
- EXPECT_EQ(target_bounds, child()->bounds());
- EXPECT_FALSE(child()->layer());
+// Verify that transform is not used when the animation target bounds have the
+// different size from the current bounds' even if transform is preferred.
+TEST_F(BoundsAnimatorTest, NoTransformForScalingAnimation) {
+ RecreateAnimator(/*use_transforms=*/true);
- // |child| shouldn't be animating anymore.
- EXPECT_FALSE(animator()->IsAnimating(child()));
+ const gfx::Rect initial_bounds(0, 0, 10, 10);
+ child()->SetBoundsRect(initial_bounds);
- // Schedule a longer animation. The number of repaints should be the same as
- // with the short animation.
- const base::TimeDelta long_duration = base::TimeDelta::FromMilliseconds(2000);
- const int repaint_count = child()->repaint_count();
- animator()->SetAnimationDuration(long_duration);
- child()->set_repaint_count(0);
- animator()->AnimateViewTo(child(), initial_bounds);
- animator()->SetAnimationDelegate(child(),
- std::make_unique<TestAnimationDelegate>());
- task_environment_.FastForwardBy(long_duration);
- base::RunLoop().Run();
- EXPECT_EQ(repaint_count, child()->repaint_count());
+ // Ensure that the target bounds have the different size with the initial
+ // bounds' to repaint bounds in each animation tick.
+ const gfx::Rect target_bounds_with_reize(gfx::Point(10, 10),
+ gfx::Size(20, 20));
+
+ const int repaint_time_from_short_animation =
+ GetRepaintTimeFromBoundsAnimation(target_bounds_with_reize,
+ /*use_long_duration=*/false);
+ const int repaint_time_from_long_animation =
+ GetRepaintTimeFromBoundsAnimation(initial_bounds,
+ /*use_long_duration=*/true);
+
+ // When creating bounds animation with repaint, the longer bounds animation
+ // should have more repaint counts.
+ EXPECT_GT(repaint_time_from_long_animation,
+ repaint_time_from_short_animation);
}
// Tests that the transforms option does not crash when a view's bounds start
@@ -324,9 +389,12 @@ TEST_F(BoundsAnimatorTest, UseTransformsAnimateViewToEmptySrc) {
TEST_F(BoundsAnimatorTest, UseTransformsCancelAnimation) {
RecreateAnimator(/*use_transforms=*/true);
- gfx::Rect initial_bounds(0, 0, 10, 10);
+ // Ensure that |initial_bounds| has the same size with |target_bounds| to
+ // create bounds animation via the transform.
+ const gfx::Rect initial_bounds(0, 0, 10, 10);
+ const gfx::Rect target_bounds(10, 10, 10, 10);
+
child()->SetBoundsRect(initial_bounds);
- gfx::Rect target_bounds(10, 10, 20, 20);
const base::TimeDelta duration = base::TimeDelta::FromMilliseconds(200);
animator()->SetAnimationDuration(duration);
@@ -340,7 +408,7 @@ TEST_F(BoundsAnimatorTest, UseTransformsCancelAnimation) {
// Stop halfway and cancel. The child should have its bounds updated to
// exactly halfway between |initial_bounds| and |target_bounds|.
- const gfx::Rect expected_bounds(5, 5, 15, 15);
+ const gfx::Rect expected_bounds(5, 5, 10, 10);
task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(100));
EXPECT_EQ(initial_bounds, child()->bounds());
animator()->Cancel();
diff --git a/chromium/ui/views/animation/compositor_animation_runner.cc b/chromium/ui/views/animation/compositor_animation_runner.cc
index 2282a84fb4a..f945808e419 100644
--- a/chromium/ui/views/animation/compositor_animation_runner.cc
+++ b/chromium/ui/views/animation/compositor_animation_runner.cc
@@ -23,6 +23,7 @@ CompositorAnimationRunner::~CompositorAnimationRunner() {
if (widget_)
OnWidgetDestroying(widget_);
DCHECK(!compositor_ || !compositor_->HasAnimationObserver(this));
+ CHECK(!IsInObserverList());
}
void CompositorAnimationRunner::SetAnimationMetricsReporter(
diff --git a/chromium/ui/views/animation/compositor_animation_runner.h b/chromium/ui/views/animation/compositor_animation_runner.h
index e2293996be6..462404ae38d 100644
--- a/chromium/ui/views/animation/compositor_animation_runner.h
+++ b/chromium/ui/views/animation/compositor_animation_runner.h
@@ -13,6 +13,7 @@
#include "ui/compositor/compositor_animation_observer.h"
#include "ui/compositor/compositor_observer.h"
#include "ui/gfx/animation/animation_container.h"
+#include "ui/views/views_export.h"
#include "ui/views/widget/widget_observer.h"
namespace ui {
@@ -24,9 +25,10 @@ namespace views {
class Widget;
// An animation runner based on ui::Compositor.
-class CompositorAnimationRunner : public gfx::AnimationRunner,
- public ui::CompositorAnimationObserver,
- public WidgetObserver {
+class VIEWS_EXPORT CompositorAnimationRunner
+ : public gfx::AnimationRunner,
+ public ui::CompositorAnimationObserver,
+ public WidgetObserver {
public:
explicit CompositorAnimationRunner(Widget* widget);
CompositorAnimationRunner(CompositorAnimationRunner&) = delete;
diff --git a/chromium/ui/views/animation/installable_ink_drop_painter_unittest.cc b/chromium/ui/views/animation/installable_ink_drop_painter_unittest.cc
new file mode 100644
index 00000000000..ec14f77aa31
--- /dev/null
+++ b/chromium/ui/views/animation/installable_ink_drop_painter_unittest.cc
@@ -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.
+
+#include "ui/views/animation/installable_ink_drop_painter.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "ui/gfx/canvas.h"
+#include "ui/gfx/geometry/point.h"
+#include "ui/views/animation/installable_ink_drop_config.h"
+
+namespace views {
+
+namespace {
+
+class InstallableInkDropPainterTest : public ::testing::Test {
+ protected:
+ void SetUp() override {
+ config_.base_color = SK_ColorCYAN;
+ config_.ripple_opacity = 1.0f;
+ config_.highlight_opacity = 1.0f;
+
+ state_.flood_fill_center = gfx::PointF(5.0f, 5.0f);
+ state_.flood_fill_progress = 1.0f;
+ state_.highlighted_ratio = 0.0f;
+ }
+
+ InstallableInkDropConfig config_;
+ InstallableInkDropPainter::State state_;
+};
+
+} // namespace
+
+TEST_F(InstallableInkDropPainterTest, MinSize) {
+ InstallableInkDropPainter painter(&config_, &state_);
+ EXPECT_EQ(gfx::Size(), painter.GetMinimumSize());
+}
+
+TEST_F(InstallableInkDropPainterTest, Paint) {
+ InstallableInkDropPainter painter(&config_, &state_);
+
+ {
+ // No highlight, half filled.
+ state_.flood_fill_progress = 0.5f;
+ gfx::Canvas canvas(gfx::Size(10, 10), 1.0f, true);
+ SkBitmap bitmap = canvas.GetBitmap();
+ painter.Paint(&canvas, gfx::Size(5.0f, 5.0f));
+ EXPECT_EQ(SkColorSetA(SK_ColorBLACK, 0), bitmap.getColor(0, 0));
+ EXPECT_EQ(SK_ColorCYAN, bitmap.getColor(4, 4));
+ }
+
+ {
+ // No highlight, fully filled.
+ state_.flood_fill_progress = 1.0f;
+ gfx::Canvas canvas(gfx::Size(10, 10), 1.0f, true);
+ SkBitmap bitmap = canvas.GetBitmap();
+ painter.Paint(&canvas, gfx::Size(5.0f, 5.0f));
+ EXPECT_EQ(SK_ColorCYAN, bitmap.getColor(0, 0));
+ EXPECT_EQ(SK_ColorCYAN, bitmap.getColor(4, 4));
+ }
+
+ {
+ // Use highlight, half filled.
+ state_.flood_fill_progress = 0.5f;
+ state_.highlighted_ratio = 0.5f;
+ gfx::Canvas canvas(gfx::Size(10, 10), 1.0f, true);
+ SkBitmap bitmap = canvas.GetBitmap();
+ painter.Paint(&canvas, gfx::Size(5.0f, 5.0f));
+ EXPECT_EQ(0x7F007F7Fu, bitmap.getColor(1, 1));
+ EXPECT_EQ(SK_ColorCYAN, bitmap.getColor(4, 4));
+ }
+
+ {
+ // Change highlight opacity.
+ state_.flood_fill_progress = 0.5f;
+ state_.highlighted_ratio = 0.1f;
+ gfx::Canvas canvas(gfx::Size(10, 10), 1.0f, true);
+ SkBitmap bitmap = canvas.GetBitmap();
+ painter.Paint(&canvas, gfx::Size(5.0f, 5.0f));
+ EXPECT_EQ(0x19001919u, bitmap.getColor(1, 1));
+ EXPECT_EQ(SK_ColorCYAN, bitmap.getColor(4, 4));
+ }
+}
+
+} // namespace views
diff --git a/chromium/ui/views/animation/installable_ink_drop_unittest.cc b/chromium/ui/views/animation/installable_ink_drop_unittest.cc
index a451970729c..e1f0216e7d0 100644
--- a/chromium/ui/views/animation/installable_ink_drop_unittest.cc
+++ b/chromium/ui/views/animation/installable_ink_drop_unittest.cc
@@ -5,31 +5,36 @@
#include "ui/views/animation/installable_ink_drop.h"
#include <memory>
+#include <utility>
#include "base/test/task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkPath.h"
#include "ui/gfx/geometry/rect.h"
+#include "ui/views/animation/ink_drop_host_view.h"
#include "ui/views/animation/ink_drop_state.h"
+#include "ui/views/test/views_test_base.h"
#include "ui/views/view.h"
#include "ui/views/view_class_properties.h"
namespace views {
-class InstallableInkDropTest : public ::testing::Test {
+class InstallableInkDropTest : public ViewsTestBase {
protected:
void SetUp() override {
+ ViewsTestBase::SetUp();
+
+ root_view_ = std::make_unique<View>();
// Ink drop layers get installed as siblings to their host view's
// layer. Hence, there needs to be a root view with a layer above them.
- root_view_.SetPaintToLayer();
+ root_view_->SetPaintToLayer();
}
- View* root_view() { return &root_view_; }
+ View* root_view() { return root_view_.get(); }
+ std::unique_ptr<View> own_root_view() { return std::move(root_view_); }
private:
- base::test::TaskEnvironment task_environment_;
-
- View root_view_;
+ std::unique_ptr<View> root_view_;
};
TEST_F(InstallableInkDropTest, LayerIsAddedAndRemoved) {
@@ -68,6 +73,58 @@ TEST_F(InstallableInkDropTest, UpdatesState) {
ink_drop.AnimateToState(InkDropState::ACTIVATED);
EXPECT_EQ(ink_drop.GetTargetInkDropState(), InkDropState::ACTIVATED);
+
+ ink_drop.SnapToHidden();
+ EXPECT_EQ(ink_drop.GetTargetInkDropState(), InkDropState::HIDDEN);
+
+ ink_drop.SnapToActivated();
+ EXPECT_EQ(ink_drop.GetTargetInkDropState(), InkDropState::ACTIVATED);
+}
+
+TEST_F(InstallableInkDropTest, HighlightStates) {
+ View* view = root_view()->AddChildView(std::make_unique<View>());
+ InstallableInkDrop ink_drop(view);
+
+ // Initial state should be false.
+ EXPECT_FALSE(ink_drop.IsHighlightFadingInOrVisible());
+
+ ink_drop.SetFocused(true);
+ EXPECT_TRUE(ink_drop.IsHighlightFadingInOrVisible());
+
+ ink_drop.SetFocused(false);
+ EXPECT_FALSE(ink_drop.IsHighlightFadingInOrVisible());
+
+ ink_drop.SetHovered(true);
+ EXPECT_TRUE(ink_drop.IsHighlightFadingInOrVisible());
+
+ ink_drop.SetHovered(false);
+ EXPECT_FALSE(ink_drop.IsHighlightFadingInOrVisible());
+}
+
+TEST_F(InstallableInkDropTest, InstallOnHostView) {
+ InkDropHostView host_view;
+ InstallableInkDrop ink_drop(&host_view);
+
+ EXPECT_TRUE(ink_drop.SupportsGestureEvents());
+}
+
+TEST_F(InstallableInkDropTest, Paint) {
+ std::unique_ptr<Widget> widget = CreateTestWidget();
+ View* root_view = widget->SetContentsView(own_root_view());
+ View* view = root_view->AddChildView(std::make_unique<View>());
+ InstallableInkDrop ink_drop(view);
+
+ views::InstallableInkDropConfig config;
+ config.base_color = SK_ColorCYAN;
+ config.ripple_opacity = 0.05;
+ config.highlight_opacity = 0.07;
+ ink_drop.SetConfig(config);
+ ink_drop.AnimateToState(InkDropState::ACTIVATED);
+
+ auto list = base::MakeRefCounted<cc::DisplayItemList>();
+ ink_drop.OnPaintLayer(
+ ui::PaintContext(list.get(), 1.f, view->bounds(), false));
+ EXPECT_GT(2u, list->num_paint_ops());
}
} // namespace views
diff --git a/chromium/ui/views/bubble/bubble_dialog_delegate_view.cc b/chromium/ui/views/bubble/bubble_dialog_delegate_view.cc
index be71a1d4243..e082f15fcbc 100644
--- a/chromium/ui/views/bubble/bubble_dialog_delegate_view.cc
+++ b/chromium/ui/views/bubble/bubble_dialog_delegate_view.cc
@@ -37,10 +37,20 @@
namespace views {
// static
-bool BubbleDialogDelegateView::devtools_dismiss_override_ = false;
+bool BubbleDialogDelegate::devtools_dismiss_override_ = false;
namespace {
+// A BubbleFrameView will apply a masking path to its ClientView to ensure
+// contents are appropriately clipped to the frame's rounded corners. If the
+// bubble uses layers in its views hierarchy, these will not be clipped to
+// the client mask unless the ClientView is backed by a textured ui::Layer.
+// This flag tracks whether or not to to create a layer backed ClientView.
+//
+// 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)
+
// Override base functionality of Widget to give bubble dialogs access to the
// theme provider of the window they're anchored to.
class BubbleWidget : public Widget {
@@ -85,7 +95,7 @@ bool CustomShadowsSupported() {
}
// Create a widget to host the bubble.
-Widget* CreateBubbleWidget(BubbleDialogDelegateView* bubble) {
+Widget* CreateBubbleWidget(BubbleDialogDelegate* bubble) {
Widget* bubble_widget = new BubbleWidget();
Widget::InitParams bubble_params(Widget::InitParams::TYPE_BUBBLE);
bubble_params.delegate = bubble;
@@ -124,9 +134,9 @@ Widget* CreateBubbleWidget(BubbleDialogDelegateView* bubble) {
} // namespace
-class BubbleDialogDelegateView::AnchorViewObserver : public ViewObserver {
+class BubbleDialogDelegate::AnchorViewObserver : public ViewObserver {
public:
- AnchorViewObserver(BubbleDialogDelegateView* parent, View* anchor_view)
+ AnchorViewObserver(BubbleDialogDelegate* parent, View* anchor_view)
: parent_(parent), anchor_view_(anchor_view) {
anchor_view_->AddObserver(this);
}
@@ -158,13 +168,116 @@ class BubbleDialogDelegateView::AnchorViewObserver : public ViewObserver {
// view bounds when the anchor is visible.
private:
- BubbleDialogDelegateView* const parent_;
+ BubbleDialogDelegate* const parent_;
View* const anchor_view_;
};
+// This class is responsible for observing events on a BubbleDialogDelegate's
+// anchor widget and notifying the BubbleDialogDelegate of them.
+class BubbleDialogDelegate::AnchorWidgetObserver : public WidgetObserver {
+ public:
+ AnchorWidgetObserver(BubbleDialogDelegate* owner, Widget* widget)
+ : owner_(owner) {
+ observer_.Add(widget);
+ }
+ ~AnchorWidgetObserver() override = default;
+
+ void OnWidgetDestroying(Widget* widget) override {
+ observer_.Remove(widget);
+ owner_->OnAnchorWidgetDestroying();
+ // |this| may be destroyed here!
+ }
+
+ void OnWidgetActivationChanged(Widget* widget, bool active) override {
+ owner_->OnWidgetActivationChanged(widget, active);
+ }
+
+ void OnWidgetBoundsChanged(Widget* widget, const gfx::Rect&) override {
+ owner_->OnAnchorBoundsChanged();
+ }
+
+ private:
+ BubbleDialogDelegate* owner_;
+ ScopedObserver<views::Widget, views::WidgetObserver> observer_{this};
+};
+
+// This class is responsible for observing events on a BubbleDialogDelegate's
+// widget and notifying the BubbleDialogDelegate of them.
+class BubbleDialogDelegate::BubbleWidgetObserver : public WidgetObserver {
+ public:
+ BubbleWidgetObserver(BubbleDialogDelegate* owner, Widget* widget)
+ : owner_(owner) {
+ observer_.Add(widget);
+ }
+ ~BubbleWidgetObserver() override = default;
+
+ void OnWidgetClosing(Widget* widget) override {
+ owner_->OnBubbleWidgetClosing();
+ owner_->OnWidgetClosing(widget);
+ }
+
+ void OnWidgetDestroying(Widget* widget) override {
+ observer_.Remove(widget);
+ owner_->OnWidgetDestroying(widget);
+ }
+
+ void OnWidgetDestroyed(Widget* widget) override {
+ owner_->OnWidgetDestroyed(widget);
+ }
+
+ void OnWidgetBoundsChanged(Widget* widget, const gfx::Rect& bounds) override {
+ owner_->OnWidgetBoundsChanged(widget, bounds);
+ }
+
+ void OnWidgetVisibilityChanging(Widget* widget, bool visible) override {
+#if defined(OS_WIN)
+ // On Windows we need to handle this before the bubble is visible or hidden.
+ // Please see the comment on the OnWidgetVisibilityChanging function. On
+ // other platforms it is fine to handle it after the bubble is shown/hidden.
+ owner_->OnBubbleWidgetVisibilityChanged(visible);
+#endif
+ }
+
+ void OnWidgetVisibilityChanged(Widget* widget, bool visible) override {
+#if !defined(OS_WIN)
+ owner_->OnBubbleWidgetVisibilityChanged(visible);
+#endif
+ owner_->OnWidgetVisibilityChanged(widget, visible);
+ }
+
+ void OnWidgetActivationChanged(Widget* widget, bool active) override {
+ owner_->OnBubbleWidgetActivationChanged(active);
+ owner_->OnWidgetActivationChanged(widget, active);
+ }
+
+ void OnWidgetPaintAsActiveChanged(Widget* widget, bool as_active) override {
+ owner_->OnBubbleWidgetPaintAsActiveChanged(as_active);
+ }
+
+ private:
+ BubbleDialogDelegate* owner_;
+ ScopedObserver<views::Widget, views::WidgetObserver> observer_{this};
+};
+
+BubbleDialogDelegate::BubbleDialogDelegate() = default;
+BubbleDialogDelegate::BubbleDialogDelegate(View* anchor_view,
+ BubbleBorder::Arrow arrow,
+ BubbleBorder::Shadow shadow)
+ : arrow_(arrow), shadow_(shadow) {}
+BubbleDialogDelegate::~BubbleDialogDelegate() = default;
+
// static
-Widget* BubbleDialogDelegateView::CreateBubble(
- BubbleDialogDelegateView* bubble_delegate) {
+Widget* BubbleDialogDelegate::CreateBubble(
+ BubbleDialogDelegate* bubble_delegate) {
+ // On Mac, MODAL_TYPE_WINDOW is implemented using sheets, which can't be
+ // anchored at a specific point - they are always placed near the top center
+ // of the window. To avoid unpleasant surprises, disallow setting an anchor
+ // view or rectangle on these types of bubbles.
+ if (bubble_delegate->GetModalType() == ui::MODAL_TYPE_WINDOW) {
+ DCHECK(!bubble_delegate->GetAnchorView());
+ DCHECK_EQ(bubble_delegate->GetAnchorRect(), gfx::Rect());
+ }
+
bubble_delegate->Init();
// Get the latest anchor widget from the anchor view at bubble creation time.
bubble_delegate->SetAnchorView(bubble_delegate->GetAnchorView());
@@ -177,17 +290,23 @@ Widget* BubbleDialogDelegateView::CreateBubble(
#endif
bubble_delegate->SizeToContents();
- bubble_delegate->widget_observer_.Add(bubble_widget);
+ bubble_delegate->bubble_widget_observer_ =
+ std::make_unique<BubbleWidgetObserver>(bubble_delegate, bubble_widget);
return bubble_widget;
}
+Widget* BubbleDialogDelegateView::CreateBubble(BubbleDialogDelegateView* view) {
+ return BubbleDialogDelegate::CreateBubble(view);
+}
+
BubbleDialogDelegateView::BubbleDialogDelegateView()
: BubbleDialogDelegateView(nullptr, BubbleBorder::TOP_LEFT) {}
BubbleDialogDelegateView::BubbleDialogDelegateView(View* anchor_view,
BubbleBorder::Arrow arrow,
BubbleBorder::Shadow shadow)
- : shadow_(shadow) {
+ : BubbleDialogDelegate(anchor_view, arrow, shadow) {
+ set_owned_by_client();
WidgetDelegate::SetShowCloseButton(false);
SetArrow(arrow);
@@ -195,7 +314,7 @@ BubbleDialogDelegateView::BubbleDialogDelegateView(View* anchor_view,
// An individual bubble should override these margins if its layout differs
// from the typical title/text/buttons.
set_margins(provider->GetDialogInsetsForContentType(TEXT, TEXT));
- title_margins_ = provider->GetInsetsMetric(INSETS_DIALOG_TITLE);
+ set_title_margins(provider->GetInsetsMetric(INSETS_DIALOG_TITLE));
if (anchor_view)
SetAnchorView(anchor_view);
UpdateColorsFromTheme();
@@ -207,11 +326,11 @@ BubbleDialogDelegateView::~BubbleDialogDelegateView() {
SetAnchorView(nullptr);
}
-BubbleDialogDelegateView* BubbleDialogDelegateView::AsBubbleDialogDelegate() {
+BubbleDialogDelegate* BubbleDialogDelegate::AsBubbleDialogDelegate() {
return this;
}
-NonClientFrameView* BubbleDialogDelegateView::CreateNonClientFrameView(
+NonClientFrameView* BubbleDialogDelegate::CreateNonClientFrameView(
Widget* widget) {
BubbleFrameView* frame = new BubbleDialogFrameView(title_margins_);
LayoutProvider* provider = LayoutProvider::Get();
@@ -233,6 +352,20 @@ NonClientFrameView* BubbleDialogDelegateView::CreateNonClientFrameView(
return frame;
}
+ClientView* BubbleDialogDelegate::CreateClientView(Widget* widget) {
+ client_view_ = DialogDelegate::CreateClientView(widget);
+ // In order for the |client_view|'s content view hierarchy to respect its clip
+ // mask we must paint 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)) {
+ client_view_->SetPaintToLayer();
+ }
+
+ return client_view_;
+}
+
bool BubbleDialogDelegateView::AcceleratorPressed(
const ui::Accelerator& accelerator) {
if (accelerator.key_code() == ui::VKEY_DOWN ||
@@ -241,79 +374,71 @@ bool BubbleDialogDelegateView::AcceleratorPressed(
GetFocusManager()->AdvanceFocus(accelerator.key_code() != ui::VKEY_DOWN);
return true;
}
- return DialogDelegateView::AcceleratorPressed(accelerator);
+ return View::AcceleratorPressed(accelerator);
+}
+
+Widget* BubbleDialogDelegateView::GetWidget() {
+ return View::GetWidget();
+}
+
+const Widget* BubbleDialogDelegateView::GetWidget() const {
+ return View::GetWidget();
+}
+
+void BubbleDialogDelegateView::AddedToWidget() {
+ if (ui::IsAlert(GetAccessibleWindowRole())) {
+ GetWidget()->GetRootView()->NotifyAccessibilityEvent(
+ ax::mojom::Event::kAlert, true);
+ }
+}
+
+View* BubbleDialogDelegateView::GetContentsView() {
+ return this;
+}
+
+void BubbleDialogDelegateView::DeleteDelegate() {
+ delete this;
}
-void BubbleDialogDelegateView::OnWidgetClosing(Widget* widget) {
+void BubbleDialogDelegate::OnBubbleWidgetClosing() {
// To prevent keyboard focus traversal issues, the anchor view's
// kAnchoredDialogKey property is cleared immediately upon Close(). This
// avoids a bug that occured when a focused anchor view is made unfocusable
// right after the bubble is closed. Previously, focus would advance into the
// bubble then would be lost when the bubble was destroyed.
- if (widget == GetWidget() && GetAnchorView())
+ if (GetAnchorView())
GetAnchorView()->ClearProperty(kAnchoredDialogKey);
}
-void BubbleDialogDelegateView::OnWidgetDestroying(Widget* widget) {
- if (anchor_widget() == widget)
- SetAnchorView(nullptr);
-
- if (widget_observer_.IsObserving(widget))
- widget_observer_.Remove(widget);
-}
-
-void BubbleDialogDelegateView::OnWidgetVisibilityChanging(Widget* widget,
- bool visible) {
-#if defined(OS_WIN)
- // On Windows we need to handle this before the bubble is visible or hidden.
- // Please see the comment on the OnWidgetVisibilityChanging function. On
- // other platforms it is fine to handle it after the bubble is shown/hidden.
- HandleVisibilityChanged(widget, visible);
-#endif
-}
-
-void BubbleDialogDelegateView::OnWidgetVisibilityChanged(Widget* widget,
- bool visible) {
-#if !defined(OS_WIN)
- HandleVisibilityChanged(widget, visible);
-#endif
+void BubbleDialogDelegate::OnAnchorWidgetDestroying() {
+ SetAnchorView(nullptr);
}
-void BubbleDialogDelegateView::OnWidgetActivationChanged(Widget* widget,
- bool active) {
+void BubbleDialogDelegate::OnBubbleWidgetActivationChanged(bool active) {
if (devtools_dismiss_override_)
return;
#if defined(OS_MACOSX)
// Install |mac_bubble_closer_| the first time the widget becomes active.
- if (widget == GetWidget() && active && !mac_bubble_closer_) {
+ if (active && !mac_bubble_closer_) {
mac_bubble_closer_ = std::make_unique<ui::BubbleCloser>(
GetWidget()->GetNativeWindow().GetNativeNSWindow(),
- base::BindRepeating(&BubbleDialogDelegateView::OnDeactivate,
+ base::BindRepeating(&BubbleDialogDelegate::OnDeactivate,
base::Unretained(this)));
}
#endif
- if (widget == GetWidget() && !active)
+
+ if (!active)
OnDeactivate();
}
-void BubbleDialogDelegateView::OnWidgetBoundsChanged(
- Widget* widget,
- const gfx::Rect& new_bounds) {
- if (GetBubbleFrameView() && anchor_widget() == widget)
+void BubbleDialogDelegate::OnAnchorWidgetBoundsChanged() {
+ if (GetBubbleFrameView())
SizeToContents();
}
-void BubbleDialogDelegateView::OnWidgetPaintAsActiveChanged(
- Widget* widget,
- bool paint_as_active) {
- // We only care about the current widget having its state changed; if the
- // anchor widget receives active status directly then there's no need to apply
- // paint as active lock.
- if (widget != GetWidget())
- return;
-
- if (!paint_as_active) {
+void BubbleDialogDelegate::OnBubbleWidgetPaintAsActiveChanged(bool as_active) {
+ if (!as_active) {
paint_as_active_lock_.reset();
return;
}
@@ -327,20 +452,19 @@ void BubbleDialogDelegateView::OnWidgetPaintAsActiveChanged(
anchor_widget()->GetTopLevelWidget()->LockPaintAsActive();
}
-BubbleBorder::Shadow BubbleDialogDelegateView::GetShadow() const {
+BubbleBorder::Shadow BubbleDialogDelegate::GetShadow() const {
if (CustomShadowsSupported() || shadow_ == BubbleBorder::NO_ASSETS)
return shadow_;
return BubbleBorder::NO_SHADOW;
}
-View* BubbleDialogDelegateView::GetAnchorView() const {
+View* BubbleDialogDelegate::GetAnchorView() const {
if (!anchor_view_observer_)
return nullptr;
return anchor_view_observer_->anchor_view();
}
-void BubbleDialogDelegateView::SetHighlightedButton(
- Button* highlighted_button) {
+void BubbleDialogDelegate::SetHighlightedButton(Button* highlighted_button) {
bool visible = GetWidget() && GetWidget()->IsVisible();
// If the Widget is visible, ensure the old highlight (if any) is removed
// when the highlighted view changes.
@@ -351,7 +475,7 @@ void BubbleDialogDelegateView::SetHighlightedButton(
UpdateHighlightedButton(true);
}
-void BubbleDialogDelegateView::SetArrow(BubbleBorder::Arrow arrow) {
+void BubbleDialogDelegate::SetArrow(BubbleBorder::Arrow arrow) {
SetArrowWithoutResizing(arrow);
// If SetArrow() is called before CreateWidget(), there's no need to update
// the BubbleFrameView.
@@ -359,8 +483,7 @@ void BubbleDialogDelegateView::SetArrow(BubbleBorder::Arrow arrow) {
SizeToContents();
}
-void BubbleDialogDelegateView::SetArrowWithoutResizing(
- BubbleBorder::Arrow arrow) {
+void BubbleDialogDelegate::SetArrowWithoutResizing(BubbleBorder::Arrow arrow) {
if (base::i18n::IsRTL())
arrow = BubbleBorder::horizontal_mirror(arrow);
if (arrow_ == arrow)
@@ -373,7 +496,7 @@ void BubbleDialogDelegateView::SetArrowWithoutResizing(
GetBubbleFrameView()->SetArrow(arrow);
}
-gfx::Rect BubbleDialogDelegateView::GetAnchorRect() const {
+gfx::Rect BubbleDialogDelegate::GetAnchorRect() const {
// TODO(tluk) eliminate the need for GetAnchorRect() to return an empty rect
// if neither an |anchor_rect_| or an anchor view have been set.
if (!GetAnchorView())
@@ -384,19 +507,20 @@ gfx::Rect BubbleDialogDelegateView::GetAnchorRect() const {
return anchor_rect_.value();
}
-void BubbleDialogDelegateView::OnBeforeBubbleWidgetInit(
- Widget::InitParams* params,
- Widget* widget) const {}
-
-ui::LayerType BubbleDialogDelegateView::GetLayerType() const {
+ui::LayerType BubbleDialogDelegate::GetLayerType() const {
return ui::LAYER_TEXTURED;
}
-void BubbleDialogDelegateView::UseCompactMargins() {
+void BubbleDialogDelegate::SetPaintClientToLayer(bool paint_client_to_layer) {
+ DCHECK(!client_view_);
+ SetProperty(kPaintClientToLayer, paint_client_to_layer);
+}
+
+void BubbleDialogDelegate::UseCompactMargins() {
set_margins(gfx::Insets(6));
}
-void BubbleDialogDelegateView::OnAnchorBoundsChanged() {
+void BubbleDialogDelegate::OnAnchorBoundsChanged() {
if (!GetWidget())
return;
// TODO(pbos): Reconsider whether to update the anchor when the view isn't
@@ -404,7 +528,7 @@ void BubbleDialogDelegateView::OnAnchorBoundsChanged() {
SizeToContents();
}
-gfx::Rect BubbleDialogDelegateView::GetBubbleBounds() {
+gfx::Rect BubbleDialogDelegate::GetBubbleBounds() {
// The argument rect has its origin at the bubble's arrow anchor point;
// its size is the preferred size of the bubble's client view (this view).
bool anchor_minimized = anchor_widget() && anchor_widget()->IsMinimized();
@@ -417,7 +541,7 @@ gfx::Rect BubbleDialogDelegateView::GetBubbleBounds() {
adjust_if_offscreen_ && !anchor_minimized && has_anchor);
}
-ax::mojom::Role BubbleDialogDelegateView::GetAccessibleWindowRole() {
+ax::mojom::Role BubbleDialogDelegate::GetAccessibleWindowRole() {
// If something in the dialog has initial focus, use the dialog role.
// Screen readers understand what to announce when focus moves within one.
if (GetInitiallyFocusedView())
@@ -441,13 +565,19 @@ gfx::Size BubbleDialogDelegateView::GetMaximumSize() const {
}
void BubbleDialogDelegateView::OnThemeChanged() {
- DialogDelegateView::OnThemeChanged();
+ View::OnThemeChanged();
UpdateColorsFromTheme();
}
void BubbleDialogDelegateView::Init() {}
-void BubbleDialogDelegateView::SetAnchorView(View* anchor_view) {
+void BubbleDialogDelegate::SetAnchorView(View* anchor_view) {
+ if (anchor_view && anchor_view->GetWidget()) {
+ anchor_widget_observer_ =
+ std::make_unique<AnchorWidgetObserver>(this, anchor_view->GetWidget());
+ } else {
+ anchor_widget_observer_.reset();
+ }
if (GetAnchorView()) {
GetAnchorView()->ClearProperty(kAnchoredDialogKey);
anchor_view_observer_.reset();
@@ -460,13 +590,11 @@ void BubbleDialogDelegateView::SetAnchorView(View* anchor_view) {
if (GetWidget() && GetWidget()->IsVisible())
UpdateHighlightedButton(false);
paint_as_active_lock_.reset();
- anchor_widget_->RemoveObserver(this);
anchor_widget_ = nullptr;
}
if (anchor_view) {
anchor_widget_ = anchor_view->GetWidget();
if (anchor_widget_) {
- anchor_widget_->AddObserver(this);
const bool visible = GetWidget() && GetWidget()->IsVisible();
UpdateHighlightedButton(visible);
// Have the anchor widget's paint-as-active state track this view's
@@ -498,13 +626,13 @@ void BubbleDialogDelegateView::SetAnchorView(View* anchor_view) {
}
}
-void BubbleDialogDelegateView::SetAnchorRect(const gfx::Rect& rect) {
+void BubbleDialogDelegate::SetAnchorRect(const gfx::Rect& rect) {
anchor_rect_ = rect;
if (GetWidget())
OnAnchorBoundsChanged();
}
-void BubbleDialogDelegateView::SizeToContents() {
+void BubbleDialogDelegate::SizeToContents() {
gfx::Rect bubble_bounds = GetBubbleBounds();
#if defined(OS_MACOSX)
// GetBubbleBounds() doesn't take the Mac NativeWindow's style mask into
@@ -518,9 +646,10 @@ void BubbleDialogDelegateView::SizeToContents() {
}
void BubbleDialogDelegateView::UpdateColorsFromTheme() {
- if (!color_explicitly_set_)
- color_ = GetNativeTheme()->GetSystemColor(
- ui::NativeTheme::kColorId_BubbleBackground);
+ if (!color_explicitly_set()) {
+ set_color_internal(GetNativeTheme()->GetSystemColor(
+ ui::NativeTheme::kColorId_BubbleBackground));
+ }
BubbleFrameView* frame_view = GetBubbleFrameView();
if (frame_view)
frame_view->SetBackgroundColor(color());
@@ -538,29 +667,27 @@ void BubbleDialogDelegateView::EnableUpDownKeyboardAccelerators() {
AddAccelerator(ui::Accelerator(ui::VKEY_UP, ui::EF_NONE));
}
-void BubbleDialogDelegateView::HandleVisibilityChanged(Widget* widget,
- bool visible) {
- if (widget == GetWidget())
- UpdateHighlightedButton(visible);
+void BubbleDialogDelegate::OnBubbleWidgetVisibilityChanged(bool visible) {
+ UpdateHighlightedButton(visible);
// Fire ax::mojom::Event::kAlert for bubbles marked as
// ax::mojom::Role::kAlertDialog; this instructs accessibility tools to read
// the bubble in its entirety rather than just its title and initially focused
// view. See http://crbug.com/474622 for details.
- if (widget == GetWidget() && visible) {
+ if (visible) {
if (ui::IsAlert(GetAccessibleWindowRole())) {
- widget->GetRootView()->NotifyAccessibilityEvent(ax::mojom::Event::kAlert,
- true);
+ GetWidget()->GetRootView()->NotifyAccessibilityEvent(
+ ax::mojom::Event::kAlert, true);
}
}
}
-void BubbleDialogDelegateView::OnDeactivate() {
- if (close_on_deactivate() && GetWidget())
+void BubbleDialogDelegate::OnDeactivate() {
+ if (close_on_deactivate_ && GetWidget())
GetWidget()->CloseWithReason(views::Widget::ClosedReason::kLostFocus);
}
-void BubbleDialogDelegateView::UpdateHighlightedButton(bool highlighted) {
+void BubbleDialogDelegate::UpdateHighlightedButton(bool highlighted) {
Button* button = Button::AsButton(highlighted_button_tracker_.view());
button = button ? button : Button::AsButton(GetAnchorView());
if (button && highlight_button_when_shown_)
diff --git a/chromium/ui/views/bubble/bubble_dialog_delegate_view.h b/chromium/ui/views/bubble/bubble_dialog_delegate_view.h
index c56ab1fa993..4653b6a184e 100644
--- a/chromium/ui/views/bubble/bubble_dialog_delegate_view.h
+++ b/chromium/ui/views/bubble/bubble_dialog_delegate_view.h
@@ -13,6 +13,7 @@
#include "build/build_config.h"
#include "ui/accessibility/ax_enums.mojom-forward.h"
#include "ui/base/accelerators/accelerator.h"
+#include "ui/base/class_property.h"
#include "ui/views/bubble/bubble_border.h"
#include "ui/views/view_tracker.h"
#include "ui/views/widget/widget.h"
@@ -39,239 +40,315 @@ namespace views {
class Button;
-// BubbleDialogDelegateView is a special DialogDelegateView for bubbles.
-class VIEWS_EXPORT BubbleDialogDelegateView : public DialogDelegateView,
- public WidgetObserver {
+class VIEWS_EXPORT BubbleDialogDelegate : public DialogDelegate,
+ public ui::PropertyHandler {
public:
- METADATA_HEADER(BubbleDialogDelegateView);
-
enum class CloseReason {
DEACTIVATION,
CLOSE_BUTTON,
UNKNOWN,
};
- // Create and initialize the bubble Widget(s) with proper bounds.
- static Widget* CreateBubble(BubbleDialogDelegateView* bubble_delegate);
-
- BubbleDialogDelegateView();
- // |shadow| usually doesn't need to be explicitly set, just uses the default
- // argument. Unless on Mac when the bubble needs to use Views base shadow,
- // override it with suitable bubble border type.
- BubbleDialogDelegateView(
- View* anchor_view,
- BubbleBorder::Arrow arrow,
- BubbleBorder::Shadow shadow = BubbleBorder::DIALOG_SHADOW);
-
- ~BubbleDialogDelegateView() override;
+ BubbleDialogDelegate();
+ BubbleDialogDelegate(View* anchor_view,
+ BubbleBorder::Arrow arrow,
+ BubbleBorder::Shadow shadow);
+ BubbleDialogDelegate(const BubbleDialogDelegate& other) = delete;
+ BubbleDialogDelegate& operator=(const BubbleDialogDelegate& other) = delete;
+ ~BubbleDialogDelegate() override;
- // DialogDelegateView:
- BubbleDialogDelegateView* AsBubbleDialogDelegate() override;
+ // DialogDelegate:
+ BubbleDialogDelegate* AsBubbleDialogDelegate() override;
NonClientFrameView* CreateNonClientFrameView(Widget* widget) override;
- bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
-
- // WidgetObserver:
- void OnWidgetClosing(Widget* widget) override;
- void OnWidgetDestroying(Widget* widget) override;
- void OnWidgetVisibilityChanging(Widget* widget, bool visible) override;
- void OnWidgetVisibilityChanged(Widget* widget, bool visible) override;
- void OnWidgetActivationChanged(Widget* widget, bool active) override;
- void OnWidgetBoundsChanged(Widget* widget,
- const gfx::Rect& new_bounds) override;
- void OnWidgetPaintAsActiveChanged(Widget* widget,
- bool paint_as_active) override;
+ ClientView* CreateClientView(Widget* widget) override;
+ ax::mojom::Role GetAccessibleWindowRole() override;
- bool close_on_deactivate() const { return close_on_deactivate_; }
- void set_close_on_deactivate(bool close) { close_on_deactivate_ = close; }
+ //////////////////////////////////////////////////////////////////////////////
+ // The anchor view and rectangle:
+ //
+ // The anchor view takes priority over the anchor rectangle.
+ // If the anchor moves, BubbleDialogDelegate will move its Widget to maintain
+ // the same position relative to its anchor. If an anchor view is used this
+ // happens automatically; if an anchor rect is used, the new anchor rect needs
+ // to be supplied via SetAnchorRect().
- void SetAnchorView(View* anchor_view);
+ void SetAnchorView(View* view);
View* GetAnchorView() const;
- Widget* anchor_widget() const { return anchor_widget_; }
-
- void SetHighlightedButton(Button* highlighted_button);
- // The anchor rect is used in the absence of an assigned anchor view.
+ // GetAnchorRect() takes into account the presence of an anchor view, while
+ // anchor_rect() always returns the configured anchor rect, regardless of
+ // whether there is also an anchor view. While it is possible to override
+ // GetAnchorRect(), you should not need to do so; if you do, you must remember
+ // to call OnAnchorBoundsChanged() when the return value of GetAnchorRect()
+ // changes.
+ //
+ // TODO(ellyjones): Remove overrides of GetAnchorRect() and make this not
+ // virtual.
+ virtual gfx::Rect GetAnchorRect() const;
const base::Optional<gfx::Rect>& anchor_rect() const { return anchor_rect_; }
+ void SetAnchorRect(const gfx::Rect& rect);
+
+ // The anchor view insets are applied to the anchor view's bounds. This is
+ // used to align the bubble properly with the visual center of the anchor View
+ // when the anchor View's visual center is not the same as the center of its
+ // bounding box.
+ // TODO(https://crbug.com/869928): Remove this concept in favor of
+ // View::GetAnchorBoundsInScreen().
+ const gfx::Insets& anchor_view_insets() const { return anchor_view_insets_; }
+ void set_anchor_view_insets(const gfx::Insets& i) { anchor_view_insets_ = i; }
- // Set the desired arrow for the bubble and updates the bubble's bounds
- // accordingly. The arrow will be mirrored for RTL.
+ //////////////////////////////////////////////////////////////////////////////
+ // The anchor widget:
+ //
+ // The bubble will close when the anchor widget closes. Also, when the anchor
+ // widget moves, the bubble will recompute its location from its anchor view.
+ // The bubble will also cause its anchor widget to paint as active when the
+ // bubble is active, and will optionally resize itself to fit within the
+ // anchor widget if the anchor widget's size changes.
+ //
+ // The anchor widget is implied by the anchor view - bubbles with no anchor
+ // view cannot be anchored to a widget.
+
+ Widget* anchor_widget() { return anchor_widget_; }
+
+ //////////////////////////////////////////////////////////////////////////////
+ // The arrow:
+ //
+ // Each bubble has an "arrow", which describes the relationship between the
+ // bubble's position and the position of its anchor view. The arrow also
+ // supplies the - anchor offset eg, a top-left arrow puts the bubble below and
+ // to the right of the anchor view, and so on. The "arrow" name is a holdover
+ // from an earlier time when the arrow was an actual visual marker on the
+ // bubble's border as well, but these days the arrow has no visual presence.
+ //
+ // The arrow is automatically flipped in RTL locales, and by default is
+ // manually adjusted if necessary to fit the bubble on screen.
+
+ // Sets the desired arrow for the bubble and updates the bubble's bounds.
void SetArrow(BubbleBorder::Arrow arrow);
+ BubbleBorder::Arrow arrow() const { return arrow_; }
- // Sets the arrow without recaluclating or updating bounds. This could be used
- // proceeding another function call which also sets bounds, so that bounds are
+ // Sets the arrow without recalculating or updating bounds. This could be used
+ // before another function call which also sets bounds, so that bounds are
// not set multiple times in a row. When animating bounds changes, setting
// bounds twice in a row can make the widget position jump.
// TODO(crbug.com/982880) It would be good to be able to re-target the
- // animation rather than expet callers to use SetArrowWithoutResizing if they
+ // animation rather than expect callers to use SetArrowWithoutResizing if they
// are also changing the anchor rect, or similar.
void SetArrowWithoutResizing(BubbleBorder::Arrow arrow);
+ // Whether the arrow will be automatically adjusted if needed to fit the
+ // bubble on screen. Has no effect if the bubble has no arrow.
+ bool adjust_if_offscreen() const { return adjust_if_offscreen_; }
+ void set_adjust_if_offscreen(bool adjust) { adjust_if_offscreen_ = adjust; }
+
+ //////////////////////////////////////////////////////////////////////////////
+ // Shadows:
+ //
+ // Bubbles may optionally have a shadow. Only some platforms support drawing
+ // custom shadows on a bubble.
+
BubbleBorder::Shadow GetShadow() const;
void set_shadow(BubbleBorder::Shadow shadow) { shadow_ = shadow; }
- SkColor color() const { return color_; }
- void set_color(SkColor color) {
- color_ = color;
- color_explicitly_set_ = true;
- }
+ // Call this method to inform BubbleDialogDelegate that the return value of
+ // GetAnchorRect() has changed. You only need to do this if you have
+ // overridden GetAnchorRect() - if you are using an anchor view or anchor rect
+ // normally, do not call this.
+ void OnAnchorBoundsChanged();
- void set_title_margins(const gfx::Insets& title_margins) {
- title_margins_ = title_margins;
- }
+ //////////////////////////////////////////////////////////////////////////////
+ // Miscellaneous bubble behaviors:
+ //
- // TODO(pbos): Remove by overriding Views::GetAnchorBoundsInScreen() instead.
- // See https://crbug.com/869928.
- const gfx::Insets& anchor_view_insets() const { return anchor_view_insets_; }
- void set_anchor_view_insets(const gfx::Insets& i) { anchor_view_insets_ = i; }
+ // Whether the bubble closes when it ceases to be the active window.
+ bool close_on_deactivate() const { return close_on_deactivate_; }
+ void set_close_on_deactivate(bool close) { close_on_deactivate_ = close; }
+
+ // Explicitly set the button to automatically highlight when the bubble is
+ // shown. By default the anchor is highlighted, if it is a button.
+ //
+ // TODO(ellyjones): Is there ever a situation where this is the right thing to
+ // do UX-wise? It seems very odd to highlight something other than the anchor
+ // view.
+ void SetHighlightedButton(Button* highlighted_button);
+ // The bubble's parent window - this can only be usefully set before creating
+ // the bubble's widget. If there is one, the bubble will be stacked above it,
+ // and it will become the Views parent window for the bubble.
+ //
+ // TODO(ellyjones):
+ // - When does one actually need to call this?
+ // - Why is it separate from the anchor widget?
+ // - Why do most bubbles seem to work fine without this?
gfx::NativeView parent_window() const { return parent_window_; }
void set_parent_window(gfx::NativeView window) { parent_window_ = window; }
+ // Whether the bubble accepts mouse events or not.
bool accept_events() const { return accept_events_; }
void set_accept_events(bool accept_events) { accept_events_ = accept_events; }
- bool adjust_if_offscreen() const { return adjust_if_offscreen_; }
- void set_adjust_if_offscreen(bool adjust) { adjust_if_offscreen_ = adjust; }
-
+ // Whether focus can traverse from the anchor view into the bubble. Only
+ // meaningful if there is an anchor view.
void set_focus_traversable_from_anchor_view(bool focusable) {
focus_traversable_from_anchor_view_ = focusable;
}
+ // If this is true and either:
+ // - The anchor View is a Button, or
+ // - The highlighted Button is set,
+ // then BubbleDialogDelegate will ask the anchor View / highlighted button to
+ // highlight itself when the BubbleDialogDelegate's Widget is shown.
void set_highlight_button_when_shown(bool highlight) {
highlight_button_when_shown_ = highlight;
}
- // Get the arrow's anchor rect in screen space.
- virtual gfx::Rect GetAnchorRect() const;
+ //////////////////////////////////////////////////////////////////////////////
+ // Layout & colors:
+ //
+ // In general you shouldn't need to call any of these. If the default bubble
+ // look and feel does not work for your use case, BubbleDialogDelegate may not
+ // be a good fit for the UI you are building.
- // Allows delegates to provide custom parameters before widget initialization.
- virtual void OnBeforeBubbleWidgetInit(Widget::InitParams* params,
- Widget* widget) const;
+ // The bubble's background color:
+ SkColor color() const { return color_; }
+ void set_color(SkColor color) {
+ color_ = color;
+ color_explicitly_set_ = true;
+ }
- // The layer type of the bubble widget.
- virtual ui::LayerType GetLayerType() const;
+ void set_title_margins(const gfx::Insets& title_margins) {
+ title_margins_ = title_margins;
+ }
+
+ // Sets whether or not CreateClientView() returns a layer backed ClientView.
+ void SetPaintClientToLayer(bool paint_client_to_layer);
// Sets the content margins to a default picked for smaller bubbles.
void UseCompactMargins();
- // Call this method when the anchor bounds have changed to reposition the
- // bubble. The bubble is automatically repositioned when the anchor view
- // bounds change as a result of the widget's bounds changing.
- void OnAnchorBoundsChanged();
+ // Override to configure the layer type of the bubble widget.
+ virtual ui::LayerType GetLayerType() const;
+
+ // Override to provide custom parameters before widget initialization.
+ virtual void OnBeforeBubbleWidgetInit(Widget::InitParams* params,
+ Widget* widget) const {}
protected:
- // Returns the desired arrow post-RTL mirroring if needed.
- BubbleBorder::Arrow arrow() const { return arrow_; }
+ // Create and initialize the bubble Widget with proper bounds.
+ static Widget* CreateBubble(BubbleDialogDelegate* bubble_delegate);
- // Get bubble bounds from the anchor rect and client view's preferred size.
+ // Override this method if you want to position the bubble regardless of its
+ // anchor, while retaining the other anchor view logic.
virtual gfx::Rect GetBubbleBounds();
- // DialogDelegateView:
- ax::mojom::Role GetAccessibleWindowRole() override;
-
- // Disallow overrides of GetMinimumSize and GetMaximumSize(). These would only
- // be called by the FrameView, but the BubbleFrameView ignores these. Bubbles
- // are not user-sizable and always size to their preferred size (plus any
- // border / frame).
- gfx::Size GetMinimumSize() const final;
- gfx::Size GetMaximumSize() const final;
-
- void OnThemeChanged() override;
-
- // Perform view initialization on the contents for bubble sizing.
- virtual void Init();
+ // Update the button highlight, which may be the anchor view or an explicit
+ // view set in |highlighted_button_tracker_|. This can be overridden to
+ // provide different highlight effects.
+ //
+ // TODO(ellyjones): Remove this; it is only used in one place, to disable
+ // highlighting the button, but this is trivial to achieve using other
+ // methods.
+ virtual void UpdateHighlightedButton(bool highlight);
+
+ // Resize the bubble to fit its contents, and maybe move it if needed to keep
+ // it anchored properly.
+ void SizeToContents();
+
+ // Override this to perform initialization after the Widget is created but
+ // before it is shown.
+ virtual void Init() {}
+
+ // TODO(ellyjones): Replace uses of this with uses of set_color(), and/or
+ // otherwise get rid of this function.
+ void set_color_internal(SkColor color) { color_ = color; }
+
+ bool color_explicitly_set() const { return color_explicitly_set_; }
+
+ // Redeclarations of virtuals that BubbleDialogDelegate used to inherit from
+ // WidgetObserver. These should not exist; do not add new overrides of them.
+ // They exist to allow the WidgetObserver helper classes inside
+ // BubbleDialogDelegate (AnchorWidgetObserver and BubbleWidgetObserver) to
+ // forward specific events to BubbleDialogDelegate subclasses that were
+ // overriding WidgetObserver methods from BubbleDialogDelegate. Whether they
+ // are called for the anchor widget or the bubble widget and when is
+ // deliberately unspecified.
+ //
+ // TODO(ellyjones): Get rid of these.
+ virtual void OnWidgetClosing(Widget* widget) {}
+ virtual void OnWidgetDestroying(Widget* widget) {}
+ virtual void OnWidgetActivationChanged(Widget* widget, bool active) {}
+ virtual void OnWidgetDestroyed(Widget* widget) {}
+ virtual void OnWidgetBoundsChanged(Widget* widget, const gfx::Rect& bounds) {}
+ virtual void OnWidgetVisibilityChanged(Widget* widget, bool visible) {}
- // Sets the anchor view or rect and repositions the bubble. Note that if a
- // valid view gets passed, the anchor rect will get ignored. If the view gets
- // deleted, but no new view gets set, the last known anchor postion will get
- // returned.
- void SetAnchorRect(const gfx::Rect& rect);
+ private:
+ class AnchorViewObserver;
+ class AnchorWidgetObserver;
+ class BubbleWidgetObserver;
- // Resize and potentially move the bubble to fit the content's preferred size.
- virtual void SizeToContents();
+ FRIEND_TEST_ALL_PREFIXES(BubbleDialogDelegateViewTest,
+ VisibleWidgetShowsInkDropOnAttaching);
+ FRIEND_TEST_ALL_PREFIXES(BubbleDialogDelegateViewTest,
+ AttachedWidgetShowsInkDropWhenVisible);
- // Allows the up and down arrow keys to tab between items.
- void EnableUpDownKeyboardAccelerators();
+ friend class AnchorViewObserver;
+ friend class AnchorWidgetObserver;
+ friend class BubbleWidgetObserver;
- private:
friend class BubbleBorderDelegate;
friend class BubbleWindowTargeter;
friend class ui_devtools::PageAgentViews;
- class AnchorViewObserver;
-
- FRIEND_TEST_ALL_PREFIXES(BubbleDelegateTest, CreateDelegate);
- FRIEND_TEST_ALL_PREFIXES(BubbleDelegateTest, NonClientHitTest);
+ // Notify the BubbleDialogDelegate about changes in the anchor Widget. You do
+ // not need to call these yourself.
+ void OnAnchorWidgetDestroying();
+ void OnAnchorWidgetBoundsChanged();
- // Update the bubble color from the NativeTheme unless it was explicitly set.
- void UpdateColorsFromTheme();
+ // Notify the BubbleDialogDelegate about changes in the bubble Widget. You do
+ // not need to call these yourself.
+ void OnBubbleWidgetClosing();
+ void OnBubbleWidgetVisibilityChanged(bool visible);
+ void OnBubbleWidgetActivationChanged(bool active);
+ void OnBubbleWidgetPaintAsActiveChanged(bool as_active);
- // Handles widget visibility changes.
- void HandleVisibilityChanged(Widget* widget, bool visible);
-
- // Called when a deactivation is detected.
void OnDeactivate();
- // Update the button highlight, which may be the anchor view or an explicit
- // view set in |highlighted_button_tracker_|. This can be overridden to
- // provide different highlight effects.
- virtual void UpdateHighlightedButton(bool highlighted);
-
// Set from UI DevTools to prevent bubbles from closing in
// OnWidgetActivationChanged().
static bool devtools_dismiss_override_;
- // A flag controlling bubble closure on deactivation.
- bool close_on_deactivate_ = true;
-
- // The view and widget to which this bubble is anchored. AnchorViewObserver
- // is used to observe bounds changes and view deletion.
- std::unique_ptr<AnchorViewObserver> anchor_view_observer_;
+ gfx::Insets title_margins_;
+ BubbleBorder::Arrow arrow_ = BubbleBorder::NONE;
+ BubbleBorder::Shadow shadow_;
+ SkColor color_ = gfx::kPlaceholderColor;
+ bool color_explicitly_set_ = false;
Widget* anchor_widget_ = nullptr;
+ std::unique_ptr<AnchorViewObserver> anchor_view_observer_;
+ std::unique_ptr<AnchorWidgetObserver> anchor_widget_observer_;
+ std::unique_ptr<BubbleWidgetObserver> bubble_widget_observer_;
std::unique_ptr<Widget::PaintAsActiveLock> paint_as_active_lock_;
+ bool adjust_if_offscreen_ = true;
+ bool focus_traversable_from_anchor_view_ = true;
+ ViewTracker highlighted_button_tracker_;
+
+ // Insets applied to the |anchor_view_| bounds.
+ gfx::Insets anchor_view_insets_;
+
+ // A flag controlling bubble closure on deactivation.
+ bool close_on_deactivate_ = true;
// Whether the |anchor_widget_| (or the |highlighted_button_tracker_|, when
// provided) should be highlighted when this bubble is shown.
bool highlight_button_when_shown_ = true;
- // If provided, this button should be highlighted while the bubble is visible.
- // If not provided, the anchor_view will attempt to be highlighted. A
- // ViewTracker is used because the view can be deleted.
- ViewTracker highlighted_button_tracker_;
-
- // The anchor rect used in the absence of an anchor view.
mutable base::Optional<gfx::Rect> anchor_rect_;
- // The arrow's default location on the bubble post-RTL mirroring if needed.
- BubbleBorder::Arrow arrow_ = BubbleBorder::NONE;
-
- // Bubble border shadow to use.
- BubbleBorder::Shadow shadow_;
-
- // The background color of the bubble; and flag for when it's explicitly set.
- SkColor color_;
- bool color_explicitly_set_ = false;
-
- // The margins around the title.
- // TODO(tapted): Investigate deleting this when MD is default.
- gfx::Insets title_margins_;
-
- // Insets applied to the |anchor_view_| bounds.
- gfx::Insets anchor_view_insets_;
-
- // Specifies whether the bubble (or its border) handles mouse events, etc.
bool accept_events_ = true;
-
- // If true (defaults to true), the arrow may be mirrored and moved to fit the
- // bubble on screen better. It would be a no-op if the bubble has no arrow.
- bool adjust_if_offscreen_ = true;
-
- // Parent native window of the bubble.
gfx::NativeView parent_window_ = nullptr;
- // If true, focus can navigate to the bubble from the anchor view. This takes
- // effect only when SetAnchorView is called.
- bool focus_traversable_from_anchor_view_ = true;
+ // Pointer to this bubble's ClientView.
+ ClientView* client_view_ = nullptr;
#if defined(OS_MACOSX)
// Special handler for close_on_deactivate() on Mac. Window (de)activation is
@@ -279,8 +356,63 @@ class VIEWS_EXPORT BubbleDialogDelegateView : public DialogDelegateView,
// monitor clicks as well for the desired behavior.
std::unique_ptr<ui::BubbleCloser> mac_bubble_closer_;
#endif
+};
+
+// BubbleDialogDelegateView is a BubbleDialogDelegate that is also a View.
+// If you can, it is better to subclass View and construct a
+// BubbleDialogDelegate instance as a member of your subclass.
+class VIEWS_EXPORT BubbleDialogDelegateView : public BubbleDialogDelegate,
+ public View {
+ public:
+ METADATA_HEADER(BubbleDialogDelegateView);
+
+ // Create and initialize the bubble Widget(s) with proper bounds.
+ static Widget* CreateBubble(BubbleDialogDelegateView* bubble_delegate);
+
+ BubbleDialogDelegateView();
+ // |shadow| usually doesn't need to be explicitly set, just uses the default
+ // argument. Unless on Mac when the bubble needs to use Views base shadow,
+ // override it with suitable bubble border type.
+ BubbleDialogDelegateView(
+ View* anchor_view,
+ BubbleBorder::Arrow arrow,
+ BubbleBorder::Shadow shadow = BubbleBorder::DIALOG_SHADOW);
+
+ ~BubbleDialogDelegateView() override;
+
+ // BubbleDialogDelegate:
+ View* GetContentsView() override;
+ void DeleteDelegate() override;
+
+ // View:
+ Widget* GetWidget() override;
+ const Widget* GetWidget() const override;
+ void AddedToWidget() override;
+ bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
+
+ protected:
+ // Disallow overrides of GetMinimumSize and GetMaximumSize(). These would only
+ // be called by the FrameView, but the BubbleFrameView ignores these. Bubbles
+ // are not user-sizable and always size to their preferred size (plus any
+ // border / frame).
+ // View:
+ gfx::Size GetMinimumSize() const final;
+ gfx::Size GetMaximumSize() const final;
+
+ void OnThemeChanged() override;
- ScopedObserver<views::Widget, views::WidgetObserver> widget_observer_{this};
+ // 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);
};
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 812261ecd46..f2d4cc73ada 100644
--- a/chromium/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc
+++ b/chromium/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc
@@ -6,6 +6,7 @@
#include <stddef.h>
+#include <memory>
#include <string>
#include <utility>
@@ -13,6 +14,7 @@
#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/events/event_utils.h"
@@ -26,6 +28,7 @@
#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"
@@ -185,10 +188,9 @@ TEST_F(BubbleDialogDelegateViewTest, CloseAnchorWidget) {
TEST_F(BubbleDialogDelegateViewTest, CloseAnchorViewTest) {
// Create an anchor widget and add a view to be used as an anchor view.
std::unique_ptr<Widget> anchor_widget = CreateTestWidget();
- std::unique_ptr<View> anchor_view(new View());
- anchor_widget->SetContentsView(anchor_view.get());
+ View* anchor_view = anchor_widget->SetContentsView(std::make_unique<View>());
TestBubbleDialogDelegateView* bubble_delegate =
- new TestBubbleDialogDelegateView(anchor_view.get());
+ new TestBubbleDialogDelegateView(anchor_view);
// Prevent flakes by avoiding closing on activation changes.
bubble_delegate->set_close_on_deactivate(false);
Widget* bubble_widget =
@@ -197,7 +199,7 @@ TEST_F(BubbleDialogDelegateViewTest, CloseAnchorViewTest) {
// Check that the anchor view is correct and set up an anchor view rect.
// Make sure that this rect will get ignored (as long as the anchor view is
// attached).
- EXPECT_EQ(anchor_view.get(), bubble_delegate->GetAnchorView());
+ EXPECT_EQ(anchor_view, bubble_delegate->GetAnchorView());
const gfx::Rect set_anchor_rect = gfx::Rect(10, 10, 100, 100);
bubble_delegate->SetAnchorRect(set_anchor_rect);
const gfx::Rect view_rect = bubble_delegate->GetAnchorRect();
@@ -209,8 +211,7 @@ TEST_F(BubbleDialogDelegateViewTest, CloseAnchorViewTest) {
// Remove now the anchor view and make sure that the original found rect
// is still kept, so that the bubble does not jump when the view gets deleted.
- anchor_widget->SetContentsView(anchor_view.get());
- anchor_view.reset();
+ anchor_view->parent()->RemoveChildViewT(anchor_view);
EXPECT_EQ(nullptr, bubble_delegate->GetAnchorView());
EXPECT_EQ(view_rect.ToString(), bubble_delegate->GetAnchorRect().ToString());
}
@@ -510,8 +511,8 @@ TEST_F(BubbleDialogDelegateViewTest, StyledLabelTitle) {
// widget is shown or hidden respectively.
TEST_F(BubbleDialogDelegateViewTest, AttachedWidgetShowsInkDropWhenVisible) {
std::unique_ptr<Widget> anchor_widget = CreateTestWidget();
- LabelButton* button = new LabelButton(nullptr, base::string16());
- anchor_widget->SetContentsView(button);
+ LabelButton* button = anchor_widget->SetContentsView(
+ std::make_unique<LabelButton>(nullptr, base::string16()));
TestInkDrop* ink_drop = new TestInkDrop();
test::InkDropHostViewTestApi(button).SetInkDrop(base::WrapUnique(ink_drop));
TestBubbleDialogDelegateView* bubble_delegate =
@@ -525,11 +526,11 @@ TEST_F(BubbleDialogDelegateViewTest, AttachedWidgetShowsInkDropWhenVisible) {
// Explicitly calling OnWidgetVisibilityChanging to test functionality for
// OS_WIN. Outside of the test environment this happens automatically by way
// of HWNDMessageHandler.
- bubble_delegate->OnWidgetVisibilityChanging(bubble_widget, true);
+ bubble_delegate->OnBubbleWidgetVisibilityChanged(true);
EXPECT_EQ(InkDropState::ACTIVATED, ink_drop->GetTargetInkDropState());
bubble_widget->Close();
- bubble_delegate->OnWidgetVisibilityChanging(bubble_widget, false);
+ bubble_delegate->OnBubbleWidgetVisibilityChanged(false);
EXPECT_EQ(InkDropState::DEACTIVATED, ink_drop->GetTargetInkDropState());
}
@@ -538,8 +539,8 @@ TEST_F(BubbleDialogDelegateViewTest, AttachedWidgetShowsInkDropWhenVisible) {
// widget is shown.
TEST_F(BubbleDialogDelegateViewTest, VisibleWidgetShowsInkDropOnAttaching) {
std::unique_ptr<Widget> anchor_widget = CreateTestWidget();
- LabelButton* button = new LabelButton(nullptr, base::string16());
- anchor_widget->SetContentsView(button);
+ LabelButton* button = anchor_widget->SetContentsView(
+ std::make_unique<LabelButton>(nullptr, base::string16()));
TestInkDrop* ink_drop = new TestInkDrop();
test::InkDropHostViewTestApi(button).SetInkDrop(base::WrapUnique(ink_drop));
TestBubbleDialogDelegateView* bubble_delegate =
@@ -549,16 +550,16 @@ TEST_F(BubbleDialogDelegateViewTest, VisibleWidgetShowsInkDropOnAttaching) {
Widget* bubble_widget =
BubbleDialogDelegateView::CreateBubble(bubble_delegate);
bubble_widget->Show();
- // Explicitly calling OnWidgetVisibilityChanging to test functionality for
+ // Explicitly calling OnWidgetVisibilityChanged to test functionality for
// OS_WIN. Outside of the test environment this happens automatically by way
// of HWNDMessageHandler.
- bubble_delegate->OnWidgetVisibilityChanging(bubble_widget, true);
+ bubble_delegate->OnBubbleWidgetVisibilityChanged(true);
EXPECT_EQ(InkDropState::HIDDEN, ink_drop->GetTargetInkDropState());
bubble_delegate->SetHighlightedButton(button);
EXPECT_EQ(InkDropState::ACTIVATED, ink_drop->GetTargetInkDropState());
bubble_widget->Close();
- bubble_delegate->OnWidgetVisibilityChanging(bubble_widget, false);
+ bubble_delegate->OnBubbleWidgetVisibilityChanged(false);
EXPECT_EQ(InkDropState::DEACTIVATED, ink_drop->GetTargetInkDropState());
}
@@ -602,6 +603,50 @@ 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;
+
+ void SetUp() override {
+ WidgetTest::SetUp();
+ scoped_feature_list_.InitWithFeatures(
+ {features::kEnableMDRoundedCornersOnDialogs}, {});
+ }
+
+ private:
+ base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+TEST_F(BubbleDialogDelegateClientLayerTest, 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->set_parent_window(anchor_widget->GetNativeView());
+
+ WidgetAutoclosePtr bubble_widget(
+ BubbleDialogDelegateView::CreateBubble(bubble_delegate.release()));
+
+ EXPECT_NE(nullptr, bubble_widget->client_view()->layer());
+}
+
+TEST_F(BubbleDialogDelegateClientLayerTest, WithoutClientLayerTest) {
+ 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(false);
+ bubble_delegate->set_parent_window(anchor_widget->GetNativeView());
+
+ WidgetAutoclosePtr bubble_widget(
+ BubbleDialogDelegateView::CreateBubble(bubble_delegate.release()));
+
+ EXPECT_EQ(nullptr, bubble_widget->client_view()->layer());
+}
+
// Anchoring Tests -------------------------------------------------------------
namespace {
diff --git a/chromium/ui/views/bubble/bubble_frame_view.cc b/chromium/ui/views/bubble/bubble_frame_view.cc
index ea653f1fe22..7f94147a5ce 100644
--- a/chromium/ui/views/bubble/bubble_frame_view.cc
+++ b/chromium/ui/views/bubble/bubble_frame_view.cc
@@ -7,6 +7,7 @@
#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"
@@ -34,10 +35,12 @@
#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"
#include "ui/views/window/dialog_delegate.h"
+#include "ui/views/window/vector_icons/vector_icons.h"
namespace views {
@@ -98,6 +101,15 @@ BubbleFrameView::BubbleFrameView(const gfx::Insets& title_margins,
#endif
close_ = AddChildView(std::move(close));
+ auto minimize = CreateMinimizeButton(this);
+ minimize->SetVisible(false);
+#if defined(OS_WIN)
+ minimize->SetTooltipText(base::string16());
+ minimize->SetAccessibleName(
+ l10n_util::GetStringUTF16(IDS_APP_ACCNAME_MINIMIZE));
+#endif
+ minimize_ = AddChildView(std::move(minimize));
+
auto progress_indicator = std::make_unique<ProgressBar>(
kProgressIndicatorHeight, /*allow_round_corner=*/false);
progress_indicator->SetBackgroundColor(SK_ColorTRANSPARENT);
@@ -131,6 +143,21 @@ std::unique_ptr<Button> BubbleFrameView::CreateCloseButton(
return close_button;
}
+// static
+std::unique_ptr<Button> BubbleFrameView::CreateMinimizeButton(
+ ButtonListener* listener) {
+ auto minimize_button = CreateVectorImageButtonWithNativeTheme(
+ listener, kWindowControlMinimizeIcon);
+ minimize_button->SetTooltipText(
+ l10n_util::GetStringUTF16(IDS_APP_ACCNAME_MINIMIZE));
+ minimize_button->SizeToPreferredSize();
+ minimize_button->SetFocusForPlatform();
+
+ InstallCircleHighlightPathGenerator(minimize_button.get());
+
+ return minimize_button;
+}
+
gfx::Rect BubbleFrameView::GetBoundsForClientView() const {
// When NonClientView asks for this, the size of the frame view has been set
// (i.e. |this|), but not the client view bounds.
@@ -190,6 +217,8 @@ int BubbleFrameView::NonClientHitTest(const gfx::Point& point) {
return HTTRANSPARENT;
if (close_->GetVisible() && close_->GetMirroredBounds().Contains(point))
return HTCLOSE;
+ if (minimize_->GetVisible() && minimize_->GetMirroredBounds().Contains(point))
+ return HTMINBUTTON;
// Convert to RRectF to accurately represent the rounded corners of the
// dialog and allow events to pass through the shadows.
@@ -249,6 +278,7 @@ void BubbleFrameView::GetWindowMask(const gfx::Size& size,
void BubbleFrameView::ResetWindowControls() {
close_->SetVisible(GetWidget()->widget_delegate()->ShouldShowCloseButton());
+ minimize_->SetVisible(GetWidget()->widget_delegate()->CanMinimize());
}
void BubbleFrameView::UpdateWindowIcon() {
@@ -354,18 +384,23 @@ void BubbleFrameView::Layout() {
if (bounds.IsEmpty())
return;
+ // The buttons are positioned somewhat closer to the edge of the bubble.
+ const int close_margin =
+ LayoutProvider::Get()->GetDistanceMetric(DISTANCE_CLOSE_BUTTON_MARGIN);
+ const int button_y = contents_bounds.y() + close_margin;
+ int button_right = contents_bounds.right() - close_margin;
int title_label_right = bounds.right();
- if (close_->GetVisible()) {
- // The close button is positioned somewhat closer to the edge of the bubble.
- const int close_margin =
- LayoutProvider::Get()->GetDistanceMetric(DISTANCE_CLOSE_BUTTON_MARGIN);
- close_->SetPosition(
- gfx::Point(contents_bounds.right() - close_margin - close_->width(),
- contents_bounds.y() + close_margin));
- // Only reserve space if the close button extends over the header.
- if (close_->bounds().bottom() > header_bottom) {
+ for (Button* button : {close_, minimize_}) {
+ if (!button->GetVisible())
+ continue;
+ button->SetPosition(gfx::Point(button_right - button->width(), button_y));
+ button_right -= button->width();
+ button_right -= LayoutProvider::Get()->GetDistanceMetric(
+ DISTANCE_RELATED_BUTTON_HORIZONTAL);
+ // Only reserve space if the button extends over the header.
+ if (button->bounds().bottom() > header_bottom) {
title_label_right =
- std::min(title_label_right, close_->x() - close_margin);
+ std::min(title_label_right, button->x() - close_margin);
}
}
@@ -417,6 +452,7 @@ void BubbleFrameView::OnThemeChanged() {
if (bubble_border_ && bubble_border_->use_theme_background_color()) {
bubble_border_->set_background_color(GetNativeTheme()->GetSystemColor(
ui::NativeTheme::kColorId_DialogBackground));
+ UpdateClientViewBackground();
SchedulePaint();
}
}
@@ -464,6 +500,8 @@ void BubbleFrameView::ButtonPressed(Button* sender, const ui::Event& event) {
if (sender == close_) {
GetWidget()->CloseWithReason(Widget::ClosedReason::kCloseButtonClicked);
+ } else if (sender == minimize_) {
+ GetWidget()->Minimize();
}
}
@@ -519,6 +557,7 @@ void BubbleFrameView::SetArrow(BubbleBorder::Arrow arrow) {
void BubbleFrameView::SetBackgroundColor(SkColor color) {
bubble_border_->set_background_color(color);
+ UpdateClientViewBackground();
SchedulePaint();
}
@@ -526,6 +565,24 @@ SkColor BubbleFrameView::GetBackgroundColor() const {
return bubble_border_->background_color();
}
+void BubbleFrameView::UpdateClientViewBackground() {
+ if (!base::FeatureList::IsEnabled(features::kEnableMDRoundedCornersOnDialogs))
+ return;
+ DCHECK(GetWidget());
+ DCHECK(GetWidget()->client_view());
+
+ // If dealing with a layer backed ClientView we need to update it's color to
+ // match that of the frame view.
+ View* client_view = GetWidget()->client_view();
+ if (client_view->layer()) {
+ // If the ClientView's background is transparent this could result in visual
+ // artifacts. Make sure this isn't the case.
+ DCHECK_EQ(SK_AlphaOPAQUE, SkColorGetA(GetBackgroundColor()));
+ client_view->SetBackground(CreateSolidBackground(GetBackgroundColor()));
+ client_view->SchedulePaint();
+ }
+}
+
gfx::Rect BubbleFrameView::GetUpdatedWindowBounds(
const gfx::Rect& anchor_rect,
const BubbleBorder::Arrow delegate_arrow,
@@ -581,7 +638,7 @@ gfx::Rect BubbleFrameView::GetAvailableScreenBounds(
}
gfx::Rect BubbleFrameView::GetAvailableAnchorWindowBounds() const {
- views::BubbleDialogDelegateView* bubble_delegate_view =
+ views::BubbleDialogDelegate* bubble_delegate_view =
GetWidget()->widget_delegate()->AsBubbleDialogDelegate();
if (bubble_delegate_view) {
views::View* const anchor_view = bubble_delegate_view->GetAnchorView();
diff --git a/chromium/ui/views/bubble/bubble_frame_view.h b/chromium/ui/views/bubble/bubble_frame_view.h
index c841b131d53..8e71b915b65 100644
--- a/chromium/ui/views/bubble/bubble_frame_view.h
+++ b/chromium/ui/views/bubble/bubble_frame_view.h
@@ -44,6 +44,9 @@ class VIEWS_EXPORT BubbleFrameView : public NonClientFrameView,
// Creates a close button used in the corner of the dialog.
static std::unique_ptr<Button> CreateCloseButton(ButtonListener* listener);
+ // Creates a minimize button used in the corner of the dialog.
+ static std::unique_ptr<Button> CreateMinimizeButton(ButtonListener* listener);
+
// NonClientFrameView:
gfx::Rect GetBoundsForClientView() const override;
gfx::Rect GetWindowBoundsForClientBounds(
@@ -137,6 +140,12 @@ class VIEWS_EXPORT BubbleFrameView : public NonClientFrameView,
void SetBackgroundColor(SkColor color);
SkColor GetBackgroundColor() const;
+ // For masking reasons, the ClientView may be painted to a textured layer. To
+ // ensure bubbles that rely on the frame background color continue to work as
+ // expected, we must set the background of the ClientView to match that of the
+ // BubbleFrameView.
+ void UpdateClientViewBackground();
+
// Given the size of the contents and the rect to point at, returns the bounds
// of the bubble window. The bubble's arrow location may change if the bubble
// does not fit on the monitor or anchor window (if one exists) and
@@ -176,7 +185,10 @@ class VIEWS_EXPORT BubbleFrameView : public NonClientFrameView,
FRIEND_TEST_ALL_PREFIXES(BubbleFrameViewTest, RemoveFootnoteView);
FRIEND_TEST_ALL_PREFIXES(BubbleFrameViewTest, LayoutWithIcon);
FRIEND_TEST_ALL_PREFIXES(BubbleFrameViewTest, LayoutWithProgressIndicator);
- FRIEND_TEST_ALL_PREFIXES(BubbleFrameViewTest, IgnorePossiblyUnintendedClicks);
+ FRIEND_TEST_ALL_PREFIXES(BubbleFrameViewTest,
+ IgnorePossiblyUnintendedClicksClose);
+ FRIEND_TEST_ALL_PREFIXES(BubbleFrameViewTest,
+ IgnorePossiblyUnintendedClicksMinimize);
FRIEND_TEST_ALL_PREFIXES(BubbleDelegateTest, CloseReasons);
FRIEND_TEST_ALL_PREFIXES(BubbleDialogDelegateViewTest, CloseMethods);
FRIEND_TEST_ALL_PREFIXES(BubbleDialogDelegateViewTest, CreateDelegate);
@@ -243,6 +255,9 @@ class VIEWS_EXPORT BubbleFrameView : public NonClientFrameView,
// The optional close button (the X).
Button* close_ = nullptr;
+ // The optional minimize button.
+ Button* minimize_ = nullptr;
+
// The optional progress bar. Used to indicate bubble pending state. By
// default it is invisible.
ProgressBar* progress_indicator_ = nullptr;
diff --git a/chromium/ui/views/bubble/bubble_frame_view_unittest.cc b/chromium/ui/views/bubble/bubble_frame_view_unittest.cc
index 0f6ba1f261d..fc20bd38f0a 100644
--- a/chromium/ui/views/bubble/bubble_frame_view_unittest.cc
+++ b/chromium/ui/views/bubble/bubble_frame_view_unittest.cc
@@ -1237,10 +1237,11 @@ TEST_F(BubbleFrameViewTest, NoElideTitle) {
}
// Ensures that clicks are ignored for short time after view has been shown.
-TEST_F(BubbleFrameViewTest, IgnorePossiblyUnintendedClicks) {
+TEST_F(BubbleFrameViewTest, IgnorePossiblyUnintendedClicksClose) {
TestBubbleDialogDelegateView delegate;
TestAnchor anchor(CreateParams(Widget::InitParams::TYPE_WINDOW));
delegate.SetAnchorView(anchor.widget().GetContentsView());
+ delegate.SetShouldShowCloseButton(true);
Widget* bubble = BubbleDialogDelegateView::CreateBubble(&delegate);
bubble->Show();
@@ -1260,6 +1261,31 @@ TEST_F(BubbleFrameViewTest, IgnorePossiblyUnintendedClicks) {
EXPECT_TRUE(bubble->IsClosed());
}
+// Ensures that clicks are ignored for short time after view has been shown.
+TEST_F(BubbleFrameViewTest, IgnorePossiblyUnintendedClicksMinimize) {
+ TestBubbleDialogDelegateView delegate;
+ TestAnchor anchor(CreateParams(Widget::InitParams::TYPE_WINDOW));
+ delegate.SetAnchorView(anchor.widget().GetContentsView());
+ delegate.SetCanMinimize(true);
+ Widget* bubble = BubbleDialogDelegateView::CreateBubble(&delegate);
+ 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));
+ 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));
+ EXPECT_TRUE(bubble->IsMinimized());
+}
+
// Ensures that layout is correct when the progress indicator is visible.
TEST_F(BubbleFrameViewTest, LayoutWithProgressIndicator) {
TestBubbleDialogDelegateView delegate;
diff --git a/chromium/ui/views/controls/button/button.cc b/chromium/ui/views/controls/button/button.cc
index d74e05dc34c..5bb670ce30a 100644
--- a/chromium/ui/views/controls/button/button.cc
+++ b/chromium/ui/views/controls/button/button.cc
@@ -56,6 +56,7 @@ Button::WidgetObserverButtonBridge::WidgetObserverButtonBridge(Button* button)
Button::WidgetObserverButtonBridge::~WidgetObserverButtonBridge() {
if (owner_)
owner_->GetWidget()->RemoveObserver(this);
+ CHECK(!IsInObserverList());
}
void Button::WidgetObserverButtonBridge::OnWidgetPaintAsActiveChanged(
@@ -240,10 +241,12 @@ void Button::SetAnimationDuration(base::TimeDelta duration) {
}
void Button::SetInstallFocusRingOnFocus(bool install) {
- if (install)
+ if (focus_ring_ && !install) {
+ RemoveChildViewT(focus_ring_);
+ focus_ring_ = nullptr;
+ } else if (!focus_ring_ && install) {
focus_ring_ = FocusRing::Install(this);
- else
- focus_ring_.reset();
+ }
}
void Button::SetHotTracked(bool is_hot_tracked) {
diff --git a/chromium/ui/views/controls/button/button.h b/chromium/ui/views/controls/button/button.h
index 79bab1f6034..6411eb3514b 100644
--- a/chromium/ui/views/controls/button/button.h
+++ b/chromium/ui/views/controls/button/button.h
@@ -292,7 +292,7 @@ class VIEWS_EXPORT Button : public InkDropHostView,
return hover_animation_;
}
- FocusRing* focus_ring() { return focus_ring_.get(); }
+ FocusRing* focus_ring() { return focus_ring_; }
// The button's listener. Notified when clicked.
ButtonListener* listener_;
@@ -368,7 +368,7 @@ class VIEWS_EXPORT Button : public InkDropHostView,
SkColor ink_drop_base_color_;
// The focus ring for this Button.
- std::unique_ptr<FocusRing> focus_ring_;
+ FocusRing* focus_ring_ = nullptr;
std::unique_ptr<Painter> focus_painter_;
diff --git a/chromium/ui/views/controls/button/button_unittest.cc b/chromium/ui/views/controls/button/button_unittest.cc
index 3dfeba259fd..5850b215f25 100644
--- a/chromium/ui/views/controls/button/button_unittest.cc
+++ b/chromium/ui/views/controls/button/button_unittest.cc
@@ -35,6 +35,7 @@
#include "ui/views/controls/link.h"
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/style/platform_style.h"
+#include "ui/views/test/view_metadata_test_utils.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/widget/widget_utils.h"
@@ -178,15 +179,6 @@ TestInkDrop* AddTestInkDrop(TestButton* button) {
return ink_drop;
}
-// TODO(tluk): remove when the appropriate ownership APIs have been added for
-// Widget's SetContentsView().
-template <typename T>
-T* AddContentsView(Widget* widget, std::unique_ptr<T> view) {
- T* view_ptr = view.get();
- widget->SetContentsView(view.release());
- return view_ptr;
-}
-
} // namespace
class ButtonTest : public ViewsTestBase {
@@ -207,7 +199,7 @@ class ButtonTest : public ViewsTestBase {
widget_->Init(std::move(params));
widget_->Show();
- button_ = AddContentsView(widget(), std::make_unique<TestButton>(false));
+ button_ = widget()->SetContentsView(std::make_unique<TestButton>(false));
event_generator_ =
std::make_unique<ui::test::EventGenerator>(GetRootWindow(widget()));
@@ -225,24 +217,21 @@ class ButtonTest : public ViewsTestBase {
}
TestInkDrop* CreateButtonWithInkDrop(bool has_ink_drop_action_on_click) {
- button_ = AddContentsView(
- widget(), std::make_unique<TestButton>(has_ink_drop_action_on_click));
- widget_->SetContentsView(button_);
+ button_ = widget()->SetContentsView(
+ std::make_unique<TestButton>(has_ink_drop_action_on_click));
return AddTestInkDrop(button_);
}
void CreateButtonWithRealInkDrop() {
- button_ = AddContentsView(widget(), std::make_unique<TestButton>(false));
+ button_ = widget()->SetContentsView(std::make_unique<TestButton>(false));
InkDropHostViewTestApi(button_).SetInkDrop(
std::make_unique<InkDropImpl>(button_, button_->size()));
- widget_->SetContentsView(button_);
}
void CreateButtonWithObserver() {
- button_ = AddContentsView(widget(), std::make_unique<TestButton>(false));
+ button_ = widget()->SetContentsView(std::make_unique<TestButton>(false));
button_observer_ = std::make_unique<TestButtonObserver>();
button_->AddButtonObserver(button_observer_.get());
- widget_->SetContentsView(button_);
}
protected:
@@ -263,7 +252,12 @@ class ButtonTest : public ViewsTestBase {
DISALLOW_COPY_AND_ASSIGN(ButtonTest);
};
-// Tests that hover state changes correctly when visiblity/enableness changes.
+// Iterate through the metadata for Button to ensure it all works.
+TEST_F(ButtonTest, MetadataTest) {
+ test::TestViewMetadata(button());
+}
+
+// Tests that hover state changes correctly when visibility/enableness changes.
TEST_F(ButtonTest, HoverStateOnVisibilityChange) {
event_generator()->MoveMouseTo(button()->GetBoundsInScreen().CenterPoint());
event_generator()->PressLeftButton();
@@ -599,7 +593,7 @@ TEST_F(ButtonTest, InkDropAfterTryingToShowContextMenu) {
}
TEST_F(ButtonTest, HideInkDropHighlightWhenRemoved) {
- View* contents_view = AddContentsView(widget(), std::make_unique<View>());
+ View* contents_view = widget()->SetContentsView(std::make_unique<View>());
TestButton* button =
contents_view->AddChildView(std::make_unique<TestButton>(false));
@@ -779,7 +773,7 @@ class VisibilityTestButton : public TestButton {
// changed visibility states.
TEST_F(ButtonTest, NoLayerAddedForWidgetVisibilityChanges) {
VisibilityTestButton* button =
- AddContentsView(widget(), std::make_unique<VisibilityTestButton>());
+ widget()->SetContentsView(std::make_unique<VisibilityTestButton>());
// Ensure no layers are created during construction.
EXPECT_TRUE(button->GetVisible());
diff --git a/chromium/ui/views/controls/button/checkbox_unittest.cc b/chromium/ui/views/controls/button/checkbox_unittest.cc
index 3b3e5d83d76..a468b3d7212 100644
--- a/chromium/ui/views/controls/button/checkbox_unittest.cc
+++ b/chromium/ui/views/controls/button/checkbox_unittest.cc
@@ -32,8 +32,8 @@ class CheckboxTest : public ViewsTestBase {
widget_->Init(std::move(params));
widget_->Show();
- checkbox_ = new Checkbox(base::string16());
- widget_->SetContentsView(checkbox_);
+ checkbox_ =
+ widget_->SetContentsView(std::make_unique<Checkbox>(base::string16()));
}
void TearDown() override {
diff --git a/chromium/ui/views/controls/button/image_button_factory.cc b/chromium/ui/views/controls/button/image_button_factory.cc
index 5ac49262cfe..7d7d6a9a520 100644
--- a/chromium/ui/views/controls/button/image_button_factory.cc
+++ b/chromium/ui/views/controls/button/image_button_factory.cc
@@ -110,21 +110,11 @@ void SetImageFromVectorIconWithColor(ImageButton* button,
button->set_ink_drop_base_color(icon_color);
}
-void SetToggledImageFromVectorIcon(ToggleImageButton* button,
- const gfx::VectorIcon& icon,
- int dip_size,
- SkColor related_text_color) {
- const SkColor icon_color =
- color_utils::DeriveDefaultIconColor(related_text_color);
- SetToggledImageFromVectorIconWithColor(button, icon, dip_size, icon_color);
-}
-
void SetToggledImageFromVectorIconWithColor(ToggleImageButton* button,
const gfx::VectorIcon& icon,
int dip_size,
- SkColor icon_color) {
- const SkColor disabled_color =
- SkColorSetA(icon_color, gfx::kDisabledControlAlpha);
+ SkColor icon_color,
+ SkColor disabled_color) {
const gfx::ImageSkia normal_image =
gfx::CreateVectorIcon(icon, dip_size, icon_color);
const gfx::ImageSkia disabled_image =
diff --git a/chromium/ui/views/controls/button/image_button_factory.h b/chromium/ui/views/controls/button/image_button_factory.h
index 38d7c70ad52..de2d57501b2 100644
--- a/chromium/ui/views/controls/button/image_button_factory.h
+++ b/chromium/ui/views/controls/button/image_button_factory.h
@@ -32,8 +32,7 @@ VIEWS_EXPORT std::unique_ptr<ImageButton> CreateVectorImageButton(
ButtonListener* listener);
// Creates a ToggleImageButton with an ink drop and a centered image in
-// preperation for applying a vector icon from SetImageFromVectorIcon and
-// SetToggledImageFromVectorIcon below.
+// preparation for applying a vector icon from SetImageFromVectorIcon below.
VIEWS_EXPORT std::unique_ptr<ToggleImageButton> CreateVectorToggleImageButton(
ButtonListener* listener);
@@ -73,7 +72,8 @@ VIEWS_EXPORT void SetToggledImageFromVectorIconWithColor(
ToggleImageButton* button,
const gfx::VectorIcon& icon,
int dip_size,
- SkColor icon_color);
+ SkColor icon_color,
+ SkColor disabled_color);
} // namespace views
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 5b8a5e4aee6..2197b35a527 100644
--- a/chromium/ui/views/controls/button/image_button_factory_unittest.cc
+++ b/chromium/ui/views/controls/button/image_button_factory_unittest.cc
@@ -56,24 +56,22 @@ class ImageButtonFactoryWidgetTest : public ViewsTestBase {
}
void TearDown() override {
- button_.reset();
widget_.reset();
ViewsTestBase::TearDown();
}
ImageButton* AddImageButton(std::unique_ptr<ImageButton> button) {
- button_ = std::move(button);
- widget_->SetContentsView(button_.get());
- return button_.get();
+ button_ = widget_->SetContentsView(std::move(button));
+ return button_;
}
protected:
Widget* widget() { return widget_.get(); }
- ImageButton* button() { return button_.get(); }
+ ImageButton* button() { return button_; }
private:
std::unique_ptr<Widget> widget_;
- std::unique_ptr<ImageButton> button_;
+ ImageButton* button_ = nullptr; // owned by |widget_|.
DISALLOW_COPY_AND_ASSIGN(ImageButtonFactoryWidgetTest);
};
diff --git a/chromium/ui/views/controls/button/label_button.cc b/chromium/ui/views/controls/button/label_button.cc
index bb9105f1a18..3aef54f32cd 100644
--- a/chromium/ui/views/controls/button/label_button.cc
+++ b/chromium/ui/views/controls/button/label_button.cc
@@ -281,20 +281,21 @@ int LabelButton::GetHeightForWidth(int width) const {
}
void LabelButton::Layout() {
- gfx::Rect child_area = GetLocalBounds();
+ gfx::Rect image_area = GetLocalBounds();
- ink_drop_container_->SetBoundsRect(child_area);
- // The space that the label can use. Its actual bounds may be smaller if the
- // label is short.
- gfx::Rect label_area = child_area;
+ ink_drop_container_->SetBoundsRect(image_area);
gfx::Insets insets = GetInsets();
- child_area.Inset(insets);
- // Labels can paint over the vertical component of the border insets.
- label_area.Inset(insets.left(), 0, insets.right(), 0);
+ // If the button have a limited space to fit in, the image and the label
+ // may overlap with the border, which often times contains a lot of empty
+ // padding.
+ image_area.Inset(insets.left(), 0, insets.right(), 0);
+ // The space that the label can use. Labels truncate horizontally, so there
+ // is no need to allow the label to take up the complete horizontal space.
+ gfx::Rect label_area = image_area;
gfx::Size image_size = image_->GetPreferredSize();
- image_size.SetToMin(child_area.size());
+ image_size.SetToMin(image_area.size());
const auto horizontal_alignment = GetHorizontalAlignment();
if (!image_size.IsEmpty()) {
@@ -309,22 +310,28 @@ void LabelButton::Layout() {
std::min(label_area.width(), label_->GetPreferredSize().width()),
label_area.height());
- gfx::Point image_origin = child_area.origin();
+ gfx::Point image_origin = image_area.origin();
if (label_->GetMultiLine() && !image_centered_) {
- image_origin.Offset(
- 0, std::max(
- 0, (label_->font_list().GetHeight() - image_size.height()) / 2));
+ // This code assumes the text is vertically centered.
+ DCHECK_EQ(gfx::ALIGN_MIDDLE, label_->GetVerticalAlignment());
+ int label_height = label_->GetHeightForWidth(label_size.width());
+ int first_line_y =
+ label_area.y() + (label_area.height() - label_height) / 2;
+ int image_origin_y =
+ first_line_y +
+ (label_->font_list().GetHeight() - image_size.height()) / 2;
+ image_origin.Offset(0, std::max(0, image_origin_y));
} else {
- image_origin.Offset(0, (child_area.height() - image_size.height()) / 2);
+ image_origin.Offset(0, (image_area.height() - image_size.height()) / 2);
}
if (horizontal_alignment == gfx::ALIGN_CENTER) {
const int spacing = (image_size.width() > 0 && label_size.width() > 0)
? GetImageLabelSpacing()
: 0;
const int total_width = image_size.width() + label_size.width() + spacing;
- image_origin.Offset((child_area.width() - total_width) / 2, 0);
+ image_origin.Offset((image_area.width() - total_width) / 2, 0);
} else if (horizontal_alignment == gfx::ALIGN_RIGHT) {
- image_origin.Offset(child_area.width() - image_size.width(), 0);
+ image_origin.Offset(image_area.width() - image_size.width(), 0);
}
image_->SetBoundsRect(gfx::Rect(image_origin, image_size));
diff --git a/chromium/ui/views/controls/button/label_button_label_unittest.cc b/chromium/ui/views/controls/button/label_button_label_unittest.cc
index 505c2d5ed6c..8e880de4eaf 100644
--- a/chromium/ui/views/controls/button/label_button_label_unittest.cc
+++ b/chromium/ui/views/controls/button/label_button_label_unittest.cc
@@ -62,12 +62,22 @@ class LabelButtonLabelTest : public ViewsTestBase {
void SetUp() override {
ViewsTestBase::SetUp();
- label_ = std::make_unique<TestLabel>(&last_color_);
+
+ widget_ = CreateTestWidget();
+ label_ =
+ widget_->SetContentsView(std::make_unique<TestLabel>(&last_color_));
+ label_->SetAutoColorReadabilityEnabled(false);
+ }
+
+ void TearDown() override {
+ widget_.reset();
+ ViewsTestBase::TearDown();
}
protected:
- SkColor last_color_ = SK_ColorCYAN;
- std::unique_ptr<TestLabel> label_;
+ SkColor last_color_ = gfx::kPlaceholderColor;
+ std::unique_ptr<views::Widget> widget_;
+ TestLabel* label_;
TestNativeTheme theme1_;
TestNativeTheme theme2_;
@@ -77,16 +87,6 @@ class LabelButtonLabelTest : public ViewsTestBase {
// Test that LabelButtonLabel reacts properly to themed and overridden colors.
TEST_F(LabelButtonLabelTest, Colors) {
- // The OnDidSchedulePaint() override won't be called while the base
- // class is initialized. Not much we can do about that, so give it the first
- // for free.
- EXPECT_EQ(SK_ColorCYAN, last_color_); // Sanity check.
-
- // At the same time we can check that changing the auto color readability
- // schedules a paint. Currently it does. Although it technically doesn't need
- // to since the color isn't actually changing.
- label_->SetAutoColorReadabilityEnabled(false);
-
// First one comes from the default theme. This check ensures the SK_ColorRED
// placeholder initializers were replaced.
SkColor default_theme_enabled_color =
diff --git a/chromium/ui/views/controls/button/label_button_unittest.cc b/chromium/ui/views/controls/button/label_button_unittest.cc
index cd33dbe4c0a..38443891fff 100644
--- a/chromium/ui/views/controls/button/label_button_unittest.cc
+++ b/chromium/ui/views/controls/button/label_button_unittest.cc
@@ -627,8 +627,8 @@ TEST_F(LabelButtonTest, HighlightedButtonStyle) {
// Ensure the label resets the enabled color after LabelButton::OnThemeChanged()
// is invoked.
TEST_F(LabelButtonTest, OnThemeChanged) {
- ASSERT_NE(button_->GetNativeTheme()->GetHighContrastColorScheme(),
- ui::NativeTheme::HighContrastColorScheme::kDark);
+ ASSERT_NE(button_->GetNativeTheme()->GetPlatformHighContrastColorScheme(),
+ ui::NativeTheme::PlatformHighContrastColorScheme::kDark);
ASSERT_NE(button_->label()->GetBackgroundColor(), SK_ColorBLACK);
EXPECT_EQ(themed_normal_text_color_, button_->label()->GetEnabledColor());
@@ -667,6 +667,25 @@ TEST_F(LabelButtonTest, SetEnabledTextColorsResetsToThemeColors) {
EXPECT_EQ(TestNativeTheme::kSystemColor, button_->label()->GetEnabledColor());
}
+TEST_F(LabelButtonTest, ImageOrLabelGetClipped) {
+ const base::string16 text(ASCIIToUTF16("abc"));
+ button_->SetText(text);
+
+ const gfx::FontList font_list = button_->label()->font_list();
+ const int image_size = font_list.GetHeight();
+ button_->SetImage(Button::STATE_NORMAL,
+ CreateTestImage(image_size, image_size));
+
+ button_->SetBoundsRect(gfx::Rect(button_->GetPreferredSize()));
+ // The border size + the content height is more than button's preferred size.
+ button_->SetBorder(CreateEmptyBorder(image_size / 2, 0, image_size / 2, 0));
+ button_->Layout();
+
+ // Ensure that content (image and label) doesn't get clipped by the border.
+ EXPECT_GE(button_->image()->height(), image_size);
+ EXPECT_GE(button_->label()->height(), image_size);
+}
+
// Test fixture for a LabelButton that has an ink drop configured.
class InkDropLabelButtonTest : public ViewsTestBase {
public:
diff --git a/chromium/ui/views/controls/button/md_text_button.cc b/chromium/ui/views/controls/button/md_text_button.cc
index b9905fc6359..79c42e7b9ac 100644
--- a/chromium/ui/views/controls/button/md_text_button.cc
+++ b/chromium/ui/views/controls/button/md_text_button.cc
@@ -142,6 +142,11 @@ void MdTextButton::SetEnabledTextColors(base::Optional<SkColor> color) {
UpdateColors();
}
+void MdTextButton::SetCustomPadding(const gfx::Insets& padding) {
+ custom_padding_ = padding;
+ UpdatePadding();
+}
+
void MdTextButton::SetText(const base::string16& text) {
LabelButton::SetText(text);
UpdatePadding();
@@ -183,6 +188,11 @@ void MdTextButton::UpdatePadding() {
return;
}
+ SetBorder(
+ CreateEmptyBorder(custom_padding_.value_or(CalculateDefaultPadding())));
+}
+
+gfx::Insets MdTextButton::CalculateDefaultPadding() const {
// Text buttons default to 28dp in height on all platforms when the base font
// is in use, but should grow or shrink if the font size is adjusted up or
// down. When the system font size has been adjusted, the base font will be
@@ -213,8 +223,8 @@ void MdTextButton::UpdatePadding() {
// we apply the MD treatment to all buttons, even GTK buttons?
const int horizontal_padding = LayoutProvider::Get()->GetDistanceMetric(
DISTANCE_BUTTON_HORIZONTAL_PADDING);
- SetBorder(CreateEmptyBorder(top_padding, horizontal_padding, bottom_padding,
- horizontal_padding));
+ return gfx::Insets(top_padding, horizontal_padding, bottom_padding,
+ horizontal_padding);
}
void MdTextButton::UpdateColors() {
diff --git a/chromium/ui/views/controls/button/md_text_button.h b/chromium/ui/views/controls/button/md_text_button.h
index 760ab2a80ae..1d293a70166 100644
--- a/chromium/ui/views/controls/button/md_text_button.h
+++ b/chromium/ui/views/controls/button/md_text_button.h
@@ -39,6 +39,9 @@ class VIEWS_EXPORT MdTextButton : public LabelButton {
void SetCornerRadius(float radius);
float GetCornerRadius() const;
+ // See |custom_padding_|.
+ void SetCustomPadding(const gfx::Insets& padding);
+
// LabelButton:
void OnThemeChanged() override;
std::unique_ptr<views::InkDropHighlight> CreateInkDropHighlight()
@@ -59,6 +62,7 @@ class VIEWS_EXPORT MdTextButton : public LabelButton {
private:
void UpdatePadding();
void UpdateColors();
+ gfx::Insets CalculateDefaultPadding() const;
// True if this button uses prominent styling (blue fill, etc.).
bool is_prominent_ = false;
@@ -68,6 +72,9 @@ class VIEWS_EXPORT MdTextButton : public LabelButton {
float corner_radius_ = 0.0f;
+ // Used to override default padding.
+ base::Optional<gfx::Insets> custom_padding_;
+
DISALLOW_COPY_AND_ASSIGN(MdTextButton);
};
diff --git a/chromium/ui/views/controls/button/md_text_button_unittest.cc b/chromium/ui/views/controls/button/md_text_button_unittest.cc
new file mode 100644
index 00000000000..5fe5d9c1bf1
--- /dev/null
+++ b/chromium/ui/views/controls/button/md_text_button_unittest.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/views/controls/button/md_text_button.h"
+
+#include "ui/views/test/views_test_base.h"
+
+namespace views {
+
+using MdTextButtonTest = ViewsTestBase;
+
+TEST_F(MdTextButtonTest, CustomPadding) {
+ const base::string16 text = base::ASCIIToUTF16("abc");
+ std::unique_ptr<MdTextButton> button =
+ MdTextButton::Create(nullptr, text, views::style::CONTEXT_BUTTON_MD);
+
+ const gfx::Insets custom_padding(10, 20);
+ ASSERT_NE(button->GetInsets(), custom_padding);
+
+ button->SetCustomPadding(custom_padding);
+ EXPECT_EQ(button->GetInsets(), custom_padding);
+}
+
+} // namespace views
diff --git a/chromium/ui/views/controls/button/radio_button_unittest.cc b/chromium/ui/views/controls/button/radio_button_unittest.cc
index 3d25994df2a..8d22480097e 100644
--- a/chromium/ui/views/controls/button/radio_button_unittest.cc
+++ b/chromium/ui/views/controls/button/radio_button_unittest.cc
@@ -34,8 +34,7 @@ class RadioButtonTest : public ViewsTestBase {
widget_->Init(std::move(params));
widget_->Show();
- button_container_ = new View();
- widget_->SetContentsView(button_container_);
+ button_container_ = widget_->SetContentsView(std::make_unique<View>());
}
void TearDown() override {
diff --git a/chromium/ui/views/controls/combobox/combobox.cc b/chromium/ui/views/controls/combobox/combobox.cc
index b0364bcdb3e..72903d758de 100644
--- a/chromium/ui/views/controls/combobox/combobox.cc
+++ b/chromium/ui/views/controls/combobox/combobox.cc
@@ -17,12 +17,14 @@
#include "ui/base/ime/input_method.h"
#include "ui/base/models/image_model.h"
#include "ui/base/models/menu_model.h"
+#include "ui/base/ui_base_types.h"
#include "ui/events/event.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/scoped_canvas.h"
#include "ui/gfx/text_utils.h"
#include "ui/native_theme/native_theme.h"
+#include "ui/native_theme/themed_vector_icon.h"
#include "ui/views/animation/flood_fill_ink_drop_ripple.h"
#include "ui/views/animation/ink_drop_impl.h"
#include "ui/views/background.h"
@@ -54,6 +56,15 @@ SkColor GetTextColorForEnableState(const Combobox& combobox, bool enabled) {
return style::GetColor(combobox, style::CONTEXT_TEXTFIELD, style);
}
+gfx::ImageSkia GetImageSkiaFromImageModel(const ui::ImageModel* model,
+ const ui::NativeTheme* native_theme) {
+ DCHECK(model);
+ DCHECK(!model->IsEmpty());
+ return model->IsImage() ? model->GetImage().AsImageSkia()
+ : ui::ThemedVectorIcon(model->GetVectorIcon())
+ .GetImageSkia(native_theme);
+}
+
// The transparent button which holds a button state but is not rendered.
class TransparentButton : public Button {
public:
@@ -132,7 +143,13 @@ class Combobox::ComboboxMenuModel : public ui::MenuModel {
}
// Overridden from MenuModel:
- bool HasIcons() const override { return false; }
+ bool HasIcons() const override {
+ for (int i = 0; i < GetItemCount(); ++i) {
+ if (!GetIconAt(i).IsEmpty())
+ return true;
+ }
+ return false;
+ }
int GetItemCount() const override { return model_->GetItemCount(); }
@@ -155,7 +172,13 @@ class Combobox::ComboboxMenuModel : public ui::MenuModel {
base::string16 GetLabelAt(int index) const override {
// Inserting the Unicode formatting characters if necessary so that the
// text is displayed correctly in right-to-left UIs.
- base::string16 text = model_->GetItemAt(index);
+ base::string16 text = model_->GetDropDownTextAt(index);
+ base::i18n::AdjustStringForLocaleDirection(&text);
+ return text;
+ }
+
+ base::string16 GetSecondaryLabelAt(int index) const override {
+ base::string16 text = model_->GetDropDownSecondaryTextAt(index);
base::i18n::AdjustStringForLocaleDirection(&text);
return text;
}
@@ -178,7 +201,7 @@ class Combobox::ComboboxMenuModel : public ui::MenuModel {
int GetGroupIdAt(int index) const override { return -1; }
ui::ImageModel GetIconAt(int index) const override {
- return ui::ImageModel();
+ return model_->GetDropDownIconAt(index);
}
ui::ButtonMenuItemModel* GetButtonMenuItemAt(int index) const override {
@@ -443,7 +466,7 @@ bool Combobox::OnKeyPressed(const ui::KeyEvent& e) {
void Combobox::OnPaint(gfx::Canvas* canvas) {
OnPaintBackground(canvas);
- PaintText(canvas);
+ PaintIconAndText(canvas);
OnPaintBorder(canvas);
}
@@ -504,16 +527,8 @@ void Combobox::ButtonPressed(Button* sender, const ui::Event& event) {
// TODO(hajimehoshi): Fix the problem that the arrow button blinks when
// cliking this while the dropdown menu is opened.
- const base::TimeDelta delta = base::TimeTicks::Now() - closed_time_;
- if (delta <= kMinimumTimeBetweenButtonClicks)
- return;
-
- ui::MenuSourceType source_type = ui::MENU_SOURCE_MOUSE;
- if (event.IsKeyEvent())
- source_type = ui::MENU_SOURCE_KEYBOARD;
- else if (event.IsGestureEvent() || event.IsTouchEvent())
- source_type = ui::MENU_SOURCE_TOUCH;
- ShowDropDownMenu(source_type);
+ if ((base::TimeTicks::Now() - closed_time_) > kMinimumTimeBetweenButtonClicks)
+ ShowDropDownMenu(ui::GetMenuSourceTypeForEvent(event));
}
void Combobox::OnComboboxModelChanged(ui::ComboboxModel* model) {
@@ -543,7 +558,7 @@ void Combobox::AdjustBoundsForRTLUI(gfx::Rect* rect) const {
rect->set_x(GetMirroredXForRect(*rect));
}
-void Combobox::PaintText(gfx::Canvas* canvas) {
+void Combobox::PaintIconAndText(gfx::Canvas* canvas) {
gfx::Insets insets = GetInsets();
insets += gfx::Insets(0, LayoutProvider::Get()->GetDistanceMetric(
DISTANCE_TEXTFIELD_HORIZONTAL_TEXT_PADDING));
@@ -553,7 +568,20 @@ void Combobox::PaintText(gfx::Canvas* canvas) {
int x = insets.left();
int y = insets.top();
- int text_height = height() - insets.height();
+ int contents_height = height() - insets.height();
+
+ // Draw the icon.
+ ui::ImageModel icon = model()->GetIconAt(selected_index_);
+ if (!icon.IsEmpty()) {
+ gfx::ImageSkia icon_skia =
+ GetImageSkiaFromImageModel(&icon, GetNativeTheme());
+ int icon_y = y + (contents_height - icon_skia.height()) / 2;
+ canvas->DrawImageInt(icon_skia, x, icon_y);
+ x += icon_skia.width() + LayoutProvider::Get()->GetDistanceMetric(
+ DISTANCE_RELATED_LABEL_HORIZONTAL);
+ }
+
+ // Draw the text.
SkColor text_color = GetTextColorForEnableState(*this, GetEnabled());
DCHECK_GE(selected_index_, 0);
DCHECK_LT(selected_index_, model()->GetItemCount());
@@ -565,10 +593,10 @@ void Combobox::PaintText(gfx::Canvas* canvas) {
const gfx::FontList& font_list = GetFontList();
int text_width = gfx::GetStringWidth(text, font_list);
- if ((text_width + insets.width()) > disclosure_arrow_offset)
- text_width = disclosure_arrow_offset - insets.width();
+ text_width =
+ std::min(text_width, disclosure_arrow_offset - insets.right() - x);
- gfx::Rect text_bounds(x, y, text_width, text_height);
+ gfx::Rect text_bounds(x, y, text_width, contents_height);
AdjustBoundsForRTLUI(&text_bounds);
canvas->DrawStringRect(text, font_list, text_color, text_bounds);
@@ -581,21 +609,15 @@ void Combobox::PaintText(gfx::Canvas* canvas) {
}
void Combobox::ShowDropDownMenu(ui::MenuSourceType source_type) {
- // Menu border widths.
- constexpr int kMenuBorderWidthLeft = 1;
constexpr int kMenuBorderWidthTop = 1;
- constexpr int kMenuBorderWidthRight = 1;
-
+ // Menu's requested position's width should be the same as local bounds so the
+ // border of the menu lines up with the border of the combobox. The y
+ // coordinate however should be shifted to the bottom with the border with not
+ // to overlap with the combobox border.
gfx::Rect lb = GetLocalBounds();
gfx::Point menu_position(lb.origin());
-
- // Inset the menu's requested position so the border of the menu lines up
- // with the border of the combobox.
- menu_position.set_x(menu_position.x() + kMenuBorderWidthLeft);
menu_position.set_y(menu_position.y() + kMenuBorderWidthTop);
- lb.set_width(lb.width() - (kMenuBorderWidthLeft + kMenuBorderWidthRight));
-
View::ConvertPointToScreen(this, &menu_position);
gfx::Rect bounds(menu_position, lb.size());
@@ -633,18 +655,27 @@ void Combobox::OnPerformAction() {
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) {
if (model_->IsItemSeparatorAt(i))
continue;
if (size_to_largest_label_ || i == selected_index_) {
- width = std::max(
- width, gfx::GetStringWidth(menu_model_->GetLabelAt(i), font_list));
+ int item_width = gfx::GetStringWidth(model()->GetItemAt(i), font_list);
+ ui::ImageModel icon = model()->GetIconAt(i);
+ if (!icon.IsEmpty()) {
+ gfx::ImageSkia icon_skia =
+ GetImageSkiaFromImageModel(&icon, GetNativeTheme());
+ item_width +=
+ icon_skia.width() + LayoutProvider::Get()->GetDistanceMetric(
+ DISTANCE_RELATED_LABEL_HORIZONTAL);
+ height = std::max(height, icon_skia.height());
+ }
+ width = std::max(width, item_width);
}
}
- return gfx::Size(width, font_list.GetHeight());
+ return gfx::Size(width, height);
}
PrefixSelector* Combobox::GetPrefixSelector() {
diff --git a/chromium/ui/views/controls/combobox/combobox.h b/chromium/ui/views/controls/combobox/combobox.h
index d6da07f7122..91ad60c9a14 100644
--- a/chromium/ui/views/controls/combobox/combobox.h
+++ b/chromium/ui/views/controls/combobox/combobox.h
@@ -126,7 +126,7 @@ class VIEWS_EXPORT Combobox : public View,
void AdjustBoundsForRTLUI(gfx::Rect* rect) const;
// Draws the selected value of the drop down list
- void PaintText(gfx::Canvas* canvas);
+ void PaintIconAndText(gfx::Canvas* canvas);
// Show the drop down list
void ShowDropDownMenu(ui::MenuSourceType source_type);
@@ -207,7 +207,7 @@ class VIEWS_EXPORT Combobox : public View,
bool size_to_largest_label_;
// The focus ring for this Combobox.
- std::unique_ptr<FocusRing> focus_ring_;
+ FocusRing* focus_ring_ = nullptr;
ScopedObserver<ui::ComboboxModel, ui::ComboboxModelObserver> observer_{this};
diff --git a/chromium/ui/views/controls/combobox/combobox_unittest.cc b/chromium/ui/views/controls/combobox/combobox_unittest.cc
index 9f0698b0d0e..b081a0b7408 100644
--- a/chromium/ui/views/controls/combobox/combobox_unittest.cc
+++ b/chromium/ui/views/controls/combobox/combobox_unittest.cc
@@ -30,7 +30,9 @@
#include "ui/views/controls/combobox/combobox_listener.h"
#include "ui/views/style/platform_style.h"
#include "ui/views/test/combobox_test_api.h"
+#include "ui/views/test/view_metadata_test_utils.h"
#include "ui/views/test/views_test_base.h"
+#include "ui/views/widget/unique_widget_ptr.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_utils.h"
@@ -42,36 +44,7 @@ using test::ComboboxTestApi;
namespace {
-// A wrapper of Combobox to intercept the result of OnKeyPressed() and
-// OnKeyReleased() methods.
-class TestCombobox : public Combobox {
- public:
- explicit TestCombobox(ui::ComboboxModel* model)
- : Combobox(model), key_handled_(false), key_received_(false) {}
-
- bool OnKeyPressed(const ui::KeyEvent& e) override {
- key_received_ = true;
- key_handled_ = Combobox::OnKeyPressed(e);
- return key_handled_;
- }
-
- bool OnKeyReleased(const ui::KeyEvent& e) override {
- key_received_ = true;
- key_handled_ = Combobox::OnKeyReleased(e);
- return key_handled_;
- }
-
- bool key_handled() const { return key_handled_; }
- bool key_received() const { return key_received_; }
-
- void clear() { key_received_ = key_handled_ = false; }
-
- private:
- bool key_handled_;
- bool key_received_;
-
- DISALLOW_COPY_AND_ASSIGN(TestCombobox);
-};
+using TestCombobox = Combobox;
// A concrete class is needed to test the combobox.
class TestComboboxModel : public ui::ComboboxModel {
@@ -83,14 +56,14 @@ class TestComboboxModel : public ui::ComboboxModel {
// ui::ComboboxModel:
int GetItemCount() const override { return item_count_; }
- base::string16 GetItemAt(int index) override {
+ base::string16 GetItemAt(int index) const override {
if (IsItemSeparatorAt(index)) {
NOTREACHED();
return ASCIIToUTF16("SEPARATOR");
}
return ASCIIToUTF16(index % 2 == 0 ? "PEANUT BUTTER" : "JELLY");
}
- bool IsItemSeparatorAt(int index) override {
+ bool IsItemSeparatorAt(int index) const override {
return separators_.find(index) != separators_.end();
}
@@ -147,10 +120,10 @@ class VectorComboboxModel : public ui::ComboboxModel {
int GetItemCount() const override {
return static_cast<int>(values_->size());
}
- base::string16 GetItemAt(int index) override {
+ base::string16 GetItemAt(int index) const override {
return ASCIIToUTF16(values_->at(index));
}
- bool IsItemSeparatorAt(int index) override { return false; }
+ bool IsItemSeparatorAt(int index) const override { return false; }
int GetDefaultIndex() const override { return default_index_; }
void AddObserver(ui::ComboboxModelObserver* observer) override {
observers_.AddObserver(observer);
@@ -222,8 +195,7 @@ class ComboboxTest : public ViewsTestBase {
ComboboxTest() = default;
void TearDown() override {
- if (widget_)
- widget_->Close();
+ widget_.reset();
ViewsTestBase::TearDown();
}
@@ -234,26 +206,25 @@ class ComboboxTest : public ViewsTestBase {
model_->SetSeparators(*separators);
ASSERT_FALSE(combobox_);
- combobox_ = new TestCombobox(model_.get());
- test_api_ = std::make_unique<ComboboxTestApi>(combobox_);
+ auto combobox = std::make_unique<TestCombobox>(model_.get());
+ test_api_ = std::make_unique<ComboboxTestApi>(combobox.get());
test_api_->InstallTestMenuRunner(&menu_show_count_);
- combobox_->SetID(1);
+ combobox->SetID(1);
- widget_ = new Widget;
+ widget_ = std::make_unique<Widget>();
Widget::InitParams params =
CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
params.bounds = gfx::Rect(200, 200, 200, 200);
widget_->Init(std::move(params));
- View* container = new View();
- widget_->SetContentsView(container);
- container->AddChildView(combobox_);
+ View* container = widget_->SetContentsView(std::make_unique<View>());
+ combobox_ = container->AddChildView(std::move(combobox));
widget_->Show();
combobox_->RequestFocus();
combobox_->SizeToPreferredSize();
- event_generator_ =
- std::make_unique<ui::test::EventGenerator>(GetRootWindow(widget_));
+ event_generator_ = std::make_unique<ui::test::EventGenerator>(
+ GetRootWindow(widget_.get()));
event_generator_->set_target(ui::test::EventGenerator::Target::WINDOW);
}
@@ -291,7 +262,7 @@ class ComboboxTest : public ViewsTestBase {
}
// We need widget to populate wrapper class.
- Widget* widget_ = nullptr;
+ UniqueWidgetPtr widget_;
// |combobox_| will be allocated InitCombobox() and then owned by |widget_|.
TestCombobox* combobox_ = nullptr;
@@ -356,23 +327,28 @@ TEST_F(ComboboxTest, KeyTestMac) {
}
#endif
+// Iterate through all the metadata and test each property.
+TEST_F(ComboboxTest, MetadataTest) {
+ InitCombobox(nullptr);
+ test::TestViewMetadata(combobox_);
+}
+
// Check that if a combobox is disabled before it has a native wrapper, then the
// native wrapper inherits the disabled state when it gets created.
TEST_F(ComboboxTest, DisabilityTest) {
model_ = std::make_unique<TestComboboxModel>();
ASSERT_FALSE(combobox_);
- combobox_ = new TestCombobox(model_.get());
- combobox_->SetEnabled(false);
+ auto combobox = std::make_unique<TestCombobox>(model_.get());
+ combobox->SetEnabled(false);
- widget_ = new Widget;
+ widget_ = std::make_unique<Widget>();
Widget::InitParams params =
CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
params.bounds = gfx::Rect(100, 100, 100, 100);
widget_->Init(std::move(params));
- View* container = new View();
- widget_->SetContentsView(container);
- container->AddChildView(combobox_);
+ View* container = widget_->SetContentsView(std::make_unique<View>());
+ combobox_ = container->AddChildView(std::move(combobox));
EXPECT_FALSE(combobox_->GetEnabled());
}
@@ -559,7 +535,7 @@ TEST_F(ComboboxTest, ListenerHandlesDelete) {
// |combobox| will be deleted on change.
TestCombobox* combobox = new TestCombobox(&model);
- std::unique_ptr<EvilListener> evil_listener(new EvilListener());
+ auto evil_listener = std::make_unique<EvilListener>();
combobox->set_listener(evil_listener.get());
ASSERT_NO_FATAL_FAILURE(ComboboxTestApi(combobox).PerformActionAt(2));
EXPECT_TRUE(evil_listener->deleted());
diff --git a/chromium/ui/views/controls/editable_combobox/editable_combobox.cc b/chromium/ui/views/controls/editable_combobox/editable_combobox.cc
index 5f76ed0db20..b4c14a33505 100644
--- a/chromium/ui/views/controls/editable_combobox/editable_combobox.cc
+++ b/chromium/ui/views/controls/editable_combobox/editable_combobox.cc
@@ -37,7 +37,6 @@
#include "ui/gfx/range/range.h"
#include "ui/gfx/render_text.h"
#include "ui/gfx/scoped_canvas.h"
-#include "ui/native_theme/native_theme.h"
#include "ui/views/animation/flood_fill_ink_drop_ripple.h"
#include "ui/views/animation/ink_drop.h"
#include "ui/views/animation/ink_drop_host_view.h"
@@ -65,8 +64,7 @@ namespace {
class Arrow : public Button {
public:
- Arrow(const SkColor color, ButtonListener* listener)
- : Button(listener), color_(color) {
+ explicit Arrow(ButtonListener* listener) : Button(listener) {
// Similar to Combobox's TransparentButton.
SetFocusBehavior(FocusBehavior::NEVER);
button_controller()->set_notify_action(
@@ -93,8 +91,7 @@ class Arrow : public Button {
std::unique_ptr<InkDropRipple> CreateInkDropRipple() const override {
return std::make_unique<views::FloodFillInkDropRipple>(
size(), GetInkDropCenterBasedOnLastEvent(),
- GetNativeTheme()->GetSystemColor(
- ui::NativeTheme::kColorId_LabelEnabledColor),
+ style::GetColor(*this, style::CONTEXT_TEXTFIELD, style::STYLE_PRIMARY),
ink_drop_visible_opacity());
}
@@ -104,7 +101,11 @@ class Arrow : public Button {
canvas->ClipRect(GetContentsBounds());
gfx::Rect arrow_bounds = GetLocalBounds();
arrow_bounds.ClampToCenteredSize(ComboboxArrowSize());
- PaintComboboxArrow(color_, arrow_bounds, canvas);
+ // Make sure the arrow use the same color as the text in the combobox.
+ PaintComboboxArrow(style::GetColor(*this, style::CONTEXT_TEXTFIELD,
+ GetEnabled() ? style::STYLE_PRIMARY
+ : style::STYLE_DISABLED),
+ arrow_bounds, canvas);
}
void GetAccessibleNodeData(ui::AXNodeData* node_data) override {
@@ -115,8 +116,6 @@ class Arrow : public Button {
node_data->SetDefaultActionVerb(ax::mojom::DefaultActionVerb::kOpen);
}
- const SkColor color_;
-
DISALLOW_COPY_AND_ASSIGN(Arrow);
};
@@ -176,15 +175,10 @@ class EditableCombobox::EditableComboboxMenuModel
gfx::RenderText::kPasswordReplacementChar);
}
- //////////////////////////////////////////////////////////////////////////////
- // Overridden from ComboboxModelObserver:
void OnComboboxModelChanged(ui::ComboboxModel* model) override {
UpdateItemsShown();
}
- //////////////////////////////////////////////////////////////////////////////
- // Overridden from MenuModel:
-
int GetItemCount() const override { return items_shown_.size(); }
private:
@@ -309,8 +303,6 @@ class EditableCombobox::EditableComboboxPreTargetHandler
DISALLOW_COPY_AND_ASSIGN(EditableComboboxPreTargetHandler);
};
-////////////////////////////////////////////////////////////////////////////////
-// EditableCombobox, public, non-overridden methods:
EditableCombobox::EditableCombobox(
std::unique_ptr<ui::ComboboxModel> combobox_model,
const bool filter_on_edit,
@@ -341,8 +333,7 @@ EditableCombobox::EditableCombobox(
textfield_->SetExtraInsets(gfx::Insets(
/*top=*/0, /*left=*/0, /*bottom=*/0,
/*right=*/kComboboxArrowContainerWidth - kComboboxArrowPaddingWidth));
- arrow_ = new Arrow(textfield_->GetTextColor(), this);
- AddChildView(arrow_);
+ arrow_ = AddChildView(std::make_unique<Arrow>(this));
}
SetLayoutManager(std::make_unique<views::FillLayout>());
}
@@ -399,9 +390,6 @@ base::string16 EditableCombobox::GetItemForTest(int index) {
return menu_model_->GetItemTextAt(index, showing_password_text_);
}
-////////////////////////////////////////////////////////////////////////////////
-// EditableCombobox, View overrides:
-
void EditableCombobox::Layout() {
View::Layout();
if (arrow_) {
@@ -411,11 +399,6 @@ void EditableCombobox::Layout() {
}
}
-void EditableCombobox::OnThemeChanged() {
- View::OnThemeChanged();
- textfield_->OnThemeChanged();
-}
-
void EditableCombobox::GetAccessibleNodeData(ui::AXNodeData* node_data) {
node_data->role = ax::mojom::Role::kComboBoxGrouping;
@@ -435,9 +418,6 @@ void EditableCombobox::OnVisibleBoundsChanged() {
CloseMenu();
}
-////////////////////////////////////////////////////////////////////////////////
-// EditableCombobox, TextfieldController overrides:
-
void EditableCombobox::ContentsChanged(Textfield* sender,
const base::string16& new_contents) {
HandleNewContent(new_contents);
@@ -455,32 +435,25 @@ bool EditableCombobox::HandleKeyEvent(Textfield* sender,
return false;
}
-////////////////////////////////////////////////////////////////////////////////
-// EditableCombobox, View overrides:
-
void EditableCombobox::OnViewBlurred(View* observed_view) {
CloseMenu();
}
-////////////////////////////////////////////////////////////////////////////////
-// EditableCombobox, ButtonListener overrides:
-
void EditableCombobox::ButtonPressed(Button* sender, const ui::Event& event) {
textfield_->RequestFocus();
- if (menu_runner_ && menu_runner_->IsRunning()) {
+ if (menu_runner_ && menu_runner_->IsRunning())
CloseMenu();
- return;
- }
- ui::MenuSourceType source_type = ui::MENU_SOURCE_MOUSE;
- if (event.IsKeyEvent())
- source_type = ui::MENU_SOURCE_KEYBOARD;
- else if (event.IsGestureEvent() || event.IsTouchEvent())
- source_type = ui::MENU_SOURCE_TOUCH;
- ShowDropDownMenu(source_type);
+ else
+ ShowDropDownMenu(ui::GetMenuSourceTypeForEvent(event));
}
-////////////////////////////////////////////////////////////////////////////////
-// EditableCombobox, Private methods:
+void EditableCombobox::OnLayoutIsAnimatingChanged(
+ views::AnimatingLayoutManager* source,
+ bool is_animating) {
+ dropdown_blocked_for_animation_ = is_animating;
+ if (dropdown_blocked_for_animation_)
+ CloseMenu();
+}
void EditableCombobox::CloseMenu() {
menu_runner_.reset();
@@ -517,9 +490,10 @@ void EditableCombobox::HandleNewContent(const base::string16& new_content) {
}
void EditableCombobox::ShowDropDownMenu(ui::MenuSourceType source_type) {
- constexpr int kMenuBorderWidthLeft = 1;
constexpr int kMenuBorderWidthTop = 1;
- constexpr int kMenuBorderWidthRight = 1;
+
+ if (dropdown_blocked_for_animation_)
+ return;
if (!menu_model_->GetItemCount()) {
CloseMenu();
@@ -540,13 +514,13 @@ void EditableCombobox::ShowDropDownMenu(ui::MenuSourceType source_type) {
this, GetWidget()->GetRootView());
gfx::Rect local_bounds = textfield_->GetLocalBounds();
+
+ // Menu's requested position's width should be the same as local bounds so the
+ // border of the menu lines up with the border of the combobox. The y
+ // coordinate however should be shifted to the bottom with the border width
+ // not to overlap with the combobox border.
gfx::Point menu_position(local_bounds.origin());
- // Inset the menu's requested position so the border of the menu lines up
- // with the border of the textfield.
- menu_position.set_x(menu_position.x() + kMenuBorderWidthLeft);
menu_position.set_y(menu_position.y() + kMenuBorderWidthTop);
- local_bounds.set_width(local_bounds.width() -
- (kMenuBorderWidthLeft + kMenuBorderWidthRight));
View::ConvertPointToScreen(this, &menu_position);
gfx::Rect bounds(menu_position, local_bounds.size());
diff --git a/chromium/ui/views/controls/editable_combobox/editable_combobox.h b/chromium/ui/views/controls/editable_combobox/editable_combobox.h
index c0f6b26fad8..e4a0d3c3698 100644
--- a/chromium/ui/views/controls/editable_combobox/editable_combobox.h
+++ b/chromium/ui/views/controls/editable_combobox/editable_combobox.h
@@ -14,6 +14,7 @@
#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"
#include "ui/views/view.h"
#include "ui/views/view_observer.h"
@@ -37,10 +38,12 @@ class MenuRunner;
class Textfield;
// Textfield that also shows a drop-down list with suggestions.
-class VIEWS_EXPORT EditableCombobox : public View,
- public TextfieldController,
- public ViewObserver,
- public ButtonListener {
+class VIEWS_EXPORT EditableCombobox
+ : public View,
+ public TextfieldController,
+ public ViewObserver,
+ public ButtonListener,
+ public views::AnimatingLayoutManager::Observer {
public:
METADATA_HEADER(EditableCombobox);
@@ -121,7 +124,6 @@ class VIEWS_EXPORT EditableCombobox : public View,
// Overridden from View:
void Layout() override;
- void OnThemeChanged() override;
void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
void RequestFocus() override;
bool GetNeedsNotificationWhenVisibleBoundsChange() const override;
@@ -139,6 +141,10 @@ class VIEWS_EXPORT EditableCombobox : public View,
// 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;
+
Textfield* textfield_;
Button* arrow_ = nullptr;
std::unique_ptr<ui::ComboboxModel> combobox_model_;
@@ -171,6 +177,8 @@ class VIEWS_EXPORT EditableCombobox : public View,
// Type::kPassword.
bool showing_password_text_;
+ bool dropdown_blocked_for_animation_ = false;
+
ScopedObserver<View, ViewObserver> observer_{this};
DISALLOW_COPY_AND_ASSIGN(EditableCombobox);
diff --git a/chromium/ui/views/controls/focus_ring.cc b/chromium/ui/views/controls/focus_ring.cc
index 443c199003c..0ee9512f5c3 100644
--- a/chromium/ui/views/controls/focus_ring.cc
+++ b/chromium/ui/views/controls/focus_ring.cc
@@ -8,6 +8,8 @@
#include <utility>
#include "base/memory/ptr_util.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"
@@ -53,15 +55,15 @@ SkPath GetHighlightPathInternal(const View* view) {
} // namespace
// static
-std::unique_ptr<FocusRing> FocusRing::Install(View* parent) {
+FocusRing* FocusRing::Install(View* parent) {
auto ring = base::WrapUnique<FocusRing>(new FocusRing());
- ring->set_owned_by_client();
- parent->AddChildView(ring.get());
ring->InvalidateLayout();
ring->SchedulePaint();
- return ring;
+ return parent->AddChildView(std::move(ring));
}
+FocusRing::~FocusRing() = default;
+
void FocusRing::SetPathGenerator(
std::unique_ptr<HighlightPathGenerator> generator) {
path_generator_ = std::move(generator);
@@ -102,14 +104,14 @@ void FocusRing::ViewHierarchyChanged(
if (details.is_add) {
// Need to start observing the parent.
- details.parent->AddObserver(this);
- } else {
+ view_observer_.Add(details.parent);
+ RefreshLayer();
+ } else if (view_observer_.IsObserving(details.parent)) {
// This view is being removed from its parent. It needs to remove itself
- // from its parent's observer list. Otherwise, since its |parent_| will
- // become a nullptr, it won't be able to do so in its destructor.
- details.parent->RemoveObserver(this);
+ // from its parent's observer list in the case where the FocusView is
+ // removed from its parent but not deleted.
+ view_observer_.Remove(details.parent);
}
- RefreshLayer();
}
void FocusRing::OnPaint(gfx::Canvas* canvas) {
@@ -155,6 +157,12 @@ void FocusRing::OnPaint(gfx::Canvas* canvas) {
}
}
+void FocusRing::GetAccessibleNodeData(ui::AXNodeData* node_data) {
+ // Mark the focus ring in the accessibility tree as invisible so that it will
+ // not be accessed by assistive technologies.
+ node_data->AddState(ax::mojom::State::kInvisible);
+}
+
void FocusRing::OnViewFocused(View* view) {
RefreshLayer();
}
@@ -168,11 +176,6 @@ FocusRing::FocusRing() {
set_can_process_events_within_subtree(false);
}
-FocusRing::~FocusRing() {
- if (parent())
- parent()->RemoveObserver(this);
-}
-
void FocusRing::RefreshLayer() {
// TODO(pbos): This always keeps the layer alive if |has_focus_predicate_| is
// set. This is done because we're not notified when the predicate might
diff --git a/chromium/ui/views/controls/focus_ring.h b/chromium/ui/views/controls/focus_ring.h
index 9ac2f4ebeeb..c3e42b6a4da 100644
--- a/chromium/ui/views/controls/focus_ring.h
+++ b/chromium/ui/views/controls/focus_ring.h
@@ -19,38 +19,25 @@ namespace views {
class HighlightPathGenerator;
// FocusRing is a View that is designed to act as an indicator of focus for its
-// parent. It is a stand-alone view that paints to a layer which extends beyond
-// the bounds of its parent view.
-//
-// Using FocusRing looks something like this:
-//
-// class MyView : public View {
-// ...
-// private:
-// std::unique_ptr<FocusRing> focus_ring_;
-// };
-//
-// MyView::MyView() {
-// focus_ring_ = FocusRing::Install(this);
-// ...
-// }
-//
+// parent. It is a view that paints to a layer which extends beyond the bounds
+// of its parent view.
// If MyView should show a rounded rectangular focus ring when it has focus and
// hide the ring when it loses focus, no other configuration is necessary. In
// other cases, it might be necessary to use the Set*() functions on FocusRing;
// these take care of repainting it when the state changes.
+// TODO(tluk): FocusRing should not be a view but instead a new concept which
+// only participates in view painting ( https://crbug.com/840796 ).
class VIEWS_EXPORT FocusRing : public View, public ViewObserver {
public:
METADATA_HEADER(FocusRing);
using ViewPredicate = std::function<bool(View* view)>;
- ~FocusRing() override;
-
// Create a FocusRing and adds it to |parent|. The returned focus ring is
- // owned by the client (the code calling FocusRing::Install), *not* by
- // |parent|.
- static std::unique_ptr<FocusRing> Install(View* parent);
+ // owned by the |parent|.
+ static FocusRing* Install(View* parent);
+
+ ~FocusRing() override;
// Sets the HighlightPathGenerator to draw this FocusRing around.
// Note: This method should only be used if the focus ring needs to differ
@@ -77,6 +64,7 @@ class VIEWS_EXPORT FocusRing : public View, public ViewObserver {
void ViewHierarchyChanged(
const ViewHierarchyChangedDetails& details) override;
void OnPaint(gfx::Canvas* canvas) override;
+ void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
// ViewObserver:
void OnViewFocused(View* view) override;
@@ -108,6 +96,8 @@ class VIEWS_EXPORT FocusRing : public View, public ViewObserver {
// The predicate used to determine whether the parent has focus.
base::Optional<ViewPredicate> has_focus_predicate_;
+ ScopedObserver<View, ViewObserver> view_observer_{this};
+
DISALLOW_COPY_AND_ASSIGN(FocusRing);
};
diff --git a/chromium/ui/views/controls/label.cc b/chromium/ui/views/controls/label.cc
index ad6af149e28..febce15ff86 100644
--- a/chromium/ui/views/controls/label.cc
+++ b/chromium/ui/views/controls/label.cc
@@ -108,6 +108,19 @@ int Label::GetTextContext() const {
return text_context_;
}
+int Label::GetTextStyle() const {
+ return text_style_;
+}
+
+void Label::SetTextStyle(int style) {
+ if (style == text_style_)
+ return;
+
+ text_style_ = style;
+ UpdateColorsFromTheme();
+ OnPropertyChanged(&text_style_, kPropertyEffectsPreferredSizeChanged);
+}
+
bool Label::GetAutoColorReadabilityEnabled() const {
return auto_color_readability_enabled_;
}
@@ -291,6 +304,14 @@ void Label::SetAllowCharacterBreak(bool allow_character_break) {
kPropertyEffectsLayout);
}
+size_t Label::GetTextIndexOfLine(size_t line) const {
+ return full_text_->GetTextIndexOfLine(line);
+}
+
+void Label::SetTruncateLength(size_t truncate_length) {
+ return full_text_->set_truncate_length(truncate_length);
+}
+
gfx::ElideBehavior Label::GetElideBehavior() const {
return elide_behavior_;
}
@@ -950,7 +971,6 @@ void Label::Init(const base::string16& text,
full_text_->SetCursorEnabled(false);
full_text_->SetWordWrapBehavior(gfx::TRUNCATE_LONG_WORDS);
- UpdateColorsFromTheme();
SetText(text);
// Only selectable labels will get requests to show the context menu, due to
@@ -1102,8 +1122,9 @@ void Label::BuildContextMenuContents() {
BEGIN_METADATA(Label)
METADATA_PARENT_CLASS(View)
-ADD_PROPERTY_METADATA(Label, bool, AutoColorReadabilityEnabled)
ADD_PROPERTY_METADATA(Label, base::string16, Text)
+ADD_PROPERTY_METADATA(Label, int, TextStyle)
+ADD_PROPERTY_METADATA(Label, bool, AutoColorReadabilityEnabled)
ADD_PROPERTY_METADATA(Label, SkColor, EnabledColor)
ADD_PROPERTY_METADATA(Label, gfx::ElideBehavior, ElideBehavior)
ADD_PROPERTY_METADATA(Label, SkColor, BackgroundColor)
diff --git a/chromium/ui/views/controls/label.h b/chromium/ui/views/controls/label.h
index dc690b22dc2..5a45ef3cbf0 100644
--- a/chromium/ui/views/controls/label.h
+++ b/chromium/ui/views/controls/label.h
@@ -91,6 +91,11 @@ class VIEWS_EXPORT Label : public View,
// a value from views::style::TextContext or an enum that extends it.
int GetTextContext() const;
+ // The style of the label. This is a value from views::style::TextStyle or an
+ // enum that extends it.
+ int GetTextStyle() const;
+ void SetTextStyle(int style);
+
// Enables or disables auto-color-readability (enabled by default). If this
// is enabled, then calls to set any foreground or background color will
// trigger an automatic mapper that uses color_utils::BlendForMinContrast()
@@ -177,6 +182,13 @@ class VIEWS_EXPORT Label : public View,
bool GetAllowCharacterBreak() const;
void SetAllowCharacterBreak(bool allow_character_break);
+ // For the provided line index, gets the corresponding rendered line and
+ // returns the text position of the first character of that line.
+ size_t GetTextIndexOfLine(size_t line) const;
+
+ // Set the truncate length of the rendered text.
+ void SetTruncateLength(size_t truncate_length);
+
// Gets/Sets the eliding or fading behavior, applied as necessary. The default
// is to elide at the end. Eliding is not well-supported for multi-line
// labels.
@@ -377,7 +389,7 @@ class VIEWS_EXPORT Label : public View,
void BuildContextMenuContents();
const int text_context_;
- const int text_style_;
+ int text_style_;
// An un-elided and single-line RenderText object used for preferred sizing.
std::unique_ptr<gfx::RenderText> full_text_;
diff --git a/chromium/ui/views/controls/label_unittest.cc b/chromium/ui/views/controls/label_unittest.cc
index 763a169b27e..33d969862cc 100644
--- a/chromium/ui/views/controls/label_unittest.cc
+++ b/chromium/ui/views/controls/label_unittest.cc
@@ -291,6 +291,11 @@ TEST_F(LabelTest, TextProperty) {
EXPECT_EQ(test_text, label()->GetText());
}
+TEST_F(LabelTest, TextStyleProperty) {
+ label()->SetTextStyle(views::style::STYLE_DISABLED);
+ EXPECT_EQ(views::style::STYLE_DISABLED, label()->GetTextStyle());
+}
+
TEST_F(LabelTest, ColorProperty) {
SkColor color = SkColorSetARGB(20, 40, 10, 5);
label()->SetAutoColorReadabilityEnabled(false);
diff --git a/chromium/ui/views/controls/menu/menu_controller.cc b/chromium/ui/views/controls/menu/menu_controller.cc
index d9938916a53..87f9291b67d 100644
--- a/chromium/ui/views/controls/menu/menu_controller.cc
+++ b/chromium/ui/views/controls/menu/menu_controller.cc
@@ -621,6 +621,11 @@ bool MenuController::IsContextMenu() const {
return state_.context_menu;
}
+void MenuController::SelectItemAndOpenSubmenu(MenuItemView* item) {
+ DCHECK(item);
+ SetSelection(item, SELECTION_OPEN_SUBMENU | SELECTION_UPDATE_IMMEDIATELY);
+}
+
bool MenuController::OnMousePressed(SubmenuView* source,
const ui::MouseEvent& event) {
// We should either have no current_mouse_event_target_, or should have a
@@ -1379,6 +1384,11 @@ void MenuController::SetSelection(MenuItemView* menu_item,
menu_item->GetType() != MenuItemView::Type::kSubMenu ||
(menu_item->GetType() == MenuItemView::Type::kActionableSubMenu &&
(selection_types & SELECTION_OPEN_SUBMENU) == 0))) {
+ // Before firing the selection event, ensure that focus appears to be
+ // within the popup. This is helpful for ATs on some platforms,
+ // specifically on Windows, where selection events in a list are mapped
+ // to focus events. Without this call, the focus appears to be elsewhere.
+ menu_item->GetViewAccessibility().SetPopupFocusOverride();
menu_item->NotifyAccessibilityEvent(ax::mojom::Event::kSelection, true);
// Notify an accessibility selected children changed event on the parent
// submenu.
@@ -1635,6 +1645,7 @@ MenuController::~MenuController() {
active_instance_ = nullptr;
StopShowTimer();
StopCancelAllTimer();
+ CHECK(!IsInObserverList());
}
bool MenuController::SendAcceleratorToHotTrackedView() {
@@ -3104,20 +3115,18 @@ void MenuController::SetNextHotTrackedView(
}
void MenuController::SetHotTrackedButton(Button* hot_button) {
- if (hot_button == hot_button_) {
- // Hot-tracked state may change outside of the MenuController. Correct it.
- if (hot_button && !hot_button->IsHotTracked()) {
- hot_button->SetHotTracked(true);
- hot_button->NotifyAccessibilityEvent(ax::mojom::Event::kSelection, true);
- }
- return;
- }
- if (hot_button_)
+ // If we're providing a new hot-tracked button, first remove the existing one.
+ if (hot_button_ && hot_button_ != hot_button) {
hot_button_->SetHotTracked(false);
+ hot_button_->GetViewAccessibility().EndPopupFocusOverride();
+ }
+
+ // Then set the new one.
hot_button_ = hot_button;
- if (hot_button) {
- hot_button->SetHotTracked(true);
- hot_button->NotifyAccessibilityEvent(ax::mojom::Event::kSelection, true);
+ if (hot_button_ && !hot_button_->IsHotTracked()) {
+ hot_button_->GetViewAccessibility().SetPopupFocusOverride();
+ hot_button_->SetHotTracked(true);
+ hot_button_->NotifyAccessibilityEvent(ax::mojom::Event::kSelection, true);
}
}
diff --git a/chromium/ui/views/controls/menu/menu_controller.h b/chromium/ui/views/controls/menu/menu_controller.h
index 5fab7290f4b..2b3625c5b5a 100644
--- a/chromium/ui/views/controls/menu/menu_controller.h
+++ b/chromium/ui/views/controls/menu/menu_controller.h
@@ -125,7 +125,15 @@ class VIEWS_EXPORT MenuController
// WARNING: this may be NULL.
Widget* owner() { return owner_; }
- // Get the anchor position which is used to show this menu.
+ // Gets the most-current selected menu item, if any, including if the
+ // selection has not been committed yet.
+ views::MenuItemView* GetSelectedMenuItem() { return pending_state_.item; }
+
+ // Selects a menu-item and opens its sub-menu (if one exists) if not already
+ // so. Clears any selections within the submenu if it is already open.
+ void SelectItemAndOpenSubmenu(MenuItemView* item);
+
+ // Gets the anchor position which is used to show this menu.
MenuAnchorPosition GetAnchorPosition() { return state_.anchor; }
// Cancels the current Run. See ExitType for a description of what happens
diff --git a/chromium/ui/views/controls/menu/menu_controller_unittest.cc b/chromium/ui/views/controls/menu/menu_controller_unittest.cc
index 3176d01e445..67168197f0a 100644
--- a/chromium/ui/views/controls/menu/menu_controller_unittest.cc
+++ b/chromium/ui/views/controls/menu/menu_controller_unittest.cc
@@ -1125,6 +1125,27 @@ TEST_F(MenuControllerTest, PreviousSelectedItem) {
ResetSelection();
}
+// Tests that the APIs related to the current selected item work correctly.
+TEST_F(MenuControllerTest, CurrentSelectedItem) {
+ SetPendingStateItem(menu_item()->GetSubmenu()->GetMenuItemAt(0));
+ EXPECT_EQ(1, pending_state_item()->GetCommand());
+
+ // Select the first menu-item.
+ DispatchKey(ui::VKEY_HOME);
+ EXPECT_EQ(pending_state_item(), menu_controller()->GetSelectedMenuItem());
+
+ // The API should let the submenu stay open if already so, but clear any
+ // selections within it.
+ EXPECT_TRUE(IsShowing());
+ EXPECT_EQ(1, pending_state_item()->GetCommand());
+ menu_controller()->SelectItemAndOpenSubmenu(menu_item());
+ EXPECT_TRUE(IsShowing());
+ EXPECT_EQ(0, pending_state_item()->GetCommand());
+
+ // Clear references in menu controller to the menu item that is going away.
+ ResetSelection();
+}
+
// Tests that opening menu and calling SelectByChar works correctly.
TEST_F(MenuControllerTest, SelectByChar) {
SetComboboxType(MenuController::ComboboxType::kReadonly);
diff --git a/chromium/ui/views/controls/menu/menu_delegate.h b/chromium/ui/views/controls/menu/menu_delegate.h
index 2a03ff43f4a..158724b4752 100644
--- a/chromium/ui/views/controls/menu/menu_delegate.h
+++ b/chromium/ui/views/controls/menu/menu_delegate.h
@@ -8,7 +8,6 @@
#include <set>
#include <string>
-#include "base/logging.h"
#include "base/strings/string16.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/base/dragdrop/drag_drop_types.h"
diff --git a/chromium/ui/views/controls/menu/menu_host.cc b/chromium/ui/views/controls/menu/menu_host.cc
index 0b9230bda55..fc94bfc7f17 100644
--- a/chromium/ui/views/controls/menu/menu_host.cc
+++ b/chromium/ui/views/controls/menu/menu_host.cc
@@ -103,6 +103,7 @@ MenuHost::MenuHost(SubmenuView* submenu)
MenuHost::~MenuHost() {
if (owner_)
owner_->RemoveObserver(this);
+ CHECK(!IsInObserverList());
}
void MenuHost::InitMenuHost(Widget* parent,
diff --git a/chromium/ui/views/controls/menu/menu_item_view.cc b/chromium/ui/views/controls/menu/menu_item_view.cc
index d00618f37c3..262ea70539a 100644
--- a/chromium/ui/views/controls/menu/menu_item_view.cc
+++ b/chromium/ui/views/controls/menu/menu_item_view.cc
@@ -10,6 +10,7 @@
#include <algorithm>
#include <memory>
#include <numeric>
+#include <utility>
#include "base/containers/adapters.h"
#include "base/i18n/case_conversion.h"
@@ -45,12 +46,48 @@
#include "ui/views/style/typography.h"
#include "ui/views/vector_icons.h"
#include "ui/views/view_class_properties.h"
+#include "ui/views/views_features.h"
#include "ui/views/widget/widget.h"
namespace views {
namespace {
+// Difference in the font size (in pixels) between menu label font and "new"
+// badge font size.
+constexpr int kNewBadgeFontSizeAdjustment = -1;
+
+// Space between primary text and "new" badge.
+constexpr int kNewBadgeHorizontalMargin = 8;
+
+// Highlight size around "new" badge.
+constexpr gfx::Insets kNewBadgeInternalPadding{4};
+
+// The corner radius of the rounded rect for the "new" badge.
+constexpr int kNewBadgeCornerRadius = 3;
+static_assert(kNewBadgeCornerRadius <= kNewBadgeInternalPadding.left(),
+ "New badge corner radius should not exceed padding.");
+
+// 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 =
+ primary_font.DeriveWithSizeDelta(kNewBadgeFontSizeAdjustment);
+ return gfx::GetStringWidth(new_text, badge_font) +
+ kNewBadgeInternalPadding.width() + 2 * 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, kNewBadgeInternalPadding));
+ return badge_rect;
+}
+
// EmptyMenuMenuItem ---------------------------------------------------------
// EmptyMenuMenuItem is used when a menu has no menu items. EmptyMenuMenuItem
@@ -261,6 +298,7 @@ MenuItemView* MenuItemView::AddMenuItemAt(
int index,
int item_id,
const base::string16& label,
+ const base::string16& secondary_label,
const base::string16& minor_text,
const ui::ThemedVectorIcon& minor_icon,
const gfx::ImageSkia& icon,
@@ -282,6 +320,7 @@ MenuItemView* MenuItemView::AddMenuItemAt(
item->SetTitle(GetDelegate()->GetLabel(item_id));
else
item->SetTitle(label);
+ item->SetSecondaryTitle(secondary_label);
item->SetMinorText(minor_text);
item->SetMinorIcon(minor_icon);
if (!vector_icon.empty()) {
@@ -337,6 +376,7 @@ void MenuItemView::AppendSeparator() {
void MenuItemView::AddSeparatorAt(int index) {
AddMenuItemAt(index, /*item_id=*/0, /*label=*/base::string16(),
+ /*secondary_label=*/base::string16(),
/*minor_text=*/base::string16(),
/*minor_icon=*/ui::ThemedVectorIcon(),
/*icon=*/gfx::ImageSkia(),
@@ -351,8 +391,8 @@ MenuItemView* MenuItemView::AppendMenuItemImpl(int item_id,
Type type) {
const int index = submenu_ ? int{submenu_->children().size()} : 0;
return AddMenuItemAt(index, item_id, label, base::string16(),
- ui::ThemedVectorIcon(), icon, ui::ThemedVectorIcon(),
- type, ui::NORMAL_SEPARATOR);
+ base::string16(), ui::ThemedVectorIcon(), icon,
+ ui::ThemedVectorIcon(), type, ui::NORMAL_SEPARATOR);
}
SubmenuView* MenuItemView::CreateSubmenu() {
@@ -383,6 +423,11 @@ void MenuItemView::SetTitle(const base::string16& title) {
invalidate_dimensions(); // Triggers preferred size recalculation.
}
+void MenuItemView::SetSecondaryTitle(const base::string16& secondary_title) {
+ secondary_title_ = secondary_title;
+ invalidate_dimensions(); // Triggers preferred size recalculation.
+}
+
void MenuItemView::SetMinorText(const base::string16& minor_text) {
minor_text_ = minor_text;
invalidate_dimensions(); // Triggers preferred size recalculation.
@@ -438,19 +483,16 @@ void MenuItemView::SetIcon(const gfx::ImageSkia& icon) {
void MenuItemView::SetIcon(const ui::ThemedVectorIcon& icon) {
vector_icon_ = icon;
+ UpdateIconViewFromVectorIconAndTheme();
}
void MenuItemView::UpdateIconViewFromVectorIconAndTheme() {
if (vector_icon_.empty())
return;
- if (!icon_view_)
- SetIconView(std::make_unique<ImageView>());
-
- const bool use_touchable_layout =
- GetMenuController() && GetMenuController()->use_touchable_layout();
- const int icon_size = use_touchable_layout ? 20 : 16;
- icon_view_->SetImage(vector_icon_.GetImageSkia(GetNativeTheme(), icon_size));
+ auto icon_view = std::make_unique<ImageView>();
+ icon_view->SetImage(vector_icon_.GetImageSkia(GetNativeTheme()));
+ SetIconView(std::move(icon_view));
}
void MenuItemView::SetIconView(std::unique_ptr<ImageView> icon_view) {
@@ -740,14 +782,17 @@ void MenuItemView::UpdateMenuPartSizes() {
icon_area_width_;
int padding = 0;
if (config.always_use_icon_to_label_padding) {
- padding = config.item_horizontal_padding;
+ padding = LayoutProvider::Get()->GetDistanceMetric(
+ DISTANCE_RELATED_LABEL_HORIZONTAL);
} else if (!config.icons_in_label) {
padding = (has_icons_ || HasChecksOrRadioButtons())
- ? config.item_horizontal_padding
+ ? LayoutProvider::Get()->GetDistanceMetric(
+ DISTANCE_RELATED_LABEL_HORIZONTAL)
: 0;
}
if (use_touchable_layout)
- padding = config.touchable_item_horizontal_padding;
+ padding = LayoutProvider::Get()->GetDistanceMetric(
+ DISTANCE_RELATED_LABEL_HORIZONTAL);
label_start_ += padding;
@@ -904,17 +949,22 @@ void MenuItemView::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) {
// selected.
PaintBackground(canvas, mode, render_selection);
- const int top_margin = GetTopMargin();
- const int bottom_margin = GetBottomMargin();
- const int available_height = height() - top_margin - bottom_margin;
-
// Calculate some colors.
MenuDelegate::LabelStyle style;
- style.foreground = GetTextColor(false, render_selection);
+ style.foreground = GetTextColor(/*minor=*/false, render_selection);
GetLabelStyle(&style);
SkColor icon_color = color_utils::DeriveDefaultIconColor(style.foreground);
+ // Calculate the margins.
+ int top_margin = GetTopMargin();
+ const int bottom_margin = GetBottomMargin();
+ const int available_height = height() - top_margin - bottom_margin;
+ const int text_height = style.font_list.GetHeight();
+ const int total_text_height =
+ secondary_title().empty() ? text_height : text_height * 2;
+ top_margin += (available_height - total_text_height) / 2;
+
// Render the check.
if (type_ == Type::kCheckbox && delegate->IsItemChecked(GetCommand())) {
radio_check_image_view_->SetImage(GetMenuCheckImage(icon_color));
@@ -937,15 +987,33 @@ void MenuItemView::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) {
(!delegate || delegate->ShouldReserveSpaceForSubmenuIndicator()
? item_right_margin_
: config.arrow_to_edge_padding);
- gfx::Rect text_bounds(label_start, top_margin, width, available_height);
+ gfx::Rect text_bounds(label_start, top_margin, width, text_height);
text_bounds.set_x(GetMirroredXForRect(text_bounds));
int flags = GetDrawStringFlags();
if (mode == PaintButtonMode::kForDrag)
flags |= gfx::Canvas::NO_SUBPIXEL_RENDERING;
canvas->DrawStringRectWithFlags(title(), style.font_list, style.foreground,
text_bounds, flags);
+
+ // The rest should be drawn with the minor foreground color.
+ style.foreground = GetTextColor(/*minor=*/true, render_selection);
+ if (!secondary_title().empty()) {
+ text_bounds.set_y(text_bounds.y() + text_height);
+ canvas->DrawStringRectWithFlags(secondary_title(), style.font_list,
+ style.foreground, text_bounds, flags);
+ }
+
PaintMinorIconAndText(canvas, style);
+ if (ShouldShowNewBadge()) {
+ DrawNewBadge(
+ canvas,
+ gfx::Point(label_start + gfx::GetStringWidth(title(), style.font_list) +
+ kNewBadgeHorizontalMargin,
+ top_margin),
+ style.font_list, flags);
+ }
+
// Set the submenu indicator (arrow) image and color.
if (HasSubmenu())
submenu_arrow_image_view_->SetImage(GetSubmenuArrowImage(icon_color));
@@ -1198,12 +1266,19 @@ MenuItemView::MenuItemDimensions MenuItemView::CalculateDimensions() const {
dimensions.standard_width = string_width + label_start + item_right_margin_;
// Determine the length of the right-side text.
dimensions.minor_text_width =
- minor_text.empty() ? 0 : gfx::GetStringWidth(minor_text, style.font_list);
+ (minor_text.empty() ? 0
+ : gfx::GetStringWidth(minor_text, style.font_list));
+
+ if (ShouldShowNewBadge())
+ dimensions.minor_text_width += GetNewBadgeRequiredWidth(style.font_list);
// Determine the height to use.
+ int label_text_height = secondary_title().empty()
+ ? style.font_list.GetHeight()
+ : style.font_list.GetHeight() * 2;
dimensions.height =
- std::max(dimensions.height, style.font_list.GetHeight() +
- GetBottomMargin() + GetTopMargin());
+ std::max(dimensions.height,
+ label_text_height + GetBottomMargin() + GetTopMargin());
dimensions.height =
std::max(dimensions.height, MenuConfig::instance().item_min_height);
@@ -1246,12 +1321,48 @@ int MenuItemView::GetLabelStartForThisItem() const {
if ((config.icons_in_label || type_ == Type::kCheckbox ||
type_ == Type::kRadio) &&
icon_view_) {
- label_start += icon_view_->size().width() + config.item_horizontal_padding;
+ label_start +=
+ icon_view_->size().width() + LayoutProvider::Get()->GetDistanceMetric(
+ DISTANCE_RELATED_LABEL_HORIZONTAL);
}
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 =
+ primary_font.DeriveWithSizeDelta(kNewBadgeFontSizeAdjustment);
+ 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(
+ kNewBadgeInternalPadding.left(),
+ 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),
+ 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.
@@ -1329,6 +1440,12 @@ bool MenuItemView::HasChecksOrRadioButtons() const {
[](const auto* item) { return item->HasChecksOrRadioButtons(); });
}
+bool MenuItemView::ShouldShowNewBadge() const {
+ static const bool feature_enabled =
+ base::FeatureList::IsEnabled(features::kEnableNewBadgeOnMenuItems);
+ return feature_enabled && is_new_;
+}
+
BEGIN_METADATA(MenuItemView)
METADATA_PARENT_CLASS(View)
END_METADATA()
diff --git a/chromium/ui/views/controls/menu/menu_item_view.h b/chromium/ui/views/controls/menu/menu_item_view.h
index b38a048c22e..01b797549ac 100644
--- a/chromium/ui/views/controls/menu/menu_item_view.h
+++ b/chromium/ui/views/controls/menu/menu_item_view.h
@@ -5,11 +5,11 @@
#ifndef UI_VIEWS_CONTROLS_MENU_MENU_ITEM_VIEW_H_
#define UI_VIEWS_CONTROLS_MENU_MENU_ITEM_VIEW_H_
+#include <memory>
#include <string>
#include <vector>
#include "base/compiler_specific.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
@@ -148,6 +148,7 @@ class VIEWS_EXPORT MenuItemView : public View {
MenuItemView* AddMenuItemAt(int index,
int item_id,
const base::string16& label,
+ const base::string16& secondary_label,
const base::string16& minor_text,
const ui::ThemedVectorIcon& minor_icon,
const gfx::ImageSkia& icon,
@@ -214,6 +215,11 @@ class VIEWS_EXPORT MenuItemView : public View {
void SetTitle(const base::string16& title);
const base::string16& title() const { return title_; }
+ // Sets/Gets the secondary title. When not empty, they are shown in the line
+ // below the title.
+ void SetSecondaryTitle(const base::string16& secondary_title);
+ const base::string16& secondary_title() const { return secondary_title_; }
+
// Sets the minor text.
void SetMinorText(const base::string16& minor_text);
@@ -264,6 +270,9 @@ class VIEWS_EXPORT MenuItemView : public View {
// Returns the command id of this item.
int GetCommand() const { return command_; }
+ void set_is_new(bool is_new) { is_new_ = is_new; }
+ bool is_new() const { return is_new_; }
+
// Paints the menu item.
void OnPaint(gfx::Canvas* canvas) override;
@@ -444,6 +453,13 @@ 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_; }
@@ -475,6 +491,10 @@ class VIEWS_EXPORT MenuItemView : public View {
// Returns true if the menu has items with a checkbox or a radio button.
bool HasChecksOrRadioButtons() const;
+ // Returns whether or not a "new" badge should be shown on this menu item.
+ // Takes into account whether the badging feature is enabled.
+ bool ShouldShowNewBadge() const;
+
void invalidate_dimensions() { dimensions_.height = 0; }
bool is_dimensions_valid() const { return dimensions_.height > 0; }
@@ -505,16 +525,16 @@ class VIEWS_EXPORT MenuItemView : public View {
// Command id.
int command_ = 0;
+ // Whether the menu item should be badged as "New" (if badging is enabled) as
+ // a way to highlight a new feature for users.
+ bool is_new_ = false;
+
// Submenu, created via CreateSubmenu.
SubmenuView* submenu_ = nullptr;
- // Title.
base::string16 title_;
-
- // Minor text.
+ base::string16 secondary_title_;
base::string16 minor_text_;
-
- // Minor icon.
ui::ThemedVectorIcon minor_icon_;
// The icon used for |icon_view_| when a vector icon has been set instead of a
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 119aa4a49c3..9c132d932b8 100644
--- a/chromium/ui/views/controls/menu/menu_item_view_unittest.cc
+++ b/chromium/ui/views/controls/menu/menu_item_view_unittest.cc
@@ -320,20 +320,37 @@ class MenuItemViewPaintUnitTest : public ViewsTestBase {
DISALLOW_COPY_AND_ASSIGN(MenuItemViewPaintUnitTest);
};
-// Provides assertion coverage for painting minor text and icons.
+// Provides assertion coverage for painting, secondary label, minor text and
+// icons.
TEST_F(MenuItemViewPaintUnitTest, MinorTextAndIconAssertionCoverage) {
- auto AddItem = [this](auto label, auto minor_label, auto minor_icon) {
+ auto AddItem = [this](auto label, auto secondary_label, auto minor_label,
+ auto minor_icon) {
menu_item_view()->AddMenuItemAt(
- 0, 1000, base::ASCIIToUTF16(label), minor_label, minor_icon,
- gfx::ImageSkia(), ui::ThemedVectorIcon(),
+ 0, 1000, base::ASCIIToUTF16(label), secondary_label, minor_label,
+ minor_icon, gfx::ImageSkia(), ui::ThemedVectorIcon(),
views::MenuItemView::Type::kNormal, ui::NORMAL_SEPARATOR);
};
- AddItem("No minor content", base::string16(), ui::ThemedVectorIcon());
- AddItem("Minor text only", base::ASCIIToUTF16("minor text"),
+ AddItem("No secondary label, no minor content", base::string16(),
+ base::string16(), ui::ThemedVectorIcon());
+ AddItem("No secondary label, minor text only", base::string16(),
+ base::ASCIIToUTF16("minor text"), ui::ThemedVectorIcon());
+ AddItem("No secondary label, minor icon only", base::string16(),
+ base::string16(), ui::ThemedVectorIcon(&views::kMenuCheckIcon));
+ AddItem("No secondary label, minor text and icon", base::string16(),
+ base::ASCIIToUTF16("minor text"),
+ ui::ThemedVectorIcon(&views::kMenuCheckIcon));
+ AddItem("Secondary label, no minor content",
+ base::ASCIIToUTF16("secondary label"), base::string16(),
ui::ThemedVectorIcon());
- AddItem("Minor icon only", base::string16(),
+ AddItem("Secondary label, minor text only",
+ base::ASCIIToUTF16("secondary label"),
+ base::ASCIIToUTF16("minor text"), ui::ThemedVectorIcon());
+ AddItem("Secondary label, minor icon only",
+ base::ASCIIToUTF16("secondary label"), base::string16(),
ui::ThemedVectorIcon(&views::kMenuCheckIcon));
- AddItem("Minor text and icon", base::ASCIIToUTF16("minor text"),
+ AddItem("Secondary label, minor text and icon",
+ base::ASCIIToUTF16("secondary label"),
+ base::ASCIIToUTF16("minor text"),
ui::ThemedVectorIcon(&views::kMenuCheckIcon));
menu_runner()->RunMenuAt(widget(), nullptr, gfx::Rect(),
diff --git a/chromium/ui/views/controls/menu/menu_model_adapter.cc b/chromium/ui/views/controls/menu/menu_model_adapter.cc
index 79af9195b11..b0b1cf9a7a7 100644
--- a/chromium/ui/views/controls/menu/menu_model_adapter.cc
+++ b/chromium/ui/views/controls/menu/menu_model_adapter.cc
@@ -99,16 +99,17 @@ MenuItemView* MenuModelAdapter::AddMenuItemFromModelAt(ui::MenuModel* model,
}
if (*type == MenuItemView::Type::kSeparator) {
- return menu->AddMenuItemAt(menu_index, item_id, base::string16(),
- base::string16(), ui::ThemedVectorIcon(),
- gfx::ImageSkia(), ui::ThemedVectorIcon(), *type,
- model->GetSeparatorTypeAt(model_index));
+ return menu->AddMenuItemAt(
+ menu_index, item_id, base::string16(), base::string16(),
+ base::string16(), ui::ThemedVectorIcon(), gfx::ImageSkia(),
+ ui::ThemedVectorIcon(), *type, model->GetSeparatorTypeAt(model_index));
}
ui::ImageModel icon = model->GetIconAt(model_index);
ui::ImageModel minor_icon = model->GetMinorIconAt(model_index);
- return menu->AddMenuItemAt(
+ auto* menu_item_view = menu->AddMenuItemAt(
menu_index, item_id, model->GetLabelAt(model_index),
+ model->GetSecondaryLabelAt(model_index),
model->GetMinorTextAt(model_index),
minor_icon.IsVectorIcon()
? ui::ThemedVectorIcon(minor_icon.GetVectorIcon())
@@ -117,6 +118,12 @@ MenuItemView* MenuModelAdapter::AddMenuItemFromModelAt(ui::MenuModel* model,
icon.IsVectorIcon() ? ui::ThemedVectorIcon(icon.GetVectorIcon())
: ui::ThemedVectorIcon(),
*type, ui::NORMAL_SEPARATOR);
+
+ if (model->IsAlertedAt(model_index))
+ menu_item_view->SetAlerted();
+ menu_item_view->set_is_new(model->IsNewFeatureAt(model_index));
+
+ return menu_item_view;
}
// Static.
diff --git a/chromium/ui/views/controls/menu/menu_model_adapter_unittest.cc b/chromium/ui/views/controls/menu/menu_model_adapter_unittest.cc
index 6241a9d7916..111b070d725 100644
--- a/chromium/ui/views/controls/menu/menu_model_adapter_unittest.cc
+++ b/chromium/ui/views/controls/menu/menu_model_adapter_unittest.cc
@@ -78,6 +78,12 @@ class MenuModelBase : public ui::MenuModel {
bool IsVisibleAt(int index) const override { return items_[index].visible; }
+ bool IsAlertedAt(int index) const override { return items_[index].alerted; }
+
+ bool IsNewFeatureAt(int index) const override {
+ return items_[index].new_feature;
+ }
+
MenuModel* GetSubmenuModelAt(int index) const override {
return items_[index].submenu;
}
@@ -117,6 +123,8 @@ class MenuModelBase : public ui::MenuModel {
ui::MenuModel* submenu;
bool enabled;
bool visible;
+ bool alerted = false;
+ bool new_feature = false;
};
const Item& GetItemDefinition(size_t index) { return items_[index]; }
@@ -142,6 +150,7 @@ class SubmenuModel : public MenuModelBase {
SubmenuModel() : MenuModelBase(kSubmenuIdBase) {
items_.emplace_back(TYPE_COMMAND, "submenu item 0", nullptr, false, true);
items_.emplace_back(TYPE_COMMAND, "submenu item 1", nullptr);
+ items_[1].alerted = true;
}
~SubmenuModel() override = default;
@@ -155,6 +164,7 @@ class ActionableSubmenuModel : public MenuModelBase {
ActionableSubmenuModel() : MenuModelBase(kActionableSubmenuIdBase) {
items_.emplace_back(TYPE_COMMAND, "actionable submenu item 0", nullptr);
items_.emplace_back(TYPE_COMMAND, "actionable submenu item 1", nullptr);
+ items_[1].new_feature = true;
}
~ActionableSubmenuModel() override = default;
@@ -246,6 +256,12 @@ void CheckSubmenu(const RootModel& model,
// Check visibility.
EXPECT_EQ(model_item.visible, item->GetVisible());
+ // Check alert state.
+ EXPECT_EQ(model_item.alerted, item->is_alerted());
+
+ // Check new feature flag.
+ EXPECT_EQ(model_item.new_feature, item->is_new());
+
// Check activation.
static_cast<views::MenuDelegate*>(delegate)->ExecuteCommand(id);
EXPECT_EQ(i, size_t{submodel->last_activation()});
@@ -324,6 +340,12 @@ TEST_F(MenuModelAdapterTest, BasicTest) {
// Check visibility.
EXPECT_EQ(model_item.visible, item->GetVisible());
+ // Check alert state.
+ EXPECT_EQ(model_item.alerted, item->is_alerted());
+
+ // Check new feature flag.
+ EXPECT_EQ(model_item.new_feature, item->is_new());
+
// Check activation.
static_cast<views::MenuDelegate*>(&delegate)->ExecuteCommand(id);
EXPECT_EQ(i, size_t{model.last_activation()});
diff --git a/chromium/ui/views/controls/menu/submenu_view.cc b/chromium/ui/views/controls/menu/submenu_view.cc
index 413a1de18f9..28a9c908988 100644
--- a/chromium/ui/views/controls/menu/submenu_view.cc
+++ b/chromium/ui/views/controls/menu/submenu_view.cc
@@ -16,6 +16,7 @@
#include "ui/events/event.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/geometry/safe_integer_conversions.h"
+#include "ui/views/accessibility/view_accessibility.h"
#include "ui/views/controls/menu/menu_config.h"
#include "ui/views/controls/menu/menu_controller.h"
#include "ui/views/controls/menu/menu_host.h"
@@ -396,8 +397,12 @@ void SubmenuView::ShowAt(Widget* parent,
host_->InitMenuHost(parent, bounds, scroll_view_container_, do_capture);
}
- GetScrollViewContainer()->NotifyAccessibilityEvent(
- ax::mojom::Event::kMenuStart, true);
+ // Only fire kMenuStart for the top level menu, not for each submenu.
+ if (!GetMenuItem()->GetParentMenuItem()) {
+ GetScrollViewContainer()->NotifyAccessibilityEvent(
+ ax::mojom::Event::kMenuStart, true);
+ }
+ // Fire kMenuPopupStart for each menu/submenu that is shown.
NotifyAccessibilityEvent(ax::mojom::Event::kMenuPopupStart, true);
}
@@ -408,14 +413,6 @@ void SubmenuView::Reposition(const gfx::Rect& bounds) {
void SubmenuView::Close() {
if (host_) {
- // We send the event to the ScrollViewContainer first because the View
- // accessibility delegate sets up a focus override when receiving the
- // kMenuStart event that we want to be disabled when we send the
- // kMenuPopupEnd event in order to access the previously focused node.
- GetScrollViewContainer()->NotifyAccessibilityEvent(
- ax::mojom::Event::kMenuEnd, true);
- NotifyAccessibilityEvent(ax::mojom::Event::kMenuPopupEnd, true);
-
host_->DestroyMenuHost();
host_ = nullptr;
}
@@ -423,8 +420,22 @@ void SubmenuView::Close() {
void SubmenuView::Hide() {
if (host_) {
+ /// -- Fire accessibility events ----
+ // Both of these must be fired before HideMenuHost().
+ // Only fire kMenuStart for as top levels menu closes, not for each submenu.
+ // This is sent before kMenuPopupEnd to allow ViewAXPlatformNodeDelegate to
+ // remove its focus override before AXPlatformNodeAuraLinux needs to access
+ // the previously-focused node while handling kMenuPopupEnd.
+ if (!GetMenuItem()->GetParentMenuItem()) {
+ GetScrollViewContainer()->NotifyAccessibilityEvent(
+ ax::mojom::Event::kMenuEnd, true);
+ GetViewAccessibility().EndPopupFocusOverride();
+ }
+ // Fire these kMenuPopupEnd for each menu/submenu that closes/hides.
+ if (host_->IsVisible())
+ NotifyAccessibilityEvent(ax::mojom::Event::kMenuPopupEnd, true);
+
host_->HideMenuHost();
- NotifyAccessibilityEvent(ax::mojom::Event::kMenuPopupHide, true);
}
if (scroll_animator_->is_scrolling())
diff --git a/chromium/ui/views/controls/prefix_selector.cc b/chromium/ui/views/controls/prefix_selector.cc
index 704855a3897..aa0d2fe8423 100644
--- a/chromium/ui/views/controls/prefix_selector.cc
+++ b/chromium/ui/views/controls/prefix_selector.cc
@@ -171,6 +171,15 @@ bool PrefixSelector::SetCompositionFromExistingText(
}
#endif
+#if defined(OS_CHROMEOS)
+bool PrefixSelector::SetAutocorrectRange(const base::string16& autocorrect_text,
+ const gfx::Range& range) {
+ // TODO(crbug.com/1091088) Implement setAutocorrectRange.
+ NOTIMPLEMENTED_LOG_ONCE();
+ return false;
+}
+#endif
+
#if defined(OS_WIN)
void PrefixSelector::SetActiveCompositionForAccessibility(
const gfx::Range& range,
diff --git a/chromium/ui/views/controls/prefix_selector.h b/chromium/ui/views/controls/prefix_selector.h
index d61f6cf2ed8..12dffcc111b 100644
--- a/chromium/ui/views/controls/prefix_selector.h
+++ b/chromium/ui/views/controls/prefix_selector.h
@@ -82,6 +82,11 @@ class VIEWS_EXPORT PrefixSelector : public ui::TextInputClient {
const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) override;
#endif
+#if defined(OS_CHROMEOS)
+ bool SetAutocorrectRange(const base::string16& autocorrect_text,
+ const gfx::Range& range) override;
+#endif
+
#if defined(OS_WIN)
void GetActiveTextInputControlLayoutBounds(
base::Optional<gfx::Rect>* control_bounds,
diff --git a/chromium/ui/views/controls/scroll_view.h b/chromium/ui/views/controls/scroll_view.h
index 6df7bca1027..54b1e11e5ce 100644
--- a/chromium/ui/views/controls/scroll_view.h
+++ b/chromium/ui/views/controls/scroll_view.h
@@ -278,7 +278,7 @@ class VIEWS_EXPORT ScrollView : public View, public ScrollBarController {
const bool scroll_with_layers_enabled_;
// The focus ring for this ScrollView.
- std::unique_ptr<FocusRing> focus_ring_;
+ FocusRing* focus_ring_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(ScrollView);
};
diff --git a/chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.h b/chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.h
index 68e804b5d06..4f102e97a09 100644
--- a/chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.h
+++ b/chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.h
@@ -11,7 +11,6 @@
#import "components/remote_cocoa/app_shim/views_scrollbar_bridge.h"
#include "ui/compositor/layer_animation_observer.h"
#include "ui/gfx/animation/slide_animation.h"
-#include "ui/gfx/mac/cocoa_scrollbar_painter.h"
#include "ui/views/controls/scrollbar/scroll_bar.h"
#include "ui/views/views_export.h"
@@ -63,7 +62,7 @@ class VIEWS_EXPORT CocoaScrollBar : public ScrollBar,
bool IsScrollbarFullyHidden() const;
// Get the parameters for painting.
- gfx::CocoaScrollbarPainter::Params GetPainterParams() const;
+ ui::NativeTheme::ExtraParams GetPainterParams() const;
protected:
// ScrollBar:
diff --git a/chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.mm b/chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.mm
index 1b4d5a5d129..05960d9ad3e 100644
--- a/chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.mm
+++ b/chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.mm
@@ -15,8 +15,6 @@
#include "ui/gfx/canvas.h"
#include "ui/views/controls/scrollbar/base_scroll_bar_thumb.h"
-using gfx::CocoaScrollbarPainter;
-
namespace views {
namespace {
@@ -100,9 +98,14 @@ gfx::Size CocoaScrollBarThumb::CalculatePreferredSize() const {
void CocoaScrollBarThumb::OnPaint(gfx::Canvas* canvas) {
auto params = cocoa_scroll_bar_->GetPainterParams();
// Set the hover state based only on the thumb.
- params.hovered = IsStateHovered() || IsStatePressed();
- CocoaScrollbarPainter::PaintThumb(
- canvas->sk_canvas(), gfx::RectToSkIRect(GetLocalBounds()), params);
+ params.scrollbar_extra.is_hovering = IsStateHovered() || IsStatePressed();
+ ui::NativeTheme::Part thumb_part =
+ params.scrollbar_extra.orientation ==
+ ui::NativeTheme::ScrollbarOrientation::kHorizontal
+ ? ui::NativeTheme::kScrollbarHorizontalThumb
+ : ui::NativeTheme::kScrollbarVerticalThumb;
+ GetNativeTheme()->Paint(canvas->sk_canvas(), thumb_part,
+ ui::NativeTheme::kNormal, GetLocalBounds(), params);
}
bool CocoaScrollBarThumb::OnMousePressed(const ui::MouseEvent& event) {
@@ -208,9 +211,14 @@ void CocoaScrollBar::OnPaint(gfx::Canvas* canvas) {
auto params = GetPainterParams();
// Transparency of the track is handled by the View opacity, so always draw
// using the non-overlay path.
- params.overlay = false;
- CocoaScrollbarPainter::PaintTrack(
- canvas->sk_canvas(), gfx::RectToSkIRect(GetLocalBounds()), params);
+ params.scrollbar_extra.is_overlay = false;
+ ui::NativeTheme::Part track_part =
+ params.scrollbar_extra.orientation ==
+ ui::NativeTheme::ScrollbarOrientation::kHorizontal
+ ? ui::NativeTheme::kScrollbarHorizontalTrack
+ : ui::NativeTheme::kScrollbarVerticalTrack;
+ GetNativeTheme()->Paint(canvas->sk_canvas(), track_part,
+ ui::NativeTheme::kNormal, GetLocalBounds(), params);
}
bool CocoaScrollBar::CanProcessEventsWithinSubtree() const {
@@ -400,16 +408,20 @@ bool CocoaScrollBar::IsScrollbarFullyHidden() const {
return layer()->opacity() == 0.0f;
}
-CocoaScrollbarPainter::Params CocoaScrollBar::GetPainterParams() const {
- CocoaScrollbarPainter::Params params;
- if (IsHorizontal())
- params.orientation = CocoaScrollbarPainter::Orientation::kHorizontal;
- else if (base::i18n::IsRTL())
- params.orientation = CocoaScrollbarPainter::Orientation::kVerticalOnLeft;
- else
- params.orientation = CocoaScrollbarPainter::Orientation::kVerticalOnRight;
- params.overlay = GetScrollerStyle() == NSScrollerStyleOverlay;
- params.dark_mode = GetNativeTheme()->ShouldUseDarkColors();
+ui::NativeTheme::ExtraParams CocoaScrollBar::GetPainterParams() const {
+ ui::NativeTheme::ExtraParams params;
+ if (IsHorizontal()) {
+ params.scrollbar_extra.orientation =
+ ui::NativeTheme::ScrollbarOrientation::kHorizontal;
+ } else if (base::i18n::IsRTL()) {
+ params.scrollbar_extra.orientation =
+ ui::NativeTheme::ScrollbarOrientation::kVerticalOnLeft;
+ } else {
+ params.scrollbar_extra.orientation =
+ ui::NativeTheme::ScrollbarOrientation::kVerticalOnRight;
+ }
+ params.scrollbar_extra.is_overlay =
+ GetScrollerStyle() == NSScrollerStyleOverlay;
return params;
}
diff --git a/chromium/ui/views/controls/tabbed_pane/tabbed_pane.cc b/chromium/ui/views/controls/tabbed_pane/tabbed_pane.cc
index 4fdef37e512..50ecb7c042b 100644
--- a/chromium/ui/views/controls/tabbed_pane/tabbed_pane.cc
+++ b/chromium/ui/views/controls/tabbed_pane/tabbed_pane.cc
@@ -510,6 +510,11 @@ TabbedPane::TabbedPane(TabbedPane::Orientation orientation,
views::FlexSpecification(views::MinimumFlexSizeRule::kScaleToZero,
views::MaximumFlexSizeRule::kUnbounded));
contents_->SetLayoutManager(std::make_unique<views::FillLayout>());
+
+ // Support navigating tabs by Ctrl+Tab and Ctrl+Shift+Tab.
+ AddAccelerator(
+ ui::Accelerator(ui::VKEY_TAB, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN));
+ AddAccelerator(ui::Accelerator(ui::VKEY_TAB, ui::EF_CONTROL_DOWN));
}
TabbedPane::~TabbedPane() = default;
@@ -600,16 +605,6 @@ bool TabbedPane::MoveSelectionBy(int delta) {
return true;
}
-void TabbedPane::ViewHierarchyChanged(
- const ViewHierarchyChangedDetails& details) {
- if (details.is_add) {
- // Support navigating tabs by Ctrl+Tab and Ctrl+Shift+Tab.
- AddAccelerator(
- ui::Accelerator(ui::VKEY_TAB, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN));
- AddAccelerator(ui::Accelerator(ui::VKEY_TAB, ui::EF_CONTROL_DOWN));
- }
-}
-
bool TabbedPane::AcceleratorPressed(const ui::Accelerator& accelerator) {
// Handle Ctrl+Tab and Ctrl+Shift+Tab navigation of pages.
DCHECK(accelerator.key_code() == ui::VKEY_TAB && accelerator.IsCtrlDown());
diff --git a/chromium/ui/views/controls/tabbed_pane/tabbed_pane.h b/chromium/ui/views/controls/tabbed_pane/tabbed_pane.h
index 4c42c238ecb..97553af580f 100644
--- a/chromium/ui/views/controls/tabbed_pane/tabbed_pane.h
+++ b/chromium/ui/views/controls/tabbed_pane/tabbed_pane.h
@@ -123,8 +123,6 @@ class VIEWS_EXPORT TabbedPane : public View {
bool MoveSelectionBy(int delta);
// Overridden from View:
- void ViewHierarchyChanged(
- const ViewHierarchyChangedDetails& details) override;
bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
diff --git a/chromium/ui/views/controls/tabbed_pane/tabbed_pane_unittest.cc b/chromium/ui/views/controls/tabbed_pane/tabbed_pane_unittest.cc
index 808afa4d777..6bb23566546 100644
--- a/chromium/ui/views/controls/tabbed_pane/tabbed_pane_unittest.cc
+++ b/chromium/ui/views/controls/tabbed_pane/tabbed_pane_unittest.cc
@@ -121,7 +121,7 @@ class TabbedPaneWithWidgetTest : public ViewsTestBase {
params.bounds = gfx::Rect(0, 0, 650, 650);
widget_->Init(std::move(params));
tabbed_pane_ = tabbed_pane.get();
- widget_->SetContentsView(tabbed_pane.release());
+ widget_->SetContentsView(std::move(tabbed_pane));
}
void TearDown() override {
diff --git a/chromium/ui/views/controls/table/table_view.cc b/chromium/ui/views/controls/table/table_view.cc
index 94eb7a0527c..fa791c4700c 100644
--- a/chromium/ui/views/controls/table/table_view.cc
+++ b/chromium/ui/views/controls/table/table_view.cc
@@ -183,6 +183,8 @@ TableView::TableView(ui::TableModel* model,
SetModel(model);
if (model_)
UpdateVirtualAccessibilityChildren();
+
+ focus_ring_ = FocusRing::Install(this);
}
TableView::~TableView() {
diff --git a/chromium/ui/views/controls/table/table_view.h b/chromium/ui/views/controls/table/table_view.h
index 1a640fdf53e..30f1b107602 100644
--- a/chromium/ui/views/controls/table/table_view.h
+++ b/chromium/ui/views/controls/table/table_view.h
@@ -13,7 +13,6 @@
#include "ui/base/models/table_model.h"
#include "ui/base/models/table_model_observer.h"
#include "ui/gfx/font_list.h"
-#include "ui/views/controls/focus_ring.h"
#include "ui/views/view.h"
#include "ui/views/views_export.h"
@@ -396,7 +395,7 @@ class VIEWS_EXPORT TableView : public views::View,
int active_visible_column_index_ = -1;
// Used to draw a focus indicator around the active cell.
- std::unique_ptr<FocusRing> focus_ring_ = FocusRing::Install(this);
+ FocusRing* focus_ring_ = nullptr;
// The header. This is only created if more than one column is specified or
// the first column has a non-empty title.
diff --git a/chromium/ui/views/controls/textfield/textfield.cc b/chromium/ui/views/controls/textfield/textfield.cc
index d8e8fd0ace0..d0c5e12a9d1 100644
--- a/chromium/ui/views/controls/textfield/textfield.cc
+++ b/chromium/ui/views/controls/textfield/textfield.cc
@@ -65,8 +65,8 @@
#endif
#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-#include "ui/base/ime/linux/text_edit_command_auralinux.h"
-#include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h"
+#include "ui/base/ime/linux/text_edit_command_auralinux.h" // nogncheck
+#include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h" // nogncheck
#endif
#if defined(USE_X11)
@@ -330,6 +330,12 @@ Textfield::Textfield()
AddAccelerator(ui::Accelerator(ui::VKEY_C, ui::EF_CONTROL_DOWN));
AddAccelerator(ui::Accelerator(ui::VKEY_V, ui::EF_CONTROL_DOWN));
#endif
+
+ // Sometimes there are additional ignored views, such as the View representing
+ // the cursor, inside the text field. These should always be ignored by
+ // accessibility since a plain text field should always be a leaf node in the
+ // accessibility trees of all the platforms we support.
+ GetViewAccessibility().OverrideIsLeaf(true);
}
Textfield::~Textfield() {
@@ -677,8 +683,10 @@ gfx::Size Textfield::GetMinimumSize() const {
void Textfield::SetBorder(std::unique_ptr<Border> b) {
use_focus_ring_ = false;
- if (focus_ring_)
- focus_ring_.reset();
+ if (focus_ring_) {
+ RemoveChildViewT(focus_ring_);
+ focus_ring_ = nullptr;
+ }
View::SetBorder(std::move(b));
}
@@ -1025,6 +1033,7 @@ void Textfield::OnDragDone() {
void Textfield::GetAccessibleNodeData(ui::AXNodeData* node_data) {
node_data->role = ax::mojom::Role::kTextField;
+
if (label_ax_id_) {
node_data->AddIntListAttribute(ax::mojom::IntListAttribute::kLabelledbyIds,
{label_ax_id_});
@@ -1427,7 +1436,7 @@ bool Textfield::GetAcceleratorForCommandId(int command_id,
void Textfield::ExecuteCommand(int command_id, int event_flags) {
if (text_services_context_menu_ &&
text_services_context_menu_->SupportsCommand(command_id)) {
- text_services_context_menu_->ExecuteCommand(command_id);
+ text_services_context_menu_->ExecuteCommand(command_id, event_flags);
return;
}
@@ -1786,8 +1795,11 @@ ukm::SourceId Textfield::GetClientSourceForMetrics() const {
}
bool Textfield::ShouldDoLearning() {
- // TODO(https://crbug.com/311180): Implement this method.
- NOTIMPLEMENTED_LOG_ONCE();
+ if (should_do_learning_.has_value())
+ return should_do_learning_.value();
+
+ NOTIMPLEMENTED_LOG_ONCE() << "A Textfield does not support ShouldDoLearning";
+ DVLOG(1) << "This Textfield instance does not support ShouldDoLearning";
return false;
}
@@ -1806,6 +1818,14 @@ bool Textfield::SetCompositionFromExistingText(
}
#endif
+#if defined(OS_CHROMEOS)
+bool Textfield::SetAutocorrectRange(const base::string16& autocorrect_text,
+ const gfx::Range& range) {
+ // TODO(crbug.com/1091088) Implement autocorrect range textfield handling.
+ return false;
+}
+#endif
+
#if defined(OS_WIN)
void Textfield::GetActiveTextInputControlLayoutBounds(
base::Optional<gfx::Rect>* control_bounds,
diff --git a/chromium/ui/views/controls/textfield/textfield.h b/chromium/ui/views/controls/textfield/textfield.h
index 825c45513cf..775ce4f9683 100644
--- a/chromium/ui/views/controls/textfield/textfield.h
+++ b/chromium/ui/views/controls/textfield/textfield.h
@@ -377,12 +377,20 @@ class VIEWS_EXPORT Textfield : public View,
ukm::SourceId GetClientSourceForMetrics() const override;
bool ShouldDoLearning() override;
+ // Set whether the text should be used to improve typing suggestions.
+ void SetShouldDoLearning(bool value) { should_do_learning_ = value; }
+
#if defined(OS_WIN) || defined(OS_CHROMEOS)
bool SetCompositionFromExistingText(
const gfx::Range& range,
const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) override;
#endif
+#if defined(OS_CHROMEOS)
+ bool SetAutocorrectRange(const base::string16& autocorrect_text,
+ const gfx::Range& range) override;
+#endif
+
#if defined(OS_WIN)
void GetActiveTextInputControlLayoutBounds(
base::Optional<gfx::Rect>* control_bounds,
@@ -651,6 +659,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 text should be used to improve typing suggestions.
+ base::Optional<bool> should_do_learning_;
+
// Context menu related members.
std::unique_ptr<ui::SimpleMenuModel> context_menu_contents_;
std::unique_ptr<ViewsTextServicesContextMenu> text_services_context_menu_;
@@ -669,7 +680,7 @@ class VIEWS_EXPORT Textfield : public View,
ui::TextInputClient::FOCUS_REASON_NONE;
// The focus ring for this TextField.
- std::unique_ptr<FocusRing> focus_ring_;
+ FocusRing* focus_ring_ = nullptr;
// The password char reveal index, for testing only.
int password_char_reveal_index_ = -1;
diff --git a/chromium/ui/views/controls/textfield/textfield_test_api.cc b/chromium/ui/views/controls/textfield/textfield_test_api.cc
index 099f22e9bcf..40176fa3a73 100644
--- a/chromium/ui/views/controls/textfield/textfield_test_api.cc
+++ b/chromium/ui/views/controls/textfield/textfield_test_api.cc
@@ -5,7 +5,6 @@
#include "ui/views/controls/textfield/textfield_test_api.h"
#include "ui/gfx/geometry/rect.h"
-#include "ui/views/controls/views_text_services_context_menu.h"
namespace views {
@@ -34,12 +33,6 @@ void TextfieldTestApi::SetCursorViewRect(gfx::Rect bounds) {
textfield_->cursor_view_->SetBoundsRect(bounds);
}
-bool TextfieldTestApi::IsTextDirectionCheckedInContextMenu(
- base::i18n::TextDirection direction) const {
- return ViewsTextServicesContextMenu::IsTextDirectionCheckedForTesting(
- textfield_->text_services_context_menu_.get(), direction);
-}
-
bool TextfieldTestApi::ShouldShowCursor() const {
return textfield_->ShouldShowCursor();
}
diff --git a/chromium/ui/views/controls/textfield/textfield_test_api.h b/chromium/ui/views/controls/textfield/textfield_test_api.h
index 3f346da6059..78436bcb5a4 100644
--- a/chromium/ui/views/controls/textfield/textfield_test_api.h
+++ b/chromium/ui/views/controls/textfield/textfield_test_api.h
@@ -5,8 +5,6 @@
#ifndef UI_VIEWS_CONTROLS_TEXTFIELD_TEXTFIELD_TEST_API_H_
#define UI_VIEWS_CONTROLS_TEXTFIELD_TEXTFIELD_TEST_API_H_
-#include "base/i18n/rtl.h"
-#include "base/macros.h"
#include "ui/views/controls/textfield/textfield.h"
namespace views {
@@ -15,6 +13,9 @@ namespace views {
class TextfieldTestApi {
public:
explicit TextfieldTestApi(Textfield* textfield);
+ TextfieldTestApi(const TextfieldTestApi&) = delete;
+ TextfieldTestApi& operator=(const TextfieldTestApi&) = delete;
+ ~TextfieldTestApi() = default;
void UpdateContextMenu();
@@ -53,15 +54,10 @@ class TextfieldTestApi {
return textfield_->cursor_view_->GetVisible();
}
- bool IsTextDirectionCheckedInContextMenu(
- base::i18n::TextDirection direction) const;
-
bool ShouldShowCursor() const;
private:
Textfield* textfield_;
-
- DISALLOW_COPY_AND_ASSIGN(TextfieldTestApi);
};
} // namespace views
diff --git a/chromium/ui/views/controls/textfield/textfield_unittest.cc b/chromium/ui/views/controls/textfield/textfield_unittest.cc
index 456cecaba14..5a25faebf58 100644
--- a/chromium/ui/views/controls/textfield/textfield_unittest.cc
+++ b/chromium/ui/views/controls/textfield/textfield_unittest.cc
@@ -64,7 +64,7 @@
#endif
#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-#include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h"
+#include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h" // nogncheck
#endif
#if defined(OS_CHROMEOS)
@@ -74,6 +74,7 @@
#if defined(OS_MACOSX)
#include "ui/base/cocoa/secure_password_input.h"
+#include "ui/base/cocoa/text_services_context_menu.h"
#endif
using base::ASCIIToUTF16;
@@ -459,8 +460,7 @@ class TextfieldTest : public ViewsTestBase, public TextfieldController {
widget_->Init(std::move(params));
input_method_->SetDelegate(
test::WidgetTest::GetInputMethodDelegateForWidget(widget_));
- View* container = new View();
- widget_->SetContentsView(container);
+ View* container = widget_->SetContentsView(std::make_unique<View>());
container->AddChildView(textfield_);
textfield_->SetBoundsRect(params.bounds);
textfield_->SetID(1);
@@ -1395,6 +1395,17 @@ TEST_F(TextfieldTest, TextInputType_InsertionTest) {
textfield_->GetText());
}
+TEST_F(TextfieldTest, ShouldDoLearning) {
+ InitTextfield();
+
+ // Defaults to false.
+ EXPECT_EQ(false, textfield_->ShouldDoLearning());
+
+ // The value can be set.
+ textfield_->SetShouldDoLearning(true);
+ EXPECT_EQ(true, textfield_->ShouldDoLearning());
+}
+
TEST_F(TextfieldTest, TextInputType) {
InitTextfield();
@@ -3478,13 +3489,12 @@ TEST_F(TextfieldTest, TextfieldBoundsChangeTest) {
TEST_F(TextfieldTest, TextfieldInitialization) {
TestTextfield* new_textfield = new TestTextfield();
new_textfield->set_controller(this);
- View* container = new View();
Widget* widget(new Widget());
Widget::InitParams params =
CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
params.bounds = gfx::Rect(100, 100, 100, 100);
widget->Init(std::move(params));
- widget->SetContentsView(container);
+ View* container = widget->SetContentsView(std::make_unique<View>());
container->AddChildView(new_textfield);
new_textfield->SetBoundsRect(params.bounds);
@@ -3624,56 +3634,23 @@ TEST_F(TextfieldTest, TextServicesContextMenuTextDirectionTest) {
base::i18n::TextDirection::LEFT_TO_RIGHT);
test_api_->UpdateContextMenu();
- EXPECT_FALSE(test_api_->IsTextDirectionCheckedInContextMenu(
- base::i18n::TextDirection::UNKNOWN_DIRECTION));
- EXPECT_TRUE(test_api_->IsTextDirectionCheckedInContextMenu(
- base::i18n::TextDirection::LEFT_TO_RIGHT));
- EXPECT_FALSE(test_api_->IsTextDirectionCheckedInContextMenu(
- base::i18n::TextDirection::RIGHT_TO_LEFT));
+ EXPECT_FALSE(textfield_->IsCommandIdChecked(
+ ui::TextServicesContextMenu::kWritingDirectionDefault));
+ EXPECT_TRUE(textfield_->IsCommandIdChecked(
+ ui::TextServicesContextMenu::kWritingDirectionLtr));
+ EXPECT_FALSE(textfield_->IsCommandIdChecked(
+ ui::TextServicesContextMenu::kWritingDirectionRtl));
textfield_->ChangeTextDirectionAndLayoutAlignment(
base::i18n::TextDirection::RIGHT_TO_LEFT);
test_api_->UpdateContextMenu();
- EXPECT_FALSE(test_api_->IsTextDirectionCheckedInContextMenu(
- base::i18n::TextDirection::UNKNOWN_DIRECTION));
- EXPECT_FALSE(test_api_->IsTextDirectionCheckedInContextMenu(
- base::i18n::TextDirection::LEFT_TO_RIGHT));
- EXPECT_TRUE(test_api_->IsTextDirectionCheckedInContextMenu(
- base::i18n::TextDirection::RIGHT_TO_LEFT));
-}
-
-// Tests to see if the look up item is updated when the textfield's selected
-// text has changed.
-TEST_F(TextfieldTest, LookUpItemUpdate) {
- InitTextfield();
- EXPECT_TRUE(textfield_->context_menu_controller());
-
- const base::string16 kTextOne = ASCIIToUTF16("crake");
- textfield_->SetText(kTextOne);
- textfield_->SelectAll(false);
-
- ui::MenuModel* context_menu = GetContextMenuModel();
- EXPECT_TRUE(context_menu);
- EXPECT_GT(context_menu->GetItemCount(), 0);
- EXPECT_EQ(context_menu->GetLabelAt(0),
- l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_LOOK_UP, kTextOne));
-
-#if !defined(OS_MACOSX)
- // Mac context menus don't behave this way: it's not possible to update the
- // text while the menu is still "open", but also the selection can't change
- // while the menu is open (because the user can't interact with the rest of
- // the app).
- const base::string16 kTextTwo = ASCIIToUTF16("rail");
- textfield_->SetText(kTextTwo);
- textfield_->SelectAll(false);
-
- context_menu = GetContextMenuModel();
- EXPECT_TRUE(context_menu);
- EXPECT_GT(context_menu->GetItemCount(), 0);
- EXPECT_EQ(context_menu->GetLabelAt(0),
- l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_LOOK_UP, kTextTwo));
-#endif
+ EXPECT_FALSE(textfield_->IsCommandIdChecked(
+ ui::TextServicesContextMenu::kWritingDirectionDefault));
+ EXPECT_FALSE(textfield_->IsCommandIdChecked(
+ ui::TextServicesContextMenu::kWritingDirectionLtr));
+ EXPECT_TRUE(textfield_->IsCommandIdChecked(
+ ui::TextServicesContextMenu::kWritingDirectionRtl));
}
// Tests to see if the look up item is hidden for password fields.
diff --git a/chromium/ui/views/controls/tree/tree_view.cc b/chromium/ui/views/controls/tree/tree_view.cc
index bd84a3f38d7..69333ebe84c 100644
--- a/chromium/ui/views/controls/tree/tree_view.cc
+++ b/chromium/ui/views/controls/tree/tree_view.cc
@@ -139,6 +139,7 @@ void TreeView::SetModel(TreeModel* model) {
model_ = model;
selected_node_ = nullptr;
+ active_node_ = nullptr;
icons_.clear();
if (model_) {
model_->AddObserver(this);
@@ -154,18 +155,9 @@ void TreeView::SetModel(TreeModel* model) {
root_.set_is_expanded(true);
if (root_shown_)
- selected_node_ = &root_;
+ SetSelectedNode(root_.model_node());
else if (!root_.children().empty())
- selected_node_ = root_.children().front().get();
-
- if (selected_node_) {
- AXVirtualView* ax_selected_view = selected_node_->accessibility_view();
- if (ax_selected_view) {
- GetViewAccessibility().OverrideFocus(ax_selected_view);
- ax_selected_view->NotifyAccessibilityEvent(
- ax::mojom::Event::kSelection);
- }
- }
+ SetSelectedNode(root_.children().front().get()->model_node());
}
DrawnNodesChanged();
@@ -252,57 +244,21 @@ TreeModelNode* TreeView::GetEditingNode() {
}
void TreeView::SetSelectedNode(TreeModelNode* model_node) {
- if (editing_ || model_node != selected_node_)
- CancelEdit();
- if (model_node && model_->GetParent(model_node))
- Expand(model_->GetParent(model_node));
- if (model_node && model_node == root_.model_node() && !root_shown_)
- return; // Ignore requests to select the root when not shown.
- InternalNode* node =
- model_node ? GetInternalNodeForModelNode(model_node, CREATE_IF_NOT_LOADED)
- : nullptr;
- bool was_empty_selection = (selected_node_ == nullptr);
- bool changed = (selected_node_ != node);
- if (changed) {
- SchedulePaintForNode(selected_node_);
- selected_node_ = node;
- if (selected_node_ == &root_ && !root_shown_)
- selected_node_ = nullptr;
- if (selected_node_ && selected_node_ != &root_)
- Expand(model_->GetParent(selected_node_->model_node()));
- SchedulePaintForNode(selected_node_);
- }
-
- if (selected_node_) {
- // GetForegroundBoundsForNode() returns RTL-flipped coordinates for paint.
- // Un-flip before passing to ScrollRectToVisible(), which uses layout
- // coordinates.
- ScrollRectToVisible(
- GetMirroredRect(GetForegroundBoundsForNode(selected_node_)));
- }
-
- // Notify controller if the old selection was empty to handle the case of
- // remove explicitly resetting selected_node_ before invoking this.
- if (controller_ && (changed || was_empty_selection))
- controller_->OnTreeViewSelectionChanged(this);
-
- if (changed) {
- AXVirtualView* ax_selected_view =
- selected_node_ ? selected_node_->accessibility_view() : nullptr;
- if (ax_selected_view) {
- GetViewAccessibility().OverrideFocus(ax_selected_view);
- ax_selected_view->NotifyAccessibilityEvent(ax::mojom::Event::kSelection);
- } else {
- GetViewAccessibility().OverrideFocus(nullptr);
- NotifyAccessibilityEvent(ax::mojom::Event::kSelection, true);
- }
- }
+ UpdateSelection(model_node, kActiveAndSelected);
}
const TreeModelNode* TreeView::GetSelectedNode() const {
return selected_node_ ? selected_node_->model_node() : nullptr;
}
+void TreeView::SetActiveNode(TreeModelNode* model_node) {
+ UpdateSelection(model_node, kActive);
+}
+
+const TreeModelNode* TreeView::GetActiveNode() const {
+ return active_node_ ? active_node_->model_node() : nullptr;
+}
+
void TreeView::Collapse(ui::TreeModelNode* model_node) {
// Don't collapse the root if the root isn't shown, otherwise nothing is
// displayed.
@@ -315,7 +271,9 @@ void TreeView::Collapse(ui::TreeModelNode* model_node) {
bool was_expanded = IsExpanded(model_node);
if (node->is_expanded()) {
if (selected_node_ && selected_node_->HasAncestor(node))
- SetSelectedNode(model_node);
+ UpdateSelection(model_node, kActiveAndSelected);
+ else if (active_node_ && active_node_->HasAncestor(node))
+ UpdateSelection(model_node, kActive);
node->set_is_expanded(false);
}
if (was_expanded) {
@@ -392,9 +350,13 @@ void TreeView::SetRootShown(bool root_shown) {
if (root_shown_ == root_shown)
return;
root_shown_ = root_shown;
- if (!root_shown_ && selected_node_ == &root_) {
+ if (!root_shown_ && (selected_node_ == &root_ || active_node_ == &root_)) {
const auto& children = model_->GetChildren(root_.model_node());
- SetSelectedNode(children.empty() ? nullptr : children.front());
+ TreeModelNode* first_child = children.empty() ? nullptr : children.front();
+ if (selected_node_ == &root_)
+ UpdateSelection(first_child, kActiveAndSelected);
+ else if (active_node_ == &root_)
+ UpdateSelection(first_child, kActive);
}
AXVirtualView* ax_view = root_.accessibility_view();
@@ -491,36 +453,53 @@ bool TreeView::HandleAccessibleAction(const ui::AXActionData& action_data) {
if (!model_)
return false;
- switch (action_data.action) {
- case ax::mojom::Action::kDoDefault: {
- CommitEdit();
- RequestFocus();
- TreeModelNode* selected_model_node = GetSelectedNode();
- if (!selected_model_node)
+ AXVirtualView* ax_view = AXVirtualView::GetFromId(action_data.target_node_id);
+ InternalNode* node =
+ ax_view ? GetInternalNodeForVirtualView(ax_view) : nullptr;
+ if (!node) {
+ switch (action_data.action) {
+ case ax::mojom::Action::kFocus:
+ if (active_node_)
+ return false;
+ if (!HasFocus())
+ RequestFocus();
return true;
+ case ax::mojom::Action::kBlur:
+ case ax::mojom::Action::kScrollToMakeVisible:
+ return View::HandleAccessibleAction(action_data);
+ default:
+ return false;
+ }
+ }
- if (IsExpanded(selected_model_node))
- Collapse(selected_model_node);
+ switch (action_data.action) {
+ case ax::mojom::Action::kDoDefault:
+ SetSelectedNode(node->model_node());
+ if (!HasFocus())
+ RequestFocus();
+ if (IsExpanded(node->model_node()))
+ Collapse(node->model_node());
else
- Expand(selected_model_node);
+ Expand(node->model_node());
break;
- }
case ax::mojom::Action::kFocus:
- RequestFocus();
+ SetSelectedNode(node->model_node());
+ if (!HasFocus())
+ RequestFocus();
break;
case ax::mojom::Action::kScrollToMakeVisible:
- if (selected_node_) {
- // GetForegroundBoundsForNode() returns RTL-flipped coordinates for
- // paint. Un-flip before passing to ScrollRectToVisible(), which uses
- // layout coordinates.
- ScrollRectToVisible(
- GetMirroredRect(GetForegroundBoundsForNode(selected_node_)));
- }
+ // GetForegroundBoundsForNode() returns RTL-flipped coordinates for paint.
+ // Un-flip before passing to ScrollRectToVisible(), which uses layout
+ // coordinates.
+ ScrollRectToVisible(GetMirroredRect(GetForegroundBoundsForNode(node)));
break;
case ax::mojom::Action::kShowContextMenu:
+ SetSelectedNode(node->model_node());
+ if (!HasFocus())
+ RequestFocus();
ShowContextMenu(GetBoundsInScreen().CenterPoint(),
ui::MENU_SOURCE_KEYBOARD);
break;
@@ -565,11 +544,14 @@ void TreeView::TreeNodesRemoved(TreeModel* model,
GetInternalNodeForModelNode(parent, DONT_CREATE_IF_NOT_LOADED);
if (!parent_node || !parent_node->loaded_children())
return;
- bool reset_selection = false;
+ bool reset_selected_node = false;
+ bool reset_active_node = false;
for (size_t i = 0; i < count; ++i) {
InternalNode* child_removing = parent_node->children()[start].get();
if (selected_node_ && selected_node_->HasAncestor(child_removing))
- reset_selection = true;
+ reset_selected_node = true;
+ if (active_node_ && active_node_->HasAncestor(child_removing))
+ reset_active_node = true;
DCHECK(parent_node->accessibility_view()->Contains(
child_removing->accessibility_view()));
@@ -578,21 +560,31 @@ void TreeView::TreeNodesRemoved(TreeModel* model,
child_removing->set_accessibility_view(nullptr);
parent_node->Remove(start);
}
- if (reset_selection) {
- // selected_node_ is no longer valid (at the time we enter this function
- // its model_node() is likely deleted). Explicitly NULL out the field
- // rather than invoking SetSelectedNode() otherwise, we'll try and use a
- // deleted value.
- selected_node_ = nullptr;
+
+ if (reset_selected_node || reset_active_node) {
+ // selected_node_ or active_node_ or both were no longer valid (i.e. the
+ // model_node() was likely deleted by the time we entered this function).
+ // Explicitly set to nullptr before continuing; otherwise, we might try to
+ // use a deleted value.
+ if (reset_selected_node)
+ selected_node_ = nullptr;
+ if (reset_active_node)
+ active_node_ = nullptr;
+
+ // Replace invalidated states with the nearest valid node.
const auto& children = model_->GetChildren(parent);
- TreeModelNode* to_select = nullptr;
+ TreeModelNode* nearest_node = nullptr;
if (!children.empty()) {
- to_select = children[std::min(start, children.size() - 1)];
+ nearest_node = children[std::min(start, children.size() - 1)];
} else if (parent != root_.model_node() || root_shown_) {
- to_select = parent;
+ nearest_node = parent;
}
- SetSelectedNode(to_select);
+ if (reset_selected_node)
+ UpdateSelection(nearest_node, kActiveAndSelected);
+ else if (reset_active_node)
+ UpdateSelection(nearest_node, kActive);
}
+
if (IsExpanded(parent)) {
NotifyAccessibilityEvent(ax::mojom::Event::kRowCountChanged, true);
DrawnNodesChanged();
@@ -652,11 +644,17 @@ int TreeView::GetRowCount() {
}
int TreeView::GetSelectedRow() {
- ui::TreeModelNode* model_node = GetSelectedNode();
+ // Type-ahead searches should be relative to the active node, so return the
+ // row of the active node for |PrefixSelector|.
+ ui::TreeModelNode* model_node = GetActiveNode();
return model_node ? GetRowForNode(model_node) : -1;
}
void TreeView::SetSelectedRow(int row) {
+ // Type-ahead manipulates selection because active node is synced to selected
+ // node, so call SetSelectedNode() instead of SetActiveNode().
+ // TODO(crbug.com/1080944): Decouple active node from selected node by adding
+ // new keyboard affordances.
SetSelectedNode(GetNodeForRow(row));
}
@@ -665,18 +663,20 @@ base::string16 TreeView::GetTextForRow(int row) {
}
gfx::Point TreeView::GetKeyboardContextMenuLocation() {
- int y = height() / 2;
- if (selected_node_) {
- gfx::Rect node_bounds(GetForegroundBoundsForNode(selected_node_));
- gfx::Rect vis_bounds(GetVisibleBounds());
- if (node_bounds.y() >= vis_bounds.y() &&
- node_bounds.y() < vis_bounds.bottom()) {
- y = node_bounds.y();
- }
+ gfx::Rect vis_bounds(GetVisibleBounds());
+ int x = 0;
+ int y = 0;
+ if (active_node_) {
+ gfx::Rect node_bounds(GetForegroundBoundsForNode(active_node_));
+ if (node_bounds.Intersects(vis_bounds))
+ node_bounds.Intersect(vis_bounds);
+ gfx::Point menu_point(node_bounds.CenterPoint());
+ x = base::ClampToRange(menu_point.x(), vis_bounds.x(), vis_bounds.right());
+ y = base::ClampToRange(menu_point.y(), vis_bounds.y(), vis_bounds.bottom());
}
- gfx::Point screen_loc(0, y);
+ gfx::Point screen_loc(x, y);
if (base::i18n::IsRTL())
- screen_loc.set_x(width());
+ screen_loc.set_x(vis_bounds.width() - screen_loc.x());
ConvertPointToScreen(this, &screen_loc);
return screen_loc;
}
@@ -688,10 +688,10 @@ bool TreeView::OnKeyPressed(const ui::KeyEvent& event) {
switch (event.key_code()) {
case ui::VKEY_F2:
if (!editing_) {
- TreeModelNode* selected_node = GetSelectedNode();
- if (selected_node &&
- (!controller_ || controller_->CanEdit(this, selected_node))) {
- StartEditing(selected_node);
+ TreeModelNode* active_node = GetActiveNode();
+ if (active_node &&
+ (!controller_ || controller_->CanEdit(this, active_node))) {
+ StartEditing(active_node);
}
}
return true;
@@ -762,13 +762,6 @@ void TreeView::OnFocus() {
GetInputMethod()->OnCaretBoundsChanged(GetPrefixSelector());
SetHasFocusIndicator(true);
- AXVirtualView* ax_selected_view =
- selected_node_ ? selected_node_->accessibility_view() : nullptr;
- if (ax_selected_view) {
- GetViewAccessibility().OverrideFocus(ax_selected_view);
- } else {
- GetViewAccessibility().OverrideFocus(nullptr);
- }
}
void TreeView::OnBlur() {
@@ -780,24 +773,82 @@ void TreeView::OnBlur() {
SetHasFocusIndicator(false);
}
+void TreeView::UpdateSelection(TreeModelNode* model_node,
+ SelectionType selection_type) {
+ CancelEdit();
+ if (model_node && model_->GetParent(model_node))
+ Expand(model_->GetParent(model_node));
+ if (model_node && model_node == root_.model_node() && !root_shown_)
+ return; // Ignore requests for the root when not shown.
+ InternalNode* node =
+ model_node ? GetInternalNodeForModelNode(model_node, CREATE_IF_NOT_LOADED)
+ : nullptr;
+
+ // Force update if old value was nullptr to handle case of TreeNodesRemoved
+ // explicitly resetting selected_node_ or active_node_ before invoking this.
+ bool active_changed = (!active_node_ || active_node_ != node);
+ bool selection_changed = (selection_type == kActiveAndSelected &&
+ (!selected_node_ || selected_node_ != node));
+
+ // Update tree view states to new values.
+ if (active_changed)
+ active_node_ = node;
+
+ if (selection_changed) {
+ SchedulePaintForNode(selected_node_);
+ selected_node_ = node;
+ SchedulePaintForNode(selected_node_);
+ }
+
+ if (active_changed && node) {
+ // GetForegroundBoundsForNode() returns RTL-flipped coordinates for paint.
+ // Un-flip before passing to ScrollRectToVisible(), which uses layout
+ // coordinates.
+ ScrollRectToVisible(GetMirroredRect(GetForegroundBoundsForNode(node)));
+ }
+
+ // Notify assistive technologies of state changes.
+ if (active_changed) {
+ // Update |ViewAccessibility| so that focus lands directly on this node when
+ // |FocusManager| gives focus to the tree view. This update also fires an
+ // accessible focus event.
+ GetViewAccessibility().OverrideFocus(node ? node->accessibility_view()
+ : nullptr);
+ }
+
+ if (selection_changed) {
+ AXVirtualView* ax_selected_view =
+ node ? node->accessibility_view() : nullptr;
+ if (ax_selected_view)
+ ax_selected_view->NotifyAccessibilityEvent(ax::mojom::Event::kSelection);
+ else
+ NotifyAccessibilityEvent(ax::mojom::Event::kSelection, true);
+ }
+
+ // Notify controller of state changes.
+ if (selection_changed && controller_)
+ controller_->OnTreeViewSelectionChanged(this);
+}
+
bool TreeView::OnClickOrTap(const ui::LocatedEvent& event) {
CommitEdit();
- RequestFocus();
InternalNode* node = GetNodeAtPoint(event.location());
- if (!node)
- return true;
-
- bool hits_arrow = IsPointInExpandControl(node, event.location());
- if (!hits_arrow)
- SetSelectedNode(node->model_node());
+ if (node) {
+ bool hits_arrow = IsPointInExpandControl(node, event.location());
+ if (!hits_arrow)
+ SetSelectedNode(node->model_node());
- if (hits_arrow || EventIsDoubleTapOrClick(event)) {
- if (node->is_expanded())
- Collapse(node->model_node());
- else
- Expand(node->model_node());
+ if (hits_arrow || EventIsDoubleTapOrClick(event)) {
+ if (node->is_expanded())
+ Collapse(node->model_node());
+ else
+ Expand(node->model_node());
+ }
}
+
+ if (!HasFocus())
+ RequestFocus();
return true;
}
@@ -859,6 +910,7 @@ void TreeView::PopulateAccessibilityData(InternalNode* node,
: nullptr;
const bool selected = (node == selected_node);
data->AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, selected);
+ data->SetDefaultActionVerb(ax::mojom::DefaultActionVerb::kSelect);
if (node->is_expanded())
data->AddState(ax::mojom::State::kExpanded);
@@ -916,7 +968,8 @@ void TreeView::PopulateAccessibilityData(InternalNode* node,
gfx::Rect node_bounds = GetBackgroundBoundsForNode(node);
data->relative_bounds.bounds = gfx::RectF(node_bounds);
} else {
- data->AddState(ax::mojom::State::kInvisible);
+ data->AddState(node != &root_ || root_shown_ ? ax::mojom::State::kInvisible
+ : ax::mojom::State::kIgnored);
}
}
@@ -1123,6 +1176,22 @@ TreeView::InternalNode* TreeView::GetInternalNodeForModelNode(
return parent_internal_node->children()[index].get();
}
+TreeView::InternalNode* TreeView::GetInternalNodeForVirtualView(
+ AXVirtualView* ax_view) {
+ if (ax_view == root_.accessibility_view())
+ return &root_;
+ DCHECK(ax_view);
+ InternalNode* parent_internal_node =
+ GetInternalNodeForVirtualView(ax_view->virtual_parent_view());
+ if (!parent_internal_node)
+ return nullptr;
+ DCHECK(parent_internal_node->loaded_children());
+ AXVirtualView* parent_ax_view = parent_internal_node->accessibility_view();
+ DCHECK(parent_ax_view);
+ size_t index = parent_ax_view->GetIndexOf(ax_view);
+ return parent_internal_node->children()[index].get();
+}
+
gfx::Rect TreeView::GetBoundsForNode(InternalNode* node) {
int row, ignored_depth;
row = GetRowForInternalNode(node, &ignored_depth);
@@ -1248,7 +1317,7 @@ void TreeView::IncrementSelection(IncrementType type) {
if (!model_)
return;
- if (!GetSelectedNode()) {
+ if (!active_node_) {
// If nothing is selected select the first or last node.
if (root_.children().empty())
return;
@@ -1268,7 +1337,7 @@ void TreeView::IncrementSelection(IncrementType type) {
int depth = 0;
int delta = type == INCREMENT_PREVIOUS ? -1 : 1;
- int row = GetRowForInternalNode(selected_node_, &depth);
+ int row = GetRowForInternalNode(active_node_, &depth);
int new_row = base::ClampToRange(row + delta, 0, GetRowCount() - 1);
if (new_row == row)
return; // At the end/beginning.
@@ -1276,20 +1345,20 @@ void TreeView::IncrementSelection(IncrementType type) {
}
void TreeView::CollapseOrSelectParent() {
- if (selected_node_) {
- if (selected_node_->is_expanded())
- Collapse(selected_node_->model_node());
- else if (selected_node_->parent())
- SetSelectedNode(selected_node_->parent()->model_node());
+ if (active_node_) {
+ if (active_node_->is_expanded())
+ Collapse(active_node_->model_node());
+ else if (active_node_->parent())
+ SetSelectedNode(active_node_->parent()->model_node());
}
}
void TreeView::ExpandOrSelectChild() {
- if (selected_node_) {
- if (!selected_node_->is_expanded())
- Expand(selected_node_->model_node());
- else if (!selected_node_->children().empty())
- SetSelectedNode(selected_node_->children().front()->model_node());
+ if (active_node_) {
+ if (!active_node_->is_expanded())
+ Expand(active_node_->model_node());
+ else if (!active_node_->children().empty())
+ SetSelectedNode(active_node_->children().front()->model_node());
}
}
diff --git a/chromium/ui/views/controls/tree/tree_view.h b/chromium/ui/views/controls/tree/tree_view.h
index b03b860f7b2..19504e30d01 100644
--- a/chromium/ui/views/controls/tree/tree_view.h
+++ b/chromium/ui/views/controls/tree/tree_view.h
@@ -44,6 +44,13 @@ class TreeViewController;
// can expand, collapse and edit the items. A Controller may be attached to
// receive notification of selection changes and restrict editing.
//
+// In addition to tracking selection, TreeView also tracks the active node,
+// which is the item that receives keyboard input when the tree has focus.
+// Active/focus is like a pointer for keyboard navigation, and operations such
+// as selection are performed at the point of focus. The active node is synced
+// to the selected node. When the active node is nullptr, the TreeView itself is
+// the target of keyboard input.
+//
// Note on implementation. This implementation doesn't scale well. In particular
// it does not store any row information, but instead calculates it as
// necessary. But it's more than adequate for current uses.
@@ -103,6 +110,20 @@ class VIEWS_EXPORT TreeView : public View,
}
const ui::TreeModelNode* GetSelectedNode() const;
+ // Marks the specified node as active, scrolls it into view, and reports a
+ // keyboard focus update to ATs. Active node should be synced to the selected
+ // node and should be nullptr when the tree is empty.
+ // TODO(crbug.com/1080944): Decouple active node from selected node by adding
+ // new keyboard affordances.
+ void SetActiveNode(ui::TreeModelNode* model_node);
+
+ // Returns the active node, or nullptr if nothing is active.
+ ui::TreeModelNode* GetActiveNode() {
+ return const_cast<ui::TreeModelNode*>(
+ const_cast<const TreeView*>(this)->GetActiveNode());
+ }
+ const ui::TreeModelNode* GetActiveNode() const;
+
// Marks |model_node| as collapsed. This only effects the UI if node and all
// its parents are expanded (IsExpanded(model_node) returns true).
void Collapse(ui::TreeModelNode* model_node);
@@ -193,6 +214,20 @@ class VIEWS_EXPORT TreeView : public View,
private:
friend class TreeViewTest;
+ // Enumeration of possible changes to tree view state when the UI is updated.
+ enum SelectionType {
+ // Active state is being set to a tree item.
+ kActive,
+
+ // Active and selected states are being set to a tree item.
+ kActiveAndSelected,
+ };
+
+ // Performs active node and selected node state transitions. Updates states
+ // and scrolling before notifying assistive technologies and the controller.
+ void UpdateSelection(ui::TreeModelNode* model_node,
+ SelectionType selection_type);
+
// Selects, expands or collapses nodes in the tree. Consistent behavior for
// tap gesture and click events.
bool OnClickOrTap(const ui::LocatedEvent& event);
@@ -354,6 +389,9 @@ class VIEWS_EXPORT TreeView : public View,
ui::TreeModelNode* model_node,
GetInternalNodeCreateType create_type);
+ // Returns the InternalNode for a virtual view.
+ InternalNode* GetInternalNodeForVirtualView(AXVirtualView* ax_view);
+
// Returns the bounds for a node. This rectangle contains the node's icon,
// text, arrow, and auxiliary text (if any). All of the other bounding
// rectangles computed by the functions below lie inside this rectangle.
@@ -435,6 +473,9 @@ class VIEWS_EXPORT TreeView : public View,
// The selected node, may be null.
InternalNode* selected_node_ = nullptr;
+ // The current active node, may be null.
+ InternalNode* active_node_ = nullptr;
+
bool editing_ = false;
// The editor; lazily created and never destroyed (well, until TreeView is
diff --git a/chromium/ui/views/controls/tree/tree_view_unittest.cc b/chromium/ui/views/controls/tree/tree_view_unittest.cc
index 7f56294c155..6081d640219 100644
--- a/chromium/ui/views/controls/tree/tree_view_unittest.cc
+++ b/chromium/ui/views/controls/tree/tree_view_unittest.cc
@@ -14,6 +14,7 @@
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
+#include "ui/accessibility/ax_action_data.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/accessibility/platform/ax_platform_node_delegate.h"
@@ -24,7 +25,9 @@
#include "ui/views/controls/prefix_selector.h"
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/controls/tree/tree_view_controller.h"
+#include "ui/views/test/view_metadata_test_utils.h"
#include "ui/views/test/views_test_base.h"
+#include "ui/views/widget/unique_widget_ptr.h"
#include "ui/views/widget/widget.h"
using ui::TreeModel;
@@ -102,10 +105,27 @@ class TreeViewTest : public ViewsTestBase {
std::string TreeViewAccessibilityContentsAsString() const;
+ // Gets the selected node from the tree view. The result can be compared with
+ // GetSelectedAccessibilityViewName() to check consistency between the tree
+ // view state and the accessibility data.
std::string GetSelectedNodeTitle();
+ // Finds the selected node via iterative depth first search over the internal
+ // accessibility tree, examining both ignored and unignored nodes. The result
+ // can be compared with GetSelectedNodeTitle() to check consistency between
+ // the tree view state and the accessibility data.
std::string GetSelectedAccessibilityViewName() const;
+ // Gets the active node from the tree view. The result can be compared with
+ // GetSelectedAccessibilityViewName() to check consistency between the tree
+ // view state and the accessibility data.
+ std::string GetActiveNodeTitle();
+
+ // Gets the active node from the tree view's |ViewAccessibility|. The result
+ // can be compared with GetSelectedNodeTitle() to check consistency between
+ // the tree view internal state and the accessibility data.
+ std::string GetActiveAccessibilityViewName() const;
+
std::string GetEditingNodeTitle();
AXVirtualView* GetRootAccessibilityView() const;
@@ -125,7 +145,7 @@ class TreeViewTest : public ViewsTestBase {
ui::TreeNodeModel<TestNode> model_;
TreeView* tree_;
- Widget* widget_;
+ UniqueWidgetPtr widget_;
private:
std::string InternalNodeAsString(TreeView::InternalNode* node);
@@ -141,12 +161,13 @@ class TreeViewTest : public ViewsTestBase {
void TreeViewTest::SetUp() {
ViewsTestBase::SetUp();
- widget_ = new Widget;
+ widget_ = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
params.bounds = gfx::Rect(0, 0, 200, 200);
widget_->Init(std::move(params));
- tree_ = new TreeView();
- widget_->GetContentsView()->AddChildView(tree_);
+ tree_ =
+ widget_->GetContentsView()->AddChildView(std::make_unique<TreeView>());
+ tree_->RequestFocus();
ViewAccessibility::AccessibilityEventsCallback accessibility_events_callback =
base::BindRepeating(
@@ -164,8 +185,7 @@ void TreeViewTest::SetUp() {
}
void TreeViewTest::TearDown() {
- if (!widget_->IsClosed())
- widget_->Close();
+ widget_.reset();
ViewsTestBase::TearDown();
}
@@ -233,6 +253,20 @@ std::string TreeViewTest::GetSelectedAccessibilityViewName() const {
return {};
}
+std::string TreeViewTest::GetActiveNodeTitle() {
+ TreeModelNode* model_node = tree_->GetActiveNode();
+ return model_node ? base::UTF16ToASCII(model_node->GetTitle())
+ : std::string();
+}
+
+std::string TreeViewTest::GetActiveAccessibilityViewName() const {
+ const AXVirtualView* ax_view =
+ tree_->GetViewAccessibility().FocusedVirtualChild();
+ return ax_view ? ax_view->GetData().GetStringAttribute(
+ ax::mojom::StringAttribute::kName)
+ : std::string();
+}
+
std::string TreeViewTest::GetEditingNodeTitle() {
TreeModelNode* model_node = tree_->GetEditingNode();
return model_node ? base::UTF16ToASCII(model_node->GetTitle())
@@ -336,6 +370,12 @@ std::string TreeViewTest::InternalNodeAsString(TreeView::InternalNode* node) {
return result;
}
+// Verify properties are accessible via metadata.
+TEST_F(TreeViewTest, MetadataTest) {
+ tree_->SetModel(&model_);
+ test::TestViewMetadata(tree_);
+}
+
// Verifies setting model correctly updates internal state.
TEST_F(TreeViewTest, SetModel) {
tree_->SetModel(&model_);
@@ -930,4 +970,225 @@ TEST_F(TreeViewTest, CommitOnFocusLost) {
ax::mojom::StringAttribute::kName));
}
+// Verifies that virtual accessible actions go to virtual view targets.
+TEST_F(TreeViewTest, VirtualAccessibleAction) {
+ tree_->SetModel(&model_);
+ tree_->Expand(GetNodeByTitle("b1"));
+ EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString());
+ EXPECT_EQ("root [a b [b1] c]", TreeViewAccessibilityContentsAsString());
+ EXPECT_EQ(5, GetRowCount());
+
+ // Set to nullptr should clear the selection.
+ tree_->SetSelectedNode(nullptr);
+ EXPECT_EQ(std::string(), GetActiveNodeTitle());
+ EXPECT_EQ(std::string(), GetActiveAccessibilityViewName());
+ EXPECT_EQ(std::string(), GetSelectedNodeTitle());
+ EXPECT_EQ(std::string(), GetSelectedAccessibilityViewName());
+
+ // Test using each virtual view as target.
+ ui::AXActionData data;
+ const std::string test_cases[] = {"root", "a", "b", "b1", "c"};
+ for (const std::string& name : test_cases) {
+ data.target_node_id = GetAccessibilityViewByName(name)->GetData().id;
+ data.action = ax::mojom::Action::kDoDefault;
+ EXPECT_TRUE(tree_->HandleAccessibleAction(data));
+ EXPECT_EQ(name, GetActiveNodeTitle());
+ EXPECT_EQ(name, GetActiveAccessibilityViewName());
+ EXPECT_EQ(name, GetSelectedNodeTitle());
+ EXPECT_EQ(name, GetSelectedAccessibilityViewName());
+ }
+
+ // Do nothing when a valid node id is not provided. This can happen if the
+ // actions target the owner view itself.
+ tree_->SetSelectedNode(GetNodeByTitle("b"));
+ data.target_node_id = -1;
+ data.action = ax::mojom::Action::kDoDefault;
+ EXPECT_FALSE(tree_->HandleAccessibleAction(data));
+ EXPECT_EQ("b", GetActiveNodeTitle());
+ EXPECT_EQ("b", GetActiveAccessibilityViewName());
+ EXPECT_EQ("b", GetSelectedNodeTitle());
+ EXPECT_EQ("b", GetSelectedAccessibilityViewName());
+
+ // Check that the active node is set if assistive technologies set focus.
+ tree_->SetSelectedNode(GetNodeByTitle("b"));
+ data.target_node_id = GetAccessibilityViewByName("a")->GetData().id;
+ data.action = ax::mojom::Action::kFocus;
+ EXPECT_TRUE(tree_->HandleAccessibleAction(data));
+ EXPECT_EQ("a", GetActiveNodeTitle());
+ EXPECT_EQ("a", GetActiveAccessibilityViewName());
+ EXPECT_EQ("a", GetSelectedNodeTitle());
+ EXPECT_EQ("a", GetSelectedAccessibilityViewName());
+
+ // Do not handle accessible actions when no node is selected.
+ tree_->SetSelectedNode(nullptr);
+ data.target_node_id = -1;
+ data.action = ax::mojom::Action::kDoDefault;
+ EXPECT_FALSE(tree_->HandleAccessibleAction(data));
+ EXPECT_EQ(std::string(), GetActiveNodeTitle());
+ EXPECT_EQ(std::string(), GetActiveAccessibilityViewName());
+ EXPECT_EQ(std::string(), GetSelectedNodeTitle());
+ EXPECT_EQ(std::string(), GetSelectedAccessibilityViewName());
+}
+
+// Verifies that accessibility focus events get fired for the correct nodes when
+// the tree view is given focus.
+TEST_F(TreeViewTest, OnFocusAccessibilityEvents) {
+ // Without keyboard focus, model changes should not fire focus events.
+ tree_->GetFocusManager()->ClearFocus();
+ EXPECT_FALSE(tree_->HasFocus());
+ tree_->SetModel(&model_);
+ EXPECT_EQ("root [a b c]", TreeViewContentsAsString());
+ EXPECT_EQ("root [a b c]", TreeViewAccessibilityContentsAsString());
+ EXPECT_EQ("root", GetSelectedNodeTitle());
+ EXPECT_EQ("root", GetSelectedAccessibilityViewName());
+ EXPECT_EQ(4, GetRowCount());
+ EXPECT_EQ((AccessibilityEventsVector{
+ std::make_pair(GetTreeAccessibilityView(),
+ ax::mojom::Event::kChildrenChanged),
+ std::make_pair(GetTreeAccessibilityView(),
+ ax::mojom::Event::kChildrenChanged),
+ std::make_pair(GetTreeAccessibilityView(),
+ ax::mojom::Event::kChildrenChanged),
+ std::make_pair(GetRootAccessibilityView(),
+ ax::mojom::Event::kSelection)}),
+ accessibility_events());
+
+ // The initial focus should fire a focus event for the active node
+ // (in this case, the root node).
+ ClearAccessibilityEvents();
+ tree_->RequestFocus();
+ EXPECT_EQ((AccessibilityEventsVector{std::make_pair(
+ GetRootAccessibilityView(), ax::mojom::Event::kFocus)}),
+ accessibility_events());
+
+ // Focus clear and restore should fire a focus event for the active node.
+ ClearAccessibilityEvents();
+ tree_->SetSelectedNode(GetNodeByTitle("b"));
+ tree_->SetActiveNode(GetNodeByTitle("a"));
+ EXPECT_EQ("a", GetActiveNodeTitle());
+ EXPECT_EQ("a", GetActiveAccessibilityViewName());
+ EXPECT_EQ("b", GetSelectedNodeTitle());
+ EXPECT_EQ("b", GetSelectedAccessibilityViewName());
+ tree_->GetFocusManager()->ClearFocus();
+ EXPECT_FALSE(tree_->HasFocus());
+ tree_->GetFocusManager()->RestoreFocusedView();
+ EXPECT_TRUE(tree_->HasFocus());
+ EXPECT_EQ("a", GetActiveNodeTitle());
+ EXPECT_EQ("a", GetActiveAccessibilityViewName());
+ EXPECT_EQ("b", GetSelectedNodeTitle());
+ EXPECT_EQ("b", GetSelectedAccessibilityViewName());
+ EXPECT_EQ(
+ (AccessibilityEventsVector{std::make_pair(GetAccessibilityViewByName("b"),
+ ax::mojom::Event::kFocus),
+ std::make_pair(GetAccessibilityViewByName("b"),
+ ax::mojom::Event::kSelection),
+ std::make_pair(GetAccessibilityViewByName("a"),
+ ax::mojom::Event::kFocus),
+ std::make_pair(GetAccessibilityViewByName("a"),
+ ax::mojom::Event::kFocus)}),
+ accessibility_events());
+
+ // Without keyboard focus, selection should not fire focus events.
+ ClearAccessibilityEvents();
+ tree_->GetFocusManager()->ClearFocus();
+ tree_->SetSelectedNode(GetNodeByTitle("a"));
+ EXPECT_FALSE(tree_->HasFocus());
+ EXPECT_EQ("a", GetSelectedNodeTitle());
+ EXPECT_EQ("a", GetSelectedAccessibilityViewName());
+ EXPECT_EQ(
+ (AccessibilityEventsVector{std::make_pair(GetAccessibilityViewByName("a"),
+ ax::mojom::Event::kSelection)}),
+ accessibility_events());
+
+ // A direct focus action on a tree item should give focus to the tree view but
+ // only fire a focus event for the target node.
+ ui::AXActionData data;
+ const std::string test_cases[] = {"root", "a", "b", "c"};
+ for (const std::string& name : test_cases) {
+ ClearAccessibilityEvents();
+ tree_->GetFocusManager()->ClearFocus();
+ EXPECT_FALSE(tree_->HasFocus());
+ data.target_node_id = GetAccessibilityViewByName(name)->GetData().id;
+ data.action = ax::mojom::Action::kFocus;
+ EXPECT_TRUE(tree_->HandleAccessibleAction(data));
+ EXPECT_TRUE(tree_->HasFocus());
+ EXPECT_EQ(name, GetActiveNodeTitle());
+ EXPECT_EQ(name, GetActiveAccessibilityViewName());
+ EXPECT_EQ(name, GetSelectedNodeTitle());
+ EXPECT_EQ(name, GetSelectedAccessibilityViewName());
+ EXPECT_EQ((AccessibilityEventsVector{
+ std::make_pair(GetAccessibilityViewByName(name),
+ ax::mojom::Event::kSelection),
+ std::make_pair(GetAccessibilityViewByName(name),
+ ax::mojom::Event::kFocus)}),
+ accessibility_events());
+ }
+
+ // A direct focus action on the tree view itself with an active node should
+ // have no effect.
+ ClearAccessibilityEvents();
+ tree_->GetFocusManager()->ClearFocus();
+ tree_->SetSelectedNode(GetNodeByTitle("b"));
+ data.target_node_id = -1;
+ data.action = ax::mojom::Action::kFocus;
+ EXPECT_FALSE(tree_->HandleAccessibleAction(data));
+ EXPECT_FALSE(tree_->HasFocus());
+ EXPECT_EQ("b", GetActiveNodeTitle());
+ EXPECT_EQ("b", GetActiveAccessibilityViewName());
+ EXPECT_EQ("b", GetSelectedNodeTitle());
+ EXPECT_EQ("b", GetSelectedAccessibilityViewName());
+ EXPECT_EQ(
+ (AccessibilityEventsVector{std::make_pair(GetAccessibilityViewByName("b"),
+ ax::mojom::Event::kSelection)}),
+ accessibility_events());
+
+ // A direct focus action on a tree view without an active node (i.e. empty
+ // tree) should fire a focus event for the tree view.
+ ClearAccessibilityEvents();
+ tree_->GetFocusManager()->ClearFocus();
+ ui::TreeNodeModel<TestNode> empty_model(std::make_unique<TestNode>());
+ static_cast<TestNode*>(empty_model.GetRoot())->SetTitle(ASCIIToUTF16("root"));
+ tree_->SetModel(&empty_model);
+ tree_->SetRootShown(false);
+ data.target_node_id = -1;
+ data.action = ax::mojom::Action::kFocus;
+ EXPECT_TRUE(tree_->HandleAccessibleAction(data));
+ EXPECT_TRUE(tree_->HasFocus());
+ EXPECT_EQ(std::string(), GetActiveNodeTitle());
+ EXPECT_EQ(std::string(), GetActiveAccessibilityViewName());
+ EXPECT_EQ(std::string(), GetSelectedNodeTitle());
+ EXPECT_EQ(std::string(), GetSelectedAccessibilityViewName());
+ EXPECT_EQ((AccessibilityEventsVector{
+ std::make_pair(GetRootAccessibilityView(),
+ ax::mojom::Event::kSelection),
+ std::make_pair(GetTreeAccessibilityView(),
+ ax::mojom::Event::kSelection),
+ std::make_pair(GetRootAccessibilityView(),
+ ax::mojom::Event::kStateChanged),
+ std::make_pair(GetTreeAccessibilityView(),
+ ax::mojom::Event::kFocus)}),
+ accessibility_events());
+
+ // When a focused empty tree is populated with nodes, it should immediately
+ // hand off focus to one of them and select it.
+ ClearAccessibilityEvents();
+ tree_->SetModel(&model_);
+ EXPECT_EQ("a", GetActiveNodeTitle());
+ EXPECT_EQ("a", GetActiveAccessibilityViewName());
+ EXPECT_EQ("a", GetSelectedNodeTitle());
+ EXPECT_EQ("a", GetSelectedAccessibilityViewName());
+ EXPECT_EQ((AccessibilityEventsVector{
+ std::make_pair(GetTreeAccessibilityView(),
+ ax::mojom::Event::kChildrenChanged),
+ std::make_pair(GetTreeAccessibilityView(),
+ ax::mojom::Event::kChildrenChanged),
+ std::make_pair(GetTreeAccessibilityView(),
+ ax::mojom::Event::kChildrenChanged),
+ std::make_pair(GetAccessibilityViewByName("a"),
+ ax::mojom::Event::kFocus),
+ std::make_pair(GetAccessibilityViewByName("a"),
+ ax::mojom::Event::kSelection)}),
+ accessibility_events());
+}
+
} // namespace views
diff --git a/chromium/ui/views/controls/views_text_services_context_menu.cc b/chromium/ui/views/controls/views_text_services_context_menu.cc
deleted file mode 100644
index 0cebc532c69..00000000000
--- a/chromium/ui/views/controls/views_text_services_context_menu.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2018 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/views_text_services_context_menu.h"
-
-#include <memory>
-
-#include "base/notreached.h"
-#include "ui/views/controls/views_text_services_context_menu_base.h"
-
-namespace views {
-
-// static
-std::unique_ptr<ViewsTextServicesContextMenu>
-ViewsTextServicesContextMenu::Create(ui::SimpleMenuModel* menu,
- Textfield* client) {
- return std::make_unique<ViewsTextServicesContextMenuBase>(menu, client);
-}
-
-bool ViewsTextServicesContextMenu::IsTextDirectionCheckedForTesting(
- ViewsTextServicesContextMenu* menu,
- base::i18n::TextDirection direction) {
- NOTREACHED();
- return false;
-}
-
-} // namespace views
diff --git a/chromium/ui/views/controls/views_text_services_context_menu.h b/chromium/ui/views/controls/views_text_services_context_menu.h
index 1b84aa43f20..ade35947552 100644
--- a/chromium/ui/views/controls/views_text_services_context_menu.h
+++ b/chromium/ui/views/controls/views_text_services_context_menu.h
@@ -7,13 +7,7 @@
#include <memory>
-#include "base/i18n/rtl.h"
-#include "ui/base/accelerators/accelerator.h"
-#include "ui/views/views_export.h"
-
-namespace ui {
-class SimpleMenuModel;
-}
+#include "ui/base/models/simple_menu_model.h"
namespace views {
@@ -21,26 +15,15 @@ class Textfield;
// This class is used to add and handle text service items in the text context
// menu.
-class ViewsTextServicesContextMenu : public ui::AcceleratorProvider {
+class ViewsTextServicesContextMenu : public ui::SimpleMenuModel::Delegate {
public:
// Creates a platform-specific ViewsTextServicesContextMenu object.
static std::unique_ptr<ViewsTextServicesContextMenu> Create(
ui::SimpleMenuModel* menu,
Textfield* textfield);
- // Method for testing. Returns true if the text direction BiDi submenu item
- // in |menu| should be checked.
- VIEWS_EXPORT static bool IsTextDirectionCheckedForTesting(
- ViewsTextServicesContextMenu* menu,
- base::i18n::TextDirection direction);
-
// Returns true if the given |command_id| is handled by the menu.
virtual bool SupportsCommand(int command_id) const = 0;
-
- // Methods associated with SimpleMenuModel::Delegate.
- virtual bool IsCommandIdChecked(int command_id) const = 0;
- virtual bool IsCommandIdEnabled(int command_id) const = 0;
- virtual void ExecuteCommand(int command_id) = 0;
};
} // namespace views
diff --git a/chromium/ui/views/controls/views_text_services_context_menu_base.cc b/chromium/ui/views/controls/views_text_services_context_menu_base.cc
index b1f7b1d9890..a9b53aeb9c2 100644
--- a/chromium/ui/views/controls/views_text_services_context_menu_base.cc
+++ b/chromium/ui/views/controls/views_text_services_context_menu_base.cc
@@ -4,6 +4,8 @@
#include "ui/views/controls/views_text_services_context_menu_base.h"
+#include <memory>
+
#include "base/metrics/histogram_macros.h"
#include "build/build_config.h"
#include "ui/base/accelerators/accelerator.h"
@@ -41,10 +43,6 @@ ViewsTextServicesContextMenuBase::ViewsTextServicesContextMenuBase(
ViewsTextServicesContextMenuBase::~ViewsTextServicesContextMenuBase() = default;
-bool ViewsTextServicesContextMenuBase::SupportsCommand(int command_id) const {
- return command_id == IDS_CONTENT_CONTEXT_EMOJI;
-}
-
bool ViewsTextServicesContextMenuBase::GetAcceleratorForCommandId(
int command_id,
ui::Accelerator* accelerator) const {
@@ -72,17 +70,28 @@ bool ViewsTextServicesContextMenuBase::IsCommandIdChecked(
bool ViewsTextServicesContextMenuBase::IsCommandIdEnabled(
int command_id) const {
- if (command_id == IDS_CONTENT_CONTEXT_EMOJI)
- return true;
-
- return false;
+ return command_id == IDS_CONTENT_CONTEXT_EMOJI;
}
-void ViewsTextServicesContextMenuBase::ExecuteCommand(int command_id) {
+void ViewsTextServicesContextMenuBase::ExecuteCommand(int command_id,
+ int event_flags) {
if (command_id == IDS_CONTENT_CONTEXT_EMOJI) {
- client()->GetWidget()->ShowEmojiPanel();
+ client_->GetWidget()->ShowEmojiPanel();
UMA_HISTOGRAM_BOOLEAN(kViewsTextServicesContextMenuEmoji, true);
}
}
+bool ViewsTextServicesContextMenuBase::SupportsCommand(int command_id) const {
+ return command_id == IDS_CONTENT_CONTEXT_EMOJI;
+}
+
+#if !defined(OS_MACOSX)
+// static
+std::unique_ptr<ViewsTextServicesContextMenu>
+ViewsTextServicesContextMenu::Create(ui::SimpleMenuModel* menu,
+ Textfield* client) {
+ return std::make_unique<ViewsTextServicesContextMenuBase>(menu, client);
+}
+#endif
+
} // namespace views
diff --git a/chromium/ui/views/controls/views_text_services_context_menu_base.h b/chromium/ui/views/controls/views_text_services_context_menu_base.h
index bbc3e19d206..3c8484778f8 100644
--- a/chromium/ui/views/controls/views_text_services_context_menu_base.h
+++ b/chromium/ui/views/controls/views_text_services_context_menu_base.h
@@ -5,39 +5,40 @@
#ifndef UI_VIEWS_CONTROLS_VIEWS_TEXT_SERVICES_CONTEXT_MENU_BASE_H_
#define UI_VIEWS_CONTROLS_VIEWS_TEXT_SERVICES_CONTEXT_MENU_BASE_H_
-#include "base/macros.h"
+#include "build/build_config.h"
#include "ui/views/controls/views_text_services_context_menu.h"
namespace views {
-// This base class is used to add and handle text service items in the text
+// This base class is used to add and handle text service items in the textfield
// context menu. Specific platforms may subclass and add additional items.
class ViewsTextServicesContextMenuBase : public ViewsTextServicesContextMenu {
public:
ViewsTextServicesContextMenuBase(ui::SimpleMenuModel* menu,
Textfield* client);
+ ViewsTextServicesContextMenuBase(const ViewsTextServicesContextMenuBase&) =
+ delete;
+ ViewsTextServicesContextMenuBase& operator=(
+ const ViewsTextServicesContextMenuBase&) = delete;
~ViewsTextServicesContextMenuBase() override;
- // Returns true if the given |command_id| is handled by the menu.
- bool SupportsCommand(int command_id) const override;
-
- // ui::AcceleratorProvider:
+ // ViewsTextServicesContextMenu:
bool GetAcceleratorForCommandId(int command_id,
ui::Accelerator* accelerator) const override;
-
- // Methods associated with SimpleMenuModel::Delegate.
bool IsCommandIdChecked(int command_id) const override;
bool IsCommandIdEnabled(int command_id) const override;
- void ExecuteCommand(int command_id) override;
+ void ExecuteCommand(int command_id, int event_flags) override;
+ bool SupportsCommand(int command_id) const override;
protected:
- Textfield* client() const { return client_; }
+#if defined(OS_MACOSX)
+ Textfield* client() { return client_; }
+ const Textfield* client() const { return client_; }
+#endif
private:
// The view associated with the menu. Weak. Owns |this|.
- Textfield* client_ = nullptr;
-
- DISALLOW_COPY_AND_ASSIGN(ViewsTextServicesContextMenuBase);
+ Textfield* const client_;
};
} // namespace views
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 a95d7058b80..4f7510d6a1e 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
@@ -29,108 +29,118 @@ class ViewsTextServicesContextMenuMac
: public ViewsTextServicesContextMenuBase,
public ui::TextServicesContextMenu::Delegate {
public:
- ViewsTextServicesContextMenuMac(ui::SimpleMenuModel* menu, Textfield* client)
- : ViewsTextServicesContextMenuBase(menu, client),
- text_services_menu_(this) {
- // Insert the "Look up" item in the first position.
- base::string16 text = GetSelectedText();
- if (!text.empty()) {
- menu->InsertSeparatorAt(0, ui::NORMAL_SEPARATOR);
- 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_.AppendEditableItems(menu);
- }
-
+ ViewsTextServicesContextMenuMac(ui::SimpleMenuModel* menu, Textfield* client);
+ ViewsTextServicesContextMenuMac(const ViewsTextServicesContextMenuMac&) =
+ delete;
+ ViewsTextServicesContextMenuMac& operator=(
+ const ViewsTextServicesContextMenuMac&) = delete;
~ViewsTextServicesContextMenuMac() override = default;
// ViewsTextServicesContextMenu:
- bool SupportsCommand(int command_id) const override {
- return text_services_menu_.SupportsCommand(command_id) ||
- command_id == IDS_CONTENT_CONTEXT_LOOK_UP ||
- ViewsTextServicesContextMenuBase::SupportsCommand(command_id);
- }
+ bool IsCommandIdChecked(int command_id) const override;
+ bool IsCommandIdEnabled(int command_id) const override;
+ void ExecuteCommand(int command_id, int event_flags) override;
+ bool SupportsCommand(int command_id) const override;
- bool IsCommandIdEnabled(int command_id) const override {
- if (text_services_menu_.SupportsCommand(command_id))
- return text_services_menu_.IsCommandIdEnabled(command_id);
-
- switch (command_id) {
- case IDS_CONTENT_CONTEXT_LOOK_UP:
- return true;
+ // TextServicesContextMenu::Delegate:
+ base::string16 GetSelectedText() const override;
+ bool IsTextDirectionEnabled(
+ base::i18n::TextDirection direction) const override;
+ bool IsTextDirectionChecked(
+ base::i18n::TextDirection direction) const override;
+ void UpdateTextDirection(base::i18n::TextDirection direction) override;
- default:
- return ViewsTextServicesContextMenuBase::IsCommandIdEnabled(command_id);
- }
- }
+ private:
+ // Handler for the "Look Up" menu item.
+ void LookUpInDictionary();
- void ExecuteCommand(int command_id) override {
- switch (command_id) {
- case IDS_CONTENT_CONTEXT_LOOK_UP:
- LookUpInDictionary();
- break;
+ ui::TextServicesContextMenu text_services_menu_{this};
+};
- default:
- ViewsTextServicesContextMenuBase::ExecuteCommand(command_id);
- break;
- }
+ViewsTextServicesContextMenuMac::ViewsTextServicesContextMenuMac(
+ ui::SimpleMenuModel* menu,
+ Textfield* client)
+ : ViewsTextServicesContextMenuBase(menu, client) {
+ // Insert the "Look up" item in the first position.
+ const base::string16 text = GetSelectedText();
+ if (!text.empty()) {
+ menu->InsertSeparatorAt(0, ui::NORMAL_SEPARATOR);
+ menu->InsertItemAt(
+ 0, IDS_CONTENT_CONTEXT_LOOK_UP,
+ l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_LOOK_UP, text));
}
- // TextServicesContextMenu::Delegate:
- base::string16 GetSelectedText() const override {
- if (client()->GetTextInputType() == ui::TEXT_INPUT_TYPE_PASSWORD)
- return base::string16();
+ text_services_menu_.AppendToContextMenu(menu);
+ text_services_menu_.AppendEditableItems(menu);
+}
- return client()->GetSelectedText();
- }
+bool ViewsTextServicesContextMenuMac::IsCommandIdChecked(int command_id) const {
+ return text_services_menu_.SupportsCommand(command_id)
+ ? text_services_menu_.IsCommandIdChecked(command_id)
+ : ViewsTextServicesContextMenuBase::IsCommandIdChecked(command_id);
+}
- bool IsTextDirectionEnabled(
- base::i18n::TextDirection direction) const override {
- return direction != base::i18n::UNKNOWN_DIRECTION;
- }
+bool ViewsTextServicesContextMenuMac::IsCommandIdEnabled(int command_id) const {
+ if (text_services_menu_.SupportsCommand(command_id))
+ return text_services_menu_.IsCommandIdEnabled(command_id);
+ return (command_id == IDS_CONTENT_CONTEXT_LOOK_UP) ||
+ ViewsTextServicesContextMenuBase::IsCommandIdEnabled(command_id);
+}
- bool IsTextDirectionChecked(
- base::i18n::TextDirection direction) const override {
- return direction != base::i18n::UNKNOWN_DIRECTION &&
- client()->GetTextDirection() == direction;
- }
+void ViewsTextServicesContextMenuMac::ExecuteCommand(int command_id,
+ int event_flags) {
+ if (text_services_menu_.SupportsCommand(command_id))
+ text_services_menu_.ExecuteCommand(command_id, event_flags);
+ else if (command_id == IDS_CONTENT_CONTEXT_LOOK_UP)
+ LookUpInDictionary();
+ else
+ ViewsTextServicesContextMenuBase::ExecuteCommand(command_id, event_flags);
+}
- void UpdateTextDirection(base::i18n::TextDirection direction) override {
- DCHECK_NE(direction, base::i18n::UNKNOWN_DIRECTION);
+bool ViewsTextServicesContextMenuMac::SupportsCommand(int command_id) const {
+ return text_services_menu_.SupportsCommand(command_id) ||
+ command_id == IDS_CONTENT_CONTEXT_LOOK_UP ||
+ ViewsTextServicesContextMenuBase::SupportsCommand(command_id);
+}
- base::i18n::TextDirection text_direction =
- direction == base::i18n::LEFT_TO_RIGHT ? base::i18n::LEFT_TO_RIGHT
- : base::i18n::RIGHT_TO_LEFT;
- client()->ChangeTextDirectionAndLayoutAlignment(text_direction);
- }
+base::string16 ViewsTextServicesContextMenuMac::GetSelectedText() const {
+ return (client()->GetTextInputType() == ui::TEXT_INPUT_TYPE_PASSWORD)
+ ? base::string16()
+ : client()->GetSelectedText();
+}
- private:
- // Handler for the "Look Up" menu item.
- void LookUpInDictionary() {
- gfx::Point baseline_point;
- gfx::DecoratedText text;
- if (client()->GetWordLookupDataFromSelection(&text, &baseline_point)) {
- Widget* widget = client()->GetWidget();
- NSView* view = widget->GetNativeView().GetNativeNSView();
- views::View::ConvertPointToTarget(client(), widget->GetRootView(),
- &baseline_point);
-
- NSPoint lookup_point = NSMakePoint(
- baseline_point.x(), NSHeight([view frame]) - baseline_point.y());
- [view showDefinitionForAttributedString:
- gfx::GetAttributedStringFromDecoratedText(text)
- atPoint:lookup_point];
- }
- }
+bool ViewsTextServicesContextMenuMac::IsTextDirectionEnabled(
+ base::i18n::TextDirection direction) const {
+ return direction != base::i18n::UNKNOWN_DIRECTION;
+}
- // Appends and handles the text service menu.
- ui::TextServicesContextMenu text_services_menu_;
+bool ViewsTextServicesContextMenuMac::IsTextDirectionChecked(
+ base::i18n::TextDirection direction) const {
+ return IsTextDirectionEnabled(direction) &&
+ client()->GetTextDirection() == direction;
+}
- DISALLOW_COPY_AND_ASSIGN(ViewsTextServicesContextMenuMac);
-};
+void ViewsTextServicesContextMenuMac::UpdateTextDirection(
+ base::i18n::TextDirection direction) {
+ DCHECK(IsTextDirectionEnabled(direction));
+ client()->ChangeTextDirectionAndLayoutAlignment(direction);
+}
+
+void ViewsTextServicesContextMenuMac::LookUpInDictionary() {
+ gfx::DecoratedText text;
+ gfx::Point baseline_point;
+ if (client()->GetWordLookupDataFromSelection(&text, &baseline_point)) {
+ Widget* widget = client()->GetWidget();
+ views::View::ConvertPointToTarget(client(), widget->GetRootView(),
+ &baseline_point);
+ NSView* view = widget->GetNativeView().GetNativeNSView();
+ NSPoint lookup_point = NSMakePoint(
+ baseline_point.x(), NSHeight([view frame]) - baseline_point.y());
+ [view showDefinitionForAttributedString:
+ gfx::GetAttributedStringFromDecoratedText(text)
+ atPoint:lookup_point];
+ }
+}
} // namespace
@@ -141,11 +151,4 @@ ViewsTextServicesContextMenu::Create(ui::SimpleMenuModel* menu,
return std::make_unique<ViewsTextServicesContextMenuMac>(menu, client);
}
-// static
-bool ViewsTextServicesContextMenu::IsTextDirectionCheckedForTesting(
- ViewsTextServicesContextMenu* menu,
- base::i18n::TextDirection direction) {
- return static_cast<views::ViewsTextServicesContextMenuMac*>(menu)
- ->IsTextDirectionChecked(direction);
-}
} // namespace views
diff --git a/chromium/ui/views/controls/webview/webview.cc b/chromium/ui/views/controls/webview/webview.cc
index 7bef84b8c9e..0c523877565 100644
--- a/chromium/ui/views/controls/webview/webview.cc
+++ b/chromium/ui/views/controls/webview/webview.cc
@@ -331,14 +331,6 @@ void WebView::DidToggleFullscreenModeForTab(bool entered_fullscreen,
ReattachForFullscreenChange(entered_fullscreen);
}
-void WebView::DidAttachInterstitialPage() {
- NotifyAccessibilityWebContentsChanged();
-}
-
-void WebView::DidDetachInterstitialPage() {
- NotifyAccessibilityWebContentsChanged();
-}
-
void WebView::OnWebContentsFocused(
content::RenderWidgetHost* render_widget_host) {
RequestFocus();
diff --git a/chromium/ui/views/controls/webview/webview.h b/chromium/ui/views/controls/webview/webview.h
index 84d5cd520f7..624dcb1a4d8 100644
--- a/chromium/ui/views/controls/webview/webview.h
+++ b/chromium/ui/views/controls/webview/webview.h
@@ -149,8 +149,6 @@ class WEBVIEW_EXPORT WebView : public View,
void DidDestroyFullscreenWidget() override;
void DidToggleFullscreenModeForTab(bool entered_fullscreen,
bool will_cause_resize) override;
- void DidAttachInterstitialPage() override;
- void DidDetachInterstitialPage() override;
// Workaround for MSVC++ linker bug/feature that requires
// instantiation of the inline IPC::Listener methods in all translation units.
void OnChannelConnected(int32_t peer_id) override {}
diff --git a/chromium/ui/views/controls/webview/webview_unittest.cc b/chromium/ui/views/controls/webview/webview_unittest.cc
index 5bfd431308d..5c28d3091f8 100644
--- a/chromium/ui/views/controls/webview/webview_unittest.cc
+++ b/chromium/ui/views/controls/webview/webview_unittest.cc
@@ -159,8 +159,8 @@ class WebViewUnitTest : public views::test::WidgetTest {
// child.
top_level_widget_ = CreateTopLevelFramelessPlatformWidget();
top_level_widget_->SetBounds(gfx::Rect(0, 10, 100, 100));
- View* const contents_view = new View();
- top_level_widget_->SetContentsView(contents_view);
+ View* const contents_view =
+ top_level_widget_->SetContentsView(std::make_unique<View>());
web_view_ = new WebView(browser_context_.get());
web_view_->SetBoundsRect(gfx::Rect(contents_view->size()));
contents_view->AddChildView(web_view_);
diff --git a/chromium/ui/views/corewm/tooltip_aura.cc b/chromium/ui/views/corewm/tooltip_aura.cc
index 2ae616b9896..9cee7148dc9 100644
--- a/chromium/ui/views/corewm/tooltip_aura.cc
+++ b/chromium/ui/views/corewm/tooltip_aura.cc
@@ -53,40 +53,14 @@ bool CanUseTranslucentTooltipWidget() {
#endif
}
-// Creates a widget of type TYPE_TOOLTIP
-views::Widget* CreateTooltipWidget(aura::Window* tooltip_window) {
- views::Widget* widget = new views::Widget;
- views::Widget::InitParams params;
- // For aura, since we set the type to TYPE_TOOLTIP, the widget will get
- // auto-parented to the right container.
- params.type = views::Widget::InitParams::TYPE_TOOLTIP;
- params.context = tooltip_window;
- DCHECK(params.context);
- params.z_order = ui::ZOrderLevel::kFloatingUIElement;
- params.accept_events = false;
- if (CanUseTranslucentTooltipWidget())
- params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
- params.shadow_type = views::Widget::InitParams::ShadowType::kNone;
- // Use software compositing to avoid using unnecessary hardware resources
- // which just amount to overkill for this UI.
- params.force_software_compositing = true;
- widget->Init(std::move(params));
- return widget;
-}
-
-} // namespace
-
-namespace views {
-namespace corewm {
-
// TODO(oshima): Consider to use views::Label.
-class TooltipAura::TooltipView : public views::View {
+class TooltipView : public views::View {
public:
TooltipView() : render_text_(gfx::RenderText::CreateRenderText()) {
- SetBorder(CreateEmptyBorder(kVerticalPaddingTop, kHorizontalPadding,
- kVerticalPaddingBottom, kHorizontalPadding));
+ SetBorder(views::CreateEmptyBorder(kVerticalPaddingTop, kHorizontalPadding,
+ kVerticalPaddingBottom,
+ kHorizontalPadding));
- set_owned_by_client();
render_text_->SetWordWrapBehavior(gfx::WRAP_LONG_WORDS);
render_text_->SetMultiline(true);
@@ -177,18 +151,39 @@ class TooltipAura::TooltipView : public views::View {
DISALLOW_COPY_AND_ASSIGN(TooltipView);
};
-TooltipAura::TooltipAura() : tooltip_view_(new TooltipView) {}
+} // namespace
+
+namespace views {
+namespace corewm {
TooltipAura::~TooltipAura() {
DestroyWidget();
+ CHECK(!IsInObserverList());
}
+class TooltipAura::TooltipWidget : public Widget {
+ public:
+ TooltipWidget() = default;
+ ~TooltipWidget() override = default;
+
+ TooltipView* GetTooltipView() { return tooltip_view_; }
+
+ void SetTooltipView(std::unique_ptr<TooltipView> tooltip_view) {
+ tooltip_view_ = SetContentsView(std::move(tooltip_view));
+ }
+
+ private:
+ TooltipView* tooltip_view_ = nullptr;
+};
+
gfx::RenderText* TooltipAura::GetRenderTextForTest() {
- return tooltip_view_->render_text_for_test();
+ DCHECK(widget_);
+ return widget_->GetTooltipView()->render_text_for_test();
}
void TooltipAura::GetAccessibleNodeDataForTest(ui::AXNodeData* node_data) {
- tooltip_view_->GetAccessibleNodeData(node_data);
+ DCHECK(widget_);
+ widget_->GetTooltipView()->GetAccessibleNodeData(node_data);
}
gfx::Rect TooltipAura::GetTooltipBounds(const gfx::Point& mouse_pos,
@@ -214,6 +209,28 @@ gfx::Rect TooltipAura::GetTooltipBounds(const gfx::Point& mouse_pos,
return tooltip_rect;
}
+void TooltipAura::CreateTooltipWidget() {
+ DCHECK(!widget_);
+ DCHECK(tooltip_window_);
+ widget_ = new TooltipWidget;
+ views::Widget::InitParams params;
+ // For aura, since we set the type to TYPE_TOOLTIP, the widget will get
+ // auto-parented to the right container.
+ params.type = views::Widget::InitParams::TYPE_TOOLTIP;
+ params.context = tooltip_window_;
+ DCHECK(params.context);
+ params.z_order = ui::ZOrderLevel::kFloatingUIElement;
+ params.accept_events = false;
+ if (CanUseTranslucentTooltipWidget())
+ params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
+ params.shadow_type = views::Widget::InitParams::ShadowType::kNone;
+ // Use software compositing to avoid using unnecessary hardware resources
+ // which just amount to overkill for this UI.
+ params.force_software_compositing = true;
+ widget_->Init(std::move(params));
+ widget_->SetTooltipView(std::make_unique<TooltipView>());
+}
+
void TooltipAura::DestroyWidget() {
if (widget_) {
widget_->RemoveObserver(this);
@@ -232,15 +249,17 @@ void TooltipAura::SetText(aura::Window* window,
const base::string16& tooltip_text,
const gfx::Point& location) {
tooltip_window_ = window;
- tooltip_view_->SetMaxWidth(GetMaxWidth(location));
- tooltip_view_->SetText(tooltip_text);
if (!widget_) {
- widget_ = CreateTooltipWidget(tooltip_window_);
- widget_->SetContentsView(tooltip_view_.get());
+ CreateTooltipWidget();
widget_->AddObserver(this);
}
+ TooltipView* tooltip_view = widget_->GetTooltipView();
+
+ tooltip_view->SetMaxWidth(GetMaxWidth(location));
+ tooltip_view->SetText(tooltip_text);
+
ui::NativeTheme* native_theme = widget_->GetNativeTheme();
auto background_color =
native_theme->GetSystemColor(ui::NativeTheme::kColorId_TooltipBackground);
@@ -254,8 +273,8 @@ void TooltipAura::SetText(aura::Window* window,
if (!CanUseTranslucentTooltipWidget())
foreground_color =
color_utils::GetResultingPaintColor(foreground_color, background_color);
- tooltip_view_->SetBackgroundColor(background_color, foreground_color);
- tooltip_view_->SetForegroundColor(foreground_color);
+ tooltip_view->SetBackgroundColor(background_color, foreground_color);
+ tooltip_view->SetForegroundColor(foreground_color);
// Calculate the tooltip preferred size after all tooltip attributes are
// updated - tooltip updates (for example setting text color) may invalidate
@@ -265,7 +284,7 @@ void TooltipAura::SetText(aura::Window* window,
// GetPreferredSize() will generate fresh render text layout, even if the
// actual tooltip text hasn't changed).
const gfx::Rect adjusted_bounds =
- GetTooltipBounds(location, tooltip_view_->GetPreferredSize());
+ GetTooltipBounds(location, tooltip_view->GetPreferredSize());
widget_->SetBounds(adjusted_bounds);
}
@@ -273,8 +292,8 @@ void TooltipAura::Show() {
if (widget_) {
widget_->Show();
widget_->StackAtTop();
- tooltip_view_->NotifyAccessibilityEvent(ax::mojom::Event::kTooltipOpened,
- true);
+ widget_->GetTooltipView()->NotifyAccessibilityEvent(
+ ax::mojom::Event::kTooltipOpened, true);
}
}
@@ -288,9 +307,9 @@ void TooltipAura::Hide() {
// guarantees we never show outdated information.
// TODO(http://crbug.com/998280): Figure out why the old content is
// displayed despite the size change.
+ widget_->GetTooltipView()->NotifyAccessibilityEvent(
+ ax::mojom::Event::kTooltipClosed, true);
DestroyWidget();
- tooltip_view_->NotifyAccessibilityEvent(ax::mojom::Event::kTooltipClosed,
- true);
}
}
diff --git a/chromium/ui/views/corewm/tooltip_aura.h b/chromium/ui/views/corewm/tooltip_aura.h
index 1c632da80ba..56e2c913762 100644
--- a/chromium/ui/views/corewm/tooltip_aura.h
+++ b/chromium/ui/views/corewm/tooltip_aura.h
@@ -32,11 +32,11 @@ class TooltipAuraTestApi;
// Implementation of Tooltip that shows the tooltip using a Widget and Label.
class VIEWS_EXPORT TooltipAura : public Tooltip, public WidgetObserver {
public:
- TooltipAura();
+ TooltipAura() = default;
~TooltipAura() override;
private:
- class TooltipView;
+ class TooltipWidget;
friend class test::TooltipAuraTestApi;
gfx::RenderText* GetRenderTextForTest();
@@ -47,6 +47,9 @@ class VIEWS_EXPORT TooltipAura : public Tooltip, public WidgetObserver {
gfx::Rect GetTooltipBounds(const gfx::Point& mouse_pos,
const gfx::Size& tooltip_size);
+ // Sets |widget_| to a new instance of TooltipWidget.
+ void CreateTooltipWidget();
+
// Destroys |widget_|.
void DestroyWidget();
@@ -62,11 +65,8 @@ class VIEWS_EXPORT TooltipAura : public Tooltip, public WidgetObserver {
// WidgetObserver:
void OnWidgetDestroying(Widget* widget) override;
- // The view showing the tooltip.
- std::unique_ptr<TooltipView> tooltip_view_;
-
// The widget containing the tooltip. May be NULL.
- Widget* widget_ = nullptr;
+ TooltipWidget* widget_ = nullptr;
// The window we're showing the tooltip for. Never NULL and valid while
// showing.
diff --git a/chromium/ui/views/corewm/tooltip_controller.cc b/chromium/ui/views/corewm/tooltip_controller.cc
index c19d2296ff9..0ac53224396 100644
--- a/chromium/ui/views/corewm/tooltip_controller.cc
+++ b/chromium/ui/views/corewm/tooltip_controller.cc
@@ -233,20 +233,24 @@ void TooltipController::OnMouseEvent(ui::MouseEvent* event) {
void TooltipController::OnTouchEvent(ui::TouchEvent* event) {
// Hide the tooltip for touch events.
- tooltip_->Hide();
- SetTooltipWindow(nullptr);
+ HideTooltipAndResetStates();
last_touch_loc_ = event->location();
}
void TooltipController::OnCancelMode(ui::CancelModeEvent* event) {
- tooltip_->Hide();
- SetTooltipWindow(nullptr);
+ HideTooltipAndResetStates();
}
void TooltipController::OnCursorVisibilityChanged(bool is_visible) {
UpdateIfRequired();
}
+void TooltipController::OnWindowVisibilityChanged(aura::Window* window,
+ bool visible) {
+ if (!visible)
+ HideTooltipAndResetStates();
+}
+
void TooltipController::OnWindowDestroyed(aura::Window* window) {
if (tooltip_window_ == window) {
tooltip_->Hide();
@@ -350,6 +354,19 @@ void TooltipController::ShowTooltip() {
}
}
+void TooltipController::HideTooltipAndResetStates() {
+ // Hide any open tooltips.
+ if (tooltip_shown_timer_.IsRunning())
+ tooltip_shown_timer_.Stop();
+ tooltip_->Hide();
+
+ // Cancel pending tooltips and reset controller states.
+ if (tooltip_defer_timer_.IsRunning())
+ tooltip_defer_timer_.Stop();
+ SetTooltipWindow(nullptr);
+ tooltip_id_ = nullptr;
+}
+
bool TooltipController::IsTooltipVisible() {
return tooltip_->IsVisible();
}
diff --git a/chromium/ui/views/corewm/tooltip_controller.h b/chromium/ui/views/corewm/tooltip_controller.h
index 92595143a7c..8e2fd2f98ed 100644
--- a/chromium/ui/views/corewm/tooltip_controller.h
+++ b/chromium/ui/views/corewm/tooltip_controller.h
@@ -57,6 +57,7 @@ class VIEWS_EXPORT TooltipController
void OnCursorVisibilityChanged(bool is_visible) override;
// Overridden from aura::WindowObserver.
+ void OnWindowVisibilityChanged(aura::Window* window, bool visible) override;
void OnWindowDestroyed(aura::Window* window) override;
void OnWindowPropertyChanged(aura::Window* window,
const void* key,
@@ -72,6 +73,9 @@ class VIEWS_EXPORT TooltipController
// Show the tooltip.
void ShowTooltip();
+ // Hide the tooltip, clear timers, and reset controller states.
+ void HideTooltipAndResetStates();
+
// Updates the tooltip if required (if there is any change in the tooltip
// text, tooltip id or the aura::Window).
void UpdateIfRequired();
diff --git a/chromium/ui/views/corewm/tooltip_controller_test_helper.h b/chromium/ui/views/corewm/tooltip_controller_test_helper.h
index 3c2909548f2..9148194618b 100644
--- a/chromium/ui/views/corewm/tooltip_controller_test_helper.h
+++ b/chromium/ui/views/corewm/tooltip_controller_test_helper.h
@@ -5,7 +5,6 @@
#ifndef UI_VIEWS_COREWM_TOOLTIP_CONTROLLER_TEST_HELPER_H_
#define UI_VIEWS_COREWM_TOOLTIP_CONTROLLER_TEST_HELPER_H_
-#include "base/logging.h"
#include "base/macros.h"
#include "base/strings/string16.h"
#include "ui/views/view.h"
diff --git a/chromium/ui/views/corewm/tooltip_controller_unittest.cc b/chromium/ui/views/corewm/tooltip_controller_unittest.cc
index 30ba48c792c..8ad58bb25e0 100644
--- a/chromium/ui/views/corewm/tooltip_controller_unittest.cc
+++ b/chromium/ui/views/corewm/tooltip_controller_unittest.cc
@@ -4,6 +4,7 @@
#include "ui/views/corewm/tooltip_controller.h"
+#include <memory>
#include <utility>
#include "base/at_exit.h"
@@ -96,7 +97,7 @@ class TooltipControllerTest : public ViewsTestBase {
}
#endif
widget_.reset(CreateWidget(root_window));
- widget_->SetContentsView(new View);
+ widget_->SetContentsView(std::make_unique<View>());
view_ = new TooltipTestView;
widget_->GetContentsView()->AddChildView(view_);
view_->SetBoundsRect(widget_->GetContentsView()->GetLocalBounds());
@@ -539,7 +540,7 @@ TEST_F(TooltipControllerTest, MAYBE_Capture) {
view_->set_tooltip_text(tooltip_text);
std::unique_ptr<views::Widget> widget2(CreateWidget(GetContext()));
- widget2->SetContentsView(new View);
+ widget2->SetContentsView(std::make_unique<View>());
TooltipTestView* view2 = new TooltipTestView;
widget2->GetContentsView()->AddChildView(view2);
view2->set_tooltip_text(tooltip_text2);
@@ -696,7 +697,7 @@ class TooltipControllerTest3 : public ViewsTestBase {
aura::Window* root_window = GetContext();
widget_.reset(CreateWidget(root_window));
- widget_->SetContentsView(new View);
+ widget_->SetContentsView(std::make_unique<View>());
view_ = new TooltipTestView;
widget_->GetContentsView()->AddChildView(view_);
view_->SetBoundsRect(widget_->GetContentsView()->GetLocalBounds());
diff --git a/chromium/ui/views/examples/combobox_example.cc b/chromium/ui/views/examples/combobox_example.cc
index dc1e8bba76f..79f9c2065ee 100644
--- a/chromium/ui/views/examples/combobox_example.cc
+++ b/chromium/ui/views/examples/combobox_example.cc
@@ -27,7 +27,7 @@ class ComboboxModelExample : public ui::ComboboxModel {
private:
// ui::ComboboxModel:
int GetItemCount() const override { return 10; }
- base::string16 GetItemAt(int index) override {
+ base::string16 GetItemAt(int index) const override {
return base::UTF8ToUTF16(base::StringPrintf("%c item", 'A' + index));
}
diff --git a/chromium/ui/views/examples/example_combobox_model.cc b/chromium/ui/views/examples/example_combobox_model.cc
index bd3fd9440c9..841d890e2d1 100644
--- a/chromium/ui/views/examples/example_combobox_model.cc
+++ b/chromium/ui/views/examples/example_combobox_model.cc
@@ -19,7 +19,7 @@ int ExampleComboboxModel::GetItemCount() const {
return count_;
}
-base::string16 ExampleComboboxModel::GetItemAt(int index) {
+base::string16 ExampleComboboxModel::GetItemAt(int index) const {
return base::ASCIIToUTF16(strings_[index]);
}
diff --git a/chromium/ui/views/examples/example_combobox_model.h b/chromium/ui/views/examples/example_combobox_model.h
index 8f6c389a4ae..79c0d64f9d6 100644
--- a/chromium/ui/views/examples/example_combobox_model.h
+++ b/chromium/ui/views/examples/example_combobox_model.h
@@ -18,7 +18,7 @@ class ExampleComboboxModel : public ui::ComboboxModel {
// ui::ComboboxModel:
int GetItemCount() const override;
- base::string16 GetItemAt(int index) override;
+ base::string16 GetItemAt(int index) const override;
private:
const char* const* const strings_;
diff --git a/chromium/ui/views/examples/examples_main_proc.cc b/chromium/ui/views/examples/examples_main_proc.cc
index fe417da38a3..ffdbc86fd5d 100644
--- a/chromium/ui/views/examples/examples_main_proc.cc
+++ b/chromium/ui/views/examples/examples_main_proc.cc
@@ -148,7 +148,6 @@ ExamplesExitCode ExamplesMainProc(bool under_test) {
#if BUILDFLAG(ENABLE_DESKTOP_AURA)
std::unique_ptr<display::Screen> desktop_screen =
base::WrapUnique(views::CreateDesktopScreen());
- display::Screen::SetScreenInstance(desktop_screen.get());
#endif
base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
diff --git a/chromium/ui/views/examples/examples_skia_gold_pixel_diff.cc b/chromium/ui/views/examples/examples_skia_gold_pixel_diff.cc
index ffabc89ae2b..36fb5bdeb44 100644
--- a/chromium/ui/views/examples/examples_skia_gold_pixel_diff.cc
+++ b/chromium/ui/views/examples/examples_skia_gold_pixel_diff.cc
@@ -39,8 +39,8 @@ ExamplesExitCode ExamplesSkiaGoldPixelDiff::CompareScreenshot(
run_loop.Run();
if (screenshot_.IsEmpty())
return ExamplesExitCode::kImageEmpty;
- return SkiaGoldPixelDiff::CompareScreenshot(screenshot_name,
- *screenshot_.ToSkBitmap())
+ return ui::test::SkiaGoldPixelDiff::CompareScreenshot(
+ screenshot_name, *screenshot_.ToSkBitmap())
? ExamplesExitCode::kSucceeded
: ExamplesExitCode::kFailed;
}
diff --git a/chromium/ui/views/examples/examples_skia_gold_pixel_diff.h b/chromium/ui/views/examples/examples_skia_gold_pixel_diff.h
index 4bb102d97eb..8f04778f736 100644
--- a/chromium/ui/views/examples/examples_skia_gold_pixel_diff.h
+++ b/chromium/ui/views/examples/examples_skia_gold_pixel_diff.h
@@ -15,7 +15,7 @@
namespace views {
namespace examples {
-class ExamplesSkiaGoldPixelDiff : public SkiaGoldPixelDiff {
+class ExamplesSkiaGoldPixelDiff : public ui::test::SkiaGoldPixelDiff {
public:
ExamplesSkiaGoldPixelDiff();
~ExamplesSkiaGoldPixelDiff() override;
diff --git a/chromium/ui/views/examples/examples_window.cc b/chromium/ui/views/examples/examples_window.cc
index d2cde9bb4e0..c8cb0f2ff9f 100644
--- a/chromium/ui/views/examples/examples_window.cc
+++ b/chromium/ui/views/examples/examples_window.cc
@@ -95,7 +95,7 @@ class ComboboxModelExampleList : public ui::ComboboxModel {
// ui::ComboboxModel:
int GetItemCount() const override { return example_list_.size(); }
- base::string16 GetItemAt(int index) override {
+ base::string16 GetItemAt(int index) const override {
return base::UTF8ToUTF16(example_list_[index]->example_title());
}
@@ -114,6 +114,8 @@ class ExamplesWindowContents : public WidgetDelegateView,
public:
ExamplesWindowContents(base::OnceClosure on_close, ExampleVector examples)
: on_close_(std::move(on_close)) {
+ SetHasWindowSizeControls(true);
+
auto combobox_model = std::make_unique<ComboboxModelExampleList>();
combobox_model_ = combobox_model.get();
combobox_model_->SetExamples(std::move(examples));
@@ -161,9 +163,6 @@ class ExamplesWindowContents : public WidgetDelegateView,
private:
// WidgetDelegateView:
- bool CanResize() const override { return true; }
- bool CanMaximize() const override { return true; }
- bool CanMinimize() const override { return true; }
base::string16 GetWindowTitle() const override {
return base::ASCIIToUTF16("Views Examples");
}
diff --git a/chromium/ui/views/focus/focus_manager.cc b/chromium/ui/views/focus/focus_manager.cc
index 0b634e3f151..536755394f4 100644
--- a/chromium/ui/views/focus/focus_manager.cc
+++ b/chromium/ui/views/focus/focus_manager.cc
@@ -206,7 +206,9 @@ bool FocusManager::RotatePaneFocus(Direction direction,
continue;
pane->RequestFocus();
- focused_view = GetFocusedView();
+ // |pane| may be in a different widget, so don't assume its focus manager
+ // is |this|.
+ focused_view = pane->GetWidget()->GetFocusManager()->GetFocusedView();
if (pane == focused_view || pane->Contains(focused_view))
return true;
}
@@ -609,7 +611,10 @@ void FocusManager::OnViewIsDeleting(View* view) {
bool FocusManager::RedirectAcceleratorToBubbleAnchorWidget(
const ui::Accelerator& accelerator) {
- Widget* anchor_widget = GetBubbleAnchorWidget();
+ views::BubbleDialogDelegate* widget_delegate =
+ widget_->widget_delegate()->AsBubbleDialogDelegate();
+ Widget* anchor_widget =
+ widget_delegate ? widget_delegate->anchor_widget() : nullptr;
if (!anchor_widget)
return false;
@@ -617,15 +622,32 @@ bool FocusManager::RedirectAcceleratorToBubbleAnchorWidget(
if (!focus_manager->IsAcceleratorRegistered(accelerator))
return false;
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+ // Processing an accelerator can delete things. Because we
+ // need these objects afterwards on Linux, save widget_ as weak pointer and
+ // save the close_on_deactivate property value of widget_delegate in a
+ // variable.
+ base::WeakPtr<Widget> widget_weak_ptr = widget_->GetWeakPtr();
+ const bool close_widget_on_deactivate =
+ widget_delegate->close_on_deactivate();
+#endif
+
// The parent view must be focused for it to process events.
focus_manager->SetFocusedView(anchor_widget->GetRootView());
- return focus_manager->ProcessAccelerator(accelerator);
-}
+ const bool accelerator_processed =
+ focus_manager->ProcessAccelerator(accelerator);
+
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+ // Need to manually close the bubble widget on Linux. On Linux when the
+ // bubble is shown, the main widget remains active. Because of that when
+ // focus is set to the main widget to process accelerator, the main widget
+ // isn't activated and the bubble widget isn't deactivated and closed.
+ if (accelerator_processed && close_widget_on_deactivate) {
+ widget_weak_ptr->CloseWithReason(views::Widget::ClosedReason::kLostFocus);
+ }
+#endif
-Widget* FocusManager::GetBubbleAnchorWidget() {
- BubbleDialogDelegateView* widget_delegate =
- widget_->widget_delegate()->AsBubbleDialogDelegate();
- return widget_delegate ? widget_delegate->anchor_widget() : nullptr;
+ return accelerator_processed;
}
} // namespace views
diff --git a/chromium/ui/views/focus/focus_manager.h b/chromium/ui/views/focus/focus_manager.h
index 8c7888aeff3..bd1a2aef25e 100644
--- a/chromium/ui/views/focus/focus_manager.h
+++ b/chromium/ui/views/focus/focus_manager.h
@@ -336,9 +336,6 @@ class VIEWS_EXPORT FocusManager : public ViewObserver {
bool RedirectAcceleratorToBubbleAnchorWidget(
const ui::Accelerator& accelerator);
- // Returns bubble's anchor widget.
- Widget* GetBubbleAnchorWidget();
-
// Whether arrow key traversal is enabled globally.
static bool arrow_key_traversal_enabled_;
diff --git a/chromium/ui/views/focus/focus_manager_unittest.cc b/chromium/ui/views/focus/focus_manager_unittest.cc
index b4438b0aa46..ff91ea00b53 100644
--- a/chromium/ui/views/focus/focus_manager_unittest.cc
+++ b/chromium/ui/views/focus/focus_manager_unittest.cc
@@ -1244,9 +1244,8 @@ class RedirectToParentFocusManagerTest : public FocusManagerTest {
GetWidget()->GetRootView()->AddChildView(std::make_unique<View>());
anchor->SetFocusBehavior(View::FocusBehavior::ALWAYS);
- BubbleDialogDelegateView* bubble_delegate =
- TestBubbleDialogDelegateView::CreateAndShowBubble(anchor);
- Widget* bubble_widget = bubble_delegate->GetWidget();
+ bubble_ = TestBubbleDialogDelegateView::CreateAndShowBubble(anchor);
+ Widget* bubble_widget = bubble_->GetWidget();
parent_focus_manager_ = anchor->GetFocusManager();
bubble_focus_manager_ = bubble_widget->GetFocusManager();
@@ -1258,8 +1257,10 @@ class RedirectToParentFocusManagerTest : public FocusManagerTest {
}
protected:
- FocusManager* parent_focus_manager_;
- FocusManager* bubble_focus_manager_;
+ FocusManager* parent_focus_manager_ = nullptr;
+ FocusManager* bubble_focus_manager_ = nullptr;
+
+ BubbleDialogDelegateView* bubble_ = nullptr;
};
// Test that when an accelerator is sent to a bubble that isn't registered,
@@ -1267,6 +1268,7 @@ class RedirectToParentFocusManagerTest : public FocusManagerTest {
TEST_F(RedirectToParentFocusManagerTest, ParentHandlesAcceleratorFromBubble) {
ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE);
ui::TestAcceleratorTarget parent_return_target(true);
+ Widget* bubble_widget = bubble_->GetWidget();
EXPECT_EQ(0, parent_return_target.accelerator_count());
parent_focus_manager_->RegisterAccelerator(
@@ -1275,9 +1277,23 @@ TEST_F(RedirectToParentFocusManagerTest, ParentHandlesAcceleratorFromBubble) {
EXPECT_TRUE(
!bubble_focus_manager_->IsAcceleratorRegistered(return_accelerator));
- // Accelerator was proccesed by the parent.
+
+ // The bubble should be closed after parent processed accelerator only if
+ // close_on_deactivate is true.
+ bubble_->set_close_on_deactivate(false);
+ // Accelerator was processed by the parent.
EXPECT_TRUE(bubble_focus_manager_->ProcessAccelerator(return_accelerator));
EXPECT_EQ(parent_return_target.accelerator_count(), 1);
+ EXPECT_FALSE(bubble_widget->IsClosed());
+
+ // Reset focus to the bubble widget. Focus was set to the the main widget
+ // to process accelerator.
+ bubble_focus_manager_->SetFocusedView(bubble_widget->GetRootView());
+
+ bubble_->set_close_on_deactivate(true);
+ EXPECT_TRUE(bubble_focus_manager_->ProcessAccelerator(return_accelerator));
+ EXPECT_EQ(parent_return_target.accelerator_count(), 2);
+ EXPECT_TRUE(bubble_widget->IsClosed());
}
// Test that when an accelerator is sent to a bubble that is registered on both
@@ -1286,6 +1302,7 @@ TEST_F(RedirectToParentFocusManagerTest, BubbleHandlesRegisteredAccelerators) {
ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE);
ui::TestAcceleratorTarget parent_return_target(true);
ui::TestAcceleratorTarget bubble_return_target(true);
+ Widget* bubble_widget = bubble_->GetWidget();
EXPECT_EQ(0, bubble_return_target.accelerator_count());
EXPECT_EQ(0, parent_return_target.accelerator_count());
@@ -1297,10 +1314,32 @@ TEST_F(RedirectToParentFocusManagerTest, BubbleHandlesRegisteredAccelerators) {
return_accelerator, ui::AcceleratorManager::kNormalPriority,
&parent_return_target);
- // Accelerator was proccesed by the bubble and not by the parent.
+ // The bubble shouldn't be closed after it processed accelerator without
+ // passing it to the parent.
+ bubble_->set_close_on_deactivate(true);
+ // Accelerator was processed by the bubble and not by the parent.
EXPECT_TRUE(bubble_focus_manager_->ProcessAccelerator(return_accelerator));
EXPECT_EQ(1, bubble_return_target.accelerator_count());
EXPECT_EQ(0, parent_return_target.accelerator_count());
+ EXPECT_FALSE(bubble_widget->IsClosed());
+}
+
+// Test that when an accelerator is sent to a bubble that isn't registered
+// for either the bubble or the bubble's parent, the bubble isn't closed.
+TEST_F(RedirectToParentFocusManagerTest, NotProcessedAccelerator) {
+ ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE);
+ Widget* bubble_widget = bubble_->GetWidget();
+
+ EXPECT_TRUE(
+ !bubble_focus_manager_->IsAcceleratorRegistered(return_accelerator));
+ EXPECT_TRUE(
+ !parent_focus_manager_->IsAcceleratorRegistered(return_accelerator));
+
+ // The bubble shouldn't be closed if the accelerator was passed to the parent
+ // but the parent didn't process it.
+ bubble_->set_close_on_deactivate(true);
+ EXPECT_FALSE(bubble_focus_manager_->ProcessAccelerator(return_accelerator));
+ EXPECT_FALSE(bubble_widget->IsClosed());
}
#endif
diff --git a/chromium/ui/views/focus/focus_search.cc b/chromium/ui/views/focus/focus_search.cc
index 58f9b621965..1cbf0b156d7 100644
--- a/chromium/ui/views/focus/focus_search.cc
+++ b/chromium/ui/views/focus/focus_search.cc
@@ -203,7 +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) {
- BubbleDialogDelegateView* bubble =
+ BubbleDialogDelegate* bubble =
starting_view->GetProperty(kAnchoredDialogKey);
if (bubble) {
*focus_traversable = bubble->GetWidget()->GetFocusTraversable();
@@ -230,8 +230,7 @@ View* FocusSearch::FindNextFocusableViewImpl(
while (parent && parent != root_) {
if (can_go_into_anchored_dialog ==
AnchoredDialogPolicy::kCanGoIntoAnchoredDialog) {
- BubbleDialogDelegateView* bubble =
- parent->GetProperty(kAnchoredDialogKey);
+ BubbleDialogDelegate* bubble = parent->GetProperty(kAnchoredDialogKey);
if (bubble) {
*focus_traversable = bubble->GetWidget()->GetFocusTraversable();
*focus_traversable_view = starting_view;
@@ -302,7 +301,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) {
- BubbleDialogDelegateView* bubble =
+ BubbleDialogDelegate* bubble =
starting_view->GetProperty(kAnchoredDialogKey);
if (bubble) {
*focus_traversable = bubble->GetWidget()->GetFocusTraversable();
diff --git a/chromium/ui/views/focus/focus_traversal_unittest.cc b/chromium/ui/views/focus/focus_traversal_unittest.cc
index cf5540c9325..c8dcc449f51 100644
--- a/chromium/ui/views/focus/focus_traversal_unittest.cc
+++ b/chromium/ui/views/focus/focus_traversal_unittest.cc
@@ -94,7 +94,7 @@ class DummyComboboxModel : public ui::ComboboxModel {
public:
// Overridden from ui::ComboboxModel:
int GetItemCount() const override { return 10; }
- base::string16 GetItemAt(int index) override {
+ base::string16 GetItemAt(int index) const override {
return ASCIIToUTF16("Item ") + base::NumberToString16(index);
}
};
diff --git a/chromium/ui/views/layout/grid_layout.h b/chromium/ui/views/layout/grid_layout.h
index 5e64d647a62..9c6a82cd127 100644
--- a/chromium/ui/views/layout/grid_layout.h
+++ b/chromium/ui/views/layout/grid_layout.h
@@ -11,7 +11,7 @@
#include <utility>
#include <vector>
-#include "base/logging.h"
+#include "base/check.h"
#include "base/macros.h"
#include "ui/gfx/geometry/size.h"
#include "ui/views/layout/layout_manager.h"
diff --git a/chromium/ui/views/linux_ui/linux_ui.cc b/chromium/ui/views/linux_ui/linux_ui.cc
index 27ae4e29d04..585fea624f8 100644
--- a/chromium/ui/views/linux_ui/linux_ui.cc
+++ b/chromium/ui/views/linux_ui/linux_ui.cc
@@ -28,7 +28,6 @@ void LinuxUI::SetInstance(LinuxUI* instance) {
SkiaFontDelegate::SetInstance(instance);
ShellDialogLinux::SetInstance(instance);
ui::SetTextEditKeyBindingsDelegate(instance);
- ui::CursorThemeManagerLinux::SetInstance(instance);
}
LinuxUI* LinuxUI::instance() {
diff --git a/chromium/ui/views/linux_ui/linux_ui.h b/chromium/ui/views/linux_ui/linux_ui.h
index 55d73138880..7641a91abf0 100644
--- a/chromium/ui/views/linux_ui/linux_ui.h
+++ b/chromium/ui/views/linux_ui/linux_ui.h
@@ -12,7 +12,7 @@
#include "base/macros.h"
#include "build/buildflag.h"
#include "third_party/skia/include/core/SkColor.h"
-#include "ui/base/cursor/cursor_theme_manager_linux.h"
+#include "ui/base/cursor/cursor_theme_manager.h"
#include "ui/base/ime/linux/linux_input_method_context_factory.h"
#include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h"
#include "ui/gfx/animation/animation_settings_provider_linux.h"
@@ -55,7 +55,7 @@ class VIEWS_EXPORT LinuxUI : public ui::LinuxInputMethodContextFactory,
public gfx::SkiaFontDelegate,
public ui::ShellDialogLinux,
public ui::TextEditKeyBindingsDelegateAuraLinux,
- public ui::CursorThemeManagerLinux,
+ public ui::CursorThemeManager,
public gfx::AnimationSettingsProviderLinux {
public:
using UseSystemThemeCallback =
diff --git a/chromium/ui/views/native_cursor_mac.mm b/chromium/ui/views/native_cursor_mac.mm
index 967484deb72..9d9c1c46abd 100644
--- a/chromium/ui/views/native_cursor_mac.mm
+++ b/chromium/ui/views/native_cursor_mac.mm
@@ -6,6 +6,8 @@
#include <Cocoa/Cocoa.h>
+#include "base/notreached.h"
+
namespace views {
gfx::NativeCursor GetNativeIBeamCursor() {
diff --git a/chromium/ui/views/touchui/touch_selection_controller_impl.cc b/chromium/ui/views/touchui/touch_selection_controller_impl.cc
index a2da9320fb2..a5dbd5b1750 100644
--- a/chromium/ui/views/touchui/touch_selection_controller_impl.cc
+++ b/chromium/ui/views/touchui/touch_selection_controller_impl.cc
@@ -71,21 +71,6 @@ constexpr int kSelectionHandleBarMinHeight = 5;
// boundaries.
constexpr int kSelectionHandleBarBottomAllowance = 3;
-// Creates a widget to host SelectionHandleView.
-views::Widget* CreateTouchSelectionPopupWidget(
- gfx::NativeView parent,
- views::WidgetDelegate* widget_delegate) {
- views::Widget* widget = new views::Widget;
- views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
- params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
- params.shadow_type = views::Widget::InitParams::ShadowType::kNone;
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- params.parent = parent;
- params.delegate = widget_delegate;
- widget->Init(std::move(params));
- return widget;
-}
-
gfx::Image* GetCenterHandleImage() {
static gfx::Image* handle_image = nullptr;
if (!handle_image) {
@@ -209,8 +194,7 @@ namespace views {
using EditingHandleView = TouchSelectionControllerImpl::EditingHandleView;
// A View that displays the text selection handle.
-class TouchSelectionControllerImpl::EditingHandleView
- : public WidgetDelegateView {
+class TouchSelectionControllerImpl::EditingHandleView : public View {
public:
EditingHandleView(TouchSelectionControllerImpl* controller,
gfx::NativeView parent,
@@ -218,28 +202,33 @@ class TouchSelectionControllerImpl::EditingHandleView
: controller_(controller),
image_(GetCenterHandleImage()),
is_cursor_handle_(is_cursor_handle),
- draw_invisible_(false) {
- widget_.reset(CreateTouchSelectionPopupWidget(parent, this));
+ draw_invisible_(false),
+ widget_(new views::Widget) {
+ // Create a widget to host EditingHandleView.
+ views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
+ params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
+ params.shadow_type = views::Widget::InitParams::ShadowType::kNone;
+ params.parent = parent;
+ widget_->Init(std::move(params));
+
+ widget_->GetNativeWindow()->SetEventTargeter(
+ std::make_unique<aura::WindowTargeter>());
+ widget_->SetContentsView(this);
+ }
- targeter_ = new aura::WindowTargeter();
- aura::Window* window = widget_->GetNativeWindow();
- window->SetEventTargeter(std::unique_ptr<aura::WindowTargeter>(targeter_));
+ EditingHandleView(const EditingHandleView&) = delete;
+ EditingHandleView& operator=(const EditingHandleView&) = delete;
+ ~EditingHandleView() override = default;
- // We are owned by the TouchSelectionControllerImpl.
- set_owned_by_client();
+ void CloseHandleWidget() {
+ SetWidgetVisible(false);
+ widget_->CloseNow();
}
- ~EditingHandleView() override { SetWidgetVisible(false, false); }
-
gfx::SelectionBound::Type selection_bound_type() {
return selection_bound_.type();
}
- // WidgetDelegateView:
- void DeleteDelegate() override {
- // We are owned and deleted by TouchSelectionControllerImpl.
- }
-
// View:
void OnPaint(gfx::Canvas* canvas) override {
if (draw_invisible_)
@@ -271,14 +260,7 @@ class TouchSelectionControllerImpl::EditingHandleView
}
case ui::ET_GESTURE_SCROLL_END:
case ui::ET_SCROLL_FLING_START: {
- // Use a weak pointer to the handle to make sure the handle and its
- // owning selection controller is not destroyed by the capture release
- // to diagnose a crash on Windows (see crbug.com/459423)
- // TODO(mohsen): Delete the diagnostics code when the crash is fixed.
- base::WeakPtr<EditingHandleView> weak_ptr =
- weak_ptr_factory_.GetWeakPtr();
widget_->ReleaseCapture();
- CHECK(weak_ptr);
controller_->SetDraggingHandle(nullptr);
break;
}
@@ -297,11 +279,9 @@ class TouchSelectionControllerImpl::EditingHandleView
bool IsWidgetVisible() const { return widget_->IsVisible(); }
- void SetWidgetVisible(bool visible, bool quick) {
+ void SetWidgetVisible(bool visible) {
if (widget_->IsVisible() == visible)
return;
- widget_->SetVisibilityAnimationDuration(
- quick ? base::TimeDelta::FromMilliseconds(50) : base::TimeDelta());
if (visible)
widget_->Show();
else
@@ -349,7 +329,10 @@ class TouchSelectionControllerImpl::EditingHandleView
const gfx::Insets insets(
selection_bound_.GetHeight() + kSelectionHandleVerticalVisualOffset, 0,
0, 0);
- targeter_->SetInsets(insets, insets);
+
+ // Shifts the hit-test target below the apparent bounds to make dragging
+ // easier.
+ widget_->GetNativeWindow()->targeter()->SetInsets(insets, insets);
}
void SetDrawInvisible(bool draw_invisible) {
@@ -360,15 +343,8 @@ class TouchSelectionControllerImpl::EditingHandleView
}
private:
- std::unique_ptr<Widget> widget_;
TouchSelectionControllerImpl* controller_;
- // A WindowTargeter that shifts the hit-test target below the apparent bounds
- // to make dragging easier. The |widget_|'s NativeWindow takes ownership over
- // the |targeter_| but since the |widget_|'s lifetime is known to this class,
- // it can safely access the |targeter_|.
- aura::WindowTargeter* targeter_;
-
// In local coordinates
gfx::SelectionBound selection_bound_;
gfx::Image* image_;
@@ -388,9 +364,8 @@ class TouchSelectionControllerImpl::EditingHandleView
// handle.
bool draw_invisible_;
- base::WeakPtrFactory<EditingHandleView> weak_ptr_factory_{this};
-
- DISALLOW_COPY_AND_ASSIGN(EditingHandleView);
+ // Owning widget.
+ Widget* widget_ = nullptr;
};
TouchSelectionControllerImpl::TouchSelectionControllerImpl(
@@ -423,6 +398,11 @@ TouchSelectionControllerImpl::~TouchSelectionControllerImpl() {
aura::Env::GetInstance()->RemoveEventObserver(this);
if (client_widget_)
client_widget_->RemoveObserver(this);
+ // Close the owning Widgets to clean up the EditingHandleViews.
+ selection_handle_1_->CloseHandleWidget();
+ selection_handle_2_->CloseHandleWidget();
+ cursor_handle_->CloseHandleWidget();
+ CHECK(!IsInObserverList());
}
void TouchSelectionControllerImpl::SelectionChanged() {
@@ -477,11 +457,11 @@ void TouchSelectionControllerImpl::SelectionChanged() {
// TODO(varunjain): Fix this: crbug.com/269003
dragging_handle_->SetDrawInvisible(!ShouldShowHandleFor(focus));
- if (dragging_handle_ != cursor_handle_.get()) {
+ if (dragging_handle_ != cursor_handle_) {
// The non-dragging-handle might have recently become visible.
- EditingHandleView* non_dragging_handle = selection_handle_1_.get();
- if (dragging_handle_ == selection_handle_1_.get()) {
- non_dragging_handle = selection_handle_2_.get();
+ EditingHandleView* non_dragging_handle = selection_handle_1_;
+ if (dragging_handle_ == selection_handle_1_) {
+ non_dragging_handle = selection_handle_2_;
// if handle 1 is being dragged, it is corresponding to the end of
// selection and the other handle to the start of selection.
selection_bound_1_ = screen_bound_focus;
@@ -497,30 +477,18 @@ void TouchSelectionControllerImpl::SelectionChanged() {
// Check if there is any selection at all.
if (screen_bound_anchor.edge_start() == screen_bound_focus.edge_start() &&
screen_bound_anchor.edge_end() == screen_bound_focus.edge_end()) {
- selection_handle_1_->SetWidgetVisible(false, false);
- selection_handle_2_->SetWidgetVisible(false, false);
- SetHandleBound(cursor_handle_.get(), anchor, screen_bound_anchor_clipped);
+ selection_handle_1_->SetWidgetVisible(false);
+ selection_handle_2_->SetWidgetVisible(false);
+ SetHandleBound(cursor_handle_, anchor, screen_bound_anchor_clipped);
return;
}
- cursor_handle_->SetWidgetVisible(false, false);
- SetHandleBound(selection_handle_1_.get(), anchor,
- screen_bound_anchor_clipped);
- SetHandleBound(selection_handle_2_.get(), focus,
- screen_bound_focus_clipped);
+ cursor_handle_->SetWidgetVisible(false);
+ SetHandleBound(selection_handle_1_, anchor, screen_bound_anchor_clipped);
+ SetHandleBound(selection_handle_2_, focus, screen_bound_focus_clipped);
}
}
-bool TouchSelectionControllerImpl::IsHandleDragInProgress() {
- return !!dragging_handle_;
-}
-
-void TouchSelectionControllerImpl::HideHandles(bool quick) {
- selection_handle_1_->SetWidgetVisible(false, quick);
- selection_handle_2_->SetWidgetVisible(false, quick);
- cursor_handle_->SetWidgetVisible(false, quick);
-}
-
void TouchSelectionControllerImpl::ShowQuickMenuImmediatelyForTesting() {
if (quick_menu_timer_.IsRunning()) {
quick_menu_timer_.Stop();
@@ -543,15 +511,15 @@ void TouchSelectionControllerImpl::SelectionHandleDragged(
gfx::Point drag_pos_in_client = drag_pos;
ConvertPointToClientView(dragging_handle_, &drag_pos_in_client);
- if (dragging_handle_ == cursor_handle_.get()) {
+ if (dragging_handle_ == cursor_handle_) {
client_view_->MoveCaretTo(drag_pos_in_client);
return;
}
// Find the stationary selection handle.
- gfx::SelectionBound anchor_bound =
- selection_handle_1_.get() == dragging_handle_ ? selection_bound_2_
- : selection_bound_1_;
+ gfx::SelectionBound anchor_bound = selection_handle_1_ == dragging_handle_
+ ? selection_bound_2_
+ : selection_bound_1_;
// Find selection end points in client_view's coordinate system.
gfx::Point p2 = anchor_bound.edge_start_rounded();
@@ -575,7 +543,7 @@ void TouchSelectionControllerImpl::SetHandleBound(
EditingHandleView* handle,
const gfx::SelectionBound& bound,
const gfx::SelectionBound& bound_in_screen) {
- handle->SetWidgetVisible(ShouldShowHandleFor(bound), false);
+ handle->SetWidgetVisible(ShouldShowHandleFor(bound));
handle->SetBoundInScreen(bound_in_screen, handle->IsWidgetVisible());
}
@@ -750,12 +718,12 @@ gfx::Rect TouchSelectionControllerImpl::GetExpectedHandleBounds(
return GetSelectionWidgetBounds(bound);
}
-WidgetDelegateView* TouchSelectionControllerImpl::GetHandle1View() {
- return selection_handle_1_.get();
+View* TouchSelectionControllerImpl::GetHandle1View() {
+ return selection_handle_1_;
}
-WidgetDelegateView* TouchSelectionControllerImpl::GetHandle2View() {
- return selection_handle_2_.get();
+View* TouchSelectionControllerImpl::GetHandle2View() {
+ return selection_handle_2_;
}
} // namespace views
diff --git a/chromium/ui/views/touchui/touch_selection_controller_impl.h b/chromium/ui/views/touchui/touch_selection_controller_impl.h
index af43216b179..a1e3b6291fc 100644
--- a/chromium/ui/views/touchui/touch_selection_controller_impl.h
+++ b/chromium/ui/views/touchui/touch_selection_controller_impl.h
@@ -19,7 +19,6 @@
#include "ui/views/widget/widget_observer.h"
namespace views {
-class WidgetDelegateView;
// Touch specific implementation of TouchEditingControllerDeprecated.
// Responsible for displaying selection handles and menu elements relevant in a
@@ -34,12 +33,13 @@ class VIEWS_EXPORT TouchSelectionControllerImpl
// Use ui::TouchEditingControllerFactory::Create() instead.
explicit TouchSelectionControllerImpl(ui::TouchEditable* client_view);
+ TouchSelectionControllerImpl(const TouchSelectionControllerImpl&) = delete;
+ TouchSelectionControllerImpl& operator=(const TouchSelectionControllerImpl&) =
+ delete;
~TouchSelectionControllerImpl() override;
// ui::TouchEditingControllerDeprecated:
void SelectionChanged() override;
- bool IsHandleDragInProgress() override;
- void HideHandles(bool quick) override;
void ShowQuickMenuImmediatelyForTesting();
@@ -108,14 +108,16 @@ class VIEWS_EXPORT TouchSelectionControllerImpl
bool IsSelectionHandle2Visible();
bool IsCursorHandleVisible();
gfx::Rect GetExpectedHandleBounds(const gfx::SelectionBound& bound);
- WidgetDelegateView* GetHandle1View();
- WidgetDelegateView* GetHandle2View();
+ View* GetHandle1View();
+ View* GetHandle2View();
ui::TouchEditable* client_view_;
Widget* client_widget_ = nullptr;
- std::unique_ptr<EditingHandleView> selection_handle_1_;
- std::unique_ptr<EditingHandleView> selection_handle_2_;
- std::unique_ptr<EditingHandleView> cursor_handle_;
+ // Non-owning pointers to EditingHandleViews. These views are owned by their
+ // Widget and cleaned up when their Widget closes.
+ EditingHandleView* selection_handle_1_;
+ EditingHandleView* selection_handle_2_;
+ EditingHandleView* cursor_handle_;
bool command_executed_ = false;
base::TimeTicks selection_start_time_;
@@ -138,8 +140,6 @@ class VIEWS_EXPORT TouchSelectionControllerImpl
// Selection bounds, clipped to client view's boundaries.
gfx::SelectionBound selection_bound_1_clipped_;
gfx::SelectionBound selection_bound_2_clipped_;
-
- DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerImpl);
};
} // namespace views
diff --git a/chromium/ui/views/touchui/touch_selection_controller_impl_unittest.cc b/chromium/ui/views/touchui/touch_selection_controller_impl_unittest.cc
index b2f2d5c4b99..c54289850cc 100644
--- a/chromium/ui/views/touchui/touch_selection_controller_impl_unittest.cc
+++ b/chromium/ui/views/touchui/touch_selection_controller_impl_unittest.cc
@@ -147,7 +147,7 @@ class TouchSelectionControllerImplTest : public ViewsTestBase {
void SimulateSelectionHandleDrag(gfx::Vector2d v, int selection_handle) {
TouchSelectionControllerImpl* controller = GetSelectionController();
- views::WidgetDelegateView* handle = nullptr;
+ views::View* handle = nullptr;
if (selection_handle == 1)
handle = controller->GetHandle1View();
else
diff --git a/chromium/ui/views/touchui/touch_selection_menu_views.cc b/chromium/ui/views/touchui/touch_selection_menu_views.cc
index 8b014f1386d..6cc5d4b6ce4 100644
--- a/chromium/ui/views/touchui/touch_selection_menu_views.cc
+++ b/chromium/ui/views/touchui/touch_selection_menu_views.cc
@@ -36,7 +36,6 @@ struct MenuCommand {
};
constexpr int kSpacingBetweenButtons = 2;
-constexpr int kEllipsesButtonTag = -1;
} // namespace
@@ -126,18 +125,21 @@ void TouchSelectionMenuViews::CreateButtons() {
if (!client_->IsCommandIdEnabled(command.command_id))
continue;
- Button* button = CreateButton(l10n_util::GetStringUTF16(command.message_id),
- command.command_id);
+ Button* button =
+ CreateButton(l10n_util::GetStringUTF16(command.message_id));
+ button->set_tag(command.command_id);
AddChildView(button);
}
- // Finally, add ellipses button.
- AddChildView(CreateButton(base::ASCIIToUTF16("..."), kEllipsesButtonTag));
+ // Finally, add ellipsis button.
+ LabelButton* ellipsis_button = CreateButton(base::ASCIIToUTF16("..."));
+ ellipsis_button->SetID(ButtonViewId::kEllipsisButton);
+ AddChildView(ellipsis_button);
InvalidateLayout();
}
-LabelButton* TouchSelectionMenuViews::CreateButton(const base::string16& title,
- int tag) {
+LabelButton* TouchSelectionMenuViews::CreateButton(
+ const base::string16& title) {
base::string16 label =
gfx::RemoveAcceleratorChar(title, '&', nullptr, nullptr);
LabelButton* button = new LabelButton(this, label, style::CONTEXT_TOUCH_MENU);
@@ -145,7 +147,6 @@ LabelButton* TouchSelectionMenuViews::CreateButton(const base::string16& title,
button->SetMinSize(kMenuButtonMinSize);
button->SetFocusForPlatform();
button->SetHorizontalAlignment(gfx::ALIGN_CENTER);
- button->set_tag(tag);
return button;
}
@@ -180,7 +181,7 @@ void TouchSelectionMenuViews::WindowClosing() {
void TouchSelectionMenuViews::ButtonPressed(Button* sender,
const ui::Event& event) {
CloseMenu();
- if (sender->tag() != kEllipsesButtonTag)
+ if (sender->GetID() != ButtonViewId::kEllipsisButton)
client_->ExecuteCommand(sender->tag(), event.flags());
else
client_->RunContextMenu();
diff --git a/chromium/ui/views/touchui/touch_selection_menu_views.h b/chromium/ui/views/touchui/touch_selection_menu_views.h
index ad1819ee56a..77121939b18 100644
--- a/chromium/ui/views/touchui/touch_selection_menu_views.h
+++ b/chromium/ui/views/touchui/touch_selection_menu_views.h
@@ -24,6 +24,8 @@ class VIEWS_EXPORT TouchSelectionMenuViews : public BubbleDialogDelegateView,
public:
METADATA_HEADER(TouchSelectionMenuViews);
+ enum ButtonViewId : int { kEllipsisButton = 1 };
+
TouchSelectionMenuViews(TouchSelectionMenuRunnerViews* owner,
ui::TouchSelectionMenuClient* client,
aura::Window* context);
@@ -45,7 +47,7 @@ class VIEWS_EXPORT TouchSelectionMenuViews : public BubbleDialogDelegateView,
virtual void CreateButtons();
// Helper method to create a single button.
- LabelButton* CreateButton(const base::string16& title, int tag);
+ LabelButton* CreateButton(const base::string16& title);
// ButtonListener:
void ButtonPressed(Button* sender, const ui::Event& event) override;
diff --git a/chromium/ui/views/vector_icons/vector_icons.cc.template b/chromium/ui/views/vector_icons/vector_icons.cc.template
index df1e9f7613d..7ebccd79e63 100644
--- a/chromium/ui/views/vector_icons/vector_icons.cc.template
+++ b/chromium/ui/views/vector_icons/vector_icons.cc.template
@@ -7,7 +7,6 @@
#include "ui/views/vector_icons.h"
-#include "base/logging.h"
#include "components/vector_icons/cc_macros.h"
#include "ui/gfx/vector_icon_types.h"
diff --git a/chromium/ui/views/view.cc b/chromium/ui/views/view.cc
index 00b654c8e4f..186b6c5f5cd 100644
--- a/chromium/ui/views/view.cc
+++ b/chromium/ui/views/view.cc
@@ -192,6 +192,13 @@ View::~View() {
if (parent_)
parent_->RemoveChildView(this);
+ // Need to remove layout manager before deleting children because if we do not
+ // it is possible for layout-related calls (e.g. CalculatePreferredSize()) to
+ // be called on this view during one of the callbacks below. Since most
+ // layout managers access child view properties, this would result in a
+ // use-after-free error.
+ layout_manager_.reset();
+
{
internal::ScopedChildrenLock lock(this);
for (auto* child : children_) {
@@ -511,8 +518,10 @@ void View::SetVisible(bool visible) {
// Notify the parent.
if (parent_) {
parent_->ChildVisibilityChanged(this);
- parent_->NotifyAccessibilityEvent(ax::mojom::Event::kChildrenChanged,
- true);
+ if (!view_accessibility_ || !view_accessibility_->IsIgnored()) {
+ parent_->NotifyAccessibilityEvent(ax::mojom::Event::kChildrenChanged,
+ true);
+ }
}
// This notifies all sub-views recursively.
@@ -1973,7 +1982,13 @@ void View::OnFocus() {
// TODO(beng): Investigate whether it's possible for us to move this to
// Focus().
// Notify assistive technologies of the focus change.
- NotifyAccessibilityEvent(ax::mojom::Event::kFocus, true);
+ AXVirtualView* focused_virtual_child =
+ view_accessibility_ ? view_accessibility_->FocusedVirtualChild()
+ : nullptr;
+ if (focused_virtual_child)
+ focused_virtual_child->NotifyAccessibilityEvent(ax::mojom::Event::kFocus);
+ else
+ NotifyAccessibilityEvent(ax::mojom::Event::kFocus, true);
}
void View::OnBlur() {}
@@ -2288,7 +2303,7 @@ void View::AddChildViewAtImpl(View* view, int index) {
ViewHierarchyChangedDetails details(true, this, view, parent);
for (View* v = this; v; v = v->parent_)
- v->ViewHierarchyChangedImpl(false, details);
+ v->ViewHierarchyChangedImpl(details);
view->PropagateAddNotifications(details, widget && widget != old_widget);
@@ -2378,9 +2393,13 @@ void View::PropagateRemoveNotifications(View* old_parent,
}
}
+ // When a view is removed from a hierarchy, UnregisterAccelerators() is called
+ // for the removed view and all descendant views in post-order.
+ UnregisterAccelerators(true);
+
ViewHierarchyChangedDetails details(false, old_parent, this, new_parent);
for (View* v = this; v; v = v->parent_)
- v->ViewHierarchyChangedImpl(true, details);
+ v->ViewHierarchyChangedImpl(details);
if (is_removed_from_widget) {
RemovedFromWidget();
@@ -2391,12 +2410,22 @@ void View::PropagateRemoveNotifications(View* old_parent,
void View::PropagateAddNotifications(const ViewHierarchyChangedDetails& details,
bool is_added_to_widget) {
+ // When a view is added to a Widget hierarchy, RegisterPendingAccelerators()
+ // will be called for the added view and all its descendants in pre-order.
+ // This means that descendant views will register their accelerators after
+ // their parents. This allows children to override accelerators registered by
+ // their parents as accelerators registered later take priority over those
+ // registered earlier.
+ if (GetFocusManager())
+ RegisterPendingAccelerators();
+
{
internal::ScopedChildrenLock lock(this);
for (auto* child : children_)
child->PropagateAddNotifications(details, is_added_to_widget);
}
- ViewHierarchyChangedImpl(true, details);
+
+ ViewHierarchyChangedImpl(details);
if (is_added_to_widget) {
AddedToWidget();
for (ViewObserver& observer : observers_)
@@ -2414,21 +2443,9 @@ void View::PropagateNativeViewHierarchyChanged() {
}
void View::ViewHierarchyChangedImpl(
- bool register_accelerators,
const ViewHierarchyChangedDetails& details) {
- if (register_accelerators) {
- if (details.is_add) {
- // If you get this registration, you are part of a subtree that has been
- // added to the view hierarchy.
- if (GetFocusManager())
- RegisterPendingAccelerators();
- } else {
- if (details.child == this)
- UnregisterAccelerators(true);
- }
- }
-
ViewHierarchyChanged(details);
+
for (ViewObserver& observer : observers_)
observer.OnViewHierarchyChanged(this, details);
diff --git a/chromium/ui/views/view.h b/chromium/ui/views/view.h
index 1f4f1eb78fe..23b5d3ffd8b 100644
--- a/chromium/ui/views/view.h
+++ b/chromium/ui/views/view.h
@@ -1683,10 +1683,8 @@ class VIEWS_EXPORT View : public ui::LayerDelegate,
// children.
void PropagateNativeViewHierarchyChanged();
- // Takes care of registering/unregistering accelerators if
- // |register_accelerators| true and calls ViewHierarchyChanged().
- void ViewHierarchyChangedImpl(bool register_accelerators,
- const ViewHierarchyChangedDetails& details);
+ // Calls ViewHierarchyChanged() and notifies observers.
+ void ViewHierarchyChangedImpl(const ViewHierarchyChangedDetails& details);
// Size and disposition ------------------------------------------------------
diff --git a/chromium/ui/views/view_class_properties.cc b/chromium/ui/views/view_class_properties.cc
index 0409ce2d73b..1dec102808a 100644
--- a/chromium/ui/views/view_class_properties.cc
+++ b/chromium/ui/views/view_class_properties.cc
@@ -20,7 +20,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::BubbleDialogDelegateView*)
+ views::BubbleDialogDelegate*)
DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT,
views::HighlightPathGenerator*)
@@ -31,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::BubbleDialogDelegateView*,
+DEFINE_UI_CLASS_PROPERTY_KEY(views::BubbleDialogDelegate*,
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 c815cd936d3..f106354a6ad 100644
--- a/chromium/ui/views/view_class_properties.h
+++ b/chromium/ui/views/view_class_properties.h
@@ -14,7 +14,7 @@ class Insets;
namespace views {
-class BubbleDialogDelegateView;
+class BubbleDialogDelegate;
class FlexSpecification;
class HighlightPathGenerator;
@@ -41,7 +41,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<BubbleDialogDelegateView*>* const
+VIEWS_EXPORT extern const ui::ClassProperty<BubbleDialogDelegate*>* const
kAnchoredDialogKey;
// A property to store a highlight-path generator. This generator is used to
@@ -63,7 +63,7 @@ VIEWS_EXPORT extern const ui::ClassProperty<FlexSpecification*>* const
// 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::BubbleDialogDelegateView*)
+ views::BubbleDialogDelegate*)
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_model.h b/chromium/ui/views/view_model.h
index 4a46bab09b6..578c22709fd 100644
--- a/chromium/ui/views/view_model.h
+++ b/chromium/ui/views/view_model.h
@@ -7,7 +7,7 @@
#include <vector>
-#include "base/logging.h"
+#include "base/check_op.h"
#include "base/macros.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/views/views_export.h"
diff --git a/chromium/ui/views/view_targeter_unittest.cc b/chromium/ui/views/view_targeter_unittest.cc
index edae0b1b093..f2994f9a157 100644
--- a/chromium/ui/views/view_targeter_unittest.cc
+++ b/chromium/ui/views/view_targeter_unittest.cc
@@ -128,11 +128,10 @@ TEST_F(ViewTargeterTest, ViewTargeterForKeyEvents) {
widget.Init(std::move(init_params));
widget.Show();
- View* content = new View;
View* child = new View;
View* grandchild = new View;
- widget.SetContentsView(content);
+ View* content = widget.SetContentsView(std::make_unique<View>());
content->AddChildView(child);
child->AddChildView(grandchild);
@@ -174,14 +173,14 @@ TEST_F(ViewTargeterTest, ViewTargeterForScrollEvents) {
widget.Init(std::move(init_params));
// The coordinates used for SetBounds() are in the parent coordinate space.
- View* content = new View;
- content->SetBounds(0, 0, 100, 100);
+ auto owning_content = std::make_unique<View>();
+ owning_content->SetBounds(0, 0, 100, 100);
View* child = new View;
child->SetBounds(50, 50, 20, 20);
View* grandchild = new View;
grandchild->SetBounds(0, 0, 5, 5);
- widget.SetContentsView(content);
+ View* content = widget.SetContentsView(std::move(owning_content));
content->AddChildView(child);
child->AddChildView(grandchild);
@@ -245,14 +244,13 @@ TEST_F(ViewTargeterTest, ViewTargeterForGestureEvents) {
widget.Init(std::move(init_params));
// The coordinates used for SetBounds() are in the parent coordinate space.
- View* content = new View;
- content->SetBounds(0, 0, 100, 100);
View* child = new View;
child->SetBounds(50, 50, 20, 20);
View* grandchild = new View;
grandchild->SetBounds(0, 0, 5, 5);
- widget.SetContentsView(content);
+ View* content = widget.SetContentsView(std::make_unique<View>());
+ content->SetBounds(0, 0, 100, 100);
content->AddChildView(child);
child->AddChildView(grandchild);
@@ -355,9 +353,9 @@ TEST_F(ViewTargeterTest, TargetContentsAndRootView) {
widget.Init(std::move(init_params));
// The coordinates used for SetBounds() are in the parent coordinate space.
- View* content = new View;
- content->SetBounds(0, 0, 100, 100);
- widget.SetContentsView(content);
+ auto owning_content = std::make_unique<View>();
+ owning_content->SetBounds(0, 0, 100, 100);
+ View* content = widget.SetContentsView(std::move(owning_content));
internal::RootView* root_view =
static_cast<internal::RootView*>(widget.GetRootView());
@@ -437,8 +435,6 @@ TEST_F(ViewTargeterTest, GestureEventCoordinateConversion) {
widget.Init(std::move(init_params));
// The coordinates used for SetBounds() are in the parent coordinate space.
- View* content = new View;
- content->SetBounds(0, 0, 100, 100);
View* child = new View;
child->SetBounds(50, 50, 20, 20);
View* grandchild = new View;
@@ -446,7 +442,8 @@ TEST_F(ViewTargeterTest, GestureEventCoordinateConversion) {
View* great_grandchild = new View;
great_grandchild->SetBounds(3, 3, 4, 4);
- widget.SetContentsView(content);
+ View* content = widget.SetContentsView(std::make_unique<View>());
+ content->SetBounds(0, 0, 100, 100);
content->AddChildView(child);
child->AddChildView(grandchild);
grandchild->AddChildView(great_grandchild);
diff --git a/chromium/ui/views/view_unittest.cc b/chromium/ui/views/view_unittest.cc
index dd69ffe1c53..7613c1939c8 100644
--- a/chromium/ui/views/view_unittest.cc
+++ b/chromium/ui/views/view_unittest.cc
@@ -53,6 +53,7 @@
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/metadata/metadata_types.h"
#include "ui/views/paint_info.h"
+#include "ui/views/test/view_metadata_test_utils.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/view_observer.h"
#include "ui/views/views_features.h"
@@ -285,6 +286,15 @@ class TestView : public View {
};
////////////////////////////////////////////////////////////////////////////////
+// Metadata
+////////////////////////////////////////////////////////////////////////////////
+
+TEST_F(ViewTest, MetadataTest) {
+ auto test_view = std::make_unique<TestView>();
+ test::TestViewMetadata(test_view.get());
+}
+
+////////////////////////////////////////////////////////////////////////////////
// Layout
////////////////////////////////////////////////////////////////////////////////
diff --git a/chromium/ui/views/views_features.cc b/chromium/ui/views/views_features.cc
index 13bf1c9f0e2..b3702c04028 100644
--- a/chromium/ui/views/views_features.cc
+++ b/chromium/ui/views/views_features.cc
@@ -34,5 +34,10 @@ const base::Feature kEnableViewPaintOptimization{
const base::Feature kTextfieldFocusOnTapUp{"TextfieldFocusOnTapUp",
base::FEATURE_DISABLED_BY_DEFAULT};
+// Allows a "New" badge to be displayed on menu items that provide access to new
+// features.
+const base::Feature kEnableNewBadgeOnMenuItems{
+ "EnableNewBadgeOnMenuItems", base::FEATURE_DISABLED_BY_DEFAULT};
+
} // namespace features
} // namespace views
diff --git a/chromium/ui/views/views_features.h b/chromium/ui/views/views_features.h
index e4340bbb13a..f0f77154191 100644
--- a/chromium/ui/views/views_features.h
+++ b/chromium/ui/views/views_features.h
@@ -18,6 +18,7 @@ VIEWS_EXPORT extern const base::Feature kEnableMDRoundedCornersOnDialogs;
VIEWS_EXPORT extern const base::Feature kEnablePlatformHighContrastInkDrop;
VIEWS_EXPORT extern const base::Feature kEnableViewPaintOptimization;
VIEWS_EXPORT extern const base::Feature kTextfieldFocusOnTapUp;
+VIEWS_EXPORT extern const base::Feature kEnableNewBadgeOnMenuItems;
} // namespace features
} // namespace views
diff --git a/chromium/ui/views/widget/ax_native_widget_mac_unittest.mm b/chromium/ui/views/widget/ax_native_widget_mac_unittest.mm
index faf79e0e6c7..ca7575056b0 100644
--- a/chromium/ui/views/widget/ax_native_widget_mac_unittest.mm
+++ b/chromium/ui/views/widget/ax_native_widget_mac_unittest.mm
@@ -772,7 +772,7 @@ class TestComboboxModel : public ui::ComboboxModel {
// ui::ComboboxModel:
int GetItemCount() const override { return 2; }
- base::string16 GetItemAt(int index) override {
+ base::string16 GetItemAt(int index) const override {
return index == 0 ? base::SysNSStringToUTF16(kTestStringValue)
: base::ASCIIToUTF16("Second Item");
}
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc
index 3ee330f3598..80090c42e7d 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc
@@ -11,7 +11,6 @@
#include "base/macros.h"
#include "base/memory/ptr_util.h"
-#include "base/metrics/histogram_macros.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/aura/client/capture_client.h"
#include "ui/aura/client/drag_drop_client.h"
@@ -24,6 +23,7 @@
#include "ui/base/dragdrop/os_exchange_data_provider_x11.h"
#include "ui/base/layout.h"
#include "ui/base/x/selection_utils.h"
+#include "ui/base/x/x11_cursor.h"
#include "ui/base/x/x11_drag_context.h"
#include "ui/base/x/x11_util.h"
#include "ui/base/x/x11_whole_screen_move_loop.h"
@@ -32,6 +32,7 @@
#include "ui/events/event_utils.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/x/x11.h"
+#include "ui/gfx/x/xproto.h"
#include "ui/platform_window/x11/x11_topmost_window_finder.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/widget/desktop_aura/desktop_native_cursor_manager.h"
@@ -115,9 +116,8 @@ DesktopDragDropClientAuraX11*
DesktopDragDropClientAuraX11::DesktopDragDropClientAuraX11(
aura::Window* root_window,
views::DesktopNativeCursorManager* cursor_manager,
- ::Display* display,
- XID window)
- : XDragDropClient(this, display, window),
+ x11::Window window)
+ : XDragDropClient(this, window),
root_window_(root_window),
cursor_manager_(cursor_manager) {}
@@ -140,9 +140,6 @@ int DesktopDragDropClientAuraX11::StartDragAndDrop(
const gfx::Point& /*screen_location*/,
int operation,
ui::DragDropTypes::DragEventSource source) {
- UMA_HISTOGRAM_ENUMERATION("Event.DragDrop.Start", source,
- ui::DragDropTypes::DRAG_EVENT_SOURCE_COUNT);
-
DCHECK(!g_current_drag_drop_client);
g_current_drag_drop_client = this;
@@ -171,28 +168,24 @@ int DesktopDragDropClientAuraX11::StartDragAndDrop(
// Windows has a specific method, DoDragDrop(), which performs the entire
// drag. We have to emulate this, so we spin off a nested runloop which will
// track all cursor movement and reroute events to a specific handler.
+ auto* last_cursor = static_cast<ui::X11Cursor*>(
+ source_window->GetHost()->last_cursor().platform());
move_loop_->RunMoveLoop(
!source_window->HasCapture(),
- source_window->GetHost()->last_cursor().platform(),
- cursor_manager_->GetInitializedCursor(ui::mojom::CursorType::kGrabbing)
- .platform());
+ last_cursor ? last_cursor->xcursor() : x11::None,
+ static_cast<ui::X11Cursor*>(
+ cursor_manager_
+ ->GetInitializedCursor(ui::mojom::CursorType::kGrabbing)
+ .platform())
+ ->xcursor());
if (alive) {
auto resulting_operation = negotiated_operation();
- if (resulting_operation == ui::DragDropTypes::DRAG_NONE) {
- UMA_HISTOGRAM_ENUMERATION("Event.DragDrop.Cancel", source,
- ui::DragDropTypes::DRAG_EVENT_SOURCE_COUNT);
- } else {
- UMA_HISTOGRAM_ENUMERATION("Event.DragDrop.Drop", source,
- ui::DragDropTypes::DRAG_EVENT_SOURCE_COUNT);
- }
drag_widget_.reset();
g_current_drag_drop_client = nullptr;
CleanupDrag();
return resulting_operation;
}
- UMA_HISTOGRAM_ENUMERATION("Event.DragDrop.Cancel", source,
- ui::DragDropTypes::DRAG_EVENT_SOURCE_COUNT);
return ui::DragDropTypes::DRAG_NONE;
}
@@ -214,12 +207,13 @@ void DesktopDragDropClientAuraX11::RemoveObserver(
NOTIMPLEMENTED();
}
-bool DesktopDragDropClientAuraX11::DispatchXEvent(XEvent* event) {
- if (!target_current_context() ||
- event->xany.window != target_current_context()->source_window()) {
+bool DesktopDragDropClientAuraX11::DispatchXEvent(x11::Event* event) {
+ auto* prop = event->As<x11::PropertyNotifyEvent>();
+ if (!target_current_context() || !prop ||
+ prop->window != target_current_context()->source_window()) {
return false;
}
- return target_current_context()->DispatchXEvent(event);
+ return target_current_context()->DispatchPropertyNotifyEvent(*prop);
}
void DesktopDragDropClientAuraX11::OnWindowDestroyed(aura::Window* window) {
@@ -339,13 +333,8 @@ int DesktopDragDropClientAuraX11::UpdateDrag(const gfx::Point& screen_point) {
std::unique_ptr<ui::DropTargetEvent> drop_target_event;
DragDropDelegate* delegate = nullptr;
DragTranslate(screen_point, &data, &drop_target_event, &delegate);
- int drag_operation =
- delegate ? drag_operation = delegate->OnDragUpdated(*drop_target_event)
- : ui::DragDropTypes::DRAG_NONE;
- UMA_HISTOGRAM_BOOLEAN("Event.DragDrop.AcceptDragUpdate",
- drag_operation != ui::DragDropTypes::DRAG_NONE);
-
- return drag_operation;
+ return delegate ? delegate->OnDragUpdated(*drop_target_event)
+ : ui::DragDropTypes::DRAG_NONE;
}
void DesktopDragDropClientAuraX11::UpdateCursor(
@@ -366,10 +355,12 @@ void DesktopDragDropClientAuraX11::UpdateCursor(
break;
}
move_loop_->UpdateCursor(
- cursor_manager_->GetInitializedCursor(cursor_type).platform());
+ static_cast<ui::X11Cursor*>(
+ cursor_manager_->GetInitializedCursor(cursor_type).platform())
+ ->xcursor());
}
-void DesktopDragDropClientAuraX11::OnBeginForeignDrag(XID window) {
+void DesktopDragDropClientAuraX11::OnBeginForeignDrag(x11::Window window) {
DCHECK(target_current_context());
DCHECK(!target_current_context()->source_client());
@@ -413,10 +404,6 @@ int DesktopDragDropClientAuraX11::PerformDrop() {
drop_event.set_flags(ui::XGetMaskAsEventFlags());
}
- if (!IsDragDropInProgress()) {
- UMA_HISTOGRAM_COUNTS_1M("Event.DragDrop.ExternalOriginDrop", 1);
- }
-
drag_operation = delegate->OnPerformDrop(drop_event, std::move(data));
}
@@ -426,7 +413,7 @@ int DesktopDragDropClientAuraX11::PerformDrop() {
return drag_operation;
}
-void DesktopDragDropClientAuraX11::EndMoveLoop() {
+void DesktopDragDropClientAuraX11::EndDragLoop() {
move_loop_->EndMoveLoop();
}
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.h b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.h
index a06220b1864..b8f6cceafbf 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.h
+++ b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.h
@@ -22,6 +22,7 @@
#include "ui/events/x/x11_window_event_manager.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/x/event.h"
#include "ui/gfx/x/x11.h"
#include "ui/views/views_export.h"
@@ -61,8 +62,7 @@ class VIEWS_EXPORT DesktopDragDropClientAuraX11
DesktopDragDropClientAuraX11(
aura::Window* root_window,
views::DesktopNativeCursorManager* cursor_manager,
- Display* xdisplay,
- XID xwindow);
+ x11::Window xwindow);
~DesktopDragDropClientAuraX11() override;
void Init();
@@ -80,7 +80,7 @@ class VIEWS_EXPORT DesktopDragDropClientAuraX11
void RemoveObserver(aura::client::DragDropClientObserver* observer) override;
// XEventDispatcher:
- bool DispatchXEvent(XEvent* event) override;
+ bool DispatchXEvent(x11::Event* event) override;
// aura::WindowObserver:
void OnWindowDestroyed(aura::Window* window) override;
@@ -118,11 +118,11 @@ class VIEWS_EXPORT DesktopDragDropClientAuraX11
int UpdateDrag(const gfx::Point& screen_point) override;
void UpdateCursor(
ui::DragDropTypes::DragOperation negotiated_operation) override;
- void OnBeginForeignDrag(XID window) override;
+ void OnBeginForeignDrag(x11::Window window) override;
void OnEndForeignDrag() override;
void OnBeforeDragLeave() override;
int PerformDrop() override;
- void EndMoveLoop() override;
+ void EndDragLoop() override;
// A nested run loop that notifies this object of events through the
// ui::X11MoveLoopDelegate interface.
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11_unittest.cc b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11_unittest.cc
index 68c1ba2c47d..1ab88c73c14 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11_unittest.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11_unittest.cc
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.h"
+
#include <map>
#include <memory>
#include <utility>
@@ -26,23 +28,26 @@
#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_drag_drop_client_aurax11.h"
#include "ui/views/widget/desktop_aura/desktop_native_cursor_manager.h"
#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
#include "ui/views/widget/widget.h"
+// TODO(crbug.com/990756): Transfer all tests from this file to better places
+// when DDDClientAuraX11 goes away.
+
namespace views {
namespace {
class TestDragDropClient;
-// Collects messages which would otherwise be sent to |xid_| via
+// Collects messages which would otherwise be sent to |window_| via
// SendXClientEvent().
class ClientMessageEventCollector {
public:
- ClientMessageEventCollector(::Window xid, TestDragDropClient* client);
+ ClientMessageEventCollector(x11::Window window, TestDragDropClient* client);
virtual ~ClientMessageEventCollector();
// Returns true if |events_| is non-empty.
@@ -50,18 +55,18 @@ class ClientMessageEventCollector {
// Pops all of |events_| and returns the popped events in the order that they
// were on the stack
- std::vector<XClientMessageEvent> PopAllEvents();
+ std::vector<x11::ClientMessageEvent> PopAllEvents();
// Adds |event| to the stack.
- void RecordEvent(const XClientMessageEvent& event);
+ void RecordEvent(const x11::ClientMessageEvent& event);
private:
- ::Window xid_;
+ x11::Window window_;
// Not owned.
TestDragDropClient* client_;
- std::vector<XClientMessageEvent> events_;
+ std::vector<x11::ClientMessageEvent> events_;
DISALLOW_COPY_AND_ASSIGN(ClientMessageEventCollector);
};
@@ -101,8 +106,8 @@ class SimpleTestDragDropClient : public DesktopDragDropClientAuraX11 {
DesktopNativeCursorManager* cursor_manager);
~SimpleTestDragDropClient() override;
- // Sets |xid| as the topmost window for all mouse positions.
- void SetTopmostXWindow(XID xid);
+ // Sets |window| as the topmost window for all mouse positions.
+ void SetTopmostXWindow(x11::Window window);
// Returns true if the move loop is running.
bool IsMoveLoopRunning();
@@ -113,10 +118,10 @@ class SimpleTestDragDropClient : public DesktopDragDropClientAuraX11 {
// DesktopDragDropClientAuraX11:
std::unique_ptr<ui::X11MoveLoop> CreateMoveLoop(
ui::X11MoveLoopDelegate* delegate) override;
- XID FindWindowFor(const gfx::Point& screen_point) override;
+ x11::Window FindWindowFor(const gfx::Point& screen_point) override;
- // The XID of the window which is simulated to be the topmost window.
- XID target_xid_ = x11::None;
+ // The x11::Window of the window which is simulated to be the topmost window.
+ x11::Window target_window_ = x11::Window::None;
// The move loop. Not owned.
TestMoveLoop* loop_ = nullptr;
@@ -137,46 +142,47 @@ class TestDragDropClient : public SimpleTestDragDropClient {
DesktopNativeCursorManager* cursor_manager);
~TestDragDropClient() override;
- // Returns the XID of the window which initiated the drag.
- ::Window source_xwindow() { return source_xid_; }
+ // Returns the x11::Window of the window which initiated the drag.
+ x11::Window source_xwindow() { return source_window_; }
// Returns the Atom with |name|.
- Atom GetAtom(const char* name);
+ x11::Atom GetAtom(const char* name);
// Returns true if the event's message has |type|.
- bool MessageHasType(const XClientMessageEvent& event, const char* type);
+ bool MessageHasType(const x11::ClientMessageEvent& event, const char* type);
- // Sets |collector| to collect XClientMessageEvents which would otherwise
+ // Sets |collector| to collect x11::ClientMessageEvents which would otherwise
// have been sent to the drop target window.
- void SetEventCollectorFor(::Window xid,
+ void SetEventCollectorFor(x11::Window window,
ClientMessageEventCollector* collector);
// Builds an XdndStatus message and sends it to
// DesktopDragDropClientAuraX11.
- void OnStatus(XID target_window,
+ void OnStatus(x11::Window target_window,
bool will_accept_drop,
- ::Atom accepted_action);
+ x11::Atom accepted_action);
// Builds an XdndFinished message and sends it to
// DesktopDragDropClientAuraX11.
- void OnFinished(XID target_window,
+ void OnFinished(x11::Window target_window,
bool accepted_drop,
- ::Atom performed_action);
+ x11::Atom performed_action);
- // Sets |xid| as the topmost window at the current mouse position and
+ // Sets |window| as the topmost window at the current mouse position and
// generates a synthetic mouse move.
- void SetTopmostXWindowAndMoveMouse(::Window xid);
+ void SetTopmostXWindowAndMoveMouse(x11::Window window);
private:
// DesktopDragDropClientAuraX11:
- void SendXClientEvent(::Window xid, XEvent* event) override;
+ void SendXClientEvent(x11::Window window,
+ const x11::ClientMessageEvent& event) override;
- // The XID of the window which initiated the drag.
- ::Window source_xid_;
+ // The x11::Window of the window which initiated the drag.
+ x11::Window source_window_;
- // Map of ::Windows to the collector which intercepts XClientMessageEvents
- // for that window.
- std::map<::Window, ClientMessageEventCollector*> collectors_;
+ // Map of x11::Windows to the collector which intercepts
+ // x11::ClientMessageEvents for that window.
+ std::map<x11::Window, ClientMessageEventCollector*> collectors_;
DISALLOW_COPY_AND_ASSIGN(TestDragDropClient);
};
@@ -185,24 +191,25 @@ class TestDragDropClient : public SimpleTestDragDropClient {
// ClientMessageEventCollector
ClientMessageEventCollector::ClientMessageEventCollector(
- ::Window xid,
+ x11::Window window,
TestDragDropClient* client)
- : xid_(xid), client_(client) {
- client->SetEventCollectorFor(xid, this);
+ : window_(window), client_(client) {
+ client->SetEventCollectorFor(window, this);
}
ClientMessageEventCollector::~ClientMessageEventCollector() {
- client_->SetEventCollectorFor(xid_, nullptr);
+ client_->SetEventCollectorFor(window_, nullptr);
}
-std::vector<XClientMessageEvent> ClientMessageEventCollector::PopAllEvents() {
- std::vector<XClientMessageEvent> to_return;
+std::vector<x11::ClientMessageEvent>
+ClientMessageEventCollector::PopAllEvents() {
+ std::vector<x11::ClientMessageEvent> to_return;
to_return.swap(events_);
return to_return;
}
void ClientMessageEventCollector::RecordEvent(
- const XClientMessageEvent& event) {
+ const x11::ClientMessageEvent& event) {
events_.push_back(event);
}
@@ -246,13 +253,12 @@ SimpleTestDragDropClient::SimpleTestDragDropClient(
DesktopNativeCursorManager* cursor_manager)
: DesktopDragDropClientAuraX11(window,
cursor_manager,
- gfx::GetXDisplay(),
window->GetHost()->GetAcceleratedWidget()) {}
SimpleTestDragDropClient::~SimpleTestDragDropClient() = default;
-void SimpleTestDragDropClient::SetTopmostXWindow(XID xid) {
- target_xid_ = xid;
+void SimpleTestDragDropClient::SetTopmostXWindow(x11::Window window) {
+ target_window_ = window;
}
bool SimpleTestDragDropClient::IsMoveLoopRunning() {
@@ -265,8 +271,9 @@ std::unique_ptr<ui::X11MoveLoop> SimpleTestDragDropClient::CreateMoveLoop(
return base::WrapUnique(loop_);
}
-XID SimpleTestDragDropClient::FindWindowFor(const gfx::Point& screen_point) {
- return target_xid_;
+x11::Window SimpleTestDragDropClient::FindWindowFor(
+ const gfx::Point& screen_point) {
+ return target_window_;
}
///////////////////////////////////////////////////////////////////////////////
@@ -276,68 +283,70 @@ TestDragDropClient::TestDragDropClient(
aura::Window* window,
DesktopNativeCursorManager* cursor_manager)
: SimpleTestDragDropClient(window, cursor_manager),
- source_xid_(window->GetHost()->GetAcceleratedWidget()) {}
+ source_window_(window->GetHost()->GetAcceleratedWidget()) {}
TestDragDropClient::~TestDragDropClient() = default;
-Atom TestDragDropClient::GetAtom(const char* name) {
+x11::Atom TestDragDropClient::GetAtom(const char* name) {
return gfx::GetAtom(name);
}
-bool TestDragDropClient::MessageHasType(const XClientMessageEvent& event,
+bool TestDragDropClient::MessageHasType(const x11::ClientMessageEvent& event,
const char* type) {
- return event.message_type == GetAtom(type);
+ return event.type == GetAtom(type);
}
void TestDragDropClient::SetEventCollectorFor(
- ::Window xid,
+ x11::Window window,
ClientMessageEventCollector* collector) {
if (collector)
- collectors_[xid] = collector;
+ collectors_[window] = collector;
else
- collectors_.erase(xid);
+ collectors_.erase(window);
}
-void TestDragDropClient::OnStatus(XID target_window,
+void TestDragDropClient::OnStatus(x11::Window target_window,
bool will_accept_drop,
- ::Atom accepted_action) {
- XClientMessageEvent event;
- event.message_type = GetAtom("XdndStatus");
+ x11::Atom accepted_action) {
+ x11::ClientMessageEvent event;
+ event.type = GetAtom("XdndStatus");
event.format = 32;
- event.window = source_xid_;
- event.data.l[0] = target_window;
- event.data.l[1] = will_accept_drop ? 1 : 0;
- event.data.l[2] = 0;
- event.data.l[3] = 0;
- event.data.l[4] = accepted_action;
+ event.window = source_window_;
+ event.data.data32[0] = static_cast<uint32_t>(target_window);
+ event.data.data32[1] = will_accept_drop ? 1 : 0;
+ event.data.data32[2] = 0;
+ event.data.data32[3] = 0;
+ event.data.data32[4] = static_cast<uint32_t>(accepted_action);
HandleXdndEvent(event);
}
-void TestDragDropClient::OnFinished(XID target_window,
+void TestDragDropClient::OnFinished(x11::Window target_window,
bool accepted_drop,
- ::Atom performed_action) {
- XClientMessageEvent event;
- event.message_type = GetAtom("XdndFinished");
+ x11::Atom performed_action) {
+ x11::ClientMessageEvent event;
+ event.type = GetAtom("XdndFinished");
event.format = 32;
- event.window = source_xid_;
- event.data.l[0] = target_window;
- event.data.l[1] = accepted_drop ? 1 : 0;
- event.data.l[2] = performed_action;
- event.data.l[3] = 0;
- event.data.l[4] = 0;
+ event.window = source_window_;
+ event.data.data32[0] = static_cast<uint32_t>(target_window);
+ event.data.data32[1] = accepted_drop ? 1 : 0;
+ event.data.data32[2] = static_cast<uint32_t>(performed_action);
+ event.data.data32[3] = 0;
+ event.data.data32[4] = 0;
HandleXdndEvent(event);
}
-void TestDragDropClient::SetTopmostXWindowAndMoveMouse(::Window xid) {
- SetTopmostXWindow(xid);
+void TestDragDropClient::SetTopmostXWindowAndMoveMouse(x11::Window window) {
+ SetTopmostXWindow(window);
OnMouseMovement(gfx::Point(kMouseMoveX, kMouseMoveY), ui::EF_NONE,
ui::EventTimeForNow());
}
-void TestDragDropClient::SendXClientEvent(::Window xid, XEvent* event) {
- auto it = collectors_.find(xid);
+void TestDragDropClient::SendXClientEvent(
+ x11::Window window,
+ const x11::ClientMessageEvent& event) {
+ auto it = collectors_.find(window);
if (it != collectors_.end())
- it->second->RecordEvent(event->xclient);
+ it->second->RecordEvent(event);
}
} // namespace
@@ -402,103 +411,6 @@ class DesktopDragDropClientAuraX11Test : public ViewsTestBase {
DISALLOW_COPY_AND_ASSIGN(DesktopDragDropClientAuraX11Test);
};
-namespace {
-
-void BasicStep2(TestDragDropClient* client, XID toplevel) {
- EXPECT_TRUE(client->IsMoveLoopRunning());
-
- ClientMessageEventCollector collector(toplevel, client);
- client->SetTopmostXWindowAndMoveMouse(toplevel);
-
- // XdndEnter should have been sent to |toplevel| before the XdndPosition
- // message.
- std::vector<XClientMessageEvent> events = collector.PopAllEvents();
- ASSERT_EQ(2u, events.size());
-
- EXPECT_TRUE(client->MessageHasType(events[0], "XdndEnter"));
- EXPECT_EQ(client->source_xwindow(), static_cast<XID>(events[0].data.l[0]));
- EXPECT_EQ(1, events[0].data.l[1] & 1);
- std::vector<Atom> targets;
- ui::GetAtomArrayProperty(client->source_xwindow(), "XdndTypeList", &targets);
- EXPECT_FALSE(targets.empty());
-
- EXPECT_TRUE(client->MessageHasType(events[1], "XdndPosition"));
- EXPECT_EQ(client->source_xwindow(), static_cast<XID>(events[0].data.l[0]));
- const int kCoords =
- TestDragDropClient::kMouseMoveX << 16 | TestDragDropClient::kMouseMoveY;
- EXPECT_EQ(kCoords, events[1].data.l[2]);
- EXPECT_EQ(client->GetAtom("XdndActionCopy"),
- static_cast<Atom>(events[1].data.l[4]));
-
- client->OnStatus(toplevel, true, client->GetAtom("XdndActionCopy"));
-
- // Because there is no unprocessed XdndPosition, the drag drop client should
- // send XdndDrop immediately after the mouse is released.
- client->OnMouseReleased();
-
- events = collector.PopAllEvents();
- ASSERT_EQ(1u, events.size());
- EXPECT_TRUE(client->MessageHasType(events[0], "XdndDrop"));
- EXPECT_EQ(client->source_xwindow(), static_cast<XID>(events[0].data.l[0]));
-
- // Send XdndFinished to indicate that the drag drop client can cleanup any
- // data related to this drag. The move loop should end only after the
- // XdndFinished message was received.
- EXPECT_TRUE(client->IsMoveLoopRunning());
- client->OnFinished(toplevel, true, client->GetAtom("XdndActionCopy"));
- EXPECT_FALSE(client->IsMoveLoopRunning());
-}
-
-void BasicStep3(TestDragDropClient* client, XID toplevel) {
- EXPECT_TRUE(client->IsMoveLoopRunning());
-
- ClientMessageEventCollector collector(toplevel, client);
- client->SetTopmostXWindowAndMoveMouse(toplevel);
-
- std::vector<XClientMessageEvent> events = collector.PopAllEvents();
- ASSERT_EQ(2u, events.size());
- EXPECT_TRUE(client->MessageHasType(events[0], "XdndEnter"));
- EXPECT_TRUE(client->MessageHasType(events[1], "XdndPosition"));
-
- client->OnStatus(toplevel, true, client->GetAtom("XdndActionCopy"));
- client->SetTopmostXWindowAndMoveMouse(toplevel);
- events = collector.PopAllEvents();
- ASSERT_EQ(1u, events.size());
- EXPECT_TRUE(client->MessageHasType(events[0], "XdndPosition"));
-
- // We have not received an XdndStatus ack for the second XdndPosition message.
- // Test that sending XdndDrop is delayed till the XdndStatus ack is received.
- client->OnMouseReleased();
- EXPECT_FALSE(collector.HasEvents());
-
- client->OnStatus(toplevel, true, client->GetAtom("XdndActionCopy"));
- events = collector.PopAllEvents();
- ASSERT_EQ(1u, events.size());
- EXPECT_TRUE(client->MessageHasType(events[0], "XdndDrop"));
-
- EXPECT_TRUE(client->IsMoveLoopRunning());
- client->OnFinished(toplevel, true, client->GetAtom("XdndActionCopy"));
- EXPECT_FALSE(client->IsMoveLoopRunning());
-}
-
-} // namespace
-
-TEST_F(DesktopDragDropClientAuraX11Test, Basic) {
- XID toplevel = 1;
-
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(&BasicStep2, client(), toplevel));
- int result = StartDragAndDrop();
- EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, result);
-
- // Do another drag and drop to test that the data is properly cleaned up as a
- // result of the XdndFinished message.
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(&BasicStep3, client(), toplevel));
- result = StartDragAndDrop();
- EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, result);
-}
-
void HighDPIStep(TestDragDropClient* client) {
float scale =
display::Screen::GetScreen()->GetPrimaryDisplay().device_scale_factor();
@@ -520,6 +432,8 @@ void HighDPIStep(TestDragDropClient* client) {
client->OnMouseReleased();
}
+// TODO(crbug.com/990756): Turn this into tests of DesktopDragDropClientOzone
+// or its equivalent.
TEST_F(DesktopDragDropClientAuraX11Test, HighDPI200) {
aura::TestScreen* screen =
static_cast<aura::TestScreen*>(display::Screen::GetScreen());
@@ -531,6 +445,8 @@ TEST_F(DesktopDragDropClientAuraX11Test, HighDPI200) {
EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, result);
}
+// TODO(crbug.com/990756): Turn this into tests of DesktopDragDropClientOzone
+// or its equivalent.
TEST_F(DesktopDragDropClientAuraX11Test, HighDPI150) {
aura::TestScreen* screen =
static_cast<aura::TestScreen*>(display::Screen::GetScreen());
@@ -544,212 +460,6 @@ TEST_F(DesktopDragDropClientAuraX11Test, HighDPI150) {
namespace {
-void TargetDoesNotRespondStep2(TestDragDropClient* client) {
- EXPECT_TRUE(client->IsMoveLoopRunning());
-
- XID toplevel = 1;
- ClientMessageEventCollector collector(toplevel, client);
- client->SetTopmostXWindowAndMoveMouse(toplevel);
-
- std::vector<XClientMessageEvent> events = collector.PopAllEvents();
- ASSERT_EQ(2u, events.size());
- EXPECT_TRUE(client->MessageHasType(events[0], "XdndEnter"));
- EXPECT_TRUE(client->MessageHasType(events[1], "XdndPosition"));
-
- client->OnMouseReleased();
- events = collector.PopAllEvents();
- ASSERT_EQ(1u, events.size());
- EXPECT_TRUE(client->MessageHasType(events[0], "XdndLeave"));
- EXPECT_FALSE(client->IsMoveLoopRunning());
-}
-
-} // namespace
-
-// Test that we do not wait for the target to send XdndStatus if we have not
-// received any XdndStatus messages at all from the target. The Unity
-// DNDCollectionWindow is an example of an XdndAware target which does not
-// respond to XdndPosition messages at all.
-TEST_F(DesktopDragDropClientAuraX11Test, TargetDoesNotRespond) {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(&TargetDoesNotRespondStep2, client()));
- int result = StartDragAndDrop();
- EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, result);
-}
-
-namespace {
-
-void QueuePositionStep2(TestDragDropClient* client) {
- EXPECT_TRUE(client->IsMoveLoopRunning());
-
- XID toplevel = 1;
- ClientMessageEventCollector collector(toplevel, client);
- client->SetTopmostXWindowAndMoveMouse(toplevel);
- client->SetTopmostXWindowAndMoveMouse(toplevel);
- client->SetTopmostXWindowAndMoveMouse(toplevel);
-
- std::vector<XClientMessageEvent> events = collector.PopAllEvents();
- ASSERT_EQ(2u, events.size());
- EXPECT_TRUE(client->MessageHasType(events[0], "XdndEnter"));
- EXPECT_TRUE(client->MessageHasType(events[1], "XdndPosition"));
-
- client->OnStatus(toplevel, true, client->GetAtom("XdndActionCopy"));
- events = collector.PopAllEvents();
- ASSERT_EQ(1u, events.size());
- EXPECT_TRUE(client->MessageHasType(events[0], "XdndPosition"));
-
- client->OnStatus(toplevel, true, client->GetAtom("XdndActionCopy"));
- EXPECT_FALSE(collector.HasEvents());
-
- client->OnMouseReleased();
- events = collector.PopAllEvents();
- ASSERT_EQ(1u, events.size());
- EXPECT_TRUE(client->MessageHasType(events[0], "XdndDrop"));
-
- EXPECT_TRUE(client->IsMoveLoopRunning());
- client->OnFinished(toplevel, true, client->GetAtom("XdndActionCopy"));
- EXPECT_FALSE(client->IsMoveLoopRunning());
-}
-
-} // namespace
-
-// Test that XdndPosition messages are queued till the pending XdndPosition
-// message is acked via an XdndStatus message.
-TEST_F(DesktopDragDropClientAuraX11Test, QueuePosition) {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(&QueuePositionStep2, client()));
- int result = StartDragAndDrop();
- EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, result);
-}
-
-namespace {
-
-void TargetChangesStep2(TestDragDropClient* client) {
- EXPECT_TRUE(client->IsMoveLoopRunning());
-
- XID toplevel1 = 1;
- ClientMessageEventCollector collector1(toplevel1, client);
- client->SetTopmostXWindowAndMoveMouse(toplevel1);
-
- std::vector<XClientMessageEvent> events1 = collector1.PopAllEvents();
- ASSERT_EQ(2u, events1.size());
- EXPECT_TRUE(client->MessageHasType(events1[0], "XdndEnter"));
- EXPECT_TRUE(client->MessageHasType(events1[1], "XdndPosition"));
-
- XID toplevel2 = 2;
- ClientMessageEventCollector collector2(toplevel2, client);
- client->SetTopmostXWindowAndMoveMouse(toplevel2);
-
- // It is possible for |toplevel1| to send XdndStatus after the source has sent
- // XdndLeave but before |toplevel1| has received the XdndLeave message. The
- // XdndStatus message should be ignored.
- client->OnStatus(toplevel1, true, client->GetAtom("XdndActionCopy"));
- events1 = collector1.PopAllEvents();
- ASSERT_EQ(1u, events1.size());
- EXPECT_TRUE(client->MessageHasType(events1[0], "XdndLeave"));
-
- std::vector<XClientMessageEvent> events2 = collector2.PopAllEvents();
- ASSERT_EQ(2u, events2.size());
- EXPECT_TRUE(client->MessageHasType(events2[0], "XdndEnter"));
- EXPECT_TRUE(client->MessageHasType(events2[1], "XdndPosition"));
-
- client->OnStatus(toplevel2, true, client->GetAtom("XdndActionCopy"));
- client->OnMouseReleased();
- events2 = collector2.PopAllEvents();
- ASSERT_EQ(1u, events2.size());
- EXPECT_TRUE(client->MessageHasType(events2[0], "XdndDrop"));
-
- EXPECT_TRUE(client->IsMoveLoopRunning());
- client->OnFinished(toplevel2, true, client->GetAtom("XdndActionCopy"));
- EXPECT_FALSE(client->IsMoveLoopRunning());
-}
-
-} // namespace
-
-// Test the behavior when the target changes during a drag.
-TEST_F(DesktopDragDropClientAuraX11Test, TargetChanges) {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(&TargetChangesStep2, client()));
- int result = StartDragAndDrop();
- EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, result);
-}
-
-namespace {
-
-void RejectAfterMouseReleaseStep2(TestDragDropClient* client) {
- EXPECT_TRUE(client->IsMoveLoopRunning());
-
- XID toplevel = 1;
- ClientMessageEventCollector collector(toplevel, client);
- client->SetTopmostXWindowAndMoveMouse(toplevel);
-
- std::vector<XClientMessageEvent> events = collector.PopAllEvents();
- ASSERT_EQ(2u, events.size());
- EXPECT_TRUE(client->MessageHasType(events[0], "XdndEnter"));
- EXPECT_TRUE(client->MessageHasType(events[1], "XdndPosition"));
-
- client->OnStatus(toplevel, true, client->GetAtom("XdndActionCopy"));
- EXPECT_FALSE(collector.HasEvents());
-
- // Send another mouse move such that there is a pending XdndPosition.
- client->SetTopmostXWindowAndMoveMouse(toplevel);
- events = collector.PopAllEvents();
- ASSERT_EQ(1u, events.size());
- EXPECT_TRUE(client->MessageHasType(events[0], "XdndPosition"));
-
- client->OnMouseReleased();
- // Reject the drop.
- client->OnStatus(toplevel, false, x11::None);
-
- events = collector.PopAllEvents();
- ASSERT_EQ(1u, events.size());
- EXPECT_TRUE(client->MessageHasType(events[0], "XdndLeave"));
- EXPECT_FALSE(client->IsMoveLoopRunning());
-}
-
-void RejectAfterMouseReleaseStep3(TestDragDropClient* client) {
- EXPECT_TRUE(client->IsMoveLoopRunning());
-
- XID toplevel = 2;
- ClientMessageEventCollector collector(toplevel, client);
- client->SetTopmostXWindowAndMoveMouse(toplevel);
-
- std::vector<XClientMessageEvent> events = collector.PopAllEvents();
- ASSERT_EQ(2u, events.size());
- EXPECT_TRUE(client->MessageHasType(events[0], "XdndEnter"));
- EXPECT_TRUE(client->MessageHasType(events[1], "XdndPosition"));
-
- client->OnStatus(toplevel, true, client->GetAtom("XdndActionCopy"));
- EXPECT_FALSE(collector.HasEvents());
-
- client->OnMouseReleased();
- events = collector.PopAllEvents();
- ASSERT_EQ(1u, events.size());
- EXPECT_TRUE(client->MessageHasType(events[0], "XdndDrop"));
-
- EXPECT_TRUE(client->IsMoveLoopRunning());
- client->OnFinished(toplevel, false, x11::None);
- EXPECT_FALSE(client->IsMoveLoopRunning());
-}
-
-} // namespace
-
-// Test that the source sends XdndLeave instead of XdndDrop if the drag
-// operation is rejected after the mouse is released.
-TEST_F(DesktopDragDropClientAuraX11Test, RejectAfterMouseRelease) {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(&RejectAfterMouseReleaseStep2, client()));
- int result = StartDragAndDrop();
- EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, result);
-
- // Repeat the test but reject the drop in the XdndFinished message instead.
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(&RejectAfterMouseReleaseStep3, client()));
- result = StartDragAndDrop();
- EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, result);
-}
-
-namespace {
-
// DragDropDelegate which counts the number of each type of drag-drop event and
// keeps track of the most recent drag-drop event.
class TestDragDropDelegate : public aura::client::DragDropDelegate {
@@ -928,6 +638,8 @@ void ChromeSourceTargetStep2(SimpleTestDragDropClient* client,
} // namespace
+// TODO(crbug.com/990756): Turn this into tests of DesktopDragDropClientOzone
+// or its equivalent.
TEST_F(DesktopDragDropClientAuraX11ChromeSourceTargetTest, Basic) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
@@ -936,6 +648,8 @@ TEST_F(DesktopDragDropClientAuraX11ChromeSourceTargetTest, Basic) {
EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, result);
}
+// TODO(crbug.com/990756): Turn this into tests of DesktopDragDropClientOzone
+// or its equivalent.
// Test that if 'Ctrl' is pressed during a drag and drop operation, that
// the aura::client::DragDropDelegate is properly notified.
TEST_F(DesktopDragDropClientAuraX11ChromeSourceTargetTest, CtrlPressed) {
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.cc b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.cc
index 24a959b321d..dd9232bb7e9 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.cc
@@ -21,10 +21,13 @@
#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
#include "ui/base/dragdrop/drag_drop_types.h"
#include "ui/base/dragdrop/drop_target_event.h"
-#include "ui/base/dragdrop/os_exchange_data_provider_aura.h"
+#include "ui/base/layout.h"
+#include "ui/display/screen.h"
#include "ui/platform_window/platform_window_delegate.h"
#include "ui/platform_window/platform_window_handler/wm_drag_handler.h"
+#include "ui/views/controls/image_view.h"
#include "ui/views/widget/desktop_aura/desktop_native_cursor_manager.h"
+#include "ui/views/widget/widget.h"
namespace views {
@@ -37,8 +40,64 @@ aura::Window* GetTargetWindow(aura::Window* root_window,
return root_window->GetEventHandlerForPoint(root_location);
}
+// The minimum alpha required so we would treat the pixel as visible.
+constexpr uint32_t kMinAlpha = 32;
+
+// Returns true if |image| has any visible regions (defined as having a pixel
+// with alpha > |kMinAlpha|).
+bool IsValidDragImage(const gfx::ImageSkia& image) {
+ if (image.isNull())
+ return false;
+
+ // Because we need a GL context per window, we do a quick check so that we
+ // don't make another context if the window would just be displaying a mostly
+ // transparent image.
+ const SkBitmap* in_bitmap = image.bitmap();
+ for (int y = 0; y < in_bitmap->height(); ++y) {
+ uint32_t* in_row = in_bitmap->getAddr32(0, y);
+
+ for (int x = 0; x < in_bitmap->width(); ++x) {
+ if (SkColorGetA(in_row[x]) > kMinAlpha)
+ return true;
+ }
+ }
+
+ return false;
+}
+
+std::unique_ptr<views::Widget> CreateDragWidget(
+ const gfx::Point& root_location,
+ const gfx::ImageSkia& image,
+ const gfx::Vector2d& drag_widget_offset) {
+ auto widget = std::make_unique<views::Widget>();
+ views::Widget::InitParams params(views::Widget::InitParams::TYPE_DRAG);
+ params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params.accept_events = false;
+
+ gfx::Point location = root_location - drag_widget_offset;
+ params.bounds = gfx::Rect(location, image.size());
+ widget->set_focus_on_creation(false);
+ widget->set_frame_type(views::Widget::FrameType::kForceNative);
+ widget->Init(std::move(params));
+ widget->GetNativeWindow()->SetName("DragWindow");
+
+ std::unique_ptr<views::ImageView> image_view =
+ std::make_unique<views::ImageView>();
+ image_view->SetImage(image);
+ widget->SetContentsView(std::move(image_view));
+ widget->Show();
+ widget->GetNativeWindow()->layer()->SetFillsBoundsOpaquely(false);
+ widget->StackAtTop();
+
+ return widget;
+}
+
} // namespace
+DesktopDragDropClientOzone::DragContext::DragContext() = default;
+
+DesktopDragDropClientOzone::DragContext::~DragContext() = default;
+
DesktopDragDropClientOzone::DesktopDragDropClientOzone(
aura::Window* root_window,
views::DesktopNativeCursorManager* cursor_manager,
@@ -50,7 +109,7 @@ DesktopDragDropClientOzone::DesktopDragDropClientOzone(
DesktopDragDropClientOzone::~DesktopDragDropClientOzone() {
ResetDragDropTarget();
- if (in_move_loop_)
+ if (IsDragDropInProgress())
DragCancel();
}
@@ -64,9 +123,11 @@ int DesktopDragDropClientOzone::StartDragAndDrop(
if (!drag_handler_)
return ui::DragDropTypes::DragOperation::DRAG_NONE;
- DCHECK(!in_move_loop_);
+ DCHECK(!drag_context_);
+ drag_context_ = std::make_unique<DragContext>();
+
base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
- quit_closure_ = run_loop.QuitClosure();
+ drag_context_->quit_closure = run_loop.QuitClosure();
// Chrome expects starting drag and drop to release capture.
aura::Window* capture_window =
@@ -77,18 +138,38 @@ int DesktopDragDropClientOzone::StartDragAndDrop(
aura::client::CursorClient* cursor_client =
aura::client::GetCursorClient(root_window);
- initial_cursor_ = source_window->GetHost()->last_cursor();
+ auto initial_cursor = source_window->GetHost()->last_cursor();
drag_operation_ = operation;
- cursor_client->SetCursor(
- cursor_manager_->GetInitializedCursor(ui::mojom::CursorType::kGrabbing));
-
- drag_handler_->StartDrag(
- *data.get(), operation, cursor_client->GetCursor(),
- base::BindOnce(&DesktopDragDropClientOzone::OnDragSessionClosed,
- base::Unretained(this)));
- in_move_loop_ = true;
+ if (cursor_client) {
+ cursor_client->SetCursor(cursor_manager_->GetInitializedCursor(
+ ui::mojom::CursorType::kGrabbing));
+ }
+
+ const auto& provider = data->provider();
+ gfx::ImageSkia drag_image = provider.GetDragImage();
+ if (IsValidDragImage(drag_image)) {
+ drag_context_->size = drag_image.size();
+ drag_context_->offset = provider.GetDragImageOffset();
+ drag_context_->widget =
+ CreateDragWidget(root_location, drag_image, drag_context_->offset);
+ }
+
+ // This object is owned by a DesktopNativeWidgetAura that can be destroyed
+ // during the drag loop, which will also destroy this object. So keep track
+ // of whether we are still alive after the drag ends.
+ auto alive = weak_factory_.GetWeakPtr();
+
+ drag_handler_->StartDrag(*data.get(), operation, cursor_client->GetCursor(),
+ this);
run_loop.Run();
- DragDropSessionCompleted();
+
+ if (!alive)
+ return ui::DragDropTypes::DRAG_NONE;
+
+ if (cursor_client)
+ cursor_client->SetCursor(initial_cursor);
+ drag_context_.reset();
+
return drag_operation_;
}
@@ -97,7 +178,7 @@ void DesktopDragDropClientOzone::DragCancel() {
}
bool DesktopDragDropClientOzone::IsDragDropInProgress() {
- return in_move_loop_;
+ return bool(drag_context_) && bool(drag_context_->quit_closure);
}
void DesktopDragDropClientOzone::AddObserver(
@@ -117,129 +198,193 @@ void DesktopDragDropClientOzone::OnDragEnter(
last_drag_point_ = point;
drag_operation_ = operation;
- // If it doesn't have |data|, it defers sending events to
- // |drag_drop_delegate_|. It will try again before handling drop.
+ // If |data| is empty, we defer sending any events to the
+ // |drag_drop_delegate_|. All necessary events will be sent on dropping.
if (!data)
return;
- os_exchange_data_ = std::move(data);
- std::unique_ptr<ui::DropTargetEvent> event = CreateDropTargetEvent(point);
- if (drag_drop_delegate_ && event)
- drag_drop_delegate_->OnDragEntered(*event);
+ data_to_drop_ = std::move(data);
+ UpdateTargetAndCreateDropEvent(point);
}
int DesktopDragDropClientOzone::OnDragMotion(const gfx::PointF& point,
int operation) {
last_drag_point_ = point;
drag_operation_ = operation;
- int client_operation =
- ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_MOVE;
-
- if (os_exchange_data_) {
- std::unique_ptr<ui::DropTargetEvent> event = CreateDropTargetEvent(point);
- // If |os_exchange_data_| has a valid data, |drag_drop_delegate_| returns
- // the operation which it expects.
- if (drag_drop_delegate_ && event)
- client_operation = drag_drop_delegate_->OnDragUpdated(*event);
- }
+
+ // If |data_to_drop_| doesn't have data, return that we accept everything.
+ if (!data_to_drop_)
+ return ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_MOVE;
+
+ // Ask the delegate what operation it would accept for the current data.
+ int client_operation = ui::DragDropTypes::DRAG_NONE;
+ std::unique_ptr<ui::DropTargetEvent> event =
+ UpdateTargetAndCreateDropEvent(point);
+ if (drag_drop_delegate_ && event)
+ client_operation = drag_drop_delegate_->OnDragUpdated(*event);
return client_operation;
}
void DesktopDragDropClientOzone::OnDragDrop(
std::unique_ptr<ui::OSExchangeData> data) {
- // If it doesn't have |os_exchange_data_|, it needs to update it with |data|.
- if (!os_exchange_data_) {
- DCHECK(data);
- os_exchange_data_ = std::move(data);
- std::unique_ptr<ui::DropTargetEvent> event =
- CreateDropTargetEvent(last_drag_point_);
- // Sends the deferred drag events to |drag_drop_delegate_| before handling
- // drop.
- if (drag_drop_delegate_ && event) {
- drag_drop_delegate_->OnDragEntered(*event);
- // TODO(jkim): It doesn't use the return value from 'OnDragUpdated' and
- // doesn't have a chance to update the expected operation.
- // https://crbug.com/875164
+ // If we didn't have |data_to_drop_|, then |drag_drop_delegate_| had never
+ // been updated, and now it needs to receive deferred enter and update events
+ // before handling the actual drop.
+ const bool posponed_enter_and_update = !data_to_drop_;
+
+ // If we had |data_to_drop_| already since the drag had entered the window,
+ // then we don't expect new data to come now, and vice versa.
+ DCHECK((data_to_drop_ && !data) || (!data_to_drop_ && data));
+ if (!data_to_drop_)
+ data_to_drop_ = std::move(data);
+
+ // This will call the delegate's OnDragEntered if needed.
+ auto event = UpdateTargetAndCreateDropEvent(last_drag_point_);
+ if (drag_drop_delegate_ && event) {
+ if (posponed_enter_and_update) {
+ // TODO(https://crbug.com/1014860): deal with drop refusals.
+ // The delegate's OnDragUpdated returns an operation that the delegate
+ // would accept. Normally the accepted operation would be propagated
+ // properly, and if the delegate didn't accept it, the drop would never
+ // be called, but in this scenario of postponed updates we send all events
+ // at once. Now we just drop, but perhaps we could call OnDragLeave
+ // and quit?
drag_drop_delegate_->OnDragUpdated(*event);
}
- } else {
- // If it has |os_exchange_data_|, it doesn't expect |data| on OnDragDrop.
- DCHECK(!data);
+ drag_operation_ =
+ drag_drop_delegate_->OnPerformDrop(*event, std::move(data_to_drop_));
}
- PerformDrop();
+ ResetDragDropTarget();
}
void DesktopDragDropClientOzone::OnDragLeave() {
- os_exchange_data_.reset();
+ data_to_drop_.reset();
ResetDragDropTarget();
}
-void DesktopDragDropClientOzone::OnDragSessionClosed(int dnd_action) {
- drag_operation_ = dnd_action;
- QuitRunLoop();
+void DesktopDragDropClientOzone::OnWindowDestroyed(aura::Window* window) {
+ DCHECK_EQ(window, current_window_);
+
+ current_window_->RemoveObserver(this);
+ current_window_ = nullptr;
+ drag_drop_delegate_ = nullptr;
}
-void DesktopDragDropClientOzone::DragDropSessionCompleted() {
+void DesktopDragDropClientOzone::OnDragLocationChanged(
+ const gfx::Point& screen_point_px) {
+ DCHECK(drag_context_);
+
+ if (!drag_context_->widget)
+ return;
+
+ const bool dispatch_mouse_event = !drag_context_->last_screen_location_px;
+ drag_context_->last_screen_location_px = screen_point_px;
+ if (dispatch_mouse_event) {
+ // Post a task to dispatch mouse movement event when control returns to the
+ // message loop. This allows smoother dragging since the events are
+ // dispatched without waiting for the drag widget updates.
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE,
+ base::BindOnce(&DesktopDragDropClientOzone::UpdateDragWidgetLocation,
+ weak_factory_.GetWeakPtr()));
+ }
+}
+
+void DesktopDragDropClientOzone::OnDragOperationChanged(
+ ui::DragDropTypes::DragOperation operation) {
aura::client::CursorClient* cursor_client =
aura::client::GetCursorClient(root_window_);
if (!cursor_client)
return;
- cursor_client->SetCursor(initial_cursor_);
+ ui::mojom::CursorType cursor_type = ui::mojom::CursorType::kNull;
+ switch (operation) {
+ case ui::DragDropTypes::DRAG_NONE:
+ cursor_type = ui::mojom::CursorType::kDndNone;
+ break;
+ case ui::DragDropTypes::DRAG_MOVE:
+ cursor_type = ui::mojom::CursorType::kDndMove;
+ break;
+ case ui::DragDropTypes::DRAG_COPY:
+ cursor_type = ui::mojom::CursorType::kDndCopy;
+ break;
+ case ui::DragDropTypes::DRAG_LINK:
+ cursor_type = ui::mojom::CursorType::kDndLink;
+ break;
+ }
+ cursor_client->SetCursor(cursor_manager_->GetInitializedCursor(cursor_type));
+}
+
+void DesktopDragDropClientOzone::OnDragFinished(int dnd_action) {
+ drag_operation_ = dnd_action;
+ QuitRunLoop();
}
void DesktopDragDropClientOzone::QuitRunLoop() {
- in_move_loop_ = false;
- if (quit_closure_.is_null())
+ if (!drag_context_->quit_closure)
return;
- std::move(quit_closure_).Run();
+ std::move(drag_context_->quit_closure).Run();
}
std::unique_ptr<ui::DropTargetEvent>
-DesktopDragDropClientOzone::CreateDropTargetEvent(const gfx::PointF& location) {
+DesktopDragDropClientOzone::UpdateTargetAndCreateDropEvent(
+ const gfx::PointF& location) {
const gfx::Point point(location.x(), location.y());
aura::Window* window = GetTargetWindow(root_window_, point);
- if (!window)
+ if (!window) {
+ ResetDragDropTarget();
+ return nullptr;
+ }
+
+ auto* new_delegate = aura::client::GetDragDropDelegate(window);
+ const bool delegate_has_changed = (new_delegate != drag_drop_delegate_);
+ if (delegate_has_changed) {
+ ResetDragDropTarget();
+ drag_drop_delegate_ = new_delegate;
+ current_window_ = window;
+ current_window_->AddObserver(this);
+ }
+
+ if (!drag_drop_delegate_)
return nullptr;
- UpdateDragDropDelegate(window);
gfx::Point root_location(location.x(), location.y());
root_window_->GetHost()->ConvertScreenInPixelsToDIP(&root_location);
gfx::PointF target_location(root_location);
aura::Window::ConvertPointToTarget(root_window_, window, &target_location);
- return std::make_unique<ui::DropTargetEvent>(
- *os_exchange_data_, target_location, gfx::PointF(root_location),
+ auto event = std::make_unique<ui::DropTargetEvent>(
+ *data_to_drop_, target_location, gfx::PointF(root_location),
drag_operation_);
+ if (delegate_has_changed)
+ drag_drop_delegate_->OnDragEntered(*event);
+ return event;
}
-void DesktopDragDropClientOzone::UpdateDragDropDelegate(aura::Window* window) {
- aura::client::DragDropDelegate* delegate =
- aura::client::GetDragDropDelegate(window);
-
- if (drag_drop_delegate_ == delegate)
+void DesktopDragDropClientOzone::UpdateDragWidgetLocation() {
+ if (!drag_context_)
return;
- ResetDragDropTarget();
- if (delegate)
- drag_drop_delegate_ = delegate;
-}
+ float scale_factor =
+ ui::GetScaleFactorForNativeView(drag_context_->widget->GetNativeWindow());
+ gfx::Point scaled_point = gfx::ScaleToRoundedPoint(
+ *drag_context_->last_screen_location_px, 1.f / scale_factor);
+ drag_context_->widget->SetBounds(
+ gfx::Rect(scaled_point - drag_context_->offset, drag_context_->size));
+ drag_context_->widget->StackAtTop();
-void DesktopDragDropClientOzone::ResetDragDropTarget() {
- if (!drag_drop_delegate_)
- return;
- drag_drop_delegate_->OnDragExited();
- drag_drop_delegate_ = nullptr;
+ drag_context_->last_screen_location_px.reset();
}
-void DesktopDragDropClientOzone::PerformDrop() {
- std::unique_ptr<ui::DropTargetEvent> event =
- CreateDropTargetEvent(last_drag_point_);
- if (drag_drop_delegate_ && event)
- drag_operation_ = drag_drop_delegate_->OnPerformDrop(
- *event, std::move(os_exchange_data_));
- DragDropSessionCompleted();
- ResetDragDropTarget();
+void DesktopDragDropClientOzone::ResetDragDropTarget() {
+ if (drag_drop_delegate_) {
+ drag_drop_delegate_->OnDragExited();
+ drag_drop_delegate_ = nullptr;
+ }
+ if (current_window_) {
+ current_window_->RemoveObserver(this);
+ current_window_ = nullptr;
+ }
}
} // namespace views
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.h b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.h
index 05b2fd24af6..d4e93838750 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.h
+++ b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.h
@@ -8,7 +8,9 @@
#include <memory>
#include "base/callback.h"
+#include "base/memory/weak_ptr.h"
#include "ui/aura/client/drag_drop_client.h"
+#include "ui/aura/window_observer.h"
#include "ui/base/cursor/cursor.h"
#include "ui/base/dragdrop/os_exchange_data.h"
#include "ui/gfx/geometry/point_f.h"
@@ -29,17 +31,50 @@ class DropTargetEvent;
namespace views {
class DesktopNativeCursorManager;
+class Widget;
class VIEWS_EXPORT DesktopDragDropClientOzone
: public aura::client::DragDropClient,
- public ui::WmDropHandler {
+ public ui::WmDragHandler::Delegate,
+ public ui::WmDropHandler,
+ public aura::WindowObserver {
public:
DesktopDragDropClientOzone(aura::Window* root_window,
views::DesktopNativeCursorManager* cursor_manager,
ui::WmDragHandler* drag_handler);
~DesktopDragDropClientOzone() override;
- // Overridden from aura::client::DragDropClient:
+ private:
+ friend class DesktopDragDropClientOzoneTest;
+
+ // Holds data related to the drag operation started by this client.
+ struct DragContext {
+ DragContext();
+ ~DragContext();
+
+ // Exits the drag loop.
+ base::OnceClosure quit_closure;
+
+ // Widget that the user drags around. May be nullptr.
+ std::unique_ptr<Widget> widget;
+
+ // The size of drag image.
+ gfx::Size size;
+
+ // The offset of |drag_widget_| relative to the mouse position.
+ gfx::Vector2d offset;
+
+ // The last received drag location. The drag widget is moved asynchronously
+ // so its position is updated when the UI thread has time for that. When
+ // the first change to the location happens, a call to UpdateDragWidget()
+ // is posted, and this location is set. The location can be updated a few
+ // more times until the posted task is executed, but no more than a single
+ // call to UpdateDragWidget() is scheduled at any time; this optional is set
+ // means that the task is scheduled.
+ base::Optional<gfx::Point> last_screen_location_px;
+ };
+
+ // aura::client::DragDropClient
int StartDragAndDrop(std::unique_ptr<ui::OSExchangeData> data,
aura::Window* root_window,
aura::Window* source_window,
@@ -51,7 +86,7 @@ class VIEWS_EXPORT DesktopDragDropClientOzone
void AddObserver(aura::client::DragDropClientObserver* observer) override;
void RemoveObserver(aura::client::DragDropClientObserver* observer) override;
- // Overridden from void ui::WmDropHandler:
+ // ui::WmDropHandler
void OnDragEnter(const gfx::PointF& point,
std::unique_ptr<ui::OSExchangeData> data,
int operation) override;
@@ -59,24 +94,33 @@ class VIEWS_EXPORT DesktopDragDropClientOzone
void OnDragDrop(std::unique_ptr<ui::OSExchangeData> data) override;
void OnDragLeave() override;
- void OnDragSessionClosed(int operation);
+ // aura::WindowObserver
+ void OnWindowDestroyed(aura::Window* window) override;
+
+ // ui::WmDragHandler::Delegate
+ void OnDragLocationChanged(const gfx::Point& screen_point_px) override;
+ void OnDragOperationChanged(
+ ui::DragDropTypes::DragOperation operation) override;
+ void OnDragFinished(int operation) override;
- private:
- void DragDropSessionCompleted();
void QuitRunLoop();
- // Returns a DropTargetEvent to be passed to the DragDropDelegate, or null to
- // abort the drag.
- std::unique_ptr<ui::DropTargetEvent> CreateDropTargetEvent(
+ // Returns a DropTargetEvent to be passed to the DragDropDelegate.
+ // Updates the delegate if needed, which in its turn calls their
+ // OnDragExited/OnDragEntered, so after getting the event the delegate
+ // is ready to accept OnDragUpdated or OnPerformDrop. Returns nullptr if
+ // drop is not possible.
+ std::unique_ptr<ui::DropTargetEvent> UpdateTargetAndCreateDropEvent(
const gfx::PointF& point);
// Updates |drag_drop_delegate_| along with |window|.
void UpdateDragDropDelegate(aura::Window* window);
- // Resets |drag_drop_delegate_|.
- void ResetDragDropTarget();
+ // Updates |drag_widget_| so it is aligned with the last drag location.
+ void UpdateDragWidgetLocation();
- void PerformDrop();
+ // Resets |drag_drop_delegate_|. Calls OnDragExited() before resetting.
+ void ResetDragDropTarget();
aura::Window* const root_window_;
@@ -84,26 +128,24 @@ class VIEWS_EXPORT DesktopDragDropClientOzone
ui::WmDragHandler* const drag_handler_;
+ // Last window under the mouse.
+ aura::Window* current_window_ = nullptr;
// The delegate corresponding to the window located at the mouse position.
aura::client::DragDropDelegate* drag_drop_delegate_ = nullptr;
// The data to be delivered through the drag and drop.
- std::unique_ptr<ui::OSExchangeData> os_exchange_data_ = nullptr;
+ std::unique_ptr<ui::OSExchangeData> data_to_drop_;
- // The most recent native coordinates of a drag.
+ // The most recent native coordinates of an incoming drag. Updated while
+ // the mouse is moved, and used at dropping.
gfx::PointF last_drag_point_;
- // Cursor in use prior to the move loop starting. Restored when the move loop
- // quits.
- gfx::NativeCursor initial_cursor_;
-
- base::OnceClosure quit_closure_;
-
// The operation bitfield.
int drag_operation_ = 0;
- // The flag that controls whether it has a nested run loop.
- bool in_move_loop_ = false;
+ std::unique_ptr<DragContext> drag_context_;
+
+ base::WeakPtrFactory<DesktopDragDropClientOzone> weak_factory_{this};
DISALLOW_COPY_AND_ASSIGN(DesktopDragDropClientOzone);
};
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 d159e5130b8..cfb7bcca00b 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
@@ -66,8 +66,8 @@ class FakePlatformWindow : public ui::PlatformWindow, public ui::WmDragHandler {
void StartDrag(const OSExchangeData& data,
int operation,
gfx::NativeCursor cursor,
- base::OnceCallback<void(int)> callback) override {
- drag_closed_callback_ = std::move(callback);
+ WmDragHandler::Delegate* delegate) override {
+ drag_handler_delegate_ = delegate;
source_data_ = std::make_unique<OSExchangeData>(data.provider().Clone());
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
@@ -107,7 +107,7 @@ class FakePlatformWindow : public ui::PlatformWindow, public ui::WmDragHandler {
}
void CloseDrag(uint32_t dnd_action) {
- std::move(drag_closed_callback_).Run(dnd_action);
+ drag_handler_delegate_->OnDragFinished(dnd_action);
}
void ProcessDrag(std::unique_ptr<OSExchangeData> data, int operation) {
@@ -119,7 +119,7 @@ class FakePlatformWindow : public ui::PlatformWindow, public ui::WmDragHandler {
}
private:
- base::OnceCallback<void(int)> drag_closed_callback_;
+ WmDragHandler::Delegate* drag_handler_delegate_ = nullptr;
std::unique_ptr<ui::OSExchangeData> source_data_;
DISALLOW_COPY_AND_ASSIGN(FakePlatformWindow);
@@ -288,10 +288,77 @@ TEST_F(DesktopDragDropClientOzoneTest, ReceiveDrag) {
EXPECT_EQ(sample_data, string_data);
EXPECT_EQ(1, dragdrop_delegate_->num_enters());
- EXPECT_EQ(1, dragdrop_delegate_->num_enters());
EXPECT_EQ(1, dragdrop_delegate_->num_updates());
EXPECT_EQ(1, dragdrop_delegate_->num_drops());
EXPECT_EQ(1, dragdrop_delegate_->num_exits());
}
+TEST_F(DesktopDragDropClientOzoneTest, TargetDestroyedDuringDrag) {
+ const int suggested_operation =
+ ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_MOVE;
+
+ // Set the operation which the destination can accept.
+ dragdrop_delegate_->SetOperation(ui::DragDropTypes::DRAG_MOVE);
+
+ // Set the data which will be delivered.
+ const base::string16 sample_data = base::ASCIIToUTF16("ReceiveDrag");
+ std::unique_ptr<ui::OSExchangeData> data =
+ std::make_unique<ui::OSExchangeData>();
+ data->SetString(sample_data);
+
+ // Simulate that the drag enter/motion/leave events happen with the
+ // |suggested_operation| in the main window.
+ platform_window_->OnDragEnter(gfx::PointF(), std::move(data),
+ suggested_operation);
+ platform_window_->OnDragMotion(gfx::PointF(), suggested_operation);
+ platform_window_->OnDragLeave();
+
+ // Create another window with its own DnD facility and simulate that the drag
+ // enters it and then the window is destroyed.
+ auto another_widget = std::make_unique<Widget>();
+ Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
+ params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params.bounds = gfx::Rect(100, 100);
+ another_widget->Init(std::move(params));
+ another_widget->Show();
+
+ aura::Window* another_window = another_widget->GetNativeWindow();
+ auto another_dragdrop_delegate = std::make_unique<FakeDragDropDelegate>();
+ aura::client::SetDragDropDelegate(another_window,
+ another_dragdrop_delegate.get());
+ another_dragdrop_delegate->SetOperation(ui::DragDropTypes::DRAG_COPY);
+
+ auto another_cursor_manager = std::make_unique<DesktopNativeCursorManager>();
+ auto another_platform_window = std::make_unique<FakePlatformWindow>();
+ ui::WmDragHandler* drag_handler =
+ ui::GetWmDragHandler(*(another_platform_window));
+ auto another_client = std::make_unique<DesktopDragDropClientOzone>(
+ another_window, another_cursor_manager.get(), drag_handler);
+ SetWmDropHandler(another_platform_window.get(), another_client.get());
+
+ std::unique_ptr<ui::OSExchangeData> another_data =
+ std::make_unique<ui::OSExchangeData>();
+ another_data->SetString(sample_data);
+ another_platform_window->OnDragEnter(gfx::PointF(), std::move(another_data),
+ suggested_operation);
+ another_platform_window->OnDragMotion(gfx::PointF(), suggested_operation);
+
+ another_widget->CloseWithReason(Widget::ClosedReason::kUnspecified);
+ another_widget.reset();
+
+ // The main window should have the typical record of a drag started and left.
+ EXPECT_EQ(1, dragdrop_delegate_->num_enters());
+ EXPECT_EQ(1, dragdrop_delegate_->num_updates());
+ EXPECT_EQ(0, dragdrop_delegate_->num_drops());
+ EXPECT_EQ(1, dragdrop_delegate_->num_exits());
+
+ // As the target window has closed and we have never provided another one,
+ // the number of exits should be zero despite that the platform window has
+ // notified the client about leaving the drag.
+ EXPECT_EQ(1, another_dragdrop_delegate->num_enters());
+ EXPECT_EQ(1, another_dragdrop_delegate->num_updates());
+ EXPECT_EQ(0, another_dragdrop_delegate->num_drops());
+ EXPECT_EQ(0, another_dragdrop_delegate->num_exits());
+}
+
} // namespace views
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc
index 806e4a883a0..e3bd6355071 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc
@@ -6,19 +6,24 @@
#include <memory>
-#include "base/metrics/histogram_macros.h"
#include "ui/base/dragdrop/drag_drop_types.h"
#include "ui/base/dragdrop/drag_source_win.h"
#include "ui/base/dragdrop/drop_target_event.h"
#include "ui/base/dragdrop/os_exchange_data_provider_win.h"
+#include "ui/base/win/event_creation_utils.h"
+#include "ui/display/win/screen_win.h"
#include "ui/views/widget/desktop_aura/desktop_drop_target_win.h"
#include "ui/views/widget/desktop_aura/desktop_window_tree_host_win.h"
namespace views {
-DesktopDragDropClientWin::DesktopDragDropClientWin(aura::Window* root_window,
- HWND window)
- : drag_drop_in_progress_(false), drag_operation_(0) {
+DesktopDragDropClientWin::DesktopDragDropClientWin(
+ aura::Window* root_window,
+ HWND window,
+ DesktopWindowTreeHostWin* desktop_host)
+ : drag_drop_in_progress_(false),
+ drag_operation_(0),
+ desktop_host_(desktop_host) {
drop_target_ = new DesktopDropTargetWin(root_window);
drop_target_->Init(window);
}
@@ -37,24 +42,36 @@ int DesktopDragDropClientWin::StartDragAndDrop(
ui::DragDropTypes::DragEventSource source) {
drag_drop_in_progress_ = true;
drag_operation_ = operation;
-
+ if (source == ui::DragDropTypes::DRAG_EVENT_SOURCE_TOUCH) {
+ gfx::Point screen_point = display::win::ScreenWin::DIPToScreenPoint(
+ {screen_location.x(), screen_location.y()});
+ // Send a mouse down and mouse move before do drag drop runs its own event
+ // loop. This is required for ::DoDragDrop to start the drag.
+ ui::SendMouseEvent(screen_point,
+ MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_ABSOLUTE);
+ ui::SendMouseEvent(screen_point, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE);
+ desktop_host_->SetInTouchDrag(true);
+ }
base::WeakPtr<DesktopDragDropClientWin> alive(weak_factory_.GetWeakPtr());
drag_source_ = ui::DragSourceWin::Create();
Microsoft::WRL::ComPtr<ui::DragSourceWin> drag_source_copy = drag_source_;
drag_source_copy->set_data(data.get());
- ui::OSExchangeDataProviderWin::GetDataObjectImpl(*data.get())
- ->set_in_drag_loop(true);
+ ui::OSExchangeDataProviderWin::GetDataObjectImpl(*data)->set_in_drag_loop(
+ true);
DWORD effect;
- UMA_HISTOGRAM_ENUMERATION("Event.DragDrop.Start", source,
- ui::DragDropTypes::DRAG_EVENT_SOURCE_COUNT);
-
- HRESULT result = DoDragDrop(
+ HRESULT result = ::DoDragDrop(
ui::OSExchangeDataProviderWin::GetIDataObject(*data.get()),
drag_source_.Get(),
ui::DragDropTypes::DragOperationToDropEffect(operation), &effect);
+ if (alive && source == ui::DragDropTypes::DRAG_EVENT_SOURCE_TOUCH) {
+ desktop_host_->SetInTouchDrag(false);
+ // Gesture state gets left in a state where you can't start
+ // another drag, unless it's cleaned up.
+ source_window->CleanupGestureState();
+ }
drag_source_copy->set_data(nullptr);
if (alive)
@@ -63,17 +80,7 @@ int DesktopDragDropClientWin::StartDragAndDrop(
if (result != DRAGDROP_S_DROP)
effect = DROPEFFECT_NONE;
- int drag_operation = ui::DragDropTypes::DropEffectToDragOperation(effect);
-
- if (drag_operation == ui::DragDropTypes::DRAG_NONE) {
- UMA_HISTOGRAM_ENUMERATION("Event.DragDrop.Cancel", source,
- ui::DragDropTypes::DRAG_EVENT_SOURCE_COUNT);
- } else {
- UMA_HISTOGRAM_ENUMERATION("Event.DragDrop.Drop", source,
- ui::DragDropTypes::DRAG_EVENT_SOURCE_COUNT);
- }
-
- return drag_operation;
+ return ui::DragDropTypes::DropEffectToDragOperation(effect);
}
void DesktopDragDropClientWin::DragCancel() {
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.h b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.h
index 74c40adff7e..a55fe963a04 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.h
+++ b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.h
@@ -28,11 +28,14 @@ class DragSourceWin;
namespace views {
class DesktopDropTargetWin;
+class DesktopWindowTreeHostWin;
class VIEWS_EXPORT DesktopDragDropClientWin
: public aura::client::DragDropClient {
public:
- DesktopDragDropClientWin(aura::Window* root_window, HWND window);
+ DesktopDragDropClientWin(aura::Window* root_window,
+ HWND window,
+ DesktopWindowTreeHostWin* desktop_host);
~DesktopDragDropClientWin() override;
// Overridden from aura::client::DragDropClient:
@@ -58,6 +61,11 @@ class VIEWS_EXPORT DesktopDragDropClientWin
scoped_refptr<DesktopDropTargetWin> drop_target_;
+ // |this| will get deleted DesktopNativeWidgetAura is notified that the
+ // DesktopWindowTreeHost is being destroyed. So desktop_host_ should outlive
+ // |this|.
+ DesktopWindowTreeHostWin* desktop_host_ = nullptr;
+
base::WeakPtrFactory<DesktopDragDropClientWin> weak_factory_{this};
DISALLOW_COPY_AND_ASSIGN(DesktopDragDropClientWin);
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_drop_target_win.cc b/chromium/ui/views/widget/desktop_aura/desktop_drop_target_win.cc
index a1703ed51c4..eac8953797e 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_drop_target_win.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_drop_target_win.cc
@@ -6,7 +6,6 @@
#include <utility>
-#include "base/metrics/histogram_macros.h"
#include "base/win/win_util.h"
#include "ui/aura/client/drag_drop_client.h"
#include "ui/aura/client/drag_drop_delegate.h"
@@ -80,8 +79,6 @@ DWORD DesktopDropTargetWin::OnDragOver(IDataObject* data_object,
if (delegate)
drag_operation = delegate->OnDragUpdated(*event);
- UMA_HISTOGRAM_BOOLEAN("Event.DragDrop.AcceptDragUpdate",
- drag_operation != ui::DragDropTypes::DRAG_NONE);
return ui::DragDropTypes::DragOperationToDropEffect(drag_operation);
}
@@ -98,14 +95,8 @@ DWORD DesktopDropTargetWin::OnDrop(IDataObject* data_object,
std::unique_ptr<ui::DropTargetEvent> event;
DragDropDelegate* delegate;
Translate(data_object, key_state, position, effect, &data, &event, &delegate);
- if (delegate) {
+ if (delegate)
drag_operation = delegate->OnPerformDrop(*event, std::move(data));
- DragDropClient* client = aura::client::GetDragDropClient(root_window_);
- if (client && !client->IsDragDropInProgress() &&
- drag_operation != ui::DragDropTypes::DRAG_NONE) {
- UMA_HISTOGRAM_COUNTS_1M("Event.DragDrop.ExternalOriginDrop", 1);
- }
- }
if (target_window_) {
target_window_->RemoveObserver(this);
target_window_ = nullptr;
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_screen.cc b/chromium/ui/views/widget/desktop_aura/desktop_screen.cc
index b656c14e4f7..50ac4c71dbf 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_screen.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_screen.cc
@@ -17,7 +17,7 @@ void InstallDesktopScreenIfNecessary() {
// The screen may have already been set in test initialization.
if (!display::Screen::GetScreen())
- display::Screen::SetScreenInstance(CreateDesktopScreen());
+ CreateDesktopScreen();
}
} // namespace views
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_screen_linux.cc b/chromium/ui/views/widget/desktop_aura/desktop_screen_linux.cc
new file mode 100644
index 00000000000..6a11abce534
--- /dev/null
+++ b/chromium/ui/views/widget/desktop_aura/desktop_screen_linux.cc
@@ -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.
+
+#include "ui/views/widget/desktop_aura/desktop_screen.h"
+
+#include "base/notreached.h"
+
+#if defined(USE_X11)
+#include "ui/views/widget/desktop_aura/desktop_screen_x11.h"
+#endif
+
+#if defined(USE_OZONE)
+#include "ui/base/ui_base_features.h"
+#include "ui/views/widget/desktop_aura/desktop_screen_ozone.h"
+#endif
+
+namespace views {
+
+display::Screen* CreateDesktopScreen() {
+#if defined(USE_OZONE)
+ if (features::IsUsingOzonePlatform())
+ return new DesktopScreenOzone();
+#endif
+#if defined(USE_X11)
+ auto* screen = new DesktopScreenX11();
+ screen->Init();
+ return screen;
+#else
+ NOTREACHED();
+ return nullptr;
+#endif
+}
+
+} // namespace views
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_screen_ozone.cc b/chromium/ui/views/widget/desktop_aura/desktop_screen_ozone.cc
index 6f9d29fbcbb..05fc9cde057 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_screen_ozone.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_screen_ozone.cc
@@ -4,6 +4,7 @@
#include "ui/views/widget/desktop_aura/desktop_screen_ozone.h"
+#include "build/build_config.h"
#include "ui/aura/screen_ozone.h"
#include "ui/views/widget/desktop_aura/desktop_screen.h"
#include "ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h"
@@ -22,8 +23,13 @@ gfx::NativeWindow DesktopScreenOzone::GetNativeWindowFromAcceleratedWidget(
widget);
}
+// To avoid multiple definitions when use_x11 && use_ozone is true, disable this
+// factory method for OS_LINUX as Linux has a factory method that decides what
+// screen to use based on IsUsingOzonePlatform feature flag.
+#if !defined(OS_LINUX)
display::Screen* CreateDesktopScreen() {
return new DesktopScreenOzone();
}
+#endif
} // namespace views
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_screen_win.cc b/chromium/ui/views/widget/desktop_aura/desktop_screen_win.cc
index 963e7053e7a..e9bb45ad238 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_screen_win.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_screen_win.cc
@@ -13,7 +13,9 @@ namespace views {
DesktopScreenWin::DesktopScreenWin() = default;
-DesktopScreenWin::~DesktopScreenWin() = default;
+DesktopScreenWin::~DesktopScreenWin() {
+ display::Screen::SetScreenInstance(old_screen_);
+}
HWND DesktopScreenWin::GetHWNDFromNativeWindow(gfx::NativeWindow window) const {
aura::WindowTreeHost* host = window->GetHost();
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_screen_win.h b/chromium/ui/views/widget/desktop_aura/desktop_screen_win.h
index 97442c424d8..52f54f2e6b8 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_screen_win.h
+++ b/chromium/ui/views/widget/desktop_aura/desktop_screen_win.h
@@ -21,6 +21,8 @@ class VIEWS_EXPORT DesktopScreenWin : public display::win::ScreenWin {
// display::win::ScreenWin:
HWND GetHWNDFromNativeWindow(gfx::NativeWindow window) const override;
gfx::NativeWindow GetNativeWindowFromHWND(HWND hwnd) const override;
+
+ display::Screen* const old_screen_ = display::Screen::SetScreenInstance(this);
};
} // namespace views
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_screen_x11.cc b/chromium/ui/views/widget/desktop_aura/desktop_screen_x11.cc
index 4f4a5d1c395..084ba94bd9a 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_screen_x11.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_screen_x11.cc
@@ -32,7 +32,9 @@ DesktopScreenX11::DesktopScreenX11() {
display_scale_factor_observer_.Add(LinuxUI::instance());
}
-DesktopScreenX11::~DesktopScreenX11() = default;
+DesktopScreenX11::~DesktopScreenX11() {
+ display::Screen::SetScreenInstance(old_screen_);
+}
void DesktopScreenX11::Init() {
if (x11_display_manager_->IsXrandrAvailable() &&
@@ -60,12 +62,11 @@ bool DesktopScreenX11::IsWindowUnderCursor(gfx::NativeWindow window) {
gfx::NativeWindow DesktopScreenX11::GetWindowAtScreenPoint(
const gfx::Point& point) {
- auto accelerated_widget =
- ui::X11TopmostWindowFinder().FindLocalProcessWindowAt(
- gfx::ConvertPointToPixel(GetXDisplayScaleFactor(), point), {});
- return accelerated_widget
+ auto window = ui::X11TopmostWindowFinder().FindLocalProcessWindowAt(
+ gfx::ConvertPointToPixel(GetXDisplayScaleFactor(), point), {});
+ return window != x11::Window::None
? views::DesktopWindowTreeHostPlatform::GetContentWindowForWidget(
- static_cast<gfx::AcceleratedWidget>(accelerated_widget))
+ window)
: nullptr;
}
@@ -75,13 +76,12 @@ gfx::NativeWindow DesktopScreenX11::GetLocalProcessWindowAtPoint(
std::set<gfx::AcceleratedWidget> ignore_widgets;
for (auto* const window : ignore)
ignore_widgets.emplace(window->GetHost()->GetAcceleratedWidget());
- auto accelerated_widget =
- ui::X11TopmostWindowFinder().FindLocalProcessWindowAt(
- gfx::ConvertPointToPixel(GetXDisplayScaleFactor(), point),
- ignore_widgets);
- return accelerated_widget
+ auto window = ui::X11TopmostWindowFinder().FindLocalProcessWindowAt(
+ gfx::ConvertPointToPixel(GetXDisplayScaleFactor(), point),
+ ignore_widgets);
+ return window != x11::Window::None
? views::DesktopWindowTreeHostPlatform::GetContentWindowForWidget(
- static_cast<gfx::AcceleratedWidget>(accelerated_widget))
+ window)
: nullptr;
}
@@ -148,7 +148,7 @@ std::string DesktopScreenX11::GetCurrentWorkspace() {
return x11_display_manager_->GetCurrentWorkspace();
}
-bool DesktopScreenX11::DispatchXEvent(XEvent* event) {
+bool DesktopScreenX11::DispatchXEvent(x11::Event* event) {
return x11_display_manager_->CanProcessEvent(*event) &&
x11_display_manager_->ProcessEvent(event);
}
@@ -176,12 +176,4 @@ float DesktopScreenX11::GetXDisplayScaleFactor() const {
: 1.0f;
}
-////////////////////////////////////////////////////////////////////////////////
-
-display::Screen* CreateDesktopScreen() {
- auto* screen = new DesktopScreenX11;
- screen->Init();
- return screen;
-}
-
} // namespace views
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_screen_x11.h b/chromium/ui/views/widget/desktop_aura/desktop_screen_x11.h
index b391f41caf2..54954d61993 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_screen_x11.h
+++ b/chromium/ui/views/widget/desktop_aura/desktop_screen_x11.h
@@ -12,6 +12,7 @@
#include "ui/base/x/x11_display_manager.h"
#include "ui/display/screen.h"
#include "ui/events/platform/x11/x11_event_source.h"
+#include "ui/gfx/x/event.h"
#include "ui/views/linux_ui/device_scale_factor_observer.h"
#include "ui/views/linux_ui/linux_ui.h"
#include "ui/views/views_export.h"
@@ -19,10 +20,6 @@
namespace views {
class DesktopScreenX11Test;
-namespace test {
-class DesktopScreenX11TestApi;
-}
-
// Screen implementation that talks to XRandR
class VIEWS_EXPORT DesktopScreenX11 : public display::Screen,
public ui::XEventDispatcher,
@@ -57,7 +54,7 @@ class VIEWS_EXPORT DesktopScreenX11 : public display::Screen,
std::string GetCurrentWorkspace() override;
// ui::XEventDispatcher:
- bool DispatchXEvent(XEvent* event) override;
+ bool DispatchXEvent(x11::Event* event) override;
// DeviceScaleFactorObserver:
void OnDeviceScaleFactorChanged() override;
@@ -66,12 +63,12 @@ class VIEWS_EXPORT DesktopScreenX11 : public display::Screen,
private:
friend class DesktopScreenX11Test;
- friend class test::DesktopScreenX11TestApi;
// ui::XDisplayManager::Delegate:
void OnXDisplayListUpdated() override;
float GetXDisplayScaleFactor() const override;
+ display::Screen* const old_screen_ = display::Screen::SetScreenInstance(this);
std::unique_ptr<ui::XDisplayManager> x11_display_manager_ =
std::make_unique<ui::XDisplayManager>(this);
ScopedObserver<LinuxUI,
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
index 4168fa1a51f..61d8b3a0678 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
@@ -184,23 +184,6 @@ Widget::MoveLoopResult DesktopWindowTreeHostLinux::RunMoveLoop(
escape_behavior);
}
-void DesktopWindowTreeHostLinux::OnDisplayMetricsChanged(
- const display::Display& display,
- uint32_t changed_metrics) {
- aura::WindowTreeHost::OnDisplayMetricsChanged(display, changed_metrics);
-
- if ((changed_metrics & DISPLAY_METRIC_DEVICE_SCALE_FACTOR) &&
- display::Screen::GetScreen()->GetDisplayNearestWindow(window()).id() ==
- display.id()) {
- // When the scale factor changes, also pretend that a resize
- // occurred so that the window layout will be refreshed and a
- // compositor redraw will be scheduled. This is weird, but works.
- // TODO(thomasanderson): Figure out a more direct way of doing
- // this.
- OnHostResizedInPixels(GetBoundsInPixels().size());
- }
-}
-
void DesktopWindowTreeHostLinux::DispatchEvent(ui::Event* event) {
// The input can be disabled and the widget marked as non-active in case of
// opened file-dialogs.
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
index 79bef5fe949..bec4d76adb1 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
+++ b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
@@ -89,12 +89,10 @@ class VIEWS_EXPORT DesktopWindowTreeHostLinux
const ui::X11Extension* GetX11Extension() const;
private:
- friend class DesktopWindowTreeHostX11Test;
FRIEND_TEST_ALL_PREFIXES(DesktopWindowTreeHostLinuxTest, HitTest);
-
- // Overridden from display::DisplayObserver via aura::WindowTreeHost:
- void OnDisplayMetricsChanged(const display::Display& display,
- uint32_t changed_metrics) override;
+ FRIEND_TEST_ALL_PREFIXES(DesktopWindowTreeHostLinuxTest, MouseNCEvents);
+ FRIEND_TEST_ALL_PREFIXES(DesktopWindowTreeHostLinuxHighDPITest,
+ MouseNCEvents);
// DesktopWindowTreeHostPlatform overrides:
void AddAdditionalInitProperties(
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_unittest.cc b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_unittest.cc
new file mode 100644
index 00000000000..15d8c29db55
--- /dev/null
+++ b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_unittest.cc
@@ -0,0 +1,228 @@
+// 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/desktop_aura/desktop_window_tree_host_linux.h"
+
+#include "base/command_line.h"
+#include "ui/base/hit_test.h"
+#include "ui/display/display_switches.h"
+#include "ui/views/test/views_test_base.h"
+#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
+#include "ui/views/widget/widget_delegate.h"
+
+namespace views {
+
+namespace {
+// A NonClientFrameView with a window mask with the bottom right corner cut out.
+class ShapedNonClientFrameView : public NonClientFrameView {
+ public:
+ ShapedNonClientFrameView() = default;
+
+ ~ShapedNonClientFrameView() override = default;
+
+ // NonClientFrameView:
+ gfx::Rect GetBoundsForClientView() const override { return bounds(); }
+ gfx::Rect GetWindowBoundsForClientBounds(
+ const gfx::Rect& client_bounds) const override {
+ return client_bounds;
+ }
+ int NonClientHitTest(const gfx::Point& point) override {
+ // Fake bottom for non client event test.
+ if (point == gfx::Point(500, 500))
+ return HTBOTTOM;
+ return HTNOWHERE;
+ }
+ void GetWindowMask(const gfx::Size& size, SkPath* window_mask) override {
+ int right = size.width();
+ int bottom = size.height();
+
+ window_mask->moveTo(0, 0);
+ window_mask->lineTo(0, bottom);
+ window_mask->lineTo(right, bottom);
+ window_mask->lineTo(right, 10);
+ window_mask->lineTo(right - 10, 10);
+ window_mask->lineTo(right - 10, 0);
+ window_mask->close();
+ }
+ void ResetWindowControls() override {}
+ void UpdateWindowIcon() override {}
+ void UpdateWindowTitle() override {}
+ void SizeConstraintsChanged() override {}
+
+ bool GetAndResetLayoutRequest() {
+ bool layout_requested = layout_requested_;
+ layout_requested_ = false;
+ return layout_requested;
+ }
+
+ private:
+ void Layout() override { layout_requested_ = true; }
+
+ bool layout_requested_ = false;
+
+ DISALLOW_COPY_AND_ASSIGN(ShapedNonClientFrameView);
+};
+
+class ShapedWidgetDelegate : public WidgetDelegateView {
+ public:
+ ShapedWidgetDelegate() = default;
+
+ ~ShapedWidgetDelegate() override = default;
+
+ // WidgetDelegateView:
+ NonClientFrameView* CreateNonClientFrameView(Widget* widget) override {
+ return new ShapedNonClientFrameView;
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ShapedWidgetDelegate);
+};
+
+class MouseEventRecorder : public ui::EventHandler {
+ public:
+ MouseEventRecorder() = default;
+ ~MouseEventRecorder() override = default;
+
+ void Reset() { mouse_events_.clear(); }
+
+ const std::vector<ui::MouseEvent>& mouse_events() const {
+ return mouse_events_;
+ }
+
+ private:
+ // ui::EventHandler:
+ void OnMouseEvent(ui::MouseEvent* mouse) override {
+ mouse_events_.push_back(*mouse);
+ }
+
+ std::vector<ui::MouseEvent> mouse_events_;
+
+ DISALLOW_COPY_AND_ASSIGN(MouseEventRecorder);
+};
+
+} // namespace
+
+class DesktopWindowTreeHostLinuxTest : public ViewsTestBase {
+ public:
+ DesktopWindowTreeHostLinuxTest() = default;
+ DesktopWindowTreeHostLinuxTest(const DesktopWindowTreeHostLinuxTest&) =
+ delete;
+ DesktopWindowTreeHostLinuxTest& operator=(
+ const DesktopWindowTreeHostLinuxTest&) = delete;
+ ~DesktopWindowTreeHostLinuxTest() override = default;
+
+ void SetUp() override {
+ set_native_widget_type(NativeWidgetType::kDesktop);
+
+ ViewsTestBase::SetUp();
+ }
+
+ protected:
+ // Creates a widget of size 100x100.
+ std::unique_ptr<Widget> CreateWidget(WidgetDelegate* delegate) {
+ std::unique_ptr<Widget> widget(new Widget);
+ Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
+ params.delegate = delegate;
+ params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params.remove_standard_frame = true;
+ params.bounds = gfx::Rect(100, 100, 100, 100);
+ widget->Init(std::move(params));
+ return widget;
+ }
+};
+
+TEST_F(DesktopWindowTreeHostLinuxTest, ChildWindowDestructionDuringTearDown) {
+ Widget parent_widget;
+ Widget::InitParams parent_params =
+ CreateParams(Widget::InitParams::TYPE_WINDOW);
+ parent_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ parent_widget.Init(std::move(parent_params));
+ parent_widget.Show();
+
+ Widget child_widget;
+ Widget::InitParams child_params =
+ CreateParams(Widget::InitParams::TYPE_WINDOW);
+ child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ child_params.parent = parent_widget.GetNativeWindow();
+ child_widget.Init(std::move(child_params));
+ child_widget.Show();
+
+ // Sanity check that the two widgets each have their own XID.
+ ASSERT_NE(parent_widget.GetNativeWindow()->GetHost()->GetAcceleratedWidget(),
+ child_widget.GetNativeWindow()->GetHost()->GetAcceleratedWidget());
+ Widget::CloseAllSecondaryWidgets();
+ EXPECT_TRUE(DesktopWindowTreeHostLinux::GetAllOpenWindows().empty());
+}
+
+TEST_F(DesktopWindowTreeHostLinuxTest, MouseNCEvents) {
+ std::unique_ptr<Widget> widget = CreateWidget(new ShapedWidgetDelegate());
+ widget->Show();
+
+ base::RunLoop().RunUntilIdle();
+
+ widget->SetBounds(gfx::Rect(100, 100, 501, 501));
+
+ base::RunLoop().RunUntilIdle();
+
+ MouseEventRecorder recorder;
+ widget->GetNativeWindow()->AddPreTargetHandler(&recorder);
+
+ auto* host_linux = static_cast<DesktopWindowTreeHostLinux*>(
+ widget->GetNativeWindow()->GetHost());
+ ASSERT_TRUE(host_linux);
+
+ ui::MouseEvent event(ui::ET_MOUSE_PRESSED, gfx::PointF(500, 500),
+ gfx::PointF(500, 500), base::TimeTicks::Now(), 0, 0, {});
+ host_linux->DispatchEvent(&event);
+
+ ASSERT_EQ(1u, recorder.mouse_events().size());
+ EXPECT_EQ(ui::ET_MOUSE_PRESSED, recorder.mouse_events()[0].type());
+ EXPECT_TRUE(recorder.mouse_events()[0].flags() & ui::EF_IS_NON_CLIENT);
+
+ widget->GetNativeWindow()->RemovePreTargetHandler(&recorder);
+}
+
+class DesktopWindowTreeHostLinuxHighDPITest
+ : public DesktopWindowTreeHostLinuxTest {
+ public:
+ DesktopWindowTreeHostLinuxHighDPITest() = default;
+ ~DesktopWindowTreeHostLinuxHighDPITest() override = default;
+
+ private:
+ void SetUp() override {
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ command_line->AppendSwitchASCII(switches::kForceDeviceScaleFactor, "2");
+
+ DesktopWindowTreeHostLinuxTest::SetUp();
+ }
+};
+
+TEST_F(DesktopWindowTreeHostLinuxHighDPITest, MouseNCEvents) {
+ std::unique_ptr<Widget> widget = CreateWidget(new ShapedWidgetDelegate());
+ widget->Show();
+
+ widget->SetBounds(gfx::Rect(100, 100, 1000, 1000));
+ base::RunLoop().RunUntilIdle();
+
+ MouseEventRecorder recorder;
+ widget->GetNativeWindow()->AddPreTargetHandler(&recorder);
+
+ auto* host_linux = static_cast<DesktopWindowTreeHostLinux*>(
+ widget->GetNativeWindow()->GetHost());
+ ASSERT_TRUE(host_linux);
+
+ ui::MouseEvent event(ui::ET_MOUSE_PRESSED, gfx::PointF(1001, 1001),
+ gfx::PointF(1001, 1001), base::TimeTicks::Now(), 0, 0,
+ {});
+ host_linux->DispatchEvent(&event);
+
+ EXPECT_EQ(1u, recorder.mouse_events().size());
+ EXPECT_EQ(gfx::Point(500, 500), recorder.mouse_events()[0].location());
+ EXPECT_EQ(ui::ET_MOUSE_PRESSED, recorder.mouse_events()[0].type());
+ EXPECT_TRUE(recorder.mouse_events()[0].flags() & ui::EF_IS_NON_CLIENT);
+
+ widget->GetNativeWindow()->RemovePreTargetHandler(&recorder);
+}
+
+} // namespace views
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc
index 62e2a8fd5ab..c9119b8606c 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc
@@ -143,4 +143,68 @@ TEST_F(DesktopWindowTreeHostPlatformTest, CallOnNativeWidgetVisibilityChanged) {
EXPECT_TRUE(observer.visible());
}
+// Tests that the minimization information is propagated to the content window.
+TEST_F(DesktopWindowTreeHostPlatformTest,
+ ToggleMinimizePropogateToContentWindow) {
+ std::unique_ptr<Widget> widget = CreateWidgetWithNativeWidget();
+ widget->Show();
+
+ auto* host_platform = DesktopWindowTreeHostPlatform::GetHostForWidget(
+ widget->GetNativeWindow()->GetHost()->GetAcceleratedWidget());
+ ASSERT_TRUE(host_platform);
+
+ EXPECT_TRUE(widget->GetNativeWindow()->IsVisible());
+
+ // Pretend a PlatformWindow enters the minimized state.
+ host_platform->OnWindowStateChanged(ui::PlatformWindowState::kMinimized);
+
+ EXPECT_FALSE(widget->GetNativeWindow()->IsVisible());
+
+ // Pretend a PlatformWindow exits the minimized state.
+ host_platform->OnWindowStateChanged(ui::PlatformWindowState::kNormal);
+ EXPECT_TRUE(widget->GetNativeWindow()->IsVisible());
+}
+
+// A Widget that allows setting the min/max size for the widget.
+class CustomSizeWidget : public Widget {
+ public:
+ CustomSizeWidget() = default;
+ ~CustomSizeWidget() override = default;
+
+ void set_min_size(const gfx::Size& size) { min_size_ = size; }
+ void set_max_size(const gfx::Size& size) { max_size_ = size; }
+
+ // Widget:
+ gfx::Size GetMinimumSize() const override { return min_size_; }
+ gfx::Size GetMaximumSize() const override { return max_size_; }
+
+ private:
+ gfx::Size min_size_;
+ gfx::Size max_size_;
+
+ DISALLOW_COPY_AND_ASSIGN(CustomSizeWidget);
+};
+
+TEST_F(DesktopWindowTreeHostPlatformTest, SetBoundsWithMinMax) {
+ CustomSizeWidget widget;
+ Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
+ params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params.bounds = gfx::Rect(200, 100);
+ widget.Init(std::move(params));
+ widget.Show();
+
+ base::RunLoop().RunUntilIdle();
+
+ EXPECT_EQ(gfx::Size(200, 100).ToString(),
+ widget.GetWindowBoundsInScreen().size().ToString());
+ widget.SetBounds(gfx::Rect(300, 200));
+ EXPECT_EQ(gfx::Size(300, 200).ToString(),
+ widget.GetWindowBoundsInScreen().size().ToString());
+
+ widget.set_min_size(gfx::Size(100, 100));
+ widget.SetBounds(gfx::Rect(50, 500));
+ EXPECT_EQ(gfx::Size(100, 500).ToString(),
+ widget.GetWindowBoundsInScreen().size().ToString());
+}
+
} // namespace views
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
index 6051aadee62..b5430b871cf 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
@@ -25,6 +25,7 @@
#include "ui/base/cursor/cursor_loader_win.h"
#include "ui/base/ime/input_method.h"
#include "ui/base/ui_base_features.h"
+#include "ui/base/win/event_creation_utils.h"
#include "ui/base/win/shell.h"
#include "ui/compositor/paint_context.h"
#include "ui/display/win/dpi.h"
@@ -32,6 +33,7 @@
#include "ui/events/keyboard_hook.h"
#include "ui/events/keycodes/dom/dom_code.h"
#include "ui/events/keycodes/dom/dom_keyboard_layout_map.h"
+#include "ui/events/platform/platform_event_source.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/vector2d.h"
#include "ui/gfx/native_widget_types.h"
@@ -118,6 +120,10 @@ aura::Window* DesktopWindowTreeHostWin::GetContentWindowForHWND(HWND hwnd) {
return host ? host->window()->GetProperty(kContentWindowForRootWindow) : NULL;
}
+void DesktopWindowTreeHostWin::SetInTouchDrag(bool in_touch_drag) {
+ in_touch_drag_ = in_touch_drag;
+}
+
////////////////////////////////////////////////////////////////////////////////
// DesktopWindowTreeHostWin, DesktopWindowTreeHost implementation:
@@ -185,7 +191,7 @@ std::unique_ptr<corewm::Tooltip> DesktopWindowTreeHostWin::CreateTooltip() {
std::unique_ptr<aura::client::DragDropClient>
DesktopWindowTreeHostWin::CreateDragDropClient(
DesktopNativeCursorManager* cursor_manager) {
- drag_drop_client_ = new DesktopDragDropClientWin(window(), GetHWND());
+ drag_drop_client_ = new DesktopDragDropClientWin(window(), GetHWND(), this);
return base::WrapUnique(drag_drop_client_);
}
@@ -920,6 +926,9 @@ void DesktopWindowTreeHostWin::HandleNativeBlur(HWND focused_window) {
}
bool DesktopWindowTreeHostWin::HandleMouseEvent(ui::MouseEvent* event) {
+ // Ignore native platform events for test purposes
+ if (ui::PlatformEventSource::ShouldIgnoreNativePlatformEvents())
+ return true;
// Mouse events in occluded windows should be very rare. If this stat isn't
// very close to 0, that would indicate that windows are incorrectly getting
// marked occluded, or getting stuck in the occluded state. Event can cause
@@ -967,6 +976,21 @@ void DesktopWindowTreeHostWin::HandleTouchEvent(ui::TouchEvent* event) {
if (!GetWidget()->GetNativeView())
return;
+ if (in_touch_drag_) {
+ POINT event_point;
+ event_point.x = event->location().x();
+ event_point.y = event->location().y();
+ ::ClientToScreen(GetHWND(), &event_point);
+ gfx::Point screen_point(event_point);
+ // Send equivalent mouse events, because Ole32 drag drop doesn't seem to
+ // handle pointer events.
+ if (event->type() == ui::ET_TOUCH_MOVED) {
+ ui::SendMouseEvent(screen_point, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE);
+ } else if (event->type() == ui::ET_TOUCH_RELEASED) {
+ ui::SendMouseEvent(screen_point,
+ MOUSEEVENTF_RIGHTUP | MOUSEEVENTF_ABSOLUTE);
+ }
+ }
// Currently we assume the window that has capture gets touch events too.
aura::WindowTreeHost* host =
aura::WindowTreeHost::GetForAcceleratedWidget(GetCapture());
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
index 75ca9e99f2c..c0f00b6d86d 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
+++ b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
@@ -59,6 +59,12 @@ class VIEWS_EXPORT DesktopWindowTreeHostWin
// A way of converting an HWND into a content window.
static aura::Window* GetContentWindowForHWND(HWND hwnd);
+ // Set to true when DesktopDragDropClientWin starts a touch-initiated drag
+ // drop and false when it finishes. While in touch drag, if pointer events are
+ // received, the equivalent mouse events are generated, because ole32
+ // ::DoDragDrop does not seem to handle pointer events.
+ void SetInTouchDrag(bool in_touch_drag);
+
protected:
// Overridden from DesktopWindowTreeHost:
void Init(const Widget::InitParams& params) override;
@@ -312,6 +318,8 @@ class VIEWS_EXPORT DesktopWindowTreeHostWin
// when that stat is no longer tracked.
gfx::Point occluded_window_mouse_event_loc_;
+ bool in_touch_drag_ = false;
+
// The z-order level of the window; the window exhibits "always on top"
// behavior if > 0.
ui::ZOrderLevel z_order_ = ui::ZOrderLevel::kNormal;
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
index 44e9eef3492..af81a254b0c 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
@@ -52,6 +52,7 @@
#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"
#include "ui/views/linux_ui/linux_ui.h"
#include "ui/views/views_switches.h"
#include "ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.h"
@@ -82,9 +83,9 @@ void DesktopWindowTreeHostX11::Init(const Widget::InitParams& params) {
// Set XEventDelegate to receive selection, drag&drop and raw key events.
//
// TODO(https://crbug.com/990756): There are two cases of this delegate:
- // XEvents for DragAndDrop client and raw key events. DragAndDrop could be
- // unified so that DragAndrDropClientOzone is used and XEvent are handled on
- // platform level.
+ // x11::Events for DragAndDrop client and raw key events. DragAndDrop could be
+ // unified so that DragAndrDropClientOzone is used and x11::Event are handled
+ // on platform level.
static_cast<ui::X11Window*>(platform_window())->SetXEventDelegate(this);
}
@@ -92,7 +93,6 @@ std::unique_ptr<aura::client::DragDropClient>
DesktopWindowTreeHostX11::CreateDragDropClient(
DesktopNativeCursorManager* cursor_manager) {
drag_drop_client_ = new DesktopDragDropClientAuraX11(window(), cursor_manager,
- GetXWindow()->display(),
GetXWindow()->window());
drag_drop_client_->Init();
return base::WrapUnique(drag_drop_client_);
@@ -101,16 +101,16 @@ DesktopWindowTreeHostX11::CreateDragDropClient(
////////////////////////////////////////////////////////////////////////////////
// DesktopWindowTreeHostX11 implementation:
-void DesktopWindowTreeHostX11::OnXWindowSelectionEvent(XEvent* xev) {
+void DesktopWindowTreeHostX11::OnXWindowSelectionEvent(x11::Event* xev) {
DCHECK(xev);
DCHECK(drag_drop_client_);
- drag_drop_client_->OnSelectionNotify(xev->xselection);
+ drag_drop_client_->OnSelectionNotify(*xev->As<x11::SelectionNotifyEvent>());
}
-void DesktopWindowTreeHostX11::OnXWindowDragDropEvent(XEvent* xev) {
+void DesktopWindowTreeHostX11::OnXWindowDragDropEvent(x11::Event* xev) {
DCHECK(xev);
DCHECK(drag_drop_client_);
- drag_drop_client_->HandleXdndEvent(xev->xclient);
+ drag_drop_client_->HandleXdndEvent(*xev->As<x11::ClientMessageEvent>());
}
const ui::XWindow* DesktopWindowTreeHostX11::GetXWindow() const {
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
index 8cd6b80ee1e..69501945464 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
+++ b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
@@ -8,6 +8,7 @@
#include <memory>
#include "base/macros.h"
+#include "ui/gfx/x/event.h"
#include "ui/gfx/x/x11_types.h"
#include "ui/platform_window/platform_window_delegate.h"
#include "ui/platform_window/x11/x11_window.h"
@@ -40,8 +41,8 @@ class VIEWS_EXPORT DesktopWindowTreeHostX11 : public DesktopWindowTreeHostLinux,
friend class DesktopWindowTreeHostX11HighDPITest;
// Overridden from ui::XEventDelegate.
- void OnXWindowSelectionEvent(XEvent* xev) override;
- void OnXWindowDragDropEvent(XEvent* xev) override;
+ void OnXWindowSelectionEvent(x11::Event* xev) override;
+ void OnXWindowDragDropEvent(x11::Event* xev) override;
// Casts PlatformWindow into XWindow and returns the result. This is a temp
// solution to access XWindow, which is subclassed by the X11Window, which is
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_interactive_uitest.cc b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_interactive_uitest.cc
index c63bfe26350..b7c96511462 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_interactive_uitest.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_interactive_uitest.cc
@@ -4,6 +4,8 @@
#include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h"
+#include <xcb/xproto.h>
+
#include <memory>
#include "base/macros.h"
@@ -17,6 +19,7 @@
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/events/x/x11_event_translation.h"
#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/x/event.h"
#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_atom_cache.h"
#include "ui/views/controls/textfield/textfield.h"
@@ -30,7 +33,7 @@ namespace {
// Blocks till |window| gets activated.
class ActivationWaiter : public ui::X11PropertyChangeWaiter {
public:
- explicit ActivationWaiter(XID window)
+ explicit ActivationWaiter(x11::Window window)
: ui::X11PropertyChangeWaiter(ui::GetX11RootWindow(),
"_NET_ACTIVE_WINDOW"),
window_(window) {}
@@ -39,13 +42,14 @@ class ActivationWaiter : public ui::X11PropertyChangeWaiter {
private:
// ui::X11PropertyChangeWaiter:
- bool ShouldKeepOnWaiting(XEvent* event) override {
- XID xid = 0;
- ui::GetXIDProperty(ui::GetX11RootWindow(), "_NET_ACTIVE_WINDOW", &xid);
- return xid != window_;
+ bool ShouldKeepOnWaiting(x11::Event* event) override {
+ x11::Window window = x11::Window::None;
+ ui::GetProperty(ui::GetX11RootWindow(), gfx::GetAtom("_NET_ACTIVE_WINDOW"),
+ &window);
+ return window != window_;
}
- XID window_;
+ x11::Window window_;
DISALLOW_COPY_AND_ASSIGN(ActivationWaiter);
};
@@ -88,23 +92,25 @@ void DispatchMouseMotionEvent(DesktopWindowTreeHostX11* desktop_host,
const gfx::Point& point_in_screen) {
gfx::Rect bounds_in_screen = desktop_host->window()->GetBoundsInScreen();
- Display* display = gfx::GetXDisplay();
- XEvent xev;
- xev.xmotion.type = MotionNotify;
- xev.xmotion.display = display;
- xev.xmotion.window = desktop_host->GetAcceleratedWidget();
- xev.xmotion.root = DefaultRootWindow(display);
- xev.xmotion.subwindow = 0;
- xev.xmotion.time = x11::CurrentTime;
- xev.xmotion.x = point_in_screen.x() - bounds_in_screen.x();
- xev.xmotion.y = point_in_screen.y() - bounds_in_screen.y();
- xev.xmotion.x_root = point_in_screen.x();
- xev.xmotion.y_root = point_in_screen.y();
- xev.xmotion.state = 0;
- xev.xmotion.is_hint = NotifyNormal;
- xev.xmotion.same_screen = x11::True;
-
- ui::X11EventSource::GetInstance()->ProcessXEvent(&xev);
+ auto* connection = x11::Connection::Get();
+ xcb_generic_event_t ge;
+ memset(&ge, 0, sizeof(ge));
+ auto* xev = reinterpret_cast<xcb_motion_notify_event_t*>(&ge);
+ xev->response_type = MotionNotify;
+ xev->event = static_cast<uint32_t>(desktop_host->GetAcceleratedWidget());
+ xev->root = static_cast<uint32_t>(connection->default_screen().root);
+ xev->child = 0;
+ xev->time = x11::CurrentTime;
+ xev->event_x = point_in_screen.x() - bounds_in_screen.x();
+ xev->event_y = point_in_screen.y() - bounds_in_screen.y();
+ xev->root_x = point_in_screen.x();
+ xev->root_y = point_in_screen.y();
+ xev->state = 0;
+ xev->detail = NotifyNormal;
+ xev->same_screen = x11::True;
+
+ x11::Event x11_event(&ge, connection);
+ ui::X11EventSource::GetInstance()->ProcessXEvent(&x11_event);
}
} // namespace
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc
deleted file mode 100644
index 1f4b3a5244c..00000000000
--- a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc
+++ /dev/null
@@ -1,675 +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 <stddef.h>
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "base/command_line.h"
-#include "base/macros.h"
-#include "base/run_loop.h"
-#include "base/stl_util.h"
-#include "third_party/skia/include/core/SkPath.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/base/hit_test.h"
-#include "ui/base/x/test/x11_property_change_waiter.h"
-#include "ui/base/x/x11_util.h"
-#include "ui/display/display_switches.h"
-#include "ui/events/devices/x11/touch_factory_x11.h"
-#include "ui/events/platform/x11/x11_event_source.h"
-#include "ui/events/test/events_test_utils_x11.h"
-#include "ui/events/test/platform_event_source_test_api.h"
-#include "ui/events/x/x11_event_translation.h"
-#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_atom_cache.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_x11.h"
-#include "ui/views/widget/widget_delegate.h"
-#include "ui/views/window/non_client_view.h"
-
-namespace views {
-
-namespace {
-
-const int kPointerDeviceId = 1;
-
-// Blocks till the window state hint, |hint|, is set or unset.
-class WMStateWaiter : public ui::X11PropertyChangeWaiter {
- public:
- WMStateWaiter(XID window, const char* hint, bool wait_till_set)
- : ui::X11PropertyChangeWaiter(window, "_NET_WM_STATE"),
- hint_(hint),
- wait_till_set_(wait_till_set) {}
-
- ~WMStateWaiter() override = default;
-
- private:
- // X11PropertyChangeWaiter:
- bool ShouldKeepOnWaiting(XEvent* event) override {
- std::vector<Atom> hints;
- if (ui::GetAtomArrayProperty(xwindow(), "_NET_WM_STATE", &hints))
- return base::Contains(hints, gfx::GetAtom(hint_)) != wait_till_set_;
- return true;
- }
-
- // The name of the hint to wait to get set or unset.
- const char* hint_;
-
- // Whether we are waiting for |hint| to be set or unset.
- bool wait_till_set_;
-
- DISALLOW_COPY_AND_ASSIGN(WMStateWaiter);
-};
-
-// A NonClientFrameView with a window mask with the bottom right corner cut out.
-class ShapedNonClientFrameView : public NonClientFrameView {
- public:
- ShapedNonClientFrameView() = default;
-
- ~ShapedNonClientFrameView() override = default;
-
- // NonClientFrameView:
- gfx::Rect GetBoundsForClientView() const override { return bounds(); }
- gfx::Rect GetWindowBoundsForClientBounds(
- const gfx::Rect& client_bounds) const override {
- return client_bounds;
- }
- int NonClientHitTest(const gfx::Point& point) override {
- // Fake bottom for non client event test.
- if (point == gfx::Point(500, 500))
- return HTBOTTOM;
- return HTNOWHERE;
- }
- void GetWindowMask(const gfx::Size& size, SkPath* window_mask) override {
- int right = size.width();
- int bottom = size.height();
-
- window_mask->moveTo(0, 0);
- window_mask->lineTo(0, bottom);
- window_mask->lineTo(right, bottom);
- window_mask->lineTo(right, 10);
- window_mask->lineTo(right - 10, 10);
- window_mask->lineTo(right - 10, 0);
- window_mask->close();
- }
- void ResetWindowControls() override {}
- void UpdateWindowIcon() override {}
- void UpdateWindowTitle() override {}
- void SizeConstraintsChanged() override {}
-
- bool GetAndResetLayoutRequest() {
- bool layout_requested = layout_requested_;
- layout_requested_ = false;
- return layout_requested;
- }
-
- private:
- void Layout() override { layout_requested_ = true; }
-
- bool layout_requested_ = false;
-
- DISALLOW_COPY_AND_ASSIGN(ShapedNonClientFrameView);
-};
-
-class ShapedWidgetDelegate : public WidgetDelegateView {
- public:
- ShapedWidgetDelegate() = default;
-
- ~ShapedWidgetDelegate() override = default;
-
- // WidgetDelegateView:
- NonClientFrameView* CreateNonClientFrameView(Widget* widget) override {
- return new ShapedNonClientFrameView;
- }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(ShapedWidgetDelegate);
-};
-
-// Creates a widget of size 100x100.
-std::unique_ptr<Widget> CreateWidget(WidgetDelegate* delegate) {
- std::unique_ptr<Widget> widget(new Widget);
- Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
- params.delegate = delegate;
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- params.remove_standard_frame = true;
- params.bounds = gfx::Rect(100, 100, 100, 100);
- widget->Init(std::move(params));
- return widget;
-}
-
-// Returns the list of rectangles which describe |xid|'s bounding region via the
-// X shape extension.
-std::vector<gfx::Rect> GetShapeRects(XID xid) {
- int dummy;
- int shape_rects_size;
- gfx::XScopedPtr<XRectangle[]> shape_rects(XShapeGetRectangles(
- gfx::GetXDisplay(), xid, ShapeBounding, &shape_rects_size, &dummy));
-
- std::vector<gfx::Rect> shape_vector;
- for (int i = 0; i < shape_rects_size; ++i) {
- const XRectangle& rect = shape_rects[i];
- shape_vector.emplace_back(rect.x, rect.y, rect.width, rect.height);
- }
- return shape_vector;
-}
-
-// Returns true if one of |rects| contains point (x,y).
-bool ShapeRectContainsPoint(const std::vector<gfx::Rect>& shape_rects,
- int x,
- int y) {
- gfx::Point point(x, y);
- return std::any_of(
- shape_rects.cbegin(), shape_rects.cend(),
- [&point](const auto& rect) { return rect.Contains(point); });
-}
-
-} // namespace
-
-class DesktopWindowTreeHostX11Test : public ViewsTestBase {
- public:
- DesktopWindowTreeHostX11Test()
- : event_source_(ui::X11EventSource::GetInstance()) {}
- ~DesktopWindowTreeHostX11Test() override = default;
-
- void SetUp() override {
- set_native_widget_type(NativeWidgetType::kDesktop);
-
- std::vector<int> pointer_devices;
- pointer_devices.push_back(kPointerDeviceId);
- ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(pointer_devices);
-
- ViewsTestBase::SetUp();
-
- // Make X11 synchronous for our display connection. This does not force the
- // window manager to behave synchronously.
- XSynchronize(gfx::GetXDisplay(), x11::True);
- }
-
- void TearDown() override {
- XSynchronize(gfx::GetXDisplay(), x11::False);
- ViewsTestBase::TearDown();
- }
-
- void DispatchSingleEventToWidget(XEvent* xev, Widget* widget) {
- DCHECK_EQ(GenericEvent, xev->type);
- XIDeviceEvent* device_event =
- static_cast<XIDeviceEvent*>(xev->xcookie.data);
- device_event->event =
- widget->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
- event_source_->ProcessXEvent(xev);
- }
-
- private:
- ui::X11EventSource* event_source_;
- DISALLOW_COPY_AND_ASSIGN(DesktopWindowTreeHostX11Test);
-};
-
-// https://crbug.com/898742: Test is flaky.
-// Tests that the shape is properly set on the x window.
-TEST_F(DesktopWindowTreeHostX11Test, DISABLED_Shape) {
- if (!ui::IsShapeExtensionAvailable())
- return;
-
- // 1) Test setting the window shape via the NonClientFrameView. This technique
- // is used to get rounded corners on Chrome windows when not using the native
- // window frame.
- std::unique_ptr<Widget> widget1 = CreateWidget(new ShapedWidgetDelegate());
- widget1->Show();
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- XID xid1 = widget1->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
- std::vector<gfx::Rect> shape_rects = GetShapeRects(xid1);
- ASSERT_FALSE(shape_rects.empty());
-
- // The widget was supposed to be 100x100, but the WM might have ignored this
- // suggestion.
- int widget_width = widget1->GetWindowBoundsInScreen().width();
- EXPECT_TRUE(ShapeRectContainsPoint(shape_rects, widget_width - 15, 5));
- EXPECT_FALSE(ShapeRectContainsPoint(shape_rects, widget_width - 5, 5));
- EXPECT_TRUE(ShapeRectContainsPoint(shape_rects, widget_width - 5, 15));
- EXPECT_FALSE(ShapeRectContainsPoint(shape_rects, widget_width + 5, 15));
-
- // Changing widget's size should update the shape.
- widget1->SetBounds(gfx::Rect(100, 100, 200, 200));
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- if (widget1->GetWindowBoundsInScreen().width() == 200) {
- shape_rects = GetShapeRects(xid1);
- ASSERT_FALSE(shape_rects.empty());
- EXPECT_TRUE(ShapeRectContainsPoint(shape_rects, 85, 5));
- EXPECT_TRUE(ShapeRectContainsPoint(shape_rects, 95, 5));
- EXPECT_TRUE(ShapeRectContainsPoint(shape_rects, 185, 5));
- EXPECT_FALSE(ShapeRectContainsPoint(shape_rects, 195, 5));
- EXPECT_TRUE(ShapeRectContainsPoint(shape_rects, 195, 15));
- EXPECT_FALSE(ShapeRectContainsPoint(shape_rects, 205, 15));
- }
-
- if (ui::WmSupportsHint(gfx::GetAtom("_NET_WM_STATE_MAXIMIZED_VERT"))) {
- // The shape should be changed to a rectangle which fills the entire screen
- // when |widget1| is maximized.
- {
- WMStateWaiter waiter(xid1, "_NET_WM_STATE_MAXIMIZED_VERT", true);
- widget1->Maximize();
- waiter.Wait();
- }
-
- // Ensure that the task which is posted when a window is resized is run.
- base::RunLoop().RunUntilIdle();
-
- // xvfb does not support Xrandr so we cannot check the maximized window's
- // bounds.
- gfx::Rect maximized_bounds;
- ui::GetOuterWindowBounds(xid1, &maximized_bounds);
-
- shape_rects = GetShapeRects(xid1);
- ASSERT_FALSE(shape_rects.empty());
- EXPECT_TRUE(
- ShapeRectContainsPoint(shape_rects, maximized_bounds.width() - 1, 5));
- EXPECT_TRUE(
- ShapeRectContainsPoint(shape_rects, maximized_bounds.width() - 1, 15));
- }
-
- // 2) Test setting the window shape via Widget::SetShape().
- auto shape_region = std::make_unique<Widget::ShapeRects>();
- shape_region->emplace_back(10, 0, 90, 10);
- shape_region->emplace_back(0, 10, 10, 90);
- shape_region->emplace_back(10, 10, 90, 90);
-
- std::unique_ptr<Widget> widget2(CreateWidget(nullptr));
- widget2->Show();
- widget2->SetShape(std::move(shape_region));
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- XID xid2 = widget2->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
- shape_rects = GetShapeRects(xid2);
- ASSERT_FALSE(shape_rects.empty());
- EXPECT_FALSE(ShapeRectContainsPoint(shape_rects, 5, 5));
- EXPECT_TRUE(ShapeRectContainsPoint(shape_rects, 15, 5));
- EXPECT_TRUE(ShapeRectContainsPoint(shape_rects, 95, 15));
- EXPECT_FALSE(ShapeRectContainsPoint(shape_rects, 105, 15));
-
- // Changing the widget's size should not affect the shape.
- widget2->SetBounds(gfx::Rect(100, 100, 200, 200));
- shape_rects = GetShapeRects(xid2);
- ASSERT_FALSE(shape_rects.empty());
- EXPECT_FALSE(ShapeRectContainsPoint(shape_rects, 5, 5));
- EXPECT_TRUE(ShapeRectContainsPoint(shape_rects, 15, 5));
- EXPECT_TRUE(ShapeRectContainsPoint(shape_rects, 95, 15));
- EXPECT_FALSE(ShapeRectContainsPoint(shape_rects, 105, 15));
-
- // Setting the shape to NULL resets the shape back to the entire
- // window bounds.
- widget2->SetShape(nullptr);
- shape_rects = GetShapeRects(xid2);
- ASSERT_FALSE(shape_rects.empty());
- EXPECT_TRUE(ShapeRectContainsPoint(shape_rects, 5, 5));
- EXPECT_TRUE(ShapeRectContainsPoint(shape_rects, 15, 5));
- EXPECT_TRUE(ShapeRectContainsPoint(shape_rects, 95, 15));
- EXPECT_TRUE(ShapeRectContainsPoint(shape_rects, 105, 15));
- EXPECT_FALSE(ShapeRectContainsPoint(shape_rects, 500, 500));
-}
-
-// Test that the widget reacts on changes in fullscreen state initiated by the
-// window manager (e.g. via a window manager accelerator key).
-TEST_F(DesktopWindowTreeHostX11Test, WindowManagerTogglesFullscreen) {
- if (!ui::WmSupportsHint(gfx::GetAtom("_NET_WM_STATE_FULLSCREEN")))
- return;
-
- Display* display = gfx::GetXDisplay();
-
- std::unique_ptr<Widget> widget = CreateWidget(new ShapedWidgetDelegate());
- auto* non_client_view = static_cast<ShapedNonClientFrameView*>(
- widget->non_client_view()->frame_view());
- ASSERT_TRUE(non_client_view);
- XID xid = widget->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
- widget->Show();
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- gfx::Rect initial_bounds = widget->GetWindowBoundsInScreen();
- {
- WMStateWaiter waiter(xid, "_NET_WM_STATE_FULLSCREEN", true);
- widget->SetFullscreen(true);
- waiter.Wait();
- }
- EXPECT_TRUE(widget->IsFullscreen());
-
- // After the fullscreen state has been set, there must be a relayout request
- EXPECT_TRUE(non_client_view->GetAndResetLayoutRequest());
-
- // Ensure there is not request before we proceed.
- EXPECT_FALSE(non_client_view->GetAndResetLayoutRequest());
-
- // Emulate the window manager exiting fullscreen via a window manager
- // accelerator key.
- {
- XEvent xclient;
- memset(&xclient, 0, sizeof(xclient));
- xclient.type = ClientMessage;
- xclient.xclient.window = xid;
- xclient.xclient.message_type = gfx::GetAtom("_NET_WM_STATE");
- xclient.xclient.format = 32;
- xclient.xclient.data.l[0] = 0;
- xclient.xclient.data.l[1] = gfx::GetAtom("_NET_WM_STATE_FULLSCREEN");
- xclient.xclient.data.l[2] = 0;
- xclient.xclient.data.l[3] = 1;
- xclient.xclient.data.l[4] = 0;
- XSendEvent(display, DefaultRootWindow(display), x11::False,
- SubstructureRedirectMask | SubstructureNotifyMask, &xclient);
-
- WMStateWaiter waiter(xid, "_NET_WM_STATE_FULLSCREEN", false);
- waiter.Wait();
- }
- // Ensure it continues in browser fullscreen mode and bounds are restored to
- // |initial_bounds|.
- EXPECT_TRUE(widget->IsFullscreen());
- EXPECT_EQ(initial_bounds.ToString(),
- widget->GetWindowBoundsInScreen().ToString());
-
- // Emulate window resize (through X11 configure events) while in browser
- // fullscreen mode and ensure bounds are tracked correctly.
- initial_bounds.set_size({400, 400});
- {
- XWindowChanges changes = {0};
- changes.width = initial_bounds.width();
- changes.height = initial_bounds.height();
- XConfigureWindow(display, xid, CWHeight | CWWidth, &changes);
- // Ensure that the task which is posted when a window is resized is run.
- base::RunLoop().RunUntilIdle();
- }
- EXPECT_TRUE(widget->IsFullscreen());
- EXPECT_EQ(initial_bounds.ToString(),
- widget->GetWindowBoundsInScreen().ToString());
-
- // Calling Widget::SetFullscreen(false) should clear the widget's fullscreen
- // state and clean things up.
- widget->SetFullscreen(false);
- EXPECT_FALSE(widget->IsFullscreen());
- EXPECT_EQ(initial_bounds.ToString(),
- widget->GetWindowBoundsInScreen().ToString());
-
- // Even though the unfullscreen request came from the window manager, we must
- // still react and relayout.
- EXPECT_TRUE(non_client_view->GetAndResetLayoutRequest());
-}
-
-// Tests that the minimization information is propagated to the content window.
-TEST_F(DesktopWindowTreeHostX11Test, ToggleMinimizePropogateToContentWindow) {
- Widget widget;
- Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget.Init(std::move(params));
- widget.Show();
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- XID xid = widget.GetNativeWindow()->GetHost()->GetAcceleratedWidget();
- Display* display = gfx::GetXDisplay();
-
- // Minimize by sending _NET_WM_STATE_HIDDEN
- {
- std::vector<::Atom> atom_list;
- atom_list.push_back(gfx::GetAtom("_NET_WM_STATE_HIDDEN"));
- ui::SetAtomArrayProperty(xid, "_NET_WM_STATE", "ATOM", atom_list);
-
- XEvent xevent;
- memset(&xevent, 0, sizeof(xevent));
- xevent.type = PropertyNotify;
- xevent.xproperty.type = PropertyNotify;
- xevent.xproperty.send_event = 1;
- xevent.xproperty.display = display;
- xevent.xproperty.window = xid;
- xevent.xproperty.atom = gfx::GetAtom("_NET_WM_STATE");
- xevent.xproperty.state = 0;
- XSendEvent(display, DefaultRootWindow(display), x11::False,
- SubstructureRedirectMask | SubstructureNotifyMask, &xevent);
-
- WMStateWaiter waiter(xid, "_NET_WM_STATE_HIDDEN", true);
- waiter.Wait();
- }
- EXPECT_FALSE(widget.GetNativeWindow()->IsVisible());
-
- // Show from minimized by sending _NET_WM_STATE_FOCUSED
- {
- std::vector<::Atom> atom_list;
- atom_list.push_back(gfx::GetAtom("_NET_WM_STATE_FOCUSED"));
- ui::SetAtomArrayProperty(xid, "_NET_WM_STATE", "ATOM", atom_list);
-
- XEvent xevent;
- memset(&xevent, 0, sizeof(xevent));
- xevent.type = PropertyNotify;
- xevent.xproperty.type = PropertyNotify;
- xevent.xproperty.send_event = 1;
- xevent.xproperty.display = display;
- xevent.xproperty.window = xid;
- xevent.xproperty.atom = gfx::GetAtom("_NET_WM_STATE");
- xevent.xproperty.state = 0;
- XSendEvent(display, DefaultRootWindow(display), x11::False,
- SubstructureRedirectMask | SubstructureNotifyMask, &xevent);
-
- WMStateWaiter waiter(xid, "_NET_WM_STATE_FOCUSED", true);
- waiter.Wait();
- }
- EXPECT_TRUE(widget.GetNativeWindow()->IsVisible());
-}
-
-TEST_F(DesktopWindowTreeHostX11Test, ChildWindowDestructionDuringTearDown) {
- Widget parent_widget;
- Widget::InitParams parent_params =
- CreateParams(Widget::InitParams::TYPE_WINDOW);
- parent_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- parent_widget.Init(std::move(parent_params));
- parent_widget.Show();
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- Widget child_widget;
- Widget::InitParams child_params =
- CreateParams(Widget::InitParams::TYPE_WINDOW);
- child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- child_params.parent = parent_widget.GetNativeWindow();
- child_widget.Init(std::move(child_params));
- child_widget.Show();
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- // Sanity check that the two widgets each have their own XID.
- ASSERT_NE(parent_widget.GetNativeWindow()->GetHost()->GetAcceleratedWidget(),
- child_widget.GetNativeWindow()->GetHost()->GetAcceleratedWidget());
- Widget::CloseAllSecondaryWidgets();
- EXPECT_TRUE(DesktopWindowTreeHostLinux::GetAllOpenWindows().empty());
-}
-
-// A Widget that allows setting the min/max size for the widget.
-class CustomSizeWidget : public Widget {
- public:
- CustomSizeWidget() = default;
- ~CustomSizeWidget() override = default;
-
- void set_min_size(const gfx::Size& size) { min_size_ = size; }
- void set_max_size(const gfx::Size& size) { max_size_ = size; }
-
- // Widget:
- gfx::Size GetMinimumSize() const override { return min_size_; }
- gfx::Size GetMaximumSize() const override { return max_size_; }
-
- private:
- gfx::Size min_size_;
- gfx::Size max_size_;
-
- DISALLOW_COPY_AND_ASSIGN(CustomSizeWidget);
-};
-
-TEST_F(DesktopWindowTreeHostX11Test, SetBoundsWithMinMax) {
- CustomSizeWidget widget;
- Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- params.bounds = gfx::Rect(200, 100);
- widget.Init(std::move(params));
- widget.Show();
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- EXPECT_EQ(gfx::Size(200, 100).ToString(),
- widget.GetWindowBoundsInScreen().size().ToString());
- widget.SetBounds(gfx::Rect(300, 200));
- EXPECT_EQ(gfx::Size(300, 200).ToString(),
- widget.GetWindowBoundsInScreen().size().ToString());
-
- widget.set_min_size(gfx::Size(100, 100));
- widget.SetBounds(gfx::Rect(50, 500));
- EXPECT_EQ(gfx::Size(100, 500).ToString(),
- widget.GetWindowBoundsInScreen().size().ToString());
-}
-
-class MouseEventRecorder : public ui::EventHandler {
- public:
- MouseEventRecorder() = default;
- ~MouseEventRecorder() override = default;
-
- void Reset() { mouse_events_.clear(); }
-
- const std::vector<ui::MouseEvent>& mouse_events() const {
- return mouse_events_;
- }
-
- private:
- // ui::EventHandler:
- void OnMouseEvent(ui::MouseEvent* mouse) override {
- mouse_events_.push_back(*mouse);
- }
-
- std::vector<ui::MouseEvent> mouse_events_;
-
- DISALLOW_COPY_AND_ASSIGN(MouseEventRecorder);
-};
-
-class DesktopWindowTreeHostX11HighDPITest
- : public DesktopWindowTreeHostX11Test {
- public:
- DesktopWindowTreeHostX11HighDPITest() = default;
- ~DesktopWindowTreeHostX11HighDPITest() override = default;
-
- void PretendCapture(views::Widget* capture_widget) {
- if (capture_widget)
- capture_widget->GetNativeWindow()->SetCapture();
- }
-
- private:
- void SetUp() override {
- base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
- command_line->AppendSwitchASCII(switches::kForceDeviceScaleFactor, "2");
-
- DesktopWindowTreeHostX11Test::SetUp();
- }
-
- DISALLOW_COPY_AND_ASSIGN(DesktopWindowTreeHostX11HighDPITest);
-};
-
-// https://crbug.com/702687
-TEST_F(DesktopWindowTreeHostX11HighDPITest,
- DISABLED_LocatedEventDispatchWithCapture) {
- Widget first;
- Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- params.bounds = gfx::Rect(0, 0, 50, 50);
- first.Init(std::move(params));
- first.Show();
-
- Widget second;
- params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- params.bounds = gfx::Rect(50, 50, 50, 50);
- second.Init(std::move(params));
- second.Show();
-
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- MouseEventRecorder first_recorder, second_recorder;
- first.GetNativeWindow()->AddPreTargetHandler(&first_recorder);
- second.GetNativeWindow()->AddPreTargetHandler(&second_recorder);
-
- // Dispatch an event on |first|. Verify it gets the event.
- ui::ScopedXI2Event event;
- event.InitGenericButtonEvent(kPointerDeviceId, ui::ET_MOUSEWHEEL,
- gfx::Point(50, 50), ui::EF_NONE);
- DispatchSingleEventToWidget(event, &first);
- ASSERT_EQ(1u, first_recorder.mouse_events().size());
- EXPECT_EQ(ui::ET_MOUSEWHEEL, first_recorder.mouse_events()[0].type());
- EXPECT_EQ(gfx::Point(25, 25).ToString(),
- first_recorder.mouse_events()[0].location().ToString());
- ASSERT_EQ(0u, second_recorder.mouse_events().size());
-
- first_recorder.Reset();
- second_recorder.Reset();
-
- // Set a capture on |second|, and dispatch the same event to |first|. This
- // event should reach |second| instead.
- PretendCapture(&second);
- event.InitGenericButtonEvent(kPointerDeviceId, ui::ET_MOUSEWHEEL,
- gfx::Point(50, 50), ui::EF_NONE);
- DispatchSingleEventToWidget(event, &first);
-
- ASSERT_EQ(0u, first_recorder.mouse_events().size());
- ASSERT_EQ(1u, second_recorder.mouse_events().size());
- EXPECT_EQ(ui::ET_MOUSEWHEEL, second_recorder.mouse_events()[0].type());
- EXPECT_EQ(gfx::Point(-25, -25).ToString(),
- second_recorder.mouse_events()[0].location().ToString());
-
- PretendCapture(nullptr);
- first.GetNativeWindow()->RemovePreTargetHandler(&first_recorder);
- second.GetNativeWindow()->RemovePreTargetHandler(&second_recorder);
-}
-
-TEST_F(DesktopWindowTreeHostX11Test, MouseNCEvents) {
- std::unique_ptr<Widget> widget = CreateWidget(new ShapedWidgetDelegate());
- widget->Show();
-
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- widget->SetBounds(gfx::Rect(100, 100, 501, 501));
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- MouseEventRecorder recorder;
- widget->GetNativeWindow()->AddPreTargetHandler(&recorder);
-
- ui::ScopedXI2Event event;
- event.InitGenericButtonEvent(kPointerDeviceId, ui::ET_MOUSE_PRESSED,
- gfx::Point(500, 500), ui::EF_LEFT_MOUSE_BUTTON);
-
- DispatchSingleEventToWidget(event, widget.get());
- ASSERT_EQ(1u, recorder.mouse_events().size());
- EXPECT_EQ(ui::ET_MOUSE_PRESSED, recorder.mouse_events()[0].type());
- EXPECT_TRUE(recorder.mouse_events()[0].flags() & ui::EF_IS_NON_CLIENT);
-
- widget->GetNativeWindow()->RemovePreTargetHandler(&recorder);
-}
-
-TEST_F(DesktopWindowTreeHostX11HighDPITest, MouseNCEvents) {
- std::unique_ptr<Widget> widget = CreateWidget(new ShapedWidgetDelegate());
- widget->Show();
-
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- widget->SetBounds(gfx::Rect(100, 100, 1000, 1000));
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- MouseEventRecorder recorder;
- widget->GetNativeWindow()->AddPreTargetHandler(&recorder);
-
- ui::ScopedXI2Event event;
- event.InitGenericButtonEvent(kPointerDeviceId, ui::ET_MOUSE_PRESSED,
- gfx::Point(1001, 1001),
- ui::EF_LEFT_MOUSE_BUTTON);
- DispatchSingleEventToWidget(event, widget.get());
- ASSERT_EQ(1u, recorder.mouse_events().size());
- EXPECT_EQ(ui::ET_MOUSE_PRESSED, recorder.mouse_events()[0].type());
- EXPECT_TRUE(recorder.mouse_events()[0].flags() & ui::EF_IS_NON_CLIENT);
-
- widget->GetNativeWindow()->RemovePreTargetHandler(&recorder);
-}
-
-} // namespace views
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
new file mode 100644
index 00000000000..c9946d29596
--- /dev/null
+++ b/chromium/ui/views/widget/desktop_aura/x11_drag_drop_client_unittest.cc
@@ -0,0 +1,827 @@
+// 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/x/x11_drag_drop_client.h"
+
+#include <map>
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/location.h"
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/run_loop.h"
+#include "base/single_thread_task_runner.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "ui/aura/client/drag_drop_client.h"
+#include "ui/aura/client/drag_drop_delegate.h"
+#include "ui/aura/test/test_screen.h"
+#include "ui/aura/window.h"
+#include "ui/aura/window_tree_host.h"
+#include "ui/base/dragdrop/os_exchange_data.h"
+#include "ui/base/x/x11_cursor.h"
+#include "ui/base/x/x11_move_loop.h"
+#include "ui/base/x/x11_move_loop_delegate.h"
+#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"
+#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
+#include "ui/views/widget/widget.h"
+
+namespace views {
+
+namespace {
+
+class TestDragDropClient;
+
+// Collects messages which would otherwise be sent to |window_| via
+// SendXClientEvent().
+class ClientMessageEventCollector {
+ public:
+ ClientMessageEventCollector(x11::Window window, TestDragDropClient* client);
+ virtual ~ClientMessageEventCollector();
+
+ // Returns true if |events_| is non-empty.
+ bool HasEvents() const { return !events_.empty(); }
+
+ // Pops all of |events_| and returns the popped events in the order that they
+ // were on the stack
+ std::vector<x11::ClientMessageEvent> PopAllEvents();
+
+ // Adds |event| to the stack.
+ void RecordEvent(const x11::ClientMessageEvent& event);
+
+ private:
+ x11::Window window_;
+
+ // Not owned.
+ TestDragDropClient* client_;
+
+ std::vector<x11::ClientMessageEvent> events_;
+
+ DISALLOW_COPY_AND_ASSIGN(ClientMessageEventCollector);
+};
+
+// An implementation of ui::X11MoveLoop where RunMoveLoop() always starts the
+// move loop.
+class TestMoveLoop : public ui::X11MoveLoop {
+ public:
+ explicit TestMoveLoop(ui::X11MoveLoopDelegate* delegate);
+ ~TestMoveLoop() override;
+
+ // Returns true if the move loop is running.
+ bool IsRunning() const;
+
+ // ui::X11MoveLoop:
+ bool RunMoveLoop(bool can_grab_pointer,
+ ::Cursor old_cursor,
+ ::Cursor new_cursor) override;
+ void UpdateCursor(::Cursor cursor) override;
+ void EndMoveLoop() override;
+
+ private:
+ // Not owned.
+ ui::X11MoveLoopDelegate* delegate_;
+
+ // Ends the move loop.
+ base::OnceClosure quit_closure_;
+
+ bool is_running_ = false;
+};
+
+// Implementation of XDragDropClient which short circuits FindWindowFor().
+class SimpleTestDragDropClient : public aura::client::DragDropClient,
+ public ui::XDragDropClient,
+ public ui::XDragDropClient::Delegate,
+ public ui::X11MoveLoopDelegate {
+ public:
+ SimpleTestDragDropClient(aura::Window*,
+ DesktopNativeCursorManager* cursor_manager);
+ ~SimpleTestDragDropClient() override;
+
+ // Sets |window| as the topmost window for all mouse positions.
+ void SetTopmostXWindow(x11::Window window);
+
+ // Returns true if the move loop is running.
+ bool IsMoveLoopRunning();
+
+ // aura::client::DragDropClient:
+ int StartDragAndDrop(std::unique_ptr<ui::OSExchangeData> data,
+ aura::Window* root_window,
+ aura::Window* source_window,
+ const gfx::Point& screen_location,
+ int operation,
+ ui::DragDropTypes::DragEventSource source) override;
+ void DragCancel() override;
+ bool IsDragDropInProgress() override;
+ void AddObserver(aura::client::DragDropClientObserver* observer) override;
+ void RemoveObserver(aura::client::DragDropClientObserver* observer) override;
+
+ private:
+ // ui::XDragDropClient::Delegate:
+ std::unique_ptr<ui::XTopmostWindowFinder> CreateWindowFinder() override;
+ int UpdateDrag(const gfx::Point& screen_point) override;
+ void UpdateCursor(
+ ui::DragDropTypes::DragOperation negotiated_operation) override;
+ void OnBeginForeignDrag(x11::Window window) override;
+ void OnEndForeignDrag() override;
+ void OnBeforeDragLeave() override;
+ int PerformDrop() override;
+ void EndDragLoop() override;
+
+ // XDragDropClient:
+ x11::Window FindWindowFor(const gfx::Point& screen_point) override;
+
+ // ui::X11MoveLoopDelegate:
+ void OnMouseMovement(const gfx::Point& screen_point,
+ int flags,
+ base::TimeTicks event_time) override;
+ void OnMouseReleased() override;
+ void OnMoveLoopEnded() override;
+
+ std::unique_ptr<ui::X11MoveLoop> CreateMoveLoop(
+ ui::X11MoveLoopDelegate* delegate);
+
+ // The x11::Window of the window which is simulated to be the topmost window.
+ x11::Window target_window_ = x11::Window::None;
+
+ // The move loop. Not owned.
+ TestMoveLoop* loop_ = nullptr;
+
+ base::OnceClosure quit_closure_;
+
+ DISALLOW_COPY_AND_ASSIGN(SimpleTestDragDropClient);
+};
+
+// Implementation of XDragDropClient which works with a fake
+// |XDragDropClient::source_current_window_|.
+class TestDragDropClient : public SimpleTestDragDropClient {
+ public:
+ // The location in screen coordinates used for the synthetic mouse moves
+ // generated in SetTopmostXWindowAndMoveMouse().
+ static constexpr int kMouseMoveX = 100;
+ static constexpr int kMouseMoveY = 200;
+
+ TestDragDropClient(aura::Window* window,
+ DesktopNativeCursorManager* cursor_manager);
+ ~TestDragDropClient() override;
+
+ // Returns the x11::Window of the window which initiated the drag.
+ x11::Window source_xwindow() { return source_window_; }
+
+ // Returns the Atom with |name|.
+ x11::Atom GetAtom(const char* name);
+
+ // Returns true if the event's message has |type|.
+ bool MessageHasType(const x11::ClientMessageEvent& event, const char* type);
+
+ // Sets |collector| to collect x11::ClientMessageEvents which would otherwise
+ // have been sent to the drop target window.
+ void SetEventCollectorFor(x11::Window window,
+ ClientMessageEventCollector* collector);
+
+ // Builds an XdndStatus message and sends it to
+ // XDragDropClient.
+ void OnStatus(x11::Window target_window,
+ bool will_accept_drop,
+ x11::Atom accepted_action);
+
+ // Builds an XdndFinished message and sends it to
+ // XDragDropClient.
+ void OnFinished(x11::Window target_window,
+ bool accepted_drop,
+ x11::Atom performed_action);
+
+ // Sets |window| as the topmost window at the current mouse position and
+ // generates a synthetic mouse move.
+ void SetTopmostXWindowAndMoveMouse(x11::Window window);
+
+ private:
+ // XDragDropClient:
+ void SendXClientEvent(x11::Window window,
+ const x11::ClientMessageEvent& event) override;
+
+ // The x11::Window of the window which initiated the drag.
+ x11::Window source_window_;
+
+ // Map of x11::Windows to the collector which intercepts
+ // x11::ClientMessageEvents for that window.
+ std::map<x11::Window, ClientMessageEventCollector*> collectors_;
+
+ DISALLOW_COPY_AND_ASSIGN(TestDragDropClient);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// ClientMessageEventCollector
+
+ClientMessageEventCollector::ClientMessageEventCollector(
+ x11::Window window,
+ TestDragDropClient* client)
+ : window_(window), client_(client) {
+ client->SetEventCollectorFor(window, this);
+}
+
+ClientMessageEventCollector::~ClientMessageEventCollector() {
+ client_->SetEventCollectorFor(window_, nullptr);
+}
+
+std::vector<x11::ClientMessageEvent>
+ClientMessageEventCollector::PopAllEvents() {
+ std::vector<x11::ClientMessageEvent> to_return;
+ to_return.swap(events_);
+ return to_return;
+}
+
+void ClientMessageEventCollector::RecordEvent(
+ const x11::ClientMessageEvent& event) {
+ events_.push_back(event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// TestMoveLoop
+
+TestMoveLoop::TestMoveLoop(ui::X11MoveLoopDelegate* delegate)
+ : delegate_(delegate) {}
+
+TestMoveLoop::~TestMoveLoop() = default;
+
+bool TestMoveLoop::IsRunning() const {
+ return is_running_;
+}
+
+bool TestMoveLoop::RunMoveLoop(bool can_grab_pointer,
+ ::Cursor old_cursor,
+ ::Cursor new_cursor) {
+ is_running_ = true;
+ base::RunLoop run_loop;
+ quit_closure_ = run_loop.QuitClosure();
+ run_loop.Run();
+ return true;
+}
+
+void TestMoveLoop::UpdateCursor(::Cursor cursor) {}
+
+void TestMoveLoop::EndMoveLoop() {
+ if (is_running_) {
+ delegate_->OnMoveLoopEnded();
+ is_running_ = false;
+ std::move(quit_closure_).Run();
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// SimpleTestDragDropClient
+
+SimpleTestDragDropClient::SimpleTestDragDropClient(
+ aura::Window* window,
+ DesktopNativeCursorManager* cursor_manager)
+ : ui::XDragDropClient(this, window->GetHost()->GetAcceleratedWidget()) {}
+
+SimpleTestDragDropClient::~SimpleTestDragDropClient() = default;
+
+void SimpleTestDragDropClient::SetTopmostXWindow(x11::Window window) {
+ target_window_ = window;
+}
+
+bool SimpleTestDragDropClient::IsMoveLoopRunning() {
+ return loop_->IsRunning();
+}
+
+std::unique_ptr<ui::X11MoveLoop> SimpleTestDragDropClient::CreateMoveLoop(
+ ui::X11MoveLoopDelegate* delegate) {
+ loop_ = new TestMoveLoop(delegate);
+ return base::WrapUnique(loop_);
+}
+
+int SimpleTestDragDropClient::StartDragAndDrop(
+ std::unique_ptr<ui::OSExchangeData> data,
+ aura::Window* root_window,
+ aura::Window* source_window,
+ const gfx::Point& screen_location,
+ int operation,
+ ui::DragDropTypes::DragEventSource source) {
+ InitDrag(operation, data.get());
+
+ auto loop = CreateMoveLoop(this);
+
+ // Windows has a specific method, DoDragDrop(), which performs the entire
+ // drag. We have to emulate this, so we spin off a nested runloop which will
+ // track all cursor movement and reroute events to a specific handler.
+ auto cursor_manager_ = std::make_unique<DesktopNativeCursorManager>();
+ auto* last_cursor = static_cast<ui::X11Cursor*>(
+ source_window->GetHost()->last_cursor().platform());
+ loop_->RunMoveLoop(
+ !source_window->HasCapture(),
+ last_cursor ? last_cursor->xcursor() : x11::None,
+ static_cast<ui::X11Cursor*>(
+ cursor_manager_
+ ->GetInitializedCursor(ui::mojom::CursorType::kGrabbing)
+ .platform())
+ ->xcursor());
+
+ auto resulting_operation = negotiated_operation();
+ CleanupDrag();
+ return resulting_operation;
+}
+
+void SimpleTestDragDropClient::DragCancel() {}
+bool SimpleTestDragDropClient::IsDragDropInProgress() {
+ return false;
+}
+void SimpleTestDragDropClient::AddObserver(
+ aura::client::DragDropClientObserver* observer) {}
+void SimpleTestDragDropClient::RemoveObserver(
+ aura::client::DragDropClientObserver* observer) {}
+
+int SimpleTestDragDropClient::UpdateDrag(const gfx::Point& screen_point) {
+ return 0;
+}
+
+std::unique_ptr<ui::XTopmostWindowFinder>
+SimpleTestDragDropClient::CreateWindowFinder() {
+ return {};
+}
+void SimpleTestDragDropClient::UpdateCursor(
+ ui::DragDropTypes::DragOperation negotiated_operation) {}
+void SimpleTestDragDropClient::OnBeginForeignDrag(x11::Window window) {}
+void SimpleTestDragDropClient::OnEndForeignDrag() {}
+void SimpleTestDragDropClient::OnBeforeDragLeave() {}
+int SimpleTestDragDropClient::PerformDrop() {
+ return 0;
+}
+void SimpleTestDragDropClient::EndDragLoop() {
+ // std::move(quit_closure_).Run();
+ loop_->EndMoveLoop();
+}
+
+x11::Window SimpleTestDragDropClient::FindWindowFor(
+ const gfx::Point& screen_point) {
+ return target_window_;
+}
+
+void SimpleTestDragDropClient::OnMouseMovement(const gfx::Point& screen_point,
+ int flags,
+ base::TimeTicks event_time) {
+ HandleMouseMovement(screen_point, flags, event_time);
+}
+
+void SimpleTestDragDropClient::OnMouseReleased() {
+ HandleMouseReleased();
+}
+
+void SimpleTestDragDropClient::OnMoveLoopEnded() {
+ HandleMoveLoopEnded();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// TestDragDropClient
+
+TestDragDropClient::TestDragDropClient(
+ aura::Window* window,
+ DesktopNativeCursorManager* cursor_manager)
+ : SimpleTestDragDropClient(window, cursor_manager),
+ source_window_(window->GetHost()->GetAcceleratedWidget()) {}
+
+TestDragDropClient::~TestDragDropClient() = default;
+
+x11::Atom TestDragDropClient::GetAtom(const char* name) {
+ return gfx::GetAtom(name);
+}
+
+bool TestDragDropClient::MessageHasType(const x11::ClientMessageEvent& event,
+ const char* type) {
+ return event.type == GetAtom(type);
+}
+
+void TestDragDropClient::SetEventCollectorFor(
+ x11::Window window,
+ ClientMessageEventCollector* collector) {
+ if (collector)
+ collectors_[window] = collector;
+ else
+ collectors_.erase(window);
+}
+
+void TestDragDropClient::OnStatus(x11::Window target_window,
+ bool will_accept_drop,
+ x11::Atom accepted_action) {
+ x11::ClientMessageEvent event;
+ event.type = GetAtom("XdndStatus");
+ event.format = 32;
+ event.window = source_window_;
+ event.data.data32[0] = static_cast<uint32_t>(target_window);
+ event.data.data32[1] = will_accept_drop ? 1 : 0;
+ event.data.data32[2] = 0;
+ event.data.data32[3] = 0;
+ event.data.data32[4] = static_cast<uint32_t>(accepted_action);
+ HandleXdndEvent(event);
+}
+
+void TestDragDropClient::OnFinished(x11::Window target_window,
+ bool accepted_drop,
+ x11::Atom performed_action) {
+ x11::ClientMessageEvent event;
+ event.type = GetAtom("XdndFinished");
+ event.format = 32;
+ event.window = source_window_;
+ event.data.data32[0] = static_cast<uint32_t>(target_window);
+ event.data.data32[1] = accepted_drop ? 1 : 0;
+ event.data.data32[2] = static_cast<uint32_t>(performed_action);
+ event.data.data32[3] = 0;
+ event.data.data32[4] = 0;
+ HandleXdndEvent(event);
+}
+
+void TestDragDropClient::SetTopmostXWindowAndMoveMouse(x11::Window window) {
+ SetTopmostXWindow(window);
+ HandleMouseMovement(gfx::Point(kMouseMoveX, kMouseMoveY), ui::EF_NONE,
+ ui::EventTimeForNow());
+}
+
+void TestDragDropClient::SendXClientEvent(
+ x11::Window window,
+ const x11::ClientMessageEvent& event) {
+ auto it = collectors_.find(window);
+ if (it != collectors_.end())
+ it->second->RecordEvent(event);
+}
+
+} // namespace
+
+class X11DragDropClientTest : public ViewsTestBase {
+ public:
+ X11DragDropClientTest() = default;
+ ~X11DragDropClientTest() override = default;
+
+ int StartDragAndDrop() {
+ auto data(std::make_unique<ui::OSExchangeData>());
+ data->SetString(base::ASCIIToUTF16("Test"));
+ SkBitmap drag_bitmap;
+ drag_bitmap.allocN32Pixels(10, 10);
+ drag_bitmap.eraseARGB(0xFF, 0, 0, 0);
+ gfx::ImageSkia drag_image(gfx::ImageSkia::CreateFrom1xBitmap(drag_bitmap));
+ data->provider().SetDragImage(drag_image, gfx::Vector2d());
+
+ return client_->StartDragAndDrop(
+ std::move(data), widget_->GetNativeWindow()->GetRootWindow(),
+ widget_->GetNativeWindow(), gfx::Point(), ui::DragDropTypes::DRAG_COPY,
+ ui::DragDropTypes::DRAG_EVENT_SOURCE_MOUSE);
+ }
+
+ // ViewsTestBase:
+ void SetUp() override {
+ set_native_widget_type(NativeWidgetType::kDesktop);
+
+ ViewsTestBase::SetUp();
+
+ // Create widget to initiate the drags.
+ widget_ = std::make_unique<Widget>();
+ Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
+ params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params.bounds = gfx::Rect(100, 100);
+ widget_->Init(std::move(params));
+ widget_->Show();
+
+ cursor_manager_ = std::make_unique<DesktopNativeCursorManager>();
+
+ client_ = std::make_unique<TestDragDropClient>(widget_->GetNativeWindow(),
+ cursor_manager_.get());
+ // client_->Init();
+ }
+
+ void TearDown() override {
+ client_.reset();
+ cursor_manager_.reset();
+ widget_.reset();
+ ViewsTestBase::TearDown();
+ }
+
+ TestDragDropClient* client() { return client_.get(); }
+
+ private:
+ std::unique_ptr<TestDragDropClient> client_;
+ std::unique_ptr<DesktopNativeCursorManager> cursor_manager_;
+
+ // The widget used to initiate drags.
+ std::unique_ptr<Widget> widget_;
+
+ DISALLOW_COPY_AND_ASSIGN(X11DragDropClientTest);
+};
+
+namespace {
+
+void BasicStep2(TestDragDropClient* client, x11::Window toplevel) {
+ EXPECT_TRUE(client->IsMoveLoopRunning());
+
+ ClientMessageEventCollector collector(toplevel, client);
+ client->SetTopmostXWindowAndMoveMouse(toplevel);
+
+ // XdndEnter should have been sent to |toplevel| before the XdndPosition
+ // message.
+ std::vector<x11::ClientMessageEvent> events = collector.PopAllEvents();
+ ASSERT_EQ(2u, events.size());
+
+ EXPECT_TRUE(client->MessageHasType(events[0], "XdndEnter"));
+ EXPECT_EQ(client->source_xwindow(),
+ static_cast<x11::Window>(events[0].data.data32[0]));
+ EXPECT_EQ(1u, events[0].data.data32[1] & 1);
+ std::vector<x11::Atom> targets;
+ ui::GetAtomArrayProperty(client->source_xwindow(), "XdndTypeList", &targets);
+ EXPECT_FALSE(targets.empty());
+
+ EXPECT_TRUE(client->MessageHasType(events[1], "XdndPosition"));
+ EXPECT_EQ(client->source_xwindow(),
+ static_cast<x11::Window>(events[0].data.data32[0]));
+ const uint32_t kCoords =
+ TestDragDropClient::kMouseMoveX << 16 | TestDragDropClient::kMouseMoveY;
+ EXPECT_EQ(kCoords, events[1].data.data32[2]);
+ EXPECT_EQ(client->GetAtom("XdndActionCopy"),
+ static_cast<x11::Atom>(events[1].data.data32[4]));
+
+ client->OnStatus(toplevel, true, client->GetAtom("XdndActionCopy"));
+
+ // Because there is no unprocessed XdndPosition, the drag drop client should
+ // send XdndDrop immediately after the mouse is released.
+ client->HandleMouseReleased();
+
+ events = collector.PopAllEvents();
+ ASSERT_EQ(1u, events.size());
+ EXPECT_TRUE(client->MessageHasType(events[0], "XdndDrop"));
+ EXPECT_EQ(client->source_xwindow(),
+ static_cast<x11::Window>(events[0].data.data32[0]));
+
+ // Send XdndFinished to indicate that the drag drop client can cleanup any
+ // data related to this drag. The move loop should end only after the
+ // XdndFinished message was received.
+ EXPECT_TRUE(client->IsMoveLoopRunning());
+ client->OnFinished(toplevel, true, client->GetAtom("XdndActionCopy"));
+ EXPECT_FALSE(client->IsMoveLoopRunning());
+}
+
+void BasicStep3(TestDragDropClient* client, x11::Window toplevel) {
+ EXPECT_TRUE(client->IsMoveLoopRunning());
+
+ ClientMessageEventCollector collector(toplevel, client);
+ client->SetTopmostXWindowAndMoveMouse(toplevel);
+
+ std::vector<x11::ClientMessageEvent> events = collector.PopAllEvents();
+ ASSERT_EQ(2u, events.size());
+ EXPECT_TRUE(client->MessageHasType(events[0], "XdndEnter"));
+ EXPECT_TRUE(client->MessageHasType(events[1], "XdndPosition"));
+
+ client->OnStatus(toplevel, true, client->GetAtom("XdndActionCopy"));
+ client->SetTopmostXWindowAndMoveMouse(toplevel);
+ events = collector.PopAllEvents();
+ ASSERT_EQ(1u, events.size());
+ EXPECT_TRUE(client->MessageHasType(events[0], "XdndPosition"));
+
+ // We have not received an XdndStatus ack for the second XdndPosition message.
+ // Test that sending XdndDrop is delayed till the XdndStatus ack is received.
+ client->HandleMouseReleased();
+ EXPECT_FALSE(collector.HasEvents());
+
+ client->OnStatus(toplevel, true, client->GetAtom("XdndActionCopy"));
+ events = collector.PopAllEvents();
+ ASSERT_EQ(1u, events.size());
+ EXPECT_TRUE(client->MessageHasType(events[0], "XdndDrop"));
+
+ EXPECT_TRUE(client->IsMoveLoopRunning());
+ client->OnFinished(toplevel, true, client->GetAtom("XdndActionCopy"));
+ EXPECT_FALSE(client->IsMoveLoopRunning());
+}
+
+} // namespace
+
+TEST_F(X11DragDropClientTest, Basic) {
+ x11::Window toplevel = static_cast<x11::Window>(1);
+
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(&BasicStep2, client(), toplevel));
+ int result = StartDragAndDrop();
+ EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, result);
+
+ // Do another drag and drop to test that the data is properly cleaned up as a
+ // result of the XdndFinished message.
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(&BasicStep3, client(), toplevel));
+ result = StartDragAndDrop();
+ EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, result);
+}
+
+namespace {
+
+void TargetDoesNotRespondStep2(TestDragDropClient* client) {
+ EXPECT_TRUE(client->IsMoveLoopRunning());
+
+ x11::Window toplevel = static_cast<x11::Window>(1);
+ ClientMessageEventCollector collector(toplevel, client);
+ client->SetTopmostXWindowAndMoveMouse(toplevel);
+
+ std::vector<x11::ClientMessageEvent> events = collector.PopAllEvents();
+ ASSERT_EQ(2u, events.size());
+ EXPECT_TRUE(client->MessageHasType(events[0], "XdndEnter"));
+ EXPECT_TRUE(client->MessageHasType(events[1], "XdndPosition"));
+
+ client->HandleMouseReleased();
+ events = collector.PopAllEvents();
+ ASSERT_EQ(1u, events.size());
+ EXPECT_TRUE(client->MessageHasType(events[0], "XdndLeave"));
+ EXPECT_FALSE(client->IsMoveLoopRunning());
+}
+
+} // namespace
+
+// Test that we do not wait for the target to send XdndStatus if we have not
+// received any XdndStatus messages at all from the target. The Unity
+// DNDCollectionWindow is an example of an XdndAware target which does not
+// respond to XdndPosition messages at all.
+TEST_F(X11DragDropClientTest, TargetDoesNotRespond) {
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(&TargetDoesNotRespondStep2, client()));
+ int result = StartDragAndDrop();
+ EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, result);
+}
+
+namespace {
+
+void QueuePositionStep2(TestDragDropClient* client) {
+ EXPECT_TRUE(client->IsMoveLoopRunning());
+
+ x11::Window toplevel = static_cast<x11::Window>(1);
+ ClientMessageEventCollector collector(toplevel, client);
+ client->SetTopmostXWindowAndMoveMouse(toplevel);
+ client->SetTopmostXWindowAndMoveMouse(toplevel);
+ client->SetTopmostXWindowAndMoveMouse(toplevel);
+
+ std::vector<x11::ClientMessageEvent> events = collector.PopAllEvents();
+ ASSERT_EQ(2u, events.size());
+ EXPECT_TRUE(client->MessageHasType(events[0], "XdndEnter"));
+ EXPECT_TRUE(client->MessageHasType(events[1], "XdndPosition"));
+
+ client->OnStatus(toplevel, true, client->GetAtom("XdndActionCopy"));
+ events = collector.PopAllEvents();
+ ASSERT_EQ(1u, events.size());
+ EXPECT_TRUE(client->MessageHasType(events[0], "XdndPosition"));
+
+ client->OnStatus(toplevel, true, client->GetAtom("XdndActionCopy"));
+ EXPECT_FALSE(collector.HasEvents());
+
+ client->HandleMouseReleased();
+ events = collector.PopAllEvents();
+ ASSERT_EQ(1u, events.size());
+ EXPECT_TRUE(client->MessageHasType(events[0], "XdndDrop"));
+
+ EXPECT_TRUE(client->IsMoveLoopRunning());
+ client->OnFinished(toplevel, true, client->GetAtom("XdndActionCopy"));
+ EXPECT_FALSE(client->IsMoveLoopRunning());
+}
+
+} // namespace
+
+// Test that XdndPosition messages are queued till the pending XdndPosition
+// message is acked via an XdndStatus message.
+TEST_F(X11DragDropClientTest, QueuePosition) {
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(&QueuePositionStep2, client()));
+ int result = StartDragAndDrop();
+ EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, result);
+}
+
+namespace {
+
+void TargetChangesStep2(TestDragDropClient* client) {
+ EXPECT_TRUE(client->IsMoveLoopRunning());
+
+ x11::Window toplevel1 = static_cast<x11::Window>(1);
+ ClientMessageEventCollector collector1(toplevel1, client);
+ client->SetTopmostXWindowAndMoveMouse(toplevel1);
+
+ std::vector<x11::ClientMessageEvent> events1 = collector1.PopAllEvents();
+ ASSERT_EQ(2u, events1.size());
+ EXPECT_TRUE(client->MessageHasType(events1[0], "XdndEnter"));
+ EXPECT_TRUE(client->MessageHasType(events1[1], "XdndPosition"));
+
+ x11::Window toplevel2 = static_cast<x11::Window>(2);
+ ClientMessageEventCollector collector2(toplevel2, client);
+ client->SetTopmostXWindowAndMoveMouse(toplevel2);
+
+ // It is possible for |toplevel1| to send XdndStatus after the source has sent
+ // XdndLeave but before |toplevel1| has received the XdndLeave message. The
+ // XdndStatus message should be ignored.
+ client->OnStatus(toplevel1, true, client->GetAtom("XdndActionCopy"));
+ events1 = collector1.PopAllEvents();
+ ASSERT_EQ(1u, events1.size());
+ EXPECT_TRUE(client->MessageHasType(events1[0], "XdndLeave"));
+
+ std::vector<x11::ClientMessageEvent> events2 = collector2.PopAllEvents();
+ ASSERT_EQ(2u, events2.size());
+ EXPECT_TRUE(client->MessageHasType(events2[0], "XdndEnter"));
+ EXPECT_TRUE(client->MessageHasType(events2[1], "XdndPosition"));
+
+ client->OnStatus(toplevel2, true, client->GetAtom("XdndActionCopy"));
+ client->HandleMouseReleased();
+ events2 = collector2.PopAllEvents();
+ ASSERT_EQ(1u, events2.size());
+ EXPECT_TRUE(client->MessageHasType(events2[0], "XdndDrop"));
+
+ EXPECT_TRUE(client->IsMoveLoopRunning());
+ client->OnFinished(toplevel2, true, client->GetAtom("XdndActionCopy"));
+ EXPECT_FALSE(client->IsMoveLoopRunning());
+}
+
+} // namespace
+
+// Test the behavior when the target changes during a drag.
+TEST_F(X11DragDropClientTest, TargetChanges) {
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(&TargetChangesStep2, client()));
+ int result = StartDragAndDrop();
+ EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, result);
+}
+
+namespace {
+
+void RejectAfterMouseReleaseStep2(TestDragDropClient* client) {
+ EXPECT_TRUE(client->IsMoveLoopRunning());
+
+ x11::Window toplevel = static_cast<x11::Window>(1);
+ ClientMessageEventCollector collector(toplevel, client);
+ client->SetTopmostXWindowAndMoveMouse(toplevel);
+
+ std::vector<x11::ClientMessageEvent> events = collector.PopAllEvents();
+ ASSERT_EQ(2u, events.size());
+ EXPECT_TRUE(client->MessageHasType(events[0], "XdndEnter"));
+ EXPECT_TRUE(client->MessageHasType(events[1], "XdndPosition"));
+
+ client->OnStatus(toplevel, true, client->GetAtom("XdndActionCopy"));
+ EXPECT_FALSE(collector.HasEvents());
+
+ // Send another mouse move such that there is a pending XdndPosition.
+ client->SetTopmostXWindowAndMoveMouse(toplevel);
+ events = collector.PopAllEvents();
+ ASSERT_EQ(1u, events.size());
+ EXPECT_TRUE(client->MessageHasType(events[0], "XdndPosition"));
+
+ client->HandleMouseReleased();
+ // Reject the drop.
+ client->OnStatus(toplevel, false, x11::Atom::None);
+
+ events = collector.PopAllEvents();
+ ASSERT_EQ(1u, events.size());
+ EXPECT_TRUE(client->MessageHasType(events[0], "XdndLeave"));
+ EXPECT_FALSE(client->IsMoveLoopRunning());
+}
+
+void RejectAfterMouseReleaseStep3(TestDragDropClient* client) {
+ EXPECT_TRUE(client->IsMoveLoopRunning());
+
+ x11::Window toplevel = static_cast<x11::Window>(2);
+ ClientMessageEventCollector collector(toplevel, client);
+ client->SetTopmostXWindowAndMoveMouse(toplevel);
+
+ std::vector<x11::ClientMessageEvent> events = collector.PopAllEvents();
+ ASSERT_EQ(2u, events.size());
+ EXPECT_TRUE(client->MessageHasType(events[0], "XdndEnter"));
+ EXPECT_TRUE(client->MessageHasType(events[1], "XdndPosition"));
+
+ client->OnStatus(toplevel, true, client->GetAtom("XdndActionCopy"));
+ EXPECT_FALSE(collector.HasEvents());
+
+ client->HandleMouseReleased();
+ events = collector.PopAllEvents();
+ ASSERT_EQ(1u, events.size());
+ EXPECT_TRUE(client->MessageHasType(events[0], "XdndDrop"));
+
+ EXPECT_TRUE(client->IsMoveLoopRunning());
+ client->OnFinished(toplevel, false, x11::Atom::None);
+ EXPECT_FALSE(client->IsMoveLoopRunning());
+}
+
+} // namespace
+
+// Test that the source sends XdndLeave instead of XdndDrop if the drag
+// operation is rejected after the mouse is released.
+TEST_F(X11DragDropClientTest, RejectAfterMouseRelease) {
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(&RejectAfterMouseReleaseStep2, client()));
+ int result = StartDragAndDrop();
+ EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, result);
+
+ // Repeat the test but reject the drop in the XdndFinished message instead.
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(&RejectAfterMouseReleaseStep3, client()));
+ result = StartDragAndDrop();
+ EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, result);
+}
+
+} // namespace views
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 aa249625d3f..fadecc97d9d 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
@@ -15,7 +15,12 @@
#include "ui/aura/window.h"
#include "ui/aura/window_tree_host.h"
#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/native_widget_types.h"
+#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"
@@ -31,15 +36,15 @@ namespace {
// Waits till |window| is minimized.
class MinimizeWaiter : public ui::X11PropertyChangeWaiter {
public:
- explicit MinimizeWaiter(XID window)
+ explicit MinimizeWaiter(x11::Window window)
: ui::X11PropertyChangeWaiter(window, "_NET_WM_STATE") {}
~MinimizeWaiter() override = default;
private:
// ui::X11PropertyChangeWaiter:
- bool ShouldKeepOnWaiting(XEvent* event) override {
- std::vector<Atom> wm_states;
+ bool ShouldKeepOnWaiting(x11::Event* event) override {
+ std::vector<x11::Atom> wm_states;
if (ui::GetAtomArrayProperty(xwindow(), "_NET_WM_STATE", &wm_states)) {
return !base::Contains(wm_states, gfx::GetAtom("_NET_WM_STATE_HIDDEN"));
}
@@ -53,7 +58,7 @@ class MinimizeWaiter : public ui::X11PropertyChangeWaiter {
// |expected_windows|.
class StackingClientListWaiter : public ui::X11PropertyChangeWaiter {
public:
- StackingClientListWaiter(XID* expected_windows, size_t count)
+ StackingClientListWaiter(x11::Window* expected_windows, size_t count)
: ui::X11PropertyChangeWaiter(ui::GetX11RootWindow(),
"_NET_CLIENT_LIST_STACKING"),
expected_windows_(expected_windows, expected_windows + count) {}
@@ -72,15 +77,15 @@ class StackingClientListWaiter : public ui::X11PropertyChangeWaiter {
private:
// ui::X11PropertyChangeWaiter:
- bool ShouldKeepOnWaiting(XEvent* event) override {
- std::vector<XID> stack;
+ bool ShouldKeepOnWaiting(x11::Event* event) override {
+ std::vector<x11::Window> stack;
ui::GetXWindowStack(ui::GetX11RootWindow(), &stack);
return !std::all_of(
expected_windows_.cbegin(), expected_windows_.cend(),
- [&stack](XID window) { return base::Contains(stack, window); });
+ [&stack](x11::Window window) { return base::Contains(stack, window); });
}
- std::vector<XID> expected_windows_;
+ std::vector<x11::Window> expected_windows_;
DISALLOW_COPY_AND_ASSIGN(StackingClientListWaiter);
};
@@ -120,34 +125,36 @@ class X11TopmostWindowFinderTest : public test::DesktopWidgetTestInteractive {
}
// Creates and shows an X window with |bounds|.
- XID CreateAndShowXWindow(const gfx::Rect& bounds) {
- XID root = DefaultRootWindow(xdisplay());
- XID xid = XCreateSimpleWindow(xdisplay(), root, 0, 0, 1, 1,
- 0, // border_width
- 0, // border
- 0); // background
-
- ui::SetUseOSWindowFrame(xid, false);
- ShowAndSetXWindowBounds(xid, bounds);
- return xid;
+ x11::Window CreateAndShowXWindow(const gfx::Rect& bounds) {
+ x11::Window root = ui::GetX11RootWindow();
+ x11::Window window = static_cast<x11::Window>(
+ XCreateSimpleWindow(xdisplay(), static_cast<uint32_t>(root), 0, 0, 1, 1,
+ 0, // border_width
+ 0, // border
+ 0)); // background
+
+ ui::SetUseOSWindowFrame(window, false);
+ ShowAndSetXWindowBounds(window, bounds);
+ return window;
}
- // Shows |xid| and sets its bounds.
- void ShowAndSetXWindowBounds(XID xid, const gfx::Rect& bounds) {
- XMapWindow(xdisplay(), xid);
+ // Shows |window| and sets its bounds.
+ void ShowAndSetXWindowBounds(x11::Window window, const gfx::Rect& bounds) {
+ XMapWindow(xdisplay(), static_cast<uint32_t>(window));
XWindowChanges changes = {0};
changes.x = bounds.x();
changes.y = bounds.y();
changes.width = bounds.width();
changes.height = bounds.height();
- XConfigureWindow(xdisplay(), xid, CWX | CWY | CWWidth | CWHeight, &changes);
+ XConfigureWindow(xdisplay(), static_cast<uint32_t>(window),
+ CWX | CWY | CWWidth | CWHeight, &changes);
}
Display* xdisplay() { return gfx::GetXDisplay(); }
// Returns the topmost X window at the passed in screen position.
- XID FindTopmostXWindowAt(int screen_x, int screen_y) {
+ x11::Window FindTopmostXWindowAt(int screen_x, int screen_y) {
ui::X11TopmostWindowFinder finder;
return finder.FindWindowAt(gfx::Point(screen_x, screen_y));
}
@@ -158,9 +165,10 @@ class X11TopmostWindowFinderTest : public test::DesktopWidgetTestInteractive {
ui::X11TopmostWindowFinder finder;
auto widget =
finder.FindLocalProcessWindowAt(gfx::Point(screen_x, screen_y), {});
- return widget ? DesktopWindowTreeHostPlatform::GetContentWindowForWidget(
- static_cast<gfx::AcceleratedWidget>(widget))
- : nullptr;
+ return widget != gfx::kNullAcceleratedWidget
+ ? DesktopWindowTreeHostPlatform::GetContentWindowForWidget(
+ static_cast<gfx::AcceleratedWidget>(widget))
+ : nullptr;
}
// Returns the topmost aura::Window at the passed in screen position ignoring
@@ -175,9 +183,10 @@ class X11TopmostWindowFinderTest : public test::DesktopWidgetTestInteractive {
ui::X11TopmostWindowFinder finder;
auto widget =
finder.FindLocalProcessWindowAt(gfx::Point(screen_x, screen_y), ignore);
- return widget ? DesktopWindowTreeHostPlatform::GetContentWindowForWidget(
- static_cast<gfx::AcceleratedWidget>(widget))
- : nullptr;
+ return widget != gfx::kNullAcceleratedWidget
+ ? DesktopWindowTreeHostPlatform::GetContentWindowForWidget(
+ static_cast<gfx::AcceleratedWidget>(widget))
+ : nullptr;
}
private:
@@ -191,38 +200,38 @@ TEST_F(X11TopmostWindowFinderTest, Basic) {
std::unique_ptr<Widget> widget1(
CreateAndShowWidget(gfx::Rect(100, 100, 200, 100)));
aura::Window* window1 = widget1->GetNativeWindow();
- XID xid1 = window1->GetHost()->GetAcceleratedWidget();
+ x11::Window x11_window1 = window1->GetHost()->GetAcceleratedWidget();
- XID xid2 = CreateAndShowXWindow(gfx::Rect(200, 100, 100, 200));
+ x11::Window x11_window2 = CreateAndShowXWindow(gfx::Rect(200, 100, 100, 200));
std::unique_ptr<Widget> widget3(
CreateAndShowWidget(gfx::Rect(100, 190, 200, 110)));
aura::Window* window3 = widget3->GetNativeWindow();
- XID xid3 = window3->GetHost()->GetAcceleratedWidget();
+ x11::Window x11_window3 = window3->GetHost()->GetAcceleratedWidget();
- XID xids[] = {xid1, xid2, xid3};
- StackingClientListWaiter waiter(xids, base::size(xids));
+ x11::Window windows[] = {x11_window1, x11_window2, x11_window3};
+ StackingClientListWaiter waiter(windows, base::size(windows));
waiter.Wait();
ui::X11EventSource::GetInstance()->DispatchXEvents();
- EXPECT_EQ(xid1, FindTopmostXWindowAt(150, 150));
+ EXPECT_EQ(x11_window1, FindTopmostXWindowAt(150, 150));
EXPECT_EQ(window1, FindTopmostLocalProcessWindowAt(150, 150));
- EXPECT_EQ(xid2, FindTopmostXWindowAt(250, 150));
+ EXPECT_EQ(x11_window2, FindTopmostXWindowAt(250, 150));
EXPECT_FALSE(FindTopmostLocalProcessWindowAt(250, 150));
- EXPECT_EQ(xid3, FindTopmostXWindowAt(250, 250));
+ EXPECT_EQ(x11_window3, FindTopmostXWindowAt(250, 250));
EXPECT_EQ(window3, FindTopmostLocalProcessWindowAt(250, 250));
- EXPECT_EQ(xid3, FindTopmostXWindowAt(150, 250));
+ EXPECT_EQ(x11_window3, FindTopmostXWindowAt(150, 250));
EXPECT_EQ(window3, FindTopmostLocalProcessWindowAt(150, 250));
- EXPECT_EQ(xid3, FindTopmostXWindowAt(150, 195));
+ EXPECT_EQ(x11_window3, FindTopmostXWindowAt(150, 195));
EXPECT_EQ(window3, FindTopmostLocalProcessWindowAt(150, 195));
- EXPECT_NE(xid1, FindTopmostXWindowAt(1000, 1000));
- EXPECT_NE(xid2, FindTopmostXWindowAt(1000, 1000));
- EXPECT_NE(xid3, FindTopmostXWindowAt(1000, 1000));
+ EXPECT_NE(x11_window1, FindTopmostXWindowAt(1000, 1000));
+ EXPECT_NE(x11_window2, FindTopmostXWindowAt(1000, 1000));
+ EXPECT_NE(x11_window3, FindTopmostXWindowAt(1000, 1000));
EXPECT_FALSE(FindTopmostLocalProcessWindowAt(1000, 1000));
EXPECT_EQ(window1,
@@ -232,7 +241,7 @@ TEST_F(X11TopmostWindowFinderTest, Basic) {
EXPECT_EQ(window1,
FindTopmostLocalProcessWindowWithIgnore(150, 195, window3));
- XDestroyWindow(xdisplay(), xid2);
+ XDestroyWindow(xdisplay(), static_cast<uint32_t>(x11_window2));
}
// Test that the minimized state is properly handled.
@@ -240,35 +249,35 @@ TEST_F(X11TopmostWindowFinderTest, Minimized) {
std::unique_ptr<Widget> widget1(
CreateAndShowWidget(gfx::Rect(100, 100, 100, 100)));
aura::Window* window1 = widget1->GetNativeWindow();
- XID xid1 = window1->GetHost()->GetAcceleratedWidget();
- XID xid2 = CreateAndShowXWindow(gfx::Rect(300, 100, 100, 100));
+ x11::Window x11_window1 = window1->GetHost()->GetAcceleratedWidget();
+ x11::Window x11_window2 = CreateAndShowXWindow(gfx::Rect(300, 100, 100, 100));
- XID xids[] = {xid1, xid2};
- StackingClientListWaiter stack_waiter(xids, base::size(xids));
+ x11::Window windows[] = {x11_window1, x11_window2};
+ StackingClientListWaiter stack_waiter(windows, base::size(windows));
stack_waiter.Wait();
ui::X11EventSource::GetInstance()->DispatchXEvents();
- EXPECT_EQ(xid1, FindTopmostXWindowAt(150, 150));
+ EXPECT_EQ(x11_window1, FindTopmostXWindowAt(150, 150));
{
- MinimizeWaiter minimize_waiter(xid1);
- XIconifyWindow(xdisplay(), xid1, 0);
+ MinimizeWaiter minimize_waiter(x11_window1);
+ XIconifyWindow(xdisplay(), static_cast<uint32_t>(x11_window1), 0);
minimize_waiter.Wait();
}
- EXPECT_NE(xid1, FindTopmostXWindowAt(150, 150));
- EXPECT_NE(xid2, FindTopmostXWindowAt(150, 150));
+ EXPECT_NE(x11_window1, FindTopmostXWindowAt(150, 150));
+ EXPECT_NE(x11_window2, FindTopmostXWindowAt(150, 150));
// Repeat test for an X window which does not belong to a views::Widget
// because the code path is different.
- EXPECT_EQ(xid2, FindTopmostXWindowAt(350, 150));
+ EXPECT_EQ(x11_window2, FindTopmostXWindowAt(350, 150));
{
- MinimizeWaiter minimize_waiter(xid2);
- XIconifyWindow(xdisplay(), xid2, 0);
+ MinimizeWaiter minimize_waiter(x11_window2);
+ XIconifyWindow(xdisplay(), static_cast<uint32_t>(x11_window2), 0);
minimize_waiter.Wait();
}
- EXPECT_NE(xid1, FindTopmostXWindowAt(350, 150));
- EXPECT_NE(xid2, FindTopmostXWindowAt(350, 150));
+ EXPECT_NE(x11_window1, FindTopmostXWindowAt(350, 150));
+ EXPECT_NE(x11_window2, FindTopmostXWindowAt(350, 150));
- XDestroyWindow(xdisplay(), xid2);
+ XDestroyWindow(xdisplay(), static_cast<uint32_t>(x11_window2));
}
// Test that non-rectangular windows are properly handled.
@@ -278,7 +287,8 @@ TEST_F(X11TopmostWindowFinderTest, NonRectangular) {
std::unique_ptr<Widget> widget1(
CreateAndShowWidget(gfx::Rect(100, 100, 100, 100)));
- XID xid1 = widget1->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
+ x11::Window window1 =
+ widget1->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
auto shape1 = std::make_unique<Widget::ShapeRects>();
shape1->emplace_back(0, 10, 10, 90);
shape1->emplace_back(10, 0, 90, 100);
@@ -287,27 +297,31 @@ TEST_F(X11TopmostWindowFinderTest, NonRectangular) {
SkRegion skregion2;
skregion2.op(SkIRect::MakeXYWH(0, 10, 10, 90), SkRegion::kUnion_Op);
skregion2.op(SkIRect::MakeXYWH(10, 0, 90, 100), SkRegion::kUnion_Op);
- XID xid2 = CreateAndShowXWindow(gfx::Rect(300, 100, 100, 100));
- gfx::XScopedPtr<REGION, gfx::XObjectDeleter<REGION, int, XDestroyRegion>>
- region2(gfx::CreateRegionFromSkRegion(skregion2));
- XShapeCombineRegion(xdisplay(), xid2, ShapeBounding, 0, 0, region2.get(),
- false);
- XID xids[] = {xid1, xid2};
- StackingClientListWaiter stack_waiter(xids, base::size(xids));
+ x11::Window window2 = CreateAndShowXWindow(gfx::Rect(300, 100, 100, 100));
+ auto region2 = gfx::CreateRegionFromSkRegion(skregion2);
+ x11::Connection::Get()->shape().Rectangles({
+ .operation = x11::Shape::So::Set,
+ .destination_kind = x11::Shape::Sk::Bounding,
+ .ordering = x11::ClipOrdering::YXBanded,
+ .destination_window = window2,
+ .rectangles = *region2,
+ });
+ x11::Window windows[] = {window1, window2};
+ StackingClientListWaiter stack_waiter(windows, base::size(windows));
stack_waiter.Wait();
ui::X11EventSource::GetInstance()->DispatchXEvents();
- EXPECT_EQ(xid1, FindTopmostXWindowAt(105, 120));
- EXPECT_NE(xid1, FindTopmostXWindowAt(105, 105));
- EXPECT_NE(xid2, FindTopmostXWindowAt(105, 105));
+ EXPECT_EQ(window1, FindTopmostXWindowAt(105, 120));
+ EXPECT_NE(window1, FindTopmostXWindowAt(105, 105));
+ EXPECT_NE(window2, FindTopmostXWindowAt(105, 105));
// Repeat test for an X window which does not belong to a views::Widget
// because the code path is different.
- EXPECT_EQ(xid2, FindTopmostXWindowAt(305, 120));
- EXPECT_NE(xid1, FindTopmostXWindowAt(305, 105));
- EXPECT_NE(xid2, FindTopmostXWindowAt(305, 105));
+ EXPECT_EQ(window2, FindTopmostXWindowAt(305, 120));
+ EXPECT_NE(window1, FindTopmostXWindowAt(305, 105));
+ EXPECT_NE(window2, FindTopmostXWindowAt(305, 105));
- XDestroyWindow(xdisplay(), xid2);
+ XDestroyWindow(xdisplay(), static_cast<uint32_t>(window2));
}
// Test that a window with an empty shape are properly handled.
@@ -317,18 +331,19 @@ TEST_F(X11TopmostWindowFinderTest, NonRectangularEmptyShape) {
std::unique_ptr<Widget> widget1(
CreateAndShowWidget(gfx::Rect(100, 100, 100, 100)));
- XID xid1 = widget1->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
+ x11::Window window1 =
+ widget1->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
auto shape1 = std::make_unique<Widget::ShapeRects>();
shape1->emplace_back();
// Widget takes ownership of |shape1|.
widget1->SetShape(std::move(shape1));
- XID xids[] = {xid1};
- StackingClientListWaiter stack_waiter(xids, base::size(xids));
+ x11::Window windows[] = {window1};
+ StackingClientListWaiter stack_waiter(windows, base::size(windows));
stack_waiter.Wait();
ui::X11EventSource::GetInstance()->DispatchXEvents();
- EXPECT_NE(xid1, FindTopmostXWindowAt(105, 105));
+ EXPECT_NE(window1, FindTopmostXWindowAt(105, 105));
}
// Test that setting a Null shape removes the shape.
@@ -338,7 +353,8 @@ TEST_F(X11TopmostWindowFinderTest, NonRectangularNullShape) {
std::unique_ptr<Widget> widget1(
CreateAndShowWidget(gfx::Rect(100, 100, 100, 100)));
- XID xid1 = widget1->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
+ x11::Window window1 =
+ widget1->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
auto shape1 = std::make_unique<Widget::ShapeRects>();
shape1->emplace_back();
widget1->SetShape(std::move(shape1));
@@ -346,47 +362,48 @@ TEST_F(X11TopmostWindowFinderTest, NonRectangularNullShape) {
// Remove the shape - this is now just a normal window.
widget1->SetShape(nullptr);
- XID xids[] = {xid1};
- StackingClientListWaiter stack_waiter(xids, base::size(xids));
+ x11::Window windows[] = {window1};
+ StackingClientListWaiter stack_waiter(windows, base::size(windows));
stack_waiter.Wait();
ui::X11EventSource::GetInstance()->DispatchXEvents();
- EXPECT_EQ(xid1, FindTopmostXWindowAt(105, 105));
+ EXPECT_EQ(window1, FindTopmostXWindowAt(105, 105));
}
// Test that the TopmostWindowFinder finds windows which belong to menus
// (which may or may not belong to Chrome).
TEST_F(X11TopmostWindowFinderTest, Menu) {
- XID xid = CreateAndShowXWindow(gfx::Rect(100, 100, 100, 100));
+ x11::Window window = CreateAndShowXWindow(gfx::Rect(100, 100, 100, 100));
- XID root = DefaultRootWindow(xdisplay());
+ x11::Window root = ui::GetX11RootWindow();
XSetWindowAttributes swa;
swa.override_redirect = x11::True;
- XID menu_xid = XCreateWindow(xdisplay(), root, 0, 0, 1, 1,
- 0, // border width
- CopyFromParent, // depth
- InputOutput,
- CopyFromParent, // visual
- CWOverrideRedirect, &swa);
+ x11::Window menu_window = static_cast<x11::Window>(XCreateWindow(
+ xdisplay(), static_cast<uint32_t>(root), 0, 0, 1, 1,
+ 0, // border width
+ static_cast<int>(x11::WindowClass::CopyFromParent), // depth
+ static_cast<int>(x11::WindowClass::InputOutput),
+ nullptr, // visual
+ CWOverrideRedirect, &swa));
{
- ui::SetAtomProperty(menu_xid, "_NET_WM_WINDOW_TYPE", "ATOM",
+ ui::SetAtomProperty(menu_window, "_NET_WM_WINDOW_TYPE", "ATOM",
gfx::GetAtom("_NET_WM_WINDOW_TYPE_MENU"));
}
- ui::SetUseOSWindowFrame(menu_xid, false);
- ShowAndSetXWindowBounds(menu_xid, gfx::Rect(140, 110, 100, 100));
+ ui::SetUseOSWindowFrame(menu_window, false);
+ ShowAndSetXWindowBounds(menu_window, gfx::Rect(140, 110, 100, 100));
ui::X11EventSource::GetInstance()->DispatchXEvents();
- // |menu_xid| is never added to _NET_CLIENT_LIST_STACKING.
- XID xids[] = {xid};
- StackingClientListWaiter stack_waiter(xids, base::size(xids));
+ // |menu_window| is never added to _NET_CLIENT_LIST_STACKING.
+ x11::Window windows[] = {window};
+ StackingClientListWaiter stack_waiter(windows, base::size(windows));
stack_waiter.Wait();
- EXPECT_EQ(xid, FindTopmostXWindowAt(110, 110));
- EXPECT_EQ(menu_xid, FindTopmostXWindowAt(150, 120));
- EXPECT_EQ(menu_xid, FindTopmostXWindowAt(210, 120));
+ EXPECT_EQ(window, FindTopmostXWindowAt(110, 110));
+ EXPECT_EQ(menu_window, FindTopmostXWindowAt(150, 120));
+ EXPECT_EQ(menu_window, FindTopmostXWindowAt(210, 120));
- XDestroyWindow(xdisplay(), xid);
- XDestroyWindow(xdisplay(), menu_xid);
+ XDestroyWindow(xdisplay(), static_cast<uint32_t>(window));
+ XDestroyWindow(xdisplay(), static_cast<uint32_t>(menu_window));
}
} // namespace views
diff --git a/chromium/ui/views/widget/native_widget_aura_unittest.cc b/chromium/ui/views/widget/native_widget_aura_unittest.cc
index 4e9ce929364..a0a3fb4a69e 100644
--- a/chromium/ui/views/widget/native_widget_aura_unittest.cc
+++ b/chromium/ui/views/widget/native_widget_aura_unittest.cc
@@ -318,14 +318,13 @@ class PropertyTestLayoutManager : public TestLayoutManagerBase {
class PropertyTestWidgetDelegate : public WidgetDelegate {
public:
- explicit PropertyTestWidgetDelegate(Widget* widget) : widget_(widget) {}
+ explicit PropertyTestWidgetDelegate(Widget* widget) : widget_(widget) {
+ SetHasWindowSizeControls(true);
+ }
~PropertyTestWidgetDelegate() override = default;
private:
// WidgetDelegate:
- bool CanMaximize() const override { return true; }
- bool CanMinimize() const override { return true; }
- bool CanResize() const override { return true; }
void DeleteDelegate() override { delete this; }
Widget* GetWidget() override { return widget_; }
const Widget* GetWidget() const override { return widget_; }
@@ -399,18 +398,18 @@ class GestureTrackingView : public View {
TEST_F(NativeWidgetAuraTest, DontCaptureOnGesture) {
// Create two views (both sized the same). |child| is configured not to
// consume the gesture event.
- GestureTrackingView* view = new GestureTrackingView();
+ auto content_view = std::make_unique<GestureTrackingView>();
GestureTrackingView* child = new GestureTrackingView();
child->set_consume_gesture_event(false);
- view->SetLayoutManager(std::make_unique<FillLayout>());
- view->AddChildView(child);
+ content_view->SetLayoutManager(std::make_unique<FillLayout>());
+ content_view->AddChildView(child);
std::unique_ptr<TestWidget> widget(new TestWidget());
Widget::InitParams params(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.context = root_window();
params.bounds = gfx::Rect(0, 0, 100, 200);
widget->Init(std::move(params));
- widget->SetContentsView(view);
+ GestureTrackingView* view = widget->SetContentsView(std::move(content_view));
widget->Show();
ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(41, 51),
@@ -441,13 +440,12 @@ TEST_F(NativeWidgetAuraTest, DontCaptureOnGesture) {
// Verifies views with layers are targeted for events properly.
TEST_F(NativeWidgetAuraTest, PreferViewLayersToChildWindows) {
// Create two widgets: |parent| and |child|. |child| is a child of |parent|.
- View* parent_root = new View;
std::unique_ptr<Widget> parent(new Widget());
Widget::InitParams parent_params(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
parent_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
parent_params.context = root_window();
parent->Init(std::move(parent_params));
- parent->SetContentsView(parent_root);
+ View* parent_root = parent->SetContentsView(std::make_unique<View>());
parent->SetBounds(gfx::Rect(0, 0, 400, 400));
parent->Show();
@@ -499,13 +497,12 @@ TEST_F(NativeWidgetAuraTest, PreferViewLayersToChildWindows) {
TEST_F(NativeWidgetAuraTest,
ShouldDescendIntoChildForEventHandlingChecksVisibleBounds) {
// Create two widgets: |parent| and |child|. |child| is a child of |parent|.
- View* parent_root_view = new View;
Widget parent;
Widget::InitParams parent_params(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
parent_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
parent_params.context = root_window();
parent.Init(std::move(parent_params));
- parent.SetContentsView(parent_root_view);
+ View* parent_root_view = parent.SetContentsView(std::make_unique<View>());
parent.SetBounds(gfx::Rect(0, 0, 400, 400));
parent.Show();
diff --git a/chromium/ui/views/widget/root_view_unittest.cc b/chromium/ui/views/widget/root_view_unittest.cc
index a0640142341..6994e4864bf 100644
--- a/chromium/ui/views/widget/root_view_unittest.cc
+++ b/chromium/ui/views/widget/root_view_unittest.cc
@@ -56,8 +56,7 @@ TEST_F(RootViewTest, DeleteViewDuringKeyEventDispatch) {
bool got_key_event = false;
- View* content = new View;
- widget.SetContentsView(content);
+ View* content = widget.SetContentsView(std::make_unique<View>());
View* child = new DeleteOnKeyEventView(&got_key_event);
content->AddChildView(child);
@@ -413,8 +412,7 @@ TEST_F(RootViewTest, DeleteViewOnMouseExitDispatch) {
widget.Init(std::move(init_params));
widget.SetBounds(gfx::Rect(10, 10, 500, 500));
- View* content = new View;
- widget.SetContentsView(content);
+ View* content = widget.SetContentsView(std::make_unique<View>());
bool view_destroyed = false;
View* child = new DeleteViewOnEvent(ui::ET_MOUSE_EXITED, &view_destroyed);
@@ -450,8 +448,7 @@ TEST_F(RootViewTest, DeleteViewOnMouseEnterDispatch) {
widget.Init(std::move(init_params));
widget.SetBounds(gfx::Rect(10, 10, 500, 500));
- View* content = new View;
- widget.SetContentsView(content);
+ View* content = widget.SetContentsView(std::make_unique<View>());
bool view_destroyed = false;
View* child = new DeleteViewOnEvent(ui::ET_MOUSE_ENTERED, &view_destroyed);
@@ -489,8 +486,7 @@ TEST_F(RootViewTest, RemoveViewOnMouseEnterDispatch) {
widget.Init(std::move(init_params));
widget.SetBounds(gfx::Rect(10, 10, 500, 500));
- View* content = new View;
- widget.SetContentsView(content);
+ View* content = widget.SetContentsView(std::make_unique<View>());
// |child| gets removed without being deleted, so make it a local
// to prevent test memory leak.
@@ -529,8 +525,7 @@ TEST_F(RootViewTest, ClearMouseMoveHandlerOnMouseExitDispatch) {
widget.Init(std::move(init_params));
widget.SetBounds(gfx::Rect(10, 10, 500, 500));
- View* content = new View;
- widget.SetContentsView(content);
+ View* content = widget.SetContentsView(std::make_unique<View>());
View* root_view = widget.GetRootView();
@@ -565,8 +560,7 @@ TEST_F(RootViewTest,
widget.Init(std::move(init_params));
widget.SetBounds(gfx::Rect(10, 10, 500, 500));
- View* content = new View;
- widget.SetContentsView(content);
+ View* content = widget.SetContentsView(std::make_unique<View>());
View* root_view = widget.GetRootView();
@@ -603,8 +597,7 @@ TEST_F(RootViewTest, ClearMouseMoveHandlerOnMouseEnterDispatch) {
widget.Init(std::move(init_params));
widget.SetBounds(gfx::Rect(10, 10, 500, 500));
- View* content = new View;
- widget.SetContentsView(content);
+ View* content = widget.SetContentsView(std::make_unique<View>());
View* root_view = widget.GetRootView();
@@ -657,10 +650,10 @@ TEST_F(RootViewTest, DeleteWidgetOnMouseExitDispatch) {
widget->SetBounds(gfx::Rect(10, 10, 500, 500));
WidgetDeletionObserver widget_deletion_observer(widget);
- View* content = new View();
+ auto content = std::make_unique<View>();
View* child = new DeleteWidgetOnMouseExit(widget);
content->AddChildView(child);
- widget->SetContentsView(content);
+ widget->SetContentsView(std::move(content));
// Make |child| smaller than the containing Widget and RootView.
child->SetBounds(100, 100, 100, 100);
@@ -693,10 +686,9 @@ TEST_F(RootViewTest, DeleteWidgetOnMouseExitDispatchFromChild) {
widget->SetBounds(gfx::Rect(10, 10, 500, 500));
WidgetDeletionObserver widget_deletion_observer(widget);
- View* content = new View();
View* child = new DeleteWidgetOnMouseExit(widget);
View* subchild = new View();
- widget->SetContentsView(content);
+ View* content = widget->SetContentsView(std::make_unique<View>());
content->AddChildView(child);
child->AddChildView(subchild);
diff --git a/chromium/ui/views/widget/unique_widget_ptr.cc b/chromium/ui/views/widget/unique_widget_ptr.cc
new file mode 100644
index 00000000000..558c9f35b23
--- /dev/null
+++ b/chromium/ui/views/widget/unique_widget_ptr.cc
@@ -0,0 +1,97 @@
+// 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/unique_widget_ptr.h"
+
+#include <utility>
+
+#include "base/scoped_observer.h"
+#include "ui/views/view.h"
+#include "ui/views/widget/widget.h"
+#include "ui/views/widget/widget_observer.h"
+
+namespace views {
+
+namespace {
+
+struct WidgetAutoCloser {
+ void operator()(Widget* widget) {
+ widget->CloseWithReason(Widget::ClosedReason::kUnspecified);
+ }
+};
+
+using WidgetAutoClosePtr = std::unique_ptr<Widget, WidgetAutoCloser>;
+
+} // namespace
+
+class UniqueWidgetPtr::UniqueWidgetPtrImpl : public WidgetObserver {
+ public:
+ UniqueWidgetPtrImpl() = default;
+ // Deliberately implicit
+ // NOLINTNEXTLINE(runtime/explicit)
+ UniqueWidgetPtrImpl(std::unique_ptr<Widget> widget)
+ : widget_closer_(widget.release()) {
+ widget_observer_.Add(widget_closer_.get());
+ }
+
+ UniqueWidgetPtrImpl(const UniqueWidgetPtrImpl&) = delete;
+
+ UniqueWidgetPtrImpl& operator=(const UniqueWidgetPtrImpl&) = delete;
+
+ ~UniqueWidgetPtrImpl() override = default;
+
+ Widget* Get() const { return widget_closer_.get(); }
+
+ void Reset() {
+ if (!widget_closer_)
+ return;
+ widget_observer_.RemoveAll();
+ widget_closer_.reset();
+ }
+
+ // WidgetObserver overrides.
+ void OnWidgetDestroying(Widget* widget) override {
+ DCHECK_EQ(widget, widget_closer_.get());
+ widget_observer_.RemoveAll();
+ widget_closer_.release();
+ }
+
+ private:
+ ScopedObserver<Widget, WidgetObserver> widget_observer_{this};
+ WidgetAutoClosePtr widget_closer_;
+};
+
+UniqueWidgetPtr::UniqueWidgetPtr() = default;
+
+UniqueWidgetPtr::UniqueWidgetPtr(std::unique_ptr<Widget> widget)
+ : unique_widget_ptr_impl_(
+ std::make_unique<UniqueWidgetPtrImpl>(std::move(widget))) {}
+
+UniqueWidgetPtr::UniqueWidgetPtr(UniqueWidgetPtr&& other) = default;
+
+UniqueWidgetPtr& UniqueWidgetPtr::operator=(UniqueWidgetPtr&& other) = default;
+
+UniqueWidgetPtr::~UniqueWidgetPtr() = default;
+
+UniqueWidgetPtr::operator bool() const {
+ return !!get();
+}
+
+Widget& UniqueWidgetPtr::operator*() const {
+ return *get();
+}
+
+Widget* UniqueWidgetPtr::operator->() const {
+ return get();
+}
+
+void UniqueWidgetPtr::reset() {
+ unique_widget_ptr_impl_.reset();
+}
+
+Widget* UniqueWidgetPtr::get() const {
+ return unique_widget_ptr_impl_ ? unique_widget_ptr_impl_->Get() : nullptr;
+}
+
+} // namespace views
diff --git a/chromium/ui/views/widget/unique_widget_ptr.h b/chromium/ui/views/widget/unique_widget_ptr.h
new file mode 100644
index 00000000000..f493c367a73
--- /dev/null
+++ b/chromium/ui/views/widget/unique_widget_ptr.h
@@ -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.
+
+#ifndef UI_VIEWS_WIDGET_UNIQUE_WIDGET_PTR_H_
+#define UI_VIEWS_WIDGET_UNIQUE_WIDGET_PTR_H_
+
+#include <memory>
+
+#include "ui/views/views_export.h"
+
+namespace views {
+
+class Widget;
+
+// Ensures the Widget is properly closed when this special
+// auto pointer goes out of scope.
+
+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);
+ UniqueWidgetPtr(UniqueWidgetPtr&&);
+ UniqueWidgetPtr& operator=(UniqueWidgetPtr&&);
+ ~UniqueWidgetPtr();
+
+ explicit operator bool() const;
+ Widget& operator*() const;
+ Widget* operator->() const;
+ void reset();
+ Widget* get() const;
+
+ private:
+ class UniqueWidgetPtrImpl;
+
+ std::unique_ptr<UniqueWidgetPtrImpl> unique_widget_ptr_impl_;
+};
+
+} // namespace views
+
+#endif // UI_VIEWS_WIDGET_UNIQUE_WIDGET_PTR_H_
diff --git a/chromium/ui/views/widget/unique_widget_ptr_unittest.cc b/chromium/ui/views/widget/unique_widget_ptr_unittest.cc
new file mode 100644
index 00000000000..df8804ab1f9
--- /dev/null
+++ b/chromium/ui/views/widget/unique_widget_ptr_unittest.cc
@@ -0,0 +1,133 @@
+// 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/unique_widget_ptr.h"
+
+#include <memory>
+
+#include "base/scoped_observer.h"
+#include "ui/views/test/views_test_base.h"
+#include "ui/views/view.h"
+#include "ui/views/widget/widget.h"
+#include "ui/views/widget/widget_observer.h"
+
+namespace views {
+
+class UniqueWidgetPtrTest : public ViewsTestBase, public WidgetObserver {
+ public:
+ UniqueWidgetPtrTest() = default;
+ ~UniqueWidgetPtrTest() override = default;
+
+ // ViewsTestBase overrides.
+ void TearDown() override {
+ ViewsTestBase::TearDown();
+ ASSERT_EQ(widget_, nullptr);
+ }
+
+ protected:
+ std::unique_ptr<Widget> AllocateTestWidget() override {
+ auto widget = ViewsTestBase::AllocateTestWidget();
+ widget->Init(CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS));
+ widget_observer_.Add(widget.get());
+ return widget;
+ }
+
+ UniqueWidgetPtr CreateUniqueWidgetPtr() {
+ auto widget = UniqueWidgetPtr(AllocateTestWidget());
+ widget->SetContentsView(std::make_unique<View>());
+ widget_ = widget.get();
+ return widget;
+ }
+
+ Widget* widget() { return widget_; }
+
+ // WidgetObserver overrides.
+ void OnWidgetDestroying(Widget* widget) override {
+ ASSERT_NE(widget_, nullptr);
+ ASSERT_EQ(widget_, widget);
+ widget_observer_.Remove(widget_);
+ widget_ = nullptr;
+ }
+
+ private:
+ Widget* widget_ = nullptr;
+ ScopedObserver<Widget, WidgetObserver> widget_observer_{this};
+};
+
+// Make sure explicitly resetting the |unique_widget_ptr| variable properly
+// closes the widget. TearDown() will ensure |widget_| has been cleared.
+TEST_F(UniqueWidgetPtrTest, TestCloseContent) {
+ UniqueWidgetPtr unique_widget_ptr = CreateUniqueWidgetPtr();
+ EXPECT_EQ(unique_widget_ptr->GetContentsView(), widget()->GetContentsView());
+ unique_widget_ptr.reset();
+}
+
+// Same as above, only testing that going out of scope will accomplish the same
+// thing.
+TEST_F(UniqueWidgetPtrTest, TestScopeDestruct) {
+ UniqueWidgetPtr unique_widget_ptr = CreateUniqueWidgetPtr();
+ EXPECT_EQ(unique_widget_ptr->GetContentsView(), widget()->GetContentsView());
+ // Just go out of scope to close the view;
+}
+
+// Check that proper move semantics for assignments work.
+TEST_F(UniqueWidgetPtrTest, TestMoveAssign) {
+ UniqueWidgetPtr unique_widget_ptr2 = CreateUniqueWidgetPtr();
+ {
+ UniqueWidgetPtr unique_widget_ptr;
+ EXPECT_EQ(unique_widget_ptr2->GetContentsView(),
+ widget()->GetContentsView());
+ unique_widget_ptr = std::move(unique_widget_ptr2);
+ EXPECT_EQ(unique_widget_ptr->GetContentsView(),
+ widget()->GetContentsView());
+ EXPECT_FALSE(unique_widget_ptr2);
+ unique_widget_ptr.reset();
+ EXPECT_FALSE(unique_widget_ptr);
+ }
+ RunPendingMessages();
+ EXPECT_EQ(widget(), nullptr);
+}
+
+// Check that move construction functions correctly.
+TEST_F(UniqueWidgetPtrTest, TestMoveConstruct) {
+ UniqueWidgetPtr unique_widget_ptr2 = CreateUniqueWidgetPtr();
+ {
+ EXPECT_EQ(unique_widget_ptr2->GetContentsView(),
+ widget()->GetContentsView());
+ UniqueWidgetPtr unique_widget_ptr = std::move(unique_widget_ptr2);
+ EXPECT_EQ(unique_widget_ptr->GetContentsView(),
+ widget()->GetContentsView());
+ EXPECT_FALSE(unique_widget_ptr2);
+ unique_widget_ptr.reset();
+ EXPECT_FALSE(unique_widget_ptr);
+ }
+ RunPendingMessages();
+ EXPECT_EQ(widget(), nullptr);
+}
+
+// Make sure that any external closing of the widget is properly tracked in the
+// |unique_widget_ptr|.
+TEST_F(UniqueWidgetPtrTest, TestCloseWidget) {
+ UniqueWidgetPtr unique_widget_ptr = CreateUniqueWidgetPtr();
+ EXPECT_EQ(unique_widget_ptr->GetContentsView(), widget()->GetContentsView());
+ // Initiate widget destruction.
+ widget()->CloseWithReason(Widget::ClosedReason::kUnspecified);
+ // Cycle the run loop to allow the deferred destruction to happen.
+ RunPendingMessages();
+ // The UniqueWidgetPtr should have dropped its reference to the content view.
+ EXPECT_FALSE(unique_widget_ptr);
+}
+
+// When the NativeWidget is destroyed, ensure that the Widget is also destroyed
+// which in turn clears the |unique_widget_ptr|.
+TEST_F(UniqueWidgetPtrTest, TestCloseNativeWidget) {
+ UniqueWidgetPtr unique_widget_ptr = CreateUniqueWidgetPtr();
+ EXPECT_EQ(unique_widget_ptr->GetContentsView(), widget()->GetContentsView());
+ // Initiate an OS level native widget destruction.
+ SimulateNativeDestroy(widget());
+ // The UniqueWidgetPtr should have dropped its reference to the content view.
+ EXPECT_FALSE(unique_widget_ptr);
+}
+
+} // namespace views
diff --git a/chromium/ui/views/widget/widget.cc b/chromium/ui/views/widget/widget.cc
index ecd7be9185f..a06ebe82c33 100644
--- a/chromium/ui/views/widget/widget.cc
+++ b/chromium/ui/views/widget/widget.cc
@@ -93,7 +93,7 @@ bool Widget::g_disable_activation_change_handling_ = false;
// WidgetDelegate is supplied.
class DefaultWidgetDelegate : public WidgetDelegate {
public:
- explicit DefaultWidgetDelegate(Widget* widget) : widget_(widget) {
+ DefaultWidgetDelegate() {
// In most situations where a Widget is used without a delegate the Widget
// is used as a container, so that we want focus to advance to the top-level
// widget. A good example of this is the find bar.
@@ -103,12 +103,8 @@ class DefaultWidgetDelegate : public WidgetDelegate {
// WidgetDelegate:
void DeleteDelegate() override { delete this; }
- Widget* GetWidget() override { return widget_; }
- const Widget* GetWidget() const override { return widget_; }
private:
- Widget* widget_;
-
DISALLOW_COPY_AND_ASSIGN(DefaultWidgetDelegate);
};
@@ -179,6 +175,8 @@ Widget::Widget(InitParams params) {
}
Widget::~Widget() {
+ if (widget_delegate_)
+ widget_delegate_->WidgetDestroying();
DestroyRootView();
if (ownership_ == InitParams::WIDGET_OWNS_NATIVE_WIDGET) {
delete native_widget_;
@@ -298,8 +296,7 @@ void Widget::Init(InitParams params) {
// ViewsDelegate::OnBeforeWidgetInit() may change `params.delegate` either
// by setting it to null or assigning a different value to it, so handle
// both cases.
- auto default_widget_delegate =
- std::make_unique<DefaultWidgetDelegate>(this);
+ auto default_widget_delegate = std::make_unique<DefaultWidgetDelegate>();
widget_delegate_ =
params.delegate ? params.delegate : default_widget_delegate.get();
@@ -322,6 +319,9 @@ void Widget::Init(InitParams params) {
// Henceforth, ensure the delegate outlives the Widget.
widget_delegate_->can_delete_this_ = false;
+ if (params.delegate)
+ params.delegate->WidgetInitializing(this);
+
ownership_ = params.ownership;
native_widget_ = CreateNativeWidget(params, this)->AsNativeWidgetPrivate();
root_view_.reset(CreateRootView());
@@ -377,7 +377,7 @@ void Widget::Init(InitParams params) {
native_widget_->OnWidgetInitDone();
if (delegate)
- delegate->OnWidgetInitialized();
+ delegate->WidgetInitialized();
internal::AnyWidgetObserverSingleton::GetInstance()->OnAnyWidgetInitialized(
this);
@@ -1162,6 +1162,8 @@ gfx::Size Widget::GetMaximumSize() const {
}
void Widget::OnNativeWidgetMove() {
+ TRACE_EVENT0("ui", "Widget::OnNativeWidgetMove");
+
widget_delegate_->OnWidgetMove();
NotifyCaretBoundsChanged(GetInputMethod());
@@ -1170,6 +1172,8 @@ void Widget::OnNativeWidgetMove() {
}
void Widget::OnNativeWidgetSizeChanged(const gfx::Size& new_size) {
+ TRACE_EVENT0("ui", "Widget::OnNativeWidgetSizeChanged");
+
View* root = GetRootView();
if (root)
root->SetSize(new_size);
@@ -1229,6 +1233,8 @@ void Widget::OnKeyEvent(ui::KeyEvent* event) {
// RootView from anywhere in Widget. Use
// SendEventToSink() instead. See crbug.com/348087.
void Widget::OnMouseEvent(ui::MouseEvent* event) {
+ TRACE_EVENT0("ui", "Widget::OnMouseEvent");
+
View* root_view = GetRootView();
switch (event->type()) {
case ui::ET_MOUSE_PRESSED: {
@@ -1472,6 +1478,8 @@ View* Widget::GetFocusTraversableParentView() {
// Widget, ui::NativeThemeObserver implementation:
void Widget::OnNativeThemeUpdated(ui::NativeTheme* observed_theme) {
+ TRACE_EVENT0("ui", "Widget::OnNativeThemeUpdated");
+
DCHECK(observer_manager_.IsObserving(observed_theme));
#if defined(OS_MACOSX) || defined(OS_WIN)
diff --git a/chromium/ui/views/widget/widget_delegate.cc b/chromium/ui/views/widget/widget_delegate.cc
index 4ba80f860b3..6916ad1c393 100644
--- a/chromium/ui/views/widget/widget_delegate.cc
+++ b/chromium/ui/views/widget/widget_delegate.cc
@@ -7,6 +7,7 @@
#include "base/check.h"
#include "base/strings/utf_string_conversions.h"
#include "ui/accessibility/ax_enums.mojom.h"
+#include "ui/base/l10n/l10n_util.h"
#include "ui/display/display.h"
#include "ui/display/screen.h"
#include "ui/gfx/image/image_skia.h"
@@ -46,7 +47,7 @@ View* WidgetDelegate::GetInitiallyFocusedView() {
return nullptr;
}
-BubbleDialogDelegateView* WidgetDelegate::AsBubbleDialogDelegate() {
+BubbleDialogDelegate* WidgetDelegate::AsBubbleDialogDelegate() {
return nullptr;
}
@@ -75,11 +76,12 @@ ui::ModalType WidgetDelegate::GetModalType() const {
}
ax::mojom::Role WidgetDelegate::GetAccessibleWindowRole() {
- return ax::mojom::Role::kWindow;
+ return params_.accessible_role;
}
base::string16 WidgetDelegate::GetAccessibleWindowTitle() const {
- return GetWindowTitle();
+ return params_.accessible_title.empty() ? GetWindowTitle()
+ : params_.accessible_title;
}
base::string16 WidgetDelegate::GetWindowTitle() const {
@@ -152,6 +154,19 @@ bool WidgetDelegate::ShouldRestoreWindowSize() const {
return true;
}
+void WidgetDelegate::WidgetInitializing(Widget* widget) {
+ widget_ = widget;
+ OnWidgetInitializing();
+}
+
+void WidgetDelegate::WidgetInitialized() {
+ OnWidgetInitialized();
+}
+
+void WidgetDelegate::WidgetDestroying() {
+ widget_ = nullptr;
+}
+
void WidgetDelegate::WindowWillClose() {
// TODO(ellyjones): For this and the other callback methods, establish whether
// any other code calls these methods. If not, DCHECK here and below that
@@ -170,6 +185,14 @@ void WidgetDelegate::DeleteDelegate() {
std::move(callback).Run();
}
+Widget* WidgetDelegate::GetWidget() {
+ return widget_;
+}
+
+const Widget* WidgetDelegate::GetWidget() const {
+ return widget_;
+}
+
View* WidgetDelegate::GetContentsView() {
if (!default_contents_view_)
default_contents_view_ = new View;
@@ -206,6 +229,14 @@ bool WidgetDelegate::ShouldDescendIntoChildForEventHandling(
return true;
}
+void WidgetDelegate::SetAccessibleRole(ax::mojom::Role role) {
+ params_.accessible_role = role;
+}
+
+void WidgetDelegate::SetAccessibleTitle(base::string16 title) {
+ params_.accessible_title = std::move(title);
+}
+
void WidgetDelegate::SetCanMaximize(bool can_maximize) {
params_.can_maximize = can_maximize;
}
@@ -246,12 +277,22 @@ void WidgetDelegate::SetTitle(const base::string16& title) {
GetWidget()->UpdateWindowTitle();
}
+void WidgetDelegate::SetTitle(int title_message_id) {
+ SetTitle(l10n_util::GetStringUTF16(title_message_id));
+}
+
#if defined(USE_AURA)
void WidgetDelegate::SetCenterTitle(bool center_title) {
params_.center_title = center_title;
}
#endif
+void WidgetDelegate::SetHasWindowSizeControls(bool has_controls) {
+ SetCanMaximize(has_controls);
+ SetCanMinimize(has_controls);
+ SetCanResize(has_controls);
+}
+
void WidgetDelegate::RegisterWindowWillCloseCallback(
base::OnceClosure callback) {
window_will_close_callbacks_.emplace_back(std::move(callback));
diff --git a/chromium/ui/views/widget/widget_delegate.h b/chromium/ui/views/widget/widget_delegate.h
index 23396ad8c3a..6b4ef19ee72 100644
--- a/chromium/ui/views/widget/widget_delegate.h
+++ b/chromium/ui/views/widget/widget_delegate.h
@@ -9,7 +9,7 @@
#include <vector>
#include "base/macros.h"
-#include "ui/accessibility/ax_enums.mojom-forward.h"
+#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/base/ui_base_types.h"
#include "ui/views/view.h"
#include "ui/views/widget/widget.h"
@@ -20,7 +20,7 @@ class Rect;
} // namespace gfx
namespace views {
-class BubbleDialogDelegateView;
+class BubbleDialogDelegate;
class ClientView;
class DialogDelegate;
class NonClientFrameView;
@@ -33,6 +33,17 @@ class VIEWS_EXPORT WidgetDelegate {
Params();
~Params();
+ // The window's role. Useful values include kWindow (a plain window),
+ // kDialog (a dialog), and kAlertDialog (a high-priority dialog whose body
+ // is read when it appears). Using a role outside this set is not likely to
+ // work across platforms.
+ ax::mojom::Role accessible_role = ax::mojom::Role::kWindow;
+
+ // The accessible title for the window, often more descriptive than the
+ // plain title. If no accessible title is present the result of
+ // GetWindowTitle() will be used.
+ base::string16 accessible_title;
+
// Whether the window should display controls for the user to minimize,
// maximize, or resize it.
bool can_maximize = false;
@@ -68,6 +79,7 @@ class VIEWS_EXPORT WidgetDelegate {
};
WidgetDelegate();
+ virtual ~WidgetDelegate();
// Sets the return value of CanActivate(). Default is true.
void SetCanActivate(bool can_activate);
@@ -82,6 +94,10 @@ class VIEWS_EXPORT WidgetDelegate {
// menu bars, etc.) changes in size.
virtual void OnWorkAreaChanged();
+ // Called when the widget's initialization is beginning, right after the
+ // ViewsDelegate decides to use this WidgetDelegate for a Widget.
+ virtual void OnWidgetInitializing() {}
+
// Called when the widget's initialization is complete.
virtual void OnWidgetInitialized() {}
@@ -98,7 +114,7 @@ class VIEWS_EXPORT WidgetDelegate {
// NULL no view is focused.
virtual View* GetInitiallyFocusedView();
- virtual BubbleDialogDelegateView* AsBubbleDialogDelegate();
+ virtual BubbleDialogDelegate* AsBubbleDialogDelegate();
virtual DialogDelegate* AsDialogDelegate();
// Returns true if the window can be resized.
@@ -193,10 +209,28 @@ class VIEWS_EXPORT WidgetDelegate {
virtual void OnWindowEndUserBoundsChange() {}
// Returns the Widget associated with this delegate.
- virtual Widget* GetWidget() = 0;
- virtual const Widget* GetWidget() const = 0;
+ virtual Widget* GetWidget();
+ virtual const Widget* GetWidget() const;
- // Returns the View that is contained within this Widget.
+ // Get the view that is contained within this widget.
+ //
+ // WARNING: This method has unusual ownership behavior:
+ // * If the returned view is owned_by_client(), then the returned pointer is
+ // never an owning pointer;
+ // * If the returned view is !owned_by_client() (the default & the
+ // recommendation), then the returned pointer is *sometimes* an owning
+ // pointer and sometimes not. Specifically, it is an owning pointer exactly
+ // once, when this method is being used to construct the ClientView, which
+ // takes ownership of the ContentsView() when !owned_by_client().
+ //
+ // Apart from being difficult to reason about this introduces a problem: a
+ // WidgetDelegate can't know whether it owns its contents view or not, so
+ // constructing a WidgetDelegate which one does not then use to construct a
+ // Widget (often done in tests) leaks memory in a way that can't be locally
+ // fixed.
+ //
+ // TODO(ellyjones): This is not tenable - figure out how this should work and
+ // replace it.
virtual View* GetContentsView();
// Called by the Widget to create the Client View used to host the contents
@@ -237,6 +271,8 @@ class VIEWS_EXPORT WidgetDelegate {
// Setters for data parameters of the WidgetDelegate. If you use these
// setters, there is no need to override the corresponding virtual getters.
+ void SetAccessibleRole(ax::mojom::Role role);
+ void SetAccessibleTitle(base::string16 title);
void SetCanMaximize(bool can_maximize);
void SetCanMinimize(bool can_minimize);
void SetCanResize(bool can_resize);
@@ -246,16 +282,24 @@ class VIEWS_EXPORT WidgetDelegate {
void SetShowIcon(bool show_icon);
void SetShowTitle(bool show_title);
void SetTitle(const base::string16& title);
+ void SetTitle(int title_message_id);
#if defined(USE_AURA)
void SetCenterTitle(bool center_title);
#endif
+ // A convenience wrapper that does all three of SetCanMaximize,
+ // SetCanMinimize, and SetCanResize.
+ void SetHasWindowSizeControls(bool has_controls);
+
void RegisterWindowWillCloseCallback(base::OnceClosure callback);
void RegisterWindowClosingCallback(base::OnceClosure callback);
void RegisterDeleteDelegateCallback(base::OnceClosure callback);
- // Call this to notify the WidgetDelegate that its Widget is about to start
- // closing.
+ // 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);
+ void WidgetInitialized();
+ void WidgetDestroying();
void WindowWillClose();
// Returns true if the title text should be centered.
@@ -263,12 +307,12 @@ class VIEWS_EXPORT WidgetDelegate {
bool focus_traverses_out() const { return params_.focus_traverses_out; }
- protected:
- virtual ~WidgetDelegate();
-
private:
friend class Widget;
+ // The Widget that was initialized with this instance as its WidgetDelegate,
+ // if any.
+ Widget* widget_ = nullptr;
Params params_;
View* default_contents_view_ = nullptr;
@@ -299,7 +343,7 @@ class VIEWS_EXPORT WidgetDelegateView : public WidgetDelegate, public View {
void DeleteDelegate() override;
Widget* GetWidget() override;
const Widget* GetWidget() const override;
- views::View* GetContentsView() override;
+ View* GetContentsView() override;
private:
DISALLOW_COPY_AND_ASSIGN(WidgetDelegateView);
diff --git a/chromium/ui/views/widget/widget_deletion_observer.cc b/chromium/ui/views/widget/widget_deletion_observer.cc
index 15df9c391ce..3e64f1613b6 100644
--- a/chromium/ui/views/widget/widget_deletion_observer.cc
+++ b/chromium/ui/views/widget/widget_deletion_observer.cc
@@ -16,6 +16,7 @@ WidgetDeletionObserver::WidgetDeletionObserver(Widget* widget)
WidgetDeletionObserver::~WidgetDeletionObserver() {
CleanupWidget();
+ CHECK(!IsInObserverList());
}
void WidgetDeletionObserver::OnWidgetDestroying(Widget* widget) {
diff --git a/chromium/ui/views/widget/widget_hwnd_utils.cc b/chromium/ui/views/widget/widget_hwnd_utils.cc
index 40e66a212e3..89f5b62f95d 100644
--- a/chromium/ui/views/widget/widget_hwnd_utils.cc
+++ b/chromium/ui/views/widget/widget_hwnd_utils.cc
@@ -118,6 +118,8 @@ void CalculateWindowStylesFromInitParams(
else
*style |= WS_BORDER;
}
+ if (!params.force_show_in_taskbar)
+ *ex_style |= WS_EX_TOOLWINDOW;
break;
case Widget::InitParams::TYPE_TOOLTIP:
*style |= WS_POPUP;
diff --git a/chromium/ui/views/widget/widget_interactive_uitest.cc b/chromium/ui/views/widget/widget_interactive_uitest.cc
index f4ba5ba6cad..a333ca057ae 100644
--- a/chromium/ui/views/widget/widget_interactive_uitest.cc
+++ b/chromium/ui/views/widget/widget_interactive_uitest.cc
@@ -4,6 +4,7 @@
#include <stddef.h>
+#include <memory>
#include <utility>
#include "base/bind.h"
@@ -603,7 +604,7 @@ TEST_F(WidgetTestInteractive, ChildStackedRelativeToParent) {
// Test view focus retention when a widget's HWND is disabled and re-enabled.
TEST_F(WidgetTestInteractive, ViewFocusOnHWNDEnabledChanges) {
WidgetAutoclosePtr widget(CreateTopLevelFramelessPlatformWidget());
- widget->SetContentsView(new View);
+ widget->SetContentsView(std::make_unique<View>());
for (size_t i = 0; i < 2; ++i) {
auto child = std::make_unique<View>();
child->SetFocusBehavior(View::FocusBehavior::ALWAYS);
@@ -1456,10 +1457,10 @@ TEST_F(WidgetCaptureTest, FailedCaptureRequestIsNoop) {
MouseView* mouse_view1 = new MouseView;
MouseView* mouse_view2 = new MouseView;
- View* contents_view = new View;
+ auto contents_view = std::make_unique<View>();
contents_view->AddChildView(mouse_view1);
contents_view->AddChildView(mouse_view2);
- widget.SetContentsView(contents_view);
+ widget.SetContentsView(std::move(contents_view));
mouse_view1->SetBounds(0, 0, 200, 400);
mouse_view2->SetBounds(200, 0, 200, 400);
@@ -1480,8 +1481,7 @@ TEST_F(WidgetCaptureTest, FailedCaptureRequestIsNoop) {
TEST_F(WidgetCaptureTest, CaptureAutoReset) {
WidgetAutoclosePtr toplevel(CreateTopLevelFramelessPlatformWidget());
- View* container = new View;
- toplevel->SetContentsView(container);
+ toplevel->SetContentsView(std::make_unique<View>());
EXPECT_FALSE(toplevel->HasCapture());
toplevel->SetCapture(nullptr);
@@ -1507,8 +1507,7 @@ TEST_F(WidgetCaptureTest, CaptureAutoReset) {
TEST_F(WidgetCaptureTest, ResetCaptureOnGestureEnd) {
WidgetAutoclosePtr toplevel(CreateTopLevelFramelessPlatformWidget());
- View* container = new View;
- toplevel->SetContentsView(container);
+ View* container = toplevel->SetContentsView(std::make_unique<View>());
View* gesture = new GestureCaptureView;
gesture->SetBounds(0, 0, 30, 30);
@@ -1570,10 +1569,11 @@ TEST_F(WidgetCaptureTest, DisableCaptureWidgetFromMousePress) {
WidgetAutoclosePtr first(CreateTopLevelFramelessPlatformWidget());
Widget* second = CreateTopLevelFramelessPlatformWidget();
- NestedLoopCaptureView* container = new NestedLoopCaptureView(second);
- first->SetContentsView(container);
+ NestedLoopCaptureView* container =
+ first->SetContentsView(std::make_unique<NestedLoopCaptureView>(second));
- second->SetContentsView(new ExitLoopOnRelease(container->GetQuitClosure()));
+ second->SetContentsView(
+ std::make_unique<ExitLoopOnRelease>(container->GetQuitClosure()));
first->SetSize(gfx::Size(100, 100));
first->Show();
@@ -1597,21 +1597,21 @@ TEST_F(WidgetCaptureTest, DisableCaptureWidgetFromMousePress) {
// time.
TEST_F(WidgetCaptureTest, GrabUngrab) {
auto top_level = CreateTestWidget();
- top_level->SetContentsView(new MouseView());
+ top_level->SetContentsView(std::make_unique<MouseView>());
Widget* child1 = new Widget;
Widget::InitParams params1 = CreateParams(Widget::InitParams::TYPE_CONTROL);
params1.parent = top_level->GetNativeView();
params1.bounds = gfx::Rect(10, 10, 100, 100);
child1->Init(std::move(params1));
- child1->SetContentsView(new MouseView());
+ child1->SetContentsView(std::make_unique<MouseView>());
Widget* child2 = new Widget;
Widget::InitParams params2 = CreateParams(Widget::InitParams::TYPE_CONTROL);
params2.parent = top_level->GetNativeView();
params2.bounds = gfx::Rect(110, 10, 100, 100);
child2->Init(std::move(params2));
- child2->SetContentsView(new MouseView());
+ child2->SetContentsView(std::make_unique<MouseView>());
top_level->Show();
RunPendingMessages();
@@ -1732,8 +1732,8 @@ TEST_F(WidgetCaptureTest, MAYBE_MouseExitOnCaptureGrab) {
CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
params1.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget1.Init(std::move(params1));
- MouseView* mouse_view1 = new MouseView;
- widget1.SetContentsView(mouse_view1);
+ MouseView* mouse_view1 =
+ widget1.SetContentsView(std::make_unique<MouseView>());
widget1.Show();
widget1.SetBounds(gfx::Rect(300, 300));
diff --git a/chromium/ui/views/widget/window_reorderer_unittest.cc b/chromium/ui/views/widget/window_reorderer_unittest.cc
index 670cc0f1238..c46fda38a8e 100644
--- a/chromium/ui/views/widget/window_reorderer_unittest.cc
+++ b/chromium/ui/views/widget/window_reorderer_unittest.cc
@@ -59,8 +59,7 @@ TEST_F(WindowReordererTest, Basic) {
parent->Show();
aura::Window* parent_window = parent->GetNativeWindow();
- View* contents_view = new View();
- parent->SetContentsView(contents_view);
+ View* contents_view = parent->SetContentsView(std::make_unique<View>());
// 1) Test that layers for views and layers for windows associated to a host
// view are stacked below the layers for any windows not associated to a host
@@ -130,8 +129,7 @@ TEST_F(WindowReordererTest, Association) {
parent->Show();
aura::Window* parent_window = parent->GetNativeWindow();
- View* contents_view = new View();
- parent->SetContentsView(contents_view);
+ View* contents_view = parent->SetContentsView(std::make_unique<View>());
aura::Window* w1 =
aura::test::CreateTestWindowWithId(0, parent->GetNativeWindow());
@@ -185,8 +183,7 @@ TEST_F(WindowReordererTest, HostViewParentHasLayer) {
parent->Show();
aura::Window* parent_window = parent->GetNativeWindow();
- View* contents_view = new View();
- parent->SetContentsView(contents_view);
+ View* contents_view = parent->SetContentsView(std::make_unique<View>());
// Create the following view hierarchy. (*) denotes views which paint to a
// layer.
@@ -251,8 +248,7 @@ TEST_F(WindowReordererTest, ViewWithLayerBeneath) {
aura::Window* parent_window = parent->GetNativeWindow();
- View* contents_view = new View;
- parent->SetContentsView(contents_view);
+ View* contents_view = parent->SetContentsView(std::make_unique<View>());
View* view_with_layer_beneath =
contents_view->AddChildView(std::make_unique<View>());
diff --git a/chromium/ui/views/win/hwnd_message_handler.cc b/chromium/ui/views/win/hwnd_message_handler.cc
index c981cfc6b0a..db4fe784c7e 100644
--- a/chromium/ui/views/win/hwnd_message_handler.cc
+++ b/chromium/ui/views/win/hwnd_message_handler.cc
@@ -421,6 +421,7 @@ HWNDMessageHandler::HWNDMessageHandler(HWNDMessageHandlerDelegate* delegate,
dwm_transition_desired_(false),
dwm_composition_enabled_(ui::win::IsDwmCompositionEnabled()),
sent_window_size_changing_(false),
+ did_return_uia_object_(false),
left_button_down_on_caption_(false),
background_fullscreen_hack_(false),
pointer_events_for_touch_(::features::IsUsingWMPointerForTouch()) {}
@@ -987,6 +988,8 @@ HICON HWNDMessageHandler::GetSmallWindowIcon() const {
LRESULT HWNDMessageHandler::OnWndProc(UINT message,
WPARAM w_param,
LPARAM l_param) {
+ TRACE_EVENT1("ui", "HWNDMessageHandler::OnWndProc", "message_id", message);
+
HWND window = hwnd();
LRESULT result = 0;
if (delegate_ && delegate_->PreHandleMSG(message, w_param, l_param, &result))
@@ -1647,15 +1650,17 @@ void HWNDMessageHandler::OnDestroy() {
if (i != map.end())
map.erase(i);
- if (::switches::IsExperimentalAccessibilityPlatformUIAEnabled()) {
- // Signal to UIA that all objects associated with this HWND can be
- // discarded.
+ // If we have ever returned a UIA object via WM_GETOBJECT, signal that all
+ // objects associated with this HWND can be discarded. See:
+ // https://docs.microsoft.com/en-us/windows/win32/api/uiautomationcoreapi/nf-uiautomationcoreapi-uiareturnrawelementprovider#remarks
+ if (did_return_uia_object_)
UiaReturnRawElementProvider(hwnd(), 0, 0, nullptr);
- }
}
void HWNDMessageHandler::OnDisplayChange(UINT bits_per_pixel,
const gfx::Size& screen_size) {
+ TRACE_EVENT0("ui", "HWNDMessageHandler::OnDisplayChange");
+
delegate_->HandleDisplayChange();
// Force a WM_NCCALCSIZE to occur to ensure that we handle auto hide
// taskbars correctly.
@@ -1663,8 +1668,10 @@ void HWNDMessageHandler::OnDisplayChange(UINT bits_per_pixel,
}
LRESULT HWNDMessageHandler::OnDwmCompositionChanged(UINT msg,
- WPARAM w_param,
- LPARAM l_param) {
+ WPARAM /* w_param */,
+ LPARAM /* l_param */) {
+ TRACE_EVENT0("ui", "HWNDMessageHandler::OnDwmCompositionChanged");
+
if (!delegate_->HasNonClientView()) {
SetMsgHandled(FALSE);
return 0;
@@ -1689,6 +1696,9 @@ 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));
+
int dpi;
float scaling_factor;
if (display::Display::HasForceDeviceScaleFactor()) {
@@ -1811,6 +1821,10 @@ LRESULT HWNDMessageHandler::OnGetObject(UINT message,
Microsoft::WRL::ComPtr<IRawElementProviderSimple> root;
ax_fragment_root_->GetNativeViewAccessible()->QueryInterface(
IID_PPV_ARGS(&root));
+
+ // Return the UIA object via UiaReturnRawElementProvider(). See:
+ // https://docs.microsoft.com/en-us/windows/win32/winauto/wm-getobject
+ did_return_uia_object_ = true;
reference_result =
UiaReturnRawElementProvider(hwnd(), w_param, l_param, root.Get());
} else if (is_msaa_request) {
@@ -1979,12 +1993,27 @@ LRESULT HWNDMessageHandler::OnPointerEvent(UINT message,
return -1;
}
+ // |HandlePointerEventTypePenClient| assumes all pen events happen on the
+ // client area, so WM_NCPOINTER messages sent to it would eventually be
+ // dropped and the native frame wouldn't be able to respond to pens.
+ // |HandlePointerEventTypeTouchOrNonClient| handles non-client area messages
+ // properly. Since we don't need to distinguish between pens and fingers in
+ // non-client area, route the messages to that method.
+ if (pointer_type == PT_PEN &&
+ (message == WM_NCPOINTERDOWN ||
+ message == WM_NCPOINTERUP ||
+ message == WM_NCPOINTERUPDATE)) {
+ pointer_type = PT_TOUCH;
+ }
+
switch (pointer_type) {
case PT_PEN:
- return HandlePointerEventTypePen(message, w_param, l_param);
+ return HandlePointerEventTypePenClient(message, w_param, l_param);
case PT_TOUCH:
- if (pointer_events_for_touch_)
- return HandlePointerEventTypeTouch(message, w_param, l_param);
+ if (pointer_events_for_touch_) {
+ return HandlePointerEventTypeTouchOrNonClient(
+ message, w_param, l_param);
+ }
FALLTHROUGH;
default:
break;
@@ -2390,23 +2419,28 @@ void HWNDMessageHandler::OnPaint(HDC dc) {
// flicker opaque black. http://crbug.com/586454
FillRect(ps.hdc, &ps.rcPaint, brush);
- } else if (exposed_pixels_.height() > 0 || exposed_pixels_.width() > 0) {
+ } else if (exposed_pixels_ != gfx::Size()) {
// Fill in newly exposed window client area with black to ensure Windows
// doesn't put something else there (eg. copying existing pixels). This
// isn't needed if we've just cleared the whole client area outside the
// child window above.
RECT cr;
if (GetClientRect(hwnd(), &cr)) {
+ // GetClientRect() always returns a rect with top/left at 0.
+ const gfx::Size client_area = gfx::Rect(cr).size();
+
+ // It's possible that |exposed_pixels_| height and/or width is larger
+ // than the client area if the window frame size changed. This isn't an
+ // issue since FillRect() is clipped by |ps.rcPaint|.
if (exposed_pixels_.height() > 0) {
- DCHECK_GE(cr.bottom, exposed_pixels_.height());
- RECT rect = {cr.left, cr.bottom - exposed_pixels_.height(), cr.right,
- cr.bottom};
+ RECT rect = {0, client_area.height() - exposed_pixels_.height(),
+ client_area.width(), client_area.height()};
FillRect(ps.hdc, &rect, brush);
}
if (exposed_pixels_.width() > 0) {
- DCHECK_GE(cr.right, exposed_pixels_.width());
- RECT rect = {cr.right - exposed_pixels_.width(), cr.top, cr.right,
- cr.bottom - exposed_pixels_.height()};
+ RECT rect = {client_area.width() - exposed_pixels_.width(), 0,
+ client_area.width(),
+ client_area.height() - exposed_pixels_.height()};
FillRect(ps.hdc, &rect, brush);
}
}
@@ -2721,6 +2755,8 @@ LRESULT HWNDMessageHandler::OnTouchEvent(UINT message,
}
void HWNDMessageHandler::OnWindowPosChanging(WINDOWPOS* window_pos) {
+ TRACE_EVENT0("ui", "HWNDMessageHandler::OnWindowPosChanging");
+
if (ignore_window_pos_changes_) {
// If somebody's trying to toggle our visibility, change the nonclient area,
// change our Z-order, or activate us, we should probably let it go through.
@@ -2872,6 +2908,8 @@ void HWNDMessageHandler::OnWindowPosChanging(WINDOWPOS* window_pos) {
}
void HWNDMessageHandler::OnWindowPosChanged(WINDOWPOS* window_pos) {
+ TRACE_EVENT0("ui", "HWNDMessageHandler::OnWindowPosChanged");
+
if (DidClientAreaSizeChange(window_pos))
ClientAreaSizeChanged();
if (window_pos->flags & SWP_FRAMECHANGED)
@@ -3084,9 +3122,8 @@ LRESULT HWNDMessageHandler::HandleMouseEventInternal(UINT message,
return 0;
}
-LRESULT HWNDMessageHandler::HandlePointerEventTypeTouch(UINT message,
- WPARAM w_param,
- LPARAM l_param) {
+LRESULT HWNDMessageHandler::HandlePointerEventTypeTouchOrNonClient(
+ UINT message, WPARAM w_param, LPARAM l_param) {
UINT32 pointer_id = GET_POINTERID_WPARAM(w_param);
using GetPointerTouchInfoFn = BOOL(WINAPI*)(UINT32, POINTER_TOUCH_INFO*);
POINTER_TOUCH_INFO pointer_touch_info;
@@ -3194,9 +3231,9 @@ LRESULT HWNDMessageHandler::HandlePointerEventTypeTouch(UINT message,
return 0;
}
-LRESULT HWNDMessageHandler::HandlePointerEventTypePen(UINT message,
- WPARAM w_param,
- LPARAM l_param) {
+LRESULT HWNDMessageHandler::HandlePointerEventTypePenClient(UINT message,
+ WPARAM w_param,
+ LPARAM l_param) {
UINT32 pointer_id = GET_POINTERID_WPARAM(w_param);
using GetPointerPenInfoFn = BOOL(WINAPI*)(UINT32, POINTER_PEN_INFO*);
POINTER_PEN_INFO pointer_pen_info;
@@ -3296,6 +3333,8 @@ void HWNDMessageHandler::PerformDwmTransition() {
}
void HWNDMessageHandler::UpdateDwmFrame() {
+ TRACE_EVENT0("ui", "HWNDMessageHandler::UpdateDwmFrame");
+
gfx::Insets insets;
if (ui::win::IsAeroGlassEnabled() &&
delegate_->GetDwmFrameInsetsInPixels(&insets)) {
diff --git a/chromium/ui/views/win/hwnd_message_handler.h b/chromium/ui/views/win/hwnd_message_handler.h
index a84076658b4..7118ff56f0d 100644
--- a/chromium/ui/views/win/hwnd_message_handler.h
+++ b/chromium/ui/views/win/hwnd_message_handler.h
@@ -543,13 +543,17 @@ class VIEWS_EXPORT HWNDMessageHandler : public gfx::WindowImpl,
LPARAM l_param,
bool track_mouse);
- LRESULT HandlePointerEventTypeTouch(UINT message,
- WPARAM w_param,
- LPARAM l_param);
-
- LRESULT HandlePointerEventTypePen(UINT message,
- WPARAM w_param,
- LPARAM l_param);
+ // We handle 2 kinds of WM_POINTER events: PT_TOUCH and PT_PEN. This helper
+ // handles client area events of PT_TOUCH, and non-client area events of both
+ // kinds.
+ LRESULT HandlePointerEventTypeTouchOrNonClient(UINT message,
+ WPARAM w_param,
+ LPARAM l_param);
+
+ // Helper to handle client area events of PT_PEN.
+ LRESULT HandlePointerEventTypePenClient(UINT message,
+ WPARAM w_param,
+ LPARAM l_param);
// Returns true if the mouse message passed in is an OS synthesized mouse
// message.
@@ -742,9 +746,15 @@ class VIEWS_EXPORT HWNDMessageHandler : public gfx::WindowImpl,
// Some assistive software need to track the location of the caret.
std::unique_ptr<ui::AXSystemCaretWin> ax_system_caret_;
- // Implements IRawElementProviderFragmentRoot when UIA is enabled
+ // Implements IRawElementProviderFragmentRoot when UIA is enabled.
std::unique_ptr<ui::AXFragmentRootWin> ax_fragment_root_;
+ // Set to true when we return a UIA object. Determines whether we need to
+ // call UIA to clean up object references on window destruction.
+ // This is important to avoid triggering a cross-thread COM call which could
+ // cause re-entrancy during teardown. https://crbug.com/1087553
+ bool did_return_uia_object_;
+
// The location where the user clicked on the caption. We cache this when we
// receive the WM_NCLBUTTONDOWN message. We use this in the subsequent
// WM_NCMOUSEMOVE message to see if the mouse actually moved.
diff --git a/chromium/ui/views/window/custom_frame_view_unittest.cc b/chromium/ui/views/window/custom_frame_view_unittest.cc
index d04752c1b4d..37ed1a60201 100644
--- a/chromium/ui/views/window/custom_frame_view_unittest.cc
+++ b/chromium/ui/views/window/custom_frame_view_unittest.cc
@@ -17,33 +17,6 @@
namespace views {
-namespace {
-
-// Allows for the control of whether or not the widget can minimize/maximize or
-// not. This can be set after initial setup in order to allow testing of both
-// forms of delegates. By default this can minimize and maximize.
-class MinimizeAndMaximizeStateControlDelegate : public WidgetDelegateView {
- public:
- MinimizeAndMaximizeStateControlDelegate() = default;
- ~MinimizeAndMaximizeStateControlDelegate() override = default;
-
- void set_can_maximize(bool can_maximize) { can_maximize_ = can_maximize; }
-
- void set_can_minimize(bool can_minimize) { can_minimize_ = can_minimize; }
-
- // WidgetDelegate:
- bool CanMaximize() const override { return can_maximize_; }
- bool CanMinimize() const override { return can_minimize_; }
-
- private:
- bool can_maximize_ = true;
- bool can_minimize_ = true;
-
- DISALLOW_COPY_AND_ASSIGN(MinimizeAndMaximizeStateControlDelegate);
-};
-
-} // namespace
-
class CustomFrameViewTest : public ViewsTestBase {
public:
CustomFrameViewTest() = default;
@@ -51,11 +24,6 @@ class CustomFrameViewTest : public ViewsTestBase {
CustomFrameView* custom_frame_view() { return custom_frame_view_; }
- MinimizeAndMaximizeStateControlDelegate*
- minimize_and_maximize_state_control_delegate() {
- return minimize_and_maximize_state_control_delegate_;
- }
-
Widget* widget() { return widget_; }
// ViewsTestBase:
@@ -90,27 +58,26 @@ class CustomFrameViewTest : public ViewsTestBase {
const std::vector<views::FrameButton> trailing_buttons);
private:
+ std::unique_ptr<WidgetDelegate> widget_delegate_;
+
// Parent container for |custom_frame_view_|
Widget* widget_;
// Owned by |widget_|
CustomFrameView* custom_frame_view_;
- // Delegate of |widget_| which controls minimizing and maximizing
- MinimizeAndMaximizeStateControlDelegate*
- minimize_and_maximize_state_control_delegate_;
-
DISALLOW_COPY_AND_ASSIGN(CustomFrameViewTest);
};
void CustomFrameViewTest::SetUp() {
ViewsTestBase::SetUp();
- minimize_and_maximize_state_control_delegate_ =
- new MinimizeAndMaximizeStateControlDelegate;
widget_ = new Widget;
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.delegate = minimize_and_maximize_state_control_delegate_;
+ widget_delegate_ = std::make_unique<WidgetDelegate>();
+ params.delegate = widget_delegate_.get();
+ params.delegate->SetCanMaximize(true);
+ params.delegate->SetCanMinimize(true);
params.remove_standard_frame = true;
widget_->Init(std::move(params));
@@ -214,9 +181,7 @@ TEST_F(CustomFrameViewTest, MaximizeRevealsRestoreButton) {
TEST_F(CustomFrameViewTest, CannotMaximizeHidesButton) {
Widget* parent = widget();
CustomFrameView* view = custom_frame_view();
- MinimizeAndMaximizeStateControlDelegate* delegate =
- minimize_and_maximize_state_control_delegate();
- delegate->set_can_maximize(false);
+ widget()->widget_delegate()->SetCanMaximize(false);
view->Init(parent);
parent->SetBounds(gfx::Rect(0, 0, 300, 100));
@@ -231,9 +196,7 @@ TEST_F(CustomFrameViewTest, CannotMaximizeHidesButton) {
TEST_F(CustomFrameViewTest, CannotMinimizeHidesButton) {
Widget* parent = widget();
CustomFrameView* view = custom_frame_view();
- MinimizeAndMaximizeStateControlDelegate* delegate =
- minimize_and_maximize_state_control_delegate();
- delegate->set_can_minimize(false);
+ widget()->widget_delegate()->SetCanMinimize(false);
view->Init(parent);
parent->SetBounds(gfx::Rect(0, 0, 300, 100));
diff --git a/chromium/ui/views/window/dialog_delegate.cc b/chromium/ui/views/window/dialog_delegate.cc
index 6afc661f5a2..21fea394e44 100644
--- a/chromium/ui/views/window/dialog_delegate.cc
+++ b/chromium/ui/views/window/dialog_delegate.cc
@@ -162,6 +162,9 @@ void DialogDelegate::RunCloseCallback(base::OnceClosure callback) {
}
View* DialogDelegate::GetInitiallyFocusedView() {
+ if (params_.initially_focused_view.has_value())
+ return *params_.initially_focused_view;
+
// Focus the default button if any.
const DialogClientView* dcv = GetDialogClientView();
if (!dcv)
@@ -370,6 +373,10 @@ void DialogDelegate::SetCloseCallback(base::OnceClosure callback) {
close_callback_ = std::move(callback);
}
+void DialogDelegate::SetInitiallyFocusedView(View* view) {
+ params_.initially_focused_view = view;
+}
+
std::unique_ptr<View> DialogDelegate::DisownExtraView() {
return std::move(extra_view_);
}
diff --git a/chromium/ui/views/window/dialog_delegate.h b/chromium/ui/views/window/dialog_delegate.h
index 04bc5b4cdce..2b35fd9e2c2 100644
--- a/chromium/ui/views/window/dialog_delegate.h
+++ b/chromium/ui/views/window/dialog_delegate.h
@@ -64,6 +64,11 @@ class VIEWS_EXPORT DialogDelegate : public WidgetDelegate {
// dialog. It's legal for a button to be marked enabled that isn't present
// in |buttons| (see above).
int enabled_buttons = ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL;
+
+ // The view that should receive initial focus in the dialog. If not set, the
+ // default button will receive initial focus. If explicitly set to nullptr,
+ // no view will receive focus.
+ base::Optional<View*> initially_focused_view;
};
DialogDelegate();
@@ -192,8 +197,23 @@ class VIEWS_EXPORT DialogDelegate : public WidgetDelegate {
void SetButtons(int buttons);
void SetButtonLabel(ui::DialogButton button, base::string16 label);
void SetButtonEnabled(ui::DialogButton button, bool enabled);
+ void SetInitiallyFocusedView(View* view);
+
+ // Called when the user presses the dialog's "OK" button or presses the dialog
+ // accept accelerator, if there is one.
void SetAcceptCallback(base::OnceClosure callback);
+
+ // Called when the user presses the dialog's "Cancel" button or presses the
+ // dialog close accelerator (which is always VKEY_ESCAPE).
void SetCancelCallback(base::OnceClosure callback);
+
+ // Called when:
+ // * The user presses the dialog's close button, if it has one
+ // * The dialog's widget is closed via Widget::Close()
+ // NOT called when the dialog's widget is closed via Widget::CloseNow() - in
+ // that case, the normal widget close path is skipped, so no orderly teardown
+ // of the dialog's widget happens. The main way that can happen in production
+ // use is if the dialog's parent widget is closed.
void SetCloseCallback(base::OnceClosure callback);
// Returns ownership of the extra view for this dialog, if one was provided
diff --git a/chromium/ui/views/window/dialog_delegate_unittest.cc b/chromium/ui/views/window/dialog_delegate_unittest.cc
index 6096431dc6b..33e49328132 100644
--- a/chromium/ui/views/window/dialog_delegate_unittest.cc
+++ b/chromium/ui/views/window/dialog_delegate_unittest.cc
@@ -515,4 +515,23 @@ TEST_F(DialogDelegateCloseTest, OldClosePathDoesNotDoubleClose) {
EXPECT_FALSE(cancelled);
}
+TEST_F(DialogDelegateCloseTest, CloseParentWidgetDoesNotInvokeCloseCallback) {
+ auto* dialog = new DialogDelegateView();
+ std::unique_ptr<Widget> parent = CreateTestWidget();
+ Widget* widget = DialogDelegate::CreateDialogWidget(dialog, GetContext(),
+ parent->GetNativeView());
+
+ bool closed = false;
+ dialog->SetCloseCallback(
+ base::BindLambdaForTesting([&closed]() { closed = true; }));
+
+ views::test::WidgetDestroyedWaiter parent_waiter(parent.get());
+ views::test::WidgetDestroyedWaiter dialog_waiter(widget);
+ parent->Close();
+ parent_waiter.Wait();
+ dialog_waiter.Wait();
+
+ EXPECT_FALSE(closed);
+}
+
} // namespace views
diff --git a/chromium/ui/views/window/vector_icons/vector_icons.cc.template b/chromium/ui/views/window/vector_icons/vector_icons.cc.template
index e3457f998b2..ca986041784 100644
--- a/chromium/ui/views/window/vector_icons/vector_icons.cc.template
+++ b/chromium/ui/views/window/vector_icons/vector_icons.cc.template
@@ -7,7 +7,6 @@
#include "ui/views/window/vector_icons/vector_icons.h"
-#include "base/logging.h"
#include "components/vector_icons/cc_macros.h"
#include "ui/gfx/vector_icon_types.h"
diff --git a/chromium/ui/views_content_client/views_content_client_main_parts_desktop_aura.cc b/chromium/ui/views_content_client/views_content_client_main_parts_desktop_aura.cc
index 7797e66e209..c5d990a41f5 100644
--- a/chromium/ui/views_content_client/views_content_client_main_parts_desktop_aura.cc
+++ b/chromium/ui/views_content_client/views_content_client_main_parts_desktop_aura.cc
@@ -37,7 +37,7 @@ ViewsContentClientMainPartsDesktopAura::ViewsContentClientMainPartsDesktopAura(
void ViewsContentClientMainPartsDesktopAura::PreMainMessageLoopRun() {
ViewsContentClientMainPartsAura::PreMainMessageLoopRun();
- display::Screen::SetScreenInstance(views::CreateDesktopScreen());
+ views::CreateDesktopScreen();
views_content_client()->OnPreMainMessageLoopRun(browser_context(), nullptr);
}
diff --git a/chromium/ui/webui/PLATFORM_OWNERS b/chromium/ui/webui/PLATFORM_OWNERS
index ecfd43c2278..e875c99f4dd 100644
--- a/chromium/ui/webui/PLATFORM_OWNERS
+++ b/chromium/ui/webui/PLATFORM_OWNERS
@@ -4,7 +4,7 @@ antrim@chromium.org # CET
calamity@chromium.org
dpapad@chromium.org
dschuyler@chromium.org
+khorimoto@chromium.org # For Chrome OS changes.
michaelpg@chromium.org
rbpotter@chromium.org
tommycli@chromium.org
-xiyuan@chromium.org
diff --git a/chromium/ui/webui/mojo_web_ui_controller.h b/chromium/ui/webui/mojo_web_ui_controller.h
index fe0a87e7f35..62c695f083b 100644
--- a/chromium/ui/webui/mojo_web_ui_controller.h
+++ b/chromium/ui/webui/mojo_web_ui_controller.h
@@ -14,10 +14,16 @@ namespace ui {
// MojoWebUIController is intended for WebUI pages that use Mojo. It is
// expected that subclasses will:
// . Add all Mojo Bindings Resources via AddResourcePath(), eg:
-// source-> AddResourcePath("chrome/browser/ui/webui/omnibox/omnibox.mojom",
+// source->AddResourcePath("chrome/browser/ui/webui/omnibox/omnibox.mojom",
// IDR_OMNIBOX_MOJO_JS);
// . Overload void BindInterface(mojo::PendingReceiver<InterfaceName>) for all
// Mojo Interfaces it wishes to handle.
+// . Use WEB_UI_CONTROLLER_TYPE_DECL macro in .h file and
+// WEB_UI_CONTROLLER_TYPE_IMPL macro in .cc file.
+// . Register all Mojo Interfaces it wishes to handle in the appropriate
+// BinderMap:
+// - chrome/browser/chrome_browser_interface_binders.cc for chrome/ WebUIs;
+// - content/browser/browser_interface_binders.cc for content/ WebUIs.
class MojoWebUIController : public content::WebUIController {
public:
// By default MojoWebUIControllers do not have normal WebUI bindings. Pass
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.js b/chromium/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.js
index 32a9d187400..065021583f5 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.js
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.js
@@ -8,16 +8,17 @@
* imported.
* - edit the trust level of an already existing certificate authority.
*/
-import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
-import 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.m.js';
-import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
+import '../../cr_elements/cr_button/cr_button.m.js';
+import '../../cr_elements/cr_checkbox/cr_checkbox.m.js';
+import '../../cr_elements/cr_dialog/cr_dialog.m.js';
import 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js';
import './certificate_shared_css.js';
-import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
-import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {I18nBehavior} from '../../js/i18n_behavior.m.js';
+import {loadTimeData} from '../../js/load_time_data.m.js';
+
import {CaTrustInfo, CertificatesBrowserProxy, CertificatesBrowserProxyImpl, CertificateSubnode, NewCertificateSubNode} from './certificates_browser_proxy.js';
Polymer({
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.js b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.js
index 05c048f2a41..17b9e424309 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.js
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.js
@@ -6,15 +6,16 @@
* @fileoverview A confirmation dialog allowing the user to delete various types
* of certificates.
*/
-import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
-import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
+import '../../cr_elements/cr_button/cr_button.m.js';
+import '../../cr_elements/cr_dialog/cr_dialog.m.js';
import './certificate_shared_css.js';
-import {assertNotReached} from 'chrome://resources/js/assert.m.js';
-import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
-import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assertNotReached} from '../../js/assert.m.js';
+import {I18nBehavior} from '../../js/i18n_behavior.m.js';
+import {loadTimeData} from '../../js/load_time_data.m.js';
+
import {CertificatesBrowserProxy, CertificatesBrowserProxyImpl, CertificateSubnode, CertificateType} from './certificates_browser_proxy.js';
Polymer({
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_entry.js b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_entry.js
index 319097ec3a8..6686997c1c6 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_entry.js
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_entry.js
@@ -5,16 +5,17 @@
/**
* @fileoverview An element that represents an SSL certificate entry.
*/
-import 'chrome://resources/cr_elements/cr_expand_button/cr_expand_button.m.js';
-import 'chrome://resources/cr_elements/policy/cr_policy_indicator.m.js';
+import '../../cr_elements/cr_expand_button/cr_expand_button.m.js';
+import '../../cr_elements/policy/cr_policy_indicator.m.js';
import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
import './certificate_shared_css.js';
import './certificate_subentry.js';
-import {CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.m.js';
-import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {CrPolicyIndicatorType} from '../../cr_elements/policy/cr_policy_indicator_behavior.m.js';
+import {I18nBehavior} from '../../js/i18n_behavior.m.js';
+
import {CertificatesOrgGroup, CertificateType} from './certificates_browser_proxy.js';
Polymer({
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_list.js b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_list.js
index 305f056eb97..3d68d034da2 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_list.js
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_list.js
@@ -6,16 +6,17 @@
* @fileoverview 'certificate-list' is an element that displays a list of
* certificates.
*/
-import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
+import '../../cr_elements/cr_button/cr_button.m.js';
import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
import './certificate_entry.js';
import './certificate_shared_css.js';
-import {assertNotReached} from 'chrome://resources/js/assert.m.js';
-import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
-import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assertNotReached} from '../../js/assert.m.js';
+import {I18nBehavior} from '../../js/i18n_behavior.m.js';
+import {loadTimeData} from '../../js/load_time_data.m.js';
+
import {CertificateAction, CertificateActionEvent, CertificateActionEventDetail} from './certificate_manager_types.js';
import {CertificatesBrowserProxy, CertificatesBrowserProxyImpl, CertificatesOrgGroup, CertificateType, NewCertificateSubNode} from './certificates_browser_proxy.js';
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.js b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.js
index 98ea4179204..74971877997 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.js
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.js
@@ -5,8 +5,8 @@
/**
* @fileoverview The 'certificate-manager' component manages SSL certificates.
*/
-import 'chrome://resources/cr_elements/cr_tabs/cr_tabs.m.js';
-import 'chrome://resources/cr_elements/hidden_style_css.m.js';
+import '../../cr_elements/cr_tabs/cr_tabs.m.js';
+import '../../cr_elements/hidden_style_css.m.js';
import 'chrome://resources/polymer/v3_0/iron-pages/iron-pages.js';
import './ca_trust_edit_dialog.js';
import './certificate_delete_confirmation_dialog.js';
@@ -16,13 +16,14 @@ import './certificate_password_encryption_dialog.js';
import './certificates_error_dialog.js';
import './certificate_provisioning_list.js';
-import {assert} from 'chrome://resources/js/assert.m.js';
-import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js';
-import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
-import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assert} from '../../js/assert.m.js';
+import {focusWithoutInk} from '../../js/cr/ui/focus_without_ink.m.js';
+import {I18nBehavior} from '../../js/i18n_behavior.m.js';
+import {loadTimeData} from '../../js/load_time_data.m.js';
+import {WebUIListenerBehavior} from '../../js/web_ui_listener_behavior.m.js';
+
import {CertificateAction, CertificateActionEvent, CertificatesErrorEventDetail} from './certificate_manager_types.js';
import {CertificatesBrowserProxyImpl, CertificatesError, CertificatesImportError, CertificatesOrgGroup, CertificateSubnode, CertificateType} from './certificates_browser_proxy.js';
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.js b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.js
index 208dad02793..1eeb99f487a 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.js
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.js
@@ -6,14 +6,15 @@
* @fileoverview A dialog prompting the user for a decryption password such that
* a previously exported personal certificate can be imported.
*/
-import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
-import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
-import 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
+import '../../cr_elements/cr_button/cr_button.m.js';
+import '../../cr_elements/cr_dialog/cr_dialog.m.js';
+import '../../cr_elements/cr_input/cr_input.m.js';
import './certificate_shared_css.js';
-import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {I18nBehavior} from '../../js/i18n_behavior.m.js';
+
import {CertificatesBrowserProxy, CertificatesBrowserProxyImpl} from './certificates_browser_proxy.js';
Polymer({
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.js b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.js
index 8a5765590c6..b414c38bce7 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.js
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.js
@@ -6,15 +6,16 @@
* @fileoverview A dialog prompting the user to encrypt a personal certificate
* before it is exported to disk.
*/
-import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
-import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
-import 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
-import 'chrome://resources/cr_elements/shared_vars_css.m.js';
+import '../../cr_elements/cr_button/cr_button.m.js';
+import '../../cr_elements/cr_dialog/cr_dialog.m.js';
+import '../../cr_elements/cr_input/cr_input.m.js';
+import '../../cr_elements/shared_vars_css.m.js';
import './certificate_shared_css.js';
-import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {I18nBehavior} from '../../js/i18n_behavior.m.js';
+
import {CertificatesBrowserProxy, CertificatesBrowserProxyImpl, CertificateSubnode} from './certificates_browser_proxy.js';
Polymer({
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_shared_css.js b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_shared_css.js
index de8da595448..0d1cd58b314 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_shared_css.js
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_shared_css.js
@@ -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 'chrome://resources/cr_elements/shared_style_css.m.js';
+import '../../cr_elements/shared_style_css.m.js';
const template = document.createElement('template');
template.innerHTML = `
<dom-module id="certificate-shared">{__html_template__}</dom-module>
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 1ba7132e3e4..ef95ba04614 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
@@ -6,17 +6,18 @@
* @fileoverview certificate-subentry represents an SSL certificate sub-entry.
*/
-import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.m.js';
-import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
-import 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.m.js';
-import 'chrome://resources/cr_elements/policy/cr_policy_indicator.m.js';
-import 'chrome://resources/cr_elements/icons.m.js';
+import '../../cr_elements/cr_action_menu/cr_action_menu.m.js';
+import '../../cr_elements/cr_icon_button/cr_icon_button.m.js';
+import '../../cr_elements/cr_lazy_render/cr_lazy_render.m.js';
+import '../../cr_elements/policy/cr_policy_indicator.m.js';
+import '../../cr_elements/icons.m.js';
import './certificate_shared_css.js';
-import {CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.m.js';
-import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {CrPolicyIndicatorType} from '../../cr_elements/policy/cr_policy_indicator_behavior.m.js';
+import {I18nBehavior} from '../../js/i18n_behavior.m.js';
+
import {CertificateAction, CertificateActionEvent, CertificateActionEventDetail} from './certificate_manager_types.js';
import {CertificatesBrowserProxy, CertificatesBrowserProxyImpl, CertificateSubnode, CertificateType} from './certificates_browser_proxy.js';
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificates_browser_proxy.js b/chromium/ui/webui/resources/cr_components/certificate_manager/certificates_browser_proxy.js
index d1f146db1b2..11d0f3468d5 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificates_browser_proxy.js
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificates_browser_proxy.js
@@ -8,7 +8,7 @@
*/
// clang-format off
-import {addSingletonGetter, sendWithPromise} from 'chrome://resources/js/cr.m.js';
+import {addSingletonGetter, sendWithPromise} from '../../js/cr.m.js';
// clang-format on
/**
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.js b/chromium/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.js
index 25562355152..6ff0a49554e 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.js
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.js
@@ -6,14 +6,15 @@
* @fileoverview A dialog for showing SSL certificate related error messages.
* The user can only close the dialog, there is no other possible interaction.
*/
-import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
-import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
+import '../../cr_elements/cr_button/cr_button.m.js';
+import '../../cr_elements/cr_dialog/cr_dialog.m.js';
import './certificate_shared_css.js';
-import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
-import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {I18nBehavior} from '../../js/i18n_behavior.m.js';
+import {loadTimeData} from '../../js/load_time_data.m.js';
+
import {CertificatesError, CertificatesImportError} from './certificates_browser_proxy.js';
Polymer({
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/BUILD.gn b/chromium/ui/webui/resources/cr_components/chromeos/BUILD.gn
index d96f84805d0..be17a059d14 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/chromeos/BUILD.gn
@@ -8,10 +8,11 @@ assert(is_chromeos, "Only ChromeOS components belong here.")
group("closure_compile") {
deps = [
- ":chromeos_resources",
+ "bluetooth:closure_compile",
"cellular_setup:closure_compile",
"multidevice_setup:closure_compile",
"network:closure_compile",
+ "network_health:closure_compile",
"quick_unlock:closure_compile",
"smb_shares:closure_compile",
@@ -19,36 +20,17 @@ group("closure_compile") {
# TODO: Uncomment as Polymer3 migration makes progress.
# "network:closure_compile_module",
# "quick_unlock:closure_compile_module",
+ "bluetooth:closure_compile_module",
+ "network_health:closure_compile_module",
"smb_shares:closure_compile_module",
]
}
-js_type_check("chromeos_resources") {
- deps = [ ":bluetooth_dialog" ]
-}
-
-js_library("bluetooth_dialog") {
- deps = [
- "//third_party/polymer/v1_0/components-chromium/iron-resizable-behavior:iron-resizable-behavior-extracted",
- "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog",
- "//ui/webui/resources/cr_elements/cr_input:cr_input",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:i18n_behavior",
- ]
- externs_list = [
- "$externs_path/bluetooth.js",
- "$externs_path/bluetooth_private.js",
- ]
- extra_sources = [
- "$interfaces_path/bluetooth_interface.js",
- "$interfaces_path/bluetooth_private_interface.js",
- ]
-}
-
group("polymer3_elements") {
public_deps = [
+ "bluetooth:polymer3_elements",
"network:polymer3_elements",
+ "network_health:polymer3_elements",
"quick_unlock:polymer3_elements",
"smb_shares:polymer3_elements",
]
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/BUILD.gn b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/BUILD.gn
new file mode 100644
index 00000000000..16484cc89e9
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/BUILD.gn
@@ -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.
+
+import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/polymer/polymer.gni")
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+assert(is_chromeos, "Bluetooth dialog is Chrome OS only.")
+
+js_type_check("closure_compile") {
+ deps = [ ":bluetooth_dialog" ]
+}
+
+js_library("bluetooth_dialog") {
+ deps = [
+ "//third_party/polymer/v1_0/components-chromium/iron-resizable-behavior:iron-resizable-behavior-extracted",
+ "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input",
+ "//ui/webui/resources/js:assert",
+ "//ui/webui/resources/js:cr",
+ "//ui/webui/resources/js:i18n_behavior",
+ ]
+ externs_list = chrome_extension_public_externs + [
+ "$externs_path/bluetooth.js",
+ "$externs_path/bluetooth_private.js",
+ ]
+ extra_sources = [
+ "$interfaces_path/bluetooth_interface.js",
+ "$interfaces_path/bluetooth_private_interface.js",
+ ]
+}
+
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ deps = [ ":bluetooth_dialog.m" ]
+}
+
+js_library("bluetooth_dialog.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_dialog.m.js" ]
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:i18n_behavior.m",
+ ]
+ externs_list = chrome_extension_public_externs + [
+ "$externs_path/bluetooth.js",
+ "$externs_path/bluetooth_private.js",
+ ]
+ extra_sources = [
+ "$interfaces_path/bluetooth_interface.js",
+ "$interfaces_path/bluetooth_private_interface.js",
+ ]
+ extra_deps = [ ":bluetooth_dialog_module" ]
+}
+
+polymer_modulizer("bluetooth_dialog") {
+ js_file = "bluetooth_dialog.js"
+ html_file = "bluetooth_dialog.html"
+ html_type = "dom-module"
+ auto_imports = [ "ui/webui/resources/html/assert.html|assert" ]
+}
+
+group("polymer3_elements") {
+ public_deps = [ ":bluetooth_dialog_module" ]
+}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth_dialog.html b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_dialog.html
index eb16143ad6e..1fa6b160301 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth_dialog.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_dialog.html
@@ -1,11 +1,12 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
-<link rel="import" href="chrome://resources/cr_elements/hidden_style_css.html">
-<link rel="import" href="chrome://resources/html/cr.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="../../../cr_elements/cr_button/cr_button.html">
+<link rel="import" href="../../../cr_elements/cr_dialog/cr_dialog.html">
+<link rel="import" href="../../../cr_elements/cr_input/cr_input.html">
+<link rel="import" href="../../../cr_elements/hidden_style_css.html">
+<link rel="import" href="../../../html/cr.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
+<link rel="import" href="../../../html/assert.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">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth_dialog.js b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_dialog.js
index 64e983b7816..64e983b7816 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth_dialog.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_dialog.js
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/base_page.html b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/base_page.html
index 410c979129d..a8785a97ddb 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/base_page.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/base_page.html
@@ -1,6 +1,6 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
+<link rel="import" href="../../../cr_elements/shared_vars_css.html">
<dom-module id="base-page">
<template>
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 366552c5eaa..06367467b90 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
@@ -1,9 +1,9 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
+<link rel="import" href="../../../cr_elements/cr_button/cr_button.html">
+<link rel="import" href="../../../cr_elements/shared_style_css.html">
+<link rel="import" href="../../../cr_elements/shared_vars_css.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout.html">
<dom-module id="button-bar">
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 7215cefcb97..31727da02b2 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
@@ -1,11 +1,11 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/cellular_setup/button_bar.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/cellular_setup/sim_detect_page.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/cellular_setup/provisioning_page.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/cellular_setup/final_page.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
+<link rel="import" href="mojo_interface_provider.html">
+<link rel="import" href="button_bar.html">
+<link rel="import" href="sim_detect_page.html">
+<link rel="import" href="provisioning_page.html">
+<link rel="import" href="final_page.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout.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-pages/iron-pages.html">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/final_page.html b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/final_page.html
index 63ed4e450d1..0f733f1c174 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/final_page.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/final_page.html
@@ -1,7 +1,7 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/cellular_setup/base_page.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
+<link rel="import" href="base_page.html">
<dom-module id="final-page">
<template>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.html b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.html
index 115d282b2a6..b7096a0baf6 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.html
@@ -1,4 +1,4 @@
-<link rel="import" href="chrome://resources/html/cr.html">
+<link rel="import" href="../../../html/cr.html">
<link rel="import" href="chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.html">
<link rel="import" href="chrome://resources/mojo/chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.html">
<script src="mojo_interface_provider.js"></script>
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 43e2dcb035f..2bde376730c 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
@@ -1,9 +1,9 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/cellular_setup/base_page.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/cellular_setup/webview_post_util.html">
-<link rel="import" href="chrome://resources/cr_elements/hidden_style_css.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
+<link rel="import" href="base_page.html">
+<link rel="import" href="webview_post_util.html">
+<link rel="import" href="../../../cr_elements/hidden_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/paper-spinner/paper-spinner-lite.html">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/sim_detect_page.html b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/sim_detect_page.html
index ec6ef312ee4..8efc04545bd 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/sim_detect_page.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/sim_detect_page.html
@@ -1,8 +1,8 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/cellular_setup/base_page.html">
-<link rel="import" href="chrome://resources/cr_elements/hidden_style_css.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
+<link rel="import" href="base_page.html">
+<link rel="import" href="../../../cr_elements/hidden_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/paper-spinner/paper-spinner-lite.html">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/BUILD.gn b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/BUILD.gn
index de6c651e0e0..63fd8b30f9d 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/BUILD.gn
@@ -67,7 +67,8 @@ js_library("password_page") {
"//ui/webui/resources/cr_elements/cr_input:cr_input",
"//ui/webui/resources/js:cr",
]
- externs_list = [ "$externs_path/quick_unlock_private.js" ]
+ externs_list = chrome_extension_public_externs +
+ [ "$externs_path/quick_unlock_private.js" ]
extra_sources = [ "$interfaces_path/quick_unlock_private_interface.js" ]
}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/button_bar.html b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/button_bar.html
index ba3ac45f532..b448b290e00 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/button_bar.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/button_bar.html
@@ -1,6 +1,6 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html">
+<link rel="import" href="multidevice_setup_shared_css.html">
<dom-module id="button-bar">
<template>
@@ -47,6 +47,6 @@
</div>
</div>
</template>
- <script src="chrome://resources/cr_components/chromeos/multidevice_setup/button_bar.js">
+ <script src="button_bar.js">
</script>
</dom-module>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/fake_mojo_service.html b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/fake_mojo_service.html
index 12556f5782b..a2c17b6179d 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/fake_mojo_service.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/fake_mojo_service.html
@@ -1,4 +1,4 @@
-<link rel="import" href="chrome://resources/html/cr.html">
+<link rel="import" href="../../../html/cr.html">
-<script src="chrome://resources/cr_components/chromeos/multidevice_setup/fake_mojo_service.js">
+<script src="fake_mojo_service.js">
</script>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/icons.html b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/icons.html
index 0232cf476e4..2eee1473ba5 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/icons.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/icons.html
@@ -1,4 +1,4 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-iconset-svg/iron-iconset-svg.html">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/mojo_api.html b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/mojo_api.html
index 2f44ddb6b3a..dc3ddbbd31b 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/mojo_api.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/mojo_api.html
@@ -1,4 +1,4 @@
-<link rel="import" href="chrome://resources/html/cr.html">
+<link rel="import" href="../../../html/cr.html">
<link rel="import" href="chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.html">
<link rel="import" href="chrome://resources/mojo/chromeos/services/multidevice_setup/public/mojom/multidevice_setup.mojom.html">
-<script src="mojo_api.js"></script> \ No newline at end of file
+<script src="mojo_api.js"></script>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html
index 978dc71e9a5..6e61d099146 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html
@@ -1,15 +1,15 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/button_bar.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/fake_mojo_service.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/mojo_api.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup_delegate.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/password_page.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/start_setup_page.html">
-<link rel="import" href="chrome://resources/html/cr.html">
-<link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
+<link rel="import" href="button_bar.html">
+<link rel="import" href="fake_mojo_service.html">
+<link rel="import" href="mojo_api.html">
+<link rel="import" href="multidevice_setup_delegate.html">
+<link rel="import" href="multidevice_setup_shared_css.html">
+<link rel="import" href="password_page.html">
+<link rel="import" href="setup_succeeded_page.html">
+<link rel="import" href="start_setup_page.html">
+<link rel="import" href="../../../html/cr.html">
+<link rel="import" href="../../../html/web_ui_listener_behavior.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-pages/iron-pages.html">
<dom-module id="multidevice-setup">
@@ -105,6 +105,6 @@
</button-bar>
</div>
</template>
- <script src="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js">
+ <script src="multidevice_setup.js">
</script>
</dom-module>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_browser_proxy.html b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_browser_proxy.html
index 82f8d961c25..38c23fdedf0 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_browser_proxy.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_browser_proxy.html
@@ -1,3 +1,3 @@
-<link rel="import" href="chrome://resources/html/cr.html">
-<script src="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup_browser_proxy.js">
+<link rel="import" href="../../../html/cr.html">
+<script src="multidevice_setup_browser_proxy.js">
</script>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_delegate.html b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_delegate.html
index 46ce0b9a518..22e3eb30088 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_delegate.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_delegate.html
@@ -1,4 +1,4 @@
-<link rel="import" href="chrome://resources/html/cr.html">
-<script src="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup_delegate.js">
+<link rel="import" href="../../../html/cr.html">
+<script src="multidevice_setup_delegate.js">
</script>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html
index 3d4bb236c75..3d26c8bddd2 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html
@@ -1,8 +1,8 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
-<link rel="import" href="chrome://resources/cr_elements/md_select_css.html">
+<link rel="import" href="../../../cr_elements/shared_style_css.html">
+<link rel="import" href="../../../cr_elements/shared_vars_css.html">
+<link rel="import" href="../../../cr_elements/md_select_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-flex-layout/iron-flex-layout.html">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.html b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.html
index 454df4da397..1d1b634c8f8 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.html
@@ -1,10 +1,10 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/ui_page.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/ui_page_container_behavior.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
-<link rel="import" href="chrome://resources/html/cr.html">
+<link rel="import" href="multidevice_setup_shared_css.html">
+<link rel="import" href="ui_page.html">
+<link rel="import" href="ui_page_container_behavior.html">
+<link rel="import" href="../../../cr_elements/cr_input/cr_input.html">
+<link rel="import" href="../../../html/cr.html">
<dom-module id="password-page">
<template>
@@ -46,6 +46,6 @@
</div>
</ui-page>
</template>
- <script src="chrome://resources/cr_components/chromeos/multidevice_setup/password_page.js">
+ <script src="password_page.js">
</script>
</dom-module>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.html b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.html
index c33ae7b1314..fefc1dc6e55 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.html
@@ -1,10 +1,10 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup_browser_proxy.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/ui_page.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/ui_page_container_behavior.html">
-<link rel="import" href="chrome://resources/html/cr.html">
+<link rel="import" href="multidevice_setup_browser_proxy.html">
+<link rel="import" href="multidevice_setup_shared_css.html">
+<link rel="import" href="ui_page.html">
+<link rel="import" href="ui_page_container_behavior.html">
+<link rel="import" href="../../../html/cr.html">
<dom-module id="setup-succeeded-page">
<template>
@@ -31,6 +31,6 @@
</div>
</ui-page>
</template>
- <script src="chrome://resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.js">
+ <script src="setup_succeeded_page.js">
</script>
</dom-module>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.js b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.js
index ebc520fb3fb..b01d0553523 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.js
@@ -36,10 +36,7 @@ Polymer({
/** @private */
getMessageHtml_() {
- const validNodeFn = (node, value) => node.tagName === 'A';
- return this.i18nAdvanced(
- 'setupSucceededPageMessage',
- {attrs: {'id': validNodeFn, 'href': validNodeFn}});
+ return this.i18nAdvanced('setupSucceededPageMessage', {attrs: ['id']});
},
/** @override */
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/start_setup_page.html b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/start_setup_page.html
index 2ade2d97506..d5de70f7d2f 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/start_setup_page.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/start_setup_page.html
@@ -1,11 +1,11 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
-
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/icons.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/ui_page.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/ui_page_container_behavior.html">
-<link rel="import" href="chrome://resources/html/cr.html">
-<link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
+<link rel="import" href="../../../html/polymer.html">
+
+<link rel="import" href="icons.html">
+<link rel="import" href="multidevice_setup_shared_css.html">
+<link rel="import" href="ui_page.html">
+<link rel="import" href="ui_page_container_behavior.html">
+<link rel="import" href="../../../html/cr.html">
+<link rel="import" href="../../../html/web_ui_listener_behavior.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
<dom-module id="start-setup-page">
@@ -171,6 +171,6 @@
</div>
</ui-page>
</template>
- <script src="chrome://resources/cr_components/chromeos/multidevice_setup/start_setup_page.js">
+ <script src="start_setup_page.js">
</script>
</dom-module>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/ui_page.html b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/ui_page.html
index 289e08644b8..1bdfe7b6e32 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/ui_page.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/ui_page.html
@@ -1,8 +1,8 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/icons.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html">
+<link rel="import" href="icons.html">
+<link rel="import" href="multidevice_setup_shared_css.html">
<dom-module id="ui-page">
<template>
@@ -37,6 +37,6 @@
<slot name="additional-content"></slot>
</div>
</template>
- <script src="chrome://resources/cr_components/chromeos/multidevice_setup/ui_page.js">
+ <script src="ui_page.js">
</script>
</dom-module>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/ui_page_container_behavior.html b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/ui_page_container_behavior.html
index 501cc374471..3485a99540e 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/ui_page_container_behavior.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/ui_page_container_behavior.html
@@ -1,5 +1,5 @@
-<link rel="import" href="chrome://resources/html/cr.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="../../../html/cr.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
-<script src="chrome://resources/cr_components/chromeos/multidevice_setup/ui_page_container_behavior.js">
+<script src="ui_page_container_behavior.js">
</script>
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 6e1c7b28780..ca7f9fc53fc 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
@@ -63,7 +63,8 @@ js_library("network_config") {
"//ui/webui/resources/js:assert",
"//ui/webui/resources/js:i18n_behavior",
]
- externs_list = [ "$externs_path/networking_private.js" ]
+ externs_list = chrome_extension_public_externs +
+ [ "$externs_path/networking_private.js" ]
extra_sources = [ "$interfaces_path/networking_private_interface.js" ]
}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_0.svg b/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_0.svg
index ed3c8cc4b3b..a921d4bec9b 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_0.svg
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_0.svg
@@ -1,3 +1,3 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px">
- <path fill-opacity=".3" d="M2 18h16V2"/>
+<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M15.002 15.002V7.41622L7.41622 15.002H15.002ZM16.002 17.002C16.5543 17.002 17.002 16.5543 17.002 16.002V5.002C17.002 4.1111 15.9249 3.66493 15.2949 4.2949L4.2949 15.2949C3.66493 15.9249 4.1111 17.002 5.002 17.002H16.002Z" />
</svg>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_0_with_x.svg b/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_0_with_x.svg
index 6065be32a92..39e42cfbccb 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_0_with_x.svg
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_0_with_x.svg
@@ -1,6 +1,4 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
- <g fill="none" transform="translate(2 2)">
- <polygon fill="#000" fill-opacity=".3" points="0 17 17 17 17 0"/>
- <polygon fill="#B2B2B2" points="5.917 .671 5.329 .083 3 2.413 .671 .083 .083 .671 2.413 3 .083 5.329 .671 5.917 3 3.587 5.329 5.917 5.917 5.329 3.587 3"/>
- </g>
+<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M15.002 15.002V7.41622L7.41622 15.002H15.002ZM16.002 17.002C16.5543 17.002 17.002 16.5543 17.002 16.002V5.002C17.002 4.1111 15.9249 3.66493 15.2949 4.2949L4.2949 15.2949C3.66493 15.9249 4.1111 17.002 5.002 17.002H16.002Z" />
+<path fill-rule="evenodd" clip-rule="evenodd" d="M6.66667 6L8 4.66667L7.33333 4L6 5.33333L4.66667 4L4 4.66667L5.33333 6L4 7.33333L4.66667 8L6 6.66667L7.33333 8L8 7.33333L6.66667 6Z"/>
</svg>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_1.svg b/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_1.svg
index d3cd34e9263..66d98d2f9aa 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_1.svg
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_1.svg
@@ -1,4 +1,4 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px">
- <path fill-opacity=".3" d="M2.094 18H18V1.984"/>
- <path d="M8 12l-6 6h6"/>
+<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M15.002 15.002V7.41622L7.41622 15.002H15.002ZM16.002 17.002C16.5543 17.002 17.002 16.5543 17.002 16.002V5.002C17.002 4.1111 15.9249 3.66493 15.2949 4.2949L4.2949 15.2949C3.66493 15.9249 4.1111 17.002 5.002 17.002H16.002Z" />
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.002 16.002C9.002 16.5543 8.55429 17.002 8.002 17.002H5.002C4.1111 17.002 3.66493 15.9249 4.2949 15.2949L7.2949 12.2949C7.92486 11.6649 9.002 12.1111 9.002 13.002V16.002Z" />
</svg>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_2.svg b/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_2.svg
index 956dbc3ede1..9066c2192a4 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_2.svg
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_2.svg
@@ -1,4 +1,4 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px">
- <path fill-opacity=".3" d="M2 18h16V2"/>
- <path d="M11.003 9L1 18h10.003"/>
+<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M15.002 15.002V7.41622L7.41622 15.002H15.002ZM16.002 17.002C16.5543 17.002 17.002 16.5543 17.002 16.002V5.002C17.002 4.1111 15.9249 3.66493 15.2949 4.2949L4.2949 15.2949C3.66493 15.9249 4.1111 17.002 5.002 17.002H16.002Z" />
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.002 16.002C12.002 16.5543 11.5543 17.002 11.002 17.002H5.002C4.1111 17.002 3.66493 15.9249 4.2949 15.2949L10.2949 9.2949C10.9249 8.66493 12.002 9.1111 12.002 10.002V16.002Z" />
</svg>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_3.svg b/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_3.svg
index aa11564d454..a3cd603aa44 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_3.svg
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_3.svg
@@ -1,4 +1,4 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px">
- <path fill-opacity=".3" d="M2 18h16.02V2"/>
- <path d="M14 6L2 18h12"/>
+<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M15.002 15.002V7.41622L7.41622 15.002H15.002ZM16.002 17.002C16.5543 17.002 17.002 16.5543 17.002 16.002V5.002C17.002 4.1111 15.9249 3.66493 15.2949 4.2949L4.2949 15.2949C3.66493 15.9249 4.1111 17.002 5.002 17.002H16.002Z" />
+<path fill-rule="evenodd" clip-rule="evenodd" d="M13.5 16.002C13.5 16.5543 13.0523 17.002 12.5 17.002H5.002C4.1111 17.002 3.66493 15.9249 4.2949 15.2949L11.7929 7.79289C12.4229 7.16293 13.5 7.6091 13.5 8.5V16.002Z" />
</svg>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_4.svg b/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_4.svg
index 8e438886fba..2be87e0464c 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_4.svg
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_4.svg
@@ -1,3 +1,3 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px">
- <path d="M2 18h16V2"/>
+<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M17.002 16.002C17.002 16.5543 16.5543 17.002 16.002 17.002H5.002C4.1111 17.002 3.66493 15.9249 4.2949 15.2949L15.2949 4.2949C15.9249 3.66493 17.002 4.1111 17.002 5.002V16.002Z" />
</svg>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_off.svg b/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_off.svg
index 7bf72adefcf..4d72a7c3c54 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_off.svg
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_off.svg
@@ -1,3 +1,3 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px">
- <path d="M18,1 L10.78,8.02818182 L18,15.0563636 L18,1 Z M4.23142857,3.86363636 L3.14285714,4.90272727 L8.59428571,10.1063636 L0.999023438,17.0039062 L16,17.0039062 L17.9114286,19 L19,17.9609091 L4.23142857,3.86363636 Z"/>
+<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M17 16C17 16.5523 16.5523 17 16 17H4.99999C4.10909 17 3.66292 15.9228 4.29288 15.2929L15.2929 4.29288C15.9228 3.66292 17 4.10909 17 4.99999V16ZM15 15V7.41418L7.41418 15H15Z"/>
</svg>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/ethernet.svg b/chromium/ui/webui/resources/cr_components/chromeos/network/ethernet.svg
index c7cfb72c2de..6c0c5f9ab0b 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/ethernet.svg
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/ethernet.svg
@@ -1,3 +1,5 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px">
- <path d="M6.015 6L2 10.5 6.015 15 7 14.227 3.663 10.5 7 6.773 6.015 6zM7 11h1v-1H7v1zm5-1h-1v1h1v-1zm-3 1h1v-1H9v1zm3-4.227l3.337 3.727L12 14.227l.985.773L17 10.5 12.985 6 12 6.773z"/>
+<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
+<g id="ethernet">
+<path id="Shape 1" fill-rule="evenodd" clip-rule="evenodd" d="M14.0909 5L12.9373 6.175L16.6845 10L12.9373 13.825L14.0909 15L19 10L14.0909 5ZM7.06273 6.175L5.90909 5L1 10L5.90909 15L7.06273 13.825L3.31545 10L7.06273 6.175ZM7.05457 11C7.59682 11 8.03639 10.5523 8.03639 10C8.03639 9.44772 7.59682 9 7.05457 9C6.51233 9 6.07275 9.44772 6.07275 10C6.07275 10.5523 6.51233 11 7.05457 11ZM10 11C10.5422 11 10.9818 10.5523 10.9818 10C10.9818 9.44772 10.5422 9 10 9C9.45776 9 9.01819 9.44772 9.01819 10C9.01819 10.5523 9.45776 11 10 11ZM12.9454 11C13.4877 11 13.9273 10.5523 13.9273 10C13.9273 9.44772 13.4877 9 12.9454 9C12.4032 9 11.9636 9.44772 11.9636 10C11.9636 10.5523 12.4032 11 12.9454 11Z" />
+</g>
</svg>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/mojo_interface_provider.html b/chromium/ui/webui/resources/cr_components/chromeos/network/mojo_interface_provider.html
index 91b5cb8df3e..7eaa61575ef 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/mojo_interface_provider.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/mojo_interface_provider.html
@@ -1,4 +1,4 @@
-<link rel="import" href="chrome://resources/html/cr.html">
+<link rel="import" href="../../../html/cr.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_config/public/mojom/cros_network_config.mojom.html">
<script src="mojo_interface_provider.js"></script>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_apnlist.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_apnlist.html
index 7c92d24747a..e12cc9d632c 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_apnlist.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_apnlist.html
@@ -1,8 +1,8 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
-<link rel="import" href="chrome://resources/cr_elements/md_select_css.html">
+<link rel="import" href="../../../cr_elements/cr_button/cr_button.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
+<link rel="import" href="../../../cr_elements/md_select_css.html">
<link rel="import" href="network_property_list_mojo.html">
<link rel="import" href="network_shared_css.html">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.html
index e2c96a75082..511fbabd0b5 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.html
@@ -1,9 +1,9 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
-<link rel="import" href="chrome://resources/cr_elements/md_select_css.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html">
+<link rel="import" href="../../../cr_elements/cr_button/cr_button.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
+<link rel="import" href="../../../cr_elements/md_select_css.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="network_shared_css.html">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config.html
index 9e80c52db89..a01762f6acb 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config.html
@@ -1,13 +1,13 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/network/mojo_interface_provider.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/network/network_listener_behavior.html">
-<link rel="import" href="chrome://resources/cr_elements/action_link_css.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_indicator.html">
-<link rel="import" href="chrome://resources/html/action_link.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="mojo_interface_provider.html">
+<link rel="import" href="network_listener_behavior.html">
+<link rel="import" href="../../../cr_elements/action_link_css.html">
+<link rel="import" href="../../../cr_elements/cr_dialog/cr_dialog.html">
+<link rel="import" href="../../../cr_elements/cr_toggle/cr_toggle.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_indicator.html">
+<link rel="import" href="../../../html/action_link.html">
+<link rel="import" href="../../../html/i18n_behavior.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-icon/iron-icon.html">
<link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner-lite.html">
@@ -185,16 +185,11 @@
<!-- Share (WiFi) -->
<template is="dom-if" if="[[shareIsVisible_(managedProperties_)]]"
restamp>
- <div class="property-box">
- <div id="shareLabel" class="start">
- [[i18n('networkConfigShare')]]
- </div>
- <cr-toggle id="share" checked="{{shareNetwork_}}"
- disabled="[[!shareIsEnabled_(configProperties_.*,
- eapProperties_.*, shareAllowEnable)]]"
- aria-labeledby="shareLabel" on-change="onShareChanged_">
- </cr-toggle>
- </div>
+ <network-config-toggle id="share" label="[[i18n('networkConfigShare')]]"
+ checked="{{shareNetwork_}}" on-change="onShareChanged_"
+ disabled="[[!shareIsEnabled_(configProperties_.*,
+ eapProperties_.*, shareAllowEnable)]]">
+ </network-config-toggle>
</template>
<!-- AutoConnect (WiFi) -->
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_element_behavior.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_element_behavior.js
index bda8a2be931..c341b01eba1 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_element_behavior.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_element_behavior.js
@@ -29,7 +29,7 @@ const NetworkConfigElementBehavior = {
* @param {boolean} disabled
* @param {?OncMojo.ManagedProperty} property
* @return {boolean} True if the element should be disabled.
- * @private
+ * @protected
*/
getDisabled_(disabled, property) {
return disabled || (!!property && this.isNetworkPolicyEnforced(property));
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_input.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_input.html
index fa2acddae31..9e57d8efd1b 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_input.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_input.html
@@ -1,9 +1,9 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior_mojo.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_indicator_mojo.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
+<link rel="import" href="../../../cr_elements/cr_input/cr_input.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_network_behavior_mojo.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_network_indicator_mojo.html">
+<link rel="import" href="../../../cr_elements/shared_vars_css.html">
<link rel="import" href="network_config_element_behavior.html">
<link rel="import" href="network_shared_css.html">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_select.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_select.html
index 582f7535921..8220cc12d82 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_select.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_select.html
@@ -1,11 +1,11 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior_mojo.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_indicator_mojo.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_tooltip_icon.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html">
-<link rel="import" href="chrome://resources/cr_elements/md_select_css.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_network_behavior_mojo.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_network_indicator_mojo.html">
+<link rel="import" href="../../../cr_elements/policy/cr_tooltip_icon.html">
+<link rel="import" href="../../../cr_elements/shared_vars_css.html">
+<link rel="import" href="../../../cr_elements/shared_style_css.html">
+<link rel="import" href="../../../cr_elements/md_select_css.html">
<link rel="import" href="network_config_element_behavior.html">
<link rel="import" href="network_shared_css.html">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_toggle.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_toggle.html
index c6ba0583b30..1036dedc58f 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_toggle.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_toggle.html
@@ -1,9 +1,9 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior_mojo.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_indicator_mojo.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
+<link rel="import" href="../../../cr_elements/cr_toggle/cr_toggle.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_network_behavior_mojo.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_network_indicator_mojo.html">
+<link rel="import" href="../../../cr_elements/shared_vars_css.html">
<link rel="import" href="network_config_element_behavior.html">
<link rel="import" href="network_shared_css.html">
@@ -13,9 +13,12 @@
cr-policy-network-indicator-mojo {
--cr-tooltip-icon-margin-start: var(--cr-controlled-by-spacing);
}
+ div.property-box {
+ width: 100%;
+ }
</style>
- <div class="property-box">
+ <div class="property-box" actionable>
<div class="start">
[[label]]
</div>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_toggle.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_toggle.js
index fe499a4889e..fe2e459cf37 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_toggle.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_toggle.js
@@ -23,4 +23,23 @@ Polymer({
notify: true,
},
},
+
+ listeners: {
+ 'click': 'onHostTap_',
+ },
+
+ /**
+ * Handles non cr-toggle button clicks (cr-toggle handles its own click events
+ * which don't bubble).
+ * @param {!Event} e
+ * @private
+ */
+ onHostTap_(e) {
+ e.stopPropagation();
+ if (this.getDisabled_(this.disabled, this.property)) {
+ return;
+ }
+ this.checked = !this.checked;
+ this.fire('change');
+ },
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_icon.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_icon.html
index 7a59d961faf..ca1475871b4 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_icon.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_icon.html
@@ -1,9 +1,9 @@
<link rel="import" href="../../../html/polymer.html">
<link rel="import" href="../../chromeos/network/network_icons.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/network/onc_mojo.html">
-<link rel="import" href="chrome://resources/cr_elements/hidden_style_css.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="onc_mojo.html">
+<link rel="import" href="../../../cr_elements/hidden_style_css.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
<dom-module id="network-icon">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_icons.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_icons.html
index df5f47ce156..8c611738430 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_icons.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_icons.html
@@ -8,16 +8,16 @@
<svg>
<defs>
<!-- Badges -->
- <g id="badge-1x"><path d="M0 1h1V0h1v5H1V2H0M3 2h1v1H3V2zm1 1h1v1H4V3zM3 4h1v1H3V4zm2 0h1v1H5V4zm0-2h1v1H5V2z"></path></g>
- <g id="badge-3g"><path d="M9 0H5v5h4V2H7v1h1v1H6V1h3M3 3v2h1V0H0v1h3v1H1v1h2zM0 4h3v1H0V4z"></path></g>
- <g id="badge-4g"><path d="M3 4v1h1V0H3v3H0v1h3zM0 2h1v1H0V2zm1-1h1v1H1V1zm1-1h1v1H2V0zM9 0H5v5h4V2H7v1h1v1H6V1h3"></path></g>
- <g id="badge-edge"><path d="M0 0v5h3V4H1V3h1V2H1V1h2V0"></path></g>
- <g id="badge-evdo"><path d="M0 0v5h3V4H1V3h1V2H1V1h2V0M4 0h1v2H4V0zm1 2h1v2H5V2zm2 0h1v2H7V2zm1-2h1v2H8V0zM6 4h1v1H6V4z"></path></g>
- <g id="badge-gsm"><path d="M4 0H0v5h4V2H2v1h1v1H1V1h3"></path></g>
- <g id="badge-hspa"><path d="M0 0h1v2h2V0h1v5H3V3H1v2H0"></path></g>
- <g id="badge-hspa-plus"><path d="M0 0h1v2h2V0h1v5H3V3H1v2H0M7 1V0H6v1H5v1h1v1h1V2h1V1H7z"></path></g>
- <g id="badge-lte"><path d="M0 0v5h3V4H1V0M3 0h5v1H6v4H5V1H3M9 0v5h3V4h-2V3h1V2h-1V1h2V0"></path></g>
- <g id="badge-lte-advanced"><path d="M0 0v5h3V4H1V0M3 0h5v1H6v4H5V1H3M9 0v5h3V4h-2V3h1V2h-1V1h2V0M15 1V0h-1v1h-1v1h1v1h1V2h1V1h-1z"></path></g>
+ <g id="badge-1x"><path d="M3.46612 7H4.45996V1H4.33265L2 1.85832V2.70021L3.46612 2.19918V7ZM9.04312 2.55647L8.19713 4.01848L7.36756 2.55647H6.26694L7.62218 4.74538L6.21766 7H7.32649L8.20945 5.48049L9.09651 7H10.1971L8.79261 4.74538L10.152 2.55647H9.04312Z" fill="#5F6368"></path></g>
+ <g id="badge-3g"><path d="M3.34091 3.55481H2.74733V4.32487H3.32086C3.67915 4.32487 3.9492 4.40775 4.13102 4.57353C4.31284 4.73931 4.40374 4.97593 4.40374 5.28342C4.40374 5.58824 4.31685 5.82085 4.14305 5.98128C3.96925 6.14171 3.73128 6.22193 3.42914 6.22193C3.1377 6.22193 2.90575 6.14171 2.73329 5.98128C2.56083 5.82085 2.4746 5.6123 2.4746 5.35561H1.5C1.5 5.85294 1.67914 6.25134 2.03743 6.5508C2.39572 6.85027 2.85561 7 3.41711 7C4.00268 7 4.47527 6.84492 4.83489 6.53476C5.19452 6.2246 5.37433 5.80749 5.37433 5.28342C5.37433 4.95722 5.29078 4.67647 5.12366 4.44118C4.95655 4.20588 4.71257 4.03342 4.39171 3.9238C4.65642 3.80615 4.87233 3.63169 5.03944 3.4004C5.20655 3.16912 5.29011 2.92246 5.29011 2.66043C5.29011 2.13903 5.12366 1.73195 4.79078 1.43917C4.45789 1.14639 4 1 3.41711 1C3.06417 1 2.74532 1.06885 2.46056 1.20655C2.1758 1.34425 1.95388 1.5361 1.79479 1.78209C1.63569 2.02808 1.55615 2.3008 1.55615 2.60027H2.53075C2.53075 2.35695 2.61497 2.15976 2.78342 2.00869C2.95187 1.85762 3.16711 1.78209 3.42914 1.78209C3.72861 1.78209 3.9512 1.85896 4.09692 2.0127C4.24265 2.16644 4.31551 2.38235 4.31551 2.66043C4.31551 2.9492 4.22794 3.16979 4.05281 3.32219C3.87767 3.4746 3.64038 3.55214 3.34091 3.55481ZM10.0428 6.78743C10.4171 6.64572 10.7099 6.43717 10.9211 6.16176V3.9238H8.70722V4.69385H9.91043V5.8369C9.69117 6.07219 9.32219 6.18984 8.80348 6.18984C8.33021 6.18984 7.96056 6.01538 7.69452 5.66644C7.42847 5.31751 7.29545 4.82754 7.29545 4.19652V3.74733C7.30348 3.11363 7.4258 2.63302 7.66243 2.30548C7.89907 1.97794 8.24465 1.81417 8.6992 1.81417C9.40241 1.81417 9.81016 2.16577 9.92246 2.86898H10.9171C10.8396 2.2647 10.6096 1.80214 10.2273 1.48128C9.84492 1.16043 9.32888 1 8.67914 1C7.92246 1 7.33289 1.24799 6.91043 1.74398C6.48797 2.23998 6.27674 2.92914 6.27674 3.8115V4.26872C6.28476 4.81952 6.39104 5.30147 6.59559 5.71457C6.80013 6.12768 7.09091 6.44519 7.46791 6.66711C7.84492 6.88904 8.27807 7 8.76738 7C9.24332 7 9.66845 6.92914 10.0428 6.78743Z"></path></g>
+ <g id="badge-4g"><path d="M8.78743 1C8.03074 1 7.44118 1.24799 7.01872 1.74398C6.59625 2.23998 6.38503 2.92914 6.38503 3.8115V4.26872C6.39305 4.81952 6.49933 5.30147 6.70388 5.71457C6.90842 6.12768 7.1992 6.44519 7.5762 6.66711C7.95321 6.88904 8.38636 7 8.87567 7C9.35161 7 9.77674 6.92915 10.1511 6.78743C10.5254 6.64572 10.8182 6.43717 11.0294 6.16176V3.9238H8.81551V4.69385H10.0187V5.8369C9.79946 6.07219 9.43048 6.18984 8.91176 6.18984C8.4385 6.18984 8.06885 6.01538 7.80281 5.66644C7.53676 5.31751 7.40374 4.82754 7.40374 4.19652V3.74733C7.41176 3.11363 7.53409 2.63302 7.77072 2.30548C8.00735 1.97794 8.35294 1.81417 8.80749 1.81417C9.5107 1.81417 9.91845 2.16577 10.0307 2.86898H11.0254C10.9479 2.2647 10.7179 1.80214 10.3356 1.48128C9.95321 1.16043 9.43717 1 8.78743 1ZM5.0254 1.08021H4.01872L1.5 5.02674L1.52807 5.62032H4.0508V6.91979H5.0254V5.62032H5.75134V4.83824H5.0254V1.08021ZM4.0508 2.39973V4.83824H2.52273L3.97861 2.52807L4.0508 2.39973Z"></path></g>
+ <g id="badge-edge"><path d="M3.04258 4.32143H5.50687V3.49725H3.04258V1.84066H5.89423V1H2V7H5.92308V6.16758H3.04258V4.32143Z"></path></g>
+ <g id="badge-evdo"><path d="M2.54258 4.32143H5.00687V3.49725H2.54258V1.84066H5.39423V1H1.5V7H5.42308V6.16758H2.54258V4.32143ZM9.91071 1L8.38599 5.69368L6.87775 1H5.73626L7.88736 7H8.89698L11.0563 1H9.91071Z"></path></g>
+ <g id="badge-gsm"><path d="M5.54012 6.78743C5.91445 6.64572 6.20723 6.43717 6.41846 6.16176V3.9238H4.20456V4.69385H5.40777V5.8369C5.18852 6.07219 4.81954 6.18984 4.30082 6.18984C3.82755 6.18984 3.4579 6.01538 3.19186 5.66644C2.92582 5.31751 2.79279 4.82754 2.79279 4.19652V3.74733C2.80082 3.11363 2.92314 2.63302 3.15977 2.30548C3.39641 1.97794 3.74199 1.81417 4.19654 1.81417C4.89975 1.81417 5.3075 2.16577 5.4198 2.86898H6.41445C6.33691 2.2647 6.10697 1.80214 5.72461 1.48128C5.34226 1.16043 4.82622 1 4.17648 1C3.4198 1 2.83023 1.24799 2.40777 1.74398C1.98531 2.23998 1.77408 2.92914 1.77408 3.8115V4.26872C1.7821 4.81952 1.88838 5.30147 2.09293 5.71457C2.29748 6.12768 2.58825 6.44519 2.96525 6.66711C3.34226 6.88904 3.77541 7 4.26472 7C4.74066 7 5.16579 6.92914 5.54012 6.78743Z"></path></g>
+ <g id="badge-hspa"><path d="M5.22527 7H6.26374V1H5.22527V3.49725H2.54258V1H1.5V7H2.54258V4.33379H5.22527V7Z"></path></g>
+ <g id="badge-hspa-plus"><path d="M5.22527 7H6.26374V1H5.22527V3.49725H2.54258V1H1.5V7H2.54258V4.33379H5.22527V7ZM11.2788 3.69918H9.71291V2.03022H8.74038V3.69918H7.16621V4.61401H8.74038V6.39835H9.71291V4.61401H11.2788V3.69918Z"></path></g>
+ <g id="badge-lte"><path d="M5.76648 6.16758H3.04258V1H2V7H5.76648V6.16758ZM9.03022 1.84066H10.9011V1H6.14148V1.84066H7.99588V7H9.03022V1.84066ZM12.7308 4.32143H15.1951V3.49725H12.7308V1.84066H15.5824V1H11.6882V7H15.6113V6.16758H12.7308V4.32143Z"></path></g>
+ <g id="badge-lte-advanced"><path d="M5.76648 6.16758H3.04258V1H2V7H5.76648V6.16758ZM9.03022 1.84066H10.9011V1H6.14148V1.84066H7.99588V7H9.03022V1.84066ZM12.7308 4.32143H15.1951V3.49725H12.7308V1.84066H15.5824V1H11.6882V7H15.6113V6.16758H12.7308V4.32143ZM20.2431 3.69918H18.6772V2.03022H17.7047V3.69918H16.1305V4.61401H17.7047V6.39835H18.6772V4.61401H20.2431V3.69918Z"></path></g>
</defs>
</svg>
</iron-iconset-svg>
@@ -26,8 +26,7 @@
<svg>
<defs>
<g id="badge-secure" fill-rule="evenodd">
- <path d="M1 4c0-.552.45-1 .99-1h4.02c.546 0 .99.444.99 1v3c0 .552-.45 1-.99 1H1.99C1.445 8 1 7.556 1 7V4zm2.5 1h1v1h-1V5z"></path>
- <path d="M2 1h1v3H2V1zm3 0h1v3H5V1zm.5-1v1h-3V0h3z"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M2.25 3H2C1.44772 3 1 3.44772 1 4V7C1 7.55228 1.44772 8 2 8H6C6.55228 8 7 7.55228 7 7V4C7 3.44772 6.55228 3 6 3H5.75V2.25C5.75 1.2835 4.9665 0.5 4 0.5C3.0335 0.5 2.25 1.2835 2.25 2.25V3ZM3.25 3H4.75V2.25C4.75 1.83579 4.41421 1.5 4 1.5C3.58579 1.5 3.25 1.83579 3.25 2.25V3Z"></path>
</g>
</defs>
</svg>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.html
index b40f0e55b9f..a55a625f35a 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.html
@@ -1,9 +1,9 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_indicator.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior_mojo.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="../../../cr_elements/cr_toggle/cr_toggle.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_indicator.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_network_behavior_mojo.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
<link rel="import" href="network_property_list_mojo.html">
<link rel="import" href="network_shared_css.html">
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 6a5b872e991..a4732962b83 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,8 +1,8 @@
<link rel="import" href="../../../html/polymer.html">
<link rel="import" href="network_list_item.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_scrollable_behavior.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_style_css.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">
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 8dbece4d0fa..2fed17a7beb 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
@@ -95,7 +95,7 @@ Polymer({
return item.showBeforeNetworksList === true;
});
const afterNetworks = this.customItems.filter(function(item) {
- return item.showBeforeNetworksList === false;
+ return item.showBeforeNetworksList !== true;
});
this.listItems_ = beforeNetworks.concat(this.networks, afterNetworks);
this.restoreScroll(this.$.networkList);
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 78530b34ead..cab8b8eed10 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
@@ -1,14 +1,14 @@
<link rel="import" href="../../../html/polymer.html">
<link rel="import" href="network_icon.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/network/onc_mojo.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html">
-<link rel="import" href="chrome://resources/cr_elements/icons.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_indicator.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior_mojo.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_style_css.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="onc_mojo.html">
+<link rel="import" href="../../../cr_elements/cr_icon_button/cr_icon_button.html">
+<link rel="import" href="../../../cr_elements/icons.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_indicator.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_network_behavior_mojo.html">
+<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="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html">
<dom-module id="network-list-item">
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 d953a8d53a1..0c68cc71ce8 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
@@ -1,12 +1,12 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_radio_button/cr_radio_button.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_radio_group/cr_radio_group.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_indicator.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior_mojo.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
-<link rel="import" href="chrome://resources/cr_elements/md_select_css.html">
+<link rel="import" href="../../../cr_elements/cr_input/cr_input.html">
+<link rel="import" href="../../../cr_elements/cr_radio_button/cr_radio_button.html">
+<link rel="import" href="../../../cr_elements/cr_radio_group/cr_radio_group.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_indicator.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_network_behavior_mojo.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
+<link rel="import" href="../../../cr_elements/md_select_css.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html">
<link rel="import" href="network_shared_css.html">
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 3afeef1f513..66e8763a97d 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
@@ -1,11 +1,11 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_icons_css.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior_mojo.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_indicator_mojo.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="../../../html/polymer.html">
+<link rel="import" href="../../../cr_elements/cr_icon_button/cr_icon_button.html">
+<link rel="import" href="../../../cr_elements/cr_icons_css.html">
+<link rel="import" href="../../../cr_elements/cr_input/cr_input.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_network_behavior_mojo.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_network_indicator_mojo.html">
+<link rel="import" href="../../../cr_elements/shared_vars_css.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
<link rel="import" href="network_config_element_behavior.html">
<link rel="import" href="network_shared_css.html">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.html
index 06c91836a69..24c4de57996 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.html
@@ -1,10 +1,10 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior_mojo.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_indicator_mojo.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="../../../cr_elements/cr_input/cr_input.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_network_behavior_mojo.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_network_indicator_mojo.html">
+<link rel="import" href="../../../cr_elements/shared_style_css.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html">
<link rel="import" href="network_shared_css.html">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy.html
index f46687fd9ac..7df225d8a45 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy.html
@@ -1,13 +1,13 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
-<link rel="import" href="chrome://resources/cr_elements/hidden_style_css.html">
-<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior_mojo.html">
-<link rel="import" href="chrome://resources/html/assert.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
-<link rel="import" href="chrome://resources/cr_elements/md_select_css.html">
+<link rel="import" href="../../../cr_elements/cr_button/cr_button.html">
+<link rel="import" href="../../../cr_elements/cr_input/cr_input.html">
+<link rel="import" href="../../../cr_elements/cr_toggle/cr_toggle.html">
+<link rel="import" href="../../../cr_elements/hidden_style_css.html">
+<link rel="import" href="../../../cr_elements/policy/cr_policy_network_behavior_mojo.html">
+<link rel="import" href="../../../html/assert.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
+<link rel="import" href="../../../cr_elements/md_select_css.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html">
<link rel="import" href="network_proxy_exclusions.html">
<link rel="import" href="network_proxy_input.html">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_exclusions.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_exclusions.html
index 560812c1514..c9f00cb042d 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_exclusions.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_exclusions.html
@@ -1,9 +1,9 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html">
-<link rel="import" href="chrome://resources/cr_elements/hidden_style_css.html">
+<link rel="import" href="../../../cr_elements/cr_icon_button/cr_icon_button.html">
+<link rel="import" href="../../../cr_elements/hidden_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/html/i18n_behavior.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
<link rel="import" href="network_shared_css.html">
<dom-module id="network-proxy-exclusions">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_input.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_input.html
index 0df33a4b8ab..6e4dcff6a33 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_input.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_input.html
@@ -1,7 +1,7 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="../../../cr_elements/cr_input/cr_input.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
<link rel="import" href="network_shared_css.html">
<dom-module id="network-proxy-input">
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 fbd0f4dfd80..e4811841c98 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
@@ -2,8 +2,8 @@
<link rel="import" href="network_list.html">
<link rel="import" href="network_listener_behavior.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/network/onc_mojo.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
+<link rel="import" href="onc_mojo.html">
+<link rel="import" href="../../../cr_elements/shared_vars_css.html">
<link rel="import" href="chrome://resources/polymer/v1_0/paper-progress/paper-progress.html">
<dom-module id="network-select">
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 0ef4fdfcf16..1cb4d6e24a8 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
@@ -95,10 +95,13 @@ Polymer({
this.refreshNetworks();
const INTERVAL_MS = 10 * 1000;
- const kAll = chromeos.networkConfig.mojom.NetworkType.kAll;
- this.networkConfig_.requestNetworkScan(kAll);
+ // Request only WiFi network scans. Tether and Cellular scans are not useful
+ // here. Cellular scans are disruptive and should only be triggered by
+ // explicit user action.
+ const kWiFi = chromeos.networkConfig.mojom.NetworkType.kWiFi;
+ this.networkConfig_.requestNetworkScan(kWiFi);
this.scanIntervalId_ = window.setInterval(function() {
- this.networkConfig_.requestNetworkScan(kAll);
+ this.networkConfig_.requestNetworkScan(kWiFi);
}.bind(this), INTERVAL_MS);
},
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_shared_css.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_shared_css.html
index 5953bebc8c2..0d0791d8b38 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_shared_css.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_shared_css.html
@@ -1,4 +1,4 @@
-<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html">
+<link rel="import" href="../../../cr_elements/shared_style_css.html">
<!-- Common styles for network elements. -->
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.html
index 39a8d153a18..181b8233b85 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.html
@@ -1,13 +1,13 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/network/onc_mojo.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
-<link rel="import" href="chrome://resources/cr_elements/icons.html">
-<link rel="import" href="chrome://resources/html/assert.html">
-<link rel="import" href="chrome://resources/html/cr/ui/focus_without_ink.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="onc_mojo.html">
+<link rel="import" href="../../../cr_elements/cr_button/cr_button.html">
+<link rel="import" href="../../../cr_elements/cr_dialog/cr_dialog.html">
+<link rel="import" href="../../../cr_elements/cr_toggle/cr_toggle.html">
+<link rel="import" href="../../../cr_elements/icons.html">
+<link rel="import" href="../../../html/assert.html">
+<link rel="import" href="../../../html/cr/ui/focus_without_ink.html">
+<link rel="import" href="../../../html/i18n_behavior.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-icon/iron-icon.html">
<link rel="import" href="network_password_input.html">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.html b/chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.html
index 616c8131bc2..fa7ff789d05 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.html
@@ -1,2 +1,2 @@
-<link rel="import" href="chrome://resources/html/assert.html">
+<link rel="import" href="../../../html/assert.html">
<script src="onc_mojo.js"></script>
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 16847b73c82..a193123d179 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
@@ -147,6 +147,8 @@ class OncMojo {
return 'Uninitialized';
case DeviceStateType.kDisabled:
return 'Disabled';
+ case DeviceStateType.kDisabling:
+ return 'Disabling';
case DeviceStateType.kEnabling:
return 'Enabling';
case DeviceStateType.kEnabled:
@@ -161,27 +163,24 @@ class OncMojo {
}
/**
- * @param {string} value
- * @return {!chromeos.networkConfig.mojom.DeviceStateType}
+ * @param {!chromeos.networkConfig.mojom.DeviceStateType} value
+ * @return {boolean}
*/
- static getDeviceStateTypeFromString(value) {
+ static deviceStateIsIntermediate(value) {
const DeviceStateType = chromeos.networkConfig.mojom.DeviceStateType;
switch (value) {
- case 'Uninitialized':
- return DeviceStateType.kUninitialized;
- case 'Disabled':
- return DeviceStateType.kDisabled;
- case 'Enabling':
- return DeviceStateType.kEnabling;
- case 'Enabled':
- return DeviceStateType.kEnabled;
- case 'Prohibited':
- return DeviceStateType.kProhibited;
- case 'Unavailable':
- return DeviceStateType.kUnavailable;
+ case DeviceStateType.kUninitialized:
+ case DeviceStateType.kDisabling:
+ case DeviceStateType.kEnabling:
+ case DeviceStateType.kUnavailable:
+ return true;
+ case DeviceStateType.kDisabled:
+ case DeviceStateType.kEnabled:
+ case DeviceStateType.kProhibited:
+ return false;
}
- assertNotReached('Unexpected value: ' + value);
- return DeviceStateType.kUnavailable;
+ assertNotReached('Unexpected enum value: ' + OncMojo.getEnumString(value));
+ return false;
}
/**
@@ -590,7 +589,6 @@ class OncMojo {
security: mojom.SecurityType.kNone,
signalStrength: 0,
ssid: '',
- isSyncable: false,
};
break;
default:
@@ -729,6 +727,7 @@ class OncMojo {
security: mojom.SecurityType.kNone,
signalStrength: 0,
isSyncable: false,
+ isConfiguredByActiveUser: false,
}
};
break;
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_0.svg b/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_0.svg
index d9729d60cd0..1387407428c 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_0.svg
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_0.svg
@@ -1,3 +1,3 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px">
- <path d="M10.01 17.99L20 5.46C19.613 5.164 15.765 2 10 2 4.227 2 .387 5.165 0 5.46l9.99 12.53.01.01.01-.01z" fill-opacity=".3"/>
+<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.44247 16.7281C9.72802 17.0905 10.2698 17.0905 10.5554 16.7289L17.8425 7.49646C18.1038 7.16533 18.0317 6.68099 17.6876 6.44135C16.4955 5.61135 13.7328 4 10 4C6.26792 4 3.50455 5.61135 2.31239 6.44135C1.96831 6.68099 1.89621 7.16533 2.15749 7.49646L9.44247 16.7281ZM4.61134 7.37751L9.99932 14.2053L15.3886 7.37739C14.1425 6.71268 12.2788 6 10 6C7.72159 6 5.85753 6.71277 4.61134 7.37751Z" />
</svg>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_0_with_x.svg b/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_0_with_x.svg
index 299bcfcb7fe..16b158e658e 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_0_with_x.svg
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_0_with_x.svg
@@ -1,7 +1,4 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
- <g fill="none" fill-rule="evenodd">
- <path fill="#000" fill-opacity=".3" fill-rule="nonzero" d="M14.6412814,12 L19.7888889,5.58888889 C19.4111111,5.3 15.6444444,2.22222222 10,2.22222222 C4.35555556,2.22222222 0.588888889,5.3 0.211111111,5.58888889 L9.98888889,17.7666667 L10.0111111,17.7666667 L12,15.289596 L12,12 L14.6412814,12 Z"/>
- <polygon points="0 0 20 0 20 20 0 20"/>
- <polygon fill="#B2B2B2" fill-rule="nonzero" points="18.833 13.588 18.246 13 15.917 15.329 13.588 13 13 13.588 15.329 15.917 13 18.246 13.588 18.833 15.917 16.504 18.246 18.833 18.833 18.246 16.504 15.917"/>
- </g>
+<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.44247 16.7281C9.72802 17.0905 10.2698 17.0905 10.5554 16.7289L17.8425 7.49646C18.1038 7.16533 18.0317 6.68099 17.6876 6.44135C16.4955 5.61135 13.7328 4 10 4C6.26792 4 3.50455 5.61135 2.31239 6.44135C1.96831 6.68099 1.89621 7.16533 2.15749 7.49646L9.44247 16.7281ZM4.61134 7.37751L9.99932 14.2053L15.3886 7.37739C14.1425 6.71268 12.2788 6 10 6C7.72159 6 5.85753 6.71277 4.61134 7.37751Z" />
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.6667 9L12 7.66667L11.3333 7L10 8.33333L8.66667 7L8 7.66667L9.33333 9L8 10.3333L8.66667 11L10 9.66667L11.3333 11L12 10.3333L10.6667 9Z" />
</svg>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_1.svg b/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_1.svg
index 9098185d86b..7e4e49c8ac5 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_1.svg
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_1.svg
@@ -1,4 +1,4 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px">
- <path d="M10.01 17.99L20 5.46C19.613 5.164 15.765 2 10 2 4.227 2 .387 5.165 0 5.46l9.99 12.53.01.01.01-.01z" fill-opacity=".3"/>
- <path d="M5.558 12.402L10 17.992V18l.008-.008 4.442-5.59c-.233-.177-1.925-1.57-4.45-1.57-2.525 0-4.217 1.393-4.442 1.57z"/>
+<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.44247 16.7281C9.72802 17.0905 10.2698 17.0905 10.5554 16.7289L17.8425 7.49646C18.1038 7.16533 18.0317 6.68099 17.6876 6.44135C16.4955 5.61135 13.7328 4 10 4C6.26792 4 3.50455 5.61135 2.31239 6.44135C1.96831 6.68099 1.89621 7.16533 2.15749 7.49646L9.44247 16.7281ZM4.61134 7.37751L9.99932 14.2053L15.3886 7.37739C14.1425 6.71268 12.2788 6 10 6C7.72159 6 5.85753 6.71277 4.61134 7.37751Z"/>
+<path d="M13.8332 12.5761C12.7208 12.237 11.4317 12 10 12C8.56817 12 7.27891 12.2372 6.16626 12.5764L9.44247 16.7281C9.72802 17.0905 10.2698 17.0905 10.5554 16.7289L13.8332 12.5761Z" />
</svg>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_2.svg b/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_2.svg
index 0b14317bc7e..ce2f84d3f63 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_2.svg
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_2.svg
@@ -1,4 +1,3 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px">
- <path d="M10.01 17.99L20 5.46C19.613 5.164 15.765 2 10 2 4.227 2 .387 5.165 0 5.46l9.99 12.53.01.01.01-.01z" fill-opacity=".3"/>
- <path d="M3.992 10.452l6 7.548H10l.008-.008 6-7.55c-.3-.226-2.59-2.11-6.008-2.11-3.417 0-5.708 1.884-6.008 2.12z"/>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path fill-rule="evenodd" d="M7.99999976,4.4408921e-15 C11.7328,4.4408921e-15 14.4955,1.61135 15.6876,2.44135 C16.0317,2.68099 16.1038,3.16533 15.8425,3.49646 L15.8425,3.49646 L8.5554,12.7289 C8.2698,13.0905 7.72802,13.0905 7.44247,12.7281 L7.44247,12.7281 L0.15749,3.49646 C-0.10379,3.16533 -0.03169,2.68099 0.31239,2.44135 C1.50455,1.61135 4.26792,4.4408921e-15 7.99999976,4.4408921e-15 Z M7.9986,5 C9.23601,5 10.350948,5.2101302 11.3111193,5.50860386 L11.6254,5.6112 L11.6254,5.6112 C12.314,4.73885 13.3886,3.37739 13.3886,3.37739 C12.1425,2.71268 10.2788,2 8,2 C5.72159,2 3.85753,2.71277 2.61134,3.37751 C2.61134,3.37751 3.36107,4.32758 4.3736,5.61069 C5.40153,5.25916 6.62474,5 7.9986,5 Z" transform="translate(2 4)"/>
</svg>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_3.svg b/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_3.svg
index 261d2e51b5e..38bfe4f6302 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_3.svg
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_3.svg
@@ -1,4 +1,3 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px">
- <path d="M10.01 17.99L20 5.46C19.613 5.164 15.765 2 10 2 4.227 2 .387 5.165 0 5.46l9.99 12.53.01.01.01-.01z" fill-opacity=".3"/>
- <path d="M2.942 9.143l7.05 8.85L10 18l.008-.008 7.05-8.85C16.7 8.867 14.008 6.668 10 6.668s-6.7 2.2-7.058 2.476z"/>
+<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.5554 16.7289C10.2698 17.0905 9.72802 17.0905 9.44247 16.7281L2.15749 7.49646C1.89621 7.16533 1.96831 6.68099 2.31239 6.44135C3.50455 5.61135 6.26792 4 10 4C13.7328 4 16.4955 5.61135 17.6876 6.44135C18.0317 6.68099 18.1038 7.16533 17.8425 7.49646L10.5554 16.7289ZM5.46762 8.4626L4.61134 7.37751C5.85753 6.71277 7.72159 6 10 6C12.2788 6 14.1425 6.71268 15.3886 7.37739L14.5315 8.46329C13.348 7.94707 11.8035 7.5 9.99865 7.5C8.19498 7.5 6.65099 7.94668 5.46762 8.4626Z" />
</svg>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_4.svg b/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_4.svg
index 603eea720fd..c741f5e2b42 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_4.svg
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_4.svg
@@ -1,3 +1,3 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px">
- <path d="M10.01 17.99L20 5.46C19.613 5.164 15.765 2 10 2 4.227 2 .387 5.165 0 5.46l9.99 12.53.01.01.01-.01z"/>
+<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M17.8425 7.49646C18.1038 7.16533 18.0317 6.68099 17.6876 6.44135C16.4955 5.61135 13.7328 4 10 4C6.26792 4 3.50455 5.61135 2.31239 6.44135C1.96831 6.68099 1.89621 7.16533 2.15749 7.49646L9.44247 16.7281C9.72802 17.0905 10.2698 17.0905 10.5554 16.7289L17.8425 7.49646Z" />
</svg>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_off.svg b/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_off.svg
index 8dfadca8a80..aa572361e47 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_off.svg
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/wifi_off.svg
@@ -1,3 +1,3 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px">
- <path d="M9.7 2.3c-1.25 0-2.408.158-3.458.4l8.608 8.6 4.55-5.667C19.025 5.35 15.292 2.3 9.7 2.3zM2.425 1L1.367 2.067l1.708 1.716C1.292 4.6.192 5.483 0 5.633L10 18l2.958-4.342 2.767 2.767 1.058-1.058-2.883-2.884L2.425 1z"/>
+<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10 6C7.96011 6 6.14746 6.5389 4.6073 7.37238L9.99933 14.2053L15.3926 7.37228C13.8524 6.53869 12.0402 6 10 6ZM17.8425 7.49646L10.5554 16.7289C10.2698 17.0905 9.72802 17.0905 9.44247 16.7281L2.15749 7.49646C1.89621 7.16533 1.96831 6.68099 2.31239 6.44135C3.50455 5.61135 6.26792 4 10 4C13.7328 4 16.4955 5.61135 17.6876 6.44135C18.0317 6.68099 18.1038 7.16533 17.8425 7.49646Z" />
</svg>
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
new file mode 100644
index 00000000000..6c1f0d8f6ce
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network_health/BUILD.gn
@@ -0,0 +1,53 @@
+# 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/polymer.gni")
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+assert(is_chromeos, "Only ChromeOS components belong here.")
+
+# JS type check for Polymer 2 and 3
+
+js_type_check("closure_compile") {
+ deps = [ ":network_health_summary" ]
+}
+
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ deps = [ ":network_health_summary.m" ]
+}
+
+# Sources with Polymer 3 generated modules
+
+js_library("network_health_summary") {
+ deps = [
+ "//chromeos/services/network_health/public/mojom:mojom_js_library_for_compile",
+ "//ui/webui/resources/cr_components/chromeos/network:onc_mojo",
+ "//ui/webui/resources/js:i18n_behavior",
+ ]
+}
+
+js_library("network_health_summary.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.m.js" ]
+ deps = [
+ "//chromeos/services/network_health/public/mojom:mojom_js_library_for_compile",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/cr_components/chromeos/network:onc_mojo",
+ "//ui/webui/resources/js:i18n_behavior.m",
+ ]
+ extra_deps = [ ":network_health_summary_module" ]
+}
+
+# polymer_modulizer for converting Polymer2 to Polymer3
+
+polymer_modulizer("network_health_summary") {
+ js_file = "network_health_summary.js"
+ html_file = "network_health_summary.html"
+ html_type = "dom-module"
+}
+
+group("polymer3_elements") {
+ public_deps = [ ":network_health_summary_module" ]
+}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.html b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.html
new file mode 100644
index 00000000000..7d03f663ac9
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.html
@@ -0,0 +1,49 @@
+<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_health.mojom.html">
+<link rel="import" href="../../../cr_elements/shared_style_css.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
+
+
+<dom-module id="network-health-summary">
+ <template>
+ <style>
+ table {
+ width: 100%;
+ }
+
+ tr,
+ td {
+ border: 1px solid rgb(220, 220, 220);
+ font-size: 13px;
+ padding: 5px;
+ }
+
+ .table-header {
+ font-size: 15px;
+ font-weight: bold;
+ padding-bottom: 15px;
+ }
+ </style>
+ <table>
+ <tr class="table-header">
+ <td>[[i18n('OncName')]]</td>
+ <td>[[i18n('OncType')]]</td>
+ <td>[[i18n('NetworkHealthState')]]</td>
+ <td>[[i18n('OncMacAddress')]]</td>
+ </tr>
+ <hr>
+ <template is="dom-repeat"
+ items="[[networkHealthState_.networks]]" as="network">
+ <tr>
+ <td>[[network.name]]</td>
+ <td>[[getNetworkTypeString_(network.type)]]</td>
+ <td>[[getNetworkStateString_(network.state)]]</td>
+ <td>[[network.macAddress]]</td>
+ </tr>
+ </template>
+ </table>
+ </template>
+ <script src="network_health_summary.js"></script>
+</dom-module>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js
new file mode 100644
index 00000000000..cc336b99b5f
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js
@@ -0,0 +1,94 @@
+// 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 Polymer element for displaying NetworkHealth properties.
+ */
+Polymer({
+ is: 'network-health-summary',
+
+ behaviors: [
+ I18nBehavior,
+ ],
+
+ /**
+ * Network Health State object.
+ * @private
+ * @type {chromeos.networkHealth.mojom.NetworkHealthState}
+ */
+ networkHealthState_: null,
+
+ /**
+ * Network Health mojo remote.
+ * @private
+ * @type {?chromeos.networkHealth.mojom.NetworkHealthServiceRemote}
+ */
+ networkHealth_: null,
+
+ /** @override */
+ created() {
+ this.networkHealth_ =
+ chromeos.networkHealth.mojom.NetworkHealthService.getRemote();
+ },
+
+ /** @override */
+ attached() {
+ this.requestNetworkHealth_();
+
+ // Automatically refresh Network Health every second.
+ window.setInterval(() => {
+ this.requestNetworkHealth_();
+ }, 1000);
+ },
+
+ /**
+ * Requests the NetworkHealthState and updates the page.
+ * @private
+ */
+ requestNetworkHealth_() {
+ this.networkHealth_.getHealthSnapshot().then(result => {
+ this.networkHealthState_ = result.state;
+ });
+ },
+
+ /**
+ * Returns a string for the given NetworkState.
+ * @private
+ * @param {chromeos.networkHealth.mojom.NetworkState} state
+ * @return {string}
+ */
+ getNetworkStateString_(state) {
+ switch (state) {
+ case chromeos.networkHealth.mojom.NetworkState.kUninitialized:
+ return this.i18n('NetworkHealthStateUninitialized');
+ case chromeos.networkHealth.mojom.NetworkState.kDisabled:
+ return this.i18n('NetworkHealthStateDisabled');
+ case chromeos.networkHealth.mojom.NetworkState.kProhibited:
+ return this.i18n('NetworkHealthStateProhibited');
+ case chromeos.networkHealth.mojom.NetworkState.kNotConnected:
+ return this.i18n('NetworkHealthStateNotConnected');
+ case chromeos.networkHealth.mojom.NetworkState.kConnecting:
+ return this.i18n('NetworkHealthStateConnecting');
+ case chromeos.networkHealth.mojom.NetworkState.kPortal:
+ return this.i18n('NetworkHealthStatePortal');
+ case chromeos.networkHealth.mojom.NetworkState.kConnected:
+ return this.i18n('NetworkHealthStateConnected');
+ case chromeos.networkHealth.mojom.NetworkState.kOnline:
+ return this.i18n('NetworkHealthStateOnline');
+ }
+
+ assertNotReached('Unexpected enum value');
+ return '';
+ },
+
+ /**
+ * Returns a string for the given NetworkType.
+ * @private
+ * @param {chromeos.networkConfig.mojom.NetworkType} type
+ * @return {string}
+ */
+ getNetworkTypeString_(type) {
+ return this.i18n('OncType' + OncMojo.getNetworkTypeString(type));
+ },
+});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/lock_screen_constants.html b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/lock_screen_constants.html
index 83290e9a758..be24319c94a 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/lock_screen_constants.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/lock_screen_constants.html
@@ -1,3 +1,3 @@
-<link rel="import" href="chrome://resources/html/cr.html">
+<link rel="import" href="../../../html/cr.html">
<script src="lock_screen_constants.js"></script>
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 36d6749581c..1dc6eb3d818 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
@@ -2,14 +2,14 @@
what i18n to use for keypad, ie, does 1 ABC make
sense in every scenario? -->
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
-<link rel="import" href="chrome://resources/cr_elements/icons.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="../../../cr_elements/cr_button/cr_button.html">
+<link rel="import" href="../../../cr_elements/cr_icon_button/cr_icon_button.html">
+<link rel="import" href="../../../cr_elements/cr_input/cr_input.html">
+<link rel="import" href="../../../cr_elements/icons.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-styles/color.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
<link rel="import" href="pin_keyboard_icon.html">
@@ -119,11 +119,12 @@
font-size: 20px;
}
+ #pinInput::part(input) {
+ font-size: 28px;
+ }
+
#pinInput {
--cr-input-error-display: none;
- --cr-input-input: {
- font-size: 28px;
- };
--cr-input-letter-spacing: var(--pin-keyboard-input-letter-spacing,
18px);
--cr-input-padding-end: 0;
@@ -164,7 +165,7 @@
is-input-rtl$="[[isInputRtl_(value)]]" aria-label="[[ariaLabel]]"
make-contrast$="[[hasInputOrFocus_(value, focused_)]]" invalid="[[hasError]]"
placeholder="[[getInputPlaceholder_(enablePassword,
- enablePlaceholder)]]"
+ enablePlaceholder)]]" inputmode="none"
on-keydown="onInputKeyDown_" force-underline="true"
disabled="[[disabled]]">
</cr-input>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard_icon.html b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard_icon.html
index 6aaf8c5599c..7dfb928e333 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard_icon.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard_icon.html
@@ -1,4 +1,4 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-iconset-svg/iron-iconset-svg.html">
@@ -19,4 +19,4 @@
</g>
</defs>
</svg>
-</iron-iconset-svg> \ No newline at end of file
+</iron-iconset-svg>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/setup_pin_keyboard.html b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/setup_pin_keyboard.html
index 4babf0c6455..2bc0ed34b6d 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/setup_pin_keyboard.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/setup_pin_keyboard.html
@@ -1,11 +1,11 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_components/chromeos/quick_unlock/lock_screen_constants.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html">
-<link rel="import" href="chrome://resources/cr_elements/icons.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
-<link rel="import" href="chrome://resources/html/assert.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="lock_screen_constants.html">
+<link rel="import" href="../../../cr_elements/cr_dialog/cr_dialog.html">
+<link rel="import" href="../../../cr_elements/icons.html">
+<link rel="import" href="../../../cr_elements/shared_vars_css.html">
+<link rel="import" href="../../../html/assert.html">
+<link rel="import" href="../../../html/i18n_behavior.html">
<link rel="import" href="pin_keyboard.html">
<!--
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.html b/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.html
index 4479f4048c2..096fa65af74 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.html
@@ -1,25 +1,35 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.html">
-<link rel="import" href="chrome://resources/cr_elements/icons.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_style_css.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/html/load_time_data.html">
-<link rel="import" href="chrome://resources/cr_elements/md_select_css.html">
-<link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
+<link rel="import" href="../../../cr_elements/cr_button/cr_button.html">
+<link rel="import" href="../../../cr_elements/cr_checkbox/cr_checkbox.html">
+<link rel="import" href="../../../cr_elements/cr_dialog/cr_dialog.html">
+<link rel="import" href="../../../cr_elements/cr_input/cr_input.html">
+<link rel="import" href="../../../cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.html">
+<link rel="import" href="../../../cr_elements/icons.html">
+<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/load_time_data.html">
+<link rel="import" href="../../../cr_elements/md_select_css.html">
+<link rel="import" href="../../../html/web_ui_listener_behavior.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
<link rel="import" href="smb_browser_proxy.html">
<dom-module id="add-smb-share-dialog">
<template>
<style include="cr-shared-style md-select">
+ cr-dialog::part(wrapper) {
+ /* Subtract the internal padding in <cr-dialog>. */
+ padding: calc(24px - 20px);
+ }
+
+ [slot='button-container'] {
+ padding-bottom: 20px;
+ padding-top: 32px;
+ }
+
#dialog [slot=body] {
- height: 440px;
+ height: 390px;
}
.md-select {
@@ -61,7 +71,7 @@
</style>
<cr-dialog id="dialog" exportparts="dialog">
- <div slot="title">[[i18n('addSmbShare')]]</div>
+ <div slot="title" part="title">[[i18n('addSmbShare')]]</div>
<div slot="body" spellcheck="false">
<div id="general-error-container">
<div hidden="[[!shouldShowGeneralError_(currentMountError_)]]">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/smb_browser_proxy.html b/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/smb_browser_proxy.html
index 2d494727081..e904e891c61 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/smb_browser_proxy.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/smb_browser_proxy.html
@@ -1,2 +1,2 @@
-<link rel="import" href="chrome://resources/html/cr.html">
-<script src="smb_browser_proxy.js"> </script> \ No newline at end of file
+<link rel="import" href="../../../html/cr.html">
+<script src="smb_browser_proxy.js"> </script>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/smb_browser_proxy.js b/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/smb_browser_proxy.js
index 90d2f4a7db6..4796b1a19a1 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/smb_browser_proxy.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/smb_browser_proxy.js
@@ -7,7 +7,7 @@
* interact with the browser. Used only on Chrome OS.
*/
-// #import {addSingletonGetter, sendWithPromise} from 'chrome://resources/js/cr.m.js';
+// #import {addSingletonGetter, sendWithPromise} from '../../../js/cr.m.js';
/**
* @enum {number}
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 7c1186fe555..70d2a577251 100644
--- a/chromium/ui/webui/resources/cr_components/cr_components_images.grdp
+++ b/chromium/ui/webui/resources/cr_components/cr_components_images.grdp
@@ -40,51 +40,43 @@
<!-- NetworkIcon Images -->
<include name="IDR_CR_ELEMENTS_CELLULAR_0_WITH_X_SVG"
file="cr_components/chromeos/network/cellular_0_with_x.svg"
- type="BINDATA" compress="gzip" />
+ type="BINDATA" />
<include name="IDR_CR_ELEMENTS_CELLULAR_0_SVG"
file="cr_components/chromeos/network/cellular_0.svg"
- type="BINDATA" compress="gzip" />
+ type="BINDATA" />
<include name="IDR_CR_ELEMENTS_CELLULAR_1_SVG"
file="cr_components/chromeos/network/cellular_1.svg"
- type="BINDATA" compress="gzip" />
+ type="BINDATA" />
<include name="IDR_CR_ELEMENTS_CELLULAR_2_SVG"
file="cr_components/chromeos/network/cellular_2.svg"
- type="BINDATA" compress="gzip" />
+ type="BINDATA" />
<include name="IDR_CR_ELEMENTS_CELLULAR_3_SVG"
file="cr_components/chromeos/network/cellular_3.svg"
- type="BINDATA" compress="gzip" />
+ type="BINDATA" />
<include name="IDR_CR_ELEMENTS_CELLULAR_4_SVG"
file="cr_components/chromeos/network/cellular_4.svg"
- type="BINDATA" compress="gzip" />
+ type="BINDATA" />
<include name="IDR_CR_ELEMENTS_CELLULAR_OFF_SVG"
file="cr_components/chromeos/network/cellular_off.svg"
- type="BINDATA" compress="gzip" />
+ type="BINDATA" />
<include name="IDR_CR_ELEMENTS_ETHERNET_SVG"
- file="cr_components/chromeos/network/ethernet.svg" type="BINDATA"
- compress="gzip" />
+ file="cr_components/chromeos/network/ethernet.svg" type="BINDATA" />
<include name="IDR_CR_ELEMENTS_VPN_SVG"
- file="cr_components/chromeos/network/vpn.svg" type="BINDATA"
- compress="gzip" />
+ file="cr_components/chromeos/network/vpn.svg" type="BINDATA" />
<include name="IDR_CR_ELEMENTS_WIFI_0_WITH_X_SVG"
file="cr_components/chromeos/network/wifi_0_with_x.svg"
- type="BINDATA" compress="gzip" />
+ type="BINDATA" />
<include name="IDR_CR_ELEMENTS_WIFI_0_SVG"
- file="cr_components/chromeos/network/wifi_0.svg" type="BINDATA"
- compress="gzip" />
+ file="cr_components/chromeos/network/wifi_0.svg" type="BINDATA" />
<include name="IDR_CR_ELEMENTS_WIFI_1_SVG"
- file="cr_components/chromeos/network/wifi_1.svg" type="BINDATA"
- compress="gzip" />
+ file="cr_components/chromeos/network/wifi_1.svg" type="BINDATA" />
<include name="IDR_CR_ELEMENTS_WIFI_2_SVG"
- file="cr_components/chromeos/network/wifi_2.svg" type="BINDATA"
- compress="gzip" />
+ file="cr_components/chromeos/network/wifi_2.svg" type="BINDATA" />
<include name="IDR_CR_ELEMENTS_WIFI_3_SVG"
- file="cr_components/chromeos/network/wifi_3.svg" type="BINDATA"
- compress="gzip" />
+ file="cr_components/chromeos/network/wifi_3.svg" type="BINDATA" />
<include name="IDR_CR_ELEMENTS_WIFI_4_SVG"
- file="cr_components/chromeos/network/wifi_4.svg" type="BINDATA"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ file="cr_components/chromeos/network/wifi_off.svg" 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
index 5b6ac7a9a3e..2e2468044c8 100644
--- a/chromium/ui/webui/resources/cr_components/cr_components_resources.grdp
+++ b/chromium/ui/webui/resources/cr_components/cr_components_resources.grdp
@@ -4,430 +4,333 @@
<!-- 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_dialog.html"
- type="chrome_html"
- compress="gzip" />
+ file="cr_components/chromeos/bluetooth/bluetooth_dialog.html"
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_BLUETOOTH_DIALOG_JS"
- file="cr_components/chromeos/bluetooth_dialog.js"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_APNLIST_JS"
file="cr_components/chromeos/network/network_apnlist.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_CHOOSE_MOBILE_HTML"
file="cr_components/chromeos/network/network_choose_mobile.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_CHOOSE_MOBILE_JS"
file="cr_components/chromeos/network/network_choose_mobile.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_HTML"
file="cr_components/chromeos/network/network_config.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_JS"
file="cr_components/chromeos/network/network_config.js"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_INPUT_HTML"
file="cr_components/chromeos/network/network_config_input.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_INPUT_JS"
file="cr_components/chromeos/network/network_config_input.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_SELECT_HTML"
file="cr_components/chromeos/network/network_config_select.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_SELECT_JS"
file="cr_components/chromeos/network/network_config_select.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_TOGGLE_HTML"
file="cr_components/chromeos/network/network_config_toggle.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_TOGGLE_JS"
file="cr_components/chromeos/network/network_config_toggle.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_IP_CONFIG_HTML"
file="cr_components/chromeos/network/network_ip_config.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_IP_CONFIG_JS"
file="cr_components/chromeos/network/network_ip_config.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_NAMESERVERS_HTML"
file="cr_components/chromeos/network/network_nameservers.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_NAMESERVERS_JS"
file="cr_components/chromeos/network/network_nameservers.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_PASSWORD_INPUT_HTML"
file="cr_components/chromeos/network/network_password_input.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_PASSWORD_INPUT_JS"
file="cr_components/chromeos/network/network_password_input.js"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_PROXY_HTML"
file="cr_components/chromeos/network/network_proxy.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_PROXY_JS"
file="cr_components/chromeos/network/network_proxy.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_PROXY_EXCLUSIONS_HTML"
file="cr_components/chromeos/network/network_proxy_exclusions.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_PROXY_EXCLUSIONS_JS"
file="cr_components/chromeos/network/network_proxy_exclusions.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_PROXY_INPUT_HTML"
file="cr_components/chromeos/network/network_proxy_input.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_PROXY_INPUT_JS"
file="cr_components/chromeos/network/network_proxy_input.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_SIMINFO_HTML"
file="cr_components/chromeos/network/network_siminfo.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_SIMINFO_JS"
file="cr_components/chromeos/network/network_siminfo.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_NETWORK_SHARED_CSS_HTML"
file="cr_components/chromeos/network/network_shared_css.html"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip"/>
+ 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"
- compress="gzip"/>
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_ICONS_HTML"
file="cr_components/chromeos/multidevice_setup/icons.html"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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" />
<!-- 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<!-- Used to render network-list and related subcomponents. -->
<structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_ICON_HTML"
file="cr_components/chromeos/network/network_icon.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_ICON_JS"
file="cr_components/chromeos/network/network_icon.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_LIST_HTML"
file="cr_components/chromeos/network/network_list.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_LIST_JS"
file="cr_components/chromeos/network/network_list.js"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_SELECT_HTML"
file="cr_components/chromeos/network/network_select.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_SELECT_JS"
file="cr_components/chromeos/network/network_select.js"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ preprocess="true" />
<structure name="IDR_CR_COMPONENTS_CHROMEOS_ONC_MOJO_HTML"
file="cr_components/chromeos/network/onc_mojo.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_COMPONENTS_CHROMEOS_ONC_MOJO_JS"
file="cr_components/chromeos/network/onc_mojo.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
</if>
<structure name="IDR_WEBUI_MANAGED_FOOTNOTE_HTML"
file="cr_components/managed_footnote/managed_footnote.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_MANAGED_FOOTNOTE_JS"
file="cr_components/managed_footnote/managed_footnote.js"
- type="chrome_html"
- compress="gzip" />
+ 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
index b4bdcad48fc..96b5ae7929a 100644
--- a/chromium/ui/webui/resources/cr_components/cr_components_resources_v3.grdp
+++ b/chromium/ui/webui/resources/cr_components/cr_components_resources_v3.grdp
@@ -4,82 +4,71 @@
file="${root_gen_dir}/ui/webui/resources/cr_components/managed_footnote/managed_footnote.m.js"
use_base_dir="false"
type="BINDATA"
- preprocess="true"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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" />
</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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="BINDATA" />
<include name="IDR_WEBUI_CERTIFICATE_MANAGER_TYPES_JS"
file="cr_components/certificate_manager/certificate_manager_types.js"
- type="BINDATA"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="BINDATA" />
<!-- TODO(https://crbug.com/1071641): When conditional imports are possible
in cr_components, only include the certificate provisioning items for
ChromeOS platforms. -->
@@ -87,28 +76,23 @@
file="${root_gen_dir}/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_list.js"
use_base_dir="false"
type="BINDATA"
- preprocess="true"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ preprocess="true" />
<include name="IDR_WEBUI_CERTIFICATE_PROVISIONING_BROWSER_PROXY"
file="cr_components/certificate_manager/certificate_provisioning_browser_proxy.js"
type="BINDATA"
- preprocess="true"
- compress="gzip" />
+ preprocess="true" />
<include name="IDR_WEBUI_CERTIFICATES_BROWSER_PROXY_JS"
file="cr_components/certificate_manager/certificates_browser_proxy.js"
- type="BINDATA"
- compress="gzip" />
+ type="BINDATA" />
</if>
</grit-part>
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.html b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.html
index 2dd7bde6266..92c78ed14f0 100644
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.html
+++ b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.html
@@ -117,20 +117,16 @@
}
#takePhoto {
- --cr-icon-button-fill-color-focus: #ededed;
--cr-icon-button-fill-color: #ededed;
- --cr-icon-button-stroke-color-focus: var(--google-blue-500);
--cr-icon-button-stroke-color: white;
}
:host([videomode]) #takePhoto {
--cr-icon-button-fill-color: red;
- --cr-icon-button-fill-color-focus: red;
}
#switchMode {
--cr-icon-button-fill-color: white;
- --cr-icon-button-fill-color-focus: var(--google-blue-500);
}
:host-context([dir=rtl]) #switchMode {
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html
index 1c65e1d85d0..67ad649b390 100644
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html
+++ b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html
@@ -58,7 +58,6 @@
cr-icon-button {
--cr-icon-button-fill-color: white;
- --cr-icon-button-fill-color-focus: var(--google-blue-500);
--cr-icon-button-icon-size: 24px;
--cr-icon-button-size: 28px;
margin: 0;
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 294bfd195ab..a5102d531e2 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
@@ -64,7 +64,7 @@
padding: 8px 0;
}
</style>
- <dialog id="dialog" on-close="onNativeDialogClose_"
+ <dialog id="dialog" part="dialog" on-close="onNativeDialogClose_"
role="application" aria-roledescription$="[[roleDescription]]">
<div id="wrapper" class="item-wrapper" role="menu" tabindex="-1">
<slot id="contentNode"></slot>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js b/chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js
index 59196c2d8bc..9642a43cd52 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js
@@ -14,6 +14,7 @@
* minY: (number|undefined),
* maxX: (number|undefined),
* maxY: (number|undefined),
+ * noOffset: (boolean|undefined),
* }}
*/
let ShowAtConfig;
@@ -32,7 +33,7 @@ let ShowAtConfig;
* maxY: (number|undefined),
* }}
*/
-let ShowAtPositionConfig;
+/* #export */ let ShowAtPositionConfig;
/**
* @enum {number}
@@ -344,7 +345,7 @@ Polymer({
const rect = this.anchorElement_.getBoundingClientRect();
let height = rect.height;
- if (opt_config &&
+ if (opt_config && !opt_config.noOffset &&
opt_config.anchorAlignmentY === AnchorAlignment.AFTER_END) {
// When an action menu is positioned after the end of an element, the
// action menu can appear too far away from the anchor element, typically
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 0e6b7a8614b..85f42e253a5 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
@@ -23,11 +23,6 @@
padding: 0;
top: 50%;
width: 512px;
-
- /* Avoid using the mixin. Use ::part(dialog) instead.
- * Necessary for backward compatibility with Polymer1/SDv0 (only used by
- * OOBE). TODO(crbug.com/955194): Remove this once fixed.*/
- @apply --cr-dialog-native;
}
@media (prefers-color-scheme: dark) {
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 f42f43e4c98..07a78baa633 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
@@ -103,12 +103,15 @@ Polymer({
// Also put these values as member values so they can be overridden by tests
// and the tests do not need to be changed every time the UI is.
- /** @private {number} */
- canvasCircleStrokeWidth_: CANVAS_CIRCLE_STROKE_WIDTH,
- /** @private {string} */
- canvasCircleBackgroundColor_: CANVAS_CIRCLE_BACKGROUND_COLOR,
- /** @private {string} */
- canvasCircleProgressColor_: CANVAS_CIRCLE_PROGRESS_COLOR,
+
+ /** @type {number} */
+ canvasCircleStrokeWidth: CANVAS_CIRCLE_STROKE_WIDTH,
+
+ /** @type {string} */
+ canvasCircleBackgroundColor: CANVAS_CIRCLE_BACKGROUND_COLOR,
+
+ /** @type {string} */
+ canvasCircleProgressColor: CANVAS_CIRCLE_PROGRESS_COLOR,
/**
* Animation ID for fingerprint scan progress bar.
@@ -145,7 +148,7 @@ Polymer({
ctx.beginPath();
ctx.arc(c.width / 2, c.height / 2, this.circleRadius, startAngle, endAngle);
- ctx.lineWidth = this.canvasCircleStrokeWidth_;
+ ctx.lineWidth = this.canvasCircleStrokeWidth;
ctx.strokeStyle = color;
ctx.stroke();
},
@@ -155,7 +158,7 @@ Polymer({
* |circleRadius| and color |CANVAS_CIRCLE_BACKGROUND_COLOR|.
*/
drawBackgroundCircle() {
- this.drawArc(0, 2 * Math.PI, this.canvasCircleBackgroundColor_);
+ this.drawArc(0, 2 * Math.PI, this.canvasCircleBackgroundColor);
},
/**
@@ -203,11 +206,10 @@ Polymer({
// |start| + |currentAngle| to 7 * Math.PI / 2 (start is 3 * Math.PI /
// 2) otherwise the regular draw from |start| to |currentAngle| will
// draw nothing which will cause a flicker for one frame.
- this.drawArc(
- start, start + currentAngle, this.canvasCircleProgressColor_);
+ this.drawArc(start, start + currentAngle, this.canvasCircleProgressColor);
this.drawArc(
start + currentAngle, currentAngle <= 0 ? 7 * Math.PI / 2 : start,
- this.canvasCircleBackgroundColor_);
+ this.canvasCircleBackgroundColor);
currentAngle += step;
};
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 c4b47e81f62..b83538bc391 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
@@ -9,7 +9,6 @@
<style>
:host {
--cr-icon-button-fill-color: var(--google-grey-refresh-700);
- --cr-icon-button-fill-color-focus: white;
--cr-icon-button-icon-start-offset: 0;
--cr-icon-button-icon-size: 20px;
--cr-icon-button-size: 36px;
@@ -61,10 +60,6 @@
z-index: 1;
}
- :host-context([a11y-enhanced]):host([ripple-showing_]) #maskedImage {
- background-color: var(--cr-icon-button-fill-color-focus);
- }
-
#icon {
align-items: center;
border-radius: 4px;
@@ -87,12 +82,6 @@
z-index: 1;
}
- :host-context([a11y-enhanced]):host([ripple-showing_]) iron-icon {
- --iron-icon-fill-color: var(--cr-icon-button-fill-color-focus);
- --iron-icon-stroke-color: var(--cr-icon-button-stroke-color-focus,
- none);
- }
-
paper-ripple {
/* GG900 .15 is about GG700 .21 */
--paper-ripple-opacity: var(--cr-icon-button-ripple-opacity, .21);
@@ -102,23 +91,12 @@
@media (prefers-color-scheme: dark) {
:host {
--cr-icon-button-fill-color: var(--google-grey-refresh-500);
- --cr-icon-button-fill-color-focus: var(--google-grey-900);
}
paper-ripple {
--paper-ripple-opacity: var(--cr-icon-button-ripple-opacity, .4);
}
}
-
- :host-context([a11y-enhanced]) paper-ripple {
- --paper-ripple-opacity: 1;
- opacity: 0;
- transition: opacity var(--cr-icon-button-transition);
- }
-
- :host-context([a11y-enhanced]):host([ripple-showing_]) paper-ripple {
- opacity: 1;
- }
</style>
<div id="icon">
<div id="maskedImage"></div>
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 6913401d984..cec74dafb88 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
@@ -32,16 +32,11 @@
* The color of the icon can be overridden using CSS variables. When using
* iron-icon both the fill and stroke can be overridden the variables:
* --cr-icon-button-fill-color
- * --cr-icon-button-fill-color-focus
* --cr-icon-button-stroke-color
- * --cr-icon-button-stroke-color-focus
*
* When not using iron-icon (ie. specifying --cr-icon-image), the icons support
* one color and the 'stroke' variables are ignored.
*
- * The '-focus' variables are used for opaque ripple support. This is enabled
- * when the 'a11y-enhanced' attribute on <html> is present.
- *
* When using iron-icon's, more than one icon can be specified by setting
* the |ironIcon| property to a comma-delimited list of keys.
*/
@@ -178,9 +173,13 @@ Polymer({
}
const icons = (this.ironIcon || '').split(',');
icons.forEach(icon => {
- const element = document.createElement('iron-icon');
- element.icon = icon;
- this.$.icon.appendChild(element);
+ const ironIcon = document.createElement('iron-icon');
+ ironIcon.icon = icon;
+ this.$.icon.appendChild(ironIcon);
+ if (ironIcon.shadowRoot) {
+ ironIcon.shadowRoot.querySelectorAll('svg', 'img')
+ .forEach(child => child.setAttribute('role', 'none'));
+ }
});
if (!this.hasRipple()) {
return;
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 1760750a283..58ec0a3faff 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
@@ -13,21 +13,24 @@
<style include="cr-hidden-style cr-input-style cr-shared-style">
/*
A 'suffix' element will be outside the underlined space, while a
- 'prefix' element will be inside the underlined space by default.
+ 'inline-prefix' and 'inline-suffix' elements will be inside the
+ underlined space by default.
Regarding cr-input's width:
- When there's no element in the 'prefix' or 'suffix' slot, setting
- the width of cr-input as follows will work as expected:
+ When there's no element in the 'inline-prefix', 'inline-suffix' or
+ 'suffix' slot, setting the width of cr-input as follows will work as
+ expected:
cr-input {
width: 200px;
}
- However, when there's an element in the 'suffix' and/or 'prefix'
- slot, setting the 'width' will dictate the total width of the input
- field *plus* the 'prefix' and 'suffix' elements. To set the width
- of the input field + 'prefix' when a 'suffix' is present, use
- --cr-input-width.
+ However, when there's an element in the 'suffix', 'inline-suffix' and/or
+ 'inline-prefix' slot, setting the 'width' will dictate the total width
+ of the input field *plus* the 'inline-prefix', 'inline-suffix' and
+ 'suffix' elements. To set the width of the input field +
+ 'inline-prefix' + 'inline-suffix' when a 'suffix' is present,
+ use --cr-input-width.
cr-input {
--cr-input-width: 200px;
@@ -122,7 +125,7 @@
<div id="row-container" part="row-container">
<div id="input-container">
<div id="inner-input-container">
- <slot name="prefix"></slot>
+ <slot name="inline-prefix"></slot>
<!-- Only attributes that are named inconsistently between html and js
need to use attr$="", such as |tabindex| vs .tabIndex and
|readonly| vs .readOnly. -->
@@ -130,12 +133,13 @@
value="{{value::input}}" tabindex$="[[tabindex]]" type="[[type]]"
readonly$="[[readonly]]" maxlength$="[[maxlength]]"
pattern$="[[pattern]]" required="[[required]]"
- minlength$="[[minlength]]"
+ minlength$="[[minlength]]" inputmode$="[[inputmode]]"
aria-label$="[[getAriaLabel_(ariaLabel, label, placeholder)]]"
aria-invalid$="[[getAriaInvalid_(invalid)]]"
max="[[max]]" min="[[min]]" on-focus="onInputFocus_"
on-blur="onInputBlur_" on-change="onInputChange_"
on-keydown="onInputKeydown_" part="input">
+ <slot name="inline-suffix"></slot>
</div>
<div id="underline"></div>
</div>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.js b/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.js
index 2454f4ce8b6..bbc9ae2a104 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.js
@@ -122,11 +122,14 @@ Polymer({
reflectToAttribute: true,
},
+ inputmode: String,
+
label: {
type: String,
value: '',
},
+ /** @type {?string} */
placeholder: {
type: String,
value: null,
diff --git a/chromium/ui/webui/resources/cr_elements/cr_input/cr_input_style_css.html b/chromium/ui/webui/resources/cr_elements/cr_input/cr_input_style_css.html
index f357cb0ff6b..52770714325 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_input/cr_input_style_css.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_input/cr_input_style_css.html
@@ -75,11 +75,6 @@
text-align: inherit;
text-overflow: ellipsis;
width: 100%;
-
- /* Avoid using the mixin. Use ::part(input) instead.
- * Necessary for backward compatibility with Polymer1/SDv0 (only used by
- * OOBE). TODO(crbug.com/955194): Remove this once fixed.*/
- @apply --cr-input-input;
}
/* Underline styling below. */
@@ -100,7 +95,7 @@
:host([force-underline]) #underline,
:host([focused_]:not([readonly])) #underline {
opacity: 1;
- transition: width 180ms ease-out, opacity 120ms ease-in;
+ transition: opacity 120ms ease-in, width 180ms ease-out;
width: 100%;
}
</style>
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 f55dd970313..a06ff0e25c7 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toast/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_elements/cr_toast/BUILD.gn
@@ -13,12 +13,12 @@ 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") {
deps = [
":cr_toast",
- "//third_party/polymer/v1_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer-extracted",
"//ui/webui/resources/js:assert",
"//ui/webui/resources/js:cr",
]
@@ -42,10 +42,7 @@ polymer_modulizer("cr_toast_manager") {
html_file = "cr_toast_manager.html"
html_type = "dom-module"
auto_imports = [ "ui/webui/resources/html/assert.html|assert" ]
- namespace_rewrites = [
- "cr.toastManager.CrToastManagerElement|CrToastManagerElement",
- "cr.toastManager.getToastManager|getToastManager",
- ]
+ namespace_rewrites = [ "cr.toastManager.getToastManager|getToastManager" ]
}
js_type_check("closure_compile_module") {
@@ -60,6 +57,7 @@ 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" ]
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 39ce6cc03d4..7cb95803a7f 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
@@ -49,6 +49,7 @@ Polymer({
/**
* Announce a11y message
* @param {string} text
+ * @private
*/
announceA11yMessage_(text) {
Polymer.IronA11yAnnouncer.requestAvailability();
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 50fc1af7e1e..97995da2db4 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
@@ -4,16 +4,16 @@
cr.define('cr.toastManager', () => {
/* eslint-disable */
- /** @private {?cr.toastManager.CrToastManagerElement} */
+ /** @private {?CrToastManagerElement} */
let toastManagerInstance = null;
/* eslint-enable */
- /** @return {!cr.toastManager.CrToastManagerElement} */
+ /** @return {!CrToastManagerElement} */
/* #export */ function getToastManager() {
return assert(toastManagerInstance);
}
- /** @param {?cr.toastManager.CrToastManagerElement} instance */
+ /** @param {?CrToastManagerElement} instance */
function setInstance(instance) {
assert(!instance || !toastManagerInstance);
toastManagerInstance = instance;
@@ -23,7 +23,7 @@ cr.define('cr.toastManager', () => {
* @fileoverview Element which shows toasts with optional undo button.
*/
// eslint-disable-next-line
- /* #export */ let CrToastManagerElement = Polymer({
+ Polymer({
is: 'cr-toast-manager',
properties: {
@@ -94,7 +94,6 @@ cr.define('cr.toastManager', () => {
// #cr_define_end
return {
- CrToastManagerElement: CrToastManagerElement,
getToastManager: getToastManager,
};
});
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 13520fa767d..82e0d5f1481 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
@@ -58,7 +58,6 @@
}
cr-icon-button {
- --cr-icon-button-fill-color-focus: var(--cr-toolbar-background-color);
--cr-icon-button-size: 32px;
min-width: 32px;
}
@@ -180,7 +179,8 @@
<cr-toolbar-search-field id="search" narrow="[[narrow]]"
label="[[searchPrompt]]" clear-label="[[clearLabel]]"
spinner-active="[[spinnerActive]]"
- showing-search="{{showingSearch_}}">
+ showing-search="{{showingSearch_}}"
+ autofocus>
</cr-toolbar-search-field>
<iron-media-query query="(max-width: [[narrowThreshold]]px)"
query-matches="{{narrow}}">
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 5fdf2813701..2854d6a9d85 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
@@ -25,9 +25,6 @@
}
cr-icon-button {
- --cr-icon-button-fill-color-focus: var(
- --cr-toolbar-search-field-input-bg-color,
- var(--cr-toolbar-background-color));
--cr-icon-button-size: var(--cr-toolbar-icon-container-size, 32px);
margin: var(--cr-toolbar-icon-margin, 6px);
}
@@ -94,7 +91,7 @@
label {
bottom: 0;
- cursor: text;
+ cursor: var(--cr-toolbar-search-field-cursor, text);
left: 0;
overflow: hidden;
position: absolute;
@@ -112,6 +109,7 @@
background: transparent;
border: none;
color: var(--cr-toolbar-search-field-input-text-color, white);
+ cursor: var(--cr-toolbar-search-field-cursor, text);
font: inherit;
outline: none;
padding: 0;
@@ -135,7 +133,7 @@
var(--cr-toolbar-search-field-background, rgba(0, 0, 0, 0.22));
border-radius:
var(--cr-toolbar-search-field-border-radius, 2px);
- cursor: text;
+ cursor: var(--cr-toolbar-search-field-cursor, text);
padding-inline-end: 0;
width: var(--cr-toolbar-field-width, 680px);
}
@@ -145,11 +143,13 @@
}
:host(:not([narrow])) #prompt {
- margin-inline-start:
- var(--cr-toolbar-search-field-prompt-margin-inline-start);
opacity: var(--cr-toolbar-search-field-prompt-opacity);
}
+ :host([narrow]) #prompt {
+ opacity: var(--cr-toolbar-search-field-narrow-mode-prompt-opacity, 0);
+ }
+
:host([narrow]:not([showing-search])) #searchTerm {
display: none;
}
@@ -165,7 +165,9 @@
:host([narrow][showing-search]) #icon,
:host([narrow][showing-search]) paper-spinner-lite {
- margin-inline-start: 18px; /* Line up with Menu icon. */
+ /* 18px to line up with the Menu icon by default. */
+ margin-inline-start:
+ var(--cr-toolbar-search-icon-margin-inline-start, 18px);
}
</style>
<template is="dom-if" id="spinnerTemplate">
@@ -174,19 +176,21 @@
</template>
<cr-icon-button id="icon" iron-icon="cr:search" title="[[label]]" dir="ltr"
tabindex$="[[computeIconTabIndex_(narrow, hasSearchText)]]"
- aria-hidden$="[[computeIconAriaHidden_(narrow, hasSearchText)]]">
+ aria-hidden$="[[computeIconAriaHidden_(narrow, hasSearchText)]]"
+ on-click="onSearchIconClicked_">
</cr-icon-button>
<div id="searchTerm">
<label id="prompt" for="searchInput" aria-hidden="true">[[label]]</label>
<input id="searchInput"
aria-labelledby="prompt"
+ autocomplete="off"
type="search"
on-input="onSearchTermInput"
on-search="onSearchTermSearch"
on-keydown="onSearchTermKeydown_"
on-focus="onInputFocus_"
on-blur="onInputBlur_"
- autofocus
+ autofocus$="[[autofocus]]"
spellcheck="false">
</div>
<template is="dom-if" if="[[hasSearchText]]">
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js b/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js
index b37b2622153..c2453c80afb 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js
@@ -21,6 +21,12 @@ Polymer({
reflectToAttribute: true
},
+ autofocus: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true,
+ },
+
// Prompt text to display in the search field.
label: String,
@@ -67,6 +73,11 @@ Polymer({
},
/** @private */
+ onSearchIconClicked_() {
+ this.fire('search-icon-clicked');
+ },
+
+ /** @private */
focus_() {
this.getSearchInput().focus();
},
diff --git a/chromium/ui/webui/resources/cr_elements/policy/cr_policy_network_behavior_mojo.js b/chromium/ui/webui/resources/cr_elements/policy/cr_policy_network_behavior_mojo.js
index ce089b37fd3..10d48330d00 100644
--- a/chromium/ui/webui/resources/cr_elements/policy/cr_policy_network_behavior_mojo.js
+++ b/chromium/ui/webui/resources/cr_elements/policy/cr_policy_network_behavior_mojo.js
@@ -102,7 +102,7 @@ const CrPolicyNetworkBehaviorMojo = {
/**
* @param {!chromeos.networkConfig.mojom.OncSource} source
* @return {!CrPolicyIndicatorType}
- * @private
+ * @protected
*/
getIndicatorTypeForSource(source) {
if (source === chromeos.networkConfig.mojom.OncSource.kDevicePolicy) {
diff --git a/chromium/ui/webui/resources/cr_elements/policy/cr_policy_pref_indicator.js b/chromium/ui/webui/resources/cr_elements/policy/cr_policy_pref_indicator.js
index d2e6c0256c4..d3d9db47bc5 100644
--- a/chromium/ui/webui/resources/cr_elements/policy/cr_policy_pref_indicator.js
+++ b/chromium/ui/webui/resources/cr_elements/policy/cr_policy_pref_indicator.js
@@ -22,7 +22,7 @@ Polymer({
indicatorType: {
type: String,
value: CrPolicyIndicatorType.NONE,
- computed: 'getIndicatorTypeForPref_(pref.controlledBy, pref.enforcement)',
+ computed: 'getIndicatorTypeForPref_(pref.*, associatedValue)',
},
/** @private */
@@ -37,19 +37,40 @@ Polymer({
* @type {!chrome.settingsPrivate.PrefObject|undefined}
*/
pref: Object,
+
+ /**
+ * Optional value for the preference value this indicator is associated
+ * with. If this is set, no indicator will be shown if it is a member
+ * of |pref.userSelectableValues| and is not |pref.recommendedValue|.
+ * @type {*}
+ */
+ associatedValue: Object,
},
/**
- * @param {!chrome.settingsPrivate.ControlledBy|undefined} controlledBy
- * @param {!chrome.settingsPrivate.Enforcement|undefined} enforcement
- * @return {CrPolicyIndicatorType} The indicator type based on |controlledBy|
- * and |enforcement|.
+ * @return {CrPolicyIndicatorType} The indicator type based on |pref| and
+ * |associatedValue|.
*/
- getIndicatorTypeForPref_(controlledBy, enforcement) {
+ getIndicatorTypeForPref_() {
+ const {enforcement, userSelectableValues, controlledBy, recommendedValue} =
+ this.pref;
if (enforcement === chrome.settingsPrivate.Enforcement.RECOMMENDED) {
+ if (this.associatedValue !== undefined &&
+ this.associatedValue !== recommendedValue) {
+ return CrPolicyIndicatorType.NONE;
+ }
return CrPolicyIndicatorType.RECOMMENDED;
}
if (enforcement === chrome.settingsPrivate.Enforcement.ENFORCED) {
+ // An enforced preference may also have some values still available for
+ // the user to select from.
+ if (userSelectableValues !== undefined) {
+ if (recommendedValue && this.associatedValue === recommendedValue) {
+ return CrPolicyIndicatorType.RECOMMENDED;
+ } else if (userSelectableValues.includes(this.associatedValue)) {
+ return CrPolicyIndicatorType.NONE;
+ }
+ }
switch (controlledBy) {
case chrome.settingsPrivate.ControlledBy.EXTENSION:
return CrPolicyIndicatorType.EXTENSION;
@@ -74,18 +95,17 @@ Polymer({
},
/**
- * @param {CrPolicyIndicatorType} indicatorType
* @return {string} The tooltip text for |indicatorType|.
* @private
*/
- getIndicatorTooltipForPref_(indicatorType) {
+ getIndicatorTooltipForPref_() {
if (!this.pref) {
return '';
}
const matches = this.pref && this.pref.value === this.pref.recommendedValue;
return this.getIndicatorTooltip(
- indicatorType, this.pref.controlledByName || '', matches);
+ this.indicatorType, this.pref.controlledByName || '', matches);
},
/** @return {!Element} */
diff --git a/chromium/ui/webui/resources/cr_elements/shared_vars_css.html b/chromium/ui/webui/resources/cr_elements/shared_vars_css.html
index baf7015a329..4f4c0b03cbd 100644
--- a/chromium/ui/webui/resources/cr_elements/shared_vars_css.html
+++ b/chromium/ui/webui/resources/cr_elements/shared_vars_css.html
@@ -67,8 +67,18 @@
--cr-card-background-color: white;
--cr-card-shadow-color-rgb: var(--google-grey-800-rgb);
- --cr-card-shadow: rgba(var(--cr-card-shadow-color-rgb), .3) 0 1px 2px 0,
+ --cr-elevation-1: rgba(var(--cr-card-shadow-color-rgb), .3) 0 1px 2px 0,
rgba(var(--cr-card-shadow-color-rgb), .15) 0 1px 3px 1px;
+ --cr-elevation-2: rgba(var(--cr-card-shadow-color-rgb), .3) 0 1px 2px 0,
+ rgba(var(--cr-card-shadow-color-rgb), .15) 0 2px 6px 2px;
+ --cr-elevation-3: rgba(var(--cr-card-shadow-color-rgb), .3) 0 1px 3px 0,
+ rgba(var(--cr-card-shadow-color-rgb), .15) 0 4px 8px 3px;
+ --cr-elevation-4: rgba(var(--cr-card-shadow-color-rgb), .3) 0 2px 3px 0,
+ rgba(var(--cr-card-shadow-color-rgb), .15) 0 6px 10px 4px;
+ --cr-elevation-5: rgba(var(--cr-card-shadow-color-rgb), .3) 0 4px 4px 0,
+ rgba(var(--cr-card-shadow-color-rgb), .15) 0 8px 12px 6px;
+
+ --cr-card-shadow: var(--cr-elevation-1);
--cr-checked-color: var(--google-blue-600);
--cr-focused-item-color: var(--google-grey-300);
diff --git a/chromium/ui/webui/resources/cr_elements_images.grdp b/chromium/ui/webui/resources/cr_elements_images.grdp
index 80853878b83..f7c1c795c1d 100644
--- a/chromium/ui/webui/resources/cr_elements_images.grdp
+++ b/chromium/ui/webui/resources/cr_elements_images.grdp
@@ -6,51 +6,47 @@
<include name="IDR_WEBUI_IMAGES_200_LOGO_GOOGLE_G"
file="images/200-logo_googleg.png" type="BINDATA" compress="gzip" />
<include name="IDR_WEBUI_IMAGES_ARROW_DOWN"
- file="images/arrow_down.svg" type="BINDATA" compress="gzip" />
+ file="images/arrow_down.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ARROW_RIGHT"
- file="images/arrow_right.svg" type="BINDATA" compress="gzip" />
+ file="images/arrow_right.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_BUSINESS" file="images/business.svg"
- type="BINDATA" compress="gzip" />
+ type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_DARK_ARROW_DOWN"
- file="images/dark/arrow_down.svg" type="BINDATA" compress="gzip" />
+ file="images/dark/arrow_down.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_DARK_ICON_SEARCH"
- file="images/dark/icon_search.svg" type="BINDATA" compress="gzip" />
+ file="images/dark/icon_search.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ICON_ARROW_BACK"
- file="images/icon_arrow_back.svg" type="BINDATA" compress="gzip" />
+ file="images/icon_arrow_back.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ICON_ARROW_DROPDOWN"
- file="images/icon_arrow_dropdown.svg" type="BINDATA"
- compress="gzip" />
+ file="images/icon_arrow_dropdown.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ICON_CANCEL"
- file="images/icon_cancel.svg" type="BINDATA" compress="gzip" />
+ file="images/icon_cancel.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ICON_CLEAR"
- file="images/icon_clear.svg" type="BINDATA" compress="gzip" />
+ file="images/icon_clear.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ICON_DELETE_GRAY"
- file="images/icon_delete_gray.svg" type="BINDATA" compress="gzip" />
+ file="images/icon_delete_gray.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ICON_EXPAND_LESS"
- file="images/icon_expand_less.svg" type="BINDATA" compress="gzip" />
+ file="images/icon_expand_less.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ICON_EXPAND_MORE"
- file="images/icon_expand_more.svg" type="BINDATA" compress="gzip" />
+ file="images/icon_expand_more.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ICON_EXTERNAL"
- file="images/open_in_new.svg" type="BINDATA" compress="gzip" />
+ file="images/open_in_new.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ICON_MORE_VERT"
- file="images/icon_more_vert.svg" type="BINDATA" compress="gzip" />
+ file="images/icon_more_vert.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ICON_PICTURE_DELETE"
- file="images/icon_picture_delete.svg" type="BINDATA"
- compress="gzip" />
+ file="images/icon_picture_delete.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ICON_REFRESH"
- file="images/icon_refresh.svg" type="BINDATA" compress="gzip" />
+ file="images/icon_refresh.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ICON_SEARCH"
- file="images/icon_search.svg" type="BINDATA" compress="gzip" />
+ file="images/icon_search.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ICON_SETTINGS"
- file="images/icon_settings.svg" type="BINDATA" compress="gzip" />
+ file="images/icon_settings.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ICON_VISIBILITY"
- file="images/icon_visibility.svg" type="BINDATA" compress="gzip" />
+ file="images/icon_visibility.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ICON_VISIBILITY_OFF"
- file="images/icon_visibility_off.svg" type="BINDATA"
- compress="gzip" />
+ file="images/icon_visibility_off.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ICON_COPY_CONTENT"
- file="images/icon_copy_content.svg" type="BINDATA"
- compress="gzip" />
+ file="images/icon_copy_content.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_OPEN_IN_NEW"
- file="images/open_in_new.svg" type="BINDATA" compress="gzip" />
+ 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
index 8412a9dd4ba..60a58298ff0 100644
--- a/chromium/ui/webui/resources/cr_elements_resources.grdp
+++ b/chromium/ui/webui/resources/cr_elements_resources.grdp
@@ -3,170 +3,129 @@
<!-- Polymer 1.0 Elements -->
<structure name="IDR_CR_ELEMENTS_ACTION_LINK_CSS_HTML"
file="cr_elements/action_link_css.html"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_BUTTON_HTML"
file="cr_elements/cr_button/cr_button.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_BUTTON_JS"
file="cr_elements/cr_button/cr_button.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_CHECKBOX_HTML"
file="cr_elements/cr_checkbox/cr_checkbox.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_CHECKBOX_JS"
file="cr_elements/cr_checkbox/cr_checkbox.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_CONTAINER_SHADOW_BEHAVIOR_HTML"
file="cr_elements/cr_container_shadow_behavior.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_CONTAINER_SHADOW_BEHAVIOR_JS"
file="cr_elements/cr_container_shadow_behavior.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_FINGERPRINT_ICON_HTML"
file="cr_elements/cr_fingerprint/cr_fingerprint_icon.html"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_INPUT_HTML"
file="cr_elements/cr_input/cr_input.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_INPUT_JS"
file="cr_elements/cr_input/cr_input.js"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_SCROLLABLE_BEHAVIOR_HTML"
file="cr_elements/cr_scrollable_behavior.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_SCROLLABLE_BEHAVIOR_JS"
file="cr_elements/cr_scrollable_behavior.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_DIALOG_HTML"
file="cr_elements/cr_dialog/cr_dialog.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_DIALOG_JS"
file="cr_elements/cr_dialog/cr_dialog.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_DRAWER_HTML"
file="cr_elements/cr_drawer/cr_drawer.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_DRAWER_JS"
file="cr_elements/cr_drawer/cr_drawer.js"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_ICONS_HTML"
file="cr_elements/icons.html"
type="chrome_html"
- preprocess="true"
- compress="gzip" />
+ preprocess="true" />
<structure name="IDR_CR_ELEMENTS_CR_LAZY_RENDER_HTML"
file="cr_elements/cr_lazy_render/cr_lazy_render.html"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_SLIDER_HTML"
file="cr_elements/cr_slider/cr_slider.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_SLIDER_JS"
file="cr_elements/cr_slider/cr_slider.js"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
</if>
<structure name="IDR_CR_ELEMENTS_CR_VIEW_MANAGER_HTML"
file="cr_elements/cr_view_manager/cr_view_manager.html"
@@ -177,234 +136,177 @@
<if expr="chromeos">
<structure name="IDR_CR_ELEMENTS_CHROMEOS_CROS_COLOR_OVERRIDES_HTML"
file="cr_elements/chromeos/cros_color_overrides.html"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_PNG_HTML"
file="cr_elements/chromeos/cr_picture/png.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_PNG_JS"
file="cr_elements/chromeos/cr_picture/png.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_ICONS_HTML"
file="cr_elements/chromeos/cr_picture/icons.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
</if>
<structure name="IDR_CR_ELEMENTS_CR_LOTTIE_HTML"
file="cr_elements/cr_lottie/cr_lottie.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_LOTTIE_JS"
file="cr_elements/cr_lottie/cr_lottie.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_POLICY_INDICATOR_HTML"
file="cr_elements/policy/cr_policy_indicator.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_POLICY_INDICATOR_JS"
file="cr_elements/policy/cr_policy_indicator.js"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<if expr="chromeos">
<structure name="IDR_CR_ELEMENTS_CR_POLICY_NETWORK_BEHAVIOR_MOJO_HTML"
file="cr_elements/policy/cr_policy_network_behavior_mojo.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_POLICY_NETWORK_BEHAVIOR_MOJO_JS"
file="cr_elements/policy/cr_policy_network_behavior_mojo.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_POLICY_NETWORK_INDICATOR_MOJO_JS"
file="cr_elements/policy/cr_policy_network_indicator_mojo.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_POLICY_NETWORK_INDICATOR_MOJO_HTML"
file="cr_elements/policy/cr_policy_network_indicator_mojo.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
</if>
<structure name="IDR_CR_ELEMENTS_CR_POLICY_PREF_BEHAVIOR_HTML"
file="cr_elements/policy/cr_policy_pref_behavior.html"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_TOGGLE_HTML"
file="cr_elements/cr_toggle/cr_toggle.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_TOGGLE_JS"
file="cr_elements/cr_toggle/cr_toggle.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_TOOLTIP_ICON_HTML"
file="cr_elements/policy/cr_tooltip_icon.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_TOOLTIP_ICON_JS"
file="cr_elements/policy/cr_tooltip_icon.js"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_SHARED_STYLE_CSS_HTML"
file="cr_elements/shared_style_css.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_HIDDEN_STYLE_CSS_HTML"
file="cr_elements/hidden_style_css.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_ICONS_CSS_HTML"
file="cr_elements/cr_icons_css.html"
flattenhtml="true"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_MD_SELECT_CSS_HTML"
file="cr_elements/md_select_css.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_SEARCH_HIGHLIGHT_STYLE_CSS_HTML"
file="cr_elements/search_highlight_style_css.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_SHARED_VARS_CSS_HTML"
file="cr_elements/shared_vars_css.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_TABS_HTML"
file="cr_elements/cr_tabs/cr_tabs.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_TABS_JS"
file="cr_elements/cr_tabs/cr_tabs.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_TOOLBAR_HTML"
file="cr_elements/cr_toolbar/cr_toolbar.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_TOOLBAR_JS"
file="cr_elements/cr_toolbar/cr_toolbar.js"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_TOAST_HTML"
file="cr_elements/cr_toast/cr_toast.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_TOAST_JS"
file="cr_elements/cr_toast/cr_toast.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_TOAST_MANAGER_HTML"
file="cr_elements/cr_toast/cr_toast_manager.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_CR_ELEMENTS_CR_TOAST_MANAGER_JS"
file="cr_elements/cr_toast/cr_toast_manager.js"
- type="chrome_html"
- compress="gzip" />
+ 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
index 21351ddf893..d8c2e3d035a 100644
--- a/chromium/ui/webui/resources/cr_elements_resources_v3.grdp
+++ b/chromium/ui/webui/resources/cr_elements_resources_v3.grdp
@@ -4,258 +4,207 @@
<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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="BINDATA" />
<include name="IDR_CR_ELEMENTS_CR_SPLITTER_JS"
file="cr_elements/cr_splitter/cr_splitter.js"
- type="BINDATA"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="BINDATA" />
</grit-part>
diff --git a/chromium/ui/webui/resources/cr_polymer_resources.grdp b/chromium/ui/webui/resources/cr_polymer_resources.grdp
index dfa7994e003..ac76a4232ef 100644
--- a/chromium/ui/webui/resources/cr_polymer_resources.grdp
+++ b/chromium/ui/webui/resources/cr_polymer_resources.grdp
@@ -4,56 +4,41 @@
<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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ file="html/cr/ui/focus_without_ink.html" type="chrome_html" />
<structure name="IDR_WEBUI_HTML_FIND_SHORTCUT_BEHAVIOR"
- file="html/find_shortcut_behavior.html" type="chrome_html"
- compress="gzip" />
+ file="html/find_shortcut_behavior.html" type="chrome_html" />
<structure name="IDR_WEBUI_HTML_I18N_BEHAVIOR"
- file="html/i18n_behavior.html" type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ file="html/list_property_update_behavior.html" type="chrome_html" />
<structure name="IDR_WEBUI_HTML_POLYMER"
- file="html/polymer.html" type="chrome_html" compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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" compress="gzip" />
+ 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"
- compress="gzip" preprocess="true" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ file="js/cr/ui/focus_without_ink.js" type="chrome_html" />
<structure name="IDR_WEBUI_JS_FIND_SHORTCUT_BEHAVIOR"
- file="js/find_shortcut_behavior.js" type="chrome_html"
- compress="gzip" />
+ file="js/find_shortcut_behavior.js" type="chrome_html" />
<structure name="IDR_WEBUI_JS_LIST_PROPERTY_UPDATE_BEHAVIOR"
- file="js/list_property_update_behavior.js" type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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
index 07cde38e9bb..174ad76e431 100644
--- a/chromium/ui/webui/resources/cr_polymer_resources_v3.grdp
+++ b/chromium/ui/webui/resources/cr_polymer_resources_v3.grdp
@@ -2,21 +2,21 @@
<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" compress="gzip" />
+ use_base_dir="false" type="BINDATA" />
<include name="IDR_WEBUI_JS_FIND_SHORTCUT_BEHAVIOR_M_JS"
file="${root_gen_dir}/ui/webui/resources/js/find_shortcut_behavior.m.js"
- use_base_dir="false" type="BINDATA" compress="gzip" />
+ 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" compress="gzip"
+ 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" compress="gzip" />
+ 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" compress="gzip" />
+ 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" compress="gzip" />
+ use_base_dir="false" type="BINDATA" />
</grit-part>
diff --git a/chromium/ui/webui/resources/css/cros_colors.json5 b/chromium/ui/webui/resources/css/cros_colors.json5
index 1d723c51775..db08320259e 100644
--- a/chromium/ui/webui/resources/css/cros_colors.json5
+++ b/chromium/ui/webui/resources/css/cros_colors.json5
@@ -72,8 +72,10 @@
/* button-primary:hover */
/* TODO(calamity): Generate a linear-gradient() to use for compositing
backgrounds */
- cros_default_button_background_color_primary_hover_overlay:
- "rgba(0, 0, 0, 0.08)",
+ cros_default_button_background_color_primary_hover_overlay: {
+ light: "rgba(255, 255, 255, 0.08)",
+ dark: "rgba(0, 0, 0, 0.08)",
+ },
/* button-primary[disabled] */
cros_default_button_background_color_primary_disabled: {
light: "$google_grey_100",
diff --git a/chromium/ui/webui/resources/js/BUILD.gn b/chromium/ui/webui/resources/js/BUILD.gn
index 42bcefc2b27..2eb7ada9411 100644
--- a/chromium/ui/webui/resources/js/BUILD.gn
+++ b/chromium/ui/webui/resources/js/BUILD.gn
@@ -167,6 +167,7 @@ js_type_check("js_resources_modules") {
":list_property_update_behavior.m",
":load_time_data.m",
":parse_html_subset.m",
+ ":plural_string_proxy",
":promise_resolver.m",
":search_highlight_utils.m",
":util.m",
@@ -244,6 +245,10 @@ js_library("parse_html_subset.m") {
extra_deps = [ ":modulize" ]
}
+js_library("plural_string_proxy") {
+ deps = [ ":cr.m" ]
+}
+
js_library("promise_resolver.m") {
sources = [ "$root_gen_dir/ui/webui/resources/js/promise_resolver.m.js" ]
deps = [ ":assert.m" ]
diff --git a/chromium/ui/webui/resources/js/cr/ui/command.js b/chromium/ui/webui/resources/js/cr/ui/command.js
index 4f63fbcfab2..4d467c0d66f 100644
--- a/chromium/ui/webui/resources/js/cr/ui/command.js
+++ b/chromium/ui/webui/resources/js/cr/ui/command.js
@@ -193,7 +193,7 @@ cr.define('cr.ui', function() {
const target = e.target;
// Ignore focus on a menu button or command item.
- if (target.menu || target.command) {
+ if (target.menu || target.command || (target instanceof cr.ui.MenuItem)) {
return;
}
diff --git a/chromium/ui/webui/resources/js/load_time_data.js b/chromium/ui/webui/resources/js/load_time_data.js
index 94545cafa27..a4e3054b620 100644
--- a/chromium/ui/webui/resources/js/load_time_data.js
+++ b/chromium/ui/webui/resources/js/load_time_data.js
@@ -19,9 +19,9 @@
/**
* @typedef {{
- * substitutions: (Array<string>|undefined),
- * attrs: (Object<function(Node, string):boolean>|undefined),
- * tags: (Array<string>|undefined),
+ * substitutions: (!Array<string>|undefined),
+ * attrs: (!Array<string>|undefined),
+ * tags: (!Array<string>|undefined),
* }}
*/
/* #export */ let SanitizeInnerHtmlOpts;
diff --git a/chromium/ui/webui/resources/js/parse_html_subset.js b/chromium/ui/webui/resources/js/parse_html_subset.js
index c5869640195..a1432098eb9 100644
--- a/chromium/ui/webui/resources/js/parse_html_subset.js
+++ b/chromium/ui/webui/resources/js/parse_html_subset.js
@@ -3,11 +3,11 @@
// found in the LICENSE file.
/**
- * Parses a very small subset of HTML. This ensures that insecure HTML /
- * javascript cannot be injected into the new tab page.
+ * Parses a very small subset of HTML. This ensures that insecure HTML /
+ * javascript cannot be injected into WebUI.
* @param {string} s The string to parse.
- * @param {Array<string>=} opt_extraTags Optional extra allowed tags.
- * @param {Object<function(Node, string):boolean>=} opt_extraAttrs
+ * @param {!Array<string>=} opt_extraTags Optional extra allowed tags.
+ * @param {!Array<string>=} opt_extraAttrs
* Optional extra allowed attributes (all tags are run through these).
* @throws {Error} In case of non supported markup.
* @return {DocumentFragment} A document fragment containing the DOM tree.
@@ -15,38 +15,114 @@
/* #export */ const parseHtmlSubset = (function() {
'use strict';
- const allowedAttributes = {
- 'href'(node, value) {
- // Only allow a[href] starting with chrome:// and https://
- return node.tagName === 'A' &&
- (value.startsWith('chrome://') || value.startsWith('https://'));
- },
- 'target'(node, value) {
- // Only allow a[target='_blank'].
- // TODO(dbeam): are there valid use cases for target !== '_blank'?
- return node.tagName === 'A' && value === '_blank';
- },
- };
+ /** @typedef {function(!Node, string):boolean} */
+ let AllowFunction;
+
+ /** @type {!AllowFunction} */
+ const allowAttribute = (node, value) => true;
/**
- * Whitelist of tag names allowed in parseHtmlSubset.
- * @type {!Array<string>}
+ * Allow-list of attributes in parseHtmlSubset.
+ * @type {!Map<string, !AllowFunction>}
* @const
*/
- const allowedTags = ['A', 'B', 'SPAN', 'STRONG'];
-
- /** @param {...Object} var_args Objects to merge. */
- function merge(var_args) {
- const clone = {};
- for (let i = 0; i < arguments.length; ++i) {
- if (typeof arguments[i] === 'object') {
- for (const key in arguments[i]) {
- if (arguments[i].hasOwnProperty(key)) {
- clone[key] = arguments[i][key];
- }
- }
+ const allowedAttributes = new Map([
+ [
+ 'href',
+ (node, value) => {
+ // Only allow a[href] starting with chrome:// and https://
+ return node.tagName === 'A' &&
+ (value.startsWith('chrome://') || value.startsWith('https://'));
}
- }
+ ],
+ [
+ 'target',
+ (node, value) => {
+ // Only allow a[target='_blank'].
+ // TODO(dbeam): are there valid use cases for target !== '_blank'?
+ return node.tagName === 'A' && value === '_blank';
+ }
+ ],
+ ]);
+
+ /**
+ * Allow-list of optional attributes in parseHtmlSubset.
+ * @type {!Map<string, !AllowFunction>}
+ * @const
+ */
+ const allowedOptionalAttributes = new Map([
+ ['class', allowAttribute],
+ ['id', allowAttribute],
+ ['is', (node, value) => value === 'action-link' || value === ''],
+ ['role', (node, value) => value === 'link'],
+ [
+ 'src',
+ (node, value) => {
+ // Only allow img[src] starting with chrome://
+ return node.tagName === 'IMG' && value.startsWith('chrome://');
+ }
+ ],
+ ['tabindex', allowAttribute],
+ ]);
+
+ /**
+ * Allow-list of tag names in parseHtmlSubset.
+ * @type {!Set<string>}
+ * @const
+ */
+ const allowedTags =
+ new Set(['A', 'B', 'BR', 'DIV', 'P', 'PRE', 'SPAN', 'STRONG']);
+
+ /**
+ * Allow-list of optional tag names in parseHtmlSubset.
+ * @type {!Set<string>}
+ * @const
+ */
+ const allowedOptionalTags = new Set(['IMG']);
+
+ /**
+ * This is used to create TrustedHTML.
+ * @type {TrustedTypePolicy|undefined}
+ */
+ let untrustedHTMLPolicy;
+ if (window.trustedTypes) {
+ untrustedHTMLPolicy = trustedTypes.createPolicy('parse-html-subset', {
+ createHTML: untrustedHTML => {
+ // This is safe because the untrusted HTML will be sanitized
+ // later in this function. We are adding this so that
+ // the sanitization will not cause a Trusted Types violation.
+ return untrustedHTML;
+ },
+ });
+ }
+
+ /**
+ * @param {!Array<string>} optTags an Array to merge.
+ * @return {!Set<string>} Set of allowed tags.
+ */
+ function mergeTags(optTags) {
+ const clone = new Set(allowedTags);
+ optTags.forEach(str => {
+ const tag = str.toUpperCase();
+ if (allowedOptionalTags.has(tag)) {
+ clone.add(tag);
+ }
+ });
+ return clone;
+ }
+
+ /**
+ * @param {!Array<string>} optAttrs an Array to merge.
+ * @return {!Map<string, !AllowFunction>} Map of allowed
+ * attributes.
+ */
+ function mergeAttrs(optAttrs) {
+ const clone = new Map([...allowedAttributes]);
+ optAttrs.forEach(key => {
+ if (allowedOptionalAttributes.has(key)) {
+ clone.set(key, allowedOptionalAttributes.get(key));
+ }
+ });
return clone;
}
@@ -58,7 +134,7 @@
}
function assertElement(tags, node) {
- if (tags.indexOf(node.tagName) === -1) {
+ if (!tags.has(node.tagName)) {
throw Error(node.tagName + ' is not supported');
}
}
@@ -66,21 +142,24 @@
function assertAttribute(attrs, attrNode, node) {
const n = attrNode.nodeName;
const v = attrNode.nodeValue;
- if (!attrs.hasOwnProperty(n) || !attrs[n](node, v)) {
+ if (!attrs.has(n) || !attrs.get(n)(node, v)) {
throw Error(node.tagName + '[' + n + '="' + v + '"] is not supported');
}
}
return function(s, opt_extraTags, opt_extraAttrs) {
- const extraTags = (opt_extraTags || []).map(function(str) {
- return str.toUpperCase();
- });
- const tags = allowedTags.concat(extraTags);
- const attrs = merge(allowedAttributes, opt_extraAttrs || {});
+ const tags = opt_extraTags ? mergeTags(opt_extraTags) : allowedTags;
+ const attrs =
+ opt_extraAttrs ? mergeAttrs(opt_extraAttrs) : allowedAttributes;
const doc = document.implementation.createHTMLDocument('');
const r = doc.createRange();
r.selectNode(doc.body);
+
+ if (window.trustedTypes) {
+ s = untrustedHTMLPolicy.createHTML(s);
+ }
+
// This does not execute any scripts because the document has no view.
const df = r.createContextualFragment(s);
walk(df, function(node) {
diff --git a/chromium/ui/webui/resources/js/plural_string_proxy.js b/chromium/ui/webui/resources/js/plural_string_proxy.js
new file mode 100644
index 00000000000..5d38a70d862
--- /dev/null
+++ b/chromium/ui/webui/resources/js/plural_string_proxy.js
@@ -0,0 +1,33 @@
+// 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 A helper object used to get a pluralized string.
+ */
+
+// clang-format off
+import {addSingletonGetter, sendWithPromise} from './cr.m.js';
+// clang-format on
+
+/** @interface */
+export class PluralStringProxy {
+ /**
+ * Obtains a pluralized string for |messageName| with |itemCount| items.
+ * @param {!string} messageName The name of the message.
+ * @param {!number} itemCount The number of items.
+ * @return {!Promise<string>} Promise resolved with the appropriate plural
+ * string for |messageName| with |itemCount| items.
+ */
+ getPluralString(messageName, itemCount) {}
+}
+
+/** @implements {PluralStringProxy} */
+export class PluralStringProxyImpl {
+ /** @override */
+ getPluralString(messageName, itemCount) {
+ return sendWithPromise('getPluralString', messageName, itemCount);
+ }
+}
+
+addSingletonGetter(PluralStringProxyImpl);
diff --git a/chromium/ui/webui/resources/polymer_resources.grdp b/chromium/ui/webui/resources/polymer_resources.grdp
index 67506e33721..6ea0af91cc1 100644
--- a/chromium/ui/webui/resources/polymer_resources.grdp
+++ b/chromium/ui/webui/resources/polymer_resources.grdp
@@ -26,489 +26,337 @@
<!-- 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
- <if expr="chromeos">
- <structure name="IDR_POLYMER_1_0_IRON_INPUT_IRON_INPUT_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-input/iron-input-extracted.js"
- type="chrome_html"
- compress="gzip" />
- <structure name="IDR_POLYMER_1_0_IRON_INPUT_IRON_INPUT_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-input/iron-input.html"
- type="chrome_html"
- compress="gzip" />
- </if>
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<if expr="chromeos">
- <structure name="IDR_POLYMER_1_0_IRON_VALIDATABLE_BEHAVIOR_IRON_VALIDATABLE_BEHAVIOR_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-validatable-behavior/iron-validatable-behavior-extracted.js"
- type="chrome_html"
- compress="gzip" />
- <structure name="IDR_POLYMER_1_0_IRON_VALIDATABLE_BEHAVIOR_IRON_VALIDATABLE_BEHAVIOR_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-validatable-behavior/iron-validatable-behavior.html"
- type="chrome_html"
- compress="gzip" />
<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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
- <if expr="chromeos">
- <structure name="IDR_POLYMER_1_0_PAPER_INPUT_PAPER_INPUT_ADDON_BEHAVIOR_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-input/paper-input-addon-behavior-extracted.js"
- type="chrome_html"
- compress="gzip" />
- <structure name="IDR_POLYMER_1_0_PAPER_INPUT_PAPER_INPUT_ADDON_BEHAVIOR_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-input/paper-input-addon-behavior.html"
- type="chrome_html"
- compress="gzip" />
- <structure name="IDR_POLYMER_1_0_PAPER_INPUT_PAPER_INPUT_CONTAINER_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-input/paper-input-container-extracted.js"
- type="chrome_html"
- compress="gzip" />
- <structure name="IDR_POLYMER_1_0_PAPER_INPUT_PAPER_INPUT_CONTAINER_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-input/paper-input-container.html"
- type="chrome_html"
- compress="gzip" />
- <structure name="IDR_POLYMER_1_0_PAPER_INPUT_PAPER_INPUT_ERROR_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-input/paper-input-error-extracted.js"
- type="chrome_html"
- compress="gzip" />
- <structure name="IDR_POLYMER_1_0_PAPER_INPUT_PAPER_INPUT_ERROR_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-input/paper-input-error.html"
- type="chrome_html"
- compress="gzip" />
- </if>
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_1_0_PAPER_STYLES_CLASSES_SHADOW_HTML"
file="../../../third_party/polymer/v1_0/components-chromium/paper-styles/classes/shadow.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_1_0_PAPER_STYLES_CLASSES_TYPOGRAPHY_HTML"
file="../../../third_party/polymer/v1_0/components-chromium/paper-styles/classes/typography.html"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_1_0_PAPER_STYLES_DEFAULT_THEME_HTML"
file="../../../third_party/polymer/v1_0/components-chromium/paper-styles/default-theme.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_1_0_PAPER_STYLES_ELEMENT_STYLES_PAPER_MATERIAL_STYLES_HTML"
file="../../../third_party/polymer/v1_0/components-chromium/paper-styles/element-styles/paper-material-styles.html"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_1_0_PAPER_STYLES_TYPOGRAPHY_HTML"
file="../../../third_party/polymer/v1_0/components-chromium/paper-styles/typography.html"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<if expr="chromeos">
<structure name="IDR_POLYMER_1_0_POLYMER_POLYMER_EXTRACTED_JS"
file="../../../third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_1_0_POLYMER_POLYMER_MICRO_EXTRACTED_JS"
file="../../../third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_1_0_POLYMER_POLYMER_MICRO_HTML"
file="../../../third_party/polymer/v1_0/components-chromium/polymer/polymer-micro.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_1_0_POLYMER_POLYMER_MINI_EXTRACTED_JS"
file="../../../third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_1_0_POLYMER_POLYMER_MINI_HTML"
file="../../../third_party/polymer/v1_0/components-chromium/polymer/polymer-mini.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_1_0_POLYMER_POLYMER_HTML"
file="../../../third_party/polymer/v1_0/components-chromium/polymer/polymer.html"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
</if>
<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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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
index 59e450c3a5b..25e1965cd5a 100644
--- a/chromium/ui/webui/resources/polymer_resources_v3.grdp
+++ b/chromium/ui/webui/resources/polymer_resources_v3.grdp
@@ -26,273 +26,189 @@
<!-- 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
- <if expr="chromeos">
- <structure name="IDR_POLYMER_3_0_IRON_INPUT_IRON_INPUT_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-input/iron-input.js"
- type="chrome_html"
- compress="gzip" />
- </if>
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<if expr="chromeos">
- <structure name="IDR_POLYMER_3_0_IRON_VALIDATABLE_BEHAVIOR_IRON_VALIDATABLE_BEHAVIOR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-validatable-behavior/iron-validatable-behavior.js"
- type="chrome_html"
- compress="gzip" />
<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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
- <if expr="chromeos">
- <structure name="IDR_POLYMER_3_0_PAPER_INPUT_PAPER_INPUT_ADDON_BEHAVIOR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/paper-input/paper-input-addon-behavior.js"
- type="chrome_html"
- compress="gzip" />
- <structure name="IDR_POLYMER_3_0_PAPER_INPUT_PAPER_INPUT_CONTAINER_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/paper-input/paper-input-container.js"
- type="chrome_html"
- compress="gzip" />
- <structure name="IDR_POLYMER_3_0_PAPER_INPUT_PAPER_INPUT_ERROR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/paper-input/paper-input-error.js"
- type="chrome_html"
- compress="gzip" />
- </if>
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_3_0_PAPER_STYLES_CLASSES_GLOBAL_JS"
file="../../../third_party/polymer/v3_0/components-chromium/paper-styles/classes/global.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_3_0_PAPER_STYLES_CLASSES_SHADOW_JS"
file="../../../third_party/polymer/v3_0/components-chromium/paper-styles/classes/shadow.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_3_0_PAPER_STYLES_CLASSES_TYPOGRAPHY_JS"
file="../../../third_party/polymer/v3_0/components-chromium/paper-styles/classes/typography.js"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_3_0_PAPER_STYLES_DEFAULT_THEME_JS"
file="../../../third_party/polymer/v3_0/components-chromium/paper-styles/default-theme.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_3_0_PAPER_STYLES_DEMO_PAGES_JS"
file="../../../third_party/polymer/v3_0/components-chromium/paper-styles/demo-pages.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_3_0_PAPER_STYLES_ELEMENT_STYLES_PAPER_ITEM_STYLES_JS"
file="../../../third_party/polymer/v3_0/components-chromium/paper-styles/element-styles/paper-item-styles.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_POLYMER_3_0_PAPER_STYLES_ELEMENT_STYLES_PAPER_MATERIAL_STYLES_JS"
file="../../../third_party/polymer/v3_0/components-chromium/paper-styles/element-styles/paper-material-styles.js"
- type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ type="chrome_html" />
</grit-part>
diff --git a/chromium/ui/webui/resources/webui_resources.grd b/chromium/ui/webui/resources/webui_resources.grd
index 4ef5362273c..8f3ae51103c 100644
--- a/chromium/ui/webui/resources/webui_resources.grd
+++ b/chromium/ui/webui/resources/webui_resources.grd
@@ -15,10 +15,10 @@ without changes to the corresponding grd file. -->
<includes>
<if expr="chromeos">
<include name="IDR_WEBUI_I18N_TEMPLATE_JS" file="js/i18n_template.js"
- flattenhtml="true" type="BINDATA" compress="gzip" />
+ flattenhtml="true" type="BINDATA" />
</if>
<include name="IDR_WEBUI_JSTEMPLATE_JS" file="js/jstemplate_compiled.js"
- flattenhtml="true" type="BINDATA" compress="gzip"/>
+ flattenhtml="true" 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.-->
@@ -60,7 +60,7 @@ without changes to the corresponding grd file. -->
<!-- Non-apps images -->
<include name="IDR_WEBUI_IMAGES_ADD"
- file="images/add.svg" type="BINDATA" compress="gzip" />
+ file="images/add.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_CHECK"
file="images/check.png" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_CHECKBOX_BLACK"
@@ -70,69 +70,69 @@ without changes to the corresponding grd file. -->
<include name="IDR_WEBUI_IMAGES_DISABLED_SELECT"
file="images/disabled_select.png" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_ERROR"
- file="images/error.svg" type="BINDATA" compress="gzip" />
+ 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"
- file="images/error_badge.svg" type="BINDATA" compress="gzip" />
+ file="images/error_badge.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_GOOGLE_LOGO"
- file="images/google_logo.svg" type="BINDATA" compress="gzip" />
+ file="images/google_logo.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_SELECT"
file="images/select.png" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_THROBBER_MEDIUM"
- file="images/throbber_medium.svg" type="BINDATA"
- compress="gzip" />
+ file="images/throbber_medium.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_THROBBER_SMALL"
- file="images/throbber_small.svg" type="BINDATA"
- compress="gzip" />
+ 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" compress="gzip" />
+ use_base_dir="false" 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" compress="gzip" />
+ 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" compress="gzip" />
+ 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" compress="gzip" />
+ 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" compress="gzip" />
+ 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" compress="gzip" />
+ 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" compress="gzip" />
+ 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" compress="gzip" />
+ 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" compress="gzip" />
+ 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" compress="gzip" />
+ 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" compress="gzip" />
+ 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" compress="gzip" />
+ 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" compress="gzip" />
+ 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" compress="gzip" />
+ 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" compress="gzip" />
+ 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" compress="gzip"
+ use_base_dir="false" type="BINDATA"
preprocess="true" />
<if expr="not is_android">
@@ -148,315 +148,260 @@ without changes to the corresponding grd file. -->
</includes>
<structures>
<structure name="IDR_WEBUI_CSS_ACTION_LINK"
- file="css/action_link.css" type="chrome_html"
- compress="gzip" />
+ file="css/action_link.css" type="chrome_html" />
<structure name="IDR_WEBUI_CSS_APPS_COMMON"
- file="css/apps/common.css" type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ file="css/apps/topbutton_bar.css" type="chrome_html" />
<structure name="IDR_WEBUI_CSS_BUBBLE"
- file="css/bubble.css" type="chrome_html" compress="gzip" />
+ file="css/bubble.css" type="chrome_html" />
<structure name="IDR_WEBUI_CSS_BUBBLE_BUTTON"
- file="css/bubble_button.css" type="chrome_html"
- compress="gzip" />
+ file="css/bubble_button.css" type="chrome_html" />
<structure name="IDR_WEBUI_CSS_BUTTER_BAR"
- file="css/butter_bar.css" type="chrome_html" compress="gzip" />
+ file="css/butter_bar.css" type="chrome_html" />
<structure name="IDR_WEBUI_CSS_CHROME"
- file="css/chrome_shared.css" type="chrome_html" compress="gzip"
+ file="css/chrome_shared.css" type="chrome_html"
flattenhtml="true" />
<structure name="IDR_WEBUI_CSS_CONTROLLED_INDICATOR"
- file="css/controlled_indicator.css" type="chrome_html"
- compress="gzip" flattenhtml="true" />
+ file="css/controlled_indicator.css" type="chrome_html" flattenhtml="true" />
<structure name="IDR_WEBUI_CSS_DIALOGS"
- file="css/dialogs.css" type="chrome_html" compress="gzip" />
+ file="css/dialogs.css" type="chrome_html" />
<structure name="IDR_WEBUI_CSS_I18N_PROCESS"
- file="css/i18n_process.css" type="chrome_html"
- compress="gzip" />
+ file="css/i18n_process.css" type="chrome_html" />
<structure name="IDR_WEBUI_CSS_LIST"
- file="css/list.css" type="chrome_html" compress="gzip" />
+ file="css/list.css" type="chrome_html" />
<structure name="IDR_WEBUI_CSS_MENU"
- file="css/menu.css" type="chrome_html" compress="gzip"
+ file="css/menu.css" type="chrome_html"
flattenhtml="true" />
<structure name="IDR_WEBUI_CSS_MENU_BUTTON"
- file="css/menu_button.css" type="chrome_html" compress="gzip"
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ file="css/text_defaults_md.css" type="chrome_html" />
<structure name="IDR_WEBUI_CSS_OVERLAY"
- file="css/overlay.css" type="chrome_html" compress="gzip"
+ file="css/overlay.css" type="chrome_html"
flattenhtml="true" />
<structure name="IDR_WEBUI_CSS_ROBOTO" preprocess="true"
- file="css/roboto.css" type="chrome_html" compress="gzip" />
+ file="css/roboto.css" type="chrome_html" />
<structure name="IDR_WEBUI_CSS_SPINNER"
- file="css/spinner.css" type="chrome_html" compress="gzip"
+ file="css/spinner.css" type="chrome_html"
flattenhtml="true" />
<structure name="IDR_WEBUI_CSS_TABLE"
- file="css/table.css" type="chrome_html" compress="gzip" />
+ file="css/table.css" type="chrome_html" />
<structure name="IDR_WEBUI_CSS_TABS"
- file="css/tabs.css" type="chrome_html" compress="gzip" />
+ file="css/tabs.css" type="chrome_html" />
<structure name="IDR_WEBUI_CSS_THROBBER"
- file="css/throbber.css" type="chrome_html" compress="gzip" />
+ file="css/throbber.css" type="chrome_html" />
<structure name="IDR_WEBUI_CSS_TREE"
- file="css/tree.css" type="chrome_html" compress="gzip"
+ file="css/tree.css" type="chrome_html"
flattenhtml="true" />
<structure name="IDR_WEBUI_CSS_WIDGETS"
- file="css/widgets.css" type="chrome_html" compress="gzip"
+ file="css/widgets.css" type="chrome_html"
flattenhtml="true" />
<structure name="IDR_WEBUI_HTML_ACTION_LINK"
- file="html/action_link.html" type="chrome_html"
- compress="gzip" />
+ file="html/action_link.html" type="chrome_html" />
<structure name="IDR_WEBUI_HTML_ASSERT"
- file="html/assert.html" type="chrome_html" compress="gzip" />
+ file="html/assert.html" type="chrome_html" />
<structure name="IDR_WEBUI_HTML_PROMISE_RESOLVER"
- file="html/promise_resolver.html" type="chrome_html"
- compress="gzip" />
+ file="html/promise_resolver.html" type="chrome_html" />
<if expr="chromeos">
<structure name="IDR_WEBUI_CSS_CROS_COLORS"
file="${root_gen_dir}/ui/webui/resources/css/cros_colors.generated.css" type="chrome_html"
- use_base_dir="false" compress="gzip" />
+ use_base_dir="false" />
</if>
<structure name="IDR_WEBUI_HTML_CR"
- file="html/cr.html" type="chrome_html" compress="gzip" />
+ file="html/cr.html" type="chrome_html" />
<structure name="IDR_WEBUI_HTML_CR_EVENT_TARGET"
- file="html/cr/event_target.html" type="chrome_html"
- compress="gzip" />
+ file="html/cr/event_target.html" type="chrome_html" />
<structure name="IDR_WEBUI_HTML_CR_UI"
- file="html/cr/ui.html" type="chrome_html" compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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" compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_HTML_CR_UI_DRAG_WRAPPER"
- file="html/cr/ui/drag_wrapper.html" type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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" compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_HTML_CR_UI_FOCUS_ROW"
- file="html/cr/ui/focus_row.html" type="chrome_html"
- compress="gzip" />
+ 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" compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_HTML_CR_UI_LIST"
file="html/cr/ui/list.html"
- type="chrome_html" compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_HTML_CR_UI_LIST_ITEM"
file="html/cr/ui/list_item.html"
- type="chrome_html" compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_HTML_CR_UI_LIST_SELECTION_CONTROLLER"
file="html/cr/ui/list_selection_controller.html"
- type="chrome_html" compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_HTML_CR_UI_LIST_SELECTION_MODEL"
file="html/cr/ui/list_selection_model.html"
- type="chrome_html" compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_HTML_CR_UI_MENU"
- file="html/cr/ui/menu.html" type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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" compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_HTML_CR_UI_STORE_CLIENT"
file="html/cr/ui/store_client.html"
- type="chrome_html" compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_HTML_EVENT_TRACKER"
- file="html/event_tracker.html" type="chrome_html"
- compress="gzip" />
+ file="html/event_tracker.html" type="chrome_html" />
<structure name="IDR_WEBUI_HTML_ICON"
- file="html/icon.html" type="chrome_html" compress="gzip" />
+ file="html/icon.html" type="chrome_html" />
<structure name="IDR_WEBUI_HTML_LOAD_TIME_DATA"
- file="html/load_time_data.html" type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ file="html/parse_html_subset.html" type="chrome_html" />
<structure name="IDR_WEBUI_HTML_TEST_LOADER"
- file="html/test_loader.html" type="chrome_html"
- compress="gzip"/>
+ file="html/test_loader.html" type="chrome_html"/>
<structure name="IDR_WEBUI_HTML_UTIL"
- file="html/util.html" type="chrome_html" compress="gzip" />
+ file="html/util.html" type="chrome_html" />
<structure name="IDR_WEBUI_JS_ACTION_LINK"
- file="js/action_link.js" type="chrome_html" compress="gzip" />
+ file="js/action_link.js" type="chrome_html" />
<structure name="IDR_WEBUI_JS_ASSERT"
- file="js/assert.js" type="chrome_html" compress="gzip" />
+ file="js/assert.js" type="chrome_html" />
<structure name="IDR_WEBUI_JS_PROMISE_RESOLVER"
- file="js/promise_resolver.js" type="chrome_html"
- compress="gzip" />
+ file="js/promise_resolver.js" type="chrome_html" />
<structure name="IDR_WEBUI_JS_CR"
- file="js/cr.js" type="chrome_html" compress="gzip" />
+ file="js/cr.js" type="chrome_html" />
<structure name="IDR_WEBUI_JS_CR_M_JS"
- file="js/cr.m.js" type="chrome_html" compress="gzip" />
+ file="js/cr.m.js" type="chrome_html" />
<structure name="IDR_WEBUI_JS_CR_EVENT_TARGET"
- file="js/cr/event_target.js" type="chrome_html"
- compress="gzip" />
+ file="js/cr/event_target.js" type="chrome_html" />
<structure name="IDR_WEBUI_JS_CR_UI"
- file="js/cr/ui.js" type="chrome_html" compress="gzip" />
+ 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" compress="gzip" flattenhtml="true" />
+ type="chrome_html" flattenhtml="true" />
<structure name="IDR_WEBUI_JS_CR_UI_BUBBLE"
- file="js/cr/ui/bubble.js" type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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" compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_JS_CR_UI_CONTROLLED_INDICATOR"
- file="js/cr/ui/controlled_indicator.js" type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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" compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_JS_CR_UI_FOCUS_ROW"
- file="js/cr/ui/focus_row.js" type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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" compress="gzip" />
+ 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"
- compress="gzip" />
+ 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" compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_JS_CR_UI_LIST_SELECTION_MODEL"
file="js/cr/ui/list_selection_model.js"
- type="chrome_html" compress="gzip" />
+ 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" compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_JS_CR_UI_MENU"
- file="js/cr/ui/menu.js" type="chrome_html" compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ 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" compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_JS_CR_UI_STORE_CLENT"
file="js/cr/ui/store_client.js"
- type="chrome_html" compress="gzip" />
+ type="chrome_html" />
<if expr="chromeos">
<structure name="IDR_WEBUI_JS_CR_UI_GRID"
- file="js/cr/ui/grid.js" type="chrome_html" compress="gzip" />
+ 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" compress="gzip" />
+ 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" compress="gzip" />
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ file="js/event_tracker.js" type="chrome_html" />
<structure name="IDR_WEBUI_JS_ICON"
- file="js/icon.js" type="chrome_html" compress="gzip"
+ 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" compress="gzip" />
+ type="chrome_html" />
<structure name="IDR_WEBUI_JS_LOAD_TIME_DATA"
- file="js/load_time_data.js" type="chrome_html"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ file="js/parse_html_subset.js" type="chrome_html" />
<structure name="IDR_WEBUI_JS_TEST_LOADER"
- file="js/test_loader.js" type="chrome_html"
- compress="gzip"/>
+ file="js/test_loader.js" type="chrome_html"/>
<structure name="IDR_WEBUI_JS_UTIL"
- file="js/util.js" type="chrome_html" compress="gzip"
+ 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"
- compress="gzip" />
+ 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"
- compress="gzip" />
+ file="js/ios/web_ui.js" type="chrome_html" />
<structure name="IDR_WEBUI_JS_IOS_MOJO_API"
- file="js/ios/mojo_api.js" type="chrome_html"
- compress="gzip" />
+ file="js/ios/mojo_api.js" type="chrome_html" />
</if>
<if expr="not is_android and not is_ios">
<structure name="IDR_LOTTIE_LOTTIE_WORKER_MIN_JS"
file="../../../third_party/lottie/lottie_worker.min.js"
- type="chrome_html"
- compress="gzip" />
+ type="chrome_html" />
</if>
<if expr="not is_android and not is_ios">
diff --git a/chromium/ui/webui/webui_features.gni b/chromium/ui/webui/webui_features.gni
index 67892f9cee3..8ed14a40380 100644
--- a/chromium/ui/webui/webui_features.gni
+++ b/chromium/ui/webui/webui_features.gni
@@ -8,11 +8,6 @@ declare_args() {
# speed benefits at runtime (so we skip in debug builds).
optimize_webui = !is_debug
- # Enable closure type-checking for Chrome's web technology-based UI. This
- # enables the webui_closure_compile target which does a no-op without this
- # flag enabled. Requires Java.
- closure_compile = is_chromeos || is_linux || is_android
-
# Enable the WebUI version of the browser's tab strip.
enable_webui_tab_strip = is_chromeos || is_linux || is_win
}
diff --git a/chromium/ui/wm/BUILD.gn b/chromium/ui/wm/BUILD.gn
index 2281a7eaf84..65c85f5baad 100644
--- a/chromium/ui/wm/BUILD.gn
+++ b/chromium/ui/wm/BUILD.gn
@@ -69,7 +69,7 @@ jumbo_component("wm") {
"//skia",
"//ui/aura",
"//ui/base",
- "//ui/base/cursor",
+ "//ui/base/cursor:cursor_base",
"//ui/base/cursor/mojom:cursor_type",
"//ui/base/ime",
"//ui/compositor",
@@ -103,7 +103,7 @@ jumbo_static_library("test_support") {
"test/wm_test_helper.h",
]
- public_deps = [ "//ui/base/cursor" ]
+ public_deps = [ "//ui/base/cursor:cursor_base" ]
deps = [
":wm",
@@ -144,7 +144,7 @@ test("wm_unittests") {
"//testing/gtest",
"//ui/aura:test_support",
"//ui/base:test_support",
- "//ui/base/cursor",
+ "//ui/base/cursor:cursor_base",
"//ui/base/cursor/mojom:cursor_type",
"//ui/base/ime",
"//ui/compositor:test_support",
diff --git a/chromium/ui/wm/core/compound_event_filter.cc b/chromium/ui/wm/core/compound_event_filter.cc
index 62906aedc3e..12bba293428 100644
--- a/chromium/ui/wm/core/compound_event_filter.cc
+++ b/chromium/ui/wm/core/compound_event_filter.cc
@@ -110,7 +110,12 @@ void CompoundEventFilter::UpdateCursor(aura::Window* target,
return;
}
}
- cursor_client->SetCursor(cursor);
+ // For ET_MOUSE_ENTERED, force the update of the cursor because it may have
+ // changed without |cursor_client| knowing about it.
+ if (event->type() == ui::ET_MOUSE_ENTERED)
+ cursor_client->SetCursorForced(cursor);
+ else
+ cursor_client->SetCursor(cursor);
}
}
@@ -229,8 +234,10 @@ void CompoundEventFilter::OnTouchEvent(ui::TouchEvent* event) {
ShouldHideCursorOnTouch(*event)) {
aura::Window* target = static_cast<aura::Window*>(event->target());
DCHECK(target);
- if (!aura::Env::GetInstance()->IsMouseButtonDown())
+ if (!aura::Env::GetInstance()->IsMouseButtonDown()) {
SetMouseEventsEnableStateOnEvent(target, event, false);
+ SetCursorVisibilityOnEvent(target, event, false);
+ }
}
}
diff --git a/chromium/ui/wm/core/compound_event_filter_unittest.cc b/chromium/ui/wm/core/compound_event_filter_unittest.cc
index 3e1d5b4d604..51fcf0e53ec 100644
--- a/chromium/ui/wm/core/compound_event_filter_unittest.cc
+++ b/chromium/ui/wm/core/compound_event_filter_unittest.cc
@@ -127,6 +127,7 @@ TEST_F(CompoundEventFilterTest, TouchHidesCursor) {
gfx::Point(10, 10), ui::EventTimeForNow(), 0, 0);
DispatchEventUsingWindowDispatcher(&mouse0);
EXPECT_TRUE(cursor_client.IsMouseEventsEnabled());
+ EXPECT_TRUE(cursor_client.IsCursorVisible());
// This press is required for the GestureRecognizer to associate a target
// with kTouchId
@@ -134,22 +135,26 @@ TEST_F(CompoundEventFilterTest, TouchHidesCursor) {
ui::PointerDetails(ui::EventPointerType::kTouch, 1));
DispatchEventUsingWindowDispatcher(&press0);
EXPECT_FALSE(cursor_client.IsMouseEventsEnabled());
+ EXPECT_FALSE(cursor_client.IsCursorVisible());
ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(10, 10), GetTime(),
ui::PointerDetails(ui::EventPointerType::kTouch, 1));
DispatchEventUsingWindowDispatcher(&move);
EXPECT_FALSE(cursor_client.IsMouseEventsEnabled());
+ EXPECT_FALSE(cursor_client.IsCursorVisible());
ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(10, 10), GetTime(),
ui::PointerDetails(ui::EventPointerType::kTouch, 1));
DispatchEventUsingWindowDispatcher(&release);
EXPECT_FALSE(cursor_client.IsMouseEventsEnabled());
+ EXPECT_FALSE(cursor_client.IsCursorVisible());
ui::MouseEvent mouse1(ui::ET_MOUSE_MOVED, gfx::Point(10, 10),
gfx::Point(10, 10), ui::EventTimeForNow(), 0, 0);
// Move the cursor again. The cursor should be visible.
DispatchEventUsingWindowDispatcher(&mouse1);
EXPECT_TRUE(cursor_client.IsMouseEventsEnabled());
+ EXPECT_TRUE(cursor_client.IsCursorVisible());
// Now activate the window and press on it again.
ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(90, 90), GetTime(),
@@ -157,6 +162,7 @@ TEST_F(CompoundEventFilterTest, TouchHidesCursor) {
GetActivationClient(root_window())->ActivateWindow(window.get());
DispatchEventUsingWindowDispatcher(&press1);
EXPECT_FALSE(cursor_client.IsMouseEventsEnabled());
+ EXPECT_FALSE(cursor_client.IsCursorVisible());
aura::Env::GetInstance()->RemovePreTargetHandler(compound_filter.get());
}
#endif // defined(OS_CHROMEOS) || defined(OS_WIN)
diff --git a/chromium/ui/wm/core/cursor_manager.cc b/chromium/ui/wm/core/cursor_manager.cc
index 5f5200af888..99a14dacbd9 100644
--- a/chromium/ui/wm/core/cursor_manager.cc
+++ b/chromium/ui/wm/core/cursor_manager.cc
@@ -95,23 +95,17 @@ void CursorManager::ResetCursorVisibilityStateForTest() {
}
void CursorManager::SetCursor(gfx::NativeCursor cursor) {
- bool previously_visible = GetCursor().type() != ui::mojom::CursorType::kNone;
- state_on_unlock_->set_cursor(cursor);
- if (cursor_lock_count_ == 0 &&
- GetCursor() != state_on_unlock_->cursor()) {
- delegate_->SetCursor(state_on_unlock_->cursor(), this);
- bool is_visible = cursor.type() != ui::mojom::CursorType::kNone;
- if (is_visible != previously_visible) {
- for (auto& observer : observers_)
- observer.OnCursorVisibilityChanged(is_visible);
- }
- }
+ SetCursorImpl(cursor, /*forced=*/false);
}
gfx::NativeCursor CursorManager::GetCursor() const {
return current_state_->cursor();
}
+void CursorManager::SetCursorForced(gfx::NativeCursor cursor) {
+ SetCursorImpl(cursor, /*forced=*/true);
+}
+
void CursorManager::ShowCursor() {
last_cursor_visibility_state_ = true;
state_on_unlock_->SetVisible(true);
@@ -254,4 +248,18 @@ void CursorManager::CommitMouseEventsEnabled(bool enabled) {
current_state_->SetMouseEventsEnabled(enabled);
}
+void CursorManager::SetCursorImpl(gfx::NativeCursor cursor, bool forced) {
+ bool previously_visible = GetCursor().type() != ui::mojom::CursorType::kNone;
+ state_on_unlock_->set_cursor(cursor);
+ if (cursor_lock_count_ == 0 &&
+ (forced || GetCursor() != state_on_unlock_->cursor())) {
+ delegate_->SetCursor(state_on_unlock_->cursor(), this);
+ bool is_visible = cursor.type() != ui::mojom::CursorType::kNone;
+ if (is_visible != previously_visible) {
+ for (auto& observer : observers_)
+ observer.OnCursorVisibilityChanged(is_visible);
+ }
+ }
+}
+
} // namespace wm
diff --git a/chromium/ui/wm/core/cursor_manager.h b/chromium/ui/wm/core/cursor_manager.h
index 87a0868b8fd..4497ea7c577 100644
--- a/chromium/ui/wm/core/cursor_manager.h
+++ b/chromium/ui/wm/core/cursor_manager.h
@@ -46,6 +46,7 @@ class WM_CORE_EXPORT CursorManager : public aura::client::CursorClient,
// Overridden from aura::client::CursorClient:
void SetCursor(gfx::NativeCursor) override;
gfx::NativeCursor GetCursor() const override;
+ void SetCursorForced(gfx::NativeCursor) override;
void ShowCursor() override;
void HideCursor() override;
bool IsCursorVisible() const override;
@@ -70,6 +71,8 @@ class WM_CORE_EXPORT CursorManager : public aura::client::CursorClient,
void CommitCursorSize(ui::CursorSize cursor_size) override;
void CommitMouseEventsEnabled(bool enabled) override;
+ void SetCursorImpl(gfx::NativeCursor cursor, bool forced);
+
std::unique_ptr<NativeCursorManager> delegate_;
// Display where the cursor is located.
diff --git a/chromium/ui/wm/core/default_activation_client.h b/chromium/ui/wm/core/default_activation_client.h
index ff7817e04da..1da55c21fe5 100644
--- a/chromium/ui/wm/core/default_activation_client.h
+++ b/chromium/ui/wm/core/default_activation_client.h
@@ -8,7 +8,6 @@
#include <vector>
#include "base/compiler_specific.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/observer_list.h"
#include "ui/aura/window_observer.h"
diff --git a/chromium/ui/wm/core/focus_controller_unittest.cc b/chromium/ui/wm/core/focus_controller_unittest.cc
index 9bc998639a0..5ae62683ac0 100644
--- a/chromium/ui/wm/core/focus_controller_unittest.cc
+++ b/chromium/ui/wm/core/focus_controller_unittest.cc
@@ -45,8 +45,8 @@ class FocusNotificationObserver : public ActivationChangeObserver,
activation_changed_count_(0),
focus_changed_count_(0),
reactivation_count_(0),
- reactivation_requested_window_(NULL),
- reactivation_actual_window_(NULL) {}
+ reactivation_requested_window_(nullptr),
+ reactivation_actual_window_(nullptr) {}
~FocusNotificationObserver() override {}
void ExpectCounts(int activation_changed_count, int focus_changed_count) {
@@ -260,7 +260,7 @@ class DeleteOnActivationChangeObserver : public ActivationChangeObserver,
// Overridden from WindowDeleter:
aura::Window* GetDeletedWindow() override {
- return did_delete_ ? window_ : NULL;
+ return did_delete_ ? window_ : nullptr;
}
private:
@@ -299,7 +299,7 @@ class DeleteOnLoseFocusChangeObserver
// Overridden from WindowDeleter:
aura::Window* GetDeletedWindow() override {
- return did_delete_ ? window_ : NULL;
+ return did_delete_ ? window_ : nullptr;
}
private:
@@ -338,8 +338,8 @@ class ScopedTargetFocusNotificationObserver : public FocusNotificationObserver {
}
~ScopedTargetFocusNotificationObserver() override {
if (tracker_.Contains(target_)) {
- SetActivationChangeObserver(target_, NULL);
- aura::client::SetFocusChangeObserver(target_, NULL);
+ SetActivationChangeObserver(target_, nullptr);
+ aura::client::SetFocusChangeObserver(target_, nullptr);
}
}
@@ -367,8 +367,7 @@ class SimpleEventHandler : public ui::EventHandler {
class FocusShiftingActivationObserver : public ActivationChangeObserver {
public:
explicit FocusShiftingActivationObserver(aura::Window* activated_window)
- : activated_window_(activated_window),
- shift_focus_to_(NULL) {}
+ : activated_window_(activated_window), shift_focus_to_(nullptr) {}
~FocusShiftingActivationObserver() override {}
void set_shift_focus_to(aura::Window* shift_focus_to) {
@@ -448,7 +447,7 @@ class ActivateWhileActivatingObserver : public ActivationChangeObserver {
// in tests for those FocusRules implementations.
class TestFocusRules : public BaseFocusRules {
public:
- TestFocusRules() : focus_restriction_(NULL) {}
+ TestFocusRules() : focus_restriction_(nullptr) {}
// Restricts focus and activation to this window and its child hierarchy.
void set_focus_restriction(aura::Window* focus_restriction) {
@@ -549,7 +548,7 @@ class FocusControllerTestBase : public aura::test::AuraTestBase {
void TearDown() override {
root_window()->RemovePreTargetHandler(focus_controller_.get());
aura::test::AuraTestBase::TearDown();
- test_focus_rules_ = NULL; // Owned by FocusController.
+ test_focus_rules_ = nullptr; // Owned by FocusController.
focus_controller_.reset();
}
@@ -640,21 +639,21 @@ class FocusControllerDirectTestBase : public FocusControllerTestBase {
// Overridden from FocusControllerTestBase:
void BasicFocus() override {
- EXPECT_EQ(NULL, GetFocusedWindow());
+ EXPECT_FALSE(GetFocusedWindow());
FocusWindowById(1);
EXPECT_EQ(1, GetFocusedWindowId());
FocusWindowById(2);
EXPECT_EQ(2, GetFocusedWindowId());
}
void BasicActivation() override {
- EXPECT_EQ(NULL, GetActiveWindow());
+ EXPECT_FALSE(GetActiveWindow());
ActivateWindowById(1);
EXPECT_EQ(1, GetActiveWindowId());
ActivateWindowById(2);
EXPECT_EQ(2, GetActiveWindowId());
// Verify that attempting to deactivate NULL does not crash and does not
// change activation.
- DeactivateWindow(NULL);
+ DeactivateWindow(nullptr);
EXPECT_EQ(2, GetActiveWindowId());
DeactivateWindow(GetActiveWindow());
EXPECT_EQ(1, GetActiveWindowId());
@@ -775,7 +774,7 @@ class FocusControllerDirectTestBase : public FocusControllerTestBase {
EXPECT_EQ(11, GetFocusedWindowId());
}
void FocusRulesOverride() override {
- EXPECT_EQ(NULL, GetFocusedWindow());
+ EXPECT_FALSE(GetFocusedWindow());
FocusWindowById(11);
EXPECT_EQ(11, GetFocusedWindowId());
@@ -786,7 +785,7 @@ class FocusControllerDirectTestBase : public FocusControllerTestBase {
int focused_window = IsInputEvent() ? 11 : 211;
EXPECT_EQ(focused_window, GetFocusedWindowId());
- test_focus_rules()->set_focus_restriction(NULL);
+ test_focus_rules()->set_focus_restriction(nullptr);
FocusWindowById(12);
EXPECT_EQ(12, GetFocusedWindowId());
}
@@ -805,7 +804,7 @@ class FocusControllerDirectTestBase : public FocusControllerTestBase {
EXPECT_EQ(active_window, GetActiveWindowId());
EXPECT_EQ(active_window, GetFocusedWindowId());
- test_focus_rules()->set_focus_restriction(NULL);
+ test_focus_rules()->set_focus_restriction(nullptr);
ActivateWindowById(2);
EXPECT_EQ(2, GetActiveWindowId());
EXPECT_EQ(2, GetFocusedWindowId());
@@ -840,7 +839,7 @@ class FocusControllerDirectTestBase : public FocusControllerTestBase {
// Simulate a focus reset by the ActivationChangeObserver. This should
// trigger the default setting in FocusController.
- observer->set_shift_focus_to(NULL);
+ observer->set_shift_focus_to(nullptr);
ActivateWindowById(1);
EXPECT_EQ(1, GetFocusedWindowId());
@@ -1180,16 +1179,16 @@ class FocusControllerMouseEventTest : public FocusControllerDirectTestBase {
// Tests that a handled mouse or gesture event does not trigger a window
// activation.
void IgnoreHandledEvent() {
- EXPECT_EQ(NULL, GetActiveWindow());
+ EXPECT_FALSE(GetActiveWindow());
aura::Window* w1 = root_window()->GetChildById(1);
SimpleEventHandler handler;
root_window()->AddPreTargetHandler(&handler,
ui::EventTarget::Priority::kSystem);
ui::test::EventGenerator generator(root_window(), w1);
generator.ClickLeftButton();
- EXPECT_EQ(NULL, GetActiveWindow());
+ EXPECT_FALSE(GetActiveWindow());
generator.GestureTapAt(w1->bounds().CenterPoint());
- EXPECT_EQ(NULL, GetActiveWindow());
+ EXPECT_FALSE(GetActiveWindow());
root_window()->RemovePreTargetHandler(&handler);
generator.ClickLeftButton();
EXPECT_EQ(1, GetActiveWindowId());
@@ -1278,7 +1277,7 @@ class FocusControllerImplicitTestBase : public FocusControllerTestBase {
// Overridden from FocusControllerTestBase:
void BasicFocus() override {
- EXPECT_EQ(NULL, GetFocusedWindow());
+ EXPECT_FALSE(GetFocusedWindow());
aura::Window* w211 = root_window()->GetChildById(211);
FocusWindow(w211);
@@ -1291,7 +1290,7 @@ class FocusControllerImplicitTestBase : public FocusControllerTestBase {
void BasicActivation() override {
DCHECK(!parent_) << "Activation tests don't support parent changes.";
- EXPECT_EQ(NULL, GetActiveWindow());
+ EXPECT_FALSE(GetActiveWindow());
aura::Window* w2 = root_window()->GetChildById(2);
ActivateWindow(w2);
@@ -1335,7 +1334,7 @@ class FocusControllerImplicitTestBase : public FocusControllerTestBase {
observer3.ExpectCounts(1, 1);
}
void FocusRulesOverride() override {
- EXPECT_EQ(NULL, GetFocusedWindow());
+ EXPECT_FALSE(GetFocusedWindow());
aura::Window* w211 = root_window()->GetChildById(211);
FocusWindow(w211);
EXPECT_EQ(211, GetFocusedWindowId());
@@ -1346,7 +1345,7 @@ class FocusControllerImplicitTestBase : public FocusControllerTestBase {
// it to 11.
EXPECT_EQ(11, GetFocusedWindowId());
- test_focus_rules()->set_focus_restriction(NULL);
+ test_focus_rules()->set_focus_restriction(nullptr);
}
void ActivationRulesOverride() override {
DCHECK(!parent_) << "Activation tests don't support parent changes.";
@@ -1366,7 +1365,7 @@ class FocusControllerImplicitTestBase : public FocusControllerTestBase {
EXPECT_EQ(3, GetActiveWindowId());
EXPECT_EQ(3, GetFocusedWindowId());
- test_focus_rules()->set_focus_restriction(NULL);
+ test_focus_rules()->set_focus_restriction(nullptr);
ActivateWindow(root_window()->GetChildById(2));
EXPECT_EQ(2, GetActiveWindowId());
EXPECT_EQ(2, GetFocusedWindowId());
diff --git a/chromium/ui/wm/core/transient_window_manager.cc b/chromium/ui/wm/core/transient_window_manager.cc
index 64f74e0e9e9..e5fa6ea3623 100644
--- a/chromium/ui/wm/core/transient_window_manager.cc
+++ b/chromium/ui/wm/core/transient_window_manager.cc
@@ -114,8 +114,8 @@ bool TransientWindowManager::IsStackingTransient(
TransientWindowManager::TransientWindowManager(Window* window)
: window_(window),
- transient_parent_(NULL),
- stacking_target_(NULL),
+ transient_parent_(nullptr),
+ stacking_target_(nullptr),
parent_controls_visibility_(false),
show_on_parent_visible_(false),
ignore_visibility_changed_event_(false) {
diff --git a/chromium/ui/wm/core/visibility_controller.h b/chromium/ui/wm/core/visibility_controller.h
index 0f06bdc6d65..5833ee61035 100644
--- a/chromium/ui/wm/core/visibility_controller.h
+++ b/chromium/ui/wm/core/visibility_controller.h
@@ -6,7 +6,6 @@
#define UI_WM_CORE_VISIBILITY_CONTROLLER_H_
#include "base/compiler_specific.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "ui/aura/client/visibility_client.h"
#include "ui/wm/core/wm_core_export.h"
diff --git a/chromium/ui/wm/core/window_animations.cc b/chromium/ui/wm/core/window_animations.cc
index 08477b6bc94..f55ee90238e 100644
--- a/chromium/ui/wm/core/window_animations.cc
+++ b/chromium/ui/wm/core/window_animations.cc
@@ -90,7 +90,7 @@ class HidingWindowAnimationObserverBase : public aura::WindowObserver {
auto iter = std::find(window_->parent()->children().begin(),
window_->parent()->children().end(), window_);
DCHECK(iter != window_->parent()->children().end());
- aura::Window* topmost_transient_child = NULL;
+ aura::Window* topmost_transient_child = nullptr;
for (++iter; iter != window_->parent()->children().end(); ++iter) {
if (base::Contains(transient_children, *iter))
topmost_transient_child = *iter;
@@ -128,7 +128,7 @@ class HidingWindowAnimationObserverBase : public aura::WindowObserver {
layer_owner_->root()->SuppressPaint();
window_->RemoveObserver(this);
- window_ = NULL;
+ window_ = nullptr;
}
aura::Window* window_;
@@ -410,7 +410,7 @@ class RotateHidingWindowAnimationObserver
~RotateHidingWindowAnimationObserver() override {}
// Destroys itself after |last_sequence| ends or is aborted. Does not take
- // ownership of |last_sequence|, which should not be NULL.
+ // ownership of |last_sequence|, which should not be nullptr.
void SetLastSequence(ui::LayerAnimationSequence* last_sequence) {
last_sequence->AddObserver(this);
}
@@ -436,7 +436,7 @@ void AddLayerAnimationsForRotate(aura::Window* window, bool show) {
base::TimeDelta duration = base::TimeDelta::FromMilliseconds(
kWindowAnimation_Rotate_DurationMS);
- RotateHidingWindowAnimationObserver* observer = NULL;
+ RotateHidingWindowAnimationObserver* observer = nullptr;
if (!show) {
observer = new RotateHidingWindowAnimationObserver(window);
diff --git a/chromium/ui/wm/core/window_animations.h b/chromium/ui/wm/core/window_animations.h
index 2881b15fd52..4f425caa7aa 100644
--- a/chromium/ui/wm/core/window_animations.h
+++ b/chromium/ui/wm/core/window_animations.h
@@ -95,7 +95,7 @@ WM_CORE_EXPORT bool AnimateWindow(aura::Window* window,
WindowAnimationType type);
// Returns true if window animations are disabled for |window|. Window
-// animations are enabled by default. If |window| is NULL, this just checks
+// animations are enabled by default. If |window| is nullptr, this just checks
// if the global flag disabling window animations is present.
WM_CORE_EXPORT bool WindowAnimationsDisabled(aura::Window* window);
diff --git a/chromium/ui/wm/public/scoped_tooltip_disabler.cc b/chromium/ui/wm/public/scoped_tooltip_disabler.cc
index eb2d1c53b53..9b146237663 100644
--- a/chromium/ui/wm/public/scoped_tooltip_disabler.cc
+++ b/chromium/ui/wm/public/scoped_tooltip_disabler.cc
@@ -10,7 +10,7 @@
namespace wm {
ScopedTooltipDisabler::ScopedTooltipDisabler(aura::Window* window)
- : root_(window ? window->GetRootWindow() : NULL) {
+ : root_(window ? window->GetRootWindow() : nullptr) {
if (root_) {
root_->AddObserver(this);
TooltipClient* client = GetTooltipClient(root_);
@@ -30,7 +30,7 @@ void ScopedTooltipDisabler::EnableTooltips() {
if (client)
client->SetTooltipsEnabled(true);
root_->RemoveObserver(this);
- root_ = NULL;
+ root_ = nullptr;
}
void ScopedTooltipDisabler::OnWindowDestroying(aura::Window* window) {
diff --git a/chromium/ui/wm/public/scoped_tooltip_disabler.h b/chromium/ui/wm/public/scoped_tooltip_disabler.h
index 530aafd9a4d..dd46b575a7e 100644
--- a/chromium/ui/wm/public/scoped_tooltip_disabler.h
+++ b/chromium/ui/wm/public/scoped_tooltip_disabler.h
@@ -14,9 +14,9 @@ namespace wm {
// Use to temporarily disable tooltips.
class WM_PUBLIC_EXPORT ScopedTooltipDisabler : aura::WindowObserver {
public:
- // Disables tooltips on |window| (does nothing if |window| is NULL). Tooltips
- // are reenabled from the destructor when there are no most outstanding
- // ScopedTooltipDisablers for |window|.
+ // Disables tooltips on |window| (does nothing if |window| is nullptr).
+ // Tooltips are re-enabled from the destructor when there are no most
+ // outstanding ScopedTooltipDisablers for |window|.
explicit ScopedTooltipDisabler(aura::Window* window);
~ScopedTooltipDisabler() override;
@@ -27,7 +27,7 @@ class WM_PUBLIC_EXPORT ScopedTooltipDisabler : aura::WindowObserver {
// aura::WindowObserver:
void OnWindowDestroying(aura::Window* window) override;
- // The RootWindow to disable Tooltips on; NULL if the Window passed to the
+ // The RootWindow to disable Tooltips on; nullptr if the Window passed to the
// constructor was not in a root or the root has been destroyed.
aura::Window* root_;