@sapui5/sap.fe.core 1.127.2 → 1.129.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 (393) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +3 -9
  4. package/src/sap/fe/core/ActionRuntime.ts +3 -7
  5. package/src/sap/fe/core/AppComponent.js +9 -19
  6. package/src/sap/fe/core/AppComponent.ts +2 -12
  7. package/src/sap/fe/core/AppStateHandler.js +3 -11
  8. package/src/sap/fe/core/AppStateHandler.ts +0 -7
  9. package/src/sap/fe/core/BaseController.js +4 -8
  10. package/src/sap/fe/core/BaseController.ts +0 -5
  11. package/src/sap/fe/core/CommonUtils.js +1 -9
  12. package/src/sap/fe/core/CommonUtils.ts +4 -8
  13. package/src/sap/fe/core/ExtensionAPI.js +10 -25
  14. package/src/sap/fe/core/ExtensionAPI.ts +4 -19
  15. package/src/sap/fe/core/InsightsFormattersExtension.js +5 -3
  16. package/src/sap/fe/core/PageController.js +7 -10
  17. package/src/sap/fe/core/PageController.ts +0 -3
  18. package/src/sap/fe/core/ResourceModel.js +3 -5
  19. package/src/sap/fe/core/ResourceModel.ts +0 -2
  20. package/src/sap/fe/core/ReuseComponent.js +8 -14
  21. package/src/sap/fe/core/ReuseComponent.ts +0 -6
  22. package/src/sap/fe/core/TemplateComponent.js +37 -9
  23. package/src/sap/fe/core/TemplateComponent.ts +3 -2
  24. package/src/sap/fe/core/TemplateModel.js +5 -5
  25. package/src/sap/fe/core/TemplateModel.ts +0 -1
  26. package/src/sap/fe/core/UIProvider.js +1 -1
  27. package/src/sap/fe/core/UIProvider.ts +44 -1
  28. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +7 -12
  29. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +0 -5
  30. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +61 -65
  31. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +60 -63
  32. package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +3 -3
  33. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockFormatter.js +1 -1
  34. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +21 -5
  35. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +0 -4
  36. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +6 -18
  37. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -20
  38. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +5 -11
  39. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +0 -6
  40. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlock.js +3 -3
  41. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +11 -10
  42. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +0 -1
  43. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +5 -7
  44. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +0 -1
  45. package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
  46. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +3 -10
  47. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +0 -7
  48. package/src/sap/fe/core/controllerextensions/ContextSharing.js +5 -8
  49. package/src/sap/fe/core/controllerextensions/ContextSharing.ts +0 -2
  50. package/src/sap/fe/core/controllerextensions/EditFlow.js +225 -155
  51. package/src/sap/fe/core/controllerextensions/EditFlow.ts +248 -164
  52. package/src/sap/fe/core/controllerextensions/Feedback.js +1 -3
  53. package/src/sap/fe/core/controllerextensions/Feedback.ts +0 -2
  54. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +4 -7
  55. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +0 -3
  56. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +8 -25
  57. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +2 -21
  58. package/src/sap/fe/core/controllerextensions/InternalRouting.js +22 -34
  59. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +25 -31
  60. package/src/sap/fe/core/controllerextensions/KPIManagement.js +8 -21
  61. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +4 -15
  62. package/src/sap/fe/core/controllerextensions/MessageHandler.js +68 -31
  63. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +78 -32
  64. package/src/sap/fe/core/controllerextensions/PageReady.js +4 -4
  65. package/src/sap/fe/core/controllerextensions/Paginator.js +4 -8
  66. package/src/sap/fe/core/controllerextensions/Paginator.ts +0 -4
  67. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -4
  68. package/src/sap/fe/core/controllerextensions/Recommendations.js +15 -24
  69. package/src/sap/fe/core/controllerextensions/Recommendations.ts +13 -20
  70. package/src/sap/fe/core/controllerextensions/Routing.js +4 -10
  71. package/src/sap/fe/core/controllerextensions/Routing.ts +0 -6
  72. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  73. package/src/sap/fe/core/controllerextensions/Share.js +17 -11
  74. package/src/sap/fe/core/controllerextensions/Share.ts +10 -5
  75. package/src/sap/fe/core/controllerextensions/SideEffects.js +49 -45
  76. package/src/sap/fe/core/controllerextensions/SideEffects.ts +54 -41
  77. package/src/sap/fe/core/controllerextensions/Telemetry.js +4 -4
  78. package/src/sap/fe/core/controllerextensions/ViewState.js +10 -34
  79. package/src/sap/fe/core/controllerextensions/ViewState.ts +3 -49
  80. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +6 -8
  81. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +0 -1
  82. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -2
  83. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +0 -1
  84. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +4 -3
  85. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +1 -1
  86. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +16 -12
  87. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +4 -1
  88. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
  89. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +126 -74
  90. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +158 -91
  91. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +1 -22
  92. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +0 -20
  93. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -20
  94. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +11 -17
  95. package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +1 -1
  96. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +191 -767
  97. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +277 -1024
  98. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
  99. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -6
  100. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +0 -5
  101. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +381 -250
  102. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +467 -301
  103. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +2 -6
  104. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +0 -5
  105. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +2 -6
  106. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.ts +4 -6
  107. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +1 -6
  108. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.ts +0 -4
  109. package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +1 -1
  110. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +4 -41
  111. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +1 -37
  112. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +1 -1
  113. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.ts +0 -1
  114. package/src/sap/fe/core/controls/Any.js +1 -2
  115. package/src/sap/fe/core/controls/Any.ts +0 -1
  116. package/src/sap/fe/core/controls/AnyElement.js +1 -2
  117. package/src/sap/fe/core/controls/AnyElement.ts +0 -1
  118. package/src/sap/fe/core/controls/CommandExecution.js +3 -3
  119. package/src/sap/fe/core/controls/ComponentLoader.js +23 -10
  120. package/src/sap/fe/core/controls/ComponentLoader.ts +0 -1
  121. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +10 -13
  122. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +0 -6
  123. package/src/sap/fe/core/controls/EventDelegateHook.js +8 -9
  124. package/src/sap/fe/core/controls/FormElementWrapper.js +7 -7
  125. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -1
  126. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +140 -24
  127. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +141 -10
  128. package/src/sap/fe/core/converters/ConverterContext.js +8 -30
  129. package/src/sap/fe/core/converters/ConverterContext.ts +7 -29
  130. package/src/sap/fe/core/converters/ManifestSettings.js +37 -1
  131. package/src/sap/fe/core/converters/ManifestSettings.ts +12 -3
  132. package/src/sap/fe/core/converters/ManifestWrapper.js +12 -40
  133. package/src/sap/fe/core/converters/ManifestWrapper.ts +13 -46
  134. package/src/sap/fe/core/converters/MetaModelConverter.js +44 -48
  135. package/src/sap/fe/core/converters/MetaModelConverter.ts +50 -48
  136. package/src/sap/fe/core/converters/TemplateConverter.js +3 -2
  137. package/src/sap/fe/core/converters/TemplateConverter.ts +0 -1
  138. package/src/sap/fe/core/converters/annotations/DataField.js +1 -28
  139. package/src/sap/fe/core/converters/annotations/DataField.ts +0 -26
  140. package/src/sap/fe/core/converters/common/AnnotationConverter.js +24 -19
  141. package/src/sap/fe/core/converters/controls/Common/Action.js +13 -26
  142. package/src/sap/fe/core/converters/controls/Common/Action.ts +13 -31
  143. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -6
  144. package/src/sap/fe/core/converters/controls/Common/Chart.ts +0 -5
  145. package/src/sap/fe/core/converters/controls/Common/Criticality.js +2 -4
  146. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +1 -2
  147. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -5
  148. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +0 -4
  149. package/src/sap/fe/core/converters/controls/Common/Form.js +3 -2
  150. package/src/sap/fe/core/converters/controls/Common/Form.ts +2 -1
  151. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -7
  152. package/src/sap/fe/core/converters/controls/Common/KPI.ts +11 -6
  153. package/src/sap/fe/core/converters/controls/Common/Table.js +159 -141
  154. package/src/sap/fe/core/converters/controls/Common/Table.ts +166 -122
  155. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +5 -30
  156. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +3 -29
  157. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +43 -55
  158. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +43 -47
  159. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -4
  160. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +0 -3
  161. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
  162. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +3 -8
  163. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +2 -7
  164. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +1 -11
  165. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +0 -9
  166. package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -10
  167. package/src/sap/fe/core/converters/helpers/Aggregation.ts +0 -9
  168. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -7
  169. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +0 -6
  170. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -9
  171. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +0 -8
  172. package/src/sap/fe/core/converters/helpers/ID.js +1 -2
  173. package/src/sap/fe/core/converters/helpers/ID.ts +0 -1
  174. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +1 -2
  175. package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +0 -1
  176. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  177. package/src/sap/fe/core/converters/helpers/Key.js +1 -5
  178. package/src/sap/fe/core/converters/helpers/Key.ts +0 -4
  179. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -2
  180. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +0 -1
  181. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  182. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -7
  183. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +0 -6
  184. package/src/sap/fe/core/converters/templates/ListReportConverter.js +6 -27
  185. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +9 -26
  186. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -16
  187. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +0 -15
  188. package/src/sap/fe/core/definition/FEDefinition.js +2550 -0
  189. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -12
  190. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +9 -10
  191. package/src/sap/fe/core/formatters/CollaborationFormatter.js +8 -2
  192. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +0 -2
  193. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  194. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -2
  195. package/src/sap/fe/core/formatters/FPMFormatter.ts +0 -1
  196. package/src/sap/fe/core/formatters/FiscalFormat.js +9 -14
  197. package/src/sap/fe/core/formatters/FiscalFormat.ts +0 -11
  198. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -4
  199. package/src/sap/fe/core/formatters/KPIFormatter.ts +0 -3
  200. package/src/sap/fe/core/formatters/StandardFormatter.js +6 -3
  201. package/src/sap/fe/core/formatters/StandardFormatter.ts +6 -2
  202. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -4
  203. package/src/sap/fe/core/formatters/ValueFormatter.ts +0 -3
  204. package/src/sap/fe/core/fpm/Component.js +14 -17
  205. package/src/sap/fe/core/fpm/Component.ts +7 -10
  206. package/src/sap/fe/core/fpm/manifest.json +1 -1
  207. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.js +3 -10
  208. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.ts +0 -9
  209. package/src/sap/fe/core/helpers/AppStartupHelper.js +1 -13
  210. package/src/sap/fe/core/helpers/AppStartupHelper.ts +0 -11
  211. package/src/sap/fe/core/helpers/BindingHelper.js +1 -4
  212. package/src/sap/fe/core/helpers/BindingHelper.ts +0 -3
  213. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.js +1 -2
  214. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.ts +0 -1
  215. package/src/sap/fe/core/helpers/DeleteHelper.js +61 -32
  216. package/src/sap/fe/core/helpers/DeleteHelper.ts +79 -33
  217. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -2
  218. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +0 -1
  219. package/src/sap/fe/core/helpers/EditState.js +1 -1
  220. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -2
  221. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +0 -1
  222. package/src/sap/fe/core/helpers/FPMHelper.js +1 -2
  223. package/src/sap/fe/core/helpers/FPMHelper.ts +0 -1
  224. package/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -8
  225. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +0 -7
  226. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +7 -1
  227. package/src/sap/fe/core/helpers/LoaderUtils.js +1 -1
  228. package/src/sap/fe/core/helpers/ManifestHelper.js +1 -3
  229. package/src/sap/fe/core/helpers/ManifestHelper.ts +0 -2
  230. package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
  231. package/src/sap/fe/core/helpers/MetaModelFunction.js +3 -8
  232. package/src/sap/fe/core/helpers/MetaModelFunction.ts +0 -5
  233. package/src/sap/fe/core/helpers/MetaPath.js +1 -7
  234. package/src/sap/fe/core/helpers/MetaPath.ts +0 -6
  235. package/src/sap/fe/core/helpers/ModelHelper.js +55 -35
  236. package/src/sap/fe/core/helpers/ModelHelper.ts +64 -38
  237. package/src/sap/fe/core/helpers/PasteHelper.js +77 -24
  238. package/src/sap/fe/core/helpers/PasteHelper.ts +105 -23
  239. package/src/sap/fe/core/helpers/PromiseKeeper.js +1 -3
  240. package/src/sap/fe/core/helpers/PromiseKeeper.ts +0 -2
  241. package/src/sap/fe/core/helpers/RecommendationHelper.js +1 -4
  242. package/src/sap/fe/core/helpers/RecommendationHelper.ts +0 -3
  243. package/src/sap/fe/core/helpers/ResourceModelHelper.js +1 -3
  244. package/src/sap/fe/core/helpers/ResourceModelHelper.ts +3 -4
  245. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -2
  246. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +0 -1
  247. package/src/sap/fe/core/helpers/SizeHelper.js +1 -2
  248. package/src/sap/fe/core/helpers/SizeHelper.ts +0 -1
  249. package/src/sap/fe/core/helpers/StableIdHelper.js +7 -17
  250. package/src/sap/fe/core/helpers/StableIdHelper.ts +7 -17
  251. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +1 -12
  252. package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +0 -11
  253. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  254. package/src/sap/fe/core/helpers/TitleHelper.js +1 -10
  255. package/src/sap/fe/core/helpers/TitleHelper.ts +0 -9
  256. package/src/sap/fe/core/helpers/ToES6Promise.js +1 -2
  257. package/src/sap/fe/core/helpers/ToES6Promise.ts +0 -1
  258. package/src/sap/fe/core/helpers/TypeGuards.js +1 -15
  259. package/src/sap/fe/core/helpers/TypeGuards.ts +0 -14
  260. package/src/sap/fe/core/helpers/WebSocket.js +1 -1
  261. package/src/sap/fe/core/library.js +10 -44
  262. package/src/sap/fe/core/library.support.js +1 -1
  263. package/src/sap/fe/core/library.ts +8 -45
  264. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -6
  265. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +0 -5
  266. package/src/sap/fe/core/messagebundle.properties +12 -1
  267. package/src/sap/fe/core/messagebundle_ar.properties +8 -0
  268. package/src/sap/fe/core/messagebundle_bg.properties +8 -0
  269. package/src/sap/fe/core/messagebundle_ca.properties +8 -0
  270. package/src/sap/fe/core/messagebundle_cnr.properties +8 -0
  271. package/src/sap/fe/core/messagebundle_cs.properties +9 -1
  272. package/src/sap/fe/core/messagebundle_cy.properties +8 -0
  273. package/src/sap/fe/core/messagebundle_da.properties +8 -0
  274. package/src/sap/fe/core/messagebundle_de.properties +8 -0
  275. package/src/sap/fe/core/messagebundle_el.properties +8 -0
  276. package/src/sap/fe/core/messagebundle_en.properties +8 -0
  277. package/src/sap/fe/core/messagebundle_en_GB.properties +8 -0
  278. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +144 -65
  279. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +8 -0
  280. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +273 -194
  281. package/src/sap/fe/core/messagebundle_es.properties +9 -1
  282. package/src/sap/fe/core/messagebundle_es_MX.properties +8 -0
  283. package/src/sap/fe/core/messagebundle_et.properties +8 -0
  284. package/src/sap/fe/core/messagebundle_fi.properties +8 -0
  285. package/src/sap/fe/core/messagebundle_fr.properties +8 -0
  286. package/src/sap/fe/core/messagebundle_fr_CA.properties +8 -0
  287. package/src/sap/fe/core/messagebundle_hi.properties +9 -1
  288. package/src/sap/fe/core/messagebundle_hr.properties +8 -0
  289. package/src/sap/fe/core/messagebundle_hu.properties +8 -0
  290. package/src/sap/fe/core/messagebundle_id.properties +12 -4
  291. package/src/sap/fe/core/messagebundle_it.properties +8 -0
  292. package/src/sap/fe/core/messagebundle_iw.properties +8 -0
  293. package/src/sap/fe/core/messagebundle_ja.properties +8 -0
  294. package/src/sap/fe/core/messagebundle_kk.properties +8 -0
  295. package/src/sap/fe/core/messagebundle_ko.properties +8 -0
  296. package/src/sap/fe/core/messagebundle_lt.properties +8 -0
  297. package/src/sap/fe/core/messagebundle_lv.properties +8 -0
  298. package/src/sap/fe/core/messagebundle_mk.properties +8 -0
  299. package/src/sap/fe/core/messagebundle_ms.properties +8 -0
  300. package/src/sap/fe/core/messagebundle_nl.properties +16 -8
  301. package/src/sap/fe/core/messagebundle_no.properties +8 -0
  302. package/src/sap/fe/core/messagebundle_pl.properties +8 -0
  303. package/src/sap/fe/core/messagebundle_pt.properties +8 -0
  304. package/src/sap/fe/core/messagebundle_pt_PT.properties +8 -0
  305. package/src/sap/fe/core/messagebundle_ro.properties +8 -0
  306. package/src/sap/fe/core/messagebundle_ru.properties +8 -0
  307. package/src/sap/fe/core/messagebundle_sh.properties +8 -0
  308. package/src/sap/fe/core/messagebundle_sk.properties +8 -0
  309. package/src/sap/fe/core/messagebundle_sl.properties +8 -0
  310. package/src/sap/fe/core/messagebundle_sr.properties +8 -0
  311. package/src/sap/fe/core/messagebundle_sv.properties +8 -0
  312. package/src/sap/fe/core/messagebundle_th.properties +12 -4
  313. package/src/sap/fe/core/messagebundle_tr.properties +8 -0
  314. package/src/sap/fe/core/messagebundle_uk.properties +10 -2
  315. package/src/sap/fe/core/messagebundle_vi.properties +8 -0
  316. package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -0
  317. package/src/sap/fe/core/messagebundle_zh_TW.properties +8 -0
  318. package/src/sap/fe/core/operationsHelper.js +22 -7
  319. package/src/sap/fe/core/operationsHelper.ts +24 -5
  320. package/src/sap/fe/core/rootView/Fcl.controller.js +7 -27
  321. package/src/sap/fe/core/rootView/Fcl.controller.ts +0 -18
  322. package/src/sap/fe/core/rootView/NavContainer.controller.js +7 -12
  323. package/src/sap/fe/core/rootView/NavContainer.controller.ts +0 -5
  324. package/src/sap/fe/core/rootView/RootViewBaseController.js +10 -24
  325. package/src/sap/fe/core/rootView/RootViewBaseController.ts +3 -16
  326. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
  327. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +3 -3
  328. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +4 -4
  329. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +3 -3
  330. package/src/sap/fe/core/services/ContextSharingServiceFactory.js +3 -4
  331. package/src/sap/fe/core/services/ContextSharingServiceFactory.ts +0 -1
  332. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +13 -20
  333. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +11 -17
  334. package/src/sap/fe/core/services/NavigationServiceFactory.js +11 -21
  335. package/src/sap/fe/core/services/NavigationServiceFactory.ts +4 -17
  336. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
  337. package/src/sap/fe/core/services/RoutingServiceFactory.js +7 -19
  338. package/src/sap/fe/core/services/RoutingServiceFactory.ts +0 -12
  339. package/src/sap/fe/core/services/ShellServicesFactory.js +8 -44
  340. package/src/sap/fe/core/services/ShellServicesFactory.ts +1 -41
  341. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +19 -60
  342. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +14 -57
  343. package/src/sap/fe/core/services/TelemetryServiceFactory.js +6 -14
  344. package/src/sap/fe/core/services/TelemetryServiceFactory.ts +2 -10
  345. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +17 -7
  346. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +17 -3
  347. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +11 -24
  348. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +0 -19
  349. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +3 -31
  350. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +0 -27
  351. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +1 -4
  352. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.ts +0 -3
  353. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +7 -7
  354. package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
  355. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
  356. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
  357. package/src/sap/fe/core/support/CommonHelper.js +4 -1
  358. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  359. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
  360. package/src/sap/fe/core/templating/ActionHelper.js +1 -2
  361. package/src/sap/fe/core/templating/ActionHelper.ts +0 -1
  362. package/src/sap/fe/core/templating/CommonFormatters.js +1 -2
  363. package/src/sap/fe/core/templating/CommonFormatters.ts +0 -1
  364. package/src/sap/fe/core/templating/CriticalityFormatters.js +1 -6
  365. package/src/sap/fe/core/templating/CriticalityFormatters.ts +0 -5
  366. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -2
  367. package/src/sap/fe/core/templating/DataFieldFormatters.ts +0 -1
  368. package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -18
  369. package/src/sap/fe/core/templating/DataModelPathHelper.ts +0 -17
  370. package/src/sap/fe/core/templating/DisplayModeFormatter.js +6 -1
  371. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -4
  372. package/src/sap/fe/core/templating/EntitySetHelper.ts +0 -3
  373. package/src/sap/fe/core/templating/EntityTypeHelper.js +4 -5
  374. package/src/sap/fe/core/templating/EntityTypeHelper.ts +3 -4
  375. package/src/sap/fe/core/templating/FieldControlHelper.js +4 -9
  376. package/src/sap/fe/core/templating/FieldControlHelper.ts +3 -9
  377. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  378. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  379. package/src/sap/fe/core/templating/PropertyHelper.js +1 -31
  380. package/src/sap/fe/core/templating/PropertyHelper.ts +0 -30
  381. package/src/sap/fe/core/templating/SemanticObjectHelper.js +1 -7
  382. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +0 -6
  383. package/src/sap/fe/core/templating/UIFormatters.js +18 -14
  384. package/src/sap/fe/core/templating/UIFormatters.ts +30 -18
  385. package/src/sap/fe/core/type/Date.js +3 -6
  386. package/src/sap/fe/core/type/Date.ts +0 -3
  387. package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -3
  388. package/src/sap/fe/core/type/EDM.js +1 -1
  389. package/src/sap/fe/core/type/Email.js +3 -3
  390. package/src/sap/fe/core/type/FiscalDate.js +3 -9
  391. package/src/sap/fe/core/type/FiscalDate.ts +0 -6
  392. package/src/sap/fe/core/type/InputMask.js +3 -7
  393. package/src/sap/fe/core/type/InputMask.ts +0 -4
