@sapui5/sap.fe.macros 1.142.0 → 1.142.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/macros/.library +1 -1
- package/src/sap/fe/macros/Field.js +5 -5
- package/src/sap/fe/macros/Field.ts +5 -3
- package/src/sap/fe/macros/FooterContent.js +3 -2
- package/src/sap/fe/macros/FooterContent.tsx +2 -10
- package/src/sap/fe/macros/MessageButton.js +3 -3
- package/src/sap/fe/macros/MessageButton.tsx +3 -2
- package/src/sap/fe/macros/Page.js +8 -4
- package/src/sap/fe/macros/Page.tsx +13 -4
- package/src/sap/fe/macros/RichTextEditor.js +12 -14
- package/src/sap/fe/macros/RichTextEditor.tsx +10 -13
- package/src/sap/fe/macros/ai/EasyFillDialog.js +2 -1
- package/src/sap/fe/macros/ai/EasyFillDialog.tsx +1 -0
- package/src/sap/fe/macros/ai/SummarizationButton.js +6 -4
- package/src/sap/fe/macros/ai/SummarizationButton.tsx +5 -3
- package/src/sap/fe/macros/chart/Action.js +19 -7
- package/src/sap/fe/macros/chart/Action.ts +8 -0
- package/src/sap/fe/macros/chart/ChartDelegate.js +13 -2
- package/src/sap/fe/macros/chart/ChartDelegate.ts +20 -1
- package/src/sap/fe/macros/chart/MdcChartTemplate.js +8 -6
- package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +13 -22
- package/src/sap/fe/macros/controls/FilterBar.js +1 -1
- package/src/sap/fe/macros/controls/FilterBar.ts +8 -1
- package/src/sap/fe/macros/controls/TextLink.js +15 -1
- package/src/sap/fe/macros/controls/TextLink.tsx +19 -0
- package/src/sap/fe/macros/coreUI/OperationParameterDialog.js +23 -18
- package/src/sap/fe/macros/coreUI/OperationParameterDialog.tsx +27 -25
- package/src/sap/fe/macros/field/FieldRuntimeHelper.js +4 -2
- package/src/sap/fe/macros/field/FieldRuntimeHelper.ts +7 -7
- package/src/sap/fe/macros/field/FieldTemplating.js +8 -3
- package/src/sap/fe/macros/field/FieldTemplating.ts +7 -2
- package/src/sap/fe/macros/filterBar/FilterBar.block.js +10 -1
- package/src/sap/fe/macros/filterBar/FilterBar.block.tsx +10 -0
- package/src/sap/fe/macros/form/FormContainer.block.js +9 -8
- package/src/sap/fe/macros/form/FormContainer.block.ts +10 -7
- package/src/sap/fe/macros/internal/field/EditStyle.js +11 -6
- package/src/sap/fe/macros/internal/field/EditStyle.tsx +7 -3
- package/src/sap/fe/macros/internal/valuehelp/AdditionalValueFormatter.js +36 -7
- package/src/sap/fe/macros/internal/valuehelp/AdditionalValueFormatter.ts +35 -6
- package/src/sap/fe/macros/internal/valuehelp/AdditionalValueHelper.js +54 -1
- package/src/sap/fe/macros/internal/valuehelp/AdditionalValueHelper.ts +59 -0
- package/src/sap/fe/macros/library.js +5 -6
- package/src/sap/fe/macros/{library.ts → library.tsx} +1 -1
- package/src/sap/fe/macros/messagebundle.properties +6 -0
- package/src/sap/fe/macros/messages/MessageButton.js +21 -12
- package/src/sap/fe/macros/messages/MessageButton.ts +21 -11
- package/src/sap/fe/macros/multivaluefield/MultiValueFieldDelegate.js +4 -3
- package/src/sap/fe/macros/multivaluefield/MultiValueFieldDelegate.ts +5 -2
- package/src/sap/fe/macros/quickView/QuickView.js +5 -4
- package/src/sap/fe/macros/quickView/QuickView.tsx +10 -3
- package/src/sap/fe/macros/table/ActionsTemplating.js +6 -5
- package/src/sap/fe/macros/table/ActionsTemplating.tsx +4 -4
- package/src/sap/fe/macros/table/MdcTableTemplate.js +27 -10
- package/src/sap/fe/macros/table/MdcTableTemplate.tsx +31 -4
- package/src/sap/fe/macros/table/Table.block.js +3 -1
- package/src/sap/fe/macros/table/Table.block.tsx +7 -4
- package/src/sap/fe/macros/table/TableAPI.js +49 -28
- package/src/sap/fe/macros/table/TableAPI.ts +58 -32
- package/src/sap/fe/macros/table/TableEventHandlerProvider.js +6 -4
- package/src/sap/fe/macros/table/TableEventHandlerProvider.ts +6 -3
- package/src/sap/fe/macros/table/delegates/TableDelegate.js +3 -3
- package/src/sap/fe/macros/table/delegates/TableDelegate.ts +3 -4
- package/src/sap/fe/macros/table/massEdit/MassEditDialog.js +41 -15
- package/src/sap/fe/macros/table/massEdit/MassEditDialog.tsx +41 -22
- package/src/sap/fe/macros/table/mixin/TableHierarchy.js +6 -6
- package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +5 -5
- package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +5 -3
- package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +7 -4
|
@@ -87,6 +87,14 @@ function _setValueStateForFieldWithNoDataContext(
|
|
|
87
87
|
);
|
|
88
88
|
this.setValueStateText(valueStateText);
|
|
89
89
|
this.setValueState(valueState);
|
|
90
|
+
|
|
91
|
+
// Track or untrack active recommendations based on the value state
|
|
92
|
+
const relativePropertyPath = _getRelativePropertyPath(fieldBindingContext, sourcepath);
|
|
93
|
+
if (valueState === ValueState.Information) {
|
|
94
|
+
additionalValueHelper.addActiveRecommendation(fieldBindingContext, relativePropertyPath);
|
|
95
|
+
} else {
|
|
96
|
+
additionalValueHelper.removeActiveRecommendation(fieldBindingContext, relativePropertyPath);
|
|
97
|
+
}
|
|
90
98
|
}
|
|
91
99
|
listBinding.detachChange(fnSetValueState);
|
|
92
100
|
}
|
|
@@ -181,17 +189,25 @@ function formatValueState(
|
|
|
181
189
|
// We reset value state when:
|
|
182
190
|
// 1. No context is bound to the field.
|
|
183
191
|
// 2. isEditable is false
|
|
184
|
-
const
|
|
192
|
+
const associatedControl = this.getParent() as Field;
|
|
193
|
+
const fieldBindingContext = associatedControl?.getBindingContext() as Context | undefined;
|
|
185
194
|
if (!fieldBindingContext || !isEditable) {
|
|
195
|
+
associatedControl.setValueState(ValueState.None);
|
|
196
|
+
// Remove from active recommendations when resetting value state
|
|
197
|
+
if (fieldBindingContext && sourcepath) {
|
|
198
|
+
const relativePropertyPath = _getRelativePropertyPath(fieldBindingContext, sourcepath);
|
|
199
|
+
additionalValueHelper.removeActiveRecommendation(fieldBindingContext, relativePropertyPath);
|
|
200
|
+
}
|
|
186
201
|
return ValueState.None;
|
|
187
202
|
}
|
|
188
203
|
fieldTextValue = fieldTextValue === "undefined" ? undefined : fieldTextValue;
|
|
189
204
|
// We don't change the present value state when:
|
|
190
205
|
// 1. Source path is not available.
|
|
191
206
|
// 2. Field context is transient.
|
|
192
|
-
const presentValueState =
|
|
207
|
+
const presentValueState = associatedControl?.getValueState() as ValueState;
|
|
193
208
|
const isTransient = fieldBindingContext.isTransient?.();
|
|
194
209
|
if (!sourcepath || isTransient) {
|
|
210
|
+
associatedControl.setValueState(presentValueState);
|
|
195
211
|
return presentValueState;
|
|
196
212
|
}
|
|
197
213
|
|
|
@@ -199,10 +215,14 @@ function formatValueState(
|
|
|
199
215
|
const recommendationsAvailable =
|
|
200
216
|
recommendationValue || recommendationDescription || (!!all_recommendations && Object.keys(all_recommendations).length > 0);
|
|
201
217
|
const recommendationsText = Library.getResourceBundleFor("sap.fe.core")!.getText("RECOMMENDATIONS_DATA_INFO");
|
|
202
|
-
const presentValueStateText =
|
|
218
|
+
const presentValueStateText = associatedControl?.getValueStateText();
|
|
203
219
|
const presentVSIsRecommendations = presentValueState === ValueState.Information && presentValueStateText === recommendationsText;
|
|
204
220
|
//If field value is present or recommendations are not available but presentState is Info then we change it to None
|
|
205
221
|
if (presentVSIsRecommendations && (!recommendationsAvailable || fieldValue || fieldTextValue)) {
|
|
222
|
+
associatedControl.setValueState(ValueState.None);
|
|
223
|
+
// Remove from active recommendations when resetting value state
|
|
224
|
+
const relativePropertyPath = _getRelativePropertyPath(fieldBindingContext, sourcepath);
|
|
225
|
+
additionalValueHelper.removeActiveRecommendation(fieldBindingContext, relativePropertyPath);
|
|
206
226
|
return ValueState.None;
|
|
207
227
|
}
|
|
208
228
|
|
|
@@ -217,7 +237,7 @@ function formatValueState(
|
|
|
217
237
|
) {
|
|
218
238
|
// No context data avalilable yet and parent binding is listbinding (Field in Table scenario)
|
|
219
239
|
_setValueStateForFieldWithNoDataContext.call(
|
|
220
|
-
|
|
240
|
+
associatedControl,
|
|
221
241
|
recommendationValue,
|
|
222
242
|
recommendationDescription,
|
|
223
243
|
fieldBindingContext,
|
|
@@ -233,13 +253,22 @@ function formatValueState(
|
|
|
233
253
|
fieldBindingContext,
|
|
234
254
|
sourcepath,
|
|
235
255
|
recommendationsText,
|
|
236
|
-
|
|
256
|
+
associatedControl
|
|
237
257
|
);
|
|
238
|
-
|
|
258
|
+
associatedControl.setValueStateText(valueStateText);
|
|
259
|
+
associatedControl.setValueState(valueState);
|
|
260
|
+
// Track or untrack active recommendations based on the value state
|
|
261
|
+
const relativePropertyPath = _getRelativePropertyPath(fieldBindingContext, sourcepath);
|
|
262
|
+
if (valueState === ValueState.Information) {
|
|
263
|
+
additionalValueHelper.addActiveRecommendation(fieldBindingContext, relativePropertyPath);
|
|
264
|
+
} else {
|
|
265
|
+
additionalValueHelper.removeActiveRecommendation(fieldBindingContext, relativePropertyPath);
|
|
266
|
+
}
|
|
239
267
|
return valueState;
|
|
240
268
|
}
|
|
241
269
|
}
|
|
242
270
|
|
|
271
|
+
associatedControl.setValueState(presentValueState);
|
|
243
272
|
return presentValueState;
|
|
244
273
|
}
|
|
245
274
|
formatValueState.__functionName = "._formatters.AdditionalValueFormatter.bind($control)#formatValueState";
|
|
@@ -528,9 +528,62 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
|
|
|
528
528
|
}
|
|
529
529
|
});
|
|
530
530
|
}
|
|
531
|
+
},
|
|
532
|
+
/**
|
|
533
|
+
* Adds a property path to the active recommendations for a given context path in the localAnnotationModel.
|
|
534
|
+
* @param context Binding context of the field
|
|
535
|
+
* @param propertyPath Property path to add to active recommendations
|
|
536
|
+
*/
|
|
537
|
+
addActiveRecommendation: function (context, propertyPath) {
|
|
538
|
+
const model = context.getModel();
|
|
539
|
+
const localAnnotationModel = model.getLocalAnnotationModel();
|
|
540
|
+
const contextPath = context.getPath();
|
|
541
|
+
const activeRecommendations = localAnnotationModel.getProperty("/activeRecommendations") ?? {};
|
|
542
|
+
|
|
543
|
+
// Initialize array for this context path if it doesn't exist
|
|
544
|
+
let existingPaths = activeRecommendations[contextPath];
|
|
545
|
+
if (!existingPaths) {
|
|
546
|
+
existingPaths = [];
|
|
547
|
+
activeRecommendations[contextPath] = existingPaths;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// Add property path if not already present
|
|
551
|
+
if (!existingPaths.includes(propertyPath)) {
|
|
552
|
+
existingPaths.push(propertyPath);
|
|
553
|
+
localAnnotationModel.setProperty("/activeRecommendations", activeRecommendations);
|
|
554
|
+
}
|
|
555
|
+
},
|
|
556
|
+
/**
|
|
557
|
+
* Removes a property path from the active recommendations for a given context path in the localAnnotationModel.
|
|
558
|
+
* @param context Binding context of the field
|
|
559
|
+
* @param propertyPath Property path to remove from active recommendations
|
|
560
|
+
*/
|
|
561
|
+
removeActiveRecommendation: function (context, propertyPath) {
|
|
562
|
+
const model = context.getModel();
|
|
563
|
+
const localAnnotationModel = model.getLocalAnnotationModel();
|
|
564
|
+
const contextPath = context.getPath();
|
|
565
|
+
const activeRecommendations = localAnnotationModel.getProperty("/activeRecommendations") ?? {};
|
|
566
|
+
const existingPaths = activeRecommendations[contextPath];
|
|
567
|
+
if (existingPaths) {
|
|
568
|
+
// Filter out the property path
|
|
569
|
+
const filteredPaths = existingPaths.filter(path => path !== propertyPath);
|
|
570
|
+
|
|
571
|
+
// Update or remove the context path
|
|
572
|
+
if (filteredPaths.length === 0) {
|
|
573
|
+
// Remove the context path by creating a new object without it
|
|
574
|
+
const updatedRecommendations = Object.fromEntries(Object.entries(activeRecommendations).filter(_ref => {
|
|
575
|
+
let [key] = _ref;
|
|
576
|
+
return key !== contextPath;
|
|
577
|
+
}));
|
|
578
|
+
localAnnotationModel.setProperty("/activeRecommendations", updatedRecommendations);
|
|
579
|
+
} else {
|
|
580
|
+
activeRecommendations[contextPath] = filteredPaths;
|
|
581
|
+
localAnnotationModel.setProperty("/activeRecommendations", activeRecommendations);
|
|
582
|
+
}
|
|
583
|
+
}
|
|
531
584
|
}
|
|
532
585
|
};
|
|
533
586
|
_exports.additionalValueHelper = additionalValueHelper;
|
|
534
587
|
return _exports;
|
|
535
588
|
}, false);
|
|
536
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBZGRpdGlvbmFsVmFsdWVHcm91cEtleSIsIl9leHBvcnRzIiwiYWRkaXRpb25hbFZhbHVlSGVscGVyIiwicmVxdWVzdEZvckFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhIiwiYWRkaXRpb25hbFZhbHVlcyIsInZhbHVlSGVscExpc3RCaW5kaW5nIiwidmFsdWVIZWxwQmluZGluZ0luZm8iLCJwYXlsb2FkIiwic29ydGVycyIsInRhYmxlIiwiYWxsTGlzdEJpbmRpbmciLCJhZGRpdGlvbmFsVmFsdWVDb250ZXh0UHJvbWlzZSIsInJldmVyc2VSZWNvbW1lbmRhdGlvblZhbHVlcyIsImZpbHRlciIsInZhbHVlIiwiZ3JvdXBLZXkiLCJyZWNvbW1lbmRhdGlvbiIsInJldmVyc2UiLCJwYXJhbWV0ZXJzIiwiJHNlbGVjdCIsInF1YWxpZmllcnMiLCJ2YWx1ZUhlbHBRdWFsaWZpZXIiLCJ2aFByb3BlcnRpZXMiLCJzZWFyY2hUZXJtIiwiJHNlYXJjaCIsImlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzIiwiJGNvdW50IiwibGlzdFNvcnRlcnMiLCJmb3JFYWNoIiwic29ydGVyIiwicHVzaCIsIlNvcnRlciIsIm5hbWUiLCJkZXNjZW5kaW5nIiwidmFsdWVIZWxwTGlzdE1vZGVsIiwiZ2V0TW9kZWwiLCJhZGRpdGlvbmFsVmFsdWVMaXN0QmluZGluZ3MiLCJnZXRBZGRpdGlvbmFsVmFsdWVDb250ZXh0QmluZGluZ3MiLCJsZW5ndGgiLCJyZXF1ZXN0Q29udGV4dHMiLCJzdWJtaXRCYXRjaCIsImFkZGl0aW9uYWxWYWx1ZXNDb250ZXh0IiwiUHJvbWlzZSIsImFsbCIsImNvdW50IiwiZ2V0Q291bnQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInNldFByb3BlcnR5IiwicmVjb21tZW5kYXRpb25Db250ZXh0cyIsImFsbENvbnRleHRzIiwicmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSIsIm1hcCIsImNvbnRleHQiLCJnZXRPYmplY3QiLCJvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSIsImFkZGl0aW9uYWxWYWx1ZUNvbnRleHRCaW5kaW5ncyIsInZhbHVlSGVscEZpbHRlcnMiLCJnZXRWYWx1ZUhlbHBCaW5kaW5nRmlsdGVycyIsImdldE1ldGFNb2RlbCIsInJlY29tbWVuZGF0aW9uVmFsdWVGaWx0ZXJzIiwiZ2V0QWRkaXRpb25hbFZhbHVlRmlsdGVycyIsImJpbmRMaXN0IiwicGF0aCIsInVuZGVmaW5lZCIsIm1ldGFNb2RlbCIsImZpbHRlcnMiLCJBcnJheSIsImlzQXJyYXkiLCJhZGREcmFmdEZpbHRlciIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJvYmplY3RQYXRoIiwiTWV0YU1vZGVsQ29udmVydGVyIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiaXNEcmFmdFN1cHBvcnRlZCIsIk1vZGVsSGVscGVyIiwiaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQiLCJGaWx0ZXIiLCJvcGVyYXRvciIsInZhbHVlMSIsInJlc3VtZVZhbHVlTGlzdEJpbmRpbmdBbmRSZXNldENoYW5nZXMiLCJpc1N1c3BlbmRlZCIsInJlc3VtZUFzeW5jIiwicmVzZXRDaGFuZ2VzIiwiZXJyb3IiLCJzb3J0QW5kRmlsdGVyTGlzdEJpbmRpbmciLCJOT05FIiwiRmlsdGVyVHlwZSIsIkFwcGxpY2F0aW9uIiwibW9kaWZpZWRTb3J0ZXJzIiwiZ2V0U29ydGVyRnVuY3Rpb24iLCJzb3J0IiwicmV2ZXJzZUFkZGl0aW9uYWxWYWx1ZXMiLCJhZGRpdGlvbmFsVmFsdWUiLCJ2YWx1ZXMiLCJwcm9wZXJ0eVBhdGgiLCJyZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImdldFByb3BlcnR5IiwiZ2V0VGV4dCIsInJlY2VudFZhbHVlIiwiY3JlYXRlVHJhbnNpZW50Q29udGV4dHNGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSIsInJlY2VudFZhbHVlc0NvbnRleHREYXRhIiwiY3JlYXRlR3JvdXBlZFRyYW5zaWVudENvbnRleHRzIiwib3RoZXIiLCJhZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSIsImNvbnRleHREYXRhIiwiY3JlYXRlIiwiY3JlYXRlZCIsImNhbmNlbGVkIiwiTG9nIiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMiLCJkYXRhIiwiYmluZGluZ0NvbnRleHQiLCJiaW5kaW5nUGF0aCIsInJlbGV2YW50UmVjb21tZW5kYXRpb25zIiwiT2JqZWN0Iiwia2V5cyIsImdldFJlY29tbWVuZGF0aW9uUHJvcGVydHlQYXRoIiwidmVyc2lvbiIsImdldEFkZGl0aW9uYWxWYWx1ZUZyb21Qcm9wZXJ0eVBhdGgiLCJ2YWx1ZURhdGEiLCJfY2hlY2tGb3JLZXlzSW5SZWNvbW1lbmRhdGlvbnMiLCJrZXlQcm9wZXJ0aWVzIiwia2V5IiwiZ2V0QWRkaXRpb25hbFZhbHVlRnJvbUtleXMiLCJyZWNvbW1lbmRhdGlvbkRhdGEiLCJyZXN1bHQiLCJyZWNEYXRhIiwiYWxsS2V5c01hdGNoIiwiX2dldFJlY29tbWVuZGF0aW9uIiwib2xkRGF0YSIsImFzc2lnbiIsImluY2x1ZGVzIiwicHJvcGVydHlQYXRocyIsInNwbGl0IiwibmF2UHJvcFBhdGgiLCJzcGxpY2UiLCJqb2luIiwic3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlciIsImdldFN0YW5kYXJkUmVjb21tZW5kYXRpb25zIiwiZ2V0UmVsZXZhbnRPdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSIsInZhbHVlSGVscEtleXMiLCJjaGVja1ZhbHVlc01hdGNoIiwiZ2V0UmVsZXZhbnRSZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSIsImJpbmRpbmdJbmZvIiwicmVjZW50VmFsdWVzTW9kZWwiLCJKU09OTW9kZWwiLCJyZWNlbnRWYWx1ZXNMaXN0IiwiZ2V0QWxsQ3VycmVudENvbnRleHRzIiwicmVjZW50VmFsdWVDb250ZXh0RGF0YSIsImZpbHRlclJlY2VudFZhbHVlc0NvbnRleHREYXRhIiwiY29udGV4dERhdGFUb0JlTWF0Y2hlZCIsImNvbnRleHREYXRhTGlzdCIsIm9iaiIsIm1hdGNoIiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhIiwicmVjb21tZW5kYXRpb25WYWx1ZXMiLCJhcmd1bWVudHMiLCJ2YWx1ZUxpc3RQcm9wZXJ0eSIsInJlbGV2YW50UmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSIsImZvdW5kT2JqZWN0IiwiZmluZCIsInVwZGF0ZUZpbmlzaGVkIiwiZXZlbnQiLCJzb3VyY2UiLCJnZXRTb3VyY2UiLCJ0YWJsZUJpbmRpbmdDb250ZXh0IiwiYWN0dWFsIiwidG90YWwiLCJyZWFzb24iLCJnZXRQYXJhbWV0ZXJzIiwicGFnaW5hdGlvbkRhdGEiLCJhZGRpdGlvbmFsRGF0YSIsImdldEJpbmRpbmciXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkFkZGl0aW9uYWxWYWx1ZUhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCAqIGFzIE1ldGFNb2RlbENvbnZlcnRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUge1xuXHRJbkNvbXBsZXRlbmVzc0luZm9UeXBlLFxuXHRJbnRlcm5hbFByb3BlcnR5QWRkaXRpb25hbFZhbHVlLFxuXHRLZXlQcm9wZXJ0aWVzRGF0YVR5cGUsXG5cdFJlY29tbWVuZGF0aW9uRGF0YUZvck5hdlByb3BlcnR5VHlwZSxcblx0UmVjb21tZW5kYXRpb25WYWx1ZVR5cGVcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVjb21tZW5kYXRpb25IZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgUmVjb21tZW5kYXRpb25JbmZvLCBTdGFuZGFyZFJlY29tbWVuZGF0aW9uRGF0YVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFuZGFyZFJlY29tbWVuZGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgeyBzdGFuZGFyZFJlY29tbWVuZGF0aW9uSGVscGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBGaWVsZERhdGFUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1ZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgeyBTb3J0ZXJUeXBlLCBWYWx1ZUhlbHBQYXlsb2FkIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvdmFsdWVoZWxwL1ZhbHVlTGlzdEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC9tL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBVSTVFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIEV2ZW50UHJvdmlkZXIgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50UHJvdmlkZXJcIjtcbmltcG9ydCB0eXBlIHsgQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8gfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IHR5cGUgTVRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL3ZhbHVlaGVscC9jb250ZW50L01UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCBGaWx0ZXJUeXBlIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyVHlwZVwiO1xuaW1wb3J0IFNvcnRlciBmcm9tIFwic2FwL3VpL21vZGVsL1NvcnRlclwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHRFcnJvclR5cGUgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuXG5lbnVtIEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5IHtcblx0cmVjb21tZW5kYXRpb24gPSBcInJlY29tbWVuZGF0aW9uXCIsXG5cdHJlY2VudFZhbHVlID0gXCJyZWNlbnRWYWx1ZVwiLFxuXHRvdGhlciA9IFwib3RoZXJcIlxufVxuZXhwb3J0IHR5cGUgQWRkaXRpb25hbFZhbHVlVHlwZSA9IHtcblx0cHJvcGVydHlQYXRoOiBzdHJpbmc7XG5cdHZhbHVlczogKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pW107XG5cdGdyb3VwS2V5OiBBZGRpdGlvbmFsVmFsdWVHcm91cEtleTsgLy8gdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBncm91cFxufTtcbmV4cG9ydCB0eXBlIEJpbmRpbmdJbmZvUGFyYW1ldGVycyA9IHtcblx0JHNlbGVjdDogc3RyaW5nW107XG5cdCRleHBhbmQ/OiBzdHJpbmdbXTtcblx0JHNlYXJjaDogc3RyaW5nO1xuXHQkY291bnQ6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBBZGRpdGlvblZhbHVlRGVmaW5pdGlvbiA9XG5cdHwgSW5Db21wbGV0ZW5lc3NJbmZvVHlwZVxuXHR8IFJlY29tbWVuZGF0aW9uRGF0YUZvck5hdlByb3BlcnR5VHlwZVtdXG5cdHwgSW50ZXJuYWxQcm9wZXJ0eUFkZGl0aW9uYWxWYWx1ZVxuXHR8IG9iamVjdDtcbmNvbnN0IGFkZGl0aW9uYWxWYWx1ZUhlbHBlciA9IHtcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIGNvbnRleHQgYmFzZWQgb24gYWRkaXRpb25hbCB2YWx1ZSBmaWx0ZXJzIGFuZCBjdXN0b20gc29ydGVyIGFuZCByZXF1ZXN0IGNvbnRleHRzIGZyb20gaXQuXG5cdCAqIEBwYXJhbSBhZGRpdGlvbmFsVmFsdWVzIEFycmF5IG9mIGFkZGl0aW9uYWwgdmFsdWVzXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBMaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIHZhbHVlSGVscEJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gYmluZCB0aGUgbGlzdCB0byB0aGUgbW9kZWxcblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBvZiB0aGUgdmFsdWUgaGVscFxuXHQgKiBAcGFyYW0gc29ydGVycyBTb3J0ZXJzIG9mIHRoZSB2YWx1ZSBoZWxwIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gdGFibGUgVGFibGUgZm9yIHdoaWNoIHRoZSB2YWx1ZSBoZWxwIGlzIHJlcXVlc3RlZFxuXHQgKiBAcmV0dXJucyBBZGRpdGlvbmFsIHZhbHVlIGNvbnRleHRzXG5cdCAqL1xuXHRyZXF1ZXN0Rm9yQWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGE6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRhZGRpdGlvbmFsVmFsdWVzOiBBZGRpdGlvbmFsVmFsdWVUeXBlW10sXG5cdFx0dmFsdWVIZWxwTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0dmFsdWVIZWxwQmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsXG5cdFx0c29ydGVyczogU29ydGVyVHlwZVtdLFxuXHRcdHRhYmxlOiBUYWJsZVxuXHQpOiBQcm9taXNlPHtcblx0XHRyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW107XG5cdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXTtcblx0fT4ge1xuXHRcdGxldCBhbGxMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBhZGRpdGlvbmFsVmFsdWVDb250ZXh0UHJvbWlzZTogUHJvbWlzZTxWNENvbnRleHRbXT5bXSA9IFtdO1xuXHRcdC8vIHJldmVyc2UgdGhlIGFycmF5IHNvIHRoYXQgd2hpbGUgY3JlYXRpbmcgdHJhbnNpZW50IGNvbnRleHQgZmlyc3QgYWRkaXRpb25hbCB2YWx1ZSBpcyBncm91cGVkIGZpcnN0XG5cdFx0Y29uc3QgcmV2ZXJzZVJlY29tbWVuZGF0aW9uVmFsdWVzID0gW1xuXHRcdFx0Li4uYWRkaXRpb25hbFZhbHVlcy5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZS5ncm91cEtleSA9PT0gQWRkaXRpb25hbFZhbHVlR3JvdXBLZXkucmVjb21tZW5kYXRpb24pXG5cdFx0XS5yZXZlcnNlKCk7XG5cblx0XHQvLyBsb2dpYyB0byBhZGQgJHNlbGVjdCBmb3IgbXVsdGktbGV2ZWwgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFzIGZpbGxpbmcgJHNlbGVjdCBpcyBzdWZmaWNpZW50IGZvciB0aGUgbW9kZWwgdG8gY3JlYXRlIHRoZSBleHBhbmQgY2FsbHNcblx0XHQodmFsdWVIZWxwQmluZGluZ0luZm8ucGFyYW1ldGVycyBhcyBCaW5kaW5nSW5mb1BhcmFtZXRlcnMpLiRzZWxlY3QgPVxuXHRcdFx0cGF5bG9hZC5xdWFsaWZpZXJzW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXS52aFByb3BlcnRpZXMgPz8gW107XG5cblx0XHQvLyBjaGVjayBpZiB0aGVyZSBpcyBhbnkgaW5wdXQgaW4gdGhlIGZpZWxkXG5cdFx0Ly8gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGRldGVybWluZSB0byBzaG93IHRoZSBcIm90aGVyc1wiIHNlY3Rpb24gb3Igbm90XG5cdFx0Ly8gYW5kIGFsc28gdG8gZGV0ZXJtaW5lIGlmIHR5cGVBaGVhZCBzaG91bGQgb3BlbiBvciBub3Rcblx0XHRjb25zdCBzZWFyY2hUZXJtID0gKHZhbHVlSGVscEJpbmRpbmdJbmZvLnBhcmFtZXRlcnMgYXMgQmluZGluZ0luZm9QYXJhbWV0ZXJzKS4kc2VhcmNoO1xuXHRcdCh2YWx1ZUhlbHBCaW5kaW5nSW5mby5wYXJhbWV0ZXJzIGFzIEJpbmRpbmdJbmZvUGFyYW1ldGVycykuJHNlYXJjaCA9IHNlYXJjaFRlcm07XG5cdFx0aWYgKHBheWxvYWQuaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMpIHtcblx0XHRcdCh2YWx1ZUhlbHBCaW5kaW5nSW5mby5wYXJhbWV0ZXJzIGFzIEJpbmRpbmdJbmZvUGFyYW1ldGVycykuJGNvdW50ID0gdHJ1ZTtcblx0XHR9XG5cdFx0Y29uc3QgbGlzdFNvcnRlcnM6IFNvcnRlcltdID0gW107XG5cdFx0c29ydGVycy5mb3JFYWNoKChzb3J0ZXI6IFNvcnRlclR5cGUpID0+IGxpc3RTb3J0ZXJzLnB1c2gobmV3IFNvcnRlcihzb3J0ZXIubmFtZSA/PyBcIlwiLCBzb3J0ZXIuZGVzY2VuZGluZykpKTtcblx0XHRjb25zdCB2YWx1ZUhlbHBMaXN0TW9kZWw6IE9EYXRhTW9kZWwgPSB2YWx1ZUhlbHBMaXN0QmluZGluZy5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWw7XG5cdFx0Ly8gZ2V0IHRoZSBsaXN0IGJpbmRpbmcgZm9yIHJlY29tbWVuZGF0aW9uIHZhbHVlcyBhbmQgb3RoZXJzIHZhbHVlc1xuXHRcdGNvbnN0IGFkZGl0aW9uYWxWYWx1ZUxpc3RCaW5kaW5nczogT0RhdGFMaXN0QmluZGluZ1tdID0gdGhpcy5nZXRBZGRpdGlvbmFsVmFsdWVDb250ZXh0QmluZGluZ3MoXG5cdFx0XHRyZXZlcnNlUmVjb21tZW5kYXRpb25WYWx1ZXMsXG5cdFx0XHRzZWFyY2hUZXJtLFxuXHRcdFx0cGF5bG9hZCxcblx0XHRcdHZhbHVlSGVscExpc3RNb2RlbCxcblx0XHRcdHZhbHVlSGVscEJpbmRpbmdJbmZvLFxuXHRcdFx0bGlzdFNvcnRlcnNcblx0XHQpO1xuXHRcdGlmIChhZGRpdGlvbmFsVmFsdWVMaXN0QmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0aWYgKGFkZGl0aW9uYWxWYWx1ZUxpc3RCaW5kaW5ncy5sZW5ndGggPT09IDIpIHtcblx0XHRcdFx0YWRkaXRpb25hbFZhbHVlQ29udGV4dFByb21pc2UucHVzaChhZGRpdGlvbmFsVmFsdWVMaXN0QmluZGluZ3NbMF0ucmVxdWVzdENvbnRleHRzKDAsIDEwLCBcImFkZGl0aW9uYWxWYWx1ZVwiKSk7XG5cdFx0XHRcdGFsbExpc3RCaW5kaW5nID0gYWRkaXRpb25hbFZhbHVlTGlzdEJpbmRpbmdzWzFdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YWxsTGlzdEJpbmRpbmcgPSBhZGRpdGlvbmFsVmFsdWVMaXN0QmluZGluZ3NbMF07XG5cdFx0XHR9XG5cdFx0XHQvLyBpbiBjYXNlIG9mIGRyb3Bkb3duLCB3ZSBmZXRjaCBmaXJzdCAxMDAgcmVjb3JkcyBvbiBmaXJzdCBsb2FkIGFuZCB0aGVuIG1ha2Ugc3Vic2VxdWVudCByZXF1ZXN0cyB1cG9uIHVzZXIncyBzY3JvbGwuXG5cdFx0XHRhZGRpdGlvbmFsVmFsdWVDb250ZXh0UHJvbWlzZS5wdXNoKFxuXHRcdFx0XHRhbGxMaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgcGF5bG9hZC5pc1ZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlcyA/IDEwMCA6IDEwLCBcImFkZGl0aW9uYWxWYWx1ZVwiKVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0YXdhaXQgdmFsdWVIZWxwTGlzdE1vZGVsLnN1Ym1pdEJhdGNoKFwiYWRkaXRpb25hbFZhbHVlXCIpO1xuXHRcdGNvbnN0IGFkZGl0aW9uYWxWYWx1ZXNDb250ZXh0ID0gYXdhaXQgUHJvbWlzZS5hbGwoYWRkaXRpb25hbFZhbHVlQ29udGV4dFByb21pc2UpO1xuXHRcdC8vIHdlIHN0b3JlIHRoaXMgbGlzdCBiaW5kaW5ncyBpbiBvcmRlciB0byBiZSBhYmxlIHRvIG1ha2Ugc3Vic2VxdWVudCByZXF1ZXN0cyBvbiB1c2VyJ3Mgc2Nyb2xsXG5cdFx0Y29uc3QgY291bnQgPSBhbGxMaXN0QmluZGluZz8uZ2V0Q291bnQoKTtcblx0XHRpZiAoY291bnQgJiYgY291bnQgPiAxMDApIHtcblx0XHRcdHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LnNldFByb3BlcnR5KFwiYWxsTGlzdEJpbmRpbmdcIiwgYWxsTGlzdEJpbmRpbmcpO1xuXHRcdH1cblx0XHRsZXQgcmVjb21tZW5kYXRpb25Db250ZXh0czogVjRDb250ZXh0W10gPSBbXSxcblx0XHRcdGFsbENvbnRleHRzOiBWNENvbnRleHRbXSA9IFtdO1xuXHRcdGlmIChyZXZlcnNlUmVjb21tZW5kYXRpb25WYWx1ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0cmVjb21tZW5kYXRpb25Db250ZXh0cyA9IGFkZGl0aW9uYWxWYWx1ZXNDb250ZXh0WzBdO1xuXHRcdFx0aWYgKHNlYXJjaFRlcm0gfHwgcGF5bG9hZC5pc1ZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlcykge1xuXHRcdFx0XHRhbGxDb250ZXh0cyA9IGFkZGl0aW9uYWxWYWx1ZXNDb250ZXh0WzFdO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoc2VhcmNoVGVybSB8fCBwYXlsb2FkLmlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzKSB7XG5cdFx0XHRhbGxDb250ZXh0cyA9IGFkZGl0aW9uYWxWYWx1ZXNDb250ZXh0WzBdO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEgPSByZWNvbW1lbmRhdGlvbkNvbnRleHRzLm1hcCgoY29udGV4dCkgPT4gY29udGV4dC5nZXRPYmplY3QoKSBhcyBGaWVsZERhdGFUeXBlKTtcblx0XHRjb25zdCBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdID0gYWxsQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldE9iamVjdCgpIGFzIEZpZWxkRGF0YVR5cGUpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YVxuXHRcdH07XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gcmV0cmlldmUgYWxsIHJlbGV2YW50IGxpc3QgYmluZGluZ3MgKHJlY29tbWVuZGF0aW9uIGFuZCBvdGhlcnMpIHRoYXQgaXMgbmVlZGVkIHRvIG1ha2UgYSBiYWNrZW5kIGNhbGwuXG5cdCAqIEBwYXJhbSByZXZlcnNlUmVjb21tZW5kYXRpb25WYWx1ZXMgUmV2ZXJzZWQgcmVjb21tZW5kYXRpb24gdmFsdWVzXG5cdCAqIEBwYXJhbSBzZWFyY2hUZXJtIFNlYXJjaCB0ZXJtIGVudGVyZWQgYnkgdGhlIHVzZXJcblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBvZiB0aGUgdmFsdWUgaGVscFxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwTGlzdE1vZGVsIE1vZGVsIG9mIHRoZSB2YWx1ZSBoZWxwXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBCaW5kaW5nSW5mbyBCaW5kaW5nIGluZm8gb2YgdGhlIHZhbHVlIGhlbHBcblx0ICogQHBhcmFtIHNvcnRlciBDdXN0b20gc29ydGVyIHdoaWNoIG5lZWRzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcmV0dXJucyBBbGwgdGhlIGxpc3QgYmluZGluZyB3aGljaCB3b3VsZCBiZSB1c2VkIHRvIHRyaWdnZXIgY2FsbHMgdG8gdGhlIGJhY2tlbmQuXG5cdCAqL1xuXHRnZXRBZGRpdGlvbmFsVmFsdWVDb250ZXh0QmluZGluZ3M6IGZ1bmN0aW9uIChcblx0XHRyZXZlcnNlUmVjb21tZW5kYXRpb25WYWx1ZXM6IEFkZGl0aW9uYWxWYWx1ZVR5cGVbXSxcblx0XHRzZWFyY2hUZXJtOiBzdHJpbmcsXG5cdFx0cGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCxcblx0XHR2YWx1ZUhlbHBMaXN0TW9kZWw6IE9EYXRhTW9kZWwsXG5cdFx0dmFsdWVIZWxwQmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdHNvcnRlcjogU29ydGVyW11cblx0KTogT0RhdGFMaXN0QmluZGluZ1tdIHtcblx0XHRjb25zdCBhZGRpdGlvbmFsVmFsdWVDb250ZXh0QmluZGluZ3M6IE9EYXRhTGlzdEJpbmRpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IHZhbHVlSGVscEZpbHRlcnM6IEZpbHRlcltdID0gW1xuXHRcdFx0Li4udGhpcy5nZXRWYWx1ZUhlbHBCaW5kaW5nRmlsdGVycyh2YWx1ZUhlbHBCaW5kaW5nSW5mbywgcGF5bG9hZCwgdmFsdWVIZWxwTGlzdE1vZGVsLmdldE1ldGFNb2RlbCgpKVxuXHRcdF07XG5cdFx0Y29uc3QgcmVjb21tZW5kYXRpb25WYWx1ZUZpbHRlcnMgPSB0aGlzLmdldEFkZGl0aW9uYWxWYWx1ZUZpbHRlcnMocmV2ZXJzZVJlY29tbWVuZGF0aW9uVmFsdWVzLCBbLi4udmFsdWVIZWxwRmlsdGVyc10pO1xuXG5cdFx0aWYgKHJldmVyc2VSZWNvbW1lbmRhdGlvblZhbHVlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyBiaW5kaW5nIHJlcHJlc2VudCByZWNvbW1lbmRhdGlvbiBsaXN0IGJpbmRpbmcuXG5cdFx0XHRhZGRpdGlvbmFsVmFsdWVDb250ZXh0QmluZGluZ3MucHVzaChcblx0XHRcdFx0dmFsdWVIZWxwTGlzdE1vZGVsLmJpbmRMaXN0KFxuXHRcdFx0XHRcdHZhbHVlSGVscEJpbmRpbmdJbmZvLnBhdGgsXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvblZhbHVlRmlsdGVycyxcblx0XHRcdFx0XHR2YWx1ZUhlbHBCaW5kaW5nSW5mby5wYXJhbWV0ZXJzXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGlmIChzZWFyY2hUZXJtIHx8IHBheWxvYWQuaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMpIHtcblx0XHRcdC8vIGJpbmRpbmcgcmVwcmVzZW50IGFsbCBkYXRhIGxpc3QgYmluZGluZ3MuXG5cdFx0XHRhZGRpdGlvbmFsVmFsdWVDb250ZXh0QmluZGluZ3MucHVzaChcblx0XHRcdFx0dmFsdWVIZWxwTGlzdE1vZGVsLmJpbmRMaXN0KHZhbHVlSGVscEJpbmRpbmdJbmZvLnBhdGgsIHVuZGVmaW5lZCwgc29ydGVyLCB2YWx1ZUhlbHBGaWx0ZXJzLCB2YWx1ZUhlbHBCaW5kaW5nSW5mby5wYXJhbWV0ZXJzKVxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWRkaXRpb25hbFZhbHVlQ29udGV4dEJpbmRpbmdzO1xuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSB0byBmZXRjaCB0aGUgdmFsdWVoZWxwIGJpbmRpbmcgZmlsdGVycy5cblx0ICogQHBhcmFtIHZhbHVlSGVscEJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gYmluZCB0aGUgbGlzdCB0byB0aGUgbW9kZWxcblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBvZiB0aGUgdmFsdWUgaGVscCB0byBjaGVjayBpZiBpdCdzIGEgZHJvcGRvd24gc2NlbmFyaW9cblx0ICogQHBhcmFtIG1ldGFNb2RlbCBUaGUgT0RhdGEgbWV0YSBtb2RlbCB0byByZXNvbHZlIGVudGl0eSBzZXQgZnJvbSBwYXRoXG5cdCAqIEByZXR1cm5zIEZpbHRlcnMgb2YgdmFsdWVoZWxwIGJpbmRpbmdcblx0ICovXG5cdGdldFZhbHVlSGVscEJpbmRpbmdGaWx0ZXJzOiBmdW5jdGlvbiAoXG5cdFx0dmFsdWVIZWxwQmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdHBheWxvYWQ/OiBWYWx1ZUhlbHBQYXlsb2FkLFxuXHRcdG1ldGFNb2RlbD86IE9EYXRhTWV0YU1vZGVsXG5cdCk6IEZpbHRlcltdIHtcblx0XHRjb25zdCBmaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xuXHRcdC8vIGdldCBhbGwgZXhpc3RpbmcgZmlsdGVycyBmcm9tIHRoZSBiaW5kaW5nIGluZm9cblx0XHQvLyB0aGlzICsgYWRkaXRpb25hbCB2YWx1ZSBmaWx0ZXJzIHdpbGwgYmUgdXNlZCBsYXRlciBvbiB0byBmZXRjaCBhZGRpdGlvbmFsIHZhbHVlcyBmcm9tIHRoZSBiYWNrZW5kXG5cdFx0aWYgKHZhbHVlSGVscEJpbmRpbmdJbmZvLmZpbHRlcnMpIHtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlSGVscEJpbmRpbmdJbmZvLmZpbHRlcnMpKSB7XG5cdFx0XHRcdGZpbHRlcnMucHVzaCguLi52YWx1ZUhlbHBCaW5kaW5nSW5mby5maWx0ZXJzKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZpbHRlcnMucHVzaCh2YWx1ZUhlbHBCaW5kaW5nSW5mby5maWx0ZXJzKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gQWRkIGRyYWZ0IGZpbHRlciBmb3IgT0RhdGEgZHJhZnQtZW5hYmxlZCBlbnRpdGllc1xuXHRcdC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgZHJhZnQtZW5hYmxlZCBhbmQgYXBwbHkgSXNBY3RpdmVFbnRpdHkgPSB0cnVlIGZpbHRlclxuXHRcdHRoaXMuYWRkRHJhZnRGaWx0ZXIodmFsdWVIZWxwQmluZGluZ0luZm8sIGZpbHRlcnMsIHBheWxvYWQsIG1ldGFNb2RlbCk7XG5cdFx0cmV0dXJuIGZpbHRlcnM7XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYSBkcmFmdCBmaWx0ZXIgZm9yIE9EYXRhIGRyYWZ0LWVuYWJsZWQgZW50aXRpZXMuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBCaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBleGlzdGluZyBmaWx0ZXJzIGFycmF5IHRvIGFkZCB0aGUgZHJhZnQgZmlsdGVyIHRvXG5cdCAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgb2YgdGhlIHZhbHVlIGhlbHAgdG8gY2hlY2sgaWYgaXQncyBhIGRyb3Bkb3duIHNjZW5hcmlvXG5cdCAqIEBwYXJhbSBtZXRhTW9kZWwgVGhlIE9EYXRhIG1ldGEgbW9kZWwgdG8gcmVzb2x2ZSBlbnRpdHkgc2V0IGZyb20gcGF0aFxuXHQgKi9cblx0YWRkRHJhZnRGaWx0ZXI6IGZ1bmN0aW9uIChcblx0XHR2YWx1ZUhlbHBCaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8sXG5cdFx0ZmlsdGVyczogRmlsdGVyW10sXG5cdFx0cGF5bG9hZD86IFZhbHVlSGVscFBheWxvYWQsXG5cdFx0bWV0YU1vZGVsPzogT0RhdGFNZXRhTW9kZWxcblx0KTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlSGVscEJpbmRpbmdJbmZvLnBhdGggJiYgbWV0YU1vZGVsKSB7XG5cdFx0XHQvLyBHZXQgdGhlIEVudGl0eVNldCBmcm9tIHRoZSBwYXRoIHVzaW5nIE1ldGFNb2RlbFxuXHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQodmFsdWVIZWxwQmluZGluZ0luZm8ucGF0aCk7XG5cdFx0XHRjb25zdCBvYmplY3RQYXRoID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCk7XG5cblx0XHRcdC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgZHJhZnQtZW5hYmxlZCB1c2luZyBNb2RlbEhlbHBlclxuXHRcdFx0Ly8gVGhpcyBjb3ZlcnMgRHJhZnRSb290LCBEcmFmdE5vZGUsIGFuZCBjb250YWlubWVudCBzY2VuYXJpb3Ncblx0XHRcdGNvbnN0IGlzRHJhZnRTdXBwb3J0ZWQgPSBNb2RlbEhlbHBlci5pc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZChvYmplY3RQYXRoKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgaXQncyBhIGRyb3Bkb3duIHNjZW5hcmlvIChWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMpXG5cdFx0XHRjb25zdCBpc1ZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlcyA9IHBheWxvYWQ/LmlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzID8/IGZhbHNlO1xuXG5cdFx0XHQvLyBPbmx5IGFkZCBkcmFmdCBmaWx0ZXIgaWYgZW50aXR5IGlzIGRyYWZ0LWVuYWJsZWQgYW5kIGl0J3MgYSBkcm9wZG93biBzY2VuYXJpb1xuXHRcdFx0aWYgKGlzRHJhZnRTdXBwb3J0ZWQgJiYgaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMpIHtcblx0XHRcdFx0Ly8gQWRkIElzQWN0aXZlRW50aXR5IGZpbHRlciBmb3IgZHJhZnQtZW5hYmxlZCBlbnRpdGllc1xuXHRcdFx0XHQvLyBUaGlzIGZpbHRlciBlbnN1cmVzIG9ubHkgYWN0aXZlIChub24tZHJhZnQpIGVudGl0aWVzIGFyZSBzaG93biBpbiB2YWx1ZSBoZWxwIGRyb3Bkb3duc1xuXHRcdFx0XHRmaWx0ZXJzLnB1c2goXG5cdFx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBcIklzQWN0aXZlRW50aXR5XCIsXG5cdFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0dmFsdWUxOiB0cnVlXG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJlc3VtZXMgdGhlIHN1c3BlbmRlZCBsaXN0IGJpbmRpbmcgYW5kIHRoZW4gcmVzZXRzIGNoYW5nZXMgb24gaXQuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBMaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICovXG5cdHJlc3VtZVZhbHVlTGlzdEJpbmRpbmdBbmRSZXNldENoYW5nZXM6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHBMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh2YWx1ZUhlbHBMaXN0QmluZGluZy5pc1N1c3BlbmRlZCgpKSB7XG5cdFx0XHRhd2FpdCB2YWx1ZUhlbHBMaXN0QmluZGluZy5yZXN1bWVBc3luYygpO1xuXHRcdH1cblx0XHQvLyBnZXQgcmlkIG9mIGV4aXN0aW5nIHRyYW5zaWVudCBjb250ZXh0cy5cblxuXHRcdC8vIGRlc3Ryb3lpbmcgY2F1c2VzIGlzc3VlcyBzb21ldGltZXMsIGNvbnRleHRzIGFyZSBub3QgYWx3YXlzIGF2YWlsYWJsZSB0byBkZXN0cm95IGJ1dCBhcHBlYXIgYWZ0ZXJ3YXJkcyBtYWdpY2FsbHlcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdmFsdWVIZWxwTGlzdEJpbmRpbmcucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vV2UgZG8gbm90IGRvIGFueXRoaW5nIGhlcmUgYXMgd2Uga25vdyB0aGUgbW9kZWwgd2lsbCBhbHdheXMgdGhyb3cgYW4gZXJyb3IgYW5kIHRoaXMgd2lsbCBmaWxsIHVwIHRoZSBjb25zb2xlIHdpdGggZXJyb3JzLlxuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igc29ydGluZyBhbmQgZmlsdGVyaW5nIHRoZSBsaXN0IGJpbmRpbmcuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBMaXN0QmluZGluZyBMaXN0IEJpbmRpbmdcblx0ICogQHBhcmFtIHNvcnRlcnMgU29ydGVycyBvZiB0aGUgdmFsdWUgaGVscCBsaXN0IGJpbmRpbmdcblx0ICovXG5cdHNvcnRBbmRGaWx0ZXJMaXN0QmluZGluZzogZnVuY3Rpb24gKHZhbHVlSGVscExpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBzb3J0ZXJzOiBTb3J0ZXJUeXBlW10pOiB2b2lkIHtcblx0XHQvLyBJbiBvcmRlciB0byBub3Qgc2hvdyB0aGUgbGlzdCBhdCBhbGwsIHdlIHBhc3MgYW4gZW1wdHkgZmlsdGVyIHdoaWNoIHdvdWxkIHJlbmRlciBhbiBlbXB0eSBsaXN0XG5cdFx0dmFsdWVIZWxwTGlzdEJpbmRpbmcuZmlsdGVyKEZpbHRlci5OT05FLCBGaWx0ZXJUeXBlLkFwcGxpY2F0aW9uKTtcblxuXHRcdGlmIChzb3J0ZXJzLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgbW9kaWZpZWRTb3J0ZXJzOiBTb3J0ZXJbXSA9IFtdO1xuXHRcdFx0c29ydGVycy5mb3JFYWNoKChzb3J0ZXI6IFNvcnRlclR5cGUpID0+XG5cdFx0XHRcdG1vZGlmaWVkU29ydGVycy5wdXNoKG5ldyBTb3J0ZXIoc29ydGVyLm5hbWUgPz8gXCJcIiwgc29ydGVyLmRlc2NlbmRpbmcsIHRoaXMuZ2V0U29ydGVyRnVuY3Rpb24pKVxuXHRcdFx0KTtcblx0XHRcdHZhbHVlSGVscExpc3RCaW5kaW5nLnNvcnQobW9kaWZpZWRTb3J0ZXJzKTtcblx0XHR9IGVsc2UgdmFsdWVIZWxwTGlzdEJpbmRpbmcuc29ydChuZXcgU29ydGVyKFwiXCIsIGZhbHNlLCB0aGlzLmdldFNvcnRlckZ1bmN0aW9uKSk7XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9ucyBjcmVhdGVzIHRoZSBmaWx0ZXJzIGZvciBhZGRpdGlvbmFsIHZhbHVlcy5cblx0ICogQHBhcmFtIHJldmVyc2VBZGRpdGlvbmFsVmFsdWVzIEFycmF5IG9mIGFkZGl0aW9uYWwgdmFsdWVzIGluIHJldmVyc2Ugb3JkZXJcblx0ICogQHBhcmFtIGZpbHRlcnMgRXhpc3RpbmcgdmFsdWVoZWxwIGJpbmRpbmcgZmlsdGVyc1xuXHQgKiBAcmV0dXJucyBBZGRpdGlvbmFsIHZhbHVlIGZpbHRlcnNcblx0ICovXG5cdGdldEFkZGl0aW9uYWxWYWx1ZUZpbHRlcnM6IGZ1bmN0aW9uIChyZXZlcnNlQWRkaXRpb25hbFZhbHVlczogQWRkaXRpb25hbFZhbHVlVHlwZVtdLCBmaWx0ZXJzOiBGaWx0ZXJbXSk6IEZpbHRlcltdIHtcblx0XHRyZXZlcnNlQWRkaXRpb25hbFZhbHVlcy5mb3JFYWNoKChhZGRpdGlvbmFsVmFsdWUpID0+IHtcblx0XHRcdGlmIChhZGRpdGlvbmFsVmFsdWUudmFsdWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29uc3QgdmFsdWVzID0gYWRkaXRpb25hbFZhbHVlLnZhbHVlcztcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gYWRkaXRpb25hbFZhbHVlLnByb3BlcnR5UGF0aDtcblx0XHRcdFx0Ly8gYWRkIGFkZGl0aW9uYWwgdmFsdWUgZmlsdGVycyB0byBleGlzdGluZyBmaWx0ZXJzIGZyb20gdGhlIGJpbmRpbmcgaW5mb1xuXHRcdFx0XHR2YWx1ZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcblx0XHRcdFx0XHQvLyB1cGRhdGUgdGhlIHZhbHVlIGhlbHAgYmluZGluZyBpbmZvIHRvIGdldCBhZGRpdGlvbmFsIHZhbHVlcyBmcm9tIHRoZSBiYWNrZW5kXG5cdFx0XHRcdFx0ZmlsdGVycy5wdXNoKFxuXHRcdFx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRcdHBhdGg6IHByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFx0dmFsdWUxOiB2YWx1ZSxcblx0XHRcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIlxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gZmlsdGVycztcblx0fSxcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgYSBjYWxsYmFjayB0byB0aGUgY3VzdG9tIHNvcnRlci5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBvZiB0aGUgRmllbGRcblx0ICogQHJldHVybnMgR3JvdXAga2V5IHRoYXQgY2FuIGJlIHVzZWQgZm9yIHNvcnRpbmdcblx0ICovXG5cdGdldFNvcnRlckZ1bmN0aW9uOiBmdW5jdGlvbiAoY29udGV4dDogVjRDb250ZXh0KTogc3RyaW5nIHtcblx0XHQvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG5cdFx0Y29uc3QgcmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLm1hY3Jvc1wiKSE7XG5cdFx0Ly9nZXQgdGhlIGNsaWVudCBzaWRlIGFubm90YXRpb24gdG8gZmlndXJlIG91dCB0aGUgZ3JvdXAga2V5XG5cdFx0Y29uc3QgZ3JvdXBLZXkgPSBjb250ZXh0LmdldFByb3BlcnR5KFwiQCRmZS5hZGRpdGlvbmFsVmFsdWVHcm91cEtleVwiKSBhcyBBZGRpdGlvbmFsVmFsdWVHcm91cEtleTtcblx0XHRpZiAoZ3JvdXBLZXkgPT09IEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5LnJlY29tbWVuZGF0aW9uKSB7XG5cdFx0XHRyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIk1fQURESVRJT05BTFZBTFVFSEVMUEVSX1JFQ09NTUVOREFUSU9OU1wiKTtcblx0XHR9IGVsc2UgaWYgKGdyb3VwS2V5ID09PSBBZGRpdGlvbmFsVmFsdWVHcm91cEtleS5yZWNlbnRWYWx1ZSkge1xuXHRcdFx0cmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJNX0FERElUSU9OQUxWQUxVRUhFTFBFUl9SRUNFTlRWQUxVRVwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJNX0FERElUSU9OQUxWQUxVRUhFTFBFUl9PVEhFUlNcIik7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGNyZWF0ZSB0cmFuc2llbnQgY29udGV4dHMgb2YgdGhlIHZhbHVlIGhlbHAgbGlzdCBiaW5kaW5nIGZvciB0aGUgZ2l2ZW4gZGlmZmVyZW50IHR5cGVzIGFkZGl0aW9uYWwgdmFsdWUgY29udGV4dCBkYXRhLlxuXHQgKiBAcGFyYW0gcmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSBSZWNvbW1lbmRhdGlvbiB2YWx1ZXMgY29udGV4dCBkYXRhXG5cdCAqIEBwYXJhbSByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSBSZWNlbnQgdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gb3RoZXJzVmFsdWVzQ29udGV4dERhdGEgT3RoZXIgdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwTGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqL1xuXHRjcmVhdGVUcmFuc2llbnRDb250ZXh0c0ZvckFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhOiBmdW5jdGlvbiAoXG5cdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdLFxuXHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10sXG5cdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXSxcblx0XHR2YWx1ZUhlbHBMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZ1xuXHQpOiB2b2lkIHtcblx0XHR0aGlzLmNyZWF0ZUdyb3VwZWRUcmFuc2llbnRDb250ZXh0cyhvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSwgdmFsdWVIZWxwTGlzdEJpbmRpbmcsIEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5Lm90aGVyKTtcblx0XHR0aGlzLmNyZWF0ZUdyb3VwZWRUcmFuc2llbnRDb250ZXh0cyhyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSwgdmFsdWVIZWxwTGlzdEJpbmRpbmcsIEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5LnJlY2VudFZhbHVlKTtcblx0XHR0aGlzLmNyZWF0ZUdyb3VwZWRUcmFuc2llbnRDb250ZXh0cyhyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLCB2YWx1ZUhlbHBMaXN0QmluZGluZywgQWRkaXRpb25hbFZhbHVlR3JvdXBLZXkucmVjb21tZW5kYXRpb24pO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGNyZWF0ZSB0cmFuc2llbnQgY29udGV4dCBmb3IgdGhlIGdpdmVuIGFkZGl0aW9uYWwgdmFsdWUgY29udGV4dCBkYXRhLiBJdCBhbHNvIGFkZHMgYSBrZXkgZm9yIGVhY2ggY29udGV4dCB3aGljaCBpcyB1c2VkIHRvIGdyb3VwIHRoZSBuZXdseSBjcmVhdGVkIHRyYW5zaWVudCBjb250ZXh0cyBhY2NvcmRpbmdseS5cblx0ICogQHBhcmFtIGFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhIEFkZGl0aW9uYWwgdmFsdWUgY29udGV4dCBkYXRhXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBMaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGdyb3VwS2V5IEtleSB3aGljaCBpbmRpY2F0ZXMgdGhlIGdyb3VwIG9mIHRoZSBhZGRpdGlvbmFsIHZhbHVlIGNvbnRleHQgZGF0YVxuXHQgKi9cblx0Y3JlYXRlR3JvdXBlZFRyYW5zaWVudENvbnRleHRzOiBmdW5jdGlvbiAoXG5cdFx0YWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXSxcblx0XHR2YWx1ZUhlbHBMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRncm91cEtleTogQWRkaXRpb25hbFZhbHVlR3JvdXBLZXlcblx0KTogdm9pZCB7XG5cdFx0Ly8gcmV2ZXJzZSBvZiB0aGUgY29udGV4dCBkYXRhIGlzIHJlcXVpcmVkIHNvIHRoYXQgdGhlIGNvbnRleHQgd2hpY2ggbmVlZHMgdG8gYmUgc2hvd24gYmVsb3cgaW4gdGhlIGxpc3QgZ2V0cyBjcmVhdGVkIGZpcnN0XG5cdFx0Wy4uLmFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhXS5yZXZlcnNlKCkuZm9yRWFjaChhc3luYyAoY29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGUpID0+IHtcblx0XHRcdC8vIGdyb3VwS2V5IGlzIGFkZGVkIGluIG9yZGVyIHRvIHByb3Blcmx5IGdyb3VwIHRoZSB0cmFuc2llbnQgY29udGV4dHMgYW1vbmdzdCBhbGwgMyBncm91cHNcblx0XHRcdGNvbnRleHREYXRhW1wiQCRmZS5hZGRpdGlvbmFsVmFsdWVHcm91cEtleVwiXSA9IGdyb3VwS2V5O1xuXHRcdFx0Y29uc3QgY29udGV4dCA9IHZhbHVlSGVscExpc3RCaW5kaW5nLmNyZWF0ZShjb250ZXh0RGF0YSk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBjb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdC8vIEZvciB0cmFuc2llbnQgY29udGV4dHMgdGhlIGNhbmNlbGVkIGlzIHNldCB0byB0cnVlIGFuZCBmb3Igb3RoZXIgY2FzZXMgaXQgd2lsbCBiZSBmYWxzZS4gQXRsZWFzdCBpbiByZWNvbW1lbmRhdGlvbnNcblx0XHRcdFx0Ly8gdXNlIGNhc2Ugd2UgZG8gbm90IGZhY2UgdGhlIHNjZW5hcmlvIHdoZXJlIGNhbmNlbGVkIGlzIHNldCB0byBmYWxzZS4gRm9yIG5vdyB3ZSBhcmUganVzdCBsb2dnaW5nIHRoZSBlcnJvci5cblx0XHRcdFx0aWYgKCEoZXJyb3IgYXMgQ29udGV4dEVycm9yVHlwZSkuY2FuY2VsZWQpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoKGVycm9yIGFzIENvbnRleHRFcnJvclR5cGUpLm5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9ucyByZXR1cm5zIHRoZSByZWxldmFudCByZWNvbW1lbmRhdGlvbnMgZm9yIHRoZSB2YWx1ZWxpc3QuXG5cdCAqIEBwYXJhbSBkYXRhIE9iamVjdCBjb250YWluaW5nIHJlY29tbWVuZGF0aW9uIG1vZGVsIGRhdGFcblx0ICogQHBhcmFtIGJpbmRpbmdDb250ZXh0IEJpbmRpbmcgY29udGV4dCBvZiB0aGUgRmllbGRcblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aCBQcm9wZXJ0eSBQYXRoIG9mIHRoZSBGaWVsZFxuXHQgKiBAcGFyYW0gYmluZGluZ1BhdGhcblx0ICogQHJldHVybnMgUmVsZXZhbnQgcmVjb21tZW5kYXRpb25zIGZvciB0aGUgdmFsdWVsaXN0XG5cdCAqL1xuXHRnZXRSZWxldmFudFJlY29tbWVuZGF0aW9uczogZnVuY3Rpb24gKFxuXHRcdGRhdGE6IEluQ29tcGxldGVuZXNzSW5mb1R5cGUgfCBvYmplY3QsXG5cdFx0YmluZGluZ0NvbnRleHQ6IFY0Q29udGV4dCxcblx0XHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0XHRiaW5kaW5nUGF0aD86IHN0cmluZ1xuXHQpOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgdmFsdWVzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW107XG5cdFx0bGV0IHJlbGV2YW50UmVjb21tZW5kYXRpb25zOiBJbnRlcm5hbFByb3BlcnR5QWRkaXRpb25hbFZhbHVlIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL2dldCB0aGUgcmlnaHQgcHJvcGVydHkgcGF0aCBieSBlbGltaW5hdGluZyB0aGUgc3RhcnRpbmcgLyBhbmQgYWxzbyBtYWluIGVudGl0eXNldCBuYW1lXG5cdFx0XHRwcm9wZXJ0eVBhdGggPSB0aGlzLmdldFJlY29tbWVuZGF0aW9uUHJvcGVydHlQYXRoKHByb3BlcnR5UGF0aCk7XG5cdFx0XHRpZiAoKGRhdGEgYXMgUmVjb21tZW5kYXRpb25JbmZvKS52ZXJzaW9uID09PSAyLjAgJiYgYmluZGluZ1BhdGgpIHtcblx0XHRcdFx0cHJvcGVydHlQYXRoID0gYmluZGluZ1BhdGg7XG5cdFx0XHR9XG5cdFx0XHQvL2dldCB0aGUgcmVjb21tZW5kYXRpb25zIGJhc2VkIG9uIHByb3BlcnR5IHBhdGggYW5kIGJpbmRpbmcgY29udGV4dCBwYXNzZWRcblx0XHRcdHJlbGV2YW50UmVjb21tZW5kYXRpb25zID0gdGhpcy5nZXRBZGRpdGlvbmFsVmFsdWVGcm9tUHJvcGVydHlQYXRoKHByb3BlcnR5UGF0aCwgYmluZGluZ0NvbnRleHQsIGRhdGEpIGFzXG5cdFx0XHRcdHwgSW50ZXJuYWxQcm9wZXJ0eUFkZGl0aW9uYWxWYWx1ZVxuXHRcdFx0XHR8IHVuZGVmaW5lZDtcblx0XHRcdC8vaWYgd2UgZ2V0IHJlY29tbWVuZGF0aW9ucyB0aGVuIHB1c2ggdGhlIHZhbHVlc1xuXHRcdFx0aWYgKHJlbGV2YW50UmVjb21tZW5kYXRpb25zICYmIE9iamVjdC5rZXlzKHJlbGV2YW50UmVjb21tZW5kYXRpb25zKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJlbGV2YW50UmVjb21tZW5kYXRpb25zLmFkZGl0aW9uYWxWYWx1ZXMuZm9yRWFjaCgodmFsdWVEYXRhOiBSZWNvbW1lbmRhdGlvblZhbHVlVHlwZSkgPT4ge1xuXHRcdFx0XHRcdHZhbHVlcy5wdXNoKHZhbHVlRGF0YS52YWx1ZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly9pZiByZWNvbW1lbmRhdGlvbnMgYXJlIG5vdCBmb3VuZCB0aGVuIHJldHVybiBudWxsXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRfY2hlY2tGb3JLZXlzSW5SZWNvbW1lbmRhdGlvbnM6IGZ1bmN0aW9uIChrZXlQcm9wZXJ0aWVzOiBLZXlQcm9wZXJ0aWVzRGF0YVR5cGUsIGNvbnRleHREYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogYm9vbGVhbiB7XG5cdFx0Zm9yIChjb25zdCBrZXkgaW4ga2V5UHJvcGVydGllcykge1xuXHRcdFx0aWYgKGtleVByb3BlcnRpZXNba2V5XSAhPT0gY29udGV4dERhdGFba2V5XSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSB0byBmZXRjaCB0aGUgZXhhY3Qgb2JqZWN0IGZyb20gYW4gYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IGNvbnRhaW5zIHJlbGV2YW50IHJlY29tbWVuZGF0aW9uRGF0YSBiYXNlZCBvbiBrZXlzLlxuXHQgKiBAcGFyYW0gcmVjb21tZW5kYXRpb25EYXRhIEFycmF5IGNvbnRhaW5pbmcgYWRkaXRpb25hbCB2YWx1ZXNcblx0ICogQHBhcmFtIGJpbmRpbmdDb250ZXh0IEJpbmRpbmcgY29udGV4dCBvZiB0aGUgRmllbGRcblx0ICogQHJldHVybnMgUmVsZXZhbnQgb2JqZWN0IGZyb20gYW4gYXJyYXkgb2Ygb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGFkZGl0aW9uYWwgdmFsdWVcblx0ICovXG5cdGdldEFkZGl0aW9uYWxWYWx1ZUZyb21LZXlzOiBmdW5jdGlvbiAoXG5cdFx0cmVjb21tZW5kYXRpb25EYXRhOiBBZGRpdGlvblZhbHVlRGVmaW5pdGlvbixcblx0XHRiaW5kaW5nQ29udGV4dD86IFY0Q29udGV4dCB8IENvbnRleHRcblx0KTogQWRkaXRpb25WYWx1ZURlZmluaXRpb24ge1xuXHRcdGNvbnN0IGNvbnRleHREYXRhID0gYmluZGluZ0NvbnRleHQ/LmdldE9iamVjdCgpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cdFx0bGV0IHJlc3VsdDogQWRkaXRpb25WYWx1ZURlZmluaXRpb24gPSB7fTtcblx0XHQvL2xvb3AgdGhyb3VnaCB0aGUgcmVjb21tZW5kYXRpb25EYXRhIGFuZCBjaGVjayBpZiB0aGUga2V5UHJvcGVydGllcyBtYXRjaCB3aXRoIHRoZSBiaW5kaW5nIGNvbnRleHQgZGF0YVxuXHRcdGlmIChiaW5kaW5nQ29udGV4dCAmJiBjb250ZXh0RGF0YSkge1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkocmVjb21tZW5kYXRpb25EYXRhKSkge1xuXHRcdFx0XHQocmVjb21tZW5kYXRpb25EYXRhIGFzIFJlY29tbWVuZGF0aW9uRGF0YUZvck5hdlByb3BlcnR5VHlwZVtdKS5mb3JFYWNoKChyZWNEYXRhKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qga2V5UHJvcGVydGllcyA9IHJlY0RhdGEua2V5UHJvcGVydGllcyBhcyBLZXlQcm9wZXJ0aWVzRGF0YVR5cGU7XG5cdFx0XHRcdFx0Y29uc3QgYWxsS2V5c01hdGNoID0gdGhpcy5fY2hlY2tGb3JLZXlzSW5SZWNvbW1lbmRhdGlvbnMoa2V5UHJvcGVydGllcywgY29udGV4dERhdGEpO1xuXHRcdFx0XHRcdC8vaWYgZXZlcnkga2V5IHZhbHVlIG1hdGNoZXMgd2l0aCB0aGUgYmluZGluZyBjb250ZXh0IGRhdGEgdGhlbiBhc3NpZ24gaXQgdG8gcmVzdWx0IHdoaWNoIHdpbGwgYmUgcmV0dXJuZWRcblx0XHRcdFx0XHRpZiAoYWxsS2V5c01hdGNoKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHQgPSByZWNEYXRhIGFzIEFkZGl0aW9uVmFsdWVEZWZpbml0aW9uO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0X2dldFJlY29tbWVuZGF0aW9uOiBmdW5jdGlvbiAoXG5cdFx0cHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdFx0YmluZGluZ0NvbnRleHQ6IENvbnRleHQsXG5cdFx0cmVjb21tZW5kYXRpb25EYXRhOiBBZGRpdGlvblZhbHVlRGVmaW5pdGlvblxuXHQpOiBBZGRpdGlvblZhbHVlRGVmaW5pdGlvbiB7XG5cdFx0Ly9jcmVhdGUgYSBjb3B5IG9mIHRoZSByZWNvbW1lbmRhdGlvbkRhdGEgdG8gc3RvcmUgaXRzIHByZXZpb3VzIHZhbHVlIGFzIGl0IHdpbGwgY2hhbmdlIGJlY2F1c2Ugb2YgdGhlIHJlY3Vyc2l2ZSBhcHByb2FjaFxuXHRcdGxldCBvbGREYXRhID0gT2JqZWN0LmFzc2lnbihyZWNvbW1lbmRhdGlvbkRhdGEsIHt9KTtcblx0XHQvL2NoZWNrIGlmIHByb3BlcnR5IHBhdGggZXhpc3RzIG9uIHRoZSByZWNvbW1lbmRhdGlvbkRhdGEgb2JqZWN0IGFuZCBpZiBzbyB0aGVuIHJldHVybiB0aGUgb2JqZWN0IHBvaW50aW5nIHRvIHRoZSBwcm9wZXJ0eSBwYXRoXG5cdFx0aWYgKE9iamVjdC5rZXlzKHJlY29tbWVuZGF0aW9uRGF0YSkuaW5jbHVkZXMocHJvcGVydHlQYXRoKSkge1xuXHRcdFx0cmV0dXJuIChyZWNvbW1lbmRhdGlvbkRhdGEgYXMgSW5Db21wbGV0ZW5lc3NJbmZvVHlwZSlbcHJvcGVydHlQYXRoXSBhcyBBZGRpdGlvblZhbHVlRGVmaW5pdGlvbjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly9pZiBwcm9wZXJ0eSBwYXRoIGlzIG5vdCBwcmVzZW50IHRoZW4gY2hlY2sgaWYgaXQgaXMgMTpuIG1hcHBpbmcgYW5kIHdlIG5lZWQgdG8gZG8gYSByZWN1cnNpdmUgYXBwcm9hY2ggdG8gbGFuZCBvbiB0aGUgZXhhY3Qgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlbGV2YW50IHJlY29tbWVuZGF0aW9uc1xuXHRcdFx0Ly9jb250aW51ZSB0aGUgd2hpbGUgbG9vcCB0aWxsIHRoZSBwcm9wZXJ0eSBwYXRoIGlzIGZvdW5kIGluIHRoZSBwcmV2aW91cyByZWNvbW1lbmRhdGlvbkRhdGFcblx0XHRcdHdoaWxlIChPYmplY3Qua2V5cyhvbGREYXRhKS5sZW5ndGggPiAwICYmICFPYmplY3Qua2V5cyhvbGREYXRhKS5pbmNsdWRlcyhwcm9wZXJ0eVBhdGgpKSB7XG5cdFx0XHRcdC8vIGFzIGl0IG1pZ2h0IGJlIDE6biBtYXBwaW5nIHNvIGZpcnN0IHNlcGVyYXRlIHRoZSBuYXZwcm9wIG5hbWUgYW5kIGFjdHVhbCBwcm9wIG5hbWUgdG8gbWFrZSBzdXJlIHdlIGZpbmQgdGhlIG5hdnByb3AgZmlyc3QgYW5kIHRoZW4gZnJvbSBpdHMgcG9pbnRpbmcgb2JqZWN0IHdlIGZpbmQgdGhlIHByb3BlcnR5IHBhdGhcblx0XHRcdFx0Ly9lZzogX0l0ZW0vTWF0ZXJpYWwgd2lsbCBiZSBmaXJzdCBkaXZpZGVkIGludG8gX0l0ZW0gYW5kIHdlIHNlYXJjaCBmb3IgaXQgYW5kIHRoZW4gZnJvbSBpdHMgcmVsZXZhbnQgb2JqZWN0IHdlIHNlYXJjaCBmb3IgTWF0ZXJpYWxcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlQYXRocyA9IHByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRcdGlmIChwcm9wZXJ0eVBhdGhzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHQvL2dldHRpbmcgdGhlIG5hdnByb3AgcGF0aFxuXHRcdFx0XHRcdGNvbnN0IG5hdlByb3BQYXRoID0gcHJvcGVydHlQYXRoc1swXTtcblx0XHRcdFx0XHQvL3JlbW92aW5nIHRoZSBuYXZwcm9wIHBhdGggZnJvbSBwcm9wZXJ0eXBhdGhzIHNvIHRoYXQgd2Ugb25seSBjaGVjayBmb3IgYWN0dWFsIHByb3BlcnR5IHBhdGhcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGhzLnNwbGljZSgwLCAxKTtcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eVBhdGhzLmpvaW4oXCIvXCIpO1xuXHRcdFx0XHRcdC8vdXNpbmcgZ2V0QWRkaXRpb25hbFZhbHVlRnJvbVByb3BlcnR5UGF0aCBhbmQgcGFzc2luZyBuYXZQcm9wUGF0aCB3ZSBnZXQgdGhlIGV4YWN0IGFycmF5IG9mIG9iamVjdHMgcG9pbnRpbmcgdG8gdGhlIG5hdlByb3Bcblx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbkRhdGEgPSB0aGlzLmdldEFkZGl0aW9uYWxWYWx1ZUZyb21Qcm9wZXJ0eVBhdGgoXG5cdFx0XHRcdFx0XHRuYXZQcm9wUGF0aCxcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0LFxuXHRcdFx0XHRcdFx0cmVjb21tZW5kYXRpb25EYXRhXG5cdFx0XHRcdFx0KSBhcyBSZWNvbW1lbmRhdGlvbkRhdGFGb3JOYXZQcm9wZXJ0eVR5cGVbXTtcblx0XHRcdFx0XHQvL25vIHBhc3MgdGhlIGFycmF5IG9mIG9iamVjdHMgb2YgbmF2UHJvcCB0byBnZXRBZGRpdGlvbmFsVmFsdWVGcm9tS2V5cyBhbmQgZ2V0IHRoZSBleGFjdCBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgcmVjb21tZW5kYXRpb25EYXRhIGJhc2VkIG9uIGtleXNcblx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbkRhdGEgPSB0aGlzLmdldEFkZGl0aW9uYWxWYWx1ZUZyb21LZXlzKHJlY29tbWVuZGF0aW9uRGF0YSwgYmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRcdGlmIChPYmplY3Qua2V5cyhyZWNvbW1lbmRhdGlvbkRhdGEpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdC8vc2V0IHRoZSByZWNvbW1lbmRhdGlvbkRhdGEgdG8gb2xkRGF0YSBiZWZvcmUgYXNzaWduaW5nIHRoZSBuZXcgdmFsdWUgdG8gaXRcblx0XHRcdFx0XHRcdG9sZERhdGEgPSBPYmplY3QuYXNzaWduKHJlY29tbWVuZGF0aW9uRGF0YSwge30pO1xuXHRcdFx0XHRcdFx0Ly9oZXJlIHdlIGNoZWNrIGZvciB0aGUgYWN0dWFsIHByb3BlcnR5IHBhdGggZnJvbSB0aGUgb2JqZWN0IHdlIGZvdW5kIGZyb20gZ2V0QWRkaXRpb25hbFZhbHVlRnJvbUtleXNcblx0XHRcdFx0XHRcdC8vZWc6IE1hdGVyaWFsIGNhbiBiZSBmb3VuZCBpbiB0aGUgb2JqZWN0IHdoaWNoIGlzIHBhcnQgb2YgYXJyYXkgb2Ygb2JqZWN0cyBvZiBfSXRlbVxuXHRcdFx0XHRcdFx0cmVjb21tZW5kYXRpb25EYXRhID0gdGhpcy5nZXRBZGRpdGlvbmFsVmFsdWVGcm9tUHJvcGVydHlQYXRoKFxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbkRhdGFcblx0XHRcdFx0XHRcdCkgYXMgQWRkaXRpb25WYWx1ZURlZmluaXRpb247XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiB7fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb25EYXRhO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyB0aGUgYWRkaXRpb25hbCB2YWx1ZSBiYXNlZCBvbiBwcm9wZXJ0eSBwYXRoIGFuZCBiaW5kaW5nIGNvbnRleHQgcGFzc2VkLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlQYXRoIFByb3BlcnR5IHBhdGggb2YgdGhlIGZpZWxkXG5cdCAqIEBwYXJhbSBiaW5kaW5nQ29udGV4dCBCaW5kaW5nIGNvbnRleHQgb2YgdGhlIGZpZWxkXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbkRhdGEgT2JqZWN0IGNvbnRhaW5pbmcgYWRkaXRpb25hbCB2YWx1ZVxuXHQgKiBAcmV0dXJucyBBZGRpdGlvbmFsIHZhbHVlIGJhc2VkIG9uIHByb3BlcnR5IHBhdGggYW5kIGJpbmRpbmcgY29udGV4dCBwYXNzZWRcblx0ICovXG5cdGdldEFkZGl0aW9uYWxWYWx1ZUZyb21Qcm9wZXJ0eVBhdGg6IGZ1bmN0aW9uIChcblx0XHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0XHRiaW5kaW5nQ29udGV4dDogVjRDb250ZXh0IHwgQ29udGV4dCxcblx0XHRyZWNvbW1lbmRhdGlvbkRhdGE/OiBBZGRpdGlvblZhbHVlRGVmaW5pdGlvbiB8IFJlY29tbWVuZGF0aW9uSW5mb1xuXHQpOiBBZGRpdGlvblZhbHVlRGVmaW5pdGlvbiB8IFN0YW5kYXJkUmVjb21tZW5kYXRpb25EYXRhVHlwZSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKChyZWNvbW1lbmRhdGlvbkRhdGEgYXMgUmVjb21tZW5kYXRpb25JbmZvKS52ZXJzaW9uID09PSAyKSB7XG5cdFx0XHRyZXR1cm4gc3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlci5nZXRTdGFuZGFyZFJlY29tbWVuZGF0aW9ucyhcblx0XHRcdFx0YmluZGluZ0NvbnRleHQsXG5cdFx0XHRcdHByb3BlcnR5UGF0aCxcblx0XHRcdFx0cmVjb21tZW5kYXRpb25EYXRhIGFzIFJlY29tbWVuZGF0aW9uSW5mb1xuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKHJlY29tbWVuZGF0aW9uRGF0YSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2dldFJlY29tbWVuZGF0aW9uKHByb3BlcnR5UGF0aCwgYmluZGluZ0NvbnRleHQsIHJlY29tbWVuZGF0aW9uRGF0YSk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIG9mIHRoZSBmaWVsZCBieSByZW1vdmluZyB0aGUgbGVhZGluZyAnLycgYW5kIG1haW4gZW50aXR5IHNldCBuYW1lLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlQYXRoIFByb3BlcnR5IFBhdGggb2YgdGhlIEZpZWxkXG5cdCAqIEByZXR1cm5zIFByb3BlcnR5IHBhdGggb2YgdGhlIGZpZWxkIGJ5IHJlbW92aW5nIHRoZSBsZWFkaW5nICcvJyBhbmQgbWFpbiBlbnRpdHkgc2V0IG5hbWUuXG5cdCAqL1xuXHRnZXRSZWNvbW1lbmRhdGlvblByb3BlcnR5UGF0aDogZnVuY3Rpb24gKHByb3BlcnR5UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHQvL0ZpcnN0IHdlIHNwbGl0IHRoZSBwcm9wZXJ0eSBwYXRoIGJhc2VkIG9uIC9cblx0XHRjb25zdCBwcm9wZXJ0eVBhdGhzID0gcHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHQvL05vdyByZW1vdmUgdGhlIGZpcnN0IHR3byBlbGVtZW50cyBvZiB0aGUgYXJyYXkuIEFzIGZpcnN0IGVsZW1lbnQgd2lsbCBhbHdheXMgYmUgJycgYW5kIHNlY29uZCBlbGVtZW50IHdpbGwgYmUgbWFpbiBlbnRpdHkgc2V0IG5hbWVcblx0XHRwcm9wZXJ0eVBhdGhzLnNwbGljZSgwLCAyKTtcblx0XHQvL05vdyBqb2luIHRoZSByZW1haW5pbmcgZWxlbWVudHMgdG8gY3JlYXRlIGEgbmV3IHByb3BlcnR5IHBhdGggYW5kIHJldHVybiBpdFxuXHRcdHJldHVybiBwcm9wZXJ0eVBhdGhzLmpvaW4oXCIvXCIpO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGZpbHRlciBPdGhlcnMgdmFsdWVzIGNvbnRleHQgZGF0YSBhbmQgcmVtb3ZlIHZhbHVlcyB3aGljaCBhcmUgYWxzbyBwcmVzZW50IGluIFJlY2VudGx5IFVzZWQgYW5kIFJlY29tbWVuZGF0aW9uIGdyb3VwLlxuXHQgKiBAcGFyYW0gcmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSBSZWNvbW1lbmRhdGlvbiB2YWx1ZXMgY29udGV4dCBkYXRhXG5cdCAqIEBwYXJhbSByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSBSZWNlbnQgdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gb3RoZXJzVmFsdWVzQ29udGV4dERhdGEgT3RoZXJzIHZhbHVlcyBjb250ZXh0IGRhdGFcblx0ICogQHBhcmFtIHZhbHVlSGVscEtleXMgVmFsdWVMaXN0UHJvcGVydHkgb2YgdGhlIHBheWxvYWRcblx0ICogQHJldHVybnMgT3RoZXJzIHZhbHVlcyBjb250ZXh0IGRhdGEuXG5cdCAqL1xuXHRnZXRSZWxldmFudE90aGVyc1ZhbHVlc0NvbnRleHREYXRhOiBmdW5jdGlvbiAoXG5cdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdLFxuXHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10sXG5cdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXSxcblx0XHR2YWx1ZUhlbHBLZXlzOiBzdHJpbmdbXVxuXHQpOiBGaWVsZERhdGFUeXBlW10ge1xuXHRcdHJldHVybiBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YS5maWx0ZXIoXG5cdFx0XHQoY29udGV4dERhdGEpID0+XG5cdFx0XHRcdCF0aGlzLmNoZWNrVmFsdWVzTWF0Y2goY29udGV4dERhdGEsIHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEsIHZhbHVlSGVscEtleXMpICYmXG5cdFx0XHRcdCF0aGlzLmNoZWNrVmFsdWVzTWF0Y2goY29udGV4dERhdGEsIHJlY2VudFZhbHVlc0NvbnRleHREYXRhLCB2YWx1ZUhlbHBLZXlzKVxuXHRcdCk7XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gY2hlY2sgd2hldGhlciByZWNlbnQgdmFsdWVzIG1hdGNoZXMgZWl0aGVyIHdpdGggdGhlIHNlYXJjaCB0ZXJtIG9yIHdpdGggdGhlIG90aGVycyB2YWx1ZXMuXG5cdCAqIEBwYXJhbSBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSBPdGhlcnMgdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gcmVjZW50VmFsdWVzQ29udGV4dERhdGEgUmVjZW50IHZhbHVlcyBjb250ZXh0IGRhdGFcblx0ICogQHBhcmFtIHZhbHVlSGVscEtleXMgVmFsdWVMaXN0UHJvcGVydHkgb2YgdGhlIHBheWxvYWRcblx0ICogQHBhcmFtIHNlYXJjaFRlcm0gU2VhcmNoIHRlcm0gZW50ZXJlZCBieSB0aGUgdXNlclxuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gQmluZGluZyBpbmZvIG9iamVjdCBvZiB0aGUgdmFsdWUgaGVscFxuXHQgKiBAcmV0dXJucyBSZWNlbnQgdmFsdWVzIGNvbnRleHQgZGF0YSB3aGljaCBuZWVkcyB0byBiZSBzaG93IGluIHRoZSBSZWNlbnRseSBVc2VkIGdyb3VwIGluIHRoZSB0eXBlIGFoZWFkIHN1Z2dlc3Rpb24gbGlzdC5cblx0ICovXG5cdGdldFJlbGV2YW50UmVjZW50VmFsdWVzQ29udGV4dERhdGE6IGZ1bmN0aW9uIChcblx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdLFxuXHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10sXG5cdFx0dmFsdWVIZWxwS2V5czogc3RyaW5nW10sXG5cdFx0c2VhcmNoVGVybTogc3RyaW5nLFxuXHRcdGJpbmRpbmdJbmZvOiBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mb1xuXHQpOiBGaWVsZERhdGFUeXBlW10ge1xuXHRcdC8vIGZpbHRlciBvdXQgcmVjZW50IHZhbHVlIGJhc2VkIG9uIGV4aXN0aW5nIHZhbHVlIGhlbHAgZmlsdGVyc1xuXHRcdGNvbnN0IHJlY2VudFZhbHVlc01vZGVsID0gbmV3IEpTT05Nb2RlbCh7IHJlY2VudFZhbHVlc0NvbnRleHREYXRhIH0pO1xuXHRcdGNvbnN0IHJlY2VudFZhbHVlc0xpc3QgPSByZWNlbnRWYWx1ZXNNb2RlbC5iaW5kTGlzdChcblx0XHRcdFwiL3JlY2VudFZhbHVlc0NvbnRleHREYXRhXCIsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHR0aGlzLmdldFZhbHVlSGVscEJpbmRpbmdGaWx0ZXJzKGJpbmRpbmdJbmZvKVxuXHRcdCk7XG5cdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGEgPSByZWNlbnRWYWx1ZXNMaXN0LmdldEFsbEN1cnJlbnRDb250ZXh0cygpLm1hcCgoY29udGV4dCkgPT4gY29udGV4dC5nZXRPYmplY3QoKSBhcyBGaWVsZERhdGFUeXBlKTtcblxuXHRcdC8vIGNvbnNpZGVyIG9ubHkgdGhvc2UgcmVjZW50IHZhbHVlcyB3aGljaCBlaXRoZXIgbWF0Y2hlcyB3aXRoIHRoZSBzZWFyY2ggdGVybSBvciB3aXRoIHRoZSByZXNwb25zZSByZWNlaXZlZCBmcm9tIGJhY2tlbmQgZm9yIHRoZSBPdGhlcnMgZ3JvdXAuXG5cdFx0Ly8gQm90aCB0aGUgZmlsdGVycyBuZWVkcyB0byBiZSBhcHBsaWVkIHNvIHRoYXQgc28gdGhhdCBvcmRlciBvZiB0aGUgcmVjZW50IHZhbHVlcyBkb2VzIG5vdCBjaGFuZ2UsIHdoaWNoIGlzIGltcG9ydGFudCBmb3IgdGhlIG9yZGVyIGluIHdoaWNoXG5cdFx0Ly8gdGhlIGRhdGEgd291bGQgYmUgc2hvd24gaW4gdGhlIHR5cGUgYWhlYWQgc3VnZ2VzdGlvbiBsaXN0LlxuXHRcdHJldHVybiByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YS5maWx0ZXIoKHJlY2VudFZhbHVlQ29udGV4dERhdGEpID0+XG5cdFx0XHR0aGlzLmZpbHRlclJlY2VudFZhbHVlc0NvbnRleHREYXRhKHJlY2VudFZhbHVlQ29udGV4dERhdGEsIHNlYXJjaFRlcm0sIHZhbHVlSGVscEtleXMsIG90aGVyc1ZhbHVlc0NvbnRleHREYXRhKVxuXHRcdCk7XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gY2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gcmVjZW50IHZhbHVlIGNvbnRleHQgZGF0YSBtYXRjaGVzIHdpdGggdGhlIGdpdmVuIHNlYXJjaCB0ZXJtIG9yIHRoZSBvdGhlcnMgdmFsdWVzLlxuXHQgKiBAcGFyYW0gcmVjZW50VmFsdWVDb250ZXh0RGF0YSBSZWNlbnQgdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gc2VhcmNoVGVybSBTZWFyY2ggdGVybSBlbnRlcmVkIGJ5IHRoZSB1c2VyXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBLZXlzIFZhbHVlTGlzdFByb3BlcnR5IG9mIHRoZSBwYXlsb2FkXG5cdCAqIEBwYXJhbSBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSBPdGhlcnMgdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBnaXZlbiByZWNlbnQgdmFsdWUgY29udGV4dCBzYXRpc2ZpZXMgdGhlIGZpbHRlciBjb25kaXRpb24uXG5cdCAqL1xuXHRmaWx0ZXJSZWNlbnRWYWx1ZXNDb250ZXh0RGF0YTogZnVuY3Rpb24gKFxuXHRcdHJlY2VudFZhbHVlQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGUsXG5cdFx0c2VhcmNoVGVybTogc3RyaW5nLFxuXHRcdHZhbHVlSGVscEtleXM6IHN0cmluZ1tdLFxuXHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW11cblx0KTogYm9vbGVhbiB7XG5cdFx0Zm9yIChjb25zdCBrZXkgaW4gcmVjZW50VmFsdWVDb250ZXh0RGF0YSkge1xuXHRcdFx0aWYgKHR5cGVvZiByZWNlbnRWYWx1ZUNvbnRleHREYXRhW2tleV0gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHRoaXMuZmlsdGVyUmVjZW50VmFsdWVzQ29udGV4dERhdGEoXG5cdFx0XHRcdFx0XHRyZWNlbnRWYWx1ZUNvbnRleHREYXRhW2tleV0gYXMgRmllbGREYXRhVHlwZSxcblx0XHRcdFx0XHRcdHNlYXJjaFRlcm0sXG5cdFx0XHRcdFx0XHR2YWx1ZUhlbHBLZXlzLFxuXHRcdFx0XHRcdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGFcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiByZWNlbnRWYWx1ZUNvbnRleHREYXRhW2tleV0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdCghc2VhcmNoVGVybSAmJiBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YS5sZW5ndGggPT09IDApIHx8IC8vIENhc2Ugd2hlcmUgZm9jdXMgaXMganVzdCBzZXQgdG8gdGhlIHZhbHVlIGhlbHAgZmllbGRcblx0XHRcdFx0XHQocmVjZW50VmFsdWVDb250ZXh0RGF0YVtrZXldIGFzIHN0cmluZykuaW5jbHVkZXMoc2VhcmNoVGVybSkgfHxcblx0XHRcdFx0XHQodmFsdWVIZWxwS2V5cy5pbmNsdWRlcyhrZXkpICYmIHRoaXMuY2hlY2tWYWx1ZXNNYXRjaChyZWNlbnRWYWx1ZUNvbnRleHREYXRhLCBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSwgdmFsdWVIZWxwS2V5cykpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgdmFsdWVzIG9mIHNwZWNpZmllZCBrZXlzIGluIGNvbnRleHREYXRhVG9CZU1hdGNoZWQgbWF0Y2ggd2l0aCBhbnkgb2JqZWN0IGluIGNvbnRleHREYXRhTGlzdC5cblx0ICogQHBhcmFtIGNvbnRleHREYXRhVG9CZU1hdGNoZWQgVGhlIGNvbnRleHQgZGF0YSBvYmplY3QgdG8gY29tcGFyZVxuXHQgKiBAcGFyYW0gY29udGV4dERhdGFMaXN0IFRoZSBhcnJheSBvZiBjb250ZXh0IGRhdGEgb2JqZWN0cyB0byBjb21wYXJlIGFnYWluc3Rcblx0ICogQHBhcmFtIHZhbHVlSGVscEtleXMgVGhlIGtleXMgdG8gY29tcGFyZSBmcm9tIGNvbnRleHREYXRhVG9CZU1hdGNoZWQgd2l0aCBjb250ZXh0RGF0YUxpc3Qgb2JqZWN0c1xuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgYW55IG9iamVjdCBpbiBjb250ZXh0RGF0YUxpc3QgbWF0Y2hlcyB0aGUgdmFsdWVzIG9mIHRoZSBzcGVjaWZpZWQga2V5cyBpbiBjb250ZXh0RGF0YVRvQmVNYXRjaGVkLCBvdGhlcndpc2UgZmFsc2UuXG5cdCAqL1xuXHRjaGVja1ZhbHVlc01hdGNoOiBmdW5jdGlvbiAoY29udGV4dERhdGFUb0JlTWF0Y2hlZDogRmllbGREYXRhVHlwZSwgY29udGV4dERhdGFMaXN0OiBGaWVsZERhdGFUeXBlW10sIHZhbHVlSGVscEtleXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG5cdFx0Zm9yIChjb25zdCBvYmogb2YgY29udGV4dERhdGFMaXN0KSB7XG5cdFx0XHRsZXQgbWF0Y2ggPSB0cnVlO1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgb2YgdmFsdWVIZWxwS2V5cykge1xuXHRcdFx0XHQvLyBDaGVjayBpZiB0aGUgdmFsdWUgb2YgdGhlIGtleSBpbiByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YVxuXHRcdFx0XHQvLyBtYXRjaGVzIHRoZSB2YWx1ZSBvZiB0aGUga2V5IGluIHRoZSBjdXJyZW50IG9iamVjdCBmcm9tIG90aGVyc1ZhbHVlc0NvbnRleHREYXRhXG5cdFx0XHRcdGlmIChjb250ZXh0RGF0YVRvQmVNYXRjaGVkW2tleV0gIT09IG9ialtrZXldKSB7XG5cdFx0XHRcdFx0bWF0Y2ggPSBmYWxzZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG1hdGNoKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byByZWFycmFuZ2UgdGhlIGdpdmVuIGFkZGl0aW9uYWwgdmFsdWUgY29udGV4dCBkYXRhIGFzIHBlciB0aGUgY2hyb25vbG9naWNhbCBvcmRlciBvZiB0aGUgZ2l2ZW4gYWRkaXRpb25hbCB2YWx1ZXMuXG5cdCAqIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgdGhlIHJlY29tbWVuZGF0aW9uIGRhdGEgZmV0Y2hlZCBmcm9tIGJhY2tlbmQgYXJlIHNob3duIGluIHRoZSBzYW1lIG9yZGVyIG9mIHJlY29tbWVuZGF0aW9uIHZhbHVlcyBmZXRjaGVkIGZyb20gcmVjb21tZW5kYXRpb24gc2VydmljZS5cblx0ICogQHBhcmFtIHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEgUmVjb21tZW5kYXRpb24gdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gcmVjb21tZW5kYXRpb25WYWx1ZXMgUmVjb21tZW5kYXRpb24gdmFsdWVzXG5cdCAqIEBwYXJhbSB2YWx1ZUxpc3RQcm9wZXJ0eSBWYWx1ZSBsaXN0IHByb3BlcnR5IG9mIHRoZSB2YWx1ZSBoZWxwXG5cdCAqIEByZXR1cm5zIFJlY29tbWVuZGF0aW9uIHZhbHVlcyBjb250ZXh0IGRhdGEgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG5cdCAqL1xuXHRnZXRSZWxldmFudFJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGE6IGZ1bmN0aW9uIChcblx0XHRyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10sXG5cdFx0cmVjb21tZW5kYXRpb25WYWx1ZXM6IChzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuKVtdID0gW10sXG5cdFx0dmFsdWVMaXN0UHJvcGVydHk6IHN0cmluZ1xuXHQpOiBGaWVsZERhdGFUeXBlW10ge1xuXHRcdGNvbnN0IHJlbGV2YW50UmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdID0gW107XG5cdFx0cmVjb21tZW5kYXRpb25WYWx1ZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcblx0XHRcdGNvbnN0IGZvdW5kT2JqZWN0ID0gcmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YS5maW5kKChjb250ZXh0RGF0YSkgPT4gY29udGV4dERhdGFbdmFsdWVMaXN0UHJvcGVydHldID09PSB2YWx1ZSk7XG5cdFx0XHRpZiAoZm91bmRPYmplY3QpIHtcblx0XHRcdFx0cmVsZXZhbnRSZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLnB1c2goZm91bmRPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHJlbGV2YW50UmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YTtcblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byBtYWtlIGJhdGNoIGNhbGxzIHRvIHN1cHBvcnQgcGFnaW5hdGlvbi5cblx0ICogVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB0aGUgYWRkaXRpb25hbCBkYXRhIGZldGNoZWQgZnJvbSB0aGUgYmFja2VuZCBpcyBkaXNwbGF5ZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG5cdCAqIEBwYXJhbSBldmVudCBBbiBldmVudCBvYmplY3QgdGhhdCBjb25zaXN0cyBvZiBhbiBJRCwgc291cmNlLCBhbmQgYSBwYXJhbWV0ZXIgbWFwLlxuXHQgKi9cblx0dXBkYXRlRmluaXNoZWQ6IGFzeW5jIGZ1bmN0aW9uIG5hbWUoZXZlbnQ6IFVJNUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc291cmNlID0gZXZlbnQuZ2V0U291cmNlKCkgYXMgeyBzb3VyY2U/OiBFdmVudFByb3ZpZGVyIH0gYXMgTVRhYmxlO1xuXHRcdGNvbnN0IHRhYmxlQmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgfCBudWxsID0gc291cmNlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIiksXG5cdFx0XHRhbGxMaXN0QmluZGluZyA9IHRhYmxlQmluZGluZ0NvbnRleHQ/LmdldFByb3BlcnR5KFwiYWxsTGlzdEJpbmRpbmdcIikgYXMgT0RhdGFMaXN0QmluZGluZyB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCB7IGFjdHVhbCwgdG90YWwsIHJlYXNvbiB9ID0gZXZlbnQuZ2V0UGFyYW1ldGVycygpIGFzIHsgYWN0dWFsOiBudW1iZXI7IHRvdGFsOiBudW1iZXI7IHJlYXNvbjogc3RyaW5nIH07XG5cdFx0Ly8gYXMgdXNlciBzY3JvbGxzIGRvd24gYW5kIG9uY2Ugd2UgcmVhY2ggZW5kIG9mIHRoZSBsaXN0LCB3ZSBmZXRjaCB0aGUgbmV4dCBzZXQgb2YgZGF0YSBmcm9tIHRoZSBiYWNrZW5kXG5cdFx0aWYgKGFsbExpc3RCaW5kaW5nICYmIHJlYXNvbiA9PT0gXCJHcm93aW5nXCIgJiYgYWN0dWFsID09PSB0b3RhbCkge1xuXHRcdFx0Y29uc3QgcGFnaW5hdGlvbkRhdGEgPSBhd2FpdCBhbGxMaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHModG90YWwsIDEwMCksXG5cdFx0XHRcdGFkZGl0aW9uYWxEYXRhID0gcGFnaW5hdGlvbkRhdGEubWFwKChkYXRhOiBWNENvbnRleHQpID0+IGRhdGEuZ2V0T2JqZWN0KCkgYXMgRmllbGREYXRhVHlwZSk7XG5cdFx0XHRhZGRpdGlvbmFsRGF0YS5mb3JFYWNoKGFzeW5jIChjb250ZXh0RGF0YTogRmllbGREYXRhVHlwZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0ID0gKHNvdXJjZS5nZXRCaW5kaW5nKFwiaXRlbXNcIikgYXMgT0RhdGFMaXN0QmluZGluZykuY3JlYXRlKGNvbnRleHREYXRhLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGF3YWl0IGNvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdGlmIChlcnJvcikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKChlcnJvciBhcyBDb250ZXh0RXJyb3JUeXBlKS5uYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxufTtcbmV4cG9ydCB7IEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5LCBSZWNvbW1lbmRhdGlvblZhbHVlVHlwZSwgYWRkaXRpb25hbFZhbHVlSGVscGVyIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztNQStCS0EsdUJBQXVCLDBCQUF2QkEsdUJBQXVCO0lBQXZCQSx1QkFBdUI7SUFBdkJBLHVCQUF1QjtJQUF2QkEsdUJBQXVCO0lBQUEsT0FBdkJBLHVCQUF1QjtFQUFBLEVBQXZCQSx1QkFBdUI7RUFBQUMsUUFBQSxDQUFBRCx1QkFBQSxHQUFBQSx1QkFBQTtFQXNCNUIsTUFBTUUscUJBQXFCLEdBQUc7SUFDN0I7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0Msb0NBQW9DLEVBQUUsZUFBQUEsQ0FDckNDLGdCQUF1QyxFQUN2Q0Msb0JBQXNDLEVBQ3RDQyxvQkFBZ0QsRUFDaERDLE9BQXlCLEVBQ3pCQyxPQUFxQixFQUNyQkMsS0FBWSxFQUlWO01BQ0YsSUFBSUMsY0FBNEM7TUFDaEQsTUFBTUMsNkJBQXFELEdBQUcsRUFBRTtNQUNoRTtNQUNBLE1BQU1DLDJCQUEyQixHQUFHLENBQ25DLEdBQUdSLGdCQUFnQixDQUFDUyxNQUFNLENBQUVDLEtBQUssSUFBS0EsS0FBSyxDQUFDQyxRQUFRLEtBQUtmLHVCQUF1QixDQUFDZ0IsY0FBYyxDQUFDLENB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
|
|
589
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBZGRpdGlvbmFsVmFsdWVHcm91cEtleSIsIl9leHBvcnRzIiwiYWRkaXRpb25hbFZhbHVlSGVscGVyIiwicmVxdWVzdEZvckFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhIiwiYWRkaXRpb25hbFZhbHVlcyIsInZhbHVlSGVscExpc3RCaW5kaW5nIiwidmFsdWVIZWxwQmluZGluZ0luZm8iLCJwYXlsb2FkIiwic29ydGVycyIsInRhYmxlIiwiYWxsTGlzdEJpbmRpbmciLCJhZGRpdGlvbmFsVmFsdWVDb250ZXh0UHJvbWlzZSIsInJldmVyc2VSZWNvbW1lbmRhdGlvblZhbHVlcyIsImZpbHRlciIsInZhbHVlIiwiZ3JvdXBLZXkiLCJyZWNvbW1lbmRhdGlvbiIsInJldmVyc2UiLCJwYXJhbWV0ZXJzIiwiJHNlbGVjdCIsInF1YWxpZmllcnMiLCJ2YWx1ZUhlbHBRdWFsaWZpZXIiLCJ2aFByb3BlcnRpZXMiLCJzZWFyY2hUZXJtIiwiJHNlYXJjaCIsImlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzIiwiJGNvdW50IiwibGlzdFNvcnRlcnMiLCJmb3JFYWNoIiwic29ydGVyIiwicHVzaCIsIlNvcnRlciIsIm5hbWUiLCJkZXNjZW5kaW5nIiwidmFsdWVIZWxwTGlzdE1vZGVsIiwiZ2V0TW9kZWwiLCJhZGRpdGlvbmFsVmFsdWVMaXN0QmluZGluZ3MiLCJnZXRBZGRpdGlvbmFsVmFsdWVDb250ZXh0QmluZGluZ3MiLCJsZW5ndGgiLCJyZXF1ZXN0Q29udGV4dHMiLCJzdWJtaXRCYXRjaCIsImFkZGl0aW9uYWxWYWx1ZXNDb250ZXh0IiwiUHJvbWlzZSIsImFsbCIsImNvdW50IiwiZ2V0Q291bnQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInNldFByb3BlcnR5IiwicmVjb21tZW5kYXRpb25Db250ZXh0cyIsImFsbENvbnRleHRzIiwicmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSIsIm1hcCIsImNvbnRleHQiLCJnZXRPYmplY3QiLCJvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSIsImFkZGl0aW9uYWxWYWx1ZUNvbnRleHRCaW5kaW5ncyIsInZhbHVlSGVscEZpbHRlcnMiLCJnZXRWYWx1ZUhlbHBCaW5kaW5nRmlsdGVycyIsImdldE1ldGFNb2RlbCIsInJlY29tbWVuZGF0aW9uVmFsdWVGaWx0ZXJzIiwiZ2V0QWRkaXRpb25hbFZhbHVlRmlsdGVycyIsImJpbmRMaXN0IiwicGF0aCIsInVuZGVmaW5lZCIsIm1ldGFNb2RlbCIsImZpbHRlcnMiLCJBcnJheSIsImlzQXJyYXkiLCJhZGREcmFmdEZpbHRlciIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJvYmplY3RQYXRoIiwiTWV0YU1vZGVsQ29udmVydGVyIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiaXNEcmFmdFN1cHBvcnRlZCIsIk1vZGVsSGVscGVyIiwiaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQiLCJGaWx0ZXIiLCJvcGVyYXRvciIsInZhbHVlMSIsInJlc3VtZVZhbHVlTGlzdEJpbmRpbmdBbmRSZXNldENoYW5nZXMiLCJpc1N1c3BlbmRlZCIsInJlc3VtZUFzeW5jIiwicmVzZXRDaGFuZ2VzIiwiZXJyb3IiLCJzb3J0QW5kRmlsdGVyTGlzdEJpbmRpbmciLCJOT05FIiwiRmlsdGVyVHlwZSIsIkFwcGxpY2F0aW9uIiwibW9kaWZpZWRTb3J0ZXJzIiwiZ2V0U29ydGVyRnVuY3Rpb24iLCJzb3J0IiwicmV2ZXJzZUFkZGl0aW9uYWxWYWx1ZXMiLCJhZGRpdGlvbmFsVmFsdWUiLCJ2YWx1ZXMiLCJwcm9wZXJ0eVBhdGgiLCJyZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImdldFByb3BlcnR5IiwiZ2V0VGV4dCIsInJlY2VudFZhbHVlIiwiY3JlYXRlVHJhbnNpZW50Q29udGV4dHNGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSIsInJlY2VudFZhbHVlc0NvbnRleHREYXRhIiwiY3JlYXRlR3JvdXBlZFRyYW5zaWVudENvbnRleHRzIiwib3RoZXIiLCJhZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSIsImNvbnRleHREYXRhIiwiY3JlYXRlIiwiY3JlYXRlZCIsImNhbmNlbGVkIiwiTG9nIiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMiLCJkYXRhIiwiYmluZGluZ0NvbnRleHQiLCJiaW5kaW5nUGF0aCIsInJlbGV2YW50UmVjb21tZW5kYXRpb25zIiwiT2JqZWN0Iiwia2V5cyIsImdldFJlY29tbWVuZGF0aW9uUHJvcGVydHlQYXRoIiwidmVyc2lvbiIsImdldEFkZGl0aW9uYWxWYWx1ZUZyb21Qcm9wZXJ0eVBhdGgiLCJ2YWx1ZURhdGEiLCJfY2hlY2tGb3JLZXlzSW5SZWNvbW1lbmRhdGlvbnMiLCJrZXlQcm9wZXJ0aWVzIiwia2V5IiwiZ2V0QWRkaXRpb25hbFZhbHVlRnJvbUtleXMiLCJyZWNvbW1lbmRhdGlvbkRhdGEiLCJyZXN1bHQiLCJyZWNEYXRhIiwiYWxsS2V5c01hdGNoIiwiX2dldFJlY29tbWVuZGF0aW9uIiwib2xkRGF0YSIsImFzc2lnbiIsImluY2x1ZGVzIiwicHJvcGVydHlQYXRocyIsInNwbGl0IiwibmF2UHJvcFBhdGgiLCJzcGxpY2UiLCJqb2luIiwic3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlciIsImdldFN0YW5kYXJkUmVjb21tZW5kYXRpb25zIiwiZ2V0UmVsZXZhbnRPdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSIsInZhbHVlSGVscEtleXMiLCJjaGVja1ZhbHVlc01hdGNoIiwiZ2V0UmVsZXZhbnRSZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSIsImJpbmRpbmdJbmZvIiwicmVjZW50VmFsdWVzTW9kZWwiLCJKU09OTW9kZWwiLCJyZWNlbnRWYWx1ZXNMaXN0IiwiZ2V0QWxsQ3VycmVudENvbnRleHRzIiwicmVjZW50VmFsdWVDb250ZXh0RGF0YSIsImZpbHRlclJlY2VudFZhbHVlc0NvbnRleHREYXRhIiwiY29udGV4dERhdGFUb0JlTWF0Y2hlZCIsImNvbnRleHREYXRhTGlzdCIsIm9iaiIsIm1hdGNoIiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhIiwicmVjb21tZW5kYXRpb25WYWx1ZXMiLCJhcmd1bWVudHMiLCJ2YWx1ZUxpc3RQcm9wZXJ0eSIsInJlbGV2YW50UmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSIsImZvdW5kT2JqZWN0IiwiZmluZCIsInVwZGF0ZUZpbmlzaGVkIiwiZXZlbnQiLCJzb3VyY2UiLCJnZXRTb3VyY2UiLCJ0YWJsZUJpbmRpbmdDb250ZXh0IiwiYWN0dWFsIiwidG90YWwiLCJyZWFzb24iLCJnZXRQYXJhbWV0ZXJzIiwicGFnaW5hdGlvbkRhdGEiLCJhZGRpdGlvbmFsRGF0YSIsImdldEJpbmRpbmciLCJhZGRBY3RpdmVSZWNvbW1lbmRhdGlvbiIsIm1vZGVsIiwibG9jYWxBbm5vdGF0aW9uTW9kZWwiLCJnZXRMb2NhbEFubm90YXRpb25Nb2RlbCIsImNvbnRleHRQYXRoIiwiZ2V0UGF0aCIsImFjdGl2ZVJlY29tbWVuZGF0aW9ucyIsImV4aXN0aW5nUGF0aHMiLCJyZW1vdmVBY3RpdmVSZWNvbW1lbmRhdGlvbiIsImZpbHRlcmVkUGF0aHMiLCJ1cGRhdGVkUmVjb21tZW5kYXRpb25zIiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwiX3JlZiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQWRkaXRpb25hbFZhbHVlSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7XG5cdEluQ29tcGxldGVuZXNzSW5mb1R5cGUsXG5cdEludGVybmFsUHJvcGVydHlBZGRpdGlvbmFsVmFsdWUsXG5cdEtleVByb3BlcnRpZXNEYXRhVHlwZSxcblx0UmVjb21tZW5kYXRpb25EYXRhRm9yTmF2UHJvcGVydHlUeXBlLFxuXHRSZWNvbW1lbmRhdGlvblZhbHVlVHlwZVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZWNvbW1lbmRhdGlvbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBSZWNvbW1lbmRhdGlvbkluZm8sIFN0YW5kYXJkUmVjb21tZW5kYXRpb25EYXRhVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXJcIjtcbmltcG9ydCB7IHN0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFuZGFyZFJlY29tbWVuZGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkRGF0YVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvVmFsdWVIZWxwSGlzdG9yeVNlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSB7IFNvcnRlclR5cGUsIFZhbHVlSGVscFBheWxvYWQgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL20vVGFibGVcIjtcbmltcG9ydCB0eXBlIFVJNUV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgRXZlbnRQcm92aWRlciBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRQcm92aWRlclwiO1xuaW1wb3J0IHR5cGUgeyBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mbyB9IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgdHlwZSBNVGFibGUgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2NvbnRlbnQvTVRhYmxlXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IEZpbHRlclR5cGUgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJUeXBlXCI7XG5pbXBvcnQgU29ydGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvU29ydGVyXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIFY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dEVycm9yVHlwZSB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5cbmVudW0gQWRkaXRpb25hbFZhbHVlR3JvdXBLZXkge1xuXHRyZWNvbW1lbmRhdGlvbiA9IFwicmVjb21tZW5kYXRpb25cIixcblx0cmVjZW50VmFsdWUgPSBcInJlY2VudFZhbHVlXCIsXG5cdG90aGVyID0gXCJvdGhlclwiXG59XG5leHBvcnQgdHlwZSBBZGRpdGlvbmFsVmFsdWVUeXBlID0ge1xuXHRwcm9wZXJ0eVBhdGg6IHN0cmluZztcblx0dmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbilbXTtcblx0Z3JvdXBLZXk6IEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5OyAvLyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGdyb3VwXG59O1xuZXhwb3J0IHR5cGUgQmluZGluZ0luZm9QYXJhbWV0ZXJzID0ge1xuXHQkc2VsZWN0OiBzdHJpbmdbXTtcblx0JGV4cGFuZD86IHN0cmluZ1tdO1xuXHQkc2VhcmNoOiBzdHJpbmc7XG5cdCRjb3VudDogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEFkZGl0aW9uVmFsdWVEZWZpbml0aW9uID1cblx0fCBJbkNvbXBsZXRlbmVzc0luZm9UeXBlXG5cdHwgUmVjb21tZW5kYXRpb25EYXRhRm9yTmF2UHJvcGVydHlUeXBlW11cblx0fCBJbnRlcm5hbFByb3BlcnR5QWRkaXRpb25hbFZhbHVlXG5cdHwgb2JqZWN0O1xuY29uc3QgYWRkaXRpb25hbFZhbHVlSGVscGVyID0ge1xuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgY29udGV4dCBiYXNlZCBvbiBhZGRpdGlvbmFsIHZhbHVlIGZpbHRlcnMgYW5kIGN1c3RvbSBzb3J0ZXIgYW5kIHJlcXVlc3QgY29udGV4dHMgZnJvbSBpdC5cblx0ICogQHBhcmFtIGFkZGl0aW9uYWxWYWx1ZXMgQXJyYXkgb2YgYWRkaXRpb25hbCB2YWx1ZXNcblx0ICogQHBhcmFtIHZhbHVlSGVscExpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gdmFsdWVIZWxwQmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIG9mIHRoZSB2YWx1ZSBoZWxwXG5cdCAqIEBwYXJhbSBzb3J0ZXJzIFNvcnRlcnMgb2YgdGhlIHZhbHVlIGhlbHAgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSB0YWJsZSBUYWJsZSBmb3Igd2hpY2ggdGhlIHZhbHVlIGhlbHAgaXMgcmVxdWVzdGVkXG5cdCAqIEByZXR1cm5zIEFkZGl0aW9uYWwgdmFsdWUgY29udGV4dHNcblx0ICovXG5cdHJlcXVlc3RGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YTogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGFkZGl0aW9uYWxWYWx1ZXM6IEFkZGl0aW9uYWxWYWx1ZVR5cGVbXSxcblx0XHR2YWx1ZUhlbHBMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHR2YWx1ZUhlbHBCaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8sXG5cdFx0cGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCxcblx0XHRzb3J0ZXJzOiBTb3J0ZXJUeXBlW10sXG5cdFx0dGFibGU6IFRhYmxlXG5cdCk6IFByb21pc2U8e1xuXHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXTtcblx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdO1xuXHR9PiB7XG5cdFx0bGV0IGFsbExpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGFkZGl0aW9uYWxWYWx1ZUNvbnRleHRQcm9taXNlOiBQcm9taXNlPFY0Q29udGV4dFtdPltdID0gW107XG5cdFx0Ly8gcmV2ZXJzZSB0aGUgYXJyYXkgc28gdGhhdCB3aGlsZSBjcmVhdGluZyB0cmFuc2llbnQgY29udGV4dCBmaXJzdCBhZGRpdGlvbmFsIHZhbHVlIGlzIGdyb3VwZWQgZmlyc3Rcblx0XHRjb25zdCByZXZlcnNlUmVjb21tZW5kYXRpb25WYWx1ZXMgPSBbXG5cdFx0XHQuLi5hZGRpdGlvbmFsVmFsdWVzLmZpbHRlcigodmFsdWUpID0+IHZhbHVlLmdyb3VwS2V5ID09PSBBZGRpdGlvbmFsVmFsdWVHcm91cEtleS5yZWNvbW1lbmRhdGlvbilcblx0XHRdLnJldmVyc2UoKTtcblxuXHRcdC8vIGxvZ2ljIHRvIGFkZCAkc2VsZWN0IGZvciBtdWx0aS1sZXZlbCBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXMgZmlsbGluZyAkc2VsZWN0IGlzIHN1ZmZpY2llbnQgZm9yIHRoZSBtb2RlbCB0byBjcmVhdGUgdGhlIGV4cGFuZCBjYWxsc1xuXHRcdCh2YWx1ZUhlbHBCaW5kaW5nSW5mby5wYXJhbWV0ZXJzIGFzIEJpbmRpbmdJbmZvUGFyYW1ldGVycykuJHNlbGVjdCA9XG5cdFx0XHRwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdLnZoUHJvcGVydGllcyA/PyBbXTtcblxuXHRcdC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFueSBpbnB1dCBpbiB0aGUgZmllbGRcblx0XHQvLyBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRvIHNob3cgdGhlIFwib3RoZXJzXCIgc2VjdGlvbiBvciBub3Rcblx0XHQvLyBhbmQgYWxzbyB0byBkZXRlcm1pbmUgaWYgdHlwZUFoZWFkIHNob3VsZCBvcGVuIG9yIG5vdFxuXHRcdGNvbnN0IHNlYXJjaFRlcm0gPSAodmFsdWVIZWxwQmluZGluZ0luZm8ucGFyYW1ldGVycyBhcyBCaW5kaW5nSW5mb1BhcmFtZXRlcnMpLiRzZWFyY2g7XG5cdFx0KHZhbHVlSGVscEJpbmRpbmdJbmZvLnBhcmFtZXRlcnMgYXMgQmluZGluZ0luZm9QYXJhbWV0ZXJzKS4kc2VhcmNoID0gc2VhcmNoVGVybTtcblx0XHRpZiAocGF5bG9hZC5pc1ZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlcykge1xuXHRcdFx0KHZhbHVlSGVscEJpbmRpbmdJbmZvLnBhcmFtZXRlcnMgYXMgQmluZGluZ0luZm9QYXJhbWV0ZXJzKS4kY291bnQgPSB0cnVlO1xuXHRcdH1cblx0XHRjb25zdCBsaXN0U29ydGVyczogU29ydGVyW10gPSBbXTtcblx0XHRzb3J0ZXJzLmZvckVhY2goKHNvcnRlcjogU29ydGVyVHlwZSkgPT4gbGlzdFNvcnRlcnMucHVzaChuZXcgU29ydGVyKHNvcnRlci5uYW1lID8/IFwiXCIsIHNvcnRlci5kZXNjZW5kaW5nKSkpO1xuXHRcdGNvbnN0IHZhbHVlSGVscExpc3RNb2RlbDogT0RhdGFNb2RlbCA9IHZhbHVlSGVscExpc3RCaW5kaW5nLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbDtcblx0XHQvLyBnZXQgdGhlIGxpc3QgYmluZGluZyBmb3IgcmVjb21tZW5kYXRpb24gdmFsdWVzIGFuZCBvdGhlcnMgdmFsdWVzXG5cdFx0Y29uc3QgYWRkaXRpb25hbFZhbHVlTGlzdEJpbmRpbmdzOiBPRGF0YUxpc3RCaW5kaW5nW10gPSB0aGlzLmdldEFkZGl0aW9uYWxWYWx1ZUNvbnRleHRCaW5kaW5ncyhcblx0XHRcdHJldmVyc2VSZWNvbW1lbmRhdGlvblZhbHVlcyxcblx0XHRcdHNlYXJjaFRlcm0sXG5cdFx0XHRwYXlsb2FkLFxuXHRcdFx0dmFsdWVIZWxwTGlzdE1vZGVsLFxuXHRcdFx0dmFsdWVIZWxwQmluZGluZ0luZm8sXG5cdFx0XHRsaXN0U29ydGVyc1xuXHRcdCk7XG5cdFx0aWYgKGFkZGl0aW9uYWxWYWx1ZUxpc3RCaW5kaW5ncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRpZiAoYWRkaXRpb25hbFZhbHVlTGlzdEJpbmRpbmdzLmxlbmd0aCA9PT0gMikge1xuXHRcdFx0XHRhZGRpdGlvbmFsVmFsdWVDb250ZXh0UHJvbWlzZS5wdXNoKGFkZGl0aW9uYWxWYWx1ZUxpc3RCaW5kaW5nc1swXS5yZXF1ZXN0Q29udGV4dHMoMCwgMTAsIFwiYWRkaXRpb25hbFZhbHVlXCIpKTtcblx0XHRcdFx0YWxsTGlzdEJpbmRpbmcgPSBhZGRpdGlvbmFsVmFsdWVMaXN0QmluZGluZ3NbMV07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhbGxMaXN0QmluZGluZyA9IGFkZGl0aW9uYWxWYWx1ZUxpc3RCaW5kaW5nc1swXTtcblx0XHRcdH1cblx0XHRcdC8vIGluIGNhc2Ugb2YgZHJvcGRvd24sIHdlIGZldGNoIGZpcnN0IDEwMCByZWNvcmRzIG9uIGZpcnN0IGxvYWQgYW5kIHRoZW4gbWFrZSBzdWJzZXF1ZW50IHJlcXVlc3RzIHVwb24gdXNlcidzIHNjcm9sbC5cblx0XHRcdGFkZGl0aW9uYWxWYWx1ZUNvbnRleHRQcm9taXNlLnB1c2goXG5cdFx0XHRcdGFsbExpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCBwYXlsb2FkLmlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzID8gMTAwIDogMTAsIFwiYWRkaXRpb25hbFZhbHVlXCIpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRhd2FpdCB2YWx1ZUhlbHBMaXN0TW9kZWwuc3VibWl0QmF0Y2goXCJhZGRpdGlvbmFsVmFsdWVcIik7XG5cdFx0Y29uc3QgYWRkaXRpb25hbFZhbHVlc0NvbnRleHQgPSBhd2FpdCBQcm9taXNlLmFsbChhZGRpdGlvbmFsVmFsdWVDb250ZXh0UHJvbWlzZSk7XG5cdFx0Ly8gd2Ugc3RvcmUgdGhpcyBsaXN0IGJpbmRpbmdzIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gbWFrZSBzdWJzZXF1ZW50IHJlcXVlc3RzIG9uIHVzZXIncyBzY3JvbGxcblx0XHRjb25zdCBjb3VudCA9IGFsbExpc3RCaW5kaW5nPy5nZXRDb3VudCgpO1xuXHRcdGlmIChjb3VudCAmJiBjb3VudCA+IDEwMCkge1xuXHRcdFx0dGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uc2V0UHJvcGVydHkoXCJhbGxMaXN0QmluZGluZ1wiLCBhbGxMaXN0QmluZGluZyk7XG5cdFx0fVxuXHRcdGxldCByZWNvbW1lbmRhdGlvbkNvbnRleHRzOiBWNENvbnRleHRbXSA9IFtdLFxuXHRcdFx0YWxsQ29udGV4dHM6IFY0Q29udGV4dFtdID0gW107XG5cdFx0aWYgKHJldmVyc2VSZWNvbW1lbmRhdGlvblZhbHVlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZWNvbW1lbmRhdGlvbkNvbnRleHRzID0gYWRkaXRpb25hbFZhbHVlc0NvbnRleHRbMF07XG5cdFx0XHRpZiAoc2VhcmNoVGVybSB8fCBwYXlsb2FkLmlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzKSB7XG5cdFx0XHRcdGFsbENvbnRleHRzID0gYWRkaXRpb25hbFZhbHVlc0NvbnRleHRbMV07XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChzZWFyY2hUZXJtIHx8IHBheWxvYWQuaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMpIHtcblx0XHRcdGFsbENvbnRleHRzID0gYWRkaXRpb25hbFZhbHVlc0NvbnRleHRbMF07XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSA9IHJlY29tbWVuZGF0aW9uQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldE9iamVjdCgpIGFzIEZpZWxkRGF0YVR5cGUpO1xuXHRcdGNvbnN0IG90aGVyc1ZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10gPSBhbGxDb250ZXh0cy5tYXAoKGNvbnRleHQpID0+IGNvbnRleHQuZ2V0T2JqZWN0KCkgYXMgRmllbGREYXRhVHlwZSk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhXG5cdFx0fTtcblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byByZXRyaWV2ZSBhbGwgcmVsZXZhbnQgbGlzdCBiaW5kaW5ncyAocmVjb21tZW5kYXRpb24gYW5kIG90aGVycykgdGhhdCBpcyBuZWVkZWQgdG8gbWFrZSBhIGJhY2tlbmQgY2FsbC5cblx0ICogQHBhcmFtIHJldmVyc2VSZWNvbW1lbmRhdGlvblZhbHVlcyBSZXZlcnNlZCByZWNvbW1lbmRhdGlvbiB2YWx1ZXNcblx0ICogQHBhcmFtIHNlYXJjaFRlcm0gU2VhcmNoIHRlcm0gZW50ZXJlZCBieSB0aGUgdXNlclxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIG9mIHRoZSB2YWx1ZSBoZWxwXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBMaXN0TW9kZWwgTW9kZWwgb2YgdGhlIHZhbHVlIGhlbHBcblx0ICogQHBhcmFtIHZhbHVlSGVscEJpbmRpbmdJbmZvIEJpbmRpbmcgaW5mbyBvZiB0aGUgdmFsdWUgaGVscFxuXHQgKiBAcGFyYW0gc29ydGVyIEN1c3RvbSBzb3J0ZXIgd2hpY2ggbmVlZHMgdG8gYmUgYXBwbGllZCB0byB0aGUgbGlzdCBiaW5kaW5nXG5cdCAqIEByZXR1cm5zIEFsbCB0aGUgbGlzdCBiaW5kaW5nIHdoaWNoIHdvdWxkIGJlIHVzZWQgdG8gdHJpZ2dlciBjYWxscyB0byB0aGUgYmFja2VuZC5cblx0ICovXG5cdGdldEFkZGl0aW9uYWxWYWx1ZUNvbnRleHRCaW5kaW5nczogZnVuY3Rpb24gKFxuXHRcdHJldmVyc2VSZWNvbW1lbmRhdGlvblZhbHVlczogQWRkaXRpb25hbFZhbHVlVHlwZVtdLFxuXHRcdHNlYXJjaFRlcm06IHN0cmluZyxcblx0XHRwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLFxuXHRcdHZhbHVlSGVscExpc3RNb2RlbDogT0RhdGFNb2RlbCxcblx0XHR2YWx1ZUhlbHBCaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8sXG5cdFx0c29ydGVyOiBTb3J0ZXJbXVxuXHQpOiBPRGF0YUxpc3RCaW5kaW5nW10ge1xuXHRcdGNvbnN0IGFkZGl0aW9uYWxWYWx1ZUNvbnRleHRCaW5kaW5nczogT0RhdGFMaXN0QmluZGluZ1tdID0gW107XG5cdFx0Y29uc3QgdmFsdWVIZWxwRmlsdGVyczogRmlsdGVyW10gPSBbXG5cdFx0XHQuLi50aGlzLmdldFZhbHVlSGVscEJpbmRpbmdGaWx0ZXJzKHZhbHVlSGVscEJpbmRpbmdJbmZvLCBwYXlsb2FkLCB2YWx1ZUhlbHBMaXN0TW9kZWwuZ2V0TWV0YU1vZGVsKCkpXG5cdFx0XTtcblx0XHRjb25zdCByZWNvbW1lbmRhdGlvblZhbHVlRmlsdGVycyA9IHRoaXMuZ2V0QWRkaXRpb25hbFZhbHVlRmlsdGVycyhyZXZlcnNlUmVjb21tZW5kYXRpb25WYWx1ZXMsIFsuLi52YWx1ZUhlbHBGaWx0ZXJzXSk7XG5cblx0XHRpZiAocmV2ZXJzZVJlY29tbWVuZGF0aW9uVmFsdWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vIGJpbmRpbmcgcmVwcmVzZW50IHJlY29tbWVuZGF0aW9uIGxpc3QgYmluZGluZy5cblx0XHRcdGFkZGl0aW9uYWxWYWx1ZUNvbnRleHRCaW5kaW5ncy5wdXNoKFxuXHRcdFx0XHR2YWx1ZUhlbHBMaXN0TW9kZWwuYmluZExpc3QoXG5cdFx0XHRcdFx0dmFsdWVIZWxwQmluZGluZ0luZm8ucGF0aCxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdHJlY29tbWVuZGF0aW9uVmFsdWVGaWx0ZXJzLFxuXHRcdFx0XHRcdHZhbHVlSGVscEJpbmRpbmdJbmZvLnBhcmFtZXRlcnNcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKHNlYXJjaFRlcm0gfHwgcGF5bG9hZC5pc1ZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlcykge1xuXHRcdFx0Ly8gYmluZGluZyByZXByZXNlbnQgYWxsIGRhdGEgbGlzdCBiaW5kaW5ncy5cblx0XHRcdGFkZGl0aW9uYWxWYWx1ZUNvbnRleHRCaW5kaW5ncy5wdXNoKFxuXHRcdFx0XHR2YWx1ZUhlbHBMaXN0TW9kZWwuYmluZExpc3QodmFsdWVIZWxwQmluZGluZ0luZm8ucGF0aCwgdW5kZWZpbmVkLCBzb3J0ZXIsIHZhbHVlSGVscEZpbHRlcnMsIHZhbHVlSGVscEJpbmRpbmdJbmZvLnBhcmFtZXRlcnMpXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBhZGRpdGlvbmFsVmFsdWVDb250ZXh0QmluZGluZ3M7XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIHRvIGZldGNoIHRoZSB2YWx1ZWhlbHAgYmluZGluZyBmaWx0ZXJzLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwQmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIG9mIHRoZSB2YWx1ZSBoZWxwIHRvIGNoZWNrIGlmIGl0J3MgYSBkcm9wZG93biBzY2VuYXJpb1xuXHQgKiBAcGFyYW0gbWV0YU1vZGVsIFRoZSBPRGF0YSBtZXRhIG1vZGVsIHRvIHJlc29sdmUgZW50aXR5IHNldCBmcm9tIHBhdGhcblx0ICogQHJldHVybnMgRmlsdGVycyBvZiB2YWx1ZWhlbHAgYmluZGluZ1xuXHQgKi9cblx0Z2V0VmFsdWVIZWxwQmluZGluZ0ZpbHRlcnM6IGZ1bmN0aW9uIChcblx0XHR2YWx1ZUhlbHBCaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8sXG5cdFx0cGF5bG9hZD86IFZhbHVlSGVscFBheWxvYWQsXG5cdFx0bWV0YU1vZGVsPzogT0RhdGFNZXRhTW9kZWxcblx0KTogRmlsdGVyW10ge1xuXHRcdGNvbnN0IGZpbHRlcnM6IEZpbHRlcltdID0gW107XG5cdFx0Ly8gZ2V0IGFsbCBleGlzdGluZyBmaWx0ZXJzIGZyb20gdGhlIGJpbmRpbmcgaW5mb1xuXHRcdC8vIHRoaXMgKyBhZGRpdGlvbmFsIHZhbHVlIGZpbHRlcnMgd2lsbCBiZSB1c2VkIGxhdGVyIG9uIHRvIGZldGNoIGFkZGl0aW9uYWwgdmFsdWVzIGZyb20gdGhlIGJhY2tlbmRcblx0XHRpZiAodmFsdWVIZWxwQmluZGluZ0luZm8uZmlsdGVycykge1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWVIZWxwQmluZGluZ0luZm8uZmlsdGVycykpIHtcblx0XHRcdFx0ZmlsdGVycy5wdXNoKC4uLnZhbHVlSGVscEJpbmRpbmdJbmZvLmZpbHRlcnMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZmlsdGVycy5wdXNoKHZhbHVlSGVscEJpbmRpbmdJbmZvLmZpbHRlcnMpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBBZGQgZHJhZnQgZmlsdGVyIGZvciBPRGF0YSBkcmFmdC1lbmFibGVkIGVudGl0aWVzXG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBkcmFmdC1lbmFibGVkIGFuZCBhcHBseSBJc0FjdGl2ZUVudGl0eSA9IHRydWUgZmlsdGVyXG5cdFx0dGhpcy5hZGREcmFmdEZpbHRlcih2YWx1ZUhlbHBCaW5kaW5nSW5mbywgZmlsdGVycywgcGF5bG9hZCwgbWV0YU1vZGVsKTtcblx0XHRyZXR1cm4gZmlsdGVycztcblx0fSxcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gYWRkcyBhIGRyYWZ0IGZpbHRlciBmb3IgT0RhdGEgZHJhZnQtZW5hYmxlZCBlbnRpdGllcy5cblx0ICogQHBhcmFtIHZhbHVlSGVscEJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gYmluZCB0aGUgbGlzdCB0byB0aGUgbW9kZWxcblx0ICogQHBhcmFtIGZpbHRlcnMgVGhlIGV4aXN0aW5nIGZpbHRlcnMgYXJyYXkgdG8gYWRkIHRoZSBkcmFmdCBmaWx0ZXIgdG9cblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBvZiB0aGUgdmFsdWUgaGVscCB0byBjaGVjayBpZiBpdCdzIGEgZHJvcGRvd24gc2NlbmFyaW9cblx0ICogQHBhcmFtIG1ldGFNb2RlbCBUaGUgT0RhdGEgbWV0YSBtb2RlbCB0byByZXNvbHZlIGVudGl0eSBzZXQgZnJvbSBwYXRoXG5cdCAqL1xuXHRhZGREcmFmdEZpbHRlcjogZnVuY3Rpb24gKFxuXHRcdHZhbHVlSGVscEJpbmRpbmdJbmZvOiBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mbyxcblx0XHRmaWx0ZXJzOiBGaWx0ZXJbXSxcblx0XHRwYXlsb2FkPzogVmFsdWVIZWxwUGF5bG9hZCxcblx0XHRtZXRhTW9kZWw/OiBPRGF0YU1ldGFNb2RlbFxuXHQpOiB2b2lkIHtcblx0XHRpZiAodmFsdWVIZWxwQmluZGluZ0luZm8ucGF0aCAmJiBtZXRhTW9kZWwpIHtcblx0XHRcdC8vIEdldCB0aGUgRW50aXR5U2V0IGZyb20gdGhlIHBhdGggdXNpbmcgTWV0YU1vZGVsXG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dCh2YWx1ZUhlbHBCaW5kaW5nSW5mby5wYXRoKTtcblx0XHRcdGNvbnN0IG9iamVjdFBhdGggPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBkcmFmdC1lbmFibGVkIHVzaW5nIE1vZGVsSGVscGVyXG5cdFx0XHQvLyBUaGlzIGNvdmVycyBEcmFmdFJvb3QsIERyYWZ0Tm9kZSwgYW5kIGNvbnRhaW5tZW50IHNjZW5hcmlvc1xuXHRcdFx0Y29uc3QgaXNEcmFmdFN1cHBvcnRlZCA9IE1vZGVsSGVscGVyLmlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkKG9iamVjdFBhdGgpO1xuXG5cdFx0XHQvLyBDaGVjayBpZiBpdCdzIGEgZHJvcGRvd24gc2NlbmFyaW8gKFZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlcylcblx0XHRcdGNvbnN0IGlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzID0gcGF5bG9hZD8uaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMgPz8gZmFsc2U7XG5cblx0XHRcdC8vIE9ubHkgYWRkIGRyYWZ0IGZpbHRlciBpZiBlbnRpdHkgaXMgZHJhZnQtZW5hYmxlZCBhbmQgaXQncyBhIGRyb3Bkb3duIHNjZW5hcmlvXG5cdFx0XHRpZiAoaXNEcmFmdFN1cHBvcnRlZCAmJiBpc1ZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlcykge1xuXHRcdFx0XHQvLyBBZGQgSXNBY3RpdmVFbnRpdHkgZmlsdGVyIGZvciBkcmFmdC1lbmFibGVkIGVudGl0aWVzXG5cdFx0XHRcdC8vIFRoaXMgZmlsdGVyIGVuc3VyZXMgb25seSBhY3RpdmUgKG5vbi1kcmFmdCkgZW50aXRpZXMgYXJlIHNob3duIGluIHZhbHVlIGhlbHAgZHJvcGRvd25zXG5cdFx0XHRcdGZpbHRlcnMucHVzaChcblx0XHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdHBhdGg6IFwiSXNBY3RpdmVFbnRpdHlcIixcblx0XHRcdFx0XHRcdG9wZXJhdG9yOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHR2YWx1ZTE6IHRydWVcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmVzdW1lcyB0aGUgc3VzcGVuZGVkIGxpc3QgYmluZGluZyBhbmQgdGhlbiByZXNldHMgY2hhbmdlcyBvbiBpdC5cblx0ICogQHBhcmFtIHZhbHVlSGVscExpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKi9cblx0cmVzdW1lVmFsdWVMaXN0QmluZGluZ0FuZFJlc2V0Q2hhbmdlczogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscExpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHZhbHVlSGVscExpc3RCaW5kaW5nLmlzU3VzcGVuZGVkKCkpIHtcblx0XHRcdGF3YWl0IHZhbHVlSGVscExpc3RCaW5kaW5nLnJlc3VtZUFzeW5jKCk7XG5cdFx0fVxuXHRcdC8vIGdldCByaWQgb2YgZXhpc3RpbmcgdHJhbnNpZW50IGNvbnRleHRzLlxuXG5cdFx0Ly8gZGVzdHJveWluZyBjYXVzZXMgaXNzdWVzIHNvbWV0aW1lcywgY29udGV4dHMgYXJlIG5vdCBhbHdheXMgYXZhaWxhYmxlIHRvIGRlc3Ryb3kgYnV0IGFwcGVhciBhZnRlcndhcmRzIG1hZ2ljYWxseVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB2YWx1ZUhlbHBMaXN0QmluZGluZy5yZXNldENoYW5nZXMoKTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly9XZSBkbyBub3QgZG8gYW55dGhpbmcgaGVyZSBhcyB3ZSBrbm93IHRoZSBtb2RlbCB3aWxsIGFsd2F5cyB0aHJvdyBhbiBlcnJvciBhbmQgdGhpcyB3aWxsIGZpbGwgdXAgdGhlIGNvbnNvbGUgd2l0aCBlcnJvcnMuXG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcgdGhlIGxpc3QgYmluZGluZy5cblx0ICogQHBhcmFtIHZhbHVlSGVscExpc3RCaW5kaW5nIExpc3QgQmluZGluZ1xuXHQgKiBAcGFyYW0gc29ydGVycyBTb3J0ZXJzIG9mIHRoZSB2YWx1ZSBoZWxwIGxpc3QgYmluZGluZ1xuXHQgKi9cblx0c29ydEFuZEZpbHRlckxpc3RCaW5kaW5nOiBmdW5jdGlvbiAodmFsdWVIZWxwTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIHNvcnRlcnM6IFNvcnRlclR5cGVbXSk6IHZvaWQge1xuXHRcdC8vIEluIG9yZGVyIHRvIG5vdCBzaG93IHRoZSBsaXN0IGF0IGFsbCwgd2UgcGFzcyBhbiBlbXB0eSBmaWx0ZXIgd2hpY2ggd291bGQgcmVuZGVyIGFuIGVtcHR5IGxpc3Rcblx0XHR2YWx1ZUhlbHBMaXN0QmluZGluZy5maWx0ZXIoRmlsdGVyLk5PTkUsIEZpbHRlclR5cGUuQXBwbGljYXRpb24pO1xuXG5cdFx0aWYgKHNvcnRlcnMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBtb2RpZmllZFNvcnRlcnM6IFNvcnRlcltdID0gW107XG5cdFx0XHRzb3J0ZXJzLmZvckVhY2goKHNvcnRlcjogU29ydGVyVHlwZSkgPT5cblx0XHRcdFx0bW9kaWZpZWRTb3J0ZXJzLnB1c2gobmV3IFNvcnRlcihzb3J0ZXIubmFtZSA/PyBcIlwiLCBzb3J0ZXIuZGVzY2VuZGluZywgdGhpcy5nZXRTb3J0ZXJGdW5jdGlvbikpXG5cdFx0XHQpO1xuXHRcdFx0dmFsdWVIZWxwTGlzdEJpbmRpbmcuc29ydChtb2RpZmllZFNvcnRlcnMpO1xuXHRcdH0gZWxzZSB2YWx1ZUhlbHBMaXN0QmluZGluZy5zb3J0KG5ldyBTb3J0ZXIoXCJcIiwgZmFsc2UsIHRoaXMuZ2V0U29ydGVyRnVuY3Rpb24pKTtcblx0fSxcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb25zIGNyZWF0ZXMgdGhlIGZpbHRlcnMgZm9yIGFkZGl0aW9uYWwgdmFsdWVzLlxuXHQgKiBAcGFyYW0gcmV2ZXJzZUFkZGl0aW9uYWxWYWx1ZXMgQXJyYXkgb2YgYWRkaXRpb25hbCB2YWx1ZXMgaW4gcmV2ZXJzZSBvcmRlclxuXHQgKiBAcGFyYW0gZmlsdGVycyBFeGlzdGluZyB2YWx1ZWhlbHAgYmluZGluZyBmaWx0ZXJzXG5cdCAqIEByZXR1cm5zIEFkZGl0aW9uYWwgdmFsdWUgZmlsdGVyc1xuXHQgKi9cblx0Z2V0QWRkaXRpb25hbFZhbHVlRmlsdGVyczogZnVuY3Rpb24gKHJldmVyc2VBZGRpdGlvbmFsVmFsdWVzOiBBZGRpdGlvbmFsVmFsdWVUeXBlW10sIGZpbHRlcnM6IEZpbHRlcltdKTogRmlsdGVyW10ge1xuXHRcdHJldmVyc2VBZGRpdGlvbmFsVmFsdWVzLmZvckVhY2goKGFkZGl0aW9uYWxWYWx1ZSkgPT4ge1xuXHRcdFx0aWYgKGFkZGl0aW9uYWxWYWx1ZS52YWx1ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb25zdCB2YWx1ZXMgPSBhZGRpdGlvbmFsVmFsdWUudmFsdWVzO1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSBhZGRpdGlvbmFsVmFsdWUucHJvcGVydHlQYXRoO1xuXHRcdFx0XHQvLyBhZGQgYWRkaXRpb25hbCB2YWx1ZSBmaWx0ZXJzIHRvIGV4aXN0aW5nIGZpbHRlcnMgZnJvbSB0aGUgYmluZGluZyBpbmZvXG5cdFx0XHRcdHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdC8vIHVwZGF0ZSB0aGUgdmFsdWUgaGVscCBiaW5kaW5nIGluZm8gdG8gZ2V0IGFkZGl0aW9uYWwgdmFsdWVzIGZyb20gdGhlIGJhY2tlbmRcblx0XHRcdFx0XHRmaWx0ZXJzLnB1c2goXG5cdFx0XHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdFx0cGF0aDogcHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTE6IHZhbHVlLFxuXHRcdFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBmaWx0ZXJzO1xuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBhIGNhbGxiYWNrIHRvIHRoZSBjdXN0b20gc29ydGVyLlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IG9mIHRoZSBGaWVsZFxuXHQgKiBAcmV0dXJucyBHcm91cCBrZXkgdGhhdCBjYW4gYmUgdXNlZCBmb3Igc29ydGluZ1xuXHQgKi9cblx0Z2V0U29ydGVyRnVuY3Rpb246IGZ1bmN0aW9uIChjb250ZXh0OiBWNENvbnRleHQpOiBzdHJpbmcge1xuXHRcdC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cblx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUubWFjcm9zXCIpITtcblx0XHQvL2dldCB0aGUgY2xpZW50IHNpZGUgYW5ub3RhdGlvbiB0byBmaWd1cmUgb3V0IHRoZSBncm91cCBrZXlcblx0XHRjb25zdCBncm91cEtleSA9IGNvbnRleHQuZ2V0UHJvcGVydHkoXCJAJGZlLmFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5XCIpIGFzIEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5O1xuXHRcdGlmIChncm91cEtleSA9PT0gQWRkaXRpb25hbFZhbHVlR3JvdXBLZXkucmVjb21tZW5kYXRpb24pIHtcblx0XHRcdHJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiTV9BRERJVElPTkFMVkFMVUVIRUxQRVJfUkVDT01NRU5EQVRJT05TXCIpO1xuXHRcdH0gZWxzZSBpZiAoZ3JvdXBLZXkgPT09IEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5LnJlY2VudFZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIk1fQURESVRJT05BTFZBTFVFSEVMUEVSX1JFQ0VOVFZBTFVFXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIk1fQURESVRJT05BTFZBTFVFSEVMUEVSX09USEVSU1wiKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gY3JlYXRlIHRyYW5zaWVudCBjb250ZXh0cyBvZiB0aGUgdmFsdWUgaGVscCBsaXN0IGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBkaWZmZXJlbnQgdHlwZXMgYWRkaXRpb25hbCB2YWx1ZSBjb250ZXh0IGRhdGEuXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhIFJlY29tbWVuZGF0aW9uIHZhbHVlcyBjb250ZXh0IGRhdGFcblx0ICogQHBhcmFtIHJlY2VudFZhbHVlc0NvbnRleHREYXRhIFJlY2VudCB2YWx1ZXMgY29udGV4dCBkYXRhXG5cdCAqIEBwYXJhbSBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSBPdGhlciB2YWx1ZXMgY29udGV4dCBkYXRhXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBMaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICovXG5cdGNyZWF0ZVRyYW5zaWVudENvbnRleHRzRm9yQWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGE6IGZ1bmN0aW9uIChcblx0XHRyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10sXG5cdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXSxcblx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdLFxuXHRcdHZhbHVlSGVscExpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nXG5cdCk6IHZvaWQge1xuXHRcdHRoaXMuY3JlYXRlR3JvdXBlZFRyYW5zaWVudENvbnRleHRzKG90aGVyc1ZhbHVlc0NvbnRleHREYXRhLCB2YWx1ZUhlbHBMaXN0QmluZGluZywgQWRkaXRpb25hbFZhbHVlR3JvdXBLZXkub3RoZXIpO1xuXHRcdHRoaXMuY3JlYXRlR3JvdXBlZFRyYW5zaWVudENvbnRleHRzKHJlY2VudFZhbHVlc0NvbnRleHREYXRhLCB2YWx1ZUhlbHBMaXN0QmluZGluZywgQWRkaXRpb25hbFZhbHVlR3JvdXBLZXkucmVjZW50VmFsdWUpO1xuXHRcdHRoaXMuY3JlYXRlR3JvdXBlZFRyYW5zaWVudENvbnRleHRzKHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEsIHZhbHVlSGVscExpc3RCaW5kaW5nLCBBZGRpdGlvbmFsVmFsdWVHcm91cEtleS5yZWNvbW1lbmRhdGlvbik7XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gY3JlYXRlIHRyYW5zaWVudCBjb250ZXh0IGZvciB0aGUgZ2l2ZW4gYWRkaXRpb25hbCB2YWx1ZSBjb250ZXh0IGRhdGEuIEl0IGFsc28gYWRkcyBhIGtleSBmb3IgZWFjaCBjb250ZXh0IHdoaWNoIGlzIHVzZWQgdG8gZ3JvdXAgdGhlIG5ld2x5IGNyZWF0ZWQgdHJhbnNpZW50IGNvbnRleHRzIGFjY29yZGluZ2x5LlxuXHQgKiBAcGFyYW0gYWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGEgQWRkaXRpb25hbCB2YWx1ZSBjb250ZXh0IGRhdGFcblx0ICogQHBhcmFtIHZhbHVlSGVscExpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gZ3JvdXBLZXkgS2V5IHdoaWNoIGluZGljYXRlcyB0aGUgZ3JvdXAgb2YgdGhlIGFkZGl0aW9uYWwgdmFsdWUgY29udGV4dCBkYXRhXG5cdCAqL1xuXHRjcmVhdGVHcm91cGVkVHJhbnNpZW50Q29udGV4dHM6IGZ1bmN0aW9uIChcblx0XHRhZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdLFxuXHRcdHZhbHVlSGVscExpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGdyb3VwS2V5OiBBZGRpdGlvbmFsVmFsdWVHcm91cEtleVxuXHQpOiB2b2lkIHtcblx0XHQvLyByZXZlcnNlIG9mIHRoZSBjb250ZXh0IGRhdGEgaXMgcmVxdWlyZWQgc28gdGhhdCB0aGUgY29udGV4dCB3aGljaCBuZWVkcyB0byBiZSBzaG93biBiZWxvdyBpbiB0aGUgbGlzdCBnZXRzIGNyZWF0ZWQgZmlyc3Rcblx0XHRbLi4uYWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGFdLnJldmVyc2UoKS5mb3JFYWNoKGFzeW5jIChjb250ZXh0RGF0YTogRmllbGREYXRhVHlwZSkgPT4ge1xuXHRcdFx0Ly8gZ3JvdXBLZXkgaXMgYWRkZWQgaW4gb3JkZXIgdG8gcHJvcGVybHkgZ3JvdXAgdGhlIHRyYW5zaWVudCBjb250ZXh0cyBhbW9uZ3N0IGFsbCAzIGdyb3Vwc1xuXHRcdFx0Y29udGV4dERhdGFbXCJAJGZlLmFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5XCJdID0gZ3JvdXBLZXk7XG5cdFx0XHRjb25zdCBjb250ZXh0ID0gdmFsdWVIZWxwTGlzdEJpbmRpbmcuY3JlYXRlKGNvbnRleHREYXRhKTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGNvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Ly8gRm9yIHRyYW5zaWVudCBjb250ZXh0cyB0aGUgY2FuY2VsZWQgaXMgc2V0IHRvIHRydWUgYW5kIGZvciBvdGhlciBjYXNlcyBpdCB3aWxsIGJlIGZhbHNlLiBBdGxlYXN0IGluIHJlY29tbWVuZGF0aW9uc1xuXHRcdFx0XHQvLyB1c2UgY2FzZSB3ZSBkbyBub3QgZmFjZSB0aGUgc2NlbmFyaW8gd2hlcmUgY2FuY2VsZWQgaXMgc2V0IHRvIGZhbHNlLiBGb3Igbm93IHdlIGFyZSBqdXN0IGxvZ2dpbmcgdGhlIGVycm9yLlxuXHRcdFx0XHRpZiAoIShlcnJvciBhcyBDb250ZXh0RXJyb3JUeXBlKS5jYW5jZWxlZCkge1xuXHRcdFx0XHRcdExvZy5lcnJvcigoZXJyb3IgYXMgQ29udGV4dEVycm9yVHlwZSkubmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIHJlbGV2YW50IHJlY29tbWVuZGF0aW9ucyBmb3IgdGhlIHZhbHVlbGlzdC5cblx0ICogQHBhcmFtIGRhdGEgT2JqZWN0IGNvbnRhaW5pbmcgcmVjb21tZW5kYXRpb24gbW9kZWwgZGF0YVxuXHQgKiBAcGFyYW0gYmluZGluZ0NvbnRleHQgQmluZGluZyBjb250ZXh0IG9mIHRoZSBGaWVsZFxuXHQgKiBAcGFyYW0gcHJvcGVydHlQYXRoIFByb3BlcnR5IFBhdGggb2YgdGhlIEZpZWxkXG5cdCAqIEBwYXJhbSBiaW5kaW5nUGF0aFxuXHQgKiBAcmV0dXJucyBSZWxldmFudCByZWNvbW1lbmRhdGlvbnMgZm9yIHRoZSB2YWx1ZWxpc3Rcblx0ICovXG5cdGdldFJlbGV2YW50UmVjb21tZW5kYXRpb25zOiBmdW5jdGlvbiAoXG5cdFx0ZGF0YTogSW5Db21wbGV0ZW5lc3NJbmZvVHlwZSB8IG9iamVjdCxcblx0XHRiaW5kaW5nQ29udGV4dDogVjRDb250ZXh0LFxuXHRcdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRcdGJpbmRpbmdQYXRoPzogc3RyaW5nXG5cdCk6IEFycmF5PHN0cmluZyB8IG51bWJlcj4gfCBudWxsIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB2YWx1ZXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4gPSBbXTtcblx0XHRsZXQgcmVsZXZhbnRSZWNvbW1lbmRhdGlvbnM6IEludGVybmFsUHJvcGVydHlBZGRpdGlvbmFsVmFsdWUgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vZ2V0IHRoZSByaWdodCBwcm9wZXJ0eSBwYXRoIGJ5IGVsaW1pbmF0aW5nIHRoZSBzdGFydGluZyAvIGFuZCBhbHNvIG1haW4gZW50aXR5c2V0IG5hbWVcblx0XHRcdHByb3BlcnR5UGF0aCA9IHRoaXMuZ2V0UmVjb21tZW5kYXRpb25Qcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKTtcblx0XHRcdGlmICgoZGF0YSBhcyBSZWNvbW1lbmRhdGlvbkluZm8pLnZlcnNpb24gPT09IDIuMCAmJiBiaW5kaW5nUGF0aCkge1xuXHRcdFx0XHRwcm9wZXJ0eVBhdGggPSBiaW5kaW5nUGF0aDtcblx0XHRcdH1cblx0XHRcdC8vZ2V0IHRoZSByZWNvbW1lbmRhdGlvbnMgYmFzZWQgb24gcHJvcGVydHkgcGF0aCBhbmQgYmluZGluZyBjb250ZXh0IHBhc3NlZFxuXHRcdFx0cmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMgPSB0aGlzLmdldEFkZGl0aW9uYWxWYWx1ZUZyb21Qcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoLCBiaW5kaW5nQ29udGV4dCwgZGF0YSkgYXNcblx0XHRcdFx0fCBJbnRlcm5hbFByb3BlcnR5QWRkaXRpb25hbFZhbHVlXG5cdFx0XHRcdHwgdW5kZWZpbmVkO1xuXHRcdFx0Ly9pZiB3ZSBnZXQgcmVjb21tZW5kYXRpb25zIHRoZW4gcHVzaCB0aGUgdmFsdWVzXG5cdFx0XHRpZiAocmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMgJiYgT2JqZWN0LmtleXMocmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMuYWRkaXRpb25hbFZhbHVlcy5mb3JFYWNoKCh2YWx1ZURhdGE6IFJlY29tbWVuZGF0aW9uVmFsdWVUeXBlKSA9PiB7XG5cdFx0XHRcdFx0dmFsdWVzLnB1c2godmFsdWVEYXRhLnZhbHVlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvL2lmIHJlY29tbWVuZGF0aW9ucyBhcmUgbm90IGZvdW5kIHRoZW4gcmV0dXJuIG51bGxcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdF9jaGVja0ZvcktleXNJblJlY29tbWVuZGF0aW9uczogZnVuY3Rpb24gKGtleVByb3BlcnRpZXM6IEtleVByb3BlcnRpZXNEYXRhVHlwZSwgY29udGV4dERhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBib29sZWFuIHtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBrZXlQcm9wZXJ0aWVzKSB7XG5cdFx0XHRpZiAoa2V5UHJvcGVydGllc1trZXldICE9PSBjb250ZXh0RGF0YVtrZXldKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIHRvIGZldGNoIHRoZSBleGFjdCBvYmplY3QgZnJvbSBhbiBhcnJheSBvZiBvYmplY3RzIHRoYXQgY29udGFpbnMgcmVsZXZhbnQgcmVjb21tZW5kYXRpb25EYXRhIGJhc2VkIG9uIGtleXMuXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbkRhdGEgQXJyYXkgY29udGFpbmluZyBhZGRpdGlvbmFsIHZhbHVlc1xuXHQgKiBAcGFyYW0gYmluZGluZ0NvbnRleHQgQmluZGluZyBjb250ZXh0IG9mIHRoZSBGaWVsZFxuXHQgKiBAcmV0dXJucyBSZWxldmFudCBvYmplY3QgZnJvbSBhbiBhcnJheSBvZiBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgYWRkaXRpb25hbCB2YWx1ZVxuXHQgKi9cblx0Z2V0QWRkaXRpb25hbFZhbHVlRnJvbUtleXM6IGZ1bmN0aW9uIChcblx0XHRyZWNvbW1lbmRhdGlvbkRhdGE6IEFkZGl0aW9uVmFsdWVEZWZpbml0aW9uLFxuXHRcdGJpbmRpbmdDb250ZXh0PzogVjRDb250ZXh0IHwgQ29udGV4dFxuXHQpOiBBZGRpdGlvblZhbHVlRGVmaW5pdGlvbiB7XG5cdFx0Y29uc3QgY29udGV4dERhdGEgPSBiaW5kaW5nQ29udGV4dD8uZ2V0T2JqZWN0KCkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZDtcblx0XHRsZXQgcmVzdWx0OiBBZGRpdGlvblZhbHVlRGVmaW5pdGlvbiA9IHt9O1xuXHRcdC8vbG9vcCB0aHJvdWdoIHRoZSByZWNvbW1lbmRhdGlvbkRhdGEgYW5kIGNoZWNrIGlmIHRoZSBrZXlQcm9wZXJ0aWVzIG1hdGNoIHdpdGggdGhlIGJpbmRpbmcgY29udGV4dCBkYXRhXG5cdFx0aWYgKGJpbmRpbmdDb250ZXh0ICYmIGNvbnRleHREYXRhKSB7XG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShyZWNvbW1lbmRhdGlvbkRhdGEpKSB7XG5cdFx0XHRcdChyZWNvbW1lbmRhdGlvbkRhdGEgYXMgUmVjb21tZW5kYXRpb25EYXRhRm9yTmF2UHJvcGVydHlUeXBlW10pLmZvckVhY2goKHJlY0RhdGEpID0+IHtcblx0XHRcdFx0XHRjb25zdCBrZXlQcm9wZXJ0aWVzID0gcmVjRGF0YS5rZXlQcm9wZXJ0aWVzIGFzIEtleVByb3BlcnRpZXNEYXRhVHlwZTtcblx0XHRcdFx0XHRjb25zdCBhbGxLZXlzTWF0Y2ggPSB0aGlzLl9jaGVja0ZvcktleXNJblJlY29tbWVuZGF0aW9ucyhrZXlQcm9wZXJ0aWVzLCBjb250ZXh0RGF0YSk7XG5cdFx0XHRcdFx0Ly9pZiBldmVyeSBrZXkgdmFsdWUgbWF0Y2hlcyB3aXRoIHRoZSBiaW5kaW5nIGNvbnRleHQgZGF0YSB0aGVuIGFzc2lnbiBpdCB0byByZXN1bHQgd2hpY2ggd2lsbCBiZSByZXR1cm5lZFxuXHRcdFx0XHRcdGlmIChhbGxLZXlzTWF0Y2gpIHtcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHJlY0RhdGEgYXMgQWRkaXRpb25WYWx1ZURlZmluaXRpb247XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSxcblxuXHRfZ2V0UmVjb21tZW5kYXRpb246IGZ1bmN0aW9uIChcblx0XHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0XHRiaW5kaW5nQ29udGV4dDogQ29udGV4dCxcblx0XHRyZWNvbW1lbmRhdGlvbkRhdGE6IEFkZGl0aW9uVmFsdWVEZWZpbml0aW9uXG5cdCk6IEFkZGl0aW9uVmFsdWVEZWZpbml0aW9uIHtcblx0XHQvL2NyZWF0ZSBhIGNvcHkgb2YgdGhlIHJlY29tbWVuZGF0aW9uRGF0YSB0byBzdG9yZSBpdHMgcHJldmlvdXMgdmFsdWUgYXMgaXQgd2lsbCBjaGFuZ2UgYmVjYXVzZSBvZiB0aGUgcmVjdXJzaXZlIGFwcHJvYWNoXG5cdFx0bGV0IG9sZERhdGEgPSBPYmplY3QuYXNzaWduKHJlY29tbWVuZGF0aW9uRGF0YSwge30pO1xuXHRcdC8vY2hlY2sgaWYgcHJvcGVydHkgcGF0aCBleGlzdHMgb24gdGhlIHJlY29tbWVuZGF0aW9uRGF0YSBvYmplY3QgYW5kIGlmIHNvIHRoZW4gcmV0dXJuIHRoZSBvYmplY3QgcG9pbnRpbmcgdG8gdGhlIHByb3BlcnR5IHBhdGhcblx0XHRpZiAoT2JqZWN0LmtleXMocmVjb21tZW5kYXRpb25EYXRhKS5pbmNsdWRlcyhwcm9wZXJ0eVBhdGgpKSB7XG5cdFx0XHRyZXR1cm4gKHJlY29tbWVuZGF0aW9uRGF0YSBhcyBJbkNvbXBsZXRlbmVzc0luZm9UeXBlKVtwcm9wZXJ0eVBhdGhdIGFzIEFkZGl0aW9uVmFsdWVEZWZpbml0aW9uO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvL2lmIHByb3BlcnR5IHBhdGggaXMgbm90IHByZXNlbnQgdGhlbiBjaGVjayBpZiBpdCBpcyAxOm4gbWFwcGluZyBhbmQgd2UgbmVlZCB0byBkbyBhIHJlY3Vyc2l2ZSBhcHByb2FjaCB0byBsYW5kIG9uIHRoZSBleGFjdCBvYmplY3QgY29udGFpbmluZyB0aGUgcmVsZXZhbnQgcmVjb21tZW5kYXRpb25zXG5cdFx0XHQvL2NvbnRpbnVlIHRoZSB3aGlsZSBsb29wIHRpbGwgdGhlIHByb3BlcnR5IHBhdGggaXMgZm91bmQgaW4gdGhlIHByZXZpb3VzIHJlY29tbWVuZGF0aW9uRGF0YVxuXHRcdFx0d2hpbGUgKE9iamVjdC5rZXlzKG9sZERhdGEpLmxlbmd0aCA+IDAgJiYgIU9iamVjdC5rZXlzKG9sZERhdGEpLmluY2x1ZGVzKHByb3BlcnR5UGF0aCkpIHtcblx0XHRcdFx0Ly8gYXMgaXQgbWlnaHQgYmUgMTpuIG1hcHBpbmcgc28gZmlyc3Qgc2VwZXJhdGUgdGhlIG5hdnByb3AgbmFtZSBhbmQgYWN0dWFsIHByb3AgbmFtZSB0byBtYWtlIHN1cmUgd2UgZmluZCB0aGUgbmF2cHJvcCBmaXJzdCBhbmQgdGhlbiBmcm9tIGl0cyBwb2ludGluZyBvYmplY3Qgd2UgZmluZCB0aGUgcHJvcGVydHkgcGF0aFxuXHRcdFx0XHQvL2VnOiBfSXRlbS9NYXRlcmlhbCB3aWxsIGJlIGZpcnN0IGRpdmlkZWQgaW50byBfSXRlbSBhbmQgd2Ugc2VhcmNoIGZvciBpdCBhbmQgdGhlbiBmcm9tIGl0cyByZWxldmFudCBvYmplY3Qgd2Ugc2VhcmNoIGZvciBNYXRlcmlhbFxuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGhzID0gcHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdFx0aWYgKHByb3BlcnR5UGF0aHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdC8vZ2V0dGluZyB0aGUgbmF2cHJvcCBwYXRoXG5cdFx0XHRcdFx0Y29uc3QgbmF2UHJvcFBhdGggPSBwcm9wZXJ0eVBhdGhzWzBdO1xuXHRcdFx0XHRcdC8vcmVtb3ZpbmcgdGhlIG5hdnByb3AgcGF0aCBmcm9tIHByb3BlcnR5cGF0aHMgc28gdGhhdCB3ZSBvbmx5IGNoZWNrIGZvciBhY3R1YWwgcHJvcGVydHkgcGF0aFxuXHRcdFx0XHRcdHByb3BlcnR5UGF0aHMuc3BsaWNlKDAsIDEpO1xuXHRcdFx0XHRcdHByb3BlcnR5UGF0aCA9IHByb3BlcnR5UGF0aHMuam9pbihcIi9cIik7XG5cdFx0XHRcdFx0Ly91c2luZyBnZXRBZGRpdGlvbmFsVmFsdWVGcm9tUHJvcGVydHlQYXRoIGFuZCBwYXNzaW5nIG5hdlByb3BQYXRoIHdlIGdldCB0aGUgZXhhY3QgYXJyYXkgb2Ygb2JqZWN0cyBwb2ludGluZyB0byB0aGUgbmF2UHJvcFxuXHRcdFx0XHRcdHJlY29tbWVuZGF0aW9uRGF0YSA9IHRoaXMuZ2V0QWRkaXRpb25hbFZhbHVlRnJvbVByb3BlcnR5UGF0aChcblx0XHRcdFx0XHRcdG5hdlByb3BQYXRoLFxuXHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHQsXG5cdFx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbkRhdGFcblx0XHRcdFx0XHQpIGFzIFJlY29tbWVuZGF0aW9uRGF0YUZvck5hdlByb3BlcnR5VHlwZVtdO1xuXHRcdFx0XHRcdC8vbm8gcGFzcyB0aGUgYXJyYXkgb2Ygb2JqZWN0cyBvZiBuYXZQcm9wIHRvIGdldEFkZGl0aW9uYWxWYWx1ZUZyb21LZXlzIGFuZCBnZXQgdGhlIGV4YWN0IG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSByZWNvbW1lbmRhdGlvbkRhdGEgYmFzZWQgb24ga2V5c1xuXHRcdFx0XHRcdHJlY29tbWVuZGF0aW9uRGF0YSA9IHRoaXMuZ2V0QWRkaXRpb25hbFZhbHVlRnJvbUtleXMocmVjb21tZW5kYXRpb25EYXRhLCBiaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKHJlY29tbWVuZGF0aW9uRGF0YSkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly9zZXQgdGhlIHJlY29tbWVuZGF0aW9uRGF0YSB0byBvbGREYXRhIGJlZm9yZSBhc3NpZ25pbmcgdGhlIG5ldyB2YWx1ZSB0byBpdFxuXHRcdFx0XHRcdFx0b2xkRGF0YSA9IE9iamVjdC5hc3NpZ24ocmVjb21tZW5kYXRpb25EYXRhLCB7fSk7XG5cdFx0XHRcdFx0XHQvL2hlcmUgd2UgY2hlY2sgZm9yIHRoZSBhY3R1YWwgcHJvcGVydHkgcGF0aCBmcm9tIHRoZSBvYmplY3Qgd2UgZm91bmQgZnJvbSBnZXRBZGRpdGlvbmFsVmFsdWVGcm9tS2V5c1xuXHRcdFx0XHRcdFx0Ly9lZzogTWF0ZXJpYWwgY2FuIGJlIGZvdW5kIGluIHRoZSBvYmplY3Qgd2hpY2ggaXMgcGFydCBvZiBhcnJheSBvZiBvYmplY3RzIG9mIF9JdGVtXG5cdFx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbkRhdGEgPSB0aGlzLmdldEFkZGl0aW9uYWxWYWx1ZUZyb21Qcm9wZXJ0eVBhdGgoXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHQsXG5cdFx0XHRcdFx0XHRcdHJlY29tbWVuZGF0aW9uRGF0YVxuXHRcdFx0XHRcdFx0KSBhcyBBZGRpdGlvblZhbHVlRGVmaW5pdGlvbjtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4ge307XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiByZWNvbW1lbmRhdGlvbkRhdGE7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIHRoZSBhZGRpdGlvbmFsIHZhbHVlIGJhc2VkIG9uIHByb3BlcnR5IHBhdGggYW5kIGJpbmRpbmcgY29udGV4dCBwYXNzZWQuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggUHJvcGVydHkgcGF0aCBvZiB0aGUgZmllbGRcblx0ICogQHBhcmFtIGJpbmRpbmdDb250ZXh0IEJpbmRpbmcgY29udGV4dCBvZiB0aGUgZmllbGRcblx0ICogQHBhcmFtIHJlY29tbWVuZGF0aW9uRGF0YSBPYmplY3QgY29udGFpbmluZyBhZGRpdGlvbmFsIHZhbHVlXG5cdCAqIEByZXR1cm5zIEFkZGl0aW9uYWwgdmFsdWUgYmFzZWQgb24gcHJvcGVydHkgcGF0aCBhbmQgYmluZGluZyBjb250ZXh0IHBhc3NlZFxuXHQgKi9cblx0Z2V0QWRkaXRpb25hbFZhbHVlRnJvbVByb3BlcnR5UGF0aDogZnVuY3Rpb24gKFxuXHRcdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRcdGJpbmRpbmdDb250ZXh0OiBWNENvbnRleHQgfCBDb250ZXh0LFxuXHRcdHJlY29tbWVuZGF0aW9uRGF0YT86IEFkZGl0aW9uVmFsdWVEZWZpbml0aW9uIHwgUmVjb21tZW5kYXRpb25JbmZvXG5cdCk6IEFkZGl0aW9uVmFsdWVEZWZpbml0aW9uIHwgU3RhbmRhcmRSZWNvbW1lbmRhdGlvbkRhdGFUeXBlIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoKHJlY29tbWVuZGF0aW9uRGF0YSBhcyBSZWNvbW1lbmRhdGlvbkluZm8pLnZlcnNpb24gPT09IDIpIHtcblx0XHRcdHJldHVybiBzdGFuZGFyZFJlY29tbWVuZGF0aW9uSGVscGVyLmdldFN0YW5kYXJkUmVjb21tZW5kYXRpb25zKFxuXHRcdFx0XHRiaW5kaW5nQ29udGV4dCxcblx0XHRcdFx0cHJvcGVydHlQYXRoLFxuXHRcdFx0XHRyZWNvbW1lbmRhdGlvbkRhdGEgYXMgUmVjb21tZW5kYXRpb25JbmZvXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRpZiAocmVjb21tZW5kYXRpb25EYXRhKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZ2V0UmVjb21tZW5kYXRpb24ocHJvcGVydHlQYXRoLCBiaW5kaW5nQ29udGV4dCwgcmVjb21tZW5kYXRpb25EYXRhKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHByb3BlcnR5IHBhdGggb2YgdGhlIGZpZWxkIGJ5IHJlbW92aW5nIHRoZSBsZWFkaW5nICcvJyBhbmQgbWFpbiBlbnRpdHkgc2V0IG5hbWUuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggUHJvcGVydHkgUGF0aCBvZiB0aGUgRmllbGRcblx0ICogQHJldHVybnMgUHJvcGVydHkgcGF0aCBvZiB0aGUgZmllbGQgYnkgcmVtb3ZpbmcgdGhlIGxlYWRpbmcgJy8nIGFuZCBtYWluIGVudGl0eSBzZXQgbmFtZS5cblx0ICovXG5cdGdldFJlY29tbWVuZGF0aW9uUHJvcGVydHlQYXRoOiBmdW5jdGlvbiAocHJvcGVydHlQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdC8vRmlyc3Qgd2Ugc3BsaXQgdGhlIHByb3BlcnR5IHBhdGggYmFzZWQgb24gL1xuXHRcdGNvbnN0IHByb3BlcnR5UGF0aHMgPSBwcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdC8vTm93IHJlbW92ZSB0aGUgZmlyc3QgdHdvIGVsZW1lbnRzIG9mIHRoZSBhcnJheS4gQXMgZmlyc3QgZWxlbWVudCB3aWxsIGFsd2F5cyBiZSAnJyBhbmQgc2Vjb25kIGVsZW1lbnQgd2lsbCBiZSBtYWluIGVudGl0eSBzZXQgbmFtZVxuXHRcdHByb3BlcnR5UGF0aHMuc3BsaWNlKDAsIDIpO1xuXHRcdC8vTm93IGpvaW4gdGhlIHJlbWFpbmluZyBlbGVtZW50cyB0byBjcmVhdGUgYSBuZXcgcHJvcGVydHkgcGF0aCBhbmQgcmV0dXJuIGl0XG5cdFx0cmV0dXJuIHByb3BlcnR5UGF0aHMuam9pbihcIi9cIik7XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZmlsdGVyIE90aGVycyB2YWx1ZXMgY29udGV4dCBkYXRhIGFuZCByZW1vdmUgdmFsdWVzIHdoaWNoIGFyZSBhbHNvIHByZXNlbnQgaW4gUmVjZW50bHkgVXNlZCBhbmQgUmVjb21tZW5kYXRpb24gZ3JvdXAuXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhIFJlY29tbWVuZGF0aW9uIHZhbHVlcyBjb250ZXh0IGRhdGFcblx0ICogQHBhcmFtIHJlY2VudFZhbHVlc0NvbnRleHREYXRhIFJlY2VudCB2YWx1ZXMgY29udGV4dCBkYXRhXG5cdCAqIEBwYXJhbSBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSBPdGhlcnMgdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwS2V5cyBWYWx1ZUxpc3RQcm9wZXJ0eSBvZiB0aGUgcGF5bG9hZFxuXHQgKiBAcmV0dXJucyBPdGhlcnMgdmFsdWVzIGNvbnRleHQgZGF0YS5cblx0ICovXG5cdGdldFJlbGV2YW50T3RoZXJzVmFsdWVzQ29udGV4dERhdGE6IGZ1bmN0aW9uIChcblx0XHRyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10sXG5cdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXSxcblx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdLFxuXHRcdHZhbHVlSGVscEtleXM6IHN0cmluZ1tdXG5cdCk6IEZpZWxkRGF0YVR5cGVbXSB7XG5cdFx0cmV0dXJuIG90aGVyc1ZhbHVlc0NvbnRleHREYXRhLmZpbHRlcihcblx0XHRcdChjb250ZXh0RGF0YSkgPT5cblx0XHRcdFx0IXRoaXMuY2hlY2tWYWx1ZXNNYXRjaChjb250ZXh0RGF0YSwgcmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSwgdmFsdWVIZWxwS2V5cykgJiZcblx0XHRcdFx0IXRoaXMuY2hlY2tWYWx1ZXNNYXRjaChjb250ZXh0RGF0YSwgcmVjZW50VmFsdWVzQ29udGV4dERhdGEsIHZhbHVlSGVscEtleXMpXG5cdFx0KTtcblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIHJlY2VudCB2YWx1ZXMgbWF0Y2hlcyBlaXRoZXIgd2l0aCB0aGUgc2VhcmNoIHRlcm0gb3Igd2l0aCB0aGUgb3RoZXJzIHZhbHVlcy5cblx0ICogQHBhcmFtIG90aGVyc1ZhbHVlc0NvbnRleHREYXRhIE90aGVycyB2YWx1ZXMgY29udGV4dCBkYXRhXG5cdCAqIEBwYXJhbSByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSBSZWNlbnQgdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwS2V5cyBWYWx1ZUxpc3RQcm9wZXJ0eSBvZiB0aGUgcGF5bG9hZFxuXHQgKiBAcGFyYW0gc2VhcmNoVGVybSBTZWFyY2ggdGVybSBlbnRlcmVkIGJ5IHRoZSB1c2VyXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBCaW5kaW5nIGluZm8gb2JqZWN0IG9mIHRoZSB2YWx1ZSBoZWxwXG5cdCAqIEByZXR1cm5zIFJlY2VudCB2YWx1ZXMgY29udGV4dCBkYXRhIHdoaWNoIG5lZWRzIHRvIGJlIHNob3cgaW4gdGhlIFJlY2VudGx5IFVzZWQgZ3JvdXAgaW4gdGhlIHR5cGUgYWhlYWQgc3VnZ2VzdGlvbiBsaXN0LlxuXHQgKi9cblx0Z2V0UmVsZXZhbnRSZWNlbnRWYWx1ZXNDb250ZXh0RGF0YTogZnVuY3Rpb24gKFxuXHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10sXG5cdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXSxcblx0XHR2YWx1ZUhlbHBLZXlzOiBzdHJpbmdbXSxcblx0XHRzZWFyY2hUZXJtOiBzdHJpbmcsXG5cdFx0YmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvXG5cdCk6IEZpZWxkRGF0YVR5cGVbXSB7XG5cdFx0Ly8gZmlsdGVyIG91dCByZWNlbnQgdmFsdWUgYmFzZWQgb24gZXhpc3RpbmcgdmFsdWUgaGVscCBmaWx0ZXJzXG5cdFx0Y29uc3QgcmVjZW50VmFsdWVzTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHsgcmVjZW50VmFsdWVzQ29udGV4dERhdGEgfSk7XG5cdFx0Y29uc3QgcmVjZW50VmFsdWVzTGlzdCA9IHJlY2VudFZhbHVlc01vZGVsLmJpbmRMaXN0KFxuXHRcdFx0XCIvcmVjZW50VmFsdWVzQ29udGV4dERhdGFcIixcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHRoaXMuZ2V0VmFsdWVIZWxwQmluZGluZ0ZpbHRlcnMoYmluZGluZ0luZm8pXG5cdFx0KTtcblx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSA9IHJlY2VudFZhbHVlc0xpc3QuZ2V0QWxsQ3VycmVudENvbnRleHRzKCkubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldE9iamVjdCgpIGFzIEZpZWxkRGF0YVR5cGUpO1xuXG5cdFx0Ly8gY29uc2lkZXIgb25seSB0aG9zZSByZWNlbnQgdmFsdWVzIHdoaWNoIGVpdGhlciBtYXRjaGVzIHdpdGggdGhlIHNlYXJjaCB0ZXJtIG9yIHdpdGggdGhlIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gYmFja2VuZCBmb3IgdGhlIE90aGVycyBncm91cC5cblx0XHQvLyBCb3RoIHRoZSBmaWx0ZXJzIG5lZWRzIHRvIGJlIGFwcGxpZWQgc28gdGhhdCBzbyB0aGF0IG9yZGVyIG9mIHRoZSByZWNlbnQgdmFsdWVzIGRvZXMgbm90IGNoYW5nZSwgd2hpY2ggaXMgaW1wb3J0YW50IGZvciB0aGUgb3JkZXIgaW4gd2hpY2hcblx0XHQvLyB0aGUgZGF0YSB3b3VsZCBiZSBzaG93biBpbiB0aGUgdHlwZSBhaGVhZCBzdWdnZXN0aW9uIGxpc3QuXG5cdFx0cmV0dXJuIHJlY2VudFZhbHVlc0NvbnRleHREYXRhLmZpbHRlcigocmVjZW50VmFsdWVDb250ZXh0RGF0YSkgPT5cblx0XHRcdHRoaXMuZmlsdGVyUmVjZW50VmFsdWVzQ29udGV4dERhdGEocmVjZW50VmFsdWVDb250ZXh0RGF0YSwgc2VhcmNoVGVybSwgdmFsdWVIZWxwS2V5cywgb3RoZXJzVmFsdWVzQ29udGV4dERhdGEpXG5cdFx0KTtcblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIHRoZSBnaXZlbiByZWNlbnQgdmFsdWUgY29udGV4dCBkYXRhIG1hdGNoZXMgd2l0aCB0aGUgZ2l2ZW4gc2VhcmNoIHRlcm0gb3IgdGhlIG90aGVycyB2YWx1ZXMuXG5cdCAqIEBwYXJhbSByZWNlbnRWYWx1ZUNvbnRleHREYXRhIFJlY2VudCB2YWx1ZXMgY29udGV4dCBkYXRhXG5cdCAqIEBwYXJhbSBzZWFyY2hUZXJtIFNlYXJjaCB0ZXJtIGVudGVyZWQgYnkgdGhlIHVzZXJcblx0ICogQHBhcmFtIHZhbHVlSGVscEtleXMgVmFsdWVMaXN0UHJvcGVydHkgb2YgdGhlIHBheWxvYWRcblx0ICogQHBhcmFtIG90aGVyc1ZhbHVlc0NvbnRleHREYXRhIE90aGVycyB2YWx1ZXMgY29udGV4dCBkYXRhXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGdpdmVuIHJlY2VudCB2YWx1ZSBjb250ZXh0IHNhdGlzZmllcyB0aGUgZmlsdGVyIGNvbmRpdGlvbi5cblx0ICovXG5cdGZpbHRlclJlY2VudFZhbHVlc0NvbnRleHREYXRhOiBmdW5jdGlvbiAoXG5cdFx0cmVjZW50VmFsdWVDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZSxcblx0XHRzZWFyY2hUZXJtOiBzdHJpbmcsXG5cdFx0dmFsdWVIZWxwS2V5czogc3RyaW5nW10sXG5cdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXVxuXHQpOiBib29sZWFuIHtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiByZWNlbnRWYWx1ZUNvbnRleHREYXRhKSB7XG5cdFx0XHRpZiAodHlwZW9mIHJlY2VudFZhbHVlQ29udGV4dERhdGFba2V5XSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dGhpcy5maWx0ZXJSZWNlbnRWYWx1ZXNDb250ZXh0RGF0YShcblx0XHRcdFx0XHRcdHJlY2VudFZhbHVlQ29udGV4dERhdGFba2V5XSBhcyBGaWVsZERhdGFUeXBlLFxuXHRcdFx0XHRcdFx0c2VhcmNoVGVybSxcblx0XHRcdFx0XHRcdHZhbHVlSGVscEtleXMsXG5cdFx0XHRcdFx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIHJlY2VudFZhbHVlQ29udGV4dERhdGFba2V5XSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0KCFzZWFyY2hUZXJtICYmIG90aGVyc1ZhbHVlc0NvbnRleHREYXRhLmxlbmd0aCA9PT0gMCkgfHwgLy8gQ2FzZSB3aGVyZSBmb2N1cyBpcyBqdXN0IHNldCB0byB0aGUgdmFsdWUgaGVscCBmaWVsZFxuXHRcdFx0XHRcdChyZWNlbnRWYWx1ZUNvbnRleHREYXRhW2tleV0gYXMgc3RyaW5nKS5pbmNsdWRlcyhzZWFyY2hUZXJtKSB8fFxuXHRcdFx0XHRcdCh2YWx1ZUhlbHBLZXlzLmluY2x1ZGVzKGtleSkgJiYgdGhpcy5jaGVja1ZhbHVlc01hdGNoKHJlY2VudFZhbHVlQ29udGV4dERhdGEsIG90aGVyc1ZhbHVlc0NvbnRleHREYXRhLCB2YWx1ZUhlbHBLZXlzKSlcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIGtleXMgaW4gY29udGV4dERhdGFUb0JlTWF0Y2hlZCBtYXRjaCB3aXRoIGFueSBvYmplY3QgaW4gY29udGV4dERhdGFMaXN0LlxuXHQgKiBAcGFyYW0gY29udGV4dERhdGFUb0JlTWF0Y2hlZCBUaGUgY29udGV4dCBkYXRhIG9iamVjdCB0byBjb21wYXJlXG5cdCAqIEBwYXJhbSBjb250ZXh0RGF0YUxpc3QgVGhlIGFycmF5IG9mIGNvbnRleHQgZGF0YSBvYmplY3RzIHRvIGNvbXBhcmUgYWdhaW5zdFxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwS2V5cyBUaGUga2V5cyB0byBjb21wYXJlIGZyb20gY29udGV4dERhdGFUb0JlTWF0Y2hlZCB3aXRoIGNvbnRleHREYXRhTGlzdCBvYmplY3RzXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiBhbnkgb2JqZWN0IGluIGNvbnRleHREYXRhTGlzdCBtYXRjaGVzIHRoZSB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBrZXlzIGluIGNvbnRleHREYXRhVG9CZU1hdGNoZWQsIG90aGVyd2lzZSBmYWxzZS5cblx0ICovXG5cdGNoZWNrVmFsdWVzTWF0Y2g6IGZ1bmN0aW9uIChjb250ZXh0RGF0YVRvQmVNYXRjaGVkOiBGaWVsZERhdGFUeXBlLCBjb250ZXh0RGF0YUxpc3Q6IEZpZWxkRGF0YVR5cGVbXSwgdmFsdWVIZWxwS2V5czogc3RyaW5nW10pOiBib29sZWFuIHtcblx0XHRmb3IgKGNvbnN0IG9iaiBvZiBjb250ZXh0RGF0YUxpc3QpIHtcblx0XHRcdGxldCBtYXRjaCA9IHRydWU7XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBvZiB2YWx1ZUhlbHBLZXlzKSB7XG5cdFx0XHRcdC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBvZiB0aGUga2V5IGluIHJlY2VudFZhbHVlc0NvbnRleHREYXRhXG5cdFx0XHRcdC8vIG1hdGNoZXMgdGhlIHZhbHVlIG9mIHRoZSBrZXkgaW4gdGhlIGN1cnJlbnQgb2JqZWN0IGZyb20gb3RoZXJzVmFsdWVzQ29udGV4dERhdGFcblx0XHRcdFx0aWYgKGNvbnRleHREYXRhVG9CZU1hdGNoZWRba2V5XSAhPT0gb2JqW2tleV0pIHtcblx0XHRcdFx0XHRtYXRjaCA9IGZhbHNlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAobWF0Y2gpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIHJlYXJyYW5nZSB0aGUgZ2l2ZW4gYWRkaXRpb25hbCB2YWx1ZSBjb250ZXh0IGRhdGEgYXMgcGVyIHRoZSBjaHJvbm9sb2dpY2FsIG9yZGVyIG9mIHRoZSBnaXZlbiBhZGRpdGlvbmFsIHZhbHVlcy5cblx0ICogVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB0aGUgcmVjb21tZW5kYXRpb24gZGF0YSBmZXRjaGVkIGZyb20gYmFja2VuZCBhcmUgc2hvd24gaW4gdGhlIHNhbWUgb3JkZXIgb2YgcmVjb21tZW5kYXRpb24gdmFsdWVzIGZldGNoZWQgZnJvbSByZWNvbW1lbmRhdGlvbiBzZXJ2aWNlLlxuXHQgKiBAcGFyYW0gcmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSBSZWNvbW1lbmRhdGlvbiB2YWx1ZXMgY29udGV4dCBkYXRhXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvblZhbHVlcyBSZWNvbW1lbmRhdGlvbiB2YWx1ZXNcblx0ICogQHBhcmFtIHZhbHVlTGlzdFByb3BlcnR5IFZhbHVlIGxpc3QgcHJvcGVydHkgb2YgdGhlIHZhbHVlIGhlbHBcblx0ICogQHJldHVybnMgUmVjb21tZW5kYXRpb24gdmFsdWVzIGNvbnRleHQgZGF0YSBpbiB0aGUgY29ycmVjdCBvcmRlci5cblx0ICovXG5cdGdldFJlbGV2YW50UmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YTogZnVuY3Rpb24gKFxuXHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXSxcblx0XHRyZWNvbW1lbmRhdGlvblZhbHVlczogKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pW10gPSBbXSxcblx0XHR2YWx1ZUxpc3RQcm9wZXJ0eTogc3RyaW5nXG5cdCk6IEZpZWxkRGF0YVR5cGVbXSB7XG5cdFx0Y29uc3QgcmVsZXZhbnRSZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10gPSBbXTtcblx0XHRyZWNvbW1lbmRhdGlvblZhbHVlcy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuXHRcdFx0Y29uc3QgZm91bmRPYmplY3QgPSByZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLmZpbmQoKGNvbnRleHREYXRhKSA9PiBjb250ZXh0RGF0YVt2YWx1ZUxpc3RQcm9wZXJ0eV0gPT09IHZhbHVlKTtcblx0XHRcdGlmIChmb3VuZE9iamVjdCkge1xuXHRcdFx0XHRyZWxldmFudFJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEucHVzaChmb3VuZE9iamVjdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gcmVsZXZhbnRSZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIG1ha2UgYmF0Y2ggY2FsbHMgdG8gc3VwcG9ydCBwYWdpbmF0aW9uLlxuXHQgKiBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IHRoZSBhZGRpdGlvbmFsIGRhdGEgZmV0Y2hlZCBmcm9tIHRoZSBiYWNrZW5kIGlzIGRpc3BsYXllZCBpbiB0aGUgY29ycmVjdCBvcmRlci5cblx0ICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IG9iamVjdCB0aGF0IGNvbnNpc3RzIG9mIGFuIElELCBzb3VyY2UsIGFuZCBhIHBhcmFtZXRlciBtYXAuXG5cdCAqL1xuXHR1cGRhdGVGaW5pc2hlZDogYXN5bmMgZnVuY3Rpb24gbmFtZShldmVudDogVUk1RXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBzb3VyY2UgPSBldmVudC5nZXRTb3VyY2UoKSBhcyB7IHNvdXJjZT86IEV2ZW50UHJvdmlkZXIgfSBhcyBNVGFibGU7XG5cdFx0Y29uc3QgdGFibGVCaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZCB8IG51bGwgPSBzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSxcblx0XHRcdGFsbExpc3RCaW5kaW5nID0gdGFibGVCaW5kaW5nQ29udGV4dD8uZ2V0UHJvcGVydHkoXCJhbGxMaXN0QmluZGluZ1wiKSBhcyBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHsgYWN0dWFsLCB0b3RhbCwgcmVhc29uIH0gPSBldmVudC5nZXRQYXJhbWV0ZXJzKCkgYXMgeyBhY3R1YWw6IG51bWJlcjsgdG90YWw6IG51bWJlcjsgcmVhc29uOiBzdHJpbmcgfTtcblx0XHQvLyBhcyB1c2VyIHNjcm9sbHMgZG93biBhbmQgb25jZSB3ZSByZWFjaCBlbmQgb2YgdGhlIGxpc3QsIHdlIGZldGNoIHRoZSBuZXh0IHNldCBvZiBkYXRhIGZyb20gdGhlIGJhY2tlbmRcblx0XHRpZiAoYWxsTGlzdEJpbmRpbmcgJiYgcmVhc29uID09PSBcIkdyb3dpbmdcIiAmJiBhY3R1YWwgPT09IHRvdGFsKSB7XG5cdFx0XHRjb25zdCBwYWdpbmF0aW9uRGF0YSA9IGF3YWl0IGFsbExpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cyh0b3RhbCwgMTAwKSxcblx0XHRcdFx0YWRkaXRpb25hbERhdGEgPSBwYWdpbmF0aW9uRGF0YS5tYXAoKGRhdGE6IFY0Q29udGV4dCkgPT4gZGF0YS5nZXRPYmplY3QoKSBhcyBGaWVsZERhdGFUeXBlKTtcblx0XHRcdGFkZGl0aW9uYWxEYXRhLmZvckVhY2goYXN5bmMgKGNvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHQgPSAoc291cmNlLmdldEJpbmRpbmcoXCJpdGVtc1wiKSBhcyBPRGF0YUxpc3RCaW5kaW5nKS5jcmVhdGUoY29udGV4dERhdGEsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0YXdhaXQgY29udGV4dC5jcmVhdGVkKCk7XG5cdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0aWYgKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoKGVycm9yIGFzIENvbnRleHRFcnJvclR5cGUpLm5hbWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgcHJvcGVydHkgcGF0aCB0byB0aGUgYWN0aXZlIHJlY29tbWVuZGF0aW9ucyBmb3IgYSBnaXZlbiBjb250ZXh0IHBhdGggaW4gdGhlIGxvY2FsQW5ub3RhdGlvbk1vZGVsLlxuXHQgKiBAcGFyYW0gY29udGV4dCBCaW5kaW5nIGNvbnRleHQgb2YgdGhlIGZpZWxkXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggUHJvcGVydHkgcGF0aCB0byBhZGQgdG8gYWN0aXZlIHJlY29tbWVuZGF0aW9uc1xuXHQgKi9cblx0YWRkQWN0aXZlUmVjb21tZW5kYXRpb246IGZ1bmN0aW9uIChjb250ZXh0OiBWNENvbnRleHQgfCBDb250ZXh0LCBwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IG1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWw7XG5cdFx0Y29uc3QgbG9jYWxBbm5vdGF0aW9uTW9kZWwgPSBtb2RlbC5nZXRMb2NhbEFubm90YXRpb25Nb2RlbCgpO1xuXG5cdFx0Y29uc3QgY29udGV4dFBhdGggPSBjb250ZXh0LmdldFBhdGgoKTtcblx0XHRjb25zdCBhY3RpdmVSZWNvbW1lbmRhdGlvbnMgPVxuXHRcdFx0KGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldFByb3BlcnR5KFwiL2FjdGl2ZVJlY29tbWVuZGF0aW9uc1wiKSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4gfCBudWxsKSA/PyB7fTtcblxuXHRcdC8vIEluaXRpYWxpemUgYXJyYXkgZm9yIHRoaXMgY29udGV4dCBwYXRoIGlmIGl0IGRvZXNuJ3QgZXhpc3Rcblx0XHRsZXQgZXhpc3RpbmdQYXRocyA9IGFjdGl2ZVJlY29tbWVuZGF0aW9uc1tjb250ZXh0UGF0aF07XG5cdFx0aWYgKCFleGlzdGluZ1BhdGhzKSB7XG5cdFx0XHRleGlzdGluZ1BhdGhzID0gW107XG5cdFx0XHRhY3RpdmVSZWNvbW1lbmRhdGlvbnNbY29udGV4dFBhdGhdID0gZXhpc3RpbmdQYXRocztcblx0XHR9XG5cblx0XHQvLyBBZGQgcHJvcGVydHkgcGF0aCBpZiBub3QgYWxyZWFkeSBwcmVzZW50XG5cdFx0aWYgKCFleGlzdGluZ1BhdGhzLmluY2x1ZGVzKHByb3BlcnR5UGF0aCkpIHtcblx0XHRcdGV4aXN0aW5nUGF0aHMucHVzaChwcm9wZXJ0eVBhdGgpO1xuXHRcdFx0bG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkoXCIvYWN0aXZlUmVjb21tZW5kYXRpb25zXCIsIGFjdGl2ZVJlY29tbWVuZGF0aW9ucyk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGEgcHJvcGVydHkgcGF0aCBmcm9tIHRoZSBhY3RpdmUgcmVjb21tZW5kYXRpb25zIGZvciBhIGdpdmVuIGNvbnRleHQgcGF0aCBpbiB0aGUgbG9jYWxBbm5vdGF0aW9uTW9kZWwuXG5cdCAqIEBwYXJhbSBjb250ZXh0IEJpbmRpbmcgY29udGV4dCBvZiB0aGUgZmllbGRcblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aCBQcm9wZXJ0eSBwYXRoIHRvIHJlbW92ZSBmcm9tIGFjdGl2ZSByZWNvbW1lbmRhdGlvbnNcblx0ICovXG5cdHJlbW92ZUFjdGl2ZVJlY29tbWVuZGF0aW9uOiBmdW5jdGlvbiAoY29udGV4dDogVjRDb250ZXh0IHwgQ29udGV4dCwgcHJvcGVydHlQYXRoOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXHRcdGNvbnN0IGxvY2FsQW5ub3RhdGlvbk1vZGVsID0gbW9kZWwuZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwoKTtcblxuXHRcdGNvbnN0IGNvbnRleHRQYXRoID0gY29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgYWN0aXZlUmVjb21tZW5kYXRpb25zID1cblx0XHRcdChsb2NhbEFubm90YXRpb25Nb2RlbC5nZXRQcm9wZXJ0eShcIi9hY3RpdmVSZWNvbW1lbmRhdGlvbnNcIikgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nW10gfCB1bmRlZmluZWQ+IHwgbnVsbCkgPz8ge307XG5cblx0XHRjb25zdCBleGlzdGluZ1BhdGhzID0gYWN0aXZlUmVjb21tZW5kYXRpb25zW2NvbnRleHRQYXRoXTtcblx0XHRpZiAoZXhpc3RpbmdQYXRocykge1xuXHRcdFx0Ly8gRmlsdGVyIG91dCB0aGUgcHJvcGVydHkgcGF0aFxuXHRcdFx0Y29uc3QgZmlsdGVyZWRQYXRocyA9IGV4aXN0aW5nUGF0aHMuZmlsdGVyKChwYXRoOiBzdHJpbmcpID0+IHBhdGggIT09IHByb3BlcnR5UGF0aCk7XG5cblx0XHRcdC8vIFVwZGF0ZSBvciByZW1vdmUgdGhlIGNvbnRleHQgcGF0aFxuXHRcdFx0aWYgKGZpbHRlcmVkUGF0aHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdC8vIFJlbW92ZSB0aGUgY29udGV4dCBwYXRoIGJ5IGNyZWF0aW5nIGEgbmV3IG9iamVjdCB3aXRob3V0IGl0XG5cdFx0XHRcdGNvbnN0IHVwZGF0ZWRSZWNvbW1lbmRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdIHwgdW5kZWZpbmVkPiA9IE9iamVjdC5mcm9tRW50cmllcyhcblx0XHRcdFx0XHRPYmplY3QuZW50cmllcyhhY3RpdmVSZWNvbW1lbmRhdGlvbnMpLmZpbHRlcigoW2tleV0pID0+IGtleSAhPT0gY29udGV4dFBhdGgpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KFwiL2FjdGl2ZVJlY29tbWVuZGF0aW9uc1wiLCB1cGRhdGVkUmVjb21tZW5kYXRpb25zKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFjdGl2ZVJlY29tbWVuZGF0aW9uc1tjb250ZXh0UGF0aF0gPSBmaWx0ZXJlZFBhdGhzO1xuXHRcdFx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShcIi9hY3RpdmVSZWNvbW1lbmRhdGlvbnNcIiwgYWN0aXZlUmVjb21tZW5kYXRpb25zKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5leHBvcnQgeyBBZGRpdGlvbmFsVmFsdWVHcm91cEtleSwgUmVjb21tZW5kYXRpb25WYWx1ZVR5cGUsIGFkZGl0aW9uYWxWYWx1ZUhlbHBlciB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7TUErQktBLHVCQUF1QiwwQkFBdkJBLHVCQUF1QjtJQUF2QkEsdUJBQXVCO0lBQXZCQSx1QkFBdUI7SUFBdkJBLHVCQUF1QjtJQUFBLE9BQXZCQSx1QkFBdUI7RUFBQSxFQUF2QkEsdUJBQXVCO0VBQUFDLFFBQUEsQ0FBQUQsdUJBQUEsR0FBQUEsdUJBQUE7RUFzQjVCLE1BQU1FLHFCQUFxQixHQUFHO0lBQzdCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLG9D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
|
|
@@ -702,6 +702,65 @@ const additionalValueHelper = {
|
|
|
702
702
|
}
|
|
703
703
|
});
|
|
704
704
|
}
|
|
705
|
+
},
|
|
706
|
+
|
|
707
|
+
/**
|
|
708
|
+
* Adds a property path to the active recommendations for a given context path in the localAnnotationModel.
|
|
709
|
+
* @param context Binding context of the field
|
|
710
|
+
* @param propertyPath Property path to add to active recommendations
|
|
711
|
+
*/
|
|
712
|
+
addActiveRecommendation: function (context: V4Context | Context, propertyPath: string): void {
|
|
713
|
+
const model = context.getModel() as ODataModel;
|
|
714
|
+
const localAnnotationModel = model.getLocalAnnotationModel();
|
|
715
|
+
|
|
716
|
+
const contextPath = context.getPath();
|
|
717
|
+
const activeRecommendations =
|
|
718
|
+
(localAnnotationModel.getProperty("/activeRecommendations") as Record<string, string[] | undefined> | null) ?? {};
|
|
719
|
+
|
|
720
|
+
// Initialize array for this context path if it doesn't exist
|
|
721
|
+
let existingPaths = activeRecommendations[contextPath];
|
|
722
|
+
if (!existingPaths) {
|
|
723
|
+
existingPaths = [];
|
|
724
|
+
activeRecommendations[contextPath] = existingPaths;
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
// Add property path if not already present
|
|
728
|
+
if (!existingPaths.includes(propertyPath)) {
|
|
729
|
+
existingPaths.push(propertyPath);
|
|
730
|
+
localAnnotationModel.setProperty("/activeRecommendations", activeRecommendations);
|
|
731
|
+
}
|
|
732
|
+
},
|
|
733
|
+
|
|
734
|
+
/**
|
|
735
|
+
* Removes a property path from the active recommendations for a given context path in the localAnnotationModel.
|
|
736
|
+
* @param context Binding context of the field
|
|
737
|
+
* @param propertyPath Property path to remove from active recommendations
|
|
738
|
+
*/
|
|
739
|
+
removeActiveRecommendation: function (context: V4Context | Context, propertyPath: string): void {
|
|
740
|
+
const model = context.getModel() as ODataModel;
|
|
741
|
+
const localAnnotationModel = model.getLocalAnnotationModel();
|
|
742
|
+
|
|
743
|
+
const contextPath = context.getPath();
|
|
744
|
+
const activeRecommendations =
|
|
745
|
+
(localAnnotationModel.getProperty("/activeRecommendations") as Record<string, string[] | undefined> | null) ?? {};
|
|
746
|
+
|
|
747
|
+
const existingPaths = activeRecommendations[contextPath];
|
|
748
|
+
if (existingPaths) {
|
|
749
|
+
// Filter out the property path
|
|
750
|
+
const filteredPaths = existingPaths.filter((path: string) => path !== propertyPath);
|
|
751
|
+
|
|
752
|
+
// Update or remove the context path
|
|
753
|
+
if (filteredPaths.length === 0) {
|
|
754
|
+
// Remove the context path by creating a new object without it
|
|
755
|
+
const updatedRecommendations: Record<string, string[] | undefined> = Object.fromEntries(
|
|
756
|
+
Object.entries(activeRecommendations).filter(([key]) => key !== contextPath)
|
|
757
|
+
);
|
|
758
|
+
localAnnotationModel.setProperty("/activeRecommendations", updatedRecommendations);
|
|
759
|
+
} else {
|
|
760
|
+
activeRecommendations[contextPath] = filteredPaths;
|
|
761
|
+
localAnnotationModel.setProperty("/activeRecommendations", activeRecommendations);
|
|
762
|
+
}
|
|
763
|
+
}
|
|
705
764
|
}
|
|
706
765
|
};
|
|
707
766
|
export { AdditionalValueGroupKey, RecommendationValueType, additionalValueHelper };
|