@sapui5/sap.fe.core 1.99.0 → 1.101.1

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 (289) hide show
  1. package/package.json +6 -4
  2. package/src/sap/fe/core/.library +2 -3
  3. package/src/sap/fe/core/AnnotationHelper.js +43 -92
  4. package/src/sap/fe/core/AnnotationHelper.ts +43 -107
  5. package/src/sap/fe/core/AppComponent.js +381 -399
  6. package/src/sap/fe/core/AppComponent.ts +397 -0
  7. package/src/sap/fe/core/AppStateHandler.js +131 -162
  8. package/src/sap/fe/core/AppStateHandler.ts +2 -2
  9. package/src/sap/fe/core/BaseController.js +82 -58
  10. package/src/sap/fe/core/BaseController.ts +67 -0
  11. package/src/sap/fe/core/CommonUtils.js +179 -31
  12. package/src/sap/fe/core/CommonUtils.ts +295 -125
  13. package/src/sap/fe/core/ExtensionAPI.js +279 -274
  14. package/src/sap/fe/core/ExtensionAPI.ts +242 -0
  15. package/src/sap/fe/core/PageController.js +158 -29
  16. package/src/sap/fe/core/PageController.ts +65 -37
  17. package/src/sap/fe/core/RouterProxy.js +700 -750
  18. package/src/sap/fe/core/RouterProxy.ts +47 -31
  19. package/src/sap/fe/core/Synchronization.js +21 -31
  20. package/src/sap/fe/core/TemplateComponent.js +193 -118
  21. package/src/sap/fe/core/TemplateComponent.ts +104 -109
  22. package/src/sap/fe/core/TemplateModel.js +24 -44
  23. package/src/sap/fe/core/TemplateModel.ts +3 -3
  24. package/src/sap/fe/core/TransactionHelper.js +1368 -1369
  25. package/src/sap/fe/core/TransactionHelper.ts +201 -171
  26. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +406 -0
  27. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +362 -0
  28. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +146 -0
  29. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +129 -0
  30. package/src/sap/fe/core/actions/collaboration/Manage.js +264 -0
  31. package/src/sap/fe/core/actions/collaboration/Manage.ts +246 -0
  32. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +100 -0
  33. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  34. package/src/sap/fe/core/actions/draft.js +324 -220
  35. package/src/sap/fe/core/actions/draft.ts +209 -133
  36. package/src/sap/fe/core/actions/messageHandling.js +79 -48
  37. package/src/sap/fe/core/actions/messageHandling.ts +113 -83
  38. package/src/sap/fe/core/actions/operations.js +37 -18
  39. package/src/sap/fe/core/actions/operations.ts +51 -20
  40. package/src/sap/fe/core/actions/sticky.js +17 -4
  41. package/src/sap/fe/core/actions/sticky.ts +21 -4
  42. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
  43. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
  44. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
  45. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
  46. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +707 -0
  47. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +628 -0
  48. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
  49. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
  50. package/src/sap/fe/core/controllerextensions/EditFlow.js +1854 -1669
  51. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1792 -0
  52. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +79 -54
  53. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +60 -0
  54. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +716 -779
  55. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +785 -0
  56. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +796 -816
  57. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +810 -0
  58. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1056 -1005
  59. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +1001 -0
  60. package/src/sap/fe/core/controllerextensions/KPIManagement.js +498 -532
  61. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +13 -12
  62. package/src/sap/fe/core/controllerextensions/MassEdit.js +141 -169
  63. package/src/sap/fe/core/controllerextensions/MassEdit.ts +155 -0
  64. package/src/sap/fe/core/controllerextensions/MessageHandler.js +221 -244
  65. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +215 -0
  66. package/src/sap/fe/core/controllerextensions/PageReady.js +312 -345
  67. package/src/sap/fe/core/controllerextensions/PageReady.ts +57 -53
  68. package/src/sap/fe/core/controllerextensions/Paginator.js +188 -175
  69. package/src/sap/fe/core/controllerextensions/Paginator.ts +169 -0
  70. package/src/sap/fe/core/controllerextensions/Placeholder.js +157 -149
  71. package/src/sap/fe/core/controllerextensions/Placeholder.ts +149 -0
  72. package/src/sap/fe/core/controllerextensions/Routing.js +144 -125
  73. package/src/sap/fe/core/controllerextensions/Routing.ts +131 -0
  74. package/src/sap/fe/core/controllerextensions/RoutingListener.js +7 -6
  75. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  76. package/src/sap/fe/core/controllerextensions/Share.js +230 -268
  77. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  78. package/src/sap/fe/core/controllerextensions/SideEffects.js +603 -644
  79. package/src/sap/fe/core/controllerextensions/SideEffects.ts +68 -68
  80. package/src/sap/fe/core/controllerextensions/ViewState.js +774 -806
  81. package/src/sap/fe/core/controllerextensions/ViewState.ts +796 -0
  82. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
  83. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  84. package/src/sap/fe/core/controls/Any.js +28 -0
  85. package/src/sap/fe/core/controls/Any.ts +30 -0
  86. package/src/sap/fe/core/controls/CommandExecution.js +92 -68
  87. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  88. package/src/sap/fe/core/controls/ConditionalWrapper.js +165 -79
  89. package/src/sap/fe/core/controls/ConditionalWrapper.ts +74 -0
  90. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +366 -0
  91. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +278 -0
  92. package/src/sap/fe/core/controls/CustomQuickViewPage.js +167 -125
  93. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +116 -0
  94. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +44 -5
  95. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +163 -122
  96. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +155 -0
  97. package/src/sap/fe/core/controls/FieldWrapper.js +212 -141
  98. package/src/sap/fe/core/controls/FieldWrapper.ts +104 -0
  99. package/src/sap/fe/core/controls/FileWrapper.js +313 -0
  100. package/src/sap/fe/core/controls/FileWrapper.ts +169 -0
  101. package/src/sap/fe/core/controls/FilterBar.js +197 -159
  102. package/src/sap/fe/core/controls/FilterBar.ts +148 -0
  103. package/src/sap/fe/core/controls/FormElementWrapper.js +100 -39
  104. package/src/sap/fe/core/controls/FormElementWrapper.ts +37 -0
  105. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +37 -42
  106. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  107. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +147 -115
  108. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +102 -0
  109. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +300 -265
  110. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +252 -0
  111. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +185 -140
  112. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  113. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +335 -322
  114. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  115. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +37 -42
  116. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +75 -74
  117. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +71 -0
  118. package/src/sap/fe/core/converters/ConverterContext.js +348 -379
  119. package/src/sap/fe/core/converters/ConverterContext.ts +19 -16
  120. package/src/sap/fe/core/converters/ManifestSettings.js +13 -1
  121. package/src/sap/fe/core/converters/ManifestSettings.ts +17 -2
  122. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -378
  123. package/src/sap/fe/core/converters/ManifestWrapper.ts +10 -0
  124. package/src/sap/fe/core/converters/MetaModelConverter.js +6 -4
  125. package/src/sap/fe/core/converters/MetaModelConverter.ts +5 -2
  126. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  127. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
  128. package/src/sap/fe/core/converters/annotations/DataField.js +26 -13
  129. package/src/sap/fe/core/converters/annotations/DataField.ts +40 -17
  130. package/src/sap/fe/core/converters/controls/Common/Action.js +10 -10
  131. package/src/sap/fe/core/converters/controls/Common/Action.ts +20 -19
  132. package/src/sap/fe/core/converters/controls/Common/Chart.js +8 -8
  133. package/src/sap/fe/core/converters/controls/Common/Chart.ts +12 -11
  134. package/src/sap/fe/core/converters/controls/Common/Form.js +6 -6
  135. package/src/sap/fe/core/converters/controls/Common/Form.ts +7 -3
  136. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  137. package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -2
  138. package/src/sap/fe/core/converters/controls/Common/Table.js +326 -86
  139. package/src/sap/fe/core/converters/controls/Common/Table.ts +384 -167
  140. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +120 -55
  141. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +158 -98
  142. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +206 -223
  143. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +263 -287
  144. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
  145. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
  146. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +5 -2
  147. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +4 -1
  148. package/src/sap/fe/core/converters/helpers/Aggregation.js +115 -133
  149. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  150. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  151. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  152. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  153. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  154. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  155. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  156. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
  157. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +51 -27
  158. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +69 -43
  159. package/src/sap/fe/core/converters/templates/ListReportConverter.js +42 -25
  160. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +91 -65
  161. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +11 -9
  162. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +8 -8
  163. package/src/sap/fe/core/designtime/AppComponent.designtime.js +92 -98
  164. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  165. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  166. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  167. package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
  168. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -2
  169. package/src/sap/fe/core/formatters/TableFormatter.js +53 -2
  170. package/src/sap/fe/core/formatters/TableFormatter.ts +51 -0
  171. package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
  172. package/src/sap/fe/core/formatters/ValueFormatter.ts +4 -7
  173. package/src/sap/fe/core/fpm/Component.js +80 -55
  174. package/src/sap/fe/core/fpm/Component.ts +43 -0
  175. package/src/sap/fe/core/helpers/AppStartupHelper.js +323 -309
  176. package/src/sap/fe/core/helpers/AppStartupHelper.ts +363 -337
  177. package/src/sap/fe/core/helpers/BindingExpression.js +7 -7
  178. package/src/sap/fe/core/helpers/BindingExpression.ts +7 -7
  179. package/src/sap/fe/core/helpers/ClassSupport.js +307 -166
  180. package/src/sap/fe/core/helpers/ClassSupport.ts +348 -155
  181. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +5 -4
  182. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -5
  183. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  184. package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
  185. package/src/sap/fe/core/helpers/MassEditHelper.js +735 -684
  186. package/src/sap/fe/core/helpers/MassEditHelper.ts +803 -0
  187. package/src/sap/fe/core/helpers/ModelHelper.js +53 -1
  188. package/src/sap/fe/core/helpers/ModelHelper.ts +46 -0
  189. package/src/sap/fe/core/helpers/PasteHelper.js +4 -4
  190. package/src/sap/fe/core/helpers/PasteHelper.ts +4 -3
  191. package/src/sap/fe/core/helpers/SemanticDateOperators.js +7 -3
  192. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +7 -1
  193. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  194. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
  195. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -7
  196. package/src/sap/fe/core/helpers/StableIdHelper.ts +0 -4
  197. package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
  198. package/src/sap/fe/core/jsx-runtime/jsx.ts +22 -8
  199. package/src/sap/fe/core/library.js +425 -451
  200. package/src/sap/fe/core/library.support.js +22 -33
  201. package/src/sap/fe/core/library.support.ts +23 -0
  202. package/src/sap/fe/core/library.ts +420 -0
  203. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
  204. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +4 -4
  205. package/src/sap/fe/core/messagebundle.properties +45 -13
  206. package/src/sap/fe/core/messagebundle_ar.properties +29 -7
  207. package/src/sap/fe/core/messagebundle_bg.properties +29 -7
  208. package/src/sap/fe/core/messagebundle_ca.properties +29 -7
  209. package/src/sap/fe/core/messagebundle_cs.properties +29 -7
  210. package/src/sap/fe/core/messagebundle_cy.properties +29 -7
  211. package/src/sap/fe/core/messagebundle_da.properties +29 -7
  212. package/src/sap/fe/core/messagebundle_de.properties +29 -7
  213. package/src/sap/fe/core/messagebundle_el.properties +29 -7
  214. package/src/sap/fe/core/messagebundle_en.properties +29 -7
  215. package/src/sap/fe/core/messagebundle_en_GB.properties +29 -7
  216. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +29 -7
  217. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +29 -7
  218. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +29 -7
  219. package/src/sap/fe/core/messagebundle_es.properties +29 -7
  220. package/src/sap/fe/core/messagebundle_es_MX.properties +29 -7
  221. package/src/sap/fe/core/messagebundle_et.properties +29 -7
  222. package/src/sap/fe/core/messagebundle_fi.properties +30 -8
  223. package/src/sap/fe/core/messagebundle_fr.properties +31 -9
  224. package/src/sap/fe/core/messagebundle_fr_CA.properties +31 -9
  225. package/src/sap/fe/core/messagebundle_hi.properties +29 -7
  226. package/src/sap/fe/core/messagebundle_hr.properties +29 -7
  227. package/src/sap/fe/core/messagebundle_hu.properties +29 -7
  228. package/src/sap/fe/core/messagebundle_id.properties +29 -7
  229. package/src/sap/fe/core/messagebundle_it.properties +29 -7
  230. package/src/sap/fe/core/messagebundle_iw.properties +29 -7
  231. package/src/sap/fe/core/messagebundle_ja.properties +28 -6
  232. package/src/sap/fe/core/messagebundle_kk.properties +29 -7
  233. package/src/sap/fe/core/messagebundle_ko.properties +29 -7
  234. package/src/sap/fe/core/messagebundle_lt.properties +29 -7
  235. package/src/sap/fe/core/messagebundle_lv.properties +30 -8
  236. package/src/sap/fe/core/messagebundle_ms.properties +29 -7
  237. package/src/sap/fe/core/messagebundle_nl.properties +29 -7
  238. package/src/sap/fe/core/messagebundle_no.properties +29 -7
  239. package/src/sap/fe/core/messagebundle_pl.properties +29 -7
  240. package/src/sap/fe/core/messagebundle_pt.properties +30 -8
  241. package/src/sap/fe/core/messagebundle_pt_PT.properties +29 -7
  242. package/src/sap/fe/core/messagebundle_ro.properties +29 -7
  243. package/src/sap/fe/core/messagebundle_ru.properties +29 -7
  244. package/src/sap/fe/core/messagebundle_sh.properties +29 -7
  245. package/src/sap/fe/core/messagebundle_sk.properties +29 -7
  246. package/src/sap/fe/core/messagebundle_sl.properties +29 -7
  247. package/src/sap/fe/core/messagebundle_sv.properties +30 -8
  248. package/src/sap/fe/core/messagebundle_th.properties +28 -6
  249. package/src/sap/fe/core/messagebundle_tr.properties +32 -10
  250. package/src/sap/fe/core/messagebundle_uk.properties +29 -7
  251. package/src/sap/fe/core/messagebundle_vi.properties +29 -7
  252. package/src/sap/fe/core/messagebundle_zh_CN.properties +29 -7
  253. package/src/sap/fe/core/messagebundle_zh_TW.properties +29 -7
  254. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +47 -73
  255. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +1 -1
  256. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +158 -196
  257. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +5 -6
  258. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +70 -96
  259. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +7 -6
  260. package/src/sap/fe/core/services/NavigationServiceFactory.js +287 -342
  261. package/src/sap/fe/core/services/NavigationServiceFactory.ts +11 -14
  262. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +70 -105
  263. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +6 -3
  264. package/src/sap/fe/core/services/RoutingServiceFactory.js +796 -820
  265. package/src/sap/fe/core/services/RoutingServiceFactory.ts +62 -53
  266. package/src/sap/fe/core/services/ShellServicesFactory.js +694 -741
  267. package/src/sap/fe/core/services/ShellServicesFactory.ts +33 -33
  268. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +570 -595
  269. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +23 -4
  270. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +357 -389
  271. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +25 -29
  272. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +43 -5
  273. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +7 -4
  274. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  275. package/src/sap/fe/core/support/CommonHelper.ts +1 -4
  276. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  277. package/src/sap/fe/core/templating/DataModelPathHelper.js +91 -90
  278. package/src/sap/fe/core/templating/DataModelPathHelper.ts +126 -123
  279. package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
  280. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +26 -5
  281. package/src/sap/fe/core/templating/FilterHelper.js +25 -32
  282. package/src/sap/fe/core/templating/FilterHelper.ts +36 -35
  283. package/src/sap/fe/core/templating/PropertyHelper.js +16 -2
  284. package/src/sap/fe/core/templating/PropertyHelper.ts +31 -24
  285. package/src/sap/fe/core/templating/UIFormatters.js +150 -44
  286. package/src/sap/fe/core/templating/UIFormatters.ts +165 -67
  287. package/src/sap/fe/core/type/Email.js +26 -8
  288. package/src/sap/fe/core/type/Email.ts +8 -7
  289. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -75
@@ -1,809 +1,777 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- (c) Copyright 2009-2021 SAP SE. All rights reserved
4
-
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
5
4
  */
