@sapui5/sap.fe.core 1.134.0 → 1.136.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 (395) 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 +6 -62
  4. package/src/sap/fe/core/ActionRuntime.ts +14 -65
  5. package/src/sap/fe/core/AppComponent.js +10 -2
  6. package/src/sap/fe/core/AppComponent.ts +6 -0
  7. package/src/sap/fe/core/AppStateHandler.js +9 -7
  8. package/src/sap/fe/core/AppStateHandler.ts +7 -5
  9. package/src/sap/fe/core/BaseController.js +1 -1
  10. package/src/sap/fe/core/CommonUtils.js +8 -4
  11. package/src/sap/fe/core/CommonUtils.ts +19 -4
  12. package/src/sap/fe/core/ExtensionAPI.js +7 -5
  13. package/src/sap/fe/core/ExtensionAPI.ts +5 -3
  14. package/src/sap/fe/core/IRowBindingInterface.js +1 -1
  15. package/src/sap/fe/core/InsightsFormattersExtension.js +1 -1
  16. package/src/sap/fe/core/PageController.js +36 -6
  17. package/src/sap/fe/core/PageController.ts +30 -0
  18. package/src/sap/fe/core/ResourceModel.js +1 -1
  19. package/src/sap/fe/core/ReuseComponent.js +1 -1
  20. package/src/sap/fe/core/TemplateComponent.js +1 -1
  21. package/src/sap/fe/core/TemplateModel.js +1 -1
  22. package/src/sap/fe/core/UIProvider.js +2 -2
  23. package/src/sap/fe/core/UIProvider.ts +3 -32
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +34 -16
  25. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +39 -18
  26. package/src/sap/fe/core/buildingBlocks/IBuildingBlockOwnerComponent.js +1 -1
  27. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +1 -1
  28. package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +1 -1
  29. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockFormatter.js +1 -1
  30. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +2 -2
  31. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +1 -0
  32. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +7 -7
  33. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +9 -9
  34. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +1 -1
  35. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +5 -3
  36. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +3 -1
  37. package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
  38. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +15 -15
  39. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +19 -19
  40. package/src/sap/fe/core/controllerextensions/ContextSharing.js +1 -1
  41. package/src/sap/fe/core/controllerextensions/EditFlow.js +74 -93
  42. package/src/sap/fe/core/controllerextensions/EditFlow.ts +89 -108
  43. package/src/sap/fe/core/controllerextensions/Feedback.js +1 -1
  44. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +355 -0
  45. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +387 -0
  46. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
  47. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
  48. package/src/sap/fe/core/controllerextensions/InternalRouting.js +36 -11
  49. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +36 -10
  50. package/src/sap/fe/core/controllerextensions/KPIManagement.js +1 -1
  51. package/src/sap/fe/core/controllerextensions/MessageHandler.js +36 -6
  52. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +41 -1
  53. package/src/sap/fe/core/controllerextensions/PageReady.js +5 -2
  54. package/src/sap/fe/core/controllerextensions/PageReady.ts +3 -0
  55. package/src/sap/fe/core/controllerextensions/Paginator.js +1 -1
  56. package/src/sap/fe/core/controllerextensions/Placeholder.js +1 -1
  57. package/src/sap/fe/core/controllerextensions/Recommendations.js +1 -1
  58. package/src/sap/fe/core/controllerextensions/Routing.js +9 -9
  59. package/src/sap/fe/core/controllerextensions/Routing.ts +4 -4
  60. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  61. package/src/sap/fe/core/controllerextensions/Share.js +1 -1
  62. package/src/sap/fe/core/controllerextensions/SideEffects.js +13 -6
  63. package/src/sap/fe/core/controllerextensions/SideEffects.ts +13 -6
  64. package/src/sap/fe/core/controllerextensions/Telemetry.js +1 -1
  65. package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
  66. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +14 -11
  67. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +20 -14
  68. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +4 -12
  69. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +2 -10
  70. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +12 -2
  71. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +12 -0
  72. package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.js +1 -1
  73. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
  74. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +111 -89
  75. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +140 -105
  76. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +137 -79
  77. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +133 -120
  78. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +3 -3
  79. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +4 -1
  80. package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +1 -1
  81. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +26 -17
  82. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +32 -23
  83. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +3 -3
  84. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  85. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +103 -23
  86. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +144 -53
  87. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.js +29 -11
  88. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +39 -15
  89. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +24 -22
  90. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +28 -26
  91. package/src/sap/fe/core/controllerextensions/editFlow/operations/actionHelper.js +1 -1
  92. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +6 -572
  93. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +25 -873
  94. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
  95. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +98 -56
  96. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -80
  97. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +5 -3
  98. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +7 -4
  99. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +1 -1
  100. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +1 -1
  101. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +1 -1
  102. package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +1 -1
  103. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +1 -1
  104. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +1 -1
  105. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributorMixin.js +1 -1
  106. package/src/sap/fe/core/controls/Any.js +1 -1
  107. package/src/sap/fe/core/controls/AnyElement.js +1 -1
  108. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  109. package/src/sap/fe/core/controls/ComponentLoader.js +1 -1
  110. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +3 -3
  111. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +8 -1
  112. package/src/sap/fe/core/controls/DataWatcher.js +4 -3
  113. package/src/sap/fe/core/controls/DataWatcher.tsx +4 -1
  114. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  115. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +10 -4
  116. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +13 -2
  117. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
  118. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +1 -1
  119. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +68 -0
  120. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +52 -0
  121. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +144 -0
  122. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.tsx +128 -0
  123. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.js +53 -0
  124. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.tsx +39 -0
  125. package/src/sap/fe/core/converters/ConverterContext.js +1 -1
  126. package/src/sap/fe/core/converters/ManifestSettings.js +3 -2
  127. package/src/sap/fe/core/converters/ManifestSettings.ts +42 -20
  128. package/src/sap/fe/core/converters/ManifestWrapper.js +8 -2
  129. package/src/sap/fe/core/converters/ManifestWrapper.ts +8 -0
  130. package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  131. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  132. package/src/sap/fe/core/converters/annotations/DataField.js +2 -2
  133. package/src/sap/fe/core/converters/annotations/DataField.ts +2 -1
  134. package/src/sap/fe/core/converters/controls/Common/Action.js +55 -6
  135. package/src/sap/fe/core/converters/controls/Common/Action.ts +59 -3
  136. package/src/sap/fe/core/converters/controls/Common/Chart.js +45 -6
  137. package/src/sap/fe/core/converters/controls/Common/Chart.ts +60 -9
  138. package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -1
  139. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
  140. package/src/sap/fe/core/converters/controls/Common/Form.js +21 -5
  141. package/src/sap/fe/core/converters/controls/Common/Form.ts +25 -5
  142. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  143. package/src/sap/fe/core/converters/controls/Common/Table.js +89 -1686
  144. package/src/sap/fe/core/converters/controls/Common/Table.ts +254 -2513
  145. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +1701 -0
  146. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +2377 -0
  147. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +64 -15
  148. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +76 -14
  149. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -36
  150. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +8 -46
  151. package/src/sap/fe/core/converters/controls/ListReport/FilterField.js +106 -0
  152. package/src/sap/fe/core/converters/controls/ListReport/FilterField.ts +129 -0
  153. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +10 -5
  154. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +8 -3
  155. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
  156. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +5 -3
  157. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +11 -4
  158. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +7 -2
  159. package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
  160. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
  161. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -1
  162. package/src/sap/fe/core/converters/helpers/ID.js +1 -1
  163. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +1 -1
  164. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  165. package/src/sap/fe/core/converters/helpers/Key.js +1 -1
  166. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  167. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  168. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +30 -8
  169. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +40 -16
  170. package/src/sap/fe/core/converters/templates/ListReportConverter.js +5 -3
  171. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +5 -1
  172. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
  173. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +184 -0
  174. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +240 -0
  175. package/src/sap/fe/core/designtime/AppComponent.designtime.js +1 -1
  176. package/src/sap/fe/core/designtime/messagebundle.properties +11 -0
  177. package/src/sap/fe/core/designtime/messagebundle_ar.properties +7 -0
  178. package/src/sap/fe/core/designtime/messagebundle_bg.properties +7 -0
  179. package/src/sap/fe/core/designtime/messagebundle_ca.properties +7 -0
  180. package/src/sap/fe/core/designtime/messagebundle_cnr.properties +7 -0
  181. package/src/sap/fe/core/designtime/messagebundle_cs.properties +7 -0
  182. package/src/sap/fe/core/designtime/messagebundle_cy.properties +7 -0
  183. package/src/sap/fe/core/designtime/messagebundle_da.properties +7 -0
  184. package/src/sap/fe/core/designtime/messagebundle_de.properties +7 -0
  185. package/src/sap/fe/core/designtime/messagebundle_el.properties +7 -0
  186. package/src/sap/fe/core/designtime/messagebundle_en.properties +7 -0
  187. package/src/sap/fe/core/designtime/messagebundle_en_GB.properties +7 -0
  188. package/src/sap/fe/core/designtime/messagebundle_es.properties +7 -0
  189. package/src/sap/fe/core/designtime/messagebundle_es_MX.properties +7 -0
  190. package/src/sap/fe/core/designtime/messagebundle_et.properties +7 -0
  191. package/src/sap/fe/core/designtime/messagebundle_fi.properties +7 -0
  192. package/src/sap/fe/core/designtime/messagebundle_fr.properties +7 -0
  193. package/src/sap/fe/core/designtime/messagebundle_fr_CA.properties +7 -0
  194. package/src/sap/fe/core/designtime/messagebundle_hi.properties +7 -0
  195. package/src/sap/fe/core/designtime/messagebundle_hr.properties +7 -0
  196. package/src/sap/fe/core/designtime/messagebundle_hu.properties +7 -0
  197. package/src/sap/fe/core/designtime/messagebundle_id.properties +7 -0
  198. package/src/sap/fe/core/designtime/messagebundle_it.properties +7 -0
  199. package/src/sap/fe/core/designtime/messagebundle_iw.properties +7 -0
  200. package/src/sap/fe/core/designtime/messagebundle_ja.properties +7 -0
  201. package/src/sap/fe/core/designtime/messagebundle_kk.properties +7 -0
  202. package/src/sap/fe/core/designtime/messagebundle_ko.properties +7 -0
  203. package/src/sap/fe/core/designtime/messagebundle_lt.properties +7 -0
  204. package/src/sap/fe/core/designtime/messagebundle_lv.properties +7 -0
  205. package/src/sap/fe/core/designtime/messagebundle_mk.properties +7 -0
  206. package/src/sap/fe/core/designtime/messagebundle_ms.properties +7 -0
  207. package/src/sap/fe/core/designtime/messagebundle_nl.properties +7 -0
  208. package/src/sap/fe/core/designtime/messagebundle_no.properties +7 -0
  209. package/src/sap/fe/core/designtime/messagebundle_pl.properties +7 -0
  210. package/src/sap/fe/core/designtime/messagebundle_pt.properties +7 -0
  211. package/src/sap/fe/core/designtime/messagebundle_pt_PT.properties +7 -0
  212. package/src/sap/fe/core/designtime/messagebundle_ro.properties +7 -0
  213. package/src/sap/fe/core/designtime/messagebundle_ru.properties +7 -0
  214. package/src/sap/fe/core/designtime/messagebundle_sh.properties +7 -0
  215. package/src/sap/fe/core/designtime/messagebundle_sk.properties +7 -0
  216. package/src/sap/fe/core/designtime/messagebundle_sl.properties +7 -0
  217. package/src/sap/fe/core/designtime/messagebundle_sr.properties +7 -0
  218. package/src/sap/fe/core/designtime/messagebundle_sv.properties +7 -0
  219. package/src/sap/fe/core/designtime/messagebundle_th.properties +7 -0
  220. package/src/sap/fe/core/designtime/messagebundle_tr.properties +7 -0
  221. package/src/sap/fe/core/designtime/messagebundle_uk.properties +7 -0
  222. package/src/sap/fe/core/designtime/messagebundle_vi.properties +7 -0
  223. package/src/sap/fe/core/designtime/messagebundle_zh_CN.properties +7 -0
  224. package/src/sap/fe/core/designtime/messagebundle_zh_TW.properties +7 -0
  225. package/src/sap/fe/core/formatters/CollaborationFormatter.js +1 -1
  226. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  227. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  228. package/src/sap/fe/core/formatters/FiscalFormat.js +1 -1
  229. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  230. package/src/sap/fe/core/formatters/StandardFormatter.js +1 -1
  231. package/src/sap/fe/core/formatters/ValueFormatter.js +27 -12
  232. package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -11
  233. package/src/sap/fe/core/fpm/Component.js +1 -1
  234. package/src/sap/fe/core/fpm/manifest.json +1 -1
  235. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.js +1 -1
  236. package/src/sap/fe/core/helpers/AppStartupHelper.js +25 -4
  237. package/src/sap/fe/core/helpers/AppStartupHelper.ts +28 -2
  238. package/src/sap/fe/core/helpers/BindingHelper.js +4 -3
  239. package/src/sap/fe/core/helpers/BindingHelper.ts +2 -1
  240. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.js +1 -1
  241. package/src/sap/fe/core/helpers/DeleteHelper.js +6 -12
  242. package/src/sap/fe/core/helpers/DeleteHelper.ts +4 -9
  243. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
  244. package/src/sap/fe/core/helpers/EditState.js +1 -1
  245. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -1
  246. package/src/sap/fe/core/helpers/FPMHelper.js +9 -3
  247. package/src/sap/fe/core/helpers/FPMHelper.ts +13 -1
  248. package/src/sap/fe/core/helpers/HTTP503Handler.js +1 -1
  249. package/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -1
  250. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
  251. package/src/sap/fe/core/helpers/LoaderUtils.js +1 -1
  252. package/src/sap/fe/core/helpers/ManifestHelper.js +1 -1
  253. package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
  254. package/src/sap/fe/core/helpers/MetaModelFunction.js +1 -1
  255. package/src/sap/fe/core/helpers/MetaPath.js +1 -1
  256. package/src/sap/fe/core/helpers/ModelHelper.js +15 -5
  257. package/src/sap/fe/core/helpers/ModelHelper.ts +15 -4
  258. package/src/sap/fe/core/helpers/PasteHelper.js +39 -40
  259. package/src/sap/fe/core/helpers/PasteHelper.ts +49 -51
  260. package/src/sap/fe/core/helpers/PromiseKeeper.js +1 -1
  261. package/src/sap/fe/core/helpers/RecommendationHelper.js +1 -1
  262. package/src/sap/fe/core/helpers/ResourceModelHelper.js +1 -1
  263. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  264. package/src/sap/fe/core/helpers/SizeHelper.js +1 -1
  265. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  266. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +1 -1
  267. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  268. package/src/sap/fe/core/helpers/TitleHelper.js +1 -1
  269. package/src/sap/fe/core/helpers/ToES6Promise.js +1 -1
  270. package/src/sap/fe/core/helpers/TypeGuards.js +1 -1
  271. package/src/sap/fe/core/helpers/WebSocket.js +11 -2
  272. package/src/sap/fe/core/helpers/WebSocket.ts +8 -0
  273. package/src/sap/fe/core/library.js +16 -4
  274. package/src/sap/fe/core/library.support.js +1 -1
  275. package/src/sap/fe/core/library.ts +1 -0
  276. package/src/sap/fe/core/manifestMerger/AddNewPage.js +1 -1
  277. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  278. package/src/sap/fe/core/messagebundle.properties +41 -2
  279. package/src/sap/fe/core/messagebundle_ar.properties +25 -4
  280. package/src/sap/fe/core/messagebundle_bg.properties +25 -4
  281. package/src/sap/fe/core/messagebundle_ca.properties +24 -3
  282. package/src/sap/fe/core/messagebundle_cnr.properties +25 -4
  283. package/src/sap/fe/core/messagebundle_cs.properties +23 -2
  284. package/src/sap/fe/core/messagebundle_cy.properties +24 -3
  285. package/src/sap/fe/core/messagebundle_da.properties +25 -4
  286. package/src/sap/fe/core/messagebundle_de.properties +28 -7
  287. package/src/sap/fe/core/messagebundle_el.properties +23 -2
  288. package/src/sap/fe/core/messagebundle_en.properties +25 -4
  289. package/src/sap/fe/core/messagebundle_en_GB.properties +25 -4
  290. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +26 -5
  291. package/src/sap/fe/core/messagebundle_es.properties +23 -2
  292. package/src/sap/fe/core/messagebundle_es_MX.properties +23 -2
  293. package/src/sap/fe/core/messagebundle_et.properties +23 -2
  294. package/src/sap/fe/core/messagebundle_fi.properties +23 -2
  295. package/src/sap/fe/core/messagebundle_fr.properties +26 -5
  296. package/src/sap/fe/core/messagebundle_fr_CA.properties +23 -2
  297. package/src/sap/fe/core/messagebundle_hi.properties +24 -3
  298. package/src/sap/fe/core/messagebundle_hr.properties +27 -6
  299. package/src/sap/fe/core/messagebundle_hu.properties +23 -2
  300. package/src/sap/fe/core/messagebundle_id.properties +23 -2
  301. package/src/sap/fe/core/messagebundle_it.properties +25 -4
  302. package/src/sap/fe/core/messagebundle_iw.properties +24 -3
  303. package/src/sap/fe/core/messagebundle_ja.properties +24 -3
  304. package/src/sap/fe/core/messagebundle_kk.properties +23 -2
  305. package/src/sap/fe/core/messagebundle_ko.properties +25 -4
  306. package/src/sap/fe/core/messagebundle_lt.properties +23 -2
  307. package/src/sap/fe/core/messagebundle_lv.properties +25 -4
  308. package/src/sap/fe/core/messagebundle_mk.properties +23 -2
  309. package/src/sap/fe/core/messagebundle_ms.properties +24 -3
  310. package/src/sap/fe/core/messagebundle_nl.properties +23 -2
  311. package/src/sap/fe/core/messagebundle_no.properties +23 -2
  312. package/src/sap/fe/core/messagebundle_pl.properties +25 -4
  313. package/src/sap/fe/core/messagebundle_pt.properties +25 -4
  314. package/src/sap/fe/core/messagebundle_pt_PT.properties +24 -3
  315. package/src/sap/fe/core/messagebundle_ro.properties +25 -4
  316. package/src/sap/fe/core/messagebundle_ru.properties +24 -3
  317. package/src/sap/fe/core/messagebundle_sh.properties +25 -4
  318. package/src/sap/fe/core/messagebundle_sk.properties +24 -3
  319. package/src/sap/fe/core/messagebundle_sl.properties +28 -7
  320. package/src/sap/fe/core/messagebundle_sr.properties +25 -4
  321. package/src/sap/fe/core/messagebundle_sv.properties +23 -2
  322. package/src/sap/fe/core/messagebundle_th.properties +25 -4
  323. package/src/sap/fe/core/messagebundle_tr.properties +23 -2
  324. package/src/sap/fe/core/messagebundle_uk.properties +25 -4
  325. package/src/sap/fe/core/messagebundle_vi.properties +25 -4
  326. package/src/sap/fe/core/messagebundle_zh_CN.properties +26 -5
  327. package/src/sap/fe/core/messagebundle_zh_TW.properties +24 -3
  328. package/src/sap/fe/core/rootView/Fcl.controller.js +11 -7
  329. package/src/sap/fe/core/rootView/Fcl.controller.ts +16 -7
  330. package/src/sap/fe/core/rootView/NavContainer.controller.js +3 -3
  331. package/src/sap/fe/core/rootView/NavContainer.controller.ts +1 -1
  332. package/src/sap/fe/core/rootView/RootViewBaseController.js +87 -35
  333. package/src/sap/fe/core/rootView/RootViewBaseController.ts +113 -57
  334. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
  335. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
  336. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +29 -13
  337. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +27 -13
  338. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +1 -1
  339. package/src/sap/fe/core/services/ContextSharingServiceFactory.js +1 -1
  340. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +8 -2
  341. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +6 -0
  342. package/src/sap/fe/core/services/InlineEditServiceFactory.js +11 -5
  343. package/src/sap/fe/core/services/InlineEditServiceFactory.ts +9 -3
  344. package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
  345. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  346. package/src/sap/fe/core/services/RoutingServiceFactory.js +14 -7
  347. package/src/sap/fe/core/services/RoutingServiceFactory.ts +11 -5
  348. package/src/sap/fe/core/services/ShellServicesFactory.js +5 -4
  349. package/src/sap/fe/core/services/ShellServicesFactory.ts +5 -3
  350. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +28 -4
  351. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +32 -3
  352. package/src/sap/fe/core/services/TelemetryServiceFactory.js +1 -1
  353. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
  354. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +1 -1
  355. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +1 -1
  356. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +1 -1
  357. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  358. package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
  359. package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
  360. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
  361. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
  362. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  363. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  364. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
  365. package/src/sap/fe/core/templating/ActionHelper.js +1 -1
  366. package/src/sap/fe/core/templating/CommonFormatters.js +1 -1
  367. package/src/sap/fe/core/templating/CriticalityFormatters.js +1 -1
  368. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
  369. package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
  370. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  371. package/src/sap/fe/core/templating/EntitySetHelper.js +199 -59
  372. package/src/sap/fe/core/templating/EntitySetHelper.ts +221 -61
  373. package/src/sap/fe/core/templating/EntityTypeHelper.js +1 -1
  374. package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
  375. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  376. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  377. package/src/sap/fe/core/templating/PropertyHelper.js +1 -1
  378. package/src/sap/fe/core/templating/SemanticObjectHelper.js +8 -10
  379. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +11 -10
  380. package/src/sap/fe/core/templating/UIFormatters.js +5 -2
  381. package/src/sap/fe/core/templating/UIFormatters.ts +3 -0
  382. package/src/sap/fe/core/type/Date.js +1 -1
  383. package/src/sap/fe/core/type/DateTimeWithTimezone.js +1 -1
  384. package/src/sap/fe/core/type/EDM.js +1 -1
  385. package/src/sap/fe/core/type/Email.js +1 -1
  386. package/src/sap/fe/core/type/FiscalDate.js +1 -1
  387. package/src/sap/fe/core/type/InputMask.js +1 -1
  388. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.js +0 -288
  389. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.tsx +0 -208
  390. package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.js +0 -404
  391. package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.ts +0 -502
  392. package/src/sap/fe/core/designtime/TextArrangementChangeAction.js +0 -100
  393. package/src/sap/fe/core/designtime/TextArrangementChangeAction.ts +0 -134
  394. package/src/sap/fe/core/operationsHelper.js +0 -192
  395. package/src/sap/fe/core/operationsHelper.ts +0 -277
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2024 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
5
  sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap/m/MessageBox", "sap/ui/core/Lib", "sap/ui/core/Messaging", "sap/ui/core/util/PasteHelper", "../converters/ManifestSettings", "../templating/UIFormatters"], function (Log, MetaModelConverter, MessageBox, Library, Messaging, CorePasteHelper, ManifestSettings, UIFormatters) {
