@sapui5/sap.fe.core 1.97.0 → 1.100.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. package/package.json +7 -4
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +309 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +315 -0
  5. package/src/sap/fe/core/AppComponent.js +389 -397
  6. package/src/sap/fe/core/AppComponent.ts +403 -0
  7. package/src/sap/fe/core/AppStateHandler.js +198 -181
  8. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  9. package/src/sap/fe/core/BaseController.js +83 -58
  10. package/src/sap/fe/core/BaseController.ts +68 -0
  11. package/src/sap/fe/core/BusyLocker.js +105 -121
  12. package/src/sap/fe/core/BusyLocker.ts +98 -0
  13. package/src/sap/fe/core/CommonUtils.js +2164 -2379
  14. package/src/sap/fe/core/CommonUtils.ts +2177 -0
  15. package/src/sap/fe/core/ExtensionAPI.js +279 -266
  16. package/src/sap/fe/core/ExtensionAPI.ts +250 -0
  17. package/src/sap/fe/core/PageController.js +218 -125
  18. package/src/sap/fe/core/PageController.ts +129 -0
  19. package/src/sap/fe/core/RouterProxy.js +924 -807
  20. package/src/sap/fe/core/RouterProxy.ts +840 -0
  21. package/src/sap/fe/core/Synchronization.js +41 -35
  22. package/src/sap/fe/core/Synchronization.ts +29 -0
  23. package/src/sap/fe/core/TemplateComponent.js +173 -155
  24. package/src/sap/fe/core/TemplateComponent.ts +173 -0
  25. package/src/sap/fe/core/TemplateModel.js +79 -54
  26. package/src/sap/fe/core/TemplateModel.ts +63 -0
  27. package/src/sap/fe/core/TransactionHelper.js +1560 -1579
  28. package/src/sap/fe/core/TransactionHelper.ts +1717 -0
  29. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
  30. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  31. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
  32. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  33. package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
  34. package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  35. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  36. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  37. package/src/sap/fe/core/actions/draft.js +521 -581
  38. package/src/sap/fe/core/actions/draft.ts +566 -0
  39. package/src/sap/fe/core/actions/messageHandling.js +564 -511
  40. package/src/sap/fe/core/actions/messageHandling.ts +552 -0
  41. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  42. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  43. package/src/sap/fe/core/actions/operations.js +1093 -1211
  44. package/src/sap/fe/core/actions/operations.ts +1192 -0
  45. package/src/sap/fe/core/actions/sticky.js +114 -104
  46. package/src/sap/fe/core/actions/sticky.ts +119 -0
  47. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +70 -66
  48. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  49. package/src/sap/fe/core/controllerextensions/EditFlow.js +1594 -1701
  50. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  51. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +80 -54
  52. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  53. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +719 -505
  54. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  55. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +797 -813
  56. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  57. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1005 -973
  58. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  59. package/src/sap/fe/core/controllerextensions/KPIManagement.js +530 -476
  60. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +137 -46
  61. package/src/sap/fe/core/controllerextensions/MassEdit.js +144 -0
  62. package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  63. package/src/sap/fe/core/controllerextensions/MessageHandler.js +234 -232
  64. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  65. package/src/sap/fe/core/controllerextensions/PageReady.js +302 -337
  66. package/src/sap/fe/core/controllerextensions/PageReady.ts +23 -17
  67. package/src/sap/fe/core/controllerextensions/Paginator.js +189 -148
  68. package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  69. package/src/sap/fe/core/controllerextensions/Placeholder.js +158 -146
  70. package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  71. package/src/sap/fe/core/controllerextensions/Routing.js +145 -106
  72. package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  73. package/src/sap/fe/core/controllerextensions/RoutingListener.js +8 -6
  74. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  75. package/src/sap/fe/core/controllerextensions/Share.js +220 -244
  76. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  77. package/src/sap/fe/core/controllerextensions/SideEffects.js +593 -634
  78. package/src/sap/fe/core/controllerextensions/SideEffects.ts +29 -27
  79. package/src/sap/fe/core/controllerextensions/ViewState.js +789 -806
  80. package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  81. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -3
  82. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  83. package/src/sap/fe/core/controls/CommandExecution.js +68 -66
  84. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  85. package/src/sap/fe/core/controls/ConditionalWrapper.js +91 -75
  86. package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  87. package/src/sap/fe/core/controls/CustomQuickViewPage.js +131 -125
  88. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  89. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +105 -110
  90. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  91. package/src/sap/fe/core/controls/FieldWrapper.js +122 -140
  92. package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  93. package/src/sap/fe/core/controls/FilterBar.js +163 -159
  94. package/src/sap/fe/core/controls/FilterBar.ts +143 -0
  95. package/src/sap/fe/core/controls/FormElementWrapper.js +46 -44
  96. package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  97. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +38 -42
  98. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  99. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
  100. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +127 -116
  101. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  102. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -255
  103. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  104. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +151 -141
  105. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  106. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +336 -322
  107. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  108. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  109. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
  110. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  111. package/src/sap/fe/core/converters/ConverterContext.js +348 -367
  112. package/src/sap/fe/core/converters/ConverterContext.ts +33 -19
  113. package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
  114. package/src/sap/fe/core/converters/ManifestSettings.ts +16 -1
  115. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -354
  116. package/src/sap/fe/core/converters/ManifestWrapper.ts +34 -6
  117. package/src/sap/fe/core/converters/MetaModelConverter.js +72 -9
  118. package/src/sap/fe/core/converters/MetaModelConverter.ts +75 -16
  119. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  120. package/src/sap/fe/core/converters/TemplateConverter.ts +4 -3
  121. package/src/sap/fe/core/converters/annotations/DataField.js +28 -14
  122. package/src/sap/fe/core/converters/annotations/DataField.ts +38 -14
  123. package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
  124. package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
  125. package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
  126. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  127. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  128. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  129. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  130. package/src/sap/fe/core/converters/controls/Common/Form.js +21 -11
  131. package/src/sap/fe/core/converters/controls/Common/Form.ts +28 -6
  132. package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
  133. package/src/sap/fe/core/converters/controls/Common/KPI.ts +75 -2
  134. package/src/sap/fe/core/converters/controls/Common/Table.js +507 -408
  135. package/src/sap/fe/core/converters/controls/Common/Table.ts +618 -500
  136. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +592 -0
  137. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +718 -0
  138. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +465 -59
  139. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +462 -72
  140. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  141. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  142. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -9
  143. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
  144. package/src/sap/fe/core/converters/helpers/Aggregation.js +118 -121
  145. package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
  146. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  147. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  148. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  149. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  150. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
  151. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
  152. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  153. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  154. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +28 -7
  155. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +23 -6
  156. package/src/sap/fe/core/converters/templates/ListReportConverter.js +20 -7
  157. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -14
  158. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
  159. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  160. package/src/sap/fe/core/designtime/AppComponent.designtime.js +93 -90
  161. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  162. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  163. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  164. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  165. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  166. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  167. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  168. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  169. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  170. package/src/sap/fe/core/formatters/TableFormatter.js +91 -29
  171. package/src/sap/fe/core/formatters/TableFormatter.ts +94 -28
  172. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  173. package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
  174. package/src/sap/fe/core/fpm/Component.js +51 -54
  175. package/src/sap/fe/core/fpm/Component.ts +48 -0
  176. package/src/sap/fe/core/helpers/AppStartupHelper.js +373 -0
  177. package/src/sap/fe/core/helpers/AppStartupHelper.ts +417 -0
  178. package/src/sap/fe/core/helpers/BindingExpression.js +489 -442
  179. package/src/sap/fe/core/helpers/BindingExpression.ts +486 -469
  180. package/src/sap/fe/core/helpers/ClassSupport.js +212 -76
  181. package/src/sap/fe/core/helpers/ClassSupport.ts +198 -71
  182. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +64 -59
  183. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +52 -0
  184. package/src/sap/fe/core/helpers/EditState.js +81 -84
  185. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  186. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  187. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  188. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  189. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  190. package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
  191. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
  192. package/src/sap/fe/core/helpers/MassEditHelper.js +604 -0
  193. package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  194. package/src/sap/fe/core/helpers/ModelHelper.js +253 -225
  195. package/src/sap/fe/core/helpers/ModelHelper.ts +250 -0
  196. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  197. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  198. package/src/sap/fe/core/helpers/SemanticDateOperators.js +336 -313
  199. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +334 -0
  200. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  201. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  202. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  203. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  204. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  205. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  206. package/src/sap/fe/core/library.js +427 -425
  207. package/src/sap/fe/core/library.support.js +23 -27
  208. package/src/sap/fe/core/library.support.ts +23 -0
  209. package/src/sap/fe/core/library.ts +420 -0
  210. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +64 -0
  211. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +69 -0
  212. package/src/sap/fe/core/messagebundle.properties +78 -13
  213. package/src/sap/fe/core/messagebundle_ar.properties +58 -7
  214. package/src/sap/fe/core/messagebundle_bg.properties +58 -7
  215. package/src/sap/fe/core/messagebundle_ca.properties +58 -7
  216. package/src/sap/fe/core/messagebundle_cs.properties +59 -8
  217. package/src/sap/fe/core/messagebundle_cy.properties +58 -7
  218. package/src/sap/fe/core/messagebundle_da.properties +58 -7
  219. package/src/sap/fe/core/messagebundle_de.properties +58 -7
  220. package/src/sap/fe/core/messagebundle_el.properties +58 -7
  221. package/src/sap/fe/core/messagebundle_en.properties +57 -6
  222. package/src/sap/fe/core/messagebundle_en_GB.properties +57 -6
  223. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +61 -6
  224. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +58 -7
  225. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +58 -7
  226. package/src/sap/fe/core/messagebundle_es.properties +58 -7
  227. package/src/sap/fe/core/messagebundle_es_MX.properties +58 -7
  228. package/src/sap/fe/core/messagebundle_et.properties +58 -7
  229. package/src/sap/fe/core/messagebundle_fi.properties +60 -9
  230. package/src/sap/fe/core/messagebundle_fr.properties +64 -13
  231. package/src/sap/fe/core/messagebundle_fr_CA.properties +59 -8
  232. package/src/sap/fe/core/messagebundle_hi.properties +58 -7
  233. package/src/sap/fe/core/messagebundle_hr.properties +58 -7
  234. package/src/sap/fe/core/messagebundle_hu.properties +59 -8
  235. package/src/sap/fe/core/messagebundle_id.properties +61 -10
  236. package/src/sap/fe/core/messagebundle_it.properties +58 -7
  237. package/src/sap/fe/core/messagebundle_iw.properties +58 -7
  238. package/src/sap/fe/core/messagebundle_ja.properties +58 -7
  239. package/src/sap/fe/core/messagebundle_kk.properties +58 -7
  240. package/src/sap/fe/core/messagebundle_ko.properties +58 -7
  241. package/src/sap/fe/core/messagebundle_lt.properties +58 -7
  242. package/src/sap/fe/core/messagebundle_lv.properties +59 -8
  243. package/src/sap/fe/core/messagebundle_ms.properties +58 -7
  244. package/src/sap/fe/core/messagebundle_nl.properties +58 -7
  245. package/src/sap/fe/core/messagebundle_no.properties +58 -7
  246. package/src/sap/fe/core/messagebundle_pl.properties +58 -7
  247. package/src/sap/fe/core/messagebundle_pt.properties +59 -8
  248. package/src/sap/fe/core/messagebundle_pt_PT.properties +58 -7
  249. package/src/sap/fe/core/messagebundle_ro.properties +58 -7
  250. package/src/sap/fe/core/messagebundle_ru.properties +58 -7
  251. package/src/sap/fe/core/messagebundle_sh.properties +58 -7
  252. package/src/sap/fe/core/messagebundle_sk.properties +58 -7
  253. package/src/sap/fe/core/messagebundle_sl.properties +58 -7
  254. package/src/sap/fe/core/messagebundle_sv.properties +59 -8
  255. package/src/sap/fe/core/messagebundle_th.properties +58 -7
  256. package/src/sap/fe/core/messagebundle_tr.properties +60 -9
  257. package/src/sap/fe/core/messagebundle_uk.properties +58 -7
  258. package/src/sap/fe/core/messagebundle_vi.properties +58 -7
  259. package/src/sap/fe/core/messagebundle_zh_CN.properties +58 -7
  260. package/src/sap/fe/core/messagebundle_zh_TW.properties +58 -7
  261. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
  262. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  263. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +231 -202
  264. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  265. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +67 -92
  266. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -6
  267. package/src/sap/fe/core/services/NavigationServiceFactory.js +351 -300
  268. package/src/sap/fe/core/services/NavigationServiceFactory.ts +313 -0
  269. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +114 -81
  270. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +83 -0
  271. package/src/sap/fe/core/services/RoutingServiceFactory.js +927 -1152
  272. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  273. package/src/sap/fe/core/services/ShellServicesFactory.js +649 -707
  274. package/src/sap/fe/core/services/ShellServicesFactory.ts +52 -15
  275. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +569 -637
  276. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +78 -102
  277. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +429 -478
  278. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +460 -0
  279. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  280. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  281. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  282. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  283. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  284. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  285. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  286. package/src/sap/fe/core/support/CommonHelper.ts +1 -1
  287. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  288. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  289. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  290. package/src/sap/fe/core/templating/DataModelPathHelper.js +97 -127
  291. package/src/sap/fe/core/templating/DataModelPathHelper.ts +112 -135
  292. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  293. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  294. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  295. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  296. package/src/sap/fe/core/templating/FilterHelper.js +140 -78
  297. package/src/sap/fe/core/templating/FilterHelper.ts +149 -78
  298. package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
  299. package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
  300. package/src/sap/fe/core/templating/UIFormatters.js +76 -135
  301. package/src/sap/fe/core/templating/UIFormatters.ts +76 -99
  302. package/src/sap/fe/core/type/Email.js +1 -1
  303. package/src/sap/fe/core/type/Email.ts +4 -6
  304. package/ui5.yaml +0 -3
  305. package/src/sap/fe/core/controls/filterbar.d.js +0 -8
  306. package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