@@ -12,12 +12,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/building
12
12
  var getResourceModel = ResourceModelHelper.getResourceModel;
13
13
  var defineBuildingBlock = BuildingBlockSupport.defineBuildingBlock;
14
14
  var defineReference = ClassSupport.defineReference;
15
- function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
16
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
17
- function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
18
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
19
- function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
20
- function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
15
+ function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }
16
+ function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
17
+ function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
18
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
19
+ function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }
20
+ function _initializerWarningHelper(r, e) { throw Error("Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform."); }
21
21
  let RecommendationDialogDecision;
22
22
  (function (RecommendationDialogDecision) {
23
23
  RecommendationDialogDecision["Accept"] = "Accept_Recommendations";
@@ -42,14 +42,135 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/building
42
42
  _exports.ConfirmRecommendationDialogBlock = ConfirmRecommendationDialogBlock;
43
43
  var _proto = ConfirmRecommendationDialogBlock.prototype;
44
44
  /**
45
- * Opens the confirm recommendations dialog.
45
+ * Resolves the promise with the selected dialog list option
46
+ */
47
+ /**
48
+ * Rejects the promise of open dialog
49
+ */
50
+ /**
51
+ *
52
+ * @returns Recommendation Data
53
+ */
54
+ _proto.getOpenRecommendations = function getOpenRecommendations() {
55
+ const visibleContextPaths = this.getVisiblePageContextPaths();
56
+ const openRecommendations = this.getOpenRecommendationsForVisibleContextPaths(visibleContextPaths);
57
+ const recommendations = [];
58
+ if (openRecommendations.length > 0) {
59
+ openRecommendations.forEach(recommendation => {
60
+ const context = this.view.getBindingContext();
61
+ const propertyPath = recommendation.propertyPath ? recommendation.propertyPath : "";
62
+ if ((context === null || context === void 0 ? void 0 : context.getProperty(propertyPath)) === null || (context === null || context === void 0 ? void 0 : context.getProperty(propertyPath)) === undefined || (context === null || context === void 0 ? void 0 : context.getProperty(propertyPath)) == "") {
63
+ recommendations.push(recommendation);
64
+ }
65
+ });
66
+ }
67
+ return recommendations;
68
+ // check if we have recommendations from the current page in the localAnnotationModel
69
+ // return open recommendations.
70
+ }
71
+
72
+ /**
73
+ *
74
+ * @returns Collection of context paths
75
+ */;
76
+ _proto.getVisiblePageContextPaths = function getVisiblePageContextPaths() {
77
+ var _this$view$getBinding;
78
+ const visiblePageContextPaths = [(_this$view$getBinding = this.view.getBindingContext()) === null || _this$view$getBinding === void 0 ? void 0 : _this$view$getBinding.getPath()];
79
+ const controller = this.view.getController();
80
+ const fclController = controller.getAppComponent().getRootViewController();
81
+ const isFclEnabled = controller.getAppComponent()._isFclEnabled();
82
+ const isFullScreen = isFclEnabled ? fclController.getHelper().getCurrentUIState().isFullScreen : true;
83
+ if (isFclEnabled && !isFullScreen) {
84
+ const rightMostContext = fclController.getRightmostContext();
85
+ visiblePageContextPaths.push(rightMostContext === null || rightMostContext === void 0 ? void 0 : rightMostContext.getPath());
86
+ }
87
+ return visiblePageContextPaths;
88
+ }
89
+
90
+ /**
46
91
  *
92
+ * @param contextPaths Paths of the contexts
93
+ * @returns RecommendationData for visible contexts
94
+ */;
95
+ _proto.getOpenRecommendationsForVisibleContextPaths = function getOpenRecommendationsForVisibleContextPaths(contextPaths) {
96
+ const openRecommendations = [];
97
+ if (contextPaths.length > 0) {
98
+ const localAnnotationModel = this.view.getModel().getLocalAnnotationModel();
99
+ // check context paths in local annotation models which match to
100
+ // 1. current page and
101
+ // 2. immediate children of the current page
102
+ // Need to consider also immediate children
103
+ // iterate over all keys
104
+ contextPaths.forEach(contextPath => {
105
+ if (contextPath !== undefined) {
106
+ const localAnnotationObject = localAnnotationModel.getObject(contextPath);
107
+ if (localAnnotationObject) {
108
+ this.getOpenRecommendationsForContext(localAnnotationObject, localAnnotationObject["recommendationContext"], openRecommendations);
109
+ }
110
+ }
111
+ });
112
+ }
113
+ return openRecommendations;
114
+ }
115
+
116
+ /**
117
+ *
118
+ * @param contextData The context data object for recommendations
119
+ * @param recommendationContext The recommendation context
120
+ * @param openRecommendations RecommendationData
121
+ * @param contextKey Context Key
122
+ */;
123
+ _proto.getOpenRecommendationsForContext = function getOpenRecommendationsForContext(contextData, recommendationContext, openRecommendations) {
124
+ let contextKey = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "";
125
+ for (const currentKey in contextData) {
126
+ const currentValue = contextData[currentKey];
127
+ if (currentValue) {
128
+ const currentValueIsContext = currentValue.isA && currentValue.isA("sap.ui.model.odata.v4.Context");
129
+ if (currentKey.includes("@$ui5.fe.recommendations.placeholderValue")) {
130
+ const propertyPath = currentKey.split("@$ui5.fe.recommendations.placeholderValue")[0];
131
+ const openRecommendation = {
132
+ context: recommendationContext,
133
+ propertyPath: contextKey ? `${contextKey}/${propertyPath}` : propertyPath,
134
+ value: currentValue,
135
+ contextIdentifier: [],
136
+ contextIdentifierText: []
137
+ };
138
+ const description = contextData[`${propertyPath}@$ui5.fe.recommendations.placeholderDescription`];
139
+ if (description) {
140
+ openRecommendation.text = description;
141
+ }
142
+ openRecommendations.push(openRecommendation);
143
+ } else if (typeof currentValue === "object" && !Array.isArray(currentValue) && !currentValueIsContext) {
144
+ this.getOpenRecommendationsForContext(currentValue, recommendationContext, openRecommendations, currentKey);
145
+ }
146
+ }
147
+ }
148
+ }
149
+
150
+ /**
151
+ * Opens the confirm recommendations dialog.
47
152
  * @param isSave Boolean flag which would be set to true if we are saving the document and would be false if we do apply changes
48
153
  * @returns Promise which would resolve with RecommendationDialogDecision (Accept, Ignore, Continue, Skipped)
49
- */
154
+ */;
50
155
  _proto.open = async function open(isSave) {
51
- var _this$view, _acceptModel$getData$;
52
- this.acceptAllParams = await ((_this$view = this.view) === null || _this$view === void 0 ? void 0 : _this$view.getController()).recommendations.fetchAcceptAllParams();
156
+ var _acceptModel$getData$;
157
+ // check for built-in recommendations
158
+ const openRecommendations = this.getOpenRecommendations();
159
+ if (openRecommendations.length > 0) {
160
+ this.acceptAllParams = {
161
+ recommendationData: openRecommendations
162
+ };
163
+ } else {
164
+ var _this$view;
165
+ // if built-in recommendations are not found then check for legacy recommendations.
166
+ const legacyRecommendationsExist = ((_this$view = this.view) === null || _this$view === void 0 ? void 0 : _this$view.getController()).recommendations.checkIfRecommendationsExist();
167
+ if (legacyRecommendationsExist) {
168
+ var _this$view2;
169
+ this.acceptAllParams = await ((_this$view2 = this.view) === null || _this$view2 === void 0 ? void 0 : _this$view2.getController()).recommendations.fetchAcceptAllParams();
170
+ } else {
171
+ return undefined;
172
+ }
173
+ }
53
174
  const acceptModel = this.getAcceptAllModel();
54
175
  this.view.setModel(acceptModel, "_acceptDialogModel");
55
176
  if (!((_acceptModel$getData$ = acceptModel.getData().items) !== null && _acceptModel$getData$ !== void 0 && _acceptModel$getData$.length)) {
@@ -81,8 +202,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/building
81
202
  */;
82
203
  _proto.onAcceptAndSave = async function onAcceptAndSave() {
83
204
  try {
84
- var _this$view2;
85
- const isAccepted = await ((_this$view2 = this.view) === null || _this$view2 === void 0 ? void 0 : _this$view2.getController()).recommendations.acceptRecommendations(this.acceptAllParams);
205
+ var _this$view3;
206
+ const isAccepted = await ((_this$view3 = this.view) === null || _this$view3 === void 0 ? void 0 : _this$view3.getController()).recommendations.acceptRecommendations(this.acceptAllParams);
86
207
  if (!isAccepted) {
87
208
  this.promiseReject("Accept Failed");
88
209
  }
@@ -99,8 +220,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/building
99
220
  * Handler for Ignore and Save button.
100
221
  */;
101
222
  _proto.onIgnoreAndSave = function onIgnoreAndSave() {
102
- var _this$view3;
103
- ((_this$view3 = this.view) === null || _this$view3 === void 0 ? void 0 : _this$view3.getController()).recommendations.ignoreRecommendationForContexts();
223
+ var _this$view4;
224
+ ((_this$view4 = this.view) === null || _this$view4 === void 0 ? void 0 : _this$view4.getController()).recommendations.ignoreRecommendationForContexts();
104
225
  this.promiseResolve(RecommendationDialogDecision.Ignore);
105
226
  this.close();
106
227
  }
@@ -115,19 +236,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/building
115
236
 
116
237
  /**
117
238
  * Gets the label or name of the Field based on its property path.
118
- *
119
239
  * @param targetPath
120
240
  * @returns Returns the label of the Field.
121
241
  */;
122
242
  _proto.getFieldName = function getFieldName(targetPath) {
123
- var _this$view4, _this$view4$getBindin, _this$view4$getBindin2, _involvedDataModelObj, _involvedDataModelObj2, _involvedDataModelObj3, _involvedDataModelObj4;
124
- const involvedDataModelObject = MetaModelConverter.getInvolvedDataModelObjectsForTargetPath(targetPath, (_this$view4 = this.view) === null || _this$view4 === void 0 ? void 0 : (_this$view4$getBindin = _this$view4.getBindingContext()) === null || _this$view4$getBindin === void 0 ? void 0 : (_this$view4$getBindin2 = _this$view4$getBindin.getModel()) === null || _this$view4$getBindin2 === void 0 ? void 0 : _this$view4$getBindin2.getMetaModel());
243
+ var _this$view5, _this$view5$getBindin, _this$view5$getBindin2, _involvedDataModelObj, _involvedDataModelObj2, _involvedDataModelObj3, _involvedDataModelObj4;
244
+ const involvedDataModelObject = MetaModelConverter.getInvolvedDataModelObjectsForTargetPath(targetPath, (_this$view5 = this.view) === null || _this$view5 === void 0 ? void 0 : (_this$view5$getBindin = _this$view5.getBindingContext()) === null || _this$view5$getBindin === void 0 ? void 0 : (_this$view5$getBindin2 = _this$view5$getBindin.getModel()) === null || _this$view5$getBindin2 === void 0 ? void 0 : _this$view5$getBindin2.getMetaModel());
125
245
  return (involvedDataModelObject === null || involvedDataModelObject === void 0 ? void 0 : (_involvedDataModelObj = involvedDataModelObject.targetObject) === null || _involvedDataModelObj === void 0 ? void 0 : (_involvedDataModelObj2 = _involvedDataModelObj.annotations) === null || _involvedDataModelObj2 === void 0 ? void 0 : (_involvedDataModelObj3 = _involvedDataModelObj2.Common) === null || _involvedDataModelObj3 === void 0 ? void 0 : (_involvedDataModelObj4 = _involvedDataModelObj3.Label) === null || _involvedDataModelObj4 === void 0 ? void 0 : _involvedDataModelObj4.toString()) || targetPath.split("/")[targetPath.split("/").length - 1];
126
246
  }
127
247
 
128
248
  /**
129
249
  * Fetches text for recommendation based on display mode.
130
- *
131
250
  * @param recommendation
132
251
  * @param displayMode
133
252
  * @returns Text for a recommendation
@@ -150,7 +269,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/building
150
269
 
151
270
  /**
152
271
  * Returns Button with given text, type and pressHandler.
153
- *
154
272
  * @param text Text for the button
155
273
  * @param type Type of the button
156
274
  * @param pressHandler Press Handler for the button
@@ -174,7 +292,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/building
174
292
 
175
293
  /**
176
294
  * Returns Footer with Buttons.
177
- *
178
295
  * @returns Footer
179
296
  */;
180
297
  _proto.getFooter = function getFooter() {
@@ -199,9 +316,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/building
199
316
  const entityNameLabel = standardRecommendationHelper.getEntityName(recommendationData.context) || "";
200
317
  const identifierTexts = recommendationData.contextIdentifierText && recommendationData.contextIdentifierText.length > 0 ? `${entityNameLabel} (${recommendationData.contextIdentifierText})` : entityNameLabel;
201
318
  if (recommendationData.value || recommendationData.text) {
202
- var _recommendationData$c, _this$view5, _this$view5$getBindin, _this$view5$getBindin2;
319
+ var _recommendationData$c, _this$view6, _this$view6$getBindin, _this$view6$getBindin2;
203
320
  const targetPath = ((_recommendationData$c = recommendationData.context) === null || _recommendationData$c === void 0 ? void 0 : _recommendationData$c.getPath()) + "/" + recommendationData.propertyPath;
204
- const displayMode = standardRecommendationHelper.getDisplayModeForTargetPath(targetPath, (_this$view5 = this.view) === null || _this$view5 === void 0 ? void 0 : (_this$view5$getBindin = _this$view5.getBindingContext()) === null || _this$view5$getBindin === void 0 ? void 0 : (_this$view5$getBindin2 = _this$view5$getBindin.getModel()) === null || _this$view5$getBindin2 === void 0 ? void 0 : _this$view5$getBindin2.getMetaModel());
321
+ const displayMode = standardRecommendationHelper.getDisplayModeForTargetPath(targetPath, (_this$view6 = this.view) === null || _this$view6 === void 0 ? void 0 : (_this$view6$getBindin = _this$view6.getBindingContext()) === null || _this$view6$getBindin === void 0 ? void 0 : (_this$view6$getBindin2 = _this$view6$getBindin.getModel()) === null || _this$view6$getBindin2 === void 0 ? void 0 : _this$view6$getBindin2.getMetaModel());
205
322
  const listData = {
206
323
  fieldName: this.getFieldName(targetPath).valueOf(),
207
324
  fieldValue: this.getText(recommendationData, displayMode),
@@ -262,7 +379,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/building
262
379
 
263
380
  /**
264
381
  * The building block render function.
265
- *
266
382
  * @returns An XML-based string
267
383
  */;
268
384
  _proto.getContent = function getContent() {
@@ -293,4 +409,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/building
293
409
  _exports.ConfirmRecommendationDialogBlock = ConfirmRecommendationDialogBlock;
294
410
  return _exports;
295
411
  }, false);
296
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIiwiQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2siLCJkZWZpbmVCdWlsZGluZ0Jsb2NrIiwibmFtZSIsIm5hbWVzcGFjZSIsImRlZmluZVJlZmVyZW5jZSIsInByb3BzIiwidmlldyIsImNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ1Jlc291cmNlTW9kZWwiLCJnZXRSZXNvdXJjZU1vZGVsIiwib3BlbiIsImlzU2F2ZSIsImFjY2VwdEFsbFBhcmFtcyIsImdldENvbnRyb2xsZXIiLCJyZWNvbW1lbmRhdGlvbnMiLCJmZXRjaEFjY2VwdEFsbFBhcmFtcyIsImFjY2VwdE1vZGVsIiwiZ2V0QWNjZXB0QWxsTW9kZWwiLCJzZXRNb2RlbCIsImdldERhdGEiLCJpdGVtcyIsImxlbmd0aCIsIlNraXBwZWQiLCJkaWFsb2ciLCJnZXRDb250ZW50Iiwic2V0RXNjYXBlSGFuZGxlciIsIm9uQ29udGludWVFZGl0aW5nIiwiYmluZCIsImFkZERlcGVuZGVudCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicHJvbWlzZVJlc29sdmUiLCJwcm9taXNlUmVqZWN0IiwiY2xvc2UiLCJjb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2ciLCJjdXJyZW50IiwiZGVzdHJveSIsIm9uQWNjZXB0QW5kU2F2ZSIsImlzQWNjZXB0ZWQiLCJhY2NlcHRSZWNvbW1lbmRhdGlvbnMiLCJBY2NlcHQiLCJMb2ciLCJlcnJvciIsIm9uSWdub3JlQW5kU2F2ZSIsImlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMiLCJJZ25vcmUiLCJDb250aW51ZSIsImdldEZpZWxkTmFtZSIsInRhcmdldFBhdGgiLCJpbnZvbHZlZERhdGFNb2RlbE9iamVjdCIsIk1ldGFNb2RlbENvbnZlcnRlciIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0c0ZvclRhcmdldFBhdGgiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwidGFyZ2V0T2JqZWN0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJMYWJlbCIsInRvU3RyaW5nIiwic3BsaXQiLCJnZXRUZXh0IiwicmVjb21tZW5kYXRpb24iLCJkaXNwbGF5TW9kZSIsInRleHQiLCJ2YWx1ZSIsInZhbHVlRm9ybWF0dGVycyIsImZvcm1hdFdpdGhCcmFja2V0cyIsImdldEJ1dHRvbiIsInR5cGUiLCJwcmVzc0hhbmRsZXIiLCJsYXlvdXREYXRhIiwiZ2V0Rm9vdGVyIiwiY29udGVudCIsIkpTT05Nb2RlbCIsInJlY29tbWVuZGF0aW9uRGF0YSIsImVudGl0eU5hbWVMYWJlbCIsInN0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXIiLCJnZXRFbnRpdHlOYW1lIiwiY29udGV4dCIsImlkZW50aWZpZXJUZXh0cyIsImNvbnRleHRJZGVudGlmaWVyVGV4dCIsImdldFBhdGgiLCJwcm9wZXJ0eVBhdGgiLCJnZXREaXNwbGF5TW9kZUZvclRhcmdldFBhdGgiLCJsaXN0RGF0YSIsImZpZWxkTmFtZSIsInZhbHVlT2YiLCJmaWVsZFZhbHVlIiwicHVzaCIsInNldERhdGEiLCJnZXRHcm91cCIsImdldFByb3BlcnR5IiwiZ2V0TWVzc2FnZVN0cmlwIiwiYWNjZXB0QWxsRGF0YSIsIm1lc3NhZ2VTdHJpcFRleHQiLCJnZXREaWFsb2dDb250ZW50IiwibW9kZWwiLCJwYXRoIiwic29ydGVyIiwiU29ydGVyIiwiVmFsdWVTdGF0ZSIsIkluZm9ybWF0aW9uIiwiZm9vdGVyIiwiUnVudGltZUJ1aWxkaW5nQmxvY2siXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZy5ibG9jay50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IFByb3BlcnRpZXNPZiB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IGRlZmluZVJlZmVyZW5jZSB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSBcInNhcC9mZS9iYXNlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IHsgZGVmaW5lQnVpbGRpbmdCbG9jayB9IGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL0J1aWxkaW5nQmxvY2tTdXBwb3J0XCI7XG5pbXBvcnQgUnVudGltZUJ1aWxkaW5nQmxvY2sgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvUnVudGltZUJ1aWxkaW5nQmxvY2tcIjtcbmltcG9ydCAqIGFzIE1ldGFNb2RlbENvbnZlcnRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBDdXN0b21MaXN0SXRlbSBmcm9tIFwic2FwL20vQ3VzdG9tTGlzdEl0ZW1cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IEZsZXhJdGVtRGF0YSBmcm9tIFwic2FwL20vRmxleEl0ZW1EYXRhXCI7XG5pbXBvcnQgSEJveCBmcm9tIFwic2FwL20vSEJveFwiO1xuaW1wb3J0IExpc3QgZnJvbSBcInNhcC9tL0xpc3RcIjtcbmltcG9ydCBNZXNzYWdlU3RyaXAgZnJvbSBcInNhcC9tL01lc3NhZ2VTdHJpcFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBUb29sYmFyIGZyb20gXCJzYXAvbS9Ub29sYmFyXCI7XG5pbXBvcnQgVG9vbGJhclNwYWNlciBmcm9tIFwic2FwL20vVG9vbGJhclNwYWNlclwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHsgVmFsdWVTdGF0ZSB9IGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IFNvcnRlciBmcm9tIFwic2FwL3VpL21vZGVsL1NvcnRlclwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT0RhdGFWNENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgRXZlbnRIYW5kbGVyIH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcIi4uLy4uL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCIuLi8uLi9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IEFjY2VwdEFsbFBhcmFtcyB9IGZyb20gXCIuLi8uLi9jb250cm9sbGVyZXh0ZW5zaW9ucy9SZWNvbW1lbmRhdGlvbnNcIjtcbmltcG9ydCB2YWx1ZUZvcm1hdHRlcnMgZnJvbSBcIi4uLy4uL2Zvcm1hdHRlcnMvVmFsdWVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7IHN0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXIsIHR5cGUgU3RhbmRhcmRSZWNvbW1lbmRhdGlvbkRhdGFUeXBlIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvU3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlclwiO1xuXG5leHBvcnQgZW51bSBSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIHtcblx0QWNjZXB0ID0gXCJBY2NlcHRfUmVjb21tZW5kYXRpb25zXCIsXG5cdElnbm9yZSA9IFwiSWdub3JlX1JlY29tbWVuZGF0aW9uc1wiLFxuXHRDb250aW51ZSA9IFwiQ29udGludWVfRWRpdGluZ1wiLFxuXHRTa2lwcGVkID0gXCJTa2lwcGVkXCJcbn1cblxuQGRlZmluZUJ1aWxkaW5nQmxvY2soe1xuXHRuYW1lOiBcIkNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ1wiLFxuXHRuYW1lc3BhY2U6IFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnNcIlxufSlcbmV4cG9ydCBjbGFzcyBDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dCbG9jayBleHRlbmRzIFJ1bnRpbWVCdWlsZGluZ0Jsb2NrIHtcblx0Y29uc3RydWN0b3IocHJvcHM6IFByb3BlcnRpZXNPZjxDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dCbG9jaz4pIHtcblx0XHRzdXBlcihwcm9wcyk7XG5cdFx0dGhpcy52aWV3ID0gcHJvcHMudmlldyBhcyBWaWV3O1xuXHRcdHRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nUmVzb3VyY2VNb2RlbCA9IGdldFJlc291cmNlTW9kZWwodGhpcy52aWV3KTtcblx0fVxuXG5cdEBkZWZpbmVSZWZlcmVuY2UoKVxuXHRjb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2chOiBSZWY8RGlhbG9nPjtcblxuXHRwdWJsaWMgdmlldyE6IFZpZXc7XG5cblx0cHJpdmF0ZSBjb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dSZXNvdXJjZU1vZGVsITogUmVzb3VyY2VNb2RlbDtcblxuXHRwcm90ZWN0ZWQga2V5ITogc3RyaW5nO1xuXG5cdHByaXZhdGUgaXNTYXZlITogYm9vbGVhbjtcblxuXHRwcml2YXRlIGFjY2VwdEFsbFBhcmFtcyE6IEFjY2VwdEFsbFBhcmFtcztcblxuXHQvKipcblx0ICogUmVzb2x2ZXMgdGhlIHByb21pc2Ugd2l0aCB0aGUgc2VsZWN0ZWQgZGlhbG9nIGxpc3Qgb3B0aW9uXG5cdCAqL1xuXHRwcml2YXRlIHByb21pc2VSZXNvbHZlITogRnVuY3Rpb247XG5cblx0LyoqXG5cdCAqIFJlamVjdHMgdGhlIHByb21pc2Ugb2Ygb3BlbiBkaWFsb2dcblx0ICovXG5cdHByaXZhdGUgcHJvbWlzZVJlamVjdCE6IEZ1bmN0aW9uO1xuXG5cdC8qKlxuXHQgKiBPcGVucyB0aGUgY29uZmlybSByZWNvbW1lbmRhdGlvbnMgZGlhbG9nLlxuXHQgKlxuXHQgKiBAcGFyYW0gaXNTYXZlIEJvb2xlYW4gZmxhZyB3aGljaCB3b3VsZCBiZSBzZXQgdG8gdHJ1ZSBpZiB3ZSBhcmUgc2F2aW5nIHRoZSBkb2N1bWVudCBhbmQgd291bGQgYmUgZmFsc2UgaWYgd2UgZG8gYXBwbHkgY2hhbmdlc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHdvdWxkIHJlc29sdmUgd2l0aCBSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIChBY2NlcHQsIElnbm9yZSwgQ29udGludWUsIFNraXBwZWQpXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgb3Blbihpc1NhdmU6IGJvb2xlYW4pOiBQcm9taXNlPFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24+IHtcblx0XHR0aGlzLmFjY2VwdEFsbFBhcmFtcyA9IGF3YWl0ICh0aGlzLnZpZXc/LmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikucmVjb21tZW5kYXRpb25zLmZldGNoQWNjZXB0QWxsUGFyYW1zKCk7XG5cdFx0Y29uc3QgYWNjZXB0TW9kZWwgPSB0aGlzLmdldEFjY2VwdEFsbE1vZGVsKCk7XG5cdFx0dGhpcy52aWV3LnNldE1vZGVsKGFjY2VwdE1vZGVsLCBcIl9hY2NlcHREaWFsb2dNb2RlbFwiKTtcblx0XHRpZiAoIWFjY2VwdE1vZGVsLmdldERhdGEoKS5pdGVtcz8ubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Ta2lwcGVkO1xuXHRcdH1cblx0XHR0aGlzLmlzU2F2ZSA9IGlzU2F2ZTtcblx0XHRjb25zdCBkaWFsb2cgPSB0aGlzLmdldENvbnRlbnQoKTtcblx0XHRkaWFsb2c/LnNldEVzY2FwZUhhbmRsZXIodGhpcy5vbkNvbnRpbnVlRWRpdGluZy5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLnZpZXcuYWRkRGVwZW5kZW50KGRpYWxvZyBhcyBVSTVFbGVtZW50KTtcblx0XHRkaWFsb2c/Lm9wZW4oKTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0dGhpcy5wcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0XHR0aGlzLnByb21pc2VSZWplY3QgPSByZWplY3Q7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlciB0byBjbG9zZSB0aGUgY29uZmlybVJlY29tbWVuZGF0aW9uIGRpYWxvZy5cblx0ICpcblx0ICovXG5cdHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcblx0XHR0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZy5jdXJyZW50Py5jbG9zZSgpO1xuXHRcdHRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nLmN1cnJlbnQ/LmRlc3Ryb3koKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVyIGZvciBBY2NlcHQgYW5kIFNhdmUgYnV0dG9uLlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBvbkFjY2VwdEFuZFNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGlzQWNjZXB0ZWQgPSBhd2FpdCAodGhpcy52aWV3Py5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLnJlY29tbWVuZGF0aW9ucy5hY2NlcHRSZWNvbW1lbmRhdGlvbnMoXG5cdFx0XHRcdHRoaXMuYWNjZXB0QWxsUGFyYW1zXG5cdFx0XHQpO1xuXHRcdFx0aWYgKCFpc0FjY2VwdGVkKSB7XG5cdFx0XHRcdHRoaXMucHJvbWlzZVJlamVjdChcIkFjY2VwdCBGYWlsZWRcIik7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnByb21pc2VSZXNvbHZlKFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQWNjZXB0KTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdExvZy5lcnJvcihcIkFjY2VwdCBSZWNvbW1lbmRhdGlvbnMgRmFpbGVkXCIpO1xuXHRcdFx0dGhpcy5wcm9taXNlUmVqZWN0KFwiQWNjZXB0IEZhaWxlZFwiKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVyIGZvciBJZ25vcmUgYW5kIFNhdmUgYnV0dG9uLlxuXHQgKi9cblx0cHJpdmF0ZSBvbklnbm9yZUFuZFNhdmUoKTogdm9pZCB7XG5cdFx0KHRoaXMudmlldz8uZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5yZWNvbW1lbmRhdGlvbnMuaWdub3JlUmVjb21tZW5kYXRpb25Gb3JDb250ZXh0cygpO1xuXHRcdHRoaXMucHJvbWlzZVJlc29sdmUoUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5JZ25vcmUpO1xuXHRcdHRoaXMuY2xvc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVyIGZvciBDb250aW51ZSBFZGl0aW5nIGJ1dHRvbi5cblx0ICovXG5cdHByaXZhdGUgb25Db250aW51ZUVkaXRpbmcoKTogdm9pZCB7XG5cdFx0dGhpcy5wcm9taXNlUmVzb2x2ZShSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uLkNvbnRpbnVlKTtcblx0XHR0aGlzLmNsb3NlKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgbGFiZWwgb3IgbmFtZSBvZiB0aGUgRmllbGQgYmFzZWQgb24gaXRzIHByb3BlcnR5IHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIGxhYmVsIG9mIHRoZSBGaWVsZC5cblx0ICovXG5cdHByaXZhdGUgZ2V0RmllbGROYW1lKHRhcmdldFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Y29uc3QgaW52b2x2ZWREYXRhTW9kZWxPYmplY3QgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzRm9yVGFyZ2V0UGF0aDxQcm9wZXJ0eT4oXG5cdFx0XHR0YXJnZXRQYXRoLFxuXHRcdFx0dGhpcy52aWV3Py5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbFxuXHRcdCk7XG5cdFx0cmV0dXJuIChcblx0XHRcdGludm9sdmVkRGF0YU1vZGVsT2JqZWN0Py50YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy50b1N0cmluZygpIHx8XG5cdFx0XHR0YXJnZXRQYXRoLnNwbGl0KFwiL1wiKVt0YXJnZXRQYXRoLnNwbGl0KFwiL1wiKS5sZW5ndGggLSAxXVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogRmV0Y2hlcyB0ZXh0IGZvciByZWNvbW1lbmRhdGlvbiBiYXNlZCBvbiBkaXNwbGF5IG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvblxuXHQgKiBAcGFyYW0gZGlzcGxheU1vZGVcblx0ICogQHJldHVybnMgVGV4dCBmb3IgYSByZWNvbW1lbmRhdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRUZXh0KHJlY29tbWVuZGF0aW9uOiBTdGFuZGFyZFJlY29tbWVuZGF0aW9uRGF0YVR5cGUsIGRpc3BsYXlNb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGlmIChyZWNvbW1lbmRhdGlvbi50ZXh0IHx8IHJlY29tbWVuZGF0aW9uLnZhbHVlKSB7XG5cdFx0XHRzd2l0Y2ggKGRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdHJldHVybiByZWNvbW1lbmRhdGlvbi50ZXh0ITtcblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uVmFsdWVcIjpcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWVGb3JtYXR0ZXJzLmZvcm1hdFdpdGhCcmFja2V0cyhyZWNvbW1lbmRhdGlvbi50ZXh0LCByZWNvbW1lbmRhdGlvbi52YWx1ZSk7XG5cdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlRm9ybWF0dGVycy5mb3JtYXRXaXRoQnJhY2tldHMocmVjb21tZW5kYXRpb24udmFsdWUsIHJlY29tbWVuZGF0aW9uLnRleHQpO1xuXHRcdFx0XHRjYXNlIFwiVmFsdWVcIjpcblx0XHRcdFx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb24udmFsdWUhO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb24udmFsdWUgfHwgXCJcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIEJ1dHRvbiB3aXRoIGdpdmVuIHRleHQsIHR5cGUgYW5kIHByZXNzSGFuZGxlci5cblx0ICpcblx0ICogQHBhcmFtIHRleHQgVGV4dCBmb3IgdGhlIGJ1dHRvblxuXHQgKiBAcGFyYW0gdHlwZSBUeXBlIG9mIHRoZSBidXR0b25cblx0ICogQHBhcmFtIHByZXNzSGFuZGxlciBQcmVzcyBIYW5kbGVyIGZvciB0aGUgYnV0dG9uXG5cdCAqIEByZXR1cm5zIEJ1dHRvbiB3aXRoIHRoZSBnaXZlbiBzZXR0aW5nc1xuXHQgKi9cblx0cHJpdmF0ZSBnZXRCdXR0b24odGV4dDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIHByZXNzSGFuZGxlcjogRXZlbnRIYW5kbGVyKTogQnV0dG9uIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0PEJ1dHRvbiB0ZXh0PXt0ZXh0fSB0eXBlPXt0eXBlfSB3aWR0aD17XCJhdXRvXCJ9IHByZXNzPXtwcmVzc0hhbmRsZXJ9PlxuXHRcdFx0XHR7e1xuXHRcdFx0XHRcdGxheW91dERhdGE6IChcblx0XHRcdFx0XHRcdDw+XG5cdFx0XHRcdFx0XHRcdDxGbGV4SXRlbURhdGEgbWluV2lkdGg9e1wiMTAwJVwifT48L0ZsZXhJdGVtRGF0YT5cblx0XHRcdFx0XHRcdDwvPlxuXHRcdFx0XHRcdClcblx0XHRcdFx0fX1cblx0XHRcdDwvQnV0dG9uPlxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBGb290ZXIgd2l0aCBCdXR0b25zLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBGb290ZXJcblx0ICovXG5cblx0cHJpdmF0ZSBnZXRGb290ZXIoKTogVG9vbGJhciB7XG5cdFx0cmV0dXJuIChcblx0XHRcdDxUb29sYmFyPlxuXHRcdFx0XHR7e1xuXHRcdFx0XHRcdGNvbnRlbnQ6IChcblx0XHRcdFx0XHRcdDw+XG5cdFx0XHRcdFx0XHRcdDxUb29sYmFyU3BhY2VyIC8+XG5cdFx0XHRcdFx0XHRcdHt0aGlzLmdldEJ1dHRvbihcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmlzU2F2ZVxuXHRcdFx0XHRcdFx0XHRcdFx0PyB0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ1Jlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfUkVDT01NRU5EQVRJT05fRElBTE9HX0FDQ0VQVF9BTkRfU0FWRVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiB0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ1Jlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfUkVDT01NRU5EQVRJT05fRElBTE9HX0FDQ0VQVFwiKSxcblx0XHRcdFx0XHRcdFx0XHRcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm9uQWNjZXB0QW5kU2F2ZS5iaW5kKHRoaXMpXG5cdFx0XHRcdFx0XHRcdCl9XG5cdFx0XHRcdFx0XHRcdHt0aGlzLmdldEJ1dHRvbihcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmlzU2F2ZVxuXHRcdFx0XHRcdFx0XHRcdFx0PyB0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ1Jlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfUkVDT01NRU5EQVRJT05fRElBTE9HX0lHTk9SRV9BTkRfU0FWRVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiB0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ1Jlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfUkVDT01NRU5EQVRJT05fRElBTE9HX0lHTk9SRVwiKSxcblx0XHRcdFx0XHRcdFx0XHRcIkdob3N0XCIsXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5vbklnbm9yZUFuZFNhdmUuYmluZCh0aGlzKVxuXHRcdFx0XHRcdFx0XHQpfVxuXHRcdFx0XHRcdFx0XHR7dGhpcy5nZXRCdXR0b24oXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dSZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1JFQ09NTUVOREFUSU9OX0RJQUxPR19DT05USU5VRV9FRElUSU5HXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFwiR2hvc3RcIixcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm9uQ29udGludWVFZGl0aW5nLmJpbmQodGhpcylcblx0XHRcdFx0XHRcdFx0KX1cblx0XHRcdFx0XHRcdDwvPlxuXHRcdFx0XHRcdClcblx0XHRcdFx0fX1cblx0XHRcdDwvVG9vbGJhcj5cblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGNyZWF0ZWQgYSBKU09OIE1vZGVsIGZvciB0aGUgYWNjZXB0IGFsbCBkaWFsb2cgZGF0YS5cblx0ICogQHJldHVybnMgVGhlIEpTT04gTW9kZWwgZm9yIGFjY2VwdCBhbGwgZGlhbG9nLlxuXHQgKi9cblx0Z2V0QWNjZXB0QWxsTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRjb25zdCBhY2NlcHRNb2RlbCA9IG5ldyBKU09OTW9kZWwoKTtcblx0XHRjb25zdCBpdGVtcyA9IFtdO1xuXHRcdGZvciAoY29uc3QgcmVjb21tZW5kYXRpb25EYXRhIG9mIHRoaXMuYWNjZXB0QWxsUGFyYW1zPy5yZWNvbW1lbmRhdGlvbkRhdGEgfHwgW10pIHtcblx0XHRcdGNvbnN0IGVudGl0eU5hbWVMYWJlbCA9IHN0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXIuZ2V0RW50aXR5TmFtZShyZWNvbW1lbmRhdGlvbkRhdGEuY29udGV4dCBhcyBPRGF0YVY0Q29udGV4dCkgfHwgXCJcIjtcblxuXHRcdFx0Y29uc3QgaWRlbnRpZmllclRleHRzID1cblx0XHRcdFx0cmVjb21tZW5kYXRpb25EYXRhLmNvbnRleHRJZGVudGlmaWVyVGV4dCAmJiByZWNvbW1lbmRhdGlvbkRhdGEuY29udGV4dElkZW50aWZpZXJUZXh0Lmxlbmd0aCA+IDBcblx0XHRcdFx0XHQ/IGAke2VudGl0eU5hbWVMYWJlbH0gKCR7cmVjb21tZW5kYXRpb25EYXRhLmNvbnRleHRJZGVudGlmaWVyVGV4dH0pYFxuXHRcdFx0XHRcdDogZW50aXR5TmFtZUxhYmVsO1xuXG5cdFx0XHRpZiAocmVjb21tZW5kYXRpb25EYXRhLnZhbHVlIHx8IHJlY29tbWVuZGF0aW9uRGF0YS50ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IHRhcmdldFBhdGggPSByZWNvbW1lbmRhdGlvbkRhdGEuY29udGV4dD8uZ2V0UGF0aCgpICsgXCIvXCIgKyByZWNvbW1lbmRhdGlvbkRhdGEucHJvcGVydHlQYXRoO1xuXHRcdFx0XHRjb25zdCBkaXNwbGF5TW9kZSA9IHN0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXIuZ2V0RGlzcGxheU1vZGVGb3JUYXJnZXRQYXRoKFxuXHRcdFx0XHRcdHRhcmdldFBhdGgsXG5cdFx0XHRcdFx0dGhpcy52aWV3Py5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBsaXN0RGF0YSA9IHtcblx0XHRcdFx0XHRmaWVsZE5hbWU6IHRoaXMuZ2V0RmllbGROYW1lKHRhcmdldFBhdGgpLnZhbHVlT2YoKSxcblx0XHRcdFx0XHRmaWVsZFZhbHVlOiB0aGlzLmdldFRleHQocmVjb21tZW5kYXRpb25EYXRhLCBkaXNwbGF5TW9kZSksXG5cdFx0XHRcdFx0aWRlbnRpZmllclRleHRzOiBpZGVudGlmaWVyVGV4dHNcblx0XHRcdFx0fTtcblx0XHRcdFx0aXRlbXMucHVzaChsaXN0RGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGFjY2VwdE1vZGVsLnNldERhdGEoeyBpdGVtczogaXRlbXMgfSk7XG5cdFx0cmV0dXJuIGFjY2VwdE1vZGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGdyb3VwcyB0aGUgY29udGV4dHMgYWNjb3JkaW5nIHRvIHRoZSBpZGVudGlmaWVyIHRleHRzLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgaXRlbVxuXHQgKiBAcmV0dXJucyBUaGUgdGV4dCBvZiB0aGUgZ3JvdXBcblx0ICovXG5cdGdldEdyb3VwKGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogc3RyaW5nIHtcblx0XHRyZXR1cm4gY29udGV4dC5nZXRQcm9wZXJ0eShcImlkZW50aWZpZXJUZXh0c1wiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaXAgdG8gYmUgc2hvd24gaW4gdGhlIGFjY2VwdCBkaWFsb2cuXG5cdCAqIEByZXR1cm5zIEEgbWVzc2FnZSBzdHJpcCB3aXRoIHRoZSBkZXNpcmVkIHRleHQuXG5cdCAqL1xuXHRnZXRNZXNzYWdlU3RyaXAoKTogTWVzc2FnZVN0cmlwIHtcblx0XHRjb25zdCBhY2NlcHRBbGxEYXRhID0gKHRoaXMudmlldy5nZXRNb2RlbChcIl9hY2NlcHREaWFsb2dNb2RlbFwiKSBhcyBKU09OTW9kZWwpPy5nZXREYXRhKCk/Lml0ZW1zO1xuXHRcdGNvbnN0IG1lc3NhZ2VTdHJpcFRleHQgPVxuXHRcdFx0YWNjZXB0QWxsRGF0YS5sZW5ndGggPiAxXG5cdFx0XHRcdD8gdGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dSZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1JFQ09NTUVOREFUSU9OX0RJQUxPR19URVhUXCIsIFthY2NlcHRBbGxEYXRhLmxlbmd0aF0pXG5cdFx0XHRcdDogdGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dSZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1JFQ09NTUVOREFUSU9OX0RJQUxPR19URVhUX1NJTkdVTEFSXCIpO1xuXHRcdHJldHVybiA8TWVzc2FnZVN0cmlwIHRleHQ9e21lc3NhZ2VTdHJpcFRleHR9IC8+O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgdGhlIGNvbnRlbnQgZm9yIHRoZSBkaWFsb2cuXG5cdCAqIEByZXR1cm5zIEEgbGlzdCBhcyBjb250ZW50IG9mIHRoZSBkaWFsb2cuXG5cdCAqL1xuXHRnZXREaWFsb2dDb250ZW50KCk6IExpc3Qge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8TGlzdCBpdGVtcz17eyBtb2RlbDogXCJfYWNjZXB0RGlhbG9nTW9kZWxcIiwgcGF0aDogXCIvaXRlbXNcIiwgc29ydGVyOiBuZXcgU29ydGVyKFwiaWRlbnRpZmllclRleHRzXCIsIGZhbHNlLCB0aGlzLmdldEdyb3VwKSB9fT5cblx0XHRcdFx0PEN1c3RvbUxpc3RJdGVtPlxuXHRcdFx0XHRcdDxIQm94IGNsYXNzPVwic2FwVWlTbWFsbE1hcmdpbkJlZ2luIHNhcFVpVGlueU1hcmdpblwiPlxuXHRcdFx0XHRcdFx0PFRleHQgdGV4dD1cIntfYWNjZXB0RGlhbG9nTW9kZWw+ZmllbGROYW1lfToge19hY2NlcHREaWFsb2dNb2RlbD5maWVsZFZhbHVlfVwiIC8+XG5cdFx0XHRcdFx0PC9IQm94PlxuXHRcdFx0XHQ8L0N1c3RvbUxpc3RJdGVtPlxuXHRcdFx0PC9MaXN0PlxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJ1aWxkaW5nIGJsb2NrIHJlbmRlciBmdW5jdGlvbi5cblx0ICpcblx0ICogQHJldHVybnMgQW4gWE1MLWJhc2VkIHN0cmluZ1xuXHQgKi9cblx0Z2V0Q29udGVudCgpOiBEaWFsb2cge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8RGlhbG9nXG5cdFx0XHRcdHRpdGxlPXt0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ1Jlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfUkVDT01NRU5EQVRJT05fRElBTE9HX1RJVExFXCIpfVxuXHRcdFx0XHRzdGF0ZT17VmFsdWVTdGF0ZS5JbmZvcm1hdGlvbn1cblx0XHRcdFx0dHlwZT17XCJNZXNzYWdlXCJ9XG5cdFx0XHRcdHJlZj17dGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2d9XG5cdFx0XHRcdHJlc2l6YWJsZT17XCJ0cnVlXCJ9XG5cdFx0XHRcdGNvbnRlbnRXaWR0aD17XCIzNXJlbVwifVxuXHRcdFx0PlxuXHRcdFx0XHR7e1xuXHRcdFx0XHRcdGNvbnRlbnQ6IChcblx0XHRcdFx0XHRcdDw+XG5cdFx0XHRcdFx0XHRcdHt0aGlzLmdldE1lc3NhZ2VTdHJpcCgpfVxuXHRcdFx0XHRcdFx0XHR7dGhpcy5nZXREaWFsb2dDb250ZW50KCl9XG5cdFx0XHRcdFx0XHQ8Lz5cblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGZvb3RlcjogPD57dGhpcy5nZXRGb290ZXIoKX08Lz5cblx0XHRcdFx0fX1cblx0XHRcdDwvRGlhbG9nPlxuXHRcdCkgYXMgRGlhbG9nO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O01BaUNZQSw0QkFBNEI7RUFBQSxXQUE1QkEsNEJBQTRCO0lBQTVCQSw0QkFBNEI7SUFBNUJBLDRCQUE0QjtJQUE1QkEsNEJBQTRCO0lBQTVCQSw0QkFBNEI7RUFBQSxHQUE1QkEsNEJBQTRCLEtBQTVCQSw0QkFBNEI7RUFBQTtFQUFBLElBVzNCQyxnQ0FBZ0MsV0FKNUNDLG1CQUFtQixDQUFDO0lBQ3BCQyxJQUFJLEVBQUUsNkJBQTZCO0lBQ25DQyxTQUFTLEVBQUU7RUFDWixDQUFDLENBQUMsVUFRQUMsZUFBZSxFQUFFO0lBQUE7SUFObEIsMENBQVlDLEtBQXFELEVBQUU7TUFBQTtNQUNsRSx5Q0FBTUEsS0FBSyxDQUFDO01BQUM7TUFDYixNQUFLQyxJQUFJLEdBQUdELEtBQUssQ0FBQ0MsSUFBWTtNQUM5QixNQUFLQyx3Q0FBd0MsR0FBR0MsZ0JBQWdCLENBQUMsTUFBS0YsSUFBSSxDQUFDO01BQUM7SUFDN0U7SUFBQztJQUFBO0lBeUJEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUxDLE9BTWFHLElBQUksR0FBakIsb0JBQWtCQyxNQUFlLEVBQXlDO01BQUE7TUFDekUsSUFBSSxDQUFDQyxlQUFlLEdBQUcsTUFBTSxlQUFDLElBQUksQ0FBQ0wsSUFBSSwrQ0FBVCxXQUFXTSxhQUFhLEVBQUUsRUFBb0JDLGVBQWUsQ0FBQ0Msb0JBQW9CLEVBQUU7TUFDbEgsTUFBTUMsV0FBVyxHQUFHLElBQUksQ0FBQ0MsaUJBQWlCLEVBQUU7TUFDNUMsSUFBSSxDQUFDVixJQUFJLENBQUNXLFFBQVEsQ0FBQ0YsV0FBVyxFQUFFLG9CQUFvQixDQUFDO01BQ3JELElBQUksMkJBQUNBLFdBQVcsQ0FBQ0csT0FBTyxFQUFFLENBQUNDLEtBQUssa0RBQTNCLHNCQUE2QkMsTUFBTSxHQUFFO1FBQ3pDLE9BQU9yQiw0QkFBNEIsQ0FBQ3NCLE9BQU87TUFDNUM7TUFDQSxJQUFJLENBQUNYLE1BQU0sR0FBR0EsTUFBTTtNQUNwQixNQUFNWSxNQUFNLEdBQUcsSUFBSSxDQUFDQyxVQUFVLEVBQUU7TUFDaENELE1BQU0sYUFBTkEsTUFBTSx1QkFBTkEsTUFBTSxDQUFFRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUNDLGlCQUFpQixDQUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDM0QsSUFBSSxDQUFDcEIsSUFBSSxDQUFDcUIsWUFBWSxDQUFDTCxNQUFNLENBQWU7TUFDNUNBLE1BQU0sYUFBTkEsTUFBTSx1QkFBTkEsTUFBTSxDQUFFYixJQUFJLEVBQUU7TUFDZCxPQUFPLElBQUltQixPQUFPLENBQUMsQ0FBQ0MsT0FBTyxFQUFFQyxNQUFNLEtBQUs7UUFDdkMsSUFBSSxDQUFDQyxjQUFjLEdBQUdGLE9BQU87UUFDN0IsSUFBSSxDQUFDRyxhQUFhLEdBQUdGLE1BQU07TUFDNUIsQ0FBQyxDQUFDO0lBQ0g7O0lBRUE7QUFDRDtBQUNBO0FBQ0EsT0FIQztJQUFBLE9BSU9HLEtBQUssR0FBWixpQkFBcUI7TUFBQTtNQUNwQiw2QkFBSSxDQUFDQywyQkFBMkIsQ0FBQ0MsT0FBTywwREFBeEMsc0JBQTBDRixLQUFLLEVBQUU7TUFDakQsOEJBQUksQ0FBQ0MsMkJBQTJCLENBQUNDLE9BQU8sMkRBQXhDLHVCQUEwQ0MsT0FBTyxFQUFFO0lBQ3BEOztJQUVBO0FBQ0Q7QUFDQSxPQUZDO0lBQUEsT0FHY0MsZUFBZSxHQUE3QixpQ0FBK0M7TUFDOUMsSUFBSTtRQUFBO1FBQ0gsTUFBTUMsVUFBVSxHQUFHLE1BQU0sZ0JBQUMsSUFBSSxDQUFDaEMsSUFBSSxnREFBVCxZQUFXTSxhQUFhLEVBQUUsRUFBb0JDLGVBQWUsQ0FBQzBCLHFCQUFxQixDQUM1RyxJQUFJLENBQUM1QixlQUFlLENBQ3BCO1FBQ0QsSUFBSSxDQUFDMkIsVUFBVSxFQUFFO1VBQ2hCLElBQUksQ0FBQ04sYUFBYSxDQUFDLGVBQWUsQ0FBQztRQUNwQztRQUNBLElBQUksQ0FBQ0QsY0FBYyxDQUFDaEMsNEJBQTRCLENBQUN5QyxNQUFNLENBQUM7TUFDekQsQ0FBQyxDQUFDLE1BQU07UUFDUEMsR0FBRyxDQUFDQyxLQUFLLENBQUMsK0JBQStCLENBQUM7UUFDMUMsSUFBSSxDQUFDVixhQUFhLENBQUMsZUFBZSxDQUFDO01BQ3BDLENBQUMsU0FBUztRQUNULElBQUksQ0FBQ0MsS0FBSyxFQUFFO01BQ2I7SUFDRDs7SUFFQTtBQUNEO0FBQ0EsT0FGQztJQUFBLE9BR1FVLGVBQWUsR0FBdkIsMkJBQWdDO01BQUE7TUFDL0IsZ0JBQUMsSUFBSSxDQUFDckMsSUFBSSxnREFBVCxZQUFXTSxhQUFhLEVBQUUsRUFBb0JDLGVBQWUsQ0FBQytCLCtCQUErQixFQUFFO01BQ2hHLElBQUksQ0FBQ2IsY0FBYyxDQUFDaEMsNEJBQTRCLENBQUM4QyxNQUFNLENBQUM7TUFDeEQsSUFBSSxDQUFDWixLQUFLLEVBQUU7SUFDYjs7SUFFQTtBQUNEO0FBQ0EsT0FGQztJQUFBLE9BR1FSLGlCQUFpQixHQUF6Qiw2QkFBa0M7TUFDakMsSUFBSSxDQUFDTSxjQUFjLENBQUNoQyw0QkFBNEIsQ0FBQytDLFFBQVEsQ0FBQztNQUMxRCxJQUFJLENBQUNiLEtBQUssRUFBRTtJQUNiOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUxDO0lBQUEsT0FNUWMsWUFBWSxHQUFwQixzQkFBcUJDLFVBQWtCLEVBQVU7TUFBQTtNQUNoRCxNQUFNQyx1QkFBdUIsR0FBR0Msa0JBQWtCLENBQUNDLHdDQUF3QyxDQUMxRkgsVUFBVSxpQkFDVixJQUFJLENBQUMxQyxJQUFJLHlFQUFULFlBQVc4QyxpQkFBaUIsRUFBRSxvRkFBOUIsc0JBQWdDQyxRQUFRLEVBQUUsMkRBQTFDLHVCQUE0Q0MsWUFBWSxFQUFFLENBQzFEO01BQ0QsT0FDQyxDQUFBTCx1QkFBdUIsYUFBdkJBLHVCQUF1QixnREFBdkJBLHVCQUF1QixDQUFFTSxZQUFZLG9GQUFyQyxzQkFBdUNDLFdBQVcscUZBQWxELHVCQUFvREMsTUFBTSxxRkFBMUQsdUJBQTREQyxLQUFLLDJEQUFqRSx1QkFBbUVDLFFBQVEsRUFBRSxLQUM3RVgsVUFBVSxDQUFDWSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUNaLFVBQVUsQ0FBQ1ksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDeEMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUV6RDs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQU5DO0lBQUEsT0FPUXlDLE9BQU8sR0FBZixpQkFBZ0JDLGNBQThDLEVBQUVDLFdBQW1CLEVBQVU7TUFDNUYsSUFBSUQsY0FBYyxDQUFDRSxJQUFJLElBQUlGLGNBQWMsQ0FBQ0csS0FBSyxFQUFFO1FBQ2hELFFBQVFGLFdBQVc7VUFDbEIsS0FBSyxhQUFhO1lBQ2pCLE9BQU9ELGNBQWMsQ0FBQ0UsSUFBSTtVQUMzQixLQUFLLGtCQUFrQjtZQUN0QixPQUFPRSxlQUFlLENBQUNDLGtCQUFrQixDQUFDTCxjQUFjLENBQUNFLElBQUksRUFBRUYsY0FBYyxDQUFDRyxLQUFLLENBQUM7VUFDckYsS0FBSyxrQkFBa0I7WUFDdEIsT0FBT0MsZUFBZSxDQUFDQyxrQkFBa0IsQ0FBQ0wsY0FBYyxDQUFDRyxLQUFLLEVBQUVILGNBQWMsQ0FBQ0UsSUFBSSxDQUFDO1VBQ3JGLEtBQUssT0FBTztZQUNYLE9BQU9GLGNBQWMsQ0FBQ0csS0FBSztRQUFFO01BRWhDO01BQ0EsT0FBT0gsY0FBYyxDQUFDRyxLQUFLLElBQUksRUFBRTtJQUNsQzs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BUEM7SUFBQSxPQVFRRyxTQUFTLEdBQWpCLG1CQUFrQkosSUFBWSxFQUFFSyxJQUFZLEVBQUVDLFlBQTBCLEVBQVU7TUFDakYsT0FDQyxLQUFDLE1BQU07UUFBQyxJQUFJLEVBQUVOLElBQUs7UUFBQyxJQUFJLEVBQUVLLElBQUs7UUFBQyxLQUFLLEVBQUUsTUFBTztRQUFDLEtBQUssRUFBRUMsWUFBYTtRQUFBLFVBQ2pFO1VBQ0FDLFVBQVUsRUFDVDtZQUFBLFVBQ0MsS0FBQyxZQUFZO2NBQUMsUUFBUSxFQUFFO1lBQU87VUFBZ0I7UUFHbEQ7TUFBQyxFQUNPO0lBRVg7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQSxPQUpDO0lBQUEsT0FNUUMsU0FBUyxHQUFqQixxQkFBNkI7TUFDNUIsT0FDQyxLQUFDLE9BQU87UUFBQSxVQUNOO1VBQ0FDLE9BQU8sRUFDTjtZQUFBLFdBQ0MsS0FBQyxhQUFhLEtBQUcsRUFDaEIsSUFBSSxDQUFDTCxTQUFTLENBQ2QsSUFBSSxDQUFDMUQsTUFBTSxHQUNSLElBQUksQ0FBQ0gsd0NBQXdDLENBQUNzRCxPQUFPLENBQUMseUNBQXlDLENBQUMsR0FDaEcsSUFBSSxDQUFDdEQsd0NBQXdDLENBQUNzRCxPQUFPLENBQUMsZ0NBQWdDLENBQUMsRUFDMUYsWUFBWSxFQUNaLElBQUksQ0FBQ3hCLGVBQWUsQ0FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUMvQixFQUNBLElBQUksQ0FBQzBDLFNBQVMsQ0FDZCxJQUFJLENBQUMxRCxNQUFNLEdBQ1IsSUFBSSxDQUFDSCx3Q0FBd0MsQ0FBQ3NELE9BQU8sQ0FBQyx5Q0FBeUMsQ0FBQyxHQUNoRyxJQUFJLENBQUN0RCx3Q0FBd0MsQ0FBQ3NELE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUMxRixPQUFPLEVBQ1AsSUFBSSxDQUFDbEIsZUFBZSxDQUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUMvQixFQUNBLElBQUksQ0FBQzBDLFNBQVMsQ0FDZCxJQUFJLENBQUM3RCx3Q0FBd0MsQ0FBQ3NELE9BQU8sQ0FBQywwQ0FBMEMsQ0FBQyxFQUNqRyxPQUFPLEVBQ1AsSUFBSSxDQUFDcEMsaUJBQWlCLENBQUNDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDakM7VUFBQTtRQUdKO01BQUMsRUFDUTtJQUVaOztJQUVBO0FBQ0Q7QUFDQTtBQUNBLE9BSEM7SUFBQSxPQUlBVixpQkFBaUIsR0FBakIsNkJBQStCO01BQzlCLE1BQU1ELFdBQVcsR0FBRyxJQUFJMkQsU0FBUyxFQUFFO01BQ25DLE1BQU12RCxLQUFLLEdBQUcsRUFBRTtNQUNoQixLQUFLLE1BQU13RCxrQkFBa0IsSUFBSSw4QkFBSSxDQUFDaEUsZUFBZSwwREFBcEIsc0JBQXNCZ0Usa0JBQWtCLEtBQUksRUFBRSxFQUFFO1FBQUE7UUFDaEYsTUFBTUMsZUFBZSxHQUFHQyw0QkFBNEIsQ0FBQ0MsYUFBYSxDQUFDSCxrQkFBa0IsQ0FBQ0ksT0FBTyxDQUFtQixJQUFJLEVBQUU7UUFFdEgsTUFBTUMsZUFBZSxHQUNwQkwsa0JBQWtCLENBQUNNLHFCQUFxQixJQUFJTixrQkFBa0IsQ0FBQ00scUJBQXFCLENBQUM3RCxNQUFNLEdBQUcsQ0FBQyxHQUMzRixHQUFFd0QsZUFBZ0IsS0FBSUQsa0JBQWtCLENBQUNNLHFCQUFzQixHQUFFLEdBQ2xFTCxlQUFlO1FBRW5CLElBQUlELGtCQUFrQixDQUFDVixLQUFLLElBQUlVLGtCQUFrQixDQUFDWCxJQUFJLEVBQUU7VUFBQTtVQUN4RCxNQUFNaEIsVUFBVSxHQUFHLDBCQUFBMkIsa0JBQWtCLENBQUNJLE9BQU8sMERBQTFCLHNCQUE0QkcsT0FBTyxFQUFFLElBQUcsR0FBRyxHQUFHUCxrQkFBa0IsQ0FBQ1EsWUFBWTtVQUNoRyxNQUFNcEIsV0FBVyxHQUFHYyw0QkFBNEIsQ0FBQ08sMkJBQTJCLENBQzNFcEMsVUFBVSxpQkFDVixJQUFJLENBQUMxQyxJQUFJLHlFQUFULFlBQVc4QyxpQkFBaUIsRUFBRSxvRkFBOUIsc0JBQWdDQyxRQUFRLEVBQUUsMkRBQTFDLHVCQUE0Q0MsWUFBWSxFQUFFLENBQzFEO1VBQ0QsTUFBTStCLFFBQVEsR0FBRztZQUNoQkMsU0FBUyxFQUFFLElBQUksQ0FBQ3ZDLFlBQVksQ0FBQ0MsVUFBVSxDQUFDLENBQUN1QyxPQUFPLEVBQUU7WUFDbERDLFVBQVUsRUFBRSxJQUFJLENBQUMzQixPQUFPLENBQUNjLGtCQUFrQixFQUFFWixXQUFXLENBQUM7WUFDekRpQixlQUFlLEVBQUVBO1VBQ2xCLENBQUM7VUFDRDdELEtBQUssQ0FBQ3NFLElBQUksQ0FBQ0osUUFBUSxDQUFDO1FBQ3JCO01BQ0Q7TUFDQXRFLFdBQVcsQ0FBQzJFLE9BQU8sQ0FBQztRQUFFdkUsS0FBSyxFQUFFQTtNQUFNLENBQUMsQ0FBQztNQUNyQyxPQUFPSixXQUFXO0lBQ25COztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsT0FKQztJQUFBLE9BS0E0RSxRQUFRLEdBQVIsa0JBQVNaLE9BQXVCLEVBQVU7TUFDekMsT0FBT0EsT0FBTyxDQUFDYSxXQUFXLENBQUMsaUJBQWlCLENBQUM7SUFDOUM7O0lBRUE7QUFDRDtBQUNBO0FBQ0EsT0FIQztJQUFBLE9BSUFDLGVBQWUsR0FBZiwyQkFBZ0M7TUFBQTtNQUMvQixNQUFNQyxhQUFhLDBCQUFJLElBQUksQ0FBQ3hGLElBQUksQ0FBQytDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxpRkFBekMsb0JBQXlEbkMsT0FBTyxFQUFFLDBEQUFsRSxzQkFBb0VDLEtBQUs7TUFDL0YsTUFBTTRFLGdCQUFnQixHQUNyQkQsYUFBYSxDQUFDMUUsTUFBTSxHQUFHLENBQUMsR0FDckIsSUFBSSxDQUFDYix3Q0FBd0MsQ0FBQ3NELE9BQU8sQ0FBQyw4QkFBOEIsRUFBRSxDQUFDaUMsYUFBYSxDQUFDMUUsTUFBTSxDQUFDLENBQUMsR0FDN0csSUFBSSxDQUFDYix3Q0FBd0MsQ0FBQ3NELE9BQU8sQ0FBQyx1Q0FBdUMsQ0FBQztNQUNsRyxPQUFPLEtBQUMsWUFBWTtRQUFDLElBQUksRUFBRWtDO01BQWlCLEVBQUc7SUFDaEQ7O0lBRUE7QUFDRDtBQUNBO0FBQ0EsT0FIQztJQUFBLE9BSUFDLGdCQUFnQixHQUFoQiw0QkFBeUI7TUFDeEIsT0FDQyxLQUFDLElBQUk7UUFBQyxLQUFLLEVBQUU7VUFBRUMsS0FBSyxFQUFFLG9CQUFvQjtVQUFFQyxJQUFJLEVBQUUsUUFBUTtVQUFFQyxNQUFNLEVBQUUsSUFBSUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLEtBQUssRUFBRSxJQUFJLENBQUNULFFBQVE7UUFBRSxDQUFFO1FBQUEsVUFDekgsS0FBQyxjQUFjO1VBQUEsVUFDZCxLQUFDLElBQUk7WUFBQyxLQUFLLEVBQUMsdUNBQXVDO1lBQUEsVUFDbEQsS0FBQyxJQUFJO2NBQUMsSUFBSSxFQUFDO1lBQWlFO1VBQUc7UUFDekU7TUFDUyxFQUNYO0lBRVQ7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQSxPQUpDO0lBQUEsT0FLQXBFLFVBQVUsR0FBVixzQkFBcUI7TUFDcEIsT0FDQyxLQUFDLE1BQU07UUFDTixLQUFLLEVBQUUsSUFBSSxDQUFDaEIsd0NBQXdDLENBQUNzRCxPQUFPLENBQUMsK0JBQStCLENBQUU7UUFDOUYsS0FBSyxFQUFFd0MsVUFBVSxDQUFDQyxXQUFZO1FBQzlCLElBQUksRUFBRSxTQUFVO1FBQ2hCLEdBQUcsRUFBRSxJQUFJLENBQUNwRSwyQkFBNEI7UUFDdEMsU0FBUyxFQUFFLE1BQU87UUFDbEIsWUFBWSxFQUFFLE9BQVE7UUFBQSxVQUVyQjtVQUNBdUMsT0FBTyxFQUNOO1lBQUEsV0FDRSxJQUFJLENBQUNvQixlQUFlLEVBQUUsRUFDdEIsSUFBSSxDQUFDRyxnQkFBZ0IsRUFBRTtVQUFBLEVBRXpCO1VBQ0RPLE1BQU0sRUFBRTtZQUFBLFVBQUcsSUFBSSxDQUFDL0IsU0FBUztVQUFFO1FBQzVCO01BQUMsRUFDTztJQUVYLENBQUM7SUFBQTtFQUFBLEVBMVNvRGdDLG9CQUFvQjtJQUFBO0lBQUE7SUFBQTtJQUFBO0VBQUE7RUFBQTtFQUFBO0FBQUEifQ==
412
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIiwiX2V4cG9ydHMiLCJDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dCbG9jayIsIl9kZWMiLCJkZWZpbmVCdWlsZGluZ0Jsb2NrIiwibmFtZSIsIm5hbWVzcGFjZSIsIl9kZWMyIiwiZGVmaW5lUmVmZXJlbmNlIiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9SdW50aW1lQnVpbGRpbmdCbG9jayIsIl9pbmhlcml0c0xvb3NlIiwicHJvcHMiLCJfdGhpcyIsImNhbGwiLCJfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSIsIl9kZXNjcmlwdG9yIiwiX2Fzc2VydFRoaXNJbml0aWFsaXplZCIsInZpZXciLCJjb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dSZXNvdXJjZU1vZGVsIiwiZ2V0UmVzb3VyY2VNb2RlbCIsIl9wcm90byIsInByb3RvdHlwZSIsImdldE9wZW5SZWNvbW1lbmRhdGlvbnMiLCJ2aXNpYmxlQ29udGV4dFBhdGhzIiwiZ2V0VmlzaWJsZVBhZ2VDb250ZXh0UGF0aHMiLCJvcGVuUmVjb21tZW5kYXRpb25zIiwiZ2V0T3BlblJlY29tbWVuZGF0aW9uc0ZvclZpc2libGVDb250ZXh0UGF0aHMiLCJyZWNvbW1lbmRhdGlvbnMiLCJsZW5ndGgiLCJmb3JFYWNoIiwicmVjb21tZW5kYXRpb24iLCJjb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJwcm9wZXJ0eVBhdGgiLCJnZXRQcm9wZXJ0eSIsInVuZGVmaW5lZCIsInB1c2giLCJfdGhpcyR2aWV3JGdldEJpbmRpbmciLCJ2aXNpYmxlUGFnZUNvbnRleHRQYXRocyIsImdldFBhdGgiLCJjb250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsImZjbENvbnRyb2xsZXIiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJpc0ZjbEVuYWJsZWQiLCJfaXNGY2xFbmFibGVkIiwiaXNGdWxsU2NyZWVuIiwiZ2V0SGVscGVyIiwiZ2V0Q3VycmVudFVJU3RhdGUiLCJyaWdodE1vc3RDb250ZXh0IiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsImNvbnRleHRQYXRocyIsImxvY2FsQW5ub3RhdGlvbk1vZGVsIiwiZ2V0TW9kZWwiLCJnZXRMb2NhbEFubm90YXRpb25Nb2RlbCIsImNvbnRleHRQYXRoIiwibG9jYWxBbm5vdGF0aW9uT2JqZWN0IiwiZ2V0T2JqZWN0IiwiZ2V0T3BlblJlY29tbWVuZGF0aW9uc0ZvckNvbnRleHQiLCJjb250ZXh0RGF0YSIsInJlY29tbWVuZGF0aW9uQ29udGV4dCIsImNvbnRleHRLZXkiLCJhcmd1bWVudHMiLCJjdXJyZW50S2V5IiwiY3VycmVudFZhbHVlIiwiY3VycmVudFZhbHVlSXNDb250ZXh0IiwiaXNBIiwiaW5jbHVkZXMiLCJzcGxpdCIsIm9wZW5SZWNvbW1lbmRhdGlvbiIsInZhbHVlIiwiY29udGV4dElkZW50aWZpZXIiLCJjb250ZXh0SWRlbnRpZmllclRleHQiLCJkZXNjcmlwdGlvbiIsInRleHQiLCJBcnJheSIsImlzQXJyYXkiLCJvcGVuIiwiaXNTYXZlIiwiX2FjY2VwdE1vZGVsJGdldERhdGEkIiwiYWNjZXB0QWxsUGFyYW1zIiwicmVjb21tZW5kYXRpb25EYXRhIiwiX3RoaXMkdmlldyIsImxlZ2FjeVJlY29tbWVuZGF0aW9uc0V4aXN0IiwiY2hlY2tJZlJlY29tbWVuZGF0aW9uc0V4aXN0IiwiX3RoaXMkdmlldzIiLCJmZXRjaEFjY2VwdEFsbFBhcmFtcyIsImFjY2VwdE1vZGVsIiwiZ2V0QWNjZXB0QWxsTW9kZWwiLCJzZXRNb2RlbCIsImdldERhdGEiLCJpdGVtcyIsIlNraXBwZWQiLCJkaWFsb2ciLCJnZXRDb250ZW50Iiwic2V0RXNjYXBlSGFuZGxlciIsIm9uQ29udGludWVFZGl0aW5nIiwiYmluZCIsImFkZERlcGVuZGVudCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicHJvbWlzZVJlc29sdmUiLCJwcm9taXNlUmVqZWN0IiwiY2xvc2UiLCJfdGhpcyRjb25maXJtUmVjb21tZW4iLCJfdGhpcyRjb25maXJtUmVjb21tZW4yIiwiY29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nIiwiY3VycmVudCIsImRlc3Ryb3kiLCJvbkFjY2VwdEFuZFNhdmUiLCJfdGhpcyR2aWV3MyIsImlzQWNjZXB0ZWQiLCJhY2NlcHRSZWNvbW1lbmRhdGlvbnMiLCJBY2NlcHQiLCJMb2ciLCJlcnJvciIsIm9uSWdub3JlQW5kU2F2ZSIsIl90aGlzJHZpZXc0IiwiaWdub3JlUmVjb21tZW5kYXRpb25Gb3JDb250ZXh0cyIsIklnbm9yZSIsIkNvbnRpbnVlIiwiZ2V0RmllbGROYW1lIiwidGFyZ2V0UGF0aCIsIl90aGlzJHZpZXc1IiwiX3RoaXMkdmlldzUkZ2V0QmluZGluIiwiX3RoaXMkdmlldzUkZ2V0QmluZGluMiIsIl9pbnZvbHZlZERhdGFNb2RlbE9iaiIsIl9pbnZvbHZlZERhdGFNb2RlbE9iajIiLCJfaW52b2x2ZWREYXRhTW9kZWxPYmozIiwiX2ludm9sdmVkRGF0YU1vZGVsT2JqNCIsImludm9sdmVkRGF0YU1vZGVsT2JqZWN0IiwiTWV0YU1vZGVsQ29udmVydGVyIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzRm9yVGFyZ2V0UGF0aCIsImdldE1ldGFNb2RlbCIsInRhcmdldE9iamVjdCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiTGFiZWwiLCJ0b1N0cmluZyIsImdldFRleHQiLCJkaXNwbGF5TW9kZSIsInZhbHVlRm9ybWF0dGVycyIsImZvcm1hdFdpdGhCcmFja2V0cyIsImdldEJ1dHRvbiIsInR5cGUiLCJwcmVzc0hhbmRsZXIiLCJfanN4IiwiQnV0dG9uIiwid2lkdGgiLCJwcmVzcyIsImNoaWxkcmVuIiwibGF5b3V0RGF0YSIsIl9GcmFnbWVudCIsIkZsZXhJdGVtRGF0YSIsIm1pbldpZHRoIiwiZ2V0Rm9vdGVyIiwiVG9vbGJhciIsImNvbnRlbnQiLCJfanN4cyIsIlRvb2xiYXJTcGFjZXIiLCJKU09OTW9kZWwiLCJfdGhpcyRhY2NlcHRBbGxQYXJhbXMiLCJlbnRpdHlOYW1lTGFiZWwiLCJzdGFuZGFyZFJlY29tbWVuZGF0aW9uSGVscGVyIiwiZ2V0RW50aXR5TmFtZSIsImlkZW50aWZpZXJUZXh0cyIsIl9yZWNvbW1lbmRhdGlvbkRhdGEkYyIsIl90aGlzJHZpZXc2IiwiX3RoaXMkdmlldzYkZ2V0QmluZGluIiwiX3RoaXMkdmlldzYkZ2V0QmluZGluMiIsImdldERpc3BsYXlNb2RlRm9yVGFyZ2V0UGF0aCIsImxpc3REYXRhIiwiZmllbGROYW1lIiwidmFsdWVPZiIsImZpZWxkVmFsdWUiLCJzZXREYXRhIiwiZ2V0R3JvdXAiLCJnZXRNZXNzYWdlU3RyaXAiLCJfdGhpcyR2aWV3JGdldE1vZGVsIiwiX3RoaXMkdmlldyRnZXRNb2RlbCRnIiwiYWNjZXB0QWxsRGF0YSIsIm1lc3NhZ2VTdHJpcFRleHQiLCJNZXNzYWdlU3RyaXAiLCJnZXREaWFsb2dDb250ZW50IiwiTGlzdCIsIm1vZGVsIiwicGF0aCIsInNvcnRlciIsIlNvcnRlciIsIkN1c3RvbUxpc3RJdGVtIiwiSEJveCIsImNsYXNzIiwiVGV4dCIsIkRpYWxvZyIsInRpdGxlIiwic3RhdGUiLCJWYWx1ZVN0YXRlIiwiSW5mb3JtYXRpb24iLCJyZWYiLCJyZXNpemFibGUiLCJjb250ZW50V2lkdGgiLCJmb290ZXIiLCJSdW50aW1lQnVpbGRpbmdCbG9jayIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJpbml0aWFsaXplciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nLmJsb2NrLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIHsgUHJvcGVydGllc09mIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgZGVmaW5lUmVmZXJlbmNlIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvanN4LXJ1bnRpbWUvanN4XCI7XG5pbXBvcnQgeyBkZWZpbmVCdWlsZGluZ0Jsb2NrIH0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja1N1cHBvcnRcIjtcbmltcG9ydCBSdW50aW1lQnVpbGRpbmdCbG9jayBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9SdW50aW1lQnVpbGRpbmdCbG9ja1wiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IEN1c3RvbUxpc3RJdGVtIGZyb20gXCJzYXAvbS9DdXN0b21MaXN0SXRlbVwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgRmxleEl0ZW1EYXRhIGZyb20gXCJzYXAvbS9GbGV4SXRlbURhdGFcIjtcbmltcG9ydCBIQm94IGZyb20gXCJzYXAvbS9IQm94XCI7XG5pbXBvcnQgTGlzdCBmcm9tIFwic2FwL20vTGlzdFwiO1xuaW1wb3J0IE1lc3NhZ2VTdHJpcCBmcm9tIFwic2FwL20vTWVzc2FnZVN0cmlwXCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IFRvb2xiYXIgZnJvbSBcInNhcC9tL1Rvb2xiYXJcIjtcbmltcG9ydCBUb29sYmFyU3BhY2VyIGZyb20gXCJzYXAvbS9Ub29sYmFyU3BhY2VyXCI7XG5pbXBvcnQgdHlwZSBVSTVFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgeyBWYWx1ZVN0YXRlIH0gZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgU29ydGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvU29ydGVyXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPRGF0YVY0Q29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgRXZlbnRIYW5kbGVyIH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuaW1wb3J0IHR5cGUgQmFzZUNvbnRyb2xsZXIgZnJvbSBcIi4uLy4uL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwiLi4vLi4vUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcIi4uLy4uL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgQWNjZXB0QWxsUGFyYW1zLCBSZWNvbW1lbmRhdGlvbkRhdGEgfSBmcm9tIFwiLi4vLi4vY29udHJvbGxlcmV4dGVuc2lvbnMvUmVjb21tZW5kYXRpb25zXCI7XG5pbXBvcnQgdmFsdWVGb3JtYXR0ZXJzIGZyb20gXCIuLi8uLi9mb3JtYXR0ZXJzL1ZhbHVlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBzdGFuZGFyZFJlY29tbWVuZGF0aW9uSGVscGVyLCB0eXBlIFN0YW5kYXJkUmVjb21tZW5kYXRpb25EYXRhVHlwZSB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL1N0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXJcIjtcbmltcG9ydCB0eXBlIEZjbENvbnRyb2xsZXIgZnJvbSBcIi4uLy4uL3Jvb3RWaWV3L0ZjbC5jb250cm9sbGVyXCI7XG5cbmV4cG9ydCBlbnVtIFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24ge1xuXHRBY2NlcHQgPSBcIkFjY2VwdF9SZWNvbW1lbmRhdGlvbnNcIixcblx0SWdub3JlID0gXCJJZ25vcmVfUmVjb21tZW5kYXRpb25zXCIsXG5cdENvbnRpbnVlID0gXCJDb250aW51ZV9FZGl0aW5nXCIsXG5cdFNraXBwZWQgPSBcIlNraXBwZWRcIlxufVxuXG5AZGVmaW5lQnVpbGRpbmdCbG9jayh7XG5cdG5hbWU6IFwiQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nXCIsXG5cdG5hbWVzcGFjZTogXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9uc1wiXG59KVxuZXhwb3J0IGNsYXNzIENvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ0Jsb2NrIGV4dGVuZHMgUnVudGltZUJ1aWxkaW5nQmxvY2sge1xuXHRjb25zdHJ1Y3Rvcihwcm9wczogUHJvcGVydGllc09mPENvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ0Jsb2NrPikge1xuXHRcdHN1cGVyKHByb3BzKTtcblx0XHR0aGlzLnZpZXcgPSBwcm9wcy52aWV3IGFzIFZpZXc7XG5cdFx0dGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dSZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbCh0aGlzLnZpZXcpO1xuXHR9XG5cblx0QGRlZmluZVJlZmVyZW5jZSgpXG5cdGNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZyE6IFJlZjxEaWFsb2c+O1xuXG5cdHB1YmxpYyB2aWV3ITogVmlldztcblxuXHRwcml2YXRlIGNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ1Jlc291cmNlTW9kZWwhOiBSZXNvdXJjZU1vZGVsO1xuXG5cdHByb3RlY3RlZCBrZXkhOiBzdHJpbmc7XG5cblx0cHJpdmF0ZSBpc1NhdmUhOiBib29sZWFuO1xuXG5cdHByaXZhdGUgYWNjZXB0QWxsUGFyYW1zITogQWNjZXB0QWxsUGFyYW1zO1xuXG5cdC8qKlxuXHQgKiBSZXNvbHZlcyB0aGUgcHJvbWlzZSB3aXRoIHRoZSBzZWxlY3RlZCBkaWFsb2cgbGlzdCBvcHRpb25cblx0ICovXG5cdHByaXZhdGUgcHJvbWlzZVJlc29sdmUhOiBGdW5jdGlvbjtcblxuXHQvKipcblx0ICogUmVqZWN0cyB0aGUgcHJvbWlzZSBvZiBvcGVuIGRpYWxvZ1xuXHQgKi9cblx0cHVibGljIHByb21pc2VSZWplY3QhOiBGdW5jdGlvbjtcblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMgUmVjb21tZW5kYXRpb24gRGF0YVxuXHQgKi9cblxuXHRwdWJsaWMgZ2V0T3BlblJlY29tbWVuZGF0aW9ucygpOiBSZWNvbW1lbmRhdGlvbkRhdGFbXSB7XG5cdFx0Y29uc3QgdmlzaWJsZUNvbnRleHRQYXRocyA9IHRoaXMuZ2V0VmlzaWJsZVBhZ2VDb250ZXh0UGF0aHMoKTtcblx0XHRjb25zdCBvcGVuUmVjb21tZW5kYXRpb25zID0gdGhpcy5nZXRPcGVuUmVjb21tZW5kYXRpb25zRm9yVmlzaWJsZUNvbnRleHRQYXRocyh2aXNpYmxlQ29udGV4dFBhdGhzKTtcblx0XHRjb25zdCByZWNvbW1lbmRhdGlvbnM6IFJlY29tbWVuZGF0aW9uRGF0YVtdID0gW107XG5cdFx0aWYgKG9wZW5SZWNvbW1lbmRhdGlvbnMubGVuZ3RoID4gMCkge1xuXHRcdFx0b3BlblJlY29tbWVuZGF0aW9ucy5mb3JFYWNoKChyZWNvbW1lbmRhdGlvbikgPT4ge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0ID0gdGhpcy52aWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aDogc3RyaW5nID0gcmVjb21tZW5kYXRpb24ucHJvcGVydHlQYXRoID8gcmVjb21tZW5kYXRpb24ucHJvcGVydHlQYXRoIDogXCJcIjtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGNvbnRleHQ/LmdldFByb3BlcnR5KHByb3BlcnR5UGF0aCkgPT09IG51bGwgfHxcblx0XHRcdFx0XHRjb250ZXh0Py5nZXRQcm9wZXJ0eShwcm9wZXJ0eVBhdGgpID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0XHRjb250ZXh0Py5nZXRQcm9wZXJ0eShwcm9wZXJ0eVBhdGgpID09IFwiXCJcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmVjb21tZW5kYXRpb25zLnB1c2gocmVjb21tZW5kYXRpb24pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlY29tbWVuZGF0aW9ucztcblx0XHQvLyBjaGVjayBpZiB3ZSBoYXZlIHJlY29tbWVuZGF0aW9ucyBmcm9tIHRoZSBjdXJyZW50IHBhZ2UgaW4gdGhlIGxvY2FsQW5ub3RhdGlvbk1vZGVsXG5cdFx0Ly8gcmV0dXJuIG9wZW4gcmVjb21tZW5kYXRpb25zLlxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm5zIENvbGxlY3Rpb24gb2YgY29udGV4dCBwYXRoc1xuXHQgKi9cblxuXHRwdWJsaWMgZ2V0VmlzaWJsZVBhZ2VDb250ZXh0UGF0aHMoKTogKHN0cmluZyB8IHVuZGVmaW5lZClbXSB7XG5cdFx0Y29uc3QgdmlzaWJsZVBhZ2VDb250ZXh0UGF0aHMgPSBbdGhpcy52aWV3LmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKV07XG5cdFx0Y29uc3QgY29udHJvbGxlciA9IHRoaXMudmlldy5nZXRDb250cm9sbGVyKCkgYXMgQmFzZUNvbnRyb2xsZXI7XG5cdFx0Y29uc3QgZmNsQ29udHJvbGxlciA9IGNvbnRyb2xsZXIuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgRmNsQ29udHJvbGxlcjtcblx0XHRjb25zdCBpc0ZjbEVuYWJsZWQgPSBjb250cm9sbGVyLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKTtcblx0XHRjb25zdCBpc0Z1bGxTY3JlZW4gPSBpc0ZjbEVuYWJsZWQgPyBmY2xDb250cm9sbGVyLmdldEhlbHBlcigpLmdldEN1cnJlbnRVSVN0YXRlKCkuaXNGdWxsU2NyZWVuIDogdHJ1ZTtcblx0XHRpZiAoaXNGY2xFbmFibGVkICYmICFpc0Z1bGxTY3JlZW4pIHtcblx0XHRcdGNvbnN0IHJpZ2h0TW9zdENvbnRleHQgPSBmY2xDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKTtcblx0XHRcdHZpc2libGVQYWdlQ29udGV4dFBhdGhzLnB1c2gocmlnaHRNb3N0Q29udGV4dD8uZ2V0UGF0aCgpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHZpc2libGVQYWdlQ29udGV4dFBhdGhzO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0UGF0aHMgUGF0aHMgb2YgdGhlIGNvbnRleHRzXG5cdCAqIEByZXR1cm5zIFJlY29tbWVuZGF0aW9uRGF0YSBmb3IgdmlzaWJsZSBjb250ZXh0c1xuXHQgKi9cblx0cHVibGljIGdldE9wZW5SZWNvbW1lbmRhdGlvbnNGb3JWaXNpYmxlQ29udGV4dFBhdGhzKGNvbnRleHRQYXRoczogKHN0cmluZyB8IHVuZGVmaW5lZClbXSk6IFJlY29tbWVuZGF0aW9uRGF0YVtdIHtcblx0XHRjb25zdCBvcGVuUmVjb21tZW5kYXRpb25zOiBSZWNvbW1lbmRhdGlvbkRhdGFbXSA9IFtdO1xuXHRcdGlmIChjb250ZXh0UGF0aHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgbG9jYWxBbm5vdGF0aW9uTW9kZWwgPSAodGhpcy52aWV3LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwoKTtcblx0XHRcdC8vIGNoZWNrIGNvbnRleHQgcGF0aHMgaW4gbG9jYWwgYW5ub3RhdGlvbiBtb2RlbHMgd2hpY2ggbWF0Y2ggdG9cblx0XHRcdC8vIDEuIGN1cnJlbnQgcGFnZSBhbmRcblx0XHRcdC8vIDIuIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBwYWdlXG5cdFx0XHQvLyBOZWVkIHRvIGNvbnNpZGVyIGFsc28gaW1tZWRpYXRlIGNoaWxkcmVuXG5cdFx0XHQvLyBpdGVyYXRlIG92ZXIgYWxsIGtleXNcblx0XHRcdGNvbnRleHRQYXRocy5mb3JFYWNoKChjb250ZXh0UGF0aCkgPT4ge1xuXHRcdFx0XHRpZiAoY29udGV4dFBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGNvbnN0IGxvY2FsQW5ub3RhdGlvbk9iamVjdCA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldE9iamVjdChjb250ZXh0UGF0aCk7XG5cdFx0XHRcdFx0aWYgKGxvY2FsQW5ub3RhdGlvbk9iamVjdCkge1xuXHRcdFx0XHRcdFx0dGhpcy5nZXRPcGVuUmVjb21tZW5kYXRpb25zRm9yQ29udGV4dChcblx0XHRcdFx0XHRcdFx0bG9jYWxBbm5vdGF0aW9uT2JqZWN0LFxuXHRcdFx0XHRcdFx0XHRsb2NhbEFubm90YXRpb25PYmplY3RbXCJyZWNvbW1lbmRhdGlvbkNvbnRleHRcIl0sXG5cdFx0XHRcdFx0XHRcdG9wZW5SZWNvbW1lbmRhdGlvbnNcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG9wZW5SZWNvbW1lbmRhdGlvbnM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHREYXRhIFRoZSBjb250ZXh0IGRhdGEgb2JqZWN0IGZvciByZWNvbW1lbmRhdGlvbnNcblx0ICogQHBhcmFtIHJlY29tbWVuZGF0aW9uQ29udGV4dCBUaGUgcmVjb21tZW5kYXRpb24gY29udGV4dFxuXHQgKiBAcGFyYW0gb3BlblJlY29tbWVuZGF0aW9ucyBSZWNvbW1lbmRhdGlvbkRhdGFcblx0ICogQHBhcmFtIGNvbnRleHRLZXkgQ29udGV4dCBLZXlcblx0ICovXG5cblx0cHJpdmF0ZSBnZXRPcGVuUmVjb21tZW5kYXRpb25zRm9yQ29udGV4dChcblx0XHRjb250ZXh0RGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0cmVjb21tZW5kYXRpb25Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRvcGVuUmVjb21tZW5kYXRpb25zOiBSZWNvbW1lbmRhdGlvbkRhdGFbXSxcblx0XHRjb250ZXh0S2V5ID0gXCJcIlxuXHQpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IGN1cnJlbnRLZXkgaW4gY29udGV4dERhdGEpIHtcblx0XHRcdGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNvbnRleHREYXRhW2N1cnJlbnRLZXldO1xuXHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSkge1xuXHRcdFx0XHRjb25zdCBjdXJyZW50VmFsdWVJc0NvbnRleHQgPVxuXHRcdFx0XHRcdChjdXJyZW50VmFsdWUgYXMgT0RhdGFWNENvbnRleHQpLmlzQSAmJiAoY3VycmVudFZhbHVlIGFzIE9EYXRhVjRDb250ZXh0KS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKTtcblx0XHRcdFx0aWYgKGN1cnJlbnRLZXkuaW5jbHVkZXMoXCJAJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMucGxhY2Vob2xkZXJWYWx1ZVwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aCA9IGN1cnJlbnRLZXkuc3BsaXQoXCJAJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMucGxhY2Vob2xkZXJWYWx1ZVwiKVswXTtcblx0XHRcdFx0XHRjb25zdCBvcGVuUmVjb21tZW5kYXRpb246IFJlY29tbWVuZGF0aW9uRGF0YSA9IHtcblx0XHRcdFx0XHRcdGNvbnRleHQ6IHJlY29tbWVuZGF0aW9uQ29udGV4dCxcblx0XHRcdFx0XHRcdHByb3BlcnR5UGF0aDogY29udGV4dEtleSA/IGAke2NvbnRleHRLZXl9LyR7cHJvcGVydHlQYXRofWAgOiBwcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHR2YWx1ZTogY3VycmVudFZhbHVlIGFzIHN0cmluZyxcblx0XHRcdFx0XHRcdGNvbnRleHRJZGVudGlmaWVyOiBbXSxcblx0XHRcdFx0XHRcdGNvbnRleHRJZGVudGlmaWVyVGV4dDogW11cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IGRlc2NyaXB0aW9uID0gY29udGV4dERhdGFbYCR7cHJvcGVydHlQYXRofUAkdWk1LmZlLnJlY29tbWVuZGF0aW9ucy5wbGFjZWhvbGRlckRlc2NyaXB0aW9uYF07XG5cdFx0XHRcdFx0aWYgKGRlc2NyaXB0aW9uKSB7XG5cdFx0XHRcdFx0XHRvcGVuUmVjb21tZW5kYXRpb24udGV4dCA9IGRlc2NyaXB0aW9uIGFzIHN0cmluZztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b3BlblJlY29tbWVuZGF0aW9ucy5wdXNoKG9wZW5SZWNvbW1lbmRhdGlvbik7XG5cdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIGN1cnJlbnRWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpICYmICFjdXJyZW50VmFsdWVJc0NvbnRleHQpIHtcblx0XHRcdFx0XHR0aGlzLmdldE9wZW5SZWNvbW1lbmRhdGlvbnNGb3JDb250ZXh0KFxuXHRcdFx0XHRcdFx0Y3VycmVudFZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0XHRcdFx0cmVjb21tZW5kYXRpb25Db250ZXh0LFxuXHRcdFx0XHRcdFx0b3BlblJlY29tbWVuZGF0aW9ucyxcblx0XHRcdFx0XHRcdGN1cnJlbnRLZXlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE9wZW5zIHRoZSBjb25maXJtIHJlY29tbWVuZGF0aW9ucyBkaWFsb2cuXG5cdCAqIEBwYXJhbSBpc1NhdmUgQm9vbGVhbiBmbGFnIHdoaWNoIHdvdWxkIGJlIHNldCB0byB0cnVlIGlmIHdlIGFyZSBzYXZpbmcgdGhlIGRvY3VtZW50IGFuZCB3b3VsZCBiZSBmYWxzZSBpZiB3ZSBkbyBhcHBseSBjaGFuZ2VzXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggd291bGQgcmVzb2x2ZSB3aXRoIFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24gKEFjY2VwdCwgSWdub3JlLCBDb250aW51ZSwgU2tpcHBlZClcblx0ICovXG5cdHB1YmxpYyBhc3luYyBvcGVuKGlzU2F2ZTogYm9vbGVhbik6IFByb21pc2U8UmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB8IHVuZGVmaW5lZD4ge1xuXHRcdC8vIGNoZWNrIGZvciBidWlsdC1pbiByZWNvbW1lbmRhdGlvbnNcblx0XHRjb25zdCBvcGVuUmVjb21tZW5kYXRpb25zID0gdGhpcy5nZXRPcGVuUmVjb21tZW5kYXRpb25zKCk7XG5cdFx0aWYgKG9wZW5SZWNvbW1lbmRhdGlvbnMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy5hY2NlcHRBbGxQYXJhbXMgPSB7XG5cdFx0XHRcdHJlY29tbWVuZGF0aW9uRGF0YTogb3BlblJlY29tbWVuZGF0aW9uc1xuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gaWYgYnVpbHQtaW4gcmVjb21tZW5kYXRpb25zIGFyZSBub3QgZm91bmQgdGhlbiBjaGVjayBmb3IgbGVnYWN5IHJlY29tbWVuZGF0aW9ucy5cblx0XHRcdGNvbnN0IGxlZ2FjeVJlY29tbWVuZGF0aW9uc0V4aXN0ID0gKHRoaXMudmlldz8uZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5yZWNvbW1lbmRhdGlvbnMuY2hlY2tJZlJlY29tbWVuZGF0aW9uc0V4aXN0KCk7XG5cdFx0XHRpZiAobGVnYWN5UmVjb21tZW5kYXRpb25zRXhpc3QpIHtcblx0XHRcdFx0dGhpcy5hY2NlcHRBbGxQYXJhbXMgPSBhd2FpdCAodGhpcy52aWV3Py5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLnJlY29tbWVuZGF0aW9ucy5mZXRjaEFjY2VwdEFsbFBhcmFtcygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3QgYWNjZXB0TW9kZWwgPSB0aGlzLmdldEFjY2VwdEFsbE1vZGVsKCk7XG5cdFx0dGhpcy52aWV3LnNldE1vZGVsKGFjY2VwdE1vZGVsLCBcIl9hY2NlcHREaWFsb2dNb2RlbFwiKTtcblx0XHRpZiAoIWFjY2VwdE1vZGVsLmdldERhdGEoKS5pdGVtcz8ubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Ta2lwcGVkO1xuXHRcdH1cblx0XHR0aGlzLmlzU2F2ZSA9IGlzU2F2ZTtcblx0XHRjb25zdCBkaWFsb2cgPSB0aGlzLmdldENvbnRlbnQoKTtcblx0XHRkaWFsb2c/LnNldEVzY2FwZUhhbmRsZXIodGhpcy5vbkNvbnRpbnVlRWRpdGluZy5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLnZpZXcuYWRkRGVwZW5kZW50KGRpYWxvZyBhcyBVSTVFbGVtZW50KTtcblx0XHRkaWFsb2c/Lm9wZW4oKTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0dGhpcy5wcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0XHR0aGlzLnByb21pc2VSZWplY3QgPSByZWplY3Q7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlciB0byBjbG9zZSB0aGUgY29uZmlybVJlY29tbWVuZGF0aW9uIGRpYWxvZy5cblx0ICpcblx0ICovXG5cdHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcblx0XHR0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZy5jdXJyZW50Py5jbG9zZSgpO1xuXHRcdHRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nLmN1cnJlbnQ/LmRlc3Ryb3koKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVyIGZvciBBY2NlcHQgYW5kIFNhdmUgYnV0dG9uLlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBvbkFjY2VwdEFuZFNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGlzQWNjZXB0ZWQgPSBhd2FpdCAodGhpcy52aWV3Py5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLnJlY29tbWVuZGF0aW9ucy5hY2NlcHRSZWNvbW1lbmRhdGlvbnMoXG5cdFx0XHRcdHRoaXMuYWNjZXB0QWxsUGFyYW1zXG5cdFx0XHQpO1xuXHRcdFx0aWYgKCFpc0FjY2VwdGVkKSB7XG5cdFx0XHRcdHRoaXMucHJvbWlzZVJlamVjdChcIkFjY2VwdCBGYWlsZWRcIik7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnByb21pc2VSZXNvbHZlKFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQWNjZXB0KTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdExvZy5lcnJvcihcIkFjY2VwdCBSZWNvbW1lbmRhdGlvbnMgRmFpbGVkXCIpO1xuXHRcdFx0dGhpcy5wcm9taXNlUmVqZWN0KFwiQWNjZXB0IEZhaWxlZFwiKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVyIGZvciBJZ25vcmUgYW5kIFNhdmUgYnV0dG9uLlxuXHQgKi9cblx0cHJpdmF0ZSBvbklnbm9yZUFuZFNhdmUoKTogdm9pZCB7XG5cdFx0KHRoaXMudmlldz8uZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5yZWNvbW1lbmRhdGlvbnMuaWdub3JlUmVjb21tZW5kYXRpb25Gb3JDb250ZXh0cygpO1xuXHRcdHRoaXMucHJvbWlzZVJlc29sdmUoUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5JZ25vcmUpO1xuXHRcdHRoaXMuY2xvc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVyIGZvciBDb250aW51ZSBFZGl0aW5nIGJ1dHRvbi5cblx0ICovXG5cdHByaXZhdGUgb25Db250aW51ZUVkaXRpbmcoKTogdm9pZCB7XG5cdFx0dGhpcy5wcm9taXNlUmVzb2x2ZShSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uLkNvbnRpbnVlKTtcblx0XHR0aGlzLmNsb3NlKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgbGFiZWwgb3IgbmFtZSBvZiB0aGUgRmllbGQgYmFzZWQgb24gaXRzIHByb3BlcnR5IHBhdGguXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIGxhYmVsIG9mIHRoZSBGaWVsZC5cblx0ICovXG5cdHByaXZhdGUgZ2V0RmllbGROYW1lKHRhcmdldFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Y29uc3QgaW52b2x2ZWREYXRhTW9kZWxPYmplY3QgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzRm9yVGFyZ2V0UGF0aDxQcm9wZXJ0eT4oXG5cdFx0XHR0YXJnZXRQYXRoLFxuXHRcdFx0dGhpcy52aWV3Py5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbFxuXHRcdCk7XG5cdFx0cmV0dXJuIChcblx0XHRcdGludm9sdmVkRGF0YU1vZGVsT2JqZWN0Py50YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy50b1N0cmluZygpIHx8XG5cdFx0XHR0YXJnZXRQYXRoLnNwbGl0KFwiL1wiKVt0YXJnZXRQYXRoLnNwbGl0KFwiL1wiKS5sZW5ndGggLSAxXVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogRmV0Y2hlcyB0ZXh0IGZvciByZWNvbW1lbmRhdGlvbiBiYXNlZCBvbiBkaXNwbGF5IG1vZGUuXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvblxuXHQgKiBAcGFyYW0gZGlzcGxheU1vZGVcblx0ICogQHJldHVybnMgVGV4dCBmb3IgYSByZWNvbW1lbmRhdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRUZXh0KHJlY29tbWVuZGF0aW9uOiBTdGFuZGFyZFJlY29tbWVuZGF0aW9uRGF0YVR5cGUsIGRpc3BsYXlNb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGlmIChyZWNvbW1lbmRhdGlvbi50ZXh0IHx8IHJlY29tbWVuZGF0aW9uLnZhbHVlKSB7XG5cdFx0XHRzd2l0Y2ggKGRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdHJldHVybiByZWNvbW1lbmRhdGlvbi50ZXh0ITtcblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uVmFsdWVcIjpcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWVGb3JtYXR0ZXJzLmZvcm1hdFdpdGhCcmFja2V0cyhyZWNvbW1lbmRhdGlvbi50ZXh0LCByZWNvbW1lbmRhdGlvbi52YWx1ZSk7XG5cdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlRm9ybWF0dGVycy5mb3JtYXRXaXRoQnJhY2tldHMocmVjb21tZW5kYXRpb24udmFsdWUsIHJlY29tbWVuZGF0aW9uLnRleHQpO1xuXHRcdFx0XHRjYXNlIFwiVmFsdWVcIjpcblx0XHRcdFx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb24udmFsdWUhO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb24udmFsdWUgfHwgXCJcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIEJ1dHRvbiB3aXRoIGdpdmVuIHRleHQsIHR5cGUgYW5kIHByZXNzSGFuZGxlci5cblx0ICogQHBhcmFtIHRleHQgVGV4dCBmb3IgdGhlIGJ1dHRvblxuXHQgKiBAcGFyYW0gdHlwZSBUeXBlIG9mIHRoZSBidXR0b25cblx0ICogQHBhcmFtIHByZXNzSGFuZGxlciBQcmVzcyBIYW5kbGVyIGZvciB0aGUgYnV0dG9uXG5cdCAqIEByZXR1cm5zIEJ1dHRvbiB3aXRoIHRoZSBnaXZlbiBzZXR0aW5nc1xuXHQgKi9cblx0cHJpdmF0ZSBnZXRCdXR0b24odGV4dDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIHByZXNzSGFuZGxlcjogRXZlbnRIYW5kbGVyKTogQnV0dG9uIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0PEJ1dHRvbiB0ZXh0PXt0ZXh0fSB0eXBlPXt0eXBlfSB3aWR0aD17XCJhdXRvXCJ9IHByZXNzPXtwcmVzc0hhbmRsZXJ9PlxuXHRcdFx0XHR7e1xuXHRcdFx0XHRcdGxheW91dERhdGE6IChcblx0XHRcdFx0XHRcdDw+XG5cdFx0XHRcdFx0XHRcdDxGbGV4SXRlbURhdGEgbWluV2lkdGg9e1wiMTAwJVwifT48L0ZsZXhJdGVtRGF0YT5cblx0XHRcdFx0XHRcdDwvPlxuXHRcdFx0XHRcdClcblx0XHRcdFx0fX1cblx0XHRcdDwvQnV0dG9uPlxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBGb290ZXIgd2l0aCBCdXR0b25zLlxuXHQgKiBAcmV0dXJucyBGb290ZXJcblx0ICovXG5cblx0cHJpdmF0ZSBnZXRGb290ZXIoKTogVG9vbGJhciB7XG5cdFx0cmV0dXJuIChcblx0XHRcdDxUb29sYmFyPlxuXHRcdFx0XHR7e1xuXHRcdFx0XHRcdGNvbnRlbnQ6IChcblx0XHRcdFx0XHRcdDw+XG5cdFx0XHRcdFx0XHRcdDxUb29sYmFyU3BhY2VyIC8+XG5cdFx0XHRcdFx0XHRcdHt0aGlzLmdldEJ1dHRvbihcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmlzU2F2ZVxuXHRcdFx0XHRcdFx0XHRcdFx0PyB0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ1Jlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfUkVDT01NRU5EQVRJT05fRElBTE9HX0FDQ0VQVF9BTkRfU0FWRVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiB0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ1Jlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfUkVDT01NRU5EQVRJT05fRElBTE9HX0FDQ0VQVFwiKSxcblx0XHRcdFx0XHRcdFx0XHRcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm9uQWNjZXB0QW5kU2F2ZS5iaW5kKHRoaXMpXG5cdFx0XHRcdFx0XHRcdCl9XG5cdFx0XHRcdFx0XHRcdHt0aGlzLmdldEJ1dHRvbihcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmlzU2F2ZVxuXHRcdFx0XHRcdFx0XHRcdFx0PyB0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ1Jlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfUkVDT01NRU5EQVRJT05fRElBTE9HX0lHTk9SRV9BTkRfU0FWRVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiB0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ1Jlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfUkVDT01NRU5EQVRJT05fRElBTE9HX0lHTk9SRVwiKSxcblx0XHRcdFx0XHRcdFx0XHRcIkdob3N0XCIsXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5vbklnbm9yZUFuZFNhdmUuYmluZCh0aGlzKVxuXHRcdFx0XHRcdFx0XHQpfVxuXHRcdFx0XHRcdFx0XHR7dGhpcy5nZXRCdXR0b24oXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dSZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1JFQ09NTUVOREFUSU9OX0RJQUxPR19DT05USU5VRV9FRElUSU5HXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFwiR2hvc3RcIixcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm9uQ29udGludWVFZGl0aW5nLmJpbmQodGhpcylcblx0XHRcdFx0XHRcdFx0KX1cblx0XHRcdFx0XHRcdDwvPlxuXHRcdFx0XHRcdClcblx0XHRcdFx0fX1cblx0XHRcdDwvVG9vbGJhcj5cblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGNyZWF0ZWQgYSBKU09OIE1vZGVsIGZvciB0aGUgYWNjZXB0IGFsbCBkaWFsb2cgZGF0YS5cblx0ICogQHJldHVybnMgVGhlIEpTT04gTW9kZWwgZm9yIGFjY2VwdCBhbGwgZGlhbG9nLlxuXHQgKi9cblx0Z2V0QWNjZXB0QWxsTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRjb25zdCBhY2NlcHRNb2RlbCA9IG5ldyBKU09OTW9kZWwoKTtcblx0XHRjb25zdCBpdGVtcyA9IFtdO1xuXHRcdGZvciAoY29uc3QgcmVjb21tZW5kYXRpb25EYXRhIG9mIHRoaXMuYWNjZXB0QWxsUGFyYW1zPy5yZWNvbW1lbmRhdGlvbkRhdGEgfHwgW10pIHtcblx0XHRcdGNvbnN0IGVudGl0eU5hbWVMYWJlbCA9IHN0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXIuZ2V0RW50aXR5TmFtZShyZWNvbW1lbmRhdGlvbkRhdGEuY29udGV4dCBhcyBPRGF0YVY0Q29udGV4dCkgfHwgXCJcIjtcblxuXHRcdFx0Y29uc3QgaWRlbnRpZmllclRleHRzID1cblx0XHRcdFx0cmVjb21tZW5kYXRpb25EYXRhLmNvbnRleHRJZGVudGlmaWVyVGV4dCAmJiByZWNvbW1lbmRhdGlvbkRhdGEuY29udGV4dElkZW50aWZpZXJUZXh0Lmxlbmd0aCA+IDBcblx0XHRcdFx0XHQ/IGAke2VudGl0eU5hbWVMYWJlbH0gKCR7cmVjb21tZW5kYXRpb25EYXRhLmNvbnRleHRJZGVudGlmaWVyVGV4dH0pYFxuXHRcdFx0XHRcdDogZW50aXR5TmFtZUxhYmVsO1xuXG5cdFx0XHRpZiAocmVjb21tZW5kYXRpb25EYXRhLnZhbHVlIHx8IHJlY29tbWVuZGF0aW9uRGF0YS50ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IHRhcmdldFBhdGggPSByZWNvbW1lbmRhdGlvbkRhdGEuY29udGV4dD8uZ2V0UGF0aCgpICsgXCIvXCIgKyByZWNvbW1lbmRhdGlvbkRhdGEucHJvcGVydHlQYXRoO1xuXHRcdFx0XHRjb25zdCBkaXNwbGF5TW9kZSA9IHN0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXIuZ2V0RGlzcGxheU1vZGVGb3JUYXJnZXRQYXRoKFxuXHRcdFx0XHRcdHRhcmdldFBhdGgsXG5cdFx0XHRcdFx0dGhpcy52aWV3Py5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBsaXN0RGF0YSA9IHtcblx0XHRcdFx0XHRmaWVsZE5hbWU6IHRoaXMuZ2V0RmllbGROYW1lKHRhcmdldFBhdGgpLnZhbHVlT2YoKSxcblx0XHRcdFx0XHRmaWVsZFZhbHVlOiB0aGlzLmdldFRleHQocmVjb21tZW5kYXRpb25EYXRhLCBkaXNwbGF5TW9kZSksXG5cdFx0XHRcdFx0aWRlbnRpZmllclRleHRzOiBpZGVudGlmaWVyVGV4dHNcblx0XHRcdFx0fTtcblx0XHRcdFx0aXRlbXMucHVzaChsaXN0RGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGFjY2VwdE1vZGVsLnNldERhdGEoeyBpdGVtczogaXRlbXMgfSk7XG5cdFx0cmV0dXJuIGFjY2VwdE1vZGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGdyb3VwcyB0aGUgY29udGV4dHMgYWNjb3JkaW5nIHRvIHRoZSBpZGVudGlmaWVyIHRleHRzLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgaXRlbVxuXHQgKiBAcmV0dXJucyBUaGUgdGV4dCBvZiB0aGUgZ3JvdXBcblx0ICovXG5cdGdldEdyb3VwKGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogc3RyaW5nIHtcblx0XHRyZXR1cm4gY29udGV4dC5nZXRQcm9wZXJ0eShcImlkZW50aWZpZXJUZXh0c1wiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaXAgdG8gYmUgc2hvd24gaW4gdGhlIGFjY2VwdCBkaWFsb2cuXG5cdCAqIEByZXR1cm5zIEEgbWVzc2FnZSBzdHJpcCB3aXRoIHRoZSBkZXNpcmVkIHRleHQuXG5cdCAqL1xuXHRnZXRNZXNzYWdlU3RyaXAoKTogTWVzc2FnZVN0cmlwIHtcblx0XHRjb25zdCBhY2NlcHRBbGxEYXRhID0gKHRoaXMudmlldy5nZXRNb2RlbChcIl9hY2NlcHREaWFsb2dNb2RlbFwiKSBhcyBKU09OTW9kZWwpPy5nZXREYXRhKCk/Lml0ZW1zO1xuXHRcdGNvbnN0IG1lc3NhZ2VTdHJpcFRleHQgPVxuXHRcdFx0YWNjZXB0QWxsRGF0YS5sZW5ndGggPiAxXG5cdFx0XHRcdD8gdGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dSZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1JFQ09NTUVOREFUSU9OX0RJQUxPR19URVhUXCIsIFthY2NlcHRBbGxEYXRhLmxlbmd0aF0pXG5cdFx0XHRcdDogdGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dSZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1JFQ09NTUVOREFUSU9OX0RJQUxPR19URVhUX1NJTkdVTEFSXCIpO1xuXHRcdHJldHVybiA8TWVzc2FnZVN0cmlwIHRleHQ9e21lc3NhZ2VTdHJpcFRleHR9IC8+O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgdGhlIGNvbnRlbnQgZm9yIHRoZSBkaWFsb2cuXG5cdCAqIEByZXR1cm5zIEEgbGlzdCBhcyBjb250ZW50IG9mIHRoZSBkaWFsb2cuXG5cdCAqL1xuXHRnZXREaWFsb2dDb250ZW50KCk6IExpc3Qge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8TGlzdCBpdGVtcz17eyBtb2RlbDogXCJfYWNjZXB0RGlhbG9nTW9kZWxcIiwgcGF0aDogXCIvaXRlbXNcIiwgc29ydGVyOiBuZXcgU29ydGVyKFwiaWRlbnRpZmllclRleHRzXCIsIGZhbHNlLCB0aGlzLmdldEdyb3VwKSB9fT5cblx0XHRcdFx0PEN1c3RvbUxpc3RJdGVtPlxuXHRcdFx0XHRcdDxIQm94IGNsYXNzPVwic2FwVWlTbWFsbE1hcmdpbkJlZ2luIHNhcFVpVGlueU1hcmdpblwiPlxuXHRcdFx0XHRcdFx0PFRleHQgdGV4dD1cIntfYWNjZXB0RGlhbG9nTW9kZWw+ZmllbGROYW1lfToge19hY2NlcHREaWFsb2dNb2RlbD5maWVsZFZhbHVlfVwiIC8+XG5cdFx0XHRcdFx0PC9IQm94PlxuXHRcdFx0XHQ8L0N1c3RvbUxpc3RJdGVtPlxuXHRcdFx0PC9MaXN0PlxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJ1aWxkaW5nIGJsb2NrIHJlbmRlciBmdW5jdGlvbi5cblx0ICogQHJldHVybnMgQW4gWE1MLWJhc2VkIHN0cmluZ1xuXHQgKi9cblx0Z2V0Q29udGVudCgpOiBEaWFsb2cge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8RGlhbG9nXG5cdFx0XHRcdHRpdGxlPXt0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ1Jlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfUkVDT01NRU5EQVRJT05fRElBTE9HX1RJVExFXCIpfVxuXHRcdFx0XHRzdGF0ZT17VmFsdWVTdGF0ZS5JbmZvcm1hdGlvbn1cblx0XHRcdFx0dHlwZT17XCJNZXNzYWdlXCJ9XG5cdFx0XHRcdHJlZj17dGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2d9XG5cdFx0XHRcdHJlc2l6YWJsZT17XCJ0cnVlXCJ9XG5cdFx0XHRcdGNvbnRlbnRXaWR0aD17XCIzNXJlbVwifVxuXHRcdFx0PlxuXHRcdFx0XHR7e1xuXHRcdFx0XHRcdGNvbnRlbnQ6IChcblx0XHRcdFx0XHRcdDw+XG5cdFx0XHRcdFx0XHRcdHt0aGlzLmdldE1lc3NhZ2VTdHJpcCgpfVxuXHRcdFx0XHRcdFx0XHR7dGhpcy5nZXREaWFsb2dDb250ZW50KCl9XG5cdFx0XHRcdFx0XHQ8Lz5cblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGZvb3RlcjogPD57dGhpcy5nZXRGb290ZXIoKX08Lz5cblx0XHRcdFx0fX1cblx0XHRcdDwvRGlhbG9nPlxuXHRcdCkgYXMgRGlhbG9nO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01Bb0NZQSw0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
@@ -24,12 +24,15 @@ import Sorter from "sap/ui/model/Sorter";
24
24
  import JSONModel from "sap/ui/model/json/JSONModel";
25
25
  import type { default as ODataV4Context } from "sap/ui/model/odata/v4/Context";
26
26
  import type ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
27
+ import type ODataModel from "sap/ui/model/odata/v4/ODataModel";
27
28
  import type { EventHandler } from "types/extension_types";
29
+ import type BaseController from "../../BaseController";
28
30
  import type PageController from "../../PageController";
29
31
  import type ResourceModel from "../../ResourceModel";
30
- import type { AcceptAllParams } from "../../controllerextensions/Recommendations";
32
+ import type { AcceptAllParams, RecommendationData } from "../../controllerextensions/Recommendations";
31
33
  import valueFormatters from "../../formatters/ValueFormatter";
32
34
  import { standardRecommendationHelper, type StandardRecommendationDataType } from "../../helpers/StandardRecommendationHelper";
35
+ import type FclController from "../../rootView/Fcl.controller";
33
36
 
34
37
  export enum RecommendationDialogDecision {
35
38
  Accept = "Accept_Recommendations",
@@ -70,16 +73,149 @@ export class ConfirmRecommendationDialogBlock extends RuntimeBuildingBlock {
70
73
  /**
71
74
  * Rejects the promise of open dialog
72
75
  */
73
- private promiseReject!: Function;
76
+ public promiseReject!: Function;
77
+
78
+ /**
79
+ *
80
+ * @returns Recommendation Data
81
+ */
82
+
83
+ public getOpenRecommendations(): RecommendationData[] {
84
+ const visibleContextPaths = this.getVisiblePageContextPaths();
85
+ const openRecommendations = this.getOpenRecommendationsForVisibleContextPaths(visibleContextPaths);
86
+ const recommendations: RecommendationData[] = [];
87
+ if (openRecommendations.length > 0) {
88
+ openRecommendations.forEach((recommendation) => {
89
+ const context = this.view.getBindingContext();
90
+ const propertyPath: string = recommendation.propertyPath ? recommendation.propertyPath : "";
91
+ if (
92
+ context?.getProperty(propertyPath) === null ||
93
+ context?.getProperty(propertyPath) === undefined ||
94
+ context?.getProperty(propertyPath) == ""
95
+ ) {
96
+ recommendations.push(recommendation);
97
+ }
98
+ });
99
+ }
100
+ return recommendations;
101
+ // check if we have recommendations from the current page in the localAnnotationModel
102
+ // return open recommendations.
103
+ }
104
+
105
+ /**
106
+ *
107
+ * @returns Collection of context paths
108
+ */
109
+
110
+ public getVisiblePageContextPaths(): (string | undefined)[] {
111
+ const visiblePageContextPaths = [this.view.getBindingContext()?.getPath()];
112
+ const controller = this.view.getController() as BaseController;
113
+ const fclController = controller.getAppComponent().getRootViewController() as FclController;
114
+ const isFclEnabled = controller.getAppComponent()._isFclEnabled();
115
+ const isFullScreen = isFclEnabled ? fclController.getHelper().getCurrentUIState().isFullScreen : true;
116
+ if (isFclEnabled && !isFullScreen) {
117
+ const rightMostContext = fclController.getRightmostContext();
118
+ visiblePageContextPaths.push(rightMostContext?.getPath());
119
+ }
120
+ return visiblePageContextPaths;
121
+ }
122
+
123
+ /**
124
+ *
125
+ * @param contextPaths Paths of the contexts
126
+ * @returns RecommendationData for visible contexts
127
+ */
128
+ public getOpenRecommendationsForVisibleContextPaths(contextPaths: (string | undefined)[]): RecommendationData[] {
129
+ const openRecommendations: RecommendationData[] = [];
130
+ if (contextPaths.length > 0) {
131
+ const localAnnotationModel = (this.view.getModel() as ODataModel).getLocalAnnotationModel();
132
+ // check context paths in local annotation models which match to
133
+ // 1. current page and
134
+ // 2. immediate children of the current page
135
+ // Need to consider also immediate children
136
+ // iterate over all keys
137
+ contextPaths.forEach((contextPath) => {
138
+ if (contextPath !== undefined) {
139
+ const localAnnotationObject = localAnnotationModel.getObject(contextPath);
140
+ if (localAnnotationObject) {
141
+ this.getOpenRecommendationsForContext(
142
+ localAnnotationObject,
143
+ localAnnotationObject["recommendationContext"],
144
+ openRecommendations
145
+ );
146
+ }
147
+ }
148
+ });
149
+ }
150
+ return openRecommendations;
151
+ }
74
152
 
75
153
  /**
76
- * Opens the confirm recommendations dialog.
77
154
  *
155
+ * @param contextData The context data object for recommendations
156
+ * @param recommendationContext The recommendation context
157
+ * @param openRecommendations RecommendationData
158
+ * @param contextKey Context Key
159
+ */
160
+
161
+ private getOpenRecommendationsForContext(
162
+ contextData: Record<string, unknown>,
163
+ recommendationContext: ODataV4Context,
164
+ openRecommendations: RecommendationData[],
165
+ contextKey = ""
166
+ ): void {
167
+ for (const currentKey in contextData) {
168
+ const currentValue = contextData[currentKey];
169
+ if (currentValue) {
170
+ const currentValueIsContext =
171
+ (currentValue as ODataV4Context).isA && (currentValue as ODataV4Context).isA("sap.ui.model.odata.v4.Context");
172
+ if (currentKey.includes("@$ui5.fe.recommendations.placeholderValue")) {
173
+ const propertyPath = currentKey.split("@$ui5.fe.recommendations.placeholderValue")[0];
174
+ const openRecommendation: RecommendationData = {
175
+ context: recommendationContext,
176
+ propertyPath: contextKey ? `${contextKey}/${propertyPath}` : propertyPath,
177
+ value: currentValue as string,
178
+ contextIdentifier: [],
179
+ contextIdentifierText: []
180
+ };
181
+ const description = contextData[`${propertyPath}@$ui5.fe.recommendations.placeholderDescription`];
182
+ if (description) {
183
+ openRecommendation.text = description as string;
184
+ }
185
+ openRecommendations.push(openRecommendation);
186
+ } else if (typeof currentValue === "object" && !Array.isArray(currentValue) && !currentValueIsContext) {
187
+ this.getOpenRecommendationsForContext(
188
+ currentValue as Record<string, unknown>,
189
+ recommendationContext,
190
+ openRecommendations,
191
+ currentKey
192
+ );
193
+ }
194
+ }
195
+ }
196
+ }
197
+
198
+ /**
199
+ * Opens the confirm recommendations dialog.
78
200
  * @param isSave Boolean flag which would be set to true if we are saving the document and would be false if we do apply changes
79
201
  * @returns Promise which would resolve with RecommendationDialogDecision (Accept, Ignore, Continue, Skipped)
80
202
  */
81
- public async open(isSave: boolean): Promise<RecommendationDialogDecision> {
82
- this.acceptAllParams = await (this.view?.getController() as PageController).recommendations.fetchAcceptAllParams();
203
+ public async open(isSave: boolean): Promise<RecommendationDialogDecision | undefined> {
204
+ // check for built-in recommendations
205
+ const openRecommendations = this.getOpenRecommendations();
206
+ if (openRecommendations.length > 0) {
207
+ this.acceptAllParams = {
208
+ recommendationData: openRecommendations
209
+ };
210
+ } else {
211
+ // if built-in recommendations are not found then check for legacy recommendations.
212
+ const legacyRecommendationsExist = (this.view?.getController() as PageController).recommendations.checkIfRecommendationsExist();
213
+ if (legacyRecommendationsExist) {
214
+ this.acceptAllParams = await (this.view?.getController() as PageController).recommendations.fetchAcceptAllParams();
215
+ } else {
216
+ return undefined;
217
+ }
218
+ }
83
219
  const acceptModel = this.getAcceptAllModel();
84
220
  this.view.setModel(acceptModel, "_acceptDialogModel");
85
221
  if (!acceptModel.getData().items?.length) {
@@ -144,7 +280,6 @@ export class ConfirmRecommendationDialogBlock extends RuntimeBuildingBlock {
144
280
 
145
281
  /**
146
282
  * Gets the label or name of the Field based on its property path.
147
- *
148
283
  * @param targetPath
149
284
  * @returns Returns the label of the Field.
150
285
  */
@@ -161,7 +296,6 @@ export class ConfirmRecommendationDialogBlock extends RuntimeBuildingBlock {
161
296
 
162
297
  /**
163
298
  * Fetches text for recommendation based on display mode.
164
- *
165
299
  * @param recommendation
166
300
  * @param displayMode
167
301
  * @returns Text for a recommendation
@@ -184,7 +318,6 @@ export class ConfirmRecommendationDialogBlock extends RuntimeBuildingBlock {
184
318
 
185
319
  /**
186
320
  * Returns Button with given text, type and pressHandler.
187
- *
188
321
  * @param text Text for the button
189
322
  * @param type Type of the button
190
323
  * @param pressHandler Press Handler for the button
@@ -206,7 +339,6 @@ export class ConfirmRecommendationDialogBlock extends RuntimeBuildingBlock {
206
339
 
207
340
  /**
208
341
  * Returns Footer with Buttons.
209
- *
210
342
  * @returns Footer
211
343
  */
212
344
 
@@ -316,7 +448,6 @@ export class ConfirmRecommendationDialogBlock extends RuntimeBuildingBlock {
316
448
 
317
449
  /**
318
450
  * The building block render function.
319
- *
320
451
  * @returns An XML-based string
321
452
  */
322
453
  getContent(): Dialog {