@sapui5/sap.fe.macros 1.138.0 → 1.140.0
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/package.json +1 -1
- package/src/sap/fe/macros/.library +1 -1
- package/src/sap/fe/macros/Breadcrumbs.js +269 -0
- package/src/sap/fe/macros/Breadcrumbs.tsx +243 -0
- package/src/sap/fe/macros/CommonHelper.js +2 -2
- package/src/sap/fe/macros/CommonHelper.ts +1 -1
- package/src/sap/fe/macros/Field.js +85 -58
- package/src/sap/fe/macros/Field.ts +104 -60
- package/src/sap/fe/macros/FooterContent.js +44 -11
- package/src/sap/fe/macros/FooterContent.tsx +48 -9
- package/src/sap/fe/macros/FormElement.js +2 -2
- package/src/sap/fe/macros/FormElement.ts +1 -2
- package/src/sap/fe/macros/MessageButton.js +1 -2
- package/src/sap/fe/macros/MessageButton.tsx +0 -1
- package/src/sap/fe/macros/MultiValueField.js +17 -6
- package/src/sap/fe/macros/MultiValueField.tsx +7 -4
- package/src/sap/fe/macros/RichTextEditor.js +30 -5
- package/src/sap/fe/macros/RichTextEditor.tsx +34 -6
- package/src/sap/fe/macros/Share.js +85 -40
- package/src/sap/fe/macros/Share.tsx +42 -1
- package/src/sap/fe/macros/Status.js +226 -0
- package/src/sap/fe/macros/Status.tsx +192 -0
- package/src/sap/fe/macros/ValueHelp.js +4 -29
- package/src/sap/fe/macros/ValueHelp.tsx +2 -43
- package/src/sap/fe/macros/ai/EasyFillButton.js +10 -4
- package/src/sap/fe/macros/ai/EasyFillButton.tsx +8 -1
- package/src/sap/fe/macros/ai/EasyFillDialog.js +25 -10
- package/src/sap/fe/macros/ai/EasyFillDialog.tsx +32 -23
- package/src/sap/fe/macros/ai/EasyFilterBar.js +123 -114
- package/src/sap/fe/macros/ai/EasyFilterBar.tsx +140 -124
- package/src/sap/fe/macros/ai/EasyFilterDataFetcher.js +11 -5
- package/src/sap/fe/macros/ai/EasyFilterDataFetcher.ts +14 -5
- package/src/sap/fe/macros/ai/SummarizationButton.js +2 -2
- package/src/sap/fe/macros/ai/SummarizationButton.tsx +1 -1
- package/src/sap/fe/macros/chart/ChartDelegate.js +4 -4
- package/src/sap/fe/macros/chart/ChartDelegate.ts +3 -3
- package/src/sap/fe/macros/chart/ChartHelper.js +1 -2
- package/src/sap/fe/macros/chart/ChartHelper.ts +0 -1
- package/src/sap/fe/macros/chart/ChartRuntime.js +1 -2
- package/src/sap/fe/macros/chart/ChartRuntime.ts +0 -1
- package/src/sap/fe/macros/chart/MdcChartTemplate.js +20 -6
- package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +16 -8
- package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.js +3 -1
- package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.ts +2 -0
- package/src/sap/fe/macros/controls/FieldWrapper.js +9 -3
- package/src/sap/fe/macros/controls/FieldWrapper.ts +11 -2
- package/src/sap/fe/macros/controls/FilterBar.js +49 -2
- package/src/sap/fe/macros/controls/FilterBar.ts +55 -1
- package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.js +2 -2
- package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.tsx +2 -2
- package/src/sap/fe/macros/controls/RequiredFlexBox.js +62 -0
- package/src/sap/fe/macros/controls/RequiredFlexBox.tsx +20 -0
- package/src/sap/fe/macros/controls/filterbar/VisualFilter.js +21 -11
- package/src/sap/fe/macros/controls/filterbar/VisualFilter.ts +25 -11
- package/src/sap/fe/macros/controls/filterbar/VisualFilterContainer.js +11 -2
- package/src/sap/fe/macros/controls/filterbar/VisualFilterContainer.ts +12 -1
- package/src/sap/fe/macros/controls/filterbar/utils/VisualFilterUtils.js +18 -1
- package/src/sap/fe/macros/controls/filterbar/utils/VisualFilterUtils.ts +20 -0
- package/src/sap/fe/macros/coreUI/CreateDialog.js +2 -2
- package/src/sap/fe/macros/coreUI/CreateDialog.tsx +1 -1
- package/src/sap/fe/macros/coreUI/OperationParameterDialog.js +43 -4
- package/src/sap/fe/macros/coreUI/OperationParameterDialog.tsx +48 -1
- package/src/sap/fe/macros/designtime/Designtime.helper.js +39 -2
- package/src/sap/fe/macros/designtime/Designtime.helper.ts +39 -0
- package/src/sap/fe/macros/draftIndicator/DraftIndicator.js +15 -4
- package/src/sap/fe/macros/draftIndicator/DraftIndicator.tsx +5 -0
- package/src/sap/fe/macros/field/FieldBaseDelegate.js +20 -8
- package/src/sap/fe/macros/field/FieldBaseDelegate.ts +34 -9
- package/src/sap/fe/macros/field/FieldFormatOptions.js +73 -44
- package/src/sap/fe/macros/field/FieldFormatOptions.ts +20 -2
- package/src/sap/fe/macros/field/FieldRuntime.js +1 -2
- package/src/sap/fe/macros/field/FieldRuntime.ts +0 -1
- package/src/sap/fe/macros/filter/FilterUtils.js +3 -5
- package/src/sap/fe/macros/filter/FilterUtils.ts +2 -4
- package/src/sap/fe/macros/filterBar/FilterBar.block.js +8 -2
- package/src/sap/fe/macros/filterBar/FilterBar.block.tsx +2 -5
- package/src/sap/fe/macros/filterBar/FilterBarAPI.js +8 -8
- package/src/sap/fe/macros/filterBar/FilterBarAPI.ts +8 -8
- package/src/sap/fe/macros/filterBar/designtime/FilterBar.designtime.js +3 -1
- package/src/sap/fe/macros/filterBar/designtime/FilterBar.designtime.ts +2 -0
- package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.js +1 -1
- package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.ts +1 -1
- package/src/sap/fe/macros/form/Form.js +1 -4
- package/src/sap/fe/macros/form/Form.tsx +0 -3
- package/src/sap/fe/macros/form/FormActionButtons.fragment.xml +13 -2
- package/src/sap/fe/macros/form/FormContainer.block.js +1 -2
- package/src/sap/fe/macros/form/FormContainer.block.ts +0 -1
- package/src/sap/fe/macros/form/FormContainer.fragment.xml +40 -0
- package/src/sap/fe/macros/form/FormContainerAPI.js +14 -16
- package/src/sap/fe/macros/form/FormContainerAPI.ts +13 -15
- package/src/sap/fe/macros/form/FormDelegate.js +20 -1
- package/src/sap/fe/macros/form/FormDelegate.ts +25 -0
- package/src/sap/fe/macros/form/FormHelper.js +1 -2
- package/src/sap/fe/macros/form/FormHelper.ts +0 -1
- package/src/sap/fe/macros/formatters/TableFormatter.js +10 -1
- package/src/sap/fe/macros/formatters/TableFormatter.ts +14 -5
- package/src/sap/fe/macros/fpm/CustomFragment.block.js +1 -2
- package/src/sap/fe/macros/fpm/CustomFragment.block.ts +0 -1
- package/src/sap/fe/macros/inlineEdit/InlineEdit.js +15 -3
- package/src/sap/fe/macros/inlineEdit/InlineEdit.ts +14 -2
- package/src/sap/fe/macros/internal/ActionCommand.block.js +1 -2
- package/src/sap/fe/macros/internal/ActionCommand.block.ts +0 -1
- package/src/sap/fe/macros/internal/DataPoint.js +2 -1
- package/src/sap/fe/macros/internal/DataPoint.tsx +1 -0
- package/src/sap/fe/macros/internal/DataPointFormatOptions.js +11 -2
- package/src/sap/fe/macros/internal/DataPointFormatOptions.ts +3 -0
- package/src/sap/fe/macros/internal/FilterField.block.js +10 -2
- package/src/sap/fe/macros/internal/FilterField.block.ts +11 -1
- package/src/sap/fe/macros/internal/field/CheckBoxGroup.fragment.xml +25 -0
- package/src/sap/fe/macros/internal/field/DisplayStyle.js +51 -13
- package/src/sap/fe/macros/internal/field/DisplayStyle.tsx +53 -6
- package/src/sap/fe/macros/internal/field/EditStyle.js +5 -1
- package/src/sap/fe/macros/internal/field/EditStyle.tsx +4 -0
- package/src/sap/fe/macros/internal/field/FieldStructureHelper.js +9 -2
- package/src/sap/fe/macros/internal/field/FieldStructureHelper.ts +11 -0
- package/src/sap/fe/macros/internal/field/FieldStyles.js +1 -1
- package/src/sap/fe/macros/internal/field/FieldStyles.tsx +2 -1
- package/src/sap/fe/macros/internal/valuehelp/AdditionalValueHelper.js +46 -8
- package/src/sap/fe/macros/internal/valuehelp/AdditionalValueHelper.ts +60 -6
- package/src/sap/fe/macros/internal/valuehelp/TableDelegate.js +38 -2
- package/src/sap/fe/macros/internal/valuehelp/TableDelegate.ts +37 -2
- package/src/sap/fe/macros/internal/valuehelp/ValueListDialogTable.fragment.xml +2 -1
- package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +16 -5
- package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +21 -9
- package/src/sap/fe/macros/internal/valuehelp/ValueListTable.fragment.xml +1 -0
- package/src/sap/fe/macros/library.js +1 -1
- package/src/sap/fe/macros/mdc/adapter/StateHelper.js +7 -2
- package/src/sap/fe/macros/mdc/adapter/StateHelper.ts +7 -3
- package/src/sap/fe/macros/messagebundle.properties +42 -32
- package/src/sap/fe/macros/messagebundle_ar.properties +12 -4
- package/src/sap/fe/macros/messagebundle_bg.properties +11 -3
- package/src/sap/fe/macros/messagebundle_ca.properties +15 -7
- package/src/sap/fe/macros/messagebundle_cnr.properties +12 -4
- package/src/sap/fe/macros/messagebundle_cs.properties +10 -2
- package/src/sap/fe/macros/messagebundle_cy.properties +12 -4
- package/src/sap/fe/macros/messagebundle_da.properties +11 -3
- package/src/sap/fe/macros/messagebundle_de.properties +18 -10
- package/src/sap/fe/macros/messagebundle_el.properties +13 -5
- package/src/sap/fe/macros/messagebundle_en.properties +16 -8
- package/src/sap/fe/macros/messagebundle_en_GB.properties +16 -8
- package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +16 -8
- package/src/sap/fe/macros/messagebundle_es.properties +13 -5
- package/src/sap/fe/macros/messagebundle_es_MX.properties +14 -6
- package/src/sap/fe/macros/messagebundle_et.properties +13 -5
- package/src/sap/fe/macros/messagebundle_fi.properties +14 -6
- package/src/sap/fe/macros/messagebundle_fr.properties +14 -6
- package/src/sap/fe/macros/messagebundle_fr_CA.properties +15 -7
- package/src/sap/fe/macros/messagebundle_hi.properties +11 -3
- package/src/sap/fe/macros/messagebundle_hr.properties +11 -3
- package/src/sap/fe/macros/messagebundle_hu.properties +10 -2
- package/src/sap/fe/macros/messagebundle_id.properties +18 -10
- package/src/sap/fe/macros/messagebundle_it.properties +10 -2
- package/src/sap/fe/macros/messagebundle_iw.properties +10 -2
- package/src/sap/fe/macros/messagebundle_ja.properties +13 -5
- package/src/sap/fe/macros/messagebundle_kk.properties +15 -7
- package/src/sap/fe/macros/messagebundle_ko.properties +10 -2
- package/src/sap/fe/macros/messagebundle_lt.properties +11 -3
- package/src/sap/fe/macros/messagebundle_lv.properties +12 -4
- package/src/sap/fe/macros/messagebundle_mk.properties +12 -4
- package/src/sap/fe/macros/messagebundle_ms.properties +14 -6
- package/src/sap/fe/macros/messagebundle_nl.properties +13 -5
- package/src/sap/fe/macros/messagebundle_no.properties +12 -4
- package/src/sap/fe/macros/messagebundle_pl.properties +12 -4
- package/src/sap/fe/macros/messagebundle_pt.properties +13 -5
- package/src/sap/fe/macros/messagebundle_pt_PT.properties +12 -4
- package/src/sap/fe/macros/messagebundle_ro.properties +12 -4
- package/src/sap/fe/macros/messagebundle_ru.properties +13 -5
- package/src/sap/fe/macros/messagebundle_sh.properties +12 -4
- package/src/sap/fe/macros/messagebundle_sk.properties +11 -3
- package/src/sap/fe/macros/messagebundle_sl.properties +12 -4
- package/src/sap/fe/macros/messagebundle_sr.properties +12 -4
- package/src/sap/fe/macros/messagebundle_sv.properties +11 -3
- package/src/sap/fe/macros/messagebundle_th.properties +11 -3
- package/src/sap/fe/macros/messagebundle_tr.properties +10 -2
- package/src/sap/fe/macros/messagebundle_uk.properties +17 -9
- package/src/sap/fe/macros/messagebundle_vi.properties +12 -4
- package/src/sap/fe/macros/messagebundle_zh_CN.properties +11 -3
- package/src/sap/fe/macros/messagebundle_zh_TW.properties +12 -4
- package/src/sap/fe/macros/messages/MessageButton.js +55 -36
- package/src/sap/fe/macros/messages/MessageButton.ts +64 -39
- package/src/sap/fe/macros/messages/MessagePopover.js +2 -2
- package/src/sap/fe/macros/messages/MessagePopover.ts +4 -4
- package/src/sap/fe/macros/microchart/MicroChartContainer.js +1 -2
- package/src/sap/fe/macros/microchart/MicroChartContainer.ts +1 -2
- package/src/sap/fe/macros/microchart/MicroChartHelper.js +1 -2
- package/src/sap/fe/macros/microchart/MicroChartHelper.tsx +0 -1
- package/src/sap/fe/macros/share/ShareAPI.js +4 -29
- package/src/sap/fe/macros/share/ShareAPI.ts +1 -32
- package/src/sap/fe/macros/situations/SituationsPopover.js +3 -1
- package/src/sap/fe/macros/situations/SituationsPopover.ts +2 -0
- package/src/sap/fe/macros/table/Action.js +24 -2
- package/src/sap/fe/macros/table/Action.ts +13 -0
- package/src/sap/fe/macros/table/ActionGroup.js +24 -2
- package/src/sap/fe/macros/table/ActionGroup.ts +13 -0
- package/src/sap/fe/macros/table/ActionGroupOverride.js +24 -2
- package/src/sap/fe/macros/table/ActionGroupOverride.ts +13 -0
- package/src/sap/fe/macros/table/ActionOverride.js +24 -2
- package/src/sap/fe/macros/table/ActionOverride.ts +13 -0
- package/src/sap/fe/macros/table/ActionsTemplating.js +73 -12
- package/src/sap/fe/macros/table/ActionsTemplating.tsx +69 -13
- package/src/sap/fe/macros/table/Column.js +3 -3
- package/src/sap/fe/macros/table/Column.ts +2 -2
- package/src/sap/fe/macros/table/MdcTableTemplate.js +20 -8
- package/src/sap/fe/macros/table/MdcTableTemplate.tsx +36 -7
- package/src/sap/fe/macros/table/QuickFilterSelector.js +35 -14
- package/src/sap/fe/macros/table/QuickFilterSelector.tsx +22 -3
- package/src/sap/fe/macros/table/Table.block.js +137 -108
- package/src/sap/fe/macros/table/Table.block.tsx +29 -2
- package/src/sap/fe/macros/table/TableAPI.js +143 -133
- package/src/sap/fe/macros/table/TableAPI.ts +5 -1
- package/src/sap/fe/macros/table/TableDefinition.js +4 -2
- package/src/sap/fe/macros/table/TableDefinition.ts +3 -1
- package/src/sap/fe/macros/table/TableHelper.js +1 -2
- package/src/sap/fe/macros/table/TableHelper.ts +0 -1
- package/src/sap/fe/macros/table/TableRuntime.js +26 -7
- package/src/sap/fe/macros/table/TableRuntime.ts +33 -5
- package/src/sap/fe/macros/table/Utils.js +6 -2
- package/src/sap/fe/macros/table/Utils.ts +5 -1
- package/src/sap/fe/macros/table/delegates/ALPTableDelegate.js +1 -2
- package/src/sap/fe/macros/table/delegates/ALPTableDelegate.ts +0 -1
- package/src/sap/fe/macros/table/delegates/TableDelegate.js +25 -20
- package/src/sap/fe/macros/table/delegates/TableDelegate.ts +25 -24
- package/src/sap/fe/macros/table/delegates/TreeTableDelegate.js +1 -2
- package/src/sap/fe/macros/table/delegates/TreeTableDelegate.ts +0 -1
- package/src/sap/fe/macros/table/designtime/Table.designtime.js +3 -1
- package/src/sap/fe/macros/table/designtime/Table.designtime.ts +2 -0
- package/src/sap/fe/macros/table/massEdit/designtime/MassEdit.designtime.js +3 -1
- package/src/sap/fe/macros/table/massEdit/designtime/MassEdit.designtime.ts +2 -1
- package/src/sap/fe/macros/table/mixin/ContextMenuHandler.js +2 -1
- package/src/sap/fe/macros/table/mixin/ContextMenuHandler.ts +1 -0
- package/src/sap/fe/macros/table/mixin/TableHierarchy.js +8 -1
- package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +10 -0
- package/src/sap/fe/macros/table/mixin/TableSharing.js +3 -2
- package/src/sap/fe/macros/table/mixin/TableSharing.ts +9 -1
- package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +20 -6
- package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +36 -14
- package/src/sap/fe/macros/visualfilters/VisualFilter.js +95 -7
- package/src/sap/fe/macros/visualfilters/VisualFilter.tsx +93 -3
- package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.js +16 -5
- package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.ts +18 -4
|
@@ -2,14 +2,13 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2025 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/DeleteHelper", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/library", "sap/fe/macros/table/Utils", "sap/ui/core/Messaging", "../field/FieldRuntimeHelper"], function (Log, ActionRuntime, CommonUtils, BusyLocker, MetaModelConverter, deleteHelper, FPMHelper, FELibrary, TableUtils, Messaging, FieldRuntimeHelper) {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/DeleteHelper", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/library", "sap/fe/macros/table/Utils", "sap/m/MessageToast", "sap/ui/core/Messaging", "../field/FieldRuntimeHelper"], function (Log, ActionRuntime, CommonUtils, BusyLocker, MetaModelConverter, deleteHelper, FPMHelper, ResourceModelHelper, FELibrary, TableUtils, MessageToast, Messaging, FieldRuntimeHelper) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
const CreationMode = FELibrary.CreationMode;
|
|
9
9
|
/**
|
|
10
10
|
* Static class used by Table building block during runtime
|
|
11
11
|
* @private
|
|
12
|
-
* @experimental This module is only for internal/experimental use!
|
|
13
12
|
*/
|
|
14
13
|
const TableRuntime = {
|
|
15
14
|
executeConditionalActionShortcut: function (sButtonMatcher, oSource) {
|
|
@@ -188,16 +187,32 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
188
187
|
*/
|
|
189
188
|
updateCutCopyPasteEnablement: function (modelObject, table) {
|
|
190
189
|
let forContextMenu = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
190
|
+
modelObject.contextmenu = modelObject.contextmenu ?? {
|
|
191
|
+
selectedContexts: []
|
|
192
|
+
};
|
|
191
193
|
const tableDefinition = table.getParent().getTableDefinition();
|
|
192
194
|
if (tableDefinition.control.type !== "TreeTable") {
|
|
193
195
|
// The logic below only makes sense for a Tree Table
|
|
194
196
|
return;
|
|
195
197
|
}
|
|
198
|
+
const view = CommonUtils.getTargetView(table);
|
|
199
|
+
const isViewEditable = CommonUtils.getIsEditable(view);
|
|
200
|
+
if (view.getControllerName() !== "sap.fe.templates.ListReport.ListReportController" && !isViewEditable) {
|
|
201
|
+
// If the view is not editable, we disable the cut/copy/paste functionality and clear the nodeUpdatesInfo
|
|
202
|
+
modelObject.nodeUpdatesInfo = {};
|
|
203
|
+
modelObject.contextmenu.nodeUpdatesInfo = {};
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
196
206
|
const checkDraftInstance = !table.getRowBinding().isRelative();
|
|
197
207
|
if (forContextMenu) {
|
|
198
208
|
modelObject.contextmenu.nodeUpdatesInfo = {};
|
|
199
209
|
}
|
|
200
210
|
const nodeUpdatesInfo = modelObject.nodeUpdatesInfo;
|
|
211
|
+
//If the pastableContext become disconnected from the listBinding, for example, when the user collapses the parent node, we attempt to locate the correct context by comparing their paths
|
|
212
|
+
const pastableContexts = table.getRowBinding().getAllCurrentContexts().filter(context => (nodeUpdatesInfo.pastableContexts || []).map(pastableContext => pastableContext.getPath()).includes(context.getPath()));
|
|
213
|
+
if (pastableContexts.length !== (nodeUpdatesInfo.pastableContexts || []).length) {
|
|
214
|
+
MessageToast.show("" + ResourceModelHelper.getResourceModel(table).getText("M_PASTABLE_CONTEXTS_NOT_AVAILABLE"));
|
|
215
|
+
}
|
|
201
216
|
const copyCutPasteEnablementInfo = (!forContextMenu ? modelObject : modelObject.contextmenu).nodeUpdatesInfo;
|
|
202
217
|
const dataModelsrc = !forContextMenu ? modelObject : modelObject.contextmenu;
|
|
203
218
|
const cutableContexts = dataModelsrc.updatableContexts.filter(context => TableRuntime.checkIfNodeIsMovable(context, table) && (!checkDraftInstance || context.getProperty("HasDraftEntity") !== true));
|
|
@@ -205,13 +220,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
205
220
|
const selectedContexts = dataModelsrc.selectedContexts;
|
|
206
221
|
copyCutPasteEnablementInfo.cutEnablement = selectedContexts.length === 1 && cutableContexts.length === 1;
|
|
207
222
|
copyCutPasteEnablementInfo.copyEnablement = selectedContexts.length === 1 && copyableContexts.length === 1;
|
|
208
|
-
if (nodeUpdatesInfo.lastAction
|
|
223
|
+
if (nodeUpdatesInfo.lastAction) {
|
|
224
|
+
if (pastableContexts?.length === 0) {
|
|
225
|
+
copyCutPasteEnablementInfo.pasteEnablement = false;
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
209
228
|
let contextsforPastableEnablement;
|
|
210
229
|
const extensionPoint = nodeUpdatesInfo.lastAction === "Cut" ? tableDefinition.control.isMoveToPositionAllowed : tableDefinition.control.isCopyToPositionAllowed;
|
|
211
230
|
|
|
212
231
|
//remove contexts depending of the custom function
|
|
213
232
|
if (extensionPoint) {
|
|
214
|
-
contextsforPastableEnablement = [...selectedContexts].filter(targetContext => FPMHelper.getCustomFunction(extensionPoint.moduleName, extensionPoint.methodName, table)(
|
|
233
|
+
contextsforPastableEnablement = [...selectedContexts].filter(targetContext => FPMHelper.getCustomFunction(extensionPoint.moduleName, extensionPoint.methodName, table)(pastableContexts[0], targetContext) //nodeUpdatesInfo.pastableContexts has been the last time the user pressed the cut/copy button
|
|
215
234
|
);
|
|
216
235
|
} else {
|
|
217
236
|
contextsforPastableEnablement = [...selectedContexts];
|
|
@@ -246,8 +265,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
246
265
|
const movableDraft = table.getRowBinding().isRelative() || movedContext.getProperty("HasDraftEntity") !== true;
|
|
247
266
|
const outOfPlaceContext = movedContext.isTransient() !== undefined;
|
|
248
267
|
const customMovable = TableRuntime.checkIfNodeIsMovable(movedContext, table);
|
|
249
|
-
modelObjectPath.singleContextMovableUp = movableDraft && customMovable && !outOfPlaceContext && movedContext.getSibling(-1) !== null;
|
|
250
|
-
modelObjectPath.singleContextMovableDown = movableDraft && customMovable && !outOfPlaceContext && movedContext.getSibling(1) !== null;
|
|
268
|
+
modelObjectPath.singleContextMovableUp = movableDraft && customMovable && !outOfPlaceContext && !movedContext.isDeleted() && movedContext.getSibling(-1) !== null;
|
|
269
|
+
modelObjectPath.singleContextMovableDown = movableDraft && customMovable && !outOfPlaceContext && !movedContext.isDeleted() && movedContext.getSibling(1) !== null;
|
|
251
270
|
}
|
|
252
271
|
},
|
|
253
272
|
/**
|
|
@@ -547,4 +566,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
547
566
|
};
|
|
548
567
|
return TableRuntime;
|
|
549
568
|
}, false);
|
|
550
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJUYWJsZVJ1bnRpbWUiLCJleGVjdXRlQ29uZGl0aW9uYWxBY3Rpb25TaG9ydGN1dCIsInNCdXR0b25NYXRjaGVyIiwib1NvdXJjZSIsIm9NZGNUYWJsZSIsImdldFBhcmVudCIsIkNyZWF0aW9uUm93Iiwib0J1dHRvbiIsImdldEFjdGlvbnMiLCJyZWR1Y2UiLCJhQWN0aW9uQnV0dG9ucyIsIm9BY3Rpb25Ub29sYmFyQWN0aW9uIiwiY29uY2F0IiwiZ2V0QWN0aW9uIiwiZmluZCIsIm9BY3Rpb25CdXR0b24iLCJnZXRJZCIsImVuZHNXaXRoIiwiQ29tbW9uVXRpbHMiLCJmaXJlQnV0dG9uUHJlc3MiLCJvQ3JlYXRpb25Sb3ciLCJnZXRBZ2dyZWdhdGlvbiIsImdldEFwcGx5RW5hYmxlZCIsImdldFZpc2libGUiLCJmaXJlQXBwbHkiLCJzZXRDb250ZXh0cyIsImV2ZW50Iiwic291cmNlIiwiZ2V0U291cmNlIiwidGFibGUiLCJCdXN5TG9ja2VyIiwibG9jayIsInNldENvbnRleHRzQXN5bmMiLCJlcnJvciIsIkxvZyIsInVubG9jayIsIm1ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwidGFibGVBUEkiLCJ0YWJsZURlZmluaXRpb24iLCJjb2xsZWN0aW9uRW50aXR5IiwiTWV0YU1vZGVsQ29udmVydGVyIiwiY29udmVydFR5cGVzIiwicmVzb2x2ZVBhdGgiLCJhbm5vdGF0aW9uIiwiY29sbGVjdGlvbiIsInRhcmdldCIsInNVcGRhdGFibGVQYXRoIiwidXBkYXRhYmxlUHJvcGVydHlQYXRoIiwiYUFjdGlvbnNNdWx0aXNlbGVjdERpc2FibGVkIiwiZGF0YSIsInNwbGl0Iiwib0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsIkpTT04iLCJwYXJzZSIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsIm9OYXZpZ2F0aW9uQXZhaWxhYmxlTWFwIiwiYVNlbGVjdGVkQ29udGV4dHMiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwiYURlbGV0YWJsZUNvbnRleHRzIiwiYlJlYWRPbmx5RHJhZnRFbmFibGVkIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJhVXBkYXRhYmxlQ29udGV4dHMiLCJvRHluYW1pY0FjdGlvbnMiLCJvSUJOIiwib0ludGVybmFsTW9kZWxDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJkZWxldGVIZWxwZXIiLCJ1cGRhdGVEZWxldGVJbmZvRm9yU2VsZWN0ZWRDb250ZXh0cyIsImFjdGl2ZVNlbGVjdGVkQ29udGV4dHMiLCJmaWx0ZXIiLCJvQ29udGV4dCIsImlzSW5hY3RpdmUiLCJvTW9kZWxPYmplY3QiLCJPYmplY3QiLCJhc3NpZ24iLCJnZXRPYmplY3QiLCJzZWxlY3RlZENvbnRleHRzIiwic2VsZWN0ZWRDb250ZXh0c0luY2x1ZGluZ0luYWN0aXZlIiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIiwibGVuZ3RoIiwiZHluYW1pY0FjdGlvbnMiLCJpYm4iLCJkZWxldGVFbmFibGVkIiwiZGVsZXRhYmxlQ29udGV4dHMiLCJ1blNhdmVkQ29udGV4dHMiLCJsb2NrZWRDb250ZXh0cyIsImRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUiLCJkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlIiwiY29udHJvbElkIiwidXBkYXRhYmxlQ29udGV4dHMiLCJwYXN0ZUF1dGhvcml6ZWQiLCJwYXN0ZUZyb21Db3B5QXV0b3JpemVkIiwic2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvciIsImdldFByb3BlcnR5IiwidW5kZWZpbmVkIiwibm9kZVVwZGF0ZXNJbmZvIiwib1NlbGVjdGVkQ29udGV4dCIsIm9Db250ZXh0RGF0YSIsImtleSIsImluZGV4T2YiLCJzQWN0aW9uUGF0aCIsInN1YnN0cmluZyIsImVuYWJsZWQiLCJzZXRQcm9wZXJ0eSIsImlzVXBkYXRhYmxlQ29udGV4dCIsInB1c2giLCJzZXRJbnRlbnRCYXNlZE5hdmlnYXRpb25FbmFibGVtZW50IiwiZGlzYWJsZUFjdGlvbiIsImNvbnRyb2wiLCJjcmVhdGVFbmFibGVtZW50IiwicGFyZW50Q29udGV4dCIsIl91cGRhdGVDcmVhdGVFbmFibGVtZW50Iiwibm9kZVR5cGUiLCJ1cGRhdGVDdXRDb3B5UGFzdGVFbmFibGVtZW50IiwidXBkYXRlTW92ZVVwRG93bkVuYWJsZW1lbnQiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudCIsInNlbGVjdGVkQ29udGV4dCIsInJlYWRPbmx5RHJhZnRFbmFibGVkIiwiY29udGV4dERhdGEiLCJ1cGRhdGFibGVCeVBhdGgiLCJub3REcmFmdEluUmVhZE9ubHlNb2RlIiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsImNoZWNrSWZOb2RlSXNNb3ZhYmxlIiwibm9kZSIsImlzTm9kZU1vdmFibGVGdW5jdGlvbiIsImdldFRhYmxlRGVmaW5pdGlvbiIsImlzTm9kZU1vdmFibGUiLCJub2RlTW92YWJsZUN1c3RvbUZ1bmN0aW9uIiwiRlBNSGVscGVyIiwiZ2V0Q3VzdG9tRnVuY3Rpb24iLCJtb2R1bGVOYW1lIiwibWV0aG9kTmFtZSIsIndhcm5pbmciLCJjaGVja0lmTm9kZUlzQ29weWFibGUiLCJpc05vZGVDb3B5YWJsZUZ1bmN0aW9uIiwiaXNOb2RlQ29weWFibGUiLCJtb2RlbE9iamVjdCIsImZvckNvbnRleHRNZW51IiwiYXJndW1lbnRzIiwidHlwZSIsImNoZWNrRHJhZnRJbnN0YW5jZSIsImdldFJvd0JpbmRpbmciLCJpc1JlbGF0aXZlIiwiY29udGV4dG1lbnUiLCJjb3B5Q3V0UGFzdGVFbmFibGVtZW50SW5mbyIsImRhdGFNb2RlbHNyYyIsImN1dGFibGVDb250ZXh0cyIsImNvbnRleHQiLCJjb3B5YWJsZUNvbnRleHRzIiwiY3V0RW5hYmxlbWVudCIsImNvcHlFbmFibGVtZW50IiwibGFzdEFjdGlvbiIsInBhc3RhYmxlQ29udGV4dHMiLCJjb250ZXh0c2ZvclBhc3RhYmxlRW5hYmxlbWVudCIsImV4dGVuc2lvblBvaW50IiwiaXNNb3ZlVG9Qb3NpdGlvbkFsbG93ZWQiLCJpc0NvcHlUb1Bvc2l0aW9uQWxsb3dlZCIsInRhcmdldENvbnRleHQiLCJwYXN0ZUVuYWJsZW1lbnQiLCJtb2RlbE9iamVjdFBhdGgiLCJjaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQiLCJzaW5nbGVDb250ZXh0TW92YWJsZVVwIiwic2luZ2xlQ29udGV4dE1vdmFibGVEb3duIiwibW92ZWRDb250ZXh0IiwibW92YWJsZURyYWZ0Iiwib3V0T2ZQbGFjZUNvbnRleHQiLCJpc1RyYW5zaWVudCIsImN1c3RvbU1vdmFibGUiLCJnZXRTaWJsaW5nIiwiaW50ZXJuYWxDb250ZXh0IiwiY3JlYXRlRW5hYmxlbWVudENhbGxiYWNrIiwibm9kZVR5cGVQYXJhbWV0ZXJzIiwicG9zc2libGVWYWx1ZXMiLCJ2YWx1ZXMiLCJtYXAiLCJvcHRpb24iLCJ2YWx1ZSIsImVuYWJsZW1lbnRGdW5jdGlvbiIsImVuYWJsZWRGbGFncyIsIl9lcnJvciIsImVuYWJsZW1lbnRNYXAiLCJzb21lIiwiZmxhZyIsImZvckVhY2giLCJpbmRleCIsImNvbnRleHRQYXRoIiwiY2xlYXJTZWxlY3Rpb24iLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsInNBY3Rpb24iLCJiRW5hYmxlZCIsIm9uRmllbGRDaGFuZ2VJbkNyZWF0aW9uUm93Iiwib0V2ZW50Iiwid2l0aEN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsIm1GaWVsZCIsIkZpZWxkUnVudGltZUhlbHBlciIsImdldEZpZWxkU3RhdGVPbkNoYW5nZSIsIm9Tb3VyY2VGaWVsZCIsImZpZWxkIiwic0ZpZWxkSWQiLCJtRmllbGRWYWxpZGl0eSIsIm1OZXdGaWVsZFZhbGlkaXR5Iiwic3RhdGUiLCJtQ3VzdG9tVmFsaWRpdHkiLCJtTmV3Q3VzdG9tVmFsaWRpdHkiLCJnZXRCaW5kaW5nIiwiZ2V0UGF0aCIsImZpZWxkSWQiLCJzVGFyZ2V0IiwiZ2V0QmluZGluZ1BhdGgiLCJNZXNzYWdpbmciLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwib01lc3NhZ2UiLCJnZXRUYXJnZXRzIiwicmVtb3ZlTWVzc2FnZXMiLCJvblRyZWVUYWJsZUNvbnRleHRDaGFuZ2VkIiwiaW5pdGlhbEV4cGFuc2lvbkxldmVsIiwicm93QmluZGluZyIsImdldENvbnRleHQiLCJnZXRJZ25vcmVDb250ZXh0Q2hhbmdlRXZlbnQiLCJhZ2dyZWdhdGlvbiIsImZpbHRlckluZm8iLCJUYWJsZVV0aWxzIiwiZ2V0QWxsRmlsdGVySW5mbyIsImV4cGFuZFRvIiwic2VhcmNoIiwiTnVtYmVyIiwiTUFYX1NBRkVfSU5URUdFUiIsInNldEFnZ3JlZ2F0aW9uIiwib25DcmVhdGVNZW51SXRlbVByZXNzIiwidmFsdWVJbmRleCIsIm1kY1RhYmxlIiwiZ2V0TWRjVGFibGUiLCJ2aWV3IiwiZ2V0VGFyZ2V0VmlldyIsImNyZWF0aW9uRGF0YSIsInByb3BlcnR5TmFtZSIsImNyZWF0aW9uUGFyYW1ldGVycyIsImNyZWF0aW9uTW9kZSIsImNyZWF0ZSIsIm1vZGUiLCJ0YWJsZUlkIiwiQ3JlYXRpb25EaWFsb2ciLCJjcmVhdGlvbkRpYWxvZ0ZpZWxkcyIsInJlYmluZCIsImdldENvbnRyb2xsZXIiLCJlZGl0RmxvdyIsImNyZWF0ZURvY3VtZW50IiwiY2F0Y2giLCJvbkNyZWF0ZUJ1dHRvblByZXNzIiwiRXh0ZXJuYWwiLCJvdXRib3VuZCIsImNyZWF0aW9uUm93IiwiY3JlYXRlQXRFbmQiLCJOZXdQYWdlIiwiSW5saW5lIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwiY3JlYXRlRW1wdHlSb3dzQW5kRm9jdXMiLCJuYXZpZ2F0aW9uQXZhaWxhYmxlTWFwIiwic0tleSIsImFBcHBsaWNhYmxlIiwiYU5vdEFwcGxpY2FibGUiLCJiRW5hYmxlZEZvckNvbnRleHRNZW51IiwiYUFwcGxpY2FibGVGb3JDb250ZXh0TWVudSIsImFOb3RBcHBsaWNhYmxlRm9yQ29udGV4dE1lbnUiLCJzUHJvcGVydHkiLCJlbmFibGVkUHJvcGVydHkiLCJhcHBsaWNhYmxlUHJvcGVydHkiLCJub3RBcHBsaWNhYmxlUHJvcGVydHkiLCJvbkNvbnRleHRNZW51SXRlbVNlbGVjdGVkIiwic2V0Q29udGV4dE1lbnVBY3RpdmUiLCJzZXRUaW1lb3V0IiwiZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyIiwibWVzc2FnZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVGFibGVSdW50aW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRW50aXR5U2V0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBBY3Rpb25SdW50aW1lIGZyb20gXCJzYXAvZmUvY29yZS9BY3Rpb25SdW50aW1lXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBDcmVhdGVCZWhhdmlvckV4dGVybmFsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL1RhYmxlXCI7XG5pbXBvcnQgZGVsZXRlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IEZQTUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9GUE1IZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCBUYWJsZVV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1V0aWxzXCI7XG5pbXBvcnQgdHlwZSBNZW51SXRlbSBmcm9tIFwic2FwL20vTWVudUl0ZW1cIjtcbmltcG9ydCB0eXBlIFVJNUV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCB0eXBlIHsgRmllbGQkQ2hhbmdlRXZlbnQgfSBmcm9tIFwic2FwL3VpL21kYy9GaWVsZFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE1EQ1RhYmxlLCBkZWZhdWx0IGFzIFRhYmxlIH0gZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIEFjdGlvblRvb2xiYXJBY3Rpb24gZnJvbSBcInNhcC91aS9tZGMvYWN0aW9udG9vbGJhci9BY3Rpb25Ub29sYmFyQWN0aW9uXCI7XG5pbXBvcnQgdHlwZSBDcmVhdGlvblJvdyBmcm9tIFwic2FwL3VpL21kYy90YWJsZS9DcmVhdGlvblJvd1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBGaWVsZFJ1bnRpbWVIZWxwZXIgZnJvbSBcIi4uL2ZpZWxkL0ZpZWxkUnVudGltZUhlbHBlclwiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlO1xuLyoqXG4gKiBTdGF0aWMgY2xhc3MgdXNlZCBieSBUYWJsZSBidWlsZGluZyBibG9jayBkdXJpbmcgcnVudGltZVxuICogQHByaXZhdGVcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgaW50ZXJuYWwvZXhwZXJpbWVudGFsIHVzZSFcbiAqL1xuY29uc3QgVGFibGVSdW50aW1lID0ge1xuXHRleGVjdXRlQ29uZGl0aW9uYWxBY3Rpb25TaG9ydGN1dDogZnVuY3Rpb24gKHNCdXR0b25NYXRjaGVyOiBzdHJpbmcsIG9Tb3VyY2U6IENvbnRyb2wpOiB2b2lkIHtcblx0XHQvLyBHZXQgdGhlIGJ1dHRvbiByZWxhdGVkIHRvIGtleWJvYXJkIHNob3J0Y3V0XG5cdFx0Y29uc3Qgb01kY1RhYmxlID0gb1NvdXJjZS5nZXRQYXJlbnQoKSBhcyBNRENUYWJsZTtcblx0XHRpZiAoc0J1dHRvbk1hdGNoZXIgIT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdykge1xuXHRcdFx0Y29uc3Qgb0J1dHRvbiA9IG9NZGNUYWJsZVxuXHRcdFx0XHQuZ2V0QWN0aW9ucygpXG5cdFx0XHRcdC5yZWR1Y2UoZnVuY3Rpb24gKGFBY3Rpb25CdXR0b25zOiBDb250cm9sW10sIG9BY3Rpb25Ub29sYmFyQWN0aW9uOiBDb250cm9sKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGFBY3Rpb25CdXR0b25zLmNvbmNhdCgob0FjdGlvblRvb2xiYXJBY3Rpb24gYXMgQWN0aW9uVG9vbGJhckFjdGlvbikuZ2V0QWN0aW9uKCkpO1xuXHRcdFx0XHR9LCBbXSBhcyBDb250cm9sW10pXG5cdFx0XHRcdC5maW5kKGZ1bmN0aW9uIChvQWN0aW9uQnV0dG9uOiBDb250cm9sKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9BY3Rpb25CdXR0b24uZ2V0SWQoKS5lbmRzV2l0aChzQnV0dG9uTWF0Y2hlcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0Q29tbW9uVXRpbHMuZmlyZUJ1dHRvblByZXNzKG9CdXR0b24pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvQ3JlYXRpb25Sb3cgPSBvTWRjVGFibGUuZ2V0QWdncmVnYXRpb24oXCJjcmVhdGlvblJvd1wiKSBhcyBDcmVhdGlvblJvdztcblx0XHRcdGlmIChvQ3JlYXRpb25Sb3cgJiYgb0NyZWF0aW9uUm93LmdldEFwcGx5RW5hYmxlZCgpICYmIG9DcmVhdGlvblJvdy5nZXRWaXNpYmxlKCkpIHtcblx0XHRcdFx0b0NyZWF0aW9uUm93LmZpcmVBcHBseSgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRzZXRDb250ZXh0czogYXN5bmMgZnVuY3Rpb24gKGV2ZW50OiBVSTVFdmVudDx7fSwgVGFibGU+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc291cmNlID0gZXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3QgdGFibGUgPSBzb3VyY2U7XG5cdFx0QnVzeUxvY2tlci5sb2NrKHRhYmxlKTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgVGFibGVSdW50aW1lLnNldENvbnRleHRzQXN5bmModGFibGUpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGFibGUpO1xuXHRcdH1cblx0fSxcblxuXHRzZXRDb250ZXh0c0FzeW5jOiBhc3luYyBmdW5jdGlvbiAodGFibGU6IFRhYmxlKTogUHJvbWlzZTx2b2lkW10gfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YWJsZS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyB1bmRlZmluZWQgfCBPRGF0YU1ldGFNb2RlbDtcblx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdGlmICghdGFibGVBUEkgfHwgIW1ldGFNb2RlbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCB0YWJsZURlZmluaXRpb24gPSB0YWJsZUFQSS50YWJsZURlZmluaXRpb247XG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudGl0eSA9IE1ldGFNb2RlbENvbnZlcnRlci5jb252ZXJ0VHlwZXMobWV0YU1vZGVsKS5yZXNvbHZlUGF0aDxFbnRpdHlTZXQ+KFxuXHRcdFx0dGFibGVEZWZpbml0aW9uLmFubm90YXRpb24uY29sbGVjdGlvblxuXHRcdCkudGFyZ2V0O1xuXHRcdGNvbnN0IHNVcGRhdGFibGVQYXRoID0gdGFibGVEZWZpbml0aW9uLmFubm90YXRpb24udXBkYXRhYmxlUHJvcGVydHlQYXRoO1xuXG5cdFx0Y29uc3QgYUFjdGlvbnNNdWx0aXNlbGVjdERpc2FibGVkID0gdGFibGUuZGF0YShcImFjdGlvbnNNdWx0aXNlbGVjdERpc2FibGVkXCIpPy5zcGxpdChcIixcIikgPz8gW107XG5cdFx0Y29uc3Qgb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCA9IEpTT04ucGFyc2UodGFibGVEZWZpbml0aW9uLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCB8fCBcInt9XCIpO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uQXZhaWxhYmxlTWFwID0gdGFibGUuZGF0YShcIm5hdmlnYXRpb25BdmFpbGFibGVNYXBcIik7XG5cblx0XHRjb25zdCBhU2VsZWN0ZWRDb250ZXh0cyA9IHRhYmxlLmdldFNlbGVjdGVkQ29udGV4dHMoKSBhcyBDb250ZXh0W107XG5cdFx0Y29uc3QgYURlbGV0YWJsZUNvbnRleHRzOiBDb250ZXh0W10gPSBbXTtcblx0XHRjb25zdCBiUmVhZE9ubHlEcmFmdEVuYWJsZWQgPVxuXHRcdFx0dGFibGUuZGF0YShcImRpc3BsYXlNb2RlUHJvcGVydHlCaW5kaW5nXCIpID09PSBcInRydWVcIiAmJiAhIWNvbGxlY3Rpb25FbnRpdHk/LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290O1xuXHRcdGNvbnN0IGFVcGRhdGFibGVDb250ZXh0czogQ29udGV4dFtdID0gW107XG5cdFx0Ly8gb0R5bmFtaWNBY3Rpb25zIGFyZSBib3VuZCBhY3Rpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSBhY2NvcmRpbmcgdG8gc29tZSBwcm9wZXJ0eVxuXHRcdC8vIGluIGVhY2ggaXRlbVxuXHRcdGNvbnN0IG9EeW5hbWljQWN0aW9uczogUmVjb3JkPHN0cmluZywgeyBiRW5hYmxlZD86IGJvb2xlYW4gfT4gfCB1bmRlZmluZWQgPSB7fTtcblx0XHRjb25zdCBvSUJOID0ge307XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblxuXHRcdGlmICghb0ludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdC8vIGZvciB0aGUgZGVsZXRlIHdlIGNvbnNpZGVyIHRoZSBpbmFjdGl2ZSBjb250ZXh0cyBhcyBwb3RlbnRpYWxseSBwYXJ0IG9mIHRoZSBzZWxlY3RlZCBjb250ZXh0c1xuXHRcdGRlbGV0ZUhlbHBlci51cGRhdGVEZWxldGVJbmZvRm9yU2VsZWN0ZWRDb250ZXh0cyhvSW50ZXJuYWxNb2RlbENvbnRleHQsIGFTZWxlY3RlZENvbnRleHRzKTtcblxuXHRcdC8vZG8gbm90IGNvbnNpZGVyIGVtcHR5IHJvd3MgYXMgc2VsZWN0ZWQgY29udGV4dCwgZm9yIHRoZSBvdGhlciBhY3Rpb25zXG5cdFx0Y29uc3QgYWN0aXZlU2VsZWN0ZWRDb250ZXh0cyA9IGFTZWxlY3RlZENvbnRleHRzLmZpbHRlcihmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRcdHJldHVybiAhb0NvbnRleHQuaXNJbmFjdGl2ZSgpO1xuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgb01vZGVsT2JqZWN0ID0gT2JqZWN0LmFzc2lnbihvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0T2JqZWN0KCkgfHwge30sIHtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM6IGFjdGl2ZVNlbGVjdGVkQ29udGV4dHMsXG5cdFx0XHRzZWxlY3RlZENvbnRleHRzSW5jbHVkaW5nSW5hY3RpdmU6IGFTZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzOiBhY3RpdmVTZWxlY3RlZENvbnRleHRzLmxlbmd0aCxcblx0XHRcdGR5bmFtaWNBY3Rpb25zOiBvRHluYW1pY0FjdGlvbnMsXG5cdFx0XHRpYm46IG9JQk4sXG5cdFx0XHRkZWxldGVFbmFibGVkOiB0cnVlLFxuXHRcdFx0ZGVsZXRhYmxlQ29udGV4dHM6IGFEZWxldGFibGVDb250ZXh0cyxcblx0XHRcdHVuU2F2ZWRDb250ZXh0czogW10sXG5cdFx0XHRsb2NrZWRDb250ZXh0czogW10sXG5cdFx0XHRkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlOiBbXSxcblx0XHRcdGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmU6IFtdLFxuXHRcdFx0Y29udHJvbElkOiBcIlwiLFxuXHRcdFx0dXBkYXRhYmxlQ29udGV4dHM6IGFVcGRhdGFibGVDb250ZXh0cyxcblx0XHRcdHBhc3RlQXV0aG9yaXplZDogdHJ1ZSxcblx0XHRcdHBhc3RlRnJvbUNvcHlBdXRvcml6ZWQ6IHRydWUsXG5cdFx0XHRzZW1hbnRpY0tleUhhc0RyYWZ0SW5kaWNhdG9yOiBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJzZW1hbnRpY0tleUhhc0RyYWZ0SW5kaWNhdG9yXCIpXG5cdFx0XHRcdD8gb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwic2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvclwiKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdH0pO1xuXHRcdG9Nb2RlbE9iamVjdC5ub2RlVXBkYXRlc0luZm8gPSBvTW9kZWxPYmplY3Qubm9kZVVwZGF0ZXNJbmZvIHx8IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBvU2VsZWN0ZWRDb250ZXh0IG9mIGFjdGl2ZVNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBvQ29udGV4dERhdGEpIHtcblx0XHRcdFx0aWYgKGtleS5pbmRleE9mKFwiI1wiKSA9PT0gMCkge1xuXHRcdFx0XHRcdGxldCBzQWN0aW9uUGF0aDogc3RyaW5nID0ga2V5O1xuXHRcdFx0XHRcdHNBY3Rpb25QYXRoID0gc0FjdGlvblBhdGguc3Vic3RyaW5nKDEsIHNBY3Rpb25QYXRoLmxlbmd0aCk7XG5cdFx0XHRcdFx0b01vZGVsT2JqZWN0LmR5bmFtaWNBY3Rpb25zW3NBY3Rpb25QYXRoXSA9IHsgZW5hYmxlZDogdHJ1ZSB9O1xuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIlwiLCBvTW9kZWxPYmplY3QpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5pc1VwZGF0YWJsZUNvbnRleHQoc1VwZGF0YWJsZVBhdGgsIG9TZWxlY3RlZENvbnRleHQsIGJSZWFkT25seURyYWZ0RW5hYmxlZCkpIHtcblx0XHRcdFx0YVVwZGF0YWJsZUNvbnRleHRzLnB1c2gob1NlbGVjdGVkQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCF0YWJsZS5kYXRhKFwiZW5hYmxlQW5hbHl0aWNzXCIpKSB7XG5cdFx0XHRUYWJsZVJ1bnRpbWUuc2V0SW50ZW50QmFzZWROYXZpZ2F0aW9uRW5hYmxlbWVudChvSW50ZXJuYWxNb2RlbENvbnRleHQsIG9OYXZpZ2F0aW9uQXZhaWxhYmxlTWFwLCBhY3RpdmVTZWxlY3RlZENvbnRleHRzKTtcblx0XHR9XG5cblx0XHRpZiAoYWN0aXZlU2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHR0aGlzLmRpc2FibGVBY3Rpb24oYUFjdGlvbnNNdWx0aXNlbGVjdERpc2FibGVkLCBvRHluYW1pY0FjdGlvbnMpO1xuXHRcdH1cblxuXHRcdGlmIChvTW9kZWxPYmplY3QpIHtcblx0XHRcdG9Nb2RlbE9iamVjdFtcInVwZGF0YWJsZUNvbnRleHRzXCJdID0gYVVwZGF0YWJsZUNvbnRleHRzO1xuXHRcdFx0b01vZGVsT2JqZWN0W1wiY29udHJvbElkXCJdID0gdGFibGUuZ2V0SWQoKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIlwiLCBvTW9kZWxPYmplY3QpO1xuXHRcdH1cblxuXHRcdC8vIE1hbmFnZSBhIHBvdGVudGlhbCBjYWxsYmFjayB0byBlbmFibGUvZGlzYWJsZSB0aGUgY3JlYXRlIGJ1dHRvbi9tZW51IGZvciBhIFRyZWVUYWJsZVxuXHRcdGlmIChhY3RpdmVTZWxlY3RlZENvbnRleHRzLmxlbmd0aCA8PSAxICYmIHRhYmxlRGVmaW5pdGlvbi5jb250cm9sLmNyZWF0ZUVuYWJsZW1lbnQpIHtcblx0XHRcdGNvbnN0IHBhcmVudENvbnRleHQgPSBhY3RpdmVTZWxlY3RlZENvbnRleHRzLmxlbmd0aCA/IGFjdGl2ZVNlbGVjdGVkQ29udGV4dHNbMF0gOiBudWxsO1xuXHRcdFx0dGhpcy5fdXBkYXRlQ3JlYXRlRW5hYmxlbWVudChcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHR0YWJsZURlZmluaXRpb24uY29udHJvbC5jcmVhdGVFbmFibGVtZW50LFxuXHRcdFx0XHR0YWJsZSxcblx0XHRcdFx0cGFyZW50Q29udGV4dCxcblx0XHRcdFx0dGFibGVEZWZpbml0aW9uLmNvbnRyb2wubm9kZVR5cGVcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVDdXRDb3B5UGFzdGVFbmFibGVtZW50KG9Nb2RlbE9iamVjdCwgdGFibGUpO1xuXHRcdHRoaXMudXBkYXRlTW92ZVVwRG93bkVuYWJsZW1lbnQob01vZGVsT2JqZWN0LCB0YWJsZSk7XG5cdFx0cmV0dXJuIEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChvSW50ZXJuYWxNb2RlbENvbnRleHQsIG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAsIGFjdGl2ZVNlbGVjdGVkQ29udGV4dHMsIFwidGFibGVcIik7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcywgaWYgdGhlIHNlbGVjdGVkIGNvbnRleHQgaXMgdXBkYXRhYmxlIGZvciBNYXNzIEVkaXQuXG5cdCAqIEBwYXJhbSB1cGRhdGFibGVQcm9wZXJ0eVBhdGggVGhlIHVwZGF0YWJsZVByb3BlcnR5UGF0aCBmcm9tIHRoZSB0YWJsZSBhbm5vdGF0aW9uXG5cdCAqIEBwYXJhbSBzZWxlY3RlZENvbnRleHQgVGhlIHNlbGVjdGVkIGNvbnRleHRcblx0ICogQHBhcmFtIHJlYWRPbmx5RHJhZnRFbmFibGVkIEluZGljYXRlcywgaWYgdGhlIHRhYmxlIGlzIHJlYWQgb25seSBhbmQgZHJhZnQgZW5hYmxlZFxuXHQgKiBAcmV0dXJucyBCb29sZWFuIEluZGljYXRpbmcgY29udGV4dCBpcyB1cGRhdGFibGVcblx0ICovXG5cdGlzVXBkYXRhYmxlQ29udGV4dDogZnVuY3Rpb24gKHVwZGF0YWJsZVByb3BlcnR5UGF0aDogc3RyaW5nLCBzZWxlY3RlZENvbnRleHQ6IENvbnRleHQsIHJlYWRPbmx5RHJhZnRFbmFibGVkOiBib29sZWFuKTogYm9vbGVhbiB7XG5cdFx0LyogVGhlIHVwZGF0YWJsZSBjb250ZXh0cyB3aXRoIG1hc3MgZWRpdCBkZXBlbmQgb24gdGhlIGZvbGxvd2luZzpcblx0XHQgXHQxLiBVcGRhdGUgaXMgZGVwZW5kZW50IG9uIGN1cnJlbnQgZW50aXR5IHByb3BlcnR5ICh1cGRhdGFibGVQYXRoKS5cblx0XHQgXHQyLiBUaGUgdGFibGUgaXMgcmVhZCBvbmx5IGFuZCBkcmFmdCBlbmFibGVkIChsaWtlIExSKSwgaW4gdGhpcyBjYXNlIG9ubHkgYWN0aXZlIGNvbnRleHRzIGNhbiBiZSBtYXNzIGVkaXRlZCAobm90IGRyYWZ0IGNvbnRleHRzKS5cblx0XHQgICAgU28sIHVwZGF0ZSBkZXBlbmRzIG9uICdJc0FjdGl2ZUVudGl0eScsICdIYXNEcmFmdEVudGl0eScgIHZhbHVlIHdoaWNoIG5lZWRzIHRvIGJlIGNoZWNrZWQuICovXG5cdFx0Y29uc3QgY29udGV4dERhdGEgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0Y29uc3QgdXBkYXRhYmxlQnlQYXRoID0gdXBkYXRhYmxlUHJvcGVydHlQYXRoLmxlbmd0aCA9PT0gMCB8fCAhIXNlbGVjdGVkQ29udGV4dC5nZXRQcm9wZXJ0eSh1cGRhdGFibGVQcm9wZXJ0eVBhdGgpO1xuXHRcdGNvbnN0IG5vdERyYWZ0SW5SZWFkT25seU1vZGUgPSAhcmVhZE9ubHlEcmFmdEVuYWJsZWQgfHwgKGNvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmICFjb250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSk7XG5cdFx0aWYgKHVwZGF0YWJsZUJ5UGF0aCAmJiBub3REcmFmdEluUmVhZE9ubHlNb2RlKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIG5vZGUgaXMgbW92YWJsZSBhY2NvcmRpbmcgdG8gdGhlIGN1c3RvbSBsb2dpYyAoaWYgYW55KS5cblx0ICogQHBhcmFtIG5vZGVcblx0ICogQHBhcmFtIHRhYmxlXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGN1c3RvbSBsb2dpYyBhbGxvd3MgdGhlIG5vZGUgdG8gYmUgbW92ZWQgKG9yIGlmIHRoZXJlJ3Mgbm8gY3VzdG9tIGxvZ2ljKSwgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRjaGVja0lmTm9kZUlzTW92YWJsZTogZnVuY3Rpb24gKG5vZGU6IENvbnRleHQsIHRhYmxlOiBUYWJsZSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGlzTm9kZU1vdmFibGVGdW5jdGlvbiA9ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0VGFibGVEZWZpbml0aW9uKCkuY29udHJvbC5pc05vZGVNb3ZhYmxlO1xuXHRcdGNvbnN0IG5vZGVNb3ZhYmxlQ3VzdG9tRnVuY3Rpb24gPSBpc05vZGVNb3ZhYmxlRnVuY3Rpb25cblx0XHRcdD8gRlBNSGVscGVyLmdldEN1c3RvbUZ1bmN0aW9uPChjb250ZXh0OiBDb250ZXh0KSA9PiBib29sZWFuPihcblx0XHRcdFx0XHRpc05vZGVNb3ZhYmxlRnVuY3Rpb24ubW9kdWxlTmFtZSxcblx0XHRcdFx0XHRpc05vZGVNb3ZhYmxlRnVuY3Rpb24ubWV0aG9kTmFtZSxcblx0XHRcdFx0XHR0YWJsZVxuXHRcdFx0ICApXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gbm9kZU1vdmFibGVDdXN0b21GdW5jdGlvbiA9PT0gdW5kZWZpbmVkIHx8IG5vZGVNb3ZhYmxlQ3VzdG9tRnVuY3Rpb24obm9kZSk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy53YXJuaW5nKGBFcnJvciBpbiBjdXN0b20gZnVuY3Rpb24gZm9yIGlzTm9kZU1vdmFibGU6ICR7ZXJyb3J9YCk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyB3aGV0aGVyIHRoZSBub2RlIGNhbiBiZSBjb3BpZWQgYWNjb3JkaW5nIHRvIHRoZSBjdXN0b20gbG9naWMsIGlmIGFueS5cblx0ICogQHBhcmFtIG5vZGVcblx0ICogQHBhcmFtIHRhYmxlXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgY3VzdG9tIGxvZ2ljIGFsbG93cyB0aGUgbm9kZSB0byBiZSBjb3BpZWQgKG9yIGlmIG5vIGN1c3RvbSBsb2dpYyBpcyBkZWZpbmVkKTsgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQgKi9cblx0Y2hlY2tJZk5vZGVJc0NvcHlhYmxlOiBmdW5jdGlvbiAobm9kZTogQ29udGV4dCwgdGFibGU6IFRhYmxlKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgaXNOb2RlQ29weWFibGVGdW5jdGlvbiA9ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0VGFibGVEZWZpbml0aW9uKCkuY29udHJvbC5pc05vZGVDb3B5YWJsZTtcblx0XHRjb25zdCBub2RlTW92YWJsZUN1c3RvbUZ1bmN0aW9uID0gaXNOb2RlQ29weWFibGVGdW5jdGlvblxuXHRcdFx0PyBGUE1IZWxwZXIuZ2V0Q3VzdG9tRnVuY3Rpb248KGNvbnRleHQ6IENvbnRleHQpID0+IGJvb2xlYW4+KFxuXHRcdFx0XHRcdGlzTm9kZUNvcHlhYmxlRnVuY3Rpb24ubW9kdWxlTmFtZSxcblx0XHRcdFx0XHRpc05vZGVDb3B5YWJsZUZ1bmN0aW9uLm1ldGhvZE5hbWUsXG5cdFx0XHRcdFx0dGFibGVcblx0XHRcdCAgKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIG5vZGVNb3ZhYmxlQ3VzdG9tRnVuY3Rpb24gPT09IHVuZGVmaW5lZCB8fCBub2RlTW92YWJsZUN1c3RvbUZ1bmN0aW9uKG5vZGUpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cud2FybmluZyhgRXJyb3IgaW4gY3VzdG9tIGZ1bmN0aW9uIGZvciBpc05vZGVNb3ZhYmxlOiAke2Vycm9yfWApO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBpbnRlcm5hbCBjb250ZXh0IHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBDdXQgYW5kIFBhc3RlIGJ1dHRvbnMuXG5cdCAqIEBwYXJhbSBtb2RlbE9iamVjdCBJbnRlcm5hbCBjb250ZXh0IG9iamVjdCBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIHRhYmxlIEluc3RhbmNlIG9mIHRoZSBUYWJsZVxuXHQgKiBAcGFyYW0gZm9yQ29udGV4dE1lbnVcblx0ICovXG5cdHVwZGF0ZUN1dENvcHlQYXN0ZUVuYWJsZW1lbnQ6IGZ1bmN0aW9uIChtb2RlbE9iamVjdDogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0sIHRhYmxlOiBUYWJsZSwgZm9yQ29udGV4dE1lbnUgPSBmYWxzZSk6IHZvaWQge1xuXHRcdGNvbnN0IHRhYmxlRGVmaW5pdGlvbiA9ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0VGFibGVEZWZpbml0aW9uKCk7XG5cdFx0aWYgKHRhYmxlRGVmaW5pdGlvbi5jb250cm9sLnR5cGUgIT09IFwiVHJlZVRhYmxlXCIpIHtcblx0XHRcdC8vIFRoZSBsb2dpYyBiZWxvdyBvbmx5IG1ha2VzIHNlbnNlIGZvciBhIFRyZWUgVGFibGVcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgY2hlY2tEcmFmdEluc3RhbmNlID0gIXRhYmxlLmdldFJvd0JpbmRpbmcoKS5pc1JlbGF0aXZlKCk7XG5cblx0XHRpZiAoZm9yQ29udGV4dE1lbnUpIHtcblx0XHRcdChtb2RlbE9iamVjdC5jb250ZXh0bWVudSBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkubm9kZVVwZGF0ZXNJbmZvID0ge307XG5cdFx0fVxuXHRcdGNvbnN0IG5vZGVVcGRhdGVzSW5mbyA9IG1vZGVsT2JqZWN0Lm5vZGVVcGRhdGVzSW5mbyBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfTtcblx0XHRjb25zdCBjb3B5Q3V0UGFzdGVFbmFibGVtZW50SW5mbyA9ICgoIWZvckNvbnRleHRNZW51ID8gbW9kZWxPYmplY3QgOiBtb2RlbE9iamVjdC5jb250ZXh0bWVudSkgYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pXG5cdFx0XHQubm9kZVVwZGF0ZXNJbmZvIGFzIHtcblx0XHRcdFtrZXk6IHN0cmluZ106IHVua25vd247XG5cdFx0fTtcblx0XHRjb25zdCBkYXRhTW9kZWxzcmMgPSAoIWZvckNvbnRleHRNZW51ID8gbW9kZWxPYmplY3QgOiBtb2RlbE9iamVjdC5jb250ZXh0bWVudSkgYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XG5cdFx0Y29uc3QgY3V0YWJsZUNvbnRleHRzID0gKGRhdGFNb2RlbHNyYy51cGRhdGFibGVDb250ZXh0cyBhcyBDb250ZXh0W10pLmZpbHRlcihcblx0XHRcdChjb250ZXh0KSA9PlxuXHRcdFx0XHRUYWJsZVJ1bnRpbWUuY2hlY2tJZk5vZGVJc01vdmFibGUoY29udGV4dCwgdGFibGUpICYmICghY2hlY2tEcmFmdEluc3RhbmNlIHx8IGNvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNEcmFmdEVudGl0eVwiKSAhPT0gdHJ1ZSlcblx0XHQpO1xuXHRcdGNvbnN0IGNvcHlhYmxlQ29udGV4dHMgPSAoZGF0YU1vZGVsc3JjLnNlbGVjdGVkQ29udGV4dHMgYXMgQ29udGV4dFtdKS5maWx0ZXIoKGNvbnRleHQpID0+XG5cdFx0XHRUYWJsZVJ1bnRpbWUuY2hlY2tJZk5vZGVJc0NvcHlhYmxlKGNvbnRleHQsIHRhYmxlKVxuXHRcdCk7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRDb250ZXh0cyA9IGRhdGFNb2RlbHNyYy5zZWxlY3RlZENvbnRleHRzIGFzIENvbnRleHRbXTtcblx0XHRjb3B5Q3V0UGFzdGVFbmFibGVtZW50SW5mby5jdXRFbmFibGVtZW50ID0gc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPT09IDEgJiYgY3V0YWJsZUNvbnRleHRzLmxlbmd0aCA9PT0gMTtcblx0XHRjb3B5Q3V0UGFzdGVFbmFibGVtZW50SW5mby5jb3B5RW5hYmxlbWVudCA9IHNlbGVjdGVkQ29udGV4dHMubGVuZ3RoID09PSAxICYmIGNvcHlhYmxlQ29udGV4dHMubGVuZ3RoID09PSAxO1xuXG5cdFx0aWYgKG5vZGVVcGRhdGVzSW5mby5sYXN0QWN0aW9uICYmIChub2RlVXBkYXRlc0luZm8ucGFzdGFibGVDb250ZXh0cyBhcyBDb250ZXh0W10pLmxlbmd0aCA+IDApIHtcblx0XHRcdGxldCBjb250ZXh0c2ZvclBhc3RhYmxlRW5hYmxlbWVudDogQ29udGV4dFtdO1xuXHRcdFx0Y29uc3QgZXh0ZW5zaW9uUG9pbnQgPVxuXHRcdFx0XHRub2RlVXBkYXRlc0luZm8ubGFzdEFjdGlvbiA9PT0gXCJDdXRcIlxuXHRcdFx0XHRcdD8gdGFibGVEZWZpbml0aW9uLmNvbnRyb2wuaXNNb3ZlVG9Qb3NpdGlvbkFsbG93ZWRcblx0XHRcdFx0XHQ6IHRhYmxlRGVmaW5pdGlvbi5jb250cm9sLmlzQ29weVRvUG9zaXRpb25BbGxvd2VkO1xuXG5cdFx0XHQvL3JlbW92ZSBjb250ZXh0cyBkZXBlbmRpbmcgb2YgdGhlIGN1c3RvbSBmdW5jdGlvblxuXHRcdFx0aWYgKGV4dGVuc2lvblBvaW50KSB7XG5cdFx0XHRcdGNvbnRleHRzZm9yUGFzdGFibGVFbmFibGVtZW50ID0gWy4uLnNlbGVjdGVkQ29udGV4dHNdLmZpbHRlcihcblx0XHRcdFx0XHQodGFyZ2V0Q29udGV4dCkgPT5cblx0XHRcdFx0XHRcdChcblx0XHRcdFx0XHRcdFx0RlBNSGVscGVyLmdldEN1c3RvbUZ1bmN0aW9uPChjb250ZXh0czogQ29udGV4dFtdKSA9PiBib29sZWFuPihcblx0XHRcdFx0XHRcdFx0XHRleHRlbnNpb25Qb2ludC5tb2R1bGVOYW1lLFxuXHRcdFx0XHRcdFx0XHRcdGV4dGVuc2lvblBvaW50Lm1ldGhvZE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0dGFibGVcblx0XHRcdFx0XHRcdFx0KSBhcyBGdW5jdGlvblxuXHRcdFx0XHRcdFx0KSgobm9kZVVwZGF0ZXNJbmZvLnBhc3RhYmxlQ29udGV4dHMgYXMgQ29udGV4dFtdKVswXSwgdGFyZ2V0Q29udGV4dCkgLy9ub2RlVXBkYXRlc0luZm8ucGFzdGFibGVDb250ZXh0cyBoYXMgYmVlbiB0aGUgbGFzdCB0aW1lIHRoZSB1c2VyIHByZXNzZWQgdGhlIGN1dC9jb3B5IGJ1dHRvblxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29udGV4dHNmb3JQYXN0YWJsZUVuYWJsZW1lbnQgPSBbLi4uc2VsZWN0ZWRDb250ZXh0c107XG5cdFx0XHR9XG5cblx0XHRcdC8vdGhlIHBhc3RlIGNhbm5vdCBiZSBkb25lIGlmIHNldmVyYWwgY29udGV4dHMgYXJlIHNlbGVjdGVkXG5cdFx0XHRjb3B5Q3V0UGFzdGVFbmFibGVtZW50SW5mby5wYXN0ZUVuYWJsZW1lbnQgPVxuXHRcdFx0XHRzZWxlY3RlZENvbnRleHRzLmxlbmd0aCA8PSAxICYmIGNvbnRleHRzZm9yUGFzdGFibGVFbmFibGVtZW50Lmxlbmd0aCA9PT0gc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGg7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiAgVXBkYXRlcyB0aGUgaW50ZXJuYWwgY29udGV4dCB0byBlbmFibGUvZGlzYWJsZSB0aGUgbW92ZSB1cC9tb3ZlIGRvd24gYnV0dG9ucy5cblx0ICogQHBhcmFtIG1vZGVsT2JqZWN0XG5cdCAqIEBwYXJhbSB0YWJsZVxuXHQgKiBAcGFyYW0gZm9yQ29udGV4dE1lbnVcblx0ICovXG5cdHVwZGF0ZU1vdmVVcERvd25FbmFibGVtZW50OiBmdW5jdGlvbiAobW9kZWxPYmplY3Q6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9LCB0YWJsZTogVGFibGUsIGZvckNvbnRleHRNZW51ID0gZmFsc2UpOiB2b2lkIHtcblx0XHRjb25zdCBtb2RlbE9iamVjdFBhdGggPSAhZm9yQ29udGV4dE1lbnUgPyBtb2RlbE9iamVjdCA6IChtb2RlbE9iamVjdC5jb250ZXh0bWVudSBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSk7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRDb250ZXh0cyA9IG1vZGVsT2JqZWN0UGF0aC5zZWxlY3RlZENvbnRleHRzIGFzIENvbnRleHRbXTtcblx0XHRjb25zdCB0YWJsZURlZmluaXRpb24gPSAodGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkpLmdldFRhYmxlRGVmaW5pdGlvbigpO1xuXG5cdFx0Y29uc3QgY2hhbmdlU2libGluZ0ZvclJvb3RzU3VwcG9ydGVkID0gdGFibGVEZWZpbml0aW9uLmFubm90YXRpb24uY2hhbmdlU2libGluZ0ZvclJvb3RzU3VwcG9ydGVkO1xuXHRcdC8vIERpc2FibGUgdGhlIG1vdmUgdXAvbW92ZSBkb3duIGJ1dHRvbnMgaWYgdGhlcmUgYXJlIG5vIHNlbGVjdGVkIGNvbnRleHRzLCBpZiB0aGUgdGFibGUgaXMgbm90IGEgVHJlZVRhYmxlLCBvciBpZiB0aGUgdGFibGUgaXMgc29ydGVkXG5cdFx0aWYgKFxuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggIT09IDEgfHxcblx0XHRcdHRhYmxlRGVmaW5pdGlvbi5jb250cm9sLnR5cGUgIT09IFwiVHJlZVRhYmxlXCIgfHxcblx0XHRcdHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwiaXNTb3J0ZWRcIikgPT09IHRydWUgfHxcblx0XHRcdChzZWxlY3RlZENvbnRleHRzWzBdLmdldFByb3BlcnR5KFwiQCR1aTUubm9kZS5sZXZlbFwiKSA9PT0gMSAmJiAhY2hhbmdlU2libGluZ0ZvclJvb3RzU3VwcG9ydGVkKSAvLyBEaXNhYmxlIG1vdmUgdXAvZG93biBmb3Igcm9vdHNcblx0XHQpIHtcblx0XHRcdG1vZGVsT2JqZWN0UGF0aC5zaW5nbGVDb250ZXh0TW92YWJsZVVwID0gZmFsc2U7XG5cdFx0XHRtb2RlbE9iamVjdFBhdGguc2luZ2xlQ29udGV4dE1vdmFibGVEb3duID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1vdmVkQ29udGV4dCA9IHNlbGVjdGVkQ29udGV4dHNbMF07XG5cblx0XHRcdC8vIENoZWNrIGlmIHRoZSBzZWxlY3RlZCBjb250ZXh0IGNhbiBiZSBtb3ZlZCBhY2NvcmRpbmcgdG8gdGhlIGN1c3RvbSBsb2dpYyAoaWYgYW55KSBhbmQgaWYgaXQgZG9lc24ndCBoYXZlIGEgZHJhZnQgaW5zdGFuY2UgaWYgd2UncmUgaW4gYSBMaXN0UmVwb3J0LFxuXHRcdFx0Ly8gYW5kIGlmIGl0J3Mgbm90IG91dC1vZi1wbGFjZSAoaS5lLiBpdCBtdXN0IGJlIGRpc3BsYXllZCBhdCBpdHMgJ3JlYWwnIHBvc2l0aW9uKVxuXHRcdFx0Y29uc3QgbW92YWJsZURyYWZ0ID0gdGFibGUuZ2V0Um93QmluZGluZygpLmlzUmVsYXRpdmUoKSB8fCBtb3ZlZENvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNEcmFmdEVudGl0eVwiKSAhPT0gdHJ1ZTtcblx0XHRcdGNvbnN0IG91dE9mUGxhY2VDb250ZXh0ID0gbW92ZWRDb250ZXh0LmlzVHJhbnNpZW50KCkgIT09IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGN1c3RvbU1vdmFibGUgPSBUYWJsZVJ1bnRpbWUuY2hlY2tJZk5vZGVJc01vdmFibGUobW92ZWRDb250ZXh0LCB0YWJsZSk7XG5cdFx0XHRtb2RlbE9iamVjdFBhdGguc2luZ2xlQ29udGV4dE1vdmFibGVVcCA9XG5cdFx0XHRcdG1vdmFibGVEcmFmdCAmJiBjdXN0b21Nb3ZhYmxlICYmICFvdXRPZlBsYWNlQ29udGV4dCAmJiBtb3ZlZENvbnRleHQuZ2V0U2libGluZygtMSkgIT09IG51bGw7XG5cdFx0XHRtb2RlbE9iamVjdFBhdGguc2luZ2xlQ29udGV4dE1vdmFibGVEb3duID1cblx0XHRcdFx0bW92YWJsZURyYWZ0ICYmIGN1c3RvbU1vdmFibGUgJiYgIW91dE9mUGxhY2VDb250ZXh0ICYmIG1vdmVkQ29udGV4dC5nZXRTaWJsaW5nKDEpICE9PSBudWxsO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgaW50ZXJuYWwgY29udGV4dCB0byBlbmFibGUvZGlzYWJsZSB0aGUgQ3JlYXRlIGJ1dHRvbiAvIG1lbnUgLyBtZW51IGl0ZW1zLlxuXHQgKiBAcGFyYW0gaW50ZXJuYWxDb250ZXh0XG5cdCAqIEBwYXJhbSBjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2tcblx0ICogQHBhcmFtIGNyZWF0ZUVuYWJsZW1lbnRDYWxsYmFjay5tb2R1bGVOYW1lXG5cdCAqIEBwYXJhbSBjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2subWV0aG9kTmFtZVxuXHQgKiBAcGFyYW0gdGFibGVcblx0ICogQHBhcmFtIHBhcmVudENvbnRleHRcblx0ICogQHBhcmFtIG5vZGVUeXBlUGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gbm9kZVR5cGVQYXJhbWV0ZXJzLnByb3BlcnR5TmFtZVxuXHQgKiBAcGFyYW0gbm9kZVR5cGVQYXJhbWV0ZXJzLnZhbHVlc1xuXHQgKiBAcGFyYW0gZm9yQ29udGV4dE1lbnVcblx0ICovXG5cdF91cGRhdGVDcmVhdGVFbmFibGVtZW50OiBmdW5jdGlvbiAoXG5cdFx0aW50ZXJuYWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2s6IHsgbW9kdWxlTmFtZTogc3RyaW5nOyBtZXRob2ROYW1lOiBzdHJpbmcgfSxcblx0XHR0YWJsZTogVGFibGUsXG5cdFx0cGFyZW50Q29udGV4dDogQ29udGV4dCB8IG51bGwsXG5cdFx0bm9kZVR5cGVQYXJhbWV0ZXJzPzogeyBwcm9wZXJ0eU5hbWU6IHN0cmluZzsgdmFsdWVzOiB7IHZhbHVlOiBzdHJpbmcgfVtdIH0sXG5cdFx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuXHQpOiB2b2lkIHtcblx0XHRsZXQgcG9zc2libGVWYWx1ZXM6IChzdHJpbmcgfCB1bmRlZmluZWQpW107XG5cdFx0aWYgKG5vZGVUeXBlUGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBQdXNoIGFsbCBwb3NzaWJsZSB2YWx1ZXMgaW4gdGhlIG1lbnVcblx0XHRcdHBvc3NpYmxlVmFsdWVzID0gbm9kZVR5cGVQYXJhbWV0ZXJzLnZhbHVlcy5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gbWVudSAtLT4gT25seSAndW5kZWZpbmVkJyB2YWx1ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSAnQ3JlYXRlJyBidXR0b25cblx0XHRcdHBvc3NpYmxlVmFsdWVzID0gW3VuZGVmaW5lZF07XG5cdFx0fVxuXG5cdFx0Y29uc3QgZW5hYmxlbWVudEZ1bmN0aW9uID0gRlBNSGVscGVyLmdldEN1c3RvbUZ1bmN0aW9uPChub2RlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBwYXJlbnRDb250ZXh0OiBDb250ZXh0IHwgbnVsbCkgPT4gYm9vbGVhbj4oXG5cdFx0XHRjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2subW9kdWxlTmFtZSxcblx0XHRcdGNyZWF0ZUVuYWJsZW1lbnRDYWxsYmFjay5tZXRob2ROYW1lLFxuXHRcdFx0dGFibGVcblx0XHQpO1xuXG5cdFx0aWYgKCFlbmFibGVtZW50RnVuY3Rpb24pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZW5hYmxlZEZsYWdzID0gcG9zc2libGVWYWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuXHRcdFx0bGV0IGVuYWJsZWQgPSBmYWxzZTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGVuYWJsZWQgPSAhIShlbmFibGVtZW50RnVuY3Rpb24odmFsdWUsIHBhcmVudENvbnRleHQpID8/IHRydWUpO1xuXHRcdFx0fSBjYXRjaCAoX2Vycm9yKSB7XG5cdFx0XHRcdGVuYWJsZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGVuYWJsZWQ7XG5cdFx0fSk7XG5cdFx0Ly8gZW5hYmxlRmxhZ3NbaV0gaXMgdHJ1ZSA8PT4gcG9zc2libGVWYWx1ZXNbaV0gaXMgYWxsb3dlZCBmb3IgY3JlYXRpb25cblxuXHRcdGNvbnN0IGVuYWJsZW1lbnRNYXA6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cdFx0ZW5hYmxlbWVudE1hcFtcIkNyZWF0ZVwiXSA9IGVuYWJsZWRGbGFncy5zb21lKChmbGFnKSA9PiBmbGFnKTsgLy8gRW5hYmxlIHRoZSBNZW51IChvciB0aGUgYnV0dG9uKSBpZiBhdCBsZWFzdCBvbmUgb3B0aW9uIGlzIHBvc3NpYmxlXG5cdFx0ZW5hYmxlZEZsYWdzLmZvckVhY2goKGVuYWJsZWQsIGluZGV4KSA9PiB7XG5cdFx0XHRlbmFibGVtZW50TWFwW2BDcmVhdGVfJHtpbmRleH1gXSA9IGVuYWJsZWQ7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBjb250ZXh0UGF0aCA9IGZvckNvbnRleHRNZW51ID8gXCJjb250ZXh0bWVudS9cIiA6IFwiXCI7XG5cdFx0aW50ZXJuYWxDb250ZXh0LnNldFByb3BlcnR5KGNvbnRleHRQYXRoICsgXCJjcmVhdGVFbmFibGVtZW50XCIsIGVuYWJsZW1lbnRNYXApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDbGVhcnMgdGhlIHRhYmxlIHNlbGVjdGlvbiwgYW5kIGVuYWJsZXMvZGlzYWJsZXMgdGhlICdDcmVhdGUnIGJ1dHRvbi9tZW51IGlmIG5lY2Vzc2FyeS5cblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZVxuXHQgKi9cblx0Y2xlYXJTZWxlY3Rpb246IGZ1bmN0aW9uICh0YWJsZTogVGFibGUpOiB2b2lkIHtcblx0XHQvLyBDbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb250cm9sXG5cdFx0dGFibGUuY2xlYXJTZWxlY3Rpb24oKTtcblxuXHRcdC8vIFVwZGF0ZSB0aGUgc2VsZWN0aW9uLXJlbGF0ZWQgaW5mb3JtYXRpb24gaW4gdGhlIGludGVybmFsIG1vZGVsXG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbENvbnRleHQgPSB0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdGlmIChpbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJkZWxldGVFbmFibGVkXCIsIGZhbHNlKTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIsIDApO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzZWxlY3RlZENvbnRleHRzXCIsIFtdKTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZGVsZXRhYmxlQ29udGV4dHNcIiwgW10pO1xuXHRcdH1cblxuXHRcdC8vIEVuYWJsZS9kaXNhYmxlIHRoZSAnQ3JlYXRlJyBidXR0b24vbWVudSBpZiBuZWNlc3Nhcnlcblx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdGlmICh0YWJsZUFQSS50YWJsZURlZmluaXRpb24uY29udHJvbC5jcmVhdGVFbmFibGVtZW50KSB7XG5cdFx0XHR0aGlzLl91cGRhdGVDcmVhdGVFbmFibGVtZW50KFxuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dCBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0dGFibGVBUEkudGFibGVEZWZpbml0aW9uLmNvbnRyb2wuY3JlYXRlRW5hYmxlbWVudCxcblx0XHRcdFx0dGFibGUsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbi5jb250cm9sLm5vZGVUeXBlXG5cdFx0XHQpO1xuXHRcdH1cblx0fSxcblxuXHRkaXNhYmxlQWN0aW9uOiBmdW5jdGlvbiAoYUFjdGlvbnNNdWx0aXNlbGVjdERpc2FibGVkOiBzdHJpbmdbXSwgb0R5bmFtaWNBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IGJFbmFibGVkPzogYm9vbGVhbiB9Pik6IHZvaWQge1xuXHRcdGFBY3Rpb25zTXVsdGlzZWxlY3REaXNhYmxlZC5mb3JFYWNoKGZ1bmN0aW9uIChzQWN0aW9uOiBzdHJpbmcpIHtcblx0XHRcdG9EeW5hbWljQWN0aW9uc1tzQWN0aW9uXSA9IHsgYkVuYWJsZWQ6IGZhbHNlIH07XG5cdFx0fSk7XG5cdH0sXG5cdG9uRmllbGRDaGFuZ2VJbkNyZWF0aW9uUm93OiBmdW5jdGlvbiAoXG5cdFx0b0V2ZW50OiBGaWVsZCRDaGFuZ2VFdmVudCAmIFVJNUV2ZW50PHsgaXNWYWxpZDogYm9vbGVhbiB9Pixcblx0XHR3aXRoQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdC8vIENSRUFUSU9OIFJPVyBDQVNFXG5cdFx0Y29uc3QgbUZpZWxkID0gRmllbGRSdW50aW1lSGVscGVyLmdldEZpZWxkU3RhdGVPbkNoYW5nZShvRXZlbnQpLFxuXHRcdFx0b1NvdXJjZUZpZWxkID0gbUZpZWxkLmZpZWxkLFxuXHRcdFx0c0ZpZWxkSWQgPSBvU291cmNlRmllbGQuZ2V0SWQoKTtcblxuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9Tb3VyY2VGaWVsZC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0bUZpZWxkVmFsaWRpdHkgPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiksXG5cdFx0XHRtTmV3RmllbGRWYWxpZGl0eSA9IE9iamVjdC5hc3NpZ24oe30sIG1GaWVsZFZhbGlkaXR5KTtcblxuXHRcdG1OZXdGaWVsZFZhbGlkaXR5W3NGaWVsZElkXSA9IG1GaWVsZC5zdGF0ZTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwgbU5ld0ZpZWxkVmFsaWRpdHkpO1xuXG5cdFx0Ly8gcHJlcGFyZSBDdXN0b20gVmFsaWRhdGlvblxuXHRcdGlmICh3aXRoQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uKSB7XG5cdFx0XHRjb25zdCBtQ3VzdG9tVmFsaWRpdHkgPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIpLFxuXHRcdFx0XHRtTmV3Q3VzdG9tVmFsaWRpdHkgPSBPYmplY3QuYXNzaWduKHt9LCBtQ3VzdG9tVmFsaWRpdHkpO1xuXHRcdFx0bU5ld0N1c3RvbVZhbGlkaXR5W29Tb3VyY2VGaWVsZC5nZXRCaW5kaW5nKFwidmFsdWVcIikhLmdldFBhdGgoKV0gPSB7XG5cdFx0XHRcdGZpZWxkSWQ6IG9Tb3VyY2VGaWVsZC5nZXRJZCgpXG5cdFx0XHR9O1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiLCBtTmV3Q3VzdG9tVmFsaWRpdHkpO1xuXHRcdFx0Ly8gUmVtb3ZlIGV4aXN0aW5nIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0Y29uc3Qgc1RhcmdldCA9IGAke29Tb3VyY2VGaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCl9LyR7b1NvdXJjZUZpZWxkLmdldEJpbmRpbmdQYXRoKFwidmFsdWVcIil9YDtcblx0XHRcdE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogTWVzc2FnZSkge1xuXHRcdFx0XHRcdGlmIChvTWVzc2FnZS5nZXRUYXJnZXRzKClbMF0gPT09IHNUYXJnZXQpIHtcblx0XHRcdFx0XHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cdG9uVHJlZVRhYmxlQ29udGV4dENoYW5nZWQ6IGZ1bmN0aW9uIChldmVudDogVUk1RXZlbnQsIGluaXRpYWxFeHBhbnNpb25MZXZlbD86IG51bWJlcik6IHZvaWQge1xuXHRcdC8vIFdoZW4gdGhlIGNvbnRleHQgb2YgYSBUcmVlVGFibGUgY2hhbmdlcywgd2Ugd2FudCB0byByZXN0b3JlIGl0cyBleHBhbnNpb24gc3RhdGUgdG8gdGhlIGRlZmF1bHQ6XG5cdFx0Ly8gICAtIGFsbCBleHBhbmRlZCBpZiB0aGVyZSdzIGEgc2VhcmNoIHBhcmFtZXRlciBjb21pbmcgZnJvbSB0aGUgZmlsdGVyQmFyXG5cdFx0Ly8gICAtIG90aGVyd2lzZSBpbml0aWFsIGV4cGFuc2lvbiBzdGF0ZSBjb21pbmcgZnJvbSB0aGUgUFYgKHN0b3JlZCBpbiB0aGUgcGF5bG9hZClcblx0XHQvLyAgIC0gb3RoZXJ3aXNlIG5vIGV4cGFuc2lvbiBhdCBhbGxcblxuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IHRhYmxlID0gc291cmNlIGFzIFRhYmxlO1xuXHRcdGNvbnN0IHRhYmxlQVBJID0gdGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0Y29uc3Qgcm93QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRpZiAoIXJvd0JpbmRpbmc/LmdldENvbnRleHQoKSB8fCB0YWJsZUFQSS5nZXRJZ25vcmVDb250ZXh0Q2hhbmdlRXZlbnQoKSkge1xuXHRcdFx0Ly8gVGhlIHRhYmxlIGlzIG5vdCBib3VuZCwgb3Igd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBzd2l0Y2hpbmcgYmV0d2VlbiBub3JtYWwgYW5kIGZ1bGxzY3JlZW4sIHNvIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBleHBhbnNpb24gc3RhdGVcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBhZ2dyZWdhdGlvbjoge1xuXHRcdFx0YWdncmVnYXRlPzogb2JqZWN0O1xuXHRcdFx0ZXhwYW5kVG8/OiBudW1iZXI7XG5cdFx0XHRncmFuZFRvdGFsQXRCb3R0b21Pbmx5PzogYm9vbGVhbjtcblx0XHRcdGdyb3VwPzogb2JqZWN0O1xuXHRcdFx0Z3JvdXBMZXZlbHM/OiBzdHJpbmdbXTtcblx0XHRcdGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZztcblx0XHRcdHNlYXJjaD86IHN0cmluZztcblx0XHRcdHN1YnRvdGFsc0F0Qm90dG9tT25seT86IGJvb2xlYW47XG5cdFx0fSA9IHJvd0JpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSA/PyB7fTtcblx0XHRjb25zdCBmaWx0ZXJJbmZvID0gVGFibGVVdGlscy5nZXRBbGxGaWx0ZXJJbmZvKHRhYmxlKTtcblx0XHRhZ2dyZWdhdGlvbi5leHBhbmRUbyA9IGZpbHRlckluZm8uc2VhcmNoID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgOiBpbml0aWFsRXhwYW5zaW9uTGV2ZWw7XG5cdFx0cm93QmluZGluZy5zZXRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbik7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGFuIGl0ZW0gaW4gYSAnQ3JlYXRlJyBtZW51IGlzIGNsaWNrZWQuIEl0IGNyZWF0ZXMgYSBkb2N1bWVudCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGluaXRpYWwgZGF0YS5cblx0ICogQHBhcmFtIGV2ZW50XG5cdCAqIEBwYXJhbSB2YWx1ZUluZGV4IFRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgbWVudVxuXHQgKiBAcGFyYW0gc2VsZWN0ZWRDb250ZXh0cyBUaGUgc2VsZWN0ZWQgY29udGV4dHMgaW4gdGhlIHRhYmxlIGZvciB0aGlzICdDcmVhdGUnIG1lbnVcblx0ICovXG5cdG9uQ3JlYXRlTWVudUl0ZW1QcmVzczogYXN5bmMgZnVuY3Rpb24gKGV2ZW50OiBVSTVFdmVudDx7fSwgTWVudUl0ZW0+LCB2YWx1ZUluZGV4OiBudW1iZXIsIHNlbGVjdGVkQ29udGV4dHM6IENvbnRleHRbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG1kY1RhYmxlID0gRlBNSGVscGVyLmdldE1kY1RhYmxlKGV2ZW50LmdldFNvdXJjZSgpKTtcblx0XHRjb25zdCB0YWJsZUFQSSA9IG1kY1RhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZDtcblxuXHRcdC8vIFNvbWUgY2hlY2tzIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGVcblx0XHRpZiAoIXRhYmxlQVBJIHx8ICFtZGNUYWJsZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBub2RlVHlwZSA9IHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbi5jb250cm9sLm5vZGVUeXBlO1xuXHRcdGlmICghbm9kZVR5cGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCB2aWV3ID0gQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0Vmlldyh0YWJsZUFQSSk7XG5cdFx0Y29uc3QgY3JlYXRpb25EYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdFx0Y3JlYXRpb25EYXRhW25vZGVUeXBlLnByb3BlcnR5TmFtZV0gPSBub2RlVHlwZS52YWx1ZXNbdmFsdWVJbmRleF0udmFsdWU7XG5cblx0XHRjb25zdCBjcmVhdGlvblBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdHRhYmxlSWQ/OiBzdHJpbmc7XG5cdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xuXHRcdFx0ZGF0YT86IG9iamVjdDtcblx0XHR9ID0ge1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdGNyZWF0aW9uTW9kZTogdGFibGVBUEkudGFibGVEZWZpbml0aW9uLmFubm90YXRpb24uY3JlYXRlLm1vZGUsXG5cdFx0XHRkYXRhOiBjcmVhdGlvbkRhdGEsXG5cdFx0XHR0YWJsZUlkOiBtZGNUYWJsZT8uZ2V0SWQoKVxuXHRcdH07XG5cblx0XHRpZiAoY3JlYXRpb25QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nKSB7XG5cdFx0XHRjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMgPSBub2RlVHlwZS52YWx1ZXNbdmFsdWVJbmRleF0uY3JlYXRpb25EaWFsb2dGaWVsZHM7XG5cdFx0XHRpZiAoIWNyZWF0aW9uUGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkcyB8fCBjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdC8vIFVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBubyBjcmVhdGlvbiBmaWVsZHMgYXJlIHNwZWNpZmllZCBmb3IgdGhpcyBtZW51IGl0ZW1cblx0XHRcdFx0Y3JlYXRpb25QYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzID0gdGFibGVBUEkudGFibGVEZWZpbml0aW9uLmNvbnRyb2wuY3JlYXRpb25EaWFsb2dGaWVsZHM7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIW1kY1RhYmxlLmdldFJvd0JpbmRpbmcoKSkge1xuXHRcdFx0XHQvLyBJbiBjcmVhdGlvbiBkaWFsb2cgbW9kZSwgd2UgZm9yY2UgdGhlIHRhYmxlIGRhdGEgdG8gYmUgbG9hZGVkIGJlZm9yZSBjcmVhdGluZyB0aGUgZG9jdW1lbnRcblx0XHRcdFx0Ly8gKHRvIG92ZXJjb21lIHRoZSBjYXNlIGluIGEgTGlzdFJlcG9ydCB3aGVyZSBubyBkYXRhIGlzIGxvYWRlZCB5ZXQpXG5cdFx0XHRcdGF3YWl0IG1kY1RhYmxlLnJlYmluZCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZpZXcuZ2V0Q29udHJvbGxlcigpXG5cdFx0XHQuZWRpdEZsb3cuY3JlYXRlRG9jdW1lbnQodGFibGVBUEkuZ2V0Um93QmluZGluZygpLCBjcmVhdGlvblBhcmFtZXRlcnMpXG5cdFx0XHQuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdExvZy5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBuZXcgZG9jdW1lbnQ6ICR7ZXJyb3J9YCk7XG5cdFx0XHR9KTtcblx0fSxcblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlICdDcmVhdGUnIGJ1dHRvbiBpcyBwcmVzc2VkLCBvciB0aGUgJ0NyZWF0ZScgY29tbWFuZCBpbnZva2VkLlxuXHQgKiBAcGFyYW0gZXZlbnRcblx0ICogQHBhcmFtIHNlbGVjdGVkQ29udGV4dHMgVGhlIHNlbGVjdGVkIGNvbnRleHRzIGluIHRoZSB0YWJsZSBmb3IgdGhpcyAnQ3JlYXRlJyBidXR0b25cblx0ICovXG5cdG9uQ3JlYXRlQnV0dG9uUHJlc3M6IGFzeW5jIGZ1bmN0aW9uIChldmVudDogVUk1RXZlbnQsIHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W10pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBtZGNUYWJsZSA9IEZQTUhlbHBlci5nZXRNZGNUYWJsZShldmVudC5nZXRTb3VyY2UoKSk7XG5cdFx0Y29uc3QgdGFibGVBUEkgPSBtZGNUYWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQ7XG5cblx0XHQvLyBTb21lIGNoZWNrcyB0byBiZSBvbiB0aGUgc2FmZSBzaWRlXG5cdFx0aWYgKCF0YWJsZUFQSSB8fCAhbWRjVGFibGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBjcmVhdGlvblBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0b3V0Ym91bmQ/OiBzdHJpbmc7XG5cdFx0XHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdHRhYmxlSWQ/OiBzdHJpbmc7XG5cdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xuXHRcdH0gPSB7IGNyZWF0aW9uTW9kZTogdGFibGVBUEkudGFibGVEZWZpbml0aW9uLmFubm90YXRpb24uY3JlYXRlLm1vZGUgfTtcblxuXHRcdHN3aXRjaCAoY3JlYXRpb25QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSkge1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWw6XG5cdFx0XHRcdGNyZWF0aW9uUGFyYW1ldGVycy5vdXRib3VuZCA9ICh0YWJsZUFQSS50YWJsZURlZmluaXRpb24uYW5ub3RhdGlvbi5jcmVhdGUgYXMgQ3JlYXRlQmVoYXZpb3JFeHRlcm5hbCkub3V0Ym91bmQ7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdzpcblx0XHRcdFx0Y3JlYXRpb25QYXJhbWV0ZXJzLmNyZWF0aW9uUm93ID0gZXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRcdGNyZWF0aW9uUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbi5jb250cm9sLmNyZWF0ZUF0RW5kID8/IGZhbHNlO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuTmV3UGFnZTpcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLklubGluZTpcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nOlxuXHRcdFx0XHRjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPSB0YWJsZUFQSS50YWJsZURlZmluaXRpb24uY29udHJvbC5jcmVhdGVBdEVuZCA/PyBmYWxzZTtcblx0XHRcdFx0Y3JlYXRpb25QYXJhbWV0ZXJzLnRhYmxlSWQgPSBtZGNUYWJsZT8uZ2V0SWQoKTtcblx0XHRcdFx0Y3JlYXRpb25QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMgPSBzZWxlY3RlZENvbnRleHRzO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzOlxuXHRcdFx0XHQvLyBOb3RoaW5nXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHQvLyBPdGhlciBtb2RlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGNyZWF0aW9uUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZykge1xuXHRcdFx0Y3JlYXRpb25QYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzID0gdGFibGVBUEkudGFibGVEZWZpbml0aW9uLmNvbnRyb2wuY3JlYXRpb25EaWFsb2dGaWVsZHM7XG5cdFx0XHRpZiAoIW1kY1RhYmxlLmdldFJvd0JpbmRpbmcoKSkge1xuXHRcdFx0XHQvLyBJbiBjcmVhdGlvbiBkaWFsb2cgbW9kZSwgd2UgZm9yY2UgdGhlIHRhYmxlIGRhdGEgdG8gYmUgbG9hZGVkIGJlZm9yZSBjcmVhdGluZyB0aGUgZG9jdW1lbnRcblx0XHRcdFx0Ly8gKHRvIG92ZXJjb21lIHRoZSBjYXNlIGluIGEgTGlzdFJlcG9ydCB3aGVyZSBubyBkYXRhIGlzIGxvYWRlZCB5ZXQpXG5cdFx0XHRcdGF3YWl0IG1kY1RhYmxlLnJlYmluZCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHZpZXcgPSBDb21tb25VdGlscy5nZXRUYXJnZXRWaWV3KHRhYmxlQVBJKTtcblxuXHRcdGlmIChjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzKSB7XG5cdFx0XHR2aWV3LmdldENvbnRyb2xsZXIoKVxuXHRcdFx0XHQuZWRpdEZsb3cuY3JlYXRlRW1wdHlSb3dzQW5kRm9jdXMobWRjVGFibGUpXG5cdFx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgbmV3IGVtcHR5IHJvdzogJHtlcnJvcn1gKTtcblx0XHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZpZXcuZ2V0Q29udHJvbGxlcigpXG5cdFx0XHRcdC5lZGl0Rmxvdy5jcmVhdGVEb2N1bWVudCh0YWJsZUFQSSwgY3JlYXRpb25QYXJhbWV0ZXJzKVxuXHRcdFx0XHQuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIG5ldyBkb2N1bWVudDogJHtlcnJvcn1gKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gbWFuYWdlIHRoZSBJbnRlbnRCYXNlZCBOYXZpZ2F0aW9uIGVuYWJsZW1lbnQuXG5cdCAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsQ29udGV4dFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvbkF2YWlsYWJsZU1hcFxuXHQgKiBAcGFyYW0gc2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gZm9yQ29udGV4dE1lbnVcblx0ICovXG5cdHNldEludGVudEJhc2VkTmF2aWdhdGlvbkVuYWJsZW1lbnQ6IGZ1bmN0aW9uIChcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0bmF2aWdhdGlvbkF2YWlsYWJsZU1hcDogc3RyaW5nW10sXG5cdFx0c2VsZWN0ZWRDb250ZXh0czogQ29udGV4dFtdLFxuXHRcdGZvckNvbnRleHRNZW51ID0gZmFsc2Vcblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBzS2V5IGluIG5hdmlnYXRpb25BdmFpbGFibGVNYXApIHtcblx0XHRcdGlmICghZm9yQ29udGV4dE1lbnUpIHtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGlibi8ke3NLZXl9YCwge1xuXHRcdFx0XHRcdGJFbmFibGVkOiBmYWxzZSxcblx0XHRcdFx0XHRhQXBwbGljYWJsZTogW10sXG5cdFx0XHRcdFx0YU5vdEFwcGxpY2FibGU6IFtdXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGlibi8ke3NLZXl9YCwge1xuXHRcdFx0XHRcdC8vIERvIG5vdCBjaGFuZ2UgZW5hYmxlZCwgYUFwcGxpY2FibGUgYW5kIGFOb3RBcHBsaWNhYmxlIHByb3BlcnR5IGluIGNhc2Ugb2YgY29udGV4dCBtZW51IGNhbGN1bGF0aW9uXG5cdFx0XHRcdFx0YkVuYWJsZWQ6IGludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGAke2ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vaWJuLyR7c0tleX0vYkVuYWJsZWRgKSxcblx0XHRcdFx0XHRhQXBwbGljYWJsZTogaW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYCR7aW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpfS9pYm4vJHtzS2V5fS9hQXBwbGljYWJsZWApLFxuXHRcdFx0XHRcdGFOb3RBcHBsaWNhYmxlOiBpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgJHtpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQYXRoKCl9L2libi8ke3NLZXl9L2FOb3RBcHBsaWNhYmxlYCksXG5cdFx0XHRcdFx0YkVuYWJsZWRGb3JDb250ZXh0TWVudTogZmFsc2UsXG5cdFx0XHRcdFx0YUFwcGxpY2FibGVGb3JDb250ZXh0TWVudTogW10sXG5cdFx0XHRcdFx0YU5vdEFwcGxpY2FibGVGb3JDb250ZXh0TWVudTogW11cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBhQXBwbGljYWJsZSA9IFtdLFxuXHRcdFx0XHRhTm90QXBwbGljYWJsZSA9IFtdO1xuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5ID0gbmF2aWdhdGlvbkF2YWlsYWJsZU1hcFtzS2V5XTtcblx0XHRcdGZvciAoY29uc3Qgc2VsZWN0ZWRDb250ZXh0IG9mIHNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdFx0aWYgKHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3Qoc1Byb3BlcnR5KSkge1xuXHRcdFx0XHRcdGNvbnN0IGVuYWJsZWRQcm9wZXJ0eSA9ICFmb3JDb250ZXh0TWVudSA/IFwiYkVuYWJsZWRcIiA6IFwiYkVuYWJsZWRGb3JDb250ZXh0TWVudVwiO1xuXHRcdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LmdldE1vZGVsKCkuc2V0UHJvcGVydHkoYCR7aW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpfS9pYm4vJHtzS2V5fS8ke2VuYWJsZWRQcm9wZXJ0eX1gLCB0cnVlKTtcblx0XHRcdFx0XHRhQXBwbGljYWJsZS5wdXNoKHNlbGVjdGVkQ29udGV4dCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YU5vdEFwcGxpY2FibGUucHVzaChzZWxlY3RlZENvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBhcHBsaWNhYmxlUHJvcGVydHkgPSAhZm9yQ29udGV4dE1lbnUgPyBcImFBcHBsaWNhYmxlXCIgOiBcImFBcHBsaWNhYmxlRm9yQ29udGV4dE1lbnVcIjtcblx0XHRcdGNvbnN0IG5vdEFwcGxpY2FibGVQcm9wZXJ0eSA9ICFmb3JDb250ZXh0TWVudSA/IFwiYU5vdEFwcGxpY2FibGVcIiA6IFwiYU5vdEFwcGxpY2FibGVGb3JDb250ZXh0TWVudVwiO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShgJHtpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQYXRoKCl9L2libi8ke3NLZXl9LyR7YXBwbGljYWJsZVByb3BlcnR5fWAsIGFBcHBsaWNhYmxlKTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0XG5cdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdC5zZXRQcm9wZXJ0eShgJHtpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQYXRoKCl9L2libi8ke3NLZXl9LyR7bm90QXBwbGljYWJsZVByb3BlcnR5fWAsIGFOb3RBcHBsaWNhYmxlKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgY29udGV4dCBtZW51IGl0ZW0gaXMgcHJlc3NlZC5cblx0ICogQHBhcmFtIGV2ZW50XG5cdCAqL1xuXHRvbkNvbnRleHRNZW51SXRlbVNlbGVjdGVkOiBmdW5jdGlvbiAoZXZlbnQ6IFVJNUV2ZW50KTogdm9pZCB7XG5cdFx0Y29uc3QgbWRjVGFibGUgPSBGUE1IZWxwZXIuZ2V0TWRjVGFibGUoZXZlbnQuZ2V0U291cmNlKCkpO1xuXHRcdGNvbnN0IHRhYmxlQVBJID0gbWRjVGFibGU/LmdldFBhcmVudCgpIGFzIFRhYmxlQVBJIHwgdW5kZWZpbmVkO1xuXG5cdFx0Ly8gU2V0IHRoZSBmbGFnIG9uIHRoZSB0YWJsZUFQSSBzbyB0aGF0IGdldFNlbGVjdGVkQ29udGV4dHMgcmV0dXJucyB0aGUgY29ycmVjdCB2YWx1ZVxuXHRcdHRhYmxlQVBJPy5zZXRDb250ZXh0TWVudUFjdGl2ZSh0cnVlKTtcblxuXHRcdC8vIEFmdGVyIGEgc2hvcnQgZGVsYXkgKG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgYWN0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCksIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGZsYWcgb24gdGhlIHRhYmxlXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0YWJsZUFQST8uc2V0Q29udGV4dE1lbnVBY3RpdmUoZmFsc2UpO1xuXHRcdH0sIDApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBNREMgRGF0YVN0YXRlSW5kaWNhdG9yIHBsdWdpbiB0byBkaXNwbGF5IG1lc3NhZ2VTdHJpcCBvbiBhIHRhYmxlLlxuXHQgKiBAcGFyYW0gbWVzc2FnZVxuXHQgKiBAcGFyYW0gY29udHJvbFxuXHQgKiBAcmV0dXJucyBXaGV0aGVyIHRvIHJlbmRlciB0aGUgbWVzc2FnZVN0cmlwIHZpc2libGVcblx0ICovXG5cdGRhdGFTdGF0ZUluZGljYXRvckZpbHRlcjogZnVuY3Rpb24gKG1lc3NhZ2U6IE1lc3NhZ2UsIGNvbnRyb2w6IENvbnRyb2wpOiBib29sZWFuIHtcblx0XHRjb25zdCB0YWJsZUFQSSA9IGNvbnRyb2wuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0cmV0dXJuIHRhYmxlQVBJLmRhdGFTdGF0ZUluZGljYXRvckZpbHRlcihtZXNzYWdlLCBjb250cm9sKTtcblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgVGFibGVSdW50aW1lO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0VBMEJBLE1BQU1BLFlBQVksR0FBR0MsU0FBUyxDQUFDRCxZQUFZO0VBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNRSxZQUFZLEdBQUc7SUFDcEJDLGdDQUFnQyxFQUFFLFNBQUFBLENBQVVDLGNBQXNCLEVBQUVDLE9BQWdCLEVBQVE7TUFDM0Y7TUFDQSxNQUFNQyxTQUFTLEdBQUdELE9BQU8sQ0FBQ0UsU0FBUyxDQUFDLENBQWE7TUFDakQsSUFBSUgsY0FBYyxLQUFLSixZQUFZLENBQUNRLFdBQVcsRUFBRTtRQUNoRCxNQUFNQyxPQUFPLEdBQUdILFNBQVMsQ0FDdkJJLFVBQVUsQ0FBQyxDQUFDLENBQ1pDLE1BQU0sQ0FBQyxVQUFVQyxjQUF5QixFQUFFQyxvQkFBNkIsRUFBRTtVQUMzRSxPQUFPRCxjQUFj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
|
|
569
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJUYWJsZVJ1bnRpbWUiLCJleGVjdXRlQ29uZGl0aW9uYWxBY3Rpb25TaG9ydGN1dCIsInNCdXR0b25NYXRjaGVyIiwib1NvdXJjZSIsIm9NZGNUYWJsZSIsImdldFBhcmVudCIsIkNyZWF0aW9uUm93Iiwib0J1dHRvbiIsImdldEFjdGlvbnMiLCJyZWR1Y2UiLCJhQWN0aW9uQnV0dG9ucyIsIm9BY3Rpb25Ub29sYmFyQWN0aW9uIiwiY29uY2F0IiwiZ2V0QWN0aW9uIiwiZmluZCIsIm9BY3Rpb25CdXR0b24iLCJnZXRJZCIsImVuZHNXaXRoIiwiQ29tbW9uVXRpbHMiLCJmaXJlQnV0dG9uUHJlc3MiLCJvQ3JlYXRpb25Sb3ciLCJnZXRBZ2dyZWdhdGlvbiIsImdldEFwcGx5RW5hYmxlZCIsImdldFZpc2libGUiLCJmaXJlQXBwbHkiLCJzZXRDb250ZXh0cyIsImV2ZW50Iiwic291cmNlIiwiZ2V0U291cmNlIiwidGFibGUiLCJCdXN5TG9ja2VyIiwibG9jayIsInNldENvbnRleHRzQXN5bmMiLCJlcnJvciIsIkxvZyIsInVubG9jayIsIm1ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwidGFibGVBUEkiLCJ0YWJsZURlZmluaXRpb24iLCJjb2xsZWN0aW9uRW50aXR5IiwiTWV0YU1vZGVsQ29udmVydGVyIiwiY29udmVydFR5cGVzIiwicmVzb2x2ZVBhdGgiLCJhbm5vdGF0aW9uIiwiY29sbGVjdGlvbiIsInRhcmdldCIsInNVcGRhdGFibGVQYXRoIiwidXBkYXRhYmxlUHJvcGVydHlQYXRoIiwiYUFjdGlvbnNNdWx0aXNlbGVjdERpc2FibGVkIiwiZGF0YSIsInNwbGl0Iiwib0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsIkpTT04iLCJwYXJzZSIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsIm9OYXZpZ2F0aW9uQXZhaWxhYmxlTWFwIiwiYVNlbGVjdGVkQ29udGV4dHMiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwiYURlbGV0YWJsZUNvbnRleHRzIiwiYlJlYWRPbmx5RHJhZnRFbmFibGVkIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJhVXBkYXRhYmxlQ29udGV4dHMiLCJvRHluYW1pY0FjdGlvbnMiLCJvSUJOIiwib0ludGVybmFsTW9kZWxDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJkZWxldGVIZWxwZXIiLCJ1cGRhdGVEZWxldGVJbmZvRm9yU2VsZWN0ZWRDb250ZXh0cyIsImFjdGl2ZVNlbGVjdGVkQ29udGV4dHMiLCJmaWx0ZXIiLCJvQ29udGV4dCIsImlzSW5hY3RpdmUiLCJvTW9kZWxPYmplY3QiLCJPYmplY3QiLCJhc3NpZ24iLCJnZXRPYmplY3QiLCJzZWxlY3RlZENvbnRleHRzIiwic2VsZWN0ZWRDb250ZXh0c0luY2x1ZGluZ0luYWN0aXZlIiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIiwibGVuZ3RoIiwiZHluYW1pY0FjdGlvbnMiLCJpYm4iLCJkZWxldGVFbmFibGVkIiwiZGVsZXRhYmxlQ29udGV4dHMiLCJ1blNhdmVkQ29udGV4dHMiLCJsb2NrZWRDb250ZXh0cyIsImRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUiLCJkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlIiwiY29udHJvbElkIiwidXBkYXRhYmxlQ29udGV4dHMiLCJwYXN0ZUF1dGhvcml6ZWQiLCJwYXN0ZUZyb21Db3B5QXV0b3JpemVkIiwic2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvciIsImdldFByb3BlcnR5IiwidW5kZWZpbmVkIiwibm9kZVVwZGF0ZXNJbmZvIiwib1NlbGVjdGVkQ29udGV4dCIsIm9Db250ZXh0RGF0YSIsImtleSIsImluZGV4T2YiLCJzQWN0aW9uUGF0aCIsInN1YnN0cmluZyIsImVuYWJsZWQiLCJzZXRQcm9wZXJ0eSIsImlzVXBkYXRhYmxlQ29udGV4dCIsInB1c2giLCJzZXRJbnRlbnRCYXNlZE5hdmlnYXRpb25FbmFibGVtZW50IiwiZGlzYWJsZUFjdGlvbiIsImNvbnRyb2wiLCJjcmVhdGVFbmFibGVtZW50IiwicGFyZW50Q29udGV4dCIsIl91cGRhdGVDcmVhdGVFbmFibGVtZW50Iiwibm9kZVR5cGUiLCJ1cGRhdGVDdXRDb3B5UGFzdGVFbmFibGVtZW50IiwidXBkYXRlTW92ZVVwRG93bkVuYWJsZW1lbnQiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudCIsInNlbGVjdGVkQ29udGV4dCIsInJlYWRPbmx5RHJhZnRFbmFibGVkIiwiY29udGV4dERhdGEiLCJ1cGRhdGFibGVCeVBhdGgiLCJub3REcmFmdEluUmVhZE9ubHlNb2RlIiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsImNoZWNrSWZOb2RlSXNNb3ZhYmxlIiwibm9kZSIsImlzTm9kZU1vdmFibGVGdW5jdGlvbiIsImdldFRhYmxlRGVmaW5pdGlvbiIsImlzTm9kZU1vdmFibGUiLCJub2RlTW92YWJsZUN1c3RvbUZ1bmN0aW9uIiwiRlBNSGVscGVyIiwiZ2V0Q3VzdG9tRnVuY3Rpb24iLCJtb2R1bGVOYW1lIiwibWV0aG9kTmFtZSIsIndhcm5pbmciLCJjaGVja0lmTm9kZUlzQ29weWFibGUiLCJpc05vZGVDb3B5YWJsZUZ1bmN0aW9uIiwiaXNOb2RlQ29weWFibGUiLCJtb2RlbE9iamVjdCIsImZvckNvbnRleHRNZW51IiwiYXJndW1lbnRzIiwiY29udGV4dG1lbnUiLCJ0eXBlIiwidmlldyIsImdldFRhcmdldFZpZXciLCJpc1ZpZXdFZGl0YWJsZSIsImdldElzRWRpdGFibGUiLCJnZXRDb250cm9sbGVyTmFtZSIsImNoZWNrRHJhZnRJbnN0YW5jZSIsImdldFJvd0JpbmRpbmciLCJpc1JlbGF0aXZlIiwicGFzdGFibGVDb250ZXh0cyIsImdldEFsbEN1cnJlbnRDb250ZXh0cyIsImNvbnRleHQiLCJtYXAiLCJwYXN0YWJsZUNvbnRleHQiLCJnZXRQYXRoIiwiaW5jbHVkZXMiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiUmVzb3VyY2VNb2RlbEhlbHBlciIsImdldFJlc291cmNlTW9kZWwiLCJnZXRUZXh0IiwiY29weUN1dFBhc3RlRW5hYmxlbWVudEluZm8iLCJkYXRhTW9kZWxzcmMiLCJjdXRhYmxlQ29udGV4dHMiLCJjb3B5YWJsZUNvbnRleHRzIiwiY3V0RW5hYmxlbWVudCIsImNvcHlFbmFibGVtZW50IiwibGFzdEFjdGlvbiIsInBhc3RlRW5hYmxlbWVudCIsImNvbnRleHRzZm9yUGFzdGFibGVFbmFibGVtZW50IiwiZXh0ZW5zaW9uUG9pbnQiLCJpc01vdmVUb1Bvc2l0aW9uQWxsb3dlZCIsImlzQ29weVRvUG9zaXRpb25BbGxvd2VkIiwidGFyZ2V0Q29udGV4dCIsIm1vZGVsT2JqZWN0UGF0aCIsImNoYW5nZVNpYmxpbmdGb3JSb290c1N1cHBvcnRlZCIsInNpbmdsZUNvbnRleHRNb3ZhYmxlVXAiLCJzaW5nbGVDb250ZXh0TW92YWJsZURvd24iLCJtb3ZlZENvbnRleHQiLCJtb3ZhYmxlRHJhZnQiLCJvdXRPZlBsYWNlQ29udGV4dCIsImlzVHJhbnNpZW50IiwiY3VzdG9tTW92YWJsZSIsImlzRGVsZXRlZCIsImdldFNpYmxpbmciLCJpbnRlcm5hbENvbnRleHQiLCJjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2siLCJub2RlVHlwZVBhcmFtZXRlcnMiLCJwb3NzaWJsZVZhbHVlcyIsInZhbHVlcyIsIm9wdGlvbiIsInZhbHVlIiwiZW5hYmxlbWVudEZ1bmN0aW9uIiwiZW5hYmxlZEZsYWdzIiwiX2Vycm9yIiwiZW5hYmxlbWVudE1hcCIsInNvbWUiLCJmbGFnIiwiZm9yRWFjaCIsImluZGV4IiwiY29udGV4dFBhdGgiLCJjbGVhclNlbGVjdGlvbiIsImludGVybmFsTW9kZWxDb250ZXh0Iiwic0FjdGlvbiIsImJFbmFibGVkIiwib25GaWVsZENoYW5nZUluQ3JlYXRpb25Sb3ciLCJvRXZlbnQiLCJ3aXRoQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwibUZpZWxkIiwiRmllbGRSdW50aW1lSGVscGVyIiwiZ2V0RmllbGRTdGF0ZU9uQ2hhbmdlIiwib1NvdXJjZUZpZWxkIiwiZmllbGQiLCJzRmllbGRJZCIsIm1GaWVsZFZhbGlkaXR5IiwibU5ld0ZpZWxkVmFsaWRpdHkiLCJzdGF0ZSIsIm1DdXN0b21WYWxpZGl0eSIsIm1OZXdDdXN0b21WYWxpZGl0eSIsImdldEJpbmRpbmciLCJmaWVsZElkIiwic1RhcmdldCIsImdldEJpbmRpbmdQYXRoIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsIm9NZXNzYWdlIiwiZ2V0VGFyZ2V0cyIsInJlbW92ZU1lc3NhZ2VzIiwib25UcmVlVGFibGVDb250ZXh0Q2hhbmdlZCIsImluaXRpYWxFeHBhbnNpb25MZXZlbCIsInJvd0JpbmRpbmciLCJnZXRDb250ZXh0IiwiZ2V0SWdub3JlQ29udGV4dENoYW5nZUV2ZW50IiwiYWdncmVnYXRpb24iLCJmaWx0ZXJJbmZvIiwiVGFibGVVdGlscyIsImdldEFsbEZpbHRlckluZm8iLCJleHBhbmRUbyIsInNlYXJjaCIsIk51bWJlciIsIk1BWF9TQUZFX0lOVEVHRVIiLCJzZXRBZ2dyZWdhdGlvbiIsIm9uQ3JlYXRlTWVudUl0ZW1QcmVzcyIsInZhbHVlSW5kZXgiLCJtZGNUYWJsZSIsImdldE1kY1RhYmxlIiwiY3JlYXRpb25EYXRhIiwicHJvcGVydHlOYW1lIiwiY3JlYXRpb25QYXJhbWV0ZXJzIiwiY3JlYXRpb25Nb2RlIiwiY3JlYXRlIiwibW9kZSIsInRhYmxlSWQiLCJDcmVhdGlvbkRpYWxvZyIsImNyZWF0aW9uRGlhbG9nRmllbGRzIiwicmViaW5kIiwiZ2V0Q29udHJvbGxlciIsImVkaXRGbG93IiwiY3JlYXRlRG9jdW1lbnQiLCJjYXRjaCIsIm9uQ3JlYXRlQnV0dG9uUHJlc3MiLCJFeHRlcm5hbCIsIm91dGJvdW5kIiwiY3JlYXRpb25Sb3ciLCJjcmVhdGVBdEVuZCIsIk5ld1BhZ2UiLCJJbmxpbmUiLCJJbmxpbmVDcmVhdGlvblJvd3MiLCJjcmVhdGVFbXB0eVJvd3NBbmRGb2N1cyIsIm5hdmlnYXRpb25BdmFpbGFibGVNYXAiLCJzS2V5IiwiYUFwcGxpY2FibGUiLCJhTm90QXBwbGljYWJsZSIsImJFbmFibGVkRm9yQ29udGV4dE1lbnUiLCJhQXBwbGljYWJsZUZvckNvbnRleHRNZW51IiwiYU5vdEFwcGxpY2FibGVGb3JDb250ZXh0TWVudSIsInNQcm9wZXJ0eSIsImVuYWJsZWRQcm9wZXJ0eSIsImFwcGxpY2FibGVQcm9wZXJ0eSIsIm5vdEFwcGxpY2FibGVQcm9wZXJ0eSIsIm9uQ29udGV4dE1lbnVJdGVtU2VsZWN0ZWQiLCJzZXRDb250ZXh0TWVudUFjdGl2ZSIsInNldFRpbWVvdXQiLCJkYXRhU3RhdGVJbmRpY2F0b3JGaWx0ZXIiLCJtZXNzYWdlIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJUYWJsZVJ1bnRpbWUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcInNhcC9mZS9jb3JlL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IENyZWF0ZUJlaGF2aW9yRXh0ZXJuYWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vVGFibGVcIjtcbmltcG9ydCBkZWxldGVIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRGVsZXRlSGVscGVyXCI7XG5pbXBvcnQgRlBNSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0ZQTUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IFRhYmxlVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVXRpbHNcIjtcbmltcG9ydCB0eXBlIE1lbnVJdGVtIGZyb20gXCJzYXAvbS9NZW51SXRlbVwiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgdHlwZSBVSTVFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkJENoYW5nZUV2ZW50IH0gZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBNRENUYWJsZSwgZGVmYXVsdCBhcyBUYWJsZSB9IGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBBY3Rpb25Ub29sYmFyQWN0aW9uIGZyb20gXCJzYXAvdWkvbWRjL2FjdGlvbnRvb2xiYXIvQWN0aW9uVG9vbGJhckFjdGlvblwiO1xuaW1wb3J0IHR5cGUgQ3JlYXRpb25Sb3cgZnJvbSBcInNhcC91aS9tZGMvdGFibGUvQ3JlYXRpb25Sb3dcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgRmllbGRSdW50aW1lSGVscGVyIGZyb20gXCIuLi9maWVsZC9GaWVsZFJ1bnRpbWVIZWxwZXJcIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZTtcbi8qKlxuICogU3RhdGljIGNsYXNzIHVzZWQgYnkgVGFibGUgYnVpbGRpbmcgYmxvY2sgZHVyaW5nIHJ1bnRpbWVcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IFRhYmxlUnVudGltZSA9IHtcblx0ZXhlY3V0ZUNvbmRpdGlvbmFsQWN0aW9uU2hvcnRjdXQ6IGZ1bmN0aW9uIChzQnV0dG9uTWF0Y2hlcjogc3RyaW5nLCBvU291cmNlOiBDb250cm9sKTogdm9pZCB7XG5cdFx0Ly8gR2V0IHRoZSBidXR0b24gcmVsYXRlZCB0byBrZXlib2FyZCBzaG9ydGN1dFxuXHRcdGNvbnN0IG9NZGNUYWJsZSA9IG9Tb3VyY2UuZ2V0UGFyZW50KCkgYXMgTURDVGFibGU7XG5cdFx0aWYgKHNCdXR0b25NYXRjaGVyICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cpIHtcblx0XHRcdGNvbnN0IG9CdXR0b24gPSBvTWRjVGFibGVcblx0XHRcdFx0LmdldEFjdGlvbnMoKVxuXHRcdFx0XHQucmVkdWNlKGZ1bmN0aW9uIChhQWN0aW9uQnV0dG9uczogQ29udHJvbFtdLCBvQWN0aW9uVG9vbGJhckFjdGlvbjogQ29udHJvbCkge1xuXHRcdFx0XHRcdHJldHVybiBhQWN0aW9uQnV0dG9ucy5jb25jYXQoKG9BY3Rpb25Ub29sYmFyQWN0aW9uIGFzIEFjdGlvblRvb2xiYXJBY3Rpb24pLmdldEFjdGlvbigpKTtcblx0XHRcdFx0fSwgW10gYXMgQ29udHJvbFtdKVxuXHRcdFx0XHQuZmluZChmdW5jdGlvbiAob0FjdGlvbkJ1dHRvbjogQ29udHJvbCkge1xuXHRcdFx0XHRcdHJldHVybiBvQWN0aW9uQnV0dG9uLmdldElkKCkuZW5kc1dpdGgoc0J1dHRvbk1hdGNoZXIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdENvbW1vblV0aWxzLmZpcmVCdXR0b25QcmVzcyhvQnV0dG9uKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93ID0gb01kY1RhYmxlLmdldEFnZ3JlZ2F0aW9uKFwiY3JlYXRpb25Sb3dcIikgYXMgQ3JlYXRpb25Sb3c7XG5cdFx0XHRpZiAob0NyZWF0aW9uUm93ICYmIG9DcmVhdGlvblJvdy5nZXRBcHBseUVuYWJsZWQoKSAmJiBvQ3JlYXRpb25Sb3cuZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRcdG9DcmVhdGlvblJvdy5maXJlQXBwbHkoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0c2V0Q29udGV4dHM6IGFzeW5jIGZ1bmN0aW9uIChldmVudDogVUk1RXZlbnQ8e30sIFRhYmxlPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IHRhYmxlID0gc291cmNlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0YWJsZSk7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IFRhYmxlUnVudGltZS5zZXRDb250ZXh0c0FzeW5jKHRhYmxlKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRhYmxlKTtcblx0XHR9XG5cdH0sXG5cblx0c2V0Q29udGV4dHNBc3luYzogYXN5bmMgZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSk6IFByb21pc2U8dm9pZFtdIHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gdGFibGUuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgdW5kZWZpbmVkIHwgT0RhdGFNZXRhTW9kZWw7XG5cdFx0Y29uc3QgdGFibGVBUEkgPSB0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRpZiAoIXRhYmxlQVBJIHx8ICFtZXRhTW9kZWwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgdGFibGVEZWZpbml0aW9uID0gdGFibGVBUEkudGFibGVEZWZpbml0aW9uO1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRpdHkgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuY29udmVydFR5cGVzKG1ldGFNb2RlbCkucmVzb2x2ZVBhdGg8RW50aXR5U2V0Pihcblx0XHRcdHRhYmxlRGVmaW5pdGlvbi5hbm5vdGF0aW9uLmNvbGxlY3Rpb25cblx0XHQpLnRhcmdldDtcblx0XHRjb25zdCBzVXBkYXRhYmxlUGF0aCA9IHRhYmxlRGVmaW5pdGlvbi5hbm5vdGF0aW9uLnVwZGF0YWJsZVByb3BlcnR5UGF0aDtcblxuXHRcdGNvbnN0IGFBY3Rpb25zTXVsdGlzZWxlY3REaXNhYmxlZCA9IHRhYmxlLmRhdGEoXCJhY3Rpb25zTXVsdGlzZWxlY3REaXNhYmxlZFwiKT8uc3BsaXQoXCIsXCIpID8/IFtdO1xuXHRcdGNvbnN0IG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAgPSBKU09OLnBhcnNlKHRhYmxlRGVmaW5pdGlvbi5vcGVyYXRpb25BdmFpbGFibGVNYXAgfHwgXCJ7fVwiKTtcblx0XHRjb25zdCBvTmF2aWdhdGlvbkF2YWlsYWJsZU1hcCA9IHRhYmxlLmRhdGEoXCJuYXZpZ2F0aW9uQXZhaWxhYmxlTWFwXCIpO1xuXG5cdFx0Y29uc3QgYVNlbGVjdGVkQ29udGV4dHMgPSB0YWJsZS5nZXRTZWxlY3RlZENvbnRleHRzKCkgYXMgQ29udGV4dFtdO1xuXHRcdGNvbnN0IGFEZWxldGFibGVDb250ZXh0czogQ29udGV4dFtdID0gW107XG5cdFx0Y29uc3QgYlJlYWRPbmx5RHJhZnRFbmFibGVkID1cblx0XHRcdHRhYmxlLmRhdGEoXCJkaXNwbGF5TW9kZVByb3BlcnR5QmluZGluZ1wiKSA9PT0gXCJ0cnVlXCIgJiYgISFjb2xsZWN0aW9uRW50aXR5Py5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Um9vdDtcblx0XHRjb25zdCBhVXBkYXRhYmxlQ29udGV4dHM6IENvbnRleHRbXSA9IFtdO1xuXHRcdC8vIG9EeW5hbWljQWN0aW9ucyBhcmUgYm91bmQgYWN0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgYWNjb3JkaW5nIHRvIHNvbWUgcHJvcGVydHlcblx0XHQvLyBpbiBlYWNoIGl0ZW1cblx0XHRjb25zdCBvRHluYW1pY0FjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgYkVuYWJsZWQ/OiBib29sZWFuIH0+IHwgdW5kZWZpbmVkID0ge307XG5cdFx0Y29uc3Qgb0lCTiA9IHt9O1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cblx0XHRpZiAoIW9JbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBmb3IgdGhlIGRlbGV0ZSB3ZSBjb25zaWRlciB0aGUgaW5hY3RpdmUgY29udGV4dHMgYXMgcG90ZW50aWFsbHkgcGFydCBvZiB0aGUgc2VsZWN0ZWQgY29udGV4dHNcblx0XHRkZWxldGVIZWxwZXIudXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMob0ludGVybmFsTW9kZWxDb250ZXh0LCBhU2VsZWN0ZWRDb250ZXh0cyk7XG5cblx0XHQvL2RvIG5vdCBjb25zaWRlciBlbXB0eSByb3dzIGFzIHNlbGVjdGVkIGNvbnRleHQsIGZvciB0aGUgb3RoZXIgYWN0aW9uc1xuXHRcdGNvbnN0IGFjdGl2ZVNlbGVjdGVkQ29udGV4dHMgPSBhU2VsZWN0ZWRDb250ZXh0cy5maWx0ZXIoZnVuY3Rpb24gKG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gIW9Db250ZXh0LmlzSW5hY3RpdmUoKTtcblx0XHR9KTtcblxuXHRcdGNvbnN0IG9Nb2RlbE9iamVjdCA9IE9iamVjdC5hc3NpZ24ob0ludGVybmFsTW9kZWxDb250ZXh0LmdldE9iamVjdCgpIHx8IHt9LCB7XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzOiBhY3RpdmVTZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0c2VsZWN0ZWRDb250ZXh0c0luY2x1ZGluZ0luYWN0aXZlOiBhU2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdG51bWJlck9mU2VsZWN0ZWRDb250ZXh0czogYWN0aXZlU2VsZWN0ZWRDb250ZXh0cy5sZW5ndGgsXG5cdFx0XHRkeW5hbWljQWN0aW9uczogb0R5bmFtaWNBY3Rpb25zLFxuXHRcdFx0aWJuOiBvSUJOLFxuXHRcdFx0ZGVsZXRlRW5hYmxlZDogdHJ1ZSxcblx0XHRcdGRlbGV0YWJsZUNvbnRleHRzOiBhRGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHR1blNhdmVkQ29udGV4dHM6IFtdLFxuXHRcdFx0bG9ja2VkQ29udGV4dHM6IFtdLFxuXHRcdFx0ZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZTogW10sXG5cdFx0XHRkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlOiBbXSxcblx0XHRcdGNvbnRyb2xJZDogXCJcIixcblx0XHRcdHVwZGF0YWJsZUNvbnRleHRzOiBhVXBkYXRhYmxlQ29udGV4dHMsXG5cdFx0XHRwYXN0ZUF1dGhvcml6ZWQ6IHRydWUsXG5cdFx0XHRwYXN0ZUZyb21Db3B5QXV0b3JpemVkOiB0cnVlLFxuXHRcdFx0c2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvcjogb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwic2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvclwiKVxuXHRcdFx0XHQ/IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcInNlbWFudGljS2V5SGFzRHJhZnRJbmRpY2F0b3JcIilcblx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHR9KTtcblx0XHRvTW9kZWxPYmplY3Qubm9kZVVwZGF0ZXNJbmZvID0gb01vZGVsT2JqZWN0Lm5vZGVVcGRhdGVzSW5mbyB8fCB7fTtcblxuXHRcdGZvciAoY29uc3Qgb1NlbGVjdGVkQ29udGV4dCBvZiBhY3RpdmVTZWxlY3RlZENvbnRleHRzKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gb0NvbnRleHREYXRhKSB7XG5cdFx0XHRcdGlmIChrZXkuaW5kZXhPZihcIiNcIikgPT09IDApIHtcblx0XHRcdFx0XHRsZXQgc0FjdGlvblBhdGg6IHN0cmluZyA9IGtleTtcblx0XHRcdFx0XHRzQWN0aW9uUGF0aCA9IHNBY3Rpb25QYXRoLnN1YnN0cmluZygxLCBzQWN0aW9uUGF0aC5sZW5ndGgpO1xuXHRcdFx0XHRcdG9Nb2RlbE9iamVjdC5keW5hbWljQWN0aW9uc1tzQWN0aW9uUGF0aF0gPSB7IGVuYWJsZWQ6IHRydWUgfTtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJcIiwgb01vZGVsT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuaXNVcGRhdGFibGVDb250ZXh0KHNVcGRhdGFibGVQYXRoLCBvU2VsZWN0ZWRDb250ZXh0LCBiUmVhZE9ubHlEcmFmdEVuYWJsZWQpKSB7XG5cdFx0XHRcdGFVcGRhdGFibGVDb250ZXh0cy5wdXNoKG9TZWxlY3RlZENvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghdGFibGUuZGF0YShcImVuYWJsZUFuYWx5dGljc1wiKSkge1xuXHRcdFx0VGFibGVSdW50aW1lLnNldEludGVudEJhc2VkTmF2aWdhdGlvbkVuYWJsZW1lbnQob0ludGVybmFsTW9kZWxDb250ZXh0LCBvTmF2aWdhdGlvbkF2YWlsYWJsZU1hcCwgYWN0aXZlU2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFjdGl2ZVNlbGVjdGVkQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0dGhpcy5kaXNhYmxlQWN0aW9uKGFBY3Rpb25zTXVsdGlzZWxlY3REaXNhYmxlZCwgb0R5bmFtaWNBY3Rpb25zKTtcblx0XHR9XG5cblx0XHRpZiAob01vZGVsT2JqZWN0KSB7XG5cdFx0XHRvTW9kZWxPYmplY3RbXCJ1cGRhdGFibGVDb250ZXh0c1wiXSA9IGFVcGRhdGFibGVDb250ZXh0cztcblx0XHRcdG9Nb2RlbE9iamVjdFtcImNvbnRyb2xJZFwiXSA9IHRhYmxlLmdldElkKCk7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJcIiwgb01vZGVsT2JqZWN0KTtcblx0XHR9XG5cblx0XHQvLyBNYW5hZ2UgYSBwb3RlbnRpYWwgY2FsbGJhY2sgdG8gZW5hYmxlL2Rpc2FibGUgdGhlIGNyZWF0ZSBidXR0b24vbWVudSBmb3IgYSBUcmVlVGFibGVcblx0XHRpZiAoYWN0aXZlU2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPD0gMSAmJiB0YWJsZURlZmluaXRpb24uY29udHJvbC5jcmVhdGVFbmFibGVtZW50KSB7XG5cdFx0XHRjb25zdCBwYXJlbnRDb250ZXh0ID0gYWN0aXZlU2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPyBhY3RpdmVTZWxlY3RlZENvbnRleHRzWzBdIDogbnVsbDtcblx0XHRcdHRoaXMuX3VwZGF0ZUNyZWF0ZUVuYWJsZW1lbnQoXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0dGFibGVEZWZpbml0aW9uLmNvbnRyb2wuY3JlYXRlRW5hYmxlbWVudCxcblx0XHRcdFx0dGFibGUsXG5cdFx0XHRcdHBhcmVudENvbnRleHQsXG5cdFx0XHRcdHRhYmxlRGVmaW5pdGlvbi5jb250cm9sLm5vZGVUeXBlXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlQ3V0Q29weVBhc3RlRW5hYmxlbWVudChvTW9kZWxPYmplY3QsIHRhYmxlKTtcblx0XHR0aGlzLnVwZGF0ZU1vdmVVcERvd25FbmFibGVtZW50KG9Nb2RlbE9iamVjdCwgdGFibGUpO1xuXHRcdHJldHVybiBBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQob0ludGVybmFsTW9kZWxDb250ZXh0LCBvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBhY3RpdmVTZWxlY3RlZENvbnRleHRzLCBcInRhYmxlXCIpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVja3MsIGlmIHRoZSBzZWxlY3RlZCBjb250ZXh0IGlzIHVwZGF0YWJsZSBmb3IgTWFzcyBFZGl0LlxuXHQgKiBAcGFyYW0gdXBkYXRhYmxlUHJvcGVydHlQYXRoIFRoZSB1cGRhdGFibGVQcm9wZXJ0eVBhdGggZnJvbSB0aGUgdGFibGUgYW5ub3RhdGlvblxuXHQgKiBAcGFyYW0gc2VsZWN0ZWRDb250ZXh0IFRoZSBzZWxlY3RlZCBjb250ZXh0XG5cdCAqIEBwYXJhbSByZWFkT25seURyYWZ0RW5hYmxlZCBJbmRpY2F0ZXMsIGlmIHRoZSB0YWJsZSBpcyByZWFkIG9ubHkgYW5kIGRyYWZ0IGVuYWJsZWRcblx0ICogQHJldHVybnMgQm9vbGVhbiBJbmRpY2F0aW5nIGNvbnRleHQgaXMgdXBkYXRhYmxlXG5cdCAqL1xuXHRpc1VwZGF0YWJsZUNvbnRleHQ6IGZ1bmN0aW9uICh1cGRhdGFibGVQcm9wZXJ0eVBhdGg6IHN0cmluZywgc2VsZWN0ZWRDb250ZXh0OiBDb250ZXh0LCByZWFkT25seURyYWZ0RW5hYmxlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xuXHRcdC8qIFRoZSB1cGRhdGFibGUgY29udGV4dHMgd2l0aCBtYXNzIGVkaXQgZGVwZW5kIG9uIHRoZSBmb2xsb3dpbmc6XG5cdFx0IFx0MS4gVXBkYXRlIGlzIGRlcGVuZGVudCBvbiBjdXJyZW50IGVudGl0eSBwcm9wZXJ0eSAodXBkYXRhYmxlUGF0aCkuXG5cdFx0IFx0Mi4gVGhlIHRhYmxlIGlzIHJlYWQgb25seSBhbmQgZHJhZnQgZW5hYmxlZCAobGlrZSBMUiksIGluIHRoaXMgY2FzZSBvbmx5IGFjdGl2ZSBjb250ZXh0cyBjYW4gYmUgbWFzcyBlZGl0ZWQgKG5vdCBkcmFmdCBjb250ZXh0cykuXG5cdFx0ICAgIFNvLCB1cGRhdGUgZGVwZW5kcyBvbiAnSXNBY3RpdmVFbnRpdHknLCAnSGFzRHJhZnRFbnRpdHknICB2YWx1ZSB3aGljaCBuZWVkcyB0byBiZSBjaGVja2VkLiAqL1xuXHRcdGNvbnN0IGNvbnRleHREYXRhID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdGNvbnN0IHVwZGF0YWJsZUJ5UGF0aCA9IHVwZGF0YWJsZVByb3BlcnR5UGF0aC5sZW5ndGggPT09IDAgfHwgISFzZWxlY3RlZENvbnRleHQuZ2V0UHJvcGVydHkodXBkYXRhYmxlUHJvcGVydHlQYXRoKTtcblx0XHRjb25zdCBub3REcmFmdEluUmVhZE9ubHlNb2RlID0gIXJlYWRPbmx5RHJhZnRFbmFibGVkIHx8IChjb250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiAhY29udGV4dERhdGEuSGFzRHJhZnRFbnRpdHkpO1xuXHRcdGlmICh1cGRhdGFibGVCeVBhdGggJiYgbm90RHJhZnRJblJlYWRPbmx5TW9kZSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBub2RlIGlzIG1vdmFibGUgYWNjb3JkaW5nIHRvIHRoZSBjdXN0b20gbG9naWMgKGlmIGFueSkuXG5cdCAqIEBwYXJhbSBub2RlXG5cdCAqIEBwYXJhbSB0YWJsZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjdXN0b20gbG9naWMgYWxsb3dzIHRoZSBub2RlIHRvIGJlIG1vdmVkIChvciBpZiB0aGVyZSdzIG5vIGN1c3RvbSBsb2dpYyksIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0Y2hlY2tJZk5vZGVJc01vdmFibGU6IGZ1bmN0aW9uIChub2RlOiBDb250ZXh0LCB0YWJsZTogVGFibGUpOiBib29sZWFuIHtcblx0XHRjb25zdCBpc05vZGVNb3ZhYmxlRnVuY3Rpb24gPSAodGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkpLmdldFRhYmxlRGVmaW5pdGlvbigpLmNvbnRyb2wuaXNOb2RlTW92YWJsZTtcblx0XHRjb25zdCBub2RlTW92YWJsZUN1c3RvbUZ1bmN0aW9uID0gaXNOb2RlTW92YWJsZUZ1bmN0aW9uXG5cdFx0XHQ/IEZQTUhlbHBlci5nZXRDdXN0b21GdW5jdGlvbjwoY29udGV4dDogQ29udGV4dCkgPT4gYm9vbGVhbj4oXG5cdFx0XHRcdFx0aXNOb2RlTW92YWJsZUZ1bmN0aW9uLm1vZHVsZU5hbWUsXG5cdFx0XHRcdFx0aXNOb2RlTW92YWJsZUZ1bmN0aW9uLm1ldGhvZE5hbWUsXG5cdFx0XHRcdFx0dGFibGVcblx0XHRcdCAgKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIG5vZGVNb3ZhYmxlQ3VzdG9tRnVuY3Rpb24gPT09IHVuZGVmaW5lZCB8fCBub2RlTW92YWJsZUN1c3RvbUZ1bmN0aW9uKG5vZGUpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cud2FybmluZyhgRXJyb3IgaW4gY3VzdG9tIGZ1bmN0aW9uIGZvciBpc05vZGVNb3ZhYmxlOiAke2Vycm9yfWApO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVja3Mgd2hldGhlciB0aGUgbm9kZSBjYW4gYmUgY29waWVkIGFjY29yZGluZyB0byB0aGUgY3VzdG9tIGxvZ2ljLCBpZiBhbnkuXG5cdCAqIEBwYXJhbSBub2RlXG5cdCAqIEBwYXJhbSB0YWJsZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGN1c3RvbSBsb2dpYyBhbGxvd3MgdGhlIG5vZGUgdG8gYmUgY29waWVkIChvciBpZiBubyBjdXN0b20gbG9naWMgaXMgZGVmaW5lZCk7IGZhbHNlIG90aGVyd2lzZS5cblx0ICovXG5cdGNoZWNrSWZOb2RlSXNDb3B5YWJsZTogZnVuY3Rpb24gKG5vZGU6IENvbnRleHQsIHRhYmxlOiBUYWJsZSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGlzTm9kZUNvcHlhYmxlRnVuY3Rpb24gPSAodGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkpLmdldFRhYmxlRGVmaW5pdGlvbigpLmNvbnRyb2wuaXNOb2RlQ29weWFibGU7XG5cdFx0Y29uc3Qgbm9kZU1vdmFibGVDdXN0b21GdW5jdGlvbiA9IGlzTm9kZUNvcHlhYmxlRnVuY3Rpb25cblx0XHRcdD8gRlBNSGVscGVyLmdldEN1c3RvbUZ1bmN0aW9uPChjb250ZXh0OiBDb250ZXh0KSA9PiBib29sZWFuPihcblx0XHRcdFx0XHRpc05vZGVDb3B5YWJsZUZ1bmN0aW9uLm1vZHVsZU5hbWUsXG5cdFx0XHRcdFx0aXNOb2RlQ29weWFibGVGdW5jdGlvbi5tZXRob2ROYW1lLFxuXHRcdFx0XHRcdHRhYmxlXG5cdFx0XHQgIClcblx0XHRcdDogdW5kZWZpbmVkO1xuXG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBub2RlTW92YWJsZUN1c3RvbUZ1bmN0aW9uID09PSB1bmRlZmluZWQgfHwgbm9kZU1vdmFibGVDdXN0b21GdW5jdGlvbihub2RlKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLndhcm5pbmcoYEVycm9yIGluIGN1c3RvbSBmdW5jdGlvbiBmb3IgaXNOb2RlTW92YWJsZTogJHtlcnJvcn1gKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgaW50ZXJuYWwgY29udGV4dCB0byBlbmFibGUvZGlzYWJsZSB0aGUgQ3V0IGFuZCBQYXN0ZSBidXR0b25zLlxuXHQgKiBAcGFyYW0gbW9kZWxPYmplY3QgSW50ZXJuYWwgY29udGV4dCBvYmplY3Qgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSB0YWJsZSBJbnN0YW5jZSBvZiB0aGUgVGFibGVcblx0ICogQHBhcmFtIGZvckNvbnRleHRNZW51XG5cdCAqL1xuXHR1cGRhdGVDdXRDb3B5UGFzdGVFbmFibGVtZW50OiBmdW5jdGlvbiAobW9kZWxPYmplY3Q6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9LCB0YWJsZTogVGFibGUsIGZvckNvbnRleHRNZW51ID0gZmFsc2UpOiB2b2lkIHtcblx0XHRtb2RlbE9iamVjdC5jb250ZXh0bWVudSA9IG1vZGVsT2JqZWN0LmNvbnRleHRtZW51ID8/IHsgc2VsZWN0ZWRDb250ZXh0czogW10gfTtcblxuXHRcdGNvbnN0IHRhYmxlRGVmaW5pdGlvbiA9ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0VGFibGVEZWZpbml0aW9uKCk7XG5cdFx0aWYgKHRhYmxlRGVmaW5pdGlvbi5jb250cm9sLnR5cGUgIT09IFwiVHJlZVRhYmxlXCIpIHtcblx0XHRcdC8vIFRoZSBsb2dpYyBiZWxvdyBvbmx5IG1ha2VzIHNlbnNlIGZvciBhIFRyZWUgVGFibGVcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgdmlldyA9IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcodGFibGUpO1xuXHRcdGNvbnN0IGlzVmlld0VkaXRhYmxlID0gQ29tbW9uVXRpbHMuZ2V0SXNFZGl0YWJsZSh2aWV3KTtcblx0XHRpZiAodmlldy5nZXRDb250cm9sbGVyTmFtZSgpICE9PSBcInNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5MaXN0UmVwb3J0Q29udHJvbGxlclwiICYmICFpc1ZpZXdFZGl0YWJsZSkge1xuXHRcdFx0Ly8gSWYgdGhlIHZpZXcgaXMgbm90IGVkaXRhYmxlLCB3ZSBkaXNhYmxlIHRoZSBjdXQvY29weS9wYXN0ZSBmdW5jdGlvbmFsaXR5IGFuZCBjbGVhciB0aGUgbm9kZVVwZGF0ZXNJbmZvXG5cdFx0XHRtb2RlbE9iamVjdC5ub2RlVXBkYXRlc0luZm8gPSB7fTtcblx0XHRcdChtb2RlbE9iamVjdC5jb250ZXh0bWVudSBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkubm9kZVVwZGF0ZXNJbmZvID0ge307XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGNoZWNrRHJhZnRJbnN0YW5jZSA9ICF0YWJsZS5nZXRSb3dCaW5kaW5nKCkuaXNSZWxhdGl2ZSgpO1xuXG5cdFx0aWYgKGZvckNvbnRleHRNZW51KSB7XG5cdFx0XHQobW9kZWxPYmplY3QuY29udGV4dG1lbnUgYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pLm5vZGVVcGRhdGVzSW5mbyA9IHt9O1xuXHRcdH1cblx0XHRjb25zdCBub2RlVXBkYXRlc0luZm8gPSBtb2RlbE9iamVjdC5ub2RlVXBkYXRlc0luZm8gYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XG5cdFx0Ly9JZiB0aGUgcGFzdGFibGVDb250ZXh0IGJlY29tZSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgbGlzdEJpbmRpbmcsIGZvciBleGFtcGxlLCB3aGVuIHRoZSB1c2VyIGNvbGxhcHNlcyB0aGUgcGFyZW50IG5vZGUsIHdlIGF0dGVtcHQgdG8gbG9jYXRlIHRoZSBjb3JyZWN0IGNvbnRleHQgYnkgY29tcGFyaW5nIHRoZWlyIHBhdGhzXG5cdFx0Y29uc3QgcGFzdGFibGVDb250ZXh0czogQ29udGV4dFtdID0gdGFibGVcblx0XHRcdC5nZXRSb3dCaW5kaW5nKClcblx0XHRcdC5nZXRBbGxDdXJyZW50Q29udGV4dHMoKVxuXHRcdFx0LmZpbHRlcigoY29udGV4dCkgPT5cblx0XHRcdFx0KChub2RlVXBkYXRlc0luZm8ucGFzdGFibGVDb250ZXh0cyB8fCBbXSkgYXMgQ29udGV4dFtdKVxuXHRcdFx0XHRcdC5tYXAoKHBhc3RhYmxlQ29udGV4dCkgPT4gcGFzdGFibGVDb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdFx0XHQuaW5jbHVkZXMoY29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHQpO1xuXG5cdFx0aWYgKHBhc3RhYmxlQ29udGV4dHMubGVuZ3RoICE9PSAoKG5vZGVVcGRhdGVzSW5mby5wYXN0YWJsZUNvbnRleHRzIHx8IFtdKSBhcyBDb250ZXh0W10pLmxlbmd0aCkge1xuXHRcdFx0TWVzc2FnZVRvYXN0LnNob3coXCJcIiArIFJlc291cmNlTW9kZWxIZWxwZXIuZ2V0UmVzb3VyY2VNb2RlbCh0YWJsZSkuZ2V0VGV4dChcIk1fUEFTVEFCTEVfQ09OVEVYVFNfTk9UX0FWQUlMQUJMRVwiKSk7XG5cdFx0fVxuXHRcdGNvbnN0IGNvcHlDdXRQYXN0ZUVuYWJsZW1lbnRJbmZvID0gKCghZm9yQ29udGV4dE1lbnUgPyBtb2RlbE9iamVjdCA6IG1vZGVsT2JqZWN0LmNvbnRleHRtZW51KSBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSlcblx0XHRcdC5ub2RlVXBkYXRlc0luZm8gYXMge1xuXHRcdFx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0XHR9O1xuXHRcdGNvbnN0IGRhdGFNb2RlbHNyYyA9ICghZm9yQ29udGV4dE1lbnUgPyBtb2RlbE9iamVjdCA6IG1vZGVsT2JqZWN0LmNvbnRleHRtZW51KSBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfTtcblx0XHRjb25zdCBjdXRhYmxlQ29udGV4dHMgPSAoZGF0YU1vZGVsc3JjLnVwZGF0YWJsZUNvbnRleHRzIGFzIENvbnRleHRbXSkuZmlsdGVyKFxuXHRcdFx0KGNvbnRleHQpID0+XG5cdFx0XHRcdFRhYmxlUnVudGltZS5jaGVja0lmTm9kZUlzTW92YWJsZShjb250ZXh0LCB0YWJsZSkgJiYgKCFjaGVja0RyYWZ0SW5zdGFuY2UgfHwgY29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0RyYWZ0RW50aXR5XCIpICE9PSB0cnVlKVxuXHRcdCk7XG5cdFx0Y29uc3QgY29weWFibGVDb250ZXh0cyA9IChkYXRhTW9kZWxzcmMuc2VsZWN0ZWRDb250ZXh0cyBhcyBDb250ZXh0W10pLmZpbHRlcigoY29udGV4dCkgPT5cblx0XHRcdFRhYmxlUnVudGltZS5jaGVja0lmTm9kZUlzQ29weWFibGUoY29udGV4dCwgdGFibGUpXG5cdFx0KTtcblx0XHRjb25zdCBzZWxlY3RlZENvbnRleHRzID0gZGF0YU1vZGVsc3JjLnNlbGVjdGVkQ29udGV4dHMgYXMgQ29udGV4dFtdO1xuXHRcdGNvcHlDdXRQYXN0ZUVuYWJsZW1lbnRJbmZvLmN1dEVuYWJsZW1lbnQgPSBzZWxlY3RlZENvbnRleHRzLmxlbmd0aCA9PT0gMSAmJiBjdXRhYmxlQ29udGV4dHMubGVuZ3RoID09PSAxO1xuXHRcdGNvcHlDdXRQYXN0ZUVuYWJsZW1lbnRJbmZvLmNvcHlFbmFibGVtZW50ID0gc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPT09IDEgJiYgY29weWFibGVDb250ZXh0cy5sZW5ndGggPT09IDE7XG5cblx0XHRpZiAobm9kZVVwZGF0ZXNJbmZvLmxhc3RBY3Rpb24pIHtcblx0XHRcdGlmIChwYXN0YWJsZUNvbnRleHRzPy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Y29weUN1dFBhc3RlRW5hYmxlbWVudEluZm8ucGFzdGVFbmFibGVtZW50ID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBjb250ZXh0c2ZvclBhc3RhYmxlRW5hYmxlbWVudDogQ29udGV4dFtdO1xuXHRcdFx0Y29uc3QgZXh0ZW5zaW9uUG9pbnQgPVxuXHRcdFx0XHRub2RlVXBkYXRlc0luZm8ubGFzdEFjdGlvbiA9PT0gXCJDdXRcIlxuXHRcdFx0XHRcdD8gdGFibGVEZWZpbml0aW9uLmNvbnRyb2wuaXNNb3ZlVG9Qb3NpdGlvbkFsbG93ZWRcblx0XHRcdFx0XHQ6IHRhYmxlRGVmaW5pdGlvbi5jb250cm9sLmlzQ29weVRvUG9zaXRpb25BbGxvd2VkO1xuXG5cdFx0XHQvL3JlbW92ZSBjb250ZXh0cyBkZXBlbmRpbmcgb2YgdGhlIGN1c3RvbSBmdW5jdGlvblxuXHRcdFx0aWYgKGV4dGVuc2lvblBvaW50KSB7XG5cdFx0XHRcdGNvbnRleHRzZm9yUGFzdGFibGVFbmFibGVtZW50ID0gWy4uLnNlbGVjdGVkQ29udGV4dHNdLmZpbHRlcihcblx0XHRcdFx0XHQodGFyZ2V0Q29udGV4dCkgPT5cblx0XHRcdFx0XHRcdChcblx0XHRcdFx0XHRcdFx0RlBNSGVscGVyLmdldEN1c3RvbUZ1bmN0aW9uPChjb250ZXh0czogQ29udGV4dFtdKSA9PiBib29sZWFuPihcblx0XHRcdFx0XHRcdFx0XHRleHRlbnNpb25Qb2ludC5tb2R1bGVOYW1lLFxuXHRcdFx0XHRcdFx0XHRcdGV4dGVuc2lvblBvaW50Lm1ldGhvZE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0dGFibGVcblx0XHRcdFx0XHRcdFx0KSBhcyBGdW5jdGlvblxuXHRcdFx0XHRcdFx0KShwYXN0YWJsZUNvbnRleHRzWzBdLCB0YXJnZXRDb250ZXh0KSAvL25vZGVVcGRhdGVzSW5mby5wYXN0YWJsZUNvbnRleHRzIGhhcyBiZWVuIHRoZSBsYXN0IHRpbWUgdGhlIHVzZXIgcHJlc3NlZCB0aGUgY3V0L2NvcHkgYnV0dG9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb250ZXh0c2ZvclBhc3RhYmxlRW5hYmxlbWVudCA9IFsuLi5zZWxlY3RlZENvbnRleHRzXTtcblx0XHRcdH1cblxuXHRcdFx0Ly90aGUgcGFzdGUgY2Fubm90IGJlIGRvbmUgaWYgc2V2ZXJhbCBjb250ZXh0cyBhcmUgc2VsZWN0ZWRcblx0XHRcdGNvcHlDdXRQYXN0ZUVuYWJsZW1lbnRJbmZvLnBhc3RlRW5hYmxlbWVudCA9XG5cdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMubGVuZ3RoIDw9IDEgJiYgY29udGV4dHNmb3JQYXN0YWJsZUVuYWJsZW1lbnQubGVuZ3RoID09PSBzZWxlY3RlZENvbnRleHRzLmxlbmd0aDtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqICBVcGRhdGVzIHRoZSBpbnRlcm5hbCBjb250ZXh0IHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBtb3ZlIHVwL21vdmUgZG93biBidXR0b25zLlxuXHQgKiBAcGFyYW0gbW9kZWxPYmplY3Rcblx0ICogQHBhcmFtIHRhYmxlXG5cdCAqIEBwYXJhbSBmb3JDb250ZXh0TWVudVxuXHQgKi9cblx0dXBkYXRlTW92ZVVwRG93bkVuYWJsZW1lbnQ6IGZ1bmN0aW9uIChtb2RlbE9iamVjdDogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0sIHRhYmxlOiBUYWJsZSwgZm9yQ29udGV4dE1lbnUgPSBmYWxzZSk6IHZvaWQge1xuXHRcdGNvbnN0IG1vZGVsT2JqZWN0UGF0aCA9ICFmb3JDb250ZXh0TWVudSA/IG1vZGVsT2JqZWN0IDogKG1vZGVsT2JqZWN0LmNvbnRleHRtZW51IGFzIHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KTtcblx0XHRjb25zdCBzZWxlY3RlZENvbnRleHRzID0gbW9kZWxPYmplY3RQYXRoLnNlbGVjdGVkQ29udGV4dHMgYXMgQ29udGV4dFtdO1xuXHRcdGNvbnN0IHRhYmxlRGVmaW5pdGlvbiA9ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0VGFibGVEZWZpbml0aW9uKCk7XG5cblx0XHRjb25zdCBjaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQgPSB0YWJsZURlZmluaXRpb24uYW5ub3RhdGlvbi5jaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQ7XG5cdFx0Ly8gRGlzYWJsZSB0aGUgbW92ZSB1cC9tb3ZlIGRvd24gYnV0dG9ucyBpZiB0aGVyZSBhcmUgbm8gc2VsZWN0ZWQgY29udGV4dHMsIGlmIHRoZSB0YWJsZSBpcyBub3QgYSBUcmVlVGFibGUsIG9yIGlmIHRoZSB0YWJsZSBpcyBzb3J0ZWRcblx0XHRpZiAoXG5cdFx0XHRzZWxlY3RlZENvbnRleHRzLmxlbmd0aCAhPT0gMSB8fFxuXHRcdFx0dGFibGVEZWZpbml0aW9uLmNvbnRyb2wudHlwZSAhPT0gXCJUcmVlVGFibGVcIiB8fFxuXHRcdFx0dGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJpc1NvcnRlZFwiKSA9PT0gdHJ1ZSB8fFxuXHRcdFx0KHNlbGVjdGVkQ29udGV4dHNbMF0uZ2V0UHJvcGVydHkoXCJAJHVpNS5ub2RlLmxldmVsXCIpID09PSAxICYmICFjaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQpIC8vIERpc2FibGUgbW92ZSB1cC9kb3duIGZvciByb290c1xuXHRcdCkge1xuXHRcdFx0bW9kZWxPYmplY3RQYXRoLnNpbmdsZUNvbnRleHRNb3ZhYmxlVXAgPSBmYWxzZTtcblx0XHRcdG1vZGVsT2JqZWN0UGF0aC5zaW5nbGVDb250ZXh0TW92YWJsZURvd24gPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgbW92ZWRDb250ZXh0ID0gc2VsZWN0ZWRDb250ZXh0c1swXTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIHNlbGVjdGVkIGNvbnRleHQgY2FuIGJlIG1vdmVkIGFjY29yZGluZyB0byB0aGUgY3VzdG9tIGxvZ2ljIChpZiBhbnkpIGFuZCBpZiBpdCBkb2Vzbid0IGhhdmUgYSBkcmFmdCBpbnN0YW5jZSBpZiB3ZSdyZSBpbiBhIExpc3RSZXBvcnQsXG5cdFx0XHQvLyBhbmQgaWYgaXQncyBub3Qgb3V0LW9mLXBsYWNlIChpLmUuIGl0IG11c3QgYmUgZGlzcGxheWVkIGF0IGl0cyAncmVhbCcgcG9zaXRpb24pXG5cdFx0XHRjb25zdCBtb3ZhYmxlRHJhZnQgPSB0YWJsZS5nZXRSb3dCaW5kaW5nKCkuaXNSZWxhdGl2ZSgpIHx8IG1vdmVkQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0RyYWZ0RW50aXR5XCIpICE9PSB0cnVlO1xuXHRcdFx0Y29uc3Qgb3V0T2ZQbGFjZUNvbnRleHQgPSBtb3ZlZENvbnRleHQuaXNUcmFuc2llbnQoKSAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgY3VzdG9tTW92YWJsZSA9IFRhYmxlUnVudGltZS5jaGVja0lmTm9kZUlzTW92YWJsZShtb3ZlZENvbnRleHQsIHRhYmxlKTtcblx0XHRcdG1vZGVsT2JqZWN0UGF0aC5zaW5nbGVDb250ZXh0TW92YWJsZVVwID1cblx0XHRcdFx0bW92YWJsZURyYWZ0ICYmIGN1c3RvbU1vdmFibGUgJiYgIW91dE9mUGxhY2VDb250ZXh0ICYmICFtb3ZlZENvbnRleHQuaXNEZWxldGVkKCkgJiYgbW92ZWRDb250ZXh0LmdldFNpYmxpbmcoLTEpICE9PSBudWxsO1xuXHRcdFx0bW9kZWxPYmplY3RQYXRoLnNpbmdsZUNvbnRleHRNb3ZhYmxlRG93biA9XG5cdFx0XHRcdG1vdmFibGVEcmFmdCAmJiBjdXN0b21Nb3ZhYmxlICYmICFvdXRPZlBsYWNlQ29udGV4dCAmJiAhbW92ZWRDb250ZXh0LmlzRGVsZXRlZCgpICYmIG1vdmVkQ29udGV4dC5nZXRTaWJsaW5nKDEpICE9PSBudWxsO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgaW50ZXJuYWwgY29udGV4dCB0byBlbmFibGUvZGlzYWJsZSB0aGUgQ3JlYXRlIGJ1dHRvbiAvIG1lbnUgLyBtZW51IGl0ZW1zLlxuXHQgKiBAcGFyYW0gaW50ZXJuYWxDb250ZXh0XG5cdCAqIEBwYXJhbSBjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2tcblx0ICogQHBhcmFtIGNyZWF0ZUVuYWJsZW1lbnRDYWxsYmFjay5tb2R1bGVOYW1lXG5cdCAqIEBwYXJhbSBjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2subWV0aG9kTmFtZVxuXHQgKiBAcGFyYW0gdGFibGVcblx0ICogQHBhcmFtIHBhcmVudENvbnRleHRcblx0ICogQHBhcmFtIG5vZGVUeXBlUGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gbm9kZVR5cGVQYXJhbWV0ZXJzLnByb3BlcnR5TmFtZVxuXHQgKiBAcGFyYW0gbm9kZVR5cGVQYXJhbWV0ZXJzLnZhbHVlc1xuXHQgKiBAcGFyYW0gZm9yQ29udGV4dE1lbnVcblx0ICovXG5cdF91cGRhdGVDcmVhdGVFbmFibGVtZW50OiBmdW5jdGlvbiAoXG5cdFx0aW50ZXJuYWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2s6IHsgbW9kdWxlTmFtZTogc3RyaW5nOyBtZXRob2ROYW1lOiBzdHJpbmcgfSxcblx0XHR0YWJsZTogVGFibGUsXG5cdFx0cGFyZW50Q29udGV4dDogQ29udGV4dCB8IG51bGwsXG5cdFx0bm9kZVR5cGVQYXJhbWV0ZXJzPzogeyBwcm9wZXJ0eU5hbWU6IHN0cmluZzsgdmFsdWVzOiB7IHZhbHVlOiBzdHJpbmcgfVtdIH0sXG5cdFx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuXHQpOiB2b2lkIHtcblx0XHRsZXQgcG9zc2libGVWYWx1ZXM6IChzdHJpbmcgfCB1bmRlZmluZWQpW107XG5cdFx0aWYgKG5vZGVUeXBlUGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBQdXNoIGFsbCBwb3NzaWJsZSB2YWx1ZXMgaW4gdGhlIG1lbnVcblx0XHRcdHBvc3NpYmxlVmFsdWVzID0gbm9kZVR5cGVQYXJhbWV0ZXJzLnZhbHVlcy5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gbWVudSAtLT4gT25seSAndW5kZWZpbmVkJyB2YWx1ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSAnQ3JlYXRlJyBidXR0b25cblx0XHRcdHBvc3NpYmxlVmFsdWVzID0gW3VuZGVmaW5lZF07XG5cdFx0fVxuXG5cdFx0Y29uc3QgZW5hYmxlbWVudEZ1bmN0aW9uID0gRlBNSGVscGVyLmdldEN1c3RvbUZ1bmN0aW9uPChub2RlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBwYXJlbnRDb250ZXh0OiBDb250ZXh0IHwgbnVsbCkgPT4gYm9vbGVhbj4oXG5cdFx0XHRjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2subW9kdWxlTmFtZSxcblx0XHRcdGNyZWF0ZUVuYWJsZW1lbnRDYWxsYmFjay5tZXRob2ROYW1lLFxuXHRcdFx0dGFibGVcblx0XHQpO1xuXG5cdFx0aWYgKCFlbmFibGVtZW50RnVuY3Rpb24pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZW5hYmxlZEZsYWdzID0gcG9zc2libGVWYWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuXHRcdFx0bGV0IGVuYWJsZWQgPSBmYWxzZTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGVuYWJsZWQgPSAhIShlbmFibGVtZW50RnVuY3Rpb24odmFsdWUsIHBhcmVudENvbnRleHQpID8/IHRydWUpO1xuXHRcdFx0fSBjYXRjaCAoX2Vycm9yKSB7XG5cdFx0XHRcdGVuYWJsZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGVuYWJsZWQ7XG5cdFx0fSk7XG5cdFx0Ly8gZW5hYmxlRmxhZ3NbaV0gaXMgdHJ1ZSA8PT4gcG9zc2libGVWYWx1ZXNbaV0gaXMgYWxsb3dlZCBmb3IgY3JlYXRpb25cblxuXHRcdGNvbnN0IGVuYWJsZW1lbnRNYXA6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cdFx0ZW5hYmxlbWVudE1hcFtcIkNyZWF0ZVwiXSA9IGVuYWJsZWRGbGFncy5zb21lKChmbGFnKSA9PiBmbGFnKTsgLy8gRW5hYmxlIHRoZSBNZW51IChvciB0aGUgYnV0dG9uKSBpZiBhdCBsZWFzdCBvbmUgb3B0aW9uIGlzIHBvc3NpYmxlXG5cdFx0ZW5hYmxlZEZsYWdzLmZvckVhY2goKGVuYWJsZWQsIGluZGV4KSA9PiB7XG5cdFx0XHRlbmFibGVtZW50TWFwW2BDcmVhdGVfJHtpbmRleH1gXSA9IGVuYWJsZWQ7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBjb250ZXh0UGF0aCA9IGZvckNvbnRleHRNZW51ID8gXCJjb250ZXh0bWVudS9cIiA6IFwiXCI7XG5cdFx0aW50ZXJuYWxDb250ZXh0LnNldFByb3BlcnR5KGNvbnRleHRQYXRoICsgXCJjcmVhdGVFbmFibGVtZW50XCIsIGVuYWJsZW1lbnRNYXApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDbGVhcnMgdGhlIHRhYmxlIHNlbGVjdGlvbiwgYW5kIGVuYWJsZXMvZGlzYWJsZXMgdGhlICdDcmVhdGUnIGJ1dHRvbi9tZW51IGlmIG5lY2Vzc2FyeS5cblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZVxuXHQgKi9cblx0Y2xlYXJTZWxlY3Rpb246IGZ1bmN0aW9uICh0YWJsZTogVGFibGUpOiB2b2lkIHtcblx0XHQvLyBDbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb250cm9sXG5cdFx0dGFibGUuY2xlYXJTZWxlY3Rpb24oKTtcblxuXHRcdC8vIFVwZGF0ZSB0aGUgc2VsZWN0aW9uLXJlbGF0ZWQgaW5mb3JtYXRpb24gaW4gdGhlIGludGVybmFsIG1vZGVsXG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbENvbnRleHQgPSB0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdGlmIChpbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJkZWxldGVFbmFibGVkXCIsIGZhbHNlKTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIsIDApO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzZWxlY3RlZENvbnRleHRzXCIsIFtdKTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZGVsZXRhYmxlQ29udGV4dHNcIiwgW10pO1xuXHRcdH1cblxuXHRcdC8vIEVuYWJsZS9kaXNhYmxlIHRoZSAnQ3JlYXRlJyBidXR0b24vbWVudSBpZiBuZWNlc3Nhcnlcblx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdGlmICh0YWJsZUFQSS50YWJsZURlZmluaXRpb24uY29udHJvbC5jcmVhdGVFbmFibGVtZW50KSB7XG5cdFx0XHR0aGlzLl91cGRhdGVDcmVhdGVFbmFibGVtZW50KFxuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dCBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0dGFibGVBUEkudGFibGVEZWZpbml0aW9uLmNvbnRyb2wuY3JlYXRlRW5hYmxlbWVudCxcblx0XHRcdFx0dGFibGUsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbi5jb250cm9sLm5vZGVUeXBlXG5cdFx0XHQpO1xuXHRcdH1cblx0fSxcblxuXHRkaXNhYmxlQWN0aW9uOiBmdW5jdGlvbiAoYUFjdGlvbnNNdWx0aXNlbGVjdERpc2FibGVkOiBzdHJpbmdbXSwgb0R5bmFtaWNBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IGJFbmFibGVkPzogYm9vbGVhbiB9Pik6IHZvaWQge1xuXHRcdGFBY3Rpb25zTXVsdGlzZWxlY3REaXNhYmxlZC5mb3JFYWNoKGZ1bmN0aW9uIChzQWN0aW9uOiBzdHJpbmcpIHtcblx0XHRcdG9EeW5hbWljQWN0aW9uc1tzQWN0aW9uXSA9IHsgYkVuYWJsZWQ6IGZhbHNlIH07XG5cdFx0fSk7XG5cdH0sXG5cdG9uRmllbGRDaGFuZ2VJbkNyZWF0aW9uUm93OiBmdW5jdGlvbiAoXG5cdFx0b0V2ZW50OiBGaWVsZCRDaGFuZ2VFdmVudCAmIFVJNUV2ZW50PHsgaXNWYWxpZDogYm9vbGVhbiB9Pixcblx0XHR3aXRoQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdC8vIENSRUFUSU9OIFJPVyBDQVNFXG5cdFx0Y29uc3QgbUZpZWxkID0gRmllbGRSdW50aW1lSGVscGVyLmdldEZpZWxkU3RhdGVPbkNoYW5nZShvRXZlbnQpLFxuXHRcdFx0b1NvdXJjZUZpZWxkID0gbUZpZWxkLmZpZWxkLFxuXHRcdFx0c0ZpZWxkSWQgPSBvU291cmNlRmllbGQuZ2V0SWQoKTtcblxuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9Tb3VyY2VGaWVsZC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0bUZpZWxkVmFsaWRpdHkgPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiksXG5cdFx0XHRtTmV3RmllbGRWYWxpZGl0eSA9IE9iamVjdC5hc3NpZ24oe30sIG1GaWVsZFZhbGlkaXR5KTtcblxuXHRcdG1OZXdGaWVsZFZhbGlkaXR5W3NGaWVsZElkXSA9IG1GaWVsZC5zdGF0ZTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwgbU5ld0ZpZWxkVmFsaWRpdHkpO1xuXG5cdFx0Ly8gcHJlcGFyZSBDdXN0b20gVmFsaWRhdGlvblxuXHRcdGlmICh3aXRoQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uKSB7XG5cdFx0XHRjb25zdCBtQ3VzdG9tVmFsaWRpdHkgPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIpLFxuXHRcdFx0XHRtTmV3Q3VzdG9tVmFsaWRpdHkgPSBPYmplY3QuYXNzaWduKHt9LCBtQ3VzdG9tVmFsaWRpdHkpO1xuXHRcdFx0bU5ld0N1c3RvbVZhbGlkaXR5W29Tb3VyY2VGaWVsZC5nZXRCaW5kaW5nKFwidmFsdWVcIikhLmdldFBhdGgoKV0gPSB7XG5cdFx0XHRcdGZpZWxkSWQ6IG9Tb3VyY2VGaWVsZC5nZXRJZCgpXG5cdFx0XHR9O1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiLCBtTmV3Q3VzdG9tVmFsaWRpdHkpO1xuXHRcdFx0Ly8gUmVtb3ZlIGV4aXN0aW5nIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0Y29uc3Qgc1RhcmdldCA9IGAke29Tb3VyY2VGaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCl9LyR7b1NvdXJjZUZpZWxkLmdldEJpbmRpbmdQYXRoKFwidmFsdWVcIil9YDtcblx0XHRcdE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogTWVzc2FnZSkge1xuXHRcdFx0XHRcdGlmIChvTWVzc2FnZS5nZXRUYXJnZXRzKClbMF0gPT09IHNUYXJnZXQpIHtcblx0XHRcdFx0XHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cdG9uVHJlZVRhYmxlQ29udGV4dENoYW5nZWQ6IGZ1bmN0aW9uIChldmVudDogVUk1RXZlbnQsIGluaXRpYWxFeHBhbnNpb25MZXZlbD86IG51bWJlcik6IHZvaWQge1xuXHRcdC8vIFdoZW4gdGhlIGNvbnRleHQgb2YgYSBUcmVlVGFibGUgY2hhbmdlcywgd2Ugd2FudCB0byByZXN0b3JlIGl0cyBleHBhbnNpb24gc3RhdGUgdG8gdGhlIGRlZmF1bHQ6XG5cdFx0Ly8gICAtIGFsbCBleHBhbmRlZCBpZiB0aGVyZSdzIGEgc2VhcmNoIHBhcmFtZXRlciBjb21pbmcgZnJvbSB0aGUgZmlsdGVyQmFyXG5cdFx0Ly8gICAtIG90aGVyd2lzZSBpbml0aWFsIGV4cGFuc2lvbiBzdGF0ZSBjb21pbmcgZnJvbSB0aGUgUFYgKHN0b3JlZCBpbiB0aGUgcGF5bG9hZClcblx0XHQvLyAgIC0gb3RoZXJ3aXNlIG5vIGV4cGFuc2lvbiBhdCBhbGxcblxuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IHRhYmxlID0gc291cmNlIGFzIFRhYmxlO1xuXHRcdGNvbnN0IHRhYmxlQVBJID0gdGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0Y29uc3Qgcm93QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRpZiAoIXJvd0JpbmRpbmc/LmdldENvbnRleHQoKSB8fCB0YWJsZUFQSS5nZXRJZ25vcmVDb250ZXh0Q2hhbmdlRXZlbnQoKSkge1xuXHRcdFx0Ly8gVGhlIHRhYmxlIGlzIG5vdCBib3VuZCwgb3Igd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBzd2l0Y2hpbmcgYmV0d2VlbiBub3JtYWwgYW5kIGZ1bGxzY3JlZW4sIHNvIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBleHBhbnNpb24gc3RhdGVcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBhZ2dyZWdhdGlvbjoge1xuXHRcdFx0YWdncmVnYXRlPzogb2JqZWN0O1xuXHRcdFx0ZXhwYW5kVG8/OiBudW1iZXI7XG5cdFx0XHRncmFuZFRvdGFsQXRCb3R0b21Pbmx5PzogYm9vbGVhbjtcblx0XHRcdGdyb3VwPzogb2JqZWN0O1xuXHRcdFx0Z3JvdXBMZXZlbHM/OiBzdHJpbmdbXTtcblx0XHRcdGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZztcblx0XHRcdHNlYXJjaD86IHN0cmluZztcblx0XHRcdHN1YnRvdGFsc0F0Qm90dG9tT25seT86IGJvb2xlYW47XG5cdFx0fSA9IHJvd0JpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSA/PyB7fTtcblx0XHRjb25zdCBmaWx0ZXJJbmZvID0gVGFibGVVdGlscy5nZXRBbGxGaWx0ZXJJbmZvKHRhYmxlKTtcblx0XHRhZ2dyZWdhdGlvbi5leHBhbmRUbyA9IGZpbHRlckluZm8uc2VhcmNoID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgOiBpbml0aWFsRXhwYW5zaW9uTGV2ZWw7XG5cdFx0cm93QmluZGluZy5zZXRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbik7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGFuIGl0ZW0gaW4gYSAnQ3JlYXRlJyBtZW51IGlzIGNsaWNrZWQuIEl0IGNyZWF0ZXMgYSBkb2N1bWVudCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGluaXRpYWwgZGF0YS5cblx0ICogQHBhcmFtIGV2ZW50XG5cdCAqIEBwYXJhbSB2YWx1ZUluZGV4IFRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgbWVudVxuXHQgKiBAcGFyYW0gc2VsZWN0ZWRDb250ZXh0cyBUaGUgc2VsZWN0ZWQgY29udGV4dHMgaW4gdGhlIHRhYmxlIGZvciB0aGlzICdDcmVhdGUnIG1lbnVcblx0ICovXG5cdG9uQ3JlYXRlTWVudUl0ZW1QcmVzczogYXN5bmMgZnVuY3Rpb24gKGV2ZW50OiBVSTVFdmVudDx7fSwgTWVudUl0ZW0+LCB2YWx1ZUluZGV4OiBudW1iZXIsIHNlbGVjdGVkQ29udGV4dHM6IENvbnRleHRbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG1kY1RhYmxlID0gRlBNSGVscGVyLmdldE1kY1RhYmxlKGV2ZW50LmdldFNvdXJjZSgpKTtcblx0XHRjb25zdCB0YWJsZUFQSSA9IG1kY1RhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZDtcblxuXHRcdC8vIFNvbWUgY2hlY2tzIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGVcblx0XHRpZiAoIXRhYmxlQVBJIHx8ICFtZGNUYWJsZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBub2RlVHlwZSA9IHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbi5jb250cm9sLm5vZGVUeXBlO1xuXHRcdGlmICghbm9kZVR5cGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCB2aWV3ID0gQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0Vmlldyh0YWJsZUFQSSk7XG5cdFx0Y29uc3QgY3JlYXRpb25EYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdFx0Y3JlYXRpb25EYXRhW25vZGVUeXBlLnByb3BlcnR5TmFtZV0gPSBub2RlVHlwZS52YWx1ZXNbdmFsdWVJbmRleF0udmFsdWU7XG5cblx0XHRjb25zdCBjcmVhdGlvblBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdHRhYmxlSWQ/OiBzdHJpbmc7XG5cdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xuXHRcdFx0ZGF0YT86IG9iamVjdDtcblx0XHR9ID0ge1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdGNyZWF0aW9uTW9kZTogdGFibGVBUEkudGFibGVEZWZpbml0aW9uLmFubm90YXRpb24uY3JlYXRlLm1vZGUsXG5cdFx0XHRkYXRhOiBjcmVhdGlvbkRhdGEsXG5cdFx0XHR0YWJsZUlkOiBtZGNUYWJsZT8uZ2V0SWQoKVxuXHRcdH07XG5cblx0XHRpZiAoY3JlYXRpb25QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nKSB7XG5cdFx0XHRjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMgPSBub2RlVHlwZS52YWx1ZXNbdmFsdWVJbmRleF0uY3JlYXRpb25EaWFsb2dGaWVsZHM7XG5cdFx0XHRpZiAoIWNyZWF0aW9uUGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkcyB8fCBjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdC8vIFVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBubyBjcmVhdGlvbiBmaWVsZHMgYXJlIHNwZWNpZmllZCBmb3IgdGhpcyBtZW51IGl0ZW1cblx0XHRcdFx0Y3JlYXRpb25QYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzID0gdGFibGVBUEkudGFibGVEZWZpbml0aW9uLmNvbnRyb2wuY3JlYXRpb25EaWFsb2dGaWVsZHM7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIW1kY1RhYmxlLmdldFJvd0JpbmRpbmcoKSkge1xuXHRcdFx0XHQvLyBJbiBjcmVhdGlvbiBkaWFsb2cgbW9kZSwgd2UgZm9yY2UgdGhlIHRhYmxlIGRhdGEgdG8gYmUgbG9hZGVkIGJlZm9yZSBjcmVhdGluZyB0aGUgZG9jdW1lbnRcblx0XHRcdFx0Ly8gKHRvIG92ZXJjb21lIHRoZSBjYXNlIGluIGEgTGlzdFJlcG9ydCB3aGVyZSBubyBkYXRhIGlzIGxvYWRlZCB5ZXQpXG5cdFx0XHRcdGF3YWl0IG1kY1RhYmxlLnJlYmluZCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZpZXcuZ2V0Q29udHJvbGxlcigpXG5cdFx0XHQuZWRpdEZsb3cuY3JlYXRlRG9jdW1lbnQodGFibGVBUEkuZ2V0Um93QmluZGluZygpLCBjcmVhdGlvblBhcmFtZXRlcnMpXG5cdFx0XHQuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdExvZy5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBuZXcgZG9jdW1lbnQ6ICR7ZXJyb3J9YCk7XG5cdFx0XHR9KTtcblx0fSxcblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlICdDcmVhdGUnIGJ1dHRvbiBpcyBwcmVzc2VkLCBvciB0aGUgJ0NyZWF0ZScgY29tbWFuZCBpbnZva2VkLlxuXHQgKiBAcGFyYW0gZXZlbnRcblx0ICogQHBhcmFtIHNlbGVjdGVkQ29udGV4dHMgVGhlIHNlbGVjdGVkIGNvbnRleHRzIGluIHRoZSB0YWJsZSBmb3IgdGhpcyAnQ3JlYXRlJyBidXR0b25cblx0ICovXG5cdG9uQ3JlYXRlQnV0dG9uUHJlc3M6IGFzeW5jIGZ1bmN0aW9uIChldmVudDogVUk1RXZlbnQsIHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W10pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBtZGNUYWJsZSA9IEZQTUhlbHBlci5nZXRNZGNUYWJsZShldmVudC5nZXRTb3VyY2UoKSk7XG5cdFx0Y29uc3QgdGFibGVBUEkgPSBtZGNUYWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQ7XG5cblx0XHQvLyBTb21lIGNoZWNrcyB0byBiZSBvbiB0aGUgc2FmZSBzaWRlXG5cdFx0aWYgKCF0YWJsZUFQSSB8fCAhbWRjVGFibGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBjcmVhdGlvblBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0b3V0Ym91bmQ/OiBzdHJpbmc7XG5cdFx0XHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdHRhYmxlSWQ/OiBzdHJpbmc7XG5cdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xuXHRcdH0gPSB7IGNyZWF0aW9uTW9kZTogdGFibGVBUEkudGFibGVEZWZpbml0aW9uLmFubm90YXRpb24uY3JlYXRlLm1vZGUgfTtcblxuXHRcdHN3aXRjaCAoY3JlYXRpb25QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSkge1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWw6XG5cdFx0XHRcdGNyZWF0aW9uUGFyYW1ldGVycy5vdXRib3VuZCA9ICh0YWJsZUFQSS50YWJsZURlZmluaXRpb24uYW5ub3RhdGlvbi5jcmVhdGUgYXMgQ3JlYXRlQmVoYXZpb3JFeHRlcm5hbCkub3V0Ym91bmQ7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdzpcblx0XHRcdFx0Y3JlYXRpb25QYXJhbWV0ZXJzLmNyZWF0aW9uUm93ID0gZXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRcdGNyZWF0aW9uUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbi5jb250cm9sLmNyZWF0ZUF0RW5kID8/IGZhbHNlO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuTmV3UGFnZTpcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLklubGluZTpcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nOlxuXHRcdFx0XHRjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPSB0YWJsZUFQSS50YWJsZURlZmluaXRpb24uY29udHJvbC5jcmVhdGVBdEVuZCA/PyBmYWxzZTtcblx0XHRcdFx0Y3JlYXRpb25QYXJhbWV0ZXJzLnRhYmxlSWQgPSBtZGNUYWJsZT8uZ2V0SWQoKTtcblx0XHRcdFx0Y3JlYXRpb25QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMgPSBzZWxlY3RlZENvbnRleHRzO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzOlxuXHRcdFx0XHQvLyBOb3RoaW5nXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHQvLyBPdGhlciBtb2RlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGNyZWF0aW9uUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZykge1xuXHRcdFx0Y3JlYXRpb25QYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzID0gdGFibGVBUEkudGFibGVEZWZpbml0aW9uLmNvbnRyb2wuY3JlYXRpb25EaWFsb2dGaWVsZHM7XG5cdFx0XHRpZiAoIW1kY1RhYmxlLmdldFJvd0JpbmRpbmcoKSkge1xuXHRcdFx0XHQvLyBJbiBjcmVhdGlvbiBkaWFsb2cgbW9kZSwgd2UgZm9yY2UgdGhlIHRhYmxlIGRhdGEgdG8gYmUgbG9hZGVkIGJlZm9yZSBjcmVhdGluZyB0aGUgZG9jdW1lbnRcblx0XHRcdFx0Ly8gKHRvIG92ZXJjb21lIHRoZSBjYXNlIGluIGEgTGlzdFJlcG9ydCB3aGVyZSBubyBkYXRhIGlzIGxvYWRlZCB5ZXQpXG5cdFx0XHRcdGF3YWl0IG1kY1RhYmxlLnJlYmluZCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHZpZXcgPSBDb21tb25VdGlscy5nZXRUYXJnZXRWaWV3KHRhYmxlQVBJKTtcblxuXHRcdGlmIChjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzKSB7XG5cdFx0XHR2aWV3LmdldENvbnRyb2xsZXIoKVxuXHRcdFx0XHQuZWRpdEZsb3cuY3JlYXRlRW1wdHlSb3dzQW5kRm9jdXMobWRjVGFibGUpXG5cdFx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgbmV3IGVtcHR5IHJvdzogJHtlcnJvcn1gKTtcblx0XHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZpZXcuZ2V0Q29udHJvbGxlcigpXG5cdFx0XHRcdC5lZGl0Rmxvdy5jcmVhdGVEb2N1bWVudCh0YWJsZUFQSSwgY3JlYXRpb25QYXJhbWV0ZXJzKVxuXHRcdFx0XHQuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIG5ldyBkb2N1bWVudDogJHtlcnJvcn1gKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gbWFuYWdlIHRoZSBJbnRlbnRCYXNlZCBOYXZpZ2F0aW9uIGVuYWJsZW1lbnQuXG5cdCAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsQ29udGV4dFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvbkF2YWlsYWJsZU1hcFxuXHQgKiBAcGFyYW0gc2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gZm9yQ29udGV4dE1lbnVcblx0ICovXG5cdHNldEludGVudEJhc2VkTmF2aWdhdGlvbkVuYWJsZW1lbnQ6IGZ1bmN0aW9uIChcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0bmF2aWdhdGlvbkF2YWlsYWJsZU1hcDogc3RyaW5nW10sXG5cdFx0c2VsZWN0ZWRDb250ZXh0czogQ29udGV4dFtdLFxuXHRcdGZvckNvbnRleHRNZW51ID0gZmFsc2Vcblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBzS2V5IGluIG5hdmlnYXRpb25BdmFpbGFibGVNYXApIHtcblx0XHRcdGlmICghZm9yQ29udGV4dE1lbnUpIHtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGlibi8ke3NLZXl9YCwge1xuXHRcdFx0XHRcdGJFbmFibGVkOiBmYWxzZSxcblx0XHRcdFx0XHRhQXBwbGljYWJsZTogW10sXG5cdFx0XHRcdFx0YU5vdEFwcGxpY2FibGU6IFtdXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGlibi8ke3NLZXl9YCwge1xuXHRcdFx0XHRcdC8vIERvIG5vdCBjaGFuZ2UgZW5hYmxlZCwgYUFwcGxpY2FibGUgYW5kIGFOb3RBcHBsaWNhYmxlIHByb3BlcnR5IGluIGNhc2Ugb2YgY29udGV4dCBtZW51IGNhbGN1bGF0aW9uXG5cdFx0XHRcdFx0YkVuYWJsZWQ6IGludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGAke2ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vaWJuLyR7c0tleX0vYkVuYWJsZWRgKSxcblx0XHRcdFx0XHRhQXBwbGljYWJsZTogaW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYCR7aW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpfS9pYm4vJHtzS2V5fS9hQXBwbGljYWJsZWApLFxuXHRcdFx0XHRcdGFOb3RBcHBsaWNhYmxlOiBpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgJHtpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQYXRoKCl9L2libi8ke3NLZXl9L2FOb3RBcHBsaWNhYmxlYCksXG5cdFx0XHRcdFx0YkVuYWJsZWRGb3JDb250ZXh0TWVudTogZmFsc2UsXG5cdFx0XHRcdFx0YUFwcGxpY2FibGVGb3JDb250ZXh0TWVudTogW10sXG5cdFx0XHRcdFx0YU5vdEFwcGxpY2FibGVGb3JDb250ZXh0TWVudTogW11cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBhQXBwbGljYWJsZSA9IFtdLFxuXHRcdFx0XHRhTm90QXBwbGljYWJsZSA9IFtdO1xuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5ID0gbmF2aWdhdGlvbkF2YWlsYWJsZU1hcFtzS2V5XTtcblx0XHRcdGZvciAoY29uc3Qgc2VsZWN0ZWRDb250ZXh0IG9mIHNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdFx0aWYgKHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3Qoc1Byb3BlcnR5KSkge1xuXHRcdFx0XHRcdGNvbnN0IGVuYWJsZWRQcm9wZXJ0eSA9ICFmb3JDb250ZXh0TWVudSA/IFwiYkVuYWJsZWRcIiA6IFwiYkVuYWJsZWRGb3JDb250ZXh0TWVudVwiO1xuXHRcdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LmdldE1vZGVsKCkuc2V0UHJvcGVydHkoYCR7aW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpfS9pYm4vJHtzS2V5fS8ke2VuYWJsZWRQcm9wZXJ0eX1gLCB0cnVlKTtcblx0XHRcdFx0XHRhQXBwbGljYWJsZS5wdXNoKHNlbGVjdGVkQ29udGV4dCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YU5vdEFwcGxpY2FibGUucHVzaChzZWxlY3RlZENvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBhcHBsaWNhYmxlUHJvcGVydHkgPSAhZm9yQ29udGV4dE1lbnUgPyBcImFBcHBsaWNhYmxlXCIgOiBcImFBcHBsaWNhYmxlRm9yQ29udGV4dE1lbnVcIjtcblx0XHRcdGNvbnN0IG5vdEFwcGxpY2FibGVQcm9wZXJ0eSA9ICFmb3JDb250ZXh0TWVudSA/IFwiYU5vdEFwcGxpY2FibGVcIiA6IFwiYU5vdEFwcGxpY2FibGVGb3JDb250ZXh0TWVudVwiO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShgJHtpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQYXRoKCl9L2libi8ke3NLZXl9LyR7YXBwbGljYWJsZVByb3BlcnR5fWAsIGFBcHBsaWNhYmxlKTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0XG5cdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdC5zZXRQcm9wZXJ0eShgJHtpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQYXRoKCl9L2libi8ke3NLZXl9LyR7bm90QXBwbGljYWJsZVByb3BlcnR5fWAsIGFOb3RBcHBsaWNhYmxlKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgY29udGV4dCBtZW51IGl0ZW0gaXMgcHJlc3NlZC5cblx0ICogQHBhcmFtIGV2ZW50XG5cdCAqL1xuXHRvbkNvbnRleHRNZW51SXRlbVNlbGVjdGVkOiBmdW5jdGlvbiAoZXZlbnQ6IFVJNUV2ZW50KTogdm9pZCB7XG5cdFx0Y29uc3QgbWRjVGFibGUgPSBGUE1IZWxwZXIuZ2V0TWRjVGFibGUoZXZlbnQuZ2V0U291cmNlKCkpO1xuXHRcdGNvbnN0IHRhYmxlQVBJID0gbWRjVGFibGU/LmdldFBhcmVudCgpIGFzIFRhYmxlQVBJIHwgdW5kZWZpbmVkO1xuXG5cdFx0Ly8gU2V0IHRoZSBmbGFnIG9uIHRoZSB0YWJsZUFQSSBzbyB0aGF0IGdldFNlbGVjdGVkQ29udGV4dHMgcmV0dXJucyB0aGUgY29ycmVjdCB2YWx1ZVxuXHRcdHRhYmxlQVBJPy5zZXRDb250ZXh0TWVudUFjdGl2ZSh0cnVlKTtcblxuXHRcdC8vIEFmdGVyIGEgc2hvcnQgZGVsYXkgKG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgYWN0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCksIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGZsYWcgb24gdGhlIHRhYmxlXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0YWJsZUFQST8uc2V0Q29udGV4dE1lbnVBY3RpdmUoZmFsc2UpO1xuXHRcdH0sIDApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBNREMgRGF0YVN0YXRlSW5kaWNhdG9yIHBsdWdpbiB0byBkaXNwbGF5IG1lc3NhZ2VTdHJpcCBvbiBhIHRhYmxlLlxuXHQgKiBAcGFyYW0gbWVzc2FnZVxuXHQgKiBAcGFyYW0gY29udHJvbFxuXHQgKiBAcmV0dXJucyBXaGV0aGVyIHRvIHJlbmRlciB0aGUgbWVzc2FnZVN0cmlwIHZpc2libGVcblx0ICovXG5cdGRhdGFTdGF0ZUluZGljYXRvckZpbHRlcjogZnVuY3Rpb24gKG1lc3NhZ2U6IE1lc3NhZ2UsIGNvbnRyb2w6IENvbnRyb2wpOiBib29sZWFuIHtcblx0XHRjb25zdCB0YWJsZUFQSSA9IGNvbnRyb2wuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0cmV0dXJuIHRhYmxlQVBJLmRhdGFTdGF0ZUluZGljYXRvckZpbHRlcihtZXNzYWdlLCBjb250cm9sKTtcblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgVGFibGVSdW50aW1lO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0VBNEJBLE1BQU1BLFlBQVksR0FBR0MsU0FBUyxDQUFDRCxZQUFZO0VBQzNDO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTUUsWUFBWSxHQUFHO0lBQ3BCQyxnQ0FBZ0MsRUFBRSxTQUFBQSxDQUFVQyxjQUFzQixFQUFFQyxPQUFnQixFQUFRO01BQzNGO01BQ0EsTUFBTUMsU0FBUyxHQUFHRCxPQUFPLENBQUNFLFNBQVMsQ0FBQyxDQUFhO01BQ2pELElBQUlILGNBQWMsS0FBS0osWUFBWSxDQUFDUSxXQUFXLEVBQUU7UUFDaEQsTUFBTUMsT0FBTyxHQUFHSCxTQUFTLENBQ3ZCSSxVQUFVLENBQUMsQ0FBQyxDQUNaQyxNQUFNLENBQUMsVUFBVUMsY0FBeUIsRUFBRUMsb0JBQTZCLEVBQUU7VUFDM0UsT0FBT0QsY0FBYyxDQUFDRSxNQUFNLENBQUVELG9CQUFvQixDQUF5QkUsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN4RixDQUFDLEVBQUUsRUFBZSxDQUFDLENBQ2xCQyxJQUFJLENBQUMsVUFBVUMsYUFBc0IsRUFBRTtVQUN2QyxPQUFPQSxhQUFhLENBQUNDLEtBQUssQ0FBQyxD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
|
|
@@ -8,10 +8,12 @@ import type { CreateBehaviorExternal } from "sap/fe/core/converters/controls/Com
|
|
|
8
8
|
import deleteHelper from "sap/fe/core/helpers/DeleteHelper";
|
|
9
9
|
import FPMHelper from "sap/fe/core/helpers/FPMHelper";
|
|
10
10
|
import type { InternalModelContext } from "sap/fe/core/helpers/ModelHelper";
|
|
11
|
+
import ResourceModelHelper from "sap/fe/core/helpers/ResourceModelHelper";
|
|
11
12
|
import FELibrary from "sap/fe/core/library";
|
|
12
13
|
import type TableAPI from "sap/fe/macros/table/TableAPI";
|
|
13
14
|
import TableUtils from "sap/fe/macros/table/Utils";
|
|
14
15
|
import type MenuItem from "sap/m/MenuItem";
|
|
16
|
+
import MessageToast from "sap/m/MessageToast";
|
|
15
17
|
import type UI5Event from "sap/ui/base/Event";
|
|
16
18
|
import type Control from "sap/ui/core/Control";
|
|
17
19
|
import Messaging from "sap/ui/core/Messaging";
|
|
@@ -28,7 +30,6 @@ const CreationMode = FELibrary.CreationMode;
|
|
|
28
30
|
/**
|
|
29
31
|
* Static class used by Table building block during runtime
|
|
30
32
|
* @private
|
|
31
|
-
* @experimental This module is only for internal/experimental use!
|
|
32
33
|
*/
|
|
33
34
|
const TableRuntime = {
|
|
34
35
|
executeConditionalActionShortcut: function (sButtonMatcher: string, oSource: Control): void {
|
|
@@ -247,17 +248,40 @@ const TableRuntime = {
|
|
|
247
248
|
* @param forContextMenu
|
|
248
249
|
*/
|
|
249
250
|
updateCutCopyPasteEnablement: function (modelObject: { [key: string]: unknown }, table: Table, forContextMenu = false): void {
|
|
251
|
+
modelObject.contextmenu = modelObject.contextmenu ?? { selectedContexts: [] };
|
|
252
|
+
|
|
250
253
|
const tableDefinition = (table.getParent() as TableAPI).getTableDefinition();
|
|
251
254
|
if (tableDefinition.control.type !== "TreeTable") {
|
|
252
255
|
// The logic below only makes sense for a Tree Table
|
|
253
256
|
return;
|
|
254
257
|
}
|
|
258
|
+
const view = CommonUtils.getTargetView(table);
|
|
259
|
+
const isViewEditable = CommonUtils.getIsEditable(view);
|
|
260
|
+
if (view.getControllerName() !== "sap.fe.templates.ListReport.ListReportController" && !isViewEditable) {
|
|
261
|
+
// If the view is not editable, we disable the cut/copy/paste functionality and clear the nodeUpdatesInfo
|
|
262
|
+
modelObject.nodeUpdatesInfo = {};
|
|
263
|
+
(modelObject.contextmenu as { [key: string]: unknown }).nodeUpdatesInfo = {};
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
255
266
|
const checkDraftInstance = !table.getRowBinding().isRelative();
|
|
256
267
|
|
|
257
268
|
if (forContextMenu) {
|
|
258
269
|
(modelObject.contextmenu as { [key: string]: unknown }).nodeUpdatesInfo = {};
|
|
259
270
|
}
|
|
260
271
|
const nodeUpdatesInfo = modelObject.nodeUpdatesInfo as { [key: string]: unknown };
|
|
272
|
+
//If the pastableContext become disconnected from the listBinding, for example, when the user collapses the parent node, we attempt to locate the correct context by comparing their paths
|
|
273
|
+
const pastableContexts: Context[] = table
|
|
274
|
+
.getRowBinding()
|
|
275
|
+
.getAllCurrentContexts()
|
|
276
|
+
.filter((context) =>
|
|
277
|
+
((nodeUpdatesInfo.pastableContexts || []) as Context[])
|
|
278
|
+
.map((pastableContext) => pastableContext.getPath())
|
|
279
|
+
.includes(context.getPath())
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
if (pastableContexts.length !== ((nodeUpdatesInfo.pastableContexts || []) as Context[]).length) {
|
|
283
|
+
MessageToast.show("" + ResourceModelHelper.getResourceModel(table).getText("M_PASTABLE_CONTEXTS_NOT_AVAILABLE"));
|
|
284
|
+
}
|
|
261
285
|
const copyCutPasteEnablementInfo = ((!forContextMenu ? modelObject : modelObject.contextmenu) as { [key: string]: unknown })
|
|
262
286
|
.nodeUpdatesInfo as {
|
|
263
287
|
[key: string]: unknown;
|
|
@@ -274,7 +298,11 @@ const TableRuntime = {
|
|
|
274
298
|
copyCutPasteEnablementInfo.cutEnablement = selectedContexts.length === 1 && cutableContexts.length === 1;
|
|
275
299
|
copyCutPasteEnablementInfo.copyEnablement = selectedContexts.length === 1 && copyableContexts.length === 1;
|
|
276
300
|
|
|
277
|
-
if (nodeUpdatesInfo.lastAction
|
|
301
|
+
if (nodeUpdatesInfo.lastAction) {
|
|
302
|
+
if (pastableContexts?.length === 0) {
|
|
303
|
+
copyCutPasteEnablementInfo.pasteEnablement = false;
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
278
306
|
let contextsforPastableEnablement: Context[];
|
|
279
307
|
const extensionPoint =
|
|
280
308
|
nodeUpdatesInfo.lastAction === "Cut"
|
|
@@ -291,7 +319,7 @@ const TableRuntime = {
|
|
|
291
319
|
extensionPoint.methodName,
|
|
292
320
|
table
|
|
293
321
|
) as Function
|
|
294
|
-
)(
|
|
322
|
+
)(pastableContexts[0], targetContext) //nodeUpdatesInfo.pastableContexts has been the last time the user pressed the cut/copy button
|
|
295
323
|
);
|
|
296
324
|
} else {
|
|
297
325
|
contextsforPastableEnablement = [...selectedContexts];
|
|
@@ -333,9 +361,9 @@ const TableRuntime = {
|
|
|
333
361
|
const outOfPlaceContext = movedContext.isTransient() !== undefined;
|
|
334
362
|
const customMovable = TableRuntime.checkIfNodeIsMovable(movedContext, table);
|
|
335
363
|
modelObjectPath.singleContextMovableUp =
|
|
336
|
-
movableDraft && customMovable && !outOfPlaceContext && movedContext.getSibling(-1) !== null;
|
|
364
|
+
movableDraft && customMovable && !outOfPlaceContext && !movedContext.isDeleted() && movedContext.getSibling(-1) !== null;
|
|
337
365
|
modelObjectPath.singleContextMovableDown =
|
|
338
|
-
movableDraft && customMovable && !outOfPlaceContext && movedContext.getSibling(1) !== null;
|
|
366
|
+
movableDraft && customMovable && !outOfPlaceContext && !movedContext.isDeleted() && movedContext.getSibling(1) !== null;
|
|
339
367
|
}
|
|
340
368
|
},
|
|
341
369
|
|