@airtable/blocks 1.8.0 → 1.10.0-experimental-48096ae-20211116
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -1
- package/dist/cjs/color_utils.js +2 -1
- package/dist/cjs/colors.js +2 -1
- package/dist/cjs/error_utils.js +19 -1
- package/dist/cjs/event_tracker.js +2 -1
- package/dist/cjs/global_config.js +2 -1
- package/dist/cjs/index.js +2 -1
- package/dist/cjs/injected/airtable_interface.js +2 -1
- package/dist/cjs/models/abstract_model.js +2 -1
- package/dist/cjs/models/abstract_model_with_async_data.js +2 -1
- package/dist/cjs/models/base.js +18 -6
- package/dist/cjs/models/create_aggregators.js +2 -1
- package/dist/cjs/models/cursor.js +4 -1
- package/dist/cjs/models/field.js +148 -28
- package/dist/cjs/models/grouped_record_query_result.js +7 -15
- package/dist/cjs/models/linked_records_query_result.js +77 -28
- package/dist/cjs/models/models.js +2 -1
- package/dist/cjs/models/mutation_constants.js +5 -2
- package/dist/cjs/models/mutations.js +69 -177
- package/dist/cjs/models/object_pool.js +2 -1
- package/dist/cjs/models/query_manager.js +328 -0
- package/dist/cjs/models/record.js +310 -56
- package/dist/cjs/models/record_coloring.js +2 -1
- package/dist/cjs/models/record_query_result.js +6 -2
- package/dist/cjs/models/record_store.js +556 -766
- package/dist/cjs/models/session.js +2 -1
- package/dist/cjs/models/table.js +24 -14
- package/dist/cjs/models/table_or_view_query_result.js +482 -415
- package/dist/cjs/models/view.js +2 -1
- package/dist/cjs/models/view_data_store.js +245 -296
- package/dist/cjs/models/view_metadata_query_result.js +2 -1
- package/dist/cjs/perform_record_action.js +2 -1
- package/dist/cjs/private_utils.js +52 -1
- package/dist/cjs/sdk.js +13 -2
- package/dist/cjs/settings_button.js +2 -1
- package/dist/cjs/stats/block_stats.js +2 -1
- package/dist/cjs/testing/abstract_mock_airtable_interface.js +367 -0
- package/dist/cjs/types/aggregators.js +2 -1
- package/dist/cjs/types/airtable_interface.js +2 -1
- package/dist/cjs/types/attachment.js +2 -1
- package/dist/cjs/types/backend_fetch_types.js +2 -1
- package/dist/cjs/types/base.js +2 -1
- package/dist/cjs/types/block.js +2 -1
- package/dist/cjs/types/block_query_spec.js +86 -0
- package/dist/cjs/types/collaborator.js +2 -1
- package/dist/cjs/types/cursor.js +2 -1
- package/dist/cjs/types/field.js +2 -1
- package/dist/cjs/types/global_config.js +2 -1
- package/dist/cjs/types/mutations.js +3 -1
- package/dist/cjs/types/permission_levels.js +2 -1
- package/dist/cjs/types/record.js +2 -1
- package/dist/cjs/types/record_action_data.js +2 -1
- package/dist/cjs/types/stat.js +2 -1
- package/dist/cjs/types/table.js +2 -1
- package/dist/cjs/types/undo_redo.js +2 -1
- package/dist/cjs/types/view.js +2 -1
- package/dist/cjs/types/viewport.js +2 -1
- package/dist/cjs/ui/base_provider.js +2 -1
- package/dist/cjs/ui/baymax_utils.js +2 -1
- package/dist/cjs/ui/block_wrapper.js +2 -1
- package/dist/cjs/ui/box.js +2 -1
- package/dist/cjs/ui/button.js +2 -1
- package/dist/cjs/ui/cell_renderer.js +2 -1
- package/dist/cjs/ui/choice_token.js +2 -1
- package/dist/cjs/ui/collaborator_token.js +2 -1
- package/dist/cjs/ui/color_palette.js +2 -1
- package/dist/cjs/ui/color_palette_synced.js +2 -1
- package/dist/cjs/ui/confirmation_dialog.js +2 -1
- package/dist/cjs/ui/control_sizes.js +2 -1
- package/dist/cjs/ui/create_detect_element_resize.js +2 -1
- package/dist/cjs/ui/css_helpers.js +2 -1
- package/dist/cjs/ui/dialog.js +2 -1
- package/dist/cjs/ui/dialog_close_button.js +2 -1
- package/dist/cjs/ui/expand_record.js +2 -1
- package/dist/cjs/ui/expand_record_list.js +2 -1
- package/dist/cjs/ui/expand_record_picker_async.js +2 -1
- package/dist/cjs/ui/field_icon.js +2 -1
- package/dist/cjs/ui/field_picker.js +2 -1
- package/dist/cjs/ui/field_picker_synced.js +2 -1
- package/dist/cjs/ui/form_field.js +2 -1
- package/dist/cjs/ui/geometry/geometry.js +2 -1
- package/dist/cjs/ui/geometry/point.js +2 -1
- package/dist/cjs/ui/geometry/rect.js +2 -1
- package/dist/cjs/ui/geometry/size.js +2 -1
- package/dist/cjs/ui/global_alert.js +2 -1
- package/dist/cjs/ui/global_config_synced_component_helpers.js +2 -1
- package/dist/cjs/ui/heading.js +2 -1
- package/dist/cjs/ui/icon.js +2 -1
- package/dist/cjs/ui/icon_config.js +6 -3
- package/dist/cjs/ui/initialize_block.js +2 -1
- package/dist/cjs/ui/input.js +2 -1
- package/dist/cjs/ui/input_synced.js +2 -1
- package/dist/cjs/ui/key_codes.js +2 -1
- package/dist/cjs/ui/label.js +2 -1
- package/dist/cjs/ui/link.js +2 -1
- package/dist/cjs/ui/loader.js +2 -1
- package/dist/cjs/ui/modal.js +2 -1
- package/dist/cjs/ui/model_picker_select.js +2 -1
- package/dist/cjs/ui/popover.js +2 -1
- package/dist/cjs/ui/progress_bar.js +2 -1
- package/dist/cjs/ui/record_card.js +2 -1
- package/dist/cjs/ui/record_card_list.js +2 -1
- package/dist/cjs/ui/remote_utils.js +2 -1
- package/dist/cjs/ui/sdk_context.js +2 -1
- package/dist/cjs/ui/select.js +2 -1
- package/dist/cjs/ui/select_and_select_buttons_helpers.js +2 -1
- package/dist/cjs/ui/select_buttons.js +2 -1
- package/dist/cjs/ui/select_buttons_synced.js +2 -1
- package/dist/cjs/ui/select_synced.js +2 -1
- package/dist/cjs/ui/switch.js +2 -1
- package/dist/cjs/ui/switch_synced.js +2 -1
- package/dist/cjs/ui/synced.js +2 -1
- package/dist/cjs/ui/system/all_styles_set.js +2 -1
- package/dist/cjs/ui/system/appearance/appearance_set.js +2 -1
- package/dist/cjs/ui/system/appearance/background_color.js +2 -1
- package/dist/cjs/ui/system/appearance/border.js +2 -1
- package/dist/cjs/ui/system/appearance/border_radius.js +2 -1
- package/dist/cjs/ui/system/appearance/box_shadow.js +2 -1
- package/dist/cjs/ui/system/appearance/opacity.js +2 -1
- package/dist/cjs/ui/system/dimensions/dimensions_set.js +2 -1
- package/dist/cjs/ui/system/dimensions/height.js +2 -1
- package/dist/cjs/ui/system/dimensions/max_height.js +2 -1
- package/dist/cjs/ui/system/dimensions/max_width.js +2 -1
- package/dist/cjs/ui/system/dimensions/min_height.js +2 -1
- package/dist/cjs/ui/system/dimensions/min_width.js +2 -1
- package/dist/cjs/ui/system/dimensions/width.js +2 -1
- package/dist/cjs/ui/system/display.js +2 -1
- package/dist/cjs/ui/system/flex_container/align_content.js +2 -1
- package/dist/cjs/ui/system/flex_container/align_items.js +2 -1
- package/dist/cjs/ui/system/flex_container/flex_container_set.js +2 -1
- package/dist/cjs/ui/system/flex_container/flex_direction.js +2 -1
- package/dist/cjs/ui/system/flex_container/flex_wrap.js +2 -1
- package/dist/cjs/ui/system/flex_container/justify_content.js +2 -1
- package/dist/cjs/ui/system/flex_container/justify_items.js +2 -1
- package/dist/cjs/ui/system/flex_item/align_self.js +2 -1
- package/dist/cjs/ui/system/flex_item/flex.js +2 -1
- package/dist/cjs/ui/system/flex_item/flex_basis.js +2 -1
- package/dist/cjs/ui/system/flex_item/flex_grow.js +2 -1
- package/dist/cjs/ui/system/flex_item/flex_item_set.js +2 -1
- package/dist/cjs/ui/system/flex_item/flex_shrink.js +2 -1
- package/dist/cjs/ui/system/flex_item/justify_self.js +2 -1
- package/dist/cjs/ui/system/flex_item/order.js +2 -1
- package/dist/cjs/ui/system/index.js +2 -1
- package/dist/cjs/ui/system/overflow.js +2 -1
- package/dist/cjs/ui/system/position/bottom.js +2 -1
- package/dist/cjs/ui/system/position/left.js +2 -1
- package/dist/cjs/ui/system/position/position.js +2 -1
- package/dist/cjs/ui/system/position/position_set.js +2 -1
- package/dist/cjs/ui/system/position/right.js +2 -1
- package/dist/cjs/ui/system/position/top.js +2 -1
- package/dist/cjs/ui/system/position/z_index.js +2 -1
- package/dist/cjs/ui/system/spacing/margin.js +2 -1
- package/dist/cjs/ui/system/spacing/padding.js +2 -1
- package/dist/cjs/ui/system/spacing/spacing_set.js +2 -1
- package/dist/cjs/ui/system/typography/font_family.js +2 -1
- package/dist/cjs/ui/system/typography/font_size.js +2 -1
- package/dist/cjs/ui/system/typography/font_style.js +2 -1
- package/dist/cjs/ui/system/typography/font_weight.js +2 -1
- package/dist/cjs/ui/system/typography/letter_spacing.js +2 -1
- package/dist/cjs/ui/system/typography/line_height.js +2 -1
- package/dist/cjs/ui/system/typography/text_align.js +2 -1
- package/dist/cjs/ui/system/typography/text_color.js +2 -1
- package/dist/cjs/ui/system/typography/text_decoration.js +2 -1
- package/dist/cjs/ui/system/typography/text_transform.js +2 -1
- package/dist/cjs/ui/system/typography/typography_set.js +2 -1
- package/dist/cjs/ui/system/utils/create_responsive_prop_type.js +2 -1
- package/dist/cjs/ui/system/utils/create_style_prop_types.js +2 -1
- package/dist/cjs/ui/system/utils/csstype.js +2 -1
- package/dist/cjs/ui/system/utils/ensure_numbers_are_within_scale.js +2 -1
- package/dist/cjs/ui/system/utils/get_style_props_for_responsive_prop.js +2 -1
- package/dist/cjs/ui/system/utils/types.js +2 -1
- package/dist/cjs/ui/table_picker.js +2 -1
- package/dist/cjs/ui/table_picker_synced.js +2 -1
- package/dist/cjs/ui/text.js +2 -1
- package/dist/cjs/ui/text_button.js +2 -1
- package/dist/cjs/ui/theme/default_theme/button_variants.js +2 -1
- package/dist/cjs/ui/theme/default_theme/control_sizes.js +2 -1
- package/dist/cjs/ui/theme/default_theme/heading_styles.js +2 -1
- package/dist/cjs/ui/theme/default_theme/index.js +2 -1
- package/dist/cjs/ui/theme/default_theme/input_variants.js +2 -1
- package/dist/cjs/ui/theme/default_theme/link_variants.js +2 -1
- package/dist/cjs/ui/theme/default_theme/select_buttons_variants.js +2 -1
- package/dist/cjs/ui/theme/default_theme/select_variants.js +2 -1
- package/dist/cjs/ui/theme/default_theme/switch_variants.js +2 -1
- package/dist/cjs/ui/theme/default_theme/text_button_variants.js +2 -1
- package/dist/cjs/ui/theme/default_theme/text_styles.js +2 -1
- package/dist/cjs/ui/theme/default_theme/tokens.js +2 -1
- package/dist/cjs/ui/theme/theme_context.js +2 -1
- package/dist/cjs/ui/theme/use_theme.js +2 -1
- package/dist/cjs/ui/tooltip.js +2 -1
- package/dist/cjs/ui/types/aria_props.js +2 -1
- package/dist/cjs/ui/types/data_attributes_prop.js +2 -1
- package/dist/cjs/ui/types/tooltip_anchor_props.js +2 -1
- package/dist/cjs/ui/ui.js +2 -1
- package/dist/cjs/ui/unstable_standalone_ui.js +2 -1
- package/dist/cjs/ui/use_array_identity.js +2 -1
- package/dist/cjs/ui/use_base.js +2 -1
- package/dist/cjs/ui/use_cursor.js +2 -1
- package/dist/cjs/ui/use_form_field.js +2 -1
- package/dist/cjs/ui/use_global_config.js +3 -2
- package/dist/cjs/ui/use_loadable.js +2 -1
- package/dist/cjs/ui/use_record_action_data.js +2 -1
- package/dist/cjs/ui/use_records.js +7 -2
- package/dist/cjs/ui/use_session.js +2 -1
- package/dist/cjs/ui/use_settings_button.js +2 -1
- package/dist/cjs/ui/use_styled_system.js +2 -1
- package/dist/cjs/ui/use_synced.js +2 -1
- package/dist/cjs/ui/use_text_color_for_background_color.js +2 -1
- package/dist/cjs/ui/use_view_metadata.js +2 -1
- package/dist/cjs/ui/use_viewport.js +2 -1
- package/dist/cjs/ui/use_watchable.js +2 -1
- package/dist/cjs/ui/view_picker.js +2 -1
- package/dist/cjs/ui/view_picker_synced.js +2 -1
- package/dist/cjs/ui/viewport_constraint.js +2 -1
- package/dist/cjs/ui/with_hooks.js +2 -1
- package/dist/cjs/ui/with_styled_system.js +2 -1
- package/dist/cjs/undo_redo.js +2 -1
- package/dist/cjs/unstable_private_utils.js +2 -1
- package/dist/cjs/unstable_testing_utils.js +3 -2
- package/dist/cjs/viewport.js +2 -1
- package/dist/cjs/warning.js +2 -1
- package/dist/cjs/watchable.js +125 -72
- package/dist/types/src/models/base.d.ts +10 -3
- package/dist/types/src/models/base.d.ts.map +1 -1
- package/dist/types/src/models/cursor.d.ts +2 -0
- package/dist/types/src/models/cursor.d.ts.map +1 -1
- package/dist/types/src/models/field.d.ts +65 -1
- package/dist/types/src/models/field.d.ts.map +1 -1
- package/dist/types/src/models/grouped_record_query_result.d.ts +3 -3
- package/dist/types/src/models/grouped_record_query_result.d.ts.map +1 -1
- package/dist/types/src/models/linked_records_query_result.d.ts.map +1 -1
- package/dist/types/src/models/mutation_constants.d.ts +1 -0
- package/dist/types/src/models/mutation_constants.d.ts.map +1 -1
- package/dist/types/src/models/mutations.d.ts.map +1 -1
- package/dist/types/src/models/query_manager.d.ts +2 -0
- package/dist/types/src/models/query_manager.d.ts.map +1 -0
- package/dist/types/src/models/record.d.ts +12 -3
- package/dist/types/src/models/record.d.ts.map +1 -1
- package/dist/types/src/models/record_query_result.d.ts +3 -2
- package/dist/types/src/models/record_query_result.d.ts.map +1 -1
- package/dist/types/src/models/record_store.d.ts.map +1 -1
- package/dist/types/src/models/table.d.ts +8 -4
- package/dist/types/src/models/table.d.ts.map +1 -1
- package/dist/types/src/models/table_or_view_query_result.d.ts +3 -5
- package/dist/types/src/models/table_or_view_query_result.d.ts.map +1 -1
- package/dist/types/src/models/view_data_store.d.ts +0 -1
- package/dist/types/src/models/view_data_store.d.ts.map +1 -1
- package/dist/types/src/models/view_metadata_query_result.d.ts +1 -1
- package/dist/types/src/models/view_metadata_query_result.d.ts.map +1 -1
- package/dist/types/src/private_utils.d.ts +30 -1
- package/dist/types/src/private_utils.d.ts.map +1 -1
- package/dist/types/src/sdk.d.ts.map +1 -1
- package/dist/types/src/testing/{mock_airtable_interface.d.ts → abstract_mock_airtable_interface.d.ts} +20 -15
- package/dist/types/src/testing/abstract_mock_airtable_interface.d.ts.map +1 -0
- package/dist/types/src/types/airtable_interface.d.ts +48 -20
- package/dist/types/src/types/airtable_interface.d.ts.map +1 -1
- package/dist/types/src/types/block_query_spec.d.ts +139 -0
- package/dist/types/src/types/block_query_spec.d.ts.map +1 -0
- package/dist/types/src/types/field.d.ts +80 -44
- package/dist/types/src/types/field.d.ts.map +1 -1
- package/dist/types/src/types/mutations.d.ts +31 -3
- package/dist/types/src/types/mutations.d.ts.map +1 -1
- package/dist/types/src/types/table.d.ts +0 -2
- package/dist/types/src/types/table.d.ts.map +1 -1
- package/dist/types/src/types/view.d.ts +3 -8
- package/dist/types/src/types/view.d.ts.map +1 -1
- package/dist/types/src/ui/cell_renderer.d.ts +1 -1
- package/dist/types/src/ui/color_palette.d.ts +1 -1
- package/dist/types/src/ui/control_sizes.d.ts +1 -1
- package/dist/types/src/ui/field_icon.d.ts +1 -1
- package/dist/types/src/ui/heading.d.ts +1 -1
- package/dist/types/src/ui/icon.d.ts +1 -1
- package/dist/types/src/ui/icon_config.d.ts +33 -31
- package/dist/types/src/ui/icon_config.d.ts.map +1 -1
- package/dist/types/src/ui/input.d.ts +10 -10
- package/dist/types/src/ui/link.d.ts +1 -1
- package/dist/types/src/ui/link.d.ts.map +1 -1
- package/dist/types/src/ui/record_card.d.ts +1 -1
- package/dist/types/src/ui/system/utils/create_style_prop_types.d.ts +1 -1
- package/dist/types/src/ui/system/utils/create_style_prop_types.d.ts.map +1 -1
- package/dist/types/src/ui/text.d.ts +1 -1
- package/dist/types/src/ui/theme/default_theme/index.d.ts +1 -1
- package/dist/types/src/ui/theme/theme_context.d.ts +1 -1
- package/dist/types/src/ui/theme/use_theme.d.ts +1 -1
- package/dist/types/src/ui/use_global_config.d.ts +1 -1
- package/dist/types/src/unstable_testing_utils.d.ts +1 -1
- package/dist/types/src/unstable_testing_utils.d.ts.map +1 -1
- package/dist/types/src/watchable.d.ts.map +1 -1
- package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts +121 -0
- package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts.map +1 -0
- package/dist/types/test/airtable_interface_mocks/linked_records.d.ts +2 -2
- package/dist/types/test/airtable_interface_mocks/linked_records.d.ts.map +1 -1
- package/dist/types/test/airtable_interface_mocks/{mock_airtable_interface_internal.d.ts → mock_airtable_interface.d.ts} +26 -18
- package/dist/types/test/airtable_interface_mocks/mock_airtable_interface.d.ts.map +1 -0
- package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts +51 -0
- package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts.map +1 -0
- package/dist/types/test/airtable_interface_mocks/project_tracker.d.ts +2 -2
- package/dist/types/test/airtable_interface_mocks/project_tracker.d.ts.map +1 -1
- package/dist/types/test/test_helpers.d.ts +2 -0
- package/dist/types/test/test_helpers.d.ts.map +1 -1
- package/package.json +2 -1
- package/dist/cjs/testing/mock_airtable_interface.js +0 -317
- package/dist/types/src/testing/mock_airtable_interface.d.ts.map +0 -1
- package/dist/types/test/airtable_interface_mocks/mock_airtable_interface_internal.d.ts.map +0 -1
|
@@ -6,12 +6,20 @@ require("core-js/modules/es.symbol");
|
|
|
6
6
|
|
|
7
7
|
require("core-js/modules/es.symbol.description");
|
|
8
8
|
|
|
9
|
+
require("core-js/modules/es.array.concat");
|
|
10
|
+
|
|
11
|
+
require("core-js/modules/es.array.filter");
|
|
12
|
+
|
|
13
|
+
require("core-js/modules/es.array.includes");
|
|
14
|
+
|
|
9
15
|
require("core-js/modules/es.array.iterator");
|
|
10
16
|
|
|
11
17
|
require("core-js/modules/es.object.to-string");
|
|
12
18
|
|
|
13
19
|
require("core-js/modules/es.promise");
|
|
14
20
|
|
|
21
|
+
require("core-js/modules/es.string.includes");
|
|
22
|
+
|
|
15
23
|
require("core-js/modules/es.string.starts-with");
|
|
16
24
|
|
|
17
25
|
require("core-js/modules/web.dom-collections.iterator");
|
|
@@ -29,9 +37,11 @@ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/cl
|
|
|
29
37
|
|
|
30
38
|
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
31
39
|
|
|
40
|
+
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
|
|
41
|
+
|
|
32
42
|
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
33
43
|
|
|
34
|
-
var
|
|
44
|
+
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
|
|
35
45
|
|
|
36
46
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
37
47
|
|
|
@@ -47,6 +57,8 @@ var _error_utils = require("../error_utils");
|
|
|
47
57
|
|
|
48
58
|
var _color_utils = _interopRequireDefault(require("../color_utils"));
|
|
49
59
|
|
|
60
|
+
var _block_query_spec = require("../types/block_query_spec");
|
|
61
|
+
|
|
50
62
|
var _abstract_model = _interopRequireDefault(require("./abstract_model"));
|
|
51
63
|
|
|
52
64
|
var _object_pool = _interopRequireDefault(require("./object_pool"));
|
|
@@ -80,6 +92,23 @@ var WatchableColorInViewKeyPrefix = 'colorInView:';
|
|
|
80
92
|
* - `'colorInView:' + someViewId`
|
|
81
93
|
*/
|
|
82
94
|
|
|
95
|
+
function _isKeySubscribeableViaRecordQuery(key) {
|
|
96
|
+
switch (key) {
|
|
97
|
+
case WatchableRecordKeys.name:
|
|
98
|
+
case WatchableRecordKeys.commentCount:
|
|
99
|
+
case WatchableRecordKeys.cellValues:
|
|
100
|
+
return true;
|
|
101
|
+
|
|
102
|
+
default:
|
|
103
|
+
if (key.startsWith(WatchableCellValueInFieldKeyPrefix)) {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
83
112
|
/**
|
|
84
113
|
* Model class representing a record in a table.
|
|
85
114
|
*
|
|
@@ -88,6 +117,8 @@ var WatchableColorInViewKeyPrefix = 'colorInView:';
|
|
|
88
117
|
*
|
|
89
118
|
* @docsPath models/Record
|
|
90
119
|
*/
|
|
120
|
+
|
|
121
|
+
|
|
91
122
|
var Record =
|
|
92
123
|
/*#__PURE__*/
|
|
93
124
|
function (_AbstractModel) {
|
|
@@ -115,9 +146,16 @@ function (_AbstractModel) {
|
|
|
115
146
|
_this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Record).call(this, sdk, recordId));
|
|
116
147
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_parentRecordStore", void 0);
|
|
117
148
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_parentTable", void 0);
|
|
149
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_queryManager", void 0);
|
|
118
150
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "__linkedRecordsQueryResultPool", void 0);
|
|
151
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_onRecordColorChange", (viewDataStore, key, recordIds) => {
|
|
152
|
+
if (recordIds.includes(_this.id)) {
|
|
153
|
+
_this._onChange(WatchableColorInViewKeyPrefix + viewDataStore.viewId);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
119
156
|
_this._parentRecordStore = parentRecordStore;
|
|
120
157
|
_this._parentTable = parentTable;
|
|
158
|
+
_this._queryManager = sdk._queryManager;
|
|
121
159
|
_this.__linkedRecordsQueryResultPool = new _object_pool.default(_linked_records_query_result.default);
|
|
122
160
|
return _this;
|
|
123
161
|
}
|
|
@@ -127,6 +165,33 @@ function (_AbstractModel) {
|
|
|
127
165
|
|
|
128
166
|
|
|
129
167
|
(0, _createClass2.default)(Record, [{
|
|
168
|
+
key: "_assertExistsAndLoaded",
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* @internal
|
|
172
|
+
*/
|
|
173
|
+
value: function _assertExistsAndLoaded() {
|
|
174
|
+
// Access data in order to throw if the Record has been deleted / isn't loaded
|
|
175
|
+
var data = this._dataOrNullIfDeleted;
|
|
176
|
+
|
|
177
|
+
if (data === null) {
|
|
178
|
+
throw this._spawnErrorForDeletion();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The table that this record belongs to. Should never change because records aren't moved between tables.
|
|
183
|
+
*
|
|
184
|
+
* @internal (since we may not be able to return parent model instances in the immutable models world)
|
|
185
|
+
* @example
|
|
186
|
+
* ```js
|
|
187
|
+
* import {useRecords} from '@airtable/blocks/ui';
|
|
188
|
+
* const records = useRecords(myTable);
|
|
189
|
+
* console.log(records[0].parentTable.id === myTable.id);
|
|
190
|
+
* // => true
|
|
191
|
+
* ```
|
|
192
|
+
*/
|
|
193
|
+
|
|
194
|
+
}, {
|
|
130
195
|
key: "_getFieldMatching",
|
|
131
196
|
|
|
132
197
|
/**
|
|
@@ -156,18 +221,20 @@ function (_AbstractModel) {
|
|
|
156
221
|
}, {
|
|
157
222
|
key: "_getRawCellValue",
|
|
158
223
|
value: function _getRawCellValue(field) {
|
|
159
|
-
|
|
160
|
-
|
|
224
|
+
this._assertExistsAndLoaded(); // TODO: (#proj-blocks-sdk-record-limits) Consider a new API that allows determining
|
|
225
|
+
// if the cell value is loaded + getting the cellValue in one call?
|
|
161
226
|
|
|
162
|
-
if (!cellValuesByFieldId) {
|
|
163
|
-
return null;
|
|
164
|
-
}
|
|
165
227
|
|
|
166
|
-
var
|
|
228
|
+
var isCellValueLoadedForField = this._parentRecordStore.isRecordCellValueLoadedForFieldId(this._id, field.id);
|
|
229
|
+
|
|
230
|
+
(0, _error_utils.invariant)(isCellValueLoadedForField, 'Cell value for field %s and record %s is not loaded', field.id, this._id);
|
|
231
|
+
|
|
232
|
+
var cellValue = this._parentRecordStore.getRecordCellValueByFieldId(this._id, field.id);
|
|
167
233
|
|
|
168
234
|
if (typeof cellValue === 'object' && cellValue !== null) {
|
|
169
235
|
// Copy non-primitives.
|
|
170
|
-
// TODO(
|
|
236
|
+
// TODO: (#proj-blocks-sdk-record-limits): getRecordCellValueByFieldId returns
|
|
237
|
+
// deeply frozen objects, in a later sdk version we can drop cloning deeply.
|
|
171
238
|
return (0, _private_utils.cloneDeep)(cellValue);
|
|
172
239
|
} else {
|
|
173
240
|
return cellValue;
|
|
@@ -278,9 +345,8 @@ function (_AbstractModel) {
|
|
|
278
345
|
}, {
|
|
279
346
|
key: "getCellValueAsString",
|
|
280
347
|
value: function getCellValueAsString(fieldOrFieldIdOrFieldName) {
|
|
281
|
-
var field = this._getFieldMatching(fieldOrFieldIdOrFieldName);
|
|
348
|
+
var field = this._getFieldMatching(fieldOrFieldIdOrFieldName); // getRawCellValue performs invariant check that cell value at the field is loaded
|
|
282
349
|
|
|
283
|
-
(0, _error_utils.invariant)(this._parentRecordStore.areCellValuesLoadedForFieldId(field.id), 'Cell values for field %s are not loaded', field.id);
|
|
284
350
|
|
|
285
351
|
var cellValue = this._getRawCellValue(field);
|
|
286
352
|
|
|
@@ -443,73 +509,256 @@ function (_AbstractModel) {
|
|
|
443
509
|
*/
|
|
444
510
|
|
|
445
511
|
}, {
|
|
446
|
-
key: "
|
|
512
|
+
key: "_constructBlockFieldSelectionSpec",
|
|
447
513
|
|
|
448
514
|
/**
|
|
449
515
|
* @internal
|
|
450
516
|
*/
|
|
451
|
-
value: function
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
// that we're not subscribed to).
|
|
459
|
-
this._onChange(WatchableRecordKeys.cellValues, Object.keys(cellValuesByFieldId));
|
|
460
|
-
|
|
461
|
-
if (cellValuesByFieldId[this.parentTable.primaryField.id]) {
|
|
462
|
-
this._onChange(WatchableRecordKeys.name);
|
|
517
|
+
value: function _constructBlockFieldSelectionSpec(fieldSelection) {
|
|
518
|
+
return {
|
|
519
|
+
sourceType: _block_query_spec.BlockQuerySourceType.TABLE,
|
|
520
|
+
sourceTableId: this.parentTable.id,
|
|
521
|
+
recordSelection: {
|
|
522
|
+
recordIds: [this.id],
|
|
523
|
+
fieldSelection
|
|
463
524
|
}
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* @internal
|
|
529
|
+
*/
|
|
464
530
|
|
|
465
|
-
|
|
466
|
-
|
|
531
|
+
}, {
|
|
532
|
+
key: "_findMatchingBlockSubscriptionChanges",
|
|
533
|
+
value: function _findMatchingBlockSubscriptionChanges(changes, changeTypeToMatch) {
|
|
534
|
+
return changes.filter(change => change.type === changeTypeToMatch && change.tableId === this.parentTable.id);
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* @internal
|
|
538
|
+
*/
|
|
539
|
+
|
|
540
|
+
}, {
|
|
541
|
+
key: "_constructBlockQuerySpecAndCallbackForWatchableKey",
|
|
542
|
+
value: function _constructBlockQuerySpecAndCallbackForWatchableKey(key, callbackForRegistration, context) {
|
|
543
|
+
var fieldSelectionDefinition;
|
|
544
|
+
|
|
545
|
+
var onChangeCallback = () => {
|
|
546
|
+
callbackForRegistration.call(context, this, key);
|
|
547
|
+
};
|
|
548
|
+
|
|
549
|
+
switch (key) {
|
|
550
|
+
case WatchableRecordKeys.name:
|
|
551
|
+
fieldSelectionDefinition = {
|
|
552
|
+
type: _block_query_spec.BlockFieldSelectionSpecType.SPECIFIED_FIELDS,
|
|
553
|
+
fieldIds: [this.parentTable.primaryField.id]
|
|
554
|
+
};
|
|
555
|
+
break;
|
|
556
|
+
|
|
557
|
+
case WatchableRecordKeys.commentCount:
|
|
558
|
+
fieldSelectionDefinition = {
|
|
559
|
+
type: _block_query_spec.BlockFieldSelectionSpecType.SPECIFIED_FIELDS,
|
|
560
|
+
fieldIds: [],
|
|
561
|
+
shouldIncludeCommentCount: true
|
|
562
|
+
};
|
|
563
|
+
break;
|
|
564
|
+
|
|
565
|
+
case WatchableRecordKeys.cellValues:
|
|
566
|
+
// TODO: (#proj-blocks-sdk-record-limits) In the future don't fetch all fields from table
|
|
567
|
+
// old code exhibit this behavior though: https://github.com/Hyperbase/blocks-sdk/blob/aba6fa7b7f8ccc1e364b409ca466d0281f8e9a69/packages/sdk/src/models/record.ts#L414-L416
|
|
568
|
+
// In the future a "subscribe to updates, but don't fetch more data" might be useful here.
|
|
569
|
+
fieldSelectionDefinition = {
|
|
570
|
+
type: _block_query_spec.BlockFieldSelectionSpecType.ALL_FIELDS_FROM_TABLE
|
|
571
|
+
};
|
|
572
|
+
|
|
573
|
+
onChangeCallback = changes => {
|
|
574
|
+
var modifiedCellValuesChanges = this._findMatchingBlockSubscriptionChanges(changes, _block_query_spec.BlockQuerySubscriptionChangeType.MODIFIED_CELL_VALUES_FOR_TABLE); // We do not currently simulate "on load" callback for registration
|
|
575
|
+
// but still handle it.
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
if (modifiedCellValuesChanges.length === 0) {
|
|
579
|
+
callbackForRegistration.call(context, this, key);
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
var fieldIdsModified = [];
|
|
584
|
+
var _iteratorNormalCompletion3 = true;
|
|
585
|
+
var _didIteratorError3 = false;
|
|
586
|
+
var _iteratorError3 = undefined;
|
|
587
|
+
|
|
588
|
+
try {
|
|
589
|
+
for (var _iterator3 = modifiedCellValuesChanges[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
|
|
590
|
+
var modifiedCellValuesChange = _step3.value;
|
|
591
|
+
(0, _error_utils.invariant)(modifiedCellValuesChange.type === _block_query_spec.BlockQuerySubscriptionChangeType.MODIFIED_CELL_VALUES_FOR_TABLE, 'Modified cell value change is not a supported type in record');
|
|
592
|
+
var fieldIdsByRecordId = modifiedCellValuesChange.fieldIdsByRecordId;
|
|
593
|
+
var fieldIdsForThisRecord = fieldIdsByRecordId[this.id];
|
|
594
|
+
|
|
595
|
+
if (fieldIdsForThisRecord) {
|
|
596
|
+
fieldIdsModified = fieldIdsModified.concat(fieldIdsForThisRecord);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
} catch (err) {
|
|
600
|
+
_didIteratorError3 = true;
|
|
601
|
+
_iteratorError3 = err;
|
|
602
|
+
} finally {
|
|
603
|
+
try {
|
|
604
|
+
if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
|
|
605
|
+
_iterator3.return();
|
|
606
|
+
}
|
|
607
|
+
} finally {
|
|
608
|
+
if (_didIteratorError3) {
|
|
609
|
+
throw _iteratorError3;
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
callbackForRegistration.call(context, this, key, fieldIdsModified);
|
|
615
|
+
};
|
|
616
|
+
|
|
617
|
+
break;
|
|
618
|
+
|
|
619
|
+
default:
|
|
620
|
+
// The else cases should be impossible to reach - they indicate a SDK error.
|
|
621
|
+
// istanbul ignore else
|
|
622
|
+
if (key.startsWith(WatchableCellValueInFieldKeyPrefix)) {
|
|
623
|
+
var fieldId = key.substring(WatchableCellValueInFieldKeyPrefix.length); // Assert that fieldId is validly formatted, not that it is a valid fieldId in this table
|
|
624
|
+
|
|
625
|
+
(0, _error_utils.invariant)((0, _private_utils.isFieldId)(fieldId), 'fieldId passed as watchable fieldId is not a valid format' + fieldId);
|
|
626
|
+
fieldSelectionDefinition = {
|
|
627
|
+
type: _block_query_spec.BlockFieldSelectionSpecType.SPECIFIED_FIELDS,
|
|
628
|
+
fieldIds: [fieldId]
|
|
629
|
+
};
|
|
630
|
+
|
|
631
|
+
onChangeCallback = changes => {
|
|
632
|
+
// We could check if something else changed in the changes array,
|
|
633
|
+
// but our query subscription is targeting only the field in this record
|
|
634
|
+
callbackForRegistration.call(context, this, key, fieldId);
|
|
635
|
+
};
|
|
636
|
+
} else if (key.startsWith(WatchableColorInViewKeyPrefix)) {
|
|
637
|
+
throw (0, _error_utils.spawnError)('WatchableColorInViewKeyPrefix must be handled outside of query system');
|
|
638
|
+
} else {
|
|
639
|
+
throw (0, _error_utils.spawnError)('invalid record (un)watch key %s', key);
|
|
640
|
+
}
|
|
467
641
|
|
|
468
|
-
this._onChange(WatchableCellValueInFieldKeyPrefix + fieldId, fieldId);
|
|
469
|
-
}
|
|
470
642
|
}
|
|
471
643
|
|
|
472
|
-
|
|
473
|
-
this.
|
|
644
|
+
return {
|
|
645
|
+
querySpecToSubscribeWith: this._constructBlockFieldSelectionSpec(fieldSelectionDefinition),
|
|
646
|
+
onChangeCallback
|
|
647
|
+
};
|
|
648
|
+
}
|
|
649
|
+
/** @inheritdoc */
|
|
650
|
+
|
|
651
|
+
}, {
|
|
652
|
+
key: "watch",
|
|
653
|
+
value: function watch(keys, callbackForRegistration, context) {
|
|
654
|
+
var validKeys = this._getWatchableValidKeysOrThrow(keys, 'watch');
|
|
655
|
+
|
|
656
|
+
var _iteratorNormalCompletion4 = true;
|
|
657
|
+
var _didIteratorError4 = false;
|
|
658
|
+
var _iteratorError4 = undefined;
|
|
659
|
+
|
|
660
|
+
try {
|
|
661
|
+
for (var _iterator4 = validKeys[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
|
|
662
|
+
var key = _step4.value;
|
|
663
|
+
|
|
664
|
+
if (_isKeySubscribeableViaRecordQuery(key)) {
|
|
665
|
+
var _this$_constructBlock = this._constructBlockQuerySpecAndCallbackForWatchableKey(key, callbackForRegistration, context),
|
|
666
|
+
querySpecToSubscribeWith = _this$_constructBlock.querySpecToSubscribeWith,
|
|
667
|
+
onChangeCallback = _this$_constructBlock.onChangeCallback;
|
|
668
|
+
|
|
669
|
+
this._queryManager.watchWithQuerySpec(querySpecToSubscribeWith, this, key, onChangeCallback, callbackForRegistration, context);
|
|
670
|
+
} else {
|
|
671
|
+
// fallback to regular watch logic
|
|
672
|
+
(0, _error_utils.invariant)(key.startsWith(WatchableColorInViewKeyPrefix), 'Unexpected key in watch: %s', key);
|
|
673
|
+
var viewId = key.substring(WatchableColorInViewKeyPrefix.length);
|
|
674
|
+
|
|
675
|
+
this._parentRecordStore.getViewDataStore(viewId).watch('recordColors', this._onRecordColorChange);
|
|
676
|
+
|
|
677
|
+
(0, _get2.default)((0, _getPrototypeOf2.default)(Record.prototype), "watch", this).call(this, key, callbackForRegistration, context);
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
} catch (err) {
|
|
681
|
+
_didIteratorError4 = true;
|
|
682
|
+
_iteratorError4 = err;
|
|
683
|
+
} finally {
|
|
684
|
+
try {
|
|
685
|
+
if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
|
|
686
|
+
_iterator4.return();
|
|
687
|
+
}
|
|
688
|
+
} finally {
|
|
689
|
+
if (_didIteratorError4) {
|
|
690
|
+
throw _iteratorError4;
|
|
691
|
+
}
|
|
692
|
+
}
|
|
474
693
|
}
|
|
694
|
+
|
|
695
|
+
return validKeys;
|
|
475
696
|
}
|
|
476
|
-
/**
|
|
477
|
-
* @internal
|
|
478
|
-
*/
|
|
697
|
+
/** @inheritdoc */
|
|
479
698
|
|
|
480
699
|
}, {
|
|
481
|
-
key: "
|
|
482
|
-
value: function
|
|
483
|
-
|
|
700
|
+
key: "unwatch",
|
|
701
|
+
value: function unwatch(keys, callbackForRegistration, context) {
|
|
702
|
+
// We warn instead of throw here because we used to warn instead of throw and don't
|
|
703
|
+
// want to make a breaking change.
|
|
704
|
+
var validKeys = this._getWatchableValidKeysOrThrow(keys, 'unwatch', true);
|
|
705
|
+
|
|
706
|
+
var _iteratorNormalCompletion5 = true;
|
|
707
|
+
var _didIteratorError5 = false;
|
|
708
|
+
var _iteratorError5 = undefined;
|
|
709
|
+
|
|
710
|
+
try {
|
|
711
|
+
for (var _iterator5 = validKeys[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
|
|
712
|
+
var key = _step5.value;
|
|
713
|
+
|
|
714
|
+
if (_isKeySubscribeableViaRecordQuery(key)) {
|
|
715
|
+
this._queryManager.unwatchFromQueryKey(key, callbackForRegistration, context);
|
|
716
|
+
} else {
|
|
717
|
+
// fallback to regular watch logic
|
|
718
|
+
(0, _error_utils.invariant)(key.startsWith(WatchableColorInViewKeyPrefix), 'Unexpected key in unwatch: %s', key);
|
|
719
|
+
var viewId = key.substring(WatchableColorInViewKeyPrefix.length);
|
|
720
|
+
|
|
721
|
+
this._parentRecordStore.getViewDataStore(viewId).unwatch('recordColors', this._onRecordColorChange);
|
|
722
|
+
|
|
723
|
+
(0, _get2.default)((0, _getPrototypeOf2.default)(Record.prototype), "unwatch", this).call(this, key, callbackForRegistration, context);
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
} catch (err) {
|
|
727
|
+
_didIteratorError5 = true;
|
|
728
|
+
_iteratorError5 = err;
|
|
729
|
+
} finally {
|
|
730
|
+
try {
|
|
731
|
+
if (!_iteratorNormalCompletion5 && _iterator5.return != null) {
|
|
732
|
+
_iterator5.return();
|
|
733
|
+
}
|
|
734
|
+
} finally {
|
|
735
|
+
if (_didIteratorError5) {
|
|
736
|
+
throw _iteratorError5;
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
return validKeys;
|
|
484
742
|
}
|
|
743
|
+
/** @internal */
|
|
744
|
+
|
|
485
745
|
}, {
|
|
486
746
|
key: "_dataOrNullIfDeleted",
|
|
487
747
|
get: function get() {
|
|
488
|
-
var _recordsById$this$_id;
|
|
489
|
-
|
|
490
748
|
var tableData = this._baseData.tablesById[this.parentTable.id];
|
|
491
749
|
|
|
492
750
|
if (!tableData) {
|
|
493
751
|
return null;
|
|
494
752
|
}
|
|
495
753
|
|
|
496
|
-
var
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
* The table that this record belongs to. Should never change because records aren't moved between tables.
|
|
502
|
-
*
|
|
503
|
-
* @internal (since we may not be able to return parent model instances in the immutable models world)
|
|
504
|
-
* @example
|
|
505
|
-
* ```js
|
|
506
|
-
* import {useRecords} from '@airtable/blocks/ui';
|
|
507
|
-
* const records = useRecords(myTable);
|
|
508
|
-
* console.log(records[0].parentTable.id === myTable.id);
|
|
509
|
-
* // => true
|
|
510
|
-
* ```
|
|
511
|
-
*/
|
|
754
|
+
var isRecordLoaded = this._parentRecordStore.isRecordLoaded(this._id);
|
|
755
|
+
|
|
756
|
+
(0, _error_utils.invariant)(isRecordLoaded, 'Record data is not loaded');
|
|
757
|
+
|
|
758
|
+
var isRecordDeleted = this._parentRecordStore.isRecordDeleted(this._id);
|
|
512
759
|
|
|
760
|
+
return isRecordDeleted ? null : true;
|
|
761
|
+
}
|
|
513
762
|
}, {
|
|
514
763
|
key: "parentTable",
|
|
515
764
|
get: function get() {
|
|
@@ -551,7 +800,9 @@ function (_AbstractModel) {
|
|
|
551
800
|
}, {
|
|
552
801
|
key: "commentCount",
|
|
553
802
|
get: function get() {
|
|
554
|
-
|
|
803
|
+
this._assertExistsAndLoaded();
|
|
804
|
+
|
|
805
|
+
return this._parentRecordStore.getRecordCommentCount(this._id);
|
|
555
806
|
}
|
|
556
807
|
/**
|
|
557
808
|
* The created time of this record.
|
|
@@ -567,7 +818,9 @@ function (_AbstractModel) {
|
|
|
567
818
|
}, {
|
|
568
819
|
key: "createdTime",
|
|
569
820
|
get: function get() {
|
|
570
|
-
|
|
821
|
+
this._assertExistsAndLoaded();
|
|
822
|
+
|
|
823
|
+
return this._parentRecordStore.getRecordCreatedTime(this._id);
|
|
571
824
|
}
|
|
572
825
|
}]);
|
|
573
826
|
return Record;
|
|
@@ -575,4 +828,5 @@ function (_AbstractModel) {
|
|
|
575
828
|
|
|
576
829
|
(0, _defineProperty2.default)(Record, "_className", 'Record');
|
|
577
830
|
var _default = Record;
|
|
578
|
-
exports.default = _default;
|
|
831
|
+
exports.default = _default;
|
|
832
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvcmVjb3JkLnRzIl0sIm5hbWVzIjpbIldhdGNoYWJsZVJlY29yZEtleXMiLCJPYmplY3QiLCJmcmVlemUiLCJuYW1lIiwiY29tbWVudENvdW50IiwiY2VsbFZhbHVlcyIsIldhdGNoYWJsZUNlbGxWYWx1ZUluRmllbGRLZXlQcmVmaXgiLCJXYXRjaGFibGVDb2xvckluVmlld0tleVByZWZpeCIsIl9pc0tleVN1YnNjcmliZWFibGVWaWFSZWNvcmRRdWVyeSIsImtleSIsInN0YXJ0c1dpdGgiLCJSZWNvcmQiLCJzZGsiLCJwYXJlbnRSZWNvcmRTdG9yZSIsInBhcmVudFRhYmxlIiwicmVjb3JkSWQiLCJ2aWV3RGF0YVN0b3JlIiwicmVjb3JkSWRzIiwiaW5jbHVkZXMiLCJpZCIsIl9vbkNoYW5nZSIsInZpZXdJZCIsIl9wYXJlbnRSZWNvcmRTdG9yZSIsIl9wYXJlbnRUYWJsZSIsIl9xdWVyeU1hbmFnZXIiLCJfX2xpbmtlZFJlY29yZHNRdWVyeVJlc3VsdFBvb2wiLCJPYmplY3RQb29sIiwiTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0IiwiZGF0YSIsIl9kYXRhT3JOdWxsSWZEZWxldGVkIiwiX3NwYXduRXJyb3JGb3JEZWxldGlvbiIsImZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWUiLCJfX2dldEZpZWxkTWF0Y2hpbmciLCJ2aWV3T3JWaWV3SWRPclZpZXdOYW1lIiwiX19nZXRWaWV3TWF0Y2hpbmciLCJmaWVsZCIsIl9hc3NlcnRFeGlzdHNBbmRMb2FkZWQiLCJpc0NlbGxWYWx1ZUxvYWRlZEZvckZpZWxkIiwiaXNSZWNvcmRDZWxsVmFsdWVMb2FkZWRGb3JGaWVsZElkIiwiX2lkIiwiY2VsbFZhbHVlIiwiZ2V0UmVjb3JkQ2VsbFZhbHVlQnlGaWVsZElkIiwiX2dldEZpZWxkTWF0Y2hpbmciLCJfZ2V0UmF3Q2VsbFZhbHVlIiwidHlwZSIsIkZpZWxkVHlwZSIsIk1VTFRJUExFX0xPT0tVUF9WQUxVRVMiLCJfc2RrIiwiX19haXJ0YWJsZUludGVyZmFjZSIsInNka0luaXREYXRhIiwiaXNVc2luZ05ld0xvb2t1cENlbGxWYWx1ZUZvcm1hdCIsImNlbGxWYWx1ZUZvck1pZ3JhdGlvbiIsIkFycmF5IiwiaXNBcnJheSIsImxpbmtlZFJlY29yZElkcyIsImxpbmtlZFJlY29yZElkIiwidmFsdWVzQnlMaW5rZWRSZWNvcmRJZCIsInZhbHVlIiwidiIsInB1c2giLCJ1bmRlZmluZWQiLCJhaXJ0YWJsZUludGVyZmFjZSIsImFwcEludGVyZmFjZSIsIl9fYXBwSW50ZXJmYWNlIiwiZmllbGRUeXBlUHJvdmlkZXIiLCJjb252ZXJ0Q2VsbFZhbHVlVG9TdHJpbmciLCJfZGF0YSIsImF0dGFjaG1lbnRJZCIsImF0dGFjaG1lbnRVcmwiLCJ1cmxDb25zdHJ1Y3RvciIsImdldEF0dGFjaG1lbnRDbGllbnRVcmwiLCJ2aWV3IiwiX2dldFZpZXdNYXRjaGluZyIsImdldFZpZXdEYXRhU3RvcmUiLCJnZXRSZWNvcmRDb2xvciIsImNvbG9yIiwiZ2V0Q29sb3JJblZpZXciLCJjb2xvclV0aWxzIiwiZ2V0SGV4Rm9yQ29sb3IiLCJvcHRzIiwibGlua2VkVGFibGVJZCIsIm9wdGlvbnMiLCJsaW5rZWRUYWJsZSIsImJhc2UiLCJnZXRUYWJsZUJ5SWQiLCJsaW5rZWRSZWNvcmRTdG9yZSIsIl9fZ2V0UmVjb3JkU3RvcmUiLCJub3JtYWxpemVkT3B0cyIsIlJlY29yZFF1ZXJ5UmVzdWx0IiwiX25vcm1hbGl6ZU9wdHMiLCJnZXRPYmplY3RGb3JSZXVzZSIsInF1ZXJ5UmVzdWx0Iiwic2VsZWN0TGlua2VkUmVjb3Jkc0Zyb21DZWxsIiwibG9hZERhdGFBc3luYyIsImZpZWxkU2VsZWN0aW9uIiwic291cmNlVHlwZSIsIkJsb2NrUXVlcnlTb3VyY2VUeXBlIiwiVEFCTEUiLCJzb3VyY2VUYWJsZUlkIiwicmVjb3JkU2VsZWN0aW9uIiwiY2hhbmdlcyIsImNoYW5nZVR5cGVUb01hdGNoIiwiZmlsdGVyIiwiY2hhbmdlIiwidGFibGVJZCIsImNhbGxiYWNrRm9yUmVnaXN0cmF0aW9uIiwiY29udGV4dCIsImZpZWxkU2VsZWN0aW9uRGVmaW5pdGlvbiIsIm9uQ2hhbmdlQ2FsbGJhY2siLCJjYWxsIiwiQmxvY2tGaWVsZFNlbGVjdGlvblNwZWNUeXBlIiwiU1BFQ0lGSUVEX0ZJRUxEUyIsImZpZWxkSWRzIiwicHJpbWFyeUZpZWxkIiwic2hvdWxkSW5jbHVkZUNvbW1lbnRDb3VudCIsIkFMTF9GSUVMRFNfRlJPTV9UQUJMRSIsIm1vZGlmaWVkQ2VsbFZhbHVlc0NoYW5nZXMiLCJfZmluZE1hdGNoaW5nQmxvY2tTdWJzY3JpcHRpb25DaGFuZ2VzIiwiQmxvY2tRdWVyeVN1YnNjcmlwdGlvbkNoYW5nZVR5cGUiLCJNT0RJRklFRF9DRUxMX1ZBTFVFU19GT1JfVEFCTEUiLCJsZW5ndGgiLCJmaWVsZElkc01vZGlmaWVkIiwibW9kaWZpZWRDZWxsVmFsdWVzQ2hhbmdlIiwiZmllbGRJZHNCeVJlY29yZElkIiwiZmllbGRJZHNGb3JUaGlzUmVjb3JkIiwiY29uY2F0IiwiZmllbGRJZCIsInN1YnN0cmluZyIsInF1ZXJ5U3BlY1RvU3Vic2NyaWJlV2l0aCIsIl9jb25zdHJ1Y3RCbG9ja0ZpZWxkU2VsZWN0aW9uU3BlYyIsImtleXMiLCJ2YWxpZEtleXMiLCJfZ2V0V2F0Y2hhYmxlVmFsaWRLZXlzT3JUaHJvdyIsIl9jb25zdHJ1Y3RCbG9ja1F1ZXJ5U3BlY0FuZENhbGxiYWNrRm9yV2F0Y2hhYmxlS2V5Iiwid2F0Y2hXaXRoUXVlcnlTcGVjIiwid2F0Y2giLCJfb25SZWNvcmRDb2xvckNoYW5nZSIsInVud2F0Y2hGcm9tUXVlcnlLZXkiLCJ1bndhdGNoIiwidGFibGVEYXRhIiwiX2Jhc2VEYXRhIiwidGFibGVzQnlJZCIsImlzUmVjb3JkTG9hZGVkIiwiaXNSZWNvcmREZWxldGVkIiwiZ2V0UmVjb3JkVXJsIiwiZ2V0Q2VsbFZhbHVlQXNTdHJpbmciLCJnZXRSZWNvcmRDb21tZW50Q291bnQiLCJnZXRSZWNvcmRDcmVhdGVkVGltZSIsIkFic3RyYWN0TW9kZWwi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QUs4SCxvQkFBTCxDQUEwQixLQUFLbkksV0FBTCxDQUFpQm1HLFlBQTNDLENBQVA7QUFDSDtBQUNEOzs7Ozs7Ozs7Ozs7Ozs7d0JBWTJCO0FBQ3ZCLFdBQUs3RSxzQkFBTDs7QUFFQSxhQUFPLEtBQUtkLGtCQUFMLENBQXdCNEgscUJBQXhCLENBQThDLEtBQUszRyxHQUFuRCxDQUFQO0FBQ0g7QUFDRDs7Ozs7Ozs7Ozs7Ozt3QkFVd0I7QUFDcEIsV0FBS0gsc0JBQUw7O0FBRUEsYUFBTyxLQUFLZCxrQkFBTCxDQUF3QjZILG9CQUF4QixDQUE2QyxLQUFLNUcsR0FBbEQsQ0FBUDtBQUNIOzs7RUF4WGdCNkcsdUI7OzhCQUFmekksTSxnQkFFa0IsUTtlQTJsQlRBLE0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAYWlydGFibGUvYmxvY2tzL21vZGVsczogUmVjb3JkICovIC8qKiAqL1xuaW1wb3J0IHtDb2xvcn0gZnJvbSAnLi4vY29sb3JzJztcbmltcG9ydCBTZGsgZnJvbSAnLi4vc2RrJztcbmltcG9ydCB7UmVjb3JkSWR9IGZyb20gJy4uL3R5cGVzL3JlY29yZCc7XG5pbXBvcnQge0ZpZWxkVHlwZSwgRmllbGRJZH0gZnJvbSAnLi4vdHlwZXMvZmllbGQnO1xuaW1wb3J0IHtWaWV3SWR9IGZyb20gJy4uL3R5cGVzL3ZpZXcnO1xuaW1wb3J0IHtcbiAgICBpc0VudW1WYWx1ZSxcbiAgICBjbG9uZURlZXAsXG4gICAgT2JqZWN0VmFsdWVzLFxuICAgIEZsb3dBbnlPYmplY3QsXG4gICAgRmxvd0FueUZ1bmN0aW9uLFxuICAgIGlzRmllbGRJZCxcbn0gZnJvbSAnLi4vcHJpdmF0ZV91dGlscyc7XG5pbXBvcnQge2ludmFyaWFudCwgc3Bhd25FcnJvcn0gZnJvbSAnLi4vZXJyb3JfdXRpbHMnO1xuaW1wb3J0IGNvbG9yVXRpbHMgZnJvbSAnLi4vY29sb3JfdXRpbHMnO1xuaW1wb3J0IHtcbiAgICBCbG9ja0ZpZWxkU2VsZWN0aW9uU3BlY1R5cGUsXG4gICAgQmxvY2tRdWVyeVNwZWMsXG4gICAgQmxvY2tRdWVyeVNvdXJjZVR5cGUsXG4gICAgQmxvY2tRdWVyeVN1YnNjcmlwdGlvbkNoYW5nZSxcbiAgICBCbG9ja1F1ZXJ5U3Vic2NyaXB0aW9uQ2hhbmdlVHlwZSxcbiAgICBCbG9ja1F1ZXJ5U3Vic2NyaXB0aW9uT25DaGFuZ2VDYWxsYmFjayxcbiAgICBCbG9ja0ZpZWxkU2VsZWN0aW9uU3BlYyxcbn0gZnJvbSAnLi4vdHlwZXMvYmxvY2tfcXVlcnlfc3BlYyc7XG5pbXBvcnQgQWJzdHJhY3RNb2RlbCBmcm9tICcuL2Fic3RyYWN0X21vZGVsJztcbmltcG9ydCBGaWVsZCBmcm9tICcuL2ZpZWxkJztcbmltcG9ydCBPYmplY3RQb29sIGZyb20gJy4vb2JqZWN0X3Bvb2wnO1xuaW1wb3J0IFRhYmxlIGZyb20gJy4vdGFibGUnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcbmltcG9ydCBSZWNvcmRRdWVyeVJlc3VsdCwge1JlY29yZFF1ZXJ5UmVzdWx0T3B0c30gZnJvbSAnLi9yZWNvcmRfcXVlcnlfcmVzdWx0JztcbmltcG9ydCBMaW5rZWRSZWNvcmRzUXVlcnlSZXN1bHQgZnJvbSAnLi9saW5rZWRfcmVjb3Jkc19xdWVyeV9yZXN1bHQnO1xuaW1wb3J0IFJlY29yZFN0b3JlIGZyb20gJy4vcmVjb3JkX3N0b3JlJztcbmltcG9ydCB7UXVlcnlNYW5hZ2VyfSBmcm9tICcuL3F1ZXJ5X21hbmFnZXInO1xuaW1wb3J0IFZpZXdEYXRhU3RvcmUgZnJvbSAnLi92aWV3X2RhdGFfc3RvcmUnO1xuXG5jb25zdCBXYXRjaGFibGVSZWNvcmRLZXlzID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgbmFtZTogJ25hbWUnIGFzIGNvbnN0LFxuICAgIGNvbW1lbnRDb3VudDogJ2NvbW1lbnRDb3VudCcgYXMgY29uc3QsXG4gICAgLy8gVE9ETyhrYXNyYSk6IHRoZXNlIGtleXMgZG9uJ3QgaGF2ZSBtYXRjaGluZyBnZXR0ZXJzIChub3QgdGhhdCB0aGV5IHNob3VsZFxuICAgIC8vIGl0J3MganVzdCBpbmNvbnNpc3RlbnQuLi4pXG4gICAgY2VsbFZhbHVlczogJ2NlbGxWYWx1ZXMnIGFzIGNvbnN0LFxufSk7XG4vLyBUT0RPOiBsb2FkIGNlbGwgdmFsdWVzIGluIGZpZWxkIHdoZW4gdGhpcyBpcyB3YXRjaGVkPyBUaGlzIHdpbGxcbi8vIGNhdXNlIHRoZSBDZWxsUmVuZGVyZXIgY29tcG9uZW50IHRvIGxvYWQgY2VsbCB2YWx1ZXMsIHdoaWNoIHNlZW1zIG9rYXksXG4vLyBidXQgbmVlZHMgYSBsaXR0bGUgbW9yZSB0aG91Z2h0LlxuY29uc3QgV2F0Y2hhYmxlQ2VsbFZhbHVlSW5GaWVsZEtleVByZWZpeCA9ICdjZWxsVmFsdWVJbkZpZWxkOic7XG4vLyBUT0RPOiBsb2FkIHZpZXcgZGF0YSB3aGVuIHRoaXMgaXMgd2F0Y2hlZC4gc2VlIHByZXZpb3VzIGNvbW1lbnQuXG5jb25zdCBXYXRjaGFibGVDb2xvckluVmlld0tleVByZWZpeCA9ICdjb2xvckluVmlldzonO1xuLyoqXG4gKiBBbnkga2V5IHdpdGhpbiByZWNvcmQgdGhhdCBjYW4gYmUgd2F0Y2hlZDpcbiAqIC0gYCduYW1lJ2BcbiAqIC0gYCdjb21tZW50Q291bnQnYFxuICogLSBgJ2NlbGxWYWx1ZXMnYFxuICogLSBgJ2NlbGxWYWx1ZUluRmllbGQ6JyArIHNvbWVGaWVsZElkYFxuICogLSBgJ2NvbG9ySW5WaWV3OicgKyBzb21lVmlld0lkYFxuICovXG50eXBlIFdhdGNoYWJsZVJlY29yZEtleSA9IE9iamVjdFZhbHVlczx0eXBlb2YgV2F0Y2hhYmxlUmVjb3JkS2V5cz4gfCBzdHJpbmc7XG5cbi8qKlxuICogVE9ETzogKCNwcm9qLWJsb2Nrcy1zZGstcmVjb3JkLWxpbWl0cykgUmVjb3JkIHNob3VsZCBwcm9iYWJseSBub3QgYmUgYW4gQWJzdHJhY3RNb2RlbCxcbiAqIGluIHRoZSBtZWFudGltZSBpdCB3aWxsIHJldHVybiB0cnVlIGlmIGl0J3MgbG9hZGVkLCB0aHJvd2luZy9yZXR1cm5pbmcgbnVsbFxuICogaWYgaXQncyBub3QgbG9hZGVkIChyZXR1cm5pbmcgbnVsbCAvIHRocm93aW5nIGlzIGhvdyBBYnN0cmFjdE1vZGVsIHdvcmtzKS5cbiAqL1xudHlwZSBSZWNvcmRTdG9yZUlzTG9hZGVkID0gdHJ1ZTtcblxuZnVuY3Rpb24gX2lzS2V5U3Vic2NyaWJlYWJsZVZpYVJlY29yZFF1ZXJ5KGtleTogV2F0Y2hhYmxlUmVjb3JkS2V5KTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBXYXRjaGFibGVSZWNvcmRLZXlzLm5hbWU6XG4gICAgICAgIGNhc2UgV2F0Y2hhYmxlUmVjb3JkS2V5cy5jb21tZW50Q291bnQ6XG4gICAgICAgIGNhc2UgV2F0Y2hhYmxlUmVjb3JkS2V5cy5jZWxsVmFsdWVzOlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoV2F0Y2hhYmxlQ2VsbFZhbHVlSW5GaWVsZEtleVByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogTW9kZWwgY2xhc3MgcmVwcmVzZW50aW5nIGEgcmVjb3JkIGluIGEgdGFibGUuXG4gKlxuICogRG8gbm90IGluc3RhbnRpYXRlLiBZb3UgY2FuIGdldCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBieSBjYWxsaW5nIGB0YWJsZS5zZWxlY3RSZWNvcmRzYFxuICogb3IgYHZpZXcuc2VsZWN0UmVjb3Jkc2AgYW5kIHVzaW5nIHRoZSByZXN1bHRpbmcge0BsaW5rIFJlY29yZFF1ZXJ5UmVzdWx0fS5cbiAqXG4gKiBAZG9jc1BhdGggbW9kZWxzL1JlY29yZFxuICovXG5jbGFzcyBSZWNvcmQgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsPFJlY29yZFN0b3JlSXNMb2FkZWQsIFdhdGNoYWJsZVJlY29yZEtleT4ge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBzdGF0aWMgX2NsYXNzTmFtZSA9ICdSZWNvcmQnO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBzdGF0aWMgX2lzV2F0Y2hhYmxlS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpc0VudW1WYWx1ZShXYXRjaGFibGVSZWNvcmRLZXlzLCBrZXkpIHx8XG4gICAgICAgICAgICBrZXkuc3RhcnRzV2l0aChXYXRjaGFibGVDZWxsVmFsdWVJbkZpZWxkS2V5UHJlZml4KSB8fFxuICAgICAgICAgICAga2V5LnN0YXJ0c1dpdGgoV2F0Y2hhYmxlQ29sb3JJblZpZXdLZXlQcmVmaXgpXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfcGFyZW50UmVjb3JkU3RvcmU6IFJlY29yZFN0b3JlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfcGFyZW50VGFibGU6IFRhYmxlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSBfcXVlcnlNYW5hZ2VyOiBRdWVyeU1hbmFnZXI7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9fbGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0UG9vbDogT2JqZWN0UG9vbDxcbiAgICAgICAgTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0LFxuICAgICAgICB0eXBlb2YgTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0XG4gICAgPjtcblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNkazogU2RrLCBwYXJlbnRSZWNvcmRTdG9yZTogUmVjb3JkU3RvcmUsIHBhcmVudFRhYmxlOiBUYWJsZSwgcmVjb3JkSWQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcihzZGssIHJlY29yZElkKTtcblxuICAgICAgICB0aGlzLl9wYXJlbnRSZWNvcmRTdG9yZSA9IHBhcmVudFJlY29yZFN0b3JlO1xuICAgICAgICB0aGlzLl9wYXJlbnRUYWJsZSA9IHBhcmVudFRhYmxlO1xuICAgICAgICB0aGlzLl9xdWVyeU1hbmFnZXIgPSBzZGsuX3F1ZXJ5TWFuYWdlcjtcbiAgICAgICAgdGhpcy5fX2xpbmtlZFJlY29yZHNRdWVyeVJlc3VsdFBvb2wgPSBuZXcgT2JqZWN0UG9vbChMaW5rZWRSZWNvcmRzUXVlcnlSZXN1bHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldCBfZGF0YU9yTnVsbElmRGVsZXRlZCgpOiBSZWNvcmRTdG9yZUlzTG9hZGVkIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRhYmxlRGF0YSA9IHRoaXMuX2Jhc2VEYXRhLnRhYmxlc0J5SWRbdGhpcy5wYXJlbnRUYWJsZS5pZF07XG4gICAgICAgIGlmICghdGFibGVEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc1JlY29yZExvYWRlZCA9IHRoaXMuX3BhcmVudFJlY29yZFN0b3JlLmlzUmVjb3JkTG9hZGVkKHRoaXMuX2lkKTtcbiAgICAgICAgaW52YXJpYW50KGlzUmVjb3JkTG9hZGVkLCAnUmVjb3JkIGRhdGEgaXMgbm90IGxvYWRlZCcpO1xuICAgICAgICBjb25zdCBpc1JlY29yZERlbGV0ZWQgPSB0aGlzLl9wYXJlbnRSZWNvcmRTdG9yZS5pc1JlY29yZERlbGV0ZWQodGhpcy5faWQpO1xuICAgICAgICByZXR1cm4gaXNSZWNvcmREZWxldGVkID8gbnVsbCA6IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2Fzc2VydEV4aXN0c0FuZExvYWRlZCgpOiB2b2lkIHtcbiAgICAgICAgLy8gQWNjZXNzIGRhdGEgaW4gb3JkZXIgdG8gdGhyb3cgaWYgdGhlIFJlY29yZCBoYXMgYmVlbiBkZWxldGVkIC8gaXNuJ3QgbG9hZGVkXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9kYXRhT3JOdWxsSWZEZWxldGVkO1xuICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgdGhpcy5fc3Bhd25FcnJvckZvckRlbGV0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGFibGUgdGhhdCB0aGlzIHJlY29yZCBiZWxvbmdzIHRvLiBTaG91bGQgbmV2ZXIgY2hhbmdlIGJlY2F1c2UgcmVjb3JkcyBhcmVuJ3QgbW92ZWQgYmV0d2VlbiB0YWJsZXMuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWwgKHNpbmNlIHdlIG1heSBub3QgYmUgYWJsZSB0byByZXR1cm4gcGFyZW50IG1vZGVsIGluc3RhbmNlcyBpbiB0aGUgaW1tdXRhYmxlIG1vZGVscyB3b3JsZClcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHt1c2VSZWNvcmRzfSBmcm9tICdAYWlydGFibGUvYmxvY2tzL3VpJztcbiAgICAgKiBjb25zdCByZWNvcmRzID0gdXNlUmVjb3JkcyhteVRhYmxlKTtcbiAgICAgKiBjb25zb2xlLmxvZyhyZWNvcmRzWzBdLnBhcmVudFRhYmxlLmlkID09PSBteVRhYmxlLmlkKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IHBhcmVudFRhYmxlKCk6IFRhYmxlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudFRhYmxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfZ2V0RmllbGRNYXRjaGluZyhmaWVsZE9yRmllbGRJZE9yRmllbGROYW1lOiBGaWVsZCB8IHN0cmluZyk6IEZpZWxkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50VGFibGUuX19nZXRGaWVsZE1hdGNoaW5nKGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfZ2V0Vmlld01hdGNoaW5nKHZpZXdPclZpZXdJZE9yVmlld05hbWU6IFZpZXcgfCBzdHJpbmcpOiBWaWV3IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50VGFibGUuX19nZXRWaWV3TWF0Y2hpbmcodmlld09yVmlld0lkT3JWaWV3TmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICpcbiAgICAgKiBGb3IgdXNlIHdoZW4gd2UgbmVlZCB0aGUgcmF3IHB1YmxpYyBBUEkgY2VsbCB2YWx1ZS4gU3BlY2lmaWNhbGx5IG1ha2VzIGEgZGlmZmVyZW5jZVxuICAgICAqIGZvciBsb29rdXAgZmllbGRzLCB3aGVyZSB3ZSB0cmFuc2xhdGUgdGhlIGZvcm1hdCB0byBhIGJsb2Nrcy1zcGVjaWZpYyBmb3JtYXQgaW4gZ2V0Q2VsbFZhbHVlLlxuICAgICAqIFRoYXQgZm9ybWF0IGlzIGluY29tcGF0aWJsZSB3aXRoIGZpZWxkVHlwZVByb3ZpZGVyIG1ldGhvZHMsIHdoaWNoIGV4cGVjdCB0aGUgcHVibGljIEFQSVxuICAgICAqIGZvcm1hdCAtIHVzZSBfZ2V0UmF3Q2VsbFZhbHVlIGluc3RlYWQuXG4gICAgICovXG4gICAgX2dldFJhd0NlbGxWYWx1ZShmaWVsZDogRmllbGQpOiB1bmtub3duIHtcbiAgICAgICAgdGhpcy5fYXNzZXJ0RXhpc3RzQW5kTG9hZGVkKCk7XG5cbiAgICAgICAgLy8gVE9ETzogKCNwcm9qLWJsb2Nrcy1zZGstcmVjb3JkLWxpbWl0cykgQ29uc2lkZXIgYSBuZXcgQVBJIHRoYXQgYWxsb3dzIGRldGVybWluaW5nXG4gICAgICAgIC8vIGlmIHRoZSBjZWxsIHZhbHVlIGlzIGxvYWRlZCArIGdldHRpbmcgdGhlIGNlbGxWYWx1ZSBpbiBvbmUgY2FsbD9cbiAgICAgICAgY29uc3QgaXNDZWxsVmFsdWVMb2FkZWRGb3JGaWVsZCA9IHRoaXMuX3BhcmVudFJlY29yZFN0b3JlLmlzUmVjb3JkQ2VsbFZhbHVlTG9hZGVkRm9yRmllbGRJZChcbiAgICAgICAgICAgIHRoaXMuX2lkLFxuICAgICAgICAgICAgZmllbGQuaWQsXG4gICAgICAgICk7XG4gICAgICAgIGludmFyaWFudChcbiAgICAgICAgICAgIGlzQ2VsbFZhbHVlTG9hZGVkRm9yRmllbGQsXG4gICAgICAgICAgICAnQ2VsbCB2YWx1ZSBmb3IgZmllbGQgJXMgYW5kIHJlY29yZCAlcyBpcyBub3QgbG9hZGVkJyxcbiAgICAgICAgICAgIGZpZWxkLmlkLFxuICAgICAgICAgICAgdGhpcy5faWQsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gdGhpcy5fcGFyZW50UmVjb3JkU3RvcmUuZ2V0UmVjb3JkQ2VsbFZhbHVlQnlGaWVsZElkKHRoaXMuX2lkLCBmaWVsZC5pZCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjZWxsVmFsdWUgPT09ICdvYmplY3QnICYmIGNlbGxWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ29weSBub24tcHJpbWl0aXZlcy5cbiAgICAgICAgICAgIC8vIFRPRE86ICgjcHJvai1ibG9ja3Mtc2RrLXJlY29yZC1saW1pdHMpOiBnZXRSZWNvcmRDZWxsVmFsdWVCeUZpZWxkSWQgcmV0dXJuc1xuICAgICAgICAgICAgLy8gZGVlcGx5IGZyb3plbiBvYmplY3RzLCBpbiBhIGxhdGVyIHNkayB2ZXJzaW9uIHdlIGNhbiBkcm9wIGNsb25pbmcgZGVlcGx5LlxuICAgICAgICAgICAgcmV0dXJuIGNsb25lRGVlcChjZWxsVmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNlbGxWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjZWxsIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCBmb3IgdGhpcyByZWNvcmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmllbGRPckZpZWxkSWRPckZpZWxkTmFtZSBUaGUgZmllbGQgKG9yIGZpZWxkIElEIG9yIGZpZWxkIG5hbWUpIHdob3NlIGNlbGwgdmFsdWUgeW91J2QgbGlrZSB0byBnZXQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNlbGxWYWx1ZSA9IG15UmVjb3JkLmdldENlbGxWYWx1ZShteVNpbmdsZUxpbmVUZXh0RmllbGQpO1xuICAgICAqIGNvbnNvbGUubG9nKGNlbGxWYWx1ZSk7XG4gICAgICogLy8gPT4gJ2NlbGwgdmFsdWUnXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0Q2VsbFZhbHVlKGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWU6IEZpZWxkIHwgRmllbGRJZCB8IHN0cmluZyk6IHVua25vd24ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2dldEZpZWxkTWF0Y2hpbmcoZmllbGRPckZpZWxkSWRPckZpZWxkTmFtZSk7XG4gICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHRoaXMuX2dldFJhd0NlbGxWYWx1ZShmaWVsZCk7XG5cbiAgICAgICAgLy8gSEFDSzogbWlncmF0ZSB0byBuZXcgcHVibGljIGxvb2t1cCBjZWxsIHZhbHVlIGZvcm1hdCBpZiBuZWVkZWRcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGNlbGxWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIGNlbGxWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgZmllbGQudHlwZSA9PT0gRmllbGRUeXBlLk1VTFRJUExFX0xPT0tVUF9WQUxVRVMgJiZcbiAgICAgICAgICAgICF0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZS5zZGtJbml0RGF0YS5pc1VzaW5nTmV3TG9va3VwQ2VsbFZhbHVlRm9ybWF0XG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgY2VsbFZhbHVlRm9yTWlncmF0aW9uOiBBcnJheTx7bGlua2VkUmVjb3JkSWQ6IFJlY29yZElkOyB2YWx1ZTogdW5rbm93bn0+ID0gW107XG4gICAgICAgICAgICBpbnZhcmlhbnQoQXJyYXkuaXNBcnJheSgoY2VsbFZhbHVlIGFzIGFueSkubGlua2VkUmVjb3JkSWRzKSwgJ2xpbmtlZFJlY29yZElkcycpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaW5rZWRSZWNvcmRJZCBvZiAoY2VsbFZhbHVlIGFzIGFueSkubGlua2VkUmVjb3JkSWRzKSB7XG4gICAgICAgICAgICAgICAgaW52YXJpYW50KHR5cGVvZiBsaW5rZWRSZWNvcmRJZCA9PT0gJ3N0cmluZycsICdsaW5rZWRSZWNvcmRJZCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHt2YWx1ZXNCeUxpbmtlZFJlY29yZElkfSA9IGNlbGxWYWx1ZSBhcyBhbnk7XG5cbiAgICAgICAgICAgICAgICBpbnZhcmlhbnQoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlc0J5TGlua2VkUmVjb3JkSWQgJiYgdHlwZW9mIHZhbHVlc0J5TGlua2VkUmVjb3JkSWQgPT09ICdvYmplY3QnLFxuICAgICAgICAgICAgICAgICAgICAndmFsdWVzQnlMaW5rZWRSZWNvcmRJZCcsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzQnlMaW5rZWRSZWNvcmRJZFtsaW5rZWRSZWNvcmRJZF07XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFZhbHVlRm9yTWlncmF0aW9uLnB1c2goe2xpbmtlZFJlY29yZElkLCB2YWx1ZTogdn0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2VsbFZhbHVlRm9yTWlncmF0aW9uLnB1c2goe2xpbmtlZFJlY29yZElkLCB2YWx1ZX0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjZWxsVmFsdWVGb3JNaWdyYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2VsbFZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjZWxsIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCBmb3IgdGhpcyByZWNvcmQsIGZvcm1hdHRlZCBhcyBhIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWUgVGhlIGZpZWxkIChvciBmaWVsZCBJRCBvciBmaWVsZCBuYW1lKSB3aG9zZSBjZWxsIHZhbHVlIHlvdSdkIGxpa2UgdG8gZ2V0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBzdHJpbmdWYWx1ZSA9IG15UmVjb3JkLmdldENlbGxWYWx1ZUFzU3RyaW5nKG15TnVtYmVyRmllbGQpO1xuICAgICAqIGNvbnNvbGUubG9nKHN0cmluZ1ZhbHVlKTtcbiAgICAgKiAvLyA9PiAnNDInXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0Q2VsbFZhbHVlQXNTdHJpbmcoZmllbGRPckZpZWxkSWRPckZpZWxkTmFtZTogRmllbGQgfCBGaWVsZElkIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9nZXRGaWVsZE1hdGNoaW5nKGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWUpO1xuXG4gICAgICAgIC8vIGdldFJhd0NlbGxWYWx1ZSBwZXJmb3JtcyBpbnZhcmlhbnQgY2hlY2sgdGhhdCBjZWxsIHZhbHVlIGF0IHRoZSBmaWVsZCBpcyBsb2FkZWRcbiAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gdGhpcy5fZ2V0UmF3Q2VsbFZhbHVlKGZpZWxkKTtcblxuICAgICAgICBpZiAoY2VsbFZhbHVlID09PSBudWxsIHx8IGNlbGxWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBhaXJ0YWJsZUludGVyZmFjZSA9IHRoaXMuX3Nkay5fX2FpcnRhYmxlSW50ZXJmYWNlO1xuICAgICAgICAgICAgY29uc3QgYXBwSW50ZXJmYWNlID0gdGhpcy5fc2RrLl9fYXBwSW50ZXJmYWNlO1xuICAgICAgICAgICAgcmV0dXJuIGFpcnRhYmxlSW50ZXJmYWNlLmZpZWxkVHlwZVByb3ZpZGVyLmNvbnZlcnRDZWxsVmFsdWVUb1N0cmluZyhcbiAgICAgICAgICAgICAgICBhcHBJbnRlcmZhY2UsXG4gICAgICAgICAgICAgICAgY2VsbFZhbHVlLFxuICAgICAgICAgICAgICAgIGZpZWxkLl9kYXRhLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgVVJMIHRoYXQgaXMgc3VpdGFibGUgZm9yIHJlbmRlcmluZyBhbiBhdHRhY2htZW50IG9uIHRoZSBjdXJyZW50IGNsaWVudC5cbiAgICAgKiBUaGUgVVJMIHRoYXQgaXMgcmV0dXJuZWQgd2lsbCBvbmx5IHdvcmsgZm9yIHRoZSBjdXJyZW50IHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudElkIFRoZSBJRCBvZiB0aGUgYXR0YWNobWVudC5cbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudFVybCBUaGUgYXR0YWNobWVudCdzIFVSTCAod2hpY2ggaXMgbm90IHN1aXRhYmxlIGZvciByZW5kZXJpbmcgb24gdGhlIGNsaWVudCkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBSZWNvcmRBdHRhY2htZW50cyhwcm9wcykge1xuICAgICAqICAgICBjb25zdCB7cmVjb3JkLCBhdHRhY2htZW50RmllbGR9ID0gcHJvcHM7XG4gICAgICogICAgIGNvbnN0IGF0dGFjaG1lbnRDZWxsVmFsdWUgPSByZWNvcmQuZ2V0Q2VsbFZhbHVlKGF0dGFjaG1lbnRGaWVsZCk7XG4gICAgICogICAgIGlmIChhdHRhY2htZW50Q2VsbFZhbHVlID09PSBudWxsKSB7XG4gICAgICogICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgKiAgICAgfVxuICAgICAqICAgICByZXR1cm4gKFxuICAgICAqICAgICAgICAgPGRpdj5cbiAgICAgKiAgICAgICAgICAgICB7YXR0YWNobWVudENlbGxWYWx1ZS5tYXAoYXR0YWNobWVudE9iaiA9PiB7XG4gICAgICogICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFVybCA9XG4gICAgICogICAgICAgICAgICAgICAgICAgICByZWNvcmQuZ2V0QXR0YWNobWVudENsaWVudFVybEZyb21DZWxsVmFsdWVVcmwoXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudE9iai5pZCxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50T2JqLnVybFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgKiAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIDxpbWcga2V5PXthdHRhY2htZW50T2JqLmlkfSBzcmM9e2NsaWVudFVybH0gd2lkdGg9ezIwMH0gLz5cbiAgICAgKiAgICAgICAgICAgICAgICAgKTtcbiAgICAgKiAgICAgICAgICAgICB9KX1cbiAgICAgKiAgICAgICAgIDwvZGl2PlxuICAgICAqICAgICApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXRBdHRhY2htZW50Q2xpZW50VXJsRnJvbUNlbGxWYWx1ZVVybChhdHRhY2htZW50SWQ6IHN0cmluZywgYXR0YWNobWVudFVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYWlydGFibGVJbnRlcmZhY2UgPSB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZTtcbiAgICAgICAgY29uc3QgYXBwSW50ZXJmYWNlID0gdGhpcy5fc2RrLl9fYXBwSW50ZXJmYWNlO1xuICAgICAgICByZXR1cm4gYWlydGFibGVJbnRlcmZhY2UudXJsQ29uc3RydWN0b3IuZ2V0QXR0YWNobWVudENsaWVudFVybChcbiAgICAgICAgICAgIGFwcEludGVyZmFjZSxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRJZCxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRVcmwsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbG9yIG9mIHRoaXMgcmVjb3JkIGluIGEgZ2l2ZW4gdmlldywgb3IgbnVsbCBpZiB0aGUgcmVjb3JkIGhhcyBubyBjb2xvciBpbiB0aGF0XG4gICAgICogdmlldy5cbiAgICAgKlxuICAgICAqIENhbiBiZSB3YXRjaGVkIHdpdGggdGhlICdjb2xvckluVmlldzoke1ZpZXdJZH0nIGtleS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2aWV3T3JWaWV3SWRPclZpZXdOYW1lIFRoZSB2aWV3IChvciB2aWV3IElEIG9yIHZpZXcgbmFtZSkgdG8gdXNlIGZvciByZWNvcmQgY29sb3JpbmcuXG4gICAgICovXG4gICAgZ2V0Q29sb3JJblZpZXcodmlld09yVmlld0lkT3JWaWV3TmFtZTogVmlldyB8IFZpZXdJZCB8IHN0cmluZyk6IENvbG9yIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLl9nZXRWaWV3TWF0Y2hpbmcodmlld09yVmlld0lkT3JWaWV3TmFtZSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudFJlY29yZFN0b3JlLmdldFZpZXdEYXRhU3RvcmUodmlldy5pZCkuZ2V0UmVjb3JkQ29sb3IodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIENTUyBoZXggc3RyaW5nIGZvciB0aGlzIHJlY29yZCBpbiBhIGdpdmVuIHZpZXcsIG9yIG51bGwgaWYgdGhlIHJlY29yZCBoYXMgbm8gY29sb3JcbiAgICAgKiBpbiB0aGF0IHZpZXcuXG4gICAgICpcbiAgICAgKiBDYW4gYmUgd2F0Y2hlZCB3aXRoIHRoZSAnY29sb3JJblZpZXc6JHtWaWV3SWR9JyBrZXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmlld09yVmlld0lkT3JWaWV3TmFtZSBUaGUgdmlldyAob3IgdmlldyBJRCBvciB2aWV3IG5hbWUpIHRvIHVzZSBmb3IgcmVjb3JkIGNvbG9yaW5nLlxuICAgICAqL1xuICAgIGdldENvbG9ySGV4SW5WaWV3KHZpZXdPclZpZXdJZE9yVmlld05hbWU6IFZpZXcgfCBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgY29sb3IgPSB0aGlzLmdldENvbG9ySW5WaWV3KHZpZXdPclZpZXdJZE9yVmlld05hbWUpO1xuICAgICAgICBpZiAoIWNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sb3JVdGlscy5nZXRIZXhGb3JDb2xvcihjb2xvcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbGVjdCByZWNvcmRzIHJlZmVyZW5jZWQgaW4gYSBgbXVsdGlwbGVSZWNvcmRMaW5rc2AgY2VsbCB2YWx1ZS4gUmV0dXJucyBhIHF1ZXJ5IHJlc3VsdFxuICAgICAqIGNvbnRhaW5pbmcgdGhlIHJlY29yZHMgaW4gdGhlIGdpdmVuIGBtdWx0aXBsZVJlY29yZExpbmtzYCBmaWVsZC5cbiAgICAgKiBTZWUge0BsaW5rIFJlY29yZFF1ZXJ5UmVzdWx0fSBmb3IgbW9yZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWVsZE9yRmllbGRJZE9yRmllbGROYW1lIFRoZSBgbXVsdGlwbGVSZWNvcmRMaW5rc2AgZmllbGQgKG9yIGZpZWxkIElEIG9yIGZpZWxkIG5hbWUpIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gb3B0cyBPcHRpb25zIGZvciB0aGUgcXVlcnksIHN1Y2ggYXMgc29ydHMgYW5kIGZpZWxkcy5cbiAgICAgKi9cbiAgICBzZWxlY3RMaW5rZWRSZWNvcmRzRnJvbUNlbGwoXG4gICAgICAgIGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWU6IEZpZWxkIHwgRmllbGRJZCB8IHN0cmluZyxcbiAgICAgICAgb3B0czogUmVjb3JkUXVlcnlSZXN1bHRPcHRzID0ge30sXG4gICAgKTogTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9nZXRGaWVsZE1hdGNoaW5nKGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWUpO1xuICAgICAgICBjb25zdCBsaW5rZWRUYWJsZUlkID0gZmllbGQub3B0aW9ucyAmJiBmaWVsZC5vcHRpb25zLmxpbmtlZFRhYmxlSWQ7XG4gICAgICAgIGludmFyaWFudCh0eXBlb2YgbGlua2VkVGFibGVJZCA9PT0gJ3N0cmluZycsICdsaW5rZWRUYWJsZUlkIG11c3QgYmUgc2V0Jyk7XG5cbiAgICAgICAgY29uc3QgbGlua2VkVGFibGUgPSB0aGlzLl9zZGsuYmFzZS5nZXRUYWJsZUJ5SWQobGlua2VkVGFibGVJZCk7XG4gICAgICAgIGNvbnN0IGxpbmtlZFJlY29yZFN0b3JlID0gdGhpcy5fc2RrLmJhc2UuX19nZXRSZWNvcmRTdG9yZShsaW5rZWRUYWJsZUlkKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVkT3B0cyA9IFJlY29yZFF1ZXJ5UmVzdWx0Ll9ub3JtYWxpemVPcHRzKFxuICAgICAgICAgICAgbGlua2VkVGFibGUsXG4gICAgICAgICAgICBsaW5rZWRSZWNvcmRTdG9yZSxcbiAgICAgICAgICAgIG9wdHMsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLl9fbGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0UG9vbC5nZXRPYmplY3RGb3JSZXVzZShcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRPcHRzLFxuICAgICAgICAgICAgdGhpcy5fc2RrLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWxlY3QgYW5kIGxvYWQgcmVjb3JkcyByZWZlcmVuY2VkIGluIGEgYG11bHRpcGxlUmVjb3JkTGlua3NgIGNlbGwgdmFsdWUuIFJldHVybnMgYSBxdWVyeSByZXN1bHRcbiAgICAgKiBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIHJlY29yZHMgaW4gdGhlIGdpdmVuIGBtdWx0aXBsZVJlY29yZExpbmtzYCBmaWVsZC5cbiAgICAgKiBTZWUge0BsaW5rIFJlY29yZFF1ZXJ5UmVzdWx0fSBmb3IgbW9yZS5cbiAgICAgKlxuICAgICAqIFJlbWVtYmVyIHRvIGNhbGwgYHF1ZXJ5UmVzdWx0LnVubG9hZERhdGFgIG9uY2UgeW91J3JlIGZpbmlzaGVkIHdpdGggdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWUgVGhlIGBtdWx0aXBsZVJlY29yZExpbmtzYCBmaWVsZCAob3IgZmllbGQgSUQgb3IgZmllbGQgbmFtZSkgdG8gdXNlLlxuICAgICAqIEBwYXJhbSBvcHRzIE9wdGlvbnMgZm9yIHRoZSBxdWVyeSwgc3VjaCBhcyBzb3J0cyBhbmQgZmllbGRzLlxuICAgICAqL1xuICAgIGFzeW5jIHNlbGVjdExpbmtlZFJlY29yZHNGcm9tQ2VsbEFzeW5jKFxuICAgICAgICBmaWVsZE9yRmllbGRJZE9yRmllbGROYW1lOiBGaWVsZCB8IEZpZWxkSWQgfCBzdHJpbmcsXG4gICAgICAgIG9wdHM6IFJlY29yZFF1ZXJ5UmVzdWx0T3B0cyA9IHt9LFxuICAgICk6IFByb21pc2U8TGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UmVzdWx0ID0gdGhpcy5zZWxlY3RMaW5rZWRSZWNvcmRzRnJvbUNlbGwoZmllbGRPckZpZWxkSWRPckZpZWxkTmFtZSwgb3B0cyk7XG4gICAgICAgIGF3YWl0IHF1ZXJ5UmVzdWx0LmxvYWREYXRhQXN5bmMoKTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5UmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIGZvciB0aGUgcmVjb3JkLiBZb3UgY2FuIHZpc2l0IHRoaXMgVVJMIGluIHRoZSBicm93c2VyIHRvIGJlIHRha2VuIHRvIHRoZSByZWNvcmQgaW4gdGhlIEFpcnRhYmxlIFVJLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnNvbGUubG9nKG15UmVjb3JkLnVybCk7XG4gICAgICogLy8gPT4gJ2h0dHBzOi8vYWlydGFibGUuY29tL3RibHh4eHh4eHh4eHh4eHh4L3JlY3h4eHh4eHh4eHh4eHh4J1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCB1cmwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nkay5fX2FpcnRhYmxlSW50ZXJmYWNlLnVybENvbnN0cnVjdG9yLmdldFJlY29yZFVybChcbiAgICAgICAgICAgIHRoaXMuaWQsXG4gICAgICAgICAgICB0aGlzLnBhcmVudFRhYmxlLmlkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBjZWxsIHZhbHVlIGluIHRoaXMgcmVjb3JkLCBmb3JtYXR0ZWQgYXMgYSBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zb2xlLmxvZyhteVJlY29yZC5uYW1lKTtcbiAgICAgKiAvLyA9PiAnNDInXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2VsbFZhbHVlQXNTdHJpbmcodGhpcy5wYXJlbnRUYWJsZS5wcmltYXJ5RmllbGQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNvbW1lbnRzIG9uIHRoaXMgcmVjb3JkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNvbW1lbnRDb3VudCA9IG15UmVjb3JkLmNvbW1lbnRDb3VudDtcbiAgICAgKiBjb25zdCBpc1Npbmd1bGFyID0gY29tbWVudENvdW50ID09PSAxO1xuICAgICAqIGNvbnNvbGUubG9nKFxuICAgICAqICAgICBgVGhpcyByZWNvcmQgaGFzICR7Y29tbWVudENvdW50fSBjb21tZW50JHtpc1Npbmd1bGFyID8gJycgOiAncyd9YFxuICAgICAqICk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGNvbW1lbnRDb3VudCgpOiBudW1iZXIge1xuICAgICAgICB0aGlzLl9hc3NlcnRFeGlzdHNBbmRMb2FkZWQoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50UmVjb3JkU3RvcmUuZ2V0UmVjb3JkQ29tbWVudENvdW50KHRoaXMuX2lkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNyZWF0ZWQgdGltZSBvZiB0aGlzIHJlY29yZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zb2xlLmxvZyhgXG4gICAgICogICAgIFRoaXMgcmVjb3JkIHdhcyBjcmVhdGVkIGF0ICR7bXlSZWNvcmQuY3JlYXRlZFRpbWUudG9JU09TdHJpbmcoKX1cbiAgICAgKiBgKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgY3JlYXRlZFRpbWUoKTogRGF0ZSB7XG4gICAgICAgIHRoaXMuX2Fzc2VydEV4aXN0c0FuZExvYWRlZCgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRSZWNvcmRTdG9yZS5nZXRSZWNvcmRDcmVhdGVkVGltZSh0aGlzLl9pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2NvbnN0cnVjdEJsb2NrRmllbGRTZWxlY3Rpb25TcGVjKGZpZWxkU2VsZWN0aW9uOiBCbG9ja0ZpZWxkU2VsZWN0aW9uU3BlYyk6IEJsb2NrUXVlcnlTcGVjIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvdXJjZVR5cGU6IEJsb2NrUXVlcnlTb3VyY2VUeXBlLlRBQkxFLFxuICAgICAgICAgICAgc291cmNlVGFibGVJZDogdGhpcy5wYXJlbnRUYWJsZS5pZCxcbiAgICAgICAgICAgIHJlY29yZFNlbGVjdGlvbjoge1xuICAgICAgICAgICAgICAgIHJlY29yZElkczogW3RoaXMuaWRdLFxuICAgICAgICAgICAgICAgIGZpZWxkU2VsZWN0aW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfZmluZE1hdGNoaW5nQmxvY2tTdWJzY3JpcHRpb25DaGFuZ2VzKFxuICAgICAgICBjaGFuZ2VzOiBBcnJheTxCbG9ja1F1ZXJ5U3Vic2NyaXB0aW9uQ2hhbmdlPixcbiAgICAgICAgY2hhbmdlVHlwZVRvTWF0Y2g6IEJsb2NrUXVlcnlTdWJzY3JpcHRpb25DaGFuZ2VUeXBlLFxuICAgICk6IEFycmF5PEJsb2NrUXVlcnlTdWJzY3JpcHRpb25DaGFuZ2U+IHtcbiAgICAgICAgcmV0dXJuIGNoYW5nZXMuZmlsdGVyKFxuICAgICAgICAgICAgY2hhbmdlID0+IGNoYW5nZS50eXBlID09PSBjaGFuZ2VUeXBlVG9NYXRjaCAmJiBjaGFuZ2UudGFibGVJZCA9PT0gdGhpcy5wYXJlbnRUYWJsZS5pZCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfY29uc3RydWN0QmxvY2tRdWVyeVNwZWNBbmRDYWxsYmFja0ZvcldhdGNoYWJsZUtleShcbiAgICAgICAga2V5OiBXYXRjaGFibGVSZWNvcmRLZXksXG4gICAgICAgIGNhbGxiYWNrRm9yUmVnaXN0cmF0aW9uOiBGdW5jdGlvbixcbiAgICAgICAgY29udGV4dD86IHVua25vd24gfCBudWxsLFxuICAgICk6IHtcbiAgICAgICAgcXVlcnlTcGVjVG9TdWJzY3JpYmVXaXRoOiBCbG9ja1F1ZXJ5U3BlYztcbiAgICAgICAgb25DaGFuZ2VDYWxsYmFjazogQmxvY2tRdWVyeVN1YnNjcmlwdGlvbk9uQ2hhbmdlQ2FsbGJhY2s7XG4gICAgfSB7XG4gICAgICAgIGxldCBmaWVsZFNlbGVjdGlvbkRlZmluaXRpb246IEJsb2NrRmllbGRTZWxlY3Rpb25TcGVjO1xuICAgICAgICBsZXQgb25DaGFuZ2VDYWxsYmFjazogQmxvY2tRdWVyeVN1YnNjcmlwdGlvbk9uQ2hhbmdlQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFja0ZvclJlZ2lzdHJhdGlvbi5jYWxsKGNvbnRleHQsIHRoaXMsIGtleSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgV2F0Y2hhYmxlUmVjb3JkS2V5cy5uYW1lOlxuICAgICAgICAgICAgICAgIGZpZWxkU2VsZWN0aW9uRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogQmxvY2tGaWVsZFNlbGVjdGlvblNwZWNUeXBlLlNQRUNJRklFRF9GSUVMRFMsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkSWRzOiBbdGhpcy5wYXJlbnRUYWJsZS5wcmltYXJ5RmllbGQuaWRdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdhdGNoYWJsZVJlY29yZEtleXMuY29tbWVudENvdW50OlxuICAgICAgICAgICAgICAgIGZpZWxkU2VsZWN0aW9uRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogQmxvY2tGaWVsZFNlbGVjdGlvblNwZWNUeXBlLlNQRUNJRklFRF9GSUVMRFMsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkSWRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkSW5jbHVkZUNvbW1lbnRDb3VudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBXYXRjaGFibGVSZWNvcmRLZXlzLmNlbGxWYWx1ZXM6XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogKCNwcm9qLWJsb2Nrcy1zZGstcmVjb3JkLWxpbWl0cykgSW4gdGhlIGZ1dHVyZSBkb24ndCBmZXRjaCBhbGwgZmllbGRzIGZyb20gdGFibGVcbiAgICAgICAgICAgICAgICAvLyBvbGQgY29kZSBleGhpYml0IHRoaXMgYmVoYXZpb3IgdGhvdWdoOiBodHRwczovL2dpdGh1Yi5jb20vSHlwZXJiYXNlL2Jsb2Nrcy1zZGsvYmxvYi9hYmE2ZmE3YjdmOGNjYzFlMzY0YjQwOWNhNDY2ZDAyODFmOGU5YTY5L3BhY2thZ2VzL3Nkay9zcmMvbW9kZWxzL3JlY29yZC50cyNMNDE0LUw0MTZcbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgZnV0dXJlIGEgXCJzdWJzY3JpYmUgdG8gdXBkYXRlcywgYnV0IGRvbid0IGZldGNoIG1vcmUgZGF0YVwiIG1pZ2h0IGJlIHVzZWZ1bCBoZXJlLlxuICAgICAgICAgICAgICAgIGZpZWxkU2VsZWN0aW9uRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogQmxvY2tGaWVsZFNlbGVjdGlvblNwZWNUeXBlLkFMTF9GSUVMRFNfRlJPTV9UQUJMRSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgb25DaGFuZ2VDYWxsYmFjayA9IChjaGFuZ2VzOiBBcnJheTxCbG9ja1F1ZXJ5U3Vic2NyaXB0aW9uQ2hhbmdlPikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RpZmllZENlbGxWYWx1ZXNDaGFuZ2VzID0gdGhpcy5fZmluZE1hdGNoaW5nQmxvY2tTdWJzY3JpcHRpb25DaGFuZ2VzKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrUXVlcnlTdWJzY3JpcHRpb25DaGFuZ2VUeXBlLk1PRElGSUVEX0NFTExfVkFMVUVTX0ZPUl9UQUJMRSxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3QgY3VycmVudGx5IHNpbXVsYXRlIFwib24gbG9hZFwiIGNhbGxiYWNrIGZvciByZWdpc3RyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHN0aWxsIGhhbmRsZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVkQ2VsbFZhbHVlc0NoYW5nZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0ZvclJlZ2lzdHJhdGlvbi5jYWxsKGNvbnRleHQsIHRoaXMsIGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgZmllbGRJZHNNb2RpZmllZDogQXJyYXk8RmllbGRJZD4gPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1vZGlmaWVkQ2VsbFZhbHVlc0NoYW5nZSBvZiBtb2RpZmllZENlbGxWYWx1ZXNDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnZhcmlhbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRDZWxsVmFsdWVzQ2hhbmdlLnR5cGUgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrUXVlcnlTdWJzY3JpcHRpb25DaGFuZ2VUeXBlLk1PRElGSUVEX0NFTExfVkFMVUVTX0ZPUl9UQUJMRSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTW9kaWZpZWQgY2VsbCB2YWx1ZSBjaGFuZ2UgaXMgbm90IGEgc3VwcG9ydGVkIHR5cGUgaW4gcmVjb3JkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7ZmllbGRJZHNCeVJlY29yZElkfSA9IG1vZGlmaWVkQ2VsbFZhbHVlc0NoYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkSWRzRm9yVGhpc1JlY29yZCA9IGZpZWxkSWRzQnlSZWNvcmRJZFt0aGlzLmlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZElkc0ZvclRoaXNSZWNvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElkc01vZGlmaWVkID0gZmllbGRJZHNNb2RpZmllZC5jb25jYXQoZmllbGRJZHNGb3JUaGlzUmVjb3JkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRm9yUmVnaXN0cmF0aW9uLmNhbGwoY29udGV4dCwgdGhpcywga2V5LCBmaWVsZElkc01vZGlmaWVkKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIFRoZSBlbHNlIGNhc2VzIHNob3VsZCBiZSBpbXBvc3NpYmxlIHRvIHJlYWNoIC0gdGhleSBpbmRpY2F0ZSBhIFNESyBlcnJvci5cbiAgICAgICAgICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChXYXRjaGFibGVDZWxsVmFsdWVJbkZpZWxkS2V5UHJlZml4KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZElkID0ga2V5LnN1YnN0cmluZyhXYXRjaGFibGVDZWxsVmFsdWVJbkZpZWxkS2V5UHJlZml4Lmxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQXNzZXJ0IHRoYXQgZmllbGRJZCBpcyB2YWxpZGx5IGZvcm1hdHRlZCwgbm90IHRoYXQgaXQgaXMgYSB2YWxpZCBmaWVsZElkIGluIHRoaXMgdGFibGVcbiAgICAgICAgICAgICAgICAgICAgaW52YXJpYW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNGaWVsZElkKGZpZWxkSWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpZWxkSWQgcGFzc2VkIGFzIHdhdGNoYWJsZSBmaWVsZElkIGlzIG5vdCBhIHZhbGlkIGZvcm1hdCcgKyBmaWVsZElkLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkU2VsZWN0aW9uRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEJsb2NrRmllbGRTZWxlY3Rpb25TcGVjVHlwZS5TUEVDSUZJRURfRklFTERTLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJZHM6IFtmaWVsZElkXSxcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZUNhbGxiYWNrID0gKGNoYW5nZXM6IEFycmF5PEJsb2NrUXVlcnlTdWJzY3JpcHRpb25DaGFuZ2U+KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjb3VsZCBjaGVjayBpZiBzb21ldGhpbmcgZWxzZSBjaGFuZ2VkIGluIHRoZSBjaGFuZ2VzIGFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IG91ciBxdWVyeSBzdWJzY3JpcHRpb24gaXMgdGFyZ2V0aW5nIG9ubHkgdGhlIGZpZWxkIGluIHRoaXMgcmVjb3JkXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0ZvclJlZ2lzdHJhdGlvbi5jYWxsKGNvbnRleHQsIHRoaXMsIGtleSwgZmllbGRJZCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aChXYXRjaGFibGVDb2xvckluVmlld0tleVByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdXYXRjaGFibGVDb2xvckluVmlld0tleVByZWZpeCBtdXN0IGJlIGhhbmRsZWQgb3V0c2lkZSBvZiBxdWVyeSBzeXN0ZW0nLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoJ2ludmFsaWQgcmVjb3JkICh1bil3YXRjaCBrZXkgJXMnLCBrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdWVyeVNwZWNUb1N1YnNjcmliZVdpdGg6IHRoaXMuX2NvbnN0cnVjdEJsb2NrRmllbGRTZWxlY3Rpb25TcGVjKFxuICAgICAgICAgICAgICAgIGZpZWxkU2VsZWN0aW9uRGVmaW5pdGlvbixcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBvbkNoYW5nZUNhbGxiYWNrLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xuICAgIHdhdGNoKFxuICAgICAgICBrZXlzOiBXYXRjaGFibGVSZWNvcmRLZXkgfCBSZWFkb25seUFycmF5PFdhdGNoYWJsZVJlY29yZEtleT4sXG4gICAgICAgIGNhbGxiYWNrRm9yUmVnaXN0cmF0aW9uOiBGbG93QW55RnVuY3Rpb24sXG4gICAgICAgIGNvbnRleHQ/OiBGbG93QW55T2JqZWN0IHwgbnVsbCxcbiAgICApOiBBcnJheTxXYXRjaGFibGVSZWNvcmRLZXk+IHtcbiAgICAgICAgY29uc3QgdmFsaWRLZXlzID0gdGhpcy5fZ2V0V2F0Y2hhYmxlVmFsaWRLZXlzT3JUaHJvdyhrZXlzLCAnd2F0Y2gnKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB2YWxpZEtleXMpIHtcbiAgICAgICAgICAgIGlmIChfaXNLZXlTdWJzY3JpYmVhYmxlVmlhUmVjb3JkUXVlcnkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlTcGVjVG9TdWJzY3JpYmVXaXRoLFxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZUNhbGxiYWNrLFxuICAgICAgICAgICAgICAgIH0gPSB0aGlzLl9jb25zdHJ1Y3RCbG9ja1F1ZXJ5U3BlY0FuZENhbGxiYWNrRm9yV2F0Y2hhYmxlS2V5KFxuICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRm9yUmVnaXN0cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcXVlcnlNYW5hZ2VyLndhdGNoV2l0aFF1ZXJ5U3BlYyhcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlTcGVjVG9TdWJzY3JpYmVXaXRoLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlQ2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRm9yUmVnaXN0cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRvIHJlZ3VsYXIgd2F0Y2ggbG9naWNcblxuICAgICAgICAgICAgICAgIGludmFyaWFudChcbiAgICAgICAgICAgICAgICAgICAga2V5LnN0YXJ0c1dpdGgoV2F0Y2hhYmxlQ29sb3JJblZpZXdLZXlQcmVmaXgpLFxuICAgICAgICAgICAgICAgICAgICAnVW5leHBlY3RlZCBrZXkgaW4gd2F0Y2g6ICVzJyxcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3Qgdmlld0lkID0ga2V5LnN1YnN0cmluZyhXYXRjaGFibGVDb2xvckluVmlld0tleVByZWZpeC5sZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50UmVjb3JkU3RvcmVcbiAgICAgICAgICAgICAgICAgICAgLmdldFZpZXdEYXRhU3RvcmUodmlld0lkKVxuICAgICAgICAgICAgICAgICAgICAud2F0Y2goJ3JlY29yZENvbG9ycycsIHRoaXMuX29uUmVjb3JkQ29sb3JDaGFuZ2UpO1xuXG4gICAgICAgICAgICAgICAgc3VwZXIud2F0Y2goa2V5LCBjYWxsYmFja0ZvclJlZ2lzdHJhdGlvbiwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsaWRLZXlzO1xuICAgIH1cblxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xuICAgIHVud2F0Y2goXG4gICAgICAgIGtleXM6IFdhdGNoYWJsZVJlY29yZEtleSB8IFJlYWRvbmx5QXJyYXk8V2F0Y2hhYmxlUmVjb3JkS2V5PixcbiAgICAgICAgY2FsbGJhY2tGb3JSZWdpc3RyYXRpb246IEZsb3dBbnlGdW5jdGlvbixcbiAgICAgICAgY29udGV4dD86IEZsb3dBbnlPYmplY3QgfCBudWxsLFxuICAgICk6IEFycmF5PFdhdGNoYWJsZVJlY29yZEtleT4ge1xuICAgICAgICAvLyBXZSB3YXJuIGluc3RlYWQgb2YgdGhyb3cgaGVyZSBiZWNhdXNlIHdlIHVzZWQgdG8gd2FybiBpbnN0ZWFkIG9mIHRocm93IGFuZCBkb24ndFxuICAgICAgICAvLyB3YW50IHRvIG1ha2UgYSBicmVha2luZyBjaGFuZ2UuXG4gICAgICAgIGNvbnN0IHZhbGlkS2V5cyA9IHRoaXMuX2dldFdhdGNoYWJsZVZhbGlkS2V5c09yVGhyb3coa2V5cywgJ3Vud2F0Y2gnLCB0cnVlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB2YWxpZEtleXMpIHtcbiAgICAgICAgICAgIGlmIChfaXNLZXlTdWJzY3JpYmVhYmxlVmlhUmVjb3JkUXVlcnkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3F1ZXJ5TWFuYWdlci51bndhdGNoRnJvbVF1ZXJ5S2V5KGtleSwgY2FsbGJhY2tGb3JSZWdpc3RyYXRpb24sIGNvbnRleHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmYWxsYmFjayB0byByZWd1bGFyIHdhdGNoIGxvZ2ljXG4gICAgICAgICAgICAgICAgaW52YXJpYW50KFxuICAgICAgICAgICAgICAgICAgICBrZXkuc3RhcnRzV2l0aChXYXRjaGFibGVDb2xvckluVmlld0tleVByZWZpeCksXG4gICAgICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIGtleSBpbiB1bndhdGNoOiAlcycsXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdJZCA9IGtleS5zdWJzdHJpbmcoV2F0Y2hhYmxlQ29sb3JJblZpZXdLZXlQcmVmaXgubGVuZ3RoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudFJlY29yZFN0b3JlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRWaWV3RGF0YVN0b3JlKHZpZXdJZClcbiAgICAgICAgICAgICAgICAgICAgLnVud2F0Y2goJ3JlY29yZENvbG9ycycsIHRoaXMuX29uUmVjb3JkQ29sb3JDaGFuZ2UpO1xuXG4gICAgICAgICAgICAgICAgc3VwZXIudW53YXRjaChrZXksIGNhbGxiYWNrRm9yUmVnaXN0cmF0aW9uLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWxpZEtleXM7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vblJlY29yZENvbG9yQ2hhbmdlID0gKFxuICAgICAgICB2aWV3RGF0YVN0b3JlOiBWaWV3RGF0YVN0b3JlLFxuICAgICAgICBrZXk6IHN0cmluZyxcbiAgICAgICAgcmVjb3JkSWRzOiBBcnJheTxSZWNvcmRJZD4sXG4gICAgKSA9PiB7XG4gICAgICAgIGlmIChyZWNvcmRJZHMuaW5jbHVkZXModGhpcy5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKFdhdGNoYWJsZUNvbG9ySW5WaWV3S2V5UHJlZml4ICsgdmlld0RhdGFTdG9yZS52aWV3SWQpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVjb3JkO1xuIl19
|
|
@@ -114,4 +114,5 @@ var modes = {
|
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
};
|
|
117
|
-
exports.modes = modes;
|
|
117
|
+
exports.modes = modes;
|
|
118
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvcmVjb3JkX2NvbG9yaW5nLnRzIl0sIm5hbWVzIjpbIk1vZGVUeXBlcyIsIk5PTkUiLCJCWV9TRUxFQ1RfRklFTEQiLCJCWV9WSUVXIiwic2VyaWFsaXplIiwibW9kZSIsInJlc3VsdCIsInR5cGUiLCJzZWxlY3RGaWVsZCIsImlkIiwidmlldyIsIm1vZGVzIiwibm9uZSIsImJ5U2VsZWN0RmllbGQiLCJieVZpZXciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFBd0Q7QUFLeEQ7O0FBQ0E7Ozs7OztBQU1PLElBQU1BLFNBQVMsR0FBRztBQUNyQjs7O0FBR0FDLEVBQUFBLElBQUksRUFBRSxNQUplOztBQUtyQjs7O0FBR0FDLEVBQUFBLGVBQWUsRUFBRSxlQVJJOztBQVNyQjs7O0FBR0FDLEVBQUFBLE9BQU8sRUFBRTtBQVpZLENBQWxCO0FBZVA7Ozs7OztBQWlDTyxJQUFNQyxTQUFTLEdBQUlDLElBQUQsSUFBMkI7QUFDaEQsTUFBSUMsTUFBTSxHQUFHRCxJQUFJLENBQUNFLElBQWxCOztBQUNBLE1BQUlGLElBQUksQ0FBQ0UsSUFBTCxLQUFjUCxTQUFTLENBQUNFLGVBQTVCLEVBQTZDO0FBQ3pDSSxJQUFBQSxNQUFNLGVBQVFELElBQUksQ0FBQ0csV0FBTCxDQUFpQkMsRUFBekIsQ0FBTjtBQUNILEdBRkQsTUFFTyxJQUFJSixJQUFJLENBQUNFLElBQUwsS0FBY1AsU0FBUyxDQUFDRyxPQUE1QixFQUFxQztBQUN4Q0csSUFBQUEsTUFBTSxlQUFRRCxJQUFJLENBQUNLLElBQUwsQ0FBVUQsRUFBbEIsQ0FBTjtBQUNIOztBQUNELFNBQU9ILE1BQVA7QUFDSCxDQVJNO0FBVVA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJPLElBQU1LLEtBQUssR0FBRztBQUNqQjs7Ozs7QUFLQUMsRUFBQUEsSUFBSSxHQUFzQjtBQUN0QixXQUFPO0FBQ0hMLE1BQUFBLElBQUksRUFBRVAsU0FBUyxDQUFDQztBQURiLEtBQVA7QUFHSCxHQVZnQjs7QUFXakI7Ozs7OztBQU1BWSxFQUFBQSxhQUFhLENBQUNMLFdBQUQsRUFBbUQ7QUFDNUQsV0FBTztBQUNIRCxNQUFBQSxJQUFJLEVBQUVQLFNBQVMsQ0FBQ0UsZUFEYjtBQUVITSxNQUFBQTtBQUZHLEtBQVA7QUFJSCxHQXRCZ0I7O0FBdUJqQjs7Ozs7O0FBTUFNLEVBQUFBLE1BQU0sQ0FBQ0osSUFBRCxFQUFvQztBQUN0QyxXQUFPO0FBQ0hILE1BQUFBLElBQUksRUFBRVAsU0FBUyxDQUFDRyxPQURiO0FBRUhPLE1BQUFBO0FBRkcsS0FBUDtBQUlIOztBQWxDZ0IsQ0FBZCIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBhaXJ0YWJsZS9ibG9ja3MvbW9kZWxzOiBSZWNvcmQgQ29sb3JpbmcgKi8gLyoqICovXG5pbXBvcnQge09iamVjdFZhbHVlc30gZnJvbSAnLi4vcHJpdmF0ZV91dGlscyc7XG5pbXBvcnQgRmllbGQgZnJvbSAnLi9maWVsZCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG4vLyBUT0RPKGVtbWEpOiB1cGRhdGUgdGhpcyB0byBiZSBhbiBlbnVtXG4vKipcbiAqIEFuIGVudW0gb2YgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB7QGxpbmsgcmVjb3JkQ29sb3JpbmcubW9kZXN9XG4gKlxuICogQGhpZGRlblxuICogQGFsaWFzIHJlY29yZENvbG9yaW5nLk1vZGVUeXBlc1xuICovXG5leHBvcnQgY29uc3QgTW9kZVR5cGVzID0ge1xuICAgIC8qKlxuICAgICAqIEBhbGlhcyByZWNvcmRDb2xvcmluZy5Nb2RlVHlwZXMuTk9ORVxuICAgICAqL1xuICAgIE5PTkU6ICdub25lJyBhcyBjb25zdCxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgcmVjb3JkQ29sb3JpbmcuTW9kZVR5cGVzLkJZX1NFTEVDVF9GSUVMRFxuICAgICAqL1xuICAgIEJZX1NFTEVDVF9GSUVMRDogJ2J5U2VsZWN0RmllbGQnIGFzIGNvbnN0LFxuICAgIC8qKlxuICAgICAqIEBhbGlhcyByZWNvcmRDb2xvcmluZy5Nb2RlVHlwZXMuQllfVklFV1xuICAgICAqL1xuICAgIEJZX1ZJRVc6ICdieVZpZXcnIGFzIGNvbnN0LFxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCB0eXBlIFJlY29yZENvbG9yTW9kZVR5cGUgPSBPYmplY3RWYWx1ZXM8dHlwZW9mIE1vZGVUeXBlcz47XG5cbi8qKiAqL1xuaW50ZXJmYWNlIE5vUmVjb3JkQ29sb3JNb2RlIHtcbiAgICAvKiogKi9cbiAgICB0eXBlOiB0eXBlb2YgTW9kZVR5cGVzLk5PTkU7XG59XG5cbi8qKiAqL1xuaW50ZXJmYWNlIEJ5U2VsZWN0RmllbGRSZWNvcmRDb2xvck1vZGUge1xuICAgIC8qKiAqL1xuICAgIHR5cGU6IHR5cGVvZiBNb2RlVHlwZXMuQllfU0VMRUNUX0ZJRUxEO1xuICAgIC8qKiAqL1xuICAgIHNlbGVjdEZpZWxkOiBGaWVsZDtcbn1cblxuLyoqICovXG5pbnRlcmZhY2UgQnlWaWV3UmVjb3JkQ29sb3JNb2RlIHtcbiAgICAvKiogKi9cbiAgICB0eXBlOiB0eXBlb2YgTW9kZVR5cGVzLkJZX1ZJRVc7XG4gICAgLyoqICovXG4gICAgdmlldzogVmlldztcbn1cblxuLyoqICovXG5leHBvcnQgdHlwZSBSZWNvcmRDb2xvck1vZGUgPVxuICAgIHwgTm9SZWNvcmRDb2xvck1vZGVcbiAgICB8IEJ5U2VsZWN0RmllbGRSZWNvcmRDb2xvck1vZGVcbiAgICB8IEJ5Vmlld1JlY29yZENvbG9yTW9kZTtcblxuZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZSA9IChtb2RlOiBSZWNvcmRDb2xvck1vZGUpID0+IHtcbiAgICBsZXQgcmVzdWx0ID0gbW9kZS50eXBlO1xuICAgIGlmIChtb2RlLnR5cGUgPT09IE1vZGVUeXBlcy5CWV9TRUxFQ1RfRklFTEQpIHtcbiAgICAgICAgcmVzdWx0ICs9IGAtJHttb2RlLnNlbGVjdEZpZWxkLmlkfWA7XG4gICAgfSBlbHNlIGlmIChtb2RlLnR5cGUgPT09IE1vZGVUeXBlcy5CWV9WSUVXKSB7XG4gICAgICAgIHJlc3VsdCArPSBgLSR7bW9kZS52aWV3LmlkfWA7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFJlY29yZCBjb2xvcmluZyBjb25maWcgY3JlYXRvcnMuXG4gKlxuICogQGFsaWFzIHJlY29yZENvbG9yaW5nLm1vZGVzXG4gKiBAZXhhbXBsZVxuICogYGBganNcbiAqIGltcG9ydCB7cmVjb3JkQ29sb3Jpbmd9IGZyb20gJ0BhaXJ0YWJsZS9ibG9ja3MvbW9kZWxzJztcbiAqIGltcG9ydCB7dXNlUmVjb3Jkc30gZnJvbSAnQGFpcnRhYmxlL2Jsb2Nrcy91aSc7XG4gKlxuICogLy8gbm8gcmVjb3JkIGNvbG9yaW5nOlxuICogY29uc3QgcmVjb3JkQ29sb3JNb2RlID0gcmVjb3JkQ29sb3JpbmcubW9kZXMubm9uZSgpO1xuICogLy8gY29sb3IgYnkgc2VsZWN0IGZpZWxkOlxuICogY29uc3QgcmVjb3JkQ29sb3JNb2RlID0gcmVjb3JkQ29sb3JpbmcubW9kZXMuYnlTZWxlY3RGaWVsZChzb21lU2VsZWN0RmllbGQpO1xuICogLy8gY29sb3IgZnJvbSB2aWV3OlxuICogY29uc3QgcmVjb3JkQ29sb3JNb2RlID0gcmVjb3JkQ29sb3JpbmcubW9kZXMuYnlWaWV3KHNvbWVWaWV3KTtcbiAqXG4gKiAvLyB3aXRoIHVzZVJlY29yZHM6XG4gKiBjb25zdCBxdWVyeVJlc3VsdCA9IHVzZVJlY29yZHModGFibGUsIHsgcmVjb3JkQ29sb3JNb2RlIH0pXG4gKlxuICogLy8gd2l0aCBhIHF1ZXJ5IHJlc3VsdDpcbiAqIGNvbnN0IHF1ZXJ5UmVzdWx0ID0gdGFibGUuc2VsZWN0UmVjb3Jkcyh7IHJlY29yZENvbG9yTW9kZSB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgbW9kZXMgPSB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHtAbGluayBSZWNvcmRDb2xvck1vZGV9IHRoYXQgcmVwcmVzZW50cyBubyByZWNvcmQgY29sb3JpbmcuXG4gICAgICpcbiAgICAgKiBAYWxpYXMgcmVjb3JkQ29sb3JpbmcubW9kZXMubm9uZVxuICAgICAqL1xuICAgIG5vbmUoKTogTm9SZWNvcmRDb2xvck1vZGUge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogTW9kZVR5cGVzLk5PTkUsXG4gICAgICAgIH07XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFJlY29yZENvbG9yTW9kZX0gdGhhdCBjb2xvcnMgcmVjb3JkcyBieSB0aGUgc3BlY2lmaWVkIFNlbGVjdCBmaWVsZC5cbiAgICAgKlxuICAgICAqIEBhbGlhcyByZWNvcmRDb2xvcmluZy5tb2Rlcy5ieVNlbGVjdEZpZWxkXG4gICAgICogQHBhcmFtIHNlbGVjdEZpZWxkXG4gICAgICovXG4gICAgYnlTZWxlY3RGaWVsZChzZWxlY3RGaWVsZDogRmllbGQpOiBCeVNlbGVjdEZpZWxkUmVjb3JkQ29sb3JNb2RlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IE1vZGVUeXBlcy5CWV9TRUxFQ1RfRklFTEQsXG4gICAgICAgICAgICBzZWxlY3RGaWVsZCxcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgUmVjb3JkQ29sb3JNb2RlfSB0aGF0IGNvbG9ycyByZWNvcmRzIGJ5IHRoZSBzcGVjaWZpZWQgVmlldy5cbiAgICAgKlxuICAgICAqIEBhbGlhcyByZWNvcmRDb2xvcmluZy5tb2Rlcy5ieVZpZXdcbiAgICAgKiBAcGFyYW0gdmlld1xuICAgICAqL1xuICAgIGJ5Vmlldyh2aWV3OiBWaWV3KTogQnlWaWV3UmVjb3JkQ29sb3JNb2RlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IE1vZGVUeXBlcy5CWV9WSUVXLFxuICAgICAgICAgICAgdmlldyxcbiAgICAgICAgfTtcbiAgICB9LFxufTtcbiJdfQ==
|