@sapui5/sap.fe.macros 1.139.0 → 1.141.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/Chart.js +53 -2
- package/src/sap/fe/macros/Chart.tsx +55 -0
- package/src/sap/fe/macros/CollaborativeDraftHandler.js +230 -0
- package/src/sap/fe/macros/CollaborativeDraftHandler.tsx +218 -0
- package/src/sap/fe/macros/CommonHelper.js +59 -15
- package/src/sap/fe/macros/CommonHelper.ts +65 -14
- package/src/sap/fe/macros/ConditionalSwitch.js +174 -0
- package/src/sap/fe/macros/ConditionalSwitch.tsx +141 -0
- package/src/sap/fe/macros/ConditionalSwitchProperty.js +78 -0
- package/src/sap/fe/macros/ConditionalSwitchProperty.tsx +62 -0
- package/src/sap/fe/macros/Field.js +78 -64
- package/src/sap/fe/macros/Field.ts +97 -68
- package/src/sap/fe/macros/FooterContent.js +5 -2
- package/src/sap/fe/macros/FooterContent.tsx +4 -1
- package/src/sap/fe/macros/MacroAPI.js +9 -4
- package/src/sap/fe/macros/MacroAPI.ts +9 -4
- 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 +10 -7
- package/src/sap/fe/macros/MultiValueField.tsx +7 -3
- package/src/sap/fe/macros/Page.js +5 -7
- package/src/sap/fe/macros/Page.tsx +4 -6
- package/src/sap/fe/macros/Paginator.js +9 -4
- package/src/sap/fe/macros/Paginator.tsx +12 -3
- package/src/sap/fe/macros/RichTextEditor.js +3 -2
- package/src/sap/fe/macros/RichTextEditor.tsx +2 -1
- package/src/sap/fe/macros/Share.js +14 -2
- package/src/sap/fe/macros/Share.tsx +13 -0
- package/src/sap/fe/macros/Status.js +251 -0
- package/src/sap/fe/macros/Status.tsx +212 -0
- package/src/sap/fe/macros/ValueHelp.js +4 -28
- package/src/sap/fe/macros/ValueHelp.tsx +2 -42
- package/src/sap/fe/macros/ai/EasyFillDialog.js +11 -17
- package/src/sap/fe/macros/ai/EasyFillDialog.tsx +11 -16
- package/src/sap/fe/macros/ai/EasyFilterBar.js +246 -97
- package/src/sap/fe/macros/ai/EasyFilterBar.tsx +302 -106
- package/src/sap/fe/macros/ai/EasyFilterDataFetcher.js +76 -33
- package/src/sap/fe/macros/ai/EasyFilterDataFetcher.ts +89 -40
- 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/Chart.js +2 -2
- package/src/sap/fe/macros/chart/Chart.tsx +1 -1
- 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 +5 -5
- package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +5 -5
- package/src/sap/fe/macros/contentSwitcher/ContentSwitcher.js +9 -2
- package/src/sap/fe/macros/contentSwitcher/ContentSwitcher.tsx +8 -0
- package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.js +5 -1
- package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.ts +4 -0
- package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.js +4 -2
- package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.ts +3 -1
- package/src/sap/fe/macros/controls/FilterBar.js +14 -5
- package/src/sap/fe/macros/controls/FilterBar.ts +3 -0
- 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/RadioButtons.js +61 -38
- package/src/sap/fe/macros/controls/RadioButtons.tsx +39 -18
- package/src/sap/fe/macros/controls/Section.js +4 -3
- package/src/sap/fe/macros/controls/Section.ts +3 -2
- package/src/sap/fe/macros/controls/section/SubSection.js +63 -8
- package/src/sap/fe/macros/controls/section/SubSection.ts +67 -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 +28 -1
- package/src/sap/fe/macros/designtime/Designtime.helper.ts +27 -0
- package/src/sap/fe/macros/field/Field.js +2 -2
- package/src/sap/fe/macros/field/Field.tsx +1 -1
- package/src/sap/fe/macros/field/FieldBaseDelegate.js +13 -7
- package/src/sap/fe/macros/field/FieldBaseDelegate.ts +12 -8
- package/src/sap/fe/macros/field/FieldFormatOptions.js +25 -2
- package/src/sap/fe/macros/field/FieldFormatOptions.ts +13 -0
- package/src/sap/fe/macros/field/FieldHelper.js +2 -2
- package/src/sap/fe/macros/field/FieldHelper.ts +1 -4
- 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/field/FieldTemplating.js +3 -3
- package/src/sap/fe/macros/field/FieldTemplating.ts +4 -2
- package/src/sap/fe/macros/filter/FilterUtils.js +233 -5
- package/src/sap/fe/macros/filter/FilterUtils.ts +291 -7
- package/src/sap/fe/macros/filterBar/FilterBar.block.js +5 -3
- package/src/sap/fe/macros/filterBar/FilterBar.block.tsx +4 -2
- package/src/sap/fe/macros/filterBar/FilterBar.js +2 -2
- package/src/sap/fe/macros/filterBar/FilterBar.tsx +1 -1
- package/src/sap/fe/macros/filterBar/FilterBarAPI.js +63 -27
- package/src/sap/fe/macros/filterBar/FilterBarAPI.ts +49 -3
- package/src/sap/fe/macros/filterBar/FilterBarDelegate.js +5 -3
- package/src/sap/fe/macros/filterBar/FilterBarDelegate.ts +5 -2
- package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.js +7 -2
- package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.ts +6 -1
- package/src/sap/fe/macros/form/Form.block.js +7 -8
- package/src/sap/fe/macros/form/Form.block.ts +4 -6
- 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/FormContainer.block.js +555 -5
- package/src/sap/fe/macros/form/FormContainer.block.ts +665 -7
- package/src/sap/fe/macros/form/FormContainer.fragment.xml +1 -0
- package/src/sap/fe/macros/form/FormDelegate.js +24 -8
- package/src/sap/fe/macros/form/FormDelegate.ts +29 -7
- 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/fpm/CustomFragment.block.js +1 -2
- package/src/sap/fe/macros/fpm/CustomFragment.block.ts +0 -1
- 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 +3 -2
- package/src/sap/fe/macros/internal/DataPoint.tsx +10 -1
- package/src/sap/fe/macros/internal/FilterField.block.js +19 -5
- package/src/sap/fe/macros/internal/FilterField.block.ts +16 -4
- package/src/sap/fe/macros/internal/field/DisplayStyle.js +9 -3
- package/src/sap/fe/macros/internal/field/DisplayStyle.tsx +10 -2
- package/src/sap/fe/macros/internal/field/EditStyle.js +21 -4
- package/src/sap/fe/macros/internal/field/EditStyle.tsx +18 -4
- package/src/sap/fe/macros/internal/field/FieldStructureHelper.js +3 -2
- package/src/sap/fe/macros/internal/field/FieldStructureHelper.ts +5 -1
- package/src/sap/fe/macros/internal/filterField/FilterFieldTemplate.fragment.xml +1 -0
- package/src/sap/fe/macros/internal/helpers/ActionHelper.js +36 -5
- package/src/sap/fe/macros/internal/helpers/ActionHelper.ts +34 -4
- 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 +1 -1
- package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +10 -3
- package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +13 -2
- package/src/sap/fe/macros/library.js +1 -1
- package/src/sap/fe/macros/mdc/adapter/StateFilterToSelectionVariant.js +2 -1
- package/src/sap/fe/macros/mdc/adapter/StateFilterToSelectionVariant.ts +1 -0
- package/src/sap/fe/macros/messagebundle.properties +24 -4
- package/src/sap/fe/macros/messagebundle_ar.properties +8 -2
- package/src/sap/fe/macros/messagebundle_bg.properties +8 -2
- package/src/sap/fe/macros/messagebundle_ca.properties +11 -5
- package/src/sap/fe/macros/messagebundle_cnr.properties +8 -2
- package/src/sap/fe/macros/messagebundle_cs.properties +7 -1
- package/src/sap/fe/macros/messagebundle_cy.properties +9 -3
- package/src/sap/fe/macros/messagebundle_da.properties +8 -2
- package/src/sap/fe/macros/messagebundle_de.properties +13 -7
- package/src/sap/fe/macros/messagebundle_el.properties +7 -1
- package/src/sap/fe/macros/messagebundle_en.properties +11 -5
- package/src/sap/fe/macros/messagebundle_en_GB.properties +9 -3
- package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +11 -5
- package/src/sap/fe/macros/messagebundle_es.properties +10 -4
- package/src/sap/fe/macros/messagebundle_es_MX.properties +11 -5
- package/src/sap/fe/macros/messagebundle_et.properties +9 -3
- package/src/sap/fe/macros/messagebundle_fi.properties +7 -1
- package/src/sap/fe/macros/messagebundle_fr.properties +9 -3
- package/src/sap/fe/macros/messagebundle_fr_CA.properties +8 -2
- package/src/sap/fe/macros/messagebundle_hi.properties +8 -2
- package/src/sap/fe/macros/messagebundle_hr.properties +8 -2
- package/src/sap/fe/macros/messagebundle_hu.properties +7 -1
- package/src/sap/fe/macros/messagebundle_id.properties +15 -9
- package/src/sap/fe/macros/messagebundle_it.properties +7 -1
- package/src/sap/fe/macros/messagebundle_iw.properties +8 -2
- package/src/sap/fe/macros/messagebundle_ja.properties +13 -7
- package/src/sap/fe/macros/messagebundle_kk.properties +11 -5
- package/src/sap/fe/macros/messagebundle_ko.properties +8 -2
- package/src/sap/fe/macros/messagebundle_lt.properties +9 -3
- package/src/sap/fe/macros/messagebundle_lv.properties +8 -2
- package/src/sap/fe/macros/messagebundle_mk.properties +8 -2
- package/src/sap/fe/macros/messagebundle_ms.properties +7 -1
- package/src/sap/fe/macros/messagebundle_nl.properties +7 -1
- package/src/sap/fe/macros/messagebundle_no.properties +7 -1
- package/src/sap/fe/macros/messagebundle_pl.properties +8 -2
- package/src/sap/fe/macros/messagebundle_pt.properties +7 -1
- package/src/sap/fe/macros/messagebundle_pt_PT.properties +7 -1
- package/src/sap/fe/macros/messagebundle_ro.properties +8 -2
- package/src/sap/fe/macros/messagebundle_ru.properties +10 -4
- package/src/sap/fe/macros/messagebundle_sh.properties +8 -2
- package/src/sap/fe/macros/messagebundle_sk.properties +7 -1
- package/src/sap/fe/macros/messagebundle_sl.properties +7 -1
- package/src/sap/fe/macros/messagebundle_sr.properties +8 -2
- package/src/sap/fe/macros/messagebundle_sv.properties +7 -1
- package/src/sap/fe/macros/messagebundle_th.properties +8 -2
- package/src/sap/fe/macros/messagebundle_tr.properties +7 -1
- package/src/sap/fe/macros/messagebundle_uk.properties +10 -4
- package/src/sap/fe/macros/messagebundle_vi.properties +10 -4
- package/src/sap/fe/macros/messagebundle_zh_CN.properties +7 -1
- package/src/sap/fe/macros/messagebundle_zh_TW.properties +8 -2
- package/src/sap/fe/macros/messages/MessageButton.js +39 -18
- package/src/sap/fe/macros/messages/MessageButton.ts +42 -19
- package/src/sap/fe/macros/messages/MessagePopover.js +4 -2
- package/src/sap/fe/macros/messages/MessagePopover.ts +6 -4
- package/src/sap/fe/macros/microchart/MicroChart.js +2 -2
- package/src/sap/fe/macros/microchart/MicroChart.tsx +1 -1
- 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 +2 -3
- package/src/sap/fe/macros/microchart/MicroChartHelper.tsx +1 -2
- 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/ActionsTemplating.js +4 -8
- package/src/sap/fe/macros/table/ActionsTemplating.tsx +5 -8
- package/src/sap/fe/macros/table/BasicSearch.js +1 -1
- package/src/sap/fe/macros/table/BasicSearch.ts +2 -1
- package/src/sap/fe/macros/table/Column.js +14 -2
- package/src/sap/fe/macros/table/Column.ts +7 -0
- package/src/sap/fe/macros/table/ColumnExportSettings.js +83 -15
- package/src/sap/fe/macros/table/ColumnExportSettings.ts +44 -0
- package/src/sap/fe/macros/table/ColumnOverride.js +14 -2
- package/src/sap/fe/macros/table/ColumnOverride.ts +7 -0
- package/src/sap/fe/macros/table/MdcTableTemplate.js +7 -5
- package/src/sap/fe/macros/table/MdcTableTemplate.tsx +21 -11
- package/src/sap/fe/macros/table/QuickFilterSelector.js +12 -3
- package/src/sap/fe/macros/table/QuickFilterSelector.tsx +15 -2
- package/src/sap/fe/macros/table/Table.block.js +188 -147
- package/src/sap/fe/macros/table/Table.block.tsx +41 -11
- package/src/sap/fe/macros/table/Table.js +16 -10
- package/src/sap/fe/macros/table/Table.tsx +16 -10
- package/src/sap/fe/macros/table/TableAPI.js +224 -184
- package/src/sap/fe/macros/table/TableAPI.ts +63 -19
- package/src/sap/fe/macros/table/TableEventHandlerProvider.js +6 -6
- package/src/sap/fe/macros/table/TableEventHandlerProvider.ts +5 -4
- package/src/sap/fe/macros/table/TableHelper.js +2 -3
- package/src/sap/fe/macros/table/TableHelper.ts +1 -2
- package/src/sap/fe/macros/table/TableRuntime.js +24 -5
- package/src/sap/fe/macros/table/TableRuntime.ts +31 -3
- package/src/sap/fe/macros/table/TreeTable.js +16 -10
- package/src/sap/fe/macros/table/TreeTable.tsx +16 -10
- package/src/sap/fe/macros/table/Utils.js +8 -3
- package/src/sap/fe/macros/table/Utils.ts +12 -3
- 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 +69 -34
- package/src/sap/fe/macros/table/delegates/TableDelegate.ts +75 -33
- 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/massEdit/MassEditDialog.js +10 -10
- package/src/sap/fe/macros/table/massEdit/MassEditDialog.tsx +11 -9
- package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.js +14 -12
- package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.tsx +11 -10
- package/src/sap/fe/macros/table/mixin/ContextMenuHandler.js +34 -4
- package/src/sap/fe/macros/table/mixin/ContextMenuHandler.ts +45 -2
- package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.js +55 -12
- package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.ts +71 -9
- package/src/sap/fe/macros/table/mixin/TableAPIStateHandler.js +53 -2
- package/src/sap/fe/macros/table/mixin/TableAPIStateHandler.ts +55 -0
- package/src/sap/fe/macros/table/mixin/TableExport.js +22 -3
- package/src/sap/fe/macros/table/mixin/TableExport.ts +25 -4
- package/src/sap/fe/macros/table/mixin/TableHierarchy.js +5 -1
- package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +7 -0
- package/src/sap/fe/macros/table/mixin/TableSharing.js +4 -2
- package/src/sap/fe/macros/table/mixin/TableSharing.ts +10 -1
- package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +36 -10
- package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +44 -9
- package/src/sap/fe/macros/visualfilters/VisualFilter.js +5 -4
- package/src/sap/fe/macros/visualfilters/VisualFilter.tsx +3 -2
- package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.js +2 -3
- package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.ts +1 -2
|
@@ -2,14 +2,19 @@
|
|
|
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/fe/core/buildingBlocks/templating/BuildingBlockSupport", "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/converters/controls/Common/Form", "sap/fe/core/templating/DataModelPathHelper"], function (BuildingBlockSupport, BuildingBlockTemplatingBase, MetaModelConverter, Form, DataModelPathHelper) {
|
|
5
|
+
sap.ui.define(["sap/fe/core/buildingBlocks/templating/BuildingBlockSupport", "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor", "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/converters/controls/Common/Form", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/UIFormatters", "../CommonHelper", "../field/FieldTemplating", "./FormHelper"], function (BuildingBlockSupport, BuildingBlockTemplateProcessor, BuildingBlockTemplatingBase, MetaModelConverter, Form, StableIDHelper, DataModelPathHelper, UIFormatters, CommonHelper, FieldTemplating, FormHelper) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor10, _descriptor11, _descriptor12, _descriptor13, _descriptor14, _descriptor15, _descriptor16;
|
|
9
9
|
var _exports = {};
|
|
10
|
+
var getVisibleExpression = FieldTemplating.getVisibleExpression;
|
|
11
|
+
var isMultiValueField = UIFormatters.isMultiValueField;
|
|
12
|
+
var getRequiredExpressionForConnectedDataField = UIFormatters.getRequiredExpressionForConnectedDataField;
|
|
10
13
|
var getContextRelativeTargetObjectPath = DataModelPathHelper.getContextRelativeTargetObjectPath;
|
|
14
|
+
var enhanceDataModelPath = DataModelPathHelper.enhanceDataModelPath;
|
|
11
15
|
var createFormDefinition = Form.createFormDefinition;
|
|
12
16
|
var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
|
|
17
|
+
var xml = BuildingBlockTemplateProcessor.xml;
|
|
13
18
|
var defineBuildingBlock = BuildingBlockSupport.defineBuildingBlock;
|
|
14
19
|
var blockEvent = BuildingBlockSupport.blockEvent;
|
|
15
20
|
var blockAttribute = BuildingBlockSupport.blockAttribute;
|
|
@@ -36,12 +41,10 @@ sap.ui.define(["sap/fe/core/buildingBlocks/templating/BuildingBlockSupport", "sa
|
|
|
36
41
|
* />
|
|
37
42
|
* </pre>
|
|
38
43
|
* @private
|
|
39
|
-
* @experimental
|
|
40
44
|
*/
|
|
41
45
|
let FormContainerBlock = (_dec = defineBuildingBlock({
|
|
42
46
|
name: "FormContainer",
|
|
43
|
-
namespace: "sap.fe.macros"
|
|
44
|
-
fragment: "sap.fe.macros.form.FormContainer"
|
|
47
|
+
namespace: "sap.fe.macros"
|
|
45
48
|
}), _dec2 = blockAttribute({
|
|
46
49
|
type: "string"
|
|
47
50
|
}), _dec3 = blockAttribute({
|
|
@@ -150,10 +153,557 @@ sap.ui.define(["sap/fe/core/buildingBlocks/templating/BuildingBlockSupport", "sa
|
|
|
150
153
|
const oFormDefinition = createFormDefinition(oFacetDefinition, "true", oConverterContext);
|
|
151
154
|
_this.dataFieldCollection = oFormDefinition.formContainers[0].formElements;
|
|
152
155
|
}
|
|
156
|
+
// We need the view id for the form elements stable ids generation
|
|
157
|
+
_this.contentId = settings.viewId;
|
|
153
158
|
return _this;
|
|
154
159
|
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Returns the template for the FormContainer.
|
|
163
|
+
* @returns The XML template string.
|
|
164
|
+
*/
|
|
155
165
|
_exports = FormContainerBlock;
|
|
156
166
|
_inheritsLoose(FormContainerBlock, _BuildingBlockTemplat);
|
|
167
|
+
var _proto = FormContainerBlock.prototype;
|
|
168
|
+
_proto.getTemplate = function getTemplate() {
|
|
169
|
+
const overflowToolbarID = this.id ? StableIDHelper.generate([this.id, "FormActionsToolbar"]) : undefined;
|
|
170
|
+
const dataModelObject = getInvolvedDataModelObjects(this.contextPath, this.metaPath);
|
|
171
|
+
const bindingString = FormHelper.generateBindingExpression(this.navigationPath, dataModelObject);
|
|
172
|
+
return xml`
|
|
173
|
+
<f:FormContainer
|
|
174
|
+
xmlns="sap.m"
|
|
175
|
+
xmlns:f="sap.ui.layout.form"
|
|
176
|
+
xmlns:macro="sap.fe.macros"
|
|
177
|
+
xmlns:macroForm="sap.fe.macros.form"
|
|
178
|
+
xmlns:internalMacro="sap.fe.macros.internal"
|
|
179
|
+
xmlns:core="sap.ui.core"
|
|
180
|
+
xmlns:controls="sap.fe.macros.controls"
|
|
181
|
+
xmlns:dt="sap.ui.dt"
|
|
182
|
+
xmlns:macrodata="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"
|
|
183
|
+
xmlns:fpm="sap.fe.macros.fpm"
|
|
184
|
+
xmlns:template="http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1"
|
|
185
|
+
template:require="{
|
|
186
|
+
MODEL: 'sap/ui/model/odata/v4/AnnotationHelper',
|
|
187
|
+
ID: 'sap/fe/core/helpers/StableIdHelper',
|
|
188
|
+
COMMON: 'sap/fe/macros/CommonHelper',
|
|
189
|
+
FORM: 'sap/fe/macros/form/FormHelper',
|
|
190
|
+
UI: 'sap/fe/core/templating/UIFormatters',
|
|
191
|
+
DataField: 'sap/fe/core/templating/DataFieldFormatters',
|
|
192
|
+
FieldTemplating: 'sap/fe/macros/field/FieldTemplating',
|
|
193
|
+
Property: 'sap/fe/core/templating/PropertyFormatters',
|
|
194
|
+
FIELD: 'sap/fe/macros/field/FieldHelper',
|
|
195
|
+
MACRO: 'sap/fe/macros/MacroTemplating'
|
|
196
|
+
}"
|
|
197
|
+
|
|
198
|
+
core:require="{FormContainerRuntime: 'sap/fe/macros/form/FormContainerAPI'}"
|
|
199
|
+
dt:designtime="${this.designtimeSettings}"
|
|
200
|
+
id="${this.id || undefined}"
|
|
201
|
+
visible="${this.visible}"
|
|
202
|
+
macrodata:navigationPath="${this.navigationPath}"
|
|
203
|
+
macrodata:etName="${this.contextPath.getObject("./@sapui.name")}"
|
|
204
|
+
macrodata:UiHiddenPresent="${this.hasUiHiddenAnnotation}"
|
|
205
|
+
>
|
|
206
|
+
|
|
207
|
+
<template:if test="${this.title}">
|
|
208
|
+
<f:title>
|
|
209
|
+
<core:Title level="${this.titleLevel}" text="${this.title}" />
|
|
210
|
+
</f:title>
|
|
211
|
+
</template:if>
|
|
212
|
+
|
|
213
|
+
<template:if test="${this.actions}">
|
|
214
|
+
<template:then>
|
|
215
|
+
<f:toolbar>
|
|
216
|
+
<OverflowToolbar
|
|
217
|
+
id="${overflowToolbarID}"
|
|
218
|
+
${this.attr("binding", bindingString)}
|
|
219
|
+
>
|
|
220
|
+
<Title level="${this.titleLevel}" text="${this.title}" />
|
|
221
|
+
<ToolbarSpacer />
|
|
222
|
+
<template:repeat list="{actions>}" var="action">
|
|
223
|
+
<core:Fragment fragmentName="sap.fe.macros.form.FormActionButtons" type="XML" />
|
|
224
|
+
</template:repeat>
|
|
225
|
+
</OverflowToolbar>
|
|
226
|
+
</f:toolbar>
|
|
227
|
+
</template:then>
|
|
228
|
+
</template:if>
|
|
229
|
+
|
|
230
|
+
<f:dependents>
|
|
231
|
+
<macroForm:FormContainerAPI formContainerId="${this.id}" showDetails="{internal>showDetails}" />
|
|
232
|
+
</f:dependents>
|
|
233
|
+
|
|
234
|
+
<f:formElements>
|
|
235
|
+
${this.getTemplatedFormElements()}
|
|
236
|
+
</f:formElements>
|
|
237
|
+
|
|
238
|
+
</f:FormContainer>`;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Returns the templated form elements.
|
|
243
|
+
* @returns The XML string for the form elements.
|
|
244
|
+
*/;
|
|
245
|
+
_proto.getTemplatedFormElements = function getTemplatedFormElements() {
|
|
246
|
+
return xml`
|
|
247
|
+
<template:with path="dataFieldCollection>" var="formElements">
|
|
248
|
+
${this.getInnerTemplatedFormElements()}
|
|
249
|
+
</template:with>`;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Returns the inner templated form elements, including DataPoint and Contact templates.
|
|
254
|
+
* @returns The XML string for the inner form elements.
|
|
255
|
+
*/;
|
|
256
|
+
_proto.getInnerTemplatedFormElements = function getInnerTemplatedFormElements() {
|
|
257
|
+
let getDataPointTemplate = "";
|
|
258
|
+
if (this.dataFieldCollection && this.dataFieldCollection.length > 0) {
|
|
259
|
+
// We need to consider the first element that has an annotationPath
|
|
260
|
+
const firstElementWithAnnotationPath = this.dataFieldCollection.find(df => !!df.annotationPath);
|
|
261
|
+
let idPrefix = "";
|
|
262
|
+
const isEditableHeader = this.id?.includes("HeaderFacet::FormContainer") === true;
|
|
263
|
+
let formElementId = "undefined";
|
|
264
|
+
if (this.id) {
|
|
265
|
+
if (isEditableHeader) {
|
|
266
|
+
formElementId = `${this.id}::FormElement`;
|
|
267
|
+
idPrefix = `${this.id}::FormElement`;
|
|
268
|
+
} else {
|
|
269
|
+
formElementId = `${StableIDHelper.generate([this.id, "FormElement", this.dataFieldCollection[0].key])}`;
|
|
270
|
+
idPrefix = `${StableIDHelper.generate([this.id, "FormElement", this.dataFieldCollection[0].key])}`;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
if (firstElementWithAnnotationPath?.annotationPath) {
|
|
274
|
+
const computedDataModelObject = getInvolvedDataModelObjects(this.contextPath.getModel().createBindingContext(firstElementWithAnnotationPath?.annotationPath || ""));
|
|
275
|
+
const bindingString = FormHelper.generateBindingExpression(this.navigationPath, computedDataModelObject);
|
|
276
|
+
const designtime = computedDataModelObject?.targetObject?.annotations?.UI?.AdaptationHidden ? "not-adaptable-tree" : "sap/fe/macros/form/FormElement.designtime";
|
|
277
|
+
getDataPointTemplate = xml`
|
|
278
|
+
<template:then>
|
|
279
|
+
<template:with path="formElements>0/annotationPath" var="dataPoint">
|
|
280
|
+
<f:FormElement
|
|
281
|
+
dt:designtime="${designtime}"
|
|
282
|
+
id="${formElementId}"
|
|
283
|
+
label="{dataPoint>@@FIELD.computeLabelText}"
|
|
284
|
+
visible="${getVisibleExpression(computedDataModelObject)}"
|
|
285
|
+
${this.attr("binding", bindingString)}
|
|
286
|
+
>
|
|
287
|
+
<f:fields>
|
|
288
|
+
<macro:Field
|
|
289
|
+
idPrefix="${idPrefix}"
|
|
290
|
+
vhIdPrefix="${this.id ? StableIDHelper.generate([this.id, "FieldValueHelp"]) : ""}"
|
|
291
|
+
contextPath="${this.entitySet?.getPath()}"
|
|
292
|
+
metaPath="${this.dataFieldCollection[0].annotationPath}"
|
|
293
|
+
editMode="${this.displayMode === true ? "Display" : undefined}"
|
|
294
|
+
onChange="${this.onChange}"
|
|
295
|
+
>
|
|
296
|
+
<formatOptions textAlignMode="Form" showEmptyIndicator="true" />
|
|
297
|
+
</macro:Field>
|
|
298
|
+
</f:fields>
|
|
299
|
+
</f:FormElement>
|
|
300
|
+
</template:with>
|
|
301
|
+
</template:then>
|
|
302
|
+
`;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
const getContactTemplate = xml`
|
|
306
|
+
<template:elseif
|
|
307
|
+
test="{= \${formElements>0/annotationPath}.indexOf('com.sap.vocabularies.Communication.v1.Contact') > -1 }"
|
|
308
|
+
>
|
|
309
|
+
<template:with path="formElements>0/annotationPath" var="metaPath">
|
|
310
|
+
<f:FormElement
|
|
311
|
+
dt:designtime="{= \${metaPath>./@com.sap.vocabularies.UI.v1.AdaptationHidden} ? 'not-adaptable-tree' : 'sap/fe/macros/form/FormElement.designtime' }"
|
|
312
|
+
binding="{= FORM.generateBindingExpression(\${this.navigationPath},\${contextPath>@@UI.getDataModelObjectPath})}"
|
|
313
|
+
>
|
|
314
|
+
<f:label>
|
|
315
|
+
<Label
|
|
316
|
+
text="{metaPath>fn/$Path@com.sap.vocabularies.Common.v1.Label}"
|
|
317
|
+
visible="{= FieldTemplating.getVisibleExpression(\${dataField>@@UI.getDataModelObjectPath})}"
|
|
318
|
+
>
|
|
319
|
+
<layoutData>
|
|
320
|
+
<f:ColumnElementData cellsLarge="12" />
|
|
321
|
+
</layoutData>
|
|
322
|
+
</Label>
|
|
323
|
+
</f:label>
|
|
324
|
+
<f:fields>
|
|
325
|
+
<macro:Contact
|
|
326
|
+
metaPath="{metaPath>@@COMMON.getMetaPath}"
|
|
327
|
+
contextPath="{contextPath>@@COMMON.getMetaPath}"
|
|
328
|
+
visible="true"
|
|
329
|
+
/>
|
|
330
|
+
</f:fields>
|
|
331
|
+
</f:FormElement>
|
|
332
|
+
</template:with>
|
|
333
|
+
</template:elseif>`;
|
|
334
|
+
return xml`
|
|
335
|
+
<template:if test="{= \${formElements>0/annotationPath}.indexOf('com.sap.vocabularies.UI.v1.DataPoint') > -1 }">
|
|
336
|
+
${getDataPointTemplate}
|
|
337
|
+
${getContactTemplate}
|
|
338
|
+
<template:else>
|
|
339
|
+
${this.getDataFieldsForAnnotations()}
|
|
340
|
+
</template:else>
|
|
341
|
+
</template:if>
|
|
342
|
+
`;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Generates the template for a form element with connected fields.
|
|
347
|
+
* @param formElement The form element.
|
|
348
|
+
* @returns The XML string for the connected fields form element.
|
|
349
|
+
*/;
|
|
350
|
+
_proto.getConnectedFieldsFormElement = function getConnectedFieldsFormElement(formElement) {
|
|
351
|
+
let connectedFieldElements = "";
|
|
352
|
+
for (const connectedField of formElement.connectedFields) {
|
|
353
|
+
const model = this.contextPath.getModel();
|
|
354
|
+
const tempName = connectedField.originalObject?.fullyQualifiedName;
|
|
355
|
+
const path = tempName?.substring(tempName.lastIndexOf("/") + 1);
|
|
356
|
+
const bindingContext = model.createBindingContext(formElement.annotationPath + "Target/$AnnotationPath/Data/" + path);
|
|
357
|
+
const delimiter = CommonHelper.getDelimiter(connectedField.originalTemplate ?? "");
|
|
358
|
+
const notLastIndexCondition = formElement.connectedFields.indexOf(connectedField) !== formElement.connectedFields.length - 1 ? xml`<Text
|
|
359
|
+
text="${delimiter}"
|
|
360
|
+
class="sapUiSmallMarginBeginEnd"
|
|
361
|
+
width="100%"
|
|
362
|
+
/>` : "";
|
|
363
|
+
const computedIdPrefix = this.id ? StableIDHelper.generate([this.id, "SemanticFormElement", formElement.key, connectedField.originalObject?.Value.path]) : "";
|
|
364
|
+
const computedVhIdPrefix = this.id ? StableIDHelper.generate([this.id, formElement.key, "FieldValueHelp"]) : "";
|
|
365
|
+
let connectedFieldElement = "";
|
|
366
|
+
connectedFieldElement = xml`
|
|
367
|
+
<macro:Field
|
|
368
|
+
idPrefix="${computedIdPrefix}"
|
|
369
|
+
vhIdPrefix="${computedVhIdPrefix}"
|
|
370
|
+
contextPath="${this.entitySet?.getPath()}"
|
|
371
|
+
metaPath="${bindingContext.getPath()}"
|
|
372
|
+
onChange="${this.onChange}"
|
|
373
|
+
ariaLabelledBy="${this.id ? StableIDHelper.generate([this.id, "SemanticFormElementLabel", formElement.key]) : ""}"
|
|
374
|
+
>
|
|
375
|
+
<formatOptions
|
|
376
|
+
textLinesEdit="${formElement.formatOptions?.textLinesEdit}"
|
|
377
|
+
textMaxLines="${formElement.formatOptions?.textMaxLines}"
|
|
378
|
+
textMaxCharactersDisplay="${formElement.formatOptions?.textMaxCharactersDisplay}"
|
|
379
|
+
textMaxLength="${formElement.formatOptions?.textMaxLength}"
|
|
380
|
+
textExpandBehaviorDisplay="${formElement.formatOptions?.textExpandBehaviorDisplay}"
|
|
381
|
+
textAlignMode="Form"
|
|
382
|
+
showEmptyIndicator="true"
|
|
383
|
+
fieldEditStyle="${formElement.formatOptions?.fieldEditStyle}"
|
|
384
|
+
radioButtonsHorizontalLayout="${formElement.formatOptions?.radioButtonsHorizontalLayout}"
|
|
385
|
+
/>
|
|
386
|
+
<macro:layoutData>
|
|
387
|
+
<FlexItemData growFactor="{= %{ui>/isEditable} ? 1 : 0}" />
|
|
388
|
+
</macro:layoutData>
|
|
389
|
+
</macro:Field>
|
|
390
|
+
${notLastIndexCondition}
|
|
391
|
+
`;
|
|
392
|
+
connectedFieldElements += connectedFieldElement;
|
|
393
|
+
}
|
|
394
|
+
const dataModelObjectForConnectedFields = getInvolvedDataModelObjects(this.contextPath.getModel().createBindingContext(formElement.annotationPath ?? ""));
|
|
395
|
+
let formElementId = "";
|
|
396
|
+
if (this.id) {
|
|
397
|
+
if (this.contentId) {
|
|
398
|
+
formElementId = `${this.contentId}--${StableIDHelper.generate([this.id, "SemanticFormElement", formElement.key])}`;
|
|
399
|
+
} else {
|
|
400
|
+
formElementId = `${StableIDHelper.generate([this.id, "SemanticFormElement", formElement.key])}`;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
const visibleExpression = formElement.isPartOfPreview ? getVisibleExpression(dataModelObjectForConnectedFields) : "{= ${internal>showDetails} === true}";
|
|
404
|
+
const bindingString = FormHelper.generateBindingExpression(this.navigationPath, dataModelObjectForConnectedFields);
|
|
405
|
+
const targetObject = dataModelObjectForConnectedFields?.targetObject?.Target?.$target;
|
|
406
|
+
const designtime = dataModelObjectForConnectedFields?.targetObject?.annotations?.UI?.AdaptationHidden ? "not-adaptable-tree" : "sap/fe/macros/form/FormElement.designtime";
|
|
407
|
+
const isRequired = getRequiredExpressionForConnectedDataField(dataModelObjectForConnectedFields)?.toString();
|
|
408
|
+
return xml`
|
|
409
|
+
<f:FormElement
|
|
410
|
+
xmlns:f="sap.ui.layout.form"
|
|
411
|
+
dt:designtime="${designtime}"
|
|
412
|
+
id="${formElementId}"
|
|
413
|
+
visible="${visibleExpression}"
|
|
414
|
+
${this.attr("binding", bindingString)}
|
|
415
|
+
>
|
|
416
|
+
<f:label>
|
|
417
|
+
<Label
|
|
418
|
+
text="${targetObject?.Label ?? formElement.label}"
|
|
419
|
+
id="${this.id ? StableIDHelper.generate([this.id, "SemanticFormElementLabel", formElement.key]) : ""}"
|
|
420
|
+
|
|
421
|
+
/>
|
|
422
|
+
</f:label>
|
|
423
|
+
<f:fields>
|
|
424
|
+
<controls:FieldWrapper required="${isRequired}">
|
|
425
|
+
<HBox wrap="Wrap">
|
|
426
|
+
${connectedFieldElements}
|
|
427
|
+
</HBox>
|
|
428
|
+
</controls:FieldWrapper>
|
|
429
|
+
</f:fields>
|
|
430
|
+
</f:FormElement>
|
|
431
|
+
`;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* Generates the template for a form element representing a multivalue field.
|
|
436
|
+
* @param formElement The form element.
|
|
437
|
+
* @returns The XML string for the multi-value field form element.
|
|
438
|
+
*/;
|
|
439
|
+
_proto.getMultiValueFieldFormElement = function getMultiValueFieldFormElement(formElement) {
|
|
440
|
+
const computedDataModelObject = getInvolvedDataModelObjects(this.contextPath.getModel().createBindingContext(formElement.annotationPath ?? ""));
|
|
441
|
+
const visibleExpression = formElement.isPartOfPreview ? getVisibleExpression(computedDataModelObject) : "{= ${internal>showDetails} === true}";
|
|
442
|
+
const bindingString = FormHelper.generateBindingExpression(this.navigationPath, computedDataModelObject);
|
|
443
|
+
const formElementId = this.id ? `${StableIDHelper.generate([this.id, "FormElement", formElement.key])}` : "undefined";
|
|
444
|
+
const multiValueFieldId = this.id ? `${StableIDHelper.generate([this.id, "FormElement", formElement.key, "MultiValueField"])}` : "undefined";
|
|
445
|
+
const vhIdPrefix = this.id ? StableIDHelper.generate([this.id, "FieldValueHelp"]) : "";
|
|
446
|
+
const designtime = computedDataModelObject?.targetObject?.annotations?.UI?.AdaptationHidden ? "not-adaptable-tree" : "sap/fe/macros/form/FormElement.designtime";
|
|
447
|
+
return xml`
|
|
448
|
+
<f:FormElement
|
|
449
|
+
xmlns:macros="sap.fe.macros"
|
|
450
|
+
xmlns:multivaluefield="sap.fe.macros.multivaluefield"
|
|
451
|
+
dt:designtime="${designtime}"
|
|
452
|
+
id="${formElementId}"
|
|
453
|
+
label="${formElement.label}"
|
|
454
|
+
visible="${visibleExpression}"
|
|
455
|
+
${this.attr("binding", bindingString)}
|
|
456
|
+
>
|
|
457
|
+
<f:fields>
|
|
458
|
+
<macros:MultiValueField
|
|
459
|
+
id="${multiValueFieldId}"
|
|
460
|
+
vhIdPrefix="${vhIdPrefix}"
|
|
461
|
+
contextPath="${this.entitySet?.getPath()}"
|
|
462
|
+
metaPath="${formElement.annotationPath}"
|
|
463
|
+
>
|
|
464
|
+
<macros:formatOptions>
|
|
465
|
+
<multivaluefield:FormatOptions showEmptyIndicator="true" />
|
|
466
|
+
</macros:formatOptions>
|
|
467
|
+
</macros:MultiValueField>
|
|
468
|
+
</f:fields>
|
|
469
|
+
</f:FormElement>`;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* Generates the template for form elements representing a checkbox group.
|
|
474
|
+
* @param formElement The form element.
|
|
475
|
+
* @returns The XML string for the checkbox group form elements.
|
|
476
|
+
*/;
|
|
477
|
+
_proto.getFieldGroupFormElement = function getFieldGroupFormElement(formElement) {
|
|
478
|
+
let fieldGroupElements = "";
|
|
479
|
+
//We template each element of the checkbox group
|
|
480
|
+
for (const groupElement of formElement.fieldGroupElements) {
|
|
481
|
+
const model = this.contextPath.getModel();
|
|
482
|
+
const tempName = groupElement.fullyQualifiedName;
|
|
483
|
+
const path = tempName?.substring(tempName.lastIndexOf("/") + 1);
|
|
484
|
+
const bindingContext = model.createBindingContext(formElement.annotationPath + "Target/$AnnotationPath/Data/" + path);
|
|
485
|
+
const groupElementDataModelObject = getInvolvedDataModelObjects(bindingContext);
|
|
486
|
+
const computedIdPrefix = this.id ? `${StableIDHelper.generate([this.id, "CheckBoxGroup", formElement.key, groupElementDataModelObject.targetObject?.Value?.path])}` : "";
|
|
487
|
+
const isBooleanFieldGroup = groupElementDataModelObject.targetObject?.Value?.$target?.type === "Edm.Boolean";
|
|
488
|
+
const fieldGroupElement = isBooleanFieldGroup ? xml`
|
|
489
|
+
<macro:Field
|
|
490
|
+
idPrefix="${computedIdPrefix}"
|
|
491
|
+
contextPath="${this.entitySet?.getPath()}"
|
|
492
|
+
metaPath="${bindingContext.getPath()}"
|
|
493
|
+
onChange="${this.onChange}"
|
|
494
|
+
ariaLabelledBy="${this.id ? StableIDHelper.generate([this.id, "FieldGroupFormElementLabel", formElement.key]) : ""}"
|
|
495
|
+
>
|
|
496
|
+
<formatOptions isFieldGroupItem="true" textAlignMode="Form" />
|
|
497
|
+
</macro:Field>
|
|
498
|
+
` : "";
|
|
499
|
+
fieldGroupElements += fieldGroupElement;
|
|
500
|
+
}
|
|
501
|
+
const computedDataModelObject = getInvolvedDataModelObjects(this.contextPath.getModel().createBindingContext(formElement.annotationPath ?? ""));
|
|
502
|
+
const visibleExpression = formElement.isPartOfPreview ? getVisibleExpression(computedDataModelObject) : "{= ${internal>showDetails} === true}";
|
|
503
|
+
const bindingString = FormHelper.generateBindingExpression(this.navigationPath, computedDataModelObject);
|
|
504
|
+
let fieldGroupFormElementId = "";
|
|
505
|
+
let labelID = "";
|
|
506
|
+
if (this.id) {
|
|
507
|
+
if (this.contentId) {
|
|
508
|
+
fieldGroupFormElementId = `${this.contentId}--${StableIDHelper.generate([this.id, "FieldGroupFormElement", formElement.key])}`;
|
|
509
|
+
labelID = `${this.contentId}--${StableIDHelper.generate([this.id, "FieldGroupFormElementLabel", formElement.key])}`;
|
|
510
|
+
} else {
|
|
511
|
+
fieldGroupFormElementId = `${StableIDHelper.generate([this.id, "FieldGroupFormElement", formElement.key])}`;
|
|
512
|
+
labelID = `${StableIDHelper.generate([this.id, "FieldGroupFormElementLabel", formElement.key])}`;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
const targetObject = computedDataModelObject?.targetObject?.Target?.$target;
|
|
516
|
+
const designtime = computedDataModelObject?.targetObject?.annotations?.UI?.AdaptationHidden ? "not-adaptable-tree" : "sap/fe/macros/form/FormElement.designtime";
|
|
517
|
+
return xml`
|
|
518
|
+
<f:FormElement
|
|
519
|
+
xmlns:f="sap.ui.layout.form"
|
|
520
|
+
dt:designtime="${designtime}"
|
|
521
|
+
id="${fieldGroupFormElementId}"
|
|
522
|
+
visible="${visibleExpression}"
|
|
523
|
+
${this.attr("binding", bindingString)}
|
|
524
|
+
>
|
|
525
|
+
<f:label>
|
|
526
|
+
<Label
|
|
527
|
+
text="${targetObject?.Label ?? formElement.label}"
|
|
528
|
+
id="${labelID}"
|
|
529
|
+
/>
|
|
530
|
+
</f:label>
|
|
531
|
+
<f:fields>
|
|
532
|
+
<controls:RequiredFlexBox>
|
|
533
|
+
<FlexBox
|
|
534
|
+
direction="${formElement.formatOptions?.fieldGroupHorizontalLayout === true ? "Row" : "Column"}"
|
|
535
|
+
wrap="Wrap"
|
|
536
|
+
columnGap="1rem"
|
|
537
|
+
>
|
|
538
|
+
<items>
|
|
539
|
+
${fieldGroupElements}
|
|
540
|
+
</items>
|
|
541
|
+
</FlexBox>
|
|
542
|
+
</controls:RequiredFlexBox>
|
|
543
|
+
</f:fields>
|
|
544
|
+
</f:FormElement>
|
|
545
|
+
`;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
/**
|
|
549
|
+
* Generates the template for a form element representing a field.
|
|
550
|
+
* @param formElement The form element.
|
|
551
|
+
* @returns The XML string for the field form element.
|
|
552
|
+
*/;
|
|
553
|
+
_proto.getFieldFormElement = function getFieldFormElement(formElement) {
|
|
554
|
+
const computedDataModelObject = getInvolvedDataModelObjects(this.contextPath.getModel().createBindingContext(formElement.annotationPath ?? ""));
|
|
555
|
+
const bindingString = FormHelper.generateBindingExpression(this.navigationPath, computedDataModelObject);
|
|
556
|
+
const computedVhIdPrefix = StableIDHelper.generate([this.id, "FieldValueHelp"]);
|
|
557
|
+
let formElementId = "undefined";
|
|
558
|
+
const visibleExpression = formElement.isPartOfPreview ? getVisibleExpression(computedDataModelObject) : "{= ${internal>showDetails} === true}";
|
|
559
|
+
const computedIdPrefix = this.id ? `${StableIDHelper.generate([this.id, "FormElement", formElement.key])}` : "";
|
|
560
|
+
if (this.id) {
|
|
561
|
+
if (this.contentId) {
|
|
562
|
+
formElementId = `${this.contentId}--${StableIDHelper.generate([this.id, "FormElement", formElement.key])}`;
|
|
563
|
+
} else {
|
|
564
|
+
formElementId = `${StableIDHelper.generate([this.id, "FormElement", formElement.key])}`;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
const designtime = computedDataModelObject?.targetObject?.annotations?.UI?.AdaptationHidden ? "not-adaptable-tree" : "sap/fe/macros/form/FormElement.designtime";
|
|
568
|
+
return xml`
|
|
569
|
+
<f:FormElement
|
|
570
|
+
xmlns:f="sap.ui.layout.form"
|
|
571
|
+
dt:designtime="${designtime}"
|
|
572
|
+
id="${formElementId}"
|
|
573
|
+
label="${formElement.label}"
|
|
574
|
+
visible="${visibleExpression}"
|
|
575
|
+
${this.attr("binding", bindingString)}
|
|
576
|
+
>
|
|
577
|
+
<f:fields>
|
|
578
|
+
<macro:Field
|
|
579
|
+
idPrefix="${computedIdPrefix}"
|
|
580
|
+
vhIdPrefix="${computedVhIdPrefix}"
|
|
581
|
+
contextPath="${this.contextPath.getPath()}"
|
|
582
|
+
metaPath="${formElement.annotationPath}"
|
|
583
|
+
onChange="${this.onChange}"
|
|
584
|
+
readOnly="${formElement.readOnly}"
|
|
585
|
+
semanticObject="${formElement.semanticObject}"
|
|
586
|
+
>
|
|
587
|
+
<formatOptions
|
|
588
|
+
textLinesEdit="${formElement.formatOptions?.textLinesEdit}"
|
|
589
|
+
textMaxLines="${formElement.formatOptions?.textMaxLines}"
|
|
590
|
+
textMaxLength="${formElement.formatOptions?.textMaxLength}"
|
|
591
|
+
textMaxCharactersDisplay="${formElement.formatOptions?.textMaxCharactersDisplay}"
|
|
592
|
+
textExpandBehaviorDisplay="${formElement.formatOptions?.textExpandBehaviorDisplay}"
|
|
593
|
+
textAlignMode="Form"
|
|
594
|
+
showEmptyIndicator="true"
|
|
595
|
+
fieldEditStyle="${formElement.formatOptions?.fieldEditStyle}"
|
|
596
|
+
radioButtonsHorizontalLayout="${formElement.formatOptions?.radioButtonsHorizontalLayout}"
|
|
597
|
+
dateTimePattern="${formElement.formatOptions?.pattern}"
|
|
598
|
+
useRadioButtonsForBoolean="${formElement.formatOptions?.useRadioButtonsForBoolean}"
|
|
599
|
+
/>
|
|
600
|
+
</macro:Field>
|
|
601
|
+
</f:fields>
|
|
602
|
+
</f:FormElement>
|
|
603
|
+
`;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* Generates the template for a custom form element.
|
|
608
|
+
* @param formElement The custom form element.
|
|
609
|
+
* @returns The XML string for the custom form element.
|
|
610
|
+
*/;
|
|
611
|
+
_proto.getCustomFormElement = function getCustomFormElement(formElement) {
|
|
612
|
+
const propertyPath = this.contextPath.getPath() + "/" + formElement.propertyPath;
|
|
613
|
+
const computedDataModelObject = getInvolvedDataModelObjects(this.contextPath.getModel().createBindingContext(propertyPath));
|
|
614
|
+
const bindingString = FormHelper.generateBindingExpression(this.navigationPath, computedDataModelObject);
|
|
615
|
+
let formElementId = "";
|
|
616
|
+
if (this.id) {
|
|
617
|
+
if (this.contentId) {
|
|
618
|
+
formElementId = `${this.contentId}--${StableIDHelper.generate([this.id, formElement.id])}`;
|
|
619
|
+
} else {
|
|
620
|
+
formElementId = `${StableIDHelper.generate([this.id, formElement.id])}`;
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
const designtime = computedDataModelObject?.targetObject?.annotations?.UI?.AdaptationHidden ? "not-adaptable-tree" : "sap/fe/macros/form/FormElement.designtime";
|
|
624
|
+
const formElementKey = StableIDHelper.generate([this.id, formElement.key]);
|
|
625
|
+
return xml`
|
|
626
|
+
<f:FormElement
|
|
627
|
+
dt:designtime="${designtime}"
|
|
628
|
+
id="${formElementId}"
|
|
629
|
+
label="${formElement.label}"
|
|
630
|
+
visible="${formElement.visible}"
|
|
631
|
+
${this.attr("binding", bindingString)}
|
|
632
|
+
>
|
|
633
|
+
<f:fields>
|
|
634
|
+
<macroForm:CustomFormElement
|
|
635
|
+
metaPath="${formElement.propertyPath}"
|
|
636
|
+
contextPath="${this.contextPath.getPath()}"
|
|
637
|
+
formElementKey="${formElementKey}"
|
|
638
|
+
>
|
|
639
|
+
<fpm:CustomFragment
|
|
640
|
+
id="${formElementKey}"
|
|
641
|
+
fragmentName="${formElement.template}"
|
|
642
|
+
contextPath="${this.contextPath.getPath()}"
|
|
643
|
+
/>
|
|
644
|
+
</macroForm:CustomFormElement>
|
|
645
|
+
</f:fields>
|
|
646
|
+
</f:FormElement>
|
|
647
|
+
`;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
/**
|
|
651
|
+
* Returns the template for a slot column for the given form element.
|
|
652
|
+
* @param formElement The form element.
|
|
653
|
+
* @returns The XML string for the slot column.
|
|
654
|
+
*/;
|
|
655
|
+
_proto.getSlotColumn = function getSlotColumn(formElement) {
|
|
656
|
+
return xml`<slot name="${formElement.key}" />`;
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
/**
|
|
660
|
+
* Determines if the given data field is a multivalue field.
|
|
661
|
+
* @param dataField The data field to check.
|
|
662
|
+
* @returns True if the data field is a multivalue field, false otherwise.
|
|
663
|
+
*/;
|
|
664
|
+
_proto.isMultiValueDataField = function isMultiValueDataField(dataField) {
|
|
665
|
+
let isMultiValueFieldCondition = false;
|
|
666
|
+
if (dataField.annotationPath) {
|
|
667
|
+
const bindingContext = this.contextPath.getModel().createBindingContext(dataField.annotationPath);
|
|
668
|
+
const valuePath = bindingContext.getObject()?.Value?.$Path;
|
|
669
|
+
if (valuePath) {
|
|
670
|
+
isMultiValueFieldCondition = isMultiValueField(enhanceDataModelPath(getInvolvedDataModelObjects(bindingContext), valuePath));
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
return isMultiValueFieldCondition;
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
/**
|
|
677
|
+
* Generates the template for all data fields for annotations.
|
|
678
|
+
* @returns The XML string for the data fields.
|
|
679
|
+
*/;
|
|
680
|
+
_proto.getDataFieldsForAnnotations = function getDataFieldsForAnnotations() {
|
|
681
|
+
let returnString = "";
|
|
682
|
+
if (this.dataFieldCollection !== undefined) {
|
|
683
|
+
for (const dataField of this.dataFieldCollection) {
|
|
684
|
+
switch (dataField.type) {
|
|
685
|
+
case "Annotation":
|
|
686
|
+
if (dataField.connectedFields && dataField.connectedFields.length > 0) {
|
|
687
|
+
returnString += this.getConnectedFieldsFormElement(dataField);
|
|
688
|
+
} else if (this.isMultiValueDataField(dataField)) {
|
|
689
|
+
returnString += this.getMultiValueFieldFormElement(dataField);
|
|
690
|
+
} else if (dataField.fieldGroupElements && dataField.fieldGroupElements.length > 0) {
|
|
691
|
+
returnString += this.getFieldGroupFormElement(dataField);
|
|
692
|
+
} else {
|
|
693
|
+
returnString += this.getFieldFormElement(dataField);
|
|
694
|
+
}
|
|
695
|
+
break;
|
|
696
|
+
case "Default":
|
|
697
|
+
returnString += this.getCustomFormElement(dataField);
|
|
698
|
+
break;
|
|
699
|
+
default:
|
|
700
|
+
returnString += this.getSlotColumn(dataField);
|
|
701
|
+
break;
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
return xml`${returnString}`;
|
|
706
|
+
};
|
|
157
707
|
return FormContainerBlock;
|
|
158
708
|
}(BuildingBlockTemplatingBase), _descriptor = _applyDecoratedDescriptor(_class2.prototype, "id", [_dec2], {
|
|
159
709
|
configurable: true,
|
|
@@ -247,4 +797,4 @@ sap.ui.define(["sap/fe/core/buildingBlocks/templating/BuildingBlockSupport", "sa
|
|
|
247
797
|
_exports = FormContainerBlock;
|
|
248
798
|
return _exports;
|
|
249
799
|
}, false);
|
|
250
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGb3JtQ29udGFpbmVyQmxvY2siLCJfZGVjIiwiZGVmaW5lQnVpbGRpbmdCbG9jayIsIm5hbWUiLCJuYW1lc3BhY2UiLCJmcmFnbWVudCIsIl9kZWMyIiwiYmxvY2tBdHRyaWJ1dGUiLCJ0eXBlIiwiX2RlYzMiLCJyZXF1aXJlZCIsImlzUHVibGljIiwiZXhwZWN0ZWRUeXBlcyIsIl9kZWM0IiwiX2RlYzUiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsIl9kZWMxMSIsIl9kZWMxMiIsIl9kZWMxMyIsIl9kZWMxNCIsIl9kZWMxNSIsIl9kZWMxNiIsImJsb2NrQWdncmVnYXRpb24iLCJfZGVjMTciLCJibG9ja0V2ZW50IiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9CdWlsZGluZ0Jsb2NrVGVtcGxhdCIsInByb3BzIiwiZXh0ZXJuYWxDb25maWd1cmF0aW9uIiwic2V0dGluZ3MiLCJfdGhpcyIsImNhbGwiLCJfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSIsIl9kZXNjcmlwdG9yIiwiX2Rlc2NyaXB0b3IyIiwiX2Rlc2NyaXB0b3IzIiwiX2Rlc2NyaXB0b3I0IiwiX2Rlc2NyaXB0b3I1IiwiX2Rlc2NyaXB0b3I2IiwiX2Rlc2NyaXB0b3I3IiwiX2Rlc2NyaXB0b3I4IiwiX2Rlc2NyaXB0b3I5IiwiX2Rlc2NyaXB0b3IxMCIsIl9kZXNjcmlwdG9yMTEiLCJfZGVzY3JpcHRvcjEyIiwiX2Rlc2NyaXB0b3IxMyIsIl9kZXNjcmlwdG9yMTQiLCJfZGVzY3JpcHRvcjE1IiwiX2Rlc2NyaXB0b3IxNiIsImVudGl0eVNldCIsImNvbnRleHRQYXRoIiwiZm9ybUVsZW1lbnRzIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsIm9Db250ZXh0T2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsIm1ldGFQYXRoIiwibUV4dHJhU2V0dGluZ3MiLCJvRmFjZXREZWZpbml0aW9uIiwidGFyZ2V0T2JqZWN0IiwiJFR5cGUiLCJMYWJlbCIsIlRhcmdldCIsIiR0YXJnZXQiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJwYXRoIiwidGVybSIsInZhbHVlIiwiZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCIsImFubm90YXRpb25zIiwiZmllbGRzIiwib0NvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0IiwidW5kZWZpbmVkIiwib0Zvcm1EZWZpbml0aW9uIiwiY3JlYXRlRm9ybURlZmluaXRpb24iLCJkYXRhRmllbGRDb2xsZWN0aW9uIiwiZm9ybUNvbnRhaW5lcnMiLCJfZXhwb3J0cyIsIl9pbmhlcml0c0xvb3NlIiwiQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlIiwiX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciIsInByb3RvdHlwZSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImluaXRpYWxpemVyIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJGb3JtQ29udGFpbmVyLmJsb2NrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVmZXJlbmNlRmFjZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIHsgUHJvcGVydGllc09mIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHtcblx0YmxvY2tBZ2dyZWdhdGlvbixcblx0YmxvY2tBdHRyaWJ1dGUsXG5cdGJsb2NrRXZlbnQsXG5cdGRlZmluZUJ1aWxkaW5nQmxvY2tcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncyB9IGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL0J1aWxkaW5nQmxvY2tUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2VcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBCYXNlQWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL0FjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBGb3JtRWxlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9Gb3JtXCI7XG5pbXBvcnQgeyBjcmVhdGVGb3JtRGVmaW5pdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9Gb3JtXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYWJsZU9iamVjdCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcblxuLyoqXG4gKiBCdWlsZGluZyBibG9jayBmb3IgY3JlYXRpbmcgYSBGb3JtQ29udGFpbmVyIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBPRGF0YSBWNCBtZXRhZGF0YS5cbiAqXG4gKlxuICogVXNhZ2UgZXhhbXBsZTpcbiAqIDxwcmU+XG4gKiAmbHQ7bWFjcm9zOkZvcm1Db250YWluZXJcbiAqIGlkPVwiU29tZUlkXCJcbiAqIGVudGl0eVNldD1cIntlbnRpdHlTZXQ+fVwiXG4gKiBkYXRhRmllbGRDb2xsZWN0aW9uID1cIntkYXRhRmllbGRDb2xsZWN0aW9uPn1cIlxuICogdGl0bGU9XCJzb21lVGl0bGVcIlxuICogbmF2aWdhdGlvblBhdGg9XCJ7VG9TdXBwbGllcn1cIlxuICogdmlzaWJsZT10cnVlXG4gKiBvbkNoYW5nZT1cIi5oYW5kbGVycy5vbkZpZWxkVmFsdWVDaGFuZ2VcIlxuICogLyZndDtcbiAqIDwvcHJlPlxuICogQHByaXZhdGVcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuQGRlZmluZUJ1aWxkaW5nQmxvY2soeyBuYW1lOiBcIkZvcm1Db250YWluZXJcIiwgbmFtZXNwYWNlOiBcInNhcC5mZS5tYWNyb3NcIiwgZnJhZ21lbnQ6IFwic2FwLmZlLm1hY3Jvcy5mb3JtLkZvcm1Db250YWluZXJcIiB9KVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9ybUNvbnRhaW5lckJsb2NrIGV4dGVuZHMgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlIHtcblx0QGJsb2NrQXR0cmlidXRlKHsgdHlwZTogXCJzdHJpbmdcIiB9KVxuXHRpZD86IHN0cmluZztcblxuXHRAYmxvY2tBdHRyaWJ1dGUoe1xuXHRcdHR5cGU6IFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIixcblx0XHRyZXF1aXJlZDogdHJ1ZSxcblx0XHRpc1B1YmxpYzogdHJ1ZSxcblx0XHRleHBlY3RlZFR5cGVzOiBbXCJFbnRpdHlTZXRcIiwgXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiwgXCJFbnRpdHlUeXBlXCIsIFwiU2luZ2xldG9uXCJdXG5cdH0pXG5cdGNvbnRleHRQYXRoITogQ29udGV4dDtcblxuXHRAYmxvY2tBdHRyaWJ1dGUoe1xuXHRcdHR5cGU6IFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIlxuXHR9KVxuXHRlbnRpdHlTZXQ/OiBDb250ZXh0O1xuXG5cdEBibG9ja0F0dHJpYnV0ZSh7XG5cdFx0dHlwZTogXCJzYXAudWkubW9kZWwuQ29udGV4dFwiLFxuXHRcdGlzUHVibGljOiB0cnVlLFxuXHRcdHJlcXVpcmVkOiB0cnVlXG5cdH0pXG5cdG1ldGFQYXRoITogQ29udGV4dDtcblxuXHQvKipcblx0ICogTWV0YWRhdGEgcGF0aCB0byB0aGUgZGF0YUZpZWxkQ29sbGVjdGlvblxuXHQgKi9cblx0QGJsb2NrQXR0cmlidXRlKHtcblx0XHR0eXBlOiBcImFycmF5XCJcblx0fSlcblx0ZGF0YUZpZWxkQ29sbGVjdGlvbj86IEZvcm1FbGVtZW50W107XG5cblx0LyoqXG5cdCAqIENvbnRyb2wgd2hldGhlciB0aGUgZm9ybSBpcyBpbiBkaXNwbGF5TW9kZSBvciBub3Rcblx0ICovXG5cdEBibG9ja0F0dHJpYnV0ZSh7XG5cdFx0dHlwZTogXCJib29sZWFuXCJcblx0fSlcblx0ZGlzcGxheU1vZGUgPSBmYWxzZTtcblxuXHQvKipcblx0ICogVGl0bGUgb2YgdGhlIGZvcm0gY29udGFpbmVyXG5cdCAqL1xuXHRAYmxvY2tBdHRyaWJ1dGUoeyB0eXBlOiBcInN0cmluZ1wiIH0pXG5cdHRpdGxlPzogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHRoZSBcImFyaWEtbGV2ZWxcIiBvZiB0aGUgZm9ybSB0aXRsZSwgdGl0bGVzIG9mIGludGVybmFsbHkgdXNlZCBmb3JtIGNvbnRhaW5lcnMgYXJlIG5lc3RlZCBzdWJzZXF1ZW50bHlcblx0ICovXG5cdEBibG9ja0F0dHJpYnV0ZSh7IHR5cGU6IFwic2FwLnVpLmNvcmUuVGl0bGVMZXZlbFwiLCBpc1B1YmxpYzogdHJ1ZSB9KVxuXHR0aXRsZUxldmVsID0gXCJBdXRvXCI7XG5cblx0LyoqXG5cdCAqIEJpbmRpbmcgdGhlIGZvcm0gY29udGFpbmVyIHVzaW5nIGEgbmF2aWdhdGlvbiBwYXRoXG5cdCAqL1xuXHRAYmxvY2tBdHRyaWJ1dGUoeyB0eXBlOiBcInN0cmluZ1wiIH0pXG5cdG5hdmlnYXRpb25QYXRoPzogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBCaW5kaW5nIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmb3JtIGNvbnRhaW5lciB1c2luZyBhbiBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhblxuXHQgKi9cblx0QGJsb2NrQXR0cmlidXRlKHsgdHlwZTogXCJzdHJpbmdcIiB9KVxuXHR2aXNpYmxlPzogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBVSSBoaWRkZW4gYW5ub3RhdGlvbiBpcyBwcmVzZW50IG9yIG5vdFxuXHQgKi9cblx0QGJsb2NrQXR0cmlidXRlKHsgdHlwZTogXCJib29sZWFuXCIgfSlcblx0aGFzVWlIaWRkZW5Bbm5vdGF0aW9uPzogYm9vbGVhbjtcblxuXHQvKipcblx0ICogRmxleCBkZXNpZ250aW1lIHNldHRpbmdzIHRvIGJlIGFwcGxpZWRcblx0ICovXG5cdEBibG9ja0F0dHJpYnV0ZSh7IHR5cGU6IFwic3RyaW5nXCIgfSlcblx0ZGVzaWdudGltZVNldHRpbmdzID0gXCJzYXAvZmUvbWFjcm9zL2Zvcm0vRm9ybUNvbnRhaW5lci5kZXNpZ250aW1lXCI7XG5cblx0QGJsb2NrQXR0cmlidXRlKHsgdHlwZTogXCJhcnJheVwiIH0pXG5cdGFjdGlvbnM/OiBCYXNlQWN0aW9uW107XG5cblx0QGJsb2NrQXR0cmlidXRlKHsgdHlwZTogXCJib29sZWFuXCIgfSlcblx0dXNlU2luZ2xlVGV4dEFyZWFGaWVsZEFzTm90ZXM/OiBib29sZWFuO1xuXG5cdEBibG9ja0FnZ3JlZ2F0aW9uKHsgdHlwZTogXCJzYXAuZmUubWFjcm9zLmZvcm0uRm9ybUVsZW1lbnRcIiB9KVxuXHRmb3JtRWxlbWVudHM6IFJlY29yZDxzdHJpbmcsIENvbmZpZ3VyYWJsZU9iamVjdD4gPSB7fTtcblxuXHQvLyBKdXN0IHByb3hpZWQgZG93biB0byB0aGUgRmllbGQgbWF5IG5lZWQgdG8gc2VlIGlmIG5lZWRlZCBvciBub3Rcblx0QGJsb2NrRXZlbnQoKVxuXHRvbkNoYW5nZT86IHN0cmluZztcblxuXHRjb25zdHJ1Y3Rvcihwcm9wczogUHJvcGVydGllc09mPEZvcm1Db250YWluZXJCbG9jaz4sIGV4dGVybmFsQ29uZmlndXJhdGlvbjogdW5rbm93biwgc2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MpIHtcblx0XHRzdXBlcihwcm9wcyk7XG5cdFx0dGhpcy5lbnRpdHlTZXQgPSB0aGlzLmNvbnRleHRQYXRoITtcblx0XHRpZiAodGhpcy5mb3JtRWxlbWVudHMgJiYgT2JqZWN0LmtleXModGhpcy5mb3JtRWxlbWVudHMpLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0T2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0czxSZWZlcmVuY2VGYWNldD4odGhpcy5tZXRhUGF0aCwgdGhpcy5jb250ZXh0UGF0aCk7XG5cdFx0XHRjb25zdCBtRXh0cmFTZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0XHRcdGxldCBvRmFjZXREZWZpbml0aW9uID0gb0NvbnRleHRPYmplY3RQYXRoLnRhcmdldE9iamVjdDtcblx0XHRcdC8vIFdyYXAgdGhlIGZhY2V0IGluIGEgZmFrZSBGYWNldCBhbm5vdGF0aW9uXG5cdFx0XHRvRmFjZXREZWZpbml0aW9uID0ge1xuXHRcdFx0XHQkVHlwZTogVUlBbm5vdGF0aW9uVHlwZXMuUmVmZXJlbmNlRmFjZXQsXG5cdFx0XHRcdExhYmVsOiBvRmFjZXREZWZpbml0aW9uPy5MYWJlbCxcblx0XHRcdFx0VGFyZ2V0OiB7XG5cdFx0XHRcdFx0JHRhcmdldDogb0ZhY2V0RGVmaW5pdGlvbixcblx0XHRcdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IG9GYWNldERlZmluaXRpb24/LmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0XHRwYXRoOiBcIlwiLFxuXHRcdFx0XHRcdHRlcm06IFwiXCIsXG5cdFx0XHRcdFx0dHlwZTogXCJBbm5vdGF0aW9uUGF0aFwiLFxuXHRcdFx0XHRcdHZhbHVlOiBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKG9Db250ZXh0T2JqZWN0UGF0aClcblx0XHRcdFx0fSxcblx0XHRcdFx0YW5ub3RhdGlvbnM6IHt9LFxuXHRcdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IG9GYWNldERlZmluaXRpb24/LmZ1bGx5UXVhbGlmaWVkTmFtZVxuXHRcdFx0fSBhcyB1bmtub3duIGFzIFJlZmVyZW5jZUZhY2V0O1xuXHRcdFx0bUV4dHJhU2V0dGluZ3Nbb0ZhY2V0RGVmaW5pdGlvbi5UYXJnZXQudmFsdWVdID0geyBmaWVsZHM6IHRoaXMuZm9ybUVsZW1lbnRzIH07XG5cdFx0XHRjb25zdCBvQ29udmVydGVyQ29udGV4dCA9IHRoaXMuZ2V0Q29udmVydGVyQ29udGV4dChcblx0XHRcdFx0b0NvbnRleHRPYmplY3RQYXRoLFxuXHRcdFx0XHQvKnRoaXMuY29udGV4dFBhdGgqLyB1bmRlZmluZWQsXG5cdFx0XHRcdHNldHRpbmdzLFxuXHRcdFx0XHRtRXh0cmFTZXR0aW5nc1xuXHRcdFx0KTtcblx0XHRcdGNvbnN0IG9Gb3JtRGVmaW5pdGlvbiA9IGNyZWF0ZUZvcm1EZWZpbml0aW9uKG9GYWNldERlZmluaXRpb24sIFwidHJ1ZVwiLCBvQ29udmVydGVyQ29udGV4dCk7XG5cblx0XHRcdHRoaXMuZGF0YUZpZWxkQ29sbGVjdGlvbiA9IG9Gb3JtRGVmaW5pdGlvbi5mb3JtQ29udGFpbmVyc1swXS5mb3JtRWxlbWVudHM7XG5cdFx0fVxuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQWxCQSxJQW9CcUJBLGtCQUFrQixJQUFBQyxJQUFBLEdBRHRDQyxtQkFBbUIsQ0FBQztJQUFFQyxJQUFJLEVBQUUsZUFBZTtJ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
|
|
800
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGb3JtQ29udGFpbmVyQmxvY2siLCJfZGVjIiwiZGVmaW5lQnVpbGRpbmdCbG9jayIsIm5hbWUiLCJuYW1lc3BhY2UiLCJfZGVjMiIsImJsb2NrQXR0cmlidXRlIiwidHlwZSIsIl9kZWMzIiwicmVxdWlyZWQiLCJpc1B1YmxpYyIsImV4cGVjdGVkVHlwZXMiLCJfZGVjNCIsIl9kZWM1IiwiX2RlYzYiLCJfZGVjNyIsIl9kZWM4IiwiX2RlYzkiLCJfZGVjMTAiLCJfZGVjMTEiLCJfZGVjMTIiLCJfZGVjMTMiLCJfZGVjMTQiLCJfZGVjMTUiLCJfZGVjMTYiLCJibG9ja0FnZ3JlZ2F0aW9uIiwiX2RlYzE3IiwiYmxvY2tFdmVudCIsIl9jbGFzcyIsIl9jbGFzczIiLCJfQnVpbGRpbmdCbG9ja1RlbXBsYXQiLCJwcm9wcyIsImV4dGVybmFsQ29uZmlndXJhdGlvbiIsInNldHRpbmdzIiwiX3RoaXMiLCJjYWxsIiwiX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkiLCJfZGVzY3JpcHRvciIsIl9kZXNjcmlwdG9yMiIsIl9kZXNjcmlwdG9yMyIsIl9kZXNjcmlwdG9yNCIsIl9kZXNjcmlwdG9yNSIsIl9kZXNjcmlwdG9yNiIsIl9kZXNjcmlwdG9yNyIsIl9kZXNjcmlwdG9yOCIsIl9kZXNjcmlwdG9yOSIsIl9kZXNjcmlwdG9yMTAiLCJfZGVzY3JpcHRvcjExIiwiX2Rlc2NyaXB0b3IxMiIsIl9kZXNjcmlwdG9yMTMiLCJfZGVzY3JpcHRvcjE0IiwiX2Rlc2NyaXB0b3IxNSIsIl9kZXNjcmlwdG9yMTYiLCJlbnRpdHlTZXQiLCJjb250ZXh0UGF0aCIsImZvcm1FbGVtZW50cyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJvQ29udGV4dE9iamVjdFBhdGgiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJtZXRhUGF0aCIsIm1FeHRyYVNldHRpbmdzIiwib0ZhY2V0RGVmaW5pdGlvbiIsInRhcmdldE9iamVjdCIsIiRUeXBlIiwiTGFiZWwiLCJUYXJnZXQiLCIkdGFyZ2V0IiwiZnVsbHlRdWFsaWZpZWROYW1lIiwicGF0aCIsInRlcm0iLCJ2YWx1ZSIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJhbm5vdGF0aW9ucyIsImZpZWxkcyIsIm9Db252ZXJ0ZXJDb250ZXh0IiwiZ2V0Q29udmVydGVyQ29udGV4dCIsInVuZGVmaW5lZCIsIm9Gb3JtRGVmaW5pdGlvbiIsImNyZWF0ZUZvcm1EZWZpbml0aW9uIiwiZGF0YUZpZWxkQ29sbGVjdGlvbiIsImZvcm1Db250YWluZXJzIiwiY29udGVudElkIiwidmlld0lkIiwiX2V4cG9ydHMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsImdldFRlbXBsYXRlIiwib3ZlcmZsb3dUb29sYmFySUQiLCJpZCIsIlN0YWJsZUlESGVscGVyIiwiZ2VuZXJhdGUiLCJkYXRhTW9kZWxPYmplY3QiLCJiaW5kaW5nU3RyaW5nIiwiRm9ybUhlbHBlciIsImdlbmVyYXRlQmluZGluZ0V4cHJlc3Npb24iLCJuYXZpZ2F0aW9uUGF0aCIsInhtbCIsImRlc2lnbnRpbWVTZXR0aW5ncyIsInZpc2libGUiLCJnZXRPYmplY3QiLCJoYXNVaUhpZGRlbkFubm90YXRpb24iLCJ0aXRsZSIsInRpdGxlTGV2ZWwiLCJhY3Rpb25zIiwiYXR0ciIsImdldFRlbXBsYXRlZEZvcm1FbGVtZW50cyIsImdldElubmVyVGVtcGxhdGVkRm9ybUVsZW1lbnRzIiwiZ2V0RGF0YVBvaW50VGVtcGxhdGUiLCJmaXJzdEVsZW1lbnRXaXRoQW5ub3RhdGlvblBhdGgiLCJmaW5kIiwiZGYiLCJhbm5vdGF0aW9uUGF0aCIsImlkUHJlZml4IiwiaXNFZGl0YWJsZUhlYWRlciIsImluY2x1ZGVzIiwiZm9ybUVsZW1lbnRJZCIsImtleSIsImNvbXB1dGVkRGF0YU1vZGVsT2JqZWN0IiwiZ2V0TW9kZWwiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImRlc2lnbnRpbWUiLCJVSSIsIkFkYXB0YXRpb25IaWRkZW4iLCJnZXRWaXNpYmxlRXhwcmVzc2lvbiIsImdldFBhdGgiLCJkaXNwbGF5TW9kZSIsIm9uQ2hhbmdlIiwiZ2V0Q29udGFjdFRlbXBsYXRlIiwiZ2V0RGF0YUZpZWxkc0ZvckFubm90YXRpb25zIiwiZ2V0Q29ubmVjdGVkRmllbGRzRm9ybUVsZW1lbnQiLCJmb3JtRWxlbWVudCIsImNvbm5lY3RlZEZpZWxkRWxlbWVudHMiLCJjb25uZWN0ZWRGaWVsZCIsImNvbm5lY3RlZEZpZWxkcyIsIm1vZGVsIiwidGVtcE5hbWUiLCJvcmlnaW5hbE9iamVjdCIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiYmluZGluZ0NvbnRleHQiLCJkZWxpbWl0ZXIiLCJDb21tb25IZWxwZXIiLCJnZXREZWxpbWl0ZXIiLCJvcmlnaW5hbFRlbXBsYXRlIiwibm90TGFzdEluZGV4Q29uZGl0aW9uIiwiaW5kZXhPZiIsImNvbXB1dGVkSWRQcmVmaXgiLCJWYWx1ZSIsImNvbXB1dGVkVmhJZFByZWZpeCIsImNvbm5lY3RlZEZpZWxkRWxlbWVudCIsImZvcm1hdE9wdGlvbnMiLCJ0ZXh0TGluZXNFZGl0IiwidGV4dE1heExpbmVzIiwidGV4dE1heENoYXJhY3RlcnNEaXNwbGF5IiwidGV4dE1heExlbmd0aCIsInRleHRFeHBhbmRCZWhhdmlvckRpc3BsYXkiLCJmaWVsZEVkaXRTdHlsZSIsInJhZGlvQnV0dG9uc0hvcml6b250YWxMYXlvdXQiLCJkYXRhTW9kZWxPYmplY3RGb3JDb25uZWN0ZWRGaWVsZHMiLCJ2aXNpYmxlRXhwcmVzc2lvbiIsImlzUGFydE9mUHJldmlldyIsImlzUmVxdWlyZWQiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb25Gb3JDb25uZWN0ZWREYXRhRmllbGQiLCJ0b1N0cmluZyIsImxhYmVsIiwiZ2V0TXVsdGlWYWx1ZUZpZWxkRm9ybUVsZW1lbnQiLCJtdWx0aVZhbHVlRmllbGRJZCIsInZoSWRQcmVmaXgiLCJnZXRGaWVsZEdyb3VwRm9ybUVsZW1lbnQiLCJmaWVsZEdyb3VwRWxlbWVudHMiLCJncm91cEVsZW1lbnQiLCJncm91cEVsZW1lbnREYXRhTW9kZWxPYmplY3QiLCJpc0Jvb2xlYW5GaWVsZEdyb3VwIiwiZmllbGRHcm91cEVsZW1lbnQiLCJmaWVsZEdyb3VwRm9ybUVsZW1lbnRJZCIsImxhYmVsSUQiLCJmaWVsZEdyb3VwSG9yaXpvbnRhbExheW91dCIsImdldEZpZWxkRm9ybUVsZW1lbnQiLCJyZWFkT25seSIsInNlbWFudGljT2JqZWN0IiwicGF0dGVybiIsInVzZVJhZGlvQnV0dG9uc0ZvckJvb2xlYW4iLCJnZXRDdXN0b21Gb3JtRWxlbWVudCIsInByb3BlcnR5UGF0aCIsImZvcm1FbGVtZW50S2V5IiwidGVtcGxhdGUiLCJnZXRTbG90Q29sdW1uIiwiaXNNdWx0aVZhbHVlRGF0YUZpZWxkIiwiZGF0YUZpZWxkIiwiaXNNdWx0aVZhbHVlRmllbGRDb25kaXRpb24iLCJ2YWx1ZVBhdGgiLCIkUGF0aCIsImlzTXVsdGlWYWx1ZUZpZWxkIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJyZXR1cm5TdHJpbmciLCJCdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2UiLCJfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsIndyaXRhYmxlIiwiaW5pdGlhbGl6ZXIiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkZvcm1Db250YWluZXIuYmxvY2sudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbm5vdGF0aW9uUGF0aCwgQW5ub3RhdGlvblRlcm0sIEVudGl0eVNldCwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHtcblx0Q29ubmVjdGVkRmllbGRzVHlwZSxcblx0Q29ubmVjdGVkRmllbGRzVHlwZVR5cGVzLFxuXHREYXRhRmllbGQsXG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFubm90YXRpb24sXG5cdERhdGFQb2ludFR5cGUsXG5cdEZpZWxkR3JvdXAsXG5cdFJlZmVyZW5jZUZhY2V0XG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHsgdHlwZSBQcm9wZXJ0aWVzT2YgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQge1xuXHRibG9ja0FnZ3JlZ2F0aW9uLFxuXHRibG9ja0F0dHJpYnV0ZSxcblx0YmxvY2tFdmVudCxcblx0ZGVmaW5lQnVpbGRpbmdCbG9ja1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrU3VwcG9ydFwiO1xuaW1wb3J0IHsgeG1sLCB0eXBlIFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCBCdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2UgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlXCI7XG5pbXBvcnQgeyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQmFzZUFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9BY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgQW5ub3RhdGlvbkZvcm1FbGVtZW50LCBDdXN0b21Gb3JtRWxlbWVudCwgRm9ybUVsZW1lbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vRm9ybVwiO1xuaW1wb3J0IHsgY3JlYXRlRm9ybURlZmluaXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vRm9ybVwiO1xuaW1wb3J0IHR5cGUgeyBDb25maWd1cmFibGVPYmplY3QgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0ICogYXMgU3RhYmxlSURIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IGVuaGFuY2VEYXRhTW9kZWxQYXRoLCBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0UmVxdWlyZWRFeHByZXNzaW9uRm9yQ29ubmVjdGVkRGF0YUZpZWxkLCBpc011bHRpVmFsdWVGaWVsZCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBDb21tb25IZWxwZXIgZnJvbSBcIi4uL0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0VmlzaWJsZUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vZmllbGQvRmllbGRUZW1wbGF0aW5nXCI7XG5pbXBvcnQgRm9ybUhlbHBlciBmcm9tIFwiLi9Gb3JtSGVscGVyXCI7XG5cbi8qKlxuICogQnVpbGRpbmcgYmxvY2sgZm9yIGNyZWF0aW5nIGEgRm9ybUNvbnRhaW5lciBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgT0RhdGEgVjQgbWV0YWRhdGEuXG4gKlxuICpcbiAqIFVzYWdlIGV4YW1wbGU6XG4gKiA8cHJlPlxuICogJmx0O21hY3JvczpGb3JtQ29udGFpbmVyXG4gKiBpZD1cIlNvbWVJZFwiXG4gKiBlbnRpdHlTZXQ9XCJ7ZW50aXR5U2V0Pn1cIlxuICogZGF0YUZpZWxkQ29sbGVjdGlvbiA9XCJ7ZGF0YUZpZWxkQ29sbGVjdGlvbj59XCJcbiAqIHRpdGxlPVwic29tZVRpdGxlXCJcbiAqIG5hdmlnYXRpb25QYXRoPVwie1RvU3VwcGxpZXJ9XCJcbiAqIHZpc2libGU9dHJ1ZVxuICogb25DaGFuZ2U9XCIuaGFuZGxlcnMub25GaWVsZFZhbHVlQ2hhbmdlXCJcbiAqIC8mZ3Q7XG4gKiA8L3ByZT5cbiAqIEBwcml2YXRlXG4gKi9cbkBkZWZpbmVCdWlsZGluZ0Jsb2NrKHsgbmFtZTogXCJGb3JtQ29udGFpbmVyXCIsIG5hbWVzcGFjZTogXCJzYXAuZmUubWFjcm9zXCIgfSlcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm1Db250YWluZXJCbG9jayBleHRlbmRzIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSB7XG5cdEBibG9ja0F0dHJpYnV0ZSh7IHR5cGU6IFwic3RyaW5nXCIgfSlcblx0aWQ/OiBzdHJpbmc7XG5cblx0QGJsb2NrQXR0cmlidXRlKHtcblx0XHR0eXBlOiBcInNhcC51aS5tb2RlbC5Db250ZXh0XCIsXG5cdFx0cmVxdWlyZWQ6IHRydWUsXG5cdFx0aXNQdWJsaWM6IHRydWUsXG5cdFx0ZXhwZWN0ZWRUeXBlczogW1wiRW50aXR5U2V0XCIsIFwiTmF2aWdhdGlvblByb3BlcnR5XCIsIFwiRW50aXR5VHlwZVwiLCBcIlNpbmdsZXRvblwiXVxuXHR9KVxuXHRjb250ZXh0UGF0aCE6IENvbnRleHQ7XG5cblx0QGJsb2NrQXR0cmlidXRlKHtcblx0XHR0eXBlOiBcInNhcC51aS5tb2RlbC5Db250ZXh0XCJcblx0fSlcblx0ZW50aXR5U2V0PzogQ29udGV4dDtcblxuXHRAYmxvY2tBdHRyaWJ1dGUoe1xuXHRcdHR5cGU6IFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIixcblx0XHRpc1B1YmxpYzogdHJ1ZSxcblx0XHRyZXF1aXJlZDogdHJ1ZVxuXHR9KVxuXHRtZXRhUGF0aCE6IENvbnRleHQ7XG5cblx0LyoqXG5cdCAqIE1ldGFkYXRhIHBhdGggdG8gdGhlIGRhdGFGaWVsZENvbGxlY3Rpb25cblx0ICovXG5cdEBibG9ja0F0dHJpYnV0ZSh7XG5cdFx0dHlwZTogXCJhcnJheVwiXG5cdH0pXG5cdGRhdGFGaWVsZENvbGxlY3Rpb24/OiBGb3JtRWxlbWVudFtdO1xuXG5cdC8qKlxuXHQgKiBDb250cm9sIHdoZXRoZXIgdGhlIGZvcm0gaXMgaW4gZGlzcGxheU1vZGUgb3Igbm90XG5cdCAqL1xuXHRAYmxvY2tBdHRyaWJ1dGUoe1xuXHRcdHR5cGU6IFwiYm9vbGVhblwiXG5cdH0pXG5cdGRpc3BsYXlNb2RlID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIFRpdGxlIG9mIHRoZSBmb3JtIGNvbnRhaW5lclxuXHQgKi9cblx0QGJsb2NrQXR0cmlidXRlKHsgdHlwZTogXCJzdHJpbmdcIiB9KVxuXHR0aXRsZT86IHN0cmluZztcblxuXHQvKipcblx0ICogRGVmaW5lcyB0aGUgXCJhcmlhLWxldmVsXCIgb2YgdGhlIGZvcm0gdGl0bGUsIHRpdGxlcyBvZiBpbnRlcm5hbGx5IHVzZWQgZm9ybSBjb250YWluZXJzIGFyZSBuZXN0ZWQgc3Vic2VxdWVudGx5XG5cdCAqL1xuXHRAYmxvY2tBdHRyaWJ1dGUoeyB0eXBlOiBcInNhcC51aS5jb3JlLlRpdGxlTGV2ZWxcIiwgaXNQdWJsaWM6IHRydWUgfSlcblx0dGl0bGVMZXZlbCA9IFwiQXV0b1wiO1xuXG5cdC8qKlxuXHQgKiBCaW5kaW5nIHRoZSBmb3JtIGNvbnRhaW5lciB1c2luZyBhIG5hdmlnYXRpb24gcGF0aFxuXHQgKi9cblx0QGJsb2NrQXR0cmlidXRlKHsgdHlwZTogXCJzdHJpbmdcIiB9KVxuXHRuYXZpZ2F0aW9uUGF0aD86IHN0cmluZztcblxuXHQvKipcblx0ICogQmluZGluZyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZm9ybSBjb250YWluZXIgdXNpbmcgYW4gZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW5cblx0ICovXG5cdEBibG9ja0F0dHJpYnV0ZSh7IHR5cGU6IFwic3RyaW5nXCIgfSlcblx0dmlzaWJsZT86IHN0cmluZztcblxuXHQvKipcblx0ICogQ2hlY2sgaWYgVUkgaGlkZGVuIGFubm90YXRpb24gaXMgcHJlc2VudCBvciBub3Rcblx0ICovXG5cdEBibG9ja0F0dHJpYnV0ZSh7IHR5cGU6IFwiYm9vbGVhblwiIH0pXG5cdGhhc1VpSGlkZGVuQW5ub3RhdGlvbj86IGJvb2xlYW47XG5cblx0LyoqXG5cdCAqIEZsZXggZGVzaWdudGltZSBzZXR0aW5ncyB0byBiZSBhcHBsaWVkXG5cdCAqL1xuXHRAYmxvY2tBdHRyaWJ1dGUoeyB0eXBlOiBcInN0cmluZ1wiIH0pXG5cdGRlc2lnbnRpbWVTZXR0aW5ncyA9IFwic2FwL2ZlL21hY3Jvcy9mb3JtL0Zvcm1Db250YWluZXIuZGVzaWdudGltZVwiO1xuXG5cdEBibG9ja0F0dHJpYnV0ZSh7IHR5cGU6IFwiYXJyYXlcIiB9KVxuXHRhY3Rpb25zPzogQmFzZUFjdGlvbltdO1xuXG5cdEBibG9ja0F0dHJpYnV0ZSh7IHR5cGU6IFwiYm9vbGVhblwiIH0pXG5cdHVzZVNpbmdsZVRleHRBcmVhRmllbGRBc05vdGVzPzogYm9vbGVhbjtcblxuXHRAYmxvY2tBZ2dyZWdhdGlvbih7IHR5cGU6IFwic2FwLmZlLm1hY3Jvcy5mb3JtLkZvcm1FbGVtZW50XCIgfSlcblx0Zm9ybUVsZW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBDb25maWd1cmFibGVPYmplY3Q+ID0ge307XG5cblx0Ly8gSnVzdCBwcm94aWVkIGRvd24gdG8gdGhlIEZpZWxkIG1heSBuZWVkIHRvIHNlZSBpZiBuZWVkZWQgb3Igbm90XG5cdEBibG9ja0V2ZW50KClcblx0b25DaGFuZ2U/OiBzdHJpbmc7XG5cblx0Y29udGVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0Y29uc3RydWN0b3IocHJvcHM6IFByb3BlcnRpZXNPZjxGb3JtQ29udGFpbmVyQmxvY2s+LCBleHRlcm5hbENvbmZpZ3VyYXRpb246IHVua25vd24sIHNldHRpbmdzOiBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzKSB7XG5cdFx0c3VwZXIocHJvcHMpO1xuXHRcdHRoaXMuZW50aXR5U2V0ID0gdGhpcy5jb250ZXh0UGF0aCE7XG5cdFx0aWYgKHRoaXMuZm9ybUVsZW1lbnRzICYmIE9iamVjdC5rZXlzKHRoaXMuZm9ybUVsZW1lbnRzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dE9iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHM8UmVmZXJlbmNlRmFjZXQ+KHRoaXMubWV0YVBhdGgsIHRoaXMuY29udGV4dFBhdGgpO1xuXHRcdFx0Y29uc3QgbUV4dHJhU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0XHRsZXQgb0ZhY2V0RGVmaW5pdGlvbiA9IG9Db250ZXh0T2JqZWN0UGF0aC50YXJnZXRPYmplY3Q7XG5cdFx0XHQvLyBXcmFwIHRoZSBmYWNldCBpbiBhIGZha2UgRmFjZXQgYW5ub3RhdGlvblxuXHRcdFx0b0ZhY2V0RGVmaW5pdGlvbiA9IHtcblx0XHRcdFx0JFR5cGU6IFVJQW5ub3RhdGlvblR5cGVzLlJlZmVyZW5jZUZhY2V0LFxuXHRcdFx0XHRMYWJlbDogb0ZhY2V0RGVmaW5pdGlvbj8uTGFiZWwsXG5cdFx0XHRcdFRhcmdldDoge1xuXHRcdFx0XHRcdCR0YXJnZXQ6IG9GYWNldERlZmluaXRpb24sXG5cdFx0XHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBvRmFjZXREZWZpbml0aW9uPy5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdFx0cGF0aDogXCJcIixcblx0XHRcdFx0XHR0ZXJtOiBcIlwiLFxuXHRcdFx0XHRcdHR5cGU6IFwiQW5ub3RhdGlvblBhdGhcIixcblx0XHRcdFx0XHR2YWx1ZTogZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aChvQ29udGV4dE9iamVjdFBhdGgpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFubm90YXRpb25zOiB7fSxcblx0XHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBvRmFjZXREZWZpbml0aW9uPy5mdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdH0gYXMgdW5rbm93biBhcyBSZWZlcmVuY2VGYWNldDtcblx0XHRcdG1FeHRyYVNldHRpbmdzW29GYWNldERlZmluaXRpb24uVGFyZ2V0LnZhbHVlXSA9IHsgZmllbGRzOiB0aGlzLmZvcm1FbGVtZW50cyB9O1xuXHRcdFx0Y29uc3Qgb0NvbnZlcnRlckNvbnRleHQgPSB0aGlzLmdldENvbnZlcnRlckNvbnRleHQoXG5cdFx0XHRcdG9Db250ZXh0T2JqZWN0UGF0aCxcblx0XHRcdFx0Lyp0aGlzLmNvbnRleHRQYXRoKi8gdW5kZWZpbmVkLFxuXHRcdFx0XHRzZXR0aW5ncyxcblx0XHRcdFx0bUV4dHJhU2V0dGluZ3Ncblx0XHRcdCk7XG5cdFx0XHRjb25zdCBvRm9ybURlZmluaXRpb24gPSBjcmVhdGVGb3JtRGVmaW5pdGlvbihvRmFjZXREZWZpbml0aW9uLCBcInRydWVcIiwgb0NvbnZlcnRlckNvbnRleHQpO1xuXG5cdFx0XHR0aGlzLmRhdGFGaWVsZENvbGxlY3Rpb24gPSBvRm9ybURlZmluaXRpb24uZm9ybUNvbnRhaW5lcnNbMF0uZm9ybUVsZW1lbnRzO1xuXHRcdH1cblx0XHQvLyBXZSBuZWVkIHRoZSB2aWV3IGlkIGZvciB0aGUgZm9ybSBlbGVtZW50cyBzdGFibGUgaWRzIGdlbmVyYXRpb25cblx0XHR0aGlzLmNvbnRlbnRJZCA9IHNldHRpbmdzLnZpZXdJZCBhcyBzdHJpbmc7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgdGVtcGxhdGUgZm9yIHRoZSBGb3JtQ29udGFpbmVyLlxuXHQgKiBAcmV0dXJucyBUaGUgWE1MIHRlbXBsYXRlIHN0cmluZy5cblx0ICovXG5cdHB1YmxpYyBnZXRUZW1wbGF0ZSgpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG92ZXJmbG93VG9vbGJhcklEID0gdGhpcy5pZCA/IFN0YWJsZUlESGVscGVyLmdlbmVyYXRlKFt0aGlzLmlkLCBcIkZvcm1BY3Rpb25zVG9vbGJhclwiXSkgOiB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKHRoaXMuY29udGV4dFBhdGgsIHRoaXMubWV0YVBhdGgpIGFzIERhdGFNb2RlbE9iamVjdFBhdGg8RW50aXR5U2V0PiB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBiaW5kaW5nU3RyaW5nID0gRm9ybUhlbHBlci5nZW5lcmF0ZUJpbmRpbmdFeHByZXNzaW9uKHRoaXMubmF2aWdhdGlvblBhdGgsIGRhdGFNb2RlbE9iamVjdCk7XG5cblx0XHRyZXR1cm4geG1sYFxuXHRcdDxmOkZvcm1Db250YWluZXJcblx0XHRcdHhtbG5zPVwic2FwLm1cIlxuXHRcdFx0eG1sbnM6Zj1cInNhcC51aS5sYXlvdXQuZm9ybVwiXG5cdFx0XHR4bWxuczptYWNybz1cInNhcC5mZS5tYWNyb3NcIlxuXHRcdFx0eG1sbnM6bWFjcm9Gb3JtPVwic2FwLmZlLm1hY3Jvcy5mb3JtXCJcblx0XHRcdHhtbG5zOmludGVybmFsTWFjcm89XCJzYXAuZmUubWFjcm9zLmludGVybmFsXCJcblx0XHRcdHhtbG5zOmNvcmU9XCJzYXAudWkuY29yZVwiXG5cdFx0XHR4bWxuczpjb250cm9scz1cInNhcC5mZS5tYWNyb3MuY29udHJvbHNcIlxuXHRcdFx0eG1sbnM6ZHQ9XCJzYXAudWkuZHRcIlxuXHRcdFx0eG1sbnM6bWFjcm9kYXRhPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiXG5cdFx0XHR4bWxuczpmcG09XCJzYXAuZmUubWFjcm9zLmZwbVwiXG5cdFx0XHR4bWxuczp0ZW1wbGF0ZT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS50ZW1wbGF0ZS8xXCJcblx0XHRcdHRlbXBsYXRlOnJlcXVpcmU9XCJ7XG5cdFx0XHRcdE1PREVMOiAnc2FwL3VpL21vZGVsL29kYXRhL3Y0L0Fubm90YXRpb25IZWxwZXInLFxuXHRcdFx0XHRJRDogJ3NhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXInLFxuXHRcdFx0XHRDT01NT046ICdzYXAvZmUvbWFjcm9zL0NvbW1vbkhlbHBlcicsXG5cdFx0XHRcdEZPUk06ICdzYXAvZmUvbWFjcm9zL2Zvcm0vRm9ybUhlbHBlcicsXG5cdFx0XHRcdFVJOiAnc2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9VSUZvcm1hdHRlcnMnLFxuXHRcdFx0XHREYXRhRmllbGQ6ICdzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFGaWVsZEZvcm1hdHRlcnMnLFxuXHRcdFx0XHRGaWVsZFRlbXBsYXRpbmc6ICdzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkVGVtcGxhdGluZycsXG5cdFx0XHRcdFByb3BlcnR5OiAnc2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUZvcm1hdHRlcnMnLFxuXHRcdFx0XHRGSUVMRDogJ3NhcC9mZS9tYWNyb3MvZmllbGQvRmllbGRIZWxwZXInLFxuXHRcdFx0XHRNQUNSTzogJ3NhcC9mZS9tYWNyb3MvTWFjcm9UZW1wbGF0aW5nJ1xuXHRcdFx0fVwiXG5cblx0XHRcdGNvcmU6cmVxdWlyZT1cIntGb3JtQ29udGFpbmVyUnVudGltZTogJ3NhcC9mZS9tYWNyb3MvZm9ybS9Gb3JtQ29udGFpbmVyQVBJJ31cIlxuXHRcdFx0ZHQ6ZGVzaWdudGltZT1cIiR7dGhpcy5kZXNpZ250aW1lU2V0dGluZ3N9XCJcblx0XHRcdGlkPVwiJHt0aGlzLmlkIHx8IHVuZGVmaW5lZH1cIlxuXHRcdFx0dmlzaWJsZT1cIiR7dGhpcy52aXNpYmxlfVwiXG5cdFx0XHRtYWNyb2RhdGE6bmF2aWdhdGlvblBhdGg9XCIke3RoaXMubmF2aWdhdGlvblBhdGh9XCJcblx0XHRcdG1hY3JvZGF0YTpldE5hbWU9XCIke3RoaXMuY29udGV4dFBhdGguZ2V0T2JqZWN0KFwiLi9Ac2FwdWkubmFtZVwiKX1cIlxuXHRcdFx0bWFjcm9kYXRhOlVpSGlkZGVuUHJlc2VudD1cIiR7dGhpcy5oYXNVaUhpZGRlbkFubm90YXRpb259XCJcblx0XHQ+XG5cblx0XHRcdDx0ZW1wbGF0ZTppZiB0ZXN0PVwiJHt0aGlzLnRpdGxlfVwiPlxuXHRcdFx0XHQ8Zjp0aXRsZT5cblx0XHRcdFx0XHQ8Y29yZTpUaXRsZSBsZXZlbD1cIiR7dGhpcy50aXRsZUxldmVsfVwiIHRleHQ9XCIke3RoaXMudGl0bGV9XCIgLz5cblx0XHRcdFx0PC9mOnRpdGxlPlxuXHRcdFx0PC90ZW1wbGF0ZTppZj5cblxuXHRcdFx0PHRlbXBsYXRlOmlmIHRlc3Q9XCIke3RoaXMuYWN0aW9uc31cIj5cblx0XHRcdFx0PHRlbXBsYXRlOnRoZW4+XG5cdFx0XHRcdFx0PGY6dG9vbGJhcj5cblx0XHRcdFx0XHRcdDxPdmVyZmxvd1Rvb2xiYXJcblx0XHRcdFx0XHRcdFx0aWQ9XCIke292ZXJmbG93VG9vbGJhcklEfVwiXG5cdFx0XHRcdFx0XHRcdCR7dGhpcy5hdHRyKFwiYmluZGluZ1wiLCBiaW5kaW5nU3RyaW5nKX1cblx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0PFRpdGxlIGxldmVsPVwiJHt0aGlzLnRpdGxlTGV2ZWx9XCIgdGV4dD1cIiR7dGhpcy50aXRsZX1cIiAvPlxuXHRcdFx0XHRcdFx0XHQ8VG9vbGJhclNwYWNlciAvPlxuXHRcdFx0XHRcdFx0XHQ8dGVtcGxhdGU6cmVwZWF0IGxpc3Q9XCJ7YWN0aW9ucz59XCIgdmFyPVwiYWN0aW9uXCI+XG5cdFx0XHRcdFx0XHRcdFx0PGNvcmU6RnJhZ21lbnQgZnJhZ21lbnROYW1lPVwic2FwLmZlLm1hY3Jvcy5mb3JtLkZvcm1BY3Rpb25CdXR0b25zXCIgdHlwZT1cIlhNTFwiIC8+XG5cdFx0XHRcdFx0XHRcdDwvdGVtcGxhdGU6cmVwZWF0PlxuXHRcdFx0XHRcdFx0PC9PdmVyZmxvd1Rvb2xiYXI+XG5cdFx0XHRcdFx0PC9mOnRvb2xiYXI+XG5cdFx0XHRcdDwvdGVtcGxhdGU6dGhlbj5cblx0XHRcdDwvdGVtcGxhdGU6aWY+XG5cblx0XHRcdDxmOmRlcGVuZGVudHM+XG5cdFx0XHRcdDxtYWNyb0Zvcm06Rm9ybUNvbnRhaW5lckFQSSBmb3JtQ29udGFpbmVySWQ9XCIke3RoaXMuaWR9XCIgc2hvd0RldGFpbHM9XCJ7aW50ZXJuYWw+c2hvd0RldGFpbHN9XCIgLz5cblx0XHRcdDwvZjpkZXBlbmRlbnRzPlxuXG5cdFx0XHQ8Zjpmb3JtRWxlbWVudHM+XG5cdFx0XHRcdCR7dGhpcy5nZXRUZW1wbGF0ZWRGb3JtRWxlbWVudHMoKX1cblx0XHRcdDwvZjpmb3JtRWxlbWVudHM+XG5cblx0XHQ8L2Y6Rm9ybUNvbnRhaW5lcj5gO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHRlbXBsYXRlZCBmb3JtIGVsZW1lbnRzLlxuXHQgKiBAcmV0dXJucyBUaGUgWE1MIHN0cmluZyBmb3IgdGhlIGZvcm0gZWxlbWVudHMuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VGVtcGxhdGVkRm9ybUVsZW1lbnRzKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHhtbGBcblx0XHRcdDx0ZW1wbGF0ZTp3aXRoIHBhdGg9XCJkYXRhRmllbGRDb2xsZWN0aW9uPlwiIHZhcj1cImZvcm1FbGVtZW50c1wiPlxuXHRcdFx0XHQke3RoaXMuZ2V0SW5uZXJUZW1wbGF0ZWRGb3JtRWxlbWVudHMoKX1cblx0XHRcdDwvdGVtcGxhdGU6d2l0aD5gO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGlubmVyIHRlbXBsYXRlZCBmb3JtIGVsZW1lbnRzLCBpbmNsdWRpbmcgRGF0YVBvaW50IGFuZCBDb250YWN0IHRlbXBsYXRlcy5cblx0ICogQHJldHVybnMgVGhlIFhNTCBzdHJpbmcgZm9yIHRoZSBpbm5lciBmb3JtIGVsZW1lbnRzLlxuXHQgKi9cblx0cHVibGljIGdldElubmVyVGVtcGxhdGVkRm9ybUVsZW1lbnRzKCk6IHN0cmluZyB7XG5cdFx0bGV0IGdldERhdGFQb2ludFRlbXBsYXRlID0gXCJcIjtcblxuXHRcdGlmICh0aGlzLmRhdGFGaWVsZENvbGxlY3Rpb24gJiYgdGhpcy5kYXRhRmllbGRDb2xsZWN0aW9uLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBoYXMgYW4gYW5ub3RhdGlvblBhdGhcblx0XHRcdGNvbnN0IGZpcnN0RWxlbWVudFdpdGhBbm5vdGF0aW9uUGF0aCA9IHRoaXMuZGF0YUZpZWxkQ29sbGVjdGlvbi5maW5kKChkZikgPT4gISFkZi5hbm5vdGF0aW9uUGF0aCk7XG5cdFx0XHRsZXQgaWRQcmVmaXggPSBcIlwiO1xuXHRcdFx0Y29uc3QgaXNFZGl0YWJsZUhlYWRlciA9IHRoaXMuaWQ/LmluY2x1ZGVzKFwiSGVhZGVyRmFjZXQ6OkZvcm1Db250YWluZXJcIikgPT09IHRydWU7XG5cdFx0XHRsZXQgZm9ybUVsZW1lbnRJZCA9IFwidW5kZWZpbmVkXCI7XG5cdFx0XHRpZiAodGhpcy5pZCkge1xuXHRcdFx0XHRpZiAoaXNFZGl0YWJsZUhlYWRlcikge1xuXHRcdFx0XHRcdGZvcm1FbGVtZW50SWQgPSBgJHt0aGlzLmlkfTo6Rm9ybUVsZW1lbnRgO1xuXHRcdFx0XHRcdGlkUHJlZml4ID0gYCR7dGhpcy5pZH06OkZvcm1FbGVtZW50YDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmb3JtRWxlbWVudElkID0gYCR7U3RhYmxlSURIZWxwZXIuZ2VuZXJhdGUoW3RoaXMuaWQsIFwiRm9ybUVsZW1lbnRcIiwgdGhpcy5kYXRhRmllbGRDb2xsZWN0aW9uWzBdLmtleV0pfWA7XG5cdFx0XHRcdFx0aWRQcmVmaXggPSBgJHtTdGFibGVJREhlbHBlci5nZW5lcmF0ZShbdGhpcy5pZCwgXCJGb3JtRWxlbWVudFwiLCB0aGlzLmRhdGFGaWVsZENvbGxlY3Rpb25bMF0ua2V5XSl9YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGZpcnN0RWxlbWVudFdpdGhBbm5vdGF0aW9uUGF0aD8uYW5ub3RhdGlvblBhdGgpIHtcblx0XHRcdFx0Y29uc3QgY29tcHV0ZWREYXRhTW9kZWxPYmplY3QgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMoXG5cdFx0XHRcdFx0dGhpcy5jb250ZXh0UGF0aC5nZXRNb2RlbCgpLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGZpcnN0RWxlbWVudFdpdGhBbm5vdGF0aW9uUGF0aD8uYW5ub3RhdGlvblBhdGggfHwgXCJcIilcblx0XHRcdFx0KSBhcyBEYXRhTW9kZWxPYmplY3RQYXRoPEVudGl0eVNldD4gfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdTdHJpbmcgPSBGb3JtSGVscGVyLmdlbmVyYXRlQmluZGluZ0V4cHJlc3Npb24odGhpcy5uYXZpZ2F0aW9uUGF0aCwgY29tcHV0ZWREYXRhTW9kZWxPYmplY3QpO1xuXHRcdFx0XHRjb25zdCBkZXNpZ250aW1lID0gY29tcHV0ZWREYXRhTW9kZWxPYmplY3Q/LnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/LlVJPy5BZGFwdGF0aW9uSGlkZGVuXG5cdFx0XHRcdFx0PyBcIm5vdC1hZGFwdGFibGUtdHJlZVwiXG5cdFx0XHRcdFx0OiBcInNhcC9mZS9tYWNyb3MvZm9ybS9Gb3JtRWxlbWVudC5kZXNpZ250aW1lXCI7XG5cblx0XHRcdFx0Z2V0RGF0YVBvaW50VGVtcGxhdGUgPSB4bWxgXG5cdFx0XHRcdDx0ZW1wbGF0ZTp0aGVuPlxuXHRcdFx0XHRcdDx0ZW1wbGF0ZTp3aXRoIHBhdGg9XCJmb3JtRWxlbWVudHM+MC9hbm5vdGF0aW9uUGF0aFwiIHZhcj1cImRhdGFQb2ludFwiPlxuXHRcdFx0XHRcdFx0PGY6Rm9ybUVsZW1lbnRcblx0XHRcdFx0XHRcdFx0ZHQ6ZGVzaWdudGltZT1cIiR7ZGVzaWdudGltZX1cIlxuXHRcdFx0XHRcdFx0XHRpZD1cIiR7Zm9ybUVsZW1lbnRJZH1cIlxuXHRcdFx0XHRcdFx0XHRsYWJlbD1cIntkYXRhUG9pbnQ+QEBGSUVMRC5jb21wdXRlTGFiZWxUZXh0fVwiXG5cdFx0XHRcdFx0XHRcdHZpc2libGU9XCIke2dldFZpc2libGVFeHByZXNzaW9uKGNvbXB1dGVkRGF0YU1vZGVsT2JqZWN0IGFzIERhdGFNb2RlbE9iamVjdFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGUgfCBQcm9wZXJ0eT4pfVwiXG5cdFx0XHRcdFx0XHRcdCR7dGhpcy5hdHRyKFwiYmluZGluZ1wiLCBiaW5kaW5nU3RyaW5nKX1cblx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0PGY6ZmllbGRzPlxuXHRcdFx0XHRcdFx0XHRcdDxtYWNybzpGaWVsZFxuXHRcdFx0XHRcdFx0XHRcdFx0aWRQcmVmaXg9XCIke2lkUHJlZml4fVwiXG5cdFx0XHRcdFx0XHRcdFx0XHR2aElkUHJlZml4PVwiJHt0aGlzLmlkID8gU3RhYmxlSURIZWxwZXIuZ2VuZXJhdGUoW3RoaXMuaWQsIFwiRmllbGRWYWx1ZUhlbHBcIl0pIDogXCJcIn1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg9XCIke3RoaXMuZW50aXR5U2V0Py5nZXRQYXRoKCl9XCJcblx0XHRcdFx0XHRcdFx0XHRcdG1ldGFQYXRoPVwiJHt0aGlzLmRhdGFGaWVsZENvbGxlY3Rpb25bMF0uYW5ub3RhdGlvblBhdGh9XCJcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRNb2RlPVwiJHt0aGlzLmRpc3BsYXlNb2RlID09PSB0cnVlID8gXCJEaXNwbGF5XCIgOiB1bmRlZmluZWR9XCJcblx0XHRcdFx0XHRcdFx0XHRcdG9uQ2hhbmdlPVwiJHt0aGlzLm9uQ2hhbmdlfVwiXG5cdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0PGZvcm1hdE9wdGlvbnMgdGV4dEFsaWduTW9kZT1cIkZvcm1cIiBzaG93RW1wdHlJbmRpY2F0b3I9XCJ0cnVlXCIgLz5cblx0XHRcdFx0XHRcdFx0XHQ8L21hY3JvOkZpZWxkPlxuXHRcdFx0XHRcdFx0XHQ8L2Y6ZmllbGRzPlxuXHRcdFx0XHRcdFx0PC9mOkZvcm1FbGVtZW50PlxuXHRcdFx0XHRcdDwvdGVtcGxhdGU6d2l0aD5cblx0XHRcdFx0PC90ZW1wbGF0ZTp0aGVuPlxuXHRcdFx0YDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBnZXRDb250YWN0VGVtcGxhdGUgPSB4bWxgXG5cdFx0PHRlbXBsYXRlOmVsc2VpZlxuXHRcdFx0dGVzdD1cIns9IFxcJHtmb3JtRWxlbWVudHM+MC9hbm5vdGF0aW9uUGF0aH0uaW5kZXhPZignY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5Db250YWN0JykgPiAtMSB9XCJcblx0XHRcdD5cblx0XHRcdDx0ZW1wbGF0ZTp3aXRoIHBhdGg9XCJmb3JtRWxlbWVudHM+MC9hbm5vdGF0aW9uUGF0aFwiIHZhcj1cIm1ldGFQYXRoXCI+XG5cdFx0XHRcdDxmOkZvcm1FbGVtZW50XG5cdFx0XHRcdFx0ZHQ6ZGVzaWdudGltZT1cIns9IFxcJHttZXRhUGF0aD4uL0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5BZGFwdGF0aW9uSGlkZGVufSA/ICdub3QtYWRhcHRhYmxlLXRyZWUnIDogICdzYXAvZmUvbWFjcm9zL2Zvcm0vRm9ybUVsZW1lbnQuZGVzaWdudGltZScgfVwiXG5cdFx0XHRcdFx0YmluZGluZz1cIns9IEZPUk0uZ2VuZXJhdGVCaW5kaW5nRXhwcmVzc2lvbihcXCR7dGhpcy5uYXZpZ2F0aW9uUGF0aH0sXFwke2NvbnRleHRQYXRoPkBAVUkuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aH0pfVwiXG5cdFx0XHRcdD5cblx0XHRcdFx0PGY6bGFiZWw+XG5cdFx0XHRcdFx0PExhYmVsXG5cdFx0XHRcdFx0XHR0ZXh0PVwie21ldGFQYXRoPmZuLyRQYXRoQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5MYWJlbH1cIlxuXHRcdFx0XHRcdFx0dmlzaWJsZT1cIns9IEZpZWxkVGVtcGxhdGluZy5nZXRWaXNpYmxlRXhwcmVzc2lvbihcXCR7ZGF0YUZpZWxkPkBAVUkuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aH0pfVwiXG5cdFx0XHRcdFx0PlxuXHRcdFx0XHRcdDxsYXlvdXREYXRhPlxuXHRcdFx0XHRcdFx0PGY6Q29sdW1uRWxlbWVudERhdGEgY2VsbHNMYXJnZT1cIjEyXCIgLz5cblx0XHRcdFx0XHQ8L2xheW91dERhdGE+XG5cdFx0XHRcdDwvTGFiZWw+XG5cdFx0XHRcdDwvZjpsYWJlbD5cblx0XHRcdFx0XHQ8ZjpmaWVsZHM+XG5cdFx0XHRcdFx0XHQ8bWFjcm86Q29udGFjdFxuXHRcdFx0XHRcdFx0XHRtZXRhUGF0aD1cInttZXRhUGF0aD5AQENPTU1PTi5nZXRNZXRhUGF0aH1cIlxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoPVwie2NvbnRleHRQYXRoPkBAQ09NTU9OLmdldE1ldGFQYXRofVwiXG5cdFx0XHRcdFx0XHRcdFx0dmlzaWJsZT1cInRydWVcIlxuXHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDwvZjpmaWVsZHM+XG5cdFx0XHRcdDwvZjpGb3JtRWxlbWVudD5cblx0XHRcdDwvdGVtcGxhdGU6d2l0aD5cblx0XHQ8L3RlbXBsYXRlOmVsc2VpZj5gO1xuXG5cdFx0cmV0dXJuIHhtbGBcblx0XHRcdDx0ZW1wbGF0ZTppZiB0ZXN0PVwiez0gXFwke2Zvcm1FbGVtZW50cz4wL2Fubm90YXRpb25QYXRofS5pbmRleE9mKCdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnQnKSA+IC0xIH1cIj5cblx0XHRcdFx0JHtnZXREYXRhUG9pbnRUZW1wbGF0ZX1cblx0XHRcdFx0JHtnZXRDb250YWN0VGVtcGxhdGV9XG5cdFx0XHRcdDx0ZW1wbGF0ZTplbHNlPlxuXHRcdFx0XHRcdCR7dGhpcy5nZXREYXRhRmllbGRzRm9yQW5ub3RhdGlvbnMoKX1cblx0XHRcdFx0PC90ZW1wbGF0ZTplbHNlPlxuXHRcdFx0PC90ZW1wbGF0ZTppZj5cblx0XHRgO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgdGVtcGxhdGUgZm9yIGEgZm9ybSBlbGVtZW50IHdpdGggY29ubmVjdGVkIGZpZWxkcy5cblx0ICogQHBhcmFtIGZvcm1FbGVtZW50IFRoZSBmb3JtIGVsZW1lbnQuXG5cdCAqIEByZXR1cm5zIFRoZSBYTUwgc3RyaW5nIGZvciB0aGUgY29ubmVjdGVkIGZpZWxkcyBmb3JtIGVsZW1lbnQuXG5cdCAqL1xuXHRnZXRDb25uZWN0ZWRGaWVsZHNGb3JtRWxlbWVudChmb3JtRWxlbWVudDogQW5ub3RhdGlvbkZvcm1FbGVtZW50KTogc3RyaW5nIHtcblx0XHRsZXQgY29ubmVjdGVkRmllbGRFbGVtZW50cyA9IFwiXCI7XG5cblx0XHRmb3IgKGNvbnN0IGNvbm5lY3RlZEZpZWxkIG9mIGZvcm1FbGVtZW50LmNvbm5lY3RlZEZpZWxkcyEpIHtcblx0XHRcdGNvbnN0IG1vZGVsID0gdGhpcy5jb250ZXh0UGF0aC5nZXRNb2RlbCgpO1xuXHRcdFx0Y29uc3QgdGVtcE5hbWUgPSBjb25uZWN0ZWRGaWVsZC5vcmlnaW5hbE9iamVjdD8uZnVsbHlRdWFsaWZpZWROYW1lO1xuXHRcdFx0Y29uc3QgcGF0aCA9IHRlbXBOYW1lPy5zdWJzdHJpbmcodGVtcE5hbWUubGFzdEluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0XHRjb25zdCBiaW5kaW5nQ29udGV4dCA9IG1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGZvcm1FbGVtZW50LmFubm90YXRpb25QYXRoICsgXCJUYXJnZXQvJEFubm90YXRpb25QYXRoL0RhdGEvXCIgKyBwYXRoKTtcblx0XHRcdGNvbnN0IGRlbGltaXRlciA9IENvbW1vbkhlbHBlci5nZXREZWxpbWl0ZXIoY29ubmVjdGVkRmllbGQub3JpZ2luYWxUZW1wbGF0ZSA/PyBcIlwiKTtcblx0XHRcdGNvbnN0IG5vdExhc3RJbmRleENvbmRpdGlvbiA9XG5cdFx0XHRcdGZvcm1FbGVtZW50LmNvbm5lY3RlZEZpZWxkcyEuaW5kZXhPZihjb25uZWN0ZWRGaWVsZCkgIT09IGZvcm1FbGVtZW50LmNvbm5lY3RlZEZpZWxkcyEubGVuZ3RoIC0gMVxuXHRcdFx0XHRcdD8geG1sYDxUZXh0XG5cdFx0XHRcdFx0dGV4dD1cIiR7ZGVsaW1pdGVyfVwiXG5cdFx0XHRcdFx0Y2xhc3M9XCJzYXBVaVNtYWxsTWFyZ2luQmVnaW5FbmRcIlxuXHRcdFx0XHRcdHdpZHRoPVwiMTAwJVwiXG5cdFx0XHRcdC8+YFxuXHRcdFx0XHRcdDogXCJcIjtcblxuXHRcdFx0Y29uc3QgY29tcHV0ZWRJZFByZWZpeCA9IHRoaXMuaWRcblx0XHRcdFx0PyBTdGFibGVJREhlbHBlci5nZW5lcmF0ZShbXG5cdFx0XHRcdFx0XHR0aGlzLmlkLFxuXHRcdFx0XHRcdFx0XCJTZW1hbnRpY0Zvcm1FbGVtZW50XCIsXG5cdFx0XHRcdFx0XHRmb3JtRWxlbWVudC5rZXksXG5cdFx0XHRcdFx0XHQoY29ubmVjdGVkRmllbGQub3JpZ2luYWxPYmplY3QgYXMgRGF0YUZpZWxkKT8uVmFsdWUucGF0aFxuXHRcdFx0XHQgIF0pXG5cdFx0XHRcdDogXCJcIjtcblx0XHRcdGNvbnN0IGNvbXB1dGVkVmhJZFByZWZpeCA9IHRoaXMuaWQgPyBTdGFibGVJREhlbHBlci5nZW5lcmF0ZShbdGhpcy5pZCwgZm9ybUVsZW1lbnQua2V5LCBcIkZpZWxkVmFsdWVIZWxwXCJdKSA6IFwiXCI7XG5cblx0XHRcdGxldCBjb25uZWN0ZWRGaWVsZEVsZW1lbnQgPSBcIlwiO1xuXG5cdFx0XHRjb25uZWN0ZWRGaWVsZEVsZW1lbnQgPSB4bWxgXG5cdFx0XHRcdDxtYWNybzpGaWVsZFxuXHRcdFx0XHRcdGlkUHJlZml4PVwiJHtjb21wdXRlZElkUHJlZml4fVwiXG5cdFx0XHRcdFx0dmhJZFByZWZpeD1cIiR7Y29tcHV0ZWRWaElkUHJlZml4fVwiXG5cdFx0XHRcdFx0Y29udGV4dFBhdGg9XCIke3RoaXMuZW50aXR5U2V0Py5nZXRQYXRoKCl9XCJcblx0XHRcdFx0XHRtZXRhUGF0aD1cIiR7YmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpfVwiXG5cdFx0XHRcdFx0b25DaGFuZ2U9XCIke3RoaXMub25DaGFuZ2V9XCJcblx0XHRcdFx0XHRhcmlhTGFiZWxsZWRCeT1cIiR7dGhpcy5pZCA/IFN0YWJsZUlESGVscGVyLmdlbmVyYXRlKFt0aGlzLmlkLCBcIlNlbWFudGljRm9ybUVsZW1lbnRMYWJlbFwiLCBmb3JtRWxlbWVudC5rZXldKSA6IFwiXCJ9XCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxmb3JtYXRPcHRpb25zXG5cdFx0XHRcdFx0XHR0ZXh0TGluZXNFZGl0PVwiJHtmb3JtRWxlbWVudC5mb3JtYXRPcHRpb25zPy50ZXh0TGluZXNFZGl0fVwiXG5cdFx0XHRcdFx0XHR0ZXh0TWF4TGluZXM9XCIke2Zvcm1FbGVtZW50LmZvcm1hdE9wdGlvbnM/LnRleHRNYXhMaW5lc31cIlxuXHRcdFx0XHRcdFx0dGV4dE1heENoYXJhY3RlcnNEaXNwbGF5PVwiJHtmb3JtRWxlbWVudC5mb3JtYXRPcHRpb25zPy50ZXh0TWF4Q2hhcmFjdGVyc0Rpc3BsYXl9XCJcblx0XHRcdFx0XHRcdHRleHRNYXhMZW5ndGg9XCIke2Zvcm1FbGVtZW50LmZvcm1hdE9wdGlvbnM/LnRleHRNYXhMZW5ndGh9XCJcblx0XHRcdFx0XHRcdHRleHRFeHBhbmRCZWhhdmlvckRpc3BsYXk9XCIke2Zvcm1FbGVtZW50LmZvcm1hdE9wdGlvbnM/LnRleHRFeHBhbmRCZWhhdmlvckRpc3BsYXl9XCJcblx0XHRcdFx0XHRcdHRleHRBbGlnbk1vZGU9XCJGb3JtXCJcblx0XHRcdFx0XHRcdHNob3dFbXB0eUluZGljYXRvcj1cInRydWVcIlxuXHRcdFx0XHRcdFx0ZmllbGRFZGl0U3R5bGU9XCIke2Zvcm1FbGVtZW50LmZvcm1hdE9wdGlvbnM/LmZpZWxkRWRpdFN0eWxlfVwiXG5cdFx0XHRcdFx0XHRyYWRpb0J1dHRvbnNIb3Jpem9udGFsTGF5b3V0PVwiJHtmb3JtRWxlbWVudC5mb3JtYXRPcHRpb25zPy5yYWRpb0J1dHRvbnNIb3Jpem9udGFsTGF5b3V0fVwiXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8bWFjcm86bGF5b3V0RGF0YT5cblx0XHRcdFx0XHRcdDxGbGV4SXRlbURhdGEgZ3Jvd0ZhY3Rvcj1cIns9ICV7dWk+L2lzRWRpdGFibGV9ID8gMSA6IDB9XCIgLz5cblx0XHRcdFx0XHQ8L21hY3JvOmxheW91dERhdGE+XG5cdFx0XHRcdDwvbWFjcm86RmllbGQ+XG5cdFx0XHRcdCR7bm90TGFzdEluZGV4Q29uZGl0aW9ufVxuXHRcdFx0XHRgO1xuXG5cdFx0XHRjb25uZWN0ZWRGaWVsZEVsZW1lbnRzICs9IGNvbm5lY3RlZEZpZWxkRWxlbWVudDtcblx0XHR9XG5cblx0XHRjb25zdCBkYXRhTW9kZWxPYmplY3RGb3JDb25uZWN0ZWRGaWVsZHMgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMoXG5cdFx0XHR0aGlzLmNvbnRleHRQYXRoLmdldE1vZGVsKCkuY3JlYXRlQmluZGluZ0NvbnRleHQoZm9ybUVsZW1lbnQuYW5ub3RhdGlvblBhdGggPz8gXCJcIilcblx0XHQpIGFzIERhdGFNb2RlbE9iamVjdFBhdGg8RW50aXR5U2V0PiB8IHVuZGVmaW5lZDtcblx0XHRsZXQgZm9ybUVsZW1lbnRJZCA9IFwiXCI7XG5cdFx0aWYgKHRoaXMuaWQpIHtcblx0XHRcdGlmICh0aGlzLmNvbnRlbnRJZCkge1xuXHRcdFx0XHRmb3JtRWxlbWVudElkID0gYCR7dGhpcy5jb250ZW50SWR9LS0ke1N0YWJsZUlESGVscGVyLmdlbmVyYXRlKFt0aGlzLmlkLCBcIlNlbWFudGljRm9ybUVsZW1lbnRcIiwgZm9ybUVsZW1lbnQua2V5XSl9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvcm1FbGVtZW50SWQgPSBgJHtTdGFibGVJREhlbHBlci5nZW5lcmF0ZShbdGhpcy5pZCwgXCJTZW1hbnRpY0Zvcm1FbGVtZW50XCIsIGZvcm1FbGVtZW50LmtleV0pfWA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IHZpc2libGVFeHByZXNzaW9uID0gZm9ybUVsZW1lbnQuaXNQYXJ0T2ZQcmV2aWV3XG5cdFx0XHQ/IGdldFZpc2libGVFeHByZXNzaW9uKFxuXHRcdFx0XHRcdGRhdGFNb2RlbE9iamVjdEZvckNvbm5lY3RlZEZpZWxkcyBhcyBEYXRhTW9kZWxPYmplY3RQYXRoPERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlIHwgUHJvcGVydHk+XG5cdFx0XHQgIClcblx0XHRcdDogXCJ7PSAke2ludGVybmFsPnNob3dEZXRhaWxzfSA9PT0gdHJ1ZX1cIjtcblx0XHRjb25zdCBiaW5kaW5nU3RyaW5nID0gRm9ybUhlbHBlci5nZW5lcmF0ZUJpbmRpbmdFeHByZXNzaW9uKHRoaXMubmF2aWdhdGlvblBhdGgsIGRhdGFNb2RlbE9iamVjdEZvckNvbm5lY3RlZEZpZWxkcyk7XG5cdFx0Y29uc3QgdGFyZ2V0T2JqZWN0ID0gKGRhdGFNb2RlbE9iamVjdEZvckNvbm5lY3RlZEZpZWxkcz8udGFyZ2V0T2JqZWN0IGFzIHVua25vd24gYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik/LlRhcmdldFxuXHRcdFx0Py4kdGFyZ2V0IGFzIEFubm90YXRpb25UZXJtPENvbm5lY3RlZEZpZWxkc1R5cGVUeXBlcz47XG5cblx0XHRjb25zdCBkZXNpZ250aW1lID0gZGF0YU1vZGVsT2JqZWN0Rm9yQ29ubmVjdGVkRmllbGRzPy50YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5VST8uQWRhcHRhdGlvbkhpZGRlblxuXHRcdFx0PyBcIm5vdC1hZGFwdGFibGUtdHJlZVwiXG5cdFx0XHQ6IFwic2FwL2ZlL21hY3Jvcy9mb3JtL0Zvcm1FbGVtZW50LmRlc2lnbnRpbWVcIjtcblx0XHRjb25zdCBpc1JlcXVpcmVkID0gZ2V0UmVxdWlyZWRFeHByZXNzaW9uRm9yQ29ubmVjdGVkRGF0YUZpZWxkKFxuXHRcdFx0ZGF0YU1vZGVsT2JqZWN0Rm9yQ29ubmVjdGVkRmllbGRzIGFzIERhdGFNb2RlbE9iamVjdFBhdGg8QW5ub3RhdGlvblBhdGg8Q29ubmVjdGVkRmllbGRzVHlwZT4+XG5cdFx0KT8udG9TdHJpbmcoKTtcblxuXHRcdHJldHVybiB4bWxgXG5cdFx0XHQ8ZjpGb3JtRWxlbWVudFxuXHRcdFx0XHR4bWxuczpmPVwic2FwLnVpLmxheW91dC5mb3JtXCJcblx0XHRcdFx0ZHQ6ZGVzaWdudGltZT1cIiR7ZGVzaWdudGltZX1cIlxuXHRcdFx0XHRpZD1cIiR7Zm9ybUVsZW1lbnRJZH1cIlxuXHRcdFx0XHR2aXNpYmxlPVwiJHt2aXNpYmxlRXhwcmVzc2lvbn1cIlxuXHRcdFx0XHQke3RoaXMuYXR0cihcImJpbmRpbmdcIiwgYmluZGluZ1N0cmluZyl9XG5cdFx0XHQ+XG5cdFx0XHRcdDxmOmxhYmVsPlxuXHRcdFx0XHRcdDxMYWJlbFxuXHRcdFx0XHRcdHRleHQ9XCIke3RhcmdldE9iamVjdD8uTGFiZWwgPz8gZm9ybUVsZW1lbnQubGFiZWx9XCJcblx0XHRcdFx0XHRpZD1cIiR7dGhpcy5pZCA/IFN0YWJsZUlESGVscGVyLmdlbmVyYXRlKFt0aGlzLmlkLCBcIlNlbWFudGljRm9ybUVsZW1lbnRMYWJlbFwiLCBmb3JtRWxlbWVudC5rZXldKSA6IFwiXCJ9XCJcblxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvZjpsYWJlbD5cblx0XHRcdFx0PGY6ZmllbGRzPlxuXHRcdFx0XHRcdDxjb250cm9sczpGaWVsZFdyYXBwZXIgcmVxdWlyZWQ9XCIke2lzUmVxdWlyZWR9XCI+XG5cdFx0XHRcdFx0XHQ8SEJveCB3cmFwPVwiV3JhcFwiPlxuXHRcdFx0XHRcdFx0XHQke2Nvbm5lY3RlZEZpZWxkRWxlbWVudHN9XG5cdFx0XHRcdFx0XHQ8L0hCb3g+XG5cdFx0XHRcdFx0PC9jb250cm9sczpGaWVsZFdyYXBwZXI+XG5cdFx0XHRcdDwvZjpmaWVsZHM+XG5cdFx0XHQ8L2Y6Rm9ybUVsZW1lbnQ+XG5cdFx0YDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIHRlbXBsYXRlIGZvciBhIGZvcm0gZWxlbWVudCByZXByZXNlbnRpbmcgYSBtdWx0aXZhbHVlIGZpZWxkLlxuXHQgKiBAcGFyYW0gZm9ybUVsZW1lbnQgVGhlIGZvcm0gZWxlbWVudC5cblx0ICogQHJldHVybnMgVGhlIFhNTCBzdHJpbmcgZm9yIHRoZSBtdWx0aS12YWx1ZSBmaWVsZCBmb3JtIGVsZW1lbnQuXG5cdCAqL1xuXHRnZXRNdWx0aVZhbHVlRmllbGRGb3JtRWxlbWVudChmb3JtRWxlbWVudDogQW5ub3RhdGlvbkZvcm1FbGVtZW50KTogc3RyaW5nIHtcblx0XHRjb25zdCBjb21wdXRlZERhdGFNb2RlbE9iamVjdCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhcblx0XHRcdHRoaXMuY29udGV4dFBhdGguZ2V0TW9kZWwoKS5jcmVhdGVCaW5kaW5nQ29udGV4dChmb3JtRWxlbWVudC5hbm5vdGF0aW9uUGF0aCA/PyBcIlwiKVxuXHRcdCkgYXMgRGF0YU1vZGVsT2JqZWN0UGF0aDxFbnRpdHlTZXQ+IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHZpc2libGVFeHByZXNzaW9uID0gZm9ybUVsZW1lbnQuaXNQYXJ0T2ZQcmV2aWV3XG5cdFx0XHQ/IGdldFZpc2libGVFeHByZXNzaW9uKGNvbXB1dGVkRGF0YU1vZGVsT2JqZWN0IGFzIERhdGFNb2RlbE9iamVjdFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGUgfCBQcm9wZXJ0eT4pXG5cdFx0XHQ6IFwiez0gJHtpbnRlcm5hbD5zaG93RGV0YWlsc30gPT09IHRydWV9XCI7XG5cdFx0Y29uc3QgYmluZGluZ1N0cmluZyA9IEZvcm1IZWxwZXIuZ2VuZXJhdGVCaW5kaW5nRXhwcmVzc2lvbih0aGlzLm5hdmlnYXRpb25QYXRoLCBjb21wdXRlZERhdGFNb2RlbE9iamVjdCk7XG5cdFx0Y29uc3QgZm9ybUVsZW1lbnRJZCA9IHRoaXMuaWQgPyBgJHtTdGFibGVJREhlbHBlci5nZW5lcmF0ZShbdGhpcy5pZCwgXCJGb3JtRWxlbWVudFwiLCBmb3JtRWxlbWVudC5rZXldKX1gIDogXCJ1bmRlZmluZWRcIjtcblx0XHRjb25zdCBtdWx0aVZhbHVlRmllbGRJZCA9IHRoaXMuaWRcblx0XHRcdD8gYCR7U3RhYmxlSURIZWxwZXIuZ2VuZXJhdGUoW3RoaXMuaWQsIFwiRm9ybUVsZW1lbnRcIiwgZm9ybUVsZW1lbnQua2V5LCBcIk11bHRpVmFsdWVGaWVsZFwiXSl9YFxuXHRcdFx0OiBcInVuZGVmaW5lZFwiO1xuXHRcdGNvbnN0IHZoSWRQcmVmaXggPSB0aGlzLmlkID8gU3RhYmxlSURIZWxwZXIuZ2VuZXJhdGUoW3RoaXMuaWQsIFwiRmllbGRWYWx1ZUhlbHBcIl0pIDogXCJcIjtcblx0XHRjb25zdCBkZXNpZ250aW1lID0gY29tcHV0ZWREYXRhTW9kZWxPYmplY3Q/LnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/LlVJPy5BZGFwdGF0aW9uSGlkZGVuXG5cdFx0XHQ/IFwibm90LWFkYXB0YWJsZS10cmVlXCJcblx0XHRcdDogXCJzYXAvZmUvbWFjcm9zL2Zvcm0vRm9ybUVsZW1lbnQuZGVzaWdudGltZVwiO1xuXG5cdFx0cmV0dXJuIHhtbGBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxmOkZvcm1FbGVtZW50XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHhtbG5zOm1hY3Jvcz1cInNhcC5mZS5tYWNyb3NcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR4bWxuczptdWx0aXZhbHVlZmllbGQ9XCJzYXAuZmUubWFjcm9zLm11bHRpdmFsdWVmaWVsZFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGR0OmRlc2lnbnRpbWU9XCIke2Rlc2lnbnRpbWV9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWQ9XCIke2Zvcm1FbGVtZW50SWR9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9XCIke2Zvcm1FbGVtZW50LmxhYmVsfVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZpc2libGU9XCIke3Zpc2libGVFeHByZXNzaW9ufVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR7dGhpcy5hdHRyKFwiYmluZGluZ1wiLCBiaW5kaW5nU3RyaW5nKX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGY6ZmllbGRzPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxtYWNyb3M6TXVsdGlWYWx1ZUZpZWxkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZD1cIiR7bXVsdGlWYWx1ZUZpZWxkSWR9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZoSWRQcmVmaXg9XCIke3ZoSWRQcmVmaXh9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoPVwiJHt0aGlzLmVudGl0eVNldD8uZ2V0UGF0aCgpfVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXRhUGF0aD1cIiR7Zm9ybUVsZW1lbnQuYW5ub3RhdGlvblBhdGh9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bWFjcm9zOmZvcm1hdE9wdGlvbnM+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxtdWx0aXZhbHVlZmllbGQ6Rm9ybWF0T3B0aW9ucyBzaG93RW1wdHlJbmRpY2F0b3I9XCJ0cnVlXCIgLz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvbWFjcm9zOmZvcm1hdE9wdGlvbnM+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9tYWNyb3M6TXVsdGlWYWx1ZUZpZWxkPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Y6ZmllbGRzPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9mOkZvcm1FbGVtZW50PmA7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSB0ZW1wbGF0ZSBmb3IgZm9ybSBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBjaGVja2JveCBncm91cC5cblx0ICogQHBhcmFtIGZvcm1FbGVtZW50IFRoZSBmb3JtIGVsZW1lbnQuXG5cdCAqIEByZXR1cm5zIFRoZSBYTUwgc3RyaW5nIGZvciB0aGUgY2hlY2tib3ggZ3JvdXAgZm9ybSBlbGVtZW50cy5cblx0ICovXG5cdGdldEZpZWxkR3JvdXBGb3JtRWxlbWVudChmb3JtRWxlbWVudDogQW5ub3RhdGlvbkZvcm1FbGVtZW50KTogc3RyaW5nIHtcblx0XHRsZXQgZmllbGRHcm91cEVsZW1lbnRzID0gXCJcIjtcblx0XHQvL1dlIHRlbXBsYXRlIGVhY2ggZWxlbWVudCBvZiB0aGUgY2hlY2tib3ggZ3JvdXBcblx0XHRmb3IgKGNvbnN0IGdyb3VwRWxlbWVudCBvZiBmb3JtRWxlbWVudC5maWVsZEdyb3VwRWxlbWVudHMhKSB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IHRoaXMuY29udGV4dFBhdGguZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IHRlbXBOYW1lID0gZ3JvdXBFbGVtZW50LmZ1bGx5UXVhbGlmaWVkTmFtZTtcblx0XHRcdGNvbnN0IHBhdGggPSB0ZW1wTmFtZT8uc3Vic3RyaW5nKHRlbXBOYW1lLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xuXHRcdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSBtb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChmb3JtRWxlbWVudC5hbm5vdGF0aW9uUGF0aCArIFwiVGFyZ2V0LyRBbm5vdGF0aW9uUGF0aC9EYXRhL1wiICsgcGF0aCk7XG5cdFx0XHRjb25zdCBncm91cEVsZW1lbnREYXRhTW9kZWxPYmplY3QgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHM8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGU+KGJpbmRpbmdDb250ZXh0KTtcblx0XHRcdGNvbnN0IGNvbXB1dGVkSWRQcmVmaXggPSB0aGlzLmlkXG5cdFx0XHRcdD8gYCR7U3RhYmxlSURIZWxwZXIuZ2VuZXJhdGUoW1xuXHRcdFx0XHRcdFx0dGhpcy5pZCxcblx0XHRcdFx0XHRcdFwiQ2hlY2tCb3hHcm91cFwiLFxuXHRcdFx0XHRcdFx0Zm9ybUVsZW1lbnQua2V5LFxuXHRcdFx0XHRcdFx0KGdyb3VwRWxlbWVudERhdGFNb2RlbE9iamVjdC50YXJnZXRPYmplY3QgYXMgRGF0YUZpZWxkIHwgRGF0YVBvaW50VHlwZSk/LlZhbHVlPy5wYXRoXG5cdFx0XHRcdCAgXSl9YFxuXHRcdFx0XHQ6IFwiXCI7XG5cblx0XHRcdGNvbnN0IGlzQm9vbGVhbkZpZWxkR3JvdXAgPVxuXHRcdFx0XHQoZ3JvdXBFbGVtZW50RGF0YU1vZGVsT2JqZWN0LnRhcmdldE9iamVjdCBhcyBEYXRhRmllbGQgfCBEYXRhUG9pbnRUeXBlKT8uVmFsdWU/LiR0YXJnZXQ/LnR5cGUgPT09IFwiRWRtLkJvb2xlYW5cIjtcblxuXHRcdFx0Y29uc3QgZmllbGRHcm91cEVsZW1lbnQgPSBpc0Jvb2xlYW5GaWVsZEdyb3VwXG5cdFx0XHRcdD8geG1sYFxuXHRcdFx0XHQ8bWFjcm86RmllbGRcblx0XHRcdFx0XHRpZFByZWZpeD1cIiR7Y29tcHV0ZWRJZFByZWZpeH1cIlxuXHRcdFx0XHRcdGNvbnRleHRQYXRoPVwiJHt0aGlzLmVudGl0eVNldD8uZ2V0UGF0aCgpfVwiXG5cdFx0XHRcdFx0bWV0YVBhdGg9XCIke2JpbmRpbmdDb250ZXh0LmdldFBhdGgoKX1cIlxuXHRcdFx0XHRcdG9uQ2hhbmdlPVwiJHt0aGlzLm9uQ2hhbmdlfVwiXG5cdFx0XHRcdFx0YXJpYUxhYmVsbGVkQnk9XCIke3RoaXMuaWQgPyBTdGFibGVJREhlbHBlci5nZW5lcmF0ZShbdGhpcy5pZCwgXCJGaWVsZEdyb3VwRm9ybUVsZW1lbnRMYWJlbFwiLCBmb3JtRWxlbWVudC5rZXldKSA6IFwiXCJ9XCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxmb3JtYXRPcHRpb25zIGlzRmllbGRHcm91cEl0ZW09XCJ0cnVlXCIgdGV4dEFsaWduTW9kZT1cIkZvcm1cIiAvPlxuXHRcdFx0XHQ8L21hY3JvOkZpZWxkPlxuXHRcdFx0YFxuXHRcdFx0XHQ6IFwiXCI7XG5cblx0XHRcdGZpZWxkR3JvdXBFbGVtZW50cyArPSBmaWVsZEdyb3VwRWxlbWVudDtcblx0XHR9XG5cblx0XHRjb25zdCBjb21wdXRlZERhdGFNb2RlbE9iamVjdCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhcblx0XHRcdHRoaXMuY29udGV4dFBhdGguZ2V0TW9kZWwoKS5jcmVhdGVCaW5kaW5nQ29udGV4dChmb3JtRWxlbWVudC5hbm5vdGF0aW9uUGF0aCA/PyBcIlwiKVxuXHRcdCkgYXMgRGF0YU1vZGVsT2JqZWN0UGF0aDxFbnRpdHlTZXQ+IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHZpc2libGVFeHByZXNzaW9uID0gZm9ybUVsZW1lbnQuaXNQYXJ0T2ZQcmV2aWV3XG5cdFx0XHQ/IGdldFZpc2libGVFeHByZXNzaW9uKGNvbXB1dGVkRGF0YU1vZGVsT2JqZWN0IGFzIERhdGFNb2RlbE9iamVjdFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGUgfCBQcm9wZXJ0eT4pXG5cdFx0XHQ6IFwiez0gJHtpbnRlcm5hbD5zaG93RGV0YWlsc30gPT09IHRydWV9XCI7XG5cdFx0Y29uc3QgYmluZGluZ1N0cmluZyA9IEZvcm1IZWxwZXIuZ2VuZXJhdGVCaW5kaW5nRXhwcmVzc2lvbih0aGlzLm5hdmlnYXRpb25QYXRoLCBjb21wdXRlZERhdGFNb2RlbE9iamVjdCk7XG5cdFx0bGV0IGZpZWxkR3JvdXBGb3JtRWxlbWVudElkID0gXCJcIjtcblx0XHRsZXQgbGFiZWxJRCA9IFwiXCI7XG5cdFx0aWYgKHRoaXMuaWQpIHtcblx0XHRcdGlmICh0aGlzLmNvbnRlbnRJZCkge1xuXHRcdFx0XHRmaWVsZEdyb3VwRm9ybUVsZW1lbnRJZCA9IGAke3RoaXMuY29udGVudElkfS0tJHtTdGFibGVJREhlbHBlci5nZW5lcmF0ZShbXG5cdFx0XHRcdFx0dGhpcy5pZCxcblx0XHRcdFx0XHRcIkZpZWxkR3JvdXBGb3JtRWxlbWVudFwiLFxuXHRcdFx0XHRcdGZvcm1FbGVtZW50LmtleVxuXHRcdFx0XHRdKX1gO1xuXHRcdFx0XHRsYWJlbElEID0gYCR7dGhpcy5jb250ZW50SWR9LS0ke1N0YWJsZUlESGVscGVyLmdlbmVyYXRlKFt0aGlzLmlkLCBcIkZpZWxkR3JvdXBGb3JtRWxlbWVudExhYmVsXCIsIGZvcm1FbGVtZW50LmtleV0pfWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmaWVsZEdyb3VwRm9ybUVsZW1lbnRJZCA9IGAke1N0YWJsZUlESGVscGVyLmdlbmVyYXRlKFt0aGlzLmlkLCBcIkZpZWxkR3JvdXBGb3JtRWxlbWVudFwiLCBmb3JtRWxlbWVudC5rZXldKX1gO1xuXHRcdFx0XHRsYWJlbElEID0gYCR7U3RhYmxlSURIZWxwZXIuZ2VuZXJhdGUoW3RoaXMuaWQsIFwiRmllbGRHcm91cEZvcm1FbGVtZW50TGFiZWxcIiwgZm9ybUVsZW1lbnQua2V5XSl9YDtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3QgdGFyZ2V0T2JqZWN0ID0gKGNvbXB1dGVkRGF0YU1vZGVsT2JqZWN0Py50YXJnZXRPYmplY3QgYXMgdW5rbm93biBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKT8uVGFyZ2V0Py4kdGFyZ2V0IGFzIEZpZWxkR3JvdXA7XG5cblx0XHRjb25zdCBkZXNpZ250aW1lID0gY29tcHV0ZWREYXRhTW9kZWxPYmplY3Q/LnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/LlVJPy5BZGFwdGF0aW9uSGlkZGVuXG5cdFx0XHQ/IFwibm90LWFkYXB0YWJsZS10cmVlXCJcblx0XHRcdDogXCJzYXAvZmUvbWFjcm9zL2Zvcm0vRm9ybUVsZW1lbnQuZGVzaWdudGltZVwiO1xuXG5cdFx0cmV0dXJuIHhtbGBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxmOkZvcm1FbGVtZW50XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHhtbG5zOmY9XCJzYXAudWkubGF5b3V0LmZvcm1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkdDpkZXNpZ250aW1lPVwiJHtkZXNpZ250aW1lfVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlkPVwiJHtmaWVsZEdyb3VwRm9ybUVsZW1lbnRJZH1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2aXNpYmxlPVwiJHt2aXNpYmxlRXhwcmVzc2lvbn1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQke3RoaXMuYXR0cihcImJpbmRpbmdcIiwgYmluZGluZ1N0cmluZyl9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxmOmxhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxMYWJlbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGV4dD1cIiR7dGFyZ2V0T2JqZWN0Py5MYWJlbCA/PyBmb3JtRWxlbWVudC5sYWJlbH1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWQ9XCIke2xhYmVsSUR9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Y6bGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxmOmZpZWxkcz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8Y29udHJvbHM6UmVxdWlyZWRGbGV4Qm94PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PEZsZXhCb3hcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGlyZWN0aW9uPVwiJHtmb3JtRWxlbWVudC5mb3JtYXRPcHRpb25zPy5maWVsZEdyb3VwSG9yaXpvbnRhbExheW91dCA9PT0gdHJ1ZSA/IFwiUm93XCIgOiBcIkNvbHVtblwifVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHdyYXA9XCJXcmFwXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sdW1uR2FwPVwiMXJlbVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpdGVtcz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQke2ZpZWxkR3JvdXBFbGVtZW50c31cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9pdGVtcz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvRmxleEJveD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2NvbnRyb2xzOlJlcXVpcmVkRmxleEJveD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9mOmZpZWxkcz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZjpGb3JtRWxlbWVudD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRgO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgdGVtcGxhdGUgZm9yIGEgZm9ybSBlbGVtZW50IHJlcHJlc2VudGluZyBhIGZpZWxkLlxuXHQgKiBAcGFyYW0gZm9ybUVsZW1lbnQgVGhlIGZvcm0gZWxlbWVudC5cblx0ICogQHJldHVybnMgVGhlIFhNTCBzdHJpbmcgZm9yIHRoZSBmaWVsZCBmb3JtIGVsZW1lbnQuXG5cdCAqL1xuXHRnZXRGaWVsZEZvcm1FbGVtZW50KGZvcm1FbGVtZW50OiBBbm5vdGF0aW9uRm9ybUVsZW1lbnQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGNvbXB1dGVkRGF0YU1vZGVsT2JqZWN0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKFxuXHRcdFx0dGhpcy5jb250ZXh0UGF0aC5nZXRNb2RlbCgpLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGZvcm1FbGVtZW50LmFubm90YXRpb25QYXRoID8/IFwiXCIpXG5cdFx0KSBhcyBEYXRhTW9kZWxPYmplY3RQYXRoPEVudGl0eVNldD4gfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgYmluZGluZ1N0cmluZyA9IEZvcm1IZWxwZXIuZ2VuZXJhdGVCaW5kaW5nRXhwcmVzc2lvbih0aGlzLm5hdmlnYXRpb25QYXRoLCBjb21wdXRlZERhdGFNb2RlbE9iamVjdCk7XG5cdFx0Y29uc3QgY29tcHV0ZWRWaElkUHJlZml4ID0gU3RhYmxlSURIZWxwZXIuZ2VuZXJhdGUoW3RoaXMuaWQsIFwiRmllbGRWYWx1ZUhlbHBcIl0pO1xuXHRcdGxldCBmb3JtRWxlbWVudElkID0gXCJ1bmRlZmluZWRcIjtcblx0XHRjb25zdCB2aXNpYmxlRXhwcmVzc2lvbiA9IGZvcm1FbGVtZW50LmlzUGFydE9mUHJldmlld1xuXHRcdFx0PyBnZXRWaXNpYmxlRXhwcmVzc2lvbihjb21wdXRlZERhdGFNb2RlbE9iamVjdCBhcyBEYXRhTW9kZWxPYmplY3RQYXRoPERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlIHwgUHJvcGVydHk+KVxuXHRcdFx0OiBcIns9ICR7aW50ZXJuYWw+c2hvd0RldGFpbHN9ID09PSB0cnVlfVwiO1xuXHRcdGNvbnN0IGNvbXB1dGVkSWRQcmVmaXggPSB0aGlzLmlkID8gYCR7U3RhYmxlSURIZWxwZXIuZ2VuZXJhdGUoW3RoaXMuaWQsIFwiRm9ybUVsZW1lbnRcIiwgZm9ybUVsZW1lbnQua2V5XSl9YCA6IFwiXCI7XG5cdFx0aWYgKHRoaXMuaWQpIHtcblx0XHRcdGlmICh0aGlzLmNvbnRlbnRJZCkge1xuXHRcdFx0XHRmb3JtRWxlbWVudElkID0gYCR7dGhpcy5jb250ZW50SWR9LS0ke1N0YWJsZUlESGVscGVyLmdlbmVyYXRlKFt0aGlzLmlkLCBcIkZvcm1FbGVtZW50XCIsIGZvcm1FbGVtZW50LmtleV0pfWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3JtRWxlbWVudElkID0gYCR7U3RhYmxlSURIZWxwZXIuZ2VuZXJhdGUoW3RoaXMuaWQsIFwiRm9ybUVsZW1lbnRcIiwgZm9ybUVsZW1lbnQua2V5XSl9YDtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3QgZGVzaWdudGltZSA9IGNvbXB1dGVkRGF0YU1vZGVsT2JqZWN0Py50YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5VST8uQWRhcHRhdGlvbkhpZGRlblxuXHRcdFx0PyBcIm5vdC1hZGFwdGFibGUtdHJlZVwiXG5cdFx0XHQ6IFwic2FwL2ZlL21hY3Jvcy9mb3JtL0Zvcm1FbGVtZW50LmRlc2lnbnRpbWVcIjtcblxuXHRcdHJldHVybiB4bWxgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZjpGb3JtRWxlbWVudFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR4bWxuczpmPVwic2FwLnVpLmxheW91dC5mb3JtXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZHQ6ZGVzaWdudGltZT1cIiR7ZGVzaWdudGltZX1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZD1cIiR7Zm9ybUVsZW1lbnRJZH1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD1cIiR7Zm9ybUVsZW1lbnQubGFiZWx9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmlzaWJsZT1cIiR7dmlzaWJsZUV4cHJlc3Npb259XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHt0aGlzLmF0dHIoXCJiaW5kaW5nXCIsIGJpbmRpbmdTdHJpbmcpfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZjpmaWVsZHM+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PG1hY3JvOkZpZWxkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZFByZWZpeD1cIiR7Y29tcHV0ZWRJZFByZWZpeH1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmhJZFByZWZpeD1cIiR7Y29tcHV0ZWRWaElkUHJlZml4fVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aD1cIiR7dGhpcy5jb250ZXh0UGF0aC5nZXRQYXRoKCl9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1ldGFQYXRoPVwiJHtmb3JtRWxlbWVudC5hbm5vdGF0aW9uUGF0aH1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b25DaGFuZ2U9XCIke3RoaXMub25DaGFuZ2V9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlYWRPbmx5PVwiJHtmb3JtRWxlbWVudC5yZWFkT25seX1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q9XCIke2Zvcm1FbGVtZW50LnNlbWFudGljT2JqZWN0fVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxmb3JtYXRPcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRleHRMaW5lc0VkaXQ9XCIke2Zvcm1FbGVtZW50LmZvcm1hdE9wdGlvbnM/LnRleHRMaW5lc0VkaXR9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGV4dE1heExpbmVzPVwiJHtmb3JtRWxlbWVudC5mb3JtYXRPcHRpb25zPy50ZXh0TWF4TGluZXN9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGV4dE1heExlbmd0aD1cIiR7Zm9ybUVsZW1lbnQuZm9ybWF0T3B0aW9ucz8udGV4dE1heExlbmd0aH1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXh0TWF4Q2hhcmFjdGVyc0Rpc3BsYXk9XCIke2Zvcm1FbGVtZW50LmZvcm1hdE9wdGlvbnM/LnRleHRNYXhDaGFyYWN0ZXJzRGlzcGxheX1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXh0RXhwYW5kQmVoYXZpb3JEaXNwbGF5PVwiJHtmb3JtRWxlbWVudC5mb3JtYXRPcHRpb25zPy50ZXh0RXhwYW5kQmVoYXZpb3JEaXNwbGF5fVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRleHRBbGlnbk1vZGU9XCJGb3JtXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c2hvd0VtcHR5SW5kaWNhdG9yPVwidHJ1ZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkRWRpdFN0eWxlPVwiJHtmb3JtRWxlbWVudC5mb3JtYXRPcHRpb25zPy5maWVsZEVkaXRTdHlsZX1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyYWRpb0J1dHRvbnNIb3Jpem9udGFsTGF5b3V0PVwiJHtmb3JtRWxlbWVudC5mb3JtYXRPcHRpb25zPy5yYWRpb0J1dHRvbnNIb3Jpem9udGFsTGF5b3V0fVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGVUaW1lUGF0dGVybj1cIiR7Zm9ybUVsZW1lbnQuZm9ybWF0T3B0aW9ucz8ucGF0dGVybn1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1c2VSYWRpb0J1dHRvbnNGb3JCb29sZWFuPVwiJHtmb3JtRWxlbWVudC5mb3JtYXRPcHRpb25zPy51c2VSYWRpb0J1dHRvbnNGb3JCb29sZWFufVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvbWFjcm86RmllbGQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZjpmaWVsZHM+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Y6Rm9ybUVsZW1lbnQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIHRlbXBsYXRlIGZvciBhIGN1c3RvbSBmb3JtIGVsZW1lbnQuXG5cdCAqIEBwYXJhbSBmb3JtRWxlbWVudCBUaGUgY3VzdG9tIGZvcm0gZWxlbWVudC5cblx0ICogQHJldHVybnMgVGhlIFhNTCBzdHJpbmcgZm9yIHRoZSBjdXN0b20gZm9ybSBlbGVtZW50LlxuXHQgKi9cblx0Z2V0Q3VzdG9tRm9ybUVsZW1lbnQoZm9ybUVsZW1lbnQ6IEN1c3RvbUZvcm1FbGVtZW50KTogc3RyaW5nIHtcblx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSB0aGlzLmNvbnRleHRQYXRoLmdldFBhdGgoKSArIFwiL1wiICsgZm9ybUVsZW1lbnQucHJvcGVydHlQYXRoO1xuXHRcdGNvbnN0IGNvbXB1dGVkRGF0YU1vZGVsT2JqZWN0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKHRoaXMuY29udGV4dFBhdGguZ2V0TW9kZWwoKS5jcmVhdGVCaW5kaW5nQ29udGV4dChwcm9wZXJ0eVBhdGgpKSBhc1xuXHRcdFx0fCBEYXRhTW9kZWxPYmplY3RQYXRoPEVudGl0eVNldD5cblx0XHRcdHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGJpbmRpbmdTdHJpbmcgPSBGb3JtSGVscGVyLmdlbmVyYXRlQmluZGluZ0V4cHJlc3Npb24odGhpcy5uYXZpZ2F0aW9uUGF0aCwgY29tcHV0ZWREYXRhTW9kZWxPYmplY3QpO1xuXHRcdGxldCBmb3JtRWxlbWVudElkID0gXCJcIjtcblx0XHRpZiAodGhpcy5pZCkge1xuXHRcdFx0aWYgKHRoaXMuY29udGVudElkKSB7XG5cdFx0XHRcdGZvcm1FbGVtZW50SWQgPSBgJHt0aGlzLmNvbnRlbnRJZH0tLSR7U3RhYmxlSURIZWxwZXIuZ2VuZXJhdGUoW3RoaXMuaWQsIGZvcm1FbGVtZW50LmlkXSl9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvcm1FbGVtZW50SWQgPSBgJHtTdGFibGVJREhlbHBlci5nZW5lcmF0ZShbdGhpcy5pZCwgZm9ybUVsZW1lbnQuaWRdKX1gO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBkZXNpZ250aW1lID0gY29tcHV0ZWREYXRhTW9kZWxPYmplY3Q/LnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/LlVJPy5BZGFwdGF0aW9uSGlkZGVuXG5cdFx0XHQ/IFwibm90LWFkYXB0YWJsZS10cmVlXCJcblx0XHRcdDogXCJzYXAvZmUvbWFjcm9zL2Zvcm0vRm9ybUVsZW1lbnQuZGVzaWdudGltZVwiO1xuXHRcdGNvbnN0IGZvcm1FbGVtZW50S2V5ID0gU3RhYmxlSURIZWxwZXIuZ2VuZXJhdGUoW3RoaXMuaWQsIGZvcm1FbGVtZW50LmtleV0pO1xuXHRcdHJldHVybiB4bWxgXG5cdFx0XHRcdFx0XHRcdFx0PGY6Rm9ybUVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZHQ6ZGVzaWdudGltZT1cIiR7ZGVzaWdudGltZX1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZD1cIiR7Zm9ybUVsZW1lbnRJZH1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD1cIiR7Zm9ybUVsZW1lbnQubGFiZWx9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmlzaWJsZT1cIiR7Zm9ybUVsZW1lbnQudmlzaWJsZX1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQke3RoaXMuYXR0cihcImJpbmRpbmdcIiwgYmluZGluZ1N0cmluZyl9XG5cdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxmOmZpZWxkcz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bWFjcm9Gb3JtOkN1c3RvbUZvcm1FbGVtZW50XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXRhUGF0aD1cIiR7Zm9ybUVsZW1lbnQucHJvcGVydHlQYXRofVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aD1cIiR7dGhpcy5jb250ZXh0UGF0aC5nZXRQYXRoKCl9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvcm1FbGVtZW50S2V5PVwiJHtmb3JtRWxlbWVudEtleX1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxmcG06Q3VzdG9tRnJhZ21lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWQ9XCIke2Zvcm1FbGVtZW50S2V5fVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZyYWdtZW50TmFtZT1cIiR7Zm9ybUVsZW1lbnQudGVtcGxhdGV9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg9XCIke3RoaXMuY29udGV4dFBhdGguZ2V0UGF0aCgpfVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvbWFjcm9Gb3JtOkN1c3RvbUZvcm1FbGVtZW50PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Y6ZmllbGRzPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9mOkZvcm1FbGVtZW50PlxuXHRcdGA7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgdGVtcGxhdGUgZm9yIGEgc2xvdCBjb2x1bW4gZm9yIHRoZSBnaXZlbiBmb3JtIGVsZW1lbnQuXG5cdCAqIEBwYXJhbSBmb3JtRWxlbWVudCBUaGUgZm9ybSBlbGVtZW50LlxuXHQgKiBAcmV0dXJucyBUaGUgWE1MIHN0cmluZyBmb3IgdGhlIHNsb3QgY29sdW1uLlxuXHQgKi9cblx0Z2V0U2xvdENvbHVtbihmb3JtRWxlbWVudDogRm9ybUVsZW1lbnQpOiBzdHJpbmcge1xuXHRcdHJldHVybiB4bWxgPHNsb3QgbmFtZT1cIiR7Zm9ybUVsZW1lbnQua2V5fVwiIC8+YDtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBkYXRhIGZpZWxkIGlzIGEgbXVsdGl2YWx1ZSBmaWVsZC5cblx0ICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgZGF0YSBmaWVsZCB0byBjaGVjay5cblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZGF0YSBmaWVsZCBpcyBhIG11bHRpdmFsdWUgZmllbGQsIGZhbHNlIG90aGVyd2lzZS5cblx0ICovXG5cdGlzTXVsdGlWYWx1ZURhdGFGaWVsZChkYXRhRmllbGQ6IEZvcm1FbGVtZW50KTogYm9vbGVhbiB7XG5cdFx0bGV0IGlzTXVsdGlWYWx1ZUZpZWxkQ29uZGl0aW9uID0gZmFsc2U7XG5cdFx0aWYgKGRhdGFGaWVsZC5hbm5vdGF0aW9uUGF0aCkge1xuXHRcdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSB0aGlzLmNvbnRleHRQYXRoLmdldE1vZGVsKCkuY3JlYXRlQmluZGluZ0NvbnRleHQoZGF0YUZpZWxkLmFubm90YXRpb25QYXRoKTtcblx0XHRcdGNvbnN0IHZhbHVlUGF0aCA9IGJpbmRpbmdDb250ZXh0LmdldE9iamVjdCgpPy5WYWx1ZT8uJFBhdGg7XG5cdFx0XHRpZiAodmFsdWVQYXRoKSB7XG5cdFx0XHRcdGlzTXVsdGlWYWx1ZUZpZWxkQ29uZGl0aW9uID0gaXNNdWx0aVZhbHVlRmllbGQoXG5cdFx0XHRcdFx0ZW5oYW5jZURhdGFNb2RlbFBhdGgoZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKGJpbmRpbmdDb250ZXh0KSwgdmFsdWVQYXRoKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBpc011bHRpVmFsdWVGaWVsZENvbmRpdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIHRlbXBsYXRlIGZvciBhbGwgZGF0YSBmaWVsZHMgZm9yIGFubm90YXRpb25zLlxuXHQgKiBAcmV0dXJucyBUaGUgWE1MIHN0cmluZyBmb3IgdGhlIGRhdGEgZmllbGRzLlxuXHQgKi9cblx0Z2V0RGF0YUZpZWxkc0ZvckFubm90YXRpb25zKCk6IHN0cmluZyB7XG5cdFx0bGV0IHJldHVyblN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAodGhpcy5kYXRhRmllbGRDb2xsZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGZvciAoY29uc3QgZGF0YUZpZWxkIG9mIHRoaXMuZGF0YUZpZWxkQ29sbGVjdGlvbikge1xuXHRcdFx0XHRzd2l0Y2ggKGRhdGFGaWVsZC50eXBlKSB7XG5cdFx0XHRcdFx0Y2FzZSBcIkFubm90YXRpb25cIjpcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0KGRhdGFGaWVsZCBhcyBBbm5vdGF0aW9uRm9ybUVsZW1lbnQpLmNvbm5lY3RlZEZpZWxkcyAmJlxuXHRcdFx0XHRcdFx0XHQoZGF0YUZpZWxkIGFzIEFubm90YXRpb25Gb3JtRWxlbWVudCkuY29ubmVjdGVkRmllbGRzIS5sZW5ndGggPiAwXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuU3RyaW5nICs9IHRoaXMuZ2V0Q29ubmVjdGVkRmllbGRzRm9ybUVsZW1lbnQoZGF0YUZpZWxkKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5pc011bHRpVmFsdWVEYXRhRmllbGQoZGF0YUZpZWxkKSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm5TdHJpbmcgKz0gdGhpcy5nZXRNdWx0aVZhbHVlRmllbGRGb3JtRWxlbWVudChkYXRhRmllbGQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdFx0KGRhdGFGaWVsZCBhcyBBbm5vdGF0aW9uRm9ybUVsZW1lbnQpLmZpZWxkR3JvdXBFbGVtZW50cyAmJlxuXHRcdFx0XHRcdFx0XHQoZGF0YUZpZWxkIGFzIEFubm90YXRpb25Gb3JtRWxlbWVudCkuZmllbGRHcm91cEVsZW1lbnRzIS5sZW5ndGggPiAwXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuU3RyaW5nICs9IHRoaXMuZ2V0RmllbGRHcm91cEZvcm1FbGVtZW50KGRhdGFGaWVsZCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm5TdHJpbmcgKz0gdGhpcy5nZXRGaWVsZEZvcm1FbGVtZW50KGRhdGFGaWVsZCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwiRGVmYXVsdFwiOlxuXHRcdFx0XHRcdFx0cmV0dXJuU3RyaW5nICs9IHRoaXMuZ2V0Q3VzdG9tRm9ybUVsZW1lbnQoZGF0YUZpZWxkIGFzIEN1c3RvbUZvcm1FbGVtZW50KTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRyZXR1cm5TdHJpbmcgKz0gdGhpcy5nZXRTbG90Q29sdW1uKGRhdGFGaWVsZCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1c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
|