@sapui5/sap.fe.core 1.95.0 → 1.96.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AnnotationHelper.js +3 -3
- package/src/sap/fe/core/AppComponent.js +7 -43
- package/src/sap/fe/core/AppStateHandler.js +18 -4
- package/src/sap/fe/core/BaseController.js +1 -1
- package/src/sap/fe/core/BusyLocker.js +13 -1
- package/src/sap/fe/core/CommonUtils.js +136 -19
- package/src/sap/fe/core/ExtensionAPI.js +1 -1
- package/src/sap/fe/core/PageController.js +1 -33
- package/src/sap/fe/core/RouterProxy.js +59 -69
- package/src/sap/fe/core/Synchronization.js +1 -1
- package/src/sap/fe/core/TemplateComponent.js +3 -3
- package/src/sap/fe/core/TemplateModel.js +1 -1
- package/src/sap/fe/core/TransactionHelper.js +87 -6
- package/src/sap/fe/core/actions/draft.js +1 -1
- package/src/sap/fe/core/actions/messageHandling.js +1 -1
- package/src/sap/fe/core/actions/nonDraft.js +1 -1
- package/src/sap/fe/core/actions/operations.js +22 -3
- package/src/sap/fe/core/actions/sticky.js +1 -1
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +74 -48
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +5 -4
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +64 -28
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +194 -223
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +460 -207
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +475 -213
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +1 -1
- package/src/sap/fe/core/controllerextensions/PageReady.js +1 -1
- package/src/sap/fe/core/controllerextensions/PageReady.ts +3 -7
- package/src/sap/fe/core/controllerextensions/Paginator.js +4 -5
- package/src/sap/fe/core/controllerextensions/Placeholder.js +11 -17
- package/src/sap/fe/core/controllerextensions/Routing.js +1 -1
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +20 -7
- package/src/sap/fe/core/controllerextensions/SideEffects.js +2 -3
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +13 -12
- package/src/sap/fe/core/controllerextensions/ViewState.js +21 -3
- 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/CommandExecution.js +1 -1
- package/src/sap/fe/core/controls/ConditionalWrapper.js +1 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +4 -1
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +1 -1
- package/src/sap/fe/core/controls/FieldWrapper.js +1 -1
- package/src/sap/fe/core/controls/FilterBar.js +1 -1
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +45 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +1 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
- package/src/sap/fe/core/converters/MetaModelConverter.js +852 -881
- package/src/sap/fe/core/converters/MetaModelConverter.ts +761 -849
- package/src/sap/fe/core/converters/annotations/DataField.js +52 -2
- package/src/sap/fe/core/converters/annotations/DataField.ts +52 -2
- package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +0 -2
- package/src/sap/fe/core/converters/controls/Common/Form.js +16 -8
- package/src/sap/fe/core/converters/controls/Common/Form.ts +9 -3
- package/src/sap/fe/core/converters/controls/Common/KPI.js +271 -253
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +287 -291
- package/src/sap/fe/core/converters/controls/Common/Table.js +196 -102
- package/src/sap/fe/core/converters/controls/Common/Table.ts +240 -109
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +15 -7
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +27 -6
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +2 -2
- package/src/sap/fe/core/converters/helpers/ID.js +1 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +2 -2
- package/src/sap/fe/core/converters/helpers/IssueManager.js +4 -5
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +3 -4
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +2 -2
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +1 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +20 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +25 -1
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +2 -5
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +1 -2
- package/src/sap/fe/core/designtime/AppComponent.designtime.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/fpm/Component.js +2 -2
- package/src/sap/fe/core/helpers/BindingExpression.js +34 -2
- package/src/sap/fe/core/helpers/BindingExpression.ts +24 -1
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -1
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -3
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.js +13 -1
- package/src/sap/fe/core/helpers/PasteHelper.js +7 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.js +2 -2
- package/src/sap/fe/core/helpers/StableIdHelper.ts +1 -1
- package/src/sap/fe/core/library.js +2 -2
- package/src/sap/fe/core/library.support.js +1 -1
- package/src/sap/fe/core/messagebundle.properties +18 -3
- package/src/sap/fe/core/messagebundle_ar.properties +8 -3
- package/src/sap/fe/core/messagebundle_bg.properties +8 -3
- package/src/sap/fe/core/messagebundle_ca.properties +9 -4
- package/src/sap/fe/core/messagebundle_cs.properties +8 -3
- package/src/sap/fe/core/messagebundle_cy.properties +8 -3
- package/src/sap/fe/core/messagebundle_da.properties +8 -3
- package/src/sap/fe/core/messagebundle_de.properties +8 -3
- package/src/sap/fe/core/messagebundle_el.properties +8 -3
- package/src/sap/fe/core/messagebundle_en.properties +5 -0
- package/src/sap/fe/core/messagebundle_en_GB.properties +5 -0
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +5 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +20 -2
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +12 -0
- package/src/sap/fe/core/messagebundle_es.properties +8 -3
- package/src/sap/fe/core/messagebundle_es_MX.properties +9 -4
- package/src/sap/fe/core/messagebundle_et.properties +8 -3
- package/src/sap/fe/core/messagebundle_fi.properties +8 -3
- package/src/sap/fe/core/messagebundle_fr.properties +8 -3
- package/src/sap/fe/core/messagebundle_fr_CA.properties +8 -3
- package/src/sap/fe/core/messagebundle_hi.properties +8 -3
- package/src/sap/fe/core/messagebundle_hr.properties +8 -3
- package/src/sap/fe/core/messagebundle_hu.properties +8 -3
- package/src/sap/fe/core/messagebundle_id.properties +7 -2
- package/src/sap/fe/core/messagebundle_it.properties +8 -3
- package/src/sap/fe/core/messagebundle_iw.properties +8 -3
- package/src/sap/fe/core/messagebundle_ja.properties +8 -3
- package/src/sap/fe/core/messagebundle_kk.properties +8 -3
- package/src/sap/fe/core/messagebundle_ko.properties +8 -3
- package/src/sap/fe/core/messagebundle_lt.properties +8 -3
- package/src/sap/fe/core/messagebundle_lv.properties +8 -3
- package/src/sap/fe/core/messagebundle_ms.properties +8 -3
- package/src/sap/fe/core/messagebundle_nl.properties +8 -3
- package/src/sap/fe/core/messagebundle_no.properties +8 -3
- package/src/sap/fe/core/messagebundle_pl.properties +8 -3
- package/src/sap/fe/core/messagebundle_pt.properties +8 -3
- package/src/sap/fe/core/messagebundle_pt_PT.properties +8 -3
- package/src/sap/fe/core/messagebundle_ro.properties +8 -3
- package/src/sap/fe/core/messagebundle_ru.properties +8 -3
- package/src/sap/fe/core/messagebundle_sh.properties +8 -3
- package/src/sap/fe/core/messagebundle_sk.properties +8 -3
- package/src/sap/fe/core/messagebundle_sl.properties +8 -3
- package/src/sap/fe/core/messagebundle_sv.properties +8 -3
- package/src/sap/fe/core/messagebundle_th.properties +8 -3
- package/src/sap/fe/core/messagebundle_tr.properties +8 -3
- package/src/sap/fe/core/messagebundle_uk.properties +8 -3
- package/src/sap/fe/core/messagebundle_vi.properties +8 -3
- package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -3
- package/src/sap/fe/core/messagebundle_zh_TW.properties +8 -3
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js +70 -33
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +2 -2
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.js +3 -14
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +3 -10
- package/src/sap/fe/core/templating/EntitySetHelper.js +13 -3
- package/src/sap/fe/core/templating/EntitySetHelper.ts +4 -0
- package/src/sap/fe/core/templating/UIFormatters.js +39 -1
- package/src/sap/fe/core/templating/UIFormatters.ts +73 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerextensions/ControllerExtensionMetadata", "../helpers/ClassSupport", "sap/ui/model/json/JSONModel", "sap/base/Log", "sap/fe/core/
|
|
5
|
+
sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerextensions/ControllerExtensionMetadata", "../helpers/ClassSupport", "sap/ui/model/json/JSONModel", "sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sap/ui/core/format/NumberFormat", "sap/ui/core/format/DateFormat", "sap/ui/core/Locale", "sap/ui/model/Filter", "sap/ui/model/Sorter", "sap/m/Popover"], function (ControllerExtension, ControllerExtensionMetadata, ClassSupport, JSONModel, Log, TableFormatterTypes, NumberFormat, DateFormat, Locale, Filter, Sorter, Popover) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _dec, _dec2, _dec3, _class, _class2;
|
|
@@ -34,51 +34,27 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
34
34
|
|
|
35
35
|
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
36
36
|
|
|
37
|
+
var MessageTypeFromCriticality = {
|
|
38
|
+
"1": MessageType.Error,
|
|
39
|
+
"2": MessageType.Warning,
|
|
40
|
+
"3": MessageType.Success,
|
|
41
|
+
"5": MessageType.Information
|
|
42
|
+
};
|
|
43
|
+
var ValueColorFromMessageType = {
|
|
44
|
+
Error: "Error",
|
|
45
|
+
Warning: "Critical",
|
|
46
|
+
Success: "Good",
|
|
47
|
+
Information: "None",
|
|
48
|
+
None: "None"
|
|
49
|
+
};
|
|
37
50
|
/**
|
|
38
|
-
* Function to
|
|
39
|
-
*
|
|
40
|
-
* @param {number|string} criticalityValue The criticality values.
|
|
41
|
-
* @returns {MessageType} Returns the corresponding MessageType
|
|
42
|
-
*/
|
|
43
|
-
function messageTypeFromCriticality(criticalityValue) {
|
|
44
|
-
var criticalityProperty;
|
|
45
|
-
|
|
46
|
-
switch (criticalityValue) {
|
|
47
|
-
case 1:
|
|
48
|
-
case "1":
|
|
49
|
-
criticalityProperty = MessageType.Error;
|
|
50
|
-
break;
|
|
51
|
-
|
|
52
|
-
case 2:
|
|
53
|
-
case "2":
|
|
54
|
-
criticalityProperty = MessageType.Warning;
|
|
55
|
-
break;
|
|
56
|
-
|
|
57
|
-
case 3:
|
|
58
|
-
case "3":
|
|
59
|
-
criticalityProperty = MessageType.Success;
|
|
60
|
-
break;
|
|
61
|
-
|
|
62
|
-
case 5:
|
|
63
|
-
case "5":
|
|
64
|
-
criticalityProperty = MessageType.Information;
|
|
65
|
-
break;
|
|
66
|
-
|
|
67
|
-
default:
|
|
68
|
-
criticalityProperty = MessageType.None;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return criticalityProperty;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Function to calculate the message state for a criticality calculation of type 'Target'.
|
|
51
|
+
* Function to get a message state from a calculated criticality of type 'Target'.
|
|
75
52
|
*
|
|
76
53
|
* @param {number} kpiValue The value of the KPI to be tested against.
|
|
77
54
|
* @param {number[]} aThresholds Thresholds to be used [DeviationRangeLowValue,ToleranceRangeLowValue,AcceptanceRangeLowValue,AcceptanceRangeHighValue,ToleranceRangeHighValue,DeviationRangeHighValue].
|
|
78
55
|
* @returns {MessageType} Returns the corresponding MessageType
|
|
79
56
|
*/
|
|
80
57
|
|
|
81
|
-
|
|
82
58
|
function messageTypeFromTargetCalculation(kpiValue, aThresholds) {
|
|
83
59
|
var criticalityProperty;
|
|
84
60
|
|
|
@@ -101,7 +77,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
101
77
|
return criticalityProperty;
|
|
102
78
|
}
|
|
103
79
|
/**
|
|
104
|
-
* Function to
|
|
80
|
+
* Function to get a message state from a calculated criticality of type 'Minimize'.
|
|
105
81
|
*
|
|
106
82
|
* @param {number} kpiValue The value of the KPI to be tested against.
|
|
107
83
|
* @param {number[]} aThresholds Thresholds to be used [AcceptanceRangeHighValue,ToleranceRangeHighValue,DeviationRangeHighValue].
|
|
@@ -125,30 +101,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
125
101
|
return criticalityProperty;
|
|
126
102
|
}
|
|
127
103
|
/**
|
|
128
|
-
* Function to
|
|
129
|
-
*
|
|
130
|
-
* @param messageType The message type
|
|
131
|
-
* @returns The ValueColor
|
|
132
|
-
*/
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
function valueColorFromMessageType(messageType) {
|
|
136
|
-
switch (messageType) {
|
|
137
|
-
case MessageType.Error:
|
|
138
|
-
return "Error";
|
|
139
|
-
|
|
140
|
-
case MessageType.Warning:
|
|
141
|
-
return "Critical";
|
|
142
|
-
|
|
143
|
-
case MessageType.Success:
|
|
144
|
-
return "Good";
|
|
145
|
-
|
|
146
|
-
default:
|
|
147
|
-
return "None";
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Function to calculate the message state for a criticality calculation of type 'Maximize'.
|
|
104
|
+
* Function to get a message state from a calculated criticality of type 'Maximize'.
|
|
152
105
|
*
|
|
153
106
|
* @param {number} kpiValue The value of the KPI to be tested against.
|
|
154
107
|
* @param {number[]} aThresholds Thresholds to be used [DeviationRangeLowValue,ToleranceRangeLowValue,AcceptanceRangeLowValue].
|
|
@@ -323,8 +276,259 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
323
276
|
return "(" + filterDefinition.ranges.map(formatRange).join(",") + ")";
|
|
324
277
|
}
|
|
325
278
|
}
|
|
279
|
+
|
|
280
|
+
function formatChartTitle(kpiDef) {
|
|
281
|
+
var resBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
|
|
282
|
+
|
|
283
|
+
function formatList(items) {
|
|
284
|
+
if (items.length === 0) {
|
|
285
|
+
return "";
|
|
286
|
+
} else if (items.length === 1) {
|
|
287
|
+
return items[0].label;
|
|
288
|
+
} else {
|
|
289
|
+
var res = items[0].label;
|
|
290
|
+
|
|
291
|
+
for (var I = 1; I < items.length - 1; I++) {
|
|
292
|
+
res += ", " + items[I].label;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return resBundle.getText("C_KPICARD_ITEMSLIST", [res, items[items.length - 1].label]);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return resBundle.getText("C_KPICARD_CHARTTITLE", [formatList(kpiDef.chart.measures), formatList(kpiDef.chart.dimensions)]);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
function updateChartLabelSettings(chartDefinition, oChartProperties) {
|
|
303
|
+
switch (chartDefinition.chartType) {
|
|
304
|
+
case "Donut":
|
|
305
|
+
// Show data labels, do not show axis titles
|
|
306
|
+
oChartProperties.categoryAxis = {
|
|
307
|
+
title: {
|
|
308
|
+
visible: false
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
oChartProperties.valueAxis = {
|
|
312
|
+
title: {
|
|
313
|
+
visible: false
|
|
314
|
+
},
|
|
315
|
+
label: {
|
|
316
|
+
formatString: "ShortFloat"
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
oChartProperties.plotArea.dataLabel = {
|
|
320
|
+
visible: true,
|
|
321
|
+
type: "value",
|
|
322
|
+
formatString: "ShortFloat_MFD2"
|
|
323
|
+
};
|
|
324
|
+
break;
|
|
325
|
+
|
|
326
|
+
case "bubble":
|
|
327
|
+
// Show axis title, bubble size legend, do not show data labels
|
|
328
|
+
oChartProperties.valueAxis = {
|
|
329
|
+
title: {
|
|
330
|
+
visible: true
|
|
331
|
+
},
|
|
332
|
+
label: {
|
|
333
|
+
formatString: "ShortFloat"
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
oChartProperties.valueAxis2 = {
|
|
337
|
+
title: {
|
|
338
|
+
visible: true
|
|
339
|
+
},
|
|
340
|
+
label: {
|
|
341
|
+
formatString: "ShortFloat"
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
oChartProperties.legendGroup = {
|
|
345
|
+
layout: {
|
|
346
|
+
position: "bottom",
|
|
347
|
+
alignment: "topLeft"
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
oChartProperties.sizeLegend = {
|
|
351
|
+
visible: true
|
|
352
|
+
};
|
|
353
|
+
oChartProperties.plotArea.dataLabel = {
|
|
354
|
+
visible: false
|
|
355
|
+
};
|
|
356
|
+
break;
|
|
357
|
+
|
|
358
|
+
case "scatter":
|
|
359
|
+
// Do not show data labels and axis titles
|
|
360
|
+
oChartProperties.valueAxis = {
|
|
361
|
+
title: {
|
|
362
|
+
visible: false
|
|
363
|
+
},
|
|
364
|
+
label: {
|
|
365
|
+
formatString: "ShortFloat"
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
oChartProperties.valueAxis2 = {
|
|
369
|
+
title: {
|
|
370
|
+
visible: false
|
|
371
|
+
},
|
|
372
|
+
label: {
|
|
373
|
+
formatString: "ShortFloat"
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
oChartProperties.plotArea.dataLabel = {
|
|
377
|
+
visible: false
|
|
378
|
+
};
|
|
379
|
+
break;
|
|
380
|
+
|
|
381
|
+
default:
|
|
382
|
+
// Do not show data labels and axis titles
|
|
383
|
+
oChartProperties.categoryAxis = {
|
|
384
|
+
title: {
|
|
385
|
+
visible: false
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
oChartProperties.valueAxis = {
|
|
389
|
+
title: {
|
|
390
|
+
visible: false
|
|
391
|
+
},
|
|
392
|
+
label: {
|
|
393
|
+
formatString: "ShortFloat"
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
oChartProperties.plotArea.dataLabel = {
|
|
397
|
+
visible: false
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
function filterMap(aObjects, aRoles) {
|
|
403
|
+
if (aRoles && aRoles.length) {
|
|
404
|
+
return aObjects.filter(function (dimension) {
|
|
405
|
+
return aRoles.indexOf(dimension.role) >= 0;
|
|
406
|
+
}).map(function (dimension) {
|
|
407
|
+
return dimension.label;
|
|
408
|
+
});
|
|
409
|
+
} else {
|
|
410
|
+
return aObjects.map(function (dimension) {
|
|
411
|
+
return dimension.label;
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
function getScatterBubbleChartFeeds(chartDefinition) {
|
|
417
|
+
var axis1Measures = filterMap(chartDefinition.measures, ["Axis1"]);
|
|
418
|
+
var axis2Measures = filterMap(chartDefinition.measures, ["Axis2"]);
|
|
419
|
+
var axis3Measures = filterMap(chartDefinition.measures, ["Axis3"]);
|
|
420
|
+
var otherMeasures = filterMap(chartDefinition.measures, [undefined]);
|
|
421
|
+
var seriesDimensions = filterMap(chartDefinition.dimensions, ["Series"]); // Get the first dimension with role "Category" for the shape
|
|
422
|
+
|
|
423
|
+
var shapeDimension = chartDefinition.dimensions.find(function (dimension) {
|
|
424
|
+
return dimension.role === "Category";
|
|
425
|
+
}); // Measure for the x-Axis : first measure for Axis1, or for Axis2 if not found, or for Axis3 if not found
|
|
426
|
+
|
|
427
|
+
var xMeasure = axis1Measures.shift() || axis2Measures.shift() || axis3Measures.shift() || otherMeasures.shift() || ""; // Measure for the y-Axis : first measure for Axis2, or second measure for Axis1 if not found, or first measure for Axis3 if not found
|
|
428
|
+
|
|
429
|
+
var yMeasure = axis2Measures.shift() || axis1Measures.shift() || axis3Measures.shift() || otherMeasures.shift() || "";
|
|
430
|
+
var res = [{
|
|
431
|
+
"uid": "valueAxis",
|
|
432
|
+
"type": "Measure",
|
|
433
|
+
"values": [xMeasure]
|
|
434
|
+
}, {
|
|
435
|
+
"uid": "valueAxis2",
|
|
436
|
+
"type": "Measure",
|
|
437
|
+
"values": [yMeasure]
|
|
438
|
+
}];
|
|
439
|
+
|
|
440
|
+
if (chartDefinition.chartType === "bubble") {
|
|
441
|
+
// Measure for the size of the bubble: first measure for Axis3, or remaining measure for Axis1/Axis2 if not found
|
|
442
|
+
var sizeMeasure = axis3Measures.shift() || axis1Measures.shift() || axis2Measures.shift() || otherMeasures.shift() || "";
|
|
443
|
+
res.push({
|
|
444
|
+
"uid": "bubbleWidth",
|
|
445
|
+
"type": "Measure",
|
|
446
|
+
"values": [sizeMeasure]
|
|
447
|
+
});
|
|
448
|
+
} // Color (optional)
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
if (seriesDimensions.length) {
|
|
452
|
+
res.push({
|
|
453
|
+
"uid": "color",
|
|
454
|
+
"type": "Dimension",
|
|
455
|
+
"values": seriesDimensions
|
|
456
|
+
});
|
|
457
|
+
} // Shape (optional)
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
if (shapeDimension) {
|
|
461
|
+
res.push({
|
|
462
|
+
"uid": "shape",
|
|
463
|
+
"type": "Dimension",
|
|
464
|
+
"values": [shapeDimension.label]
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
return res;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
function getChartFeeds(chartDefinition) {
|
|
472
|
+
var res;
|
|
473
|
+
|
|
474
|
+
switch (chartDefinition.chartType) {
|
|
475
|
+
case "Donut":
|
|
476
|
+
res = [{
|
|
477
|
+
"uid": "size",
|
|
478
|
+
"type": "Measure",
|
|
479
|
+
"values": filterMap(chartDefinition.measures)
|
|
480
|
+
}, {
|
|
481
|
+
"uid": "color",
|
|
482
|
+
"type": "Dimension",
|
|
483
|
+
"values": filterMap(chartDefinition.dimensions)
|
|
484
|
+
}];
|
|
485
|
+
break;
|
|
486
|
+
|
|
487
|
+
case "bubble":
|
|
488
|
+
case "scatter":
|
|
489
|
+
res = getScatterBubbleChartFeeds(chartDefinition);
|
|
490
|
+
break;
|
|
491
|
+
|
|
492
|
+
case "vertical_bullet":
|
|
493
|
+
res = [{
|
|
494
|
+
"uid": "actualValues",
|
|
495
|
+
"type": "Measure",
|
|
496
|
+
"values": filterMap(chartDefinition.measures, [undefined, "Axis1"])
|
|
497
|
+
}, {
|
|
498
|
+
"uid": "targetValues",
|
|
499
|
+
"type": "Measure",
|
|
500
|
+
"values": filterMap(chartDefinition.measures, ["Axis2"])
|
|
501
|
+
}, {
|
|
502
|
+
"uid": "categoryAxis",
|
|
503
|
+
"type": "Dimension",
|
|
504
|
+
"values": filterMap(chartDefinition.dimensions, [undefined, "Category"])
|
|
505
|
+
}, {
|
|
506
|
+
"uid": "color",
|
|
507
|
+
"type": "Dimension",
|
|
508
|
+
"values": filterMap(chartDefinition.dimensions, ["Series"])
|
|
509
|
+
}];
|
|
510
|
+
break;
|
|
511
|
+
|
|
512
|
+
default:
|
|
513
|
+
res = [{
|
|
514
|
+
"uid": "valueAxis",
|
|
515
|
+
"type": "Measure",
|
|
516
|
+
"values": filterMap(chartDefinition.measures)
|
|
517
|
+
}, {
|
|
518
|
+
"uid": "categoryAxis",
|
|
519
|
+
"type": "Dimension",
|
|
520
|
+
"values": filterMap(chartDefinition.dimensions, [undefined, "Category"])
|
|
521
|
+
}, {
|
|
522
|
+
"uid": "color",
|
|
523
|
+
"type": "Dimension",
|
|
524
|
+
"values": filterMap(chartDefinition.dimensions, ["Series"])
|
|
525
|
+
}];
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
return res;
|
|
529
|
+
}
|
|
326
530
|
/**
|
|
327
|
-
* @class A controller extension for managing
|
|
531
|
+
* @class A controller extension for managing the KPIs in an analytical list page
|
|
328
532
|
*
|
|
329
533
|
* @name sap.fe.core.controllerextensions.KPIManagement
|
|
330
534
|
* @hideconstructor
|
|
@@ -346,6 +550,109 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
346
550
|
}
|
|
347
551
|
|
|
348
552
|
_createClass(KPIManagementControllerExtension, [{
|
|
553
|
+
key: "initCardManifest",
|
|
554
|
+
value:
|
|
555
|
+
/**
|
|
556
|
+
* Creates the card manifest for a KPI definition and stores it in a JSON model.
|
|
557
|
+
*
|
|
558
|
+
* @param kpiDefinition The KPI definition
|
|
559
|
+
* @param oKPIModel The JSON model in which the manifest will be stored
|
|
560
|
+
*/
|
|
561
|
+
function initCardManifest(kpiDefinition, oKPIModel) {
|
|
562
|
+
var _kpiDefinition$select;
|
|
563
|
+
|
|
564
|
+
var oCardManifest = {
|
|
565
|
+
"sap.app": {
|
|
566
|
+
id: "sap.fe",
|
|
567
|
+
type: "card"
|
|
568
|
+
},
|
|
569
|
+
"sap.ui": {
|
|
570
|
+
technology: "UI5"
|
|
571
|
+
},
|
|
572
|
+
"sap.card": {
|
|
573
|
+
type: "Analytical",
|
|
574
|
+
data: {
|
|
575
|
+
json: {}
|
|
576
|
+
},
|
|
577
|
+
header: {
|
|
578
|
+
type: "Numeric",
|
|
579
|
+
title: kpiDefinition.datapoint.title,
|
|
580
|
+
subTitle: kpiDefinition.datapoint.description,
|
|
581
|
+
unitOfMeasurement: "{mainUnit}",
|
|
582
|
+
mainIndicator: {
|
|
583
|
+
number: "{mainValueNoScale}",
|
|
584
|
+
unit: "{mainValueScale}",
|
|
585
|
+
state: "{mainState}",
|
|
586
|
+
trend: "{trend}"
|
|
587
|
+
}
|
|
588
|
+
},
|
|
589
|
+
content: {
|
|
590
|
+
minHeight: "25rem",
|
|
591
|
+
chartProperties: {
|
|
592
|
+
plotArea: {},
|
|
593
|
+
title: {
|
|
594
|
+
visible: true,
|
|
595
|
+
alignment: "left"
|
|
596
|
+
}
|
|
597
|
+
},
|
|
598
|
+
data: {
|
|
599
|
+
path: "/chartData"
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}; // Add side indicators in the card header if a target is defined for the KPI
|
|
604
|
+
|
|
605
|
+
if (kpiDefinition.datapoint.targetPath || kpiDefinition.datapoint.targetValue !== undefined) {
|
|
606
|
+
var resBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
|
|
607
|
+
oCardManifest["sap.card"].header.sideIndicators = [{
|
|
608
|
+
title: resBundle.getText("C_KPICARD_INDICATOR_TARGET"),
|
|
609
|
+
number: "{targetNumber}",
|
|
610
|
+
unit: "{targetUnit}"
|
|
611
|
+
}, {
|
|
612
|
+
title: resBundle.getText("C_KPICARD_INDICATOR_DEVIATION"),
|
|
613
|
+
number: "{deviationNumber}",
|
|
614
|
+
unit: "%"
|
|
615
|
+
}];
|
|
616
|
+
} // Details of the card: filter descriptions
|
|
617
|
+
|
|
618
|
+
|
|
619
|
+
if ((_kpiDefinition$select = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select !== void 0 && _kpiDefinition$select.length) {
|
|
620
|
+
var aDescriptions = [];
|
|
621
|
+
kpiDefinition.selectionVariantFilterDefinitions.forEach(function (filterDefinition) {
|
|
622
|
+
var desc = getFilterStringFromDefinition(filterDefinition);
|
|
623
|
+
|
|
624
|
+
if (desc) {
|
|
625
|
+
aDescriptions.push(desc);
|
|
626
|
+
}
|
|
627
|
+
});
|
|
628
|
+
|
|
629
|
+
if (aDescriptions.length) {
|
|
630
|
+
oCardManifest["sap.card"].header.details = aDescriptions.join(", ");
|
|
631
|
+
}
|
|
632
|
+
} // Chart settings: type, title, dimensions and measures in the manifest
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
oCardManifest["sap.card"].content.chartType = kpiDefinition.chart.chartType;
|
|
636
|
+
updateChartLabelSettings(kpiDefinition.chart, oCardManifest["sap.card"].content.chartProperties);
|
|
637
|
+
oCardManifest["sap.card"].content.chartProperties.title.text = formatChartTitle(kpiDefinition);
|
|
638
|
+
oCardManifest["sap.card"].content.dimensions = kpiDefinition.chart.dimensions.map(function (dimension) {
|
|
639
|
+
return {
|
|
640
|
+
label: dimension.label,
|
|
641
|
+
value: "{" + dimension.name + "}"
|
|
642
|
+
};
|
|
643
|
+
});
|
|
644
|
+
oCardManifest["sap.card"].content.measures = kpiDefinition.chart.measures.map(function (measure) {
|
|
645
|
+
return {
|
|
646
|
+
label: measure.label,
|
|
647
|
+
value: "{" + measure.name + "}"
|
|
648
|
+
};
|
|
649
|
+
});
|
|
650
|
+
oCardManifest["sap.card"].content.feeds = getChartFeeds(kpiDefinition.chart);
|
|
651
|
+
oKPIModel.setProperty("/" + kpiDefinition.id, {
|
|
652
|
+
manifest: oCardManifest
|
|
653
|
+
});
|
|
654
|
+
}
|
|
655
|
+
}, {
|
|
349
656
|
key: "onInit",
|
|
350
657
|
value: function onInit() {
|
|
351
658
|
var _this = this;
|
|
@@ -354,101 +661,16 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
354
661
|
|
|
355
662
|
if (this.aKPIDefinitions && this.aKPIDefinitions.length) {
|
|
356
663
|
var oView = this.getView();
|
|
357
|
-
|
|
664
|
+
var oAppComponent = oView.getController().getAppComponent(); // Create a JSON model to store KPI data
|
|
358
665
|
|
|
359
666
|
var oKPIModel = new JSONModel();
|
|
360
667
|
oView.setModel(oKPIModel, "kpiModel");
|
|
361
668
|
this.aKPIDefinitions.forEach(function (kpiDefinition) {
|
|
362
|
-
var _kpiDefinition$select;
|
|
363
|
-
|
|
364
669
|
// Create the manifest for the KPI card and store it in the KPI model
|
|
365
|
-
|
|
366
|
-
"sap.app": {
|
|
367
|
-
id: "sap.fe",
|
|
368
|
-
type: "card"
|
|
369
|
-
},
|
|
370
|
-
"sap.ui": {
|
|
371
|
-
technology: "UI5"
|
|
372
|
-
},
|
|
373
|
-
"sap.card": {
|
|
374
|
-
type: "Analytical",
|
|
375
|
-
data: {
|
|
376
|
-
json: {}
|
|
377
|
-
},
|
|
378
|
-
header: {
|
|
379
|
-
type: "Numeric",
|
|
380
|
-
title: kpiDefinition.datapoint.title,
|
|
381
|
-
subTitle: kpiDefinition.datapoint.description,
|
|
382
|
-
unitOfMeasurement: "{mainUnit}",
|
|
383
|
-
mainIndicator: {
|
|
384
|
-
number: "{mainValueNoScale}",
|
|
385
|
-
unit: "{mainValueScale}",
|
|
386
|
-
state: "{mainState}",
|
|
387
|
-
trend: "{trend}"
|
|
388
|
-
}
|
|
389
|
-
},
|
|
390
|
-
content: {
|
|
391
|
-
plotArea: {
|
|
392
|
-
"dataLabel": {
|
|
393
|
-
"visible": false
|
|
394
|
-
},
|
|
395
|
-
"categoryAxisText": {
|
|
396
|
-
"visible": false
|
|
397
|
-
},
|
|
398
|
-
"valueAxisText": {
|
|
399
|
-
"visible": false
|
|
400
|
-
}
|
|
401
|
-
},
|
|
402
|
-
title: {
|
|
403
|
-
text: "{chartTitle}",
|
|
404
|
-
visible: true,
|
|
405
|
-
alignment: "Left"
|
|
406
|
-
},
|
|
407
|
-
measureAxis: "valueAxis",
|
|
408
|
-
dimensionAxis: "categoryAxis",
|
|
409
|
-
data: {
|
|
410
|
-
path: "/chartData"
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
}; // Add side indicators in the card header if a target is defined for the KPI
|
|
415
|
-
|
|
416
|
-
if (kpiDefinition.datapoint.targetPath || kpiDefinition.datapoint.targetValue !== undefined) {
|
|
417
|
-
var resBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
|
|
418
|
-
oCardManifest["sap.card"].header.sideIndicators = [{
|
|
419
|
-
title: resBundle.getText("C_KPICARD_INDICATOR_TARGET"),
|
|
420
|
-
number: "{targetNumber}",
|
|
421
|
-
unit: "{targetUnit}"
|
|
422
|
-
}, {
|
|
423
|
-
title: resBundle.getText("C_KPICARD_INDICATOR_DEVIATION"),
|
|
424
|
-
number: "{deviationNumber}",
|
|
425
|
-
unit: "%"
|
|
426
|
-
}];
|
|
427
|
-
} // Details of the card: filter descriptions
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
if ((_kpiDefinition$select = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select !== void 0 && _kpiDefinition$select.length) {
|
|
431
|
-
var aDescriptions = [];
|
|
432
|
-
kpiDefinition.selectionVariantFilterDefinitions.forEach(function (filterDefinition) {
|
|
433
|
-
var desc = getFilterStringFromDefinition(filterDefinition);
|
|
434
|
-
|
|
435
|
-
if (desc) {
|
|
436
|
-
aDescriptions.push(desc);
|
|
437
|
-
}
|
|
438
|
-
});
|
|
439
|
-
|
|
440
|
-
if (aDescriptions.length) {
|
|
441
|
-
oCardManifest["sap.card"].header.details = aDescriptions.join(", ");
|
|
442
|
-
}
|
|
443
|
-
} // Update card content in the manifest
|
|
444
|
-
|
|
670
|
+
_this.initCardManifest(kpiDefinition, oKPIModel); // Load tag data for the KPI
|
|
445
671
|
|
|
446
|
-
oCardManifest["sap.card"].content = Object.assign(oCardManifest["sap.card"].content, kpiDefinition.card.cardContentManifest);
|
|
447
|
-
oKPIModel.setProperty("/" + kpiDefinition.id, {
|
|
448
|
-
manifest: oCardManifest
|
|
449
|
-
}); // Load tag data for the KPI
|
|
450
672
|
|
|
451
|
-
_this.loadKPITagData(kpiDefinition).catch(function (err) {
|
|
673
|
+
_this.loadKPITagData(kpiDefinition, oAppComponent.getModel(), oKPIModel).catch(function (err) {
|
|
452
674
|
Log.error(err);
|
|
453
675
|
});
|
|
454
676
|
});
|
|
@@ -483,13 +705,12 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
483
705
|
}
|
|
484
706
|
}, {
|
|
485
707
|
key: "updateDatapointValueAndCurrency",
|
|
486
|
-
value: function updateDatapointValueAndCurrency(kpiDefinition, kpiContext) {
|
|
708
|
+
value: function updateDatapointValueAndCurrency(kpiDefinition, kpiContext, oKPIModel) {
|
|
487
709
|
var _kpiDefinition$datapo, _kpiDefinition$datapo2, _kpiDefinition$datapo3;
|
|
488
710
|
|
|
489
711
|
var currentLocale = new Locale(sap.ui.getCore().getConfiguration().getLanguage());
|
|
490
712
|
var rawUnit = (_kpiDefinition$datapo = kpiDefinition.datapoint.unit) !== null && _kpiDefinition$datapo !== void 0 && _kpiDefinition$datapo.isPath ? kpiContext.getProperty(kpiDefinition.datapoint.unit.value) : (_kpiDefinition$datapo2 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo2 === void 0 ? void 0 : _kpiDefinition$datapo2.value;
|
|
491
|
-
var isPercentage = ((_kpiDefinition$datapo3 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo3 === void 0 ? void 0 : _kpiDefinition$datapo3.isCurrency) === false && rawUnit === "%";
|
|
492
|
-
var oKPIModel = this.getView().getModel("kpiModel"); // /////////////////////
|
|
713
|
+
var isPercentage = ((_kpiDefinition$datapo3 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo3 === void 0 ? void 0 : _kpiDefinition$datapo3.isCurrency) === false && rawUnit === "%"; // /////////////////////
|
|
493
714
|
// Main KPI value
|
|
494
715
|
|
|
495
716
|
var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath)); // Value formatted with a scale
|
|
@@ -540,9 +761,8 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
540
761
|
}
|
|
541
762
|
}, {
|
|
542
763
|
key: "updateDatapointCriticality",
|
|
543
|
-
value: function updateDatapointCriticality(kpiDefinition, kpiContext) {
|
|
764
|
+
value: function updateDatapointCriticality(kpiDefinition, kpiContext, oKPIModel) {
|
|
544
765
|
var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath));
|
|
545
|
-
var oKPIModel = this.getView().getModel("kpiModel");
|
|
546
766
|
var criticalityValue = MessageType.None;
|
|
547
767
|
|
|
548
768
|
if (kpiDefinition.datapoint.criticalityValue) {
|
|
@@ -550,7 +770,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
550
770
|
criticalityValue = kpiDefinition.datapoint.criticalityValue;
|
|
551
771
|
} else if (kpiDefinition.datapoint.criticalityPath) {
|
|
552
772
|
// Criticality comes from another property (via a path)
|
|
553
|
-
criticalityValue =
|
|
773
|
+
criticalityValue = MessageTypeFromCriticality[kpiContext.getProperty(kpiDefinition.datapoint.criticalityPath)] || MessageType.None;
|
|
554
774
|
} else if (kpiDefinition.datapoint.criticalityCalculationThresholds && kpiDefinition.datapoint.criticalityCalculationMode) {
|
|
555
775
|
// Criticality calculation
|
|
556
776
|
switch (kpiDefinition.datapoint.criticalityCalculationMode) {
|
|
@@ -570,13 +790,12 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
570
790
|
}
|
|
571
791
|
|
|
572
792
|
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", criticalityValue);
|
|
573
|
-
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainState",
|
|
793
|
+
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainState", ValueColorFromMessageType[criticalityValue] || "None");
|
|
574
794
|
}
|
|
575
795
|
}, {
|
|
576
796
|
key: "updateDatapointTrend",
|
|
577
|
-
value: function updateDatapointTrend(kpiDefinition, kpiContext) {
|
|
797
|
+
value: function updateDatapointTrend(kpiDefinition, kpiContext, oKPIModel) {
|
|
578
798
|
var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath));
|
|
579
|
-
var oKPIModel = this.getView().getModel("kpiModel");
|
|
580
799
|
var trendValue = "None";
|
|
581
800
|
|
|
582
801
|
if (kpiDefinition.datapoint.trendValue) {
|
|
@@ -602,13 +821,12 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
602
821
|
}
|
|
603
822
|
}, {
|
|
604
823
|
key: "updateTargetValue",
|
|
605
|
-
value: function updateTargetValue(kpiDefinition, kpiContext) {
|
|
824
|
+
value: function updateTargetValue(kpiDefinition, kpiContext, oKPIModel) {
|
|
606
825
|
if (kpiDefinition.datapoint.targetValue === undefined && kpiDefinition.datapoint.targetPath === undefined) {
|
|
607
826
|
return; // No target set for the KPI
|
|
608
827
|
}
|
|
609
828
|
|
|
610
829
|
var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath));
|
|
611
|
-
var oKPIModel = this.getView().getModel("kpiModel");
|
|
612
830
|
var currentLocale = new Locale(sap.ui.getCore().getConfiguration().getLanguage());
|
|
613
831
|
var targetRawValue;
|
|
614
832
|
|
|
@@ -650,20 +868,24 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
650
868
|
* Loads tag data for a KPI, and stores it in the JSON KPI model.
|
|
651
869
|
*
|
|
652
870
|
* @param {KPIDefinition} kpiDefinition The definition of the KPI.
|
|
871
|
+
* @param {ODataModel} oMainModel The model used to load the data.
|
|
872
|
+
* @param {JSONModel} oKPIModel The JSON model where the data will be stored
|
|
653
873
|
* @param loadFull If not true, loads only data for the KPI tag
|
|
654
|
-
* @returns {Promise} Returns the
|
|
874
|
+
* @returns {Promise} Returns the promise that is resolved when data is loaded.
|
|
655
875
|
*/
|
|
656
876
|
|
|
657
877
|
}, {
|
|
658
878
|
key: "loadKPITagData",
|
|
659
|
-
value: function loadKPITagData(kpiDefinition, loadFull) {
|
|
879
|
+
value: function loadKPITagData(kpiDefinition, oMainModel, oKPIModel, loadFull) {
|
|
660
880
|
var _kpiDefinition$datapo4,
|
|
661
881
|
_kpiDefinition$select2,
|
|
662
882
|
_this2 = this;
|
|
663
883
|
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
var oListBinding =
|
|
884
|
+
// If loadFull=false, then we're just loading data for the tag and we use the "$auto.LongRunners" groupID
|
|
885
|
+
// If loadFull=true, we're loading data for the whole KPI (tag + card) and we use the default ("$auto") groupID
|
|
886
|
+
var oListBinding = loadFull ? oMainModel.bindList("/" + kpiDefinition.entitySet) : oMainModel.bindList("/" + kpiDefinition.entitySet, undefined, undefined, undefined, {
|
|
887
|
+
$$groupId: "$auto.LongRunners"
|
|
888
|
+
});
|
|
667
889
|
var oAggregate = {}; // Main value + currency/unit
|
|
668
890
|
|
|
669
891
|
if ((_kpiDefinition$datapo4 = kpiDefinition.datapoint.unit) !== null && _kpiDefinition$datapo4 !== void 0 && _kpiDefinition$datapo4.isPath) {
|
|
@@ -699,7 +921,9 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
699
921
|
}); // Manage SelectionVariant filters
|
|
700
922
|
|
|
701
923
|
if ((_kpiDefinition$select2 = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select2 !== void 0 && _kpiDefinition$select2.length) {
|
|
702
|
-
var aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition)
|
|
924
|
+
var aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition).filter(function (filter) {
|
|
925
|
+
return filter !== undefined;
|
|
926
|
+
});
|
|
703
927
|
oListBinding.filter(aFilters);
|
|
704
928
|
}
|
|
705
929
|
|
|
@@ -723,34 +947,41 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
723
947
|
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/targetUnit", undefined);
|
|
724
948
|
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/deviationNumber", undefined);
|
|
725
949
|
} else {
|
|
726
|
-
_this2.updateDatapointValueAndCurrency(kpiDefinition, aContexts[0]);
|
|
950
|
+
_this2.updateDatapointValueAndCurrency(kpiDefinition, aContexts[0], oKPIModel);
|
|
727
951
|
|
|
728
|
-
_this2.updateDatapointCriticality(kpiDefinition, aContexts[0]);
|
|
952
|
+
_this2.updateDatapointCriticality(kpiDefinition, aContexts[0], oKPIModel);
|
|
729
953
|
|
|
730
954
|
if (loadFull) {
|
|
731
|
-
_this2.updateDatapointTrend(kpiDefinition, aContexts[0]);
|
|
955
|
+
_this2.updateDatapointTrend(kpiDefinition, aContexts[0], oKPIModel);
|
|
732
956
|
|
|
733
|
-
_this2.updateTargetValue(kpiDefinition, aContexts[0]);
|
|
957
|
+
_this2.updateTargetValue(kpiDefinition, aContexts[0], oKPIModel);
|
|
734
958
|
}
|
|
735
959
|
}
|
|
736
960
|
}
|
|
737
961
|
});
|
|
738
962
|
}
|
|
963
|
+
/**
|
|
964
|
+
* Loads card data for a KPI, and stores it in the JSON KPI model.
|
|
965
|
+
*
|
|
966
|
+
* @param {KPIDefinition} kpiDefinition The definition of the KPI.
|
|
967
|
+
* @param {ODataModel} oMainModel The model used to load the data.
|
|
968
|
+
* @param {JSONModel} oKPIModel The JSON model where the data will be stored
|
|
969
|
+
* @returns {Promise} Returns the promise that is resolved when data is loaded.
|
|
970
|
+
*/
|
|
971
|
+
|
|
739
972
|
}, {
|
|
740
973
|
key: "loadKPICardData",
|
|
741
|
-
value: function loadKPICardData(kpiDefinition) {
|
|
974
|
+
value: function loadKPICardData(kpiDefinition, oMainModel, oKPIModel) {
|
|
742
975
|
var _kpiDefinition$select3;
|
|
743
976
|
|
|
744
|
-
var
|
|
745
|
-
var oListBinding = oModel.bindList("/" + kpiDefinition.entitySet);
|
|
977
|
+
var oListBinding = oMainModel.bindList("/" + kpiDefinition.entitySet);
|
|
746
978
|
var oGroup = {};
|
|
747
979
|
var oAggregate = {};
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
oGroup[sDimensionName] = {};
|
|
980
|
+
kpiDefinition.chart.dimensions.forEach(function (dimension) {
|
|
981
|
+
oGroup[dimension.name] = {};
|
|
751
982
|
});
|
|
752
|
-
kpiDefinition.
|
|
753
|
-
oAggregate[
|
|
983
|
+
kpiDefinition.chart.measures.forEach(function (measure) {
|
|
984
|
+
oAggregate[measure.name] = {};
|
|
754
985
|
});
|
|
755
986
|
oListBinding.setAggregation({
|
|
756
987
|
group: oGroup,
|
|
@@ -758,18 +989,27 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
758
989
|
}); // Manage SelectionVariant filters
|
|
759
990
|
|
|
760
991
|
if ((_kpiDefinition$select3 = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select3 !== void 0 && _kpiDefinition$select3.length) {
|
|
761
|
-
var aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition)
|
|
992
|
+
var aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition).filter(function (filter) {
|
|
993
|
+
return filter !== undefined;
|
|
994
|
+
});
|
|
762
995
|
oListBinding.filter(aFilters);
|
|
996
|
+
} // Sorting
|
|
997
|
+
|
|
998
|
+
|
|
999
|
+
if (kpiDefinition.chart.sortOrder) {
|
|
1000
|
+
oListBinding.sort(kpiDefinition.chart.sortOrder.map(function (sortInfo) {
|
|
1001
|
+
return new Sorter(sortInfo.name, sortInfo.descending);
|
|
1002
|
+
}));
|
|
763
1003
|
}
|
|
764
1004
|
|
|
765
|
-
return oListBinding.requestContexts(0).then(function (aContexts) {
|
|
1005
|
+
return oListBinding.requestContexts(0, kpiDefinition.chart.maxItems).then(function (aContexts) {
|
|
766
1006
|
var chartData = aContexts.map(function (oContext) {
|
|
767
1007
|
var oData = {};
|
|
768
|
-
kpiDefinition.
|
|
769
|
-
oData[
|
|
1008
|
+
kpiDefinition.chart.dimensions.forEach(function (dimension) {
|
|
1009
|
+
oData[dimension.name] = oContext.getProperty(dimension.name);
|
|
770
1010
|
});
|
|
771
|
-
kpiDefinition.
|
|
772
|
-
oData[
|
|
1011
|
+
kpiDefinition.chart.measures.forEach(function (measure) {
|
|
1012
|
+
oData[measure.name] = oContext.getProperty(measure.name);
|
|
773
1013
|
});
|
|
774
1014
|
return oData;
|
|
775
1015
|
});
|
|
@@ -788,26 +1028,38 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
788
1028
|
}, {
|
|
789
1029
|
key: "getPopover",
|
|
790
1030
|
value: function getPopover(oKPITag) {
|
|
1031
|
+
var _this3 = this;
|
|
1032
|
+
|
|
791
1033
|
if (!this.oPopover) {
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
1034
|
+
return new Promise(function (resolve, reject) {
|
|
1035
|
+
sap.ui.getCore().loadLibrary("sap/ui/integration", {
|
|
1036
|
+
async: true
|
|
1037
|
+
}).then(function () {
|
|
1038
|
+
sap.ui.require(["sap/ui/integration/widgets/Card"], function (Card) {
|
|
1039
|
+
_this3.oCard = new Card({
|
|
1040
|
+
width: "25rem",
|
|
1041
|
+
height: "auto"
|
|
1042
|
+
});
|
|
1043
|
+
_this3.oPopover = new Popover({
|
|
1044
|
+
id: "kpi-Popover",
|
|
1045
|
+
showHeader: false,
|
|
1046
|
+
placement: "Auto",
|
|
1047
|
+
content: [_this3.oCard]
|
|
1048
|
+
});
|
|
1049
|
+
oKPITag.addDependent(_this3.oPopover); // The first clicked tag gets the popover as dependent
|
|
1050
|
+
|
|
1051
|
+
resolve(_this3.oPopover);
|
|
1052
|
+
});
|
|
1053
|
+
}).catch(reject);
|
|
801
1054
|
});
|
|
802
|
-
|
|
1055
|
+
} else {
|
|
1056
|
+
return Promise.resolve(this.oPopover);
|
|
803
1057
|
}
|
|
804
|
-
|
|
805
|
-
return this.oPopover;
|
|
806
1058
|
}
|
|
807
1059
|
}, {
|
|
808
1060
|
key: "onKPIPressed",
|
|
809
1061
|
value: function onKPIPressed(oKPITag, kpiID) {
|
|
810
|
-
var
|
|
1062
|
+
var _this4 = this;
|
|
811
1063
|
|
|
812
1064
|
var oKPIModel = oKPITag.getModel("kpiModel");
|
|
813
1065
|
|
|
@@ -817,13 +1069,14 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
817
1069
|
});
|
|
818
1070
|
|
|
819
1071
|
if (kpiDefinition) {
|
|
820
|
-
var
|
|
821
|
-
var
|
|
822
|
-
Promise.all(aPromises).then(function () {
|
|
823
|
-
|
|
1072
|
+
var oModel = oKPITag.getModel();
|
|
1073
|
+
var aPromises = [this.loadKPITagData(kpiDefinition, oModel, oKPIModel, true), this.loadKPICardData(kpiDefinition, oModel, oKPIModel), this.getPopover(oKPITag)];
|
|
1074
|
+
Promise.all(aPromises).then(function (aResults) {
|
|
1075
|
+
_this4.oCard.setManifest(oKPIModel.getProperty("/" + kpiID + "/manifest"));
|
|
824
1076
|
|
|
825
|
-
|
|
1077
|
+
_this4.oCard.refresh();
|
|
826
1078
|
|
|
1079
|
+
var oPopover = aResults[2];
|
|
827
1080
|
oPopover.openBy(oKPITag, false);
|
|
828
1081
|
}).catch(function (err) {
|
|
829
1082
|
Log.error(err);
|
|
@@ -837,4 +1090,4 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
837
1090
|
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onKPIPressed", [Public], Object.getOwnPropertyDescriptor(_class2.prototype, "onKPIPressed"), _class2.prototype)), _class2)) || _class);
|
|
838
1091
|
return KPIManagementControllerExtension;
|
|
839
1092
|
}, false);
|
|
840
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIktQSU1hbmFnZW1lbnQudHMiXSwibmFtZXMiOlsibWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHkiLCJjcml0aWNhbGl0eVZhbHVlIiwiY3JpdGljYWxpdHlQcm9wZXJ0eSIsIk1lc3NhZ2VUeXBlIiwiRXJyb3IiLCJXYXJuaW5nIiwiU3VjY2VzcyIsIkluZm9ybWF0aW9uIiwiTm9uZSIsIm1lc3NhZ2VUeXBlRnJvbVRhcmdldENhbGN1bGF0aW9uIiwia3BpVmFsdWUiLCJhVGhyZXNob2xkcyIsInVuZGVmaW5lZCIsIm1lc3NhZ2VUeXBlRnJvbU1pbmltaXplQ2FsY3VsYXRpb24iLCJ2YWx1ZUNvbG9yRnJvbU1lc3NhZ2VUeXBlIiwibWVzc2FnZVR5cGUiLCJtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uIiwiZGV2aWF0aW9uSW5kaWNhdG9yRnJvbVRyZW5kVHlwZSIsInRyZW5kVmFsdWUiLCJkZXZpYXRpb25JbmRpY2F0b3IiLCJkZXZpYXRpb25JbmRpY2F0b3JGcm9tQ2FsY3VsYXRpb24iLCJyZWZlcmVuY2VWYWx1ZSIsImlzUmVsYXRpdmUiLCJjb21wVmFsdWUiLCJjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbiIsImZpbHRlckRlZmluaXRpb24iLCJyYW5nZXMiLCJsZW5ndGgiLCJGaWx0ZXIiLCJwcm9wZXJ0eVBhdGgiLCJvcGVyYXRvciIsInJhbmdlTG93IiwicmFuZ2VIaWdoIiwiYVJhbmdlRmlsdGVycyIsIm1hcCIsInJhbmdlIiwiZmlsdGVycyIsImFuZCIsImdldEZpbHRlclN0cmluZ0Zyb21EZWZpbml0aW9uIiwiY3VycmVudExvY2FsZSIsIkxvY2FsZSIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldENvbmZpZ3VyYXRpb24iLCJnZXRMYW5ndWFnZSIsInJlc0J1bmRsZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImRhdGVGb3JtYXQiLCJEYXRlRm9ybWF0IiwiZ2V0RGF0ZUluc3RhbmNlIiwic3R5bGUiLCJmb3JtYXRSYW5nZSIsInZhbHVlTG93IiwicHJvcGVydHlUeXBlIiwiaW5kZXhPZiIsImZvcm1hdCIsIkRhdGUiLCJ2YWx1ZUhpZ2giLCJnZXRUZXh0Iiwiam9pbiIsIktQSU1hbmFnZW1lbnRDb250cm9sbGVyRXh0ZW5zaW9uIiwiVUk1Q2xhc3MiLCJDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEiLCJPdmVycmlkZSIsImFLUElEZWZpbml0aW9ucyIsImdldEtQSURhdGEiLCJvVmlldyIsImdldFZpZXciLCJvQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJvS1BJTW9kZWwiLCJKU09OTW9kZWwiLCJzZXRNb2RlbCIsImZvckVhY2giLCJrcGlEZWZpbml0aW9uIiwib0NhcmRNYW5pZmVzdCIsImlkIiwidHlwZSIsInRlY2hub2xvZ3kiLCJkYXRhIiwianNvbiIsImhlYWRlciIsInRpdGxlIiwiZGF0YXBvaW50Iiwic3ViVGl0bGUiLCJkZXNjcmlwdGlvbiIsInVuaXRPZk1lYXN1cmVtZW50IiwibWFpbkluZGljYXRvciIsIm51bWJlciIsInVuaXQiLCJzdGF0ZSIsInRyZW5kIiwiY29udGVudCIsInBsb3RBcmVhIiwidGV4dCIsInZpc2libGUiLCJhbGlnbm1lbnQiLCJtZWFzdXJlQXhpcyIsImRpbWVuc2lvbkF4aXMiLCJwYXRoIiwidGFyZ2V0UGF0aCIsInRhcmdldFZhbHVlIiwic2lkZUluZGljYXRvcnMiLCJzZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnMiLCJhRGVzY3JpcHRpb25zIiwiZGVzYyIsInB1c2giLCJkZXRhaWxzIiwiT2JqZWN0IiwiYXNzaWduIiwiY2FyZCIsImNhcmRDb250ZW50TWFuaWZlc3QiLCJzZXRQcm9wZXJ0eSIsIm1hbmlmZXN0IiwibG9hZEtQSVRhZ0RhdGEiLCJjYXRjaCIsImVyciIsIkxvZyIsImVycm9yIiwiZ2V0TW9kZWwiLCJkZXN0cm95Iiwic0N1c3RvbURhdGEiLCJnZXRDb250ZW50IiwidkRhdGEiLCJKU09OIiwicGFyc2UiLCJrcGlDb250ZXh0IiwicmF3VW5pdCIsImlzUGF0aCIsImdldFByb3BlcnR5IiwidmFsdWUiLCJpc1BlcmNlbnRhZ2UiLCJpc0N1cnJlbmN5IiwicmF3VmFsdWUiLCJOdW1iZXIiLCJwYXJzZUZsb2F0IiwiTnVtYmVyRm9ybWF0IiwiZ2V0RmxvYXRJbnN0YW5jZSIsIm1pbkZyYWN0aW9uRGlnaXRzIiwibWF4RnJhY3Rpb25EaWdpdHMiLCJzaG93U2NhbGUiLCJrcGlWYWx1ZVVuc2NhbGVkIiwiZ3JvdXBpbmdFbmFibGVkIiwia3BpVmFsdWVOb1NjYWxlIiwia3BpVmFsdWVTY2FsZSIsImRlY2ltYWxzIiwibWF4SW50ZWdlckRpZ2l0cyIsImtwaVVuaXQiLCJnZXRVbml0SW5zdGFuY2UiLCJzaG93TnVtYmVyIiwiY3JpdGljYWxpdHlQYXRoIiwiY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMiLCJjcml0aWNhbGl0eUNhbGN1bGF0aW9uTW9kZSIsInRyZW5kUGF0aCIsInRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZSIsInRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoIiwidHJlbmRSZWZlcmVuY2VWYWx1ZSIsInRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlIiwidHJlbmRDYWxjdWxhdGlvblRyZXNob2xkcyIsInRhcmdldFJhd1ZhbHVlIiwiZGV2aWF0aW9uUmF3VmFsdWUiLCJ0YXJnZXRTY2FsZSIsImRldmlhdGlvblZhbHVlIiwibG9hZEZ1bGwiLCJvTW9kZWwiLCJvTGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsImVudGl0eVNldCIsIm9BZ2dyZWdhdGUiLCJzZXRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0ZSIsImFGaWx0ZXJzIiwiZmlsdGVyIiwicmVxdWVzdENvbnRleHRzIiwidGhlbiIsImFDb250ZXh0cyIsInVwZGF0ZURhdGFwb2ludFZhbHVlQW5kQ3VycmVuY3kiLCJ1cGRhdGVEYXRhcG9pbnRDcml0aWNhbGl0eSIsInVwZGF0ZURhdGFwb2ludFRyZW5kIiwidXBkYXRlVGFyZ2V0VmFsdWUiLCJvR3JvdXAiLCJkaW1lbnNpb25zIiwic0RpbWVuc2lvbk5hbWUiLCJtZWFzdXJlcyIsInNNZWFzdXJlTmFtZSIsImdyb3VwIiwiY2hhcnREYXRhIiwib0NvbnRleHQiLCJvRGF0YSIsIm9LUElUYWciLCJvUG9wb3ZlciIsIm9DYXJkIiwiQ2FyZCIsIndpZHRoIiwiaGVpZ2h0IiwiUG9wb3ZlciIsInNob3dIZWFkZXIiLCJwbGFjZW1lbnQiLCJhZGREZXBlbmRlbnQiLCJrcGlJRCIsImZpbmQiLCJvRGVmIiwiYVByb21pc2VzIiwibG9hZEtQSUNhcmREYXRhIiwiZ2V0UG9wb3ZlciIsIlByb21pc2UiLCJhbGwiLCJzZXRNYW5pZmVzdCIsInJlZnJlc2giLCJvcGVuQnkiLCJDb250cm9sbGVyRXh0ZW5zaW9uIiwiUHVibGljIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFTQSwwQkFBVCxDQUFvQ0MsZ0JBQXBDLEVBQW9GO0FBQ25GLFFBQUlDLG1CQUFKOztBQUVBLFlBQVFELGdCQUFSO0FBQ0MsV0FBSyxDQUFMO0FBQ0EsV0FBSyxHQUFMO0FBQ0NDLFFBQUFBLG1CQUFtQixHQUFHQyxXQUFXLENBQUNDLEtBQWxDO0FBQ0E7O0FBQ0QsV0FBSyxDQUFMO0FBQ0EsV0FBSyxHQUFMO0FBQ0NGLFFBQUFBLG1CQUFtQixHQUFHQyxXQUFXLENBQUNFLE9BQWxDO0FBQ0E7O0FBQ0QsV0FBSyxDQUFMO0FBQ0EsV0FBSyxHQUFMO0FBQ0NILFFBQUFBLG1CQUFtQixHQUFHQyxXQUFXLENBQUNHLE9BQWxDO0FBQ0E7O0FBQ0QsV0FBSyxDQUFMO0FBQ0EsV0FBSyxHQUFMO0FBQ0NKLFFBQUFBLG1CQUFtQixHQUFHQyxXQUFXLENBQUNJLFdBQWxDO0FBQ0E7O0FBQ0Q7QUFDQ0wsUUFBQUEsbUJBQW1CLEdBQUdDLFdBQVcsQ0FBQ0ssSUFBbEM7QUFsQkY7O0FB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QU1pRCxhQUFhLEdBQUcsS0FBS1gsZUFBTCxDQUFxQnlJLElBQXJCLENBQTBCLFVBQVNDLElBQVQsRUFBZTtBQUM5RCxtQkFBT0EsSUFBSSxDQUFDN0gsRUFBTCxLQUFZMkgsS0FBbkI7QUFDQSxXQUZxQixDQUF0Qjs7QUFJQSxjQUFJN0gsYUFBSixFQUFtQjtBQUNsQixnQkFBTWdJLFNBQVMsR0FBRyxDQUFDLEtBQUt4RixjQUFMLENBQW9CeEMsYUFBcEIsRUFBbUMsSUFBbkMsQ0FBRCxFQUEyQyxLQUFLaUksZUFBTCxDQUFxQmpJLGFBQXJCLENBQTNDLENBQWxCO0FBQ0EsZ0JBQU1vSCxRQUFRLEdBQUcsS0FBS2MsVUFBTCxDQUFnQmYsT0FBaEIsQ0FBakI7QUFFQWdCLFlBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZSixTQUFaLEVBQ0U1QixJQURGLENBQ08sWUFBTTtBQUNYLGNBQUEsTUFBSSxDQUFDaUIsS0FBTCxDQUFXZ0IsV0FBWCxDQUF1QnpJLFNBQVMsQ0FBQzJELFdBQVYsQ0FBc0IsTUFBTXNFLEtBQU4sR0FBYyxXQUFwQyxDQUF2Qjs7QUFDQSxjQUFBLE1BQUksQ0FBQ1IsS0FBTCxDQUFXaUIsT0FBWDs7QUFDQWxCLGNBQUFBLFFBQVEsQ0FBQ21CLE1BQVQsQ0FBZ0JwQixPQUFoQixFQUF5QixLQUF6QjtBQUNBLGFBTEYsRUFNRTFFLEtBTkYsQ0FNUSxVQUFBQyxHQUFHLEVBQUk7QUFDYkMsY0FBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVVGLEdBQVY7QUFDQSxhQVJGO0FBU0E7QUFDRDtBQUNEOzs7O0lBcGhCNkM4RixtQixzV0E0ZjdDQyxNO1NBMkJheEosZ0MiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnRyb2xsZXJFeHRlbnNpb24gfSBmcm9tIFwic2FwL3VpL2NvcmUvbXZjXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnNcIjtcbmltcG9ydCB7IFVJNUNsYXNzLCBPdmVycmlkZSwgUHVibGljIH0gZnJvbSBcIi4uL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBKU09OTW9kZWwgfSBmcm9tIFwic2FwL3VpL21vZGVsL2pzb25cIjtcbmltcG9ydCB7IExvZyB9IGZyb20gXCJzYXAvYmFzZVwiO1xuaW1wb3J0IHsgS1BJRGVmaW5pdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9LUElcIjtcbmltcG9ydCB7IENvbW1vblV0aWxzIH0gZnJvbSBcInNhcC9mZS9jb3JlXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NFwiO1xuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9UYWJsZUZvcm1hdHRlclR5cGVzXCI7XG5pbXBvcnQgeyBGaWx0ZXJEZWZpbml0aW9uLCBSYW5nZURlZmluaXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL1NlbGVjdGlvblZhcmlhbnRIZWxwZXJcIjtcbmltcG9ydCB7IE51bWJlckZvcm1hdCwgRGF0ZUZvcm1hdCB9IGZyb20gXCJzYXAvdWkvY29yZS9mb3JtYXRcIjtcbmltcG9ydCB7IExvY2FsZSB9IGZyb20gXCJzYXAvdWkvY29yZVwiO1xuaW1wb3J0IHsgRmlsdGVyLCBGaWx0ZXJPcGVyYXRvciB9IGZyb20gXCJzYXAvdWkvbW9kZWxcIjtcbmltcG9ydCB7IEdlbmVyaWNUYWcsIFBvcG92ZXIgfSBmcm9tIFwic2FwL21cIjtcbmltcG9ydCB7IENhcmQgfSBmcm9tIFwic2FwL3VpL2ludGVncmF0aW9uL3dpZGdldHNcIjtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYSBtZXNzYWdlIHN0YXRlIGZyb20gYSBjcml0aWNhbGl0eSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IGNyaXRpY2FsaXR5VmFsdWUgVGhlIGNyaXRpY2FsaXR5IHZhbHVlcy5cbiAqIEByZXR1cm5zIHtNZXNzYWdlVHlwZX0gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBNZXNzYWdlVHlwZVxuICovXG5mdW5jdGlvbiBtZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eShjcml0aWNhbGl0eVZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBNZXNzYWdlVHlwZSB7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBNZXNzYWdlVHlwZTtcblxuXHRzd2l0Y2ggKGNyaXRpY2FsaXR5VmFsdWUpIHtcblx0XHRjYXNlIDE6XG5cdFx0Y2FzZSBcIjFcIjpcblx0XHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5FcnJvcjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMjpcblx0XHRjYXNlIFwiMlwiOlxuXHRcdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDM6XG5cdFx0Y2FzZSBcIjNcIjpcblx0XHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSA1OlxuXHRcdGNhc2UgXCI1XCI6XG5cdFx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuSW5mb3JtYXRpb247XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH1cblxuXHRyZXR1cm4gY3JpdGljYWxpdHlQcm9wZXJ0eTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIG1lc3NhZ2Ugc3RhdGUgZm9yIGEgY3JpdGljYWxpdHkgY2FsY3VsYXRpb24gb2YgdHlwZSAnVGFyZ2V0Jy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUEkgdG8gYmUgdGVzdGVkIGFnYWluc3QuXG4gKiBAcGFyYW0ge251bWJlcltdfSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0RldmlhdGlvblJhbmdlTG93VmFsdWUsVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUsVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWUsRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVdLlxuICogQHJldHVybnMge01lc3NhZ2VUeXBlfSBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIE1lc3NhZ2VUeXBlXG4gKi9cbmZ1bmN0aW9uIG1lc3NhZ2VUeXBlRnJvbVRhcmdldENhbGN1bGF0aW9uKGtwaVZhbHVlOiBudW1iZXIsIGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSk6IE1lc3NhZ2VUeXBlIHtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IE1lc3NhZ2VUeXBlO1xuXG5cdGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGtwaVZhbHVlIDwgYVRocmVzaG9sZHNbMF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1sxXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMl0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1syXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbNV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1s1XSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA+IGFUaHJlc2hvbGRzWzVdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzRdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbNF0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1s0XSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzNdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbM10gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1szXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBtZXNzYWdlIHN0YXRlIGZvciBhIGNyaXRpY2FsaXR5IGNhbGN1bGF0aW9uIG9mIHR5cGUgJ01pbmltaXplJy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUEkgdG8gYmUgdGVzdGVkIGFnYWluc3QuXG4gKiBAcGFyYW0ge251bWJlcltdfSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0FjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZSxUb2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZSxEZXZpYXRpb25SYW5nZUhpZ2hWYWx1ZV0uXG4gKiBAcmV0dXJucyB7TWVzc2FnZVR5cGV9IFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgTWVzc2FnZVR5cGVcbiAqL1xuZnVuY3Rpb24gbWVzc2FnZVR5cGVGcm9tTWluaW1pemVDYWxjdWxhdGlvbihrcGlWYWx1ZTogbnVtYmVyLCBhVGhyZXNob2xkczogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW10pOiBNZXNzYWdlVHlwZSB7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBNZXNzYWdlVHlwZTtcblxuXHRpZiAoYVRocmVzaG9sZHNbMl0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1syXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA+IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1sxXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzBdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMF0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1swXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gdHJhbnNmb3JtIGEgTWVzc2FnZVR5cGUgaW50byBhIFZhbHVlQ29sb3IuXG4gKlxuICogQHBhcmFtIG1lc3NhZ2VUeXBlIFRoZSBtZXNzYWdlIHR5cGVcbiAqIEByZXR1cm5zIFRoZSBWYWx1ZUNvbG9yXG4gKi9cbmZ1bmN0aW9uIHZhbHVlQ29sb3JGcm9tTWVzc2FnZVR5cGUobWVzc2FnZVR5cGU6IE1lc3NhZ2VUeXBlKTogc3RyaW5nIHtcblx0c3dpdGNoIChtZXNzYWdlVHlwZSkge1xuXHRcdGNhc2UgTWVzc2FnZVR5cGUuRXJyb3I6XG5cdFx0XHRyZXR1cm4gXCJFcnJvclwiO1xuXG5cdFx0Y2FzZSBNZXNzYWdlVHlwZS5XYXJuaW5nOlxuXHRcdFx0cmV0dXJuIFwiQ3JpdGljYWxcIjtcblxuXHRcdGNhc2UgTWVzc2FnZVR5cGUuU3VjY2Vzczpcblx0XHRcdHJldHVybiBcIkdvb2RcIjtcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gXCJOb25lXCI7XG5cdH1cbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIG1lc3NhZ2Ugc3RhdGUgZm9yIGEgY3JpdGljYWxpdHkgY2FsY3VsYXRpb24gb2YgdHlwZSAnTWF4aW1pemUnLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBrcGlWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIEtQSSB0byBiZSB0ZXN0ZWQgYWdhaW5zdC5cbiAqIEBwYXJhbSB7bnVtYmVyW119IGFUaHJlc2hvbGRzIFRocmVzaG9sZHMgdG8gYmUgdXNlZCBbRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZSxUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlLEFjY2VwdGFuY2VSYW5nZUxvd1ZhbHVlXS5cbiAqIEByZXR1cm5zIHtNZXNzYWdlVHlwZX0gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBNZXNzYWdlVHlwZVxuICovXG5mdW5jdGlvbiBtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uKGtwaVZhbHVlOiBudW1iZXIsIGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSk6IE1lc3NhZ2VUeXBlIHtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IE1lc3NhZ2VUeXBlO1xuXG5cdGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGtwaVZhbHVlIDwgYVRocmVzaG9sZHNbMF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1sxXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMl0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1syXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH0gZWxzZSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLlN1Y2Nlc3M7XG5cdH1cblxuXHRyZXR1cm4gY3JpdGljYWxpdHlQcm9wZXJ0eTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYSBEZXZpYXRpb25JbmRpY2F0b3IgdmFsdWUgZnJvbSBhIHRyZW5kIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdHJlbmRWYWx1ZSBUaGUgY3JpdGljYWxpdHkgdmFsdWVzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBEZXZpYXRpb25JbmRpY2F0b3IgdmFsdWVcbiAqL1xuZnVuY3Rpb24gZGV2aWF0aW9uSW5kaWNhdG9yRnJvbVRyZW5kVHlwZSh0cmVuZFZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xuXHRsZXQgZGV2aWF0aW9uSW5kaWNhdG9yOiBzdHJpbmc7XG5cblx0c3dpdGNoICh0cmVuZFZhbHVlKSB7XG5cdFx0Y2FzZSAxOiAvLyBTdHJvbmdVcFxuXHRcdGNhc2UgXCIxXCI6XG5cdFx0Y2FzZSAyOiAvLyBVcFxuXHRcdGNhc2UgXCIyXCI6XG5cdFx0XHRkZXZpYXRpb25JbmRpY2F0b3IgPSBcIlVwXCI7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgNDogLy8gRG93blxuXHRcdGNhc2UgXCI0XCI6XG5cdFx0Y2FzZSA1OiAvLyBTdHJvbmdEb3duXG5cdFx0Y2FzZSBcIjVcIjpcblx0XHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJOb25lXCI7XG5cdH1cblxuXHRyZXR1cm4gZGV2aWF0aW9uSW5kaWNhdG9yO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBhIERldmlhdGlvbkluZGljYXRvciBmcm9tIGEgVHJlbmRDYWxjdWxhdGlvbi5cbiAqXG4gKiBAcGFyYW0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUElcbiAqIEBwYXJhbSByZWZlcmVuY2VWYWx1ZSBUaGUgcmVmZXJlbmNlIHZhbHVlIHRvIGNvbXBhcmUgd2l0aFxuICogQHBhcmFtIGlzUmVsYXRpdmUgVHJ1ZSBpcyB0aGUgY29tcGFyaXNvbiBpcyByZWxhdGl2ZVxuICogQHBhcmFtIGFUaHJlc2hvbGRzIEFycmF5IG9mIHRocmVzaG9sZHMgW1N0cm9uZ0Rvd25EaWZmZXJlbmNlLCBEb3duRGlmZmVyZW5jZSwgVXBEaWZmZXJlbmNlLCBTdHJvbmdVcERpZmZlcmVuY2VdXG4gKiBAcmV0dXJucyB7c2FwLm0uRGV2aWF0aW9uSW5kaWNhdG9yfSBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIERldmlhdGlvbkluZGljYXRvciB2YWx1ZVxuICovXG5mdW5jdGlvbiBkZXZpYXRpb25JbmRpY2F0b3JGcm9tQ2FsY3VsYXRpb24oXG5cdGtwaVZhbHVlOiBudW1iZXIsXG5cdHJlZmVyZW5jZVZhbHVlOiBudW1iZXIsXG5cdGlzUmVsYXRpdmU6IGJvb2xlYW4sXG5cdGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHtcblx0bGV0IGRldmlhdGlvbkluZGljYXRvcjogc3RyaW5nO1xuXG5cdGlmICghYVRocmVzaG9sZHMgfHwgKGlzUmVsYXRpdmUgJiYgIXJlZmVyZW5jZVZhbHVlKSkge1xuXHRcdHJldHVybiBcIk5vbmVcIjtcblx0fVxuXG5cdGNvbnN0IGNvbXBWYWx1ZSA9IGlzUmVsYXRpdmUgPyAoa3BpVmFsdWUgLSByZWZlcmVuY2VWYWx1ZSkgLyByZWZlcmVuY2VWYWx1ZSA6IGtwaVZhbHVlIC0gcmVmZXJlbmNlVmFsdWU7XG5cblx0aWYgKGFUaHJlc2hvbGRzWzBdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMF0gIT09IG51bGwgJiYgY29tcFZhbHVlIDw9IGFUaHJlc2hvbGRzWzBdKSB7XG5cdFx0Ly8gU3Ryb25nRG93biAtLT4gRG93blxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYgY29tcFZhbHVlIDw9IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Ly8gRG93biAtLT4gRG93blxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzNdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbM10gIT09IG51bGwgJiYgY29tcFZhbHVlID49IGFUaHJlc2hvbGRzWzNdKSB7XG5cdFx0Ly8gU3Ryb25nVXAgLS0+IFVwXG5cdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJVcFwiO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzJdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMl0gIT09IG51bGwgJiYgY29tcFZhbHVlID49IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Ly8gVXAgLS0+IFVwXG5cdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJVcFwiO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFNpZGV3YXlzIC0tPiBOb25lXG5cdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJOb25lXCI7XG5cdH1cblxuXHRyZXR1cm4gZGV2aWF0aW9uSW5kaWNhdG9yO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzYXAudWkubW9kZWwuRmlsdGVyIGZyb20gYSBmaWx0ZXIgZGVmaW5pdGlvbi5cbiAqXG4gKiBAcGFyYW0gZmlsdGVyRGVmaW5pdGlvbiBUaGUgZmlsdGVyIGRlZmluaXRpb25cbiAqIEByZXR1cm5zIFJldHVybnMgYSBzYXAudWkubW9kZWwuRmlsdGVyIGZyb20gdGhlIGRlZmluaXRpb24sIG9yIHVuZGVmaW5lZCBpZiB0aGUgZGVmaW5pdGlvbiBpcyBlbXB0eSAobm8gcmFuZ2VzKVxuICovXG5mdW5jdGlvbiBjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbihmaWx0ZXJEZWZpbml0aW9uOiBGaWx0ZXJEZWZpbml0aW9uKTogRmlsdGVyIHwgdW5kZWZpbmVkIHtcblx0aWYgKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIG5ldyBGaWx0ZXIoXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnByb3BlcnR5UGF0aCxcblx0XHRcdGZpbHRlckRlZmluaXRpb24ucmFuZ2VzWzBdLm9wZXJhdG9yIGFzIEZpbHRlck9wZXJhdG9yLFxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXNbMF0ucmFuZ2VMb3csXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnJhbmdlc1swXS5yYW5nZUhpZ2hcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGFSYW5nZUZpbHRlcnMgPSBmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5tYXAocmFuZ2UgPT4ge1xuXHRcdFx0cmV0dXJuIG5ldyBGaWx0ZXIoZmlsdGVyRGVmaW5pdGlvbi5wcm9wZXJ0eVBhdGgsIHJhbmdlLm9wZXJhdG9yIGFzIEZpbHRlck9wZXJhdG9yLCByYW5nZS5yYW5nZUxvdywgcmFuZ2UucmFuZ2VIaWdoKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRmaWx0ZXJzOiBhUmFuZ2VGaWx0ZXJzLFxuXHRcdFx0YW5kOiBmYWxzZVxuXHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldEZpbHRlclN0cmluZ0Zyb21EZWZpbml0aW9uKGZpbHRlckRlZmluaXRpb246IEZpbHRlckRlZmluaXRpb24pOiBzdHJpbmcge1xuXHRjb25zdCBjdXJyZW50TG9jYWxlID0gbmV3IExvY2FsZShcblx0XHRzYXAudWlcblx0XHRcdC5nZXRDb3JlKClcblx0XHRcdC5nZXRDb25maWd1cmF0aW9uKClcblx0XHRcdC5nZXRMYW5ndWFnZSgpXG5cdCk7XG5cdGNvbnN0IHJlc0J1bmRsZSA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdGNvbnN0IGRhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSh7IHN0eWxlOiBcIm1lZGl1bVwiIH0sIGN1cnJlbnRMb2NhbGUpO1xuXG5cdGZ1bmN0aW9uIGZvcm1hdFJhbmdlKHJhbmdlOiBSYW5nZURlZmluaXRpb24pOiBzdHJpbmcge1xuXHRcdGNvbnN0IHZhbHVlTG93ID1cblx0XHRcdGZpbHRlckRlZmluaXRpb24ucHJvcGVydHlUeXBlLmluZGV4T2YoXCJFZG0uRGF0ZVwiKSA9PT0gMCA/IGRhdGVGb3JtYXQuZm9ybWF0KG5ldyBEYXRlKHJhbmdlLnJhbmdlTG93KSkgOiByYW5nZS5yYW5nZUxvdztcblx0XHRjb25zdCB2YWx1ZUhpZ2ggPVxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5wcm9wZXJ0eVR5cGUuaW5kZXhPZihcIkVkbS5EYXRlXCIpID09PSAwID8gZGF0ZUZvcm1hdC5mb3JtYXQobmV3IERhdGUocmFuZ2UucmFuZ2VIaWdoKSkgOiByYW5nZS5yYW5nZUhpZ2g7XG5cblx0XHRzd2l0Y2ggKHJhbmdlLm9wZXJhdG9yKSB7XG5cdFx0XHRjYXNlIFwiQlRcIjpcblx0XHRcdFx0cmV0dXJuIFwiW1wiICsgdmFsdWVMb3cgKyBcIiAtIFwiICsgdmFsdWVIaWdoICsgXCJdXCI7XG5cblx0XHRcdGNhc2UgXCJDb250YWluc1wiOlxuXHRcdFx0XHRyZXR1cm4gXCIqXCIgKyB2YWx1ZUxvdyArIFwiKlwiO1xuXG5cdFx0XHRjYXNlIFwiR0VcIjpcblx0XHRcdFx0cmV0dXJuIFwiXFx1MjI2NVwiICsgdmFsdWVMb3c7XG5cblx0XHRcdGNhc2UgXCJHVFwiOlxuXHRcdFx0XHRyZXR1cm4gXCI+XCIgKyB2YWx1ZUxvdztcblxuXHRcdFx0Y2FzZSBcIkxFXCI6XG5cdFx0XHRcdHJldHVybiBcIlxcdTIyNjRcIiArIHZhbHVlTG93O1xuXG5cdFx0XHRjYXNlIFwiTFRcIjpcblx0XHRcdFx0cmV0dXJuIFwiPFwiICsgdmFsdWVMb3c7XG5cblx0XHRcdGNhc2UgXCJOQlwiOlxuXHRcdFx0XHRyZXR1cm4gcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfRklMVEVSU1RSSU5HX05PVFwiLCBbXCJbXCIgKyB2YWx1ZUxvdyArIFwiIC0gXCIgKyB2YWx1ZUhpZ2ggKyBcIl1cIl0pO1xuXG5cdFx0XHRjYXNlIFwiTkVcIjpcblx0XHRcdFx0cmV0dXJuIFwiXFx1MjI2MFwiICsgdmFsdWVMb3c7XG5cblx0XHRcdGNhc2UgXCJOb3RDb250YWluc1wiOlxuXHRcdFx0XHRyZXR1cm4gcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfRklMVEVSU1RSSU5HX05PVFwiLCBbXCIqXCIgKyB2YWx1ZUxvdyArIFwiKlwiXSk7XG5cblx0XHRcdGNhc2UgXCJFUVwiOlxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIHZhbHVlTG93O1xuXHRcdH1cblx0fVxuXHRpZiAoZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH0gZWxzZSBpZiAoZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIGZvcm1hdFJhbmdlKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzWzBdKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gXCIoXCIgKyBmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5tYXAoZm9ybWF0UmFuZ2UpLmpvaW4oXCIsXCIpICsgXCIpXCI7XG5cdH1cbn1cblxuLyoqXG4gKiBAY2xhc3MgQSBjb250cm9sbGVyIGV4dGVuc2lvbiBmb3IgbWFuYWdpbmcgS1BJIGluIGFuIEFuYWx5dGljYWxMaXN0UGFnZVxuICpcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLktQSU1hbmFnZW1lbnRcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIDEuOTMuMFxuICovXG5AVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5LUElNYW5hZ2VtZW50XCIsIENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSlcbmNsYXNzIEtQSU1hbmFnZW1lbnRDb250cm9sbGVyRXh0ZW5zaW9uIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByb3RlY3RlZCBhS1BJRGVmaW5pdGlvbnM/OiBLUElEZWZpbml0aW9uW107XG5cdHByb3RlY3RlZCBvQXBwQ29tcG9uZW50ITogYW55O1xuXHRwcm90ZWN0ZWQgb0NhcmQhOiBDYXJkO1xuXHRwcm90ZWN0ZWQgb1BvcG92ZXIhOiBQb3BvdmVyO1xuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5hS1BJRGVmaW5pdGlvbnMgPSB0aGlzLmdldEtQSURhdGEoKTtcblxuXHRcdGlmICh0aGlzLmFLUElEZWZpbml0aW9ucyAmJiB0aGlzLmFLUElEZWZpbml0aW9ucy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHR0aGlzLm9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXG5cdFx0XHQvLyBDcmVhdGUgYSBKU09OIG1vZGVsIHRvIHN0b3JlIEtQSSBkYXRhXG5cdFx0XHRjb25zdCBvS1BJTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0XHRvVmlldy5zZXRNb2RlbChvS1BJTW9kZWwsIFwia3BpTW9kZWxcIik7XG5cblx0XHRcdHRoaXMuYUtQSURlZmluaXRpb25zLmZvckVhY2goa3BpRGVmaW5pdGlvbiA9PiB7XG5cdFx0XHRcdC8vIENyZWF0ZSB0aGUgbWFuaWZlc3QgZm9yIHRoZSBLUEkgY2FyZCBhbmQgc3RvcmUgaXQgaW4gdGhlIEtQSSBtb2RlbFxuXHRcdFx0XHRjb25zdCBvQ2FyZE1hbmlmZXN0OiBhbnkgPSB7XG5cdFx0XHRcdFx0XCJzYXAuYXBwXCI6IHtcblx0XHRcdFx0XHRcdGlkOiBcInNhcC5mZVwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJjYXJkXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFwic2FwLnVpXCI6IHtcblx0XHRcdFx0XHRcdHRlY2hub2xvZ3k6IFwiVUk1XCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFwic2FwLmNhcmRcIjoge1xuXHRcdFx0XHRcdFx0dHlwZTogXCJBbmFseXRpY2FsXCIsXG5cdFx0XHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0XHRcdGpzb246IHt9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0aGVhZGVyOiB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiTnVtZXJpY1wiLFxuXHRcdFx0XHRcdFx0XHR0aXRsZToga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGl0bGUsXG5cdFx0XHRcdFx0XHRcdHN1YlRpdGxlOiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5kZXNjcmlwdGlvbixcblx0XHRcdFx0XHRcdFx0dW5pdE9mTWVhc3VyZW1lbnQ6IFwie21haW5Vbml0fVwiLFxuXHRcdFx0XHRcdFx0XHRtYWluSW5kaWNhdG9yOiB7XG5cdFx0XHRcdFx0XHRcdFx0bnVtYmVyOiBcInttYWluVmFsdWVOb1NjYWxlfVwiLFxuXHRcdFx0XHRcdFx0XHRcdHVuaXQ6IFwie21haW5WYWx1ZVNjYWxlfVwiLFxuXHRcdFx0XHRcdFx0XHRcdHN0YXRlOiBcInttYWluU3RhdGV9XCIsXG5cdFx0XHRcdFx0XHRcdFx0dHJlbmQ6IFwie3RyZW5kfVwiXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRjb250ZW50OiB7XG5cdFx0XHRcdFx0XHRcdHBsb3RBcmVhOiB7XG5cdFx0XHRcdFx0XHRcdFx0XCJkYXRhTGFiZWxcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJ2aXNpYmxlXCI6IGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcImNhdGVnb3J5QXhpc1RleHRcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJ2aXNpYmxlXCI6IGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcInZhbHVlQXhpc1RleHRcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJ2aXNpYmxlXCI6IGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdFx0XHRcdHRleHQ6IFwie2NoYXJ0VGl0bGV9XCIsXG5cdFx0XHRcdFx0XHRcdFx0dmlzaWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRhbGlnbm1lbnQ6IFwiTGVmdFwiXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdG1lYXN1cmVBeGlzOiBcInZhbHVlQXhpc1wiLFxuXHRcdFx0XHRcdFx0XHRkaW1lbnNpb25BeGlzOiBcImNhdGVnb3J5QXhpc1wiLFxuXHRcdFx0XHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0XHRcdFx0cGF0aDogXCIvY2hhcnREYXRhXCJcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvLyBBZGQgc2lkZSBpbmRpY2F0b3JzIGluIHRoZSBjYXJkIGhlYWRlciBpZiBhIHRhcmdldCBpcyBkZWZpbmVkIGZvciB0aGUgS1BJXG5cdFx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRQYXRoIHx8IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb25zdCByZXNCdW5kbGUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdFx0XHRcdG9DYXJkTWFuaWZlc3RbXCJzYXAuY2FyZFwiXS5oZWFkZXIuc2lkZUluZGljYXRvcnMgPSBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRpdGxlOiByZXNCdW5kbGUuZ2V0VGV4dChcIkNfS1BJQ0FSRF9JTkRJQ0FUT1JfVEFSR0VUXCIpLFxuXHRcdFx0XHRcdFx0XHRudW1iZXI6IFwie3RhcmdldE51bWJlcn1cIixcblx0XHRcdFx0XHRcdFx0dW5pdDogXCJ7dGFyZ2V0VW5pdH1cIlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGl0bGU6IHJlc0J1bmRsZS5nZXRUZXh0KFwiQ19LUElDQVJEX0lORElDQVRPUl9ERVZJQVRJT05cIiksXG5cdFx0XHRcdFx0XHRcdG51bWJlcjogXCJ7ZGV2aWF0aW9uTnVtYmVyfVwiLFxuXHRcdFx0XHRcdFx0XHR1bml0OiBcIiVcIlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBEZXRhaWxzIG9mIHRoZSBjYXJkOiBmaWx0ZXIgZGVzY3JpcHRpb25zXG5cdFx0XHRcdGlmIChrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y29uc3QgYURlc2NyaXB0aW9uczogc3RyaW5nW10gPSBbXTtcblx0XHRcdFx0XHRrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucy5mb3JFYWNoKGZpbHRlckRlZmluaXRpb24gPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgZGVzYyA9IGdldEZpbHRlclN0cmluZ0Zyb21EZWZpbml0aW9uKGZpbHRlckRlZmluaXRpb24pO1xuXHRcdFx0XHRcdFx0aWYgKGRlc2MpIHtcblx0XHRcdFx0XHRcdFx0YURlc2NyaXB0aW9ucy5wdXNoKGRlc2MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0aWYgKGFEZXNjcmlwdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uaGVhZGVyLmRldGFpbHMgPSBhRGVzY3JpcHRpb25zLmpvaW4oXCIsIFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBVcGRhdGUgY2FyZCBjb250ZW50IGluIHRoZSBtYW5pZmVzdFxuXHRcdFx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uY29udGVudCA9IE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQsXG5cdFx0XHRcdFx0a3BpRGVmaW5pdGlvbi5jYXJkLmNhcmRDb250ZW50TWFuaWZlc3Rcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkLCB7XG5cdFx0XHRcdFx0bWFuaWZlc3Q6IG9DYXJkTWFuaWZlc3Rcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gTG9hZCB0YWcgZGF0YSBmb3IgdGhlIEtQSVxuXHRcdFx0XHR0aGlzLmxvYWRLUElUYWdEYXRhKGtwaURlZmluaXRpb24pLmNhdGNoKGZ1bmN0aW9uKGVycjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGVycik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0QE92ZXJyaWRlKClcblx0cHVibGljIG9uRXhpdCgpOiB2b2lkIHtcblx0XHRjb25zdCBvS1BJTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImtwaU1vZGVsXCIpIGFzIEpTT05Nb2RlbDtcblxuXHRcdGlmIChvS1BJTW9kZWwpIHtcblx0XHRcdG9LUElNb2RlbC5kZXN0cm95KCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRLUElEYXRhKCk6IEtQSURlZmluaXRpb25bXSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKSxcblx0XHRcdHNDdXN0b21EYXRhID0gb1ZpZXcuZ2V0Q29udGVudCgpWzBdLmRhdGEoXCJLUElEYXRhXCIpO1xuXG5cdFx0aWYgKHNDdXN0b21EYXRhKSB7XG5cdFx0XHRjb25zdCB2RGF0YSA9IHR5cGVvZiBzQ3VzdG9tRGF0YSA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2Uoc0N1c3RvbURhdGEpIDogc0N1c3RvbURhdGE7XG5cdFx0XHRpZiAoXCJjdXN0b21EYXRhXCIgaW4gdkRhdGEpIHtcblx0XHRcdFx0cmV0dXJuIHZEYXRhW1wiY3VzdG9tRGF0YVwiXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB2RGF0YTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZURhdGFwb2ludFZhbHVlQW5kQ3VycmVuY3koa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwga3BpQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGNvbnN0IGN1cnJlbnRMb2NhbGUgPSBuZXcgTG9jYWxlKFxuXHRcdFx0c2FwLnVpXG5cdFx0XHRcdC5nZXRDb3JlKClcblx0XHRcdFx0LmdldENvbmZpZ3VyYXRpb24oKVxuXHRcdFx0XHQuZ2V0TGFuZ3VhZ2UoKVxuXHRcdCk7XG5cdFx0Y29uc3QgcmF3VW5pdCA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LmlzUGF0aFxuXHRcdFx0PyBrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQudmFsdWUpXG5cdFx0XHQ6IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LnZhbHVlO1xuXG5cdFx0Y29uc3QgaXNQZXJjZW50YWdlID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8uaXNDdXJyZW5jeSA9PT0gZmFsc2UgJiYgcmF3VW5pdCA9PT0gXCIlXCI7XG5cdFx0Y29uc3Qgb0tQSU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJrcGlNb2RlbFwiKSBhcyBKU09OTW9kZWw7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyBNYWluIEtQSSB2YWx1ZVxuXHRcdGNvbnN0IHJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGgpKTtcblxuXHRcdC8vIFZhbHVlIGZvcm1hdHRlZCB3aXRoIGEgc2NhbGVcblx0XHRjb25zdCBrcGlWYWx1ZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRzdHlsZTogaXNQZXJjZW50YWdlID8gdW5kZWZpbmVkIDogXCJzaG9ydFwiLFxuXHRcdFx0XHRtaW5GcmFjdGlvbkRpZ2l0czogMCxcblx0XHRcdFx0bWF4RnJhY3Rpb25EaWdpdHM6IDEsXG5cdFx0XHRcdHNob3dTY2FsZTogIWlzUGVyY2VudGFnZVxuXHRcdFx0fSxcblx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHQpLmZvcm1hdChyYXdWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVcIiwga3BpVmFsdWUpO1xuXG5cdFx0Ly8gVmFsdWUgd2l0aG91dCBhIHNjYWxlXG5cdFx0Y29uc3Qga3BpVmFsdWVVbnNjYWxlZCA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMixcblx0XHRcdFx0c2hvd1NjYWxlOiBmYWxzZSxcblx0XHRcdFx0Z3JvdXBpbmdFbmFibGVkOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHJhd1ZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVVuc2NhbGVkXCIsIGtwaVZhbHVlVW5zY2FsZWQpO1xuXG5cdFx0Ly8gVmFsdWUgZm9ybWF0dGVkIHdpdGggdGhlIHNjYWxlIG9taXR0ZWRcblx0XHRjb25zdCBrcGlWYWx1ZU5vU2NhbGUgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdHtcblx0XHRcdFx0c3R5bGU6IGlzUGVyY2VudGFnZSA/IHVuZGVmaW5lZCA6IFwic2hvcnRcIixcblx0XHRcdFx0bWluRnJhY3Rpb25EaWdpdHM6IDAsXG5cdFx0XHRcdG1heEZyYWN0aW9uRGlnaXRzOiAxLFxuXHRcdFx0XHRzaG93U2NhbGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHJhd1ZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZU5vU2NhbGVcIiwga3BpVmFsdWVOb1NjYWxlKTtcblxuXHRcdC8vIFNjYWxlIG9mIHRoZSB2YWx1ZVxuXHRcdGNvbnN0IGtwaVZhbHVlU2NhbGUgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdHtcblx0XHRcdFx0c3R5bGU6IGlzUGVyY2VudGFnZSA/IHVuZGVmaW5lZCA6IFwic2hvcnRcIixcblx0XHRcdFx0ZGVjaW1hbHM6IDAsXG5cdFx0XHRcdG1heEludGVnZXJEaWdpdHM6IDAsXG5cdFx0XHRcdHNob3dTY2FsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHQpLmZvcm1hdChyYXdWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVTY2FsZVwiLCBrcGlWYWx1ZVNjYWxlKTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIFVuaXQgb3IgY3VycmVuY3lcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdCAmJiByYXdVbml0KSB7XG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdC5pc0N1cnJlbmN5KSB7XG5cdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblVuaXRcIiwgcmF3VW5pdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIHVuaXQgb2YgbWVhc3VyZSwgd2UgaGF2ZSB0byBmb3JtYXQgaXQgcHJvcGVybHlcblx0XHRcdFx0Y29uc3Qga3BpVW5pdCA9IE51bWJlckZvcm1hdC5nZXRVbml0SW5zdGFuY2UoeyBzaG93TnVtYmVyOiBmYWxzZSB9LCBjdXJyZW50TG9jYWxlKS5mb3JtYXQocmF3VmFsdWUsIHJhd1VuaXQpO1xuXHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Vbml0XCIsIGtwaVVuaXQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlRGF0YXBvaW50Q3JpdGljYWxpdHkoa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwga3BpQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGNvbnN0IHJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGgpKTtcblx0XHRjb25zdCBvS1BJTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImtwaU1vZGVsXCIpIGFzIEpTT05Nb2RlbDtcblxuXHRcdGxldCBjcml0aWNhbGl0eVZhbHVlID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlWYWx1ZSkge1xuXHRcdFx0Ly8gQ3JpdGljYWxpdHkgaXMgYSBmaXhlZCB2YWx1ZVxuXHRcdFx0Y3JpdGljYWxpdHlWYWx1ZSA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWU7XG5cdFx0fSBlbHNlIGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGgpIHtcblx0XHRcdC8vIENyaXRpY2FsaXR5IGNvbWVzIGZyb20gYW5vdGhlciBwcm9wZXJ0eSAodmlhIGEgcGF0aClcblx0XHRcdGNyaXRpY2FsaXR5VmFsdWUgPSBtZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eShrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aCkpO1xuXHRcdH0gZWxzZSBpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMgJiYga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUpIHtcblx0XHRcdC8vIENyaXRpY2FsaXR5IGNhbGN1bGF0aW9uXG5cdFx0XHRzd2l0Y2ggKGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvVGFyZ2V0XCI6XG5cdFx0XHRcdFx0Y3JpdGljYWxpdHlWYWx1ZSA9IG1lc3NhZ2VUeXBlRnJvbVRhcmdldENhbGN1bGF0aW9uKHJhd1ZhbHVlLCBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9NaW5pbWl6ZVwiOlxuXHRcdFx0XHRcdGNyaXRpY2FsaXR5VmFsdWUgPSBtZXNzYWdlVHlwZUZyb21NaW5pbWl6ZUNhbGN1bGF0aW9uKFxuXHRcdFx0XHRcdFx0cmF3VmFsdWUsXG5cdFx0XHRcdFx0XHRrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkc1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9NYXhpbWl6ZVwiOlxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGNyaXRpY2FsaXR5VmFsdWUgPSBtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uKFxuXHRcdFx0XHRcdFx0cmF3VmFsdWUsXG5cdFx0XHRcdFx0XHRrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkc1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluQ3JpdGljYWxpdHlcIiwgY3JpdGljYWxpdHlWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFxuXHRcdFx0XCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5TdGF0ZVwiLFxuXHRcdFx0dmFsdWVDb2xvckZyb21NZXNzYWdlVHlwZShjcml0aWNhbGl0eVZhbHVlKVxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZURhdGFwb2ludFRyZW5kKGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIGtwaUNvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCByYXdWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoKSk7XG5cdFx0Y29uc3Qgb0tQSU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJrcGlNb2RlbFwiKSBhcyBKU09OTW9kZWw7XG5cblx0XHRsZXQgdHJlbmRWYWx1ZSA9IFwiTm9uZVwiO1xuXG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kVmFsdWUpIHtcblx0XHRcdC8vIFRyZW5kIGlzIGEgZml4ZWQgdmFsdWVcblx0XHRcdHRyZW5kVmFsdWUgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFZhbHVlO1xuXHRcdH0gZWxzZSBpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRQYXRoKSB7XG5cdFx0XHQvLyBUcmVuZCBjb21lcyBmcm9tIGFub3RoZXIgcHJvcGVydHkgdmlhIGEgcGF0aFxuXHRcdFx0dHJlbmRWYWx1ZSA9IGRldmlhdGlvbkluZGljYXRvckZyb21UcmVuZFR5cGUoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFBhdGgpKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0a3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlICE9PSB1bmRlZmluZWQgfHxcblx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoXG5cdFx0KSB7XG5cdFx0XHQvLyBDYWxjdWxhdGVkIHRyZW5kXG5cdFx0XHRsZXQgdHJlbmRSZWZlcmVuY2VWYWx1ZTogbnVtYmVyO1xuXHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRyZW5kUmVmZXJlbmNlVmFsdWUgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0cmVuZFJlZmVyZW5jZVZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoXG5cdFx0XHRcdFx0a3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlUGF0aCB8fCBcIlwiKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0dHJlbmRWYWx1ZSA9IGRldmlhdGlvbkluZGljYXRvckZyb21DYWxjdWxhdGlvbihcblx0XHRcdFx0cmF3VmFsdWUsXG5cdFx0XHRcdHRyZW5kUmVmZXJlbmNlVmFsdWUsXG5cdFx0XHRcdCEha3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvbklzUmVsYXRpdmUsXG5cdFx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25UcmVzaG9sZHNcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90cmVuZFwiLCB0cmVuZFZhbHVlKTtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlVGFyZ2V0VmFsdWUoa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwga3BpQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFBhdGggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuOyAvLyBObyB0YXJnZXQgc2V0IGZvciB0aGUgS1BJXG5cdFx0fVxuXHRcdGNvbnN0IHJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGgpKTtcblx0XHRjb25zdCBvS1BJTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImtwaU1vZGVsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRjb25zdCBjdXJyZW50TG9jYWxlID0gbmV3IExvY2FsZShcblx0XHRcdHNhcC51aVxuXHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdC5nZXRDb25maWd1cmF0aW9uKClcblx0XHRcdFx0LmdldExhbmd1YWdlKClcblx0XHQpO1xuXG5cdFx0bGV0IHRhcmdldFJhd1ZhbHVlOiBudW1iZXI7XG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRhcmdldFJhd1ZhbHVlID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0VmFsdWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRhcmdldFJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRQYXRoIHx8IFwiXCIpKTtcblx0XHR9XG5cdFx0Y29uc3QgZGV2aWF0aW9uUmF3VmFsdWUgPSB0YXJnZXRSYXdWYWx1ZSAhPT0gMCA/ICgocmF3VmFsdWUgLSB0YXJnZXRSYXdWYWx1ZSkgLyB0YXJnZXRSYXdWYWx1ZSkgKiAxMDAgOiB1bmRlZmluZWQ7XG5cblx0XHQvLyBGb3JtYXR0aW5nXG5cdFx0Y29uc3QgdGFyZ2V0VmFsdWUgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdHtcblx0XHRcdFx0c3R5bGU6IFwic2hvcnRcIixcblx0XHRcdFx0bWluRnJhY3Rpb25EaWdpdHM6IDAsXG5cdFx0XHRcdG1heEZyYWN0aW9uRGlnaXRzOiAxLFxuXHRcdFx0XHRzaG93U2NhbGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHRhcmdldFJhd1ZhbHVlKTtcblx0XHRjb25zdCB0YXJnZXRTY2FsZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRzdHlsZTogXCJzaG9ydFwiLFxuXHRcdFx0XHRkZWNpbWFsczogMCxcblx0XHRcdFx0bWF4SW50ZWdlckRpZ2l0czogMCxcblx0XHRcdFx0c2hvd1NjYWxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHRhcmdldFJhd1ZhbHVlKTtcblxuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vdGFyZ2V0TnVtYmVyXCIsIHRhcmdldFZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL3RhcmdldFVuaXRcIiwgdGFyZ2V0U2NhbGUpO1xuXG5cdFx0aWYgKGRldmlhdGlvblJhd1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IGRldmlhdGlvblZhbHVlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRtaW5GcmFjdGlvbkRpZ2l0czogMCxcblx0XHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMSxcblx0XHRcdFx0XHRzaG93U2NhbGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHRcdCkuZm9ybWF0KGRldmlhdGlvblJhd1ZhbHVlKTtcblx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vZGV2aWF0aW9uTnVtYmVyXCIsIGRldmlhdGlvblZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9kZXZpYXRpb25OdW1iZXJcIiwgXCJOL0FcIik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvYWRzIHRhZyBkYXRhIGZvciBhIEtQSSwgYW5kIHN0b3JlcyBpdCBpbiB0aGUgSlNPTiBLUEkgbW9kZWwuXG5cdCAqXG5cdCAqIEBwYXJhbSB7S1BJRGVmaW5pdGlvbn0ga3BpRGVmaW5pdGlvbiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgS1BJLlxuXHQgKiBAcGFyYW0gbG9hZEZ1bGwgSWYgbm90IHRydWUsIGxvYWRzIG9ubHkgZGF0YSBmb3IgdGhlIEtQSSB0YWdcblx0ICogQHJldHVybnMge1Byb21pc2V9IFJldHVybnMgdGhlIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIGRhdGEgaXMgbG9hZGVkLlxuXHQgKi9cblx0cHJvdGVjdGVkIGxvYWRLUElUYWdEYXRhKGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIGxvYWRGdWxsPzogYm9vbGVhbik6IGFueSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldE1vZGVsKCk7XG5cdFx0Y29uc3Qgb0tQSU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJrcGlNb2RlbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb01vZGVsLmJpbmRMaXN0KFwiL1wiICsga3BpRGVmaW5pdGlvbi5lbnRpdHlTZXQpO1xuXHRcdGNvbnN0IG9BZ2dyZWdhdGU6IFJlY29yZDxzdHJpbmcsIHsgdW5pdD86IHN0cmluZyB9PiA9IHt9O1xuXG5cdFx0Ly8gTWFpbiB2YWx1ZSArIGN1cnJlbmN5L3VuaXRcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8uaXNQYXRoKSB7XG5cdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aF0gPSB7IHVuaXQ6IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQudmFsdWUgfTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0FnZ3JlZ2F0ZVtrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0fVxuXG5cdFx0Ly8gUHJvcGVydHkgZm9yIGNyaXRpY2FsaXR5XG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aCkge1xuXHRcdFx0b0FnZ3JlZ2F0ZVtrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGhdID0ge307XG5cdFx0fVxuXG5cdFx0Ly8gUHJvcGVydGllcyBmb3IgdHJlbmQgYW5kIHRyZW5kIGNhbGN1bGF0aW9uXG5cdFx0aWYgKGxvYWRGdWxsKSB7XG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRQYXRoKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRQYXRoXSA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGhdID0ge307XG5cdFx0XHR9XG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0UGF0aCkge1xuXHRcdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFBhdGhdID0ge307XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0b0xpc3RCaW5kaW5nLnNldEFnZ3JlZ2F0aW9uKHsgYWdncmVnYXRlOiBvQWdncmVnYXRlIH0pO1xuXG5cdFx0Ly8gTWFuYWdlIFNlbGVjdGlvblZhcmlhbnQgZmlsdGVyc1xuXHRcdGlmIChrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBhRmlsdGVycyA9IGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zLm1hcChjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbik7XG5cdFx0XHRvTGlzdEJpbmRpbmcuZmlsdGVyKGFGaWx0ZXJzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb0xpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCAxKS50aGVuKChhQ29udGV4dHM6IENvbnRleHRbXSkgPT4ge1xuXHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0Y29uc3QgcmF3VW5pdCA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LmlzUGF0aFxuXHRcdFx0XHRcdD8gYUNvbnRleHRzWzBdLmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQudmFsdWUpXG5cdFx0XHRcdFx0OiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py52YWx1ZTtcblxuXHRcdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdCAmJiAhcmF3VW5pdCkge1xuXHRcdFx0XHRcdC8vIEEgdW5pdC9jdXJyZW5jeSBpcyBkZWZpbmVkLCBidXQgaXRzIHZhbHVlIGlzIHVuZGVmaW5lZCAtLT4gbXVsdGktdW5pdCBzaXR1YXRpb25cblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVwiLCBcIipcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVVbnNjYWxlZFwiLCBcIipcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVOb1NjYWxlXCIsIFwiKlwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVNjYWxlXCIsIFwiXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblVuaXRcIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Dcml0aWNhbGl0eVwiLCBNZXNzYWdlVHlwZS5Ob25lKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5TdGF0ZVwiLCBcIk5vbmVcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90cmVuZFwiLCBcIk5vbmVcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90YXJnZXROdW1iZXJcIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL3RhcmdldFVuaXRcIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL2RldmlhdGlvbk51bWJlclwiLCB1bmRlZmluZWQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRGF0YXBvaW50VmFsdWVBbmRDdXJyZW5jeShrcGlEZWZpbml0aW9uLCBhQ29udGV4dHNbMF0pO1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRGF0YXBvaW50Q3JpdGljYWxpdHkoa3BpRGVmaW5pdGlvbiwgYUNvbnRleHRzWzBdKTtcblxuXHRcdFx0XHRcdGlmIChsb2FkRnVsbCkge1xuXHRcdFx0XHRcdFx0dGhpcy51cGRhdGVEYXRhcG9pbnRUcmVuZChrcGlEZWZpbml0aW9uLCBhQ29udGV4dHNbMF0pO1xuXHRcdFx0XHRcdFx0dGhpcy51cGRhdGVUYXJnZXRWYWx1ZShrcGlEZWZpbml0aW9uLCBhQ29udGV4dHNbMF0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJvdGVjdGVkIGxvYWRLUElDYXJkRGF0YShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uKTogYW55IHtcblx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvTW9kZWwuYmluZExpc3QoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmVudGl0eVNldCk7XG5cdFx0Y29uc3Qgb0dyb3VwOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3Q+ID0ge307XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0ZTogUmVjb3JkPHN0cmluZywgT2JqZWN0PiA9IHt9O1xuXHRcdGNvbnN0IG9LUElNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwia3BpTW9kZWxcIikgYXMgSlNPTk1vZGVsO1xuXG5cdFx0a3BpRGVmaW5pdGlvbi5jYXJkLmRpbWVuc2lvbnMuZm9yRWFjaChmdW5jdGlvbihzRGltZW5zaW9uTmFtZSkge1xuXHRcdFx0b0dyb3VwW3NEaW1lbnNpb25OYW1lXSA9IHt9O1xuXHRcdH0pO1xuXHRcdGtwaURlZmluaXRpb24uY2FyZC5tZWFzdXJlcy5mb3JFYWNoKGZ1bmN0aW9uKHNNZWFzdXJlTmFtZSkge1xuXHRcdFx0b0FnZ3JlZ2F0ZVtzTWVhc3VyZU5hbWVdID0ge307XG5cdFx0fSk7XG5cdFx0b0xpc3RCaW5kaW5nLnNldEFnZ3JlZ2F0aW9uKHtcblx0XHRcdGdyb3VwOiBvR3JvdXAsXG5cdFx0XHRhZ2dyZWdhdGU6IG9BZ2dyZWdhdGVcblx0XHR9KTtcblxuXHRcdC8vIE1hbmFnZSBTZWxlY3Rpb25WYXJpYW50IGZpbHRlcnNcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5zZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYUZpbHRlcnMgPSBrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucy5tYXAoY3JlYXRlRmlsdGVyRnJvbURlZmluaXRpb24pO1xuXHRcdFx0b0xpc3RCaW5kaW5nLmZpbHRlcihhRmlsdGVycyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9MaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCkudGhlbigoYUNvbnRleHRzOiBDb250ZXh0W10pID0+IHtcblx0XHRcdGNvbnN0IGNoYXJ0RGF0YSA9IGFDb250ZXh0cy5tYXAoZnVuY3Rpb24ob0NvbnRleHQpIHtcblx0XHRcdFx0Y29uc3Qgb0RhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblx0XHRcdFx0a3BpRGVmaW5pdGlvbi5jYXJkLmRpbWVuc2lvbnMuZm9yRWFjaChmdW5jdGlvbihzRGltZW5zaW9uTmFtZSkge1xuXHRcdFx0XHRcdG9EYXRhW3NEaW1lbnNpb25OYW1lXSA9IG9Db250ZXh0LmdldFByb3BlcnR5KHNEaW1lbnNpb25OYW1lKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGtwaURlZmluaXRpb24uY2FyZC5tZWFzdXJlcy5mb3JFYWNoKGZ1bmN0aW9uKHNNZWFzdXJlTmFtZSkge1xuXHRcdFx0XHRcdG9EYXRhW3NNZWFzdXJlTmFtZV0gPSBvQ29udGV4dC5nZXRQcm9wZXJ0eShzTWVhc3VyZU5hbWUpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRyZXR1cm4gb0RhdGE7XG5cdFx0XHR9KTtcblxuXHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9jaGFydERhdGFcIiwgY2hhcnREYXRhKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwb3BvdmVyIHRvIGRpc3BsYXkgdGhlIEtQSSBjYXJkXG5cdCAqIFRoZSBwb3BvdmVyIGFuZCB0aGUgY29udGFpbmVkIGNhcmQgZm9yIHRoZSBLUElzIGFyZSBjcmVhdGVkIGlmIG5lY2Vzc2FyeS5cblx0ICogVGhlIHBvcG92ZXIgaXMgc2hhcmVkIGJldHdlZW4gYWxsIEtQSXMsIHNvIHdlIGNyZWF0ZSBpdCBvbmx5IG9uY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBvS1BJVGFnIFRoZSBUYWcgdGhhdCB0cmlnZ2VyZWQgdGhlIHBvcG92ZXIgb3BlbmluZy5cblx0ICogQHJldHVybnMgVGhlIHNoYXJlZCBwb3BvdmVyLlxuXHQgKi9cblx0cHJvdGVjdGVkIGdldFBvcG92ZXIob0tQSVRhZzogR2VuZXJpY1RhZyk6IFBvcG92ZXIge1xuXHRcdGlmICghdGhpcy5vUG9wb3Zlcikge1xuXHRcdFx0dGhpcy5vQ2FyZCA9IG5ldyBDYXJkKHtcblx0XHRcdFx0d2lkdGg6IFwiMjVyZW1cIixcblx0XHRcdFx0aGVpZ2h0OiBcImF1dG9cIlxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMub1BvcG92ZXIgPSBuZXcgUG9wb3Zlcih7XG5cdFx0XHRcdGlkOiBcImtwaS1Qb3BvdmVyXCIsXG5cdFx0XHRcdHNob3dIZWFkZXI6IGZhbHNlLFxuXHRcdFx0XHRwbGFjZW1lbnQ6IFwiQXV0b1wiLFxuXHRcdFx0XHRjb250ZW50OiBbdGhpcy5vQ2FyZF1cblx0XHRcdH0pO1xuXG5cdFx0XHRvS1BJVGFnLmFkZERlcGVuZGVudCh0aGlzLm9Qb3BvdmVyKTsgLy8gVGhlIGZpcnN0IGNsaWNrZWQgdGFnIGdldHMgdGhlIHBvcG92ZXIgYXMgZGVwZW5kZW50XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMub1BvcG92ZXI7XG5cdH1cblxuXHRAUHVibGljXG5cdHB1YmxpYyBvbktQSVByZXNzZWQob0tQSVRhZzogYW55LCBrcGlJRDogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0tQSU1vZGVsID0gb0tQSVRhZy5nZXRNb2RlbChcImtwaU1vZGVsXCIpIGFzIEpTT05Nb2RlbDtcblxuXHRcdGlmICh0aGlzLmFLUElEZWZpbml0aW9ucyAmJiB0aGlzLmFLUElEZWZpbml0aW9ucy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGtwaURlZmluaXRpb24gPSB0aGlzLmFLUElEZWZpbml0aW9ucy5maW5kKGZ1bmN0aW9uKG9EZWYpIHtcblx0XHRcdFx0cmV0dXJuIG9EZWYuaWQgPT09IGtwaUlEO1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChrcGlEZWZpbml0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IGFQcm9taXNlcyA9IFt0aGlzLmxvYWRLUElUYWdEYXRhKGtwaURlZmluaXRpb24sIHRydWUpLCB0aGlzLmxvYWRLUElDYXJkRGF0YShrcGlEZWZpbml0aW9uKV07XG5cdFx0XHRcdGNvbnN0IG9Qb3BvdmVyID0gdGhpcy5nZXRQb3BvdmVyKG9LUElUYWcpO1xuXG5cdFx0XHRcdFByb21pc2UuYWxsKGFQcm9taXNlcylcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLm9DYXJkLnNldE1hbmlmZXN0KG9LUElNb2RlbC5nZXRQcm9wZXJ0eShcIi9cIiArIGtwaUlEICsgXCIvbWFuaWZlc3RcIikpO1xuXHRcdFx0XHRcdFx0dGhpcy5vQ2FyZC5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRvUG9wb3Zlci5vcGVuQnkob0tQSVRhZywgZmFsc2UpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGVyciA9PiB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgS1BJTWFuYWdlbWVudENvbnRyb2xsZXJFeHRlbnNpb247XG4iXX0=
|
|
1093
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIktQSU1hbmFnZW1lbnQudHMiXSwibmFtZXMiOlsiTWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHkiLCJNZXNzYWdlVHlwZSIsIkVycm9yIiwiV2FybmluZyIsIlN1Y2Nlc3MiLCJJbmZvcm1hdGlvbiIsIlZhbHVlQ29sb3JGcm9tTWVzc2FnZVR5cGUiLCJOb25lIiwibWVzc2FnZVR5cGVGcm9tVGFyZ2V0Q2FsY3VsYXRpb24iLCJrcGlWYWx1ZSIsImFUaHJlc2hvbGRzIiwiY3JpdGljYWxpdHlQcm9wZXJ0eSIsInVuZGVmaW5lZCIsIm1lc3NhZ2VUeXBlRnJvbU1pbmltaXplQ2FsY3VsYXRpb24iLCJtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uIiwiZGV2aWF0aW9uSW5kaWNhdG9yRnJvbVRyZW5kVHlwZSIsInRyZW5kVmFsdWUiLCJkZXZpYXRpb25JbmRpY2F0b3IiLCJkZXZpYXRpb25JbmRpY2F0b3JGcm9tQ2FsY3VsYXRpb24iLCJyZWZlcmVuY2VWYWx1ZSIsImlzUmVsYXRpdmUiLCJjb21wVmFsdWUiLCJjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbiIsImZpbHRlckRlZmluaXRpb24iLCJyYW5nZXMiLCJsZW5ndGgiLCJGaWx0ZXIiLCJwcm9wZXJ0eVBhdGgiLCJvcGVyYXRvciIsInJhbmdlTG93IiwicmFuZ2VIaWdoIiwiYVJhbmdlRmlsdGVycyIsIm1hcCIsInJhbmdlIiwiZmlsdGVycyIsImFuZCIsImdldEZpbHRlclN0cmluZ0Zyb21EZWZpbml0aW9uIiwiY3VycmVudExvY2FsZSIsIkxvY2FsZSIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldENvbmZpZ3VyYXRpb24iLCJnZXRMYW5ndWFnZSIsInJlc0J1bmRsZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImRhdGVGb3JtYXQiLCJEYXRlRm9ybWF0IiwiZ2V0RGF0ZUluc3RhbmNlIiwic3R5bGUiLCJmb3JtYXRSYW5nZSIsInZhbHVlTG93IiwicHJvcGVydHlUeXBlIiwiaW5kZXhPZiIsImZvcm1hdCIsIkRhdGUiLCJ2YWx1ZUhpZ2giLCJnZXRUZXh0Iiwiam9pbiIsImZvcm1hdENoYXJ0VGl0bGUiLCJrcGlEZWYiLCJmb3JtYXRMaXN0IiwiaXRlbXMiLCJsYWJlbCIsInJlcyIsIkkiLCJjaGFydCIsIm1lYXN1cmVzIiwiZGltZW5zaW9ucyIsInVwZGF0ZUNoYXJ0TGFiZWxTZXR0aW5ncyIsImNoYXJ0RGVmaW5pdGlvbiIsIm9DaGFydFByb3BlcnRpZXMiLCJjaGFydFR5cGUiLCJjYXRlZ29yeUF4aXMiLCJ0aXRsZSIsInZpc2libGUiLCJ2YWx1ZUF4aXMiLCJmb3JtYXRTdHJpbmciLCJwbG90QXJlYSIsImRhdGFMYWJlbCIsInR5cGUiLCJ2YWx1ZUF4aXMyIiwibGVnZW5kR3JvdXAiLCJsYXlvdXQiLCJwb3NpdGlvbiIsImFsaWdubWVudCIsInNpemVMZWdlbmQiLCJmaWx0ZXJNYXAiLCJhT2JqZWN0cyIsImFSb2xlcyIsImZpbHRlciIsImRpbWVuc2lvbiIsInJvbGUiLCJnZXRTY2F0dGVyQnViYmxlQ2hhcnRGZWVkcyIsImF4aXMxTWVhc3VyZXMiLCJheGlzMk1lYXN1cmVzIiwiYXhpczNNZWFzdXJlcyIsIm90aGVyTWVhc3VyZXMiLCJzZXJpZXNEaW1lbnNpb25zIiwic2hhcGVEaW1lbnNpb24iLCJmaW5kIiwieE1lYXN1cmUiLCJzaGlmdCIsInlNZWFzdXJlIiwic2l6ZU1lYXN1cmUiLCJwdXNoIiwiZ2V0Q2hhcnRGZWVkcyIsIktQSU1hbmFnZW1lbnRDb250cm9sbGVyRXh0ZW5zaW9uIiwiVUk1Q2xhc3MiLCJDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEiLCJPdmVycmlkZSIsImtwaURlZmluaXRpb24iLCJvS1BJTW9kZWwiLCJvQ2FyZE1hbmlmZXN0IiwiaWQiLCJ0ZWNobm9sb2d5IiwiZGF0YSIsImpzb24iLCJoZWFkZXIiLCJkYXRhcG9pbnQiLCJzdWJUaXRsZSIsImRlc2NyaXB0aW9uIiwidW5pdE9mTWVhc3VyZW1lbnQiLCJtYWluSW5kaWNhdG9yIiwibnVtYmVyIiwidW5pdCIsInN0YXRlIiwidHJlbmQiLCJjb250ZW50IiwibWluSGVpZ2h0IiwiY2hhcnRQcm9wZXJ0aWVzIiwicGF0aCIsInRhcmdldFBhdGgiLCJ0YXJnZXRWYWx1ZSIsInNpZGVJbmRpY2F0b3JzIiwic2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zIiwiYURlc2NyaXB0aW9ucyIsImZvckVhY2giLCJkZXNjIiwiZGV0YWlscyIsInRleHQiLCJ2YWx1ZSIsIm5hbWUiLCJtZWFzdXJlIiwiZmVlZHMiLCJzZXRQcm9wZXJ0eSIsIm1hbmlmZXN0IiwiYUtQSURlZmluaXRpb25zIiwiZ2V0S1BJRGF0YSIsIm9WaWV3IiwiZ2V0VmlldyIsIm9BcHBDb21wb25lbnQiLCJnZXRDb250cm9sbGVyIiwiZ2V0QXBwQ29tcG9uZW50IiwiSlNPTk1vZGVsIiwic2V0TW9kZWwiLCJpbml0Q2FyZE1hbmlmZXN0IiwibG9hZEtQSVRhZ0RhdGEiLCJnZXRNb2RlbCIsImNhdGNoIiwiZXJyIiwiTG9nIiwiZXJyb3IiLCJkZXN0cm95Iiwic0N1c3RvbURhdGEiLCJnZXRDb250ZW50IiwidkRhdGEiLCJKU09OIiwicGFyc2UiLCJrcGlDb250ZXh0IiwicmF3VW5pdCIsImlzUGF0aCIsImdldFByb3BlcnR5IiwiaXNQZXJjZW50YWdlIiwiaXNDdXJyZW5jeSIsInJhd1ZhbHVlIiwiTnVtYmVyIiwicGFyc2VGbG9hdCIsIk51bWJlckZvcm1hdCIsImdldEZsb2F0SW5zdGFuY2UiLCJtaW5GcmFjdGlvbkRpZ2l0cyIsIm1heEZyYWN0aW9uRGlnaXRzIiwic2hvd1NjYWxlIiwia3BpVmFsdWVVbnNjYWxlZCIsImdyb3VwaW5nRW5hYmxlZCIsImtwaVZhbHVlTm9TY2FsZSIsImtwaVZhbHVlU2NhbGUiLCJkZWNpbWFscyIsIm1heEludGVnZXJEaWdpdHMiLCJrcGlVbml0IiwiZ2V0VW5pdEluc3RhbmNlIiwic2hvd051bWJlciIsImNyaXRpY2FsaXR5VmFsdWUiLCJjcml0aWNhbGl0eVBhdGgiLCJjcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcyIsImNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlIiwidHJlbmRQYXRoIiwidHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlIiwidHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGgiLCJ0cmVuZFJlZmVyZW5jZVZhbHVlIiwidHJlbmRDYWxjdWxhdGlvbklzUmVsYXRpdmUiLCJ0cmVuZENhbGN1bGF0aW9uVHJlc2hvbGRzIiwidGFyZ2V0UmF3VmFsdWUiLCJkZXZpYXRpb25SYXdWYWx1ZSIsInRhcmdldFNjYWxlIiwiZGV2aWF0aW9uVmFsdWUiLCJvTWFpbk1vZGVsIiwibG9hZEZ1bGwiLCJvTGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsImVudGl0eVNldCIsIiQkZ3JvdXBJZCIsIm9BZ2dyZWdhdGUiLCJzZXRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0ZSIsImFGaWx0ZXJzIiwicmVxdWVzdENvbnRleHRzIiwidGhlbiIsImFDb250ZXh0cyIsInVwZGF0ZURhdGFwb2ludFZhbHVlQW5kQ3VycmVuY3kiLCJ1cGRhdGVEYXRhcG9pbnRDcml0aWNhbGl0eSIsInVwZGF0ZURhdGFwb2ludFRyZW5kIiwidXBkYXRlVGFyZ2V0VmFsdWUiLCJvR3JvdXAiLCJncm91cCIsInNvcnRPcmRlciIsInNvcnQiLCJzb3J0SW5mbyIsIlNvcnRlciIsImRlc2NlbmRpbmciLCJtYXhJdGVtcyIsImNoYXJ0RGF0YSIsIm9Db250ZXh0Iiwib0RhdGEiLCJvS1BJVGFnIiwib1BvcG92ZXIiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImxvYWRMaWJyYXJ5IiwiYXN5bmMiLCJyZXF1aXJlIiwiQ2FyZCIsIm9DYXJkIiwid2lkdGgiLCJoZWlnaHQiLCJQb3BvdmVyIiwic2hvd0hlYWRlciIsInBsYWNlbWVudCIsImFkZERlcGVuZGVudCIsImtwaUlEIiwib0RlZiIsIm9Nb2RlbCIsImFQcm9taXNlcyIsImxvYWRLUElDYXJkRGF0YSIsImdldFBvcG92ZXIiLCJhbGwiLCJhUmVzdWx0cyIsInNldE1hbmlmZXN0IiwicmVmcmVzaCIsIm9wZW5CeSIsIkNvbnRyb2xsZXJFeHRlbnNpb24iLCJQdWJsaWMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWFBLE1BQU1BLDBCQUF1RCxHQUFHO0FBQy9ELFNBQUtDLFdBQVcsQ0FBQ0MsS0FEOEM7QUFFL0QsU0FBS0QsV0FBVyxDQUFDRSxPQUY4QztBQUcvRCxTQUFLRixXQUFXLENBQUNHLE9BSDhDO0FBSS9ELFNBQUtILFdBQVcsQ0FBQ0k7QUFKOEMsR0FBaEU7QUFPQSxNQUFNQyx5QkFBc0QsR0FBRztBQUM5REosSUFBQUEsS0FBSyxFQUFFLE9BRHVEO0FBRTlEQyxJQUFBQSxPQUFPLEVBQUUsVUFGcUQ7QUFHOURDLElBQUFBLE9BQU8sRUFBRSxNQUhxRDtBQUk5REMsSUFBQUEsV0FBVyxFQUFFLE1BSmlEO0FBSzlERSxJQUFBQSxJQUFJLEVBQUU7QUFMd0QsR0FBL0Q7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxXQUFTQyxnQ0FBVCxDQUEwQ0MsUUFBMUMsRUFBNERDLFdBQTVELEVBQXFIO0FBQ3BILFFBQUlDLG1CQUFKOztBQUVBLFFBQUlELFdBQVcsQ0FBQyxDQUFELENBQVgsS0FBbUJFLFNBQW5CLElBQWdDRixXQUFXLENBQUMsQ0FBRCxDQUFYLEtBQW1CLElBQW5ELElBQTJERCxRQUFRLEdBQUdDLFdBQVcsQ0FBQyxDQUFELENBQXJGLEVBQTBGO0FBQ3pGQyxNQUFBQSxtQkFBbUIsR0FBR1YsV0FBVyxDQUFDQyxLQUFsQztBQUNBLEtBRkQsTUFFTyxJQUFJUSxXQUFXLENBQUMsQ0FBRCxDQUFYLEtBQW1CRSxTQUFuQixJQUFnQ0YsV0FBVyxDQUFDLENBQUQsQ0FBWCxLQUFtQixJQUFuRCxJQUEyREQsUUFBUSxHQUFHQyxXQUFXLENBQUMsQ0FBRCxDQUFyRixFQUEwRjtBQUNoR0MsTUFBQUEsbUJBQW1CLEdBQUdWLFdBQVcs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b3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udHJvbGxlckV4dGVuc2lvbiB9IGZyb20gXCJzYXAvdWkvY29yZS9tdmNcIjtcbmltcG9ydCB7IENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9uc1wiO1xuaW1wb3J0IHsgVUk1Q2xhc3MsIE92ZXJyaWRlLCBQdWJsaWMgfSBmcm9tIFwiLi4vaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IEpTT05Nb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvanNvblwiO1xuaW1wb3J0IHsgT0RhdGFNb2RlbCwgQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcbmltcG9ydCB7IExvZyB9IGZyb20gXCJzYXAvYmFzZVwiO1xuaW1wb3J0IHsgS1BJQ2hhcnREZWZpbml0aW9uLCBLUElEZWZpbml0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL0tQSVwiO1xuaW1wb3J0IHsgQmFzZUNvbnRyb2xsZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmVcIjtcbmltcG9ydCB7IE1lc3NhZ2VUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2Zvcm1hdHRlcnMvVGFibGVGb3JtYXR0ZXJUeXBlc1wiO1xuaW1wb3J0IHsgRmlsdGVyRGVmaW5pdGlvbiwgUmFuZ2VEZWZpbml0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9TZWxlY3Rpb25WYXJpYW50SGVscGVyXCI7XG5pbXBvcnQgeyBOdW1iZXJGb3JtYXQsIERhdGVGb3JtYXQgfSBmcm9tIFwic2FwL3VpL2NvcmUvZm9ybWF0XCI7XG5pbXBvcnQgeyBMb2NhbGUgfSBmcm9tIFwic2FwL3VpL2NvcmVcIjtcbmltcG9ydCB7IEZpbHRlciwgRmlsdGVyT3BlcmF0b3IsIFNvcnRlciB9IGZyb20gXCJzYXAvdWkvbW9kZWxcIjtcbmltcG9ydCB7IEdlbmVyaWNUYWcsIFBvcG92ZXIgfSBmcm9tIFwic2FwL21cIjtcblxuY29uc3QgTWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHk6IFJlY29yZDxzdHJpbmcsIE1lc3NhZ2VUeXBlPiA9IHtcblx0XCIxXCI6IE1lc3NhZ2VUeXBlLkVycm9yLFxuXHRcIjJcIjogTWVzc2FnZVR5cGUuV2FybmluZyxcblx0XCIzXCI6IE1lc3NhZ2VUeXBlLlN1Y2Nlc3MsXG5cdFwiNVwiOiBNZXNzYWdlVHlwZS5JbmZvcm1hdGlvblxufTtcblxuY29uc3QgVmFsdWVDb2xvckZyb21NZXNzYWdlVHlwZTogUmVjb3JkPE1lc3NhZ2VUeXBlLCBzdHJpbmc+ID0ge1xuXHRFcnJvcjogXCJFcnJvclwiLFxuXHRXYXJuaW5nOiBcIkNyaXRpY2FsXCIsXG5cdFN1Y2Nlc3M6IFwiR29vZFwiLFxuXHRJbmZvcm1hdGlvbjogXCJOb25lXCIsXG5cdE5vbmU6IFwiTm9uZVwiXG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGdldCBhIG1lc3NhZ2Ugc3RhdGUgZnJvbSBhIGNhbGN1bGF0ZWQgY3JpdGljYWxpdHkgb2YgdHlwZSAnVGFyZ2V0Jy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUEkgdG8gYmUgdGVzdGVkIGFnYWluc3QuXG4gKiBAcGFyYW0ge251bWJlcltdfSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0RldmlhdGlvblJhbmdlTG93VmFsdWUsVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUsVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWUsRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVdLlxuICogQHJldHVybnMge01lc3NhZ2VUeXBlfSBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIE1lc3NhZ2VUeXBlXG4gKi9cbmZ1bmN0aW9uIG1lc3NhZ2VUeXBlRnJvbVRhcmdldENhbGN1bGF0aW9uKGtwaVZhbHVlOiBudW1iZXIsIGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSk6IE1lc3NhZ2VUeXBlIHtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IE1lc3NhZ2VUeXBlO1xuXG5cdGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGtwaVZhbHVlIDwgYVRocmVzaG9sZHNbMF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1sxXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMl0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1syXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbNV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1s1XSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA+IGFUaHJlc2hvbGRzWzVdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzRdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbNF0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1s0XSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzNdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbM10gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1szXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZ2V0IGEgbWVzc2FnZSBzdGF0ZSBmcm9tIGEgY2FsY3VsYXRlZCBjcml0aWNhbGl0eSBvZiB0eXBlICdNaW5pbWl6ZScuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGtwaVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgS1BJIHRvIGJlIHRlc3RlZCBhZ2FpbnN0LlxuICogQHBhcmFtIHtudW1iZXJbXX0gYVRocmVzaG9sZHMgVGhyZXNob2xkcyB0byBiZSB1c2VkIFtBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUsVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWUsRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVdLlxuICogQHJldHVybnMge01lc3NhZ2VUeXBlfSBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIE1lc3NhZ2VUeXBlXG4gKi9cbmZ1bmN0aW9uIG1lc3NhZ2VUeXBlRnJvbU1pbmltaXplQ2FsY3VsYXRpb24oa3BpVmFsdWU6IG51bWJlciwgYVRocmVzaG9sZHM6IChudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsKVtdKTogTWVzc2FnZVR5cGUge1xuXHRsZXQgY3JpdGljYWxpdHlQcm9wZXJ0eTogTWVzc2FnZVR5cGU7XG5cblx0aWYgKGFUaHJlc2hvbGRzWzJdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMl0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1syXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5FcnJvcjtcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1sxXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzFdICE9PSBudWxsICYmIGtwaVZhbHVlID4gYVRocmVzaG9sZHNbMV0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuV2FybmluZztcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGtwaVZhbHVlID4gYVRocmVzaG9sZHNbMF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0fSBlbHNlIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuU3VjY2Vzcztcblx0fVxuXG5cdHJldHVybiBjcml0aWNhbGl0eVByb3BlcnR5O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGdldCBhIG1lc3NhZ2Ugc3RhdGUgZnJvbSBhIGNhbGN1bGF0ZWQgY3JpdGljYWxpdHkgb2YgdHlwZSAnTWF4aW1pemUnLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBrcGlWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIEtQSSB0byBiZSB0ZXN0ZWQgYWdhaW5zdC5cbiAqIEBwYXJhbSB7bnVtYmVyW119IGFUaHJlc2hvbGRzIFRocmVzaG9sZHMgdG8gYmUgdXNlZCBbRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZSxUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlLEFjY2VwdGFuY2VSYW5nZUxvd1ZhbHVlXS5cbiAqIEByZXR1cm5zIHtNZXNzYWdlVHlwZX0gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBNZXNzYWdlVHlwZVxuICovXG5mdW5jdGlvbiBtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uKGtwaVZhbHVlOiBudW1iZXIsIGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSk6IE1lc3NhZ2VUeXBlIHtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IE1lc3NhZ2VUeXBlO1xuXG5cdGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGtwaVZhbHVlIDwgYVRocmVzaG9sZHNbMF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1sxXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMl0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1syXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH0gZWxzZSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLlN1Y2Nlc3M7XG5cdH1cblxuXHRyZXR1cm4gY3JpdGljYWxpdHlQcm9wZXJ0eTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYSBEZXZpYXRpb25JbmRpY2F0b3IgdmFsdWUgZnJvbSBhIHRyZW5kIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdHJlbmRWYWx1ZSBUaGUgY3JpdGljYWxpdHkgdmFsdWVzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBEZXZpYXRpb25JbmRpY2F0b3IgdmFsdWVcbiAqL1xuZnVuY3Rpb24gZGV2aWF0aW9uSW5kaWNhdG9yRnJvbVRyZW5kVHlwZSh0cmVuZFZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xuXHRsZXQgZGV2aWF0aW9uSW5kaWNhdG9yOiBzdHJpbmc7XG5cblx0c3dpdGNoICh0cmVuZFZhbHVlKSB7XG5cdFx0Y2FzZSAxOiAvLyBTdHJvbmdVcFxuXHRcdGNhc2UgXCIxXCI6XG5cdFx0Y2FzZSAyOiAvLyBVcFxuXHRcdGNhc2UgXCIyXCI6XG5cdFx0XHRkZXZpYXRpb25JbmRpY2F0b3IgPSBcIlVwXCI7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgNDogLy8gRG93blxuXHRcdGNhc2UgXCI0XCI6XG5cdFx0Y2FzZSA1OiAvLyBTdHJvbmdEb3duXG5cdFx0Y2FzZSBcIjVcIjpcblx0XHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJOb25lXCI7XG5cdH1cblxuXHRyZXR1cm4gZGV2aWF0aW9uSW5kaWNhdG9yO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBhIERldmlhdGlvbkluZGljYXRvciBmcm9tIGEgVHJlbmRDYWxjdWxhdGlvbi5cbiAqXG4gKiBAcGFyYW0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUElcbiAqIEBwYXJhbSByZWZlcmVuY2VWYWx1ZSBUaGUgcmVmZXJlbmNlIHZhbHVlIHRvIGNvbXBhcmUgd2l0aFxuICogQHBhcmFtIGlzUmVsYXRpdmUgVHJ1ZSBpcyB0aGUgY29tcGFyaXNvbiBpcyByZWxhdGl2ZVxuICogQHBhcmFtIGFUaHJlc2hvbGRzIEFycmF5IG9mIHRocmVzaG9sZHMgW1N0cm9uZ0Rvd25EaWZmZXJlbmNlLCBEb3duRGlmZmVyZW5jZSwgVXBEaWZmZXJlbmNlLCBTdHJvbmdVcERpZmZlcmVuY2VdXG4gKiBAcmV0dXJucyB7c2FwLm0uRGV2aWF0aW9uSW5kaWNhdG9yfSBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIERldmlhdGlvbkluZGljYXRvciB2YWx1ZVxuICovXG5mdW5jdGlvbiBkZXZpYXRpb25JbmRpY2F0b3JGcm9tQ2FsY3VsYXRpb24oXG5cdGtwaVZhbHVlOiBudW1iZXIsXG5cdHJlZmVyZW5jZVZhbHVlOiBudW1iZXIsXG5cdGlzUmVsYXRpdmU6IGJvb2xlYW4sXG5cdGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHtcblx0bGV0IGRldmlhdGlvbkluZGljYXRvcjogc3RyaW5nO1xuXG5cdGlmICghYVRocmVzaG9sZHMgfHwgKGlzUmVsYXRpdmUgJiYgIXJlZmVyZW5jZVZhbHVlKSkge1xuXHRcdHJldHVybiBcIk5vbmVcIjtcblx0fVxuXG5cdGNvbnN0IGNvbXBWYWx1ZSA9IGlzUmVsYXRpdmUgPyAoa3BpVmFsdWUgLSByZWZlcmVuY2VWYWx1ZSkgLyByZWZlcmVuY2VWYWx1ZSA6IGtwaVZhbHVlIC0gcmVmZXJlbmNlVmFsdWU7XG5cblx0aWYgKGFUaHJlc2hvbGRzWzBdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMF0gIT09IG51bGwgJiYgY29tcFZhbHVlIDw9IGFUaHJlc2hvbGRzWzBdKSB7XG5cdFx0Ly8gU3Ryb25nRG93biAtLT4gRG93blxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYgY29tcFZhbHVlIDw9IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Ly8gRG93biAtLT4gRG93blxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzNdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbM10gIT09IG51bGwgJiYgY29tcFZhbHVlID49IGFUaHJlc2hvbGRzWzNdKSB7XG5cdFx0Ly8gU3Ryb25nVXAgLS0+IFVwXG5cdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJVcFwiO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzJdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMl0gIT09IG51bGwgJiYgY29tcFZhbHVlID49IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Ly8gVXAgLS0+IFVwXG5cdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJVcFwiO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFNpZGV3YXlzIC0tPiBOb25lXG5cdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJOb25lXCI7XG5cdH1cblxuXHRyZXR1cm4gZGV2aWF0aW9uSW5kaWNhdG9yO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzYXAudWkubW9kZWwuRmlsdGVyIGZyb20gYSBmaWx0ZXIgZGVmaW5pdGlvbi5cbiAqXG4gKiBAcGFyYW0gZmlsdGVyRGVmaW5pdGlvbiBUaGUgZmlsdGVyIGRlZmluaXRpb25cbiAqIEByZXR1cm5zIFJldHVybnMgYSBzYXAudWkubW9kZWwuRmlsdGVyIGZyb20gdGhlIGRlZmluaXRpb24sIG9yIHVuZGVmaW5lZCBpZiB0aGUgZGVmaW5pdGlvbiBpcyBlbXB0eSAobm8gcmFuZ2VzKVxuICovXG5mdW5jdGlvbiBjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbihmaWx0ZXJEZWZpbml0aW9uOiBGaWx0ZXJEZWZpbml0aW9uKTogRmlsdGVyIHwgdW5kZWZpbmVkIHtcblx0aWYgKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIG5ldyBGaWx0ZXIoXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnByb3BlcnR5UGF0aCxcblx0XHRcdGZpbHRlckRlZmluaXRpb24ucmFuZ2VzWzBdLm9wZXJhdG9yIGFzIEZpbHRlck9wZXJhdG9yLFxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXNbMF0ucmFuZ2VMb3csXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnJhbmdlc1swXS5yYW5nZUhpZ2hcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGFSYW5nZUZpbHRlcnMgPSBmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5tYXAocmFuZ2UgPT4ge1xuXHRcdFx0cmV0dXJuIG5ldyBGaWx0ZXIoZmlsdGVyRGVmaW5pdGlvbi5wcm9wZXJ0eVBhdGgsIHJhbmdlLm9wZXJhdG9yIGFzIEZpbHRlck9wZXJhdG9yLCByYW5nZS5yYW5nZUxvdywgcmFuZ2UucmFuZ2VIaWdoKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRmaWx0ZXJzOiBhUmFuZ2VGaWx0ZXJzLFxuXHRcdFx0YW5kOiBmYWxzZVxuXHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldEZpbHRlclN0cmluZ0Zyb21EZWZpbml0aW9uKGZpbHRlckRlZmluaXRpb246IEZpbHRlckRlZmluaXRpb24pOiBzdHJpbmcge1xuXHRjb25zdCBjdXJyZW50TG9jYWxlID0gbmV3IExvY2FsZShcblx0XHRzYXAudWlcblx0XHRcdC5nZXRDb3JlKClcblx0XHRcdC5nZXRDb25maWd1cmF0aW9uKClcblx0XHRcdC5nZXRMYW5ndWFnZSgpXG5cdCk7XG5cdGNvbnN0IHJlc0J1bmRsZSA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdGNvbnN0IGRhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSh7IHN0eWxlOiBcIm1lZGl1bVwiIH0sIGN1cnJlbnRMb2NhbGUpO1xuXG5cdGZ1bmN0aW9uIGZvcm1hdFJhbmdlKHJhbmdlOiBSYW5nZURlZmluaXRpb24pOiBzdHJpbmcge1xuXHRcdGNvbnN0IHZhbHVlTG93ID1cblx0XHRcdGZpbHRlckRlZmluaXRpb24ucHJvcGVydHlUeXBlLmluZGV4T2YoXCJFZG0uRGF0ZVwiKSA9PT0gMCA/IGRhdGVGb3JtYXQuZm9ybWF0KG5ldyBEYXRlKHJhbmdlLnJhbmdlTG93KSkgOiByYW5nZS5yYW5nZUxvdztcblx0XHRjb25zdCB2YWx1ZUhpZ2ggPVxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5wcm9wZXJ0eVR5cGUuaW5kZXhPZihcIkVkbS5EYXRlXCIpID09PSAwID8gZGF0ZUZvcm1hdC5mb3JtYXQobmV3IERhdGUocmFuZ2UucmFuZ2VIaWdoKSkgOiByYW5nZS5yYW5nZUhpZ2g7XG5cblx0XHRzd2l0Y2ggKHJhbmdlLm9wZXJhdG9yKSB7XG5cdFx0XHRjYXNlIFwiQlRcIjpcblx0XHRcdFx0cmV0dXJuIFwiW1wiICsgdmFsdWVMb3cgKyBcIiAtIFwiICsgdmFsdWVIaWdoICsgXCJdXCI7XG5cblx0XHRcdGNhc2UgXCJDb250YWluc1wiOlxuXHRcdFx0XHRyZXR1cm4gXCIqXCIgKyB2YWx1ZUxvdyArIFwiKlwiO1xuXG5cdFx0XHRjYXNlIFwiR0VcIjpcblx0XHRcdFx0cmV0dXJuIFwiXFx1MjI2NVwiICsgdmFsdWVMb3c7XG5cblx0XHRcdGNhc2UgXCJHVFwiOlxuXHRcdFx0XHRyZXR1cm4gXCI+XCIgKyB2YWx1ZUxvdztcblxuXHRcdFx0Y2FzZSBcIkxFXCI6XG5cdFx0XHRcdHJldHVybiBcIlxcdTIyNjRcIiArIHZhbHVlTG93O1xuXG5cdFx0XHRjYXNlIFwiTFRcIjpcblx0XHRcdFx0cmV0dXJuIFwiPFwiICsgdmFsdWVMb3c7XG5cblx0XHRcdGNhc2UgXCJOQlwiOlxuXHRcdFx0XHRyZXR1cm4gcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfRklMVEVSU1RSSU5HX05PVFwiLCBbXCJbXCIgKyB2YWx1ZUxvdyArIFwiIC0gXCIgKyB2YWx1ZUhpZ2ggKyBcIl1cIl0pO1xuXG5cdFx0XHRjYXNlIFwiTkVcIjpcblx0XHRcdFx0cmV0dXJuIFwiXFx1MjI2MFwiICsgdmFsdWVMb3c7XG5cblx0XHRcdGNhc2UgXCJOb3RDb250YWluc1wiOlxuXHRcdFx0XHRyZXR1cm4gcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfRklMVEVSU1RSSU5HX05PVFwiLCBbXCIqXCIgKyB2YWx1ZUxvdyArIFwiKlwiXSk7XG5cblx0XHRcdGNhc2UgXCJFUVwiOlxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIHZhbHVlTG93O1xuXHRcdH1cblx0fVxuXHRpZiAoZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH0gZWxzZSBpZiAoZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIGZvcm1hdFJhbmdlKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzWzBdKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gXCIoXCIgKyBmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5tYXAoZm9ybWF0UmFuZ2UpLmpvaW4oXCIsXCIpICsgXCIpXCI7XG5cdH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0Q2hhcnRUaXRsZShrcGlEZWY6IEtQSURlZmluaXRpb24pOiBzdHJpbmcge1xuXHRjb25zdCByZXNCdW5kbGUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXG5cdGZ1bmN0aW9uIGZvcm1hdExpc3QoaXRlbXM6IHsgbmFtZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkge1xuXHRcdGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBcIlwiO1xuXHRcdH0gZWxzZSBpZiAoaXRlbXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRyZXR1cm4gaXRlbXNbMF0ubGFiZWw7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxldCByZXMgPSBpdGVtc1swXS5sYWJlbDtcblx0XHRcdGZvciAobGV0IEkgPSAxOyBJIDwgaXRlbXMubGVuZ3RoIC0gMTsgSSsrKSB7XG5cdFx0XHRcdHJlcyArPSBcIiwgXCIgKyBpdGVtc1tJXS5sYWJlbDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc0J1bmRsZS5nZXRUZXh0KFwiQ19LUElDQVJEX0lURU1TTElTVFwiLCBbcmVzLCBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXS5sYWJlbF0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXNCdW5kbGUuZ2V0VGV4dChcIkNfS1BJQ0FSRF9DSEFSVFRJVExFXCIsIFtmb3JtYXRMaXN0KGtwaURlZi5jaGFydC5tZWFzdXJlcyksIGZvcm1hdExpc3Qoa3BpRGVmLmNoYXJ0LmRpbWVuc2lvbnMpXSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNoYXJ0TGFiZWxTZXR0aW5ncyhjaGFydERlZmluaXRpb246IEtQSUNoYXJ0RGVmaW5pdGlvbiwgb0NoYXJ0UHJvcGVydGllczogYW55KTogdm9pZCB7XG5cdHN3aXRjaCAoY2hhcnREZWZpbml0aW9uLmNoYXJ0VHlwZSkge1xuXHRcdGNhc2UgXCJEb251dFwiOlxuXHRcdFx0Ly8gU2hvdyBkYXRhIGxhYmVscywgZG8gbm90IHNob3cgYXhpcyB0aXRsZXNcblx0XHRcdG9DaGFydFByb3BlcnRpZXMuY2F0ZWdvcnlBeGlzID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnZhbHVlQXhpcyA9IHtcblx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsYWJlbDoge1xuXHRcdFx0XHRcdGZvcm1hdFN0cmluZzogXCJTaG9ydEZsb2F0XCJcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG9DaGFydFByb3BlcnRpZXMucGxvdEFyZWEuZGF0YUxhYmVsID0ge1xuXHRcdFx0XHR2aXNpYmxlOiB0cnVlLFxuXHRcdFx0XHR0eXBlOiBcInZhbHVlXCIsXG5cdFx0XHRcdGZvcm1hdFN0cmluZzogXCJTaG9ydEZsb2F0X01GRDJcIlxuXHRcdFx0fTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBcImJ1YmJsZVwiOlxuXHRcdFx0Ly8gU2hvdyBheGlzIHRpdGxlLCBidWJibGUgc2l6ZSBsZWdlbmQsIGRvIG5vdCBzaG93IGRhdGEgbGFiZWxzXG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnZhbHVlQXhpcyA9IHtcblx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsOiB7XG5cdFx0XHRcdFx0Zm9ybWF0U3RyaW5nOiBcIlNob3J0RmxvYXRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy52YWx1ZUF4aXMyID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWw6IHtcblx0XHRcdFx0XHRmb3JtYXRTdHJpbmc6IFwiU2hvcnRGbG9hdFwiXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLmxlZ2VuZEdyb3VwID0ge1xuXHRcdFx0XHRsYXlvdXQ6IHtcblx0XHRcdFx0XHRwb3NpdGlvbjogXCJib3R0b21cIixcblx0XHRcdFx0XHRhbGlnbm1lbnQ6IFwidG9wTGVmdFwiXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnNpemVMZWdlbmQgPSB7XG5cdFx0XHRcdHZpc2libGU6IHRydWVcblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnBsb3RBcmVhLmRhdGFMYWJlbCA9IHsgdmlzaWJsZTogZmFsc2UgfTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBcInNjYXR0ZXJcIjpcblx0XHRcdC8vIERvIG5vdCBzaG93IGRhdGEgbGFiZWxzIGFuZCBheGlzIHRpdGxlc1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy52YWx1ZUF4aXMgPSB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWw6IHtcblx0XHRcdFx0XHRmb3JtYXRTdHJpbmc6IFwiU2hvcnRGbG9hdFwiXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnZhbHVlQXhpczIgPSB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWw6IHtcblx0XHRcdFx0XHRmb3JtYXRTdHJpbmc6IFwiU2hvcnRGbG9hdFwiXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnBsb3RBcmVhLmRhdGFMYWJlbCA9IHsgdmlzaWJsZTogZmFsc2UgfTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdC8vIERvIG5vdCBzaG93IGRhdGEgbGFiZWxzIGFuZCBheGlzIHRpdGxlc1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy5jYXRlZ29yeUF4aXMgPSB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG9DaGFydFByb3BlcnRpZXMudmFsdWVBeGlzID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsOiB7XG5cdFx0XHRcdFx0Zm9ybWF0U3RyaW5nOiBcIlNob3J0RmxvYXRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy5wbG90QXJlYS5kYXRhTGFiZWwgPSB7IHZpc2libGU6IGZhbHNlIH07XG5cdH1cbn1cbmZ1bmN0aW9uIGZpbHRlck1hcChhT2JqZWN0czogeyBuYW1lOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHJvbGU/OiBzdHJpbmcgfVtdLCBhUm9sZXM/OiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdKTogc3RyaW5nW10ge1xuXHRpZiAoYVJvbGVzICYmIGFSb2xlcy5sZW5ndGgpIHtcblx0XHRyZXR1cm4gYU9iamVjdHNcblx0XHRcdC5maWx0ZXIoZGltZW5zaW9uID0+IHtcblx0XHRcdFx0cmV0dXJuIGFSb2xlcy5pbmRleE9mKGRpbWVuc2lvbi5yb2xlKSA+PSAwO1xuXHRcdFx0fSlcblx0XHRcdC5tYXAoZGltZW5zaW9uID0+IHtcblx0XHRcdFx0cmV0dXJuIGRpbWVuc2lvbi5sYWJlbDtcblx0XHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBhT2JqZWN0cy5tYXAoZGltZW5zaW9uID0+IHtcblx0XHRcdHJldHVybiBkaW1lbnNpb24ubGFiZWw7XG5cdFx0fSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0U2NhdHRlckJ1YmJsZUNoYXJ0RmVlZHMoY2hhcnREZWZpbml0aW9uOiBLUElDaGFydERlZmluaXRpb24pOiB7IHVpZDogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHZhbHVlczogc3RyaW5nW10gfVtdIHtcblx0Y29uc3QgYXhpczFNZWFzdXJlcyA9IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMsIFtcIkF4aXMxXCJdKTtcblx0Y29uc3QgYXhpczJNZWFzdXJlcyA9IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMsIFtcIkF4aXMyXCJdKTtcblx0Y29uc3QgYXhpczNNZWFzdXJlcyA9IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMsIFtcIkF4aXMzXCJdKTtcblx0Y29uc3Qgb3RoZXJNZWFzdXJlcyA9IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMsIFt1bmRlZmluZWRdKTtcblx0Y29uc3Qgc2VyaWVzRGltZW5zaW9ucyA9IGZpbHRlck1hcChjaGFydERlZmluaXRpb24uZGltZW5zaW9ucywgW1wiU2VyaWVzXCJdKTtcblxuXHQvLyBHZXQgdGhlIGZpcnN0IGRpbWVuc2lvbiB3aXRoIHJvbGUgXCJDYXRlZ29yeVwiIGZvciB0aGUgc2hhcGVcblx0Y29uc3Qgc2hhcGVEaW1lbnNpb24gPSBjaGFydERlZmluaXRpb24uZGltZW5zaW9ucy5maW5kKGRpbWVuc2lvbiA9PiB7XG5cdFx0cmV0dXJuIGRpbWVuc2lvbi5yb2xlID09PSBcIkNhdGVnb3J5XCI7XG5cdH0pO1xuXG5cdC8vIE1lYXN1cmUgZm9yIHRoZSB4LUF4aXMgOiBmaXJzdCBtZWFzdXJlIGZvciBBeGlzMSwgb3IgZm9yIEF4aXMyIGlmIG5vdCBmb3VuZCwgb3IgZm9yIEF4aXMzIGlmIG5vdCBmb3VuZFxuXHRjb25zdCB4TWVhc3VyZSA9IGF4aXMxTWVhc3VyZXMuc2hpZnQoKSB8fCBheGlzMk1lYXN1cmVzLnNoaWZ0KCkgfHwgYXhpczNNZWFzdXJlcy5zaGlmdCgpIHx8IG90aGVyTWVhc3VyZXMuc2hpZnQoKSB8fCBcIlwiO1xuXHQvLyBNZWFzdXJlIGZvciB0aGUgeS1BeGlzIDogZmlyc3QgbWVhc3VyZSBmb3IgQXhpczIsIG9yIHNlY29uZCBtZWFzdXJlIGZvciBBeGlzMSBpZiBub3QgZm91bmQsIG9yIGZpcnN0IG1lYXN1cmUgZm9yIEF4aXMzIGlmIG5vdCBmb3VuZFxuXHRjb25zdCB5TWVhc3VyZSA9IGF4aXMyTWVhc3VyZXMuc2hpZnQoKSB8fCBheGlzMU1lYXN1cmVzLnNoaWZ0KCkgfHwgYXhpczNNZWFzdXJlcy5zaGlmdCgpIHx8IG90aGVyTWVhc3VyZXMuc2hpZnQoKSB8fCBcIlwiO1xuXHRjb25zdCByZXMgPSBbXG5cdFx0e1xuXHRcdFx0XCJ1aWRcIjogXCJ2YWx1ZUF4aXNcIixcblx0XHRcdFwidHlwZVwiOiBcIk1lYXN1cmVcIixcblx0XHRcdFwidmFsdWVzXCI6IFt4TWVhc3VyZV1cblx0XHR9LFxuXHRcdHtcblx0XHRcdFwidWlkXCI6IFwidmFsdWVBeGlzMlwiLFxuXHRcdFx0XCJ0eXBlXCI6IFwiTWVhc3VyZVwiLFxuXHRcdFx0XCJ2YWx1ZXNcIjogW3lNZWFzdXJlXVxuXHRcdH1cblx0XTtcblxuXHRpZiAoY2hhcnREZWZpbml0aW9uLmNoYXJ0VHlwZSA9PT0gXCJidWJibGVcIikge1xuXHRcdC8vIE1lYXN1cmUgZm9yIHRoZSBzaXplIG9mIHRoZSBidWJibGU6IGZpcnN0IG1lYXN1cmUgZm9yIEF4aXMzLCBvciByZW1haW5pbmcgbWVhc3VyZSBmb3IgQXhpczEvQXhpczIgaWYgbm90IGZvdW5kXG5cdFx0Y29uc3Qgc2l6ZU1lYXN1cmUgPSBheGlzM01lYXN1cmVzLnNoaWZ0KCkgfHwgYXhpczFNZWFzdXJlcy5zaGlmdCgpIHx8IGF4aXMyTWVhc3VyZXMuc2hpZnQoKSB8fCBvdGhlck1lYXN1cmVzLnNoaWZ0KCkgfHwgXCJcIjtcblx0XHRyZXMucHVzaCh7XG5cdFx0XHRcInVpZFwiOiBcImJ1YmJsZVdpZHRoXCIsXG5cdFx0XHRcInR5cGVcIjogXCJNZWFzdXJlXCIsXG5cdFx0XHRcInZhbHVlc1wiOiBbc2l6ZU1lYXN1cmVdXG5cdFx0fSk7XG5cdH1cblxuXHQvLyBDb2xvciAob3B0aW9uYWwpXG5cdGlmIChzZXJpZXNEaW1lbnNpb25zLmxlbmd0aCkge1xuXHRcdHJlcy5wdXNoKHtcblx0XHRcdFwidWlkXCI6IFwiY29sb3JcIixcblx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XCJ2YWx1ZXNcIjogc2VyaWVzRGltZW5zaW9uc1xuXHRcdH0pO1xuXHR9XG5cdC8vIFNoYXBlIChvcHRpb25hbClcblx0aWYgKHNoYXBlRGltZW5zaW9uKSB7XG5cdFx0cmVzLnB1c2goe1xuXHRcdFx0XCJ1aWRcIjogXCJzaGFwZVwiLFxuXHRcdFx0XCJ0eXBlXCI6IFwiRGltZW5zaW9uXCIsXG5cdFx0XHRcInZhbHVlc1wiOiBbc2hhcGVEaW1lbnNpb24ubGFiZWxdXG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gZ2V0Q2hhcnRGZWVkcyhjaGFydERlZmluaXRpb246IEtQSUNoYXJ0RGVmaW5pdGlvbik6IHsgdWlkOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgdmFsdWVzOiBzdHJpbmdbXSB9W10ge1xuXHRsZXQgcmVzOiB7IHVpZDogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHZhbHVlczogc3RyaW5nW10gfVtdO1xuXG5cdHN3aXRjaCAoY2hhcnREZWZpbml0aW9uLmNoYXJ0VHlwZSkge1xuXHRcdGNhc2UgXCJEb251dFwiOlxuXHRcdFx0cmVzID0gW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJ1aWRcIjogXCJzaXplXCIsXG5cdFx0XHRcdFx0XCJ0eXBlXCI6IFwiTWVhc3VyZVwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcInVpZFwiOiBcImNvbG9yXCIsXG5cdFx0XHRcdFx0XCJ0eXBlXCI6IFwiRGltZW5zaW9uXCIsXG5cdFx0XHRcdFx0XCJ2YWx1ZXNcIjogZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5kaW1lbnNpb25zKVxuXHRcdFx0XHR9XG5cdFx0XHRdO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwiYnViYmxlXCI6XG5cdFx0Y2FzZSBcInNjYXR0ZXJcIjpcblx0XHRcdHJlcyA9IGdldFNjYXR0ZXJCdWJibGVDaGFydEZlZWRzKGNoYXJ0RGVmaW5pdGlvbik7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgXCJ2ZXJ0aWNhbF9idWxsZXRcIjpcblx0XHRcdHJlcyA9IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwiYWN0dWFsVmFsdWVzXCIsXG5cdFx0XHRcdFx0XCJ0eXBlXCI6IFwiTWVhc3VyZVwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMsIFt1bmRlZmluZWQsIFwiQXhpczFcIl0pXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcInVpZFwiOiBcInRhcmdldFZhbHVlc1wiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIk1lYXN1cmVcIixcblx0XHRcdFx0XHRcInZhbHVlc1wiOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzLCBbXCJBeGlzMlwiXSlcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwiY2F0ZWdvcnlBeGlzXCIsXG5cdFx0XHRcdFx0XCJ0eXBlXCI6IFwiRGltZW5zaW9uXCIsXG5cdFx0XHRcdFx0XCJ2YWx1ZXNcIjogZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5kaW1lbnNpb25zLCBbdW5kZWZpbmVkLCBcIkNhdGVnb3J5XCJdKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJ1aWRcIjogXCJjb2xvclwiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24uZGltZW5zaW9ucywgW1wiU2VyaWVzXCJdKVxuXHRcdFx0XHR9XG5cdFx0XHRdO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0cmVzID0gW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJ1aWRcIjogXCJ2YWx1ZUF4aXNcIixcblx0XHRcdFx0XHRcInR5cGVcIjogXCJNZWFzdXJlXCIsXG5cdFx0XHRcdFx0XCJ2YWx1ZXNcIjogZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5tZWFzdXJlcylcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwiY2F0ZWdvcnlBeGlzXCIsXG5cdFx0XHRcdFx0XCJ0eXBlXCI6IFwiRGltZW5zaW9uXCIsXG5cdFx0XHRcdFx0XCJ2YWx1ZXNcIjogZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5kaW1lbnNpb25zLCBbdW5kZWZpbmVkLCBcIkNhdGVnb3J5XCJdKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJ1aWRcIjogXCJjb2xvclwiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24uZGltZW5zaW9ucywgW1wiU2VyaWVzXCJdKVxuXHRcdFx0XHR9XG5cdFx0XHRdO1xuXHR9XG5cblx0cmV0dXJuIHJlcztcbn1cblxuLyoqXG4gKiBAY2xhc3MgQSBjb250cm9sbGVyIGV4dGVuc2lvbiBmb3IgbWFuYWdpbmcgdGhlIEtQSXMgaW4gYW4gYW5hbHl0aWNhbCBsaXN0IHBhZ2VcbiAqXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5LUElNYW5hZ2VtZW50XG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKlxuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjkzLjBcbiAqL1xuQFVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuS1BJTWFuYWdlbWVudFwiLCBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEpXG5jbGFzcyBLUElNYW5hZ2VtZW50Q29udHJvbGxlckV4dGVuc2lvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYUtQSURlZmluaXRpb25zPzogS1BJRGVmaW5pdGlvbltdO1xuXHRwcm90ZWN0ZWQgb0NhcmQ6IGFueTtcblx0cHJvdGVjdGVkIG9Qb3BvdmVyITogUG9wb3ZlcjtcblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgY2FyZCBtYW5pZmVzdCBmb3IgYSBLUEkgZGVmaW5pdGlvbiBhbmQgc3RvcmVzIGl0IGluIGEgSlNPTiBtb2RlbC5cblx0ICpcblx0ICogQHBhcmFtIGtwaURlZmluaXRpb24gVGhlIEtQSSBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSBvS1BJTW9kZWwgVGhlIEpTT04gbW9kZWwgaW4gd2hpY2ggdGhlIG1hbmlmZXN0IHdpbGwgYmUgc3RvcmVkXG5cdCAqL1xuXHRwcm90ZWN0ZWQgaW5pdENhcmRNYW5pZmVzdChrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBvS1BJTW9kZWw6IEpTT05Nb2RlbDxhbnk+KTogdm9pZCB7XG5cdFx0Y29uc3Qgb0NhcmRNYW5pZmVzdDogYW55ID0ge1xuXHRcdFx0XCJzYXAuYXBwXCI6IHtcblx0XHRcdFx0aWQ6IFwic2FwLmZlXCIsXG5cdFx0XHRcdHR5cGU6IFwiY2FyZFwiXG5cdFx0XHR9LFxuXHRcdFx0XCJzYXAudWlcIjoge1xuXHRcdFx0XHR0ZWNobm9sb2d5OiBcIlVJNVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJzYXAuY2FyZFwiOiB7XG5cdFx0XHRcdHR5cGU6IFwiQW5hbHl0aWNhbFwiLFxuXHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0anNvbjoge31cblx0XHRcdFx0fSxcblx0XHRcdFx0aGVhZGVyOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJOdW1lcmljXCIsXG5cdFx0XHRcdFx0dGl0bGU6IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRpdGxlLFxuXHRcdFx0XHRcdHN1YlRpdGxlOiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5kZXNjcmlwdGlvbixcblx0XHRcdFx0XHR1bml0T2ZNZWFzdXJlbWVudDogXCJ7bWFpblVuaXR9XCIsXG5cdFx0XHRcdFx0bWFpbkluZGljYXRvcjoge1xuXHRcdFx0XHRcdFx0bnVtYmVyOiBcInttYWluVmFsdWVOb1NjYWxlfVwiLFxuXHRcdFx0XHRcdFx0dW5pdDogXCJ7bWFpblZhbHVlU2NhbGV9XCIsXG5cdFx0XHRcdFx0XHRzdGF0ZTogXCJ7bWFpblN0YXRlfVwiLFxuXHRcdFx0XHRcdFx0dHJlbmQ6IFwie3RyZW5kfVwiXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjb250ZW50OiB7XG5cdFx0XHRcdFx0bWluSGVpZ2h0OiBcIjI1cmVtXCIsXG5cdFx0XHRcdFx0Y2hhcnRQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdFx0XHRwbG90QXJlYToge30sXG5cdFx0XHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRhbGlnbm1lbnQ6IFwibGVmdFwiXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0XHRwYXRoOiBcIi9jaGFydERhdGFcIlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBBZGQgc2lkZSBpbmRpY2F0b3JzIGluIHRoZSBjYXJkIGhlYWRlciBpZiBhIHRhcmdldCBpcyBkZWZpbmVkIGZvciB0aGUgS1BJXG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFBhdGggfHwga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3QgcmVzQnVuZGxlID0gc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRcdG9DYXJkTWFuaWZlc3RbXCJzYXAuY2FyZFwiXS5oZWFkZXIuc2lkZUluZGljYXRvcnMgPSBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aXRsZTogcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfSU5ESUNBVE9SX1RBUkdFVFwiKSxcblx0XHRcdFx0XHRudW1iZXI6IFwie3RhcmdldE51bWJlcn1cIixcblx0XHRcdFx0XHR1bml0OiBcInt0YXJnZXRVbml0fVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aXRsZTogcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfSU5ESUNBVE9SX0RFVklBVElPTlwiKSxcblx0XHRcdFx0XHRudW1iZXI6IFwie2RldmlhdGlvbk51bWJlcn1cIixcblx0XHRcdFx0XHR1bml0OiBcIiVcIlxuXHRcdFx0XHR9XG5cdFx0XHRdO1xuXHRcdH1cblxuXHRcdC8vIERldGFpbHMgb2YgdGhlIGNhcmQ6IGZpbHRlciBkZXNjcmlwdGlvbnNcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5zZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYURlc2NyaXB0aW9uczogc3RyaW5nW10gPSBbXTtcblx0XHRcdGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zLmZvckVhY2goZmlsdGVyRGVmaW5pdGlvbiA9PiB7XG5cdFx0XHRcdGNvbnN0IGRlc2MgPSBnZXRGaWx0ZXJTdHJpbmdGcm9tRGVmaW5pdGlvbihmaWx0ZXJEZWZpbml0aW9uKTtcblx0XHRcdFx0aWYgKGRlc2MpIHtcblx0XHRcdFx0XHRhRGVzY3JpcHRpb25zLnB1c2goZGVzYyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoYURlc2NyaXB0aW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmhlYWRlci5kZXRhaWxzID0gYURlc2NyaXB0aW9ucy5qb2luKFwiLCBcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2hhcnQgc2V0dGluZ3M6IHR5cGUsIHRpdGxlLCBkaW1lbnNpb25zIGFuZCBtZWFzdXJlcyBpbiB0aGUgbWFuaWZlc3Rcblx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uY29udGVudC5jaGFydFR5cGUgPSBrcGlEZWZpbml0aW9uLmNoYXJ0LmNoYXJ0VHlwZTtcblx0XHR1cGRhdGVDaGFydExhYmVsU2V0dGluZ3Moa3BpRGVmaW5pdGlvbi5jaGFydCwgb0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQuY2hhcnRQcm9wZXJ0aWVzKTtcblx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uY29udGVudC5jaGFydFByb3BlcnRpZXMudGl0bGUudGV4dCA9IGZvcm1hdENoYXJ0VGl0bGUoa3BpRGVmaW5pdGlvbik7XG5cdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQuZGltZW5zaW9ucyA9IGtwaURlZmluaXRpb24uY2hhcnQuZGltZW5zaW9ucy5tYXAoZGltZW5zaW9uID0+IHtcblx0XHRcdHJldHVybiB7IGxhYmVsOiBkaW1lbnNpb24ubGFiZWwsIHZhbHVlOiBcIntcIiArIGRpbWVuc2lvbi5uYW1lICsgXCJ9XCIgfTtcblx0XHR9KTtcblx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uY29udGVudC5tZWFzdXJlcyA9IGtwaURlZmluaXRpb24uY2hhcnQubWVhc3VyZXMubWFwKG1lYXN1cmUgPT4ge1xuXHRcdFx0cmV0dXJuIHsgbGFiZWw6IG1lYXN1cmUubGFiZWwsIHZhbHVlOiBcIntcIiArIG1lYXN1cmUubmFtZSArIFwifVwiIH07XG5cdFx0fSk7XG5cdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQuZmVlZHMgPSBnZXRDaGFydEZlZWRzKGtwaURlZmluaXRpb24uY2hhcnQpO1xuXG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCwge1xuXHRcdFx0bWFuaWZlc3Q6IG9DYXJkTWFuaWZlc3Rcblx0XHR9KTtcblx0fVxuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5hS1BJRGVmaW5pdGlvbnMgPSB0aGlzLmdldEtQSURhdGEoKTtcblxuXHRcdGlmICh0aGlzLmFLUElEZWZpbml0aW9ucyAmJiB0aGlzLmFLUElEZWZpbml0aW9ucy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gKG9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBCYXNlQ29udHJvbGxlcikuZ2V0QXBwQ29tcG9uZW50KCkgYXMgYW55O1xuXG5cdFx0XHQvLyBDcmVhdGUgYSBKU09OIG1vZGVsIHRvIHN0b3JlIEtQSSBkYXRhXG5cdFx0XHRjb25zdCBvS1BJTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0XHRvVmlldy5zZXRNb2RlbChvS1BJTW9kZWwsIFwia3BpTW9kZWxcIik7XG5cblx0XHRcdHRoaXMuYUtQSURlZmluaXRpb25zLmZvckVhY2goa3BpRGVmaW5pdGlvbiA9PiB7XG5cdFx0XHRcdC8vIENyZWF0ZSB0aGUgbWFuaWZlc3QgZm9yIHRoZSBLUEkgY2FyZCBhbmQgc3RvcmUgaXQgaW4gdGhlIEtQSSBtb2RlbFxuXHRcdFx0XHR0aGlzLmluaXRDYXJkTWFuaWZlc3Qoa3BpRGVmaW5pdGlvbiwgb0tQSU1vZGVsKTtcblxuXHRcdFx0XHQvLyBMb2FkIHRhZyBkYXRhIGZvciB0aGUgS1BJXG5cdFx0XHRcdHRoaXMubG9hZEtQSVRhZ0RhdGEoa3BpRGVmaW5pdGlvbiwgb0FwcENvbXBvbmVudC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwsIG9LUElNb2RlbCkuY2F0Y2goZnVuY3Rpb24oZXJyOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRAT3ZlcnJpZGUoKVxuXHRwdWJsaWMgb25FeGl0KCk6IHZvaWQge1xuXHRcdGNvbnN0IG9LUElNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwia3BpTW9kZWxcIikgYXMgSlNPTk1vZGVsPGFueT47XG5cblx0XHRpZiAob0tQSU1vZGVsKSB7XG5cdFx0XHRvS1BJTW9kZWwuZGVzdHJveSgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0S1BJRGF0YSgpOiBLUElEZWZpbml0aW9uW10gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRzQ3VzdG9tRGF0YSA9IG9WaWV3LmdldENvbnRlbnQoKVswXS5kYXRhKFwiS1BJRGF0YVwiKTtcblxuXHRcdGlmIChzQ3VzdG9tRGF0YSkge1xuXHRcdFx0Y29uc3QgdkRhdGEgPSB0eXBlb2Ygc0N1c3RvbURhdGEgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHNDdXN0b21EYXRhKSA6IHNDdXN0b21EYXRhO1xuXHRcdFx0aWYgKFwiY3VzdG9tRGF0YVwiIGluIHZEYXRhKSB7XG5cdFx0XHRcdHJldHVybiB2RGF0YVtcImN1c3RvbURhdGFcIl07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdkRhdGE7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVEYXRhcG9pbnRWYWx1ZUFuZEN1cnJlbmN5KGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIGtwaUNvbnRleHQ6IENvbnRleHQsIG9LUElNb2RlbDogSlNPTk1vZGVsPGFueT4pIHtcblx0XHRjb25zdCBjdXJyZW50TG9jYWxlID0gbmV3IExvY2FsZShcblx0XHRcdHNhcC51aVxuXHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdC5nZXRDb25maWd1cmF0aW9uKClcblx0XHRcdFx0LmdldExhbmd1YWdlKClcblx0XHQpO1xuXHRcdGNvbnN0IHJhd1VuaXQgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py5pc1BhdGhcblx0XHRcdD8ga3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0LnZhbHVlKVxuXHRcdFx0OiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py52YWx1ZTtcblxuXHRcdGNvbnN0IGlzUGVyY2VudGFnZSA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LmlzQ3VycmVuY3kgPT09IGZhbHNlICYmIHJhd1VuaXQgPT09IFwiJVwiO1xuXG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gTWFpbiBLUEkgdmFsdWVcblx0XHRjb25zdCByYXdWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoKSk7XG5cblx0XHQvLyBWYWx1ZSBmb3JtYXR0ZWQgd2l0aCBhIHNjYWxlXG5cdFx0Y29uc3Qga3BpVmFsdWUgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdHtcblx0XHRcdFx0c3R5bGU6IGlzUGVyY2VudGFnZSA/IHVuZGVmaW5lZCA6IFwic2hvcnRcIixcblx0XHRcdFx0bWluRnJhY3Rpb25EaWdpdHM6IDAsXG5cdFx0XHRcdG1heEZyYWN0aW9uRGlnaXRzOiAxLFxuXHRcdFx0XHRzaG93U2NhbGU6ICFpc1BlcmNlbnRhZ2Vcblx0XHRcdH0sXG5cdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0KS5mb3JtYXQocmF3VmFsdWUpO1xuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlXCIsIGtwaVZhbHVlKTtcblxuXHRcdC8vIFZhbHVlIHdpdGhvdXQgYSBzY2FsZVxuXHRcdGNvbnN0IGtwaVZhbHVlVW5zY2FsZWQgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdHtcblx0XHRcdFx0bWF4RnJhY3Rpb25EaWdpdHM6IDIsXG5cdFx0XHRcdHNob3dTY2FsZTogZmFsc2UsXG5cdFx0XHRcdGdyb3VwaW5nRW5hYmxlZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHQpLmZvcm1hdChyYXdWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVVbnNjYWxlZFwiLCBrcGlWYWx1ZVVuc2NhbGVkKTtcblxuXHRcdC8vIFZhbHVlIGZvcm1hdHRlZCB3aXRoIHRoZSBzY2FsZSBvbWl0dGVkXG5cdFx0Y29uc3Qga3BpVmFsdWVOb1NjYWxlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHR7XG5cdFx0XHRcdHN0eWxlOiBpc1BlcmNlbnRhZ2UgPyB1bmRlZmluZWQgOiBcInNob3J0XCIsXG5cdFx0XHRcdG1pbkZyYWN0aW9uRGlnaXRzOiAwLFxuXHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMSxcblx0XHRcdFx0c2hvd1NjYWxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHQpLmZvcm1hdChyYXdWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVOb1NjYWxlXCIsIGtwaVZhbHVlTm9TY2FsZSk7XG5cblx0XHQvLyBTY2FsZSBvZiB0aGUgdmFsdWVcblx0XHRjb25zdCBrcGlWYWx1ZVNjYWxlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHR7XG5cdFx0XHRcdHN0eWxlOiBpc1BlcmNlbnRhZ2UgPyB1bmRlZmluZWQgOiBcInNob3J0XCIsXG5cdFx0XHRcdGRlY2ltYWxzOiAwLFxuXHRcdFx0XHRtYXhJbnRlZ2VyRGlnaXRzOiAwLFxuXHRcdFx0XHRzaG93U2NhbGU6IHRydWVcblx0XHRcdH0sXG5cdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0KS5mb3JtYXQocmF3VmFsdWUpO1xuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlU2NhbGVcIiwga3BpVmFsdWVTY2FsZSk7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyBVbml0IG9yIGN1cnJlbmN5XG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQgJiYgcmF3VW5pdCkge1xuXHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQuaXNDdXJyZW5jeSkge1xuXHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Vbml0XCIsIHJhd1VuaXQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiB1bml0IG9mIG1lYXN1cmUsIHdlIGhhdmUgdG8gZm9ybWF0IGl0IHByb3Blcmx5XG5cdFx0XHRcdGNvbnN0IGtwaVVuaXQgPSBOdW1iZXJGb3JtYXQuZ2V0VW5pdEluc3RhbmNlKHsgc2hvd051bWJlcjogZmFsc2UgfSwgY3VycmVudExvY2FsZSkuZm9ybWF0KHJhd1ZhbHVlLCByYXdVbml0KTtcblx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVW5pdFwiLCBrcGlVbml0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZURhdGFwb2ludENyaXRpY2FsaXR5KGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIGtwaUNvbnRleHQ6IENvbnRleHQsIG9LUElNb2RlbDogSlNPTk1vZGVsPGFueT4pIHtcblx0XHRjb25zdCByYXdWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoKSk7XG5cblx0XHRsZXQgY3JpdGljYWxpdHlWYWx1ZSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWUpIHtcblx0XHRcdC8vIENyaXRpY2FsaXR5IGlzIGEgZml4ZWQgdmFsdWVcblx0XHRcdGNyaXRpY2FsaXR5VmFsdWUgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVZhbHVlO1xuXHRcdH0gZWxzZSBpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlQYXRoKSB7XG5cdFx0XHQvLyBDcml0aWNhbGl0eSBjb21lcyBmcm9tIGFub3RoZXIgcHJvcGVydHkgKHZpYSBhIHBhdGgpXG5cdFx0XHRjcml0aWNhbGl0eVZhbHVlID1cblx0XHRcdFx0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlba3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGgpXSB8fCBNZXNzYWdlVHlwZS5Ob25lO1xuXHRcdH0gZWxzZSBpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMgJiYga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUpIHtcblx0XHRcdC8vIENyaXRpY2FsaXR5IGNhbGN1bGF0aW9uXG5cdFx0XHRzd2l0Y2ggKGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvVGFyZ2V0XCI6XG5cdFx0XHRcdFx0Y3JpdGljYWxpdHlWYWx1ZSA9IG1lc3NhZ2VUeXBlRnJvbVRhcmdldENhbGN1bGF0aW9uKHJhd1ZhbHVlLCBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9NaW5pbWl6ZVwiOlxuXHRcdFx0XHRcdGNyaXRpY2FsaXR5VmFsdWUgPSBtZXNzYWdlVHlwZUZyb21NaW5pbWl6ZUNhbGN1bGF0aW9uKFxuXHRcdFx0XHRcdFx0cmF3VmFsdWUsXG5cdFx0XHRcdFx0XHRrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkc1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9NYXhpbWl6ZVwiOlxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGNyaXRpY2FsaXR5VmFsdWUgPSBtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uKFxuXHRcdFx0XHRcdFx0cmF3VmFsdWUsXG5cdFx0XHRcdFx0XHRrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkc1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluQ3JpdGljYWxpdHlcIiwgY3JpdGljYWxpdHlWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFxuXHRcdFx0XCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5TdGF0ZVwiLFxuXHRcdFx0VmFsdWVDb2xvckZyb21NZXNzYWdlVHlwZVtjcml0aWNhbGl0eVZhbHVlXSB8fCBcIk5vbmVcIlxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZURhdGFwb2ludFRyZW5kKGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIGtwaUNvbnRleHQ6IENvbnRleHQsIG9LUElNb2RlbDogSlNPTk1vZGVsPGFueT4pIHtcblx0XHRjb25zdCByYXdWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoKSk7XG5cblx0XHRsZXQgdHJlbmRWYWx1ZSA9IFwiTm9uZVwiO1xuXG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kVmFsdWUpIHtcblx0XHRcdC8vIFRyZW5kIGlzIGEgZml4ZWQgdmFsdWVcblx0XHRcdHRyZW5kVmFsdWUgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFZhbHVlO1xuXHRcdH0gZWxzZSBpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRQYXRoKSB7XG5cdFx0XHQvLyBUcmVuZCBjb21lcyBmcm9tIGFub3RoZXIgcHJvcGVydHkgdmlhIGEgcGF0aFxuXHRcdFx0dHJlbmRWYWx1ZSA9IGRldmlhdGlvbkluZGljYXRvckZyb21UcmVuZFR5cGUoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFBhdGgpKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0a3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlICE9PSB1bmRlZmluZWQgfHxcblx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoXG5cdFx0KSB7XG5cdFx0XHQvLyBDYWxjdWxhdGVkIHRyZW5kXG5cdFx0XHRsZXQgdHJlbmRSZWZlcmVuY2VWYWx1ZTogbnVtYmVyO1xuXHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRyZW5kUmVmZXJlbmNlVmFsdWUgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0cmVuZFJlZmVyZW5jZVZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoXG5cdFx0XHRcdFx0a3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlUGF0aCB8fCBcIlwiKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0dHJlbmRWYWx1ZSA9IGRldmlhdGlvbkluZGljYXRvckZyb21DYWxjdWxhdGlvbihcblx0XHRcdFx0cmF3VmFsdWUsXG5cdFx0XHRcdHRyZW5kUmVmZXJlbmNlVmFsdWUsXG5cdFx0XHRcdCEha3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvbklzUmVsYXRpdmUsXG5cdFx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25UcmVzaG9sZHNcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90cmVuZFwiLCB0cmVuZFZhbHVlKTtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlVGFyZ2V0VmFsdWUoa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwga3BpQ29udGV4dDogQ29udGV4dCwgb0tQSU1vZGVsOiBKU09OTW9kZWw8YW55Pikge1xuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFBhdGggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuOyAvLyBObyB0YXJnZXQgc2V0IGZvciB0aGUgS1BJXG5cdFx0fVxuXHRcdGNvbnN0IHJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGgpKTtcblx0XHRjb25zdCBjdXJyZW50TG9jYWxlID0gbmV3IExvY2FsZShcblx0XHRcdHNhcC51aVxuXHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdC5nZXRDb25maWd1cmF0aW9uKClcblx0XHRcdFx0LmdldExhbmd1YWdlKClcblx0XHQpO1xuXG5cdFx0bGV0IHRhcmdldFJhd1ZhbHVlOiBudW1iZXI7XG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRhcmdldFJhd1ZhbHVlID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0VmFsdWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRhcmdldFJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRQYXRoIHx8IFwiXCIpKTtcblx0XHR9XG5cdFx0Y29uc3QgZGV2aWF0aW9uUmF3VmFsdWUgPSB0YXJnZXRSYXdWYWx1ZSAhPT0gMCA/ICgocmF3VmFsdWUgLSB0YXJnZXRSYXdWYWx1ZSkgLyB0YXJnZXRSYXdWYWx1ZSkgKiAxMDAgOiB1bmRlZmluZWQ7XG5cblx0XHQvLyBGb3JtYXR0aW5nXG5cdFx0Y29uc3QgdGFyZ2V0VmFsdWUgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdHtcblx0XHRcdFx0c3R5bGU6IFwic2hvcnRcIixcblx0XHRcdFx0bWluRnJhY3Rpb25EaWdpdHM6IDAsXG5cdFx0XHRcdG1heEZyYWN0aW9uRGlnaXRzOiAxLFxuXHRcdFx0XHRzaG93U2NhbGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHRhcmdldFJhd1ZhbHVlKTtcblx0XHRjb25zdCB0YXJnZXRTY2FsZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRzdHlsZTogXCJzaG9ydFwiLFxuXHRcdFx0XHRkZWNpbWFsczogMCxcblx0XHRcdFx0bWF4SW50ZWdlckRpZ2l0czogMCxcblx0XHRcdFx0c2hvd1NjYWxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHRhcmdldFJhd1ZhbHVlKTtcblxuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vdGFyZ2V0TnVtYmVyXCIsIHRhcmdldFZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL3RhcmdldFVuaXRcIiwgdGFyZ2V0U2NhbGUpO1xuXG5cdFx0aWYgKGRldmlhdGlvblJhd1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IGRldmlhdGlvblZhbHVlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRtaW5GcmFjdGlvbkRpZ2l0czogMCxcblx0XHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMSxcblx0XHRcdFx0XHRzaG93U2NhbGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHRcdCkuZm9ybWF0KGRldmlhdGlvblJhd1ZhbHVlKTtcblx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vZGV2aWF0aW9uTnVtYmVyXCIsIGRldmlhdGlvblZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9kZXZpYXRpb25OdW1iZXJcIiwgXCJOL0FcIik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvYWRzIHRhZyBkYXRhIGZvciBhIEtQSSwgYW5kIHN0b3JlcyBpdCBpbiB0aGUgSlNPTiBLUEkgbW9kZWwuXG5cdCAqXG5cdCAqIEBwYXJhbSB7S1BJRGVmaW5pdGlvbn0ga3BpRGVmaW5pdGlvbiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgS1BJLlxuXHQgKiBAcGFyYW0ge09EYXRhTW9kZWx9IG9NYWluTW9kZWwgVGhlIG1vZGVsIHVzZWQgdG8gbG9hZCB0aGUgZGF0YS5cblx0ICogQHBhcmFtIHtKU09OTW9kZWx9IG9LUElNb2RlbCBUaGUgSlNPTiBtb2RlbCB3aGVyZSB0aGUgZGF0YSB3aWxsIGJlIHN0b3JlZFxuXHQgKiBAcGFyYW0gbG9hZEZ1bGwgSWYgbm90IHRydWUsIGxvYWRzIG9ubHkgZGF0YSBmb3IgdGhlIEtQSSB0YWdcblx0ICogQHJldHVybnMge1Byb21pc2V9IFJldHVybnMgdGhlIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIGRhdGEgaXMgbG9hZGVkLlxuXHQgKi9cblx0cHJvdGVjdGVkIGxvYWRLUElUYWdEYXRhKGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIG9NYWluTW9kZWw6IE9EYXRhTW9kZWwsIG9LUElNb2RlbDogSlNPTk1vZGVsPGFueT4sIGxvYWRGdWxsPzogYm9vbGVhbik6IGFueSB7XG5cdFx0Ly8gSWYgbG9hZEZ1bGw9ZmFsc2UsIHRoZW4gd2UncmUganVzdCBsb2FkaW5nIGRhdGEgZm9yIHRoZSB0YWcgYW5kIHdlIHVzZSB0aGUgXCIkYXV0by5Mb25nUnVubmVyc1wiIGdyb3VwSURcblx0XHQvLyBJZiBsb2FkRnVsbD10cnVlLCB3ZSdyZSBsb2FkaW5nIGRhdGEgZm9yIHRoZSB3aG9sZSBLUEkgKHRhZyArIGNhcmQpIGFuZCB3ZSB1c2UgdGhlIGRlZmF1bHQgKFwiJGF1dG9cIikgZ3JvdXBJRFxuXHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IGxvYWRGdWxsXG5cdFx0XHQ/IG9NYWluTW9kZWwuYmluZExpc3QoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmVudGl0eVNldClcblx0XHRcdDogb01haW5Nb2RlbC5iaW5kTGlzdChcIi9cIiArIGtwaURlZmluaXRpb24uZW50aXR5U2V0LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7ICQkZ3JvdXBJZDogXCIkYXV0by5Mb25nUnVubmVyc1wiIH0pO1xuXHRcdGNvbnN0IG9BZ2dyZWdhdGU6IFJlY29yZDxzdHJpbmcsIHsgdW5pdD86IHN0cmluZyB9PiA9IHt9O1xuXG5cdFx0Ly8gTWFpbiB2YWx1ZSArIGN1cnJlbmN5L3VuaXRcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8uaXNQYXRoKSB7XG5cdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aF0gPSB7IHVuaXQ6IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQudmFsdWUgfTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0FnZ3JlZ2F0ZVtrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0fVxuXG5cdFx0Ly8gUHJvcGVydHkgZm9yIGNyaXRpY2FsaXR5XG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aCkge1xuXHRcdFx0b0FnZ3JlZ2F0ZVtrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGhdID0ge307XG5cdFx0fVxuXG5cdFx0Ly8gUHJvcGVydGllcyBmb3IgdHJlbmQgYW5kIHRyZW5kIGNhbGN1bGF0aW9uXG5cdFx0aWYgKGxvYWRGdWxsKSB7XG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRQYXRoKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRQYXRoXSA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGhdID0ge307XG5cdFx0XHR9XG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0UGF0aCkge1xuXHRcdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFBhdGhdID0ge307XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0b0xpc3RCaW5kaW5nLnNldEFnZ3JlZ2F0aW9uKHsgYWdncmVnYXRlOiBvQWdncmVnYXRlIH0pO1xuXG5cdFx0Ly8gTWFuYWdlIFNlbGVjdGlvblZhcmlhbnQgZmlsdGVyc1xuXHRcdGlmIChrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBhRmlsdGVycyA9IGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zLm1hcChjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbikuZmlsdGVyKGZpbHRlciA9PiB7XG5cdFx0XHRcdHJldHVybiBmaWx0ZXIgIT09IHVuZGVmaW5lZDtcblx0XHRcdH0pIGFzIEZpbHRlcltdO1xuXHRcdFx0b0xpc3RCaW5kaW5nLmZpbHRlcihhRmlsdGVycyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9MaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMSkudGhlbigoYUNvbnRleHRzOiBDb250ZXh0W10pID0+IHtcblx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdGNvbnN0IHJhd1VuaXQgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py5pc1BhdGhcblx0XHRcdFx0XHQ/IGFDb250ZXh0c1swXS5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0LnZhbHVlKVxuXHRcdFx0XHRcdDoga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8udmFsdWU7XG5cblx0XHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQgJiYgIXJhd1VuaXQpIHtcblx0XHRcdFx0XHQvLyBBIHVuaXQvY3VycmVuY3kgaXMgZGVmaW5lZCwgYnV0IGl0cyB2YWx1ZSBpcyB1bmRlZmluZWQgLS0+IG11bHRpLXVuaXQgc2l0dWF0aW9uXG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVcIiwgXCIqXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlVW5zY2FsZWRcIiwgXCIqXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlTm9TY2FsZVwiLCBcIipcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVTY2FsZVwiLCBcIlwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Vbml0XCIsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluQ3JpdGljYWxpdHlcIiwgTWVzc2FnZVR5cGUuTm9uZSk7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluU3RhdGVcIiwgXCJOb25lXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vdHJlbmRcIiwgXCJOb25lXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vdGFyZ2V0TnVtYmVyXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90YXJnZXRVbml0XCIsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9kZXZpYXRpb25OdW1iZXJcIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZURhdGFwb2ludFZhbHVlQW5kQ3VycmVuY3koa3BpRGVmaW5pdGlvbiwgYUNvbnRleHRzWzBdLCBvS1BJTW9kZWwpO1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRGF0YXBvaW50Q3JpdGljYWxpdHkoa3BpRGVmaW5pdGlvbiwgYUNvbnRleHRzWzBdLCBvS1BJTW9kZWwpO1xuXG5cdFx0XHRcdFx0aWYgKGxvYWRGdWxsKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnVwZGF0ZURhdGFwb2ludFRyZW5kKGtwaURlZmluaXRpb24sIGFDb250ZXh0c1swXSwgb0tQSU1vZGVsKTtcblx0XHRcdFx0XHRcdHRoaXMudXBkYXRlVGFyZ2V0VmFsdWUoa3BpRGVmaW5pdGlvbiwgYUNvbnRleHRzWzBdLCBvS1BJTW9kZWwpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWRzIGNhcmQgZGF0YSBmb3IgYSBLUEksIGFuZCBzdG9yZXMgaXQgaW4gdGhlIEpTT04gS1BJIG1vZGVsLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0tQSURlZmluaXRpb259IGtwaURlZmluaXRpb24gVGhlIGRlZmluaXRpb24gb2YgdGhlIEtQSS5cblx0ICogQHBhcmFtIHtPRGF0YU1vZGVsfSBvTWFpbk1vZGVsIFRoZSBtb2RlbCB1c2VkIHRvIGxvYWQgdGhlIGRhdGEuXG5cdCAqIEBwYXJhbSB7SlNPTk1vZGVsfSBvS1BJTW9kZWwgVGhlIEpTT04gbW9kZWwgd2hlcmUgdGhlIGRhdGEgd2lsbCBiZSBzdG9yZWRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFJldHVybnMgdGhlIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIGRhdGEgaXMgbG9hZGVkLlxuXHQgKi9cblx0cHJvdGVjdGVkIGxvYWRLUElDYXJkRGF0YShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBvTWFpbk1vZGVsOiBPRGF0YU1vZGVsLCBvS1BJTW9kZWw6IEpTT05Nb2RlbDxhbnk+KTogYW55IHtcblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvTWFpbk1vZGVsLmJpbmRMaXN0KFwiL1wiICsga3BpRGVmaW5pdGlvbi5lbnRpdHlTZXQpO1xuXHRcdGNvbnN0IG9Hcm91cDogUmVjb3JkPHN0cmluZywgT2JqZWN0PiA9IHt9O1xuXHRcdGNvbnN0IG9BZ2dyZWdhdGU6IFJlY29yZDxzdHJpbmcsIE9iamVjdD4gPSB7fTtcblxuXHRcdGtwaURlZmluaXRpb24uY2hhcnQuZGltZW5zaW9ucy5mb3JFYWNoKGRpbWVuc2lvbiA9PiB7XG5cdFx0XHRvR3JvdXBbZGltZW5zaW9uLm5hbWVdID0ge307XG5cdFx0fSk7XG5cdFx0a3BpRGVmaW5pdGlvbi5jaGFydC5tZWFzdXJlcy5mb3JFYWNoKG1lYXN1cmUgPT4ge1xuXHRcdFx0b0FnZ3JlZ2F0ZVttZWFzdXJlLm5hbWVdID0ge307XG5cdFx0fSk7XG5cdFx0b0xpc3RCaW5kaW5nLnNldEFnZ3JlZ2F0aW9uKHtcblx0XHRcdGdyb3VwOiBvR3JvdXAsXG5cdFx0XHRhZ2dyZWdhdGU6IG9BZ2dyZWdhdGVcblx0XHR9KTtcblxuXHRcdC8vIE1hbmFnZSBTZWxlY3Rpb25WYXJpYW50IGZpbHRlcnNcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5zZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYUZpbHRlcnMgPSBrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucy5tYXAoY3JlYXRlRmlsdGVyRnJvbURlZmluaXRpb24pLmZpbHRlcihmaWx0ZXIgPT4ge1xuXHRcdFx0XHRyZXR1cm4gZmlsdGVyICE9PSB1bmRlZmluZWQ7XG5cdFx0XHR9KSBhcyBGaWx0ZXJbXTtcblx0XHRcdG9MaXN0QmluZGluZy5maWx0ZXIoYUZpbHRlcnMpO1xuXHRcdH1cblxuXHRcdC8vIFNvcnRpbmdcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5jaGFydC5zb3J0T3JkZXIpIHtcblx0XHRcdG9MaXN0QmluZGluZy5zb3J0KFxuXHRcdFx0XHRrcGlEZWZpbml0aW9uLmNoYXJ0LnNvcnRPcmRlci5tYXAoc29ydEluZm8gPT4ge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgU29ydGVyKHNvcnRJbmZvLm5hbWUsIHNvcnRJbmZvLmRlc2NlbmRpbmcpO1xuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb0xpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCBrcGlEZWZpbml0aW9uLmNoYXJ0Lm1heEl0ZW1zKS50aGVuKChhQ29udGV4dHM6IENvbnRleHRbXSkgPT4ge1xuXHRcdFx0Y29uc3QgY2hhcnREYXRhID0gYUNvbnRleHRzLm1hcChmdW5jdGlvbihvQ29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBvRGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXHRcdFx0XHRrcGlEZWZpbml0aW9uLmNoYXJ0LmRpbWVuc2lvbnMuZm9yRWFjaChkaW1lbnNpb24gPT4ge1xuXHRcdFx0XHRcdG9EYXRhW2RpbWVuc2lvbi5uYW1lXSA9IG9Db250ZXh0LmdldFByb3BlcnR5KGRpbWVuc2lvbi5uYW1lKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGtwaURlZmluaXRpb24uY2hhcnQubWVhc3VyZXMuZm9yRWFjaChtZWFzdXJlID0+IHtcblx0XHRcdFx0XHRvRGF0YVttZWFzdXJlLm5hbWVdID0gb0NvbnRleHQuZ2V0UHJvcGVydHkobWVhc3VyZS5uYW1lKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIG9EYXRhO1xuXHRcdFx0fSk7XG5cblx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vY2hhcnREYXRhXCIsIGNoYXJ0RGF0YSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcG9wb3ZlciB0byBkaXNwbGF5IHRoZSBLUEkgY2FyZFxuXHQgKiBUaGUgcG9wb3ZlciBhbmQgdGhlIGNvbnRhaW5lZCBjYXJkIGZvciB0aGUgS1BJcyBhcmUgY3JlYXRlZCBpZiBuZWNlc3NhcnkuXG5cdCAqIFRoZSBwb3BvdmVyIGlzIHNoYXJlZCBiZXR3ZWVuIGFsbCBLUElzLCBzbyB3ZSBjcmVhdGUgaXQgb25seSBvbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0tQSVRhZyBUaGUgVGFnIHRoYXQgdHJpZ2dlcmVkIHRoZSBwb3BvdmVyIG9wZW5pbmcuXG5cdCAqIEByZXR1cm5zIFRoZSBzaGFyZWQgcG9wb3Zlci5cblx0ICovXG5cdHByb3RlY3RlZCBnZXRQb3BvdmVyKG9LUElUYWc6IEdlbmVyaWNUYWcpOiBQcm9taXNlPFBvcG92ZXI+IHtcblx0XHRpZiAoIXRoaXMub1BvcG92ZXIpIHtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdHNhcC51aVxuXHRcdFx0XHRcdC5nZXRDb3JlKClcblx0XHRcdFx0XHQubG9hZExpYnJhcnkoXCJzYXAvdWkvaW50ZWdyYXRpb25cIiwgeyBhc3luYzogdHJ1ZSB9KVxuXHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdHNhcC51aS5yZXF1aXJlKFtcInNhcC91aS9pbnRlZ3JhdGlvbi93aWRnZXRzL0NhcmRcIl0sIChDYXJkOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5vQ2FyZCA9IG5ldyBDYXJkKHtcblx0XHRcdFx0XHRcdFx0XHR3aWR0aDogXCIyNXJlbVwiLFxuXHRcdFx0XHRcdFx0XHRcdGhlaWdodDogXCJhdXRvXCJcblx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5vUG9wb3ZlciA9IG5ldyBQb3BvdmVyKHtcblx0XHRcdFx0XHRcdFx0XHRpZDogXCJrcGktUG9wb3ZlclwiLFxuXHRcdFx0XHRcdFx0XHRcdHNob3dIZWFkZXI6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHBsYWNlbWVudDogXCJBdXRvXCIsXG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudDogW3RoaXMub0NhcmRdXG5cdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdG9LUElUYWcuYWRkRGVwZW5kZW50KHRoaXMub1BvcG92ZXIpOyAvLyBUaGUgZmlyc3QgY2xpY2tlZCB0YWcgZ2V0cyB0aGUgcG9wb3ZlciBhcyBkZXBlbmRlbnRcblxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKHRoaXMub1BvcG92ZXIpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2gocmVqZWN0KTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMub1BvcG92ZXIpO1xuXHRcdH1cblx0fVxuXG5cdEBQdWJsaWNcblx0cHVibGljIG9uS1BJUHJlc3NlZChvS1BJVGFnOiBhbnksIGtwaUlEOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBvS1BJTW9kZWwgPSBvS1BJVGFnLmdldE1vZGVsKFwia3BpTW9kZWxcIikgYXMgSlNPTk1vZGVsPGFueT47XG5cblx0XHRpZiAodGhpcy5hS1BJRGVmaW5pdGlvbnMgJiYgdGhpcy5hS1BJRGVmaW5pdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBrcGlEZWZpbml0aW9uID0gdGhpcy5hS1BJRGVmaW5pdGlvbnMuZmluZChmdW5jdGlvbihvRGVmKSB7XG5cdFx0XHRcdHJldHVybiBvRGVmLmlkID09PSBrcGlJRDtcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbikge1xuXHRcdFx0XHRjb25zdCBvTW9kZWwgPSBvS1BJVGFnLmdldE1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IGFQcm9taXNlcyA9IFtcblx0XHRcdFx0XHR0aGlzLmxvYWRLUElUYWdEYXRhKGtwaURlZmluaXRpb24sIG9Nb2RlbCwgb0tQSU1vZGVsLCB0cnVlKSxcblx0XHRcdFx0XHR0aGlzLmxvYWRLUElDYXJkRGF0YShrcGlEZWZpbml0aW9uLCBvTW9kZWwsIG9LUElNb2RlbCksXG5cdFx0XHRcdFx0dGhpcy5nZXRQb3BvdmVyKG9LUElUYWcpXG5cdFx0XHRcdF07XG5cblx0XHRcdFx0UHJvbWlzZS5hbGwoYVByb21pc2VzKVxuXHRcdFx0XHRcdC50aGVuKGFSZXN1bHRzID0+IHtcblx0XHRcdFx0XHRcdHRoaXMub0NhcmQuc2V0TWFuaWZlc3Qob0tQSU1vZGVsLmdldFByb3BlcnR5KFwiL1wiICsga3BpSUQgKyBcIi9tYW5pZmVzdFwiKSk7XG5cdFx0XHRcdFx0XHR0aGlzLm9DYXJkLnJlZnJlc2goKTtcblxuXHRcdFx0XHRcdFx0Y29uc3Qgb1BvcG92ZXIgPSBhUmVzdWx0c1syXTtcblx0XHRcdFx0XHRcdG9Qb3BvdmVyLm9wZW5CeShvS1BJVGFnLCBmYWxzZSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZXJyID0+IHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnIpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBLUElNYW5hZ2VtZW50Q29udHJvbGxlckV4dGVuc2lvbjtcbiJdfQ==
|