@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
@@ -16,303 +16,386 @@ sap.ui.define(["../../helpers/ID", "sap/fe/core/templating/PropertyHelper", "sap
16
16
  var isPathExpression = PropertyHelper.isPathExpression;
17
17
  var KPIID = ID.KPIID;
18
18
 
19
- /**
20
- * Gets a DeviationIndicator enum value from a TrendType enum value.
21
- *
22
- * @param {TrendType} trendEnum The trend enum value
23
- * @returns {DeviationIndicator} Returns the DeviationIndicator enum value
24
- */
25
- function getDeviationIndicatorFromTrendType(trendEnum) {
26
- var deviationIndicator;
27
-
28
- switch (trendEnum) {
29
- case "UI.TrendType/StrongUp":
30
- case "UI.TrendType/Up":
31
- deviationIndicator = "Up";
32
- break;
33
-
34
- case "UI.TrendType/StrongDown":
35
- case "UI.TrendType/Down":
36
- deviationIndicator = "Down";
37
- break;
38
-
39
- default:
40
- deviationIndicator = "None";
19
+ var DeviationIndicatorFromTrendType = {
20
+ "UI.TrendType/StrongUp": "Up",
21
+ "UI.TrendType/Up": "Up",
22
+ "UI.TrendType/StrongDown": "Down",
23
+ "UI.TrendType/Down": "Down",
24
+ "UI.TrendType/Sideways": "None"
25
+ };
26
+ var KPIChartTypeFromUI = {
27
+ "UI.ChartType/ColumnStacked": "StackedColumn",
28
+ "UI.ChartType/BarStacked": "StackedBar",
29
+ "UI.ChartType/Donut": "Donut",
30
+ "UI.ChartType/Line": "Line",
31
+ "UI.ChartType/Bubble": "bubble",
32
+ "UI.ChartType/Column": "column",
33
+ "UI.ChartType/Bar": "bar",
34
+ "UI.ChartType/VerticalBullet": "vertical_bullet",
35
+ "UI.ChartType/Combination": "combination",
36
+ "UI.ChartType/Scatter": "scatter"
37
+ };
38
+
39
+ function convertKPIChart(chartAnnotation, presentationVariantAnnotation) {
40
+ var _presentationVariantA, _presentationVariantA2;
41
+
42
+ if (chartAnnotation.Measures === undefined) {
43
+ // We need at least 1 measure (but no dimension is allowed, e.g. for bubble chart)
44
+ return undefined;
41
45
  }
42
46
 
43
- return deviationIndicator;
47
+ var charDimensions = chartAnnotation.Dimensions ? chartAnnotation.Dimensions.map(function (propertyPath) {
48
+ var _chartAnnotation$Dime, _propertyPath$$target, _propertyPath$$target2, _dimAttribute$Role;
49
+
50
+ var dimAttribute = (_chartAnnotation$Dime = chartAnnotation.DimensionAttributes) === null || _chartAnnotation$Dime === void 0 ? void 0 : _chartAnnotation$Dime.find(function (attribute) {
51
+ var _attribute$Dimension;
52
+
53
+ return ((_attribute$Dimension = attribute.Dimension) === null || _attribute$Dimension === void 0 ? void 0 : _attribute$Dimension.value) === propertyPath.value;
54
+ });
55
+ return {
56
+ name: propertyPath.value,
57
+ label: ((_propertyPath$$target = propertyPath.$target.annotations.Common) === null || _propertyPath$$target === void 0 ? void 0 : (_propertyPath$$target2 = _propertyPath$$target.Label) === null || _propertyPath$$target2 === void 0 ? void 0 : _propertyPath$$target2.toString()) || propertyPath.value,
58
+ role: dimAttribute === null || dimAttribute === void 0 ? void 0 : (_dimAttribute$Role = dimAttribute.Role) === null || _dimAttribute$Role === void 0 ? void 0 : _dimAttribute$Role.replace("UI.ChartDimensionRoleType/", "")
59
+ };
60
+ }) : [];
61
+ var chartMeasures = chartAnnotation.Measures.map(function (propertyPath) {
62
+ var _chartAnnotation$Meas, _propertyPath$$target3, _propertyPath$$target4, _measureAttribute$Rol;
63
+
64
+ var measureAttribute = (_chartAnnotation$Meas = chartAnnotation.MeasureAttributes) === null || _chartAnnotation$Meas === void 0 ? void 0 : _chartAnnotation$Meas.find(function (attribute) {
65
+ var _attribute$Measure;
66
+
67
+ return ((_attribute$Measure = attribute.Measure) === null || _attribute$Measure === void 0 ? void 0 : _attribute$Measure.value) === propertyPath.value;
68
+ });
69
+ return {
70
+ name: propertyPath.value,
71
+ label: ((_propertyPath$$target3 = propertyPath.$target.annotations.Common) === null || _propertyPath$$target3 === void 0 ? void 0 : (_propertyPath$$target4 = _propertyPath$$target3.Label) === null || _propertyPath$$target4 === void 0 ? void 0 : _propertyPath$$target4.toString()) || propertyPath.value,
72
+ role: measureAttribute === null || measureAttribute === void 0 ? void 0 : (_measureAttribute$Rol = measureAttribute.Role) === null || _measureAttribute$Rol === void 0 ? void 0 : _measureAttribute$Rol.replace("UI.ChartMeasureRoleType/", "")
73
+ };
74
+ });
75
+ return {
76
+ chartType: KPIChartTypeFromUI[chartAnnotation.ChartType] || "Line",
77
+ dimensions: charDimensions,
78
+ measures: chartMeasures,
79
+ sortOrder: presentationVariantAnnotation === null || presentationVariantAnnotation === void 0 ? void 0 : (_presentationVariantA = presentationVariantAnnotation.SortOrder) === null || _presentationVariantA === void 0 ? void 0 : _presentationVariantA.map(function (sortOrder) {
80
+ var _sortOrder$Property;
81
+
82
+ return {
83
+ name: ((_sortOrder$Property = sortOrder.Property) === null || _sortOrder$Property === void 0 ? void 0 : _sortOrder$Property.value) || "",
84
+ descending: !!sortOrder.Descending
85
+ };
86
+ }),
87
+ maxItems: presentationVariantAnnotation === null || presentationVariantAnnotation === void 0 ? void 0 : (_presentationVariantA2 = presentationVariantAnnotation.MaxItems) === null || _presentationVariantA2 === void 0 ? void 0 : _presentationVariantA2.valueOf()
88
+ };
44
89
  }
45
90
 
46
- function convertKPICardContent(datapointAnnotation, presentationVariantAnnotation) {
47
- var _presentationVariantA;
91
+ function updateCurrency(datapointAnnotation, kpiDef) {
92
+ var _targetValueProperty$, _targetValueProperty$3;
48
93
 
49
- // Find the chart visualization
50
- var chart = presentationVariantAnnotation === null || presentationVariantAnnotation === void 0 ? void 0 : (_presentationVariantA = presentationVariantAnnotation.Visualizations) === null || _presentationVariantA === void 0 ? void 0 : _presentationVariantA.find(function (viz) {
51
- return viz.$target.$Type === "com.sap.vocabularies.UI.v1.ChartDefinitionType";
52
- });
94
+ var targetValueProperty = datapointAnnotation.Value.$target;
53
95
 
54
- if (chart) {
55
- var chartAnnotation = chart.$target;
56
- var chartType;
96
+ if ((_targetValueProperty$ = targetValueProperty.annotations.Measures) !== null && _targetValueProperty$ !== void 0 && _targetValueProperty$.ISOCurrency) {
97
+ var _targetValueProperty$2;
57
98
 
58
- switch (chartAnnotation.ChartType) {
59
- case "UI.ChartType/ColumnStacked":
60
- chartType = "StackedColumn";
61
- break;
99
+ var currency = (_targetValueProperty$2 = targetValueProperty.annotations.Measures) === null || _targetValueProperty$2 === void 0 ? void 0 : _targetValueProperty$2.ISOCurrency;
100
+
101
+ if (isPathExpression(currency)) {
102
+ kpiDef.datapoint.unit = {
103
+ value: currency.$target.name,
104
+ isCurrency: true,
105
+ isPath: true
106
+ };
107
+ } else {
108
+ kpiDef.datapoint.unit = {
109
+ value: currency.toString(),
110
+ isCurrency: true,
111
+ isPath: false
112
+ };
113
+ }
114
+ } else if ((_targetValueProperty$3 = targetValueProperty.annotations.Measures) !== null && _targetValueProperty$3 !== void 0 && _targetValueProperty$3.Unit) {
115
+ var _targetValueProperty$4;
116
+
117
+ var unit = (_targetValueProperty$4 = targetValueProperty.annotations.Measures) === null || _targetValueProperty$4 === void 0 ? void 0 : _targetValueProperty$4.Unit;
118
+
119
+ if (isPathExpression(unit)) {
120
+ kpiDef.datapoint.unit = {
121
+ value: unit.$target.name,
122
+ isCurrency: false,
123
+ isPath: true
124
+ };
125
+ } else {
126
+ kpiDef.datapoint.unit = {
127
+ value: unit.toString(),
128
+ isCurrency: false,
129
+ isPath: false
130
+ };
131
+ }
132
+ }
133
+ }
62
134
 
63
- case "UI.ChartType/BarStacked":
64
- chartType = "StackedBar";
135
+ function updateCriticality(datapointAnnotation, aggregationHelper, kpiDef) {
136
+ if (datapointAnnotation.Criticality) {
137
+ if (typeof datapointAnnotation.Criticality === "object") {
138
+ // Criticality is a path --> check if the corresponding property is aggregatable
139
+ var criticalityProperty = datapointAnnotation.Criticality.$target;
140
+
141
+ if (aggregationHelper.isPropertyAggregatable(criticalityProperty)) {
142
+ kpiDef.datapoint.criticalityPath = datapointAnnotation.Criticality.path;
143
+ } else {
144
+ // The property isn't aggregatable --> we ignore it
145
+ kpiDef.datapoint.criticalityValue = MessageType.None;
146
+ }
147
+ } else {
148
+ // Criticality is an enum Value --> get the corresponding static value
149
+ kpiDef.datapoint.criticalityValue = getMessageTypeFromCriticalityType(datapointAnnotation.Criticality);
150
+ }
151
+ } else if (datapointAnnotation.CriticalityCalculation) {
152
+ kpiDef.datapoint.criticalityCalculationMode = datapointAnnotation.CriticalityCalculation.ImprovementDirection;
153
+ kpiDef.datapoint.criticalityCalculationThresholds = [];
154
+
155
+ switch (kpiDef.datapoint.criticalityCalculationMode) {
156
+ case "UI.ImprovementDirectionType/Target":
157
+ kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.DeviationRangeLowValue);
158
+ kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.ToleranceRangeLowValue);
159
+ kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.AcceptanceRangeLowValue);
160
+ kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.AcceptanceRangeHighValue);
161
+ kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.ToleranceRangeHighValue);
162
+ kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.DeviationRangeHighValue);
65
163
  break;
66
164
 
67
- case "UI.ChartType/Donut":
68
- chartType = "Donut";
165
+ case "UI.ImprovementDirectionType/Minimize":
166
+ kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.AcceptanceRangeHighValue);
167
+ kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.ToleranceRangeHighValue);
168
+ kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.DeviationRangeHighValue);
69
169
  break;
70
170
 
171
+ case "UI.ImprovementDirectionType/Maximize":
71
172
  default:
72
- chartType = "Line";
173
+ kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.DeviationRangeLowValue);
174
+ kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.ToleranceRangeLowValue);
175
+ kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.AcceptanceRangeLowValue);
73
176
  }
177
+ } else {
178
+ kpiDef.datapoint.criticalityValue = MessageType.None;
179
+ }
180
+ }
74
181
 
75
- if (!chartAnnotation.Dimensions || !chartAnnotation.Measures) {
76
- return undefined;
182
+ function updateTrend(datapointAnnotation, aggregationHelper, kpiDef) {
183
+ if (datapointAnnotation.Trend) {
184
+ if (typeof datapointAnnotation.Trend === "object") {
185
+ // Trend is a path --> check if the corresponding property is aggregatable
186
+ var trendProperty = datapointAnnotation.Trend.$target;
187
+
188
+ if (aggregationHelper.isPropertyAggregatable(trendProperty)) {
189
+ kpiDef.datapoint.trendPath = datapointAnnotation.Trend.path;
190
+ } else {
191
+ // The property isn't aggregatable --> we ignore it
192
+ kpiDef.datapoint.trendValue = "None";
193
+ }
77
194
  } else {
78
- return {
79
- dimensions: chartAnnotation.Dimensions.map(function (propertyPath) {
80
- return propertyPath.value;
81
- }),
82
- measures: chartAnnotation.Measures.map(function (propertyPath) {
83
- return propertyPath.value;
84
- }),
85
- cardContentManifest: {
86
- chartType: chartType,
87
- dimensions: chartAnnotation.Dimensions.map(function (propertyPath) {
88
- var _propertyPath$$target, _propertyPath$$target2;
89
-
90
- return {
91
- label: ((_propertyPath$$target = propertyPath.$target.annotations.Common) === null || _propertyPath$$target === void 0 ? void 0 : (_propertyPath$$target2 = _propertyPath$$target.Label) === null || _propertyPath$$target2 === void 0 ? void 0 : _propertyPath$$target2.toString()) || propertyPath.value,
92
- value: "{" + propertyPath.value + "}"
93
- };
94
- }),
95
- measures: chartAnnotation.Measures.map(function (propertyPath) {
96
- var _propertyPath$$target3, _propertyPath$$target4;
97
-
98
- return {
99
- label: ((_propertyPath$$target3 = propertyPath.$target.annotations.Common) === null || _propertyPath$$target3 === void 0 ? void 0 : (_propertyPath$$target4 = _propertyPath$$target3.Label) === null || _propertyPath$$target4 === void 0 ? void 0 : _propertyPath$$target4.toString()) || propertyPath.value,
100
- value: "{" + propertyPath.value + "}"
101
- };
102
- })
103
- }
104
- };
195
+ // Trend is an enum Value --> get the corresponding static value
196
+ kpiDef.datapoint.trendValue = DeviationIndicatorFromTrendType[datapointAnnotation.Trend] || "None";
197
+ }
198
+ } else if (datapointAnnotation.TrendCalculation) {
199
+ kpiDef.datapoint.trendCalculationIsRelative = datapointAnnotation.TrendCalculation.IsRelativeDifference ? true : false;
200
+
201
+ if (datapointAnnotation.TrendCalculation.ReferenceValue.$target) {
202
+ // Reference value is a path --> check if the corresponding property is aggregatable
203
+ var referenceProperty = datapointAnnotation.TrendCalculation.ReferenceValue.$target;
204
+
205
+ if (aggregationHelper.isPropertyAggregatable(referenceProperty)) {
206
+ kpiDef.datapoint.trendCalculationReferencePath = datapointAnnotation.TrendCalculation.ReferenceValue.path;
207
+ } else {
208
+ // The property isn't aggregatable --> we ignore it and switch back to trend 'None'
209
+ kpiDef.datapoint.trendValue = "None";
210
+ }
211
+ } else {
212
+ // Reference value is a static value
213
+ kpiDef.datapoint.trendCalculationReferenceValue = datapointAnnotation.TrendCalculation.ReferenceValue;
214
+ }
215
+
216
+ if (kpiDef.datapoint.trendCalculationReferencePath !== undefined || kpiDef.datapoint.trendCalculationReferenceValue !== undefined) {
217
+ kpiDef.datapoint.trendCalculationTresholds = [datapointAnnotation.TrendCalculation.StrongDownDifference.valueOf(), datapointAnnotation.TrendCalculation.DownDifference.valueOf(), datapointAnnotation.TrendCalculation.UpDifference.valueOf(), datapointAnnotation.TrendCalculation.StrongUpDifference.valueOf()];
105
218
  }
106
219
  } else {
107
- return undefined;
220
+ kpiDef.datapoint.trendValue = "None";
108
221
  }
109
222
  }
110
223
 
111
- function createKPIDefinition(kpiName, kpiConfig, converterContext) {
112
- var _targetKPI$Detail;
224
+ function updateTarget(datapointAnnotation, aggregationHelper, kpiDef) {
225
+ if (datapointAnnotation.TargetValue) {
226
+ if (datapointAnnotation.TargetValue.$target) {
227
+ // Target value is a path --> check if the corresponding property is aggregatable (otherwise ignore)
228
+ var targetProperty = datapointAnnotation.TargetValue.$target;
113
229
 
114
- var kpiConverterContext = converterContext.getConverterContextFor("/" + kpiConfig.entitySet);
115
- var aKPIAnnotations = kpiConverterContext.getAnnotationsByTerm("UI", "com.sap.vocabularies.UI.v1.KPI");
116
- var targetKPI = aKPIAnnotations.find(function (kpi) {
117
- return kpi.qualifier === kpiConfig.qualifier;
118
- });
119
- var aggregationHelper = new AggregationHelper(kpiConverterContext.getEntityType(), kpiConverterContext);
230
+ if (aggregationHelper.isPropertyAggregatable(targetProperty)) {
231
+ kpiDef.datapoint.targetPath = datapointAnnotation.TargetValue.path;
232
+ }
233
+ } else {
234
+ // Target value is a static value
235
+ kpiDef.datapoint.targetValue = datapointAnnotation.TargetValue;
236
+ }
237
+ }
238
+ }
120
239
 
121
- if (targetKPI && (_targetKPI$Detail = targetKPI.Detail) !== null && _targetKPI$Detail !== void 0 && _targetKPI$Detail.DefaultPresentationVariant && aggregationHelper.isAnalyticsSupported()) {
122
- var _datapointAnnotation$, _datapointAnnotation$2, _targetValueProperty$, _targetValueProperty$3;
240
+ function getNavigationInfoFromProperty(property) {
241
+ var annotations = property.annotations["Common"] || {}; // Look for the semanticObject annotation (if any)
123
242
 
124
- var kpiID = KPIID(kpiName); // Datapoint
243
+ var semanticObjectAnnotation;
244
+ Object.keys(annotations).forEach(function (annotationKey) {
245
+ var annotation = annotations[annotationKey];
125
246
 
126
- var datapointAnnotation = targetKPI.DataPoint;
127
- var datapointProperty = datapointAnnotation.Value.$target;
247
+ if (annotation.term === "com.sap.vocabularies.Common.v1.SemanticObject") {
248
+ if (!annotation.qualifier || !semanticObjectAnnotation) {
249
+ // We always take the annotation without qualifier if there's one, otherwise we take the first one
250
+ semanticObjectAnnotation = annotation;
251
+ }
252
+ }
253
+ });
128
254
 
129
- if (!aggregationHelper.isPropertyAggregatable(datapointProperty)) {
130
- // The main property of the KPI is not aggregatable --> We can't calculate its value so we ignore the KPI
131
- converterContext.getDiagnostics().addIssue(IssueCategory.Annotation, IssueSeverity.Medium, IssueType.KPI_ISSUES.MAIN_PROPERTY_NOT_AGGREGATABLE + kpiConfig.qualifier);
132
- return undefined;
133
- } // Chart
255
+ if (semanticObjectAnnotation) {
256
+ var result = {
257
+ semanticObject: semanticObjectAnnotation.toString(),
258
+ unavailableActions: []
259
+ }; // Look for the unavailable actions (if any)
134
260
 
261
+ var annotationKey = Object.keys(annotations).find(function (key) {
262
+ var _semanticObjectAnnota;
135
263
 
136
- var cardDef = convertKPICardContent(datapointAnnotation, targetKPI.Detail.DefaultPresentationVariant);
264
+ return annotations[key].term === "com.sap.vocabularies.Common.v1.SemanticObjectUnavailableActions" && annotations[key].qualifier === ((_semanticObjectAnnota = semanticObjectAnnotation) === null || _semanticObjectAnnota === void 0 ? void 0 : _semanticObjectAnnota.qualifier);
265
+ });
137
266
 
138
- if (!cardDef) {
139
- // Can't find info for the chart
140
- converterContext.getDiagnostics().addIssue(IssueCategory.Annotation, IssueSeverity.Medium, IssueType.KPI_ISSUES.NO_CHART_VISUALIZATION + kpiConfig.qualifier);
141
- return undefined;
267
+ if (annotationKey) {
268
+ result.unavailableActions = annotations[annotationKey];
142
269
  }
143
270
 
144
- var kpiDef = {
145
- id: kpiID,
146
- entitySet: kpiConfig.entitySet,
147
- datapoint: {
148
- propertyPath: datapointAnnotation.Value.path,
149
- annotationPath: kpiConverterContext.getEntitySetBasedAnnotationPath(datapointAnnotation.fullyQualifiedName),
150
- title: (_datapointAnnotation$ = datapointAnnotation.Title) === null || _datapointAnnotation$ === void 0 ? void 0 : _datapointAnnotation$.toString(),
151
- description: (_datapointAnnotation$2 = datapointAnnotation.Description) === null || _datapointAnnotation$2 === void 0 ? void 0 : _datapointAnnotation$2.toString()
152
- },
153
- selectionVariantFilterDefinitions: targetKPI.SelectionVariant ? getFilterDefinitionsFromSelectionVariant(targetKPI.SelectionVariant) : undefined,
154
- card: cardDef
155
- }; // Unit or currency
156
-
157
- var targetValueProperty = datapointAnnotation.Value.$target;
158
-
159
- if ((_targetValueProperty$ = targetValueProperty.annotations.Measures) !== null && _targetValueProperty$ !== void 0 && _targetValueProperty$.ISOCurrency) {
160
- var _targetValueProperty$2;
161
-
162
- var currency = (_targetValueProperty$2 = targetValueProperty.annotations.Measures) === null || _targetValueProperty$2 === void 0 ? void 0 : _targetValueProperty$2.ISOCurrency;
163
-
164
- if (isPathExpression(currency)) {
165
- kpiDef.datapoint.unit = {
166
- value: currency.$target.name,
167
- isCurrency: true,
168
- isPath: true
169
- };
170
- } else {
171
- kpiDef.datapoint.unit = {
172
- value: currency.toString(),
173
- isCurrency: true,
174
- isPath: false
175
- };
176
- }
177
- } else if ((_targetValueProperty$3 = targetValueProperty.annotations.Measures) !== null && _targetValueProperty$3 !== void 0 && _targetValueProperty$3.Unit) {
178
- var _targetValueProperty$4;
271
+ return result;
272
+ } else {
273
+ return undefined;
274
+ }
275
+ }
179
276
 
180
- var unit = (_targetValueProperty$4 = targetValueProperty.annotations.Measures) === null || _targetValueProperty$4 === void 0 ? void 0 : _targetValueProperty$4.Unit;
277
+ function createKPIDefinition(kpiName, kpiConfig, converterContext) {
278
+ var _datapointAnnotation$, _datapointAnnotation$2;
181
279
 
182
- if (isPathExpression(unit)) {
183
- kpiDef.datapoint.unit = {
184
- value: unit.$target.name,
185
- isCurrency: false,
186
- isPath: true
187
- };
188
- } else {
189
- kpiDef.datapoint.unit = {
190
- value: unit.toString(),
191
- isCurrency: false,
192
- isPath: false
193
- };
194
- }
195
- } // Criticality
280
+ var kpiConverterContext = converterContext.getConverterContextFor("/" + kpiConfig.entitySet);
281
+ var aggregationHelper = new AggregationHelper(kpiConverterContext.getEntityType(), kpiConverterContext);
196
282
 
283
+ if (!aggregationHelper.isAnalyticsSupported()) {
284
+ // The entity doesn't support analytical queries
285
+ converterContext.getDiagnostics().addIssue(IssueCategory.Annotation, IssueSeverity.Medium, IssueType.KPI_ISSUES.NO_ANALYTICS + kpiConfig.entitySet);
286
+ return undefined;
287
+ }
197
288
 
198
- if (datapointAnnotation.Criticality) {
199
- if (typeof datapointAnnotation.Criticality === "object") {
200
- // Criticality is a path --> check if the corresponding property is aggregatable
201
- var criticalityProperty = datapointAnnotation.Criticality.$target;
289
+ var selectionVariantAnnotation;
290
+ var datapointAnnotation;
291
+ var presentationVariantAnnotation;
292
+ var chartAnnotation;
293
+ var navigationInfo; // Search for a KPI with the qualifier frmo the manifest
202
294
 
203
- if (aggregationHelper.isPropertyAggregatable(criticalityProperty)) {
204
- kpiDef.datapoint.criticalityPath = datapointAnnotation.Criticality.path;
205
- } else {
206
- // The property isn't aggregatable --> we ignore it
207
- kpiDef.datapoint.criticalityValue = MessageType.None;
208
- }
209
- } else {
210
- // Criticality is an enum Value --> get the corresponding static value
211
- kpiDef.datapoint.criticalityValue = getMessageTypeFromCriticalityType(datapointAnnotation.Criticality);
212
- }
213
- } else if (datapointAnnotation.CriticalityCalculation) {
214
- kpiDef.datapoint.criticalityCalculationMode = datapointAnnotation.CriticalityCalculation.ImprovementDirection;
215
- kpiDef.datapoint.criticalityCalculationThresholds = [];
216
-
217
- switch (kpiDef.datapoint.criticalityCalculationMode) {
218
- case "UI.ImprovementDirectionType/Target":
219
- kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.DeviationRangeLowValue);
220
- kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.ToleranceRangeLowValue);
221
- kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.AcceptanceRangeLowValue);
222
- kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.AcceptanceRangeHighValue);
223
- kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.ToleranceRangeHighValue);
224
- kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.DeviationRangeHighValue);
225
- break;
226
-
227
- case "UI.ImprovementDirectionType/Minimize":
228
- kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.AcceptanceRangeHighValue);
229
- kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.ToleranceRangeHighValue);
230
- kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.DeviationRangeHighValue);
231
- break;
232
-
233
- case "UI.ImprovementDirectionType/Maximize":
234
- default:
235
- kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.DeviationRangeLowValue);
236
- kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.ToleranceRangeLowValue);
237
- kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.AcceptanceRangeLowValue);
238
- }
239
- } else {
240
- kpiDef.datapoint.criticalityValue = MessageType.None;
241
- } // Trend
295
+ var aKPIAnnotations = kpiConverterContext.getAnnotationsByTerm("UI", "com.sap.vocabularies.UI.v1.KPI");
296
+ var targetKPI = aKPIAnnotations.find(function (kpi) {
297
+ return kpi.qualifier === kpiConfig.qualifier;
298
+ });
242
299
 