6
- sap.ui.define(
7
- [
8
- "sap/ui/core/mvc/ControllerExtension",
9
- "sap/ui/core/mvc/OverrideExecution",
10
- "sap/base/Log",
11
- "sap/base/util/merge",
12
- "sap/ui/fl/apply/api/ControlVariantApplyAPI",
13
- "sap/ui/mdc/p13n/StateUtil",
14
- "sap/fe/navigation/library",
15
- "sap/fe/core/CommonUtils",
16
- "sap/fe/core/helpers/KeepAliveHelper",
17
- "sap/fe/core/helpers/ModelHelper"
18
- ],
19
- function(
20
- ControllerExtension,
21
- OverrideExecution,
22
- Log,
23
- mergeObjects,
24
- ControlVariantApplyAPI,
25
- StateUtil,
26
- NavLibrary,
27
- CommonUtils,
28
- KeepAliveHelper,
29
- ModelHelper
30
- ) {
31
- "use strict";
32
-
33
- // additionalStates are stored next to control IDs, so name clash avoidance needed. Fortunately IDs have restrictions:
34
- // "Allowed is a sequence of characters (capital/lowercase), digits, underscores, dashes, points and/or colons."
35
- // Therefore adding a symbol like # or @
36
- var ADDITIONAL_STATES_KEY = "#additionalStates",
37
- NavType = NavLibrary.NavType;
38
-
39
- ///////////////////////////////////////////////////////////////////
40
- // methods to retrieve & apply states for the different controls //
41
- ///////////////////////////////////////////////////////////////////
42
-
43
- var _mControlStateHandlerMap = {
44
- "sap.ui.fl.variants.VariantManagement": {
45
- retrieve: function(oVM) {
46
- return {
47
- "variantId": oVM.getCurrentVariantKey()
48
- };
49
- },
50
- apply: function(oVM, oControlState) {
51
- if (oControlState && oControlState.variantId !== undefined && oControlState.variantId !== oVM.getCurrentVariantKey()) {
52
- var sVariantReference = this._checkIfVariantIdIsAvailable(oVM, oControlState.variantId)
53
- ? oControlState.variantId
54
- : oVM.getStandardVariantKey();
55
- return ControlVariantApplyAPI.activateVariant({
56
- element: oVM,
57
- variantReference: sVariantReference
58
- });
59
- }
60
- }
61
- },
62
- "sap.m.IconTabBar": {
63
- retrieve: function(oTabBar) {
64
- return {
65
- selectedKey: oTabBar.getSelectedKey()
66
- };
67
- },
68
- apply: function(oTabBar, oControlState) {
69
- if (oControlState && oControlState.selectedKey) {
70
- var oSelectedItem = oTabBar.getItems().find(function(oItem) {
71
- return oItem.getKey() === oControlState.selectedKey;
72
- });
73
- if (oSelectedItem) {
74
- oTabBar.setSelectedItem(oSelectedItem);
75
- }
76
- }
77
- }
78
- },
79
- "sap.ui.mdc.FilterBar": {
80
- retrieve: function(oFilterBar) {
81
- return StateUtil.retrieveExternalState(oFilterBar).then(function(mFilterBarState) {
82
- // remove sensitive or view state irrelevant fields
83
- var aPropertiesInfo = oFilterBar.getPropertyInfoSet(),
84
- mFilter = mFilterBarState.filter || {};
85
- aPropertiesInfo
86
- .filter(function(oPropertyInfo) {
87
- return (
88
- mFilter[oPropertyInfo.path] &&
89
- (oPropertyInfo.removeFromAppState || mFilter[oPropertyInfo.path].length === 0)
90
- );
91
- })
92
- .forEach(function(oPropertyInfo) {
93
- delete mFilter[oPropertyInfo.path];
94
- });
95
- return mFilterBarState;
96
- });
97
- },
98
- apply: function(oFilterBar, oControlState) {
99
- if (oControlState) {
100
- return StateUtil.applyExternalState(oFilterBar, oControlState);
101
- }
102
- }
103
- },
104
- "sap.ui.mdc.Table": {
105
- retrieve: function(oTable) {
106
- return StateUtil.retrieveExternalState(oTable);
107
- },
108
- apply: function(oTable, oControlState) {
109
- if (oControlState) {
110
- return StateUtil.applyExternalState(oTable, oControlState);
111
- }
112
- },
113
- refreshBinding: function(oTable) {
114
- var oTableBinding = oTable.getRowBinding();
115
- if (oTableBinding) {
116
- var oRootBinding = oTableBinding.getRootBinding();
117
- if (oRootBinding === oTableBinding) {
118
- // absolute binding
119
- oTableBinding.refresh();
120
- } else {
121
- // relative binding
122
- var oHeaderContext = oTableBinding.getHeaderContext();
123
- var sGroupId = oTableBinding.getGroupId();
124
-
125
- if (oHeaderContext) {
126
- oHeaderContext.requestSideEffects([{ $NavigationPropertyPath: "" }], sGroupId);
127
- }
128
- }
129
- } else {
130
- Log.info("Table: " + oTable.getId() + " was not refreshed. No binding found!");
131
- }
132
- }
133
- },
134
- "sap.uxap.ObjectPageLayout": {
135
- retrieve: function(oOPLayout) {
136
- return {
137
- selectedSection: oOPLayout.getSelectedSection()
138
- };
139
- },
140
- apply: function(oOPLayout, oControlState) {
141
- oControlState && oOPLayout.setSelectedSection(oControlState.selectedSection);
142
- },
143
- refreshBinding: function(oOPLayout) {
144
- var oBindingContext = oOPLayout.getBindingContext();
145
- var oBinding = oBindingContext && oBindingContext.getBinding();
146
- if (oBinding) {
147
- var sMetaPath = ModelHelper.getMetaPathForContext(oBindingContext);
148
- var sStrategy = KeepAliveHelper.getControlRefreshStrategyForContextPath(oOPLayout, sMetaPath);
149
- if (sStrategy === "self") {
150
- // Refresh main context and 1-1 navigation properties or OP
151
- var oModel = oBindingContext.getModel(),
152
- oMetaModel = oModel.getMetaModel(),
153
- oNavigationProperties =
154
- CommonUtils.getContextPathProperties(oMetaModel, sMetaPath, {
155
- $kind: "NavigationProperty"
156
- }) || {},
157
- aNavPropertiesToRequest = Object.keys(oNavigationProperties).reduce(function(aPrev, sNavProp) {
158
- if (oNavigationProperties[sNavProp].$isCollection !== true) {
159
- aPrev.push({ $NavigationPropertyPath: sNavProp });
160
- }
161
- return aPrev;
162
- }, []),
163
- aProperties = [{ $PropertyPath: "*" }],
164
- sGroupId = oBinding.getGroupId();
165
-
166
- oBindingContext.requestSideEffects(aProperties.concat(aNavPropertiesToRequest), sGroupId);
167
- } else if (sStrategy === "includingDependents") {
168
- // Complete refresh
169
- oBinding.refresh();
170
- }
171
- } else {
172
- Log.info("ObjectPage: " + oOPLayout.getId() + " was not refreshed. No binding found!");
173
- }
174
- }
175
- },
176
- "sap.fe.macros.table.QuickFilterContainer": {
177
- retrieve: function(oQuickFilter) {
178
- return {
179
- selectedKey: oQuickFilter.getSelectorKey()
180
- };
181
- },
182
- apply: function(oQuickFilter, oControlState) {
183
- oControlState && oQuickFilter.setSelectorKey(oControlState.selectedKey);
184
- }
185
- },
186
- "sap.m.SegmentedButton": {
187
- retrieve: function(oSegmentedButton) {
188
- return {
189
- selectedKey: oSegmentedButton.getSelectedKey()
190
- };
191
- },
192
- apply: function(oSegmentedButton, oControlState) {
193
- oControlState && oSegmentedButton.setSelectedKey(oControlState.selectedKey);
194
- }
195
- },
196
- "sap.m.Select": {
197
- retrieve: function(oSelect) {
198
- return {
199
- selectedKey: oSelect.getSelectedKey()
200
- };
201
- },
202
- apply: function(oSelect, oControlState) {
203
- oControlState && oSelect.setSelectedKey(oControlState.selectedKey);
204
- }
205
- },
206
- "sap.f.DynamicPage": {
207
- retrieve: function(oDynamicPage) {
208
- return {
209
- headerExpanded: oDynamicPage.getHeaderExpanded()
210
- };
211
- },
212
- apply: function(oDynamicPage, oControlState) {
213
- oControlState && oDynamicPage.setHeaderExpanded(oControlState.headerExpanded);
214
- }
215
- },
216
- "sap.ui.core.mvc.View": {
217
- retrieve: function(oView) {
218
- var oController = oView.getController();
219
- if (oController && oController.viewState) {
220
- return oController.viewState.retrieveViewState(oController.viewState);
221
- }
222
- return {};
223
- },
224
- apply: function(oView, oControlState, oNavParameters) {
225
- var oController = oView.getController();
226
- if (oController && oController.viewState) {
227
- return oController.viewState.applyViewState(oControlState, oNavParameters);
228
- }
229
- },
230
- refreshBinding: function(oView) {
231
- var oController = oView.getController();
232
- if (oController && oController.viewState) {
233
- return oController.viewState.refreshViewBindings();
234
- }
235
- }
236
- },
237
- "sap.ui.core.ComponentContainer": {
238
- retrieve: function(oComponentContainer) {
239
- var oComponent = oComponentContainer.getComponentInstance();
240
- if (oComponent) {
241
- return this.retrieveControlState(oComponent.getRootControl());
242
- }
243
- return {};
244
- },
245
- apply: function(oComponentContainer, oControlState, oNavParameters) {
246
- var oComponent = oComponentContainer.getComponentInstance();
247
- if (oComponent) {
248
- return this.applyControlState(oComponent.getRootControl(), oControlState, oNavParameters);
249
- }
250
- }
251
- }
252
- };
253
-
254
- /**
255
- * @class A controller extension offering hooks for state handling
256
- *
257
- * If you need to maintain a specific state for your application, you can use the controller extension.
258
- *
259
- * @name sap.fe.core.controllerextensions.ViewState
260
- * @hideconstructor
261
- * @public
262
- * @since 1.85.0
263
- */
264
- var ViewState = ControllerExtension.extend("sap.fe.core.controllerextensions.ViewState", {
265
- metadata: {
266
- methods: {
267
- refreshViewBindings: { "public": true, "final": true },
268
- adaptBindingRefreshControls: {
269
- "public": true,
270
- "final": false,
271
- overrideExecution: OverrideExecution.After
272
- },
273
- getControlRefreshBindingHandler: {
274
- "public": false,
275
- "final": true
276
- },
277
- refreshControlBinding: {
278
- "public": false,
279
- "final": true
280
- },
281
- adaptBindingRefreshHandler: {
282
- "public": true,
283
- "final": false,
284
- overrideExecution: OverrideExecution.After
285
- },
286
- collectResults: { "public": false, "final": true },
287
- adaptControlStateHandler: {
288
- "public": true,
289
- "final": false,
290
- overrideExecution: OverrideExecution.After
291
- },
292
- getControlStateHandler: { "public": false, "final": true },
293
- adaptStateControls: {
294
- "public": true,
295
- "final": false,
296
- overrideExecution: OverrideExecution.After
297
- },
298
- retrieveAdditionalStates: {
299
- "public": true,
300
- "final": false,
301
- overrideExecution: OverrideExecution.After
302
- },
303
- retrieveViewState: { "public": true, "final": true },
304
- retrieveControlState: { "public": false, "final": true },
305
- applyInitialStateOnly: {
306
- "public": true,
307
- "final": false,
308
- overrideExecution: OverrideExecution.Instead
309
- },
310
- applyViewState: { "public": true, "final": true },
311
- applyControlState: { "public": false, "final": true },
312
- applyAdditionalStates: {
313
- "public": true,
314
- "final": false,
315
- overrideExecution: OverrideExecution.After
316
- },
317
- applyNavigationParameters: { "public": true, "final": false, overrideExecution: OverrideExecution.After },
318
- onBeforeStateApplied: { "public": true, "final": false, overrideExecution: OverrideExecution.After },
319
- onAfterStateApplied: { "public": true, "final": false, overrideExecution: OverrideExecution.After },
320
- onSuspend: { "public": true, "final": false, overrideExecution: OverrideExecution.After },
321
- onRestore: { "public": true, "final": false, overrideExecution: OverrideExecution.After }
322
- }
323
- },
324
-
325
- /**
326
- * Constructor.
327
- */
328
- constructor: function() {
329
- ControllerExtension.apply(this);
330
- var that = this;
331
- that._iRetrievingStateCounter = 0;
332
- this._pInitialStateApplied = new Promise(function(resolve) {
333
- that._pInitialStateAppliedResolve = resolve;
334
- });
335
- },
336
-
337
- /**
338
- * @private
339
- * @name sap.fe.core.controllerextensions.ViewState.getMetadata
340
- * @function
341
- */
342
- /**
343
- * @private
344
- * @name sap.fe.core.controllerextensions.ViewState.extend
345
- * @function
346
- */
347
-
348
- refreshViewBindings: function() {
349
- var that = this;
350
- return that.collectResults(that.base.viewState.adaptBindingRefreshControls).then(function(aControls) {
351
- var oPromiseChain = Promise.resolve();
352
- aControls
353
- .filter(function(oControl) {
354
- return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
355
- })
356
- .forEach(function(oControl) {
357
- oPromiseChain = oPromiseChain.then(that.refreshControlBinding.bind(that, oControl));
358
- });
359
- return oPromiseChain;
360
- });
361
- },
362
- /**
363
- * This function should add all controls relevant for refreshing to the provided control array.
364
- *
365
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
366
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
367
- * @param {Array<sap.ui.base.ManagedObject>} aCollectedControls The collected controls
368
- * @alias sap.fe.core.controllerextensions.ViewState#adaptBindingRefreshControls
369
- * @protected
370
- */
371
- adaptBindingRefreshControls: function(aCollectedControls) {},
372
-
373
- refreshControlBinding: function(oControl) {
374
- var oControlRefreshBindingHandler = this.getControlRefreshBindingHandler(oControl),
375
- oPromiseChain = Promise.resolve(),
376
- that = this;
377
- if (typeof oControlRefreshBindingHandler.refreshBinding !== "function") {
378
- Log.info("refreshBinding handler for control: " + oControl.getMetadata().getName() + " is not provided");
379
- } else {
380
- oPromiseChain = oPromiseChain.then(oControlRefreshBindingHandler.refreshBinding.bind(that, oControl));
381
- }
382
- return oPromiseChain;
383
- },
384
-
385
- /**
386
- * Returns a map of <code>refreshBinding</code> function for a certain control.
387
- *
388
- * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
389
- * @returns {object} A plain object with one function: <code>refreshBinding</code>
390
- */
391
-
392
- getControlRefreshBindingHandler: function(oControl) {
393
- var oRefreshBindingHandler = {};
394
- if (oControl) {
395
- for (var sType in _mControlStateHandlerMap) {
396
- if (oControl.isA(sType)) {
397
- // pass only the refreshBinding handler in an object so that :
398
- // 1. Application has access only to refreshBinding and not apply and reterive at this stage
399
- // 2. Application modifications to the object will be reflected here (as we pass by reference)
400
- oRefreshBindingHandler["refreshBinding"] = _mControlStateHandlerMap[sType].refreshBinding || {};
401
- break;
402
- }
403
- }
404
- }
405
- this.base.viewState.adaptBindingRefreshHandler(oControl, oRefreshBindingHandler);
406
- return oRefreshBindingHandler;
407
- },
408
- /**
409
- * Customize the <code>refreshBinding</code> function for a certain control.
410
- *
411
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
412
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
413
- *
414
- * @param {sap.ui.base.ManagedObject} oControl The control for which the refresh handler is adapted.
415
- * @param {Array<object>} oControlHandler A plain object which can have one function: <code>refreshBinding</code>
416
- *
417
- * @alias sap.fe.core.controllerextensions.ViewState#adaptBindingRefreshHandler
418
- * @protected
419
- */
420
- adaptBindingRefreshHandler: function(oControl, oControlHandler) {},
421
-
422
- /**
423
- * Called when the application is suspended due to keep-alive mode.
424
- *
425
- * @alias sap.fe.core.controllerextensions.ViewState#onSuspend
426
- * @public
427
- */
428
- onSuspend: function() {},
429
-
430
- /**
431
- * Called when the application is restored due to keep-alive mode.
432
- *
433
- * @alias sap.fe.core.controllerextensions.ViewState#onRestore
434
- * @public
435
- */
436
- onRestore: function() {},
437
-
438
- /**
439
- * Destructor method for objects.
440
- */
441
- destroy: function() {
442
- delete this._pInitialStateApplied;
443
- delete this._pInitialStateAppliedResolve;
444
- delete this._iRetrievingStateCounter;
445
- ControllerExtension.prototype.destroy.apply(this);
446
- },
447
-
448
- /**
449
- * Helper function to enable multi override. It is adding an additional parameter (array) to the provided
450
- * function (and its parameters), that will be evaluated via <code>Promise.all</code>.
451
- *
452
- * @param {Function} fnCall The function to be called
453
- * @returns {Promise} A promise to be resolved with the result of all overrides
454
- */
455
- collectResults: function(fnCall) {
456
- var aResults = [],
457
- aArguments = Array.prototype.slice.call(arguments, 1);
458
- aArguments.push(aResults);
459
- fnCall.apply(this, aArguments);
460
- return Promise.all(aResults);
461
- },
462
-
463
- /**
464
- * Customize the <code>retrieve</code> and <code>apply</code> functions for a certain control.
465
- *
466
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
467
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
468
- *
469
- * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
470
- * @param {Array<object>} aControlHandler A list of plain objects with two functions: <code>retrieve</code> and <code>apply</code>
471
- *
472
- * @alias sap.fe.core.controllerextensions.ViewState#adaptControlStateHandler
473
- * @protected
474
- */
475
- adaptControlStateHandler: function(oControl, aControlHandler) {
476
- // to be overridden if needed
477
- },
478
-
479
- /**
480
- * Returns a map of <code>retrieve</code> and <code>apply</code> functions for a certain control.
481
- *
482
- * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
483
- * @returns {object} A plain object with two functions: <code>retrieve</code> and <code>apply</code>
484
- */
485
- getControlStateHandler: function(oControl) {
486
- var aInternalControlStateHandler = [],
487
- aCustomControlStateHandler = [];
488
- if (oControl) {
489
- for (var sType in _mControlStateHandlerMap) {
490
- if (oControl.isA(sType)) {
491
- // avoid direct manipulation of internal _mControlStateHandlerMap
492
- aInternalControlStateHandler.push(Object.assign({}, _mControlStateHandlerMap[sType]));
493
- break;
494
- }
495
- }
496
- }
497
- this.base.viewState.adaptControlStateHandler(oControl, aCustomControlStateHandler);
498
- return aInternalControlStateHandler.concat(aCustomControlStateHandler);
499
- },
500
-
501
- /**
502
- * This function should add all controls for given view that should be considered for the state handling to the provided control array.
503
- *
504
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
505
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
506
- * @param {Array<sap.ui.base.ManagedObject>} aCollectedControls The collected controls
507
- * @alias sap.fe.core.controllerextensions.ViewState#adaptStateControls
508
- * @protected
509
- */
510
- adaptStateControls: function(aCollectedControls) {
511
- // to be overridden if needed
512
- },
513
-
514
- /**
515
- * Returns the key to be used for given control.
516
- *
517
- * @param {sap.ui.base.ManagedObject} oControl The control to get state key for
518
- * @returns {string} The key to be used for storing the controls state
519
- */
520
- getStateKey: function(oControl) {
521
- return this.getView().getLocalId(oControl.getId()) || oControl.getId();
522
- },
523
-
524
- /**
525
- * Retrieve the view state of this extensions view.
526
- * When this function is called more than once before finishing, all but the final response will resolve to <code>undefined</code>.
527
- *
528
- * @returns {Promise} A promise resolving the view state
529
- *
530
- * @alias sap.fe.core.controllerextensions.ViewState#retrieveViewState
531
- * @public
532
- */
533
- retrieveViewState: function() {
534
- var that = this;
535
- ++that._iRetrievingStateCounter;
536
- return that._pInitialStateApplied
537
- .then(function() {
538
- return that.collectResults(that.base.viewState.adaptStateControls);
539
- })
540
- .then(function(aControls) {
541
- return Promise.all(
542
- aControls
543
- .filter(function(oControl) {
544
- return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
545
- })
546
- .map(function(oControl) {
547
- return that.retrieveControlState(oControl).then(function(vResult) {
548
- return {
549
- key: that.getStateKey(oControl),
550
- value: vResult
551
- };
552
- });
553
- })
554
- );
555
- })
556
- .then(function(aResolvedStates) {
557
- return aResolvedStates.reduce(function(oStates, mState) {
558
- var oCurrentState = {};
559
- oCurrentState[mState.key] = mState.value;
560
- return mergeObjects(oStates, oCurrentState);
561
- }, {});
562
- })
563
- .then(function(oViewState) {
564
- return Promise.resolve(that._retrieveAdditionalStates()).then(function(mAdditionalStates) {
565
- if (mAdditionalStates && Object.keys(mAdditionalStates).length) {
566
- oViewState[ADDITIONAL_STATES_KEY] = mAdditionalStates;
567
- }
568
- return oViewState;
569
- });
570
- })
571
- .finally(function() {
572
- --that._iRetrievingStateCounter;
573
- })
574
- .then(function(oViewState) {
575
- return that._iRetrievingStateCounter === 0 ? oViewState : undefined;
576
- });
577
- },
578
-
579
- /**
580
- * Extend the map of additional states (not control bound) to be added to the current view state of the given view.
581
- *
582
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
583
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
584
- *
585
- * @param {object} mAdditionalStates The additional state
586
- *
587
- * @alias sap.fe.core.controllerextensions.ViewState#retrieveAdditionalStates
588
- * @protected
589
- */
590
- retrieveAdditionalStates: function(mAdditionalStates) {
591
- // to be overridden if needed
592
- },
593
-
594
- /**
595
- * Returns a map of additional states (not control bound) to be added to the current view state of the given view.
596
- *
597
- * @returns {object | Promise<object>} Additional view states
598
- */
599
- _retrieveAdditionalStates: function() {
600
- var mAdditionalStates = {};
601
- this.base.viewState.retrieveAdditionalStates(mAdditionalStates);
602
- return mAdditionalStates;
603
- },
604
-
605
- /**
606
- * Returns the current state for the given control.
607
- *
608
- * @param {sap.ui.base.ManagedObject} oControl The object to get the state for
609
- * @returns {Promise<object>} The state for the given control
610
- */
611
- retrieveControlState: function(oControl) {
612
- var aControlStateHandlers = this.getControlStateHandler(oControl);
613
- return Promise.all(
614
- aControlStateHandlers.map(function(mControlStateHandler) {
615
- if (typeof mControlStateHandler.retrieve !== "function") {
616
- throw new Error(
617
- "controlStateHandler.retrieve is not a function for control: " + oControl.getMetadata().getName()
618
- );
619
- }
620
- return mControlStateHandler.retrieve.call(this, oControl);
621
- })
622
- ).then(function(aStates) {
623
- return aStates.reduce(function(oFinalState, oCurrentState) {
624
- return mergeObjects(oFinalState, oCurrentState);
625
- }, {});
626
- });
627
- },
628
-
629
- /**
630
- * Defines whether the view state should only be applied once initially.
631
- *
632
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
633
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.Instead}.
634
- *
635
- * Important:
636
- * You should only override this method for custom pages and not for the standard ListReportPage and ObjectPage!
637
- *
638
- * @returns {boolean} If <code>true</code>, only the initial view state is applied once,
639
- * else any new view state is also applied on follow-up calls (default)
640
- *
641
- * @alias sap.fe.core.controllerextensions.ViewState#applyInitialStateOnly
642
- * @protected
643
- */
644
- applyInitialStateOnly: function() {
645
- return true;
646
- },
647
- /**
648
- * Applies the given view state to this extensions view.
649
- *
650
- * @param {object} oViewState The view state to apply (can be undefined)
651
- * @param {object} oNavParameter The current navigation parameter
652
- * @param {sap.fe.navigation.NavType} oNavParameter.navigationType The actual navigation type
653
- * @param {object} [oNavParameter.selectionVariant] The selectionVariant from the navigation
654
- * @param {object} [oNavParameter.selectionVariantDefaults] The selectionVariant defaults from the navigation
655
- * @param {boolean} [oNavParameter.requiresStandardVariant] Defines whether standard variant must be used in VM
656
- *
657
- * @returns {Promise} Promise for async state handling
658
- *
659
- * @alias sap.fe.core.controllerextensions.ViewState#applyViewState
660
- * @public
661
- */
662
- applyViewState: function(oViewState, oNavParameter) {
663
- var that = this;
664
- if (this.base.viewState.applyInitialStateOnly() && this._getInitialStateApplied()) {
665
- return Promise.resolve();
666
- }
667
- return this.collectResults(this.base.viewState.onBeforeStateApplied)
668
- .then(function() {
669
- return that.collectResults(that.base.viewState.adaptStateControls);
670
- })
671
- .then(function(aControls) {
672
- var oPromiseChain = Promise.resolve();
673
- aControls
674
- .filter(function(oControl) {
675
- return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
676
- })
677
- .forEach(function(oControl) {
678
- var sKey = that.getStateKey(oControl);
679
- oPromiseChain = oPromiseChain.then(
680
- that.applyControlState.bind(that, oControl, oViewState ? oViewState[sKey] : undefined, oNavParameter)
681
- );
682
- });
683
- return oPromiseChain;
684
- })
685
- .then(function() {
686
- if (oNavParameter.navigationType === NavType.iAppState) {
687
- return that.collectResults(
688
- that.base.viewState.applyAdditionalStates,
689
- oViewState ? oViewState[ADDITIONAL_STATES_KEY] : undefined
690
- );
691
- } else {
692
- return that.collectResults(that.base.viewState.applyNavigationParameters, oNavParameter);
693
- }
694
- })
695
- .finally(function() {
696
- return that.collectResults(that.base.viewState.onAfterStateApplied).then(that._setInitialStateApplied.bind(that));
697
- });
698
- },
699
-
700
- _checkIfVariantIdIsAvailable: function(oVM, sVariantId) {
701
- var aVariants = oVM.getVariants(),
702
- bIsControlStateVariantAvailable = false;
703
- aVariants.forEach(function(oVariant) {
704
- if (oVariant.key === sVariantId) {
705
- bIsControlStateVariantAvailable = true;
706
- }
707
- });
708
- return bIsControlStateVariantAvailable;
709
- },
710
-
711
- _setInitialStateApplied: function() {
712
- if (this._pInitialStateAppliedResolve) {
713
- var pInitialStateAppliedResolve = this._pInitialStateAppliedResolve;
714
- delete this._pInitialStateAppliedResolve;
715
- pInitialStateAppliedResolve();
716
- }
717
- },
718
-
719
- _getInitialStateApplied: function() {
720
- return !this._pInitialStateAppliedResolve;
721
- },
722
-
723
- /**
724
- * Hook to react before a state for given view is applied.
725
- *
726
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
727
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
728
- *
729
- * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
730
- *
731
- * @alias sap.fe.core.controllerextensions.ViewState#onBeforeStateApplied
732
- * @protected
733
- */
734
- onBeforeStateApplied: function(aPromises) {},
735
-
736
- /**
737
- * Hook to react when state for given view was applied.
738
- *
739
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
740
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
741
- *
742
- * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
743
- *
744
- * @alias sap.fe.core.controllerextensions.ViewState#onAfterStateApplied
745
- * @protected
746
- */
747
- onAfterStateApplied: function(aPromises) {},
748
-
749
- /**
750
- * Applying additional, not control related, states - is called only if navigation type is iAppState.
751
- *
752
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
753
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
754
- *
755
- * @param {object} oViewState The current view state
756
- * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
757
- *
758
- * @alias sap.fe.core.controllerextensions.ViewState#applyAdditionalStates
759
- * @protected
760
- */
761
- applyAdditionalStates: function(oViewState, aPromises) {
762
- // to be overridden if needed
763
- },
764
-
765
- /**
766
- * Apply navigation parameters - is called only if navigation type is not iAppState.
767
- *
768
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
769
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
770
- *
771
- * @param {object} oNavParameter The current navigation parameter
772
- * @param {sap.fe.navigation.NavType} oNavParameter.navigationType The actual navigation type
773
- * @param {object} [oNavParameter.selectionVariant] The selectionVariant from the navigation
774
- * @param {object} [oNavParameter.selectionVariantDefaults] The selectionVariant defaults from the navigation
775
- * @param {boolean} [oNavParameter.requiresStandardVariant] Defines whether standard variant must be used in VM
776
- * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
777
- *
778
- * @alias sap.fe.core.controllerextensions.ViewState#applyNavigationParameters
779
- * @protected
780
- */
781
- applyNavigationParameters: function(oNavParameter, aPromises) {
782
- // to be overridden if needed
783
- },
784
-
785
- /**
786
- * Applying the given state to the given control.
787
- *
788
- * @param {sap.ui.base.ManagedObject} oControl The object to apply the given state
789
- * @param {object} oControlState The state for the given control
790
- * @param {object} oNavParameters The current navigation parameters
791
- * @returns {any} Return a promise for async state handling
792
- */
793
- applyControlState: function(oControl, oControlState, oNavParameters) {
794
- var aControlStateHandlers = this.getControlStateHandler(oControl),
795
- oPromiseChain = Promise.resolve(),
796
- that = this;
797
- aControlStateHandlers.forEach(function(mControlStateHandler) {
798
- if (typeof mControlStateHandler.apply !== "function") {
799
- throw new Error("controlStateHandler.apply is not a function for control: " + oControl.getMetadata().getName());
800
- }
801
- oPromiseChain = oPromiseChain.then(mControlStateHandler.apply.bind(that, oControl, oControlState, oNavParameters));
802
- });
803
- return oPromiseChain;
804
- }
805
- });
806
-
807
- return ViewState;
808
- }
809
- );
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/KeepAliveHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/navigation/library", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/ui/fl/apply/api/ControlVariantApplyAPI", "sap/ui/mdc/p13n/StateUtil"], function (Log, mergeObjects, CommonUtils, ClassSupport, KeepAliveHelper, ModelHelper, NavLibrary, ControllerExtension, OverrideExecution, ControlVariantApplyAPI, StateUtil) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _dec31, _dec32, _dec33, _dec34, _dec35, _dec36, _dec37, _dec38, _dec39, _dec40, _dec41, _dec42, _dec43, _dec44, _dec45, _dec46, _class, _class2;
9
+
10
+ var publicExtension = ClassSupport.publicExtension;
11
+ var privateExtension = ClassSupport.privateExtension;
12
+ var finalExtension = ClassSupport.finalExtension;
13
+ var extensible = ClassSupport.extensible;
14
+ var defineUI5Class = ClassSupport.defineUI5Class;
15
+
16
+ function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
17
+
18
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
19
+
20
+ function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
21
+
22
+ // additionalStates are stored next to control IDs, so name clash avoidance needed. Fortunately IDs have restrictions:
23
+ // "Allowed is a sequence of characters (capital/lowercase), digits, underscores, dashes, points and/or colons."
24
+ // Therefore adding a symbol like # or @
25
+ var ADDITIONAL_STATES_KEY = "#additionalStates",
26
+ NavType = NavLibrary.NavType; ///////////////////////////////////////////////////////////////////
27
+ // methods to retrieve & apply states for the different controls //
28
+ ///////////////////////////////////////////////////////////////////
29
+
30
+ var _mControlStateHandlerMap = {
31
+ "sap.ui.fl.variants.VariantManagement": {
32
+ retrieve: function (oVM) {
33
+ return {
34
+ "variantId": oVM.getCurrentVariantKey()
35
+ };
36
+ },
37
+ apply: function (oVM, oControlState) {
38
+ if (oControlState && oControlState.variantId !== undefined && oControlState.variantId !== oVM.getCurrentVariantKey()) {
39
+ var sVariantReference = this._checkIfVariantIdIsAvailable(oVM, oControlState.variantId) ? oControlState.variantId : oVM.getStandardVariantKey();
40
+ return ControlVariantApplyAPI.activateVariant({
41
+ element: oVM,
42
+ variantReference: sVariantReference
43
+ });
44
+ }
45
+ }
46
+ },
47
+ "sap.m.IconTabBar": {
48
+ retrieve: function (oTabBar) {
49
+ return {
50
+ selectedKey: oTabBar.getSelectedKey()
51
+ };
52
+ },
53
+ apply: function (oTabBar, oControlState) {
54
+ if (oControlState && oControlState.selectedKey) {
55
+ var oSelectedItem = oTabBar.getItems().find(function (oItem) {
56
+ return oItem.getKey() === oControlState.selectedKey;
57
+ });
58
+
59
+ if (oSelectedItem) {
60
+ oTabBar.setSelectedItem(oSelectedItem);
61
+ }
62
+ }
63
+ }
64
+ },
65
+ "sap.ui.mdc.FilterBar": {
66
+ retrieve: function (oFilterBar) {
67
+ return StateUtil.retrieveExternalState(oFilterBar).then(function (mFilterBarState) {
68
+ // remove sensitive or view state irrelevant fields
69
+ var aPropertiesInfo = oFilterBar.getPropertyInfoSet(),
70
+ mFilter = mFilterBarState.filter || {};
71
+ aPropertiesInfo.filter(function (oPropertyInfo) {
72
+ return mFilter[oPropertyInfo.path] && (oPropertyInfo.removeFromAppState || mFilter[oPropertyInfo.path].length === 0);
73
+ }).forEach(function (oPropertyInfo) {
74
+ delete mFilter[oPropertyInfo.path];
75
+ });
76
+ return mFilterBarState;
77
+ });
78
+ },
79
+ apply: function (oFilterBar, oControlState) {
80
+ if (oControlState) {
81
+ return StateUtil.applyExternalState(oFilterBar, oControlState);
82
+ }
83
+ }
84
+ },
85
+ "sap.ui.mdc.Table": {
86
+ retrieve: function (oTable) {
87
+ return StateUtil.retrieveExternalState(oTable);
88
+ },
89
+ apply: function (oTable, oControlState) {
90
+ if (oControlState) {
91
+ if (!oControlState.supplementaryConfig) {
92
+ oControlState.supplementaryConfig = {};
93
+ }
94
+
95
+ return StateUtil.applyExternalState(oTable, oControlState);
96
+ }
97
+ },
98
+ refreshBinding: function (oTable) {
99
+ var oTableBinding = oTable.getRowBinding();
100
+
101
+ if (oTableBinding) {
102
+ var oRootBinding = oTableBinding.getRootBinding();
103
+
104
+ if (oRootBinding === oTableBinding) {
105
+ // absolute binding
106
+ oTableBinding.refresh();
107
+ } else {
108
+ // relative binding
109
+ var oHeaderContext = oTableBinding.getHeaderContext();
110
+ var sGroupId = oTableBinding.getGroupId();
111
+
112
+ if (oHeaderContext) {
113
+ oHeaderContext.requestSideEffects([{
114
+ $NavigationPropertyPath: ""
115
+ }], sGroupId);
116
+ }
117
+ }
118
+ } else {
119
+ Log.info("Table: " + oTable.getId() + " was not refreshed. No binding found!");
120
+ }
121
+ }
122
+ },
123
+ "sap.uxap.ObjectPageLayout": {
124
+ retrieve: function (oOPLayout) {
125
+ return {
126
+ selectedSection: oOPLayout.getSelectedSection()
127
+ };
128
+ },
129
+ apply: function (oOPLayout, oControlState) {
130
+ oControlState && oOPLayout.setSelectedSection(oControlState.selectedSection);
131
+ },
132
+ refreshBinding: function (oOPLayout) {
133
+ var oBindingContext = oOPLayout.getBindingContext();
134
+ var oBinding = oBindingContext && oBindingContext.getBinding();
135
+
136
+ if (oBinding) {
137
+ var sMetaPath = ModelHelper.getMetaPathForContext(oBindingContext);
138
+ var sStrategy = KeepAliveHelper.getControlRefreshStrategyForContextPath(oOPLayout, sMetaPath);
139
+
140
+ if (sStrategy === "self") {
141
+ // Refresh main context and 1-1 navigation properties or OP
142
+ var oModel = oBindingContext.getModel(),
143
+ oMetaModel = oModel.getMetaModel(),
144
+ oNavigationProperties = CommonUtils.getContextPathProperties(oMetaModel, sMetaPath, {
145
+ $kind: "NavigationProperty"
146
+ }) || {},
147
+ aNavPropertiesToRequest = Object.keys(oNavigationProperties).reduce(function (aPrev, sNavProp) {
148
+ if (oNavigationProperties[sNavProp].$isCollection !== true) {
149
+ aPrev.push({
150
+ $NavigationPropertyPath: sNavProp
151
+ });
152
+ }
153
+
154
+ return aPrev;
155
+ }, []),
156
+ aProperties = [{
157
+ $PropertyPath: "*"
158
+ }],
159
+ sGroupId = oBinding.getGroupId();
160
+ oBindingContext.requestSideEffects(aProperties.concat(aNavPropertiesToRequest), sGroupId);
161
+ } else if (sStrategy === "includingDependents") {
162
+ // Complete refresh
163
+ oBinding.refresh();
164
+ }
165
+ } else {
166
+ Log.info("ObjectPage: " + oOPLayout.getId() + " was not refreshed. No binding found!");
167
+ }
168
+ }
169
+ },
170
+ "sap.fe.macros.table.QuickFilterContainer": {
171
+ retrieve: function (oQuickFilter) {
172
+ return {
173
+ selectedKey: oQuickFilter.getSelectorKey()
174
+ };
175
+ },
176
+ apply: function (oQuickFilter, oControlState) {
177
+ oControlState && oQuickFilter.setSelectorKey(oControlState.selectedKey);
178
+ }
179
+ },
180
+ "sap.m.SegmentedButton": {
181
+ retrieve: function (oSegmentedButton) {
182
+ return {
183
+ selectedKey: oSegmentedButton.getSelectedKey()
184
+ };
185
+ },
186
+ apply: function (oSegmentedButton, oControlState) {
187
+ oControlState && oSegmentedButton.setSelectedKey(oControlState.selectedKey);
188
+ }
189
+ },
190
+ "sap.m.Select": {
191
+ retrieve: function (oSelect) {
192
+ return {
193
+ selectedKey: oSelect.getSelectedKey()
194
+ };
195
+ },
196
+ apply: function (oSelect, oControlState) {
197
+ oControlState && oSelect.setSelectedKey(oControlState.selectedKey);
198
+ }
199
+ },
200
+ "sap.f.DynamicPage": {
201
+ retrieve: function (oDynamicPage) {
202
+ return {
203
+ headerExpanded: oDynamicPage.getHeaderExpanded()
204
+ };
205
+ },
206
+ apply: function (oDynamicPage, oControlState) {
207
+ oControlState && oDynamicPage.setHeaderExpanded(oControlState.headerExpanded);
208
+ }
209
+ },
210
+ "sap.ui.core.mvc.View": {
211
+ retrieve: function (oView) {
212
+ var oController = oView.getController();
213
+
214
+ if (oController && oController.viewState) {
215
+ return oController.viewState.retrieveViewState(oController.viewState);
216
+ }
217
+
218
+ return {};
219
+ },
220
+ apply: function (oView, oControlState, oNavParameters) {
221
+ var oController = oView.getController();
222
+
223
+ if (oController && oController.viewState) {
224
+ return oController.viewState.applyViewState(oControlState, oNavParameters);
225
+ }
226
+ },
227
+ refreshBinding: function (oView) {
228
+ var oController = oView.getController();
229
+
230
+ if (oController && oController.viewState) {
231
+ return oController.viewState.refreshViewBindings();
232
+ }
233
+ }
234
+ },
235
+ "sap.ui.core.ComponentContainer": {
236
+ retrieve: function (oComponentContainer) {
237
+ var oComponent = oComponentContainer.getComponentInstance();
238
+
239
+ if (oComponent) {
240
+ return this.retrieveControlState(oComponent.getRootControl());
241
+ }
242
+
243
+ return {};
244
+ },
245
+ apply: function (oComponentContainer, oControlState, oNavParameters) {
246
+ var oComponent = oComponentContainer.getComponentInstance();
247
+
248
+ if (oComponent) {
249
+ return this.applyControlState(oComponent.getRootControl(), oControlState, oNavParameters);
250
+ }
251
+ }
252
+ }
253
+ };
254
+ /**
255
+ * A controller extension offering hooks for state handling
256
+ *
257
+ * If you need to maintain a specific state for your application, you can use the controller extension.
258
+ *
259
+ * @hideconstructor
260
+ * @public
261
+ * @since 1.85.0
262
+ */
263
+
264
+ var ViewState = (_dec = defineUI5Class("sap.fe.core.controllerextensions.ViewState"), _dec2 = publicExtension(), _dec3 = finalExtension(), _dec4 = publicExtension(), _dec5 = extensible(OverrideExecution.After), _dec6 = privateExtension(), _dec7 = finalExtension(), _dec8 = privateExtension(), _dec9 = finalExtension(), _dec10 = publicExtension(), _dec11 = extensible(OverrideExecution.After), _dec12 = publicExtension(), _dec13 = extensible(OverrideExecution.After), _dec14 = publicExtension(), _dec15 = extensible(OverrideExecution.After), _dec16 = privateExtension(), _dec17 = finalExtension(), _dec18 = publicExtension(), _dec19 = extensible(OverrideExecution.After), _dec20 = privateExtension(), _dec21 = finalExtension(), _dec22 = publicExtension(), _dec23 = extensible(OverrideExecution.After), _dec24 = publicExtension(), _dec25 = finalExtension(), _dec26 = publicExtension(), _dec27 = finalExtension(), _dec28 = publicExtension(), _dec29 = extensible(OverrideExecution.After), _dec30 = privateExtension(), _dec31 = finalExtension(), _dec32 = publicExtension(), _dec33 = extensible(OverrideExecution.Instead), _dec34 = publicExtension(), _dec35 = finalExtension(), _dec36 = privateExtension(), _dec37 = publicExtension(), _dec38 = extensible(OverrideExecution.After), _dec39 = publicExtension(), _dec40 = extensible(OverrideExecution.After), _dec41 = publicExtension(), _dec42 = extensible(OverrideExecution.After), _dec43 = publicExtension(), _dec44 = extensible(OverrideExecution.After), _dec45 = privateExtension(), _dec46 = finalExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
265
+ _inheritsLoose(ViewState, _ControllerExtension);
266
+
267
+ /**
268
+ * Constructor.
269
+ */
270
+ function ViewState() {
271
+ var _this;
272
+
273
+ _this = _ControllerExtension.call(this) || this;
274
+ _this._iRetrievingStateCounter = 0;
275
+ _this._pInitialStateApplied = new Promise(function (resolve) {
276
+ _this._pInitialStateAppliedResolve = resolve;
277
+ });
278
+ return _this;
279
+ }
280
+
281
+ var _proto = ViewState.prototype;
282
+
283
+ _proto.refreshViewBindings = function refreshViewBindings() {
284
+ var _this2 = this;
285
+
286
+ return this.collectResults(this.base.viewState.adaptBindingRefreshControls).then(function (aControls) {
287
+ var oPromiseChain = Promise.resolve();
288
+ aControls.filter(function (oControl) {
289
+ return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
290
+ }).forEach(function (oControl) {
291
+ oPromiseChain = oPromiseChain.then(_this2.refreshControlBinding.bind(_this2, oControl));
292
+ });
293
+ return oPromiseChain;
294
+ });
295
+ }
296
+ /**
297
+ * This function should add all controls relevant for refreshing to the provided control array.
298
+ *
299
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
300
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
301
+ * @param {Array<sap.ui.base.ManagedObject>} aCollectedControls The collected controls
302
+ * @alias sap.fe.core.controllerextensions.ViewState#adaptBindingRefreshControls
303
+ * @protected
304
+ */
305
+ ;
306
+
307
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
308
+ adaptBindingRefreshControls = function adaptBindingRefreshControls(aCollectedControls) {// to be overriden
309
+ };
310
+
311
+ _proto.refreshControlBinding = function refreshControlBinding(oControl) {
312
+ var oControlRefreshBindingHandler = this.getControlRefreshBindingHandler(oControl);
313
+ var oPromiseChain = Promise.resolve();
314
+
315
+ if (typeof oControlRefreshBindingHandler.refreshBinding !== "function") {
316
+ Log.info("refreshBinding handler for control: " + oControl.getMetadata().getName() + " is not provided");
317
+ } else {
318
+ oPromiseChain = oPromiseChain.then(oControlRefreshBindingHandler.refreshBinding.bind(this, oControl));
319
+ }
320
+
321
+ return oPromiseChain;
322
+ }
323
+ /**
324
+ * Returns a map of <code>refreshBinding</code> function for a certain control.
325
+ *
326
+ * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
327
+ * @returns {object} A plain object with one function: <code>refreshBinding</code>
328
+ */
329
+ ;
330
+
331
+ _proto.getControlRefreshBindingHandler = function getControlRefreshBindingHandler(oControl) {
332
+ var oRefreshBindingHandler = {};
333
+
334
+ if (oControl) {
335
+ for (var sType in _mControlStateHandlerMap) {
336
+ if (oControl.isA(sType)) {
337
+ // pass only the refreshBinding handler in an object so that :
338
+ // 1. Application has access only to refreshBinding and not apply and reterive at this stage
339
+ // 2. Application modifications to the object will be reflected here (as we pass by reference)
340
+ oRefreshBindingHandler["refreshBinding"] = _mControlStateHandlerMap[sType].refreshBinding || {};
341
+ break;
342
+ }
343
+ }
344
+ }
345
+
346
+ this.base.viewState.adaptBindingRefreshHandler(oControl, oRefreshBindingHandler);
347
+ return oRefreshBindingHandler;
348
+ }
349
+ /**
350
+ * Customize the <code>refreshBinding</code> function for a certain control.
351
+ *
352
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
353
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
354
+ *
355
+ * @param {sap.ui.base.ManagedObject} oControl The control for which the refresh handler is adapted.
356
+ * @param {Array<object>} oControlHandler A plain object which can have one function: <code>refreshBinding</code>
357
+ *
358
+ * @alias sap.fe.core.controllerextensions.ViewState#adaptBindingRefreshHandler
359
+ * @protected
360
+ */
361
+ ;
362
+
363
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
364
+ adaptBindingRefreshHandler = function adaptBindingRefreshHandler(oControl, oControlHandler) {// to be overriden
365
+ }
366
+ /**
367
+ * Called when the application is suspended due to keep-alive mode.
368
+ *
369
+ * @alias sap.fe.core.controllerextensions.ViewState#onSuspend
370
+ * @public
371
+ */
372
+ ;
373
+
374
+ _proto.onSuspend = function onSuspend() {// to be overriden
375
+ }
376
+ /**
377
+ * Called when the application is restored due to keep-alive mode.
378
+ *
379
+ * @alias sap.fe.core.controllerextensions.ViewState#onRestore
380
+ * @public
381
+ */
382
+ ;
383
+
384
+ _proto.onRestore = function onRestore() {// to be overriden
385
+ }
386
+ /**
387
+ * Destructor method for objects.
388
+ */
389
+ ;
390
+
391
+ _proto.destroy = function destroy() {
392
+ delete this._pInitialStateAppliedResolve;
393
+
394
+ _ControllerExtension.prototype.destroy.call(this);
395
+ }
396
+ /**
397
+ * Helper function to enable multi override. It is adding an additional parameter (array) to the provided
398
+ * function (and its parameters), that will be evaluated via <code>Promise.all</code>.
399
+ *
400
+ * @param {Function} fnCall The function to be called
401
+ * @param args
402
+ * @returns {Promise} A promise to be resolved with the result of all overrides
403
+ */
404
+ ;
405
+
406
+ _proto.collectResults = function collectResults(fnCall) {
407
+ var aResults = [];
408
+
409
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
410
+ args[_key - 1] = arguments[_key];
411
+ }
412
+
413
+ args.push(aResults);
414
+ fnCall.apply(this, args);
415
+ return Promise.all(aResults);
416
+ }
417
+ /**
418
+ * Customize the <code>retrieve</code> and <code>apply</code> functions for a certain control.
419
+ *
420
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
421
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
422
+ *
423
+ * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
424
+ * @param {Array<object>} aControlHandler A list of plain objects with two functions: <code>retrieve</code> and <code>apply</code>
425
+ *
426
+ * @alias sap.fe.core.controllerextensions.ViewState#adaptControlStateHandler
427
+ * @protected
428
+ */
429
+ ;
430
+
431
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
432
+ adaptControlStateHandler = function adaptControlStateHandler(oControl, aControlHandler) {// to be overridden if needed
433
+ }
434
+ /**
435
+ * Returns a map of <code>retrieve</code> and <code>apply</code> functions for a certain control.
436
+ *
437
+ * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
438
+ * @returns {object} A plain object with two functions: <code>retrieve</code> and <code>apply</code>
439
+ */
440
+ ;
441
+
442
+ _proto.getControlStateHandler = function getControlStateHandler(oControl) {
443
+ var aInternalControlStateHandler = [],
444
+ aCustomControlStateHandler = [];
445
+
446
+ if (oControl) {
447
+ for (var sType in _mControlStateHandlerMap) {
448
+ if (oControl.isA(sType)) {
449
+ // avoid direct manipulation of internal _mControlStateHandlerMap
450
+ aInternalControlStateHandler.push(Object.assign({}, _mControlStateHandlerMap[sType]));
451
+ break;
452
+ }
453
+ }
454
+ }
455
+
456
+ this.base.viewState.adaptControlStateHandler(oControl, aCustomControlStateHandler);
457
+ return aInternalControlStateHandler.concat(aCustomControlStateHandler);
458
+ }
459
+ /**
460
+ * This function should add all controls for given view that should be considered for the state handling to the provided control array.
461
+ *
462
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
463
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
464
+ * @param {Array<sap.ui.base.ManagedObject>} aCollectedControls The collected controls
465
+ * @alias sap.fe.core.controllerextensions.ViewState#adaptStateControls
466
+ * @protected
467
+ */
468
+ ;
469
+
470
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
471
+ adaptStateControls = function adaptStateControls(aCollectedControls) {// to be overridden if needed
472
+ }
473
+ /**
474
+ * Returns the key to be used for given control.
475
+ *
476
+ * @param {sap.ui.base.ManagedObject} oControl The control to get state key for
477
+ * @returns {string} The key to be used for storing the controls state
478
+ */
479
+ ;
480
+
481
+ _proto.getStateKey = function getStateKey(oControl) {
482
+ return this.getView().getLocalId(oControl.getId()) || oControl.getId();
483
+ }
484
+ /**
485
+ * Retrieve the view state of this extensions view.
486
+ * When this function is called more than once before finishing, all but the final response will resolve to <code>undefined</code>.
487
+ *
488
+ * @returns {Promise} A promise resolving the view state
489
+ *
490
+ * @alias sap.fe.core.controllerextensions.ViewState#retrieveViewState
491
+ * @public
492
+ */
493
+ ;
494
+
495
+ _proto.retrieveViewState = function retrieveViewState() {
496
+ var _this3 = this;
497
+
498
+ ++this._iRetrievingStateCounter;
499
+ return this._pInitialStateApplied.then(function () {
500
+ return _this3.collectResults(_this3.base.viewState.adaptStateControls);
501
+ }).then(function (aControls) {
502
+ return Promise.all(aControls.filter(function (oControl) {
503
+ return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
504
+ }).map(function (oControl) {
505
+ return _this3.retrieveControlState(oControl).then(function (vResult) {
506
+ return {
507
+ key: _this3.getStateKey(oControl),
508
+ value: vResult
509
+ };
510
+ });
511
+ }));
512
+ }).then(function (aResolvedStates) {
513
+ return aResolvedStates.reduce(function (oStates, mState) {
514
+ var oCurrentState = {};
515
+ oCurrentState[mState.key] = mState.value;
516
+ return mergeObjects(oStates, oCurrentState);
517
+ }, {});
518
+ }).then(function (oViewState) {
519
+ return Promise.resolve(_this3._retrieveAdditionalStates()).then(function (mAdditionalStates) {
520
+ if (mAdditionalStates && Object.keys(mAdditionalStates).length) {
521
+ oViewState[ADDITIONAL_STATES_KEY] = mAdditionalStates;
522
+ }
523
+
524
+ return oViewState;
525
+ });
526
+ }).finally(function () {
527
+ --_this3._iRetrievingStateCounter;
528
+ }).then(function (oViewState) {
529
+ return _this3._iRetrievingStateCounter === 0 ? oViewState : undefined;
530
+ });
531
+ }
532
+ /**
533
+ * Extend the map of additional states (not control bound) to be added to the current view state of the given view.
534
+ *
535
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
536
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
537
+ *
538
+ * @param {object} mAdditionalStates The additional state
539
+ *
540
+ * @alias sap.fe.core.controllerextensions.ViewState#retrieveAdditionalStates
541
+ * @protected
542
+ */
543
+ ;
544
+
545
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
546
+ retrieveAdditionalStates = function retrieveAdditionalStates(mAdditionalStates) {// to be overridden if needed
547
+ }
548
+ /**
549
+ * Returns a map of additional states (not control bound) to be added to the current view state of the given view.
550
+ *
551
+ * @returns {object | Promise<object>} Additional view states
552
+ */
553
+ ;
554
+
555
+ _proto._retrieveAdditionalStates = function _retrieveAdditionalStates() {
556
+ var mAdditionalStates = {};
557
+ this.base.viewState.retrieveAdditionalStates(mAdditionalStates);
558
+ return mAdditionalStates;
559
+ }
560
+ /**
561
+ * Returns the current state for the given control.
562
+ *
563
+ * @param {sap.ui.base.ManagedObject} oControl The object to get the state for
564
+ * @returns {Promise<object>} The state for the given control
565
+ */
566
+ ;
567
+
568
+ _proto.retrieveControlState = function retrieveControlState(oControl) {
569
+ var _this4 = this;
570
+
571
+ var aControlStateHandlers = this.getControlStateHandler(oControl);
572
+ return Promise.all(aControlStateHandlers.map(function (mControlStateHandler) {
573
+ if (typeof mControlStateHandler.retrieve !== "function") {
574
+ throw new Error("controlStateHandler.retrieve is not a function for control: " + oControl.getMetadata().getName());
575
+ }
576
+
577
+ return mControlStateHandler.retrieve.call(_this4, oControl);
578
+ })).then(function (aStates) {
579
+ return aStates.reduce(function (oFinalState, oCurrentState) {
580
+ return mergeObjects(oFinalState, oCurrentState);
581
+ }, {});
582
+ });
583
+ }
584
+ /**
585
+ * Defines whether the view state should only be applied once initially.
586
+ *
587
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
588
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.Instead}.
589
+ *
590
+ * Important:
591
+ * You should only override this method for custom pages and not for the standard ListReportPage and ObjectPage!
592
+ *
593
+ * @returns {boolean} If <code>true</code>, only the initial view state is applied once,
594
+ * else any new view state is also applied on follow-up calls (default)
595
+ *
596
+ * @alias sap.fe.core.controllerextensions.ViewState#applyInitialStateOnly
597
+ * @protected
598
+ */
599
+ ;
600
+
601
+ _proto.applyInitialStateOnly = function applyInitialStateOnly() {
602
+ return true;
603
+ }
604
+ /**
605
+ * Applies the given view state to this extensions view.
606
+ *
607
+ * @param {object} oViewState The view state to apply (can be undefined)
608
+ * @param {object} oNavParameter The current navigation parameter
609
+ * @param {sap.fe.navigation.NavType} oNavParameter.navigationType The actual navigation type
610
+ * @param {object} oNavParameter.selectionVariant The selectionVariant from the navigation
611
+ * @param {object} oNavParameter.selectionVariantDefaults The selectionVariant defaults from the navigation
612
+ * @param {boolean} oNavParameter.requiresStandardVariant Defines whether standard variant must be used in VM
613
+ *
614
+ * @returns {Promise} Promise for async state handling
615
+ *
616
+ * @alias sap.fe.core.controllerextensions.ViewState#applyViewState
617
+ * @public
618
+ */
619
+ ;
620
+
621
+ _proto.applyViewState = function applyViewState(oViewState, oNavParameter) {
622
+ var _this5 = this;
623
+
624
+ if (this.base.viewState.applyInitialStateOnly() && this._getInitialStateApplied()) {
625
+ return Promise.resolve();
626
+ }
627
+
628
+ return this.collectResults(this.base.viewState.onBeforeStateApplied).then(function () {
629
+ return _this5.collectResults(_this5.base.viewState.adaptStateControls);
630
+ }).then(function (aControls) {
631
+ var oPromiseChain = Promise.resolve();
632
+ aControls.filter(function (oControl) {
633
+ return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
634
+ }).forEach(function (oControl) {
635
+ var sKey = _this5.getStateKey(oControl);
636
+
637
+ oPromiseChain = oPromiseChain.then(_this5.applyControlState.bind(_this5, oControl, oViewState ? oViewState[sKey] : undefined, oNavParameter));
638
+ });
639
+ return oPromiseChain;
640
+ }).then(function () {
641
+ if (oNavParameter.navigationType === NavType.iAppState) {
642
+ return _this5.collectResults(_this5.base.viewState.applyAdditionalStates, oViewState ? oViewState[ADDITIONAL_STATES_KEY] : undefined);
643
+ } else {
644
+ return _this5.collectResults(_this5.base.viewState.applyNavigationParameters, oNavParameter);
645
+ }
646
+ }).finally(function () {
647
+ return _this5.collectResults(_this5.base.viewState.onAfterStateApplied).then(_this5._setInitialStateApplied.bind(_this5));
648
+ });
649
+ };
650
+
651
+ _proto._checkIfVariantIdIsAvailable = function _checkIfVariantIdIsAvailable(oVM, sVariantId) {
652
+ var aVariants = oVM.getVariants();
653
+ var bIsControlStateVariantAvailable = false;
654
+ aVariants.forEach(function (oVariant) {
655
+ if (oVariant.key === sVariantId) {
656
+ bIsControlStateVariantAvailable = true;
657
+ }
658
+ });
659
+ return bIsControlStateVariantAvailable;
660
+ };
661
+
662
+ _proto._setInitialStateApplied = function _setInitialStateApplied() {
663
+ if (this._pInitialStateAppliedResolve) {
664
+ var pInitialStateAppliedResolve = this._pInitialStateAppliedResolve;
665
+ delete this._pInitialStateAppliedResolve;
666
+ pInitialStateAppliedResolve();
667
+ }
668
+ };
669
+
670
+ _proto._getInitialStateApplied = function _getInitialStateApplied() {
671
+ return !this._pInitialStateAppliedResolve;
672
+ }
673
+ /**
674
+ * Hook to react before a state for given view is applied.
675
+ *
676
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
677
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
678
+ *
679
+ * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
680
+ *
681
+ * @alias sap.fe.core.controllerextensions.ViewState#onBeforeStateApplied
682
+ * @protected
683
+ */
684
+ ;
685
+
686
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
687
+ onBeforeStateApplied = function onBeforeStateApplied(aPromises) {// to be overriden
688
+ }
689
+ /**
690
+ * Hook to react when state for given view was applied.
691
+ *
692
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
693
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
694
+ *
695
+ * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
696
+ *
697
+ * @alias sap.fe.core.controllerextensions.ViewState#onAfterStateApplied
698
+ * @protected
699
+ */
700
+ ;
701
+
702
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
703
+ onAfterStateApplied = function onAfterStateApplied(aPromises) {// to be overriden
704
+ }
705
+ /**
706
+ * Applying additional, not control related, states - is called only if navigation type is iAppState.
707
+ *
708
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
709
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
710
+ *
711
+ * @param {object} oViewState The current view state
712
+ * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
713
+ *
714
+ * @alias sap.fe.core.controllerextensions.ViewState#applyAdditionalStates
715
+ * @protected
716
+ */
717
+ ;
718
+
719
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
720
+ applyAdditionalStates = function applyAdditionalStates(oViewState, aPromises) {// to be overridden if needed
721
+ }
722
+ /**
723
+ * Apply navigation parameters - is called only if navigation type is not iAppState.
724
+ *
725
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
726
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
727
+ *
728
+ * @param {object} oNavParameter The current navigation parameter
729
+ * @param {sap.fe.navigation.NavType} oNavParameter.navigationType The actual navigation type
730
+ * @param {object} [oNavParameter.selectionVariant] The selectionVariant from the navigation
731
+ * @param {object} [oNavParameter.selectionVariantDefaults] The selectionVariant defaults from the navigation
732
+ * @param {boolean} [oNavParameter.requiresStandardVariant] Defines whether standard variant must be used in VM
733
+ * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
734
+ *
735
+ * @alias sap.fe.core.controllerextensions.ViewState#applyNavigationParameters
736
+ * @protected
737
+ */
738
+ ;
739
+
740
+ _proto.applyNavigationParameters = function applyNavigationParameters( // eslint-disable-next-line @typescript-eslint/no-unused-vars
741
+ oNavParameter, // eslint-disable-next-line @typescript-eslint/no-unused-vars
742
+ aPromises) {// to be overridden if needed
743
+ }
744
+ /**
745
+ * Applying the given state to the given control.
746
+ *
747
+ * @param {sap.ui.base.ManagedObject} oControl The object to apply the given state
748
+ * @param {object} oControlState The state for the given control
749
+ * @param {object} [oNavParameters] The current navigation parameters
750
+ * @returns {any} Return a promise for async state handling
751
+ */
752
+ ;
753
+
754
+ _proto.applyControlState = function applyControlState(oControl, oControlState, oNavParameters) {
755
+ var _this6 = this;
756
+
757
+ var aControlStateHandlers = this.getControlStateHandler(oControl);
758
+ var oPromiseChain = Promise.resolve();
759
+ aControlStateHandlers.forEach(function (mControlStateHandler) {
760
+ if (typeof mControlStateHandler.apply !== "function") {
761
+ throw new Error("controlStateHandler.apply is not a function for control: " + oControl.getMetadata().getName());
762
+ }
763
+
764
+ oPromiseChain = oPromiseChain.then(mControlStateHandler.apply.bind(_this6, oControl, oControlState, oNavParameters));
765
+ });
766
+ return oPromiseChain;
767
+ };
768
+
769
+ _proto.getInterface = function getInterface() {
770
+ return this;
771
+ };
772
+
773
+ return ViewState;
774
+ }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "refreshViewBindings", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "refreshViewBindings"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptBindingRefreshControls", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptBindingRefreshControls"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "refreshControlBinding", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "refreshControlBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getControlRefreshBindingHandler", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "getControlRefreshBindingHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptBindingRefreshHandler", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptBindingRefreshHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onSuspend", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "onSuspend"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRestore", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onRestore"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "collectResults", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "collectResults"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptControlStateHandler", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptControlStateHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getControlStateHandler", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "getControlStateHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptStateControls", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptStateControls"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getStateKey", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "getStateKey"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveViewState", [_dec26, _dec27], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveViewState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveAdditionalStates", [_dec28, _dec29], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveAdditionalStates"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveControlState", [_dec30, _dec31], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveControlState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyInitialStateOnly", [_dec32, _dec33], Object.getOwnPropertyDescriptor(_class2.prototype, "applyInitialStateOnly"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyViewState", [_dec34, _dec35], Object.getOwnPropertyDescriptor(_class2.prototype, "applyViewState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_checkIfVariantIdIsAvailable", [_dec36], Object.getOwnPropertyDescriptor(_class2.prototype, "_checkIfVariantIdIsAvailable"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeStateApplied", [_dec37, _dec38], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeStateApplied"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterStateApplied", [_dec39, _dec40], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterStateApplied"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyAdditionalStates", [_dec41, _dec42], Object.getOwnPropertyDescriptor(_class2.prototype, "applyAdditionalStates"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyNavigationParameters", [_dec43, _dec44], Object.getOwnPropertyDescriptor(_class2.prototype, "applyNavigationParameters"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyControlState", [_dec45, _dec46], Object.getOwnPropertyDescriptor(_class2.prototype, "applyControlState"), _class2.prototype)), _class2)) || _class);
775
+ return ViewState;
776
+ }, false);
777
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlZpZXdTdGF0ZS50cyJdLCJuYW1lcyI6WyJBRERJVElPTkFMX1NUQVRFU19LRVkiLCJOYXZUeXBlIiwiTmF2TGlicmFyeSIsIl9tQ29udHJvbFN0YXRlSGFuZGxlck1hcCIsInJldHJpZXZlIiwib1ZNIiwiZ2V0Q3VycmVudFZhcmlhbnRLZXkiLCJhcHBseSIsIm9Db250cm9sU3RhdGUiLCJ2YXJpYW50SWQiLCJ1bmRlZmluZWQiLCJzVmFyaWFudFJlZmVyZW5jZSIsIl9jaGVja0lmVmFyaWFudElkSXNBdmFpbGFibGUiLCJnZXRTdGFuZGFyZFZhcmlhbnRLZXkiLCJDb250cm9sVmFyaWFudEFwcGx5QVBJIiwiYWN0aXZhdGVWYXJpYW50IiwiZWxlbWVudCIsInZhcmlhbnRSZWZlcmVuY2UiLCJvVGFiQmFyIiwic2VsZWN0ZWRLZXkiLCJnZXRTZWxlY3RlZEtleSIsIm9TZWxlY3RlZEl0ZW0iLCJnZXRJdGVtcyIsImZpbmQiLCJvSXRlbSIsImdldEtleSIsInNldFNlbGVjdGVkSXRlbSIsIm9GaWx0ZXJCYXIiLCJTdGF0ZVV0aWwiLCJyZXRyaWV2ZUV4dGVybmFsU3RhdGUiLCJ0aGVuIiwibUZpbHRlckJhclN0YXRlIiwiYVByb3BlcnRpZXNJbmZvIiwiZ2V0UHJvcGVydHlJbmZvU2V0IiwibUZpbHRlciIsImZpbHRlciIsIm9Qcm9wZXJ0eUluZm8iLCJwYXRoIiwicmVtb3ZlRnJvbUFwcFN0YXRlIiwibGVuZ3RoIiwiZm9yRWFjaCIsImFwcGx5RXh0ZXJuYWxTdGF0ZSIsIm9UYWJsZSIsInN1cHBsZW1lbnRhcnlDb25maWciLCJyZWZyZXNoQmluZGluZyIsIm9UYWJsZUJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwib1Jvb3RCaW5kaW5nIiwiZ2V0Um9vdEJpbmRpbmciLCJyZWZyZXNoIiwib0hlYWRlckNvbnRleHQiLCJnZXRIZWFkZXJDb250ZXh0Iiwic0dyb3VwSWQiLCJnZXRHcm91cElkIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJMb2ciLCJpbmZvIiwiZ2V0SWQiLCJvT1BMYXlvdXQiLCJzZWxlY3RlZFNlY3Rpb24iLCJnZXRTZWxlY3RlZFNlY3Rpb24iLCJzZXRTZWxlY3RlZFNlY3Rpb24iLCJvQmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIm9CaW5kaW5nIiwiZ2V0QmluZGluZyIsInNNZXRhUGF0aCIsIk1vZGVsSGVscGVyIiwiZ2V0TWV0YVBhdGhGb3JDb250ZXh0Iiwic1N0cmF0ZWd5IiwiS2VlcEFsaXZlSGVscGVyIiwiZ2V0Q29udHJvbFJlZnJlc2hTdHJhdGVneUZvckNvbnRleHRQYXRoIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwib05hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiQ29tbW9uVXRpbHMiLCJnZXRDb250ZXh0UGF0aFByb3BlcnRpZXMiLCIka2luZCIsImFOYXZQcm9wZXJ0aWVzVG9SZXF1ZXN0IiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsImFQcmV2Iiwic05hdlByb3AiLCIkaXNDb2xsZWN0aW9uIiwicHVzaCIsImFQcm9wZXJ0aWVzIiwiJFByb3BlcnR5UGF0aCIsImNvbmNhdCIsIm9RdWlja0ZpbHRlciIsImdldFNlbGVjdG9yS2V5Iiwic2V0U2VsZWN0b3JLZXkiLCJvU2VnbWVudGVkQnV0dG9uIiwic2V0U2VsZWN0ZWRLZXkiLCJvU2VsZWN0Iiwib0R5bmFtaWNQYWdlIiwiaGVhZGVyRXhwYW5kZWQiLCJnZXRIZWFkZXJFeHBhbmRlZCIsInNldEhlYWRlckV4cGFuZGVkIiwib1ZpZXciLCJvQ29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJ2aWV3U3RhdGUiLCJyZXRyaWV2ZVZpZXdTdGF0ZSIsIm9OYXZQYXJhbWV0ZXJzIiwiYXBwbHlWaWV3U3RhdGUiLCJyZWZyZXNoVmlld0JpbmRpbmdzIiwib0NvbXBvbmVudENvbnRhaW5lciIsIm9Db21wb25lbnQiLCJnZXRDb21wb25lbnRJbnN0YW5jZSIsInJldHJpZXZlQ29udHJvbFN0YXRlIiwiZ2V0Um9vdENvbnRyb2wiLCJhcHBseUNvbnRyb2xTdGF0ZSIsIlZpZXdTdGF0ZSIsImRlZmluZVVJNUNsYXNzIiwicHVibGljRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsInByaXZhdGVFeHRlbnNpb24iLCJJbnN0ZWFkIiwiX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyIiwiX3BJbml0aWFsU3RhdGVBcHBsaWVkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJfcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlIiwiY29sbGVjdFJlc3VsdHMiLCJiYXNlIiwiYWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzIiwiYUNvbnRyb2xzIiwib1Byb21pc2VDaGFpbiIsIm9Db250cm9sIiwiaXNBIiwicmVmcmVzaENvbnRyb2xCaW5kaW5nIiwiYmluZCIsImFDb2xsZWN0ZWRDb250cm9scyIsIm9Db250cm9sUmVmcmVzaEJpbmRpbmdIYW5kbGVyIiwiZ2V0Q29udHJvbFJlZnJlc2hCaW5kaW5nSGFuZGxlciIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsIm9SZWZyZXNoQmluZGluZ0hhbmRsZXIiLCJzVHlwZSIsImFkYXB0QmluZGluZ1JlZnJlc2hIYW5kbGVyIiwib0NvbnRyb2xIYW5kbGVyIiwib25TdXNwZW5kIiwib25SZXN0b3JlIiwiZGVzdHJveSIsImZuQ2FsbCIsImFSZXN1bHRzIiwiYXJncyIsImFsbCIsImFkYXB0Q29udHJvbFN0YXRlSGFuZGxlciIsImFDb250cm9sSGFuZGxlciIsImdldENvbnRyb2xTdGF0ZUhhbmRsZXIiLCJhSW50ZXJuYWxDb250cm9sU3RhdGVIYW5kbGVyIiwiYUN1c3RvbUNvbnRyb2xTdGF0ZUhhbmRsZXIiLCJhc3NpZ24iLCJhZGFwdFN0YXRlQ29udHJvbHMiLCJnZXRTdGF0ZUtleSIsImdldFZpZXciLCJnZXRMb2NhbElkIiwibWFwIiwidlJlc3VsdCIsImtleSIsInZhbHVlIiwiYVJlc29sdmVkU3RhdGVzIiwib1N0YXRlcyIsIm1TdGF0ZSIsIm9DdXJyZW50U3RhdGUiLCJtZXJnZU9iamVjdHMiLCJvVmlld1N0YXRlIiwiX3JldHJpZXZlQWRkaXRpb25hbFN0YXRlcyIsIm1BZGRpdGlvbmFsU3RhdGVzIiwiZmluYWxseSIsInJldHJpZXZlQWRkaXRpb25hbFN0YXRlcyIsImFDb250cm9sU3RhdGVIYW5kbGVycyIsIm1Db250cm9sU3RhdGVIYW5kbGVyIiwiRXJyb3IiLCJjYWxsIiwiYVN0YXRlcyIsIm9GaW5hbFN0YXRlIiwiYXBwbHlJbml0aWFsU3RhdGVPbmx5Iiwib05hdlBhcmFtZXRlciIsIl9nZXRJbml0aWFsU3RhdGVBcHBsaWVkIiwib25CZWZvcmVTdGF0ZUFwcGxpZWQiLCJzS2V5IiwibmF2aWdhdGlvblR5cGUiLCJpQXBwU3RhdGUiLCJhcHBseUFkZGl0aW9uYWxTdGF0ZXMiLCJhcHBseU5hdmlnYXRpb25QYXJhbWV0ZXJzIiwib25BZnRlclN0YXRlQXBwbGllZCIsIl9zZXRJbml0aWFsU3RhdGVBcHBsaWVkIiwic1ZhcmlhbnRJZCIsImFWYXJpYW50cyIsImdldFZhcmlhbnRzIiwiYklzQ29udHJvbFN0YXRlVmFyaWFudEF2YWlsYWJsZSIsIm9WYXJpYW50IiwicEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlIiwiYVByb21pc2VzIiwiZ2V0SW50ZXJmYWNlIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUEscUJBQXFCLEdBQUcsbUJBQTlCO0FBQUEsTUFDQ0MsT0FBTyxHQUFHQyxVQUFVLENBQUNELE9BRHRCLEMsQ0FFQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUUsd0JBQTZDLEdBQUc7QUFDckQsNENBQXdDO0FBQ3ZDQyxNQUFBQSxRQUFRLEVBQUUsVUFBVUMsR0FBVixFQUFvQjtBQUM3QixlQUFPO0FBQ04sdUJBQWFBLEdBQUcsQ0FB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LE9BTEQ7QUFNQSxhQUFPMkIsYUFBUDtBQUNBLEs7O1dBQ0RxRSxZLEdBQUEsd0JBQWU7QUFDZCxhQUFPLElBQVA7QUFDQSxLOzs7SUFyaUJzQkMsbUI7U0F3aUJUeEYsUyIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIHByaXZhdGVFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEtlZXBBbGl2ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9LZWVwQWxpdmVIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IE5hdkxpYnJhcnkgZnJvbSBcInNhcC9mZS9uYXZpZ2F0aW9uL2xpYnJhcnlcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgQ29udHJvbFZhcmlhbnRBcHBseUFQSSBmcm9tIFwic2FwL3VpL2ZsL2FwcGx5L2FwaS9Db250cm9sVmFyaWFudEFwcGx5QVBJXCI7XG5pbXBvcnQgU3RhdGVVdGlsIGZyb20gXCJzYXAvdWkvbWRjL3AxM24vU3RhdGVVdGlsXCI7XG4vLyBhZGRpdGlvbmFsU3RhdGVzIGFyZSBzdG9yZWQgbmV4dCB0byBjb250cm9sIElEcywgc28gbmFtZSBjbGFzaCBhdm9pZGFuY2UgbmVlZGVkLiBGb3J0dW5hdGVseSBJRHMgaGF2ZSByZXN0cmljdGlvbnM6XG4vLyBcIkFsbG93ZWQgaXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIChjYXBpdGFsL2xvd2VyY2FzZSksIGRpZ2l0cywgdW5kZXJzY29yZXMsIGRhc2hlcywgcG9pbnRzIGFuZC9vciBjb2xvbnMuXCJcbi8vIFRoZXJlZm9yZSBhZGRpbmcgYSBzeW1ib2wgbGlrZSAjIG9yIEBcbmNvbnN0IEFERElUSU9OQUxfU1RBVEVTX0tFWSA9IFwiI2FkZGl0aW9uYWxTdGF0ZXNcIixcblx0TmF2VHlwZSA9IE5hdkxpYnJhcnkuTmF2VHlwZTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIG1ldGhvZHMgdG8gcmV0cmlldmUgJiBhcHBseSBzdGF0ZXMgZm9yIHRoZSBkaWZmZXJlbnQgY29udHJvbHMgLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmNvbnN0IF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcblx0XCJzYXAudWkuZmwudmFyaWFudHMuVmFyaWFudE1hbmFnZW1lbnRcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1ZNOiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFwidmFyaWFudElkXCI6IG9WTS5nZXRDdXJyZW50VmFyaWFudEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvVk06IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRyb2xTdGF0ZSAmJiBvQ29udHJvbFN0YXRlLnZhcmlhbnRJZCAhPT0gdW5kZWZpbmVkICYmIG9Db250cm9sU3RhdGUudmFyaWFudElkICE9PSBvVk0uZ2V0Q3VycmVudFZhcmlhbnRLZXkoKSkge1xuXHRcdFx0XHRjb25zdCBzVmFyaWFudFJlZmVyZW5jZSA9IHRoaXMuX2NoZWNrSWZWYXJpYW50SWRJc0F2YWlsYWJsZShvVk0sIG9Db250cm9sU3RhdGUudmFyaWFudElkKVxuXHRcdFx0XHRcdD8gb0NvbnRyb2xTdGF0ZS52YXJpYW50SWRcblx0XHRcdFx0XHQ6IG9WTS5nZXRTdGFuZGFyZFZhcmlhbnRLZXkoKTtcblx0XHRcdFx0cmV0dXJuIENvbnRyb2xWYXJpYW50QXBwbHlBUEkuYWN0aXZhdGVWYXJpYW50KHtcblx0XHRcdFx0XHRlbGVtZW50OiBvVk0sXG5cdFx0XHRcdFx0dmFyaWFudFJlZmVyZW5jZTogc1ZhcmlhbnRSZWZlcmVuY2Vcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC5tLkljb25UYWJCYXJcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1RhYkJhcjogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1RhYkJhci5nZXRTZWxlY3RlZEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvVGFiQmFyOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0aWYgKG9Db250cm9sU3RhdGUgJiYgb0NvbnRyb2xTdGF0ZS5zZWxlY3RlZEtleSkge1xuXHRcdFx0XHRjb25zdCBvU2VsZWN0ZWRJdGVtID0gb1RhYkJhci5nZXRJdGVtcygpLmZpbmQoZnVuY3Rpb24gKG9JdGVtOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0l0ZW0uZ2V0S2V5KCkgPT09IG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAob1NlbGVjdGVkSXRlbSkge1xuXHRcdFx0XHRcdG9UYWJCYXIuc2V0U2VsZWN0ZWRJdGVtKG9TZWxlY3RlZEl0ZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51aS5tZGMuRmlsdGVyQmFyXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9GaWx0ZXJCYXI6IGFueSkge1xuXHRcdFx0cmV0dXJuIFN0YXRlVXRpbC5yZXRyaWV2ZUV4dGVybmFsU3RhdGUob0ZpbHRlckJhcikudGhlbihmdW5jdGlvbiAobUZpbHRlckJhclN0YXRlOiBhbnkpIHtcblx0XHRcdFx0Ly8gcmVtb3ZlIHNlbnNpdGl2ZSBvciB2aWV3IHN0YXRlIGlycmVsZXZhbnQgZmllbGRzXG5cdFx0XHRcdGNvbnN0IGFQcm9wZXJ0aWVzSW5mbyA9IG9GaWx0ZXJCYXIuZ2V0UHJvcGVydHlJbmZvU2V0KCksXG5cdFx0XHRcdFx0bUZpbHRlciA9IG1GaWx0ZXJCYXJTdGF0ZS5maWx0ZXIgfHwge307XG5cdFx0XHRcdGFQcm9wZXJ0aWVzSW5mb1xuXHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9Qcm9wZXJ0eUluZm86IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0bUZpbHRlcltvUHJvcGVydHlJbmZvLnBhdGhdICYmIChvUHJvcGVydHlJbmZvLnJlbW92ZUZyb21BcHBTdGF0ZSB8fCBtRmlsdGVyW29Qcm9wZXJ0eUluZm8ucGF0aF0ubGVuZ3RoID09PSAwKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvUHJvcGVydHlJbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBtRmlsdGVyW29Qcm9wZXJ0eUluZm8ucGF0aF07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBtRmlsdGVyQmFyU3RhdGU7XG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbiAob0ZpbHRlckJhcjogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKG9GaWx0ZXJCYXIsIG9Db250cm9sU3RhdGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAudWkubWRjLlRhYmxlXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRyZXR1cm4gU3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShvVGFibGUpO1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvVGFibGU6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRyb2xTdGF0ZSkge1xuXHRcdFx0XHRpZiAoIW9Db250cm9sU3RhdGUuc3VwcGxlbWVudGFyeUNvbmZpZykge1xuXHRcdFx0XHRcdG9Db250cm9sU3RhdGUuc3VwcGxlbWVudGFyeUNvbmZpZyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKG9UYWJsZSwgb0NvbnRyb2xTdGF0ZSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyZWZyZXNoQmluZGluZzogZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRjb25zdCBvVGFibGVCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdGlmIChvVGFibGVCaW5kaW5nKSB7XG5cdFx0XHRcdGNvbnN0IG9Sb290QmluZGluZyA9IG9UYWJsZUJpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKTtcblx0XHRcdFx0aWYgKG9Sb290QmluZGluZyA9PT0gb1RhYmxlQmluZGluZykge1xuXHRcdFx0XHRcdC8vIGFic29sdXRlIGJpbmRpbmdcblx0XHRcdFx0XHRvVGFibGVCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyByZWxhdGl2ZSBiaW5kaW5nXG5cdFx0XHRcdFx0Y29uc3Qgb0hlYWRlckNvbnRleHQgPSBvVGFibGVCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdFx0XHRjb25zdCBzR3JvdXBJZCA9IG9UYWJsZUJpbmRpbmcuZ2V0R3JvdXBJZCgpO1xuXG5cdFx0XHRcdFx0aWYgKG9IZWFkZXJDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRvSGVhZGVyQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IFwiXCIgfV0sIHNHcm91cElkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdExvZy5pbmZvKFwiVGFibGU6IFwiICsgb1RhYmxlLmdldElkKCkgKyBcIiB3YXMgbm90IHJlZnJlc2hlZC4gTm8gYmluZGluZyBmb3VuZCFcIik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51eGFwLk9iamVjdFBhZ2VMYXlvdXRcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob09QTGF5b3V0OiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNlbGVjdGVkU2VjdGlvbjogb09QTGF5b3V0LmdldFNlbGVjdGVkU2VjdGlvbigpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvT1BMYXlvdXQ6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRvQ29udHJvbFN0YXRlICYmIG9PUExheW91dC5zZXRTZWxlY3RlZFNlY3Rpb24ob0NvbnRyb2xTdGF0ZS5zZWxlY3RlZFNlY3Rpb24pO1xuXHRcdH0sXG5cdFx0cmVmcmVzaEJpbmRpbmc6IGZ1bmN0aW9uIChvT1BMYXlvdXQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb09QTGF5b3V0LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRjb25zdCBvQmluZGluZyA9IG9CaW5kaW5nQ29udGV4dCAmJiBvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0aWYgKG9CaW5kaW5nKSB7XG5cdFx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IE1vZGVsSGVscGVyLmdldE1ldGFQYXRoRm9yQ29udGV4dChvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRjb25zdCBzU3RyYXRlZ3kgPSBLZWVwQWxpdmVIZWxwZXIuZ2V0Q29udHJvbFJlZnJlc2hTdHJhdGVneUZvckNvbnRleHRQYXRoKG9PUExheW91dCwgc01ldGFQYXRoKTtcblx0XHRcdFx0aWYgKHNTdHJhdGVneSA9PT0gXCJzZWxmXCIpIHtcblx0XHRcdFx0XHQvLyBSZWZyZXNoIG1haW4gY29udGV4dCBhbmQgMS0xIG5hdmlnYXRpb24gcHJvcGVydGllcyBvciBPUFxuXHRcdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uUHJvcGVydGllcyA9XG5cdFx0XHRcdFx0XHRcdENvbW1vblV0aWxzLmdldENvbnRleHRQYXRoUHJvcGVydGllcyhvTWV0YU1vZGVsLCBzTWV0YVBhdGgsIHtcblx0XHRcdFx0XHRcdFx0XHQka2luZDogXCJOYXZpZ2F0aW9uUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0XHR9KSB8fCB7fSxcblx0XHRcdFx0XHRcdGFOYXZQcm9wZXJ0aWVzVG9SZXF1ZXN0ID0gT2JqZWN0LmtleXMob05hdmlnYXRpb25Qcm9wZXJ0aWVzKS5yZWR1Y2UoZnVuY3Rpb24gKGFQcmV2OiBhbnlbXSwgc05hdlByb3A6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRpZiAob05hdmlnYXRpb25Qcm9wZXJ0aWVzW3NOYXZQcm9wXS4kaXNDb2xsZWN0aW9uICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0YVByZXYucHVzaCh7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzTmF2UHJvcCB9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYVByZXY7XG5cdFx0XHRcdFx0XHR9LCBbXSksXG5cdFx0XHRcdFx0XHRhUHJvcGVydGllcyA9IFt7ICRQcm9wZXJ0eVBhdGg6IFwiKlwiIH1dLFxuXHRcdFx0XHRcdFx0c0dyb3VwSWQgPSBvQmluZGluZy5nZXRHcm91cElkKCk7XG5cblx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKGFQcm9wZXJ0aWVzLmNvbmNhdChhTmF2UHJvcGVydGllc1RvUmVxdWVzdCksIHNHcm91cElkKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzU3RyYXRlZ3kgPT09IFwiaW5jbHVkaW5nRGVwZW5kZW50c1wiKSB7XG5cdFx0XHRcdFx0Ly8gQ29tcGxldGUgcmVmcmVzaFxuXHRcdFx0XHRcdG9CaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0TG9nLmluZm8oXCJPYmplY3RQYWdlOiBcIiArIG9PUExheW91dC5nZXRJZCgpICsgXCIgd2FzIG5vdCByZWZyZXNoZWQuIE5vIGJpbmRpbmcgZm91bmQhXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAuZmUubWFjcm9zLnRhYmxlLlF1aWNrRmlsdGVyQ29udGFpbmVyXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9RdWlja0ZpbHRlcjogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1F1aWNrRmlsdGVyLmdldFNlbGVjdG9yS2V5KClcblx0XHRcdH07XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24gKG9RdWlja0ZpbHRlcjogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdG9Db250cm9sU3RhdGUgJiYgb1F1aWNrRmlsdGVyLnNldFNlbGVjdG9yS2V5KG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblx0XCJzYXAubS5TZWdtZW50ZWRCdXR0b25cIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1NlZ21lbnRlZEJ1dHRvbjogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1NlZ21lbnRlZEJ1dHRvbi5nZXRTZWxlY3RlZEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvU2VnbWVudGVkQnV0dG9uOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0b0NvbnRyb2xTdGF0ZSAmJiBvU2VnbWVudGVkQnV0dG9uLnNldFNlbGVjdGVkS2V5KG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblx0XCJzYXAubS5TZWxlY3RcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1NlbGVjdDogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1NlbGVjdC5nZXRTZWxlY3RlZEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvU2VsZWN0OiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0b0NvbnRyb2xTdGF0ZSAmJiBvU2VsZWN0LnNldFNlbGVjdGVkS2V5KG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblx0XCJzYXAuZi5EeW5hbWljUGFnZVwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uIChvRHluYW1pY1BhZ2U6IGFueSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aGVhZGVyRXhwYW5kZWQ6IG9EeW5hbWljUGFnZS5nZXRIZWFkZXJFeHBhbmRlZCgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvRHluYW1pY1BhZ2U6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRvQ29udHJvbFN0YXRlICYmIG9EeW5hbWljUGFnZS5zZXRIZWFkZXJFeHBhbmRlZChvQ29udHJvbFN0YXRlLmhlYWRlckV4cGFuZGVkKTtcblx0XHR9XG5cdH0sXG5cdFwic2FwLnVpLmNvcmUubXZjLlZpZXdcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1ZpZXc6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0XHRpZiAob0NvbnRyb2xsZXIgJiYgb0NvbnRyb2xsZXIudmlld1N0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBvQ29udHJvbGxlci52aWV3U3RhdGUucmV0cmlldmVWaWV3U3RhdGUob0NvbnRyb2xsZXIudmlld1N0YXRlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB7fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbiAob1ZpZXc6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55LCBvTmF2UGFyYW1ldGVyczogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IG9WaWV3LmdldENvbnRyb2xsZXIoKTtcblx0XHRcdGlmIChvQ29udHJvbGxlciAmJiBvQ29udHJvbGxlci52aWV3U3RhdGUpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLnZpZXdTdGF0ZS5hcHBseVZpZXdTdGF0ZShvQ29udHJvbFN0YXRlLCBvTmF2UGFyYW1ldGVycyk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyZWZyZXNoQmluZGluZzogZnVuY3Rpb24gKG9WaWV3OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gb1ZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0aWYgKG9Db250cm9sbGVyICYmIG9Db250cm9sbGVyLnZpZXdTdGF0ZSkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIudmlld1N0YXRlLnJlZnJlc2hWaWV3QmluZGluZ3MoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdFwic2FwLnVpLmNvcmUuQ29tcG9uZW50Q29udGFpbmVyXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9Db21wb25lbnRDb250YWluZXI6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db21wb25lbnRDb250YWluZXIuZ2V0Q29tcG9uZW50SW5zdGFuY2UoKTtcblx0XHRcdGlmIChvQ29tcG9uZW50KSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnJldHJpZXZlQ29udHJvbFN0YXRlKG9Db21wb25lbnQuZ2V0Um9vdENvbnRyb2woKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24gKG9Db21wb25lbnRDb250YWluZXI6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55LCBvTmF2UGFyYW1ldGVyczogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbXBvbmVudENvbnRhaW5lci5nZXRDb21wb25lbnRJbnN0YW5jZSgpO1xuXHRcdFx0aWYgKG9Db21wb25lbnQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlDb250cm9sU3RhdGUob0NvbXBvbmVudC5nZXRSb290Q29udHJvbCgpLCBvQ29udHJvbFN0YXRlLCBvTmF2UGFyYW1ldGVycyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGZvciBzdGF0ZSBoYW5kbGluZ1xuICpcbiAqIElmIHlvdSBuZWVkIHRvIG1haW50YWluIGEgc3BlY2lmaWMgc3RhdGUgZm9yIHlvdXIgYXBwbGljYXRpb24sIHlvdSBjYW4gdXNlIHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbi5cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS44NS4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZVwiKVxuY2xhc3MgVmlld1N0YXRlIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyOiBudW1iZXI7XG5cdHByaXZhdGUgX3BJbml0aWFsU3RhdGVBcHBsaWVkOiBQcm9taXNlPHVua25vd24+O1xuXHRwcml2YXRlIF9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmU/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0LyoqXG5cdCAqIENvbnN0cnVjdG9yLlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLl9pUmV0cmlldmluZ1N0YXRlQ291bnRlciA9IDA7XG5cdFx0dGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWQgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0dGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlID0gcmVzb2x2ZTtcblx0XHR9KTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRyZWZyZXNoVmlld0JpbmRpbmdzKCkge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUuYWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzKS50aGVuKChhQ29udHJvbHM6IGFueSkgPT4ge1xuXHRcdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdGFDb250cm9sc1xuXHRcdFx0XHQuZmlsdGVyKChvQ29udHJvbDogYW55KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZm9yRWFjaCgob0NvbnRyb2w6IGFueSkgPT4ge1xuXHRcdFx0XHRcdG9Qcm9taXNlQ2hhaW4gPSBvUHJvbWlzZUNoYWluLnRoZW4odGhpcy5yZWZyZXNoQ29udHJvbEJpbmRpbmcuYmluZCh0aGlzLCBvQ29udHJvbCkpO1xuXHRcdFx0XHR9KTtcblx0XHRcdHJldHVybiBvUHJvbWlzZUNoYWluO1xuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhZGQgYWxsIGNvbnRyb2xzIHJlbGV2YW50IGZvciByZWZyZXNoaW5nIHRvIHRoZSBwcm92aWRlZCBjb250cm9sIGFycmF5LlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0ge0FycmF5PHNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3Q+fSBhQ29sbGVjdGVkQ29udHJvbHMgVGhlIGNvbGxlY3RlZCBjb250cm9sc1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FkYXB0QmluZGluZ1JlZnJlc2hDb250cm9sc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0YWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzKGFDb2xsZWN0ZWRDb250cm9sczogTWFuYWdlZE9iamVjdFtdKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGVuXG5cdH1cblxuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHJlZnJlc2hDb250cm9sQmluZGluZyhvQ29udHJvbDogYW55KSB7XG5cdFx0Y29uc3Qgb0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIgPSB0aGlzLmdldENvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIob0NvbnRyb2wpO1xuXHRcdGxldCBvUHJvbWlzZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0aWYgKHR5cGVvZiBvQ29udHJvbFJlZnJlc2hCaW5kaW5nSGFuZGxlci5yZWZyZXNoQmluZGluZyAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRMb2cuaW5mbyhcInJlZnJlc2hCaW5kaW5nIGhhbmRsZXIgZm9yIGNvbnRyb2w6IFwiICsgb0NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgKyBcIiBpcyBub3QgcHJvdmlkZWRcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9Qcm9taXNlQ2hhaW4gPSBvUHJvbWlzZUNoYWluLnRoZW4ob0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIucmVmcmVzaEJpbmRpbmcuYmluZCh0aGlzLCBvQ29udHJvbCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2VDaGFpbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgbWFwIG9mIDxjb2RlPnJlZnJlc2hCaW5kaW5nPC9jb2RlPiBmdW5jdGlvbiBmb3IgYSBjZXJ0YWluIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdH0gb0NvbnRyb2wgVGhlIGNvbnRyb2wgdG8gZ2V0IHN0YXRlIGhhbmRsZXIgZm9yXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEEgcGxhaW4gb2JqZWN0IHdpdGggb25lIGZ1bmN0aW9uOiA8Y29kZT5yZWZyZXNoQmluZGluZzwvY29kZT5cblx0ICovXG5cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRDb250cm9sUmVmcmVzaEJpbmRpbmdIYW5kbGVyKG9Db250cm9sOiBhbnkpOiBhbnkge1xuXHRcdGNvbnN0IG9SZWZyZXNoQmluZGluZ0hhbmRsZXI6IGFueSA9IHt9O1xuXHRcdGlmIChvQ29udHJvbCkge1xuXHRcdFx0Zm9yIChjb25zdCBzVHlwZSBpbiBfbUNvbnRyb2xTdGF0ZUhhbmRsZXJNYXApIHtcblx0XHRcdFx0aWYgKG9Db250cm9sLmlzQShzVHlwZSkpIHtcblx0XHRcdFx0XHQvLyBwYXNzIG9ubHkgdGhlIHJlZnJlc2hCaW5kaW5nIGhhbmRsZXIgaW4gYW4gb2JqZWN0IHNvIHRoYXQgOlxuXHRcdFx0XHRcdC8vIDEuIEFwcGxpY2F0aW9uIGhhcyBhY2Nlc3Mgb25seSB0byByZWZyZXNoQmluZGluZyBhbmQgbm90IGFwcGx5IGFuZCByZXRlcml2ZSBhdCB0aGlzIHN0YWdlXG5cdFx0XHRcdFx0Ly8gMi4gQXBwbGljYXRpb24gbW9kaWZpY2F0aW9ucyB0byB0aGUgb2JqZWN0IHdpbGwgYmUgcmVmbGVjdGVkIGhlcmUgKGFzIHdlIHBhc3MgYnkgcmVmZXJlbmNlKVxuXHRcdFx0XHRcdG9SZWZyZXNoQmluZGluZ0hhbmRsZXJbXCJyZWZyZXNoQmluZGluZ1wiXSA9IF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcFtzVHlwZV0ucmVmcmVzaEJpbmRpbmcgfHwge307XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5iYXNlLnZpZXdTdGF0ZS5hZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlcihvQ29udHJvbCwgb1JlZnJlc2hCaW5kaW5nSGFuZGxlcik7XG5cdFx0cmV0dXJuIG9SZWZyZXNoQmluZGluZ0hhbmRsZXI7XG5cdH1cblx0LyoqXG5cdCAqIEN1c3RvbWl6ZSB0aGUgPGNvZGU+cmVmcmVzaEJpbmRpbmc8L2NvZGU+IGZ1bmN0aW9uIGZvciBhIGNlcnRhaW4gY29udHJvbC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0fSBvQ29udHJvbCBUaGUgY29udHJvbCBmb3Igd2hpY2ggdGhlIHJlZnJlc2ggaGFuZGxlciBpcyBhZGFwdGVkLlxuXHQgKiBAcGFyYW0ge0FycmF5PG9iamVjdD59IG9Db250cm9sSGFuZGxlciBBIHBsYWluIG9iamVjdCB3aGljaCBjYW4gaGF2ZSBvbmUgZnVuY3Rpb246IDxjb2RlPnJlZnJlc2hCaW5kaW5nPC9jb2RlPlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FkYXB0QmluZGluZ1JlZnJlc2hIYW5kbGVyXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRhZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlcihvQ29udHJvbDogTWFuYWdlZE9iamVjdCwgb0NvbnRyb2xIYW5kbGVyOiBhbnlbXSkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBzdXNwZW5kZWQgZHVlIHRvIGtlZXAtYWxpdmUgbW9kZS5cblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNvblN1c3BlbmRcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblN1c3BlbmQoKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGVuXG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIHJlc3RvcmVkIGR1ZSB0byBrZWVwLWFsaXZlIG1vZGUuXG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjb25SZXN0b3JlXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25SZXN0b3JlKCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIERlc3RydWN0b3IgbWV0aG9kIGZvciBvYmplY3RzLlxuXHQgKi9cblx0ZGVzdHJveSgpIHtcblx0XHRkZWxldGUgdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlO1xuXHRcdHN1cGVyLmRlc3Ryb3koKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZW5hYmxlIG11bHRpIG92ZXJyaWRlLiBJdCBpcyBhZGRpbmcgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgKGFycmF5KSB0byB0aGUgcHJvdmlkZWRcblx0ICogZnVuY3Rpb24gKGFuZCBpdHMgcGFyYW1ldGVycyksIHRoYXQgd2lsbCBiZSBldmFsdWF0ZWQgdmlhIDxjb2RlPlByb21pc2UuYWxsPC9jb2RlPi5cblx0ICpcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm5DYWxsIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIGFyZ3Ncblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0byBiZSByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQgb2YgYWxsIG92ZXJyaWRlc1xuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRjb2xsZWN0UmVzdWx0cyhmbkNhbGw6IEZ1bmN0aW9uLCAuLi5hcmdzOiBhbnlbXSkge1xuXHRcdGNvbnN0IGFSZXN1bHRzOiBhbnlbXSA9IFtdO1xuXHRcdGFyZ3MucHVzaChhUmVzdWx0cyk7XG5cdFx0Zm5DYWxsLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChhUmVzdWx0cyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3VzdG9taXplIHRoZSA8Y29kZT5yZXRyaWV2ZTwvY29kZT4gYW5kIDxjb2RlPmFwcGx5PC9jb2RlPiBmdW5jdGlvbnMgZm9yIGEgY2VydGFpbiBjb250cm9sLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5iYXNlLk1hbmFnZWRPYmplY3R9IG9Db250cm9sIFRoZSBjb250cm9sIHRvIGdldCBzdGF0ZSBoYW5kbGVyIGZvclxuXHQgKiBAcGFyYW0ge0FycmF5PG9iamVjdD59IGFDb250cm9sSGFuZGxlciBBIGxpc3Qgb2YgcGxhaW4gb2JqZWN0cyB3aXRoIHR3byBmdW5jdGlvbnM6IDxjb2RlPnJldHJpZXZlPC9jb2RlPiBhbmQgPGNvZGU+YXBwbHk8L2NvZGU+XG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYWRhcHRDb250cm9sU3RhdGVIYW5kbGVyXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRhZGFwdENvbnRyb2xTdGF0ZUhhbmRsZXIob0NvbnRyb2w6IE1hbmFnZWRPYmplY3QsIGFDb250cm9sSGFuZGxlcjogb2JqZWN0W10pIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuIGlmIG5lZWRlZFxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBtYXAgb2YgPGNvZGU+cmV0cmlldmU8L2NvZGU+IGFuZCA8Y29kZT5hcHBseTwvY29kZT4gZnVuY3Rpb25zIGZvciBhIGNlcnRhaW4gY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0fSBvQ29udHJvbCBUaGUgY29udHJvbCB0byBnZXQgc3RhdGUgaGFuZGxlciBmb3Jcblx0ICogQHJldHVybnMge29iamVjdH0gQSBwbGFpbiBvYmplY3Qgd2l0aCB0d28gZnVuY3Rpb25zOiA8Y29kZT5yZXRyaWV2ZTwvY29kZT4gYW5kIDxjb2RlPmFwcGx5PC9jb2RlPlxuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRDb250cm9sU3RhdGVIYW5kbGVyKG9Db250cm9sOiBhbnkpIHtcblx0XHRjb25zdCBhSW50ZXJuYWxDb250cm9sU3RhdGVIYW5kbGVyID0gW10sXG5cdFx0XHRhQ3VzdG9tQ29udHJvbFN0YXRlSGFuZGxlcjogYW55W10gPSBbXTtcblx0XHRpZiAob0NvbnRyb2wpIHtcblx0XHRcdGZvciAoY29uc3Qgc1R5cGUgaW4gX21Db250cm9sU3RhdGVIYW5kbGVyTWFwKSB7XG5cdFx0XHRcdGlmIChvQ29udHJvbC5pc0Eoc1R5cGUpKSB7XG5cdFx0XHRcdFx0Ly8gYXZvaWQgZGlyZWN0IG1hbmlwdWxhdGlvbiBvZiBpbnRlcm5hbCBfbUNvbnRyb2xTdGF0ZUhhbmRsZXJNYXBcblx0XHRcdFx0XHRhSW50ZXJuYWxDb250cm9sU3RhdGVIYW5kbGVyLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgX21Db250cm9sU3RhdGVIYW5kbGVyTWFwW3NUeXBlXSkpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuYmFzZS52aWV3U3RhdGUuYWRhcHRDb250cm9sU3RhdGVIYW5kbGVyKG9Db250cm9sLCBhQ3VzdG9tQ29udHJvbFN0YXRlSGFuZGxlcik7XG5cdFx0cmV0dXJuIGFJbnRlcm5hbENvbnRyb2xTdGF0ZUhhbmRsZXIuY29uY2F0KGFDdXN0b21Db250cm9sU3RhdGVIYW5kbGVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhZGQgYWxsIGNvbnRyb2xzIGZvciBnaXZlbiB2aWV3IHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZm9yIHRoZSBzdGF0ZSBoYW5kbGluZyB0byB0aGUgcHJvdmlkZWQgY29udHJvbCBhcnJheS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIHtBcnJheTxzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0Pn0gYUNvbGxlY3RlZENvbnRyb2xzIFRoZSBjb2xsZWN0ZWQgY29udHJvbHNcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhZGFwdFN0YXRlQ29udHJvbHNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFkYXB0U3RhdGVDb250cm9scyhhQ29sbGVjdGVkQ29udHJvbHM6IE1hbmFnZWRPYmplY3RbXSkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUga2V5IHRvIGJlIHVzZWQgZm9yIGdpdmVuIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdH0gb0NvbnRyb2wgVGhlIGNvbnRyb2wgdG8gZ2V0IHN0YXRlIGtleSBmb3Jcblx0ICogQHJldHVybnMge3N0cmluZ30gVGhlIGtleSB0byBiZSB1c2VkIGZvciBzdG9yaW5nIHRoZSBjb250cm9scyBzdGF0ZVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldFN0YXRlS2V5KG9Db250cm9sOiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TG9jYWxJZChvQ29udHJvbC5nZXRJZCgpKSB8fCBvQ29udHJvbC5nZXRJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSB2aWV3IHN0YXRlIG9mIHRoaXMgZXh0ZW5zaW9ucyB2aWV3LlxuXHQgKiBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGJlZm9yZSBmaW5pc2hpbmcsIGFsbCBidXQgdGhlIGZpbmFsIHJlc3BvbnNlIHdpbGwgcmVzb2x2ZSB0byA8Y29kZT51bmRlZmluZWQ8L2NvZGU+LlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHJlc29sdmluZyB0aGUgdmlldyBzdGF0ZVxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI3JldHJpZXZlVmlld1N0YXRlXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRyZXRyaWV2ZVZpZXdTdGF0ZSgpIHtcblx0XHQrK3RoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyO1xuXHRcdHJldHVybiB0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0UmVzdWx0cyh0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0U3RhdGVDb250cm9scyk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKGFDb250cm9sczogYW55KSA9PiB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRhQ29udHJvbHNcblx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9Db250cm9sOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5tYXAoKG9Db250cm9sOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMucmV0cmlldmVDb250cm9sU3RhdGUob0NvbnRyb2wpLnRoZW4oKHZSZXN1bHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRrZXk6IHRoaXMuZ2V0U3RhdGVLZXkob0NvbnRyb2wpLFxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHZSZXN1bHRcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKGFSZXNvbHZlZFN0YXRlczogYW55KSB7XG5cdFx0XHRcdHJldHVybiBhUmVzb2x2ZWRTdGF0ZXMucmVkdWNlKGZ1bmN0aW9uIChvU3RhdGVzOiBhbnksIG1TdGF0ZTogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0N1cnJlbnRTdGF0ZTogYW55ID0ge307XG5cdFx0XHRcdFx0b0N1cnJlbnRTdGF0ZVttU3RhdGUua2V5XSA9IG1TdGF0ZS52YWx1ZTtcblx0XHRcdFx0XHRyZXR1cm4gbWVyZ2VPYmplY3RzKG9TdGF0ZXMsIG9DdXJyZW50U3RhdGUpO1xuXHRcdFx0XHR9LCB7fSk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKG9WaWV3U3RhdGU6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3JldHJpZXZlQWRkaXRpb25hbFN0YXRlcygpKS50aGVuKGZ1bmN0aW9uIChtQWRkaXRpb25hbFN0YXRlczogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG1BZGRpdGlvbmFsU3RhdGVzICYmIE9iamVjdC5rZXlzKG1BZGRpdGlvbmFsU3RhdGVzKS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdG9WaWV3U3RhdGVbQURESVRJT05BTF9TVEFURVNfS0VZXSA9IG1BZGRpdGlvbmFsU3RhdGVzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gb1ZpZXdTdGF0ZTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHQtLXRoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKChvVmlld1N0YXRlOiBhbnkpID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyID09PSAwID8gb1ZpZXdTdGF0ZSA6IHVuZGVmaW5lZDtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4dGVuZCB0aGUgbWFwIG9mIGFkZGl0aW9uYWwgc3RhdGVzIChub3QgY29udHJvbCBib3VuZCkgdG8gYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgdmlldyBzdGF0ZSBvZiB0aGUgZ2l2ZW4gdmlldy5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG1BZGRpdGlvbmFsU3RhdGVzIFRoZSBhZGRpdGlvbmFsIHN0YXRlXG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjcmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRyZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXMobUFkZGl0aW9uYWxTdGF0ZXM6IG9iamVjdCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIG1hcCBvZiBhZGRpdGlvbmFsIHN0YXRlcyAobm90IGNvbnRyb2wgYm91bmQpIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHZpZXcgc3RhdGUgb2YgdGhlIGdpdmVuIHZpZXcuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtvYmplY3QgfCBQcm9taXNlPG9iamVjdD59IEFkZGl0aW9uYWwgdmlldyBzdGF0ZXNcblx0ICovXG5cdF9yZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXMoKSB7XG5cdFx0Y29uc3QgbUFkZGl0aW9uYWxTdGF0ZXMgPSB7fTtcblx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLnJldHJpZXZlQWRkaXRpb25hbFN0YXRlcyhtQWRkaXRpb25hbFN0YXRlcyk7XG5cdFx0cmV0dXJuIG1BZGRpdGlvbmFsU3RhdGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgZm9yIHRoZSBnaXZlbiBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5iYXNlLk1hbmFnZWRPYmplY3R9IG9Db250cm9sIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBzdGF0ZSBmb3Jcblx0ICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn0gVGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gY29udHJvbFxuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRyZXRyaWV2ZUNvbnRyb2xTdGF0ZShvQ29udHJvbDogYW55KSB7XG5cdFx0Y29uc3QgYUNvbnRyb2xTdGF0ZUhhbmRsZXJzID0gdGhpcy5nZXRDb250cm9sU3RhdGVIYW5kbGVyKG9Db250cm9sKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRhQ29udHJvbFN0YXRlSGFuZGxlcnMubWFwKChtQ29udHJvbFN0YXRlSGFuZGxlcjogYW55KSA9PiB7XG5cdFx0XHRcdGlmICh0eXBlb2YgbUNvbnRyb2xTdGF0ZUhhbmRsZXIucmV0cmlldmUgIT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImNvbnRyb2xTdGF0ZUhhbmRsZXIucmV0cmlldmUgaXMgbm90IGEgZnVuY3Rpb24gZm9yIGNvbnRyb2w6IFwiICsgb0NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtQ29udHJvbFN0YXRlSGFuZGxlci5yZXRyaWV2ZS5jYWxsKHRoaXMsIG9Db250cm9sKTtcblx0XHRcdH0pXG5cdFx0KS50aGVuKChhU3RhdGVzOiBhbnlbXSkgPT4ge1xuXHRcdFx0cmV0dXJuIGFTdGF0ZXMucmVkdWNlKGZ1bmN0aW9uIChvRmluYWxTdGF0ZTogYW55LCBvQ3VycmVudFN0YXRlOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG1lcmdlT2JqZWN0cyhvRmluYWxTdGF0ZSwgb0N1cnJlbnRTdGF0ZSk7XG5cdFx0XHR9LCB7fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyB3aGV0aGVyIHRoZSB2aWV3IHN0YXRlIHNob3VsZCBvbmx5IGJlIGFwcGxpZWQgb25jZSBpbml0aWFsbHkuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkfS5cblx0ICpcblx0ICogSW1wb3J0YW50OlxuXHQgKiBZb3Ugc2hvdWxkIG9ubHkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGN1c3RvbSBwYWdlcyBhbmQgbm90IGZvciB0aGUgc3RhbmRhcmQgTGlzdFJlcG9ydFBhZ2UgYW5kIE9iamVjdFBhZ2UhXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBJZiA8Y29kZT50cnVlPC9jb2RlPiwgb25seSB0aGUgaW5pdGlhbCB2aWV3IHN0YXRlIGlzIGFwcGxpZWQgb25jZSxcblx0ICogZWxzZSBhbnkgbmV3IHZpZXcgc3RhdGUgaXMgYWxzbyBhcHBsaWVkIG9uIGZvbGxvdy11cCBjYWxscyAoZGVmYXVsdClcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhcHBseUluaXRpYWxTdGF0ZU9ubHlcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdGFwcGx5SW5pdGlhbFN0YXRlT25seSgpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHQvKipcblx0ICogQXBwbGllcyB0aGUgZ2l2ZW4gdmlldyBzdGF0ZSB0byB0aGlzIGV4dGVuc2lvbnMgdmlldy5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9WaWV3U3RhdGUgVGhlIHZpZXcgc3RhdGUgdG8gYXBwbHkgKGNhbiBiZSB1bmRlZmluZWQpXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvTmF2UGFyYW1ldGVyIFRoZSBjdXJyZW50IG5hdmlnYXRpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSB7c2FwLmZlLm5hdmlnYXRpb24uTmF2VHlwZX0gb05hdlBhcmFtZXRlci5uYXZpZ2F0aW9uVHlwZSBUaGUgYWN0dWFsIG5hdmlnYXRpb24gdHlwZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50IFRoZSBzZWxlY3Rpb25WYXJpYW50IGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZQYXJhbWV0ZXIuc2VsZWN0aW9uVmFyaWFudERlZmF1bHRzIFRoZSBzZWxlY3Rpb25WYXJpYW50IGRlZmF1bHRzIGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHtib29sZWFufSBvTmF2UGFyYW1ldGVyLnJlcXVpcmVzU3RhbmRhcmRWYXJpYW50IERlZmluZXMgd2hldGhlciBzdGFuZGFyZCB2YXJpYW50IG11c3QgYmUgdXNlZCBpbiBWTVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSBmb3IgYXN5bmMgc3RhdGUgaGFuZGxpbmdcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhcHBseVZpZXdTdGF0ZVxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXBwbHlWaWV3U3RhdGUoXG5cdFx0b1ZpZXdTdGF0ZTogYW55LFxuXHRcdG9OYXZQYXJhbWV0ZXI6IHtcblx0XHRcdG5hdmlnYXRpb25UeXBlOiBhbnk7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50Pzogb2JqZWN0O1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudERlZmF1bHRzPzogb2JqZWN0O1xuXHRcdFx0cmVxdWlyZXNTdGFuZGFyZFZhcmlhbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRpZiAodGhpcy5iYXNlLnZpZXdTdGF0ZS5hcHBseUluaXRpYWxTdGF0ZU9ubHkoKSAmJiB0aGlzLl9nZXRJbml0aWFsU3RhdGVBcHBsaWVkKCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdFJlc3VsdHModGhpcy5iYXNlLnZpZXdTdGF0ZS5vbkJlZm9yZVN0YXRlQXBwbGllZClcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29sbGVjdFJlc3VsdHModGhpcy5iYXNlLnZpZXdTdGF0ZS5hZGFwdFN0YXRlQ29udHJvbHMpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKChhQ29udHJvbHM6IGFueSkgPT4ge1xuXHRcdFx0XHRsZXQgb1Byb21pc2VDaGFpbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRhQ29udHJvbHNcblx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChvQ29udHJvbDogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRyb2wgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQShcInNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3RcIik7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuZm9yRWFjaCgob0NvbnRyb2w6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0tleSA9IHRoaXMuZ2V0U3RhdGVLZXkob0NvbnRyb2wpO1xuXHRcdFx0XHRcdFx0b1Byb21pc2VDaGFpbiA9IG9Qcm9taXNlQ2hhaW4udGhlbihcblx0XHRcdFx0XHRcdFx0dGhpcy5hcHBseUNvbnRyb2xTdGF0ZS5iaW5kKHRoaXMsIG9Db250cm9sLCBvVmlld1N0YXRlID8gb1ZpZXdTdGF0ZVtzS2V5XSA6IHVuZGVmaW5lZCwgb05hdlBhcmFtZXRlcilcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBvUHJvbWlzZUNoYWluO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0aWYgKG9OYXZQYXJhbWV0ZXIubmF2aWdhdGlvblR5cGUgPT09IE5hdlR5cGUuaUFwcFN0YXRlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY29sbGVjdFJlc3VsdHMoXG5cdFx0XHRcdFx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLmFwcGx5QWRkaXRpb25hbFN0YXRlcyxcblx0XHRcdFx0XHRcdG9WaWV3U3RhdGUgPyBvVmlld1N0YXRlW0FERElUSU9OQUxfU1RBVEVTX0tFWV0gOiB1bmRlZmluZWRcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUuYXBwbHlOYXZpZ2F0aW9uUGFyYW1ldGVycywgb05hdlBhcmFtZXRlcik7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUub25BZnRlclN0YXRlQXBwbGllZCkudGhlbih0aGlzLl9zZXRJbml0aWFsU3RhdGVBcHBsaWVkLmJpbmQodGhpcykpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdF9jaGVja0lmVmFyaWFudElkSXNBdmFpbGFibGUob1ZNOiBhbnksIHNWYXJpYW50SWQ6IGFueSkge1xuXHRcdGNvbnN0IGFWYXJpYW50cyA9IG9WTS5nZXRWYXJpYW50cygpO1xuXHRcdGxldCBiSXNDb250cm9sU3RhdGVWYXJpYW50QXZhaWxhYmxlID0gZmFsc2U7XG5cdFx0YVZhcmlhbnRzLmZvckVhY2goZnVuY3Rpb24gKG9WYXJpYW50OiBhbnkpIHtcblx0XHRcdGlmIChvVmFyaWFudC5rZXkgPT09IHNWYXJpYW50SWQpIHtcblx0XHRcdFx0YklzQ29udHJvbFN0YXRlVmFyaWFudEF2YWlsYWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGJJc0NvbnRyb2xTdGF0ZVZhcmlhbnRBdmFpbGFibGU7XG5cdH1cblxuXHRfc2V0SW5pdGlhbFN0YXRlQXBwbGllZCgpIHtcblx0XHRpZiAodGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlKSB7XG5cdFx0XHRjb25zdCBwSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUgPSB0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmU7XG5cdFx0XHRkZWxldGUgdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlO1xuXHRcdFx0cEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cdF9nZXRJbml0aWFsU3RhdGVBcHBsaWVkKCkge1xuXHRcdHJldHVybiAhdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgdG8gcmVhY3QgYmVmb3JlIGEgc3RhdGUgZm9yIGdpdmVuIHZpZXcgaXMgYXBwbGllZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtQcm9taXNlfSBhUHJvbWlzZXMgRXh0ZW5zaWJsZSBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZ1xuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI29uQmVmb3JlU3RhdGVBcHBsaWVkXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZVN0YXRlQXBwbGllZChhUHJvbWlzZXM6IFByb21pc2U8YW55Pikge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgdG8gcmVhY3Qgd2hlbiBzdGF0ZSBmb3IgZ2l2ZW4gdmlldyB3YXMgYXBwbGllZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtQcm9taXNlfSBhUHJvbWlzZXMgRXh0ZW5zaWJsZSBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZ1xuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI29uQWZ0ZXJTdGF0ZUFwcGxpZWRcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQWZ0ZXJTdGF0ZUFwcGxpZWQoYVByb21pc2VzOiBQcm9taXNlPGFueT4pIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZW5cblx0fVxuXG5cdC8qKlxuXHQgKiBBcHBseWluZyBhZGRpdGlvbmFsLCBub3QgY29udHJvbCByZWxhdGVkLCBzdGF0ZXMgLSBpcyBjYWxsZWQgb25seSBpZiBuYXZpZ2F0aW9uIHR5cGUgaXMgaUFwcFN0YXRlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZpZXdTdGF0ZSBUaGUgY3VycmVudCB2aWV3IHN0YXRlXG5cdCAqIEBwYXJhbSB7UHJvbWlzZX0gYVByb21pc2VzIEV4dGVuc2libGUgYXJyYXkgb2YgcHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmdcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhcHBseUFkZGl0aW9uYWxTdGF0ZXNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFwcGx5QWRkaXRpb25hbFN0YXRlcyhvVmlld1N0YXRlOiBvYmplY3QsIGFQcm9taXNlczogUHJvbWlzZTxhbnk+KSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWRcblx0fVxuXG5cdC8qKlxuXHQgKiBBcHBseSBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMgLSBpcyBjYWxsZWQgb25seSBpZiBuYXZpZ2F0aW9uIHR5cGUgaXMgbm90IGlBcHBTdGF0ZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZQYXJhbWV0ZXIgVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHtzYXAuZmUubmF2aWdhdGlvbi5OYXZUeXBlfSBvTmF2UGFyYW1ldGVyLm5hdmlnYXRpb25UeXBlIFRoZSBhY3R1YWwgbmF2aWdhdGlvbiB0eXBlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50XSBUaGUgc2VsZWN0aW9uVmFyaWFudCBmcm9tIHRoZSBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50RGVmYXVsdHNdIFRoZSBzZWxlY3Rpb25WYXJpYW50IGRlZmF1bHRzIGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHtib29sZWFufSBbb05hdlBhcmFtZXRlci5yZXF1aXJlc1N0YW5kYXJkVmFyaWFudF0gRGVmaW5lcyB3aGV0aGVyIHN0YW5kYXJkIHZhcmlhbnQgbXVzdCBiZSB1c2VkIGluIFZNXG5cdCAqIEBwYXJhbSB7UHJvbWlzZX0gYVByb21pc2VzIEV4dGVuc2libGUgYXJyYXkgb2YgcHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmdcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhcHBseU5hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXBwbHlOYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdFx0b05hdlBhcmFtZXRlcjoge1xuXHRcdFx0bmF2aWdhdGlvblR5cGU6IGFueTtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnQ/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50RGVmYXVsdHM/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0XHRyZXF1aXJlc1N0YW5kYXJkVmFyaWFudD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdFx0fSxcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdFx0YVByb21pc2VzOiBQcm9taXNlPGFueT5cblx0KSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWRcblx0fVxuXG5cdC8qKlxuXHQgKiBBcHBseWluZyB0aGUgZ2l2ZW4gc3RhdGUgdG8gdGhlIGdpdmVuIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdH0gb0NvbnRyb2wgVGhlIG9iamVjdCB0byBhcHBseSB0aGUgZ2l2ZW4gc3RhdGVcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250cm9sU3RhdGUgVGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gY29udHJvbFxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29OYXZQYXJhbWV0ZXJzXSBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMge2FueX0gUmV0dXJuIGEgcHJvbWlzZSBmb3IgYXN5bmMgc3RhdGUgaGFuZGxpbmdcblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXBwbHlDb250cm9sU3RhdGUob0NvbnRyb2w6IGFueSwgb0NvbnRyb2xTdGF0ZTogb2JqZWN0LCBvTmF2UGFyYW1ldGVycz86IG9iamVjdCkge1xuXHRcdGNvbnN0IGFDb250cm9sU3RhdGVIYW5kbGVycyA9IHRoaXMuZ2V0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbCk7XG5cdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRhQ29udHJvbFN0YXRlSGFuZGxlcnMuZm9yRWFjaCgobUNvbnRyb2xTdGF0ZUhhbmRsZXI6IGFueSkgPT4ge1xuXHRcdFx0aWYgKHR5cGVvZiBtQ29udHJvbFN0YXRlSGFuZGxlci5hcHBseSAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImNvbnRyb2xTdGF0ZUhhbmRsZXIuYXBwbHkgaXMgbm90IGEgZnVuY3Rpb24gZm9yIGNvbnRyb2w6IFwiICsgb0NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkpO1xuXHRcdFx0fVxuXHRcdFx0b1Byb21pc2VDaGFpbiA9IG9Qcm9taXNlQ2hhaW4udGhlbihtQ29udHJvbFN0YXRlSGFuZGxlci5hcHBseS5iaW5kKHRoaXMsIG9Db250cm9sLCBvQ29udHJvbFN0YXRlLCBvTmF2UGFyYW1ldGVycykpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBvUHJvbWlzZUNoYWluO1xuXHR9XG5cdGdldEludGVyZmFjZSgpIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBWaWV3U3RhdGU7XG4iXX0=