@sapui5/sap.fe.core 1.136.9 → 1.136.10

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.
Files changed (30) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +48 -23
  4. package/src/sap/fe/core/ActionRuntime.ts +61 -35
  5. package/src/sap/fe/core/AppStateHandler.js +4 -5
  6. package/src/sap/fe/core/AppStateHandler.ts +6 -5
  7. package/src/sap/fe/core/CommonUtils.js +3 -3
  8. package/src/sap/fe/core/CommonUtils.ts +2 -2
  9. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +4 -4
  10. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +5 -2
  11. package/src/sap/fe/core/controllerextensions/InternalRouting.js +4 -4
  12. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +3 -3
  13. package/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -2
  14. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +1 -1
  15. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +20 -10
  16. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +29 -13
  17. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +12 -2
  18. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +14 -7
  19. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +5 -2
  20. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +4 -1
  21. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +2 -1
  22. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +1 -0
  23. package/src/sap/fe/core/fpm/manifest.json +1 -1
  24. package/src/sap/fe/core/helpers/ModelHelper.js +5 -2
  25. package/src/sap/fe/core/helpers/ModelHelper.ts +7 -3
  26. package/src/sap/fe/core/library.js +1 -1
  27. package/src/sap/fe/core/messagebundle_ar.properties +1 -1
  28. package/src/sap/fe/core/messagebundle_bg.properties +3 -3
  29. package/src/sap/fe/core/rootView/RootViewBaseController.js +3 -2
  30. package/src/sap/fe/core/rootView/RootViewBaseController.ts +2 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapui5/sap.fe.core",
3
- "version": "1.136.9",
3
+ "version": "1.136.10",
4
4
  "description": "SAPUI5 Library sap.fe.core",