@@ -0,0 +1,592 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettings", "../../../helpers/BindingHelper", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/formatters/TableFormatter"], function (BindingExpression, ManifestSettings, BindingHelper, DataModelPathHelper, tableFormatters) {
6
+ "use strict";
7
+
8
+ var _exports = {};
9
+ var isPathUpdatable = DataModelPathHelper.isPathUpdatable;
10
+ var isPathInsertable = DataModelPathHelper.isPathInsertable;
11
+ var isPathDeletable = DataModelPathHelper.isPathDeletable;
12
+ var getTargetObjectPath = DataModelPathHelper.getTargetObjectPath;
13
+ var UI = BindingHelper.UI;
14
+ var singletonPathVisitor = BindingHelper.singletonPathVisitor;
15
+ var TemplateType = ManifestSettings.TemplateType;
16
+ var CreationMode = ManifestSettings.CreationMode;
17
+ var formatResult = BindingExpression.formatResult;
18
+ var greaterThan = BindingExpression.greaterThan;
19
+ var or = BindingExpression.or;
20
+ var notEqual = BindingExpression.notEqual;
21
+ var not = BindingExpression.not;
22
+ var isConstant = BindingExpression.isConstant;
23
+ var isBinding = BindingExpression.isBinding;
24
+ var ifElse = BindingExpression.ifElse;
25
+ var greaterOrEqual = BindingExpression.greaterOrEqual;
26
+ var length = BindingExpression.length;
27
+ var equal = BindingExpression.equal;
28
+ var constant = BindingExpression.constant;
29
+ var compileBinding = BindingExpression.compileBinding;
30
+ var bindingExpression = BindingExpression.bindingExpression;
31
+ var annotationExpression = BindingExpression.annotationExpression;
32
+ var and = BindingExpression.and;
33
+
34
+ var AnnotationHiddenProperty;
35
+
36
+ (function (AnnotationHiddenProperty) {
37
+ AnnotationHiddenProperty["CreateHidden"] = "CreateHidden";
38
+ AnnotationHiddenProperty["DeleteHidden"] = "DeleteHidden";
39
+ AnnotationHiddenProperty["UpdateHidden"] = "UpdateHidden";
40
+ })(AnnotationHiddenProperty || (AnnotationHiddenProperty = {}));
41
+
42
+ /**
43
+ * Generates the context for the standard actions.
44
+ *
45
+ * @param {ConverterContext} converterContext
46
+ * @param {NavigationSettingsConfiguration} creationMode
47
+ * @param {TableControlConfiguration} tableManifestConfiguration
48
+ * @param {ViewPathConfiguration} viewConfiguration
49
+ * @returns The context for table actions
50
+ */
51
+ function generateStandardActionsContext(converterContext, creationMode, tableManifestConfiguration, viewConfiguration) {
52
+ return {
53
+ collectionPath: getTargetObjectPath(converterContext.getDataModelObjectPath()),
54
+ hiddenAnnotation: {
55
+ create: isActionAnnotatedHidden(converterContext, AnnotationHiddenProperty.CreateHidden),
56
+ "delete": isActionAnnotatedHidden(converterContext, AnnotationHiddenProperty.DeleteHidden),
57
+ update: isActionAnnotatedHidden(converterContext, AnnotationHiddenProperty.UpdateHidden)
58
+ },
59
+ creationMode: creationMode,
60
+ isDraftOrStickySupported: isDraftOrStickySupported(converterContext),
61
+ isViewWithMultipleVisualizations: viewConfiguration ? converterContext.getManifestWrapper().hasMultipleVisualizations(viewConfiguration) : false,
62
+ newAction: getNewAction(converterContext),
63
+ tableManifestConfiguration: tableManifestConfiguration,
64
+ restrictions: getRestrictions(converterContext)
65
+ };
66
+ }
67
+ /**
68
+ * Checks if draft is supported.
69
+ *
70
+ * @param {ConverterContext} converterContext
71
+ * @returns {boolean}
72
+ */
73
+
74
+
75
+ _exports.generateStandardActionsContext = generateStandardActionsContext;
76
+
77
+ function isDraftSupported(converterContext) {
78
+ var _currentEntitySet$ann, _currentEntitySet$ann2, _currentEntitySet$ann3, _currentEntitySet$ann4, _converterContext$get, _converterContext$get2, _converterContext$get3, _converterContext$get4, _converterContext$get5, _converterContext$get6, _converterContext$get7;
79
+
80
+ var currentEntitySet = converterContext.getEntitySet();
81
+ var bIsDraftRoot = currentEntitySet && (_currentEntitySet$ann = currentEntitySet.annotations) !== null && _currentEntitySet$ann !== void 0 && (_currentEntitySet$ann2 = _currentEntitySet$ann.Common) !== null && _currentEntitySet$ann2 !== void 0 && _currentEntitySet$ann2.DraftRoot ? true : false;
82
+ var bIsDraftNode = currentEntitySet && (_currentEntitySet$ann3 = currentEntitySet.annotations) !== null && _currentEntitySet$ann3 !== void 0 && (_currentEntitySet$ann4 = _currentEntitySet$ann3.Common) !== null && _currentEntitySet$ann4 !== void 0 && _currentEntitySet$ann4.DraftNode ? true : false;
83
+ var bIsDraftParentEntityForContainment = (_converterContext$get = converterContext.getDataModelObjectPath().targetObject) !== null && _converterContext$get !== void 0 && _converterContext$get.containsTarget && ((_converterContext$get2 = converterContext.getDataModelObjectPath().startingEntitySet) !== null && _converterContext$get2 !== void 0 && (_converterContext$get3 = _converterContext$get2.annotations) !== null && _converterContext$get3 !== void 0 && (_converterContext$get4 = _converterContext$get3.Common) !== null && _converterContext$get4 !== void 0 && _converterContext$get4.DraftRoot || (_converterContext$get5 = converterContext.getDataModelObjectPath().startingEntitySet) !== null && _converterContext$get5 !== void 0 && (_converterContext$get6 = _converterContext$get5.annotations) !== null && _converterContext$get6 !== void 0 && (_converterContext$get7 = _converterContext$get6.Common) !== null && _converterContext$get7 !== void 0 && _converterContext$get7.DraftNode) ? true : false;
84
+ return bIsDraftRoot || bIsDraftNode || !converterContext.getEntitySet() && bIsDraftParentEntityForContainment;
85
+ }
86
+ /**
87
+ * Checks if sticky or draft is supported.
88
+ *
89
+ * @param {ConverterContext} converterContext
90
+ * @returns {boolean}
91
+ */
92
+
93
+
94
+ _exports.isDraftSupported = isDraftSupported;
95
+
96
+ function isDraftOrStickySupported(converterContext) {
97
+ var _converterContext$get8, _converterContext$get9, _converterContext$get10;
98
+
99
+ var bIsDraftSupported = isDraftSupported(converterContext);
100
+ var bIsStickySessionSupported = (_converterContext$get8 = converterContext.getDataModelObjectPath().startingEntitySet) !== null && _converterContext$get8 !== void 0 && (_converterContext$get9 = _converterContext$get8.annotations) !== null && _converterContext$get9 !== void 0 && (_converterContext$get10 = _converterContext$get9.Session) !== null && _converterContext$get10 !== void 0 && _converterContext$get10.StickySessionSupported ? true : false;
101
+ return bIsDraftSupported || bIsStickySessionSupported;
102
+ }
103
+ /**
104
+ * Gets the configured newAction into annotation.
105
+ *
106
+ * @param {ConverterContext} converterContext
107
+ * @returns {any}
108
+ */
109
+
110
+
111
+ _exports.isDraftOrStickySupported = isDraftOrStickySupported;
112
+
113
+ function getNewAction(converterContext) {
114
+ var _ref, _currentEntitySet$ann5, _currentEntitySet$ann6, _currentEntitySet$ann7, _currentEntitySet$ann8, _currentEntitySet$ann9, _currentEntitySet$ann10;
115
+
116
+ var currentEntitySet = converterContext.getEntitySet();
117
+ var newActionName = (_ref = (currentEntitySet === null || currentEntitySet === void 0 ? void 0 : (_currentEntitySet$ann5 = currentEntitySet.annotations) === null || _currentEntitySet$ann5 === void 0 ? void 0 : (_currentEntitySet$ann6 = _currentEntitySet$ann5.Common) === null || _currentEntitySet$ann6 === void 0 ? void 0 : (_currentEntitySet$ann7 = _currentEntitySet$ann6.DraftRoot) === null || _currentEntitySet$ann7 === void 0 ? void 0 : _currentEntitySet$ann7.NewAction) || (currentEntitySet === null || currentEntitySet === void 0 ? void 0 : (_currentEntitySet$ann8 = currentEntitySet.annotations) === null || _currentEntitySet$ann8 === void 0 ? void 0 : (_currentEntitySet$ann9 = _currentEntitySet$ann8.Session) === null || _currentEntitySet$ann9 === void 0 ? void 0 : (_currentEntitySet$ann10 = _currentEntitySet$ann9.StickySessionSupported) === null || _currentEntitySet$ann10 === void 0 ? void 0 : _currentEntitySet$ann10.NewAction)) === null || _ref === void 0 ? void 0 : _ref.toString();
118
+
119
+ if (newActionName) {
120
+ var _converterContext$get11, _converterContext$get12, _converterContext$get13;
121
+
122
+ var availableProperty = converterContext === null || converterContext === void 0 ? void 0 : (_converterContext$get11 = converterContext.getEntityType().actions[newActionName]) === null || _converterContext$get11 === void 0 ? void 0 : (_converterContext$get12 = _converterContext$get11.annotations) === null || _converterContext$get12 === void 0 ? void 0 : (_converterContext$get13 = _converterContext$get12.Core) === null || _converterContext$get13 === void 0 ? void 0 : _converterContext$get13.OperationAvailable;
123
+ availableProperty = availableProperty !== undefined ? availableProperty : true;
124
+ return {
125
+ name: newActionName,
126
+ available: annotationExpression(availableProperty)
127
+ };
128
+ }
129
+
130
+ return undefined;
131
+ }
132
+ /**
133
+ * Gets the binding expression for the action visibility configured into annotation.
134
+ *
135
+ * @param {ConverterContext} converterContext
136
+ * @param {string} sAnnotationTerm
137
+ * @param {boolean} bWithNavigationPath
138
+ * @returns {Expression<boolean>}
139
+ */
140
+
141
+
142
+ _exports.getNewAction = getNewAction;
143
+
144
+ function isActionAnnotatedHidden(converterContext, sAnnotationTerm) {
145
+ var _currentEntitySet$ann11;
146
+
147
+ var bWithNavigationPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
148
+ var currentEntitySet = converterContext.getEntitySet();
149
+ var dataModelObjectPath = converterContext.getDataModelObjectPath(); // Consider only the last level of navigation. The others are already considered in the element binding of the page.
150
+
151
+ var visitedNavigationPaths = dataModelObjectPath.navigationProperties.length > 0 && bWithNavigationPath ? [dataModelObjectPath.navigationProperties[dataModelObjectPath.navigationProperties.length - 1].name] : [];
152
+ var actionAnnotationValue = (currentEntitySet === null || currentEntitySet === void 0 ? void 0 : (_currentEntitySet$ann11 = currentEntitySet.annotations.UI) === null || _currentEntitySet$ann11 === void 0 ? void 0 : _currentEntitySet$ann11[sAnnotationTerm]) || false;
153
+ return currentEntitySet ? annotationExpression(actionAnnotationValue, visitedNavigationPaths, undefined, function (path) {
154
+ return singletonPathVisitor(path, converterContext.getConvertedTypes(), visitedNavigationPaths);
155
+ }) : constant(false);
156
+ }
157
+ /**
158
+ * Gets the annotated restrictions for the actions.
159
+ *
160
+ * @param {ConverterContext} converterContext
161
+ * @returns {StandardActionsRestrictionsType}
162
+ */
163
+
164
+
165
+ _exports.isActionAnnotatedHidden = isActionAnnotatedHidden;
166
+
167
+ function getRestrictions(converterContext) {
168
+ var dataModelObjectPath = converterContext.getDataModelObjectPath();
169
+ var restrictionsDef = [{
170
+ key: "isInsertable",
171
+ "function": isPathInsertable
172
+ }, {
173
+ key: "isUpdatable",
174
+ "function": isPathUpdatable
175
+ }, {
176
+ key: "isDeletable",
177
+ "function": isPathDeletable
178
+ }];
179
+ var result = {};
180
+ restrictionsDef.forEach(function (def) {
181
+ var defFunction = def["function"];
182
+ result[def.key] = {
183
+ expression: defFunction.apply(null, [dataModelObjectPath, {
184
+ pathVisitor: function (path, navigationPaths) {
185
+ return singletonPathVisitor(path, converterContext.getConvertedTypes(), navigationPaths);
186
+ }
187
+ }]),
188
+ navigationExpression: defFunction.apply(null, [dataModelObjectPath, {
189
+ ignoreTargetCollection: true,
190
+ authorizeUnresolvable: true,
191
+ pathVisitor: function (path, navigationPaths) {
192
+ return singletonPathVisitor(path, converterContext.getConvertedTypes(), navigationPaths);
193
+ }
194
+ }])
195
+ };
196
+ });
197
+ return result;
198
+ }
199
+ /**
200
+ * Checks if templating for insert/update actions is mandatory.
201
+ *
202
+ * @param {StandardActionsContext} standardActionsContext
203
+ * @param {boolean} isDraftOrSticky
204
+ * @param {boolean} isCreateAlwaysHidden
205
+ * @returns {boolean}
206
+ */
207
+
208
+
209
+ _exports.getRestrictions = getRestrictions;
210
+
211
+ function getInsertUpdateActionsTemplating(standardActionsContext, isDraftOrSticky, isCreateAlwaysHidden) {
212
+ return (isDraftOrSticky || standardActionsContext.creationMode === CreationMode.External) && !isCreateAlwaysHidden;
213
+ }
214
+ /**
215
+ * Gets the binding expressions for the properties of the action Create.
216
+ *
217
+ * @param {ConverterContext} converterContext
218
+ * @param {StandardActionsContext} standardActionsContext
219
+ * @returns {StandardActionConfigType}
220
+ */
221
+
222
+
223
+ _exports.getInsertUpdateActionsTemplating = getInsertUpdateActionsTemplating;
224
+
225
+ function getStandardActionCreate(converterContext, standardActionsContext) {
226
+ var createVisibility = getCreateVisibility(converterContext, standardActionsContext);
227
+ return {
228
+ isTemplated: compileBinding(getCreateTemplating(standardActionsContext, createVisibility)),
229
+ visible: compileBinding(createVisibility),
230
+ enabled: compileBinding(getCreateEnablement(converterContext, standardActionsContext, createVisibility))
231
+ };
232
+ }
233
+ /**
234
+ * Gets the binding expressions for the properties of the action Delete.
235
+ *
236
+ * @param {ConverterContext} converterContext
237
+ * @param {StandardActionsContext} standardActionsContext
238
+ * @returns {StandardActionConfigType}
239
+ */
240
+
241
+
242
+ _exports.getStandardActionCreate = getStandardActionCreate;
243
+
244
+ function getStandardActionDelete(converterContext, standardActionsContext) {
245
+ var deleteVisibility = getDeleteVisibility(converterContext, standardActionsContext);
246
+ return {
247
+ isTemplated: compileBinding(getDefaultTemplating(deleteVisibility)),
248
+ visible: compileBinding(deleteVisibility),
249
+ enabled: compileBinding(getDeleteEnablement(converterContext, standardActionsContext, deleteVisibility))
250
+ };
251
+ }
252
+ /**
253
+ * @param converterContext
254
+ * @param standardActionsContext
255
+ * @returns StandardActionConfigType
256
+ */
257
+
258
+
259
+ _exports.getStandardActionDelete = getStandardActionDelete;
260
+
261
+ function getCreationRow(converterContext, standardActionsContext) {
262
+ var creationRowVisibility = getCreateVisibility(converterContext, standardActionsContext, true);
263
+ return {
264
+ isTemplated: compileBinding(getCreateTemplating(standardActionsContext, creationRowVisibility, true)),
265
+ visible: compileBinding(creationRowVisibility),
266
+ enabled: compileBinding(getCreationRowEnablement(converterContext, standardActionsContext, creationRowVisibility))
267
+ };
268
+ }
269
+ /**
270
+ * Gets the binding expressions for the properties of the action Paste.
271
+ *
272
+ * @param {ConverterContext} converterContext
273
+ * @param {StandardActionsContext} standardActionsContext
274
+ * @param {boolean} isInsertUpdateActionsTemplated
275
+ * @returns {StandardActionConfigType}
276
+ */
277
+
278
+
279
+ _exports.getCreationRow = getCreationRow;
280
+
281
+ function getStandardActionPaste(converterContext, standardActionsContext, isInsertUpdateActionsTemplated) {
282
+ var createVisibility = getCreateVisibility(converterContext, standardActionsContext);
283
+ var createEnablement = getCreateEnablement(converterContext, standardActionsContext, createVisibility);
284
+ var pasteVisibility = getPasteVisibility(converterContext, standardActionsContext, createVisibility, isInsertUpdateActionsTemplated);
285
+ return {
286
+ visible: compileBinding(pasteVisibility),
287
+ enabled: compileBinding(getPasteEnablement(pasteVisibility, createEnablement))
288
+ };
289
+ }
290
+ /**
291
+ * Gets the binding expressions for the properties of the action MassEdit.
292
+ *
293
+ * @param {ConverterContext} converterContext
294
+ * @param {StandardActionsContext} standardActionsContext
295
+ * @returns {StandardActionConfigType}
296
+ */
297
+
298
+
299
+ _exports.getStandardActionPaste = getStandardActionPaste;
300
+
301
+ function getStandardActionMassEdit(converterContext, standardActionsContext) {
302
+ var massEditVisibility = getMassEditVisibility(converterContext, standardActionsContext);
303
+ return {
304
+ isTemplated: compileBinding(getDefaultTemplating(massEditVisibility)),
305
+ visible: compileBinding(massEditVisibility),
306
+ enabled: compileBinding(getMassEditEnablement(converterContext, standardActionsContext, massEditVisibility))
307
+ };
308
+ }
309
+ /**
310
+ * Gets the binding expression for the templating of the action Create.
311
+ *
312
+ * @param {StandardActionsContext} standardActionsContext
313
+ * @param {Expression<boolean>} createVisibility
314
+ * @param {boolean} isForCreationRow
315
+ * @returns {Expression<boolean> }
316
+ */
317
+
318
+
319
+ _exports.getStandardActionMassEdit = getStandardActionMassEdit;
320
+
321
+ function getCreateTemplating(standardActionsContext, createVisibility) {
322
+ var isForCreationRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
323
+ //Templating of Create Button is not done:
324
+ // - If Button is never visible(covered the External create button, new Action)
325
+ // - or CreationMode is on CreationRow for Create Button
326
+ // - or CreationMode is not on CreationRow for CreationRow Button
327
+ return and( //XNOR gate
328
+ or(and(isForCreationRow, standardActionsContext.creationMode === CreationMode.CreationRow), and(!isForCreationRow, standardActionsContext.creationMode !== CreationMode.CreationRow)), or(not(isConstant(createVisibility)), createVisibility));
329
+ }
330
+ /**
331
+ * Gets the binding expression for the templating of the non-Create actions.
332
+ *
333
+ * @param {Expression<boolean>} actionVisibility
334
+ * @returns {Expression<boolean> }
335
+ */
336
+
337
+
338
+ _exports.getCreateTemplating = getCreateTemplating;
339
+
340
+ function getDefaultTemplating(actionVisibility) {
341
+ return or(not(isConstant(actionVisibility)), actionVisibility);
342
+ }
343
+ /**
344
+ * Gets the binding expression for the property visible of the action Create.
345
+ *
346
+ * @param {ConverterContext} converterContext
347
+ * @param {StandardActionsContext} standardActionsContext
348
+ * @param {boolean} isForCreationRow
349
+ * @returns {Expression<boolean> }
350
+ */
351
+
352
+
353
+ _exports.getDefaultTemplating = getDefaultTemplating;
354
+
355
+ function getCreateVisibility(converterContext, standardActionsContext) {
356
+ var isForCreationRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
357
+ var isInsertable = standardActionsContext.restrictions.isInsertable.expression;
358
+ var isCreateHidden = isForCreationRow ? isActionAnnotatedHidden(converterContext, AnnotationHiddenProperty.CreateHidden, false) : standardActionsContext.hiddenAnnotation.create;
359
+ var newAction = standardActionsContext.newAction; //Create Button is visible:
360
+ // - If the creation mode is external
361
+ // - If we're on the list report and create is not hidden
362
+ // - Otherwise this depends on the value of the the UI.IsEditable
363
+ // - Otherwise
364
+ // - If we're on the list report ->
365
+ // - If UI.CreateHidden points to a property path -> provide a negated binding to this path
366
+ // - Otherwise, create is visible
367
+ // - Otherwise
368
+ // - This depends on the value of the the UI.IsEditable
369
+
370
+ return ifElse(standardActionsContext.creationMode === CreationMode.External, and(not(isCreateHidden), or(converterContext.getTemplateType() === TemplateType.ListReport, UI.IsEditable)), ifElse(or(and(isConstant(newAction === null || newAction === void 0 ? void 0 : newAction.available), equal(newAction === null || newAction === void 0 ? void 0 : newAction.available, false)), and(isConstant(isInsertable), equal(isInsertable, false), !newAction), and(isConstant(isCreateHidden), equal(isCreateHidden, true)), standardActionsContext.isViewWithMultipleVisualizations, converterContext.getTemplateType() === TemplateType.AnalyticalListPage), false, ifElse(converterContext.getTemplateType() === TemplateType.ListReport, or(not(isBinding(isCreateHidden)), not(isCreateHidden)), and(not(isCreateHidden), UI.IsEditable))));
371
+ }
372
+ /**
373
+ * Gets the binding expression for the property visible of the action Delete.
374
+ *
375
+ * @param {ConverterContext} converterContext
376
+ * @param {StandardActionsContext} standardActionsContext
377
+ * @returns {Expression<boolean> }
378
+ */
379
+
380
+
381
+ _exports.getCreateVisibility = getCreateVisibility;
382
+
383
+ function getDeleteVisibility(converterContext, standardActionsContext) {
384
+ var isDeleteHidden = standardActionsContext.hiddenAnnotation.delete;
385
+ var pathDeletableExpression = standardActionsContext.restrictions.isDeletable.expression; //Delete Button is visible:
386
+ // Prerequisites:
387
+ // - If we're not on multiple visualizations configuration or ALP
388
+ //
389
+ // - If restrictions on deletable set to false -> not visible
390
+ // - Otherwise
391
+ // - If UI.DeleteHidden is true -> not visible
392
+ // - Otherwise
393
+ // - If we're on OP -> depending of the editMode and restrictions on deletable
394
+ // - Otherwise
395
+ // - If UI.DeleteHidden points to a property path -> provide a negated binding to this path
396
+ // - Otherwise, delete is visible
397
+
398
+ return ifElse(or(standardActionsContext.isViewWithMultipleVisualizations, converterContext.getTemplateType() === TemplateType.AnalyticalListPage), false, ifElse(and(isConstant(pathDeletableExpression), equal(pathDeletableExpression, false)), false, ifElse(and(isConstant(isDeleteHidden), equal(isDeleteHidden, constant(true))), false, ifElse(converterContext.getTemplateType() !== TemplateType.ListReport, and(not(isDeleteHidden), equal(bindingExpression("/editMode", "ui"), "Editable")), not(and(isBinding(isDeleteHidden), isDeleteHidden))))));
399
+ }
400
+ /**
401
+ * Gets the binding expression for the property visible of the action Paste.
402
+ *
403
+ * @param {ConverterContext} converterContext
404
+ * @param {StandardActionsContext} standardActionsContext
405
+ * @param {Expression<boolean>} createVisibility
406
+ * @param {boolean} isInsertUpdateActionsTemplated
407
+ * @returns {Expression<boolean> }
408
+ */
409
+
410
+
411
+ _exports.getDeleteVisibility = getDeleteVisibility;
412
+
413
+ function getPasteVisibility(converterContext, standardActionsContext, createVisibility, isInsertUpdateActionsTemplated) {
414
+ // If Create is visible, enablePaste is not disabled into manifest and we are on OP/blocks outside Fiori elements templates
415
+ // Then button will be visible according to insertable restrictions and create visibility
416
+ // Otherwise it's not visible
417
+ return and(notEqual(standardActionsContext.tableManifestConfiguration.enablePaste, false), createVisibility, isInsertUpdateActionsTemplated, [TemplateType.ListReport, TemplateType.AnalyticalListPage].indexOf(converterContext.getTemplateType()) === -1, standardActionsContext.restrictions.isInsertable.expression);
418
+ }
419
+ /**
420
+ * Gets the binding expression for the property visible of the action MassEdit.
421
+ *
422
+ * @param {ConverterContext} converterContext
423
+ * @param {StandardActionsContext} standardActionsContext
424
+ * @returns {Expression<boolean> }
425
+ */
426
+
427
+
428
+ _exports.getPasteVisibility = getPasteVisibility;
429
+
430
+ function getMassEditVisibility(converterContext, standardActionsContext) {
431
+ var _standardActionsConte;
432
+
433
+ var isUpdateHidden = standardActionsContext.hiddenAnnotation.update,
434
+ pathUpdatableExpression = standardActionsContext.restrictions.isUpdatable.expression,
435
+ bMassEditEnabledInManifest = ((_standardActionsConte = standardActionsContext.tableManifestConfiguration) === null || _standardActionsConte === void 0 ? void 0 : _standardActionsConte.enableMassEdit) || false;
436
+ var templateBindingExpression = converterContext.getTemplateType() === TemplateType.ObjectPage ? equal(UI.IsEditable, true) : converterContext.getTemplateType() === TemplateType.ListReport; //MassEdit is visible
437
+ // If
438
+ // - there is no static restrictions set to false
439
+ // - and enableMassEdit is not set to false into the manifest
440
+ // - and the selectionMode is relevant
441
+ // Then MassEdit is always visible in LR or dynamically visible in OP according to ui>Editable and hiddenAnnotation
442
+ // Button is hidden for all other cases
443
+
444
+ return and(not(and(isConstant(pathUpdatableExpression), equal(pathUpdatableExpression, false))), bMassEditEnabledInManifest, templateBindingExpression, not(isUpdateHidden));
445
+ }
446
+ /**
447
+ * Gets the binding expression for the property enabled of the creationRow.
448
+ *
449
+ * @param {ConverterContext} converterContext
450
+ * @param {StandardActionsContext} standardActionsContext
451
+ * @param {Expression<boolean>} creationRowVisibility
452
+ * @returns {Expression<boolean> }
453
+ */
454
+
455
+
456
+ _exports.getMassEditVisibility = getMassEditVisibility;
457
+
458
+ function getCreationRowEnablement(converterContext, standardActionsContext, creationRowVisibility) {
459
+ var restrictionsInsertable = isPathInsertable(converterContext.getDataModelObjectPath(), {
460
+ ignoreTargetCollection: true,
461
+ authorizeUnresolvable: true,
462
+ pathVisitor: function (path, navigationPaths) {
463
+ if (path.indexOf("/") === 0) {
464
+ path = singletonPathVisitor(path, converterContext.getConvertedTypes(), navigationPaths);
465
+ return path;
466
+ }
467
+
468
+ var navigationProperties = converterContext.getDataModelObjectPath().navigationProperties;
469
+
470
+ if (navigationProperties) {
471
+ var partner = navigationProperties[navigationProperties.length - 1].partner;
472
+
473
+ if (partner) {
474
+ path = "".concat(partner, "/").concat(path);
475
+ }
476
+ }
477
+
478
+ return path;
479
+ }
480
+ });
481
+ var isInsertable = restrictionsInsertable._type === "Unresolvable" ? isPathInsertable(converterContext.getDataModelObjectPath(), {
482
+ pathVisitor: function (path) {
483
+ return singletonPathVisitor(path, converterContext.getConvertedTypes(), []);
484
+ }
485
+ }) : restrictionsInsertable;
486
+ return and(creationRowVisibility, isInsertable, or(!standardActionsContext.tableManifestConfiguration.disableAddRowButtonForEmptyData, formatResult([bindingExpression("creationRowFieldValidity", "internal")], tableFormatters.validateCreationRowFields)));
487
+ }
488
+ /**
489
+ * Gets the binding expression for the property enabled of the action Create.
490
+ *
491
+ * @param {ConverterContext} converterContext
492
+ * @param {StandardActionsContext} standardActionsContext
493
+ * @param {Expression<boolean>} createVisibility
494
+ * @returns {Expression<boolean> }
495
+ */
496
+
497
+
498
+ _exports.getCreationRowEnablement = getCreationRowEnablement;
499
+
500
+ function getCreateEnablement(converterContext, standardActionsContext, createVisibility) {
501
+ var _converterContext$res;
502
+
503
+ var isInsertable = standardActionsContext.restrictions.isInsertable.expression;
504
+ var CollectionType = (_converterContext$res = converterContext.resolveAbsolutePath(standardActionsContext.collectionPath).target) === null || _converterContext$res === void 0 ? void 0 : _converterContext$res._type;
505
+ return and(createVisibility, or(CollectionType === "EntitySet", and(isInsertable, or(converterContext.getTemplateType() !== TemplateType.ObjectPage, equal(bindingExpression("/editMode", "ui"), "Editable")))));
506
+ }
507
+ /**
508
+ * Gets the binding expression for the property enabled of the action Delete.
509
+ *
510
+ * @param {ConverterContext} converterContext
511
+ * @param {StandardActionsContext} standardActionsContext
512
+ * @param {Expression<boolean>} deleteVisibility
513
+ * @returns {Expression<boolean> }
514
+ */
515
+
516
+
517
+ _exports.getCreateEnablement = getCreateEnablement;
518
+
519
+ function getDeleteEnablement(converterContext, standardActionsContext, deleteVisibility) {
520
+ var isDeletable = standardActionsContext.restrictions.isDeletable.expression;
521
+ var isOnlyDynamicOnCurrentEntity = !isConstant(isDeletable) && standardActionsContext.restrictions.isDeletable.navigationExpression._type === "Unresolvable";
522
+ var numberOfSelectedContexts = bindingExpression("numberOfSelectedContexts", "internal");
523
+ var numberOfDeletableContexts = bindingExpression("deletableContexts", "internal");
524
+ var numberOfUnSavedContexts = bindingExpression("unSavedContexts", "internal");
525
+ return and(deleteVisibility, ifElse(or(converterContext.getTemplateType() !== TemplateType.ObjectPage, isOnlyDynamicOnCurrentEntity), and(or(and(notEqual(numberOfDeletableContexts, undefined), greaterThan(length(numberOfDeletableContexts), 0)), and(notEqual(numberOfUnSavedContexts, undefined), greaterThan(length(numberOfUnSavedContexts), 0))), bindingExpression("deleteEnabled", "internal")), and(notEqual(numberOfSelectedContexts, 0), isDeletable)));
526
+ }
527
+ /**
528
+ * Gets the binding expression for the property enabled of the action Paste.
529
+ *
530
+ * @param {Expression<boolean>} pasteVisibility
531
+ * @param {Expression<boolean>} createEnablement
532
+ * @returns {Expression<boolean> }
533
+ */
534
+
535
+
536
+ _exports.getDeleteEnablement = getDeleteEnablement;
537
+
538
+ function getPasteEnablement(pasteVisibility, createEnablement) {
539
+ return and(pasteVisibility, createEnablement);
540
+ }
541
+ /**
542
+ * Gets the binding expression for the property enabled of the action MassEdit.
543
+ *
544
+ * @param {ConverterContext} converterContext
545
+ * @param {StandardActionsContext} standardActionsContext
546
+ * @param {Expression<boolean>} massEditVisibility
547
+ * @returns {Expression<boolean> }
548
+ */
549
+
550
+
551
+ _exports.getPasteEnablement = getPasteEnablement;
552
+
553
+ function getMassEditEnablement(converterContext, standardActionsContext, massEditVisibility) {
554
+ var pathUpdatableExpression = standardActionsContext.restrictions.isUpdatable.expression;
555
+ var isOnlyDynamicOnCurrentEntity = !isConstant(pathUpdatableExpression) && standardActionsContext.restrictions.isUpdatable.navigationExpression._type === "Unresolvable";
556
+ var numberOfSelectedContexts = greaterOrEqual(bindingExpression("numberOfSelectedContexts", "internal"), 1);
557
+ var numberOfUpdatableContexts = greaterOrEqual(length(bindingExpression("updatableContexts", "internal")), 1);
558
+ var bIsDraftSupported = isDraftSupported(converterContext);
559
+ var bDisplayMode = isInDisplayMode(converterContext); // numberOfUpdatableContexts needs to be added to the binding in case
560
+ // 1. Update is dependent on current entity property (isOnlyDynamicOnCurrentEntity is true).
561
+ // 2. The table is read only and draft enabled(like LR), in this case only active contexts can be mass edited.
562
+ // So, update depends on 'IsActiveEntity' value which needs to be checked runtime.
563
+
564
+ var runtimeBinding = ifElse(or(and(bDisplayMode, bIsDraftSupported), isOnlyDynamicOnCurrentEntity), and(numberOfSelectedContexts, numberOfUpdatableContexts), and(numberOfSelectedContexts));
565
+ return and(massEditVisibility, ifElse(isOnlyDynamicOnCurrentEntity, runtimeBinding, and(runtimeBinding, pathUpdatableExpression)));
566
+ }
567
+ /**
568
+ * Tells if the table in template is in display mode.
569
+ *
570
+ * @param {ConverterContext} converterContext
571
+ * @param {ViewPathConfiguration} viewConfiguration
572
+ * @returns {boolean}
573
+ */
574
+
575
+
576
+ _exports.getMassEditEnablement = getMassEditEnablement;
577
+
578
+ function isInDisplayMode(converterContext, viewConfiguration) {
579
+ var templateType = converterContext.getTemplateType();
580
+
581
+ if (templateType === TemplateType.ListReport || templateType === TemplateType.AnalyticalListPage || viewConfiguration && converterContext.getManifestWrapper().hasMultipleVisualizations(viewConfiguration)) {
582
+ return true;
583
+ } // updatable will be handled at the property level
584
+
585
+
586
+ return false;
587
+ }
588
+
589
+ _exports.isInDisplayMode = isInDisplayMode;
590
+ return _exports;
591
+ }, false);
592
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlN0YW5kYXJkQWN0aW9ucy50cyJdLCJuYW1lcyI6WyJBbm5vdGF0aW9uSGlkZGVuUHJvcGVydHkiLCJnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQiLCJjb252ZXJ0ZXJDb250ZXh0IiwiY3JlYXRpb25Nb2RlIiwidGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJ2aWV3Q29uZmlndXJhdGlvbiIsImNvbGxlY3Rpb25QYXRoIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJoaWRkZW5Bbm5vdGF0aW9uIiwiY3JlYXRlIiwiaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4iLCJDcmVhdGVIaWRkZW4iLCJEZWxldGVIaWRkZW4iLCJ1cGRhdGUiLCJVcGRhdGVIaWRkZW4iLCJpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQiLCJpc1ZpZXdXaXRoTXVsdGlwbGVWaXN1YWxpemF0aW9ucyIsImdldE1hbmlmZXN0V3JhcHBlciIsImhhc011bHRpcGxlVmlzdWFsaXphdGlvbnMiLCJuZXdBY3Rpb24iLCJnZXROZXdBY3Rpb24iLCJyZXN0cmljdGlvbnMiLCJnZXRSZXN0cmljdGlvbnMiLCJpc0RyYWZ0U3VwcG9ydGVkIiwiY3VycmVudEVudGl0eVNldCIsImdldEVudGl0eVNldCIsImJJc0RyYWZ0Um9vdCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRHJhZnRSb290IiwiYklzRHJhZnROb2RlIiwiRHJhZnROb2RlIiwiYklzRHJhZnRQYXJlbnRFbnRpdHlGb3JDb250YWlubWVudCIsInRhcmdldE9iamVjdCIsImNvbnRhaW5zVGFyZ2V0Iiwic3RhcnRpbmdFbnRpdHlTZXQiLCJiSXNEcmFmdFN1cHBvcnRlZCIsImJJc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsIm5ld0FjdGlvbk5hbWUiLCJOZXdBY3Rpb24iLCJ0b1N0cmluZyIsImF2YWlsYWJsZVByb3BlcnR5IiwiZ2V0RW50aXR5VHlwZSIsImFjdGlvbnMiLCJDb3JlIiwiT3BlcmF0aW9uQXZhaWxhYmxlIiwidW5kZWZpbmVkIiwibmFtZSIsImF2YWlsYWJsZSIsImFubm90YXRpb25FeHByZXNzaW9uIiwic0Fubm90YXRpb25UZXJtIiwiYldpdGhOYXZpZ2F0aW9uUGF0aCIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJ2aXNpdGVkTmF2aWdhdGlvblBhdGhzIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJsZW5ndGgiLCJhY3Rpb25Bbm5vdGF0aW9uVmFsdWUiLCJVSSIsInBhdGgiLCJzaW5nbGV0b25QYXRoVmlzaXRvciIsImdldENvbnZlcnRlZFR5cGVzIiwiY29uc3RhbnQiLCJyZXN0cmljdGlvbnNEZWYiLCJrZXkiLCJpc1BhdGhJbnNlcnRhYmxlIiwiaXNQYXRoVXBkYXRhYmxlIiwiaXNQYXRoRGVsZXRhYmxlIiwicmVzdWx0IiwiZm9yRWFjaCIsImRlZiIsImRlZkZ1bmN0aW9uIiwiZXhwcmVzc2lvbiIsImFwcGx5IiwicGF0aFZpc2l0b3IiLCJuYXZpZ2F0aW9uUGF0aHMiLCJuYXZpZ2F0aW9uRXhwcmVzc2lvbiIsImlnbm9yZVRhcmdldENvbGxlY3Rpb24iLCJhdXRob3JpemVVbnJlc29sdmFibGUiLCJnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyIsInN0YW5kYXJkQWN0aW9uc0NvbnRleHQiLCJpc0RyYWZ0T3JTdGlja3kiLCJpc0NyZWF0ZUFsd2F5c0hpZGRlbiIsIkNyZWF0aW9uTW9kZSIsIkV4dGVybmFsIiwiZ2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUiLCJjcmVhdGVWaXNpYmlsaXR5IiwiZ2V0Q3JlYXRlVmlzaWJpbGl0eSIsImlzVGVtcGxhdGVkIiwiY29tcGlsZUJpbmRpbmciLCJnZXRDcmVhdGVUZW1wbGF0aW5nIiwidmlzaWJsZSIsImVuYWJsZWQiLCJnZXRDcmVhdGVFbmFibGVtZW50IiwiZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUiLCJkZWxldGVWaXNpYmlsaXR5IiwiZ2V0RGVsZXRlVmlzaWJpbGl0eSIsImdldERlZmF1bHRUZW1wbGF0aW5nIiwiZ2V0RGVsZXRlRW5hYmxlbWVudCIsImdldENyZWF0aW9uUm93IiwiY3JlYXRpb25Sb3dWaXNpYmlsaXR5IiwiZ2V0Q3JlYXRpb25Sb3dFbmFibGVtZW50IiwiZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZSIsImlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZCIsImNyZWF0ZUVuYWJsZW1lbnQiLCJwYXN0ZVZpc2liaWxpdHkiLCJnZXRQYXN0ZVZpc2liaWxpdHkiLCJnZXRQYXN0ZUVuYWJsZW1lbnQiLCJnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0IiwibWFzc0VkaXRWaXNpYmlsaXR5IiwiZ2V0TWFzc0VkaXRWaXNpYmlsaXR5IiwiZ2V0TWFzc0VkaXRFbmFibGVtZW50IiwiaXNGb3JDcmVhdGlvblJvdyIsImFuZCIsIm9yIiwiQ3JlYXRpb25Sb3ciLCJub3QiLCJpc0NvbnN0YW50IiwiYWN0aW9uVmlzaWJpbGl0eSIsImlzSW5zZXJ0YWJsZSIsImlzQ3JlYXRlSGlkZGVuIiwiaWZFbHNlIiwiZ2V0VGVtcGxhdGVUeXBlIiwiVGVtcGxhdGVUeXBlIiwiTGlzdFJlcG9ydCIsIklzRWRpdGFibGUiLCJlcXVhbCIsIkFuYWx5dGljYWxMaXN0UGFnZSIsImlzQmluZGluZyIsImlzRGVsZXRlSGlkZGVuIiwiZGVsZXRlIiwicGF0aERlbGV0YWJsZUV4cHJlc3Npb24iLCJpc0RlbGV0YWJsZSIsImJpbmRpbmdFeHByZXNzaW9uIiwibm90RXF1YWwiLCJlbmFibGVQYXN0ZSIsImluZGV4T2YiLCJpc1VwZGF0ZUhpZGRlbiIsInBhdGhVcGRhdGFibGVFeHByZXNzaW9uIiwiaXNVcGRhdGFibGUiLCJiTWFzc0VkaXRFbmFibGVkSW5NYW5pZmVzdCIsImVuYWJsZU1hc3NFZGl0IiwidGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiIsIk9iamVjdFBhZ2UiLCJyZXN0cmljdGlvbnNJbnNlcnRhYmxlIiwicGFydG5lciIsIl90eXBlIiwiZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSIsImZvcm1hdFJlc3VsdCIsInRhYmxlRm9ybWF0dGVycyIsInZhbGlkYXRlQ3JlYXRpb25Sb3dGaWVsZHMiLCJDb2xsZWN0aW9uVHlwZSIsInJlc29sdmVBYnNvbHV0ZVBhdGgiLCJ0YXJnZXQiLCJpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5IiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIiwibnVtYmVyT2ZEZWxldGFibGVDb250ZXh0cyIsIm51bWJlck9mVW5TYXZlZENvbnRleHRzIiwiZ3JlYXRlclRoYW4iLCJncmVhdGVyT3JFcXVhbCIsIm51bWJlck9mVXBkYXRhYmxlQ29udGV4dHMiLCJiRGlzcGxheU1vZGUiLCJpc0luRGlzcGxheU1vZGUiLCJydW50aW1lQmluZGluZyIsInRlbXBsYXRlVHlwZSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BMEJLQSx3Qjs7YUFBQUEsd0I7QUFBQUEsSUFBQUEsd0I7QUFBQUEsSUFBQUEsd0I7QUFBQUEsSUFBQUEsd0I7S0FBQUEsd0IsS0FBQUEsd0I7O0FBb0NMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFdBQVNDLDhCQUFULENBQ05DLGdCQURNLEVBRU5DLFlBRk0sRUFHTkMsMEJBSE0sRUFJTkMsaUJBSk0sRUFLbUI7QUFDekIsV0FBTztBQUNOQyxNQUFBQSxjQUFjLEVBQUVDLG1CQUFtQixDQUFDTCxnQkFBZ0IsQ0FBQ00sc0JBQWpCLEVBQUQsQ0FEN0I7QUFFTkMsTUFBQUEsZ0JBQWdCLEVBQUU7QUFDakJDLFFBQUFBLE1BQU0sRUFBRUMsdUJBQXVCLENBQUNULGdCQUFELEVBQW1CRix3QkFBd0IsQ0FBQ1ksWUFBNUMsQ0FEZDtBQUVqQixrQkFBVUQsdUJBQXVCLENBQUNULGdCQUFELEVBQW1CRix3QkFBd0IsQ0FBQ2EsWUFBNUMsQ0FGaEI7QUFHakJDLFFBQUFBLE1BQU0sRUFBRUgsdUJB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LFVBQTlCLElBQ0F3QyxZQUFZLEtBQUt6QyxZQUFZLENBQUNJLGtCQUQ5QixJQUVDNUgsaUJBQWlCLElBQUlILGdCQUFnQixDQUFDZ0Isa0JBQWpCLEdBQXNDQyx5QkFBdEMsQ0FBZ0VkLGlCQUFoRSxDQUh2QixFQUlFO0FBQ0QsYUFBTyxJQUFQO0FBQ0EsS0FSc0gsQ0FTdkg7OztBQUNBLFdBQU8sS0FBUDtBQUNBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vLi4vLi4vQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHtcblx0YW5kLFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0YmluZGluZ0V4cHJlc3Npb24sXG5cdEJpbmRpbmdFeHByZXNzaW9uLFxuXHRjb21waWxlQmluZGluZyxcblx0Y29uc3RhbnQsXG5cdGVxdWFsLFxuXHRsZW5ndGgsXG5cdEV4cHJlc3Npb24sXG5cdGdyZWF0ZXJPckVxdWFsLFxuXHRpZkVsc2UsXG5cdGlzQmluZGluZyxcblx0aXNDb25zdGFudCxcblx0bm90LFxuXHRub3RFcXVhbCxcblx0b3IsXG5cdGdyZWF0ZXJUaGFuLFxuXHRmb3JtYXRSZXN1bHRcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0V4cHJlc3Npb25cIjtcbmltcG9ydCB7IENyZWF0aW9uTW9kZSwgVGVtcGxhdGVUeXBlLCBWaWV3UGF0aENvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vLi4vLi4vTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgc2luZ2xldG9uUGF0aFZpc2l0b3IsIFVJIH0gZnJvbSBcIi4uLy4uLy4uL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IHsgUHJvcGVydHlBbm5vdGF0aW9uVmFsdWUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB7IGdldFRhcmdldE9iamVjdFBhdGgsIGlzUGF0aERlbGV0YWJsZSwgaXNQYXRoSW5zZXJ0YWJsZSwgaXNQYXRoVXBkYXRhYmxlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgVGFibGVDb250cm9sQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuLi9UYWJsZVwiO1xuaW1wb3J0IHRhYmxlRm9ybWF0dGVycyBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9UYWJsZUZvcm1hdHRlclwiO1xuXG5lbnVtIEFubm90YXRpb25IaWRkZW5Qcm9wZXJ0eSB7XG5cdENyZWF0ZUhpZGRlbiA9IFwiQ3JlYXRlSGlkZGVuXCIsXG5cdERlbGV0ZUhpZGRlbiA9IFwiRGVsZXRlSGlkZGVuXCIsXG5cdFVwZGF0ZUhpZGRlbiA9IFwiVXBkYXRlSGlkZGVuXCJcbn1cblxuZXhwb3J0IHR5cGUgU3RhbmRhcmRBY3Rpb25Db25maWdUeXBlID0ge1xuXHRpc1RlbXBsYXRlZD86IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHR2aXNpYmxlOiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPjtcblx0ZW5hYmxlZDogQmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj47XG59O1xuXG50eXBlIEV4cHJlc3Npb25SZXN0cmljdGlvbnNUeXBlID0ge1xuXHRleHByZXNzaW9uOiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRuYXZpZ2F0aW9uRXhwcmVzc2lvbjogRXhwcmVzc2lvbjxib29sZWFuPjtcbn07XG50eXBlIFN0YW5kYXJkQWN0aW9uc1Jlc3RyaWN0aW9uc1R5cGUgPSBSZWNvcmQ8c3RyaW5nLCBFeHByZXNzaW9uUmVzdHJpY3Rpb25zVHlwZT47XG5cbmV4cG9ydCB0eXBlIFN0YW5kYXJkQWN0aW9uc0NvbnRleHQgPSB7XG5cdGNvbGxlY3Rpb25QYXRoOiBzdHJpbmc7XG5cdGhpZGRlbkFubm90YXRpb246IHtcblx0XHRjcmVhdGU6IEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdFx0XCJkZWxldGVcIjogRXhwcmVzc2lvbjxib29sZWFuPjtcblx0XHR1cGRhdGU6IEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdH07XG5cdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlO1xuXHRpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQ6IGJvb2xlYW47XG5cdGlzVmlld1dpdGhNdWx0aXBsZVZpc3VhbGl6YXRpb25zOiBib29sZWFuO1xuXHRuZXdBY3Rpb24/OiB7XG5cdFx0bmFtZT86IHN0cmluZztcblx0XHRhdmFpbGFibGU/OiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHR9O1xuXHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbjtcblx0cmVzdHJpY3Rpb25zOiBTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIGNvbnRleHQgZm9yIHRoZSBzdGFuZGFyZCBhY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9ufSBjcmVhdGlvbk1vZGVcbiAqIEBwYXJhbSB7VGFibGVDb250cm9sQ29uZmlndXJhdGlvbn0gdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7Vmlld1BhdGhDb25maWd1cmF0aW9ufSB2aWV3Q29uZmlndXJhdGlvblxuICogQHJldHVybnMgIFRoZSBjb250ZXh0IGZvciB0YWJsZSBhY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLFxuXHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbixcblx0dmlld0NvbmZpZ3VyYXRpb24/OiBWaWV3UGF0aENvbmZpZ3VyYXRpb25cbik6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQge1xuXHRyZXR1cm4ge1xuXHRcdGNvbGxlY3Rpb25QYXRoOiBnZXRUYXJnZXRPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSxcblx0XHRoaWRkZW5Bbm5vdGF0aW9uOiB7XG5cdFx0XHRjcmVhdGU6IGlzQWN0aW9uQW5ub3RhdGVkSGlkZGVuKGNvbnZlcnRlckNvbnRleHQsIEFubm90YXRpb25IaWRkZW5Qcm9wZXJ0eS5DcmVhdGVIaWRkZW4pLFxuXHRcdFx0XCJkZWxldGVcIjogaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4oY29udmVydGVyQ29udGV4dCwgQW5ub3RhdGlvbkhpZGRlblByb3BlcnR5LkRlbGV0ZUhpZGRlbiksXG5cdFx0XHR1cGRhdGU6IGlzQWN0aW9uQW5ub3RhdGVkSGlkZGVuKGNvbnZlcnRlckNvbnRleHQsIEFubm90YXRpb25IaWRkZW5Qcm9wZXJ0eS5VcGRhdGVIaWRkZW4pXG5cdFx0fSxcblx0XHRjcmVhdGlvbk1vZGU6IGNyZWF0aW9uTW9kZSxcblx0XHRpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQ6IGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRpc1ZpZXdXaXRoTXVsdGlwbGVWaXN1YWxpemF0aW9uczogdmlld0NvbmZpZ3VyYXRpb25cblx0XHRcdD8gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5oYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zKHZpZXdDb25maWd1cmF0aW9uKVxuXHRcdFx0OiBmYWxzZSxcblx0XHRuZXdBY3Rpb246IGdldE5ld0FjdGlvbihjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG5cdFx0cmVzdHJpY3Rpb25zOiBnZXRSZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dClcblx0fTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgZHJhZnQgaXMgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBib29sZWFuIHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IGJJc0RyYWZ0Um9vdCA9IGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QgPyB0cnVlIDogZmFsc2U7XG5cdGNvbnN0IGJJc0RyYWZ0Tm9kZSA9IGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdE5vZGUgPyB0cnVlIDogZmFsc2U7XG5cdGNvbnN0IGJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQgPVxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldE9iamVjdD8uY29udGFpbnNUYXJnZXQgJiZcblx0XHQoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkuc3RhcnRpbmdFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCB8fFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkuc3RhcnRpbmdFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Tm9kZSlcblx0XHRcdD8gdHJ1ZVxuXHRcdFx0OiBmYWxzZTtcblxuXHRyZXR1cm4gYklzRHJhZnRSb290IHx8IGJJc0RyYWZ0Tm9kZSB8fCAoIWNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkgJiYgYklzRHJhZnRQYXJlbnRFbnRpdHlGb3JDb250YWlubWVudCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHN0aWNreSBvciBkcmFmdCBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYm9vbGVhbiB7XG5cdGNvbnN0IGJJc0RyYWZ0U3VwcG9ydGVkID0gaXNEcmFmdFN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgYklzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnN0YXJ0aW5nRW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uU2Vzc2lvblxuXHRcdD8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdD8gdHJ1ZVxuXHRcdDogZmFsc2U7XG5cblx0cmV0dXJuIGJJc0RyYWZ0U3VwcG9ydGVkIHx8IGJJc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29uZmlndXJlZCBuZXdBY3Rpb24gaW50byBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge2FueX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5ld0FjdGlvbihjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYW55IHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IG5ld0FjdGlvbk5hbWU6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4gPSAoXG5cdFx0Y3VycmVudEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290Py5OZXdBY3Rpb24gfHxcblx0XHRjdXJyZW50RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uTmV3QWN0aW9uXG5cdCk/LnRvU3RyaW5nKCk7XG5cdGlmIChuZXdBY3Rpb25OYW1lKSB7XG5cdFx0bGV0IGF2YWlsYWJsZVByb3BlcnR5OiBhbnkgPSBjb252ZXJ0ZXJDb250ZXh0Py5nZXRFbnRpdHlUeXBlKCkuYWN0aW9uc1tuZXdBY3Rpb25OYW1lXT8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZTtcblx0XHRhdmFpbGFibGVQcm9wZXJ0eSA9IGF2YWlsYWJsZVByb3BlcnR5ICE9PSB1bmRlZmluZWQgPyBhdmFpbGFibGVQcm9wZXJ0eSA6IHRydWU7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5hbWU6IG5ld0FjdGlvbk5hbWUsXG5cdFx0XHRhdmFpbGFibGU6IGFubm90YXRpb25FeHByZXNzaW9uKGF2YWlsYWJsZVByb3BlcnR5KVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBhY3Rpb24gdmlzaWJpbGl0eSBjb25maWd1cmVkIGludG8gYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzQW5ub3RhdGlvblRlcm1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYldpdGhOYXZpZ2F0aW9uUGF0aFxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FjdGlvbkFubm90YXRlZEhpZGRlbihcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c0Fubm90YXRpb25UZXJtOiBzdHJpbmcsXG5cdGJXaXRoTmF2aWdhdGlvblBhdGggPSB0cnVlXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0Ly8gQ29uc2lkZXIgb25seSB0aGUgbGFzdCBsZXZlbCBvZiBuYXZpZ2F0aW9uLiBUaGUgb3RoZXJzIGFyZSBhbHJlYWR5IGNvbnNpZGVyZWQgaW4gdGhlIGVsZW1lbnQgYmluZGluZyBvZiB0aGUgcGFnZS5cblx0Y29uc3QgdmlzaXRlZE5hdmlnYXRpb25QYXRocyA9XG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggPiAwICYmIGJXaXRoTmF2aWdhdGlvblBhdGhcblx0XHRcdD8gW2RhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXNbZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggLSAxXS5uYW1lXVxuXHRcdFx0OiBbXTtcblx0Y29uc3QgYWN0aW9uQW5ub3RhdGlvblZhbHVlID1cblx0XHQoKGN1cnJlbnRFbnRpdHlTZXQ/LmFubm90YXRpb25zLlVJIGFzIGFueSk/LltzQW5ub3RhdGlvblRlcm1dIGFzIFByb3BlcnR5QW5ub3RhdGlvblZhbHVlPGJvb2xlYW4+KSB8fCBmYWxzZTtcblxuXHRyZXR1cm4gY3VycmVudEVudGl0eVNldFxuXHRcdD8gYW5ub3RhdGlvbkV4cHJlc3Npb24oYWN0aW9uQW5ub3RhdGlvblZhbHVlLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCB1bmRlZmluZWQsIChwYXRoOiBzdHJpbmcpID0+XG5cdFx0XHRcdHNpbmdsZXRvblBhdGhWaXNpdG9yKHBhdGgsIGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVkVHlwZXMoKSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocylcblx0XHQgIClcblx0XHQ6IGNvbnN0YW50KGZhbHNlKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBhbm5vdGF0ZWQgcmVzdHJpY3Rpb25zIGZvciB0aGUgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIHtTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCByZXN0cmljdGlvbnNEZWYgPSBbXG5cdFx0e1xuXHRcdFx0a2V5OiBcImlzSW5zZXJ0YWJsZVwiLFxuXHRcdFx0XCJmdW5jdGlvblwiOiBpc1BhdGhJbnNlcnRhYmxlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IFwiaXNVcGRhdGFibGVcIixcblx0XHRcdFwiZnVuY3Rpb25cIjogaXNQYXRoVXBkYXRhYmxlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IFwiaXNEZWxldGFibGVcIixcblx0XHRcdFwiZnVuY3Rpb25cIjogaXNQYXRoRGVsZXRhYmxlXG5cdFx0fVxuXHRdO1xuXHRjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIEV4cHJlc3Npb25SZXN0cmljdGlvbnNUeXBlPiA9IHt9O1xuXHRyZXN0cmljdGlvbnNEZWYuZm9yRWFjaChmdW5jdGlvbihkZWYpIHtcblx0XHRjb25zdCBkZWZGdW5jdGlvbiA9IGRlZltcImZ1bmN0aW9uXCJdO1xuXHRcdHJlc3VsdFtkZWYua2V5XSA9IHtcblx0XHRcdGV4cHJlc3Npb246IGRlZkZ1bmN0aW9uLmFwcGx5KG51bGwsIFtcblx0XHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHBhdGhWaXNpdG9yOiAocGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdKSA9PlxuXHRcdFx0XHRcdFx0c2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLCBuYXZpZ2F0aW9uUGF0aHMpXG5cdFx0XHRcdH1cblx0XHRcdF0pLFxuXHRcdFx0bmF2aWdhdGlvbkV4cHJlc3Npb246IGRlZkZ1bmN0aW9uLmFwcGx5KG51bGwsIFtcblx0XHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlnbm9yZVRhcmdldENvbGxlY3Rpb246IHRydWUsXG5cdFx0XHRcdFx0YXV0aG9yaXplVW5yZXNvbHZhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHBhdGhWaXNpdG9yOiAocGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdKSA9PlxuXHRcdFx0XHRcdFx0c2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLCBuYXZpZ2F0aW9uUGF0aHMpXG5cdFx0XHRcdH1cblx0XHRcdF0pXG5cdFx0fTtcblx0fSk7XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRlbXBsYXRpbmcgZm9yIGluc2VydC91cGRhdGUgYWN0aW9ucyBpcyBtYW5kYXRvcnkuXG4gKlxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzRHJhZnRPclN0aWNreVxuICogQHBhcmFtIHtib29sZWFufSBpc0NyZWF0ZUFsd2F5c0hpZGRlblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyhcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0aXNEcmFmdE9yU3RpY2t5OiBib29sZWFuLFxuXHRpc0NyZWF0ZUFsd2F5c0hpZGRlbjogYm9vbGVhblxuKTogYm9vbGVhbiB7XG5cdHJldHVybiAoaXNEcmFmdE9yU3RpY2t5IHx8IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpICYmICFpc0NyZWF0ZUFsd2F5c0hpZGRlbjtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydGllcyBvZiB0aGUgYWN0aW9uIENyZWF0ZS5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHJldHVybnMge1N0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4pOiBTdGFuZGFyZEFjdGlvbkNvbmZpZ1R5cGUge1xuXHRjb25zdCBjcmVhdGVWaXNpYmlsaXR5ID0gZ2V0Q3JlYXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0cmV0dXJuIHtcblx0XHRpc1RlbXBsYXRlZDogY29tcGlsZUJpbmRpbmcoZ2V0Q3JlYXRlVGVtcGxhdGluZyhzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGVWaXNpYmlsaXR5KSksXG5cdFx0dmlzaWJsZTogY29tcGlsZUJpbmRpbmcoY3JlYXRlVmlzaWJpbGl0eSksXG5cdFx0ZW5hYmxlZDogY29tcGlsZUJpbmRpbmcoZ2V0Q3JlYXRlRW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGVWaXNpYmlsaXR5KSlcblx0fTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydGllcyBvZiB0aGUgYWN0aW9uIERlbGV0ZS5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHJldHVybnMge1N0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYXJkQWN0aW9uRGVsZXRlKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4pOiBTdGFuZGFyZEFjdGlvbkNvbmZpZ1R5cGUge1xuXHRjb25zdCBkZWxldGVWaXNpYmlsaXR5ID0gZ2V0RGVsZXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblxuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlQmluZGluZyhnZXREZWZhdWx0VGVtcGxhdGluZyhkZWxldGVWaXNpYmlsaXR5KSksXG5cdFx0dmlzaWJsZTogY29tcGlsZUJpbmRpbmcoZGVsZXRlVmlzaWJpbGl0eSksXG5cdFx0ZW5hYmxlZDogY29tcGlsZUJpbmRpbmcoZ2V0RGVsZXRlRW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBkZWxldGVWaXNpYmlsaXR5KSlcblx0fTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRpb25Sb3coXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IGNyZWF0aW9uUm93VmlzaWJpbGl0eSA9IGdldENyZWF0ZVZpc2liaWxpdHkoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgdHJ1ZSk7XG5cblx0cmV0dXJuIHtcblx0XHRpc1RlbXBsYXRlZDogY29tcGlsZUJpbmRpbmcoZ2V0Q3JlYXRlVGVtcGxhdGluZyhzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGlvblJvd1Zpc2liaWxpdHksIHRydWUpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhjcmVhdGlvblJvd1Zpc2liaWxpdHkpLFxuXHRcdGVuYWJsZWQ6IGNvbXBpbGVCaW5kaW5nKGdldENyZWF0aW9uUm93RW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGlvblJvd1Zpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhY3Rpb24gUGFzdGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkXG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuXG4pOiBTdGFuZGFyZEFjdGlvbkNvbmZpZ1R5cGUge1xuXHRjb25zdCBjcmVhdGVWaXNpYmlsaXR5ID0gZ2V0Q3JlYXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgY3JlYXRlRW5hYmxlbWVudCA9IGdldENyZWF0ZUVuYWJsZW1lbnQoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgY3JlYXRlVmlzaWJpbGl0eSk7XG5cdGNvbnN0IHBhc3RlVmlzaWJpbGl0eSA9IGdldFBhc3RlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGVWaXNpYmlsaXR5LCBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWQpO1xuXHRyZXR1cm4ge1xuXHRcdHZpc2libGU6IGNvbXBpbGVCaW5kaW5nKHBhc3RlVmlzaWJpbGl0eSksXG5cdFx0ZW5hYmxlZDogY29tcGlsZUJpbmRpbmcoZ2V0UGFzdGVFbmFibGVtZW50KHBhc3RlVmlzaWJpbGl0eSwgY3JlYXRlRW5hYmxlbWVudCkpXG5cdH07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGFjdGlvbiBNYXNzRWRpdC5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHJldHVybnMge1N0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IG1hc3NFZGl0VmlzaWJpbGl0eSA9IGdldE1hc3NFZGl0VmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblxuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlQmluZGluZyhnZXREZWZhdWx0VGVtcGxhdGluZyhtYXNzRWRpdFZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhtYXNzRWRpdFZpc2liaWxpdHkpLFxuXHRcdGVuYWJsZWQ6IGNvbXBpbGVCaW5kaW5nKGdldE1hc3NFZGl0RW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBtYXNzRWRpdFZpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHRlbXBsYXRpbmcgb2YgdGhlIGFjdGlvbiBDcmVhdGUuXG4gKlxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGNyZWF0ZVZpc2liaWxpdHlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNGb3JDcmVhdGlvblJvd1xuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj4gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRlVGVtcGxhdGluZyhcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Y3JlYXRlVmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPixcblx0aXNGb3JDcmVhdGlvblJvdyA9IGZhbHNlXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Ly9UZW1wbGF0aW5nIG9mIENyZWF0ZSBCdXR0b24gaXMgbm90IGRvbmU6XG5cdC8vIFx0IC0gSWYgQnV0dG9uIGlzIG5ldmVyIHZpc2libGUoY292ZXJlZCB0aGUgRXh0ZXJuYWwgY3JlYXRlIGJ1dHRvbiwgbmV3IEFjdGlvbilcblx0Ly9cdCAtIG9yIENyZWF0aW9uTW9kZSBpcyBvbiBDcmVhdGlvblJvdyBmb3IgQ3JlYXRlIEJ1dHRvblxuXHQvL1x0IC0gb3IgQ3JlYXRpb25Nb2RlIGlzIG5vdCBvbiBDcmVhdGlvblJvdyBmb3IgQ3JlYXRpb25Sb3cgQnV0dG9uXG5cblx0cmV0dXJuIGFuZChcblx0XHQvL1hOT1IgZ2F0ZVxuXHRcdG9yKFxuXHRcdFx0YW5kKGlzRm9yQ3JlYXRpb25Sb3csIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cpLFxuXHRcdFx0YW5kKCFpc0ZvckNyZWF0aW9uUm93LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93KVxuXHRcdCksXG5cdFx0b3Iobm90KGlzQ29uc3RhbnQoY3JlYXRlVmlzaWJpbGl0eSkpLCBjcmVhdGVWaXNpYmlsaXR5KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHRlbXBsYXRpbmcgb2YgdGhlIG5vbi1DcmVhdGUgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGFjdGlvblZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRUZW1wbGF0aW5nKGFjdGlvblZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIG9yKG5vdChpc0NvbnN0YW50KGFjdGlvblZpc2liaWxpdHkpKSwgYWN0aW9uVmlzaWJpbGl0eSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgcHJvcGVydHkgdmlzaWJsZSBvZiB0aGUgYWN0aW9uIENyZWF0ZS5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHBhcmFtIHtib29sZWFufSBpc0ZvckNyZWF0aW9uUm93XG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDcmVhdGVWaXNpYmlsaXR5KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRpc0ZvckNyZWF0aW9uUm93ID0gZmFsc2Vcbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0luc2VydGFibGUgPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0luc2VydGFibGUuZXhwcmVzc2lvbjtcblx0Y29uc3QgaXNDcmVhdGVIaWRkZW4gPSBpc0ZvckNyZWF0aW9uUm93XG5cdFx0PyBpc0FjdGlvbkFubm90YXRlZEhpZGRlbihjb252ZXJ0ZXJDb250ZXh0LCBBbm5vdGF0aW9uSGlkZGVuUHJvcGVydHkuQ3JlYXRlSGlkZGVuLCBmYWxzZSlcblx0XHQ6IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaGlkZGVuQW5ub3RhdGlvbi5jcmVhdGU7XG5cdGNvbnN0IG5ld0FjdGlvbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQubmV3QWN0aW9uO1xuXG5cdC8vQ3JlYXRlIEJ1dHRvbiBpcyB2aXNpYmxlOlxuXHQvLyBcdCAtIElmIHRoZSBjcmVhdGlvbiBtb2RlIGlzIGV4dGVybmFsXG5cdC8vICAgICAgLSBJZiB3ZSdyZSBvbiB0aGUgbGlzdCByZXBvcnQgYW5kIGNyZWF0ZSBpcyBub3QgaGlkZGVuXG5cdC8vXHRcdC0gT3RoZXJ3aXNlIHRoaXMgZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YgdGhlIHRoZSBVSS5Jc0VkaXRhYmxlXG5cdC8vICAgLSBPdGhlcndpc2Vcblx0Ly8gXHQgXHQtIElmIHdlJ3JlIG9uIHRoZSBsaXN0IHJlcG9ydCAtPlxuXHQvLyBcdCBcdFx0LSBJZiBVSS5DcmVhdGVIaWRkZW4gcG9pbnRzIHRvIGEgcHJvcGVydHkgcGF0aCAtPiBwcm92aWRlIGEgbmVnYXRlZCBiaW5kaW5nIHRvIHRoaXMgcGF0aFxuXHQvLyBcdCBcdFx0LSBPdGhlcndpc2UsIGNyZWF0ZSBpcyB2aXNpYmxlXG5cdC8vIFx0IFx0LSBPdGhlcndpc2Vcblx0Ly8gXHQgIFx0IC0gVGhpcyBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiB0aGUgdGhlIFVJLklzRWRpdGFibGVcblx0cmV0dXJuIGlmRWxzZShcblx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsLFxuXHRcdGFuZChub3QoaXNDcmVhdGVIaWRkZW4pLCBvcihjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCwgVUkuSXNFZGl0YWJsZSkpLFxuXHRcdGlmRWxzZShcblx0XHRcdG9yKFxuXHRcdFx0XHRhbmQoaXNDb25zdGFudChuZXdBY3Rpb24/LmF2YWlsYWJsZSksIGVxdWFsKG5ld0FjdGlvbj8uYXZhaWxhYmxlLCBmYWxzZSkpLFxuXHRcdFx0XHRhbmQoaXNDb25zdGFudChpc0luc2VydGFibGUpLCBlcXVhbChpc0luc2VydGFibGUsIGZhbHNlKSwgIW5ld0FjdGlvbiksXG5cdFx0XHRcdGFuZChpc0NvbnN0YW50KGlzQ3JlYXRlSGlkZGVuKSwgZXF1YWwoaXNDcmVhdGVIaWRkZW4sIHRydWUpKSxcblx0XHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5pc1ZpZXdXaXRoTXVsdGlwbGVWaXN1YWxpemF0aW9ucyxcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZVxuXHRcdFx0KSxcblx0XHRcdGZhbHNlLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCxcblx0XHRcdFx0b3Iobm90KGlzQmluZGluZyhpc0NyZWF0ZUhpZGRlbikpLCBub3QoaXNDcmVhdGVIaWRkZW4pKSxcblx0XHRcdFx0YW5kKG5vdChpc0NyZWF0ZUhpZGRlbiksIFVJLklzRWRpdGFibGUpXG5cdFx0XHQpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IHZpc2libGUgb2YgdGhlIGFjdGlvbiBEZWxldGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZVZpc2liaWxpdHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0RlbGV0ZUhpZGRlbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaGlkZGVuQW5ub3RhdGlvbi5kZWxldGU7XG5cdGNvbnN0IHBhdGhEZWxldGFibGVFeHByZXNzaW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNEZWxldGFibGUuZXhwcmVzc2lvbjtcblxuXHQvL0RlbGV0ZSBCdXR0b24gaXMgdmlzaWJsZTpcblx0Ly8gXHQgUHJlcmVxdWlzaXRlczpcblx0Ly9cdCAtIElmIHdlJ3JlIG5vdCBvbiBtdWx0aXBsZSB2aXN1YWxpemF0aW9ucyBjb25maWd1cmF0aW9uIG9yIEFMUFxuXHQvL1xuXHQvLyAgIC0gSWYgcmVzdHJpY3Rpb25zIG9uIGRlbGV0YWJsZSBzZXQgdG8gZmFsc2UgLT4gbm90IHZpc2libGVcblx0Ly8gICAtIE90aGVyd2lzZVxuXHQvL1x0XHRcdC0gSWYgVUkuRGVsZXRlSGlkZGVuIGlzIHRydWUgLT4gbm90IHZpc2libGVcblx0Ly9cdFx0XHQtIE90aGVyd2lzZVxuXHQvLyBcdCBcdFx0XHQtIElmIHdlJ3JlIG9uIE9QIC0+IGRlcGVuZGluZyBvZiB0aGUgZWRpdE1vZGUgYW5kIHJlc3RyaWN0aW9ucyBvbiBkZWxldGFibGVcblx0Ly9cdFx0XHRcdC0gT3RoZXJ3aXNlXG5cdC8vXHRcdFx0XHQgXHQtIElmIFVJLkRlbGV0ZUhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSBwYXRoIC0+IHByb3ZpZGUgYSBuZWdhdGVkIGJpbmRpbmcgdG8gdGhpcyBwYXRoXG5cdC8vXHQgXHQgXHRcdCBcdC0gT3RoZXJ3aXNlLCBkZWxldGUgaXMgdmlzaWJsZVxuXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0b3Ioc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5pc1ZpZXdXaXRoTXVsdGlwbGVWaXN1YWxpemF0aW9ucywgY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSksXG5cdFx0ZmFsc2UsXG5cdFx0aWZFbHNlKFxuXHRcdFx0YW5kKGlzQ29uc3RhbnQocGF0aERlbGV0YWJsZUV4cHJlc3Npb24pLCBlcXVhbChwYXRoRGVsZXRhYmxlRXhwcmVzc2lvbiwgZmFsc2UpKSxcblx0XHRcdGZhbHNlLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRhbmQoaXNDb25zdGFudChpc0RlbGV0ZUhpZGRlbiksIGVxdWFsKGlzRGVsZXRlSGlkZGVuLCBjb25zdGFudCh0cnVlKSkpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LFxuXHRcdFx0XHRcdGFuZChub3QoaXNEZWxldGVIaWRkZW4pLCBlcXVhbChiaW5kaW5nRXhwcmVzc2lvbihcIi9lZGl0TW9kZVwiLCBcInVpXCIpLCBcIkVkaXRhYmxlXCIpKSxcblx0XHRcdFx0XHRub3QoYW5kKGlzQmluZGluZyhpc0RlbGV0ZUhpZGRlbiksIGlzRGVsZXRlSGlkZGVuKSlcblx0XHRcdFx0KVxuXHRcdFx0KVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gUGFzdGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gY3JlYXRlVmlzaWJpbGl0eVxuICogQHBhcmFtIHtib29sZWFufSBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhc3RlVmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Y3JlYXRlVmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPixcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Ly8gSWYgQ3JlYXRlIGlzIHZpc2libGUsIGVuYWJsZVBhc3RlIGlzIG5vdCBkaXNhYmxlZCBpbnRvIG1hbmlmZXN0IGFuZCB3ZSBhcmUgb24gT1AvYmxvY2tzIG91dHNpZGUgRmlvcmkgZWxlbWVudHMgdGVtcGxhdGVzXG5cdC8vIFRoZW4gYnV0dG9uIHdpbGwgYmUgdmlzaWJsZSBhY2NvcmRpbmcgdG8gaW5zZXJ0YWJsZSByZXN0cmljdGlvbnMgYW5kIGNyZWF0ZSB2aXNpYmlsaXR5XG5cdC8vIE90aGVyd2lzZSBpdCdzIG5vdCB2aXNpYmxlXG5cdHJldHVybiBhbmQoXG5cdFx0bm90RXF1YWwoc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5lbmFibGVQYXN0ZSwgZmFsc2UpLFxuXHRcdGNyZWF0ZVZpc2liaWxpdHksXG5cdFx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkLFxuXHRcdFtUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCwgVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZV0uaW5kZXhPZihjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpKSA9PT0gLTEsXG5cdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNJbnNlcnRhYmxlLmV4cHJlc3Npb25cblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gTWFzc0VkaXQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hc3NFZGl0VmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGlzVXBkYXRlSGlkZGVuID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5oaWRkZW5Bbm5vdGF0aW9uLnVwZGF0ZSxcblx0XHRwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLmV4cHJlc3Npb24sXG5cdFx0Yk1hc3NFZGl0RW5hYmxlZEluTWFuaWZlc3Q6IGJvb2xlYW4gPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPy5lbmFibGVNYXNzRWRpdCB8fCBmYWxzZTtcblx0Y29uc3QgdGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiA9XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2Vcblx0XHRcdD8gZXF1YWwoVUkuSXNFZGl0YWJsZSwgdHJ1ZSlcblx0XHRcdDogY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQ7XG5cdC8vTWFzc0VkaXQgaXMgdmlzaWJsZVxuXHQvLyBJZlxuXHQvL1x0XHQtIHRoZXJlIGlzIG5vIHN0YXRpYyByZXN0cmljdGlvbnMgc2V0IHRvIGZhbHNlXG5cdC8vXHRcdC0gYW5kIGVuYWJsZU1hc3NFZGl0IGlzIG5vdCBzZXQgdG8gZmFsc2UgaW50byB0aGUgbWFuaWZlc3Rcblx0Ly9cdFx0LSBhbmQgdGhlIHNlbGVjdGlvbk1vZGUgaXMgcmVsZXZhbnRcblx0Ly9cdFRoZW4gTWFzc0VkaXQgaXMgYWx3YXlzIHZpc2libGUgaW4gTFIgb3IgZHluYW1pY2FsbHkgdmlzaWJsZSBpbiBPUCBhY2NvcmRpbmcgdG8gdWk+RWRpdGFibGUgYW5kIGhpZGRlbkFubm90YXRpb25cblx0Ly8gIEJ1dHRvbiBpcyBoaWRkZW4gZm9yIGFsbCBvdGhlciBjYXNlc1xuXHRyZXR1cm4gYW5kKFxuXHRcdG5vdChhbmQoaXNDb25zdGFudChwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiksIGVxdWFsKHBhdGhVcGRhdGFibGVFeHByZXNzaW9uLCBmYWxzZSkpKSxcblx0XHRiTWFzc0VkaXRFbmFibGVkSW5NYW5pZmVzdCxcblx0XHR0ZW1wbGF0ZUJpbmRpbmdFeHByZXNzaW9uLFxuXHRcdG5vdChpc1VwZGF0ZUhpZGRlbilcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBjcmVhdGlvblJvdy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHBhcmFtIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBjcmVhdGlvblJvd1Zpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0aW9uUm93RW5hYmxlbWVudChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Y3JlYXRpb25Sb3dWaXNpYmlsaXR5OiBFeHByZXNzaW9uPGJvb2xlYW4+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgcmVzdHJpY3Rpb25zSW5zZXJ0YWJsZSA9IGlzUGF0aEluc2VydGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksIHtcblx0XHRpZ25vcmVUYXJnZXRDb2xsZWN0aW9uOiB0cnVlLFxuXHRcdGF1dGhvcml6ZVVucmVzb2x2YWJsZTogdHJ1ZSxcblx0XHRwYXRoVmlzaXRvcjogKHBhdGg6IHN0cmluZywgbmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSkgPT4ge1xuXHRcdFx0aWYgKHBhdGguaW5kZXhPZihcIi9cIikgPT09IDApIHtcblx0XHRcdFx0cGF0aCA9IHNpbmdsZXRvblBhdGhWaXNpdG9yKHBhdGgsIGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVkVHlwZXMoKSwgbmF2aWdhdGlvblBhdGhzKTtcblx0XHRcdFx0cmV0dXJuIHBhdGg7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzO1xuXHRcdFx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdGNvbnN0IHBhcnRuZXIgPSBuYXZpZ2F0aW9uUHJvcGVydGllc1tuYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggLSAxXS5wYXJ0bmVyO1xuXHRcdFx0XHRpZiAocGFydG5lcikge1xuXHRcdFx0XHRcdHBhdGggPSBgJHtwYXJ0bmVyfS8ke3BhdGh9YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHBhdGg7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgaXNJbnNlcnRhYmxlID1cblx0XHRyZXN0cmljdGlvbnNJbnNlcnRhYmxlLl90eXBlID09PSBcIlVucmVzb2x2YWJsZVwiXG5cdFx0XHQ/IGlzUGF0aEluc2VydGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksIHtcblx0XHRcdFx0XHRwYXRoVmlzaXRvcjogKHBhdGg6IHN0cmluZykgPT4gc2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLCBbXSlcblx0XHRcdCAgfSlcblx0XHRcdDogcmVzdHJpY3Rpb25zSW5zZXJ0YWJsZTtcblxuXHRyZXR1cm4gYW5kKFxuXHRcdGNyZWF0aW9uUm93VmlzaWJpbGl0eSxcblx0XHRpc0luc2VydGFibGUsXG5cdFx0b3IoXG5cdFx0XHQhc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5kaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhLFxuXHRcdFx0Zm9ybWF0UmVzdWx0KFtiaW5kaW5nRXhwcmVzc2lvbihcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCBcImludGVybmFsXCIpXSwgdGFibGVGb3JtYXR0ZXJzLnZhbGlkYXRlQ3JlYXRpb25Sb3dGaWVsZHMpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IGVuYWJsZWQgb2YgdGhlIGFjdGlvbiBDcmVhdGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gY3JlYXRlVmlzaWJpbGl0eVxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj4gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRlRW5hYmxlbWVudChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Y3JlYXRlVmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGlzSW5zZXJ0YWJsZSA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzSW5zZXJ0YWJsZS5leHByZXNzaW9uO1xuXHRjb25zdCBDb2xsZWN0aW9uVHlwZSA9IGNvbnZlcnRlckNvbnRleHQucmVzb2x2ZUFic29sdXRlUGF0aDxhbnk+KHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuY29sbGVjdGlvblBhdGgpLnRhcmdldD8uX3R5cGU7XG5cdHJldHVybiBhbmQoXG5cdFx0Y3JlYXRlVmlzaWJpbGl0eSxcblx0XHRvcihcblx0XHRcdENvbGxlY3Rpb25UeXBlID09PSBcIkVudGl0eVNldFwiLFxuXHRcdFx0YW5kKFxuXHRcdFx0XHRpc0luc2VydGFibGUsXG5cdFx0XHRcdG9yKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlLCBlcXVhbChiaW5kaW5nRXhwcmVzc2lvbihcIi9lZGl0TW9kZVwiLCBcInVpXCIpLCBcIkVkaXRhYmxlXCIpKVxuXHRcdFx0KVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBhY3Rpb24gRGVsZXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGRlbGV0ZVZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZUVuYWJsZW1lbnQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGRlbGV0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0RlbGV0YWJsZSA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzRGVsZXRhYmxlLmV4cHJlc3Npb247XG5cdGNvbnN0IGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkgPVxuXHRcdCFpc0NvbnN0YW50KGlzRGVsZXRhYmxlKSAmJiBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0RlbGV0YWJsZS5uYXZpZ2F0aW9uRXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJVbnJlc29sdmFibGVcIjtcblx0Y29uc3QgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID0gYmluZGluZ0V4cHJlc3Npb24oXCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKTtcblx0Y29uc3QgbnVtYmVyT2ZEZWxldGFibGVDb250ZXh0cyA9IGJpbmRpbmdFeHByZXNzaW9uKFwiZGVsZXRhYmxlQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKTtcblx0Y29uc3QgbnVtYmVyT2ZVblNhdmVkQ29udGV4dHMgPSBiaW5kaW5nRXhwcmVzc2lvbihcInVuU2F2ZWRDb250ZXh0c1wiLCBcImludGVybmFsXCIpO1xuXG5cdHJldHVybiBhbmQoXG5cdFx0ZGVsZXRlVmlzaWJpbGl0eSxcblx0XHRpZkVsc2UoXG5cdFx0XHRvcihjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSwgaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSksXG5cdFx0XHRhbmQoXG5cdFx0XHRcdG9yKFxuXHRcdFx0XHRcdGFuZChub3RFcXVhbChudW1iZXJPZkRlbGV0YWJsZUNvbnRleHRzLCB1bmRlZmluZWQpLCBncmVhdGVyVGhhbihsZW5ndGgobnVtYmVyT2ZEZWxldGFibGVDb250ZXh0cyksIDApKSxcblx0XHRcdFx0XHRhbmQobm90RXF1YWwobnVtYmVyT2ZVblNhdmVkQ29udGV4dHMsIHVuZGVmaW5lZCksIGdyZWF0ZXJUaGFuKGxlbmd0aChudW1iZXJPZlVuU2F2ZWRDb250ZXh0cyksIDApKVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRiaW5kaW5nRXhwcmVzc2lvbihcImRlbGV0ZUVuYWJsZWRcIiwgXCJpbnRlcm5hbFwiKVxuXHRcdFx0KSxcblx0XHRcdGFuZChub3RFcXVhbChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMsIDApLCBpc0RlbGV0YWJsZSlcblx0XHQpXG5cdCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgcHJvcGVydHkgZW5hYmxlZCBvZiB0aGUgYWN0aW9uIFBhc3RlLlxuICpcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gcGFzdGVWaXNpYmlsaXR5XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGNyZWF0ZUVuYWJsZW1lbnRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhc3RlRW5hYmxlbWVudChwYXN0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj4sIGNyZWF0ZUVuYWJsZW1lbnQ6IEV4cHJlc3Npb248Ym9vbGVhbj4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGFuZChwYXN0ZVZpc2liaWxpdHksIGNyZWF0ZUVuYWJsZW1lbnQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IGVuYWJsZWQgb2YgdGhlIGFjdGlvbiBNYXNzRWRpdC5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHBhcmFtIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBtYXNzRWRpdFZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hc3NFZGl0RW5hYmxlbWVudChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0bWFzc0VkaXRWaXNpYmlsaXR5OiBFeHByZXNzaW9uPGJvb2xlYW4+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgcGF0aFVwZGF0YWJsZUV4cHJlc3Npb24gPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc1VwZGF0YWJsZS5leHByZXNzaW9uO1xuXHRjb25zdCBpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5OiBhbnkgPVxuXHRcdCFpc0NvbnN0YW50KHBhdGhVcGRhdGFibGVFeHByZXNzaW9uKSAmJlxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLm5hdmlnYXRpb25FeHByZXNzaW9uLl90eXBlID09PSBcIlVucmVzb2x2YWJsZVwiO1xuXHRjb25zdCBudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPSBncmVhdGVyT3JFcXVhbChiaW5kaW5nRXhwcmVzc2lvbihcIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1wiLCBcImludGVybmFsXCIpLCAxKTtcblx0Y29uc3QgbnVtYmVyT2ZVcGRhdGFibGVDb250ZXh0cyA9IGdyZWF0ZXJPckVxdWFsKGxlbmd0aChiaW5kaW5nRXhwcmVzc2lvbihcInVwZGF0YWJsZUNvbnRleHRzXCIsIFwiaW50ZXJuYWxcIikpLCAxKTtcblx0Y29uc3QgYklzRHJhZnRTdXBwb3J0ZWQgPSBpc0RyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBiRGlzcGxheU1vZGUgPSBpc0luRGlzcGxheU1vZGUoY29udmVydGVyQ29udGV4dCk7XG5cblx0Ly8gbnVtYmVyT2ZVcGRhdGFibGVDb250ZXh0cyBuZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgYmluZGluZyBpbiBjYXNlXG5cdC8vIDEuIFVwZGF0ZSBpcyBkZXBlbmRlbnQgb24gY3VycmVudCBlbnRpdHkgcHJvcGVydHkgKGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkgaXMgdHJ1ZSkuXG5cdC8vIDIuIFRoZSB0YWJsZSBpcyByZWFkIG9ubHkgYW5kIGRyYWZ0IGVuYWJsZWQobGlrZSBMUiksIGluIHRoaXMgY2FzZSBvbmx5IGFjdGl2ZSBjb250ZXh0cyBjYW4gYmUgbWFzcyBlZGl0ZWQuXG5cdC8vICAgIFNvLCB1cGRhdGUgZGVwZW5kcyBvbiAnSXNBY3RpdmVFbnRpdHknIHZhbHVlIHdoaWNoIG5lZWRzIHRvIGJlIGNoZWNrZWQgcnVudGltZS5cblx0Y29uc3QgcnVudGltZUJpbmRpbmcgPSBpZkVsc2UoXG5cdFx0b3IoYW5kKGJEaXNwbGF5TW9kZSwgYklzRHJhZnRTdXBwb3J0ZWQpLCBpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5KSxcblx0XHRhbmQobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLCBudW1iZXJPZlVwZGF0YWJsZUNvbnRleHRzKSxcblx0XHRhbmQobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzKVxuXHQpO1xuXG5cdHJldHVybiBhbmQobWFzc0VkaXRWaXNpYmlsaXR5LCBpZkVsc2UoaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSwgcnVudGltZUJpbmRpbmcsIGFuZChydW50aW1lQmluZGluZywgcGF0aFVwZGF0YWJsZUV4cHJlc3Npb24pKSk7XG59XG5cbi8qKlxuICogVGVsbHMgaWYgdGhlIHRhYmxlIGluIHRlbXBsYXRlIGlzIGluIGRpc3BsYXkgbW9kZS5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7Vmlld1BhdGhDb25maWd1cmF0aW9ufSB2aWV3Q29uZmlndXJhdGlvblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0luRGlzcGxheU1vZGUoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgdmlld0NvbmZpZ3VyYXRpb24/OiBWaWV3UGF0aENvbmZpZ3VyYXRpb24pOiBib29sZWFuIHtcblx0Y29uc3QgdGVtcGxhdGVUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKTtcblx0aWYgKFxuXHRcdHRlbXBsYXRlVHlwZSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgfHxcblx0XHR0ZW1wbGF0ZVR5cGUgPT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2UgfHxcblx0XHQodmlld0NvbmZpZ3VyYXRpb24gJiYgY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5oYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zKHZpZXdDb25maWd1cmF0aW9uKSlcblx0KSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0Ly8gdXBkYXRhYmxlIHdpbGwgYmUgaGFuZGxlZCBhdCB0aGUgcHJvcGVydHkgbGV2ZWxcblx0cmV0dXJuIGZhbHNlO1xufVxuIl19