@sapui5/sap.fe.core 1.95.0 → 1.98.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 (207) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +3 -3
  4. package/src/sap/fe/core/AppComponent.js +9 -44
  5. package/src/sap/fe/core/AppStateHandler.js +2 -2
  6. package/src/sap/fe/core/BaseController.js +1 -1
  7. package/src/sap/fe/core/BusyLocker.js +13 -1
  8. package/src/sap/fe/core/CommonUtils.js +129 -219
  9. package/src/sap/fe/core/ExtensionAPI.js +14 -6
  10. package/src/sap/fe/core/PageController.js +9 -35
  11. package/src/sap/fe/core/RouterProxy.js +79 -75
  12. package/src/sap/fe/core/Synchronization.js +1 -1
  13. package/src/sap/fe/core/TemplateComponent.js +16 -7
  14. package/src/sap/fe/core/TemplateModel.js +1 -1
  15. package/src/sap/fe/core/TransactionHelper.js +183 -65
  16. package/src/sap/fe/core/actions/draft.js +50 -23
  17. package/src/sap/fe/core/actions/messageHandling.js +86 -7
  18. package/src/sap/fe/core/actions/nonDraft.js +1 -1
  19. package/src/sap/fe/core/actions/operations.js +75 -33
  20. package/src/sap/fe/core/actions/sticky.js +1 -1
  21. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +1 -1
  22. package/src/sap/fe/core/controllerextensions/EditFlow.js +276 -122
  23. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
  24. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +14 -6
  25. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +90 -46
  26. package/src/sap/fe/core/controllerextensions/InternalRouting.js +234 -232
  27. package/src/sap/fe/core/controllerextensions/KPIManagement.js +539 -209
  28. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +550 -213
  29. package/src/sap/fe/core/controllerextensions/MassEdit.js +79 -0
  30. package/src/sap/fe/core/controllerextensions/MessageHandler.js +227 -103
  31. package/src/sap/fe/core/controllerextensions/PageReady.js +2 -2
  32. package/src/sap/fe/core/controllerextensions/PageReady.ts +3 -7
  33. package/src/sap/fe/core/controllerextensions/Paginator.js +38 -12
  34. package/src/sap/fe/core/controllerextensions/Placeholder.js +16 -19
  35. package/src/sap/fe/core/controllerextensions/Routing.js +17 -2
  36. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  37. package/src/sap/fe/core/controllerextensions/Share.js +20 -7
  38. package/src/sap/fe/core/controllerextensions/SideEffects.js +8 -9
  39. package/src/sap/fe/core/controllerextensions/SideEffects.ts +19 -17
  40. package/src/sap/fe/core/controllerextensions/ViewState.js +54 -9
  41. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +40 -34
  42. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +35 -0
  43. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  44. package/src/sap/fe/core/controls/ConditionalWrapper.js +1 -1
  45. package/src/sap/fe/core/controls/CustomQuickViewPage.js +110 -109
  46. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +7 -4
  47. package/src/sap/fe/core/controls/FieldWrapper.js +10 -4
  48. package/src/sap/fe/core/controls/FilterBar.js +1 -1
  49. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -6
  50. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +45 -0
  51. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -1
  52. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +1 -1
  53. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
  54. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +1 -1
  55. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
  56. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  57. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +78 -0
  58. package/src/sap/fe/core/converters/ConverterContext.js +13 -1
  59. package/src/sap/fe/core/converters/ConverterContext.ts +10 -0
  60. package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
  61. package/src/sap/fe/core/converters/ManifestSettings.ts +7 -1
  62. package/src/sap/fe/core/converters/ManifestWrapper.js +18 -7
  63. package/src/sap/fe/core/converters/ManifestWrapper.ts +15 -6
  64. package/src/sap/fe/core/converters/MetaModelConverter.js +920 -882
  65. package/src/sap/fe/core/converters/MetaModelConverter.ts +829 -853
  66. package/src/sap/fe/core/converters/annotations/DataField.js +54 -4
  67. package/src/sap/fe/core/converters/annotations/DataField.ts +53 -3
  68. package/src/sap/fe/core/converters/common/AnnotationConverter.js +83 -48
  69. package/src/sap/fe/core/converters/controls/Common/Action.js +15 -3
  70. package/src/sap/fe/core/converters/controls/Common/Action.ts +12 -3
  71. package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -3
  72. package/src/sap/fe/core/converters/controls/Common/Chart.ts +0 -2
  73. package/src/sap/fe/core/converters/controls/Common/Form.js +68 -21
  74. package/src/sap/fe/core/converters/controls/Common/Form.ts +60 -16
  75. package/src/sap/fe/core/converters/controls/Common/KPI.js +331 -248
  76. package/src/sap/fe/core/converters/controls/Common/KPI.ts +355 -287
  77. package/src/sap/fe/core/converters/controls/Common/Table.js +426 -332
  78. package/src/sap/fe/core/converters/controls/Common/Table.ts +516 -383
  79. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +468 -0
  80. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +609 -0
  81. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +30 -13
  82. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +31 -12
  83. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  84. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  85. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +15 -7
  86. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +27 -6
  87. package/src/sap/fe/core/converters/helpers/Aggregation.js +8 -1
  88. package/src/sap/fe/core/converters/helpers/Aggregation.ts +9 -1
  89. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  90. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +2 -2
  91. package/src/sap/fe/core/converters/helpers/ID.js +9 -1
  92. package/src/sap/fe/core/converters/helpers/ID.ts +6 -2
  93. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -5
  94. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -4
  95. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +2 -2
  96. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +1 -1
  97. package/src/sap/fe/core/converters/templates/ListReportConverter.js +34 -4
  98. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -7
  99. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +2 -5
  100. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +1 -2
  101. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -2
  102. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  103. package/src/sap/fe/core/formatters/FPMFormatter.ts +8 -3
  104. package/src/sap/fe/core/formatters/TableFormatter.js +27 -4
  105. package/src/sap/fe/core/formatters/TableFormatter.ts +20 -3
  106. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  107. package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -3
  108. package/src/sap/fe/core/fpm/Component.js +2 -2
  109. package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
  110. package/src/sap/fe/core/helpers/AppStartupHelper.ts +388 -0
  111. package/src/sap/fe/core/helpers/BindingExpression.js +199 -111
  112. package/src/sap/fe/core/helpers/BindingExpression.ts +193 -102
  113. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
  114. package/src/sap/fe/core/helpers/EditState.js +1 -1
  115. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -3
  116. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  117. package/src/sap/fe/core/helpers/KeepAliveHelper.js +211 -0
  118. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
  119. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
  120. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
  121. package/src/sap/fe/core/helpers/MassEditHelper.js +678 -0
  122. package/src/sap/fe/core/helpers/ModelHelper.js +64 -1
  123. package/src/sap/fe/core/helpers/PasteHelper.js +7 -1
  124. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  125. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  126. package/src/sap/fe/core/helpers/StableIdHelper.js +2 -2
  127. package/src/sap/fe/core/helpers/StableIdHelper.ts +1 -1
  128. package/src/sap/fe/core/library.js +28 -2
  129. package/src/sap/fe/core/library.support.js +10 -4
  130. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
  131. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
  132. package/src/sap/fe/core/messagebundle.properties +67 -3
  133. package/src/sap/fe/core/messagebundle_ar.properties +40 -3
  134. package/src/sap/fe/core/messagebundle_bg.properties +40 -3
  135. package/src/sap/fe/core/messagebundle_ca.properties +41 -4
  136. package/src/sap/fe/core/messagebundle_cs.properties +41 -4
  137. package/src/sap/fe/core/messagebundle_cy.properties +40 -3
  138. package/src/sap/fe/core/messagebundle_da.properties +40 -3
  139. package/src/sap/fe/core/messagebundle_de.properties +40 -3
  140. package/src/sap/fe/core/messagebundle_el.properties +40 -3
  141. package/src/sap/fe/core/messagebundle_en.properties +37 -0
  142. package/src/sap/fe/core/messagebundle_en_GB.properties +37 -0
  143. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +37 -0
  144. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +46 -2
  145. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -0
  146. package/src/sap/fe/core/messagebundle_es.properties +40 -3
  147. package/src/sap/fe/core/messagebundle_es_MX.properties +41 -4
  148. package/src/sap/fe/core/messagebundle_et.properties +40 -3
  149. package/src/sap/fe/core/messagebundle_fi.properties +40 -3
  150. package/src/sap/fe/core/messagebundle_fr.properties +41 -4
  151. package/src/sap/fe/core/messagebundle_fr_CA.properties +40 -3
  152. package/src/sap/fe/core/messagebundle_hi.properties +40 -3
  153. package/src/sap/fe/core/messagebundle_hr.properties +40 -3
  154. package/src/sap/fe/core/messagebundle_hu.properties +41 -4
  155. package/src/sap/fe/core/messagebundle_id.properties +42 -5
  156. package/src/sap/fe/core/messagebundle_it.properties +40 -3
  157. package/src/sap/fe/core/messagebundle_iw.properties +40 -3
  158. package/src/sap/fe/core/messagebundle_ja.properties +49 -12
  159. package/src/sap/fe/core/messagebundle_kk.properties +40 -3
  160. package/src/sap/fe/core/messagebundle_ko.properties +40 -3
  161. package/src/sap/fe/core/messagebundle_lt.properties +40 -3
  162. package/src/sap/fe/core/messagebundle_lv.properties +40 -3
  163. package/src/sap/fe/core/messagebundle_ms.properties +40 -3
  164. package/src/sap/fe/core/messagebundle_nl.properties +40 -3
  165. package/src/sap/fe/core/messagebundle_no.properties +40 -3
  166. package/src/sap/fe/core/messagebundle_pl.properties +40 -3
  167. package/src/sap/fe/core/messagebundle_pt.properties +42 -5
  168. package/src/sap/fe/core/messagebundle_pt_PT.properties +40 -3
  169. package/src/sap/fe/core/messagebundle_ro.properties +40 -3
  170. package/src/sap/fe/core/messagebundle_ru.properties +40 -3
  171. package/src/sap/fe/core/messagebundle_sh.properties +40 -3
  172. package/src/sap/fe/core/messagebundle_sk.properties +40 -3
  173. package/src/sap/fe/core/messagebundle_sl.properties +40 -3
  174. package/src/sap/fe/core/messagebundle_sv.properties +41 -4
  175. package/src/sap/fe/core/messagebundle_th.properties +40 -3
  176. package/src/sap/fe/core/messagebundle_tr.properties +40 -3
  177. package/src/sap/fe/core/messagebundle_uk.properties +40 -3
  178. package/src/sap/fe/core/messagebundle_vi.properties +40 -3
  179. package/src/sap/fe/core/messagebundle_zh_CN.properties +40 -3
  180. package/src/sap/fe/core/messagebundle_zh_TW.properties +40 -3
  181. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
  182. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
  183. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
  184. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -0
  185. package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
  186. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  187. package/src/sap/fe/core/services/RoutingServiceFactory.js +98 -328
  188. package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
  189. package/src/sap/fe/core/services/ShellServicesFactory.ts +30 -1
  190. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +8 -5
  191. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +11 -6
  192. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +14 -5
  193. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  194. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  195. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  196. package/src/sap/fe/core/templating/DataModelPathHelper.js +8 -37
  197. package/src/sap/fe/core/templating/DataModelPathHelper.ts +13 -33
  198. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  199. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  200. package/src/sap/fe/core/templating/EntitySetHelper.js +86 -3
  201. package/src/sap/fe/core/templating/EntitySetHelper.ts +44 -0
  202. package/src/sap/fe/core/templating/FilterHelper.js +10 -7
  203. package/src/sap/fe/core/templating/FilterHelper.ts +8 -6
  204. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  205. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  206. package/src/sap/fe/core/templating/UIFormatters.js +47 -107
  207. package/src/sap/fe/core/templating/UIFormatters.ts +76 -72
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerextensions/ControllerExtensionMetadata", "../helpers/ClassSupport", "sap/ui/model/json/JSONModel", "sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/formatters/TableFormatterTypes", "sap/ui/core/format/NumberFormat", "sap/ui/core/format/DateFormat", "sap/ui/core/Locale", "sap/ui/model/Filter", "sap/m/Popover", "sap/ui/integration/widgets/Card"], function (ControllerExtension, ControllerExtensionMetadata, ClassSupport, JSONModel, Log, CommonUtils, TableFormatterTypes, NumberFormat, DateFormat, Locale, Filter, Popover, Card) {
5
+ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerextensions/ControllerExtensionMetadata", "../helpers/ClassSupport", "sap/ui/model/json/JSONModel", "sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sap/ui/core/format/NumberFormat", "sap/ui/core/format/DateFormat", "sap/ui/core/Locale", "sap/ui/model/Filter", "sap/ui/model/Sorter", "sap/m/Popover"], function (ControllerExtension, ControllerExtensionMetadata, ClassSupport, JSONModel, Log, TableFormatterTypes, NumberFormat, DateFormat, Locale, Filter, Sorter, Popover) {
6
6
  "use strict";
7
7
 
8
8
  var _dec, _dec2, _dec3, _class, _class2;
@@ -24,7 +24,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
24
24
 
25
25
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
26
26
 
27
- function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
27
+ function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
28
28
 
29
29
  function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
30
30
 
@@ -34,51 +34,27 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
34
34
 
35
35
  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
36
36
 
37
+ var MessageTypeFromCriticality = {
38
+ "1": MessageType.Error,
39
+ "2": MessageType.Warning,
40
+ "3": MessageType.Success,
41
+ "5": MessageType.Information
42
+ };
43
+ var ValueColorFromMessageType = {
44
+ Error: "Error",
45
+ Warning: "Critical",
46
+ Success: "Good",
47
+ Information: "None",
48
+ None: "None"
49
+ };
37
50
  /**
38
- * Function to calculate a message state from a criticality value.
39
- *
40
- * @param {number|string} criticalityValue The criticality values.
41
- * @returns {MessageType} Returns the corresponding MessageType
42
- */
43
- function messageTypeFromCriticality(criticalityValue) {
44
- var criticalityProperty;
45
-
46
- switch (criticalityValue) {
47
- case 1:
48
- case "1":
49
- criticalityProperty = MessageType.Error;
50
- break;
51
-
52
- case 2:
53
- case "2":
54
- criticalityProperty = MessageType.Warning;
55
- break;
56
-
57
- case 3:
58
- case "3":
59
- criticalityProperty = MessageType.Success;
60
- break;
61
-
62
- case 5:
63
- case "5":
64
- criticalityProperty = MessageType.Information;
65
- break;
66
-
67
- default:
68
- criticalityProperty = MessageType.None;
69
- }
70
-
71
- return criticalityProperty;
72
- }
73
- /**
74
- * Function to calculate the message state for a criticality calculation of type 'Target'.
51
+ * Function to get a message state from a calculated criticality of type 'Target'.
75
52
  *
76
53
  * @param {number} kpiValue The value of the KPI to be tested against.
77
54
  * @param {number[]} aThresholds Thresholds to be used [DeviationRangeLowValue,ToleranceRangeLowValue,AcceptanceRangeLowValue,AcceptanceRangeHighValue,ToleranceRangeHighValue,DeviationRangeHighValue].
78
55
  * @returns {MessageType} Returns the corresponding MessageType
79
56
  */
80
57
 
81
-
82
58
  function messageTypeFromTargetCalculation(kpiValue, aThresholds) {
83
59
  var criticalityProperty;
84
60
 
@@ -101,7 +77,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
101
77
  return criticalityProperty;
102
78
  }