300
+ if (targetKPI) {
301
+ var _targetKPI$Detail, _presentationVariantA3, _presentationVariantA4, _presentationVariantA5, _targetKPI$Detail2;
243
302
 
244
- if (datapointAnnotation.Trend) {
245
- if (typeof datapointAnnotation.Trend === "object") {
246
- // Trend is a path --> check if the corresponding property is aggregatable
247
- var trendProperty = datapointAnnotation.Trend.$target;
303
+ datapointAnnotation = targetKPI.DataPoint;
304
+ selectionVariantAnnotation = targetKPI.SelectionVariant;
305
+ presentationVariantAnnotation = (_targetKPI$Detail = targetKPI.Detail) === null || _targetKPI$Detail === void 0 ? void 0 : _targetKPI$Detail.DefaultPresentationVariant;
306
+ chartAnnotation = (_presentationVariantA3 = presentationVariantAnnotation) === null || _presentationVariantA3 === void 0 ? void 0 : (_presentationVariantA4 = _presentationVariantA3.Visualizations) === null || _presentationVariantA4 === void 0 ? void 0 : (_presentationVariantA5 = _presentationVariantA4.find(function (viz) {
307
+ return viz.$target.$Type === "com.sap.vocabularies.UI.v1.ChartDefinitionType";
308
+ })) === null || _presentationVariantA5 === void 0 ? void 0 : _presentationVariantA5.$target;
248
309
 
249
- if (aggregationHelper.isPropertyAggregatable(trendProperty)) {
250
- kpiDef.datapoint.trendPath = datapointAnnotation.Trend.path;
251
- } else {
252
- // The property isn't aggregatable --> we ignore it
253
- kpiDef.datapoint.trendValue = "None";
254
- }
255
- } else {
256
- // Trend is an enum Value --> get the corresponding static value
257
- kpiDef.datapoint.trendValue = getDeviationIndicatorFromTrendType(datapointAnnotation.Trend);
258
- }
259
- } else if (datapointAnnotation.TrendCalculation) {
260
- kpiDef.datapoint.trendCalculationIsRelative = datapointAnnotation.TrendCalculation.IsRelativeDifference ? true : false;
261
-
262
- if (datapointAnnotation.TrendCalculation.ReferenceValue.$target) {
263
- // Reference value is a path --> check if the corresponding property is aggregatable
264
- var referenceProperty = datapointAnnotation.TrendCalculation.ReferenceValue.$target;
265
-
266
- if (aggregationHelper.isPropertyAggregatable(referenceProperty)) {
267
- kpiDef.datapoint.trendCalculationReferencePath = datapointAnnotation.TrendCalculation.ReferenceValue.path;
268
- } else {
269
- // The property isn't aggregatable --> we ignore it and switch back to trend 'None'
270
- kpiDef.datapoint.trendValue = "None";
271
- }
272
- } else {
273
- // Reference value is a static value
274
- kpiDef.datapoint.trendCalculationReferenceValue = datapointAnnotation.TrendCalculation.ReferenceValue;
275
- }
310
+ if ((_targetKPI$Detail2 = targetKPI.Detail) !== null && _targetKPI$Detail2 !== void 0 && _targetKPI$Detail2.SemanticObject) {
311
+ var _targetKPI$Detail$Act;
276
312
 
277
- if (kpiDef.datapoint.trendCalculationReferencePath !== undefined || kpiDef.datapoint.trendCalculationReferenceValue !== undefined) {
278
- kpiDef.datapoint.trendCalculationTresholds = [datapointAnnotation.TrendCalculation.StrongDownDifference.valueOf(), datapointAnnotation.TrendCalculation.DownDifference.valueOf(), datapointAnnotation.TrendCalculation.UpDifference.valueOf(), datapointAnnotation.TrendCalculation.StrongUpDifference.valueOf()];
279
- }
313
+ navigationInfo = {
314
+ semanticObject: targetKPI.Detail.SemanticObject.toString(),
315
+ action: (_targetKPI$Detail$Act = targetKPI.Detail.Action) === null || _targetKPI$Detail$Act === void 0 ? void 0 : _targetKPI$Detail$Act.toString(),
316
+ unavailableActions: []
317
+ };
318
+ }
319
+ } else {
320
+ // Fallback: try to find a SPV with the same qualifier
321
+ var aSPVAnnotations = kpiConverterContext.getAnnotationsByTerm("UI", "com.sap.vocabularies.UI.v1.SelectionPresentationVariant");
322
+ var targetSPV = aSPVAnnotations.find(function (spv) {
323
+ return spv.qualifier === kpiConfig.qualifier;
324
+ });
325
+
326
+ if (targetSPV) {
327
+ var _presentationVariantA6, _presentationVariantA7, _presentationVariantA8, _presentationVariantA9, _presentationVariantA10, _presentationVariantA11;
328
+
329
+ selectionVariantAnnotation = targetSPV.SelectionVariant;
330
+ presentationVariantAnnotation = targetSPV.PresentationVariant;
331
+ datapointAnnotation = (_presentationVariantA6 = presentationVariantAnnotation) === null || _presentationVariantA6 === void 0 ? void 0 : (_presentationVariantA7 = _presentationVariantA6.Visualizations) === null || _presentationVariantA7 === void 0 ? void 0 : (_presentationVariantA8 = _presentationVariantA7.find(function (viz) {
332
+ return viz.$target.$Type === "com.sap.vocabularies.UI.v1.DataPointType";
333
+ })) === null || _presentationVariantA8 === void 0 ? void 0 : _presentationVariantA8.$target;
334
+ chartAnnotation = (_presentationVariantA9 = presentationVariantAnnotation) === null || _presentationVariantA9 === void 0 ? void 0 : (_presentationVariantA10 = _presentationVariantA9.Visualizations) === null || _presentationVariantA10 === void 0 ? void 0 : (_presentationVariantA11 = _presentationVariantA10.find(function (viz) {
335
+ return viz.$target.$Type === "com.sap.vocabularies.UI.v1.ChartDefinitionType";
336
+ })) === null || _presentationVariantA11 === void 0 ? void 0 : _presentationVariantA11.$target;
280
337
  } else {
281
- kpiDef.datapoint.trendValue = "None";
282
- } // Target value
338
+ // Couldn't find a KPI or a SPV annotation with the qualifier from the manifest
339
+ converterContext.getDiagnostics().addIssue(IssueCategory.Annotation, IssueSeverity.Medium, IssueType.KPI_ISSUES.KPI_NOT_FOUND + kpiConfig.qualifier);
340
+ return undefined;
341
+ }
342
+ }
343
+
344
+ if (!presentationVariantAnnotation || !datapointAnnotation || !chartAnnotation) {
345
+ // Couldn't find a chart or datapoint definition
346
+ converterContext.getDiagnostics().addIssue(IssueCategory.Annotation, IssueSeverity.Medium, IssueType.KPI_ISSUES.KPI_DETAIL_NOT_FOUND + kpiConfig.qualifier);
347
+ return undefined;
348
+ }
283
349
 
350
+ var datapointProperty = datapointAnnotation.Value.$target;
284
351
 
285
- if (datapointAnnotation.TargetValue) {
286
- if (datapointAnnotation.TargetValue.$target) {
287
- // Target value is a path --> check if the corresponding property is aggregatable (otherwise ignore)
288
- var targetProperty = datapointAnnotation.TargetValue.$target;
352
+ if (!aggregationHelper.isPropertyAggregatable(datapointProperty)) {
353
+ // The main property of the KPI is not aggregatable --> We can't calculate its value so we ignore the KPI
354
+ converterContext.getDiagnostics().addIssue(IssueCategory.Annotation, IssueSeverity.Medium, IssueType.KPI_ISSUES.MAIN_PROPERTY_NOT_AGGREGATABLE + kpiConfig.qualifier);
355
+ return undefined;
356
+ } // Chart definition
289
357
 
290
- if (aggregationHelper.isPropertyAggregatable(targetProperty)) {
291
- kpiDef.datapoint.targetPath = datapointAnnotation.TargetValue.path;
292
- }
293
- } else {
294
- // Target value is a static value
295
- kpiDef.datapoint.targetValue = datapointAnnotation.TargetValue;
296
- }
297
- }
298
358
 