6
6
  "use strict";
@@ -72,7 +72,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
72
72
  * @param ignoreNavigationProperty If true, navigation properties are ignored
73
73
  * @returns An array of objects providing details about columns.
74
74
  */
75
- getColumnInfo: async function (table, columns) {
75
+ getColumnInfo: function (table, columns) {
76
76
  let ignoreNavigationProperty = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
77
77
  const model = table.getRowBinding().getModel(),
78
78
  metaModel = model.getMetaModel(),
@@ -104,46 +104,45 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
104
104
  }
105
105
  }
106
106
  }
107
- return table.getControlDelegate().fetchProperties(table).then(propertyInfo => {
108
- const propertyInfoDict = Object.assign({}, ...propertyInfo.map(property => ({
109
- [property.name]: property
110
- })));
111
- const columnInfos = [];
112
- (columns ?? table.getColumns()).forEach(column => {
113
- const infoProperty = propertyInfoDict[column.getPropertyKey()];
114
- // Check if it's a complex property (property associated to multiple simple properties)
115
- if (infoProperty.propertyInfos) {
116
- // Get data from simple property
117
- infoProperty.propertyInfos.forEach(property => {
118
- const dataProperty = propertyInfoDict[property],
119
- hasValueHelp = this.hasValueHelpProperty(entityTypeProperties, dataProperty),
120
- columnToPush = getColumnFromPropertyInfos(dataProperty, hasValueHelp, property);
121
- if (columnToPush) {
122
- columnInfos.push(columnToPush);
123
- }
124
- });
125
- if (infoProperty.exportDataPointTargetValue) {
126
- columnInfos.push({
127
- property: "targetValueFromDataPoint",
128
- ignore: true
129
- });
130
- }
131
- // Non exported columns should be part of the columnInfos
132
- } else if (infoProperty.exportSettings !== null) {
133
- if (infoProperty.path) {
134
- columnInfos.push(PasteHelper.getInfoForEntityProperty(infoProperty.path, rowBindingPath, metaContext, metaModel, tableDefinition.control.enablePastingOfComputedProperties));
135
- } else {
136
- // Empty column --> ignore
137
- columnInfos.push({
138
- property: "unused",
139
- type: null,
140
- ignore: true
141
- });
107
+ const propertyInfo = table.getParent().getEnhancedFetchedPropertyInfos();
108
+ const propertyInfoDict = Object.assign({}, ...propertyInfo.map(property => ({
109
+ [property.name]: property
110
+ })));
111
+ const columnInfos = [];
112
+ (columns ?? table.getColumns()).forEach(column => {
113
+ const infoProperty = propertyInfoDict[column.getPropertyKey()];
114
+ // Check if it's a complex property (property associated to multiple simple properties)
115
+ if (infoProperty.propertyInfos) {
116
+ // Get data from simple property
117
+ infoProperty.propertyInfos.forEach(property => {
118
+ const dataProperty = propertyInfoDict[property],
119
+ hasValueHelp = this.hasValueHelpProperty(entityTypeProperties, dataProperty),
120
+ columnToPush = getColumnFromPropertyInfos(dataProperty, hasValueHelp, property);
121
+ if (columnToPush) {
122
+ columnInfos.push(columnToPush);
142
123
  }
124
+ });
125
+ if (infoProperty.exportDataPointTargetValue) {
126
+ columnInfos.push({
127
+ property: "targetValueFromDataPoint",
128
+ ignore: true
129
+ });
143
130
  }
144
- });
145
- return columnInfos;
131
+ // Non exported columns should be part of the columnInfos
132
+ } else if (infoProperty.exportSettings !== null) {
133
+ if (infoProperty.path) {
134
+ columnInfos.push(PasteHelper.getInfoForEntityProperty(infoProperty.path, rowBindingPath, metaContext, metaModel, tableDefinition.control.enablePastingOfComputedProperties));
135
+ } else {
136
+ // Empty column --> ignore
137
+ columnInfos.push({
138
+ property: "unused",
139
+ type: null,
140
+ ignore: true
141
+ });
142
+ }
143
+ }
146
144
  });
145
+ return columnInfos;
147
146
  },
148
147
  getInfoForEntityProperty: getInfoForEntityProperty,
149
148
  /**
@@ -420,4 +419,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
420
419
  };
421
420
  return PasteHelper;
422
421
  }, false);
423
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRJbmZvRm9yRW50aXR5UHJvcGVydHkiLCJwcm9wZXJ0eVBhdGgiLCJyb3dCaW5kaW5nUGF0aCIsIm1ldGFDb250ZXh0IiwibWV0YU1vZGVsIiwiZW5hYmxlUGFzdGluZ09mQ29tcHV0ZWRQcm9wZXJ0aWVzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiZm9yY2VJZ25vcmUiLCJwcm9wZXJ0eSIsImdldFByb3BlcnR5IiwiZm9ybWF0T3B0aW9ucyIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsInR5cGUiLCJnZXRVSTVUeXBlIiwiaXNJZ25vcmVkIiwiY29tcHV0ZWQiLCJpZ25vcmUiLCJkaXNwbGF5RXJyb3JNZXNzYWdlcyIsImVycm9yTWVzc2FnZXMiLCJtZXNzYWdlRGV0YWlscyIsInJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiZXJyb3JDb3JyZWN0aW9uTWVzc2FnZSIsImdldFRleHQiLCJub3RlTWVzc2FnZSIsInBhc3RlRXJyb3JNZXNzYWdlIiwidW5zaGlmdCIsIk1lc3NhZ2VCb3giLCJlcnJvciIsInRpdGxlIiwiZGV0YWlscyIsImpvaW4iLCJQYXN0ZUhlbHBlciIsImZvcm1hdEN1c3RvbU1lc3NhZ2UiLCJ2YWxpZGF0aW9uTWVzc2FnZXMiLCJpUm93TnVtYmVyIiwiZXJyb3JNZXNzYWdlIiwibnVtYmVyTWVzc2FnZXMiLCJpMThuUm93IiwiZm9yRWFjaCIsIm1lc3NhZ2UiLCJpbmRleE1lc3NhZ2UiLCJtZXNzYWdlVGV4dCIsImdldENvbHVtbkluZm8iLCJ0YWJsZSIsImNvbHVtbnMiLCJpZ25vcmVOYXZpZ2F0aW9uUHJvcGVydHkiLCJtb2RlbCIsImdldFJvd0JpbmRpbmciLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsInJlc29sdmUiLCJnZXRQYXRoIiwiZ2V0Q29udGV4dCIsImdldE1ldGFDb250ZXh0IiwiZW50aXR5VHlwZVByb3BlcnRpZXMiLCJNZXRhTW9kZWxDb252ZXJ0ZXIiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZW50aXR5UHJvcGVydGllcyIsImNvbHVtbkFycmFuZ2VtZW50UHJvcGVydHkiLCJ0YWJsZURlZmluaXRpb24iLCJnZXRQYXJlbnQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJnZXRDb2x1bW5Gcm9tUHJvcGVydHlJbmZvcyIsImRhdGFQcm9wZXJ0eSIsImhhc1ZhbHVlSGVscCIsInRleHQiLCJwdXNoIiwiZXhwb3J0U2V0dGluZ3MiLCJpbmNsdWRlcyIsInBhdGgiLCJjb250cm9sIiwiZ2V0Q29udHJvbERlbGVnYXRlIiwiZmV0Y2hQcm9wZXJ0aWVzIiwidGhlbiIsInByb3BlcnR5SW5mbyIsInByb3BlcnR5SW5mb0RpY3QiLCJPYmplY3QiLCJhc3NpZ24iLCJtYXAiLCJuYW1lIiwiY29sdW1uSW5mb3MiLCJnZXRDb2x1bW5zIiwiY29sdW1uIiwiaW5mb1Byb3BlcnR5IiwiZ2V0UHJvcGVydHlLZXkiLCJwcm9wZXJ0eUluZm9zIiwiaGFzVmFsdWVIZWxwUHJvcGVydHkiLCJjb2x1bW5Ub1B1c2giLCJleHBvcnREYXRhUG9pbnRUYXJnZXRWYWx1ZSIsImZpbmQiLCJwIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJWYWx1ZUxpc3QiLCJwYXJzZVBhc3RlZERhdGEiLCJyYXdEYXRhIiwicGFzdGVJbmZvcyIsInBhc3RlZENvbHVtbkNvdW50IiwiZmlyc3RFZGl0YWJsZUNvbHVtbkluZGV4IiwiSSIsImNvbXB1dGVkUHJvcGVydGllcyIsImZpbHRlciIsImluZm8iLCJjb21wdXRlZFByb3BlcnR5IiwiY29sdW1uUG9zaXRpb24iLCJpbmRleE9mIiwiaXNDb2xFbXB0eSIsImV2ZXJ5Iiwicm93IiwicGFyc2VSZXN1bHQiLCJwYXJzZWREYXRhIiwiZXJyb3JzIiwiQ29yZVBhc3RlSGVscGVyIiwicGFyc2UiLCJvRWxlbWVudCIsIl91cGRhdGVDb250ZXh0cyIsImNvbnRleHRzIiwiZGF0YSIsImluZGV4Iiwic2V0UHJvcGVydHlQcm9taXNlcyIsInJvd0NvbnRleHQiLCJnZXRQcm9wZXJ0eUVkaXRNb2RlIiwiRmllbGRFZGl0TW9kZSIsIkVkaXRhYmxlIiwic2V0UHJvcGVydHkiLCJMb2ciLCJ3YXJuaW5nIiwiZ2V0SW5kZXgiLCJQcm9taXNlIiwiYWxsU2V0dGxlZCIsImdldFBhc3RlSW5mb3JtYXRpb25Gb3JSZXBvbnNpdmVUYWJsZSIsImNlbGxTZWxlY3Rpb24iLCJwb3NGaXJzdFNlbGVjdGVkUm93IiwibnVtYmVyT2ZOZXdDcmVhdGlvblJvd3MiLCJwb3NGaXJzdElubGluZUNyZWF0aW9uUm93SW5UYWJsZSIsImdldEN1cnJlbnRDb250ZXh0cyIsImZpbmRJbmRleCIsImNvbnRleHQiLCJpc1RyYW5zaWVudCIsInJvd3MiLCJ1cGRhdGVkUm93Q291bnQiLCJzbGljZSIsImxhc3RJbmxpbmVDcmVhdGlvblJvd0luU2VsZWN0aW9uIiwicG9wIiwicG9zTGFzdElubGluZUNyZWF0aW9uUm93SW5TZWxlY3Rpb24iLCJNYXRoIiwibWluIiwiZ2V0UGFzdGVJbmZvcm1hdGlvbkZvckdyaWRUYWJsZSIsInRhYmxlUm93Y0NvdW50IiwiZ2V0TGVuZ3RoIiwiZ2V0UGFzdGVJbmZvcm1hdGlvbiIsInBhc3RlSW5mb3JtYXRpb24iLCJnZXRDcmVhdGlvbk1vZGUiLCJnZXROYW1lIiwiQ3JlYXRpb25Nb2RlIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwicGFzdGVSYW5nZURhdGEiLCJwYXN0ZUluZm8iLCJjcmVhdGVFbXB0eVJvd3MiLCJyZXF1ZXN0Q29udGV4dHMiLCJwb3NGaXJzdElubGluZUNyZWF0aW9uUm93IiwiZm9jdXNSb3ciLCJ1cGRhdGVkQ29sQ291bnQiLCJrZXlzIiwicGFzdGVEYXRhIiwiY29udHJvbGxlciIsImVkaXRGbG93IiwiYURhdGEiLCJhUGFyc2VkRGF0YSIsImFsbCIsIm1EYXRhIiwidmFsaWRhdGVEb2N1bWVudCIsImdldEJpbmRpbmdDb250ZXh0IiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiYVZhbGlkYXRpb25NZXNzYWdlcyIsImFFcnJvck1lc3NhZ2VzIiwicmVkdWNlIiwiYU1lc3NhZ2VzIiwiYUN1c3RvbU1lc3NhZ2VzIiwibWVzc2FnZXMiLCJhUm93TWVzc2FnZXMiLCJtRXJyb3IiLCJhVmFsaWRhdGVkRGF0YSIsInRyYW5zaWVudENvbnRleHRzIiwibGFzdFRyYW5zaWVudENvbnRleHQiLCJsYXN0VHJhbnNpZW50Q29udGV4dEhhc0Vycm9yTWVzc2FnZSIsIk1lc3NhZ2luZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJnZXRUYXJnZXRzIiwibmV3Q29udGV4dHMiLCJjcmVhdGVNdWx0aXBsZURvY3VtZW50cyIsImNyZWF0ZUF0RW5kIiwib25CZWZvcmVDcmVhdGUiLCJkZWxldGUiLCJjYXRjaCIsIm9FcnJvciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiUGFzdGVIZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBcnJheVdpdGhJbmRleCwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgKiBhcyBDb3JlUGFzdGVIZWxwZXIgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvUGFzdGVIZWxwZXJcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IFByb3BlcnR5SW5mbyB9IGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBUYWJsZURlbGVnYXRlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlRGVsZWdhdGVcIjtcbmltcG9ydCB0eXBlIENvbHVtbiBmcm9tIFwic2FwL3VpL21kYy90YWJsZS9Db2x1bW5cIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YVR5cGUgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS90eXBlL09EYXRhVHlwZVwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgeyBDcmVhdGlvbk1vZGUgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBGaWVsZEVkaXRNb2RlIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvVUlGb3JtYXR0ZXJzXCI7XG5cbmV4cG9ydCB0eXBlIGN1c3RvbVZhbGlkYXRpb25NZXNzYWdlID0ge1xuXHRtZXNzYWdlVGV4dD86IHN0cmluZztcblx0bWVzc2FnZVRhcmdldD86IHN0cmluZztcbn07XG5cbnR5cGUgUGFzdGVJbmZvcm1hdGlvbiA9IHtcblx0cm93czogT0RhdGFWNENvbnRleHRbXTtcblx0Y29sdW1uczogQ29sdW1uW107XG5cdHVwZGF0ZWRSb3dDb3VudDogbnVtYmVyO1xuXHRudW1iZXJPZk5ld0NyZWF0aW9uUm93czogbnVtYmVyO1xufTtcblxuY29uc3QgZ2V0SW5mb0ZvckVudGl0eVByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0cm93QmluZGluZ1BhdGg6IHN0cmluZyxcblx0bWV0YUNvbnRleHQ6IENvbnRleHQsXG5cdG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdGVuYWJsZVBhc3RpbmdPZkNvbXB1dGVkUHJvcGVydGllcyA9IGZhbHNlLFxuXHRmb3JjZUlnbm9yZSA9IGZhbHNlXG4pOiBQYXN0ZUNvbHVtbkluZm8ge1xuXHRjb25zdCBwcm9wZXJ0eSA9IG1ldGFDb250ZXh0LmdldFByb3BlcnR5KHByb3BlcnR5UGF0aCksXG5cdFx0Zm9ybWF0T3B0aW9ucyA9IHsgcGFyc2VLZWVwc0VtcHR5U3RyaW5nOiB0cnVlIH0sXG5cdFx0dHlwZSA9IG1ldGFNb2RlbC5nZXRVSTVUeXBlKGAke3Jvd0JpbmRpbmdQYXRofS8ke3Byb3BlcnR5UGF0aH1gLCBmb3JtYXRPcHRpb25zKTtcblx0bGV0IGlzSWdub3JlZCwgY29tcHV0ZWQ7XG5cdGlmIChlbmFibGVQYXN0aW5nT2ZDb21wdXRlZFByb3BlcnRpZXMgPT09IHRydWUpIHtcblx0XHRpc0lnbm9yZWQgPSAhcHJvcGVydHk7XG5cdFx0Y29tcHV0ZWQgPSBtZXRhQ29udGV4dC5nZXRQcm9wZXJ0eShgJHtwcm9wZXJ0eVBhdGh9QE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkYCk7XG5cdH0gZWxzZSB7XG5cdFx0aXNJZ25vcmVkID0gIXByb3BlcnR5IHx8IG1ldGFDb250ZXh0LmdldFByb3BlcnR5KGAke3Byb3BlcnR5UGF0aH1AT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRgKTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0cHJvcGVydHk6IHByb3BlcnR5UGF0aCxcblx0XHRpZ25vcmU6IGZvcmNlSWdub3JlIHx8IGlzSWdub3JlZCxcblx0XHRjb21wdXRlZDogY29tcHV0ZWQsXG5cdFx0dHlwZTogdHlwZVxuXHR9O1xufTtcblxuY29uc3QgZGlzcGxheUVycm9yTWVzc2FnZXMgPSBmdW5jdGlvbiAoZXJyb3JNZXNzYWdlczogc3RyaW5nW10pOiB2b2lkIHtcblx0Y29uc3QgbWVzc2FnZURldGFpbHMgPSBbLi4uZXJyb3JNZXNzYWdlc107XG5cdGNvbnN0IHJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpISxcblx0XHRlcnJvckNvcnJlY3Rpb25NZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfUEFTVEVfSEVMUEVSX1NBUEZFX1BBU1RFX0VSUk9SX0NPUlJFQ1RJT05fTUVTU0FHRVwiKSxcblx0XHRub3RlTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX1BBU1RFX0hFTFBFUl9TQVBGRV9QQVNURV9FUlJPUl9DT1JSRUNUSU9OX05PVEVcIik7XG5cdGxldCBwYXN0ZUVycm9yTWVzc2FnZTtcblxuXHRpZiAobWVzc2FnZURldGFpbHMubGVuZ3RoID4gMSkge1xuXHRcdHBhc3RlRXJyb3JNZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfUEFTVEVfSEVMUEVSX1NBUEZFX1BBU1RFX0VSUk9SX01FU1NBR0VfUExVUkFMXCIsIFttZXNzYWdlRGV0YWlscy5sZW5ndGhdKTtcblx0fSBlbHNlIHtcblx0XHRwYXN0ZUVycm9yTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX1BBU1RFX0hFTFBFUl9TQVBGRV9QQVNURV9FUlJPUl9NRVNTQUdFX1NJTkdVTEFSXCIpO1xuXHR9XG5cdG1lc3NhZ2VEZXRhaWxzLnVuc2hpZnQoXCJcIik7IC8vIFRvIHNob3cgc3BhY2UgYmV0d2VlbiB0aGUgc2hvcnQgdGV4dCBhbmQgdGhlIGxpc3Qgb2YgZXJyb3JzXG5cdG1lc3NhZ2VEZXRhaWxzLnVuc2hpZnQobm90ZU1lc3NhZ2UpO1xuXHRtZXNzYWdlRGV0YWlscy51bnNoaWZ0KGVycm9yQ29ycmVjdGlvbk1lc3NhZ2UpO1xuXHRNZXNzYWdlQm94LmVycm9yKHBhc3RlRXJyb3JNZXNzYWdlLCB7XG5cdFx0dGl0bGU6IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX0VSUk9SXCIpLFxuXHRcdGRldGFpbHM6IG1lc3NhZ2VEZXRhaWxzLmpvaW4oXCI8YnI+XCIpXG5cdH0pO1xufTtcblxudHlwZSBQYXN0ZUNvbHVtbkluZm8gPSB7XG5cdHByb3BlcnR5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHR5cGU/OiBPRGF0YVR5cGUgfCBudWxsO1xuXHRpZ25vcmU6IGJvb2xlYW47XG5cdGNvbXB1dGVkPzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IFBhc3RlSGVscGVyID0ge1xuXHRkaXNwbGF5RXJyb3JNZXNzYWdlczogZGlzcGxheUVycm9yTWVzc2FnZXMsXG5cdGZvcm1hdEN1c3RvbU1lc3NhZ2U6IGZ1bmN0aW9uICh2YWxpZGF0aW9uTWVzc2FnZXM6IGN1c3RvbVZhbGlkYXRpb25NZXNzYWdlW10sIGlSb3dOdW1iZXI6IG51bWJlcik6IHN0cmluZyB7XG5cdFx0bGV0IGVycm9yTWVzc2FnZSA9IFwiXCI7XG5cdFx0Y29uc3QgbnVtYmVyTWVzc2FnZXMgPSB2YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoO1xuXHRcdGNvbnN0IHJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpISxcblx0XHRcdGkxOG5Sb3cgPSByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0dST1VQX0RFU0NSSVBUSU9OX1RBQkxFX1JPV1wiKTtcblx0XHRpZiAobnVtYmVyTWVzc2FnZXMgPiAwKSB7XG5cdFx0XHRlcnJvck1lc3NhZ2UgKz0gYCR7aTE4blJvd30gJHtpUm93TnVtYmVyfTogYDtcblx0XHRcdHZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKChtZXNzYWdlLCBpbmRleE1lc3NhZ2UpID0+IHtcblx0XHRcdFx0aWYgKG1lc3NhZ2UubWVzc2FnZVRleHQpIHtcblx0XHRcdFx0XHRlcnJvck1lc3NhZ2UgKz0gbWVzc2FnZS5tZXNzYWdlVGV4dCArIChpbmRleE1lc3NhZ2UgKyAxICE9PSBudW1iZXJNZXNzYWdlcyA/IFwiIFwiIDogXCJcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gZXJyb3JNZXNzYWdlO1xuXHR9LFxuXHQvKipcblx0ICogR2V0IGRldGFpbHMgYWJvdXQgdGFibGUgY29sdW1ucy5cblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB3aGljaCBjb250YWlucyB0aGUgY29sdW1ucyB0byBiZSBhbmFseXplZFxuXHQgKiBAcGFyYW0gY29sdW1ucyBBIGxpc3Qgb2YgY29sdW1ucyB0byBiZSBhbmFseXplZC4gSWYgdW5kZWZpbmVkLCBhbGwgY29sdW1ucyBmcm9tIHRoZSB0YWJsZSBhcmUgYW5hbHl6ZWRcblx0ICogQHBhcmFtIGlnbm9yZU5hdmlnYXRpb25Qcm9wZXJ0eSBJZiB0cnVlLCBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIGlnbm9yZWRcblx0ICogQHJldHVybnMgQW4gYXJyYXkgb2Ygb2JqZWN0cyBwcm92aWRpbmcgZGV0YWlscyBhYm91dCBjb2x1bW5zLlxuXHQgKi9cblx0Z2V0Q29sdW1uSW5mbzogYXN5bmMgZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSwgY29sdW1ucz86IENvbHVtbltdLCBpZ25vcmVOYXZpZ2F0aW9uUHJvcGVydHkgPSB0cnVlKTogUHJvbWlzZTxQYXN0ZUNvbHVtbkluZm9bXT4ge1xuXHRcdGNvbnN0IG1vZGVsID0gdGFibGUuZ2V0Um93QmluZGluZygpLmdldE1vZGVsKCksXG5cdFx0XHRtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHJvd0JpbmRpbmdQYXRoID0gbW9kZWwucmVzb2x2ZSh0YWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0UGF0aCgpLCB0YWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0Q29udGV4dCgpKSxcblx0XHRcdG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KHJvd0JpbmRpbmdQYXRoKSxcblx0XHRcdGVudGl0eVR5cGVQcm9wZXJ0aWVzID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkudGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLFxuXHRcdFx0Y29sdW1uQXJyYW5nZW1lbnRQcm9wZXJ0eTogc3RyaW5nW10gPSBbXSxcblx0XHRcdHRhYmxlRGVmaW5pdGlvbiA9ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0VGFibGVEZWZpbml0aW9uKCk7XG5cdFx0ZnVuY3Rpb24gZ2V0Q29sdW1uRnJvbVByb3BlcnR5SW5mb3MoXG5cdFx0XHRkYXRhUHJvcGVydHk6IFByb3BlcnR5SW5mbyxcblx0XHRcdGhhc1ZhbHVlSGVscDogYm9vbGVhbixcblx0XHRcdHByb3BlcnR5OiBzdHJpbmdcblx0XHQpOiBQYXN0ZUNvbHVtbkluZm8gfCB1bmRlZmluZWQge1xuXHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIHRleHRBcnJhbmdlbWVudCwgd2Ugd2FudCB0byByZW1vdmUgaXQgaWYgaXQgaGFzIGEgVmFsdWVMaXN0IGFzc29jaWF0ZWQuXG5cdFx0XHRpZiAoZGF0YVByb3BlcnR5LnRleHQgJiYgaGFzVmFsdWVIZWxwKSB7XG5cdFx0XHRcdGNvbHVtbkFycmFuZ2VtZW50UHJvcGVydHkucHVzaChkYXRhUHJvcGVydHkudGV4dCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBOb24gZXhwb3J0ZWQgY29sdW1ucyBzaG91bGQgYmUgcGFydCBvZiB0aGUgY29sdW1uSW5mb3Ncblx0XHRcdGlmIChkYXRhUHJvcGVydHkuZXhwb3J0U2V0dGluZ3MgIT09IG51bGwpIHtcblx0XHRcdFx0Ly8gQ2hlY2sgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IHdpdGhpbiB0aGUgY3VycmVudCBDb21wbGV4IHByb3BlcnR5IC0tPiBpZ25vcmVcblx0XHRcdFx0aWYgKGlnbm9yZU5hdmlnYXRpb25Qcm9wZXJ0eSAmJiBwcm9wZXJ0eS5pbmNsdWRlcyhcIi9cIikpIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0cHJvcGVydHk6IGRhdGFQcm9wZXJ0eS5wYXRoLFxuXHRcdFx0XHRcdFx0aWdub3JlOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsZXQgZm9yY2VJZ25vcmUgPSBmYWxzZTtcblx0XHRcdFx0XHRpZiAoZGF0YVByb3BlcnR5LnBhdGgpIHtcblx0XHRcdFx0XHRcdGZvcmNlSWdub3JlID0gY29sdW1uQXJyYW5nZW1lbnRQcm9wZXJ0eS5pbmNsdWRlcyhkYXRhUHJvcGVydHkucGF0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIFRoZSBvYmplY3QgdGhpcyBpcyB3ZWlyZCBpbiBhIGZ1bmN0aW9uLCBzbyBjaGFuZ2luZyBpdCB0byBQYXN0ZUhlbHBlciBpbnN0ZWFkLlxuXHRcdFx0XHRcdHJldHVybiBQYXN0ZUhlbHBlci5nZXRJbmZvRm9yRW50aXR5UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRkYXRhUHJvcGVydHkucGF0aCEsXG5cdFx0XHRcdFx0XHRyb3dCaW5kaW5nUGF0aCxcblx0XHRcdFx0XHRcdG1ldGFDb250ZXh0LFxuXHRcdFx0XHRcdFx0bWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0dGFibGVEZWZpbml0aW9uLmNvbnRyb2wuZW5hYmxlUGFzdGluZ09mQ29tcHV0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0Zm9yY2VJZ25vcmVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuICh0YWJsZS5nZXRDb250cm9sRGVsZWdhdGUoKSBhcyBUYWJsZURlbGVnYXRlKS5mZXRjaFByb3BlcnRpZXModGFibGUpLnRoZW4oKHByb3BlcnR5SW5mbzogUHJvcGVydHlJbmZvW10pID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5SW5mb0RpY3Q6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5SW5mbz4gPSBPYmplY3QuYXNzaWduKFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0Li4ucHJvcGVydHlJbmZvLm1hcCgocHJvcGVydHk6IFByb3BlcnR5SW5mbykgPT4gKHsgW3Byb3BlcnR5Lm5hbWVdOiBwcm9wZXJ0eSB9KSlcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBjb2x1bW5JbmZvczogUGFzdGVDb2x1bW5JbmZvW10gPSBbXTtcblx0XHRcdChjb2x1bW5zID8/IHRhYmxlLmdldENvbHVtbnMoKSkuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGluZm9Qcm9wZXJ0eSA9IHByb3BlcnR5SW5mb0RpY3RbY29sdW1uLmdldFByb3BlcnR5S2V5KCldO1xuXHRcdFx0XHQvLyBDaGVjayBpZiBpdCdzIGEgY29tcGxleCBwcm9wZXJ0eSAocHJvcGVydHkgYXNzb2NpYXRlZCB0byBtdWx0aXBsZSBzaW1wbGUgcHJvcGVydGllcylcblx0XHRcdFx0aWYgKGluZm9Qcm9wZXJ0eS5wcm9wZXJ0eUluZm9zKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IGRhdGEgZnJvbSBzaW1wbGUgcHJvcGVydHlcblx0XHRcdFx0XHRpbmZvUHJvcGVydHkucHJvcGVydHlJbmZvcy5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBkYXRhUHJvcGVydHkgPSBwcm9wZXJ0eUluZm9EaWN0W3Byb3BlcnR5XSxcblx0XHRcdFx0XHRcdFx0aGFzVmFsdWVIZWxwID0gdGhpcy5oYXNWYWx1ZUhlbHBQcm9wZXJ0eShlbnRpdHlUeXBlUHJvcGVydGllcywgZGF0YVByb3BlcnR5KSxcblx0XHRcdFx0XHRcdFx0Y29sdW1uVG9QdXNoID0gZ2V0Q29sdW1uRnJvbVByb3BlcnR5SW5mb3MoZGF0YVByb3BlcnR5LCBoYXNWYWx1ZUhlbHAsIHByb3BlcnR5KTtcblx0XHRcdFx0XHRcdGlmIChjb2x1bW5Ub1B1c2gpIHtcblx0XHRcdFx0XHRcdFx0Y29sdW1uSW5mb3MucHVzaChjb2x1bW5Ub1B1c2gpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGlmICgoaW5mb1Byb3BlcnR5IGFzIHsgZXhwb3J0RGF0YVBvaW50VGFyZ2V0VmFsdWU/OiBib29sZWFuIH0pLmV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlKSB7XG5cdFx0XHRcdFx0XHRjb2x1bW5JbmZvcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0cHJvcGVydHk6IFwidGFyZ2V0VmFsdWVGcm9tRGF0YVBvaW50XCIsXG5cdFx0XHRcdFx0XHRcdGlnbm9yZTogdHJ1ZVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIE5vbiBleHBvcnRlZCBjb2x1bW5zIHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBjb2x1bW5JbmZvc1xuXHRcdFx0XHR9IGVsc2UgaWYgKGluZm9Qcm9wZXJ0eS5leHBvcnRTZXR0aW5ncyAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdGlmIChpbmZvUHJvcGVydHkucGF0aCkge1xuXHRcdFx0XHRcdFx0Y29sdW1uSW5mb3MucHVzaChcblx0XHRcdFx0XHRcdFx0UGFzdGVIZWxwZXIuZ2V0SW5mb0ZvckVudGl0eVByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRcdGluZm9Qcm9wZXJ0eS5wYXRoLFxuXHRcdFx0XHRcdFx0XHRcdHJvd0JpbmRpbmdQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdG1ldGFDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRcdG1ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHR0YWJsZURlZmluaXRpb24uY29udHJvbC5lbmFibGVQYXN0aW5nT2ZDb21wdXRlZFByb3BlcnRpZXNcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gRW1wdHkgY29sdW1uIC0tPiBpZ25vcmVcblx0XHRcdFx0XHRcdGNvbHVtbkluZm9zLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eTogXCJ1bnVzZWRcIixcblx0XHRcdFx0XHRcdFx0dHlwZTogbnVsbCxcblx0XHRcdFx0XHRcdFx0aWdub3JlOiB0cnVlXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGNvbHVtbkluZm9zO1xuXHRcdH0pO1xuXHR9LFxuXHRnZXRJbmZvRm9yRW50aXR5UHJvcGVydHk6IGdldEluZm9Gb3JFbnRpdHlQcm9wZXJ0eSxcblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIGEgcHJvcGVydHkgaGFzIGEgdmFsdWUgbGlzdCBvciBub3QuXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlUHJvcGVydGllcyBUaGUgZW50aXR5IHByb3BlcnRpZXNcblx0ICogQHBhcmFtIGRhdGFQcm9wZXJ0eSBUaGUgcHJvcGVydHkgd2Ugd2FudCB0byBjaGVja1xuXHQgKiBAcmV0dXJucyBCb29sZWFuIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaGFzIGEgdmFsdWUgbGlzdC5cblx0ICovXG5cdGhhc1ZhbHVlSGVscFByb3BlcnR5OiBmdW5jdGlvbiAoXG5cdFx0ZW50aXR5VHlwZVByb3BlcnRpZXM6IEFycmF5V2l0aEluZGV4PFByb3BlcnR5LCBcIm5hbWVcIiB8IFwiZnVsbHlRdWFsaWZpZWROYW1lXCI+LFxuXHRcdGRhdGFQcm9wZXJ0eTogUHJvcGVydHlJbmZvXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gZW50aXR5VHlwZVByb3BlcnRpZXMuZmluZCgocCkgPT4gcC5uYW1lID09PSBkYXRhUHJvcGVydHkucGF0aCk7XG5cdFx0aWYgKHByb3BlcnR5KSB7XG5cdFx0XHRyZXR1cm4gISFwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5WYWx1ZUxpc3Q7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHQvKipcblx0ICogVHJhbnNmb3JtIGFuIGFycmF5IG9mIGRhdGEgYnkgcGFyc2luZyBpdCBpbnRvIGFuIGFycmF5IG9mIG9iamVjdHMsIGZhY2lsaXRhdGluZyB0aGUgbWFwcGluZyBvZiBjb2x1bW5zIGFuZCBkYXRhLlxuXHQgKiBAcGFyYW0gcmF3RGF0YSBUaGUgdGFibGUgd2hpY2ggY29udGFpbnMgdGhlIGNvbHVtbnMgdG8gYmUgYW5hbHl6ZWRcblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB3aGljaCByZWNlaXZlcyB0aGUgZGF0YVxuXHQgKiBAcGFyYW0gY29sdW1ucyBBIGxpc3Qgb2YgY29sdW1ucyB0byBiZSB1c2VkIHRvIG1hcCB0aGUgZGF0YS4gSWYgdW5kZWZpbmVkLCBhbGwgdGFibGUgY29sdW1ucyBhcmUgdXNlZFxuXHQgKiBAcGFyYW0gaWdub3JlTmF2aWdhdGlvblByb3BlcnR5IElmIHRydWUsIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcmUgaWdub3JlZFxuXHQgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0aGF0IGFzc29jaWF0ZXMgZGF0YSB3aXRoIGNvcnJlc3BvbmRpbmcgY29sdW1ucy5cblx0ICovXG5cdHBhcnNlUGFzdGVkRGF0YTogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdHJhd0RhdGE6IHVua25vd25bXVtdLFxuXHRcdHRhYmxlOiBUYWJsZSxcblx0XHRjb2x1bW5zPzogQ29sdW1uW10sXG5cdFx0aWdub3JlTmF2aWdhdGlvblByb3BlcnR5ID0gdHJ1ZVxuXHQpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+IHtcblx0XHRjb25zdCBwYXN0ZUluZm9zID0gYXdhaXQgdGhpcy5nZXRDb2x1bW5JbmZvKHRhYmxlLCBjb2x1bW5zLCBpZ25vcmVOYXZpZ2F0aW9uUHJvcGVydHkpO1xuXHRcdGNvbnN0IHRhYmxlRGVmaW5pdGlvbiA9ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0VGFibGVEZWZpbml0aW9uKCk7XG5cdFx0Ly8gQ2hlY2sgaWYgd2UgaGF2ZSBkYXRhIGZvciBhdCBsZWFzdCB0aGUgZmlyc3QgZWRpdGFibGUgY29sdW1uXG5cdFx0Y29uc3QgcGFzdGVkQ29sdW1uQ291bnQgPSByYXdEYXRhLmxlbmd0aCA/IHJhd0RhdGFbMF0ubGVuZ3RoIDogMDtcblx0XHRsZXQgZmlyc3RFZGl0YWJsZUNvbHVtbkluZGV4ID0gLTE7XG5cdFx0Zm9yIChsZXQgSSA9IDA7IEkgPCBwYXN0ZUluZm9zLmxlbmd0aCAmJiBmaXJzdEVkaXRhYmxlQ29sdW1uSW5kZXggPCAwOyBJKyspIHtcblx0XHRcdGlmICghcGFzdGVJbmZvc1tJXS5pZ25vcmUgJiYgIXBhc3RlSW5mb3NbSV0uY29tcHV0ZWQpIHtcblx0XHRcdFx0Zmlyc3RFZGl0YWJsZUNvbHVtbkluZGV4ID0gSTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGFibGVEZWZpbml0aW9uLmNvbnRyb2wuZW5hYmxlUGFzdGluZ09mQ29tcHV0ZWRQcm9wZXJ0aWVzKSB7XG5cdFx0XHRjb25zdCBjb21wdXRlZFByb3BlcnRpZXMgPSBwYXN0ZUluZm9zLmZpbHRlcihmdW5jdGlvbiAoaW5mbykge1xuXHRcdFx0XHRyZXR1cm4gaW5mby5jb21wdXRlZDtcblx0XHRcdH0pO1xuXHRcdFx0Ly9mb3IgZWFjaCBjb21wdXRlZCBwcm9wZXJ0eSwgY2hlY2sgaWYgdGhlIGNvbHVtbiBpcyBlbXB0eSAuIElmIHllcywgaWdub3JlIGl0XG5cdFx0XHRjb21wdXRlZFByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoY29tcHV0ZWRQcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBjb2x1bW5Qb3NpdGlvbiA9IHBhc3RlSW5mb3MuaW5kZXhPZihjb21wdXRlZFByb3BlcnR5KTtcblx0XHRcdFx0Y29uc3QgaXNDb2xFbXB0eSA9IHJhd0RhdGEuZXZlcnkoKHJvdykgPT4gcm93W2NvbHVtblBvc2l0aW9uXSA9PT0gXCJcIik7XG5cdFx0XHRcdGlmIChpc0NvbEVtcHR5KSB7XG5cdFx0XHRcdFx0Y29tcHV0ZWRQcm9wZXJ0eS5pZ25vcmUgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJzZVJlc3VsdCA9IGF3YWl0IChmaXJzdEVkaXRhYmxlQ29sdW1uSW5kZXggPCAwIHx8IGZpcnN0RWRpdGFibGVDb2x1bW5JbmRleCA+IHBhc3RlZENvbHVtbkNvdW50IC0gMVxuXHRcdFx0PyB7IHBhcnNlZERhdGE6IFtdLCBlcnJvcnM6IG51bGwgfSAvLyBXZSBkb24ndCBoYXZlIGRhdGEgZm9yIGFuIGVkaXRhYmxlIGNvbHVtbiAtLT4gcmV0dXJuIGVtcHR5IHBhcnNlZCBkYXRhXG5cdFx0XHQ6IENvcmVQYXN0ZUhlbHBlci5wYXJzZShyYXdEYXRhLCBwYXN0ZUluZm9zKSk7XG5cdFx0aWYgKHBhcnNlUmVzdWx0LmVycm9ycykge1xuXHRcdFx0Y29uc3QgZXJyb3JNZXNzYWdlcyA9IHBhcnNlUmVzdWx0LmVycm9ycy5tYXAoZnVuY3Rpb24gKG9FbGVtZW50KSB7XG5cdFx0XHRcdHJldHVybiBvRWxlbWVudC5tZXNzYWdlO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmRpc3BsYXlFcnJvck1lc3NhZ2VzKGVycm9yTWVzc2FnZXMpO1xuXHRcdFx0cmV0dXJuIFtdOyAvLyBFcnJvcnMgLS0+IHJldHVybiBub3RoaW5nXG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBwYXJzZVJlc3VsdC5wYXJzZWREYXRhO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIGFuIGFycmF5IG9mIGNvbnRleHRzLlxuXHQgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHdoaWNoIGNvbnRhaW5zIHRoZSBjb250ZXh0cyB0byBiZSB1cGRhdGVkXG5cdCAqIEBwYXJhbSBjb250ZXh0cyBBcnJheSBvZiBjb250ZXh0cyB0byBiZSB1cGRhdGVkXG5cdCAqIEBwYXJhbSBkYXRhIEFycmF5IG9mIG9iamVjdCBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIHVzZWQgdG8gdXBkYXRlIHRoZSBjb250ZXh0c1xuXHQgKiBAcmV0dXJucyBQcm9taXNlXG5cdCAqL1xuXHRfdXBkYXRlQ29udGV4dHM6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHR0YWJsZTogVGFibGUsXG5cdFx0Y29udGV4dHM6IChPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZClbXSxcblx0XHRkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBpbmRleCA9IDA7XG5cdFx0Y29uc3Qgc2V0UHJvcGVydHlQcm9taXNlcyA9IFtdO1xuXHRcdGZvciAoY29uc3Qgcm93IG9mIGRhdGEpIHtcblx0XHRcdGNvbnN0IHJvd0NvbnRleHQgPSBjb250ZXh0c1tpbmRleCsrXTtcblx0XHRcdGlmIChyb3dDb250ZXh0KSB7XG5cdFx0XHRcdGZvciAoY29uc3QgZGF0YVByb3BlcnR5IGluIHJvdykge1xuXHRcdFx0XHRcdGlmICgodGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkpLmdldFByb3BlcnR5RWRpdE1vZGUoZGF0YVByb3BlcnR5LCByb3dDb250ZXh0KSA9PT0gRmllbGRFZGl0TW9kZS5FZGl0YWJsZSkge1xuXHRcdFx0XHRcdFx0c2V0UHJvcGVydHlQcm9taXNlcy5wdXNoKHJvd0NvbnRleHQuc2V0UHJvcGVydHkoZGF0YVByb3BlcnR5LCByb3dbZGF0YVByb3BlcnR5XSkpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRMb2cud2FybmluZyhgUHJvcGVydHkgJHtkYXRhUHJvcGVydHl9IGlzIG5vdCBlZGl0YWJsZSBmb3Igcm93ICR7cm93Q29udGV4dC5nZXRJbmRleCgpfWApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoc2V0UHJvcGVydHlQcm9taXNlcyk7XG5cdH0sXG5cblx0LyoqXG5cdCAqICBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhc3RlIG9wZXJhdGlvbiBvbiBSZXNwb25zaXZlVGFibGUuXG5cdCAqIEBwYXJhbSByYXdEYXRhXG5cdCAqIEBwYXJhbSBjZWxsU2VsZWN0aW9uXG5cdCAqIEBwYXJhbSBjZWxsU2VsZWN0aW9uLmNvbHVtbnNcblx0ICogQHBhcmFtIGNlbGxTZWxlY3Rpb24ucm93c1xuXHQgKiBAcGFyYW0gcG9zRmlyc3RTZWxlY3RlZFJvd1xuXHQgKiBAcGFyYW0gdGFibGVcblx0ICogQHJldHVybnMgT2JqZXQgY29udGFpbmluZyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFzdGluZyBvcGVyYXRpb25cblx0ICovXG5cdGdldFBhc3RlSW5mb3JtYXRpb25Gb3JSZXBvbnNpdmVUYWJsZTogZnVuY3Rpb24gKFxuXHRcdHJhd0RhdGE6IHN0cmluZ1tdW10sXG5cdFx0Y2VsbFNlbGVjdGlvbjogeyBjb2x1bW5zOiBDb2x1bW5bXTsgcm93czogT0RhdGFWNENvbnRleHRbXSB9LFxuXHRcdHBvc0ZpcnN0U2VsZWN0ZWRSb3c6IG51bWJlcixcblx0XHR0YWJsZTogVGFibGVcblx0KTogUGFzdGVJbmZvcm1hdGlvbiB7XG5cdFx0bGV0IG51bWJlck9mTmV3Q3JlYXRpb25Sb3dzID0gMDtcblx0XHRjb25zdCBwb3NGaXJzdElubGluZUNyZWF0aW9uUm93SW5UYWJsZSA9IHRhYmxlXG5cdFx0XHQuZ2V0Um93QmluZGluZygpXG5cdFx0XHQuZ2V0Q3VycmVudENvbnRleHRzKClcblx0XHRcdC5maW5kSW5kZXgoKGNvbnRleHQpID0+IGNvbnRleHQuaXNUcmFuc2llbnQoKSk7XG5cdFx0Y29uc3Qgcm93cyA9IGNlbGxTZWxlY3Rpb24ucm93cztcblx0XHRsZXQgdXBkYXRlZFJvd0NvdW50ID0gMDtcblx0XHRjb25zdCBjb2x1bW5zID1cblx0XHRcdGNlbGxTZWxlY3Rpb24uY29sdW1ucy5sZW5ndGggPiAxXG5cdFx0XHRcdD8gY2VsbFNlbGVjdGlvbi5jb2x1bW5zXG5cdFx0XHRcdDogdGFibGUuZ2V0Q29sdW1ucygpLnNsaWNlKHRhYmxlLmdldENvbHVtbnMoKS5pbmRleE9mKGNlbGxTZWxlY3Rpb24uY29sdW1uc1swXSkpO1xuXG5cdFx0Ly8gb25seSBvbmUgY2VsbCBpcyBzZWxlY3RlZFxuXHRcdGlmIChjZWxsU2VsZWN0aW9uLmNvbHVtbnMubGVuZ3RoID09PSAxICYmIGNlbGxTZWxlY3Rpb24ucm93cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdC8vIGNoZWNrIGlmIHRoZSBpbmxpbmUgY3JlYXRpb24gcm93IGlzIGluIHRoZSB0YXJnZXRlZCByYW5nZVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRwb3NGaXJzdFNlbGVjdGVkUm93IDw9IHBvc0ZpcnN0SW5saW5lQ3JlYXRpb25Sb3dJblRhYmxlICYmXG5cdFx0XHRcdHBvc0ZpcnN0U2VsZWN0ZWRSb3cgKyByYXdEYXRhLmxlbmd0aCA+IHBvc0ZpcnN0SW5saW5lQ3JlYXRpb25Sb3dJblRhYmxlXG5cdFx0XHQpIHtcblx0XHRcdFx0bnVtYmVyT2ZOZXdDcmVhdGlvblJvd3MgPSByYXdEYXRhLmxlbmd0aCAtIChwb3NGaXJzdElubGluZUNyZWF0aW9uUm93SW5UYWJsZSAtIHBvc0ZpcnN0U2VsZWN0ZWRSb3cpIC0gMTtcblx0XHRcdFx0dXBkYXRlZFJvd0NvdW50ID0gcmF3RGF0YS5sZW5ndGg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyB0aGUgaW5saW5lIGNyZWF0aW9uIHJvdyBpcyBub3QgaW4gdGhlIHRhcmdldGVkIHJhbmdlXG5cdFx0XHRcdG51bWJlck9mTmV3Q3JlYXRpb25Sb3dzID0gMDtcblx0XHRcdFx0dXBkYXRlZFJvd0NvdW50ID0gcmF3RGF0YS5sZW5ndGg7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIG11bHRpcGxlIGNlbGxzIGFyZSBzZWxlY3RlZFxuXHRcdFx0Y29uc3QgbGFzdElubGluZUNyZWF0aW9uUm93SW5TZWxlY3Rpb24gPSByb3dzLmZpbHRlcigoY29udGV4dCkgPT4gY29udGV4dC5pc1RyYW5zaWVudCgpKT8ucG9wKCk7XG5cdFx0XHRjb25zdCBwb3NMYXN0SW5saW5lQ3JlYXRpb25Sb3dJblNlbGVjdGlvbiA9IGxhc3RJbmxpbmVDcmVhdGlvblJvd0luU2VsZWN0aW9uXG5cdFx0XHRcdD8gcm93cy5pbmRleE9mKGxhc3RJbmxpbmVDcmVhdGlvblJvd0luU2VsZWN0aW9uKVxuXHRcdFx0XHQ6IC0xO1xuXHRcdFx0dXBkYXRlZFJvd0NvdW50ID0gTWF0aC5taW4ocmF3RGF0YS5sZW5ndGgsIGNlbGxTZWxlY3Rpb24ucm93cy5sZW5ndGgpO1xuXHRcdFx0Ly8gY2hlY2sgaWYgdGhlIGlubGluZSBjcmVhdGlvbiByb3cgaXMgaW4gdGhlIHNlbGVjdGVkIHJhbmdlXG5cdFx0XHRpZiAocG9zTGFzdElubGluZUNyZWF0aW9uUm93SW5TZWxlY3Rpb24gPiAtMSkge1xuXHRcdFx0XHR1cGRhdGVkUm93Q291bnQgPSBwb3NMYXN0SW5saW5lQ3JlYXRpb25Sb3dJblNlbGVjdGlvbiA9PT0gY2VsbFNlbGVjdGlvbi5yb3dzLmxlbmd0aCAtIDEgPyByYXdEYXRhLmxlbmd0aCA6IHVwZGF0ZWRSb3dDb3VudDtcblx0XHRcdFx0bnVtYmVyT2ZOZXdDcmVhdGlvblJvd3MgPVxuXHRcdFx0XHRcdHBvc0xhc3RJbmxpbmVDcmVhdGlvblJvd0luU2VsZWN0aW9uID09PSBjZWxsU2VsZWN0aW9uLnJvd3MubGVuZ3RoIC0gMVxuXHRcdFx0XHRcdFx0PyByYXdEYXRhLmxlbmd0aCAtIHBvc0xhc3RJbmxpbmVDcmVhdGlvblJvd0luU2VsZWN0aW9uIC0gMVxuXHRcdFx0XHRcdFx0OiAwO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4geyByb3dzLCBjb2x1bW5zLCB1cGRhdGVkUm93Q291bnQsIG51bWJlck9mTmV3Q3JlYXRpb25Sb3dzIH07XG5cdH0sXG5cblx0LyoqXG5cdCAqICBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhc3RlIG9wZXJhdGlvbiBvbiBHcmlkVGFibGUuXG5cdCAqIEBwYXJhbSByYXdEYXRhXG5cdCAqIEBwYXJhbSBjZWxsU2VsZWN0aW9uXG5cdCAqIEBwYXJhbSBjZWxsU2VsZWN0aW9uLmNvbHVtbnNcblx0ICogQHBhcmFtIGNlbGxTZWxlY3Rpb24ucm93c1xuXHQgKiBAcGFyYW0gcG9zRmlyc3RTZWxlY3RlZFJvd1xuXHQgKiBAcGFyYW0gdGFibGVcblx0ICogQHJldHVybnMgT2JqZXQgY29udGFpbmluZyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFzdGluZyBvcGVyYXRpb25cblx0ICovXG5cdGdldFBhc3RlSW5mb3JtYXRpb25Gb3JHcmlkVGFibGU6IGZ1bmN0aW9uIChcblx0XHRyYXdEYXRhOiBzdHJpbmdbXVtdLFxuXHRcdGNlbGxTZWxlY3Rpb246IHsgY29sdW1uczogQ29sdW1uW107IHJvd3M6IE9EYXRhVjRDb250ZXh0W10gfSxcblx0XHRwb3NGaXJzdFNlbGVjdGVkUm93OiBudW1iZXIsXG5cdFx0dGFibGU6IFRhYmxlXG5cdCk6IFBhc3RlSW5mb3JtYXRpb24ge1xuXHRcdGxldCBudW1iZXJPZk5ld0NyZWF0aW9uUm93cyA9IDA7XG5cdFx0Y29uc3Qgcm93cyA9IGNlbGxTZWxlY3Rpb24ucm93cztcblx0XHRsZXQgdXBkYXRlZFJvd0NvdW50ID0gMDtcblx0XHRjb25zdCB0YWJsZVJvd2NDb3VudCA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKS5nZXRMZW5ndGgoKTtcblx0XHRsZXQgY29sdW1ucyA9XG5cdFx0XHRjZWxsU2VsZWN0aW9uLmNvbHVtbnMubGVuZ3RoID4gMVxuXHRcdFx0XHQ/IGNlbGxTZWxlY3Rpb24uY29sdW1uc1xuXHRcdFx0XHQ6IHRhYmxlLmdldENvbHVtbnMoKS5zbGljZSh0YWJsZS5nZXRDb2x1bW5zKCkuaW5kZXhPZihjZWxsU2VsZWN0aW9uLmNvbHVtbnNbMF0pKTtcblx0XHRpZiAoY2VsbFNlbGVjdGlvbi5jb2x1bW5zLmxlbmd0aCA9PT0gMSAmJiBjZWxsU2VsZWN0aW9uLnJvd3MubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRudW1iZXJPZk5ld0NyZWF0aW9uUm93cyA9XG5cdFx0XHRcdHBvc0ZpcnN0U2VsZWN0ZWRSb3cgKyByYXdEYXRhLmxlbmd0aCA+IHRhYmxlUm93Y0NvdW50ID8gcG9zRmlyc3RTZWxlY3RlZFJvdyArIHJhd0RhdGEubGVuZ3RoIC0gdGFibGVSb3djQ291bnQgOiAwO1xuXHRcdFx0Y29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKS5zbGljZSh0YWJsZS5nZXRDb2x1bW5zKCkuaW5kZXhPZihjZWxsU2VsZWN0aW9uLmNvbHVtbnNbMF0pKTtcblx0XHRcdHVwZGF0ZWRSb3dDb3VudCA9IHJhd0RhdGEubGVuZ3RoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBtdWx0aXBsZSBjZWxscyBhcmUgc2VsZWN0ZWRcblx0XHRcdG51bWJlck9mTmV3Q3JlYXRpb25Sb3dzID1cblx0XHRcdFx0cG9zRmlyc3RTZWxlY3RlZFJvdyArIHJvd3MubGVuZ3RoID49IHRhYmxlUm93Y0NvdW50ID8gcG9zRmlyc3RTZWxlY3RlZFJvdyArIHJhd0RhdGEubGVuZ3RoIC0gdGFibGVSb3djQ291bnQgOiAwO1xuXHRcdFx0dXBkYXRlZFJvd0NvdW50ID0gbnVtYmVyT2ZOZXdDcmVhdGlvblJvd3MgPT09IDAgPyBNYXRoLm1pbihyYXdEYXRhLmxlbmd0aCwgY2VsbFNlbGVjdGlvbi5yb3dzLmxlbmd0aCkgOiByYXdEYXRhLmxlbmd0aDtcblx0XHR9XG5cdFx0cmV0dXJuIHsgcm93cywgY29sdW1ucywgdXBkYXRlZFJvd0NvdW50LCBudW1iZXJPZk5ld0NyZWF0aW9uUm93cyB9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiAgR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXN0ZSBvcGVyYXRpb24uXG5cdCAqIEBwYXJhbSByYXdEYXRhXG5cdCAqIEBwYXJhbSBjZWxsU2VsZWN0aW9uXG5cdCAqIEBwYXJhbSBjZWxsU2VsZWN0aW9uLmNvbHVtbnNcblx0ICogQHBhcmFtIGNlbGxTZWxlY3Rpb24ucm93c1xuXHQgKiBAcGFyYW0gcG9zRmlyc3RTZWxlY3RlZFJvd1xuXHQgKiBAcGFyYW0gdGFibGVcblx0ICogQHJldHVybnMgT2JqZXQgY29udGFpbmluZyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFzdGluZyBvcGVyYXRpb25cblx0ICovXG5cdGdldFBhc3RlSW5mb3JtYXRpb246IGZ1bmN0aW9uIChcblx0XHRyYXdEYXRhOiBzdHJpbmdbXVtdLFxuXHRcdGNlbGxTZWxlY3Rpb246IHsgY29sdW1uczogQ29sdW1uW107IHJvd3M6IE9EYXRhVjRDb250ZXh0W10gfSxcblx0XHRwb3NGaXJzdFNlbGVjdGVkUm93OiBudW1iZXIsXG5cdFx0dGFibGU6IFRhYmxlXG5cdCk6IFBhc3RlSW5mb3JtYXRpb24gfCBudWxsIHtcblx0XHRsZXQgcGFzdGVJbmZvcm1hdGlvbjogUGFzdGVJbmZvcm1hdGlvbiB8IG51bGwgPSBudWxsO1xuXG5cdFx0c3dpdGNoICh0YWJsZS5kYXRhKFwidGFibGVUeXBlXCIpKSB7XG5cdFx0XHRjYXNlIFwiR3JpZFRhYmxlXCI6XG5cdFx0XHRcdHBhc3RlSW5mb3JtYXRpb24gPSB0aGlzLmdldFBhc3RlSW5mb3JtYXRpb25Gb3JHcmlkVGFibGUocmF3RGF0YSwgY2VsbFNlbGVjdGlvbiwgcG9zRmlyc3RTZWxlY3RlZFJvdywgdGFibGUpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJSZXNwb25zaXZlVGFibGVcIjpcblx0XHRcdFx0cGFzdGVJbmZvcm1hdGlvbiA9IHRoaXMuZ2V0UGFzdGVJbmZvcm1hdGlvbkZvclJlcG9uc2l2ZVRhYmxlKHJhd0RhdGEsIGNlbGxTZWxlY3Rpb24sIHBvc0ZpcnN0U2VsZWN0ZWRSb3csIHRhYmxlKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRMb2cud2FybmluZyhgUGFzdGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRhYmxlIHR5cGUgJHt0YWJsZS5kYXRhKFwidGFibGVUeXBlXCIpfWApO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHBhc3RlSW5mb3JtYXRpb24gJiZcblx0XHRcdHBhc3RlSW5mb3JtYXRpb24/Lm51bWJlck9mTmV3Q3JlYXRpb25Sb3dzID4gMCAmJlxuXHRcdFx0KHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJICYgeyBnZXRDcmVhdGlvbk1vZGU6IEZ1bmN0aW9uIH0pLmdldENyZWF0aW9uTW9kZSgpLmdldE5hbWUoKSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93c1xuXHRcdCkge1xuXHRcdFx0cGFzdGVJbmZvcm1hdGlvbi51cGRhdGVkUm93Q291bnQgLT0gcGFzdGVJbmZvcm1hdGlvbi5udW1iZXJPZk5ld0NyZWF0aW9uUm93cztcblx0XHRcdHBhc3RlSW5mb3JtYXRpb24ubnVtYmVyT2ZOZXdDcmVhdGlvblJvd3MgPSAwO1xuXHRcdH1cblxuXHRcdHJldHVybiBwYXN0ZUluZm9ybWF0aW9uO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBQYXN0ZSBkYXRhIGludG8gYSB0YWJsZSB1c2luZyBhIHNlbGVjdGlvbiBvZiBjb2x1bW4gYW5kIHJvd3MuXG5cdCAqIEBwYXJhbSByYXdEYXRhIFRoZSBkYXRhIHRvIGJlIHBhc3RlZCBpbnRvIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gY2VsbFNlbGVjdGlvbiBUaGUgY29sdW1ucyBhbmQgdGhlIHJvd3MgdG8gYmUgdXBkYXRlZFxuXHQgKiBAcGFyYW0gY2VsbFNlbGVjdGlvbi5jb2x1bW5zIFRoZSBjb2x1bW5zIHRvIGJlIHVwZGF0ZWRcblx0ICogQHBhcmFtIGNlbGxTZWxlY3Rpb24ucm93cyBUaGUgcm93cyB0byBiZSB1cGRhdGVkXG5cdCAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGVcblx0ICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhc3RlXG5cdCAqL1xuXHRwYXN0ZVJhbmdlRGF0YTogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdHJhd0RhdGE6IHN0cmluZ1tdW10sXG5cdFx0Y2VsbFNlbGVjdGlvbjogeyBjb2x1bW5zOiBDb2x1bW5bXTsgcm93czogT0RhdGFWNENvbnRleHRbXSB9LFxuXHRcdHRhYmxlOiBUYWJsZVxuXHQpOiBQcm9taXNlPFxuXHRcdHwge1xuXHRcdFx0XHR1cGRhdGVkUm93Q291bnQ6IG51bWJlcjtcblx0XHRcdFx0dXBkYXRlZENvbENvdW50OiBudW1iZXI7XG5cdFx0XHRcdG51bWJlck9mTmV3Q3JlYXRpb25Sb3dzOiBudW1iZXI7XG5cdFx0XHRcdHBvc0ZpcnN0SW5saW5lQ3JlYXRpb25Sb3c6IG51bWJlciB8IHVuZGVmaW5lZDtcblx0XHQgIH1cblx0XHR8IHVuZGVmaW5lZFxuXHQ+IHtcblx0XHRjb25zdCBwb3NGaXJzdFNlbGVjdGVkUm93ID0gY2VsbFNlbGVjdGlvbi5yb3dzWzBdLmdldEluZGV4KCkhO1xuXG5cdFx0Y29uc3QgcGFzdGVJbmZvID0gdGhpcy5nZXRQYXN0ZUluZm9ybWF0aW9uKHJhd0RhdGEsIGNlbGxTZWxlY3Rpb24sIHBvc0ZpcnN0U2VsZWN0ZWRSb3csIHRhYmxlKTtcblx0XHRpZiAoIXBhc3RlSW5mbykgcmV0dXJuO1xuXG5cdFx0Y29uc3QgcGFyc2VkRGF0YSA9IGF3YWl0IHRoaXMucGFyc2VQYXN0ZWREYXRhKHJhd0RhdGEsIHRhYmxlLCBwYXN0ZUluZm8uY29sdW1ucywgZmFsc2UpO1xuXHRcdGlmIChwYXJzZWREYXRhLmxlbmd0aCA+IDApIHtcblx0XHRcdGlmIChwYXN0ZUluZm8ubnVtYmVyT2ZOZXdDcmVhdGlvblJvd3MgPiAwKSB7XG5cdFx0XHRcdGF3YWl0ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuY3JlYXRlRW1wdHlSb3dzKFxuXHRcdFx0XHRcdHRhYmxlLmdldFJvd0JpbmRpbmcoKSxcblx0XHRcdFx0XHR0YWJsZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRwYXN0ZUluZm8ubnVtYmVyT2ZOZXdDcmVhdGlvblJvd3MsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvL2xvYWQgbWlzc2luZyByb3dzIGlmIG5lZWRlZCBpbmNsdWRpbmcgdGhlIG5ld2x5IGNyZWF0ZWQgcm93c1xuXHRcdFx0cGFzdGVJbmZvLnJvd3MgPSBhd2FpdCB0YWJsZS5nZXRSb3dCaW5kaW5nKCkucmVxdWVzdENvbnRleHRzKHBvc0ZpcnN0U2VsZWN0ZWRSb3csIHBhc3RlSW5mby51cGRhdGVkUm93Q291bnQpO1xuXHRcdFx0YXdhaXQgdGhpcy5fdXBkYXRlQ29udGV4dHModGFibGUsIHBhc3RlSW5mby5yb3dzLCBwYXJzZWREYXRhKTtcblxuXHRcdFx0Ly8gZm9jdXNpbmcgb24gdGhlIGZpcnN0IGF2YWlsYWJsZSBjcmVhdGlvbiByb3dcblx0XHRcdGNvbnN0IHBvc0ZpcnN0SW5saW5lQ3JlYXRpb25Sb3cgPSBwYXN0ZUluZm8ucm93cy5maW5kKChjb250ZXh0KSA9PiBjb250ZXh0LmlzVHJhbnNpZW50KCkpPy5nZXRJbmRleCgpO1xuXHRcdFx0aWYgKHBvc0ZpcnN0SW5saW5lQ3JlYXRpb25Sb3cpIHtcblx0XHRcdFx0dGFibGUuZm9jdXNSb3cocG9zRmlyc3RJbmxpbmVDcmVhdGlvblJvdyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR1cGRhdGVkUm93Q291bnQ6IHBhc3RlSW5mby51cGRhdGVkUm93Q291bnQsXG5cdFx0XHRcdHVwZGF0ZWRDb2xDb3VudDogT2JqZWN0LmtleXMocGFyc2VkRGF0YVswXSkubGVuZ3RoLFxuXHRcdFx0XHRudW1iZXJPZk5ld0NyZWF0aW9uUm93czogcGFzdGVJbmZvLm51bWJlck9mTmV3Q3JlYXRpb25Sb3dzIDwgMCA/IDAgOiBwYXN0ZUluZm8ubnVtYmVyT2ZOZXdDcmVhdGlvblJvd3MsXG5cdFx0XHRcdHBvc0ZpcnN0SW5saW5lQ3JlYXRpb25Sb3dcblx0XHRcdH07XG5cdFx0fVxuXHR9LFxuXHRwYXN0ZURhdGE6IGFzeW5jIGZ1bmN0aW9uIChyYXdEYXRhOiBzdHJpbmdbXVtdLCB0YWJsZTogVGFibGUsIGNvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyKTogUHJvbWlzZTxDb250ZXh0W10gfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBlZGl0RmxvdyA9IGNvbnRyb2xsZXIuZWRpdEZsb3c7XG5cdFx0Y29uc3QgdGFibGVEZWZpbml0aW9uID0gKHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJKS5nZXRUYWJsZURlZmluaXRpb24oKTtcblx0XHRsZXQgYURhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcblx0XHRyZXR1cm4gdGhpcy5wYXJzZVBhc3RlZERhdGEocmF3RGF0YSwgdGFibGUpXG5cdFx0XHQudGhlbihhc3luYyAoYVBhcnNlZERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10pID0+IHtcblx0XHRcdFx0YURhdGEgPSBhUGFyc2VkRGF0YSB8fCBbXTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdGFEYXRhLm1hcChhc3luYyAobURhdGEpID0+XG5cdFx0XHRcdFx0XHRlZGl0Rmxvdy52YWxpZGF0ZURvY3VtZW50KHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0ZGF0YTogbURhdGEsXG5cdFx0XHRcdFx0XHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogdGFibGVEZWZpbml0aW9uPy5jb250cm9sPy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKChhVmFsaWRhdGlvbk1lc3NhZ2VzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGFFcnJvck1lc3NhZ2VzOiB7IG1lc3NhZ2VzOiB7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdOyByb3c6IG51bWJlciB9W10gPVxuXHRcdFx0XHRcdGFWYWxpZGF0aW9uTWVzc2FnZXMucmVkdWNlKFxuXHRcdFx0XHRcdFx0ZnVuY3Rpb24gKGFNZXNzYWdlcywgYUN1c3RvbU1lc3NhZ2VzLCBpbmRleCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoYUN1c3RvbU1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRhTWVzc2FnZXMucHVzaCh7IG1lc3NhZ2VzOiBhQ3VzdG9tTWVzc2FnZXMsIHJvdzogaW5kZXggKyAxIH0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhTWVzc2FnZXM7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0W10gYXMgeyBtZXNzYWdlczogeyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXTsgcm93OiBudW1iZXIgfVtdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKGFFcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRjb25zdCBhUm93TWVzc2FnZXMgPSBhRXJyb3JNZXNzYWdlcy5tYXAoKG1FcnJvcikgPT4gdGhpcy5mb3JtYXRDdXN0b21NZXNzYWdlKG1FcnJvci5tZXNzYWdlcywgbUVycm9yLnJvdykpO1xuXHRcdFx0XHRcdHRoaXMuZGlzcGxheUVycm9yTWVzc2FnZXMoYVJvd01lc3NhZ2VzKTtcblx0XHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGFEYXRhO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGFzeW5jIChhVmFsaWRhdGVkRGF0YSk6IFByb21pc2U8Q29udGV4dFtdIHwgdW5kZWZpbmVkPiA9PiB7XG5cdFx0XHRcdC8vIHJlbW92ZSB0aGUgbGFzdCB0cmFuc2llbnQgY29udGV4dCBpZiBpdCBleGlzdHNcblx0XHRcdFx0Y29uc3QgdHJhbnNpZW50Q29udGV4dHMgPSB0YWJsZVxuXHRcdFx0XHRcdC5nZXRSb3dCaW5kaW5nKClcblx0XHRcdFx0XHQuZ2V0Q3VycmVudENvbnRleHRzKClcblx0XHRcdFx0XHQuZmlsdGVyKChjb250ZXh0KSA9PiBjb250ZXh0LmlzVHJhbnNpZW50KCkpO1xuXHRcdFx0XHRjb25zdCBsYXN0VHJhbnNpZW50Q29udGV4dCA9IHRyYW5zaWVudENvbnRleHRzLnBvcCgpO1xuXHRcdFx0XHQvL2NoZWNrIGlmIHRoZSBsYXN0IHRyYW5zaWVudCBjb250ZXh0IGhhcyBhbiBlcnJvciBtZXNzYWdlXG5cdFx0XHRcdGNvbnN0IGxhc3RUcmFuc2llbnRDb250ZXh0SGFzRXJyb3JNZXNzYWdlID0gISFNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0LmZpbmQoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IGxhc3RUcmFuc2llbnRDb250ZXh0ICYmIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpWzBdLmluY2x1ZGVzKGxhc3RUcmFuc2llbnRDb250ZXh0LmdldFBhdGgoKSkpO1xuXHRcdFx0XHRjb25zdCBuZXdDb250ZXh0cyA9XG5cdFx0XHRcdFx0YVZhbGlkYXRlZERhdGEubGVuZ3RoID4gMFxuXHRcdFx0XHRcdFx0PyBhd2FpdCBlZGl0Rmxvdy5jcmVhdGVNdWx0aXBsZURvY3VtZW50cyhcblx0XHRcdFx0XHRcdFx0XHR0YWJsZS5nZXRSb3dCaW5kaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0YVZhbGlkYXRlZERhdGEsXG5cdFx0XHRcdFx0XHRcdFx0dGFibGVEZWZpbml0aW9uPy5jb250cm9sPy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRyb2xsZXIuZWRpdEZsb3cub25CZWZvcmVDcmVhdGVcblx0XHRcdFx0XHRcdCAgKVxuXHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdC8vIGlmIHRoZSBsYXN0IHRyYW5zaWVudCBjb250ZXh0IGhhcyBubyBlcnJvciBtZXNzYWdlLCBkZWxldGUgaXQgYW5kIHJlY3JlYXRlIGEgbmV3IG9uZSBhdCB0aGUgbGFzdCBwb3NpdGlvblxuXHRcdFx0XHRpZiAobGFzdFRyYW5zaWVudENvbnRleHQgJiYgIWxhc3RUcmFuc2llbnRDb250ZXh0SGFzRXJyb3JNZXNzYWdlKSB7XG5cdFx0XHRcdFx0bGFzdFRyYW5zaWVudENvbnRleHQ/LmRlbGV0ZSgpO1xuXHRcdFx0XHRcdGF3YWl0ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuY3JlYXRlRW1wdHlSb3dzKHRhYmxlLmdldFJvd0JpbmRpbmcoKSwgdGFibGUsIGZhbHNlLCAxKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbmV3Q29udGV4dHM7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChvRXJyb3IpID0+IHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcGFzdGluZyBkYXRhXCIsIG9FcnJvcik7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUGFzdGVIZWxwZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztFQWlDQSxNQUFNQSx3QkFBd0IsR0FBRyxTQUFBQSxDQUNoQ0MsWUFBb0IsRUFDcEJDLGNBQXNCLEVBQ3RCQyxXQUFvQixFQUNwQkMsU0FBeUIsRUFHUDtJQUFBLElBRmxCQyxpQ0FBaUMsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsS0FBSztJQUFBLElBQ3pDRyxXQUFXLEdBQUFILFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLEtBQUs7SUFFbkIsTUFBTUksUUFBUSxHQUFHUCxXQUFXLENBQUNRLFdBQVcsQ0FBQ1YsWUFBWSxDQUFDO01BQ3JEVyxhQUFhLEdBQUc7UUFBRUMscUJBQXFCLEVBQUU7TUFBSyxDQUFDO01BQy9DQyxJQUFJLEdBQUdWLFNBQVMsQ0FBQ1csVUFBVSxDQUFDLEdBQUdiLGNBQWMsSUFBSUQsWUFBWSxFQUFFLEVBQUVXLGFBQWEsQ0FBQztJQUNoRixJQUFJSSxTQUFTLEVBQUVDLFFBQVE7SUFDdkIsSUFBSVosaUNB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
422
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRJbmZvRm9yRW50aXR5UHJvcGVydHkiLCJwcm9wZXJ0eVBhdGgiLCJyb3dCaW5kaW5nUGF0aCIsIm1ldGFDb250ZXh0IiwibWV0YU1vZGVsIiwiZW5hYmxlUGFzdGluZ09mQ29tcHV0ZWRQcm9wZXJ0aWVzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiZm9yY2VJZ25vcmUiLCJwcm9wZXJ0eSIsImdldFByb3BlcnR5IiwiZm9ybWF0T3B0aW9ucyIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsInR5cGUiLCJnZXRVSTVUeXBlIiwiaXNJZ25vcmVkIiwiY29tcHV0ZWQiLCJpZ25vcmUiLCJkaXNwbGF5RXJyb3JNZXNzYWdlcyIsImVycm9yTWVzc2FnZXMiLCJtZXNzYWdlRGV0YWlscyIsInJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiZXJyb3JDb3JyZWN0aW9uTWVzc2FnZSIsImdldFRleHQiLCJub3RlTWVzc2FnZSIsInBhc3RlRXJyb3JNZXNzYWdlIiwidW5zaGlmdCIsIk1lc3NhZ2VCb3giLCJlcnJvciIsInRpdGxlIiwiZGV0YWlscyIsImpvaW4iLCJQYXN0ZUhlbHBlciIsImZvcm1hdEN1c3RvbU1lc3NhZ2UiLCJ2YWxpZGF0aW9uTWVzc2FnZXMiLCJpUm93TnVtYmVyIiwiZXJyb3JNZXNzYWdlIiwibnVtYmVyTWVzc2FnZXMiLCJpMThuUm93IiwiZm9yRWFjaCIsIm1lc3NhZ2UiLCJpbmRleE1lc3NhZ2UiLCJtZXNzYWdlVGV4dCIsImdldENvbHVtbkluZm8iLCJ0YWJsZSIsImNvbHVtbnMiLCJpZ25vcmVOYXZpZ2F0aW9uUHJvcGVydHkiLCJtb2RlbCIsImdldFJvd0JpbmRpbmciLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsInJlc29sdmUiLCJnZXRQYXRoIiwiZ2V0Q29udGV4dCIsImdldE1ldGFDb250ZXh0IiwiZW50aXR5VHlwZVByb3BlcnRpZXMiLCJNZXRhTW9kZWxDb252ZXJ0ZXIiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZW50aXR5UHJvcGVydGllcyIsImNvbHVtbkFycmFuZ2VtZW50UHJvcGVydHkiLCJ0YWJsZURlZmluaXRpb24iLCJnZXRQYXJlbnQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJnZXRDb2x1bW5Gcm9tUHJvcGVydHlJbmZvcyIsImRhdGFQcm9wZXJ0eSIsImhhc1ZhbHVlSGVscCIsInRleHQiLCJwdXNoIiwiZXhwb3J0U2V0dGluZ3MiLCJpbmNsdWRlcyIsInBhdGgiLCJjb250cm9sIiwicHJvcGVydHlJbmZvIiwiZ2V0RW5oYW5jZWRGZXRjaGVkUHJvcGVydHlJbmZvcyIsInByb3BlcnR5SW5mb0RpY3QiLCJPYmplY3QiLCJhc3NpZ24iLCJtYXAiLCJuYW1lIiwiY29sdW1uSW5mb3MiLCJnZXRDb2x1bW5zIiwiY29sdW1uIiwiaW5mb1Byb3BlcnR5IiwiZ2V0UHJvcGVydHlLZXkiLCJwcm9wZXJ0eUluZm9zIiwiaGFzVmFsdWVIZWxwUHJvcGVydHkiLCJjb2x1bW5Ub1B1c2giLCJleHBvcnREYXRhUG9pbnRUYXJnZXRWYWx1ZSIsImZpbmQiLCJwIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJWYWx1ZUxpc3QiLCJwYXJzZVBhc3RlZERhdGEiLCJyYXdEYXRhIiwicGFzdGVJbmZvcyIsInBhc3RlZENvbHVtbkNvdW50IiwiZmlyc3RFZGl0YWJsZUNvbHVtbkluZGV4IiwiSSIsImNvbXB1dGVkUHJvcGVydGllcyIsImZpbHRlciIsImluZm8iLCJjb21wdXRlZFByb3BlcnR5IiwiY29sdW1uUG9zaXRpb24iLCJpbmRleE9mIiwiaXNDb2xFbXB0eSIsImV2ZXJ5Iiwicm93IiwicGFyc2VSZXN1bHQiLCJwYXJzZWREYXRhIiwiZXJyb3JzIiwiQ29yZVBhc3RlSGVscGVyIiwicGFyc2UiLCJvRWxlbWVudCIsIl91cGRhdGVDb250ZXh0cyIsImNvbnRleHRzIiwiZGF0YSIsImluZGV4Iiwic2V0UHJvcGVydHlQcm9taXNlcyIsInJvd0NvbnRleHQiLCJnZXRQcm9wZXJ0eUVkaXRNb2RlIiwiRmllbGRFZGl0TW9kZSIsIkVkaXRhYmxlIiwic2V0UHJvcGVydHkiLCJMb2ciLCJ3YXJuaW5nIiwiZ2V0SW5kZXgiLCJQcm9taXNlIiwiYWxsU2V0dGxlZCIsImdldFBhc3RlSW5mb3JtYXRpb25Gb3JSZXBvbnNpdmVUYWJsZSIsImNlbGxTZWxlY3Rpb24iLCJwb3NGaXJzdFNlbGVjdGVkUm93IiwibnVtYmVyT2ZOZXdDcmVhdGlvblJvd3MiLCJwb3NGaXJzdElubGluZUNyZWF0aW9uUm93SW5UYWJsZSIsImdldEN1cnJlbnRDb250ZXh0cyIsImZpbmRJbmRleCIsImNvbnRleHQiLCJpc1RyYW5zaWVudCIsInJvd3MiLCJ1cGRhdGVkUm93Q291bnQiLCJzbGljZSIsImxhc3RJbmxpbmVDcmVhdGlvblJvd0luU2VsZWN0aW9uIiwicG9wIiwicG9zTGFzdElubGluZUNyZWF0aW9uUm93SW5TZWxlY3Rpb24iLCJNYXRoIiwibWluIiwiZ2V0UGFzdGVJbmZvcm1hdGlvbkZvckdyaWRUYWJsZSIsInRhYmxlUm93Y0NvdW50IiwiZ2V0TGVuZ3RoIiwiZ2V0UGFzdGVJbmZvcm1hdGlvbiIsInBhc3RlSW5mb3JtYXRpb24iLCJnZXRDcmVhdGlvbk1vZGUiLCJnZXROYW1lIiwiQ3JlYXRpb25Nb2RlIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwicGFzdGVSYW5nZURhdGEiLCJwYXN0ZUluZm8iLCJjcmVhdGVFbXB0eVJvd3MiLCJyZXF1ZXN0Q29udGV4dHMiLCJwb3NGaXJzdElubGluZUNyZWF0aW9uUm93IiwiZm9jdXNSb3ciLCJ1cGRhdGVkQ29sQ291bnQiLCJrZXlzIiwicGFzdGVEYXRhIiwiY29udHJvbGxlciIsImVkaXRGbG93IiwiYURhdGEiLCJ0aGVuIiwiYVBhcnNlZERhdGEiLCJhbGwiLCJtRGF0YSIsInZhbGlkYXRlRG9jdW1lbnQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsImFWYWxpZGF0aW9uTWVzc2FnZXMiLCJhRXJyb3JNZXNzYWdlcyIsInJlZHVjZSIsImFNZXNzYWdlcyIsImFDdXN0b21NZXNzYWdlcyIsIm1lc3NhZ2VzIiwiYVJvd01lc3NhZ2VzIiwibUVycm9yIiwiYVZhbGlkYXRlZERhdGEiLCJ0cmFuc2llbnRDb250ZXh0cyIsImxhc3RUcmFuc2llbnRDb250ZXh0IiwibGFzdFRyYW5zaWVudENvbnRleHRIYXNFcnJvck1lc3NhZ2UiLCJNZXNzYWdpbmciLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiZ2V0VGFyZ2V0cyIsIm5ld0NvbnRleHRzIiwiY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMiLCJjcmVhdGVBdEVuZCIsIm9uQmVmb3JlQ3JlYXRlIiwiZGVsZXRlIiwiY2F0Y2giLCJvRXJyb3IiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlBhc3RlSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQXJyYXlXaXRoSW5kZXgsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZWRGRVByb3BlcnR5SW5mbyB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1RhYmxlQVBJXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCAqIGFzIENvcmVQYXN0ZUhlbHBlciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9QYXN0ZUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIENvbHVtbiBmcm9tIFwic2FwL3VpL21kYy90YWJsZS9Db2x1bW5cIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YVR5cGUgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS90eXBlL09EYXRhVHlwZVwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgeyBDcmVhdGlvbk1vZGUgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBGaWVsZEVkaXRNb2RlIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvVUlGb3JtYXR0ZXJzXCI7XG5cbmV4cG9ydCB0eXBlIGN1c3RvbVZhbGlkYXRpb25NZXNzYWdlID0ge1xuXHRtZXNzYWdlVGV4dD86IHN0cmluZztcblx0bWVzc2FnZVRhcmdldD86IHN0cmluZztcbn07XG5cbnR5cGUgUGFzdGVJbmZvcm1hdGlvbiA9IHtcblx0cm93czogT0RhdGFWNENvbnRleHRbXTtcblx0Y29sdW1uczogQ29sdW1uW107XG5cdHVwZGF0ZWRSb3dDb3VudDogbnVtYmVyO1xuXHRudW1iZXJPZk5ld0NyZWF0aW9uUm93czogbnVtYmVyO1xufTtcblxuY29uc3QgZ2V0SW5mb0ZvckVudGl0eVByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0cm93QmluZGluZ1BhdGg6IHN0cmluZyxcblx0bWV0YUNvbnRleHQ6IENvbnRleHQsXG5cdG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdGVuYWJsZVBhc3RpbmdPZkNvbXB1dGVkUHJvcGVydGllcyA9IGZhbHNlLFxuXHRmb3JjZUlnbm9yZSA9IGZhbHNlXG4pOiBQYXN0ZUNvbHVtbkluZm8ge1xuXHRjb25zdCBwcm9wZXJ0eSA9IG1ldGFDb250ZXh0LmdldFByb3BlcnR5KHByb3BlcnR5UGF0aCksXG5cdFx0Zm9ybWF0T3B0aW9ucyA9IHsgcGFyc2VLZWVwc0VtcHR5U3RyaW5nOiB0cnVlIH0sXG5cdFx0dHlwZSA9IG1ldGFNb2RlbC5nZXRVSTVUeXBlKGAke3Jvd0JpbmRpbmdQYXRofS8ke3Byb3BlcnR5UGF0aH1gLCBmb3JtYXRPcHRpb25zKTtcblx0bGV0IGlzSWdub3JlZCwgY29tcHV0ZWQ7XG5cdGlmIChlbmFibGVQYXN0aW5nT2ZDb21wdXRlZFByb3BlcnRpZXMgPT09IHRydWUpIHtcblx0XHRpc0lnbm9yZWQgPSAhcHJvcGVydHk7XG5cdFx0Y29tcHV0ZWQgPSBtZXRhQ29udGV4dC5nZXRQcm9wZXJ0eShgJHtwcm9wZXJ0eVBhdGh9QE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkYCk7XG5cdH0gZWxzZSB7XG5cdFx0aXNJZ25vcmVkID0gIXByb3BlcnR5IHx8IG1ldGFDb250ZXh0LmdldFByb3BlcnR5KGAke3Byb3BlcnR5UGF0aH1AT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRgKTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0cHJvcGVydHk6IHByb3BlcnR5UGF0aCxcblx0XHRpZ25vcmU6IGZvcmNlSWdub3JlIHx8IGlzSWdub3JlZCxcblx0XHRjb21wdXRlZDogY29tcHV0ZWQsXG5cdFx0dHlwZTogdHlwZVxuXHR9O1xufTtcblxuY29uc3QgZGlzcGxheUVycm9yTWVzc2FnZXMgPSBmdW5jdGlvbiAoZXJyb3JNZXNzYWdlczogc3RyaW5nW10pOiB2b2lkIHtcblx0Y29uc3QgbWVzc2FnZURldGFpbHMgPSBbLi4uZXJyb3JNZXNzYWdlc107XG5cdGNvbnN0IHJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpISxcblx0XHRlcnJvckNvcnJlY3Rpb25NZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfUEFTVEVfSEVMUEVSX1NBUEZFX1BBU1RFX0VSUk9SX0NPUlJFQ1RJT05fTUVTU0FHRVwiKSxcblx0XHRub3RlTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX1BBU1RFX0hFTFBFUl9TQVBGRV9QQVNURV9FUlJPUl9DT1JSRUNUSU9OX05PVEVcIik7XG5cdGxldCBwYXN0ZUVycm9yTWVzc2FnZTtcblxuXHRpZiAobWVzc2FnZURldGFpbHMubGVuZ3RoID4gMSkge1xuXHRcdHBhc3RlRXJyb3JNZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfUEFTVEVfSEVMUEVSX1NBUEZFX1BBU1RFX0VSUk9SX01FU1NBR0VfUExVUkFMXCIsIFttZXNzYWdlRGV0YWlscy5sZW5ndGhdKTtcblx0fSBlbHNlIHtcblx0XHRwYXN0ZUVycm9yTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX1BBU1RFX0hFTFBFUl9TQVBGRV9QQVNURV9FUlJPUl9NRVNTQUdFX1NJTkdVTEFSXCIpO1xuXHR9XG5cdG1lc3NhZ2VEZXRhaWxzLnVuc2hpZnQoXCJcIik7IC8vIFRvIHNob3cgc3BhY2UgYmV0d2VlbiB0aGUgc2hvcnQgdGV4dCBhbmQgdGhlIGxpc3Qgb2YgZXJyb3JzXG5cdG1lc3NhZ2VEZXRhaWxzLnVuc2hpZnQobm90ZU1lc3NhZ2UpO1xuXHRtZXNzYWdlRGV0YWlscy51bnNoaWZ0KGVycm9yQ29ycmVjdGlvbk1lc3NhZ2UpO1xuXHRNZXNzYWdlQm94LmVycm9yKHBhc3RlRXJyb3JNZXNzYWdlLCB7XG5cdFx0dGl0bGU6IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX0VSUk9SXCIpLFxuXHRcdGRldGFpbHM6IG1lc3NhZ2VEZXRhaWxzLmpvaW4oXCI8YnI+XCIpXG5cdH0pO1xufTtcblxudHlwZSBQYXN0ZUNvbHVtbkluZm8gPSB7XG5cdHByb3BlcnR5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHR5cGU/OiBPRGF0YVR5cGUgfCBudWxsO1xuXHRpZ25vcmU6IGJvb2xlYW47XG5cdGNvbXB1dGVkPzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IFBhc3RlSGVscGVyID0ge1xuXHRkaXNwbGF5RXJyb3JNZXNzYWdlczogZGlzcGxheUVycm9yTWVzc2FnZXMsXG5cdGZvcm1hdEN1c3RvbU1lc3NhZ2U6IGZ1bmN0aW9uICh2YWxpZGF0aW9uTWVzc2FnZXM6IGN1c3RvbVZhbGlkYXRpb25NZXNzYWdlW10sIGlSb3dOdW1iZXI6IG51bWJlcik6IHN0cmluZyB7XG5cdFx0bGV0IGVycm9yTWVzc2FnZSA9IFwiXCI7XG5cdFx0Y29uc3QgbnVtYmVyTWVzc2FnZXMgPSB2YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoO1xuXHRcdGNvbnN0IHJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpISxcblx0XHRcdGkxOG5Sb3cgPSByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0dST1VQX0RFU0NSSVBUSU9OX1RBQkxFX1JPV1wiKTtcblx0XHRpZiAobnVtYmVyTWVzc2FnZXMgPiAwKSB7XG5cdFx0XHRlcnJvck1lc3NhZ2UgKz0gYCR7aTE4blJvd30gJHtpUm93TnVtYmVyfTogYDtcblx0XHRcdHZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKChtZXNzYWdlLCBpbmRleE1lc3NhZ2UpID0+IHtcblx0XHRcdFx0aWYgKG1lc3NhZ2UubWVzc2FnZVRleHQpIHtcblx0XHRcdFx0XHRlcnJvck1lc3NhZ2UgKz0gbWVzc2FnZS5tZXNzYWdlVGV4dCArIChpbmRleE1lc3NhZ2UgKyAxICE9PSBudW1iZXJNZXNzYWdlcyA/IFwiIFwiIDogXCJcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gZXJyb3JNZXNzYWdlO1xuXHR9LFxuXHQvKipcblx0ICogR2V0IGRldGFpbHMgYWJvdXQgdGFibGUgY29sdW1ucy5cblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB3aGljaCBjb250YWlucyB0aGUgY29sdW1ucyB0byBiZSBhbmFseXplZFxuXHQgKiBAcGFyYW0gY29sdW1ucyBBIGxpc3Qgb2YgY29sdW1ucyB0byBiZSBhbmFseXplZC4gSWYgdW5kZWZpbmVkLCBhbGwgY29sdW1ucyBmcm9tIHRoZSB0YWJsZSBhcmUgYW5hbHl6ZWRcblx0ICogQHBhcmFtIGlnbm9yZU5hdmlnYXRpb25Qcm9wZXJ0eSBJZiB0cnVlLCBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIGlnbm9yZWRcblx0ICogQHJldHVybnMgQW4gYXJyYXkgb2Ygb2JqZWN0cyBwcm92aWRpbmcgZGV0YWlscyBhYm91dCBjb2x1bW5zLlxuXHQgKi9cblx0Z2V0Q29sdW1uSW5mbzogZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSwgY29sdW1ucz86IENvbHVtbltdLCBpZ25vcmVOYXZpZ2F0aW9uUHJvcGVydHkgPSB0cnVlKTogUGFzdGVDb2x1bW5JbmZvW10ge1xuXHRcdGNvbnN0IG1vZGVsID0gdGFibGUuZ2V0Um93QmluZGluZygpLmdldE1vZGVsKCksXG5cdFx0XHRtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHJvd0JpbmRpbmdQYXRoID0gbW9kZWwucmVzb2x2ZSh0YWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0UGF0aCgpLCB0YWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0Q29udGV4dCgpKSxcblx0XHRcdG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KHJvd0JpbmRpbmdQYXRoKSxcblx0XHRcdGVudGl0eVR5cGVQcm9wZXJ0aWVzID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkudGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLFxuXHRcdFx0Y29sdW1uQXJyYW5nZW1lbnRQcm9wZXJ0eTogc3RyaW5nW10gPSBbXSxcblx0XHRcdHRhYmxlRGVmaW5pdGlvbiA9ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0VGFibGVEZWZpbml0aW9uKCk7XG5cdFx0ZnVuY3Rpb24gZ2V0Q29sdW1uRnJvbVByb3BlcnR5SW5mb3MoXG5cdFx0XHRkYXRhUHJvcGVydHk6IEVuaGFuY2VkRkVQcm9wZXJ0eUluZm8sXG5cdFx0XHRoYXNWYWx1ZUhlbHA6IGJvb2xlYW4sXG5cdFx0XHRwcm9wZXJ0eTogc3RyaW5nXG5cdFx0KTogUGFzdGVDb2x1bW5JbmZvIHwgdW5kZWZpbmVkIHtcblx0XHRcdC8vIElmIHdlIGhhdmUgYSB0ZXh0QXJyYW5nZW1lbnQsIHdlIHdhbnQgdG8gcmVtb3ZlIGl0IGlmIGl0IGhhcyBhIFZhbHVlTGlzdCBhc3NvY2lhdGVkLlxuXHRcdFx0aWYgKGRhdGFQcm9wZXJ0eS50ZXh0ICYmIGhhc1ZhbHVlSGVscCkge1xuXHRcdFx0XHRjb2x1bW5BcnJhbmdlbWVudFByb3BlcnR5LnB1c2goZGF0YVByb3BlcnR5LnRleHQpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm9uIGV4cG9ydGVkIGNvbHVtbnMgc2hvdWxkIGJlIHBhcnQgb2YgdGhlIGNvbHVtbkluZm9zXG5cdFx0XHRpZiAoZGF0YVByb3BlcnR5LmV4cG9ydFNldHRpbmdzICE9PSBudWxsKSB7XG5cdFx0XHRcdC8vIENoZWNrIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSB3aXRoaW4gdGhlIGN1cnJlbnQgQ29tcGxleCBwcm9wZXJ0eSAtLT4gaWdub3JlXG5cdFx0XHRcdGlmIChpZ25vcmVOYXZpZ2F0aW9uUHJvcGVydHkgJiYgcHJvcGVydHkuaW5jbHVkZXMoXCIvXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdHByb3BlcnR5OiBkYXRhUHJvcGVydHkucGF0aCxcblx0XHRcdFx0XHRcdGlnbm9yZTogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGV0IGZvcmNlSWdub3JlID0gZmFsc2U7XG5cdFx0XHRcdFx0aWYgKGRhdGFQcm9wZXJ0eS5wYXRoKSB7XG5cdFx0XHRcdFx0XHRmb3JjZUlnbm9yZSA9IGNvbHVtbkFycmFuZ2VtZW50UHJvcGVydHkuaW5jbHVkZXMoZGF0YVByb3BlcnR5LnBhdGgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBUaGUgb2JqZWN0IHRoaXMgaXMgd2VpcmQgaW4gYSBmdW5jdGlvbiwgc28gY2hhbmdpbmcgaXQgdG8gUGFzdGVIZWxwZXIgaW5zdGVhZC5cblx0XHRcdFx0XHRyZXR1cm4gUGFzdGVIZWxwZXIuZ2V0SW5mb0ZvckVudGl0eVByb3BlcnR5KFxuXHRcdFx0XHRcdFx0ZGF0YVByb3BlcnR5LnBhdGghLFxuXHRcdFx0XHRcdFx0cm93QmluZGluZ1BhdGgsXG5cdFx0XHRcdFx0XHRtZXRhQ29udGV4dCxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbCxcblx0XHRcdFx0XHRcdHRhYmxlRGVmaW5pdGlvbi5jb250cm9sLmVuYWJsZVBhc3RpbmdPZkNvbXB1dGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdGZvcmNlSWdub3JlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHByb3BlcnR5SW5mbyA9ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0RW5oYW5jZWRGZXRjaGVkUHJvcGVydHlJbmZvcygpO1xuXHRcdGNvbnN0IHByb3BlcnR5SW5mb0RpY3Q6IFJlY29yZDxzdHJpbmcsIEVuaGFuY2VkRkVQcm9wZXJ0eUluZm8+ID0gT2JqZWN0LmFzc2lnbihcblx0XHRcdHt9LFxuXHRcdFx0Li4ucHJvcGVydHlJbmZvLm1hcCgocHJvcGVydHkpID0+ICh7IFtwcm9wZXJ0eS5uYW1lXTogcHJvcGVydHkgfSkpXG5cdFx0KTtcblx0XHRjb25zdCBjb2x1bW5JbmZvczogUGFzdGVDb2x1bW5JbmZvW10gPSBbXTtcblx0XHQoY29sdW1ucyA/PyB0YWJsZS5nZXRDb2x1bW5zKCkpLmZvckVhY2goKGNvbHVtbikgPT4ge1xuXHRcdFx0Y29uc3QgaW5mb1Byb3BlcnR5ID0gcHJvcGVydHlJbmZvRGljdFtjb2x1bW4uZ2V0UHJvcGVydHlLZXkoKV07XG5cdFx0XHQvLyBDaGVjayBpZiBpdCdzIGEgY29tcGxleCBwcm9wZXJ0eSAocHJvcGVydHkgYXNzb2NpYXRlZCB0byBtdWx0aXBsZSBzaW1wbGUgcHJvcGVydGllcylcblx0XHRcdGlmIChpbmZvUHJvcGVydHkucHJvcGVydHlJbmZvcykge1xuXHRcdFx0XHQvLyBHZXQgZGF0YSBmcm9tIHNpbXBsZSBwcm9wZXJ0eVxuXHRcdFx0XHRpbmZvUHJvcGVydHkucHJvcGVydHlJbmZvcy5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgZGF0YVByb3BlcnR5ID0gcHJvcGVydHlJbmZvRGljdFtwcm9wZXJ0eV0sXG5cdFx0XHRcdFx0XHRoYXNWYWx1ZUhlbHAgPSB0aGlzLmhhc1ZhbHVlSGVscFByb3BlcnR5KGVudGl0eVR5cGVQcm9wZXJ0aWVzLCBkYXRhUHJvcGVydHkpLFxuXHRcdFx0XHRcdFx0Y29sdW1uVG9QdXNoID0gZ2V0Q29sdW1uRnJvbVByb3BlcnR5SW5mb3MoZGF0YVByb3BlcnR5LCBoYXNWYWx1ZUhlbHAsIHByb3BlcnR5KTtcblx0XHRcdFx0XHRpZiAoY29sdW1uVG9QdXNoKSB7XG5cdFx0XHRcdFx0XHRjb2x1bW5JbmZvcy5wdXNoKGNvbHVtblRvUHVzaCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKGluZm9Qcm9wZXJ0eS5leHBvcnREYXRhUG9pbnRUYXJnZXRWYWx1ZSkge1xuXHRcdFx0XHRcdGNvbHVtbkluZm9zLnB1c2goe1xuXHRcdFx0XHRcdFx0cHJvcGVydHk6IFwidGFyZ2V0VmFsdWVGcm9tRGF0YVBvaW50XCIsXG5cdFx0XHRcdFx0XHRpZ25vcmU6IHRydWVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBOb24gZXhwb3J0ZWQgY29sdW1ucyBzaG91bGQgYmUgcGFydCBvZiB0aGUgY29sdW1uSW5mb3Ncblx0XHRcdH0gZWxzZSBpZiAoaW5mb1Byb3BlcnR5LmV4cG9ydFNldHRpbmdzICE9PSBudWxsKSB7XG5cdFx0XHRcdGlmIChpbmZvUHJvcGVydHkucGF0aCkge1xuXHRcdFx0XHRcdGNvbHVtbkluZm9zLnB1c2goXG5cdFx0XHRcdFx0XHRQYXN0ZUhlbHBlci5nZXRJbmZvRm9yRW50aXR5UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdGluZm9Qcm9wZXJ0eS5wYXRoLFxuXHRcdFx0XHRcdFx0XHRyb3dCaW5kaW5nUGF0aCxcblx0XHRcdFx0XHRcdFx0bWV0YUNvbnRleHQsXG5cdFx0XHRcdFx0XHRcdG1ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0dGFibGVEZWZpbml0aW9uLmNvbnRyb2wuZW5hYmxlUGFzdGluZ09mQ29tcHV0ZWRQcm9wZXJ0aWVzXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBFbXB0eSBjb2x1bW4gLS0+IGlnbm9yZVxuXHRcdFx0XHRcdGNvbHVtbkluZm9zLnB1c2goe1xuXHRcdFx0XHRcdFx0cHJvcGVydHk6IFwidW51c2VkXCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBudWxsLFxuXHRcdFx0XHRcdFx0aWdub3JlOiB0cnVlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gY29sdW1uSW5mb3M7XG5cdH0sXG5cdGdldEluZm9Gb3JFbnRpdHlQcm9wZXJ0eTogZ2V0SW5mb0ZvckVudGl0eVByb3BlcnR5LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgYSBwcm9wZXJ0eSBoYXMgYSB2YWx1ZSBsaXN0IG9yIG5vdC5cblx0ICogQHBhcmFtIGVudGl0eVR5cGVQcm9wZXJ0aWVzIFRoZSBlbnRpdHkgcHJvcGVydGllc1xuXHQgKiBAcGFyYW0gZGF0YVByb3BlcnR5IFRoZSBwcm9wZXJ0eSB3ZSB3YW50IHRvIGNoZWNrXG5cdCAqIEByZXR1cm5zIEJvb2xlYW4gYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSBoYXMgYSB2YWx1ZSBsaXN0LlxuXHQgKi9cblx0aGFzVmFsdWVIZWxwUHJvcGVydHk6IGZ1bmN0aW9uIChcblx0XHRlbnRpdHlUeXBlUHJvcGVydGllczogQXJyYXlXaXRoSW5kZXg8UHJvcGVydHksIFwibmFtZVwiIHwgXCJmdWxseVF1YWxpZmllZE5hbWVcIj4sXG5cdFx0ZGF0YVByb3BlcnR5OiBFbmhhbmNlZEZFUHJvcGVydHlJbmZvXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gZW50aXR5VHlwZVByb3BlcnRpZXMuZmluZCgocCkgPT4gcC5uYW1lID09PSBkYXRhUHJvcGVydHkucGF0aCk7XG5cdFx0aWYgKHByb3BlcnR5KSB7XG5cdFx0XHRyZXR1cm4gISFwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5WYWx1ZUxpc3Q7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHQvKipcblx0ICogVHJhbnNmb3JtIGFuIGFycmF5IG9mIGRhdGEgYnkgcGFyc2luZyBpdCBpbnRvIGFuIGFycmF5IG9mIG9iamVjdHMsIGZhY2lsaXRhdGluZyB0aGUgbWFwcGluZyBvZiBjb2x1bW5zIGFuZCBkYXRhLlxuXHQgKiBAcGFyYW0gcmF3RGF0YSBUaGUgdGFibGUgd2hpY2ggY29udGFpbnMgdGhlIGNvbHVtbnMgdG8gYmUgYW5hbHl6ZWRcblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB3aGljaCByZWNlaXZlcyB0aGUgZGF0YVxuXHQgKiBAcGFyYW0gY29sdW1ucyBBIGxpc3Qgb2YgY29sdW1ucyB0byBiZSB1c2VkIHRvIG1hcCB0aGUgZGF0YS4gSWYgdW5kZWZpbmVkLCBhbGwgdGFibGUgY29sdW1ucyBhcmUgdXNlZFxuXHQgKiBAcGFyYW0gaWdub3JlTmF2aWdhdGlvblByb3BlcnR5IElmIHRydWUsIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcmUgaWdub3JlZFxuXHQgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0aGF0IGFzc29jaWF0ZXMgZGF0YSB3aXRoIGNvcnJlc3BvbmRpbmcgY29sdW1ucy5cblx0ICovXG5cdHBhcnNlUGFzdGVkRGF0YTogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdHJhd0RhdGE6IHVua25vd25bXVtdLFxuXHRcdHRhYmxlOiBUYWJsZSxcblx0XHRjb2x1bW5zPzogQ29sdW1uW10sXG5cdFx0aWdub3JlTmF2aWdhdGlvblByb3BlcnR5ID0gdHJ1ZVxuXHQpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+IHtcblx0XHRjb25zdCBwYXN0ZUluZm9zID0gYXdhaXQgdGhpcy5nZXRDb2x1bW5JbmZvKHRhYmxlLCBjb2x1bW5zLCBpZ25vcmVOYXZpZ2F0aW9uUHJvcGVydHkpO1xuXHRcdGNvbnN0IHRhYmxlRGVmaW5pdGlvbiA9ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0VGFibGVEZWZpbml0aW9uKCk7XG5cdFx0Ly8gQ2hlY2sgaWYgd2UgaGF2ZSBkYXRhIGZvciBhdCBsZWFzdCB0aGUgZmlyc3QgZWRpdGFibGUgY29sdW1uXG5cdFx0Y29uc3QgcGFzdGVkQ29sdW1uQ291bnQgPSByYXdEYXRhLmxlbmd0aCA/IHJhd0RhdGFbMF0ubGVuZ3RoIDogMDtcblx0XHRsZXQgZmlyc3RFZGl0YWJsZUNvbHVtbkluZGV4ID0gLTE7XG5cdFx0Zm9yIChsZXQgSSA9IDA7IEkgPCBwYXN0ZUluZm9zLmxlbmd0aCAmJiBmaXJzdEVkaXRhYmxlQ29sdW1uSW5kZXggPCAwOyBJKyspIHtcblx0XHRcdGlmICghcGFzdGVJbmZvc1tJXS5pZ25vcmUgJiYgIXBhc3RlSW5mb3NbSV0uY29tcHV0ZWQpIHtcblx0XHRcdFx0Zmlyc3RFZGl0YWJsZUNvbHVtbkluZGV4ID0gSTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGFibGVEZWZpbml0aW9uLmNvbnRyb2wuZW5hYmxlUGFzdGluZ09mQ29tcHV0ZWRQcm9wZXJ0aWVzKSB7XG5cdFx0XHRjb25zdCBjb21wdXRlZFByb3BlcnRpZXMgPSBwYXN0ZUluZm9zLmZpbHRlcihmdW5jdGlvbiAoaW5mbykge1xuXHRcdFx0XHRyZXR1cm4gaW5mby5jb21wdXRlZDtcblx0XHRcdH0pO1xuXHRcdFx0Ly9mb3IgZWFjaCBjb21wdXRlZCBwcm9wZXJ0eSwgY2hlY2sgaWYgdGhlIGNvbHVtbiBpcyBlbXB0eSAuIElmIHllcywgaWdub3JlIGl0XG5cdFx0XHRjb21wdXRlZFByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoY29tcHV0ZWRQcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBjb2x1bW5Qb3NpdGlvbiA9IHBhc3RlSW5mb3MuaW5kZXhPZihjb21wdXRlZFByb3BlcnR5KTtcblx0XHRcdFx0Y29uc3QgaXNDb2xFbXB0eSA9IHJhd0RhdGEuZXZlcnkoKHJvdykgPT4gcm93W2NvbHVtblBvc2l0aW9uXSA9PT0gXCJcIik7XG5cdFx0XHRcdGlmIChpc0NvbEVtcHR5KSB7XG5cdFx0XHRcdFx0Y29tcHV0ZWRQcm9wZXJ0eS5pZ25vcmUgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJzZVJlc3VsdCA9IGF3YWl0IChmaXJzdEVkaXRhYmxlQ29sdW1uSW5kZXggPCAwIHx8IGZpcnN0RWRpdGFibGVDb2x1bW5JbmRleCA+IHBhc3RlZENvbHVtbkNvdW50IC0gMVxuXHRcdFx0PyB7IHBhcnNlZERhdGE6IFtdLCBlcnJvcnM6IG51bGwgfSAvLyBXZSBkb24ndCBoYXZlIGRhdGEgZm9yIGFuIGVkaXRhYmxlIGNvbHVtbiAtLT4gcmV0dXJuIGVtcHR5IHBhcnNlZCBkYXRhXG5cdFx0XHQ6IENvcmVQYXN0ZUhlbHBlci5wYXJzZShyYXdEYXRhLCBwYXN0ZUluZm9zKSk7XG5cdFx0aWYgKHBhcnNlUmVzdWx0LmVycm9ycykge1xuXHRcdFx0Y29uc3QgZXJyb3JNZXNzYWdlcyA9IHBhcnNlUmVzdWx0LmVycm9ycy5tYXAoZnVuY3Rpb24gKG9FbGVtZW50KSB7XG5cdFx0XHRcdHJldHVybiBvRWxlbWVudC5tZXNzYWdlO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmRpc3BsYXlFcnJvck1lc3NhZ2VzKGVycm9yTWVzc2FnZXMpO1xuXHRcdFx0cmV0dXJuIFtdOyAvLyBFcnJvcnMgLS0+IHJldHVybiBub3RoaW5nXG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBwYXJzZVJlc3VsdC5wYXJzZWREYXRhO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIGFuIGFycmF5IG9mIGNvbnRleHRzLlxuXHQgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHdoaWNoIGNvbnRhaW5zIHRoZSBjb250ZXh0cyB0byBiZSB1cGRhdGVkXG5cdCAqIEBwYXJhbSBjb250ZXh0cyBBcnJheSBvZiBjb250ZXh0cyB0byBiZSB1cGRhdGVkXG5cdCAqIEBwYXJhbSBkYXRhIEFycmF5IG9mIG9iamVjdCBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIHVzZWQgdG8gdXBkYXRlIHRoZSBjb250ZXh0c1xuXHQgKiBAcmV0dXJucyBQcm9taXNlXG5cdCAqL1xuXHRfdXBkYXRlQ29udGV4dHM6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHR0YWJsZTogVGFibGUsXG5cdFx0Y29udGV4dHM6IChPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZClbXSxcblx0XHRkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBpbmRleCA9IDA7XG5cdFx0Y29uc3Qgc2V0UHJvcGVydHlQcm9taXNlcyA9IFtdO1xuXHRcdGZvciAoY29uc3Qgcm93IG9mIGRhdGEpIHtcblx0XHRcdGNvbnN0IHJvd0NvbnRleHQgPSBjb250ZXh0c1tpbmRleCsrXTtcblx0XHRcdGlmIChyb3dDb250ZXh0KSB7XG5cdFx0XHRcdGZvciAoY29uc3QgZGF0YVByb3BlcnR5IGluIHJvdykge1xuXHRcdFx0XHRcdGlmICgodGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkpLmdldFByb3BlcnR5RWRpdE1vZGUoZGF0YVByb3BlcnR5LCByb3dDb250ZXh0KSA9PT0gRmllbGRFZGl0TW9kZS5FZGl0YWJsZSkge1xuXHRcdFx0XHRcdFx0c2V0UHJvcGVydHlQcm9taXNlcy5wdXNoKHJvd0NvbnRleHQuc2V0UHJvcGVydHkoZGF0YVByb3BlcnR5LCByb3dbZGF0YVByb3BlcnR5XSkpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRMb2cud2FybmluZyhgUHJvcGVydHkgJHtkYXRhUHJvcGVydHl9IGlzIG5vdCBlZGl0YWJsZSBmb3Igcm93ICR7cm93Q29udGV4dC5nZXRJbmRleCgpfWApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoc2V0UHJvcGVydHlQcm9taXNlcyk7XG5cdH0sXG5cblx0LyoqXG5cdCAqICBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhc3RlIG9wZXJhdGlvbiBvbiBSZXNwb25zaXZlVGFibGUuXG5cdCAqIEBwYXJhbSByYXdEYXRhXG5cdCAqIEBwYXJhbSBjZWxsU2VsZWN0aW9uXG5cdCAqIEBwYXJhbSBjZWxsU2VsZWN0aW9uLmNvbHVtbnNcblx0ICogQHBhcmFtIGNlbGxTZWxlY3Rpb24ucm93c1xuXHQgKiBAcGFyYW0gcG9zRmlyc3RTZWxlY3RlZFJvd1xuXHQgKiBAcGFyYW0gdGFibGVcblx0ICogQHJldHVybnMgT2JqZXQgY29udGFpbmluZyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFzdGluZyBvcGVyYXRpb25cblx0ICovXG5cdGdldFBhc3RlSW5mb3JtYXRpb25Gb3JSZXBvbnNpdmVUYWJsZTogZnVuY3Rpb24gKFxuXHRcdHJhd0RhdGE6IHN0cmluZ1tdW10sXG5cdFx0Y2VsbFNlbGVjdGlvbjogeyBjb2x1bW5zOiBDb2x1bW5bXTsgcm93czogT0RhdGFWNENvbnRleHRbXSB9LFxuXHRcdHBvc0ZpcnN0U2VsZWN0ZWRSb3c6IG51bWJlcixcblx0XHR0YWJsZTogVGFibGVcblx0KTogUGFzdGVJbmZvcm1hdGlvbiB7XG5cdFx0bGV0IG51bWJlck9mTmV3Q3JlYXRpb25Sb3dzID0gMDtcblx0XHRjb25zdCBwb3NGaXJzdElubGluZUNyZWF0aW9uUm93SW5UYWJsZSA9IHRhYmxlXG5cdFx0XHQuZ2V0Um93QmluZGluZygpXG5cdFx0XHQuZ2V0Q3VycmVudENvbnRleHRzKClcblx0XHRcdC5maW5kSW5kZXgoKGNvbnRleHQpID0+IGNvbnRleHQuaXNUcmFuc2llbnQoKSk7XG5cdFx0Y29uc3Qgcm93cyA9IGNlbGxTZWxlY3Rpb24ucm93cztcblx0XHRsZXQgdXBkYXRlZFJvd0NvdW50ID0gMDtcblx0XHRjb25zdCBjb2x1bW5zID1cblx0XHRcdGNlbGxTZWxlY3Rpb24uY29sdW1ucy5sZW5ndGggPiAxXG5cdFx0XHRcdD8gY2VsbFNlbGVjdGlvbi5jb2x1bW5zXG5cdFx0XHRcdDogdGFibGUuZ2V0Q29sdW1ucygpLnNsaWNlKHRhYmxlLmdldENvbHVtbnMoKS5pbmRleE9mKGNlbGxTZWxlY3Rpb24uY29sdW1uc1swXSkpO1xuXG5cdFx0Ly8gb25seSBvbmUgY2VsbCBpcyBzZWxlY3RlZFxuXHRcdGlmIChjZWxsU2VsZWN0aW9uLmNvbHVtbnMubGVuZ3RoID09PSAxICYmIGNlbGxTZWxlY3Rpb24ucm93cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdC8vIGNoZWNrIGlmIHRoZSBpbmxpbmUgY3JlYXRpb24gcm93IGlzIGluIHRoZSB0YXJnZXRlZCByYW5nZVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRwb3NGaXJzdFNlbGVjdGVkUm93IDw9IHBvc0ZpcnN0SW5saW5lQ3JlYXRpb25Sb3dJblRhYmxlICYmXG5cdFx0XHRcdHBvc0ZpcnN0U2VsZWN0ZWRSb3cgKyByYXdEYXRhLmxlbmd0aCA+IHBvc0ZpcnN0SW5saW5lQ3JlYXRpb25Sb3dJblRhYmxlXG5cdFx0XHQpIHtcblx0XHRcdFx0bnVtYmVyT2ZOZXdDcmVhdGlvblJvd3MgPSByYXdEYXRhLmxlbmd0aCAtIChwb3NGaXJzdElubGluZUNyZWF0aW9uUm93SW5UYWJsZSAtIHBvc0ZpcnN0U2VsZWN0ZWRSb3cpIC0gMTtcblx0XHRcdFx0dXBkYXRlZFJvd0NvdW50ID0gcmF3RGF0YS5sZW5ndGg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyB0aGUgaW5saW5lIGNyZWF0aW9uIHJvdyBpcyBub3QgaW4gdGhlIHRhcmdldGVkIHJhbmdlXG5cdFx0XHRcdG51bWJlck9mTmV3Q3JlYXRpb25Sb3dzID0gMDtcblx0XHRcdFx0dXBkYXRlZFJvd0NvdW50ID0gcmF3RGF0YS5sZW5ndGg7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIG11bHRpcGxlIGNlbGxzIGFyZSBzZWxlY3RlZFxuXHRcdFx0Y29uc3QgbGFzdElubGluZUNyZWF0aW9uUm93SW5TZWxlY3Rpb24gPSByb3dzLmZpbHRlcigoY29udGV4dCkgPT4gY29udGV4dC5pc1RyYW5zaWVudCgpKT8ucG9wKCk7XG5cdFx0XHRjb25zdCBwb3NMYXN0SW5saW5lQ3JlYXRpb25Sb3dJblNlbGVjdGlvbiA9IGxhc3RJbmxpbmVDcmVhdGlvblJvd0luU2VsZWN0aW9uXG5cdFx0XHRcdD8gcm93cy5pbmRleE9mKGxhc3RJbmxpbmVDcmVhdGlvblJvd0luU2VsZWN0aW9uKVxuXHRcdFx0XHQ6IC0xO1xuXHRcdFx0dXBkYXRlZFJvd0NvdW50ID0gTWF0aC5taW4ocmF3RGF0YS5sZW5ndGgsIGNlbGxTZWxlY3Rpb24ucm93cy5sZW5ndGgpO1xuXHRcdFx0Ly8gY2hlY2sgaWYgdGhlIGlubGluZSBjcmVhdGlvbiByb3cgaXMgaW4gdGhlIHNlbGVjdGVkIHJhbmdlXG5cdFx0XHRpZiAocG9zTGFzdElubGluZUNyZWF0aW9uUm93SW5TZWxlY3Rpb24gPiAtMSkge1xuXHRcdFx0XHR1cGRhdGVkUm93Q291bnQgPSBwb3NMYXN0SW5saW5lQ3JlYXRpb25Sb3dJblNlbGVjdGlvbiA9PT0gY2VsbFNlbGVjdGlvbi5yb3dzLmxlbmd0aCAtIDEgPyByYXdEYXRhLmxlbmd0aCA6IHVwZGF0ZWRSb3dDb3VudDtcblx0XHRcdFx0bnVtYmVyT2ZOZXdDcmVhdGlvblJvd3MgPVxuXHRcdFx0XHRcdHBvc0xhc3RJbmxpbmVDcmVhdGlvblJvd0luU2VsZWN0aW9uID09PSBjZWxsU2VsZWN0aW9uLnJvd3MubGVuZ3RoIC0gMVxuXHRcdFx0XHRcdFx0PyByYXdEYXRhLmxlbmd0aCAtIHBvc0xhc3RJbmxpbmVDcmVhdGlvblJvd0luU2VsZWN0aW9uIC0gMVxuXHRcdFx0XHRcdFx0OiAwO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4geyByb3dzLCBjb2x1bW5zLCB1cGRhdGVkUm93Q291bnQsIG51bWJlck9mTmV3Q3JlYXRpb25Sb3dzIH07XG5cdH0sXG5cblx0LyoqXG5cdCAqICBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhc3RlIG9wZXJhdGlvbiBvbiBHcmlkVGFibGUuXG5cdCAqIEBwYXJhbSByYXdEYXRhXG5cdCAqIEBwYXJhbSBjZWxsU2VsZWN0aW9uXG5cdCAqIEBwYXJhbSBjZWxsU2VsZWN0aW9uLmNvbHVtbnNcblx0ICogQHBhcmFtIGNlbGxTZWxlY3Rpb24ucm93c1xuXHQgKiBAcGFyYW0gcG9zRmlyc3RTZWxlY3RlZFJvd1xuXHQgKiBAcGFyYW0gdGFibGVcblx0ICogQHJldHVybnMgT2JqZXQgY29udGFpbmluZyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFzdGluZyBvcGVyYXRpb25cblx0ICovXG5cdGdldFBhc3RlSW5mb3JtYXRpb25Gb3JHcmlkVGFibGU6IGZ1bmN0aW9uIChcblx0XHRyYXdEYXRhOiBzdHJpbmdbXVtdLFxuXHRcdGNlbGxTZWxlY3Rpb246IHsgY29sdW1uczogQ29sdW1uW107IHJvd3M6IE9EYXRhVjRDb250ZXh0W10gfSxcblx0XHRwb3NGaXJzdFNlbGVjdGVkUm93OiBudW1iZXIsXG5cdFx0dGFibGU6IFRhYmxlXG5cdCk6IFBhc3RlSW5mb3JtYXRpb24ge1xuXHRcdGxldCBudW1iZXJPZk5ld0NyZWF0aW9uUm93cyA9IDA7XG5cdFx0Y29uc3Qgcm93cyA9IGNlbGxTZWxlY3Rpb24ucm93cztcblx0XHRsZXQgdXBkYXRlZFJvd0NvdW50ID0gMDtcblx0XHRjb25zdCB0YWJsZVJvd2NDb3VudCA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKS5nZXRMZW5ndGgoKTtcblx0XHRsZXQgY29sdW1ucyA9XG5cdFx0XHRjZWxsU2VsZWN0aW9uLmNvbHVtbnMubGVuZ3RoID4gMVxuXHRcdFx0XHQ/IGNlbGxTZWxlY3Rpb24uY29sdW1uc1xuXHRcdFx0XHQ6IHRhYmxlLmdldENvbHVtbnMoKS5zbGljZSh0YWJsZS5nZXRDb2x1bW5zKCkuaW5kZXhPZihjZWxsU2VsZWN0aW9uLmNvbHVtbnNbMF0pKTtcblx0XHRpZiAoY2VsbFNlbGVjdGlvbi5jb2x1bW5zLmxlbmd0aCA9PT0gMSAmJiBjZWxsU2VsZWN0aW9uLnJvd3MubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRudW1iZXJPZk5ld0NyZWF0aW9uUm93cyA9XG5cdFx0XHRcdHBvc0ZpcnN0U2VsZWN0ZWRSb3cgKyByYXdEYXRhLmxlbmd0aCA+IHRhYmxlUm93Y0NvdW50ID8gcG9zRmlyc3RTZWxlY3RlZFJvdyArIHJhd0RhdGEubGVuZ3RoIC0gdGFibGVSb3djQ291bnQgOiAwO1xuXHRcdFx0Y29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKS5zbGljZSh0YWJsZS5nZXRDb2x1bW5zKCkuaW5kZXhPZihjZWxsU2VsZWN0aW9uLmNvbHVtbnNbMF0pKTtcblx0XHRcdHVwZGF0ZWRSb3dDb3VudCA9IHJhd0RhdGEubGVuZ3RoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBtdWx0aXBsZSBjZWxscyBhcmUgc2VsZWN0ZWRcblx0XHRcdG51bWJlck9mTmV3Q3JlYXRpb25Sb3dzID1cblx0XHRcdFx0cG9zRmlyc3RTZWxlY3RlZFJvdyArIHJvd3MubGVuZ3RoID49IHRhYmxlUm93Y0NvdW50ID8gcG9zRmlyc3RTZWxlY3RlZFJvdyArIHJhd0RhdGEubGVuZ3RoIC0gdGFibGVSb3djQ291bnQgOiAwO1xuXHRcdFx0dXBkYXRlZFJvd0NvdW50ID0gbnVtYmVyT2ZOZXdDcmVhdGlvblJvd3MgPT09IDAgPyBNYXRoLm1pbihyYXdEYXRhLmxlbmd0aCwgY2VsbFNlbGVjdGlvbi5yb3dzLmxlbmd0aCkgOiByYXdEYXRhLmxlbmd0aDtcblx0XHR9XG5cdFx0cmV0dXJuIHsgcm93cywgY29sdW1ucywgdXBkYXRlZFJvd0NvdW50LCBudW1iZXJPZk5ld0NyZWF0aW9uUm93cyB9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiAgR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXN0ZSBvcGVyYXRpb24uXG5cdCAqIEBwYXJhbSByYXdEYXRhXG5cdCAqIEBwYXJhbSBjZWxsU2VsZWN0aW9uXG5cdCAqIEBwYXJhbSBjZWxsU2VsZWN0aW9uLmNvbHVtbnNcblx0ICogQHBhcmFtIGNlbGxTZWxlY3Rpb24ucm93c1xuXHQgKiBAcGFyYW0gcG9zRmlyc3RTZWxlY3RlZFJvd1xuXHQgKiBAcGFyYW0gdGFibGVcblx0ICogQHJldHVybnMgT2JqZXQgY29udGFpbmluZyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFzdGluZyBvcGVyYXRpb25cblx0ICovXG5cdGdldFBhc3RlSW5mb3JtYXRpb246IGZ1bmN0aW9uIChcblx0XHRyYXdEYXRhOiBzdHJpbmdbXVtdLFxuXHRcdGNlbGxTZWxlY3Rpb246IHsgY29sdW1uczogQ29sdW1uW107IHJvd3M6IE9EYXRhVjRDb250ZXh0W10gfSxcblx0XHRwb3NGaXJzdFNlbGVjdGVkUm93OiBudW1iZXIsXG5cdFx0dGFibGU6IFRhYmxlXG5cdCk6IFBhc3RlSW5mb3JtYXRpb24gfCBudWxsIHtcblx0XHRsZXQgcGFzdGVJbmZvcm1hdGlvbjogUGFzdGVJbmZvcm1hdGlvbiB8IG51bGwgPSBudWxsO1xuXG5cdFx0c3dpdGNoICh0YWJsZS5kYXRhKFwidGFibGVUeXBlXCIpKSB7XG5cdFx0XHRjYXNlIFwiR3JpZFRhYmxlXCI6XG5cdFx0XHRcdHBhc3RlSW5mb3JtYXRpb24gPSB0aGlzLmdldFBhc3RlSW5mb3JtYXRpb25Gb3JHcmlkVGFibGUocmF3RGF0YSwgY2VsbFNlbGVjdGlvbiwgcG9zRmlyc3RTZWxlY3RlZFJvdywgdGFibGUpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJSZXNwb25zaXZlVGFibGVcIjpcblx0XHRcdFx0cGFzdGVJbmZvcm1hdGlvbiA9IHRoaXMuZ2V0UGFzdGVJbmZvcm1hdGlvbkZvclJlcG9uc2l2ZVRhYmxlKHJhd0RhdGEsIGNlbGxTZWxlY3Rpb24sIHBvc0ZpcnN0U2VsZWN0ZWRSb3csIHRhYmxlKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRMb2cud2FybmluZyhgUGFzdGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRhYmxlIHR5cGUgJHt0YWJsZS5kYXRhKFwidGFibGVUeXBlXCIpfWApO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHBhc3RlSW5mb3JtYXRpb24gJiZcblx0XHRcdHBhc3RlSW5mb3JtYXRpb24/Lm51bWJlck9mTmV3Q3JlYXRpb25Sb3dzID4gMCAmJlxuXHRcdFx0KHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJICYgeyBnZXRDcmVhdGlvbk1vZGU6IEZ1bmN0aW9uIH0pLmdldENyZWF0aW9uTW9kZSgpLmdldE5hbWUoKSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93c1xuXHRcdCkge1xuXHRcdFx0cGFzdGVJbmZvcm1hdGlvbi51cGRhdGVkUm93Q291bnQgLT0gcGFzdGVJbmZvcm1hdGlvbi5udW1iZXJPZk5ld0NyZWF0aW9uUm93cztcblx0XHRcdHBhc3RlSW5mb3JtYXRpb24ubnVtYmVyT2ZOZXdDcmVhdGlvblJvd3MgPSAwO1xuXHRcdH1cblxuXHRcdHJldHVybiBwYXN0ZUluZm9ybWF0aW9uO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBQYXN0ZSBkYXRhIGludG8gYSB0YWJsZSB1c2luZyBhIHNlbGVjdGlvbiBvZiBjb2x1bW4gYW5kIHJvd3MuXG5cdCAqIEBwYXJhbSByYXdEYXRhIFRoZSBkYXRhIHRvIGJlIHBhc3RlZCBpbnRvIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gY2VsbFNlbGVjdGlvbiBUaGUgY29sdW1ucyBhbmQgdGhlIHJvd3MgdG8gYmUgdXBkYXRlZFxuXHQgKiBAcGFyYW0gY2VsbFNlbGVjdGlvbi5jb2x1bW5zIFRoZSBjb2x1bW5zIHRvIGJlIHVwZGF0ZWRcblx0ICogQHBhcmFtIGNlbGxTZWxlY3Rpb24ucm93cyBUaGUgcm93cyB0byBiZSB1cGRhdGVkXG5cdCAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGVcblx0ICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhc3RlXG5cdCAqL1xuXHRwYXN0ZVJhbmdlRGF0YTogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdHJhd0RhdGE6IHN0cmluZ1tdW10sXG5cdFx0Y2VsbFNlbGVjdGlvbjogeyBjb2x1bW5zOiBDb2x1bW5bXTsgcm93czogT0RhdGFWNENvbnRleHRbXSB9LFxuXHRcdHRhYmxlOiBUYWJsZVxuXHQpOiBQcm9taXNlPFxuXHRcdHwge1xuXHRcdFx0XHR1cGRhdGVkUm93Q291bnQ6IG51bWJlcjtcblx0XHRcdFx0dXBkYXRlZENvbENvdW50OiBudW1iZXI7XG5cdFx0XHRcdG51bWJlck9mTmV3Q3JlYXRpb25Sb3dzOiBudW1iZXI7XG5cdFx0XHRcdHBvc0ZpcnN0SW5saW5lQ3JlYXRpb25Sb3c6IG51bWJlciB8IHVuZGVmaW5lZDtcblx0XHQgIH1cblx0XHR8IHVuZGVmaW5lZFxuXHQ+IHtcblx0XHRjb25zdCBwb3NGaXJzdFNlbGVjdGVkUm93ID0gY2VsbFNlbGVjdGlvbi5yb3dzWzBdLmdldEluZGV4KCkhO1xuXG5cdFx0Y29uc3QgcGFzdGVJbmZvID0gdGhpcy5nZXRQYXN0ZUluZm9ybWF0aW9uKHJhd0RhdGEsIGNlbGxTZWxlY3Rpb24sIHBvc0ZpcnN0U2VsZWN0ZWRSb3csIHRhYmxlKTtcblx0XHRpZiAoIXBhc3RlSW5mbykgcmV0dXJuO1xuXG5cdFx0Y29uc3QgcGFyc2VkRGF0YSA9IGF3YWl0IHRoaXMucGFyc2VQYXN0ZWREYXRhKHJhd0RhdGEsIHRhYmxlLCBwYXN0ZUluZm8uY29sdW1ucywgZmFsc2UpO1xuXHRcdGlmIChwYXJzZWREYXRhLmxlbmd0aCA+IDApIHtcblx0XHRcdGlmIChwYXN0ZUluZm8ubnVtYmVyT2ZOZXdDcmVhdGlvblJvd3MgPiAwKSB7XG5cdFx0XHRcdGF3YWl0ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuY3JlYXRlRW1wdHlSb3dzKFxuXHRcdFx0XHRcdHRhYmxlLmdldFJvd0JpbmRpbmcoKSxcblx0XHRcdFx0XHR0YWJsZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRwYXN0ZUluZm8ubnVtYmVyT2ZOZXdDcmVhdGlvblJvd3MsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvL2xvYWQgbWlzc2luZyByb3dzIGlmIG5lZWRlZCBpbmNsdWRpbmcgdGhlIG5ld2x5IGNyZWF0ZWQgcm93c1xuXHRcdFx0cGFzdGVJbmZvLnJvd3MgPSBhd2FpdCB0YWJsZS5nZXRSb3dCaW5kaW5nKCkucmVxdWVzdENvbnRleHRzKHBvc0ZpcnN0U2VsZWN0ZWRSb3csIHBhc3RlSW5mby51cGRhdGVkUm93Q291bnQpO1xuXHRcdFx0YXdhaXQgdGhpcy5fdXBkYXRlQ29udGV4dHModGFibGUsIHBhc3RlSW5mby5yb3dzLCBwYXJzZWREYXRhKTtcblxuXHRcdFx0Ly8gZm9jdXNpbmcgb24gdGhlIGZpcnN0IGF2YWlsYWJsZSBjcmVhdGlvbiByb3dcblx0XHRcdGNvbnN0IHBvc0ZpcnN0SW5saW5lQ3JlYXRpb25Sb3cgPSBwYXN0ZUluZm8ucm93cy5maW5kKChjb250ZXh0KSA9PiBjb250ZXh0LmlzVHJhbnNpZW50KCkpPy5nZXRJbmRleCgpO1xuXHRcdFx0aWYgKHBvc0ZpcnN0SW5saW5lQ3JlYXRpb25Sb3cpIHtcblx0XHRcdFx0dGFibGUuZm9jdXNSb3cocG9zRmlyc3RJbmxpbmVDcmVhdGlvblJvdyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR1cGRhdGVkUm93Q291bnQ6IHBhc3RlSW5mby51cGRhdGVkUm93Q291bnQsXG5cdFx0XHRcdHVwZGF0ZWRDb2xDb3VudDogT2JqZWN0LmtleXMocGFyc2VkRGF0YVswXSkubGVuZ3RoLFxuXHRcdFx0XHRudW1iZXJPZk5ld0NyZWF0aW9uUm93czogcGFzdGVJbmZvLm51bWJlck9mTmV3Q3JlYXRpb25Sb3dzIDwgMCA/IDAgOiBwYXN0ZUluZm8ubnVtYmVyT2ZOZXdDcmVhdGlvblJvd3MsXG5cdFx0XHRcdHBvc0ZpcnN0SW5saW5lQ3JlYXRpb25Sb3dcblx0XHRcdH07XG5cdFx0fVxuXHR9LFxuXHRwYXN0ZURhdGE6IGFzeW5jIGZ1bmN0aW9uIChyYXdEYXRhOiBzdHJpbmdbXVtdLCB0YWJsZTogVGFibGUsIGNvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyKTogUHJvbWlzZTxDb250ZXh0W10gfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBlZGl0RmxvdyA9IGNvbnRyb2xsZXIuZWRpdEZsb3c7XG5cdFx0Y29uc3QgdGFibGVEZWZpbml0aW9uID0gKHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJKS5nZXRUYWJsZURlZmluaXRpb24oKTtcblx0XHRsZXQgYURhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcblx0XHRyZXR1cm4gdGhpcy5wYXJzZVBhc3RlZERhdGEocmF3RGF0YSwgdGFibGUpXG5cdFx0XHQudGhlbihhc3luYyAoYVBhcnNlZERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10pID0+IHtcblx0XHRcdFx0YURhdGEgPSBhUGFyc2VkRGF0YSB8fCBbXTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdGFEYXRhLm1hcChhc3luYyAobURhdGEpID0+XG5cdFx0XHRcdFx0XHRlZGl0Rmxvdy52YWxpZGF0ZURvY3VtZW50KHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0ZGF0YTogbURhdGEsXG5cdFx0XHRcdFx0XHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogdGFibGVEZWZpbml0aW9uPy5jb250cm9sPy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKChhVmFsaWRhdGlvbk1lc3NhZ2VzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGFFcnJvck1lc3NhZ2VzOiB7IG1lc3NhZ2VzOiB7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdOyByb3c6IG51bWJlciB9W10gPVxuXHRcdFx0XHRcdGFWYWxpZGF0aW9uTWVzc2FnZXMucmVkdWNlKFxuXHRcdFx0XHRcdFx0ZnVuY3Rpb24gKGFNZXNzYWdlcywgYUN1c3RvbU1lc3NhZ2VzLCBpbmRleCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoYUN1c3RvbU1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRhTWVzc2FnZXMucHVzaCh7IG1lc3NhZ2VzOiBhQ3VzdG9tTWVzc2FnZXMsIHJvdzogaW5kZXggKyAxIH0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhTWVzc2FnZXM7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0W10gYXMgeyBtZXNzYWdlczogeyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXTsgcm93OiBudW1iZXIgfVtdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKGFFcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRjb25zdCBhUm93TWVzc2FnZXMgPSBhRXJyb3JNZXNzYWdlcy5tYXAoKG1FcnJvcikgPT4gdGhpcy5mb3JtYXRDdXN0b21NZXNzYWdlKG1FcnJvci5tZXNzYWdlcywgbUVycm9yLnJvdykpO1xuXHRcdFx0XHRcdHRoaXMuZGlzcGxheUVycm9yTWVzc2FnZXMoYVJvd01lc3NhZ2VzKTtcblx0XHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGFEYXRhO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGFzeW5jIChhVmFsaWRhdGVkRGF0YSk6IFByb21pc2U8Q29udGV4dFtdIHwgdW5kZWZpbmVkPiA9PiB7XG5cdFx0XHRcdC8vIHJlbW92ZSB0aGUgbGFzdCB0cmFuc2llbnQgY29udGV4dCBpZiBpdCBleGlzdHNcblx0XHRcdFx0Y29uc3QgdHJhbnNpZW50Q29udGV4dHMgPSB0YWJsZVxuXHRcdFx0XHRcdC5nZXRSb3dCaW5kaW5nKClcblx0XHRcdFx0XHQuZ2V0Q3VycmVudENvbnRleHRzKClcblx0XHRcdFx0XHQuZmlsdGVyKChjb250ZXh0KSA9PiBjb250ZXh0LmlzVHJhbnNpZW50KCkpO1xuXHRcdFx0XHRjb25zdCBsYXN0VHJhbnNpZW50Q29udGV4dCA9IHRyYW5zaWVudENvbnRleHRzLnBvcCgpO1xuXHRcdFx0XHQvL2NoZWNrIGlmIHRoZSBsYXN0IHRyYW5zaWVudCBjb250ZXh0IGhhcyBhbiBlcnJvciBtZXNzYWdlXG5cdFx0XHRcdGNvbnN0IGxhc3RUcmFuc2llbnRDb250ZXh0SGFzRXJyb3JNZXNzYWdlID0gISFNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0LmZpbmQoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IGxhc3RUcmFuc2llbnRDb250ZXh0ICYmIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpWzBdLmluY2x1ZGVzKGxhc3RUcmFuc2llbnRDb250ZXh0LmdldFBhdGgoKSkpO1xuXHRcdFx0XHRjb25zdCBuZXdDb250ZXh0cyA9XG5cdFx0XHRcdFx0YVZhbGlkYXRlZERhdGEubGVuZ3RoID4gMFxuXHRcdFx0XHRcdFx0PyBhd2FpdCBlZGl0Rmxvdy5jcmVhdGVNdWx0aXBsZURvY3VtZW50cyhcblx0XHRcdFx0XHRcdFx0XHR0YWJsZS5nZXRSb3dCaW5kaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0YVZhbGlkYXRlZERhdGEsXG5cdFx0XHRcdFx0XHRcdFx0dGFibGVEZWZpbml0aW9uPy5jb250cm9sPy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRyb2xsZXIuZWRpdEZsb3cub25CZWZvcmVDcmVhdGVcblx0XHRcdFx0XHRcdCAgKVxuXHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdC8vIGlmIHRoZSBsYXN0IHRyYW5zaWVudCBjb250ZXh0IGhhcyBubyBlcnJvciBtZXNzYWdlLCBkZWxldGUgaXQgYW5kIHJlY3JlYXRlIGEgbmV3IG9uZSBhdCB0aGUgbGFzdCBwb3NpdGlvblxuXHRcdFx0XHRpZiAobGFzdFRyYW5zaWVudENvbnRleHQgJiYgIWxhc3RUcmFuc2llbnRDb250ZXh0SGFzRXJyb3JNZXNzYWdlKSB7XG5cdFx0XHRcdFx0bGFzdFRyYW5zaWVudENvbnRleHQ/LmRlbGV0ZSgpO1xuXHRcdFx0XHRcdGF3YWl0ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuY3JlYXRlRW1wdHlSb3dzKHRhYmxlLmdldFJvd0JpbmRpbmcoKSwgdGFibGUsIGZhbHNlLCAxKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbmV3Q29udGV4dHM7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChvRXJyb3IpID0+IHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcGFzdGluZyBkYXRhXCIsIG9FcnJvcik7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUGFzdGVIZWxwZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztFQWdDQSxNQUFNQSx3QkFBd0IsR0FBRyxTQUFBQSxDQUNoQ0MsWUFBb0IsRUFDcEJDLGNBQXNCLEVBQ3RCQyxXQUFvQixFQUNwQkMsU0FBeUIsRUFHUDtJQUFBLElBRmxCQyxpQ0FBaUMsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsS0FBSztJQUFBLElBQ3pDRyxXQUFXLEdBQUFILFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLEtBQUs7SUFFbkIsTUFBTUksUUFBUSxHQUFHUCxXQUFXLENBQUNRLFdBQVcsQ0FBQ1YsWUFBWSxDQUFDO01BQ3JEVyxhQUFhLEdBQUc7UUFBRUMscUJBQXFCLEVBQUU7TUFBSyxDQUFDO01BQy9DQyxJQUFJLEdBQUdWLFNBQVMsQ0FBQ1csVUFBVSxDQUFDLEdBQUdiLGNBQWMsSUFBSUQsWUFBWSxFQUFFLEVBQUVXLGFBQWEsQ0FBQztJQUNoRixJQUFJSSxTQUFTLEVBQUVDLFFBQVE7SUFDdkIsSUFBSVosaUNBQWlDLEtBQUssSUFBSSxFQUFFO01BQy9DVyxTQUFTLEdBQUcsQ0FBQ04sUUFBUTtNQUNyQk8sUUFBUSxHQUFHZCxXQUFXLENBQUNRLFdBQVcsQ0FBQyxHQUFHVixZQUFZLDZCQUE2QixDQUFDO0lBQ2pGLENBQUMsTUFBTTtNQUNOZSxTQUFTLEdBQUcsQ0FBQ04sUUFBUSxJQUFJUCxXQUFXLENBQUNRLFdBQVcsQ0FBQyxHQUFHVixZQUFZLDZCQUE2QixDQUFDO0lBQy9GO0lBRUEsT0FBTztNQUNO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
@@ -3,14 +3,13 @@ import Log from "sap/base/Log";
3
3
  import type PageController from "sap/fe/core/PageController";
4
4
  import * as MetaModelConverter from "sap/fe/core/converters/MetaModelConverter";
5
5
  import type TableAPI from "sap/fe/macros/table/TableAPI";
6
+ import type { EnhancedFEPropertyInfo } from "sap/fe/macros/table/TableAPI";
6
7
  import MessageBox from "sap/m/MessageBox";
7
8
  import Library from "sap/ui/core/Lib";
8
9
  import Messaging from "sap/ui/core/Messaging";
9
10
  import type Message from "sap/ui/core/message/Message";
10
11
  import * as CorePasteHelper from "sap/ui/core/util/PasteHelper";
11
12
  import type Table from "sap/ui/mdc/Table";
12
- import type { PropertyInfo } from "sap/ui/mdc/Table";
13
- import type TableDelegate from "sap/ui/mdc/TableDelegate";
14
13
  import type Column from "sap/ui/mdc/table/Column";
15
14
  import type Context from "sap/ui/model/Context";
16
15
  import type ODataType from "sap/ui/model/odata/type/ODataType";
@@ -110,7 +109,7 @@ const PasteHelper = {
110
109
  * @param ignoreNavigationProperty If true, navigation properties are ignored
111
110
  * @returns An array of objects providing details about columns.
112
111
  */
113
- getColumnInfo: async function (table: Table, columns?: Column[], ignoreNavigationProperty = true): Promise<PasteColumnInfo[]> {
112
+ getColumnInfo: function (table: Table, columns?: Column[], ignoreNavigationProperty = true): PasteColumnInfo[] {
114
113
  const model = table.getRowBinding().getModel(),
115
114
  metaModel = model.getMetaModel(),
116
115
  rowBindingPath = model.resolve(table.getRowBinding().getPath(), table.getRowBinding().getContext()),
@@ -119,7 +118,7 @@ const PasteHelper = {
119
118
  columnArrangementProperty: string[] = [],
120
119
  tableDefinition = (table.getParent() as TableAPI).getTableDefinition();
121
120
  function getColumnFromPropertyInfos(
122
- dataProperty: PropertyInfo,
121
+ dataProperty: EnhancedFEPropertyInfo,
123
122
  hasValueHelp: boolean,
124
123
  property: string
125
124
  ): PasteColumnInfo | undefined {
@@ -153,55 +152,54 @@ const PasteHelper = {
153
152
  }
154
153
  }
155
154
 
156
- return (table.getControlDelegate() as TableDelegate).fetchProperties(table).then((propertyInfo: PropertyInfo[]) => {
157
- const propertyInfoDict: Record<string, PropertyInfo> = Object.assign(
158
- {},
159
- ...propertyInfo.map((property: PropertyInfo) => ({ [property.name]: property }))
160
- );
161
- const columnInfos: PasteColumnInfo[] = [];
162
- (columns ?? table.getColumns()).forEach((column) => {
163
- const infoProperty = propertyInfoDict[column.getPropertyKey()];
164
- // Check if it's a complex property (property associated to multiple simple properties)
165
- if (infoProperty.propertyInfos) {
166
- // Get data from simple property
167
- infoProperty.propertyInfos.forEach((property: string) => {
168
- const dataProperty = propertyInfoDict[property],
169
- hasValueHelp = this.hasValueHelpProperty(entityTypeProperties, dataProperty),
170
- columnToPush = getColumnFromPropertyInfos(dataProperty, hasValueHelp, property);
171
- if (columnToPush) {
172
- columnInfos.push(columnToPush);
173
- }
174
- });
175
- if ((infoProperty as { exportDataPointTargetValue?: boolean }).exportDataPointTargetValue) {
176
- columnInfos.push({
177
- property: "targetValueFromDataPoint",
178
- ignore: true
179
- });
180
- }
181
- // Non exported columns should be part of the columnInfos
182
- } else if (infoProperty.exportSettings !== null) {
183
- if (infoProperty.path) {
184
- columnInfos.push(
185
- PasteHelper.getInfoForEntityProperty(
186
- infoProperty.path,
187
- rowBindingPath,
188
- metaContext,
189
- metaModel,
190
- tableDefinition.control.enablePastingOfComputedProperties
191
- )
192
- );
193
- } else {
194
- // Empty column --> ignore
195
- columnInfos.push({
196
- property: "unused",
197
- type: null,
198
- ignore: true
199
- });
155
+ const propertyInfo = (table.getParent() as TableAPI).getEnhancedFetchedPropertyInfos();
156
+ const propertyInfoDict: Record<string, EnhancedFEPropertyInfo> = Object.assign(
157
+ {},
158
+ ...propertyInfo.map((property) => ({ [property.name]: property }))
159
+ );
160
+ const columnInfos: PasteColumnInfo[] = [];
161
+ (columns ?? table.getColumns()).forEach((column) => {
162
+ const infoProperty = propertyInfoDict[column.getPropertyKey()];
163
+ // Check if it's a complex property (property associated to multiple simple properties)
164
+ if (infoProperty.propertyInfos) {
165
+ // Get data from simple property
166
+ infoProperty.propertyInfos.forEach((property: string) => {
167
+ const dataProperty = propertyInfoDict[property],
168
+ hasValueHelp = this.hasValueHelpProperty(entityTypeProperties, dataProperty),
169
+ columnToPush = getColumnFromPropertyInfos(dataProperty, hasValueHelp, property);
170
+ if (columnToPush) {
171
+ columnInfos.push(columnToPush);
200
172
  }
173
+ });
174
+ if (infoProperty.exportDataPointTargetValue) {
175
+ columnInfos.push({
176
+ property: "targetValueFromDataPoint",
177
+ ignore: true
178
+ });
201
179
  }
202
- });
203
- return columnInfos;
180
+ // Non exported columns should be part of the columnInfos
181
+ } else if (infoProperty.exportSettings !== null) {
182
+ if (infoProperty.path) {
183
+ columnInfos.push(
184
+ PasteHelper.getInfoForEntityProperty(
185
+ infoProperty.path,
186
+ rowBindingPath,
187
+ metaContext,
188
+ metaModel,
189
+ tableDefinition.control.enablePastingOfComputedProperties
190
+ )
191
+ );
192
+ } else {
193
+ // Empty column --> ignore
194
+ columnInfos.push({
195
+ property: "unused",
196
+ type: null,
197
+ ignore: true
198
+ });
199
+ }
200
+ }
204
201
  });
202
+ return columnInfos;
205
203
  },
206
204
  getInfoForEntityProperty: getInfoForEntityProperty,
207
205
 
@@ -213,7 +211,7 @@ const PasteHelper = {
213
211
  */
214
212
  hasValueHelpProperty: function (
215
213
  entityTypeProperties: ArrayWithIndex<Property, "name" | "fullyQualifiedName">,
216
- dataProperty: PropertyInfo
214
+ dataProperty: EnhancedFEPropertyInfo
217
215
  ): boolean {
218
216
  const property = entityTypeProperties.find((p) => p.name === dataProperty.path);
219
217
  if (property) {
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2024 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
5
  sap.ui.define([], function () {
6
6
  "use strict";
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2024 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
5
  sap.ui.define([], function () {
6
6
  "use strict";
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2024 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
5
  sap.ui.define(["sap/base/Log", "sap/ui/core/Component"], function (Log, Component) {
6
6
  "use strict";
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2024 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
5
  sap.ui.define(["sap/base/Log"], function (Log) {
6
6
  "use strict";
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2024 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
5
  sap.ui.define(["sap/m/Button", "sap/ui/core/StaticArea", "sap/ui/core/UIArea", "sap/ui/dom/units/Rem"], function (Button, StaticArea, UIArea, Rem) {
6
6
  "use strict";
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2024 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
5
  sap.ui.define(["sap/fe/core/helpers/TypeGuards"], function (TypeGuards) {
6
6
  "use strict";
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2024 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
5
  sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/MetaModelConverter", "../templating/UIFormatters", "./BindingToolkitEvaluator", "./TypeGuards"], function (BindingToolkit, MetaModelConverter, UIFormatters, BindingToolkitEvaluator, TypeGuards) {
6
6
  "use strict";
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2024 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
5
  sap.ui.define([], function () {
6
6
  "use strict";
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2024 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
5
  sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/formatters/ValueFormatter", "sap/fe/core/helpers/BindingHelper", "sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/DataFieldFormatters", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/UIFormatters", "../converters/annotations/DataField"], function (BindingToolkit, valueFormatters, BindingHelper, TypeGuards, DataFieldFormatters, DataModelPathHelper, UIFormatters, DataField) {
6
6
  "use strict";
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2024 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
5
  sap.ui.define([], function () {
6
6
  "use strict";
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2024 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
5
  sap.ui.define([], function () {
6
6
  "use strict";