5
5
  "keywords": [
6
6
  "sapui5",
@@ -6,7 +6,7 @@
6
6
  SAP UI development toolkit for HTML5 (SAPUI5)
7
7
  (c) Copyright 2009-2021 SAP SE. All rights reserved
8
8
  </copyright>
9
- <version>1.136.9</version>
9
+ <version>1.136.10</version>
10
10
 
11
11
  <documentation>UI5 library: sap.fe.core</documentation>
12
12
 
@@ -13,14 +13,38 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/base/BindingToolkit", "sap/fe/core
13
13
  var constant = BindingToolkit.constant;
14
14
  var compileExpression = BindingToolkit.compileExpression;
15
15
  const ActionRuntime = {
16
+ /**
17
+ * Checks if a required parameter field is empty.
18
+ * @param parameterInfo Information identifying an action parameter
19
+ * @returns True if the field is empty, false otherwise
20
+ */
21
+ isRequiredFieldEmpty: function (parameterInfo) {
22
+ const fieldId = parameterInfo.field.getId();
23
+ const allMessages = Messaging.getMessageModel().getData();
24
+ const relevantMessages = allMessages.filter(msg => msg.getControlIds().some(controlId => controlId.includes(fieldId)));
25
+ if (relevantMessages.length > 0) {
26
+ return false;
27
+ } else if (parameterInfo.isMultiValue) {
28
+ return parameterInfo.value === undefined || Array.isArray(parameterInfo.value) && parameterInfo.value.length === 0;
29
+ } else {
30
+ const fieldValue = parameterInfo.field.getValue();
31
+ const isFieldArray = Array.isArray(parameterInfo.field.getValue());
32
+ if (isFieldArray) {
33
+ // only first value check is enough as the field value comes on [0] rest of the array includes currency and currency code
34
+ // both of which can or cannot be null, so we shall check only the field value
35
+ return fieldValue[0] === null || fieldValue[0] === "";
36
+ }
37
+ return fieldValue === undefined || fieldValue === null || fieldValue === "";
38
+ }
39
+ },
16
40
  /**
17
41
  * Adds error messages for an action parameter field to the message manager.
18
42
  * @param messageParameters Information identifying an action parameter and messages referring to this parameter
19
43
  */
20
44
  _addMessageForActionParameter: function (messageParameters) {
21
- Messaging.addMessages(messageParameters.map(messageParameter => {
45
+ const messages = messageParameters.map(messageParameter => {
22
46
  const binding = messageParameter.actionParameterInfo.field.getBinding(messageParameter.actionParameterInfo.isMultiValue ? "items" : "value");
23
- return new Message({
47
+ const message = new Message({
24
48
  message: messageParameter.message,
25
49
  type: MessageType.Error,
26
50
  processor: binding?.getModel() ?? undefined,
@@ -28,7 +52,26 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/base/BindingToolkit", "sap/fe/core
28
52
  persistent: true,
29
53
  target: binding?.getResolvedPath()
30
54
  });
31
- }));
55
+
56
+ // Attach change handler to validate value and remove message if field is not empty
57
+ if (binding) {
58
+ const changeHandler = () => {
59
+ // Check if the field is no longer empty using the extracted validation function
60
+ if (!ActionRuntime.isRequiredFieldEmpty(messageParameter.actionParameterInfo)) {
61
+ // Remove the message
62
+ Messaging.removeMessages([message]);
63
+ // Detach the change handler
64
+ binding.detachChange(changeHandler);
65
+ }
66
+ };
67
+ // There might be sceanrios like value help out parameters where the field is not explicitly changed instead property value changes due to setProperty.
68
+ // In such cases, field change is not called and is not a reliable event to validate the field value again.
69
+ // So we use value/items binding change to re-validate the property value to remove the messages.
70
+ binding.attachChange(changeHandler);
71
+ }
72
+ return message;
73
+ });
74
+ Messaging.addMessages(messages);
32
75
  },
33
76
  /**
34
77
  * Checks if all required action parameters contain data and checks for all action parameters if the
@@ -40,25 +83,7 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/base/BindingToolkit", "sap/fe/core
40
83
  validateProperties: async function (actionParameterInfos, resourceModel) {
41
84
  await Promise.allSettled(actionParameterInfos.map(actionParameterInfo => actionParameterInfo.validationPromise));
42
85
  const requiredParameterInfos = actionParameterInfos.filter(parameterInfo => parameterInfo.field.getRequired && parameterInfo.field.getRequired());
43
- const allMessages = Messaging.getMessageModel().getData();
44
- const emptyRequiredFields = requiredParameterInfos.filter(requiredParameterInfo => {
45
- const fieldId = requiredParameterInfo.field.getId();
46
- const relevantMessages = allMessages.filter(msg => msg.getControlIds().some(controlId => controlId.includes(fieldId)));
47
- if (relevantMessages.length > 0) {
48
- return false;
49
- } else if (requiredParameterInfo.isMultiValue) {
50
- return requiredParameterInfo.value === undefined || !requiredParameterInfo.value.length;
51
- } else {
52
- const fieldValue = requiredParameterInfo.field.getValue();
53
- const isFieldArray = Array.isArray(requiredParameterInfo.field.getValue());
54
- if (isFieldArray) {
55
- // only first value check is enough as the field value comes on [0] rest of the array includes currency and currency code
56
- // both of which can or cannot be null, so we shall check only the field value
57
- return fieldValue[0] === null || fieldValue[0] === "";
58
- }
59
- return fieldValue === undefined || fieldValue === null || fieldValue === "";
60
- }
61
- });
86
+ const emptyRequiredFields = requiredParameterInfos.filter(this.isRequiredFieldEmpty);
62
87
  /* Message for missing mandatory value of the action parameter */
63
88
  if (emptyRequiredFields.length) {
64
89
  this._addMessageForActionParameter(emptyRequiredFields.map(actionParameterInfo => ({
@@ -262,4 +287,4 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/base/BindingToolkit", "sap/fe/core
262
287
  };
263
288
  return ActionRuntime;
264
289
  }, false);
265
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBY3Rpb25SdW50aW1lIiwiX2FkZE1lc3NhZ2VGb3JBY3Rpb25QYXJhbWV0ZXIiLCJtZXNzYWdlUGFyYW1ldGVycyIsIk1lc3NhZ2luZyIsImFkZE1lc3NhZ2VzIiwibWFwIiwibWVzc2FnZVBhcmFtZXRlciIsImJpbmRpbmciLCJhY3Rpb25QYXJhbWV0ZXJJbmZvIiwiZmllbGQiLCJnZXRCaW5kaW5nIiwiaXNNdWx0aVZhbHVlIiwiTWVzc2FnZSIsIm1lc3NhZ2UiLCJ0eXBlIiwiTWVzc2FnZVR5cGUiLCJFcnJvciIsInByb2Nlc3NvciIsImdldE1vZGVsIiwidW5kZWZpbmVkIiwicGVyc2lzdGVudCIsInRhcmdldCIsImdldFJlc29sdmVkUGF0aCIsInZhbGlkYXRlUHJvcGVydGllcyIsImFjdGlvblBhcmFtZXRlckluZm9zIiwicmVzb3VyY2VNb2RlbCIsIlByb21pc2UiLCJhbGxTZXR0bGVkIiwidmFsaWRhdGlvblByb21pc2UiLCJyZXF1aXJlZFBhcmFtZXRlckluZm9zIiwiZmlsdGVyIiwicGFyYW1ldGVySW5mbyIsImdldFJlcXVpcmVkIiwiYWxsTWVzc2FnZXMiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiZW1wdHlSZXF1aXJlZEZpZWxkcyIsInJlcXVpcmVkUGFyYW1ldGVySW5mbyIsImZpZWxkSWQiLCJnZXRJZCIsInJlbGV2YW50TWVzc2FnZXMiLCJtc2ciLCJnZXRDb250cm9sSWRzIiwic29tZSIsImNvbnRyb2xJZCIsImluY2x1ZGVzIiwibGVuZ3RoIiwidmFsdWUiLCJmaWVsZFZhbHVlIiwiZ2V0VmFsdWUiLCJpc0ZpZWxkQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJnZXRUZXh0IiwiZ2V0UGFyZW50IiwiZ2V0QWdncmVnYXRpb24iLCJmaXJzdEludmFsaWRQYXJhbWV0ZXIiLCJmaW5kIiwiZ2V0VmlzaWJsZSIsImhhc0Vycm9yIiwiZ2V0VmFsdWVTdGF0ZSIsInNldFZpc2libGUiLCJmb2N1cyIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiYVNlbGVjdGVkQ29udGV4dHMiLCJzQ29udHJvbCIsImZvckNvbnRleHRNZW51IiwiYXJndW1lbnRzIiwiYVByb21pc2VzIiwic0FjdGlvbiIsImFSZXF1ZXN0UHJvbWlzZXMiLCJzZXRQcm9wZXJ0eSIsInNQcm9wZXJ0eSIsImVsZW1lbnQiLCJvU2VsZWN0ZWRDb250ZXh0Iiwib0NvbnRleHREYXRhIiwiZ2V0T2JqZWN0IiwiX3NldEFjdGlvbkVuYWJsZW1lbnRGb3JUYWJsZSIsImJFbmFibGVkIiwiYUFwcGxpY2FibGUiLCJhTm90QXBwbGljYWJsZSIsInB1c2giLCJDb21tb25VdGlscyIsInNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZSIsImFsbCIsInNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoIiwib1ZpZXciLCJvTGlzdEJpbmRpbmciLCJvSW50ZXJuYWxNb2RlbENvbnRleHREYXRhIiwib0NvbnRyb2xzIiwiY29udHJvbHMiLCJzS2V5Iiwib1RhYmxlIiwiYnlJZCIsImlzQSIsIm9Sb3dCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsInRhYmxlQVBJIiwiZ2V0QmluZGluZ0NvbnRleHQiLCJKU09OIiwicGFyc2UiLCJ0YWJsZURlZmluaXRpb24iLCJvcGVyYXRpb25BdmFpbGFibGVNYXAiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwidXBkYXRlRWRpdEJ1dHRvblZpc2liaWxpdHlBbmRFbmFibGVtZW50IiwiaVZpZXdMZXZlbCIsImdldFZpZXdEYXRhIiwidmlld0xldmVsIiwiaXNFZGl0YWJsZSIsImdldElzRWRpdGFibGUiLCJvQ29udGV4dCIsIm9BcHBDb21wb25lbnQiLCJnZXRBcHBDb21wb25lbnQiLCJzTWV0YVBhdGgiLCJNb2RlbEhlbHBlciIsImdldE1ldGFQYXRoRm9yQ29udGV4dCIsInNFbnRpdHlTZXQiLCJnZXRSb290RW50aXR5U2V0UGF0aCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YU1vZGVsIiwiZ2V0Q29udGV4dCIsImdldFBhdGgiLCJjb252ZXJ0ZXJDb250ZXh0IiwiQ29udmVydGVyQ29udGV4dCIsImNyZWF0ZUNvbnZlcnRlckNvbnRleHRGb3JNYWNybyIsImdldERpYWdub3N0aWNzIiwibWVyZ2UiLCJlbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJlbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZSIsInVwZGF0ZUhpZGRlbiIsImJVcGRhdGVIaWRkZW4iLCJpc0VudGl0eVNldCIsImFubm90YXRpb25zIiwiVUkiLCJVcGRhdGVIaWRkZW4iLCJ2YWx1ZU9mIiwiaXNVcGRhdGVIaWRkZW4iLCJzRWRpdEVuYWJsZUJpbmRpbmciLCJnZXRFZGl0QnV0dG9uRW5hYmxlZCIsImRyYWZ0Um9vdFBhdGgiLCJnZXREcmFmdFJvb3RQYXRoIiwic1N0aWNreVJvb3RQYXRoIiwiZ2V0U3RpY2t5Um9vdFBhdGgiLCJzUGF0aCIsIm9Sb290Q29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0Iiwic0hpZGRlbkV4cHJlc3Npb24iLCJjb21waWxlRXhwcmVzc2lvbiIsImVxdWFsIiwiZ2V0SGlkZGVuRXhwcmVzc2lvbiIsInVwZGF0ZUVkaXRNb2RlbENvbnRleHQiLCJzQmluZGluZ0V4cHJlc3Npb24iLCJvSGlkZGVuRWxlbWVudCIsIkFueUVsZW1lbnQiLCJhbnlUZXh0Iiwic2V0QmluZGluZ0NvbnRleHQiLCJhZGREZXBlbmRlbnQiLCIkJGdyb3VwSWQiLCJhdHRhY2hDaGFuZ2UiLCJvRXZlbnQiLCJvTmV3VmFsdWUiLCJnZXRTb3VyY2UiLCJnZXRFeHRlcm5hbFZhbHVlIiwic0VuYWJsZW1lbnRGaWVsZE5hbWUiLCJnZXRQcm9wZXJ0eSIsImJBY3Rpb25FbmFibGVkIiwiYkVuYWJsZWRGb3JDb250ZXh0TWVudSIsImFBcHBsaWNhYmxlRm9yQ29udGV4dE1lbnUiLCJhTm90QXBwbGljYWJsZUZvckNvbnRleHRNZW51Iiwic0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCIsIm9UcmFuc2Zvcm1lZEJpbmRpbmciLCJ0cmFuc2Zvcm1SZWN1cnNpdmVseSIsIm9CaW5kaW5nRXhwcmVzc2lvbiIsImNvbnN0YW50IiwicGF0aCIsInNSZXN1bHQiLCJzZXREeW5hbWljQWN0aW9uQ29udGV4dHMiLCJyZXF1ZXN0UHJvcGVydHkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkFjdGlvblJ1bnRpbWUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb25QYXJhbWV0ZXIgYXMgRWRtQWN0aW9uUGFyYW1ldGVyLCBQcmltaXRpdmVUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB0eXBlIHsgUGF0aEluTW9kZWxFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiwgY29uc3RhbnQsIGVxdWFsLCB0cmFuc2Zvcm1SZWN1cnNpdmVseSB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgX1JlcXVlc3RlZFByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgaXNFbnRpdHlTZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IHR5cGUgTGFiZWwgZnJvbSBcInNhcC9tL0xhYmVsXCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgRmllbGQgZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIE11bHRpVmFsdWVGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9NdWx0aVZhbHVlRmllbGRcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGRJdGVtIGZyb20gXCJzYXAvdWkvbWRjL2ZpZWxkL011bHRpVmFsdWVGaWVsZEl0ZW1cIjtcbmltcG9ydCB0eXBlIFByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL1Byb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBGaWxlVXBsb2FkZXIgZnJvbSBcInNhcC91aS91bmlmaWVkL0ZpbGVVcGxvYWRlclwiO1xuaW1wb3J0IEFueUVsZW1lbnQgZnJvbSBcIi4vY29udHJvbHMvQW55RWxlbWVudFwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4vY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VNYW5pZmVzdFNldHRpbmdzIH0gZnJvbSBcIi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBnZXRFZGl0QnV0dG9uRW5hYmxlZCwgZ2V0SGlkZGVuRXhwcmVzc2lvbiB9IGZyb20gXCIuL2NvbnZlcnRlcnMvb2JqZWN0UGFnZS9IZWFkZXJBbmRGb290ZXJBY3Rpb25cIjtcblxuZXhwb3J0IHR5cGUgQWN0aW9uUGFyYW1ldGVySW5mbyA9IHtcblx0cGFyYW1ldGVyPzogRWRtQWN0aW9uUGFyYW1ldGVyO1xuXHRmaWVsZDogRmllbGQgfCBNdWx0aVZhbHVlRmllbGQgfCBGaWxlVXBsb2FkZXI7XG5cdGlzTXVsdGlWYWx1ZTogYm9vbGVhbjtcblx0dmFsdWU/OiBzdHJpbmcgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHR2YWxpZGF0aW9uUHJvbWlzZT86IFByb21pc2U8c3RyaW5nIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdPjtcblx0aGFzRXJyb3I6IGJvb2xlYW47XG5cdHByb3BlcnR5UGF0aD86IHN0cmluZztcbn07XG5cbmNvbnN0IEFjdGlvblJ1bnRpbWUgPSB7XG5cdC8qKlxuXHQgKiBBZGRzIGVycm9yIG1lc3NhZ2VzIGZvciBhbiBhY3Rpb24gcGFyYW1ldGVyIGZpZWxkIHRvIHRoZSBtZXNzYWdlIG1hbmFnZXIuXG5cdCAqIEBwYXJhbSBtZXNzYWdlUGFyYW1ldGVycyBJbmZvcm1hdGlvbiBpZGVudGlmeWluZyBhbiBhY3Rpb24gcGFyYW1ldGVyIGFuZCBtZXNzYWdlcyByZWZlcnJpbmcgdG8gdGhpcyBwYXJhbWV0ZXJcblx0ICovXG5cdF9hZGRNZXNzYWdlRm9yQWN0aW9uUGFyYW1ldGVyOiBmdW5jdGlvbiAobWVzc2FnZVBhcmFtZXRlcnM6IHsgYWN0aW9uUGFyYW1ldGVySW5mbzogQWN0aW9uUGFyYW1ldGVySW5mbzsgbWVzc2FnZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuXHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhcblx0XHRcdG1lc3NhZ2VQYXJhbWV0ZXJzLm1hcCgobWVzc2FnZVBhcmFtZXRlcikgPT4ge1xuXHRcdFx0XHRjb25zdCBiaW5kaW5nID0gbWVzc2FnZVBhcmFtZXRlci5hY3Rpb25QYXJhbWV0ZXJJbmZvLmZpZWxkLmdldEJpbmRpbmcoXG5cdFx0XHRcdFx0bWVzc2FnZVBhcmFtZXRlci5hY3Rpb25QYXJhbWV0ZXJJbmZvLmlzTXVsdGlWYWx1ZSA/IFwiaXRlbXNcIiA6IFwidmFsdWVcIlxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXR1cm4gbmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdG1lc3NhZ2U6IG1lc3NhZ2VQYXJhbWV0ZXIubWVzc2FnZSxcblx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XHRcdFx0XHRwcm9jZXNzb3I6IGJpbmRpbmc/LmdldE1vZGVsKCkgPz8gdW5kZWZpbmVkLCAvLyBnZXRNb2RlbCgpOiBudWxsIHwgTW9kZWwgfn4+IHByb2Nlc3Nvcj86IE1lc3NhZ2VQcm9jZXNzb3Jcblx0XHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHRcdHRhcmdldDogYmluZGluZz8uZ2V0UmVzb2x2ZWRQYXRoKClcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhbGwgcmVxdWlyZWQgYWN0aW9uIHBhcmFtZXRlcnMgY29udGFpbiBkYXRhIGFuZCBjaGVja3MgZm9yIGFsbCBhY3Rpb24gcGFyYW1ldGVycyBpZiB0aGVcblx0ICogY29udGFpbmVkIGRhdGEgaXMgdmFsaWQuXG5cdCAqIEBwYXJhbSBhY3Rpb25QYXJhbWV0ZXJJbmZvcyBJbmZvcm1hdGlvbiBpZGVudGlmeWluZyBhbiBhY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEByZXR1cm5zIFRoZSB2YWxpZGF0aW9uIHJlc3VsdCBjYW4gYmUgdHJ1ZSBvciBmYWxzZVxuXHQgKi9cblx0dmFsaWRhdGVQcm9wZXJ0aWVzOiBhc3luYyBmdW5jdGlvbiAoYWN0aW9uUGFyYW1ldGVySW5mb3M6IEFjdGlvblBhcmFtZXRlckluZm9bXSwgcmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcblx0XHRcdGFjdGlvblBhcmFtZXRlckluZm9zLm1hcChcblx0XHRcdFx0KGFjdGlvblBhcmFtZXRlckluZm8pOiBQcm9taXNlPHN0cmluZyB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXT4gfCB1bmRlZmluZWQgPT4gYWN0aW9uUGFyYW1ldGVySW5mby52YWxpZGF0aW9uUHJvbWlzZVxuXHRcdFx0KVxuXHRcdCk7XG5cblx0XHRjb25zdCByZXF1aXJlZFBhcmFtZXRlckluZm9zID0gYWN0aW9uUGFyYW1ldGVySW5mb3MuZmlsdGVyKFxuXHRcdFx0KHBhcmFtZXRlckluZm8pID0+XG5cdFx0XHRcdChwYXJhbWV0ZXJJbmZvLmZpZWxkIGFzIEZpZWxkIHwgTXVsdGlWYWx1ZUZpZWxkKS5nZXRSZXF1aXJlZCAmJlxuXHRcdFx0XHQocGFyYW1ldGVySW5mby5maWVsZCBhcyBGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCkuZ2V0UmVxdWlyZWQoKVxuXHRcdCk7XG5cblx0XHRjb25zdCBhbGxNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0Y29uc3QgZW1wdHlSZXF1aXJlZEZpZWxkcyA9IHJlcXVpcmVkUGFyYW1ldGVySW5mb3MuZmlsdGVyKChyZXF1aXJlZFBhcmFtZXRlckluZm8pID0+IHtcblx0XHRcdGNvbnN0IGZpZWxkSWQgPSByZXF1aXJlZFBhcmFtZXRlckluZm8uZmllbGQuZ2V0SWQoKTtcblx0XHRcdGNvbnN0IHJlbGV2YW50TWVzc2FnZXMgPSBhbGxNZXNzYWdlcy5maWx0ZXIoKG1zZzogTWVzc2FnZSkgPT5cblx0XHRcdFx0bXNnLmdldENvbnRyb2xJZHMoKS5zb21lKChjb250cm9sSWQ6IHN0cmluZykgPT4gY29udHJvbElkLmluY2x1ZGVzKGZpZWxkSWQpKVxuXHRcdFx0KTtcblx0XHRcdGlmIChyZWxldmFudE1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIGlmIChyZXF1aXJlZFBhcmFtZXRlckluZm8uaXNNdWx0aVZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiByZXF1aXJlZFBhcmFtZXRlckluZm8udmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhcmVxdWlyZWRQYXJhbWV0ZXJJbmZvLnZhbHVlLmxlbmd0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGZpZWxkVmFsdWUgPSAocmVxdWlyZWRQYXJhbWV0ZXJJbmZvLmZpZWxkIGFzIEZpZWxkKS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRjb25zdCBpc0ZpZWxkQXJyYXkgPSBBcnJheS5pc0FycmF5KChyZXF1aXJlZFBhcmFtZXRlckluZm8uZmllbGQgYXMgRmllbGQpLmdldFZhbHVlKCkpO1xuXHRcdFx0XHRpZiAoaXNGaWVsZEFycmF5KSB7XG5cdFx0XHRcdFx0Ly8gb25seSBmaXJzdCB2YWx1ZSBjaGVjayBpcyBlbm91Z2ggYXMgdGhlIGZpZWxkIHZhbHVlIGNvbWVzIG9uIFswXSByZXN0IG9mIHRoZSBhcnJheSBpbmNsdWRlcyBjdXJyZW5jeSBhbmQgY3VycmVuY3kgY29kZVxuXHRcdFx0XHRcdC8vIGJvdGggb2Ygd2hpY2ggY2FuIG9yIGNhbm5vdCBiZSBudWxsLCBzbyB3ZSBzaGFsbCBjaGVjayBvbmx5IHRoZSBmaWVsZCB2YWx1ZVxuXHRcdFx0XHRcdHJldHVybiBmaWVsZFZhbHVlWzBdID09PSBudWxsIHx8IGZpZWxkVmFsdWVbMF0gPT09IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZpZWxkVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBmaWVsZFZhbHVlID09PSBudWxsIHx8IGZpZWxkVmFsdWUgPT09IFwiXCI7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0LyogTWVzc2FnZSBmb3IgbWlzc2luZyBtYW5kYXRvcnkgdmFsdWUgb2YgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgKi9cblx0XHRpZiAoZW1wdHlSZXF1aXJlZEZpZWxkcy5sZW5ndGgpIHtcblx0XHRcdHRoaXMuX2FkZE1lc3NhZ2VGb3JBY3Rpb25QYXJhbWV0ZXIoXG5cdFx0XHRcdGVtcHR5UmVxdWlyZWRGaWVsZHMubWFwKChhY3Rpb25QYXJhbWV0ZXJJbmZvKSA9PiAoe1xuXHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm86IGFjdGlvblBhcmFtZXRlckluZm8sXG5cdFx0XHRcdFx0bWVzc2FnZTogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19PUEVSQVRJT05TX0FDVElPTl9QQVJBTUVURVJfRElBTE9HX01JU1NJTkdfTUFOREFUT1JZX01TR1wiLCBbXG5cdFx0XHRcdFx0XHQoYWN0aW9uUGFyYW1ldGVySW5mby5maWVsZC5nZXRQYXJlbnQoKT8uZ2V0QWdncmVnYXRpb24oXCJsYWJlbFwiKSBhcyBMYWJlbCkuZ2V0VGV4dCgpXG5cdFx0XHRcdFx0XSlcblx0XHRcdFx0fSkpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHQvKiBDaGVjayB2YWx1ZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycyAqL1xuXHRcdGNvbnN0IGZpcnN0SW52YWxpZFBhcmFtZXRlciA9IGFjdGlvblBhcmFtZXRlckluZm9zLmZpbmQoXG5cdFx0XHQocGFyYW1ldGVySW5mbykgPT5cblx0XHRcdFx0cGFyYW1ldGVySW5mby5maWVsZC5nZXRWaXNpYmxlKCkgJiZcblx0XHRcdFx0KHBhcmFtZXRlckluZm8uaGFzRXJyb3IgfHwgcGFyYW1ldGVySW5mby5maWVsZC5nZXRWYWx1ZVN0YXRlKCkgPT09IFwiRXJyb3JcIiB8fCBlbXB0eVJlcXVpcmVkRmllbGRzLmluY2x1ZGVzKHBhcmFtZXRlckluZm8pKVxuXHRcdCk7XG5cdFx0aWYgKGZpcnN0SW52YWxpZFBhcmFtZXRlcikge1xuXHRcdFx0Zmlyc3RJbnZhbGlkUGFyYW1ldGVyLmZpZWxkLnNldFZpc2libGUodHJ1ZSk7XG5cdFx0XHRmaXJzdEludmFsaWRQYXJhbWV0ZXIuZmllbGQuZm9jdXMoKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBhY3Rpb24gZW5hYmxlbWVudC5cblx0ICogQHBhcmFtIG9JbnRlcm5hbE1vZGVsQ29udGV4dCBPYmplY3QgY29udGFpbmluZyB0aGUgY29udGV4dCBtb2RlbFxuXHQgKiBAcGFyYW0gb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCBNYXAgY29udGFpbmluZyB0aGUgb3BlcmF0aW9uIGF2YWlsYWJpbGl0eSBvZiBhY3Rpb25zXG5cdCAqIEBwYXJhbSBhU2VsZWN0ZWRDb250ZXh0cyBBcnJheSBjb250YWluaW5nIHNlbGVjdGVkIGNvbnRleHRzIG9mIHRoZSBjaGFydFxuXHQgKiBAcGFyYW0gc0NvbnRyb2wgQ29udHJvbCBuYW1lXG5cdCAqIEBwYXJhbSBmb3JDb250ZXh0TWVudSBJbmRpY2F0ZXMgaWYgdGhlIGFjdGlvbiBhcHBlYXJzIGluIHRoZSBjb250ZXh0IG1lbnUuIElmIGZhbHNlLCB0aGUgYWN0aW9uIGFwcGVhcnMgaW4gdGhlIHRhYmxlIHRvb2xiYXJcblx0ICogQHJldHVybnMgVGhlIGFjdGlvbiBlbmFibGVtZW50IHByb21pc2VzXG5cdCAqL1xuXHRzZXRBY3Rpb25FbmFibGVtZW50OiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuXHRcdGFTZWxlY3RlZENvbnRleHRzOiBDb250ZXh0W10sXG5cdFx0c0NvbnRyb2w6IHN0cmluZyxcblx0XHRmb3JDb250ZXh0TWVudSA9IGZhbHNlXG5cdCk6IFByb21pc2U8dm9pZFtdPiB7XG5cdFx0Y29uc3QgYVByb21pc2VzID0gW107XG5cdFx0Zm9yIChjb25zdCBzQWN0aW9uIGluIG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXApIHtcblx0XHRcdGxldCBhUmVxdWVzdFByb21pc2VzOiBQcm9taXNlPF9SZXF1ZXN0ZWRQcm9wZXJ0eT5bXSA9IFtdO1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KHNBY3Rpb24sIGZhbHNlKTtcblx0XHRcdGlmIChzQ29udHJvbCA9PT0gXCJ0YWJsZVwiKSB7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9hQXBwbGljYWJsZWAsIFtdKTtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259L2FOb3RBcHBsaWNhYmxlYCwgW10pO1xuXHRcdFx0XHRpZiAoZm9yQ29udGV4dE1lbnUpIHtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYkVuYWJsZWRGb3JDb250ZXh0TWVudWAsIGZhbHNlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYkVuYWJsZWRgLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnN0IHNQcm9wZXJ0eSA9IG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXBbc0FjdGlvbl07XG5cdFx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYVNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdFx0Y29uc3Qgb1NlbGVjdGVkQ29udGV4dCA9IGVsZW1lbnQ7XG5cdFx0XHRcdGlmIChvU2VsZWN0ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdFx0XHRpZiAoc0NvbnRyb2wgPT09IFwiY2hhcnRcIikge1xuXHRcdFx0XHRcdFx0aWYgKChzUHJvcGVydHkgPT09IG51bGwgJiYgISFvQ29udGV4dERhdGFbYCMke3NBY3Rpb259YF0pIHx8IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRcdFx0Ly9sb29rIGZvciBhY3Rpb24gYWR2ZXJ0aXNlbWVudCBpZiBwcmVzZW50IGFuZCBpdHMgdmFsdWUgaXMgbm90IG51bGxcblx0XHRcdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KHNBY3Rpb24sIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNDb250cm9sID09PSBcInRhYmxlXCIpIHtcblx0XHRcdFx0XHRcdGFSZXF1ZXN0UHJvbWlzZXMgPSB0aGlzLl9zZXRBY3Rpb25FbmFibGVtZW50Rm9yVGFibGUoXG5cdFx0XHRcdFx0XHRcdG9TZWxlY3RlZENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0c0FjdGlvbixcblx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRhUmVxdWVzdFByb21pc2VzLFxuXHRcdFx0XHRcdFx0XHRmb3JDb250ZXh0TWVudVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChzQ29udHJvbCA9PT0gXCJ0YWJsZVwiKSB7XG5cdFx0XHRcdGlmICghYVNlbGVjdGVkQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259YCwge1xuXHRcdFx0XHRcdFx0YkVuYWJsZWQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0YUFwcGxpY2FibGU6IFtdLFxuXHRcdFx0XHRcdFx0YU5vdEFwcGxpY2FibGU6IFtdXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YVByb21pc2VzLnB1c2goQ29tbW9uVXRpbHMuc2V0Q29udGV4dHNCYXNlZE9uT3BlcmF0aW9uQXZhaWxhYmxlKG9JbnRlcm5hbE1vZGVsQ29udGV4dCwgW10sIGZvckNvbnRleHRNZW51KSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYVNlbGVjdGVkQ29udGV4dHMubGVuZ3RoICYmIHR5cGVvZiBzUHJvcGVydHkgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHQvLyBXaGVuIGFsbCBwcm9wZXJ0eSB2YWx1ZXMgaGF2ZSBiZWVuIHJldHJpZXZlZCwgc2V0XG5cdFx0XHRcdFx0Ly8gVGhlIGFwcGxpY2FibGUgYW5kIG5vdC1hcHBsaWNhYmxlIHNlbGVjdGVkIGNvbnRleHRzIGZvciBlYWNoIGFjdGlvbiBhbmRcblx0XHRcdFx0XHQvLyBUaGUgZW5hYmxlZCBwcm9wZXJ0eSBvZiB0aGUgZHluYW1pYyBhY3Rpb24gaW4gaW50ZXJuYWwgbW9kZWwgY29udGV4dC5cblx0XHRcdFx0XHRhUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRcdENvbW1vblV0aWxzLnNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZShvSW50ZXJuYWxNb2RlbENvbnRleHQsIGFSZXF1ZXN0UHJvbWlzZXMsIGZvckNvbnRleHRNZW51KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKGFQcm9taXNlcyk7XG5cdH0sXG5cdHNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoOiBmdW5jdGlvbiAoXG5cdFx0b1ZpZXc6IFZpZXcsXG5cdFx0b0xpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHRcblx0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0RGF0YSA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uZ2V0T2JqZWN0KCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0Y29uc3Qgb0NvbnRyb2xzID0gKG9JbnRlcm5hbE1vZGVsQ29udGV4dERhdGE/LmNvbnRyb2xzIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB7IGNvbnRyb2xJZD86IHN0cmluZyB9Pjtcblx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gb0NvbnRyb2xzKSB7XG5cdFx0XHRpZiAob0NvbnRyb2xzW3NLZXldICYmIG9Db250cm9sc1tzS2V5XS5jb250cm9sSWQpIHtcblx0XHRcdFx0Y29uc3Qgb1RhYmxlID0gb1ZpZXcuYnlJZChzS2V5KTtcblx0XHRcdFx0aWYgKG9UYWJsZSAmJiBvVGFibGUuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHRjb25zdCBvUm93QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0XHRcdFx0aWYgKG9Sb3dCaW5kaW5nID09IG9MaXN0QmluZGluZykge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSBvVGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRKU09OLnBhcnNlKHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbi5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdFx0XHRvVGFibGUuZ2V0U2VsZWN0ZWRDb250ZXh0cygpIGFzIENvbnRleHRbXSxcblx0XHRcdFx0XHRcdFx0XCJ0YWJsZVwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHR1cGRhdGVFZGl0QnV0dG9uVmlzaWJpbGl0eUFuZEVuYWJsZW1lbnQob1ZpZXc6IEZFVmlldyk6IHZvaWQge1xuXHRcdGNvbnN0IGlWaWV3TGV2ZWwgPSAob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncyk/LnZpZXdMZXZlbCxcblx0XHRcdGlzRWRpdGFibGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKG9WaWV3KTtcblx0XHRpZiAoKGlWaWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDEgJiYgaXNFZGl0YWJsZSAhPT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvVmlldyk7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IE1vZGVsSGVscGVyLmdldFJvb3RFbnRpdHlTZXRQYXRoKHNNZXRhUGF0aCk7XG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG9Db250ZXh0XG5cdFx0XHRcdD8uZ2V0TW9kZWwoKVxuXHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0Py5nZXRDb250ZXh0KG9Db250ZXh0Py5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3QgY29udmVydGVyQ29udGV4dCA9IENvbnZlcnRlckNvbnRleHQ/LmNyZWF0ZUNvbnZlcnRlckNvbnRleHRGb3JNYWNybyhcblx0XHRcdFx0c0VudGl0eVNldCxcblx0XHRcdFx0bWV0YUNvbnRleHQsXG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0RGlhZ25vc3RpY3MoKSxcblx0XHRcdFx0bWVyZ2Vcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRcdFx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRcdFx0bGV0IHVwZGF0ZUhpZGRlbjtcblx0XHRcdC8vRmluZCB0aGUgVXBkYXRlIEhpZGRlbiBvZiB0aGUgcm9vdCBlbnRpdHkgc2V0IGFuZCBiaW5kIHRoZSBwcm9wZXJ0eSB0byBBbnlFbGVtZW50LCBhbnkgY2hhbmdlcyBpbiB0aGUgcGF0aCBvZiB0aGUgcm9vdCBVcGRhdGVIaWRkZW4gd2lsbCBiZSB1cGRhdGVkIHZpYSB0aGUgcHJvcGVydHksIGludGVybmFsIG1vZGVsIGNvbnRleHQgaXMgdXBkYXRlZCBiYXNlZCBvbiB0aGUgcHJvcGVydHlcblx0XHRcdGNvbnN0IGJVcGRhdGVIaWRkZW4gPSBpc0VudGl0eVNldChlbnRpdHlTZXQpICYmIGVudGl0eVNldC5hbm5vdGF0aW9ucy5VST8uVXBkYXRlSGlkZGVuPy52YWx1ZU9mKCk7XG5cdFx0XHRpZiAoYlVwZGF0ZUhpZGRlbiAhPT0gdHJ1ZSkge1xuXHRcdFx0XHR1cGRhdGVIaWRkZW4gPSBNb2RlbEhlbHBlci5pc1VwZGF0ZUhpZGRlbihlbnRpdHlTZXQsIGVudGl0eVR5cGUpO1xuXHRcdFx0fVxuXHRcdFx0Ly9GaW5kIHRoZSBvcGVyYXRpb24gYXZhaWxhYmxlIHByb3BlcnR5IG9mIHRoZSByb290IGVkaXQgY29uZmlndXJhdGlvbiBhbmQgZmV0Y2ggdGhlIHByb3BlcnR5IHVzaW5nIEFueUVsZW1lbnRcblx0XHRcdGNvbnN0IHNFZGl0RW5hYmxlQmluZGluZyA9IGdldEVkaXRCdXR0b25FbmFibGVkKGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0Y29uc3QgZHJhZnRSb290UGF0aCA9IE1vZGVsSGVscGVyLmdldERyYWZ0Um9vdFBhdGgob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc1N0aWNreVJvb3RQYXRoID0gTW9kZWxIZWxwZXIuZ2V0U3RpY2t5Um9vdFBhdGgob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc1BhdGggPSBkcmFmdFJvb3RQYXRoIHx8IHNTdGlja3lSb290UGF0aDtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRpZiAoc1BhdGgpIHtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RDb250ZXh0ID0gb1ZpZXcuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChzUGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdGlmICh1cGRhdGVIaWRkZW4gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGNvbnN0IHNIaWRkZW5FeHByZXNzaW9uID0gY29tcGlsZUV4cHJlc3Npb24oZXF1YWwoZ2V0SGlkZGVuRXhwcmVzc2lvbihjb252ZXJ0ZXJDb250ZXh0LCB1cGRhdGVIaWRkZW4pLCBmYWxzZSkpO1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRWRpdE1vZGVsQ29udGV4dChzSGlkZGVuRXhwcmVzc2lvbiwgb1ZpZXcsIG9Sb290Q29udGV4dCwgXCJyb290RWRpdFZpc2libGVcIiwgb0ludGVybmFsTW9kZWxDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoc0VkaXRFbmFibGVCaW5kaW5nKSB7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGVFZGl0TW9kZWxDb250ZXh0KHNFZGl0RW5hYmxlQmluZGluZywgb1ZpZXcsIG9Sb290Q29udGV4dCwgXCJyb290RWRpdEVuYWJsZWRcIiwgb0ludGVybmFsTW9kZWxDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHR1cGRhdGVFZGl0TW9kZWxDb250ZXh0OiBmdW5jdGlvbiAoXG5cdFx0c0JpbmRpbmdFeHByZXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0b1ZpZXc6IFZpZXcsXG5cdFx0b1Jvb3RDb250ZXh0OiBDb250ZXh0LFxuXHRcdHNQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHRcblx0KTogdm9pZCB7XG5cdFx0aWYgKHNCaW5kaW5nRXhwcmVzc2lvbikge1xuXHRcdFx0Y29uc3Qgb0hpZGRlbkVsZW1lbnQgPSBuZXcgQW55RWxlbWVudCh7IGFueVRleHQ6IHNCaW5kaW5nRXhwcmVzc2lvbiB9KTtcblx0XHRcdG9IaWRkZW5FbGVtZW50LnNldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXHRcdFx0b1ZpZXcuYWRkRGVwZW5kZW50KG9IaWRkZW5FbGVtZW50KTtcblx0XHRcdG9IaWRkZW5FbGVtZW50LmdldEJpbmRpbmcoXCJhbnlUZXh0XCIpO1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvSGlkZGVuRWxlbWVudFxuXHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHQ/LmJpbmRDb250ZXh0KG9Sb290Q29udGV4dC5nZXRQYXRoKCksIG9Sb290Q29udGV4dCwgeyAkJGdyb3VwSWQ6IFwiJGF1dG8uSGVyb2VzXCIgfSlcblx0XHRcdFx0Py5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdG9IaWRkZW5FbGVtZW50LnNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdG9IaWRkZW5FbGVtZW50Py5nZXRCaW5kaW5nKFwiYW55VGV4dFwiKT8uYXR0YWNoQ2hhbmdlKChvRXZlbnQ6IEV2ZW50PHt9LCBQcm9wZXJ0eUJpbmRpbmc+KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9OZXdWYWx1ZSA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRFeHRlcm5hbFZhbHVlKCk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShzUHJvcGVydHksIG9OZXdWYWx1ZSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0X3NldEFjdGlvbkVuYWJsZW1lbnRGb3JUYWJsZTogZnVuY3Rpb24gKFxuXHRcdG9TZWxlY3RlZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQsXG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRzQWN0aW9uOiBzdHJpbmcsXG5cdFx0c1Byb3BlcnR5OiBzdHJpbmcsXG5cdFx0YVJlcXVlc3RQcm9taXNlczogUHJvbWlzZTxfUmVxdWVzdGVkUHJvcGVydHk+W10sXG5cdFx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuXHQpOiBQcm9taXNlPF9SZXF1ZXN0ZWRQcm9wZXJ0eT5bXSB7XG5cdFx0Ly8gUmV0cmlldmUgcHJldmlvdXNseSBjaGVja2VkIGNvbnRleHRzIGluIGNhc2Ugb2YgIWZvckNvbnRleHRNZW51XG5cdFx0Y29uc3Qgc0VuYWJsZW1lbnRGaWVsZE5hbWUgPSBmb3JDb250ZXh0TWVudSA/IFwiYkVuYWJsZWRGb3JDb250ZXh0TWVudVwiIDogXCJiRW5hYmxlZFwiLFxuXHRcdFx0YUFwcGxpY2FibGU6IFtDb250ZXh0IHwgdW5kZWZpbmVkXSA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9hQXBwbGljYWJsZWApIHx8IFtdLFxuXHRcdFx0YU5vdEFwcGxpY2FibGU6IFtDb250ZXh0IHwgdW5kZWZpbmVkXSA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9hTm90QXBwbGljYWJsZWApIHx8IFtdO1xuXHRcdGxldCBiQWN0aW9uRW5hYmxlZDogYm9vbGVhbiA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS8ke3NFbmFibGVtZW50RmllbGROYW1lfWApIHx8IGZhbHNlO1xuXG5cdFx0aWYgKCFmb3JDb250ZXh0TWVudSkge1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259YCwge1xuXHRcdFx0XHRiRW5hYmxlZDogZmFsc2UsXG5cdFx0XHRcdGFBcHBsaWNhYmxlOiBbXSxcblx0XHRcdFx0YU5vdEFwcGxpY2FibGU6IFtdXG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259YCwge1xuXHRcdFx0XHQvLyBEbyBub3QgY2hhbmdlIGVuYWJsZWQsIGFBcHBsaWNhYmxlIGFuZCBhTm90QXBwbGljYWJsZSBwcm9wZXJ0eSBpbiBjYXNlIG9mIGNvbnRleHQgbWVudSBjYWxjdWxhdGlvblxuXHRcdFx0XHQvLyBpbiBjYXNlIG9mIGNvbnRleHQgbWVudSwgb25seSB0aGUgY2xpY2tlZCBjb250ZXh0IGdvZXMgaW50byB0aGUgcHJvY2Vzc2luZyAtIG90aGVyIHNlbGVjdGVkIGNvbnRleHRzIG11c3QgYmUga2VwdCBpbiB0aGUgbW9kZWxcblx0XHRcdFx0YkVuYWJsZWQ6IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9iRW5hYmxlZGApLFxuXHRcdFx0XHRhQXBwbGljYWJsZTogb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259L2FBcHBsaWNhYmxlYCksXG5cdFx0XHRcdGFOb3RBcHBsaWNhYmxlOiBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYU5vdEFwcGxpY2FibGVgKSxcblx0XHRcdFx0YkVuYWJsZWRGb3JDb250ZXh0TWVudTogZmFsc2UsXG5cdFx0XHRcdGFBcHBsaWNhYmxlRm9yQ29udGV4dE1lbnU6IFtdLFxuXHRcdFx0XHRhTm90QXBwbGljYWJsZUZvckNvbnRleHRNZW51OiBbXVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIE5vdGUgdGhhdCBub24gZHluYW1pYyBhY3Rpb25zIGFyZSBub3QgcHJvY2Vzc2VkIGhlcmUuIFRoZXkgYXJlIGVuYWJsZWQgYmVjYXVzZVxuXHRcdC8vIG9uZSBvciBtb3JlIGFyZSBzZWxlY3RlZCBhbmQgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBjb25kaXRpb24gaW4gdGhlIHRlbXBsYXRpbmdcblx0XHQvLyBpcyB0aGVuIHVuZGVmaW5lZCBhbmQgdGh1cyB0aGUgYnV0dG9uIHRha2VzIHRoZSBkZWZhdWx0IGVuYWJsaW5nLCB3aGljaCBpcyB0cnVlIVxuXHRcdGNvbnN0IHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGggPSBgJHtvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpfS9keW5hbWljQWN0aW9ucy8ke3NBY3Rpb259LyR7c0VuYWJsZW1lbnRGaWVsZE5hbWV9YDtcblxuXHRcdGlmICh0eXBlb2Ygc1Byb3BlcnR5ID09PSBcIm9iamVjdFwiICYmIHNQcm9wZXJ0eSAhPT0gbnVsbCAmJiBzUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKG9TZWxlY3RlZENvbnRleHQpIHtcblx0XHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoKSBhcyBSZWNvcmQ8c3RyaW5nLCBQcmltaXRpdmVUeXBlPjtcblx0XHRcdFx0Y29uc3Qgb1RyYW5zZm9ybWVkQmluZGluZyA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KFxuXHRcdFx0XHRcdHNQcm9wZXJ0eSxcblx0XHRcdFx0XHRcIlBhdGhJbk1vZGVsXCIsXG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3AtZnVuY1xuXHRcdFx0XHRcdGZ1bmN0aW9uIChvQmluZGluZ0V4cHJlc3Npb246IFBhdGhJbk1vZGVsRXhwcmVzc2lvbjxQcmltaXRpdmVUeXBlPikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0RGF0YSA/IGNvbnN0YW50KG9Db250ZXh0RGF0YVtvQmluZGluZ0V4cHJlc3Npb24ucGF0aF0pIDogY29uc3RhbnQoZmFsc2UpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBzUmVzdWx0ID0gY29tcGlsZUV4cHJlc3Npb24ob1RyYW5zZm9ybWVkQmluZGluZyk7XG5cdFx0XHRcdGJBY3Rpb25FbmFibGVkID0gYkFjdGlvbkVuYWJsZWQgfHwgc1Jlc3VsdCA9PT0gXCJ0cnVlXCI7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgsIGJBY3Rpb25FbmFibGVkKTtcblx0XHRcdFx0KHNSZXN1bHQgPT09IFwidHJ1ZVwiID8gYUFwcGxpY2FibGUgOiBhTm90QXBwbGljYWJsZSkucHVzaChvU2VsZWN0ZWRDb250ZXh0KTtcblx0XHRcdH1cblx0XHRcdENvbW1vblV0aWxzLnNldER5bmFtaWNBY3Rpb25Db250ZXh0cyhvSW50ZXJuYWxNb2RlbENvbnRleHQsIHNBY3Rpb24sIGFBcHBsaWNhYmxlLCBhTm90QXBwbGljYWJsZSwgZm9yQ29udGV4dE1lbnUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvU2VsZWN0ZWRDb250ZXh0Py5nZXRPYmplY3QoKSBhcyBSZWNvcmQ8c3RyaW5nLCBQcmltaXRpdmVUeXBlPjtcblx0XHRcdGlmIChzUHJvcGVydHkgPT09IG51bGwgJiYgISFvQ29udGV4dERhdGFbYCMke3NBY3Rpb259YF0pIHtcblx0XHRcdFx0Ly9sb29rIGZvciBhY3Rpb24gYWR2ZXJ0aXNlbWVudCBpZiBwcmVzZW50IGFuZCBpdHMgdmFsdWUgaXMgbm90IG51bGxcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LmdldE1vZGVsKCkuc2V0UHJvcGVydHkoc0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCwgdHJ1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKG9TZWxlY3RlZENvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHQvLyBDb2xsZWN0IHByb21pc2VzIHRvIHJldHJpZXZlIHNpbmdsZXRvbiBvciBub3JtYWwgcHJvcGVydHkgdmFsdWUgYXN5bmNocm9ub3VzbHlcblx0XHRcdFx0YVJlcXVlc3RQcm9taXNlcy5wdXNoKENvbW1vblV0aWxzLnJlcXVlc3RQcm9wZXJ0eShvU2VsZWN0ZWRDb250ZXh0LCBzQWN0aW9uLCBzUHJvcGVydHksIHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGFSZXF1ZXN0UHJvbWlzZXM7XG5cdH1cbn07XG5leHBvcnQgZGVmYXVsdCBBY3Rpb25SdW50aW1lO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztFQXlDQSxNQUFNQSxhQUFhLEdBQUc7SUFDckI7QUFDRDtBQUNBO0FBQ0E7SUFDQ0MsNkJBQTZCLEVBQUUsU0FBQUEsQ0FBVUMsaUJBQWtGLEVBQVE7TUFDbElDLFNBQVMsQ0FBQ0MsV0FBVyxDQUNwQkYsaUJBQWlCLENBQUNHLEdBQUcsQ0FBRUMsZ0JBQWdCLElBQUs7UUFDM0MsTUFBTUMsT0FBTyxHQUFHRCxnQkFBZ0IsQ0FBQ0UsbUJBQW1CLENBQUNDLEtBQUssQ0FBQ0MsVUFBVSxDQUNwRUosZ0JBQWdCLENBQUNFLG1CQUFtQixDQUFDRyxZQUFZLEdBQUcsT0FBTyxHQUFHLE9BQy9ELENBQUM7UUFD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
290
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBY3Rpb25SdW50aW1lIiwiaXNSZXF1aXJlZEZpZWxkRW1wdHkiLCJwYXJhbWV0ZXJJbmZvIiwiZmllbGRJZCIsImZpZWxkIiwiZ2V0SWQiLCJhbGxNZXNzYWdlcyIsIk1lc3NhZ2luZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJyZWxldmFudE1lc3NhZ2VzIiwiZmlsdGVyIiwibXNnIiwiZ2V0Q29udHJvbElkcyIsInNvbWUiLCJjb250cm9sSWQiLCJpbmNsdWRlcyIsImxlbmd0aCIsImlzTXVsdGlWYWx1ZSIsInZhbHVlIiwidW5kZWZpbmVkIiwiQXJyYXkiLCJpc0FycmF5IiwiZmllbGRWYWx1ZSIsImdldFZhbHVlIiwiaXNGaWVsZEFycmF5IiwiX2FkZE1lc3NhZ2VGb3JBY3Rpb25QYXJhbWV0ZXIiLCJtZXNzYWdlUGFyYW1ldGVycyIsIm1lc3NhZ2VzIiwibWFwIiwibWVzc2FnZVBhcmFtZXRlciIsImJpbmRpbmciLCJhY3Rpb25QYXJhbWV0ZXJJbmZvIiwiZ2V0QmluZGluZyIsIm1lc3NhZ2UiLCJNZXNzYWdlIiwidHlwZSIsIk1lc3NhZ2VUeXBlIiwiRXJyb3IiLCJwcm9jZXNzb3IiLCJnZXRNb2RlbCIsInBlcnNpc3RlbnQiLCJ0YXJnZXQiLCJnZXRSZXNvbHZlZFBhdGgiLCJjaGFuZ2VIYW5kbGVyIiwicmVtb3ZlTWVzc2FnZXMiLCJkZXRhY2hDaGFuZ2UiLCJhdHRhY2hDaGFuZ2UiLCJhZGRNZXNzYWdlcyIsInZhbGlkYXRlUHJvcGVydGllcyIsImFjdGlvblBhcmFtZXRlckluZm9zIiwicmVzb3VyY2VNb2RlbCIsIlByb21pc2UiLCJhbGxTZXR0bGVkIiwidmFsaWRhdGlvblByb21pc2UiLCJyZXF1aXJlZFBhcmFtZXRlckluZm9zIiwiZ2V0UmVxdWlyZWQiLCJlbXB0eVJlcXVpcmVkRmllbGRzIiwiZ2V0VGV4dCIsImdldFBhcmVudCIsImdldEFnZ3JlZ2F0aW9uIiwiZmlyc3RJbnZhbGlkUGFyYW1ldGVyIiwiZmluZCIsImdldFZpc2libGUiLCJoYXNFcnJvciIsImdldFZhbHVlU3RhdGUiLCJzZXRWaXNpYmxlIiwiZm9jdXMiLCJzZXRBY3Rpb25FbmFibGVtZW50Iiwib0ludGVybmFsTW9kZWxDb250ZXh0Iiwib0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImFTZWxlY3RlZENvbnRleHRzIiwic0NvbnRyb2wiLCJmb3JDb250ZXh0TWVudSIsImFyZ3VtZW50cyIsImFQcm9taXNlcyIsInNBY3Rpb24iLCJhUmVxdWVzdFByb21pc2VzIiwic2V0UHJvcGVydHkiLCJzUHJvcGVydHkiLCJlbGVtZW50Iiwib1NlbGVjdGVkQ29udGV4dCIsIm9Db250ZXh0RGF0YSIsImdldE9iamVjdCIsIl9zZXRBY3Rpb25FbmFibGVtZW50Rm9yVGFibGUiLCJiRW5hYmxlZCIsImFBcHBsaWNhYmxlIiwiYU5vdEFwcGxpY2FibGUiLCJwdXNoIiwiQ29tbW9uVXRpbHMiLCJzZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUiLCJhbGwiLCJzZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaCIsIm9WaWV3Iiwib0xpc3RCaW5kaW5nIiwib0ludGVybmFsTW9kZWxDb250ZXh0RGF0YSIsIm9Db250cm9scyIsImNvbnRyb2xzIiwic0tleSIsIm9UYWJsZSIsImJ5SWQiLCJpc0EiLCJvUm93QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJ0YWJsZUFQSSIsImdldEJpbmRpbmdDb250ZXh0IiwiSlNPTiIsInBhcnNlIiwidGFibGVEZWZpbml0aW9uIiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsInVwZGF0ZUVkaXRCdXR0b25WaXNpYmlsaXR5QW5kRW5hYmxlbWVudCIsImlWaWV3TGV2ZWwiLCJnZXRWaWV3RGF0YSIsInZpZXdMZXZlbCIsImlzRWRpdGFibGUiLCJnZXRJc0VkaXRhYmxlIiwib0NvbnRleHQiLCJvQXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50Iiwic01ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJzRW50aXR5U2V0IiwiZ2V0Um9vdEVudGl0eVNldFBhdGgiLCJtZXRhQ29udGV4dCIsImdldE1ldGFNb2RlbCIsImdldENvbnRleHQiLCJnZXRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsIkNvbnZlcnRlckNvbnRleHQiLCJjcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8iLCJnZXREaWFnbm9zdGljcyIsIm1lcmdlIiwiZW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0IiwiZW50aXR5VHlwZSIsImdldEVudGl0eVR5cGUiLCJ1cGRhdGVIaWRkZW4iLCJiVXBkYXRlSGlkZGVuIiwiaXNFbnRpdHlTZXQiLCJhbm5vdGF0aW9ucyIsIlVJIiwiVXBkYXRlSGlkZGVuIiwidmFsdWVPZiIsImlzVXBkYXRlSGlkZGVuIiwic0VkaXRFbmFibGVCaW5kaW5nIiwiZ2V0RWRpdEJ1dHRvbkVuYWJsZWQiLCJkcmFmdFJvb3RQYXRoIiwiZ2V0RHJhZnRSb290UGF0aCIsInNTdGlja3lSb290UGF0aCIsImdldFN0aWNreVJvb3RQYXRoIiwic1BhdGgiLCJvUm9vdENvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsInNIaWRkZW5FeHByZXNzaW9uIiwiY29tcGlsZUV4cHJlc3Npb24iLCJlcXVhbCIsImdldEhpZGRlbkV4cHJlc3Npb24iLCJ1cGRhdGVFZGl0TW9kZWxDb250ZXh0Iiwic0JpbmRpbmdFeHByZXNzaW9uIiwib0hpZGRlbkVsZW1lbnQiLCJBbnlFbGVtZW50IiwiYW55VGV4dCIsInNldEJpbmRpbmdDb250ZXh0IiwiYWRkRGVwZW5kZW50IiwiJCRncm91cElkIiwib0V2ZW50Iiwib05ld1ZhbHVlIiwiZ2V0U291cmNlIiwiZ2V0RXh0ZXJuYWxWYWx1ZSIsInNFbmFibGVtZW50RmllbGROYW1lIiwiZ2V0UHJvcGVydHkiLCJiQWN0aW9uRW5hYmxlZCIsImJFbmFibGVkRm9yQ29udGV4dE1lbnUiLCJhQXBwbGljYWJsZUZvckNvbnRleHRNZW51IiwiYU5vdEFwcGxpY2FibGVGb3JDb250ZXh0TWVudSIsInNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgiLCJvVHJhbnNmb3JtZWRCaW5kaW5nIiwidHJhbnNmb3JtUmVjdXJzaXZlbHkiLCJvQmluZGluZ0V4cHJlc3Npb24iLCJjb25zdGFudCIsInBhdGgiLCJzUmVzdWx0Iiwic2V0RHluYW1pY0FjdGlvbkNvbnRleHRzIiwicmVxdWVzdFByb3BlcnR5Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJBY3Rpb25SdW50aW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9uUGFyYW1ldGVyIGFzIEVkbUFjdGlvblBhcmFtZXRlciwgUHJpbWl0aXZlVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IG1lcmdlIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhJbk1vZGVsRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgY29tcGlsZUV4cHJlc3Npb24sIGNvbnN0YW50LCBlcXVhbCwgdHJhbnNmb3JtUmVjdXJzaXZlbHkgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IF9SZXF1ZXN0ZWRQcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGlzRW50aXR5U2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCB0eXBlIExhYmVsIGZyb20gXCJzYXAvbS9MYWJlbFwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgTWVzc2FnaW5nIGZyb20gXCJzYXAvdWkvY29yZS9NZXNzYWdpbmdcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBNZXNzYWdlVHlwZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlVHlwZVwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIEZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGQgZnJvbSBcInNhcC91aS9tZGMvTXVsdGlWYWx1ZUZpZWxkXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkSXRlbSBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9NdWx0aVZhbHVlRmllbGRJdGVtXCI7XG5pbXBvcnQgdHlwZSBQcm9wZXJ0eUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9Qcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgRmlsZVVwbG9hZGVyIGZyb20gXCJzYXAvdWkvdW5pZmllZC9GaWxlVXBsb2FkZXJcIjtcbmltcG9ydCBBbnlFbGVtZW50IGZyb20gXCIuL2NvbnRyb2xzL0FueUVsZW1lbnRcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCIuL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBCYXNlTWFuaWZlc3RTZXR0aW5ncyB9IGZyb20gXCIuL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgZ2V0RWRpdEJ1dHRvbkVuYWJsZWQsIGdldEhpZGRlbkV4cHJlc3Npb24gfSBmcm9tIFwiLi9jb252ZXJ0ZXJzL29iamVjdFBhZ2UvSGVhZGVyQW5kRm9vdGVyQWN0aW9uXCI7XG5cbmV4cG9ydCB0eXBlIEFjdGlvblBhcmFtZXRlckluZm8gPSB7XG5cdHBhcmFtZXRlcj86IEVkbUFjdGlvblBhcmFtZXRlcjtcblx0ZmllbGQ6IEZpZWxkIHwgTXVsdGlWYWx1ZUZpZWxkIHwgRmlsZVVwbG9hZGVyO1xuXHRpc011bHRpVmFsdWU6IGJvb2xlYW47XG5cdHZhbHVlPzogc3RyaW5nIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblx0dmFsaWRhdGlvblByb21pc2U/OiBQcm9taXNlPHN0cmluZyB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXT47XG5cdGhhc0Vycm9yOiBib29sZWFuO1xuXHRwcm9wZXJ0eVBhdGg/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBBY3Rpb25SdW50aW1lID0ge1xuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgcmVxdWlyZWQgcGFyYW1ldGVyIGZpZWxkIGlzIGVtcHR5LlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVySW5mbyBJbmZvcm1hdGlvbiBpZGVudGlmeWluZyBhbiBhY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkIGlzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdGlzUmVxdWlyZWRGaWVsZEVtcHR5OiBmdW5jdGlvbiAocGFyYW1ldGVySW5mbzogQWN0aW9uUGFyYW1ldGVySW5mbyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGZpZWxkSWQgPSBwYXJhbWV0ZXJJbmZvLmZpZWxkLmdldElkKCk7XG5cdFx0Y29uc3QgYWxsTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdGNvbnN0IHJlbGV2YW50TWVzc2FnZXMgPSBhbGxNZXNzYWdlcy5maWx0ZXIoKG1zZzogTWVzc2FnZSkgPT5cblx0XHRcdG1zZy5nZXRDb250cm9sSWRzKCkuc29tZSgoY29udHJvbElkOiBzdHJpbmcpID0+IGNvbnRyb2xJZC5pbmNsdWRlcyhmaWVsZElkKSlcblx0XHQpO1xuXHRcdGlmIChyZWxldmFudE1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGVsc2UgaWYgKHBhcmFtZXRlckluZm8uaXNNdWx0aVZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gcGFyYW1ldGVySW5mby52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IChBcnJheS5pc0FycmF5KHBhcmFtZXRlckluZm8udmFsdWUpICYmIHBhcmFtZXRlckluZm8udmFsdWUubGVuZ3RoID09PSAwKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgZmllbGRWYWx1ZSA9IChwYXJhbWV0ZXJJbmZvLmZpZWxkIGFzIEZpZWxkKS5nZXRWYWx1ZSgpO1xuXHRcdFx0Y29uc3QgaXNGaWVsZEFycmF5ID0gQXJyYXkuaXNBcnJheSgocGFyYW1ldGVySW5mby5maWVsZCBhcyBGaWVsZCkuZ2V0VmFsdWUoKSk7XG5cdFx0XHRpZiAoaXNGaWVsZEFycmF5KSB7XG5cdFx0XHRcdC8vIG9ubHkgZmlyc3QgdmFsdWUgY2hlY2sgaXMgZW5vdWdoIGFzIHRoZSBmaWVsZCB2YWx1ZSBjb21lcyBvbiBbMF0gcmVzdCBvZiB0aGUgYXJyYXkgaW5jbHVkZXMgY3VycmVuY3kgYW5kIGN1cnJlbmN5IGNvZGVcblx0XHRcdFx0Ly8gYm90aCBvZiB3aGljaCBjYW4gb3IgY2Fubm90IGJlIG51bGwsIHNvIHdlIHNoYWxsIGNoZWNrIG9ubHkgdGhlIGZpZWxkIHZhbHVlXG5cdFx0XHRcdHJldHVybiBmaWVsZFZhbHVlWzBdID09PSBudWxsIHx8IGZpZWxkVmFsdWVbMF0gPT09IFwiXCI7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGZpZWxkVmFsdWUgPT09IG51bGwgfHwgZmllbGRWYWx1ZSA9PT0gXCJcIjtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBBZGRzIGVycm9yIG1lc3NhZ2VzIGZvciBhbiBhY3Rpb24gcGFyYW1ldGVyIGZpZWxkIHRvIHRoZSBtZXNzYWdlIG1hbmFnZXIuXG5cdCAqIEBwYXJhbSBtZXNzYWdlUGFyYW1ldGVycyBJbmZvcm1hdGlvbiBpZGVudGlmeWluZyBhbiBhY3Rpb24gcGFyYW1ldGVyIGFuZCBtZXNzYWdlcyByZWZlcnJpbmcgdG8gdGhpcyBwYXJhbWV0ZXJcblx0ICovXG5cdF9hZGRNZXNzYWdlRm9yQWN0aW9uUGFyYW1ldGVyOiBmdW5jdGlvbiAobWVzc2FnZVBhcmFtZXRlcnM6IHsgYWN0aW9uUGFyYW1ldGVySW5mbzogQWN0aW9uUGFyYW1ldGVySW5mbzsgbWVzc2FnZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuXHRcdGNvbnN0IG1lc3NhZ2VzID0gbWVzc2FnZVBhcmFtZXRlcnMubWFwKChtZXNzYWdlUGFyYW1ldGVyKSA9PiB7XG5cdFx0XHRjb25zdCBiaW5kaW5nID0gbWVzc2FnZVBhcmFtZXRlci5hY3Rpb25QYXJhbWV0ZXJJbmZvLmZpZWxkLmdldEJpbmRpbmcoXG5cdFx0XHRcdG1lc3NhZ2VQYXJhbWV0ZXIuYWN0aW9uUGFyYW1ldGVySW5mby5pc011bHRpVmFsdWUgPyBcIml0ZW1zXCIgOiBcInZhbHVlXCJcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdG1lc3NhZ2U6IG1lc3NhZ2VQYXJhbWV0ZXIubWVzc2FnZSxcblx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdHByb2Nlc3NvcjogYmluZGluZz8uZ2V0TW9kZWwoKSA/PyB1bmRlZmluZWQsIC8vIGdldE1vZGVsKCk6IG51bGwgfCBNb2RlbCB+fj4gcHJvY2Vzc29yPzogTWVzc2FnZVByb2Nlc3NvclxuXHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHR0YXJnZXQ6IGJpbmRpbmc/LmdldFJlc29sdmVkUGF0aCgpXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXR0YWNoIGNoYW5nZSBoYW5kbGVyIHRvIHZhbGlkYXRlIHZhbHVlIGFuZCByZW1vdmUgbWVzc2FnZSBpZiBmaWVsZCBpcyBub3QgZW1wdHlcblx0XHRcdGlmIChiaW5kaW5nKSB7XG5cdFx0XHRcdGNvbnN0IGNoYW5nZUhhbmRsZXIgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIGZpZWxkIGlzIG5vIGxvbmdlciBlbXB0eSB1c2luZyB0aGUgZXh0cmFjdGVkIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0XHRcdFx0XHRpZiAoIUFjdGlvblJ1bnRpbWUuaXNSZXF1aXJlZEZpZWxkRW1wdHkobWVzc2FnZVBhcmFtZXRlci5hY3Rpb25QYXJhbWV0ZXJJbmZvKSkge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBtZXNzYWdlXG5cdFx0XHRcdFx0XHRNZXNzYWdpbmcucmVtb3ZlTWVzc2FnZXMoW21lc3NhZ2VdKTtcblx0XHRcdFx0XHRcdC8vIERldGFjaCB0aGUgY2hhbmdlIGhhbmRsZXJcblx0XHRcdFx0XHRcdGJpbmRpbmcuZGV0YWNoQ2hhbmdlKGNoYW5nZUhhbmRsZXIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0Ly8gVGhlcmUgbWlnaHQgYmUgc2NlYW5yaW9zIGxpa2UgdmFsdWUgaGVscCBvdXQgcGFyYW1ldGVycyB3aGVyZSB0aGUgZmllbGQgaXMgbm90IGV4cGxpY2l0bHkgY2hhbmdlZCBpbnN0ZWFkIHByb3BlcnR5IHZhbHVlIGNoYW5nZXMgZHVlIHRvIHNldFByb3BlcnR5LlxuXHRcdFx0XHQvLyBJbiBzdWNoIGNhc2VzLCBmaWVsZCBjaGFuZ2UgaXMgbm90IGNhbGxlZCBhbmQgaXMgbm90IGEgcmVsaWFibGUgZXZlbnQgdG8gdmFsaWRhdGUgdGhlIGZpZWxkIHZhbHVlIGFnYWluLlxuXHRcdFx0XHQvLyBTbyB3ZSB1c2UgdmFsdWUvaXRlbXMgYmluZGluZyBjaGFuZ2UgdG8gcmUtdmFsaWRhdGUgdGhlIHByb3BlcnR5IHZhbHVlIHRvIHJlbW92ZSB0aGUgbWVzc2FnZXMuXG5cdFx0XHRcdGJpbmRpbmcuYXR0YWNoQ2hhbmdlKGNoYW5nZUhhbmRsZXIpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWVzc2FnZTtcblx0XHR9KTtcblxuXHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhtZXNzYWdlcyk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhbGwgcmVxdWlyZWQgYWN0aW9uIHBhcmFtZXRlcnMgY29udGFpbiBkYXRhIGFuZCBjaGVja3MgZm9yIGFsbCBhY3Rpb24gcGFyYW1ldGVycyBpZiB0aGVcblx0ICogY29udGFpbmVkIGRhdGEgaXMgdmFsaWQuXG5cdCAqIEBwYXJhbSBhY3Rpb25QYXJhbWV0ZXJJbmZvcyBJbmZvcm1hdGlvbiBpZGVudGlmeWluZyBhbiBhY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEByZXR1cm5zIFRoZSB2YWxpZGF0aW9uIHJlc3VsdCBjYW4gYmUgdHJ1ZSBvciBmYWxzZVxuXHQgKi9cblx0dmFsaWRhdGVQcm9wZXJ0aWVzOiBhc3luYyBmdW5jdGlvbiAoYWN0aW9uUGFyYW1ldGVySW5mb3M6IEFjdGlvblBhcmFtZXRlckluZm9bXSwgcmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcblx0XHRcdGFjdGlvblBhcmFtZXRlckluZm9zLm1hcChcblx0XHRcdFx0KGFjdGlvblBhcmFtZXRlckluZm8pOiBQcm9taXNlPHN0cmluZyB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXT4gfCB1bmRlZmluZWQgPT4gYWN0aW9uUGFyYW1ldGVySW5mby52YWxpZGF0aW9uUHJvbWlzZVxuXHRcdFx0KVxuXHRcdCk7XG5cblx0XHRjb25zdCByZXF1aXJlZFBhcmFtZXRlckluZm9zID0gYWN0aW9uUGFyYW1ldGVySW5mb3MuZmlsdGVyKFxuXHRcdFx0KHBhcmFtZXRlckluZm8pID0+XG5cdFx0XHRcdChwYXJhbWV0ZXJJbmZvLmZpZWxkIGFzIEZpZWxkIHwgTXVsdGlWYWx1ZUZpZWxkKS5nZXRSZXF1aXJlZCAmJlxuXHRcdFx0XHQocGFyYW1ldGVySW5mby5maWVsZCBhcyBGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCkuZ2V0UmVxdWlyZWQoKVxuXHRcdCk7XG5cblx0XHRjb25zdCBlbXB0eVJlcXVpcmVkRmllbGRzID0gcmVxdWlyZWRQYXJhbWV0ZXJJbmZvcy5maWx0ZXIodGhpcy5pc1JlcXVpcmVkRmllbGRFbXB0eSk7XG5cdFx0LyogTWVzc2FnZSBmb3IgbWlzc2luZyBtYW5kYXRvcnkgdmFsdWUgb2YgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgKi9cblx0XHRpZiAoZW1wdHlSZXF1aXJlZEZpZWxkcy5sZW5ndGgpIHtcblx0XHRcdHRoaXMuX2FkZE1lc3NhZ2VGb3JBY3Rpb25QYXJhbWV0ZXIoXG5cdFx0XHRcdGVtcHR5UmVxdWlyZWRGaWVsZHMubWFwKChhY3Rpb25QYXJhbWV0ZXJJbmZvKSA9PiAoe1xuXHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm86IGFjdGlvblBhcmFtZXRlckluZm8sXG5cdFx0XHRcdFx0bWVzc2FnZTogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19PUEVSQVRJT05TX0FDVElPTl9QQVJBTUVURVJfRElBTE9HX01JU1NJTkdfTUFOREFUT1JZX01TR1wiLCBbXG5cdFx0XHRcdFx0XHQoYWN0aW9uUGFyYW1ldGVySW5mby5maWVsZC5nZXRQYXJlbnQoKT8uZ2V0QWdncmVnYXRpb24oXCJsYWJlbFwiKSBhcyBMYWJlbCkuZ2V0VGV4dCgpXG5cdFx0XHRcdFx0XSlcblx0XHRcdFx0fSkpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHQvKiBDaGVjayB2YWx1ZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycyAqL1xuXHRcdGNvbnN0IGZpcnN0SW52YWxpZFBhcmFtZXRlciA9IGFjdGlvblBhcmFtZXRlckluZm9zLmZpbmQoXG5cdFx0XHQocGFyYW1ldGVySW5mbykgPT5cblx0XHRcdFx0cGFyYW1ldGVySW5mby5maWVsZC5nZXRWaXNpYmxlKCkgJiZcblx0XHRcdFx0KHBhcmFtZXRlckluZm8uaGFzRXJyb3IgfHwgcGFyYW1ldGVySW5mby5maWVsZC5nZXRWYWx1ZVN0YXRlKCkgPT09IFwiRXJyb3JcIiB8fCBlbXB0eVJlcXVpcmVkRmllbGRzLmluY2x1ZGVzKHBhcmFtZXRlckluZm8pKVxuXHRcdCk7XG5cdFx0aWYgKGZpcnN0SW52YWxpZFBhcmFtZXRlcikge1xuXHRcdFx0Zmlyc3RJbnZhbGlkUGFyYW1ldGVyLmZpZWxkLnNldFZpc2libGUodHJ1ZSk7XG5cdFx0XHRmaXJzdEludmFsaWRQYXJhbWV0ZXIuZmllbGQuZm9jdXMoKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBhY3Rpb24gZW5hYmxlbWVudC5cblx0ICogQHBhcmFtIG9JbnRlcm5hbE1vZGVsQ29udGV4dCBPYmplY3QgY29udGFpbmluZyB0aGUgY29udGV4dCBtb2RlbFxuXHQgKiBAcGFyYW0gb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCBNYXAgY29udGFpbmluZyB0aGUgb3BlcmF0aW9uIGF2YWlsYWJpbGl0eSBvZiBhY3Rpb25zXG5cdCAqIEBwYXJhbSBhU2VsZWN0ZWRDb250ZXh0cyBBcnJheSBjb250YWluaW5nIHNlbGVjdGVkIGNvbnRleHRzIG9mIHRoZSBjaGFydFxuXHQgKiBAcGFyYW0gc0NvbnRyb2wgQ29udHJvbCBuYW1lXG5cdCAqIEBwYXJhbSBmb3JDb250ZXh0TWVudSBJbmRpY2F0ZXMgaWYgdGhlIGFjdGlvbiBhcHBlYXJzIGluIHRoZSBjb250ZXh0IG1lbnUuIElmIGZhbHNlLCB0aGUgYWN0aW9uIGFwcGVhcnMgaW4gdGhlIHRhYmxlIHRvb2xiYXJcblx0ICogQHJldHVybnMgVGhlIGFjdGlvbiBlbmFibGVtZW50IHByb21pc2VzXG5cdCAqL1xuXHRzZXRBY3Rpb25FbmFibGVtZW50OiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuXHRcdGFTZWxlY3RlZENvbnRleHRzOiBDb250ZXh0W10sXG5cdFx0c0NvbnRyb2w6IHN0cmluZyxcblx0XHRmb3JDb250ZXh0TWVudSA9IGZhbHNlXG5cdCk6IFByb21pc2U8dm9pZFtdPiB7XG5cdFx0Y29uc3QgYVByb21pc2VzID0gW107XG5cdFx0Zm9yIChjb25zdCBzQWN0aW9uIGluIG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXApIHtcblx0XHRcdGxldCBhUmVxdWVzdFByb21pc2VzOiBQcm9taXNlPF9SZXF1ZXN0ZWRQcm9wZXJ0eT5bXSA9IFtdO1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KHNBY3Rpb24sIGZhbHNlKTtcblx0XHRcdGlmIChzQ29udHJvbCA9PT0gXCJ0YWJsZVwiKSB7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9hQXBwbGljYWJsZWAsIFtdKTtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259L2FOb3RBcHBsaWNhYmxlYCwgW10pO1xuXHRcdFx0XHRpZiAoZm9yQ29udGV4dE1lbnUpIHtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYkVuYWJsZWRGb3JDb250ZXh0TWVudWAsIGZhbHNlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYkVuYWJsZWRgLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnN0IHNQcm9wZXJ0eSA9IG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXBbc0FjdGlvbl07XG5cdFx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYVNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdFx0Y29uc3Qgb1NlbGVjdGVkQ29udGV4dCA9IGVsZW1lbnQ7XG5cdFx0XHRcdGlmIChvU2VsZWN0ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdFx0XHRpZiAoc0NvbnRyb2wgPT09IFwiY2hhcnRcIikge1xuXHRcdFx0XHRcdFx0aWYgKChzUHJvcGVydHkgPT09IG51bGwgJiYgISFvQ29udGV4dERhdGFbYCMke3NBY3Rpb259YF0pIHx8IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRcdFx0Ly9sb29rIGZvciBhY3Rpb24gYWR2ZXJ0aXNlbWVudCBpZiBwcmVzZW50IGFuZCBpdHMgdmFsdWUgaXMgbm90IG51bGxcblx0XHRcdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KHNBY3Rpb24sIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNDb250cm9sID09PSBcInRhYmxlXCIpIHtcblx0XHRcdFx0XHRcdGFSZXF1ZXN0UHJvbWlzZXMgPSB0aGlzLl9zZXRBY3Rpb25FbmFibGVtZW50Rm9yVGFibGUoXG5cdFx0XHRcdFx0XHRcdG9TZWxlY3RlZENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0c0FjdGlvbixcblx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRhUmVxdWVzdFByb21pc2VzLFxuXHRcdFx0XHRcdFx0XHRmb3JDb250ZXh0TWVudVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChzQ29udHJvbCA9PT0gXCJ0YWJsZVwiKSB7XG5cdFx0XHRcdGlmICghYVNlbGVjdGVkQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259YCwge1xuXHRcdFx0XHRcdFx0YkVuYWJsZWQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0YUFwcGxpY2FibGU6IFtdLFxuXHRcdFx0XHRcdFx0YU5vdEFwcGxpY2FibGU6IFtdXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YVByb21pc2VzLnB1c2goQ29tbW9uVXRpbHMuc2V0Q29udGV4dHNCYXNlZE9uT3BlcmF0aW9uQXZhaWxhYmxlKG9JbnRlcm5hbE1vZGVsQ29udGV4dCwgW10sIGZvckNvbnRleHRNZW51KSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYVNlbGVjdGVkQ29udGV4dHMubGVuZ3RoICYmIHR5cGVvZiBzUHJvcGVydHkgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHQvLyBXaGVuIGFsbCBwcm9wZXJ0eSB2YWx1ZXMgaGF2ZSBiZWVuIHJldHJpZXZlZCwgc2V0XG5cdFx0XHRcdFx0Ly8gVGhlIGFwcGxpY2FibGUgYW5kIG5vdC1hcHBsaWNhYmxlIHNlbGVjdGVkIGNvbnRleHRzIGZvciBlYWNoIGFjdGlvbiBhbmRcblx0XHRcdFx0XHQvLyBUaGUgZW5hYmxlZCBwcm9wZXJ0eSBvZiB0aGUgZHluYW1pYyBhY3Rpb24gaW4gaW50ZXJuYWwgbW9kZWwgY29udGV4dC5cblx0XHRcdFx0XHRhUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRcdENvbW1vblV0aWxzLnNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZShvSW50ZXJuYWxNb2RlbENvbnRleHQsIGFSZXF1ZXN0UHJvbWlzZXMsIGZvckNvbnRleHRNZW51KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKGFQcm9taXNlcyk7XG5cdH0sXG5cdHNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoOiBmdW5jdGlvbiAoXG5cdFx0b1ZpZXc6IFZpZXcsXG5cdFx0b0xpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHRcblx0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0RGF0YSA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uZ2V0T2JqZWN0KCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0Y29uc3Qgb0NvbnRyb2xzID0gKG9JbnRlcm5hbE1vZGVsQ29udGV4dERhdGE/LmNvbnRyb2xzIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB7IGNvbnRyb2xJZD86IHN0cmluZyB9Pjtcblx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gb0NvbnRyb2xzKSB7XG5cdFx0XHRpZiAob0NvbnRyb2xzW3NLZXldICYmIG9Db250cm9sc1tzS2V5XS5jb250cm9sSWQpIHtcblx0XHRcdFx0Y29uc3Qgb1RhYmxlID0gb1ZpZXcuYnlJZChzS2V5KTtcblx0XHRcdFx0aWYgKG9UYWJsZSAmJiBvVGFibGUuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHRjb25zdCBvUm93QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0XHRcdFx0aWYgKG9Sb3dCaW5kaW5nID09IG9MaXN0QmluZGluZykge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSBvVGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRKU09OLnBhcnNlKHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbi5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdFx0XHRvVGFibGUuZ2V0U2VsZWN0ZWRDb250ZXh0cygpIGFzIENvbnRleHRbXSxcblx0XHRcdFx0XHRcdFx0XCJ0YWJsZVwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHR1cGRhdGVFZGl0QnV0dG9uVmlzaWJpbGl0eUFuZEVuYWJsZW1lbnQob1ZpZXc6IEZFVmlldyk6IHZvaWQge1xuXHRcdGNvbnN0IGlWaWV3TGV2ZWwgPSAob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncyk/LnZpZXdMZXZlbCxcblx0XHRcdGlzRWRpdGFibGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKG9WaWV3KTtcblx0XHRpZiAoKGlWaWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDEgJiYgaXNFZGl0YWJsZSAhPT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvVmlldyk7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IE1vZGVsSGVscGVyLmdldFJvb3RFbnRpdHlTZXRQYXRoKHNNZXRhUGF0aCk7XG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG9Db250ZXh0XG5cdFx0XHRcdD8uZ2V0TW9kZWwoKVxuXHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0Py5nZXRDb250ZXh0KG9Db250ZXh0Py5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3QgY29udmVydGVyQ29udGV4dCA9IENvbnZlcnRlckNvbnRleHQ/LmNyZWF0ZUNvbnZlcnRlckNvbnRleHRGb3JNYWNybyhcblx0XHRcdFx0c0VudGl0eVNldCxcblx0XHRcdFx0bWV0YUNvbnRleHQsXG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0RGlhZ25vc3RpY3MoKSxcblx0XHRcdFx0bWVyZ2Vcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRcdFx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRcdFx0bGV0IHVwZGF0ZUhpZGRlbjtcblx0XHRcdC8vRmluZCB0aGUgVXBkYXRlIEhpZGRlbiBvZiB0aGUgcm9vdCBlbnRpdHkgc2V0IGFuZCBiaW5kIHRoZSBwcm9wZXJ0eSB0byBBbnlFbGVtZW50LCBhbnkgY2hhbmdlcyBpbiB0aGUgcGF0aCBvZiB0aGUgcm9vdCBVcGRhdGVIaWRkZW4gd2lsbCBiZSB1cGRhdGVkIHZpYSB0aGUgcHJvcGVydHksIGludGVybmFsIG1vZGVsIGNvbnRleHQgaXMgdXBkYXRlZCBiYXNlZCBvbiB0aGUgcHJvcGVydHlcblx0XHRcdGNvbnN0IGJVcGRhdGVIaWRkZW4gPSBpc0VudGl0eVNldChlbnRpdHlTZXQpICYmIGVudGl0eVNldC5hbm5vdGF0aW9ucy5VST8uVXBkYXRlSGlkZGVuPy52YWx1ZU9mKCk7XG5cdFx0XHRpZiAoYlVwZGF0ZUhpZGRlbiAhPT0gdHJ1ZSkge1xuXHRcdFx0XHR1cGRhdGVIaWRkZW4gPSBNb2RlbEhlbHBlci5pc1VwZGF0ZUhpZGRlbihlbnRpdHlTZXQsIGVudGl0eVR5cGUpO1xuXHRcdFx0fVxuXHRcdFx0Ly9GaW5kIHRoZSBvcGVyYXRpb24gYXZhaWxhYmxlIHByb3BlcnR5IG9mIHRoZSByb290IGVkaXQgY29uZmlndXJhdGlvbiBhbmQgZmV0Y2ggdGhlIHByb3BlcnR5IHVzaW5nIEFueUVsZW1lbnRcblx0XHRcdGNvbnN0IHNFZGl0RW5hYmxlQmluZGluZyA9IGdldEVkaXRCdXR0b25FbmFibGVkKGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0Y29uc3QgZHJhZnRSb290UGF0aCA9IE1vZGVsSGVscGVyLmdldERyYWZ0Um9vdFBhdGgob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc1N0aWNreVJvb3RQYXRoID0gTW9kZWxIZWxwZXIuZ2V0U3RpY2t5Um9vdFBhdGgob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc1BhdGggPSBkcmFmdFJvb3RQYXRoIHx8IHNTdGlja3lSb290UGF0aDtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRpZiAoc1BhdGgpIHtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RDb250ZXh0ID0gb1ZpZXcuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChzUGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdGlmICh1cGRhdGVIaWRkZW4gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGNvbnN0IHNIaWRkZW5FeHByZXNzaW9uID0gY29tcGlsZUV4cHJlc3Npb24oZXF1YWwoZ2V0SGlkZGVuRXhwcmVzc2lvbihjb252ZXJ0ZXJDb250ZXh0LCB1cGRhdGVIaWRkZW4pLCBmYWxzZSkpO1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRWRpdE1vZGVsQ29udGV4dChzSGlkZGVuRXhwcmVzc2lvbiwgb1ZpZXcsIG9Sb290Q29udGV4dCwgXCJyb290RWRpdFZpc2libGVcIiwgb0ludGVybmFsTW9kZWxDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoc0VkaXRFbmFibGVCaW5kaW5nKSB7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGVFZGl0TW9kZWxDb250ZXh0KHNFZGl0RW5hYmxlQmluZGluZywgb1ZpZXcsIG9Sb290Q29udGV4dCwgXCJyb290RWRpdEVuYWJsZWRcIiwgb0ludGVybmFsTW9kZWxDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHR1cGRhdGVFZGl0TW9kZWxDb250ZXh0OiBmdW5jdGlvbiAoXG5cdFx0c0JpbmRpbmdFeHByZXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0b1ZpZXc6IFZpZXcsXG5cdFx0b1Jvb3RDb250ZXh0OiBDb250ZXh0LFxuXHRcdHNQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHRcblx0KTogdm9pZCB7XG5cdFx0aWYgKHNCaW5kaW5nRXhwcmVzc2lvbikge1xuXHRcdFx0Y29uc3Qgb0hpZGRlbkVsZW1lbnQgPSBuZXcgQW55RWxlbWVudCh7IGFueVRleHQ6IHNCaW5kaW5nRXhwcmVzc2lvbiB9KTtcblx0XHRcdG9IaWRkZW5FbGVtZW50LnNldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXHRcdFx0b1ZpZXcuYWRkRGVwZW5kZW50KG9IaWRkZW5FbGVtZW50KTtcblx0XHRcdG9IaWRkZW5FbGVtZW50LmdldEJpbmRpbmcoXCJhbnlUZXh0XCIpO1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvSGlkZGVuRWxlbWVudFxuXHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHQ/LmJpbmRDb250ZXh0KG9Sb290Q29udGV4dC5nZXRQYXRoKCksIG9Sb290Q29udGV4dCwgeyAkJGdyb3VwSWQ6IFwiJGF1dG8uSGVyb2VzXCIgfSlcblx0XHRcdFx0Py5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdG9IaWRkZW5FbGVtZW50LnNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdG9IaWRkZW5FbGVtZW50Py5nZXRCaW5kaW5nKFwiYW55VGV4dFwiKT8uYXR0YWNoQ2hhbmdlKChvRXZlbnQ6IEV2ZW50PHt9LCBQcm9wZXJ0eUJpbmRpbmc+KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9OZXdWYWx1ZSA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRFeHRlcm5hbFZhbHVlKCk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShzUHJvcGVydHksIG9OZXdWYWx1ZSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0X3NldEFjdGlvbkVuYWJsZW1lbnRGb3JUYWJsZTogZnVuY3Rpb24gKFxuXHRcdG9TZWxlY3RlZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQsXG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRzQWN0aW9uOiBzdHJpbmcsXG5cdFx0c1Byb3BlcnR5OiBzdHJpbmcsXG5cdFx0YVJlcXVlc3RQcm9taXNlczogUHJvbWlzZTxfUmVxdWVzdGVkUHJvcGVydHk+W10sXG5cdFx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuXHQpOiBQcm9taXNlPF9SZXF1ZXN0ZWRQcm9wZXJ0eT5bXSB7XG5cdFx0Ly8gUmV0cmlldmUgcHJldmlvdXNseSBjaGVja2VkIGNvbnRleHRzIGluIGNhc2Ugb2YgIWZvckNvbnRleHRNZW51XG5cdFx0Y29uc3Qgc0VuYWJsZW1lbnRGaWVsZE5hbWUgPSBmb3JDb250ZXh0TWVudSA/IFwiYkVuYWJsZWRGb3JDb250ZXh0TWVudVwiIDogXCJiRW5hYmxlZFwiLFxuXHRcdFx0YUFwcGxpY2FibGU6IFtDb250ZXh0IHwgdW5kZWZpbmVkXSA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9hQXBwbGljYWJsZWApIHx8IFtdLFxuXHRcdFx0YU5vdEFwcGxpY2FibGU6IFtDb250ZXh0IHwgdW5kZWZpbmVkXSA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9hTm90QXBwbGljYWJsZWApIHx8IFtdO1xuXHRcdGxldCBiQWN0aW9uRW5hYmxlZDogYm9vbGVhbiA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS8ke3NFbmFibGVtZW50RmllbGROYW1lfWApIHx8IGZhbHNlO1xuXG5cdFx0aWYgKCFmb3JDb250ZXh0TWVudSkge1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259YCwge1xuXHRcdFx0XHRiRW5hYmxlZDogZmFsc2UsXG5cdFx0XHRcdGFBcHBsaWNhYmxlOiBbXSxcblx0XHRcdFx0YU5vdEFwcGxpY2FibGU6IFtdXG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259YCwge1xuXHRcdFx0XHQvLyBEbyBub3QgY2hhbmdlIGVuYWJsZWQsIGFBcHBsaWNhYmxlIGFuZCBhTm90QXBwbGljYWJsZSBwcm9wZXJ0eSBpbiBjYXNlIG9mIGNvbnRleHQgbWVudSBjYWxjdWxhdGlvblxuXHRcdFx0XHQvLyBpbiBjYXNlIG9mIGNvbnRleHQgbWVudSwgb25seSB0aGUgY2xpY2tlZCBjb250ZXh0IGdvZXMgaW50byB0aGUgcHJvY2Vzc2luZyAtIG90aGVyIHNlbGVjdGVkIGNvbnRleHRzIG11c3QgYmUga2VwdCBpbiB0aGUgbW9kZWxcblx0XHRcdFx0YkVuYWJsZWQ6IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9iRW5hYmxlZGApLFxuXHRcdFx0XHRhQXBwbGljYWJsZTogb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259L2FBcHBsaWNhYmxlYCksXG5cdFx0XHRcdGFOb3RBcHBsaWNhYmxlOiBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYU5vdEFwcGxpY2FibGVgKSxcblx0XHRcdFx0YkVuYWJsZWRGb3JDb250ZXh0TWVudTogZmFsc2UsXG5cdFx0XHRcdGFBcHBsaWNhYmxlRm9yQ29udGV4dE1lbnU6IFtdLFxuXHRcdFx0XHRhTm90QXBwbGljYWJsZUZvckNvbnRleHRNZW51OiBbXVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIE5vdGUgdGhhdCBub24gZHluYW1pYyBhY3Rpb25zIGFyZSBub3QgcHJvY2Vzc2VkIGhlcmUuIFRoZXkgYXJlIGVuYWJsZWQgYmVjYXVzZVxuXHRcdC8vIG9uZSBvciBtb3JlIGFyZSBzZWxlY3RlZCBhbmQgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBjb25kaXRpb24gaW4gdGhlIHRlbXBsYXRpbmdcblx0XHQvLyBpcyB0aGVuIHVuZGVmaW5lZCBhbmQgdGh1cyB0aGUgYnV0dG9uIHRha2VzIHRoZSBkZWZhdWx0IGVuYWJsaW5nLCB3aGljaCBpcyB0cnVlIVxuXHRcdGNvbnN0IHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGggPSBgJHtvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpfS9keW5hbWljQWN0aW9ucy8ke3NBY3Rpb259LyR7c0VuYWJsZW1lbnRGaWVsZE5hbWV9YDtcblxuXHRcdGlmICh0eXBlb2Ygc1Byb3BlcnR5ID09PSBcIm9iamVjdFwiICYmIHNQcm9wZXJ0eSAhPT0gbnVsbCAmJiBzUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKG9TZWxlY3RlZENvbnRleHQpIHtcblx0XHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoKSBhcyBSZWNvcmQ8c3RyaW5nLCBQcmltaXRpdmVUeXBlPjtcblx0XHRcdFx0Y29uc3Qgb1RyYW5zZm9ybWVkQmluZGluZyA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KFxuXHRcdFx0XHRcdHNQcm9wZXJ0eSxcblx0XHRcdFx0XHRcIlBhdGhJbk1vZGVsXCIsXG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3AtZnVuY1xuXHRcdFx0XHRcdGZ1bmN0aW9uIChvQmluZGluZ0V4cHJlc3Npb246IFBhdGhJbk1vZGVsRXhwcmVzc2lvbjxQcmltaXRpdmVUeXBlPikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0RGF0YSA/IGNvbnN0YW50KG9Db250ZXh0RGF0YVtvQmluZGluZ0V4cHJlc3Npb24ucGF0aF0pIDogY29uc3RhbnQoZmFsc2UpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBzUmVzdWx0ID0gY29tcGlsZUV4cHJlc3Npb24ob1RyYW5zZm9ybWVkQmluZGluZyk7XG5cdFx0XHRcdGJBY3Rpb25FbmFibGVkID0gYkFjdGlvbkVuYWJsZWQgfHwgc1Jlc3VsdCA9PT0gXCJ0cnVlXCI7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgsIGJBY3Rpb25FbmFibGVkKTtcblx0XHRcdFx0KHNSZXN1bHQgPT09IFwidHJ1ZVwiID8gYUFwcGxpY2FibGUgOiBhTm90QXBwbGljYWJsZSkucHVzaChvU2VsZWN0ZWRDb250ZXh0KTtcblx0XHRcdH1cblx0XHRcdENvbW1vblV0aWxzLnNldER5bmFtaWNBY3Rpb25Db250ZXh0cyhvSW50ZXJuYWxNb2RlbENvbnRleHQsIHNBY3Rpb24sIGFBcHBsaWNhYmxlLCBhTm90QXBwbGljYWJsZSwgZm9yQ29udGV4dE1lbnUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvU2VsZWN0ZWRDb250ZXh0Py5nZXRPYmplY3QoKSBhcyBSZWNvcmQ8c3RyaW5nLCBQcmltaXRpdmVUeXBlPjtcblx0XHRcdGlmIChzUHJvcGVydHkgPT09IG51bGwgJiYgISFvQ29udGV4dERhdGFbYCMke3NBY3Rpb259YF0pIHtcblx0XHRcdFx0Ly9sb29rIGZvciBhY3Rpb24gYWR2ZXJ0aXNlbWVudCBpZiBwcmVzZW50IGFuZCBpdHMgdmFsdWUgaXMgbm90IG51bGxcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LmdldE1vZGVsKCkuc2V0UHJvcGVydHkoc0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCwgdHJ1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKG9TZWxlY3RlZENvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHQvLyBDb2xsZWN0IHByb21pc2VzIHRvIHJldHJpZXZlIHNpbmdsZXRvbiBvciBub3JtYWwgcHJvcGVydHkgdmFsdWUgYXN5bmNocm9ub3VzbHlcblx0XHRcdFx0YVJlcXVlc3RQcm9taXNlcy5wdXNoKENvbW1vblV0aWxzLnJlcXVlc3RQcm9wZXJ0eShvU2VsZWN0ZWRDb250ZXh0LCBzQWN0aW9uLCBzUHJvcGVydHksIHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGFSZXF1ZXN0UHJvbWlzZXM7XG5cdH1cbn07XG5leHBvcnQgZGVmYXVsdCBBY3Rpb25SdW50aW1lO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztFQXlDQSxNQUFNQSxhQUFhLEdBQUc7SUFDckI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDQyxvQkFBb0IsRUFBRSxTQUFBQSxDQUFVQyxhQUFrQyxFQUFXO01BQzVFLE1BQU1DLE9BQU8sR0FBR0QsYUFBYSxDQUFDRSxLQUFLLENBQUNDLEtBQUssQ0FBQyxDQUFDO01BQzNDLE1BQU1DLFdBQVcsR0FBR0MsU0FBUyxDQUFDQyxlQUFlLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUMsQ0FBQztNQUN6RCxNQUFNQyxnQkFBZ0IsR0FBR0osV0FBVyxDQUFDSyxNQUFNLENBQUVDLEdBQVksSUFDeERBLEdBQUcsQ0FBQ0MsYUFBYSxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFFQyxTQUFpQixJQUFLQSxTQUFTLENBQUNDLFFBQVEsQ0FBQ2IsT0FBTyxDQUFDLENBQzVFLENBQUM7TUFDRCxJQUFJTyxnQkFBZ0IsQ0FBQ08sTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNoQyxPQUFPLEtBQUs7TUFDYixDQUFDLE1BQU0sSUFBSWYsYUFBYSxDQUFDZ0IsWUFBWSxFQUFFO1FBQ3RDLE9BQU9oQixhQUFhLENBQUNpQixLQUFLLEtBQUtDLFNBQVMsSUFBS0MsS0FBSyxDQUFDQyxPQUFPLENBQUNwQixhQUFhLENBQUNpQixLQUFLLENBQUMsSUFBSWpCLGFBQWEsQ0FBQ2lCLEtBQUssQ0FBQ0YsTUFBTSxLQUFLLENBQUU7TUFDckgsQ0FBQyxNQUFNO1FBQ04sTUFBTU0sVUFBVSxHQUFJckIsYUFBYSxDQUFDRSxLQUFLLENBQVdvQixRQUFRLENBQUMsQ0FBQztRQUM1RCxNQUFNQyxZQUFZLEdBQUdKLEtBQUssQ0FBQ0MsT0FBTyxDQUFFcEIsYUFBYSxDQUFDRSxLQUFLLENBQVdvQixRQUFRLENB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
@@ -40,25 +40,71 @@ export type ActionParameterInfo = {
40
40
  };
41
41
 
42
42
  const ActionRuntime = {
43
+ /**
44
+ * Checks if a required parameter field is empty.
45
+ * @param parameterInfo Information identifying an action parameter
46
+ * @returns True if the field is empty, false otherwise
47
+ */
48
+ isRequiredFieldEmpty: function (parameterInfo: ActionParameterInfo): boolean {
49
+ const fieldId = parameterInfo.field.getId();
50
+ const allMessages = Messaging.getMessageModel().getData();
51
+ const relevantMessages = allMessages.filter((msg: Message) =>
52
+ msg.getControlIds().some((controlId: string) => controlId.includes(fieldId))
53
+ );
54
+ if (relevantMessages.length > 0) {
55
+ return false;
56
+ } else if (parameterInfo.isMultiValue) {
57
+ return parameterInfo.value === undefined || (Array.isArray(parameterInfo.value) && parameterInfo.value.length === 0);
58
+ } else {
59
+ const fieldValue = (parameterInfo.field as Field).getValue();
60
+ const isFieldArray = Array.isArray((parameterInfo.field as Field).getValue());
61
+ if (isFieldArray) {
62
+ // only first value check is enough as the field value comes on [0] rest of the array includes currency and currency code
63
+ // both of which can or cannot be null, so we shall check only the field value
64
+ return fieldValue[0] === null || fieldValue[0] === "";
65
+ }
66
+ return fieldValue === undefined || fieldValue === null || fieldValue === "";
67
+ }
68
+ },
43
69
  /**
44
70
  * Adds error messages for an action parameter field to the message manager.
45
71
  * @param messageParameters Information identifying an action parameter and messages referring to this parameter
46
72
  */
47
73
  _addMessageForActionParameter: function (messageParameters: { actionParameterInfo: ActionParameterInfo; message: string }[]): void {
48
- Messaging.addMessages(
49
- messageParameters.map((messageParameter) => {
50
- const binding = messageParameter.actionParameterInfo.field.getBinding(
51
- messageParameter.actionParameterInfo.isMultiValue ? "items" : "value"
52
- );
53
- return new Message({
54
- message: messageParameter.message,
55
- type: MessageType.Error,
56
- processor: binding?.getModel() ?? undefined, // getModel(): null | Model ~~> processor?: MessageProcessor
57
- persistent: true,
58
- target: binding?.getResolvedPath()
59
- });
60
- })
61
- );
74
+ const messages = messageParameters.map((messageParameter) => {
75
+ const binding = messageParameter.actionParameterInfo.field.getBinding(
76
+ messageParameter.actionParameterInfo.isMultiValue ? "items" : "value"
77
+ );
78
+
79
+ const message = new Message({
80
+ message: messageParameter.message,
81
+ type: MessageType.Error,
82
+ processor: binding?.getModel() ?? undefined, // getModel(): null | Model ~~> processor?: MessageProcessor
83
+ persistent: true,
84
+ target: binding?.getResolvedPath()
85
+ });
86
+
87
+ // Attach change handler to validate value and remove message if field is not empty
88
+ if (binding) {
89
+ const changeHandler = (): void => {
90
+ // Check if the field is no longer empty using the extracted validation function
91
+ if (!ActionRuntime.isRequiredFieldEmpty(messageParameter.actionParameterInfo)) {
92
+ // Remove the message
93
+ Messaging.removeMessages([message]);
94
+ // Detach the change handler
95
+ binding.detachChange(changeHandler);
96
+ }
97
+ };
98
+ // There might be sceanrios like value help out parameters where the field is not explicitly changed instead property value changes due to setProperty.
99
+ // In such cases, field change is not called and is not a reliable event to validate the field value again.
100
+ // So we use value/items binding change to re-validate the property value to remove the messages.
101
+ binding.attachChange(changeHandler);
102
+ }
103
+
104
+ return message;
105
+ });
106
+
107
+ Messaging.addMessages(messages);
62
108
  },
63
109
 
64
110
  /**
@@ -81,27 +127,7 @@ const ActionRuntime = {
81
127
  (parameterInfo.field as Field | MultiValueField).getRequired()
82
128
  );
83
129
 
84
- const allMessages = Messaging.getMessageModel().getData();
85
- const emptyRequiredFields = requiredParameterInfos.filter((requiredParameterInfo) => {
86
- const fieldId = requiredParameterInfo.field.getId();
87
- const relevantMessages = allMessages.filter((msg: Message) =>
88
- msg.getControlIds().some((controlId: string) => controlId.includes(fieldId))
89
- );
90
- if (relevantMessages.length > 0) {
91
- return false;
92
- } else if (requiredParameterInfo.isMultiValue) {
93
- return requiredParameterInfo.value === undefined || !requiredParameterInfo.value.length;
94
- } else {
95
- const fieldValue = (requiredParameterInfo.field as Field).getValue();
96
- const isFieldArray = Array.isArray((requiredParameterInfo.field as Field).getValue());
97
- if (isFieldArray) {
98
- // only first value check is enough as the field value comes on [0] rest of the array includes currency and currency code
99
- // both of which can or cannot be null, so we shall check only the field value
100
- return fieldValue[0] === null || fieldValue[0] === "";
101
- }
102
- return fieldValue === undefined || fieldValue === null || fieldValue === "";
103
- }
104
- });
130
+ const emptyRequiredFields = requiredParameterInfos.filter(this.isRequiredFieldEmpty);
105
131
  /* Message for missing mandatory value of the action parameter */
106
132
  if (emptyRequiredFields.length) {
107
133
  this._addMessageForActionParameter(