@sapui5/sap.fe.templates 1.106.0 → 1.108.0

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 (55) hide show
  1. package/package.json +3 -2
  2. package/src/sap/fe/templates/.library +1 -1
  3. package/src/sap/fe/templates/ListComponent.js +5 -1
  4. package/src/sap/fe/templates/ListComponent.ts +4 -0
  5. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +43 -3
  6. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +38 -2
  7. package/src/sap/fe/templates/ListReport/ListReport.view.xml +12 -1
  8. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +80 -22
  9. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +63 -14
  10. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +30 -21
  11. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.ts +21 -10
  12. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +4 -7
  13. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +2 -6
  14. package/src/sap/fe/templates/ListReport/overrides/Share.js +9 -14
  15. package/src/sap/fe/templates/ListReport/overrides/Share.ts +8 -15
  16. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +15 -11
  17. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +27 -9
  18. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +3 -3
  19. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +2 -2
  20. package/src/sap/fe/templates/ListReport/view/fragments/Table.fragment.xml +0 -1
  21. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +132 -3
  22. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +88 -1
  23. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +35 -47
  24. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +286 -45
  25. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +209 -32
  26. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +49 -7
  27. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +60 -5
  28. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +1 -1
  29. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.ts +1 -2
  30. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +1 -1
  31. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.ts +1 -2
  32. package/src/sap/fe/templates/ObjectPage/flexibility/ScrollableHeaderContainer.flexibility.js +33 -0
  33. package/src/sap/fe/templates/ObjectPage/flexibility/ScrollableHeaderContainer.flexibility.ts +23 -0
  34. package/src/sap/fe/templates/ObjectPage/manifest.json +8 -0
  35. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +2 -2
  36. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +2 -1
  37. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +10 -3
  38. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +8 -1
  39. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +7 -1
  40. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +5 -0
  41. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +8 -2
  42. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderContent.fragment.xml +38 -23
  43. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingContent.fragment.xml +30 -0
  44. package/src/sap/fe/templates/ObjectPage/view/fragments/MacroChart.fragment.xml +1 -0
  45. package/src/sap/fe/templates/ObjectPage/view/fragments/Table.fragment.xml +1 -0
  46. package/src/sap/fe/templates/library.js +1 -1
  47. package/src/sap/fe/templates/messagebundle_lt.properties +1 -1
  48. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +0 -899
  49. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +0 -830
  50. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +0 -207
  51. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.ts +0 -177
  52. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +0 -575
  53. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +0 -492
  54. package/src/sap/fe/templates/RootContainer/view/Fcl.view.xml +0 -16
  55. package/src/sap/fe/templates/RootContainer/view/NavContainer.view.xml +0 -9
@@ -70,10 +70,11 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
70
70
  var titleForActiveHeaderNoHeaderInfo = !oEmptyHeaderInfoTitle ? CommonUtils.getTranslatedText("T_ANNOTATION_HELPER_DEFAULT_OBJECT_PAGE_HEADER_TITLE_NO_HEADER_INFO", oViewData.resourceBundle) : "";
71
71
  var titleValueExpression,
72
72
  connectedFieldsPath,
73
- titleIsEmpty = constant(true);
73
+ titleIsEmpty = constant(true),
74
+ titleBooleanExpression;
74
75
 
75
76
  if ((oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : (_oHeaderInfo$Title2 = oHeaderInfo.Title) === null || _oHeaderInfo$Title2 === void 0 ? void 0 : _oHeaderInfo$Title2.$Type) === "com.sap.vocabularies.UI.v1.DataField") {
76
- var _oHeaderInfo$Title3, _oHeaderInfo$Title4, _oHeaderInfo$Title4$V, _oHeaderInfo$Title4$V2, _oHeaderInfo$Title4$V3, _oHeaderInfo$Title4$V4, _oHeaderInfo$Title4$V5, _oHeaderInfo$Title4$V6, _oHeaderInfo$Title4$V7;
77
+ var _oHeaderInfo$Title3, _oHeaderInfo$Title4, _oHeaderInfo$Title4$V, _oHeaderInfo$Title4$V2, _oHeaderInfo$Title4$V3, _oHeaderInfo$Title4$V4, _oHeaderInfo$Title4$V5, _oHeaderInfo$Title4$V6, _oHeaderInfo$Title4$V7, _titleValueExpression, _titleValueExpression2;
77
78
 
78
79
  titleValueExpression = getExpressionFromAnnotation(oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : (_oHeaderInfo$Title3 = oHeaderInfo.Title) === null || _oHeaderInfo$Title3 === void 0 ? void 0 : _oHeaderInfo$Title3.Value);
79
80
 
@@ -83,15 +84,18 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
83
84
  }
84
85
 
85
86
  titleValueExpression = formatValueRecursively(titleValueExpression, fullContextPath);
86
- titleIsEmpty = isEmpty(titleValueExpression);
87
+ titleIsEmpty = ((_titleValueExpression = titleValueExpression) === null || _titleValueExpression === void 0 ? void 0 : _titleValueExpression._type) === "Constant" ? constant(!((_titleValueExpression2 = titleValueExpression) !== null && _titleValueExpression2 !== void 0 && _titleValueExpression2.value)) : isEmpty(titleValueExpression);
87
88
  } else if ((oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : (_oHeaderInfo$Title5 = oHeaderInfo.Title) === null || _oHeaderInfo$Title5 === void 0 ? void 0 : _oHeaderInfo$Title5.$Type) === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && (oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : (_oHeaderInfo$Title6 = oHeaderInfo.Title) === null || _oHeaderInfo$Title6 === void 0 ? void 0 : _oHeaderInfo$Title6.Target.$target.$Type) === "com.sap.vocabularies.UI.v1.ConnectedFieldsType") {
89
+ var _titleValueExpression3, _titleValueExpression4;
90
+
88
91
  connectedFieldsPath = enhanceDataModelPath(fullContextPath, "$Type/@UI.HeaderInfo/Title/Target/$AnnotationPath");
89
92
  titleValueExpression = getLabelForConnectedFields(connectedFieldsPath, false);
90
- titleIsEmpty = titleValueExpression ? isEmpty(titleValueExpression) : constant(true);
93
+ titleBooleanExpression = ((_titleValueExpression3 = titleValueExpression) === null || _titleValueExpression3 === void 0 ? void 0 : _titleValueExpression3._type) === "Constant" ? constant(!((_titleValueExpression4 = titleValueExpression) !== null && _titleValueExpression4 !== void 0 && _titleValueExpression4.value)) : isEmpty(titleValueExpression);
94
+ titleIsEmpty = titleValueExpression ? titleBooleanExpression : constant(true);
91
95
  } // If there is a TypeName defined, show the default title 'New + TypeName', otherwise show the custom title or the default 'New object'
92
96
 
93
97
 
94
- var createModeTitle = oHeaderInfo !== null && oHeaderInfo !== void 0 && oHeaderInfo.TypeName ? concat(titleWithHeaderInfo, ": ", getExpressionFromAnnotation(oHeaderInfo.TypeName.toString())) : titleNoHeaderInfo;
98
+ var createModeTitle = oHeaderInfo !== null && oHeaderInfo !== void 0 && oHeaderInfo.TypeName ? concat(titleWithHeaderInfo, ": ", resolveBindingString(oHeaderInfo.TypeName.toString())) : titleNoHeaderInfo;
95
99
  var activeExpression = oDraftRoot ? Entity.IsActive : true;
96
100
  return compileExpression(ifElse(and(or(UI.IsCreateModeSticky, UI.IsCreateMode), titleIsEmpty), createModeTitle, // Otherwise show the default expression
97
101
  ifElse(and(activeExpression, titleIsEmpty), titleForActiveHeaderNoHeaderInfo, titleValueExpression)));
@@ -832,6 +836,44 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
832
836
  };
833
837
  return CommonHelper.generateFunction(".handlers.onCallAction", "${$view>/}", sActionContexts, CommonHelper.objectToString(oParams));
834
838
  };
839
+ /*
840
+ * Get Expression of execute event expression of primary action.
841
+ *
842
+ * @function
843
+ * @param {object} [oDataField] Data field object
844
+ * @param {string} [sEntitySetName] Entity set name
845
+ * @param {object} [oHeaderAction] Header action object
846
+ * @param {CompiledBindingToolkitExpression | string} The visibility of sematic positive action
847
+ * @param {CompiledBindingToolkitExpression | string} The enablement of semantic positive action
848
+ * @param {CompiledBindingToolkitExpression | string} The Edit button visibility
849
+ * @param {CompiledBindingToolkitExpression | string} The enablement of Edit button
850
+ * returns {string} binding expression / function string generated from commanhelper's function generateFunction
851
+ */
852
+
853
+
854
+ _exports.getPressExpressionForFooterAnnotationAction = getPressExpressionForFooterAnnotationAction;
855
+
856
+ var getPressExpressionForPrimaryAction = function (oDataField, sEntitySetName, oHeaderAction, positiveActionVisible, positiveActionEnabled, editActionVisible, editActionEnabled) {
857
+ var sActionContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
858
+ sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
859
+ sInvocationGroup = sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
860
+ var oParams = {
861
+ contexts: "${$view>/#fe::ObjectPage/}.getBindingContext()",
862
+ entitySetName: sEntitySetName ? CommonHelper.addSingleQuotes(sEntitySetName) : "",
863
+ invocationGrouping: CommonHelper.addSingleQuotes(sInvocationGroup),
864
+ model: "${$source>/}.getModel()",
865
+ label: CommonHelper.addSingleQuotes(oDataField === null || oDataField === void 0 ? void 0 : oDataField.Label, true),
866
+ isNavigable: oHeaderAction === null || oHeaderAction === void 0 ? void 0 : oHeaderAction.isNavigable,
867
+ defaultValuesExtensionFunction: oHeaderAction !== null && oHeaderAction !== void 0 && oHeaderAction.defaultValuesExtensionFunction ? "'".concat(oHeaderAction.defaultValuesExtensionFunction, "'") : undefined
868
+ };
869
+ var oConditions = {
870
+ positiveActionVisible: positiveActionVisible,
871
+ positiveActionEnabled: positiveActionEnabled,
872
+ editActionVisible: editActionVisible,
873
+ editActionEnabled: editActionEnabled
874
+ };
875
+ return CommonHelper.generateFunction(".handlers.onPrimaryAction", "$controller", "${$view>/}", "${$view>/getBindingContext}", sActionContexts, CommonHelper.objectToString(oParams), CommonHelper.objectToString(oConditions));
876
+ };
835
877
  /*
836
878
  * Gets the binding of the container HBox for the header facet.
837
879
  *
@@ -842,7 +884,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
842
884
  */
843
885
 
844
886
 
845
- _exports.getPressExpressionForFooterAnnotationAction = getPressExpressionForFooterAnnotationAction;
887
+ _exports.getPressExpressionForPrimaryAction = getPressExpressionForPrimaryAction;
846
888
 
847
889
  var getStashableHBoxBinding = function (oControlConfiguration, oHeaderFacet) {
848
890
  if (oHeaderFacet && oHeaderFacet.Facet && oHeaderFacet.Facet.targetAnnotationType === "DataPoint") {
@@ -888,4 +930,4 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
888
930
  _exports.getHeaderFormHboxRenderType = getHeaderFormHboxRenderType;
889
931
  return _exports;
890
932
  }, false);