103
79
  /**
104
- * Function to calculate the message state for a criticality calculation of type 'Minimize'.
80
+ * Function to get a message state from a calculated criticality of type 'Minimize'.
105
81
  *
106
82
  * @param {number} kpiValue The value of the KPI to be tested against.
107
83
  * @param {number[]} aThresholds Thresholds to be used [AcceptanceRangeHighValue,ToleranceRangeHighValue,DeviationRangeHighValue].
@@ -125,30 +101,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
125
101
  return criticalityProperty;
126
102
  }
127
103
  /**
128
- * Function to transform a MessageType into a ValueColor.
129
- *
130
- * @param messageType The message type
131
- * @returns The ValueColor
132
- */
133
-
134
-
135
- function valueColorFromMessageType(messageType) {
136
- switch (messageType) {
137
- case MessageType.Error:
138
- return "Error";
139
-
140
- case MessageType.Warning:
141
- return "Critical";
142
-
143
- case MessageType.Success:
144
- return "Good";
145
-
146
- default:
147
- return "None";
148
- }
149
- }
150
- /**
151
- * Function to calculate the message state for a criticality calculation of type 'Maximize'.
104
+ * Function to get a message state from a calculated criticality of type 'Maximize'.
152
105
  *
153
106
  * @param {number} kpiValue The value of the KPI to be tested against.
154
107
  * @param {number[]} aThresholds Thresholds to be used [DeviationRangeLowValue,ToleranceRangeLowValue,AcceptanceRangeLowValue].
@@ -323,8 +276,296 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
323
276
  return "(" + filterDefinition.ranges.map(formatRange).join(",") + ")";
324
277
  }
325
278
  }
279
+
280
+ function formatChartTitle(kpiDef) {
281
+ var resBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
282
+
283
+ function formatList(items) {
284
+ if (items.length === 0) {
285
+ return "";
286
+ } else if (items.length === 1) {
287
+ return items[0].label;
288
+ } else {
289
+ var res = items[0].label;
290
+
291
+ for (var I = 1; I < items.length - 1; I++) {
292
+ res += ", " + items[I].label;
293
+ }
294
+
295
+ return resBundle.getText("C_KPICARD_ITEMSLIST", [res, items[items.length - 1].label]);
296
+ }
297
+ }
298
+
299
+ return resBundle.getText("C_KPICARD_CHARTTITLE", [formatList(kpiDef.chart.measures), formatList(kpiDef.chart.dimensions)]);
300
+ }
301
+
302
+ function updateChartLabelSettings(chartDefinition, oChartProperties) {
303
+ switch (chartDefinition.chartType) {
304
+ case "Donut":
305
+ // Show data labels, do not show axis titles
306
+ oChartProperties.categoryAxis = {
307
+ title: {
308
+ visible: false
309
+ }
310
+ };
311
+ oChartProperties.valueAxis = {
312
+ title: {
313
+ visible: false
314
+ },
315
+ label: {
316
+ formatString: "ShortFloat"
317
+ }
318
+ };
319
+ oChartProperties.plotArea.dataLabel = {
320
+ visible: true,
321
+ type: "value",
322
+ formatString: "ShortFloat_MFD2"
323
+ };
324
+ break;
325
+
326
+ case "bubble":
327
+ // Show axis title, bubble size legend, do not show data labels
328
+ oChartProperties.valueAxis = {
329
+ title: {
330
+ visible: true
331
+ },
332
+ label: {
333
+ formatString: "ShortFloat"
334
+ }
335
+ };
336
+ oChartProperties.valueAxis2 = {
337
+ title: {
338
+ visible: true
339
+ },
340
+ label: {
341
+ formatString: "ShortFloat"
342
+ }
343
+ };
344
+ oChartProperties.legendGroup = {
345
+ layout: {
346
+ position: "bottom",
347
+ alignment: "topLeft"
348
+ }
349
+ };
350
+ oChartProperties.sizeLegend = {
351
+ visible: true
352
+ };
353
+ oChartProperties.plotArea.dataLabel = {
354
+ visible: false
355
+ };
356
+ break;
357
+
358
+ case "scatter":
359
+ // Do not show data labels and axis titles
360
+ oChartProperties.valueAxis = {
361
+ title: {
362
+ visible: false
363
+ },
364
+ label: {
365
+ formatString: "ShortFloat"
366
+ }
367
+ };
368
+ oChartProperties.valueAxis2 = {
369
+ title: {
370
+ visible: false
371
+ },
372
+ label: {
373
+ formatString: "ShortFloat"
374
+ }
375
+ };
376
+ oChartProperties.plotArea.dataLabel = {
377
+ visible: false
378
+ };
379
+ break;
380
+
381
+ default:
382
+ // Do not show data labels and axis titles
383
+ oChartProperties.categoryAxis = {
384
+ title: {
385
+ visible: false
386
+ }
387
+ };
388
+ oChartProperties.valueAxis = {
389
+ title: {
390
+ visible: false
391
+ },
392
+ label: {
393
+ formatString: "ShortFloat"
394
+ }
395
+ };
396
+ oChartProperties.plotArea.dataLabel = {
397
+ visible: false
398
+ };
399
+ }
400
+ }
401
+
402
+ function filterMap(aObjects, aRoles) {
403
+ if (aRoles && aRoles.length) {
404
+ return aObjects.filter(function (dimension) {
405
+ return aRoles.indexOf(dimension.role) >= 0;
406
+ }).map(function (dimension) {
407
+ return dimension.label;
408
+ });
409
+ } else {
410
+ return aObjects.map(function (dimension) {
411
+ return dimension.label;
412
+ });
413
+ }
414
+ }
415
+
416
+ function getScatterBubbleChartFeeds(chartDefinition) {
417
+ var axis1Measures = filterMap(chartDefinition.measures, ["Axis1"]);
418
+ var axis2Measures = filterMap(chartDefinition.measures, ["Axis2"]);
419
+ var axis3Measures = filterMap(chartDefinition.measures, ["Axis3"]);
420
+ var otherMeasures = filterMap(chartDefinition.measures, [undefined]);
421
+ var seriesDimensions = filterMap(chartDefinition.dimensions, ["Series"]); // Get the first dimension with role "Category" for the shape
422
+
423
+ var shapeDimension = chartDefinition.dimensions.find(function (dimension) {
424
+ return dimension.role === "Category";
425
+ }); // Measure for the x-Axis : first measure for Axis1, or for Axis2 if not found, or for Axis3 if not found
426
+
427
+ var xMeasure = axis1Measures.shift() || axis2Measures.shift() || axis3Measures.shift() || otherMeasures.shift() || ""; // Measure for the y-Axis : first measure for Axis2, or second measure for Axis1 if not found, or first measure for Axis3 if not found
428
+
429
+ var yMeasure = axis2Measures.shift() || axis1Measures.shift() || axis3Measures.shift() || otherMeasures.shift() || "";
430
+ var res = [{
431
+ "uid": "valueAxis",
432
+ "type": "Measure",
433
+ "values": [xMeasure]
434
+ }, {
435
+ "uid": "valueAxis2",
436
+ "type": "Measure",
437
+ "values": [yMeasure]
438
+ }];
439
+
440
+ if (chartDefinition.chartType === "bubble") {
441
+ // Measure for the size of the bubble: first measure for Axis3, or remaining measure for Axis1/Axis2 if not found
442
+ var sizeMeasure = axis3Measures.shift() || axis1Measures.shift() || axis2Measures.shift() || otherMeasures.shift() || "";
443
+ res.push({
444
+ "uid": "bubbleWidth",
445
+ "type": "Measure",
446
+ "values": [sizeMeasure]
447
+ });
448
+ } // Color (optional)
449
+
450
+
451
+ if (seriesDimensions.length) {
452
+ res.push({
453
+ "uid": "color",
454
+ "type": "Dimension",
455
+ "values": seriesDimensions
456
+ });
457
+ } // Shape (optional)
458
+
459
+
460
+ if (shapeDimension) {
461
+ res.push({
462
+ "uid": "shape",
463
+ "type": "Dimension",
464
+ "values": [shapeDimension.label]
465
+ });
466
+ }
467
+
468
+ return res;
469
+ }
470
+
471
+ function getChartFeeds(chartDefinition) {
472
+ var res;
473
+
474
+ switch (chartDefinition.chartType) {
475
+ case "Donut":
476
+ res = [{
477
+ "uid": "size",
478
+ "type": "Measure",
479
+ "values": filterMap(chartDefinition.measures)
480
+ }, {
481
+ "uid": "color",
482
+ "type": "Dimension",
483
+ "values": filterMap(chartDefinition.dimensions)
484
+ }];
485
+ break;
486
+
487
+ case "bubble":
488
+ case "scatter":
489
+ res = getScatterBubbleChartFeeds(chartDefinition);
490
+ break;
491
+
492
+ case "vertical_bullet":
493
+ res = [{
494
+ "uid": "actualValues",
495
+ "type": "Measure",
496
+ "values": filterMap(chartDefinition.measures, [undefined, "Axis1"])
497
+ }, {
498
+ "uid": "targetValues",
499
+ "type": "Measure",
500
+ "values": filterMap(chartDefinition.measures, ["Axis2"])
501
+ }, {
502
+ "uid": "categoryAxis",
503
+ "type": "Dimension",
504
+ "values": filterMap(chartDefinition.dimensions, [undefined, "Category"])
505
+ }, {
506
+ "uid": "color",
507
+ "type": "Dimension",
508
+ "values": filterMap(chartDefinition.dimensions, ["Series"])
509
+ }];
510
+ break;
511
+
512
+ default:
513
+ res = [{
514
+ "uid": "valueAxis",
515
+ "type": "Measure",
516
+ "values": filterMap(chartDefinition.measures)
517
+ }, {
518
+ "uid": "categoryAxis",
519
+ "type": "Dimension",
520
+ "values": filterMap(chartDefinition.dimensions, [undefined, "Category"])
521
+ }, {
522
+ "uid": "color",
523
+ "type": "Dimension",
524
+ "values": filterMap(chartDefinition.dimensions, ["Series"])
525
+ }];
526
+ }
527
+
528
+ return res;
529
+ }
530
+
531
+ function getNavigationParameters(navInfo, oShellService) {
532
+ if (navInfo.semanticObject) {
533
+ if (navInfo.action) {
534
+ // Action is already specified: check if it's available in the shell
535
+ return oShellService.getLinks({
536
+ semanticObject: navInfo.semanticObject,
537
+ action: navInfo.action
538
+ }).then(function (aLinks) {
539
+ return aLinks.length ? {
540
+ semanticObject: navInfo.semanticObject,
541
+ action: navInfo.action
542
+ } : undefined;
543
+ });
544
+ } else {
545
+ // We get the primary intent from the shell
546
+ return oShellService.getPrimaryIntent(navInfo.semanticObject).then(function (oLink) {
547
+ if (!oLink) {
548
+ // No primary intent...
549
+ return undefined;
550
+ } // Check that the primary intent is not part of the unavailable actions
551
+
552
+
553
+ var oInfo = oShellService.parseShellHash(oLink.intent);
554
+ return navInfo.unavailableActions && navInfo.unavailableActions.indexOf(oInfo.action) >= 0 ? undefined : {
555
+ semanticObject: oInfo.semanticObject,
556
+ action: oInfo.action
557
+ };
558
+ });
559
+ }
560
+ } else {
561
+ // Outbound navigation specified in the manifest
562
+ return navInfo.outboundNavigation ? Promise.resolve({
563
+ outbound: navInfo.outboundNavigation
564
+ }) : Promise.resolve(undefined);
565
+ }
566
+ }
326
567
  /**
327
- * @class A controller extension for managing KPI in an AnalyticalListPage
568
+ * @class A controller extension for managing the KPIs in an analytical list page
328
569
  *
329
570
  * @name sap.fe.core.controllerextensions.KPIManagement
330
571
  * @hideconstructor
@@ -346,6 +587,126 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
346
587
  }
347
588
 
348
589
  _createClass(KPIManagementControllerExtension, [{
590
+ key: "initCardManifest",
591
+ value:
592
+ /**
593
+ * Creates the card manifest for a KPI definition and stores it in a JSON model.
594
+ *
595
+ * @param kpiDefinition The KPI definition
596
+ * @param oKPIModel The JSON model in which the manifest will be stored
597
+ */
598
+ function initCardManifest(kpiDefinition, oKPIModel) {
599
+ var _kpiDefinition$select;
600
+
601
+ var oCardManifest = {
602
+ "sap.app": {
603
+ id: "sap.fe",
604
+ type: "card"
605
+ },
606
+ "sap.ui": {
607
+ technology: "UI5"
608
+ },
609
+ "sap.card": {
610
+ type: "Analytical",
611
+ data: {
612
+ json: {}
613
+ },
614
+ header: {
615
+ type: "Numeric",
616
+ title: kpiDefinition.datapoint.title,
617
+ subTitle: kpiDefinition.datapoint.description,
618
+ unitOfMeasurement: "{mainUnit}",
619
+ mainIndicator: {
620
+ number: "{mainValueNoScale}",
621
+ unit: "{mainValueScale}",
622
+ state: "{mainState}",
623
+ trend: "{trend}"
624
+ }
625
+ },
626
+ content: {
627
+ minHeight: "25rem",
628
+ chartProperties: {
629
+ plotArea: {},
630
+ title: {
631
+ visible: true,
632
+ alignment: "left"
633
+ }
634
+ },
635
+ data: {
636
+ path: "/chartData"
637
+ }
638
+ }
639
+ }
640
+ }; // Add side indicators in the card header if a target is defined for the KPI
641
+
642
+ if (kpiDefinition.datapoint.targetPath || kpiDefinition.datapoint.targetValue !== undefined) {
643
+ var resBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
644
+ oCardManifest["sap.card"].header.sideIndicators = [{
645
+ title: resBundle.getText("C_KPICARD_INDICATOR_TARGET"),
646
+ number: "{targetNumber}",
647
+ unit: "{targetUnit}"
648
+ }, {
649
+ title: resBundle.getText("C_KPICARD_INDICATOR_DEVIATION"),
650
+ number: "{deviationNumber}",
651
+ unit: "%"
652
+ }];
653
+ } // Details of the card: filter descriptions
654
+
655
+
656
+ if ((_kpiDefinition$select = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select !== void 0 && _kpiDefinition$select.length) {
657
+ var aDescriptions = [];
658
+ kpiDefinition.selectionVariantFilterDefinitions.forEach(function (filterDefinition) {
659
+ var desc = getFilterStringFromDefinition(filterDefinition);
660
+
661
+ if (desc) {
662
+ aDescriptions.push(desc);
663
+ }
664
+ });
665
+
666
+ if (aDescriptions.length) {
667
+ oCardManifest["sap.card"].header.details = aDescriptions.join(", ");
668
+ }
669
+ } // Chart settings: type, title, dimensions and measures in the manifest
670
+
671
+
672
+ oCardManifest["sap.card"].content.chartType = kpiDefinition.chart.chartType;
673
+ updateChartLabelSettings(kpiDefinition.chart, oCardManifest["sap.card"].content.chartProperties);
674
+ oCardManifest["sap.card"].content.chartProperties.title.text = formatChartTitle(kpiDefinition);
675
+ oCardManifest["sap.card"].content.dimensions = kpiDefinition.chart.dimensions.map(function (dimension) {
676
+ return {
677
+ label: dimension.label,
678
+ value: "{" + dimension.name + "}"
679
+ };
680
+ });
681
+ oCardManifest["sap.card"].content.measures = kpiDefinition.chart.measures.map(function (measure) {
682
+ return {
683
+ label: measure.label,
684
+ value: "{" + measure.name + "}"
685
+ };
686
+ });
687
+ oCardManifest["sap.card"].content.feeds = getChartFeeds(kpiDefinition.chart);
688
+ oKPIModel.setProperty("/" + kpiDefinition.id, {
689
+ manifest: oCardManifest
690
+ });
691
+ }
692
+ }, {
693
+ key: "initNavigationInfo",
694
+ value: function initNavigationInfo(kpiDefinition, oKPIModel, oShellService) {
695
+ // Add navigation
696
+ if (kpiDefinition.navigation) {
697
+ return getNavigationParameters(kpiDefinition.navigation, oShellService).then(function (oNavInfo) {
698
+ if (oNavInfo) {
699
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/header/actions", [{
700
+ type: "Navigation",
701
+ parameters: oNavInfo
702
+ }]);
703
+ }
704
+ });
705
+ } else {
706
+ return Promise.resolve();
707
+ }
708
+ }
709
+ }, {
349
710
  key: "onInit",
350
711
  value: function onInit() {
351
712
  var _this = this;
@@ -354,101 +715,21 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
354
715
 
355
716
  if (this.aKPIDefinitions && this.aKPIDefinitions.length) {
356
717
  var oView = this.getView();
357
- this.oAppComponent = CommonUtils.getAppComponent(oView); // Create a JSON model to store KPI data
718
+ var oAppComponent = oView.getController().getAppComponent(); // Create a JSON model to store KPI data
358
719
 
359
720
  var oKPIModel = new JSONModel();
360
721
  oView.setModel(oKPIModel, "kpiModel");
361
722
  this.aKPIDefinitions.forEach(function (kpiDefinition) {
362
- var _kpiDefinition$select;
363
-
364
723
  // Create the manifest for the KPI card and store it in the KPI model
365
- var oCardManifest = {
366
- "sap.app": {
367
- id: "sap.fe",
368
- type: "card"
369
- },
370
- "sap.ui": {
371
- technology: "UI5"
372
- },
373
- "sap.card": {
374
- type: "Analytical",
375
- data: {
376
- json: {}
377
- },
378
- header: {
379
- type: "Numeric",
380
- title: kpiDefinition.datapoint.title,
381
- subTitle: kpiDefinition.datapoint.description,
382
- unitOfMeasurement: "{mainUnit}",
383
- mainIndicator: {
384
- number: "{mainValueNoScale}",
385
- unit: "{mainValueScale}",
386
- state: "{mainState}",
387
- trend: "{trend}"
388
- }
389
- },
390
- content: {
391
- plotArea: {
392
- "dataLabel": {
393
- "visible": false
394
- },
395
- "categoryAxisText": {
396
- "visible": false
397
- },
398
- "valueAxisText": {
399
- "visible": false
400
- }
401
- },
402
- title: {
403
- text: "{chartTitle}",
404
- visible: true,
405
- alignment: "Left"
406
- },
407
- measureAxis: "valueAxis",
408
- dimensionAxis: "categoryAxis",
409
- data: {
410
- path: "/chartData"
411
- }
412
- }
413
- }
414
- }; // Add side indicators in the card header if a target is defined for the KPI
415
-
416
- if (kpiDefinition.datapoint.targetPath || kpiDefinition.datapoint.targetValue !== undefined) {
417
- var resBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
418
- oCardManifest["sap.card"].header.sideIndicators = [{
419
- title: resBundle.getText("C_KPICARD_INDICATOR_TARGET"),
420
- number: "{targetNumber}",
421
- unit: "{targetUnit}"
422
- }, {
423
- title: resBundle.getText("C_KPICARD_INDICATOR_DEVIATION"),
424
- number: "{deviationNumber}",
425
- unit: "%"
426
- }];
427
- } // Details of the card: filter descriptions
428
-
429
-
430
- if ((_kpiDefinition$select = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select !== void 0 && _kpiDefinition$select.length) {
431
- var aDescriptions = [];
432
- kpiDefinition.selectionVariantFilterDefinitions.forEach(function (filterDefinition) {
433
- var desc = getFilterStringFromDefinition(filterDefinition);
434
-
435
- if (desc) {
436
- aDescriptions.push(desc);
437
- }
438
- });
724
+ _this.initCardManifest(kpiDefinition, oKPIModel); // Set the navigation information in the manifest
439
725
 
440
- if (aDescriptions.length) {
441
- oCardManifest["sap.card"].header.details = aDescriptions.join(", ");
442
- }
443
- } // Update card content in the manifest
444
726
 
445
-
446
- oCardManifest["sap.card"].content = Object.assign(oCardManifest["sap.card"].content, kpiDefinition.card.cardContentManifest);
447
- oKPIModel.setProperty("/" + kpiDefinition.id, {
448
- manifest: oCardManifest
727
+ _this.initNavigationInfo(kpiDefinition, oKPIModel, oAppComponent.getShellServices()).catch(function (err) {
728
+ Log.error(err);
449
729
  }); // Load tag data for the KPI
450
730
 
451
- _this.loadKPITagData(kpiDefinition).catch(function (err) {
731
+
732
+ _this.loadKPITagData(kpiDefinition, oAppComponent.getModel(), oKPIModel).catch(function (err) {
452
733
  Log.error(err);
453
734
  });
454
735
  });
@@ -483,13 +764,12 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
483
764
  }
484
765
  }, {
485
766
  key: "updateDatapointValueAndCurrency",
486
- value: function updateDatapointValueAndCurrency(kpiDefinition, kpiContext) {
767
+ value: function updateDatapointValueAndCurrency(kpiDefinition, kpiContext, oKPIModel) {
487
768
  var _kpiDefinition$datapo, _kpiDefinition$datapo2, _kpiDefinition$datapo3;
488
769
 
489
770
  var currentLocale = new Locale(sap.ui.getCore().getConfiguration().getLanguage());
490
771
  var rawUnit = (_kpiDefinition$datapo = kpiDefinition.datapoint.unit) !== null && _kpiDefinition$datapo !== void 0 && _kpiDefinition$datapo.isPath ? kpiContext.getProperty(kpiDefinition.datapoint.unit.value) : (_kpiDefinition$datapo2 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo2 === void 0 ? void 0 : _kpiDefinition$datapo2.value;
491
- var isPercentage = ((_kpiDefinition$datapo3 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo3 === void 0 ? void 0 : _kpiDefinition$datapo3.isCurrency) === false && rawUnit === "%";
492
- var oKPIModel = this.getView().getModel("kpiModel"); // /////////////////////
772
+ var isPercentage = ((_kpiDefinition$datapo3 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo3 === void 0 ? void 0 : _kpiDefinition$datapo3.isCurrency) === false && rawUnit === "%"; // /////////////////////
493
773
  // Main KPI value
494
774
 
495
775
  var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath)); // Value formatted with a scale
@@ -540,9 +820,8 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
540
820
  }
541
821
  }, {
542
822
  key: "updateDatapointCriticality",
543
- value: function updateDatapointCriticality(kpiDefinition, kpiContext) {
823
+ value: function updateDatapointCriticality(kpiDefinition, kpiContext, oKPIModel) {
544
824
  var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath));
545
- var oKPIModel = this.getView().getModel("kpiModel");
546
825
  var criticalityValue = MessageType.None;
547
826
 
548
827
  if (kpiDefinition.datapoint.criticalityValue) {
@@ -550,7 +829,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
550
829
  criticalityValue = kpiDefinition.datapoint.criticalityValue;
551
830
  } else if (kpiDefinition.datapoint.criticalityPath) {
552
831
  // Criticality comes from another property (via a path)
553
- criticalityValue = messageTypeFromCriticality(kpiContext.getProperty(kpiDefinition.datapoint.criticalityPath));
832
+ criticalityValue = MessageTypeFromCriticality[kpiContext.getProperty(kpiDefinition.datapoint.criticalityPath)] || MessageType.None;
554
833
  } else if (kpiDefinition.datapoint.criticalityCalculationThresholds && kpiDefinition.datapoint.criticalityCalculationMode) {
555
834
  // Criticality calculation
556
835
  switch (kpiDefinition.datapoint.criticalityCalculationMode) {
@@ -570,13 +849,12 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
570
849
  }
571
850
 
572
851
  oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", criticalityValue);
573
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainState", valueColorFromMessageType(criticalityValue));
852
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainState", ValueColorFromMessageType[criticalityValue] || "None");
574
853
  }
575
854
  }, {
576
855
  key: "updateDatapointTrend",
577
- value: function updateDatapointTrend(kpiDefinition, kpiContext) {
856
+ value: function updateDatapointTrend(kpiDefinition, kpiContext, oKPIModel) {
578
857
  var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath));
579
- var oKPIModel = this.getView().getModel("kpiModel");
580
858
  var trendValue = "None";
581
859
 
582
860
  if (kpiDefinition.datapoint.trendValue) {
@@ -602,13 +880,12 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
602
880
  }
603
881
  }, {
604
882
  key: "updateTargetValue",
605
- value: function updateTargetValue(kpiDefinition, kpiContext) {
883
+ value: function updateTargetValue(kpiDefinition, kpiContext, oKPIModel) {
606
884
  if (kpiDefinition.datapoint.targetValue === undefined && kpiDefinition.datapoint.targetPath === undefined) {
607
885
  return; // No target set for the KPI
608
886
  }
609
887
 
610
888
  var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath));
611
- var oKPIModel = this.getView().getModel("kpiModel");
612
889
  var currentLocale = new Locale(sap.ui.getCore().getConfiguration().getLanguage());
613
890
  var targetRawValue;
614
891
 
@@ -650,20 +927,24 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
650
927
  * Loads tag data for a KPI, and stores it in the JSON KPI model.
651
928
  *
652
929
  * @param {KPIDefinition} kpiDefinition The definition of the KPI.
930
+ * @param {ODataModel} oMainModel The model used to load the data.
931
+ * @param {JSONModel} oKPIModel The JSON model where the data will be stored
653
932
  * @param loadFull If not true, loads only data for the KPI tag
654
- * @returns {Promise} Returns the Promise that is resolved when data is loaded.
933
+ * @returns {Promise} Returns the promise that is resolved when data is loaded.
655
934
  */
656
935
 
657
936
  }, {
658
937
  key: "loadKPITagData",
659
- value: function loadKPITagData(kpiDefinition, loadFull) {
938
+ value: function loadKPITagData(kpiDefinition, oMainModel, oKPIModel, loadFull) {
660
939
  var _kpiDefinition$datapo4,
661
940
  _kpiDefinition$select2,
662
941
  _this2 = this;
663
942
 
664
- var oModel = this.oAppComponent.getModel();
665
- var oKPIModel = this.getView().getModel("kpiModel");
666
- var oListBinding = oModel.bindList("/" + kpiDefinition.entitySet);
943
+ // If loadFull=false, then we're just loading data for the tag and we use the "$auto.LongRunners" groupID
944
+ // If loadFull=true, we're loading data for the whole KPI (tag + card) and we use the default ("$auto") groupID
945
+ var oListBinding = loadFull ? oMainModel.bindList("/" + kpiDefinition.entitySet) : oMainModel.bindList("/" + kpiDefinition.entitySet, undefined, undefined, undefined, {
946
+ $$groupId: "$auto.LongRunners"
947
+ });
667
948
  var oAggregate = {}; // Main value + currency/unit
668
949
 
669
950
  if ((_kpiDefinition$datapo4 = kpiDefinition.datapoint.unit) !== null && _kpiDefinition$datapo4 !== void 0 && _kpiDefinition$datapo4.isPath) {
@@ -699,7 +980,9 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
699
980
  }); // Manage SelectionVariant filters
700
981
 
701
982
  if ((_kpiDefinition$select2 = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select2 !== void 0 && _kpiDefinition$select2.length) {
702
- var aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition);
983
+ var aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition).filter(function (filter) {
984
+ return filter !== undefined;
985
+ });
703
986
  oListBinding.filter(aFilters);
704
987
  }
705
988
 
@@ -723,34 +1006,41 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
723
1006
  oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/targetUnit", undefined);
724
1007
  oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/deviationNumber", undefined);
725
1008
  } else {
726
- _this2.updateDatapointValueAndCurrency(kpiDefinition, aContexts[0]);
1009
+ _this2.updateDatapointValueAndCurrency(kpiDefinition, aContexts[0], oKPIModel);
727
1010
 
728
- _this2.updateDatapointCriticality(kpiDefinition, aContexts[0]);
1011
+ _this2.updateDatapointCriticality(kpiDefinition, aContexts[0], oKPIModel);
729
1012
 
730
1013
  if (loadFull) {
731
- _this2.updateDatapointTrend(kpiDefinition, aContexts[0]);
1014
+ _this2.updateDatapointTrend(kpiDefinition, aContexts[0], oKPIModel);
732
1015
 
733
- _this2.updateTargetValue(kpiDefinition, aContexts[0]);
1016
+ _this2.updateTargetValue(kpiDefinition, aContexts[0], oKPIModel);
734
1017
  }
735
1018
  }
736
1019
  }
737
1020
  });
738
1021
  }
1022
+ /**
1023
+ * Loads card data for a KPI, and stores it in the JSON KPI model.
1024
+ *
1025
+ * @param {KPIDefinition} kpiDefinition The definition of the KPI.
1026
+ * @param {ODataModel} oMainModel The model used to load the data.
1027
+ * @param {JSONModel} oKPIModel The JSON model where the data will be stored
1028
+ * @returns {Promise} Returns the promise that is resolved when data is loaded.
1029
+ */
1030
+
739
1031
  }, {
740
1032
  key: "loadKPICardData",
741
- value: function loadKPICardData(kpiDefinition) {
1033
+ value: function loadKPICardData(kpiDefinition, oMainModel, oKPIModel) {
742
1034
  var _kpiDefinition$select3;
743
1035
 
744
- var oModel = this.oAppComponent.getModel();
745
- var oListBinding = oModel.bindList("/" + kpiDefinition.entitySet);
1036
+ var oListBinding = oMainModel.bindList("/" + kpiDefinition.entitySet);
746
1037
  var oGroup = {};
747
1038
  var oAggregate = {};
748
- var oKPIModel = this.getView().getModel("kpiModel");
749
- kpiDefinition.card.dimensions.forEach(function (sDimensionName) {
750
- oGroup[sDimensionName] = {};
1039
+ kpiDefinition.chart.dimensions.forEach(function (dimension) {
1040
+ oGroup[dimension.name] = {};
751
1041
  });
752
- kpiDefinition.card.measures.forEach(function (sMeasureName) {
753
- oAggregate[sMeasureName] = {};
1042
+ kpiDefinition.chart.measures.forEach(function (measure) {
1043
+ oAggregate[measure.name] = {};
754
1044
  });
755
1045
  oListBinding.setAggregation({
756
1046
  group: oGroup,
@@ -758,18 +1048,27 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
758
1048
  }); // Manage SelectionVariant filters
759
1049
 
760
1050
  if ((_kpiDefinition$select3 = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select3 !== void 0 && _kpiDefinition$select3.length) {
761
- var aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition);
1051
+ var aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition).filter(function (filter) {
1052
+ return filter !== undefined;
1053
+ });
762
1054
  oListBinding.filter(aFilters);
1055
+ } // Sorting
1056
+
1057
+
1058
+ if (kpiDefinition.chart.sortOrder) {
1059
+ oListBinding.sort(kpiDefinition.chart.sortOrder.map(function (sortInfo) {
1060
+ return new Sorter(sortInfo.name, sortInfo.descending);
1061
+ }));
763
1062
  }
764
1063
 
765
- return oListBinding.requestContexts(0).then(function (aContexts) {
1064
+ return oListBinding.requestContexts(0, kpiDefinition.chart.maxItems).then(function (aContexts) {
766
1065
  var chartData = aContexts.map(function (oContext) {
767
1066
  var oData = {};
768
- kpiDefinition.card.dimensions.forEach(function (sDimensionName) {
769
- oData[sDimensionName] = oContext.getProperty(sDimensionName);
1067
+ kpiDefinition.chart.dimensions.forEach(function (dimension) {
1068
+ oData[dimension.name] = oContext.getProperty(dimension.name);
770
1069
  });
771
- kpiDefinition.card.measures.forEach(function (sMeasureName) {
772
- oData[sMeasureName] = oContext.getProperty(sMeasureName);
1070
+ kpiDefinition.chart.measures.forEach(function (measure) {
1071
+ oData[measure.name] = oContext.getProperty(measure.name);
773
1072
  });
774
1073
  return oData;
775
1074
  });
@@ -779,35 +1078,65 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
779
1078
  /**
780
1079
  * Gets the popover to display the KPI card
781
1080
  * The popover and the contained card for the KPIs are created if necessary.
782
- * The popover is shared between all KPIs, so we create it only once.
1081
+ * The popover is shared between all KPIs, so it's created only once.
783
1082
  *
784
- * @param oKPITag The Tag that triggered the popover opening.
785
- * @returns The shared popover.
1083
+ * @param oKPITag The tag that triggered the popover opening.
1084
+ * @returns The shared popover as a promise.
786
1085
  */
787
1086
 
788
1087
  }, {
789
1088
  key: "getPopover",
790
1089
  value: function getPopover(oKPITag) {
1090
+ var _this3 = this;
1091
+
791
1092
  if (!this.oPopover) {
792
- this.oCard = new Card({
793
- width: "25rem",
794
- height: "auto"
795
- });
796
- this.oPopover = new Popover({
797
- id: "kpi-Popover",
798
- showHeader: false,
799
- placement: "Auto",
800
- content: [this.oCard]
1093
+ return new Promise(function (resolve, reject) {
1094
+ sap.ui.getCore().loadLibrary("sap/ui/integration", {
1095
+ async: true
1096
+ }).then(function () {
1097
+ sap.ui.require(["sap/ui/integration/widgets/Card", "sap/ui/integration/Host"], function (Card, Host) {
1098
+ var oHost = new Host();
1099
+ oHost.attachAction(function (oEvent) {
1100
+ var sType = oEvent.getParameter("type");
1101
+ var oParams = oEvent.getParameter("parameters");
1102
+
1103
+ if (sType === "Navigation") {
1104
+ if (oParams.semanticObject) {
1105
+ _this3.getView().getController()._intentBasedNavigation.navigate(oParams.semanticObject, oParams.action);
1106
+ } else {
1107
+ _this3.getView().getController()._intentBasedNavigation.navigateOutbound(oParams.outbound);
1108
+ }
1109
+ }
1110
+ });
1111
+ _this3.oCard = new Card({
1112
+ width: "25rem",
1113
+ height: "auto"
1114
+ });
1115
+
1116
+ _this3.oCard.setHost(oHost);
1117
+
1118
+ _this3.oPopover = new Popover({
1119
+ id: "kpi-Popover",
1120
+ showHeader: false,
1121
+ placement: "Auto",
1122
+ content: [_this3.oCard]
1123
+ });
1124
+ oKPITag.addDependent(_this3.oPopover); // The first clicked tag gets the popover as dependent
1125
+
1126
+ resolve(_this3.oPopover);
1127
+ });
1128
+ }).catch(function () {
1129
+ reject();
1130
+ });
801
1131
  });
802
- oKPITag.addDependent(this.oPopover); // The first clicked tag gets the popover as dependent
1132
+ } else {
1133
+ return Promise.resolve(this.oPopover);
803
1134
  }
804
-
805
- return this.oPopover;
806
1135
  }
807
1136
  }, {
808
1137
  key: "onKPIPressed",
809
1138
  value: function onKPIPressed(oKPITag, kpiID) {
810
- var _this3 = this;
1139
+ var _this4 = this;
811
1140
 
812
1141
  var oKPIModel = oKPITag.getModel("kpiModel");
813
1142
 
@@ -817,13 +1146,14 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
817
1146
  });
818
1147
 
819
1148
  if (kpiDefinition) {
820
- var aPromises = [this.loadKPITagData(kpiDefinition, true), this.loadKPICardData(kpiDefinition)];
821
- var oPopover = this.getPopover(oKPITag);
822
- Promise.all(aPromises).then(function () {
823
- _this3.oCard.setManifest(oKPIModel.getProperty("/" + kpiID + "/manifest"));
1149
+ var oModel = oKPITag.getModel();
1150
+ var aPromises = [this.loadKPITagData(kpiDefinition, oModel, oKPIModel, true), this.loadKPICardData(kpiDefinition, oModel, oKPIModel), this.getPopover(oKPITag)];
1151
+ Promise.all(aPromises).then(function (aResults) {
1152
+ _this4.oCard.setManifest(oKPIModel.getProperty("/" + kpiID + "/manifest"));
824
1153
 
825
- _this3.oCard.refresh();
1154
+ _this4.oCard.refresh();
826
1155
 
1156
+ var oPopover = aResults[2];
827
1157
  oPopover.openBy(oKPITag, false);
828
1158
  }).catch(function (err) {
829
1159
  Log.error(err);
@@ -837,4 +1167,4 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
837
1167
  }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onKPIPressed", [Public], Object.getOwnPropertyDescriptor(_class2.prototype, "onKPIPressed"), _class2.prototype)), _class2)) || _class);
838
1168
  return KPIManagementControllerExtension;
839
1169
  }, false);
840
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIktQSU1hbmFnZW1lbnQudHMiXSwibmFtZXMiOlsibWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHkiLCJjcml0aWNhbGl0eVZhbHVlIiwiY3JpdGljYWxpdHlQcm9wZXJ0eSIsIk1lc3NhZ2VUeXBlIiwiRXJyb3IiLCJXYXJuaW5nIiwiU3VjY2VzcyIsIkluZm9ybWF0aW9uIiwiTm9uZSIsIm1lc3NhZ2VUeXBlRnJvbVRhcmdldENhbGN1bGF0aW9uIiwia3BpVmFsdWUiLCJhVGhyZXNob2xkcyIsInVuZGVmaW5lZCIsIm1lc3NhZ2VUeXBlRnJvbU1pbmltaXplQ2FsY3VsYXRpb24iLCJ2YWx1ZUNvbG9yRnJvbU1lc3NhZ2VUeXBlIiwibWVzc2FnZVR5cGUiLCJtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uIiwiZGV2aWF0aW9uSW5kaWNhdG9yRnJvbVRyZW5kVHlwZSIsInRyZW5kVmFsdWUiLCJkZXZpYXRpb25JbmRpY2F0b3IiLCJkZXZpYXRpb25JbmRpY2F0b3JGcm9tQ2FsY3VsYXRpb24iLCJyZWZlcmVuY2VWYWx1ZSIsImlzUmVsYXRpdmUiLCJjb21wVmFsdWUiLCJjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbiIsImZpbHRlckRlZmluaXRpb24iLCJyYW5nZXMiLCJsZW5ndGgiLCJGaWx0ZXIiLCJwcm9wZXJ0eVBhdGgiLCJvcGVyYXRvciIsInJhbmdlTG93IiwicmFuZ2VIaWdoIiwiYVJhbmdlRmlsdGVycyIsIm1hcCIsInJhbmdlIiwiZmlsdGVycyIsImFuZCIsImdldEZpbHRlclN0cmluZ0Zyb21EZWZpbml0aW9uIiwiY3VycmVudExvY2FsZSIsIkxvY2FsZSIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldENvbmZpZ3VyYXRpb24iLCJnZXRMYW5ndWFnZSIsInJlc0J1bmRsZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImRhdGVGb3JtYXQiLCJEYXRlRm9ybWF0IiwiZ2V0RGF0ZUluc3RhbmNlIiwic3R5bGUiLCJmb3JtYXRSYW5nZSIsInZhbHVlTG93IiwicHJvcGVydHlUeXBlIiwiaW5kZXhPZiIsImZvcm1hdCIsIkRhdGUiLCJ2YWx1ZUhpZ2giLCJnZXRUZXh0Iiwiam9pbiIsIktQSU1hbmFnZW1lbnRDb250cm9sbGVyRXh0ZW5zaW9uIiwiVUk1Q2xhc3MiLCJDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEiLCJPdmVycmlkZSIsImFLUElEZWZpbml0aW9ucyIsImdldEtQSURhdGEiLCJvVmlldyIsImdldFZpZXciLCJvQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJvS1BJTW9kZWwiLCJKU09OTW9kZWwiLCJzZXRNb2RlbCIsImZvckVhY2giLCJrcGlEZWZpbml0aW9uIiwib0NhcmRNYW5pZmVzdCIsImlkIiwidHlwZSIsInRlY2hub2xvZ3kiLCJkYXRhIiwianNvbiIsImhlYWRlciIsInRpdGxlIiwiZGF0YXBvaW50Iiwic3ViVGl0bGUiLCJkZXNjcmlwdGlvbiIsInVuaXRPZk1lYXN1cmVtZW50IiwibWFpbkluZGljYXRvciIsIm51bWJlciIsInVuaXQiLCJzdGF0ZSIsInRyZW5kIiwiY29udGVudCIsInBsb3RBcmVhIiwidGV4dCIsInZpc2libGUiLCJhbGlnbm1lbnQiLCJtZWFzdXJlQXhpcyIsImRpbWVuc2lvbkF4aXMiLCJwYXRoIiwidGFyZ2V0UGF0aCIsInRhcmdldFZhbHVlIiwic2lkZUluZGljYXRvcnMiLCJzZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnMiLCJhRGVzY3JpcHRpb25zIiwiZGVzYyIsInB1c2giLCJkZXRhaWxzIiwiT2JqZWN0IiwiYXNzaWduIiwiY2FyZCIsImNhcmRDb250ZW50TWFuaWZlc3QiLCJzZXRQcm9wZXJ0eSIsIm1hbmlmZXN0IiwibG9hZEtQSVRhZ0RhdGEiLCJjYXRjaCIsImVyciIsIkxvZyIsImVycm9yIiwiZ2V0TW9kZWwiLCJkZXN0cm95Iiwic0N1c3RvbURhdGEiLCJnZXRDb250ZW50IiwidkRhdGEiLCJKU09OIiwicGFyc2UiLCJrcGlDb250ZXh0IiwicmF3VW5pdCIsImlzUGF0aCIsImdldFByb3BlcnR5IiwidmFsdWUiLCJpc1BlcmNlbnRhZ2UiLCJpc0N1cnJlbmN5IiwicmF3VmFsdWUiLCJOdW1iZXIiLCJwYXJzZUZsb2F0IiwiTnVtYmVyRm9ybWF0IiwiZ2V0RmxvYXRJbnN0YW5jZSIsIm1pbkZyYWN0aW9uRGlnaXRzIiwibWF4RnJhY3Rpb25EaWdpdHMiLCJzaG93U2NhbGUiLCJrcGlWYWx1ZVVuc2NhbGVkIiwiZ3JvdXBpbmdFbmFibGVkIiwia3BpVmFsdWVOb1NjYWxlIiwia3BpVmFsdWVTY2FsZSIsImRlY2ltYWxzIiwibWF4SW50ZWdlckRpZ2l0cyIsImtwaVVuaXQiLCJnZXRVbml0SW5zdGFuY2UiLCJzaG93TnVtYmVyIiwiY3JpdGljYWxpdHlQYXRoIiwiY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMiLCJjcml0aWNhbGl0eUNhbGN1bGF0aW9uTW9kZSIsInRyZW5kUGF0aCIsInRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZSIsInRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoIiwidHJlbmRSZWZlcmVuY2VWYWx1ZSIsInRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlIiwidHJlbmRDYWxjdWxhdGlvblRyZXNob2xkcyIsInRhcmdldFJhd1ZhbHVlIiwiZGV2aWF0aW9uUmF3VmFsdWUiLCJ0YXJnZXRTY2FsZSIsImRldmlhdGlvblZhbHVlIiwibG9hZEZ1bGwiLCJvTW9kZWwiLCJvTGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsImVudGl0eVNldCIsIm9BZ2dyZWdhdGUiLCJzZXRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0ZSIsImFGaWx0ZXJzIiwiZmlsdGVyIiwicmVxdWVzdENvbnRleHRzIiwidGhlbiIsImFDb250ZXh0cyIsInVwZGF0ZURhdGFwb2ludFZhbHVlQW5kQ3VycmVuY3kiLCJ1cGRhdGVEYXRhcG9pbnRDcml0aWNhbGl0eSIsInVwZGF0ZURhdGFwb2ludFRyZW5kIiwidXBkYXRlVGFyZ2V0VmFsdWUiLCJvR3JvdXAiLCJkaW1lbnNpb25zIiwic0RpbWVuc2lvbk5hbWUiLCJtZWFzdXJlcyIsInNNZWFzdXJlTmFtZSIsImdyb3VwIiwiY2hhcnREYXRhIiwib0NvbnRleHQiLCJvRGF0YSIsIm9LUElUYWciLCJvUG9wb3ZlciIsIm9DYXJkIiwiQ2FyZCIsIndpZHRoIiwiaGVpZ2h0IiwiUG9wb3ZlciIsInNob3dIZWFkZXIiLCJwbGFjZW1lbnQiLCJhZGREZXBlbmRlbnQiLCJrcGlJRCIsImZpbmQiLCJvRGVmIiwiYVByb21pc2VzIiwibG9hZEtQSUNhcmREYXRhIiwiZ2V0UG9wb3ZlciIsIlByb21pc2UiLCJhbGwiLCJzZXRNYW5pZmVzdCIsInJlZnJlc2giLCJvcGVuQnkiLCJDb250cm9sbGVyRXh0ZW5zaW9uIiwiUHVibGljIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFTQSwwQkFBVCxDQUFvQ0MsZ0JBQXBDLEVBQW9GO0FBQ25GLFFBQUlDLG1CQUFKOztBQUVBLFlBQVFELGdCQUFSO0FBQ0MsV0FBSyxDQUFMO0FBQ0EsV0FBSyxHQUFMO0FBQ0NDLFFBQUFBLG1CQUFtQixHQUFHQyxXQUFXLENBQUNDLEtBQWxDO0FBQ0E7O0FBQ0QsV0FBSyxDQUFMO0FBQ0EsV0FBSyxHQUFMO0FBQ0NGLFFBQUFBLG1CQUFtQixHQUFHQyxXQUFXLENBQUNFLE9BQWxDO0FBQ0E7O0FBQ0QsV0FBSyxDQUFMO0FBQ0EsV0FBSyxHQUFMO0FBQ0NILFFBQUFBLG1CQUFtQixHQUFHQyxXQUFXLENBQUNHLE9BQWxDO0FBQ0E7O0FBQ0QsV0FBSyxDQUFMO0FBQ0EsV0FBSyxHQUFMO0FBQ0NKLFFBQUFBLG1CQUFtQixHQUFHQyxXQUFXLENBQUNJLFdBQWxDO0FBQ0E7O0FBQ0Q7QUFDQ0wsUUFBQUEsbUJBQW1CLEdBQUdDLFdBQVcsQ0FBQ0ssSUFBbEM7QUFsQkY7O0FB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QU1pRCxhQUFhLEdBQUcsS0FBS1gsZUFBTCxDQUFxQnlJLElBQXJCLENBQTBCLFVBQVNDLElBQVQsRUFBZTtBQUM5RCxtQkFBT0EsSUFBSSxDQUFDN0gsRUFBTCxLQUFZMkgsS0FBbkI7QUFDQSxXQUZxQixDQUF0Qjs7QUFJQSxjQUFJN0gsYUFBSixFQUFtQjtBQUNsQixnQkFBTWdJLFNBQVMsR0FBRyxDQUFDLEtBQUt4RixjQUFMLENBQW9CeEMsYUFBcEIsRUFBbUMsSUFBbkMsQ0FBRCxFQUEyQyxLQUFLaUksZUFBTCxDQUFxQmpJLGFBQXJCLENBQTNDLENBQWxCO0FBQ0EsZ0JBQU1vSCxRQUFRLEdBQUcsS0FBS2MsVUFBTCxDQUFnQmYsT0FBaEIsQ0FBakI7QUFFQWdCLFlBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZSixTQUFaLEVBQ0U1QixJQURGLENBQ08sWUFBTTtBQUNYLGNBQUEsTUFBSSxDQUFDaUIsS0FBTCxDQUFXZ0IsV0FBWCxDQUF1QnpJLFNBQVMsQ0FBQzJELFdBQVYsQ0FBc0IsTUFBTXNFLEtBQU4sR0FBYyxXQUFwQyxDQUF2Qjs7QUFDQSxjQUFBLE1BQUksQ0FBQ1IsS0FBTCxDQUFXaUIsT0FBWDs7QUFDQWxCLGNBQUFBLFFBQVEsQ0FBQ21CLE1BQVQsQ0FBZ0JwQixPQUFoQixFQUF5QixLQUF6QjtBQUNBLGFBTEYsRUFNRTFFLEtBTkYsQ0FNUSxVQUFBQyxHQUFHLEVBQUk7QUFDYkMsY0FBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVVGLEdBQVY7QUFDQSxhQVJGO0FBU0E7QUFDRDtBQUNEOzs7O0lBcGhCNkM4RixtQixzV0E0ZjdDQyxNO1NBMkJheEosZ0MiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnRyb2xsZXJFeHRlbnNpb24gfSBmcm9tIFwic2FwL3VpL2NvcmUvbXZjXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnNcIjtcbmltcG9ydCB7IFVJNUNsYXNzLCBPdmVycmlkZSwgUHVibGljIH0gZnJvbSBcIi4uL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBKU09OTW9kZWwgfSBmcm9tIFwic2FwL3VpL21vZGVsL2pzb25cIjtcbmltcG9ydCB7IExvZyB9IGZyb20gXCJzYXAvYmFzZVwiO1xuaW1wb3J0IHsgS1BJRGVmaW5pdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9LUElcIjtcbmltcG9ydCB7IENvbW1vblV0aWxzIH0gZnJvbSBcInNhcC9mZS9jb3JlXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NFwiO1xuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9UYWJsZUZvcm1hdHRlclR5cGVzXCI7XG5pbXBvcnQgeyBGaWx0ZXJEZWZpbml0aW9uLCBSYW5nZURlZmluaXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL1NlbGVjdGlvblZhcmlhbnRIZWxwZXJcIjtcbmltcG9ydCB7IE51bWJlckZvcm1hdCwgRGF0ZUZvcm1hdCB9IGZyb20gXCJzYXAvdWkvY29yZS9mb3JtYXRcIjtcbmltcG9ydCB7IExvY2FsZSB9IGZyb20gXCJzYXAvdWkvY29yZVwiO1xuaW1wb3J0IHsgRmlsdGVyLCBGaWx0ZXJPcGVyYXRvciB9IGZyb20gXCJzYXAvdWkvbW9kZWxcIjtcbmltcG9ydCB7IEdlbmVyaWNUYWcsIFBvcG92ZXIgfSBmcm9tIFwic2FwL21cIjtcbmltcG9ydCB7IENhcmQgfSBmcm9tIFwic2FwL3VpL2ludGVncmF0aW9uL3dpZGdldHNcIjtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYSBtZXNzYWdlIHN0YXRlIGZyb20gYSBjcml0aWNhbGl0eSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IGNyaXRpY2FsaXR5VmFsdWUgVGhlIGNyaXRpY2FsaXR5IHZhbHVlcy5cbiAqIEByZXR1cm5zIHtNZXNzYWdlVHlwZX0gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBNZXNzYWdlVHlwZVxuICovXG5mdW5jdGlvbiBtZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eShjcml0aWNhbGl0eVZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBNZXNzYWdlVHlwZSB7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBNZXNzYWdlVHlwZTtcblxuXHRzd2l0Y2ggKGNyaXRpY2FsaXR5VmFsdWUpIHtcblx0XHRjYXNlIDE6XG5cdFx0Y2FzZSBcIjFcIjpcblx0XHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5FcnJvcjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMjpcblx0XHRjYXNlIFwiMlwiOlxuXHRcdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDM6XG5cdFx0Y2FzZSBcIjNcIjpcblx0XHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSA1OlxuXHRcdGNhc2UgXCI1XCI6XG5cdFx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuSW5mb3JtYXRpb247XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH1cblxuXHRyZXR1cm4gY3JpdGljYWxpdHlQcm9wZXJ0eTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIG1lc3NhZ2Ugc3RhdGUgZm9yIGEgY3JpdGljYWxpdHkgY2FsY3VsYXRpb24gb2YgdHlwZSAnVGFyZ2V0Jy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUEkgdG8gYmUgdGVzdGVkIGFnYWluc3QuXG4gKiBAcGFyYW0ge251bWJlcltdfSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0RldmlhdGlvblJhbmdlTG93VmFsdWUsVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUsVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWUsRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVdLlxuICogQHJldHVybnMge01lc3NhZ2VUeXBlfSBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIE1lc3NhZ2VUeXBlXG4gKi9cbmZ1bmN0aW9uIG1lc3NhZ2VUeXBlRnJvbVRhcmdldENhbGN1bGF0aW9uKGtwaVZhbHVlOiBudW1iZXIsIGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSk6IE1lc3NhZ2VUeXBlIHtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IE1lc3NhZ2VUeXBlO1xuXG5cdGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGtwaVZhbHVlIDwgYVRocmVzaG9sZHNbMF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1sxXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMl0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1syXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbNV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1s1XSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA+IGFUaHJlc2hvbGRzWzVdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzRdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbNF0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1s0XSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzNdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbM10gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1szXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBtZXNzYWdlIHN0YXRlIGZvciBhIGNyaXRpY2FsaXR5IGNhbGN1bGF0aW9uIG9mIHR5cGUgJ01pbmltaXplJy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUEkgdG8gYmUgdGVzdGVkIGFnYWluc3QuXG4gKiBAcGFyYW0ge251bWJlcltdfSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0FjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZSxUb2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZSxEZXZpYXRpb25SYW5nZUhpZ2hWYWx1ZV0uXG4gKiBAcmV0dXJucyB7TWVzc2FnZVR5cGV9IFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgTWVzc2FnZVR5cGVcbiAqL1xuZnVuY3Rpb24gbWVzc2FnZVR5cGVGcm9tTWluaW1pemVDYWxjdWxhdGlvbihrcGlWYWx1ZTogbnVtYmVyLCBhVGhyZXNob2xkczogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW10pOiBNZXNzYWdlVHlwZSB7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBNZXNzYWdlVHlwZTtcblxuXHRpZiAoYVRocmVzaG9sZHNbMl0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1syXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA+IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1sxXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzBdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMF0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1swXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gdHJhbnNmb3JtIGEgTWVzc2FnZVR5cGUgaW50byBhIFZhbHVlQ29sb3IuXG4gKlxuICogQHBhcmFtIG1lc3NhZ2VUeXBlIFRoZSBtZXNzYWdlIHR5cGVcbiAqIEByZXR1cm5zIFRoZSBWYWx1ZUNvbG9yXG4gKi9cbmZ1bmN0aW9uIHZhbHVlQ29sb3JGcm9tTWVzc2FnZVR5cGUobWVzc2FnZVR5cGU6IE1lc3NhZ2VUeXBlKTogc3RyaW5nIHtcblx0c3dpdGNoIChtZXNzYWdlVHlwZSkge1xuXHRcdGNhc2UgTWVzc2FnZVR5cGUuRXJyb3I6XG5cdFx0XHRyZXR1cm4gXCJFcnJvclwiO1xuXG5cdFx0Y2FzZSBNZXNzYWdlVHlwZS5XYXJuaW5nOlxuXHRcdFx0cmV0dXJuIFwiQ3JpdGljYWxcIjtcblxuXHRcdGNhc2UgTWVzc2FnZVR5cGUuU3VjY2Vzczpcblx0XHRcdHJldHVybiBcIkdvb2RcIjtcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gXCJOb25lXCI7XG5cdH1cbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIG1lc3NhZ2Ugc3RhdGUgZm9yIGEgY3JpdGljYWxpdHkgY2FsY3VsYXRpb24gb2YgdHlwZSAnTWF4aW1pemUnLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBrcGlWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIEtQSSB0byBiZSB0ZXN0ZWQgYWdhaW5zdC5cbiAqIEBwYXJhbSB7bnVtYmVyW119IGFUaHJlc2hvbGRzIFRocmVzaG9sZHMgdG8gYmUgdXNlZCBbRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZSxUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlLEFjY2VwdGFuY2VSYW5nZUxvd1ZhbHVlXS5cbiAqIEByZXR1cm5zIHtNZXNzYWdlVHlwZX0gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBNZXNzYWdlVHlwZVxuICovXG5mdW5jdGlvbiBtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uKGtwaVZhbHVlOiBudW1iZXIsIGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSk6IE1lc3NhZ2VUeXBlIHtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IE1lc3NhZ2VUeXBlO1xuXG5cdGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGtwaVZhbHVlIDwgYVRocmVzaG9sZHNbMF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1sxXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMl0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1syXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH0gZWxzZSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLlN1Y2Nlc3M7XG5cdH1cblxuXHRyZXR1cm4gY3JpdGljYWxpdHlQcm9wZXJ0eTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYSBEZXZpYXRpb25JbmRpY2F0b3IgdmFsdWUgZnJvbSBhIHRyZW5kIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdHJlbmRWYWx1ZSBUaGUgY3JpdGljYWxpdHkgdmFsdWVzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBEZXZpYXRpb25JbmRpY2F0b3IgdmFsdWVcbiAqL1xuZnVuY3Rpb24gZGV2aWF0aW9uSW5kaWNhdG9yRnJvbVRyZW5kVHlwZSh0cmVuZFZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xuXHRsZXQgZGV2aWF0aW9uSW5kaWNhdG9yOiBzdHJpbmc7XG5cblx0c3dpdGNoICh0cmVuZFZhbHVlKSB7XG5cdFx0Y2FzZSAxOiAvLyBTdHJvbmdVcFxuXHRcdGNhc2UgXCIxXCI6XG5cdFx0Y2FzZSAyOiAvLyBVcFxuXHRcdGNhc2UgXCIyXCI6XG5cdFx0XHRkZXZpYXRpb25JbmRpY2F0b3IgPSBcIlVwXCI7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgNDogLy8gRG93blxuXHRcdGNhc2UgXCI0XCI6XG5cdFx0Y2FzZSA1OiAvLyBTdHJvbmdEb3duXG5cdFx0Y2FzZSBcIjVcIjpcblx0XHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJOb25lXCI7XG5cdH1cblxuXHRyZXR1cm4gZGV2aWF0aW9uSW5kaWNhdG9yO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBhIERldmlhdGlvbkluZGljYXRvciBmcm9tIGEgVHJlbmRDYWxjdWxhdGlvbi5cbiAqXG4gKiBAcGFyYW0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUElcbiAqIEBwYXJhbSByZWZlcmVuY2VWYWx1ZSBUaGUgcmVmZXJlbmNlIHZhbHVlIHRvIGNvbXBhcmUgd2l0aFxuICogQHBhcmFtIGlzUmVsYXRpdmUgVHJ1ZSBpcyB0aGUgY29tcGFyaXNvbiBpcyByZWxhdGl2ZVxuICogQHBhcmFtIGFUaHJlc2hvbGRzIEFycmF5IG9mIHRocmVzaG9sZHMgW1N0cm9uZ0Rvd25EaWZmZXJlbmNlLCBEb3duRGlmZmVyZW5jZSwgVXBEaWZmZXJlbmNlLCBTdHJvbmdVcERpZmZlcmVuY2VdXG4gKiBAcmV0dXJucyB7c2FwLm0uRGV2aWF0aW9uSW5kaWNhdG9yfSBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIERldmlhdGlvbkluZGljYXRvciB2YWx1ZVxuICovXG5mdW5jdGlvbiBkZXZpYXRpb25JbmRpY2F0b3JGcm9tQ2FsY3VsYXRpb24oXG5cdGtwaVZhbHVlOiBudW1iZXIsXG5cdHJlZmVyZW5jZVZhbHVlOiBudW1iZXIsXG5cdGlzUmVsYXRpdmU6IGJvb2xlYW4sXG5cdGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHtcblx0bGV0IGRldmlhdGlvbkluZGljYXRvcjogc3RyaW5nO1xuXG5cdGlmICghYVRocmVzaG9sZHMgfHwgKGlzUmVsYXRpdmUgJiYgIXJlZmVyZW5jZVZhbHVlKSkge1xuXHRcdHJldHVybiBcIk5vbmVcIjtcblx0fVxuXG5cdGNvbnN0IGNvbXBWYWx1ZSA9IGlzUmVsYXRpdmUgPyAoa3BpVmFsdWUgLSByZWZlcmVuY2VWYWx1ZSkgLyByZWZlcmVuY2VWYWx1ZSA6IGtwaVZhbHVlIC0gcmVmZXJlbmNlVmFsdWU7XG5cblx0aWYgKGFUaHJlc2hvbGRzWzBdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMF0gIT09IG51bGwgJiYgY29tcFZhbHVlIDw9IGFUaHJlc2hvbGRzWzBdKSB7XG5cdFx0Ly8gU3Ryb25nRG93biAtLT4gRG93blxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYgY29tcFZhbHVlIDw9IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Ly8gRG93biAtLT4gRG93blxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzNdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbM10gIT09IG51bGwgJiYgY29tcFZhbHVlID49IGFUaHJlc2hvbGRzWzNdKSB7XG5cdFx0Ly8gU3Ryb25nVXAgLS0+IFVwXG5cdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJVcFwiO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzJdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMl0gIT09IG51bGwgJiYgY29tcFZhbHVlID49IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Ly8gVXAgLS0+IFVwXG5cdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJVcFwiO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFNpZGV3YXlzIC0tPiBOb25lXG5cdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJOb25lXCI7XG5cdH1cblxuXHRyZXR1cm4gZGV2aWF0aW9uSW5kaWNhdG9yO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzYXAudWkubW9kZWwuRmlsdGVyIGZyb20gYSBmaWx0ZXIgZGVmaW5pdGlvbi5cbiAqXG4gKiBAcGFyYW0gZmlsdGVyRGVmaW5pdGlvbiBUaGUgZmlsdGVyIGRlZmluaXRpb25cbiAqIEByZXR1cm5zIFJldHVybnMgYSBzYXAudWkubW9kZWwuRmlsdGVyIGZyb20gdGhlIGRlZmluaXRpb24sIG9yIHVuZGVmaW5lZCBpZiB0aGUgZGVmaW5pdGlvbiBpcyBlbXB0eSAobm8gcmFuZ2VzKVxuICovXG5mdW5jdGlvbiBjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbihmaWx0ZXJEZWZpbml0aW9uOiBGaWx0ZXJEZWZpbml0aW9uKTogRmlsdGVyIHwgdW5kZWZpbmVkIHtcblx0aWYgKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIG5ldyBGaWx0ZXIoXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnByb3BlcnR5UGF0aCxcblx0XHRcdGZpbHRlckRlZmluaXRpb24ucmFuZ2VzWzBdLm9wZXJhdG9yIGFzIEZpbHRlck9wZXJhdG9yLFxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXNbMF0ucmFuZ2VMb3csXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnJhbmdlc1swXS5yYW5nZUhpZ2hcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGFSYW5nZUZpbHRlcnMgPSBmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5tYXAocmFuZ2UgPT4ge1xuXHRcdFx0cmV0dXJuIG5ldyBGaWx0ZXIoZmlsdGVyRGVmaW5pdGlvbi5wcm9wZXJ0eVBhdGgsIHJhbmdlLm9wZXJhdG9yIGFzIEZpbHRlck9wZXJhdG9yLCByYW5nZS5yYW5nZUxvdywgcmFuZ2UucmFuZ2VIaWdoKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRmaWx0ZXJzOiBhUmFuZ2VGaWx0ZXJzLFxuXHRcdFx0YW5kOiBmYWxzZVxuXHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldEZpbHRlclN0cmluZ0Zyb21EZWZpbml0aW9uKGZpbHRlckRlZmluaXRpb246IEZpbHRlckRlZmluaXRpb24pOiBzdHJpbmcge1xuXHRjb25zdCBjdXJyZW50TG9jYWxlID0gbmV3IExvY2FsZShcblx0XHRzYXAudWlcblx0XHRcdC5nZXRDb3JlKClcblx0XHRcdC5nZXRDb25maWd1cmF0aW9uKClcblx0XHRcdC5nZXRMYW5ndWFnZSgpXG5cdCk7XG5cdGNvbnN0IHJlc0J1bmRsZSA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdGNvbnN0IGRhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSh7IHN0eWxlOiBcIm1lZGl1bVwiIH0sIGN1cnJlbnRMb2NhbGUpO1xuXG5cdGZ1bmN0aW9uIGZvcm1hdFJhbmdlKHJhbmdlOiBSYW5nZURlZmluaXRpb24pOiBzdHJpbmcge1xuXHRcdGNvbnN0IHZhbHVlTG93ID1cblx0XHRcdGZpbHRlckRlZmluaXRpb24ucHJvcGVydHlUeXBlLmluZGV4T2YoXCJFZG0uRGF0ZVwiKSA9PT0gMCA/IGRhdGVGb3JtYXQuZm9ybWF0KG5ldyBEYXRlKHJhbmdlLnJhbmdlTG93KSkgOiByYW5nZS5yYW5nZUxvdztcblx0XHRjb25zdCB2YWx1ZUhpZ2ggPVxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5wcm9wZXJ0eVR5cGUuaW5kZXhPZihcIkVkbS5EYXRlXCIpID09PSAwID8gZGF0ZUZvcm1hdC5mb3JtYXQobmV3IERhdGUocmFuZ2UucmFuZ2VIaWdoKSkgOiByYW5nZS5yYW5nZUhpZ2g7XG5cblx0XHRzd2l0Y2ggKHJhbmdlLm9wZXJhdG9yKSB7XG5cdFx0XHRjYXNlIFwiQlRcIjpcblx0XHRcdFx0cmV0dXJuIFwiW1wiICsgdmFsdWVMb3cgKyBcIiAtIFwiICsgdmFsdWVIaWdoICsgXCJdXCI7XG5cblx0XHRcdGNhc2UgXCJDb250YWluc1wiOlxuXHRcdFx0XHRyZXR1cm4gXCIqXCIgKyB2YWx1ZUxvdyArIFwiKlwiO1xuXG5cdFx0XHRjYXNlIFwiR0VcIjpcblx0XHRcdFx0cmV0dXJuIFwiXFx1MjI2NVwiICsgdmFsdWVMb3c7XG5cblx0XHRcdGNhc2UgXCJHVFwiOlxuXHRcdFx0XHRyZXR1cm4gXCI+XCIgKyB2YWx1ZUxvdztcblxuXHRcdFx0Y2FzZSBcIkxFXCI6XG5cdFx0XHRcdHJldHVybiBcIlxcdTIyNjRcIiArIHZhbHVlTG93O1xuXG5cdFx0XHRjYXNlIFwiTFRcIjpcblx0XHRcdFx0cmV0dXJuIFwiPFwiICsgdmFsdWVMb3c7XG5cblx0XHRcdGNhc2UgXCJOQlwiOlxuXHRcdFx0XHRyZXR1cm4gcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfRklMVEVSU1RSSU5HX05PVFwiLCBbXCJbXCIgKyB2YWx1ZUxvdyArIFwiIC0gXCIgKyB2YWx1ZUhpZ2ggKyBcIl1cIl0pO1xuXG5cdFx0XHRjYXNlIFwiTkVcIjpcblx0XHRcdFx0cmV0dXJuIFwiXFx1MjI2MFwiICsgdmFsdWVMb3c7XG5cblx0XHRcdGNhc2UgXCJOb3RDb250YWluc1wiOlxuXHRcdFx0XHRyZXR1cm4gcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfRklMVEVSU1RSSU5HX05PVFwiLCBbXCIqXCIgKyB2YWx1ZUxvdyArIFwiKlwiXSk7XG5cblx0XHRcdGNhc2UgXCJFUVwiOlxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIHZhbHVlTG93O1xuXHRcdH1cblx0fVxuXHRpZiAoZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH0gZWxzZSBpZiAoZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIGZvcm1hdFJhbmdlKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzWzBdKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gXCIoXCIgKyBmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5tYXAoZm9ybWF0UmFuZ2UpLmpvaW4oXCIsXCIpICsgXCIpXCI7XG5cdH1cbn1cblxuLyoqXG4gKiBAY2xhc3MgQSBjb250cm9sbGVyIGV4dGVuc2lvbiBmb3IgbWFuYWdpbmcgS1BJIGluIGFuIEFuYWx5dGljYWxMaXN0UGFnZVxuICpcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLktQSU1hbmFnZW1lbnRcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIDEuOTMuMFxuICovXG5AVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5LUElNYW5hZ2VtZW50XCIsIENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSlcbmNsYXNzIEtQSU1hbmFnZW1lbnRDb250cm9sbGVyRXh0ZW5zaW9uIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByb3RlY3RlZCBhS1BJRGVmaW5pdGlvbnM/OiBLUElEZWZpbml0aW9uW107XG5cdHByb3RlY3RlZCBvQXBwQ29tcG9uZW50ITogYW55O1xuXHRwcm90ZWN0ZWQgb0NhcmQhOiBDYXJkO1xuXHRwcm90ZWN0ZWQgb1BvcG92ZXIhOiBQb3BvdmVyO1xuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5hS1BJRGVmaW5pdGlvbnMgPSB0aGlzLmdldEtQSURhdGEoKTtcblxuXHRcdGlmICh0aGlzLmFLUElEZWZpbml0aW9ucyAmJiB0aGlzLmFLUElEZWZpbml0aW9ucy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHR0aGlzLm9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXG5cdFx0XHQvLyBDcmVhdGUgYSBKU09OIG1vZGVsIHRvIHN0b3JlIEtQSSBkYXRhXG5cdFx0XHRjb25zdCBvS1BJTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0XHRvVmlldy5zZXRNb2RlbChvS1BJTW9kZWwsIFwia3BpTW9kZWxcIik7XG5cblx0XHRcdHRoaXMuYUtQSURlZmluaXRpb25zLmZvckVhY2goa3BpRGVmaW5pdGlvbiA9PiB7XG5cdFx0XHRcdC8vIENyZWF0ZSB0aGUgbWFuaWZlc3QgZm9yIHRoZSBLUEkgY2FyZCBhbmQgc3RvcmUgaXQgaW4gdGhlIEtQSSBtb2RlbFxuXHRcdFx0XHRjb25zdCBvQ2FyZE1hbmlmZXN0OiBhbnkgPSB7XG5cdFx0XHRcdFx0XCJzYXAuYXBwXCI6IHtcblx0XHRcdFx0XHRcdGlkOiBcInNhcC5mZVwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJjYXJkXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFwic2FwLnVpXCI6IHtcblx0XHRcdFx0XHRcdHRlY2hub2xvZ3k6IFwiVUk1XCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFwic2FwLmNhcmRcIjoge1xuXHRcdFx0XHRcdFx0dHlwZTogXCJBbmFseXRpY2FsXCIsXG5cdFx0XHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0XHRcdGpzb246IHt9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0aGVhZGVyOiB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiTnVtZXJpY1wiLFxuXHRcdFx0XHRcdFx0XHR0aXRsZToga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGl0bGUsXG5cdFx0XHRcdFx0XHRcdHN1YlRpdGxlOiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5kZXNjcmlwdGlvbixcblx0XHRcdFx0XHRcdFx0dW5pdE9mTWVhc3VyZW1lbnQ6IFwie21haW5Vbml0fVwiLFxuXHRcdFx0XHRcdFx0XHRtYWluSW5kaWNhdG9yOiB7XG5cdFx0XHRcdFx0XHRcdFx0bnVtYmVyOiBcInttYWluVmFsdWVOb1NjYWxlfVwiLFxuXHRcdFx0XHRcdFx0XHRcdHVuaXQ6IFwie21haW5WYWx1ZVNjYWxlfVwiLFxuXHRcdFx0XHRcdFx0XHRcdHN0YXRlOiBcInttYWluU3RhdGV9XCIsXG5cdFx0XHRcdFx0XHRcdFx0dHJlbmQ6IFwie3RyZW5kfVwiXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRjb250ZW50OiB7XG5cdFx0XHRcdFx0XHRcdHBsb3RBcmVhOiB7XG5cdFx0XHRcdFx0XHRcdFx0XCJkYXRhTGFiZWxcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJ2aXNpYmxlXCI6IGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcImNhdGVnb3J5QXhpc1RleHRcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJ2aXNpYmxlXCI6IGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcInZhbHVlQXhpc1RleHRcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJ2aXNpYmxlXCI6IGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdFx0XHRcdHRleHQ6IFwie2NoYXJ0VGl0bGV9XCIsXG5cdFx0XHRcdFx0XHRcdFx0dmlzaWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRhbGlnbm1lbnQ6IFwiTGVmdFwiXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdG1lYXN1cmVBeGlzOiBcInZhbHVlQXhpc1wiLFxuXHRcdFx0XHRcdFx0XHRkaW1lbnNpb25BeGlzOiBcImNhdGVnb3J5QXhpc1wiLFxuXHRcdFx0XHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0XHRcdFx0cGF0aDogXCIvY2hhcnREYXRhXCJcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvLyBBZGQgc2lkZSBpbmRpY2F0b3JzIGluIHRoZSBjYXJkIGhlYWRlciBpZiBhIHRhcmdldCBpcyBkZWZpbmVkIGZvciB0aGUgS1BJXG5cdFx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRQYXRoIHx8IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb25zdCByZXNCdW5kbGUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdFx0XHRcdG9DYXJkTWFuaWZlc3RbXCJzYXAuY2FyZFwiXS5oZWFkZXIuc2lkZUluZGljYXRvcnMgPSBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRpdGxlOiByZXNCdW5kbGUuZ2V0VGV4dChcIkNfS1BJQ0FSRF9JTkRJQ0FUT1JfVEFSR0VUXCIpLFxuXHRcdFx0XHRcdFx0XHRudW1iZXI6IFwie3RhcmdldE51bWJlcn1cIixcblx0XHRcdFx0XHRcdFx0dW5pdDogXCJ7dGFyZ2V0VW5pdH1cIlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGl0bGU6IHJlc0J1bmRsZS5nZXRUZXh0KFwiQ19LUElDQVJEX0lORElDQVRPUl9ERVZJQVRJT05cIiksXG5cdFx0XHRcdFx0XHRcdG51bWJlcjogXCJ7ZGV2aWF0aW9uTnVtYmVyfVwiLFxuXHRcdFx0XHRcdFx0XHR1bml0OiBcIiVcIlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBEZXRhaWxzIG9mIHRoZSBjYXJkOiBmaWx0ZXIgZGVzY3JpcHRpb25zXG5cdFx0XHRcdGlmIChrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y29uc3QgYURlc2NyaXB0aW9uczogc3RyaW5nW10gPSBbXTtcblx0XHRcdFx0XHRrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucy5mb3JFYWNoKGZpbHRlckRlZmluaXRpb24gPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgZGVzYyA9IGdldEZpbHRlclN0cmluZ0Zyb21EZWZpbml0aW9uKGZpbHRlckRlZmluaXRpb24pO1xuXHRcdFx0XHRcdFx0aWYgKGRlc2MpIHtcblx0XHRcdFx0XHRcdFx0YURlc2NyaXB0aW9ucy5wdXNoKGRlc2MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0aWYgKGFEZXNjcmlwdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uaGVhZGVyLmRldGFpbHMgPSBhRGVzY3JpcHRpb25zLmpvaW4oXCIsIFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBVcGRhdGUgY2FyZCBjb250ZW50IGluIHRoZSBtYW5pZmVzdFxuXHRcdFx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uY29udGVudCA9IE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQsXG5cdFx0XHRcdFx0a3BpRGVmaW5pdGlvbi5jYXJkLmNhcmRDb250ZW50TWFuaWZlc3Rcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkLCB7XG5cdFx0XHRcdFx0bWFuaWZlc3Q6IG9DYXJkTWFuaWZlc3Rcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gTG9hZCB0YWcgZGF0YSBmb3IgdGhlIEtQSVxuXHRcdFx0XHR0aGlzLmxvYWRLUElUYWdEYXRhKGtwaURlZmluaXRpb24pLmNhdGNoKGZ1bmN0aW9uKGVycjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGVycik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0QE92ZXJyaWRlKClcblx0cHVibGljIG9uRXhpdCgpOiB2b2lkIHtcblx0XHRjb25zdCBvS1BJTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImtwaU1vZGVsXCIpIGFzIEpTT05Nb2RlbDtcblxuXHRcdGlmIChvS1BJTW9kZWwpIHtcblx0XHRcdG9LUElNb2RlbC5kZXN0cm95KCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRLUElEYXRhKCk6IEtQSURlZmluaXRpb25bXSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKSxcblx0XHRcdHNDdXN0b21EYXRhID0gb1ZpZXcuZ2V0Q29udGVudCgpWzBdLmRhdGEoXCJLUElEYXRhXCIpO1xuXG5cdFx0aWYgKHNDdXN0b21EYXRhKSB7XG5cdFx0XHRjb25zdCB2RGF0YSA9IHR5cGVvZiBzQ3VzdG9tRGF0YSA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2Uoc0N1c3RvbURhdGEpIDogc0N1c3RvbURhdGE7XG5cdFx0XHRpZiAoXCJjdXN0b21EYXRhXCIgaW4gdkRhdGEpIHtcblx0XHRcdFx0cmV0dXJuIHZEYXRhW1wiY3VzdG9tRGF0YVwiXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB2RGF0YTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZURhdGFwb2ludFZhbHVlQW5kQ3VycmVuY3koa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwga3BpQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGNvbnN0IGN1cnJlbnRMb2NhbGUgPSBuZXcgTG9jYWxlKFxuXHRcdFx0c2FwLnVpXG5cdFx0XHRcdC5nZXRDb3JlKClcblx0XHRcdFx0LmdldENvbmZpZ3VyYXRpb24oKVxuXHRcdFx0XHQuZ2V0TGFuZ3VhZ2UoKVxuXHRcdCk7XG5cdFx0Y29uc3QgcmF3VW5pdCA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LmlzUGF0aFxuXHRcdFx0PyBrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQudmFsdWUpXG5cdFx0XHQ6IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LnZhbHVlO1xuXG5cdFx0Y29uc3QgaXNQZXJjZW50YWdlID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8uaXNDdXJyZW5jeSA9PT0gZmFsc2UgJiYgcmF3VW5pdCA9PT0gXCIlXCI7XG5cdFx0Y29uc3Qgb0tQSU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJrcGlNb2RlbFwiKSBhcyBKU09OTW9kZWw7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyBNYWluIEtQSSB2YWx1ZVxuXHRcdGNvbnN0IHJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGgpKTtcblxuXHRcdC8vIFZhbHVlIGZvcm1hdHRlZCB3aXRoIGEgc2NhbGVcblx0XHRjb25zdCBrcGlWYWx1ZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRzdHlsZTogaXNQZXJjZW50YWdlID8gdW5kZWZpbmVkIDogXCJzaG9ydFwiLFxuXHRcdFx0XHRtaW5GcmFjdGlvbkRpZ2l0czogMCxcblx0XHRcdFx0bWF4RnJhY3Rpb25EaWdpdHM6IDEsXG5cdFx0XHRcdHNob3dTY2FsZTogIWlzUGVyY2VudGFnZVxuXHRcdFx0fSxcblx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHQpLmZvcm1hdChyYXdWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVcIiwga3BpVmFsdWUpO1xuXG5cdFx0Ly8gVmFsdWUgd2l0aG91dCBhIHNjYWxlXG5cdFx0Y29uc3Qga3BpVmFsdWVVbnNjYWxlZCA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMixcblx0XHRcdFx0c2hvd1NjYWxlOiBmYWxzZSxcblx0XHRcdFx0Z3JvdXBpbmdFbmFibGVkOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHJhd1ZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVVuc2NhbGVkXCIsIGtwaVZhbHVlVW5zY2FsZWQpO1xuXG5cdFx0Ly8gVmFsdWUgZm9ybWF0dGVkIHdpdGggdGhlIHNjYWxlIG9taXR0ZWRcblx0XHRjb25zdCBrcGlWYWx1ZU5vU2NhbGUgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdHtcblx0XHRcdFx0c3R5bGU6IGlzUGVyY2VudGFnZSA/IHVuZGVmaW5lZCA6IFwic2hvcnRcIixcblx0XHRcdFx0bWluRnJhY3Rpb25EaWdpdHM6IDAsXG5cdFx0XHRcdG1heEZyYWN0aW9uRGlnaXRzOiAxLFxuXHRcdFx0XHRzaG93U2NhbGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHJhd1ZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZU5vU2NhbGVcIiwga3BpVmFsdWVOb1NjYWxlKTtcblxuXHRcdC8vIFNjYWxlIG9mIHRoZSB2YWx1ZVxuXHRcdGNvbnN0IGtwaVZhbHVlU2NhbGUgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdHtcblx0XHRcdFx0c3R5bGU6IGlzUGVyY2VudGFnZSA/IHVuZGVmaW5lZCA6IFwic2hvcnRcIixcblx0XHRcdFx0ZGVjaW1hbHM6IDAsXG5cdFx0XHRcdG1heEludGVnZXJEaWdpdHM6IDAsXG5cdFx0XHRcdHNob3dTY2FsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHQpLmZvcm1hdChyYXdWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVTY2FsZVwiLCBrcGlWYWx1ZVNjYWxlKTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIFVuaXQgb3IgY3VycmVuY3lcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdCAmJiByYXdVbml0KSB7XG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdC5pc0N1cnJlbmN5KSB7XG5cdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblVuaXRcIiwgcmF3VW5pdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIHVuaXQgb2YgbWVhc3VyZSwgd2UgaGF2ZSB0byBmb3JtYXQgaXQgcHJvcGVybHlcblx0XHRcdFx0Y29uc3Qga3BpVW5pdCA9IE51bWJlckZvcm1hdC5nZXRVbml0SW5zdGFuY2UoeyBzaG93TnVtYmVyOiBmYWxzZSB9LCBjdXJyZW50TG9jYWxlKS5mb3JtYXQocmF3VmFsdWUsIHJhd1VuaXQpO1xuXHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Vbml0XCIsIGtwaVVuaXQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlRGF0YXBvaW50Q3JpdGljYWxpdHkoa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwga3BpQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGNvbnN0IHJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGgpKTtcblx0XHRjb25zdCBvS1BJTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImtwaU1vZGVsXCIpIGFzIEpTT05Nb2RlbDtcblxuXHRcdGxldCBjcml0aWNhbGl0eVZhbHVlID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlWYWx1ZSkge1xuXHRcdFx0Ly8gQ3JpdGljYWxpdHkgaXMgYSBmaXhlZCB2YWx1ZVxuXHRcdFx0Y3JpdGljYWxpdHlWYWx1ZSA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWU7XG5cdFx0fSBlbHNlIGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGgpIHtcblx0XHRcdC8vIENyaXRpY2FsaXR5IGNvbWVzIGZyb20gYW5vdGhlciBwcm9wZXJ0eSAodmlhIGEgcGF0aClcblx0XHRcdGNyaXRpY2FsaXR5VmFsdWUgPSBtZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eShrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aCkpO1xuXHRcdH0gZWxzZSBpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMgJiYga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUpIHtcblx0XHRcdC8vIENyaXRpY2FsaXR5IGNhbGN1bGF0aW9uXG5cdFx0XHRzd2l0Y2ggKGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvVGFyZ2V0XCI6XG5cdFx0XHRcdFx0Y3JpdGljYWxpdHlWYWx1ZSA9IG1lc3NhZ2VUeXBlRnJvbVRhcmdldENhbGN1bGF0aW9uKHJhd1ZhbHVlLCBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9NaW5pbWl6ZVwiOlxuXHRcdFx0XHRcdGNyaXRpY2FsaXR5VmFsdWUgPSBtZXNzYWdlVHlwZUZyb21NaW5pbWl6ZUNhbGN1bGF0aW9uKFxuXHRcdFx0XHRcdFx0cmF3VmFsdWUsXG5cdFx0XHRcdFx0XHRrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkc1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9NYXhpbWl6ZVwiOlxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGNyaXRpY2FsaXR5VmFsdWUgPSBtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uKFxuXHRcdFx0XHRcdFx0cmF3VmFsdWUsXG5cdFx0XHRcdFx0XHRrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkc1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluQ3JpdGljYWxpdHlcIiwgY3JpdGljYWxpdHlWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFxuXHRcdFx0XCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5TdGF0ZVwiLFxuXHRcdFx0dmFsdWVDb2xvckZyb21NZXNzYWdlVHlwZShjcml0aWNhbGl0eVZhbHVlKVxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZURhdGFwb2ludFRyZW5kKGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIGtwaUNvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCByYXdWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoKSk7XG5cdFx0Y29uc3Qgb0tQSU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJrcGlNb2RlbFwiKSBhcyBKU09OTW9kZWw7XG5cblx0XHRsZXQgdHJlbmRWYWx1ZSA9IFwiTm9uZVwiO1xuXG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kVmFsdWUpIHtcblx0XHRcdC8vIFRyZW5kIGlzIGEgZml4ZWQgdmFsdWVcblx0XHRcdHRyZW5kVmFsdWUgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFZhbHVlO1xuXHRcdH0gZWxzZSBpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRQYXRoKSB7XG5cdFx0XHQvLyBUcmVuZCBjb21lcyBmcm9tIGFub3RoZXIgcHJvcGVydHkgdmlhIGEgcGF0aFxuXHRcdFx0dHJlbmRWYWx1ZSA9IGRldmlhdGlvbkluZGljYXRvckZyb21UcmVuZFR5cGUoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFBhdGgpKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0a3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlICE9PSB1bmRlZmluZWQgfHxcblx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoXG5cdFx0KSB7XG5cdFx0XHQvLyBDYWxjdWxhdGVkIHRyZW5kXG5cdFx0XHRsZXQgdHJlbmRSZWZlcmVuY2VWYWx1ZTogbnVtYmVyO1xuXHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRyZW5kUmVmZXJlbmNlVmFsdWUgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0cmVuZFJlZmVyZW5jZVZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoXG5cdFx0XHRcdFx0a3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlUGF0aCB8fCBcIlwiKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0dHJlbmRWYWx1ZSA9IGRldmlhdGlvbkluZGljYXRvckZyb21DYWxjdWxhdGlvbihcblx0XHRcdFx0cmF3VmFsdWUsXG5cdFx0XHRcdHRyZW5kUmVmZXJlbmNlVmFsdWUsXG5cdFx0XHRcdCEha3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvbklzUmVsYXRpdmUsXG5cdFx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25UcmVzaG9sZHNcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90cmVuZFwiLCB0cmVuZFZhbHVlKTtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlVGFyZ2V0VmFsdWUoa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwga3BpQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFBhdGggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuOyAvLyBObyB0YXJnZXQgc2V0IGZvciB0aGUgS1BJXG5cdFx0fVxuXHRcdGNvbnN0IHJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGgpKTtcblx0XHRjb25zdCBvS1BJTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImtwaU1vZGVsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRjb25zdCBjdXJyZW50TG9jYWxlID0gbmV3IExvY2FsZShcblx0XHRcdHNhcC51aVxuXHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdC5nZXRDb25maWd1cmF0aW9uKClcblx0XHRcdFx0LmdldExhbmd1YWdlKClcblx0XHQpO1xuXG5cdFx0bGV0IHRhcmdldFJhd1ZhbHVlOiBudW1iZXI7XG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRhcmdldFJhd1ZhbHVlID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0VmFsdWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRhcmdldFJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRQYXRoIHx8IFwiXCIpKTtcblx0XHR9XG5cdFx0Y29uc3QgZGV2aWF0aW9uUmF3VmFsdWUgPSB0YXJnZXRSYXdWYWx1ZSAhPT0gMCA/ICgocmF3VmFsdWUgLSB0YXJnZXRSYXdWYWx1ZSkgLyB0YXJnZXRSYXdWYWx1ZSkgKiAxMDAgOiB1bmRlZmluZWQ7XG5cblx0XHQvLyBGb3JtYXR0aW5nXG5cdFx0Y29uc3QgdGFyZ2V0VmFsdWUgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdHtcblx0XHRcdFx0c3R5bGU6IFwic2hvcnRcIixcblx0XHRcdFx0bWluRnJhY3Rpb25EaWdpdHM6IDAsXG5cdFx0XHRcdG1heEZyYWN0aW9uRGlnaXRzOiAxLFxuXHRcdFx0XHRzaG93U2NhbGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHRhcmdldFJhd1ZhbHVlKTtcblx0XHRjb25zdCB0YXJnZXRTY2FsZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRzdHlsZTogXCJzaG9ydFwiLFxuXHRcdFx0XHRkZWNpbWFsczogMCxcblx0XHRcdFx0bWF4SW50ZWdlckRpZ2l0czogMCxcblx0XHRcdFx0c2hvd1NjYWxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHRhcmdldFJhd1ZhbHVlKTtcblxuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vdGFyZ2V0TnVtYmVyXCIsIHRhcmdldFZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL3RhcmdldFVuaXRcIiwgdGFyZ2V0U2NhbGUpO1xuXG5cdFx0aWYgKGRldmlhdGlvblJhd1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IGRldmlhdGlvblZhbHVlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRtaW5GcmFjdGlvbkRpZ2l0czogMCxcblx0XHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMSxcblx0XHRcdFx0XHRzaG93U2NhbGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHRcdCkuZm9ybWF0KGRldmlhdGlvblJhd1ZhbHVlKTtcblx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vZGV2aWF0aW9uTnVtYmVyXCIsIGRldmlhdGlvblZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9kZXZpYXRpb25OdW1iZXJcIiwgXCJOL0FcIik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvYWRzIHRhZyBkYXRhIGZvciBhIEtQSSwgYW5kIHN0b3JlcyBpdCBpbiB0aGUgSlNPTiBLUEkgbW9kZWwuXG5cdCAqXG5cdCAqIEBwYXJhbSB7S1BJRGVmaW5pdGlvbn0ga3BpRGVmaW5pdGlvbiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgS1BJLlxuXHQgKiBAcGFyYW0gbG9hZEZ1bGwgSWYgbm90IHRydWUsIGxvYWRzIG9ubHkgZGF0YSBmb3IgdGhlIEtQSSB0YWdcblx0ICogQHJldHVybnMge1Byb21pc2V9IFJldHVybnMgdGhlIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIGRhdGEgaXMgbG9hZGVkLlxuXHQgKi9cblx0cHJvdGVjdGVkIGxvYWRLUElUYWdEYXRhKGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIGxvYWRGdWxsPzogYm9vbGVhbik6IGFueSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldE1vZGVsKCk7XG5cdFx0Y29uc3Qgb0tQSU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJrcGlNb2RlbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb01vZGVsLmJpbmRMaXN0KFwiL1wiICsga3BpRGVmaW5pdGlvbi5lbnRpdHlTZXQpO1xuXHRcdGNvbnN0IG9BZ2dyZWdhdGU6IFJlY29yZDxzdHJpbmcsIHsgdW5pdD86IHN0cmluZyB9PiA9IHt9O1xuXG5cdFx0Ly8gTWFpbiB2YWx1ZSArIGN1cnJlbmN5L3VuaXRcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8uaXNQYXRoKSB7XG5cdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aF0gPSB7IHVuaXQ6IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQudmFsdWUgfTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0FnZ3JlZ2F0ZVtrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0fVxuXG5cdFx0Ly8gUHJvcGVydHkgZm9yIGNyaXRpY2FsaXR5XG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aCkge1xuXHRcdFx0b0FnZ3JlZ2F0ZVtrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGhdID0ge307XG5cdFx0fVxuXG5cdFx0Ly8gUHJvcGVydGllcyBmb3IgdHJlbmQgYW5kIHRyZW5kIGNhbGN1bGF0aW9uXG5cdFx0aWYgKGxvYWRGdWxsKSB7XG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRQYXRoKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRQYXRoXSA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGhdID0ge307XG5cdFx0XHR9XG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0UGF0aCkge1xuXHRcdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFBhdGhdID0ge307XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0b0xpc3RCaW5kaW5nLnNldEFnZ3JlZ2F0aW9uKHsgYWdncmVnYXRlOiBvQWdncmVnYXRlIH0pO1xuXG5cdFx0Ly8gTWFuYWdlIFNlbGVjdGlvblZhcmlhbnQgZmlsdGVyc1xuXHRcdGlmIChrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBhRmlsdGVycyA9IGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zLm1hcChjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbik7XG5cdFx0XHRvTGlzdEJpbmRpbmcuZmlsdGVyKGFGaWx0ZXJzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb0xpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCAxKS50aGVuKChhQ29udGV4dHM6IENvbnRleHRbXSkgPT4ge1xuXHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0Y29uc3QgcmF3VW5pdCA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LmlzUGF0aFxuXHRcdFx0XHRcdD8gYUNvbnRleHRzWzBdLmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQudmFsdWUpXG5cdFx0XHRcdFx0OiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py52YWx1ZTtcblxuXHRcdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdCAmJiAhcmF3VW5pdCkge1xuXHRcdFx0XHRcdC8vIEEgdW5pdC9jdXJyZW5jeSBpcyBkZWZpbmVkLCBidXQgaXRzIHZhbHVlIGlzIHVuZGVmaW5lZCAtLT4gbXVsdGktdW5pdCBzaXR1YXRpb25cblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVwiLCBcIipcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVVbnNjYWxlZFwiLCBcIipcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVOb1NjYWxlXCIsIFwiKlwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVNjYWxlXCIsIFwiXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblVuaXRcIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Dcml0aWNhbGl0eVwiLCBNZXNzYWdlVHlwZS5Ob25lKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5TdGF0ZVwiLCBcIk5vbmVcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90cmVuZFwiLCBcIk5vbmVcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90YXJnZXROdW1iZXJcIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL3RhcmdldFVuaXRcIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL2RldmlhdGlvbk51bWJlclwiLCB1bmRlZmluZWQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRGF0YXBvaW50VmFsdWVBbmRDdXJyZW5jeShrcGlEZWZpbml0aW9uLCBhQ29udGV4dHNbMF0pO1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRGF0YXBvaW50Q3JpdGljYWxpdHkoa3BpRGVmaW5pdGlvbiwgYUNvbnRleHRzWzBdKTtcblxuXHRcdFx0XHRcdGlmIChsb2FkRnVsbCkge1xuXHRcdFx0XHRcdFx0dGhpcy51cGRhdGVEYXRhcG9pbnRUcmVuZChrcGlEZWZpbml0aW9uLCBhQ29udGV4dHNbMF0pO1xuXHRcdFx0XHRcdFx0dGhpcy51cGRhdGVUYXJnZXRWYWx1ZShrcGlEZWZpbml0aW9uLCBhQ29udGV4dHNbMF0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJvdGVjdGVkIGxvYWRLUElDYXJkRGF0YShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uKTogYW55IHtcblx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvTW9kZWwuYmluZExpc3QoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmVudGl0eVNldCk7XG5cdFx0Y29uc3Qgb0dyb3VwOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3Q+ID0ge307XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0ZTogUmVjb3JkPHN0cmluZywgT2JqZWN0PiA9IHt9O1xuXHRcdGNvbnN0IG9LUElNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwia3BpTW9kZWxcIikgYXMgSlNPTk1vZGVsO1xuXG5cdFx0a3BpRGVmaW5pdGlvbi5jYXJkLmRpbWVuc2lvbnMuZm9yRWFjaChmdW5jdGlvbihzRGltZW5zaW9uTmFtZSkge1xuXHRcdFx0b0dyb3VwW3NEaW1lbnNpb25OYW1lXSA9IHt9O1xuXHRcdH0pO1xuXHRcdGtwaURlZmluaXRpb24uY2FyZC5tZWFzdXJlcy5mb3JFYWNoKGZ1bmN0aW9uKHNNZWFzdXJlTmFtZSkge1xuXHRcdFx0b0FnZ3JlZ2F0ZVtzTWVhc3VyZU5hbWVdID0ge307XG5cdFx0fSk7XG5cdFx0b0xpc3RCaW5kaW5nLnNldEFnZ3JlZ2F0aW9uKHtcblx0XHRcdGdyb3VwOiBvR3JvdXAsXG5cdFx0XHRhZ2dyZWdhdGU6IG9BZ2dyZWdhdGVcblx0XHR9KTtcblxuXHRcdC8vIE1hbmFnZSBTZWxlY3Rpb25WYXJpYW50IGZpbHRlcnNcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5zZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYUZpbHRlcnMgPSBrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucy5tYXAoY3JlYXRlRmlsdGVyRnJvbURlZmluaXRpb24pO1xuXHRcdFx0b0xpc3RCaW5kaW5nLmZpbHRlcihhRmlsdGVycyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9MaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCkudGhlbigoYUNvbnRleHRzOiBDb250ZXh0W10pID0+IHtcblx0XHRcdGNvbnN0IGNoYXJ0RGF0YSA9IGFDb250ZXh0cy5tYXAoZnVuY3Rpb24ob0NvbnRleHQpIHtcblx0XHRcdFx0Y29uc3Qgb0RhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblx0XHRcdFx0a3BpRGVmaW5pdGlvbi5jYXJkLmRpbWVuc2lvbnMuZm9yRWFjaChmdW5jdGlvbihzRGltZW5zaW9uTmFtZSkge1xuXHRcdFx0XHRcdG9EYXRhW3NEaW1lbnNpb25OYW1lXSA9IG9Db250ZXh0LmdldFByb3BlcnR5KHNEaW1lbnNpb25OYW1lKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGtwaURlZmluaXRpb24uY2FyZC5tZWFzdXJlcy5mb3JFYWNoKGZ1bmN0aW9uKHNNZWFzdXJlTmFtZSkge1xuXHRcdFx0XHRcdG9EYXRhW3NNZWFzdXJlTmFtZV0gPSBvQ29udGV4dC5nZXRQcm9wZXJ0eShzTWVhc3VyZU5hbWUpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRyZXR1cm4gb0RhdGE7XG5cdFx0XHR9KTtcblxuXHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9jaGFydERhdGFcIiwgY2hhcnREYXRhKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwb3BvdmVyIHRvIGRpc3BsYXkgdGhlIEtQSSBjYXJkXG5cdCAqIFRoZSBwb3BvdmVyIGFuZCB0aGUgY29udGFpbmVkIGNhcmQgZm9yIHRoZSBLUElzIGFyZSBjcmVhdGVkIGlmIG5lY2Vzc2FyeS5cblx0ICogVGhlIHBvcG92ZXIgaXMgc2hhcmVkIGJldHdlZW4gYWxsIEtQSXMsIHNvIHdlIGNyZWF0ZSBpdCBvbmx5IG9uY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBvS1BJVGFnIFRoZSBUYWcgdGhhdCB0cmlnZ2VyZWQgdGhlIHBvcG92ZXIgb3BlbmluZy5cblx0ICogQHJldHVybnMgVGhlIHNoYXJlZCBwb3BvdmVyLlxuXHQgKi9cblx0cHJvdGVjdGVkIGdldFBvcG92ZXIob0tQSVRhZzogR2VuZXJpY1RhZyk6IFBvcG92ZXIge1xuXHRcdGlmICghdGhpcy5vUG9wb3Zlcikge1xuXHRcdFx0dGhpcy5vQ2FyZCA9IG5ldyBDYXJkKHtcblx0XHRcdFx0d2lkdGg6IFwiMjVyZW1cIixcblx0XHRcdFx0aGVpZ2h0OiBcImF1dG9cIlxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMub1BvcG92ZXIgPSBuZXcgUG9wb3Zlcih7XG5cdFx0XHRcdGlkOiBcImtwaS1Qb3BvdmVyXCIsXG5cdFx0XHRcdHNob3dIZWFkZXI6IGZhbHNlLFxuXHRcdFx0XHRwbGFjZW1lbnQ6IFwiQXV0b1wiLFxuXHRcdFx0XHRjb250ZW50OiBbdGhpcy5vQ2FyZF1cblx0XHRcdH0pO1xuXG5cdFx0XHRvS1BJVGFnLmFkZERlcGVuZGVudCh0aGlzLm9Qb3BvdmVyKTsgLy8gVGhlIGZpcnN0IGNsaWNrZWQgdGFnIGdldHMgdGhlIHBvcG92ZXIgYXMgZGVwZW5kZW50XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMub1BvcG92ZXI7XG5cdH1cblxuXHRAUHVibGljXG5cdHB1YmxpYyBvbktQSVByZXNzZWQob0tQSVRhZzogYW55LCBrcGlJRDogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0tQSU1vZGVsID0gb0tQSVRhZy5nZXRNb2RlbChcImtwaU1vZGVsXCIpIGFzIEpTT05Nb2RlbDtcblxuXHRcdGlmICh0aGlzLmFLUElEZWZpbml0aW9ucyAmJiB0aGlzLmFLUElEZWZpbml0aW9ucy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGtwaURlZmluaXRpb24gPSB0aGlzLmFLUElEZWZpbml0aW9ucy5maW5kKGZ1bmN0aW9uKG9EZWYpIHtcblx0XHRcdFx0cmV0dXJuIG9EZWYuaWQgPT09IGtwaUlEO1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChrcGlEZWZpbml0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IGFQcm9taXNlcyA9IFt0aGlzLmxvYWRLUElUYWdEYXRhKGtwaURlZmluaXRpb24sIHRydWUpLCB0aGlzLmxvYWRLUElDYXJkRGF0YShrcGlEZWZpbml0aW9uKV07XG5cdFx0XHRcdGNvbnN0IG9Qb3BvdmVyID0gdGhpcy5nZXRQb3BvdmVyKG9LUElUYWcpO1xuXG5cdFx0XHRcdFByb21pc2UuYWxsKGFQcm9taXNlcylcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLm9DYXJkLnNldE1hbmlmZXN0KG9LUElNb2RlbC5nZXRQcm9wZXJ0eShcIi9cIiArIGtwaUlEICsgXCIvbWFuaWZlc3RcIikpO1xuXHRcdFx0XHRcdFx0dGhpcy5vQ2FyZC5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRvUG9wb3Zlci5vcGVuQnkob0tQSVRhZywgZmFsc2UpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGVyciA9PiB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgS1BJTWFuYWdlbWVudENvbnRyb2xsZXJFeHRlbnNpb247XG4iXX0=
1170
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIktQSU1hbmFnZW1lbnQudHMiXSwibmFtZXMiOlsiTWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHkiLCJNZXNzYWdlVHlwZSIsIkVycm9yIiwiV2FybmluZyIsIlN1Y2Nlc3MiLCJJbmZvcm1hdGlvbiIsIlZhbHVlQ29sb3JGcm9tTWVzc2FnZVR5cGUiLCJOb25lIiwibWVzc2FnZVR5cGVGcm9tVGFyZ2V0Q2FsY3VsYXRpb24iLCJrcGlWYWx1ZSIsImFUaHJlc2hvbGRzIiwiY3JpdGljYWxpdHlQcm9wZXJ0eSIsInVuZGVmaW5lZCIsIm1lc3NhZ2VUeXBlRnJvbU1pbmltaXplQ2FsY3VsYXRpb24iLCJtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uIiwiZGV2aWF0aW9uSW5kaWNhdG9yRnJvbVRyZW5kVHlwZSIsInRyZW5kVmFsdWUiLCJkZXZpYXRpb25JbmRpY2F0b3IiLCJkZXZpYXRpb25JbmRpY2F0b3JGcm9tQ2FsY3VsYXRpb24iLCJyZWZlcmVuY2VWYWx1ZSIsImlzUmVsYXRpdmUiLCJjb21wVmFsdWUiLCJjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbiIsImZpbHRlckRlZmluaXRpb24iLCJyYW5nZXMiLCJsZW5ndGgiLCJGaWx0ZXIiLCJwcm9wZXJ0eVBhdGgiLCJvcGVyYXRvciIsInJhbmdlTG93IiwicmFuZ2VIaWdoIiwiYVJhbmdlRmlsdGVycyIsIm1hcCIsInJhbmdlIiwiZmlsdGVycyIsImFuZCIsImdldEZpbHRlclN0cmluZ0Zyb21EZWZpbml0aW9uIiwiY3VycmVudExvY2FsZSIsIkxvY2FsZSIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldENvbmZpZ3VyYXRpb24iLCJnZXRMYW5ndWFnZSIsInJlc0J1bmRsZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImRhdGVGb3JtYXQiLCJEYXRlRm9ybWF0IiwiZ2V0RGF0ZUluc3RhbmNlIiwic3R5bGUiLCJmb3JtYXRSYW5nZSIsInZhbHVlTG93IiwicHJvcGVydHlUeXBlIiwiaW5kZXhPZiIsImZvcm1hdCIsIkRhdGUiLCJ2YWx1ZUhpZ2giLCJnZXRUZXh0Iiwiam9pbiIsImZvcm1hdENoYXJ0VGl0bGUiLCJrcGlEZWYiLCJmb3JtYXRMaXN0IiwiaXRlbXMiLCJsYWJlbCIsInJlcyIsIkkiLCJjaGFydCIsIm1lYXN1cmVzIiwiZGltZW5zaW9ucyIsInVwZGF0ZUNoYXJ0TGFiZWxTZXR0aW5ncyIsImNoYXJ0RGVmaW5pdGlvbiIsIm9DaGFydFByb3BlcnRpZXMiLCJjaGFydFR5cGUiLCJjYXRlZ29yeUF4aXMiLCJ0aXRsZSIsInZpc2libGUiLCJ2YWx1ZUF4aXMiLCJmb3JtYXRTdHJpbmciLCJwbG90QXJlYSIsImRhdGFMYWJlbCIsInR5cGUiLCJ2YWx1ZUF4aXMyIiwibGVnZW5kR3JvdXAiLCJsYXlvdXQiLCJwb3NpdGlvbiIsImFsaWdubWVudCIsInNpemVMZWdlbmQiLCJmaWx0ZXJNYXAiLCJhT2JqZWN0cyIsImFSb2xlcyIsImZpbHRlciIsImRpbWVuc2lvbiIsInJvbGUiLCJnZXRTY2F0dGVyQnViYmxlQ2hhcnRGZWVkcyIsImF4aXMxTWVhc3VyZXMiLCJheGlzMk1lYXN1cmVzIiwiYXhpczNNZWFzdXJlcyIsIm90aGVyTWVhc3VyZXMiLCJzZXJpZXNEaW1lbnNpb25zIiwic2hhcGVEaW1lbnNpb24iLCJmaW5kIiwieE1lYXN1cmUiLCJzaGlmdCIsInlNZWFzdXJlIiwic2l6ZU1lYXN1cmUiLCJwdXNoIiwiZ2V0Q2hhcnRGZWVkcyIsImdldE5hdmlnYXRpb25QYXJhbWV0ZXJzIiwibmF2SW5mbyIsIm9TaGVsbFNlcnZpY2UiLCJzZW1hbnRpY09iamVjdCIsImFjdGlvbiIsImdldExpbmtzIiwidGhlbiIsImFMaW5rcyIsImdldFByaW1hcnlJbnRlbnQiLCJvTGluayIsIm9JbmZvIiwicGFyc2VTaGVsbEhhc2giLCJpbnRlbnQiLCJ1bmF2YWlsYWJsZUFjdGlvbnMiLCJvdXRib3VuZE5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIm91dGJvdW5kIiwiS1BJTWFuYWdlbWVudENvbnRyb2xsZXJFeHRlbnNpb24iLCJVSTVDbGFzcyIsIkNvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSIsIk92ZXJyaWRlIiwia3BpRGVmaW5pdGlvbiIsIm9LUElNb2RlbCIsIm9DYXJkTWFuaWZlc3QiLCJpZCIsInRlY2hub2xvZ3kiLCJkYXRhIiwianNvbiIsImhlYWRlciIsImRhdGFwb2ludCIsInN1YlRpdGxlIiwiZGVzY3JpcHRpb24iLCJ1bml0T2ZNZWFzdXJlbWVudCIsIm1haW5JbmRpY2F0b3IiLCJudW1iZXIiLCJ1bml0Iiwic3RhdGUiLCJ0cmVuZCIsImNvbnRlbnQiLCJtaW5IZWlnaHQiLCJjaGFydFByb3BlcnRpZXMiLCJwYXRoIiwidGFyZ2V0UGF0aCIsInRhcmdldFZhbHVlIiwic2lkZUluZGljYXRvcnMiLCJzZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnMiLCJhRGVzY3JpcHRpb25zIiwiZm9yRWFjaCIsImRlc2MiLCJkZXRhaWxzIiwidGV4dCIsInZhbHVlIiwibmFtZSIsIm1lYXN1cmUiLCJmZWVkcyIsInNldFByb3BlcnR5IiwibWFuaWZlc3QiLCJuYXZpZ2F0aW9uIiwib05hdkluZm8iLCJwYXJhbWV0ZXJzIiwiYUtQSURlZmluaXRpb25zIiwiZ2V0S1BJRGF0YSIsIm9WaWV3IiwiZ2V0VmlldyIsIm9BcHBDb21wb25lbnQiLCJnZXRDb250cm9sbGVyIiwiZ2V0QXBwQ29tcG9uZW50IiwiSlNPTk1vZGVsIiwic2V0TW9kZWwiLCJpbml0Q2FyZE1hbmlmZXN0IiwiaW5pdE5hdmlnYXRpb25JbmZvIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsImNhdGNoIiwiZXJyIiwiTG9nIiwiZXJyb3IiLCJsb2FkS1BJVGFnRGF0YSIsImdldE1vZGVsIiwiZGVzdHJveSIsInNDdXN0b21EYXRhIiwiZ2V0Q29udGVudCIsInZEYXRhIiwiSlNPTiIsInBhcnNlIiwia3BpQ29udGV4dCIsInJhd1VuaXQiLCJpc1BhdGgiLCJnZXRQcm9wZXJ0eSIsImlzUGVyY2VudGFnZSIsImlzQ3VycmVuY3kiLCJyYXdWYWx1ZSIsIk51bWJlciIsInBhcnNlRmxvYXQiLCJOdW1iZXJGb3JtYXQiLCJnZXRGbG9hdEluc3RhbmNlIiwibWluRnJhY3Rpb25EaWdpdHMiLCJtYXhGcmFjdGlvbkRpZ2l0cyIsInNob3dTY2FsZSIsImtwaVZhbHVlVW5zY2FsZWQiLCJncm91cGluZ0VuYWJsZWQiLCJrcGlWYWx1ZU5vU2NhbGUiLCJrcGlWYWx1ZVNjYWxlIiwiZGVjaW1hbHMiLCJtYXhJbnRlZ2VyRGlnaXRzIiwia3BpVW5pdCIsImdldFVuaXRJbnN0YW5jZSIsInNob3dOdW1iZXIiLCJjcml0aWNhbGl0eVZhbHVlIiwiY3JpdGljYWxpdHlQYXRoIiwiY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMiLCJjcml0aWNhbGl0eUNhbGN1bGF0aW9uTW9kZSIsInRyZW5kUGF0aCIsInRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZSIsInRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoIiwidHJlbmRSZWZlcmVuY2VWYWx1ZSIsInRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlIiwidHJlbmRDYWxjdWxhdGlvblRyZXNob2xkcyIsInRhcmdldFJhd1ZhbHVlIiwiZGV2aWF0aW9uUmF3VmFsdWUiLCJ0YXJnZXRTY2FsZSIsImRldmlhdGlvblZhbHVlIiwib01haW5Nb2RlbCIsImxvYWRGdWxsIiwib0xpc3RCaW5kaW5nIiwiYmluZExpc3QiLCJlbnRpdHlTZXQiLCIkJGdyb3VwSWQiLCJvQWdncmVnYXRlIiwic2V0QWdncmVnYXRpb24iLCJhZ2dyZWdhdGUiLCJhRmlsdGVycyIsInJlcXVlc3RDb250ZXh0cyIsImFDb250ZXh0cyIsInVwZGF0ZURhdGFwb2ludFZhbHVlQW5kQ3VycmVuY3kiLCJ1cGRhdGVEYXRhcG9pbnRDcml0aWNhbGl0eSIsInVwZGF0ZURhdGFwb2ludFRyZW5kIiwidXBkYXRlVGFyZ2V0VmFsdWUiLCJvR3JvdXAiLCJncm91cCIsInNvcnRPcmRlciIsInNvcnQiLCJzb3J0SW5mbyIsIlNvcnRlciIsImRlc2NlbmRpbmciLCJtYXhJdGVtcyIsImNoYXJ0RGF0YSIsIm9Db250ZXh0Iiwib0RhdGEiLCJvS1BJVGFnIiwib1BvcG92ZXIiLCJyZWplY3QiLCJsb2FkTGlicmFyeSIsImFzeW5jIiwicmVxdWlyZSIsIkNhcmQiLCJIb3N0Iiwib0hvc3QiLCJhdHRhY2hBY3Rpb24iLCJvRXZlbnQiLCJzVHlwZSIsImdldFBhcmFtZXRlciIsIm9QYXJhbXMiLCJfaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwibmF2aWdhdGUiLCJuYXZpZ2F0ZU91dGJvdW5kIiwib0NhcmQiLCJ3aWR0aCIsImhlaWdodCIsInNldEhvc3QiLCJQb3BvdmVyIiwic2hvd0hlYWRlciIsInBsYWNlbWVudCIsImFkZERlcGVuZGVudCIsImtwaUlEIiwib0RlZiIsIm9Nb2RlbCIsImFQcm9taXNlcyIsImxvYWRLUElDYXJkRGF0YSIsImdldFBvcG92ZXIiLCJhbGwiLCJhUmVzdWx0cyIsInNldE1hbmlmZXN0IiwicmVmcmVzaCIsIm9wZW5CeSIsIkNvbnRyb2xsZXJFeHRlbnNpb24iLCJQdWJsaWMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWFBLE1BQU1BLDBCQUF1RCxHQUFHO0FBQy9ELFNBQUtDLFdBQVcsQ0FBQ0MsS0FEOEM7QUFFL0QsU0FBS0QsV0FBVyxDQUFDRSxPQUY4QztBQUcvRCxTQUFLRixXQUFXLENBQUNHLE9BSDhDO0FBSS9ELFNBQUtILFdBQVcsQ0FBQ0k7QUFKOEMsR0FBaEU7QUFPQSxNQUFNQyx5QkFBc0QsR0FBRztBQUM5REosSUFBQUEsS0FBSyxFQUFFLE9BRHVEO0FBRTlEQyxJQUFBQSxPQUFPLEVBQUUsVUFGcUQ7QUFHOURDLElBQUFBLE9BQU8sRUFBRSxNQUhxRDtBQUk5REMsSUFBQUEsV0FBVyxFQUFFLE1BSmlEO0FBSzlERSxJQUFBQSxJQUFJLEVBQUU7QUFMd0QsR0FBL0Q7QUFRQTtBQUNBO0FBQ0E7QUFD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O0FBQ2JDLGNBQUFBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVRixHQUFWO0FBQ0EsYUFWRjtBQVdBO0FBQ0Q7QUFDRDs7OztJQTNtQjZDK0csbUIsc1dBNmtCN0NDLE07U0FpQ2F4SyxnQyIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udHJvbGxlckV4dGVuc2lvbiB9IGZyb20gXCJzYXAvdWkvY29yZS9tdmNcIjtcbmltcG9ydCB7IENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9uc1wiO1xuaW1wb3J0IHsgVUk1Q2xhc3MsIE92ZXJyaWRlLCBQdWJsaWMgfSBmcm9tIFwiLi4vaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IEpTT05Nb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvanNvblwiO1xuaW1wb3J0IHsgT0RhdGFNb2RlbCwgQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcbmltcG9ydCB7IExvZyB9IGZyb20gXCJzYXAvYmFzZVwiO1xuaW1wb3J0IHsgS1BJQ2hhcnREZWZpbml0aW9uLCBLUElEZWZpbml0aW9uLCBOYXZpZ2F0aW9uSW5mbyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9LUElcIjtcbmltcG9ydCB7IEJhc2VDb250cm9sbGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlXCI7XG5pbXBvcnQgeyBNZXNzYWdlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyVHlwZXNcIjtcbmltcG9ydCB7IEZpbHRlckRlZmluaXRpb24sIFJhbmdlRGVmaW5pdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvU2VsZWN0aW9uVmFyaWFudEhlbHBlclwiO1xuaW1wb3J0IHsgTnVtYmVyRm9ybWF0LCBEYXRlRm9ybWF0IH0gZnJvbSBcInNhcC91aS9jb3JlL2Zvcm1hdFwiO1xuaW1wb3J0IHsgTG9jYWxlIH0gZnJvbSBcInNhcC91aS9jb3JlXCI7XG5pbXBvcnQgeyBGaWx0ZXIsIEZpbHRlck9wZXJhdG9yLCBTb3J0ZXIgfSBmcm9tIFwic2FwL3VpL21vZGVsXCI7XG5pbXBvcnQgeyBHZW5lcmljVGFnLCBQb3BvdmVyIH0gZnJvbSBcInNhcC9tXCI7XG5cbmNvbnN0IE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5OiBSZWNvcmQ8c3RyaW5nLCBNZXNzYWdlVHlwZT4gPSB7XG5cdFwiMVwiOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XCIyXCI6IE1lc3NhZ2VUeXBlLldhcm5pbmcsXG5cdFwiM1wiOiBNZXNzYWdlVHlwZS5TdWNjZXNzLFxuXHRcIjVcIjogTWVzc2FnZVR5cGUuSW5mb3JtYXRpb25cbn07XG5cbmNvbnN0IFZhbHVlQ29sb3JGcm9tTWVzc2FnZVR5cGU6IFJlY29yZDxNZXNzYWdlVHlwZSwgc3RyaW5nPiA9IHtcblx0RXJyb3I6IFwiRXJyb3JcIixcblx0V2FybmluZzogXCJDcml0aWNhbFwiLFxuXHRTdWNjZXNzOiBcIkdvb2RcIixcblx0SW5mb3JtYXRpb246IFwiTm9uZVwiLFxuXHROb25lOiBcIk5vbmVcIlxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgYSBtZXNzYWdlIHN0YXRlIGZyb20gYSBjYWxjdWxhdGVkIGNyaXRpY2FsaXR5IG9mIHR5cGUgJ1RhcmdldCcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGtwaVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgS1BJIHRvIGJlIHRlc3RlZCBhZ2FpbnN0LlxuICogQHBhcmFtIHtudW1iZXJbXX0gYVRocmVzaG9sZHMgVGhyZXNob2xkcyB0byBiZSB1c2VkIFtEZXZpYXRpb25SYW5nZUxvd1ZhbHVlLFRvbGVyYW5jZVJhbmdlTG93VmFsdWUsQWNjZXB0YW5jZVJhbmdlTG93VmFsdWUsQWNjZXB0YW5jZVJhbmdlSGlnaFZhbHVlLFRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlLERldmlhdGlvblJhbmdlSGlnaFZhbHVlXS5cbiAqIEByZXR1cm5zIHtNZXNzYWdlVHlwZX0gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBNZXNzYWdlVHlwZVxuICovXG5mdW5jdGlvbiBtZXNzYWdlVHlwZUZyb21UYXJnZXRDYWxjdWxhdGlvbihrcGlWYWx1ZTogbnVtYmVyLCBhVGhyZXNob2xkczogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW10pOiBNZXNzYWdlVHlwZSB7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBNZXNzYWdlVHlwZTtcblxuXHRpZiAoYVRocmVzaG9sZHNbMF0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1swXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzBdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1sxXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzJdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMl0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1syXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzVdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbNV0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1s1XSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5FcnJvcjtcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1s0XSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzRdICE9PSBudWxsICYmIGtwaVZhbHVlID4gYVRocmVzaG9sZHNbNF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuV2FybmluZztcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1szXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzNdICE9PSBudWxsICYmIGtwaVZhbHVlID4gYVRocmVzaG9sZHNbM10pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0fSBlbHNlIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuU3VjY2Vzcztcblx0fVxuXG5cdHJldHVybiBjcml0aWNhbGl0eVByb3BlcnR5O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGdldCBhIG1lc3NhZ2Ugc3RhdGUgZnJvbSBhIGNhbGN1bGF0ZWQgY3JpdGljYWxpdHkgb2YgdHlwZSAnTWluaW1pemUnLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBrcGlWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIEtQSSB0byBiZSB0ZXN0ZWQgYWdhaW5zdC5cbiAqIEBwYXJhbSB7bnVtYmVyW119IGFUaHJlc2hvbGRzIFRocmVzaG9sZHMgdG8gYmUgdXNlZCBbQWNjZXB0YW5jZVJhbmdlSGlnaFZhbHVlLFRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlLERldmlhdGlvblJhbmdlSGlnaFZhbHVlXS5cbiAqIEByZXR1cm5zIHtNZXNzYWdlVHlwZX0gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBNZXNzYWdlVHlwZVxuICovXG5mdW5jdGlvbiBtZXNzYWdlVHlwZUZyb21NaW5pbWl6ZUNhbGN1bGF0aW9uKGtwaVZhbHVlOiBudW1iZXIsIGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSk6IE1lc3NhZ2VUeXBlIHtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IE1lc3NhZ2VUeXBlO1xuXG5cdGlmIChhVGhyZXNob2xkc1syXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzJdICE9PSBudWxsICYmIGtwaVZhbHVlID4gYVRocmVzaG9sZHNbMl0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1sxXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA+IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMF0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1swXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA+IGFUaHJlc2hvbGRzWzBdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH0gZWxzZSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLlN1Y2Nlc3M7XG5cdH1cblxuXHRyZXR1cm4gY3JpdGljYWxpdHlQcm9wZXJ0eTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgYSBtZXNzYWdlIHN0YXRlIGZyb20gYSBjYWxjdWxhdGVkIGNyaXRpY2FsaXR5IG9mIHR5cGUgJ01heGltaXplJy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUEkgdG8gYmUgdGVzdGVkIGFnYWluc3QuXG4gKiBAcGFyYW0ge251bWJlcltdfSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0RldmlhdGlvblJhbmdlTG93VmFsdWUsVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZV0uXG4gKiBAcmV0dXJucyB7TWVzc2FnZVR5cGV9IFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgTWVzc2FnZVR5cGVcbiAqL1xuZnVuY3Rpb24gbWVzc2FnZVR5cGVGcm9tTWF4aW1pemVDYWxjdWxhdGlvbihrcGlWYWx1ZTogbnVtYmVyLCBhVGhyZXNob2xkczogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW10pOiBNZXNzYWdlVHlwZSB7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBNZXNzYWdlVHlwZTtcblxuXHRpZiAoYVRocmVzaG9sZHNbMF0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1swXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzBdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1sxXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzJdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMl0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1syXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGEgRGV2aWF0aW9uSW5kaWNhdG9yIHZhbHVlIGZyb20gYSB0cmVuZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHRyZW5kVmFsdWUgVGhlIGNyaXRpY2FsaXR5IHZhbHVlcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgRGV2aWF0aW9uSW5kaWNhdG9yIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIGRldmlhdGlvbkluZGljYXRvckZyb21UcmVuZFR5cGUodHJlbmRWYWx1ZTogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcblx0bGV0IGRldmlhdGlvbkluZGljYXRvcjogc3RyaW5nO1xuXG5cdHN3aXRjaCAodHJlbmRWYWx1ZSkge1xuXHRcdGNhc2UgMTogLy8gU3Ryb25nVXBcblx0XHRjYXNlIFwiMVwiOlxuXHRcdGNhc2UgMjogLy8gVXBcblx0XHRjYXNlIFwiMlwiOlxuXHRcdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJVcFwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIDQ6IC8vIERvd25cblx0XHRjYXNlIFwiNFwiOlxuXHRcdGNhc2UgNTogLy8gU3Ryb25nRG93blxuXHRcdGNhc2UgXCI1XCI6XG5cdFx0XHRkZXZpYXRpb25JbmRpY2F0b3IgPSBcIkRvd25cIjtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiTm9uZVwiO1xuXHR9XG5cblx0cmV0dXJuIGRldmlhdGlvbkluZGljYXRvcjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYSBEZXZpYXRpb25JbmRpY2F0b3IgZnJvbSBhIFRyZW5kQ2FsY3VsYXRpb24uXG4gKlxuICogQHBhcmFtIGtwaVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgS1BJXG4gKiBAcGFyYW0gcmVmZXJlbmNlVmFsdWUgVGhlIHJlZmVyZW5jZSB2YWx1ZSB0byBjb21wYXJlIHdpdGhcbiAqIEBwYXJhbSBpc1JlbGF0aXZlIFRydWUgaXMgdGhlIGNvbXBhcmlzb24gaXMgcmVsYXRpdmVcbiAqIEBwYXJhbSBhVGhyZXNob2xkcyBBcnJheSBvZiB0aHJlc2hvbGRzIFtTdHJvbmdEb3duRGlmZmVyZW5jZSwgRG93bkRpZmZlcmVuY2UsIFVwRGlmZmVyZW5jZSwgU3Ryb25nVXBEaWZmZXJlbmNlXVxuICogQHJldHVybnMge3NhcC5tLkRldmlhdGlvbkluZGljYXRvcn0gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBEZXZpYXRpb25JbmRpY2F0b3IgdmFsdWVcbiAqL1xuZnVuY3Rpb24gZGV2aWF0aW9uSW5kaWNhdG9yRnJvbUNhbGN1bGF0aW9uKFxuXHRrcGlWYWx1ZTogbnVtYmVyLFxuXHRyZWZlcmVuY2VWYWx1ZTogbnVtYmVyLFxuXHRpc1JlbGF0aXZlOiBib29sZWFuLFxuXHRhVGhyZXNob2xkczogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW10gfCB1bmRlZmluZWRcbik6IHN0cmluZyB7XG5cdGxldCBkZXZpYXRpb25JbmRpY2F0b3I6IHN0cmluZztcblxuXHRpZiAoIWFUaHJlc2hvbGRzIHx8IChpc1JlbGF0aXZlICYmICFyZWZlcmVuY2VWYWx1ZSkpIHtcblx0XHRyZXR1cm4gXCJOb25lXCI7XG5cdH1cblxuXHRjb25zdCBjb21wVmFsdWUgPSBpc1JlbGF0aXZlID8gKGtwaVZhbHVlIC0gcmVmZXJlbmNlVmFsdWUpIC8gcmVmZXJlbmNlVmFsdWUgOiBrcGlWYWx1ZSAtIHJlZmVyZW5jZVZhbHVlO1xuXG5cdGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGNvbXBWYWx1ZSA8PSBhVGhyZXNob2xkc1swXSkge1xuXHRcdC8vIFN0cm9uZ0Rvd24gLS0+IERvd25cblx0XHRkZXZpYXRpb25JbmRpY2F0b3IgPSBcIkRvd25cIjtcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1sxXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzFdICE9PSBudWxsICYmIGNvbXBWYWx1ZSA8PSBhVGhyZXNob2xkc1sxXSkge1xuXHRcdC8vIERvd24gLS0+IERvd25cblx0XHRkZXZpYXRpb25JbmRpY2F0b3IgPSBcIkRvd25cIjtcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1szXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzNdICE9PSBudWxsICYmIGNvbXBWYWx1ZSA+PSBhVGhyZXNob2xkc1szXSkge1xuXHRcdC8vIFN0cm9uZ1VwIC0tPiBVcFxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiVXBcIjtcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1syXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzJdICE9PSBudWxsICYmIGNvbXBWYWx1ZSA+PSBhVGhyZXNob2xkc1syXSkge1xuXHRcdC8vIFVwIC0tPiBVcFxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiVXBcIjtcblx0fSBlbHNlIHtcblx0XHQvLyBTaWRld2F5cyAtLT4gTm9uZVxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiTm9uZVwiO1xuXHR9XG5cblx0cmV0dXJuIGRldmlhdGlvbkluZGljYXRvcjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2FwLnVpLm1vZGVsLkZpbHRlciBmcm9tIGEgZmlsdGVyIGRlZmluaXRpb24uXG4gKlxuICogQHBhcmFtIGZpbHRlckRlZmluaXRpb24gVGhlIGZpbHRlciBkZWZpbml0aW9uXG4gKiBAcmV0dXJucyBSZXR1cm5zIGEgc2FwLnVpLm1vZGVsLkZpbHRlciBmcm9tIHRoZSBkZWZpbml0aW9uLCBvciB1bmRlZmluZWQgaWYgdGhlIGRlZmluaXRpb24gaXMgZW1wdHkgKG5vIHJhbmdlcylcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmlsdGVyRnJvbURlZmluaXRpb24oZmlsdGVyRGVmaW5pdGlvbjogRmlsdGVyRGVmaW5pdGlvbik6IEZpbHRlciB8IHVuZGVmaW5lZCB7XG5cdGlmIChmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBuZXcgRmlsdGVyKFxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnJhbmdlc1swXS5vcGVyYXRvciBhcyBGaWx0ZXJPcGVyYXRvcixcblx0XHRcdGZpbHRlckRlZmluaXRpb24ucmFuZ2VzWzBdLnJhbmdlTG93LFxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXNbMF0ucmFuZ2VIaWdoXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHRjb25zdCBhUmFuZ2VGaWx0ZXJzID0gZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubWFwKHJhbmdlID0+IHtcblx0XHRcdHJldHVybiBuZXcgRmlsdGVyKGZpbHRlckRlZmluaXRpb24ucHJvcGVydHlQYXRoLCByYW5nZS5vcGVyYXRvciBhcyBGaWx0ZXJPcGVyYXRvciwgcmFuZ2UucmFuZ2VMb3csIHJhbmdlLnJhbmdlSGlnaCk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG5ldyBGaWx0ZXIoe1xuXHRcdFx0ZmlsdGVyczogYVJhbmdlRmlsdGVycyxcblx0XHRcdGFuZDogZmFsc2Vcblx0XHR9KTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRGaWx0ZXJTdHJpbmdGcm9tRGVmaW5pdGlvbihmaWx0ZXJEZWZpbml0aW9uOiBGaWx0ZXJEZWZpbml0aW9uKTogc3RyaW5nIHtcblx0Y29uc3QgY3VycmVudExvY2FsZSA9IG5ldyBMb2NhbGUoXG5cdFx0c2FwLnVpXG5cdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHQuZ2V0Q29uZmlndXJhdGlvbigpXG5cdFx0XHQuZ2V0TGFuZ3VhZ2UoKVxuXHQpO1xuXHRjb25zdCByZXNCdW5kbGUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRjb25zdCBkYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoeyBzdHlsZTogXCJtZWRpdW1cIiB9LCBjdXJyZW50TG9jYWxlKTtcblxuXHRmdW5jdGlvbiBmb3JtYXRSYW5nZShyYW5nZTogUmFuZ2VEZWZpbml0aW9uKTogc3RyaW5nIHtcblx0XHRjb25zdCB2YWx1ZUxvdyA9XG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnByb3BlcnR5VHlwZS5pbmRleE9mKFwiRWRtLkRhdGVcIikgPT09IDAgPyBkYXRlRm9ybWF0LmZvcm1hdChuZXcgRGF0ZShyYW5nZS5yYW5nZUxvdykpIDogcmFuZ2UucmFuZ2VMb3c7XG5cdFx0Y29uc3QgdmFsdWVIaWdoID1cblx0XHRcdGZpbHRlckRlZmluaXRpb24ucHJvcGVydHlUeXBlLmluZGV4T2YoXCJFZG0uRGF0ZVwiKSA9PT0gMCA/IGRhdGVGb3JtYXQuZm9ybWF0KG5ldyBEYXRlKHJhbmdlLnJhbmdlSGlnaCkpIDogcmFuZ2UucmFuZ2VIaWdoO1xuXG5cdFx0c3dpdGNoIChyYW5nZS5vcGVyYXRvcikge1xuXHRcdFx0Y2FzZSBcIkJUXCI6XG5cdFx0XHRcdHJldHVybiBcIltcIiArIHZhbHVlTG93ICsgXCIgLSBcIiArIHZhbHVlSGlnaCArIFwiXVwiO1xuXG5cdFx0XHRjYXNlIFwiQ29udGFpbnNcIjpcblx0XHRcdFx0cmV0dXJuIFwiKlwiICsgdmFsdWVMb3cgKyBcIipcIjtcblxuXHRcdFx0Y2FzZSBcIkdFXCI6XG5cdFx0XHRcdHJldHVybiBcIlxcdTIyNjVcIiArIHZhbHVlTG93O1xuXG5cdFx0XHRjYXNlIFwiR1RcIjpcblx0XHRcdFx0cmV0dXJuIFwiPlwiICsgdmFsdWVMb3c7XG5cblx0XHRcdGNhc2UgXCJMRVwiOlxuXHRcdFx0XHRyZXR1cm4gXCJcXHUyMjY0XCIgKyB2YWx1ZUxvdztcblxuXHRcdFx0Y2FzZSBcIkxUXCI6XG5cdFx0XHRcdHJldHVybiBcIjxcIiArIHZhbHVlTG93O1xuXG5cdFx0XHRjYXNlIFwiTkJcIjpcblx0XHRcdFx0cmV0dXJuIHJlc0J1bmRsZS5nZXRUZXh0KFwiQ19LUElDQVJEX0ZJTFRFUlNUUklOR19OT1RcIiwgW1wiW1wiICsgdmFsdWVMb3cgKyBcIiAtIFwiICsgdmFsdWVIaWdoICsgXCJdXCJdKTtcblxuXHRcdFx0Y2FzZSBcIk5FXCI6XG5cdFx0XHRcdHJldHVybiBcIlxcdTIyNjBcIiArIHZhbHVlTG93O1xuXG5cdFx0XHRjYXNlIFwiTm90Q29udGFpbnNcIjpcblx0XHRcdFx0cmV0dXJuIHJlc0J1bmRsZS5nZXRUZXh0KFwiQ19LUElDQVJEX0ZJTFRFUlNUUklOR19OT1RcIiwgW1wiKlwiICsgdmFsdWVMb3cgKyBcIipcIl0pO1xuXG5cdFx0XHRjYXNlIFwiRVFcIjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiB2YWx1ZUxvdztcblx0XHR9XG5cdH1cblx0aWYgKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9IGVsc2UgaWYgKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBmb3JtYXRSYW5nZShmaWx0ZXJEZWZpbml0aW9uLnJhbmdlc1swXSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFwiKFwiICsgZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubWFwKGZvcm1hdFJhbmdlKS5qb2luKFwiLFwiKSArIFwiKVwiO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdENoYXJ0VGl0bGUoa3BpRGVmOiBLUElEZWZpbml0aW9uKTogc3RyaW5nIHtcblx0Y29uc3QgcmVzQnVuZGxlID0gc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblxuXHRmdW5jdGlvbiBmb3JtYXRMaXN0KGl0ZW1zOiB7IG5hbWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pIHtcblx0XHRpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9IGVsc2UgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0cmV0dXJuIGl0ZW1zWzBdLmxhYmVsO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgcmVzID0gaXRlbXNbMF0ubGFiZWw7XG5cdFx0XHRmb3IgKGxldCBJID0gMTsgSSA8IGl0ZW1zLmxlbmd0aCAtIDE7IEkrKykge1xuXHRcdFx0XHRyZXMgKz0gXCIsIFwiICsgaXRlbXNbSV0ubGFiZWw7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXNCdW5kbGUuZ2V0VGV4dChcIkNfS1BJQ0FSRF9JVEVNU0xJU1RcIiwgW3JlcywgaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV0ubGFiZWxdKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfQ0hBUlRUSVRMRVwiLCBbZm9ybWF0TGlzdChrcGlEZWYuY2hhcnQubWVhc3VyZXMpLCBmb3JtYXRMaXN0KGtwaURlZi5jaGFydC5kaW1lbnNpb25zKV0pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDaGFydExhYmVsU2V0dGluZ3MoY2hhcnREZWZpbml0aW9uOiBLUElDaGFydERlZmluaXRpb24sIG9DaGFydFByb3BlcnRpZXM6IGFueSk6IHZvaWQge1xuXHRzd2l0Y2ggKGNoYXJ0RGVmaW5pdGlvbi5jaGFydFR5cGUpIHtcblx0XHRjYXNlIFwiRG9udXRcIjpcblx0XHRcdC8vIFNob3cgZGF0YSBsYWJlbHMsIGRvIG5vdCBzaG93IGF4aXMgdGl0bGVzXG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLmNhdGVnb3J5QXhpcyA9IHtcblx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy52YWx1ZUF4aXMgPSB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWw6IHtcblx0XHRcdFx0XHRmb3JtYXRTdHJpbmc6IFwiU2hvcnRGbG9hdFwiXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnBsb3RBcmVhLmRhdGFMYWJlbCA9IHtcblx0XHRcdFx0dmlzaWJsZTogdHJ1ZSxcblx0XHRcdFx0dHlwZTogXCJ2YWx1ZVwiLFxuXHRcdFx0XHRmb3JtYXRTdHJpbmc6IFwiU2hvcnRGbG9hdF9NRkQyXCJcblx0XHRcdH07XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgXCJidWJibGVcIjpcblx0XHRcdC8vIFNob3cgYXhpcyB0aXRsZSwgYnViYmxlIHNpemUgbGVnZW5kLCBkbyBub3Qgc2hvdyBkYXRhIGxhYmVsc1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy52YWx1ZUF4aXMgPSB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsYWJlbDoge1xuXHRcdFx0XHRcdGZvcm1hdFN0cmluZzogXCJTaG9ydEZsb2F0XCJcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG9DaGFydFByb3BlcnRpZXMudmFsdWVBeGlzMiA9IHtcblx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsOiB7XG5cdFx0XHRcdFx0Zm9ybWF0U3RyaW5nOiBcIlNob3J0RmxvYXRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy5sZWdlbmRHcm91cCA9IHtcblx0XHRcdFx0bGF5b3V0OiB7XG5cdFx0XHRcdFx0cG9zaXRpb246IFwiYm90dG9tXCIsXG5cdFx0XHRcdFx0YWxpZ25tZW50OiBcInRvcExlZnRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy5zaXplTGVnZW5kID0ge1xuXHRcdFx0XHR2aXNpYmxlOiB0cnVlXG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy5wbG90QXJlYS5kYXRhTGFiZWwgPSB7IHZpc2libGU6IGZhbHNlIH07XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgXCJzY2F0dGVyXCI6XG5cdFx0XHQvLyBEbyBub3Qgc2hvdyBkYXRhIGxhYmVscyBhbmQgYXhpcyB0aXRsZXNcblx0XHRcdG9DaGFydFByb3BlcnRpZXMudmFsdWVBeGlzID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsOiB7XG5cdFx0XHRcdFx0Zm9ybWF0U3RyaW5nOiBcIlNob3J0RmxvYXRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy52YWx1ZUF4aXMyID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsOiB7XG5cdFx0XHRcdFx0Zm9ybWF0U3RyaW5nOiBcIlNob3J0RmxvYXRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy5wbG90QXJlYS5kYXRhTGFiZWwgPSB7IHZpc2libGU6IGZhbHNlIH07XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHQvLyBEbyBub3Qgc2hvdyBkYXRhIGxhYmVscyBhbmQgYXhpcyB0aXRsZXNcblx0XHRcdG9DaGFydFByb3BlcnRpZXMuY2F0ZWdvcnlBeGlzID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnZhbHVlQXhpcyA9IHtcblx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsYWJlbDoge1xuXHRcdFx0XHRcdGZvcm1hdFN0cmluZzogXCJTaG9ydEZsb2F0XCJcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG9DaGFydFByb3BlcnRpZXMucGxvdEFyZWEuZGF0YUxhYmVsID0geyB2aXNpYmxlOiBmYWxzZSB9O1xuXHR9XG59XG5mdW5jdGlvbiBmaWx0ZXJNYXAoYU9iamVjdHM6IHsgbmFtZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyByb2xlPzogc3RyaW5nIH1bXSwgYVJvbGVzPzogKHN0cmluZyB8IHVuZGVmaW5lZClbXSk6IHN0cmluZ1tdIHtcblx0aWYgKGFSb2xlcyAmJiBhUm9sZXMubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIGFPYmplY3RzXG5cdFx0XHQuZmlsdGVyKGRpbWVuc2lvbiA9PiB7XG5cdFx0XHRcdHJldHVybiBhUm9sZXMuaW5kZXhPZihkaW1lbnNpb24ucm9sZSkgPj0gMDtcblx0XHRcdH0pXG5cdFx0XHQubWFwKGRpbWVuc2lvbiA9PiB7XG5cdFx0XHRcdHJldHVybiBkaW1lbnNpb24ubGFiZWw7XG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gYU9iamVjdHMubWFwKGRpbWVuc2lvbiA9PiB7XG5cdFx0XHRyZXR1cm4gZGltZW5zaW9uLmxhYmVsO1xuXHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldFNjYXR0ZXJCdWJibGVDaGFydEZlZWRzKGNoYXJ0RGVmaW5pdGlvbjogS1BJQ2hhcnREZWZpbml0aW9uKTogeyB1aWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZXM6IHN0cmluZ1tdIH1bXSB7XG5cdGNvbnN0IGF4aXMxTWVhc3VyZXMgPSBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzLCBbXCJBeGlzMVwiXSk7XG5cdGNvbnN0IGF4aXMyTWVhc3VyZXMgPSBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzLCBbXCJBeGlzMlwiXSk7XG5cdGNvbnN0IGF4aXMzTWVhc3VyZXMgPSBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzLCBbXCJBeGlzM1wiXSk7XG5cdGNvbnN0IG90aGVyTWVhc3VyZXMgPSBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzLCBbdW5kZWZpbmVkXSk7XG5cdGNvbnN0IHNlcmllc0RpbWVuc2lvbnMgPSBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLmRpbWVuc2lvbnMsIFtcIlNlcmllc1wiXSk7XG5cblx0Ly8gR2V0IHRoZSBmaXJzdCBkaW1lbnNpb24gd2l0aCByb2xlIFwiQ2F0ZWdvcnlcIiBmb3IgdGhlIHNoYXBlXG5cdGNvbnN0IHNoYXBlRGltZW5zaW9uID0gY2hhcnREZWZpbml0aW9uLmRpbWVuc2lvbnMuZmluZChkaW1lbnNpb24gPT4ge1xuXHRcdHJldHVybiBkaW1lbnNpb24ucm9sZSA9PT0gXCJDYXRlZ29yeVwiO1xuXHR9KTtcblxuXHQvLyBNZWFzdXJlIGZvciB0aGUgeC1BeGlzIDogZmlyc3QgbWVhc3VyZSBmb3IgQXhpczEsIG9yIGZvciBBeGlzMiBpZiBub3QgZm91bmQsIG9yIGZvciBBeGlzMyBpZiBub3QgZm91bmRcblx0Y29uc3QgeE1lYXN1cmUgPSBheGlzMU1lYXN1cmVzLnNoaWZ0KCkgfHwgYXhpczJNZWFzdXJlcy5zaGlmdCgpIHx8IGF4aXMzTWVhc3VyZXMuc2hpZnQoKSB8fCBvdGhlck1lYXN1cmVzLnNoaWZ0KCkgfHwgXCJcIjtcblx0Ly8gTWVhc3VyZSBmb3IgdGhlIHktQXhpcyA6IGZpcnN0IG1lYXN1cmUgZm9yIEF4aXMyLCBvciBzZWNvbmQgbWVhc3VyZSBmb3IgQXhpczEgaWYgbm90IGZvdW5kLCBvciBmaXJzdCBtZWFzdXJlIGZvciBBeGlzMyBpZiBub3QgZm91bmRcblx0Y29uc3QgeU1lYXN1cmUgPSBheGlzMk1lYXN1cmVzLnNoaWZ0KCkgfHwgYXhpczFNZWFzdXJlcy5zaGlmdCgpIHx8IGF4aXMzTWVhc3VyZXMuc2hpZnQoKSB8fCBvdGhlck1lYXN1cmVzLnNoaWZ0KCkgfHwgXCJcIjtcblx0Y29uc3QgcmVzID0gW1xuXHRcdHtcblx0XHRcdFwidWlkXCI6IFwidmFsdWVBeGlzXCIsXG5cdFx0XHRcInR5cGVcIjogXCJNZWFzdXJlXCIsXG5cdFx0XHRcInZhbHVlc1wiOiBbeE1lYXN1cmVdXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRcInVpZFwiOiBcInZhbHVlQXhpczJcIixcblx0XHRcdFwidHlwZVwiOiBcIk1lYXN1cmVcIixcblx0XHRcdFwidmFsdWVzXCI6IFt5TWVhc3VyZV1cblx0XHR9XG5cdF07XG5cblx0aWYgKGNoYXJ0RGVmaW5pdGlvbi5jaGFydFR5cGUgPT09IFwiYnViYmxlXCIpIHtcblx0XHQvLyBNZWFzdXJlIGZvciB0aGUgc2l6ZSBvZiB0aGUgYnViYmxlOiBmaXJzdCBtZWFzdXJlIGZvciBBeGlzMywgb3IgcmVtYWluaW5nIG1lYXN1cmUgZm9yIEF4aXMxL0F4aXMyIGlmIG5vdCBmb3VuZFxuXHRcdGNvbnN0IHNpemVNZWFzdXJlID0gYXhpczNNZWFzdXJlcy5zaGlmdCgpIHx8IGF4aXMxTWVhc3VyZXMuc2hpZnQoKSB8fCBheGlzMk1lYXN1cmVzLnNoaWZ0KCkgfHwgb3RoZXJNZWFzdXJlcy5zaGlmdCgpIHx8IFwiXCI7XG5cdFx0cmVzLnB1c2goe1xuXHRcdFx0XCJ1aWRcIjogXCJidWJibGVXaWR0aFwiLFxuXHRcdFx0XCJ0eXBlXCI6IFwiTWVhc3VyZVwiLFxuXHRcdFx0XCJ2YWx1ZXNcIjogW3NpemVNZWFzdXJlXVxuXHRcdH0pO1xuXHR9XG5cblx0Ly8gQ29sb3IgKG9wdGlvbmFsKVxuXHRpZiAoc2VyaWVzRGltZW5zaW9ucy5sZW5ndGgpIHtcblx0XHRyZXMucHVzaCh7XG5cdFx0XHRcInVpZFwiOiBcImNvbG9yXCIsXG5cdFx0XHRcInR5cGVcIjogXCJEaW1lbnNpb25cIixcblx0XHRcdFwidmFsdWVzXCI6IHNlcmllc0RpbWVuc2lvbnNcblx0XHR9KTtcblx0fVxuXHQvLyBTaGFwZSAob3B0aW9uYWwpXG5cdGlmIChzaGFwZURpbWVuc2lvbikge1xuXHRcdHJlcy5wdXNoKHtcblx0XHRcdFwidWlkXCI6IFwic2hhcGVcIixcblx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XCJ2YWx1ZXNcIjogW3NoYXBlRGltZW5zaW9uLmxhYmVsXVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGdldENoYXJ0RmVlZHMoY2hhcnREZWZpbml0aW9uOiBLUElDaGFydERlZmluaXRpb24pOiB7IHVpZDogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHZhbHVlczogc3RyaW5nW10gfVtdIHtcblx0bGV0IHJlczogeyB1aWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZXM6IHN0cmluZ1tdIH1bXTtcblxuXHRzd2l0Y2ggKGNoYXJ0RGVmaW5pdGlvbi5jaGFydFR5cGUpIHtcblx0XHRjYXNlIFwiRG9udXRcIjpcblx0XHRcdHJlcyA9IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwic2l6ZVwiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIk1lYXN1cmVcIixcblx0XHRcdFx0XHRcInZhbHVlc1wiOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJ1aWRcIjogXCJjb2xvclwiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24uZGltZW5zaW9ucylcblx0XHRcdFx0fVxuXHRcdFx0XTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBcImJ1YmJsZVwiOlxuXHRcdGNhc2UgXCJzY2F0dGVyXCI6XG5cdFx0XHRyZXMgPSBnZXRTY2F0dGVyQnViYmxlQ2hhcnRGZWVkcyhjaGFydERlZmluaXRpb24pO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwidmVydGljYWxfYnVsbGV0XCI6XG5cdFx0XHRyZXMgPSBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcInVpZFwiOiBcImFjdHVhbFZhbHVlc1wiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIk1lYXN1cmVcIixcblx0XHRcdFx0XHRcInZhbHVlc1wiOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzLCBbdW5kZWZpbmVkLCBcIkF4aXMxXCJdKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJ1aWRcIjogXCJ0YXJnZXRWYWx1ZXNcIixcblx0XHRcdFx0XHRcInR5cGVcIjogXCJNZWFzdXJlXCIsXG5cdFx0XHRcdFx0XCJ2YWx1ZXNcIjogZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5tZWFzdXJlcywgW1wiQXhpczJcIl0pXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcInVpZFwiOiBcImNhdGVnb3J5QXhpc1wiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24uZGltZW5zaW9ucywgW3VuZGVmaW5lZCwgXCJDYXRlZ29yeVwiXSlcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwiY29sb3JcIixcblx0XHRcdFx0XHRcInR5cGVcIjogXCJEaW1lbnNpb25cIixcblx0XHRcdFx0XHRcInZhbHVlc1wiOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLmRpbWVuc2lvbnMsIFtcIlNlcmllc1wiXSlcblx0XHRcdFx0fVxuXHRcdFx0XTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJlcyA9IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwidmFsdWVBeGlzXCIsXG5cdFx0XHRcdFx0XCJ0eXBlXCI6IFwiTWVhc3VyZVwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcInVpZFwiOiBcImNhdGVnb3J5QXhpc1wiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24uZGltZW5zaW9ucywgW3VuZGVmaW5lZCwgXCJDYXRlZ29yeVwiXSlcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwiY29sb3JcIixcblx0XHRcdFx0XHRcInR5cGVcIjogXCJEaW1lbnNpb25cIixcblx0XHRcdFx0XHRcInZhbHVlc1wiOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLmRpbWVuc2lvbnMsIFtcIlNlcmllc1wiXSlcblx0XHRcdFx0fVxuXHRcdFx0XTtcblx0fVxuXG5cdHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGdldE5hdmlnYXRpb25QYXJhbWV0ZXJzKFxuXHRuYXZJbmZvOiBOYXZpZ2F0aW9uSW5mbyxcblx0b1NoZWxsU2VydmljZTogYW55XG4pOiBQcm9taXNlPHsgc2VtYW50aWNPYmplY3Q/OiBzdHJpbmc7IGFjdGlvbj86IHN0cmluZzsgb3V0Ym91bmQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZD4ge1xuXHRpZiAobmF2SW5mby5zZW1hbnRpY09iamVjdCkge1xuXHRcdGlmIChuYXZJbmZvLmFjdGlvbikge1xuXHRcdFx0Ly8gQWN0aW9uIGlzIGFscmVhZHkgc3BlY2lmaWVkOiBjaGVjayBpZiBpdCdzIGF2YWlsYWJsZSBpbiB0aGUgc2hlbGxcblx0XHRcdHJldHVybiBvU2hlbGxTZXJ2aWNlLmdldExpbmtzKHsgc2VtYW50aWNPYmplY3Q6IG5hdkluZm8uc2VtYW50aWNPYmplY3QsIGFjdGlvbjogbmF2SW5mby5hY3Rpb24gfSkudGhlbigoYUxpbmtzOiBhbnlbXSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYUxpbmtzLmxlbmd0aCA/IHsgc2VtYW50aWNPYmplY3Q6IG5hdkluZm8uc2VtYW50aWNPYmplY3QsIGFjdGlvbjogbmF2SW5mby5hY3Rpb24gfSA6IHVuZGVmaW5lZDtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXZSBnZXQgdGhlIHByaW1hcnkgaW50ZW50IGZyb20gdGhlIHNoZWxsXG5cdFx0XHRyZXR1cm4gb1NoZWxsU2VydmljZS5nZXRQcmltYXJ5SW50ZW50KG5hdkluZm8uc2VtYW50aWNPYmplY3QpLnRoZW4oKG9MaW5rOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKCFvTGluaykge1xuXHRcdFx0XHRcdC8vIE5vIHByaW1hcnkgaW50ZW50Li4uXG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENoZWNrIHRoYXQgdGhlIHByaW1hcnkgaW50ZW50IGlzIG5vdCBwYXJ0IG9mIHRoZSB1bmF2YWlsYWJsZSBhY3Rpb25zXG5cdFx0XHRcdGNvbnN0IG9JbmZvID0gb1NoZWxsU2VydmljZS5wYXJzZVNoZWxsSGFzaChvTGluay5pbnRlbnQpO1xuXHRcdFx0XHRyZXR1cm4gbmF2SW5mby51bmF2YWlsYWJsZUFjdGlvbnMgJiYgbmF2SW5mby51bmF2YWlsYWJsZUFjdGlvbnMuaW5kZXhPZihvSW5mby5hY3Rpb24pID49IDBcblx0XHRcdFx0XHQ/IHVuZGVmaW5lZFxuXHRcdFx0XHRcdDogeyBzZW1hbnRpY09iamVjdDogb0luZm8uc2VtYW50aWNPYmplY3QsIGFjdGlvbjogb0luZm8uYWN0aW9uIH07XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gT3V0Ym91bmQgbmF2aWdhdGlvbiBzcGVjaWZpZWQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0cmV0dXJuIG5hdkluZm8ub3V0Ym91bmROYXZpZ2F0aW9uID8gUHJvbWlzZS5yZXNvbHZlKHsgb3V0Ym91bmQ6IG5hdkluZm8ub3V0Ym91bmROYXZpZ2F0aW9uIH0pIDogUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdH1cbn1cblxuLyoqXG4gKiBAY2xhc3MgQSBjb250cm9sbGVyIGV4dGVuc2lvbiBmb3IgbWFuYWdpbmcgdGhlIEtQSXMgaW4gYW4gYW5hbHl0aWNhbCBsaXN0IHBhZ2VcbiAqXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5LUElNYW5hZ2VtZW50XG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKlxuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjkzLjBcbiAqL1xuQFVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuS1BJTWFuYWdlbWVudFwiLCBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEpXG5jbGFzcyBLUElNYW5hZ2VtZW50Q29udHJvbGxlckV4dGVuc2lvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYUtQSURlZmluaXRpb25zPzogS1BJRGVmaW5pdGlvbltdO1xuXHRwcm90ZWN0ZWQgb0NhcmQ6IGFueTtcblx0cHJvdGVjdGVkIG9Qb3BvdmVyITogUG9wb3ZlcjtcblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgY2FyZCBtYW5pZmVzdCBmb3IgYSBLUEkgZGVmaW5pdGlvbiBhbmQgc3RvcmVzIGl0IGluIGEgSlNPTiBtb2RlbC5cblx0ICpcblx0ICogQHBhcmFtIGtwaURlZmluaXRpb24gVGhlIEtQSSBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSBvS1BJTW9kZWwgVGhlIEpTT04gbW9kZWwgaW4gd2hpY2ggdGhlIG1hbmlmZXN0IHdpbGwgYmUgc3RvcmVkXG5cdCAqL1xuXHRwcm90ZWN0ZWQgaW5pdENhcmRNYW5pZmVzdChrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBvS1BJTW9kZWw6IEpTT05Nb2RlbDxhbnk+KTogdm9pZCB7XG5cdFx0Y29uc3Qgb0NhcmRNYW5pZmVzdDogYW55ID0ge1xuXHRcdFx0XCJzYXAuYXBwXCI6IHtcblx0XHRcdFx0aWQ6IFwic2FwLmZlXCIsXG5cdFx0XHRcdHR5cGU6IFwiY2FyZFwiXG5cdFx0XHR9LFxuXHRcdFx0XCJzYXAudWlcIjoge1xuXHRcdFx0XHR0ZWNobm9sb2d5OiBcIlVJNVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJzYXAuY2FyZFwiOiB7XG5cdFx0XHRcdHR5cGU6IFwiQW5hbHl0aWNhbFwiLFxuXHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0anNvbjoge31cblx0XHRcdFx0fSxcblx0XHRcdFx0aGVhZGVyOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJOdW1lcmljXCIsXG5cdFx0XHRcdFx0dGl0bGU6IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRpdGxlLFxuXHRcdFx0XHRcdHN1YlRpdGxlOiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5kZXNjcmlwdGlvbixcblx0XHRcdFx0XHR1bml0T2ZNZWFzdXJlbWVudDogXCJ7bWFpblVuaXR9XCIsXG5cdFx0XHRcdFx0bWFpbkluZGljYXRvcjoge1xuXHRcdFx0XHRcdFx0bnVtYmVyOiBcInttYWluVmFsdWVOb1NjYWxlfVwiLFxuXHRcdFx0XHRcdFx0dW5pdDogXCJ7bWFpblZhbHVlU2NhbGV9XCIsXG5cdFx0XHRcdFx0XHRzdGF0ZTogXCJ7bWFpblN0YXRlfVwiLFxuXHRcdFx0XHRcdFx0dHJlbmQ6IFwie3RyZW5kfVwiXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjb250ZW50OiB7XG5cdFx0XHRcdFx0bWluSGVpZ2h0OiBcIjI1cmVtXCIsXG5cdFx0XHRcdFx0Y2hhcnRQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdFx0XHRwbG90QXJlYToge30sXG5cdFx0XHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRhbGlnbm1lbnQ6IFwibGVmdFwiXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0XHRwYXRoOiBcIi9jaGFydERhdGFcIlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBBZGQgc2lkZSBpbmRpY2F0b3JzIGluIHRoZSBjYXJkIGhlYWRlciBpZiBhIHRhcmdldCBpcyBkZWZpbmVkIGZvciB0aGUgS1BJXG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFBhdGggfHwga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3QgcmVzQnVuZGxlID0gc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRcdG9DYXJkTWFuaWZlc3RbXCJzYXAuY2FyZFwiXS5oZWFkZXIuc2lkZUluZGljYXRvcnMgPSBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aXRsZTogcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfSU5ESUNBVE9SX1RBUkdFVFwiKSxcblx0XHRcdFx0XHRudW1iZXI6IFwie3RhcmdldE51bWJlcn1cIixcblx0XHRcdFx0XHR1bml0OiBcInt0YXJnZXRVbml0fVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aXRsZTogcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfSU5ESUNBVE9SX0RFVklBVElPTlwiKSxcblx0XHRcdFx0XHRudW1iZXI6IFwie2RldmlhdGlvbk51bWJlcn1cIixcblx0XHRcdFx0XHR1bml0OiBcIiVcIlxuXHRcdFx0XHR9XG5cdFx0XHRdO1xuXHRcdH1cblxuXHRcdC8vIERldGFpbHMgb2YgdGhlIGNhcmQ6IGZpbHRlciBkZXNjcmlwdGlvbnNcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5zZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYURlc2NyaXB0aW9uczogc3RyaW5nW10gPSBbXTtcblx0XHRcdGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zLmZvckVhY2goZmlsdGVyRGVmaW5pdGlvbiA9PiB7XG5cdFx0XHRcdGNvbnN0IGRlc2MgPSBnZXRGaWx0ZXJTdHJpbmdGcm9tRGVmaW5pdGlvbihmaWx0ZXJEZWZpbml0aW9uKTtcblx0XHRcdFx0aWYgKGRlc2MpIHtcblx0XHRcdFx0XHRhRGVzY3JpcHRpb25zLnB1c2goZGVzYyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoYURlc2NyaXB0aW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmhlYWRlci5kZXRhaWxzID0gYURlc2NyaXB0aW9ucy5qb2luKFwiLCBcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2hhcnQgc2V0dGluZ3M6IHR5cGUsIHRpdGxlLCBkaW1lbnNpb25zIGFuZCBtZWFzdXJlcyBpbiB0aGUgbWFuaWZlc3Rcblx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uY29udGVudC5jaGFydFR5cGUgPSBrcGlEZWZpbml0aW9uLmNoYXJ0LmNoYXJ0VHlwZTtcblx0XHR1cGRhdGVDaGFydExhYmVsU2V0dGluZ3Moa3BpRGVmaW5pdGlvbi5jaGFydCwgb0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQuY2hhcnRQcm9wZXJ0aWVzKTtcblx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uY29udGVudC5jaGFydFByb3BlcnRpZXMudGl0bGUudGV4dCA9IGZvcm1hdENoYXJ0VGl0bGUoa3BpRGVmaW5pdGlvbik7XG5cdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQuZGltZW5zaW9ucyA9IGtwaURlZmluaXRpb24uY2hhcnQuZGltZW5zaW9ucy5tYXAoZGltZW5zaW9uID0+IHtcblx0XHRcdHJldHVybiB7IGxhYmVsOiBkaW1lbnNpb24ubGFiZWwsIHZhbHVlOiBcIntcIiArIGRpbWVuc2lvbi5uYW1lICsgXCJ9XCIgfTtcblx0XHR9KTtcblx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uY29udGVudC5tZWFzdXJlcyA9IGtwaURlZmluaXRpb24uY2hhcnQubWVhc3VyZXMubWFwKG1lYXN1cmUgPT4ge1xuXHRcdFx0cmV0dXJuIHsgbGFiZWw6IG1lYXN1cmUubGFiZWwsIHZhbHVlOiBcIntcIiArIG1lYXN1cmUubmFtZSArIFwifVwiIH07XG5cdFx0fSk7XG5cdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQuZmVlZHMgPSBnZXRDaGFydEZlZWRzKGtwaURlZmluaXRpb24uY2hhcnQpO1xuXG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCwge1xuXHRcdFx0bWFuaWZlc3Q6IG9DYXJkTWFuaWZlc3Rcblx0XHR9KTtcblx0fVxuXG5cdHByb3RlY3RlZCBpbml0TmF2aWdhdGlvbkluZm8oa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwgb0tQSU1vZGVsOiBKU09OTW9kZWw8YW55Piwgb1NoZWxsU2VydmljZTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gQWRkIG5hdmlnYXRpb25cblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5uYXZpZ2F0aW9uKSB7XG5cdFx0XHRyZXR1cm4gZ2V0TmF2aWdhdGlvblBhcmFtZXRlcnMoa3BpRGVmaW5pdGlvbi5uYXZpZ2F0aW9uLCBvU2hlbGxTZXJ2aWNlKS50aGVuKG9OYXZJbmZvID0+IHtcblx0XHRcdFx0aWYgKG9OYXZJbmZvKSB7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2hlYWRlci9hY3Rpb25zXCIsIFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJOYXZpZ2F0aW9uXCIsXG5cdFx0XHRcdFx0XHRcdHBhcmFtZXRlcnM6IG9OYXZJbmZvXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0QE92ZXJyaWRlKClcblx0cHVibGljIG9uSW5pdCgpOiB2b2lkIHtcblx0XHR0aGlzLmFLUElEZWZpbml0aW9ucyA9IHRoaXMuZ2V0S1BJRGF0YSgpO1xuXG5cdFx0aWYgKHRoaXMuYUtQSURlZmluaXRpb25zICYmIHRoaXMuYUtQSURlZmluaXRpb25zLmxlbmd0aCkge1xuXHRcdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSAob1ZpZXcuZ2V0Q29udHJvbGxlcigpIGFzIEJhc2VDb250cm9sbGVyKS5nZXRBcHBDb21wb25lbnQoKSBhcyBhbnk7XG5cblx0XHRcdC8vIENyZWF0ZSBhIEpTT04gbW9kZWwgdG8gc3RvcmUgS1BJIGRhdGFcblx0XHRcdGNvbnN0IG9LUElNb2RlbCA9IG5ldyBKU09OTW9kZWwoKTtcblx0XHRcdG9WaWV3LnNldE1vZGVsKG9LUElNb2RlbCwgXCJrcGlNb2RlbFwiKTtcblxuXHRcdFx0dGhpcy5hS1BJRGVmaW5pdGlvbnMuZm9yRWFjaChrcGlEZWZpbml0aW9uID0+IHtcblx0XHRcdFx0Ly8gQ3JlYXRlIHRoZSBtYW5pZmVzdCBmb3IgdGhlIEtQSSBjYXJkIGFuZCBzdG9yZSBpdCBpbiB0aGUgS1BJIG1vZGVsXG5cdFx0XHRcdHRoaXMuaW5pdENhcmRNYW5pZmVzdChrcGlEZWZpbml0aW9uLCBvS1BJTW9kZWwpO1xuXG5cdFx0XHRcdC8vIFNldCB0aGUgbmF2aWdhdGlvbiBpbmZvcm1hdGlvbiBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0dGhpcy5pbml0TmF2aWdhdGlvbkluZm8oa3BpRGVmaW5pdGlvbiwgb0tQSU1vZGVsLCBvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKSkuY2F0Y2goZnVuY3Rpb24oZXJyOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gTG9hZCB0YWcgZGF0YSBmb3IgdGhlIEtQSVxuXHRcdFx0XHR0aGlzLmxvYWRLUElUYWdEYXRhKGtwaURlZmluaXRpb24sIG9BcHBDb21wb25lbnQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsLCBvS1BJTW9kZWwpLmNhdGNoKGZ1bmN0aW9uKGVycjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGVycik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0QE92ZXJyaWRlKClcblx0cHVibGljIG9uRXhpdCgpOiB2b2lkIHtcblx0XHRjb25zdCBvS1BJTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImtwaU1vZGVsXCIpIGFzIEpTT05Nb2RlbDxhbnk+O1xuXG5cdFx0aWYgKG9LUElNb2RlbCkge1xuXHRcdFx0b0tQSU1vZGVsLmRlc3Ryb3koKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldEtQSURhdGEoKTogS1BJRGVmaW5pdGlvbltdIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0c0N1c3RvbURhdGEgPSBvVmlldy5nZXRDb250ZW50KClbMF0uZGF0YShcIktQSURhdGFcIik7XG5cblx0XHRpZiAoc0N1c3RvbURhdGEpIHtcblx0XHRcdGNvbnN0IHZEYXRhID0gdHlwZW9mIHNDdXN0b21EYXRhID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShzQ3VzdG9tRGF0YSkgOiBzQ3VzdG9tRGF0YTtcblx0XHRcdGlmIChcImN1c3RvbURhdGFcIiBpbiB2RGF0YSkge1xuXHRcdFx0XHRyZXR1cm4gdkRhdGFbXCJjdXN0b21EYXRhXCJdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHZEYXRhO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlRGF0YXBvaW50VmFsdWVBbmRDdXJyZW5jeShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBrcGlDb250ZXh0OiBDb250ZXh0LCBvS1BJTW9kZWw6IEpTT05Nb2RlbDxhbnk+KSB7XG5cdFx0Y29uc3QgY3VycmVudExvY2FsZSA9IG5ldyBMb2NhbGUoXG5cdFx0XHRzYXAudWlcblx0XHRcdFx0LmdldENvcmUoKVxuXHRcdFx0XHQuZ2V0Q29uZmlndXJhdGlvbigpXG5cdFx0XHRcdC5nZXRMYW5ndWFnZSgpXG5cdFx0KTtcblx0XHRjb25zdCByYXdVbml0ID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8uaXNQYXRoXG5cdFx0XHQ/IGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdC52YWx1ZSlcblx0XHRcdDoga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8udmFsdWU7XG5cblx0XHRjb25zdCBpc1BlcmNlbnRhZ2UgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py5pc0N1cnJlbmN5ID09PSBmYWxzZSAmJiByYXdVbml0ID09PSBcIiVcIjtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIE1haW4gS1BJIHZhbHVlXG5cdFx0Y29uc3QgcmF3VmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdChrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aCkpO1xuXG5cdFx0Ly8gVmFsdWUgZm9ybWF0dGVkIHdpdGggYSBzY2FsZVxuXHRcdGNvbnN0IGtwaVZhbHVlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHR7XG5cdFx0XHRcdHN0eWxlOiBpc1BlcmNlbnRhZ2UgPyB1bmRlZmluZWQgOiBcInNob3J0XCIsXG5cdFx0XHRcdG1pbkZyYWN0aW9uRGlnaXRzOiAwLFxuXHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMSxcblx0XHRcdFx0c2hvd1NjYWxlOiAhaXNQZXJjZW50YWdlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHJhd1ZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVwiLCBrcGlWYWx1ZSk7XG5cblx0XHQvLyBWYWx1ZSB3aXRob3V0IGEgc2NhbGVcblx0XHRjb25zdCBrcGlWYWx1ZVVuc2NhbGVkID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHR7XG5cdFx0XHRcdG1heEZyYWN0aW9uRGlnaXRzOiAyLFxuXHRcdFx0XHRzaG93U2NhbGU6IGZhbHNlLFxuXHRcdFx0XHRncm91cGluZ0VuYWJsZWQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0KS5mb3JtYXQocmF3VmFsdWUpO1xuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlVW5zY2FsZWRcIiwga3BpVmFsdWVVbnNjYWxlZCk7XG5cblx0XHQvLyBWYWx1ZSBmb3JtYXR0ZWQgd2l0aCB0aGUgc2NhbGUgb21pdHRlZFxuXHRcdGNvbnN0IGtwaVZhbHVlTm9TY2FsZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRzdHlsZTogaXNQZXJjZW50YWdlID8gdW5kZWZpbmVkIDogXCJzaG9ydFwiLFxuXHRcdFx0XHRtaW5GcmFjdGlvbkRpZ2l0czogMCxcblx0XHRcdFx0bWF4RnJhY3Rpb25EaWdpdHM6IDEsXG5cdFx0XHRcdHNob3dTY2FsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0KS5mb3JtYXQocmF3VmFsdWUpO1xuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlTm9TY2FsZVwiLCBrcGlWYWx1ZU5vU2NhbGUpO1xuXG5cdFx0Ly8gU2NhbGUgb2YgdGhlIHZhbHVlXG5cdFx0Y29uc3Qga3BpVmFsdWVTY2FsZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRzdHlsZTogaXNQZXJjZW50YWdlID8gdW5kZWZpbmVkIDogXCJzaG9ydFwiLFxuXHRcdFx0XHRkZWNpbWFsczogMCxcblx0XHRcdFx0bWF4SW50ZWdlckRpZ2l0czogMCxcblx0XHRcdFx0c2hvd1NjYWxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHJhd1ZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVNjYWxlXCIsIGtwaVZhbHVlU2NhbGUpO1xuXG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gVW5pdCBvciBjdXJyZW5jeVxuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0ICYmIHJhd1VuaXQpIHtcblx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0LmlzQ3VycmVuY3kpIHtcblx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVW5pdFwiLCByYXdVbml0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgdW5pdCBvZiBtZWFzdXJlLCB3ZSBoYXZlIHRvIGZvcm1hdCBpdCBwcm9wZXJseVxuXHRcdFx0XHRjb25zdCBrcGlVbml0ID0gTnVtYmVyRm9ybWF0LmdldFVuaXRJbnN0YW5jZSh7IHNob3dOdW1iZXI6IGZhbHNlIH0sIGN1cnJlbnRMb2NhbGUpLmZvcm1hdChyYXdWYWx1ZSwgcmF3VW5pdCk7XG5cdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblVuaXRcIiwga3BpVW5pdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVEYXRhcG9pbnRDcml0aWNhbGl0eShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBrcGlDb250ZXh0OiBDb250ZXh0LCBvS1BJTW9kZWw6IEpTT05Nb2RlbDxhbnk+KSB7XG5cdFx0Y29uc3QgcmF3VmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdChrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aCkpO1xuXG5cdFx0bGV0IGNyaXRpY2FsaXR5VmFsdWUgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVZhbHVlKSB7XG5cdFx0XHQvLyBDcml0aWNhbGl0eSBpcyBhIGZpeGVkIHZhbHVlXG5cdFx0XHRjcml0aWNhbGl0eVZhbHVlID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlWYWx1ZTtcblx0XHR9IGVsc2UgaWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aCkge1xuXHRcdFx0Ly8gQ3JpdGljYWxpdHkgY29tZXMgZnJvbSBhbm90aGVyIHByb3BlcnR5ICh2aWEgYSBwYXRoKVxuXHRcdFx0Y3JpdGljYWxpdHlWYWx1ZSA9XG5cdFx0XHRcdE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5W2twaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlQYXRoKV0gfHwgTWVzc2FnZVR5cGUuTm9uZTtcblx0XHR9IGVsc2UgaWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzICYmIGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlKSB7XG5cdFx0XHQvLyBDcml0aWNhbGl0eSBjYWxjdWxhdGlvblxuXHRcdFx0c3dpdGNoIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uTW9kZSkge1xuXHRcdFx0XHRjYXNlIFwiVUkuSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlL1RhcmdldFwiOlxuXHRcdFx0XHRcdGNyaXRpY2FsaXR5VmFsdWUgPSBtZXNzYWdlVHlwZUZyb21UYXJnZXRDYWxjdWxhdGlvbihyYXdWYWx1ZSwga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvTWluaW1pemVcIjpcblx0XHRcdFx0XHRjcml0aWNhbGl0eVZhbHVlID0gbWVzc2FnZVR5cGVGcm9tTWluaW1pemVDYWxjdWxhdGlvbihcblx0XHRcdFx0XHRcdHJhd1ZhbHVlLFxuXHRcdFx0XHRcdFx0a3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvTWF4aW1pemVcIjpcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRjcml0aWNhbGl0eVZhbHVlID0gbWVzc2FnZVR5cGVGcm9tTWF4aW1pemVDYWxjdWxhdGlvbihcblx0XHRcdFx0XHRcdHJhd1ZhbHVlLFxuXHRcdFx0XHRcdFx0a3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpbkNyaXRpY2FsaXR5XCIsIGNyaXRpY2FsaXR5VmFsdWUpO1xuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcblx0XHRcdFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluU3RhdGVcIixcblx0XHRcdFZhbHVlQ29sb3JGcm9tTWVzc2FnZVR5cGVbY3JpdGljYWxpdHlWYWx1ZV0gfHwgXCJOb25lXCJcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVEYXRhcG9pbnRUcmVuZChrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBrcGlDb250ZXh0OiBDb250ZXh0LCBvS1BJTW9kZWw6IEpTT05Nb2RlbDxhbnk+KSB7XG5cdFx0Y29uc3QgcmF3VmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdChrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aCkpO1xuXG5cdFx0bGV0IHRyZW5kVmFsdWUgPSBcIk5vbmVcIjtcblxuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFZhbHVlKSB7XG5cdFx0XHQvLyBUcmVuZCBpcyBhIGZpeGVkIHZhbHVlXG5cdFx0XHR0cmVuZFZhbHVlID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRWYWx1ZTtcblx0XHR9IGVsc2UgaWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kUGF0aCkge1xuXHRcdFx0Ly8gVHJlbmQgY29tZXMgZnJvbSBhbm90aGVyIHByb3BlcnR5IHZpYSBhIHBhdGhcblx0XHRcdHRyZW5kVmFsdWUgPSBkZXZpYXRpb25JbmRpY2F0b3JGcm9tVHJlbmRUeXBlKGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRQYXRoKSk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlUGF0aFxuXHRcdCkge1xuXHRcdFx0Ly8gQ2FsY3VsYXRlZCB0cmVuZFxuXHRcdFx0bGV0IHRyZW5kUmVmZXJlbmNlVmFsdWU6IG51bWJlcjtcblx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0cmVuZFJlZmVyZW5jZVZhbHVlID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHJlbmRSZWZlcmVuY2VWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KFxuXHRcdFx0XHRcdGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGggfHwgXCJcIilcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdHRyZW5kVmFsdWUgPSBkZXZpYXRpb25JbmRpY2F0b3JGcm9tQ2FsY3VsYXRpb24oXG5cdFx0XHRcdHJhd1ZhbHVlLFxuXHRcdFx0XHR0cmVuZFJlZmVyZW5jZVZhbHVlLFxuXHRcdFx0XHQhIWtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlLFxuXHRcdFx0XHRrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uVHJlc2hvbGRzXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vdHJlbmRcIiwgdHJlbmRWYWx1ZSk7XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZVRhcmdldFZhbHVlKGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIGtwaUNvbnRleHQ6IENvbnRleHQsIG9LUElNb2RlbDogSlNPTk1vZGVsPGFueT4pIHtcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0VmFsdWUgPT09IHVuZGVmaW5lZCAmJiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRQYXRoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjsgLy8gTm8gdGFyZ2V0IHNldCBmb3IgdGhlIEtQSVxuXHRcdH1cblx0XHRjb25zdCByYXdWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoKSk7XG5cdFx0Y29uc3QgY3VycmVudExvY2FsZSA9IG5ldyBMb2NhbGUoXG5cdFx0XHRzYXAudWlcblx0XHRcdFx0LmdldENvcmUoKVxuXHRcdFx0XHQuZ2V0Q29uZmlndXJhdGlvbigpXG5cdFx0XHRcdC5nZXRMYW5ndWFnZSgpXG5cdFx0KTtcblxuXHRcdGxldCB0YXJnZXRSYXdWYWx1ZTogbnVtYmVyO1xuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0YXJnZXRSYXdWYWx1ZSA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFZhbHVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0YXJnZXRSYXdWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0UGF0aCB8fCBcIlwiKSk7XG5cdFx0fVxuXHRcdGNvbnN0IGRldmlhdGlvblJhd1ZhbHVlID0gdGFyZ2V0UmF3VmFsdWUgIT09IDAgPyAoKHJhd1ZhbHVlIC0gdGFyZ2V0UmF3VmFsdWUpIC8gdGFyZ2V0UmF3VmFsdWUpICogMTAwIDogdW5kZWZpbmVkO1xuXG5cdFx0Ly8gRm9ybWF0dGluZ1xuXHRcdGNvbnN0IHRhcmdldFZhbHVlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHR7XG5cdFx0XHRcdHN0eWxlOiBcInNob3J0XCIsXG5cdFx0XHRcdG1pbkZyYWN0aW9uRGlnaXRzOiAwLFxuXHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMSxcblx0XHRcdFx0c2hvd1NjYWxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHQpLmZvcm1hdCh0YXJnZXRSYXdWYWx1ZSk7XG5cdFx0Y29uc3QgdGFyZ2V0U2NhbGUgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdHtcblx0XHRcdFx0c3R5bGU6IFwic2hvcnRcIixcblx0XHRcdFx0ZGVjaW1hbHM6IDAsXG5cdFx0XHRcdG1heEludGVnZXJEaWdpdHM6IDAsXG5cdFx0XHRcdHNob3dTY2FsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHQpLmZvcm1hdCh0YXJnZXRSYXdWYWx1ZSk7XG5cblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL3RhcmdldE51bWJlclwiLCB0YXJnZXRWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90YXJnZXRVbml0XCIsIHRhcmdldFNjYWxlKTtcblxuXHRcdGlmIChkZXZpYXRpb25SYXdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBkZXZpYXRpb25WYWx1ZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bWluRnJhY3Rpb25EaWdpdHM6IDAsXG5cdFx0XHRcdFx0bWF4RnJhY3Rpb25EaWdpdHM6IDEsXG5cdFx0XHRcdFx0c2hvd1NjYWxlOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0XHQpLmZvcm1hdChkZXZpYXRpb25SYXdWYWx1ZSk7XG5cdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL2RldmlhdGlvbk51bWJlclwiLCBkZXZpYXRpb25WYWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vZGV2aWF0aW9uTnVtYmVyXCIsIFwiTi9BXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkcyB0YWcgZGF0YSBmb3IgYSBLUEksIGFuZCBzdG9yZXMgaXQgaW4gdGhlIEpTT04gS1BJIG1vZGVsLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0tQSURlZmluaXRpb259IGtwaURlZmluaXRpb24gVGhlIGRlZmluaXRpb24gb2YgdGhlIEtQSS5cblx0ICogQHBhcmFtIHtPRGF0YU1vZGVsfSBvTWFpbk1vZGVsIFRoZSBtb2RlbCB1c2VkIHRvIGxvYWQgdGhlIGRhdGEuXG5cdCAqIEBwYXJhbSB7SlNPTk1vZGVsfSBvS1BJTW9kZWwgVGhlIEpTT04gbW9kZWwgd2hlcmUgdGhlIGRhdGEgd2lsbCBiZSBzdG9yZWRcblx0ICogQHBhcmFtIGxvYWRGdWxsIElmIG5vdCB0cnVlLCBsb2FkcyBvbmx5IGRhdGEgZm9yIHRoZSBLUEkgdGFnXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXR1cm5zIHRoZSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBkYXRhIGlzIGxvYWRlZC5cblx0ICovXG5cdHByb3RlY3RlZCBsb2FkS1BJVGFnRGF0YShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBvTWFpbk1vZGVsOiBPRGF0YU1vZGVsLCBvS1BJTW9kZWw6IEpTT05Nb2RlbDxhbnk+LCBsb2FkRnVsbD86IGJvb2xlYW4pOiBhbnkge1xuXHRcdC8vIElmIGxvYWRGdWxsPWZhbHNlLCB0aGVuIHdlJ3JlIGp1c3QgbG9hZGluZyBkYXRhIGZvciB0aGUgdGFnIGFuZCB3ZSB1c2UgdGhlIFwiJGF1dG8uTG9uZ1J1bm5lcnNcIiBncm91cElEXG5cdFx0Ly8gSWYgbG9hZEZ1bGw9dHJ1ZSwgd2UncmUgbG9hZGluZyBkYXRhIGZvciB0aGUgd2hvbGUgS1BJICh0YWcgKyBjYXJkKSBhbmQgd2UgdXNlIHRoZSBkZWZhdWx0IChcIiRhdXRvXCIpIGdyb3VwSURcblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBsb2FkRnVsbFxuXHRcdFx0PyBvTWFpbk1vZGVsLmJpbmRMaXN0KFwiL1wiICsga3BpRGVmaW5pdGlvbi5lbnRpdHlTZXQpXG5cdFx0XHQ6IG9NYWluTW9kZWwuYmluZExpc3QoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmVudGl0eVNldCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgeyAkJGdyb3VwSWQ6IFwiJGF1dG8uTG9uZ1J1bm5lcnNcIiB9KTtcblx0XHRjb25zdCBvQWdncmVnYXRlOiBSZWNvcmQ8c3RyaW5nLCB7IHVuaXQ/OiBzdHJpbmcgfT4gPSB7fTtcblxuXHRcdC8vIE1haW4gdmFsdWUgKyBjdXJyZW5jeS91bml0XG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LmlzUGF0aCkge1xuXHRcdFx0b0FnZ3JlZ2F0ZVtrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGhdID0geyB1bml0OiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0LnZhbHVlIH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoXSA9IHt9O1xuXHRcdH1cblxuXHRcdC8vIFByb3BlcnR5IGZvciBjcml0aWNhbGl0eVxuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGgpIHtcblx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlQYXRoXSA9IHt9O1xuXHRcdH1cblxuXHRcdC8vIFByb3BlcnRpZXMgZm9yIHRyZW5kIGFuZCB0cmVuZCBjYWxjdWxhdGlvblxuXHRcdGlmIChsb2FkRnVsbCkge1xuXHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kUGF0aCkge1xuXHRcdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kUGF0aF0gPSB7fTtcblx0XHRcdH1cblx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlUGF0aCkge1xuXHRcdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoXSA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFBhdGgpIHtcblx0XHRcdFx0b0FnZ3JlZ2F0ZVtrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRQYXRoXSA9IHt9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdG9MaXN0QmluZGluZy5zZXRBZ2dyZWdhdGlvbih7IGFnZ3JlZ2F0ZTogb0FnZ3JlZ2F0ZSB9KTtcblxuXHRcdC8vIE1hbmFnZSBTZWxlY3Rpb25WYXJpYW50IGZpbHRlcnNcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5zZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYUZpbHRlcnMgPSBrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucy5tYXAoY3JlYXRlRmlsdGVyRnJvbURlZmluaXRpb24pLmZpbHRlcihmaWx0ZXIgPT4ge1xuXHRcdFx0XHRyZXR1cm4gZmlsdGVyICE9PSB1bmRlZmluZWQ7XG5cdFx0XHR9KSBhcyBGaWx0ZXJbXTtcblx0XHRcdG9MaXN0QmluZGluZy5maWx0ZXIoYUZpbHRlcnMpO1xuXHRcdH1cblxuXHRcdHJldHVybiBvTGlzdEJpbmRpbmcucmVxdWVzdENvbnRleHRzKDAsIDEpLnRoZW4oKGFDb250ZXh0czogQ29udGV4dFtdKSA9PiB7XG5cdFx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCByYXdVbml0ID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8uaXNQYXRoXG5cdFx0XHRcdFx0PyBhQ29udGV4dHNbMF0uZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdC52YWx1ZSlcblx0XHRcdFx0XHQ6IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LnZhbHVlO1xuXG5cdFx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0ICYmICFyYXdVbml0KSB7XG5cdFx0XHRcdFx0Ly8gQSB1bml0L2N1cnJlbmN5IGlzIGRlZmluZWQsIGJ1dCBpdHMgdmFsdWUgaXMgdW5kZWZpbmVkIC0tPiBtdWx0aS11bml0IHNpdHVhdGlvblxuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlXCIsIFwiKlwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVVuc2NhbGVkXCIsIFwiKlwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZU5vU2NhbGVcIiwgXCIqXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlU2NhbGVcIiwgXCJcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVW5pdFwiLCB1bmRlZmluZWQpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpbkNyaXRpY2FsaXR5XCIsIE1lc3NhZ2VUeXBlLk5vbmUpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblN0YXRlXCIsIFwiTm9uZVwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL3RyZW5kXCIsIFwiTm9uZVwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL3RhcmdldE51bWJlclwiLCB1bmRlZmluZWQpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vdGFyZ2V0VW5pdFwiLCB1bmRlZmluZWQpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vZGV2aWF0aW9uTnVtYmVyXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGVEYXRhcG9pbnRWYWx1ZUFuZEN1cnJlbmN5KGtwaURlZmluaXRpb24sIGFDb250ZXh0c1swXSwgb0tQSU1vZGVsKTtcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZURhdGFwb2ludENyaXRpY2FsaXR5KGtwaURlZmluaXRpb24sIGFDb250ZXh0c1swXSwgb0tQSU1vZGVsKTtcblxuXHRcdFx0XHRcdGlmIChsb2FkRnVsbCkge1xuXHRcdFx0XHRcdFx0dGhpcy51cGRhdGVEYXRhcG9pbnRUcmVuZChrcGlEZWZpbml0aW9uLCBhQ29udGV4dHNbMF0sIG9LUElNb2RlbCk7XG5cdFx0XHRcdFx0XHR0aGlzLnVwZGF0ZVRhcmdldFZhbHVlKGtwaURlZmluaXRpb24sIGFDb250ZXh0c1swXSwgb0tQSU1vZGVsKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkcyBjYXJkIGRhdGEgZm9yIGEgS1BJLCBhbmQgc3RvcmVzIGl0IGluIHRoZSBKU09OIEtQSSBtb2RlbC5cblx0ICpcblx0ICogQHBhcmFtIHtLUElEZWZpbml0aW9ufSBrcGlEZWZpbml0aW9uIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBLUEkuXG5cdCAqIEBwYXJhbSB7T0RhdGFNb2RlbH0gb01haW5Nb2RlbCBUaGUgbW9kZWwgdXNlZCB0byBsb2FkIHRoZSBkYXRhLlxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gb0tQSU1vZGVsIFRoZSBKU09OIG1vZGVsIHdoZXJlIHRoZSBkYXRhIHdpbGwgYmUgc3RvcmVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXR1cm5zIHRoZSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBkYXRhIGlzIGxvYWRlZC5cblx0ICovXG5cdHByb3RlY3RlZCBsb2FkS1BJQ2FyZERhdGEoa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwgb01haW5Nb2RlbDogT0RhdGFNb2RlbCwgb0tQSU1vZGVsOiBKU09OTW9kZWw8YW55Pik6IGFueSB7XG5cdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb01haW5Nb2RlbC5iaW5kTGlzdChcIi9cIiArIGtwaURlZmluaXRpb24uZW50aXR5U2V0KTtcblx0XHRjb25zdCBvR3JvdXA6IFJlY29yZDxzdHJpbmcsIE9iamVjdD4gPSB7fTtcblx0XHRjb25zdCBvQWdncmVnYXRlOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3Q+ID0ge307XG5cblx0XHRrcGlEZWZpbml0aW9uLmNoYXJ0LmRpbWVuc2lvbnMuZm9yRWFjaChkaW1lbnNpb24gPT4ge1xuXHRcdFx0b0dyb3VwW2RpbWVuc2lvbi5uYW1lXSA9IHt9O1xuXHRcdH0pO1xuXHRcdGtwaURlZmluaXRpb24uY2hhcnQubWVhc3VyZXMuZm9yRWFjaChtZWFzdXJlID0+IHtcblx0XHRcdG9BZ2dyZWdhdGVbbWVhc3VyZS5uYW1lXSA9IHt9O1xuXHRcdH0pO1xuXHRcdG9MaXN0QmluZGluZy5zZXRBZ2dyZWdhdGlvbih7XG5cdFx0XHRncm91cDogb0dyb3VwLFxuXHRcdFx0YWdncmVnYXRlOiBvQWdncmVnYXRlXG5cdFx0fSk7XG5cblx0XHQvLyBNYW5hZ2UgU2VsZWN0aW9uVmFyaWFudCBmaWx0ZXJzXG5cdFx0aWYgKGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zPy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFGaWx0ZXJzID0ga3BpRGVmaW5pdGlvbi5zZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnMubWFwKGNyZWF0ZUZpbHRlckZyb21EZWZpbml0aW9uKS5maWx0ZXIoZmlsdGVyID0+IHtcblx0XHRcdFx0cmV0dXJuIGZpbHRlciAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0fSkgYXMgRmlsdGVyW107XG5cdFx0XHRvTGlzdEJpbmRpbmcuZmlsdGVyKGFGaWx0ZXJzKTtcblx0XHR9XG5cblx0XHQvLyBTb3J0aW5nXG5cdFx0aWYgKGtwaURlZmluaXRpb24uY2hhcnQuc29ydE9yZGVyKSB7XG5cdFx0XHRvTGlzdEJpbmRpbmcuc29ydChcblx0XHRcdFx0a3BpRGVmaW5pdGlvbi5jaGFydC5zb3J0T3JkZXIubWFwKHNvcnRJbmZvID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFNvcnRlcihzb3J0SW5mby5uYW1lLCBzb3J0SW5mby5kZXNjZW5kaW5nKTtcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9MaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwga3BpRGVmaW5pdGlvbi5jaGFydC5tYXhJdGVtcykudGhlbigoYUNvbnRleHRzOiBDb250ZXh0W10pID0+IHtcblx0XHRcdGNvbnN0IGNoYXJ0RGF0YSA9IGFDb250ZXh0cy5tYXAoZnVuY3Rpb24ob0NvbnRleHQpIHtcblx0XHRcdFx0Y29uc3Qgb0RhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblx0XHRcdFx0a3BpRGVmaW5pdGlvbi5jaGFydC5kaW1lbnNpb25zLmZvckVhY2goZGltZW5zaW9uID0+IHtcblx0XHRcdFx0XHRvRGF0YVtkaW1lbnNpb24ubmFtZV0gPSBvQ29udGV4dC5nZXRQcm9wZXJ0eShkaW1lbnNpb24ubmFtZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRrcGlEZWZpbml0aW9uLmNoYXJ0Lm1lYXN1cmVzLmZvckVhY2gobWVhc3VyZSA9PiB7XG5cdFx0XHRcdFx0b0RhdGFbbWVhc3VyZS5uYW1lXSA9IG9Db250ZXh0LmdldFByb3BlcnR5KG1lYXN1cmUubmFtZSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJldHVybiBvRGF0YTtcblx0XHRcdH0pO1xuXG5cdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL2NoYXJ0RGF0YVwiLCBjaGFydERhdGEpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHBvcG92ZXIgdG8gZGlzcGxheSB0aGUgS1BJIGNhcmRcblx0ICogVGhlIHBvcG92ZXIgYW5kIHRoZSBjb250YWluZWQgY2FyZCBmb3IgdGhlIEtQSXMgYXJlIGNyZWF0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKiBUaGUgcG9wb3ZlciBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgS1BJcywgc28gaXQncyBjcmVhdGVkIG9ubHkgb25jZS5cblx0ICpcblx0ICogQHBhcmFtIG9LUElUYWcgVGhlIHRhZyB0aGF0IHRyaWdnZXJlZCB0aGUgcG9wb3ZlciBvcGVuaW5nLlxuXHQgKiBAcmV0dXJucyBUaGUgc2hhcmVkIHBvcG92ZXIgYXMgYSBwcm9taXNlLlxuXHQgKi9cblx0cHJvdGVjdGVkIGdldFBvcG92ZXIob0tQSVRhZzogR2VuZXJpY1RhZyk6IFByb21pc2U8UG9wb3Zlcj4ge1xuXHRcdGlmICghdGhpcy5vUG9wb3Zlcikge1xuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0c2FwLnVpXG5cdFx0XHRcdFx0LmdldENvcmUoKVxuXHRcdFx0XHRcdC5sb2FkTGlicmFyeShcInNhcC91aS9pbnRlZ3JhdGlvblwiLCB7IGFzeW5jOiB0cnVlIH0pXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0c2FwLnVpLnJlcXVpcmUoW1wic2FwL3VpL2ludGVncmF0aW9uL3dpZGdldHMvQ2FyZFwiLCBcInNhcC91aS9pbnRlZ3JhdGlvbi9Ib3N0XCJdLCAoQ2FyZDogYW55LCBIb3N0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0hvc3QgPSBuZXcgSG9zdCgpO1xuXG5cdFx0XHRcdFx0XHRcdG9Ib3N0LmF0dGFjaEFjdGlvbigob0V2ZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzVHlwZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJ0eXBlXCIpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9QYXJhbXMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicGFyYW1ldGVyc1wiKTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChzVHlwZSA9PT0gXCJOYXZpZ2F0aW9uXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUGFyYW1zLnNlbWFudGljT2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9QYXJhbXMuc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtcy5hY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlT3V0Ym91bmQob1BhcmFtcy5vdXRib3VuZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLm9DYXJkID0gbmV3IENhcmQoe1xuXHRcdFx0XHRcdFx0XHRcdHdpZHRoOiBcIjI1cmVtXCIsXG5cdFx0XHRcdFx0XHRcdFx0aGVpZ2h0OiBcImF1dG9cIlxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0dGhpcy5vQ2FyZC5zZXRIb3N0KG9Ib3N0IGFzIGFueSk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5vUG9wb3ZlciA9IG5ldyBQb3BvdmVyKHtcblx0XHRcdFx0XHRcdFx0XHRpZDogXCJrcGktUG9wb3ZlclwiLFxuXHRcdFx0XHRcdFx0XHRcdHNob3dIZWFkZXI6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHBsYWNlbWVudDogXCJBdXRvXCIsXG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudDogW3RoaXMub0NhcmRdXG5cdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdG9LUElUYWcuYWRkRGVwZW5kZW50KHRoaXMub1BvcG92ZXIpOyAvLyBUaGUgZmlyc3QgY2xpY2tlZCB0YWcgZ2V0cyB0aGUgcG9wb3ZlciBhcyBkZXBlbmRlbnRcblxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKHRoaXMub1BvcG92ZXIpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMub1BvcG92ZXIpO1xuXHRcdH1cblx0fVxuXG5cdEBQdWJsaWNcblx0cHVibGljIG9uS1BJUHJlc3NlZChvS1BJVGFnOiBhbnksIGtwaUlEOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBvS1BJTW9kZWwgPSBvS1BJVGFnLmdldE1vZGVsKFwia3BpTW9kZWxcIikgYXMgSlNPTk1vZGVsPGFueT47XG5cblx0XHRpZiAodGhpcy5hS1BJRGVmaW5pdGlvbnMgJiYgdGhpcy5hS1BJRGVmaW5pdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBrcGlEZWZpbml0aW9uID0gdGhpcy5hS1BJRGVmaW5pdGlvbnMuZmluZChmdW5jdGlvbihvRGVmKSB7XG5cdFx0XHRcdHJldHVybiBvRGVmLmlkID09PSBrcGlJRDtcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbikge1xuXHRcdFx0XHRjb25zdCBvTW9kZWwgPSBvS1BJVGFnLmdldE1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IGFQcm9taXNlcyA9IFtcblx0XHRcdFx0XHR0aGlzLmxvYWRLUElUYWdEYXRhKGtwaURlZmluaXRpb24sIG9Nb2RlbCwgb0tQSU1vZGVsLCB0cnVlKSxcblx0XHRcdFx0XHR0aGlzLmxvYWRLUElDYXJkRGF0YShrcGlEZWZpbml0aW9uLCBvTW9kZWwsIG9LUElNb2RlbCksXG5cdFx0XHRcdFx0dGhpcy5nZXRQb3BvdmVyKG9LUElUYWcpXG5cdFx0XHRcdF07XG5cblx0XHRcdFx0UHJvbWlzZS5hbGwoYVByb21pc2VzKVxuXHRcdFx0XHRcdC50aGVuKGFSZXN1bHRzID0+IHtcblx0XHRcdFx0XHRcdHRoaXMub0NhcmQuc2V0TWFuaWZlc3Qob0tQSU1vZGVsLmdldFByb3BlcnR5KFwiL1wiICsga3BpSUQgKyBcIi9tYW5pZmVzdFwiKSk7XG5cdFx0XHRcdFx0XHR0aGlzLm9DYXJkLnJlZnJlc2goKTtcblxuXHRcdFx0XHRcdFx0Y29uc3Qgb1BvcG92ZXIgPSBhUmVzdWx0c1syXTtcblx0XHRcdFx0XHRcdG9Qb3BvdmVyLm9wZW5CeShvS1BJVGFnLCBmYWxzZSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZXJyID0+IHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnIpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBLUElNYW5hZ2VtZW50Q29udHJvbGxlckV4dGVuc2lvbjtcbiJdfQ==