@sapui5/sap.fe.core 1.124.8 → 1.124.9

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.
@@ -5,7 +5,7 @@
5
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
- 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;
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, _dec45, _dec46, _dec47, _dec48, _dec49, _dec50, _class, _class2;
9
9
  var publicExtension = ClassSupport.publicExtension;
10
10
  var privateExtension = ClassSupport.privateExtension;
11
11
  var methodOverride = ClassSupport.methodOverride;
@@ -18,10 +18,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
18
18
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
19
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; }
20
20
  const IMMEDIATE_REQUEST = "$$ImmediateRequest";
21
- let SideEffectsControllerExtension = (_dec = defineUI5Class("sap.fe.core.controllerextensions.SideEffects"), _dec2 = methodOverride(), _dec3 = publicExtension(), _dec4 = finalExtension(), _dec5 = publicExtension(), _dec6 = finalExtension(), _dec7 = publicExtension(), _dec8 = finalExtension(), _dec9 = publicExtension(), _dec10 = finalExtension(), _dec11 = publicExtension(), _dec12 = finalExtension(), _dec13 = publicExtension(), _dec14 = finalExtension(), _dec15 = publicExtension(), _dec16 = finalExtension(), _dec17 = publicExtension(), _dec18 = finalExtension(), _dec19 = publicExtension(), _dec20 = finalExtension(), _dec21 = publicExtension(), _dec22 = finalExtension(), _dec23 = publicExtension(), _dec24 = finalExtension(), _dec25 = publicExtension(), _dec26 = finalExtension(), _dec27 = publicExtension(), _dec28 = extensible(OverrideExecution.Instead), _dec29 = publicExtension(), _dec30 = extensible(OverrideExecution.Instead), _dec31 = publicExtension(), _dec32 = finalExtension(), _dec33 = privateExtension(), _dec34 = finalExtension(), _dec35 = publicExtension(), _dec36 = finalExtension(), _dec37 = publicExtension(), _dec38 = finalExtension(), _dec39 = privateExtension(), _dec40 = finalExtension(), _dec41 = privateExtension(), _dec42 = finalExtension(), _dec43 = publicExtension(), _dec44 = finalExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
21
+ let SideEffectsControllerExtension = (_dec = defineUI5Class("sap.fe.core.controllerextensions.SideEffects"), _dec2 = methodOverride(), _dec3 = publicExtension(), _dec4 = finalExtension(), _dec5 = publicExtension(), _dec6 = finalExtension(), _dec7 = publicExtension(), _dec8 = finalExtension(), _dec9 = publicExtension(), _dec10 = finalExtension(), _dec11 = publicExtension(), _dec12 = finalExtension(), _dec13 = publicExtension(), _dec14 = finalExtension(), _dec15 = publicExtension(), _dec16 = finalExtension(), _dec17 = publicExtension(), _dec18 = finalExtension(), _dec19 = publicExtension(), _dec20 = finalExtension(), _dec21 = publicExtension(), _dec22 = finalExtension(), _dec23 = publicExtension(), _dec24 = finalExtension(), _dec25 = publicExtension(), _dec26 = finalExtension(), _dec27 = publicExtension(), _dec28 = finalExtension(), _dec29 = publicExtension(), _dec30 = finalExtension(), _dec31 = publicExtension(), _dec32 = extensible(OverrideExecution.Instead), _dec33 = publicExtension(), _dec34 = extensible(OverrideExecution.Instead), _dec35 = publicExtension(), _dec36 = finalExtension(), _dec37 = privateExtension(), _dec38 = finalExtension(), _dec39 = publicExtension(), _dec40 = finalExtension(), _dec41 = publicExtension(), _dec42 = finalExtension(), _dec43 = privateExtension(), _dec44 = finalExtension(), _dec45 = privateExtension(), _dec46 = finalExtension(), _dec47 = publicExtension(), _dec48 = finalExtension(), _dec49 = publicExtension(), _dec50 = finalExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
22
22
  _inheritsLoose(SideEffectsControllerExtension, _ControllerExtension);
23
23
  function SideEffectsControllerExtension() {
24
- return _ControllerExtension.apply(this, arguments) || this;
24
+ var _this;
25
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
26
+ args[_key] = arguments[_key];
27
+ }
28
+ _this = _ControllerExtension.call(this, ...args) || this;
29
+ _this.requestExecutions = [];
30
+ return _this;
25
31
  }
26
32
  var _proto = SideEffectsControllerExtension.prototype;
27
33
  _proto.onInit = function onInit() {
@@ -85,6 +91,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
85
91
  return contextForSideEffects || undefined;
86
92
  }
87
93
 
94
+ /**
95
+ * Wait For all sideEffects execution to be completed.
96
+ *
97
+ */;
98
+ _proto.waitForSideEffectExecutions = async function waitForSideEffectExecutions() {
99
+ await Promise.allSettled(this.requestExecutions);
100
+ }
101
+
88
102
  /**
89
103
  * Gets the SideEffects map for a field
90
104
  * These SideEffects are
@@ -268,6 +282,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
268
282
  });
269
283
  }
270
284
 
285
+ /**
286
+ * Manages the deferred SideEffects which have to be executed when the context of the page changes (saving a document).
287
+ *
288
+ * @param context The context of the page
289
+ * @returns Promise returning true if the SideEffects have been successfully executed
290
+ */;
291
+ _proto.handlePageChangeContext = async function handlePageChangeContext(context) {
292
+ await this.waitForSideEffectExecutions();
293
+ const sideEffectsFieldGroupOnPage = this.getRegisteredSideEffectsForContext(context);
294
+ return Promise.all(sideEffectsFieldGroupOnPage.map(async fieldGroupSideEffects => {
295
+ return this._requestFieldGroupSideEffects(fieldGroupSideEffects);
296
+ })).catch(error => {
297
+ Log.debug(`Error while processing on page context ${context.getPath()}`, error);
298
+ });
299
+ }
300
+
271
301
  /**
272
302
  * Request SideEffects on a specific context.
273
303
  *
@@ -289,16 +319,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
289
319
  triggerAction: !this._sideEffectsService.isControlSideEffects(sideEffects) ? sideEffects.triggerAction : undefined
290
320
  };
291
321
  if (triggerAction && !ignoreTriggerActions) {
292
- this._sideEffectsService.executeAction(triggerAction, context, groupId);
322
+ this.requestExecutions.push(this._sideEffectsService.executeAction(triggerAction, context, groupId));
293
323
  }
294
324
  if (targets.length) {
295
- return this._sideEffectsService.requestSideEffects(targets, context, groupId).then(async function async() {
325
+ const requestTargets = this._sideEffectsService.requestSideEffects(targets, context, groupId).then(async function async() {
296
326
  var _sideEffects$targetEn;
297
327
  return fnTriggerCallbacks(((_sideEffects$targetEn = sideEffects.targetEntities) === null || _sideEffects$targetEn === void 0 ? void 0 : _sideEffects$targetEn.map(target => target.$NavigationPropertyPath)) || []);
298
328
  }).catch(error => {
299
329
  this.registerFailedSideEffects([sideEffects], context);
300
330
  throw error;
301
331
  });
332
+ this.requestExecutions.push(requestTargets);
333
+ return requestTargets;
302
334
  }
303
335
  }
304
336
 
@@ -577,6 +609,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
577
609
  return sideEffects;
578
610
  }
579
611
 
612
+ /**
613
+ * Gets the registered SideEffects into the queue for a context and its children.
614
+ *
615
+ * @param context The context
616
+ * @returns Array of registered SideEffects and their promise
617
+ */;
618
+ _proto.getRegisteredSideEffectsForContext = function getRegisteredSideEffectsForContext(context) {
619
+ const sideEffects = [];
620
+ for (const registryIndex of Object.keys(this._registeredFieldGroupMap)) {
621
+ if (this._registeredFieldGroupMap) if (registryIndex.includes(`_${context.getPath()}`)) {
622
+ sideEffects.push(this._registeredFieldGroupMap[registryIndex]);
623
+ }
624
+ }
625
+ return sideEffects;
626
+ }
627
+
580
628
  /**
581
629
  * Gets a status index.
582
630
  *
@@ -733,7 +781,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
733
781
  });
734
782
  };
735
783
  return SideEffectsControllerExtension;
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);
784
+ }(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, "waitForSideEffectExecutions", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "waitForSideEffectExecutions"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getFieldSideEffectsMap", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "getFieldSideEffectsMap"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getSideEffectsMapForFieldGroups", [_dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "getSideEffectsMapForFieldGroups"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "clearFieldGroupsValidity", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "clearFieldGroupsValidity"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isFieldGroupValid", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "isFieldGroupValid"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getTargetProperty", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "getTargetProperty"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "prepareDeferredSideEffectsForField", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "prepareDeferredSideEffectsForField"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldChange", [_dec23, _dec24], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldGroupChange", [_dec25, _dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldGroupChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handlePageChangeContext", [_dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "handlePageChangeContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "requestSideEffects", [_dec29, _dec30], Object.getOwnPropertyDescriptor(_class2.prototype, "requestSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "requestSideEffectsForEvent", [_dec31, _dec32], Object.getOwnPropertyDescriptor(_class2.prototype, "requestSideEffectsForEvent"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getDataRefreshText", [_dec33, _dec34], Object.getOwnPropertyDescriptor(_class2.prototype, "getDataRefreshText"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRegisteredFailedRequests", [_dec35, _dec36], Object.getOwnPropertyDescriptor(_class2.prototype, "getRegisteredFailedRequests"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "registerFailedSideEffects", [_dec37, _dec38], Object.getOwnPropertyDescriptor(_class2.prototype, "registerFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "unregisterFailedSideEffectsForAContext", [_dec39, _dec40], Object.getOwnPropertyDescriptor(_class2.prototype, "unregisterFailedSideEffectsForAContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "unregisterFailedSideEffects", [_dec41, _dec42], Object.getOwnPropertyDescriptor(_class2.prototype, "unregisterFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "registerFieldGroupSideEffects", [_dec43, _dec44], Object.getOwnPropertyDescriptor(_class2.prototype, "registerFieldGroupSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "unregisterFieldGroupSideEffects", [_dec45, _dec46], Object.getOwnPropertyDescriptor(_class2.prototype, "unregisterFieldGroupSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRegisteredSideEffectsForFieldGroup", [_dec47, _dec48], Object.getOwnPropertyDescriptor(_class2.prototype, "getRegisteredSideEffectsForFieldGroup"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRegisteredSideEffectsForContext", [_dec49, _dec50], Object.getOwnPropertyDescriptor(_class2.prototype, "getRegisteredSideEffectsForContext"), _class2.prototype)), _class2)) || _class);
737
785
  return SideEffectsControllerExtension;
738
786
  }, false);
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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
787
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJTU1FRElBVEVfUkVRVUVTVCIsIlNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiIsImRlZmluZVVJNUNsYXNzIiwibWV0aG9kT3ZlcnJpZGUiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkluc3RlYWQiLCJwcml2YXRlRXh0ZW5zaW9uIiwicmVxdWVzdEV4ZWN1dGlvbnMiLCJvbkluaXQiLCJfdmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX3BhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsIl9zaWRlRWZmZWN0c1NlcnZpY2UiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsIl9yZWdpc3RlcmVkRmllbGRHcm91cE1hcCIsIl9maWVsZEdyb3VwSW52YWxpZGl0eSIsIl9yZWdpc3RlcmVkRmFpbGVkU2lkZUVmZmVjdHMiLCJhZGRDb250cm9sU2lkZUVmZmVjdHMiLCJlbnRpdHlUeXBlIiwiY29udHJvbFNpZGVFZmZlY3RzIiwicmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzIiwiY29udHJvbCIsImNvbnRyb2xJZCIsImlzQSIsImdldElkIiwiZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzIiwiYmluZGluZ0NvbnRleHQiLCJzaWRlRWZmZWN0RW50aXR5VHlwZSIsImNvbnRleHRGb3JTaWRlRWZmZWN0cyIsImdldEVudGl0eVR5cGVGcm9tQ29udGV4dCIsImdldEJpbmRpbmciLCJnZXRDb250ZXh0IiwidW5kZWZpbmVkIiwid2FpdEZvclNpZGVFZmZlY3RFeGVjdXRpb25zIiwiUHJvbWlzZSIsImFsbFNldHRsZWQiLCJnZXRGaWVsZFNpZGVFZmZlY3RzTWFwIiwiZmllbGQiLCJzaWRlRWZmZWN0c01hcCIsImVudGl0eVNldCIsImdldEVudGl0eVNldCIsImNvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJmaWVsZEdyb3VwSWRzIiwiZ2V0RmllbGRHcm91cElkcyIsImNvbnRleHREYXRhTW9kZWxPYmplY3QiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHNGb3JUYXJnZXRQYXRoIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJnZXRTaWRlRWZmZWN0c01hcEZvckZpZWxkR3JvdXBzIiwiZ2V0QmluZGluZ0NvbnRleHQiLCJ2aWV3RW50aXR5VHlwZSIsInRhcmdldEVudGl0eVR5cGUiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJmaWVsZFBhdGgiLCJnZXRUYXJnZXRQcm9wZXJ0eSIsImNvbnRleHQiLCJjb250cm9sU2lkZUVmZmVjdHNFbnRpdHlUeXBlIiwiZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJzaWRlRWZmZWN0c05hbWUiLCJvQ29udHJvbFNpZGVFZmZlY3RzIiwic291cmNlUHJvcGVydGllcyIsImluY2x1ZGVzIiwibmFtZSIsImltbWVkaWF0ZSIsInNpZGVFZmZlY3RzIiwiZmllbGRDb250ZXh0IiwibVNpZGVFZmZlY3RzTWFwIiwiZmllbGRHcm91cElkIiwiX2dldFNpZGVFZmZlY3RzUHJvcGVydHlGb3JGaWVsZEdyb3VwIiwib0NvbnRleHQiLCJjbGVhckZpZWxkR3JvdXBzVmFsaWRpdHkiLCJpc0ZpZWxkR3JvdXBWYWxpZCIsImlkIiwiX2dldEZpZWxkR3JvdXBJbmRleCIsImxlbmd0aCIsImRhdGEiLCJtZXRhTW9kZWwiLCJ2aWV3QmluZGluZ1BhdGgiLCJnZXRQYXRoIiwidmlld01ldGFNb2RlbFBhdGgiLCJnZXRNZXRhUGF0aCIsInJlcGxhY2UiLCJwcmVwYXJlRGVmZXJyZWRTaWRlRWZmZWN0c0ZvckZpZWxkIiwiZXZlbnQiLCJmaWVsZFZhbGlkaXR5IiwiZmllbGRHcm91cFByZVJlcXVpc2l0ZSIsImdldFNvdXJjZSIsIl9zYXZlRmllbGRQcm9wZXJ0aWVzU3RhdHVzIiwiZmlsdGVyIiwic2lkZUVmZmVjdHNQcm9wZXJ0aWVzIiwicmVnaXN0ZXJGaWVsZEdyb3VwU2lkZUVmZmVjdHMiLCJoYW5kbGVGaWVsZENoYW5nZSIsInNraXBEZWZlcnJlZFJlZ2lzdHJhdGlvbiIsIl9tYW5hZ2VTaWRlRWZmZWN0c0Zyb21GaWVsZCIsImhhbmRsZUZpZWxkR3JvdXBDaGFuZ2UiLCJnZXRQYXJhbWV0ZXIiLCJmaWVsZEdyb3Vwc1NpZGVFZmZlY3RzIiwicmVkdWNlIiwicmVzdWx0cyIsImNvbmNhdCIsImdldFJlZ2lzdGVyZWRTaWRlRWZmZWN0c0ZvckZpZWxkR3JvdXAiLCJhbGwiLCJtYXAiLCJmaWVsZEdyb3VwU2lkZUVmZmVjdHMiLCJfcmVxdWVzdEZpZWxkR3JvdXBTaWRlRWZmZWN0cyIsImNhdGNoIiwiZXJyb3IiLCJMb2ciLCJkZWJ1ZyIsImhhbmRsZVBhZ2VDaGFuZ2VDb250ZXh0Iiwic2lkZUVmZmVjdHNGaWVsZEdyb3VwT25QYWdlIiwiZ2V0UmVnaXN0ZXJlZFNpZGVFZmZlY3RzRm9yQ29udGV4dCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImdyb3VwSWQiLCJmbkdldFRhcmdldHMiLCJpZ25vcmVUcmlnZ2VyQWN0aW9ucyIsImZuVHJpZ2dlckNhbGxiYWNrcyIsInRyaWdnZXJDYWxsYmFja3MiLCJiaW5kIiwidGFyZ2V0cyIsInRyaWdnZXJBY3Rpb24iLCJ0YXJnZXRFbnRpdGllcyIsInRhcmdldFByb3BlcnRpZXMiLCJpc0NvbnRyb2xTaWRlRWZmZWN0cyIsInB1c2giLCJleGVjdXRlQWN0aW9uIiwicmVxdWVzdFRhcmdldHMiLCJ0aGVuIiwiYXN5bmMiLCJ0YXJnZXQiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInJlZ2lzdGVyRmFpbGVkU2lkZUVmZmVjdHMiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JFdmVudCIsImV2ZW50TmFtZSIsInBhdGgiLCJpc0RhdGFQYXRoUmVsZXZhbnQiLCJfZmluZFJlbGV2YW50Q29udGV4dCIsIl9jb250ZXh0SXNSZWxldmFudCIsImdldENhbm9uaWNhbFBhdGgiLCJkZXBlbmRlbnRCaW5kaW5ncyIsImdldERlcGVuZGVudEJpbmRpbmdzIiwiYmluZGluZyIsImdldEJvdW5kQ29udGV4dCIsImxpc3RDb250ZXh0cyIsImdldEFsbEN1cnJlbnRDb250ZXh0cyIsImxpc3RDb250ZXh0IiwiZ2V0RGF0YVJlZnJlc2hUZXh0IiwicmVzb3VyY2VNb2RlbCIsImdldFJlc291cmNlTW9kZWwiLCJnZXRUZXh0Iiwibm90aWZ5RGF0YVJlZnJlc2giLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0Q29udHJvbGxlciIsIl9zaWRlRWZmZWN0cyIsImNvbmZpcm1EYXRhUmVmcmVzaCIsImlzQ29uZmlybWF0aW9uRGlhbG9nT3BlbiIsInJlc29sdmUiLCJyZWplY3QiLCJ0ZXh0IiwiY29uZmlybWF0aW9uRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJwcmVzcyIsImNsb3NlIiwiZW5kQnV0dG9uIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsInJlcXVlc3RNdWx0aXBsZVNpZGVFZmZlY3RzIiwibXVsdGlTaWRlRWZmZWN0cyIsInByb3BlcnRpZXMiLCJTZXQiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsImFjdGlvbnMiLCJzaWRlRWZmZWN0QWN0aW9uIiwiZm50cmlnZ2VyQ2FsbGJhY2tzIiwiYWN0aW9uIiwibXlTZXQiLCJwcm9wZXJ0eSIsImFkZCIsIm5hdmlnYXRpb25Qcm9wZXJ0eSIsIkFycmF5IiwiZnJvbSIsImdldFJlZ2lzdGVyZWRGYWlsZWRSZXF1ZXN0cyIsImlzTm90QWxyZWFkeUxpc3RlZCIsImV2ZXJ5IiwibUZhaWxlZFNpZGVFZmZlY3RzIiwidW5yZWdpc3RlckZhaWxlZFNpZGVFZmZlY3RzRm9yQUNvbnRleHQiLCJ1bnJlZ2lzdGVyRmFpbGVkU2lkZUVmZmVjdHMiLCJzaWRlRWZmZWN0c0Z1bGx5UXVhbGlmaWVkTmFtZSIsInByb21pc2UiLCJzaWRlRWZmZWN0UHJvcGVydHkiLCJ1bnJlZ2lzdGVyRmllbGRHcm91cFNpZGVFZmZlY3RzIiwicmVnaXN0cnlJbmRleCIsInN0YXJ0c1dpdGgiLCJzaWRlRWZmZWN0UGFydHMiLCJzcGxpdCIsInNpZGVFZmZlY3RQYXRoIiwiZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsInNpZGVFZmZlY3RzVG9FeGVjdXRlIiwiYWRkU2lkZUVmZmVjdHMiLCJ2YWx1ZXMiLCJmYWlsZWRTaWRlRWZmZWN0cyIsImZhaWxlZFNpZGVFZmZlY3QiLCJlIiwibmF2aWdhdGlvbiIsIm5hdiIsInJlZ2lzdGVyQ2FsbEJhY2siLCJnZXRSZWdpc3RlcmVkQ2FsbGJhY2siLCJzdWNjZXNzIiwia2V5IiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiU2lkZUVmZmVjdHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzRm9yVGFyZ2V0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIHtcblx0Q29udHJvbFNpZGVFZmZlY3RzVHlwZSxcblx0T0RhdGFTaWRlRWZmZWN0c1R5cGUsXG5cdFNpZGVFZmZlY3RzU2VydmljZSxcblx0U2lkZUVmZmVjdHNUYXJnZXQsXG5cdFNpZGVFZmZlY3RzVHlwZVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IHR5cGUgeyBSYWRpb0J1dHRvbkdyb3VwJFNlbGVjdEV2ZW50IH0gZnJvbSBcInNhcC9tL1JhZGlvQnV0dG9uR3JvdXBcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgdHlwZSBVSTVFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgQ29udHJvbCRWYWxpZGF0ZUZpZWxkR3JvdXBFdmVudCB9IGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkJENoYW5nZUV2ZW50IH0gZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIHsgTXVsdGlWYWx1ZUZpZWxkJENoYW5nZUV2ZW50IH0gZnJvbSBcInNhcC91aS9tZGMvTXVsdGlWYWx1ZUZpZWxkXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcIi4uL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwiLi4vUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZVdpdGhVSTUgfSBmcm9tIFwiLi4vaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgbWV0aG9kT3ZlcnJpZGUsIHByaXZhdGVFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCIuLi9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuXG5pbXBvcnQgdHlwZSB7IEVudGl0eVNldCwgTmF2aWdhdGlvblByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCB0eXBlIFRlbXBsYXRlQ29tcG9uZW50IGZyb20gXCIuLi9UZW1wbGF0ZUNvbXBvbmVudFwiO1xuXG50eXBlIEJhc2VTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0ge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGltbWVkaWF0ZT86IGJvb2xlYW47XG5cdHNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGU7XG59O1xuXG5leHBvcnQgdHlwZSBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUgPSBCYXNlU2lkZUVmZmVjdFByb3BlcnR5VHlwZSAmIHtcblx0Y29udGV4dDogQ29udGV4dDtcbn07XG5cbmV4cG9ydCB0eXBlIEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU+O1xuXG5leHBvcnQgdHlwZSBNYXNzRWRpdEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBCYXNlU2lkZUVmZmVjdFByb3BlcnR5VHlwZT47XG5cbnR5cGUgRmFpbGVkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0c1R5cGVbXT47XG5cbmV4cG9ydCB0eXBlIEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZSA9IHtcblx0cHJvbWlzZTogUHJvbWlzZTx1bmtub3duPjtcblx0c2lkZUVmZmVjdFByb3BlcnR5OiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU7XG59O1xuXG5jb25zdCBJTU1FRElBVEVfUkVRVUVTVCA9IFwiJCRJbW1lZGlhdGVSZXF1ZXN0XCI7XG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5TaWRlRWZmZWN0c1wiKVxuY2xhc3MgU2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByb3RlY3RlZCBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0cHJpdmF0ZSBfdmlldyE6IEZFVmlldztcblxuXHRwcml2YXRlIF9wYWdlQ29tcG9uZW50OiBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD4gfCB1bmRlZmluZWQ7XG5cblx0cHJpdmF0ZSBfcmVnaXN0ZXJlZEZpZWxkR3JvdXBNYXAhOiBSZWNvcmQ8c3RyaW5nLCBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGU+O1xuXG5cdHByaXZhdGUgX2ZpZWxkR3JvdXBJbnZhbGlkaXR5ITogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4+O1xuXG5cdHByaXZhdGUgX3NpZGVFZmZlY3RzU2VydmljZSE6IFNpZGVFZmZlY3RzU2VydmljZTtcblxuXHRwcml2YXRlIF9yZWdpc3RlcmVkRmFpbGVkU2lkZUVmZmVjdHMhOiBGYWlsZWRTaWRlRWZmZWN0RGljdGlvbmFyeTtcblxuXHRwcml2YXRlIGlzQ29uZmlybWF0aW9uRGlhbG9nT3Blbj86IGJvb2xlYW47XG5cblx0cHJpdmF0ZSByZWFkb25seSByZXF1ZXN0RXhlY3V0aW9uczogUHJvbWlzZTx1bmtub3duPltdID0gW107XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuX3ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX3BhZ2VDb21wb25lbnQgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3IodGhpcy5fdmlldykgYXMgRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+IHwgdW5kZWZpbmVkO1xuXG5cdFx0dGhpcy5fc2lkZUVmZmVjdHNTZXJ2aWNlID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX3ZpZXcpLmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdHRoaXMuX3JlZ2lzdGVyZWRGaWVsZEdyb3VwTWFwID0ge307XG5cdFx0dGhpcy5fZmllbGRHcm91cEludmFsaWRpdHkgPSB7fTtcblx0XHR0aGlzLl9yZWdpc3RlcmVkRmFpbGVkU2lkZUVmZmVjdHMgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgU2lkZUVmZmVjdHMgY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHdoZXJlIHRoZSBTaWRlRWZmZWN0cyBjb250cm9sIHdpbGwgYmUgcmVnaXN0ZXJlZFxuXHQgKiBAcGFyYW0gY29udHJvbFNpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRvIHJlZ2lzdGVyLiBFbnN1cmUgdGhlIHNvdXJjZUNvbnRyb2xJZCBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIFNBUFVJNSBjb250cm9sIElELlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFkZENvbnRyb2xTaWRlRWZmZWN0cyhlbnRpdHlUeXBlOiBzdHJpbmcsIGNvbnRyb2xTaWRlRWZmZWN0czogT21pdDxDb250cm9sU2lkZUVmZmVjdHNUeXBlLCBcImZ1bGx5UXVhbGlmaWVkTmFtZVwiPik6IHZvaWQge1xuXHRcdHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZS5hZGRDb250cm9sU2lkZUVmZmVjdHMoZW50aXR5VHlwZSwgY29udHJvbFNpZGVFZmZlY3RzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIFNpZGVFZmZlY3RzIGNyZWF0ZWQgYnkgYSBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udHJvbCBTQVBVSTUgQ29udHJvbFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyhjb250cm9sOiBDb250cm9sKTogdm9pZCB7XG5cdFx0Y29uc3QgY29udHJvbElkID0gY29udHJvbC5pc0E/LihcInNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3RcIikgJiYgY29udHJvbC5nZXRJZCgpO1xuXG5cdFx0aWYgKGNvbnRyb2xJZCkge1xuXHRcdFx0dGhpcy5fc2lkZUVmZmVjdHNTZXJ2aWNlLnJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyhjb250cm9sSWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZSBjb250ZXh0IG9uIHdoaWNoIFNpZGVFZmZlY3RzIGNhbiBiZSByZXF1ZXN0ZWQuXG5cdCAqIFRoZSBjb3JyZWN0IG9uZSBtdXN0IGhhdmUgdGhlIGJpbmRpbmcgcGFyYW1ldGVyICQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBiaW5kaW5nQ29udGV4dCBJbml0aWFsIGJpbmRpbmcgY29udGV4dFxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdEVudGl0eVR5cGUgRW50aXR5VHlwZSBvZiB0aGUgc2lkZUVmZmVjdHNcblx0ICogQHJldHVybnMgU0FQVUk1IENvbnRleHQgb3IgdW5kZWZpbmVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKGJpbmRpbmdDb250ZXh0OiBDb250ZXh0LCBzaWRlRWZmZWN0RW50aXR5VHlwZTogc3RyaW5nKTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IGNvbnRleHRGb3JTaWRlRWZmZWN0cyA9IGJpbmRpbmdDb250ZXh0LFxuXHRcdFx0ZW50aXR5VHlwZSA9IHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQoYmluZGluZ0NvbnRleHQpO1xuXG5cdFx0aWYgKHNpZGVFZmZlY3RFbnRpdHlUeXBlICE9PSBlbnRpdHlUeXBlKSB7XG5cdFx0XHRjb250ZXh0Rm9yU2lkZUVmZmVjdHMgPSBiaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0Q29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRpZiAoY29udGV4dEZvclNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdGVudGl0eVR5cGUgPSB0aGlzLl9zaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KGNvbnRleHRGb3JTaWRlRWZmZWN0cyk7XG5cdFx0XHRcdGlmIChzaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gZW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdGNvbnRleHRGb3JTaWRlRWZmZWN0cyA9IGNvbnRleHRGb3JTaWRlRWZmZWN0cy5nZXRCaW5kaW5nKCkuZ2V0Q29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRcdFx0aWYgKGNvbnRleHRGb3JTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRcdFx0ZW50aXR5VHlwZSA9IHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQoY29udGV4dEZvclNpZGVFZmZlY3RzKTtcblx0XHRcdFx0XHRcdGlmIChzaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gZW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjb250ZXh0Rm9yU2lkZUVmZmVjdHMgfHwgdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdhaXQgRm9yIGFsbCBzaWRlRWZmZWN0cyBleGVjdXRpb24gdG8gYmUgY29tcGxldGVkLlxuXHQgKlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHdhaXRGb3JTaWRlRWZmZWN0RXhlY3V0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodGhpcy5yZXF1ZXN0RXhlY3V0aW9ucyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgbWFwIGZvciBhIGZpZWxkXG5cdCAqIFRoZXNlIFNpZGVFZmZlY3RzIGFyZVxuXHQgKiAtIGxpc3RlZCBpbnRvIEZpZWxkR3JvdXBJZHMgKGNvbWluZyBmcm9tIGFuIE9EYXRhIFNlcnZpY2UpXG5cdCAqIC0gZ2VuZXJhdGVkIGJ5IGEgY29udHJvbCBvciBjb250cm9scyBhbmQgdGhhdCBjb25maWd1cmUgdGhpcyBmaWVsZCBhcyBTb3VyY2VQcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAcGFyYW0gZmllbGQgRmllbGQgY29udHJvbFxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyBtYXBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRGaWVsZFNpZGVFZmZlY3RzTWFwKGZpZWxkOiBDb250cm9sKTogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSB7XG5cdFx0bGV0IHNpZGVFZmZlY3RzTWFwOiBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0ge307XG5cdFx0aWYgKHRoaXMuX3BhZ2VDb21wb25lbnQpIHtcblx0XHRcdGNvbnN0IGVudGl0eVNldCA9IHRoaXMuX3BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0Py4oKTtcblx0XHRcdGNvbnN0IGNvbnRleHRQYXRoID0gdGhpcy5fcGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aD8uKCkgfHwgKGVudGl0eVNldCAmJiBgLyR7ZW50aXR5U2V0fWApO1xuXG5cdFx0XHRpZiAoY29udGV4dFBhdGgpIHtcblx0XHRcdFx0Y29uc3QgZmllbGRHcm91cElkcyA9IGZpZWxkLmdldEZpZWxkR3JvdXBJZHMoKSxcblx0XHRcdFx0XHRjb250ZXh0RGF0YU1vZGVsT2JqZWN0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzRm9yVGFyZ2V0UGF0aDxFbnRpdHlTZXQgfCBOYXZpZ2F0aW9uUHJvcGVydHk+KFxuXHRcdFx0XHRcdFx0Y29udGV4dFBhdGgsXG5cdFx0XHRcdFx0XHR0aGlzLl92aWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIFNpZGVFZmZlY3RzIGNvbWluZyBmcm9tIGFuIE9EYXRhIFNlcnZpY2Vcblx0XHRcdFx0c2lkZUVmZmVjdHNNYXAgPSB0aGlzLmdldFNpZGVFZmZlY3RzTWFwRm9yRmllbGRHcm91cHMoXG5cdFx0XHRcdFx0ZmllbGRHcm91cElkcyxcblx0XHRcdFx0XHRmaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkXG5cdFx0XHRcdCkgYXMgRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeTtcblxuXHRcdFx0XHQvLyBTaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBjb250cm9sKHMpXG5cdFx0XHRcdGlmIChjb250ZXh0RGF0YU1vZGVsT2JqZWN0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgdmlld0VudGl0eVR5cGUgPSBjb250ZXh0RGF0YU1vZGVsT2JqZWN0LnRhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRcdFx0ZmllbGRQYXRoID0gdGhpcy5nZXRUYXJnZXRQcm9wZXJ0eShmaWVsZCksXG5cdFx0XHRcdFx0XHRjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHMoZmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0LCB2aWV3RW50aXR5VHlwZSk7XG5cblx0XHRcdFx0XHRpZiAoZmllbGRQYXRoICYmIGNvbnRleHQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbnRyb2xTaWRlRWZmZWN0c0VudGl0eVR5cGUgPSB0aGlzLl9zaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzKHZpZXdFbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRcdE9iamVjdC5rZXlzKGNvbnRyb2xTaWRlRWZmZWN0c0VudGl0eVR5cGUpLmZvckVhY2goKHNpZGVFZmZlY3RzTmFtZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvQ29udHJvbFNpZGVFZmZlY3RzID0gY29udHJvbFNpZGVFZmZlY3RzRW50aXR5VHlwZVtzaWRlRWZmZWN0c05hbWVdO1xuXHRcdFx0XHRcdFx0XHRpZiAob0NvbnRyb2xTaWRlRWZmZWN0cy5zb3VyY2VQcm9wZXJ0aWVzLmluY2x1ZGVzKGZpZWxkUGF0aCkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBuYW1lID0gYCR7c2lkZUVmZmVjdHNOYW1lfTo6JHt2aWV3RW50aXR5VHlwZX1gO1xuXHRcdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzTWFwW25hbWVdID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdGltbWVkaWF0ZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvQ29udHJvbFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dDogY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc2lkZUVmZmVjdHNNYXA7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgc2lkZUVmZmVjdHMgbWFwIGZvciBmaWVsZEdyb3Vwcy5cblx0ICpcblx0ICogQHBhcmFtIGZpZWxkR3JvdXBJZHMgRmllbGQgZ3JvdXAgaWRzXG5cdCAqIEBwYXJhbSBmaWVsZENvbnRleHQgRmllbGQgYmluZGluZyBjb250ZXh0XG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIG1hcFxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0U2lkZUVmZmVjdHNNYXBGb3JGaWVsZEdyb3Vwcyhcblx0XHRmaWVsZEdyb3VwSWRzOiBzdHJpbmdbXSxcblx0XHRmaWVsZENvbnRleHQ/OiBDb250ZXh0IHwgbnVsbFxuXHQpOiBNYXNzRWRpdEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgfCBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5IHtcblx0XHRjb25zdCBtU2lkZUVmZmVjdHNNYXA6IE1hc3NFZGl0RmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSB8IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSB7fTtcblx0XHRmaWVsZEdyb3VwSWRzLmZvckVhY2goKGZpZWxkR3JvdXBJZCkgPT4ge1xuXHRcdFx0Y29uc3QgeyBuYW1lLCBpbW1lZGlhdGUsIHNpZGVFZmZlY3RzLCBzaWRlRWZmZWN0RW50aXR5VHlwZSB9ID0gdGhpcy5fZ2V0U2lkZUVmZmVjdHNQcm9wZXJ0eUZvckZpZWxkR3JvdXAoZmllbGRHcm91cElkKTtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gZmllbGRDb250ZXh0ID8gKHRoaXMuZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKGZpZWxkQ29udGV4dCwgc2lkZUVmZmVjdEVudGl0eVR5cGUpIGFzIENvbnRleHQpIDogdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHNpZGVFZmZlY3RzICYmICghZmllbGRDb250ZXh0IHx8IChmaWVsZENvbnRleHQgJiYgb0NvbnRleHQpKSkge1xuXHRcdFx0XHRtU2lkZUVmZmVjdHNNYXBbbmFtZV0gPSB7XG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRpbW1lZGlhdGUsXG5cdFx0XHRcdFx0c2lkZUVmZmVjdHNcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKGZpZWxkQ29udGV4dCkge1xuXHRcdFx0XHRcdChtU2lkZUVmZmVjdHNNYXBbbmFtZV0gYXMgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlKS5jb250ZXh0ID0gb0NvbnRleHQhO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG1TaWRlRWZmZWN0c01hcDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhciByZWNvcmRlZCB2YWxpZGF0aW9uIHN0YXR1cyBmb3IgYWxsIHByb3BlcnRpZXMuXG5cdCAqXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Y2xlYXJGaWVsZEdyb3Vwc1ZhbGlkaXR5KCk6IHZvaWQge1xuXHRcdHRoaXMuX2ZpZWxkR3JvdXBJbnZhbGlkaXR5ID0ge307XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYXIgcmVjb3JkZWQgdmFsaWRhdGlvbiBzdGF0dXMgZm9yIGFsbCBwcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAcGFyYW0gZmllbGRHcm91cElkIEZpZWxkIGdyb3VwIGlkXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHRcblx0ICogQHJldHVybnMgU0FQVUk1IENvbnRleHQgb3IgdW5kZWZpbmVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aXNGaWVsZEdyb3VwVmFsaWQoZmllbGRHcm91cElkOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBpZCA9IHRoaXMuX2dldEZpZWxkR3JvdXBJbmRleChmaWVsZEdyb3VwSWQsIGNvbnRleHQpO1xuXHRcdHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9maWVsZEdyb3VwSW52YWxpZGl0eVtpZF0gPz8ge30pLmxlbmd0aCA9PT0gMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSByZWxhdGl2ZSB0YXJnZXQgcHJvcGVydHkgcmVsYXRlZCB0byB0aGUgRmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBmaWVsZCBGaWVsZCBjb250cm9sXG5cdCAqIEByZXR1cm5zIFJlbGF0aXZlIHRhcmdldCBwcm9wZXJ0eVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldFRhcmdldFByb3BlcnR5KGZpZWxkOiBDb250cm9sKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBmaWVsZFBhdGggPSBmaWVsZC5kYXRhKFwic291cmNlUGF0aFwiKSBhcyBzdHJpbmc7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gdGhpcy5fdmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IHZpZXdCaW5kaW5nUGF0aCA9IHRoaXMuX3ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IHZpZXdNZXRhTW9kZWxQYXRoID0gdmlld0JpbmRpbmdQYXRoID8gYCR7bWV0YU1vZGVsLmdldE1ldGFQYXRoKHZpZXdCaW5kaW5nUGF0aCl9L2AgOiBcIlwiO1xuXHRcdHJldHVybiBmaWVsZFBhdGg/LnJlcGxhY2Uodmlld01ldGFNb2RlbFBhdGgsIFwiXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhY2hlcyBkZWZlcnJlZCBTaWRlRWZmZWN0cyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgRmllbGRHcm91cCBpcyB1bmZvY3VzZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBldmVudCBTQVBVSTUgZXZlbnQgdGhhdCBjb21lcyBmcm9tIGEgZmllbGQgY2hhbmdlXG5cdCAqIEBwYXJhbSBmaWVsZFZhbGlkaXR5XG5cdCAqIEBwYXJhbSBmaWVsZEdyb3VwUHJlUmVxdWlzaXRlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkIGJlZm9yZSBleGVjdXRpbmcgZGVmZXJyZWQgU2lkZUVmZmVjdHNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwcmVwYXJlRGVmZXJyZWRTaWRlRWZmZWN0c0ZvckZpZWxkKFxuXHRcdGV2ZW50OiBGaWVsZCRDaGFuZ2VFdmVudCB8IE11bHRpVmFsdWVGaWVsZCRDaGFuZ2VFdmVudCB8IFJhZGlvQnV0dG9uR3JvdXAkU2VsZWN0RXZlbnQsXG5cdFx0ZmllbGRWYWxpZGl0eTogYm9vbGVhbixcblx0XHRmaWVsZEdyb3VwUHJlUmVxdWlzaXRlPzogUHJvbWlzZTx1bmtub3duPlxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBmaWVsZCA9IChldmVudCBhcyBVSTVFdmVudDx7fSwgQ29udHJvbD4pLmdldFNvdXJjZSgpO1xuXHRcdHRoaXMuX3NhdmVGaWVsZFByb3BlcnRpZXNTdGF0dXMoZmllbGQsIGZpZWxkVmFsaWRpdHkpO1xuXHRcdGlmICghZmllbGRWYWxpZGl0eSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBzaWRlRWZmZWN0c01hcCA9IHRoaXMuZ2V0RmllbGRTaWRlRWZmZWN0c01hcChmaWVsZCk7XG5cblx0XHQvLyByZWdpc3RlciBmaWVsZCBncm91cCBTaWRlRWZmZWN0c1xuXHRcdE9iamVjdC5rZXlzKHNpZGVFZmZlY3RzTWFwKVxuXHRcdFx0LmZpbHRlcigoc2lkZUVmZmVjdHNOYW1lKSA9PiBzaWRlRWZmZWN0c01hcFtzaWRlRWZmZWN0c05hbWVdLmltbWVkaWF0ZSAhPT0gdHJ1ZSlcblx0XHRcdC5mb3JFYWNoKChzaWRlRWZmZWN0c05hbWUpID0+IHtcblx0XHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHNQcm9wZXJ0aWVzID0gc2lkZUVmZmVjdHNNYXBbc2lkZUVmZmVjdHNOYW1lXTtcblx0XHRcdFx0dGhpcy5yZWdpc3RlckZpZWxkR3JvdXBTaWRlRWZmZWN0cyhzaWRlRWZmZWN0c1Byb3BlcnRpZXMsIGZpZWxkR3JvdXBQcmVSZXF1aXNpdGUpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogTWFuYWdlcyB0aGUgd29ya2Zsb3cgZm9yIFNpZGVFZmZlY3RzIHdpdGggcmVsYXRlZCBjaGFuZ2VzIHRvIGEgZmllbGRcblx0ICogVGhlIGZvbGxvd2luZyBzY2VuYXJpb3MgYXJlIG1hbmFnZWQ6XG5cdCAqICAtIFJlZ2lzdGVyOiBjYWNoZXMgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIEZpZWxkR3JvdXAgaXMgdW5mb2N1c2VkXG5cdCAqICAtIEV4ZWN1dGU6IHRyaWdnZXJzIGltbWVkaWF0ZSBTaWRlRWZmZWN0cyByZXF1ZXN0cyBpZiB0aGUgcHJvbWlzZSBmb3IgdGhlIGZpZWxkIGV2ZW50IGlzIGZ1bGZpbGxlZC5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IFNBUFVJNSBldmVudCB0aGF0IGNvbWVzIGZyb20gYSBmaWVsZCBjaGFuZ2Vcblx0ICogQHBhcmFtIGZpZWxkVmFsaWRpdHlcblx0ICogQHBhcmFtIGZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgYmVmb3JlIGV4ZWN1dGluZyBkZWZlcnJlZCBTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gc2tpcERlZmVycmVkUmVnaXN0cmF0aW9uIElmIHRydWUgdGhlbiBkZWZlcnJlZCBzaWRlIGVmZmVjdHMgYXJlIG5vdCByZWdpc3RlcmVkLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSByZWdpc3RyYXRpb24gb2YgZGVmZXJyZWQgc2lkZSBlZmZlY3RzIGFuZCB0cmlnZ2VyaW5nIG5lZWRzIHRvIGJlIGRvbmUgc2VwYXJhdGVseS5cblx0ICogQHJldHVybnMgIFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdChzKVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGhhbmRsZUZpZWxkQ2hhbmdlKFxuXHRcdGV2ZW50OiBGaWVsZCRDaGFuZ2VFdmVudCB8IE11bHRpVmFsdWVGaWVsZCRDaGFuZ2VFdmVudCB8IFJhZGlvQnV0dG9uR3JvdXAkU2VsZWN0RXZlbnQsXG5cdFx0ZmllbGRWYWxpZGl0eTogYm9vbGVhbixcblx0XHRmaWVsZEdyb3VwUHJlUmVxdWlzaXRlPzogUHJvbWlzZTx1bmtub3duPixcblx0XHRza2lwRGVmZXJyZWRSZWdpc3RyYXRpb24gPSBmYWxzZVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBmaWVsZCA9IChldmVudCBhcyBVSTVFdmVudDx7fSwgQ29udHJvbD4pLmdldFNvdXJjZSgpO1xuXHRcdGlmICghc2tpcERlZmVycmVkUmVnaXN0cmF0aW9uKSB7XG5cdFx0XHR0aGlzLnByZXBhcmVEZWZlcnJlZFNpZGVFZmZlY3RzRm9yRmllbGQoZXZlbnQsIGZpZWxkVmFsaWRpdHksIGZpZWxkR3JvdXBQcmVSZXF1aXNpdGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9zYXZlRmllbGRQcm9wZXJ0aWVzU3RhdHVzKGZpZWxkLCBmaWVsZFZhbGlkaXR5KTtcblx0XHRcdGlmICghZmllbGRWYWxpZGl0eSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9tYW5hZ2VTaWRlRWZmZWN0c0Zyb21GaWVsZChmaWVsZCk7XG5cdH1cblxuXHQvKipcblx0ICogTWFuYWdlcyBTaWRlRWZmZWN0cyB3aXRoIGEgcmVsYXRlZCAnZm9jdXMgb3V0JyB0byBhIGZpZWxkIGdyb3VwLlxuXHQgKlxuXHQgKiBAcGFyYW0gZXZlbnQgU0FQVUk1IEV2ZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmV0dXJuaW5nIHRydWUgaWYgdGhlIFNpZGVFZmZlY3RzIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgZXhlY3V0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBoYW5kbGVGaWVsZEdyb3VwQ2hhbmdlKGV2ZW50OiBDb250cm9sJFZhbGlkYXRlRmllbGRHcm91cEV2ZW50KTogUHJvbWlzZTx2b2lkIHwgdm9pZFtdPiB7XG5cdFx0Y29uc3QgZmllbGQgPSBldmVudC5nZXRTb3VyY2UoKSxcblx0XHRcdGZpZWxkR3JvdXBJZHM6IHN0cmluZ1tdID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwiZmllbGRHcm91cElkc1wiKSA/PyBbXSxcblx0XHRcdGZpZWxkR3JvdXBzU2lkZUVmZmVjdHMgPSBmaWVsZEdyb3VwSWRzLnJlZHVjZSgocmVzdWx0czogRmllbGRHcm91cFNpZGVFZmZlY3RUeXBlW10sIGZpZWxkR3JvdXBJZCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cy5jb25jYXQodGhpcy5nZXRSZWdpc3RlcmVkU2lkZUVmZmVjdHNGb3JGaWVsZEdyb3VwKGZpZWxkR3JvdXBJZCkpO1xuXHRcdFx0fSwgW10pO1xuXG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0ZmllbGRHcm91cHNTaWRlRWZmZWN0cy5tYXAoYXN5bmMgKGZpZWxkR3JvdXBTaWRlRWZmZWN0cykgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fcmVxdWVzdEZpZWxkR3JvdXBTaWRlRWZmZWN0cyhmaWVsZEdyb3VwU2lkZUVmZmVjdHMpO1xuXHRcdFx0fSlcblx0XHQpLmNhdGNoKChlcnJvcikgPT4ge1xuXHRcdFx0Y29uc3QgY29udGV4dFBhdGggPSBmaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCk7XG5cdFx0XHRMb2cuZGVidWcoYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgRmllbGRHcm91cCBTaWRlRWZmZWN0cyBvbiBjb250ZXh0ICR7Y29udGV4dFBhdGh9YCwgZXJyb3IpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIGRlZmVycmVkIFNpZGVFZmZlY3RzIHdoaWNoIGhhdmUgdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGUgY29udGV4dCBvZiB0aGUgcGFnZSBjaGFuZ2VzIChzYXZpbmcgYSBkb2N1bWVudCkuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBwYWdlXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmV0dXJuaW5nIHRydWUgaWYgdGhlIFNpZGVFZmZlY3RzIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgZXhlY3V0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBoYW5kbGVQYWdlQ2hhbmdlQ29udGV4dChjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkIHwgdW5rbm93bltdPiB7XG5cdFx0YXdhaXQgdGhpcy53YWl0Rm9yU2lkZUVmZmVjdEV4ZWN1dGlvbnMoKTtcblx0XHRjb25zdCBzaWRlRWZmZWN0c0ZpZWxkR3JvdXBPblBhZ2UgPSB0aGlzLmdldFJlZ2lzdGVyZWRTaWRlRWZmZWN0c0ZvckNvbnRleHQoY29udGV4dCk7XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0c2lkZUVmZmVjdHNGaWVsZEdyb3VwT25QYWdlLm1hcChhc3luYyAoZmllbGRHcm91cFNpZGVFZmZlY3RzKSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9yZXF1ZXN0RmllbGRHcm91cFNpZGVFZmZlY3RzKGZpZWxkR3JvdXBTaWRlRWZmZWN0cyk7XG5cdFx0XHR9KVxuXHRcdCkuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRMb2cuZGVidWcoYEVycm9yIHdoaWxlIHByb2Nlc3Npbmcgb24gcGFnZSBjb250ZXh0ICR7Y29udGV4dC5nZXRQYXRoKCl9YCwgZXJyb3IpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgU2lkZUVmZmVjdHMgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSBncm91cElkXG5cdCAqIEBwYXJhbSBmbkdldFRhcmdldHMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgZ2l2ZSB1cyB0aGUgdGFyZ2V0cyBhbmQgYWN0aW9ucyBpZiBpdCB3YXMgY29taW5nIHRocm91Z2ggc29tZSBzcGVjaWZpYyBoYW5kbGluZy5cblx0ICogQHBhcmFtIGlnbm9yZVRyaWdnZXJBY3Rpb25zIElmIHRydWUsIHdlIGRvIG5vdCB0cmlnZ2VyIGFjdGlvbnMgZGVmaW5lZCBpbiB0aGUgc2lkZSBlZmZlY3Rcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgcmVxdWVzdCBvbiBTQVBVSTUgY29udGV4dFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHJlcXVlc3RTaWRlRWZmZWN0cyhcblx0XHRzaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlLFxuXHRcdGNvbnRleHQ6IENvbnRleHQsXG5cdFx0Z3JvdXBJZD86IHN0cmluZyxcblx0XHRmbkdldFRhcmdldHM/OiAoc2lkZUVmZmVjdHNEZWY6IFNpZGVFZmZlY3RzVHlwZSkgPT4geyB0YXJnZXRzOiBTaWRlRWZmZWN0c1RhcmdldFtdOyB0cmlnZ2VyQWN0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQgfSxcblx0XHRpZ25vcmVUcmlnZ2VyQWN0aW9ucyA9IGZhbHNlXG5cdCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdGNvbnN0IGZuVHJpZ2dlckNhbGxiYWNrcyA9IHRoaXMudHJpZ2dlckNhbGxiYWNrcy5iaW5kKHRoaXMpO1xuXHRcdGNvbnN0IHsgdGFyZ2V0cywgdHJpZ2dlckFjdGlvbiB9ID0gZm5HZXRUYXJnZXRzXG5cdFx0XHQ/IGZuR2V0VGFyZ2V0cyhzaWRlRWZmZWN0cylcblx0XHRcdDoge1xuXHRcdFx0XHRcdHRhcmdldHM6IFsuLi4oc2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMgPz8gW10pLCAuLi4oc2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcyA/PyBbXSldLFxuXHRcdFx0XHRcdHRyaWdnZXJBY3Rpb246ICF0aGlzLl9zaWRlRWZmZWN0c1NlcnZpY2UuaXNDb250cm9sU2lkZUVmZmVjdHMoc2lkZUVmZmVjdHMpID8gc2lkZUVmZmVjdHMudHJpZ2dlckFjdGlvbiA6IHVuZGVmaW5lZFxuXHRcdFx0ICB9O1xuXHRcdGlmICh0cmlnZ2VyQWN0aW9uICYmICFpZ25vcmVUcmlnZ2VyQWN0aW9ucykge1xuXHRcdFx0dGhpcy5yZXF1ZXN0RXhlY3V0aW9ucy5wdXNoKHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZS5leGVjdXRlQWN0aW9uKHRyaWdnZXJBY3Rpb24sIGNvbnRleHQsIGdyb3VwSWQpKTtcblx0XHR9XG5cblx0XHRpZiAodGFyZ2V0cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IHJlcXVlc3RUYXJnZXRzID0gdGhpcy5fc2lkZUVmZmVjdHNTZXJ2aWNlXG5cdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHModGFyZ2V0cywgY29udGV4dCwgZ3JvdXBJZClcblx0XHRcdFx0LnRoZW4oYXN5bmMgZnVuY3Rpb24gYXN5bmMoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZuVHJpZ2dlckNhbGxiYWNrcyhzaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcz8ubWFwKCh0YXJnZXQpID0+IHRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgfHwgW10pO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5yZWdpc3RlckZhaWxlZFNpZGVFZmZlY3RzKFtzaWRlRWZmZWN0c10sIGNvbnRleHQpO1xuXHRcdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0XHR9KTtcblx0XHRcdHRoaXMucmVxdWVzdEV4ZWN1dGlvbnMucHVzaChyZXF1ZXN0VGFyZ2V0cyk7XG5cdFx0XHRyZXR1cm4gcmVxdWVzdFRhcmdldHM7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBTaWRlRWZmZWN0cyBmb3IgYSBzaWRlRWZmZWN0IGV2ZW50LlxuXHQgKlxuXHQgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB0byBleGVjdXRlIHRoZSBzaWRlIGVmZmVjdCBvbiB0aGUgcGFnZSdzIGNvbnRleHQsIGJ1dCBwYWdlcyAobGlrZSB0aGUgTFIpIG1pZ2h0IG92ZXJyaWRlIHRoaXMgbWV0aG9kLlxuXHQgKlxuXHQgKiBAcGFyYW0gZXZlbnROYW1lIFNpZGVFZmZlY3RzIGV2ZW50IHdoaWNoIHdhcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIHBhdGggVGhlIHBhdGggZm9yIHdoaWNoIHRoaXMgZXZlbnQgd2FzIHRyaWdnZXJlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIG9uIFNpZGVFZmZlY3RzIHJlcXVlc3Rcblx0ICovXG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdGFzeW5jIHJlcXVlc3RTaWRlRWZmZWN0c0ZvckV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHVuZGVmaW5lZD4ge1xuXHRcdGlmICh0aGlzLmlzRGF0YVBhdGhSZWxldmFudChwYXRoKSkge1xuXHRcdFx0Ly8gdXNlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZyb20gdGhlIFNpZGVFZmZlY3RzIFNlcnZpY2Vcblx0XHRcdGNvbnN0IGNvbnRleHQgPSB0aGlzLl9maW5kUmVsZXZhbnRDb250ZXh0KHBhdGgsIHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCk7XG5cdFx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fc2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0c0ZvckV2ZW50KGV2ZW50TmFtZSwgY29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGdpdmVuIGRhdGEgcGF0aCBpcyBzaG93bi9yZWxldmFudCBvbiB0aGUgcGFnZS5cblx0ICpcblx0ICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gYmUgY2hlY2tlZFxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBkYXRhIHBhdGggaXMgc2hvd24gb24gdGhlIFVJXG5cdCAqL1xuXHRpc0RhdGFQYXRoUmVsZXZhbnQocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblxuXHRcdGlmICh0aGlzLl9jb250ZXh0SXNSZWxldmFudChwYXRoLCBjb250ZXh0KSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICEhdGhpcy5fZmluZFJlbGV2YW50Q29udGV4dChwYXRoLCBjb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBnaXZlbiBjb250ZXh0IGZpdHMgdG8gYSBnaXZlbiBwYXRoLlxuXHQgKlxuXHQgKiBUaGlzIGlzIGRvbmUgYnkgY2hlY2tpbmcgYm90aCB0aGUgbmF2aWdhdGlvbiBwYXRoIGFuZCB0aGUgY2Fub25pY2FsIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGJlIGNoZWNrZWRcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgY2hlY2tlZFxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb250ZXh0IGZpdHMgdG8gdGhlIGdpdmVuIHBhdGhcblx0ICovXG5cdF9jb250ZXh0SXNSZWxldmFudChwYXRoOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gY29udGV4dD8uZ2V0UGF0aCgpID09PSBwYXRoIHx8IGNvbnRleHQ/LmdldENhbm9uaWNhbFBhdGgoKSA9PT0gcGF0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBGaW5kIGNvbnRleHQgZm9yIGEgZ2l2ZW4gcGF0aCBieSBjaGVja2luZyBkZXBlbmRlbnQgYmluZGluZ3MuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGJlIGNoZWNrZWRcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIHBhcmVudCBjb250ZXh0XG5cdCAqIEByZXR1cm5zIENvbnRleHQgaWYgZm91bmQsIG90aGVyd2lzZSByZXR1cm5zIHVuZGVmaW5lZFxuXHQgKi9cblx0X2ZpbmRSZWxldmFudENvbnRleHQocGF0aDogc3RyaW5nLCBjb250ZXh0OiBDb250ZXh0KTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHRoaXMuX2NvbnRleHRJc1JlbGV2YW50KHBhdGgsIGNvbnRleHQpKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dDtcblx0XHR9XG5cblx0XHRjb25zdCBkZXBlbmRlbnRCaW5kaW5ncyA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXREZXBlbmRlbnRCaW5kaW5ncyhjb250ZXh0KTtcblx0XHRmb3IgKGNvbnN0IGJpbmRpbmcgb2YgZGVwZW5kZW50QmluZGluZ3MpIHtcblx0XHRcdGlmIChiaW5kaW5nLmlzQTxPRGF0YUNvbnRleHRCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9jb250ZXh0SXNSZWxldmFudChwYXRoLCBiaW5kaW5nLmdldEJvdW5kQ29udGV4dCgpKSkge1xuXHRcdFx0XHRcdHJldHVybiBiaW5kaW5nLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGJpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Y29uc3QgbGlzdENvbnRleHRzID0gYmluZGluZy5nZXRBbGxDdXJyZW50Q29udGV4dHMoKTtcblx0XHRcdFx0Zm9yIChjb25zdCBsaXN0Q29udGV4dCBvZiBsaXN0Q29udGV4dHMpIHtcblx0XHRcdFx0XHRpZiAodGhpcy5fY29udGV4dElzUmVsZXZhbnQocGF0aCwgbGlzdENvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbGlzdENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0ZXh0IHRvIGJlIHNob3duIGZvciB1c2VyIHRvIGluZGljYXRlIGRhdGEgcmVmcmVzaC5cblx0ICpcblx0ICogVGhpcyBpcyBjdXJyZW50bHkgb25seSB1c2VkIGJ5IFNpZGVFZmZlY3RzIGV2ZW50cy4gUGFnZXMgKGxpa2UgdGhlIExSKSBtaWdodCBvdmVycmlkZSB0aGlzIG1ldGhvZC5cblx0ICpcblx0ICogQHJldHVybnMgVGV4dCB0byBiZSBzaG93biB0byB0aGUgdXNlciBpbiBjYXNlIG9mIGEgZGF0YSByZWZyZXNoXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkKVxuXHRnZXREYXRhUmVmcmVzaFRleHQoKTogc3RyaW5nIHtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0cmV0dXJuIHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfU0VSVkVSX0VWRU5UU19ORVdfREFUQV9JVEVNXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5vdGlmeSB0aGUgdXNlciB0aGF0IGRhdGEgd2FzIHJlZnJlc2hlZC5cblx0ICpcblx0ICogVGhpcyBpcyBjdXJyZW50bHkgb25seSB1c2VkIGJ5IFNpZGVFZmZlY3RzIGV2ZW50cy5cblx0ICovXG5cblx0bm90aWZ5RGF0YVJlZnJlc2goKTogdm9pZCB7XG5cdFx0TWVzc2FnZVRvYXN0LnNob3codGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkuX3NpZGVFZmZlY3RzLmdldERhdGFSZWZyZXNoVGV4dCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBc2sgdGhlIHVzZXIgZm9yIGNvbmZpcm1hdGlvbiBvZiBhIGRhdGEgcmVmcmVzaC5cblx0ICpcblx0ICogVGhpcyBpcyBjdXJyZW50bHkgb25seSB1c2VkIGJ5IFNpZGVFZmZlY3RzIGV2ZW50cy5cblx0ICpcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIGlmIHRoZSB1c2VyIGNvbmZpcm1zIGFuZCByZWplY3RzIGlmIHRoZSB1c2VyIGNhbmNlbHMuXG5cdCAqL1xuXHRhc3luYyBjb25maXJtRGF0YVJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmlzQ29uZmlybWF0aW9uRGlhbG9nT3Blbikge1xuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0Y29uc3QgdGV4dCA9IHRoaXMuZ2V0RGF0YVJlZnJlc2hUZXh0KCk7XG5cdFx0XHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKHRoaXMuZ2V0VmlldygpKTtcblxuXHRcdFx0XHRjb25zdCBjb25maXJtYXRpb25EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHR0aXRsZTogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiV0FSTklOR1wiKSxcblx0XHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoeyB0ZXh0OiB0ZXh0IH0pLFxuXHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX1JFRlJFU0hcIiksXG5cdFx0XHRcdFx0XHRwcmVzczogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25maXJtYXRpb25EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRcdFx0cHJlc3M6ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uZmlybWF0aW9uRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdGFmdGVyQ2xvc2U6ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdGNvbmZpcm1hdGlvbkRpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHR0aGlzLmlzQ29uZmlybWF0aW9uRGlhbG9nT3BlbiA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbmZpcm1hdGlvbkRpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0dGhpcy5pc0NvbmZpcm1hdGlvbkRpYWxvZ09wZW4gPSB0cnVlO1xuXHRcdFx0XHRjb25maXJtYXRpb25EaWFsb2cub3BlbigpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgbXVsdGlwbGUgU2lkZUVmZmVjdHMgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gbXVsdGlTaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGdyb3VwIGlkIG9mIHRoZSBiYXRjaFxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyByZXF1ZXN0IG9uIFNBUFVJNSBjb250ZXh0XG5cdCAqL1xuXHRhc3luYyByZXF1ZXN0TXVsdGlwbGVTaWRlRWZmZWN0cyhtdWx0aVNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGVbXSwgY29udGV4dDogQ29udGV4dCwgZ3JvdXBJZD86IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdGxldCBwcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdFx0bGV0IG5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdFx0Y29uc3QgYWN0aW9ucyA9IG11bHRpU2lkZUVmZmVjdHMucmVkdWNlKChhY3Rpb25zLCBzaWRlRWZmZWN0cykgPT4ge1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdEFjdGlvbiA9IChzaWRlRWZmZWN0cyBhcyBPRGF0YVNpZGVFZmZlY3RzVHlwZSkudHJpZ2dlckFjdGlvbjtcblx0XHRcdGlmIChzaWRlRWZmZWN0QWN0aW9uKSB7XG5cdFx0XHRcdGFjdGlvbnMucHVzaChzaWRlRWZmZWN0QWN0aW9uKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhY3Rpb25zO1xuXHRcdH0sIFtdIGFzIHN0cmluZ1tdKTtcblx0XHRjb25zdCBmbnRyaWdnZXJDYWxsYmFja3MgPSB0aGlzLnRyaWdnZXJDYWxsYmFja3MuYmluZCh0aGlzKTtcblxuXHRcdGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcblx0XHRcdHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZS5leGVjdXRlQWN0aW9uKGFjdGlvbiwgY29udGV4dCwgZ3JvdXBJZCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBzaWRlRWZmZWN0cyBvZiBtdWx0aVNpZGVFZmZlY3RzKSB7XG5cdFx0XHRwcm9wZXJ0aWVzID0gKHNpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMgPz8gW10pLnJlZHVjZSgobXlTZXQsIHByb3BlcnR5KSA9PiBteVNldC5hZGQocHJvcGVydHkpLCBwcm9wZXJ0aWVzKTtcblx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gKHNpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzID8/IFtdKS5yZWR1Y2UoXG5cdFx0XHRcdChteVNldCwgbmF2aWdhdGlvblByb3BlcnR5KSA9PiBteVNldC5hZGQobmF2aWdhdGlvblByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSxcblx0XHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXNcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZVxuXHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhcblx0XHRcdFx0W1xuXHRcdFx0XHRcdC4uLkFycmF5LmZyb20ocHJvcGVydGllcyksXG5cdFx0XHRcdFx0Li4uQXJyYXkuZnJvbShuYXZpZ2F0aW9uUHJvcGVydGllcykubWFwKChuYXZpZ2F0aW9uUHJvcGVydHkpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBuYXZpZ2F0aW9uUHJvcGVydHkgfTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRdLFxuXHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRncm91cElkXG5cdFx0XHQpXG5cdFx0XHQudGhlbihhc3luYyBmdW5jdGlvbiBhc3luYygpIHtcblx0XHRcdFx0cmV0dXJuIGZudHJpZ2dlckNhbGxiYWNrcyhBcnJheS5mcm9tKG5hdmlnYXRpb25Qcm9wZXJ0aWVzKSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHR0aGlzLnJlZ2lzdGVyRmFpbGVkU2lkZUVmZmVjdHMobXVsdGlTaWRlRWZmZWN0cywgY29udGV4dCk7XG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBmYWlsZWQgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFJlZ2lzdGVyZWQgU2lkZUVmZmVjdHMgcmVxdWVzdHMgdGhhdCBoYXZlIGZhaWxlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyBnZXRSZWdpc3RlcmVkRmFpbGVkUmVxdWVzdHMoKTogRmFpbGVkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdHJldHVybiB0aGlzLl9yZWdpc3RlcmVkRmFpbGVkU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBTaWRlRWZmZWN0cyB0byB0aGUgcXVldWUgb2YgdGhlIGZhaWxlZCBTaWRlRWZmZWN0c1xuXHQgKiBUaGUgU2lkZUVmZmVjdHMgYXJlIHJldHJpZ2dlcmVkIG9uIHRoZSBuZXh0IHJlcXVlc3Qgb24gdGhlIHNhbWUgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG11bHRpU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgdGhhdCBuZWVkIHRvIGJlIHJldHJpZ2dlcmVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgaGF2ZSBmYWlsZWRcblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cmVnaXN0ZXJGYWlsZWRTaWRlRWZmZWN0cyhtdWx0aVNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGVbXSwgY29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRleHRQYXRoID0gY29udGV4dC5nZXRQYXRoKCk7XG5cdFx0dGhpcy5fcmVnaXN0ZXJlZEZhaWxlZFNpZGVFZmZlY3RzW2NvbnRleHRQYXRoXSA9IHRoaXMuX3JlZ2lzdGVyZWRGYWlsZWRTaWRlRWZmZWN0c1tjb250ZXh0UGF0aF0gPz8gW107XG5cdFx0Zm9yIChjb25zdCBzaWRlRWZmZWN0cyBvZiBtdWx0aVNpZGVFZmZlY3RzKSB7XG5cdFx0XHRjb25zdCBpc05vdEFscmVhZHlMaXN0ZWQgPSB0aGlzLl9yZWdpc3RlcmVkRmFpbGVkU2lkZUVmZmVjdHNbY29udGV4dFBhdGhdLmV2ZXJ5KFxuXHRcdFx0XHQobUZhaWxlZFNpZGVFZmZlY3RzKSA9PiBzaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWUgIT09IG1GYWlsZWRTaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdCk7XG5cdFx0XHRpZiAoaXNOb3RBbHJlYWR5TGlzdGVkKSB7XG5cdFx0XHRcdHRoaXMuX3JlZ2lzdGVyZWRGYWlsZWRTaWRlRWZmZWN0c1tjb250ZXh0UGF0aF0ucHVzaChzaWRlRWZmZWN0cyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgU2lkZUVmZmVjdHMgaW4gdGhlIHF1ZXVlIG9mIHRoZSBmYWlsZWQgU2lkZUVmZmVjdHMgZm9yIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRQYXRoIENvbnRleHQgcGF0aCB3aGVyZSBTaWRlRWZmZWN0cyBoYXZlIGZhaWxlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHVucmVnaXN0ZXJGYWlsZWRTaWRlRWZmZWN0c0ZvckFDb250ZXh0KGNvbnRleHRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRkZWxldGUgdGhpcy5fcmVnaXN0ZXJlZEZhaWxlZFNpZGVFZmZlY3RzW2NvbnRleHRQYXRoXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGVzIFNpZGVFZmZlY3RzIHRvIHRoZSBxdWV1ZSBvZiB0aGUgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNGdWxseVF1YWxpZmllZE5hbWUgU2lkZUVmZmVjdHMgdGhhdCBuZWVkIHRvIGJlIHJldHJpZ2dlcmVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgaGF2ZSBmYWlsZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHR1bnJlZ2lzdGVyRmFpbGVkU2lkZUVmZmVjdHMoc2lkZUVmZmVjdHNGdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZywgY29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRleHRQYXRoID0gY29udGV4dC5nZXRQYXRoKCk7XG5cdFx0aWYgKHRoaXMuX3JlZ2lzdGVyZWRGYWlsZWRTaWRlRWZmZWN0c1tjb250ZXh0UGF0aF0/Lmxlbmd0aCkge1xuXHRcdFx0dGhpcy5fcmVnaXN0ZXJlZEZhaWxlZFNpZGVFZmZlY3RzW2NvbnRleHRQYXRoXSA9IHRoaXMuX3JlZ2lzdGVyZWRGYWlsZWRTaWRlRWZmZWN0c1tjb250ZXh0UGF0aF0uZmlsdGVyKFxuXHRcdFx0XHQoc2lkZUVmZmVjdHMpID0+IHNpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZSAhPT0gc2lkZUVmZmVjdHNGdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgU2lkZUVmZmVjdHMgdG8gdGhlIHF1ZXVlIG9mIGEgRmllbGRHcm91cFxuXHQgKiBUaGUgU2lkZUVmZmVjdHMgYXJlIHRyaWdnZXJlZCB3aGVuIGV2ZW50IHJlbGF0ZWQgdG8gdGhlIGZpZWxkIGdyb3VwIGNoYW5nZSBpcyBmaXJlZC5cblx0ICpcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzUHJvcGVydGllcyBTaWRlRWZmZWN0cyBwcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBmaWVsZEdyb3VwUHJlUmVxdWlzaXRlIFByb21pc2UgdG8gZnVsbGZpbCBiZWZvcmUgZXhlY3V0aW5nIHRoZSBTaWRlRWZmZWN0c1xuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRyZWdpc3RlckZpZWxkR3JvdXBTaWRlRWZmZWN0cyhzaWRlRWZmZWN0c1Byb3BlcnRpZXM6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZSwgZmllbGRHcm91cFByZVJlcXVpc2l0ZT86IFByb21pc2U8dW5rbm93bj4pOiB2b2lkIHtcblx0XHRjb25zdCBpZCA9IHRoaXMuX2dldEZpZWxkR3JvdXBJbmRleChzaWRlRWZmZWN0c1Byb3BlcnRpZXMubmFtZSwgc2lkZUVmZmVjdHNQcm9wZXJ0aWVzLmNvbnRleHQpO1xuXHRcdGlmICghdGhpcy5fcmVnaXN0ZXJlZEZpZWxkR3JvdXBNYXBbaWRdKSB7XG5cdFx0XHR0aGlzLl9yZWdpc3RlcmVkRmllbGRHcm91cE1hcFtpZF0gPSB7XG5cdFx0XHRcdHByb21pc2U6IGZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG5cdFx0XHRcdHNpZGVFZmZlY3RQcm9wZXJ0eTogc2lkZUVmZmVjdHNQcm9wZXJ0aWVzXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGVzIFNpZGVFZmZlY3RzIHRvIHRoZSBxdWV1ZSBvZiBhIEZpZWxkR3JvdXAuXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1Byb3BlcnRpZXMgU2lkZUVmZmVjdHMgcHJvcGVydGllc1xuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHR1bnJlZ2lzdGVyRmllbGRHcm91cFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzUHJvcGVydGllczogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250ZXh0LCBuYW1lIH0gPSBzaWRlRWZmZWN0c1Byb3BlcnRpZXM7XG5cdFx0Y29uc3QgaWQgPSB0aGlzLl9nZXRGaWVsZEdyb3VwSW5kZXgobmFtZSwgY29udGV4dCk7XG5cdFx0ZGVsZXRlIHRoaXMuX3JlZ2lzdGVyZWRGaWVsZEdyb3VwTWFwW2lkXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSByZWdpc3RlcmVkIFNpZGVFZmZlY3RzIGludG8gdGhlIHF1ZXVlIGZvciBhIGZpZWxkIGdyb3VwIGlkLlxuXHQgKlxuXHQgKiBAcGFyYW0gZmllbGRHcm91cElkIEZpZWxkIGdyb3VwIGlkXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHJlZ2lzdGVyZWQgU2lkZUVmZmVjdHMgYW5kIHRoZWlyIHByb21pc2Vcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRSZWdpc3RlcmVkU2lkZUVmZmVjdHNGb3JGaWVsZEdyb3VwKGZpZWxkR3JvdXBJZDogc3RyaW5nKTogRmllbGRHcm91cFNpZGVFZmZlY3RUeXBlW10ge1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzID0gW107XG5cdFx0Zm9yIChjb25zdCByZWdpc3RyeUluZGV4IG9mIE9iamVjdC5rZXlzKHRoaXMuX3JlZ2lzdGVyZWRGaWVsZEdyb3VwTWFwKSkge1xuXHRcdFx0aWYgKHJlZ2lzdHJ5SW5kZXguc3RhcnRzV2l0aChgJHtmaWVsZEdyb3VwSWR9X2ApKSB7XG5cdFx0XHRcdHNpZGVFZmZlY3RzLnB1c2godGhpcy5fcmVnaXN0ZXJlZEZpZWxkR3JvdXBNYXBbcmVnaXN0cnlJbmRleF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcmVnaXN0ZXJlZCBTaWRlRWZmZWN0cyBpbnRvIHRoZSBxdWV1ZSBmb3IgYSBjb250ZXh0IGFuZCBpdHMgY2hpbGRyZW4uXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0XG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHJlZ2lzdGVyZWQgU2lkZUVmZmVjdHMgYW5kIHRoZWlyIHByb21pc2Vcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRSZWdpc3RlcmVkU2lkZUVmZmVjdHNGb3JDb250ZXh0KGNvbnRleHQ6IENvbnRleHQpOiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGVbXSB7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHMgPSBbXTtcblx0XHRmb3IgKGNvbnN0IHJlZ2lzdHJ5SW5kZXggb2YgT2JqZWN0LmtleXModGhpcy5fcmVnaXN0ZXJlZEZpZWxkR3JvdXBNYXApKSB7XG5cdFx0XHRpZiAodGhpcy5fcmVnaXN0ZXJlZEZpZWxkR3JvdXBNYXApXG5cdFx0XHRcdGlmIChyZWdpc3RyeUluZGV4LmluY2x1ZGVzKGBfJHtjb250ZXh0LmdldFBhdGgoKX1gKSkge1xuXHRcdFx0XHRcdHNpZGVFZmZlY3RzLnB1c2godGhpcy5fcmVnaXN0ZXJlZEZpZWxkR3JvdXBNYXBbcmVnaXN0cnlJbmRleF0pO1xuXHRcdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBzaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGEgc3RhdHVzIGluZGV4LlxuXHQgKlxuXHQgKiBAcGFyYW0gZmllbGRHcm91cElkIFRoZSBmaWVsZCBncm91cCBpZFxuXHQgKiBAcGFyYW0gY29udGV4dCBTQVBVSTUgQ29udGV4dFxuXHQgKiBAcmV0dXJucyBJbmRleFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRHcm91cEluZGV4KGZpZWxkR3JvdXBJZDogc3RyaW5nLCBjb250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHtcblx0XHRyZXR1cm4gYCR7ZmllbGRHcm91cElkfV8ke2NvbnRleHQuZ2V0UGF0aCgpfWA7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBzaWRlRWZmZWN0cyBwcm9wZXJ0aWVzIGZyb20gYSBmaWVsZCBncm91cCBpZFxuXHQgKiBUaGUgcHJvcGVydGllcyBhcmU6XG5cdCAqICAtIG5hbWVcblx0ICogIC0gc2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiAgLSBzaWRlRWZmZWN0cyBlbnRpdHkgdHlwZVxuXHQgKiAgLSBpbW1lZGlhdGUgc2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBmaWVsZEdyb3VwSWRcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgcHJvcGVydGllc1xuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0U2lkZUVmZmVjdHNQcm9wZXJ0eUZvckZpZWxkR3JvdXAoZmllbGRHcm91cElkOiBzdHJpbmcpOiB7XG5cdFx0c2lkZUVmZmVjdEVudGl0eVR5cGU6IHN0cmluZztcblx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0aW1tZWRpYXRlOiBib29sZWFuO1xuXHRcdHNpZGVFZmZlY3RzOiBPRGF0YVNpZGVFZmZlY3RzVHlwZSB8IHVuZGVmaW5lZDtcblx0fSB7XG5cdFx0LyoqXG5cdFx0ICogc3RyaW5nIFwiJCRJbW1lZGlhdGVSZXF1ZXN0XCIgaXMgYWRkZWQgdG8gdGhlIFNpZGVFZmZlY3RzIG5hbWUgZHVyaW5nIHRlbXBsYXRpbmcgdG8ga25vd1xuXHRcdCAqIGlmIHRoaXMgU2lkZUVmZmVjdHMgbXVzdCBiZSBpbW1lZGlhdGVseSBleGVjdXRlZCByZXF1ZXN0ZWQgKG9uIGZpZWxkIGNoYW5nZSkgb3IgbXVzdFxuXHRcdCAqIGJlIGRlZmVycmVkIChvbiBmaWVsZCBncm91cCBmb2N1cyBvdXQpXG5cdFx0ICpcblx0XHQgKi9cblx0XHRjb25zdCBpbW1lZGlhdGUgPSBmaWVsZEdyb3VwSWQuaW5jbHVkZXMoSU1NRURJQVRFX1JFUVVFU1QpLFxuXHRcdFx0bmFtZSA9IGZpZWxkR3JvdXBJZC5yZXBsYWNlKElNTUVESUFURV9SRVFVRVNULCBcIlwiKSxcblx0XHRcdHNpZGVFZmZlY3RQYXJ0cyA9IG5hbWUuc3BsaXQoXCIjXCIpLFxuXHRcdFx0c2lkZUVmZmVjdEVudGl0eVR5cGUgPSBzaWRlRWZmZWN0UGFydHNbMF0sXG5cdFx0XHRzaWRlRWZmZWN0UGF0aCA9IGAke3NpZGVFZmZlY3RFbnRpdHlUeXBlfUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2lkZUVmZmVjdHMke1xuXHRcdFx0XHRzaWRlRWZmZWN0UGFydHMubGVuZ3RoID09PSAyID8gYCMke3NpZGVFZmZlY3RQYXJ0c1sxXX1gIDogXCJcIlxuXHRcdFx0fWAsXG5cdFx0XHRzaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQgPVxuXHRcdFx0XHR0aGlzLl9zaWRlRWZmZWN0c1NlcnZpY2UuZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzaWRlRWZmZWN0RW50aXR5VHlwZSk/LltzaWRlRWZmZWN0UGF0aF07XG5cdFx0cmV0dXJuIHsgbmFtZSwgaW1tZWRpYXRlLCBzaWRlRWZmZWN0cywgc2lkZUVmZmVjdEVudGl0eVR5cGUgfTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSBTaWRlRWZmZWN0cyBmb3IgYSBmaWVsZC5cblx0ICpcblx0ICogQHBhcmFtIGZpZWxkIEZpZWxkIGNvbnRyb2xcblx0ICogQHJldHVybnMgUHJvbWlzZSByZWxhdGVkIHRvIHRoZSByZXF1ZXN0ZWQgaW1tZWRpYXRlIHNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIF9tYW5hZ2VTaWRlRWZmZWN0c0Zyb21GaWVsZChmaWVsZDogQ29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzTWFwID0gdGhpcy5nZXRGaWVsZFNpZGVFZmZlY3RzTWFwKGZpZWxkKTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHNUb0V4ZWN1dGU6IFJlY29yZDxzdHJpbmcsIHsgc2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZVtdOyBjb250ZXh0OiBDb250ZXh0IH0+ID0ge307XG5cdFx0XHRjb25zdCBhZGRTaWRlRWZmZWN0cyA9IChjb250ZXh0OiBDb250ZXh0LCBzaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlKTogdm9pZCA9PiB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRQYXRoID0gY29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRcdGlmIChzaWRlRWZmZWN0c1RvRXhlY3V0ZVtjb250ZXh0UGF0aF0pIHtcblx0XHRcdFx0XHRzaWRlRWZmZWN0c1RvRXhlY3V0ZVtjb250ZXh0UGF0aF0uc2lkZUVmZmVjdHMucHVzaChzaWRlRWZmZWN0cyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c2lkZUVmZmVjdHNUb0V4ZWN1dGVbY29udGV4dFBhdGhdID0ge1xuXHRcdFx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBbc2lkZUVmZmVjdHNdXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0Ly9HZXQgSW1tZWRpYXRlIFNpZGVFZmZlY3RzXG5cdFx0XHRmb3IgKGNvbnN0IHNpZGVFZmZlY3RzUHJvcGVydGllcyBvZiBPYmplY3QudmFsdWVzKHNpZGVFZmZlY3RzTWFwKS5maWx0ZXIoXG5cdFx0XHRcdChzaWRlRWZmZWN0c1Byb3BlcnRpZXMpID0+IHNpZGVFZmZlY3RzUHJvcGVydGllcy5pbW1lZGlhdGUgPT09IHRydWVcblx0XHRcdCkpIHtcblx0XHRcdFx0Ly8gaWYgdGhpcyBTaWRlRWZmZWN0cyBpcyByZWNvcmRlZCBhcyBmYWlsZWQgU2lkZUVmZmVjdHMsIG5lZWQgdG8gcmVtb3ZlIGl0LlxuXHRcdFx0XHR0aGlzLnVucmVnaXN0ZXJGYWlsZWRTaWRlRWZmZWN0cyhzaWRlRWZmZWN0c1Byb3BlcnRpZXMuc2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lLCBzaWRlRWZmZWN0c1Byb3BlcnRpZXMuY29udGV4dCk7XG5cdFx0XHRcdGFkZFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzUHJvcGVydGllcy5jb250ZXh0LCBzaWRlRWZmZWN0c1Byb3BlcnRpZXMuc2lkZUVmZmVjdHMpO1xuXHRcdFx0fVxuXG5cdFx0XHQvL1JlcGxheSBmYWlsZWQgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byB0aGUgdmlldyBvciBGaWVsZFxuXHRcdFx0Zm9yIChjb25zdCBjb250ZXh0IG9mIFtmaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpLCB0aGlzLl92aWV3LmdldEJpbmRpbmdDb250ZXh0KCldLmZpbHRlcihcblx0XHRcdFx0KGNvbnRleHQpOiBjb250ZXh0IGlzIENvbnRleHQgPT4gISFjb250ZXh0XG5cdFx0XHQpKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRQYXRoID0gY29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRcdGNvbnN0IGZhaWxlZFNpZGVFZmZlY3RzID0gdGhpcy5fcmVnaXN0ZXJlZEZhaWxlZFNpZGVFZmZlY3RzW2NvbnRleHRQYXRoXSA/PyBbXTtcblx0XHRcdFx0dGhpcy51bnJlZ2lzdGVyRmFpbGVkU2lkZUVmZmVjdHNGb3JBQ29udGV4dChjb250ZXh0UGF0aCk7XG5cdFx0XHRcdGZvciAoY29uc3QgZmFpbGVkU2lkZUVmZmVjdCBvZiBmYWlsZWRTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRcdGFkZFNpZGVFZmZlY3RzKGNvbnRleHQsIGZhaWxlZFNpZGVFZmZlY3QpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdFx0T2JqZWN0LnZhbHVlcyhzaWRlRWZmZWN0c1RvRXhlY3V0ZSkubWFwKGFzeW5jIChzaWRlRWZmZWN0c1Byb3BlcnRpZXMpID0+XG5cdFx0XHRcdFx0c2lkZUVmZmVjdHNQcm9wZXJ0aWVzLnNpZGVFZmZlY3RzLmxlbmd0aCA9PT0gMVxuXHRcdFx0XHRcdFx0PyB0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0c1Byb3BlcnRpZXMuc2lkZUVmZmVjdHNbMF0sIHNpZGVFZmZlY3RzUHJvcGVydGllcy5jb250ZXh0KVxuXHRcdFx0XHRcdFx0OiB0aGlzLnJlcXVlc3RNdWx0aXBsZVNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzUHJvcGVydGllcy5zaWRlRWZmZWN0cywgc2lkZUVmZmVjdHNQcm9wZXJ0aWVzLmNvbnRleHQpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0TG9nLmRlYnVnKGBFcnJvciB3aGlsZSBtYW5hZ2luZyBGaWVsZCBTaWRlRWZmZWN0c2AsIGUgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyB0cmlnZ2VyQ2FsbGJhY2tzKG5hdmlnYXRpb246IHN0cmluZ1tdKTogUHJvbWlzZTx1bmRlZmluZWQ+IHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdG5hdmlnYXRpb24ubWFwKChuYXYpID0+IHtcblx0XHRcdFx0Y29uc3QgcmVnaXN0ZXJDYWxsQmFjayA9IHRoaXMuX3NpZGVFZmZlY3RzU2VydmljZS5nZXRSZWdpc3RlcmVkQ2FsbGJhY2sobmF2KTtcblx0XHRcdFx0aWYgKHJlZ2lzdGVyQ2FsbEJhY2spIHtcblx0XHRcdFx0XHRyZXR1cm4gcmVnaXN0ZXJDYWxsQmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgU2lkZUVmZmVjdHMgZm9yIGEgZmllbGRHcm91cC5cblx0ICpcblx0ICogQHBhcmFtIGZpZWxkR3JvdXBTaWRlRWZmZWN0cyBGaWVsZCBncm91cCBzaWRlRWZmZWN0cyB3aXRoIGl0cyBwcm9taXNlXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmV0dXJuaW5nIHRydWUgaWYgdGhlIFNpZGVFZmZlY3RzIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgZXhlY3V0ZWRcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgX3JlcXVlc3RGaWVsZEdyb3VwU2lkZUVmZmVjdHMoZmllbGRHcm91cFNpZGVFZmZlY3RzOiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLnVucmVnaXN0ZXJGaWVsZEdyb3VwU2lkZUVmZmVjdHMoZmllbGRHcm91cFNpZGVFZmZlY3RzLnNpZGVFZmZlY3RQcm9wZXJ0eSk7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IGZpZWxkR3JvdXBTaWRlRWZmZWN0cy5wcm9taXNlO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdExvZy5kZWJ1ZyhgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBGaWVsZEdyb3VwIFNpZGVFZmZlY3RzYCwgZSBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgeyBzaWRlRWZmZWN0cywgY29udGV4dCwgbmFtZSB9ID0gZmllbGRHcm91cFNpZGVFZmZlY3RzLnNpZGVFZmZlY3RQcm9wZXJ0eTtcblx0XHRcdGlmICh0aGlzLmlzRmllbGRHcm91cFZhbGlkKG5hbWUsIGNvbnRleHQpKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzLCBjb250ZXh0KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRMb2cuZGVidWcoYEVycm9yIHdoaWxlIGV4ZWN1dGluZyBGaWVsZEdyb3VwIFNpZGVFZmZlY3RzYCwgZSBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgdmFsaWRhdGlvbiBzdGF0dXMgb2YgcHJvcGVydGllcyByZWxhdGVkIHRvIGEgZmllbGQgY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIGZpZWxkIFRoZSBmaWVsZCBjb250cm9sXG5cdCAqIEBwYXJhbSBzdWNjZXNzIFN0YXR1cyBvZiB0aGUgZmllbGQgdmFsaWRhdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBfc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyhmaWVsZDogQ29udHJvbCwgc3VjY2VzczogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzTWFwID0gdGhpcy5nZXRGaWVsZFNpZGVFZmZlY3RzTWFwKGZpZWxkKTtcblx0XHRPYmplY3Qua2V5cyhzaWRlRWZmZWN0c01hcCkuZm9yRWFjaCgoa2V5KSA9PiB7XG5cdFx0XHRjb25zdCB7IG5hbWUsIGltbWVkaWF0ZSwgY29udGV4dCB9ID0gc2lkZUVmZmVjdHNNYXBba2V5XTtcblx0XHRcdGlmICghaW1tZWRpYXRlKSB7XG5cdFx0XHRcdGNvbnN0IGlkID0gdGhpcy5fZ2V0RmllbGRHcm91cEluZGV4KG5hbWUsIGNvbnRleHQpO1xuXHRcdFx0XHRpZiAoc3VjY2Vzcykge1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLl9maWVsZEdyb3VwSW52YWxpZGl0eVtpZF0/LltmaWVsZC5nZXRJZCgpXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLl9maWVsZEdyb3VwSW52YWxpZGl0eVtpZF0gPSB7XG5cdFx0XHRcdFx0XHQuLi50aGlzLl9maWVsZEdyb3VwSW52YWxpZGl0eVtpZF0sXG5cdFx0XHRcdFx0XHQuLi57IFtmaWVsZC5nZXRJZCgpXTogdHJ1ZSB9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbjtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7OztFQXdEQSxNQUFNQSxpQkFBaUIsR0FBRyxvQkFBb0I7RUFBQyxJQUV6Q0MsOEJBQThCLFdBRG5DQyxjQUFjLENBQUMsOENBQThDLENBQUMsVUFvQjdEQyxjQUFjLEVBQUUsVUFpQmhCQyxlQUFlLEVBQUUsVUFDakJDLGNBQWMsRUFBRSxVQVVoQkQsZUFBZSxFQUFFLFVBQ2pCQyxjQUFjLEVBQUUsVUFpQmhCRCxlQUFlLEVBQUUsVUFDakJDLGNBQWMsRUFBRSxVQTRCaEJELGVBQWUsRUFBRSxXQUNqQkMsY0FBYyxFQUFFLFdBY2hCRCxlQUFlLEVBQUUsV0FDakJDLGNBQWMsRUFBRSxXQXVEaEJELGVBQWUsRUFBRSxXQUNqQkMsY0FBYyxFQUFFLFdBMkJoQkQsZUFBZSxFQUFFLFdBQ2pCQyxjQUFjLEVBQUUsV0FZaEJELGVBQWUsRUFBRSxXQUNqQkMsY0FBYyxFQUFFLFdBWWhCRCxlQUFlLEVBQUUsV0FDakJDLGNBQWMsRUFBRSxXQWdCaEJELGVBQWUsRUFBRSxXQUNqQkMsY0FBYyxFQUFFLFdBa0NoQkQsZUFBZSxFQUFFLFdBQ2pCQyxjQUFjLEVBQUUsV0F5QmhCRCxlQUFlLEVBQUUsV0FDakJDLGNBQWMsRUFBRSxXQXdCaEJELGVBQWUsRUFBRSxXQUNqQkMsY0FBYyxFQUFFLFdBdUJoQkQsZUFB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
@@ -73,6 +73,8 @@ class SideEffectsControllerExtension extends ControllerExtension {
73
73
 
74
74
  private isConfirmationDialogOpen?: boolean;
75
75
 
76
+ private readonly requestExecutions: Promise<unknown>[] = [];
77
+
76
78
  @methodOverride()
77
79
  onInit(): void {
78
80
  this._view = this.base.getView();
@@ -144,6 +146,16 @@ class SideEffectsControllerExtension extends ControllerExtension {
144
146
  return contextForSideEffects || undefined;
145
147
  }
146
148
 
149
+ /**
150
+ * Wait For all sideEffects execution to be completed.
151
+ *
152
+ */
153
+ @publicExtension()
154
+ @finalExtension()
155
+ async waitForSideEffectExecutions(): Promise<void> {
156
+ await Promise.allSettled(this.requestExecutions);
157
+ }
158
+
147
159
  /**
148
160
  * Gets the SideEffects map for a field
149
161
  * These SideEffects are
@@ -360,6 +372,26 @@ class SideEffectsControllerExtension extends ControllerExtension {
360
372
  });
361
373
  }
362
374
 
375
+ /**
376
+ * Manages the deferred SideEffects which have to be executed when the context of the page changes (saving a document).
377
+ *
378
+ * @param context The context of the page
379
+ * @returns Promise returning true if the SideEffects have been successfully executed
380
+ */
381
+ @publicExtension()
382
+ @finalExtension()
383
+ async handlePageChangeContext(context: Context): Promise<void | unknown[]> {
384
+ await this.waitForSideEffectExecutions();
385
+ const sideEffectsFieldGroupOnPage = this.getRegisteredSideEffectsForContext(context);
386
+ return Promise.all(
387
+ sideEffectsFieldGroupOnPage.map(async (fieldGroupSideEffects) => {
388
+ return this._requestFieldGroupSideEffects(fieldGroupSideEffects);
389
+ })
390
+ ).catch((error) => {
391
+ Log.debug(`Error while processing on page context ${context.getPath()}`, error);
392
+ });
393
+ }
394
+
363
395
  /**
364
396
  * Request SideEffects on a specific context.
365
397
  *
@@ -387,11 +419,11 @@ class SideEffectsControllerExtension extends ControllerExtension {
387
419
  triggerAction: !this._sideEffectsService.isControlSideEffects(sideEffects) ? sideEffects.triggerAction : undefined
388
420
  };
389
421
  if (triggerAction && !ignoreTriggerActions) {
390
- this._sideEffectsService.executeAction(triggerAction, context, groupId);
422
+ this.requestExecutions.push(this._sideEffectsService.executeAction(triggerAction, context, groupId));
391
423
  }
392
424
 
393
425
  if (targets.length) {
394
- return this._sideEffectsService
426
+ const requestTargets = this._sideEffectsService
395
427
  .requestSideEffects(targets, context, groupId)
396
428
  .then(async function async() {
397
429
  return fnTriggerCallbacks(sideEffects.targetEntities?.map((target) => target.$NavigationPropertyPath) || []);
@@ -400,6 +432,8 @@ class SideEffectsControllerExtension extends ControllerExtension {
400
432
  this.registerFailedSideEffects([sideEffects], context);
401
433
  throw error;
402
434
  });
435
+ this.requestExecutions.push(requestTargets);
436
+ return requestTargets;
403
437
  }
404
438
  }
405
439
 
@@ -715,6 +749,25 @@ class SideEffectsControllerExtension extends ControllerExtension {
715
749
  return sideEffects;
716
750
  }
717
751
 
752
+ /**
753
+ * Gets the registered SideEffects into the queue for a context and its children.
754
+ *
755
+ * @param context The context
756
+ * @returns Array of registered SideEffects and their promise
757
+ */
758
+ @publicExtension()
759
+ @finalExtension()
760
+ getRegisteredSideEffectsForContext(context: Context): FieldGroupSideEffectType[] {
761
+ const sideEffects = [];
762
+ for (const registryIndex of Object.keys(this._registeredFieldGroupMap)) {
763
+ if (this._registeredFieldGroupMap)
764
+ if (registryIndex.includes(`_${context.getPath()}`)) {
765
+ sideEffects.push(this._registeredFieldGroupMap[registryIndex]);
766
+ }
767
+ }
768
+ return sideEffects;
769
+ }
770
+
718
771
  /**
719
772
  * Gets a status index.
720
773
  *