891
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdXR0b25UeXBlIiwibUxpYnJhcnkiLCJnZXRFeHByZXNzaW9uRm9yVGl0bGUiLCJvSGVhZGVySW5mbyIsIm9WaWV3RGF0YSIsImZ1bGxDb250ZXh0UGF0aCIsIm9EcmFmdFJvb3QiLCJ0aXRsZU5vSGVhZGVySW5mbyIsIkNvbW1vblV0aWxzIiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJyZXNvdXJjZUJ1bmRsZSIsInVuZGVmaW5lZCIsImVudGl0eVNldCIsInRpdGxlV2l0aEhlYWRlckluZm8iLCJvRW1wdHlIZWFkZXJJbmZvVGl0bGUiLCJUaXRsZSIsIlZhbHVlIiwidGl0bGVGb3JBY3RpdmVIZWFkZXJOb0hlYWRlckluZm8iLCJ0aXRsZVZhbHVlRXhwcmVzc2lvbiIsImNvbm5lY3RlZEZpZWxkc1BhdGgiLCJ0aXRsZUlzRW1wdHkiLCJjb25zdGFudCIsIiRUeXBlIiwiZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIiwiJHRhcmdldCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiVGV4dCIsIlVJIiwiVGV4dEFycmFuZ2VtZW50IiwiYWRkVGV4dEFycmFuZ2VtZW50VG9CaW5kaW5nRXhwcmVzc2lvbiIsImZvcm1hdFZhbHVlUmVjdXJzaXZlbHkiLCJpc0VtcHR5IiwiVGFyZ2V0IiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJnZXRMYWJlbEZvckNvbm5lY3RlZEZpZWxkcyIsImNyZWF0ZU1vZGVUaXRsZSIsIlR5cGVOYW1lIiwiY29uY2F0IiwidG9TdHJpbmciLCJhY3RpdmVFeHByZXNzaW9uIiwiRW50aXR5IiwiSXNBY3RpdmUiLCJjb21waWxlRXhwcmVzc2lvbiIsImlmRWxzZSIsImFuZCIsIm9yIiwiSXNDcmVhdGVNb2RlU3RpY2t5IiwiSXNDcmVhdGVNb2RlIiwiZ2V0RXhwcmVzc2lvbkZvckRlc2NyaXB0aW9uIiwicGF0aEluTW9kZWwiLCJEZXNjcmlwdGlvbiIsImdldEV4cHJlc3Npb25Gb3JTYXZlQnV0dG9uIiwic2F2ZUJ1dHRvblRleHQiLCJjcmVhdGVCdXR0b25UZXh0Iiwic2F2ZUV4cHJlc3Npb24iLCJzdGFydGluZ0VudGl0eVNldCIsIlNlc3Npb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiRHJhZnQiLCJJc05ld09iamVjdCIsImdldEZvb3RlclZpc2libGUiLCJmb290ZXJBY3Rpb25zIiwiZGF0YUZpZWxkcyIsIm1hbmlmZXN0QWN0aW9ucyIsImZpbHRlciIsImFjdGlvbiIsImlzTWFuaWZlc3RBY3Rpb24iLCJjdXN0b21BY3Rpb25WaXNpYmlsaXR5IiwibGVuZ3RoIiwiY3VzdG9tQWN0aW9uSW5kaXZpZHVhbFZpc2liaWxpdHkiLCJtYXAiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsInZpc2libGUiLCJhbm5vdGF0aW9uQWN0aW9uVmlzaWJpbGl0eSIsImdldERhdGFGaWVsZEJhc2VkRm9vdGVyVmlzaWJpbGl0eSIsImFEYXRhRmllbGRzIiwiYkNvbnNpZGVyRWRpdGFibGUiLCJzSGlkZGVuRXhwcmVzc2lvbiIsInNTZW1pSGlkZGVuRXhwcmVzc2lvbiIsImFIaWRkZW5BY3Rpb25QYXRoIiwiaSIsIm9EYXRhRmllbGQiLCJEZXRlcm1pbmluZyIsImhpZGRlbkV4cHJlc3Npb24iLCIkUGF0aCIsImluZGV4T2YiLCJwdXNoIiwiaW5kZXgiLCJvQWN0aW9uIiwiYUFjdGlvbnMiLCJ0eXBlIiwiYnVpbGRFbXBoYXNpemVkQnV0dG9uRXhwcmVzc2lvbiIsImFJZGVudGlmaWNhdGlvbiIsIkVtcGhhc2l6ZWQiLCJzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24iLCJiSXNBbHdheXNEZWZhdWx0Iiwic0hpZGRlblNpbXBsZVBhdGgiLCJmb3JFYWNoIiwib0NyaXRpY2FsaXR5UHJvcGVydHkiLCJDcml0aWNhbGl0eSIsIm9EYXRhRmllbGRIaWRkZW4iLCIkRW51bU1lbWJlciIsIkRlZmF1bHQiLCJzQ29tYmluZWRIaWRkZW5FeHByZXNzaW9uIiwiZ2V0RWxlbWVudEJpbmRpbmciLCJzUGF0aCIsInNOYXZpZ2F0aW9uUGF0aCIsIk9EYXRhTW9kZWxBbm5vdGF0aW9uSGVscGVyIiwiZ2V0TmF2aWdhdGlvblBhdGgiLCJjaGVja0RyYWZ0U3RhdGUiLCJvQW5ub3RhdGlvbnMiLCJnZXRTd2l0Y2hUb0FjdGl2ZVZpc2liaWxpdHkiLCJnZXRTd2l0Y2hUb0RyYWZ0VmlzaWJpbGl0eSIsImdldFN3aXRjaERyYWZ0QW5kQWN0aXZlVmlzaWJpbGl0eSIsIl9maW5kQWN0aW9uIiwiYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIiwic0FjdGlvblR5cGUiLCJmaW5kIiwib0hlYWRlckFjdGlvbiIsImdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25FbmFibGVkIiwib0RlbGV0ZUFjdGlvbiIsImVuYWJsZWQiLCJnZXREZWxldGVDb21tYW5kRXhlY3V0aW9uVmlzaWJsZSIsImdldEVkaXRDb21tYW5kRXhlY3V0aW9uVmlzaWJsZSIsIm9FZGl0QWN0aW9uIiwiZ2V0RWRpdENvbW1hbmRFeGVjdXRpb25FbmFibGVkIiwiZ2V0RWRpdEFjdGlvbiIsIm9FbnRpdHlTZXQiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiYkRyYWZ0Um9vdCIsImhhc093blByb3BlcnR5IiwiYlN0aWNreVNlc3Npb24iLCJzQWN0aW9uTmFtZSIsImlzUmVhZE9ubHlGcm9tU3RhdGljQW5ub3RhdGlvbnMiLCJvRmllbGRDb250cm9sIiwiYkNvbXB1dGVkIiwiYkltbXV0YWJsZSIsImJSZWFkT25seSIsIkJvb2wiLCJyZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zIiwic0lzRmllbGRDb250cm9sUGF0aFJlYWRPbmx5IiwiTWFuYWdlZE9iamVjdCIsImJpbmRpbmdQYXJzZXIiLCJnZXRFeHByZXNzaW9uRm9yTWljcm9DaGFydFRpdGxlUHJlc3MiLCJvQ29uZmlndXJhdGlvbiIsIm9NYW5pZmVzdE91dGJvdW5kIiwic0NvbGxlY3Rpb25OYW1lIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldE1pY3JvQ2hhcnRUaXRsZUFzTGluayIsIm9Db250cm9sQ29uZmlndXJhdGlvbiIsImdldEdyb3VwSWRGcm9tQ29uZmlnIiwib0NvbmZpZ3VyYXRpb25zIiwic0Fubm90YXRpb25QYXRoIiwic0RlZmF1bHRHcm91cElkIiwiYUF1dG9QYXR0ZXJucyIsInNHcm91cElkIiwicmVxdWVzdEdyb3VwSWQiLCJzb21lIiwiYXV0b1BhdHRlcm4iLCJnZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnIiwic0tleSIsInNCaW5kaW5nIiwiZG9lc0ZpZWxkR3JvdXBDb250YWluT25seU9uZU11bHRpTGluZURhdGFGaWVsZCIsImFGb3JtRWxlbWVudHMiLCJpc1ZhbHVlTXVsdGlsaW5lVGV4dCIsImdldFZpc2libGVFeHByZXNzaW9uRm9yQnJlYWRjcnVtYnMiLCJzaG93QnJlYWRDcnVtYnMiLCJmY2xFbmFibGVkIiwiZ2V0U2hhcmVCdXR0b25WaXNpYmlsaXR5Iiwidmlld0RhdGEiLCJzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwIiwiZ2V0VmlzaWJsaXR5T2ZIZWFkZXJJbmZvIiwib1RpdGxlQW5ub3RhdGlvbnMiLCJvRGVzY3JpcHRpb25Bbm5vdGF0aW9ucyIsIm9GaWVsZFRpdGxlRmllbGRDb250cm9sIiwib0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2wiLCJiSXNUaXRsZVJlYWRPbmx5IiwidGl0bGVFeHByZXNzaW9uIiwiYklzRGVzY3JpcHRpb25SZWFkT25seSIsImRlc2NyaXB0aW9uRXhwcmVzc2lvbiIsImNvbWJpbmVUaXRsZUFuZERlc2NyaXB0aW9uRXhwcmVzc2lvbiIsIm9UaXRsZUZpZWxkQ29udHJvbCIsIm9EZXNjcmlwdGlvbkZpZWxkQ29udHJvbCIsImdldFByZXNzRXhwcmVzc2lvbkZvckRlbGV0ZSIsInNFbnRpdHlTZXROYW1lIiwic0RlbGV0YWJsZUNvbnRleHRzIiwic1RpdGxlIiwic0Rlc2NyaXB0aW9uIiwib1BhcmFtcyIsInRpdGxlIiwiZW50aXR5U2V0TmFtZSIsIkNvbW1vbkhlbHBlciIsImFkZFNpbmdsZVF1b3RlcyIsImRlc2NyaXB0aW9uIiwiZ2VuZXJhdGVGdW5jdGlvbiIsIm9iamVjdFRvU3RyaW5nIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRWRpdCIsInNFZGl0YWJsZUNvbnRleHRzIiwiQWN0aW9uIiwic0RhdGFGaWVsZEVudW1NZW1iZXIiLCJJbnZvY2F0aW9uR3JvdXBpbmciLCJzSW52b2NhdGlvbkdyb3VwIiwiY29udGV4dHMiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJtb2RlbCIsImxhYmVsIiwiTGFiZWwiLCJpc05hdmlnYWJsZSIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsImdldFByZXNzRXhwcmVzc2lvbkZvckZvb3RlckFubm90YXRpb25BY3Rpb24iLCJzQWN0aW9uQ29udGV4dHMiLCJnZXRTdGFzaGFibGVIQm94QmluZGluZyIsIm9IZWFkZXJGYWNldCIsIkZhY2V0IiwidGFyZ2V0QW5ub3RhdGlvblR5cGUiLCJ0YXJnZXRBbm5vdGF0aW9uVmFsdWUiLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JMaW5rIiwiZ2V0SGVhZGVyRm9ybUhib3hSZW5kZXJUeXBlIiwiZGF0YUZpZWxkIiwidGFyZ2V0T2JqZWN0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJPYmplY3RQYWdlVGVtcGxhdGluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGb3JtYXR0ZXJzIGZvciB0aGUgT2JqZWN0IFBhZ2VcbmltcG9ydCB7IEVudGl0eVNldCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhRmllbGQsIERhdGFGaWVsZFR5cGVzLCBIZWFkZXJJbmZvVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblRlcm1zLCBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnZlcnRlckFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9BY3Rpb25cIjtcbmltcG9ydCB7IERyYWZ0LCBFbnRpdHksIFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0QWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHtcblx0YW5kLFxuXHRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRjb21waWxlRXhwcmVzc2lvbixcblx0Y29uY2F0LFxuXHRjb25zdGFudCxcblx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uLFxuXHRpZkVsc2UsXG5cdGlzRW1wdHksXG5cdG9yLFxuXHRyZXNvbHZlQmluZGluZ1N0cmluZ1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZW5oYW5jZURhdGFNb2RlbFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgQ29tbW9uSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IHsgYWRkVGV4dEFycmFuZ2VtZW50VG9CaW5kaW5nRXhwcmVzc2lvbiwgZm9ybWF0VmFsdWVSZWN1cnNpdmVseSB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkVGVtcGxhdGluZ1wiO1xuaW1wb3J0IHsgZ2V0TGFiZWxGb3JDb25uZWN0ZWRGaWVsZHMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC9mb3JtL0Zvcm1UZW1wbGF0aW5nXCI7XG5pbXBvcnQgbUxpYnJhcnkgZnJvbSBcInNhcC9tL2xpYnJhcnlcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Bbm5vdGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG5jb25zdCBCdXR0b25UeXBlID0gbUxpYnJhcnkuQnV0dG9uVHlwZTtcblxudHlwZSBWaWV3RGF0YSA9IHtcblx0cmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlO1xuXHRlbnRpdHlTZXQ6IHN0cmluZztcbn07XG5cbi8vYGBgbWVybWFpZFxuLy8gZ3JhcGggVERcbi8vIEFbT2JqZWN0IFBhZ2UgVGl0bGVdIC0tPnxHZXQgRGF0YUZpZWxkIFZhbHVlfCBDe0V2YWx1YXRlIENyZWF0ZSBNb2RlfVxuLy8gQyAtLT58SW4gQ3JlYXRlIE1vZGV8IER7SXMgRGF0YUZpZWxkIFZhbHVlIGVtcHR5fVxuLy8gRCAtLT58WWVzfCBGe0lzIHRoZXJlIGEgVHlwZU5hbWV9XG4vLyBGIC0tPnxZZXN8IEdbSXMgdGhlcmUgYW4gY3VzdG9tIHRpdGxlXVxuLy8gRyAtLT58WWVzfCBHMVtTaG93IHRoZSBjdXN0b20gdGl0bGUgKyAnVHlwZU5hbWUnXVxuLy8gRyAtLT58Tm98IEcyW0Rpc3BsYXkgdGhlIGRlZmF1bHQgdGl0bGUgJ05ldyArIFR5cGVOYW1lJ11cbi8vIEYgLS0+fE5vfCBIW0lzIHRoZXJlIGEgY3VzdG9tIHRpdGxlXVxuLy8gSCAtLT58WWVzfCBJW1Nob3cgdGhlIGN1c3RvbSB0aXRsZV1cbi8vIEggLS0+fE5vfCBKW1Nob3cgdGhlIGRlZmF1bHQgJ1VuYW1uZWQgT2JqZWN0J11cbi8vIEQgLS0+fE5vfCBFXG4vLyBDIC0tPnxOb3QgaW4gY3JlYXRlIG1vZGV8IEVbU2hvdyBEYXRhRmllbGQgVmFsdWVdXG4vLyBgYGBcbi8qKlxuICogQ29tcHV0ZSB0aGUgdGl0bGUgZm9yIHRoZSBvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0gb0hlYWRlckluZm8gVGhlIEBVSS5IZWFkZXJJbmZvIGFubm90YXRpb24gY29udGVudFxuICogQHBhcmFtIG9WaWV3RGF0YSBUaGUgdmlldyBkYXRhIG9iamVjdCB3ZSdyZSBjdXJyZW50bHkgb25cbiAqIEBwYXJhbSBmdWxsQ29udGV4dFBhdGggVGhlIGZ1bGwgY29udGV4dCBwYXRoIHVzZWQgdG8gcmVhY2ggdGhhdCBvYmplY3QgcGFnZVxuICogQHBhcmFtIG9EcmFmdFJvb3RcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBvYmplY3QgcGFnZSB0aXRsZVxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvclRpdGxlID0gZnVuY3Rpb24gKFxuXHRvSGVhZGVySW5mbzogSGVhZGVySW5mb1R5cGUgfCB1bmRlZmluZWQsXG5cdG9WaWV3RGF0YTogVmlld0RhdGEsXG5cdGZ1bGxDb250ZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0b0RyYWZ0Um9vdDogT2JqZWN0IHwgdW5kZWZpbmVkXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IHRpdGxlTm9IZWFkZXJJbmZvID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJUX05FV19PQkpFQ1RcIiwgb1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlLCB1bmRlZmluZWQsIG9WaWV3RGF0YS5lbnRpdHlTZXQpO1xuXG5cdGNvbnN0IHRpdGxlV2l0aEhlYWRlckluZm8gPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcIlRfQU5OT1RBVElPTl9IRUxQRVJfREVGQVVMVF9PQkpFQ1RfUEFHRV9IRUFERVJfVElUTEVcIixcblx0XHRvVmlld0RhdGEucmVzb3VyY2VCdW5kbGUsXG5cdFx0dW5kZWZpbmVkLFxuXHRcdG9WaWV3RGF0YS5lbnRpdHlTZXRcblx0KTtcblxuXHRjb25zdCBvRW1wdHlIZWFkZXJJbmZvVGl0bGUgPVxuXHRcdG9IZWFkZXJJbmZvPy5UaXRsZSA9PT0gdW5kZWZpbmVkIHx8IChvSGVhZGVySW5mbz8uVGl0bGUgYXMgYW55KSA9PT0gXCJcIiB8fCAob0hlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWUgPT09IFwiXCI7XG5cblx0Y29uc3QgdGl0bGVGb3JBY3RpdmVIZWFkZXJOb0hlYWRlckluZm8gPSAhb0VtcHR5SGVhZGVySW5mb1RpdGxlXG5cdFx0PyBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIlRfQU5OT1RBVElPTl9IRUxQRVJfREVGQVVMVF9PQkpFQ1RfUEFHRV9IRUFERVJfVElUTEVfTk9fSEVBREVSX0lORk9cIiwgb1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlKVxuXHRcdDogXCJcIjtcblx0bGV0IHRpdGxlVmFsdWVFeHByZXNzaW9uLFxuXHRcdGNvbm5lY3RlZEZpZWxkc1BhdGgsXG5cdFx0dGl0bGVJc0VtcHR5OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudCh0cnVlKTtcblx0aWYgKG9IZWFkZXJJbmZvPy5UaXRsZT8uJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkXCIpIHtcblx0XHR0aXRsZVZhbHVlRXhwcmVzc2lvbiA9IGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbigob0hlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWUpO1xuXHRcdGlmICgob0hlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQ/LmFubm90YXRpb25zPy5VST8uVGV4dEFycmFuZ2VtZW50KSB7XG5cdFx0XHQvLyBJbiBjYXNlIGFuIGV4cGxpY2l0IHRleHQgYXJyYW5nZW1lbnQgd2FzIHNldCB3ZSBtYWtlIHVzZSBvZiBpdCBpbiB0aGUgZGVzY3JpcHRpb24gYXMgd2VsbFxuXHRcdFx0dGl0bGVWYWx1ZUV4cHJlc3Npb24gPSBhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uKHRpdGxlVmFsdWVFeHByZXNzaW9uLCBmdWxsQ29udGV4dFBhdGgpO1xuXHRcdH1cblx0XHR0aXRsZVZhbHVlRXhwcmVzc2lvbiA9IGZvcm1hdFZhbHVlUmVjdXJzaXZlbHkodGl0bGVWYWx1ZUV4cHJlc3Npb24sIGZ1bGxDb250ZXh0UGF0aCk7XG5cdFx0dGl0bGVJc0VtcHR5ID0gaXNFbXB0eSh0aXRsZVZhbHVlRXhwcmVzc2lvbik7XG5cdH0gZWxzZSBpZiAoXG5cdFx0b0hlYWRlckluZm8/LlRpdGxlPy4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBbm5vdGF0aW9uXCIgJiZcblx0XHRvSGVhZGVySW5mbz8uVGl0bGU/LlRhcmdldC4kdGFyZ2V0LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNvbm5lY3RlZEZpZWxkc1R5cGVcIlxuXHQpIHtcblx0XHRjb25uZWN0ZWRGaWVsZHNQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgoZnVsbENvbnRleHRQYXRoLCBcIiRUeXBlL0BVSS5IZWFkZXJJbmZvL1RpdGxlL1RhcmdldC8kQW5ub3RhdGlvblBhdGhcIik7XG5cdFx0dGl0bGVWYWx1ZUV4cHJlc3Npb24gPSBnZXRMYWJlbEZvckNvbm5lY3RlZEZpZWxkcyhjb25uZWN0ZWRGaWVsZHNQYXRoLCBmYWxzZSkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz47XG5cdFx0dGl0bGVJc0VtcHR5ID0gdGl0bGVWYWx1ZUV4cHJlc3Npb24gPyBpc0VtcHR5KHRpdGxlVmFsdWVFeHByZXNzaW9uKSA6IGNvbnN0YW50KHRydWUpO1xuXHR9XG5cblx0Ly8gSWYgdGhlcmUgaXMgYSBUeXBlTmFtZSBkZWZpbmVkLCBzaG93IHRoZSBkZWZhdWx0IHRpdGxlICdOZXcgKyBUeXBlTmFtZScsIG90aGVyd2lzZSBzaG93IHRoZSBjdXN0b20gdGl0bGUgb3IgdGhlIGRlZmF1bHQgJ05ldyBvYmplY3QnXG5cdGNvbnN0IGNyZWF0ZU1vZGVUaXRsZSA9IG9IZWFkZXJJbmZvPy5UeXBlTmFtZVxuXHRcdD8gY29uY2F0KHRpdGxlV2l0aEhlYWRlckluZm8sIFwiOiBcIiwgZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKG9IZWFkZXJJbmZvLlR5cGVOYW1lLnRvU3RyaW5nKCkpKVxuXHRcdDogdGl0bGVOb0hlYWRlckluZm87XG5cdGNvbnN0IGFjdGl2ZUV4cHJlc3Npb24gPSBvRHJhZnRSb290ID8gRW50aXR5LklzQWN0aXZlIDogdHJ1ZTtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdGlmRWxzZShcblx0XHRcdGFuZChvcihVSS5Jc0NyZWF0ZU1vZGVTdGlja3ksIFVJLklzQ3JlYXRlTW9kZSksIHRpdGxlSXNFbXB0eSksXG5cdFx0XHRjcmVhdGVNb2RlVGl0bGUsXG5cblx0XHRcdC8vIE90aGVyd2lzZSBzaG93IHRoZSBkZWZhdWx0IGV4cHJlc3Npb25cblx0XHRcdGlmRWxzZShhbmQoYWN0aXZlRXhwcmVzc2lvbiwgdGl0bGVJc0VtcHR5KSwgdGl0bGVGb3JBY3RpdmVIZWFkZXJOb0hlYWRlckluZm8sIHRpdGxlVmFsdWVFeHByZXNzaW9uKVxuXHRcdClcblx0KTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBleHByZXNzaW9uIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgYW4gb2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIG9IZWFkZXJJbmZvIFRoZSBAVUkuSGVhZGVySW5mbyBhbm5vdGF0aW9uIGNvbnRlbnRcbiAqIEBwYXJhbSBmdWxsQ29udGV4dFBhdGggVGhlIGZ1bGwgY29udGV4dCBwYXRoIHVzZWQgdG8gcmVhY2ggdGhhdCBvYmplY3QgcGFnZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIG9iamVjdCBwYWdlIGRlc2NyaXB0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yRGVzY3JpcHRpb24gPSBmdW5jdGlvbiAoXG5cdG9IZWFkZXJJbmZvOiBIZWFkZXJJbmZvVHlwZSB8IHVuZGVmaW5lZCxcblx0ZnVsbENvbnRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGxldCBwYXRoSW5Nb2RlbCA9IGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbigob0hlYWRlckluZm8/LkRlc2NyaXB0aW9uIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWUpO1xuXHRpZiAoKG9IZWFkZXJJbmZvPy5EZXNjcmlwdGlvbiBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0Py5hbm5vdGF0aW9ucz8uVUk/LlRleHRBcnJhbmdlbWVudCkge1xuXHRcdC8vIEluIGNhc2UgYW4gZXhwbGljaXQgdGV4dCBhcnJhbmdlbWVudCB3YXMgc2V0IHdlIG1ha2UgdXNlIG9mIGl0IGluIHRoZSBkZXNjcmlwdGlvbiBhcyB3ZWxsXG5cdFx0cGF0aEluTW9kZWwgPSBhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uKHBhdGhJbk1vZGVsLCBmdWxsQ29udGV4dFBhdGgpO1xuXHR9XG5cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGZvcm1hdFZhbHVlUmVjdXJzaXZlbHkocGF0aEluTW9kZWwsIGZ1bGxDb250ZXh0UGF0aCkpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gZm9yIHRoZSBzYXZlIGJ1dHRvbi5cbiAqXG4gKiBAcGFyYW0gb1ZpZXdEYXRhIFRoZSBjdXJyZW50IHZpZXcgZGF0YVxuICogQHBhcmFtIGZ1bGxDb250ZXh0UGF0aCBUaGUgcGF0aCB1c2VkIHVwIHVudGlsIGhlcmVcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdGhhdCBzaG93cyB0aGUgcmlnaHQgc2F2ZSBidXR0b24gdGV4dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvclNhdmVCdXR0b24gPSBmdW5jdGlvbiAoXG5cdG9WaWV3RGF0YTogVmlld0RhdGEsXG5cdGZ1bGxDb250ZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aFxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRjb25zdCBzYXZlQnV0dG9uVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9PUF9PQkpFQ1RfUEFHRV9TQVZFXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSk7XG5cdGNvbnN0IGNyZWF0ZUJ1dHRvblRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIlRfT1BfT0JKRUNUX1BBR0VfQ1JFQVRFXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSk7XG5cdGxldCBzYXZlRXhwcmVzc2lvbjtcblxuXHRpZiAoKGZ1bGxDb250ZXh0UGF0aC5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQpLmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQpIHtcblx0XHQvLyBJZiB3ZSdyZSBpbiBzdGlja3kgbW9kZSBBTkQgdGhlIHVpIGlzIGluIGNyZWF0ZSBtb2RlLCBzaG93IENyZWF0ZSwgZWxzZSBzaG93IFNhdmVcblx0XHRzYXZlRXhwcmVzc2lvbiA9IGlmRWxzZShVSS5Jc0NyZWF0ZU1vZGVTdGlja3ksIGNyZWF0ZUJ1dHRvblRleHQsIHNhdmVCdXR0b25UZXh0KTtcblx0fSBlbHNlIHtcblx0XHQvLyBJZiB3ZSdyZSBpbiBkcmFmdCBBTkQgdGhlIGRyYWZ0IGlzIGEgbmV3IG9iamVjdCAoIUlzQWN0aXZlRW50aXR5ICYmICFIYXNBY3RpdmVFbnRpdHkpLCBzaG93IGNyZWF0ZSwgZWxzZSBzaG93IHNhdmVcblx0XHRzYXZlRXhwcmVzc2lvbiA9IGlmRWxzZShEcmFmdC5Jc05ld09iamVjdCwgY3JlYXRlQnV0dG9uVGV4dCwgc2F2ZUJ1dHRvblRleHQpO1xuXHR9XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihzYXZlRXhwcmVzc2lvbik7XG59O1xuXG4vKipcbiAqIE1ldGhvZCByZXR1cm5zIHdoZXRoZXIgZm9vdGVyIGlzIHZpc2libGUgb3Igbm90IG9uIG9iamVjdCAvIHN1Ym9iamVjdCBwYWdlLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgZ2V0Rm9vdGVyVmlzaWJsZVxuICogQHBhcmFtIGZvb3RlckFjdGlvbnMgVGhlIGZvb3RlciBhY3Rpb24gb2JqZWN0IGNvbWluZyBmcm9tIHRoZSBjb252ZXJ0ZXJcbiAqIEBwYXJhbSBkYXRhRmllbGRzIERhdGEgZmllbGQgYXJyYXkgZm9yIG5vcm1hbCBmb290ZXIgdmlzaWJpbGl0eSBwcm9jZXNzaW5nXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYW55IGFjdGlvbiBpcyB0cnVlLCBvdGhlcndpc2UgY29tcGlsZWQgQmluZGluZyBvciBgZmFsc2VgXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGb290ZXJWaXNpYmxlID0gZnVuY3Rpb24gKFxuXHRmb290ZXJBY3Rpb25zOiBDb252ZXJ0ZXJBY3Rpb25bXSxcblx0ZGF0YUZpZWxkczogRGF0YUZpZWxkW11cbik6IGJvb2xlYW4gfCBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9ucyA9IGZvb3RlckFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IGlzTWFuaWZlc3RBY3Rpb24oYWN0aW9uKSkgYXMgTWFuaWZlc3RBY3Rpb25bXTtcblx0bGV0IGN1c3RvbUFjdGlvblZpc2liaWxpdHk6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcblx0aWYgKG1hbmlmZXN0QWN0aW9ucy5sZW5ndGgpIHtcblx0XHQvLyBJZiB3ZSBoYXZlIG1hbmlmZXN0IGFjdGlvbnNcblx0XHRjb25zdCBjdXN0b21BY3Rpb25JbmRpdmlkdWFsVmlzaWJpbGl0eSA9IG1hbmlmZXN0QWN0aW9ucy5tYXAoKGFjdGlvbikgPT4ge1xuXHRcdFx0cmV0dXJuIHJlc29sdmVCaW5kaW5nU3RyaW5nPGJvb2xlYW4+KGFjdGlvbi52aXNpYmxlIGFzIHN0cmluZyB8IGJvb2xlYW4sIFwiYm9vbGVhblwiKTtcblx0XHR9KTtcblx0XHQvLyBjb25zdHJ1Y3QgdGhlIGZvb3RlcidzIHZpc2liaWxpdHktYmluZGluZyBvdXQgb2YgYWxsIGFjdGlvbnMnIHZpc2liaWxpdHktYmluZGluZ3MsIGZpcnN0IHRoZSBiaW5kaW5nIG9mIGFsbCBjdXN0b20gYWN0aW9ucyAuLi5cblx0XHRjdXN0b21BY3Rpb25WaXNpYmlsaXR5ID0gb3IoLi4uY3VzdG9tQWN0aW9uSW5kaXZpZHVhbFZpc2liaWxpdHkpO1xuXHRcdC8vIGFuZCB0aGVuIHRoZSBiaW5kaW5nIG9mIGFsbCBhbm5vdGF0aW9uIGFjdGlvbnMgaW5zaWRlIHRoZSBmb290ZXIgLi4uXG5cdFx0Y29uc3QgYW5ub3RhdGlvbkFjdGlvblZpc2liaWxpdHkgPSBnZXREYXRhRmllbGRCYXNlZEZvb3RlclZpc2liaWxpdHkoZGF0YUZpZWxkcywgdHJ1ZSk7XG5cdFx0Ly8gZmluYWxseSwgcmV0dXJuIGV2ZXJ5dGhpbmcuXG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKG9yKGN1c3RvbUFjdGlvblZpc2liaWxpdHksIHJlc29sdmVCaW5kaW5nU3RyaW5nPGJvb2xlYW4+KGFubm90YXRpb25BY3Rpb25WaXNpYmlsaXR5LCBcImJvb2xlYW5cIikpKTtcblx0fVxuXHRyZXR1cm4gZ2V0RGF0YUZpZWxkQmFzZWRGb290ZXJWaXNpYmlsaXR5KGRhdGFGaWVsZHMsIHRydWUpO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGZvb3RlciBpcyB2aXNpYmxlIG9yIG5vdC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlVGVtcGxhdGluZy5nZXREYXRhRmllbGRCYXNlZEZvb3RlclZpc2liaWxpdHlcbiAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZVRlbXBsYXRpbmdcbiAqIEBwYXJhbSBhRGF0YUZpZWxkcyBBcnJheSBvZiBEYXRhRmllbGRzIGluIHRoZSBpZGVudGlmaWNhdGlvblxuICogQHBhcmFtIGJDb25zaWRlckVkaXRhYmxlIFdoZXRoZXIgdGhlIGVkaXQgbW9kZSBiaW5kaW5nIGlzIHJlcXVpcmVkIG9yIG5vdFxuICogQHJldHVybnMgQW4gZXhwcmVzc2lvbiBpZiBhbGwgdGhlIGFjdGlvbnMgYXJlIHVpLmhpZGRlbiwgdHJ1ZSBvdGhlcndpc2VcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERhdGFGaWVsZEJhc2VkRm9vdGVyVmlzaWJpbGl0eSA9IGZ1bmN0aW9uIChhRGF0YUZpZWxkczogYW55W10sIGJDb25zaWRlckVkaXRhYmxlOiBib29sZWFuKSB7XG5cdGxldCBzSGlkZGVuRXhwcmVzc2lvbiA9IFwiXCI7XG5cdGxldCBzU2VtaUhpZGRlbkV4cHJlc3Npb247XG5cdGNvbnN0IGFIaWRkZW5BY3Rpb25QYXRoID0gW107XG5cblx0Zm9yIChjb25zdCBpIGluIGFEYXRhRmllbGRzKSB7XG5cdFx0Y29uc3Qgb0RhdGFGaWVsZCA9IGFEYXRhRmllbGRzW2ldO1xuXHRcdGlmIChvRGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gJiYgb0RhdGFGaWVsZC5EZXRlcm1pbmluZyA9PT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgaGlkZGVuRXhwcmVzc2lvbiA9IG9EYXRhRmllbGRbYEAke1VJQW5ub3RhdGlvblRlcm1zLkhpZGRlbn1gXTtcblx0XHRcdGlmICghaGlkZGVuRXhwcmVzc2lvbikge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAoaGlkZGVuRXhwcmVzc2lvbi4kUGF0aCkge1xuXHRcdFx0XHRpZiAoYUhpZGRlbkFjdGlvblBhdGguaW5kZXhPZihoaWRkZW5FeHByZXNzaW9uLiRQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhSGlkZGVuQWN0aW9uUGF0aC5wdXNoKGhpZGRlbkV4cHJlc3Npb24uJFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKGFIaWRkZW5BY3Rpb25QYXRoLmxlbmd0aCkge1xuXHRcdGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhSGlkZGVuQWN0aW9uUGF0aC5sZW5ndGg7IGluZGV4KyspIHtcblx0XHRcdGlmIChhSGlkZGVuQWN0aW9uUGF0aFtpbmRleF0pIHtcblx0XHRcdFx0c1NlbWlIaWRkZW5FeHByZXNzaW9uID0gXCIoJXtcIiArIGFIaWRkZW5BY3Rpb25QYXRoW2luZGV4XSArIFwifSA9PT0gdHJ1ZSA/IGZhbHNlIDogdHJ1ZSApXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaW5kZXggPT0gYUhpZGRlbkFjdGlvblBhdGgubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRzSGlkZGVuRXhwcmVzc2lvbiA9IHNIaWRkZW5FeHByZXNzaW9uICsgc1NlbWlIaWRkZW5FeHByZXNzaW9uO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0hpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiArIHNTZW1pSGlkZGVuRXhwcmVzc2lvbiArIFwifHxcIjtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIChcblx0XHRcdFwiez0gXCIgK1xuXHRcdFx0KGJDb25zaWRlckVkaXRhYmxlID8gXCIoXCIgOiBcIlwiKSArXG5cdFx0XHRzSGlkZGVuRXhwcmVzc2lvbiArXG5cdFx0XHQoYkNvbnNpZGVyRWRpdGFibGUgPyBcIiB8fCAke3VpPi9pc0VkaXRhYmxlfSkgXCIgOiBcIiBcIikgK1xuXHRcdFx0XCImJiAke2ludGVybmFsPmlzQ3JlYXRlRGlhbG9nT3Blbn0gIT09IHRydWV9XCJcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIns9IFwiICsgKGJDb25zaWRlckVkaXRhYmxlID8gXCIke3VpPi9pc0VkaXRhYmxlfSAmJiBcIiA6IFwiXCIpICsgXCIke2ludGVybmFsPmlzQ3JlYXRlRGlhbG9nT3Blbn0gIT09IHRydWV9XCI7XG5cdH1cbn07XG5cbi8qKlxuICogTWV0aG9kIHJldHVybnMgV2hldGhlciB0aGUgYWN0aW9uIHR5cGUgaXMgbWFuaWZlc3Qgb3Igbm90LlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgaXNNYW5pZmVzdEFjdGlvblZpc2libGVcbiAqIEBwYXJhbSBvQWN0aW9uIFRoZSBhY3Rpb24gb2JqZWN0XG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYWN0aW9uIGlzIGNvbWluZyBmcm9tIG1hbmlmZXN0LCBgZmFsc2VgIG90aGVyd2lzZVxuICovXG5leHBvcnQgY29uc3QgaXNNYW5pZmVzdEFjdGlvbiA9IGZ1bmN0aW9uIChvQWN0aW9uOiBhbnkpIHtcblx0Y29uc3QgYUFjdGlvbnMgPSBbXG5cdFx0XCJQcmltYXJ5XCIsXG5cdFx0XCJEZWZhdWx0QXBwbHlcIixcblx0XHRcIlNlY29uZGFyeVwiLFxuXHRcdFwiRm9yQWN0aW9uXCIsXG5cdFx0XCJGb3JOYXZpZ2F0aW9uXCIsXG5cdFx0XCJTd2l0Y2hUb0FjdGl2ZU9iamVjdFwiLFxuXHRcdFwiU3dpdGNoVG9EcmFmdE9iamVjdFwiLFxuXHRcdFwiRHJhZnRBY3Rpb25zXCJcblx0XTtcblx0cmV0dXJuIGFBY3Rpb25zLmluZGV4T2Yob0FjdGlvbi50eXBlKSA8IDA7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gZXhwcmVzc2lvbiB0byBkZXRlcm1pbmUgRW1waGFzaXplZCAgYnV0dG9uIHR5cGUgYmFzZWQgb24gQ3JpdGljYWxpdHkgYWNyb3NzIGFsbCBhY3Rpb25zXG4gKiBJZiBjcml0aWNhbCBhY3Rpb24gaXMgcmVuZGVyZWQsIGl0cyBjb25zaWRlcmVkIHRvIGJlIHRoZSBwcmltYXJ5IGFjdGlvbi4gSGVuY2UgdGVtcGxhdGUncyBkZWZhdWx0IHByaW1hcnkgYWN0aW9uIGlzIHNldCBiYWNrIHRvIERlZmF1bHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZVRlbXBsYXRpbmcuYnVpbGRFbXBoYXNpemVkQnV0dG9uRXhwcmVzc2lvblxuICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlVGVtcGxhdGluZ1xuICogQHBhcmFtIGFJZGVudGlmaWNhdGlvbiBBcnJheSBvZiBhbGwgdGhlIERhdGFGaWVsZHMgaW4gSWRlbnRpZmljYXRpb25cbiAqIEByZXR1cm5zIEFuIGV4cHJlc3Npb24gdG8gZGVkdWNlIGlmIGJ1dHRvbiB0eXBlIGlzIERlZmF1bHQgb3IgRW1waGFzaXplZFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5leHBvcnQgY29uc3QgYnVpbGRFbXBoYXNpemVkQnV0dG9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChhSWRlbnRpZmljYXRpb24/OiBhbnlbXSkge1xuXHRpZiAoIWFJZGVudGlmaWNhdGlvbikge1xuXHRcdHJldHVybiBCdXR0b25UeXBlLkVtcGhhc2l6ZWQ7XG5cdH1cblx0bGV0IHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRsZXQgYklzQWx3YXlzRGVmYXVsdDogYm9vbGVhbixcblx0XHRzSGlkZGVuU2ltcGxlUGF0aCxcblx0XHRzSGlkZGVuRXhwcmVzc2lvbiA9IFwiXCI7XG5cdGFJZGVudGlmaWNhdGlvbi5mb3JFYWNoKGZ1bmN0aW9uIChvRGF0YUZpZWxkOiBhbnkpIHtcblx0XHRjb25zdCBvQ3JpdGljYWxpdHlQcm9wZXJ0eSA9IG9EYXRhRmllbGQuQ3JpdGljYWxpdHk7XG5cdFx0Y29uc3Qgb0RhdGFGaWVsZEhpZGRlbiA9IG9EYXRhRmllbGRbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdO1xuXHRcdGlmIChvRGF0YUZpZWxkLiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFjdGlvblwiICYmICFiSXNBbHdheXNEZWZhdWx0ICYmIG9Dcml0aWNhbGl0eVByb3BlcnR5KSB7XG5cdFx0XHRpZiAoIXNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiAmJiBvRGF0YUZpZWxkSGlkZGVuID09PSB0cnVlKSB7XG5cdFx0XHRcdC8vIGlmIERhdGFGaWVsZCBpcyBzZXQgdG8gaGlkZGVuLCB3ZSBjYW4gc2tpcCBvdGhlciBjaGVja3MgYW5kIHJldHVybiBEZWZhdWx0IGJ1dHRvbiB0eXBlXG5cdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IEJ1dHRvblR5cGUuRW1waGFzaXplZDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9EYXRhRmllbGRIaWRkZW4gJiYgb0RhdGFGaWVsZEhpZGRlbi4kUGF0aCkge1xuXHRcdFx0XHQvLyB3aGVuIHZpc2liaWxpdHkgb2YgY3JpdGljYWwgYnV0dG9uIGlzIGJhc2VkIG9uIHBhdGgsIGNvbGxlY3QgYWxsIHBhdGhzIGZvciBleHByZXNzaW9uXG5cdFx0XHRcdHNIaWRkZW5TaW1wbGVQYXRoID0gb0RhdGFGaWVsZEhpZGRlbi4kUGF0aDtcblx0XHRcdFx0aWYgKHNIaWRkZW5FeHByZXNzaW9uKSB7XG5cdFx0XHRcdFx0c0hpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiArIFwiICYmIFwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNIaWRkZW5FeHByZXNzaW9uID0gc0hpZGRlbkV4cHJlc3Npb24gKyBcIiV7XCIgKyBzSGlkZGVuU2ltcGxlUGF0aCArIFwifSA9PT0gdHJ1ZVwiO1xuXHRcdFx0XHRzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gPSBcIns9IChcIiArIHNIaWRkZW5FeHByZXNzaW9uICsgXCIpID8gJ0VtcGhhc2l6ZWQnIDogJ0RlZmF1bHQnIH1cIjtcblx0XHRcdH1cblx0XHRcdHN3aXRjaCAob0NyaXRpY2FsaXR5UHJvcGVydHkuJEVudW1NZW1iZXIpIHtcblx0XHRcdFx0Ly8gc3VwcG9ydGVkIGNyaXRpY2FsaXR5IGFyZSBbUG9zaXRpdmUvMy8nMyddIGFuZCBbTmVnYXRpdmUvMS8nMSddXG5cdFx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eVR5cGUvTmVnYXRpdmVcIjpcblx0XHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9Qb3NpdGl2ZVwiOlxuXHRcdFx0XHRjYXNlIFwiMVwiOlxuXHRcdFx0XHRjYXNlIDE6XG5cdFx0XHRcdGNhc2UgXCIzXCI6XG5cdFx0XHRcdGNhc2UgMzpcblx0XHRcdFx0XHRpZiAoIW9EYXRhRmllbGRIaWRkZW4pIHtcblx0XHRcdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IEJ1dHRvblR5cGUuRGVmYXVsdDtcblx0XHRcdFx0XHRcdGJJc0Fsd2F5c0RlZmF1bHQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gPSBzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gfHwgQnV0dG9uVHlwZS5EZWZhdWx0O1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IEJ1dHRvblR5cGUuRW1waGFzaXplZDtcblx0XHRcdH1cblx0XHRcdGlmIChvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCkge1xuXHRcdFx0XHQvLyB3aGVuIENyaXRpY2FsaXR5IGlzIHNldCB1c2luZyBhIHBhdGgsIHVzZSB0aGUgcGF0aCBmb3IgZGVkdWNpbmcgdGhlIEVtcGhzaXplZCB0eXBlIGZvciBkZWZhdWx0IFByaW1hcnkgQWN0aW9uXG5cdFx0XHRcdGNvbnN0IHNDb21iaW5lZEhpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiA/IFwiIShcIiArIHNIaWRkZW5FeHByZXNzaW9uICsgXCIpICYmIFwiIDogXCJcIjtcblx0XHRcdFx0c0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uID1cblx0XHRcdFx0XHRcIns9IFwiICtcblx0XHRcdFx0XHRzQ29tYmluZWRIaWRkZW5FeHByZXNzaW9uICtcblx0XHRcdFx0XHRcIigoJHtcIiArXG5cdFx0XHRcdFx0b0NyaXRpY2FsaXR5UHJvcGVydHkuJFBhdGggK1xuXHRcdFx0XHRcdFwifSA9PT0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9OZWdhdGl2ZScpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAnMScpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAxKSBcIiArXG5cdFx0XHRcdFx0XCJ8fCAoJHtcIiArXG5cdFx0XHRcdFx0b0NyaXRpY2FsaXR5UHJvcGVydHkuJFBhdGggK1xuXHRcdFx0XHRcdFwifSA9PT0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9Qb3NpdGl2ZScpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAnMycpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAzKSkgPyBcIiArXG5cdFx0XHRcdFx0XCInRGVmYXVsdCdcIiArXG5cdFx0XHRcdFx0XCIgOiBcIiArXG5cdFx0XHRcdFx0XCInRW1waGFzaXplZCdcIiArXG5cdFx0XHRcdFx0XCIgfVwiO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gfHwgQnV0dG9uVHlwZS5FbXBoYXNpemVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRCaW5kaW5nID0gZnVuY3Rpb24gKHNQYXRoOiBhbnkpIHtcblx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIuZ2V0TmF2aWdhdGlvblBhdGgoc1BhdGgpO1xuXHRpZiAoc05hdmlnYXRpb25QYXRoKSB7XG5cdFx0cmV0dXJuIFwie3BhdGg6J1wiICsgc05hdmlnYXRpb25QYXRoICsgXCInfVwiO1xuXHR9IGVsc2Uge1xuXHRcdC8vbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBuZWVkcyBlbXB0eSBvYmplY3Rcblx0XHRyZXR1cm4gXCJ7cGF0aDogJyd9XCI7XG5cdH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2hlY2sgaWYgZHJhZnQgcGF0dGVybiBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIG9Bbm5vdGF0aW9ucyBBbm5vdGF0aW9ucyBvZiB0aGUgY3VycmVudCBlbnRpdHkgc2V0LlxuICogQHJldHVybnMgUmV0dXJucyB0aGUgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiBkcmFmdCBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgY2hlY2tEcmFmdFN0YXRlID0gZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KSB7XG5cdGlmIChcblx0XHRvQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiXSAmJlxuXHRcdG9Bbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCJdW1wiRWRpdEFjdGlvblwiXVxuXHQpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZ2V0IHRoZSB2aXNpYmlsaXR5IGZvciB0aGUgU3dpdGNoVG9BY3RpdmUgYnV0dG9uIGluIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0gb0Fubm90YXRpb25zIEFubm90YXRpb25zIG9mIHRoZSBjdXJyZW50IGVudGl0eSBzZXQuXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGJhc2VkIG9uIHRoZSBkcmFmdCBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgZ2V0U3dpdGNoVG9BY3RpdmVWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0aWYgKGNoZWNrRHJhZnRTdGF0ZShvQW5ub3RhdGlvbnMpKSB7XG5cdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICR7dWk+L2lzRWRpdGFibGV9ICYmICEke3VpPmNyZWF0ZU1vZGV9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIHZpc2liaWxpdHkgZm9yIHRoZSBTd2l0Y2hUb0RyYWZ0IGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIG9Bbm5vdGF0aW9ucyBBbm5vdGF0aW9ucyBvZiB0aGUgY3VycmVudCBlbnRpdHkgc2V0LlxuICogQHJldHVybnMgUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFN3aXRjaFRvRHJhZnRWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0aWYgKGNoZWNrRHJhZnRTdGF0ZShvQW5ub3RhdGlvbnMpKSB7XG5cdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICEoJHt1aT4vaXNFZGl0YWJsZX0pICYmICEke3VpPmNyZWF0ZU1vZGV9ICYmICR7SGFzRHJhZnRFbnRpdHl9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIHZpc2liaWxpdHkgZm9yIHRoZSBTd2l0Y2hEcmFmdEFuZEFjdGl2ZSBidXR0b24gaW4gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlLlxuICpcbiAqIEBwYXJhbSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgYmFzZWQgb24gdGhlIGRyYWZ0IHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTd2l0Y2hEcmFmdEFuZEFjdGl2ZVZpc2liaWxpdHkgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnkpOiBhbnkge1xuXHRpZiAoY2hlY2tEcmFmdFN0YXRlKG9Bbm5vdGF0aW9ucykpIHtcblx0XHRyZXR1cm4gXCJ7PSAoJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9KSA/ICggISR7dWk+Y3JlYXRlTW9kZX0gJiYgJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9ICkgOiBmYWxzZSB9XCI7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGZpbmQgYW4gYWN0aW9uIGZyb20gdGhlIGFycmF5IG9mIGhlYWRlciBhY3Rpb25zIGluIHRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mICdoZWFkZXInIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlLlxuICogQHBhcmFtIHNBY3Rpb25UeXBlIFRoZSBhY3Rpb24gdHlwZVxuICogQHJldHVybnMgVGhlIGFjdGlvbiB3aXRoIHRoZSBtYXRjaGluZyBhY3Rpb24gdHlwZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IF9maW5kQWN0aW9uID0gZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogYW55W10sIHNBY3Rpb25UeXBlOiBzdHJpbmcpIHtcblx0bGV0IG9BY3Rpb247XG5cdGlmIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgJiYgYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLmxlbmd0aCkge1xuXHRcdG9BY3Rpb24gPSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMuZmluZChmdW5jdGlvbiAob0hlYWRlckFjdGlvbjogYW55KSB7XG5cdFx0XHRyZXR1cm4gb0hlYWRlckFjdGlvbi50eXBlID09PSBzQWN0aW9uVHlwZTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gb0FjdGlvbjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgZm9yIHRoZSBEZWxldGUgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQgPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRjb25zdCBvRGVsZXRlQWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlNlY29uZGFyeVwiKTtcblx0cmV0dXJuIG9EZWxldGVBY3Rpb24gPyBvRGVsZXRlQWN0aW9uLmVuYWJsZWQgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAndmlzaWJsZScgcHJvcGVydHkgZm9yIHRoZSBEZWxldGUgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvblZpc2libGUgPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRjb25zdCBvRGVsZXRlQWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlNlY29uZGFyeVwiKTtcblx0cmV0dXJuIG9EZWxldGVBY3Rpb24gPyBvRGVsZXRlQWN0aW9uLnZpc2libGUgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAndmlzaWJsZScgcHJvcGVydHkgZm9yIHRoZSBFZGl0IGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVkaXRDb21tYW5kRXhlY3V0aW9uVmlzaWJsZSA9IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdGNvbnN0IG9FZGl0QWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlByaW1hcnlcIik7XG5cdHJldHVybiBvRWRpdEFjdGlvbiA/IG9FZGl0QWN0aW9uLnZpc2libGUgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgZm9yIHRoZSBFZGl0IGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVkaXRDb21tYW5kRXhlY3V0aW9uRW5hYmxlZCA9IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdGNvbnN0IG9FZGl0QWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlByaW1hcnlcIik7XG5cdHJldHVybiBvRWRpdEFjdGlvbiA/IG9FZGl0QWN0aW9uLmVuYWJsZWQgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZ2V0IHRoZSBFZGl0QWN0aW9uIGZyb20gdGhlIEVudGl0eXNldCBiYXNlZCBvbiBEcmFmdCBvciBzdGlja3kgYmFzZWQgYXBwbGljYXRpb24uXG4gKlxuICogQHBhcmFtIFtvRW50aXR5U2V0XSBUaGUgdmFsdWUgZnJvbSB0aGUgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIGJvb2xlYW4gdmFsdWUgYmFzZWQgb24gdlJhd1ZhbHVlICYgb0RyYWZ0Tm9kZVxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdEFjdGlvbiA9IGZ1bmN0aW9uIChvRW50aXR5U2V0OiBDb250ZXh0KSB7XG5cdGNvbnN0IHNQYXRoID0gb0VudGl0eVNldC5nZXRQYXRoKCksXG5cdFx0b0Fubm90YXRpb25zID0gb0VudGl0eVNldC5nZXRPYmplY3QoYCR7c1BhdGh9QGApO1xuXHRjb25zdCBiRHJhZnRSb290ID0gb0Fubm90YXRpb25zLmhhc093blByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIik7XG5cdGNvbnN0IGJTdGlja3lTZXNzaW9uID0gb0Fubm90YXRpb25zLmhhc093blByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFwiKTtcblx0bGV0IHNBY3Rpb25OYW1lO1xuXHRpZiAoYkRyYWZ0Um9vdCkge1xuXHRcdHNBY3Rpb25OYW1lID0gb0VudGl0eVNldC5nZXRPYmplY3QoYCR7c1BhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvRWRpdEFjdGlvbmApO1xuXHR9IGVsc2UgaWYgKGJTdGlja3lTZXNzaW9uKSB7XG5cdFx0c0FjdGlvbk5hbWUgPSBvRW50aXR5U2V0LmdldE9iamVjdChgJHtzUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL0VkaXRBY3Rpb25gKTtcblx0fVxuXHRyZXR1cm4gIXNBY3Rpb25OYW1lID8gc0FjdGlvbk5hbWUgOiBgJHtzUGF0aH0vJHtzQWN0aW9uTmFtZX1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUmVhZE9ubHlGcm9tU3RhdGljQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnksIG9GaWVsZENvbnRyb2w6IGFueSkge1xuXHRsZXQgYkNvbXB1dGVkLCBiSW1tdXRhYmxlLCBiUmVhZE9ubHk7XG5cdGlmIChvQW5ub3RhdGlvbnMgJiYgb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCJdKSB7XG5cdFx0YkNvbXB1dGVkID0gb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCJdLkJvb2wgPyBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl0uQm9vbCA9PSBcInRydWVcIiA6IHRydWU7XG5cdH1cblx0aWYgKG9Bbm5vdGF0aW9ucyAmJiBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdKSB7XG5cdFx0YkltbXV0YWJsZSA9IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0uQm9vbCA/IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0uQm9vbCA9PSBcInRydWVcIiA6IHRydWU7XG5cdH1cblx0YlJlYWRPbmx5ID0gYkNvbXB1dGVkIHx8IGJJbW11dGFibGU7XG5cblx0aWYgKG9GaWVsZENvbnRyb2wpIHtcblx0XHRiUmVhZE9ubHkgPSBiUmVhZE9ubHkgfHwgb0ZpZWxkQ29udHJvbCA9PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xUeXBlL1JlYWRPbmx5XCI7XG5cdH1cblx0aWYgKGJSZWFkT25seSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IHJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAob0ZpZWxkQ29udHJvbDogYW55KSB7XG5cdGxldCBzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHk7XG5cdGlmIChvRmllbGRDb250cm9sKSB7XG5cdFx0aWYgKChNYW5hZ2VkT2JqZWN0IGFzIGFueSkuYmluZGluZ1BhcnNlcihvRmllbGRDb250cm9sKSkge1xuXHRcdFx0c0lzRmllbGRDb250cm9sUGF0aFJlYWRPbmx5ID0gXCIlXCIgKyBvRmllbGRDb250cm9sICsgXCIgPT09IDEgXCI7XG5cdFx0fVxuXHR9XG5cdGlmIChzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkpIHtcblx0XHRyZXR1cm4gXCJ7PSBcIiArIHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSArIFwiPyBmYWxzZSA6IHRydWUgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn07XG5cbi8qXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIGNoYXJ0IFRpdGxlIFByZXNzXG4gKlxuICogQGZ1bmN0aW9ud1xuICogQHBhcmFtIHtvQ29uZmlndXJhdGlvbn0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqICBAcGFyYW0ge29NYW5pZmVzdH0gW29NYW5pZmVzdF0gT3V0Ym91bmRzIGZyb20gbWFuaWZlc3RcbiAqIHJldHVybnMge1N0cmluZ30gW3NDb2xsZWN0aW9uTmFtZV0gQ29sbGVjdGlvbiBOYW1lIG9mIHRoZSBNaWNybyBDaGFydFxuICpcbiAqIHJldHVybnMge1N0cmluZ30gW0V4cHJlc3Npb25dIEhhbmRsZXIgRXhwcmVzc2lvbiBmb3IgdGhlIHRpdGxlIHByZXNzXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvck1pY3JvQ2hhcnRUaXRsZVByZXNzID0gZnVuY3Rpb24gKG9Db25maWd1cmF0aW9uOiBhbnksIG9NYW5pZmVzdE91dGJvdW5kOiBhbnksIHNDb2xsZWN0aW9uTmFtZTogYW55KSB7XG5cdGlmIChvQ29uZmlndXJhdGlvbikge1xuXHRcdGlmIChcblx0XHRcdChvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSkgfHxcblx0XHRcdChvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSAmJiBvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XCIuaGFuZGxlcnMub25EYXRhUG9pbnRUaXRsZVByZXNzZWQoJGNvbnRyb2xsZXIsICR7JHNvdXJjZT4vfSwnXCIgK1xuXHRcdFx0XHRKU09OLnN0cmluZ2lmeShvTWFuaWZlc3RPdXRib3VuZCkgK1xuXHRcdFx0XHRcIicsJ1wiICtcblx0XHRcdFx0b0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXVtcIm91dGJvdW5kXCJdICtcblx0XHRcdFx0XCInLCdcIiArXG5cdFx0XHRcdHNDb2xsZWN0aW9uTmFtZSArXG5cdFx0XHRcdFwiJyApXCJcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRyZXR1cm4gXCIuaGFuZGxlcnMubmF2aWdhdGVUb1N1YlNlY3Rpb24oJGNvbnRyb2xsZXIsICdcIiArIEpTT04uc3RyaW5naWZ5KG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pICsgXCInKVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxufTtcblxuLypcbiAqIEZ1bmN0aW9uIHRvIHJlbmRlciBDaGFydCBUaXRsZSBhcyBMaW5rXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29Db250cm9sQ29uZmlndXJhdGlvbn0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqIHJldHVybnMge1N0cmluZ30gW3NLZXldIEZvciB0aGUgVGFyZ2V0T3V0Ym91bmQgYW5kIFRhcmdldFNlY3Rpb25cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRNaWNyb0NoYXJ0VGl0bGVBc0xpbmsgPSBmdW5jdGlvbiAob0NvbnRyb2xDb25maWd1cmF0aW9uOiBhbnkpIHtcblx0aWYgKFxuXHRcdG9Db250cm9sQ29uZmlndXJhdGlvbiAmJlxuXHRcdChvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSB8fCAob0NvbnRyb2xDb25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl0gJiYgb0NvbnRyb2xDb25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pKVxuXHQpIHtcblx0XHRyZXR1cm4gXCJFeHRlcm5hbFwiO1xuXHR9IGVsc2UgaWYgKG9Db250cm9sQ29uZmlndXJhdGlvbiAmJiBvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkge1xuXHRcdHJldHVybiBcIkluUGFnZVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIk5vbmVcIjtcblx0fVxufTtcblxuLyogR2V0IGdyb3VwSWQgZnJvbSBjb250cm9sIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuICogQHBhcmFtIHtTdHJpbmd9IFtzQW5ub3RhdGlvblBhdGhdIEFubm90YXRpb24gUGF0aCBmb3IgdGhlIGNvbmZpZ3VyYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCB0aGUgZ3JvdXBJZCBmb3IgRGF0YVBvaW50cyBhbmQgTWljcm9DaGFydHMgaW4gdGhlIEhlYWRlci5cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRHcm91cElkRnJvbUNvbmZpZyA9IGZ1bmN0aW9uIChvQ29uZmlndXJhdGlvbnM6IGFueSwgc0Fubm90YXRpb25QYXRoOiBhbnksIHNEZWZhdWx0R3JvdXBJZD86IGFueSkge1xuXHRjb25zdCBvQ29uZmlndXJhdGlvbiA9IG9Db25maWd1cmF0aW9uc1tzQW5ub3RhdGlvblBhdGhdLFxuXHRcdGFBdXRvUGF0dGVybnMgPSBbXCJIZXJvZXNcIiwgXCJEZWNvcmF0aW9uXCIsIFwiV29ya2Vyc1wiLCBcIkxvbmdSdW5uZXJzXCJdO1xuXHRsZXQgc0dyb3VwSWQgPSBzRGVmYXVsdEdyb3VwSWQ7XG5cdGlmIChcblx0XHRvQ29uZmlndXJhdGlvbiAmJlxuXHRcdG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkICYmXG5cdFx0YUF1dG9QYXR0ZXJucy5zb21lKGZ1bmN0aW9uIChhdXRvUGF0dGVybjogc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gYXV0b1BhdHRlcm4gPT09IG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkO1xuXHRcdH0pXG5cdCkge1xuXHRcdHNHcm91cElkID0gXCIkYXV0by5cIiArIG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkO1xuXHR9XG5cdHJldHVybiBzR3JvdXBJZDtcbn07XG5cbi8qXG4gKiBHZXQgQ29udGV4dCBCaW5kaW5nIHdpdGggZ3JvdXBJZCBmcm9tIGNvbnRyb2wgY29uZmlndXJhdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtPYmplY3R9IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG4gKiBAcGFyYW0ge1N0cmluZ30gW3NLZXldIEFubm90YXRpb24gUGF0aCBmb3Igb2YgdGhlIGNvbmZpZ3VyYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCB0aGUgYmluZGluZyBmb3IgRGF0YVBvaW50cyBpbiB0aGUgSGVhZGVyLlxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWcgPSBmdW5jdGlvbiAob0NvbmZpZ3VyYXRpb25zOiBhbnksIHNLZXk6IGFueSkge1xuXHRjb25zdCBzR3JvdXBJZCA9IGdldEdyb3VwSWRGcm9tQ29uZmlnKG9Db25maWd1cmF0aW9ucywgc0tleSk7XG5cdGxldCBzQmluZGluZztcblx0aWYgKHNHcm91cElkKSB7XG5cdFx0c0JpbmRpbmcgPSBcInsgcGF0aCA6ICcnLCBwYXJhbWV0ZXJzIDogeyAkJGdyb3VwSWQgOiAnXCIgKyBzR3JvdXBJZCArIFwiJyB9IH1cIjtcblx0fVxuXHRyZXR1cm4gc0JpbmRpbmc7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGEgRmllbGRHcm91cCBjb25zaXN0cyBvZiBvbmx5IDEgRGF0YUZpZWxkIHdpdGggTXVsdGlMaW5lIFRleHQgYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0gYUZvcm1FbGVtZW50cyBBIGNvbGxlY3Rpb24gb2YgZm9ybSBlbGVtZW50cyB1c2VkIGluIHRoZSBjdXJyZW50IGZpZWxkIGdyb3VwXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgb25seSAxIGRhdGEgZmllbGQgd2l0aCBNdWx0aWxpbmUgVGV4dCBhbm5vdGF0aW9uIGV4aXN0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGRvZXNGaWVsZEdyb3VwQ29udGFpbk9ubHlPbmVNdWx0aUxpbmVEYXRhRmllbGQgPSBmdW5jdGlvbiAoYUZvcm1FbGVtZW50czogYW55W10pIHtcblx0cmV0dXJuIGFGb3JtRWxlbWVudHMgJiYgYUZvcm1FbGVtZW50cy5sZW5ndGggPT09IDEgJiYgISFhRm9ybUVsZW1lbnRzWzBdLmlzVmFsdWVNdWx0aWxpbmVUZXh0O1xufTtcblxuLypcbiAqIEdldCBWaXNpYmxpdHkgb2YgYnJlYWRjcnVtYnMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gW29WaWV3RGF0YV0gVmlld0RhdGEgbW9kZWxcbiAqIHJldHVybnMgeyp9IEV4cHJlc3Npb24gb3IgYm9vbGVhblxuICovXG5leHBvcnQgY29uc3QgZ2V0VmlzaWJsZUV4cHJlc3Npb25Gb3JCcmVhZGNydW1icyA9IGZ1bmN0aW9uIChvVmlld0RhdGE6IGFueSkge1xuXHRyZXR1cm4gb1ZpZXdEYXRhLnNob3dCcmVhZENydW1icyAmJiBvVmlld0RhdGEuZmNsRW5hYmxlZCAhPT0gdW5kZWZpbmVkID8gXCJ7ZmNsaGVscGVyPi9icmVhZENydW1iSXNWaXNpYmxlfVwiIDogb1ZpZXdEYXRhLnNob3dCcmVhZENydW1icztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTaGFyZUJ1dHRvblZpc2liaWxpdHkgPSBmdW5jdGlvbiAodmlld0RhdGE6IGFueSkge1xuXHRsZXQgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCA9IFwiISR7dWk+Y3JlYXRlTW9kZX1cIjtcblx0aWYgKHZpZXdEYXRhLmZjbEVuYWJsZWQpIHtcblx0XHRzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwID0gXCIke2ZjbGhlbHBlcj4vc2hvd1NoYXJlSWNvbn0gJiYgXCIgKyBzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwO1xuXHR9XG5cdHJldHVybiBcIns9IFwiICsgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCArIFwiIH1cIjtcbn07XG5cbi8qXG4gKiBHZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBoZWFkZXIgaW5mbyBpbiBlZGl0IG1vZGVcbiAqXG4gKiBJZiBlaXRoZXIgdGhlIHRpdGxlIG9yIGRlc2NyaXB0aW9uIGZpZWxkIGZyb20gdGhlIGhlYWRlciBhbm5vdGF0aW9ucyBhcmUgZWRpdGFibGUsIHRoZW4gdGhlXG4gKiBlZGl0YWJsZSBoZWFkZXIgaW5mbyBpcyB2aXNpYmxlLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvQW5ub3RhdGlvbnNdIEFubm90YXRpb25zIG9iamVjdCBmb3IgZ2l2ZW4gZW50aXR5IHNldFxuICogQHBhcmFtIHtvYmplY3R9IFtvRmllbGRDb250cm9sXSBmaWVsZCBjb250cm9sXG4gKiByZXR1cm5zIHsqfSAgYmluZGluZyBleHByZXNzaW9uIG9yIGJvb2xlYW4gdmFsdWUgcmVzb2x2ZWQgZm9ybSBmdW5jaXRvbnMgaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyBhbmQgaXNSZWFkT25seUZyb21EeW5hbWljQW5ub3RhdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFZpc2libGl0eU9mSGVhZGVySW5mbyA9IGZ1bmN0aW9uIChcblx0b1RpdGxlQW5ub3RhdGlvbnM6IGFueSxcblx0b0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnM6IGFueSxcblx0b0ZpZWxkVGl0bGVGaWVsZENvbnRyb2w6IGFueSxcblx0b0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2w6IGFueVxuKSB7XG5cdC8vIENoZWNrIEFubm90YXRpb25zIGZvciBUaXRsZSBGaWVsZFxuXHQvLyBTZXQgdG8gdHJ1ZSBhbmQgZG9uJ3QgdGFrZSBpbnRvIGFjY291bnQsIGlmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucywgaS5lLiBubyB0aXRsZSBleGlzdHNcblx0Y29uc3QgYklzVGl0bGVSZWFkT25seSA9IG9UaXRsZUFubm90YXRpb25zID8gaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyhvVGl0bGVBbm5vdGF0aW9ucywgb0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wpIDogdHJ1ZTtcblx0Y29uc3QgdGl0bGVFeHByZXNzaW9uID0gcmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyhvRmllbGRUaXRsZUZpZWxkQ29udHJvbCk7XG5cdC8vIFRoZXJlIGlzIG5vIGV4cHJlc3Npb24gYW5kIHRoZSB0aXRsZSBpcyBub3QgcmVhZHkgb25seSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhbiBlZGl0YWJsZSBoZWFkZXJcblx0aWYgKCFiSXNUaXRsZVJlYWRPbmx5ICYmICF0aXRsZUV4cHJlc3Npb24pIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIENoZWNrIEFubm90YXRpb25zIGZvciBEZXNjcmlwdGlvbiBGaWVsZFxuXHQvLyBTZXQgdG8gdHJ1ZSBhbmQgZG9uJ3QgdGFrZSBpbnRvIGFjY291bnQsIGlmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucywgaS5lLiBubyBkZXNjcmlwdGlvbiBleGlzdHNcblx0Y29uc3QgYklzRGVzY3JpcHRpb25SZWFkT25seSA9IG9EZXNjcmlwdGlvbkFubm90YXRpb25zXG5cdFx0PyBpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zKG9EZXNjcmlwdGlvbkFubm90YXRpb25zLCBvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbClcblx0XHQ6IHRydWU7XG5cdGNvbnN0IGRlc2NyaXB0aW9uRXhwcmVzc2lvbiA9IHJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMob0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2wpO1xuXHQvLyBUaGVyZSBpcyBubyBleHByZXNzaW9uIGFuZCB0aGUgZGVzY3JpcHRpb24gaXMgbm90IHJlYWR5IG9ubHksIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYW4gZWRpdGFibGUgaGVhZGVyXG5cdGlmICghYklzRGVzY3JpcHRpb25SZWFkT25seSAmJiAhZGVzY3JpcHRpb25FeHByZXNzaW9uKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyBCb3RoIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBhcmUgbm90IGVkaXRhYmxlIGFuZCB0aGVyZSBhcmUgbm8gZHluYW1pYyBhbm5vdGF0aW9uc1xuXHRpZiAoYklzVGl0bGVSZWFkT25seSAmJiBiSXNEZXNjcmlwdGlvblJlYWRPbmx5ICYmICF0aXRsZUV4cHJlc3Npb24gJiYgIWRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIE5vdyBjb21iaW5lIGV4cHJlc3Npb25zXG5cdGlmICh0aXRsZUV4cHJlc3Npb24gJiYgIWRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiB0aXRsZUV4cHJlc3Npb247XG5cdH0gZWxzZSBpZiAoIXRpdGxlRXhwcmVzc2lvbiAmJiBkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRyZXR1cm4gZGVzY3JpcHRpb25FeHByZXNzaW9uO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21iaW5lVGl0bGVBbmREZXNjcmlwdGlvbkV4cHJlc3Npb24ob0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wsIG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKTtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGNvbWJpbmVUaXRsZUFuZERlc2NyaXB0aW9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChvVGl0bGVGaWVsZENvbnRyb2w6IGFueSwgb0Rlc2NyaXB0aW9uRmllbGRDb250cm9sOiBhbnkpIHtcblx0Ly8gSWYgYm90aCBoZWFkZXIgYW5kIHRpdGxlIGZpZWxkIGFyZSBiYXNlZCBvbiBkeW5tYWljIGZpZWxkIGNvbnRyb2wsIHRoZSBlZGl0YWJsZSBoZWFkZXJcblx0Ly8gaXMgdmlzaWJsZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgaXMgbm90IHJlYWR5IG9ubHlcblx0cmV0dXJuIFwiez0gJVwiICsgb1RpdGxlRmllbGRDb250cm9sICsgXCIgPT09IDEgPyAoICVcIiArIG9EZXNjcmlwdGlvbkZpZWxkQ29udHJvbCArIFwiID09PSAxID8gZmFsc2UgOiB0cnVlICkgOiB0cnVlIH1cIjtcbn07XG5cbi8qXG4gKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBvZiBkZWxldGUgYnV0dG9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IFtzRW50aXR5U2V0TmFtZV0gRW50aXR5IHNldCBuYW1lXG4gKiByZXR1cm5zIHtzdHJpbmd9ICBiaW5kaW5nIGV4cHJlc3Npb24gLyBmdW5jdGlvbiBzdHJpbmcgZ2VuZXJhdGVkIGZyb20gY29tbWFuaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJlc3NFeHByZXNzaW9uRm9yRGVsZXRlID0gZnVuY3Rpb24gKHNFbnRpdHlTZXROYW1lOiBhbnkpIHtcblx0Y29uc3Qgc0RlbGV0YWJsZUNvbnRleHRzID0gXCIkeyR2aWV3Pi9nZXRCaW5kaW5nQ29udGV4dH1cIixcblx0XHRzVGl0bGUgPSBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS9nZXRIZWFkZXJUaXRsZS9nZXRFeHBhbmRlZEhlYWRpbmcvZ2V0SXRlbXMvMS9nZXRUZXh0fVwiLFxuXHRcdHNEZXNjcmlwdGlvbiA9IFwiJHskdmlldz4vI2ZlOjpPYmplY3RQYWdlL2dldEhlYWRlclRpdGxlL2dldEV4cGFuZGVkQ29udGVudC8wL2dldEl0ZW1zLzAvZ2V0VGV4dH1cIjtcblx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHR0aXRsZTogc1RpdGxlLFxuXHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdGRlc2NyaXB0aW9uOiBzRGVzY3JpcHRpb25cblx0fTtcblx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFwiLmVkaXRGbG93LmRlbGV0ZURvY3VtZW50XCIsIHNEZWxldGFibGVDb250ZXh0cywgQ29tbW9uSGVscGVyLm9iamVjdFRvU3RyaW5nKG9QYXJhbXMpKTtcbn07XG5cbi8qXG4gKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBvZiBFZGl0IGJ1dHRvbi5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0RhdGFGaWVsZF0gRGF0YSBmaWVsZCBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc0VudGl0eVNldE5hbWVdIEVudGl0eSBzZXQgbmFtZVxuICogQHBhcmFtIHtvYmplY3R9IFtvSGVhZGVyQWN0aW9uXSBIZWFkZXIgYWN0aW9uIG9iamVjdFxuICogcmV0dXJucyB7c3RyaW5nfSAgYmluZGluZyBleHByZXNzaW9uIC8gZnVuY3Rpb24gc3RyaW5nIGdlbmVyYXRlZCBmcm9tIGNvbW1hbmhlbHBlcidzIGZ1bmN0aW9uIGdlbmVyYXRlRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByZXNzRXhwcmVzc2lvbkZvckVkaXQgPSBmdW5jdGlvbiAob0RhdGFGaWVsZDogYW55LCBzRW50aXR5U2V0TmFtZTogYW55LCBvSGVhZGVyQWN0aW9uOiBhbnkpIHtcblx0Y29uc3Qgc0VkaXRhYmxlQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+L2dldEJpbmRpbmdDb250ZXh0fVwiLFxuXHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRtb2RlbDogXCIkeyRzb3VyY2U+L30uZ2V0TW9kZWwoKVwiLFxuXHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5MYWJlbCwgdHJ1ZSksXG5cdFx0aXNOYXZpZ2FibGU6IG9IZWFkZXJBY3Rpb24gJiYgb0hlYWRlckFjdGlvbi5pc05hdmlnYWJsZSxcblx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246XG5cdFx0XHRvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uID8gYCcke29IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9ufSdgIDogdW5kZWZpbmVkXG5cdH07XG5cdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcIi5oYW5kbGVycy5vbkNhbGxBY3Rpb25cIiwgXCIkeyR2aWV3Pi99XCIsIHNFZGl0YWJsZUNvbnRleHRzLCBDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcob1BhcmFtcykpO1xufTtcblxuLypcbiAqIE1ldGhvZCB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSAncHJlc3MnIGV2ZW50IGZvciBmb290ZXIgYW5ub3RhdGlvbiBhY3Rpb25zXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gW29EYXRhRmllbGRdIERhdGEgZmllbGQgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gW3NFbnRpdHlTZXROYW1lXSBFbnRpdHkgc2V0IG5hbWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckFjdGlvbl0gSGVhZGVyIGFjdGlvbiBvYmplY3RcbiAqIHJldHVybnMge3N0cmluZ30gIEJpbmRpbmcgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiBzdHJpbmcgdGhhdCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgQ29tbW9uaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJlc3NFeHByZXNzaW9uRm9yRm9vdGVyQW5ub3RhdGlvbkFjdGlvbiA9IGZ1bmN0aW9uIChvRGF0YUZpZWxkOiBhbnksIHNFbnRpdHlTZXROYW1lOiBhbnksIG9IZWFkZXJBY3Rpb246IGFueSkge1xuXHRjb25zdCBzQWN0aW9uQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS99LmdldEJpbmRpbmdDb250ZXh0KClcIixcblx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNFbnRpdHlTZXROYW1lKSxcblx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0ludm9jYXRpb25Hcm91cCksXG5cdFx0bW9kZWw6IFwiJHskc291cmNlPi99LmdldE1vZGVsKClcIixcblx0XHRsYWJlbDogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuTGFiZWwsIHRydWUpLFxuXHRcdGlzTmF2aWdhYmxlOiBvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uaXNOYXZpZ2FibGUsXG5cdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOlxuXHRcdFx0b0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiA/IGAnJHtvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbn0nYCA6IHVuZGVmaW5lZFxuXHR9O1xuXHRyZXR1cm4gQ29tbW9uSGVscGVyLmdlbmVyYXRlRnVuY3Rpb24oXCIuaGFuZGxlcnMub25DYWxsQWN0aW9uXCIsIFwiJHskdmlldz4vfVwiLCBzQWN0aW9uQ29udGV4dHMsIENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKSk7XG59O1xuXG4vKlxuICogR2V0cyB0aGUgYmluZGluZyBvZiB0aGUgY29udGFpbmVyIEhCb3ggZm9yIHRoZSBoZWFkZXIgZmFjZXQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gW29Db250cm9sQ29uZmlndXJhdGlvbl0gVGhlIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmb3JtIG9mIHRoZSB2aWV3RGF0YSBtb2RlbFxuICogQHBhcmFtIHtvYmplY3R9IFtvSGVhZGVyRmFjZXRdIFRoZSBvYmplY3Qgb2YgdGhlIGhlYWRlciBmYWNldFxuICogcmV0dXJucyB7Kn0gIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZnJvbSBmdW5jdGlvbiBnZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnIG9yIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFN0YXNoYWJsZUhCb3hCaW5kaW5nID0gZnVuY3Rpb24gKG9Db250cm9sQ29uZmlndXJhdGlvbjogYW55LCBvSGVhZGVyRmFjZXQ6IGFueSkge1xuXHRpZiAob0hlYWRlckZhY2V0ICYmIG9IZWFkZXJGYWNldC5GYWNldCAmJiBvSGVhZGVyRmFjZXQuRmFjZXQudGFyZ2V0QW5ub3RhdGlvblR5cGUgPT09IFwiRGF0YVBvaW50XCIpIHtcblx0XHRyZXR1cm4gZ2V0QmluZGluZ1dpdGhHcm91cElkRnJvbUNvbmZpZyhvQ29udHJvbENvbmZpZ3VyYXRpb24sIG9IZWFkZXJGYWNldC5GYWNldC50YXJnZXRBbm5vdGF0aW9uVmFsdWUpO1xuXHR9XG59O1xuXG4vKlxuICogR2V0cyB0aGUgJ1ByZXNzJyBldmVudCBleHByZXNzaW9uIGZvciB0aGUgZXh0ZXJuYWwgYW5kIGludGVybmFsIGRhdGEgcG9pbnQgbGluay5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0NvbmZpZ3VyYXRpb25dIENvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG4gKiBAcGFyYW0ge29iamVjdH0gW29NYW5pZmVzdE91dGJvdW5kXSBPdXRib3VuZHMgZnJvbSBtYW5pZmVzdFxuICogcmV0dXJucyB7c3RyaW5nfSBUaGUgcnVudGltZSBiaW5kaW5nIG9mIHRoZSAnUHJlc3MnIGV2ZW50XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQcmVzc0V4cHJlc3Npb25Gb3JMaW5rID0gZnVuY3Rpb24gKG9Db25maWd1cmF0aW9uOiBhbnksIG9NYW5pZmVzdE91dGJvdW5kOiBhbnkpIHtcblx0aWYgKG9Db25maWd1cmF0aW9uKSB7XG5cdFx0aWYgKG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl0gJiYgb0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXVtcIm91dGJvdW5kXCJdKSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcIi5oYW5kbGVycy5vbkRhdGFQb2ludFRpdGxlUHJlc3NlZCgkY29udHJvbGxlciwgJHskc291cmNlPn0sIFwiICtcblx0XHRcdFx0SlNPTi5zdHJpbmdpZnkob01hbmlmZXN0T3V0Ym91bmQpICtcblx0XHRcdFx0XCIsXCIgK1xuXHRcdFx0XHRKU09OLnN0cmluZ2lmeShvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pICtcblx0XHRcdFx0XCIpXCJcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRyZXR1cm4gXCIuaGFuZGxlcnMubmF2aWdhdGVUb1N1YlNlY3Rpb24oJGNvbnRyb2xsZXIsICdcIiArIEpTT04uc3RyaW5naWZ5KG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pICsgXCInKVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEhlYWRlckZvcm1IYm94UmVuZGVyVHlwZSA9IGZ1bmN0aW9uIChkYXRhRmllbGQ6IERhdGFNb2RlbE9iamVjdFBhdGgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoZGF0YUZpZWxkPy50YXJnZXRPYmplY3Q/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRyZXR1cm4gXCJCYXJlXCI7XG59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
933
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdXR0b25UeXBlIiwibUxpYnJhcnkiLCJnZXRFeHByZXNzaW9uRm9yVGl0bGUiLCJvSGVhZGVySW5mbyIsIm9WaWV3RGF0YSIsImZ1bGxDb250ZXh0UGF0aCIsIm9EcmFmdFJvb3QiLCJ0aXRsZU5vSGVhZGVySW5mbyIsIkNvbW1vblV0aWxzIiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJyZXNvdXJjZUJ1bmRsZSIsInVuZGVmaW5lZCIsImVudGl0eVNldCIsInRpdGxlV2l0aEhlYWRlckluZm8iLCJvRW1wdHlIZWFkZXJJbmZvVGl0bGUiLCJUaXRsZSIsIlZhbHVlIiwidGl0bGVGb3JBY3RpdmVIZWFkZXJOb0hlYWRlckluZm8iLCJ0aXRsZVZhbHVlRXhwcmVzc2lvbiIsImNvbm5lY3RlZEZpZWxkc1BhdGgiLCJ0aXRsZUlzRW1wdHkiLCJjb25zdGFudCIsInRpdGxlQm9vbGVhbkV4cHJlc3Npb24iLCIkVHlwZSIsImdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbiIsIiR0YXJnZXQiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRleHQiLCJVSSIsIlRleHRBcnJhbmdlbWVudCIsImFkZFRleHRBcnJhbmdlbWVudFRvQmluZGluZ0V4cHJlc3Npb24iLCJmb3JtYXRWYWx1ZVJlY3Vyc2l2ZWx5IiwiX3R5cGUiLCJ2YWx1ZSIsImlzRW1wdHkiLCJUYXJnZXQiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsImdldExhYmVsRm9yQ29ubmVjdGVkRmllbGRzIiwiY3JlYXRlTW9kZVRpdGxlIiwiVHlwZU5hbWUiLCJjb25jYXQiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsInRvU3RyaW5nIiwiYWN0aXZlRXhwcmVzc2lvbiIsIkVudGl0eSIsIklzQWN0aXZlIiwiY29tcGlsZUV4cHJlc3Npb24iLCJpZkVsc2UiLCJhbmQiLCJvciIsIklzQ3JlYXRlTW9kZVN0aWNreSIsIklzQ3JlYXRlTW9kZSIsImdldEV4cHJlc3Npb25Gb3JEZXNjcmlwdGlvbiIsInBhdGhJbk1vZGVsIiwiRGVzY3JpcHRpb24iLCJnZXRFeHByZXNzaW9uRm9yU2F2ZUJ1dHRvbiIsInNhdmVCdXR0b25UZXh0IiwiY3JlYXRlQnV0dG9uVGV4dCIsInNhdmVFeHByZXNzaW9uIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsIkRyYWZ0IiwiSXNOZXdPYmplY3QiLCJnZXRGb290ZXJWaXNpYmxlIiwiZm9vdGVyQWN0aW9ucyIsImRhdGFGaWVsZHMiLCJtYW5pZmVzdEFjdGlvbnMiLCJmaWx0ZXIiLCJhY3Rpb24iLCJpc01hbmlmZXN0QWN0aW9uIiwiY3VzdG9tQWN0aW9uVmlzaWJpbGl0eSIsImxlbmd0aCIsImN1c3RvbUFjdGlvbkluZGl2aWR1YWxWaXNpYmlsaXR5IiwibWFwIiwidmlzaWJsZSIsImFubm90YXRpb25BY3Rpb25WaXNpYmlsaXR5IiwiZ2V0RGF0YUZpZWxkQmFzZWRGb290ZXJWaXNpYmlsaXR5IiwiYURhdGFGaWVsZHMiLCJiQ29uc2lkZXJFZGl0YWJsZSIsInNIaWRkZW5FeHByZXNzaW9uIiwic1NlbWlIaWRkZW5FeHByZXNzaW9uIiwiYUhpZGRlbkFjdGlvblBhdGgiLCJpIiwib0RhdGFGaWVsZCIsIkRldGVybWluaW5nIiwiaGlkZGVuRXhwcmVzc2lvbiIsIiRQYXRoIiwiaW5kZXhPZiIsInB1c2giLCJpbmRleCIsIm9BY3Rpb24iLCJhQWN0aW9ucyIsInR5cGUiLCJidWlsZEVtcGhhc2l6ZWRCdXR0b25FeHByZXNzaW9uIiwiYUlkZW50aWZpY2F0aW9uIiwiRW1waGFzaXplZCIsInNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiIsImJJc0Fsd2F5c0RlZmF1bHQiLCJzSGlkZGVuU2ltcGxlUGF0aCIsImZvckVhY2giLCJvQ3JpdGljYWxpdHlQcm9wZXJ0eSIsIkNyaXRpY2FsaXR5Iiwib0RhdGFGaWVsZEhpZGRlbiIsIiRFbnVtTWVtYmVyIiwiRGVmYXVsdCIsInNDb21iaW5lZEhpZGRlbkV4cHJlc3Npb24iLCJnZXRFbGVtZW50QmluZGluZyIsInNQYXRoIiwic05hdmlnYXRpb25QYXRoIiwiT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIiLCJnZXROYXZpZ2F0aW9uUGF0aCIsImNoZWNrRHJhZnRTdGF0ZSIsIm9Bbm5vdGF0aW9ucyIsImdldFN3aXRjaFRvQWN0aXZlVmlzaWJpbGl0eSIsImdldFN3aXRjaFRvRHJhZnRWaXNpYmlsaXR5IiwiZ2V0U3dpdGNoRHJhZnRBbmRBY3RpdmVWaXNpYmlsaXR5IiwiX2ZpbmRBY3Rpb24iLCJhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMiLCJzQWN0aW9uVHlwZSIsImZpbmQiLCJvSGVhZGVyQWN0aW9uIiwiZ2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQiLCJvRGVsZXRlQWN0aW9uIiwiZW5hYmxlZCIsImdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25WaXNpYmxlIiwiZ2V0RWRpdENvbW1hbmRFeGVjdXRpb25WaXNpYmxlIiwib0VkaXRBY3Rpb24iLCJnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQiLCJnZXRFZGl0QWN0aW9uIiwib0VudGl0eVNldCIsImdldFBhdGgiLCJnZXRPYmplY3QiLCJiRHJhZnRSb290IiwiaGFzT3duUHJvcGVydHkiLCJiU3RpY2t5U2Vzc2lvbiIsInNBY3Rpb25OYW1lIiwiaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyIsIm9GaWVsZENvbnRyb2wiLCJiQ29tcHV0ZWQiLCJiSW1tdXRhYmxlIiwiYlJlYWRPbmx5IiwiQm9vbCIsInJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMiLCJzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkiLCJNYW5hZ2VkT2JqZWN0IiwiYmluZGluZ1BhcnNlciIsImdldEV4cHJlc3Npb25Gb3JNaWNyb0NoYXJ0VGl0bGVQcmVzcyIsIm9Db25maWd1cmF0aW9uIiwib01hbmlmZXN0T3V0Ym91bmQiLCJzQ29sbGVjdGlvbk5hbWUiLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0TWljcm9DaGFydFRpdGxlQXNMaW5rIiwib0NvbnRyb2xDb25maWd1cmF0aW9uIiwiZ2V0R3JvdXBJZEZyb21Db25maWciLCJvQ29uZmlndXJhdGlvbnMiLCJzQW5ub3RhdGlvblBhdGgiLCJzRGVmYXVsdEdyb3VwSWQiLCJhQXV0b1BhdHRlcm5zIiwic0dyb3VwSWQiLCJyZXF1ZXN0R3JvdXBJZCIsInNvbWUiLCJhdXRvUGF0dGVybiIsImdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWciLCJzS2V5Iiwic0JpbmRpbmciLCJkb2VzRmllbGRHcm91cENvbnRhaW5Pbmx5T25lTXVsdGlMaW5lRGF0YUZpZWxkIiwiYUZvcm1FbGVtZW50cyIsImlzVmFsdWVNdWx0aWxpbmVUZXh0IiwiZ2V0VmlzaWJsZUV4cHJlc3Npb25Gb3JCcmVhZGNydW1icyIsInNob3dCcmVhZENydW1icyIsImZjbEVuYWJsZWQiLCJnZXRTaGFyZUJ1dHRvblZpc2liaWxpdHkiLCJ2aWV3RGF0YSIsInNTaGFyZUJ1dHRvblZpc2liaWxpdHlFeHAiLCJnZXRWaXNpYmxpdHlPZkhlYWRlckluZm8iLCJvVGl0bGVBbm5vdGF0aW9ucyIsIm9EZXNjcmlwdGlvbkFubm90YXRpb25zIiwib0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wiLCJvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbCIsImJJc1RpdGxlUmVhZE9ubHkiLCJ0aXRsZUV4cHJlc3Npb24iLCJiSXNEZXNjcmlwdGlvblJlYWRPbmx5IiwiZGVzY3JpcHRpb25FeHByZXNzaW9uIiwiY29tYmluZVRpdGxlQW5kRGVzY3JpcHRpb25FeHByZXNzaW9uIiwib1RpdGxlRmllbGRDb250cm9sIiwib0Rlc2NyaXB0aW9uRmllbGRDb250cm9sIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRGVsZXRlIiwic0VudGl0eVNldE5hbWUiLCJzRGVsZXRhYmxlQ29udGV4dHMiLCJzVGl0bGUiLCJzRGVzY3JpcHRpb24iLCJvUGFyYW1zIiwidGl0bGUiLCJlbnRpdHlTZXROYW1lIiwiQ29tbW9uSGVscGVyIiwiYWRkU2luZ2xlUXVvdGVzIiwiZGVzY3JpcHRpb24iLCJnZW5lcmF0ZUZ1bmN0aW9uIiwib2JqZWN0VG9TdHJpbmciLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JFZGl0Iiwic0VkaXRhYmxlQ29udGV4dHMiLCJBY3Rpb24iLCJzRGF0YUZpZWxkRW51bU1lbWJlciIsIkludm9jYXRpb25Hcm91cGluZyIsInNJbnZvY2F0aW9uR3JvdXAiLCJjb250ZXh0cyIsImludm9jYXRpb25Hcm91cGluZyIsIm1vZGVsIiwibGFiZWwiLCJMYWJlbCIsImlzTmF2aWdhYmxlIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRm9vdGVyQW5ub3RhdGlvbkFjdGlvbiIsInNBY3Rpb25Db250ZXh0cyIsImdldFByZXNzRXhwcmVzc2lvbkZvclByaW1hcnlBY3Rpb24iLCJwb3NpdGl2ZUFjdGlvblZpc2libGUiLCJwb3NpdGl2ZUFjdGlvbkVuYWJsZWQiLCJlZGl0QWN0aW9uVmlzaWJsZSIsImVkaXRBY3Rpb25FbmFibGVkIiwib0NvbmRpdGlvbnMiLCJnZXRTdGFzaGFibGVIQm94QmluZGluZyIsIm9IZWFkZXJGYWNldCIsIkZhY2V0IiwidGFyZ2V0QW5ub3RhdGlvblR5cGUiLCJ0YXJnZXRBbm5vdGF0aW9uVmFsdWUiLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JMaW5rIiwiZ2V0SGVhZGVyRm9ybUhib3hSZW5kZXJUeXBlIiwiZGF0YUZpZWxkIiwidGFyZ2V0T2JqZWN0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJPYmplY3RQYWdlVGVtcGxhdGluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGb3JtYXR0ZXJzIGZvciB0aGUgT2JqZWN0IFBhZ2VcbmltcG9ydCB7IEVudGl0eVNldCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhRmllbGQsIERhdGFGaWVsZFR5cGVzLCBIZWFkZXJJbmZvVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblRlcm1zLCBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VBY3Rpb24sIENvbnZlcnRlckFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9BY3Rpb25cIjtcbmltcG9ydCB7IERyYWZ0LCBFbnRpdHksIFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0QWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHtcblx0YW5kLFxuXHRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRjb21waWxlRXhwcmVzc2lvbixcblx0Y29uY2F0LFxuXHRjb25zdGFudCxcblx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uLFxuXHRpZkVsc2UsXG5cdGlzRW1wdHksXG5cdG9yLFxuXHRyZXNvbHZlQmluZGluZ1N0cmluZ1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZW5oYW5jZURhdGFNb2RlbFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgQ29tbW9uSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IHsgYWRkVGV4dEFycmFuZ2VtZW50VG9CaW5kaW5nRXhwcmVzc2lvbiwgZm9ybWF0VmFsdWVSZWN1cnNpdmVseSB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkVGVtcGxhdGluZ1wiO1xuaW1wb3J0IHsgZ2V0TGFiZWxGb3JDb25uZWN0ZWRGaWVsZHMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC9mb3JtL0Zvcm1UZW1wbGF0aW5nXCI7XG5pbXBvcnQgbUxpYnJhcnkgZnJvbSBcInNhcC9tL2xpYnJhcnlcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Bbm5vdGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG5jb25zdCBCdXR0b25UeXBlID0gbUxpYnJhcnkuQnV0dG9uVHlwZTtcblxudHlwZSBWaWV3RGF0YSA9IHtcblx0cmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlO1xuXHRlbnRpdHlTZXQ6IHN0cmluZztcbn07XG5cbi8vYGBgbWVybWFpZFxuLy8gZ3JhcGggVERcbi8vIEFbT2JqZWN0IFBhZ2UgVGl0bGVdIC0tPnxHZXQgRGF0YUZpZWxkIFZhbHVlfCBDe0V2YWx1YXRlIENyZWF0ZSBNb2RlfVxuLy8gQyAtLT58SW4gQ3JlYXRlIE1vZGV8IER7SXMgRGF0YUZpZWxkIFZhbHVlIGVtcHR5fVxuLy8gRCAtLT58WWVzfCBGe0lzIHRoZXJlIGEgVHlwZU5hbWV9XG4vLyBGIC0tPnxZZXN8IEdbSXMgdGhlcmUgYW4gY3VzdG9tIHRpdGxlXVxuLy8gRyAtLT58WWVzfCBHMVtTaG93IHRoZSBjdXN0b20gdGl0bGUgKyAnVHlwZU5hbWUnXVxuLy8gRyAtLT58Tm98IEcyW0Rpc3BsYXkgdGhlIGRlZmF1bHQgdGl0bGUgJ05ldyArIFR5cGVOYW1lJ11cbi8vIEYgLS0+fE5vfCBIW0lzIHRoZXJlIGEgY3VzdG9tIHRpdGxlXVxuLy8gSCAtLT58WWVzfCBJW1Nob3cgdGhlIGN1c3RvbSB0aXRsZV1cbi8vIEggLS0+fE5vfCBKW1Nob3cgdGhlIGRlZmF1bHQgJ1VuYW1uZWQgT2JqZWN0J11cbi8vIEQgLS0+fE5vfCBFXG4vLyBDIC0tPnxOb3QgaW4gY3JlYXRlIG1vZGV8IEVbU2hvdyBEYXRhRmllbGQgVmFsdWVdXG4vLyBgYGBcbi8qKlxuICogQ29tcHV0ZSB0aGUgdGl0bGUgZm9yIHRoZSBvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0gb0hlYWRlckluZm8gVGhlIEBVSS5IZWFkZXJJbmZvIGFubm90YXRpb24gY29udGVudFxuICogQHBhcmFtIG9WaWV3RGF0YSBUaGUgdmlldyBkYXRhIG9iamVjdCB3ZSdyZSBjdXJyZW50bHkgb25cbiAqIEBwYXJhbSBmdWxsQ29udGV4dFBhdGggVGhlIGZ1bGwgY29udGV4dCBwYXRoIHVzZWQgdG8gcmVhY2ggdGhhdCBvYmplY3QgcGFnZVxuICogQHBhcmFtIG9EcmFmdFJvb3RcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBvYmplY3QgcGFnZSB0aXRsZVxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvclRpdGxlID0gZnVuY3Rpb24gKFxuXHRvSGVhZGVySW5mbzogSGVhZGVySW5mb1R5cGUgfCB1bmRlZmluZWQsXG5cdG9WaWV3RGF0YTogVmlld0RhdGEsXG5cdGZ1bGxDb250ZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0b0RyYWZ0Um9vdDogT2JqZWN0IHwgdW5kZWZpbmVkXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IHRpdGxlTm9IZWFkZXJJbmZvID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJUX05FV19PQkpFQ1RcIiwgb1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlLCB1bmRlZmluZWQsIG9WaWV3RGF0YS5lbnRpdHlTZXQpO1xuXG5cdGNvbnN0IHRpdGxlV2l0aEhlYWRlckluZm8gPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcIlRfQU5OT1RBVElPTl9IRUxQRVJfREVGQVVMVF9PQkpFQ1RfUEFHRV9IRUFERVJfVElUTEVcIixcblx0XHRvVmlld0RhdGEucmVzb3VyY2VCdW5kbGUsXG5cdFx0dW5kZWZpbmVkLFxuXHRcdG9WaWV3RGF0YS5lbnRpdHlTZXRcblx0KTtcblxuXHRjb25zdCBvRW1wdHlIZWFkZXJJbmZvVGl0bGUgPVxuXHRcdG9IZWFkZXJJbmZvPy5UaXRsZSA9PT0gdW5kZWZpbmVkIHx8IChvSGVhZGVySW5mbz8uVGl0bGUgYXMgYW55KSA9PT0gXCJcIiB8fCAob0hlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWUgPT09IFwiXCI7XG5cblx0Y29uc3QgdGl0bGVGb3JBY3RpdmVIZWFkZXJOb0hlYWRlckluZm8gPSAhb0VtcHR5SGVhZGVySW5mb1RpdGxlXG5cdFx0PyBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIlRfQU5OT1RBVElPTl9IRUxQRVJfREVGQVVMVF9PQkpFQ1RfUEFHRV9IRUFERVJfVElUTEVfTk9fSEVBREVSX0lORk9cIiwgb1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlKVxuXHRcdDogXCJcIjtcblx0bGV0IHRpdGxlVmFsdWVFeHByZXNzaW9uLFxuXHRcdGNvbm5lY3RlZEZpZWxkc1BhdGgsXG5cdFx0dGl0bGVJc0VtcHR5OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudCh0cnVlKSxcblx0XHR0aXRsZUJvb2xlYW5FeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gfCBib29sZWFuO1xuXHRpZiAob0hlYWRlckluZm8/LlRpdGxlPy4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRcIikge1xuXHRcdHRpdGxlVmFsdWVFeHByZXNzaW9uID0gZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKChvSGVhZGVySW5mbz8uVGl0bGUgYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZSk7XG5cdFx0aWYgKChvSGVhZGVySW5mbz8uVGl0bGUgYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dD8uYW5ub3RhdGlvbnM/LlVJPy5UZXh0QXJyYW5nZW1lbnQpIHtcblx0XHRcdC8vIEluIGNhc2UgYW4gZXhwbGljaXQgdGV4dCBhcnJhbmdlbWVudCB3YXMgc2V0IHdlIG1ha2UgdXNlIG9mIGl0IGluIHRoZSBkZXNjcmlwdGlvbiBhcyB3ZWxsXG5cdFx0XHR0aXRsZVZhbHVlRXhwcmVzc2lvbiA9IGFkZFRleHRBcnJhbmdlbWVudFRvQmluZGluZ0V4cHJlc3Npb24odGl0bGVWYWx1ZUV4cHJlc3Npb24sIGZ1bGxDb250ZXh0UGF0aCk7XG5cdFx0fVxuXHRcdHRpdGxlVmFsdWVFeHByZXNzaW9uID0gZm9ybWF0VmFsdWVSZWN1cnNpdmVseSh0aXRsZVZhbHVlRXhwcmVzc2lvbiwgZnVsbENvbnRleHRQYXRoKTtcblx0XHR0aXRsZUlzRW1wdHkgPSB0aXRsZVZhbHVlRXhwcmVzc2lvbj8uX3R5cGUgPT09IFwiQ29uc3RhbnRcIiA/IGNvbnN0YW50KCF0aXRsZVZhbHVlRXhwcmVzc2lvbj8udmFsdWUpIDogaXNFbXB0eSh0aXRsZVZhbHVlRXhwcmVzc2lvbik7XG5cdH0gZWxzZSBpZiAoXG5cdFx0b0hlYWRlckluZm8/LlRpdGxlPy4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBbm5vdGF0aW9uXCIgJiZcblx0XHRvSGVhZGVySW5mbz8uVGl0bGU/LlRhcmdldC4kdGFyZ2V0LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNvbm5lY3RlZEZpZWxkc1R5cGVcIlxuXHQpIHtcblx0XHRjb25uZWN0ZWRGaWVsZHNQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgoZnVsbENvbnRleHRQYXRoLCBcIiRUeXBlL0BVSS5IZWFkZXJJbmZvL1RpdGxlL1RhcmdldC8kQW5ub3RhdGlvblBhdGhcIik7XG5cdFx0dGl0bGVWYWx1ZUV4cHJlc3Npb24gPSBnZXRMYWJlbEZvckNvbm5lY3RlZEZpZWxkcyhjb25uZWN0ZWRGaWVsZHNQYXRoLCBmYWxzZSkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz47XG5cdFx0dGl0bGVCb29sZWFuRXhwcmVzc2lvbiA9IHRpdGxlVmFsdWVFeHByZXNzaW9uPy5fdHlwZSA9PT0gXCJDb25zdGFudFwiID8gY29uc3RhbnQoIXRpdGxlVmFsdWVFeHByZXNzaW9uPy52YWx1ZSkgOiBpc0VtcHR5KHRpdGxlVmFsdWVFeHByZXNzaW9uKTtcblx0XHR0aXRsZUlzRW1wdHkgPSB0aXRsZVZhbHVlRXhwcmVzc2lvbiA/IHRpdGxlQm9vbGVhbkV4cHJlc3Npb24gOiBjb25zdGFudCh0cnVlKTtcblx0fVxuXG5cdC8vIElmIHRoZXJlIGlzIGEgVHlwZU5hbWUgZGVmaW5lZCwgc2hvdyB0aGUgZGVmYXVsdCB0aXRsZSAnTmV3ICsgVHlwZU5hbWUnLCBvdGhlcndpc2Ugc2hvdyB0aGUgY3VzdG9tIHRpdGxlIG9yIHRoZSBkZWZhdWx0ICdOZXcgb2JqZWN0J1xuXHRjb25zdCBjcmVhdGVNb2RlVGl0bGUgPSBvSGVhZGVySW5mbz8uVHlwZU5hbWVcblx0XHQ/IGNvbmNhdCh0aXRsZVdpdGhIZWFkZXJJbmZvLCBcIjogXCIsIHJlc29sdmVCaW5kaW5nU3RyaW5nKG9IZWFkZXJJbmZvLlR5cGVOYW1lLnRvU3RyaW5nKCkpKVxuXHRcdDogdGl0bGVOb0hlYWRlckluZm87XG5cdGNvbnN0IGFjdGl2ZUV4cHJlc3Npb24gPSBvRHJhZnRSb290ID8gRW50aXR5LklzQWN0aXZlIDogdHJ1ZTtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdGlmRWxzZShcblx0XHRcdGFuZChvcihVSS5Jc0NyZWF0ZU1vZGVTdGlja3ksIFVJLklzQ3JlYXRlTW9kZSksIHRpdGxlSXNFbXB0eSksXG5cdFx0XHRjcmVhdGVNb2RlVGl0bGUsXG5cblx0XHRcdC8vIE90aGVyd2lzZSBzaG93IHRoZSBkZWZhdWx0IGV4cHJlc3Npb25cblx0XHRcdGlmRWxzZShhbmQoYWN0aXZlRXhwcmVzc2lvbiwgdGl0bGVJc0VtcHR5KSwgdGl0bGVGb3JBY3RpdmVIZWFkZXJOb0hlYWRlckluZm8sIHRpdGxlVmFsdWVFeHByZXNzaW9uKVxuXHRcdClcblx0KTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBleHByZXNzaW9uIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgYW4gb2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIG9IZWFkZXJJbmZvIFRoZSBAVUkuSGVhZGVySW5mbyBhbm5vdGF0aW9uIGNvbnRlbnRcbiAqIEBwYXJhbSBmdWxsQ29udGV4dFBhdGggVGhlIGZ1bGwgY29udGV4dCBwYXRoIHVzZWQgdG8gcmVhY2ggdGhhdCBvYmplY3QgcGFnZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIG9iamVjdCBwYWdlIGRlc2NyaXB0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yRGVzY3JpcHRpb24gPSBmdW5jdGlvbiAoXG5cdG9IZWFkZXJJbmZvOiBIZWFkZXJJbmZvVHlwZSB8IHVuZGVmaW5lZCxcblx0ZnVsbENvbnRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGxldCBwYXRoSW5Nb2RlbCA9IGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbigob0hlYWRlckluZm8/LkRlc2NyaXB0aW9uIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWUpO1xuXHRpZiAoKG9IZWFkZXJJbmZvPy5EZXNjcmlwdGlvbiBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0Py5hbm5vdGF0aW9ucz8uVUk/LlRleHRBcnJhbmdlbWVudCkge1xuXHRcdC8vIEluIGNhc2UgYW4gZXhwbGljaXQgdGV4dCBhcnJhbmdlbWVudCB3YXMgc2V0IHdlIG1ha2UgdXNlIG9mIGl0IGluIHRoZSBkZXNjcmlwdGlvbiBhcyB3ZWxsXG5cdFx0cGF0aEluTW9kZWwgPSBhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uKHBhdGhJbk1vZGVsLCBmdWxsQ29udGV4dFBhdGgpO1xuXHR9XG5cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGZvcm1hdFZhbHVlUmVjdXJzaXZlbHkocGF0aEluTW9kZWwsIGZ1bGxDb250ZXh0UGF0aCkpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gZm9yIHRoZSBzYXZlIGJ1dHRvbi5cbiAqXG4gKiBAcGFyYW0gb1ZpZXdEYXRhIFRoZSBjdXJyZW50IHZpZXcgZGF0YVxuICogQHBhcmFtIGZ1bGxDb250ZXh0UGF0aCBUaGUgcGF0aCB1c2VkIHVwIHVudGlsIGhlcmVcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdGhhdCBzaG93cyB0aGUgcmlnaHQgc2F2ZSBidXR0b24gdGV4dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvclNhdmVCdXR0b24gPSBmdW5jdGlvbiAoXG5cdG9WaWV3RGF0YTogVmlld0RhdGEsXG5cdGZ1bGxDb250ZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aFxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRjb25zdCBzYXZlQnV0dG9uVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9PUF9PQkpFQ1RfUEFHRV9TQVZFXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSk7XG5cdGNvbnN0IGNyZWF0ZUJ1dHRvblRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIlRfT1BfT0JKRUNUX1BBR0VfQ1JFQVRFXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSk7XG5cdGxldCBzYXZlRXhwcmVzc2lvbjtcblxuXHRpZiAoKGZ1bGxDb250ZXh0UGF0aC5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQpLmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQpIHtcblx0XHQvLyBJZiB3ZSdyZSBpbiBzdGlja3kgbW9kZSBBTkQgdGhlIHVpIGlzIGluIGNyZWF0ZSBtb2RlLCBzaG93IENyZWF0ZSwgZWxzZSBzaG93IFNhdmVcblx0XHRzYXZlRXhwcmVzc2lvbiA9IGlmRWxzZShVSS5Jc0NyZWF0ZU1vZGVTdGlja3ksIGNyZWF0ZUJ1dHRvblRleHQsIHNhdmVCdXR0b25UZXh0KTtcblx0fSBlbHNlIHtcblx0XHQvLyBJZiB3ZSdyZSBpbiBkcmFmdCBBTkQgdGhlIGRyYWZ0IGlzIGEgbmV3IG9iamVjdCAoIUlzQWN0aXZlRW50aXR5ICYmICFIYXNBY3RpdmVFbnRpdHkpLCBzaG93IGNyZWF0ZSwgZWxzZSBzaG93IHNhdmVcblx0XHRzYXZlRXhwcmVzc2lvbiA9IGlmRWxzZShEcmFmdC5Jc05ld09iamVjdCwgY3JlYXRlQnV0dG9uVGV4dCwgc2F2ZUJ1dHRvblRleHQpO1xuXHR9XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihzYXZlRXhwcmVzc2lvbik7XG59O1xuXG4vKipcbiAqIE1ldGhvZCByZXR1cm5zIHdoZXRoZXIgZm9vdGVyIGlzIHZpc2libGUgb3Igbm90IG9uIG9iamVjdCAvIHN1Ym9iamVjdCBwYWdlLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgZ2V0Rm9vdGVyVmlzaWJsZVxuICogQHBhcmFtIGZvb3RlckFjdGlvbnMgVGhlIGZvb3RlciBhY3Rpb24gb2JqZWN0IGNvbWluZyBmcm9tIHRoZSBjb252ZXJ0ZXJcbiAqIEBwYXJhbSBkYXRhRmllbGRzIERhdGEgZmllbGQgYXJyYXkgZm9yIG5vcm1hbCBmb290ZXIgdmlzaWJpbGl0eSBwcm9jZXNzaW5nXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYW55IGFjdGlvbiBpcyB0cnVlLCBvdGhlcndpc2UgY29tcGlsZWQgQmluZGluZyBvciBgZmFsc2VgXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGb290ZXJWaXNpYmxlID0gZnVuY3Rpb24gKFxuXHRmb290ZXJBY3Rpb25zOiBDb252ZXJ0ZXJBY3Rpb25bXSxcblx0ZGF0YUZpZWxkczogRGF0YUZpZWxkW11cbik6IGJvb2xlYW4gfCBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9ucyA9IGZvb3RlckFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IGlzTWFuaWZlc3RBY3Rpb24oYWN0aW9uKSkgYXMgTWFuaWZlc3RBY3Rpb25bXTtcblx0bGV0IGN1c3RvbUFjdGlvblZpc2liaWxpdHk6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcblx0aWYgKG1hbmlmZXN0QWN0aW9ucy5sZW5ndGgpIHtcblx0XHQvLyBJZiB3ZSBoYXZlIG1hbmlmZXN0IGFjdGlvbnNcblx0XHRjb25zdCBjdXN0b21BY3Rpb25JbmRpdmlkdWFsVmlzaWJpbGl0eSA9IG1hbmlmZXN0QWN0aW9ucy5tYXAoKGFjdGlvbikgPT4ge1xuXHRcdFx0cmV0dXJuIHJlc29sdmVCaW5kaW5nU3RyaW5nPGJvb2xlYW4+KGFjdGlvbi52aXNpYmxlIGFzIHN0cmluZyB8IGJvb2xlYW4sIFwiYm9vbGVhblwiKTtcblx0XHR9KTtcblx0XHQvLyBjb25zdHJ1Y3QgdGhlIGZvb3RlcidzIHZpc2liaWxpdHktYmluZGluZyBvdXQgb2YgYWxsIGFjdGlvbnMnIHZpc2liaWxpdHktYmluZGluZ3MsIGZpcnN0IHRoZSBiaW5kaW5nIG9mIGFsbCBjdXN0b20gYWN0aW9ucyAuLi5cblx0XHRjdXN0b21BY3Rpb25WaXNpYmlsaXR5ID0gb3IoLi4uY3VzdG9tQWN0aW9uSW5kaXZpZHVhbFZpc2liaWxpdHkpO1xuXHRcdC8vIGFuZCB0aGVuIHRoZSBiaW5kaW5nIG9mIGFsbCBhbm5vdGF0aW9uIGFjdGlvbnMgaW5zaWRlIHRoZSBmb290ZXIgLi4uXG5cdFx0Y29uc3QgYW5ub3RhdGlvbkFjdGlvblZpc2liaWxpdHkgPSBnZXREYXRhRmllbGRCYXNlZEZvb3RlclZpc2liaWxpdHkoZGF0YUZpZWxkcywgdHJ1ZSk7XG5cdFx0Ly8gZmluYWxseSwgcmV0dXJuIGV2ZXJ5dGhpbmcuXG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKG9yKGN1c3RvbUFjdGlvblZpc2liaWxpdHksIHJlc29sdmVCaW5kaW5nU3RyaW5nPGJvb2xlYW4+KGFubm90YXRpb25BY3Rpb25WaXNpYmlsaXR5LCBcImJvb2xlYW5cIikpKTtcblx0fVxuXHRyZXR1cm4gZ2V0RGF0YUZpZWxkQmFzZWRGb290ZXJWaXNpYmlsaXR5KGRhdGFGaWVsZHMsIHRydWUpO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGZvb3RlciBpcyB2aXNpYmxlIG9yIG5vdC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlVGVtcGxhdGluZy5nZXREYXRhRmllbGRCYXNlZEZvb3RlclZpc2liaWxpdHlcbiAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZVRlbXBsYXRpbmdcbiAqIEBwYXJhbSBhRGF0YUZpZWxkcyBBcnJheSBvZiBEYXRhRmllbGRzIGluIHRoZSBpZGVudGlmaWNhdGlvblxuICogQHBhcmFtIGJDb25zaWRlckVkaXRhYmxlIFdoZXRoZXIgdGhlIGVkaXQgbW9kZSBiaW5kaW5nIGlzIHJlcXVpcmVkIG9yIG5vdFxuICogQHJldHVybnMgQW4gZXhwcmVzc2lvbiBpZiBhbGwgdGhlIGFjdGlvbnMgYXJlIHVpLmhpZGRlbiwgdHJ1ZSBvdGhlcndpc2VcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERhdGFGaWVsZEJhc2VkRm9vdGVyVmlzaWJpbGl0eSA9IGZ1bmN0aW9uIChhRGF0YUZpZWxkczogYW55W10sIGJDb25zaWRlckVkaXRhYmxlOiBib29sZWFuKSB7XG5cdGxldCBzSGlkZGVuRXhwcmVzc2lvbiA9IFwiXCI7XG5cdGxldCBzU2VtaUhpZGRlbkV4cHJlc3Npb247XG5cdGNvbnN0IGFIaWRkZW5BY3Rpb25QYXRoID0gW107XG5cblx0Zm9yIChjb25zdCBpIGluIGFEYXRhRmllbGRzKSB7XG5cdFx0Y29uc3Qgb0RhdGFGaWVsZCA9IGFEYXRhRmllbGRzW2ldO1xuXHRcdGlmIChvRGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gJiYgb0RhdGFGaWVsZC5EZXRlcm1pbmluZyA9PT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgaGlkZGVuRXhwcmVzc2lvbiA9IG9EYXRhRmllbGRbYEAke1VJQW5ub3RhdGlvblRlcm1zLkhpZGRlbn1gXTtcblx0XHRcdGlmICghaGlkZGVuRXhwcmVzc2lvbikge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAoaGlkZGVuRXhwcmVzc2lvbi4kUGF0aCkge1xuXHRcdFx0XHRpZiAoYUhpZGRlbkFjdGlvblBhdGguaW5kZXhPZihoaWRkZW5FeHByZXNzaW9uLiRQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhSGlkZGVuQWN0aW9uUGF0aC5wdXNoKGhpZGRlbkV4cHJlc3Npb24uJFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKGFIaWRkZW5BY3Rpb25QYXRoLmxlbmd0aCkge1xuXHRcdGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhSGlkZGVuQWN0aW9uUGF0aC5sZW5ndGg7IGluZGV4KyspIHtcblx0XHRcdGlmIChhSGlkZGVuQWN0aW9uUGF0aFtpbmRleF0pIHtcblx0XHRcdFx0c1NlbWlIaWRkZW5FeHByZXNzaW9uID0gXCIoJXtcIiArIGFIaWRkZW5BY3Rpb25QYXRoW2luZGV4XSArIFwifSA9PT0gdHJ1ZSA/IGZhbHNlIDogdHJ1ZSApXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaW5kZXggPT0gYUhpZGRlbkFjdGlvblBhdGgubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRzSGlkZGVuRXhwcmVzc2lvbiA9IHNIaWRkZW5FeHByZXNzaW9uICsgc1NlbWlIaWRkZW5FeHByZXNzaW9uO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0hpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiArIHNTZW1pSGlkZGVuRXhwcmVzc2lvbiArIFwifHxcIjtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIChcblx0XHRcdFwiez0gXCIgK1xuXHRcdFx0KGJDb25zaWRlckVkaXRhYmxlID8gXCIoXCIgOiBcIlwiKSArXG5cdFx0XHRzSGlkZGVuRXhwcmVzc2lvbiArXG5cdFx0XHQoYkNvbnNpZGVyRWRpdGFibGUgPyBcIiB8fCAke3VpPi9pc0VkaXRhYmxlfSkgXCIgOiBcIiBcIikgK1xuXHRcdFx0XCImJiAke2ludGVybmFsPmlzQ3JlYXRlRGlhbG9nT3Blbn0gIT09IHRydWV9XCJcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIns9IFwiICsgKGJDb25zaWRlckVkaXRhYmxlID8gXCIke3VpPi9pc0VkaXRhYmxlfSAmJiBcIiA6IFwiXCIpICsgXCIke2ludGVybmFsPmlzQ3JlYXRlRGlhbG9nT3Blbn0gIT09IHRydWV9XCI7XG5cdH1cbn07XG5cbi8qKlxuICogTWV0aG9kIHJldHVybnMgV2hldGhlciB0aGUgYWN0aW9uIHR5cGUgaXMgbWFuaWZlc3Qgb3Igbm90LlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgaXNNYW5pZmVzdEFjdGlvblZpc2libGVcbiAqIEBwYXJhbSBvQWN0aW9uIFRoZSBhY3Rpb24gb2JqZWN0XG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYWN0aW9uIGlzIGNvbWluZyBmcm9tIG1hbmlmZXN0LCBgZmFsc2VgIG90aGVyd2lzZVxuICovXG5leHBvcnQgY29uc3QgaXNNYW5pZmVzdEFjdGlvbiA9IGZ1bmN0aW9uIChvQWN0aW9uOiBhbnkpIHtcblx0Y29uc3QgYUFjdGlvbnMgPSBbXG5cdFx0XCJQcmltYXJ5XCIsXG5cdFx0XCJEZWZhdWx0QXBwbHlcIixcblx0XHRcIlNlY29uZGFyeVwiLFxuXHRcdFwiRm9yQWN0aW9uXCIsXG5cdFx0XCJGb3JOYXZpZ2F0aW9uXCIsXG5cdFx0XCJTd2l0Y2hUb0FjdGl2ZU9iamVjdFwiLFxuXHRcdFwiU3dpdGNoVG9EcmFmdE9iamVjdFwiLFxuXHRcdFwiRHJhZnRBY3Rpb25zXCJcblx0XTtcblx0cmV0dXJuIGFBY3Rpb25zLmluZGV4T2Yob0FjdGlvbi50eXBlKSA8IDA7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gZXhwcmVzc2lvbiB0byBkZXRlcm1pbmUgRW1waGFzaXplZCAgYnV0dG9uIHR5cGUgYmFzZWQgb24gQ3JpdGljYWxpdHkgYWNyb3NzIGFsbCBhY3Rpb25zXG4gKiBJZiBjcml0aWNhbCBhY3Rpb24gaXMgcmVuZGVyZWQsIGl0cyBjb25zaWRlcmVkIHRvIGJlIHRoZSBwcmltYXJ5IGFjdGlvbi4gSGVuY2UgdGVtcGxhdGUncyBkZWZhdWx0IHByaW1hcnkgYWN0aW9uIGlzIHNldCBiYWNrIHRvIERlZmF1bHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZVRlbXBsYXRpbmcuYnVpbGRFbXBoYXNpemVkQnV0dG9uRXhwcmVzc2lvblxuICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlVGVtcGxhdGluZ1xuICogQHBhcmFtIGFJZGVudGlmaWNhdGlvbiBBcnJheSBvZiBhbGwgdGhlIERhdGFGaWVsZHMgaW4gSWRlbnRpZmljYXRpb25cbiAqIEByZXR1cm5zIEFuIGV4cHJlc3Npb24gdG8gZGVkdWNlIGlmIGJ1dHRvbiB0eXBlIGlzIERlZmF1bHQgb3IgRW1waGFzaXplZFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5leHBvcnQgY29uc3QgYnVpbGRFbXBoYXNpemVkQnV0dG9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChhSWRlbnRpZmljYXRpb24/OiBhbnlbXSkge1xuXHRpZiAoIWFJZGVudGlmaWNhdGlvbikge1xuXHRcdHJldHVybiBCdXR0b25UeXBlLkVtcGhhc2l6ZWQ7XG5cdH1cblx0bGV0IHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRsZXQgYklzQWx3YXlzRGVmYXVsdDogYm9vbGVhbixcblx0XHRzSGlkZGVuU2ltcGxlUGF0aCxcblx0XHRzSGlkZGVuRXhwcmVzc2lvbiA9IFwiXCI7XG5cdGFJZGVudGlmaWNhdGlvbi5mb3JFYWNoKGZ1bmN0aW9uIChvRGF0YUZpZWxkOiBhbnkpIHtcblx0XHRjb25zdCBvQ3JpdGljYWxpdHlQcm9wZXJ0eSA9IG9EYXRhRmllbGQuQ3JpdGljYWxpdHk7XG5cdFx0Y29uc3Qgb0RhdGFGaWVsZEhpZGRlbiA9IG9EYXRhRmllbGRbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdO1xuXHRcdGlmIChvRGF0YUZpZWxkLiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFjdGlvblwiICYmICFiSXNBbHdheXNEZWZhdWx0ICYmIG9Dcml0aWNhbGl0eVByb3BlcnR5KSB7XG5cdFx0XHRpZiAoIXNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiAmJiBvRGF0YUZpZWxkSGlkZGVuID09PSB0cnVlKSB7XG5cdFx0XHRcdC8vIGlmIERhdGFGaWVsZCBpcyBzZXQgdG8gaGlkZGVuLCB3ZSBjYW4gc2tpcCBvdGhlciBjaGVja3MgYW5kIHJldHVybiBEZWZhdWx0IGJ1dHRvbiB0eXBlXG5cdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IEJ1dHRvblR5cGUuRW1waGFzaXplZDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9EYXRhRmllbGRIaWRkZW4gJiYgb0RhdGFGaWVsZEhpZGRlbi4kUGF0aCkge1xuXHRcdFx0XHQvLyB3aGVuIHZpc2liaWxpdHkgb2YgY3JpdGljYWwgYnV0dG9uIGlzIGJhc2VkIG9uIHBhdGgsIGNvbGxlY3QgYWxsIHBhdGhzIGZvciBleHByZXNzaW9uXG5cdFx0XHRcdHNIaWRkZW5TaW1wbGVQYXRoID0gb0RhdGFGaWVsZEhpZGRlbi4kUGF0aDtcblx0XHRcdFx0aWYgKHNIaWRkZW5FeHByZXNzaW9uKSB7XG5cdFx0XHRcdFx0c0hpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiArIFwiICYmIFwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNIaWRkZW5FeHByZXNzaW9uID0gc0hpZGRlbkV4cHJlc3Npb24gKyBcIiV7XCIgKyBzSGlkZGVuU2ltcGxlUGF0aCArIFwifSA9PT0gdHJ1ZVwiO1xuXHRcdFx0XHRzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gPSBcIns9IChcIiArIHNIaWRkZW5FeHByZXNzaW9uICsgXCIpID8gJ0VtcGhhc2l6ZWQnIDogJ0RlZmF1bHQnIH1cIjtcblx0XHRcdH1cblx0XHRcdHN3aXRjaCAob0NyaXRpY2FsaXR5UHJvcGVydHkuJEVudW1NZW1iZXIpIHtcblx0XHRcdFx0Ly8gc3VwcG9ydGVkIGNyaXRpY2FsaXR5IGFyZSBbUG9zaXRpdmUvMy8nMyddIGFuZCBbTmVnYXRpdmUvMS8nMSddXG5cdFx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eVR5cGUvTmVnYXRpdmVcIjpcblx0XHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9Qb3NpdGl2ZVwiOlxuXHRcdFx0XHRjYXNlIFwiMVwiOlxuXHRcdFx0XHRjYXNlIDE6XG5cdFx0XHRcdGNhc2UgXCIzXCI6XG5cdFx0XHRcdGNhc2UgMzpcblx0XHRcdFx0XHRpZiAoIW9EYXRhRmllbGRIaWRkZW4pIHtcblx0XHRcdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IEJ1dHRvblR5cGUuRGVmYXVsdDtcblx0XHRcdFx0XHRcdGJJc0Fsd2F5c0RlZmF1bHQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gPSBzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gfHwgQnV0dG9uVHlwZS5EZWZhdWx0O1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IEJ1dHRvblR5cGUuRW1waGFzaXplZDtcblx0XHRcdH1cblx0XHRcdGlmIChvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCkge1xuXHRcdFx0XHQvLyB3aGVuIENyaXRpY2FsaXR5IGlzIHNldCB1c2luZyBhIHBhdGgsIHVzZSB0aGUgcGF0aCBmb3IgZGVkdWNpbmcgdGhlIEVtcGhzaXplZCB0eXBlIGZvciBkZWZhdWx0IFByaW1hcnkgQWN0aW9uXG5cdFx0XHRcdGNvbnN0IHNDb21iaW5lZEhpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiA/IFwiIShcIiArIHNIaWRkZW5FeHByZXNzaW9uICsgXCIpICYmIFwiIDogXCJcIjtcblx0XHRcdFx0c0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uID1cblx0XHRcdFx0XHRcIns9IFwiICtcblx0XHRcdFx0XHRzQ29tYmluZWRIaWRkZW5FeHByZXNzaW9uICtcblx0XHRcdFx0XHRcIigoJHtcIiArXG5cdFx0XHRcdFx0b0NyaXRpY2FsaXR5UHJvcGVydHkuJFBhdGggK1xuXHRcdFx0XHRcdFwifSA9PT0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9OZWdhdGl2ZScpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAnMScpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAxKSBcIiArXG5cdFx0XHRcdFx0XCJ8fCAoJHtcIiArXG5cdFx0XHRcdFx0b0NyaXRpY2FsaXR5UHJvcGVydHkuJFBhdGggK1xuXHRcdFx0XHRcdFwifSA9PT0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9Qb3NpdGl2ZScpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAnMycpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAzKSkgPyBcIiArXG5cdFx0XHRcdFx0XCInRGVmYXVsdCdcIiArXG5cdFx0XHRcdFx0XCIgOiBcIiArXG5cdFx0XHRcdFx0XCInRW1waGFzaXplZCdcIiArXG5cdFx0XHRcdFx0XCIgfVwiO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gfHwgQnV0dG9uVHlwZS5FbXBoYXNpemVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRCaW5kaW5nID0gZnVuY3Rpb24gKHNQYXRoOiBhbnkpIHtcblx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIuZ2V0TmF2aWdhdGlvblBhdGgoc1BhdGgpO1xuXHRpZiAoc05hdmlnYXRpb25QYXRoKSB7XG5cdFx0cmV0dXJuIFwie3BhdGg6J1wiICsgc05hdmlnYXRpb25QYXRoICsgXCInfVwiO1xuXHR9IGVsc2Uge1xuXHRcdC8vbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBuZWVkcyBlbXB0eSBvYmplY3Rcblx0XHRyZXR1cm4gXCJ7cGF0aDogJyd9XCI7XG5cdH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2hlY2sgaWYgZHJhZnQgcGF0dGVybiBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIG9Bbm5vdGF0aW9ucyBBbm5vdGF0aW9ucyBvZiB0aGUgY3VycmVudCBlbnRpdHkgc2V0LlxuICogQHJldHVybnMgUmV0dXJucyB0aGUgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiBkcmFmdCBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgY2hlY2tEcmFmdFN0YXRlID0gZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KSB7XG5cdGlmIChcblx0XHRvQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiXSAmJlxuXHRcdG9Bbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCJdW1wiRWRpdEFjdGlvblwiXVxuXHQpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZ2V0IHRoZSB2aXNpYmlsaXR5IGZvciB0aGUgU3dpdGNoVG9BY3RpdmUgYnV0dG9uIGluIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0gb0Fubm90YXRpb25zIEFubm90YXRpb25zIG9mIHRoZSBjdXJyZW50IGVudGl0eSBzZXQuXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGJhc2VkIG9uIHRoZSBkcmFmdCBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgZ2V0U3dpdGNoVG9BY3RpdmVWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0aWYgKGNoZWNrRHJhZnRTdGF0ZShvQW5ub3RhdGlvbnMpKSB7XG5cdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICR7dWk+L2lzRWRpdGFibGV9ICYmICEke3VpPmNyZWF0ZU1vZGV9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIHZpc2liaWxpdHkgZm9yIHRoZSBTd2l0Y2hUb0RyYWZ0IGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIG9Bbm5vdGF0aW9ucyBBbm5vdGF0aW9ucyBvZiB0aGUgY3VycmVudCBlbnRpdHkgc2V0LlxuICogQHJldHVybnMgUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFN3aXRjaFRvRHJhZnRWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0aWYgKGNoZWNrRHJhZnRTdGF0ZShvQW5ub3RhdGlvbnMpKSB7XG5cdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICEoJHt1aT4vaXNFZGl0YWJsZX0pICYmICEke3VpPmNyZWF0ZU1vZGV9ICYmICR7SGFzRHJhZnRFbnRpdHl9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIHZpc2liaWxpdHkgZm9yIHRoZSBTd2l0Y2hEcmFmdEFuZEFjdGl2ZSBidXR0b24gaW4gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlLlxuICpcbiAqIEBwYXJhbSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgYmFzZWQgb24gdGhlIGRyYWZ0IHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTd2l0Y2hEcmFmdEFuZEFjdGl2ZVZpc2liaWxpdHkgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnkpOiBhbnkge1xuXHRpZiAoY2hlY2tEcmFmdFN0YXRlKG9Bbm5vdGF0aW9ucykpIHtcblx0XHRyZXR1cm4gXCJ7PSAoJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9KSA/ICggISR7dWk+Y3JlYXRlTW9kZX0gJiYgJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9ICkgOiBmYWxzZSB9XCI7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGZpbmQgYW4gYWN0aW9uIGZyb20gdGhlIGFycmF5IG9mIGhlYWRlciBhY3Rpb25zIGluIHRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mICdoZWFkZXInIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlLlxuICogQHBhcmFtIHNBY3Rpb25UeXBlIFRoZSBhY3Rpb24gdHlwZVxuICogQHJldHVybnMgVGhlIGFjdGlvbiB3aXRoIHRoZSBtYXRjaGluZyBhY3Rpb24gdHlwZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IF9maW5kQWN0aW9uID0gZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogYW55W10sIHNBY3Rpb25UeXBlOiBzdHJpbmcpIHtcblx0bGV0IG9BY3Rpb247XG5cdGlmIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgJiYgYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLmxlbmd0aCkge1xuXHRcdG9BY3Rpb24gPSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMuZmluZChmdW5jdGlvbiAob0hlYWRlckFjdGlvbjogYW55KSB7XG5cdFx0XHRyZXR1cm4gb0hlYWRlckFjdGlvbi50eXBlID09PSBzQWN0aW9uVHlwZTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gb0FjdGlvbjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgZm9yIHRoZSBEZWxldGUgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQgPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRjb25zdCBvRGVsZXRlQWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlNlY29uZGFyeVwiKTtcblx0cmV0dXJuIG9EZWxldGVBY3Rpb24gPyBvRGVsZXRlQWN0aW9uLmVuYWJsZWQgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAndmlzaWJsZScgcHJvcGVydHkgZm9yIHRoZSBEZWxldGUgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvblZpc2libGUgPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRjb25zdCBvRGVsZXRlQWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlNlY29uZGFyeVwiKTtcblx0cmV0dXJuIG9EZWxldGVBY3Rpb24gPyBvRGVsZXRlQWN0aW9uLnZpc2libGUgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAndmlzaWJsZScgcHJvcGVydHkgZm9yIHRoZSBFZGl0IGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVkaXRDb21tYW5kRXhlY3V0aW9uVmlzaWJsZSA9IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdGNvbnN0IG9FZGl0QWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlByaW1hcnlcIik7XG5cdHJldHVybiBvRWRpdEFjdGlvbiA/IG9FZGl0QWN0aW9uLnZpc2libGUgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgZm9yIHRoZSBFZGl0IGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVkaXRDb21tYW5kRXhlY3V0aW9uRW5hYmxlZCA9IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdGNvbnN0IG9FZGl0QWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlByaW1hcnlcIik7XG5cdHJldHVybiBvRWRpdEFjdGlvbiA/IG9FZGl0QWN0aW9uLmVuYWJsZWQgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZ2V0IHRoZSBFZGl0QWN0aW9uIGZyb20gdGhlIEVudGl0eXNldCBiYXNlZCBvbiBEcmFmdCBvciBzdGlja3kgYmFzZWQgYXBwbGljYXRpb24uXG4gKlxuICogQHBhcmFtIFtvRW50aXR5U2V0XSBUaGUgdmFsdWUgZnJvbSB0aGUgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIGJvb2xlYW4gdmFsdWUgYmFzZWQgb24gdlJhd1ZhbHVlICYgb0RyYWZ0Tm9kZVxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdEFjdGlvbiA9IGZ1bmN0aW9uIChvRW50aXR5U2V0OiBDb250ZXh0KSB7XG5cdGNvbnN0IHNQYXRoID0gb0VudGl0eVNldC5nZXRQYXRoKCksXG5cdFx0b0Fubm90YXRpb25zID0gb0VudGl0eVNldC5nZXRPYmplY3QoYCR7c1BhdGh9QGApO1xuXHRjb25zdCBiRHJhZnRSb290ID0gb0Fubm90YXRpb25zLmhhc093blByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIik7XG5cdGNvbnN0IGJTdGlja3lTZXNzaW9uID0gb0Fubm90YXRpb25zLmhhc093blByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFwiKTtcblx0bGV0IHNBY3Rpb25OYW1lO1xuXHRpZiAoYkRyYWZ0Um9vdCkge1xuXHRcdHNBY3Rpb25OYW1lID0gb0VudGl0eVNldC5nZXRPYmplY3QoYCR7c1BhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvRWRpdEFjdGlvbmApO1xuXHR9IGVsc2UgaWYgKGJTdGlja3lTZXNzaW9uKSB7XG5cdFx0c0FjdGlvbk5hbWUgPSBvRW50aXR5U2V0LmdldE9iamVjdChgJHtzUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL0VkaXRBY3Rpb25gKTtcblx0fVxuXHRyZXR1cm4gIXNBY3Rpb25OYW1lID8gc0FjdGlvbk5hbWUgOiBgJHtzUGF0aH0vJHtzQWN0aW9uTmFtZX1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUmVhZE9ubHlGcm9tU3RhdGljQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnksIG9GaWVsZENvbnRyb2w6IGFueSkge1xuXHRsZXQgYkNvbXB1dGVkLCBiSW1tdXRhYmxlLCBiUmVhZE9ubHk7XG5cdGlmIChvQW5ub3RhdGlvbnMgJiYgb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCJdKSB7XG5cdFx0YkNvbXB1dGVkID0gb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCJdLkJvb2wgPyBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl0uQm9vbCA9PSBcInRydWVcIiA6IHRydWU7XG5cdH1cblx0aWYgKG9Bbm5vdGF0aW9ucyAmJiBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdKSB7XG5cdFx0YkltbXV0YWJsZSA9IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0uQm9vbCA/IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0uQm9vbCA9PSBcInRydWVcIiA6IHRydWU7XG5cdH1cblx0YlJlYWRPbmx5ID0gYkNvbXB1dGVkIHx8IGJJbW11dGFibGU7XG5cblx0aWYgKG9GaWVsZENvbnRyb2wpIHtcblx0XHRiUmVhZE9ubHkgPSBiUmVhZE9ubHkgfHwgb0ZpZWxkQ29udHJvbCA9PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xUeXBlL1JlYWRPbmx5XCI7XG5cdH1cblx0aWYgKGJSZWFkT25seSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IHJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAob0ZpZWxkQ29udHJvbDogYW55KSB7XG5cdGxldCBzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHk7XG5cdGlmIChvRmllbGRDb250cm9sKSB7XG5cdFx0aWYgKChNYW5hZ2VkT2JqZWN0IGFzIGFueSkuYmluZGluZ1BhcnNlcihvRmllbGRDb250cm9sKSkge1xuXHRcdFx0c0lzRmllbGRDb250cm9sUGF0aFJlYWRPbmx5ID0gXCIlXCIgKyBvRmllbGRDb250cm9sICsgXCIgPT09IDEgXCI7XG5cdFx0fVxuXHR9XG5cdGlmIChzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkpIHtcblx0XHRyZXR1cm4gXCJ7PSBcIiArIHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSArIFwiPyBmYWxzZSA6IHRydWUgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn07XG5cbi8qXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIGNoYXJ0IFRpdGxlIFByZXNzXG4gKlxuICogQGZ1bmN0aW9ud1xuICogQHBhcmFtIHtvQ29uZmlndXJhdGlvbn0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqICBAcGFyYW0ge29NYW5pZmVzdH0gW29NYW5pZmVzdF0gT3V0Ym91bmRzIGZyb20gbWFuaWZlc3RcbiAqIHJldHVybnMge1N0cmluZ30gW3NDb2xsZWN0aW9uTmFtZV0gQ29sbGVjdGlvbiBOYW1lIG9mIHRoZSBNaWNybyBDaGFydFxuICpcbiAqIHJldHVybnMge1N0cmluZ30gW0V4cHJlc3Npb25dIEhhbmRsZXIgRXhwcmVzc2lvbiBmb3IgdGhlIHRpdGxlIHByZXNzXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvck1pY3JvQ2hhcnRUaXRsZVByZXNzID0gZnVuY3Rpb24gKG9Db25maWd1cmF0aW9uOiBhbnksIG9NYW5pZmVzdE91dGJvdW5kOiBhbnksIHNDb2xsZWN0aW9uTmFtZTogYW55KSB7XG5cdGlmIChvQ29uZmlndXJhdGlvbikge1xuXHRcdGlmIChcblx0XHRcdChvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSkgfHxcblx0XHRcdChvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSAmJiBvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XCIuaGFuZGxlcnMub25EYXRhUG9pbnRUaXRsZVByZXNzZWQoJGNvbnRyb2xsZXIsICR7JHNvdXJjZT4vfSwnXCIgK1xuXHRcdFx0XHRKU09OLnN0cmluZ2lmeShvTWFuaWZlc3RPdXRib3VuZCkgK1xuXHRcdFx0XHRcIicsJ1wiICtcblx0XHRcdFx0b0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXVtcIm91dGJvdW5kXCJdICtcblx0XHRcdFx0XCInLCdcIiArXG5cdFx0XHRcdHNDb2xsZWN0aW9uTmFtZSArXG5cdFx0XHRcdFwiJyApXCJcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRyZXR1cm4gXCIuaGFuZGxlcnMubmF2aWdhdGVUb1N1YlNlY3Rpb24oJGNvbnRyb2xsZXIsICdcIiArIEpTT04uc3RyaW5naWZ5KG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pICsgXCInKVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxufTtcblxuLypcbiAqIEZ1bmN0aW9uIHRvIHJlbmRlciBDaGFydCBUaXRsZSBhcyBMaW5rXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29Db250cm9sQ29uZmlndXJhdGlvbn0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqIHJldHVybnMge1N0cmluZ30gW3NLZXldIEZvciB0aGUgVGFyZ2V0T3V0Ym91bmQgYW5kIFRhcmdldFNlY3Rpb25cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRNaWNyb0NoYXJ0VGl0bGVBc0xpbmsgPSBmdW5jdGlvbiAob0NvbnRyb2xDb25maWd1cmF0aW9uOiBhbnkpIHtcblx0aWYgKFxuXHRcdG9Db250cm9sQ29uZmlndXJhdGlvbiAmJlxuXHRcdChvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSB8fCAob0NvbnRyb2xDb25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl0gJiYgb0NvbnRyb2xDb25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pKVxuXHQpIHtcblx0XHRyZXR1cm4gXCJFeHRlcm5hbFwiO1xuXHR9IGVsc2UgaWYgKG9Db250cm9sQ29uZmlndXJhdGlvbiAmJiBvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkge1xuXHRcdHJldHVybiBcIkluUGFnZVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIk5vbmVcIjtcblx0fVxufTtcblxuLyogR2V0IGdyb3VwSWQgZnJvbSBjb250cm9sIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuICogQHBhcmFtIHtTdHJpbmd9IFtzQW5ub3RhdGlvblBhdGhdIEFubm90YXRpb24gUGF0aCBmb3IgdGhlIGNvbmZpZ3VyYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCB0aGUgZ3JvdXBJZCBmb3IgRGF0YVBvaW50cyBhbmQgTWljcm9DaGFydHMgaW4gdGhlIEhlYWRlci5cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRHcm91cElkRnJvbUNvbmZpZyA9IGZ1bmN0aW9uIChvQ29uZmlndXJhdGlvbnM6IGFueSwgc0Fubm90YXRpb25QYXRoOiBhbnksIHNEZWZhdWx0R3JvdXBJZD86IGFueSkge1xuXHRjb25zdCBvQ29uZmlndXJhdGlvbiA9IG9Db25maWd1cmF0aW9uc1tzQW5ub3RhdGlvblBhdGhdLFxuXHRcdGFBdXRvUGF0dGVybnMgPSBbXCJIZXJvZXNcIiwgXCJEZWNvcmF0aW9uXCIsIFwiV29ya2Vyc1wiLCBcIkxvbmdSdW5uZXJzXCJdO1xuXHRsZXQgc0dyb3VwSWQgPSBzRGVmYXVsdEdyb3VwSWQ7XG5cdGlmIChcblx0XHRvQ29uZmlndXJhdGlvbiAmJlxuXHRcdG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkICYmXG5cdFx0YUF1dG9QYXR0ZXJucy5zb21lKGZ1bmN0aW9uIChhdXRvUGF0dGVybjogc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gYXV0b1BhdHRlcm4gPT09IG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkO1xuXHRcdH0pXG5cdCkge1xuXHRcdHNHcm91cElkID0gXCIkYXV0by5cIiArIG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkO1xuXHR9XG5cdHJldHVybiBzR3JvdXBJZDtcbn07XG5cbi8qXG4gKiBHZXQgQ29udGV4dCBCaW5kaW5nIHdpdGggZ3JvdXBJZCBmcm9tIGNvbnRyb2wgY29uZmlndXJhdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtPYmplY3R9IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG4gKiBAcGFyYW0ge1N0cmluZ30gW3NLZXldIEFubm90YXRpb24gUGF0aCBmb3Igb2YgdGhlIGNvbmZpZ3VyYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCB0aGUgYmluZGluZyBmb3IgRGF0YVBvaW50cyBpbiB0aGUgSGVhZGVyLlxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWcgPSBmdW5jdGlvbiAob0NvbmZpZ3VyYXRpb25zOiBhbnksIHNLZXk6IGFueSkge1xuXHRjb25zdCBzR3JvdXBJZCA9IGdldEdyb3VwSWRGcm9tQ29uZmlnKG9Db25maWd1cmF0aW9ucywgc0tleSk7XG5cdGxldCBzQmluZGluZztcblx0aWYgKHNHcm91cElkKSB7XG5cdFx0c0JpbmRpbmcgPSBcInsgcGF0aCA6ICcnLCBwYXJhbWV0ZXJzIDogeyAkJGdyb3VwSWQgOiAnXCIgKyBzR3JvdXBJZCArIFwiJyB9IH1cIjtcblx0fVxuXHRyZXR1cm4gc0JpbmRpbmc7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGEgRmllbGRHcm91cCBjb25zaXN0cyBvZiBvbmx5IDEgRGF0YUZpZWxkIHdpdGggTXVsdGlMaW5lIFRleHQgYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0gYUZvcm1FbGVtZW50cyBBIGNvbGxlY3Rpb24gb2YgZm9ybSBlbGVtZW50cyB1c2VkIGluIHRoZSBjdXJyZW50IGZpZWxkIGdyb3VwXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgb25seSAxIGRhdGEgZmllbGQgd2l0aCBNdWx0aWxpbmUgVGV4dCBhbm5vdGF0aW9uIGV4aXN0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGRvZXNGaWVsZEdyb3VwQ29udGFpbk9ubHlPbmVNdWx0aUxpbmVEYXRhRmllbGQgPSBmdW5jdGlvbiAoYUZvcm1FbGVtZW50czogYW55W10pIHtcblx0cmV0dXJuIGFGb3JtRWxlbWVudHMgJiYgYUZvcm1FbGVtZW50cy5sZW5ndGggPT09IDEgJiYgISFhRm9ybUVsZW1lbnRzWzBdLmlzVmFsdWVNdWx0aWxpbmVUZXh0O1xufTtcblxuLypcbiAqIEdldCBWaXNpYmxpdHkgb2YgYnJlYWRjcnVtYnMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gW29WaWV3RGF0YV0gVmlld0RhdGEgbW9kZWxcbiAqIHJldHVybnMgeyp9IEV4cHJlc3Npb24gb3IgYm9vbGVhblxuICovXG5leHBvcnQgY29uc3QgZ2V0VmlzaWJsZUV4cHJlc3Npb25Gb3JCcmVhZGNydW1icyA9IGZ1bmN0aW9uIChvVmlld0RhdGE6IGFueSkge1xuXHRyZXR1cm4gb1ZpZXdEYXRhLnNob3dCcmVhZENydW1icyAmJiBvVmlld0RhdGEuZmNsRW5hYmxlZCAhPT0gdW5kZWZpbmVkID8gXCJ7ZmNsaGVscGVyPi9icmVhZENydW1iSXNWaXNpYmxlfVwiIDogb1ZpZXdEYXRhLnNob3dCcmVhZENydW1icztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTaGFyZUJ1dHRvblZpc2liaWxpdHkgPSBmdW5jdGlvbiAodmlld0RhdGE6IGFueSkge1xuXHRsZXQgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCA9IFwiISR7dWk+Y3JlYXRlTW9kZX1cIjtcblx0aWYgKHZpZXdEYXRhLmZjbEVuYWJsZWQpIHtcblx0XHRzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwID0gXCIke2ZjbGhlbHBlcj4vc2hvd1NoYXJlSWNvbn0gJiYgXCIgKyBzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwO1xuXHR9XG5cdHJldHVybiBcIns9IFwiICsgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCArIFwiIH1cIjtcbn07XG5cbi8qXG4gKiBHZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBoZWFkZXIgaW5mbyBpbiBlZGl0IG1vZGVcbiAqXG4gKiBJZiBlaXRoZXIgdGhlIHRpdGxlIG9yIGRlc2NyaXB0aW9uIGZpZWxkIGZyb20gdGhlIGhlYWRlciBhbm5vdGF0aW9ucyBhcmUgZWRpdGFibGUsIHRoZW4gdGhlXG4gKiBlZGl0YWJsZSBoZWFkZXIgaW5mbyBpcyB2aXNpYmxlLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvQW5ub3RhdGlvbnNdIEFubm90YXRpb25zIG9iamVjdCBmb3IgZ2l2ZW4gZW50aXR5IHNldFxuICogQHBhcmFtIHtvYmplY3R9IFtvRmllbGRDb250cm9sXSBmaWVsZCBjb250cm9sXG4gKiByZXR1cm5zIHsqfSAgYmluZGluZyBleHByZXNzaW9uIG9yIGJvb2xlYW4gdmFsdWUgcmVzb2x2ZWQgZm9ybSBmdW5jaXRvbnMgaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyBhbmQgaXNSZWFkT25seUZyb21EeW5hbWljQW5ub3RhdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFZpc2libGl0eU9mSGVhZGVySW5mbyA9IGZ1bmN0aW9uIChcblx0b1RpdGxlQW5ub3RhdGlvbnM6IGFueSxcblx0b0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnM6IGFueSxcblx0b0ZpZWxkVGl0bGVGaWVsZENvbnRyb2w6IGFueSxcblx0b0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2w6IGFueVxuKSB7XG5cdC8vIENoZWNrIEFubm90YXRpb25zIGZvciBUaXRsZSBGaWVsZFxuXHQvLyBTZXQgdG8gdHJ1ZSBhbmQgZG9uJ3QgdGFrZSBpbnRvIGFjY291bnQsIGlmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucywgaS5lLiBubyB0aXRsZSBleGlzdHNcblx0Y29uc3QgYklzVGl0bGVSZWFkT25seSA9IG9UaXRsZUFubm90YXRpb25zID8gaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyhvVGl0bGVBbm5vdGF0aW9ucywgb0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wpIDogdHJ1ZTtcblx0Y29uc3QgdGl0bGVFeHByZXNzaW9uID0gcmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyhvRmllbGRUaXRsZUZpZWxkQ29udHJvbCk7XG5cdC8vIFRoZXJlIGlzIG5vIGV4cHJlc3Npb24gYW5kIHRoZSB0aXRsZSBpcyBub3QgcmVhZHkgb25seSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhbiBlZGl0YWJsZSBoZWFkZXJcblx0aWYgKCFiSXNUaXRsZVJlYWRPbmx5ICYmICF0aXRsZUV4cHJlc3Npb24pIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIENoZWNrIEFubm90YXRpb25zIGZvciBEZXNjcmlwdGlvbiBGaWVsZFxuXHQvLyBTZXQgdG8gdHJ1ZSBhbmQgZG9uJ3QgdGFrZSBpbnRvIGFjY291bnQsIGlmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucywgaS5lLiBubyBkZXNjcmlwdGlvbiBleGlzdHNcblx0Y29uc3QgYklzRGVzY3JpcHRpb25SZWFkT25seSA9IG9EZXNjcmlwdGlvbkFubm90YXRpb25zXG5cdFx0PyBpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zKG9EZXNjcmlwdGlvbkFubm90YXRpb25zLCBvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbClcblx0XHQ6IHRydWU7XG5cdGNvbnN0IGRlc2NyaXB0aW9uRXhwcmVzc2lvbiA9IHJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMob0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2wpO1xuXHQvLyBUaGVyZSBpcyBubyBleHByZXNzaW9uIGFuZCB0aGUgZGVzY3JpcHRpb24gaXMgbm90IHJlYWR5IG9ubHksIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYW4gZWRpdGFibGUgaGVhZGVyXG5cdGlmICghYklzRGVzY3JpcHRpb25SZWFkT25seSAmJiAhZGVzY3JpcHRpb25FeHByZXNzaW9uKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyBCb3RoIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBhcmUgbm90IGVkaXRhYmxlIGFuZCB0aGVyZSBhcmUgbm8gZHluYW1pYyBhbm5vdGF0aW9uc1xuXHRpZiAoYklzVGl0bGVSZWFkT25seSAmJiBiSXNEZXNjcmlwdGlvblJlYWRPbmx5ICYmICF0aXRsZUV4cHJlc3Npb24gJiYgIWRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIE5vdyBjb21iaW5lIGV4cHJlc3Npb25zXG5cdGlmICh0aXRsZUV4cHJlc3Npb24gJiYgIWRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiB0aXRsZUV4cHJlc3Npb247XG5cdH0gZWxzZSBpZiAoIXRpdGxlRXhwcmVzc2lvbiAmJiBkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRyZXR1cm4gZGVzY3JpcHRpb25FeHByZXNzaW9uO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21iaW5lVGl0bGVBbmREZXNjcmlwdGlvbkV4cHJlc3Npb24ob0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wsIG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKTtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGNvbWJpbmVUaXRsZUFuZERlc2NyaXB0aW9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChvVGl0bGVGaWVsZENvbnRyb2w6IGFueSwgb0Rlc2NyaXB0aW9uRmllbGRDb250cm9sOiBhbnkpIHtcblx0Ly8gSWYgYm90aCBoZWFkZXIgYW5kIHRpdGxlIGZpZWxkIGFyZSBiYXNlZCBvbiBkeW5tYWljIGZpZWxkIGNvbnRyb2wsIHRoZSBlZGl0YWJsZSBoZWFkZXJcblx0Ly8gaXMgdmlzaWJsZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgaXMgbm90IHJlYWR5IG9ubHlcblx0cmV0dXJuIFwiez0gJVwiICsgb1RpdGxlRmllbGRDb250cm9sICsgXCIgPT09IDEgPyAoICVcIiArIG9EZXNjcmlwdGlvbkZpZWxkQ29udHJvbCArIFwiID09PSAxID8gZmFsc2UgOiB0cnVlICkgOiB0cnVlIH1cIjtcbn07XG5cbi8qXG4gKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBvZiBkZWxldGUgYnV0dG9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IFtzRW50aXR5U2V0TmFtZV0gRW50aXR5IHNldCBuYW1lXG4gKiByZXR1cm5zIHtzdHJpbmd9ICBiaW5kaW5nIGV4cHJlc3Npb24gLyBmdW5jdGlvbiBzdHJpbmcgZ2VuZXJhdGVkIGZyb20gY29tbWFuaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJlc3NFeHByZXNzaW9uRm9yRGVsZXRlID0gZnVuY3Rpb24gKHNFbnRpdHlTZXROYW1lOiBhbnkpIHtcblx0Y29uc3Qgc0RlbGV0YWJsZUNvbnRleHRzID0gXCIkeyR2aWV3Pi9nZXRCaW5kaW5nQ29udGV4dH1cIixcblx0XHRzVGl0bGUgPSBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS9nZXRIZWFkZXJUaXRsZS9nZXRFeHBhbmRlZEhlYWRpbmcvZ2V0SXRlbXMvMS9nZXRUZXh0fVwiLFxuXHRcdHNEZXNjcmlwdGlvbiA9IFwiJHskdmlldz4vI2ZlOjpPYmplY3RQYWdlL2dldEhlYWRlclRpdGxlL2dldEV4cGFuZGVkQ29udGVudC8wL2dldEl0ZW1zLzAvZ2V0VGV4dH1cIjtcblx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHR0aXRsZTogc1RpdGxlLFxuXHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdGRlc2NyaXB0aW9uOiBzRGVzY3JpcHRpb25cblx0fTtcblx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFwiLmVkaXRGbG93LmRlbGV0ZURvY3VtZW50XCIsIHNEZWxldGFibGVDb250ZXh0cywgQ29tbW9uSGVscGVyLm9iamVjdFRvU3RyaW5nKG9QYXJhbXMpKTtcbn07XG5cbi8qXG4gKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBvZiBFZGl0IGJ1dHRvbi5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0RhdGFGaWVsZF0gRGF0YSBmaWVsZCBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc0VudGl0eVNldE5hbWVdIEVudGl0eSBzZXQgbmFtZVxuICogQHBhcmFtIHtvYmplY3R9IFtvSGVhZGVyQWN0aW9uXSBIZWFkZXIgYWN0aW9uIG9iamVjdFxuICogcmV0dXJucyB7c3RyaW5nfSAgYmluZGluZyBleHByZXNzaW9uIC8gZnVuY3Rpb24gc3RyaW5nIGdlbmVyYXRlZCBmcm9tIGNvbW1hbmhlbHBlcidzIGZ1bmN0aW9uIGdlbmVyYXRlRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByZXNzRXhwcmVzc2lvbkZvckVkaXQgPSBmdW5jdGlvbiAob0RhdGFGaWVsZDogYW55LCBzRW50aXR5U2V0TmFtZTogYW55LCBvSGVhZGVyQWN0aW9uOiBhbnkpIHtcblx0Y29uc3Qgc0VkaXRhYmxlQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+L2dldEJpbmRpbmdDb250ZXh0fVwiLFxuXHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRtb2RlbDogXCIkeyRzb3VyY2U+L30uZ2V0TW9kZWwoKVwiLFxuXHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5MYWJlbCwgdHJ1ZSksXG5cdFx0aXNOYXZpZ2FibGU6IG9IZWFkZXJBY3Rpb24gJiYgb0hlYWRlckFjdGlvbi5pc05hdmlnYWJsZSxcblx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246XG5cdFx0XHRvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uID8gYCcke29IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9ufSdgIDogdW5kZWZpbmVkXG5cdH07XG5cdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcIi5oYW5kbGVycy5vbkNhbGxBY3Rpb25cIiwgXCIkeyR2aWV3Pi99XCIsIHNFZGl0YWJsZUNvbnRleHRzLCBDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcob1BhcmFtcykpO1xufTtcblxuLypcbiAqIE1ldGhvZCB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSAncHJlc3MnIGV2ZW50IGZvciBmb290ZXIgYW5ub3RhdGlvbiBhY3Rpb25zXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gW29EYXRhRmllbGRdIERhdGEgZmllbGQgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gW3NFbnRpdHlTZXROYW1lXSBFbnRpdHkgc2V0IG5hbWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckFjdGlvbl0gSGVhZGVyIGFjdGlvbiBvYmplY3RcbiAqIHJldHVybnMge3N0cmluZ30gIEJpbmRpbmcgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiBzdHJpbmcgdGhhdCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgQ29tbW9uaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJlc3NFeHByZXNzaW9uRm9yRm9vdGVyQW5ub3RhdGlvbkFjdGlvbiA9IGZ1bmN0aW9uIChvRGF0YUZpZWxkOiBhbnksIHNFbnRpdHlTZXROYW1lOiBhbnksIG9IZWFkZXJBY3Rpb246IGFueSkge1xuXHRjb25zdCBzQWN0aW9uQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS99LmdldEJpbmRpbmdDb250ZXh0KClcIixcblx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNFbnRpdHlTZXROYW1lKSxcblx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0ludm9jYXRpb25Hcm91cCksXG5cdFx0bW9kZWw6IFwiJHskc291cmNlPi99LmdldE1vZGVsKClcIixcblx0XHRsYWJlbDogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuTGFiZWwsIHRydWUpLFxuXHRcdGlzTmF2aWdhYmxlOiBvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uaXNOYXZpZ2FibGUsXG5cdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOlxuXHRcdFx0b0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiA/IGAnJHtvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbn0nYCA6IHVuZGVmaW5lZFxuXHR9O1xuXHRyZXR1cm4gQ29tbW9uSGVscGVyLmdlbmVyYXRlRnVuY3Rpb24oXCIuaGFuZGxlcnMub25DYWxsQWN0aW9uXCIsIFwiJHskdmlldz4vfVwiLCBzQWN0aW9uQ29udGV4dHMsIENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKSk7XG59O1xuXG4vKlxuICogR2V0IEV4cHJlc3Npb24gb2YgZXhlY3V0ZSBldmVudCBleHByZXNzaW9uIG9mIHByaW1hcnkgYWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvRGF0YUZpZWxkXSBEYXRhIGZpZWxkIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IFtzRW50aXR5U2V0TmFtZV0gRW50aXR5IHNldCBuYW1lXG4gKiBAcGFyYW0ge29iamVjdH0gW29IZWFkZXJBY3Rpb25dIEhlYWRlciBhY3Rpb24gb2JqZWN0XG4gKiBAcGFyYW0ge0NvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nfSBUaGUgdmlzaWJpbGl0eSBvZiBzZW1hdGljIHBvc2l0aXZlIGFjdGlvblxuICogQHBhcmFtIHtDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZ30gVGhlIGVuYWJsZW1lbnQgb2Ygc2VtYW50aWMgcG9zaXRpdmUgYWN0aW9uXG4gKiBAcGFyYW0ge0NvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nfSBUaGUgRWRpdCBidXR0b24gdmlzaWJpbGl0eVxuICogQHBhcmFtIHtDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZ30gVGhlIGVuYWJsZW1lbnQgb2YgRWRpdCBidXR0b25cbiAqIHJldHVybnMge3N0cmluZ30gIGJpbmRpbmcgZXhwcmVzc2lvbiAvIGZ1bmN0aW9uIHN0cmluZyBnZW5lcmF0ZWQgZnJvbSBjb21tYW5oZWxwZXIncyBmdW5jdGlvbiBnZW5lcmF0ZUZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQcmVzc0V4cHJlc3Npb25Gb3JQcmltYXJ5QWN0aW9uID0gZnVuY3Rpb24gKFxuXHRvRGF0YUZpZWxkOiBhbnksXG5cdHNFbnRpdHlTZXROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG9IZWFkZXJBY3Rpb246IEJhc2VBY3Rpb24gfCBudWxsLFxuXHRwb3NpdGl2ZUFjdGlvblZpc2libGU6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nLFxuXHRwb3NpdGl2ZUFjdGlvbkVuYWJsZWQ6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nLFxuXHRlZGl0QWN0aW9uVmlzaWJsZTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBzdHJpbmcsXG5cdGVkaXRBY3Rpb25FbmFibGVkOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZ1xuKSB7XG5cdGNvbnN0IHNBY3Rpb25Db250ZXh0cyA9IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMob0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkFjdGlvbiksXG5cdFx0c0RhdGFGaWVsZEVudW1NZW1iZXIgPSBvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nICYmIG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nW1wiJEVudW1NZW1iZXJcIl0sXG5cdFx0c0ludm9jYXRpb25Hcm91cCA9IHNEYXRhRmllbGRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk9wZXJhdGlvbkdyb3VwaW5nVHlwZS9DaGFuZ2VTZXRcIiA/IFwiQ2hhbmdlU2V0XCIgOiBcIklzb2xhdGVkXCI7XG5cdGNvbnN0IG9QYXJhbXMgPSB7XG5cdFx0Y29udGV4dHM6IFwiJHskdmlldz4vI2ZlOjpPYmplY3RQYWdlL30uZ2V0QmluZGluZ0NvbnRleHQoKVwiLFxuXHRcdGVudGl0eVNldE5hbWU6IHNFbnRpdHlTZXROYW1lID8gQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzRW50aXR5U2V0TmFtZSkgOiBcIlwiLFxuXHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRtb2RlbDogXCIkeyRzb3VyY2U+L30uZ2V0TW9kZWwoKVwiLFxuXHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQ/LkxhYmVsLCB0cnVlKSxcblx0XHRpc05hdmlnYWJsZTogb0hlYWRlckFjdGlvbj8uaXNOYXZpZ2FibGUsXG5cdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBvSGVhZGVyQWN0aW9uPy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0XHRcdD8gYCcke29IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9ufSdgXG5cdFx0XHQ6IHVuZGVmaW5lZFxuXHR9O1xuXHRjb25zdCBvQ29uZGl0aW9ucyA9IHtcblx0XHRwb3NpdGl2ZUFjdGlvblZpc2libGUsXG5cdFx0cG9zaXRpdmVBY3Rpb25FbmFibGVkLFxuXHRcdGVkaXRBY3Rpb25WaXNpYmxlLFxuXHRcdGVkaXRBY3Rpb25FbmFibGVkXG5cdH07XG5cdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcblx0XHRcIi5oYW5kbGVycy5vblByaW1hcnlBY3Rpb25cIixcblx0XHRcIiRjb250cm9sbGVyXCIsXG5cdFx0XCIkeyR2aWV3Pi99XCIsXG5cdFx0XCIkeyR2aWV3Pi9nZXRCaW5kaW5nQ29udGV4dH1cIixcblx0XHRzQWN0aW9uQ29udGV4dHMsXG5cdFx0Q29tbW9uSGVscGVyLm9iamVjdFRvU3RyaW5nKG9QYXJhbXMpLFxuXHRcdENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvQ29uZGl0aW9ucylcblx0KTtcbn07XG5cbi8qXG4gKiBHZXRzIHRoZSBiaW5kaW5nIG9mIHRoZSBjb250YWluZXIgSEJveCBmb3IgdGhlIGhlYWRlciBmYWNldC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0NvbnRyb2xDb25maWd1cmF0aW9uXSBUaGUgY29udHJvbCBjb25maWd1cmF0aW9uIGZvcm0gb2YgdGhlIHZpZXdEYXRhIG1vZGVsXG4gKiBAcGFyYW0ge29iamVjdH0gW29IZWFkZXJGYWNldF0gVGhlIG9iamVjdCBvZiB0aGUgaGVhZGVyIGZhY2V0XG4gKiByZXR1cm5zIHsqfSAgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmcm9tIGZ1bmN0aW9uIGdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWcgb3IgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgY29uc3QgZ2V0U3Rhc2hhYmxlSEJveEJpbmRpbmcgPSBmdW5jdGlvbiAob0NvbnRyb2xDb25maWd1cmF0aW9uOiBhbnksIG9IZWFkZXJGYWNldDogYW55KSB7XG5cdGlmIChvSGVhZGVyRmFjZXQgJiYgb0hlYWRlckZhY2V0LkZhY2V0ICYmIG9IZWFkZXJGYWNldC5GYWNldC50YXJnZXRBbm5vdGF0aW9uVHlwZSA9PT0gXCJEYXRhUG9pbnRcIikge1xuXHRcdHJldHVybiBnZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnKG9Db250cm9sQ29uZmlndXJhdGlvbiwgb0hlYWRlckZhY2V0LkZhY2V0LnRhcmdldEFubm90YXRpb25WYWx1ZSk7XG5cdH1cbn07XG5cbi8qXG4gKiBHZXRzIHRoZSAnUHJlc3MnIGV2ZW50IGV4cHJlc3Npb24gZm9yIHRoZSBleHRlcm5hbCBhbmQgaW50ZXJuYWwgZGF0YSBwb2ludCBsaW5rLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvQ29uZmlndXJhdGlvbl0gQ29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb01hbmlmZXN0T3V0Ym91bmRdIE91dGJvdW5kcyBmcm9tIG1hbmlmZXN0XG4gKiByZXR1cm5zIHtzdHJpbmd9IFRoZSBydW50aW1lIGJpbmRpbmcgb2YgdGhlICdQcmVzcycgZXZlbnRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByZXNzRXhwcmVzc2lvbkZvckxpbmsgPSBmdW5jdGlvbiAob0NvbmZpZ3VyYXRpb246IGFueSwgb01hbmlmZXN0T3V0Ym91bmQ6IGFueSkge1xuXHRpZiAob0NvbmZpZ3VyYXRpb24pIHtcblx0XHRpZiAob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiBvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFwiLmhhbmRsZXJzLm9uRGF0YVBvaW50VGl0bGVQcmVzc2VkKCRjb250cm9sbGVyLCAkeyRzb3VyY2U+fSwgXCIgK1xuXHRcdFx0XHRKU09OLnN0cmluZ2lmeShvTWFuaWZlc3RPdXRib3VuZCkgK1xuXHRcdFx0XHRcIixcIiArXG5cdFx0XHRcdEpTT04uc3RyaW5naWZ5KG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSkgK1xuXHRcdFx0XHRcIilcIlxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pIHtcblx0XHRcdHJldHVybiBcIi5oYW5kbGVycy5uYXZpZ2F0ZVRvU3ViU2VjdGlvbigkY29udHJvbGxlciwgJ1wiICsgSlNPTi5zdHJpbmdpZnkob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkgKyBcIicpXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SGVhZGVyRm9ybUhib3hSZW5kZXJUeXBlID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmIChkYXRhRmllbGQ/LnRhcmdldE9iamVjdD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiBcIkJhcmVcIjtcbn07XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFnQ0EsSUFBTUEsVUFBVSxHQUFHQyxRQUFRLENBQUNELFVBQTVCOztFQU9BO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sSUFBTUUscUJBQXFCLEdBQUcsVUFDcENDLFdBRG9DLEVBRXBDQyxTQUZvQyxFQUdwQ0MsZUFIb0MsRUFJcENDLFVBSm9DLEVBS0Q7SUFBQTs7SUFDbkMsSUFBTUMsaUJBQWlCLEdBQUdDLFdBQVcsQ0FBQ0MsaUJBQVosQ0FBOEIsY0FBOUIsRUFBOENMLFNBQVMsQ0FBQ00sY0FBeEQsRUFBd0VDLFNBQXhFLEVBQW1GUCxTQUFTLENBQUNRLFNBQTdGLENBQTFCO0lBRUEsSUFBTUMsbUJBQW1CLEdBQUdMLFdBQVcsQ0FBQ0MsaUJBQVosQ0FDM0Isc0RBRDJCLEVBRTNCTCxTQUFTLENBQUNNLGNBRmlCLEVBRzNCQyxTQUgyQixFQUkzQlAsU0FBUyxDQUFDUSxTQUppQixDQUE1QjtJQU9BLElBQU1FLHFCQUFxQixHQUMxQixDQUFBWCxXQUFXLFNBQVgsSUFBQUEsV0FBVyxX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
@@ -4,7 +4,7 @@ import type { DataField, DataFieldTypes, HeaderInfoType } from "@sap-ux/vocabula
4
4
  import { UIAnnotationTerms, UIAnnotationTypes } from "@sap-ux/vocabularies-types/vocabularies/UI";
