@sapui5/sap.fe.core 1.124.1 → 1.124.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AppStateHandler.js +2 -2
- package/src/sap/fe/core/AppStateHandler.ts +1 -1
- package/src/sap/fe/core/controllerextensions/Routing.js +5 -3
- package/src/sap/fe/core/controllerextensions/Routing.ts +4 -2
- package/src/sap/fe/core/controllerextensions/SideEffects.js +35 -29
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +53 -37
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +3 -2
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +2 -1
- package/src/sap/fe/core/converters/annotations/DataField.js +36 -13
- package/src/sap/fe/core/converters/annotations/DataField.ts +50 -14
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +2 -0
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.js +17 -5
- package/src/sap/fe/core/helpers/BindingToolkit.ts +8 -1
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js +2 -2
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +8 -1
- package/src/sap/fe/core/templating/UIFormatters.js +17 -9
- package/src/sap/fe/core/templating/UIFormatters.ts +26 -14
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2024 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ResourceModelHelper", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageToast", "sap/m/Text", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "../CommonUtils", "../helpers/ClassSupport"], function (Log, ResourceModelHelper, Button, Dialog, MessageToast, Text, ControllerExtension, OverrideExecution, CommonUtils, ClassSupport) {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/ResourceModelHelper", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageToast", "sap/m/Text", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "../CommonUtils", "../helpers/ClassSupport", "sap/ui/core/Component"], function (Log, MetaModelConverter, ResourceModelHelper, Button, Dialog, MessageToast, Text, ControllerExtension, OverrideExecution, CommonUtils, ClassSupport, Component) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _dec31, _dec32, _dec33, _dec34, _dec35, _dec36, _dec37, _dec38, _dec39, _dec40, _dec41, _dec42, _dec43, _dec44, _class, _class2;
|
|
@@ -13,6 +13,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ResourceModelHelper", "sap/m
|
|
|
13
13
|
var extensible = ClassSupport.extensible;
|
|
14
14
|
var defineUI5Class = ClassSupport.defineUI5Class;
|
|
15
15
|
var getResourceModel = ResourceModelHelper.getResourceModel;
|
|
16
|
+
var getInvolvedDataModelObjectsForTargetPath = MetaModelConverter.getInvolvedDataModelObjectsForTargetPath;
|
|
16
17
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
17
18
|
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
18
19
|
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
@@ -25,6 +26,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ResourceModelHelper", "sap/m
|
|
|
25
26
|
var _proto = SideEffectsControllerExtension.prototype;
|
|
26
27
|
_proto.onInit = function onInit() {
|
|
27
28
|
this._view = this.base.getView();
|
|
29
|
+
this._pageComponent = Component.getOwnerComponentFor(this._view);
|
|
28
30
|
this._sideEffectsService = CommonUtils.getAppComponent(this._view).getSideEffectsService();
|
|
29
31
|
this._registeredFieldGroupMap = {};
|
|
30
32
|
this._fieldGroupInvalidity = {};
|
|
@@ -94,34 +96,38 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ResourceModelHelper", "sap/m
|
|
|
94
96
|
*/;
|
|
95
97
|
_proto.getFieldSideEffectsMap = function getFieldSideEffectsMap(field) {
|
|
96
98
|
let sideEffectsMap = {};
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
99
|
+
if (this._pageComponent) {
|
|
100
|
+
var _this$_pageComponent$, _this$_pageComponent, _this$_pageComponent$2, _this$_pageComponent2;
|
|
101
|
+
const entitySet = (_this$_pageComponent$ = (_this$_pageComponent = this._pageComponent).getEntitySet) === null || _this$_pageComponent$ === void 0 ? void 0 : _this$_pageComponent$.call(_this$_pageComponent);
|
|
102
|
+
const contextPath = ((_this$_pageComponent$2 = (_this$_pageComponent2 = this._pageComponent).getContextPath) === null || _this$_pageComponent$2 === void 0 ? void 0 : _this$_pageComponent$2.call(_this$_pageComponent2)) || entitySet && `/${entitySet}`;
|
|
103
|
+
if (contextPath) {
|
|
104
|
+
const fieldGroupIds = field.getFieldGroupIds(),
|
|
105
|
+
contextDataModelObject = getInvolvedDataModelObjectsForTargetPath(contextPath, this._view.getModel().getMetaModel());
|
|
106
|
+
|
|
107
|
+
// SideEffects coming from an OData Service
|
|
108
|
+
sideEffectsMap = this.getSideEffectsMapForFieldGroups(fieldGroupIds, field.getBindingContext());
|
|
109
|
+
|
|
110
|
+
// SideEffects coming from control(s)
|
|
111
|
+
if (contextDataModelObject) {
|
|
112
|
+
const viewEntityType = contextDataModelObject.targetEntityType.fullyQualifiedName,
|
|
113
|
+
fieldPath = this.getTargetProperty(field),
|
|
114
|
+
context = this.getContextForSideEffects(field.getBindingContext(), viewEntityType);
|
|
115
|
+
if (fieldPath && context) {
|
|
116
|
+
const controlSideEffectsEntityType = this._sideEffectsService.getControlEntitySideEffects(viewEntityType);
|
|
117
|
+
Object.keys(controlSideEffectsEntityType).forEach(sideEffectsName => {
|
|
118
|
+
const oControlSideEffects = controlSideEffectsEntityType[sideEffectsName];
|
|
119
|
+
if (oControlSideEffects.sourceProperties.includes(fieldPath)) {
|
|
120
|
+
const name = `${sideEffectsName}::${viewEntityType}`;
|
|
121
|
+
sideEffectsMap[name] = {
|
|
122
|
+
name: name,
|
|
123
|
+
immediate: true,
|
|
124
|
+
sideEffects: oControlSideEffects,
|
|
125
|
+
context: context
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
});
|
|
123
129
|
}
|
|
124
|
-
}
|
|
130
|
+
}
|
|
125
131
|
}
|
|
126
132
|
}
|
|
127
133
|
return sideEffectsMap;
|
|
@@ -730,4 +736,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ResourceModelHelper", "sap/m
|
|
|
730
736
|
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "addControlSideEffects", [_dec3, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "addControlSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeControlSideEffects", [_dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "removeControlSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getContextForSideEffects", [_dec7, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "getContextForSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getFieldSideEffectsMap", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "getFieldSideEffectsMap"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getSideEffectsMapForFieldGroups", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "getSideEffectsMapForFieldGroups"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "clearFieldGroupsValidity", [_dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "clearFieldGroupsValidity"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isFieldGroupValid", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "isFieldGroupValid"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getTargetProperty", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "getTargetProperty"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "prepareDeferredSideEffectsForField", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "prepareDeferredSideEffectsForField"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldChange", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldGroupChange", [_dec23, _dec24], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldGroupChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "requestSideEffects", [_dec25, _dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "requestSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "requestSideEffectsForEvent", [_dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "requestSideEffectsForEvent"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getDataRefreshText", [_dec29, _dec30], Object.getOwnPropertyDescriptor(_class2.prototype, "getDataRefreshText"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRegisteredFailedRequests", [_dec31, _dec32], Object.getOwnPropertyDescriptor(_class2.prototype, "getRegisteredFailedRequests"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "registerFailedSideEffects", [_dec33, _dec34], Object.getOwnPropertyDescriptor(_class2.prototype, "registerFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "unregisterFailedSideEffectsForAContext", [_dec35, _dec36], Object.getOwnPropertyDescriptor(_class2.prototype, "unregisterFailedSideEffectsForAContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "unregisterFailedSideEffects", [_dec37, _dec38], Object.getOwnPropertyDescriptor(_class2.prototype, "unregisterFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "registerFieldGroupSideEffects", [_dec39, _dec40], Object.getOwnPropertyDescriptor(_class2.prototype, "registerFieldGroupSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "unregisterFieldGroupSideEffects", [_dec41, _dec42], Object.getOwnPropertyDescriptor(_class2.prototype, "unregisterFieldGroupSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRegisteredSideEffectsForFieldGroup", [_dec43, _dec44], Object.getOwnPropertyDescriptor(_class2.prototype, "getRegisteredSideEffectsForFieldGroup"), _class2.prototype)), _class2)) || _class);
|
|
731
737
|
return SideEffectsControllerExtension;
|
|
732
738
|
}, false);
|
|
733
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJTU1FRElBVEVfUkVRVUVTVCIsIlNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiIsImRlZmluZVVJNUNsYXNzIiwibWV0aG9kT3ZlcnJpZGUiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkluc3RlYWQiLCJwcml2YXRlRXh0ZW5zaW9uIiwib25Jbml0IiwiX3ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9zaWRlRWZmZWN0c1NlcnZpY2UiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsIl9yZWdpc3RlcmVkRmllbGRHcm91cE1hcCIsIl9maWVsZEdyb3VwSW52YWxpZGl0eSIsIl9yZWdpc3RlcmVkRmFpbGVkU2lkZUVmZmVjdHMiLCJhZGRDb250cm9sU2lkZUVmZmVjdHMiLCJlbnRpdHlUeXBlIiwiY29udHJvbFNpZGVFZmZlY3RzIiwicmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzIiwiY29udHJvbCIsImNvbnRyb2xJZCIsImlzQSIsImdldElkIiwiZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzIiwiYmluZGluZ0NvbnRleHQiLCJzaWRlRWZmZWN0RW50aXR5VHlwZSIsImNvbnRleHRGb3JTaWRlRWZmZWN0cyIsImdldEVudGl0eVR5cGVGcm9tQ29udGV4dCIsImdldEJpbmRpbmciLCJnZXRDb250ZXh0IiwidW5kZWZpbmVkIiwiZ2V0RmllbGRTaWRlRWZmZWN0c01hcCIsImZpZWxkIiwic2lkZUVmZmVjdHNNYXAiLCJmaWVsZEdyb3VwSWRzIiwiZ2V0RmllbGRHcm91cElkcyIsInZpZXdFbnRpdHlTZXRTZXROYW1lIiwiZ2V0Vmlld0RhdGEiLCJlbnRpdHlTZXQiLCJ2aWV3RW50aXR5U2V0IiwiZ2V0Q29udmVydGVkTWV0YU1vZGVsIiwiZW50aXR5U2V0cyIsImZpbmQiLCJuYW1lIiwiZ2V0U2lkZUVmZmVjdHNNYXBGb3JGaWVsZEdyb3VwcyIsImdldEJpbmRpbmdDb250ZXh0Iiwidmlld0VudGl0eVR5cGUiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJmaWVsZFBhdGgiLCJnZXRUYXJnZXRQcm9wZXJ0eSIsImNvbnRleHQiLCJjb250cm9sU2lkZUVmZmVjdHNFbnRpdHlUeXBlIiwiZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJzaWRlRWZmZWN0c05hbWUiLCJvQ29udHJvbFNpZGVFZmZlY3RzIiwic291cmNlUHJvcGVydGllcyIsImluY2x1ZGVzIiwiaW1tZWRpYXRlIiwic2lkZUVmZmVjdHMiLCJmaWVsZENvbnRleHQiLCJtU2lkZUVmZmVjdHNNYXAiLCJmaWVsZEdyb3VwSWQiLCJfZ2V0U2lkZUVmZmVjdHNQcm9wZXJ0eUZvckZpZWxkR3JvdXAiLCJvQ29udGV4dCIsImNsZWFyRmllbGRHcm91cHNWYWxpZGl0eSIsImlzRmllbGRHcm91cFZhbGlkIiwiaWQiLCJfZ2V0RmllbGRHcm91cEluZGV4IiwibGVuZ3RoIiwiZGF0YSIsIm1ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwidmlld0JpbmRpbmdQYXRoIiwiZ2V0UGF0aCIsInZpZXdNZXRhTW9kZWxQYXRoIiwiZ2V0TWV0YVBhdGgiLCJyZXBsYWNlIiwicHJlcGFyZURlZmVycmVkU2lkZUVmZmVjdHNGb3JGaWVsZCIsImV2ZW50IiwiZmllbGRWYWxpZGl0eSIsImZpZWxkR3JvdXBQcmVSZXF1aXNpdGUiLCJnZXRTb3VyY2UiLCJfc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyIsImZpbHRlciIsInNpZGVFZmZlY3RzUHJvcGVydGllcyIsInJlZ2lzdGVyRmllbGRHcm91cFNpZGVFZmZlY3RzIiwiaGFuZGxlRmllbGRDaGFuZ2UiLCJza2lwRGVmZXJyZWRSZWdpc3RyYXRpb24iLCJfbWFuYWdlU2lkZUVmZmVjdHNGcm9tRmllbGQiLCJoYW5kbGVGaWVsZEdyb3VwQ2hhbmdlIiwiZ2V0UGFyYW1ldGVyIiwiZmllbGRHcm91cHNTaWRlRWZmZWN0cyIsInJlZHVjZSIsInJlc3VsdHMiLCJjb25jYXQiLCJnZXRSZWdpc3RlcmVkU2lkZUVmZmVjdHNGb3JGaWVsZEdyb3VwIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsImZpZWxkR3JvdXBTaWRlRWZmZWN0cyIsIl9yZXF1ZXN0RmllbGRHcm91cFNpZGVFZmZlY3RzIiwiY2F0Y2giLCJlcnJvciIsImNvbnRleHRQYXRoIiwiTG9nIiwiZGVidWciLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJncm91cElkIiwiZm5HZXRUYXJnZXRzIiwiaWdub3JlVHJpZ2dlckFjdGlvbnMiLCJmblRyaWdnZXJDYWxsYmFja3MiLCJ0cmlnZ2VyQ2FsbGJhY2tzIiwiYmluZCIsInRhcmdldHMiLCJ0cmlnZ2VyQWN0aW9uIiwidGFyZ2V0RW50aXRpZXMiLCJ0YXJnZXRQcm9wZXJ0aWVzIiwiaXNDb250cm9sU2lkZUVmZmVjdHMiLCJleGVjdXRlQWN0aW9uIiwidGhlbiIsImFzeW5jIiwidGFyZ2V0IiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJyZWdpc3RlckZhaWxlZFNpZGVFZmZlY3RzIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yRXZlbnQiLCJldmVudE5hbWUiLCJwYXRoIiwiaXNEYXRhUGF0aFJlbGV2YW50IiwiX2ZpbmRSZWxldmFudENvbnRleHQiLCJfY29udGV4dElzUmVsZXZhbnQiLCJnZXRDYW5vbmljYWxQYXRoIiwiZGVwZW5kZW50QmluZGluZ3MiLCJnZXREZXBlbmRlbnRCaW5kaW5ncyIsImJpbmRpbmciLCJnZXRCb3VuZENvbnRleHQiLCJsaXN0Q29udGV4dHMiLCJnZXRBbGxDdXJyZW50Q29udGV4dHMiLCJsaXN0Q29udGV4dCIsImdldERhdGFSZWZyZXNoVGV4dCIsInJlc291cmNlTW9kZWwiLCJnZXRSZXNvdXJjZU1vZGVsIiwiZ2V0VGV4dCIsIm5vdGlmeURhdGFSZWZyZXNoIiwiTWVzc2FnZVRvYXN0Iiwic2hvdyIsImdldENvbnRyb2xsZXIiLCJfc2lkZUVmZmVjdHMiLCJjb25maXJtRGF0YVJlZnJlc2giLCJpc0NvbmZpcm1hdGlvbkRpYWxvZ09wZW4iLCJyZXNvbHZlIiwicmVqZWN0IiwidGV4dCIsImNvbmZpcm1hdGlvbkRpYWxvZyIsIkRpYWxvZyIsInRpdGxlIiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiYWRkU3R5bGVDbGFzcyIsIm9wZW4iLCJyZXF1ZXN0TXVsdGlwbGVTaWRlRWZmZWN0cyIsIm11bHRpU2lkZUVmZmVjdHMiLCJwcm9wZXJ0aWVzIiwiU2V0IiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJhY3Rpb25zIiwic2lkZUVmZmVjdEFjdGlvbiIsInB1c2giLCJmbnRyaWdnZXJDYWxsYmFja3MiLCJhY3Rpb24iLCJteVNldCIsInByb3BlcnR5IiwiYWRkIiwibmF2aWdhdGlvblByb3BlcnR5IiwiQXJyYXkiLCJmcm9tIiwiZ2V0UmVnaXN0ZXJlZEZhaWxlZFJlcXVlc3RzIiwiaXNOb3RBbHJlYWR5TGlzdGVkIiwiZXZlcnkiLCJtRmFpbGVkU2lkZUVmZmVjdHMiLCJ1bnJlZ2lzdGVyRmFpbGVkU2lkZUVmZmVjdHNGb3JBQ29udGV4dCIsInVucmVnaXN0ZXJGYWlsZWRTaWRlRWZmZWN0cyIsInNpZGVFZmZlY3RzRnVsbHlRdWFsaWZpZWROYW1lIiwicHJvbWlzZSIsInNpZGVFZmZlY3RQcm9wZXJ0eSIsInVucmVnaXN0ZXJGaWVsZEdyb3VwU2lkZUVmZmVjdHMiLCJyZWdpc3RyeUluZGV4Iiwic3RhcnRzV2l0aCIsInNpZGVFZmZlY3RQYXJ0cyIsInNwbGl0Iiwic2lkZUVmZmVjdFBhdGgiLCJnZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzIiwic2lkZUVmZmVjdHNUb0V4ZWN1dGUiLCJhZGRTaWRlRWZmZWN0cyIsInZhbHVlcyIsImZhaWxlZFNpZGVFZmZlY3RzIiwiZmFpbGVkU2lkZUVmZmVjdCIsImUiLCJuYXZpZ2F0aW9uIiwibmF2IiwicmVnaXN0ZXJDYWxsQmFjayIsImdldFJlZ2lzdGVyZWRDYWxsYmFjayIsInN1Y2Nlc3MiLCJrZXkiLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJTaWRlRWZmZWN0cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBnZXRSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUge1xuXHRDb250cm9sU2lkZUVmZmVjdHNUeXBlLFxuXHRPRGF0YVNpZGVFZmZlY3RzVHlwZSxcblx0U2lkZUVmZmVjdHNTZXJ2aWNlLFxuXHRTaWRlRWZmZWN0c1RhcmdldCxcblx0U2lkZUVmZmVjdHNUeXBlXG59IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wkVmFsaWRhdGVGaWVsZEdyb3VwRXZlbnQgfSBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgRmllbGQgZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIHsgRmllbGQkQ2hhbmdlRXZlbnQgfSBmcm9tIFwic2FwL3VpL21kYy9GaWVsZFwiO1xuaW1wb3J0IHR5cGUgeyBNdWx0aVZhbHVlRmllbGQkQ2hhbmdlRXZlbnQgfSBmcm9tIFwic2FwL3VpL21kYy9NdWx0aVZhbHVlRmllbGRcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwiLi4vQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCIuLi9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBCYXNlTWFuaWZlc3RTZXR0aW5ncyB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgbWV0aG9kT3ZlcnJpZGUsIHByaXZhdGVFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCIuLi9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuXG50eXBlIEJhc2VTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0ge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGltbWVkaWF0ZT86IGJvb2xlYW47XG5cdHNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGU7XG59O1xuXG5leHBvcnQgdHlwZSBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUgPSBCYXNlU2lkZUVmZmVjdFByb3BlcnR5VHlwZSAmIHtcblx0Y29udGV4dDogQ29udGV4dDtcbn07XG5cbmV4cG9ydCB0eXBlIEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU+O1xuXG5leHBvcnQgdHlwZSBNYXNzRWRpdEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBCYXNlU2lkZUVmZmVjdFByb3BlcnR5VHlwZT47XG5cbnR5cGUgRmFpbGVkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0c1R5cGVbXT47XG5cbmV4cG9ydCB0eXBlIEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZSA9IHtcblx0cHJvbWlzZTogUHJvbWlzZTx1bmtub3duPjtcblx0c2lkZUVmZmVjdFByb3BlcnR5OiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU7XG59O1xuXG5jb25zdCBJTU1FRElBVEVfUkVRVUVTVCA9IFwiJCRJbW1lZGlhdGVSZXF1ZXN0XCI7XG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5TaWRlRWZmZWN0c1wiKVxuY2xhc3MgU2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByb3RlY3RlZCBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0cHJpdmF0ZSBfdmlldyE6IEZFVmlldztcblxuXHRwcml2YXRlIF9yZWdpc3RlcmVkRmllbGRHcm91cE1hcCE6IFJlY29yZDxzdHJpbmcsIEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZT47XG5cblx0cHJpdmF0ZSBfZmllbGRHcm91cEludmFsaWRpdHkhOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj47XG5cblx0cHJpdmF0ZSBfc2lkZUVmZmVjdHNTZXJ2aWNlITogU2lkZUVmZmVjdHNTZXJ2aWNlO1xuXG5cdHByaXZhdGUgX3JlZ2lzdGVyZWRGYWlsZWRTaWRlRWZmZWN0cyE6IEZhaWxlZFNpZGVFZmZlY3REaWN0aW9uYXJ5O1xuXG5cdHByaXZhdGUgaXNDb25maXJtYXRpb25EaWFsb2dPcGVuPzogYm9vbGVhbjtcblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5fdmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0dGhpcy5fc2lkZUVmZmVjdHNTZXJ2aWNlID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX3ZpZXcpLmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdHRoaXMuX3JlZ2lzdGVyZWRGaWVsZEdyb3VwTWFwID0ge307XG5cdFx0dGhpcy5fZmllbGRHcm91cEludmFsaWRpdHkgPSB7fTtcblx0XHR0aGlzLl9yZWdpc3RlcmVkRmFpbGVkU2lkZUVmZmVjdHMgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgU2lkZUVmZmVjdHMgY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHdoZXJlIHRoZSBTaWRlRWZmZWN0cyBjb250cm9sIHdpbGwgYmUgcmVnaXN0ZXJlZFxuXHQgKiBAcGFyYW0gY29udHJvbFNpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRvIHJlZ2lzdGVyLiBFbnN1cmUgdGhlIHNvdXJjZUNvbnRyb2xJZCBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIFNBUFVJNSBjb250cm9sIElELlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFkZENvbnRyb2xTaWRlRWZmZWN0cyhlbnRpdHlUeXBlOiBzdHJpbmcsIGNvbnRyb2xTaWRlRWZmZWN0czogT21pdDxDb250cm9sU2lkZUVmZmVjdHNUeXBlLCBcImZ1bGx5UXVhbGlmaWVkTmFtZVwiPik6IHZvaWQge1xuXHRcdHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZS5hZGRDb250cm9sU2lkZUVmZmVjdHMoZW50aXR5VHlwZSwgY29udHJvbFNpZGVFZmZlY3RzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIFNpZGVFZmZlY3RzIGNyZWF0ZWQgYnkgYSBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udHJvbCBTQVBVSTUgQ29udHJvbFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyhjb250cm9sOiBDb250cm9sKTogdm9pZCB7XG5cdFx0Y29uc3QgY29udHJvbElkID0gY29udHJvbC5pc0E/LihcInNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3RcIikgJiYgY29udHJvbC5nZXRJZCgpO1xuXG5cdFx0aWYgKGNvbnRyb2xJZCkge1xuXHRcdFx0dGhpcy5fc2lkZUVmZmVjdHNTZXJ2aWNlLnJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyhjb250cm9sSWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZSBjb250ZXh0IG9uIHdoaWNoIFNpZGVFZmZlY3RzIGNhbiBiZSByZXF1ZXN0ZWQuXG5cdCAqIFRoZSBjb3JyZWN0IG9uZSBtdXN0IGhhdmUgdGhlIGJpbmRpbmcgcGFyYW1ldGVyICQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBiaW5kaW5nQ29udGV4dCBJbml0aWFsIGJpbmRpbmcgY29udGV4dFxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdEVudGl0eVR5cGUgRW50aXR5VHlwZSBvZiB0aGUgc2lkZUVmZmVjdHNcblx0ICogQHJldHVybnMgU0FQVUk1IENvbnRleHQgb3IgdW5kZWZpbmVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKGJpbmRpbmdDb250ZXh0OiBDb250ZXh0LCBzaWRlRWZmZWN0RW50aXR5VHlwZTogc3RyaW5nKTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IGNvbnRleHRGb3JTaWRlRWZmZWN0cyA9IGJpbmRpbmdDb250ZXh0LFxuXHRcdFx0ZW50aXR5VHlwZSA9IHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQoYmluZGluZ0NvbnRleHQpO1xuXG5cdFx0aWYgKHNpZGVFZmZlY3RFbnRpdHlUeXBlICE9PSBlbnRpdHlUeXBlKSB7XG5cdFx0XHRjb250ZXh0Rm9yU2lkZUVmZmVjdHMgPSBiaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0Q29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRpZiAoY29udGV4dEZvclNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdGVudGl0eVR5cGUgPSB0aGlzLl9zaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KGNvbnRleHRGb3JTaWRlRWZmZWN0cyk7XG5cdFx0XHRcdGlmIChzaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gZW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdGNvbnRleHRGb3JTaWRlRWZmZWN0cyA9IGNvbnRleHRGb3JTaWRlRWZmZWN0cy5nZXRCaW5kaW5nKCkuZ2V0Q29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRcdFx0aWYgKGNvbnRleHRGb3JTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRcdFx0ZW50aXR5VHlwZSA9IHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQoY29udGV4dEZvclNpZGVFZmZlY3RzKTtcblx0XHRcdFx0XHRcdGlmIChzaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gZW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjb250ZXh0Rm9yU2lkZUVmZmVjdHMgfHwgdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIG1hcCBmb3IgYSBmaWVsZFxuXHQgKiBUaGVzZSBTaWRlRWZmZWN0cyBhcmVcblx0ICogLSBsaXN0ZWQgaW50byBGaWVsZEdyb3VwSWRzIChjb21pbmcgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlKVxuXHQgKiAtIGdlbmVyYXRlZCBieSBhIGNvbnRyb2wgb3IgY29udHJvbHMgYW5kIHRoYXQgY29uZmlndXJlIHRoaXMgZmllbGQgYXMgU291cmNlUHJvcGVydGllcy5cblx0ICpcblx0ICogQHBhcmFtIGZpZWxkIEZpZWxkIGNvbnRyb2xcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgbWFwXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0RmllbGRTaWRlRWZmZWN0c01hcChmaWVsZDogQ29udHJvbCk6IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdGxldCBzaWRlRWZmZWN0c01hcDogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IHt9O1xuXHRcdGNvbnN0IGZpZWxkR3JvdXBJZHMgPSBmaWVsZC5nZXRGaWVsZEdyb3VwSWRzKCksXG5cdFx0XHR2aWV3RW50aXR5U2V0U2V0TmFtZSA9ICh0aGlzLl92aWV3LmdldFZpZXdEYXRhKCkgYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3MpLmVudGl0eVNldCxcblx0XHRcdHZpZXdFbnRpdHlTZXQgPSB0aGlzLl9zaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udmVydGVkTWV0YU1vZGVsKCkuZW50aXR5U2V0cy5maW5kKChlbnRpdHlTZXQpID0+IHtcblx0XHRcdFx0cmV0dXJuIGVudGl0eVNldC5uYW1lID09PSB2aWV3RW50aXR5U2V0U2V0TmFtZTtcblx0XHRcdH0pO1xuXG5cdFx0Ly8gU2lkZUVmZmVjdHMgY29taW5nIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHRcdHNpZGVFZmZlY3RzTWFwID0gdGhpcy5nZXRTaWRlRWZmZWN0c01hcEZvckZpZWxkR3JvdXBzKFxuXHRcdFx0ZmllbGRHcm91cElkcyxcblx0XHRcdGZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWRcblx0XHQpIGFzIEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnk7XG5cblx0XHQvLyBTaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBjb250cm9sKHMpXG5cdFx0aWYgKHZpZXdFbnRpdHlTZXRTZXROYW1lICYmIHZpZXdFbnRpdHlTZXQpIHtcblx0XHRcdGNvbnN0IHZpZXdFbnRpdHlUeXBlID0gdmlld0VudGl0eVNldC5lbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0ZmllbGRQYXRoID0gdGhpcy5nZXRUYXJnZXRQcm9wZXJ0eShmaWVsZCksXG5cdFx0XHRcdGNvbnRleHQgPSB0aGlzLmdldENvbnRleHRGb3JTaWRlRWZmZWN0cyhmaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQsIHZpZXdFbnRpdHlUeXBlKTtcblxuXHRcdFx0aWYgKGZpZWxkUGF0aCAmJiBjb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRyb2xTaWRlRWZmZWN0c0VudGl0eVR5cGUgPSB0aGlzLl9zaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzKHZpZXdFbnRpdHlUeXBlKTtcblx0XHRcdFx0T2JqZWN0LmtleXMoY29udHJvbFNpZGVFZmZlY3RzRW50aXR5VHlwZSkuZm9yRWFjaCgoc2lkZUVmZmVjdHNOYW1lKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbnRyb2xTaWRlRWZmZWN0cyA9IGNvbnRyb2xTaWRlRWZmZWN0c0VudGl0eVR5cGVbc2lkZUVmZmVjdHNOYW1lXTtcblx0XHRcdFx0XHRpZiAob0NvbnRyb2xTaWRlRWZmZWN0cy5zb3VyY2VQcm9wZXJ0aWVzLmluY2x1ZGVzKGZpZWxkUGF0aCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG5hbWUgPSBgJHtzaWRlRWZmZWN0c05hbWV9Ojoke3ZpZXdFbnRpdHlUeXBlfWA7XG5cdFx0XHRcdFx0XHRzaWRlRWZmZWN0c01hcFtuYW1lXSA9IHtcblx0XHRcdFx0XHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdFx0XHRcdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogb0NvbnRyb2xTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdFx0Y29udGV4dDogY29udGV4dFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc2lkZUVmZmVjdHNNYXA7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgc2lkZUVmZmVjdHMgbWFwIGZvciBmaWVsZEdyb3Vwcy5cblx0ICpcblx0ICogQHBhcmFtIGZpZWxkR3JvdXBJZHMgRmllbGQgZ3JvdXAgaWRzXG5cdCAqIEBwYXJhbSBmaWVsZENvbnRleHQgRmllbGQgYmluZGluZyBjb250ZXh0XG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIG1hcFxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0U2lkZUVmZmVjdHNNYXBGb3JGaWVsZEdyb3Vwcyhcblx0XHRmaWVsZEdyb3VwSWRzOiBzdHJpbmdbXSxcblx0XHRmaWVsZENvbnRleHQ/OiBDb250ZXh0IHwgbnVsbFxuXHQpOiBNYXNzRWRpdEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgfCBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5IHtcblx0XHRjb25zdCBtU2lkZUVmZmVjdHNNYXA6IE1hc3NFZGl0RmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSB8IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSB7fTtcblx0XHRmaWVsZEdyb3VwSWRzLmZvckVhY2goKGZpZWxkR3JvdXBJZCkgPT4ge1xuXHRcdFx0Y29uc3QgeyBuYW1lLCBpbW1lZGlhdGUsIHNpZGVFZmZlY3RzLCBzaWRlRWZmZWN0RW50aXR5VHlwZSB9ID0gdGhpcy5fZ2V0U2lkZUVmZmVjdHNQcm9wZXJ0eUZvckZpZWxkR3JvdXAoZmllbGRHcm91cElkKTtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gZmllbGRDb250ZXh0ID8gKHRoaXMuZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKGZpZWxkQ29udGV4dCwgc2lkZUVmZmVjdEVudGl0eVR5cGUpIGFzIENvbnRleHQpIDogdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHNpZGVFZmZlY3RzICYmICghZmllbGRDb250ZXh0IHx8IChmaWVsZENvbnRleHQgJiYgb0NvbnRleHQpKSkge1xuXHRcdFx0XHRtU2lkZUVmZmVjdHNNYXBbbmFtZV0gPSB7XG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRpbW1lZGlhdGUsXG5cdFx0XHRcdFx0c2lkZUVmZmVjdHNcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKGZpZWxkQ29udGV4dCkge1xuXHRcdFx0XHRcdChtU2lkZUVmZmVjdHNNYXBbbmFtZV0gYXMgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlKS5jb250ZXh0ID0gb0NvbnRleHQhO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG1TaWRlRWZmZWN0c01hcDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhciByZWNvcmRlZCB2YWxpZGF0aW9uIHN0YXR1cyBmb3IgYWxsIHByb3BlcnRpZXMuXG5cdCAqXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Y2xlYXJGaWVsZEdyb3Vwc1ZhbGlkaXR5KCk6IHZvaWQge1xuXHRcdHRoaXMuX2ZpZWxkR3JvdXBJbnZhbGlkaXR5ID0ge307XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYXIgcmVjb3JkZWQgdmFsaWRhdGlvbiBzdGF0dXMgZm9yIGFsbCBwcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAcGFyYW0gZmllbGRHcm91cElkIEZpZWxkIGdyb3VwIGlkXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHRcblx0ICogQHJldHVybnMgU0FQVUk1IENvbnRleHQgb3IgdW5kZWZpbmVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aXNGaWVsZEdyb3VwVmFsaWQoZmllbGRHcm91cElkOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBpZCA9IHRoaXMuX2dldEZpZWxkR3JvdXBJbmRleChmaWVsZEdyb3VwSWQsIGNvbnRleHQpO1xuXHRcdHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9maWVsZEdyb3VwSW52YWxpZGl0eVtpZF0gPz8ge30pLmxlbmd0aCA9PT0gMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSByZWxhdGl2ZSB0YXJnZXQgcHJvcGVydHkgcmVsYXRlZCB0byB0aGUgRmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBmaWVsZCBGaWVsZCBjb250cm9sXG5cdCAqIEByZXR1cm5zIFJlbGF0aXZlIHRhcmdldCBwcm9wZXJ0eVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldFRhcmdldFByb3BlcnR5KGZpZWxkOiBDb250cm9sKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBmaWVsZFBhdGggPSBmaWVsZC5kYXRhKFwic291cmNlUGF0aFwiKSBhcyBzdHJpbmc7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gdGhpcy5fdmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IHZpZXdCaW5kaW5nUGF0aCA9IHRoaXMuX3ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IHZpZXdNZXRhTW9kZWxQYXRoID0gdmlld0JpbmRpbmdQYXRoID8gYCR7bWV0YU1vZGVsLmdldE1ldGFQYXRoKHZpZXdCaW5kaW5nUGF0aCl9L2AgOiBcIlwiO1xuXHRcdHJldHVybiBmaWVsZFBhdGg/LnJlcGxhY2Uodmlld01ldGFNb2RlbFBhdGgsIFwiXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhY2hlcyBkZWZlcnJlZCBTaWRlRWZmZWN0cyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgRmllbGRHcm91cCBpcyB1bmZvY3VzZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBldmVudCBTQVBVSTUgZXZlbnQgdGhhdCBjb21lcyBmcm9tIGEgZmllbGQgY2hhbmdlXG5cdCAqIEBwYXJhbSBmaWVsZFZhbGlkaXR5XG5cdCAqIEBwYXJhbSBmaWVsZEdyb3VwUHJlUmVxdWlzaXRlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkIGJlZm9yZSBleGVjdXRpbmcgZGVmZXJyZWQgU2lkZUVmZmVjdHNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwcmVwYXJlRGVmZXJyZWRTaWRlRWZmZWN0c0ZvckZpZWxkKFxuXHRcdGV2ZW50OiBGaWVsZCRDaGFuZ2VFdmVudCB8IE11bHRpVmFsdWVGaWVsZCRDaGFuZ2VFdmVudCxcblx0XHRmaWVsZFZhbGlkaXR5OiBib29sZWFuLFxuXHRcdGZpZWxkR3JvdXBQcmVSZXF1aXNpdGU/OiBQcm9taXNlPHVua25vd24+XG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGZpZWxkID0gKGV2ZW50IGFzIFVJNUV2ZW50PHt9LCBGaWVsZD4pLmdldFNvdXJjZSgpO1xuXHRcdHRoaXMuX3NhdmVGaWVsZFByb3BlcnRpZXNTdGF0dXMoZmllbGQsIGZpZWxkVmFsaWRpdHkpO1xuXHRcdGlmICghZmllbGRWYWxpZGl0eSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBzaWRlRWZmZWN0c01hcCA9IHRoaXMuZ2V0RmllbGRTaWRlRWZmZWN0c01hcChmaWVsZCk7XG5cblx0XHQvLyByZWdpc3RlciBmaWVsZCBncm91cCBTaWRlRWZmZWN0c1xuXHRcdE9iamVjdC5rZXlzKHNpZGVFZmZlY3RzTWFwKVxuXHRcdFx0LmZpbHRlcigoc2lkZUVmZmVjdHNOYW1lKSA9PiBzaWRlRWZmZWN0c01hcFtzaWRlRWZmZWN0c05hbWVdLmltbWVkaWF0ZSAhPT0gdHJ1ZSlcblx0XHRcdC5mb3JFYWNoKChzaWRlRWZmZWN0c05hbWUpID0+IHtcblx0XHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHNQcm9wZXJ0aWVzID0gc2lkZUVmZmVjdHNNYXBbc2lkZUVmZmVjdHNOYW1lXTtcblx0XHRcdFx0dGhpcy5yZWdpc3RlckZpZWxkR3JvdXBTaWRlRWZmZWN0cyhzaWRlRWZmZWN0c1Byb3BlcnRpZXMsIGZpZWxkR3JvdXBQcmVSZXF1aXNpdGUpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogTWFuYWdlcyB0aGUgd29ya2Zsb3cgZm9yIFNpZGVFZmZlY3RzIHdpdGggcmVsYXRlZCBjaGFuZ2VzIHRvIGEgZmllbGRcblx0ICogVGhlIGZvbGxvd2luZyBzY2VuYXJpb3MgYXJlIG1hbmFnZWQ6XG5cdCAqICAtIFJlZ2lzdGVyOiBjYWNoZXMgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIEZpZWxkR3JvdXAgaXMgdW5mb2N1c2VkXG5cdCAqICAtIEV4ZWN1dGU6IHRyaWdnZXJzIGltbWVkaWF0ZSBTaWRlRWZmZWN0cyByZXF1ZXN0cyBpZiB0aGUgcHJvbWlzZSBmb3IgdGhlIGZpZWxkIGV2ZW50IGlzIGZ1bGZpbGxlZC5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IFNBUFVJNSBldmVudCB0aGF0IGNvbWVzIGZyb20gYSBmaWVsZCBjaGFuZ2Vcblx0ICogQHBhcmFtIGZpZWxkVmFsaWRpdHlcblx0ICogQHBhcmFtIGZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgYmVmb3JlIGV4ZWN1dGluZyBkZWZlcnJlZCBTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gc2tpcERlZmVycmVkUmVnaXN0cmF0aW9uIElmIHRydWUgdGhlbiBkZWZlcnJlZCBzaWRlIGVmZmVjdHMgYXJlIG5vdCByZWdpc3RlcmVkLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSByZWdpc3RyYXRpb24gb2YgZGVmZXJyZWQgc2lkZSBlZmZlY3RzIGFuZCB0cmlnZ2VyaW5nIG5lZWRzIHRvIGJlIGRvbmUgc2VwYXJhdGVseS5cblx0ICogQHJldHVybnMgIFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdChzKVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGhhbmRsZUZpZWxkQ2hhbmdlKFxuXHRcdGV2ZW50OiBGaWVsZCRDaGFuZ2VFdmVudCxcblx0XHRmaWVsZFZhbGlkaXR5OiBib29sZWFuLFxuXHRcdGZpZWxkR3JvdXBQcmVSZXF1aXNpdGU/OiBQcm9taXNlPHVua25vd24+LFxuXHRcdHNraXBEZWZlcnJlZFJlZ2lzdHJhdGlvbiA9IGZhbHNlXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGZpZWxkID0gZXZlbnQuZ2V0U291cmNlKCkgYXMgQ29udHJvbDtcblx0XHRpZiAoIXNraXBEZWZlcnJlZFJlZ2lzdHJhdGlvbikge1xuXHRcdFx0dGhpcy5wcmVwYXJlRGVmZXJyZWRTaWRlRWZmZWN0c0ZvckZpZWxkKGV2ZW50LCBmaWVsZFZhbGlkaXR5LCBmaWVsZEdyb3VwUHJlUmVxdWlzaXRlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyhmaWVsZCwgZmllbGRWYWxpZGl0eSk7XG5cdFx0XHRpZiAoIWZpZWxkVmFsaWRpdHkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5fbWFuYWdlU2lkZUVmZmVjdHNGcm9tRmllbGQoZmllbGQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgU2lkZUVmZmVjdHMgd2l0aCBhIHJlbGF0ZWQgJ2ZvY3VzIG91dCcgdG8gYSBmaWVsZCBncm91cC5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IFNBUFVJNSBFdmVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJldHVybmluZyB0cnVlIGlmIHRoZSBTaWRlRWZmZWN0cyBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgaGFuZGxlRmllbGRHcm91cENoYW5nZShldmVudDogQ29udHJvbCRWYWxpZGF0ZUZpZWxkR3JvdXBFdmVudCk6IFByb21pc2U8dm9pZCB8IHZvaWRbXT4ge1xuXHRcdGNvbnN0IGZpZWxkID0gZXZlbnQuZ2V0U291cmNlKCksXG5cdFx0XHRmaWVsZEdyb3VwSWRzOiBzdHJpbmdbXSA9IGV2ZW50LmdldFBhcmFtZXRlcihcImZpZWxkR3JvdXBJZHNcIikgPz8gW10sXG5cdFx0XHRmaWVsZEdyb3Vwc1NpZGVFZmZlY3RzID0gZmllbGRHcm91cElkcy5yZWR1Y2UoKHJlc3VsdHM6IEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZVtdLCBmaWVsZEdyb3VwSWQpID0+IHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHMuY29uY2F0KHRoaXMuZ2V0UmVnaXN0ZXJlZFNpZGVFZmZlY3RzRm9yRmllbGRHcm91cChmaWVsZEdyb3VwSWQpKTtcblx0XHRcdH0sIFtdKTtcblxuXHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdGZpZWxkR3JvdXBzU2lkZUVmZmVjdHMubWFwKGFzeW5jIChmaWVsZEdyb3VwU2lkZUVmZmVjdHMpID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3JlcXVlc3RGaWVsZEdyb3VwU2lkZUVmZmVjdHMoZmllbGRHcm91cFNpZGVFZmZlY3RzKTtcblx0XHRcdH0pXG5cdFx0KS5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdGNvbnN0IGNvbnRleHRQYXRoID0gZmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpO1xuXHRcdFx0TG9nLmRlYnVnKGBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIEZpZWxkR3JvdXAgU2lkZUVmZmVjdHMgb24gY29udGV4dCAke2NvbnRleHRQYXRofWAsIGVycm9yKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0IFNpZGVFZmZlY3RzIG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gZ3JvdXBJZFxuXHQgKiBAcGFyYW0gZm5HZXRUYXJnZXRzIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCB3aWxsIGdpdmUgdXMgdGhlIHRhcmdldHMgYW5kIGFjdGlvbnMgaWYgaXQgd2FzIGNvbWluZyB0aHJvdWdoIHNvbWUgc3BlY2lmaWMgaGFuZGxpbmcuXG5cdCAqIEBwYXJhbSBpZ25vcmVUcmlnZ2VyQWN0aW9ucyBJZiB0cnVlLCB3ZSBkbyBub3QgdHJpZ2dlciBhY3Rpb25zIGRlZmluZWQgaW4gdGhlIHNpZGUgZWZmZWN0XG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIHJlcXVlc3Qgb24gU0FQVUk1IGNvbnRleHRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyByZXF1ZXN0U2lkZUVmZmVjdHMoXG5cdFx0c2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSxcblx0XHRjb250ZXh0OiBDb250ZXh0LFxuXHRcdGdyb3VwSWQ/OiBzdHJpbmcsXG5cdFx0Zm5HZXRUYXJnZXRzPzogKHNpZGVFZmZlY3RzRGVmOiBTaWRlRWZmZWN0c1R5cGUpID0+IHsgdGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXTsgdHJpZ2dlckFjdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkIH0sXG5cdFx0aWdub3JlVHJpZ2dlckFjdGlvbnMgPSBmYWxzZVxuXHQpOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRjb25zdCBmblRyaWdnZXJDYWxsYmFja3MgPSB0aGlzLnRyaWdnZXJDYWxsYmFja3MuYmluZCh0aGlzKTtcblx0XHRjb25zdCB7IHRhcmdldHMsIHRyaWdnZXJBY3Rpb24gfSA9IGZuR2V0VGFyZ2V0c1xuXHRcdFx0PyBmbkdldFRhcmdldHMoc2lkZUVmZmVjdHMpXG5cdFx0XHQ6IHtcblx0XHRcdFx0XHR0YXJnZXRzOiBbLi4uKHNpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzID8/IFtdKSwgLi4uKHNpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMgPz8gW10pXSxcblx0XHRcdFx0XHR0cmlnZ2VyQWN0aW9uOiAhdGhpcy5fc2lkZUVmZmVjdHNTZXJ2aWNlLmlzQ29udHJvbFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzKSA/IHNpZGVFZmZlY3RzLnRyaWdnZXJBY3Rpb24gOiB1bmRlZmluZWRcblx0XHRcdCAgfTtcblx0XHRpZiAodHJpZ2dlckFjdGlvbiAmJiAhaWdub3JlVHJpZ2dlckFjdGlvbnMpIHtcblx0XHRcdHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZS5leGVjdXRlQWN0aW9uKHRyaWdnZXJBY3Rpb24sIGNvbnRleHQsIGdyb3VwSWQpO1xuXHRcdH1cblxuXHRcdGlmICh0YXJnZXRzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZVxuXHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKHRhcmdldHMsIGNvbnRleHQsIGdyb3VwSWQpXG5cdFx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIGFzeW5jKCkge1xuXHRcdFx0XHRcdHJldHVybiBmblRyaWdnZXJDYWxsYmFja3Moc2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXM/Lm1hcCgodGFyZ2V0KSA9PiB0YXJnZXQuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpIHx8IFtdKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdHRoaXMucmVnaXN0ZXJGYWlsZWRTaWRlRWZmZWN0cyhbc2lkZUVmZmVjdHNdLCBjb250ZXh0KTtcblx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBTaWRlRWZmZWN0cyBmb3IgYSBzaWRlRWZmZWN0IGV2ZW50LlxuXHQgKlxuXHQgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB0byBleGVjdXRlIHRoZSBzaWRlIGVmZmVjdCBvbiB0aGUgcGFnZSdzIGNvbnRleHQsIGJ1dCBwYWdlcyAobGlrZSB0aGUgTFIpIG1pZ2h0IG92ZXJyaWRlIHRoaXMgbWV0aG9kLlxuXHQgKlxuXHQgKiBAcGFyYW0gZXZlbnROYW1lIFNpZGVFZmZlY3RzIGV2ZW50IHdoaWNoIHdhcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIHBhdGggVGhlIHBhdGggZm9yIHdoaWNoIHRoaXMgZXZlbnQgd2FzIHRyaWdnZXJlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIG9uIFNpZGVFZmZlY3RzIHJlcXVlc3Rcblx0ICovXG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdGFzeW5jIHJlcXVlc3RTaWRlRWZmZWN0c0ZvckV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHVuZGVmaW5lZD4ge1xuXHRcdGlmICh0aGlzLmlzRGF0YVBhdGhSZWxldmFudChwYXRoKSkge1xuXHRcdFx0Ly8gdXNlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZyb20gdGhlIFNpZGVFZmZlY3RzIFNlcnZpY2Vcblx0XHRcdGNvbnN0IGNvbnRleHQgPSB0aGlzLl9maW5kUmVsZXZhbnRDb250ZXh0KHBhdGgsIHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCk7XG5cdFx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fc2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0c0ZvckV2ZW50KGV2ZW50TmFtZSwgY29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGdpdmVuIGRhdGEgcGF0aCBpcyBzaG93bi9yZWxldmFudCBvbiB0aGUgcGFnZS5cblx0ICpcblx0ICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gYmUgY2hlY2tlZFxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBkYXRhIHBhdGggaXMgc2hvd24gb24gdGhlIFVJXG5cdCAqL1xuXHRpc0RhdGFQYXRoUmVsZXZhbnQocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblxuXHRcdGlmICh0aGlzLl9jb250ZXh0SXNSZWxldmFudChwYXRoLCBjb250ZXh0KSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICEhdGhpcy5fZmluZFJlbGV2YW50Q29udGV4dChwYXRoLCBjb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBnaXZlbiBjb250ZXh0IGZpdHMgdG8gYSBnaXZlbiBwYXRoLlxuXHQgKlxuXHQgKiBUaGlzIGlzIGRvbmUgYnkgY2hlY2tpbmcgYm90aCB0aGUgbmF2aWdhdGlvbiBwYXRoIGFuZCB0aGUgY2Fub25pY2FsIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGJlIGNoZWNrZWRcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgY2hlY2tlZFxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb250ZXh0IGZpdHMgdG8gdGhlIGdpdmVuIHBhdGhcblx0ICovXG5cdF9jb250ZXh0SXNSZWxldmFudChwYXRoOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gY29udGV4dD8uZ2V0UGF0aCgpID09PSBwYXRoIHx8IGNvbnRleHQ/LmdldENhbm9uaWNhbFBhdGgoKSA9PT0gcGF0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBGaW5kIGNvbnRleHQgZm9yIGEgZ2l2ZW4gcGF0aCBieSBjaGVja2luZyBkZXBlbmRlbnQgYmluZGluZ3MuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGJlIGNoZWNrZWRcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIHBhcmVudCBjb250ZXh0XG5cdCAqIEByZXR1cm5zIENvbnRleHQgaWYgZm91bmQsIG90aGVyd2lzZSByZXR1cm5zIHVuZGVmaW5lZFxuXHQgKi9cblx0X2ZpbmRSZWxldmFudENvbnRleHQocGF0aDogc3RyaW5nLCBjb250ZXh0OiBDb250ZXh0KTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHRoaXMuX2NvbnRleHRJc1JlbGV2YW50KHBhdGgsIGNvbnRleHQpKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dDtcblx0XHR9XG5cblx0XHRjb25zdCBkZXBlbmRlbnRCaW5kaW5ncyA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXREZXBlbmRlbnRCaW5kaW5ncyhjb250ZXh0KTtcblx0XHRmb3IgKGNvbnN0IGJpbmRpbmcgb2YgZGVwZW5kZW50QmluZGluZ3MpIHtcblx0XHRcdGlmIChiaW5kaW5nLmlzQTxPRGF0YUNvbnRleHRCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9jb250ZXh0SXNSZWxldmFudChwYXRoLCBiaW5kaW5nLmdldEJvdW5kQ29udGV4dCgpKSkge1xuXHRcdFx0XHRcdHJldHVybiBiaW5kaW5nLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGJpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Y29uc3QgbGlzdENvbnRleHRzID0gYmluZGluZy5nZXRBbGxDdXJyZW50Q29udGV4dHMoKTtcblx0XHRcdFx0Zm9yIChjb25zdCBsaXN0Q29udGV4dCBvZiBsaXN0Q29udGV4dHMpIHtcblx0XHRcdFx0XHRpZiAodGhpcy5fY29udGV4dElzUmVsZXZhbnQocGF0aCwgbGlzdENvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbGlzdENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0ZXh0IHRvIGJlIHNob3duIGZvciB1c2VyIHRvIGluZGljYXRlIGRhdGEgcmVmcmVzaC5cblx0ICpcblx0ICogVGhpcyBpcyBjdXJyZW50bHkgb25seSB1c2VkIGJ5IFNpZGVFZmZlY3RzIGV2ZW50cy4gUGFnZXMgKGxpa2UgdGhlIExSKSBtaWdodCBvdmVycmlkZSB0aGlzIG1ldGhvZC5cblx0ICpcblx0ICogQHJldHVybnMgVGV4dCB0byBiZSBzaG93biB0byB0aGUgdXNlciBpbiBjYXNlIG9mIGEgZGF0YSByZWZyZXNoXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkKVxuXHRnZXREYXRhUmVmcmVzaFRleHQoKTogc3RyaW5nIHtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0cmV0dXJuIHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfU0VSVkVSX0VWRU5UU19ORVdfREFUQV9JVEVNXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5vdGlmeSB0aGUgdXNlciB0aGF0IGRhdGEgd2FzIHJlZnJlc2hlZC5cblx0ICpcblx0ICogVGhpcyBpcyBjdXJyZW50bHkgb25seSB1c2VkIGJ5IFNpZGVFZmZlY3RzIGV2ZW50cy5cblx0ICovXG5cblx0bm90aWZ5RGF0YVJlZnJlc2goKTogdm9pZCB7XG5cdFx0TWVzc2FnZVRvYXN0LnNob3codGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkuX3NpZGVFZmZlY3RzLmdldERhdGFSZWZyZXNoVGV4dCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBc2sgdGhlIHVzZXIgZm9yIGNvbmZpcm1hdGlvbiBvZiBhIGRhdGEgcmVmcmVzaC5cblx0ICpcblx0ICogVGhpcyBpcyBjdXJyZW50bHkgb25seSB1c2VkIGJ5IFNpZGVFZmZlY3RzIGV2ZW50cy5cblx0ICpcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIGlmIHRoZSB1c2VyIGNvbmZpcm1zIGFuZCByZWplY3RzIGlmIHRoZSB1c2VyIGNhbmNlbHMuXG5cdCAqL1xuXHRhc3luYyBjb25maXJtRGF0YVJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmlzQ29uZmlybWF0aW9uRGlhbG9nT3Blbikge1xuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0Y29uc3QgdGV4dCA9IHRoaXMuZ2V0RGF0YVJlZnJlc2hUZXh0KCk7XG5cdFx0XHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKHRoaXMuZ2V0VmlldygpKTtcblxuXHRcdFx0XHRjb25zdCBjb25maXJtYXRpb25EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHR0aXRsZTogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiV0FSTklOR1wiKSxcblx0XHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoeyB0ZXh0OiB0ZXh0IH0pLFxuXHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX1JFRlJFU0hcIiksXG5cdFx0XHRcdFx0XHRwcmVzczogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25maXJtYXRpb25EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRcdFx0cHJlc3M6ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uZmlybWF0aW9uRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdGFmdGVyQ2xvc2U6ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdGNvbmZpcm1hdGlvbkRpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHR0aGlzLmlzQ29uZmlybWF0aW9uRGlhbG9nT3BlbiA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbmZpcm1hdGlvbkRpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0dGhpcy5pc0NvbmZpcm1hdGlvbkRpYWxvZ09wZW4gPSB0cnVlO1xuXHRcdFx0XHRjb25maXJtYXRpb25EaWFsb2cub3BlbigpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgbXVsdGlwbGUgU2lkZUVmZmVjdHMgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gbXVsdGlTaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGdyb3VwIGlkIG9mIHRoZSBiYXRjaFxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyByZXF1ZXN0IG9uIFNBUFVJNSBjb250ZXh0XG5cdCAqL1xuXHRhc3luYyByZXF1ZXN0TXVsdGlwbGVTaWRlRWZmZWN0cyhtdWx0aVNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGVbXSwgY29udGV4dDogQ29udGV4dCwgZ3JvdXBJZD86IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdGxldCBwcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdFx0bGV0IG5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdFx0Y29uc3QgYWN0aW9ucyA9IG11bHRpU2lkZUVmZmVjdHMucmVkdWNlKChhY3Rpb25zLCBzaWRlRWZmZWN0cykgPT4ge1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdEFjdGlvbiA9IChzaWRlRWZmZWN0cyBhcyBPRGF0YVNpZGVFZmZlY3RzVHlwZSkudHJpZ2dlckFjdGlvbjtcblx0XHRcdGlmIChzaWRlRWZmZWN0QWN0aW9uKSB7XG5cdFx0XHRcdGFjdGlvbnMucHVzaChzaWRlRWZmZWN0QWN0aW9uKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhY3Rpb25zO1xuXHRcdH0sIFtdIGFzIHN0cmluZ1tdKTtcblx0XHRjb25zdCBmbnRyaWdnZXJDYWxsYmFja3MgPSB0aGlzLnRyaWdnZXJDYWxsYmFja3MuYmluZCh0aGlzKTtcblxuXHRcdGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcblx0XHRcdHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZS5leGVjdXRlQWN0aW9uKGFjdGlvbiwgY29udGV4dCwgZ3JvdXBJZCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBzaWRlRWZmZWN0cyBvZiBtdWx0aVNpZGVFZmZlY3RzKSB7XG5cdFx0XHRwcm9wZXJ0aWVzID0gKHNpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMgPz8gW10pLnJlZHVjZSgobXlTZXQsIHByb3BlcnR5KSA9PiBteVNldC5hZGQocHJvcGVydHkpLCBwcm9wZXJ0aWVzKTtcblx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gKHNpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzID8/IFtdKS5yZWR1Y2UoXG5cdFx0XHRcdChteVNldCwgbmF2aWdhdGlvblByb3BlcnR5KSA9PiBteVNldC5hZGQobmF2aWdhdGlvblByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSxcblx0XHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXNcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZVxuXHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhcblx0XHRcdFx0W1xuXHRcdFx0XHRcdC4uLkFycmF5LmZyb20ocHJvcGVydGllcyksXG5cdFx0XHRcdFx0Li4uQXJyYXkuZnJvbShuYXZpZ2F0aW9uUHJvcGVydGllcykubWFwKChuYXZpZ2F0aW9uUHJvcGVydHkpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBuYXZpZ2F0aW9uUHJvcGVydHkgfTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRdLFxuXHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRncm91cElkXG5cdFx0XHQpXG5cdFx0XHQudGhlbihhc3luYyBmdW5jdGlvbiBhc3luYygpIHtcblx0XHRcdFx0cmV0dXJuIGZudHJpZ2dlckNhbGxiYWNrcyhBcnJheS5mcm9tKG5hdmlnYXRpb25Qcm9wZXJ0aWVzKSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHR0aGlzLnJlZ2lzdGVyRmFpbGVkU2lkZUVmZmVjdHMobXVsdGlTaWRlRWZmZWN0cywgY29udGV4dCk7XG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBmYWlsZWQgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFJlZ2lzdGVyZWQgU2lkZUVmZmVjdHMgcmVxdWVzdHMgdGhhdCBoYXZlIGZhaWxlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyBnZXRSZWdpc3RlcmVkRmFpbGVkUmVxdWVzdHMoKTogRmFpbGVkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdHJldHVybiB0aGlzLl9yZWdpc3RlcmVkRmFpbGVkU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBTaWRlRWZmZWN0cyB0byB0aGUgcXVldWUgb2YgdGhlIGZhaWxlZCBTaWRlRWZmZWN0c1xuXHQgKiBUaGUgU2lkZUVmZmVjdHMgYXJlIHJldHJpZ2dlcmVkIG9uIHRoZSBuZXh0IHJlcXVlc3Qgb24gdGhlIHNhbWUgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG11bHRpU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgdGhhdCBuZWVkIHRvIGJlIHJldHJpZ2dlcmVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgaGF2ZSBmYWlsZWRcblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cmVnaXN0ZXJGYWlsZWRTaWRlRWZmZWN0cyhtdWx0aVNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGVbXSwgY29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRleHRQYXRoID0gY29udGV4dC5nZXRQYXRoKCk7XG5cdFx0dGhpcy5fcmVnaXN0ZXJlZEZhaWxlZFNpZGVFZmZlY3RzW2NvbnRleHRQYXRoXSA9IHRoaXMuX3JlZ2lzdGVyZWRGYWlsZWRTaWRlRWZmZWN0c1tjb250ZXh0UGF0aF0gPz8gW107XG5cdFx0Zm9yIChjb25zdCBzaWRlRWZmZWN0cyBvZiBtdWx0aVNpZGVFZmZlY3RzKSB7XG5cdFx0XHRjb25zdCBpc05vdEFscmVhZHlMaXN0ZWQgPSB0aGlzLl9yZWdpc3RlcmVkRmFpbGVkU2lkZUVmZmVjdHNbY29udGV4dFBhdGhdLmV2ZXJ5KFxuXHRcdFx0XHQobUZhaWxlZFNpZGVFZmZlY3RzKSA9PiBzaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWUgIT09IG1GYWlsZWRTaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdCk7XG5cdFx0XHRpZiAoaXNOb3RBbHJlYWR5TGlzdGVkKSB7XG5cdFx0XHRcdHRoaXMuX3JlZ2lzdGVyZWRGYWlsZWRTaWRlRWZmZWN0c1tjb250ZXh0UGF0aF0ucHVzaChzaWRlRWZmZWN0cyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgU2lkZUVmZmVjdHMgaW4gdGhlIHF1ZXVlIG9mIHRoZSBmYWlsZWQgU2lkZUVmZmVjdHMgZm9yIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRQYXRoIENvbnRleHQgcGF0aCB3aGVyZSBTaWRlRWZmZWN0cyBoYXZlIGZhaWxlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHVucmVnaXN0ZXJGYWlsZWRTaWRlRWZmZWN0c0ZvckFDb250ZXh0KGNvbnRleHRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRkZWxldGUgdGhpcy5fcmVnaXN0ZXJlZEZhaWxlZFNpZGVFZmZlY3RzW2NvbnRleHRQYXRoXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGVzIFNpZGVFZmZlY3RzIHRvIHRoZSBxdWV1ZSBvZiB0aGUgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNGdWxseVF1YWxpZmllZE5hbWUgU2lkZUVmZmVjdHMgdGhhdCBuZWVkIHRvIGJlIHJldHJpZ2dlcmVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgaGF2ZSBmYWlsZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHR1bnJlZ2lzdGVyRmFpbGVkU2lkZUVmZmVjdHMoc2lkZUVmZmVjdHNGdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZywgY29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRleHRQYXRoID0gY29udGV4dC5nZXRQYXRoKCk7XG5cdFx0aWYgKHRoaXMuX3JlZ2lzdGVyZWRGYWlsZWRTaWRlRWZmZWN0c1tjb250ZXh0UGF0aF0/Lmxlbmd0aCkge1xuXHRcdFx0dGhpcy5fcmVnaXN0ZXJlZEZhaWxlZFNpZGVFZmZlY3RzW2NvbnRleHRQYXRoXSA9IHRoaXMuX3JlZ2lzdGVyZWRGYWlsZWRTaWRlRWZmZWN0c1tjb250ZXh0UGF0aF0uZmlsdGVyKFxuXHRcdFx0XHQoc2lkZUVmZmVjdHMpID0+IHNpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZSAhPT0gc2lkZUVmZmVjdHNGdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgU2lkZUVmZmVjdHMgdG8gdGhlIHF1ZXVlIG9mIGEgRmllbGRHcm91cFxuXHQgKiBUaGUgU2lkZUVmZmVjdHMgYXJlIHRyaWdnZXJlZCB3aGVuIGV2ZW50IHJlbGF0ZWQgdG8gdGhlIGZpZWxkIGdyb3VwIGNoYW5nZSBpcyBmaXJlZC5cblx0ICpcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzUHJvcGVydGllcyBTaWRlRWZmZWN0cyBwcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBmaWVsZEdyb3VwUHJlUmVxdWlzaXRlIFByb21pc2UgdG8gZnVsbGZpbCBiZWZvcmUgZXhlY3V0aW5nIHRoZSBTaWRlRWZmZWN0c1xuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRyZWdpc3RlckZpZWxkR3JvdXBTaWRlRWZmZWN0cyhzaWRlRWZmZWN0c1Byb3BlcnRpZXM6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZSwgZmllbGRHcm91cFByZVJlcXVpc2l0ZT86IFByb21pc2U8dW5rbm93bj4pOiB2b2lkIHtcblx0XHRjb25zdCBpZCA9IHRoaXMuX2dldEZpZWxkR3JvdXBJbmRleChzaWRlRWZmZWN0c1Byb3BlcnRpZXMubmFtZSwgc2lkZUVmZmVjdHNQcm9wZXJ0aWVzLmNvbnRleHQpO1xuXHRcdGlmICghdGhpcy5fcmVnaXN0ZXJlZEZpZWxkR3JvdXBNYXBbaWRdKSB7XG5cdFx0XHR0aGlzLl9yZWdpc3RlcmVkRmllbGRHcm91cE1hcFtpZF0gPSB7XG5cdFx0XHRcdHByb21pc2U6IGZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG5cdFx0XHRcdHNpZGVFZmZlY3RQcm9wZXJ0eTogc2lkZUVmZmVjdHNQcm9wZXJ0aWVzXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGVzIFNpZGVFZmZlY3RzIHRvIHRoZSBxdWV1ZSBvZiBhIEZpZWxkR3JvdXAuXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1Byb3BlcnRpZXMgU2lkZUVmZmVjdHMgcHJvcGVydGllc1xuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHR1bnJlZ2lzdGVyRmllbGRHcm91cFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzUHJvcGVydGllczogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250ZXh0LCBuYW1lIH0gPSBzaWRlRWZmZWN0c1Byb3BlcnRpZXM7XG5cdFx0Y29uc3QgaWQgPSB0aGlzLl9nZXRGaWVsZEdyb3VwSW5kZXgobmFtZSwgY29udGV4dCk7XG5cdFx0ZGVsZXRlIHRoaXMuX3JlZ2lzdGVyZWRGaWVsZEdyb3VwTWFwW2lkXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSByZWdpc3RlcmVkIFNpZGVFZmZlY3RzIGludG8gdGhlIHF1ZXVlIGZvciBhIGZpZWxkIGdyb3VwIGlkLlxuXHQgKlxuXHQgKiBAcGFyYW0gZmllbGRHcm91cElkIEZpZWxkIGdyb3VwIGlkXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHJlZ2lzdGVyZWQgU2lkZUVmZmVjdHMgYW5kIHRoZWlyIHByb21pc2Vcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRSZWdpc3RlcmVkU2lkZUVmZmVjdHNGb3JGaWVsZEdyb3VwKGZpZWxkR3JvdXBJZDogc3RyaW5nKTogRmllbGRHcm91cFNpZGVFZmZlY3RUeXBlW10ge1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzID0gW107XG5cdFx0Zm9yIChjb25zdCByZWdpc3RyeUluZGV4IG9mIE9iamVjdC5rZXlzKHRoaXMuX3JlZ2lzdGVyZWRGaWVsZEdyb3VwTWFwKSkge1xuXHRcdFx0aWYgKHJlZ2lzdHJ5SW5kZXguc3RhcnRzV2l0aChgJHtmaWVsZEdyb3VwSWR9X2ApKSB7XG5cdFx0XHRcdHNpZGVFZmZlY3RzLnB1c2godGhpcy5fcmVnaXN0ZXJlZEZpZWxkR3JvdXBNYXBbcmVnaXN0cnlJbmRleF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBhIHN0YXR1cyBpbmRleC5cblx0ICpcblx0ICogQHBhcmFtIGZpZWxkR3JvdXBJZCBUaGUgZmllbGQgZ3JvdXAgaWRcblx0ICogQHBhcmFtIGNvbnRleHQgU0FQVUk1IENvbnRleHRcblx0ICogQHJldHVybnMgSW5kZXhcblx0ICovXG5cdHByaXZhdGUgX2dldEZpZWxkR3JvdXBJbmRleChmaWVsZEdyb3VwSWQ6IHN0cmluZywgY29udGV4dDogQ29udGV4dCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGAke2ZpZWxkR3JvdXBJZH1fJHtjb250ZXh0LmdldFBhdGgoKX1gO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgc2lkZUVmZmVjdHMgcHJvcGVydGllcyBmcm9tIGEgZmllbGQgZ3JvdXAgaWRcblx0ICogVGhlIHByb3BlcnRpZXMgYXJlOlxuXHQgKiAgLSBuYW1lXG5cdCAqICAtIHNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogIC0gc2lkZUVmZmVjdHMgZW50aXR5IHR5cGVcblx0ICogIC0gaW1tZWRpYXRlIHNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAcGFyYW0gZmllbGRHcm91cElkXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIHByb3BlcnRpZXNcblx0ICovXG5cdHByaXZhdGUgX2dldFNpZGVFZmZlY3RzUHJvcGVydHlGb3JGaWVsZEdyb3VwKGZpZWxkR3JvdXBJZDogc3RyaW5nKToge1xuXHRcdHNpZGVFZmZlY3RFbnRpdHlUeXBlOiBzdHJpbmc7XG5cdFx0bmFtZTogc3RyaW5nO1xuXHRcdGltbWVkaWF0ZTogYm9vbGVhbjtcblx0XHRzaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQ7XG5cdH0ge1xuXHRcdC8qKlxuXHRcdCAqIHN0cmluZyBcIiQkSW1tZWRpYXRlUmVxdWVzdFwiIGlzIGFkZGVkIHRvIHRoZSBTaWRlRWZmZWN0cyBuYW1lIGR1cmluZyB0ZW1wbGF0aW5nIHRvIGtub3dcblx0XHQgKiBpZiB0aGlzIFNpZGVFZmZlY3RzIG11c3QgYmUgaW1tZWRpYXRlbHkgZXhlY3V0ZWQgcmVxdWVzdGVkIChvbiBmaWVsZCBjaGFuZ2UpIG9yIG11c3Rcblx0XHQgKiBiZSBkZWZlcnJlZCAob24gZmllbGQgZ3JvdXAgZm9jdXMgb3V0KVxuXHRcdCAqXG5cdFx0ICovXG5cdFx0Y29uc3QgaW1tZWRpYXRlID0gZmllbGRHcm91cElkLmluY2x1ZGVzKElNTUVESUFURV9SRVFVRVNUKSxcblx0XHRcdG5hbWUgPSBmaWVsZEdyb3VwSWQucmVwbGFjZShJTU1FRElBVEVfUkVRVUVTVCwgXCJcIiksXG5cdFx0XHRzaWRlRWZmZWN0UGFydHMgPSBuYW1lLnNwbGl0KFwiI1wiKSxcblx0XHRcdHNpZGVFZmZlY3RFbnRpdHlUeXBlID0gc2lkZUVmZmVjdFBhcnRzWzBdLFxuXHRcdFx0c2lkZUVmZmVjdFBhdGggPSBgJHtzaWRlRWZmZWN0RW50aXR5VHlwZX1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNpZGVFZmZlY3RzJHtcblx0XHRcdFx0c2lkZUVmZmVjdFBhcnRzLmxlbmd0aCA9PT0gMiA/IGAjJHtzaWRlRWZmZWN0UGFydHNbMV19YCA6IFwiXCJcblx0XHRcdH1gLFxuXHRcdFx0c2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlIHwgdW5kZWZpbmVkID1cblx0XHRcdFx0dGhpcy5fc2lkZUVmZmVjdHNTZXJ2aWNlLmdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoc2lkZUVmZmVjdEVudGl0eVR5cGUpPy5bc2lkZUVmZmVjdFBhdGhdO1xuXHRcdHJldHVybiB7IG5hbWUsIGltbWVkaWF0ZSwgc2lkZUVmZmVjdHMsIHNpZGVFZmZlY3RFbnRpdHlUeXBlIH07XG5cdH1cblxuXHQvKipcblx0ICogTWFuYWdlcyB0aGUgU2lkZUVmZmVjdHMgZm9yIGEgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBmaWVsZCBGaWVsZCBjb250cm9sXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVsYXRlZCB0byB0aGUgcmVxdWVzdGVkIGltbWVkaWF0ZSBzaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBfbWFuYWdlU2lkZUVmZmVjdHNGcm9tRmllbGQoZmllbGQ6IENvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBzaWRlRWZmZWN0c01hcCA9IHRoaXMuZ2V0RmllbGRTaWRlRWZmZWN0c01hcChmaWVsZCk7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzVG9FeGVjdXRlOiBSZWNvcmQ8c3RyaW5nLCB7IHNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGVbXTsgY29udGV4dDogQ29udGV4dCB9PiA9IHt9O1xuXHRcdFx0Y29uc3QgYWRkU2lkZUVmZmVjdHMgPSAoY29udGV4dDogQ29udGV4dCwgc2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSk6IHZvaWQgPT4ge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0UGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0XHRpZiAoc2lkZUVmZmVjdHNUb0V4ZWN1dGVbY29udGV4dFBhdGhdKSB7XG5cdFx0XHRcdFx0c2lkZUVmZmVjdHNUb0V4ZWN1dGVbY29udGV4dFBhdGhdLnNpZGVFZmZlY3RzLnB1c2goc2lkZUVmZmVjdHMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNpZGVFZmZlY3RzVG9FeGVjdXRlW2NvbnRleHRQYXRoXSA9IHtcblx0XHRcdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogW3NpZGVFZmZlY3RzXVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdC8vR2V0IEltbWVkaWF0ZSBTaWRlRWZmZWN0c1xuXHRcdFx0Zm9yIChjb25zdCBzaWRlRWZmZWN0c1Byb3BlcnRpZXMgb2YgT2JqZWN0LnZhbHVlcyhzaWRlRWZmZWN0c01hcCkuZmlsdGVyKFxuXHRcdFx0XHQoc2lkZUVmZmVjdHNQcm9wZXJ0aWVzKSA9PiBzaWRlRWZmZWN0c1Byb3BlcnRpZXMuaW1tZWRpYXRlID09PSB0cnVlXG5cdFx0XHQpKSB7XG5cdFx0XHRcdC8vIGlmIHRoaXMgU2lkZUVmZmVjdHMgaXMgcmVjb3JkZWQgYXMgZmFpbGVkIFNpZGVFZmZlY3RzLCBuZWVkIHRvIHJlbW92ZSBpdC5cblx0XHRcdFx0dGhpcy51bnJlZ2lzdGVyRmFpbGVkU2lkZUVmZmVjdHMoc2lkZUVmZmVjdHNQcm9wZXJ0aWVzLnNpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZSwgc2lkZUVmZmVjdHNQcm9wZXJ0aWVzLmNvbnRleHQpO1xuXHRcdFx0XHRhZGRTaWRlRWZmZWN0cyhzaWRlRWZmZWN0c1Byb3BlcnRpZXMuY29udGV4dCwgc2lkZUVmZmVjdHNQcm9wZXJ0aWVzLnNpZGVFZmZlY3RzKTtcblx0XHRcdH1cblxuXHRcdFx0Ly9SZXBsYXkgZmFpbGVkIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gdGhlIHZpZXcgb3IgRmllbGRcblx0XHRcdGZvciAoY29uc3QgY29udGV4dCBvZiBbZmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKSwgdGhpcy5fdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpXS5maWx0ZXIoXG5cdFx0XHRcdChjb250ZXh0KTogY29udGV4dCBpcyBDb250ZXh0ID0+ICEhY29udGV4dFxuXHRcdFx0KSkge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0UGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0XHRjb25zdCBmYWlsZWRTaWRlRWZmZWN0cyA9IHRoaXMuX3JlZ2lzdGVyZWRGYWlsZWRTaWRlRWZmZWN0c1tjb250ZXh0UGF0aF0gPz8gW107XG5cdFx0XHRcdHRoaXMudW5yZWdpc3RlckZhaWxlZFNpZGVFZmZlY3RzRm9yQUNvbnRleHQoY29udGV4dFBhdGgpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGZhaWxlZFNpZGVFZmZlY3Qgb2YgZmFpbGVkU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0XHRhZGRTaWRlRWZmZWN0cyhjb250ZXh0LCBmYWlsZWRTaWRlRWZmZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRcdE9iamVjdC52YWx1ZXMoc2lkZUVmZmVjdHNUb0V4ZWN1dGUpLm1hcChhc3luYyAoc2lkZUVmZmVjdHNQcm9wZXJ0aWVzKSA9PlxuXHRcdFx0XHRcdHNpZGVFZmZlY3RzUHJvcGVydGllcy5zaWRlRWZmZWN0cy5sZW5ndGggPT09IDFcblx0XHRcdFx0XHRcdD8gdGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMoc2lkZUVmZmVjdHNQcm9wZXJ0aWVzLnNpZGVFZmZlY3RzWzBdLCBzaWRlRWZmZWN0c1Byb3BlcnRpZXMuY29udGV4dClcblx0XHRcdFx0XHRcdDogdGhpcy5yZXF1ZXN0TXVsdGlwbGVTaWRlRWZmZWN0cyhzaWRlRWZmZWN0c1Byb3BlcnRpZXMuc2lkZUVmZmVjdHMsIHNpZGVFZmZlY3RzUHJvcGVydGllcy5jb250ZXh0KVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdExvZy5kZWJ1ZyhgRXJyb3Igd2hpbGUgbWFuYWdpbmcgRmllbGQgU2lkZUVmZmVjdHNgLCBlIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgdHJpZ2dlckNhbGxiYWNrcyhuYXZpZ2F0aW9uOiBzdHJpbmdbXSk6IFByb21pc2U8dW5kZWZpbmVkPiB7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRuYXZpZ2F0aW9uLm1hcCgobmF2KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHJlZ2lzdGVyQ2FsbEJhY2sgPSB0aGlzLl9zaWRlRWZmZWN0c1NlcnZpY2UuZ2V0UmVnaXN0ZXJlZENhbGxiYWNrKG5hdik7XG5cdFx0XHRcdGlmIChyZWdpc3RlckNhbGxCYWNrKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJlZ2lzdGVyQ2FsbEJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIFNpZGVFZmZlY3RzIGZvciBhIGZpZWxkR3JvdXAuXG5cdCAqXG5cdCAqIEBwYXJhbSBmaWVsZEdyb3VwU2lkZUVmZmVjdHMgRmllbGQgZ3JvdXAgc2lkZUVmZmVjdHMgd2l0aCBpdHMgcHJvbWlzZVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJldHVybmluZyB0cnVlIGlmIHRoZSBTaWRlRWZmZWN0cyBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIF9yZXF1ZXN0RmllbGRHcm91cFNpZGVFZmZlY3RzKGZpZWxkR3JvdXBTaWRlRWZmZWN0czogRmllbGRHcm91cFNpZGVFZmZlY3RUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy51bnJlZ2lzdGVyRmllbGRHcm91cFNpZGVFZmZlY3RzKGZpZWxkR3JvdXBTaWRlRWZmZWN0cy5zaWRlRWZmZWN0UHJvcGVydHkpO1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCBmaWVsZEdyb3VwU2lkZUVmZmVjdHMucHJvbWlzZTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRMb2cuZGVidWcoYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgRmllbGRHcm91cCBTaWRlRWZmZWN0c2AsIGUgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHsgc2lkZUVmZmVjdHMsIGNvbnRleHQsIG5hbWUgfSA9IGZpZWxkR3JvdXBTaWRlRWZmZWN0cy5zaWRlRWZmZWN0UHJvcGVydHk7XG5cdFx0XHRpZiAodGhpcy5pc0ZpZWxkR3JvdXBWYWxpZChuYW1lLCBjb250ZXh0KSkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0cywgY29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0TG9nLmRlYnVnKGBFcnJvciB3aGlsZSBleGVjdXRpbmcgRmllbGRHcm91cCBTaWRlRWZmZWN0c2AsIGUgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2F2ZXMgdGhlIHZhbGlkYXRpb24gc3RhdHVzIG9mIHByb3BlcnRpZXMgcmVsYXRlZCB0byBhIGZpZWxkIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSBmaWVsZCBUaGUgZmllbGQgY29udHJvbFxuXHQgKiBAcGFyYW0gc3VjY2VzcyBTdGF0dXMgb2YgdGhlIGZpZWxkIHZhbGlkYXRpb25cblx0ICovXG5cdHByaXZhdGUgX3NhdmVGaWVsZFByb3BlcnRpZXNTdGF0dXMoZmllbGQ6IENvbnRyb2wsIHN1Y2Nlc3M6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCBzaWRlRWZmZWN0c01hcCA9IHRoaXMuZ2V0RmllbGRTaWRlRWZmZWN0c01hcChmaWVsZCk7XG5cdFx0T2JqZWN0LmtleXMoc2lkZUVmZmVjdHNNYXApLmZvckVhY2goKGtleSkgPT4ge1xuXHRcdFx0Y29uc3QgeyBuYW1lLCBpbW1lZGlhdGUsIGNvbnRleHQgfSA9IHNpZGVFZmZlY3RzTWFwW2tleV07XG5cdFx0XHRpZiAoIWltbWVkaWF0ZSkge1xuXHRcdFx0XHRjb25zdCBpZCA9IHRoaXMuX2dldEZpZWxkR3JvdXBJbmRleChuYW1lLCBjb250ZXh0KTtcblx0XHRcdFx0aWYgKHN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5fZmllbGRHcm91cEludmFsaWRpdHlbaWRdPy5bZmllbGQuZ2V0SWQoKV07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5fZmllbGRHcm91cEludmFsaWRpdHlbaWRdID0ge1xuXHRcdFx0XHRcdFx0Li4udGhpcy5fZmllbGRHcm91cEludmFsaWRpdHlbaWRdLFxuXHRcdFx0XHRcdFx0Li4ueyBbZmllbGQuZ2V0SWQoKV06IHRydWUgfVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBTaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb247XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztFQW1EQSxNQUFNQSxpQkFBaUIsR0FBRyxvQkFBb0I7RUFBQyxJQUV6Q0MsOEJBQThCLFdBRG5DQyxjQUFjLENBQUMsOENBQThDLENB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
|
|
739
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJTU1FRElBVEVfUkVRVUVTVCIsIlNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiIsImRlZmluZVVJNUNsYXNzIiwibWV0aG9kT3ZlcnJpZGUiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkluc3RlYWQiLCJwcml2YXRlRXh0ZW5zaW9uIiwib25Jbml0IiwiX3ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9wYWdlQ29tcG9uZW50IiwiQ29tcG9uZW50IiwiZ2V0T3duZXJDb21wb25lbnRGb3IiLCJfc2lkZUVmZmVjdHNTZXJ2aWNlIiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJfcmVnaXN0ZXJlZEZpZWxkR3JvdXBNYXAiLCJfZmllbGRHcm91cEludmFsaWRpdHkiLCJfcmVnaXN0ZXJlZEZhaWxlZFNpZGVFZmZlY3RzIiwiYWRkQ29udHJvbFNpZGVFZmZlY3RzIiwiZW50aXR5VHlwZSIsImNvbnRyb2xTaWRlRWZmZWN0cyIsInJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyIsImNvbnRyb2wiLCJjb250cm9sSWQiLCJpc0EiLCJnZXRJZCIsImdldENvbnRleHRGb3JTaWRlRWZmZWN0cyIsImJpbmRpbmdDb250ZXh0Iiwic2lkZUVmZmVjdEVudGl0eVR5cGUiLCJjb250ZXh0Rm9yU2lkZUVmZmVjdHMiLCJnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQiLCJnZXRCaW5kaW5nIiwiZ2V0Q29udGV4dCIsInVuZGVmaW5lZCIsImdldEZpZWxkU2lkZUVmZmVjdHNNYXAiLCJmaWVsZCIsInNpZGVFZmZlY3RzTWFwIiwiZW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0IiwiY29udGV4dFBhdGgiLCJnZXRDb250ZXh0UGF0aCIsImZpZWxkR3JvdXBJZHMiLCJnZXRGaWVsZEdyb3VwSWRzIiwiY29udGV4dERhdGFNb2RlbE9iamVjdCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0c0ZvclRhcmdldFBhdGgiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsImdldFNpZGVFZmZlY3RzTWFwRm9yRmllbGRHcm91cHMiLCJnZXRCaW5kaW5nQ29udGV4dCIsInZpZXdFbnRpdHlUeXBlIiwidGFyZ2V0RW50aXR5VHlwZSIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImZpZWxkUGF0aCIsImdldFRhcmdldFByb3BlcnR5IiwiY29udGV4dCIsImNvbnRyb2xTaWRlRWZmZWN0c0VudGl0eVR5cGUiLCJnZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsInNpZGVFZmZlY3RzTmFtZSIsIm9Db250cm9sU2lkZUVmZmVjdHMiLCJzb3VyY2VQcm9wZXJ0aWVzIiwiaW5jbHVkZXMiLCJuYW1lIiwiaW1tZWRpYXRlIiwic2lkZUVmZmVjdHMiLCJmaWVsZENvbnRleHQiLCJtU2lkZUVmZmVjdHNNYXAiLCJmaWVsZEdyb3VwSWQiLCJfZ2V0U2lkZUVmZmVjdHNQcm9wZXJ0eUZvckZpZWxkR3JvdXAiLCJvQ29udGV4dCIsImNsZWFyRmllbGRHcm91cHNWYWxpZGl0eSIsImlzRmllbGRHcm91cFZhbGlkIiwiaWQiLCJfZ2V0RmllbGRHcm91cEluZGV4IiwibGVuZ3RoIiwiZGF0YSIsIm1ldGFNb2RlbCIsInZpZXdCaW5kaW5nUGF0aCIsImdldFBhdGgiLCJ2aWV3TWV0YU1vZGVsUGF0aCIsImdldE1ldGFQYXRoIiwicmVwbGFjZSIsInByZXBhcmVEZWZlcnJlZFNpZGVFZmZlY3RzRm9yRmllbGQiLCJldmVudCIsImZpZWxkVmFsaWRpdHkiLCJmaWVsZEdyb3VwUHJlUmVxdWlzaXRlIiwiZ2V0U291cmNlIiwiX3NhdmVGaWVsZFByb3BlcnRpZXNTdGF0dXMiLCJmaWx0ZXIiLCJzaWRlRWZmZWN0c1Byb3BlcnRpZXMiLCJyZWdpc3RlckZpZWxkR3JvdXBTaWRlRWZmZWN0cyIsImhhbmRsZUZpZWxkQ2hhbmdlIiwic2tpcERlZmVycmVkUmVnaXN0cmF0aW9uIiwiX21hbmFnZVNpZGVFZmZlY3RzRnJvbUZpZWxkIiwiaGFuZGxlRmllbGRHcm91cENoYW5nZSIsImdldFBhcmFtZXRlciIsImZpZWxkR3JvdXBzU2lkZUVmZmVjdHMiLCJyZWR1Y2UiLCJyZXN1bHRzIiwiY29uY2F0IiwiZ2V0UmVnaXN0ZXJlZFNpZGVFZmZlY3RzRm9yRmllbGRHcm91cCIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJmaWVsZEdyb3VwU2lkZUVmZmVjdHMiLCJfcmVxdWVzdEZpZWxkR3JvdXBTaWRlRWZmZWN0cyIsImNhdGNoIiwiZXJyb3IiLCJMb2ciLCJkZWJ1ZyIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImdyb3VwSWQiLCJmbkdldFRhcmdldHMiLCJpZ25vcmVUcmlnZ2VyQWN0aW9ucyIsImZuVHJpZ2dlckNhbGxiYWNrcyIsInRyaWdnZXJDYWxsYmFja3MiLCJiaW5kIiwidGFyZ2V0cyIsInRyaWdnZXJBY3Rpb24iLCJ0YXJnZXRFbnRpdGllcyIsInRhcmdldFByb3BlcnRpZXMiLCJpc0NvbnRyb2xTaWRlRWZmZWN0cyIsImV4ZWN1dGVBY3Rpb24iLCJ0aGVuIiwiYXN5bmMiLCJ0YXJnZXQiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInJlZ2lzdGVyRmFpbGVkU2lkZUVmZmVjdHMiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JFdmVudCIsImV2ZW50TmFtZSIsInBhdGgiLCJpc0RhdGFQYXRoUmVsZXZhbnQiLCJfZmluZFJlbGV2YW50Q29udGV4dCIsIl9jb250ZXh0SXNSZWxldmFudCIsImdldENhbm9uaWNhbFBhdGgiLCJkZXBlbmRlbnRCaW5kaW5ncyIsImdldERlcGVuZGVudEJpbmRpbmdzIiwiYmluZGluZyIsImdldEJvdW5kQ29udGV4dCIsImxpc3RDb250ZXh0cyIsImdldEFsbEN1cnJlbnRDb250ZXh0cyIsImxpc3RDb250ZXh0IiwiZ2V0RGF0YVJlZnJlc2hUZXh0IiwicmVzb3VyY2VNb2RlbCIsImdldFJlc291cmNlTW9kZWwiLCJnZXRUZXh0Iiwibm90aWZ5RGF0YVJlZnJlc2giLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0Q29udHJvbGxlciIsIl9zaWRlRWZmZWN0cyIsImNvbmZpcm1EYXRhUmVmcmVzaCIsImlzQ29uZmlybWF0aW9uRGlhbG9nT3BlbiIsInJlc29sdmUiLCJyZWplY3QiLCJ0ZXh0IiwiY29uZmlybWF0aW9uRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJwcmVzcyIsImNsb3NlIiwiZW5kQnV0dG9uIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsInJlcXVlc3RNdWx0aXBsZVNpZGVFZmZlY3RzIiwibXVsdGlTaWRlRWZmZWN0cyIsInByb3BlcnRpZXMiLCJTZXQiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsImFjdGlvbnMiLCJzaWRlRWZmZWN0QWN0aW9uIiwicHVzaCIsImZudHJpZ2dlckNhbGxiYWNrcyIsImFjdGlvbiIsIm15U2V0IiwicHJvcGVydHkiLCJhZGQiLCJuYXZpZ2F0aW9uUHJvcGVydHkiLCJBcnJheSIsImZyb20iLCJnZXRSZWdpc3RlcmVkRmFpbGVkUmVxdWVzdHMiLCJpc05vdEFscmVhZHlMaXN0ZWQiLCJldmVyeSIsIm1GYWlsZWRTaWRlRWZmZWN0cyIsInVucmVnaXN0ZXJGYWlsZWRTaWRlRWZmZWN0c0ZvckFDb250ZXh0IiwidW5yZWdpc3RlckZhaWxlZFNpZGVFZmZlY3RzIiwic2lkZUVmZmVjdHNGdWxseVF1YWxpZmllZE5hbWUiLCJwcm9taXNlIiwic2lkZUVmZmVjdFByb3BlcnR5IiwidW5yZWdpc3RlckZpZWxkR3JvdXBTaWRlRWZmZWN0cyIsInJlZ2lzdHJ5SW5kZXgiLCJzdGFydHNXaXRoIiwic2lkZUVmZmVjdFBhcnRzIiwic3BsaXQiLCJzaWRlRWZmZWN0UGF0aCIsImdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJzaWRlRWZmZWN0c1RvRXhlY3V0ZSIsImFkZFNpZGVFZmZlY3RzIiwidmFsdWVzIiwiZmFpbGVkU2lkZUVmZmVjdHMiLCJmYWlsZWRTaWRlRWZmZWN0IiwiZSIsIm5hdmlnYXRpb24iLCJuYXYiLCJyZWdpc3RlckNhbGxCYWNrIiwiZ2V0UmVnaXN0ZXJlZENhbGxiYWNrIiwic3VjY2VzcyIsImtleSIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0c0ZvclRhcmdldFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7XG5cdENvbnRyb2xTaWRlRWZmZWN0c1R5cGUsXG5cdE9EYXRhU2lkZUVmZmVjdHNUeXBlLFxuXHRTaWRlRWZmZWN0c1NlcnZpY2UsXG5cdFNpZGVFZmZlY3RzVGFyZ2V0LFxuXHRTaWRlRWZmZWN0c1R5cGVcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCB0eXBlIHsgUmFkaW9CdXR0b25Hcm91cCRTZWxlY3RFdmVudCB9IGZyb20gXCJzYXAvbS9SYWRpb0J1dHRvbkdyb3VwXCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wkVmFsaWRhdGVGaWVsZEdyb3VwRXZlbnQgfSBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgeyBGaWVsZCRDaGFuZ2VFdmVudCB9IGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgdHlwZSB7IE11bHRpVmFsdWVGaWVsZCRDaGFuZ2VFdmVudCB9IGZyb20gXCJzYXAvdWkvbWRjL011bHRpVmFsdWVGaWVsZFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCIuLi9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcIi4uL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IEVuaGFuY2VXaXRoVUk1IH0gZnJvbSBcIi4uL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIG1ldGhvZE92ZXJyaWRlLCBwcml2YXRlRXh0ZW5zaW9uLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwiLi4vaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcblxuaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQsIE5hdmlnYXRpb25Qcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwiLi4vVGVtcGxhdGVDb21wb25lbnRcIjtcblxudHlwZSBCYXNlU2lkZUVmZmVjdFByb3BlcnR5VHlwZSA9IHtcblx0bmFtZTogc3RyaW5nO1xuXHRpbW1lZGlhdGU/OiBib29sZWFuO1xuXHRzaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0gQmFzZVNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUgJiB7XG5cdGNvbnRleHQ6IENvbnRleHQ7XG59O1xuXG5leHBvcnQgdHlwZSBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlPjtcblxuZXhwb3J0IHR5cGUgTWFzc0VkaXRGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgQmFzZVNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU+O1xuXG50eXBlIEZhaWxlZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdHNUeXBlW10+O1xuXG5leHBvcnQgdHlwZSBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGUgPSB7XG5cdHByb21pc2U6IFByb21pc2U8dW5rbm93bj47XG5cdHNpZGVFZmZlY3RQcm9wZXJ0eTogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlO1xufTtcblxuY29uc3QgSU1NRURJQVRFX1JFUVVFU1QgPSBcIiQkSW1tZWRpYXRlUmVxdWVzdFwiO1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuU2lkZUVmZmVjdHNcIilcbmNsYXNzIFNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdHByaXZhdGUgX3ZpZXchOiBGRVZpZXc7XG5cblx0cHJpdmF0ZSBfcGFnZUNvbXBvbmVudDogRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+IHwgdW5kZWZpbmVkO1xuXG5cdHByaXZhdGUgX3JlZ2lzdGVyZWRGaWVsZEdyb3VwTWFwITogUmVjb3JkPHN0cmluZywgRmllbGRHcm91cFNpZGVFZmZlY3RUeXBlPjtcblxuXHRwcml2YXRlIF9maWVsZEdyb3VwSW52YWxpZGl0eSE6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+PjtcblxuXHRwcml2YXRlIF9zaWRlRWZmZWN0c1NlcnZpY2UhOiBTaWRlRWZmZWN0c1NlcnZpY2U7XG5cblx0cHJpdmF0ZSBfcmVnaXN0ZXJlZEZhaWxlZFNpZGVFZmZlY3RzITogRmFpbGVkU2lkZUVmZmVjdERpY3Rpb25hcnk7XG5cblx0cHJpdmF0ZSBpc0NvbmZpcm1hdGlvbkRpYWxvZ09wZW4/OiBib29sZWFuO1xuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uSW5pdCgpOiB2b2lkIHtcblx0XHR0aGlzLl92aWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9wYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKHRoaXMuX3ZpZXcpIGFzIEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50PiB8IHVuZGVmaW5lZDtcblxuXHRcdHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZSA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLl92aWV3KS5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHR0aGlzLl9yZWdpc3RlcmVkRmllbGRHcm91cE1hcCA9IHt9O1xuXHRcdHRoaXMuX2ZpZWxkR3JvdXBJbnZhbGlkaXR5ID0ge307XG5cdFx0dGhpcy5fcmVnaXN0ZXJlZEZhaWxlZFNpZGVFZmZlY3RzID0ge307XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIFNpZGVFZmZlY3RzIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIE5hbWUgb2YgdGhlIGVudGl0eSB3aGVyZSB0aGUgU2lkZUVmZmVjdHMgY29udHJvbCB3aWxsIGJlIHJlZ2lzdGVyZWRcblx0ICogQHBhcmFtIGNvbnRyb2xTaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyB0byByZWdpc3Rlci4gRW5zdXJlIHRoZSBzb3VyY2VDb250cm9sSWQgbWF0Y2hlcyB0aGUgYXNzb2NpYXRlZCBTQVBVSTUgY29udHJvbCBJRC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhZGRDb250cm9sU2lkZUVmZmVjdHMoZW50aXR5VHlwZTogc3RyaW5nLCBjb250cm9sU2lkZUVmZmVjdHM6IE9taXQ8Q29udHJvbFNpZGVFZmZlY3RzVHlwZSwgXCJmdWxseVF1YWxpZmllZE5hbWVcIj4pOiB2b2lkIHtcblx0XHR0aGlzLl9zaWRlRWZmZWN0c1NlcnZpY2UuYWRkQ29udHJvbFNpZGVFZmZlY3RzKGVudGl0eVR5cGUsIGNvbnRyb2xTaWRlRWZmZWN0cyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBTaWRlRWZmZWN0cyBjcmVhdGVkIGJ5IGEgY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRyb2wgU0FQVUk1IENvbnRyb2xcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRyZW1vdmVDb250cm9sU2lkZUVmZmVjdHMoY29udHJvbDogQ29udHJvbCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRyb2xJZCA9IGNvbnRyb2wuaXNBPy4oXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpICYmIGNvbnRyb2wuZ2V0SWQoKTtcblxuXHRcdGlmIChjb250cm9sSWQpIHtcblx0XHRcdHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZS5yZW1vdmVDb250cm9sU2lkZUVmZmVjdHMoY29udHJvbElkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgYXBwcm9wcmlhdGUgY29udGV4dCBvbiB3aGljaCBTaWRlRWZmZWN0cyBjYW4gYmUgcmVxdWVzdGVkLlxuXHQgKiBUaGUgY29ycmVjdCBvbmUgbXVzdCBoYXZlIHRoZSBiaW5kaW5nIHBhcmFtZXRlciAkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAcGFyYW0gYmluZGluZ0NvbnRleHQgSW5pdGlhbCBiaW5kaW5nIGNvbnRleHRcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RFbnRpdHlUeXBlIEVudGl0eVR5cGUgb2YgdGhlIHNpZGVFZmZlY3RzXG5cdCAqIEByZXR1cm5zIFNBUFVJNSBDb250ZXh0IG9yIHVuZGVmaW5lZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldENvbnRleHRGb3JTaWRlRWZmZWN0cyhiaW5kaW5nQ29udGV4dDogQ29udGV4dCwgc2lkZUVmZmVjdEVudGl0eVR5cGU6IHN0cmluZyk6IENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdGxldCBjb250ZXh0Rm9yU2lkZUVmZmVjdHMgPSBiaW5kaW5nQ29udGV4dCxcblx0XHRcdGVudGl0eVR5cGUgPSB0aGlzLl9zaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KGJpbmRpbmdDb250ZXh0KTtcblxuXHRcdGlmIChzaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gZW50aXR5VHlwZSkge1xuXHRcdFx0Y29udGV4dEZvclNpZGVFZmZlY3RzID0gYmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLmdldENvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0aWYgKGNvbnRleHRGb3JTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRlbnRpdHlUeXBlID0gdGhpcy5fc2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjb250ZXh0Rm9yU2lkZUVmZmVjdHMpO1xuXHRcdFx0XHRpZiAoc2lkZUVmZmVjdEVudGl0eVR5cGUgIT09IGVudGl0eVR5cGUpIHtcblx0XHRcdFx0XHRjb250ZXh0Rm9yU2lkZUVmZmVjdHMgPSBjb250ZXh0Rm9yU2lkZUVmZmVjdHMuZ2V0QmluZGluZygpLmdldENvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0XHRcdGlmIChjb250ZXh0Rm9yU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0XHRcdGVudGl0eVR5cGUgPSB0aGlzLl9zaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KGNvbnRleHRGb3JTaWRlRWZmZWN0cyk7XG5cdFx0XHRcdFx0XHRpZiAoc2lkZUVmZmVjdEVudGl0eVR5cGUgIT09IGVudGl0eVR5cGUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udGV4dEZvclNpZGVFZmZlY3RzIHx8IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyBtYXAgZm9yIGEgZmllbGRcblx0ICogVGhlc2UgU2lkZUVmZmVjdHMgYXJlXG5cdCAqIC0gbGlzdGVkIGludG8gRmllbGRHcm91cElkcyAoY29taW5nIGZyb20gYW4gT0RhdGEgU2VydmljZSlcblx0ICogLSBnZW5lcmF0ZWQgYnkgYSBjb250cm9sIG9yIGNvbnRyb2xzIGFuZCB0aGF0IGNvbmZpZ3VyZSB0aGlzIGZpZWxkIGFzIFNvdXJjZVByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBmaWVsZCBGaWVsZCBjb250cm9sXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIG1hcFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldEZpZWxkU2lkZUVmZmVjdHNNYXAoZmllbGQ6IENvbnRyb2wpOiBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5IHtcblx0XHRsZXQgc2lkZUVmZmVjdHNNYXA6IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSB7fTtcblx0XHRpZiAodGhpcy5fcGFnZUNvbXBvbmVudCkge1xuXHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gdGhpcy5fcGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQ/LigpO1xuXHRcdFx0Y29uc3QgY29udGV4dFBhdGggPSB0aGlzLl9wYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoPy4oKSB8fCAoZW50aXR5U2V0ICYmIGAvJHtlbnRpdHlTZXR9YCk7XG5cblx0XHRcdGlmIChjb250ZXh0UGF0aCkge1xuXHRcdFx0XHRjb25zdCBmaWVsZEdyb3VwSWRzID0gZmllbGQuZ2V0RmllbGRHcm91cElkcygpLFxuXHRcdFx0XHRcdGNvbnRleHREYXRhTW9kZWxPYmplY3QgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHNGb3JUYXJnZXRQYXRoPEVudGl0eVNldCB8IE5hdmlnYXRpb25Qcm9wZXJ0eT4oXG5cdFx0XHRcdFx0XHRjb250ZXh0UGF0aCxcblx0XHRcdFx0XHRcdHRoaXMuX3ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gU2lkZUVmZmVjdHMgY29taW5nIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHRcdFx0XHRzaWRlRWZmZWN0c01hcCA9IHRoaXMuZ2V0U2lkZUVmZmVjdHNNYXBGb3JGaWVsZEdyb3Vwcyhcblx0XHRcdFx0XHRmaWVsZEdyb3VwSWRzLFxuXHRcdFx0XHRcdGZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWRcblx0XHRcdFx0KSBhcyBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5O1xuXG5cdFx0XHRcdC8vIFNpZGVFZmZlY3RzIGNvbWluZyBmcm9tIGNvbnRyb2wocylcblx0XHRcdFx0aWYgKGNvbnRleHREYXRhTW9kZWxPYmplY3QpIHtcblx0XHRcdFx0XHRjb25zdCB2aWV3RW50aXR5VHlwZSA9IGNvbnRleHREYXRhTW9kZWxPYmplY3QudGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdFx0XHRmaWVsZFBhdGggPSB0aGlzLmdldFRhcmdldFByb3BlcnR5KGZpZWxkKSxcblx0XHRcdFx0XHRcdGNvbnRleHQgPSB0aGlzLmdldENvbnRleHRGb3JTaWRlRWZmZWN0cyhmaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQsIHZpZXdFbnRpdHlUeXBlKTtcblxuXHRcdFx0XHRcdGlmIChmaWVsZFBhdGggJiYgY29udGV4dCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgY29udHJvbFNpZGVFZmZlY3RzRW50aXR5VHlwZSA9IHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZS5nZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHModmlld0VudGl0eVR5cGUpO1xuXHRcdFx0XHRcdFx0T2JqZWN0LmtleXMoY29udHJvbFNpZGVFZmZlY3RzRW50aXR5VHlwZSkuZm9yRWFjaCgoc2lkZUVmZmVjdHNOYW1lKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9Db250cm9sU2lkZUVmZmVjdHMgPSBjb250cm9sU2lkZUVmZmVjdHNFbnRpdHlUeXBlW3NpZGVFZmZlY3RzTmFtZV07XG5cdFx0XHRcdFx0XHRcdGlmIChvQ29udHJvbFNpZGVFZmZlY3RzLnNvdXJjZVByb3BlcnRpZXMuaW5jbHVkZXMoZmllbGRQYXRoKSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG5hbWUgPSBgJHtzaWRlRWZmZWN0c05hbWV9Ojoke3ZpZXdFbnRpdHlUeXBlfWA7XG5cdFx0XHRcdFx0XHRcdFx0c2lkZUVmZmVjdHNNYXBbbmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0c2lkZUVmZmVjdHM6IG9Db250cm9sU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0OiBjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBzaWRlRWZmZWN0c01hcDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBzaWRlRWZmZWN0cyBtYXAgZm9yIGZpZWxkR3JvdXBzLlxuXHQgKlxuXHQgKiBAcGFyYW0gZmllbGRHcm91cElkcyBGaWVsZCBncm91cCBpZHNcblx0ICogQHBhcmFtIGZpZWxkQ29udGV4dCBGaWVsZCBiaW5kaW5nIGNvbnRleHRcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgbWFwXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRTaWRlRWZmZWN0c01hcEZvckZpZWxkR3JvdXBzKFxuXHRcdGZpZWxkR3JvdXBJZHM6IHN0cmluZ1tdLFxuXHRcdGZpZWxkQ29udGV4dD86IENvbnRleHQgfCBudWxsXG5cdCk6IE1hc3NFZGl0RmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSB8IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdGNvbnN0IG1TaWRlRWZmZWN0c01hcDogTWFzc0VkaXRGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5IHwgRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IHt9O1xuXHRcdGZpZWxkR3JvdXBJZHMuZm9yRWFjaCgoZmllbGRHcm91cElkKSA9PiB7XG5cdFx0XHRjb25zdCB7IG5hbWUsIGltbWVkaWF0ZSwgc2lkZUVmZmVjdHMsIHNpZGVFZmZlY3RFbnRpdHlUeXBlIH0gPSB0aGlzLl9nZXRTaWRlRWZmZWN0c1Byb3BlcnR5Rm9yRmllbGRHcm91cChmaWVsZEdyb3VwSWQpO1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBmaWVsZENvbnRleHQgPyAodGhpcy5nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHMoZmllbGRDb250ZXh0LCBzaWRlRWZmZWN0RW50aXR5VHlwZSkgYXMgQ29udGV4dCkgOiB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoc2lkZUVmZmVjdHMgJiYgKCFmaWVsZENvbnRleHQgfHwgKGZpZWxkQ29udGV4dCAmJiBvQ29udGV4dCkpKSB7XG5cdFx0XHRcdG1TaWRlRWZmZWN0c01hcFtuYW1lXSA9IHtcblx0XHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRcdGltbWVkaWF0ZSxcblx0XHRcdFx0XHRzaWRlRWZmZWN0c1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAoZmllbGRDb250ZXh0KSB7XG5cdFx0XHRcdFx0KG1TaWRlRWZmZWN0c01hcFtuYW1lXSBhcyBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUpLmNvbnRleHQgPSBvQ29udGV4dCE7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gbVNpZGVFZmZlY3RzTWFwO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFyIHJlY29yZGVkIHZhbGlkYXRpb24gc3RhdHVzIGZvciBhbGwgcHJvcGVydGllcy5cblx0ICpcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRjbGVhckZpZWxkR3JvdXBzVmFsaWRpdHkoKTogdm9pZCB7XG5cdFx0dGhpcy5fZmllbGRHcm91cEludmFsaWRpdHkgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhciByZWNvcmRlZCB2YWxpZGF0aW9uIHN0YXR1cyBmb3IgYWxsIHByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBmaWVsZEdyb3VwSWQgRmllbGQgZ3JvdXAgaWRcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dFxuXHQgKiBAcmV0dXJucyBTQVBVSTUgQ29udGV4dCBvciB1bmRlZmluZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRpc0ZpZWxkR3JvdXBWYWxpZChmaWVsZEdyb3VwSWQ6IHN0cmluZywgY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGlkID0gdGhpcy5fZ2V0RmllbGRHcm91cEluZGV4KGZpZWxkR3JvdXBJZCwgY29udGV4dCk7XG5cdFx0cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2ZpZWxkR3JvdXBJbnZhbGlkaXR5W2lkXSA/PyB7fSkubGVuZ3RoID09PSAwO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHJlbGF0aXZlIHRhcmdldCBwcm9wZXJ0eSByZWxhdGVkIHRvIHRoZSBGaWVsZC5cblx0ICpcblx0ICogQHBhcmFtIGZpZWxkIEZpZWxkIGNvbnRyb2xcblx0ICogQHJldHVybnMgUmVsYXRpdmUgdGFyZ2V0IHByb3BlcnR5XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0VGFyZ2V0UHJvcGVydHkoZmllbGQ6IENvbnRyb2wpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGZpZWxkUGF0aCA9IGZpZWxkLmRhdGEoXCJzb3VyY2VQYXRoXCIpIGFzIHN0cmluZztcblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0aGlzLl92aWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgdmlld0JpbmRpbmdQYXRoID0gdGhpcy5fdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgdmlld01ldGFNb2RlbFBhdGggPSB2aWV3QmluZGluZ1BhdGggPyBgJHttZXRhTW9kZWwuZ2V0TWV0YVBhdGgodmlld0JpbmRpbmdQYXRoKX0vYCA6IFwiXCI7XG5cdFx0cmV0dXJuIGZpZWxkUGF0aD8ucmVwbGFjZSh2aWV3TWV0YU1vZGVsUGF0aCwgXCJcIik7XG5cdH1cblxuXHQvKipcblx0ICogQ2FjaGVzIGRlZmVycmVkIFNpZGVFZmZlY3RzIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBGaWVsZEdyb3VwIGlzIHVuZm9jdXNlZC5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IFNBUFVJNSBldmVudCB0aGF0IGNvbWVzIGZyb20gYSBmaWVsZCBjaGFuZ2Vcblx0ICogQHBhcmFtIGZpZWxkVmFsaWRpdHlcblx0ICogQHBhcmFtIGZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgYmVmb3JlIGV4ZWN1dGluZyBkZWZlcnJlZCBTaWRlRWZmZWN0c1xuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHByZXBhcmVEZWZlcnJlZFNpZGVFZmZlY3RzRm9yRmllbGQoXG5cdFx0ZXZlbnQ6IEZpZWxkJENoYW5nZUV2ZW50IHwgTXVsdGlWYWx1ZUZpZWxkJENoYW5nZUV2ZW50IHwgUmFkaW9CdXR0b25Hcm91cCRTZWxlY3RFdmVudCxcblx0XHRmaWVsZFZhbGlkaXR5OiBib29sZWFuLFxuXHRcdGZpZWxkR3JvdXBQcmVSZXF1aXNpdGU/OiBQcm9taXNlPHVua25vd24+XG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGZpZWxkID0gKGV2ZW50IGFzIFVJNUV2ZW50PHt9LCBDb250cm9sPikuZ2V0U291cmNlKCk7XG5cdFx0dGhpcy5fc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyhmaWVsZCwgZmllbGRWYWxpZGl0eSk7XG5cdFx0aWYgKCFmaWVsZFZhbGlkaXR5KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHNpZGVFZmZlY3RzTWFwID0gdGhpcy5nZXRGaWVsZFNpZGVFZmZlY3RzTWFwKGZpZWxkKTtcblxuXHRcdC8vIHJlZ2lzdGVyIGZpZWxkIGdyb3VwIFNpZGVFZmZlY3RzXG5cdFx0T2JqZWN0LmtleXMoc2lkZUVmZmVjdHNNYXApXG5cdFx0XHQuZmlsdGVyKChzaWRlRWZmZWN0c05hbWUpID0+IHNpZGVFZmZlY3RzTWFwW3NpZGVFZmZlY3RzTmFtZV0uaW1tZWRpYXRlICE9PSB0cnVlKVxuXHRcdFx0LmZvckVhY2goKHNpZGVFZmZlY3RzTmFtZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBzaWRlRWZmZWN0c1Byb3BlcnRpZXMgPSBzaWRlRWZmZWN0c01hcFtzaWRlRWZmZWN0c05hbWVdO1xuXHRcdFx0XHR0aGlzLnJlZ2lzdGVyRmllbGRHcm91cFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzUHJvcGVydGllcywgZmllbGRHcm91cFByZVJlcXVpc2l0ZSk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSB3b3JrZmxvdyBmb3IgU2lkZUVmZmVjdHMgd2l0aCByZWxhdGVkIGNoYW5nZXMgdG8gYSBmaWVsZFxuXHQgKiBUaGUgZm9sbG93aW5nIHNjZW5hcmlvcyBhcmUgbWFuYWdlZDpcblx0ICogIC0gUmVnaXN0ZXI6IGNhY2hlcyBkZWZlcnJlZCBTaWRlRWZmZWN0cyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgRmllbGRHcm91cCBpcyB1bmZvY3VzZWRcblx0ICogIC0gRXhlY3V0ZTogdHJpZ2dlcnMgaW1tZWRpYXRlIFNpZGVFZmZlY3RzIHJlcXVlc3RzIGlmIHRoZSBwcm9taXNlIGZvciB0aGUgZmllbGQgZXZlbnQgaXMgZnVsZmlsbGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gZXZlbnQgU0FQVUk1IGV2ZW50IHRoYXQgY29tZXMgZnJvbSBhIGZpZWxkIGNoYW5nZVxuXHQgKiBAcGFyYW0gZmllbGRWYWxpZGl0eVxuXHQgKiBAcGFyYW0gZmllbGRHcm91cFByZVJlcXVpc2l0ZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZCBiZWZvcmUgZXhlY3V0aW5nIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBza2lwRGVmZXJyZWRSZWdpc3RyYXRpb24gSWYgdHJ1ZSB0aGVuIGRlZmVycmVkIHNpZGUgZWZmZWN0cyBhcmUgbm90IHJlZ2lzdGVyZWQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHJlZ2lzdHJhdGlvbiBvZiBkZWZlcnJlZCBzaWRlIGVmZmVjdHMgYW5kIHRyaWdnZXJpbmcgbmVlZHMgdG8gYmUgZG9uZSBzZXBhcmF0ZWx5LlxuXHQgKiBAcmV0dXJucyAgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0KHMpXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgaGFuZGxlRmllbGRDaGFuZ2UoXG5cdFx0ZXZlbnQ6IEZpZWxkJENoYW5nZUV2ZW50IHwgTXVsdGlWYWx1ZUZpZWxkJENoYW5nZUV2ZW50IHwgUmFkaW9CdXR0b25Hcm91cCRTZWxlY3RFdmVudCxcblx0XHRmaWVsZFZhbGlkaXR5OiBib29sZWFuLFxuXHRcdGZpZWxkR3JvdXBQcmVSZXF1aXNpdGU/OiBQcm9taXNlPHVua25vd24+LFxuXHRcdHNraXBEZWZlcnJlZFJlZ2lzdHJhdGlvbiA9IGZhbHNlXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGZpZWxkID0gKGV2ZW50IGFzIFVJNUV2ZW50PHt9LCBDb250cm9sPikuZ2V0U291cmNlKCk7XG5cdFx0aWYgKCFza2lwRGVmZXJyZWRSZWdpc3RyYXRpb24pIHtcblx0XHRcdHRoaXMucHJlcGFyZURlZmVycmVkU2lkZUVmZmVjdHNGb3JGaWVsZChldmVudCwgZmllbGRWYWxpZGl0eSwgZmllbGRHcm91cFByZVJlcXVpc2l0ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX3NhdmVGaWVsZFByb3BlcnRpZXNTdGF0dXMoZmllbGQsIGZpZWxkVmFsaWRpdHkpO1xuXHRcdFx0aWYgKCFmaWVsZFZhbGlkaXR5KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuX21hbmFnZVNpZGVFZmZlY3RzRnJvbUZpZWxkKGZpZWxkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIFNpZGVFZmZlY3RzIHdpdGggYSByZWxhdGVkICdmb2N1cyBvdXQnIHRvIGEgZmllbGQgZ3JvdXAuXG5cdCAqXG5cdCAqIEBwYXJhbSBldmVudCBTQVBVSTUgRXZlbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXR1cm5pbmcgdHJ1ZSBpZiB0aGUgU2lkZUVmZmVjdHMgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBleGVjdXRlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGhhbmRsZUZpZWxkR3JvdXBDaGFuZ2UoZXZlbnQ6IENvbnRyb2wkVmFsaWRhdGVGaWVsZEdyb3VwRXZlbnQpOiBQcm9taXNlPHZvaWQgfCB2b2lkW10+IHtcblx0XHRjb25zdCBmaWVsZCA9IGV2ZW50LmdldFNvdXJjZSgpLFxuXHRcdFx0ZmllbGRHcm91cElkczogc3RyaW5nW10gPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJmaWVsZEdyb3VwSWRzXCIpID8/IFtdLFxuXHRcdFx0ZmllbGRHcm91cHNTaWRlRWZmZWN0cyA9IGZpZWxkR3JvdXBJZHMucmVkdWNlKChyZXN1bHRzOiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGVbXSwgZmllbGRHcm91cElkKSA9PiB7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzLmNvbmNhdCh0aGlzLmdldFJlZ2lzdGVyZWRTaWRlRWZmZWN0c0ZvckZpZWxkR3JvdXAoZmllbGRHcm91cElkKSk7XG5cdFx0XHR9LCBbXSk7XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRmaWVsZEdyb3Vwc1NpZGVFZmZlY3RzLm1hcChhc3luYyAoZmllbGRHcm91cFNpZGVFZmZlY3RzKSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9yZXF1ZXN0RmllbGRHcm91cFNpZGVFZmZlY3RzKGZpZWxkR3JvdXBTaWRlRWZmZWN0cyk7XG5cdFx0XHR9KVxuXHRcdCkuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRjb25zdCBjb250ZXh0UGF0aCA9IGZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKTtcblx0XHRcdExvZy5kZWJ1ZyhgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBGaWVsZEdyb3VwIFNpZGVFZmZlY3RzIG9uIGNvbnRleHQgJHtjb250ZXh0UGF0aH1gLCBlcnJvcik7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdCBTaWRlRWZmZWN0cyBvbiBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIGdyb3VwSWRcblx0ICogQHBhcmFtIGZuR2V0VGFyZ2V0cyBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBnaXZlIHVzIHRoZSB0YXJnZXRzIGFuZCBhY3Rpb25zIGlmIGl0IHdhcyBjb21pbmcgdGhyb3VnaCBzb21lIHNwZWNpZmljIGhhbmRsaW5nLlxuXHQgKiBAcGFyYW0gaWdub3JlVHJpZ2dlckFjdGlvbnMgSWYgdHJ1ZSwgd2UgZG8gbm90IHRyaWdnZXIgYWN0aW9ucyBkZWZpbmVkIGluIHRoZSBzaWRlIGVmZmVjdFxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyByZXF1ZXN0IG9uIFNBUFVJNSBjb250ZXh0XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgcmVxdWVzdFNpZGVFZmZlY3RzKFxuXHRcdHNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGUsXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRncm91cElkPzogc3RyaW5nLFxuXHRcdGZuR2V0VGFyZ2V0cz86IChzaWRlRWZmZWN0c0RlZjogU2lkZUVmZmVjdHNUeXBlKSA9PiB7IHRhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W107IHRyaWdnZXJBY3Rpb246IHN0cmluZyB8IHVuZGVmaW5lZCB9LFxuXHRcdGlnbm9yZVRyaWdnZXJBY3Rpb25zID0gZmFsc2Vcblx0KTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0Y29uc3QgZm5UcmlnZ2VyQ2FsbGJhY2tzID0gdGhpcy50cmlnZ2VyQ2FsbGJhY2tzLmJpbmQodGhpcyk7XG5cdFx0Y29uc3QgeyB0YXJnZXRzLCB0cmlnZ2VyQWN0aW9uIH0gPSBmbkdldFRhcmdldHNcblx0XHRcdD8gZm5HZXRUYXJnZXRzKHNpZGVFZmZlY3RzKVxuXHRcdFx0OiB7XG5cdFx0XHRcdFx0dGFyZ2V0czogWy4uLihzaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcyA/PyBbXSksIC4uLihzaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzID8/IFtdKV0sXG5cdFx0XHRcdFx0dHJpZ2dlckFjdGlvbjogIXRoaXMuX3NpZGVFZmZlY3RzU2VydmljZS5pc0NvbnRyb2xTaWRlRWZmZWN0cyhzaWRlRWZmZWN0cykgPyBzaWRlRWZmZWN0cy50cmlnZ2VyQWN0aW9uIDogdW5kZWZpbmVkXG5cdFx0XHQgIH07XG5cdFx0aWYgKHRyaWdnZXJBY3Rpb24gJiYgIWlnbm9yZVRyaWdnZXJBY3Rpb25zKSB7XG5cdFx0XHR0aGlzLl9zaWRlRWZmZWN0c1NlcnZpY2UuZXhlY3V0ZUFjdGlvbih0cmlnZ2VyQWN0aW9uLCBjb250ZXh0LCBncm91cElkKTtcblx0XHR9XG5cblx0XHRpZiAodGFyZ2V0cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9zaWRlRWZmZWN0c1NlcnZpY2Vcblx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyh0YXJnZXRzLCBjb250ZXh0LCBncm91cElkKVxuXHRcdFx0XHQudGhlbihhc3luYyBmdW5jdGlvbiBhc3luYygpIHtcblx0XHRcdFx0XHRyZXR1cm4gZm5UcmlnZ2VyQ2FsbGJhY2tzKHNpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzPy5tYXAoKHRhcmdldCkgPT4gdGFyZ2V0LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSB8fCBbXSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHR0aGlzLnJlZ2lzdGVyRmFpbGVkU2lkZUVmZmVjdHMoW3NpZGVFZmZlY3RzXSwgY29udGV4dCk7XG5cdFx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgU2lkZUVmZmVjdHMgZm9yIGEgc2lkZUVmZmVjdCBldmVudC5cblx0ICpcblx0ICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgdG8gZXhlY3V0ZSB0aGUgc2lkZSBlZmZlY3Qgb24gdGhlIHBhZ2UncyBjb250ZXh0LCBidXQgcGFnZXMgKGxpa2UgdGhlIExSKSBtaWdodCBvdmVycmlkZSB0aGlzIG1ldGhvZC5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50TmFtZSBTaWRlRWZmZWN0cyBldmVudCB3aGljaCB3YXMgdHJpZ2dlcmVkXG5cdCAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIGZvciB3aGljaCB0aGlzIGV2ZW50IHdhcyB0cmlnZ2VyZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0XG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkKVxuXHRhc3luYyByZXF1ZXN0U2lkZUVmZmVjdHNGb3JFdmVudChldmVudE5hbWU6IHN0cmluZywgcGF0aDogc3RyaW5nKTogUHJvbWlzZTx1bmRlZmluZWQ+IHtcblx0XHRpZiAodGhpcy5pc0RhdGFQYXRoUmVsZXZhbnQocGF0aCkpIHtcblx0XHRcdC8vIHVzZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmcm9tIHRoZSBTaWRlRWZmZWN0cyBTZXJ2aWNlXG5cdFx0XHRjb25zdCBjb250ZXh0ID0gdGhpcy5fZmluZFJlbGV2YW50Q29udGV4dChwYXRoLCB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQpO1xuXHRcdFx0aWYgKGNvbnRleHQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JFdmVudChldmVudE5hbWUsIGNvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBnaXZlbiBkYXRhIHBhdGggaXMgc2hvd24vcmVsZXZhbnQgb24gdGhlIHBhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGJlIGNoZWNrZWRcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZGF0YSBwYXRoIGlzIHNob3duIG9uIHRoZSBVSVxuXHQgKi9cblx0aXNEYXRhUGF0aFJlbGV2YW50KHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cblx0XHRpZiAodGhpcy5fY29udGV4dElzUmVsZXZhbnQocGF0aCwgY29udGV4dCkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiAhIXRoaXMuX2ZpbmRSZWxldmFudENvbnRleHQocGF0aCwgY29udGV4dCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgZ2l2ZW4gY29udGV4dCBmaXRzIHRvIGEgZ2l2ZW4gcGF0aC5cblx0ICpcblx0ICogVGhpcyBpcyBkb25lIGJ5IGNoZWNraW5nIGJvdGggdGhlIG5hdmlnYXRpb24gcGF0aCBhbmQgdGhlIGNhbm9uaWNhbCBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byBiZSBjaGVja2VkXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIGNoZWNrZWRcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY29udGV4dCBmaXRzIHRvIHRoZSBnaXZlbiBwYXRoXG5cdCAqL1xuXHRfY29udGV4dElzUmVsZXZhbnQocGF0aDogc3RyaW5nLCBjb250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGNvbnRleHQ/LmdldFBhdGgoKSA9PT0gcGF0aCB8fCBjb250ZXh0Py5nZXRDYW5vbmljYWxQYXRoKCkgPT09IHBhdGg7XG5cdH1cblxuXHQvKipcblx0ICogRmluZCBjb250ZXh0IGZvciBhIGdpdmVuIHBhdGggYnkgY2hlY2tpbmcgZGVwZW5kZW50IGJpbmRpbmdzLlxuXHQgKlxuXHQgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byBiZSBjaGVja2VkXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBwYXJlbnQgY29udGV4dFxuXHQgKiBAcmV0dXJucyBDb250ZXh0IGlmIGZvdW5kLCBvdGhlcndpc2UgcmV0dXJucyB1bmRlZmluZWRcblx0ICovXG5cdF9maW5kUmVsZXZhbnRDb250ZXh0KHBhdGg6IHN0cmluZywgY29udGV4dDogQ29udGV4dCk6IENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLl9jb250ZXh0SXNSZWxldmFudChwYXRoLCBjb250ZXh0KSkge1xuXHRcdFx0cmV0dXJuIGNvbnRleHQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZGVwZW5kZW50QmluZGluZ3MgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0RGVwZW5kZW50QmluZGluZ3MoY29udGV4dCk7XG5cdFx0Zm9yIChjb25zdCBiaW5kaW5nIG9mIGRlcGVuZGVudEJpbmRpbmdzKSB7XG5cdFx0XHRpZiAoYmluZGluZy5pc0E8T0RhdGFDb250ZXh0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAodGhpcy5fY29udGV4dElzUmVsZXZhbnQocGF0aCwgYmluZGluZy5nZXRCb3VuZENvbnRleHQoKSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gYmluZGluZy5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChiaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGNvbnN0IGxpc3RDb250ZXh0cyA9IGJpbmRpbmcuZ2V0QWxsQ3VycmVudENvbnRleHRzKCk7XG5cdFx0XHRcdGZvciAoY29uc3QgbGlzdENvbnRleHQgb2YgbGlzdENvbnRleHRzKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMuX2NvbnRleHRJc1JlbGV2YW50KHBhdGgsIGxpc3RDb250ZXh0KSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGxpc3RDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGV4dCB0byBiZSBzaG93biBmb3IgdXNlciB0byBpbmRpY2F0ZSBkYXRhIHJlZnJlc2guXG5cdCAqXG5cdCAqIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgdXNlZCBieSBTaWRlRWZmZWN0cyBldmVudHMuIFBhZ2VzIChsaWtlIHRoZSBMUikgbWlnaHQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRleHQgdG8gYmUgc2hvd24gdG8gdGhlIHVzZXIgaW4gY2FzZSBvZiBhIGRhdGEgcmVmcmVzaFxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uSW5zdGVhZClcblx0Z2V0RGF0YVJlZnJlc2hUZXh0KCk6IHN0cmluZyB7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IGdldFJlc291cmNlTW9kZWwodGhpcy5nZXRWaWV3KCkpO1xuXHRcdHJldHVybiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1NFUlZFUl9FVkVOVFNfTkVXX0RBVEFfSVRFTVwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOb3RpZnkgdGhlIHVzZXIgdGhhdCBkYXRhIHdhcyByZWZyZXNoZWQuXG5cdCAqXG5cdCAqIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgdXNlZCBieSBTaWRlRWZmZWN0cyBldmVudHMuXG5cdCAqL1xuXG5cdG5vdGlmeURhdGFSZWZyZXNoKCk6IHZvaWQge1xuXHRcdE1lc3NhZ2VUb2FzdC5zaG93KHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLl9zaWRlRWZmZWN0cy5nZXREYXRhUmVmcmVzaFRleHQoKSk7XG5cdH1cblxuXHQvKipcblx0ICogQXNrIHRoZSB1c2VyIGZvciBjb25maXJtYXRpb24gb2YgYSBkYXRhIHJlZnJlc2guXG5cdCAqXG5cdCAqIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgdXNlZCBieSBTaWRlRWZmZWN0cyBldmVudHMuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBpZiB0aGUgdXNlciBjb25maXJtcyBhbmQgcmVqZWN0cyBpZiB0aGUgdXNlciBjYW5jZWxzLlxuXHQgKi9cblx0YXN5bmMgY29uZmlybURhdGFSZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5pc0NvbmZpcm1hdGlvbkRpYWxvZ09wZW4pIHtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHRleHQgPSB0aGlzLmdldERhdGFSZWZyZXNoVGV4dCgpO1xuXHRcdFx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbCh0aGlzLmdldFZpZXcoKSk7XG5cblx0XHRcdFx0Y29uc3QgY29uZmlybWF0aW9uRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0dGl0bGU6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIldBUk5JTkdcIiksXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHsgdGV4dDogdGV4dCB9KSxcblx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9SRUZSRVNIXCIpLFxuXHRcdFx0XHRcdFx0cHJlc3M6ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uZmlybWF0aW9uRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTFwiKSxcblx0XHRcdFx0XHRcdHByZXNzOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbmZpcm1hdGlvbkRpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRjb25maXJtYXRpb25EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0dGhpcy5pc0NvbmZpcm1hdGlvbkRpYWxvZ09wZW4gPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb25maXJtYXRpb25EaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdHRoaXMuaXNDb25maXJtYXRpb25EaWFsb2dPcGVuID0gdHJ1ZTtcblx0XHRcdFx0Y29uZmlybWF0aW9uRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0IG11bHRpcGxlIFNpZGVFZmZlY3RzIG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG11bHRpU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSBncm91cElkIFRoZSBncm91cCBpZCBvZiB0aGUgYmF0Y2hcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgcmVxdWVzdCBvbiBTQVBVSTUgY29udGV4dFxuXHQgKi9cblx0YXN5bmMgcmVxdWVzdE11bHRpcGxlU2lkZUVmZmVjdHMobXVsdGlTaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlW10sIGNvbnRleHQ6IENvbnRleHQsIGdyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRsZXQgcHJvcGVydGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdGxldCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdGNvbnN0IGFjdGlvbnMgPSBtdWx0aVNpZGVFZmZlY3RzLnJlZHVjZSgoYWN0aW9ucywgc2lkZUVmZmVjdHMpID0+IHtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RBY3Rpb24gPSAoc2lkZUVmZmVjdHMgYXMgT0RhdGFTaWRlRWZmZWN0c1R5cGUpLnRyaWdnZXJBY3Rpb247XG5cdFx0XHRpZiAoc2lkZUVmZmVjdEFjdGlvbikge1xuXHRcdFx0XHRhY3Rpb25zLnB1c2goc2lkZUVmZmVjdEFjdGlvbik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYWN0aW9ucztcblx0XHR9LCBbXSBhcyBzdHJpbmdbXSk7XG5cdFx0Y29uc3QgZm50cmlnZ2VyQ2FsbGJhY2tzID0gdGhpcy50cmlnZ2VyQ2FsbGJhY2tzLmJpbmQodGhpcyk7XG5cblx0XHRmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG5cdFx0XHR0aGlzLl9zaWRlRWZmZWN0c1NlcnZpY2UuZXhlY3V0ZUFjdGlvbihhY3Rpb24sIGNvbnRleHQsIGdyb3VwSWQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3Qgc2lkZUVmZmVjdHMgb2YgbXVsdGlTaWRlRWZmZWN0cykge1xuXHRcdFx0cHJvcGVydGllcyA9IChzaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzID8/IFtdKS5yZWR1Y2UoKG15U2V0LCBwcm9wZXJ0eSkgPT4gbXlTZXQuYWRkKHByb3BlcnR5KSwgcHJvcGVydGllcyk7XG5cdFx0XHRuYXZpZ2F0aW9uUHJvcGVydGllcyA9IChzaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcyA/PyBbXSkucmVkdWNlKFxuXHRcdFx0XHQobXlTZXQsIG5hdmlnYXRpb25Qcm9wZXJ0eSkgPT4gbXlTZXQuYWRkKG5hdmlnYXRpb25Qcm9wZXJ0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCksXG5cdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9zaWRlRWZmZWN0c1NlcnZpY2Vcblx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMoXG5cdFx0XHRcdFtcblx0XHRcdFx0XHQuLi5BcnJheS5mcm9tKHByb3BlcnRpZXMpLFxuXHRcdFx0XHRcdC4uLkFycmF5LmZyb20obmF2aWdhdGlvblByb3BlcnRpZXMpLm1hcCgobmF2aWdhdGlvblByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4geyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogbmF2aWdhdGlvblByb3BlcnR5IH07XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XSxcblx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0Z3JvdXBJZFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oYXN5bmMgZnVuY3Rpb24gYXN5bmMoKSB7XG5cdFx0XHRcdHJldHVybiBmbnRyaWdnZXJDYWxsYmFja3MoQXJyYXkuZnJvbShuYXZpZ2F0aW9uUHJvcGVydGllcykpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcblx0XHRcdFx0dGhpcy5yZWdpc3RlckZhaWxlZFNpZGVFZmZlY3RzKG11bHRpU2lkZUVmZmVjdHMsIGNvbnRleHQpO1xuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBSZWdpc3RlcmVkIFNpZGVFZmZlY3RzIHJlcXVlc3RzIHRoYXQgaGF2ZSBmYWlsZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwdWJsaWMgZ2V0UmVnaXN0ZXJlZEZhaWxlZFJlcXVlc3RzKCk6IEZhaWxlZFNpZGVFZmZlY3REaWN0aW9uYXJ5IHtcblx0XHRyZXR1cm4gdGhpcy5fcmVnaXN0ZXJlZEZhaWxlZFNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgU2lkZUVmZmVjdHMgdG8gdGhlIHF1ZXVlIG9mIHRoZSBmYWlsZWQgU2lkZUVmZmVjdHNcblx0ICogVGhlIFNpZGVFZmZlY3RzIGFyZSByZXRyaWdnZXJlZCBvbiB0aGUgbmV4dCByZXF1ZXN0IG9uIHRoZSBzYW1lIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBtdWx0aVNpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRoYXQgbmVlZCB0byBiZSByZXRyaWdnZXJlZFxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIGhhdmUgZmFpbGVkXG5cdCAqL1xuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHJlZ2lzdGVyRmFpbGVkU2lkZUVmZmVjdHMobXVsdGlTaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlW10sIGNvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcblx0XHRjb25zdCBjb250ZXh0UGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdHRoaXMuX3JlZ2lzdGVyZWRGYWlsZWRTaWRlRWZmZWN0c1tjb250ZXh0UGF0aF0gPSB0aGlzLl9yZWdpc3RlcmVkRmFpbGVkU2lkZUVmZmVjdHNbY29udGV4dFBhdGhdID8/IFtdO1xuXHRcdGZvciAoY29uc3Qgc2lkZUVmZmVjdHMgb2YgbXVsdGlTaWRlRWZmZWN0cykge1xuXHRcdFx0Y29uc3QgaXNOb3RBbHJlYWR5TGlzdGVkID0gdGhpcy5fcmVnaXN0ZXJlZEZhaWxlZFNpZGVFZmZlY3RzW2NvbnRleHRQYXRoXS5ldmVyeShcblx0XHRcdFx0KG1GYWlsZWRTaWRlRWZmZWN0cykgPT4gc2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lICE9PSBtRmFpbGVkU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0XHQpO1xuXHRcdFx0aWYgKGlzTm90QWxyZWFkeUxpc3RlZCkge1xuXHRcdFx0XHR0aGlzLl9yZWdpc3RlcmVkRmFpbGVkU2lkZUVmZmVjdHNbY29udGV4dFBhdGhdLnB1c2goc2lkZUVmZmVjdHMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGVzIFNpZGVFZmZlY3RzIGluIHRoZSBxdWV1ZSBvZiB0aGUgZmFpbGVkIFNpZGVFZmZlY3RzIGZvciBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0UGF0aCBDb250ZXh0IHBhdGggd2hlcmUgU2lkZUVmZmVjdHMgaGF2ZSBmYWlsZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHR1bnJlZ2lzdGVyRmFpbGVkU2lkZUVmZmVjdHNGb3JBQ29udGV4dChjb250ZXh0UGF0aDogc3RyaW5nKTogdm9pZCB7XG5cdFx0ZGVsZXRlIHRoaXMuX3JlZ2lzdGVyZWRGYWlsZWRTaWRlRWZmZWN0c1tjb250ZXh0UGF0aF07XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlcyBTaWRlRWZmZWN0cyB0byB0aGUgcXVldWUgb2YgdGhlIGZhaWxlZCBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzRnVsbHlRdWFsaWZpZWROYW1lIFNpZGVFZmZlY3RzIHRoYXQgbmVlZCB0byBiZSByZXRyaWdnZXJlZFxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIGhhdmUgZmFpbGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0dW5yZWdpc3RlckZhaWxlZFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzRnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcblx0XHRjb25zdCBjb250ZXh0UGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGlmICh0aGlzLl9yZWdpc3RlcmVkRmFpbGVkU2lkZUVmZmVjdHNbY29udGV4dFBhdGhdPy5sZW5ndGgpIHtcblx0XHRcdHRoaXMuX3JlZ2lzdGVyZWRGYWlsZWRTaWRlRWZmZWN0c1tjb250ZXh0UGF0aF0gPSB0aGlzLl9yZWdpc3RlcmVkRmFpbGVkU2lkZUVmZmVjdHNbY29udGV4dFBhdGhdLmZpbHRlcihcblx0XHRcdFx0KHNpZGVFZmZlY3RzKSA9PiBzaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWUgIT09IHNpZGVFZmZlY3RzRnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIFNpZGVFZmZlY3RzIHRvIHRoZSBxdWV1ZSBvZiBhIEZpZWxkR3JvdXBcblx0ICogVGhlIFNpZGVFZmZlY3RzIGFyZSB0cmlnZ2VyZWQgd2hlbiBldmVudCByZWxhdGVkIHRvIHRoZSBmaWVsZCBncm91cCBjaGFuZ2UgaXMgZmlyZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1Byb3BlcnRpZXMgU2lkZUVmZmVjdHMgcHJvcGVydGllc1xuXHQgKiBAcGFyYW0gZmllbGRHcm91cFByZVJlcXVpc2l0ZSBQcm9taXNlIHRvIGZ1bGxmaWwgYmVmb3JlIGV4ZWN1dGluZyB0aGUgU2lkZUVmZmVjdHNcblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cmVnaXN0ZXJGaWVsZEdyb3VwU2lkZUVmZmVjdHMoc2lkZUVmZmVjdHNQcm9wZXJ0aWVzOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUsIGZpZWxkR3JvdXBQcmVSZXF1aXNpdGU/OiBQcm9taXNlPHVua25vd24+KTogdm9pZCB7XG5cdFx0Y29uc3QgaWQgPSB0aGlzLl9nZXRGaWVsZEdyb3VwSW5kZXgoc2lkZUVmZmVjdHNQcm9wZXJ0aWVzLm5hbWUsIHNpZGVFZmZlY3RzUHJvcGVydGllcy5jb250ZXh0KTtcblx0XHRpZiAoIXRoaXMuX3JlZ2lzdGVyZWRGaWVsZEdyb3VwTWFwW2lkXSkge1xuXHRcdFx0dGhpcy5fcmVnaXN0ZXJlZEZpZWxkR3JvdXBNYXBbaWRdID0ge1xuXHRcdFx0XHRwcm9taXNlOiBmaWVsZEdyb3VwUHJlUmVxdWlzaXRlID8/IFByb21pc2UucmVzb2x2ZSgpLFxuXHRcdFx0XHRzaWRlRWZmZWN0UHJvcGVydHk6IHNpZGVFZmZlY3RzUHJvcGVydGllc1xuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlcyBTaWRlRWZmZWN0cyB0byB0aGUgcXVldWUgb2YgYSBGaWVsZEdyb3VwLlxuXHQgKlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNQcm9wZXJ0aWVzIFNpZGVFZmZlY3RzIHByb3BlcnRpZXNcblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0dW5yZWdpc3RlckZpZWxkR3JvdXBTaWRlRWZmZWN0cyhzaWRlRWZmZWN0c1Byb3BlcnRpZXM6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZSk6IHZvaWQge1xuXHRcdGNvbnN0IHsgY29udGV4dCwgbmFtZSB9ID0gc2lkZUVmZmVjdHNQcm9wZXJ0aWVzO1xuXHRcdGNvbnN0IGlkID0gdGhpcy5fZ2V0RmllbGRHcm91cEluZGV4KG5hbWUsIGNvbnRleHQpO1xuXHRcdGRlbGV0ZSB0aGlzLl9yZWdpc3RlcmVkRmllbGRHcm91cE1hcFtpZF07XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcmVnaXN0ZXJlZCBTaWRlRWZmZWN0cyBpbnRvIHRoZSBxdWV1ZSBmb3IgYSBmaWVsZCBncm91cCBpZC5cblx0ICpcblx0ICogQHBhcmFtIGZpZWxkR3JvdXBJZCBGaWVsZCBncm91cCBpZFxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiByZWdpc3RlcmVkIFNpZGVFZmZlY3RzIGFuZCB0aGVpciBwcm9taXNlXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0UmVnaXN0ZXJlZFNpZGVFZmZlY3RzRm9yRmllbGRHcm91cChmaWVsZEdyb3VwSWQ6IHN0cmluZyk6IEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZVtdIHtcblx0XHRjb25zdCBzaWRlRWZmZWN0cyA9IFtdO1xuXHRcdGZvciAoY29uc3QgcmVnaXN0cnlJbmRleCBvZiBPYmplY3Qua2V5cyh0aGlzLl9yZWdpc3RlcmVkRmllbGRHcm91cE1hcCkpIHtcblx0XHRcdGlmIChyZWdpc3RyeUluZGV4LnN0YXJ0c1dpdGgoYCR7ZmllbGRHcm91cElkfV9gKSkge1xuXHRcdFx0XHRzaWRlRWZmZWN0cy5wdXNoKHRoaXMuX3JlZ2lzdGVyZWRGaWVsZEdyb3VwTWFwW3JlZ2lzdHJ5SW5kZXhdKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgYSBzdGF0dXMgaW5kZXguXG5cdCAqXG5cdCAqIEBwYXJhbSBmaWVsZEdyb3VwSWQgVGhlIGZpZWxkIGdyb3VwIGlkXG5cdCAqIEBwYXJhbSBjb250ZXh0IFNBUFVJNSBDb250ZXh0XG5cdCAqIEByZXR1cm5zIEluZGV4XG5cdCAqL1xuXHRwcml2YXRlIF9nZXRGaWVsZEdyb3VwSW5kZXgoZmllbGRHcm91cElkOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcge1xuXHRcdHJldHVybiBgJHtmaWVsZEdyb3VwSWR9XyR7Y29udGV4dC5nZXRQYXRoKCl9YDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHNpZGVFZmZlY3RzIHByb3BlcnRpZXMgZnJvbSBhIGZpZWxkIGdyb3VwIGlkXG5cdCAqIFRoZSBwcm9wZXJ0aWVzIGFyZTpcblx0ICogIC0gbmFtZVxuXHQgKiAgLSBzaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqICAtIHNpZGVFZmZlY3RzIGVudGl0eSB0eXBlXG5cdCAqICAtIGltbWVkaWF0ZSBzaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQHBhcmFtIGZpZWxkR3JvdXBJZFxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyBwcm9wZXJ0aWVzXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRTaWRlRWZmZWN0c1Byb3BlcnR5Rm9yRmllbGRHcm91cChmaWVsZEdyb3VwSWQ6IHN0cmluZyk6IHtcblx0XHRzaWRlRWZmZWN0RW50aXR5VHlwZTogc3RyaW5nO1xuXHRcdG5hbWU6IHN0cmluZztcblx0XHRpbW1lZGlhdGU6IGJvb2xlYW47XG5cdFx0c2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlIHwgdW5kZWZpbmVkO1xuXHR9IHtcblx0XHQvKipcblx0XHQgKiBzdHJpbmcgXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiBpcyBhZGRlZCB0byB0aGUgU2lkZUVmZmVjdHMgbmFtZSBkdXJpbmcgdGVtcGxhdGluZyB0byBrbm93XG5cdFx0ICogaWYgdGhpcyBTaWRlRWZmZWN0cyBtdXN0IGJlIGltbWVkaWF0ZWx5IGV4ZWN1dGVkIHJlcXVlc3RlZCAob24gZmllbGQgY2hhbmdlKSBvciBtdXN0XG5cdFx0ICogYmUgZGVmZXJyZWQgKG9uIGZpZWxkIGdyb3VwIGZvY3VzIG91dClcblx0XHQgKlxuXHRcdCAqL1xuXHRcdGNvbnN0IGltbWVkaWF0ZSA9IGZpZWxkR3JvdXBJZC5pbmNsdWRlcyhJTU1FRElBVEVfUkVRVUVTVCksXG5cdFx0XHRuYW1lID0gZmllbGRHcm91cElkLnJlcGxhY2UoSU1NRURJQVRFX1JFUVVFU1QsIFwiXCIpLFxuXHRcdFx0c2lkZUVmZmVjdFBhcnRzID0gbmFtZS5zcGxpdChcIiNcIiksXG5cdFx0XHRzaWRlRWZmZWN0RW50aXR5VHlwZSA9IHNpZGVFZmZlY3RQYXJ0c1swXSxcblx0XHRcdHNpZGVFZmZlY3RQYXRoID0gYCR7c2lkZUVmZmVjdEVudGl0eVR5cGV9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TaWRlRWZmZWN0cyR7XG5cdFx0XHRcdHNpZGVFZmZlY3RQYXJ0cy5sZW5ndGggPT09IDIgPyBgIyR7c2lkZUVmZmVjdFBhcnRzWzFdfWAgOiBcIlwiXG5cdFx0XHR9YCxcblx0XHRcdHNpZGVFZmZlY3RzOiBPRGF0YVNpZGVFZmZlY3RzVHlwZSB8IHVuZGVmaW5lZCA9XG5cdFx0XHRcdHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZS5nZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzKHNpZGVFZmZlY3RFbnRpdHlUeXBlKT8uW3NpZGVFZmZlY3RQYXRoXTtcblx0XHRyZXR1cm4geyBuYW1lLCBpbW1lZGlhdGUsIHNpZGVFZmZlY3RzLCBzaWRlRWZmZWN0RW50aXR5VHlwZSB9O1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIFNpZGVFZmZlY3RzIGZvciBhIGZpZWxkLlxuXHQgKlxuXHQgKiBAcGFyYW0gZmllbGQgRmllbGQgY29udHJvbFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlbGF0ZWQgdG8gdGhlIHJlcXVlc3RlZCBpbW1lZGlhdGUgc2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgX21hbmFnZVNpZGVFZmZlY3RzRnJvbUZpZWxkKGZpZWxkOiBDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHNNYXAgPSB0aGlzLmdldEZpZWxkU2lkZUVmZmVjdHNNYXAoZmllbGQpO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0c1RvRXhlY3V0ZTogUmVjb3JkPHN0cmluZywgeyBzaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlW107IGNvbnRleHQ6IENvbnRleHQgfT4gPSB7fTtcblx0XHRcdGNvbnN0IGFkZFNpZGVFZmZlY3RzID0gKGNvbnRleHQ6IENvbnRleHQsIHNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGUpOiB2b2lkID0+IHtcblx0XHRcdFx0Y29uc3QgY29udGV4dFBhdGggPSBjb250ZXh0LmdldFBhdGgoKTtcblx0XHRcdFx0aWYgKHNpZGVFZmZlY3RzVG9FeGVjdXRlW2NvbnRleHRQYXRoXSkge1xuXHRcdFx0XHRcdHNpZGVFZmZlY3RzVG9FeGVjdXRlW2NvbnRleHRQYXRoXS5zaWRlRWZmZWN0cy5wdXNoKHNpZGVFZmZlY3RzKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzaWRlRWZmZWN0c1RvRXhlY3V0ZVtjb250ZXh0UGF0aF0gPSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRcdFx0c2lkZUVmZmVjdHM6IFtzaWRlRWZmZWN0c11cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHQvL0dldCBJbW1lZGlhdGUgU2lkZUVmZmVjdHNcblx0XHRcdGZvciAoY29uc3Qgc2lkZUVmZmVjdHNQcm9wZXJ0aWVzIG9mIE9iamVjdC52YWx1ZXMoc2lkZUVmZmVjdHNNYXApLmZpbHRlcihcblx0XHRcdFx0KHNpZGVFZmZlY3RzUHJvcGVydGllcykgPT4gc2lkZUVmZmVjdHNQcm9wZXJ0aWVzLmltbWVkaWF0ZSA9PT0gdHJ1ZVxuXHRcdFx0KSkge1xuXHRcdFx0XHQvLyBpZiB0aGlzIFNpZGVFZmZlY3RzIGlzIHJlY29yZGVkIGFzIGZhaWxlZCBTaWRlRWZmZWN0cywgbmVlZCB0byByZW1vdmUgaXQuXG5cdFx0XHRcdHRoaXMudW5yZWdpc3RlckZhaWxlZFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzUHJvcGVydGllcy5zaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWUsIHNpZGVFZmZlY3RzUHJvcGVydGllcy5jb250ZXh0KTtcblx0XHRcdFx0YWRkU2lkZUVmZmVjdHMoc2lkZUVmZmVjdHNQcm9wZXJ0aWVzLmNvbnRleHQsIHNpZGVFZmZlY3RzUHJvcGVydGllcy5zaWRlRWZmZWN0cyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vUmVwbGF5IGZhaWxlZCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIHRoZSB2aWV3IG9yIEZpZWxkXG5cdFx0XHRmb3IgKGNvbnN0IGNvbnRleHQgb2YgW2ZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCksIHRoaXMuX3ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKV0uZmlsdGVyKFxuXHRcdFx0XHQoY29udGV4dCk6IGNvbnRleHQgaXMgQ29udGV4dCA9PiAhIWNvbnRleHRcblx0XHRcdCkpIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dFBhdGggPSBjb250ZXh0LmdldFBhdGgoKTtcblx0XHRcdFx0Y29uc3QgZmFpbGVkU2lkZUVmZmVjdHMgPSB0aGlzLl9yZWdpc3RlcmVkRmFpbGVkU2lkZUVmZmVjdHNbY29udGV4dFBhdGhdID8/IFtdO1xuXHRcdFx0XHR0aGlzLnVucmVnaXN0ZXJGYWlsZWRTaWRlRWZmZWN0c0ZvckFDb250ZXh0KGNvbnRleHRQYXRoKTtcblx0XHRcdFx0Zm9yIChjb25zdCBmYWlsZWRTaWRlRWZmZWN0IG9mIGZhaWxlZFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdFx0YWRkU2lkZUVmZmVjdHMoY29udGV4dCwgZmFpbGVkU2lkZUVmZmVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0XHRPYmplY3QudmFsdWVzKHNpZGVFZmZlY3RzVG9FeGVjdXRlKS5tYXAoYXN5bmMgKHNpZGVFZmZlY3RzUHJvcGVydGllcykgPT5cblx0XHRcdFx0XHRzaWRlRWZmZWN0c1Byb3BlcnRpZXMuc2lkZUVmZmVjdHMubGVuZ3RoID09PSAxXG5cdFx0XHRcdFx0XHQ/IHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzUHJvcGVydGllcy5zaWRlRWZmZWN0c1swXSwgc2lkZUVmZmVjdHNQcm9wZXJ0aWVzLmNvbnRleHQpXG5cdFx0XHRcdFx0XHQ6IHRoaXMucmVxdWVzdE11bHRpcGxlU2lkZUVmZmVjdHMoc2lkZUVmZmVjdHNQcm9wZXJ0aWVzLnNpZGVFZmZlY3RzLCBzaWRlRWZmZWN0c1Byb3BlcnRpZXMuY29udGV4dClcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRMb2cuZGVidWcoYEVycm9yIHdoaWxlIG1hbmFnaW5nIEZpZWxkIFNpZGVFZmZlY3RzYCwgZSBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIHRyaWdnZXJDYWxsYmFja3MobmF2aWdhdGlvbjogc3RyaW5nW10pOiBQcm9taXNlPHVuZGVmaW5lZD4ge1xuXHRcdGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0bmF2aWdhdGlvbi5tYXAoKG5hdikgPT4ge1xuXHRcdFx0XHRjb25zdCByZWdpc3RlckNhbGxCYWNrID0gdGhpcy5fc2lkZUVmZmVjdHNTZXJ2aWNlLmdldFJlZ2lzdGVyZWRDYWxsYmFjayhuYXYpO1xuXHRcdFx0XHRpZiAocmVnaXN0ZXJDYWxsQmFjaykge1xuXHRcdFx0XHRcdHJldHVybiByZWdpc3RlckNhbGxCYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0fSlcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBTaWRlRWZmZWN0cyBmb3IgYSBmaWVsZEdyb3VwLlxuXHQgKlxuXHQgKiBAcGFyYW0gZmllbGRHcm91cFNpZGVFZmZlY3RzIEZpZWxkIGdyb3VwIHNpZGVFZmZlY3RzIHdpdGggaXRzIHByb21pc2Vcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXR1cm5pbmcgdHJ1ZSBpZiB0aGUgU2lkZUVmZmVjdHMgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBleGVjdXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBfcmVxdWVzdEZpZWxkR3JvdXBTaWRlRWZmZWN0cyhmaWVsZEdyb3VwU2lkZUVmZmVjdHM6IEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRoaXMudW5yZWdpc3RlckZpZWxkR3JvdXBTaWRlRWZmZWN0cyhmaWVsZEdyb3VwU2lkZUVmZmVjdHMuc2lkZUVmZmVjdFByb3BlcnR5KTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgZmllbGRHcm91cFNpZGVFZmZlY3RzLnByb21pc2U7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0TG9nLmRlYnVnKGBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIEZpZWxkR3JvdXAgU2lkZUVmZmVjdHNgLCBlIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB7IHNpZGVFZmZlY3RzLCBjb250ZXh0LCBuYW1lIH0gPSBmaWVsZEdyb3VwU2lkZUVmZmVjdHMuc2lkZUVmZmVjdFByb3BlcnR5O1xuXHRcdFx0aWYgKHRoaXMuaXNGaWVsZEdyb3VwVmFsaWQobmFtZSwgY29udGV4dCkpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMoc2lkZUVmZmVjdHMsIGNvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdExvZy5kZWJ1ZyhgRXJyb3Igd2hpbGUgZXhlY3V0aW5nIEZpZWxkR3JvdXAgU2lkZUVmZmVjdHNgLCBlIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSB2YWxpZGF0aW9uIHN0YXR1cyBvZiBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gYSBmaWVsZCBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0gZmllbGQgVGhlIGZpZWxkIGNvbnRyb2xcblx0ICogQHBhcmFtIHN1Y2Nlc3MgU3RhdHVzIG9mIHRoZSBmaWVsZCB2YWxpZGF0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9zYXZlRmllbGRQcm9wZXJ0aWVzU3RhdHVzKGZpZWxkOiBDb250cm9sLCBzdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHNNYXAgPSB0aGlzLmdldEZpZWxkU2lkZUVmZmVjdHNNYXAoZmllbGQpO1xuXHRcdE9iamVjdC5rZXlzKHNpZGVFZmZlY3RzTWFwKS5mb3JFYWNoKChrZXkpID0+IHtcblx0XHRcdGNvbnN0IHsgbmFtZSwgaW1tZWRpYXRlLCBjb250ZXh0IH0gPSBzaWRlRWZmZWN0c01hcFtrZXldO1xuXHRcdFx0aWYgKCFpbW1lZGlhdGUpIHtcblx0XHRcdFx0Y29uc3QgaWQgPSB0aGlzLl9nZXRGaWVsZEdyb3VwSW5kZXgobmFtZSwgY29udGV4dCk7XG5cdFx0XHRcdGlmIChzdWNjZXNzKSB7XG5cdFx0XHRcdFx0ZGVsZXRlIHRoaXMuX2ZpZWxkR3JvdXBJbnZhbGlkaXR5W2lkXT8uW2ZpZWxkLmdldElkKCldO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuX2ZpZWxkR3JvdXBJbnZhbGlkaXR5W2lkXSA9IHtcblx0XHRcdFx0XHRcdC4uLnRoaXMuX2ZpZWxkR3JvdXBJbnZhbGlkaXR5W2lkXSxcblx0XHRcdFx0XHRcdC4uLnsgW2ZpZWxkLmdldElkKCldOiB0cnVlIH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7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
|