@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
|
@@ -89,6 +89,7 @@ var WatchableCursorKeys = Object.freeze({
|
|
|
89
89
|
* return (
|
|
90
90
|
* <div>
|
|
91
91
|
* Active table: {cursor.activeTableId}
|
|
92
|
+
* <br />
|
|
92
93
|
* Active view: {cursor.activeViewId}
|
|
93
94
|
* </div>
|
|
94
95
|
* );
|
|
@@ -109,6 +110,7 @@ var WatchableCursorKeys = Object.freeze({
|
|
|
109
110
|
* return (
|
|
110
111
|
* <div>
|
|
111
112
|
* Selected records: {cursor.selectedRecordIds.join(', ')}
|
|
113
|
+
* <br />
|
|
112
114
|
* Selected fields: {cursor.selectedFieldIds.join(', ')}
|
|
113
115
|
* </div>
|
|
114
116
|
* );
|
|
@@ -466,4 +468,5 @@ function (_AbstractModelWithAsy) {
|
|
|
466
468
|
|
|
467
469
|
(0, _defineProperty2.default)(Cursor, "_className", 'Cursor');
|
|
468
470
|
var _default = Cursor;
|
|
469
|
-
exports.default = _default;
|
|
471
|
+
exports.default = _default;
|
|
472
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvY3Vyc29yLnRzIl0sIm5hbWVzIjpbIldhdGNoYWJsZUN1cnNvcktleXMiLCJPYmplY3QiLCJmcmVlemUiLCJzZWxlY3RlZFJlY29yZElkcyIsInNlbGVjdGVkRmllbGRJZHMiLCJhY3RpdmVUYWJsZUlkIiwiYWN0aXZlVmlld0lkIiwiaXNEYXRhTG9hZGVkIiwiQ3Vyc29yIiwia2V5Iiwic2RrIiwiYmFzZURhdGEiLCJfX2FpcnRhYmxlSW50ZXJmYWNlIiwic2RrSW5pdERhdGEiLCJzZWxlY3RlZFJlY29yZElkU2V0IiwiY3Vyc29yRGF0YSIsInNlbGVjdGVkRmllbGRJZFNldCIsImFjdGl2ZVRhYmxlIiwidGFibGVzQnlJZCIsIl9jdXJzb3JEYXRhIiwic2VhbCIsIl9vbkNoYW5nZSIsIl9zZGsiLCJmZXRjaEFuZFN1YnNjcmliZVRvQ3Vyc29yRGF0YUFzeW5jIiwidW5zdWJzY3JpYmVGcm9tQ3Vyc29yRGF0YSIsInJlY29yZE9yUmVjb3JkSWQiLCJfZGF0YSIsInJlY29yZElkIiwiUmVjb3JkIiwiaWQiLCJ0YWJsZU9yVGFibGVJZCIsInRhYmxlSWQiLCJUYWJsZSIsInNldEFjdGl2ZVZpZXdPclRhYmxlIiwidmlld09yVmlld0lkIiwidmlld0lkIiwiVmlldyIsImNoYW5nZXMiLCJjaGFuZ2VkS2V5cyIsInBhdGgiLCJ2YWx1ZSIsImxlbmd0aCIsImRpZENoYW5nZSIsImtleXMiLCJBYnN0cmFjdE1vZGVsV2l0aEFzeW5jRGF0YSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFaQTs7QUFBK0M7QUFjL0MsSUFBTUEsbUJBQW1CLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQ3RDQyxFQUFBQSxpQkFBaUIsRUFBRSxtQkFEbUI7QUFFdENDLEVBQUFBLGdCQUFnQixFQUFFLGtCQUZvQjtBQUd0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Ozs7Ozs7Ozs7O3dCQVVrQztBQUM5QixhQUFPLEtBQUtxQixLQUFMLENBQVdwQixZQUFsQjtBQUNIOzs7RUF4SWdCc0MsdUM7OzhCQUFmcEMsTSxnQkFFa0IsUTtlQTJPVEEsTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBhaXJ0YWJsZS9ibG9ja3MvbW9kZWxzOiBDdXJzb3IgKi8gLyoqICovXG5pbXBvcnQgU2RrIGZyb20gJy4uL3Nkayc7XG5pbXBvcnQge01vZGVsQ2hhbmdlfSBmcm9tICcuLi90eXBlcy9iYXNlJztcbmltcG9ydCB7UmVjb3JkSWR9IGZyb20gJy4uL3R5cGVzL3JlY29yZCc7XG5pbXBvcnQge1RhYmxlSWR9IGZyb20gJy4uL3R5cGVzL3RhYmxlJztcbmltcG9ydCB7Vmlld0lkfSBmcm9tICcuLi90eXBlcy92aWV3JztcbmltcG9ydCB7RmllbGRJZH0gZnJvbSAnLi4vdHlwZXMvZmllbGQnO1xuaW1wb3J0IHtpc0VudW1WYWx1ZSwgZW50cmllcywgT2JqZWN0VmFsdWVzLCBPYmplY3RNYXB9IGZyb20gJy4uL3ByaXZhdGVfdXRpbHMnO1xuaW1wb3J0IHtpbnZhcmlhbnR9IGZyb20gJy4uL2Vycm9yX3V0aWxzJztcbmltcG9ydCBBYnN0cmFjdE1vZGVsV2l0aEFzeW5jRGF0YSBmcm9tICcuL2Fic3RyYWN0X21vZGVsX3dpdGhfYXN5bmNfZGF0YSc7XG5pbXBvcnQgVGFibGUgZnJvbSAnLi90YWJsZSc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0IFJlY29yZCBmcm9tICcuL3JlY29yZCc7XG5cbmNvbnN0IFdhdGNoYWJsZUN1cnNvcktleXMgPSBPYmplY3QuZnJlZXplKHtcbiAgICBzZWxlY3RlZFJlY29yZElkczogJ3NlbGVjdGVkUmVjb3JkSWRzJyBhcyBjb25zdCxcbiAgICBzZWxlY3RlZEZpZWxkSWRzOiAnc2VsZWN0ZWRGaWVsZElkcycgYXMgY29uc3QsXG4gICAgYWN0aXZlVGFibGVJZDogJ2FjdGl2ZVRhYmxlSWQnIGFzIGNvbnN0LFxuICAgIGFjdGl2ZVZpZXdJZDogJ2FjdGl2ZVZpZXdJZCcgYXMgY29uc3QsXG4gICAgaXNEYXRhTG9hZGVkOiAnaXNEYXRhTG9hZGVkJyBhcyBjb25zdCxcbn0pO1xuXG4vKipcbiAqIFdhdGNoYWJsZSBrZXlzIGluIHtAbGluayBDdXJzb3J9LlxuICogLSBgc2VsZWN0ZWRSZWNvcmRJZHNgXG4gKiAtIGBzZWxlY3RlZEZpZWxkSWRzYFxuICogLSBgYWN0aXZlVGFibGVJZGBcbiAqIC0gYGFjdGl2ZVZpZXdJZGBcbiAqIC0gYGlzRGF0YUxvYWRlZGBcbiAqL1xudHlwZSBXYXRjaGFibGVDdXJzb3JLZXkgPSBPYmplY3RWYWx1ZXM8dHlwZW9mIFdhdGNoYWJsZUN1cnNvcktleXM+O1xuXG4vKiogQGhpZGRlbiAqL1xuaW50ZXJmYWNlIEN1cnNvckRhdGEge1xuICAgIHNlbGVjdGVkUmVjb3JkSWRTZXQ6IE9iamVjdE1hcDxSZWNvcmRJZCwgYm9vbGVhbj4gfCBudWxsO1xuICAgIHNlbGVjdGVkRmllbGRJZFNldDogT2JqZWN0TWFwPEZpZWxkSWQsIGJvb2xlYW4+IHwgbnVsbDtcbiAgICBhY3RpdmVUYWJsZUlkOiBUYWJsZUlkIHwgbnVsbDtcbiAgICBhY3RpdmVWaWV3SWQ6IFZpZXdJZCB8IG51bGw7XG59XG5cbi8vIE5PVEU6IGN1cnNvciBpcyBhbiBBYnN0cmFjdE1vZGVsIGJlY2F1c2UgaXQgaW5jbHVkZXMgbG9hZGFibGUgZGF0YS5cbi8qKlxuICogTW9kZWwgY2xhc3MgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIHVzZXIncyBjdXJyZW50IGludGVyYWN0aW9ucyBpblxuICogQWlydGFibGUgLSBzcGVjaWZpY2FsbHksIHRoZWlyIGFjdGl2ZSB0YWJsZSwgYWN0aXZlIHZpZXcsIHNlbGVjdGVkIHJlY29yZHMgYW5kIHNlbGVjdGVkIGZpZWxkcy5cbiAqIEFsc28gYWxsb3dzIHlvdSB0byBzZXQgdGhlIGFjdGl2ZSB0YWJsZSBhbmQgYWN0aXZlIHZpZXcuXG4gKlxuICogU2VsZWN0ZWQgcmVjb3JkcyBhbmQgZmllbGRzIGFyZSBub3QgbG9hZGVkIGJ5IGRlZmF1bHQgYW5kIHRoZSBjdXJzb3IgbXVzdCBiZSBsb2FkZWQgd2l0aFxuICoge0BsaW5rIHVzZUxvYWRhYmxlfSB0byBhY2Nlc3MgdGhlbS5cbiAqXG4gKiBgYGBqc1xuICogaW1wb3J0IHt1c2VDdXJzb3IsIHVzZVdhdGNoYWJsZX0gZnJvbSAnQGFpcnRhYmxlL2Jsb2Nrcy91aSc7XG4gKlxuICogIGZ1bmN0aW9uIEFjdGl2ZVRhYmxlQW5kVmlldygpIHtcbiAqICAgICAgY29uc3QgY3Vyc29yID0gdXNlQ3Vyc29yKCk7XG4gKlxuICogICAgICByZXR1cm4gKFxuICogICAgICAgICAgPGRpdj5cbiAqICAgICAgICAgICAgICBBY3RpdmUgdGFibGU6IHtjdXJzb3IuYWN0aXZlVGFibGVJZH1cbiAqICAgICAgICAgICAgICA8YnIgLz5cbiAqICAgICAgICAgICAgICBBY3RpdmUgdmlldzoge2N1cnNvci5hY3RpdmVWaWV3SWR9XG4gKiAgICAgICAgICA8L2Rpdj5cbiAqICAgICAgKTtcbiAqICB9XG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogaW1wb3J0IHt1c2VDdXJzb3IsIHVzZUxvYWRhYmxlLCB1c2VXYXRjaGFibGV9IGZyb20gJ0BhaXJ0YWJsZS9ibG9ja3MvdWknO1xuICpcbiAqICBmdW5jdGlvbiBTZWxlY3RlZFJlY29yZEFuZEZpZWxkSWRzKCkge1xuICogICAgICBjb25zdCBjdXJzb3IgPSB1c2VDdXJzb3IoKTtcbiAqICAgICAgLy8gbG9hZCBzZWxlY3RlZCByZWNvcmRzIGFuZCBmaWVsZHNcbiAqICAgICAgdXNlTG9hZGFibGUoY3Vyc29yKTtcbiAqXG4gKiAgICAgIC8vIHJlLXJlbmRlciB3aGVuZXZlciB0aGUgbGlzdCBvZiBzZWxlY3RlZCByZWNvcmRzIG9yIGZpZWxkcyBjaGFuZ2VzXG4gKiAgICAgIHVzZVdhdGNoYWJsZShjdXJzb3IsIFsnc2VsZWN0ZWRSZWNvcmRJZHMnLCAnc2VsZWN0ZWRGaWVsZElkcyddKTtcbiAqXG4gKiAgICAgIHJldHVybiAoXG4gKiAgICAgICAgICA8ZGl2PlxuICogICAgICAgICAgICAgIFNlbGVjdGVkIHJlY29yZHM6IHtjdXJzb3Iuc2VsZWN0ZWRSZWNvcmRJZHMuam9pbignLCAnKX1cbiAqICAgICAgICAgICAgICA8YnIgLz5cbiAqICAgICAgICAgICAgICBTZWxlY3RlZCBmaWVsZHM6IHtjdXJzb3Iuc2VsZWN0ZWRGaWVsZElkcy5qb2luKCcsICcpfVxuICogICAgICAgICAgPC9kaXY+XG4gKiAgICAgICk7XG4gKiAgfVxuICogYGBgXG4gKlxuICogQGRvY3NQYXRoIG1vZGVscy9DdXJzb3JcbiAqL1xuY2xhc3MgQ3Vyc29yIGV4dGVuZHMgQWJzdHJhY3RNb2RlbFdpdGhBc3luY0RhdGE8Q3Vyc29yRGF0YSwgV2F0Y2hhYmxlQ3Vyc29yS2V5PiB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBfY2xhc3NOYW1lID0gJ0N1cnNvcic7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBfaXNXYXRjaGFibGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGlzRW51bVZhbHVlKFdhdGNoYWJsZUN1cnNvcktleXMsIGtleSk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBzdGF0aWMgX3Nob3VsZExvYWREYXRhRm9yS2V5KGtleTogV2F0Y2hhYmxlQ3Vyc29yS2V5KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2N1cnNvckRhdGE6IEN1cnNvckRhdGE7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgY29uc3RydWN0b3Ioc2RrOiBTZGspIHtcbiAgICAgICAgc3VwZXIoc2RrLCAnY3Vyc29yJyk7XG5cbiAgICAgICAgY29uc3QgYmFzZURhdGEgPSBzZGsuX19haXJ0YWJsZUludGVyZmFjZS5zZGtJbml0RGF0YS5iYXNlRGF0YTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRSZWNvcmRJZFNldCA9IGJhc2VEYXRhLmN1cnNvckRhdGE/LnNlbGVjdGVkUmVjb3JkSWRTZXQgPz8gbnVsbDtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRGaWVsZElkU2V0ID0gYmFzZURhdGEuY3Vyc29yRGF0YT8uc2VsZWN0ZWRGaWVsZElkU2V0ID8/IG51bGw7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVRhYmxlSWQgPSBiYXNlRGF0YS5hY3RpdmVUYWJsZUlkO1xuICAgICAgICBjb25zdCBhY3RpdmVUYWJsZSA9IGFjdGl2ZVRhYmxlSWQgPyBiYXNlRGF0YS50YWJsZXNCeUlkW2FjdGl2ZVRhYmxlSWRdIDogbnVsbDtcbiAgICAgICAgY29uc3QgYWN0aXZlVmlld0lkID0gYWN0aXZlVGFibGU/LmFjdGl2ZVZpZXdJZCA/PyBudWxsO1xuXG4gICAgICAgIHRoaXMuX2N1cnNvckRhdGEgPSB7XG4gICAgICAgICAgICBzZWxlY3RlZFJlY29yZElkU2V0LFxuICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZElkU2V0LFxuICAgICAgICAgICAgYWN0aXZlVGFibGVJZCxcbiAgICAgICAgICAgIGFjdGl2ZVZpZXdJZCxcbiAgICAgICAgfTtcblxuICAgICAgICBPYmplY3Quc2VhbCh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgX2RhdGFPck51bGxJZkRlbGV0ZWQoKTogQ3Vyc29yRGF0YSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJzb3JEYXRhO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfb25DaGFuZ2VJc0RhdGFMb2FkZWQoKSB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKFdhdGNoYWJsZUN1cnNvcktleXMuaXNEYXRhTG9hZGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgX2xvYWREYXRhQXN5bmMoKTogUHJvbWlzZTxBcnJheTxXYXRjaGFibGVDdXJzb3JLZXk+PiB7XG4gICAgICAgIGNvbnN0IGN1cnNvckRhdGEgPSBhd2FpdCB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZS5mZXRjaEFuZFN1YnNjcmliZVRvQ3Vyc29yRGF0YUFzeW5jKCk7XG4gICAgICAgIHRoaXMuX2N1cnNvckRhdGEuc2VsZWN0ZWRSZWNvcmRJZFNldCA9IGN1cnNvckRhdGEuc2VsZWN0ZWRSZWNvcmRJZFNldDtcbiAgICAgICAgdGhpcy5fY3Vyc29yRGF0YS5zZWxlY3RlZEZpZWxkSWRTZXQgPSBjdXJzb3JEYXRhLnNlbGVjdGVkRmllbGRJZFNldDtcblxuICAgICAgICByZXR1cm4gW1dhdGNoYWJsZUN1cnNvcktleXMuc2VsZWN0ZWRSZWNvcmRJZHMsIFdhdGNoYWJsZUN1cnNvcktleXMuc2VsZWN0ZWRGaWVsZElkc107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF91bmxvYWREYXRhKCkge1xuICAgICAgICB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZS51bnN1YnNjcmliZUZyb21DdXJzb3JEYXRhKCk7XG4gICAgICAgIHRoaXMuX2N1cnNvckRhdGEuc2VsZWN0ZWRSZWNvcmRJZFNldCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2N1cnNvckRhdGEuc2VsZWN0ZWRGaWVsZElkU2V0ID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlY29yZCBJRHMgb2YgYWxsIGN1cnJlbnRseSBzZWxlY3RlZCByZWNvcmRzLCBvciBhbiBlbXB0eSBhcnJheSBpZiBubyByZWNvcmRzIGFyZSBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIE5vdCBsb2FkZWQgYnkgZGVmYXVsdC4gWW91IG11c3QgbG9hZCBjdXJzb3IgZGF0YSB3aXRoIGB1c2VMb2FkYWJsZShjdXJzb3IpYCAocmVjb21tZW5kZWQpIG9yXG4gICAgICogYGN1cnNvci5sb2FkRGF0YUFzeW5jKClgIGJlZm9yZSB1c2UuXG4gICAgICpcbiAgICAgKiBDYW4gYmUgd2F0Y2hlZC5cbiAgICAgKi9cbiAgICBnZXQgc2VsZWN0ZWRSZWNvcmRJZHMoKTogQXJyYXk8UmVjb3JkSWQ+IHtcbiAgICAgICAgY29uc3Qge3NlbGVjdGVkUmVjb3JkSWRTZXR9ID0gdGhpcy5fZGF0YTtcbiAgICAgICAgaW52YXJpYW50KHNlbGVjdGVkUmVjb3JkSWRTZXQsICdDdXJzb3IgZGF0YSBpcyBub3QgbG9hZGVkJyk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUmVjb3JkSWRzID0gT2JqZWN0LmtleXMoc2VsZWN0ZWRSZWNvcmRJZFNldCk7XG4gICAgICAgIHJldHVybiBzZWxlY3RlZFJlY29yZElkcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkIElEcyBvZiBhbGwgY3VycmVudGx5IHNlbGVjdGVkIGZpZWxkcywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm8gZmllbGRzIGFyZSBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIE5vdCBsb2FkZWQgYnkgZGVmYXVsdDogeW91IG11c3QgbG9hZCBjdXJzb3IgZGF0YSB3aXRoIGB1c2VMb2FkYWJsZShjdXJzb3IpYCAocmVjb21tZW5kZWQpIG9yXG4gICAgICogYGN1cnNvci5sb2FkRGF0YUFzeW5jKClgIGJlZm9yZSB1c2UuXG4gICAgICpcbiAgICAgKiBDYW4gYmUgd2F0Y2hlZC5cbiAgICAgKi9cbiAgICBnZXQgc2VsZWN0ZWRGaWVsZElkcygpOiBBcnJheTxSZWNvcmRJZD4ge1xuICAgICAgICBjb25zdCB7c2VsZWN0ZWRGaWVsZElkU2V0fSA9IHRoaXMuX2RhdGE7XG4gICAgICAgIGludmFyaWFudChzZWxlY3RlZEZpZWxkSWRTZXQsICdDdXJzb3IgZGF0YSBpcyBub3QgbG9hZGVkJyk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUmVjb3JkSWRzID0gT2JqZWN0LmtleXMoc2VsZWN0ZWRGaWVsZElkU2V0KTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkUmVjb3JkSWRzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIHJlY29yZCBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIFNlbGVjdGVkIHJlY29yZHMgYXJlIG5vdCBsb2FkZWQgYnkgZGVmYXVsdC4gWW91IG11c3QgbG9hZCBjdXJzb3IgZGF0YSB3aXRoXG4gICAgICogYHVzZUxvYWRhYmxlKGN1cnNvcilgIChyZWNvbW1lbmRlZCkgb3IgYGN1cnNvci5sb2FkRGF0YUFzeW5jKClgIGJlZm9yZSB1c2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVjb3JkT3JSZWNvcmRJZCBUaGUgcmVjb3JkIG9yIHJlY29yZCBJRCB0byBjaGVjayBmb3IuXG4gICAgICovXG4gICAgaXNSZWNvcmRTZWxlY3RlZChyZWNvcmRPclJlY29yZElkOiBSZWNvcmQgfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qge3NlbGVjdGVkUmVjb3JkSWRTZXR9ID0gdGhpcy5fZGF0YTtcbiAgICAgICAgaW52YXJpYW50KHNlbGVjdGVkUmVjb3JkSWRTZXQsICdDdXJzb3IgZGF0YSBpcyBub3QgbG9hZGVkJyk7XG4gICAgICAgIGxldCByZWNvcmRJZDogc3RyaW5nO1xuICAgICAgICBpZiAocmVjb3JkT3JSZWNvcmRJZCBpbnN0YW5jZW9mIFJlY29yZCkge1xuICAgICAgICAgICAgcmVjb3JkSWQgPSByZWNvcmRPclJlY29yZElkLmlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVjb3JkSWQgPSByZWNvcmRPclJlY29yZElkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIXNlbGVjdGVkUmVjb3JkSWRTZXRbcmVjb3JkSWRdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudGx5IGFjdGl2ZSB0YWJsZSBJRC4gQ2FuIGJlIG51bGwgd2hlbiB0aGUgYWN0aXZlIHRhYmxlIGhhcyBjaGFuZ2VkIGFuZCBpcyBub3QgeWV0XG4gICAgICogbG9hZGVkLCBhbmQgY2FuIGFsc28gcmVmZXIgdG8gYSB0YWJsZSB0aGF0IGlzIG5vdCB5ZXQgbG9hZGVkLlxuICAgICAqXG4gICAgICogV2hlbiBmZXRjaGluZyB0aGUge0BsaW5rIFRhYmxlfSwgdXNlIGBiYXNlLmdldFRhYmxlQnlJZElmRXhpc3RzKGN1cnNvci5hY3RpdmVUYWJsZUlkKWAgYW5kXG4gICAgICogY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBpcyBub3QgYG51bGxgIHRvIGJlIHJlc2lsaWVudCB0byB0aG9zZSBjYXNlcy5cbiAgICAgKlxuICAgICAqIENhbiBiZSB3YXRjaGVkLlxuICAgICAqL1xuICAgIGdldCBhY3RpdmVUYWJsZUlkKCk6IFRhYmxlSWQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuYWN0aXZlVGFibGVJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnRseSBhY3RpdmUgdmlldyBJRC4gVGhpcyB3aWxsIGFsd2F5cyBiZSBhIHZpZXcgYmVsb25naW5nIHRvIGBhY3RpdmVUYWJsZUlkYC4gQ2FuIGJlXG4gICAgICogbnVsbCB3aGVuIHRoZSBhY3RpdmUgdmlldyBoYXMgY2hhbmdlZCBhbmQgaXMgbm90IHlldCBsb2FkZWQsIGFuZCBjYW4gYWxzbyByZWZlciB0byBhIHZpZXdcbiAgICAgKiB0aGF0IGlzIG5vdCB5ZXQgbG9hZGVkLlxuICAgICAqXG4gICAgICogV2hlbiBmZXRjaGluZyB0aGUge0BsaW5rIFZpZXd9LCB1c2UgYHRhYmxlLmdldFZpZXdCeUlkSWZFeGlzdHMoY3Vyc29yLmFjdGl2ZVZpZXdJZClgIGFuZFxuICAgICAqIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgaXMgbm90IGBudWxsYCB0byBiZSByZXNpbGllbnQgdG8gdGhvc2UgY2FzZXMuXG4gICAgICpcbiAgICAgKiBDYW4gYmUgd2F0Y2hlZC5cbiAgICAgKi9cbiAgICBnZXQgYWN0aXZlVmlld0lkKCk6IFZpZXdJZCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5hY3RpdmVWaWV3SWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNwZWNpZmllZCB0YWJsZSB0byBhY3RpdmUgaW4gdGhlIEFpcnRhYmxlIFVJLiBJZiB0aGUgYXBwcyBwYW5lIGlzIGZ1bGxzY3JlZW4sIHRoZVxuICAgICAqIHRhYmxlIHdpbGwgc3RpbGwgYmUgc2V0IGFzIGFjdGl2ZSwgYnV0IHRoZSBhcHBzIHBhbmUgd2lsbCBjb250aW51ZSB0byBiZSBkaXNwbGF5ZWRcbiAgICAgKiBmdWxsc2NyZWVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhYmxlT3JUYWJsZUlkIFRoZSB0YXJnZXQgdGFibGUgb3IgdGFibGUgSUQgdG8gc2V0IGFzIGFjdGl2ZSBpbiB0aGUgQWlydGFibGUgbWFpbiBwYWdlLlxuICAgICAqL1xuICAgIHNldEFjdGl2ZVRhYmxlKHRhYmxlT3JUYWJsZUlkOiBUYWJsZSB8IFRhYmxlSWQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGVJZCA9IHRhYmxlT3JUYWJsZUlkIGluc3RhbmNlb2YgVGFibGUgPyB0YWJsZU9yVGFibGVJZC5pZCA6IHRhYmxlT3JUYWJsZUlkO1xuICAgICAgICB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZS5zZXRBY3RpdmVWaWV3T3JUYWJsZSh0YWJsZUlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIHZpZXcgKGFuZCBjb3JyZXNwb25kaW5nIHRhYmxlKSB0byBhY3RpdmUgaW4gdGhlIEFpcnRhYmxlIFVJLiBJZiB0aGUgYXBwc1xuICAgICAqIHBhbmUgaXMgZnVsbHNjcmVlbiwgdGhlIHZpZXcgd2lsbCBzdGlsbCBiZSBzZXQgYXMgYWN0aXZlLCBidXQgdGhlIGFwcHMgcGFuZSB3aWxsIGNvbnRpbnVlXG4gICAgICogdG8gYmUgZGlzcGxheWVkIGZ1bGxzY3JlZW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFibGVPclRhYmxlSWQgVGhlIHRhYmxlIG9yIHRhYmxlIElEIHRoYXQgdGhlIHRhcmdldCB2aWV3IGJlbG9uZ3MgdG8uXG4gICAgICogQHBhcmFtIHZpZXdPclZpZXdJZCBUaGUgdGFyZ2V0IHZpZXcgb3IgdmlldyBJRCB0byBzZXQgYXMgYWN0aXZlIGluIHRoZSBBaXJ0YWJsZSBtYWluIHBhZ2UuXG4gICAgICovXG4gICAgc2V0QWN0aXZlVmlldyh0YWJsZU9yVGFibGVJZDogVGFibGUgfCBUYWJsZUlkLCB2aWV3T3JWaWV3SWQ6IFZpZXcgfCBWaWV3SWQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGVJZCA9IHRhYmxlT3JUYWJsZUlkIGluc3RhbmNlb2YgVGFibGUgPyB0YWJsZU9yVGFibGVJZC5pZCA6IHRhYmxlT3JUYWJsZUlkO1xuICAgICAgICBjb25zdCB2aWV3SWQgPSB2aWV3T3JWaWV3SWQgaW5zdGFuY2VvZiBWaWV3ID8gdmlld09yVmlld0lkLmlkIDogdmlld09yVmlld0lkO1xuICAgICAgICB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZS5zZXRBY3RpdmVWaWV3T3JUYWJsZSh0YWJsZUlkLCB2aWV3SWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9fYXBwbHlDaGFuZ2VzV2l0aG91dFRyaWdnZXJpbmdFdmVudHMoXG4gICAgICAgIGNoYW5nZXM6IFJlYWRvbmx5QXJyYXk8TW9kZWxDaGFuZ2U+LFxuICAgICk6IE9iamVjdE1hcDxXYXRjaGFibGVDdXJzb3JLZXksIGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IGNoYW5nZWRLZXlzID0ge1xuICAgICAgICAgICAgW1dhdGNoYWJsZUN1cnNvcktleXMuc2VsZWN0ZWRSZWNvcmRJZHNdOiBmYWxzZSxcbiAgICAgICAgICAgIFtXYXRjaGFibGVDdXJzb3JLZXlzLmFjdGl2ZVRhYmxlSWRdOiBmYWxzZSxcbiAgICAgICAgICAgIFtXYXRjaGFibGVDdXJzb3JLZXlzLmFjdGl2ZVZpZXdJZF06IGZhbHNlLFxuICAgICAgICB9IGFzIE9iamVjdE1hcDxXYXRjaGFibGVDdXJzb3JLZXksIGJvb2xlYW4+O1xuICAgICAgICBmb3IgKGNvbnN0IHtwYXRoLCB2YWx1ZX0gb2YgY2hhbmdlcykge1xuICAgICAgICAgICAgaWYgKHBhdGhbMF0gPT09ICdjdXJzb3JEYXRhJykge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAocGF0aFsxXSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzZWxlY3RlZFJlY29yZElkU2V0Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52YXJpYW50KHBhdGgubGVuZ3RoID09PSAyLCAnY2Fubm90IHNldCB3aXRoaW4gc2VsZWN0ZWRSZWNvcmRJZFNldCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yRGF0YS5zZWxlY3RlZFJlY29yZElkU2V0ID0gdmFsdWUgYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZEtleXNbV2F0Y2hhYmxlQ3Vyc29yS2V5cy5zZWxlY3RlZFJlY29yZElkc10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc2VsZWN0ZWRGaWVsZElkU2V0Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52YXJpYW50KHBhdGgubGVuZ3RoID09PSAyLCAnY2Fubm90IHNldCB3aXRoaW4gc2VsZWN0ZWRGaWVsZElkU2V0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJzb3JEYXRhLnNlbGVjdGVkRmllbGRJZFNldCA9IHZhbHVlIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRLZXlzW1dhdGNoYWJsZUN1cnNvcktleXMuc2VsZWN0ZWRGaWVsZElkc10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gTm8tb3AgZm9yIGZ1dHVyZSB1bmtub3duIHBhdGhzLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhdGhbMF0gPT09ICdhY3RpdmVUYWJsZUlkJykge1xuICAgICAgICAgICAgICAgIGludmFyaWFudChcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FjdGl2ZVRhYmxlSWQgbXVzdCBiZSBzdHJpbmcgb3IgbnVsbCcsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvckRhdGEuYWN0aXZlVGFibGVJZCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGNoYW5nZWRLZXlzW1dhdGNoYWJsZUN1cnNvcktleXMuYWN0aXZlVGFibGVJZF0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvckRhdGEuYWN0aXZlVmlld0lkID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZEtleXNbV2F0Y2hhYmxlQ3Vyc29yS2V5cy5hY3RpdmVWaWV3SWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBwYXRoWzBdID09PSAndGFibGVzQnlJZCcgJiZcbiAgICAgICAgICAgICAgICBwYXRoWzFdID09PSB0aGlzLmFjdGl2ZVRhYmxlSWQgJiZcbiAgICAgICAgICAgICAgICBwYXRoWzJdID09PSAnYWN0aXZlVmlld0lkJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaW52YXJpYW50KFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAnYWN0aXZlVGFibGVJZCBtdXN0IGJlIHN0cmluZyBvciBudWxsJyxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yRGF0YS5hY3RpdmVWaWV3SWQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBjaGFuZ2VkS2V5c1tXYXRjaGFibGVDdXJzb3JLZXlzLmFjdGl2ZVZpZXdJZF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoYW5nZWRLZXlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfX3RyaWdnZXJPbkNoYW5nZUZvckNoYW5nZWRLZXlzKGNoYW5nZWRLZXlzOiBPYmplY3RNYXA8V2F0Y2hhYmxlQ3Vyc29yS2V5LCBib29sZWFuPikge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRpZENoYW5nZV0gb2YgZW50cmllcyhjaGFuZ2VkS2V5cykpIHtcbiAgICAgICAgICAgIGlmIChkaWRDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDdXJzb3I7XG4iXX0=
|
package/dist/cjs/models/field.js
CHANGED
|
@@ -109,7 +109,9 @@ function (_AbstractModel) {
|
|
|
109
109
|
(0, _classCallCheck2.default)(this, Field);
|
|
110
110
|
_this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Field).call(this, sdk, fieldId));
|
|
111
111
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_parentTable", void 0);
|
|
112
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_cachedFieldTypeConfigOrNull", void 0);
|
|
112
113
|
_this._parentTable = parentTable;
|
|
114
|
+
_this._cachedFieldTypeConfigOrNull = null;
|
|
113
115
|
return _this;
|
|
114
116
|
}
|
|
115
117
|
/**
|
|
@@ -118,6 +120,42 @@ function (_AbstractModel) {
|
|
|
118
120
|
|
|
119
121
|
|
|
120
122
|
(0, _createClass2.default)(Field, [{
|
|
123
|
+
key: "_getCachedConfigFromFieldTypeProvider",
|
|
124
|
+
// We use a cached response from FieldTypeProvider because getting the config can
|
|
125
|
+
// be an expensive operation. In particular when fieldConfigs are extremely large
|
|
126
|
+
// (eg: Select fields with lots of select options)
|
|
127
|
+
value: function _getCachedConfigFromFieldTypeProvider() {
|
|
128
|
+
if (this._cachedFieldTypeConfigOrNull !== null) {
|
|
129
|
+
return this._cachedFieldTypeConfigOrNull;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
var airtableInterface = this._sdk.__airtableInterface;
|
|
133
|
+
var appInterface = this._sdk.__appInterface;
|
|
134
|
+
this._cachedFieldTypeConfigOrNull = airtableInterface.fieldTypeProvider.getConfig(appInterface, this._data, this.parentTable.__getFieldNamesById());
|
|
135
|
+
return this._cachedFieldTypeConfigOrNull;
|
|
136
|
+
}
|
|
137
|
+
}, {
|
|
138
|
+
key: "_clearCachedConfig",
|
|
139
|
+
value: function _clearCachedConfig() {
|
|
140
|
+
this._cachedFieldTypeConfigOrNull = null;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* The type and options of the field to make type narrowing `FieldOptions` easier.
|
|
144
|
+
*
|
|
145
|
+
* @see {@link FieldConfig}
|
|
146
|
+
* @example
|
|
147
|
+
* const fieldConfig = field.config;
|
|
148
|
+
* if (fieldConfig.type === FieldType.SINGLE_SELECT) {
|
|
149
|
+
* return fieldConfig.options.choices;
|
|
150
|
+
* } else if (fieldConfig.type === FieldType.MULTIPLE_LOOKUP_VALUES && fieldConfig.options.isValid) {
|
|
151
|
+
* if (fieldConfig.options.result.type === FieldType.SINGLE_SELECT) {
|
|
152
|
+
* return fieldConfig.options.result.options.choices;
|
|
153
|
+
* }
|
|
154
|
+
* }
|
|
155
|
+
* return DEFAULT_CHOICES;
|
|
156
|
+
*/
|
|
157
|
+
|
|
158
|
+
}, {
|
|
121
159
|
key: "checkPermissionsForUpdateOptions",
|
|
122
160
|
|
|
123
161
|
/**
|
|
@@ -125,7 +163,7 @@ function (_AbstractModel) {
|
|
|
125
163
|
*
|
|
126
164
|
* Accepts partial input, in the same format as {@link updateOptionsAsync}.
|
|
127
165
|
*
|
|
128
|
-
* Returns `{hasPermission: true}` if the current user can update the specified
|
|
166
|
+
* Returns `{hasPermission: true}` if the current user can update the specified field,
|
|
129
167
|
* `{hasPermission: false, reasonDisplayString: string}` otherwise. `reasonDisplayString` may be
|
|
130
168
|
* used to display an error message to the user.
|
|
131
169
|
*
|
|
@@ -241,6 +279,104 @@ function (_AbstractModel) {
|
|
|
241
279
|
}
|
|
242
280
|
}, null, this);
|
|
243
281
|
}
|
|
282
|
+
/**
|
|
283
|
+
* Checks whether the current user has permission to perform the given description update.
|
|
284
|
+
*
|
|
285
|
+
* Accepts partial input, in the same format as {@link updateDescriptionAsync}.
|
|
286
|
+
*
|
|
287
|
+
* Returns `{hasPermission: true}` if the current user can update the specified field,
|
|
288
|
+
* `{hasPermission: false, reasonDisplayString: string}` otherwise. `reasonDisplayString` may be
|
|
289
|
+
* used to display an error message to the user.
|
|
290
|
+
*
|
|
291
|
+
* @param description new description for the field
|
|
292
|
+
*
|
|
293
|
+
* @example
|
|
294
|
+
* ```js
|
|
295
|
+
* const updateFieldCheckResult = field.checkPermissionsForUpdateDescription();
|
|
296
|
+
*
|
|
297
|
+
* if (!updateFieldCheckResult.hasPermission) {
|
|
298
|
+
* alert(updateFieldCheckResult.reasonDisplayString);
|
|
299
|
+
* }
|
|
300
|
+
* ```
|
|
301
|
+
*/
|
|
302
|
+
|
|
303
|
+
}, {
|
|
304
|
+
key: "checkPermissionsForUpdateDescription",
|
|
305
|
+
value: function checkPermissionsForUpdateDescription(description) {
|
|
306
|
+
return this._sdk.__mutations.checkPermissionsForMutation({
|
|
307
|
+
type: _mutations.MutationTypes.UPDATE_SINGLE_FIELD_DESCRIPTION,
|
|
308
|
+
tableId: this.parentTable.id,
|
|
309
|
+
id: this.id,
|
|
310
|
+
description
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* An alias for `checkPermissionsForUpdateDescription(options).hasPermission`.
|
|
315
|
+
*
|
|
316
|
+
* Checks whether the current user has permission to perform the description update.
|
|
317
|
+
*
|
|
318
|
+
* Accepts partial input, in the same format as {@link updateDescriptionAsync}.
|
|
319
|
+
*
|
|
320
|
+
* @param description new description for the field
|
|
321
|
+
*
|
|
322
|
+
* @example
|
|
323
|
+
* ```js
|
|
324
|
+
* const canUpdateField = field.hasPermissionToUpdateDescription();
|
|
325
|
+
*
|
|
326
|
+
* if (!canUpdateField) {
|
|
327
|
+
* alert('not allowed!');
|
|
328
|
+
* }
|
|
329
|
+
* ```
|
|
330
|
+
*/
|
|
331
|
+
|
|
332
|
+
}, {
|
|
333
|
+
key: "hasPermissionToUpdateDescription",
|
|
334
|
+
value: function hasPermissionToUpdateDescription(description) {
|
|
335
|
+
return this.checkPermissionsForUpdateDescription(description).hasPermission;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Updates the description for this field.
|
|
339
|
+
*
|
|
340
|
+
* To remove an existing description, pass `''` as the new description.
|
|
341
|
+
* `null` is also accepted and will be coerced to `''` for consistency with field creation.
|
|
342
|
+
*
|
|
343
|
+
* Throws an error if the user does not have permission to update the field, or if an invalid
|
|
344
|
+
* description is provided.
|
|
345
|
+
*
|
|
346
|
+
* This action is asynchronous. Unlike updates to cell values, updates to field descriptions are
|
|
347
|
+
* **not** applied optimistically locally. You must `await` the returned promise before
|
|
348
|
+
* relying on the change in your app.
|
|
349
|
+
*
|
|
350
|
+
* @param description new description for the field
|
|
351
|
+
*
|
|
352
|
+
* @example
|
|
353
|
+
* ```js
|
|
354
|
+
* await myTextField.updateDescriptionAsync('This is a text field');
|
|
355
|
+
* ```
|
|
356
|
+
*/
|
|
357
|
+
|
|
358
|
+
}, {
|
|
359
|
+
key: "updateDescriptionAsync",
|
|
360
|
+
value: function updateDescriptionAsync(description) {
|
|
361
|
+
return _regenerator.default.async(function updateDescriptionAsync$(_context2) {
|
|
362
|
+
while (1) {
|
|
363
|
+
switch (_context2.prev = _context2.next) {
|
|
364
|
+
case 0:
|
|
365
|
+
_context2.next = 2;
|
|
366
|
+
return _regenerator.default.awrap(this._sdk.__mutations.applyMutationAsync({
|
|
367
|
+
type: _mutations.MutationTypes.UPDATE_SINGLE_FIELD_DESCRIPTION,
|
|
368
|
+
tableId: this.parentTable.id,
|
|
369
|
+
id: this.id,
|
|
370
|
+
description
|
|
371
|
+
}));
|
|
372
|
+
|
|
373
|
+
case 2:
|
|
374
|
+
case "end":
|
|
375
|
+
return _context2.stop();
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}, null, this);
|
|
379
|
+
}
|
|
244
380
|
/**
|
|
245
381
|
* `true` if this field is computed, `false` otherwise. A field is
|
|
246
382
|
* "computed" if it's value is not set by user input (e.g. autoNumber, formula,
|
|
@@ -329,6 +465,9 @@ function (_AbstractModel) {
|
|
|
329
465
|
}, {
|
|
330
466
|
key: "__triggerOnChangeForDirtyPaths",
|
|
331
467
|
value: function __triggerOnChangeForDirtyPaths(dirtyPaths) {
|
|
468
|
+
// Always clear the cached config when anything on the field data model changes
|
|
469
|
+
this._clearCachedConfig();
|
|
470
|
+
|
|
332
471
|
if (dirtyPaths.name) {
|
|
333
472
|
this._onChange(WatchableFieldKeys.name);
|
|
334
473
|
}
|
|
@@ -402,11 +541,8 @@ function (_AbstractModel) {
|
|
|
402
541
|
}, {
|
|
403
542
|
key: "type",
|
|
404
543
|
get: function get() {
|
|
405
|
-
var
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
var _airtableInterface$fi = airtableInterface.fieldTypeProvider.getConfig(appInterface, this._data, this.parentTable.__getFieldNamesById()),
|
|
409
|
-
type = _airtableInterface$fi.type; // We intend to switch from "lookup" to "multipleLookupValues", but need to support both
|
|
544
|
+
var _this$_getCachedConfi = this._getCachedConfigFromFieldTypeProvider(),
|
|
545
|
+
type = _this$_getCachedConfi.type; // We intend to switch from "lookup" to "multipleLookupValues", but need to support both
|
|
410
546
|
// until the transition is complete. See <https://airtable.quip.com/VxaMAmAfUscs> for more.
|
|
411
547
|
// @ts-ignore
|
|
412
548
|
|
|
@@ -437,31 +573,14 @@ function (_AbstractModel) {
|
|
|
437
573
|
}, {
|
|
438
574
|
key: "options",
|
|
439
575
|
get: function get() {
|
|
440
|
-
var
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
options = _airtableInterface$fi2.options; // TODO(emma): can we remove this cloneDeep?
|
|
576
|
+
var _this$_getCachedConfi2 = this._getCachedConfigFromFieldTypeProvider(),
|
|
577
|
+
options = _this$_getCachedConfi2.options; // TODO: In the next breaking release freeze (inside of the cache) and replace
|
|
578
|
+
// FieldOptions with readonly<FieldOptions>.
|
|
579
|
+
// Today this is required because we re-use the fieldTypeProvider.getConfig response.
|
|
445
580
|
|
|
446
581
|
|
|
447
582
|
return options ? (0, _private_utils.cloneDeep)(options) : null;
|
|
448
583
|
}
|
|
449
|
-
/**
|
|
450
|
-
* The type and options of the field to make type narrowing `FieldOptions` easier.
|
|
451
|
-
*
|
|
452
|
-
* @see {@link FieldConfig}
|
|
453
|
-
* @example
|
|
454
|
-
* const fieldConfig = field.config;
|
|
455
|
-
* if (fieldConfig.type === FieldType.SINGLE_SELECT) {
|
|
456
|
-
* return fieldConfig.options.choices;
|
|
457
|
-
* } else if (fieldConfig.type === FieldType.MULTIPLE_LOOKUP_VALUES && fieldConfig.options.isValid) {
|
|
458
|
-
* if (fieldConfig.options.result.type === FieldType.SINGLE_SELECT) {
|
|
459
|
-
* return fieldConfig.options.result.options.choices;
|
|
460
|
-
* }
|
|
461
|
-
* }
|
|
462
|
-
* return DEFAULT_CHOICES;
|
|
463
|
-
*/
|
|
464
|
-
|
|
465
584
|
}, {
|
|
466
585
|
key: "config",
|
|
467
586
|
get: function get() {
|
|
@@ -532,4 +651,5 @@ function (_AbstractModel) {
|
|
|
532
651
|
|
|
533
652
|
(0, _defineProperty2.default)(Field, "_className", 'Field');
|
|
534
653
|
var _default = Field;
|
|
535
|
-
exports.default = _default;
|
|
654
|
+
exports.default = _default;
|
|
655
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvZmllbGQudHMiXSwibmFtZXMiOlsiV2F0Y2hhYmxlRmllbGRLZXlzIiwiT2JqZWN0IiwiZnJlZXplIiwibmFtZSIsInR5cGUiLCJvcHRpb25zIiwiaXNDb21wdXRlZCIsImRlc2NyaXB0aW9uIiwiRmllbGQiLCJrZXkiLCJzZGsiLCJwYXJlbnRUYWJsZSIsImZpZWxkSWQiLCJfcGFyZW50VGFibGUiLCJfY2FjaGVkRmllbGRUeXBlQ29uZmlnT3JOdWxsIiwiYWlydGFibGVJbnRlcmZhY2UiLCJfc2RrIiwiX19haXJ0YWJsZUludGVyZmFjZSIsImFwcEludGVyZmFjZSIsIl9fYXBwSW50ZXJmYWNlIiwiZmllbGRUeXBlUHJvdmlkZXIiLCJnZXRDb25maWciLCJfZGF0YSIsIl9fZ2V0RmllbGROYW1lc0J5SWQiLCJfX211dGF0aW9ucyIsImNoZWNrUGVybWlzc2lvbnNGb3JNdXRhdGlvbiIsIk11dGF0aW9uVHlwZXMiLCJVUERBVEVfU0lOR0xFX0ZJRUxEX0NPTkZJRyIsInRhYmxlSWQiLCJpZCIsImNvbmZpZyIsImNoZWNrUGVybWlzc2lvbnNGb3JVcGRhdGVPcHRpb25zIiwiaGFzUGVybWlzc2lvbiIsIm9wdHMiLCJhcHBseU11dGF0aW9uQXN5bmMiLCJVUERBVEVfU0lOR0xFX0ZJRUxEX0RFU0NSSVBUSU9OIiwiY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZURlc2NyaXB0aW9uIiwiYWdncmVnYXRvciIsImFnZ3JlZ2F0b3JLZXkiLCJhdmFpbGFibGVBZ2dyZWdhdG9yS2V5cyIsImFnZ3JlZ2F0b3JzIiwiZ2V0QXZhaWxhYmxlQWdncmVnYXRvcktleXNGb3JGaWVsZCIsInNvbWUiLCJzdHJpbmciLCJjZWxsVmFsdWUiLCJjb252ZXJ0U3RyaW5nVG9DZWxsVmFsdWUiLCJ2YWxpZGF0aW9uUmVzdWx0IiwidmFsaWRhdGVDZWxsVmFsdWVGb3JVcGRhdGUiLCJpc1ZhbGlkIiwiZGlydHlQYXRocyIsIl9jbGVhckNhY2hlZENvbmZpZyIsIl9vbkNoYW5nZSIsInR5cGVPcHRpb25zIiwidGFibGVEYXRhIiwiX2Jhc2VEYXRhIiwidGFibGVzQnlJZCIsImZpZWxkc0J5SWQiLCJfaWQiLCJfZ2V0Q2FjaGVkQ29uZmlnRnJvbUZpZWxkVHlwZVByb3ZpZGVyIiwiRmllbGRUeXBlIiwiTVVMVElQTEVfTE9PS1VQX1ZBTFVFUyIsInByaW1hcnlGaWVsZCIsImF2YWlsYWJsZUFnZ3JlZ2F0b3JLZXlzU2V0IiwiU2V0IiwicmVxdWlyZSIsImZpbHRlciIsImhhcyIsIkFic3RyYWN0TW9kZWwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFQQTs7QUFBOEM7QUFXOUM7QUFDQTtBQUNBLElBQU1BLGtCQUFrQixHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUNyQ0MsRUFBQUEsSUFBSSxFQUFFLE1BRCtCO0FBRXJDQyxFQUFBQSxJQUFJLEVBQUUsTUFGK0I7QUFHckNDLEVBQUFBLE9BQU8sRUFBRSxTQUg0QjtBQUlyQ0MsRUFBQUEsVUFBVSxFQUFFLFlBSnlCO0FBS3JDQyxFQUFBQSxXQUFXLEVBQUU7QUFMd0IsQ0FBZCxDQUEzQjtBQVFBOzs7Ozs7Ozs7QUFVQTs7Ozs7Ozs7Ozs7OztJQWFNQyxLOzs7Ozs7O0FBQ0Y7O0FBRUE7b0NBQ3VCQyxHLEVBQWE7QUFDaEMsYUFBTyxnQ0FBWVQsa0JBQVosRUFBZ0NTLEdBQWhDLENBQVA7QUFDSDtBQUNEOzs7O0FBSUE7OztBQUdBLGlCQUFZQyxHQUFaLEVBQXNCQyxXQUF0QixFQUEwQ0MsT0FBMUMsRUFBMkQ7QUFBQTs7QUFBQTtBQUN2RCwyR0FBTUYsR0FBTixFQUFXRSxPQUFYO0FBRHVEO0FBQUE7QUFHdkQsVUFBS0MsWUFBTCxHQUFvQkYsV0FBcEI7QUFDQSxVQUFLRyw0QkFBTCxHQUFvQyxJQUFwQztBQUp1RDtBQUsxRDtBQUVEOzs7Ozs7O0FBOEVBO0FBQ0E7QUFDQTs0REFDeUQ7QUFD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V0FObUM7O0FBTzFDLGFBQU8sMkJBQU9BLFdBQVAsRUFBb0J5QixNQUFwQixDQUEyQjVCLFVBQVUsSUFBSTtBQUM1QyxlQUFPeUIsMEJBQTBCLENBQUNJLEdBQTNCLENBQStCN0IsVUFBVSxDQUFDNUIsR0FBMUMsQ0FBUDtBQUNILE9BRk0sQ0FBUDtBQUdIOzs7RUFsWWUwRCx1Qjs7OEJBQWQzRCxLLGdCQUVrQixPO2VBdWVUQSxLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGFpcnRhYmxlL2Jsb2Nrcy9tb2RlbHM6IEZpZWxkICovIC8qKiAqL1xuaW1wb3J0IHtBZ2dyZWdhdG9yS2V5fSBmcm9tICcuLi90eXBlcy9hZ2dyZWdhdG9ycyc7XG5pbXBvcnQgU2RrIGZyb20gJy4uL3Nkayc7XG5pbXBvcnQge011dGF0aW9uVHlwZXMsIFBlcm1pc3Npb25DaGVja1Jlc3VsdCwgVXBkYXRlRmllbGRPcHRpb25zT3B0c30gZnJvbSAnLi4vdHlwZXMvbXV0YXRpb25zJztcbmltcG9ydCB7RmllbGREYXRhLCBGaWVsZFR5cGUsIEZpZWxkT3B0aW9ucywgRmllbGRDb25maWd9IGZyb20gJy4uL3R5cGVzL2ZpZWxkJztcbmltcG9ydCB7aXNFbnVtVmFsdWUsIGNsb25lRGVlcCwgdmFsdWVzLCBPYmplY3RWYWx1ZXMsIEZsb3dBbnlPYmplY3R9IGZyb20gJy4uL3ByaXZhdGVfdXRpbHMnO1xuaW1wb3J0IHtGaWVsZFR5cGVDb25maWd9IGZyb20gJy4uL3R5cGVzL2FpcnRhYmxlX2ludGVyZmFjZSc7XG5pbXBvcnQgQWJzdHJhY3RNb2RlbCBmcm9tICcuL2Fic3RyYWN0X21vZGVsJztcbmltcG9ydCB7QWdncmVnYXRvcn0gZnJvbSAnLi9jcmVhdGVfYWdncmVnYXRvcnMnO1xuaW1wb3J0IFRhYmxlIGZyb20gJy4vdGFibGUnO1xuXG4vLyBUaGlzIGRvZXNuJ3QgZm9sbG93IG91ciBlbnVtIG5hbWluZyBjb252ZW50aW9ucyBiZWNhdXNlIHdlIHdhbnQgdGhlIGtleXNcbi8vIHRvIG1pcnJvciB0aGUgbWV0aG9kL2dldHRlciBuYW1lcyBvbiB0aGUgbW9kZWwgY2xhc3MuXG5jb25zdCBXYXRjaGFibGVGaWVsZEtleXMgPSBPYmplY3QuZnJlZXplKHtcbiAgICBuYW1lOiAnbmFtZScgYXMgY29uc3QsXG4gICAgdHlwZTogJ3R5cGUnIGFzIGNvbnN0LFxuICAgIG9wdGlvbnM6ICdvcHRpb25zJyBhcyBjb25zdCxcbiAgICBpc0NvbXB1dGVkOiAnaXNDb21wdXRlZCcgYXMgY29uc3QsXG4gICAgZGVzY3JpcHRpb246ICdkZXNjcmlwdGlvbicgYXMgY29uc3QsXG59KTtcblxuLyoqXG4gKiBBbGwgdGhlIHdhdGNoYWJsZSBrZXlzIGluIGEgZmllbGQuXG4gKiAtIGBuYW1lYFxuICogLSBgdHlwZWBcbiAqIC0gYG9wdGlvbnNgXG4gKiAtIGBpc0NvbXB1dGVkYFxuICogLSBgZGVzY3JpcHRpb25gXG4gKi9cbmV4cG9ydCB0eXBlIFdhdGNoYWJsZUZpZWxkS2V5ID0gT2JqZWN0VmFsdWVzPHR5cGVvZiBXYXRjaGFibGVGaWVsZEtleXM+O1xuXG4vKipcbiAqIE1vZGVsIGNsYXNzIHJlcHJlc2VudGluZyBhIGZpZWxkIGluIGEgdGFibGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGpzXG4gKiBpbXBvcnQge2Jhc2V9IGZyb20gJ0BhaXJ0YWJsZS9ibG9ja3MnO1xuICpcbiAqIGNvbnN0IHRhYmxlID0gYmFzZS5nZXRUYWJsZUJ5TmFtZSgnVGFibGUgMScpO1xuICogY29uc3QgZmllbGQgPSB0YWJsZS5nZXRGaWVsZEJ5TmFtZSgnTmFtZScpO1xuICogY29uc29sZS5sb2coJ1RoZSB0eXBlIG9mIHRoaXMgZmllbGQgaXMnLCBmaWVsZC50eXBlKTtcbiAqIGBgYFxuICogQGRvY3NQYXRoIG1vZGVscy9GaWVsZFxuICovXG5jbGFzcyBGaWVsZCBleHRlbmRzIEFic3RyYWN0TW9kZWw8RmllbGREYXRhLCBXYXRjaGFibGVGaWVsZEtleT4ge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBzdGF0aWMgX2NsYXNzTmFtZSA9ICdGaWVsZCc7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBfaXNXYXRjaGFibGVLZXkoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGlzRW51bVZhbHVlKFdhdGNoYWJsZUZpZWxkS2V5cywga2V5KTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9wYXJlbnRUYWJsZTogVGFibGU7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9jYWNoZWRGaWVsZFR5cGVDb25maWdPck51bGw6IEZpZWxkVHlwZUNvbmZpZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2RrOiBTZGssIHBhcmVudFRhYmxlOiBUYWJsZSwgZmllbGRJZDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHNkaywgZmllbGRJZCk7XG5cbiAgICAgICAgdGhpcy5fcGFyZW50VGFibGUgPSBwYXJlbnRUYWJsZTtcbiAgICAgICAgdGhpcy5fY2FjaGVkRmllbGRUeXBlQ29uZmlnT3JOdWxsID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgX2RhdGFPck51bGxJZkRlbGV0ZWQoKTogRmllbGREYXRhIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRhYmxlRGF0YSA9IHRoaXMuX2Jhc2VEYXRhLnRhYmxlc0J5SWRbdGhpcy5wYXJlbnRUYWJsZS5pZF07XG4gICAgICAgIHJldHVybiB0YWJsZURhdGE/LmZpZWxkc0J5SWRbdGhpcy5faWRdID8/IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB0YWJsZSB0aGF0IHRoaXMgZmllbGQgYmVsb25ncyB0by4gU2hvdWxkIG5ldmVyIGNoYW5nZSBiZWNhdXNlIGZpZWxkcyBhcmVuJ3QgbW92ZWQgYmV0d2VlbiB0YWJsZXMuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWwgKHNpbmNlIHdlIG1heSBub3QgYmUgYWJsZSB0byByZXR1cm4gcGFyZW50IG1vZGVsIGluc3RhbmNlcyBpbiB0aGUgaW1tdXRhYmxlIG1vZGVscyB3b3JsZClcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGQgPSBteVRhYmxlLmdldEZpZWxkQnlOYW1lKCdOYW1lJyk7XG4gICAgICogY29uc29sZS5sb2coZmllbGQucGFyZW50VGFibGUuaWQgPT09IG15VGFibGUuaWQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgcGFyZW50VGFibGUoKTogVGFibGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50VGFibGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmaWVsZC4gQ2FuIGJlIHdhdGNoZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc29sZS5sb2cobXlGaWVsZC5uYW1lKTtcbiAgICAgKiAvLyA9PiAnTmFtZSdcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5uYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgZmllbGQuIENhbiBiZSB3YXRjaGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnNvbGUubG9nKG15RmllbGQudHlwZSk7XG4gICAgICogLy8gPT4gJ3NpbmdsZUxpbmVUZXh0J1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCB0eXBlKCk6IEZpZWxkVHlwZSB7XG4gICAgICAgIGNvbnN0IHt0eXBlfSA9IHRoaXMuX2dldENhY2hlZENvbmZpZ0Zyb21GaWVsZFR5cGVQcm92aWRlcigpO1xuICAgICAgICAvLyBXZSBpbnRlbmQgdG8gc3dpdGNoIGZyb20gXCJsb29rdXBcIiB0byBcIm11bHRpcGxlTG9va3VwVmFsdWVzXCIsIGJ1dCBuZWVkIHRvIHN1cHBvcnQgYm90aFxuICAgICAgICAvLyB1bnRpbCB0aGUgdHJhbnNpdGlvbiBpcyBjb21wbGV0ZS4gU2VlIDxodHRwczovL2FpcnRhYmxlLnF1aXAuY29tL1Z4YU1BbUFmVXNjcz4gZm9yIG1vcmUuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHR5cGUgPT09ICdsb29rdXAnKSB7XG4gICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLk1VTFRJUExFX0xPT0tVUF9WQUxVRVM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIG9mIHRoZSBmaWVsZC4gVGhlIHN0cnVjdHVyZSBvZiB0aGUgZmllbGQnc1xuICAgICAqIG9wdGlvbnMgZGVwZW5kIG9uIHRoZSBmaWVsZCdzIHR5cGUuIGBudWxsYCBpZiB0aGUgZmllbGQgaGFzIG5vIG9wdGlvbnMuXG4gICAgICogQ2FuIGJlIHdhdGNoZWQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBGaWVsZFR5cGV9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7RmllbGRUeXBlfSBmcm9tICdAYWlydGFibGUvYmxvY2tzL21vZGVscyc7XG4gICAgICpcbiAgICAgKiBpZiAobXlGaWVsZC50eXBlID09PSBGaWVsZFR5cGUuQ1VSUkVOQ1kpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2cobXlGaWVsZC5vcHRpb25zLnN5bWJvbCk7XG4gICAgICogICAgIC8vID0+ICckJ1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgb3B0aW9ucygpOiBGaWVsZE9wdGlvbnMgfCBudWxsIHtcbiAgICAgICAgY29uc3Qge29wdGlvbnN9ID0gdGhpcy5fZ2V0Q2FjaGVkQ29uZmlnRnJvbUZpZWxkVHlwZVByb3ZpZGVyKCk7XG5cbiAgICAgICAgLy8gVE9ETzogSW4gdGhlIG5leHQgYnJlYWtpbmcgcmVsZWFzZSBmcmVlemUgKGluc2lkZSBvZiB0aGUgY2FjaGUpIGFuZCByZXBsYWNlXG4gICAgICAgIC8vIEZpZWxkT3B0aW9ucyB3aXRoIHJlYWRvbmx5PEZpZWxkT3B0aW9ucz4uXG4gICAgICAgIC8vIFRvZGF5IHRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSB3ZSByZS11c2UgdGhlIGZpZWxkVHlwZVByb3ZpZGVyLmdldENvbmZpZyByZXNwb25zZS5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnMgPyBjbG9uZURlZXAob3B0aW9ucykgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIFdlIHVzZSBhIGNhY2hlZCByZXNwb25zZSBmcm9tIEZpZWxkVHlwZVByb3ZpZGVyIGJlY2F1c2UgZ2V0dGluZyB0aGUgY29uZmlnIGNhblxuICAgIC8vIGJlIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24uIEluIHBhcnRpY3VsYXIgd2hlbiBmaWVsZENvbmZpZ3MgYXJlIGV4dHJlbWVseSBsYXJnZVxuICAgIC8vIChlZzogU2VsZWN0IGZpZWxkcyB3aXRoIGxvdHMgb2Ygc2VsZWN0IG9wdGlvbnMpXG4gICAgX2dldENhY2hlZENvbmZpZ0Zyb21GaWVsZFR5cGVQcm92aWRlcigpOiBGaWVsZFR5cGVDb25maWcge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVkRmllbGRUeXBlQ29uZmlnT3JOdWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkRmllbGRUeXBlQ29uZmlnT3JOdWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFpcnRhYmxlSW50ZXJmYWNlID0gdGhpcy5fc2RrLl9fYWlydGFibGVJbnRlcmZhY2U7XG4gICAgICAgIGNvbnN0IGFwcEludGVyZmFjZSA9IHRoaXMuX3Nkay5fX2FwcEludGVyZmFjZTtcblxuICAgICAgICB0aGlzLl9jYWNoZWRGaWVsZFR5cGVDb25maWdPck51bGwgPSBhaXJ0YWJsZUludGVyZmFjZS5maWVsZFR5cGVQcm92aWRlci5nZXRDb25maWcoXG4gICAgICAgICAgICBhcHBJbnRlcmZhY2UsXG4gICAgICAgICAgICB0aGlzLl9kYXRhLFxuICAgICAgICAgICAgdGhpcy5wYXJlbnRUYWJsZS5fX2dldEZpZWxkTmFtZXNCeUlkKCksXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZEZpZWxkVHlwZUNvbmZpZ09yTnVsbDtcbiAgICB9XG4gICAgX2NsZWFyQ2FjaGVkQ29uZmlnKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWNoZWRGaWVsZFR5cGVDb25maWdPck51bGwgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIGFuZCBvcHRpb25zIG9mIHRoZSBmaWVsZCB0byBtYWtlIHR5cGUgbmFycm93aW5nIGBGaWVsZE9wdGlvbnNgIGVhc2llci5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIEZpZWxkQ29uZmlnfVxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgZmllbGRDb25maWcgPSBmaWVsZC5jb25maWc7XG4gICAgICogaWYgKGZpZWxkQ29uZmlnLnR5cGUgPT09IEZpZWxkVHlwZS5TSU5HTEVfU0VMRUNUKSB7XG4gICAgICogICAgIHJldHVybiBmaWVsZENvbmZpZy5vcHRpb25zLmNob2ljZXM7XG4gICAgICogfSBlbHNlIGlmIChmaWVsZENvbmZpZy50eXBlID09PSBGaWVsZFR5cGUuTVVMVElQTEVfTE9PS1VQX1ZBTFVFUyAmJiBmaWVsZENvbmZpZy5vcHRpb25zLmlzVmFsaWQpIHtcbiAgICAgKiAgICAgaWYgKGZpZWxkQ29uZmlnLm9wdGlvbnMucmVzdWx0LnR5cGUgPT09IEZpZWxkVHlwZS5TSU5HTEVfU0VMRUNUKSB7XG4gICAgICogICAgICAgICByZXR1cm4gZmllbGRDb25maWcub3B0aW9ucy5yZXN1bHQub3B0aW9ucy5jaG9pY2VzO1xuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqIHJldHVybiBERUZBVUxUX0NIT0lDRVM7XG4gICAgICovXG4gICAgZ2V0IGNvbmZpZygpOiBGaWVsZENvbmZpZyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgIH0gYXMgRmllbGRDb25maWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGUgZ2l2ZW4gb3B0aW9ucyB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIHBhcnRpYWwgaW5wdXQsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB7QGxpbmsgdXBkYXRlT3B0aW9uc0FzeW5jfS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHtoYXNQZXJtaXNzaW9uOiB0cnVlfWAgaWYgdGhlIGN1cnJlbnQgdXNlciBjYW4gdXBkYXRlIHRoZSBzcGVjaWZpZWQgZmllbGQsXG4gICAgICogYHtoYXNQZXJtaXNzaW9uOiBmYWxzZSwgcmVhc29uRGlzcGxheVN0cmluZzogc3RyaW5nfWAgb3RoZXJ3aXNlLiBgcmVhc29uRGlzcGxheVN0cmluZ2AgbWF5IGJlXG4gICAgICogdXNlZCB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBuZXcgb3B0aW9ucyBmb3IgdGhlIGZpZWxkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdXBkYXRlRmllbGRDaGVja1Jlc3VsdCA9IGZpZWxkLmNoZWNrUGVybWlzc2lvbnNGb3JVcGRhdGVPcHRpb25zKCk7XG4gICAgICpcbiAgICAgKiBpZiAoIXVwZGF0ZUZpZWxkQ2hlY2tSZXN1bHQuaGFzUGVybWlzc2lvbikge1xuICAgICAqICAgICBhbGVydCh1cGRhdGVGaWVsZENoZWNrUmVzdWx0LnJlYXNvbkRpc3BsYXlTdHJpbmcpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlT3B0aW9ucyhvcHRpb25zPzogRmllbGRPcHRpb25zKTogUGVybWlzc2lvbkNoZWNrUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nkay5fX211dGF0aW9ucy5jaGVja1Blcm1pc3Npb25zRm9yTXV0YXRpb24oe1xuICAgICAgICAgICAgdHlwZTogTXV0YXRpb25UeXBlcy5VUERBVEVfU0lOR0xFX0ZJRUxEX0NPTkZJRyxcbiAgICAgICAgICAgIHRhYmxlSWQ6IHRoaXMucGFyZW50VGFibGUuaWQsXG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gYWxpYXMgZm9yIGBjaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlT3B0aW9ucyhvcHRpb25zKS5oYXNQZXJtaXNzaW9uYC5cbiAgICAgKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGUgb3B0aW9ucyB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIHBhcnRpYWwgaW5wdXQsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB7QGxpbmsgdXBkYXRlT3B0aW9uc0FzeW5jfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIG5ldyBvcHRpb25zIGZvciB0aGUgZmllbGRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjYW5VcGRhdGVGaWVsZCA9IGZpZWxkLmhhc1Blcm1pc3Npb25Ub1VwZGF0ZU9wdGlvbnMoKTtcbiAgICAgKlxuICAgICAqIGlmICghY2FuVXBkYXRlRmllbGQpIHtcbiAgICAgKiAgICAgYWxlcnQoJ25vdCBhbGxvd2VkIScpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBoYXNQZXJtaXNzaW9uVG9VcGRhdGVPcHRpb25zKG9wdGlvbnM/OiBGaWVsZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZU9wdGlvbnMob3B0aW9ucykuaGFzUGVybWlzc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBvcHRpb25zIGZvciB0aGlzIGZpZWxkLlxuICAgICAqXG4gICAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSB1c2VyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byB1cGRhdGUgdGhlIGZpZWxkLCBpZiBpbnZhbGlkXG4gICAgICogb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGlmIHRoaXMgZmllbGQgaGFzIG5vIHdyaXRhYmxlIG9wdGlvbnMsIG9yIGlmIHVwZGF0ZXMgdG8gdGhpcyBmaWVsZFxuICAgICAqIHR5cGUgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgKlxuICAgICAqIFJlZmVyIHRvIHtAbGluayBGaWVsZFR5cGV9IGZvciBzdXBwb3J0ZWQgZmllbGQgdHlwZXMsIHRoZSB3cml0ZSBmb3JtYXQgZm9yIG9wdGlvbnMsIGFuZFxuICAgICAqIG90aGVyIHNwZWNpZmljcyBmb3IgY2VydGFpbiBmaWVsZCB0eXBlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgYWN0aW9uIGlzIGFzeW5jaHJvbm91cy4gVW5saWtlIHVwZGF0ZXMgdG8gY2VsbCB2YWx1ZXMsIHVwZGF0ZXMgdG8gZmllbGQgb3B0aW9ucyBhcmVcbiAgICAgKiAqKm5vdCoqIGFwcGxpZWQgb3B0aW1pc3RpY2FsbHkgbG9jYWxseS4gWW91IG11c3QgYGF3YWl0YCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBiZWZvcmVcbiAgICAgKiByZWx5aW5nIG9uIHRoZSBjaGFuZ2UgaW4geW91ciBhcHAuXG4gICAgICpcbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIHBhc3MgYW4gYG9wdHNgIG9iamVjdCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LiBTZWUge0BsaW5rIFVwZGF0ZUZpZWxkT3B0aW9uc09wdHN9XG4gICAgICogZm9yIGF2YWlsYWJsZSBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgbmV3IG9wdGlvbnMgZm9yIHRoZSBmaWVsZFxuICAgICAqIEBwYXJhbSBvcHRzIG9wdGlvbmFsIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBiZWhhdmlvciBvZiB0aGUgdXBkYXRlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogYXN5bmMgZnVuY3Rpb24gYWRkQ2hvaWNlVG9TZWxlY3RGaWVsZChzZWxlY3RGaWVsZCwgbmFtZUZvck5ld09wdGlvbikge1xuICAgICAqICAgICBjb25zdCB1cGRhdGVkT3B0aW9ucyA9IHtcbiAgICAgKiAgICAgICAgIGNob2ljZXM6IFtcbiAgICAgKiAgICAgICAgICAgICAuLi5zZWxlY3RGaWVsZC5vcHRpb25zLmNob2ljZXMsXG4gICAgICogICAgICAgICAgICAge25hbWU6IG5hbWVGb3JOZXdPcHRpb259LFxuICAgICAqICAgICAgICAgXVxuICAgICAqICAgICB9O1xuICAgICAqXG4gICAgICogICAgIGlmIChzZWxlY3RGaWVsZC5oYXNQZXJtaXNzaW9uVG9VcGRhdGVPcHRpb25zKHVwZGF0ZWRPcHRpb25zKSkge1xuICAgICAqICAgICAgICAgYXdhaXQgc2VsZWN0RmllbGQudXBkYXRlT3B0aW9uc0FzeW5jKHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgKiAgICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVPcHRpb25zQXN5bmMoXG4gICAgICAgIG9wdGlvbnM6IEZpZWxkT3B0aW9ucyxcbiAgICAgICAgb3B0czogVXBkYXRlRmllbGRPcHRpb25zT3B0cyA9IHt9LFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLl9zZGsuX19tdXRhdGlvbnMuYXBwbHlNdXRhdGlvbkFzeW5jKHtcbiAgICAgICAgICAgIHR5cGU6IE11dGF0aW9uVHlwZXMuVVBEQVRFX1NJTkdMRV9GSUVMRF9DT05GSUcsXG4gICAgICAgICAgICB0YWJsZUlkOiB0aGlzLnBhcmVudFRhYmxlLmlkLFxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcHRzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhlIGdpdmVuIGRlc2NyaXB0aW9uIHVwZGF0ZS5cbiAgICAgKlxuICAgICAqIEFjY2VwdHMgcGFydGlhbCBpbnB1dCwgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHtAbGluayB1cGRhdGVEZXNjcmlwdGlvbkFzeW5jfS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHtoYXNQZXJtaXNzaW9uOiB0cnVlfWAgaWYgdGhlIGN1cnJlbnQgdXNlciBjYW4gdXBkYXRlIHRoZSBzcGVjaWZpZWQgZmllbGQsXG4gICAgICogYHtoYXNQZXJtaXNzaW9uOiBmYWxzZSwgcmVhc29uRGlzcGxheVN0cmluZzogc3RyaW5nfWAgb3RoZXJ3aXNlLiBgcmVhc29uRGlzcGxheVN0cmluZ2AgbWF5IGJlXG4gICAgICogdXNlZCB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gbmV3IGRlc2NyaXB0aW9uIGZvciB0aGUgZmllbGRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB1cGRhdGVGaWVsZENoZWNrUmVzdWx0ID0gZmllbGQuY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZURlc2NyaXB0aW9uKCk7XG4gICAgICpcbiAgICAgKiBpZiAoIXVwZGF0ZUZpZWxkQ2hlY2tSZXN1bHQuaGFzUGVybWlzc2lvbikge1xuICAgICAqICAgICBhbGVydCh1cGRhdGVGaWVsZENoZWNrUmVzdWx0LnJlYXNvbkRpc3BsYXlTdHJpbmcpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlRGVzY3JpcHRpb24oZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsKTogUGVybWlzc2lvbkNoZWNrUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nkay5fX211dGF0aW9ucy5jaGVja1Blcm1pc3Npb25zRm9yTXV0YXRpb24oe1xuICAgICAgICAgICAgdHlwZTogTXV0YXRpb25UeXBlcy5VUERBVEVfU0lOR0xFX0ZJRUxEX0RFU0NSSVBUSU9OLFxuICAgICAgICAgICAgdGFibGVJZDogdGhpcy5wYXJlbnRUYWJsZS5pZCxcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIGFsaWFzIGZvciBgY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZURlc2NyaXB0aW9uKG9wdGlvbnMpLmhhc1Blcm1pc3Npb25gLlxuICAgICAqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXNlciBoYXMgcGVybWlzc2lvbiB0byBwZXJmb3JtIHRoZSBkZXNjcmlwdGlvbiB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIHBhcnRpYWwgaW5wdXQsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB7QGxpbmsgdXBkYXRlRGVzY3JpcHRpb25Bc3luY30uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gbmV3IGRlc2NyaXB0aW9uIGZvciB0aGUgZmllbGRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjYW5VcGRhdGVGaWVsZCA9IGZpZWxkLmhhc1Blcm1pc3Npb25Ub1VwZGF0ZURlc2NyaXB0aW9uKCk7XG4gICAgICpcbiAgICAgKiBpZiAoIWNhblVwZGF0ZUZpZWxkKSB7XG4gICAgICogICAgIGFsZXJ0KCdub3QgYWxsb3dlZCEnKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgaGFzUGVybWlzc2lvblRvVXBkYXRlRGVzY3JpcHRpb24oZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrUGVybWlzc2lvbnNGb3JVcGRhdGVEZXNjcmlwdGlvbihkZXNjcmlwdGlvbikuaGFzUGVybWlzc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBmaWVsZC5cbiAgICAgKlxuICAgICAqIFRvIHJlbW92ZSBhbiBleGlzdGluZyBkZXNjcmlwdGlvbiwgcGFzcyBgJydgIGFzIHRoZSBuZXcgZGVzY3JpcHRpb24uXG4gICAgICogYG51bGxgIGlzIGFsc28gYWNjZXB0ZWQgYW5kIHdpbGwgYmUgY29lcmNlZCB0byBgJydgIGZvciBjb25zaXN0ZW5jeSB3aXRoIGZpZWxkIGNyZWF0aW9uLlxuICAgICAqXG4gICAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSB1c2VyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byB1cGRhdGUgdGhlIGZpZWxkLCBvciBpZiBhbiBpbnZhbGlkXG4gICAgICogZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIGFjdGlvbiBpcyBhc3luY2hyb25vdXMuIFVubGlrZSB1cGRhdGVzIHRvIGNlbGwgdmFsdWVzLCB1cGRhdGVzIHRvIGZpZWxkIGRlc2NyaXB0aW9ucyBhcmVcbiAgICAgKiAqKm5vdCoqIGFwcGxpZWQgb3B0aW1pc3RpY2FsbHkgbG9jYWxseS4gWW91IG11c3QgYGF3YWl0YCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBiZWZvcmVcbiAgICAgKiByZWx5aW5nIG9uIHRoZSBjaGFuZ2UgaW4geW91ciBhcHAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gbmV3IGRlc2NyaXB0aW9uIGZvciB0aGUgZmllbGRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBhd2FpdCBteVRleHRGaWVsZC51cGRhdGVEZXNjcmlwdGlvbkFzeW5jKCdUaGlzIGlzIGEgdGV4dCBmaWVsZCcpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZURlc2NyaXB0aW9uQXN5bmMoZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fc2RrLl9fbXV0YXRpb25zLmFwcGx5TXV0YXRpb25Bc3luYyh7XG4gICAgICAgICAgICB0eXBlOiBNdXRhdGlvblR5cGVzLlVQREFURV9TSU5HTEVfRklFTERfREVTQ1JJUFRJT04sXG4gICAgICAgICAgICB0YWJsZUlkOiB0aGlzLnBhcmVudFRhYmxlLmlkLFxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoaXMgZmllbGQgaXMgY29tcHV0ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLiBBIGZpZWxkIGlzXG4gICAgICogXCJjb21wdXRlZFwiIGlmIGl0J3MgdmFsdWUgaXMgbm90IHNldCBieSB1c2VyIGlucHV0IChlLmcuIGF1dG9OdW1iZXIsIGZvcm11bGEsXG4gICAgICogZXRjLikuIENhbiBiZSB3YXRjaGVkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc29sZS5sb2cobXlTaW5nbGVMaW5lVGV4dEZpZWxkLmlzQ29tcHV0ZWQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICogY29uc29sZS5sb2cobXlBdXRvTnVtYmVyRmllbGQuaXNDb21wdXRlZCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBpc0NvbXB1dGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBhaXJ0YWJsZUludGVyZmFjZSA9IHRoaXMuX3Nkay5fX2FpcnRhYmxlSW50ZXJmYWNlO1xuICAgICAgICByZXR1cm4gYWlydGFibGVJbnRlcmZhY2UuZmllbGRUeXBlUHJvdmlkZXIuaXNDb21wdXRlZCh0aGlzLl9kYXRhKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoaXMgZmllbGQgaXMgaXRzIHBhcmVudCB0YWJsZSdzIHByaW1hcnkgZmllbGQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqIFNob3VsZCBuZXZlciBjaGFuZ2UgYmVjYXVzZSB0aGUgcHJpbWFyeSBmaWVsZCBvZiBhIHRhYmxlIGNhbm5vdCBjaGFuZ2UuXG4gICAgICovXG4gICAgZ2V0IGlzUHJpbWFyeUZpZWxkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pZCA9PT0gdGhpcy5wYXJlbnRUYWJsZS5wcmltYXJ5RmllbGQuaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZCwgaWYgaXQgaGFzIG9uZS4gQ2FuIGJlIHdhdGNoZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc29sZS5sb2cobXlGaWVsZC5kZXNjcmlwdGlvbik7XG4gICAgICogLy8gPT4gJ1RoaXMgaXMgbXkgZmllbGQnXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2QgaXMgdW50ZXN0ZWQgYmVjYXVzZSBpdHMgaW1wbGVtZW50YXRpb24gcmVzaXN0c1xuICAgIC8vIHRlc3RpbmcgYW5kIGJlY2F1c2UgaXQgaXMgZXhwZWN0ZWQgdG8gYmUgcmVkZXNpZ25lZC5cbiAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhdmFpbGFibGUgYWdncmVnYXRvcnMgZ2l2ZW4gdGhpcyBmaWVsZCdzIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGRBZ2dyZWdhdG9ycyA9IG15RmllbGQuYXZhaWxhYmxlQWdncmVnYXRvcnM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGF2YWlsYWJsZUFnZ3JlZ2F0b3JzKCk6IEFycmF5PEFnZ3JlZ2F0b3I+IHtcbiAgICAgICAgY29uc3QgYWlydGFibGVJbnRlcmZhY2UgPSB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlQWdncmVnYXRvcktleXNTZXQgPSBuZXcgU2V0KFxuICAgICAgICAgICAgYWlydGFibGVJbnRlcmZhY2UuYWdncmVnYXRvcnMuZ2V0QXZhaWxhYmxlQWdncmVnYXRvcktleXNGb3JGaWVsZCh0aGlzLl9kYXRhKSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB7YWdncmVnYXRvcnN9ID0gcmVxdWlyZSgnLi9tb2RlbHMnKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlcyhhZ2dyZWdhdG9ycykuZmlsdGVyKGFnZ3JlZ2F0b3IgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF2YWlsYWJsZUFnZ3JlZ2F0b3JLZXlzU2V0LmhhcyhhZ2dyZWdhdG9yLmtleSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZCBpcyB1bnRlc3RlZCBiZWNhdXNlIGl0cyBpbXBsZW1lbnRhdGlvbiByZXNpc3RzXG4gICAgLy8gdGVzdGluZyBhbmQgYmVjYXVzZSBpdCBpcyBleHBlY3RlZCB0byBiZSByZWRlc2lnbmVkLlxuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhZ2dyZWdhdG9yIGlzIGF2YWlsYWJsZSBmb3IgdGhpcyBmaWVsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZ2dyZWdhdG9yIFRoZSBhZ2dyZWdhdG9yIG9iamVjdCBvciBhZ2dyZWdhdG9yIGtleS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHthZ2dyZWdhdG9yc30gZnJvbSAnQGFpcnRhYmxlL2Jsb2Nrcy9tb2RlbHMnO1xuICAgICAqIGNvbnN0IGFnZ3JlZ2F0b3IgPSBhZ2dyZWdhdG9ycy50b3RhbEF0dGFjaG1lbnRTaXplO1xuICAgICAqXG4gICAgICogLy8gVXNpbmcgYW4gYWdncmVnYXRvciBvYmplY3RcbiAgICAgKiBjb25zb2xlLmxvZyhteUF0dGFjaG1lbnRGaWVsZC5pc0FnZ3JlZ2F0b3JBdmFpbGFibGUoYWdncmVnYXRvcikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIGFuIGFnZ3JlZ2F0b3Iga2V5XG4gICAgICogY29uc29sZS5sb2cobXlUZXh0RmllbGQuaXNBZ2dyZWdhdG9yQXZhaWxhYmxlKCd0b3RhbEF0dGFjaG1lbnRTaXplJykpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgaXNBZ2dyZWdhdG9yQXZhaWxhYmxlKGFnZ3JlZ2F0b3I6IEFnZ3JlZ2F0b3IgfCBBZ2dyZWdhdG9yS2V5KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGFnZ3JlZ2F0b3JLZXkgPSB0eXBlb2YgYWdncmVnYXRvciA9PT0gJ3N0cmluZycgPyBhZ2dyZWdhdG9yIDogYWdncmVnYXRvci5rZXk7XG5cbiAgICAgICAgY29uc3QgYWlydGFibGVJbnRlcmZhY2UgPSB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlQWdncmVnYXRvcktleXMgPSBhaXJ0YWJsZUludGVyZmFjZS5hZ2dyZWdhdG9ycy5nZXRBdmFpbGFibGVBZ2dyZWdhdG9yS2V5c0ZvckZpZWxkKFxuICAgICAgICAgICAgdGhpcy5fZGF0YSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gYXZhaWxhYmxlQWdncmVnYXRvcktleXMuc29tZShrZXkgPT4ga2V5ID09PSBhZ2dyZWdhdG9yS2V5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdCB0byBwYXJzZSBhIGdpdmVuIHN0cmluZyBhbmQgcmV0dXJuIGEgdmFsaWQgY2VsbCB2YWx1ZSBmb3IgdGhlIGZpZWxkJ3MgY3VycmVudCBjb25maWcuXG4gICAgICogUmV0dXJucyBgbnVsbGAgaWYgdW5hYmxlIHRvIHBhcnNlIHRoZSBnaXZlbiBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcgdG8gcGFyc2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGlucHV0U3RyaW5nID0gJzQyJztcbiAgICAgKiBjb25zdCBjZWxsVmFsdWUgPSBteU51bWJlckZpZWxkLmNvbnZlcnRTdHJpbmdUb0NlbGxWYWx1ZShpbnB1dFN0cmluZyk7XG4gICAgICogY29uc29sZS5sb2coY2VsbFZhbHVlID09PSA0Mik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbnZlcnRTdHJpbmdUb0NlbGxWYWx1ZShzdHJpbmc6IHN0cmluZyk6IHVua25vd24ge1xuICAgICAgICBjb25zdCBhaXJ0YWJsZUludGVyZmFjZSA9IHRoaXMuX3Nkay5fX2FpcnRhYmxlSW50ZXJmYWNlO1xuICAgICAgICBjb25zdCBhcHBJbnRlcmZhY2UgPSB0aGlzLl9zZGsuX19hcHBJbnRlcmZhY2U7XG5cbiAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gYWlydGFibGVJbnRlcmZhY2UuZmllbGRUeXBlUHJvdmlkZXIuY29udmVydFN0cmluZ1RvQ2VsbFZhbHVlKFxuICAgICAgICAgICAgYXBwSW50ZXJmYWNlLFxuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgdGhpcy5fZGF0YSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBUZW1wb3JhcmlseSBiYWlsIG91dCBvZiB2YWxpZGF0aW5nIGNvbXB1dGVkIHZhbHVlcyAoc2luY2UgdmFsaWRhdGlvbiB3aWxsIGNyYXNoKVxuICAgICAgICAvLyB3aGlsZSB3ZSB3b3JrIG91dCBpZiB3ZSBhY3R1YWxseSBoYXZlIHRvIHZhbGlkYXRlIG9yIG5vdC4gSWRlYWxseSB3ZSBqdXN0IGRlbGV0ZSBhbGxcbiAgICAgICAgLy8gdGhlIHZhbGlkYXRpb25cbiAgICAgICAgLy8gVE9ETyhlbW1hKTogZGVsZXRlIG1lIG9yIHRpZHkgbWUgdXBcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wdXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNlbGxWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE8oZW1tYSk6IGRvIHdlIG5lZWQgdG8gdmFsaWRhdGUgaGVyZT9cbiAgICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGFpcnRhYmxlSW50ZXJmYWNlLmZpZWxkVHlwZVByb3ZpZGVyLnZhbGlkYXRlQ2VsbFZhbHVlRm9yVXBkYXRlKFxuICAgICAgICAgICAgYXBwSW50ZXJmYWNlLFxuICAgICAgICAgICAgY2VsbFZhbHVlLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHRoaXMuX2RhdGEsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNlbGxWYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9fdHJpZ2dlck9uQ2hhbmdlRm9yRGlydHlQYXRocyhkaXJ0eVBhdGhzOiBGbG93QW55T2JqZWN0KSB7XG4gICAgICAgIC8vIEFsd2F5cyBjbGVhciB0aGUgY2FjaGVkIGNvbmZpZyB3aGVuIGFueXRoaW5nIG9uIHRoZSBmaWVsZCBkYXRhIG1vZGVsIGNoYW5nZXNcbiAgICAgICAgdGhpcy5fY2xlYXJDYWNoZWRDb25maWcoKTtcblxuICAgICAgICBpZiAoZGlydHlQYXRocy5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShXYXRjaGFibGVGaWVsZEtleXMubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpcnR5UGF0aHMudHlwZSkge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoV2F0Y2hhYmxlRmllbGRLZXlzLnR5cGUpO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBpdCB3b3VsZCBiZSBiZXR0ZXIgaWYgd2Ugb25seSB0cmlnZ2VyIHRoaXMgd2hlblxuICAgICAgICAgICAgLy8gd2Uga25vdyBpc0NvbXB1dGVkIGNoYW5nZWQuXG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShXYXRjaGFibGVGaWVsZEtleXMuaXNDb21wdXRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpcnR5UGF0aHMudHlwZU9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKFdhdGNoYWJsZUZpZWxkS2V5cy5vcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlydHlQYXRocy5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoV2F0Y2hhYmxlRmllbGRLZXlzLmRlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmllbGQ7XG4iXX0=
|
|
@@ -245,19 +245,13 @@ function (_RecordQueryResult) {
|
|
|
245
245
|
while (1) {
|
|
246
246
|
switch (_context2.prev = _context2.next) {
|
|
247
247
|
case 0:
|
|
248
|
-
|
|
249
|
-
//
|
|
250
|
-
|
|
251
|
-
// watching recordIds only changes if records in this group change.
|
|
252
|
-
// In the meantime this does ensure that a deleted GroupedRecordQuery with stale recordIds
|
|
253
|
-
// doesn't return the cached array.
|
|
248
|
+
// TODO: This entire class assumes it is torn down and re-created by the parent whenever
|
|
249
|
+
// a change to the group is made.
|
|
250
|
+
this._parentQueryResult.__groupedRecordQueryResultPool.registerObjectForReuseStrong(this);
|
|
254
251
|
|
|
255
|
-
|
|
256
|
-
this.watch(['recordIds', 'groups', 'groupLevels'], this._invalidateComputedRecordIds, this);
|
|
257
|
-
this.watch(['recordIds'], this._invalidateRecordIdsSet, this);
|
|
258
252
|
return _context2.abrupt("return", this._getChangedKeysOnLoad());
|
|
259
253
|
|
|
260
|
-
case
|
|
254
|
+
case 2:
|
|
261
255
|
case "end":
|
|
262
256
|
return _context2.stop();
|
|
263
257
|
}
|
|
@@ -269,10 +263,7 @@ function (_RecordQueryResult) {
|
|
|
269
263
|
}, {
|
|
270
264
|
key: "_unloadData",
|
|
271
265
|
value: function _unloadData() {
|
|
272
|
-
//
|
|
273
|
-
this.unwatch(['recordIds', 'groups', 'groupLevels'], this._invalidateComputedRecordIds, this);
|
|
274
|
-
this.unwatch(['recordIds'], this._invalidateRecordIdsSet, this); // Invalidate both of the caches, as this object can no longer be accessed
|
|
275
|
-
|
|
266
|
+
// Invalidate both of the caches, as this object can no longer be accessed
|
|
276
267
|
this._invalidateComputedRecordIds();
|
|
277
268
|
|
|
278
269
|
this._invalidateRecordIdsSet();
|
|
@@ -472,4 +463,5 @@ function (_RecordQueryResult) {
|
|
|
472
463
|
|
|
473
464
|
(0, _defineProperty2.default)(GroupedRecordQueryResult, "_className", 'GroupedRecordQueryResult');
|
|
474
465
|
var _default = GroupedRecordQueryResult;
|
|
475
|
-
exports.default = _default;
|
|
466
|
+
exports.default = _default;
|
|
467
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvZ3JvdXBlZF9yZWNvcmRfcXVlcnlfcmVzdWx0LnRzIl0sIm5hbWVzIjpbIkdyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdCIsInBhcmVudFF1ZXJ5UmVzdWx0IiwiZ3JvdXBEYXRhIiwiZ3JvdXBMZXZlbCIsIm5vcm1hbGl6ZWRPcHRzIiwic2RrIiwiX19ncm91cGVkUmVjb3JkUXVlcnlSZXN1bHRQb29sIiwiT2JqZWN0UG9vbCIsIl9wYXJlbnRRdWVyeVJlc3VsdCIsIl9ncm91cERhdGEiLCJfZ3JvdXBMZXZlbHMiLCJncm91cExldmVsRGF0YVNsaWNlZEZvckNoaWxkcmVuIiwic2xpY2UiLCJfb3JkZXJlZENoaWxkcmVuR3JvdXBzIiwiZ3JvdXBzIiwibWFwIiwic2luZ2xlR3JvdXBEYXRhIiwiZ3JvdXAiLCJnZXRPYmplY3RGb3JSZXVzZSIsImxvYWREYXRhQXN5bmMiLCJfZGF0YSIsInZpc2libGVSZWNvcmRJZHMiLCJyZWNvcmRJZHMiLCJwdXNoIiwiX29yZGVyZWRSZWNvcmRJZHMiLCJrZXlzIiwiY2FsbGJhY2siLCJjb250ZXh0IiwidmFsaWRLZXlzIiwid2F0Y2giLCJ1bndhdGNoIiwiX2dldENoYW5nZWRLZXlzT25Mb2FkIiwicmVnaXN0ZXJPYmplY3RGb3JSZXVzZVN0cm9uZyIsIl9pbnZhbGlkYXRlQ29tcHV0ZWRSZWNvcmRJZHMiLCJfaW52YWxpZGF0ZVJlY29yZElkc1NldCIsIl91bmxvYWRDaGlsZHJlbkdyb3Vwc0lmTmVlZGVkIiwidW5yZWdpc3Rlck9iamVjdEZvclJldXNlU3Ryb25nIiwidW5sb2FkRGF0YSIsIl9yZWNvcmRJZHNTZXQiLCJyZWNvcmRJZHNTZXQiLCJyZWNvcmRJZCIsImdyb3VwTGV2ZWxzIiwiZmllbGRJZCIsInBhcmVudFRhYmxlIiwiZ2V0RmllbGRCeUlkIiwiaXNEYXRhTG9hZGVkIiwiX2NvbXB1dGVSZWNvcmRJZHMiLCJmaWVsZHMiLCJfc2VyaWFsaXplZE9wdHMiLCJpZCIsIl9k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QiwwQjtlQW9SVEEsd0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAYWlydGFibGUvYmxvY2tzL21vZGVsczogUmVjb3JkUXVlcnlSZXN1bHQgKi8gLyoqICovXG5pbXBvcnQge0ZpZWxkSWR9IGZyb20gJy4uL3R5cGVzL2ZpZWxkJztcbmltcG9ydCBTZGsgZnJvbSAnLi4vc2RrJztcbmltcG9ydCB7Rmxvd0FueUZ1bmN0aW9uLCBGbG93QW55T2JqZWN0LCBPYmplY3RNYXB9IGZyb20gJy4uL3ByaXZhdGVfdXRpbHMnO1xuaW1wb3J0IHtpbnZhcmlhbnR9IGZyb20gJy4uL2Vycm9yX3V0aWxzJztcbmltcG9ydCB7UmVjb3JkSWR9IGZyb20gJy4uL3R5cGVzL3JlY29yZCc7XG5pbXBvcnQge0dyb3VwRGF0YX0gZnJvbSAnLi4vdHlwZXMvdmlldyc7XG5pbXBvcnQge05vcm1hbGl6ZWRHcm91cExldmVsfSBmcm9tICcuLi90eXBlcy9haXJ0YWJsZV9pbnRlcmZhY2UnO1xuaW1wb3J0IFJlY29yZFF1ZXJ5UmVzdWx0LCB7XG4gICAgV2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXksXG4gICAgTm9ybWFsaXplZFJlY29yZFF1ZXJ5UmVzdWx0T3B0cyxcbn0gZnJvbSAnLi9yZWNvcmRfcXVlcnlfcmVzdWx0JztcblxuaW1wb3J0IFRhYmxlIGZyb20gJy4vdGFibGUnO1xuaW1wb3J0IEZpZWxkIGZyb20gJy4vZmllbGQnO1xuaW1wb3J0IE9iamVjdFBvb2wgZnJvbSAnLi9vYmplY3RfcG9vbCc7XG5pbXBvcnQgVGFibGVPclZpZXdRdWVyeVJlc3VsdCBmcm9tICcuL3RhYmxlX29yX3ZpZXdfcXVlcnlfcmVzdWx0JztcblxuLyoqIEBoaWRkZW4gKi9cbi8vIEV2ZW4gdGhvdWdoIHdlIGRvbid0IGxvYWQgdGhlIGRhdGEsIHdlIHN0aWxsIGFjY2VzcyBpdCB0aHJvdWdoIGAuX2RhdGFgIHNvIHRoYXRcbi8vIHdlIGNhbiBiZSBlbnN1cmVkIHRoZSBtb2RlbCBoYXNuJ3QgYmVlbiBkZWxldGVkLlxuaW50ZXJmYWNlIEdyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdERhdGEge1xuICAgIGdyb3VwRGF0YTogR3JvdXBEYXRhO1xuICAgIGdyb3VwTGV2ZWxzOiBSZWFkb25seUFycmF5PE5vcm1hbGl6ZWRHcm91cExldmVsPjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZ3JvdXAgb2YgcmVjb3JkcyByZXR1cm5lZCBmcm9tIGEgZ3JvdXAgcXVlcnkuIFNlZSB7QGxpbmsgUmVjb3JkUXVlcnlSZXN1bHR9IGZvciBtYWluXG4gKiBkb2N1bWVudGF0aW9uLlxuICpcbiAqIERvIG5vdCBpbnN0YW50aWF0ZS4gWW91IGNhbiBnZXQgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYnkgY2FsbGluZ1xuICogYHJlY29yZFF1ZXJ5UmVzdWx0Lmdyb3Vwc2AuXG4gKlxuICogQGRvY3NQYXRoIG1vZGVscy9xdWVyeSByZXN1bHRzL0dyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdFxuICogQGhpZGRlblxuICovXG5jbGFzcyBHcm91cGVkUmVjb3JkUXVlcnlSZXN1bHQgZXh0ZW5kcyBSZWNvcmRRdWVyeVJlc3VsdDxHcm91cGVkUmVjb3JkUXVlcnlSZXN1bHREYXRhPiB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBfY2xhc3NOYW1lID0gJ0dyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdCc7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3BhcmVudFF1ZXJ5UmVzdWx0OiBUYWJsZU9yVmlld1F1ZXJ5UmVzdWx0IHwgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0O1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9ncm91cERhdGE6IEdyb3VwRGF0YTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgaW5jbHVkZXMgZ3JvdXBMZXZlbCBmb3IgYWxsIGNoaWxkcmVuICYgcGFyZW50IGdyb3VwZWQgbGF5ZXJzLCB0aGUgZ2V0dGVyXG4gICAgICogcmV0dXJucyBvbmx5IHRoZSBncm91cExldmVscyBmb3IgdGhpcyBsYXllci5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9ncm91cExldmVsczogUmVhZG9ubHlBcnJheTxOb3JtYWxpemVkR3JvdXBMZXZlbD47XG5cbiAgICAvLyBUaGlzIGlzIHRoZSBvcmRlcmVkIGxpc3Qgb2YgZ3JvdXBzLlxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfb3JkZXJlZENoaWxkcmVuR3JvdXBzOiBBcnJheTxHcm91cGVkUmVjb3JkUXVlcnlSZXN1bHQ+IHwgbnVsbDtcblxuICAgIC8vIGxhemlseSBnZW5lcmF0ZWQgc2V0IG9mIHJlY29yZCBpZHNcbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3JlY29yZElkc1NldDoge1trZXk6IHN0cmluZ106IHRydWUgfCB2b2lkfSB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gbGF6aWx5IGdlbmVyYXRlZCBvcmRlcmVkIGFycmF5IG9mIHJlY29yZElkc1xuICAgIF9vcmRlcmVkUmVjb3JkSWRzOiBSZWFkb25seUFycmF5PFJlY29yZElkPiB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9fZ3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0UG9vbDogT2JqZWN0UG9vbDxcbiAgICAgICAgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0LFxuICAgICAgICB0eXBlb2YgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0XG4gICAgPjtcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcGFyZW50UXVlcnlSZXN1bHQ6IFRhYmxlT3JWaWV3UXVlcnlSZXN1bHQgfCBHcm91cGVkUmVjb3JkUXVlcnlSZXN1bHQsXG4gICAgICAgIGdyb3VwRGF0YTogR3JvdXBEYXRhLFxuICAgICAgICBncm91cExldmVsOiBSZWFkb25seUFycmF5PE5vcm1hbGl6ZWRHcm91cExldmVsPixcbiAgICAgICAgbm9ybWFsaXplZE9wdHM6IE5vcm1hbGl6ZWRSZWNvcmRRdWVyeVJlc3VsdE9wdHMsXG4gICAgICAgIHNkazogU2RrLFxuICAgICkge1xuICAgICAgICBzdXBlcihzZGssIG5vcm1hbGl6ZWRPcHRzKTtcblxuICAgICAgICB0aGlzLl9fZ3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0UG9vbCA9IG5ldyBPYmplY3RQb29sKEdyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdCk7XG4gICAgICAgIHRoaXMuX3BhcmVudFF1ZXJ5UmVzdWx0ID0gcGFyZW50UXVlcnlSZXN1bHQ7XG4gICAgICAgIHRoaXMuX2dyb3VwRGF0YSA9IGdyb3VwRGF0YTtcbiAgICAgICAgdGhpcy5fZ3JvdXBMZXZlbHMgPSBncm91cExldmVsO1xuICAgICAgICBjb25zdCBncm91cExldmVsRGF0YVNsaWNlZEZvckNoaWxkcmVuID0gdGhpcy5fZ3JvdXBMZXZlbHMuc2xpY2UoMSk7XG4gICAgICAgIHRoaXMuX29yZGVyZWRDaGlsZHJlbkdyb3VwcyA9IGdyb3VwRGF0YS5ncm91cHNcbiAgICAgICAgICAgID8gZ3JvdXBEYXRhLmdyb3Vwcy5tYXAoc2luZ2xlR3JvdXBEYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fX2dyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdFBvb2wuZ2V0T2JqZWN0Rm9yUmV1c2UoXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVHcm91cERhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXBMZXZlbERhdGFTbGljZWRGb3JDaGlsZHJlbixcbiAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkT3B0cyxcbiAgICAgICAgICAgICAgICAgICAgICBzZGssXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYXdhaXQgdGhlIGxvYWRpbmcsIGxldCBvdGhlcnMgY2hlY2sgaXNEYXRhTG9hZGVkLlxuICAgICAgICAgICAgICAgICAgLy8gKGl0IGRvZXNuJ3QgdGFrZSBhbnkgdGltZSBhbnl3YXkpLiBMb2FkaW5nIGFsc28gc3Ryb25nIHJldGFpbnMuXG4gICAgICAgICAgICAgICAgICBncm91cC5sb2FkRGF0YUFzeW5jKCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBjaGlsZHJlbiBncm91cHMgb2YgdGhpcyBncm91cCAoaWYgYW55IGV4aXN0KVxuICAgICAqL1xuICAgIGdldCBncm91cHMoKTogQXJyYXk8R3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0PiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JkZXJlZENoaWxkcmVuR3JvdXBzO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBnZXQgZ3JvdXBMZXZlbCgpOiBOb3JtYWxpemVkR3JvdXBMZXZlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmdyb3VwTGV2ZWxzWzBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZpZWxkSWQgdGhhdCB0aGlzIGdyb3VwIGlzIGdyb3VwZWQgYnlcbiAgICAgKi9cbiAgICBnZXQgZmllbGRJZCgpOiBGaWVsZElkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBMZXZlbC5maWVsZElkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZpZWxkIHRoYXQgdGhpcyBncm91cCBpcyBncm91cGVkIGJ5XG4gICAgICovXG4gICAgZ2V0IGZpZWxkKCk6IEZpZWxkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50VGFibGUuZ2V0RmllbGRCeUlkKHRoaXMuZmllbGRJZCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETyAoU2VhbktlZW5hbikgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBjYW4ndCBhbHdheXMgaXRlcmF0ZSBkb3duIGFuZCBmaW5kXG4gICAgLy8gYSByZWNvcmQsIGl0J3MgcG9zc2libGUgdG8gaGF2ZSBcImVtcHR5IGdyb3Vwc1wiLlxuICAgIC8vIGdldFZhbHVlKCkge1xuICAgIC8vIH1cblxuICAgIC8vIFRPRE8gKFNlYW5LZWVuYW4pXG4gICAgLy8gZ2V0VmFsdWVBc1N0cmluZygpIHtcbiAgICAvLyB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWwgKHNpbmNlIHdlIG1heSBub3QgYmUgYWJsZSB0byByZXR1cm4gcGFyZW50IG1vZGVsIGluc3RhbmNlcyBpbiB0aGUgaW1tdXRhYmxlIG1vZGVscyB3b3JsZClcbiAgICAgKiBUaGUgdGFibGUgdGhhdCByZWNvcmRzIGluIHRoaXMgUmVjb3JkUXVlcnlSZXN1bHQgYXJlIHBhcnQgb2ZcbiAgICAgKi9cbiAgICBnZXQgcGFyZW50VGFibGUoKTogVGFibGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50UXVlcnlSZXN1bHQucGFyZW50VGFibGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZ2V0cyBhbGwgcmVjb3JkSWRzIGluIHRoZSBjaGlsZHJlbiBncm91cHMsIGtlZXBpbmcgcmVjb3JkSWRzIGluIGdyb3VwIG9yZGVyXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfY29tcHV0ZVJlY29yZElkcygpOiBSZWFkb25seUFycmF5PFJlY29yZElkPiB7XG4gICAgICAgIC8vIElmIHdlIGFyZSBhIGxlYWYgbm9kZSwgcmV0dXJuIHRoZSByYXcgcmVjb3JkSWRzXG4gICAgICAgIGlmICghdGhpcy5ncm91cHMpIHtcbiAgICAgICAgICAgIC8vIFR5cGVzY3JpcHQgY2FuJ3QgaW5mZXIgaWYgZ3JvdXBzIGlzIGVtcHR5IHZpc2libGVSZWNvcmRJZHMgbXVzdCBiZSBwb3B1bGF0ZWRcbiAgICAgICAgICAgIC8vIGJ1dCB0aGUgZXh0cmEgc2FmZXR5IGlzbid0IGJhZC4gKGlzdGFuYnVsIGFsc28gY2FuJ3QgaWdub3JlIGp1c3QgdGhlID8/KVxuICAgICAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmdyb3VwRGF0YS52aXNpYmxlUmVjb3JkSWRzID8/IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGJ1aWxkIHRoZSByZWNvcmRJZCdzIGZyb20gY2hpbGRyZW4gZ3JvdXBzXG4gICAgICAgIGxldCByZWNvcmRJZHM6IEFycmF5PFJlY29yZElkPiA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuZ3JvdXBzKSB7XG4gICAgICAgICAgICByZWNvcmRJZHMucHVzaCguLi5ncm91cC5yZWNvcmRJZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNvcmRJZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW55dGltZSB0aGUgcmVjb3JkSWRzIHRvIHJldHVybiBjb3VsZCBoYXZlIGNoYW5nZWQsIHdlIGNsZWFyIHRoaXMgc28gdGhhdFxuICAgICAqIHRoZSBuZXh0IHRpbWUgdGhlIHVzZXIgcmVxdWVzdHMgcmVjb3JkSWRzIGl0IHJlY29tcHV0ZXNcbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9pbnZhbGlkYXRlQ29tcHV0ZWRSZWNvcmRJZHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29yZGVyZWRSZWNvcmRJZHMgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9yZGVyZWQgYXJyYXkgb2YgYWxsIHRoZSByZWNvcmQgaWRzIGluc2lkZSB0aGlzIGdyb3VwLCBpbiBncm91cCBvcmRlci5cbiAgICAgKiBUaGlzIHJldHVybnMgYWxsIHJlY29yZElkcyBvZiBhbGwgY2hpbGRyZW4gZ3JvdXBzIChpbiBncm91cGVkIG9yZGVyKS5cbiAgICAgKiBXYXRjaGFibGUuXG4gICAgICovXG4gICAgZ2V0IHJlY29yZElkcygpOiBSZWFkb25seUFycmF5PFJlY29yZElkPiB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmlzRGF0YUxvYWRlZCwgJ0dyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdCBkYXRhIGlzIG5vdCBsb2FkZWQnKTtcblxuICAgICAgICBpZiAodGhpcy5fb3JkZXJlZFJlY29yZElkcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fb3JkZXJlZFJlY29yZElkcyA9IHRoaXMuX2NvbXB1dGVSZWNvcmRJZHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRlcmVkUmVjb3JkSWRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBmaWVsZHMgdGhhdCB3ZXJlIHVzZWQgdG8gY3JlYXRlIHRoZSBwYXJlbnQgUmVjb3JkUXVlcnlSZXN1bHQgdGhhdCBjcmVhdGVkIHRoaXMgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0LlxuICAgICAqIFRoaXMgaXMgc2VwYXJhdGUgZnJvbSB0aGUgZmllbGQvZmllbGRJZCBwcm9wZXJ0eSAtIHdoaWNoIGlzIHRoZSBmaWVsZCB0aGlzIGdyb3VwaW5nIGlzIGJhc2VkIHVwb24uXG4gICAgICogTnVsbCBpZiBmaWVsZHMgd2VyZSBub3Qgc3BlY2lmaWVkLCB3aGljaCBtZWFucyB0aGUgUmVjb3JkUXVlcnlSZXN1bHRcbiAgICAgKiB3aWxsIGxvYWQgYWxsIGZpZWxkcyBpbiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgZ2V0IGZpZWxkcygpOiBBcnJheTxGaWVsZD4gfCBudWxsIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNEYXRhTG9hZGVkLCAnR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0IGRhdGEgaXMgbm90IGxvYWRlZCcpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50UXVlcnlSZXN1bHQuZmllbGRzO1xuICAgIH1cblxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xuICAgIHdhdGNoKFxuICAgICAgICBrZXlzOiBXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleSB8IFJlYWRvbmx5QXJyYXk8V2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXk+LFxuICAgICAgICBjYWxsYmFjazogRmxvd0FueUZ1bmN0aW9uLFxuICAgICAgICBjb250ZXh0PzogRmxvd0FueU9iamVjdCB8IG51bGwsXG4gICAgKTogQXJyYXk8V2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXk+IHtcbiAgICAgICAgLy8gVE9ETyAoU2VhbktlZW5hbik6IFRoaXMgcHJvdmlkZXMgZXZlbnRzIGV2ZW4gaWYgdGhleSBvY2N1ciBvdXRzaWRlIG9mIHRoaXMgZ3JvdXBcbiAgICAgICAgLy8gVGhpcyBpcyBhbiBpc3N1ZSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkIGJlZm9yZSB0aGlzIEFQSSBpcyBtYWRlIHB1YmxpY1xuICAgICAgICBjb25zdCB2YWxpZEtleXMgPSB0aGlzLl9wYXJlbnRRdWVyeVJlc3VsdC53YXRjaChrZXlzLCBjYWxsYmFjaywgY29udGV4dCk7XG4gICAgICAgIHJldHVybiB2YWxpZEtleXM7XG4gICAgfVxuXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXG4gICAgdW53YXRjaChcbiAgICAgICAga2V5czogV2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXkgfCBSZWFkb25seUFycmF5PFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5PixcbiAgICAgICAgY2FsbGJhY2s6IEZsb3dBbnlGdW5jdGlvbixcbiAgICAgICAgY29udGV4dD86IEZsb3dBbnlPYmplY3QgfCBudWxsLFxuICAgICk6IEFycmF5PFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRRdWVyeVJlc3VsdC51bndhdGNoKGtleXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvKiogQGluaGVyaXRkb2MgKi9cbiAgICBhc3luYyBsb2FkRGF0YUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBzdXBlci5sb2FkRGF0YUFzeW5jKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9nZXRDaGFuZ2VkS2V5c09uTG9hZCgpOiBBcnJheTxXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50UXVlcnlSZXN1bHQuX2dldENoYW5nZWRLZXlzT25Mb2FkKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGFzeW5jIF9sb2FkRGF0YUFzeW5jKCk6IFByb21pc2U8QXJyYXk8V2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXk+PiB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgZW50aXJlIGNsYXNzIGFzc3VtZXMgaXQgaXMgdG9ybiBkb3duIGFuZCByZS1jcmVhdGVkIGJ5IHRoZSBwYXJlbnQgd2hlbmV2ZXJcbiAgICAgICAgLy8gYSBjaGFuZ2UgdG8gdGhlIGdyb3VwIGlzIG1hZGUuXG4gICAgICAgIHRoaXMuX3BhcmVudFF1ZXJ5UmVzdWx0Ll9fZ3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0UG9vbC5yZWdpc3Rlck9iamVjdEZvclJldXNlU3Ryb25nKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q2hhbmdlZEtleXNPbkxvYWQoKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3VubG9hZERhdGEoKSB7XG4gICAgICAgIC8vIEludmFsaWRhdGUgYm90aCBvZiB0aGUgY2FjaGVzLCBhcyB0aGlzIG9iamVjdCBjYW4gbm8gbG9uZ2VyIGJlIGFjY2Vzc2VkXG4gICAgICAgIHRoaXMuX2ludmFsaWRhdGVDb21wdXRlZFJlY29yZElkcygpO1xuICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUmVjb3JkSWRzU2V0KCk7XG5cbiAgICAgICAgdGhpcy5fdW5sb2FkQ2hpbGRyZW5Hcm91cHNJZk5lZWRlZCgpO1xuICAgICAgICB0aGlzLl9wYXJlbnRRdWVyeVJlc3VsdC5fX2dyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdFBvb2wudW5yZWdpc3Rlck9iamVjdEZvclJldXNlU3Ryb25nKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBnZXQgX19wb29sS2V5KCkge1xuICAgICAgICAvLyBUT0RPIChTZWFuS2VlbmFuKSBXZSBkb24ndCBoYXZlIGFuIGFjdHVhbCBncm91cElkLCBidXQgd2hpbGUgaWQgaXMgdW5pcXVlOyB0aGlzIHNob3VsZCBoYXZlIGlkIHJlbW92ZWRcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuX3NlcmlhbGl6ZWRPcHRzfTo6JHt0aGlzLmlkfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtb2RlbCBkb2Vzbid0IGFjdHVhbGx5IGxvYWQgZGF0YSwgYnV0IGl0IGRvZXMgdXNlIHRoZSBgX2RhdGFgXG4gICAgICogcHJvcGVydHkgc28gdGhhdCBjaGVja3MgZm9yIG1vZGVsIGRlbGV0aW9uIGJlaGF2ZSBhcHByb3ByaWF0ZWx5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBjb25zaWRlcmVkIGRlbGV0ZWQgaWYgdGhlIHBhcmVudCBxdWVyeSByZXN1bHQgaGFzIGJlZW4gZGVsZXRlZC5cbiAgICAgKlxuICAgICAqIFdlIHJldHVybiBncm91cERhdGEsIGluc3RlYWQgb2YgcHJlY29tcHV0aW5nIGFsbCBjaGlsZHJlbiBncm91cHMgYmVjYXVzZVxuICAgICAqIHdlIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uK2NhY2hpbmcgbGF6aWx5IG9uIHJlcXVlc3RcbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldCBfZGF0YU9yTnVsbElmRGVsZXRlZCgpOiBHcm91cGVkUmVjb3JkUXVlcnlSZXN1bHREYXRhIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnRRdWVyeVJlc3VsdC5fZGF0YU9yTnVsbElmRGVsZXRlZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdyb3VwRGF0YTogdGhpcy5fZ3JvdXBEYXRhLFxuICAgICAgICAgICAgZ3JvdXBMZXZlbHM6IHRoaXMuX2dyb3VwTGV2ZWxzLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xuICAgIGdldCBpc0RhdGFMb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRRdWVyeVJlc3VsdC5pc0RhdGFMb2FkZWQ7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF91bmxvYWRDaGlsZHJlbkdyb3Vwc0lmTmVlZGVkKCkge1xuICAgICAgICBpZiAodGhpcy5fb3JkZXJlZENoaWxkcmVuR3JvdXBzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuX29yZGVyZWRDaGlsZHJlbkdyb3Vwcykge1xuICAgICAgICAgICAgICAgIGdyb3VwLnVubG9hZERhdGEoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfaW52YWxpZGF0ZVJlY29yZElkc1NldCgpIHtcbiAgICAgICAgdGhpcy5fcmVjb3JkSWRzU2V0ID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2dldE9yR2VuZXJhdGVSZWNvcmRJZHNTZXQoKSB7XG4gICAgICAgIC8vIFRPRE8gKFNlYW5LZWVuYW4pOiB0aGlzIGxvZ2ljIGlzIGR1cGxpY2F0ZWQgaW4gdGFibGVPclZpZXdRdWVyeVJlc3VsdFxuICAgICAgICBpZiAoIXRoaXMuX3JlY29yZElkc1NldCkge1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkSWRzU2V0OiBPYmplY3RNYXA8UmVjb3JkSWQsIHRydWU+ID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlY29yZElkIG9mIHRoaXMucmVjb3JkSWRzKSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkSWRzU2V0W3JlY29yZElkXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9yZWNvcmRJZHNTZXQgPSByZWNvcmRJZHNTZXQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fcmVjb3JkSWRzU2V0O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0O1xuIl19
|