5
5
  import type ResourceBundle from "sap/base/i18n/ResourceBundle";
6
6
  import CommonUtils from "sap/fe/core/CommonUtils";
7
- import type { ConverterAction } from "sap/fe/core/converters/controls/Common/Action";
7
+ import type { BaseAction, ConverterAction } from "sap/fe/core/converters/controls/Common/Action";
8
8
  import { Draft, Entity, UI } from "sap/fe/core/converters/helpers/BindingHelper";
9
9
  import type { ManifestAction } from "sap/fe/core/converters/ManifestSettings";
10
10
  import {
@@ -83,7 +83,8 @@ export const getExpressionForTitle = function (
83
83
  : "";
84
84
  let titleValueExpression,
85
85
  connectedFieldsPath,
86
- titleIsEmpty: BindingToolkitExpression<boolean> = constant(true);
86
+ titleIsEmpty: BindingToolkitExpression<boolean> = constant(true),
87
+ titleBooleanExpression: BindingToolkitExpression<boolean> | boolean;
87
88
  if (oHeaderInfo?.Title?.$Type === "com.sap.vocabularies.UI.v1.DataField") {
88
89
  titleValueExpression = getExpressionFromAnnotation((oHeaderInfo?.Title as DataFieldTypes)?.Value);
89
90
  if ((oHeaderInfo?.Title as DataFieldTypes)?.Value?.$target?.annotations?.Common?.Text?.annotations?.UI?.TextArrangement) {
@@ -91,19 +92,20 @@ export const getExpressionForTitle = function (
91
92
  titleValueExpression = addTextArrangementToBindingExpression(titleValueExpression, fullContextPath);
92
93
  }
93
94
  titleValueExpression = formatValueRecursively(titleValueExpression, fullContextPath);
94
- titleIsEmpty = isEmpty(titleValueExpression);
95
+ titleIsEmpty = titleValueExpression?._type === "Constant" ? constant(!titleValueExpression?.value) : isEmpty(titleValueExpression);
95
96
  } else if (
96
97
  oHeaderInfo?.Title?.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" &&
97
98
  oHeaderInfo?.Title?.Target.$target.$Type === "com.sap.vocabularies.UI.v1.ConnectedFieldsType"
98
99
  ) {
99
100
  connectedFieldsPath = enhanceDataModelPath(fullContextPath, "$Type/@UI.HeaderInfo/Title/Target/$AnnotationPath");
100
101
  titleValueExpression = getLabelForConnectedFields(connectedFieldsPath, false) as BindingToolkitExpression<string>;
101
- titleIsEmpty = titleValueExpression ? isEmpty(titleValueExpression) : constant(true);
102
+ titleBooleanExpression = titleValueExpression?._type === "Constant" ? constant(!titleValueExpression?.value) : isEmpty(titleValueExpression);
103
+ titleIsEmpty = titleValueExpression ? titleBooleanExpression : constant(true);
102
104
  }
103
105
 
104
106
  // If there is a TypeName defined, show the default title 'New + TypeName', otherwise show the custom title or the default 'New object'
105
107
  const createModeTitle = oHeaderInfo?.TypeName
106
- ? concat(titleWithHeaderInfo, ": ", getExpressionFromAnnotation(oHeaderInfo.TypeName.toString()))
108
+ ? concat(titleWithHeaderInfo, ": ", resolveBindingString(oHeaderInfo.TypeName.toString()))
107
109
  : titleNoHeaderInfo;
108
110
  const activeExpression = oDraftRoot ? Entity.IsActive : true;
109
111
  return compileExpression(
@@ -795,6 +797,59 @@ export const getPressExpressionForFooterAnnotationAction = function (oDataField:
795
797
  return CommonHelper.generateFunction(".handlers.onCallAction", "${$view>/}", sActionContexts, CommonHelper.objectToString(oParams));
796
798
  };
797
799
 
800
+ /*
801
+ * Get Expression of execute event expression of primary action.
802
+ *
803
+ * @function
804
+ * @param {object} [oDataField] Data field object
805
+ * @param {string} [sEntitySetName] Entity set name
806
+ * @param {object} [oHeaderAction] Header action object
807
+ * @param {CompiledBindingToolkitExpression | string} The visibility of sematic positive action
808
+ * @param {CompiledBindingToolkitExpression | string} The enablement of semantic positive action
809
+ * @param {CompiledBindingToolkitExpression | string} The Edit button visibility
810
+ * @param {CompiledBindingToolkitExpression | string} The enablement of Edit button
811
+ * returns {string} binding expression / function string generated from commanhelper's function generateFunction
812
+ */
813
+ export const getPressExpressionForPrimaryAction = function (
814
+ oDataField: any,
815
+ sEntitySetName: string | undefined,
816
+ oHeaderAction: BaseAction | null,
817
+ positiveActionVisible: CompiledBindingToolkitExpression | string,
818
+ positiveActionEnabled: CompiledBindingToolkitExpression | string,
819
+ editActionVisible: CompiledBindingToolkitExpression | string,
820
+ editActionEnabled: CompiledBindingToolkitExpression | string
821
+ ) {
822
+ const sActionContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
823
+ sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
824
+ sInvocationGroup = sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
825
+ const oParams = {
826
+ contexts: "${$view>/#fe::ObjectPage/}.getBindingContext()",
827
+ entitySetName: sEntitySetName ? CommonHelper.addSingleQuotes(sEntitySetName) : "",
828
+ invocationGrouping: CommonHelper.addSingleQuotes(sInvocationGroup),
829
+ model: "${$source>/}.getModel()",
830
+ label: CommonHelper.addSingleQuotes(oDataField?.Label, true),
831
+ isNavigable: oHeaderAction?.isNavigable,
832
+ defaultValuesExtensionFunction: oHeaderAction?.defaultValuesExtensionFunction
833
+ ? `'${oHeaderAction.defaultValuesExtensionFunction}'`
834
+ : undefined
835
+ };
836
+ const oConditions = {
837
+ positiveActionVisible,
838
+ positiveActionEnabled,
839
+ editActionVisible,
840
+ editActionEnabled
841
+ };
842
+ return CommonHelper.generateFunction(
843
+ ".handlers.onPrimaryAction",
844
+ "$controller",
845
+ "${$view>/}",
846
+ "${$view>/getBindingContext}",
847
+ sActionContexts,
848
+ CommonHelper.objectToString(oParams),
849
+ CommonHelper.objectToString(oConditions)
850
+ );
851
+ };
852
+
798
853
  /*
799
854
  * Gets the binding of the container HBox for the header facet.
800
855
  *
@@ -51,4 +51,4 @@ sap.ui.define(["sap/ui/core/Core"], function (Core) {
51
51
  };
52
52
  return StashableHBoxDesignTime;
53
53
  }, false);
54
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJvUmVzb3VyY2VCdW5kbGUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiU3Rhc2hhYmxlSEJveERlc2lnblRpbWUiLCJhY3Rpb25zIiwicmVtb3ZlIiwiY2hhbmdlVHlwZSIsInJldmVhbCIsInJlbmFtZSIsImRvbVJlZiIsIm9Db250cm9sIiwib1RpdGxlQ29udHJvbCIsImdldFRpdGxlQ29udHJvbCIsImdldERvbVJlZiIsIm5hbWUiLCJzaW5ndWxhciIsImdldFRleHQiLCJwbHVyYWwiLCJwYWxldHRlIiwiZ3JvdXAiLCJpY29ucyIsInN2ZyIsInRlbXBsYXRlcyIsImNyZWF0ZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiU3Rhc2hhYmxlSEJveC5kZXNpZ250aW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgdHlwZSB7IENvcmVFeCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxuY29uc3Qgb1Jlc291cmNlQnVuZGxlID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUudGVtcGxhdGVzXCIpO1xuXG5jb25zdCBTdGFzaGFibGVIQm94RGVzaWduVGltZSA9IHtcblx0YWN0aW9uczoge1xuXHRcdHJlbW92ZToge1xuXHRcdFx0Y2hhbmdlVHlwZTogXCJzdGFzaENvbnRyb2xcIlxuXHRcdH0sXG5cdFx0cmV2ZWFsOiB7XG5cdFx0XHRjaGFuZ2VUeXBlOiBcInVuc3Rhc2hDb250cm9sXCJcblx0XHR9LFxuXHRcdHJlbmFtZTogZnVuY3Rpb24gKC8qb0hlYWRlckZhY2V0OiBhbnkqLykge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Y2hhbmdlVHlwZTogXCJyZW5hbWVIZWFkZXJGYWNldFwiLFxuXHRcdFx0XHRkb21SZWY6IGZ1bmN0aW9uIChvQ29udHJvbDogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1RpdGxlQ29udHJvbCA9IG9Db250cm9sLmdldFRpdGxlQ29udHJvbCgpO1xuXHRcdFx0XHRcdGlmIChvVGl0bGVDb250cm9sKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1RpdGxlQ29udHJvbC5nZXREb21SZWYoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0fSxcblx0bmFtZToge1xuXHRcdHNpbmd1bGFyOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJUX1NUQVNIQUJMRV9IQk9YX1JUQV9IRUFERVJGQUNFVF9NRU5VX0FERFwiKTtcblx0XHR9LFxuXHRcdHBsdXJhbDogZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9TVEFTSEFCTEVfSEJPWF9SVEFfSEVBREVSRkFDRVRfTUVOVV9BRERfUExVUkFMXCIpO1xuXHRcdH1cblx0fSxcblx0cGFsZXR0ZToge1xuXHRcdGdyb3VwOiBcIkxBWU9VVFwiLFxuXHRcdGljb25zOiB7XG5cdFx0XHRzdmc6IFwic2FwL20vZGVzaWdudGltZS9IQm94Lmljb24uc3ZnXCJcblx0XHR9XG5cdH0sXG5cdHRlbXBsYXRlczoge1xuXHRcdGNyZWF0ZTogXCJzYXAvbS9kZXNpZ250aW1lL0hCb3guY3JlYXRlLmZyYWdtZW50LnhtbFwiXG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFN0YXNoYWJsZUhCb3hEZXNpZ25UaW1lO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7O0VBR0EsSUFBTUEsZUFBZSxHQUFJQyxJQUFELENBQWlCQyx3QkFBakIsQ0FBMEMsa0JBQTFDLENBQXhCO0VBRUEsSUFBTUMsdUJBQXVCLEdBQUc7SUFDL0JDLE9BQU8sRUFBRTtNQUNSQyxNQUFNLEVBQUU7UUFDUEMsVUFBVSxFQUFFO01BREwsQ0FEQTtNQUlSQyxNQUFNLEVBQUU7UUFDUEQsVUFBVSxFQUFFO01BREwsQ0FKQTtNQU9SRSxNQUFNLEVBQUU7UUFBVTtNQUFWLEdBQWlDO1FBQ3hDLE9BQU87VUFDTkYsVUFBVSxFQUFFLG1CQUROO1VBRU5HLE1BQU0sRUFBRSxVQUFVQyxRQUFWLEVBQXlCO1lBQ2hDLElBQU1DLGFBQWEsR0FBR0QsUUFBUSxDQUFDRSxlQUFULEVBQXRCOztZQUNBLElBQUlELGFBQUosRUFBbUI7Y0FDbEIsT0FBT0EsYUFBYSxDQUFDRSxTQUFkLEVBQVA7WUFDQSxDQUZELE1BRU87Y0FDTixPQUFPLElBQVA7WUFDQTtVQUNEO1FBVEssQ0FBUDtNQVdBO0lBbkJPLENBRHNCO0lBc0IvQkMsSUFBSSxFQUFFO01BQ0xDLFFBQVEsRUFBRSxZQUFZO1FBQ3JCLE9BQU9mLGVBQWUsQ0FBQ2dCLE9BQWhCLENBQXdCLDJDQUF4QixDQUFQO01BQ0EsQ0FISTtNQUlMQyxNQUFNLEVBQUUsWUFBWTtRQUNuQixPQUFPakIsZUFBZSxDQUFDZ0IsT0FBaEIsQ0FBd0Isa0RBQXhCLENBQVA7TUFDQTtJQU5JLENBdEJ5QjtJQThCL0JFLE9BQU8sRUFBRTtNQUNSQyxLQUFLLEVBQUUsUUFEQztNQUVSQyxLQUFLLEVBQUU7UUFDTkMsR0FBRyxFQUFFO01BREM7SUFGQyxDQTlCc0I7SUFvQy9CQyxTQUFTLEVBQUU7TUFDVkMsTUFBTSxFQUFFO0lBREU7RUFwQ29CLENBQWhDO1NBeUNlcEIsdUIifQ==
54
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJvUmVzb3VyY2VCdW5kbGUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiU3Rhc2hhYmxlSEJveERlc2lnblRpbWUiLCJhY3Rpb25zIiwicmVtb3ZlIiwiY2hhbmdlVHlwZSIsInJldmVhbCIsInJlbmFtZSIsImRvbVJlZiIsIm9Db250cm9sIiwib1RpdGxlQ29udHJvbCIsImdldFRpdGxlQ29udHJvbCIsImdldERvbVJlZiIsIm5hbWUiLCJzaW5ndWxhciIsImdldFRleHQiLCJwbHVyYWwiLCJwYWxldHRlIiwiZ3JvdXAiLCJpY29ucyIsInN2ZyIsInRlbXBsYXRlcyIsImNyZWF0ZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiU3Rhc2hhYmxlSEJveC5kZXNpZ250aW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5cbmNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLnRlbXBsYXRlc1wiKTtcblxuY29uc3QgU3Rhc2hhYmxlSEJveERlc2lnblRpbWUgPSB7XG5cdGFjdGlvbnM6IHtcblx0XHRyZW1vdmU6IHtcblx0XHRcdGNoYW5nZVR5cGU6IFwic3Rhc2hDb250cm9sXCJcblx0XHR9LFxuXHRcdHJldmVhbDoge1xuXHRcdFx0Y2hhbmdlVHlwZTogXCJ1bnN0YXNoQ29udHJvbFwiXG5cdFx0fSxcblx0XHRyZW5hbWU6IGZ1bmN0aW9uICgvKm9IZWFkZXJGYWNldDogYW55Ki8pIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGNoYW5nZVR5cGU6IFwicmVuYW1lSGVhZGVyRmFjZXRcIixcblx0XHRcdFx0ZG9tUmVmOiBmdW5jdGlvbiAob0NvbnRyb2w6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IG9UaXRsZUNvbnRyb2wgPSBvQ29udHJvbC5nZXRUaXRsZUNvbnRyb2woKTtcblx0XHRcdFx0XHRpZiAob1RpdGxlQ29udHJvbCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9UaXRsZUNvbnRyb2wuZ2V0RG9tUmVmKCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdH0sXG5cdG5hbWU6IHtcblx0XHRzaW5ndWxhcjogZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9TVEFTSEFCTEVfSEJPWF9SVEFfSEVBREVSRkFDRVRfTUVOVV9BRERcIik7XG5cdFx0fSxcblx0XHRwbHVyYWw6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfU1RBU0hBQkxFX0hCT1hfUlRBX0hFQURFUkZBQ0VUX01FTlVfQUREX1BMVVJBTFwiKTtcblx0XHR9XG5cdH0sXG5cdHBhbGV0dGU6IHtcblx0XHRncm91cDogXCJMQVlPVVRcIixcblx0XHRpY29uczoge1xuXHRcdFx0c3ZnOiBcInNhcC9tL2Rlc2lnbnRpbWUvSEJveC5pY29uLnN2Z1wiXG5cdFx0fVxuXHR9LFxuXHR0ZW1wbGF0ZXM6IHtcblx0XHRjcmVhdGU6IFwic2FwL20vZGVzaWdudGltZS9IQm94LmNyZWF0ZS5mcmFnbWVudC54bWxcIlxuXHR9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTdGFzaGFibGVIQm94RGVzaWduVGltZTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7OztFQUVBLElBQU1BLGVBQWUsR0FBR0MsSUFBSSxDQUFDQyx3QkFBTCxDQUE4QixrQkFBOUIsQ0FBeEI7RUFFQSxJQUFNQyx1QkFBdUIsR0FBRztJQUMvQkMsT0FBTyxFQUFFO01BQ1JDLE1BQU0sRUFBRTtRQUNQQyxVQUFVLEVBQUU7TUFETCxDQURBO01BSVJDLE1BQU0sRUFBRTtRQUNQRCxVQUFVLEVBQUU7TUFETCxDQUpBO01BT1JFLE1BQU0sRUFBRTtRQUFVO01BQVYsR0FBaUM7UUFDeEMsT0FBTztVQUNORixVQUFVLEVBQUUsbUJBRE47VUFFTkcsTUFBTSxFQUFFLFVBQVVDLFFBQVYsRUFBeUI7WUFDaEMsSUFBTUMsYUFBYSxHQUFHRCxRQUFRLENBQUNFLGVBQVQsRUFBdEI7O1lBQ0EsSUFBSUQsYUFBSixFQUFtQjtjQUNsQixPQUFPQSxhQUFhLENBQUNFLFNBQWQsRUFBUDtZQUNBLENBRkQsTUFFTztjQUNOLE9BQU8sSUFBUDtZQUNBO1VBQ0Q7UUFUSyxDQUFQO01BV0E7SUFuQk8sQ0FEc0I7SUFzQi9CQyxJQUFJLEVBQUU7TUFDTEMsUUFBUSxFQUFFLFlBQVk7UUFDckIsT0FBT2YsZUFBZSxDQUFDZ0IsT0FBaEIsQ0FBd0IsMkNBQXhCLENBQVA7TUFDQSxDQUhJO01BSUxDLE1BQU0sRUFBRSxZQUFZO1FBQ25CLE9BQU9qQixlQUFlLENBQUNnQixPQUFoQixDQUF3QixrREFBeEIsQ0FBUDtNQUNBO0lBTkksQ0F0QnlCO0lBOEIvQkUsT0FBTyxFQUFFO01BQ1JDLEtBQUssRUFBRSxRQURDO01BRVJDLEtBQUssRUFBRTtRQUNOQyxHQUFHLEVBQUU7TUFEQztJQUZDLENBOUJzQjtJQW9DL0JDLFNBQVMsRUFBRTtNQUNWQyxNQUFNLEVBQUU7SUFERTtFQXBDb0IsQ0FBaEM7U0F5Q2VwQix1QiJ9
@@ -1,7 +1,6 @@
1
1
  import Core from "sap/ui/core/Core";
2
- import type { CoreEx } from "types/extension_types";
3
2
 
4
- const oResourceBundle = (Core as CoreEx).getLibraryResourceBundle("sap.fe.templates");
3
+ const oResourceBundle = Core.getLibraryResourceBundle("sap.fe.templates");
5
4
 
6
5
  const StashableHBoxDesignTime = {
7
6
  actions: {