@sapui5/sap.fe.core 1.93.3 → 1.97.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 +6 -6
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AppComponent.js +8 -40
- package/src/sap/fe/core/BusyLocker.js +12 -0
- package/src/sap/fe/core/CommonUtils.js +224 -48
- package/src/sap/fe/core/ExtensionAPI.js +1 -1
- package/src/sap/fe/core/PageController.js +13 -2
- package/src/sap/fe/core/RouterProxy.js +52 -64
- package/src/sap/fe/core/TemplateComponent.js +8 -2
- package/src/sap/fe/core/TransactionHelper.js +210 -180
- package/src/sap/fe/core/actions/draft.js +13 -1
- package/src/sap/fe/core/actions/messageHandling.js +80 -4
- package/src/sap/fe/core/actions/operations.js +207 -68
- package/src/sap/fe/core/controllerextensions/EditFlow.js +82 -55
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +13 -6
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +132 -23
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +203 -214
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +834 -170
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +890 -189
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +222 -102
- package/src/sap/fe/core/controllerextensions/PageReady.js +48 -33
- package/src/sap/fe/core/controllerextensions/PageReady.ts +49 -14
- package/src/sap/fe/core/controllerextensions/Paginator.js +150 -0
- package/src/sap/fe/core/controllerextensions/Placeholder.js +133 -270
- package/src/sap/fe/core/controllerextensions/Share.js +12 -9
- package/src/sap/fe/core/controllerextensions/SideEffects.js +5 -6
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +13 -12
- package/src/sap/fe/core/controllerextensions/ViewState.js +202 -8
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +39 -34
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +35 -0
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +1 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +109 -108
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +45 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +15 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +250 -94
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +129 -135
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +325 -0
- package/src/sap/fe/core/controls/filterbar.d.js +8 -0
- package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
- package/src/sap/fe/core/converters/ConverterContext.js +19 -5
- package/src/sap/fe/core/converters/ConverterContext.ts +13 -3
- package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +13 -3
- package/src/sap/fe/core/converters/ManifestWrapper.js +9 -9
- package/src/sap/fe/core/converters/MetaModelConverter.js +867 -871
- package/src/sap/fe/core/converters/MetaModelConverter.ts +772 -827
- package/src/sap/fe/core/converters/TemplateConverter.js +4 -4
- package/src/sap/fe/core/converters/annotations/DataField.js +57 -7
- package/src/sap/fe/core/converters/annotations/DataField.ts +52 -2
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +146 -85
- package/src/sap/fe/core/converters/controls/Common/Action.js +61 -56
- package/src/sap/fe/core/converters/controls/Common/Action.ts +54 -39
- package/src/sap/fe/core/converters/controls/Common/Chart.js +101 -9
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +100 -5
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +15 -16
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +16 -30
- package/src/sap/fe/core/converters/controls/Common/Form.js +77 -29
- package/src/sap/fe/core/converters/controls/Common/Form.ts +79 -21
- package/src/sap/fe/core/converters/controls/Common/KPI.js +287 -109
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +314 -139
- package/src/sap/fe/core/converters/controls/Common/Table.js +521 -166
- package/src/sap/fe/core/converters/controls/Common/Table.ts +519 -115
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +487 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +541 -0
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +364 -0
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +338 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +74 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +50 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +11 -11
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +47 -35
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +45 -29
- package/src/sap/fe/core/converters/helpers/Aggregation.js +31 -32
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +26 -27
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +27 -2
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +22 -2
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
- package/src/sap/fe/core/converters/helpers/ID.js +9 -3
- package/src/sap/fe/core/converters/helpers/ID.ts +6 -3
- package/src/sap/fe/core/converters/helpers/IssueManager.js +5 -4
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +4 -3
- package/src/sap/fe/core/converters/helpers/Key.js +3 -3
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +11 -6
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +9 -5
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +18 -5
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +14 -14
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +91 -20
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +77 -5
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +87 -714
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +85 -812
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +106 -17
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +121 -16
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +2 -1
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.ts +8 -3
- package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
- package/src/sap/fe/core/formatters/TableFormatter.js +27 -4
- package/src/sap/fe/core/formatters/TableFormatter.ts +20 -3
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
- package/src/sap/fe/core/fpm/Component.js +1 -1
- package/src/sap/fe/core/helpers/AnnotationEnum.js +3 -3
- package/src/sap/fe/core/helpers/BindingExpression.js +6 -6
- package/src/sap/fe/core/helpers/ClassSupport.js +4 -4
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +0 -2
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +211 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +78 -0
- package/src/sap/fe/core/helpers/PasteHelper.js +6 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +2 -2
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.ts +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.js +2 -2
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/messagebundle.properties +45 -2
- package/src/sap/fe/core/messagebundle_ar.properties +53 -1
- package/src/sap/fe/core/messagebundle_bg.properties +52 -0
- package/src/sap/fe/core/messagebundle_ca.properties +54 -2
- package/src/sap/fe/core/messagebundle_cs.properties +52 -0
- package/src/sap/fe/core/messagebundle_cy.properties +52 -0
- package/src/sap/fe/core/messagebundle_da.properties +53 -1
- package/src/sap/fe/core/messagebundle_de.properties +55 -3
- package/src/sap/fe/core/messagebundle_el.properties +53 -1
- package/src/sap/fe/core/messagebundle_en.properties +52 -0
- package/src/sap/fe/core/messagebundle_en_GB.properties +53 -1
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +49 -1
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +53 -1
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +53 -1
- package/src/sap/fe/core/messagebundle_es.properties +60 -8
- package/src/sap/fe/core/messagebundle_es_MX.properties +55 -3
- package/src/sap/fe/core/messagebundle_et.properties +52 -0
- package/src/sap/fe/core/messagebundle_fi.properties +52 -0
- package/src/sap/fe/core/messagebundle_fr.properties +61 -9
- package/src/sap/fe/core/messagebundle_fr_CA.properties +52 -0
- package/src/sap/fe/core/messagebundle_hi.properties +53 -1
- package/src/sap/fe/core/messagebundle_hr.properties +53 -1
- package/src/sap/fe/core/messagebundle_hu.properties +52 -0
- package/src/sap/fe/core/messagebundle_id.properties +54 -2
- package/src/sap/fe/core/messagebundle_it.properties +53 -1
- package/src/sap/fe/core/messagebundle_iw.properties +54 -2
- package/src/sap/fe/core/messagebundle_ja.properties +62 -10
- package/src/sap/fe/core/messagebundle_kk.properties +53 -1
- package/src/sap/fe/core/messagebundle_ko.properties +53 -1
- package/src/sap/fe/core/messagebundle_lt.properties +53 -1
- package/src/sap/fe/core/messagebundle_lv.properties +53 -1
- package/src/sap/fe/core/messagebundle_ms.properties +53 -1
- package/src/sap/fe/core/messagebundle_nl.properties +57 -5
- package/src/sap/fe/core/messagebundle_no.properties +54 -2
- package/src/sap/fe/core/messagebundle_pl.properties +53 -1
- package/src/sap/fe/core/messagebundle_pt.properties +54 -2
- package/src/sap/fe/core/messagebundle_pt_PT.properties +53 -1
- package/src/sap/fe/core/messagebundle_ro.properties +53 -1
- package/src/sap/fe/core/messagebundle_ru.properties +53 -1
- package/src/sap/fe/core/messagebundle_sh.properties +53 -1
- package/src/sap/fe/core/messagebundle_sk.properties +52 -0
- package/src/sap/fe/core/messagebundle_sl.properties +53 -1
- package/src/sap/fe/core/messagebundle_sv.properties +53 -1
- package/src/sap/fe/core/messagebundle_th.properties +52 -0
- package/src/sap/fe/core/messagebundle_tr.properties +52 -0
- package/src/sap/fe/core/messagebundle_uk.properties +52 -0
- package/src/sap/fe/core/messagebundle_vi.properties +53 -1
- package/src/sap/fe/core/messagebundle_zh_CN.properties +53 -1
- package/src/sap/fe/core/messagebundle_zh_TW.properties +53 -1
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +5 -5
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +5 -5
- package/src/sap/fe/core/services/RoutingServiceFactory.js +154 -78
- package/src/sap/fe/core/services/ShellServicesFactory.js +9 -9
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +11 -12
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +12 -2
- package/src/sap/fe/core/support/AnnotationIssue.support.js +2 -4
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +2 -4
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -4
- package/src/sap/fe/core/support/CommonHelper.js +2 -4
- package/src/sap/fe/core/support/Diagnostics.js +1 -1
- package/src/sap/fe/core/templating/CriticalityFormatters.js +4 -4
- package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.js +54 -6
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +54 -4
- package/src/sap/fe/core/templating/EntitySetHelper.js +86 -3
- package/src/sap/fe/core/templating/EntitySetHelper.ts +44 -0
- package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
- package/src/sap/fe/core/templating/FilterHelper.js +23 -5
- package/src/sap/fe/core/templating/FilterHelper.ts +15 -1
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
- package/src/sap/fe/core/templating/PropertyHelper.js +8 -8
- package/src/sap/fe/core/templating/UIFormatters.js +72 -4
- package/src/sap/fe/core/templating/UIFormatters.ts +98 -3
- package/src/sap/fe/core/type/Email.js +1 -1
|
@@ -11,6 +11,7 @@ sap.ui.define(["../ManifestSettings", "sap/fe/core/converters/controls/Common/Ac
|
|
|
11
11
|
var Draft = BindingHelper.Draft;
|
|
12
12
|
var isPathDeletable = DataModelPathHelper.isPathDeletable;
|
|
13
13
|
var KeyHelper = Key.KeyHelper;
|
|
14
|
+
var constant = BindingExpression.constant;
|
|
14
15
|
var ifElse = BindingExpression.ifElse;
|
|
15
16
|
var and = BindingExpression.and;
|
|
16
17
|
var fn = BindingExpression.fn;
|
|
@@ -20,6 +21,7 @@ sap.ui.define(["../ManifestSettings", "sap/fe/core/converters/controls/Common/Ac
|
|
|
20
21
|
var annotationExpression = BindingExpression.annotationExpression;
|
|
21
22
|
var Placement = ConfigurableObject.Placement;
|
|
22
23
|
var getSemanticObjectMapping = Action.getSemanticObjectMapping;
|
|
24
|
+
var getEnabledForAnnotationAction = Action.getEnabledForAnnotationAction;
|
|
23
25
|
var ButtonType = Action.ButtonType;
|
|
24
26
|
var ActionType = ManifestSettings.ActionType;
|
|
25
27
|
|
|
@@ -42,7 +44,7 @@ sap.ui.define(["../ManifestSettings", "sap/fe/core/converters/controls/Common/Ac
|
|
|
42
44
|
if ((identificationDataField === null || identificationDataField === void 0 ? void 0 : (_identificationDataFi = identificationDataField.annotations) === null || _identificationDataFi === void 0 ? void 0 : (_identificationDataFi2 = _identificationDataFi.UI) === null || _identificationDataFi2 === void 0 ? void 0 : (_identificationDataFi3 = _identificationDataFi2.Hidden) === null || _identificationDataFi3 === void 0 ? void 0 : _identificationDataFi3.valueOf()) !== true) {
|
|
43
45
|
var _identificationDataFi4, _identificationDataFi5, _identificationDataFi6, _identificationDataFi7, _identificationDataFi8;
|
|
44
46
|
|
|
45
|
-
if ((identificationDataField === null || identificationDataField === void 0 ? void 0 : identificationDataField.$Type) === "com.sap.vocabularies.UI.v1.DataFieldForAction" && !!identificationDataField.Determining === bDetermining && (!(identificationDataField
|
|
47
|
+
if ((identificationDataField === null || identificationDataField === void 0 ? void 0 : identificationDataField.$Type) === "com.sap.vocabularies.UI.v1.DataFieldForAction" && !!identificationDataField.Determining === bDetermining && (!(identificationDataField !== null && identificationDataField !== void 0 && (_identificationDataFi4 = identificationDataField.ActionTarget) !== null && _identificationDataFi4 !== void 0 && _identificationDataFi4.isBound) || (identificationDataField === null || identificationDataField === void 0 ? void 0 : (_identificationDataFi5 = identificationDataField.ActionTarget) === null || _identificationDataFi5 === void 0 ? void 0 : (_identificationDataFi6 = _identificationDataFi5.annotations) === null || _identificationDataFi6 === void 0 ? void 0 : (_identificationDataFi7 = _identificationDataFi6.Core) === null || _identificationDataFi7 === void 0 ? void 0 : (_identificationDataFi8 = _identificationDataFi7.OperationAvailable) === null || _identificationDataFi8 === void 0 ? void 0 : _identificationDataFi8.valueOf()) !== false)) {
|
|
46
48
|
return true;
|
|
47
49
|
}
|
|
48
50
|
}
|
|
@@ -95,7 +97,7 @@ sap.ui.define(["../ManifestSettings", "sap/fe/core/converters/controls/Common/Ac
|
|
|
95
97
|
// Set absolute binding path for Singleton references, otherwise the configured annotation path itself.
|
|
96
98
|
// For e.g. /com.sap.namespace.EntityContainer/Singleton/Property to /Singleton/Property
|
|
97
99
|
deleteHiddenExpression = annotationExpression(deleteHidden, visitedNavigationPaths, undefined, function (path) {
|
|
98
|
-
return singletonPathVisitor(path, converterContext,
|
|
100
|
+
return singletonPathVisitor(path, converterContext, []);
|
|
99
101
|
}),
|
|
100
102
|
manifestWrapper = converterContext.getManifestWrapper(),
|
|
101
103
|
viewLevel = manifestWrapper.getViewLevel(),
|
|
@@ -109,6 +111,20 @@ sap.ui.define(["../ManifestSettings", "sap/fe/core/converters/controls/Common/Ac
|
|
|
109
111
|
|
|
110
112
|
return ifElse(deleteHidden === undefined || deleteHidden.valueOf() === false, editableExpression, and(editableExpression, equal(deleteHiddenExpression, false)));
|
|
111
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Method to determine the 'enabled' property binding for the Delete button on an object page.
|
|
116
|
+
*
|
|
117
|
+
* @param {PropertyAnnotationValue<boolean>|undefined} isDeletable The delete restriction configured
|
|
118
|
+
* @param {Expression<boolean>} isParentDeletable The delete restriction configured on the parent entity
|
|
119
|
+
* @returns {Expression<boolean>} The binding expression for the 'enabled' property of the Delete button
|
|
120
|
+
*/
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
_exports.getDeleteButtonVisibility = getDeleteButtonVisibility;
|
|
124
|
+
|
|
125
|
+
function getDeleteButtonEnabled(isDeletable, isParentDeletable) {
|
|
126
|
+
return ifElse(isParentDeletable !== undefined, isParentDeletable, ifElse(isDeletable !== undefined, equal(isDeletable, true), constant(true)));
|
|
127
|
+
}
|
|
112
128
|
/**
|
|
113
129
|
* Method to determine the 'visible' property binding for the Edit button on an object page.
|
|
114
130
|
*
|
|
@@ -118,13 +134,13 @@ sap.ui.define(["../ManifestSettings", "sap/fe/core/converters/controls/Common/Ac
|
|
|
118
134
|
*/
|
|
119
135
|
|
|
120
136
|
|
|
121
|
-
_exports.
|
|
137
|
+
_exports.getDeleteButtonEnabled = getDeleteButtonEnabled;
|
|
122
138
|
|
|
123
139
|
function getEditButtonVisibility(converterContext, updateHidden) {
|
|
124
140
|
var _entitySet$annotation;
|
|
125
141
|
|
|
126
142
|
var entitySet = converterContext.getEntitySet(),
|
|
127
|
-
bIsDraftRoot = entitySet && (
|
|
143
|
+
bIsDraftRoot = entitySet && (_entitySet$annotation = entitySet.annotations.Common) !== null && _entitySet$annotation !== void 0 && _entitySet$annotation.DraftRoot ? true : false,
|
|
128
144
|
dataModelObjectPath = converterContext.getDataModelObjectPath(),
|
|
129
145
|
visitedNavigationPaths = dataModelObjectPath.navigationProperties.map(function (navProp) {
|
|
130
146
|
return navProp.name;
|
|
@@ -142,19 +158,68 @@ sap.ui.define(["../ManifestSettings", "sap/fe/core/converters/controls/Common/Ac
|
|
|
142
158
|
var resultantExpression = ifElse(updateHidden === undefined || updateHidden.valueOf() === false, notEditableExpression, and(notEditableExpression, equal(updateHiddenExpression, false)));
|
|
143
159
|
return ifElse(bIsDraftRoot, and(resultantExpression, Draft.HasNoDraftForCurrentUser), resultantExpression);
|
|
144
160
|
}
|
|
161
|
+
/**
|
|
162
|
+
* Method to determine the 'enabled' property binding for the Edit button on an object page.
|
|
163
|
+
*
|
|
164
|
+
* @param {ConverterContext} converterContext Instance of the converter context.
|
|
165
|
+
* @returns {Expression<boolean>} The binding expression for the 'enabled' property of the Edit button.
|
|
166
|
+
*/
|
|
167
|
+
|
|
145
168
|
|
|
146
169
|
_exports.getEditButtonVisibility = getEditButtonVisibility;
|
|
147
170
|
|
|
171
|
+
function getEditButtonEnabled(converterContext) {
|
|
172
|
+
var _entitySet$annotation2, _entitySet$annotation3;
|
|
173
|
+
|
|
174
|
+
var entitySet = converterContext.getEntitySet(),
|
|
175
|
+
isDraftRoot = entitySet && (_entitySet$annotation2 = entitySet.annotations.Common) !== null && _entitySet$annotation2 !== void 0 && _entitySet$annotation2.DraftRoot ? true : false,
|
|
176
|
+
isSticky = entitySet && (_entitySet$annotation3 = entitySet.annotations.Session) !== null && _entitySet$annotation3 !== void 0 && _entitySet$annotation3.StickySessionSupported ? true : false;
|
|
177
|
+
var editActionName;
|
|
178
|
+
|
|
179
|
+
if (isDraftRoot) {
|
|
180
|
+
var _entitySet$annotation4, _entitySet$annotation5;
|
|
181
|
+
|
|
182
|
+
editActionName = entitySet === null || entitySet === void 0 ? void 0 : (_entitySet$annotation4 = entitySet.annotations.Common) === null || _entitySet$annotation4 === void 0 ? void 0 : (_entitySet$annotation5 = _entitySet$annotation4.DraftRoot) === null || _entitySet$annotation5 === void 0 ? void 0 : _entitySet$annotation5.EditAction;
|
|
183
|
+
} else if (isSticky) {
|
|
184
|
+
var _entitySet$annotation6, _entitySet$annotation7;
|
|
185
|
+
|
|
186
|
+
editActionName = entitySet === null || entitySet === void 0 ? void 0 : (_entitySet$annotation6 = entitySet.annotations.Session) === null || _entitySet$annotation6 === void 0 ? void 0 : (_entitySet$annotation7 = _entitySet$annotation6.StickySessionSupported) === null || _entitySet$annotation7 === void 0 ? void 0 : _entitySet$annotation7.EditAction;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (editActionName) {
|
|
190
|
+
var _converterContext$get, _converterContext$get2;
|
|
191
|
+
|
|
192
|
+
var editActionAnnotationPath = converterContext.getAbsoluteAnnotationPath(editActionName),
|
|
193
|
+
editActions = (_converterContext$get = converterContext.getEntityTypeAnnotation(editActionAnnotationPath)) === null || _converterContext$get === void 0 ? void 0 : (_converterContext$get2 = _converterContext$get.annotation) === null || _converterContext$get2 === void 0 ? void 0 : _converterContext$get2.actions;
|
|
194
|
+
|
|
195
|
+
if (editActions !== null && editActions !== void 0 && editActions.length) {
|
|
196
|
+
var _editAction$annotatio, _editAction$annotatio2;
|
|
197
|
+
|
|
198
|
+
var editAction = editActions[0];
|
|
199
|
+
|
|
200
|
+
if ((editAction === null || editAction === void 0 ? void 0 : (_editAction$annotatio = editAction.annotations) === null || _editAction$annotatio === void 0 ? void 0 : (_editAction$annotatio2 = _editAction$annotatio.Core) === null || _editAction$annotatio2 === void 0 ? void 0 : _editAction$annotatio2.OperationAvailable) === null) {
|
|
201
|
+
return "{= ${#" + editActionName + "} ? true : false }";
|
|
202
|
+
} else {
|
|
203
|
+
return getEnabledForAnnotationAction(converterContext, editAction);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
_exports.getEditButtonEnabled = getEditButtonEnabled;
|
|
212
|
+
|
|
148
213
|
function getHeaderDefaultActions(converterContext) {
|
|
149
|
-
var _entitySet$
|
|
214
|
+
var _entitySet$annotation8, _entitySet$annotation9, _entitySet$annotation10, _entitySet$annotation11, _entitySet$annotation12, _entitySet$annotation13, _entitySet$annotation14, _oEntityDeleteRestric;
|
|
150
215
|
|
|
151
216
|
var entitySet = converterContext.getEntitySet(),
|
|
152
217
|
entityType = converterContext.getEntityType(),
|
|
153
|
-
oStickySessionSupported = entitySet && ((_entitySet$
|
|
218
|
+
oStickySessionSupported = entitySet && ((_entitySet$annotation8 = entitySet.annotations) === null || _entitySet$annotation8 === void 0 ? void 0 : (_entitySet$annotation9 = _entitySet$annotation8.Session) === null || _entitySet$annotation9 === void 0 ? void 0 : _entitySet$annotation9.StickySessionSupported),
|
|
154
219
|
//for sticky app
|
|
155
|
-
oDraftRoot = entitySet && ((_entitySet$
|
|
156
|
-
oEntityDeleteRestrictions = entitySet && ((_entitySet$
|
|
157
|
-
bUpdateHidden = entitySet && ((_entitySet$
|
|
220
|
+
oDraftRoot = entitySet && ((_entitySet$annotation10 = entitySet.annotations.Common) === null || _entitySet$annotation10 === void 0 ? void 0 : _entitySet$annotation10.DraftRoot),
|
|
221
|
+
oEntityDeleteRestrictions = entitySet && ((_entitySet$annotation11 = entitySet.annotations) === null || _entitySet$annotation11 === void 0 ? void 0 : (_entitySet$annotation12 = _entitySet$annotation11.Capabilities) === null || _entitySet$annotation12 === void 0 ? void 0 : _entitySet$annotation12.DeleteRestrictions),
|
|
222
|
+
bUpdateHidden = entitySet && ((_entitySet$annotation13 = entitySet.annotations.UI) === null || _entitySet$annotation13 === void 0 ? void 0 : (_entitySet$annotation14 = _entitySet$annotation13.UpdateHidden) === null || _entitySet$annotation14 === void 0 ? void 0 : _entitySet$annotation14.valueOf()),
|
|
158
223
|
dataModelObjectPath = converterContext.getDataModelObjectPath(),
|
|
159
224
|
isParentDeletable = isPathDeletable(dataModelObjectPath),
|
|
160
225
|
bParentEntitySetDeletable = isParentDeletable ? compileBinding(isParentDeletable) : isParentDeletable,
|
|
@@ -170,35 +235,38 @@ sap.ui.define(["../ManifestSettings", "sap/fe/core/converters/controls/Common/Ac
|
|
|
170
235
|
annotationPath: converterContext.getEntitySetBasedAnnotationPath(dataField.fullyQualifiedName),
|
|
171
236
|
key: KeyHelper.generateKeyFromDataField(dataField),
|
|
172
237
|
visible: compileBinding(not(equal(annotationExpression((_dataField$annotation = dataField.annotations) === null || _dataField$annotation === void 0 ? void 0 : (_dataField$annotation2 = _dataField$annotation.UI) === null || _dataField$annotation2 === void 0 ? void 0 : _dataField$annotation2.Hidden), true))),
|
|
238
|
+
enabled: getEnabledForAnnotationAction(converterContext, dataField.ActionTarget),
|
|
173
239
|
isNavigable: true
|
|
174
240
|
};
|
|
175
241
|
}); // Then the edit action if it exists
|
|
176
242
|
|
|
177
|
-
if ((
|
|
178
|
-
var _entitySet$
|
|
243
|
+
if ((oDraftRoot !== null && oDraftRoot !== void 0 && oDraftRoot.EditAction || oStickySessionSupported !== null && oStickySessionSupported !== void 0 && oStickySessionSupported.EditAction) && bUpdateHidden !== true) {
|
|
244
|
+
var _entitySet$annotation15, _entitySet$annotation16, _entitySet$annotation17, _entityType$annotatio7;
|
|
179
245
|
|
|
180
|
-
var updateHidden = (entitySet === null || entitySet === void 0 ? void 0 : (_entitySet$
|
|
246
|
+
var updateHidden = (entitySet === null || entitySet === void 0 ? void 0 : (_entitySet$annotation15 = entitySet.annotations.UI) === null || _entitySet$annotation15 === void 0 ? void 0 : (_entitySet$annotation16 = _entitySet$annotation15.UpdateHidden) === null || _entitySet$annotation16 === void 0 ? void 0 : _entitySet$annotation16.valueOf()) !== undefined ? entitySet === null || entitySet === void 0 ? void 0 : (_entitySet$annotation17 = entitySet.annotations.UI) === null || _entitySet$annotation17 === void 0 ? void 0 : _entitySet$annotation17.UpdateHidden : entityType === null || entityType === void 0 ? void 0 : (_entityType$annotatio7 = entityType.annotations.UI) === null || _entityType$annotatio7 === void 0 ? void 0 : _entityType$annotatio7.UpdateHidden;
|
|
181
247
|
headerActions.push({
|
|
182
248
|
type: ActionType.Primary,
|
|
183
249
|
key: "EditAction",
|
|
184
|
-
visible: compileBinding(getEditButtonVisibility(converterContext, updateHidden))
|
|
250
|
+
visible: compileBinding(getEditButtonVisibility(converterContext, updateHidden)),
|
|
251
|
+
enabled: getEditButtonEnabled(converterContext)
|
|
185
252
|
});
|
|
186
253
|
} // Then the delete action if we're not statically not deletable
|
|
187
254
|
|
|
188
255
|
|
|
189
256
|
if (bParentEntitySetDeletable && bParentEntitySetDeletable !== "false" || (oEntityDeleteRestrictions === null || oEntityDeleteRestrictions === void 0 ? void 0 : (_oEntityDeleteRestric = oEntityDeleteRestrictions.Deletable) === null || _oEntityDeleteRestric === void 0 ? void 0 : _oEntityDeleteRestric.valueOf()) !== false && bParentEntitySetDeletable !== "false") {
|
|
190
|
-
var _entitySet$
|
|
257
|
+
var _entitySet$annotation18, _entitySet$annotation19, _entitySet$annotation20, _entityType$annotatio8;
|
|
191
258
|
|
|
192
|
-
var deleteHidden = (entitySet === null || entitySet === void 0 ? void 0 : (_entitySet$
|
|
259
|
+
var deleteHidden = (entitySet === null || entitySet === void 0 ? void 0 : (_entitySet$annotation18 = entitySet.annotations.UI) === null || _entitySet$annotation18 === void 0 ? void 0 : (_entitySet$annotation19 = _entitySet$annotation18.DeleteHidden) === null || _entitySet$annotation19 === void 0 ? void 0 : _entitySet$annotation19.valueOf()) !== undefined ? entitySet === null || entitySet === void 0 ? void 0 : (_entitySet$annotation20 = entitySet.annotations.UI) === null || _entitySet$annotation20 === void 0 ? void 0 : _entitySet$annotation20.DeleteHidden : entityType === null || entityType === void 0 ? void 0 : (_entityType$annotatio8 = entityType.annotations.UI) === null || _entityType$annotatio8 === void 0 ? void 0 : _entityType$annotatio8.DeleteHidden;
|
|
193
260
|
headerActions.push({
|
|
194
261
|
type: ActionType.Secondary,
|
|
195
262
|
key: "DeleteAction",
|
|
196
263
|
visible: compileBinding(getDeleteButtonVisibility(converterContext, deleteHidden)),
|
|
264
|
+
enabled: compileBinding(getDeleteButtonEnabled(oEntityDeleteRestrictions === null || oEntityDeleteRestrictions === void 0 ? void 0 : oEntityDeleteRestrictions.Deletable, isParentDeletable)),
|
|
197
265
|
parentEntityDeleteEnabled: bParentEntitySetDeletable
|
|
198
266
|
});
|
|
199
267
|
}
|
|
200
268
|
|
|
201
|
-
if (
|
|
269
|
+
if (oDraftRoot !== null && oDraftRoot !== void 0 && oDraftRoot.EditAction && bUpdateHidden !== true) {
|
|
202
270
|
headerActions.push({
|
|
203
271
|
type: ActionType.SwitchToActiveObject,
|
|
204
272
|
key: "SwitchToActiveObject"
|
|
@@ -252,6 +320,7 @@ sap.ui.define(["../ManifestSettings", "sap/fe/core/converters/controls/Common/Ac
|
|
|
252
320
|
annotationPath: converterContext.getEntitySetBasedAnnotationPath(dataField.fullyQualifiedName),
|
|
253
321
|
key: KeyHelper.generateKeyFromDataField(dataField),
|
|
254
322
|
visible: compileBinding(not(equal(annotationExpression((_dataField$annotation6 = dataField.annotations) === null || _dataField$annotation6 === void 0 ? void 0 : (_dataField$annotation7 = _dataField$annotation6.UI) === null || _dataField$annotation7 === void 0 ? void 0 : _dataField$annotation7.Hidden), true))),
|
|
323
|
+
enabled: getEnabledForAnnotationAction(converterContext, dataField.ActionTarget),
|
|
255
324
|
isNavigable: true
|
|
256
325
|
});
|
|
257
326
|
});
|
|
@@ -280,13 +349,13 @@ sap.ui.define(["../ManifestSettings", "sap/fe/core/converters/controls/Common/Ac
|
|
|
280
349
|
_exports.getHiddenHeaderActions = getHiddenHeaderActions;
|
|
281
350
|
|
|
282
351
|
function getFooterDefaultActions(viewLevel, converterContext) {
|
|
283
|
-
var _entitySet$
|
|
352
|
+
var _entitySet$annotation21, _entitySet$annotation22, _entitySet$annotation23, _entitySet$annotation24, _entitySet$annotation25, _entitySet$annotation26, _entitySet$annotation27;
|
|
284
353
|
|
|
285
354
|
var entitySet = converterContext.getEntitySet();
|
|
286
355
|
var entityType = converterContext.getEntityType();
|
|
287
|
-
var oStickySessionSupported = entitySet && ((_entitySet$
|
|
356
|
+
var oStickySessionSupported = entitySet && ((_entitySet$annotation21 = entitySet.annotations) === null || _entitySet$annotation21 === void 0 ? void 0 : (_entitySet$annotation22 = _entitySet$annotation21.Session) === null || _entitySet$annotation22 === void 0 ? void 0 : _entitySet$annotation22.StickySessionSupported),
|
|
288
357
|
//for sticky app
|
|
289
|
-
sEntitySetDraftRoot = entitySet && (((_entitySet$
|
|
358
|
+
sEntitySetDraftRoot = entitySet && (((_entitySet$annotation23 = entitySet.annotations.Common) === null || _entitySet$annotation23 === void 0 ? void 0 : (_entitySet$annotation24 = _entitySet$annotation23.DraftRoot) === null || _entitySet$annotation24 === void 0 ? void 0 : _entitySet$annotation24.term) || ((_entitySet$annotation25 = entitySet.annotations) === null || _entitySet$annotation25 === void 0 ? void 0 : (_entitySet$annotation26 = _entitySet$annotation25.Session) === null || _entitySet$annotation26 === void 0 ? void 0 : (_entitySet$annotation27 = _entitySet$annotation26.StickySessionSupported) === null || _entitySet$annotation27 === void 0 ? void 0 : _entitySet$annotation27.term)),
|
|
290
359
|
bConditionSave = sEntitySetDraftRoot === "com.sap.vocabularies.Common.v1.DraftRoot" || oStickySessionSupported && (oStickySessionSupported === null || oStickySessionSupported === void 0 ? void 0 : oStickySessionSupported.SaveAction),
|
|
291
360
|
bConditionApply = viewLevel > 1,
|
|
292
361
|
bConditionCancel = sEntitySetDraftRoot === "com.sap.vocabularies.Common.v1.DraftRoot" || oStickySessionSupported && (oStickySessionSupported === null || oStickySessionSupported === void 0 ? void 0 : oStickySessionSupported.DiscardAction); // Retrieve all determining actions
|
|
@@ -303,6 +372,7 @@ sap.ui.define(["../ManifestSettings", "sap/fe/core/converters/controls/Common/Ac
|
|
|
303
372
|
annotationPath: converterContext.getEntitySetBasedAnnotationPath(dataField.fullyQualifiedName),
|
|
304
373
|
key: KeyHelper.generateKeyFromDataField(dataField),
|
|
305
374
|
visible: compileBinding(not(equal(annotationExpression((_dataField$annotation8 = dataField.annotations) === null || _dataField$annotation8 === void 0 ? void 0 : (_dataField$annotation9 = _dataField$annotation8.UI) === null || _dataField$annotation9 === void 0 ? void 0 : _dataField$annotation9.Hidden), true))),
|
|
375
|
+
enabled: getEnabledForAnnotationAction(converterContext, dataField.ActionTarget),
|
|
306
376
|
isNavigable: true
|
|
307
377
|
};
|
|
308
378
|
}); // Then the save action if it exists
|
|
@@ -333,6 +403,7 @@ sap.ui.define(["../ManifestSettings", "sap/fe/core/converters/controls/Common/Ac
|
|
|
333
403
|
annotationPath: converterContext.getEntitySetBasedAnnotationPath(dataField.fullyQualifiedName),
|
|
334
404
|
key: KeyHelper.generateKeyFromDataField(dataField),
|
|
335
405
|
visible: compileBinding(not(equal(annotationExpression((_dataField$annotation10 = dataField.annotations) === null || _dataField$annotation10 === void 0 ? void 0 : (_dataField$annotation11 = _dataField$annotation10.UI) === null || _dataField$annotation11 === void 0 ? void 0 : _dataField$annotation11.Hidden), true))),
|
|
406
|
+
enabled: getEnabledForAnnotationAction(converterContext, dataField.ActionTarget),
|
|
336
407
|
isNavigable: true
|
|
337
408
|
});
|
|
338
409
|
}); // Then the cancel action if it exists
|
|
@@ -353,4 +424,4 @@ sap.ui.define(["../ManifestSettings", "sap/fe/core/converters/controls/Common/Ac
|
|
|
353
424
|
_exports.getFooterDefaultActions = getFooterDefaultActions;
|
|
354
425
|
return _exports;
|
|
355
426
|
}, false);
|
|
356
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkhlYWRlckFuZEZvb3RlckFjdGlvbi50cyJdLCJuYW1lcyI6WyJnZXRJZGVudGlmaWNhdGlvbkRhdGFGaWVsZEZvckFjdGlvbnMiLCJlbnRpdHlUeXBlIiwiYkRldGVybWluaW5nIiwiYW5ub3RhdGlvbnMiLCJVSSIsIklkZW50aWZpY2F0aW9uIiwiZmlsdGVyIiwiaWRlbnRpZmljYXRpb25EYXRhRmllbGQiLCJIaWRkZW4iLCJ2YWx1ZU9mIiwiJFR5cGUiLCJEZXRlcm1pbmluZyIsIkFjdGlvblRhcmdldCIsImlzQm91bmQiLCJDb3JlIiwiT3BlcmF0aW9uQXZhaWxhYmxlIiwiZ2V0SWRlbnRpZmljYXRpb25EYXRhRmllbGRGb3JJQk5BY3Rpb25zIiwiSU1QT1JUQU5UX0NSSVRJQ0FMSVRJRVMiLCJnZXREZWxldGVCdXR0b25WaXNpYmlsaXR5IiwiY29udmVydGVyQ29udGV4dCIsImRlbGV0ZUhpZGRlbiIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwidmlzaXRlZE5hdmlnYXRpb25QYXRocyIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwibWFwIiwibmF2UHJvcCIsIm5hbWUiLCJkZWxldGVIaWRkZW5FeHByZXNzaW9uIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCJ1bmRlZmluZWQiLCJwYXRoIiwic2luZ2xldG9uUGF0aFZpc2l0b3IiLCJtYW5pZmVzdFdyYXBwZXIiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJ2aWV3TGV2ZWwiLCJnZXRWaWV3TGV2ZWwiLCJlZGl0YWJsZUV4cHJlc3Npb24iLCJJc0VkaXRhYmxlIiwibm90IiwiaWZFbHNlIiwiYW5kIiwiZXF1YWwiLCJnZXRFZGl0QnV0dG9uVmlzaWJpbGl0eSIsInVwZGF0ZUhpZGRlbiIsImVudGl0eVNldCIsImdldEVudGl0eVNldCIsImJJc0RyYWZ0Um9vdCIsIkNvbW1vbiIsIkRyYWZ0Um9vdCIsInVwZGF0ZUhpZGRlbkV4cHJlc3Npb24iLCJub3RFZGl0YWJsZUV4cHJlc3Npb24iLCJyZXN1bHRhbnRFeHByZXNzaW9uIiwiRHJhZnQiLCJIYXNOb0RyYWZ0Rm9yQ3VycmVudFVzZXIiLCJnZXRIZWFkZXJEZWZhdWx0QWN0aW9ucyIsImdldEVudGl0eVR5cGUiLCJvU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsIlNlc3Npb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwib0RyYWZ0Um9vdCIsIm9FbnRpdHlEZWxldGVSZXN0cmljdGlvbnMiLCJDYXBhYmlsaXRpZXMiLCJEZWxldGVSZXN0cmljdGlvbnMiLCJiVXBkYXRlSGlkZGVuIiwiVXBkYXRlSGlkZGVuIiwiaXNQYXJlbnREZWxldGFibGUiLCJpc1BhdGhEZWxldGFibGUiLCJiUGFyZW50RW50aXR5U2V0RGVsZXRhYmxlIiwiY29tcGlsZUJpbmRpbmciLCJoZWFkZXJEYXRhRmllbGRGb3JBY3Rpb25zIiwiaGVhZGVyQWN0aW9ucyIsImRhdGFGaWVsZCIsImluZGV4T2YiLCJDcml0aWNhbGl0eSIsInR5cGUiLCJBY3Rpb25UeXBlIiwiRGF0YUZpZWxkRm9yQWN0aW9uIiwiYW5ub3RhdGlvblBhdGgiLCJnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwia2V5IiwiS2V5SGVscGVyIiwiZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkIiwidmlzaWJsZSIsImlzTmF2aWdhYmxlIiwiRWRpdEFjdGlvbiIsInB1c2giLCJQcmltYXJ5IiwiRGVsZXRhYmxlIiwiRGVsZXRlSGlkZGVuIiwiU2Vjb25kYXJ5IiwicGFyZW50RW50aXR5RGVsZXRlRW5hYmxlZCIsIlN3aXRjaFRvQWN0aXZlT2JqZWN0IiwiU3dpdGNoVG9EcmFmdE9iamVjdCIsImhlYWRlckRhdGFGaWVsZEZvcklCTkFjdGlvbnMiLCJvTmF2aWdhdGlvblBhcmFtcyIsInNlbWFudGljT2JqZWN0TWFwcGluZyIsIk1hcHBpbmciLCJnZXRTZW1hbnRpY09iamVjdE1hcHBpbmciLCJSZXF1aXJlc0NvbnRleHQiLCJFcnJvciIsIkxhYmVsIiwiSW5saW5lIiwiRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIiwidGV4dCIsInRvU3RyaW5nIiwiYnV0dG9uVHlwZSIsIkJ1dHRvblR5cGUiLCJHaG9zdCIsImVuYWJsZWQiLCJOYXZpZ2F0aW9uQXZhaWxhYmxlIiwicHJlc3MiLCJmbiIsIlNlbWFudGljT2JqZWN0IiwiQWN0aW9uIiwiY3VzdG9tRGF0YSIsInNlbWFudGljT2JqZWN0IiwiYWN0aW9uIiwiZ2V0SGlkZGVuSGVhZGVyQWN0aW9ucyIsImhpZGRlbkFjdGlvbnMiLCJEZWZhdWx0IiwiZ2V0Rm9vdGVyRGVmYXVsdEFjdGlvbnMiLCJzRW50aXR5U2V0RHJhZnRSb290IiwidGVybSIsImJDb25kaXRpb25TYXZlIiwiU2F2ZUFjdGlvbiIsImJDb25kaXRpb25BcHBseSIsImJDb25kaXRpb25DYW5jZWwiLCJEaXNjYXJkQWN0aW9uIiwiZm9vdGVyRGF0YUZpZWxkRm9yQWN0aW9ucyIsImZvb3RlckFjdGlvbnMiLCJlbnRpdHlUeXBlTmFtZSIsIkRlZmF1bHRBcHBseSIsInBvc2l0aW9uIiwicGxhY2VtZW50IiwiUGxhY2VtZW50IiwiRW5kIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0E7Ozs7Ozs7Ozs7QUFVTyxXQUFTQSxvQ0FBVCxDQUE4Q0MsVUFBOUMsRUFBc0VDLFlBQXRFLEVBQXdIO0FBQUE7O0FBQzlILFdBQVEsMEJBQUFELFVBQVUsQ0FBQ0UsV0FBWCwwR0FBd0JDLEVBQXhCLDRHQUE0QkMsY0FBNUIsa0ZBQTRDQyxNQUE1QyxDQUFtRCxVQUFBQyx1QkFBdUIsRUFBSTtBQUFBOztBQUNyRixVQUFJLENBQUFBLHVCQUF1QixTQUF2QixJQUFBQSx1QkFBdUIsV0FBdkIscUNBQUFBLHVCQUF1QixDQUFFSixXQUF6QiwwR0FBc0NDLEVBQXRDLDRHQUEwQ0ksTUFBMUMsa0ZBQWtEQyxPQUFsRCxRQUFnRSxJQUFwRSxFQUEwRTtBQUFBOztBQUN6RSxZQUNDLENBQUFGLHVC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QUFBQSxRQUFRLEVBQUU7QUFBRUMsVUFBQUEsU0FBUyxFQUFFQyxTQUFTLENBQUNDO0FBQXZCO0FBSFEsT0FBbkI7QUFLQTs7QUFDRCxXQUFPTixhQUFQO0FBQ0EiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGlvblR5cGUgfSBmcm9tIFwiLi4vTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgRW50aXR5VHlwZSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9uQWN0aW9uLCBCYXNlQWN0aW9uLCBCdXR0b25UeXBlLCBnZXRTZW1hbnRpY09iamVjdE1hcHBpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vQWN0aW9uXCI7XG5pbXBvcnQgeyBEYXRhRmllbGRGb3JBY3Rpb25UeXBlcywgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uVHlwZXMsIFByb3BlcnR5QW5ub3RhdGlvblZhbHVlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgeyBQbGFjZW1lbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgYW5ub3RhdGlvbkV4cHJlc3Npb24sIGNvbXBpbGVCaW5kaW5nLCBub3QsIGVxdWFsLCBmbiwgRXhwcmVzc2lvbiwgYW5kLCBpZkVsc2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgS2V5SGVscGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9LZXlcIjtcbmltcG9ydCB7IGlzUGF0aERlbGV0YWJsZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCIuLi9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBEcmFmdCwgc2luZ2xldG9uUGF0aFZpc2l0b3IsIFVJIH0gZnJvbSBcIi4uL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuXG4vKipcbiAqIFJldHJpZXZlcyBhbGwgdGhlIGRhdGEgZmllbGQgZm9yIGFjdGlvbnMgZm9yIHRoZSBpZGVudGlmaWNhdGlvbiBhbm5vdGF0aW9uXG4gKiBUaGV5IG11c3QgYmVcbiAqIC0gTm90IHN0YXRpY2FsbHkgaGlkZGVuXG4gKiAtIEVpdGhlciBsaW5rZWQgdG8gYW4gVW5ib3VuZCBhY3Rpb24gb3IgdG8gYW4gYWN0aW9uIHdoaWNoIGhhcyBhbiBPcGVyYXRpb25BdmFpbGFibGUgdGhhdCBpcyBub3Qgc2V0IHRvIGZhbHNlIHN0YXRpY2FsbHkuXG4gKlxuICogQHBhcmFtIHtFbnRpdHlUeXBlfSBlbnRpdHlUeXBlIFRoZSBjdXJyZW50IGVudGl0eSB0eXBlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJEZXRlcm1pbmluZyBUaGUgZmxhZyB3aGljaCBkZW5vdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBhY3Rpb24gaXMgYSBkZXRlcm1pbmluZyBhY3Rpb25cbiAqIEByZXR1cm5zIHtEYXRhRmllbGRGb3JBY3Rpb25UeXBlc1tdfSBBbiBhcnJheSBvZiBEYXRhRmllbGQgZm9yIGFjdGlvbiByZXNwZWN0aW5nIHRoZSBpbnB1dCBwYXJhbWV0ZXIgJ2JEZXRlcm1pbmluZydcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldElkZW50aWZpY2F0aW9uRGF0YUZpZWxkRm9yQWN0aW9ucyhlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBiRGV0ZXJtaW5pbmc6IGJvb2xlYW4pOiBEYXRhRmllbGRGb3JBY3Rpb25UeXBlc1tdIHtcblx0cmV0dXJuIChlbnRpdHlUeXBlLmFubm90YXRpb25zPy5VST8uSWRlbnRpZmljYXRpb24/LmZpbHRlcihpZGVudGlmaWNhdGlvbkRhdGFGaWVsZCA9PiB7XG5cdFx0aWYgKGlkZW50aWZpY2F0aW9uRGF0YUZpZWxkPy5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpICE9PSB0cnVlKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGlkZW50aWZpY2F0aW9uRGF0YUZpZWxkPy4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBY3Rpb25cIiAmJlxuXHRcdFx0XHQhIWlkZW50aWZpY2F0aW9uRGF0YUZpZWxkLkRldGVybWluaW5nID09PSBiRGV0ZXJtaW5pbmcgJiZcblx0XHRcdFx0KCFpZGVudGlmaWNhdGlvbkRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0Py5pc0JvdW5kIHx8XG5cdFx0XHRcdFx0aWRlbnRpZmljYXRpb25EYXRhRmllbGQ/LkFjdGlvblRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZT8udmFsdWVPZigpICE9PSBmYWxzZSlcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KSB8fCBbXSkgYXMgRGF0YUZpZWxkRm9yQWN0aW9uVHlwZXNbXTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSBhbGwgdGhlIElCTiBhY3Rpb25zIGZvciB0aGUgaWRlbnRpZmljYXRpb24gYW5ub3RhdGlvbi5cbiAqIFRoZXkgbXVzdCBiZVxuICogLSBOb3Qgc3RhdGljYWxseSBoaWRkZW4uXG4gKiBAcGFyYW0ge0VudGl0eVR5cGV9IGVudGl0eVR5cGUgVGhlIGN1cnJlbnQgZW50aXR5dHlwZVxuICogQHBhcmFtIHtib29sZWFufSBiRGV0ZXJtaW5pbmcgV2hldGhlciBvciBub3QgdGhlIGFjdGlvbiBzaG91bGQgYmUgZGV0ZXJtaW5pbmdcbiAqIEByZXR1cm5zIHtEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25UeXBlc1tdfSBBbiBhcnJheSBvZiBkYXRhZmllbGQgZm9yIGFjdGlvbiByZXNwZWN0aW5nIHRoZSBiRGV0ZXJtaW5pbmcgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGdldElkZW50aWZpY2F0aW9uRGF0YUZpZWxkRm9ySUJOQWN0aW9ucyhlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBiRGV0ZXJtaW5pbmc6IGJvb2xlYW4pOiBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25UeXBlc1tdIHtcblx0cmV0dXJuIChlbnRpdHlUeXBlLmFubm90YXRpb25zPy5VST8uSWRlbnRpZmljYXRpb24/LmZpbHRlcihpZGVudGlmaWNhdGlvbkRhdGFGaWVsZCA9PiB7XG5cdFx0aWYgKGlkZW50aWZpY2F0aW9uRGF0YUZpZWxkPy5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpICE9PSB0cnVlKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGlkZW50aWZpY2F0aW9uRGF0YUZpZWxkPy4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cIiAmJlxuXHRcdFx0XHQhIWlkZW50aWZpY2F0aW9uRGF0YUZpZWxkLkRldGVybWluaW5nID09PSBiRGV0ZXJtaW5pbmdcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0pIHx8IFtdKSBhcyBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25UeXBlc1tdO1xufVxuXG5jb25zdCBJTVBPUlRBTlRfQ1JJVElDQUxJVElFUyA9IFtcblx0XCJVSS5Dcml0aWNhbGl0eVR5cGUvVmVyeVBvc2l0aXZlXCIsXG5cdFwiVUkuQ3JpdGljYWxpdHlUeXBlL1Bvc2l0aXZlXCIsXG5cdFwiVUkuQ3JpdGljYWxpdHlUeXBlL05lZ2F0aXZlXCIsXG5cdFwiVUkuQ3JpdGljYWxpdHlUeXBlL1ZlcnlOZWdhdGl2ZVwiXG5dO1xuXG4vKipcbiAqIE1ldGhvZCB0byBkZXRlcm1pbmUgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBiaW5kaW5nIGZvciB0aGUgRGVsZXRlIGJ1dHRvbiBvbiBhbiBvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHQgSW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIHtQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxib29sZWFuPiB8IHVuZGVmaW5lZH0gZGVsZXRlSGlkZGVuIFRoZSB2YWx1ZSBvZiB0aGUgVUkuRGVsZXRlSGlkZGVuIGFubm90YXRpb24gb24gdGhlIGVudGl0eSBzZXQgLyB0eXBlLlxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAndmlzaWJsZScgcHJvcGVydHkgb2YgdGhlIERlbGV0ZSBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWxldGVCdXR0b25WaXNpYmlsaXR5KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRkZWxldGVIaWRkZW46IFByb3BlcnR5QW5ub3RhdGlvblZhbHVlPGJvb2xlYW4+IHwgdW5kZWZpbmVkXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMgPSBkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLm1hcChuYXZQcm9wID0+IG5hdlByb3AubmFtZSksXG5cdFx0Ly8gU2V0IGFic29sdXRlIGJpbmRpbmcgcGF0aCBmb3IgU2luZ2xldG9uIHJlZmVyZW5jZXMsIG90aGVyd2lzZSB0aGUgY29uZmlndXJlZCBhbm5vdGF0aW9uIHBhdGggaXRzZWxmLlxuXHRcdC8vIEZvciBlLmcuIC9jb20uc2FwLm5hbWVzcGFjZS5FbnRpdHlDb250YWluZXIvU2luZ2xldG9uL1Byb3BlcnR5IHRvIC9TaW5nbGV0b24vUHJvcGVydHlcblx0XHRkZWxldGVIaWRkZW5FeHByZXNzaW9uOiBFeHByZXNzaW9uPGJvb2xlYW4gfCB1bmRlZmluZWQ+ID0gYW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHRkZWxldGVIaWRkZW4sXG5cdFx0XHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0KHBhdGg6IHN0cmluZykgPT4gc2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dCwgdmlzaXRlZE5hdmlnYXRpb25QYXRocylcblx0XHQpLFxuXHRcdG1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCksXG5cdFx0dmlld0xldmVsID0gbWFuaWZlc3RXcmFwcGVyLmdldFZpZXdMZXZlbCgpLFxuXHRcdC8vIERlbGV0ZSBidXR0b24gaXMgdmlzaWJsZVxuXHRcdC8vIEluIE9QIFx0XHQtLT4gIHdoZW4gbm90IGluIGVkaXQgbW9kZVxuXHRcdC8vIEluIHN1Yi1PUCBcdC0tPiAgd2hlbiBpbiBlZGl0IG1vZGVcblx0XHRlZGl0YWJsZUV4cHJlc3Npb246IEV4cHJlc3Npb248Ym9vbGVhbj4gPSB2aWV3TGV2ZWwgPiAxID8gVUkuSXNFZGl0YWJsZSA6IG5vdChVSS5Jc0VkaXRhYmxlKTtcblxuXHQvLyBJZiBVSS5EZWxldGVIaWRkZW4gYW5ub3RhdGlvbiBvbiBlbnRpdHkgc2V0IG9yIHR5cGUgaXMgZWl0aGVyIG5vdCBkZWZpbmVkIG9yIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlLFxuXHQvLyBEZWxldGUgYnV0dG9uIGlzIHZpc2libGUgYmFzZWQgb24gZWRpdGFibGVFeHByZXNzaW9uLlxuXHQvLyBlbHNlLFxuXHQvLyBEZWxldGUgYnV0dG9uIGlzIHZpc2libGUgYmFzZWQgb24gYm90aCBhbm5vdGF0aW9uIHBhdGggYW5kIGVkaXRhYmxlRXhwcmVzc2lvbi5cblx0cmV0dXJuIGlmRWxzZShcblx0XHRkZWxldGVIaWRkZW4gPT09IHVuZGVmaW5lZCB8fCBkZWxldGVIaWRkZW4udmFsdWVPZigpID09PSBmYWxzZSxcblx0XHRlZGl0YWJsZUV4cHJlc3Npb24sXG5cdFx0YW5kKGVkaXRhYmxlRXhwcmVzc2lvbiwgZXF1YWwoZGVsZXRlSGlkZGVuRXhwcmVzc2lvbiwgZmFsc2UpKVxuXHQpO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byBkZXRlcm1pbmUgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBiaW5kaW5nIGZvciB0aGUgRWRpdCBidXR0b24gb24gYW4gb2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IEluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSB7UHJvcGVydHlBbm5vdGF0aW9uVmFsdWU8Ym9vbGVhbj4gfCB1bmRlZmluZWR9IHVwZGF0ZUhpZGRlbiBUaGUgdmFsdWUgb2YgdGhlIFVJLlVwZGF0ZUhpZGRlbiBhbm5vdGF0aW9uIG9uIHRoZSBlbnRpdHkgc2V0IC8gdHlwZS5cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ3Zpc2libGUnIHByb3BlcnR5IG9mIHRoZSBFZGl0IGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVkaXRCdXR0b25WaXNpYmlsaXR5KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHR1cGRhdGVIaWRkZW46IFByb3BlcnR5QW5ub3RhdGlvblZhbHVlPGJvb2xlYW4+IHwgdW5kZWZpbmVkXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSxcblx0XHRiSXNEcmFmdFJvb3QgPSBlbnRpdHlTZXQgJiYgZW50aXR5U2V0LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290ID8gdHJ1ZSA6IGZhbHNlLFxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzID0gZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5tYXAobmF2UHJvcCA9PiBuYXZQcm9wLm5hbWUpLFxuXHRcdC8vIFNldCBhYnNvbHV0ZSBiaW5kaW5nIHBhdGggZm9yIFNpbmdsZXRvbiByZWZlcmVuY2VzLCBvdGhlcndpc2UgdGhlIGNvbmZpZ3VyZWQgYW5ub3RhdGlvbiBwYXRoIGl0c2VsZi5cblx0XHQvLyBGb3IgZS5nLiAvY29tLnNhcC5uYW1lc3BhY2UuRW50aXR5Q29udGFpbmVyL1NpbmdsZXRvbi9Qcm9wZXJ0eSB0byAvU2luZ2xldG9uL1Byb3BlcnR5XG5cdFx0dXBkYXRlSGlkZGVuRXhwcmVzc2lvbjogRXhwcmVzc2lvbjxib29sZWFuIHwgdW5kZWZpbmVkPiA9IGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0dXBkYXRlSGlkZGVuLFxuXHRcdFx0dmlzaXRlZE5hdmlnYXRpb25QYXRocyxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdChwYXRoOiBzdHJpbmcpID0+IHNpbmdsZXRvblBhdGhWaXNpdG9yKHBhdGgsIGNvbnZlcnRlckNvbnRleHQsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMpXG5cdFx0KSxcblx0XHRub3RFZGl0YWJsZUV4cHJlc3Npb246IEV4cHJlc3Npb248Ym9vbGVhbj4gPSBub3QoVUkuSXNFZGl0YWJsZSk7XG5cblx0Ly8gSWYgVUkuVXBkYXRlSGlkZGVuIGFubm90YXRpb24gb24gZW50aXR5IHNldCBvciB0eXBlIGlzIGVpdGhlciBub3QgZGVmaW5lZCBvciBleHBsaWNpdGx5IHNldCB0byBmYWxzZSxcblx0Ly8gRWRpdCBidXR0b24gaXMgdmlzaWJsZSBpbiBkaXNwbGF5IG1vZGUuXG5cdC8vIGVsc2UsXG5cdC8vIEVkaXQgYnV0dG9uIGlzIHZpc2libGUgYmFzZWQgb24gYm90aCBhbm5vdGF0aW9uIHBhdGggYW5kIGluIGRpc3BsYXkgbW9kZS5cblx0Y29uc3QgcmVzdWx0YW50RXhwcmVzc2lvbjogRXhwcmVzc2lvbjxib29sZWFuPiA9IGlmRWxzZShcblx0XHR1cGRhdGVIaWRkZW4gPT09IHVuZGVmaW5lZCB8fCB1cGRhdGVIaWRkZW4udmFsdWVPZigpID09PSBmYWxzZSxcblx0XHRub3RFZGl0YWJsZUV4cHJlc3Npb24sXG5cdFx0YW5kKG5vdEVkaXRhYmxlRXhwcmVzc2lvbiwgZXF1YWwodXBkYXRlSGlkZGVuRXhwcmVzc2lvbiwgZmFsc2UpKVxuXHQpO1xuXG5cdHJldHVybiBpZkVsc2UoYklzRHJhZnRSb290LCBhbmQocmVzdWx0YW50RXhwcmVzc2lvbiwgRHJhZnQuSGFzTm9EcmFmdEZvckN1cnJlbnRVc2VyKSwgcmVzdWx0YW50RXhwcmVzc2lvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWFkZXJEZWZhdWx0QWN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogQmFzZUFjdGlvbltdIHtcblx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSxcblx0XHRlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksXG5cdFx0b1N0aWNreVNlc3Npb25TdXBwb3J0ZWQgPSBlbnRpdHlTZXQgJiYgZW50aXR5U2V0LmFubm90YXRpb25zPy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkLCAvL2ZvciBzdGlja3kgYXBwXG5cdFx0b0RyYWZ0Um9vdCA9IGVudGl0eVNldCAmJiBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3QsXG5cdFx0b0VudGl0eURlbGV0ZVJlc3RyaWN0aW9ucyA9IGVudGl0eVNldCAmJiBlbnRpdHlTZXQuYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uRGVsZXRlUmVzdHJpY3Rpb25zLFxuXHRcdGJVcGRhdGVIaWRkZW4gPSBlbnRpdHlTZXQgJiYgZW50aXR5U2V0LmFubm90YXRpb25zLlVJPy5VcGRhdGVIaWRkZW4/LnZhbHVlT2YoKSxcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0aXNQYXJlbnREZWxldGFibGUgPSBpc1BhdGhEZWxldGFibGUoZGF0YU1vZGVsT2JqZWN0UGF0aCksXG5cdFx0YlBhcmVudEVudGl0eVNldERlbGV0YWJsZSA9IGlzUGFyZW50RGVsZXRhYmxlID8gY29tcGlsZUJpbmRpbmcoaXNQYXJlbnREZWxldGFibGUpIDogaXNQYXJlbnREZWxldGFibGUsXG5cdFx0aGVhZGVyRGF0YUZpZWxkRm9yQWN0aW9ucyA9IGdldElkZW50aWZpY2F0aW9uRGF0YUZpZWxkRm9yQWN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSwgZmFsc2UpO1xuXG5cdC8vIEZpcnN0IGFkZCB0aGUgXCJDcml0aWNhbFwiIERhdGFGaWVsZEZvckFjdGlvbnNcblx0Y29uc3QgaGVhZGVyQWN0aW9uczogQmFzZUFjdGlvbltdID0gaGVhZGVyRGF0YUZpZWxkRm9yQWN0aW9uc1xuXHRcdC5maWx0ZXIoZGF0YUZpZWxkID0+IHtcblx0XHRcdHJldHVybiBJTVBPUlRBTlRfQ1JJVElDQUxJVElFUy5pbmRleE9mKGRhdGFGaWVsZD8uQ3JpdGljYWxpdHkgYXMgc3RyaW5nKSA+IC0xO1xuXHRcdH0pXG5cdFx0Lm1hcChkYXRhRmllbGQgPT4ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dHlwZTogQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JBY3Rpb24sXG5cdFx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YUZpZWxkLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpLFxuXHRcdFx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhub3QoZXF1YWwoYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpKSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWVcblx0XHRcdH07XG5cdFx0fSk7XG5cblx0Ly8gVGhlbiB0aGUgZWRpdCBhY3Rpb24gaWYgaXQgZXhpc3RzXG5cdGlmICgob0RyYWZ0Um9vdD8uRWRpdEFjdGlvbiB8fCBvU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uRWRpdEFjdGlvbikgJiYgYlVwZGF0ZUhpZGRlbiAhPT0gdHJ1ZSkge1xuXHRcdGNvbnN0IHVwZGF0ZUhpZGRlbiA9IChlbnRpdHlTZXQ/LmFubm90YXRpb25zLlVJPy5VcGRhdGVIaWRkZW4/LnZhbHVlT2YoKSAhPT0gdW5kZWZpbmVkXG5cdFx0XHQ/IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuVUk/LlVwZGF0ZUhpZGRlblxuXHRcdFx0OiBlbnRpdHlUeXBlPy5hbm5vdGF0aW9ucy5VST8uVXBkYXRlSGlkZGVuKSBhcyBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxib29sZWFuPjtcblx0XHRoZWFkZXJBY3Rpb25zLnB1c2goe1xuXHRcdFx0dHlwZTogQWN0aW9uVHlwZS5QcmltYXJ5LFxuXHRcdFx0a2V5OiBcIkVkaXRBY3Rpb25cIixcblx0XHRcdHZpc2libGU6IGNvbXBpbGVCaW5kaW5nKGdldEVkaXRCdXR0b25WaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHVwZGF0ZUhpZGRlbikpXG5cdFx0fSk7XG5cdH1cblx0Ly8gVGhlbiB0aGUgZGVsZXRlIGFjdGlvbiBpZiB3ZSdyZSBub3Qgc3RhdGljYWxseSBub3QgZGVsZXRhYmxlXG5cdGlmIChcblx0XHQoYlBhcmVudEVudGl0eVNldERlbGV0YWJsZSAmJiBiUGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIpIHx8XG5cdFx0KG9FbnRpdHlEZWxldGVSZXN0cmljdGlvbnM/LkRlbGV0YWJsZT8udmFsdWVPZigpICE9PSBmYWxzZSAmJiBiUGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIpXG5cdCkge1xuXHRcdGNvbnN0IGRlbGV0ZUhpZGRlbiA9IChlbnRpdHlTZXQ/LmFubm90YXRpb25zLlVJPy5EZWxldGVIaWRkZW4/LnZhbHVlT2YoKSAhPT0gdW5kZWZpbmVkXG5cdFx0XHQ/IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuVUk/LkRlbGV0ZUhpZGRlblxuXHRcdFx0OiBlbnRpdHlUeXBlPy5hbm5vdGF0aW9ucy5VST8uRGVsZXRlSGlkZGVuKSBhcyBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxib29sZWFuPjtcblx0XHRoZWFkZXJBY3Rpb25zLnB1c2goe1xuXHRcdFx0dHlwZTogQWN0aW9uVHlwZS5TZWNvbmRhcnksXG5cdFx0XHRrZXk6IFwiRGVsZXRlQWN0aW9uXCIsXG5cdFx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhnZXREZWxldGVCdXR0b25WaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIGRlbGV0ZUhpZGRlbikpLFxuXHRcdFx0cGFyZW50RW50aXR5RGVsZXRlRW5hYmxlZDogYlBhcmVudEVudGl0eVNldERlbGV0YWJsZVxuXHRcdH0pO1xuXHR9XG5cblx0aWYgKG9EcmFmdFJvb3Q/LkVkaXRBY3Rpb24gJiYgYlVwZGF0ZUhpZGRlbiAhPT0gdHJ1ZSkge1xuXHRcdGhlYWRlckFjdGlvbnMucHVzaCh7IHR5cGU6IEFjdGlvblR5cGUuU3dpdGNoVG9BY3RpdmVPYmplY3QsIGtleTogXCJTd2l0Y2hUb0FjdGl2ZU9iamVjdFwiIH0pO1xuXHRcdGhlYWRlckFjdGlvbnMucHVzaCh7IHR5cGU6IEFjdGlvblR5cGUuU3dpdGNoVG9EcmFmdE9iamVjdCwga2V5OiBcIlN3aXRjaFRvRHJhZnRPYmplY3RcIiB9KTtcblx0fVxuXG5cdGNvbnN0IGhlYWRlckRhdGFGaWVsZEZvcklCTkFjdGlvbnMgPSBnZXRJZGVudGlmaWNhdGlvbkRhdGFGaWVsZEZvcklCTkFjdGlvbnMoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksIGZhbHNlKTtcblxuXHRoZWFkZXJEYXRhRmllbGRGb3JJQk5BY3Rpb25zXG5cdFx0LmZpbHRlcihkYXRhRmllbGQgPT4ge1xuXHRcdFx0cmV0dXJuIElNUE9SVEFOVF9DUklUSUNBTElUSUVTLmluZGV4T2YoZGF0YUZpZWxkPy5Dcml0aWNhbGl0eSBhcyBzdHJpbmcpID09PSAtMTtcblx0XHR9KVxuXHRcdC5tYXAoZGF0YUZpZWxkID0+IHtcblx0XHRcdGNvbnN0IG9OYXZpZ2F0aW9uUGFyYW1zID0ge1xuXHRcdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc6IGRhdGFGaWVsZC5NYXBwaW5nID8gZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nKGRhdGFGaWVsZC5NYXBwaW5nKSA6IFtdXG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAoZGF0YUZpZWxkLlJlcXVpcmVzQ29udGV4dD8udmFsdWVPZigpID09PSB0cnVlKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlJlcXVpcmVzQ29udGV4dCBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIHRydWUgZm9yIGhlYWRlciBJQk4gYWN0aW9uIDogXCIgKyBkYXRhRmllbGQuTGFiZWwpO1xuXHRcdFx0fSBlbHNlIGlmIChkYXRhRmllbGQuSW5saW5lPy52YWx1ZU9mKCkgPT09IHRydWUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW5saW5lIHByb3BlcnR5IHNob3VsZCBub3QgYmUgdHJ1ZSBmb3IgaGVhZGVyIElCTiBhY3Rpb24gOiBcIiArIGRhdGFGaWVsZC5MYWJlbCk7XG5cdFx0XHR9XG5cdFx0XHRoZWFkZXJBY3Rpb25zLnB1c2goe1xuXHRcdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0XHRcdFx0dGV4dDogZGF0YUZpZWxkLkxhYmVsPy50b1N0cmluZygpLFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRidXR0b25UeXBlOiBCdXR0b25UeXBlLkdob3N0LFxuXHRcdFx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhub3QoZXF1YWwoYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkpLCB0cnVlKSkpLFxuXHRcdFx0XHRlbmFibGVkOlxuXHRcdFx0XHRcdGRhdGFGaWVsZC5OYXZpZ2F0aW9uQXZhaWxhYmxlICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHRcdD8gY29tcGlsZUJpbmRpbmcoZXF1YWwoYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkLk5hdmlnYXRpb25BdmFpbGFibGU/LnZhbHVlT2YoKSksIHRydWUpKVxuXHRcdFx0XHRcdFx0OiB0cnVlLFxuXHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWUsXG5cdFx0XHRcdHByZXNzOiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRmbihcIi5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlXCIsIFtcblx0XHRcdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZC5TZW1hbnRpY09iamVjdCksXG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbihkYXRhRmllbGQuQWN0aW9uKSxcblx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1zXG5cdFx0XHRcdFx0XSlcblx0XHRcdFx0KSxcblx0XHRcdFx0Y3VzdG9tRGF0YTogY29tcGlsZUJpbmRpbmcoe1xuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBhbm5vdGF0aW9uRXhwcmVzc2lvbihkYXRhRmllbGQuU2VtYW50aWNPYmplY3QpLFxuXHRcdFx0XHRcdGFjdGlvbjogYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkLkFjdGlvbilcblx0XHRcdFx0fSlcblx0XHRcdH0gYXMgQW5ub3RhdGlvbkFjdGlvbik7XG5cdFx0fSk7XG5cdC8vIEZpbmFsbHkgdGhlIG5vbiBjcml0aWNhbCBEYXRhRmllbGRGb3JBY3Rpb25zXG5cdGhlYWRlckRhdGFGaWVsZEZvckFjdGlvbnNcblx0XHQuZmlsdGVyKGRhdGFGaWVsZCA9PiB7XG5cdFx0XHRyZXR1cm4gSU1QT1JUQU5UX0NSSVRJQ0FMSVRJRVMuaW5kZXhPZihkYXRhRmllbGQ/LkNyaXRpY2FsaXR5IGFzIHN0cmluZykgPT09IC0xO1xuXHRcdH0pXG5cdFx0Lm1hcChkYXRhRmllbGQgPT4ge1xuXHRcdFx0aGVhZGVyQWN0aW9ucy5wdXNoKHtcblx0XHRcdFx0dHlwZTogQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JBY3Rpb24sXG5cdFx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YUZpZWxkLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpLFxuXHRcdFx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhub3QoZXF1YWwoYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpKSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWVcblx0XHRcdH0gYXMgQW5ub3RhdGlvbkFjdGlvbik7XG5cdFx0fSk7XG5cblx0cmV0dXJuIGhlYWRlckFjdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIaWRkZW5IZWFkZXJBY3Rpb25zKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBCYXNlQWN0aW9uW10ge1xuXHRjb25zdCBlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdGNvbnN0IGhpZGRlbkFjdGlvbnMgPSAoZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uVUk/LklkZW50aWZpY2F0aW9uPy5maWx0ZXIoaWRlbnRpZmljYXRpb25EYXRhRmllbGQgPT4ge1xuXHRcdHJldHVybiBpZGVudGlmaWNhdGlvbkRhdGFGaWVsZD8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gdHJ1ZTtcblx0fSkgfHwgW10pIGFzIERhdGFGaWVsZEZvckFjdGlvblR5cGVzW107XG5cdHJldHVybiBoaWRkZW5BY3Rpb25zLm1hcChkYXRhRmllbGQgPT4ge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkRlZmF1bHQsXG5cdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKVxuXHRcdH07XG5cdH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9vdGVyRGVmYXVsdEFjdGlvbnModmlld0xldmVsOiBudW1iZXIsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBCYXNlQWN0aW9uW10ge1xuXHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRjb25zdCBlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdGNvbnN0IG9TdGlja3lTZXNzaW9uU3VwcG9ydGVkID0gZW50aXR5U2V0ICYmIGVudGl0eVNldC5hbm5vdGF0aW9ucz8uU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCwgLy9mb3Igc3RpY2t5IGFwcFxuXHRcdHNFbnRpdHlTZXREcmFmdFJvb3QgPVxuXHRcdFx0ZW50aXR5U2V0ICYmIChlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3Q/LnRlcm0gfHwgZW50aXR5U2V0LmFubm90YXRpb25zPy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy50ZXJtKSxcblx0XHRiQ29uZGl0aW9uU2F2ZSA9XG5cdFx0XHRzRW50aXR5U2V0RHJhZnRSb290ID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIiB8fFxuXHRcdFx0KG9TdGlja3lTZXNzaW9uU3VwcG9ydGVkICYmIG9TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy5TYXZlQWN0aW9uKSxcblx0XHRiQ29uZGl0aW9uQXBwbHkgPSB2aWV3TGV2ZWwgPiAxLFxuXHRcdGJDb25kaXRpb25DYW5jZWwgPVxuXHRcdFx0c0VudGl0eVNldERyYWZ0Um9vdCA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCIgfHxcblx0XHRcdChvU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCAmJiBvU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uRGlzY2FyZEFjdGlvbik7XG5cblx0Ly8gUmV0cmlldmUgYWxsIGRldGVybWluaW5nIGFjdGlvbnNcblx0Y29uc3QgZm9vdGVyRGF0YUZpZWxkRm9yQWN0aW9ucyA9IGdldElkZW50aWZpY2F0aW9uRGF0YUZpZWxkRm9yQWN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSwgdHJ1ZSk7XG5cblx0Ly8gRmlyc3QgYWRkIHRoZSBcIkNyaXRpY2FsXCIgRGF0YUZpZWxkRm9yQWN0aW9uc1xuXHRjb25zdCBmb290ZXJBY3Rpb25zOiBCYXNlQWN0aW9uW10gPSBmb290ZXJEYXRhRmllbGRGb3JBY3Rpb25zXG5cdFx0LmZpbHRlcihkYXRhRmllbGQgPT4ge1xuXHRcdFx0cmV0dXJuIElNUE9SVEFOVF9DUklUSUNBTElUSUVTLmluZGV4T2YoZGF0YUZpZWxkPy5Dcml0aWNhbGl0eSBhcyBzdHJpbmcpID4gLTE7XG5cdFx0fSlcblx0XHQubWFwKGRhdGFGaWVsZCA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckFjdGlvbixcblx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChkYXRhRmllbGQuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCksXG5cdFx0XHRcdHZpc2libGU6IGNvbXBpbGVCaW5kaW5nKG5vdChlcXVhbChhbm5vdGF0aW9uRXhwcmVzc2lvbihkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4pLCB0cnVlKSkpLFxuXHRcdFx0XHRpc05hdmlnYWJsZTogdHJ1ZVxuXHRcdFx0fTtcblx0XHR9KTtcblxuXHQvLyBUaGVuIHRoZSBzYXZlIGFjdGlvbiBpZiBpdCBleGlzdHNcblx0aWYgKGVudGl0eVNldD8uZW50aXR5VHlwZU5hbWUgPT09IGVudGl0eVR5cGU/LmZ1bGx5UXVhbGlmaWVkTmFtZSAmJiBiQ29uZGl0aW9uU2F2ZSkge1xuXHRcdGZvb3RlckFjdGlvbnMucHVzaCh7IHR5cGU6IEFjdGlvblR5cGUuUHJpbWFyeSwga2V5OiBcIlNhdmVBY3Rpb25cIiB9KTtcblx0fVxuXG5cdC8vIFRoZW4gdGhlIGFwcGx5IGFjdGlvbiBpZiBpdCBleGlzdHNcblx0aWYgKGJDb25kaXRpb25BcHBseSkge1xuXHRcdGZvb3RlckFjdGlvbnMucHVzaCh7IHR5cGU6IEFjdGlvblR5cGUuRGVmYXVsdEFwcGx5LCBrZXk6IFwiQXBwbHlBY3Rpb25cIiB9KTtcblx0fVxuXG5cdC8vIFRoZW4gdGhlIG5vbiBjcml0aWNhbCBEYXRhRmllbGRGb3JBY3Rpb25zXG5cdGZvb3RlckRhdGFGaWVsZEZvckFjdGlvbnNcblx0XHQuZmlsdGVyKGRhdGFGaWVsZCA9PiB7XG5cdFx0XHRyZXR1cm4gSU1QT1JUQU5UX0NSSVRJQ0FMSVRJRVMuaW5kZXhPZihkYXRhRmllbGQ/LkNyaXRpY2FsaXR5IGFzIHN0cmluZykgPT09IC0xO1xuXHRcdH0pXG5cdFx0Lm1hcChkYXRhRmllbGQgPT4ge1xuXHRcdFx0Zm9vdGVyQWN0aW9ucy5wdXNoKHtcblx0XHRcdFx0dHlwZTogQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JBY3Rpb24sXG5cdFx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YUZpZWxkLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpLFxuXHRcdFx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhub3QoZXF1YWwoYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpKSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWVcblx0XHRcdH0gYXMgQW5ub3RhdGlvbkFjdGlvbik7XG5cdFx0fSk7XG5cblx0Ly8gVGhlbiB0aGUgY2FuY2VsIGFjdGlvbiBpZiBpdCBleGlzdHNcblx0aWYgKGJDb25kaXRpb25DYW5jZWwpIHtcblx0XHRmb290ZXJBY3Rpb25zLnB1c2goe1xuXHRcdFx0dHlwZTogQWN0aW9uVHlwZS5TZWNvbmRhcnksXG5cdFx0XHRrZXk6IFwiQ2FuY2VsQWN0aW9uXCIsXG5cdFx0XHRwb3NpdGlvbjogeyBwbGFjZW1lbnQ6IFBsYWNlbWVudC5FbmQgfVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBmb290ZXJBY3Rpb25zO1xufVxuIl19
|
|
427
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkhlYWRlckFuZEZvb3RlckFjdGlvbi50cyJdLCJuYW1lcyI6WyJnZXRJZGVudGlmaWNhdGlvbkRhdGFGaWVsZEZvckFjdGlvbnMiLCJlbnRpdHlUeXBlIiwiYkRldGVybWluaW5nIiwiYW5ub3RhdGlvbnMiLCJVSSIsIklkZW50aWZpY2F0aW9uIiwiZmlsdGVyIiwiaWRlbnRpZmljYXRpb25EYXRhRmllbGQiLCJIaWRkZW4iLCJ2YWx1ZU9mIiwiJFR5cGUiLCJEZXRlcm1pbmluZyIsIkFjdGlvblRhcmdldCIsImlzQm91bmQiLCJDb3JlIiwiT3BlcmF0aW9uQXZhaWxhYmxlIiwiZ2V0SWRlbnRpZmljYXRpb25EYXRhRmllbGRGb3JJQk5BY3Rpb25zIiwiSU1QT1JUQU5UX0NSSVRJQ0FMSVRJRVMiLCJnZXREZWxldGVCdXR0b25WaXNpYmlsaXR5IiwiY29udmVydGVyQ29udGV4dCIsImRlbGV0ZUhpZGRlbiIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwidmlzaXRlZE5hdmlnYXRpb25QYXRocyIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwibWFwIiwibmF2UHJvcCIsIm5hbWUiLCJkZWxldGVIaWRkZW5FeHByZXNzaW9uIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCJ1bmRlZmluZWQiLCJwYXRoIiwic2luZ2xldG9uUGF0aFZpc2l0b3IiLCJtYW5pZmVzdFdyYXBwZXIiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJ2aWV3TGV2ZWwiLCJnZXRWaWV3TGV2ZWwiLCJlZGl0YWJsZUV4cHJlc3Npb24iLCJJc0VkaXRhYmxlIiwibm90IiwiaWZFbHNlIiwiYW5kIiwiZXF1YWwiLCJnZXREZWxldGVCdXR0b25FbmFibGVkIiwiaXNEZWxldGFibGUiLCJpc1BhcmVudERlbGV0YWJsZSIsImNvbnN0YW50IiwiZ2V0RWRpdEJ1dHRvblZpc2liaWxpdHkiLCJ1cGRhdGVIaWRkZW4iLCJlbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJiSXNEcmFmdFJvb3QiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJ1cGRhdGVIaWRkZW5FeHByZXNzaW9uIiwibm90RWRpdGFibGVFeHByZXNzaW9uIiwicmVzdWx0YW50RXhwcmVzc2lvbiIsIkRyYWZ0IiwiSGFzTm9EcmFmdEZvckN1cnJlbnRVc2VyIiwiZ2V0RWRpdEJ1dHRvbkVuYWJsZWQiLCJpc0RyYWZ0Um9vdCIsImlzU3RpY2t5IiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJlZGl0QWN0aW9uTmFtZSIsIkVkaXRBY3Rpb24iLCJlZGl0QWN0aW9uQW5ub3RhdGlvblBhdGgiLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwiZWRpdEFjdGlvbnMiLCJnZXRFbnRpdHlUeXBlQW5ub3RhdGlvbiIsImFubm90YXRpb24iLCJhY3Rpb25zIiwibGVuZ3RoIiwiZWRpdEFjdGlvbiIsImdldEVuYWJsZWRGb3JBbm5vdGF0aW9uQWN0aW9uIiwiZ2V0SGVhZGVyRGVmYXVsdEFjdGlvbnMiLCJnZXRFbnRpdHlUeXBlIiwib1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJvRHJhZnRSb290Iiwib0VudGl0eURlbGV0ZVJlc3RyaWN0aW9ucyIsIkNhcGFiaWxpdGllcyIsIkRlbGV0ZVJlc3RyaWN0aW9ucyIsImJVcGRhdGVIaWRkZW4iLCJVcGRhdGVIaWRkZW4iLCJpc1BhdGhEZWxldGFibGUiLCJiUGFyZW50RW50aXR5U2V0RGVsZXRhYmxlIiwiY29tcGlsZUJpbmRpbmciLCJoZWFkZXJEYXRhRmllbGRGb3JBY3Rpb25zIiwiaGVhZGVyQWN0aW9ucyIsImRhdGFGaWVsZCIsImluZGV4T2YiLCJDcml0aWNhbGl0eSIsInR5cGUiLCJBY3Rpb25UeXBlIiwiRGF0YUZpZWxkRm9yQWN0aW9uIiwiYW5ub3RhdGlvblBhdGgiLCJnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwia2V5IiwiS2V5SGVscGVyIiwiZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkIiwidmlzaWJsZSIsImVuYWJsZWQiLCJpc05hdmlnYWJsZSIsInB1c2giLCJQcmltYXJ5IiwiRGVsZXRhYmxlIiwiRGVsZXRlSGlkZGVuIiwiU2Vjb25kYXJ5IiwicGFyZW50RW50aXR5RGVsZXRlRW5hYmxlZCIsIlN3aXRjaFRvQWN0aXZlT2JqZWN0IiwiU3dpdGNoVG9EcmFmdE9iamVjdCIsImhlYWRlckRhdGFGaWVsZEZvcklCTkFjdGlvbnMiLCJvTmF2aWdhdGlvblBhcmFtcyIsInNlbWFudGljT2JqZWN0TWFwcGluZyIsIk1hcHBpbmciLCJnZXRTZW1hbnRpY09iamVjdE1hcHBpbmciLCJSZXF1aXJlc0NvbnRleHQiLCJFcnJvciIsIkxhYmVsIiwiSW5saW5lIiwiRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIiwidGV4dCIsInRvU3RyaW5nIiwiYnV0dG9uVHlwZSIsIkJ1dHRvblR5cGUiLCJHaG9zdCIsIk5hdmlnYXRpb25BdmFpbGFibGUiLCJwcmVzcyIsImZuIiwiU2VtYW50aWNPYmplY3QiLCJBY3Rpb24iLCJjdXN0b21EYXRhIiwic2VtYW50aWNPYmplY3QiLCJhY3Rpb24iLCJnZXRIaWRkZW5IZWFkZXJBY3Rpb25zIiwiaGlkZGVuQWN0aW9ucyIsIkRlZmF1bHQiLCJnZXRGb290ZXJEZWZhdWx0QWN0aW9ucyIsInNFbnRpdHlTZXREcmFmdFJvb3QiLCJ0ZXJtIiwiYkNvbmRpdGlvblNhdmUiLCJTYXZlQWN0aW9uIiwiYkNvbmRpdGlvbkFwcGx5IiwiYkNvbmRpdGlvbkNhbmNlbCIsIkRpc2NhcmRBY3Rpb24iLCJmb290ZXJEYXRhRmllbGRGb3JBY3Rpb25zIiwiZm9vdGVyQWN0aW9ucyIsImVudGl0eVR5cGVOYW1lIiwiRGVmYXVsdEFwcGx5IiwicG9zaXRpb24iLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJFbmQiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFFbEJDLFFBQUFBLGNBQWMsRUFBRTVFLGdCQUFnQixDQUFDNkUsK0JBQWpCLENBQWlEUCxTQUFTLENBQUNRLGtCQUEzRCxDQUZFO0FBR2xCQyxRQUFBQSxHQUFHLEVBQUVDLFNBQVMsQ0FBQ0Msd0JBQVYsQ0FBbUNYLFNBQW5DLENBSGE7QUFJbEJZLFFBQUFBLE9BQU8sRUFBRWYsY0FBYyxDQUFDL0MsR0FBRyxDQUFDRyxLQUFLLENBQUNiLG9CQUFvQiw0QkFBQzRELFNBQVMsQ0FBQ3RGLFdBQVgsdUZBQUMsd0JBQXVCQyxFQUF4Qiw0REFBQyx3QkFBMkJJLE1BQTVCLENBQXJCLEVBQTBELElBQTFELENBQU4sQ0FBSixDQUpMO0FBS2xCOEYsUUFBQUEsT0FBTyxFQUFFNUIsNkJBQTZCLENBQUN2RCxnQkFBRCxFQUFtQnNFLFNBQVMsQ0FBQzdFLFlBQTdCLENBTHBCO0FBTWxCMkYsUUFBQUEsV0FBVyxFQUFFO0FBTkssT0FBbkI7QUFRQSxLQWJGLEVBNUM0RyxDQTJENUc7O0FBQ0EsUUFBSXlDLGdCQUFKLEVBQXNCO0FBQ3JCRyxNQUFBQSxhQUFhLENBQUMzQyxJQUFkLENBQW1CO0FBQ2xCWixRQUFBQSxJQUFJLEVBQUVDLFVBQVUsQ0FBQ2UsU0FEQztBQUVsQlYsUUFBQUEsR0FBRyxFQUFFLGNBRmE7QUFHbEJvRCxRQUFBQSxRQUFRLEVBQUU7QUFBRUMsVUFBQUEsU0FBUyxFQUFFQyxTQUFTLENBQUNDO0FBQXZCO0FBSFEsT0FBbkI7QUFLQTs7QUFDRCxXQUFPTixhQUFQO0FBQ0EiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGlvblR5cGUgfSBmcm9tIFwiLi4vTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgRW50aXR5VHlwZSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQge1xuXHRBbm5vdGF0aW9uQWN0aW9uLFxuXHRCYXNlQWN0aW9uLFxuXHRCdXR0b25UeXBlLFxuXHRnZXRFbmFibGVkRm9yQW5ub3RhdGlvbkFjdGlvbixcblx0Z2V0U2VtYW50aWNPYmplY3RNYXBwaW5nXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9BY3Rpb25cIjtcbmltcG9ydCB7IERhdGFGaWVsZEZvckFjdGlvblR5cGVzLCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25UeXBlcywgUHJvcGVydHlBbm5vdGF0aW9uVmFsdWUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB7IFBsYWNlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQge1xuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0Y29tcGlsZUJpbmRpbmcsXG5cdG5vdCxcblx0ZXF1YWwsXG5cdGZuLFxuXHRFeHByZXNzaW9uLFxuXHRhbmQsXG5cdGlmRWxzZSxcblx0QmluZGluZ0V4cHJlc3Npb24sXG5cdGNvbnN0YW50XG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBLZXlIZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0tleVwiO1xuaW1wb3J0IHsgaXNQYXRoRGVsZXRhYmxlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4uL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7IERyYWZ0LCBzaW5nbGV0b25QYXRoVmlzaXRvciwgVUkgfSBmcm9tIFwiLi4vaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5cbi8qKlxuICogUmV0cmlldmVzIGFsbCB0aGUgZGF0YSBmaWVsZCBmb3IgYWN0aW9ucyBmb3IgdGhlIGlkZW50aWZpY2F0aW9uIGFubm90YXRpb25cbiAqIFRoZXkgbXVzdCBiZVxuICogLSBOb3Qgc3RhdGljYWxseSBoaWRkZW5cbiAqIC0gRWl0aGVyIGxpbmtlZCB0byBhbiBVbmJvdW5kIGFjdGlvbiBvciB0byBhbiBhY3Rpb24gd2hpY2ggaGFzIGFuIE9wZXJhdGlvbkF2YWlsYWJsZSB0aGF0IGlzIG5vdCBzZXQgdG8gZmFsc2Ugc3RhdGljYWxseS5cbiAqXG4gKiBAcGFyYW0ge0VudGl0eVR5cGV9IGVudGl0eVR5cGUgVGhlIGN1cnJlbnQgZW50aXR5IHR5cGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYkRldGVybWluaW5nIFRoZSBmbGFnIHdoaWNoIGRlbm90ZXMgd2hldGhlciBvciBub3QgdGhlIGFjdGlvbiBpcyBhIGRldGVybWluaW5nIGFjdGlvblxuICogQHJldHVybnMge0RhdGFGaWVsZEZvckFjdGlvblR5cGVzW119IEFuIGFycmF5IG9mIERhdGFGaWVsZCBmb3IgYWN0aW9uIHJlc3BlY3RpbmcgdGhlIGlucHV0IHBhcmFtZXRlciAnYkRldGVybWluaW5nJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SWRlbnRpZmljYXRpb25EYXRhRmllbGRGb3JBY3Rpb25zKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIGJEZXRlcm1pbmluZzogYm9vbGVhbik6IERhdGFGaWVsZEZvckFjdGlvblR5cGVzW10ge1xuXHRyZXR1cm4gKGVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5JZGVudGlmaWNhdGlvbj8uZmlsdGVyKGlkZW50aWZpY2F0aW9uRGF0YUZpZWxkID0+IHtcblx0XHRpZiAoaWRlbnRpZmljYXRpb25EYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgIT09IHRydWUpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0aWRlbnRpZmljYXRpb25EYXRhRmllbGQ/LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFjdGlvblwiICYmXG5cdFx0XHRcdCEhaWRlbnRpZmljYXRpb25EYXRhRmllbGQuRGV0ZXJtaW5pbmcgPT09IGJEZXRlcm1pbmluZyAmJlxuXHRcdFx0XHQoIWlkZW50aWZpY2F0aW9uRGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQ/LmlzQm91bmQgfHxcblx0XHRcdFx0XHRpZGVudGlmaWNhdGlvbkRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29yZT8uT3BlcmF0aW9uQXZhaWxhYmxlPy52YWx1ZU9mKCkgIT09IGZhbHNlKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0pIHx8IFtdKSBhcyBEYXRhRmllbGRGb3JBY3Rpb25UeXBlc1tdO1xufVxuXG4vKipcbiAqIFJldHJpZXZlIGFsbCB0aGUgSUJOIGFjdGlvbnMgZm9yIHRoZSBpZGVudGlmaWNhdGlvbiBhbm5vdGF0aW9uLlxuICogVGhleSBtdXN0IGJlXG4gKiAtIE5vdCBzdGF0aWNhbGx5IGhpZGRlbi5cbiAqIEBwYXJhbSB7RW50aXR5VHlwZX0gZW50aXR5VHlwZSBUaGUgY3VycmVudCBlbnRpdHl0eXBlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJEZXRlcm1pbmluZyBXaGV0aGVyIG9yIG5vdCB0aGUgYWN0aW9uIHNob3VsZCBiZSBkZXRlcm1pbmluZ1xuICogQHJldHVybnMge0RhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblR5cGVzW119IEFuIGFycmF5IG9mIGRhdGFmaWVsZCBmb3IgYWN0aW9uIHJlc3BlY3RpbmcgdGhlIGJEZXRlcm1pbmluZyBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0SWRlbnRpZmljYXRpb25EYXRhRmllbGRGb3JJQk5BY3Rpb25zKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIGJEZXRlcm1pbmluZzogYm9vbGVhbik6IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblR5cGVzW10ge1xuXHRyZXR1cm4gKGVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5JZGVudGlmaWNhdGlvbj8uZmlsdGVyKGlkZW50aWZpY2F0aW9uRGF0YUZpZWxkID0+IHtcblx0XHRpZiAoaWRlbnRpZmljYXRpb25EYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgIT09IHRydWUpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0aWRlbnRpZmljYXRpb25EYXRhRmllbGQ/LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblwiICYmXG5cdFx0XHRcdCEhaWRlbnRpZmljYXRpb25EYXRhRmllbGQuRGV0ZXJtaW5pbmcgPT09IGJEZXRlcm1pbmluZ1xuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fSkgfHwgW10pIGFzIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblR5cGVzW107XG59XG5cbmNvbnN0IElNUE9SVEFOVF9DUklUSUNBTElUSUVTID0gW1xuXHRcIlVJLkNyaXRpY2FsaXR5VHlwZS9WZXJ5UG9zaXRpdmVcIixcblx0XCJVSS5Dcml0aWNhbGl0eVR5cGUvUG9zaXRpdmVcIixcblx0XCJVSS5Dcml0aWNhbGl0eVR5cGUvTmVnYXRpdmVcIixcblx0XCJVSS5Dcml0aWNhbGl0eVR5cGUvVmVyeU5lZ2F0aXZlXCJcbl07XG5cbi8qKlxuICogTWV0aG9kIHRvIGRldGVybWluZSB0aGUgJ3Zpc2libGUnIHByb3BlcnR5IGJpbmRpbmcgZm9yIHRoZSBEZWxldGUgYnV0dG9uIG9uIGFuIG9iamVjdCBwYWdlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dCBJbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0ge1Byb3BlcnR5QW5ub3RhdGlvblZhbHVlPGJvb2xlYW4+IHwgdW5kZWZpbmVkfSBkZWxldGVIaWRkZW4gVGhlIHZhbHVlIG9mIHRoZSBVSS5EZWxldGVIaWRkZW4gYW5ub3RhdGlvbiBvbiB0aGUgZW50aXR5IHNldCAvIHR5cGUuXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBvZiB0aGUgRGVsZXRlIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZUJ1dHRvblZpc2liaWxpdHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGRlbGV0ZUhpZGRlbjogUHJvcGVydHlBbm5vdGF0aW9uVmFsdWU8Ym9vbGVhbj4gfCB1bmRlZmluZWRcbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0dmlzaXRlZE5hdmlnYXRpb25QYXRocyA9IGRhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMubWFwKG5hdlByb3AgPT4gbmF2UHJvcC5uYW1lKSxcblx0XHQvLyBTZXQgYWJzb2x1dGUgYmluZGluZyBwYXRoIGZvciBTaW5nbGV0b24gcmVmZXJlbmNlcywgb3RoZXJ3aXNlIHRoZSBjb25maWd1cmVkIGFubm90YXRpb24gcGF0aCBpdHNlbGYuXG5cdFx0Ly8gRm9yIGUuZy4gL2NvbS5zYXAubmFtZXNwYWNlLkVudGl0eUNvbnRhaW5lci9TaW5nbGV0b24vUHJvcGVydHkgdG8gL1NpbmdsZXRvbi9Qcm9wZXJ0eVxuXHRcdGRlbGV0ZUhpZGRlbkV4cHJlc3Npb246IEV4cHJlc3Npb248Ym9vbGVhbiB8IHVuZGVmaW5lZD4gPSBhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdGRlbGV0ZUhpZGRlbixcblx0XHRcdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHQocGF0aDogc3RyaW5nKSA9PiBzaW5nbGV0b25QYXRoVmlzaXRvcihwYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBbXSlcblx0XHQpLFxuXHRcdG1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCksXG5cdFx0dmlld0xldmVsID0gbWFuaWZlc3RXcmFwcGVyLmdldFZpZXdMZXZlbCgpLFxuXHRcdC8vIERlbGV0ZSBidXR0b24gaXMgdmlzaWJsZVxuXHRcdC8vIEluIE9QIFx0XHQtLT4gIHdoZW4gbm90IGluIGVkaXQgbW9kZVxuXHRcdC8vIEluIHN1Yi1PUCBcdC0tPiAgd2hlbiBpbiBlZGl0IG1vZGVcblx0XHRlZGl0YWJsZUV4cHJlc3Npb246IEV4cHJlc3Npb248Ym9vbGVhbj4gPSB2aWV3TGV2ZWwgPiAxID8gVUkuSXNFZGl0YWJsZSA6IG5vdChVSS5Jc0VkaXRhYmxlKTtcblxuXHQvLyBJZiBVSS5EZWxldGVIaWRkZW4gYW5ub3RhdGlvbiBvbiBlbnRpdHkgc2V0IG9yIHR5cGUgaXMgZWl0aGVyIG5vdCBkZWZpbmVkIG9yIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlLFxuXHQvLyBEZWxldGUgYnV0dG9uIGlzIHZpc2libGUgYmFzZWQgb24gZWRpdGFibGVFeHByZXNzaW9uLlxuXHQvLyBlbHNlLFxuXHQvLyBEZWxldGUgYnV0dG9uIGlzIHZpc2libGUgYmFzZWQgb24gYm90aCBhbm5vdGF0aW9uIHBhdGggYW5kIGVkaXRhYmxlRXhwcmVzc2lvbi5cblx0cmV0dXJuIGlmRWxzZShcblx0XHRkZWxldGVIaWRkZW4gPT09IHVuZGVmaW5lZCB8fCBkZWxldGVIaWRkZW4udmFsdWVPZigpID09PSBmYWxzZSxcblx0XHRlZGl0YWJsZUV4cHJlc3Npb24sXG5cdFx0YW5kKGVkaXRhYmxlRXhwcmVzc2lvbiwgZXF1YWwoZGVsZXRlSGlkZGVuRXhwcmVzc2lvbiwgZmFsc2UpKVxuXHQpO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byBkZXRlcm1pbmUgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBiaW5kaW5nIGZvciB0aGUgRGVsZXRlIGJ1dHRvbiBvbiBhbiBvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0ge1Byb3BlcnR5QW5ub3RhdGlvblZhbHVlPGJvb2xlYW4+fHVuZGVmaW5lZH0gaXNEZWxldGFibGUgVGhlIGRlbGV0ZSByZXN0cmljdGlvbiBjb25maWd1cmVkXG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGlzUGFyZW50RGVsZXRhYmxlIFRoZSBkZWxldGUgcmVzdHJpY3Rpb24gY29uZmlndXJlZCBvbiB0aGUgcGFyZW50IGVudGl0eVxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgdGhlIERlbGV0ZSBidXR0b25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZUJ1dHRvbkVuYWJsZWQoXG5cdGlzRGVsZXRhYmxlOiBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxCb29sZWFuPiB8IHVuZGVmaW5lZCxcblx0aXNQYXJlbnREZWxldGFibGU6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdGlzUGFyZW50RGVsZXRhYmxlICE9PSB1bmRlZmluZWQsXG5cdFx0aXNQYXJlbnREZWxldGFibGUsXG5cdFx0aWZFbHNlKGlzRGVsZXRhYmxlICE9PSB1bmRlZmluZWQsIGVxdWFsKGlzRGVsZXRhYmxlLCB0cnVlKSwgY29uc3RhbnQodHJ1ZSkpXG5cdCk7XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGRldGVybWluZSB0aGUgJ3Zpc2libGUnIHByb3BlcnR5IGJpbmRpbmcgZm9yIHRoZSBFZGl0IGJ1dHRvbiBvbiBhbiBvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHQgSW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIHtQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxib29sZWFuPiB8IHVuZGVmaW5lZH0gdXBkYXRlSGlkZGVuIFRoZSB2YWx1ZSBvZiB0aGUgVUkuVXBkYXRlSGlkZGVuIGFubm90YXRpb24gb24gdGhlIGVudGl0eSBzZXQgLyB0eXBlLlxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAndmlzaWJsZScgcHJvcGVydHkgb2YgdGhlIEVkaXQgYnV0dG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWRpdEJ1dHRvblZpc2liaWxpdHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHVwZGF0ZUhpZGRlbjogUHJvcGVydHlBbm5vdGF0aW9uVmFsdWU8Ym9vbGVhbj4gfCB1bmRlZmluZWRcbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpLFxuXHRcdGJJc0RyYWZ0Um9vdCA9IGVudGl0eVNldCAmJiBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3QgPyB0cnVlIDogZmFsc2UsXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMgPSBkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLm1hcChuYXZQcm9wID0+IG5hdlByb3AubmFtZSksXG5cdFx0Ly8gU2V0IGFic29sdXRlIGJpbmRpbmcgcGF0aCBmb3IgU2luZ2xldG9uIHJlZmVyZW5jZXMsIG90aGVyd2lzZSB0aGUgY29uZmlndXJlZCBhbm5vdGF0aW9uIHBhdGggaXRzZWxmLlxuXHRcdC8vIEZvciBlLmcuIC9jb20uc2FwLm5hbWVzcGFjZS5FbnRpdHlDb250YWluZXIvU2luZ2xldG9uL1Byb3BlcnR5IHRvIC9TaW5nbGV0b24vUHJvcGVydHlcblx0XHR1cGRhdGVIaWRkZW5FeHByZXNzaW9uOiBFeHByZXNzaW9uPGJvb2xlYW4gfCB1bmRlZmluZWQ+ID0gYW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHR1cGRhdGVIaWRkZW4sXG5cdFx0XHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0KHBhdGg6IHN0cmluZykgPT4gc2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dCwgdmlzaXRlZE5hdmlnYXRpb25QYXRocylcblx0XHQpLFxuXHRcdG5vdEVkaXRhYmxlRXhwcmVzc2lvbjogRXhwcmVzc2lvbjxib29sZWFuPiA9IG5vdChVSS5Jc0VkaXRhYmxlKTtcblxuXHQvLyBJZiBVSS5VcGRhdGVIaWRkZW4gYW5ub3RhdGlvbiBvbiBlbnRpdHkgc2V0IG9yIHR5cGUgaXMgZWl0aGVyIG5vdCBkZWZpbmVkIG9yIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlLFxuXHQvLyBFZGl0IGJ1dHRvbiBpcyB2aXNpYmxlIGluIGRpc3BsYXkgbW9kZS5cblx0Ly8gZWxzZSxcblx0Ly8gRWRpdCBidXR0b24gaXMgdmlzaWJsZSBiYXNlZCBvbiBib3RoIGFubm90YXRpb24gcGF0aCBhbmQgaW4gZGlzcGxheSBtb2RlLlxuXHRjb25zdCByZXN1bHRhbnRFeHByZXNzaW9uOiBFeHByZXNzaW9uPGJvb2xlYW4+ID0gaWZFbHNlKFxuXHRcdHVwZGF0ZUhpZGRlbiA9PT0gdW5kZWZpbmVkIHx8IHVwZGF0ZUhpZGRlbi52YWx1ZU9mKCkgPT09IGZhbHNlLFxuXHRcdG5vdEVkaXRhYmxlRXhwcmVzc2lvbixcblx0XHRhbmQobm90RWRpdGFibGVFeHByZXNzaW9uLCBlcXVhbCh1cGRhdGVIaWRkZW5FeHByZXNzaW9uLCBmYWxzZSkpXG5cdCk7XG5cdHJldHVybiBpZkVsc2UoYklzRHJhZnRSb290LCBhbmQocmVzdWx0YW50RXhwcmVzc2lvbiwgRHJhZnQuSGFzTm9EcmFmdEZvckN1cnJlbnRVc2VyKSwgcmVzdWx0YW50RXhwcmVzc2lvbik7XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGRldGVybWluZSB0aGUgJ2VuYWJsZWQnIHByb3BlcnR5IGJpbmRpbmcgZm9yIHRoZSBFZGl0IGJ1dHRvbiBvbiBhbiBvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHQgSW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgdGhlIEVkaXQgYnV0dG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWRpdEJ1dHRvbkVuYWJsZWQoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSxcblx0XHRpc0RyYWZ0Um9vdCA9IGVudGl0eVNldCAmJiBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3QgPyB0cnVlIDogZmFsc2UsXG5cdFx0aXNTdGlja3kgPSBlbnRpdHlTZXQgJiYgZW50aXR5U2V0LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQgPyB0cnVlIDogZmFsc2U7XG5cblx0bGV0IGVkaXRBY3Rpb25OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlmIChpc0RyYWZ0Um9vdCkge1xuXHRcdGVkaXRBY3Rpb25OYW1lID0gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Um9vdD8uRWRpdEFjdGlvbiBhcyBzdHJpbmc7XG5cdH0gZWxzZSBpZiAoaXNTdGlja3kpIHtcblx0XHRlZGl0QWN0aW9uTmFtZSA9IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uRWRpdEFjdGlvbiBhcyBzdHJpbmc7XG5cdH1cblx0aWYgKGVkaXRBY3Rpb25OYW1lKSB7XG5cdFx0Y29uc3QgZWRpdEFjdGlvbkFubm90YXRpb25QYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoKGVkaXRBY3Rpb25OYW1lIGFzIHN0cmluZyksXG5cdFx0XHRlZGl0QWN0aW9ucyA9IChjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGVBbm5vdGF0aW9uKGVkaXRBY3Rpb25Bbm5vdGF0aW9uUGF0aCk/LmFubm90YXRpb24gYXMgYW55KT8uYWN0aW9ucztcblx0XHRpZiAoZWRpdEFjdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgZWRpdEFjdGlvbiA9IGVkaXRBY3Rpb25zWzBdO1xuXHRcdFx0aWYgKGVkaXRBY3Rpb24/LmFubm90YXRpb25zPy5Db3JlPy5PcGVyYXRpb25BdmFpbGFibGUgPT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIFwiez0gJHsjXCIgKyBlZGl0QWN0aW9uTmFtZSArIFwifSA/IHRydWUgOiBmYWxzZSB9XCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gZ2V0RW5hYmxlZEZvckFubm90YXRpb25BY3Rpb24oY29udmVydGVyQ29udGV4dCwgZWRpdEFjdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZGVyRGVmYXVsdEFjdGlvbnMoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IEJhc2VBY3Rpb25bXSB7XG5cdGNvbnN0IGVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCksXG5cdFx0ZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLFxuXHRcdG9TdGlja3lTZXNzaW9uU3VwcG9ydGVkID0gZW50aXR5U2V0ICYmIGVudGl0eVNldC5hbm5vdGF0aW9ucz8uU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCwgLy9mb3Igc3RpY2t5IGFwcFxuXHRcdG9EcmFmdFJvb3QgPSBlbnRpdHlTZXQgJiYgZW50aXR5U2V0LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290LFxuXHRcdG9FbnRpdHlEZWxldGVSZXN0cmljdGlvbnMgPSBlbnRpdHlTZXQgJiYgZW50aXR5U2V0LmFubm90YXRpb25zPy5DYXBhYmlsaXRpZXM/LkRlbGV0ZVJlc3RyaWN0aW9ucyxcblx0XHRiVXBkYXRlSGlkZGVuID0gZW50aXR5U2V0ICYmIGVudGl0eVNldC5hbm5vdGF0aW9ucy5VST8uVXBkYXRlSGlkZGVuPy52YWx1ZU9mKCksXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdGlzUGFyZW50RGVsZXRhYmxlID0gaXNQYXRoRGVsZXRhYmxlKGRhdGFNb2RlbE9iamVjdFBhdGgpLFxuXHRcdGJQYXJlbnRFbnRpdHlTZXREZWxldGFibGUgPSBpc1BhcmVudERlbGV0YWJsZSA/IGNvbXBpbGVCaW5kaW5nKGlzUGFyZW50RGVsZXRhYmxlKSA6IGlzUGFyZW50RGVsZXRhYmxlLFxuXHRcdGhlYWRlckRhdGFGaWVsZEZvckFjdGlvbnMgPSBnZXRJZGVudGlmaWNhdGlvbkRhdGFGaWVsZEZvckFjdGlvbnMoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksIGZhbHNlKTtcblxuXHQvLyBGaXJzdCBhZGQgdGhlIFwiQ3JpdGljYWxcIiBEYXRhRmllbGRGb3JBY3Rpb25zXG5cdGNvbnN0IGhlYWRlckFjdGlvbnM6IEJhc2VBY3Rpb25bXSA9IGhlYWRlckRhdGFGaWVsZEZvckFjdGlvbnNcblx0XHQuZmlsdGVyKGRhdGFGaWVsZCA9PiB7XG5cdFx0XHRyZXR1cm4gSU1QT1JUQU5UX0NSSVRJQ0FMSVRJRVMuaW5kZXhPZihkYXRhRmllbGQ/LkNyaXRpY2FsaXR5IGFzIHN0cmluZykgPiAtMTtcblx0XHR9KVxuXHRcdC5tYXAoZGF0YUZpZWxkID0+IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHR5cGU6IEFjdGlvblR5cGUuRGF0YUZpZWxkRm9yQWN0aW9uLFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKSxcblx0XHRcdFx0dmlzaWJsZTogY29tcGlsZUJpbmRpbmcobm90KGVxdWFsKGFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiksIHRydWUpKSksXG5cdFx0XHRcdGVuYWJsZWQ6IGdldEVuYWJsZWRGb3JBbm5vdGF0aW9uQWN0aW9uKGNvbnZlcnRlckNvbnRleHQsIGRhdGFGaWVsZC5BY3Rpb25UYXJnZXQpLFxuXHRcdFx0XHRpc05hdmlnYWJsZTogdHJ1ZVxuXHRcdFx0fTtcblx0XHR9KTtcblxuXHQvLyBUaGVuIHRoZSBlZGl0IGFjdGlvbiBpZiBpdCBleGlzdHNcblx0aWYgKChvRHJhZnRSb290Py5FZGl0QWN0aW9uIHx8IG9TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy5FZGl0QWN0aW9uKSAmJiBiVXBkYXRlSGlkZGVuICE9PSB0cnVlKSB7XG5cdFx0Y29uc3QgdXBkYXRlSGlkZGVuID0gKGVudGl0eVNldD8uYW5ub3RhdGlvbnMuVUk/LlVwZGF0ZUhpZGRlbj8udmFsdWVPZigpICE9PSB1bmRlZmluZWRcblx0XHRcdD8gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5VST8uVXBkYXRlSGlkZGVuXG5cdFx0XHQ6IGVudGl0eVR5cGU/LmFubm90YXRpb25zLlVJPy5VcGRhdGVIaWRkZW4pIGFzIFByb3BlcnR5QW5ub3RhdGlvblZhbHVlPGJvb2xlYW4+O1xuXHRcdGhlYWRlckFjdGlvbnMucHVzaCh7XG5cdFx0XHR0eXBlOiBBY3Rpb25UeXBlLlByaW1hcnksXG5cdFx0XHRrZXk6IFwiRWRpdEFjdGlvblwiLFxuXHRcdFx0dmlzaWJsZTogY29tcGlsZUJpbmRpbmcoZ2V0RWRpdEJ1dHRvblZpc2liaWxpdHkoY29udmVydGVyQ29udGV4dCwgdXBkYXRlSGlkZGVuKSksXG5cdFx0XHRlbmFibGVkOiBnZXRFZGl0QnV0dG9uRW5hYmxlZChjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdH0pO1xuXHR9XG5cdC8vIFRoZW4gdGhlIGRlbGV0ZSBhY3Rpb24gaWYgd2UncmUgbm90IHN0YXRpY2FsbHkgbm90IGRlbGV0YWJsZVxuXHRpZiAoXG5cdFx0KGJQYXJlbnRFbnRpdHlTZXREZWxldGFibGUgJiYgYlBhcmVudEVudGl0eVNldERlbGV0YWJsZSAhPT0gXCJmYWxzZVwiKSB8fFxuXHRcdChvRW50aXR5RGVsZXRlUmVzdHJpY3Rpb25zPy5EZWxldGFibGU/LnZhbHVlT2YoKSAhPT0gZmFsc2UgJiYgYlBhcmVudEVudGl0eVNldERlbGV0YWJsZSAhPT0gXCJmYWxzZVwiKVxuXHQpIHtcblx0XHRjb25zdCBkZWxldGVIaWRkZW4gPSAoZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5VST8uRGVsZXRlSGlkZGVuPy52YWx1ZU9mKCkgIT09IHVuZGVmaW5lZFxuXHRcdFx0PyBlbnRpdHlTZXQ/LmFubm90YXRpb25zLlVJPy5EZWxldGVIaWRkZW5cblx0XHRcdDogZW50aXR5VHlwZT8uYW5ub3RhdGlvbnMuVUk/LkRlbGV0ZUhpZGRlbikgYXMgUHJvcGVydHlBbm5vdGF0aW9uVmFsdWU8Ym9vbGVhbj47XG5cdFx0aGVhZGVyQWN0aW9ucy5wdXNoKHtcblx0XHRcdHR5cGU6IEFjdGlvblR5cGUuU2Vjb25kYXJ5LFxuXHRcdFx0a2V5OiBcIkRlbGV0ZUFjdGlvblwiLFxuXHRcdFx0dmlzaWJsZTogY29tcGlsZUJpbmRpbmcoZ2V0RGVsZXRlQnV0dG9uVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBkZWxldGVIaWRkZW4pKSxcblx0XHRcdGVuYWJsZWQ6IGNvbXBpbGVCaW5kaW5nKGdldERlbGV0ZUJ1dHRvbkVuYWJsZWQob0VudGl0eURlbGV0ZVJlc3RyaWN0aW9ucz8uRGVsZXRhYmxlLCBpc1BhcmVudERlbGV0YWJsZSkpLFxuXHRcdFx0cGFyZW50RW50aXR5RGVsZXRlRW5hYmxlZDogYlBhcmVudEVudGl0eVNldERlbGV0YWJsZVxuXHRcdH0pO1xuXHR9XG5cblx0aWYgKG9EcmFmdFJvb3Q/LkVkaXRBY3Rpb24gJiYgYlVwZGF0ZUhpZGRlbiAhPT0gdHJ1ZSkge1xuXHRcdGhlYWRlckFjdGlvbnMucHVzaCh7IHR5cGU6IEFjdGlvblR5cGUuU3dpdGNoVG9BY3RpdmVPYmplY3QsIGtleTogXCJTd2l0Y2hUb0FjdGl2ZU9iamVjdFwiIH0pO1xuXHRcdGhlYWRlckFjdGlvbnMucHVzaCh7IHR5cGU6IEFjdGlvblR5cGUuU3dpdGNoVG9EcmFmdE9iamVjdCwga2V5OiBcIlN3aXRjaFRvRHJhZnRPYmplY3RcIiB9KTtcblx0fVxuXG5cdGNvbnN0IGhlYWRlckRhdGFGaWVsZEZvcklCTkFjdGlvbnMgPSBnZXRJZGVudGlmaWNhdGlvbkRhdGFGaWVsZEZvcklCTkFjdGlvbnMoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksIGZhbHNlKTtcblxuXHRoZWFkZXJEYXRhRmllbGRGb3JJQk5BY3Rpb25zXG5cdFx0LmZpbHRlcihkYXRhRmllbGQgPT4ge1xuXHRcdFx0cmV0dXJuIElNUE9SVEFOVF9DUklUSUNBTElUSUVTLmluZGV4T2YoZGF0YUZpZWxkPy5Dcml0aWNhbGl0eSBhcyBzdHJpbmcpID09PSAtMTtcblx0XHR9KVxuXHRcdC5tYXAoZGF0YUZpZWxkID0+IHtcblx0XHRcdGNvbnN0IG9OYXZpZ2F0aW9uUGFyYW1zID0ge1xuXHRcdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc6IGRhdGFGaWVsZC5NYXBwaW5nID8gZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nKGRhdGFGaWVsZC5NYXBwaW5nKSA6IFtdXG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAoZGF0YUZpZWxkLlJlcXVpcmVzQ29udGV4dD8udmFsdWVPZigpID09PSB0cnVlKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlJlcXVpcmVzQ29udGV4dCBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIHRydWUgZm9yIGhlYWRlciBJQk4gYWN0aW9uIDogXCIgKyBkYXRhRmllbGQuTGFiZWwpO1xuXHRcdFx0fSBlbHNlIGlmIChkYXRhRmllbGQuSW5saW5lPy52YWx1ZU9mKCkgPT09IHRydWUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW5saW5lIHByb3BlcnR5IHNob3VsZCBub3QgYmUgdHJ1ZSBmb3IgaGVhZGVyIElCTiBhY3Rpb24gOiBcIiArIGRhdGFGaWVsZC5MYWJlbCk7XG5cdFx0XHR9XG5cdFx0XHRoZWFkZXJBY3Rpb25zLnB1c2goe1xuXHRcdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0XHRcdFx0dGV4dDogZGF0YUZpZWxkLkxhYmVsPy50b1N0cmluZygpLFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRidXR0b25UeXBlOiBCdXR0b25UeXBlLkdob3N0LFxuXHRcdFx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhub3QoZXF1YWwoYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkpLCB0cnVlKSkpLFxuXHRcdFx0XHRlbmFibGVkOlxuXHRcdFx0XHRcdGRhdGFGaWVsZC5OYXZpZ2F0aW9uQXZhaWxhYmxlICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHRcdD8gY29tcGlsZUJpbmRpbmcoZXF1YWwoYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkLk5hdmlnYXRpb25BdmFpbGFibGU/LnZhbHVlT2YoKSksIHRydWUpKVxuXHRcdFx0XHRcdFx0OiB0cnVlLFxuXHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWUsXG5cdFx0XHRcdHByZXNzOiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRmbihcIi5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlXCIsIFtcblx0XHRcdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZC5TZW1hbnRpY09iamVjdCksXG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbihkYXRhRmllbGQuQWN0aW9uKSxcblx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1zXG5cdFx0XHRcdFx0XSlcblx0XHRcdFx0KSxcblx0XHRcdFx0Y3VzdG9tRGF0YTogY29tcGlsZUJpbmRpbmcoe1xuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBhbm5vdGF0aW9uRXhwcmVzc2lvbihkYXRhRmllbGQuU2VtYW50aWNPYmplY3QpLFxuXHRcdFx0XHRcdGFjdGlvbjogYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkLkFjdGlvbilcblx0XHRcdFx0fSlcblx0XHRcdH0gYXMgQW5ub3RhdGlvbkFjdGlvbik7XG5cdFx0fSk7XG5cdC8vIEZpbmFsbHkgdGhlIG5vbiBjcml0aWNhbCBEYXRhRmllbGRGb3JBY3Rpb25zXG5cdGhlYWRlckRhdGFGaWVsZEZvckFjdGlvbnNcblx0XHQuZmlsdGVyKGRhdGFGaWVsZCA9PiB7XG5cdFx0XHRyZXR1cm4gSU1QT1JUQU5UX0NSSVRJQ0FMSVRJRVMuaW5kZXhPZihkYXRhRmllbGQ/LkNyaXRpY2FsaXR5IGFzIHN0cmluZykgPT09IC0xO1xuXHRcdH0pXG5cdFx0Lm1hcChkYXRhRmllbGQgPT4ge1xuXHRcdFx0aGVhZGVyQWN0aW9ucy5wdXNoKHtcblx0XHRcdFx0dHlwZTogQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JBY3Rpb24sXG5cdFx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YUZpZWxkLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpLFxuXHRcdFx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhub3QoZXF1YWwoYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpKSxcblx0XHRcdFx0ZW5hYmxlZDogZ2V0RW5hYmxlZEZvckFubm90YXRpb25BY3Rpb24oY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkLkFjdGlvblRhcmdldCksXG5cdFx0XHRcdGlzTmF2aWdhYmxlOiB0cnVlXG5cdFx0XHR9IGFzIEFubm90YXRpb25BY3Rpb24pO1xuXHRcdH0pO1xuXG5cdHJldHVybiBoZWFkZXJBY3Rpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGlkZGVuSGVhZGVyQWN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogQmFzZUFjdGlvbltdIHtcblx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRjb25zdCBoaWRkZW5BY3Rpb25zID0gKGVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5JZGVudGlmaWNhdGlvbj8uZmlsdGVyKGlkZW50aWZpY2F0aW9uRGF0YUZpZWxkID0+IHtcblx0XHRyZXR1cm4gaWRlbnRpZmljYXRpb25EYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWU7XG5cdH0pIHx8IFtdKSBhcyBEYXRhRmllbGRGb3JBY3Rpb25UeXBlc1tdO1xuXHRyZXR1cm4gaGlkZGVuQWN0aW9ucy5tYXAoZGF0YUZpZWxkID0+IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dHlwZTogQWN0aW9uVHlwZS5EZWZhdWx0LFxuXHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZClcblx0XHR9O1xuXHR9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvb3RlckRlZmF1bHRBY3Rpb25zKHZpZXdMZXZlbDogbnVtYmVyLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogQmFzZUFjdGlvbltdIHtcblx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKTtcblx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRjb25zdCBvU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCA9IGVudGl0eVNldCAmJiBlbnRpdHlTZXQuYW5ub3RhdGlvbnM/LlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQsIC8vZm9yIHN0aWNreSBhcHBcblx0XHRzRW50aXR5U2V0RHJhZnRSb290ID1cblx0XHRcdGVudGl0eVNldCAmJiAoZW50aXR5U2V0LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290Py50ZXJtIHx8IGVudGl0eVNldC5hbm5vdGF0aW9ucz8uU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8udGVybSksXG5cdFx0YkNvbmRpdGlvblNhdmUgPVxuXHRcdFx0c0VudGl0eVNldERyYWZ0Um9vdCA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCIgfHxcblx0XHRcdChvU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCAmJiBvU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uU2F2ZUFjdGlvbiksXG5cdFx0YkNvbmRpdGlvbkFwcGx5ID0gdmlld0xldmVsID4gMSxcblx0XHRiQ29uZGl0aW9uQ2FuY2VsID1cblx0XHRcdHNFbnRpdHlTZXREcmFmdFJvb3QgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiIHx8XG5cdFx0XHQob1N0aWNreVNlc3Npb25TdXBwb3J0ZWQgJiYgb1N0aWNreVNlc3Npb25TdXBwb3J0ZWQ/LkRpc2NhcmRBY3Rpb24pO1xuXG5cdC8vIFJldHJpZXZlIGFsbCBkZXRlcm1pbmluZyBhY3Rpb25zXG5cdGNvbnN0IGZvb3RlckRhdGFGaWVsZEZvckFjdGlvbnMgPSBnZXRJZGVudGlmaWNhdGlvbkRhdGFGaWVsZEZvckFjdGlvbnMoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksIHRydWUpO1xuXG5cdC8vIEZpcnN0IGFkZCB0aGUgXCJDcml0aWNhbFwiIERhdGFGaWVsZEZvckFjdGlvbnNcblx0Y29uc3QgZm9vdGVyQWN0aW9uczogQmFzZUFjdGlvbltdID0gZm9vdGVyRGF0YUZpZWxkRm9yQWN0aW9uc1xuXHRcdC5maWx0ZXIoZGF0YUZpZWxkID0+IHtcblx0XHRcdHJldHVybiBJTVBPUlRBTlRfQ1JJVElDQUxJVElFUy5pbmRleE9mKGRhdGFGaWVsZD8uQ3JpdGljYWxpdHkgYXMgc3RyaW5nKSA+IC0xO1xuXHRcdH0pXG5cdFx0Lm1hcChkYXRhRmllbGQgPT4ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dHlwZTogQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JBY3Rpb24sXG5cdFx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YUZpZWxkLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpLFxuXHRcdFx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhub3QoZXF1YWwoYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpKSxcblx0XHRcdFx0ZW5hYmxlZDogZ2V0RW5hYmxlZEZvckFubm90YXRpb25BY3Rpb24oY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkLkFjdGlvblRhcmdldCksXG5cdFx0XHRcdGlzTmF2aWdhYmxlOiB0cnVlXG5cdFx0XHR9O1xuXHRcdH0pO1xuXG5cdC8vIFRoZW4gdGhlIHNhdmUgYWN0aW9uIGlmIGl0IGV4aXN0c1xuXHRpZiAoZW50aXR5U2V0Py5lbnRpdHlUeXBlTmFtZSA9PT0gZW50aXR5VHlwZT8uZnVsbHlRdWFsaWZpZWROYW1lICYmIGJDb25kaXRpb25TYXZlKSB7XG5cdFx0Zm9vdGVyQWN0aW9ucy5wdXNoKHsgdHlwZTogQWN0aW9uVHlwZS5QcmltYXJ5LCBrZXk6IFwiU2F2ZUFjdGlvblwiIH0pO1xuXHR9XG5cblx0Ly8gVGhlbiB0aGUgYXBwbHkgYWN0aW9uIGlmIGl0IGV4aXN0c1xuXHRpZiAoYkNvbmRpdGlvbkFwcGx5KSB7XG5cdFx0Zm9vdGVyQWN0aW9ucy5wdXNoKHsgdHlwZTogQWN0aW9uVHlwZS5EZWZhdWx0QXBwbHksIGtleTogXCJBcHBseUFjdGlvblwiIH0pO1xuXHR9XG5cblx0Ly8gVGhlbiB0aGUgbm9uIGNyaXRpY2FsIERhdGFGaWVsZEZvckFjdGlvbnNcblx0Zm9vdGVyRGF0YUZpZWxkRm9yQWN0aW9uc1xuXHRcdC5maWx0ZXIoZGF0YUZpZWxkID0+IHtcblx0XHRcdHJldHVybiBJTVBPUlRBTlRfQ1JJVElDQUxJVElFUy5pbmRleE9mKGRhdGFGaWVsZD8uQ3JpdGljYWxpdHkgYXMgc3RyaW5nKSA9PT0gLTE7XG5cdFx0fSlcblx0XHQubWFwKGRhdGFGaWVsZCA9PiB7XG5cdFx0XHRmb290ZXJBY3Rpb25zLnB1c2goe1xuXHRcdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckFjdGlvbixcblx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChkYXRhRmllbGQuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCksXG5cdFx0XHRcdHZpc2libGU6IGNvbXBpbGVCaW5kaW5nKG5vdChlcXVhbChhbm5vdGF0aW9uRXhwcmVzc2lvbihkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4pLCB0cnVlKSkpLFxuXHRcdFx0XHRlbmFibGVkOiBnZXRFbmFibGVkRm9yQW5ub3RhdGlvbkFjdGlvbihjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGQuQWN0aW9uVGFyZ2V0KSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWVcblx0XHRcdH0gYXMgQW5ub3RhdGlvbkFjdGlvbik7XG5cdFx0fSk7XG5cblx0Ly8gVGhlbiB0aGUgY2FuY2VsIGFjdGlvbiBpZiBpdCBleGlzdHNcblx0aWYgKGJDb25kaXRpb25DYW5jZWwpIHtcblx0XHRmb290ZXJBY3Rpb25zLnB1c2goe1xuXHRcdFx0dHlwZTogQWN0aW9uVHlwZS5TZWNvbmRhcnksXG5cdFx0XHRrZXk6IFwiQ2FuY2VsQWN0aW9uXCIsXG5cdFx0XHRwb3NpdGlvbjogeyBwbGFjZW1lbnQ6IFBsYWNlbWVudC5FbmQgfVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBmb290ZXJBY3Rpb25zO1xufVxuIl19
|
|
@@ -1,9 +1,26 @@
|
|
|
1
1
|
import { ActionType } from "../ManifestSettings";
|
|
2
2
|
import { EntityType } from "@sap-ux/annotation-converter";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
AnnotationAction,
|
|
5
|
+
BaseAction,
|
|
6
|
+
ButtonType,
|
|
7
|
+
getEnabledForAnnotationAction,
|
|
8
|
+
getSemanticObjectMapping
|
|
9
|
+
} from "sap/fe/core/converters/controls/Common/Action";
|
|
4
10
|
import { DataFieldForActionTypes, DataFieldForIntentBasedNavigationTypes, PropertyAnnotationValue } from "@sap-ux/vocabularies-types";
|
|
5
11
|
import { Placement } from "sap/fe/core/converters/helpers/ConfigurableObject";
|
|
6
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
annotationExpression,
|
|
14
|
+
compileBinding,
|
|
15
|
+
not,
|
|
16
|
+
equal,
|
|
17
|
+
fn,
|
|
18
|
+
Expression,
|
|
19
|
+
and,
|
|
20
|
+
ifElse,
|
|
21
|
+
BindingExpression,
|
|
22
|
+
constant
|
|
23
|
+
} from "sap/fe/core/helpers/BindingExpression";
|
|
7
24
|
import { KeyHelper } from "sap/fe/core/converters/helpers/Key";
|
|
8
25
|
import { isPathDeletable } from "sap/fe/core/templating/DataModelPathHelper";
|
|
9
26
|
import ConverterContext from "../ConverterContext";
|
|
@@ -84,7 +101,7 @@ export function getDeleteButtonVisibility(
|
|
|
84
101
|
deleteHidden,
|
|
85
102
|
visitedNavigationPaths,
|
|
86
103
|
undefined,
|
|
87
|
-
(path: string) => singletonPathVisitor(path, converterContext,
|
|
104
|
+
(path: string) => singletonPathVisitor(path, converterContext, [])
|
|
88
105
|
),
|
|
89
106
|
manifestWrapper = converterContext.getManifestWrapper(),
|
|
90
107
|
viewLevel = manifestWrapper.getViewLevel(),
|
|
@@ -104,6 +121,24 @@ export function getDeleteButtonVisibility(
|
|
|
104
121
|
);
|
|
105
122
|
}
|
|
106
123
|
|
|
124
|
+
/**
|
|
125
|
+
* Method to determine the 'enabled' property binding for the Delete button on an object page.
|
|
126
|
+
*
|
|
127
|
+
* @param {PropertyAnnotationValue<boolean>|undefined} isDeletable The delete restriction configured
|
|
128
|
+
* @param {Expression<boolean>} isParentDeletable The delete restriction configured on the parent entity
|
|
129
|
+
* @returns {Expression<boolean>} The binding expression for the 'enabled' property of the Delete button
|
|
130
|
+
*/
|
|
131
|
+
export function getDeleteButtonEnabled(
|
|
132
|
+
isDeletable: PropertyAnnotationValue<Boolean> | undefined,
|
|
133
|
+
isParentDeletable: Expression<boolean>
|
|
134
|
+
): Expression<boolean> {
|
|
135
|
+
return ifElse(
|
|
136
|
+
isParentDeletable !== undefined,
|
|
137
|
+
isParentDeletable,
|
|
138
|
+
ifElse(isDeletable !== undefined, equal(isDeletable, true), constant(true))
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
107
142
|
/**
|
|
108
143
|
* Method to determine the 'visible' property binding for the Edit button on an object page.
|
|
109
144
|
*
|
|
@@ -138,10 +173,41 @@ export function getEditButtonVisibility(
|
|
|
138
173
|
notEditableExpression,
|
|
139
174
|
and(notEditableExpression, equal(updateHiddenExpression, false))
|
|
140
175
|
);
|
|
141
|
-
|
|
142
176
|
return ifElse(bIsDraftRoot, and(resultantExpression, Draft.HasNoDraftForCurrentUser), resultantExpression);
|
|
143
177
|
}
|
|
144
178
|
|
|
179
|
+
/**
|
|
180
|
+
* Method to determine the 'enabled' property binding for the Edit button on an object page.
|
|
181
|
+
*
|
|
182
|
+
* @param {ConverterContext} converterContext Instance of the converter context.
|
|
183
|
+
* @returns {Expression<boolean>} The binding expression for the 'enabled' property of the Edit button.
|
|
184
|
+
*/
|
|
185
|
+
export function getEditButtonEnabled(converterContext: ConverterContext): BindingExpression<boolean> {
|
|
186
|
+
const entitySet = converterContext.getEntitySet(),
|
|
187
|
+
isDraftRoot = entitySet && entitySet.annotations.Common?.DraftRoot ? true : false,
|
|
188
|
+
isSticky = entitySet && entitySet.annotations.Session?.StickySessionSupported ? true : false;
|
|
189
|
+
|
|
190
|
+
let editActionName: string | undefined;
|
|
191
|
+
if (isDraftRoot) {
|
|
192
|
+
editActionName = entitySet?.annotations.Common?.DraftRoot?.EditAction as string;
|
|
193
|
+
} else if (isSticky) {
|
|
194
|
+
editActionName = entitySet?.annotations.Session?.StickySessionSupported?.EditAction as string;
|
|
195
|
+
}
|
|
196
|
+
if (editActionName) {
|
|
197
|
+
const editActionAnnotationPath = converterContext.getAbsoluteAnnotationPath(editActionName as string),
|
|
198
|
+
editActions = (converterContext.getEntityTypeAnnotation(editActionAnnotationPath)?.annotation as any)?.actions;
|
|
199
|
+
if (editActions?.length) {
|
|
200
|
+
const editAction = editActions[0];
|
|
201
|
+
if (editAction?.annotations?.Core?.OperationAvailable === null) {
|
|
202
|
+
return "{= ${#" + editActionName + "} ? true : false }";
|
|
203
|
+
} else {
|
|
204
|
+
return getEnabledForAnnotationAction(converterContext, editAction);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
|
|
145
211
|
export function getHeaderDefaultActions(converterContext: ConverterContext): BaseAction[] {
|
|
146
212
|
const entitySet = converterContext.getEntitySet(),
|
|
147
213
|
entityType = converterContext.getEntityType(),
|
|
@@ -165,6 +231,7 @@ export function getHeaderDefaultActions(converterContext: ConverterContext): Bas
|
|
|
165
231
|
annotationPath: converterContext.getEntitySetBasedAnnotationPath(dataField.fullyQualifiedName),
|
|
166
232
|
key: KeyHelper.generateKeyFromDataField(dataField),
|
|
167
233
|
visible: compileBinding(not(equal(annotationExpression(dataField.annotations?.UI?.Hidden), true))),
|
|
234
|
+
enabled: getEnabledForAnnotationAction(converterContext, dataField.ActionTarget),
|
|
168
235
|
isNavigable: true
|
|
169
236
|
};
|
|
170
237
|
});
|
|
@@ -177,7 +244,8 @@ export function getHeaderDefaultActions(converterContext: ConverterContext): Bas
|
|
|
177
244
|
headerActions.push({
|
|
178
245
|
type: ActionType.Primary,
|
|
179
246
|
key: "EditAction",
|
|
180
|
-
visible: compileBinding(getEditButtonVisibility(converterContext, updateHidden))
|
|
247
|
+
visible: compileBinding(getEditButtonVisibility(converterContext, updateHidden)),
|
|
248
|
+
enabled: getEditButtonEnabled(converterContext)
|
|
181
249
|
});
|
|
182
250
|
}
|
|
183
251
|
// Then the delete action if we're not statically not deletable
|
|
@@ -192,6 +260,7 @@ export function getHeaderDefaultActions(converterContext: ConverterContext): Bas
|
|
|
192
260
|
type: ActionType.Secondary,
|
|
193
261
|
key: "DeleteAction",
|
|
194
262
|
visible: compileBinding(getDeleteButtonVisibility(converterContext, deleteHidden)),
|
|
263
|
+
enabled: compileBinding(getDeleteButtonEnabled(oEntityDeleteRestrictions?.Deletable, isParentDeletable)),
|
|
195
264
|
parentEntityDeleteEnabled: bParentEntitySetDeletable
|
|
196
265
|
});
|
|
197
266
|
}
|
|
@@ -253,6 +322,7 @@ export function getHeaderDefaultActions(converterContext: ConverterContext): Bas
|
|
|
253
322
|
annotationPath: converterContext.getEntitySetBasedAnnotationPath(dataField.fullyQualifiedName),
|
|
254
323
|
key: KeyHelper.generateKeyFromDataField(dataField),
|
|
255
324
|
visible: compileBinding(not(equal(annotationExpression(dataField.annotations?.UI?.Hidden), true))),
|
|
325
|
+
enabled: getEnabledForAnnotationAction(converterContext, dataField.ActionTarget),
|
|
256
326
|
isNavigable: true
|
|
257
327
|
} as AnnotationAction);
|
|
258
328
|
});
|
|
@@ -301,6 +371,7 @@ export function getFooterDefaultActions(viewLevel: number, converterContext: Con
|
|
|
301
371
|
annotationPath: converterContext.getEntitySetBasedAnnotationPath(dataField.fullyQualifiedName),
|
|
302
372
|
key: KeyHelper.generateKeyFromDataField(dataField),
|
|
303
373
|
visible: compileBinding(not(equal(annotationExpression(dataField.annotations?.UI?.Hidden), true))),
|
|
374
|
+
enabled: getEnabledForAnnotationAction(converterContext, dataField.ActionTarget),
|
|
304
375
|
isNavigable: true
|
|
305
376
|
};
|
|
306
377
|
});
|
|
@@ -326,6 +397,7 @@ export function getFooterDefaultActions(viewLevel: number, converterContext: Con
|
|
|
326
397
|
annotationPath: converterContext.getEntitySetBasedAnnotationPath(dataField.fullyQualifiedName),
|
|
327
398
|
key: KeyHelper.generateKeyFromDataField(dataField),
|
|
328
399
|
visible: compileBinding(not(equal(annotationExpression(dataField.annotations?.UI?.Hidden), true))),
|
|
400
|
+
enabled: getEnabledForAnnotationAction(converterContext, dataField.ActionTarget),
|
|
329
401
|
isNavigable: true
|
|
330
402
|
} as AnnotationAction);
|
|
331
403
|
});
|