299
- return kpiDef;
300
- } else {
301
- var _targetKPI$Detail2;
359
+ var chartDef = convertKPIChart(chartAnnotation, presentationVariantAnnotation);
302
360
 
303
- if (!targetKPI) {
304
- // Couldn't find a KPI with the qualifier specified in the manifest
305
- converterContext.getDiagnostics().addIssue(IssueCategory.Annotation, IssueSeverity.Medium, IssueType.KPI_ISSUES.KPI_NOT_FOUND + kpiConfig.qualifier);
306
- } else if (!((_targetKPI$Detail2 = targetKPI.Detail) !== null && _targetKPI$Detail2 !== void 0 && _targetKPI$Detail2.DefaultPresentationVariant)) {
307
- // No KPI detail/default presentation variant
308
- converterContext.getDiagnostics().addIssue(IssueCategory.Annotation, IssueSeverity.Medium, IssueType.KPI_ISSUES.KPI_DETAIL_NOT_FOUND + kpiConfig.qualifier);
361
+ if (!chartDef) {
362
+ return undefined;
363
+ }
364
+
365
+ var kpiDef = {
366
+ id: KPIID(kpiName),
367
+ entitySet: kpiConfig.entitySet,
368
+ datapoint: {
369
+ propertyPath: datapointAnnotation.Value.path,
370
+ annotationPath: kpiConverterContext.getEntitySetBasedAnnotationPath(datapointAnnotation.fullyQualifiedName),
371
+ title: (_datapointAnnotation$ = datapointAnnotation.Title) === null || _datapointAnnotation$ === void 0 ? void 0 : _datapointAnnotation$.toString(),
372
+ description: (_datapointAnnotation$2 = datapointAnnotation.Description) === null || _datapointAnnotation$2 === void 0 ? void 0 : _datapointAnnotation$2.toString()
373
+ },
374
+ selectionVariantFilterDefinitions: selectionVariantAnnotation ? getFilterDefinitionsFromSelectionVariant(selectionVariantAnnotation) : undefined,
375
+ chart: chartDef
376
+ }; // Navigation
377
+
378
+ if (!navigationInfo) {
379
+ // No navigationInfo was found in the KPI annotation --> try the outbound navigation from the manifest
380
+ if (kpiConfig.detailNavigation) {
381
+ navigationInfo = {
382
+ outboundNavigation: kpiConfig.detailNavigation
383
+ };
309
384
  } else {
310
- // Entity doesn't support analytics
311
- converterContext.getDiagnostics().addIssue(IssueCategory.Annotation, IssueSeverity.Medium, IssueType.KPI_ISSUES.NO_ANALYTICS + kpiConfig.entitySet);
385
+ // No outbound navigation in the manifest --> try the semantic object on the Datapoint value
386
+ navigationInfo = getNavigationInfoFromProperty(datapointProperty);
312
387
  }
388
+ }
313
389
 
314
- return undefined;
390
+ if (navigationInfo) {
391
+ kpiDef.navigation = navigationInfo;
315
392
  }
393
+
394
+ updateCurrency(datapointAnnotation, kpiDef);
395
+ updateCriticality(datapointAnnotation, aggregationHelper, kpiDef);
396
+ updateTrend(datapointAnnotation, aggregationHelper, kpiDef);
397
+ updateTarget(datapointAnnotation, aggregationHelper, kpiDef);
398
+ return kpiDef;
316
399
  }
317
400
  /**
318
401
  * Creates the KPI definitions from the manifest and the annotations.
@@ -338,4 +421,4 @@ sap.ui.define(["../../helpers/ID", "sap/fe/core/templating/PropertyHelper", "sap
338
421
  _exports.getKPIDefinitions = getKPIDefinitions;
339
422
  return _exports;
340
423
  }, false);
341
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIktQSS50cyJdLCJuYW1lcyI6WyJnZXREZXZpYXRpb25JbmRpY2F0b3JGcm9tVHJlbmRUeXBlIiwidHJlbmRFbnVtIiwiZGV2aWF0aW9uSW5kaWNhdG9yIiwiY29udmVydEtQSUNhcmRDb250ZW50IiwiZGF0YXBvaW50QW5ub3RhdGlvbiIsInByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwiY2hhcnQiLCJWaXN1YWxpemF0aW9ucyIsImZpbmQiLCJ2aXoiLCIkdGFyZ2V0IiwiJFR5cGUiLCJjaGFydEFubm90YXRpb24iLCJjaGFydFR5cGUiLCJDaGFydFR5cGUiLCJEaW1lbnNpb25zIiwiTWVhc3VyZXMiLCJ1bmRlZmluZWQiLCJkaW1lbnNpb25zIiwibWFwIiwicHJvcGVydHlQYXRoIiwidmFsdWUiLCJtZWFzdXJlcyIsImNhcmRDb250ZW50TWFuaWZlc3QiLCJsYWJlbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiTGFiZWwiLCJ0b1N0cmluZyIsImNyZWF0ZUtQSURlZmluaXRpb24iLCJrcGlOYW1lIiwia3BpQ29uZmlnIiwiY29udmVydGVyQ29udGV4dCIsImtwaUNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yIiwiZW50aXR5U2V0IiwiYUtQSUFubm90YXRpb25zIiwiZ2V0QW5ub3RhdGlvbnNCeVRlcm0iLCJ0YXJnZXRLUEkiLCJrcGkiLCJxdWFsaWZpZXIiLCJhZ2dyZWdhdGlvbkhlbHBlciIsIkFnZ3JlZ2F0aW9uSGVscGVyIiwiZ2V0RW50aXR5VHlwZSIsIkRldGFpbCIsIkRlZmF1bHRQcmVzZW50YXRpb25WYXJpYW50IiwiaXNBbmFseXRpY3NTdXBwb3J0ZWQiLCJrcGlJRCIsIktQSUlEIiwiRGF0YVBvaW50IiwiZGF0YXBvaW50UHJvcGVydHkiLCJWYWx1ZSIsImlzUHJvcGVydHlBZ2dyZWdhdGFibGUiLCJnZXREaWFnbm9zdGljcyIsImFkZElzc3VlIiwiSXNzdWVDYXRlZ29yeSIsIkFubm90YXRpb24iLCJJc3N1ZVNldmVyaXR5IiwiTWVkaXVtIiwiSXNzdWVUeXBlIiwiS1BJX0lTU1VFUyIsIk1BSU5fUFJPUEVSVFlfTk9UX0FHR1JFR0FUQUJMRSIsImNhcmREZWYiLCJOT19DSEFSVF9WSVNVQUxJWkFUSU9OIiwia3BpRGVmIiwiaWQiLCJkYXRhcG9pbnQiLCJwYXRoIiwiYW5ub3RhdGlvblBhdGgiLCJnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwidGl0bGUiLCJUaXRsZSIsImRlc2NyaXB0aW9uIiwiRGVzY3JpcHRpb24iLCJzZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnMiLCJTZWxlY3Rpb25WYXJpYW50IiwiZ2V0RmlsdGVyRGVmaW5pdGlvbnNGcm9tU2VsZWN0aW9uVmFyaWFudCIsImNhcmQiLCJ0YXJnZXRWYWx1ZVByb3BlcnR5IiwiSVNPQ3VycmVuY3kiLCJjdXJyZW5jeSIsImlzUGF0aEV4cHJlc3Npb24iLCJ1bml0IiwibmFtZSIsImlzQ3VycmVuY3kiLCJpc1BhdGgiLCJVbml0IiwiQ3JpdGljYWxpdHkiLCJjcml0aWNhbGl0eVByb3BlcnR5IiwiY3JpdGljYWxpdHlQYXRoIiwiY3JpdGljYWxpdHlWYWx1ZSIsIk1lc3NhZ2VUeXBlIiwiTm9uZSIsImdldE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5VHlwZSIsIkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24iLCJjcml0aWNhbGl0eUNhbGN1bGF0aW9uTW9kZSIsIkltcHJvdmVtZW50RGlyZWN0aW9uIiwiY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMiLCJwdXNoIiwiRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZSIsIlRvbGVyYW5jZVJhbmdlTG93VmFsdWUiLCJBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSIsIkFjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZSIsIlRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlIiwiRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWUiLCJUcmVuZCIsInRyZW5kUHJvcGVydHkiLCJ0cmVuZFBhdGgiLCJ0cmVuZFZhbHVlIiwiVHJlbmRDYWxjdWxhdGlvbiIsInRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlIiwiSXNSZWxhdGl2ZURpZmZlcmVuY2UiLCJSZWZlcmVuY2VWYWx1ZSIsInJlZmVyZW5jZVByb3BlcnR5IiwidHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGgiLCJ0cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWUiLCJ0cmVuZENhbGN1bGF0aW9uVHJlc2hvbGRzIiwiU3Ryb25nRG93bkRpZmZlcmVuY2UiLCJ2YWx1ZU9mIiwiRG93bkRpZmZlcmVuY2UiLCJVcERpZmZlcmVuY2UiLCJTdHJvbmdVcERpZmZlcmVuY2UiLCJUYXJnZXRWYWx1ZSIsInRhcmdldFByb3BlcnR5IiwidGFyZ2V0UGF0aCIsInRhcmdldFZhbHVlIiwiS1BJX05PVF9GT1VORCIsIktQSV9ERVRBSUxfTk9UX0ZPVU5EIiwiTk9fQU5BTFlUSUNTIiwiZ2V0S1BJRGVmaW5pdGlvbnMiLCJrcGlDb25maWdzIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiZ2V0S1BJQ29uZmlndXJhdGlvbiIsImtwaURlZnMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsIm9EZWYiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFTQSxrQ0FBVCxDQUE0Q0MsU0FBNUMsRUFBMEU7QUFDekUsUUFBSUMsa0JBQUo7O0FBQ0EsWUFBUUQsU0FBUjtBQUNDLFdBQUssdUJBQUw7QUFDQSxXQUFLLGlCQUFMO0FBQ0NDLFFBQUFBLGtCQUFrQixHQUFHLElBQXJCO0FBQ0E7O0FBQ0QsV0FBSyx5QkFBTDtBQUNBLFdBQUssbUJBQUw7QUFDQ0EsUUFBQUEsa0JBQWtCLEdBQUcsTUFBckI7QUFDQTs7QUFDRDtBQUNDQSxRQUFBQSxrQkFBa0IsR0FBRyxNQUFyQjtBQVZGOztBQVlBLFdBQU9BLGtCQUFQO0FBQ0E7O0FBRUQsV0FBU0MscUJBQVQsQ0FDQ0MsbUJBREQsRUFFQ0MsNkJBRkQsRUFHaUM7QUFBQTs7QUFDaEM7QUFDQSxRQUFNQyxLQUFLLEdBQUdELDZCQUFILGFBQUdBLDZCQUFILGdEQUFHQSw2QkFBNkIsQ0FBRUUsY0FBbEMsMERBQUcsc0JBQStDQyxJQUEvQyxDQUFvRCxVQUFDQyxHQUFELEVBQWM7QUFDL0UsYUFBT0EsR0FBRyxDQUFDQyxPQUFKLENBQVlDLEtBQVosS0FBc0IsZ0RBQTdCO0FBQ0EsS0FGYSxDQUFkOztBQUlBLFFBQUlMLEtBQUosRUFBVztBQUNWLFVBQU1NLGVBQWUsR0FBR04sS0FBSyxDQUFDSSxPQUE5QjtBQUVBLFVBQUlHLFNBQUo7O0FBQ0EsY0FBUUQsZUFBZSxDQUFDRSxTQUF4QjtBQUNDLGFBQUssNEJBQUw7QUFDQ0QsVUFBQUEsU0FBUyxHQUFHLGVBQVo7QUFDQTs7QUFFRCxhQUFLLHlCQUFMO0FBQ0NBLFVBQUFBLFNBQVMsR0FBRyxZQUFaO0FBQ0E7O0FBRUQsYUFBSyxvQkFBTDtBQUNDQSxVQUFBQSxTQUFTLEdBQUcsT0FBWjtBQUNBOztBQUVEO0FBQ0NBLFVBQUFBLFNBQVMsR0FBRyxNQUFaO0FBZEY7O0FBaUJBLFVBQUksQ0FBQ0QsZUFBZSxDQUFDRyxVQUFqQixJQUErQixDQUFDSCxlQUFlLENBQUNJLFFBQXBELEVBQThEO0FBQzdELGVBQU9DLFNBQVA7QUFDQSxPQUZELE1BRU87QUFDTixlQUFPO0FBQ05DLFVBQUFBLFVBQVUsRUFBR04sZUFBZSxDQUFDRyxVQUFqQixDQUErQ0ksR0FBL0MsQ0FBbUQsVUFBQUMsWUFBWTtBQUFBLG1CQUFJQSxZQUFZLENBQUNDLEtBQWpCO0FBQUEsV0FBL0QsQ0FETjtBQUVOQyxVQUFBQSxRQUFRLEVBQUdWLGVBQWUsQ0FBQ0ksUUFBakIsQ0FBNkNHLEdBQTdDLENBQWlELFVBQUFDLFlBQVk7QUFBQSxtQkFBSUEsWUFBWSxDQUFDQyxLQUFqQjtBQUFBLFdBQTdELENBRko7QUFHTkUsVUFBQUEsbUJBQW1CLEVBQUU7QUFDcEJWLFlBQUFBLFNBQVMsRUFBRUEsU0FEUztBQUVwQkssWUFBQUEsVUFBVSxFQUFHTixlQUFlLENBQUNHLFVBQWpCLENBQStDSSxHQUEvQyxDQUFtRCxVQUFBQyxZQUFZLEVBQUk7QUFBQTs7QUFDOUUscUJBQU87QUFDTkksZ0JBQUFBLEtBQUssRUFBRSwwQkFBQUosWUFBWSxDQUFDVixPQUFiLENBQXFCZSxXQUFyQixDQUFpQ0MsTUFBakMsMEdBQXlDQyxLQUF6QyxrRkFBZ0RDLFFBQWhELE9BQThEUixZQUFZLENBQUNDLEtBRDVFO0FBRU5BLGdCQUFBQSxLQUFLLEVBQUUsTUFBTUQsWUFBWSxDQUFDQyxLQUFuQixHQUEyQjtBQUY1QixlQUFQO0FBSUEsYUFMVyxDQUZRO0FBUXBCQyxZQUFBQSxRQUFRLEVBQUdWLGVBQWUsQ0FBQ0ksUUFBakIsQ0FBNkNHLEdBQTdDLENBQWlELFVBQUFDLFlBQVksRUFBSTtBQUFBOztBQUMxRSxxQkFBTztBQUNOSSxnQkFBQUEsS0FBSyxFQUFFLDJCQUFBSixZQUFZLENBQUNWLE9BQWIsQ0FBcUJlLFdBQXJCLENBQWlDQyxNQUFqQyw0R0FBeUNDLEtBQXpDLGtGQUFnREMsUUFBaEQsT0FBOERSLFlBQVksQ0FBQ0MsS0FENUU7QUFFTkEsZ0JBQUFBLEtBQUssRUFBRSxNQUFNRCxZQUFZLENBQUNDLEtBQW5CLEdBQTJCO0FBRjVCLGVBQVA7QUFJQSxhQUxTO0FBUlU7QUFIZixTQUFQO0FBbUJBO0FBQ0QsS0E1Q0QsTUE0Q087QUFDTixhQUFPSixTQUFQO0FBQ0E7QUFDRDs7QUFFRCxXQUFTWSxtQkFBVCxDQUE2QkMsT0FBN0IsRUFBOENDLFNBQTlDLEVBQTJFQyxnQkFBM0UsRUFBMEk7QUFBQTs7QUFDekksUUFBTUMsbUJBQW1CLEdBQUdELGdCQUFnQixDQUFDRSxzQkFBakIsQ0FBd0MsTUFBTUgsU0FBUyxDQUFDSSxTQUF4RCxDQUE1QjtBQUNBLFFBQU1DLGVBQWUsR0FBR0gsbUJBQW1CLENBQUNJLG9CQUFwQixDQUF5QyxJQUF6QyxtQ0FBeEI7QUFDQSxRQUFNQyxTQUFTLEdBQUdGLGVBQWUsQ0FBQzVCLElBQWhCLENBQXFCLFVBQUErQixHQUFHLEVBQUk7QUFDN0MsYUFBT0EsR0FBRyxDQUFDQyxTQUFKLEtBQWtCVCxTQUFTLENBQUNTLFNBQW5DO0FBQ0EsS0FGaUIsQ0FBbEI7QUFHQSxRQUFNQyxpQkFBaUIsR0FBRyxJQUFJQyxpQkFBSixDQUFzQlQsbUJBQW1CLENBQUNVLGFBQXBCLEVBQXRCLEVBQTJEVixtQkFBM0QsQ0FBMUI7O0FBRUEsUUFBSUssU0FBUyx5QkFBSUEsU0FBUyxDQUFDTSxNQUFkLDhDQUFJLGtCQUFrQkMsMEJBQS9CLElBQTZESixpQkFBaUIsQ0FBQ0ssb0JBQWxCLEVBQWpFLEVBQTJHO0FBQUE7O0FBQzFHLFVBQU1DLEtBQUssR0FBR0MsS0FBSyxDQUFDbEIsT0FBRCxDQUFuQixDQUQwRyxDQUcxRzs7QUFDQSxVQUFNMUIsbUJBQW1CLEdBQUdrQyxTQUFTLENBQUNXLFNBQXRDO0FBQ0EsVUFBTUMsaUJBQWlCLEdBQUc5QyxtQkFBbUIsQ0FBQytDLEtBQXBCLENBQTBCekMsT0FBcEQ7O0FBQ0EsVUFBSSxDQUFDK0IsaUJBQWlCLENBQUNXLHNCQUFsQixDQUF5Q0YsaUJBQXpDLENBQUwsRUFBa0U7QUFDakU7QUFDQWxCLFFBQUFBLGdCQUFnQixDQUNkcUIsY0FERixHQUVFQyxRQUZGLENBR0VDLGFBQWEsQ0FBQ0MsVUFIaEIsRUFJRUMsYUFBYSxDQUFDQyxNQUpoQixFQUtFQyxTQUFTLENBQUNDLFVBQVYsQ0FBcUJDLDhCQUFyQixHQUFzRDlCLFNBQVMsQ0FBQ1MsU0FMbEU7QUFPQSxlQUFPdkIsU0FBUDtBQUNBLE9BaEJ5RyxDQWtCMUc7OztBQUNBLFVBQU02QyxPQUFPLEdBQUczRCxxQkFBcUIsQ0FBQ0MsbUJBQUQsRUFBc0JrQyxTQUFTLENBQUNNLE1BQVYsQ0FBaUJDLDBCQUF2QyxDQUFyQzs7QUFDQSxVQUFJLENBQUNpQixPQUFMLEVBQWM7QUFDYjtBQUNBOUIsUUFBQUEsZ0JBQWdCLENBQ2RxQixjQURGLEdBRUVDLFFBRkYsQ0FHRUMsYUFBYSxDQUFDQyxVQUhoQixFQUlFQyxhQUFhLENBQUNDLE1BSmhCLEVBS0VDLFNBQVMsQ0FBQ0MsVUFBVixDQUFxQkcsc0JBQXJCLEdBQThDaEMsU0FBUyxDQUFDUyxTQUwxRDtBQU9BLGVBQU92QixTQUFQO0FBQ0E7O0FBRUQsVUFBTStDLE1BQXFCLEdBQUc7QUFDN0JDLFFBQUFBLEVBQUUsRUFBRWxCLEtBRHlCO0FBRTdCWixRQUFBQSxTQUFTLEVBQUVKLFNBQVMsQ0FBQ0ksU0FGUTtBQUc3QitCLFFBQUFBLFNBQVMsRUFBRTtBQUNWOUMsVUFBQUEsWUFBWSxFQUFFaEIsbUJBQW1CLENBQUMrQyxLQUFwQixDQUEwQmdCLElBRDlCO0FBRVZDLFVBQUFBLGNBQWMsRUFBRW5DLG1CQUFtQixDQUFDb0MsK0JBQXBCLENBQW9EakUsbUJBQW1CLENBQUNrRSxrQkFBeEUsQ0FGTjtBQUdWQyxVQUFBQSxLQUFLLDJCQUFFbkUsbUJBQW1CLENBQUNvRSxLQUF0QiwwREFBRSxzQkFBMkI1QyxRQUEzQixFQUhHO0FBSVY2QyxVQUFBQSxXQUFXLDRCQUFFckUsbUJBQW1CLENBQUNzRSxXQUF0QiwyREFBRSx1QkFBaUM5QyxRQUFqQztBQUpILFNBSGtCO0FBUzdCK0MsUUFBQUEsaUNBQWlDLEVBQUVyQyxTQUFTLENBQUNzQyxnQkFBVixHQUNoQ0Msd0NBQXdDLENBQUN2QyxTQUFTLENBQUNzQyxnQkFBWCxDQURSLEdBRWhDM0QsU0FYMEI7QUFZN0I2RCxRQUFBQSxJQUFJLEVBQUVoQjtBQVp1QixPQUE5QixDQWhDMEcsQ0ErQzFHOztBQUNBLFVBQU1pQixtQkFBbUIsR0FBRzNFLG1CQUFtQixDQUFDK0MsS0FBcEIsQ0FBMEJ6QyxPQUF0RDs7QUFDQSxtQ0FBSXFFLG1CQUFtQixDQUFDdEQsV0FBcEIsQ0FBZ0NULFFBQXBDLGtEQUFJLHNCQUEwQ2dFLFdBQTlDLEVBQTJEO0FBQUE7O0FBQzFELFlBQU1DLFFBQVEsNkJBQUdGLG1CQUFtQixDQUFDdEQsV0FBcEIsQ0FBZ0NULFFBQW5DLDJEQUFHLHVCQUEwQ2dFLFdBQTNEOztBQUNBLFlBQUlFLGdCQUFnQixDQUFDRCxRQUFELENBQXBCLEVBQWdDO0FBQy9CakIsVUFBQUEsTUFBTSxDQUFDRSxTQUFQLENBQWlCaUIsSUFBakIsR0FBd0I7QUFDdkI5RCxZQUFBQSxLQUFLLEVBQUk0RCxRQUFRLENBQUN2RSxPQUFYLENBQTRDMEUsSUFENUI7QUFFdkJDLFlBQUFBLFVBQVUsRUFBRSxJQUZXO0FBR3ZCQyxZQUFBQSxNQUFNLEVBQUU7QUFIZSxXQUF4QjtBQUtBLFNBTkQsTUFNTztBQUNOdEIsVUFBQUEsTUFBTSxDQUFDRSxTQUFQLENBQWlCaUIsSUFBakIsR0FBd0I7QUFDdkI5RCxZQUFBQSxLQUFLLEVBQUU0RCxRQUFRLENBQUNyRCxRQUFULEVBRGdCO0FBRXZCeUQsWUFBQUEsVUFBVSxFQUFFLElBRlc7QUFHdkJDLFlBQUFBLE1BQU0sRUFBRTtBQUhlLFdBQXhCO0FBS0E7QUFDRCxPQWZELE1BZU8sOEJBQUlQLG1CQUFtQixDQUFDdEQsV0FBcEIsQ0FBZ0NULFFBQXBDLG1EQUFJLHVCQUEwQ3VFLElBQTlDLEVBQW9EO0FBQUE7O0FBQzFELFlBQU1KLElBQUksNkJBQUdKLG1CQUFtQixDQUFDdEQsV0FBcEIsQ0FBZ0NULFFBQW5DLDJEQUFHLHVCQUEwQ3VFLElBQXZEOztBQUNBLFlBQUlMLGdCQUFnQixDQUFDQyxJQUFELENBQXBCLEVBQTRCO0FBQzNCbkIsVUFBQUEsTUFBTSxDQUFDRSxTQUFQLENBQWlCaUIsSUFBakIsR0FBd0I7QUFDdkI5RCxZQUFBQSxLQUFLLEVBQUk4RCxJQUFJLENBQUN6RSxPQUFQLENBQXdDMEUsSUFEeEI7QUFFdkJDLFlBQUFBLFVBQVUsRUFBRSxLQUZXO0FBR3ZCQyxZQUFBQSxNQUFNLEVBQUU7QUFIZSxXQUF4QjtBQUtBLFNBTkQsTUFNTztBQUNOdEIsVUFBQUEsTUFBTSxDQUFDRSxTQUFQLENBQWlCaUIsSUFBakIsR0FBd0I7QUFDdkI5RCxZQUFBQSxLQUFLLEVBQUU4RCxJQUFJLENBQUN2RCxRQUFMLEVBRGdCO0FBRXZCeUQsWUFBQUEsVUFBVSxFQUFFLEtBRlc7QUFHdkJDLFlBQUFBLE1BQU0sRUFBRTtBQUhlLFdBQXhCO0FBS0E7QUFDRCxPQS9FeUcsQ0FpRjFHOzs7QUFDQSxVQUFJbEYsbUJBQW1CLENBQUNvRixXQUF4QixFQUFxQztBQUNwQyxZQUFJLE9BQU9wRixtQkFBbUIsQ0FBQ29GLFdBQTNCLEtBQTJDLFFBQS9DLEVBQXlEO0FBQ3hEO0FBQ0EsY0FBTUMsbUJBQW1CLEdBQUlyRixtQkFBbUIsQ0FBQ29GLFdBQXJCLENBQzFCOUUsT0FERjs7QUFFQSxjQUFJK0IsaUJBQWlCLENBQUNXLHNCQUFsQixDQUF5Q3FDLG1CQUF6QyxDQUFKLEVBQW1FO0FBQ2xFekIsWUFBQUEsTUFBTSxDQUFDRSxTQUFQLENBQWlCd0IsZUFBakIsR0FBb0N0RixtQkFBbUIsQ0FBQ29GLFdBQXJCLENBQStFckIsSUFBbEg7QUFDQSxXQUZELE1BRU87QUFDTjtBQUNBSCxZQUFBQSxNQUFNLENBQUNFLFNBQVAsQ0FBaUJ5QixnQkFBakIsR0FBb0NDLFdBQVcsQ0FBQ0MsSUFBaEQ7QUFDQTtBQUNELFNBVkQsTUFVTztBQUNOO0FBQ0E3QixVQUFBQSxNQUFNLENBQUNFLFNBQVAsQ0FBaUJ5QixnQkFBakIsR0FBb0NHLGlDQUFpQyxDQUFDMUYsbUJBQW1CLENBQUNvRixXQUFyQixDQUFyRTtBQUNBO0FBQ0QsT0FmRCxNQWVPLElBQUlwRixtQkFBbUIsQ0FBQzJGLHNCQUF4QixFQUFnRDtBQUN0RC9CLFFBQUFBLE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQjhCLDBCQUFqQixHQUE4QzVGLG1CQUFtQixDQUFDMkYsc0JBQXBCLENBQTJDRSxvQkFBekY7QUFDQWpDLFFBQUFBLE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQmdDLGdDQUFqQixHQUFvRCxFQUFwRDs7QUFDQSxnQkFBUWxDLE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQjhCLDBCQUF6QjtBQUNDLGVBQUssb0NBQUw7QUFDQ2hDLFlBQUFBLE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQmdDLGdDQUFqQixDQUFrREMsSUFBbEQsQ0FDQy9GLG1CQUFtQixDQUFDMkYsc0JBQXBCLENBQTJDSyxzQkFENUM7QUFHQXBDLFlBQUFBLE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQmdDLGdDQUFqQixDQUFrREMsSUFBbEQsQ0FDQy9GLG1CQUFtQixDQUFDMkYsc0JBQXBCLENBQTJDTSxzQkFENUM7QUFHQXJDLFlBQUFBLE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQmdDLGdDQUFqQixDQUFrREMsSUFBbEQsQ0FDQy9GLG1CQUFtQixDQUFDMkYsc0JBQXBCLENBQTJDTyx1QkFENUM7QUFHQXRDLFlBQUFBLE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQmdDLGdDQUFqQixDQUFrREMsSUFBbEQsQ0FDQy9GLG1CQUFtQixDQUFDMkYsc0JBQXBCLENBQTJDUSx3QkFENUM7QUFHQXZDLFlBQUFBLE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQmdDLGdDQUFqQixDQUFrREMsSUFBbEQsQ0FDQy9GLG1CQUFtQixDQUFDMkYsc0JBQXBCLENBQTJDUyx1QkFENUM7QUFHQXhDLFlBQUFBLE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQmdDLGdDQUFqQixDQUFrREMsSUFBbEQsQ0FDQy9GLG1CQUFtQixDQUFDMkYsc0JBQXBCLENBQTJDVSx1QkFENUM7QUFHQTs7QUFFRCxlQUFLLHNDQUFMO0FBQ0N6QyxZQUFBQSxNQUFNLENBQUNFLFNBQVAsQ0FBaUJnQyxnQ0FBakIsQ0FBa0RDLElBQWxELENBQ0MvRixtQkFBbUIsQ0FBQzJGLHNCQUFwQixDQUEyQ1Esd0JBRDVDO0FBR0F2QyxZQUFBQSxNQUFNLENBQUNFLFNBQVAsQ0FBaUJnQyxnQ0FBakIsQ0FBa0RDLElBQWxELENBQ0MvRixtQkFBbUIsQ0FBQzJGLHNCQUFwQixDQUEyQ1MsdUJBRDVDO0FBR0F4QyxZQUFBQSxNQUFNLENBQUNFLFNBQVAsQ0FBaUJnQyxnQ0FBakIsQ0FBa0RDLElBQWxELENBQ0MvRixtQkFBbUIsQ0FBQzJGLHNCQUFwQixDQUEyQ1UsdUJBRDVDO0FBR0E7O0FBRUQsZUFBSyxzQ0FBTDtBQUNBO0FBQ0N6QyxZQUFBQSxNQUFNLENBQUNFLFNBQVAsQ0FBaUJnQyxnQ0FBakIsQ0FBa0RDLElBQWxELENBQ0MvRixtQkFBbUIsQ0FBQzJGLHNCQUFwQixDQUEyQ0ssc0JBRDVDO0FBR0FwQyxZQUFBQSxNQUFNLENBQUNFLFNBQVAsQ0FBaUJnQyxnQ0FBakIsQ0FBa0RDLElBQWxELENBQ0MvRixtQkFBbUIsQ0FBQzJGLHNCQUFwQixDQUEyQ00sc0JBRDVDO0FBR0FyQyxZQUFBQSxNQUFNLENBQUNFLFNBQVAsQ0FBaUJnQyxnQ0FBakIsQ0FBa0RDLElBQWxELENBQ0MvRixtQkFBbUIsQ0FBQzJGLHNCQUFwQixDQUEyQ08sdUJBRDVDO0FBMUNGO0FBOENBLE9BakRNLE1BaURBO0FBQ050QyxRQUFBQSxNQUFNLENBQUNFLFNBQVAsQ0FBaUJ5QixnQkFBakIsR0FBb0NDLFdBQVcsQ0FBQ0MsSUFBaEQ7QUFDQSxPQXBKeUcsQ0FzSjFHOzs7QUFDQSxVQUFJekYsbUJBQW1CLENBQUNzRyxLQUF4QixFQUErQjtBQUM5QixZQUFJLE9BQU90RyxtQkFBbUIsQ0FBQ3NHLEtBQTNCLEtBQXFDLFFBQXpDLEVBQW1EO0FBQ2xEO0FBQ0EsY0FBTUMsYUFBYSxHQUFJdkcsbUJBQW1CLENBQUNzRyxLQUFyQixDQUFtRWhHLE9BQXpGOztBQUNBLGNBQUkrQixpQkFBaUIsQ0FBQ1csc0JBQWxCLENBQXlDdUQsYUFBekMsQ0FBSixFQUE2RDtBQUM1RDNDLFlBQUFBLE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQjBDLFNBQWpCLEdBQThCeEcsbUJBQW1CLENBQUNzRyxLQUFyQixDQUFtRXZDLElBQWhHO0FBQ0EsV0FGRCxNQUVPO0FBQ047QUFDQUgsWUFBQUEsTUFBTSxDQUFDRSxTQUFQLENBQWlCMkMsVUFBakIsR0FBOEIsTUFBOUI7QUFDQTtBQUNELFNBVEQsTUFTTztBQUNOO0FBQ0E3QyxVQUFBQSxNQUFNLENBQUNFLFNBQVAsQ0FBaUIyQyxVQUFqQixHQUE4QjdHLGtDQUFrQyxDQUFDSSxtQkFBbUIsQ0FBQ3NHLEtBQXJCLENBQWhFO0FBQ0E7QUFDRCxPQWRELE1BY08sSUFBSXRHLG1CQUFtQixDQUFDMEcsZ0JBQXhCLEVBQTBDO0FBQ2hEOUMsUUFBQUEsTUFBTSxDQUFDRSxTQUFQLENBQWlCNkMsMEJBQWpCLEdBQThDM0csbUJBQW1CLENBQUMwRyxnQkFBcEIsQ0FBcUNFLG9CQUFyQyxHQUE0RCxJQUE1RCxHQUFtRSxLQUFqSDs7QUFDQSxZQUFJNUcsbUJBQW1CLENBQUMwRyxnQkFBcEIsQ0FBcUNHLGNBQXJDLENBQW9EdkcsT0FBeEQsRUFBaUU7QUFDaEU7QUFDQSxjQUFNd0csaUJBQWlCLEdBQUc5RyxtQkFBbUIsQ0FBQzBHLGdCQUFwQixDQUFxQ0csY0FBckMsQ0FBb0R2RyxPQUE5RTs7QUFDQSxjQUFJK0IsaUJBQWlCLENBQUNXLHNCQUFsQixDQUF5QzhELGlCQUF6QyxDQUFKLEVBQWlFO0FBQ2hFbEQsWUFBQUEsTUFBTSxDQUFDRSxTQUFQLENBQWlCaUQsNkJBQWpCLEdBQWlEL0csbUJBQW1CLENBQUMwRyxnQkFBcEIsQ0FBcUNHLGNBQXJDLENBQW9EOUMsSUFBckc7QUFDQSxXQUZELE1BRU87QUFDTjtBQUNBSCxZQUFBQSxNQUFNLENBQUNFLFNBQVAsQ0FBaUIyQyxVQUFqQixHQUE4QixNQUE5QjtBQUNBO0FBQ0QsU0FURCxNQVNPO0FBQ047QUFDQTdDLFVBQUFBLE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQmtELDhCQUFqQixHQUFrRGhILG1CQUFtQixDQUFDMEcsZ0JBQXBCLENBQXFDRyxjQUF2RjtBQUNBOztBQUNELFlBQ0NqRCxNQUFNLENBQUNFLFNBQVAsQ0FBaUJpRCw2QkFBakIsS0FBbURsRyxTQUFuRCxJQUNBK0MsTUFBTSxDQUFDRSxTQUFQLENBQWlCa0QsOEJBQWpCLEtBQW9EbkcsU0FGckQsRUFHRTtBQUNEK0MsVUFBQUEsTUFBTSxDQUFDRSxTQUFQLENBQWlCbUQseUJBQWpCLEdBQTZDLENBQzVDakgsbUJBQW1CLENBQUMwRyxnQkFBcEIsQ0FBcUNRLG9CQUFyQyxDQUEwREMsT0FBMUQsRUFENEMsRUFFNUNuSCxtQkFBbUIsQ0FBQzBHLGdCQUFwQixDQUFxQ1UsY0FBckMsQ0FBb0RELE9BQXBELEVBRjRDLEVBRzVDbkgsbUJBQW1CLENBQUMwRyxnQkFBcEIsQ0FBcUNXLFlBQXJDLENBQWtERixPQUFsRCxFQUg0QyxFQUk1Q25ILG1CQUFtQixDQUFDMEcsZ0JBQXBCLENBQXFDWSxrQkFBckMsQ0FBd0RILE9BQXhELEVBSjRDLENBQTdDO0FBTUE7QUFDRCxPQTFCTSxNQTBCQTtBQUNOdkQsUUFBQUEsTUFBTSxDQUFDRSxTQUFQLENBQWlCMkMsVUFBakIsR0FBOEIsTUFBOUI7QUFDQSxPQWpNeUcsQ0FtTTFHOzs7QUFDQSxVQUFJekcsbUJBQW1CLENBQUN1SCxXQUF4QixFQUFxQztBQUNwQyxZQUFJdkgsbUJBQW1CLENBQUN1SCxXQUFwQixDQUFnQ2pILE9BQXBDLEVBQTZDO0FBQzVDO0FBQ0EsY0FBTWtILGNBQWMsR0FBR3hILG1CQUFtQixDQUFDdUgsV0FBcEIsQ0FBZ0NqSCxPQUF2RDs7QUFDQSxjQUFJK0IsaUJBQWlCLENBQUNXLHNCQUFsQixDQUF5Q3dFLGNBQXpDLENBQUosRUFBOEQ7QUFDN0Q1RCxZQUFBQSxNQUFNLENBQUNFLFNBQVAsQ0FBaUIyRCxVQUFqQixHQUE4QnpILG1CQUFtQixDQUFDdUgsV0FBcEIsQ0FBZ0N4RCxJQUE5RDtBQUNBO0FBQ0QsU0FORCxNQU1PO0FBQ047QUFDQUgsVUFBQUEsTUFBTSxDQUFDRSxTQUFQLENBQWlCNEQsV0FBakIsR0FBK0IxSCxtQkFBbUIsQ0FBQ3VILFdBQW5EO0FBQ0E7QUFDRDs7QUFFRCxhQUFPM0QsTUFBUDtBQUNBLEtBbE5ELE1Ba05PO0FBQUE7O0FBQ04sVUFBSSxDQUFDMUIsU0FBTCxFQUFnQjtBQUNmO0FBQ0FOLFFBQUFBLGdCQUFnQixDQUNkcUIsY0FERixHQUVFQyxRQUZGLENBRVdDLGFBQWEsQ0FBQ0MsVUFGekIsRUFFcUNDLGFBQWEsQ0FBQ0MsTUFGbkQsRUFFMkRDLFNBQVMsQ0FBQ0MsVUFBVixDQUFxQm1FLGFBQXJCLEdBQXFDaEcsU0FBUyxDQUFDUyxTQUYxRztBQUdBLE9BTEQsTUFLTyxJQUFJLHdCQUFDRixTQUFTLENBQUNNLE1BQVgsK0NBQUMsbUJBQWtCQywwQkFBbkIsQ0FBSixFQUFtRDtBQUN6RDtBQUNBYixRQUFBQSxnQkFBZ0IsQ0FDZHFCLGNBREYsR0FFRUMsUUFGRixDQUVXQyxhQUFhLENBQUNDLFVBRnpCLEVBRXFDQyxhQUFhLENBQUNDLE1BRm5ELEVBRTJEQyxTQUFTLENBQUNDLFVBQVYsQ0FBcUJvRSxvQkFBckIsR0FBNENqRyxTQUFTLENBQUNTLFNBRmpIO0FBR0EsT0FMTSxNQUtBO0FBQ047QUFDQVIsUUFBQUEsZ0JBQWdCLENBQ2RxQixjQURGLEdBRUVDLFFBRkYsQ0FFV0MsYUFBYSxDQUFDQyxVQUZ6QixFQUVxQ0MsYUFBYSxDQUFDQyxNQUZuRCxFQUUyREMsU0FBUyxDQUFDQyxVQUFWLENBQXFCcUUsWUFBckIsR0FBb0NsRyxTQUFTLENBQUNJLFNBRnpHO0FBR0E7O0FBQ0QsYUFBT2xCLFNBQVA7QUFDQTtBQUNEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxXQUFTaUgsaUJBQVQsQ0FBMkJsRyxnQkFBM0IsRUFBZ0Y7QUFDdEYsUUFBTW1HLFVBQVUsR0FBR25HLGdCQUFnQixDQUFDb0csa0JBQWpCLEdBQXNDQyxtQkFBdEMsRUFBbkI7QUFBQSxRQUNDQyxPQUF3QixHQUFHLEVBRDVCO0FBR0FDLElBQUFBLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZTCxVQUFaLEVBQXdCTSxPQUF4QixDQUFnQyxVQUFBM0csT0FBTyxFQUFJO0FBQzFDLFVBQU00RyxJQUFJLEdBQUc3RyxtQkFBbUIsQ0FBQ0MsT0FBRCxFQUFVcUcsVUFBVSxDQUFDckcsT0FBRCxDQUFwQixFQUErQkUsZ0JBQS9CLENBQWhDOztBQUNBLFVBQUkwRyxJQUFKLEVBQVU7QUFDVEosUUFBQUEsT0FBTyxDQUFDbkMsSUFBUixDQUFhdUMsSUFBYjtBQUNBO0FBQ0QsS0FMRDtBQU9BLFdBQU9KLE9BQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS1BJQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQge1xuXHRBbm5vdGF0aW9uVGVybSxcblx0VUlBbm5vdGF0aW9uVGVybXMsXG5cdFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0Q3JpdGljYWxpdHlUeXBlLFxuXHRJbXByb3ZlbWVudERpcmVjdGlvblR5cGVcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgeyBLUElUeXBlLCBQcmVzZW50YXRpb25WYXJpYW50LCBDaGFydERlZmluaXRpb25UeXBlVHlwZXMsIERhdGFQb2ludCwgVHJlbmRUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL1VJXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9FZG1cIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7IEtQSUlEIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvSURcIjtcbmltcG9ydCB7IGlzUGF0aEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9UYWJsZUZvcm1hdHRlclR5cGVzXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkhlbHBlciB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZVNldmVyaXR5LCBJc3N1ZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHsgZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlIH0gZnJvbSBcIi4vQ3JpdGljYWxpdHlcIjtcbmltcG9ydCB7IGdldEZpbHRlckRlZmluaXRpb25zRnJvbVNlbGVjdGlvblZhcmlhbnQsIEZpbHRlckRlZmluaXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL1NlbGVjdGlvblZhcmlhbnRIZWxwZXJcIjtcblxudHlwZSBLUElDYXJkRGVmaW5pdGlvbiA9IHtcblx0ZGltZW5zaW9uczogc3RyaW5nW107XG5cdG1lYXN1cmVzOiBzdHJpbmdbXTtcblx0Y2FyZENvbnRlbnRNYW5pZmVzdDoge1xuXHRcdGNoYXJ0VHlwZTogc3RyaW5nO1xuXHRcdGRpbWVuc2lvbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W107XG5cdFx0bWVhc3VyZXM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W107XG5cdH07XG59O1xuXG5leHBvcnQgdHlwZSBLUElEZWZpbml0aW9uID0ge1xuXHRpZDogc3RyaW5nO1xuXHRlbnRpdHlTZXQ6IHN0cmluZztcblx0ZGF0YXBvaW50OiB7XG5cdFx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0XHRwcm9wZXJ0eVBhdGg6IHN0cmluZztcblx0XHR1bml0Pzoge1xuXHRcdFx0dmFsdWU6IHN0cmluZztcblx0XHRcdGlzUGF0aDogYm9vbGVhbjtcblx0XHRcdGlzQ3VycmVuY3k6IGJvb2xlYW47XG5cdFx0fTtcblx0XHRjcml0aWNhbGl0eVBhdGg/OiBzdHJpbmc7XG5cdFx0Y3JpdGljYWxpdHlWYWx1ZT86IE1lc3NhZ2VUeXBlO1xuXHRcdGNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlPzogSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlO1xuXHRcdGNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzPzogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW107XG5cdFx0dGl0bGU/OiBzdHJpbmc7XG5cdFx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdFx0dHJlbmRQYXRoPzogc3RyaW5nO1xuXHRcdHRyZW5kVmFsdWU/OiBzdHJpbmc7XG5cdFx0dHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlPzogbnVtYmVyO1xuXHRcdHRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoPzogc3RyaW5nO1xuXHRcdHRyZW5kQ2FsY3VsYXRpb25UcmVzaG9sZHM/OiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXTtcblx0XHR0cmVuZENhbGN1bGF0aW9uSXNSZWxhdGl2ZT86IGJvb2xlYW47XG5cdFx0dGFyZ2V0VmFsdWU/OiBudW1iZXI7XG5cdFx0dGFyZ2V0UGF0aD86IHN0cmluZztcblx0fTtcblx0Y2FyZDogS1BJQ2FyZERlZmluaXRpb247XG5cdHNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucz86IEZpbHRlckRlZmluaXRpb25bXTtcbn07XG5cbi8qKlxuICogR2V0cyBhIERldmlhdGlvbkluZGljYXRvciBlbnVtIHZhbHVlIGZyb20gYSBUcmVuZFR5cGUgZW51bSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1RyZW5kVHlwZX0gdHJlbmRFbnVtIFRoZSB0cmVuZCBlbnVtIHZhbHVlXG4gKiBAcmV0dXJucyB7RGV2aWF0aW9uSW5kaWNhdG9yfSBSZXR1cm5zIHRoZSBEZXZpYXRpb25JbmRpY2F0b3IgZW51bSB2YWx1ZVxuICovXG5mdW5jdGlvbiBnZXREZXZpYXRpb25JbmRpY2F0b3JGcm9tVHJlbmRUeXBlKHRyZW5kRW51bTogVHJlbmRUeXBlKTogc3RyaW5nIHtcblx0bGV0IGRldmlhdGlvbkluZGljYXRvcjogc3RyaW5nO1xuXHRzd2l0Y2ggKHRyZW5kRW51bSkge1xuXHRcdGNhc2UgXCJVSS5UcmVuZFR5cGUvU3Ryb25nVXBcIjpcblx0XHRjYXNlIFwiVUkuVHJlbmRUeXBlL1VwXCI6XG5cdFx0XHRkZXZpYXRpb25JbmRpY2F0b3IgPSBcIlVwXCI7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiVUkuVHJlbmRUeXBlL1N0cm9uZ0Rvd25cIjpcblx0XHRjYXNlIFwiVUkuVHJlbmRUeXBlL0Rvd25cIjpcblx0XHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiTm9uZVwiO1xuXHR9XG5cdHJldHVybiBkZXZpYXRpb25JbmRpY2F0b3I7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRLUElDYXJkQ29udGVudChcblx0ZGF0YXBvaW50QW5ub3RhdGlvbjogRGF0YVBvaW50LFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj86IFByZXNlbnRhdGlvblZhcmlhbnRcbik6IEtQSUNhcmREZWZpbml0aW9uIHwgdW5kZWZpbmVkIHtcblx0Ly8gRmluZCB0aGUgY2hhcnQgdmlzdWFsaXphdGlvblxuXHRjb25zdCBjaGFydCA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5WaXN1YWxpemF0aW9ucz8uZmluZCgodml6OiBhbnkpID0+IHtcblx0XHRyZXR1cm4gdml6LiR0YXJnZXQuJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnREZWZpbml0aW9uVHlwZVwiO1xuXHR9KTtcblxuXHRpZiAoY2hhcnQpIHtcblx0XHRjb25zdCBjaGFydEFubm90YXRpb24gPSBjaGFydC4kdGFyZ2V0IGFzIENoYXJ0RGVmaW5pdGlvblR5cGVUeXBlcztcblxuXHRcdGxldCBjaGFydFR5cGU6IHN0cmluZztcblx0XHRzd2l0Y2ggKGNoYXJ0QW5ub3RhdGlvbi5DaGFydFR5cGUpIHtcblx0XHRcdGNhc2UgXCJVSS5DaGFydFR5cGUvQ29sdW1uU3RhY2tlZFwiOlxuXHRcdFx0XHRjaGFydFR5cGUgPSBcIlN0YWNrZWRDb2x1bW5cIjtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJVSS5DaGFydFR5cGUvQmFyU3RhY2tlZFwiOlxuXHRcdFx0XHRjaGFydFR5cGUgPSBcIlN0YWNrZWRCYXJcIjtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJVSS5DaGFydFR5cGUvRG9udXRcIjpcblx0XHRcdFx0Y2hhcnRUeXBlID0gXCJEb251dFwiO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0Y2hhcnRUeXBlID0gXCJMaW5lXCI7XG5cdFx0fVxuXG5cdFx0aWYgKCFjaGFydEFubm90YXRpb24uRGltZW5zaW9ucyB8fCAhY2hhcnRBbm5vdGF0aW9uLk1lYXN1cmVzKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkaW1lbnNpb25zOiAoY2hhcnRBbm5vdGF0aW9uLkRpbWVuc2lvbnMgYXMgUHJvcGVydHlQYXRoW10pLm1hcChwcm9wZXJ0eVBhdGggPT4gcHJvcGVydHlQYXRoLnZhbHVlKSxcblx0XHRcdFx0bWVhc3VyZXM6IChjaGFydEFubm90YXRpb24uTWVhc3VyZXMgYXMgUHJvcGVydHlQYXRoW10pLm1hcChwcm9wZXJ0eVBhdGggPT4gcHJvcGVydHlQYXRoLnZhbHVlKSxcblx0XHRcdFx0Y2FyZENvbnRlbnRNYW5pZmVzdDoge1xuXHRcdFx0XHRcdGNoYXJ0VHlwZTogY2hhcnRUeXBlLFxuXHRcdFx0XHRcdGRpbWVuc2lvbnM6IChjaGFydEFubm90YXRpb24uRGltZW5zaW9ucyBhcyBQcm9wZXJ0eVBhdGhbXSkubWFwKHByb3BlcnR5UGF0aCA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogcHJvcGVydHlQYXRoLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udG9TdHJpbmcoKSB8fCBwcm9wZXJ0eVBhdGgudmFsdWUsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiBcIntcIiArIHByb3BlcnR5UGF0aC52YWx1ZSArIFwifVwiXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdG1lYXN1cmVzOiAoY2hhcnRBbm5vdGF0aW9uLk1lYXN1cmVzIGFzIFByb3BlcnR5UGF0aFtdKS5tYXAocHJvcGVydHlQYXRoID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiBwcm9wZXJ0eVBhdGguJHRhcmdldC5hbm5vdGF0aW9ucy5Db21tb24/LkxhYmVsPy50b1N0cmluZygpIHx8IHByb3BlcnR5UGF0aC52YWx1ZSxcblx0XHRcdFx0XHRcdFx0dmFsdWU6IFwie1wiICsgcHJvcGVydHlQYXRoLnZhbHVlICsgXCJ9XCJcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuXG5mdW5jdGlvbiBjcmVhdGVLUElEZWZpbml0aW9uKGtwaU5hbWU6IHN0cmluZywga3BpQ29uZmlnOiBLUElDb25maWd1cmF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogS1BJRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGtwaUNvbnZlcnRlckNvbnRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IoXCIvXCIgKyBrcGlDb25maWcuZW50aXR5U2V0KTtcblx0Y29uc3QgYUtQSUFubm90YXRpb25zID0ga3BpQ29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIlVJXCIsIFVJQW5ub3RhdGlvblRlcm1zLktQSSkgYXMgQW5ub3RhdGlvblRlcm08S1BJVHlwZT5bXTtcblx0Y29uc3QgdGFyZ2V0S1BJID0gYUtQSUFubm90YXRpb25zLmZpbmQoa3BpID0+IHtcblx0XHRyZXR1cm4ga3BpLnF1YWxpZmllciA9PT0ga3BpQ29uZmlnLnF1YWxpZmllcjtcblx0fSk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGtwaUNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBrcGlDb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRpZiAodGFyZ2V0S1BJICYmIHRhcmdldEtQSS5EZXRhaWw/LkRlZmF1bHRQcmVzZW50YXRpb25WYXJpYW50ICYmIGFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkpIHtcblx0XHRjb25zdCBrcGlJRCA9IEtQSUlEKGtwaU5hbWUpO1xuXG5cdFx0Ly8gRGF0YXBvaW50XG5cdFx0Y29uc3QgZGF0YXBvaW50QW5ub3RhdGlvbiA9IHRhcmdldEtQSS5EYXRhUG9pbnQ7XG5cdFx0Y29uc3QgZGF0YXBvaW50UHJvcGVydHkgPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlZhbHVlLiR0YXJnZXQgYXMgUHJvcGVydHk7XG5cdFx0aWYgKCFhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5QWdncmVnYXRhYmxlKGRhdGFwb2ludFByb3BlcnR5KSkge1xuXHRcdFx0Ly8gVGhlIG1haW4gcHJvcGVydHkgb2YgdGhlIEtQSSBpcyBub3QgYWdncmVnYXRhYmxlIC0tPiBXZSBjYW4ndCBjYWxjdWxhdGUgaXRzIHZhbHVlIHNvIHdlIGlnbm9yZSB0aGUgS1BJXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHRcdC5hZGRJc3N1ZShcblx0XHRcdFx0XHRJc3N1ZUNhdGVnb3J5LkFubm90YXRpb24sXG5cdFx0XHRcdFx0SXNzdWVTZXZlcml0eS5NZWRpdW0sXG5cdFx0XHRcdFx0SXNzdWVUeXBlLktQSV9JU1NVRVMuTUFJTl9QUk9QRVJUWV9OT1RfQUdHUkVHQVRBQkxFICsga3BpQ29uZmlnLnF1YWxpZmllclxuXHRcdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBDaGFydFxuXHRcdGNvbnN0IGNhcmREZWYgPSBjb252ZXJ0S1BJQ2FyZENvbnRlbnQoZGF0YXBvaW50QW5ub3RhdGlvbiwgdGFyZ2V0S1BJLkRldGFpbC5EZWZhdWx0UHJlc2VudGF0aW9uVmFyaWFudCk7XG5cdFx0aWYgKCFjYXJkRGVmKSB7XG5cdFx0XHQvLyBDYW4ndCBmaW5kIGluZm8gZm9yIHRoZSBjaGFydFxuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHQuYWRkSXNzdWUoXG5cdFx0XHRcdFx0SXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLFxuXHRcdFx0XHRcdElzc3VlU2V2ZXJpdHkuTWVkaXVtLFxuXHRcdFx0XHRcdElzc3VlVHlwZS5LUElfSVNTVUVTLk5PX0NIQVJUX1ZJU1VBTElaQVRJT04gKyBrcGlDb25maWcucXVhbGlmaWVyXG5cdFx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtwaURlZjogS1BJRGVmaW5pdGlvbiA9IHtcblx0XHRcdGlkOiBrcGlJRCxcblx0XHRcdGVudGl0eVNldDoga3BpQ29uZmlnLmVudGl0eVNldCxcblx0XHRcdGRhdGFwb2ludDoge1xuXHRcdFx0XHRwcm9wZXJ0eVBhdGg6IGRhdGFwb2ludEFubm90YXRpb24uVmFsdWUucGF0aCxcblx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGtwaUNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChkYXRhcG9pbnRBbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdHRpdGxlOiBkYXRhcG9pbnRBbm5vdGF0aW9uLlRpdGxlPy50b1N0cmluZygpLFxuXHRcdFx0XHRkZXNjcmlwdGlvbjogZGF0YXBvaW50QW5ub3RhdGlvbi5EZXNjcmlwdGlvbj8udG9TdHJpbmcoKVxuXHRcdFx0fSxcblx0XHRcdHNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9uczogdGFyZ2V0S1BJLlNlbGVjdGlvblZhcmlhbnRcblx0XHRcdFx0PyBnZXRGaWx0ZXJEZWZpbml0aW9uc0Zyb21TZWxlY3Rpb25WYXJpYW50KHRhcmdldEtQSS5TZWxlY3Rpb25WYXJpYW50KVxuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdGNhcmQ6IGNhcmREZWZcblx0XHR9O1xuXG5cdFx0Ly8gVW5pdCBvciBjdXJyZW5jeVxuXHRcdGNvbnN0IHRhcmdldFZhbHVlUHJvcGVydHkgPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlZhbHVlLiR0YXJnZXQgYXMgUHJvcGVydHk7XG5cdFx0aWYgKHRhcmdldFZhbHVlUHJvcGVydHkuYW5ub3RhdGlvbnMuTWVhc3VyZXM/LklTT0N1cnJlbmN5KSB7XG5cdFx0XHRjb25zdCBjdXJyZW5jeSA9IHRhcmdldFZhbHVlUHJvcGVydHkuYW5ub3RhdGlvbnMuTWVhc3VyZXM/LklTT0N1cnJlbmN5O1xuXHRcdFx0aWYgKGlzUGF0aEV4cHJlc3Npb24oY3VycmVuY3kpKSB7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudW5pdCA9IHtcblx0XHRcdFx0XHR2YWx1ZTogKChjdXJyZW5jeS4kdGFyZ2V0IGFzIHVua25vd24pIGFzIFByb3BlcnR5KS5uYW1lLFxuXHRcdFx0XHRcdGlzQ3VycmVuY3k6IHRydWUsXG5cdFx0XHRcdFx0aXNQYXRoOiB0cnVlXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LnVuaXQgPSB7XG5cdFx0XHRcdFx0dmFsdWU6IGN1cnJlbmN5LnRvU3RyaW5nKCksXG5cdFx0XHRcdFx0aXNDdXJyZW5jeTogdHJ1ZSxcblx0XHRcdFx0XHRpc1BhdGg6IGZhbHNlXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0YXJnZXRWYWx1ZVByb3BlcnR5LmFubm90YXRpb25zLk1lYXN1cmVzPy5Vbml0KSB7XG5cdFx0XHRjb25zdCB1bml0ID0gdGFyZ2V0VmFsdWVQcm9wZXJ0eS5hbm5vdGF0aW9ucy5NZWFzdXJlcz8uVW5pdDtcblx0XHRcdGlmIChpc1BhdGhFeHByZXNzaW9uKHVuaXQpKSB7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudW5pdCA9IHtcblx0XHRcdFx0XHR2YWx1ZTogKCh1bml0LiR0YXJnZXQgYXMgdW5rbm93bikgYXMgUHJvcGVydHkpLm5hbWUsXG5cdFx0XHRcdFx0aXNDdXJyZW5jeTogZmFsc2UsXG5cdFx0XHRcdFx0aXNQYXRoOiB0cnVlXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LnVuaXQgPSB7XG5cdFx0XHRcdFx0dmFsdWU6IHVuaXQudG9TdHJpbmcoKSxcblx0XHRcdFx0XHRpc0N1cnJlbmN5OiBmYWxzZSxcblx0XHRcdFx0XHRpc1BhdGg6IGZhbHNlXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ3JpdGljYWxpdHlcblx0XHRpZiAoZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eSkge1xuXHRcdFx0aWYgKHR5cGVvZiBkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdC8vIENyaXRpY2FsaXR5IGlzIGEgcGF0aCAtLT4gY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgYWdncmVnYXRhYmxlXG5cdFx0XHRcdGNvbnN0IGNyaXRpY2FsaXR5UHJvcGVydHkgPSAoZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eSBhcyBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248Q3JpdGljYWxpdHlUeXBlPilcblx0XHRcdFx0XHQuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0XHRcdFx0aWYgKGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlBZ2dyZWdhdGFibGUoY3JpdGljYWxpdHlQcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aCA9IChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5IGFzIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxDcml0aWNhbGl0eVR5cGU+KS5wYXRoO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIFRoZSBwcm9wZXJ0eSBpc24ndCBhZ2dyZWdhdGFibGUgLS0+IHdlIGlnbm9yZSBpdFxuXHRcdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlWYWx1ZSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIENyaXRpY2FsaXR5IGlzIGFuIGVudW0gVmFsdWUgLS0+IGdldCB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdmFsdWVcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eVZhbHVlID0gZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHkpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uKSB7XG5cdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlID0gZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLkltcHJvdmVtZW50RGlyZWN0aW9uO1xuXHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcyA9IFtdO1xuXHRcdFx0c3dpdGNoIChrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvVGFyZ2V0XCI6XG5cdFx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKFxuXHRcdFx0XHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLkRldmlhdGlvblJhbmdlTG93VmFsdWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChcblx0XHRcdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5Ub2xlcmFuY2VSYW5nZUxvd1ZhbHVlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzLnB1c2goXG5cdFx0XHRcdFx0XHRkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uQWNjZXB0YW5jZVJhbmdlTG93VmFsdWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChcblx0XHRcdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5BY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChcblx0XHRcdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5Ub2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKFxuXHRcdFx0XHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLkRldmlhdGlvblJhbmdlSGlnaFZhbHVlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiVUkuSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlL01pbmltaXplXCI6XG5cdFx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKFxuXHRcdFx0XHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLkFjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKFxuXHRcdFx0XHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLlRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzLnB1c2goXG5cdFx0XHRcdFx0XHRkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvTWF4aW1pemVcIjpcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzLnB1c2goXG5cdFx0XHRcdFx0XHRkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKFxuXHRcdFx0XHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLlRvbGVyYW5jZVJhbmdlTG93VmFsdWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChcblx0XHRcdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5BY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlWYWx1ZSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdFx0fVxuXG5cdFx0Ly8gVHJlbmRcblx0XHRpZiAoZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdC8vIFRyZW5kIGlzIGEgcGF0aCAtLT4gY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgYWdncmVnYXRhYmxlXG5cdFx0XHRcdGNvbnN0IHRyZW5kUHJvcGVydHkgPSAoZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZCBhcyBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248VHJlbmRUeXBlPikuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0XHRcdFx0aWYgKGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlBZ2dyZWdhdGFibGUodHJlbmRQcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LnRyZW5kUGF0aCA9IChkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kIGFzIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxUcmVuZFR5cGU+KS5wYXRoO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIFRoZSBwcm9wZXJ0eSBpc24ndCBhZ2dyZWdhdGFibGUgLS0+IHdlIGlnbm9yZSBpdFxuXHRcdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRWYWx1ZSA9IFwiTm9uZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBUcmVuZCBpcyBhbiBlbnVtIFZhbHVlIC0tPiBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHZhbHVlXG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRWYWx1ZSA9IGdldERldmlhdGlvbkluZGljYXRvckZyb21UcmVuZFR5cGUoZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24pIHtcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvbklzUmVsYXRpdmUgPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uSXNSZWxhdGl2ZURpZmZlcmVuY2UgPyB0cnVlIDogZmFsc2U7XG5cdFx0XHRpZiAoZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZENhbGN1bGF0aW9uLlJlZmVyZW5jZVZhbHVlLiR0YXJnZXQpIHtcblx0XHRcdFx0Ly8gUmVmZXJlbmNlIHZhbHVlIGlzIGEgcGF0aCAtLT4gY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgYWdncmVnYXRhYmxlXG5cdFx0XHRcdGNvbnN0IHJlZmVyZW5jZVByb3BlcnR5ID0gZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZENhbGN1bGF0aW9uLlJlZmVyZW5jZVZhbHVlLiR0YXJnZXQgYXMgUHJvcGVydHk7XG5cdFx0XHRcdGlmIChhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5QWdncmVnYXRhYmxlKHJlZmVyZW5jZVByb3BlcnR5KSkge1xuXHRcdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGggPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uUmVmZXJlbmNlVmFsdWUucGF0aDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBUaGUgcHJvcGVydHkgaXNuJ3QgYWdncmVnYXRhYmxlIC0tPiB3ZSBpZ25vcmUgaXQgYW5kIHN3aXRjaCBiYWNrIHRvIHRyZW5kICdOb25lJ1xuXHRcdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRWYWx1ZSA9IFwiTm9uZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBSZWZlcmVuY2UgdmFsdWUgaXMgYSBzdGF0aWMgdmFsdWVcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWUgPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uUmVmZXJlbmNlVmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGggIT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZSAhPT0gdW5kZWZpbmVkXG5cdFx0XHQpIHtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uVHJlc2hvbGRzID0gW1xuXHRcdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5TdHJvbmdEb3duRGlmZmVyZW5jZS52YWx1ZU9mKCkgYXMgbnVtYmVyLFxuXHRcdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5Eb3duRGlmZmVyZW5jZS52YWx1ZU9mKCkgYXMgbnVtYmVyLFxuXHRcdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5VcERpZmZlcmVuY2UudmFsdWVPZigpIGFzIG51bWJlcixcblx0XHRcdFx0XHRkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uU3Ryb25nVXBEaWZmZXJlbmNlLnZhbHVlT2YoKSBhcyBudW1iZXJcblx0XHRcdFx0XTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0a3BpRGVmLmRhdGFwb2ludC50cmVuZFZhbHVlID0gXCJOb25lXCI7XG5cdFx0fVxuXG5cdFx0Ly8gVGFyZ2V0IHZhbHVlXG5cdFx0aWYgKGRhdGFwb2ludEFubm90YXRpb24uVGFyZ2V0VmFsdWUpIHtcblx0XHRcdGlmIChkYXRhcG9pbnRBbm5vdGF0aW9uLlRhcmdldFZhbHVlLiR0YXJnZXQpIHtcblx0XHRcdFx0Ly8gVGFyZ2V0IHZhbHVlIGlzIGEgcGF0aCAtLT4gY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgYWdncmVnYXRhYmxlIChvdGhlcndpc2UgaWdub3JlKVxuXHRcdFx0XHRjb25zdCB0YXJnZXRQcm9wZXJ0eSA9IGRhdGFwb2ludEFubm90YXRpb24uVGFyZ2V0VmFsdWUuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0XHRcdFx0aWYgKGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlBZ2dyZWdhdGFibGUodGFyZ2V0UHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC50YXJnZXRQYXRoID0gZGF0YXBvaW50QW5ub3RhdGlvbi5UYXJnZXRWYWx1ZS5wYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBUYXJnZXQgdmFsdWUgaXMgYSBzdGF0aWMgdmFsdWVcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC50YXJnZXRWYWx1ZSA9IGRhdGFwb2ludEFubm90YXRpb24uVGFyZ2V0VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGtwaURlZjtcblx0fSBlbHNlIHtcblx0XHRpZiAoIXRhcmdldEtQSSkge1xuXHRcdFx0Ly8gQ291bGRuJ3QgZmluZCBhIEtQSSB3aXRoIHRoZSBxdWFsaWZpZXIgc3BlY2lmaWVkIGluIHRoZSBtYW5pZmVzdFxuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHQuYWRkSXNzdWUoSXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLCBJc3N1ZVNldmVyaXR5Lk1lZGl1bSwgSXNzdWVUeXBlLktQSV9JU1NVRVMuS1BJX05PVF9GT1VORCArIGtwaUNvbmZpZy5xdWFsaWZpZXIpO1xuXHRcdH0gZWxzZSBpZiAoIXRhcmdldEtQSS5EZXRhaWw/LkRlZmF1bHRQcmVzZW50YXRpb25WYXJpYW50KSB7XG5cdFx0XHQvLyBObyBLUEkgZGV0YWlsL2RlZmF1bHQgcHJlc2VudGF0aW9uIHZhcmlhbnRcblx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0LmdldERpYWdub3N0aWNzKClcblx0XHRcdFx0LmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbiwgSXNzdWVTZXZlcml0eS5NZWRpdW0sIElzc3VlVHlwZS5LUElfSVNTVUVTLktQSV9ERVRBSUxfTk9UX0ZPVU5EICsga3BpQ29uZmlnLnF1YWxpZmllcik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEVudGl0eSBkb2Vzbid0IHN1cHBvcnQgYW5hbHl0aWNzXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHRcdC5hZGRJc3N1ZShJc3N1ZUNhdGVnb3J5LkFubm90YXRpb24sIElzc3VlU2V2ZXJpdHkuTWVkaXVtLCBJc3N1ZVR5cGUuS1BJX0lTU1VFUy5OT19BTkFMWVRJQ1MgKyBrcGlDb25maWcuZW50aXR5U2V0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIEtQSSBkZWZpbml0aW9ucyBmcm9tIHRoZSBtYW5pZmVzdCBhbmQgdGhlIGFubm90YXRpb25zLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQgZm9yIHRoZSBwYWdlXG4gKiBAcmV0dXJucyB7S1BJRGVmaW5pdGlvbltdfSBSZXR1cm5zIGFuIGFycmF5IG9mIEtQSSBkZWZpbml0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0S1BJRGVmaW5pdGlvbnMoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IEtQSURlZmluaXRpb25bXSB7XG5cdGNvbnN0IGtwaUNvbmZpZ3MgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldEtQSUNvbmZpZ3VyYXRpb24oKSxcblx0XHRrcGlEZWZzOiBLUElEZWZpbml0aW9uW10gPSBbXTtcblxuXHRPYmplY3Qua2V5cyhrcGlDb25maWdzKS5mb3JFYWNoKGtwaU5hbWUgPT4ge1xuXHRcdGNvbnN0IG9EZWYgPSBjcmVhdGVLUElEZWZpbml0aW9uKGtwaU5hbWUsIGtwaUNvbmZpZ3Nba3BpTmFtZV0sIGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdGlmIChvRGVmKSB7XG5cdFx0XHRrcGlEZWZzLnB1c2gob0RlZik7XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4ga3BpRGVmcztcbn1cbiJdfQ==
424
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIktQSS50cyJdLCJuYW1lcyI6WyJEZXZpYXRpb25JbmRpY2F0b3JGcm9tVHJlbmRUeXBlIiwiS1BJQ2hhcnRUeXBlRnJvbVVJIiwiY29udmVydEtQSUNoYXJ0IiwiY2hhcnRBbm5vdGF0aW9uIiwicHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24iLCJNZWFzdXJlcyIsInVuZGVmaW5lZCIsImNoYXJEaW1lbnNpb25zIiwiRGltZW5zaW9ucyIsIm1hcCIsInByb3BlcnR5UGF0aCIsImRpbUF0dHJpYnV0ZSIsIkRpbWVuc2lvbkF0dHJpYnV0ZXMiLCJmaW5kIiwiYXR0cmlidXRlIiwiRGltZW5zaW9uIiwidmFsdWUiLCJuYW1lIiwibGFiZWwiLCIkdGFyZ2V0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJMYWJlbCIsInRvU3RyaW5nIiwicm9sZSIsIlJvbGUiLCJyZXBsYWNlIiwiY2hhcnRNZWFzdXJlcyIsIm1lYXN1cmVBdHRyaWJ1dGUiLCJNZWFzdXJlQXR0cmlidXRlcyIsIk1lYXN1cmUiLCJjaGFydFR5cGUiLCJDaGFydFR5cGUiLCJkaW1lbnNpb25zIiwibWVhc3VyZXMiLCJzb3J0T3JkZXIiLCJTb3J0T3JkZXIiLCJQcm9wZXJ0eSIsImRlc2NlbmRpbmciLCJEZXNjZW5kaW5nIiwibWF4SXRlbXMiLCJNYXhJdGVtcyIsInZhbHVlT2YiLCJ1cGRhdGVDdXJyZW5jeSIsImRhdGFwb2ludEFubm90YXRpb24iLCJrcGlEZWYiLCJ0YXJnZXRWYWx1ZVByb3BlcnR5IiwiVmFsdWUiLCJJU09DdXJyZW5jeSIsImN1cnJlbmN5IiwiaXNQYXRoRXhwcmVzc2lvbiIsImRhdGFwb2ludCIsInVuaXQiLCJpc0N1cnJlbmN5IiwiaXNQYXRoIiwiVW5pdCIsInVwZGF0ZUNyaXRpY2FsaXR5IiwiYWdncmVnYXRpb25IZWxwZXIiLCJDcml0aWNhbGl0eSIsImNyaXRpY2FsaXR5UHJvcGVydHkiLCJpc1Byb3BlcnR5QWdncmVnYXRhYmxlIiwiY3JpdGljYWxpdHlQYXRoIiwicGF0aCIsImNyaXRpY2FsaXR5VmFsdWUiLCJNZXNzYWdlVHlwZSIsIk5vbmUiLCJnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUiLCJDcml0aWNhbGl0eUNhbGN1bGF0aW9uIiwiY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUiLCJJbXByb3ZlbWVudERpcmVjdGlvbiIsImNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzIiwicHVzaCIsIkRldmlhdGlvblJhbmdlTG93VmFsdWUiLCJUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlIiwiQWNjZXB0YW5jZVJhbmdlTG93VmFsdWUiLCJBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUiLCJUb2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZSIsIkRldmlhdGlvblJhbmdlSGlnaFZhbHVlIiwidXBkYXRlVHJlbmQiLCJUcmVuZCIsInRyZW5kUHJvcGVydHkiLCJ0cmVuZFBhdGgiLCJ0cmVuZFZhbHVlIiwiVHJlbmRDYWxjdWxhdGlvbiIsInRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlIiwiSXNSZWxhdGl2ZURpZmZlcmVuY2UiLCJSZWZlcmVuY2VWYWx1ZSIsInJlZmVyZW5jZVByb3BlcnR5IiwidHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGgiLCJ0cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWUiLCJ0cmVuZENhbGN1bGF0aW9uVHJlc2hvbGRzIiwiU3Ryb25nRG93bkRpZmZlcmVuY2UiLCJEb3duRGlmZmVyZW5jZSIsIlVwRGlmZmVyZW5jZSIsIlN0cm9uZ1VwRGlmZmVyZW5jZSIsInVwZGF0ZVRhcmdldCIsIlRhcmdldFZhbHVlIiwidGFyZ2V0UHJvcGVydHkiLCJ0YXJnZXRQYXRoIiwidGFyZ2V0VmFsdWUiLCJnZXROYXZpZ2F0aW9uSW5mb0Zyb21Qcm9wZXJ0eSIsInByb3BlcnR5Iiwic2VtYW50aWNPYmplY3RBbm5vdGF0aW9uIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJhbm5vdGF0aW9uS2V5IiwiYW5ub3RhdGlvbiIsInRlcm0iLCJxdWFsaWZpZXIiLCJyZXN1bHQiLCJzZW1hbnRpY09iamVjdCIsInVuYXZhaWxhYmxlQWN0aW9ucyIsImtleSIsImNyZWF0ZUtQSURlZmluaXRpb24iLCJrcGlOYW1lIiwia3BpQ29uZmlnIiwiY29udmVydGVyQ29udGV4dCIsImtwaUNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yIiwiZW50aXR5U2V0IiwiQWdncmVnYXRpb25IZWxwZXIiLCJnZXRFbnRpdHlUeXBlIiwiaXNBbmFseXRpY3NTdXBwb3J0ZWQiLCJnZXREaWFnbm9zdGljcyIsImFkZElzc3VlIiwiSXNzdWVDYXRlZ29yeSIsIkFubm90YXRpb24iLCJJc3N1ZVNldmVyaXR5IiwiTWVkaXVtIiwiSXNzdWVUeXBlIiwiS1BJX0lTU1VFUyIsIk5PX0FOQUxZVElDUyIsInNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwibmF2aWdhdGlvbkluZm8iLCJhS1BJQW5ub3RhdGlvbnMiLCJnZXRBbm5vdGF0aW9uc0J5VGVybSIsInRhcmdldEtQSSIsImtwaSIsIkRhdGFQb2ludCIsIlNlbGVjdGlvblZhcmlhbnQiLCJEZXRhaWwiLCJEZWZhdWx0UHJlc2VudGF0aW9uVmFyaWFudCIsIlZpc3VhbGl6YXRpb25zIiwidml6IiwiJFR5cGUiLCJTZW1hbnRpY09iamVjdCIsImFjdGlvbiIsIkFjdGlvbiIsImFTUFZBbm5vdGF0aW9ucyIsInRhcmdldFNQViIsInNwdiIsIlByZXNlbnRhdGlvblZhcmlhbnQiLCJLUElfTk9UX0ZPVU5EIiwiS1BJX0RFVEFJTF9OT1RfRk9VTkQiLCJkYXRhcG9pbnRQcm9wZXJ0eSIsIk1BSU5fUFJPUEVSVFlfTk9UX0FHR1JFR0FUQUJMRSIsImNoYXJ0RGVmIiwiaWQiLCJLUElJRCIsImFubm90YXRpb25QYXRoIiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsInRpdGxlIiwiVGl0bGUiLCJkZXNjcmlwdGlvbiIsIkRlc2NyaXB0aW9uIiwic2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zIiwiZ2V0RmlsdGVyRGVmaW5pdGlvbnNGcm9tU2VsZWN0aW9uVmFyaWFudCIsImNoYXJ0IiwiZGV0YWlsTmF2aWdhdGlvbiIsIm91dGJvdW5kTmF2aWdhdGlvbiIsIm5hdmlnYXRpb24iLCJnZXRLUElEZWZpbml0aW9ucyIsImtwaUNvbmZpZ3MiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXRLUElDb25maWd1cmF0aW9uIiwia3BpRGVmcyIsIm9EZWYiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQTBFQSxNQUFNQSwrQkFBdUQsR0FBRztBQUMvRCw2QkFBeUIsSUFEc0M7QUFFL0QsdUJBQW1CLElBRjRDO0FBRy9ELCtCQUEyQixNQUhvQztBQUkvRCx5QkFBcUIsTUFKMEM7QUFLL0QsNkJBQXlCO0FBTHNDLEdBQWhFO0FBUUEsTUFBTUMsa0JBQTBDLEdBQUc7QUFDbEQsa0NBQThCLGVBRG9CO0FBRWxELCtCQUEyQixZQUZ1QjtBQUdsRCwwQkFBc0IsT0FINEI7QUFJbEQseUJBQXFCLE1BSjZCO0FBS2xELDJCQUF1QixRQUwyQjtBQU1sRCwyQkFBdUIsUUFOMkI7QUFPbEQsd0JBQW9CLEtBUDhCO0FBUWxELG1DQUErQixpQkFSbUI7QUFTbEQsZ0NBQTRCLGFBVHNCO0FBVWxELDRCQUF3QjtBQVYwQixHQUFuRDs7QUFhQSxXQUFTQyxlQUFULENBQXlCQyxlQUF6QixFQUFpREMsNkJBQWpELEVBQXFJO0FBQUE7O0FBQ3BJLFFBQUlELGVBQWUsQ0FBQ0UsUUFBaEIsS0FBNkJDLFNBQWpDLEVBQTRDO0FBQzNDO0FBQ0EsYUFBT0EsU0FBUDtBQUNBOztBQUVELFFBQU1DLGNBQWMsR0FBR0osZUFBZSxDQUFDSyxVQUFoQixHQUNuQkwsZUFBZSxDQUFDSyxVQUFqQixDQUErQ0MsR0FBL0MsQ0FBbUQsVUFBQUMsWUFBWSxFQUFJO0FBQUE7O0FBQ25FLFVBQU1DLFlBQVksNEJBQUdSLGVBQWUsQ0FBQ1MsbUJBQW5C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O0FBQ0E7QUFDRCxLQUxEO0FBT0EsV0FBT0QsT0FBUDtBQUNBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBLUElDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4uLy4uL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXJcIjtcbmltcG9ydCB7XG5cdEFubm90YXRpb25UZXJtLFxuXHRVSUFubm90YXRpb25UZXJtcyxcblx0VUlBbm5vdGF0aW9uVHlwZXMsXG5cdFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0Q3JpdGljYWxpdHlUeXBlLFxuXHRJbXByb3ZlbWVudERpcmVjdGlvblR5cGVcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRLUElUeXBlLFxuXHRTZWxlY3Rpb25QcmVzZW50YXRpb25WYXJpYW50VHlwZSxcblx0UHJlc2VudGF0aW9uVmFyaWFudCxcblx0U2VsZWN0aW9uVmFyaWFudCxcblx0RGF0YVBvaW50LFxuXHRDaGFydCxcblx0VHJlbmRUeXBlXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9VSVwiO1xuaW1wb3J0IHsgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvRWRtXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBLUElJRCB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0lEXCI7XG5pbXBvcnQgeyBpc1BhdGhFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCB7IE1lc3NhZ2VUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2Zvcm1hdHRlcnMvVGFibGVGb3JtYXR0ZXJUeXBlc1wiO1xuaW1wb3J0IHsgQWdncmVnYXRpb25IZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9BZ2dyZWdhdGlvblwiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVTZXZlcml0eSwgSXNzdWVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB7IGdldE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5VHlwZSB9IGZyb20gXCIuL0NyaXRpY2FsaXR5XCI7XG5pbXBvcnQgeyBnZXRGaWx0ZXJEZWZpbml0aW9uc0Zyb21TZWxlY3Rpb25WYXJpYW50LCBGaWx0ZXJEZWZpbml0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9TZWxlY3Rpb25WYXJpYW50SGVscGVyXCI7XG5pbXBvcnQgeyBDb21tb25Bbm5vdGF0aW9uVGVybXMsIFNlbWFudGljT2JqZWN0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL0NvbW1vblwiO1xuXG5leHBvcnQgdHlwZSBOYXZpZ2F0aW9uSW5mbyA9IHtcblx0c2VtYW50aWNPYmplY3Q/OiBzdHJpbmc7XG5cdGFjdGlvbj86IHN0cmluZztcblx0dW5hdmFpbGFibGVBY3Rpb25zPzogc3RyaW5nW107XG5cdG91dGJvdW5kTmF2aWdhdGlvbj86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEtQSUNoYXJ0RGVmaW5pdGlvbiA9IHtcblx0Y2hhcnRUeXBlOiBzdHJpbmc7XG5cdGRpbWVuc2lvbnM6IHsgbmFtZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyByb2xlPzogc3RyaW5nIH1bXTtcblx0bWVhc3VyZXM6IHsgbmFtZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyByb2xlPzogc3RyaW5nIH1bXTtcblx0c29ydE9yZGVyPzogeyBuYW1lOiBzdHJpbmc7IGRlc2NlbmRpbmc6IGJvb2xlYW4gfVtdO1xuXHRtYXhJdGVtcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEtQSURlZmluaXRpb24gPSB7XG5cdGlkOiBzdHJpbmc7XG5cdGVudGl0eVNldDogc3RyaW5nO1xuXHRkYXRhcG9pbnQ6IHtcblx0XHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRcdHByb3BlcnR5UGF0aDogc3RyaW5nO1xuXHRcdHVuaXQ/OiB7XG5cdFx0XHR2YWx1ZTogc3RyaW5nO1xuXHRcdFx0aXNQYXRoOiBib29sZWFuO1xuXHRcdFx0aXNDdXJyZW5jeTogYm9vbGVhbjtcblx0XHR9O1xuXHRcdGNyaXRpY2FsaXR5UGF0aD86IHN0cmluZztcblx0XHRjcml0aWNhbGl0eVZhbHVlPzogTWVzc2FnZVR5cGU7XG5cdFx0Y3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGU/OiBJbXByb3ZlbWVudERpcmVjdGlvblR5cGU7XG5cdFx0Y3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHM/OiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXTtcblx0XHR0aXRsZT86IHN0cmluZztcblx0XHRkZXNjcmlwdGlvbj86IHN0cmluZztcblx0XHR0cmVuZFBhdGg/OiBzdHJpbmc7XG5cdFx0dHJlbmRWYWx1ZT86IHN0cmluZztcblx0XHR0cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWU/OiBudW1iZXI7XG5cdFx0dHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGg/OiBzdHJpbmc7XG5cdFx0dHJlbmRDYWxjdWxhdGlvblRyZXNob2xkcz86IChudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsKVtdO1xuXHRcdHRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlPzogYm9vbGVhbjtcblx0XHR0YXJnZXRWYWx1ZT86IG51bWJlcjtcblx0XHR0YXJnZXRQYXRoPzogc3RyaW5nO1xuXHR9O1xuXHRjaGFydDogS1BJQ2hhcnREZWZpbml0aW9uO1xuXHRzZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnM/OiBGaWx0ZXJEZWZpbml0aW9uW107XG5cdG5hdmlnYXRpb24/OiBOYXZpZ2F0aW9uSW5mbztcbn07XG5cbmNvbnN0IERldmlhdGlvbkluZGljYXRvckZyb21UcmVuZFR5cGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG5cdFwiVUkuVHJlbmRUeXBlL1N0cm9uZ1VwXCI6IFwiVXBcIixcblx0XCJVSS5UcmVuZFR5cGUvVXBcIjogXCJVcFwiLFxuXHRcIlVJLlRyZW5kVHlwZS9TdHJvbmdEb3duXCI6IFwiRG93blwiLFxuXHRcIlVJLlRyZW5kVHlwZS9Eb3duXCI6IFwiRG93blwiLFxuXHRcIlVJLlRyZW5kVHlwZS9TaWRld2F5c1wiOiBcIk5vbmVcIlxufTtcblxuY29uc3QgS1BJQ2hhcnRUeXBlRnJvbVVJOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuXHRcIlVJLkNoYXJ0VHlwZS9Db2x1bW5TdGFja2VkXCI6IFwiU3RhY2tlZENvbHVtblwiLFxuXHRcIlVJLkNoYXJ0VHlwZS9CYXJTdGFja2VkXCI6IFwiU3RhY2tlZEJhclwiLFxuXHRcIlVJLkNoYXJ0VHlwZS9Eb251dFwiOiBcIkRvbnV0XCIsXG5cdFwiVUkuQ2hhcnRUeXBlL0xpbmVcIjogXCJMaW5lXCIsXG5cdFwiVUkuQ2hhcnRUeXBlL0J1YmJsZVwiOiBcImJ1YmJsZVwiLFxuXHRcIlVJLkNoYXJ0VHlwZS9Db2x1bW5cIjogXCJjb2x1bW5cIixcblx0XCJVSS5DaGFydFR5cGUvQmFyXCI6IFwiYmFyXCIsXG5cdFwiVUkuQ2hhcnRUeXBlL1ZlcnRpY2FsQnVsbGV0XCI6IFwidmVydGljYWxfYnVsbGV0XCIsXG5cdFwiVUkuQ2hhcnRUeXBlL0NvbWJpbmF0aW9uXCI6IFwiY29tYmluYXRpb25cIixcblx0XCJVSS5DaGFydFR5cGUvU2NhdHRlclwiOiBcInNjYXR0ZXJcIlxufTtcblxuZnVuY3Rpb24gY29udmVydEtQSUNoYXJ0KGNoYXJ0QW5ub3RhdGlvbjogQ2hhcnQsIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50KTogS1BJQ2hhcnREZWZpbml0aW9uIHwgdW5kZWZpbmVkIHtcblx0aWYgKGNoYXJ0QW5ub3RhdGlvbi5NZWFzdXJlcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gV2UgbmVlZCBhdCBsZWFzdCAxIG1lYXN1cmUgKGJ1dCBubyBkaW1lbnNpb24gaXMgYWxsb3dlZCwgZS5nLiBmb3IgYnViYmxlIGNoYXJ0KVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRjb25zdCBjaGFyRGltZW5zaW9ucyA9IGNoYXJ0QW5ub3RhdGlvbi5EaW1lbnNpb25zXG5cdFx0PyAoY2hhcnRBbm5vdGF0aW9uLkRpbWVuc2lvbnMgYXMgUHJvcGVydHlQYXRoW10pLm1hcChwcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0XHRjb25zdCBkaW1BdHRyaWJ1dGUgPSBjaGFydEFubm90YXRpb24uRGltZW5zaW9uQXR0cmlidXRlcz8uZmluZChhdHRyaWJ1dGUgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBhdHRyaWJ1dGUuRGltZW5zaW9uPy52YWx1ZSA9PT0gcHJvcGVydHlQYXRoLnZhbHVlO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRuYW1lOiBwcm9wZXJ0eVBhdGgudmFsdWUsXG5cdFx0XHRcdFx0bGFiZWw6IHByb3BlcnR5UGF0aC4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbj8uTGFiZWw/LnRvU3RyaW5nKCkgfHwgcHJvcGVydHlQYXRoLnZhbHVlLFxuXHRcdFx0XHRcdHJvbGU6IGRpbUF0dHJpYnV0ZT8uUm9sZT8ucmVwbGFjZShcIlVJLkNoYXJ0RGltZW5zaW9uUm9sZVR5cGUvXCIsIFwiXCIpXG5cdFx0XHRcdH07XG5cdFx0ICB9KVxuXHRcdDogW107XG5cblx0Y29uc3QgY2hhcnRNZWFzdXJlcyA9IChjaGFydEFubm90YXRpb24uTWVhc3VyZXMgYXMgUHJvcGVydHlQYXRoW10pLm1hcChwcm9wZXJ0eVBhdGggPT4ge1xuXHRcdGNvbnN0IG1lYXN1cmVBdHRyaWJ1dGUgPSBjaGFydEFubm90YXRpb24uTWVhc3VyZUF0dHJpYnV0ZXM/LmZpbmQoYXR0cmlidXRlID0+IHtcblx0XHRcdHJldHVybiBhdHRyaWJ1dGUuTWVhc3VyZT8udmFsdWUgPT09IHByb3BlcnR5UGF0aC52YWx1ZTtcblx0XHR9KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bmFtZTogcHJvcGVydHlQYXRoLnZhbHVlLFxuXHRcdFx0bGFiZWw6IHByb3BlcnR5UGF0aC4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbj8uTGFiZWw/LnRvU3RyaW5nKCkgfHwgcHJvcGVydHlQYXRoLnZhbHVlLFxuXHRcdFx0cm9sZTogbWVhc3VyZUF0dHJpYnV0ZT8uUm9sZT8ucmVwbGFjZShcIlVJLkNoYXJ0TWVhc3VyZVJvbGVUeXBlL1wiLCBcIlwiKVxuXHRcdH07XG5cdH0pO1xuXG5cdHJldHVybiB7XG5cdFx0Y2hhcnRUeXBlOiBLUElDaGFydFR5cGVGcm9tVUlbY2hhcnRBbm5vdGF0aW9uLkNoYXJ0VHlwZV0gfHwgXCJMaW5lXCIsXG5cdFx0ZGltZW5zaW9uczogY2hhckRpbWVuc2lvbnMsXG5cdFx0bWVhc3VyZXM6IGNoYXJ0TWVhc3VyZXMsXG5cdFx0c29ydE9yZGVyOiBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uU29ydE9yZGVyPy5tYXAoc29ydE9yZGVyID0+IHtcblx0XHRcdHJldHVybiB7IG5hbWU6IHNvcnRPcmRlci5Qcm9wZXJ0eT8udmFsdWUgfHwgXCJcIiwgZGVzY2VuZGluZzogISFzb3J0T3JkZXIuRGVzY2VuZGluZyB9O1xuXHRcdH0pLFxuXHRcdG1heEl0ZW1zOiBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uTWF4SXRlbXM/LnZhbHVlT2YoKSBhcyBudW1iZXJcblx0fTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ3VycmVuY3koZGF0YXBvaW50QW5ub3RhdGlvbjogRGF0YVBvaW50LCBrcGlEZWY6IEtQSURlZmluaXRpb24pOiB2b2lkIHtcblx0Y29uc3QgdGFyZ2V0VmFsdWVQcm9wZXJ0eSA9IGRhdGFwb2ludEFubm90YXRpb24uVmFsdWUuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0aWYgKHRhcmdldFZhbHVlUHJvcGVydHkuYW5ub3RhdGlvbnMuTWVhc3VyZXM/LklTT0N1cnJlbmN5KSB7XG5cdFx0Y29uc3QgY3VycmVuY3kgPSB0YXJnZXRWYWx1ZVByb3BlcnR5LmFubm90YXRpb25zLk1lYXN1cmVzPy5JU09DdXJyZW5jeTtcblx0XHRpZiAoaXNQYXRoRXhwcmVzc2lvbihjdXJyZW5jeSkpIHtcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudW5pdCA9IHtcblx0XHRcdFx0dmFsdWU6ICgoY3VycmVuY3kuJHRhcmdldCBhcyB1bmtub3duKSBhcyBQcm9wZXJ0eSkubmFtZSxcblx0XHRcdFx0aXNDdXJyZW5jeTogdHJ1ZSxcblx0XHRcdFx0aXNQYXRoOiB0cnVlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRrcGlEZWYuZGF0YXBvaW50LnVuaXQgPSB7XG5cdFx0XHRcdHZhbHVlOiBjdXJyZW5jeS50b1N0cmluZygpLFxuXHRcdFx0XHRpc0N1cnJlbmN5OiB0cnVlLFxuXHRcdFx0XHRpc1BhdGg6IGZhbHNlXG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIGlmICh0YXJnZXRWYWx1ZVByb3BlcnR5LmFubm90YXRpb25zLk1lYXN1cmVzPy5Vbml0KSB7XG5cdFx0Y29uc3QgdW5pdCA9IHRhcmdldFZhbHVlUHJvcGVydHkuYW5ub3RhdGlvbnMuTWVhc3VyZXM/LlVuaXQ7XG5cdFx0aWYgKGlzUGF0aEV4cHJlc3Npb24odW5pdCkpIHtcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudW5pdCA9IHtcblx0XHRcdFx0dmFsdWU6ICgodW5pdC4kdGFyZ2V0IGFzIHVua25vd24pIGFzIFByb3BlcnR5KS5uYW1lLFxuXHRcdFx0XHRpc0N1cnJlbmN5OiBmYWxzZSxcblx0XHRcdFx0aXNQYXRoOiB0cnVlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRrcGlEZWYuZGF0YXBvaW50LnVuaXQgPSB7XG5cdFx0XHRcdHZhbHVlOiB1bml0LnRvU3RyaW5nKCksXG5cdFx0XHRcdGlzQ3VycmVuY3k6IGZhbHNlLFxuXHRcdFx0XHRpc1BhdGg6IGZhbHNlXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDcml0aWNhbGl0eShkYXRhcG9pbnRBbm5vdGF0aW9uOiBEYXRhUG9pbnQsIGFnZ3JlZ2F0aW9uSGVscGVyOiBBZ2dyZWdhdGlvbkhlbHBlciwga3BpRGVmOiBLUElEZWZpbml0aW9uKTogdm9pZCB7XG5cdGlmIChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5KSB7XG5cdFx0aWYgKHR5cGVvZiBkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHQvLyBDcml0aWNhbGl0eSBpcyBhIHBhdGggLS0+IGNoZWNrIGlmIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IGlzIGFnZ3JlZ2F0YWJsZVxuXHRcdFx0Y29uc3QgY3JpdGljYWxpdHlQcm9wZXJ0eSA9IChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5IGFzIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxDcml0aWNhbGl0eVR5cGU+KS4kdGFyZ2V0IGFzIFByb3BlcnR5O1xuXHRcdFx0aWYgKGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlBZ2dyZWdhdGFibGUoY3JpdGljYWxpdHlQcm9wZXJ0eSkpIHtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGggPSAoZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eSBhcyBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248Q3JpdGljYWxpdHlUeXBlPikucGF0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFRoZSBwcm9wZXJ0eSBpc24ndCBhZ2dyZWdhdGFibGUgLS0+IHdlIGlnbm9yZSBpdFxuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWUgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBDcml0aWNhbGl0eSBpcyBhbiBlbnVtIFZhbHVlIC0tPiBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHZhbHVlXG5cdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWUgPSBnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUoZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eSk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbikge1xuXHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUgPSBkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uSW1wcm92ZW1lbnREaXJlY3Rpb247XG5cdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcyA9IFtdO1xuXHRcdHN3aXRjaCAoa3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uTW9kZSkge1xuXHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9UYXJnZXRcIjpcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5EZXZpYXRpb25SYW5nZUxvd1ZhbHVlKTtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5Ub2xlcmFuY2VSYW5nZUxvd1ZhbHVlKTtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5BY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSk7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uQWNjZXB0YW5jZVJhbmdlSGlnaFZhbHVlKTtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5Ub2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZSk7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWUpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9NaW5pbWl6ZVwiOlxuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzLnB1c2goZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLkFjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZSk7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWUpO1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzLnB1c2goZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLkRldmlhdGlvblJhbmdlSGlnaFZhbHVlKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvTWF4aW1pemVcIjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZSk7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSk7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uQWNjZXB0YW5jZVJhbmdlTG93VmFsdWUpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWUgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVRyZW5kKGRhdGFwb2ludEFubm90YXRpb246IERhdGFQb2ludCwgYWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLCBrcGlEZWY6IEtQSURlZmluaXRpb24pOiB2b2lkIHtcblx0aWYgKGRhdGFwb2ludEFubm90YXRpb24uVHJlbmQpIHtcblx0XHRpZiAodHlwZW9mIGRhdGFwb2ludEFubm90YXRpb24uVHJlbmQgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdC8vIFRyZW5kIGlzIGEgcGF0aCAtLT4gY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgYWdncmVnYXRhYmxlXG5cdFx0XHRjb25zdCB0cmVuZFByb3BlcnR5ID0gKGRhdGFwb2ludEFubm90YXRpb24uVHJlbmQgYXMgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPFRyZW5kVHlwZT4pLiR0YXJnZXQgYXMgUHJvcGVydHk7XG5cdFx0XHRpZiAoYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUFnZ3JlZ2F0YWJsZSh0cmVuZFByb3BlcnR5KSkge1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LnRyZW5kUGF0aCA9IChkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kIGFzIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxUcmVuZFR5cGU+KS5wYXRoO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gVGhlIHByb3BlcnR5IGlzbid0IGFnZ3JlZ2F0YWJsZSAtLT4gd2UgaWdub3JlIGl0XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRWYWx1ZSA9IFwiTm9uZVwiO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUcmVuZCBpcyBhbiBlbnVtIFZhbHVlIC0tPiBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHZhbHVlXG5cdFx0XHRrcGlEZWYuZGF0YXBvaW50LnRyZW5kVmFsdWUgPSBEZXZpYXRpb25JbmRpY2F0b3JGcm9tVHJlbmRUeXBlW2RhdGFwb2ludEFubm90YXRpb24uVHJlbmRdIHx8IFwiTm9uZVwiO1xuXHRcdH1cblx0fSBlbHNlIGlmIChkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24pIHtcblx0XHRrcGlEZWYuZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlID0gZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZENhbGN1bGF0aW9uLklzUmVsYXRpdmVEaWZmZXJlbmNlID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdGlmIChkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uUmVmZXJlbmNlVmFsdWUuJHRhcmdldCkge1xuXHRcdFx0Ly8gUmVmZXJlbmNlIHZhbHVlIGlzIGEgcGF0aCAtLT4gY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgYWdncmVnYXRhYmxlXG5cdFx0XHRjb25zdCByZWZlcmVuY2VQcm9wZXJ0eSA9IGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5SZWZlcmVuY2VWYWx1ZS4kdGFyZ2V0IGFzIFByb3BlcnR5O1xuXHRcdFx0aWYgKGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlBZ2dyZWdhdGFibGUocmVmZXJlbmNlUHJvcGVydHkpKSB7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGggPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uUmVmZXJlbmNlVmFsdWUucGF0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFRoZSBwcm9wZXJ0eSBpc24ndCBhZ2dyZWdhdGFibGUgLS0+IHdlIGlnbm9yZSBpdCBhbmQgc3dpdGNoIGJhY2sgdG8gdHJlbmQgJ05vbmUnXG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRWYWx1ZSA9IFwiTm9uZVwiO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBSZWZlcmVuY2UgdmFsdWUgaXMgYSBzdGF0aWMgdmFsdWVcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlID0gZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZENhbGN1bGF0aW9uLlJlZmVyZW5jZVZhbHVlO1xuXHRcdH1cblx0XHRpZiAoa3BpRGVmLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlUGF0aCAhPT0gdW5kZWZpbmVkIHx8IGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblRyZXNob2xkcyA9IFtcblx0XHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZENhbGN1bGF0aW9uLlN0cm9uZ0Rvd25EaWZmZXJlbmNlLnZhbHVlT2YoKSBhcyBudW1iZXIsXG5cdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5Eb3duRGlmZmVyZW5jZS52YWx1ZU9mKCkgYXMgbnVtYmVyLFxuXHRcdFx0XHRkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uVXBEaWZmZXJlbmNlLnZhbHVlT2YoKSBhcyBudW1iZXIsXG5cdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5TdHJvbmdVcERpZmZlcmVuY2UudmFsdWVPZigpIGFzIG51bWJlclxuXHRcdFx0XTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0a3BpRGVmLmRhdGFwb2ludC50cmVuZFZhbHVlID0gXCJOb25lXCI7XG5cdH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlVGFyZ2V0KGRhdGFwb2ludEFubm90YXRpb246IERhdGFQb2ludCwgYWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLCBrcGlEZWY6IEtQSURlZmluaXRpb24pOiB2b2lkIHtcblx0aWYgKGRhdGFwb2ludEFubm90YXRpb24uVGFyZ2V0VmFsdWUpIHtcblx0XHRpZiAoZGF0YXBvaW50QW5ub3RhdGlvbi5UYXJnZXRWYWx1ZS4kdGFyZ2V0KSB7XG5cdFx0XHQvLyBUYXJnZXQgdmFsdWUgaXMgYSBwYXRoIC0tPiBjaGVjayBpZiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBpcyBhZ2dyZWdhdGFibGUgKG90aGVyd2lzZSBpZ25vcmUpXG5cdFx0XHRjb25zdCB0YXJnZXRQcm9wZXJ0eSA9IGRhdGFwb2ludEFubm90YXRpb24uVGFyZ2V0VmFsdWUuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0XHRcdGlmIChhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5QWdncmVnYXRhYmxlKHRhcmdldFByb3BlcnR5KSkge1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LnRhcmdldFBhdGggPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlRhcmdldFZhbHVlLnBhdGg7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRhcmdldCB2YWx1ZSBpcyBhIHN0YXRpYyB2YWx1ZVxuXHRcdFx0a3BpRGVmLmRhdGFwb2ludC50YXJnZXRWYWx1ZSA9IGRhdGFwb2ludEFubm90YXRpb24uVGFyZ2V0VmFsdWU7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGdldE5hdmlnYXRpb25JbmZvRnJvbVByb3BlcnR5KHByb3BlcnR5OiBQcm9wZXJ0eSk6IE5hdmlnYXRpb25JbmZvIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgYW5ub3RhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEFubm90YXRpb25UZXJtPGFueT4+ID0gcHJvcGVydHkuYW5ub3RhdGlvbnNbXCJDb21tb25cIl0gfHwge307XG5cblx0Ly8gTG9vayBmb3IgdGhlIHNlbWFudGljT2JqZWN0IGFubm90YXRpb24gKGlmIGFueSlcblx0bGV0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvbjogQW5ub3RhdGlvblRlcm08U2VtYW50aWNPYmplY3Q+IHwgdW5kZWZpbmVkO1xuXHRPYmplY3Qua2V5cyhhbm5vdGF0aW9ucykuZm9yRWFjaChhbm5vdGF0aW9uS2V5ID0+IHtcblx0XHRjb25zdCBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnNbYW5ub3RhdGlvbktleV07XG5cdFx0aWYgKGFubm90YXRpb24udGVybSA9PT0gQ29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0KSB7XG5cdFx0XHRpZiAoIWFubm90YXRpb24ucXVhbGlmaWVyIHx8ICFzZW1hbnRpY09iamVjdEFubm90YXRpb24pIHtcblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHRha2UgdGhlIGFubm90YXRpb24gd2l0aG91dCBxdWFsaWZpZXIgaWYgdGhlcmUncyBvbmUsIG90aGVyd2lzZSB3ZSB0YWtlIHRoZSBmaXJzdCBvbmVcblx0XHRcdFx0c2VtYW50aWNPYmplY3RBbm5vdGF0aW9uID0gYW5ub3RhdGlvbjtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdGlmIChzZW1hbnRpY09iamVjdEFubm90YXRpb24pIHtcblx0XHRjb25zdCByZXN1bHQgPSB7XG5cdFx0XHRzZW1hbnRpY09iamVjdDogc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uLnRvU3RyaW5nKCksXG5cdFx0XHR1bmF2YWlsYWJsZUFjdGlvbnM6IFtdXG5cdFx0fTtcblxuXHRcdC8vIExvb2sgZm9yIHRoZSB1bmF2YWlsYWJsZSBhY3Rpb25zIChpZiBhbnkpXG5cdFx0Y29uc3QgYW5ub3RhdGlvbktleSA9IE9iamVjdC5rZXlzKGFubm90YXRpb25zKS5maW5kKGtleSA9PiB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhbm5vdGF0aW9uc1trZXldLnRlcm0gPT09IENvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9ucyAmJlxuXHRcdFx0XHRhbm5vdGF0aW9uc1trZXldLnF1YWxpZmllciA9PT0gc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uPy5xdWFsaWZpZXJcblx0XHRcdCk7XG5cdFx0fSk7XG5cdFx0aWYgKGFubm90YXRpb25LZXkpIHtcblx0XHRcdHJlc3VsdC51bmF2YWlsYWJsZUFjdGlvbnMgPSBhbm5vdGF0aW9uc1thbm5vdGF0aW9uS2V5XTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlS1BJRGVmaW5pdGlvbihrcGlOYW1lOiBzdHJpbmcsIGtwaUNvbmZpZzogS1BJQ29uZmlndXJhdGlvbiwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IEtQSURlZmluaXRpb24gfCB1bmRlZmluZWQge1xuXHRjb25zdCBrcGlDb252ZXJ0ZXJDb250ZXh0ID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKFwiL1wiICsga3BpQ29uZmlnLmVudGl0eVNldCk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGtwaUNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBrcGlDb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRpZiAoIWFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkpIHtcblx0XHQvLyBUaGUgZW50aXR5IGRvZXNuJ3Qgc3VwcG9ydCBhbmFseXRpY2FsIHF1ZXJpZXNcblx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0LmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbiwgSXNzdWVTZXZlcml0eS5NZWRpdW0sIElzc3VlVHlwZS5LUElfSVNTVUVTLk5PX0FOQUxZVElDUyArIGtwaUNvbmZpZy5lbnRpdHlTZXQpO1xuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGxldCBzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbjogU2VsZWN0aW9uVmFyaWFudCB8IHVuZGVmaW5lZDtcblx0bGV0IGRhdGFwb2ludEFubm90YXRpb246IERhdGFQb2ludCB8IHVuZGVmaW5lZDtcblx0bGV0IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50IHwgdW5kZWZpbmVkO1xuXHRsZXQgY2hhcnRBbm5vdGF0aW9uOiBDaGFydCB8IHVuZGVmaW5lZDtcblx0bGV0IG5hdmlnYXRpb25JbmZvOiBOYXZpZ2F0aW9uSW5mbyB8IHVuZGVmaW5lZDtcblxuXHQvLyBTZWFyY2ggZm9yIGEgS1BJIHdpdGggdGhlIHF1YWxpZmllciBmcm1vIHRoZSBtYW5pZmVzdFxuXHRjb25zdCBhS1BJQW5ub3RhdGlvbnMgPSBrcGlDb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiVUlcIiwgVUlBbm5vdGF0aW9uVGVybXMuS1BJKSBhcyBBbm5vdGF0aW9uVGVybTxLUElUeXBlPltdO1xuXHRjb25zdCB0YXJnZXRLUEkgPSBhS1BJQW5ub3RhdGlvbnMuZmluZChrcGkgPT4ge1xuXHRcdHJldHVybiBrcGkucXVhbGlmaWVyID09PSBrcGlDb25maWcucXVhbGlmaWVyO1xuXHR9KTtcblx0aWYgKHRhcmdldEtQSSkge1xuXHRcdGRhdGFwb2ludEFubm90YXRpb24gPSB0YXJnZXRLUEkuRGF0YVBvaW50O1xuXHRcdHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uID0gdGFyZ2V0S1BJLlNlbGVjdGlvblZhcmlhbnQ7XG5cdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gPSB0YXJnZXRLUEkuRGV0YWlsPy5EZWZhdWx0UHJlc2VudGF0aW9uVmFyaWFudDtcblx0XHRjaGFydEFubm90YXRpb24gPSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uVmlzdWFsaXphdGlvbnM/LmZpbmQoKHZpejogYW55KSA9PiB7XG5cdFx0XHRyZXR1cm4gdml6LiR0YXJnZXQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkNoYXJ0RGVmaW5pdGlvblR5cGU7XG5cdFx0fSk/LiR0YXJnZXQgYXMgQ2hhcnQ7XG5cblx0XHRpZiAodGFyZ2V0S1BJLkRldGFpbD8uU2VtYW50aWNPYmplY3QpIHtcblx0XHRcdG5hdmlnYXRpb25JbmZvID0ge1xuXHRcdFx0XHRzZW1hbnRpY09iamVjdDogdGFyZ2V0S1BJLkRldGFpbC5TZW1hbnRpY09iamVjdC50b1N0cmluZygpLFxuXHRcdFx0XHRhY3Rpb246IHRhcmdldEtQSS5EZXRhaWwuQWN0aW9uPy50b1N0cmluZygpLFxuXHRcdFx0XHR1bmF2YWlsYWJsZUFjdGlvbnM6IFtdXG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBGYWxsYmFjazogdHJ5IHRvIGZpbmQgYSBTUFYgd2l0aCB0aGUgc2FtZSBxdWFsaWZpZXJcblx0XHRjb25zdCBhU1BWQW5ub3RhdGlvbnMgPSBrcGlDb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFxuXHRcdFx0XCJVSVwiLFxuXHRcdFx0VUlBbm5vdGF0aW9uVGVybXMuU2VsZWN0aW9uUHJlc2VudGF0aW9uVmFyaWFudFxuXHRcdCkgYXMgQW5ub3RhdGlvblRlcm08U2VsZWN0aW9uUHJlc2VudGF0aW9uVmFyaWFudFR5cGU+W107XG5cdFx0Y29uc3QgdGFyZ2V0U1BWID0gYVNQVkFubm90YXRpb25zLmZpbmQoc3B2ID0+IHtcblx0XHRcdHJldHVybiBzcHYucXVhbGlmaWVyID09PSBrcGlDb25maWcucXVhbGlmaWVyO1xuXHRcdH0pO1xuXHRcdGlmICh0YXJnZXRTUFYpIHtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uID0gdGFyZ2V0U1BWLlNlbGVjdGlvblZhcmlhbnQ7XG5cdFx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiA9IHRhcmdldFNQVi5QcmVzZW50YXRpb25WYXJpYW50O1xuXHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbiA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5WaXN1YWxpemF0aW9ucz8uZmluZCgodml6OiBhbnkpID0+IHtcblx0XHRcdFx0cmV0dXJuIHZpei4kdGFyZ2V0LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlO1xuXHRcdFx0fSk/LiR0YXJnZXQgYXMgRGF0YVBvaW50O1xuXHRcdFx0Y2hhcnRBbm5vdGF0aW9uID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/LlZpc3VhbGl6YXRpb25zPy5maW5kKCh2aXo6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdml6LiR0YXJnZXQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkNoYXJ0RGVmaW5pdGlvblR5cGU7XG5cdFx0XHR9KT8uJHRhcmdldCBhcyBDaGFydDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gQ291bGRuJ3QgZmluZCBhIEtQSSBvciBhIFNQViBhbm5vdGF0aW9uIHdpdGggdGhlIHF1YWxpZmllciBmcm9tIHRoZSBtYW5pZmVzdFxuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHQuYWRkSXNzdWUoSXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLCBJc3N1ZVNldmVyaXR5Lk1lZGl1bSwgSXNzdWVUeXBlLktQSV9JU1NVRVMuS1BJX05PVF9GT1VORCArIGtwaUNvbmZpZy5xdWFsaWZpZXIpO1xuXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdGlmICghcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gfHwgIWRhdGFwb2ludEFubm90YXRpb24gfHwgIWNoYXJ0QW5ub3RhdGlvbikge1xuXHRcdC8vIENvdWxkbid0IGZpbmQgYSBjaGFydCBvciBkYXRhcG9pbnQgZGVmaW5pdGlvblxuXHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHQuYWRkSXNzdWUoSXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLCBJc3N1ZVNldmVyaXR5Lk1lZGl1bSwgSXNzdWVUeXBlLktQSV9JU1NVRVMuS1BJX0RFVEFJTF9OT1RfRk9VTkQgKyBrcGlDb25maWcucXVhbGlmaWVyKTtcblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRjb25zdCBkYXRhcG9pbnRQcm9wZXJ0eSA9IGRhdGFwb2ludEFubm90YXRpb24uVmFsdWUuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0aWYgKCFhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5QWdncmVnYXRhYmxlKGRhdGFwb2ludFByb3BlcnR5KSkge1xuXHRcdC8vIFRoZSBtYWluIHByb3BlcnR5IG9mIHRoZSBLUEkgaXMgbm90IGFnZ3JlZ2F0YWJsZSAtLT4gV2UgY2FuJ3QgY2FsY3VsYXRlIGl0cyB2YWx1ZSBzbyB3ZSBpZ25vcmUgdGhlIEtQSVxuXHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHQuYWRkSXNzdWUoXG5cdFx0XHRcdElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbixcblx0XHRcdFx0SXNzdWVTZXZlcml0eS5NZWRpdW0sXG5cdFx0XHRcdElzc3VlVHlwZS5LUElfSVNTVUVTLk1BSU5fUFJPUEVSVFlfTk9UX0FHR1JFR0FUQUJMRSArIGtwaUNvbmZpZy5xdWFsaWZpZXJcblx0XHRcdCk7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8vIENoYXJ0IGRlZmluaXRpb25cblx0Y29uc3QgY2hhcnREZWYgPSBjb252ZXJ0S1BJQ2hhcnQoY2hhcnRBbm5vdGF0aW9uLCBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbik7XG5cdGlmICghY2hhcnREZWYpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Y29uc3Qga3BpRGVmOiBLUElEZWZpbml0aW9uID0ge1xuXHRcdGlkOiBLUElJRChrcGlOYW1lKSxcblx0XHRlbnRpdHlTZXQ6IGtwaUNvbmZpZy5lbnRpdHlTZXQsXG5cdFx0ZGF0YXBvaW50OiB7XG5cdFx0XHRwcm9wZXJ0eVBhdGg6IGRhdGFwb2ludEFubm90YXRpb24uVmFsdWUucGF0aCxcblx0XHRcdGFubm90YXRpb25QYXRoOiBrcGlDb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YXBvaW50QW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0dGl0bGU6IGRhdGFwb2ludEFubm90YXRpb24uVGl0bGU/LnRvU3RyaW5nKCksXG5cdFx0XHRkZXNjcmlwdGlvbjogZGF0YXBvaW50QW5ub3RhdGlvbi5EZXNjcmlwdGlvbj8udG9TdHJpbmcoKVxuXHRcdH0sXG5cdFx0c2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zOiBzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvblxuXHRcdFx0PyBnZXRGaWx0ZXJEZWZpbml0aW9uc0Zyb21TZWxlY3Rpb25WYXJpYW50KHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uKVxuXHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0Y2hhcnQ6IGNoYXJ0RGVmXG5cdH07XG5cblx0Ly8gTmF2aWdhdGlvblxuXHRpZiAoIW5hdmlnYXRpb25JbmZvKSB7XG5cdFx0Ly8gTm8gbmF2aWdhdGlvbkluZm8gd2FzIGZvdW5kIGluIHRoZSBLUEkgYW5ub3RhdGlvbiAtLT4gdHJ5IHRoZSBvdXRib3VuZCBuYXZpZ2F0aW9uIGZyb20gdGhlIG1hbmlmZXN0XG5cdFx0aWYgKGtwaUNvbmZpZy5kZXRhaWxOYXZpZ2F0aW9uKSB7XG5cdFx0XHRuYXZpZ2F0aW9uSW5mbyA9IHtcblx0XHRcdFx0b3V0Ym91bmROYXZpZ2F0aW9uOiBrcGlDb25maWcuZGV0YWlsTmF2aWdhdGlvblxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gb3V0Ym91bmQgbmF2aWdhdGlvbiBpbiB0aGUgbWFuaWZlc3QgLS0+IHRyeSB0aGUgc2VtYW50aWMgb2JqZWN0IG9uIHRoZSBEYXRhcG9pbnQgdmFsdWVcblx0XHRcdG5hdmlnYXRpb25JbmZvID0gZ2V0TmF2aWdhdGlvbkluZm9Gcm9tUHJvcGVydHkoZGF0YXBvaW50UHJvcGVydHkpO1xuXHRcdH1cblx0fVxuXHRpZiAobmF2aWdhdGlvbkluZm8pIHtcblx0XHRrcGlEZWYubmF2aWdhdGlvbiA9IG5hdmlnYXRpb25JbmZvO1xuXHR9XG5cblx0dXBkYXRlQ3VycmVuY3koZGF0YXBvaW50QW5ub3RhdGlvbiwga3BpRGVmKTtcblx0dXBkYXRlQ3JpdGljYWxpdHkoZGF0YXBvaW50QW5ub3RhdGlvbiwgYWdncmVnYXRpb25IZWxwZXIsIGtwaURlZik7XG5cdHVwZGF0ZVRyZW5kKGRhdGFwb2ludEFubm90YXRpb24sIGFnZ3JlZ2F0aW9uSGVscGVyLCBrcGlEZWYpO1xuXHR1cGRhdGVUYXJnZXQoZGF0YXBvaW50QW5ub3RhdGlvbiwgYWdncmVnYXRpb25IZWxwZXIsIGtwaURlZik7XG5cblx0cmV0dXJuIGtwaURlZjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBLUEkgZGVmaW5pdGlvbnMgZnJvbSB0aGUgbWFuaWZlc3QgYW5kIHRoZSBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0IGZvciB0aGUgcGFnZVxuICogQHJldHVybnMge0tQSURlZmluaXRpb25bXX0gUmV0dXJucyBhbiBhcnJheSBvZiBLUEkgZGVmaW5pdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEtQSURlZmluaXRpb25zKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBLUElEZWZpbml0aW9uW10ge1xuXHRjb25zdCBrcGlDb25maWdzID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXRLUElDb25maWd1cmF0aW9uKCksXG5cdFx0a3BpRGVmczogS1BJRGVmaW5pdGlvbltdID0gW107XG5cblx0T2JqZWN0LmtleXMoa3BpQ29uZmlncykuZm9yRWFjaChrcGlOYW1lID0+IHtcblx0XHRjb25zdCBvRGVmID0gY3JlYXRlS1BJRGVmaW5pdGlvbihrcGlOYW1lLCBrcGlDb25maWdzW2twaU5hbWVdLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRpZiAob0RlZikge1xuXHRcdFx0a3BpRGVmcy5wdXNoKG9EZWYpO1xuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIGtwaURlZnM7XG59XG4iXX0=