@sap/open.fe 1.99.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 (969) hide show
  1. package/package.json +1 -1
  2. package/packages/sap.fe.common/src/sap/fe/common/.library +1 -1
  3. package/packages/sap.fe.common/src/sap/fe/common/.theming +1 -1
  4. package/packages/sap.fe.common/src/sap/fe/common/MessageButton-dbg.js +1748 -1813
  5. package/packages/sap.fe.common/src/sap/fe/common/MessageButton.js +2 -3
  6. package/packages/sap.fe.common/src/sap/fe/common/MessageButton.ts +1801 -0
  7. package/packages/sap.fe.common/src/sap/fe/common/MessageFilter-dbg.js +77 -32
  8. package/packages/sap.fe.common/src/sap/fe/common/MessageFilter.js +2 -3
  9. package/packages/sap.fe.common/src/sap/fe/common/MessageFilter.ts +26 -0
  10. package/packages/sap.fe.common/src/sap/fe/common/MessagePopover-dbg.js +43 -53
  11. package/packages/sap.fe.common/src/sap/fe/common/MessagePopover.js +2 -3
  12. package/packages/sap.fe.common/src/sap/fe/common/MessagePopover.ts +39 -0
  13. package/packages/sap.fe.common/src/sap/fe/common/library-dbg.js +31 -38
  14. package/packages/sap.fe.common/src/sap/fe/common/library-h2-preload.js +8 -9
  15. package/packages/sap.fe.common/src/sap/fe/common/library-h2-preload.js.map +3 -3
  16. package/packages/sap.fe.common/src/sap/fe/common/library-preload.js +23 -71
  17. package/packages/sap.fe.common/src/sap/fe/common/library-preload.js.map +4 -4
  18. package/packages/sap.fe.common/src/sap/fe/common/library.js +4 -5
  19. package/packages/sap.fe.common/src/sap/fe/common/library.ts +35 -0
  20. package/packages/sap.fe.common/src/sap/fe/common/manifest.json +3 -3
  21. package/packages/sap.fe.common/src/sap/fe/common/resources.json +54 -32
  22. package/packages/sap.fe.common/test/sap/fe/common/designtime/api.json +1 -1
  23. package/packages/sap.fe.common/test/sap/fe/common/designtime/apiref/api.json +1 -1
  24. package/packages/sap.fe.common/test/sap/fe/common/designtime/codeassistance/Library.jsmeta.json +1 -1
  25. package/packages/sap.fe.common/test/sap/fe/common/designtime/codeassistance/Library.xmlmeta.json +1 -1
  26. package/packages/sap.fe.core/src/sap/fe/core/.library +1 -1
  27. package/packages/sap.fe.core/src/sap/fe/core/.theming +1 -1
  28. package/packages/sap.fe.core/src/sap/fe/core/AnnotationHelper-dbg.js +1 -69
  29. package/packages/sap.fe.core/src/sap/fe/core/AnnotationHelper.js +1 -1
  30. package/packages/sap.fe.core/src/sap/fe/core/AnnotationHelper.ts +0 -70
  31. package/packages/sap.fe.core/src/sap/fe/core/AppComponent-dbg.js +388 -399
  32. package/packages/sap.fe.core/src/sap/fe/core/AppComponent.js +2 -3
  33. package/packages/sap.fe.core/src/sap/fe/core/AppComponent.ts +403 -0
  34. package/packages/sap.fe.core/src/sap/fe/core/AppStateHandler-dbg.js +127 -158
  35. package/packages/sap.fe.core/src/sap/fe/core/AppStateHandler.js +1 -1
  36. package/packages/sap.fe.core/src/sap/fe/core/BaseController-dbg.js +82 -58
  37. package/packages/sap.fe.core/src/sap/fe/core/BaseController.js +2 -3
  38. package/packages/sap.fe.core/src/sap/fe/core/BaseController.ts +68 -0
  39. package/packages/sap.fe.core/src/sap/fe/core/CommonUtils-dbg.js +111 -20
  40. package/packages/sap.fe.core/src/sap/fe/core/CommonUtils.js +1 -1
  41. package/packages/sap.fe.core/src/sap/fe/core/CommonUtils.ts +131 -32
  42. package/packages/sap.fe.core/src/sap/fe/core/ExtensionAPI-dbg.js +278 -274
  43. package/packages/sap.fe.core/src/sap/fe/core/ExtensionAPI.js +2 -3
  44. package/packages/sap.fe.core/src/sap/fe/core/ExtensionAPI.ts +250 -0
  45. package/packages/sap.fe.core/src/sap/fe/core/PageController-dbg.js +157 -29
  46. package/packages/sap.fe.core/src/sap/fe/core/PageController.js +1 -1
  47. package/packages/sap.fe.core/src/sap/fe/core/PageController.ts +60 -32
  48. package/packages/sap.fe.core/src/sap/fe/core/RouterProxy-dbg.js +694 -756
  49. package/packages/sap.fe.core/src/sap/fe/core/RouterProxy.js +1 -1
  50. package/packages/sap.fe.core/src/sap/fe/core/RouterProxy.ts +11 -9
  51. package/packages/sap.fe.core/src/sap/fe/core/Synchronization-dbg.js +21 -31
  52. package/packages/sap.fe.core/src/sap/fe/core/Synchronization.js +1 -1
  53. package/packages/sap.fe.core/src/sap/fe/core/TemplateComponent-dbg.js +1 -1
  54. package/packages/sap.fe.core/src/sap/fe/core/TemplateComponent.ts +10 -3
  55. package/packages/sap.fe.core/src/sap/fe/core/TemplateModel-dbg.js +20 -38
  56. package/packages/sap.fe.core/src/sap/fe/core/TemplateModel.js +1 -1
  57. package/packages/sap.fe.core/src/sap/fe/core/TemplateModel.ts +1 -1
  58. package/packages/sap.fe.core/src/sap/fe/core/TransactionHelper-dbg.js +1354 -1370
  59. package/packages/sap.fe.core/src/sap/fe/core/TransactionHelper.js +1 -1
  60. package/packages/sap.fe.core/src/sap/fe/core/TransactionHelper.ts +33 -22
  61. package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/ActivitySync-dbg.js +392 -0
  62. package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/ActivitySync.js +5 -0
  63. package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  64. package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/CollaborationCommon-dbg.js +136 -0
  65. package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +5 -0
  66. package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  67. package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/Manage-dbg.js +262 -0
  68. package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/Manage.js +5 -0
  69. package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  70. package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  71. package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  72. package/packages/sap.fe.core/src/sap/fe/core/actions/draft-dbg.js +30 -68
  73. package/packages/sap.fe.core/src/sap/fe/core/actions/draft.js +1 -1
  74. package/packages/sap.fe.core/src/sap/fe/core/actions/draft.ts +44 -71
  75. package/packages/sap.fe.core/src/sap/fe/core/actions/messageHandling-dbg.js +55 -36
  76. package/packages/sap.fe.core/src/sap/fe/core/actions/messageHandling.js +1 -1
  77. package/packages/sap.fe.core/src/sap/fe/core/actions/messageHandling.ts +66 -46
  78. package/packages/sap.fe.core/src/sap/fe/core/actions/operations-dbg.js +34 -15
  79. package/packages/sap.fe.core/src/sap/fe/core/actions/operations.js +1 -1
  80. package/packages/sap.fe.core/src/sap/fe/core/actions/operations.ts +48 -18
  81. package/packages/sap.fe.core/src/sap/fe/core/actions/sticky-dbg.js +17 -4
  82. package/packages/sap.fe.core/src/sap/fe/core/actions/sticky.js +1 -1
  83. package/packages/sap.fe.core/src/sap/fe/core/actions/sticky.ts +21 -4
  84. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata-dbg.js +69 -66
  85. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +2 -3
  86. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  87. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +1593 -1669
  88. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/EditFlow.js +2 -3
  89. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  90. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/IntentBasedNavigation-dbg.js +79 -54
  91. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +2 -3
  92. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  93. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalEditFlow-dbg.js +718 -779
  94. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalEditFlow.js +2 -3
  95. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  96. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +796 -816
  97. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +2 -3
  98. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  99. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +1004 -1005
  100. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalRouting.js +2 -3
  101. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  102. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/KPIManagement-dbg.js +487 -521
  103. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/KPIManagement.js +1 -1
  104. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -2
  105. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +141 -169
  106. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MassEdit.js +2 -3
  107. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  108. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MessageHandler-dbg.js +233 -244
  109. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -3
  110. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  111. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/PageReady-dbg.js +301 -336
  112. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/PageReady.js +1 -1
  113. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/PageReady.ts +12 -10
  114. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Paginator-dbg.js +188 -175
  115. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Paginator.js +2 -3
  116. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  117. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Placeholder-dbg.js +157 -149
  118. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Placeholder.js +2 -3
  119. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  120. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Routing-dbg.js +144 -125
  121. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Routing.js +2 -3
  122. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  123. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/RoutingListener-dbg.js +7 -6
  124. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/RoutingListener.js +2 -3
  125. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  126. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Share-dbg.js +230 -268
  127. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Share.js +2 -3
  128. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  129. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +592 -633
  130. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  131. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/SideEffects.ts +8 -7
  132. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/ViewState-dbg.js +788 -806
  133. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/ViewState.js +2 -3
  134. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  135. package/packages/sap.fe.core/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
  136. package/packages/sap.fe.core/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  137. package/packages/sap.fe.core/src/sap/fe/core/controls/CommandExecution-dbg.js +67 -66
  138. package/packages/sap.fe.core/src/sap/fe/core/controls/CommandExecution.js +2 -3
  139. package/packages/sap.fe.core/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  140. package/packages/sap.fe.core/src/sap/fe/core/controls/ConditionalWrapper-dbg.js +90 -75
  141. package/packages/sap.fe.core/src/sap/fe/core/controls/ConditionalWrapper.js +2 -3
  142. package/packages/sap.fe.core/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  143. package/packages/sap.fe.core/src/sap/fe/core/controls/CustomQuickViewPage-dbg.js +130 -125
  144. package/packages/sap.fe.core/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -3
  145. package/packages/sap.fe.core/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  146. package/packages/sap.fe.core/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +103 -112
  147. package/packages/sap.fe.core/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +2 -3
  148. package/packages/sap.fe.core/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  149. package/packages/sap.fe.core/src/sap/fe/core/controls/FieldWrapper-dbg.js +122 -135
  150. package/packages/sap.fe.core/src/sap/fe/core/controls/FieldWrapper.js +2 -3
  151. package/packages/sap.fe.core/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  152. package/packages/sap.fe.core/src/sap/fe/core/controls/FilterBar-dbg.js +162 -159
  153. package/packages/sap.fe.core/src/sap/fe/core/controls/FilterBar.js +2 -3
  154. package/packages/sap.fe.core/src/sap/fe/core/controls/FilterBar.ts +143 -0
  155. package/packages/sap.fe.core/src/sap/fe/core/controls/FormElementWrapper-dbg.js +45 -39
  156. package/packages/sap.fe.core/src/sap/fe/core/controls/FormElementWrapper.js +2 -3
  157. package/packages/sap.fe.core/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  158. package/packages/sap.fe.core/src/sap/fe/core/controls/MultiValueParameterDelegate-dbg.js +37 -42
  159. package/packages/sap.fe.core/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -2
  160. package/packages/sap.fe.core/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  161. package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/FilterContainer-dbg.js +126 -116
  162. package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/FilterContainer.js +2 -3
  163. package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  164. package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +241 -255
  165. package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/VisualFilter.js +2 -3
  166. package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  167. package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/VisualFilterContainer-dbg.js +150 -141
  168. package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +2 -3
  169. package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  170. package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +335 -322
  171. package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +2 -3
  172. package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  173. package/packages/sap.fe.core/src/sap/fe/core/controls/massEdit/MassEditHandlers-dbg.js +74 -74
  174. package/packages/sap.fe.core/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +2 -3
  175. package/packages/sap.fe.core/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  176. package/packages/sap.fe.core/src/sap/fe/core/converters/ConverterContext-dbg.js +348 -379
  177. package/packages/sap.fe.core/src/sap/fe/core/converters/ConverterContext.js +1 -1
  178. package/packages/sap.fe.core/src/sap/fe/core/converters/ConverterContext.ts +19 -16
  179. package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestSettings-dbg.js +12 -1
  180. package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  181. package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestSettings.ts +12 -1
  182. package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestWrapper-dbg.js +354 -378
  183. package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
  184. package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestWrapper.ts +10 -0
  185. package/packages/sap.fe.core/src/sap/fe/core/converters/MetaModelConverter-dbg.js +6 -4
  186. package/packages/sap.fe.core/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  187. package/packages/sap.fe.core/src/sap/fe/core/converters/MetaModelConverter.ts +5 -2
  188. package/packages/sap.fe.core/src/sap/fe/core/converters/TemplateConverter-dbg.js +1 -1
  189. package/packages/sap.fe.core/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
  190. package/packages/sap.fe.core/src/sap/fe/core/converters/annotations/DataField-dbg.js +26 -12
  191. package/packages/sap.fe.core/src/sap/fe/core/converters/annotations/DataField.js +1 -1
  192. package/packages/sap.fe.core/src/sap/fe/core/converters/annotations/DataField.ts +37 -13
  193. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Form-dbg.js +2 -2
  194. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Form.js +1 -1
  195. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Form.ts +4 -2
  196. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/KPI-dbg.js +1 -1
  197. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/KPI.ts +3 -2
  198. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Table-dbg.js +130 -23
  199. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Table.js +1 -1
  200. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Table.ts +134 -29
  201. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +118 -53
  202. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
  203. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +156 -93
  204. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +161 -207
  205. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +1 -1
  206. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +148 -206
  207. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +115 -133
  208. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
  209. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/BindingHelper-dbg.js +20 -6
  210. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/BindingHelper.js +1 -1
  211. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  212. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/ConfigurableObject-dbg.js +12 -1
  213. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  214. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/Key-dbg.js +42 -57
  215. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/Key.js +1 -1
  216. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  217. package/packages/sap.fe.core/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +25 -4
  218. package/packages/sap.fe.core/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
  219. package/packages/sap.fe.core/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +20 -3
  220. package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +10 -4
  221. package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ListReportConverter.js +1 -1
  222. package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ListReportConverter.ts +15 -4
  223. package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +7 -5
  224. package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
  225. package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  226. package/packages/sap.fe.core/src/sap/fe/core/designtime/AppComponent-dbg.designtime.js +92 -98
  227. package/packages/sap.fe.core/src/sap/fe/core/designtime/AppComponent.designtime.js +2 -3
  228. package/packages/sap.fe.core/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  229. package/packages/sap.fe.core/src/sap/fe/core/designtime/library-preload.designtime.js +2 -3
  230. package/packages/sap.fe.core/src/sap/fe/core/designtime/library-preload.designtime.js.map +3 -3
  231. package/packages/sap.fe.core/src/sap/fe/core/formatters/CollaborationFormatter-dbg.js +104 -0
  232. package/packages/sap.fe.core/src/sap/fe/core/formatters/CollaborationFormatter.js +5 -0
  233. package/packages/sap.fe.core/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  234. package/packages/sap.fe.core/src/sap/fe/core/formatters/TableFormatter-dbg.js +53 -2
  235. package/packages/sap.fe.core/src/sap/fe/core/formatters/TableFormatter.js +1 -1
  236. package/packages/sap.fe.core/src/sap/fe/core/formatters/TableFormatter.ts +51 -0
  237. package/packages/sap.fe.core/src/sap/fe/core/fpm/Component-dbg.js +50 -54
  238. package/packages/sap.fe.core/src/sap/fe/core/fpm/Component.js +2 -3
  239. package/packages/sap.fe.core/src/sap/fe/core/fpm/Component.ts +48 -0
  240. package/packages/sap.fe.core/src/sap/fe/core/fpm/manifest.json +2 -2
  241. package/packages/sap.fe.core/src/sap/fe/core/fpm/resources.json +7 -3
  242. package/packages/sap.fe.core/src/sap/fe/core/helpers/AppStartupHelper-dbg.js +323 -309
  243. package/packages/sap.fe.core/src/sap/fe/core/helpers/AppStartupHelper.js +1 -1
  244. package/packages/sap.fe.core/src/sap/fe/core/helpers/AppStartupHelper.ts +363 -337
  245. package/packages/sap.fe.core/src/sap/fe/core/helpers/BindingExpression-dbg.js +7 -7
  246. package/packages/sap.fe.core/src/sap/fe/core/helpers/BindingExpression.js +1 -1
  247. package/packages/sap.fe.core/src/sap/fe/core/helpers/BindingExpression.ts +7 -7
  248. package/packages/sap.fe.core/src/sap/fe/core/helpers/ClassSupport-dbg.js +186 -62
  249. package/packages/sap.fe.core/src/sap/fe/core/helpers/ClassSupport.js +1 -1
  250. package/packages/sap.fe.core/src/sap/fe/core/helpers/ClassSupport.ts +168 -52
  251. package/packages/sap.fe.core/src/sap/fe/core/helpers/DynamicAnnotationPathHelper-dbg.js +5 -4
  252. package/packages/sap.fe.core/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
  253. package/packages/sap.fe.core/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -5
  254. package/packages/sap.fe.core/src/sap/fe/core/helpers/FPMHelper-dbg.js +1 -1
  255. package/packages/sap.fe.core/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
  256. package/packages/sap.fe.core/src/sap/fe/core/helpers/MassEditHelper-dbg.js +601 -684
  257. package/packages/sap.fe.core/src/sap/fe/core/helpers/MassEditHelper.js +2 -3
  258. package/packages/sap.fe.core/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  259. package/packages/sap.fe.core/src/sap/fe/core/helpers/ModelHelper-dbg.js +25 -1
  260. package/packages/sap.fe.core/src/sap/fe/core/helpers/ModelHelper.js +1 -1
  261. package/packages/sap.fe.core/src/sap/fe/core/helpers/ModelHelper.ts +23 -0
  262. package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +5 -1
  263. package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  264. package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticDateOperators.ts +4 -0
  265. package/packages/sap.fe.core/src/sap/fe/core/library-dbg.js +426 -451
  266. package/packages/sap.fe.core/src/sap/fe/core/library-h2-preload.js +36 -32
  267. package/packages/sap.fe.core/src/sap/fe/core/library-h2-preload.js.map +3 -3
  268. package/packages/sap.fe.core/src/sap/fe/core/library-preload.js +644 -738
  269. package/packages/sap.fe.core/src/sap/fe/core/library-preload.js.map +4 -4
  270. package/packages/sap.fe.core/src/sap/fe/core/library-preload.support.js +24 -35
  271. package/packages/sap.fe.core/src/sap/fe/core/library-preload.support.js.map +2 -2
  272. package/packages/sap.fe.core/src/sap/fe/core/library.js +2 -3
  273. package/packages/sap.fe.core/src/sap/fe/core/library.support.js +22 -33
  274. package/packages/sap.fe.core/src/sap/fe/core/library.support.ts +23 -0
  275. package/packages/sap.fe.core/src/sap/fe/core/library.ts +420 -0
  276. package/packages/sap.fe.core/src/sap/fe/core/manifest.json +10 -10
  277. package/packages/sap.fe.core/src/sap/fe/core/manifestMerger/ChangePageConfiguration-dbg.js +5 -3
  278. package/packages/sap.fe.core/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  279. package/packages/sap.fe.core/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +4 -1
  280. package/packages/sap.fe.core/src/sap/fe/core/messagebundle.properties +22 -5
  281. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ar.properties +27 -7
  282. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_bg.properties +27 -7
  283. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ca.properties +27 -7
  284. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_cs.properties +27 -7
  285. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_cy.properties +27 -7
  286. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_da.properties +27 -7
  287. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_de.properties +27 -7
  288. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_el.properties +27 -7
  289. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en.properties +27 -7
  290. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en_GB.properties +27 -7
  291. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en_US_sappsd.properties +27 -7
  292. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en_US_saprigi.properties +27 -7
  293. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en_US_saptrc.properties +27 -7
  294. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_es.properties +27 -7
  295. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_es_MX.properties +27 -7
  296. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_et.properties +27 -7
  297. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_fi.properties +28 -8
  298. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_fr.properties +28 -8
  299. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_fr_CA.properties +29 -9
  300. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_hi.properties +27 -7
  301. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_hr.properties +27 -7
  302. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_hu.properties +27 -7
  303. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_id.properties +27 -7
  304. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_it.properties +27 -7
  305. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_iw.properties +27 -7
  306. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ja.properties +26 -6
  307. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_kk.properties +27 -7
  308. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ko.properties +27 -7
  309. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_lt.properties +27 -7
  310. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_lv.properties +28 -8
  311. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ms.properties +27 -7
  312. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_nl.properties +27 -7
  313. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_no.properties +27 -7
  314. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_pl.properties +27 -7
  315. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_pt.properties +28 -8
  316. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_pt_PT.properties +27 -7
  317. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ro.properties +27 -7
  318. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ru.properties +27 -7
  319. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_sh.properties +27 -7
  320. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_sk.properties +27 -7
  321. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_sl.properties +27 -7
  322. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_sv.properties +27 -7
  323. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_th.properties +26 -6
  324. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_tr.properties +30 -10
  325. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_uk.properties +27 -7
  326. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_vi.properties +27 -7
  327. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_zh_CN.properties +27 -7
  328. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_zh_TW.properties +27 -7
  329. package/packages/sap.fe.core/src/sap/fe/core/resources.json +745 -384
  330. package/packages/sap.fe.core/src/sap/fe/core/services/AsyncComponentServiceFactory-dbg.js +45 -71
  331. package/packages/sap.fe.core/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
  332. package/packages/sap.fe.core/src/sap/fe/core/services/CacheHandlerServiceFactory-dbg.js +154 -192
  333. package/packages/sap.fe.core/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
  334. package/packages/sap.fe.core/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +4 -4
  335. package/packages/sap.fe.core/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +66 -92
  336. package/packages/sap.fe.core/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  337. package/packages/sap.fe.core/src/sap/fe/core/services/EnvironmentServiceFactory.ts +1 -1
  338. package/packages/sap.fe.core/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +284 -339
  339. package/packages/sap.fe.core/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
  340. package/packages/sap.fe.core/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -13
  341. package/packages/sap.fe.core/src/sap/fe/core/services/ResourceModelServiceFactory-dbg.js +67 -102
  342. package/packages/sap.fe.core/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  343. package/packages/sap.fe.core/src/sap/fe/core/services/ResourceModelServiceFactory.ts +5 -2
  344. package/packages/sap.fe.core/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +754 -814
  345. package/packages/sap.fe.core/src/sap/fe/core/services/RoutingServiceFactory.js +1 -1
  346. package/packages/sap.fe.core/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -13
  347. package/packages/sap.fe.core/src/sap/fe/core/services/ShellServicesFactory-dbg.js +649 -736
  348. package/packages/sap.fe.core/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
  349. package/packages/sap.fe.core/src/sap/fe/core/services/ShellServicesFactory.ts +7 -4
  350. package/packages/sap.fe.core/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +567 -592
  351. package/packages/sap.fe.core/src/sap/fe/core/services/SideEffectsServiceFactory.js +1 -1
  352. package/packages/sap.fe.core/src/sap/fe/core/services/SideEffectsServiceFactory.ts +22 -3
  353. package/packages/sap.fe.core/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +354 -386
  354. package/packages/sap.fe.core/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
  355. package/packages/sap.fe.core/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +21 -14
  356. package/packages/sap.fe.core/src/sap/fe/core/services/view/TemplatingErrorPage-dbg.controller.js +1 -1
  357. package/packages/sap.fe.core/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
  358. package/packages/sap.fe.core/src/sap/fe/core/support/CommonHelper-dbg.js +1 -1
  359. package/packages/sap.fe.core/src/sap/fe/core/support/CommonHelper.ts +1 -1
  360. package/packages/sap.fe.core/src/sap/fe/core/support/Diagnostics-dbg.js +36 -48
  361. package/packages/sap.fe.core/src/sap/fe/core/support/Diagnostics.js +1 -1
  362. package/packages/sap.fe.core/src/sap/fe/core/templating/DataModelPathHelper-dbg.js +93 -85
  363. package/packages/sap.fe.core/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
  364. package/packages/sap.fe.core/src/sap/fe/core/templating/DataModelPathHelper.ts +104 -95
  365. package/packages/sap.fe.core/src/sap/fe/core/templating/FilterHelper-dbg.js +25 -32
  366. package/packages/sap.fe.core/src/sap/fe/core/templating/FilterHelper.js +1 -1
  367. package/packages/sap.fe.core/src/sap/fe/core/templating/FilterHelper.ts +36 -35
  368. package/packages/sap.fe.core/src/sap/fe/core/templating/PropertyHelper-dbg.js +2 -2
  369. package/packages/sap.fe.core/src/sap/fe/core/templating/PropertyHelper.js +1 -1
  370. package/packages/sap.fe.core/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  371. package/packages/sap.fe.core/src/sap/fe/core/templating/UIFormatters-dbg.js +32 -26
  372. package/packages/sap.fe.core/src/sap/fe/core/templating/UIFormatters.js +1 -1
  373. package/packages/sap.fe.core/src/sap/fe/core/templating/UIFormatters.ts +37 -24
  374. package/packages/sap.fe.core/test/sap/fe/core/designtime/api.json +1664 -1
  375. package/packages/sap.fe.core/test/sap/fe/core/designtime/apiref/api.json +1 -1
  376. package/packages/sap.fe.core/test/sap/fe/core/designtime/codeassistance/Library.jsmeta.json +1 -1
  377. package/packages/sap.fe.core/test/sap/fe/core/designtime/codeassistance/Library.jstemplates.json +1 -1
  378. package/packages/sap.fe.core/test/sap/fe/core/designtime/codeassistance/Library.xmlmeta.json +1 -1
  379. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/model/MacroNavigationModel.js +59 -0
  380. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldDisplay/localService/RootEntity.json +1 -1
  381. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldMessages/Component.js +33 -0
  382. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldMessages/FieldMessages.controller.js +34 -0
  383. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldMessages/FieldMessages.view.xml +18 -0
  384. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldMessages/localService/Entities.json +6 -0
  385. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldMessages/localService/service.cds +6 -0
  386. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldMessages/manifest.json +68 -0
  387. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/fieldMessages.html +37 -0
  388. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/filterBar/filterBarSVandAnnotationDefaults/FilterBarSVandAnnotationDefaults.controller.js +1 -0
  389. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableCustoms/Page.controller.js +7 -2
  390. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableCustoms/Page.view.xml +9 -3
  391. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableCustoms/localService/RootEntity.js +23 -0
  392. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableCustoms/localService/RootEntity.ts +11 -0
  393. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableCustoms/localService/service.cds +11 -23
  394. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableMessages/Component.js +40 -0
  395. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableMessages/TableMessages.controller.js +35 -0
  396. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableMessages/TableMessages.view.xml +21 -0
  397. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableMessages/localService/RootEntity.json +82 -0
  398. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableMessages/localService/service.cds +82 -0
  399. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableMessages/manifest.json +78 -0
  400. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/tableMessages.html +37 -0
  401. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/controllerExtensions/basicExtensibility/localService/ChildEntity.json +5 -4
  402. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/customElements/customColumn/customColumnContent/manifest.json +3 -0
  403. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/view/App.view.xml +1 -1
  404. package/packages/sap.fe.core/test/sap/fe/core/jest/AnnotationHelper.spec.js +1 -169
  405. package/packages/sap.fe.core/test/sap/fe/core/jest/AnnotationHelper.spec.ts +0 -212
  406. package/packages/sap.fe.core/test/sap/fe/core/jest/CommonUtils.spec.js +2305 -119
  407. package/packages/sap.fe.core/test/sap/fe/core/jest/CommonUtils.spec.ts +2206 -67
  408. package/packages/sap.fe.core/test/sap/fe/core/jest/FilterUtils.spec.js +40 -0
  409. package/packages/sap.fe.core/test/sap/fe/core/jest/FilterUtils.spec.ts +34 -0
  410. package/packages/sap.fe.core/test/sap/fe/core/jest/FlexibleColumnLayout.spec.js +114 -0
  411. package/packages/sap.fe.core/test/sap/fe/core/jest/FlexibleColumnLayout.spec.ts +114 -0
  412. package/packages/sap.fe.core/test/sap/fe/core/jest/Paginators.spec.js +113 -0
  413. package/packages/sap.fe.core/test/sap/fe/core/jest/Paginators.spec.ts +78 -0
  414. package/packages/sap.fe.core/test/sap/fe/core/jest/RouterProxy.spec.js +599 -1
  415. package/packages/sap.fe.core/test/sap/fe/core/jest/RouterProxy.spec.ts +614 -0
  416. package/packages/sap.fe.core/test/sap/fe/core/jest/TemplateConverter.spec.js +23 -5
  417. package/packages/sap.fe.core/test/sap/fe/core/jest/TemplateConverter.spec.ts +26 -14
  418. package/packages/sap.fe.core/test/sap/fe/core/jest/TransactionHelper.spec.js +87 -1
  419. package/packages/sap.fe.core/test/sap/fe/core/jest/TransactionHelper.spec.ts +82 -1
  420. package/packages/sap.fe.core/test/sap/fe/core/jest/VisualFilterUtils.spec.js +124 -0
  421. package/packages/sap.fe.core/test/sap/fe/core/jest/VisualFilterUtils.spec.ts +141 -0
  422. package/packages/sap.fe.core/test/sap/fe/core/jest/__snapshots__/TemplateConverter.spec.ts.snap +34768 -67
  423. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/collaboration/ActivitySync.spec.js +170 -0
  424. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/collaboration/ActivitySync.spec.ts +155 -0
  425. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/collaboration/CollaborationCommon.spec.js +101 -0
  426. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/collaboration/CollaborationCommon.spec.ts +94 -0
  427. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/collaboration/Manage.spec.js +82 -0
  428. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/collaboration/Manage.spec.ts +77 -0
  429. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/draft.spec.js +2 -2
  430. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/draft.spec.ts +1 -1
  431. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/messageHandling.spec.js +7 -2
  432. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/messageHandling.spec.ts +7 -0
  433. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/operations.spec.js +104 -2
  434. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/operations.spec.ts +96 -1
  435. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/sticky.spec.js +83 -0
  436. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/sticky.spec.ts +79 -0
  437. package/packages/sap.fe.core/test/sap/fe/core/jest/appcomponent.spec.js +72 -0
  438. package/packages/sap.fe.core/test/sap/fe/core/jest/appcomponent.spec.ts +64 -0
  439. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/EditFlow.spec.js +619 -3
  440. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/EditFlow.spec.ts +668 -5
  441. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalEditFlow.spec.js +297 -1
  442. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalEditFlow.spec.ts +276 -6
  443. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalIntentBasedNavigation.spec.js +149 -0
  444. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalIntentBasedNavigation.spec.ts +142 -0
  445. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalRouting.spec.js +776 -182
  446. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalRouting.spec.ts +181 -3
  447. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/KPIManagement.spec.js +19 -43
  448. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MassEdit.spec.js +2 -18
  449. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MassEdit.spec.ts +8 -6
  450. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MessageHandler.spec.js +5 -27
  451. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MessageHandler.spec.ts +1 -1
  452. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/Routing.spec.js +1 -1
  453. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/Routing.spec.ts +1 -1
  454. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/Share.spec.js +86 -0
  455. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/Share.spec.ts +80 -0
  456. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/SideEffects.spec.js +1 -1
  457. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/SideEffects.spec.ts +1 -1
  458. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/ViewState.spec.js +2 -18
  459. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/ViewState.spec.ts +1 -1
  460. package/packages/sap.fe.core/test/sap/fe/core/jest/controls/DataLossOrDraftDiscardHandler.spec.js +45 -0
  461. package/packages/sap.fe.core/test/sap/fe/core/jest/controls/DataLossOrDraftDiscardHandler.spec.ts +29 -0
  462. package/packages/sap.fe.core/test/sap/fe/core/jest/controls/FilterBar.spec.js +51 -1
  463. package/packages/sap.fe.core/test/sap/fe/core/jest/controls/FilterBar.spec.ts +47 -1
  464. package/packages/sap.fe.core/test/sap/fe/core/jest/controls/__snapshots__/FilterBar.spec.ts.snap +3 -0
  465. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ConverterContext.spec.js +2 -2
  466. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ConverterContext.spec.ts +1 -1
  467. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/Filter.spec.js +25 -36
  468. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/Filter.spec.ts +26 -36
  469. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ListReportConverter.spec.js +3 -3
  470. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ListReportConverter.spec.ts +2 -2
  471. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/MetaModelConverter.spec.js +1 -1
  472. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/MetaModelConverter.spec.ts +6 -5
  473. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/Table.spec.js +133 -9
  474. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/Table.spec.ts +171 -8
  475. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/TableStandardActions.spec.js +174 -210
  476. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/TableStandardActions.spec.ts +294 -230
  477. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/__snapshots__/Filter.spec.ts.snap +3 -1
  478. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/Chart.spec.js +237 -0
  479. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/Chart.spec.ts +246 -0
  480. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/DataVisualization.spec.js +9993 -0
  481. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/DataVisualization.spec.ts +11352 -0
  482. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/Table.spec.js +460 -0
  483. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/Table.spec.ts +543 -0
  484. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/TableAnalytics.spec.js +616 -0
  485. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/TableAnalytics.spec.ts +711 -0
  486. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/manifest.json +887 -0
  487. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/objectPage/HeaderAndFooterAction.spec.js +393 -0
  488. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/objectPage/HeaderAndFooterAction.spec.ts +434 -0
  489. package/packages/sap.fe.core/test/sap/fe/core/jest/data/DataConverter.js +31 -0
  490. package/packages/sap.fe.core/test/sap/fe/core/jest/data/DataConverter.ts +12 -0
  491. package/packages/sap.fe.core/test/sap/fe/core/jest/data/Filter.cds +27 -0
  492. package/packages/sap.fe.core/test/sap/fe/core/jest/data/MassEditHelper.cds +12 -0
  493. package/packages/sap.fe.core/test/sap/fe/core/jest/data/OKRA/manifest.json +150 -0
  494. package/packages/sap.fe.core/test/sap/fe/core/jest/data/OKRA/metadata.xml +365 -0
  495. package/packages/sap.fe.core/test/sap/fe/core/jest/data/OKRA/metadata_groupable_options.xml +96 -0
  496. package/packages/sap.fe.core/test/sap/fe/core/jest/data/OKRA/metadata_textArrangement.xml +102 -0
  497. package/packages/sap.fe.core/test/sap/fe/core/jest/data/OKRA/metadata_withPV.xml +359 -0
  498. package/packages/sap.fe.core/test/sap/fe/core/jest/data/Table.cds +89 -27
  499. package/packages/sap.fe.core/test/sap/fe/core/jest/data/TemplatingTestData.js +421 -0
  500. package/packages/sap.fe.core/test/sap/fe/core/jest/data/TemplatingTestData.ts +413 -0
  501. package/packages/sap.fe.core/test/sap/fe/core/jest/data/aggregatedSD/metadata.xml +3767 -0
  502. package/packages/sap.fe.core/test/sap/fe/core/jest/data/dsr/manifest.json +185 -0
  503. package/packages/sap.fe.core/test/sap/fe/core/jest/data/dsr/metadata.xml +1534 -0
  504. package/packages/sap.fe.core/test/sap/fe/core/jest/data/manifest.json +887 -0
  505. package/packages/sap.fe.core/test/sap/fe/core/jest/data/salesOrderMetadata_qunit.xml +4995 -0
  506. package/packages/sap.fe.core/test/sap/fe/core/jest/formatters/CollaborationFormatters.spec.js +48 -0
  507. package/packages/sap.fe.core/test/sap/fe/core/jest/formatters/CollaborationFormatters.spec.ts +48 -0
  508. package/packages/sap.fe.core/test/sap/fe/core/jest/formatters/TableFormatters.spec.js +131 -51
  509. package/packages/sap.fe.core/test/sap/fe/core/jest/formatters/TableFormatters.spec.ts +81 -31
  510. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/AppStartupHelper.spec.js +13 -7
  511. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/AppStartupHelper.spec.ts +12 -6
  512. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/MassEditHelper.spec.js +17 -3
  513. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/MassEditHelper.spec.ts +24 -7
  514. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/ModelHelper.spec.js +61 -1
  515. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/ModelHelper.spec.ts +59 -0
  516. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/PasteHelper.spec.js +3 -3
  517. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/PasteHelper.spec.ts +1 -2
  518. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/SemanticDateOperators.spec.js +4 -4
  519. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/SemanticDateOperators.spec.ts +6 -3
  520. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/StableIdHelper.spec.js +1 -1
  521. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/StableIdHelper.spec.ts +1 -1
  522. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/__snapshots__/AppStartupHelper.spec.ts.snap +19 -0
  523. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/__snapshots__/MassEditHelper.spec.ts.snap +0 -73
  524. package/packages/sap.fe.core/test/sap/fe/core/jest/manifestmerger/ChangePageConfiguration.spec.js +11 -1
  525. package/packages/sap.fe.core/test/sap/fe/core/jest/manifestmerger/ChangePageConfiguration.spec.ts +15 -0
  526. package/packages/sap.fe.core/test/sap/fe/core/jest/manifestmerger/__snapshots__/ChangePageConfiguration.spec.ts.snap +30 -0
  527. package/packages/sap.fe.core/test/sap/fe/core/jest/services/SideEffectsService.spec.js +49 -5
  528. package/packages/sap.fe.core/test/sap/fe/core/jest/services/SideEffectsService.spec.ts +60 -5
  529. package/packages/sap.fe.core/test/sap/fe/core/jest/templating/DataModelPathHelper.spec.js +384 -0
  530. package/packages/sap.fe.core/test/sap/fe/core/jest/templating/DataModelPathHelper.spec.ts +427 -0
  531. package/packages/sap.fe.core/test/sap/fe/core/jest/templating/PropertyHelper.spec.js +132 -2
  532. package/packages/sap.fe.core/test/sap/fe/core/jest/templating/PropertyHelper.spec.ts +156 -2
  533. package/packages/sap.fe.core/test/sap/fe/core/jest/templating/UIFormatters.spec.js +273 -0
  534. package/packages/sap.fe.core/test/sap/fe/core/jest/templating/UIFormatters.spec.ts +402 -0
  535. package/packages/sap.fe.core/test/sap/fe/core/jest/templating/ValueHelpTemplating.spec.js +45 -0
  536. package/packages/sap.fe.core/test/sap/fe/core/jest/templating/ValueHelpTemplating.spec.ts +40 -0
  537. package/packages/sap.fe.core/test/sap/fe/core/qunit/TemplatingExpressions.qunit.js +2 -1
  538. package/packages/sap.fe.core/test/sap/fe/core/qunit/apps/generalTests.json +0 -102
  539. package/packages/sap.fe.core/test/sap/fe/core/relnotes/changes-1.100.json +326 -0
  540. package/packages/sap.fe.core/test/sap/fe/core/relnotes/changes-1.99.json +0 -22
  541. package/packages/sap.fe.macros/src/sap/fe/macros/.library +1 -1
  542. package/packages/sap.fe.macros/src/sap/fe/macros/.theming +1 -1
  543. package/packages/sap.fe.macros/src/sap/fe/macros/Chart.metadata-dbg.js +2 -2
  544. package/packages/sap.fe.macros/src/sap/fe/macros/Chart.metadata.js +1 -1
  545. package/packages/sap.fe.macros/src/sap/fe/macros/ChartAPI-dbg.js +22 -43
  546. package/packages/sap.fe.macros/src/sap/fe/macros/ChartAPI.js +1 -1
  547. package/packages/sap.fe.macros/src/sap/fe/macros/ChartAPI.ts +3 -3
  548. package/packages/sap.fe.macros/src/sap/fe/macros/ChartDelegate-dbg.js +14 -24
  549. package/packages/sap.fe.macros/src/sap/fe/macros/ChartDelegate.js +1 -1
  550. package/packages/sap.fe.macros/src/sap/fe/macros/CommonHelper-dbg.js +1 -1
  551. package/packages/sap.fe.macros/src/sap/fe/macros/DraftIndicator.fragment.xml +3 -2
  552. package/packages/sap.fe.macros/src/sap/fe/macros/Field.fragment.xml +16 -18
  553. package/packages/sap.fe.macros/src/sap/fe/macros/FieldAPI-dbg.js +162 -100
  554. package/packages/sap.fe.macros/src/sap/fe/macros/FieldAPI.js +1 -1
  555. package/packages/sap.fe.macros/src/sap/fe/macros/FieldAPI.ts +93 -16
  556. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBar.fragment.xml +2 -1
  557. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBar.metadata-dbg.js +16 -8
  558. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBar.metadata.js +1 -1
  559. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarAPI-dbg.js +58 -83
  560. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarAPI.js +1 -1
  561. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarAPI.ts +16 -2
  562. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarDelegate-dbg.js +112 -192
  563. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarDelegate.js +1 -1
  564. package/packages/sap.fe.macros/src/sap/fe/macros/Form.metadata-dbg.js +1 -1
  565. package/packages/sap.fe.macros/src/sap/fe/macros/Form.metadata.js +1 -1
  566. package/packages/sap.fe.macros/src/sap/fe/macros/FormAPI-dbg.js +4 -20
  567. package/packages/sap.fe.macros/src/sap/fe/macros/FormAPI.js +1 -1
  568. package/packages/sap.fe.macros/src/sap/fe/macros/FormContainer.fragment.xml +1 -1
  569. package/packages/sap.fe.macros/src/sap/fe/macros/FormContainerAPI-dbg.js +10 -31
  570. package/packages/sap.fe.macros/src/sap/fe/macros/FormContainerAPI.js +1 -1
  571. package/packages/sap.fe.macros/src/sap/fe/macros/MacroAPI-dbg.js +147 -162
  572. package/packages/sap.fe.macros/src/sap/fe/macros/MacroAPI.js +1 -1
  573. package/packages/sap.fe.macros/src/sap/fe/macros/MacroAPI.ts +32 -8
  574. package/packages/sap.fe.macros/src/sap/fe/macros/MacroMetadata-dbg.js +5 -0
  575. package/packages/sap.fe.macros/src/sap/fe/macros/MacroMetadata.js +1 -1
  576. package/packages/sap.fe.macros/src/sap/fe/macros/PhantomUtil-dbg.js +56 -74
  577. package/packages/sap.fe.macros/src/sap/fe/macros/PhantomUtil.js +1 -1
  578. package/packages/sap.fe.macros/src/sap/fe/macros/Table.fragment.xml +1 -1
  579. package/packages/sap.fe.macros/src/sap/fe/macros/Table.metadata-dbg.js +90 -39
  580. package/packages/sap.fe.macros/src/sap/fe/macros/Table.metadata.js +1 -1
  581. package/packages/sap.fe.macros/src/sap/fe/macros/TableAPI-dbg.js +284 -251
  582. package/packages/sap.fe.macros/src/sap/fe/macros/TableAPI.js +1 -1
  583. package/packages/sap.fe.macros/src/sap/fe/macros/TableAPI.ts +126 -14
  584. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldHelper-dbg.js +38 -101
  585. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldHelper.js +1 -1
  586. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldRuntime-dbg.js +68 -6
  587. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldRuntime.js +1 -1
  588. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldTemplating-dbg.js +72 -12
  589. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldTemplating.js +1 -1
  590. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldTemplating.ts +67 -10
  591. package/packages/sap.fe.macros/src/sap/fe/macros/field/QuickViewLinkDelegate-dbg.js +5 -12
  592. package/packages/sap.fe.macros/src/sap/fe/macros/field/QuickViewLinkDelegate.js +1 -1
  593. package/packages/sap.fe.macros/src/sap/fe/macros/filter/DraftEditState.fragment.xml +1 -1
  594. package/packages/sap.fe.macros/src/sap/fe/macros/filter/FilterFieldHelper-dbg.js +1 -3
  595. package/packages/sap.fe.macros/src/sap/fe/macros/filter/FilterFieldHelper.js +1 -1
  596. package/packages/sap.fe.macros/src/sap/fe/macros/filter/FilterUtils-dbg.js +62 -39
  597. package/packages/sap.fe.macros/src/sap/fe/macros/filter/FilterUtils.js +1 -1
  598. package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/MultiValue-dbg.js +104 -50
  599. package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/MultiValue.js +2 -3
  600. package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/MultiValue.ts +68 -0
  601. package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/Range-dbg.js +83 -35
  602. package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/Range.js +2 -3
  603. package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/Range.ts +66 -0
  604. package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/Value-dbg.js +327 -216
  605. package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/Value.js +2 -3
  606. package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/Value.ts +303 -0
  607. package/packages/sap.fe.macros/src/sap/fe/macros/internal/CollaborationAvatar.fragment.xml +15 -0
  608. package/packages/sap.fe.macros/src/sap/fe/macros/internal/CollectionField.metadata-dbg.js +14 -2
  609. package/packages/sap.fe.macros/src/sap/fe/macros/internal/CollectionField.metadata.js +1 -1
  610. package/packages/sap.fe.macros/src/sap/fe/macros/internal/CollectionField.metadata.ts +18 -2
  611. package/packages/sap.fe.macros/src/sap/fe/macros/internal/DataPoint.fragment.xml +12 -29
  612. package/packages/sap.fe.macros/src/sap/fe/macros/internal/DataPoint.metadata-dbg.js +9 -0
  613. package/packages/sap.fe.macros/src/sap/fe/macros/internal/DataPoint.metadata.js +1 -1
  614. package/packages/sap.fe.macros/src/sap/fe/macros/internal/Field.fragment.xml +1 -0
  615. package/packages/sap.fe.macros/src/sap/fe/macros/internal/Field.metadata-dbg.js +529 -533
  616. package/packages/sap.fe.macros/src/sap/fe/macros/internal/Field.metadata.js +2 -3
  617. package/packages/sap.fe.macros/src/sap/fe/macros/internal/Field.metadata.ts +568 -0
  618. package/packages/sap.fe.macros/src/sap/fe/macros/internal/FilterField.fragment.xml +0 -1
  619. package/packages/sap.fe.macros/src/sap/fe/macros/internal/SituationsIndicator-dbg.js +3 -3
  620. package/packages/sap.fe.macros/src/sap/fe/macros/internal/SituationsIndicator.js +1 -1
  621. package/packages/sap.fe.macros/src/sap/fe/macros/internal/SituationsIndicator.ts +3 -2
  622. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/FieldContent.fragment.xml +3 -1
  623. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/FieldStructure.fragment.xml +13 -3
  624. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/DataPoint.fragment.xml +4 -1
  625. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/ExpandableText.fragment.xml +1 -0
  626. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/LabelSemanticKey.fragment.xml +1 -0
  627. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/Link.fragment.xml +38 -4
  628. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/LinkWithQuickViewForm.fragment.xml +2 -2
  629. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/LinkWrapper.fragment.xml +3 -3
  630. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/MdcFieldWithValueHelp.fragment.xml +1 -2
  631. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/ObjectIdentifier.fragment.xml +55 -11
  632. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/SemanticKeyWithDraftIndicator.fragment.xml +1 -1
  633. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/Text.fragment.xml +3 -3
  634. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/DatePicker.fragment.xml +9 -2
  635. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/DateTimePicker.fragment.xml +9 -2
  636. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/Input.fragment.xml +12 -3
  637. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/InputWithUnit.fragment.xml +26 -5
  638. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/InputWithValueHelp.fragment.xml +10 -2
  639. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/RatingIndicator.fragment.xml +9 -2
  640. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/TimePicker.fragment.xml +9 -2
  641. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/fragments/ObjectIdentifierContent.fragment.xml +4 -0
  642. package/packages/sap.fe.macros/src/sap/fe/macros/internal/helpers/DataPointTemplating-dbg.js +31 -2
  643. package/packages/sap.fe.macros/src/sap/fe/macros/internal/helpers/DataPointTemplating.js +1 -1
  644. package/packages/sap.fe.macros/src/sap/fe/macros/internal/helpers/DataPointTemplating.ts +20 -0
  645. package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Runtime-dbg.js +2 -2
  646. package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Runtime.js +1 -1
  647. package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Runtime.ts +7 -9
  648. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueListHelper-dbg.js +90 -118
  649. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +1 -1
  650. package/packages/sap.fe.macros/src/sap/fe/macros/library-dbg.js +1 -1
  651. package/packages/sap.fe.macros/src/sap/fe/macros/library-h2-preload.js +13 -12
  652. package/packages/sap.fe.macros/src/sap/fe/macros/library-h2-preload.js.map +2 -2
  653. package/packages/sap.fe.macros/src/sap/fe/macros/library-preload.js +185 -214
  654. package/packages/sap.fe.macros/src/sap/fe/macros/library-preload.js.map +4 -4
  655. package/packages/sap.fe.macros/src/sap/fe/macros/library.js +1 -1
  656. package/packages/sap.fe.macros/src/sap/fe/macros/manifest.json +9 -9
  657. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle.properties +4 -1
  658. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ar.properties +3 -1
  659. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_bg.properties +3 -1
  660. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ca.properties +3 -1
  661. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_cs.properties +3 -1
  662. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_cy.properties +3 -1
  663. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_da.properties +3 -1
  664. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_de.properties +4 -2
  665. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_el.properties +3 -1
  666. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en.properties +3 -1
  667. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en_GB.properties +3 -1
  668. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en_US_sappsd.properties +3 -1
  669. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +3 -1
  670. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en_US_saptrc.properties +3 -1
  671. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_es.properties +3 -1
  672. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_es_MX.properties +3 -1
  673. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_et.properties +3 -1
  674. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_fi.properties +3 -1
  675. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_fr.properties +3 -1
  676. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_fr_CA.properties +3 -1
  677. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_hi.properties +3 -1
  678. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_hr.properties +3 -1
  679. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_hu.properties +4 -2
  680. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_id.properties +4 -2
  681. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_it.properties +3 -1
  682. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_iw.properties +3 -1
  683. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ja.properties +3 -1
  684. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_kk.properties +3 -1
  685. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ko.properties +3 -1
  686. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_lt.properties +3 -1
  687. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_lv.properties +3 -1
  688. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ms.properties +3 -1
  689. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_nl.properties +3 -1
  690. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_no.properties +3 -1
  691. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_pl.properties +3 -1
  692. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_pt.properties +3 -1
  693. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_pt_PT.properties +3 -1
  694. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ro.properties +3 -1
  695. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ru.properties +3 -1
  696. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_sh.properties +3 -1
  697. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_sk.properties +3 -1
  698. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_sl.properties +3 -1
  699. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_sv.properties +3 -1
  700. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_th.properties +3 -1
  701. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_tr.properties +3 -1
  702. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_uk.properties +3 -1
  703. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_vi.properties +3 -1
  704. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_zh_CN.properties +3 -1
  705. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_zh_TW.properties +3 -1
  706. package/packages/sap.fe.macros/src/sap/fe/macros/resources.json +273 -199
  707. package/packages/sap.fe.macros/src/sap/fe/macros/table/Actions.fragment.xml +1 -1
  708. package/packages/sap.fe.macros/src/sap/fe/macros/table/Column.fragment.xml +1 -1
  709. package/packages/sap.fe.macros/src/sap/fe/macros/table/ColumnContent.fragment.xml +2 -0
  710. package/packages/sap.fe.macros/src/sap/fe/macros/table/CreationRow.fragment.xml +13 -20
  711. package/packages/sap.fe.macros/src/sap/fe/macros/table/CustomColumn.fragment.xml +1 -0
  712. package/packages/sap.fe.macros/src/sap/fe/macros/table/TableHelper-dbg.js +5 -110
  713. package/packages/sap.fe.macros/src/sap/fe/macros/table/TableHelper.js +1 -1
  714. package/packages/sap.fe.macros/src/sap/fe/macros/table/delegates/TableDelegate-dbg.js +98 -78
  715. package/packages/sap.fe.macros/src/sap/fe/macros/table/delegates/TableDelegate.js +1 -1
  716. package/packages/sap.fe.macros/src/sap/fe/macros/valuehelp/ValueHelpFilterBar.metadata-dbg.js +1 -1
  717. package/packages/sap.fe.macros/src/sap/fe/macros/valuehelp/ValueHelpFilterBar.metadata.js +1 -1
  718. package/packages/sap.fe.macros/test/sap/fe/macros/designtime/api.json +211 -10
  719. package/packages/sap.fe.macros/test/sap/fe/macros/designtime/apiref/api.json +1 -1
  720. package/packages/sap.fe.macros/test/sap/fe/macros/designtime/codeassistance/Library.jsmeta.json +1 -1
  721. package/packages/sap.fe.macros/test/sap/fe/macros/designtime/codeassistance/Library.xmlmeta.json +1 -1
  722. package/packages/sap.fe.macros/test/sap/fe/macros/jest/ChartDelegate.spec.js +1 -45
  723. package/packages/sap.fe.macros/test/sap/fe/macros/jest/ChartDelegate.spec.ts +0 -60
  724. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FieldAPI.spec.js +78 -0
  725. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FieldAPI.spec.ts +71 -0
  726. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FieldMacroDataFieldTypes.spec.js +35 -1
  727. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FieldMacroDataFieldTypes.spec.ts +44 -0
  728. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterBarDelegate.spec.js +0 -76
  729. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterBarMacro.spec.js +27 -1
  730. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterBarMacro.spec.ts +28 -0
  731. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterFieldHelper.spec.js +10 -12
  732. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterFieldHelper.spec.ts +10 -10
  733. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterUtils.spec.js +129 -15
  734. package/packages/sap.fe.macros/test/sap/fe/macros/jest/MacroAPI.spec.js +13 -39
  735. package/packages/sap.fe.macros/test/sap/fe/macros/jest/MacroAPI.spec.ts +2 -2
  736. package/packages/sap.fe.macros/test/sap/fe/macros/jest/RetrieveTextFromValueList.spec.js +119 -0
  737. package/packages/sap.fe.macros/test/sap/fe/macros/jest/RetrieveTextFromValueList.spec.ts +113 -0
  738. package/packages/sap.fe.macros/test/sap/fe/macros/jest/Table.spec.js +166 -2
  739. package/packages/sap.fe.macros/test/sap/fe/macros/jest/Table.spec.ts +190 -3
  740. package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableAPI.spec.js +457 -389
  741. package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableAPI.spec.ts +504 -425
  742. package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableMacro.spec.js +104 -2
  743. package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableMacro.spec.ts +158 -1
  744. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/ChartDelegate.spec.ts.snap +0 -6
  745. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/DatapointMacro.spec.ts.snap +5 -5
  746. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FieldMacroDataFieldTypes.spec.ts.snap +114 -25
  747. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FieldMacroWithSemanticKey.spec.ts.snap +40 -40
  748. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FieldMacroWithValueHelp.spec.ts.snap +4 -8
  749. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FilterBarMacro.spec.ts.snap +19 -19
  750. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FilterField.spec.ts.snap +3 -5
  751. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/QuickViewForm.spec.ts.snap +12 -0
  752. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/SimpleFieldMacro.spec.ts.snap +89 -90
  753. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/Table.spec.ts.snap +1314 -58
  754. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/TableMacro.spec.ts.snap +459 -0
  755. package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/FieldMacroDataFieldTypes.cds +18 -2
  756. package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/QuickViewForm.cds +6 -1
  757. package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/Table.cds +107 -106
  758. package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/TableAPI.cds +197 -0
  759. package/packages/sap.fe.macros/test/sap/fe/macros/jest/field/FieldRuntime.spec.js +33 -4
  760. package/packages/sap.fe.macros/test/sap/fe/macros/jest/field/FieldRuntime.spec.ts +30 -4
  761. package/packages/sap.fe.macros/test/sap/fe/macros/jest/field/FieldTemplating.spec.js +72 -29
  762. package/packages/sap.fe.macros/test/sap/fe/macros/jest/field/FieldTemplating.spec.ts +86 -18
  763. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/__snapshots__/columnWidth.spec.ts.snap +51 -27
  764. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/columnWidth.spec.js +55 -9
  765. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/columnWidth.spec.ts +46 -6
  766. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/data/columnWidth.cds +28 -1
  767. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/delegates/TableDelegate.spec.js +170 -43
  768. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/delegates/TableDelegate.spec.ts +131 -15
  769. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/delegates/__snapshots__/TableDelegate.spec.ts.snap +90 -53
  770. package/packages/sap.fe.macros/test/sap/fe/macros/jest/tsx/TestTSX.spec.tsx +2 -1
  771. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/index.json +0 -5
  772. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/FieldHelper.qunit.js +1 -99
  773. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/FormElementTemplating.qunit.js +1 -1
  774. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/MacroMetadata.qunit.js +4 -4
  775. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/TableHelper.qunit.js +4 -4
  776. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/ValueHelpTemplating.qunit.js +15 -0
  777. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/ValueListHelper.qunit.js +265 -106
  778. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/metadata/simpleMetadata.js +38 -0
  779. package/packages/sap.fe.macros/test/sap/fe/macros/relnotes/changes-1.100.json +372 -0
  780. package/packages/sap.fe.macros/test/sap/fe/macros/relnotes/changes-1.99.json +0 -11
  781. package/packages/sap.fe.navigation/src/sap/fe/navigation/.library +1 -1
  782. package/packages/sap.fe.navigation/src/sap/fe/navigation/.theming +1 -1
  783. package/packages/sap.fe.navigation/src/sap/fe/navigation/library-dbg.js +1 -1
  784. package/packages/sap.fe.navigation/src/sap/fe/navigation/library-h2-preload.js +2 -2
  785. package/packages/sap.fe.navigation/src/sap/fe/navigation/library-h2-preload.js.map +2 -2
  786. package/packages/sap.fe.navigation/src/sap/fe/navigation/library-preload.js +2 -2
  787. package/packages/sap.fe.navigation/src/sap/fe/navigation/library-preload.js.map +2 -2
  788. package/packages/sap.fe.navigation/src/sap/fe/navigation/library.js +1 -1
  789. package/packages/sap.fe.navigation/src/sap/fe/navigation/manifest.json +3 -3
  790. package/packages/sap.fe.navigation/src/sap/fe/navigation/resources.json +8 -8
  791. package/packages/sap.fe.navigation/test/sap/fe/navigation/designtime/api.json +1 -1
  792. package/packages/sap.fe.navigation/test/sap/fe/navigation/designtime/apiref/api.json +1 -1
  793. package/packages/sap.fe.navigation/test/sap/fe/navigation/designtime/codeassistance/Library.xmlmeta.json +1 -1
  794. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/.library +1 -1
  795. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/.theming +1 -1
  796. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library-dbg.js +1 -1
  797. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library-h2-preload.js +2 -2
  798. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library-h2-preload.js.map +2 -2
  799. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library-preload.js +2 -2
  800. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library-preload.js.map +2 -2
  801. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library.js +1 -1
  802. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/manifest.json +3 -3
  803. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/resources.json +27 -27
  804. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/base/css_variables.source.less +316 -15
  805. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/base/resources.json +1 -1
  806. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize/css_variables.less +315 -14
  807. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize/css_variables.source.less +315 -14
  808. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize/resources.json +2 -2
  809. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_hcb/css_variables.less +316 -15
  810. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_hcb/css_variables.source.less +316 -15
  811. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_hcb/resources.json +2 -2
  812. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_hcw/css_variables.less +316 -15
  813. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_hcw/css_variables.source.less +316 -15
  814. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_hcw/resources.json +2 -2
  815. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_plus/css_variables.less +315 -14
  816. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_plus/css_variables.source.less +315 -14
  817. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_plus/resources.json +2 -2
  818. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3/css_variables.less +317 -16
  819. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3/css_variables.source.less +317 -16
  820. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3/resources.json +2 -2
  821. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_dark/css_variables.less +317 -16
  822. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_dark/css_variables.source.less +317 -16
  823. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_dark/resources.json +2 -2
  824. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_hcb/css_variables.less +316 -15
  825. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_hcb/css_variables.source.less +316 -15
  826. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_hcb/resources.json +2 -2
  827. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_hcw/css_variables.less +316 -15
  828. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_hcw/css_variables.source.less +316 -15
  829. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_hcw/resources.json +2 -2
  830. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_horizon/css_variables.less +400 -99
  831. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_horizon/css_variables.source.less +400 -99
  832. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_horizon/resources.json +2 -2
  833. package/packages/sap.fe.placeholder/test/sap/fe/placeholder/designtime/api.json +1 -1
  834. package/packages/sap.fe.placeholder/test/sap/fe/placeholder/designtime/apiref/api.json +1 -1
  835. package/packages/sap.fe.templates/src/sap/fe/templates/.library +1 -1
  836. package/packages/sap.fe.templates/src/sap/fe/templates/.theming +1 -1
  837. package/packages/sap.fe.templates/src/sap/fe/templates/AnalyticalListPage/manifest.json +2 -2
  838. package/packages/sap.fe.templates/src/sap/fe/templates/AnalyticalListPage/resources.json +1 -1
  839. package/packages/sap.fe.templates/src/sap/fe/templates/ListComponent-dbg.js +1 -1
  840. package/packages/sap.fe.templates/src/sap/fe/templates/ListComponent.js +1 -1
  841. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/Component-dbg.js +7 -1
  842. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/Component.js +1 -1
  843. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/ListReport.view.xml +22 -21
  844. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/ListReportController-dbg.controller.js +13 -18
  845. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/ListReportController.controller.js +1 -1
  846. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/manifest.json +2 -2
  847. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/resources.json +7 -7
  848. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.xml +3 -3
  849. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/AnnotationHelper-dbg.js +50 -9
  850. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +1 -1
  851. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/Component-dbg.js +1 -12
  852. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/Component.js +1 -1
  853. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +5 -1
  854. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/ObjectPageController-dbg.controller.js +50 -17
  855. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +1 -1
  856. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/controls/StashableHBox-dbg.js +7 -1
  857. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +1 -1
  858. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/designtime/FlexBox-dbg.designtime.js +3 -0
  859. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +1 -1
  860. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/manifest.json +2 -2
  861. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/resources.json +19 -15
  862. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/CollaborationDraft.fragment.xml +36 -0
  863. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +1 -1
  864. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacet.fragment.xml +1 -0
  865. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacetCustomContainer.fragment.xml +1 -0
  866. package/packages/sap.fe.templates/src/sap/fe/templates/RootContainer/controller/Fcl-dbg.controller.js +3 -1
  867. package/packages/sap.fe.templates/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +1 -1
  868. package/packages/sap.fe.templates/src/sap/fe/templates/RootContainer/controller/NavContainer-dbg.controller.js +3 -1
  869. package/packages/sap.fe.templates/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +1 -1
  870. package/packages/sap.fe.templates/src/sap/fe/templates/designtime/library-preload.designtime.js +1 -1
  871. package/packages/sap.fe.templates/src/sap/fe/templates/designtime/library-preload.designtime.js.map +2 -2
  872. package/packages/sap.fe.templates/src/sap/fe/templates/library-dbg.js +1 -1
  873. package/packages/sap.fe.templates/src/sap/fe/templates/library-h2-preload.js +4 -3
  874. package/packages/sap.fe.templates/src/sap/fe/templates/library-h2-preload.js.map +2 -2
  875. package/packages/sap.fe.templates/src/sap/fe/templates/library-preload.js +22 -21
  876. package/packages/sap.fe.templates/src/sap/fe/templates/library-preload.js.map +4 -4
  877. package/packages/sap.fe.templates/src/sap/fe/templates/library.js +1 -1
  878. package/packages/sap.fe.templates/src/sap/fe/templates/manifest.json +14 -14
  879. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ar.properties +0 -15
  880. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_bg.properties +0 -15
  881. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ca.properties +0 -15
  882. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_cs.properties +0 -15
  883. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_cy.properties +0 -15
  884. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_da.properties +0 -15
  885. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_de.properties +0 -15
  886. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_el.properties +0 -15
  887. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en.properties +0 -15
  888. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en_GB.properties +0 -15
  889. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +0 -15
  890. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +0 -15
  891. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +0 -15
  892. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_es.properties +0 -15
  893. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_es_MX.properties +0 -15
  894. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_et.properties +0 -15
  895. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_fi.properties +0 -15
  896. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_fr.properties +0 -15
  897. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_fr_CA.properties +0 -15
  898. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_hi.properties +0 -15
  899. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_hr.properties +0 -15
  900. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_hu.properties +0 -15
  901. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_id.properties +0 -15
  902. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_it.properties +0 -15
  903. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_iw.properties +0 -15
  904. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ja.properties +0 -15
  905. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_kk.properties +0 -15
  906. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ko.properties +0 -15
  907. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_lt.properties +0 -15
  908. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_lv.properties +0 -15
  909. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ms.properties +0 -15
  910. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_nl.properties +0 -15
  911. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_no.properties +0 -15
  912. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_pl.properties +0 -15
  913. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_pt.properties +0 -15
  914. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_pt_PT.properties +0 -15
  915. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ro.properties +0 -15
  916. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ru.properties +0 -15
  917. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_sh.properties +0 -15
  918. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_sk.properties +0 -15
  919. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_sl.properties +0 -15
  920. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_sv.properties +0 -15
  921. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_th.properties +0 -15
  922. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_tr.properties +0 -15
  923. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_uk.properties +0 -15
  924. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_vi.properties +0 -15
  925. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_zh_CN.properties +0 -15
  926. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_zh_TW.properties +0 -15
  927. package/packages/sap.fe.templates/src/sap/fe/templates/resources.json +115 -89
  928. package/packages/sap.fe.templates/test/sap/fe/templates/demokit/apps/itelo/webapp/manifest.json +1 -1
  929. package/packages/sap.fe.templates/test/sap/fe/templates/designtime/api.json +353 -1
  930. package/packages/sap.fe.templates/test/sap/fe/templates/designtime/apiref/api.json +1 -1
  931. package/packages/sap.fe.templates/test/sap/fe/templates/designtime/codeassistance/Library.jsmeta.json +1 -1
  932. package/packages/sap.fe.templates/test/sap/fe/templates/designtime/codeassistance/Library.xmlmeta.json +1 -1
  933. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/IntentBasedNavigation.spec.js +1 -1
  934. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/IntentBasedNavigation.spec.ts +3 -3
  935. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/Share.spec.js +1 -1
  936. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/Share.spec.ts +4 -4
  937. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/ViewState.spec.js +1 -1
  938. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/ViewState.spec.ts +2 -2
  939. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/view/fragments/ObjectPageHeaderForm.spec.js +2 -1
  940. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/view/fragments/ObjectPageHeaderForm.spec.ts +2 -1
  941. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/view/fragments/__snapshots__/HeaderFacet.spec.ts.snap +7 -7
  942. package/packages/sap.fe.templates/test/sap/fe/templates/jest/RootContainer/RootContainerBaseController.spec.js +30 -61
  943. package/packages/sap.fe.templates/test/sap/fe/templates/jest/RootContainer/RootContainerBaseController.spec.ts +1 -1
  944. package/packages/sap.fe.templates/test/sap/fe/templates/relnotes/changes-1.100.json +192 -0
  945. package/packages/sap.fe.templates/test/sap/fe/templates/relnotes/changes-1.99.json +0 -11
  946. package/packages/sap.fe.test/src/sap/fe/test/.library +1 -1
  947. package/packages/sap.fe.test/src/sap/fe/test/.theming +1 -1
  948. package/packages/sap.fe.test/src/sap/fe/test/FeMocks-dbg.js +1 -1
  949. package/packages/sap.fe.test/src/sap/fe/test/FeMocks.ts +8 -8
  950. package/packages/sap.fe.test/src/sap/fe/test/JestTemplatingHelper-dbg.js +6 -4
  951. package/packages/sap.fe.test/src/sap/fe/test/JestTemplatingHelper.js +1 -1
  952. package/packages/sap.fe.test/src/sap/fe/test/JestTemplatingHelper.ts +10 -6
  953. package/packages/sap.fe.test/src/sap/fe/test/UI5MockHelper-dbg.js +126 -203
  954. package/packages/sap.fe.test/src/sap/fe/test/UI5MockHelper.js +1 -1
  955. package/packages/sap.fe.test/src/sap/fe/test/UI5MockHelper.ts +17 -2
  956. package/packages/sap.fe.test/src/sap/fe/test/api/FilterBarAPI-dbg.js +9 -1
  957. package/packages/sap.fe.test/src/sap/fe/test/api/FilterBarAPI.js +1 -1
  958. package/packages/sap.fe.test/src/sap/fe/test/library-dbg.js +1 -1
  959. package/packages/sap.fe.test/src/sap/fe/test/library-h2-preload.js +2 -2
  960. package/packages/sap.fe.test/src/sap/fe/test/library-h2-preload.js.map +2 -2
  961. package/packages/sap.fe.test/src/sap/fe/test/library-preload.js +9 -18
  962. package/packages/sap.fe.test/src/sap/fe/test/library-preload.js.map +3 -3
  963. package/packages/sap.fe.test/src/sap/fe/test/library.js +1 -1
  964. package/packages/sap.fe.test/src/sap/fe/test/manifest.json +3 -3
  965. package/packages/sap.fe.test/src/sap/fe/test/resources.json +18 -18
  966. package/packages/sap.fe.test/test/sap/fe/test/designtime/api.json +1 -1
  967. package/packages/sap.fe.test/test/sap/fe/test/designtime/apiref/api.json +1 -1
  968. package/packages/sap.fe.test/test/sap/fe/test/designtime/codeassistance/Library.xmlmeta.json +1 -1
  969. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/FormTemplatingTs.qunit.js +0 -271
@@ -1,1816 +1,1751 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- (c) Copyright 2009-2017 SAP SE. All rights reserved
4
-
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
5
4
  */
6
- sap.ui.define(
7
- [
8
- "sap/m/Button",
9
- "sap/m/Dialog",
10
- "sap/m/library",
11
- "sap/fe/common/MessagePopover",
12
- "sap/fe/core/CommonUtils",
13
- "sap/ui/core/MessageType",
14
- "sap/ui/model/Filter",
15
- "sap/ui/model/Sorter",
16
- "sap/ui/model/FilterOperator",
17
- "sap/uxap/ObjectPageLayout",
18
- "sap/base/Log",
19
- "sap/base/util/UriParameters",
20
- "sap/m/FormattedText"
21
- ],
22
- function(
23
- Button,
24
- Dialog,
25
- mLibrary,
26
- MessagePopover,
27
- CommonUtils,
28
- MessageType,
29
- Filter,
30
- Sorter,
31
- FilterOperator,
32
- ObjectPageLayout,
33
- Log,
34
- UriParameters,
35
- FormattedText
36
- ) {
37
- "use strict";
38
- var ButtonType = mLibrary.ButtonType;
39
- var MessageButton = Button.extend("sap.fe.common.MessageButton", {
40
- metadata: {
41
- properties: {},
42
- events: {
43
- messageChange: {}
44
- },
45
- aggregations: {
46
- customFilters: {
47
- type: "sap.fe.common.MessageFilter",
48
- multiple: true,
49
- singularName: "customFilter"
50
- }
51
- }
52
- },
53
- renderer: {}
54
- });
55
- /**
56
- *
57
- * @param {object} sControlId
58
- * @param {object} oItem
59
- *
60
- * @returns {boolean} True if the control ID matches the item ID
61
- */
62
- function _fnFilterUponId(sControlId, oItem) {
63
- return sControlId === oItem.getId();
64
- }
65
- /**
66
- *
67
- * @param {Array} aControlIds
68
- * @param {object} oItem
69
- *
70
- * @returns {boolean} True if matches the item ID matcheds with one of the controlIds
71
- */
72
- function _fnFilterUponIds(aControlIds, oItem) {
73
- return aControlIds.some(function(sControlId) {
74
- if (sControlId === oItem.getId()) {
75
- return true;
76
- }
77
- return false;
78
- });
79
- }
80
-
81
- function _formatMessageDescription(message, oTableRowContext, sTableTargetColName, oResourceBundle, oTable) {
82
- var sTableFirstColProperty = _getTableFirstColProperty(oTable);
83
- var sColumnInfo = "";
84
- var oColFromTableSettings = _fetchColumnInfo(message, oTable);
85
- if (sTableTargetColName) {
86
- // if column in present in table definition
87
- sColumnInfo = oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_COLUMN") + ": " + sTableTargetColName;
88
- } else if (oColFromTableSettings) {
89
- if (oColFromTableSettings.availability === "Hidden") {
90
- // if column in neither in table definition nor personalization
91
- if (message.getType() === "Error") {
92
- sColumnInfo =
93
- oResourceBundle.getText("T_COLUMN_AVAILABLE_DIAGNOSIS_MSGDESC_ERROR") +
94
- " " +
95
- oTableRowContext.getValue(sTableFirstColProperty);
96
- } else {
97
- sColumnInfo =
98
- oResourceBundle.getText("T_COLUMN_AVAILABLE_DIAGNOSIS_MSGDESC") +
99
- " " +
100
- oTableRowContext.getValue(sTableFirstColProperty);
101
- }
102
- } else {
103
- // if column is not in table definition but in personalization
104
- sColumnInfo =
105
- oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_COLUMN") +
106
- ": " +
107
- oColFromTableSettings.label +
108
- " (" +
109
- oResourceBundle.getText("T_COLUMN_INDICATOR_IN_TABLE_DEFINITION") +
110
- ")";
111
- }
112
- }
113
- var oFieldsAffectedTitle = new FormattedText({
114
- htmlText: "<html><body><strong>" + oResourceBundle.getText("T_FIELDS_AFFECTED_TITLE") + "</strong></body></html><br>"
115
- });
116
- var sFieldAffectedText =
117
- oFieldsAffectedTitle.getHtmlText() +
118
- "<br>" +
119
- oResourceBundle.getText("T_MESSAGE_GROUP_TITLE_TABLE_DENOMINATOR") +
120
- ": " +
121
- oTable.getHeader() +
122
- "<br>" +
123
- oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_ROW") +
124
- ": " +
125
- oTableRowContext.getValue(sTableFirstColProperty) +
126
- "<br>" +
127
- sColumnInfo +
128
- "<br>";
129
- var oDiagnosisTitle = new FormattedText({
130
- htmlText: "<html><body><strong>" + oResourceBundle.getText("T_DIAGNOSIS_TITLE") + "</strong></body></html><br>"
131
- });
132
- // get the UI messages from the message context to set it to Diagnosis section
133
- var sUIMessageDescription = message.getBindingContext("message").getObject().description;
134
- //set the description to null to reset it below
135
- message.setDescription(null);
136
- var sDiagnosisText = "",
137
- sMessageDescriptionContent = "";
138
- if (message.getLongtextUrl()) {
139
- sMessageDescriptionContent = sFieldAffectedText + "<br>";
140
- _setLongtextUrlDescription.bind(this)(sMessageDescriptionContent, oDiagnosisTitle);
141
- } else if (sUIMessageDescription) {
142
- sDiagnosisText = oDiagnosisTitle.getHtmlText() + "<br>" + sUIMessageDescription;
143
- sMessageDescriptionContent = sFieldAffectedText + "<br>" + sDiagnosisText;
144
- message.setDescription(sMessageDescriptionContent);
145
- } else {
146
- message.setDescription(sFieldAffectedText);
147
- }
148
- }
149
-
150
- function _setLongtextUrlDescription(sMessageDescriptionContent, oDiagnosisTitle) {
151
- this.oMessagePopover.setAsyncDescriptionHandler(function(config) {
152
- // This stores the old description
153
- var sOldDescription = sMessageDescriptionContent;
154
- // Here we can fetch the data and concatenate it to the old one
155
- // By default, the longtextUrl fetching will overwrite the description (with the default behaviour)
156
- // Here as we have overwritten the default async handler, which fetches and replaces the description of the item
157
- // we can manually modify it to include whatever needed.
158
- var sLongTextUrl = config.item.getLongtextUrl();
159
- if (sLongTextUrl) {
160
- jQuery.ajax({
161
- type: "GET",
162
- url: sLongTextUrl,
163
- success: function(data) {
164
- var sDiagnosisText = oDiagnosisTitle.getHtmlText() + data;
165
- config.item.setDescription(sOldDescription + "" + sDiagnosisText);
166
- config.promise.resolve();
167
- },
168
- error: function() {
169
- config.item.setDescription(sMessageDescriptionContent);
170
- var sError = "A request has failed for long text data. URL: " + sLongTextUrl;
171
- Log.error(sError);
172
- config.promise.reject(sError);
173
- }
174
- });
175
- }
176
- });
177
- }
178
- /**
179
- * Method to set the button text, count and icon property based upon the message items
180
- * ButtonType: Possible settings for warning and error messages are 'critical' and 'negative'.
181
- *
182
- *
183
- * @private
184
- */
185
- function _setMessageData() {
186
- clearTimeout(this._setMessageDataTimeout);
187
-
188
- this._setMessageDataTimeout = setTimeout(
189
- function() {
190
- var sIcon,
191
- sButtonType = ButtonType.Default,
192
- oMessages = this.oMessagePopover.getItems(),
193
- iMessageLength = oMessages.length,
194
- oMessageCount = { Error: 0, Warning: 0, Success: 0, Information: 0 },
195
- oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
196
- sMessageKey,
197
- sTooltipText,
198
- sMessageText;
199
- if (iMessageLength > 0) {
200
- for (var i = 0; i < iMessageLength; i++) {
201
- if (!oMessages[i].getType() || oMessages[i].getType() == "") {
202
- ++oMessageCount["Information"];
203
- } else {
204
- ++oMessageCount[oMessages[i].getType()];
205
- }
206
- }
207
- if (oMessageCount[MessageType.Error] > 0) {
208
- sButtonType = ButtonType.Negative;
209
- } else if (oMessageCount[MessageType.Critical] > 0 || oMessageCount[MessageType.Warning] > 0) {
210
- sButtonType = ButtonType.Critical;
211
- } else if (oMessageCount[MessageType.Success] > 0) {
212
- sButtonType = ButtonType.Success;
213
- } else if (oMessageCount[MessageType.Information] > 0) {
214
- sButtonType = ButtonType.Neutral;
215
- }
216
- if (oMessageCount.Error > 0) {
217
- this.setText(oMessageCount.Error);
218
- } else {
219
- this.setText("");
220
- }
221
- if (oMessageCount.Error === 1) {
222
- sMessageKey = "C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR";
223
- } else if (oMessageCount.Error > 1) {
224
- sMessageKey = "C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_MULTIPLE_ERROR_TOOLTIP";
225
- } else if (!oMessageCount.Error && oMessageCount.Warning) {
226
- sMessageKey = "C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_WARNING_TOOLTIP";
227
- } else if (!oMessageCount.Error && !oMessageCount.Warning && oMessageCount.Information) {
228
- sMessageKey = "C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_INFO";
229
- } else if (!oMessageCount.Error && !oMessageCount.Warning && !oMessageCount.Information && oMessageCount.Success) {
230
- sMessageKey = "C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_SUCCESS";
231
- }
232
- if (sMessageKey) {
233
- sMessageText = oResourceBundle.getText(sMessageKey);
234
- sTooltipText = oMessageCount.Error ? oMessageCount.Error + " " + sMessageText : sMessageText;
235
- this.setTooltip(sTooltipText);
236
- }
237
- this.setIcon(sIcon);
238
- this.setType(sButtonType);
239
- this.setVisible(true);
240
- var oView = sap.ui.getCore().byId(this.sViewId);
241
- if (oView) {
242
- var oPageReady = oView.getController().pageReady;
243
- oPageReady
244
- .waitPageReady()
245
- .then(
246
- function() {
247
- return this._applyGroupingAsync(oView);
248
- }.bind(this)
249
- )
250
- .finally(
251
- function() {
252
- this.fireMessageChange({
253
- iMessageLength: iMessageLength
254
- });
255
- }.bind(this)
256
- )
257
- .catch(function(e) {
258
- Log.error("fail grouping messages");
259
- });
260
- }
261
- if (iMessageLength > 1) {
262
- this.oMessagePopover.navigateBack();
263
- }
264
- } else {
265
- this.setVisible(false);
266
- this.fireMessageChange({
267
- iMessageLength: iMessageLength
268
- });
269
- }
270
- }.bind(this),
271
- 100
272
- );
273
- }
274
- /**
275
- * Method to set the filters based upon the message items
276
- * The desired filter operation is:
277
- * ( filters provided by user && ( validation = true && Control should be present in view ) || messages for the current matching context ).
278
- *
279
- * @private
280
- */
281
- function _applyFiltersAndSort() {
282
- var aCustomFilters,
283
- oValidationFilters,
284
- oValidationAndContextFilter,
285
- oFilters,
286
- oBindingContext,
287
- sPath,
288
- sViewId,
289
- oSorter,
290
- oDialogFilter,
291
- aUserDefinedFilter = [],
292
- objectPageLayoutSections = null;
293
- function filterOutMessagesInDialog() {
294
- var fnTest = function(aControlIds) {
295
- var index = Infinity,
296
- oControl = sap.ui.getCore().byId(aControlIds[0]),
297
- errorFieldControl = sap.ui.getCore().byId(aControlIds[0]);
298
- while (oControl) {
299
- var fieldRankinDialog =
300
- oControl instanceof Dialog
301
- ? errorFieldControl
302
- .getParent()
303
- .findElements(true)
304
- .indexOf(errorFieldControl)
305
- : Infinity;
306
- if (oControl instanceof Dialog) {
307
- if (index > fieldRankinDialog) {
308
- index = fieldRankinDialog;
309
- // Set the focus to the dialog's control
310
- errorFieldControl.focus();
311
- }
312
- // messages for sap.m.Dialog should not appear in the message button
313
- return false;
314
- }
315
- oControl = oControl.getParent();
316
- }
317
- return true;
318
- };
319
- return new Filter({
320
- path: "controlIds",
321
- test: fnTest,
322
- caseSensitive: true
323
- });
324
- }
325
- //Filter function to verify if the control is part of the current view or not
326
- function getCheckControlInViewFilter() {
327
- var fnTest = function(aControlIds) {
328
- if (!aControlIds.length) {
329
- return false;
330
- }
331
- var oControl = sap.ui.getCore().byId(aControlIds[0]);
332
- while (oControl) {
333
- if (oControl.getId() === sViewId) {
334
- return true;
335
- }
336
- if (oControl instanceof Dialog) {
337
- // messages for sap.m.Dialog should not appear in the message button
338
- return false;
339
- }
340
- oControl = oControl.getParent();
341
- }
342
- return false;
343
- };
344
- return new Filter({
345
- path: "controlIds",
346
- test: fnTest,
347
- caseSensitive: true
348
- });
349
- }
350
- if (!this.sViewId) {
351
- this.sViewId = this._getViewId(this.getId());
352
- }
353
- sViewId = this.sViewId;
354
- //Add the filters provided by the user
355
- aCustomFilters = this.getAggregation("customFilters");
356
- if (aCustomFilters) {
357
- aCustomFilters.forEach(function(filter) {
358
- aUserDefinedFilter.push(
359
- new Filter({
360
- path: filter.getProperty("path"),
361
- operator: filter.getProperty("operator"),
362
- value1: filter.getProperty("value1"),
363
- value2: filter.getProperty("value2")
364
- })
365
- );
366
- });
367
- }
368
- oBindingContext = this.getBindingContext();
369
- if (!oBindingContext) {
370
- this.setVisible(false);
371
- return;
372
- } else {
373
- sPath = oBindingContext.getPath();
374
- //Filter for filtering out only validation messages which are currently present in the view
375
- oValidationFilters = new Filter({
376
- filters: [
377
- new Filter({
378
- path: "validation",
379
- operator: FilterOperator.EQ,
380
- value1: true
381
- }),
382
- getCheckControlInViewFilter()
383
- ],
384
- and: true
385
- });
386
- //Filter for filtering out the bound messages i.e target starts with the context path
387
- oValidationAndContextFilter = new Filter({
388
- filters: [
389
- oValidationFilters,
390
- new Filter({
391
- path: "target",
392
- operator: FilterOperator.StartsWith,
393
- value1: sPath
394
- })
395
- ],
396
- and: false
397
- });
398
- oDialogFilter = new Filter({
399
- filters: [filterOutMessagesInDialog()]
400
- });
401
- }
402
- var oValidationContextDialogFilters = new Filter({
403
- filters: [oValidationAndContextFilter, oDialogFilter],
404
- and: true
405
- });
406
- // and finally - if there any - add custom filter (via OR)
407
- if (aUserDefinedFilter.length > 0) {
408
- oFilters = new Filter({
409
- filters: [aUserDefinedFilter, oValidationContextDialogFilters],
410
- and: false
411
- });
412
- } else {
413
- oFilters = oValidationContextDialogFilters;
414
- }
415
- this.oItemBinding.filter(oFilters);
416
- this.oObjectPageLayout = _getObjectPageLayout(this, this.oObjectPageLayout);
417
- // We support sorting only for ObjectPageLayout use-case.
418
- if (this.oObjectPageLayout) {
419
- var that = this;
420
- oSorter = new Sorter("", null, null, function(obj1, obj2) {
421
- var rankA, rankB;
422
- if (!objectPageLayoutSections) {
423
- objectPageLayoutSections = that.oObjectPageLayout && that.oObjectPageLayout.getSections();
424
- }
425
- rankA = _getMessageRank(obj1, objectPageLayoutSections);
426
- rankB = _getMessageRank(obj2, objectPageLayoutSections);
427
- if (rankA < rankB) {
428
- return -1;
429
- }
430
- if (rankA > rankB) {
431
- return 1;
432
- }
433
- return 0;
434
- });
435
- this.oItemBinding.sort(oSorter);
436
- }
437
- }
438
- /**
439
- *
440
- * @param {object} obj The message object
441
- * @param {Array} aSections The array of sections in the object page
442
- *
443
- * @returns {number} The rank of the message
444
- */
445
- function _getMessageRank(obj, aSections) {
446
- if (aSections) {
447
- var section, aSubSections, subSection, j, k, aElements, aAllElements, sectionRank;
448
- for (j = aSections.length - 1; j >= 0; --j) {
449
- // Loop over all sections
450
- section = aSections[j];
451
- aSubSections = section.getSubSections();
452
- for (k = aSubSections.length - 1; k >= 0; --k) {
453
- // Loop over all sub-sections
454
- subSection = aSubSections[k];
455
- aAllElements = subSection.findElements(true); // Get all elements inside a sub-section
456
- //Try to find the control 1 inside the sub section
457
- aElements = aAllElements.filter(_fnFilterUponId.bind(this, obj.getControlId()));
458
- sectionRank = j + 1;
459
- if (aElements.length > 0) {
460
- obj.sectionName = section.getTitle();
461
- obj.subSectionName = subSection.getTitle();
462
- return sectionRank * 10 + (k + 1);
463
- }
464
- }
465
- }
466
- //if sub section title is Other messages, we return a high number(rank), which ensures
467
- //that messages belonging to this sub section always come later in messagePopover
468
- if (!obj.sectionName && !obj.subSectionName && obj.persistent) {
469
- return 1;
470
- }
471
- return 999;
472
- }
473
- return 999;
474
- }
475
- /**
476
- * The method that is called when a user clicks on the title of the message.
477
- *
478
- * @function
479
- * @name _activeTitlePress
480
- * @private
481
- * @param {Event} oEvent Event object passed from the handler
482
- */
483
- function _activeTitlePress(oEvent) {
484
- var oInternalModelContext = sap.ui.fl.Utils.getViewForControl(this).getBindingContext("internal");
485
- oInternalModelContext.setProperty("errorNavigationSectionFlag", true);
486
- var oItem = oEvent.getParameter("item"),
487
- oMessage = oItem.getBindingContext("message").getObject(),
488
- bIsBackendMessage = new RegExp("^/").test(oMessage.getTarget()),
489
- oControl,
490
- sSectionTitle,
491
- oView = sap.ui.getCore().byId(this.sViewId),
492
- oMessagePopover = this.oMessagePopover;
493
-
494
- if (oMessagePopover && oMessagePopover.isOpen()) {
495
- oMessagePopover.close();
496
- }
497
-
498
- var _focusOnMessageTargetControl = function(oMessage, oTargetMdcTable, iRowIndex, oMessageButton) {
499
- var aAllViewElements = oView.findElements(true);
500
- var aErroneousControls = oMessage
501
- .getControlIds()
502
- .filter(function(sControlId) {
503
- return aAllViewElements.some(function(oElem) {
504
- return oElem.getId() === sControlId;
505
- });
506
- })
507
- .map(function(sControlId) {
508
- return sap.ui.getCore().byId(sControlId);
509
- });
510
- var aNotTableErroneousControls = aErroneousControls.filter(function(oElem) {
511
- return !oElem.isA("sap.m.Table") && !oElem.isA("sap.ui.table.Table");
512
- });
513
- //The focus is set on Not Table control in priority
514
- if (aNotTableErroneousControls.length > 0) {
515
- aNotTableErroneousControls[0].focus();
516
- } else if (aErroneousControls.length > 0) {
517
- aErroneousControls[0].focus();
518
- var aTargetMdcTableRow = oTargetMdcTable
519
- ? oTargetMdcTable.findElements(true, function(oElem) {
520
- return oElem.isA("sap.m.ColumnListItem");
521
- })
522
- : [];
523
- if (aTargetMdcTableRow.length > 0 && aTargetMdcTableRow[0]) {
524
- var oTargetRow = aTargetMdcTableRow[iRowIndex];
525
- var oTargetCell = _getTargetCell(oTargetRow, oMessage);
526
- if (oTargetCell) {
527
- var oTargetField = oTargetCell.isA("sap.fe.macros.FieldAPI")
528
- ? oTargetCell.getContent().getContentEdit()[0]
529
- : oTargetCell
530
- .getItems()[0]
531
- .getContent()
532
- .getContentEdit()[0];
533
- oTargetField.focus();
534
- } else {
535
- // control not found on table
536
- var errorProperty = oMessage
537
- .getTarget()
538
- .split("/")
539
- .pop();
540
- if (errorProperty) {
541
- oView.getModel("internal").setProperty("/messageTargetProperty", errorProperty);
542
- }
543
- oView.getController()._routing.navigateForwardToContext(oTargetRow.getBindingContext());
544
- }
545
- }
546
- }
547
- };
548
-
549
- function _getTargetCell(oTargetRow, oMessage) {
550
- var oTargetCell = oMessage.controlIds
551
- .map(function(sControlId) {
552
- var isControlInTable = oTargetRow.findElements(true, function(oElem) {
553
- return oElem.getId() === sControlId;
554
- });
555
- return isControlInTable.length > 0 ? sap.ui.getCore().byId(sControlId) : null;
556
- })
557
- .reduce(function(acc, val) {
558
- return val ? val : acc;
559
- });
560
- return oTargetCell;
561
- }
562
-
563
- //check if the pressed item is related to a table control
564
- if (oItem.getGroupName().indexOf("Table:") !== -1) {
565
- var oTargetMdcTable;
566
- if (bIsBackendMessage) {
567
- oTargetMdcTable = oMessage.controlIds
568
- .map(function(sControlId) {
569
- var oControl = sap.ui.getCore().byId(sControlId);
570
- var oParentControl = oControl && oControl.getParent();
571
- return oParentControl &&
572
- oParentControl.isA("sap.ui.mdc.Table") &&
573
- oParentControl.getHeader() === oItem.getGroupName().split(", Table: ")[1]
574
- ? oParentControl
575
- : null;
576
- })
577
- .reduce(function(acc, val) {
578
- return val ? val : acc;
579
- });
580
- if (oTargetMdcTable) {
581
- sSectionTitle = oItem.getGroupName().split(", ")[0];
582
- _navigateFromMessageToSectionTableInIconTabBarMode(oTargetMdcTable, this.oObjectPageLayout, sSectionTitle)
583
- .then(
584
- function() {
585
- var oRefErrorContext = this._getTableRefErrorContext(oTargetMdcTable);
586
- var oRefError = oRefErrorContext.getProperty(
587
- oItem
588
- .getBindingContext("message")
589
- .getObject()
590
- .getId()
591
- );
592
- var _setFocusOnTargetField = function(oTargetMdcTable, iRowIndex, oMessageButton) {
593
- var aTargetMdcTableRow = _getMdcTableRows(oTargetMdcTable),
594
- iFirstVisibleRow = _getGridTable(oTargetMdcTable).getFirstVisibleRow();
595
- if (aTargetMdcTableRow.length > 0 && aTargetMdcTableRow[0]) {
596
- var oTargetRow = aTargetMdcTableRow[iRowIndex - iFirstVisibleRow],
597
- oTargetCell = _getTargetCell(oTargetRow, oMessage);
598
- if (oTargetCell) {
599
- oTargetCell.focus();
600
- } else {
601
- // control not found on table
602
- var errorProperty = oMessage
603
- .getTarget()
604
- .split("/")
605
- .pop();
606
- if (errorProperty) {
607
- oView.getModel("internal").setProperty("/messageTargetProperty", errorProperty);
608
- }
609
- oView.getController()._routing.navigateForwardToContext(oTargetRow.getBindingContext());
610
- }
611
- return { targetRow: oTargetRow, targetCell: oTargetCell };
612
- }
613
- return { targetRow: null, targetCell: null };
614
- };
615
- if (oTargetMdcTable.data("tableType") === "GridTable" && oRefError.rowIndex !== "") {
616
- var iFirstVisibleRow = _getGridTable(oTargetMdcTable).getFirstVisibleRow();
617
- oTargetMdcTable
618
- .scrollToIndex(oRefError.rowIndex)
619
- .then(function() {
620
- var aTargetMdcTableRow = _getMdcTableRows(oTargetMdcTable),
621
- iNewFirstVisibleRow,
622
- bScrollNeeded;
623
- if (aTargetMdcTableRow.length > 0 && aTargetMdcTableRow[0]) {
624
- iNewFirstVisibleRow = aTargetMdcTableRow[0].getParent().getFirstVisibleRow();
625
- bScrollNeeded = iFirstVisibleRow - iNewFirstVisibleRow !== 0;
626
- }
627
- if (bScrollNeeded) {
628
- //The scrollToIndex function does not wait for the UI update. As a workdaround, pending a fix from MDC (BCP: 2170251631) we use the event "UIUpdated".
629
- var oWaitControlIdAdded = new Promise(function(resolve) {
630
- sap.ui.getCore().attachEvent("UIUpdated", resolve);
631
- });
632
- return oWaitControlIdAdded;
633
- }
634
- return null;
635
- })
636
- .then(
637
- function() {
638
- setTimeout(
639
- function() {
640
- _setFocusOnTargetField(oTargetMdcTable, oRefError.rowIndex, this);
641
- }.bind(this),
642
- 0
643
- );
644
- }.bind(this)
645
- )
646
- .catch(function(e) {
647
- Log.error("Error while focusing on error");
648
- });
649
- } else if (oTargetMdcTable.data("tableType") === "ResponsiveTable" && oRefError) {
650
- _focusOnMessageTargetControl.bind(this)(oMessage, oTargetMdcTable, oRefError.rowIndex, this);
651
- } else {
652
- _focusOnMessageTargetControl.bind(this)(oMessage);
653
- }
654
- }.bind(this)
655
- )
656
- .catch(function() {
657
- Log.error("Fail to navigate to Error control");
658
- });
659
- }
660
- } else {
661
- oControl = sap.ui.getCore().byId(oMessage.controlIds[0]);
662
- //If the control underlying the frontEnd message is not within the current section, we first go into the target section:
663
- var oSelectedSection = sap.ui.getCore().byId(this.oObjectPageLayout.getSelectedSection());
664
- if (oSelectedSection.findElements(true).indexOf(oControl) === -1) {
665
- sSectionTitle = oItem.getGroupName().split(", ")[0];
666
- _navigateFromMessageToSectionInIconTabBarMode(this.oObjectPageLayout, sSectionTitle);
667
- }
668
- oControl.focus();
669
- }
670
- } else {
671
- // focus on control
672
- sSectionTitle = oItem.getGroupName().split(", ")[0];
673
- _navigateFromMessageToSectionInIconTabBarMode(this.oObjectPageLayout, sSectionTitle);
674
- _focusOnMessageTargetControl(oMessage);
675
- }
676
- }
677
- /**
678
- * Retrieves the section based on section title and visibility.
679
- *
680
- * @param {object} oObjectPage Object page.
681
- * @param {string} sSectionTitle Section title.
682
- * @returns {object}
683
- * @private
684
- * @ignore
685
- */
686
- function _getSectionBySectionTitle(oObjectPage, sSectionTitle) {
687
- if (sSectionTitle) {
688
- var aSections = oObjectPage.getSections();
689
- var oSection;
690
- for (var i = 0; i < aSections.length; i++) {
691
- if (aSections[i].getVisible() && aSections[i].getTitle() === sSectionTitle) {
692
- oSection = aSections[i];
693
- break;
694
- }
695
- }
696
- return oSection;
697
- }
698
- }
699
- /**
700
- * Navigates to the section if the object page uses an IconTabBar and if the current section is not the target of the navigation.
701
- *
702
- * @param {object} oObjectPage Object page.
703
- * @param {string} sSectionTitle Section title.
704
- * @private
705
- * @ignore
706
- */
707
- function _navigateFromMessageToSectionInIconTabBarMode(oObjectPage, sSectionTitle) {
708
- var bUseIconTabBar = oObjectPage.getUseIconTabBar();
709
- if (bUseIconTabBar) {
710
- var oSection = _getSectionBySectionTitle(oObjectPage, sSectionTitle);
711
- var sSelectedSectionId = oObjectPage.getSelectedSection();
712
- if (oSection && sSelectedSectionId !== oSection.getId()) {
713
- oObjectPage.setSelectedSection(oSection.getId());
714
- }
715
- }
716
- }
717
- function _navigateFromMessageToSectionTableInIconTabBarMode(oTable, oObjectPage, sSectionTitle) {
718
- var oRowBinding = oTable.getRowBinding();
719
- var oTableContext = oTable.getBindingContext();
720
- var oOPContext = oObjectPage.getBindingContext();
721
- var bShouldWaitForTableRefresh = !(oTableContext === oOPContext);
722
- _navigateFromMessageToSectionInIconTabBarMode(oObjectPage, sSectionTitle);
723
- return new Promise(function(resolve) {
724
- if (bShouldWaitForTableRefresh) {
725
- oRowBinding.attachEventOnce("change", function() {
726
- resolve();
727
- });
728
- } else {
729
- resolve();
730
- }
731
- });
732
- }
733
- /**
734
- * Retrieves the MDC table if it is found among any of the parent elements.
735
- *
736
- * @param {object} oElement Control
737
- * @returns {object} MDC table || undefined
738
- * @private
739
- * @ignore
740
- */
741
- function _getMdcTable(oElement) {
742
- //check if the element has a table within any of its parents
743
- var oParentElement = oElement.getParent();
744
- while (oParentElement && !oParentElement.isA("sap.ui.mdc.Table")) {
745
- oParentElement = oParentElement.getParent();
746
- }
747
- var oMdcTable = oParentElement && oParentElement.isA("sap.ui.mdc.Table") ? oParentElement : undefined;
748
- return oMdcTable;
749
- }
750
- function _getGridTable(oMdcTable) {
751
- return oMdcTable.findElements(true, function(oElem) {
752
- return (
753
- oElem.isA("sap.ui.table.Table") &&
754
- /** We check the element belongs to the Mdc Table :*/
755
- oElem.getParent() === oMdcTable
756
- );
757
- })[0];
758
- }
759
- /**
760
- * Retrieves the table row (if available) containing the element.
761
- *
762
- * @param {object} oElement Control
763
- * @returns {object} Table row || undefined
764
- * @private
765
- * @ignore
766
- */
767
- function _getTableRow(oElement) {
768
- var oParentElement = oElement.getParent();
769
- while (
770
- oParentElement &&
771
- !oParentElement.isA("sap.ui.table.Row") &&
772
- !oParentElement.isA("sap.ui.table.CreationRow") &&
773
- !oParentElement.isA("sap.m.ColumnListItem")
774
- ) {
775
- oParentElement = oParentElement.getParent();
776
- }
777
- var oTableRow =
778
- oParentElement &&
779
- (oParentElement.isA("sap.ui.table.Row") ||
780
- oParentElement.isA("sap.ui.table.CreationRow") ||
781
- oParentElement.isA("sap.m.ColumnListItem"))
782
- ? oParentElement
783
- : undefined;
784
- return oTableRow;
785
- }
786
- /**
787
- * Retrieves the index of the table row containing the element.
788
- *
789
- * @param {object} oElement Control
790
- * @returns {object} Row index || undefined
791
- * @private
792
- * @ignore
793
- */
794
- function _getTableRowIndex(oElement) {
795
- var oTableRow = _getTableRow(oElement),
796
- iRowIndex;
797
- if (oTableRow.isA("sap.ui.table.Row")) {
798
- iRowIndex = oTableRow.getIndex();
799
- } else {
800
- iRowIndex = oTableRow
801
- .getTable()
802
- .getItems()
803
- .findIndex(function(element) {
804
- return element.getId() === oTableRow.getId();
805
- });
806
- }
807
- return iRowIndex;
808
- }
809
- /**
810
- * Retrieves the index of the table column containing the element.
811
- *
812
- * @param {object} oElement Control
813
- * @returns {object} Column index || undefined
814
- * @private
815
- * @ignore
816
- */
817
- function _getTableColumnIndex(oElement) {
818
- var getTargetCellIndex = function(oElement, oTargetRow) {
819
- return oTargetRow.getCells().findIndex(function(oCell) {
820
- return oCell.getId() === oElement.getId();
821
- });
822
- };
823
- var getTargetColumnIndex = function(oElement, oTargetRow) {
824
- var oTargetElement = oElement.getParent(),
825
- iTargetCellIndex = getTargetCellIndex(oTargetElement, oTargetRow);
826
- while (oTargetElement && iTargetCellIndex < 0) {
827
- oTargetElement = oTargetElement.getParent();
828
- iTargetCellIndex = getTargetCellIndex(oTargetElement, oTargetRow);
829
- }
830
- return iTargetCellIndex;
831
- };
832
- var oTargetRow = _getTableRow(oElement),
833
- iTargetColumnIndex;
834
- iTargetColumnIndex = getTargetColumnIndex(oElement, oTargetRow);
835
- if (oTargetRow.isA("sap.ui.table.CreationRow")) {
836
- var sTargetCellId = oTargetRow.getCells()[iTargetColumnIndex].getId(),
837
- aTableColumns = oTargetRow.getTable().getColumns();
838
- iTargetColumnIndex = aTableColumns.findIndex(function(column) {
839
- if (column.getCreationTemplate()) {
840
- return sTargetCellId.search(column.getCreationTemplate().getId()) > -1 ? true : false;
841
- } else {
842
- return false;
843
- }
844
- });
845
- }
846
- return iTargetColumnIndex;
847
- }
848
- function _getTableColInfo(oTable, sTableTargetColProperty) {
849
- var sTableTargetColName;
850
- var oTableTargetCol = oTable.getColumns().find(
851
- function(sTableTargetColProperty, column) {
852
- return column.getDataProperty() === sTableTargetColProperty;
853
- }.bind(this, sTableTargetColProperty)
854
- );
855
- if (!oTableTargetCol) {
856
- /* If the target column is not found, we check for a custom column */
857
- var oCustomColumn = oTable
858
- .getControlDelegate()
859
- .getColumnsFor(oTable)
860
- .find(function(oColumn) {
861
- if (!!oColumn.template && oColumn.propertyInfos) {
862
- return (
863
- oColumn.propertyInfos[0] === sTableTargetColProperty ||
864
- oColumn.propertyInfos[0].replace("Property::", "") === sTableTargetColProperty
865
- );
866
- } else {
867
- return false;
868
- }
869
- });
870
- if (oCustomColumn) {
871
- oTableTargetCol = oCustomColumn;
872
- sTableTargetColProperty = oTableTargetCol.name;
873
-
874
- sTableTargetColName = oTable
875
- .getColumns()
876
- .find(function(oColumn) {
877
- return sTableTargetColProperty === oColumn.getDataProperty();
878
- })
879
- .getHeader();
880
- } else {
881
- /* If the target column is not found, we check for a field group */
882
- var aColumns = oTable.getControlDelegate().getColumnsFor(oTable);
883
- oTableTargetCol = aColumns.find(
884
- function(aColumns, sTableTargetColProperty, oColumn) {
885
- if (oColumn.key.indexOf("::FieldGroup::") !== -1) {
886
- return oColumn.propertyInfos.find(function(oPropertyInfo) {
887
- return aColumns.find(function(oColumn) {
888
- return oColumn.relativePath === sTableTargetColProperty;
889
- });
890
- });
891
- }
892
- }.bind(this, aColumns, sTableTargetColProperty)
893
- );
894
- /* check if the column with the field group is visible in the table: */
895
- if (oTableTargetCol && oTableTargetCol.label) {
896
- var bIsTableTargetColVisible = oTable.getColumns().some(function(column) {
897
- return column.getHeader() === oTableTargetCol.label;
898
- });
899
- }
900
- sTableTargetColName = bIsTableTargetColVisible && oTableTargetCol.label;
901
- sTableTargetColProperty = bIsTableTargetColVisible && oTableTargetCol.key;
902
- }
903
- } else {
904
- sTableTargetColName = oTableTargetCol && oTableTargetCol.getHeader();
905
- }
906
- return { sTableTargetColName: sTableTargetColName, sTableTargetColProperty: sTableTargetColProperty };
907
- }
908
- function _getMdcTableRows(oMdcTable) {
909
- return oMdcTable.findElements(true, function(oElem) {
910
- return (
911
- oElem.isA("sap.ui.table.Row") &&
912
- /** We check the element belongs to the Mdc Table :*/
913
- oElem.getTable().getParent() === oMdcTable
914
- );
915
- });
916
- }
917
- function _getTableColProperty(oTable, oMessageObject) {
918
- //this function escapes a string to use it as a regex
919
- var fnRegExpescape = function(string) {
920
- return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
921
- };
922
- // based on the target path of the message we retrieve the property name.
923
- // to achieve it we remove the bindingContext path and the row binding path from the target
924
- var sTableTargetColProperty = oMessageObject
925
- .getTarget()
926
- .replace(
927
- new RegExp(fnRegExpescape(oTable.getBindingContext().getPath() + "/" + oTable.getRowBinding().getPath()) + "\\(.*\\)/"),
928
- ""
929
- );
930
- return sTableTargetColProperty;
931
- }
932
- function _getObjectPageLayout(oElement, oObjectPageLayout) {
933
- if (oObjectPageLayout) {
934
- return oObjectPageLayout;
935
- }
936
- oObjectPageLayout = oElement;
937
- //Iterate over parent till you have not reached the object page layout
938
- while (oObjectPageLayout && !(oObjectPageLayout instanceof ObjectPageLayout)) {
939
- oObjectPageLayout = oObjectPageLayout.getParent();
940
- }
941
- return oObjectPageLayout;
942
- }
943
- function _getCustomColumnInfo(oTable, iPosition) {
944
- var sTableColProperty = oTable.getColumns()[iPosition].getDataProperty();
945
- var oCustomColumn = oTable
946
- .getControlDelegate()
947
- .getColumnsFor(oTable)
948
- .find(function(oColumn) {
949
- return oColumn.name === sTableColProperty && !!oColumn.template;
950
- });
951
- return oCustomColumn;
952
- }
953
- function _getTableFirstColProperty(oTable) {
954
- var sTableFirstColProperty,
955
- oCustomColumnInfo = _getCustomColumnInfo(oTable, 0);
956
- if (oCustomColumnInfo) {
957
- if (oCustomColumnInfo.propertyInfos) {
958
- sTableFirstColProperty = oCustomColumnInfo.propertyInfos[0].replace("Property::", "");
959
- } else {
960
- sTableFirstColProperty = undefined;
961
- }
962
- } else {
963
- sTableFirstColProperty = oTable.getColumns()[0].getDataProperty();
964
- }
965
- return sTableFirstColProperty;
966
- }
967
- function _getTableFirstColBindingContextForTextAnnotation(oTable, oTableRowContext, sTableFirstColProperty) {
968
- var oBindingContext;
969
- if (oTableRowContext && sTableFirstColProperty) {
970
- var oModel = oTable.getModel();
971
- var oMetaModel = oModel.getMetaModel();
972
- var sMetaPath = oMetaModel.getMetaPath(oTableRowContext.getPath());
973
- if (oMetaModel.getObject(sMetaPath + "/" + sTableFirstColProperty + "@com.sap.vocabularies.Common.v1.Text/$Path")) {
974
- oBindingContext = oMetaModel.createBindingContext(
975
- sMetaPath + "/" + sTableFirstColProperty + "@com.sap.vocabularies.Common.v1.Text"
976
- );
977
- }
978
- }
979
- return oBindingContext;
980
- }
981
-
982
- function _getTableFirstColValue(sTableFirstColProperty, oTableRowContext, sTextAnnotationPath, sTextArrangement) {
983
- var sCodeValue = oTableRowContext.getValue(sTableFirstColProperty);
984
- var sTextValue;
985
- var sComputedValue = sCodeValue;
986
- if (sTextAnnotationPath) {
987
- if (sTableFirstColProperty.lastIndexOf("/") > 0) {
988
- // the target property is replaced with the text annotation path
989
- sTableFirstColProperty = sTableFirstColProperty.slice(0, sTableFirstColProperty.lastIndexOf("/") + 1);
990
- sTableFirstColProperty = sTableFirstColProperty.concat(sTextAnnotationPath);
991
- } else {
992
- sTableFirstColProperty = sTextAnnotationPath;
993
- }
994
- sTextValue = oTableRowContext.getValue(sTableFirstColProperty);
995
- if (sTextValue) {
996
- if (sTextArrangement) {
997
- var sEnumNumber = sTextArrangement.slice(sTextArrangement.indexOf("/") + 1);
998
- switch (sEnumNumber) {
999
- case "TextOnly":
1000
- sComputedValue = sTextValue;
1001
- break;
1002
- case "TextFirst":
1003
- sComputedValue = sTextValue + " (" + sCodeValue + ")";
1004
- break;
1005
- case "TextLast":
1006
- sComputedValue = sCodeValue + " (" + sTextValue + ")";
1007
- break;
1008
- case "TextSeparate":
1009
- sComputedValue = sCodeValue;
1010
- break;
1011
- default:
1012
- }
1013
- } else {
1014
- sComputedValue = sTextValue + " (" + sCodeValue + ")";
1015
- }
1016
- }
1017
- }
1018
- return sComputedValue;
1019
- }
1020
- function _IsControlInTable(oTable, sControlId) {
1021
- var oControl = sap.ui.getCore().byId(sControlId);
1022
- if (!oControl.isA("sap.ui.table.Table") && !oControl.isA("sap.m.Table")) {
1023
- return oTable.findElements(true, function(oElem) {
1024
- return oElem.getId() === oControl;
1025
- });
1026
- }
1027
- return false;
1028
- }
1029
- function _IsControlPartOfCreationRow(oControl) {
1030
- var oParentControl = oControl.getParent();
1031
- while (
1032
- oParentControl &&
1033
- !oParentControl.isA("sap.ui.table.Row") &&
1034
- !oParentControl.isA("sap.ui.table.CreationRow") &&
1035
- !oParentControl.isA("sap.m.ColumnListItem")
1036
- ) {
1037
- oParentControl = oParentControl.getParent();
1038
- }
1039
-
1040
- return !!oParentControl && oParentControl.isA("sap.ui.table.CreationRow");
1041
- }
1042
- /**
1043
- * The method that is called to retrive the column info for associated messages in message popover.
1044
- * @private
1045
- * @param {oMessage} oMessage Message object
1046
- * @param {oTable} oTable MDC Table
1047
- * @returns {oColFromTableSettings} Returns the column info.
1048
- */
1049
- function _fetchColumnInfo(oMessage, oTable) {
1050
- var sColNameFromMessageObj = oMessage
1051
- .getBindingContext("message")
1052
- .getObject()
1053
- .getTarget()
1054
- .split("/")
1055
- .pop();
1056
- var oColFromTableSettings = oTable
1057
- .getParent()
1058
- .getTableDefinition()
1059
- .columns.find(function(oColumn) {
1060
- return oColumn.key.split("::").pop() === sColNameFromMessageObj;
1061
- });
1062
- return oColFromTableSettings;
1063
- }
1064
- function _setMessageSubtitle(
1065
- message,
1066
- oTableRowBindingContexts,
1067
- oTableRowContext,
1068
- sTableTargetColName,
1069
- oResourceBundle,
1070
- sTableTargetProperty,
1071
- oTable,
1072
- bIsCreationRow
1073
- ) {
1074
- var sMessageSubtitle;
1075
- var sRowSubtitleValue, sColumnSubtitleText;
1076
- var sTableFirstColProperty = _getTableFirstColProperty(oTable);
1077
- var oColFromTableSettings = _fetchColumnInfo(message, oTable);
1078
- if (bIsCreationRow) {
1079
- sMessageSubtitle = CommonUtils.getTranslatedText("T_MESSAGE_ITEM_SUBTITLE", oResourceBundle, [
1080
- oResourceBundle.getText("T_MESSAGE_ITEM_SUBTITLE_CREATION_ROW_INDICATOR"),
1081
- sTableTargetColName ? sTableTargetColName : oColFromTableSettings.label
1082
- ]);
1083
- } else {
1084
- var oTableFirstColBindingContextTextAnnotation = _getTableFirstColBindingContextForTextAnnotation(
1085
- oTable,
1086
- oTableRowContext,
1087
- sTableFirstColProperty
1088
- );
1089
- var sTableFirstColTextAnnotationPath = oTableFirstColBindingContextTextAnnotation
1090
- ? oTableFirstColBindingContextTextAnnotation.getObject("$Path")
1091
- : undefined;
1092
- var sTableFirstColTextArrangement =
1093
- sTableFirstColTextAnnotationPath && oTableFirstColBindingContextTextAnnotation
1094
- ? oTableFirstColBindingContextTextAnnotation.getObject("@com.sap.vocabularies.UI.v1.TextArrangement/$EnumMember")
1095
- : undefined;
1096
- if (oTableRowBindingContexts.length > 0) {
1097
- // set Row subtitle text
1098
- if (oTableRowContext && sTableFirstColProperty) {
1099
- sRowSubtitleValue = _getTableFirstColValue(
1100
- sTableFirstColProperty,
1101
- oTableRowContext,
1102
- sTableFirstColTextAnnotationPath,
1103
- sTableFirstColTextArrangement
1104
- );
1105
- } else {
1106
- sRowSubtitleValue = oResourceBundle.getText("T_MESSAGE_ITEM_SUBTITLE_INDICATOR_UNKNOWN");
1107
- }
1108
- // set the message subtitle
1109
- if (sTableTargetColName) {
1110
- // if column is present in table definition
1111
- sMessageSubtitle = CommonUtils.getTranslatedText("T_MESSAGE_ITEM_SUBTITLE", oResourceBundle, [
1112
- sRowSubtitleValue,
1113
- sTableTargetColName
1114
- ]);
1115
- } else if (oColFromTableSettings) {
1116
- // if column is neither in table definition nor personalization, show only row subtitle text
1117
- if (oColFromTableSettings.availability === "Hidden") {
1118
- sMessageSubtitle = oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_ROW") + ": " + sRowSubtitleValue;
1119
- } else {
1120
- //if column is in table personalization but not in table definition, show Column (Hidden) : <colName>
1121
- sColumnSubtitleText =
1122
- oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_COLUMN") +
1123
- " (" +
1124
- oResourceBundle.getText("T_COLUMN_INDICATOR_IN_TABLE_DEFINITION") +
1125
- "): " +
1126
- oColFromTableSettings.label;
1127
- sMessageSubtitle =
1128
- oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_ROW") +
1129
- ": " +
1130
- sRowSubtitleValue +
1131
- ", " +
1132
- sColumnSubtitleText;
1133
- }
1134
- } else {
1135
- sMessageSubtitle = CommonUtils.getTranslatedText("T_MESSAGE_ITEM_SUBTITLE", oResourceBundle, [
1136
- sRowSubtitleValue,
1137
- oResourceBundle.getText("T_MESSAGE_ITEM_SUBTITLE_INDICATOR_UNKNOWN")
1138
- ]);
1139
- }
1140
- } else {
1141
- sMessageSubtitle = null;
1142
- }
1143
- }
1144
- //set the subtitle
1145
- message.setSubtitle(sMessageSubtitle);
1146
- var oTableProperties = Object.keys(
1147
- oTable
1148
- .getModel()
1149
- .getMetaModel()
1150
- .getObject(oTable.data("entityType"))
1151
- );
1152
- // TODO: this logic would be moved to check the same at the template time to avoid the same check happening multiple times
1153
- var oComponent = sap.ui.require("sap/ui/core/Component");
1154
- var oNavObject = oTable && oComponent.getOwnerComponentFor(oTable) && oComponent.getOwnerComponentFor(oTable).getNavigation();
1155
- var bSubOPConfigured = false;
1156
- if (oNavObject && Object.keys(oNavObject).indexOf(oTable.getRowBinding().sPath) != -1) {
1157
- bSubOPConfigured =
1158
- oNavObject[oTable.getRowBinding().sPath] &&
1159
- oNavObject[oTable.getRowBinding().sPath].detail &&
1160
- oNavObject[oTable.getRowBinding().sPath].detail.route
1161
- ? true
1162
- : false;
1163
- }
1164
- var bIsNavigationConfigured =
1165
- bSubOPConfigured &&
1166
- oTable.getRowAction() &&
1167
- oTable.getRowAction().indexOf("Navigation") != -1 &&
1168
- oTableProperties.indexOf(sTableTargetProperty) != -1
1169
- ? true
1170
- : false;
1171
- // Deactivation of the error link when the error column is not displayed
1172
- // but The Link should be displayed if there is no subtitle
1173
- message.setActiveTitle(
1174
- !sMessageSubtitle ||
1175
- bIsNavigationConfigured ||
1176
- bIsCreationRow ||
1177
- (!!sTableTargetColName ? !!oTableRowContext : !!sTableTargetColName)
1178
- );
1179
- return sMessageSubtitle;
1180
- }
1181
- function _bIsOrphanElement(oElement, aElements) {
1182
- return !aElements.some(
1183
- function(oElement, oElem) {
1184
- var oParentElement = oElement.getParent();
1185
- while (oParentElement && oParentElement !== oElem) {
1186
- oParentElement = oParentElement.getParent();
1187
- }
1188
- return oParentElement ? true : false;
1189
- }.bind(this, oElement)
1190
- );
1191
- }
1192
- function _removeMessage(oMessage) {
1193
- var oTemp = sap.ui
1194
- .getCore()
1195
- .getMessageManager()
1196
- .getMessageModel()
1197
- .getData();
1198
- sap.ui
1199
- .getCore()
1200
- .getMessageManager()
1201
- .removeAllMessages();
1202
- oTemp.forEach(function(elt) {
1203
- if (elt !== oMessage) {
1204
- sap.ui
1205
- .getCore()
1206
- .getMessageManager()
1207
- .addMessages([elt]);
1208
- }
1209
- });
1210
- }
1211
-
1212
- MessageButton.prototype.init = function() {
1213
- Button.prototype.init.apply(this, arguments);
1214
- //press event handler attached to open the message popover
1215
- this.attachPress(this.handleMessagePopoverPress, this);
1216
- this.oMessagePopover = new MessagePopover();
1217
- this.oItemBinding = this.oMessagePopover.getBinding("items");
1218
- this.oItemBinding.attachChange(_setMessageData, this);
1219
- var messageButtonId = this.getId();
1220
- if (messageButtonId) {
1221
- this.oMessagePopover.addCustomData(new sap.ui.core.CustomData({ key: "messageButtonId", value: messageButtonId }));
1222
- }
1223
- this.attachModelContextChange(_applyFiltersAndSort.bind(this));
1224
- this.oMessagePopover.attachActiveTitlePress(_activeTitlePress.bind(this));
1225
- };
1226
- /**
1227
- * The method that is called when a user clicks on the MessageButton control.
1228
- *
1229
- * @param {object} oEvent Event object
1230
- */
1231
- MessageButton.prototype.handleMessagePopoverPress = function(oEvent) {
1232
- this.oMessagePopover.toggle(oEvent.getSource());
1233
- };
1234
- /**
1235
- * The method that groups the messages based on the section or subsection they belong to.
1236
- * This method force the loading of contexts for all tables before to apply the grouping.
1237
- *
1238
- * @param {object} oView Current view.
1239
- * @returns {Promise} Return promise.
1240
- *
1241
- * @private
1242
- */
1243
- MessageButton.prototype._applyGroupingAsync = function(oView) {
1244
- var aWaitForData = [];
1245
- var oViewBindingContext = oView.getBindingContext();
1246
- var _findTablesRelatedToMessages = function(oView) {
1247
- var oRes = [];
1248
- var aMessages = this.oItemBinding.getContexts().map(function(oContext) {
1249
- return oContext.getObject();
1250
- });
1251
- var oViewContext = oView.getBindingContext();
1252
- if (oViewContext) {
1253
- var oObjectPage = oView.getContent()[0];
1254
- this.getVisibleSectionsFromObjectPageLayout(oObjectPage).forEach(function(oSection) {
1255
- oSection.getSubSections().forEach(function(oSubSection) {
1256
- oSubSection.findElements(true).forEach(function(oElem) {
1257
- if (oElem.isA("sap.ui.mdc.Table")) {
1258
- for (var i = 0; i < aMessages.length; i++) {
1259
- var oRowBinding = oElem.getRowBinding();
1260
- if (oRowBinding) {
1261
- var sElemeBindingPath = oViewContext.getPath() + "/" + oElem.getRowBinding().getPath();
1262
- if (aMessages[i].target.indexOf(sElemeBindingPath) === 0) {
1263
- oRes.push({ table: oElem, subsection: oSubSection });
1264
- break;
1265
- }
1266
- }
1267
- }
1268
- }
1269
- });
1270
- });
1271
- });
1272
- }
1273
- return oRes;
1274
- };
1275
- // Search for table related to Messages and initialize the binding context of the parent subsection to retrieve the data
1276
- var oTables = _findTablesRelatedToMessages.bind(this)(oView);
1277
- oTables.forEach(function(_oTable) {
1278
- var oMDCTable = _oTable.table,
1279
- oSubsection = _oTable.subsection;
1280
- if (!oMDCTable.getBindingContext() || oMDCTable.getBindingContext().getPath() !== oViewBindingContext.getPath()) {
1281
- oSubsection.setBindingContext(oViewBindingContext);
1282
- if (!oMDCTable.getRowBinding().isLengthFinal()) {
1283
- aWaitForData.push(
1284
- new Promise(function(resolve) {
1285
- oMDCTable.getRowBinding().attachEventOnce("dataReceived", function() {
1286
- resolve();
1287
- });
1288
- })
1289
- );
1290
- }
1291
- }
1292
- });
1293
- return Promise.all(aWaitForData)
1294
- .then(
1295
- function() {
1296
- // the checkMessages call will refresh the controlIds for each messages
1297
- oView.getModel().checkMessages();
1298
- return new Promise(
1299
- function(resolve) {
1300
- setTimeout(
1301
- function() {
1302
- this._applyGrouping();
1303
- resolve();
1304
- }.bind(this),
1305
- 0
1306
- );
1307
- }.bind(this)
1308
- );
1309
- }.bind(this)
1310
- )
1311
- .catch(function() {
1312
- Log.error("Error while grouping the messages in the messagePopOver");
1313
- });
1314
- };
1315
- /**
1316
- * The method retrieves the visible sections from an objectpage.
1317
- *
1318
- * @param {object} oObjectPageLayout The objectPageLayout object for which we want to retrieve the visible sections.
1319
- * @returns {Array} Array of visible sections.
1320
- * @private
1321
- */
1322
- MessageButton.prototype.getVisibleSectionsFromObjectPageLayout = function(oObjectPageLayout) {
1323
- return oObjectPageLayout.getSections().filter(function(oSection) {
1324
- return oSection.getVisible();
1325
- });
1326
- };
1327
- /**
1328
- * The method that groups the messages based on the section or subsection they belong to.
1329
- *
1330
- * @private
1331
- */
1332
- MessageButton.prototype._applyGrouping = function() {
1333
- var aMessages, aSections;
1334
- this.oObjectPageLayout = _getObjectPageLayout(this, this.oObjectPageLayout);
1335
- if (!this.oObjectPageLayout) {
1336
- return;
1337
- }
1338
- aMessages = this.oMessagePopover.getItems();
1339
- aSections = this.getVisibleSectionsFromObjectPageLayout(this.oObjectPageLayout);
1340
- var bEnableBinding = this._checkControlIdInSections(aMessages, false);
1341
- if (bEnableBinding) {
1342
- this._fnEnableBindings(aSections);
1343
- }
1344
- };
1345
- /**
1346
- * The method retrieves the binding context for the refError object.
1347
- * The refError contains a map to store the indexes of the rows with errors.
1348
- *
1349
- * @param {object} oTable The table for which we want to get the refError Object.
1350
- * @returns {object} Context of the refError.
1351
- * @private
1352
- */
1353
- MessageButton.prototype._getTableRefErrorContext = function(oTable) {
1354
- var oModel = oTable.getModel("internal");
1355
- //initialize the refError property if it doesn't exist
1356
- if (!oTable.getBindingContext("internal").getProperty("refError")) {
1357
- oModel.setProperty("refError", {}, oTable.getBindingContext("internal"));
1358
- }
1359
- var sRefErrorContextPath =
1360
- oTable.getBindingContext("internal").getPath() +
1361
- "/refError/" +
1362
- oTable
1363
- .getBindingContext()
1364
- .getPath()
1365
- .replace("/", "$") +
1366
- "$" +
1367
- oTable
1368
- .getRowBinding()
1369
- .getPath()
1370
- .replace("/", "$");
1371
- var oContext = oModel.getContext(sRefErrorContextPath);
1372
- if (!oContext.getProperty("")) {
1373
- oModel.setProperty("", {}, oContext);
1374
- }
1375
- return oContext;
1376
- };
1377
- MessageButton.prototype._getBackendMessageToRemove = function(oTable, oMessageObject, oErrorContext) {
1378
- //Test if there is already a message for the same context:
1379
- var oBackendMessageToRemove,
1380
- oContext = this._getTableRefErrorContext(oTable),
1381
- aMessageIds = Object.keys(oContext.getProperty()).filter(function(key) {
1382
- return Object.keys(oContext.getProperty()[key]).every(function(childKey) {
1383
- return key !== oMessageObject.getId() && oContext.getProperty()[key][childKey] === oErrorContext[childKey];
1384
- });
1385
- }),
1386
- aValidMessageIds = sap.ui
1387
- .getCore()
1388
- .getMessageManager()
1389
- .getMessageModel()
1390
- .getData()
1391
- .map(function(oelt) {
1392
- return oelt.id;
1393
- });
1394
- if (aMessageIds.length > 0) {
1395
- aValidMessageIds.indexOf(aMessageIds[0]);
1396
- oBackendMessageToRemove = sap.ui
1397
- .getCore()
1398
- .getMessageManager()
1399
- .getMessageModel()
1400
- .getData()[aValidMessageIds.indexOf(aMessageIds[0])];
1401
- }
1402
- return oBackendMessageToRemove;
1403
- };
1404
- MessageButton.prototype._updateInternalModel = function(
1405
- oTableRowContext,
1406
- iRowIndex,
1407
- sTableTargetColProperty,
1408
- oTable,
1409
- oMessageObject,
1410
- bIsCreationRow
1411
- ) {
1412
- var oTemp;
1413
- if (bIsCreationRow) {
1414
- oTemp = {
1415
- rowIndex: "CreationRow",
1416
- targetColProperty: sTableTargetColProperty ? sTableTargetColProperty : ""
1417
- };
1418
- } else {
1419
- oTemp = {
1420
- rowIndex: oTableRowContext ? iRowIndex : "",
1421
- targetColProperty: sTableTargetColProperty ? sTableTargetColProperty : ""
1422
- };
1423
- }
1424
- var oModel = oTable.getModel("internal"),
1425
- oContext = this._getTableRefErrorContext(oTable);
1426
- //we first remove the entries with obsolete message ids from the internal model before inserting the new error info :
1427
- var aValidMessageIds = sap.ui
1428
- .getCore()
1429
- .getMessageManager()
1430
- .getMessageModel()
1431
- .getData()
1432
- .map(function(oelt) {
1433
- return oelt.id;
1434
- }),
1435
- aObsoleteMessagelIds;
1436
- if (oContext.getProperty()) {
1437
- aObsoleteMessagelIds = Object.keys(oContext.getProperty()).filter(function(internalMessageId) {
1438
- return aValidMessageIds.indexOf(internalMessageId) === -1;
1439
- });
1440
- aObsoleteMessagelIds.forEach(function(obsoleteId) {
1441
- delete oContext.getProperty()[obsoleteId];
1442
- });
1443
- }
1444
- oModel.setProperty(
1445
- oMessageObject.getId(),
1446
- Object.assign({}, oContext.getProperty(oMessageObject.getId()) ? oContext.getProperty(oMessageObject.getId()) : {}, oTemp),
1447
- oContext
1448
- );
1449
- };
1450
- MessageButton.prototype._getControlFromMessageRelatingToSubSection = function(subSection, message) {
1451
- var oMessageObject = message.getBindingContext("message").getObject();
1452
- var aElements = subSection
1453
- .findElements(true, function(oElem) {
1454
- return _fnFilterUponIds(oMessageObject.getControlIds(), oElem);
1455
- })
1456
- .sort(function(a, b) {
1457
- // controls are sorted in order to have the table on top of the array
1458
- // it will help to compute the subtitle of the message based on the type of related controls
1459
- if (a.isA("sap.ui.mdc.Table") && !b.isA("sap.ui.mdc.Table")) {
1460
- return -1;
1461
- }
1462
- return 1;
1463
- });
1464
- return aElements;
1465
- };
1466
- /**
1467
- * The method that sets groups for transient messages.
1468
- *
1469
- * @param {object} message The message we want to compute group and subtitle.
1470
- * @param {string} sActionName The action name.
1471
- * @private
1472
- */
1473
-
1474
- MessageButton.prototype._setGroupLabelForTransientMsg = function(message, sActionName) {
1475
- this.sLastActionText = this.sLastActionText
1476
- ? this.sLastActionText
1477
- : sap.ui
1478
- .getCore()
1479
- .getLibraryResourceBundle("sap.fe.core")
1480
- .getText("T_MESSAGE_BUTTON_SAPFE_MESSAGE_GROUP_LAST_ACTION");
1481
-
1482
- message.setGroupName(this.sLastActionText + ": " + sActionName);
1483
- };
1484
-
1485
- /**
1486
- * The method that group messages and add the subtitle.
1487
- *
1488
- * @param {object} message The message we want to compute group and subtitle.
1489
- * @param {object} section The section containing the controls.
1490
- * @param {object} subSection The subsection containing the controls.
1491
- * @param {object} aElements List of controls from a subsection related to a message .
1492
- * @param {boolean} bMultipleSubSections True if there are more than 1 subsection in the section.
1493
- * @param {string} sActionName The action name.
1494
- * @returns {object} Return the control targeted by the message.
1495
- * @private
1496
- */
1497
-
1498
- MessageButton.prototype._computeMessageGroupAndSubTitle = function(
1499
- message,
1500
- section,
1501
- subSection,
1502
- aElements,
1503
- bMultipleSubSections,
1504
- sActionName
1505
- ) {
1506
- this.oItemBinding.detachChange(_setMessageData, this);
1507
- var oMessageObject = message.getBindingContext("message").getObject();
1508
- var oElement,
1509
- oTable,
1510
- oTargetTableInfo,
1511
- l,
1512
- iRowIndex,
1513
- oTargetedControl,
1514
- oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
1515
- bIsBackendMessage = new RegExp("^/").test(oMessageObject.getTarget()),
1516
- oBackendMessageToRemove,
1517
- bIsCreationRow;
1518
- if (bIsBackendMessage) {
1519
- for (l = 0; l < aElements.length; l++) {
1520
- oElement = aElements[l];
1521
- oTargetedControl = oElement;
1522
- if (oElement.isA("sap.m.Table") || oElement.isA("sap.ui.table.Table")) {
1523
- oTargetTableInfo = {};
1524
- oTable = oElement.getParent();
1525
- oTargetTableInfo.tableHeader = oTable.getHeader();
1526
- var oRowBinding = oTable.getRowBinding();
1527
- if (oRowBinding && oRowBinding.isLengthFinal() && oTable.getBindingContext()) {
1528
- oTargetTableInfo.sTableTargetColProperty = _getTableColProperty(oTable, oMessageObject);
1529
- var oTableColInfo = _getTableColInfo(oTable, oTargetTableInfo.sTableTargetColProperty);
1530
- oTargetTableInfo.oTableRowBindingContexts = oElement.isA("sap.ui.table.Table")
1531
- ? oRowBinding.getContexts()
1532
- : oRowBinding.getCurrentContexts();
1533
- oTargetTableInfo.sTableTargetColName = oTableColInfo.sTableTargetColName;
1534
- oTargetTableInfo.sTableTargetProperty = oTargetTableInfo.sTableTargetColProperty;
1535
- oTargetTableInfo.sTableTargetColProperty = oTableColInfo.sTableTargetColProperty;
1536
- oTargetTableInfo.oTableRowContext = oTargetTableInfo.oTableRowBindingContexts.find(
1537
- function(oMessageObject, rowContext) {
1538
- return rowContext && oMessageObject.getTarget().indexOf(rowContext.getPath()) === 0;
1539
- }.bind(this, oMessageObject)
1540
- );
1541
- var sControlId;
1542
- if (!oTargetTableInfo.oTableRowContext) {
1543
- sControlId = oMessageObject.controlIds.find(
1544
- function(oTable, sId) {
1545
- return _IsControlInTable(oTable, sId);
1546
- }.bind(this, oTable)
1547
- );
1548
- }
1549
- if (sControlId) {
1550
- var oControl = sap.ui.getCore().byId(sControlId);
1551
- bIsCreationRow = _IsControlPartOfCreationRow(oControl);
1552
- }
1553
- _setMessageSubtitle(
1554
- message,
1555
- oTargetTableInfo.oTableRowBindingContexts,
1556
- oTargetTableInfo.oTableRowContext,
1557
- oTargetTableInfo.sTableTargetColName,
1558
- oResourceBundle,
1559
- oTargetTableInfo.sTableTargetProperty,
1560
- oTable,
1561
- bIsCreationRow
1562
- );
1563
- if (oTargetTableInfo.oTableRowContext) {
1564
- _formatMessageDescription.bind(this)(
1565
- message,
1566
- oTargetTableInfo.oTableRowContext,
1567
- oTargetTableInfo.sTableTargetColName,
1568
- oResourceBundle,
1569
- oTable
1570
- );
1571
- }
1572
- iRowIndex = oTargetTableInfo.oTableRowContext && oTargetTableInfo.oTableRowContext.getIndex();
1573
- this._updateInternalModel(
1574
- oTargetTableInfo.oTableRowContext,
1575
- iRowIndex,
1576
- oTargetTableInfo.sTableTargetColProperty,
1577
- oTable,
1578
- oMessageObject
1579
- );
1580
- }
1581
- } else {
1582
- message.setActiveTitle(true);
1583
- //check if the targeted control is a child of one of the other controls
1584
- var bIsTargetedControlOrphan = _bIsOrphanElement(oTargetedControl, aElements);
1585
- if (bIsTargetedControlOrphan) {
1586
- //set the subtitle
1587
- message.setSubtitle("");
1588
- break;
1589
- }
1590
- }
1591
- }
1592
- } else {
1593
- //There is only one elt as this is a frontEnd message
1594
- oTargetedControl = aElements[0];
1595
- oTable = _getMdcTable(oTargetedControl);
1596
- if (oTable) {
1597
- oTargetTableInfo = {};
1598
- oTargetTableInfo.tableHeader = oTable.getHeader();
1599
- var iTargetColumnIndex = _getTableColumnIndex(oTargetedControl);
1600
- oTargetTableInfo.sTableTargetColProperty =
1601
- iTargetColumnIndex > -1 ? oTable.getColumns()[iTargetColumnIndex].getDataProperty() : undefined;
1602
- oTargetTableInfo.sTableTargetProperty = oTargetTableInfo.sTableTargetColProperty;
1603
- oTargetTableInfo.sTableTargetColName =
1604
- oTargetTableInfo.sTableTargetColProperty && iTargetColumnIndex > -1
1605
- ? oTable.getColumns()[iTargetColumnIndex].getHeader()
1606
- : undefined;
1607
- bIsCreationRow = _getTableRow(oTargetedControl).isA("sap.ui.table.CreationRow");
1608
- if (!bIsCreationRow) {
1609
- iRowIndex = _getTableRowIndex(oTargetedControl);
1610
- oTargetTableInfo.oTableRowBindingContexts = oTable.getRowBinding().getCurrentContexts();
1611
- oTargetTableInfo.oTableRowContext = oTargetTableInfo.oTableRowBindingContexts[iRowIndex];
1612
- }
1613
- _setMessageSubtitle(
1614
- message,
1615
- oTargetTableInfo.oTableRowBindingContexts,
1616
- oTargetTableInfo.oTableRowContext,
1617
- oTargetTableInfo.sTableTargetColName,
1618
- oResourceBundle,
1619
- oTargetTableInfo.sTableTargetProperty,
1620
- oTable,
1621
- bIsCreationRow
1622
- );
1623
- this._updateInternalModel(
1624
- oTargetTableInfo.oTableRowContext,
1625
- iRowIndex,
1626
- oTargetTableInfo.sTableTargetColProperty,
1627
- oTable,
1628
- oMessageObject,
1629
- bIsCreationRow
1630
- );
1631
- if (oTargetTableInfo.oTableRowContext) {
1632
- var oErrorContext = {
1633
- rowIndex: oTargetTableInfo.oTableRowContext ? iRowIndex : "",
1634
- targetColProperty: oTargetTableInfo.sTableTargetColProperty ? oTargetTableInfo.sTableTargetColProperty : ""
1635
- };
1636
- oBackendMessageToRemove = this._getBackendMessageToRemove(oTable, oMessageObject, oErrorContext);
1637
- }
1638
- }
1639
- }
1640
- if (oMessageObject.persistent && sActionName) {
1641
- this._setGroupLabelForTransientMsg(message, sActionName);
1642
- } else {
1643
- message.setGroupName(
1644
- section.getTitle() +
1645
- (subSection.getTitle() && bMultipleSubSections ? ", " + subSection.getTitle() : "") +
1646
- (oTargetTableInfo
1647
- ? ", " +
1648
- oResourceBundle.getText("T_MESSAGE_GROUP_TITLE_TABLE_DENOMINATOR") +
1649
- ": " +
1650
- oTargetTableInfo.tableHeader
1651
- : "")
1652
- );
1653
- var sViewId = this._getViewId(this.getId());
1654
- var oView = sap.ui.getCore().byId(sViewId);
1655
- var oMessageTargetProperty =
1656
- oMessageObject.getTarget() &&
1657
- oMessageObject
1658
- .getTarget()
1659
- .split("/")
1660
- .pop();
1661
- var oUIModel = oView.getModel("internal");
1662
- if (
1663
- oUIModel &&
1664
- oUIModel.getProperty("/messageTargetProperty") &&
1665
- oMessageTargetProperty &&
1666
- oMessageTargetProperty == oUIModel.getProperty("/messageTargetProperty")
1667
- ) {
1668
- this.oMessagePopover.fireActiveTitlePress({ "item": message });
1669
- oUIModel.setProperty("/messageTargetProperty", false);
1670
- }
1671
- }
1672
- this.oItemBinding.attachChange(_setMessageData, this);
1673
- if (oBackendMessageToRemove && !bIsBackendMessage) {
1674
- /*Pending further investigation, along with the deletion of the backendEnd message,
1675
- we remove and reinsert all the other existing messages from the message manager to
1676
- make the highlight of the field on error persistent.*/
1677
- _removeMessage(oBackendMessageToRemove);
1678
- }
1679
- return oTargetedControl;
1680
- };
1681
- MessageButton.prototype._checkControlIdInSections = function(aMessages, bEnableBinding) {
1682
- var section, aSubSections, aVisibleSections, message, i, j, k;
1683
- this.sGeneralGroupText = this.sGeneralGroupText
1684
- ? this.sGeneralGroupText
1685
- : sap.ui
1686
- .getCore()
1687
- .getLibraryResourceBundle("sap.fe.core")
1688
- .getText("T_MESSAGE_BUTTON_SAPFE_MESSAGE_GROUP_GENERAL");
1689
- //Get all sections from the object page layout
1690
- aVisibleSections = this.getVisibleSectionsFromObjectPageLayout(this.oObjectPageLayout);
1691
- if (aVisibleSections) {
1692
- var viewId = this._getViewId(this.getId());
1693
- var oView = sap.ui.getCore().byId(viewId);
1694
- var sActionName =
1695
- oView && oView.getBindingContext("internal") && oView.getBindingContext("internal").getProperty("sActionName");
1696
- if (sActionName) {
1697
- oView.getBindingContext("internal").setProperty("sActionName", null);
1698
- }
1699
- for (i = aMessages.length - 1; i >= 0; --i) {
1700
- // Loop over all messages
1701
- message = aMessages[i];
1702
- var bIsGeneralGroupName = true;
1703
- for (j = aVisibleSections.length - 1; j >= 0; --j) {
1704
- // Loop over all visible sections
1705
- section = aVisibleSections[j];
1706
- aSubSections = section.getSubSections();
1707
- for (k = aSubSections.length - 1; k >= 0; --k) {
1708
- // Loop over all sub-sections
1709
- var subSection = aSubSections[k];
1710
- var aControls = this._getControlFromMessageRelatingToSubSection(subSection, message);
1711
- if (aControls.length > 0) {
1712
- var oTargetedControl = this._computeMessageGroupAndSubTitle(
1713
- message,
1714
- section,
1715
- subSection,
1716
- aControls,
1717
- aSubSections.length > 1,
1718
- sActionName
1719
- );
1720
- // if we found table that matches with the message, we don't stop the loop
1721
- // in case we find an additional control (eg mdc field) that also match with the message
1722
- if (
1723
- oTargetedControl &&
1724
- !oTargetedControl.isA("sap.m.Table") &&
1725
- !oTargetedControl.isA("sap.ui.table.Table")
1726
- ) {
1727
- j = k = -1;
1728
- }
1729
- bIsGeneralGroupName = false;
1730
- }
1731
- }
1732
- }
1733
- if (bIsGeneralGroupName) {
1734
- var oMessageObject = message.getBindingContext("message").getObject();
1735
- message.setActiveTitle(false);
1736
- if (oMessageObject.persistent && sActionName) {
1737
- this._setGroupLabelForTransientMsg(message, sActionName);
1738
- } else {
1739
- message.setGroupName(this.sGeneralGroupText);
1740
- }
1741
- }
1742
- if (!bEnableBinding && message.getGroupName() === this.sGeneralGroupText && this._findTargetForMessage(message)) {
1743
- return true;
1744
- }
1745
- }
1746
- }
1747
- };
1748
- MessageButton.prototype._findTargetForMessage = function(message) {
1749
- var messageObject = message.getBindingContext("message") && message.getBindingContext("message").getObject();
1750
- if (messageObject && messageObject.target) {
1751
- var oMetaModel =
1752
- this.oObjectPageLayout && this.oObjectPageLayout.getModel() && this.oObjectPageLayout.getModel().getMetaModel(),
1753
- contextPath = oMetaModel && oMetaModel.getMetaPath(messageObject.target),
1754
- oContextPathMetadata = oMetaModel && oMetaModel.getObject(contextPath);
1755
- if (oContextPathMetadata && oContextPathMetadata.$kind == "Property") {
1756
- return true;
1757
- }
1758
- }
1759
- };
1760
- MessageButton.prototype._fnEnableBindings = function(aSections) {
1761
- if (UriParameters.fromQuery(window.location.search).get("sap-fe-xx-lazyloadingtest")) {
1762
- return;
1763
- }
1764
- for (var iSection = 0; iSection < aSections.length; iSection++) {
1765
- var oSection = aSections[iSection];
1766
- var nonTableChartcontrolFound = false;
1767
- var aSubSections = oSection.getSubSections();
1768
- for (var iSubSection = 0; iSubSection < aSubSections.length; iSubSection++) {
1769
- var oSubSection = aSubSections[iSubSection];
1770
- var oAllBlocks = oSubSection.getBlocks();
1771
- if (oAllBlocks) {
1772
- for (var block = 0; block < oSubSection.getBlocks().length; block++) {
1773
- if (oAllBlocks[block].getContent && !oAllBlocks[block].getContent().isA("sap.fe.macros.TableAPI")) {
1774
- nonTableChartcontrolFound = true;
1775
- break;
1776
- }
1777
- }
1778
- if (nonTableChartcontrolFound) {
1779
- oSubSection.setBindingContext(undefined);
1780
- }
1781
- }
1782
- if (oSubSection.getBindingContext() && this._findMessageGroupAfterRebinding()) {
1783
- oSubSection
1784
- .getBindingContext()
1785
- .getBinding()
1786
- .attachDataReceived(this._findMessageGroupAfterRebinding());
1787
- }
1788
- }
1789
- }
1790
- };
1791
- MessageButton.prototype._findMessageGroupAfterRebinding = function() {
1792
- var aMessages = this.oMessagePopover.getItems();
1793
- this._checkControlIdInSections(aMessages, true);
1794
- };
1795
- /**
1796
- * The method that retrieves the view ID (HTMLView/XMLView/JSONview/JSView/Templateview) of any control.
1797
- *
1798
- * @param {string} sControlId ID of the control needed to retrieve the view ID
1799
- * @returns {string} The view ID of the control
1800
- */
1801
- MessageButton.prototype._getViewId = function(sControlId) {
1802
- var sViewId,
1803
- oControl = sap.ui.getCore().byId(sControlId);
1804
- while (oControl) {
1805
- if (oControl instanceof sap.ui.core.mvc.View) {
1806
- sViewId = oControl.getId();
1807
- break;
1808
- }
1809
- oControl = oControl.getParent();
1810
- }
1811
- return sViewId;
1812
- };
1813
- return MessageButton;
1814
- },
1815
- /* bExport= */ true
1816
- );
5
+ sap.ui.define(["sap/m/Button", "sap/m/Dialog", "sap/m/library", "sap/fe/common/MessagePopover", "sap/fe/core/CommonUtils", "sap/ui/core/library", "sap/ui/model/Filter", "sap/ui/model/Sorter", "sap/ui/model/FilterOperator", "sap/base/Log", "sap/base/util/UriParameters", "sap/m/FormattedText", "sap/ui/core/mvc/View", "sap/fe/core/helpers/ClassSupport"], function (Button, Dialog, mLib, MessagePopover, CommonUtils, coreLib, Filter, Sorter, FilterOperator, Log, UriParameters, FormattedText, View, ClassSupport) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _class, _class2, _descriptor, _descriptor2;
9
+
10
+ var Event = ClassSupport.Event;
11
+ var UI5Class = ClassSupport.UI5Class;
12
+ var Aggregation = ClassSupport.Aggregation;
13
+
14
+ function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
15
+
16
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
17
+
18
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
19
+
20
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
21
+
22
+ function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
23
+
24
+ function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
25
+
26
+ var ButtonType = mLib.ButtonType;
27
+ var MessageType = coreLib.MessageType;
28
+ var MessageButton = (_dec = UI5Class("sap.fe.common.MessageButton"), _dec2 = Aggregation({
29
+ type: "sap.fe.common.MessageFilter",
30
+ multiple: true,
31
+ singularName: "customFilter"
32
+ }), _dec(_class = (_class2 = /*#__PURE__*/function (_Button) {
33
+ _inherits(MessageButton, _Button);
34
+
35
+ function MessageButton() {
36
+ var _this;
37
+
38
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
39
+ args[_key] = arguments[_key];
40
+ }
41
+
42
+ _this = _Button.call.apply(_Button, [this].concat(args)) || this;
43
+
44
+ _initializerDefineProperty(_this, "customFilters", _descriptor, _assertThisInitialized(_this));
45
+
46
+ _initializerDefineProperty(_this, "messageChange", _descriptor2, _assertThisInitialized(_this));
47
+
48
+ _this.sLastActionText = "";
49
+ _this.sGeneralGroupText = "";
50
+ _this.sViewId = "";
51
+ return _this;
52
+ }
53
+
54
+ var _proto = MessageButton.prototype;
55
+
56
+ _proto.init = function init() {
57
+ Button.prototype.init.apply(this); //press event handler attached to open the message popover
58
+
59
+ this.attachPress(this.handleMessagePopoverPress, this);
60
+ this.oMessagePopover = new MessagePopover();
61
+ this.oItemBinding = this.oMessagePopover.getBinding("items");
62
+ this.oItemBinding.attachChange(this._setMessageData, this);
63
+ var messageButtonId = this.getId();
64
+
65
+ if (messageButtonId) {
66
+ this.oMessagePopover.addCustomData(new sap.ui.core.CustomData({
67
+ key: "messageButtonId",
68
+ value: messageButtonId
69
+ })); // TODO check for custom data type
70
+ }
71
+
72
+ this.attachModelContextChange(this._applyFiltersAndSort.bind(this));
73
+ this.oMessagePopover.attachActiveTitlePress(this._activeTitlePress.bind(this));
74
+ }
75
+ /**
76
+ * The method that is called when a user clicks on the MessageButton control.
77
+ *
78
+ * @param {object} oEvent Event object
79
+ */
80
+ ;
81
+
82
+ _proto.handleMessagePopoverPress = function handleMessagePopoverPress(oEvent) {
83
+ this.oMessagePopover.toggle(oEvent.getSource());
84
+ }
85
+ /**
86
+ * The method that groups the messages based on the section or subsection they belong to.
87
+ * This method force the loading of contexts for all tables before to apply the grouping.
88
+ *
89
+ * @param {object} oView Current view.
90
+ * @returns {Promise} Return promise.
91
+ *
92
+ * @private
93
+ */
94
+ ;
95
+
96
+ _proto._applyGroupingAsync = function _applyGroupingAsync(oView) {
97
+ var that = this;
98
+ var aWaitForData = [];
99
+ var oViewBindingContext = oView.getBindingContext();
100
+
101
+ var _findTablesRelatedToMessages = function (oView) {
102
+ var oRes = [];
103
+ var aMessages = that.oItemBinding.getContexts().map(function (oContext) {
104
+ return oContext.getObject();
105
+ });
106
+ var oViewContext = oView.getBindingContext();
107
+
108
+ if (oViewContext) {
109
+ var oObjectPage = oView.getContent()[0];
110
+ that.getVisibleSectionsFromObjectPageLayout(oObjectPage).forEach(function (oSection) {
111
+ oSection.getSubSections().forEach(function (oSubSection) {
112
+ oSubSection.findElements(true).forEach(function (oElem) {
113
+ if (oElem.isA("sap.ui.mdc.Table")) {
114
+ for (var i = 0; i < aMessages.length; i++) {
115
+ var oRowBinding = oElem.getRowBinding();
116
+
117
+ if (oRowBinding) {
118
+ var sElemeBindingPath = oViewContext.getPath() + "/" + oElem.getRowBinding().getPath();
119
+
120
+ if (aMessages[i].target.indexOf(sElemeBindingPath) === 0) {
121
+ oRes.push({
122
+ table: oElem,
123
+ subsection: oSubSection
124
+ });
125
+ break;
126
+ }
127
+ }
128
+ }
129
+ }
130
+ });
131
+ });
132
+ });
133
+ }
134
+
135
+ return oRes;
136
+ }; // Search for table related to Messages and initialize the binding context of the parent subsection to retrieve the data
137
+
138
+
139
+ var oTables = _findTablesRelatedToMessages.bind(this)(oView);
140
+
141
+ oTables.forEach(function (_oTable) {
142
+ var _oMDCTable$getBinding;
143
+
144
+ var oMDCTable = _oTable.table,
145
+ oSubsection = _oTable.subsection;
146
+
147
+ if (!oMDCTable.getBindingContext() || ((_oMDCTable$getBinding = oMDCTable.getBindingContext()) === null || _oMDCTable$getBinding === void 0 ? void 0 : _oMDCTable$getBinding.getPath()) !== (oViewBindingContext === null || oViewBindingContext === void 0 ? void 0 : oViewBindingContext.getPath())) {
148
+ oSubsection.setBindingContext(oViewBindingContext);
149
+
150
+ if (!oMDCTable.getRowBinding().isLengthFinal()) {
151
+ aWaitForData.push(new Promise(function (resolve) {
152
+ oMDCTable.getRowBinding().attachEventOnce("dataReceived", function () {
153
+ resolve();
154
+ });
155
+ }));
156
+ }
157
+ }
158
+ });
159
+ return Promise.all(aWaitForData).then(function () {
160
+ // the checkMessages call will refresh the controlIds for each messages
161
+ oView.getModel().checkMessages();
162
+ return new Promise(function (resolve) {
163
+ setTimeout(function () {
164
+ that._applyGrouping();
165
+
166
+ resolve();
167
+ }, 0);
168
+ });
169
+ }).catch(function () {
170
+ Log.error("Error while grouping the messages in the messagePopOver");
171
+ });
172
+ }
173
+ /**
174
+ * The method retrieves the visible sections from an objectpage.
175
+ *
176
+ * @param {object} oObjectPageLayout The objectPageLayout object for which we want to retrieve the visible sections.
177
+ * @returns {Array} Array of visible sections.
178
+ * @private
179
+ */
180
+ ;
181
+
182
+ _proto.getVisibleSectionsFromObjectPageLayout = function getVisibleSectionsFromObjectPageLayout(oObjectPageLayout) {
183
+ return oObjectPageLayout.getSections().filter(function (oSection) {
184
+ return oSection.getVisible();
185
+ });
186
+ }
187
+ /**
188
+ * The method that groups the messages based on the section or subsection they belong to.
189
+ *
190
+ * @private
191
+ */
192
+ ;
193
+
194
+ _proto._applyGrouping = function _applyGrouping() {
195
+ this.oObjectPageLayout = this._getObjectPageLayout(this, this.oObjectPageLayout);
196
+
197
+ if (!this.oObjectPageLayout) {
198
+ return;
199
+ }
200
+
201
+ var aMessages = this.oMessagePopover.getItems();
202
+ var aSections = this.getVisibleSectionsFromObjectPageLayout(this.oObjectPageLayout);
203
+
204
+ var bEnableBinding = this._checkControlIdInSections(aMessages, false);
205
+
206
+ if (bEnableBinding) {
207
+ this._fnEnableBindings(aSections);
208
+ }
209
+ }
210
+ /**
211
+ * The method retrieves the binding context for the refError object.
212
+ * The refError contains a map to store the indexes of the rows with errors.
213
+ *
214
+ * @param {object} oTable The table for which we want to get the refError Object.
215
+ * @returns {object} Context of the refError.
216
+ * @private
217
+ */
218
+ ;
219
+
220
+ _proto._getTableRefErrorContext = function _getTableRefErrorContext(oTable) {
221
+ var oModel = oTable.getModel("internal"); //initialize the refError property if it doesn't exist
222
+
223
+ if (!oTable.getBindingContext("internal").getProperty("refError")) {
224
+ oModel.setProperty("refError", {}, oTable.getBindingContext("internal"));
225
+ }
226
+
227
+ var sRefErrorContextPath = oTable.getBindingContext("internal").getPath() + "/refError/" + oTable.getBindingContext().getPath().replace("/", "$") + "$" + oTable.getRowBinding().getPath().replace("/", "$");
228
+ var oContext = oModel.getContext(sRefErrorContextPath);
229
+
230
+ if (!oContext.getProperty("")) {
231
+ oModel.setProperty("", {}, oContext);
232
+ }
233
+
234
+ return oContext;
235
+ };
236
+
237
+ _proto._getBackendMessageToRemove = function _getBackendMessageToRemove(oTable, oMessageObject, oErrorContext) {
238
+ //Test if there is already a message for the same context:
239
+ var oBackendMessageToRemove;
240
+
241
+ var oContext = this._getTableRefErrorContext(oTable),
242
+ aMessageIds = Object.keys(oContext.getProperty()).filter(function (key) {
243
+ return Object.keys(oContext.getProperty()[key]).every(function (childKey) {
244
+ return key !== oMessageObject.getId() && oContext.getProperty()[key][childKey] === oErrorContext[childKey];
245
+ });
246
+ }),
247
+ aValidMessageIds = sap.ui.getCore().getMessageManager().getMessageModel().getData().map(function (m) {
248
+ return m.id;
249
+ });
250
+
251
+ if (aMessageIds.length > 0) {
252
+ aValidMessageIds.indexOf(aMessageIds[0]);
253
+ oBackendMessageToRemove = sap.ui.getCore().getMessageManager().getMessageModel().getData()[aValidMessageIds.indexOf(aMessageIds[0])];
254
+ }
255
+
256
+ return oBackendMessageToRemove;
257
+ };
258
+
259
+ _proto._updateInternalModel = function _updateInternalModel(oTableRowContext, iRowIndex, sTableTargetColProperty, oTable, oMessageObject, bIsCreationRow) {
260
+ var oTemp;
261
+
262
+ if (bIsCreationRow) {
263
+ oTemp = {
264
+ rowIndex: "CreationRow",
265
+ targetColProperty: sTableTargetColProperty ? sTableTargetColProperty : ""
266
+ };
267
+ } else {
268
+ oTemp = {
269
+ rowIndex: oTableRowContext ? iRowIndex : "",
270
+ targetColProperty: sTableTargetColProperty ? sTableTargetColProperty : ""
271
+ };
272
+ }
273
+
274
+ var oModel = oTable.getModel("internal"),
275
+ oContext = this._getTableRefErrorContext(oTable); //we first remove the entries with obsolete message ids from the internal model before inserting the new error info :
276
+
277
+
278
+ var aValidMessageIds = sap.ui.getCore().getMessageManager().getMessageModel().getData().map(function (message) {
279
+ return message.id;
280
+ });
281
+ var aObsoleteMessagelIds;
282
+
283
+ if (oContext.getProperty()) {
284
+ aObsoleteMessagelIds = Object.keys(oContext.getProperty()).filter(function (internalMessageId) {
285
+ return aValidMessageIds.indexOf(internalMessageId) === -1;
286
+ });
287
+ aObsoleteMessagelIds.forEach(function (obsoleteId) {
288
+ delete oContext.getProperty()[obsoleteId];
289
+ });
290
+ }
291
+
292
+ oModel.setProperty(oMessageObject.getId(), Object.assign({}, oContext.getProperty(oMessageObject.getId()) ? oContext.getProperty(oMessageObject.getId()) : {}, oTemp), oContext);
293
+ };
294
+
295
+ _proto._getControlFromMessageRelatingToSubSection = function _getControlFromMessageRelatingToSubSection(subSection, message) {
296
+ var that = this;
297
+ var oMessageObject = message.getBindingContext("message").getObject();
298
+ var aElements = subSection.findElements(true, function (oElem) {
299
+ return that._fnFilterUponIds(oMessageObject.getControlIds(), oElem);
300
+ }).sort(function (a, b) {
301
+ // controls are sorted in order to have the table on top of the array
302
+ // it will help to compute the subtitle of the message based on the type of related controls
303
+ if (a.isA("sap.ui.mdc.Table") && !b.isA("sap.ui.mdc.Table")) {
304
+ return -1;
305
+ }
306
+
307
+ return 1;
308
+ });
309
+ return aElements;
310
+ }
311
+ /**
312
+ * The method that sets groups for transient messages.
313
+ *
314
+ * @param {object} message The message we want to compute group and subtitle.
315
+ * @param {string} sActionName The action name.
316
+ * @private
317
+ */
318
+ ;
319
+
320
+ _proto._setGroupLabelForTransientMsg = function _setGroupLabelForTransientMsg(message, sActionName) {
321
+ this.sLastActionText = this.sLastActionText ? this.sLastActionText : sap.ui.getCore().getLibraryResourceBundle("sap.fe.core").getText("T_MESSAGE_BUTTON_SAPFE_MESSAGE_GROUP_LAST_ACTION");
322
+ message.setGroupName(this.sLastActionText + ": " + sActionName);
323
+ }
324
+ /**
325
+ * The method that group messages and add the subtitle.
326
+ *
327
+ * @param {object} message The message we want to compute group and subtitle.
328
+ * @param {object} section The section containing the controls.
329
+ * @param {object} subSection The subsection containing the controls.
330
+ * @param {object} aElements List of controls from a subsection related to a message .
331
+ * @param {boolean} bMultipleSubSections True if there are more than 1 subsection in the section.
332
+ * @param {string} sActionName The action name.
333
+ * @returns {object} Return the control targeted by the message.
334
+ * @private
335
+ */
336
+ ;
337
+
338
+ _proto._computeMessageGroupAndSubTitle = function _computeMessageGroupAndSubTitle(message, section, subSection, aElements, bMultipleSubSections, sActionName) {
339
+ var that = this;
340
+ this.oItemBinding.detachChange(this._setMessageData, this);
341
+ var oMessageObject = message.getBindingContext("message").getObject();
342
+ var oElement, oTable, oTargetTableInfo, l, iRowIndex, oTargetedControl, oBackendMessageToRemove, bIsCreationRow;
343
+ var bIsBackendMessage = new RegExp("^/").test(oMessageObject.getTarget()),
344
+ oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
345
+
346
+ if (bIsBackendMessage) {
347
+ for (l = 0; l < aElements.length; l++) {
348
+ oElement = aElements[l];
349
+ oTargetedControl = oElement;
350
+
351
+ if (oElement.isA("sap.m.Table") || oElement.isA("sap.ui.table.Table")) {
352
+ oTargetTableInfo = {};
353
+ oTable = oElement.getParent();
354
+ oTargetTableInfo.tableHeader = oTable.getHeader();
355
+ var oRowBinding = oTable.getRowBinding();
356
+
357
+ if (oRowBinding && oRowBinding.isLengthFinal() && oTable.getBindingContext()) {
358
+ oTargetTableInfo.sTableTargetColProperty = this._getTableColProperty(oTable, oMessageObject);
359
+
360
+ var oTableColInfo = this._getTableColInfo(oTable, oTargetTableInfo.sTableTargetColProperty);
361
+
362
+ oTargetTableInfo.oTableRowBindingContexts = oElement.isA("sap.ui.table.Table") ? oRowBinding.getContexts() : oRowBinding.getCurrentContexts();
363
+ oTargetTableInfo.sTableTargetColName = oTableColInfo.sTableTargetColName;
364
+ oTargetTableInfo.sTableTargetProperty = oTargetTableInfo.sTableTargetColProperty;
365
+ oTargetTableInfo.sTableTargetColProperty = oTableColInfo.sTableTargetColProperty;
366
+ oTargetTableInfo.oTableRowContext = oTargetTableInfo.oTableRowBindingContexts.find(function (oMessageObject, rowContext) {
367
+ return rowContext && oMessageObject.getTarget().indexOf(rowContext.getPath()) === 0;
368
+ }.bind(this, oMessageObject));
369
+ var sControlId = void 0;
370
+
371
+ if (!oTargetTableInfo.oTableRowContext) {
372
+ sControlId = oMessageObject.controlIds.find(function (oTable, sId) {
373
+ return that._IsControlInTable(oTable, sId);
374
+ }.bind(this, oTable));
375
+ }
376
+
377
+ if (sControlId) {
378
+ var oControl = sap.ui.getCore().byId(sControlId);
379
+ bIsCreationRow = this._IsControlPartOfCreationRow(oControl);
380
+ }
381
+
382
+ this._setMessageSubtitle(message, oTargetTableInfo.oTableRowBindingContexts, oTargetTableInfo.oTableRowContext, oTargetTableInfo.sTableTargetColName, oResourceBundle, oTargetTableInfo.sTableTargetProperty, oTable, bIsCreationRow);
383
+
384
+ if (oTargetTableInfo.oTableRowContext) {
385
+ this._formatMessageDescription(message, oTargetTableInfo.oTableRowContext, oTargetTableInfo.sTableTargetColName, oResourceBundle, oTable);
386
+ }
387
+
388
+ iRowIndex = oTargetTableInfo.oTableRowContext && oTargetTableInfo.oTableRowContext.getIndex();
389
+
390
+ this._updateInternalModel(oTargetTableInfo.oTableRowContext, iRowIndex, oTargetTableInfo.sTableTargetColProperty, oTable, oMessageObject);
391
+ }
392
+ } else {
393
+ message.setActiveTitle(true); //check if the targeted control is a child of one of the other controls
394
+
395
+ var bIsTargetedControlOrphan = this._bIsOrphanElement(oTargetedControl, aElements);
396
+
397
+ if (bIsTargetedControlOrphan) {
398
+ //set the subtitle
399
+ message.setSubtitle("");
400
+ break;
401
+ }
402
+ }
403
+ }
404
+ } else {
405
+ //There is only one elt as this is a frontEnd message
406
+ oTargetedControl = aElements[0];
407
+ oTable = this._getMdcTable(oTargetedControl);
408
+
409
+ if (oTable) {
410
+ oTargetTableInfo = {};
411
+ oTargetTableInfo.tableHeader = oTable.getHeader();
412
+
413
+ var iTargetColumnIndex = this._getTableColumnIndex(oTargetedControl);
414
+
415
+ oTargetTableInfo.sTableTargetColProperty = iTargetColumnIndex > -1 ? oTable.getColumns()[iTargetColumnIndex].getDataProperty() : undefined;
416
+ oTargetTableInfo.sTableTargetProperty = oTargetTableInfo.sTableTargetColProperty;
417
+ oTargetTableInfo.sTableTargetColName = oTargetTableInfo.sTableTargetColProperty && iTargetColumnIndex > -1 ? oTable.getColumns()[iTargetColumnIndex].getHeader() : undefined;
418
+ bIsCreationRow = this._getTableRow(oTargetedControl).isA("sap.ui.table.CreationRow");
419
+
420
+ if (!bIsCreationRow) {
421
+ iRowIndex = this._getTableRowIndex(oTargetedControl);
422
+ oTargetTableInfo.oTableRowBindingContexts = oTable.getRowBinding().getCurrentContexts();
423
+ oTargetTableInfo.oTableRowContext = oTargetTableInfo.oTableRowBindingContexts[iRowIndex];
424
+ }
425
+
426
+ this._setMessageSubtitle(message, oTargetTableInfo.oTableRowBindingContexts, oTargetTableInfo.oTableRowContext, oTargetTableInfo.sTableTargetColName, oResourceBundle, oTargetTableInfo.sTableTargetProperty, oTable, bIsCreationRow);
427
+
428
+ this._updateInternalModel(oTargetTableInfo.oTableRowContext, iRowIndex, oTargetTableInfo.sTableTargetColProperty, oTable, oMessageObject, bIsCreationRow);
429
+
430
+ if (oTargetTableInfo.oTableRowContext) {
431
+ var oErrorContext = {
432
+ rowIndex: oTargetTableInfo.oTableRowContext ? iRowIndex : "",
433
+ targetColProperty: oTargetTableInfo.sTableTargetColProperty ? oTargetTableInfo.sTableTargetColProperty : ""
434
+ };
435
+ oBackendMessageToRemove = this._getBackendMessageToRemove(oTable, oMessageObject, oErrorContext);
436
+ }
437
+ }
438
+ }
439
+
440
+ if (oMessageObject.persistent && sActionName) {
441
+ this._setGroupLabelForTransientMsg(message, sActionName);
442
+ } else {
443
+ message.setGroupName(section.getTitle() + (subSection.getTitle() && bMultipleSubSections ? ", " + subSection.getTitle() : "") + (oTargetTableInfo ? ", " + oResourceBundle.getText("T_MESSAGE_GROUP_TITLE_TABLE_DENOMINATOR") + ": " + oTargetTableInfo.tableHeader : ""));
444
+
445
+ var sViewId = this._getViewId(this.getId());
446
+
447
+ var oView = sap.ui.getCore().byId(sViewId);
448
+ var oMessageTargetProperty = oMessageObject.getTarget() && oMessageObject.getTarget().split("/").pop();
449
+ var oUIModel = oView === null || oView === void 0 ? void 0 : oView.getModel("internal");
450
+
451
+ if (oUIModel && oUIModel.getProperty("/messageTargetProperty") && oMessageTargetProperty && oMessageTargetProperty == oUIModel.getProperty("/messageTargetProperty")) {
452
+ this.oMessagePopover.fireActiveTitlePress({
453
+ "item": message
454
+ });
455
+ oUIModel.setProperty("/messageTargetProperty", false);
456
+ }
457
+ }
458
+
459
+ this.oItemBinding.attachChange(this._setMessageData, this);
460
+
461
+ if (oBackendMessageToRemove && !bIsBackendMessage) {
462
+ /*Pending further investigation, along with the deletion of the backendEnd message,
463
+ we remove and reinsert all the other existing messages from the message manager to
464
+ make the highlight of the field on error persistent.*/
465
+ this._removeMessage(oBackendMessageToRemove);
466
+ }
467
+
468
+ return oTargetedControl;
469
+ };
470
+
471
+ _proto._checkControlIdInSections = function _checkControlIdInSections(aMessages, bEnableBinding) {
472
+ var section, aSubSections, message, i, j, k;
473
+ this.sGeneralGroupText = this.sGeneralGroupText ? this.sGeneralGroupText : sap.ui.getCore().getLibraryResourceBundle("sap.fe.core").getText("T_MESSAGE_BUTTON_SAPFE_MESSAGE_GROUP_GENERAL"); //Get all sections from the object page layout
474
+
475
+ var aVisibleSections = this.getVisibleSectionsFromObjectPageLayout(this.oObjectPageLayout);
476
+
477
+ if (aVisibleSections) {
478
+ var _oView$getBindingCont;
479
+
480
+ var viewId = this._getViewId(this.getId());
481
+
482
+ var oView = sap.ui.getCore().byId(viewId);
483
+ var sActionName = oView === null || oView === void 0 ? void 0 : (_oView$getBindingCont = oView.getBindingContext("internal")) === null || _oView$getBindingCont === void 0 ? void 0 : _oView$getBindingCont.getProperty("sActionName");
484
+
485
+ if (sActionName) {
486
+ (oView === null || oView === void 0 ? void 0 : oView.getBindingContext("internal")).setProperty("sActionName", null);
487
+ }
488
+
489
+ for (i = aMessages.length - 1; i >= 0; --i) {
490
+ // Loop over all messages
491
+ message = aMessages[i];
492
+ var bIsGeneralGroupName = true;
493
+
494
+ for (j = aVisibleSections.length - 1; j >= 0; --j) {
495
+ // Loop over all visible sections
496
+ section = aVisibleSections[j];
497
+ aSubSections = section.getSubSections();
498
+
499
+ for (k = aSubSections.length - 1; k >= 0; --k) {
500
+ // Loop over all sub-sections
501
+ var subSection = aSubSections[k];
502
+
503
+ var aControls = this._getControlFromMessageRelatingToSubSection(subSection, message);
504
+
505
+ if (aControls.length > 0) {
506
+ var oTargetedControl = this._computeMessageGroupAndSubTitle(message, section, subSection, aControls, aSubSections.length > 1, sActionName); // if we found table that matches with the message, we don't stop the loop
507
+ // in case we find an additional control (eg mdc field) that also match with the message
508
+
509
+
510
+ if (oTargetedControl && !oTargetedControl.isA("sap.m.Table") && !oTargetedControl.isA("sap.ui.table.Table")) {
511
+ j = k = -1;
512
+ }
513
+
514
+ bIsGeneralGroupName = false;
515
+ }
516
+ }
517
+ }
518
+
519
+ if (bIsGeneralGroupName) {
520
+ var oMessageObject = message.getBindingContext("message").getObject();
521
+ message.setActiveTitle(false);
522
+
523
+ if (oMessageObject.persistent && sActionName) {
524
+ this._setGroupLabelForTransientMsg(message, sActionName);
525
+ } else {
526
+ message.setGroupName(this.sGeneralGroupText);
527
+ }
528
+ }
529
+
530
+ if (!bEnableBinding && message.getGroupName() === this.sGeneralGroupText && this._findTargetForMessage(message)) {
531
+ return true;
532
+ }
533
+ }
534
+ }
535
+ };
536
+
537
+ _proto._findTargetForMessage = function _findTargetForMessage(message) {
538
+ var messageObject = message.getBindingContext("message") && message.getBindingContext("message").getObject();
539
+
540
+ if (messageObject && messageObject.target) {
541
+ var oMetaModel = this.oObjectPageLayout && this.oObjectPageLayout.getModel() && this.oObjectPageLayout.getModel().getMetaModel(),
542
+ contextPath = oMetaModel && oMetaModel.getMetaPath(messageObject.target),
543
+ oContextPathMetadata = oMetaModel && oMetaModel.getObject(contextPath);
544
+
545
+ if (oContextPathMetadata && oContextPathMetadata.$kind == "Property") {
546
+ return true;
547
+ }
548
+ }
549
+ };
550
+
551
+ _proto._fnEnableBindings = function _fnEnableBindings(aSections) {
552
+ if (UriParameters.fromQuery(window.location.search).get("sap-fe-xx-lazyloadingtest")) {
553
+ return;
554
+ }
555
+
556
+ for (var iSection = 0; iSection < aSections.length; iSection++) {
557
+ var oSection = aSections[iSection];
558
+ var nonTableChartcontrolFound = false;
559
+ var aSubSections = oSection.getSubSections();
560
+
561
+ for (var iSubSection = 0; iSubSection < aSubSections.length; iSubSection++) {
562
+ var oSubSection = aSubSections[iSubSection];
563
+ var oAllBlocks = oSubSection.getBlocks();
564
+
565
+ if (oAllBlocks) {
566
+ for (var block = 0; block < oSubSection.getBlocks().length; block++) {
567
+ if (oAllBlocks[block].getContent && !oAllBlocks[block].getContent().isA("sap.fe.macros.TableAPI")) {
568
+ nonTableChartcontrolFound = true;
569
+ break;
570
+ }
571
+ }
572
+
573
+ if (nonTableChartcontrolFound) {
574
+ oSubSection.setBindingContext(undefined);
575
+ }
576
+ }
577
+
578
+ if (oSubSection.getBindingContext() && this._findMessageGroupAfterRebinding()) {
579
+ oSubSection.getBindingContext().getBinding().attachDataReceived(this._findMessageGroupAfterRebinding());
580
+ }
581
+ }
582
+ }
583
+ };
584
+
585
+ _proto._findMessageGroupAfterRebinding = function _findMessageGroupAfterRebinding() {
586
+ var aMessages = this.oMessagePopover.getItems();
587
+
588
+ this._checkControlIdInSections(aMessages, true);
589
+ }
590
+ /**
591
+ * The method that retrieves the view ID (HTMLView/XMLView/JSONview/JSView/Templateview) of any control.
592
+ *
593
+ * @param {string} sControlId ID of the control needed to retrieve the view ID
594
+ * @returns {string} The view ID of the control
595
+ */
596
+ ;
597
+
598
+ _proto._getViewId = function _getViewId(sControlId) {
599
+ var sViewId,
600
+ oControl = sap.ui.getCore().byId(sControlId);
601
+
602
+ while (oControl) {
603
+ if (oControl instanceof View) {
604
+ sViewId = oControl.getId();
605
+ break;
606
+ }
607
+
608
+ oControl = oControl.getParent();
609
+ }
610
+
611
+ return sViewId;
612
+ };
613
+
614
+ _proto._setLongtextUrlDescription = function _setLongtextUrlDescription(sMessageDescriptionContent, oDiagnosisTitle) {
615
+ this.oMessagePopover.setAsyncDescriptionHandler(function (config) {
616
+ // This stores the old description
617
+ var sOldDescription = sMessageDescriptionContent; // Here we can fetch the data and concatenate it to the old one
618
+ // By default, the longtextUrl fetching will overwrite the description (with the default behaviour)
619
+ // Here as we have overwritten the default async handler, which fetches and replaces the description of the item
620
+ // we can manually modify it to include whatever needed.
621
+
622
+ var sLongTextUrl = config.item.getLongtextUrl();
623
+
624
+ if (sLongTextUrl) {
625
+ jQuery.ajax({
626
+ type: "GET",
627
+ url: sLongTextUrl,
628
+ success: function (data) {
629
+ var sDiagnosisText = oDiagnosisTitle.getHtmlText() + data;
630
+ config.item.setDescription(sOldDescription + "" + sDiagnosisText);
631
+ config.promise.resolve();
632
+ },
633
+ error: function () {
634
+ config.item.setDescription(sMessageDescriptionContent);
635
+ var sError = "A request has failed for long text data. URL: " + sLongTextUrl;
636
+ Log.error(sError);
637
+ config.promise.reject(sError);
638
+ }
639
+ });
640
+ }
641
+ });
642
+ };
643
+
644
+ _proto._formatMessageDescription = function _formatMessageDescription(message, oTableRowContext, sTableTargetColName, oResourceBundle, oTable) {
645
+ var sTableFirstColProperty = this._getTableFirstColProperty(oTable);
646
+
647
+ var sColumnInfo = "";
648
+
649
+ var oColFromTableSettings = this._fetchColumnInfo(message, oTable);
650
+
651
+ if (sTableTargetColName) {
652
+ // if column in present in table definition
653
+ sColumnInfo = oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_COLUMN") + ": " + sTableTargetColName;
654
+ } else if (oColFromTableSettings) {
655
+ if (oColFromTableSettings.availability === "Hidden") {
656
+ // if column in neither in table definition nor personalization
657
+ if (message.getType() === "Error") {
658
+ sColumnInfo = oResourceBundle.getText("T_COLUMN_AVAILABLE_DIAGNOSIS_MSGDESC_ERROR") + " " + oTableRowContext.getValue(sTableFirstColProperty);
659
+ } else {
660
+ sColumnInfo = oResourceBundle.getText("T_COLUMN_AVAILABLE_DIAGNOSIS_MSGDESC") + " " + oTableRowContext.getValue(sTableFirstColProperty);
661
+ }
662
+ } else {
663
+ // if column is not in table definition but in personalization
664
+ sColumnInfo = oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_COLUMN") + ": " + oColFromTableSettings.label + " (" + oResourceBundle.getText("T_COLUMN_INDICATOR_IN_TABLE_DEFINITION") + ")";
665
+ }
666
+ }
667
+
668
+ var oFieldsAffectedTitle = new FormattedText({
669
+ htmlText: "<html><body><strong>" + oResourceBundle.getText("T_FIELDS_AFFECTED_TITLE") + "</strong></body></html><br>"
670
+ });
671
+ var sFieldAffectedText = oFieldsAffectedTitle.getHtmlText() + "<br>" + oResourceBundle.getText("T_MESSAGE_GROUP_TITLE_TABLE_DENOMINATOR") + ": " + oTable.getHeader() + "<br>" + oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_ROW") + ": " + oTableRowContext.getValue(sTableFirstColProperty) + "<br>" + sColumnInfo + "<br>";
672
+ var oDiagnosisTitle = new FormattedText({
673
+ htmlText: "<html><body><strong>" + oResourceBundle.getText("T_DIAGNOSIS_TITLE") + "</strong></body></html><br>"
674
+ }); // get the UI messages from the message context to set it to Diagnosis section
675
+
676
+ var sUIMessageDescription = message.getBindingContext("message").getObject().description; //set the description to null to reset it below
677
+
678
+ message.setDescription(null);
679
+ var sDiagnosisText = "";
680
+ var sMessageDescriptionContent = "";
681
+
682
+ if (message.getLongtextUrl()) {
683
+ sMessageDescriptionContent = sFieldAffectedText + "<br>";
684
+
685
+ this._setLongtextUrlDescription(sMessageDescriptionContent, oDiagnosisTitle);
686
+ } else if (sUIMessageDescription) {
687
+ sDiagnosisText = oDiagnosisTitle.getHtmlText() + "<br>" + sUIMessageDescription;
688
+ sMessageDescriptionContent = sFieldAffectedText + "<br>" + sDiagnosisText;
689
+ message.setDescription(sMessageDescriptionContent);
690
+ } else {
691
+ message.setDescription(sFieldAffectedText);
692
+ }
693
+ }
694
+ /**
695
+ * Method to set the button text, count and icon property based upon the message items
696
+ * ButtonType: Possible settings for warning and error messages are 'critical' and 'negative'.
697
+ *
698
+ *
699
+ * @private
700
+ */
701
+ ;
702
+
703
+ _proto._setMessageData = function _setMessageData() {
704
+ clearTimeout(this._setMessageDataTimeout);
705
+ var that = this;
706
+ this._setMessageDataTimeout = setTimeout(function () {
707
+ var sIcon = "",
708
+ oMessages = that.oMessagePopover.getItems(),
709
+ oMessageCount = {
710
+ Error: 0,
711
+ Warning: 0,
712
+ Success: 0,
713
+ Information: 0
714
+ },
715
+ oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
716
+ iMessageLength = oMessages.length;
717
+ var sButtonType = ButtonType.Default,
718
+ sMessageKey = "",
719
+ sTooltipText = "",
720
+ sMessageText = "";
721
+
722
+ if (iMessageLength > 0) {
723
+ for (var i = 0; i < iMessageLength; i++) {
724
+ if (!oMessages[i].getType() || oMessages[i].getType() == "") {
725
+ ++oMessageCount["Information"];
726
+ } else {
727
+ ++oMessageCount[oMessages[i].getType()];
728
+ }
729
+ }
730
+
731
+ if (oMessageCount[MessageType.Error] > 0) {
732
+ sButtonType = ButtonType.Negative;
733
+ } else if (oMessageCount[MessageType.Warning] > 0) {
734
+ sButtonType = ButtonType.Critical;
735
+ } else if (oMessageCount[MessageType.Success] > 0) {
736
+ sButtonType = ButtonType.Success;
737
+ } else if (oMessageCount[MessageType.Information] > 0) {
738
+ sButtonType = ButtonType.Neutral;
739
+ }
740
+
741
+ if (oMessageCount.Error > 0) {
742
+ that.setText(oMessageCount.Error);
743
+ } else {
744
+ that.setText("");
745
+ }
746
+
747
+ if (oMessageCount.Error === 1) {
748
+ sMessageKey = "C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR";
749
+ } else if (oMessageCount.Error > 1) {
750
+ sMessageKey = "C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_MULTIPLE_ERROR_TOOLTIP";
751
+ } else if (!oMessageCount.Error && oMessageCount.Warning) {
752
+ sMessageKey = "C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_WARNING_TOOLTIP";
753
+ } else if (!oMessageCount.Error && !oMessageCount.Warning && oMessageCount.Information) {
754
+ sMessageKey = "C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_INFO";
755
+ } else if (!oMessageCount.Error && !oMessageCount.Warning && !oMessageCount.Information && oMessageCount.Success) {
756
+ sMessageKey = "C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_SUCCESS";
757
+ }
758
+
759
+ if (sMessageKey) {
760
+ sMessageText = oResourceBundle.getText(sMessageKey);
761
+ sTooltipText = oMessageCount.Error ? oMessageCount.Error + " " + sMessageText : sMessageText;
762
+ that.setTooltip(sTooltipText);
763
+ }
764
+
765
+ that.setIcon(sIcon);
766
+ that.setType(sButtonType);
767
+ that.setVisible(true);
768
+ var oView = sap.ui.getCore().byId(that.sViewId);
769
+
770
+ if (oView) {
771
+ var oPageReady = oView.getController().pageReady;
772
+ oPageReady.waitPageReady().then(function () {
773
+ return that._applyGroupingAsync(oView);
774
+ }).finally(function () {
775
+ that.fireMessageChange({
776
+ iMessageLength: iMessageLength
777
+ });
778
+ }).catch(function () {
779
+ Log.error("fail grouping messages");
780
+ });
781
+ }
782
+
783
+ if (iMessageLength > 1) {
784
+ that.oMessagePopover.navigateBack();
785
+ }
786
+ } else {
787
+ that.setVisible(false);
788
+ that.fireMessageChange({
789
+ iMessageLength: iMessageLength
790
+ });
791
+ }
792
+ }, 100);
793
+ };
794
+
795
+ _proto._bIsOrphanElement = function _bIsOrphanElement(oElement, aElements) {
796
+ return !aElements.some(function (oElement, oElem) {
797
+ var oParentElement = oElement.getParent();
798
+
799
+ while (oParentElement && oParentElement !== oElem) {
800
+ oParentElement = oParentElement.getParent();
801
+ }
802
+
803
+ return oParentElement ? true : false;
804
+ }.bind(this, oElement));
805
+ }
806
+ /**
807
+ * The method that is called when a user clicks on the title of the message.
808
+ *
809
+ * @function
810
+ * @name _activeTitlePress
811
+ * @private
812
+ * @param {Event} oEvent Event object passed from the handler
813
+ */
814
+ ;
815
+
816
+ _proto._activeTitlePress = function _activeTitlePress(oEvent) {
817
+ var that = this;
818
+ var oInternalModelContext = this.getBindingContext("pageInternal");
819
+ oInternalModelContext.setProperty("errorNavigationSectionFlag", true);
820
+ var oItem = oEvent.getParameter("item"),
821
+ oMessage = oItem.getBindingContext("message").getObject(),
822
+ bIsBackendMessage = new RegExp("^/").test(oMessage.getTarget()),
823
+ oView = sap.ui.getCore().byId(this.sViewId),
824
+ oMessagePopover = this.oMessagePopover;
825
+ var oControl, sSectionTitle;
826
+
827
+ if (oMessagePopover && oMessagePopover.isOpen()) {
828
+ oMessagePopover.close();
829
+ }
830
+
831
+ var _focusOnMessageTargetControl = function (oMessage, oTargetMdcTable, iRowIndex) {
832
+ var aAllViewElements = oView.findElements(true);
833
+ var aErroneousControls = oMessage.getControlIds().filter(function (sControlId) {
834
+ return aAllViewElements.some(function (oElem) {
835
+ return oElem.getId() === sControlId;
836
+ });
837
+ }).map(function (sControlId) {
838
+ return sap.ui.getCore().byId(sControlId);
839
+ });
840
+ var aNotTableErroneousControls = aErroneousControls.filter(function (oElem) {
841
+ return !oElem.isA("sap.m.Table") && !oElem.isA("sap.ui.table.Table");
842
+ }); //The focus is set on Not Table control in priority
843
+
844
+ if (aNotTableErroneousControls.length > 0) {
845
+ aNotTableErroneousControls[0].focus();
846
+ } else if (aErroneousControls.length > 0) {
847
+ aErroneousControls[0].focus();
848
+ var aTargetMdcTableRow = oTargetMdcTable ? oTargetMdcTable.findElements(true, function (oElem) {
849
+ return oElem.isA("sap.m.ColumnListItem");
850
+ }) : [];
851
+
852
+ if (aTargetMdcTableRow.length > 0 && aTargetMdcTableRow[0]) {
853
+ var oTargetRow = aTargetMdcTableRow[iRowIndex];
854
+
855
+ var oTargetCell = _getTargetCell(oTargetRow, oMessage);
856
+
857
+ if (oTargetCell) {
858
+ var oTargetField = oTargetCell.isA("sap.fe.macros.FieldAPI") ? oTargetCell.getContent().getContentEdit()[0] : oTargetCell.getItems()[0].getContent().getContentEdit()[0];
859
+ oTargetField.focus();
860
+ } else {
861
+ // control not found on table
862
+ var errorProperty = oMessage.getTarget().split("/").pop();
863
+
864
+ if (errorProperty) {
865
+ oView.getModel("internal").setProperty("/messageTargetProperty", errorProperty);
866
+ }
867
+
868
+ oView.getController()._routing.navigateForwardToContext(oTargetRow.getBindingContext());
869
+ }
870
+ }
871
+ }
872
+ };
873
+
874
+ function _getTargetCell(oTargetRow, oMessage) {
875
+ var oTargetCell = oMessage.controlIds.map(function (sControlId) {
876
+ var isControlInTable = oTargetRow.findElements(true, function (oElem) {
877
+ return oElem.getId() === sControlId;
878
+ });
879
+ return isControlInTable.length > 0 ? sap.ui.getCore().byId(sControlId) : null;
880
+ }).reduce(function (acc, val) {
881
+ return val ? val : acc;
882
+ });
883
+ return oTargetCell;
884
+ } //check if the pressed item is related to a table control
885
+
886
+
887
+ if (oItem.getGroupName().indexOf("Table:") !== -1) {
888
+ var oTargetMdcTable;
889
+
890
+ if (bIsBackendMessage) {
891
+ oTargetMdcTable = oMessage.controlIds.map(function (sControlId) {
892
+ var oControl = sap.ui.getCore().byId(sControlId);
893
+ var oParentControl = oControl && oControl.getParent();
894
+ return oParentControl && oParentControl.isA("sap.ui.mdc.Table") && oParentControl.getHeader() === oItem.getGroupName().split(", Table: ")[1] ? oParentControl : null;
895
+ }).reduce(function (acc, val) {
896
+ return val ? val : acc;
897
+ });
898
+
899
+ if (oTargetMdcTable) {
900
+ sSectionTitle = oItem.getGroupName().split(", ")[0];
901
+
902
+ this._navigateFromMessageToSectionTableInIconTabBarMode(oTargetMdcTable, this.oObjectPageLayout, sSectionTitle).then(function () {
903
+ var oRefErrorContext = that._getTableRefErrorContext(oTargetMdcTable);
904
+
905
+ var oRefError = oRefErrorContext.getProperty(oItem.getBindingContext("message").getObject().getId());
906
+
907
+ var _setFocusOnTargetField = function (oTargetMdcTable, iRowIndex) {
908
+ var aTargetMdcTableRow = that._getMdcTableRows(oTargetMdcTable),
909
+ iFirstVisibleRow = that._getGridTable(oTargetMdcTable).getFirstVisibleRow();
910
+
911
+ if (aTargetMdcTableRow.length > 0 && aTargetMdcTableRow[0]) {
912
+ var oTargetRow = aTargetMdcTableRow[iRowIndex - iFirstVisibleRow],
913
+ oTargetCell = _getTargetCell(oTargetRow, oMessage);
914
+
915
+ if (oTargetCell) {
916
+ oTargetCell.focus();
917
+ } else {
918
+ // control not found on table
919
+ var errorProperty = oMessage.getTarget().split("/").pop();
920
+
921
+ if (errorProperty) {
922
+ oView.getModel("internal").setProperty("/messageTargetProperty", errorProperty);
923
+ }
924
+
925
+ oView.getController()._routing.navigateForwardToContext(oTargetRow.getBindingContext());
926
+ }
927
+
928
+ return {
929
+ targetRow: oTargetRow,
930
+ targetCell: oTargetCell
931
+ };
932
+ }
933
+
934
+ return {
935
+ targetRow: null,
936
+ targetCell: null
937
+ };
938
+ };
939
+
940
+ if (oTargetMdcTable.data("tableType") === "GridTable" && oRefError.rowIndex !== "") {
941
+ var iFirstVisibleRow = that._getGridTable(oTargetMdcTable).getFirstVisibleRow();
942
+
943
+ oTargetMdcTable.scrollToIndex(oRefError.rowIndex).then(function () {
944
+ var aTargetMdcTableRow = that._getMdcTableRows(oTargetMdcTable);
945
+
946
+ var iNewFirstVisibleRow, bScrollNeeded;
947
+
948
+ if (aTargetMdcTableRow.length > 0 && aTargetMdcTableRow[0]) {
949
+ iNewFirstVisibleRow = aTargetMdcTableRow[0].getParent().getFirstVisibleRow();
950
+ bScrollNeeded = iFirstVisibleRow - iNewFirstVisibleRow !== 0;
951
+ }
952
+
953
+ if (bScrollNeeded) {
954
+ //The scrollToIndex function does not wait for the UI update. As a workdaround, pending a fix from MDC (BCP: 2170251631) we use the event "UIUpdated".
955
+ var oWaitControlIdAdded = new Promise(function (resolve) {
956
+ sap.ui.getCore().attachEvent("UIUpdated", resolve);
957
+ });
958
+ return oWaitControlIdAdded;
959
+ }
960
+
961
+ return null;
962
+ }).then(function () {
963
+ setTimeout(function () {
964
+ _setFocusOnTargetField(oTargetMdcTable, oRefError.rowIndex);
965
+ }, 0);
966
+ }).catch(function () {
967
+ Log.error("Error while focusing on error");
968
+ });
969
+ } else if (oTargetMdcTable.data("tableType") === "ResponsiveTable" && oRefError) {
970
+ _focusOnMessageTargetControl(oMessage, oTargetMdcTable, oRefError.rowIndex);
971
+ } else {
972
+ _focusOnMessageTargetControl(oMessage);
973
+ }
974
+ }).catch(function () {
975
+ Log.error("Fail to navigate to Error control");
976
+ });
977
+ }
978
+ } else {
979
+ var _oControl;
980
+
981
+ oControl = sap.ui.getCore().byId(oMessage.controlIds[0]); //If the control underlying the frontEnd message is not within the current section, we first go into the target section:
982
+
983
+ var oSelectedSection = sap.ui.getCore().byId(this.oObjectPageLayout.getSelectedSection());
984
+
985
+ if ((oSelectedSection === null || oSelectedSection === void 0 ? void 0 : oSelectedSection.findElements(true).indexOf(oControl)) === -1) {
986
+ sSectionTitle = oItem.getGroupName().split(", ")[0];
987
+
988
+ this._navigateFromMessageToSectionInIconTabBarMode(this.oObjectPageLayout, sSectionTitle);
989
+ }
990
+
991
+ (_oControl = oControl) === null || _oControl === void 0 ? void 0 : _oControl.focus();
992
+ }
993
+ } else {
994
+ // focus on control
995
+ sSectionTitle = oItem.getGroupName().split(", ")[0];
996
+
997
+ this._navigateFromMessageToSectionInIconTabBarMode(this.oObjectPageLayout, sSectionTitle);
998
+
999
+ _focusOnMessageTargetControl(oMessage);
1000
+ }
1001
+ };
1002
+
1003
+ _proto._getTableColInfo = function _getTableColInfo(oTable, sTableTargetColProperty) {
1004
+ var sTableTargetColName;
1005
+ var oTableTargetCol = oTable.getColumns().find(function (sTableTargetColProperty, column) {
1006
+ return column.getDataProperty() === sTableTargetColProperty;
1007
+ }.bind(this, sTableTargetColProperty));
1008
+
1009
+ if (!oTableTargetCol) {
1010
+ /* If the target column is not found, we check for a custom column */
1011
+ var oCustomColumn = oTable.getControlDelegate().getColumnsFor(oTable).find(function (oColumn) {
1012
+ if (!!oColumn.template && oColumn.propertyInfos) {
1013
+ return oColumn.propertyInfos[0] === sTableTargetColProperty || oColumn.propertyInfos[0].replace("Property::", "") === sTableTargetColProperty;
1014
+ } else {
1015
+ return false;
1016
+ }
1017
+ });
1018
+
1019
+ if (oCustomColumn) {
1020
+ oTableTargetCol = oCustomColumn;
1021
+ sTableTargetColProperty = oTableTargetCol.name;
1022
+ sTableTargetColName = oTable.getColumns().find(function (oColumn) {
1023
+ return sTableTargetColProperty === oColumn.getDataProperty();
1024
+ }).getHeader();
1025
+ } else {
1026
+ /* If the target column is not found, we check for a field group */
1027
+ var aColumns = oTable.getControlDelegate().getColumnsFor(oTable);
1028
+ oTableTargetCol = aColumns.find(function (aColumns, sTableTargetColProperty, oColumn) {
1029
+ if (oColumn.key.indexOf("::FieldGroup::") !== -1) {
1030
+ return oColumn.propertyInfos.find(function () {
1031
+ return aColumns.find(function (oColumn) {
1032
+ return oColumn.relativePath === sTableTargetColProperty;
1033
+ });
1034
+ });
1035
+ }
1036
+ }.bind(this, aColumns, sTableTargetColProperty));
1037
+ /* check if the column with the field group is visible in the table: */
1038
+
1039
+ var bIsTableTargetColVisible = false;
1040
+
1041
+ if (oTableTargetCol && oTableTargetCol.label) {
1042
+ bIsTableTargetColVisible = oTable.getColumns().some(function (column) {
1043
+ return column.getHeader() === oTableTargetCol.label;
1044
+ });
1045
+ }
1046
+
1047
+ sTableTargetColName = bIsTableTargetColVisible && oTableTargetCol.label;
1048
+ sTableTargetColProperty = bIsTableTargetColVisible && oTableTargetCol.key;
1049
+ }
1050
+ } else {
1051
+ sTableTargetColName = oTableTargetCol && oTableTargetCol.getHeader();
1052
+ }
1053
+
1054
+ return {
1055
+ sTableTargetColName: sTableTargetColName,
1056
+ sTableTargetColProperty: sTableTargetColProperty
1057
+ };
1058
+ }
1059
+ /**
1060
+ *
1061
+ * @param {object} obj The message object
1062
+ * @param {Array} aSections The array of sections in the object page
1063
+ *
1064
+ * @returns {number} The rank of the message
1065
+ */
1066
+ ;
1067
+
1068
+ _proto._getMessageRank = function _getMessageRank(obj, aSections) {
1069
+ if (aSections) {
1070
+ var section, aSubSections, subSection, j, k, aElements, aAllElements, sectionRank;
1071
+
1072
+ for (j = aSections.length - 1; j >= 0; --j) {
1073
+ // Loop over all sections
1074
+ section = aSections[j];
1075
+ aSubSections = section.getSubSections();
1076
+
1077
+ for (k = aSubSections.length - 1; k >= 0; --k) {
1078
+ // Loop over all sub-sections
1079
+ subSection = aSubSections[k];
1080
+ aAllElements = subSection.findElements(true); // Get all elements inside a sub-section
1081
+ //Try to find the control 1 inside the sub section
1082
+
1083
+ aElements = aAllElements.filter(this._fnFilterUponId.bind(this, obj.getControlId()));
1084
+ sectionRank = j + 1;
1085
+
1086
+ if (aElements.length > 0) {
1087
+ obj.sectionName = section.getTitle();
1088
+ obj.subSectionName = subSection.getTitle();
1089
+ return sectionRank * 10 + (k + 1);
1090
+ }
1091
+ }
1092
+ } //if sub section title is Other messages, we return a high number(rank), which ensures
1093
+ //that messages belonging to this sub section always come later in messagePopover
1094
+
1095
+
1096
+ if (!obj.sectionName && !obj.subSectionName && obj.persistent) {
1097
+ return 1;
1098
+ }
1099
+
1100
+ return 999;
1101
+ }
1102
+
1103
+ return 999;
1104
+ }
1105
+ /**
1106
+ * Method to set the filters based upon the message items
1107
+ * The desired filter operation is:
1108
+ * ( filters provided by user && ( validation = true && Control should be present in view ) || messages for the current matching context ).
1109
+ *
1110
+ * @private
1111
+ */
1112
+ ;
1113
+
1114
+ _proto._applyFiltersAndSort = function _applyFiltersAndSort() {
1115
+ var oValidationFilters,
1116
+ oValidationAndContextFilter,
1117
+ oFilters,
1118
+ sPath,
1119
+ oSorter,
1120
+ oDialogFilter,
1121
+ objectPageLayoutSections = null;
1122
+ var aUserDefinedFilter = [];
1123
+
1124
+ function filterOutMessagesInDialog() {
1125
+ var fnTest = function (aControlIds) {
1126
+ var index = Infinity,
1127
+ oControl = sap.ui.getCore().byId(aControlIds[0]);
1128
+ var errorFieldControl = sap.ui.getCore().byId(aControlIds[0]);
1129
+
1130
+ while (oControl) {
1131
+ var fieldRankinDialog = oControl instanceof Dialog ? (errorFieldControl === null || errorFieldControl === void 0 ? void 0 : errorFieldControl.getParent()).findElements(true).indexOf(errorFieldControl) : Infinity;
1132
+
1133
+ if (oControl instanceof Dialog) {
1134
+ if (index > fieldRankinDialog) {
1135
+ index = fieldRankinDialog; // Set the focus to the dialog's control
1136
+
1137
+ errorFieldControl === null || errorFieldControl === void 0 ? void 0 : errorFieldControl.focus();
1138
+ } // messages for sap.m.Dialog should not appear in the message button
1139
+
1140
+
1141
+ return false;
1142
+ }
1143
+
1144
+ oControl = oControl.getParent();
1145
+ }
1146
+
1147
+ return true;
1148
+ };
1149
+
1150
+ return new Filter({
1151
+ path: "controlIds",
1152
+ test: fnTest,
1153
+ caseSensitive: true
1154
+ });
1155
+ } //Filter function to verify if the control is part of the current view or not
1156
+
1157
+
1158
+ function getCheckControlInViewFilter() {
1159
+ var fnTest = function (aControlIds) {
1160
+ if (!aControlIds.length) {
1161
+ return false;
1162
+ }
1163
+
1164
+ var oControl = sap.ui.getCore().byId(aControlIds[0]);
1165
+
1166
+ while (oControl) {
1167
+ if (oControl.getId() === sViewId) {
1168
+ return true;
1169
+ }
1170
+
1171
+ if (oControl instanceof Dialog) {
1172
+ // messages for sap.m.Dialog should not appear in the message button
1173
+ return false;
1174
+ }
1175
+
1176
+ oControl = oControl.getParent();
1177
+ }
1178
+
1179
+ return false;
1180
+ };
1181
+
1182
+ return new Filter({
1183
+ path: "controlIds",
1184
+ test: fnTest,
1185
+ caseSensitive: true
1186
+ });
1187
+ }
1188
+
1189
+ if (!this.sViewId) {
1190
+ this.sViewId = this._getViewId(this.getId());
1191
+ }
1192
+
1193
+ var sViewId = this.sViewId; //Add the filters provided by the user
1194
+
1195
+ var aCustomFilters = this.getAggregation("customFilters");
1196
+
1197
+ if (aCustomFilters) {
1198
+ aCustomFilters.forEach(function (filter) {
1199
+ aUserDefinedFilter.push(new Filter({
1200
+ path: filter.getProperty("path"),
1201
+ operator: filter.getProperty("operator"),
1202
+ value1: filter.getProperty("value1"),
1203
+ value2: filter.getProperty("value2")
1204
+ }));
1205
+ });
1206
+ }
1207
+
1208
+ var oBindingContext = this.getBindingContext();
1209
+
1210
+ if (!oBindingContext) {
1211
+ this.setVisible(false);
1212
+ return;
1213
+ } else {
1214
+ sPath = oBindingContext.getPath(); //Filter for filtering out only validation messages which are currently present in the view
1215
+
1216
+ oValidationFilters = new Filter({
1217
+ filters: [new Filter({
1218
+ path: "validation",
1219
+ operator: FilterOperator.EQ,
1220
+ value1: true
1221
+ }), getCheckControlInViewFilter()],
1222
+ and: true
1223
+ }); //Filter for filtering out the bound messages i.e target starts with the context path
1224
+
1225
+ oValidationAndContextFilter = new Filter({
1226
+ filters: [oValidationFilters, new Filter({
1227
+ path: "target",
1228
+ operator: FilterOperator.StartsWith,
1229
+ value1: sPath
1230
+ })],
1231
+ and: false
1232
+ });
1233
+ oDialogFilter = new Filter({
1234
+ filters: [filterOutMessagesInDialog()]
1235
+ });
1236
+ }
1237
+
1238
+ var oValidationContextDialogFilters = new Filter({
1239
+ filters: [oValidationAndContextFilter, oDialogFilter],
1240
+ and: true
1241
+ }); // and finally - if there any - add custom filter (via OR)
1242
+
1243
+ if (aUserDefinedFilter.length > 0) {
1244
+ oFilters = new Filter({
1245
+ filters: [aUserDefinedFilter, oValidationContextDialogFilters],
1246
+ and: false
1247
+ });
1248
+ } else {
1249
+ oFilters = oValidationContextDialogFilters;
1250
+ }
1251
+
1252
+ this.oItemBinding.filter(oFilters);
1253
+ this.oObjectPageLayout = this._getObjectPageLayout(this, this.oObjectPageLayout); // We support sorting only for ObjectPageLayout use-case.
1254
+
1255
+ if (this.oObjectPageLayout) {
1256
+ var that = this;
1257
+ oSorter = new Sorter("", null, null, function (obj1, obj2) {
1258
+ if (!objectPageLayoutSections) {
1259
+ objectPageLayoutSections = that.oObjectPageLayout && that.oObjectPageLayout.getSections();
1260
+ }
1261
+
1262
+ var rankA = that._getMessageRank(obj1, objectPageLayoutSections);
1263
+
1264
+ var rankB = that._getMessageRank(obj2, objectPageLayoutSections);
1265
+
1266
+ if (rankA < rankB) {
1267
+ return -1;
1268
+ }
1269
+
1270
+ if (rankA > rankB) {
1271
+ return 1;
1272
+ }
1273
+
1274
+ return 0;
1275
+ });
1276
+ this.oItemBinding.sort(oSorter);
1277
+ }
1278
+ }
1279
+ /**
1280
+ *
1281
+ * @param {object} sControlId
1282
+ * @param {object} oItem
1283
+ *
1284
+ * @returns {boolean} True if the control ID matches the item ID
1285
+ */
1286
+ ;
1287
+
1288
+ _proto._fnFilterUponId = function _fnFilterUponId(sControlId, oItem) {
1289
+ return sControlId === oItem.getId();
1290
+ }
1291
+ /**
1292
+ *
1293
+ * @param {Array} aControlIds
1294
+ * @param {object} oItem
1295
+ *
1296
+ * @returns {boolean} True if matches the item ID matcheds with one of the controlIds
1297
+ */
1298
+ ;
1299
+
1300
+ _proto._fnFilterUponIds = function _fnFilterUponIds(aControlIds, oItem) {
1301
+ return aControlIds.some(function (sControlId) {
1302
+ if (sControlId === oItem.getId()) {
1303
+ return true;
1304
+ }
1305
+
1306
+ return false;
1307
+ });
1308
+ }
1309
+ /**
1310
+ * Retrieves the section based on section title and visibility.
1311
+ *
1312
+ * @param {object} oObjectPage Object page.
1313
+ * @param {string} sSectionTitle Section title.
1314
+ * @returns {object}
1315
+ * @private
1316
+ * @ignore
1317
+ */
1318
+ ;
1319
+
1320
+ _proto._getSectionBySectionTitle = function _getSectionBySectionTitle(oObjectPage, sSectionTitle) {
1321
+ if (sSectionTitle) {
1322
+ var aSections = oObjectPage.getSections();
1323
+ var oSection;
1324
+
1325
+ for (var i = 0; i < aSections.length; i++) {
1326
+ if (aSections[i].getVisible() && aSections[i].getTitle() === sSectionTitle) {
1327
+ oSection = aSections[i];
1328
+ break;
1329
+ }
1330
+ }
1331
+
1332
+ return oSection;
1333
+ }
1334
+ }
1335
+ /**
1336
+ * Navigates to the section if the object page uses an IconTabBar and if the current section is not the target of the navigation.
1337
+ *
1338
+ * @param {object} oObjectPage Object page.
1339
+ * @param {string} sSectionTitle Section title.
1340
+ * @private
1341
+ * @ignore
1342
+ */
1343
+ ;
1344
+
1345
+ _proto._navigateFromMessageToSectionInIconTabBarMode = function _navigateFromMessageToSectionInIconTabBarMode(oObjectPage, sSectionTitle) {
1346
+ var bUseIconTabBar = oObjectPage.getUseIconTabBar();
1347
+
1348
+ if (bUseIconTabBar) {
1349
+ var oSection = this._getSectionBySectionTitle(oObjectPage, sSectionTitle);
1350
+
1351
+ var sSelectedSectionId = oObjectPage.getSelectedSection();
1352
+
1353
+ if (oSection && sSelectedSectionId !== oSection.getId()) {
1354
+ oObjectPage.setSelectedSection(oSection.getId());
1355
+ }
1356
+ }
1357
+ };
1358
+
1359
+ _proto._navigateFromMessageToSectionTableInIconTabBarMode = function _navigateFromMessageToSectionTableInIconTabBarMode(oTable, oObjectPage, sSectionTitle) {
1360
+ var oRowBinding = oTable.getRowBinding();
1361
+ var oTableContext = oTable.getBindingContext();
1362
+ var oOPContext = oObjectPage.getBindingContext();
1363
+ var bShouldWaitForTableRefresh = !(oTableContext === oOPContext);
1364
+
1365
+ this._navigateFromMessageToSectionInIconTabBarMode(oObjectPage, sSectionTitle);
1366
+
1367
+ return new Promise(function (resolve) {
1368
+ if (bShouldWaitForTableRefresh) {
1369
+ oRowBinding.attachEventOnce("change", function () {
1370
+ resolve();
1371
+ });
1372
+ } else {
1373
+ resolve();
1374
+ }
1375
+ });
1376
+ }
1377
+ /**
1378
+ * Retrieves the MDC table if it is found among any of the parent elements.
1379
+ *
1380
+ * @param {object} oElement Control
1381
+ * @returns {object} MDC table || undefined
1382
+ * @private
1383
+ * @ignore
1384
+ */
1385
+ ;
1386
+
1387
+ _proto._getMdcTable = function _getMdcTable(oElement) {
1388
+ //check if the element has a table within any of its parents
1389
+ var oParentElement = oElement.getParent();
1390
+
1391
+ while (oParentElement && !oParentElement.isA("sap.ui.mdc.Table")) {
1392
+ oParentElement = oParentElement.getParent();
1393
+ }
1394
+
1395
+ var oMdcTable = oParentElement && oParentElement.isA("sap.ui.mdc.Table") ? oParentElement : undefined;
1396
+ return oMdcTable;
1397
+ };
1398
+
1399
+ _proto._getGridTable = function _getGridTable(oMdcTable) {
1400
+ return oMdcTable.findElements(true, function (oElem) {
1401
+ return oElem.isA("sap.ui.table.Table") &&
1402
+ /** We check the element belongs to the Mdc Table :*/
1403
+ oElem.getParent() === oMdcTable;
1404
+ })[0];
1405
+ }
1406
+ /**
1407
+ * Retrieves the table row (if available) containing the element.
1408
+ *
1409
+ * @param {object} oElement Control
1410
+ * @returns {object} Table row || undefined
1411
+ * @private
1412
+ * @ignore
1413
+ */
1414
+ ;
1415
+
1416
+ _proto._getTableRow = function _getTableRow(oElement) {
1417
+ var oParentElement = oElement.getParent();
1418
+
1419
+ while (oParentElement && !oParentElement.isA("sap.ui.table.Row") && !oParentElement.isA("sap.ui.table.CreationRow") && !oParentElement.isA("sap.m.ColumnListItem")) {
1420
+ oParentElement = oParentElement.getParent();
1421
+ }
1422
+
1423
+ var oTableRow = oParentElement && (oParentElement.isA("sap.ui.table.Row") || oParentElement.isA("sap.ui.table.CreationRow") || oParentElement.isA("sap.m.ColumnListItem")) ? oParentElement : undefined;
1424
+ return oTableRow;
1425
+ }
1426
+ /**
1427
+ * Retrieves the index of the table row containing the element.
1428
+ *
1429
+ * @param {object} oElement Control
1430
+ * @returns {object} Row index || undefined
1431
+ * @private
1432
+ * @ignore
1433
+ */
1434
+ ;
1435
+
1436
+ _proto._getTableRowIndex = function _getTableRowIndex(oElement) {
1437
+ var oTableRow = this._getTableRow(oElement);
1438
+
1439
+ var iRowIndex;
1440
+
1441
+ if (oTableRow.isA("sap.ui.table.Row")) {
1442
+ iRowIndex = oTableRow.getIndex();
1443
+ } else {
1444
+ iRowIndex = oTableRow.getTable().getItems().findIndex(function (element) {
1445
+ return element.getId() === oTableRow.getId();
1446
+ });
1447
+ }
1448
+
1449
+ return iRowIndex;
1450
+ }
1451
+ /**
1452
+ * Retrieves the index of the table column containing the element.
1453
+ *
1454
+ * @param {object} oElement Control
1455
+ * @returns {object} Column index || undefined
1456
+ * @private
1457
+ * @ignore
1458
+ */
1459
+ ;
1460
+
1461
+ _proto._getTableColumnIndex = function _getTableColumnIndex(oElement) {
1462
+ var getTargetCellIndex = function (oElement, oTargetRow) {
1463
+ return oTargetRow.getCells().findIndex(function (oCell) {
1464
+ return oCell.getId() === oElement.getId();
1465
+ });
1466
+ };
1467
+
1468
+ var getTargetColumnIndex = function (oElement, oTargetRow) {
1469
+ var oTargetElement = oElement.getParent(),
1470
+ iTargetCellIndex = getTargetCellIndex(oTargetElement, oTargetRow);
1471
+
1472
+ while (oTargetElement && iTargetCellIndex < 0) {
1473
+ oTargetElement = oTargetElement.getParent();
1474
+ iTargetCellIndex = getTargetCellIndex(oTargetElement, oTargetRow);
1475
+ }
1476
+
1477
+ return iTargetCellIndex;
1478
+ };
1479
+
1480
+ var oTargetRow = this._getTableRow(oElement);
1481
+
1482
+ var iTargetColumnIndex;
1483
+ iTargetColumnIndex = getTargetColumnIndex(oElement, oTargetRow);
1484
+
1485
+ if (oTargetRow.isA("sap.ui.table.CreationRow")) {
1486
+ var sTargetCellId = oTargetRow.getCells()[iTargetColumnIndex].getId(),
1487
+ aTableColumns = oTargetRow.getTable().getColumns();
1488
+ iTargetColumnIndex = aTableColumns.findIndex(function (column) {
1489
+ if (column.getCreationTemplate()) {
1490
+ return sTargetCellId.search(column.getCreationTemplate().getId()) > -1 ? true : false;
1491
+ } else {
1492
+ return false;
1493
+ }
1494
+ });
1495
+ }
1496
+
1497
+ return iTargetColumnIndex;
1498
+ };
1499
+
1500
+ _proto._getMdcTableRows = function _getMdcTableRows(oMdcTable) {
1501
+ return oMdcTable.findElements(true, function (oElem) {
1502
+ return oElem.isA("sap.ui.table.Row") &&
1503
+ /** We check the element belongs to the Mdc Table :*/
1504
+ oElem.getTable().getParent() === oMdcTable;
1505
+ });
1506
+ };
1507
+
1508
+ _proto._getTableColProperty = function _getTableColProperty(oTable, oMessageObject) {
1509
+ //this function escapes a string to use it as a regex
1510
+ var fnRegExpescape = function (s) {
1511
+ return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
1512
+ }; // based on the target path of the message we retrieve the property name.
1513
+ // to achieve it we remove the bindingContext path and the row binding path from the target
1514
+
1515
+
1516
+ var sTableTargetColProperty = oMessageObject.getTarget().replace(new RegExp(fnRegExpescape(oTable.getBindingContext().getPath() + "/" + oTable.getRowBinding().getPath()) + "\\(.*\\)/"), "");
1517
+ return sTableTargetColProperty;
1518
+ };
1519
+
1520
+ _proto._getObjectPageLayout = function _getObjectPageLayout(oElement, oObjectPageLayout) {
1521
+ if (oObjectPageLayout) {
1522
+ return oObjectPageLayout;
1523
+ }
1524
+
1525
+ oObjectPageLayout = oElement; //Iterate over parent till you have not reached the object page layout
1526
+
1527
+ while (oObjectPageLayout && !oObjectPageLayout.isA("sap.uxap.ObjectPageLayout")) {
1528
+ oObjectPageLayout = oObjectPageLayout.getParent();
1529
+ }
1530
+
1531
+ return oObjectPageLayout;
1532
+ };
1533
+
1534
+ _proto._getCustomColumnInfo = function _getCustomColumnInfo(oTable, iPosition) {
1535
+ var sTableColProperty = oTable.getColumns()[iPosition].getDataProperty();
1536
+ var oCustomColumn = oTable.getControlDelegate().getColumnsFor(oTable).find(function (oColumn) {
1537
+ return oColumn.name === sTableColProperty && !!oColumn.template;
1538
+ });
1539
+ return oCustomColumn;
1540
+ };
1541
+
1542
+ _proto._getTableFirstColProperty = function _getTableFirstColProperty(oTable) {
1543
+ var oCustomColumnInfo = this._getCustomColumnInfo(oTable, 0);
1544
+
1545
+ var sTableFirstColProperty;
1546
+
1547
+ if (oCustomColumnInfo) {
1548
+ if (oCustomColumnInfo.propertyInfos) {
1549
+ sTableFirstColProperty = oCustomColumnInfo.propertyInfos[0].replace("Property::", "");
1550
+ } else {
1551
+ sTableFirstColProperty = undefined;
1552
+ }
1553
+ } else {
1554
+ sTableFirstColProperty = oTable.getColumns()[0].getDataProperty();
1555
+ }
1556
+
1557
+ return sTableFirstColProperty;
1558
+ };
1559
+
1560
+ _proto._getTableFirstColBindingContextForTextAnnotation = function _getTableFirstColBindingContextForTextAnnotation(oTable, oTableRowContext, sTableFirstColProperty) {
1561
+ var oBindingContext;
1562
+
1563
+ if (oTableRowContext && sTableFirstColProperty) {
1564
+ var oModel = oTable.getModel();
1565
+ var oMetaModel = oModel.getMetaModel();
1566
+ var sMetaPath = oMetaModel.getMetaPath(oTableRowContext.getPath());
1567
+
1568
+ if (oMetaModel.getObject(sMetaPath + "/" + sTableFirstColProperty + "@com.sap.vocabularies.Common.v1.Text/$Path")) {
1569
+ oBindingContext = oMetaModel.createBindingContext(sMetaPath + "/" + sTableFirstColProperty + "@com.sap.vocabularies.Common.v1.Text");
1570
+ }
1571
+ }
1572
+
1573
+ return oBindingContext;
1574
+ };
1575
+
1576
+ _proto._getTableFirstColValue = function _getTableFirstColValue(sTableFirstColProperty, oTableRowContext, sTextAnnotationPath, sTextArrangement) {
1577
+ var sCodeValue = oTableRowContext.getValue(sTableFirstColProperty);
1578
+ var sTextValue;
1579
+ var sComputedValue = sCodeValue;
1580
+
1581
+ if (sTextAnnotationPath) {
1582
+ if (sTableFirstColProperty.lastIndexOf("/") > 0) {
1583
+ // the target property is replaced with the text annotation path
1584
+ sTableFirstColProperty = sTableFirstColProperty.slice(0, sTableFirstColProperty.lastIndexOf("/") + 1);
1585
+ sTableFirstColProperty = sTableFirstColProperty.concat(sTextAnnotationPath);
1586
+ } else {
1587
+ sTableFirstColProperty = sTextAnnotationPath;
1588
+ }
1589
+
1590
+ sTextValue = oTableRowContext.getValue(sTableFirstColProperty);
1591
+
1592
+ if (sTextValue) {
1593
+ if (sTextArrangement) {
1594
+ var sEnumNumber = sTextArrangement.slice(sTextArrangement.indexOf("/") + 1);
1595
+
1596
+ switch (sEnumNumber) {
1597
+ case "TextOnly":
1598
+ sComputedValue = sTextValue;
1599
+ break;
1600
+
1601
+ case "TextFirst":
1602
+ sComputedValue = sTextValue + " (" + sCodeValue + ")";
1603
+ break;
1604
+
1605
+ case "TextLast":
1606
+ sComputedValue = sCodeValue + " (" + sTextValue + ")";
1607
+ break;
1608
+
1609
+ case "TextSeparate":
1610
+ sComputedValue = sCodeValue;
1611
+ break;
1612
+
1613
+ default:
1614
+ }
1615
+ } else {
1616
+ sComputedValue = sTextValue + " (" + sCodeValue + ")";
1617
+ }
1618
+ }
1619
+ }
1620
+
1621
+ return sComputedValue;
1622
+ };
1623
+
1624
+ _proto._IsControlInTable = function _IsControlInTable(oTable, sControlId) {
1625
+ var oControl = sap.ui.getCore().byId(sControlId);
1626
+
1627
+ if (oControl && !oControl.isA("sap.ui.table.Table") && !oControl.isA("sap.m.Table")) {
1628
+ return oTable.findElements(true, function (oElem) {
1629
+ return oElem.getId() === oControl;
1630
+ });
1631
+ }
1632
+
1633
+ return false;
1634
+ };
1635
+
1636
+ _proto._IsControlPartOfCreationRow = function _IsControlPartOfCreationRow(oControl) {
1637
+ var oParentControl = oControl.getParent();
1638
+
1639
+ while (oParentControl && !oParentControl.isA("sap.ui.table.Row") && !oParentControl.isA("sap.ui.table.CreationRow") && !oParentControl.isA("sap.m.ColumnListItem")) {
1640
+ oParentControl = oParentControl.getParent();
1641
+ }
1642
+
1643
+ return !!oParentControl && oParentControl.isA("sap.ui.table.CreationRow");
1644
+ }
1645
+ /**
1646
+ * The method that is called to retrive the column info for associated messages in message popover.
1647
+ * @private
1648
+ * @param {oMessage} oMessage Message object
1649
+ * @param {oTable} oTable MDC Table
1650
+ * @returns {oColFromTableSettings} Returns the column info.
1651
+ */
1652
+ ;
1653
+
1654
+ _proto._fetchColumnInfo = function _fetchColumnInfo(oMessage, oTable) {
1655
+ var sColNameFromMessageObj = oMessage.getBindingContext("message").getObject().getTarget().split("/").pop();
1656
+ var oColFromTableSettings = oTable.getParent().getTableDefinition().columns.find(function (oColumn) {
1657
+ return oColumn.key.split("::").pop() === sColNameFromMessageObj;
1658
+ });
1659
+ return oColFromTableSettings;
1660
+ };
1661
+
1662
+ _proto._setMessageSubtitle = function _setMessageSubtitle(message, oTableRowBindingContexts, oTableRowContext, sTableTargetColName, oResourceBundle, sTableTargetProperty, oTable, bIsCreationRow) {
1663
+ var sMessageSubtitle;
1664
+ var sRowSubtitleValue, sColumnSubtitleText;
1665
+
1666
+ var sTableFirstColProperty = this._getTableFirstColProperty(oTable);
1667
+
1668
+ var oColFromTableSettings = this._fetchColumnInfo(message, oTable);
1669
+
1670
+ if (bIsCreationRow) {
1671
+ sMessageSubtitle = CommonUtils.getTranslatedText("T_MESSAGE_ITEM_SUBTITLE", oResourceBundle, [oResourceBundle.getText("T_MESSAGE_ITEM_SUBTITLE_CREATION_ROW_INDICATOR"), sTableTargetColName ? sTableTargetColName : oColFromTableSettings.label]);
1672
+ } else {
1673
+ var oTableFirstColBindingContextTextAnnotation = this._getTableFirstColBindingContextForTextAnnotation(oTable, oTableRowContext, sTableFirstColProperty);
1674
+
1675
+ var sTableFirstColTextAnnotationPath = oTableFirstColBindingContextTextAnnotation ? oTableFirstColBindingContextTextAnnotation.getObject("$Path") : undefined;
1676
+ var sTableFirstColTextArrangement = sTableFirstColTextAnnotationPath && oTableFirstColBindingContextTextAnnotation ? oTableFirstColBindingContextTextAnnotation.getObject("@com.sap.vocabularies.UI.v1.TextArrangement/$EnumMember") : undefined;
1677
+
1678
+ if (oTableRowBindingContexts.length > 0) {
1679
+ // set Row subtitle text
1680
+ if (oTableRowContext && sTableFirstColProperty) {
1681
+ sRowSubtitleValue = this._getTableFirstColValue(sTableFirstColProperty, oTableRowContext, sTableFirstColTextAnnotationPath, sTableFirstColTextArrangement);
1682
+ } else {
1683
+ sRowSubtitleValue = oResourceBundle.getText("T_MESSAGE_ITEM_SUBTITLE_INDICATOR_UNKNOWN");
1684
+ } // set the message subtitle
1685
+
1686
+
1687
+ if (sTableTargetColName) {
1688
+ // if column is present in table definition
1689
+ sMessageSubtitle = CommonUtils.getTranslatedText("T_MESSAGE_ITEM_SUBTITLE", oResourceBundle, [sRowSubtitleValue, sTableTargetColName]);
1690
+ } else if (oColFromTableSettings) {
1691
+ // if column is neither in table definition nor personalization, show only row subtitle text
1692
+ if (oColFromTableSettings.availability === "Hidden") {
1693
+ sMessageSubtitle = oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_ROW") + ": " + sRowSubtitleValue;
1694
+ } else {
1695
+ //if column is in table personalization but not in table definition, show Column (Hidden) : <colName>
1696
+ sColumnSubtitleText = oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_COLUMN") + " (" + oResourceBundle.getText("T_COLUMN_INDICATOR_IN_TABLE_DEFINITION") + "): " + oColFromTableSettings.label;
1697
+ sMessageSubtitle = oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_ROW") + ": " + sRowSubtitleValue + ", " + sColumnSubtitleText;
1698
+ }
1699
+ } else {
1700
+ sMessageSubtitle = CommonUtils.getTranslatedText("T_MESSAGE_ITEM_SUBTITLE", oResourceBundle, [sRowSubtitleValue, oResourceBundle.getText("T_MESSAGE_ITEM_SUBTITLE_INDICATOR_UNKNOWN")]);
1701
+ }
1702
+ } else {
1703
+ sMessageSubtitle = null;
1704
+ }
1705
+ } //set the subtitle
1706
+
1707
+
1708
+ message.setSubtitle(sMessageSubtitle);
1709
+ var oTableProperties = Object.keys(oTable.getModel().getMetaModel().getObject(oTable.data("entityType"))); // TODO: this logic would be moved to check the same at the template time to avoid the same check happening multiple times
1710
+
1711
+ var oComponent = sap.ui.require("sap/ui/core/Component");
1712
+
1713
+ var oNavObject = oTable && oComponent.getOwnerComponentFor(oTable) && oComponent.getOwnerComponentFor(oTable).getNavigation();
1714
+ var bSubOPConfigured = false;
1715
+
1716
+ if (oNavObject && Object.keys(oNavObject).indexOf(oTable.getRowBinding().sPath) != -1) {
1717
+ bSubOPConfigured = oNavObject[oTable.getRowBinding().sPath] && oNavObject[oTable.getRowBinding().sPath].detail && oNavObject[oTable.getRowBinding().sPath].detail.route ? true : false;
1718
+ }
1719
+
1720
+ var bIsNavigationConfigured = bSubOPConfigured && oTable.getRowAction() && oTable.getRowAction().indexOf("Navigation") != -1 && oTableProperties.indexOf(sTableTargetProperty) != -1 ? true : false; // Deactivation of the error link when the error column is not displayed
1721
+ // but The Link should be displayed if there is no subtitle
1722
+
1723
+ message.setActiveTitle(!sMessageSubtitle || bIsNavigationConfigured || bIsCreationRow || (!!sTableTargetColName ? !!oTableRowContext : !!sTableTargetColName));
1724
+ return sMessageSubtitle;
1725
+ };
1726
+
1727
+ _proto._removeMessage = function _removeMessage(oMessage) {
1728
+ var oTemp = sap.ui.getCore().getMessageManager().getMessageModel().getData();
1729
+ sap.ui.getCore().getMessageManager().removeAllMessages();
1730
+ oTemp.forEach(function (message) {
1731
+ if (message !== oMessage) {
1732
+ sap.ui.getCore().getMessageManager().addMessages([message]);
1733
+ }
1734
+ });
1735
+ };
1736
+
1737
+ return MessageButton;
1738
+ }(Button), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "customFilters", [_dec2], {
1739
+ configurable: true,
1740
+ enumerable: true,
1741
+ writable: true,
1742
+ initializer: null
1743
+ }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "messageChange", [Event], {
1744
+ configurable: true,
1745
+ enumerable: true,
1746
+ writable: true,
1747
+ initializer: null
1748
+ })), _class2)) || _class);
1749
+ return MessageButton;
1750
+ }, false);
1751
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1lc3NhZ2VCdXR0b24udHMiXSwibmFtZXMiOlsiQnV0dG9uVHlwZSIsIm1MaWIiLCJNZXNzYWdlVHlwZSIsImNvcmVMaWIiLCJNZXNzYWdlQnV0dG9uIiwiVUk1Q2xhc3MiLCJBZ2dyZWdhdGlvbiIsInR5cGUiLCJtdWx0aXBsZSIsInNpbmd1bGFyTmFtZSIsInNMYXN0QWN0aW9uVGV4dCIsInNHZW5lcmFsR3JvdXBUZXh0Iiwic1ZpZXdJZCIsImluaXQiLCJCdXR0b24iLCJwcm90b3R5cGUiLCJhcHBseSIsImF0dGFjaFByZXNzIiwiaGFuZGxlTWVzc2FnZVBvcG92ZXJQcmVzcyIsIm9NZXNzYWdlUG9wb3ZlciIsIk1lc3NhZ2VQb3BvdmVyIiwib0l0ZW1CaW5kaW5nIiwiZ2V0QmluZGluZyIsImF0dGFjaENoYW5nZSIsIl9zZXRNZXNzYWdlRGF0YSIsIm1lc3NhZ2VCdXR0b25JZCIsImdldElkIiwiYWRkQ3VzdG9tRGF0YSIsInNhcCIsInVpIiwiY29yZSIsIkN1c3RvbURhdGEiLCJrZXkiLCJ2YWx1ZSIsImF0dGFjaE1vZGVsQ29udGV4dENoYW5nZSIsIl9hcHBseUZpbHRlcnNBbmRTb3J0IiwiYmluZCIsImF0dGFjaEFjdGl2ZVRpdGxlUHJlc3MiLCJfYWN0aXZlVGl0bGVQcmVzcyIsIm9FdmVudCIsInRvZ2dsZSIsImdldFNvdXJjZSIsIl9hcHBseUdyb3VwaW5nQXN5bmMiLCJvVmlldyIsInRoYXQiLCJhV2FpdEZvckRhdGEiLCJvVmlld0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJfZmluZFRhYmxlc1JlbGF0ZWRUb01lc3NhZ2VzIiwib1JlcyIsImFNZXNzYWdlcyIsImdldENvbnRleHRzIiwibWFwIiwib0NvbnRleHQiLCJnZXRPYmplY3QiLCJvVmlld0NvbnRleHQiLCJvT2JqZWN0UGFnZSIsImdldENvbnRlbnQiLCJnZXRWaXNpYmxlU2VjdGlvbnNGcm9tT2JqZWN0UGFnZUxheW91dCIsImZvckVhY2giLCJvU2VjdGlvbiIsImdldFN1YlNlY3Rpb25zIiwib1N1YlNlY3Rpb24iLCJmaW5kRWxlbWVudHMiLCJvRWxlbSIsImlzQSIsImkiLCJsZW5ndGgiLCJvUm93QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJzRWxlbWVCaW5kaW5nUGF0aCIsImdldFBhdGgiLCJ0YXJnZXQiLCJpbmRleE9mIiwicHVzaCIsInRhYmxlIiwic3Vic2VjdGlvbiIsIm9UYWJsZXMiLCJfb1RhYmxlIiwib01EQ1RhYmxlIiwib1N1YnNlY3Rpb24iLCJzZXRCaW5kaW5nQ29udGV4dCIsImlzTGVuZ3RoRmluYWwiLCJQcm9taXNlIiwicmVzb2x2ZSIsImF0dGFjaEV2ZW50T25jZSIsImFsbCIsInRoZW4iLCJnZXRNb2RlbCIsImNoZWNrTWVzc2FnZXMiLCJzZXRUaW1lb3V0IiwiX2FwcGx5R3JvdXBpbmciLCJjYXRjaCIsIkxvZyIsImVycm9yIiwib09iamVjdFBhZ2VMYXlvdXQiLCJnZXRTZWN0aW9ucyIsImZpbHRlciIsImdldFZpc2libGUiLCJfZ2V0T2JqZWN0UGFnZUxheW91dCIsImdldEl0ZW1zIiwiYVNlY3Rpb25zIiwiYkVuYWJsZUJpbmRpbmciLCJfY2hlY2tDb250cm9sSWRJblNlY3Rpb25zIiwiX2ZuRW5hYmxlQmluZGluZ3MiLCJfZ2V0VGFibGVSZWZFcnJvckNvbnRleHQiLCJvVGFibGUiLCJvTW9kZWwiLCJnZXRQcm9wZXJ0eSIsInNldFByb3BlcnR5Iiwic1JlZkVycm9yQ29udGV4dFBhdGgiLCJyZXBsYWNlIiwiZ2V0Q29udGV4dCIsIl9nZXRCYWNrZW5kTWVzc2FnZVRvUmVtb3ZlIiwib01lc3NhZ2VPYmplY3QiLCJvRXJyb3JDb250ZXh0Iiwib0JhY2tlbmRNZXNzYWdlVG9SZW1vdmUiLCJhTWVzc2FnZUlkcyIsIk9iamVjdCIsImtleXMiLCJldmVyeSIsImNoaWxkS2V5IiwiYVZhbGlkTWVzc2FnZUlkcyIsImdldENvcmUiLCJnZXRNZXNzYWdlTWFuYWdlciIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJtIiwiaWQiLCJfdXBkYXRlSW50ZXJuYWxNb2RlbCIsIm9UYWJsZVJvd0NvbnRleHQiLCJpUm93SW5kZXgiLCJzVGFibGVUYXJnZXRDb2xQcm9wZXJ0eSIsImJJc0NyZWF0aW9uUm93Iiwib1RlbXAiLCJyb3dJbmRleCIsInRhcmdldENvbFByb3BlcnR5IiwibWVzc2FnZSIsImFPYnNvbGV0ZU1lc3NhZ2VsSWRzIiwiaW50ZXJuYWxNZXNzYWdlSWQiLCJvYnNvbGV0ZUlkIiwiYXNzaWduIiwiX2dldENvbnRyb2xGcm9tTWVzc2FnZVJlbGF0aW5nVG9TdWJTZWN0aW9uIiwic3ViU2VjdGlvbiIsImFFbGVtZW50cyIsIl9mbkZpbHRlclVwb25JZHMiLCJnZXRDb250cm9sSWRzIiwic29ydCIsImEiLCJiIiwiX3NldEdyb3VwTGFiZWxGb3JUcmFuc2llbnRNc2ciLCJzQWN0aW9uTmFtZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImdldFRleHQiLCJzZXRHcm91cE5hbWUiLCJfY29tcHV0ZU1lc3NhZ2VHcm91cEFuZFN1YlRpdGxlIiwic2VjdGlvbiIsImJNdWx0aXBsZVN1YlNlY3Rpb25zIiwiZGV0YWNoQ2hhbmdlIiwib0VsZW1lbnQiLCJvVGFyZ2V0VGFibGVJbmZvIiwibCIsIm9UYXJnZXRlZENvbnRyb2wiLCJiSXNCYWNrZW5kTWVzc2FnZSIsIlJlZ0V4cCIsInRlc3QiLCJnZXRUYXJnZXQiLCJvUmVzb3VyY2VCdW5kbGUiLCJnZXRQYXJlbnQiLCJ0YWJsZUhlYWRlciIsImdldEhlYWRlciIsIl9nZXRUYWJsZUNvbFByb3BlcnR5Iiwib1RhYmxlQ29sSW5mbyIsIl9nZXRUYWJsZUNvbEluZm8iLCJvVGFibGVSb3dCaW5kaW5nQ29udGV4dHMiLCJnZXRDdXJyZW50Q29udGV4dHMiLCJzVGFibGVUYXJnZXRDb2xOYW1lIiwic1RhYmxlVGFyZ2V0UHJvcGVydHkiLCJmaW5kIiwicm93Q29udGV4dCIsInNDb250cm9sSWQiLCJjb250cm9sSWRzIiwic0lkIiwiX0lzQ29udHJvbEluVGFibGUiLCJvQ29udHJvbCIsImJ5SWQiLCJfSXNDb250cm9sUGFydE9mQ3JlYXRpb25Sb3ciLCJfc2V0TWVzc2FnZVN1YnRpdGxlIiwiX2Zvcm1hdE1lc3NhZ2VEZXNjcmlwdGlvbiIsImdldEluZGV4Iiwic2V0QWN0aXZlVGl0bGUiLCJiSXNUYXJnZXRlZENvbnRyb2xPcnBoYW4iLCJfYklzT3JwaGFuRWxlbWVudCIsInNldFN1YnRpdGxlIiwiX2dldE1kY1RhYmxlIiwiaVRhcmdldENvbHVtbkluZGV4IiwiX2dldFRhYmxlQ29sdW1uSW5kZXgiLCJnZXRDb2x1bW5zIiwiZ2V0RGF0YVByb3BlcnR5IiwidW5kZWZpbmVkIiwiX2dldFRhYmxlUm93IiwiX2dldFRhYmxlUm93SW5kZXgiLCJwZXJzaXN0ZW50IiwiZ2V0VGl0bGUiLCJfZ2V0Vmlld0lkIiwib01lc3NhZ2VUYXJnZXRQcm9wZXJ0eSIsInNwbGl0IiwicG9wIiwib1VJTW9kZWwiLCJmaXJlQWN0aXZlVGl0bGVQcmVzcyIsIl9yZW1vdmVNZXNzYWdlIiwiYVN1YlNlY3Rpb25zIiwiaiIsImsiLCJhVmlzaWJsZVNlY3Rpb25zIiwidmlld0lkIiwiYklzR2VuZXJhbEdyb3VwTmFtZSIsImFDb250cm9scyIsImdldEdyb3VwTmFtZSIsIl9maW5kVGFyZ2V0Rm9yTWVzc2FnZSIsIm1lc3NhZ2VPYmplY3QiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiY29udGV4dFBhdGgiLCJnZXRNZXRhUGF0aCIsIm9Db250ZXh0UGF0aE1ldGFkYXRhIiwiJGtpbmQiLCJVcmlQYXJhbWV0ZXJzIiwiZnJvbVF1ZXJ5Iiwid2luZG93IiwibG9jYXRpb24iLCJzZWFyY2giLCJnZXQiLCJpU2VjdGlvbiIsIm5vblRhYmxlQ2hhcnRjb250cm9sRm91bmQiLCJpU3ViU2VjdGlvbiIsIm9BbGxCbG9ja3MiLCJnZXRCbG9ja3MiLCJibG9jayIsIl9maW5kTWVzc2FnZUdyb3VwQWZ0ZXJSZWJpbmRpbmciLCJhdHRhY2hEYXRhUmVjZWl2ZWQiLCJWaWV3IiwiX3NldExvbmd0ZXh0VXJsRGVzY3JpcHRpb24iLCJzTWVzc2FnZURlc2NyaXB0aW9uQ29udGVudCIsIm9EaWFnbm9zaXNUaXRsZSIsInNldEFzeW5jRGVzY3JpcHRpb25IYW5kbGVyIiwiY29uZmlnIiwic09sZERlc2NyaXB0aW9uIiwic0xvbmdUZXh0VXJsIiwiaXRlbSIsImdldExvbmd0ZXh0VXJsIiwialF1ZXJ5IiwiYWpheCIsInVybCIsInN1Y2Nlc3MiLCJkYXRhIiwic0RpYWdub3Npc1RleHQiLCJnZXRIdG1sVGV4dCIsInNldERlc2NyaXB0aW9uIiwicHJvbWlzZSIsInNFcnJvciIsInJlamVjdCIsInNUYWJsZUZpcnN0Q29sUHJvcGVydHkiLCJfZ2V0VGFibGVGaXJzdENvbFByb3BlcnR5Iiwic0NvbHVtbkluZm8iLCJvQ29sRnJvbVRhYmxlU2V0dGluZ3MiLCJfZmV0Y2hDb2x1bW5JbmZvIiwiYXZhaWxhYmlsaXR5IiwiZ2V0VHlwZSIsImdldFZhbHVlIiwibGFiZWwiLCJvRmllbGRzQWZmZWN0ZWRUaXRsZSIsIkZvcm1hdHRlZFRleHQiLCJodG1sVGV4dCIsInNGaWVsZEFmZmVjdGVkVGV4dCIsInNVSU1lc3NhZ2VEZXNjcmlwdGlvbiIsImRlc2NyaXB0aW9uIiwiY2xlYXJUaW1lb3V0IiwiX3NldE1lc3NhZ2VEYXRhVGltZW91dCIsInNJY29uIiwib01lc3NhZ2VzIiwib01lc3NhZ2VDb3VudCIsIkVycm9yIiwiV2FybmluZyIsIlN1Y2Nlc3MiLCJJbmZvcm1hdGlvbiIsImlNZXNzYWdlTGVuZ3RoIiwic0J1dHRvblR5cGUiLCJEZWZhdWx0Iiwic01lc3NhZ2VLZXkiLCJzVG9vbHRpcFRleHQiLCJzTWVzc2FnZVRleHQiLCJOZWdhdGl2ZSIsIkNyaXRpY2FsIiwiTmV1dHJhbCIsInNldFRleHQiLCJzZXRUb29sdGlwIiwic2V0SWNvbiIsInNldFR5cGUiLCJzZXRWaXNpYmxlIiwib1BhZ2VSZWFkeSIsImdldENvbnRyb2xsZXIiLCJwYWdlUmVhZHkiLCJ3YWl0UGFnZVJlYWR5IiwiZmluYWxseSIsImZpcmVNZXNzYWdlQ2hhbmdlIiwibmF2aWdhdGVCYWNrIiwic29tZSIsIm9QYXJlbnRFbGVtZW50Iiwib0ludGVybmFsTW9kZWxDb250ZXh0Iiwib0l0ZW0iLCJnZXRQYXJhbWV0ZXIiLCJvTWVzc2FnZSIsInNTZWN0aW9uVGl0bGUiLCJpc09wZW4iLCJjbG9zZSIsIl9mb2N1c09uTWVzc2FnZVRhcmdldENvbnRyb2wiLCJvVGFyZ2V0TWRjVGFibGUiLCJhQWxsVmlld0VsZW1lbnRzIiwiYUVycm9uZW91c0NvbnRyb2xzIiwiYU5vdFRhYmxlRXJyb25lb3VzQ29udHJvbHMiLCJmb2N1cyIsImFUYXJnZXRNZGNUYWJsZVJvdyIsIm9UYXJnZXRSb3ciLCJvVGFyZ2V0Q2VsbCIsIl9nZXRUYXJnZXRDZWxsIiwib1RhcmdldEZpZWxkIiwiZ2V0Q29udGVudEVkaXQiLCJlcnJvclByb3BlcnR5IiwiX3JvdXRpbmciLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJpc0NvbnRyb2xJblRhYmxlIiwicmVkdWNlIiwiYWNjIiwidmFsIiwib1BhcmVudENvbnRyb2wiLCJfbmF2aWdhdGVGcm9tTWVzc2FnZVRvU2VjdGlvblRhYmxlSW5JY29uVGFiQmFyTW9kZSIsIm9SZWZFcnJvckNvbnRleHQiLCJvUmVmRXJyb3IiLCJfc2V0Rm9jdXNPblRhcmdldEZpZWxkIiwiX2dldE1kY1RhYmxlUm93cyIsImlGaXJzdFZpc2libGVSb3ciLCJfZ2V0R3JpZFRhYmxlIiwiZ2V0Rmlyc3RWaXNpYmxlUm93IiwidGFyZ2V0Um93IiwidGFyZ2V0Q2VsbCIsInNjcm9sbFRvSW5kZXgiLCJpTmV3Rmlyc3RWaXNpYmxlUm93IiwiYlNjcm9sbE5lZWRlZCIsIm9XYWl0Q29udHJvbElkQWRkZWQiLCJhdHRhY2hFdmVudCIsIm9TZWxlY3RlZFNlY3Rpb24iLCJnZXRTZWxlY3RlZFNlY3Rpb24iLCJfbmF2aWdhdGVGcm9tTWVzc2FnZVRvU2VjdGlvbkluSWNvblRhYkJhck1vZGUiLCJvVGFibGVUYXJnZXRDb2wiLCJjb2x1bW4iLCJvQ3VzdG9tQ29sdW1uIiwiZ2V0Q29udHJvbERlbGVnYXRlIiwiZ2V0Q29sdW1uc0ZvciIsIm9Db2x1bW4iLCJ0ZW1wbGF0ZSIsInByb3BlcnR5SW5mb3MiLCJuYW1lIiwiYUNvbHVtbnMiLCJyZWxhdGl2ZVBhdGgiLCJiSXNUYWJsZVRhcmdldENvbFZpc2libGUiLCJfZ2V0TWVzc2FnZVJhbmsiLCJvYmoiLCJhQWxsRWxlbWVudHMiLCJzZWN0aW9uUmFuayIsIl9mbkZpbHRlclVwb25JZCIsImdldENvbnRyb2xJZCIsInNlY3Rpb25OYW1lIiwic3ViU2VjdGlvbk5hbWUiLCJvVmFsaWRhdGlvbkZpbHRlcnMiLCJvVmFsaWRhdGlvbkFuZENvbnRleHRGaWx0ZXIiLCJvRmlsdGVycyIsInNQYXRoIiwib1NvcnRlciIsIm9EaWFsb2dGaWx0ZXIiLCJvYmplY3RQYWdlTGF5b3V0U2VjdGlvbnMiLCJhVXNlckRlZmluZWRGaWx0ZXIiLCJmaWx0ZXJPdXRNZXNzYWdlc0luRGlhbG9nIiwiZm5UZXN0IiwiYUNvbnRyb2xJZHMiLCJpbmRleCIsIkluZmluaXR5IiwiZXJyb3JGaWVsZENvbnRyb2wiLCJmaWVsZFJhbmtpbkRpYWxvZyIsIkRpYWxvZyIsIkZpbHRlciIsInBhdGgiLCJjYXNlU2Vuc2l0aXZlIiwiZ2V0Q2hlY2tDb250cm9sSW5WaWV3RmlsdGVyIiwiYUN1c3RvbUZpbHRlcnMiLCJnZXRBZ2dyZWdhdGlvbiIsIm9wZXJhdG9yIiwidmFsdWUxIiwidmFsdWUyIiwib0JpbmRpbmdDb250ZXh0IiwiZmlsdGVycyIsIkZpbHRlck9wZXJhdG9yIiwiRVEiLCJhbmQiLCJTdGFydHNXaXRoIiwib1ZhbGlkYXRpb25Db250ZXh0RGlhbG9nRmlsdGVycyIsIlNvcnRlciIsIm9iajEiLCJvYmoyIiwicmFua0EiLCJyYW5rQiIsIl9nZXRTZWN0aW9uQnlTZWN0aW9uVGl0bGUiLCJiVXNlSWNvblRhYkJhciIsImdldFVzZUljb25UYWJCYXIiLCJzU2VsZWN0ZWRTZWN0aW9uSWQiLCJzZXRTZWxlY3RlZFNlY3Rpb24iLCJvVGFibGVDb250ZXh0Iiwib09QQ29udGV4dCIsImJTaG91bGRXYWl0Rm9yVGFibGVSZWZyZXNoIiwib01kY1RhYmxlIiwib1RhYmxlUm93IiwiZ2V0VGFibGUiLCJmaW5kSW5kZXgiLCJlbGVtZW50IiwiZ2V0VGFyZ2V0Q2VsbEluZGV4IiwiZ2V0Q2VsbHMiLCJvQ2VsbCIsImdldFRhcmdldENvbHVtbkluZGV4Iiwib1RhcmdldEVsZW1lbnQiLCJpVGFyZ2V0Q2VsbEluZGV4Iiwic1RhcmdldENlbGxJZCIsImFUYWJsZUNvbHVtbnMiLCJnZXRDcmVhdGlvblRlbXBsYXRlIiwiZm5SZWdFeHBlc2NhcGUiLCJzIiwiX2dldEN1c3RvbUNvbHVtbkluZm8iLCJpUG9zaXRpb24iLCJzVGFibGVDb2xQcm9wZXJ0eSIsIm9DdXN0b21Db2x1bW5JbmZvIiwiX2dldFRhYmxlRmlyc3RDb2xCaW5kaW5nQ29udGV4dEZvclRleHRBbm5vdGF0aW9uIiwic01ldGFQYXRoIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJfZ2V0VGFibGVGaXJzdENvbFZhbHVlIiwic1RleHRBbm5vdGF0aW9uUGF0aCIsInNUZXh0QXJyYW5nZW1lbnQiLCJzQ29kZVZhbHVlIiwic1RleHRWYWx1ZSIsInNDb21wdXRlZFZhbHVlIiwibGFzdEluZGV4T2YiLCJzbGljZSIsImNvbmNhdCIsInNFbnVtTnVtYmVyIiwic0NvbE5hbWVGcm9tTWVzc2FnZU9iaiIsImdldFRhYmxlRGVmaW5pdGlvbiIsImNvbHVtbnMiLCJzTWVzc2FnZVN1YnRpdGxlIiwic1Jvd1N1YnRpdGxlVmFsdWUiLCJzQ29sdW1uU3VidGl0bGVUZXh0IiwiQ29tbW9uVXRpbHMiLCJnZXRUcmFuc2xhdGVkVGV4dCIsIm9UYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRUZXh0QW5ub3RhdGlvbiIsInNUYWJsZUZpcnN0Q29sVGV4dEFubm90YXRpb25QYXRoIiwic1RhYmxlRmlyc3RDb2xUZXh0QXJyYW5nZW1lbnQiLCJvVGFibGVQcm9wZXJ0aWVzIiwib0NvbXBvbmVudCIsInJlcXVpcmUiLCJvTmF2T2JqZWN0IiwiZ2V0T3duZXJDb21wb25lbnRGb3IiLCJnZXROYXZpZ2F0aW9uIiwiYlN1Yk9QQ29uZmlndXJlZCIsImRldGFpbCIsInJvdXRlIiwiYklzTmF2aWdhdGlvbkNvbmZpZ3VyZWQiLCJnZXRSb3dBY3Rpb24iLCJyZW1vdmVBbGxNZXNzYWdlcyIsImFkZE1lc3NhZ2VzIiwiRXZlbnQiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkEsTUFBTUEsVUFBVSxHQUFHQyxJQUFJLENBQUNELFVBQXhCO0FBQ0EsTUFBTUUsV0FBVyxHQUFHQyxPQUFPLENBQUNELFdBQTVCO01BR01FLGEsV0FETEMsUUFBUSxDQUFDLDZCQUFELEMsVUFFUEMsV0FBVyxDQUFDO0FBQUVDLElBQUFBLElBQUksRUFBRSw2QkFBUjtBQUF1Q0MsSUFBQUEsUUFBUSxFQUFFLElBQWpEO0FBQXVEQyxJQUFBQSxZQUFZLEVBQUU7QUFBckUsR0FBRCxDOzs7Ozs7Ozs7Ozs7Ozs7O1lBU0pDLGUsR0FBa0IsRTtZQUNsQkMsaUIsR0FBb0IsRTtZQUVwQkMsTyxHQUFVLEU7Ozs7OztXQUVsQkMsSSxHQUFBLGdCQUFPO0FBQ05DLE1BQUFBLE1BQU0sQ0FBQ0MsU0FBUCxDQUFpQkYsSUFBakIsQ0FBc0JHLEtBQXRCLENBQTRCLElBQTVCLEVBRE0sQ0FFTjs7QUFDQSxXQUFLQyxXQUFMLENBQWlCLEtBQUtDLHlCQUF0QixFQUFpRCxJQUFqRDtBQUNBLFdBQUtDLGVBQUwsR0FBdUIsSUFBSUMsY0FBSixFQUF2QjtBQUNBLFdBQUtDLFlBQUwsR0FBb0IsS0FBS0YsZUFBTCxDQUFxQkcsVUFBckIsQ0FBZ0MsT0FBaEMsQ0FBcEI7QUFDQSxXQUFLRCxZQUFMLENBQWtCRSxZQUFsQixDQUErQixLQUFLQyxlQUFwQyxFQUFxRCxJQUFyRDtBQUNBLFVBQU1DLGVBQWUsR0FBRyxLQUFLQyxLQUFMLEVBQXhCOztBQUNBLFVBQUlELGVBQUosRUFBcUI7QUFDcEIsYUFBS04sZUFBTCxDQUFx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WSxPQUFqQixDQUF5QndHLG9CQUF6QixLQUFrRCxDQUFDLENBSG5ELEdBSUcsSUFKSCxHQUtHLEtBTkosQ0EzRkMsQ0FrR0Q7QUFDQTs7QUFDQXhDLE1BQUFBLE9BQU8sQ0FBQ3FELGNBQVIsQ0FDQyxDQUFDeVEsZ0JBQUQsSUFDQ2lCLHVCQURELElBRUNuVixjQUZELEtBR0UsQ0FBQyxDQUFDMkMsbUJBQUYsR0FBd0IsQ0FBQyxDQUFDOUMsZ0JBQTFCLEdBQTZDLENBQUMsQ0FBQzhDLG1CQUhqRCxDQUREO0FBTUEsYUFBT3VSLGdCQUFQO0FBQ0EsSzs7V0FFRHJQLGMsR0FBQSx3QkFBZXNHLFFBQWYsRUFBOEI7QUFDN0IsVUFBTWxMLEtBQUssR0FBRzFHLEdBQUcsQ0FBQ0MsRUFBSixDQUNaOEYsT0FEWSxHQUVaQyxpQkFGWSxHQUdaQyxlQUhZLEdBSVpDLE9BSlksRUFBZDtBQUtBbEcsTUFBQUEsR0FBRyxDQUFDQyxFQUFKLENBQ0U4RixPQURGLEdBRUVDLGlCQUZGLEdBR0U4VixpQkFIRjtBQUlBcFYsTUFBQUEsS0FBSyxDQUFDM0UsT0FBTixDQUFjLFVBQVM4RSxPQUFULEVBQXVCO0FBQ3BDLFlBQUlBLE9BQU8sS0FBSytLLFFBQWhCLEVBQTBCO0FBQ3pCNVIsVUFBQUEsR0FBRyxDQUFDQyxFQUFKLENBQ0U4RixPQURGLEdBRUVDLGlCQUZGLEdBR0UrVixXQUhGLENBR2MsQ0FBQ2xWLE9BQUQsQ0FIZDtBQUlBO0FBQ0QsT0FQRDtBQVFBLEs7OztJQXp1RDBCM0gsTTs7Ozs7b0ZBSTFCOGMsSzs7Ozs7O1NBd3VEYXhkLGEiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogJHtjb3B5cmlnaHR9XG4gKi9cbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgbUxpYiBmcm9tIFwic2FwL20vbGlicmFyeVwiO1xuaW1wb3J0IE1lc3NhZ2VQb3BvdmVyIGZyb20gXCJzYXAvZmUvY29tbW9uL01lc3NhZ2VQb3BvdmVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgY29yZUxpYiBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IFNvcnRlciBmcm9tIFwic2FwL3VpL21vZGVsL1NvcnRlclwiO1xuaW1wb3J0IEZpbHRlck9wZXJhdG9yIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyT3BlcmF0b3JcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IFVyaVBhcmFtZXRlcnMgZnJvbSBcInNhcC9iYXNlL3V0aWwvVXJpUGFyYW1ldGVyc1wiO1xuaW1wb3J0IEZvcm1hdHRlZFRleHQgZnJvbSBcInNhcC9tL0Zvcm1hdHRlZFRleHRcIjtcbmltcG9ydCBDb3JlRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgQWdncmVnYXRpb24sIFVJNUNsYXNzLCBFdmVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IE1lc3NhZ2VGaWx0ZXIgZnJvbSBcInNhcC9mZS9jb21tb24vTWVzc2FnZUZpbHRlclwiO1xuXG5jb25zdCBCdXR0b25UeXBlID0gbUxpYi5CdXR0b25UeXBlO1xuY29uc3QgTWVzc2FnZVR5cGUgPSBjb3JlTGliLk1lc3NhZ2VUeXBlO1xuXG5AVUk1Q2xhc3MoXCJzYXAuZmUuY29tbW9uLk1lc3NhZ2VCdXR0b25cIilcbmNsYXNzIE1lc3NhZ2VCdXR0b24gZXh0ZW5kcyBCdXR0b24ge1xuXHRAQWdncmVnYXRpb24oeyB0eXBlOiBcInNhcC5mZS5jb21tb24uTWVzc2FnZUZpbHRlclwiLCBtdWx0aXBsZTogdHJ1ZSwgc2luZ3VsYXJOYW1lOiBcImN1c3RvbUZpbHRlclwiIH0pXG5cdGN1c3RvbUZpbHRlcnMhOiBNZXNzYWdlRmlsdGVyO1xuXG5cdEBFdmVudFxuXHRtZXNzYWdlQ2hhbmdlITogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBvTWVzc2FnZVBvcG92ZXI6IGFueTtcblx0cHJpdmF0ZSBvSXRlbUJpbmRpbmc6IGFueTtcblx0cHJpdmF0ZSBvT2JqZWN0UGFnZUxheW91dDogYW55O1xuXHRwcml2YXRlIHNMYXN0QWN0aW9uVGV4dCA9IFwiXCI7XG5cdHByaXZhdGUgc0dlbmVyYWxHcm91cFRleHQgPSBcIlwiO1xuXHRwcml2YXRlIF9zZXRNZXNzYWdlRGF0YVRpbWVvdXQ6IGFueTtcblx0cHJpdmF0ZSBzVmlld0lkID0gXCJcIjtcblxuXHRpbml0KCkge1xuXHRcdEJ1dHRvbi5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzKTtcblx0XHQvL3ByZXNzIGV2ZW50IGhhbmRsZXIgYXR0YWNoZWQgdG8gb3BlbiB0aGUgbWVzc2FnZSBwb3BvdmVyXG5cdFx0dGhpcy5hdHRhY2hQcmVzcyh0aGlzLmhhbmRsZU1lc3NhZ2VQb3BvdmVyUHJlc3MsIHRoaXMpO1xuXHRcdHRoaXMub01lc3NhZ2VQb3BvdmVyID0gbmV3IE1lc3NhZ2VQb3BvdmVyKCk7XG5cdFx0dGhpcy5vSXRlbUJpbmRpbmcgPSB0aGlzLm9NZXNzYWdlUG9wb3Zlci5nZXRCaW5kaW5nKFwiaXRlbXNcIik7XG5cdFx0dGhpcy5vSXRlbUJpbmRpbmcuYXR0YWNoQ2hhbmdlKHRoaXMuX3NldE1lc3NhZ2VEYXRhLCB0aGlzKTtcblx0XHRjb25zdCBtZXNzYWdlQnV0dG9uSWQgPSB0aGlzLmdldElkKCk7XG5cdFx0aWYgKG1lc3NhZ2VCdXR0b25JZCkge1xuXHRcdFx0dGhpcy5vTWVzc2FnZVBvcG92ZXIuYWRkQ3VzdG9tRGF0YShuZXcgKHNhcCBhcyBhbnkpLnVpLmNvcmUuQ3VzdG9tRGF0YSh7IGtleTogXCJtZXNzYWdlQnV0dG9uSWRcIiwgdmFsdWU6IG1lc3NhZ2VCdXR0b25JZCB9KSk7IC8vIFRPRE8gY2hlY2sgZm9yIGN1c3RvbSBkYXRhIHR5cGVcblx0XHR9XG5cdFx0dGhpcy5hdHRhY2hNb2RlbENvbnRleHRDaGFuZ2UodGhpcy5fYXBwbHlGaWx0ZXJzQW5kU29ydC5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLm9NZXNzYWdlUG9wb3Zlci5hdHRhY2hBY3RpdmVUaXRsZVByZXNzKHRoaXMuX2FjdGl2ZVRpdGxlUHJlc3MuYmluZCh0aGlzKSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCB3aGVuIGEgdXNlciBjbGlja3Mgb24gdGhlIE1lc3NhZ2VCdXR0b24gY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBFdmVudCBvYmplY3Rcblx0ICovXG5cdGhhbmRsZU1lc3NhZ2VQb3BvdmVyUHJlc3Mob0V2ZW50OiBDb3JlRXZlbnQpIHtcblx0XHR0aGlzLm9NZXNzYWdlUG9wb3Zlci50b2dnbGUob0V2ZW50LmdldFNvdXJjZSgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWV0aG9kIHRoYXQgZ3JvdXBzIHRoZSBtZXNzYWdlcyBiYXNlZCBvbiB0aGUgc2VjdGlvbiBvciBzdWJzZWN0aW9uIHRoZXkgYmVsb25nIHRvLlxuXHQgKiBUaGlzIG1ldGhvZCBmb3JjZSB0aGUgbG9hZGluZyBvZiBjb250ZXh0cyBmb3IgYWxsIHRhYmxlcyBiZWZvcmUgdG8gYXBwbHkgdGhlIGdyb3VwaW5nLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZpZXcgQ3VycmVudCB2aWV3LlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmV0dXJuIHByb21pc2UuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfYXBwbHlHcm91cGluZ0FzeW5jKG9WaWV3OiBWaWV3KSB7XG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMgYXMgTWVzc2FnZUJ1dHRvbjtcblx0XHRjb25zdCBhV2FpdEZvckRhdGE6IGFueVtdID0gW107XG5cdFx0Y29uc3Qgb1ZpZXdCaW5kaW5nQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgX2ZpbmRUYWJsZXNSZWxhdGVkVG9NZXNzYWdlcyA9IGZ1bmN0aW9uKG9WaWV3OiBWaWV3KSB7XG5cdFx0XHRjb25zdCBvUmVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0Y29uc3QgYU1lc3NhZ2VzID0gdGhhdC5vSXRlbUJpbmRpbmcuZ2V0Q29udGV4dHMoKS5tYXAoZnVuY3Rpb24ob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IG9WaWV3Q29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRpZiAob1ZpZXdDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG9PYmplY3RQYWdlID0gb1ZpZXcuZ2V0Q29udGVudCgpWzBdO1xuXHRcdFx0XHR0aGF0LmdldFZpc2libGVTZWN0aW9uc0Zyb21PYmplY3RQYWdlTGF5b3V0KG9PYmplY3RQYWdlKS5mb3JFYWNoKGZ1bmN0aW9uKG9TZWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0XHRvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24ob1N1YlNlY3Rpb246IGFueSkge1xuXHRcdFx0XHRcdFx0b1N1YlNlY3Rpb24uZmluZEVsZW1lbnRzKHRydWUpLmZvckVhY2goZnVuY3Rpb24ob0VsZW06IGFueSkge1xuXHRcdFx0XHRcdFx0XHRpZiAob0VsZW0uaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYU1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvUm93QmluZGluZyA9IG9FbGVtLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUm93QmluZGluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzRWxlbWVCaW5kaW5nUGF0aCA9IG9WaWV3Q29udGV4dC5nZXRQYXRoKCkgKyBcIi9cIiArIG9FbGVtLmdldFJvd0JpbmRpbmcoKS5nZXRQYXRoKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhTWVzc2FnZXNbaV0udGFyZ2V0LmluZGV4T2Yoc0VsZW1lQmluZGluZ1BhdGgpID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlcy5wdXNoKHsgdGFibGU6IG9FbGVtLCBzdWJzZWN0aW9uOiBvU3ViU2VjdGlvbiB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9SZXM7XG5cdFx0fTtcblx0XHQvLyBTZWFyY2ggZm9yIHRhYmxlIHJlbGF0ZWQgdG8gTWVzc2FnZXMgYW5kIGluaXRpYWxpemUgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFyZW50IHN1YnNlY3Rpb24gdG8gcmV0cmlldmUgdGhlIGRhdGFcblx0XHRjb25zdCBvVGFibGVzID0gX2ZpbmRUYWJsZXNSZWxhdGVkVG9NZXNzYWdlcy5iaW5kKHRoaXMpKG9WaWV3KTtcblx0XHRvVGFibGVzLmZvckVhY2goZnVuY3Rpb24oX29UYWJsZSkge1xuXHRcdFx0Y29uc3Qgb01EQ1RhYmxlID0gX29UYWJsZS50YWJsZSxcblx0XHRcdFx0b1N1YnNlY3Rpb24gPSBfb1RhYmxlLnN1YnNlY3Rpb247XG5cdFx0XHRpZiAoIW9NRENUYWJsZS5nZXRCaW5kaW5nQ29udGV4dCgpIHx8IG9NRENUYWJsZS5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCkgIT09IG9WaWV3QmluZGluZ0NvbnRleHQ/LmdldFBhdGgoKSkge1xuXHRcdFx0XHRvU3Vic2VjdGlvbi5zZXRCaW5kaW5nQ29udGV4dChvVmlld0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0aWYgKCFvTURDVGFibGUuZ2V0Um93QmluZGluZygpLmlzTGVuZ3RoRmluYWwoKSkge1xuXHRcdFx0XHRcdGFXYWl0Rm9yRGF0YS5wdXNoKFxuXHRcdFx0XHRcdFx0bmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZTogRnVuY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0b01EQ1RhYmxlLmdldFJvd0JpbmRpbmcoKS5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChhV2FpdEZvckRhdGEpXG5cdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0Ly8gdGhlIGNoZWNrTWVzc2FnZXMgY2FsbCB3aWxsIHJlZnJlc2ggdGhlIGNvbnRyb2xJZHMgZm9yIGVhY2ggbWVzc2FnZXNcblx0XHRcdFx0b1ZpZXcuZ2V0TW9kZWwoKS5jaGVja01lc3NhZ2VzKCk7XG5cdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlOiBGdW5jdGlvbikge1xuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHR0aGF0Ll9hcHBseUdyb3VwaW5nKCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZ3JvdXBpbmcgdGhlIG1lc3NhZ2VzIGluIHRoZSBtZXNzYWdlUG9wT3ZlclwiKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgcmV0cmlldmVzIHRoZSB2aXNpYmxlIHNlY3Rpb25zIGZyb20gYW4gb2JqZWN0cGFnZS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9PYmplY3RQYWdlTGF5b3V0IFRoZSBvYmplY3RQYWdlTGF5b3V0IG9iamVjdCBmb3Igd2hpY2ggd2Ugd2FudCB0byByZXRyaWV2ZSB0aGUgdmlzaWJsZSBzZWN0aW9ucy5cblx0ICogQHJldHVybnMge0FycmF5fSBBcnJheSBvZiB2aXNpYmxlIHNlY3Rpb25zLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0Z2V0VmlzaWJsZVNlY3Rpb25zRnJvbU9iamVjdFBhZ2VMYXlvdXQob09iamVjdFBhZ2VMYXlvdXQ6IGFueSkge1xuXHRcdHJldHVybiBvT2JqZWN0UGFnZUxheW91dC5nZXRTZWN0aW9ucygpLmZpbHRlcihmdW5jdGlvbihvU2VjdGlvbjogYW55KSB7XG5cdFx0XHRyZXR1cm4gb1NlY3Rpb24uZ2V0VmlzaWJsZSgpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgdGhhdCBncm91cHMgdGhlIG1lc3NhZ2VzIGJhc2VkIG9uIHRoZSBzZWN0aW9uIG9yIHN1YnNlY3Rpb24gdGhleSBiZWxvbmcgdG8uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfYXBwbHlHcm91cGluZygpIHtcblx0XHR0aGlzLm9PYmplY3RQYWdlTGF5b3V0ID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dCh0aGlzLCB0aGlzLm9PYmplY3RQYWdlTGF5b3V0KTtcblx0XHRpZiAoIXRoaXMub09iamVjdFBhZ2VMYXlvdXQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgYU1lc3NhZ2VzID0gdGhpcy5vTWVzc2FnZVBvcG92ZXIuZ2V0SXRlbXMoKTtcblx0XHRjb25zdCBhU2VjdGlvbnMgPSB0aGlzLmdldFZpc2libGVTZWN0aW9uc0Zyb21PYmplY3RQYWdlTGF5b3V0KHRoaXMub09iamVjdFBhZ2VMYXlvdXQpO1xuXHRcdGNvbnN0IGJFbmFibGVCaW5kaW5nID0gdGhpcy5fY2hlY2tDb250cm9sSWRJblNlY3Rpb25zKGFNZXNzYWdlcywgZmFsc2UpO1xuXHRcdGlmIChiRW5hYmxlQmluZGluZykge1xuXHRcdFx0dGhpcy5fZm5FbmFibGVCaW5kaW5ncyhhU2VjdGlvbnMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWV0aG9kIHJldHJpZXZlcyB0aGUgYmluZGluZyBjb250ZXh0IGZvciB0aGUgcmVmRXJyb3Igb2JqZWN0LlxuXHQgKiBUaGUgcmVmRXJyb3IgY29udGFpbnMgYSBtYXAgdG8gc3RvcmUgdGhlIGluZGV4ZXMgb2YgdGhlIHJvd3Mgd2l0aCBlcnJvcnMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvVGFibGUgVGhlIHRhYmxlIGZvciB3aGljaCB3ZSB3YW50IHRvIGdldCB0aGUgcmVmRXJyb3IgT2JqZWN0LlxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBDb250ZXh0IG9mIHRoZSByZWZFcnJvci5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9nZXRUYWJsZVJlZkVycm9yQ29udGV4dChvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9UYWJsZS5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdC8vaW5pdGlhbGl6ZSB0aGUgcmVmRXJyb3IgcHJvcGVydHkgaWYgaXQgZG9lc24ndCBleGlzdFxuXHRcdGlmICghb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikuZ2V0UHJvcGVydHkoXCJyZWZFcnJvclwiKSkge1xuXHRcdFx0b01vZGVsLnNldFByb3BlcnR5KFwicmVmRXJyb3JcIiwge30sIG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpKTtcblx0XHR9XG5cdFx0Y29uc3Qgc1JlZkVycm9yQ29udGV4dFBhdGggPVxuXHRcdFx0b1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikuZ2V0UGF0aCgpICtcblx0XHRcdFwiL3JlZkVycm9yL1wiICtcblx0XHRcdG9UYWJsZVxuXHRcdFx0XHQuZ2V0QmluZGluZ0NvbnRleHQoKVxuXHRcdFx0XHQuZ2V0UGF0aCgpXG5cdFx0XHRcdC5yZXBsYWNlKFwiL1wiLCBcIiRcIikgK1xuXHRcdFx0XCIkXCIgK1xuXHRcdFx0b1RhYmxlXG5cdFx0XHRcdC5nZXRSb3dCaW5kaW5nKClcblx0XHRcdFx0LmdldFBhdGgoKVxuXHRcdFx0XHQucmVwbGFjZShcIi9cIiwgXCIkXCIpO1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gb01vZGVsLmdldENvbnRleHQoc1JlZkVycm9yQ29udGV4dFBhdGgpO1xuXHRcdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJcIikpIHtcblx0XHRcdG9Nb2RlbC5zZXRQcm9wZXJ0eShcIlwiLCB7fSwgb0NvbnRleHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gb0NvbnRleHQ7XG5cdH1cblxuXHRfZ2V0QmFja2VuZE1lc3NhZ2VUb1JlbW92ZShvVGFibGU6IGFueSwgb01lc3NhZ2VPYmplY3Q6IGFueSwgb0Vycm9yQ29udGV4dDogYW55KSB7XG5cdFx0Ly9UZXN0IGlmIHRoZXJlIGlzIGFscmVhZHkgYSBtZXNzYWdlIGZvciB0aGUgc2FtZSBjb250ZXh0OlxuXHRcdGxldCBvQmFja2VuZE1lc3NhZ2VUb1JlbW92ZTtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX2dldFRhYmxlUmVmRXJyb3JDb250ZXh0KG9UYWJsZSksXG5cdFx0XHRhTWVzc2FnZUlkcyA9IE9iamVjdC5rZXlzKG9Db250ZXh0LmdldFByb3BlcnR5KCkpLmZpbHRlcihmdW5jdGlvbihrZXkpIHtcblx0XHRcdFx0cmV0dXJuIE9iamVjdC5rZXlzKG9Db250ZXh0LmdldFByb3BlcnR5KClba2V5XSkuZXZlcnkoZnVuY3Rpb24oY2hpbGRLZXkpIHtcblx0XHRcdFx0XHRyZXR1cm4ga2V5ICE9PSBvTWVzc2FnZU9iamVjdC5nZXRJZCgpICYmIG9Db250ZXh0LmdldFByb3BlcnR5KClba2V5XVtjaGlsZEtleV0gPT09IG9FcnJvckNvbnRleHRbY2hpbGRLZXldO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pLFxuXHRcdFx0YVZhbGlkTWVzc2FnZUlkcyA9IHNhcC51aVxuXHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdC5nZXRNZXNzYWdlTWFuYWdlcigpXG5cdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdC5tYXAoZnVuY3Rpb24obTogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG0uaWQ7XG5cdFx0XHRcdH0pO1xuXHRcdGlmIChhTWVzc2FnZUlkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRhVmFsaWRNZXNzYWdlSWRzLmluZGV4T2YoYU1lc3NhZ2VJZHNbMF0pO1xuXHRcdFx0b0JhY2tlbmRNZXNzYWdlVG9SZW1vdmUgPSBzYXAudWlcblx0XHRcdFx0LmdldENvcmUoKVxuXHRcdFx0XHQuZ2V0TWVzc2FnZU1hbmFnZXIoKVxuXHRcdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0LmdldERhdGEoKVthVmFsaWRNZXNzYWdlSWRzLmluZGV4T2YoYU1lc3NhZ2VJZHNbMF0pXTtcblx0XHR9XG5cdFx0cmV0dXJuIG9CYWNrZW5kTWVzc2FnZVRvUmVtb3ZlO1xuXHR9XG5cblx0X3VwZGF0ZUludGVybmFsTW9kZWwoXG5cdFx0b1RhYmxlUm93Q29udGV4dDogYW55LFxuXHRcdGlSb3dJbmRleDogbnVtYmVyLFxuXHRcdHNUYWJsZVRhcmdldENvbFByb3BlcnR5OiBzdHJpbmcsXG5cdFx0b1RhYmxlOiBhbnksXG5cdFx0b01lc3NhZ2VPYmplY3Q6IGFueSxcblx0XHRiSXNDcmVhdGlvblJvdz86IGJvb2xlYW5cblx0KSB7XG5cdFx0bGV0IG9UZW1wO1xuXHRcdGlmIChiSXNDcmVhdGlvblJvdykge1xuXHRcdFx0b1RlbXAgPSB7XG5cdFx0XHRcdHJvd0luZGV4OiBcIkNyZWF0aW9uUm93XCIsXG5cdFx0XHRcdHRhcmdldENvbFByb3BlcnR5OiBzVGFibGVUYXJnZXRDb2xQcm9wZXJ0eSA/IHNUYWJsZVRhcmdldENvbFByb3BlcnR5IDogXCJcIlxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1RlbXAgPSB7XG5cdFx0XHRcdHJvd0luZGV4OiBvVGFibGVSb3dDb250ZXh0ID8gaVJvd0luZGV4IDogXCJcIixcblx0XHRcdFx0dGFyZ2V0Q29sUHJvcGVydHk6IHNUYWJsZVRhcmdldENvbFByb3BlcnR5ID8gc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgOiBcIlwiXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRjb25zdCBvTW9kZWwgPSBvVGFibGUuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSxcblx0XHRcdG9Db250ZXh0ID0gdGhpcy5fZ2V0VGFibGVSZWZFcnJvckNvbnRleHQob1RhYmxlKTtcblx0XHQvL3dlIGZpcnN0IHJlbW92ZSB0aGUgZW50cmllcyB3aXRoIG9ic29sZXRlIG1lc3NhZ2UgaWRzIGZyb20gdGhlIGludGVybmFsIG1vZGVsIGJlZm9yZSBpbnNlcnRpbmcgdGhlIG5ldyBlcnJvciBpbmZvIDpcblx0XHRjb25zdCBhVmFsaWRNZXNzYWdlSWRzID0gc2FwLnVpXG5cdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHQuZ2V0TWVzc2FnZU1hbmFnZXIoKVxuXHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHQubWFwKGZ1bmN0aW9uKG1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZS5pZDtcblx0XHRcdH0pO1xuXHRcdGxldCBhT2Jzb2xldGVNZXNzYWdlbElkcztcblx0XHRpZiAob0NvbnRleHQuZ2V0UHJvcGVydHkoKSkge1xuXHRcdFx0YU9ic29sZXRlTWVzc2FnZWxJZHMgPSBPYmplY3Qua2V5cyhvQ29udGV4dC5nZXRQcm9wZXJ0eSgpKS5maWx0ZXIoZnVuY3Rpb24oaW50ZXJuYWxNZXNzYWdlSWQpIHtcblx0XHRcdFx0cmV0dXJuIGFWYWxpZE1lc3NhZ2VJZHMuaW5kZXhPZihpbnRlcm5hbE1lc3NhZ2VJZCkgPT09IC0xO1xuXHRcdFx0fSk7XG5cdFx0XHRhT2Jzb2xldGVNZXNzYWdlbElkcy5mb3JFYWNoKGZ1bmN0aW9uKG9ic29sZXRlSWQpIHtcblx0XHRcdFx0ZGVsZXRlIG9Db250ZXh0LmdldFByb3BlcnR5KClbb2Jzb2xldGVJZF07XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0b01vZGVsLnNldFByb3BlcnR5KFxuXHRcdFx0b01lc3NhZ2VPYmplY3QuZ2V0SWQoKSxcblx0XHRcdE9iamVjdC5hc3NpZ24oe30sIG9Db250ZXh0LmdldFByb3BlcnR5KG9NZXNzYWdlT2JqZWN0LmdldElkKCkpID8gb0NvbnRleHQuZ2V0UHJvcGVydHkob01lc3NhZ2VPYmplY3QuZ2V0SWQoKSkgOiB7fSwgb1RlbXApLFxuXHRcdFx0b0NvbnRleHRcblx0XHQpO1xuXHR9XG5cblx0X2dldENvbnRyb2xGcm9tTWVzc2FnZVJlbGF0aW5nVG9TdWJTZWN0aW9uKHN1YlNlY3Rpb246IGFueSwgbWVzc2FnZTogYW55KSB7XG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMgYXMgTWVzc2FnZUJ1dHRvbjtcblx0XHRjb25zdCBvTWVzc2FnZU9iamVjdCA9IG1lc3NhZ2UuZ2V0QmluZGluZ0NvbnRleHQoXCJtZXNzYWdlXCIpLmdldE9iamVjdCgpO1xuXHRcdGNvbnN0IGFFbGVtZW50cyA9IHN1YlNlY3Rpb25cblx0XHRcdC5maW5kRWxlbWVudHModHJ1ZSwgZnVuY3Rpb24ob0VsZW06IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gdGhhdC5fZm5GaWx0ZXJVcG9uSWRzKG9NZXNzYWdlT2JqZWN0LmdldENvbnRyb2xJZHMoKSwgb0VsZW0pO1xuXHRcdFx0fSlcblx0XHRcdC5zb3J0KGZ1bmN0aW9uKGE6IGFueSwgYjogYW55KSB7XG5cdFx0XHRcdC8vIGNvbnRyb2xzIGFyZSBzb3J0ZWQgaW4gb3JkZXIgdG8gaGF2ZSB0aGUgdGFibGUgb24gdG9wIG9mIHRoZSBhcnJheVxuXHRcdFx0XHQvLyBpdCB3aWxsIGhlbHAgdG8gY29tcHV0ZSB0aGUgc3VidGl0bGUgb2YgdGhlIG1lc3NhZ2UgYmFzZWQgb24gdGhlIHR5cGUgb2YgcmVsYXRlZCBjb250cm9sc1xuXHRcdFx0XHRpZiAoYS5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpICYmICFiLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHR9KTtcblx0XHRyZXR1cm4gYUVsZW1lbnRzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgdGhhdCBzZXRzIGdyb3VwcyBmb3IgdHJhbnNpZW50IG1lc3NhZ2VzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gbWVzc2FnZSBUaGUgbWVzc2FnZSB3ZSB3YW50IHRvIGNvbXB1dGUgZ3JvdXAgYW5kIHN1YnRpdGxlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvbk5hbWUgVGhlIGFjdGlvbiBuYW1lLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblxuXHRfc2V0R3JvdXBMYWJlbEZvclRyYW5zaWVudE1zZyhtZXNzYWdlOiBhbnksIHNBY3Rpb25OYW1lOiBzdHJpbmcpIHtcblx0XHR0aGlzLnNMYXN0QWN0aW9uVGV4dCA9IHRoaXMuc0xhc3RBY3Rpb25UZXh0XG5cdFx0XHQ/IHRoaXMuc0xhc3RBY3Rpb25UZXh0XG5cdFx0XHQ6IChzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIGFueSkuZ2V0VGV4dChcIlRfTUVTU0FHRV9CVVRUT05fU0FQRkVfTUVTU0FHRV9HUk9VUF9MQVNUX0FDVElPTlwiKTtcblxuXHRcdG1lc3NhZ2Uuc2V0R3JvdXBOYW1lKHRoaXMuc0xhc3RBY3Rpb25UZXh0ICsgXCI6IFwiICsgc0FjdGlvbk5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgdGhhdCBncm91cCBtZXNzYWdlcyBhbmQgYWRkIHRoZSBzdWJ0aXRsZS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugd2Ugd2FudCB0byBjb21wdXRlIGdyb3VwIGFuZCBzdWJ0aXRsZS5cblx0ICogQHBhcmFtIHtvYmplY3R9IHNlY3Rpb24gVGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgY29udHJvbHMuXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBzdWJTZWN0aW9uIFRoZSBzdWJzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGNvbnRyb2xzLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gYUVsZW1lbnRzIExpc3Qgb2YgY29udHJvbHMgZnJvbSBhIHN1YnNlY3Rpb24gcmVsYXRlZCB0byBhIG1lc3NhZ2UgLlxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGJNdWx0aXBsZVN1YlNlY3Rpb25zIFRydWUgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiAxIHN1YnNlY3Rpb24gaW4gdGhlIHNlY3Rpb24uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQWN0aW9uTmFtZSBUaGUgYWN0aW9uIG5hbWUuXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFJldHVybiB0aGUgY29udHJvbCB0YXJnZXRlZCBieSB0aGUgbWVzc2FnZS5cblx0ICogQHByaXZhdGVcblx0ICovXG5cblx0X2NvbXB1dGVNZXNzYWdlR3JvdXBBbmRTdWJUaXRsZShcblx0XHRtZXNzYWdlOiBhbnksXG5cdFx0c2VjdGlvbjogYW55LFxuXHRcdHN1YlNlY3Rpb246IGFueSxcblx0XHRhRWxlbWVudHM6IGFueVtdLFxuXHRcdGJNdWx0aXBsZVN1YlNlY3Rpb25zOiBib29sZWFuLFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmdcblx0KSB7XG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMgYXMgTWVzc2FnZUJ1dHRvbjtcblx0XHR0aGlzLm9JdGVtQmluZGluZy5kZXRhY2hDaGFuZ2UodGhpcy5fc2V0TWVzc2FnZURhdGEsIHRoaXMpO1xuXHRcdGNvbnN0IG9NZXNzYWdlT2JqZWN0ID0gbWVzc2FnZS5nZXRCaW5kaW5nQ29udGV4dChcIm1lc3NhZ2VcIikuZ2V0T2JqZWN0KCk7XG5cblx0XHRsZXQgb0VsZW1lbnQsIG9UYWJsZSwgb1RhcmdldFRhYmxlSW5mbzogYW55LCBsLCBpUm93SW5kZXgsIG9UYXJnZXRlZENvbnRyb2wsIG9CYWNrZW5kTWVzc2FnZVRvUmVtb3ZlLCBiSXNDcmVhdGlvblJvdztcblx0XHRjb25zdCBiSXNCYWNrZW5kTWVzc2FnZSA9IG5ldyBSZWdFeHAoXCJeL1wiKS50ZXN0KG9NZXNzYWdlT2JqZWN0LmdldFRhcmdldCgpKSxcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIikgYXMgYW55O1xuXHRcdGlmIChiSXNCYWNrZW5kTWVzc2FnZSkge1xuXHRcdFx0Zm9yIChsID0gMDsgbCA8IGFFbGVtZW50cy5sZW5ndGg7IGwrKykge1xuXHRcdFx0XHRvRWxlbWVudCA9IGFFbGVtZW50c1tsXTtcblx0XHRcdFx0b1RhcmdldGVkQ29udHJvbCA9IG9FbGVtZW50O1xuXHRcdFx0XHRpZiAob0VsZW1lbnQuaXNBKFwic2FwLm0uVGFibGVcIikgfHwgb0VsZW1lbnQuaXNBKFwic2FwLnVpLnRhYmxlLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0b1RhcmdldFRhYmxlSW5mbyA9IHt9O1xuXHRcdFx0XHRcdG9UYWJsZSA9IG9FbGVtZW50LmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8udGFibGVIZWFkZXIgPSBvVGFibGUuZ2V0SGVhZGVyKCk7XG5cdFx0XHRcdFx0Y29uc3Qgb1Jvd0JpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0XHRcdGlmIChvUm93QmluZGluZyAmJiBvUm93QmluZGluZy5pc0xlbmd0aEZpbmFsKCkgJiYgb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgPSB0aGlzLl9nZXRUYWJsZUNvbFByb3BlcnR5KG9UYWJsZSwgb01lc3NhZ2VPYmplY3QpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1RhYmxlQ29sSW5mbyA9IHRoaXMuX2dldFRhYmxlQ29sSW5mbyhvVGFibGUsIG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkpO1xuXHRcdFx0XHRcdFx0b1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dCaW5kaW5nQ29udGV4dHMgPSBvRWxlbWVudC5pc0EoXCJzYXAudWkudGFibGUuVGFibGVcIilcblx0XHRcdFx0XHRcdFx0PyBvUm93QmluZGluZy5nZXRDb250ZXh0cygpXG5cdFx0XHRcdFx0XHRcdDogb1Jvd0JpbmRpbmcuZ2V0Q3VycmVudENvbnRleHRzKCk7XG5cdFx0XHRcdFx0XHRvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbE5hbWUgPSBvVGFibGVDb2xJbmZvLnNUYWJsZVRhcmdldENvbE5hbWU7XG5cdFx0XHRcdFx0XHRvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldFByb3BlcnR5ID0gb1RhcmdldFRhYmxlSW5mby5zVGFibGVUYXJnZXRDb2xQcm9wZXJ0eTtcblx0XHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgPSBvVGFibGVDb2xJbmZvLnNUYWJsZVRhcmdldENvbFByb3BlcnR5O1xuXHRcdFx0XHRcdFx0b1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dDb250ZXh0ID0gb1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dCaW5kaW5nQ29udGV4dHMuZmluZChcblx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24ob01lc3NhZ2VPYmplY3Q6IGFueSwgcm93Q29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJvd0NvbnRleHQgJiYgb01lc3NhZ2VPYmplY3QuZ2V0VGFyZ2V0KCkuaW5kZXhPZihyb3dDb250ZXh0LmdldFBhdGgoKSkgPT09IDA7XG5cdFx0XHRcdFx0XHRcdH0uYmluZCh0aGlzLCBvTWVzc2FnZU9iamVjdClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRsZXQgc0NvbnRyb2xJZDtcblx0XHRcdFx0XHRcdGlmICghb1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdHNDb250cm9sSWQgPSBvTWVzc2FnZU9iamVjdC5jb250cm9sSWRzLmZpbmQoXG5cdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24ob1RhYmxlOiBhbnksIHNJZDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhhdC5fSXNDb250cm9sSW5UYWJsZShvVGFibGUsIHNJZCk7XG5cdFx0XHRcdFx0XHRcdFx0fS5iaW5kKHRoaXMsIG9UYWJsZSlcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChzQ29udHJvbElkKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9Db250cm9sID0gc2FwLnVpLmdldENvcmUoKS5ieUlkKHNDb250cm9sSWQpO1xuXHRcdFx0XHRcdFx0XHRiSXNDcmVhdGlvblJvdyA9IHRoaXMuX0lzQ29udHJvbFBhcnRPZkNyZWF0aW9uUm93KG9Db250cm9sKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuX3NldE1lc3NhZ2VTdWJ0aXRsZShcblx0XHRcdFx0XHRcdFx0bWVzc2FnZSxcblx0XHRcdFx0XHRcdFx0b1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dCaW5kaW5nQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0b1RhcmdldFRhYmxlSW5mby5zVGFibGVUYXJnZXRDb2xOYW1lLFxuXHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0UHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdG9UYWJsZSxcblx0XHRcdFx0XHRcdFx0YklzQ3JlYXRpb25Sb3dcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRpZiAob1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2Zvcm1hdE1lc3NhZ2VEZXNjcmlwdGlvbihcblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlLFxuXHRcdFx0XHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0XHRvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdG9UYWJsZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aVJvd0luZGV4ID0gb1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dDb250ZXh0ICYmIG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93Q29udGV4dC5nZXRJbmRleCgpO1xuXHRcdFx0XHRcdFx0dGhpcy5fdXBkYXRlSW50ZXJuYWxNb2RlbChcblx0XHRcdFx0XHRcdFx0b1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRpUm93SW5kZXgsXG5cdFx0XHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdG9UYWJsZSxcblx0XHRcdFx0XHRcdFx0b01lc3NhZ2VPYmplY3Rcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1lc3NhZ2Uuc2V0QWN0aXZlVGl0bGUodHJ1ZSk7XG5cdFx0XHRcdFx0Ly9jaGVjayBpZiB0aGUgdGFyZ2V0ZWQgY29udHJvbCBpcyBhIGNoaWxkIG9mIG9uZSBvZiB0aGUgb3RoZXIgY29udHJvbHNcblx0XHRcdFx0XHRjb25zdCBiSXNUYXJnZXRlZENvbnRyb2xPcnBoYW4gPSB0aGlzLl9iSXNPcnBoYW5FbGVtZW50KG9UYXJnZXRlZENvbnRyb2wsIGFFbGVtZW50cyk7XG5cdFx0XHRcdFx0aWYgKGJJc1RhcmdldGVkQ29udHJvbE9ycGhhbikge1xuXHRcdFx0XHRcdFx0Ly9zZXQgdGhlIHN1YnRpdGxlXG5cdFx0XHRcdFx0XHRtZXNzYWdlLnNldFN1YnRpdGxlKFwiXCIpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vVGhlcmUgaXMgb25seSBvbmUgZWx0IGFzIHRoaXMgaXMgYSBmcm9udEVuZCBtZXNzYWdlXG5cdFx0XHRvVGFyZ2V0ZWRDb250cm9sID0gYUVsZW1lbnRzWzBdO1xuXHRcdFx0b1RhYmxlID0gdGhpcy5fZ2V0TWRjVGFibGUob1RhcmdldGVkQ29udHJvbCk7XG5cdFx0XHRpZiAob1RhYmxlKSB7XG5cdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8gPSB7fTtcblx0XHRcdFx0b1RhcmdldFRhYmxlSW5mby50YWJsZUhlYWRlciA9IG9UYWJsZS5nZXRIZWFkZXIoKTtcblx0XHRcdFx0Y29uc3QgaVRhcmdldENvbHVtbkluZGV4ID0gdGhpcy5fZ2V0VGFibGVDb2x1bW5JbmRleChvVGFyZ2V0ZWRDb250cm9sKTtcblx0XHRcdFx0b1RhcmdldFRhYmxlSW5mby5zVGFibGVUYXJnZXRDb2xQcm9wZXJ0eSA9XG5cdFx0XHRcdFx0aVRhcmdldENvbHVtbkluZGV4ID4gLTEgPyBvVGFibGUuZ2V0Q29sdW1ucygpW2lUYXJnZXRDb2x1bW5JbmRleF0uZ2V0RGF0YVByb3BlcnR5KCkgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0UHJvcGVydHkgPSBvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbFByb3BlcnR5O1xuXHRcdFx0XHRvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbE5hbWUgPVxuXHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgJiYgaVRhcmdldENvbHVtbkluZGV4ID4gLTFcblx0XHRcdFx0XHRcdD8gb1RhYmxlLmdldENvbHVtbnMoKVtpVGFyZ2V0Q29sdW1uSW5kZXhdLmdldEhlYWRlcigpXG5cdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdFx0YklzQ3JlYXRpb25Sb3cgPSB0aGlzLl9nZXRUYWJsZVJvdyhvVGFyZ2V0ZWRDb250cm9sKS5pc0EoXCJzYXAudWkudGFibGUuQ3JlYXRpb25Sb3dcIik7XG5cdFx0XHRcdGlmICghYklzQ3JlYXRpb25Sb3cpIHtcblx0XHRcdFx0XHRpUm93SW5kZXggPSB0aGlzLl9nZXRUYWJsZVJvd0luZGV4KG9UYXJnZXRlZENvbnRyb2wpO1xuXHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93QmluZGluZ0NvbnRleHRzID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKS5nZXRDdXJyZW50Q29udGV4dHMoKTtcblx0XHRcdFx0XHRvVGFyZ2V0VGFibGVJbmZvLm9UYWJsZVJvd0NvbnRleHQgPSBvVGFyZ2V0VGFibGVJbmZvLm9UYWJsZVJvd0JpbmRpbmdDb250ZXh0c1tpUm93SW5kZXhdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3NldE1lc3NhZ2VTdWJ0aXRsZShcblx0XHRcdFx0XHRtZXNzYWdlLFxuXHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93QmluZGluZ0NvbnRleHRzLFxuXHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93Q29udGV4dCxcblx0XHRcdFx0XHRvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbE5hbWUsXG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0UHJvcGVydHksXG5cdFx0XHRcdFx0b1RhYmxlLFxuXHRcdFx0XHRcdGJJc0NyZWF0aW9uUm93XG5cdFx0XHRcdCk7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUludGVybmFsTW9kZWwoXG5cdFx0XHRcdFx0b1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dDb250ZXh0LFxuXHRcdFx0XHRcdGlSb3dJbmRleCxcblx0XHRcdFx0XHRvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbFByb3BlcnR5LFxuXHRcdFx0XHRcdG9UYWJsZSxcblx0XHRcdFx0XHRvTWVzc2FnZU9iamVjdCxcblx0XHRcdFx0XHRiSXNDcmVhdGlvblJvd1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAob1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dDb250ZXh0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0Vycm9yQ29udGV4dCA9IHtcblx0XHRcdFx0XHRcdHJvd0luZGV4OiBvVGFyZ2V0VGFibGVJbmZvLm9UYWJsZVJvd0NvbnRleHQgPyBpUm93SW5kZXggOiBcIlwiLFxuXHRcdFx0XHRcdFx0dGFyZ2V0Q29sUHJvcGVydHk6IG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgPyBvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbFByb3BlcnR5IDogXCJcIlxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0b0JhY2tlbmRNZXNzYWdlVG9SZW1vdmUgPSB0aGlzLl9nZXRCYWNrZW5kTWVzc2FnZVRvUmVtb3ZlKG9UYWJsZSwgb01lc3NhZ2VPYmplY3QsIG9FcnJvckNvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvTWVzc2FnZU9iamVjdC5wZXJzaXN0ZW50ICYmIHNBY3Rpb25OYW1lKSB7XG5cdFx0XHR0aGlzLl9zZXRHcm91cExhYmVsRm9yVHJhbnNpZW50TXNnKG1lc3NhZ2UsIHNBY3Rpb25OYW1lKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWVzc2FnZS5zZXRHcm91cE5hbWUoXG5cdFx0XHRcdHNlY3Rpb24uZ2V0VGl0bGUoKSArXG5cdFx0XHRcdFx0KHN1YlNlY3Rpb24uZ2V0VGl0bGUoKSAmJiBiTXVsdGlwbGVTdWJTZWN0aW9ucyA/IFwiLCBcIiArIHN1YlNlY3Rpb24uZ2V0VGl0bGUoKSA6IFwiXCIpICtcblx0XHRcdFx0XHQob1RhcmdldFRhYmxlSW5mb1xuXHRcdFx0XHRcdFx0PyBcIiwgXCIgKyBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfTUVTU0FHRV9HUk9VUF9USVRMRV9UQUJMRV9ERU5PTUlOQVRPUlwiKSArIFwiOiBcIiArIG9UYXJnZXRUYWJsZUluZm8udGFibGVIZWFkZXJcblx0XHRcdFx0XHRcdDogXCJcIilcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBzVmlld0lkID0gdGhpcy5fZ2V0Vmlld0lkKHRoaXMuZ2V0SWQoKSk7XG5cdFx0XHRjb25zdCBvVmlldyA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZChzVmlld0lkIGFzIHN0cmluZyk7XG5cdFx0XHRjb25zdCBvTWVzc2FnZVRhcmdldFByb3BlcnR5ID1cblx0XHRcdFx0b01lc3NhZ2VPYmplY3QuZ2V0VGFyZ2V0KCkgJiZcblx0XHRcdFx0b01lc3NhZ2VPYmplY3Rcblx0XHRcdFx0XHQuZ2V0VGFyZ2V0KClcblx0XHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdFx0LnBvcCgpO1xuXHRcdFx0Y29uc3Qgb1VJTW9kZWwgPSBvVmlldz8uZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG9VSU1vZGVsICYmXG5cdFx0XHRcdG9VSU1vZGVsLmdldFByb3BlcnR5KFwiL21lc3NhZ2VUYXJnZXRQcm9wZXJ0eVwiKSAmJlxuXHRcdFx0XHRvTWVzc2FnZVRhcmdldFByb3BlcnR5ICYmXG5cdFx0XHRcdG9NZXNzYWdlVGFyZ2V0UHJvcGVydHkgPT0gb1VJTW9kZWwuZ2V0UHJvcGVydHkoXCIvbWVzc2FnZVRhcmdldFByb3BlcnR5XCIpXG5cdFx0XHQpIHtcblx0XHRcdFx0dGhpcy5vTWVzc2FnZVBvcG92ZXIuZmlyZUFjdGl2ZVRpdGxlUHJlc3MoeyBcIml0ZW1cIjogbWVzc2FnZSB9KTtcblx0XHRcdFx0b1VJTW9kZWwuc2V0UHJvcGVydHkoXCIvbWVzc2FnZVRhcmdldFByb3BlcnR5XCIsIGZhbHNlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5vSXRlbUJpbmRpbmcuYXR0YWNoQ2hhbmdlKHRoaXMuX3NldE1lc3NhZ2VEYXRhLCB0aGlzKTtcblx0XHRpZiAob0JhY2tlbmRNZXNzYWdlVG9SZW1vdmUgJiYgIWJJc0JhY2tlbmRNZXNzYWdlKSB7XG5cdFx0XHQvKlBlbmRpbmcgZnVydGhlciBpbnZlc3RpZ2F0aW9uLCBhbG9uZyB3aXRoIHRoZSBkZWxldGlvbiBvZiB0aGUgYmFja2VuZEVuZCBtZXNzYWdlLFxuXHRcdFx0XHRcdHdlIHJlbW92ZSBhbmQgcmVpbnNlcnQgYWxsIHRoZSBvdGhlciBleGlzdGluZyBtZXNzYWdlcyBmcm9tIHRoZSBtZXNzYWdlIG1hbmFnZXIgdG9cblx0XHRcdFx0XHRtYWtlIHRoZSBoaWdobGlnaHRcdG9mIHRoZSBmaWVsZCBvbiBlcnJvciBwZXJzaXN0ZW50LiovXG5cdFx0XHR0aGlzLl9yZW1vdmVNZXNzYWdlKG9CYWNrZW5kTWVzc2FnZVRvUmVtb3ZlKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9UYXJnZXRlZENvbnRyb2w7XG5cdH1cblxuXHRfY2hlY2tDb250cm9sSWRJblNlY3Rpb25zKGFNZXNzYWdlczogYW55W10sIGJFbmFibGVCaW5kaW5nOiBib29sZWFuKSB7XG5cdFx0bGV0IHNlY3Rpb24sIGFTdWJTZWN0aW9ucywgbWVzc2FnZSwgaSwgaiwgaztcblx0XHR0aGlzLnNHZW5lcmFsR3JvdXBUZXh0ID0gdGhpcy5zR2VuZXJhbEdyb3VwVGV4dFxuXHRcdFx0PyB0aGlzLnNHZW5lcmFsR3JvdXBUZXh0XG5cdFx0XHQ6IChzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIGFueSkuZ2V0VGV4dChcIlRfTUVTU0FHRV9CVVRUT05fU0FQRkVfTUVTU0FHRV9HUk9VUF9HRU5FUkFMXCIpO1xuXHRcdC8vR2V0IGFsbCBzZWN0aW9ucyBmcm9tIHRoZSBvYmplY3QgcGFnZSBsYXlvdXRcblx0XHRjb25zdCBhVmlzaWJsZVNlY3Rpb25zID0gdGhpcy5nZXRWaXNpYmxlU2VjdGlvbnNGcm9tT2JqZWN0UGFnZUxheW91dCh0aGlzLm9PYmplY3RQYWdlTGF5b3V0KTtcblx0XHRpZiAoYVZpc2libGVTZWN0aW9ucykge1xuXHRcdFx0Y29uc3Qgdmlld0lkID0gdGhpcy5fZ2V0Vmlld0lkKHRoaXMuZ2V0SWQoKSk7XG5cdFx0XHRjb25zdCBvVmlldyA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZCh2aWV3SWQgYXMgc3RyaW5nKTtcblx0XHRcdGNvbnN0IHNBY3Rpb25OYW1lID0gb1ZpZXc/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwic0FjdGlvbk5hbWVcIik7XG5cdFx0XHRpZiAoc0FjdGlvbk5hbWUpIHtcblx0XHRcdFx0KG9WaWV3Py5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIGFueSkuc2V0UHJvcGVydHkoXCJzQWN0aW9uTmFtZVwiLCBudWxsKTtcblx0XHRcdH1cblx0XHRcdGZvciAoaSA9IGFNZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuXHRcdFx0XHQvLyBMb29wIG92ZXIgYWxsIG1lc3NhZ2VzXG5cdFx0XHRcdG1lc3NhZ2UgPSBhTWVzc2FnZXNbaV07XG5cdFx0XHRcdGxldCBiSXNHZW5lcmFsR3JvdXBOYW1lID0gdHJ1ZTtcblx0XHRcdFx0Zm9yIChqID0gYVZpc2libGVTZWN0aW9ucy5sZW5ndGggLSAxOyBqID49IDA7IC0taikge1xuXHRcdFx0XHRcdC8vIExvb3Agb3ZlciBhbGwgdmlzaWJsZSBzZWN0aW9uc1xuXHRcdFx0XHRcdHNlY3Rpb24gPSBhVmlzaWJsZVNlY3Rpb25zW2pdO1xuXHRcdFx0XHRcdGFTdWJTZWN0aW9ucyA9IHNlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKTtcblx0XHRcdFx0XHRmb3IgKGsgPSBhU3ViU2VjdGlvbnMubGVuZ3RoIC0gMTsgayA+PSAwOyAtLWspIHtcblx0XHRcdFx0XHRcdC8vIExvb3Agb3ZlciBhbGwgc3ViLXNlY3Rpb25zXG5cdFx0XHRcdFx0XHRjb25zdCBzdWJTZWN0aW9uID0gYVN1YlNlY3Rpb25zW2tdO1xuXHRcdFx0XHRcdFx0Y29uc3QgYUNvbnRyb2xzID0gdGhpcy5fZ2V0Q29udHJvbEZyb21NZXNzYWdlUmVsYXRpbmdUb1N1YlNlY3Rpb24oc3ViU2VjdGlvbiwgbWVzc2FnZSk7XG5cdFx0XHRcdFx0XHRpZiAoYUNvbnRyb2xzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb1RhcmdldGVkQ29udHJvbCA9IHRoaXMuX2NvbXB1dGVNZXNzYWdlR3JvdXBBbmRTdWJUaXRsZShcblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlLFxuXHRcdFx0XHRcdFx0XHRcdHNlY3Rpb24sXG5cdFx0XHRcdFx0XHRcdFx0c3ViU2VjdGlvbixcblx0XHRcdFx0XHRcdFx0XHRhQ29udHJvbHMsXG5cdFx0XHRcdFx0XHRcdFx0YVN1YlNlY3Rpb25zLmxlbmd0aCA+IDEsXG5cdFx0XHRcdFx0XHRcdFx0c0FjdGlvbk5hbWVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0Ly8gaWYgd2UgZm91bmQgdGFibGUgdGhhdCBtYXRjaGVzIHdpdGggdGhlIG1lc3NhZ2UsIHdlIGRvbid0IHN0b3AgdGhlIGxvb3Bcblx0XHRcdFx0XHRcdFx0Ly8gaW4gY2FzZSB3ZSBmaW5kIGFuIGFkZGl0aW9uYWwgY29udHJvbCAoZWcgbWRjIGZpZWxkKSB0aGF0IGFsc28gbWF0Y2ggd2l0aCB0aGUgbWVzc2FnZVxuXHRcdFx0XHRcdFx0XHRpZiAob1RhcmdldGVkQ29udHJvbCAmJiAhb1RhcmdldGVkQ29udHJvbC5pc0EoXCJzYXAubS5UYWJsZVwiKSAmJiAhb1RhcmdldGVkQ29udHJvbC5pc0EoXCJzYXAudWkudGFibGUuVGFibGVcIikpIHtcblx0XHRcdFx0XHRcdFx0XHRqID0gayA9IC0xO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJJc0dlbmVyYWxHcm91cE5hbWUgPSBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGJJc0dlbmVyYWxHcm91cE5hbWUpIHtcblx0XHRcdFx0XHRjb25zdCBvTWVzc2FnZU9iamVjdCA9IG1lc3NhZ2UuZ2V0QmluZGluZ0NvbnRleHQoXCJtZXNzYWdlXCIpLmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdG1lc3NhZ2Uuc2V0QWN0aXZlVGl0bGUoZmFsc2UpO1xuXHRcdFx0XHRcdGlmIChvTWVzc2FnZU9iamVjdC5wZXJzaXN0ZW50ICYmIHNBY3Rpb25OYW1lKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRHcm91cExhYmVsRm9yVHJhbnNpZW50TXNnKG1lc3NhZ2UsIHNBY3Rpb25OYW1lKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bWVzc2FnZS5zZXRHcm91cE5hbWUodGhpcy5zR2VuZXJhbEdyb3VwVGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghYkVuYWJsZUJpbmRpbmcgJiYgbWVzc2FnZS5nZXRHcm91cE5hbWUoKSA9PT0gdGhpcy5zR2VuZXJhbEdyb3VwVGV4dCAmJiB0aGlzLl9maW5kVGFyZ2V0Rm9yTWVzc2FnZShtZXNzYWdlKSkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2ZpbmRUYXJnZXRGb3JNZXNzYWdlKG1lc3NhZ2U6IGFueSkge1xuXHRcdGNvbnN0IG1lc3NhZ2VPYmplY3QgPSBtZXNzYWdlLmdldEJpbmRpbmdDb250ZXh0KFwibWVzc2FnZVwiKSAmJiBtZXNzYWdlLmdldEJpbmRpbmdDb250ZXh0KFwibWVzc2FnZVwiKS5nZXRPYmplY3QoKTtcblx0XHRpZiAobWVzc2FnZU9iamVjdCAmJiBtZXNzYWdlT2JqZWN0LnRhcmdldCkge1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9XG5cdFx0XHRcdFx0dGhpcy5vT2JqZWN0UGFnZUxheW91dCAmJiB0aGlzLm9PYmplY3RQYWdlTGF5b3V0LmdldE1vZGVsKCkgJiYgdGhpcy5vT2JqZWN0UGFnZUxheW91dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRjb250ZXh0UGF0aCA9IG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChtZXNzYWdlT2JqZWN0LnRhcmdldCksXG5cdFx0XHRcdG9Db250ZXh0UGF0aE1ldGFkYXRhID0gb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdChjb250ZXh0UGF0aCk7XG5cdFx0XHRpZiAob0NvbnRleHRQYXRoTWV0YWRhdGEgJiYgb0NvbnRleHRQYXRoTWV0YWRhdGEuJGtpbmQgPT0gXCJQcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9mbkVuYWJsZUJpbmRpbmdzKGFTZWN0aW9uczogYW55W10pIHtcblx0XHRpZiAoVXJpUGFyYW1ldGVycy5mcm9tUXVlcnkod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KFwic2FwLWZlLXh4LWxhenlsb2FkaW5ndGVzdFwiKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRmb3IgKGxldCBpU2VjdGlvbiA9IDA7IGlTZWN0aW9uIDwgYVNlY3Rpb25zLmxlbmd0aDsgaVNlY3Rpb24rKykge1xuXHRcdFx0Y29uc3Qgb1NlY3Rpb24gPSBhU2VjdGlvbnNbaVNlY3Rpb25dO1xuXHRcdFx0bGV0IG5vblRhYmxlQ2hhcnRjb250cm9sRm91bmQgPSBmYWxzZTtcblx0XHRcdGNvbnN0IGFTdWJTZWN0aW9ucyA9IG9TZWN0aW9uLmdldFN1YlNlY3Rpb25zKCk7XG5cdFx0XHRmb3IgKGxldCBpU3ViU2VjdGlvbiA9IDA7IGlTdWJTZWN0aW9uIDwgYVN1YlNlY3Rpb25zLmxlbmd0aDsgaVN1YlNlY3Rpb24rKykge1xuXHRcdFx0XHRjb25zdCBvU3ViU2VjdGlvbiA9IGFTdWJTZWN0aW9uc1tpU3ViU2VjdGlvbl07XG5cdFx0XHRcdGNvbnN0IG9BbGxCbG9ja3MgPSBvU3ViU2VjdGlvbi5nZXRCbG9ja3MoKTtcblx0XHRcdFx0aWYgKG9BbGxCbG9ja3MpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBibG9jayA9IDA7IGJsb2NrIDwgb1N1YlNlY3Rpb24uZ2V0QmxvY2tzKCkubGVuZ3RoOyBibG9jaysrKSB7XG5cdFx0XHRcdFx0XHRpZiAob0FsbEJsb2Nrc1tibG9ja10uZ2V0Q29udGVudCAmJiAhb0FsbEJsb2Nrc1tibG9ja10uZ2V0Q29udGVudCgpLmlzQShcInNhcC5mZS5tYWNyb3MuVGFibGVBUElcIikpIHtcblx0XHRcdFx0XHRcdFx0bm9uVGFibGVDaGFydGNvbnRyb2xGb3VuZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAobm9uVGFibGVDaGFydGNvbnRyb2xGb3VuZCkge1xuXHRcdFx0XHRcdFx0b1N1YlNlY3Rpb24uc2V0QmluZGluZ0NvbnRleHQodW5kZWZpbmVkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9TdWJTZWN0aW9uLmdldEJpbmRpbmdDb250ZXh0KCkgJiYgdGhpcy5fZmluZE1lc3NhZ2VHcm91cEFmdGVyUmViaW5kaW5nKCkpIHtcblx0XHRcdFx0XHRvU3ViU2VjdGlvblxuXHRcdFx0XHRcdFx0LmdldEJpbmRpbmdDb250ZXh0KClcblx0XHRcdFx0XHRcdC5nZXRCaW5kaW5nKClcblx0XHRcdFx0XHRcdC5hdHRhY2hEYXRhUmVjZWl2ZWQodGhpcy5fZmluZE1lc3NhZ2VHcm91cEFmdGVyUmViaW5kaW5nKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2ZpbmRNZXNzYWdlR3JvdXBBZnRlclJlYmluZGluZygpIHtcblx0XHRjb25zdCBhTWVzc2FnZXMgPSB0aGlzLm9NZXNzYWdlUG9wb3Zlci5nZXRJdGVtcygpO1xuXHRcdHRoaXMuX2NoZWNrQ29udHJvbElkSW5TZWN0aW9ucyhhTWVzc2FnZXMsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgdGhhdCByZXRyaWV2ZXMgdGhlIHZpZXcgSUQgKEhUTUxWaWV3L1hNTFZpZXcvSlNPTnZpZXcvSlNWaWV3L1RlbXBsYXRldmlldykgb2YgYW55IGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQ29udHJvbElkIElEIG9mIHRoZSBjb250cm9sIG5lZWRlZCB0byByZXRyaWV2ZSB0aGUgdmlldyBJRFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgdmlldyBJRCBvZiB0aGUgY29udHJvbFxuXHQgKi9cblx0X2dldFZpZXdJZChzQ29udHJvbElkOiBzdHJpbmcpIHtcblx0XHRsZXQgc1ZpZXdJZCxcblx0XHRcdG9Db250cm9sID0gc2FwLnVpLmdldENvcmUoKS5ieUlkKHNDb250cm9sSWQpIGFzIGFueTtcblx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdGlmIChvQ29udHJvbCBpbnN0YW5jZW9mIFZpZXcpIHtcblx0XHRcdFx0c1ZpZXdJZCA9IG9Db250cm9sLmdldElkKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0b0NvbnRyb2wgPSBvQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNWaWV3SWQ7XG5cdH1cblxuXHRfc2V0TG9uZ3RleHRVcmxEZXNjcmlwdGlvbihzTWVzc2FnZURlc2NyaXB0aW9uQ29udGVudDogc3RyaW5nLCBvRGlhZ25vc2lzVGl0bGU6IGFueSkge1xuXHRcdHRoaXMub01lc3NhZ2VQb3BvdmVyLnNldEFzeW5jRGVzY3JpcHRpb25IYW5kbGVyKGZ1bmN0aW9uKGNvbmZpZzogYW55KSB7XG5cdFx0XHQvLyBUaGlzIHN0b3JlcyB0aGUgb2xkIGRlc2NyaXB0aW9uXG5cdFx0XHRjb25zdCBzT2xkRGVzY3JpcHRpb24gPSBzTWVzc2FnZURlc2NyaXB0aW9uQ29udGVudDtcblx0XHRcdC8vIEhlcmUgd2UgY2FuIGZldGNoIHRoZSBkYXRhIGFuZCBjb25jYXRlbmF0ZSBpdCB0byB0aGUgb2xkIG9uZVxuXHRcdFx0Ly8gQnkgZGVmYXVsdCwgdGhlIGxvbmd0ZXh0VXJsIGZldGNoaW5nIHdpbGwgb3ZlcndyaXRlIHRoZSBkZXNjcmlwdGlvbiAod2l0aCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIpXG5cdFx0XHQvLyBIZXJlIGFzIHdlIGhhdmUgb3ZlcndyaXR0ZW4gdGhlIGRlZmF1bHQgYXN5bmMgaGFuZGxlciwgd2hpY2ggZmV0Y2hlcyBhbmQgcmVwbGFjZXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBpdGVtXG5cdFx0XHQvLyB3ZSBjYW4gbWFudWFsbHkgbW9kaWZ5IGl0IHRvIGluY2x1ZGUgd2hhdGV2ZXIgbmVlZGVkLlxuXHRcdFx0Y29uc3Qgc0xvbmdUZXh0VXJsID0gY29uZmlnLml0ZW0uZ2V0TG9uZ3RleHRVcmwoKTtcblx0XHRcdGlmIChzTG9uZ1RleHRVcmwpIHtcblx0XHRcdFx0alF1ZXJ5LmFqYXgoe1xuXHRcdFx0XHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0XHRcdFx0dXJsOiBzTG9uZ1RleHRVcmwsXG5cdFx0XHRcdFx0c3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0RpYWdub3Npc1RleHQgPSBvRGlhZ25vc2lzVGl0bGUuZ2V0SHRtbFRleHQoKSArIGRhdGE7XG5cdFx0XHRcdFx0XHRjb25maWcuaXRlbS5zZXREZXNjcmlwdGlvbihzT2xkRGVzY3JpcHRpb24gKyBcIlwiICsgc0RpYWdub3Npc1RleHQpO1xuXHRcdFx0XHRcdFx0Y29uZmlnLnByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZXJyb3I6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0Y29uZmlnLml0ZW0uc2V0RGVzY3JpcHRpb24oc01lc3NhZ2VEZXNjcmlwdGlvbkNvbnRlbnQpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0Vycm9yID0gXCJBIHJlcXVlc3QgaGFzIGZhaWxlZCBmb3IgbG9uZyB0ZXh0IGRhdGEuIFVSTDogXCIgKyBzTG9uZ1RleHRVcmw7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3Ioc0Vycm9yKTtcblx0XHRcdFx0XHRcdGNvbmZpZy5wcm9taXNlLnJlamVjdChzRXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRfZm9ybWF0TWVzc2FnZURlc2NyaXB0aW9uKG1lc3NhZ2U6IGFueSwgb1RhYmxlUm93Q29udGV4dDogYW55LCBzVGFibGVUYXJnZXRDb2xOYW1lOiBzdHJpbmcsIG9SZXNvdXJjZUJ1bmRsZTogYW55LCBvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IHNUYWJsZUZpcnN0Q29sUHJvcGVydHkgPSB0aGlzLl9nZXRUYWJsZUZpcnN0Q29sUHJvcGVydHkob1RhYmxlKTtcblx0XHRsZXQgc0NvbHVtbkluZm8gPSBcIlwiO1xuXHRcdGNvbnN0IG9Db2xGcm9tVGFibGVTZXR0aW5ncyA9IHRoaXMuX2ZldGNoQ29sdW1uSW5mbyhtZXNzYWdlLCBvVGFibGUpO1xuXHRcdGlmIChzVGFibGVUYXJnZXRDb2xOYW1lKSB7XG5cdFx0XHQvLyBpZiBjb2x1bW4gaW4gcHJlc2VudCBpbiB0YWJsZSBkZWZpbml0aW9uXG5cdFx0XHRzQ29sdW1uSW5mbyA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0dST1VQX0RFU0NSSVBUSU9OX1RBQkxFX0NPTFVNTlwiKSArIFwiOiBcIiArIHNUYWJsZVRhcmdldENvbE5hbWU7XG5cdFx0fSBlbHNlIGlmIChvQ29sRnJvbVRhYmxlU2V0dGluZ3MpIHtcblx0XHRcdGlmIChvQ29sRnJvbVRhYmxlU2V0dGluZ3MuYXZhaWxhYmlsaXR5ID09PSBcIkhpZGRlblwiKSB7XG5cdFx0XHRcdC8vIGlmIGNvbHVtbiBpbiBuZWl0aGVyIGluIHRhYmxlIGRlZmluaXRpb24gbm9yIHBlcnNvbmFsaXphdGlvblxuXHRcdFx0XHRpZiAobWVzc2FnZS5nZXRUeXBlKCkgPT09IFwiRXJyb3JcIikge1xuXHRcdFx0XHRcdHNDb2x1bW5JbmZvID1cblx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9DT0xVTU5fQVZBSUxBQkxFX0RJQUdOT1NJU19NU0dERVNDX0VSUk9SXCIpICtcblx0XHRcdFx0XHRcdFwiIFwiICtcblx0XHRcdFx0XHRcdG9UYWJsZVJvd0NvbnRleHQuZ2V0VmFsdWUoc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c0NvbHVtbkluZm8gPVxuXHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJUX0NPTFVNTl9BVkFJTEFCTEVfRElBR05PU0lTX01TR0RFU0NcIikgK1xuXHRcdFx0XHRcdFx0XCIgXCIgK1xuXHRcdFx0XHRcdFx0b1RhYmxlUm93Q29udGV4dC5nZXRWYWx1ZShzVGFibGVGaXJzdENvbFByb3BlcnR5KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gaWYgY29sdW1uIGlzIG5vdCBpbiB0YWJsZSBkZWZpbml0aW9uIGJ1dCBpbiBwZXJzb25hbGl6YXRpb25cblx0XHRcdFx0c0NvbHVtbkluZm8gPVxuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0dST1VQX0RFU0NSSVBUSU9OX1RBQkxFX0NPTFVNTlwiKSArXG5cdFx0XHRcdFx0XCI6IFwiICtcblx0XHRcdFx0XHRvQ29sRnJvbVRhYmxlU2V0dGluZ3MubGFiZWwgK1xuXHRcdFx0XHRcdFwiIChcIiArXG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJUX0NPTFVNTl9JTkRJQ0FUT1JfSU5fVEFCTEVfREVGSU5JVElPTlwiKSArXG5cdFx0XHRcdFx0XCIpXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IG9GaWVsZHNBZmZlY3RlZFRpdGxlID0gbmV3IEZvcm1hdHRlZFRleHQoe1xuXHRcdFx0aHRtbFRleHQ6IFwiPGh0bWw+PGJvZHk+PHN0cm9uZz5cIiArIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9GSUVMRFNfQUZGRUNURURfVElUTEVcIikgKyBcIjwvc3Ryb25nPjwvYm9keT48L2h0bWw+PGJyPlwiXG5cdFx0fSk7XG5cdFx0Y29uc3Qgc0ZpZWxkQWZmZWN0ZWRUZXh0ID1cblx0XHRcdG9GaWVsZHNBZmZlY3RlZFRpdGxlLmdldEh0bWxUZXh0KCkgK1xuXHRcdFx0XCI8YnI+XCIgK1xuXHRcdFx0b1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJUX01FU1NBR0VfR1JPVVBfVElUTEVfVEFCTEVfREVOT01JTkFUT1JcIikgK1xuXHRcdFx0XCI6IFwiICtcblx0XHRcdG9UYWJsZS5nZXRIZWFkZXIoKSArXG5cdFx0XHRcIjxicj5cIiArXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfTUVTU0FHRV9HUk9VUF9ERVNDUklQVElPTl9UQUJMRV9ST1dcIikgK1xuXHRcdFx0XCI6IFwiICtcblx0XHRcdG9UYWJsZVJvd0NvbnRleHQuZ2V0VmFsdWUoc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSkgK1xuXHRcdFx0XCI8YnI+XCIgK1xuXHRcdFx0c0NvbHVtbkluZm8gK1xuXHRcdFx0XCI8YnI+XCI7XG5cdFx0Y29uc3Qgb0RpYWdub3Npc1RpdGxlID0gbmV3IEZvcm1hdHRlZFRleHQoe1xuXHRcdFx0aHRtbFRleHQ6IFwiPGh0bWw+PGJvZHk+PHN0cm9uZz5cIiArIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9ESUFHTk9TSVNfVElUTEVcIikgKyBcIjwvc3Ryb25nPjwvYm9keT48L2h0bWw+PGJyPlwiXG5cdFx0fSk7XG5cdFx0Ly8gZ2V0IHRoZSBVSSBtZXNzYWdlcyBmcm9tIHRoZSBtZXNzYWdlIGNvbnRleHQgdG8gc2V0IGl0IHRvIERpYWdub3NpcyBzZWN0aW9uXG5cdFx0Y29uc3Qgc1VJTWVzc2FnZURlc2NyaXB0aW9uID0gbWVzc2FnZS5nZXRCaW5kaW5nQ29udGV4dChcIm1lc3NhZ2VcIikuZ2V0T2JqZWN0KCkuZGVzY3JpcHRpb247XG5cdFx0Ly9zZXQgdGhlIGRlc2NyaXB0aW9uIHRvIG51bGwgdG8gcmVzZXQgaXQgYmVsb3dcblx0XHRtZXNzYWdlLnNldERlc2NyaXB0aW9uKG51bGwpO1xuXHRcdGxldCBzRGlhZ25vc2lzVGV4dCA9IFwiXCI7XG5cdFx0bGV0IHNNZXNzYWdlRGVzY3JpcHRpb25Db250ZW50ID0gXCJcIjtcblx0XHRpZiAobWVzc2FnZS5nZXRMb25ndGV4dFVybCgpKSB7XG5cdFx0XHRzTWVzc2FnZURlc2NyaXB0aW9uQ29udGVudCA9IHNGaWVsZEFmZmVjdGVkVGV4dCArIFwiPGJyPlwiO1xuXHRcdFx0dGhpcy5fc2V0TG9uZ3RleHRVcmxEZXNjcmlwdGlvbihzTWVzc2FnZURlc2NyaXB0aW9uQ29udGVudCwgb0RpYWdub3Npc1RpdGxlKTtcblx0XHR9IGVsc2UgaWYgKHNVSU1lc3NhZ2VEZXNjcmlwdGlvbikge1xuXHRcdFx0c0RpYWdub3Npc1RleHQgPSBvRGlhZ25vc2lzVGl0bGUuZ2V0SHRtbFRleHQoKSArIFwiPGJyPlwiICsgc1VJTWVzc2FnZURlc2NyaXB0aW9uO1xuXHRcdFx0c01lc3NhZ2VEZXNjcmlwdGlvbkNvbnRlbnQgPSBzRmllbGRBZmZlY3RlZFRleHQgKyBcIjxicj5cIiArIHNEaWFnbm9zaXNUZXh0O1xuXHRcdFx0bWVzc2FnZS5zZXREZXNjcmlwdGlvbihzTWVzc2FnZURlc2NyaXB0aW9uQ29udGVudCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1lc3NhZ2Uuc2V0RGVzY3JpcHRpb24oc0ZpZWxkQWZmZWN0ZWRUZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHNldCB0aGUgYnV0dG9uIHRleHQsIGNvdW50IGFuZCBpY29uIHByb3BlcnR5IGJhc2VkIHVwb24gdGhlIG1lc3NhZ2UgaXRlbXNcblx0ICogQnV0dG9uVHlwZTogIFBvc3NpYmxlIHNldHRpbmdzIGZvciB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcyBhcmUgJ2NyaXRpY2FsJyBhbmQgJ25lZ2F0aXZlJy5cblx0ICpcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9zZXRNZXNzYWdlRGF0YSgpIHtcblx0XHRjbGVhclRpbWVvdXQodGhpcy5fc2V0TWVzc2FnZURhdGFUaW1lb3V0KTtcblx0XHRjb25zdCB0aGF0ID0gdGhpcyBhcyBNZXNzYWdlQnV0dG9uO1xuXG5cdFx0dGhpcy5fc2V0TWVzc2FnZURhdGFUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRcdGNvbnN0IHNJY29uID0gXCJcIixcblx0XHRcdFx0b01lc3NhZ2VzID0gdGhhdC5vTWVzc2FnZVBvcG92ZXIuZ2V0SXRlbXMoKSxcblx0XHRcdFx0b01lc3NhZ2VDb3VudDogYW55ID0geyBFcnJvcjogMCwgV2FybmluZzogMCwgU3VjY2VzczogMCwgSW5mb3JtYXRpb246IDAgfSxcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlID0gc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSBhcyBhbnksXG5cdFx0XHRcdGlNZXNzYWdlTGVuZ3RoID0gb01lc3NhZ2VzLmxlbmd0aDtcblx0XHRcdGxldCBzQnV0dG9uVHlwZSA9IEJ1dHRvblR5cGUuRGVmYXVsdCxcblx0XHRcdFx0c01lc3NhZ2VLZXkgPSBcIlwiLFxuXHRcdFx0XHRzVG9vbHRpcFRleHQgPSBcIlwiLFxuXHRcdFx0XHRzTWVzc2FnZVRleHQgPSBcIlwiO1xuXHRcdFx0aWYgKGlNZXNzYWdlTGVuZ3RoID4gMCkge1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGlNZXNzYWdlTGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRpZiAoIW9NZXNzYWdlc1tpXS5nZXRUeXBlKCkgfHwgb01lc3NhZ2VzW2ldLmdldFR5cGUoKSA9PSBcIlwiKSB7XG5cdFx0XHRcdFx0XHQrK29NZXNzYWdlQ291bnRbXCJJbmZvcm1hdGlvblwiXTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0KytvTWVzc2FnZUNvdW50W29NZXNzYWdlc1tpXS5nZXRUeXBlKCldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob01lc3NhZ2VDb3VudFtNZXNzYWdlVHlwZS5FcnJvcl0gPiAwKSB7XG5cdFx0XHRcdFx0c0J1dHRvblR5cGUgPSBCdXR0b25UeXBlLk5lZ2F0aXZlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9NZXNzYWdlQ291bnRbTWVzc2FnZVR5cGUuV2FybmluZ10gPiAwKSB7XG5cdFx0XHRcdFx0c0J1dHRvblR5cGUgPSBCdXR0b25UeXBlLkNyaXRpY2FsO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9NZXNzYWdlQ291bnRbTWVzc2FnZVR5cGUuU3VjY2Vzc10gPiAwKSB7XG5cdFx0XHRcdFx0c0J1dHRvblR5cGUgPSBCdXR0b25UeXBlLlN1Y2Nlc3M7XG5cdFx0XHRcdH0gZWxzZSBpZiAob01lc3NhZ2VDb3VudFtNZXNzYWdlVHlwZS5JbmZvcm1hdGlvbl0gPiAwKSB7XG5cdFx0XHRcdFx0c0J1dHRvblR5cGUgPSBCdXR0b25UeXBlLk5ldXRyYWw7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9NZXNzYWdlQ291bnQuRXJyb3IgPiAwKSB7XG5cdFx0XHRcdFx0dGhhdC5zZXRUZXh0KG9NZXNzYWdlQ291bnQuRXJyb3IpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoYXQuc2V0VGV4dChcIlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob01lc3NhZ2VDb3VudC5FcnJvciA9PT0gMSkge1xuXHRcdFx0XHRcdHNNZXNzYWdlS2V5ID0gXCJDX0NPTU1PTl9TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX0VSUk9SXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAob01lc3NhZ2VDb3VudC5FcnJvciA+IDEpIHtcblx0XHRcdFx0XHRzTWVzc2FnZUtleSA9IFwiQ19DT01NT05fU0FQRkVfRVJST1JfTUVTU0FHRVNfUEFHRV9NVUxUSVBMRV9FUlJPUl9UT09MVElQXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIW9NZXNzYWdlQ291bnQuRXJyb3IgJiYgb01lc3NhZ2VDb3VudC5XYXJuaW5nKSB7XG5cdFx0XHRcdFx0c01lc3NhZ2VLZXkgPSBcIkNfQ09NTU9OX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfV0FSTklOR19UT09MVElQXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIW9NZXNzYWdlQ291bnQuRXJyb3IgJiYgIW9NZXNzYWdlQ291bnQuV2FybmluZyAmJiBvTWVzc2FnZUNvdW50LkluZm9ybWF0aW9uKSB7XG5cdFx0XHRcdFx0c01lc3NhZ2VLZXkgPSBcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX0lORk9cIjtcblx0XHRcdFx0fSBlbHNlIGlmICghb01lc3NhZ2VDb3VudC5FcnJvciAmJiAhb01lc3NhZ2VDb3VudC5XYXJuaW5nICYmICFvTWVzc2FnZUNvdW50LkluZm9ybWF0aW9uICYmIG9NZXNzYWdlQ291bnQuU3VjY2Vzcykge1xuXHRcdFx0XHRcdHNNZXNzYWdlS2V5ID0gXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfRVJST1JfTUVTU0FHRVNfUEFHRV9USVRMRV9TVUNDRVNTXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHNNZXNzYWdlS2V5KSB7XG5cdFx0XHRcdFx0c01lc3NhZ2VUZXh0ID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoc01lc3NhZ2VLZXkpO1xuXHRcdFx0XHRcdHNUb29sdGlwVGV4dCA9IG9NZXNzYWdlQ291bnQuRXJyb3IgPyBvTWVzc2FnZUNvdW50LkVycm9yICsgXCIgXCIgKyBzTWVzc2FnZVRleHQgOiBzTWVzc2FnZVRleHQ7XG5cdFx0XHRcdFx0dGhhdC5zZXRUb29sdGlwKHNUb29sdGlwVGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhhdC5zZXRJY29uKHNJY29uKTtcblx0XHRcdFx0dGhhdC5zZXRUeXBlKHNCdXR0b25UeXBlKTtcblx0XHRcdFx0dGhhdC5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0XHRjb25zdCBvVmlldyA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZCh0aGF0LnNWaWV3SWQpIGFzIFZpZXc7XG5cdFx0XHRcdGlmIChvVmlldykge1xuXHRcdFx0XHRcdGNvbnN0IG9QYWdlUmVhZHkgPSAob1ZpZXcuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5wYWdlUmVhZHk7XG5cdFx0XHRcdFx0b1BhZ2VSZWFkeVxuXHRcdFx0XHRcdFx0LndhaXRQYWdlUmVhZHkoKVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGF0Ll9hcHBseUdyb3VwaW5nQXN5bmMob1ZpZXcpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHQodGhhdCBhcyBhbnkpLmZpcmVNZXNzYWdlQ2hhbmdlKHtcblx0XHRcdFx0XHRcdFx0XHRpTWVzc2FnZUxlbmd0aDogaU1lc3NhZ2VMZW5ndGhcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJmYWlsIGdyb3VwaW5nIG1lc3NhZ2VzXCIpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGlNZXNzYWdlTGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdHRoYXQub01lc3NhZ2VQb3BvdmVyLm5hdmlnYXRlQmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGF0LnNldFZpc2libGUoZmFsc2UpO1xuXHRcdFx0XHQodGhhdCBhcyBhbnkpLmZpcmVNZXNzYWdlQ2hhbmdlKHtcblx0XHRcdFx0XHRpTWVzc2FnZUxlbmd0aDogaU1lc3NhZ2VMZW5ndGhcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSwgMTAwKTtcblx0fVxuXG5cdF9iSXNPcnBoYW5FbGVtZW50KG9FbGVtZW50OiBhbnksIGFFbGVtZW50czogYW55W10pIHtcblx0XHRyZXR1cm4gIWFFbGVtZW50cy5zb21lKFxuXHRcdFx0ZnVuY3Rpb24ob0VsZW1lbnQ6IGFueSwgb0VsZW06IGFueSkge1xuXHRcdFx0XHRsZXQgb1BhcmVudEVsZW1lbnQgPSBvRWxlbWVudC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0d2hpbGUgKG9QYXJlbnRFbGVtZW50ICYmIG9QYXJlbnRFbGVtZW50ICE9PSBvRWxlbSkge1xuXHRcdFx0XHRcdG9QYXJlbnRFbGVtZW50ID0gb1BhcmVudEVsZW1lbnQuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG9QYXJlbnRFbGVtZW50ID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdFx0fS5iaW5kKHRoaXMsIG9FbGVtZW50KVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCB3aGVuIGEgdXNlciBjbGlja3Mgb24gdGhlIHRpdGxlIG9mIHRoZSBtZXNzYWdlLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2FjdGl2ZVRpdGxlUHJlc3Ncblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtFdmVudH0gb0V2ZW50IEV2ZW50IG9iamVjdCBwYXNzZWQgZnJvbSB0aGUgaGFuZGxlclxuXHQgKi9cblx0X2FjdGl2ZVRpdGxlUHJlc3Mob0V2ZW50OiBDb3JlRXZlbnQpIHtcblx0XHRjb25zdCB0aGF0ID0gdGhpcyBhcyBNZXNzYWdlQnV0dG9uO1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0QmluZGluZ0NvbnRleHQoXCJwYWdlSW50ZXJuYWxcIik7XG5cdFx0KG9JbnRlcm5hbE1vZGVsQ29udGV4dCBhcyBhbnkpLnNldFByb3BlcnR5KFwiZXJyb3JOYXZpZ2F0aW9uU2VjdGlvbkZsYWdcIiwgdHJ1ZSk7XG5cdFx0Y29uc3Qgb0l0ZW0gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiaXRlbVwiKSxcblx0XHRcdG9NZXNzYWdlID0gb0l0ZW0uZ2V0QmluZGluZ0NvbnRleHQoXCJtZXNzYWdlXCIpLmdldE9iamVjdCgpLFxuXHRcdFx0YklzQmFja2VuZE1lc3NhZ2UgPSBuZXcgUmVnRXhwKFwiXi9cIikudGVzdChvTWVzc2FnZS5nZXRUYXJnZXQoKSksXG5cdFx0XHRvVmlldyA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZCh0aGlzLnNWaWV3SWQpIGFzIFZpZXcsXG5cdFx0XHRvTWVzc2FnZVBvcG92ZXIgPSB0aGlzLm9NZXNzYWdlUG9wb3Zlcjtcblx0XHRsZXQgb0NvbnRyb2wsIHNTZWN0aW9uVGl0bGU7XG5cblx0XHRpZiAob01lc3NhZ2VQb3BvdmVyICYmIG9NZXNzYWdlUG9wb3Zlci5pc09wZW4oKSkge1xuXHRcdFx0b01lc3NhZ2VQb3BvdmVyLmNsb3NlKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgX2ZvY3VzT25NZXNzYWdlVGFyZ2V0Q29udHJvbCA9IGZ1bmN0aW9uKG9NZXNzYWdlOiBhbnksIG9UYXJnZXRNZGNUYWJsZT86IGFueSwgaVJvd0luZGV4PzogbnVtYmVyKSB7XG5cdFx0XHRjb25zdCBhQWxsVmlld0VsZW1lbnRzID0gb1ZpZXcuZmluZEVsZW1lbnRzKHRydWUpO1xuXHRcdFx0Y29uc3QgYUVycm9uZW91c0NvbnRyb2xzID0gb01lc3NhZ2Vcblx0XHRcdFx0LmdldENvbnRyb2xJZHMoKVxuXHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uKHNDb250cm9sSWQ6IHN0cmluZykge1xuXHRcdFx0XHRcdHJldHVybiBhQWxsVmlld0VsZW1lbnRzLnNvbWUoZnVuY3Rpb24ob0VsZW0pIHtcblx0XHRcdFx0XHRcdHJldHVybiBvRWxlbS5nZXRJZCgpID09PSBzQ29udHJvbElkO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQubWFwKGZ1bmN0aW9uKHNDb250cm9sSWQ6IHN0cmluZykge1xuXHRcdFx0XHRcdHJldHVybiBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoc0NvbnRyb2xJZCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgYU5vdFRhYmxlRXJyb25lb3VzQ29udHJvbHMgPSBhRXJyb25lb3VzQ29udHJvbHMuZmlsdGVyKGZ1bmN0aW9uKG9FbGVtOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuICFvRWxlbS5pc0EoXCJzYXAubS5UYWJsZVwiKSAmJiAhb0VsZW0uaXNBKFwic2FwLnVpLnRhYmxlLlRhYmxlXCIpO1xuXHRcdFx0fSk7XG5cdFx0XHQvL1RoZSBmb2N1cyBpcyBzZXQgb24gTm90IFRhYmxlIGNvbnRyb2wgaW4gcHJpb3JpdHlcblx0XHRcdGlmIChhTm90VGFibGVFcnJvbmVvdXNDb250cm9scy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGFOb3RUYWJsZUVycm9uZW91c0NvbnRyb2xzWzBdLmZvY3VzKCk7XG5cdFx0XHR9IGVsc2UgaWYgKGFFcnJvbmVvdXNDb250cm9scy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGFFcnJvbmVvdXNDb250cm9sc1swXS5mb2N1cygpO1xuXHRcdFx0XHRjb25zdCBhVGFyZ2V0TWRjVGFibGVSb3cgPSBvVGFyZ2V0TWRjVGFibGVcblx0XHRcdFx0XHQ/IG9UYXJnZXRNZGNUYWJsZS5maW5kRWxlbWVudHModHJ1ZSwgZnVuY3Rpb24ob0VsZW06IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb0VsZW0uaXNBKFwic2FwLm0uQ29sdW1uTGlzdEl0ZW1cIik7XG5cdFx0XHRcdFx0ICB9KVxuXHRcdFx0XHRcdDogW107XG5cdFx0XHRcdGlmIChhVGFyZ2V0TWRjVGFibGVSb3cubGVuZ3RoID4gMCAmJiBhVGFyZ2V0TWRjVGFibGVSb3dbMF0pIHtcblx0XHRcdFx0XHRjb25zdCBvVGFyZ2V0Um93ID0gYVRhcmdldE1kY1RhYmxlUm93W2lSb3dJbmRleCBhcyBudW1iZXJdO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRDZWxsID0gX2dldFRhcmdldENlbGwob1RhcmdldFJvdywgb01lc3NhZ2UpO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0Q2VsbCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1RhcmdldEZpZWxkID0gb1RhcmdldENlbGwuaXNBKFwic2FwLmZlLm1hY3Jvcy5GaWVsZEFQSVwiKVxuXHRcdFx0XHRcdFx0XHQ/IG9UYXJnZXRDZWxsLmdldENvbnRlbnQoKS5nZXRDb250ZW50RWRpdCgpWzBdXG5cdFx0XHRcdFx0XHRcdDogb1RhcmdldENlbGxcblx0XHRcdFx0XHRcdFx0XHRcdC5nZXRJdGVtcygpWzBdXG5cdFx0XHRcdFx0XHRcdFx0XHQuZ2V0Q29udGVudCgpXG5cdFx0XHRcdFx0XHRcdFx0XHQuZ2V0Q29udGVudEVkaXQoKVswXTtcblx0XHRcdFx0XHRcdG9UYXJnZXRGaWVsZC5mb2N1cygpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBjb250cm9sIG5vdCBmb3VuZCBvbiB0YWJsZVxuXHRcdFx0XHRcdFx0Y29uc3QgZXJyb3JQcm9wZXJ0eSA9IG9NZXNzYWdlXG5cdFx0XHRcdFx0XHRcdC5nZXRUYXJnZXQoKVxuXHRcdFx0XHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdFx0XHRcdC5wb3AoKTtcblx0XHRcdFx0XHRcdGlmIChlcnJvclByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdChvVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbCkuc2V0UHJvcGVydHkoXCIvbWVzc2FnZVRhcmdldFByb3BlcnR5XCIsIGVycm9yUHJvcGVydHkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0KG9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX3JvdXRpbmcubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9UYXJnZXRSb3cuZ2V0QmluZGluZ0NvbnRleHQoKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGZ1bmN0aW9uIF9nZXRUYXJnZXRDZWxsKG9UYXJnZXRSb3c6IGFueSwgb01lc3NhZ2U6IGFueSkge1xuXHRcdFx0Y29uc3Qgb1RhcmdldENlbGwgPSBvTWVzc2FnZS5jb250cm9sSWRzXG5cdFx0XHRcdC5tYXAoZnVuY3Rpb24oc0NvbnRyb2xJZDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0Y29uc3QgaXNDb250cm9sSW5UYWJsZSA9IG9UYXJnZXRSb3cuZmluZEVsZW1lbnRzKHRydWUsIGZ1bmN0aW9uKG9FbGVtOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvRWxlbS5nZXRJZCgpID09PSBzQ29udHJvbElkO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybiBpc0NvbnRyb2xJblRhYmxlLmxlbmd0aCA+IDAgPyBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoc0NvbnRyb2xJZCkgOiBudWxsO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQucmVkdWNlKGZ1bmN0aW9uKGFjYzogYW55LCB2YWw6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiB2YWwgPyB2YWwgOiBhY2M7XG5cdFx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIG9UYXJnZXRDZWxsO1xuXHRcdH1cblxuXHRcdC8vY2hlY2sgaWYgdGhlIHByZXNzZWQgaXRlbSBpcyByZWxhdGVkIHRvIGEgdGFibGUgY29udHJvbFxuXHRcdGlmIChvSXRlbS5nZXRHcm91cE5hbWUoKS5pbmRleE9mKFwiVGFibGU6XCIpICE9PSAtMSkge1xuXHRcdFx0bGV0IG9UYXJnZXRNZGNUYWJsZTogYW55O1xuXHRcdFx0aWYgKGJJc0JhY2tlbmRNZXNzYWdlKSB7XG5cdFx0XHRcdG9UYXJnZXRNZGNUYWJsZSA9IG9NZXNzYWdlLmNvbnRyb2xJZHNcblx0XHRcdFx0XHQubWFwKGZ1bmN0aW9uKHNDb250cm9sSWQ6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0NvbnRyb2wgPSBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoc0NvbnRyb2xJZCk7XG5cdFx0XHRcdFx0XHRjb25zdCBvUGFyZW50Q29udHJvbCA9IG9Db250cm9sICYmIChvQ29udHJvbC5nZXRQYXJlbnQoKSBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9QYXJlbnRDb250cm9sICYmXG5cdFx0XHRcdFx0XHRcdG9QYXJlbnRDb250cm9sLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikgJiZcblx0XHRcdFx0XHRcdFx0b1BhcmVudENvbnRyb2wuZ2V0SGVhZGVyKCkgPT09IG9JdGVtLmdldEdyb3VwTmFtZSgpLnNwbGl0KFwiLCBUYWJsZTogXCIpWzFdXG5cdFx0XHRcdFx0XHRcdD8gb1BhcmVudENvbnRyb2xcblx0XHRcdFx0XHRcdFx0OiBudWxsO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnJlZHVjZShmdW5jdGlvbihhY2M6IGFueSwgdmFsOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiB2YWwgPyB2YWwgOiBhY2M7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvVGFyZ2V0TWRjVGFibGUpIHtcblx0XHRcdFx0XHRzU2VjdGlvblRpdGxlID0gb0l0ZW0uZ2V0R3JvdXBOYW1lKCkuc3BsaXQoXCIsIFwiKVswXTtcblx0XHRcdFx0XHR0aGlzLl9uYXZpZ2F0ZUZyb21NZXNzYWdlVG9TZWN0aW9uVGFibGVJbkljb25UYWJCYXJNb2RlKG9UYXJnZXRNZGNUYWJsZSwgdGhpcy5vT2JqZWN0UGFnZUxheW91dCwgc1NlY3Rpb25UaXRsZSlcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvUmVmRXJyb3JDb250ZXh0ID0gdGhhdC5fZ2V0VGFibGVSZWZFcnJvckNvbnRleHQob1RhcmdldE1kY1RhYmxlKTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb1JlZkVycm9yID0gb1JlZkVycm9yQ29udGV4dC5nZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRcdFx0XHRvSXRlbVxuXHRcdFx0XHRcdFx0XHRcdFx0LmdldEJpbmRpbmdDb250ZXh0KFwibWVzc2FnZVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0LmdldE9iamVjdCgpXG5cdFx0XHRcdFx0XHRcdFx0XHQuZ2V0SWQoKVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBfc2V0Rm9jdXNPblRhcmdldEZpZWxkID0gZnVuY3Rpb24ob1RhcmdldE1kY1RhYmxlOiBhbnksIGlSb3dJbmRleDogbnVtYmVyKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgYVRhcmdldE1kY1RhYmxlUm93ID0gdGhhdC5fZ2V0TWRjVGFibGVSb3dzKG9UYXJnZXRNZGNUYWJsZSksXG5cdFx0XHRcdFx0XHRcdFx0XHRpRmlyc3RWaXNpYmxlUm93ID0gdGhhdC5fZ2V0R3JpZFRhYmxlKG9UYXJnZXRNZGNUYWJsZSkuZ2V0Rmlyc3RWaXNpYmxlUm93KCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGFUYXJnZXRNZGNUYWJsZVJvdy5sZW5ndGggPiAwICYmIGFUYXJnZXRNZGNUYWJsZVJvd1swXSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1RhcmdldFJvdyA9IGFUYXJnZXRNZGNUYWJsZVJvd1tpUm93SW5kZXggLSBpRmlyc3RWaXNpYmxlUm93XSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1RhcmdldENlbGwgPSBfZ2V0VGFyZ2V0Q2VsbChvVGFyZ2V0Um93LCBvTWVzc2FnZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob1RhcmdldENlbGwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1RhcmdldENlbGwuZm9jdXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGNvbnRyb2wgbm90IGZvdW5kIG9uIHRhYmxlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGVycm9yUHJvcGVydHkgPSBvTWVzc2FnZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5nZXRUYXJnZXQoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5zcGxpdChcIi9cIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQucG9wKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChlcnJvclByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG9WaWV3LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsKS5zZXRQcm9wZXJ0eShcIi9tZXNzYWdlVGFyZ2V0UHJvcGVydHlcIiwgZXJyb3JQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0KG9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX3JvdXRpbmcubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9UYXJnZXRSb3cuZ2V0QmluZGluZ0NvbnRleHQoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgdGFyZ2V0Um93OiBvVGFyZ2V0Um93LCB0YXJnZXRDZWxsOiBvVGFyZ2V0Q2VsbCB9O1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4geyB0YXJnZXRSb3c6IG51bGwsIHRhcmdldENlbGw6IG51bGwgfTtcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0aWYgKG9UYXJnZXRNZGNUYWJsZS5kYXRhKFwidGFibGVUeXBlXCIpID09PSBcIkdyaWRUYWJsZVwiICYmIG9SZWZFcnJvci5yb3dJbmRleCAhPT0gXCJcIikge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGlGaXJzdFZpc2libGVSb3cgPSB0aGF0Ll9nZXRHcmlkVGFibGUob1RhcmdldE1kY1RhYmxlKS5nZXRGaXJzdFZpc2libGVSb3coKTtcblx0XHRcdFx0XHRcdFx0XHRvVGFyZ2V0TWRjVGFibGVcblx0XHRcdFx0XHRcdFx0XHRcdC5zY3JvbGxUb0luZGV4KG9SZWZFcnJvci5yb3dJbmRleClcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhVGFyZ2V0TWRjVGFibGVSb3cgPSB0aGF0Ll9nZXRNZGNUYWJsZVJvd3Mob1RhcmdldE1kY1RhYmxlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IGlOZXdGaXJzdFZpc2libGVSb3csIGJTY3JvbGxOZWVkZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhVGFyZ2V0TWRjVGFibGVSb3cubGVuZ3RoID4gMCAmJiBhVGFyZ2V0TWRjVGFibGVSb3dbMF0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpTmV3Rmlyc3RWaXNpYmxlUm93ID0gYVRhcmdldE1kY1RhYmxlUm93WzBdLmdldFBhcmVudCgpLmdldEZpcnN0VmlzaWJsZVJvdygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJTY3JvbGxOZWVkZWQgPSBpRmlyc3RWaXNpYmxlUm93IC0gaU5ld0ZpcnN0VmlzaWJsZVJvdyAhPT0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYlNjcm9sbE5lZWRlZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vVGhlIHNjcm9sbFRvSW5kZXggZnVuY3Rpb24gZG9lcyBub3Qgd2FpdCBmb3IgdGhlIFVJIHVwZGF0ZS4gQXMgYSB3b3JrZGFyb3VuZCwgcGVuZGluZyBhIGZpeCBmcm9tIE1EQyAoQkNQOiAyMTcwMjUxNjMxKSB3ZSB1c2UgdGhlIGV2ZW50IFwiVUlVcGRhdGVkXCIuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1dhaXRDb250cm9sSWRBZGRlZCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNhcC51aS5nZXRDb3JlKCkuYXR0YWNoRXZlbnQoXCJVSVVwZGF0ZWRcIiwgcmVzb2x2ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9XYWl0Q29udHJvbElkQWRkZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0X3NldEZvY3VzT25UYXJnZXRGaWVsZChvVGFyZ2V0TWRjVGFibGUsIG9SZWZFcnJvci5yb3dJbmRleCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZm9jdXNpbmcgb24gZXJyb3JcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChvVGFyZ2V0TWRjVGFibGUuZGF0YShcInRhYmxlVHlwZVwiKSA9PT0gXCJSZXNwb25zaXZlVGFibGVcIiAmJiBvUmVmRXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0XHRfZm9jdXNPbk1lc3NhZ2VUYXJnZXRDb250cm9sKG9NZXNzYWdlLCBvVGFyZ2V0TWRjVGFibGUsIG9SZWZFcnJvci5yb3dJbmRleCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0X2ZvY3VzT25NZXNzYWdlVGFyZ2V0Q29udHJvbChvTWVzc2FnZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkZhaWwgdG8gbmF2aWdhdGUgdG8gRXJyb3IgY29udHJvbFwiKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvQ29udHJvbCA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZChvTWVzc2FnZS5jb250cm9sSWRzWzBdKTtcblx0XHRcdFx0Ly9JZiB0aGUgY29udHJvbCB1bmRlcmx5aW5nIHRoZSBmcm9udEVuZCBtZXNzYWdlIGlzIG5vdCB3aXRoaW4gdGhlIGN1cnJlbnQgc2VjdGlvbiwgd2UgZmlyc3QgZ28gaW50byB0aGUgdGFyZ2V0IHNlY3Rpb246XG5cdFx0XHRcdGNvbnN0IG9TZWxlY3RlZFNlY3Rpb246IGFueSA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZCh0aGlzLm9PYmplY3RQYWdlTGF5b3V0LmdldFNlbGVjdGVkU2VjdGlvbigpKTtcblx0XHRcdFx0aWYgKG9TZWxlY3RlZFNlY3Rpb24/LmZpbmRFbGVtZW50cyh0cnVlKS5pbmRleE9mKG9Db250cm9sKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRzU2VjdGlvblRpdGxlID0gb0l0ZW0uZ2V0R3JvdXBOYW1lKCkuc3BsaXQoXCIsIFwiKVswXTtcblx0XHRcdFx0XHR0aGlzLl9uYXZpZ2F0ZUZyb21NZXNzYWdlVG9TZWN0aW9uSW5JY29uVGFiQmFyTW9kZSh0aGlzLm9PYmplY3RQYWdlTGF5b3V0LCBzU2VjdGlvblRpdGxlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvQ29udHJvbD8uZm9jdXMoKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gZm9jdXMgb24gY29udHJvbFxuXHRcdFx0c1NlY3Rpb25UaXRsZSA9IG9JdGVtLmdldEdyb3VwTmFtZSgpLnNwbGl0KFwiLCBcIilbMF07XG5cdFx0XHR0aGlzLl9uYXZpZ2F0ZUZyb21NZXNzYWdlVG9TZWN0aW9uSW5JY29uVGFiQmFyTW9kZSh0aGlzLm9PYmplY3RQYWdlTGF5b3V0LCBzU2VjdGlvblRpdGxlKTtcblx0XHRcdF9mb2N1c09uTWVzc2FnZVRhcmdldENvbnRyb2wob01lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRUYWJsZUNvbEluZm8ob1RhYmxlOiBhbnksIHNUYWJsZVRhcmdldENvbFByb3BlcnR5OiBzdHJpbmcpIHtcblx0XHRsZXQgc1RhYmxlVGFyZ2V0Q29sTmFtZTtcblx0XHRsZXQgb1RhYmxlVGFyZ2V0Q29sID0gb1RhYmxlLmdldENvbHVtbnMoKS5maW5kKFxuXHRcdFx0ZnVuY3Rpb24oc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHk6IGFueSwgY29sdW1uOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIGNvbHVtbi5nZXREYXRhUHJvcGVydHkoKSA9PT0gc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHk7XG5cdFx0XHR9LmJpbmQodGhpcywgc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkpXG5cdFx0KTtcblx0XHRpZiAoIW9UYWJsZVRhcmdldENvbCkge1xuXHRcdFx0LyogSWYgdGhlIHRhcmdldCBjb2x1bW4gaXMgbm90IGZvdW5kLCB3ZSBjaGVjayBmb3IgYSBjdXN0b20gY29sdW1uICovXG5cdFx0XHRjb25zdCBvQ3VzdG9tQ29sdW1uID0gb1RhYmxlXG5cdFx0XHRcdC5nZXRDb250cm9sRGVsZWdhdGUoKVxuXHRcdFx0XHQuZ2V0Q29sdW1uc0ZvcihvVGFibGUpXG5cdFx0XHRcdC5maW5kKGZ1bmN0aW9uKG9Db2x1bW46IGFueSkge1xuXHRcdFx0XHRcdGlmICghIW9Db2x1bW4udGVtcGxhdGUgJiYgb0NvbHVtbi5wcm9wZXJ0eUluZm9zKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRvQ29sdW1uLnByb3BlcnR5SW5mb3NbMF0gPT09IHNUYWJsZVRhcmdldENvbFByb3BlcnR5IHx8XG5cdFx0XHRcdFx0XHRcdG9Db2x1bW4ucHJvcGVydHlJbmZvc1swXS5yZXBsYWNlKFwiUHJvcGVydHk6OlwiLCBcIlwiKSA9PT0gc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0aWYgKG9DdXN0b21Db2x1bW4pIHtcblx0XHRcdFx0b1RhYmxlVGFyZ2V0Q29sID0gb0N1c3RvbUNvbHVtbjtcblx0XHRcdFx0c1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgPSBvVGFibGVUYXJnZXRDb2wubmFtZTtcblxuXHRcdFx0XHRzVGFibGVUYXJnZXRDb2xOYW1lID0gb1RhYmxlXG5cdFx0XHRcdFx0LmdldENvbHVtbnMoKVxuXHRcdFx0XHRcdC5maW5kKGZ1bmN0aW9uKG9Db2x1bW46IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHNUYWJsZVRhcmdldENvbFByb3BlcnR5ID09PSBvQ29sdW1uLmdldERhdGFQcm9wZXJ0eSgpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmdldEhlYWRlcigpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0LyogSWYgdGhlIHRhcmdldCBjb2x1bW4gaXMgbm90IGZvdW5kLCB3ZSBjaGVjayBmb3IgYSBmaWVsZCBncm91cCAqL1xuXHRcdFx0XHRjb25zdCBhQ29sdW1ucyA9IG9UYWJsZS5nZXRDb250cm9sRGVsZWdhdGUoKS5nZXRDb2x1bW5zRm9yKG9UYWJsZSk7XG5cdFx0XHRcdG9UYWJsZVRhcmdldENvbCA9IGFDb2x1bW5zLmZpbmQoXG5cdFx0XHRcdFx0ZnVuY3Rpb24oYUNvbHVtbnM6IGFueVtdLCBzVGFibGVUYXJnZXRDb2xQcm9wZXJ0eTogc3RyaW5nLCBvQ29sdW1uOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChvQ29sdW1uLmtleS5pbmRleE9mKFwiOjpGaWVsZEdyb3VwOjpcIikgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvQ29sdW1uLnByb3BlcnR5SW5mb3MuZmluZChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYUNvbHVtbnMuZmluZChmdW5jdGlvbihvQ29sdW1uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHNUYWJsZVRhcmdldENvbFByb3BlcnR5O1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LmJpbmQodGhpcywgYUNvbHVtbnMsIHNUYWJsZVRhcmdldENvbFByb3BlcnR5KVxuXHRcdFx0XHQpO1xuXHRcdFx0XHQvKiBjaGVjayBpZiB0aGUgY29sdW1uIHdpdGggdGhlIGZpZWxkIGdyb3VwIGlzIHZpc2libGUgaW4gdGhlIHRhYmxlOiAqL1xuXHRcdFx0XHRsZXQgYklzVGFibGVUYXJnZXRDb2xWaXNpYmxlID0gZmFsc2U7XG5cdFx0XHRcdGlmIChvVGFibGVUYXJnZXRDb2wgJiYgb1RhYmxlVGFyZ2V0Q29sLmxhYmVsKSB7XG5cdFx0XHRcdFx0YklzVGFibGVUYXJnZXRDb2xWaXNpYmxlID0gb1RhYmxlLmdldENvbHVtbnMoKS5zb21lKGZ1bmN0aW9uKGNvbHVtbjogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29sdW1uLmdldEhlYWRlcigpID09PSBvVGFibGVUYXJnZXRDb2wubGFiZWw7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c1RhYmxlVGFyZ2V0Q29sTmFtZSA9IGJJc1RhYmxlVGFyZ2V0Q29sVmlzaWJsZSAmJiBvVGFibGVUYXJnZXRDb2wubGFiZWw7XG5cdFx0XHRcdHNUYWJsZVRhcmdldENvbFByb3BlcnR5ID0gYklzVGFibGVUYXJnZXRDb2xWaXNpYmxlICYmIG9UYWJsZVRhcmdldENvbC5rZXk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNUYWJsZVRhcmdldENvbE5hbWUgPSBvVGFibGVUYXJnZXRDb2wgJiYgb1RhYmxlVGFyZ2V0Q29sLmdldEhlYWRlcigpO1xuXHRcdH1cblx0XHRyZXR1cm4geyBzVGFibGVUYXJnZXRDb2xOYW1lOiBzVGFibGVUYXJnZXRDb2xOYW1lLCBzVGFibGVUYXJnZXRDb2xQcm9wZXJ0eTogc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgfTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb2JqIFRoZSBtZXNzYWdlIG9iamVjdFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhU2VjdGlvbnMgVGhlIGFycmF5IG9mIHNlY3Rpb25zIGluIHRoZSBvYmplY3QgcGFnZVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgcmFuayBvZiB0aGUgbWVzc2FnZVxuXHQgKi9cblx0X2dldE1lc3NhZ2VSYW5rKG9iajogYW55LCBhU2VjdGlvbnM6IGFueVtdKSB7XG5cdFx0aWYgKGFTZWN0aW9ucykge1xuXHRcdFx0bGV0IHNlY3Rpb24sIGFTdWJTZWN0aW9ucywgc3ViU2VjdGlvbiwgaiwgaywgYUVsZW1lbnRzLCBhQWxsRWxlbWVudHMsIHNlY3Rpb25SYW5rO1xuXHRcdFx0Zm9yIChqID0gYVNlY3Rpb25zLmxlbmd0aCAtIDE7IGogPj0gMDsgLS1qKSB7XG5cdFx0XHRcdC8vIExvb3Agb3ZlciBhbGwgc2VjdGlvbnNcblx0XHRcdFx0c2VjdGlvbiA9IGFTZWN0aW9uc1tqXTtcblx0XHRcdFx0YVN1YlNlY3Rpb25zID0gc2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpO1xuXHRcdFx0XHRmb3IgKGsgPSBhU3ViU2VjdGlvbnMubGVuZ3RoIC0gMTsgayA+PSAwOyAtLWspIHtcblx0XHRcdFx0XHQvLyBMb29wIG92ZXIgYWxsIHN1Yi1zZWN0aW9uc1xuXHRcdFx0XHRcdHN1YlNlY3Rpb24gPSBhU3ViU2VjdGlvbnNba107XG5cdFx0XHRcdFx0YUFsbEVsZW1lbnRzID0gc3ViU2VjdGlvbi5maW5kRWxlbWVudHModHJ1ZSk7IC8vIEdldCBhbGwgZWxlbWVudHMgaW5zaWRlIGEgc3ViLXNlY3Rpb25cblx0XHRcdFx0XHQvL1RyeSB0byBmaW5kIHRoZSBjb250cm9sIDEgaW5zaWRlIHRoZSBzdWIgc2VjdGlvblxuXHRcdFx0XHRcdGFFbGVtZW50cyA9IGFBbGxFbGVtZW50cy5maWx0ZXIodGhpcy5fZm5GaWx0ZXJVcG9uSWQuYmluZCh0aGlzLCBvYmouZ2V0Q29udHJvbElkKCkpKTtcblx0XHRcdFx0XHRzZWN0aW9uUmFuayA9IGogKyAxO1xuXHRcdFx0XHRcdGlmIChhRWxlbWVudHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0b2JqLnNlY3Rpb25OYW1lID0gc2VjdGlvbi5nZXRUaXRsZSgpO1xuXHRcdFx0XHRcdFx0b2JqLnN1YlNlY3Rpb25OYW1lID0gc3ViU2VjdGlvbi5nZXRUaXRsZSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHNlY3Rpb25SYW5rICogMTAgKyAoayArIDEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly9pZiBzdWIgc2VjdGlvbiB0aXRsZSBpcyBPdGhlciBtZXNzYWdlcywgd2UgcmV0dXJuIGEgaGlnaCBudW1iZXIocmFuayksIHdoaWNoIGVuc3VyZXNcblx0XHRcdC8vdGhhdCBtZXNzYWdlcyBiZWxvbmdpbmcgdG8gdGhpcyBzdWIgc2VjdGlvbiBhbHdheXMgY29tZSBsYXRlciBpbiBtZXNzYWdlUG9wb3ZlclxuXHRcdFx0aWYgKCFvYmouc2VjdGlvbk5hbWUgJiYgIW9iai5zdWJTZWN0aW9uTmFtZSAmJiBvYmoucGVyc2lzdGVudCkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblx0XHRcdHJldHVybiA5OTk7XG5cdFx0fVxuXHRcdHJldHVybiA5OTk7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHNldCB0aGUgZmlsdGVycyBiYXNlZCB1cG9uIHRoZSBtZXNzYWdlIGl0ZW1zXG5cdCAqIFRoZSBkZXNpcmVkIGZpbHRlciBvcGVyYXRpb24gaXM6XG5cdCAqICggZmlsdGVycyBwcm92aWRlZCBieSB1c2VyICYmICggdmFsaWRhdGlvbiA9IHRydWUgJiYgQ29udHJvbCBzaG91bGQgYmUgcHJlc2VudCBpbiB2aWV3ICkgfHwgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IG1hdGNoaW5nIGNvbnRleHQgKS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9hcHBseUZpbHRlcnNBbmRTb3J0KCkge1xuXHRcdGxldCBvVmFsaWRhdGlvbkZpbHRlcnMsXG5cdFx0XHRvVmFsaWRhdGlvbkFuZENvbnRleHRGaWx0ZXIsXG5cdFx0XHRvRmlsdGVycyxcblx0XHRcdHNQYXRoLFxuXHRcdFx0b1NvcnRlcixcblx0XHRcdG9EaWFsb2dGaWx0ZXIsXG5cdFx0XHRvYmplY3RQYWdlTGF5b3V0U2VjdGlvbnM6IGFueSA9IG51bGw7XG5cdFx0Y29uc3QgYVVzZXJEZWZpbmVkRmlsdGVyOiBhbnlbXSA9IFtdO1xuXHRcdGZ1bmN0aW9uIGZpbHRlck91dE1lc3NhZ2VzSW5EaWFsb2coKSB7XG5cdFx0XHRjb25zdCBmblRlc3QgPSBmdW5jdGlvbihhQ29udHJvbElkczogc3RyaW5nW10pIHtcblx0XHRcdFx0bGV0IGluZGV4ID0gSW5maW5pdHksXG5cdFx0XHRcdFx0b0NvbnRyb2wgPSBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoYUNvbnRyb2xJZHNbMF0pIGFzIGFueTtcblx0XHRcdFx0Y29uc3QgZXJyb3JGaWVsZENvbnRyb2wgPSBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoYUNvbnRyb2xJZHNbMF0pO1xuXHRcdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0XHRjb25zdCBmaWVsZFJhbmtpbkRpYWxvZyA9XG5cdFx0XHRcdFx0XHRvQ29udHJvbCBpbnN0YW5jZW9mIERpYWxvZ1xuXHRcdFx0XHRcdFx0XHQ/IChlcnJvckZpZWxkQ29udHJvbD8uZ2V0UGFyZW50KCkgYXMgYW55KS5maW5kRWxlbWVudHModHJ1ZSkuaW5kZXhPZihlcnJvckZpZWxkQ29udHJvbClcblx0XHRcdFx0XHRcdFx0OiBJbmZpbml0eTtcblx0XHRcdFx0XHRpZiAob0NvbnRyb2wgaW5zdGFuY2VvZiBEaWFsb2cpIHtcblx0XHRcdFx0XHRcdGlmIChpbmRleCA+IGZpZWxkUmFua2luRGlhbG9nKSB7XG5cdFx0XHRcdFx0XHRcdGluZGV4ID0gZmllbGRSYW5raW5EaWFsb2c7XG5cdFx0XHRcdFx0XHRcdC8vIFNldCB0aGUgZm9jdXMgdG8gdGhlIGRpYWxvZydzIGNvbnRyb2xcblx0XHRcdFx0XHRcdFx0ZXJyb3JGaWVsZENvbnRyb2w/LmZvY3VzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvLyBtZXNzYWdlcyBmb3Igc2FwLm0uRGlhbG9nIHNob3VsZCBub3QgYXBwZWFyIGluIHRoZSBtZXNzYWdlIGJ1dHRvblxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvQ29udHJvbCA9IG9Db250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiBuZXcgRmlsdGVyKHtcblx0XHRcdFx0cGF0aDogXCJjb250cm9sSWRzXCIsXG5cdFx0XHRcdHRlc3Q6IGZuVGVzdCxcblx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vRmlsdGVyIGZ1bmN0aW9uIHRvIHZlcmlmeSBpZiB0aGUgY29udHJvbCBpcyBwYXJ0IG9mIHRoZSBjdXJyZW50IHZpZXcgb3Igbm90XG5cdFx0ZnVuY3Rpb24gZ2V0Q2hlY2tDb250cm9sSW5WaWV3RmlsdGVyKCkge1xuXHRcdFx0Y29uc3QgZm5UZXN0ID0gZnVuY3Rpb24oYUNvbnRyb2xJZHM6IHN0cmluZ1tdKSB7XG5cdFx0XHRcdGlmICghYUNvbnRyb2xJZHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxldCBvQ29udHJvbDogYW55ID0gc2FwLnVpLmdldENvcmUoKS5ieUlkKGFDb250cm9sSWRzWzBdKTtcblx0XHRcdFx0d2hpbGUgKG9Db250cm9sKSB7XG5cdFx0XHRcdFx0aWYgKG9Db250cm9sLmdldElkKCkgPT09IHNWaWV3SWQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0NvbnRyb2wgaW5zdGFuY2VvZiBEaWFsb2cpIHtcblx0XHRcdFx0XHRcdC8vIG1lc3NhZ2VzIGZvciBzYXAubS5EaWFsb2cgc2hvdWxkIG5vdCBhcHBlYXIgaW4gdGhlIG1lc3NhZ2UgYnV0dG9uXG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiBuZXcgRmlsdGVyKHtcblx0XHRcdFx0cGF0aDogXCJjb250cm9sSWRzXCIsXG5cdFx0XHRcdHRlc3Q6IGZuVGVzdCxcblx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5zVmlld0lkKSB7XG5cdFx0XHR0aGlzLnNWaWV3SWQgPSB0aGlzLl9nZXRWaWV3SWQodGhpcy5nZXRJZCgpKSBhcyBzdHJpbmc7XG5cdFx0fVxuXHRcdGNvbnN0IHNWaWV3SWQgPSB0aGlzLnNWaWV3SWQ7XG5cdFx0Ly9BZGQgdGhlIGZpbHRlcnMgcHJvdmlkZWQgYnkgdGhlIHVzZXJcblx0XHRjb25zdCBhQ3VzdG9tRmlsdGVycyA9IHRoaXMuZ2V0QWdncmVnYXRpb24oXCJjdXN0b21GaWx0ZXJzXCIpIGFzIGFueTtcblx0XHRpZiAoYUN1c3RvbUZpbHRlcnMpIHtcblx0XHRcdGFDdXN0b21GaWx0ZXJzLmZvckVhY2goZnVuY3Rpb24oZmlsdGVyOiBhbnkpIHtcblx0XHRcdFx0YVVzZXJEZWZpbmVkRmlsdGVyLnB1c2goXG5cdFx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBmaWx0ZXIuZ2V0UHJvcGVydHkoXCJwYXRoXCIpLFxuXHRcdFx0XHRcdFx0b3BlcmF0b3I6IGZpbHRlci5nZXRQcm9wZXJ0eShcIm9wZXJhdG9yXCIpLFxuXHRcdFx0XHRcdFx0dmFsdWUxOiBmaWx0ZXIuZ2V0UHJvcGVydHkoXCJ2YWx1ZTFcIiksXG5cdFx0XHRcdFx0XHR2YWx1ZTI6IGZpbHRlci5nZXRQcm9wZXJ0eShcInZhbHVlMlwiKVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGlmICghb0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHR0aGlzLnNldFZpc2libGUoZmFsc2UpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzUGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHQvL0ZpbHRlciBmb3IgZmlsdGVyaW5nIG91dCBvbmx5IHZhbGlkYXRpb24gbWVzc2FnZXMgd2hpY2ggYXJlIGN1cnJlbnRseSBwcmVzZW50IGluIHRoZSB2aWV3XG5cdFx0XHRvVmFsaWRhdGlvbkZpbHRlcnMgPSBuZXcgRmlsdGVyKHtcblx0XHRcdFx0ZmlsdGVyczogW1xuXHRcdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0cGF0aDogXCJ2YWxpZGF0aW9uXCIsXG5cdFx0XHRcdFx0XHRvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsXG5cdFx0XHRcdFx0XHR2YWx1ZTE6IHRydWVcblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRnZXRDaGVja0NvbnRyb2xJblZpZXdGaWx0ZXIoKVxuXHRcdFx0XHRdLFxuXHRcdFx0XHRhbmQ6IHRydWVcblx0XHRcdH0pO1xuXHRcdFx0Ly9GaWx0ZXIgZm9yIGZpbHRlcmluZyBvdXQgdGhlIGJvdW5kIG1lc3NhZ2VzIGkuZSB0YXJnZXQgc3RhcnRzIHdpdGggdGhlIGNvbnRleHQgcGF0aFxuXHRcdFx0b1ZhbGlkYXRpb25BbmRDb250ZXh0RmlsdGVyID0gbmV3IEZpbHRlcih7XG5cdFx0XHRcdGZpbHRlcnM6IFtcblx0XHRcdFx0XHRvVmFsaWRhdGlvbkZpbHRlcnMsXG5cdFx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBcInRhcmdldFwiLFxuXHRcdFx0XHRcdFx0b3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLlN0YXJ0c1dpdGgsXG5cdFx0XHRcdFx0XHR2YWx1ZTE6IHNQYXRoXG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XSxcblx0XHRcdFx0YW5kOiBmYWxzZVxuXHRcdFx0fSk7XG5cdFx0XHRvRGlhbG9nRmlsdGVyID0gbmV3IEZpbHRlcih7XG5cdFx0XHRcdGZpbHRlcnM6IFtmaWx0ZXJPdXRNZXNzYWdlc0luRGlhbG9nKCldXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Y29uc3Qgb1ZhbGlkYXRpb25Db250ZXh0RGlhbG9nRmlsdGVycyA9IG5ldyBGaWx0ZXIoe1xuXHRcdFx0ZmlsdGVyczogW29WYWxpZGF0aW9uQW5kQ29udGV4dEZpbHRlciwgb0RpYWxvZ0ZpbHRlcl0sXG5cdFx0XHRhbmQ6IHRydWVcblx0XHR9KTtcblx0XHQvLyBhbmQgZmluYWxseSAtIGlmIHRoZXJlIGFueSAtIGFkZCBjdXN0b20gZmlsdGVyICh2aWEgT1IpXG5cdFx0aWYgKGFVc2VyRGVmaW5lZEZpbHRlci5sZW5ndGggPiAwKSB7XG5cdFx0XHRvRmlsdGVycyA9IG5ldyAoRmlsdGVyIGFzIGFueSkoe1xuXHRcdFx0XHRmaWx0ZXJzOiBbYVVzZXJEZWZpbmVkRmlsdGVyLCBvVmFsaWRhdGlvbkNvbnRleHREaWFsb2dGaWx0ZXJzXSxcblx0XHRcdFx0YW5kOiBmYWxzZVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9GaWx0ZXJzID0gb1ZhbGlkYXRpb25Db250ZXh0RGlhbG9nRmlsdGVycztcblx0XHR9XG5cdFx0dGhpcy5vSXRlbUJpbmRpbmcuZmlsdGVyKG9GaWx0ZXJzKTtcblx0XHR0aGlzLm9PYmplY3RQYWdlTGF5b3V0ID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dCh0aGlzLCB0aGlzLm9PYmplY3RQYWdlTGF5b3V0KTtcblx0XHQvLyBXZSBzdXBwb3J0IHNvcnRpbmcgb25seSBmb3IgT2JqZWN0UGFnZUxheW91dCB1c2UtY2FzZS5cblx0XHRpZiAodGhpcy5vT2JqZWN0UGFnZUxheW91dCkge1xuXHRcdFx0Y29uc3QgdGhhdCA9IHRoaXMgYXMgTWVzc2FnZUJ1dHRvbjtcblx0XHRcdG9Tb3J0ZXIgPSBuZXcgKFNvcnRlciBhcyBhbnkpKFwiXCIsIG51bGwsIG51bGwsIGZ1bmN0aW9uKG9iajE6IGFueSwgb2JqMjogYW55KSB7XG5cdFx0XHRcdGlmICghb2JqZWN0UGFnZUxheW91dFNlY3Rpb25zKSB7XG5cdFx0XHRcdFx0b2JqZWN0UGFnZUxheW91dFNlY3Rpb25zID0gdGhhdC5vT2JqZWN0UGFnZUxheW91dCAmJiB0aGF0Lm9PYmplY3RQYWdlTGF5b3V0LmdldFNlY3Rpb25zKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgcmFua0EgPSB0aGF0Ll9nZXRNZXNzYWdlUmFuayhvYmoxLCBvYmplY3RQYWdlTGF5b3V0U2VjdGlvbnMpO1xuXHRcdFx0XHRjb25zdCByYW5rQiA9IHRoYXQuX2dldE1lc3NhZ2VSYW5rKG9iajIsIG9iamVjdFBhZ2VMYXlvdXRTZWN0aW9ucyk7XG5cdFx0XHRcdGlmIChyYW5rQSA8IHJhbmtCKSB7XG5cdFx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChyYW5rQSA+IHJhbmtCKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMub0l0ZW1CaW5kaW5nLnNvcnQob1NvcnRlcik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBzQ29udHJvbElkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvSXRlbVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29udHJvbCBJRCBtYXRjaGVzIHRoZSBpdGVtIElEXG5cdCAqL1xuXHRfZm5GaWx0ZXJVcG9uSWQoc0NvbnRyb2xJZDogc3RyaW5nLCBvSXRlbTogYW55KSB7XG5cdFx0cmV0dXJuIHNDb250cm9sSWQgPT09IG9JdGVtLmdldElkKCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRyb2xJZHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9JdGVtXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIG1hdGNoZXMgdGhlIGl0ZW0gSUQgbWF0Y2hlZHMgd2l0aCBvbmUgb2YgdGhlIGNvbnRyb2xJZHNcblx0ICovXG5cdF9mbkZpbHRlclVwb25JZHMoYUNvbnRyb2xJZHM6IHN0cmluZ1tdLCBvSXRlbTogYW55KSB7XG5cdFx0cmV0dXJuIGFDb250cm9sSWRzLnNvbWUoZnVuY3Rpb24oc0NvbnRyb2xJZCkge1xuXHRcdFx0aWYgKHNDb250cm9sSWQgPT09IG9JdGVtLmdldElkKCkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBzZWN0aW9uIGJhc2VkIG9uIHNlY3Rpb24gdGl0bGUgYW5kIHZpc2liaWxpdHkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvT2JqZWN0UGFnZSBPYmplY3QgcGFnZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNTZWN0aW9uVGl0bGUgU2VjdGlvbiB0aXRsZS5cblx0ICogQHJldHVybnMge29iamVjdH1cblx0ICogQHByaXZhdGVcblx0ICogQGlnbm9yZVxuXHQgKi9cblx0X2dldFNlY3Rpb25CeVNlY3Rpb25UaXRsZShvT2JqZWN0UGFnZTogYW55LCBzU2VjdGlvblRpdGxlOiBzdHJpbmcpIHtcblx0XHRpZiAoc1NlY3Rpb25UaXRsZSkge1xuXHRcdFx0Y29uc3QgYVNlY3Rpb25zID0gb09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKTtcblx0XHRcdGxldCBvU2VjdGlvbjtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYVNlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChhU2VjdGlvbnNbaV0uZ2V0VmlzaWJsZSgpICYmIGFTZWN0aW9uc1tpXS5nZXRUaXRsZSgpID09PSBzU2VjdGlvblRpdGxlKSB7XG5cdFx0XHRcdFx0b1NlY3Rpb24gPSBhU2VjdGlvbnNbaV07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBvU2VjdGlvbjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzZWN0aW9uIGlmIHRoZSBvYmplY3QgcGFnZSB1c2VzIGFuIEljb25UYWJCYXIgYW5kIGlmIHRoZSBjdXJyZW50IHNlY3Rpb24gaXMgbm90IHRoZSB0YXJnZXQgb2YgdGhlIG5hdmlnYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvT2JqZWN0UGFnZSBPYmplY3QgcGFnZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNTZWN0aW9uVGl0bGUgU2VjdGlvbiB0aXRsZS5cblx0ICogQHByaXZhdGVcblx0ICogQGlnbm9yZVxuXHQgKi9cblx0X25hdmlnYXRlRnJvbU1lc3NhZ2VUb1NlY3Rpb25Jbkljb25UYWJCYXJNb2RlKG9PYmplY3RQYWdlOiBhbnksIHNTZWN0aW9uVGl0bGU6IHN0cmluZykge1xuXHRcdGNvbnN0IGJVc2VJY29uVGFiQmFyID0gb09iamVjdFBhZ2UuZ2V0VXNlSWNvblRhYkJhcigpO1xuXHRcdGlmIChiVXNlSWNvblRhYkJhcikge1xuXHRcdFx0Y29uc3Qgb1NlY3Rpb24gPSB0aGlzLl9nZXRTZWN0aW9uQnlTZWN0aW9uVGl0bGUob09iamVjdFBhZ2UsIHNTZWN0aW9uVGl0bGUpO1xuXHRcdFx0Y29uc3Qgc1NlbGVjdGVkU2VjdGlvbklkID0gb09iamVjdFBhZ2UuZ2V0U2VsZWN0ZWRTZWN0aW9uKCk7XG5cdFx0XHRpZiAob1NlY3Rpb24gJiYgc1NlbGVjdGVkU2VjdGlvbklkICE9PSBvU2VjdGlvbi5nZXRJZCgpKSB7XG5cdFx0XHRcdG9PYmplY3RQYWdlLnNldFNlbGVjdGVkU2VjdGlvbihvU2VjdGlvbi5nZXRJZCgpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfbmF2aWdhdGVGcm9tTWVzc2FnZVRvU2VjdGlvblRhYmxlSW5JY29uVGFiQmFyTW9kZShvVGFibGU6IGFueSwgb09iamVjdFBhZ2U6IGFueSwgc1NlY3Rpb25UaXRsZTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb1Jvd0JpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdGNvbnN0IG9UYWJsZUNvbnRleHQgPSBvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBvT1BDb250ZXh0ID0gb09iamVjdFBhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBiU2hvdWxkV2FpdEZvclRhYmxlUmVmcmVzaCA9ICEob1RhYmxlQ29udGV4dCA9PT0gb09QQ29udGV4dCk7XG5cdFx0dGhpcy5fbmF2aWdhdGVGcm9tTWVzc2FnZVRvU2VjdGlvbkluSWNvblRhYkJhck1vZGUob09iamVjdFBhZ2UsIHNTZWN0aW9uVGl0bGUpO1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlOiBGdW5jdGlvbikge1xuXHRcdFx0aWYgKGJTaG91bGRXYWl0Rm9yVGFibGVSZWZyZXNoKSB7XG5cdFx0XHRcdG9Sb3dCaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImNoYW5nZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgTURDIHRhYmxlIGlmIGl0IGlzIGZvdW5kIGFtb25nIGFueSBvZiB0aGUgcGFyZW50IGVsZW1lbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0VsZW1lbnQgQ29udHJvbFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBNREMgdGFibGUgfHwgdW5kZWZpbmVkXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBpZ25vcmVcblx0ICovXG5cdF9nZXRNZGNUYWJsZShvRWxlbWVudDogYW55KSB7XG5cdFx0Ly9jaGVjayBpZiB0aGUgZWxlbWVudCBoYXMgYSB0YWJsZSB3aXRoaW4gYW55IG9mIGl0cyBwYXJlbnRzXG5cdFx0bGV0IG9QYXJlbnRFbGVtZW50ID0gb0VsZW1lbnQuZ2V0UGFyZW50KCk7XG5cdFx0d2hpbGUgKG9QYXJlbnRFbGVtZW50ICYmICFvUGFyZW50RWxlbWVudC5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRvUGFyZW50RWxlbWVudCA9IG9QYXJlbnRFbGVtZW50LmdldFBhcmVudCgpO1xuXHRcdH1cblx0XHRjb25zdCBvTWRjVGFibGUgPSBvUGFyZW50RWxlbWVudCAmJiBvUGFyZW50RWxlbWVudC5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpID8gb1BhcmVudEVsZW1lbnQgOiB1bmRlZmluZWQ7XG5cdFx0cmV0dXJuIG9NZGNUYWJsZTtcblx0fVxuXG5cdF9nZXRHcmlkVGFibGUob01kY1RhYmxlOiBhbnkpIHtcblx0XHRyZXR1cm4gb01kY1RhYmxlLmZpbmRFbGVtZW50cyh0cnVlLCBmdW5jdGlvbihvRWxlbTogYW55KSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRvRWxlbS5pc0EoXCJzYXAudWkudGFibGUuVGFibGVcIikgJiZcblx0XHRcdFx0LyoqIFdlIGNoZWNrIHRoZSBlbGVtZW50IGJlbG9uZ3MgdG8gdGhlIE1kYyBUYWJsZSA6Ki9cblx0XHRcdFx0b0VsZW0uZ2V0UGFyZW50KCkgPT09IG9NZGNUYWJsZVxuXHRcdFx0KTtcblx0XHR9KVswXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHRhYmxlIHJvdyAoaWYgYXZhaWxhYmxlKSBjb250YWluaW5nIHRoZSBlbGVtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0VsZW1lbnQgQ29udHJvbFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBUYWJsZSByb3cgfHwgdW5kZWZpbmVkXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBpZ25vcmVcblx0ICovXG5cdF9nZXRUYWJsZVJvdyhvRWxlbWVudDogYW55KSB7XG5cdFx0bGV0IG9QYXJlbnRFbGVtZW50ID0gb0VsZW1lbnQuZ2V0UGFyZW50KCk7XG5cdFx0d2hpbGUgKFxuXHRcdFx0b1BhcmVudEVsZW1lbnQgJiZcblx0XHRcdCFvUGFyZW50RWxlbWVudC5pc0EoXCJzYXAudWkudGFibGUuUm93XCIpICYmXG5cdFx0XHQhb1BhcmVudEVsZW1lbnQuaXNBKFwic2FwLnVpLnRhYmxlLkNyZWF0aW9uUm93XCIpICYmXG5cdFx0XHQhb1BhcmVudEVsZW1lbnQuaXNBKFwic2FwLm0uQ29sdW1uTGlzdEl0ZW1cIilcblx0XHQpIHtcblx0XHRcdG9QYXJlbnRFbGVtZW50ID0gb1BhcmVudEVsZW1lbnQuZ2V0UGFyZW50KCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9UYWJsZVJvdyA9XG5cdFx0XHRvUGFyZW50RWxlbWVudCAmJlxuXHRcdFx0KG9QYXJlbnRFbGVtZW50LmlzQShcInNhcC51aS50YWJsZS5Sb3dcIikgfHxcblx0XHRcdFx0b1BhcmVudEVsZW1lbnQuaXNBKFwic2FwLnVpLnRhYmxlLkNyZWF0aW9uUm93XCIpIHx8XG5cdFx0XHRcdG9QYXJlbnRFbGVtZW50LmlzQShcInNhcC5tLkNvbHVtbkxpc3RJdGVtXCIpKVxuXHRcdFx0XHQ/IG9QYXJlbnRFbGVtZW50XG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdHJldHVybiBvVGFibGVSb3c7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBpbmRleCBvZiB0aGUgdGFibGUgcm93IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRWxlbWVudCBDb250cm9sXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFJvdyBpbmRleCB8fCB1bmRlZmluZWRcblx0ICogQHByaXZhdGVcblx0ICogQGlnbm9yZVxuXHQgKi9cblx0X2dldFRhYmxlUm93SW5kZXgob0VsZW1lbnQ6IGFueSkge1xuXHRcdGNvbnN0IG9UYWJsZVJvdyA9IHRoaXMuX2dldFRhYmxlUm93KG9FbGVtZW50KTtcblx0XHRsZXQgaVJvd0luZGV4O1xuXHRcdGlmIChvVGFibGVSb3cuaXNBKFwic2FwLnVpLnRhYmxlLlJvd1wiKSkge1xuXHRcdFx0aVJvd0luZGV4ID0gb1RhYmxlUm93LmdldEluZGV4KCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlSb3dJbmRleCA9IG9UYWJsZVJvd1xuXHRcdFx0XHQuZ2V0VGFibGUoKVxuXHRcdFx0XHQuZ2V0SXRlbXMoKVxuXHRcdFx0XHQuZmluZEluZGV4KGZ1bmN0aW9uKGVsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBlbGVtZW50LmdldElkKCkgPT09IG9UYWJsZVJvdy5nZXRJZCgpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGlSb3dJbmRleDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGluZGV4IG9mIHRoZSB0YWJsZSBjb2x1bW4gY29udGFpbmluZyB0aGUgZWxlbWVudC5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FbGVtZW50IENvbnRyb2xcblx0ICogQHJldHVybnMge29iamVjdH0gQ29sdW1uIGluZGV4IHx8IHVuZGVmaW5lZFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAaWdub3JlXG5cdCAqL1xuXHRfZ2V0VGFibGVDb2x1bW5JbmRleChvRWxlbWVudDogYW55KSB7XG5cdFx0Y29uc3QgZ2V0VGFyZ2V0Q2VsbEluZGV4ID0gZnVuY3Rpb24ob0VsZW1lbnQ6IGFueSwgb1RhcmdldFJvdzogYW55KSB7XG5cdFx0XHRyZXR1cm4gb1RhcmdldFJvdy5nZXRDZWxscygpLmZpbmRJbmRleChmdW5jdGlvbihvQ2VsbDogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ2VsbC5nZXRJZCgpID09PSBvRWxlbWVudC5nZXRJZCgpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0XHRjb25zdCBnZXRUYXJnZXRDb2x1bW5JbmRleCA9IGZ1bmN0aW9uKG9FbGVtZW50OiBhbnksIG9UYXJnZXRSb3c6IGFueSkge1xuXHRcdFx0bGV0IG9UYXJnZXRFbGVtZW50ID0gb0VsZW1lbnQuZ2V0UGFyZW50KCksXG5cdFx0XHRcdGlUYXJnZXRDZWxsSW5kZXggPSBnZXRUYXJnZXRDZWxsSW5kZXgob1RhcmdldEVsZW1lbnQsIG9UYXJnZXRSb3cpO1xuXHRcdFx0d2hpbGUgKG9UYXJnZXRFbGVtZW50ICYmIGlUYXJnZXRDZWxsSW5kZXggPCAwKSB7XG5cdFx0XHRcdG9UYXJnZXRFbGVtZW50ID0gb1RhcmdldEVsZW1lbnQuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdGlUYXJnZXRDZWxsSW5kZXggPSBnZXRUYXJnZXRDZWxsSW5kZXgob1RhcmdldEVsZW1lbnQsIG9UYXJnZXRSb3cpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGlUYXJnZXRDZWxsSW5kZXg7XG5cdFx0fTtcblx0XHRjb25zdCBvVGFyZ2V0Um93ID0gdGhpcy5fZ2V0VGFibGVSb3cob0VsZW1lbnQpO1xuXHRcdGxldCBpVGFyZ2V0Q29sdW1uSW5kZXg7XG5cdFx0aVRhcmdldENvbHVtbkluZGV4ID0gZ2V0VGFyZ2V0Q29sdW1uSW5kZXgob0VsZW1lbnQsIG9UYXJnZXRSb3cpO1xuXHRcdGlmIChvVGFyZ2V0Um93LmlzQShcInNhcC51aS50YWJsZS5DcmVhdGlvblJvd1wiKSkge1xuXHRcdFx0Y29uc3Qgc1RhcmdldENlbGxJZCA9IG9UYXJnZXRSb3cuZ2V0Q2VsbHMoKVtpVGFyZ2V0Q29sdW1uSW5kZXhdLmdldElkKCksXG5cdFx0XHRcdGFUYWJsZUNvbHVtbnMgPSBvVGFyZ2V0Um93LmdldFRhYmxlKCkuZ2V0Q29sdW1ucygpO1xuXHRcdFx0aVRhcmdldENvbHVtbkluZGV4ID0gYVRhYmxlQ29sdW1ucy5maW5kSW5kZXgoZnVuY3Rpb24oY29sdW1uOiBhbnkpIHtcblx0XHRcdFx0aWYgKGNvbHVtbi5nZXRDcmVhdGlvblRlbXBsYXRlKCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gc1RhcmdldENlbGxJZC5zZWFyY2goY29sdW1uLmdldENyZWF0aW9uVGVtcGxhdGUoKS5nZXRJZCgpKSA+IC0xID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBpVGFyZ2V0Q29sdW1uSW5kZXg7XG5cdH1cblxuXHRfZ2V0TWRjVGFibGVSb3dzKG9NZGNUYWJsZTogYW55KSB7XG5cdFx0cmV0dXJuIG9NZGNUYWJsZS5maW5kRWxlbWVudHModHJ1ZSwgZnVuY3Rpb24ob0VsZW06IGFueSkge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0b0VsZW0uaXNBKFwic2FwLnVpLnRhYmxlLlJvd1wiKSAmJlxuXHRcdFx0XHQvKiogV2UgY2hlY2sgdGhlIGVsZW1lbnQgYmVsb25ncyB0byB0aGUgTWRjIFRhYmxlIDoqL1xuXHRcdFx0XHRvRWxlbS5nZXRUYWJsZSgpLmdldFBhcmVudCgpID09PSBvTWRjVGFibGVcblx0XHRcdCk7XG5cdFx0fSk7XG5cdH1cblxuXHRfZ2V0VGFibGVDb2xQcm9wZXJ0eShvVGFibGU6IGFueSwgb01lc3NhZ2VPYmplY3Q6IGFueSkge1xuXHRcdC8vdGhpcyBmdW5jdGlvbiBlc2NhcGVzIGEgc3RyaW5nIHRvIHVzZSBpdCBhcyBhIHJlZ2V4XG5cdFx0Y29uc3QgZm5SZWdFeHBlc2NhcGUgPSBmdW5jdGlvbihzOiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBzLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgXCJcXFxcJCZcIik7XG5cdFx0fTtcblx0XHQvLyBiYXNlZCBvbiB0aGUgdGFyZ2V0IHBhdGggb2YgdGhlIG1lc3NhZ2Ugd2UgcmV0cmlldmUgdGhlIHByb3BlcnR5IG5hbWUuXG5cdFx0Ly8gdG8gYWNoaWV2ZSBpdCB3ZSByZW1vdmUgdGhlIGJpbmRpbmdDb250ZXh0IHBhdGggYW5kIHRoZSByb3cgYmluZGluZyBwYXRoIGZyb20gdGhlIHRhcmdldFxuXHRcdGNvbnN0IHNUYWJsZVRhcmdldENvbFByb3BlcnR5ID0gb01lc3NhZ2VPYmplY3Rcblx0XHRcdC5nZXRUYXJnZXQoKVxuXHRcdFx0LnJlcGxhY2UoXG5cdFx0XHRcdG5ldyBSZWdFeHAoZm5SZWdFeHBlc2NhcGUob1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KCkuZ2V0UGF0aCgpICsgXCIvXCIgKyBvVGFibGUuZ2V0Um93QmluZGluZygpLmdldFBhdGgoKSkgKyBcIlxcXFwoLipcXFxcKS9cIiksXG5cdFx0XHRcdFwiXCJcblx0XHRcdCk7XG5cdFx0cmV0dXJuIHNUYWJsZVRhcmdldENvbFByb3BlcnR5O1xuXHR9XG5cblx0X2dldE9iamVjdFBhZ2VMYXlvdXQob0VsZW1lbnQ6IGFueSwgb09iamVjdFBhZ2VMYXlvdXQ6IGFueSkge1xuXHRcdGlmIChvT2JqZWN0UGFnZUxheW91dCkge1xuXHRcdFx0cmV0dXJuIG9PYmplY3RQYWdlTGF5b3V0O1xuXHRcdH1cblx0XHRvT2JqZWN0UGFnZUxheW91dCA9IG9FbGVtZW50O1xuXHRcdC8vSXRlcmF0ZSBvdmVyIHBhcmVudCB0aWxsIHlvdSBoYXZlIG5vdCByZWFjaGVkIHRoZSBvYmplY3QgcGFnZSBsYXlvdXRcblx0XHR3aGlsZSAob09iamVjdFBhZ2VMYXlvdXQgJiYgIW9PYmplY3RQYWdlTGF5b3V0LmlzQShcInNhcC51eGFwLk9iamVjdFBhZ2VMYXlvdXRcIikpIHtcblx0XHRcdG9PYmplY3RQYWdlTGF5b3V0ID0gb09iamVjdFBhZ2VMYXlvdXQuZ2V0UGFyZW50KCk7XG5cdFx0fVxuXHRcdHJldHVybiBvT2JqZWN0UGFnZUxheW91dDtcblx0fVxuXG5cdF9nZXRDdXN0b21Db2x1bW5JbmZvKG9UYWJsZTogYW55LCBpUG9zaXRpb246IG51bWJlcikge1xuXHRcdGNvbnN0IHNUYWJsZUNvbFByb3BlcnR5ID0gb1RhYmxlLmdldENvbHVtbnMoKVtpUG9zaXRpb25dLmdldERhdGFQcm9wZXJ0eSgpO1xuXHRcdGNvbnN0IG9DdXN0b21Db2x1bW4gPSBvVGFibGVcblx0XHRcdC5nZXRDb250cm9sRGVsZWdhdGUoKVxuXHRcdFx0LmdldENvbHVtbnNGb3Iob1RhYmxlKVxuXHRcdFx0LmZpbmQoZnVuY3Rpb24ob0NvbHVtbjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ29sdW1uLm5hbWUgPT09IHNUYWJsZUNvbFByb3BlcnR5ICYmICEhb0NvbHVtbi50ZW1wbGF0ZTtcblx0XHRcdH0pO1xuXHRcdHJldHVybiBvQ3VzdG9tQ29sdW1uO1xuXHR9XG5cblx0X2dldFRhYmxlRmlyc3RDb2xQcm9wZXJ0eShvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IG9DdXN0b21Db2x1bW5JbmZvID0gdGhpcy5fZ2V0Q3VzdG9tQ29sdW1uSW5mbyhvVGFibGUsIDApO1xuXHRcdGxldCBzVGFibGVGaXJzdENvbFByb3BlcnR5O1xuXHRcdGlmIChvQ3VzdG9tQ29sdW1uSW5mbykge1xuXHRcdFx0aWYgKG9DdXN0b21Db2x1bW5JbmZvLnByb3BlcnR5SW5mb3MpIHtcblx0XHRcdFx0c1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSA9IG9DdXN0b21Db2x1bW5JbmZvLnByb3BlcnR5SW5mb3NbMF0ucmVwbGFjZShcIlByb3BlcnR5OjpcIiwgXCJcIik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzVGFibGVGaXJzdENvbFByb3BlcnR5ID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzVGFibGVGaXJzdENvbFByb3BlcnR5ID0gb1RhYmxlLmdldENvbHVtbnMoKVswXS5nZXREYXRhUHJvcGVydHkoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNUYWJsZUZpcnN0Q29sUHJvcGVydHk7XG5cdH1cblxuXHRfZ2V0VGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0Rm9yVGV4dEFubm90YXRpb24ob1RhYmxlOiBhbnksIG9UYWJsZVJvd0NvbnRleHQ6IGFueSwgc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eTogc3RyaW5nKSB7XG5cdFx0bGV0IG9CaW5kaW5nQ29udGV4dDtcblx0XHRpZiAob1RhYmxlUm93Q29udGV4dCAmJiBzVGFibGVGaXJzdENvbFByb3BlcnR5KSB7XG5cdFx0XHRjb25zdCBvTW9kZWwgPSBvVGFibGUuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9UYWJsZVJvd0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGlmIChvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIi9cIiArIHNUYWJsZUZpcnN0Q29sUHJvcGVydHkgKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dC8kUGF0aFwiKSkge1xuXHRcdFx0XHRvQmluZGluZ0NvbnRleHQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFxuXHRcdFx0XHRcdHNNZXRhUGF0aCArIFwiL1wiICsgc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0XCJcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9CaW5kaW5nQ29udGV4dDtcblx0fVxuXG5cdF9nZXRUYWJsZUZpcnN0Q29sVmFsdWUoc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eTogc3RyaW5nLCBvVGFibGVSb3dDb250ZXh0OiBhbnksIHNUZXh0QW5ub3RhdGlvblBhdGg6IHN0cmluZywgc1RleHRBcnJhbmdlbWVudDogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgc0NvZGVWYWx1ZSA9IG9UYWJsZVJvd0NvbnRleHQuZ2V0VmFsdWUoc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSk7XG5cdFx0bGV0IHNUZXh0VmFsdWU7XG5cdFx0bGV0IHNDb21wdXRlZFZhbHVlID0gc0NvZGVWYWx1ZTtcblx0XHRpZiAoc1RleHRBbm5vdGF0aW9uUGF0aCkge1xuXHRcdFx0aWYgKHNUYWJsZUZpcnN0Q29sUHJvcGVydHkubGFzdEluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0XHQvLyB0aGUgdGFyZ2V0IHByb3BlcnR5IGlzIHJlcGxhY2VkIHdpdGggdGhlIHRleHQgYW5ub3RhdGlvbiBwYXRoXG5cdFx0XHRcdHNUYWJsZUZpcnN0Q29sUHJvcGVydHkgPSBzVGFibGVGaXJzdENvbFByb3BlcnR5LnNsaWNlKDAsIHNUYWJsZUZpcnN0Q29sUHJvcGVydHkubGFzdEluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0XHRcdHNUYWJsZUZpcnN0Q29sUHJvcGVydHkgPSBzVGFibGVGaXJzdENvbFByb3BlcnR5LmNvbmNhdChzVGV4dEFubm90YXRpb25QYXRoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNUYWJsZUZpcnN0Q29sUHJvcGVydHkgPSBzVGV4dEFubm90YXRpb25QYXRoO1xuXHRcdFx0fVxuXHRcdFx0c1RleHRWYWx1ZSA9IG9UYWJsZVJvd0NvbnRleHQuZ2V0VmFsdWUoc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSk7XG5cdFx0XHRpZiAoc1RleHRWYWx1ZSkge1xuXHRcdFx0XHRpZiAoc1RleHRBcnJhbmdlbWVudCkge1xuXHRcdFx0XHRcdGNvbnN0IHNFbnVtTnVtYmVyID0gc1RleHRBcnJhbmdlbWVudC5zbGljZShzVGV4dEFycmFuZ2VtZW50LmluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0XHRcdFx0c3dpdGNoIChzRW51bU51bWJlcikge1xuXHRcdFx0XHRcdFx0Y2FzZSBcIlRleHRPbmx5XCI6XG5cdFx0XHRcdFx0XHRcdHNDb21wdXRlZFZhbHVlID0gc1RleHRWYWx1ZTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiVGV4dEZpcnN0XCI6XG5cdFx0XHRcdFx0XHRcdHNDb21wdXRlZFZhbHVlID0gc1RleHRWYWx1ZSArIFwiIChcIiArIHNDb2RlVmFsdWUgKyBcIilcIjtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiVGV4dExhc3RcIjpcblx0XHRcdFx0XHRcdFx0c0NvbXB1dGVkVmFsdWUgPSBzQ29kZVZhbHVlICsgXCIgKFwiICsgc1RleHRWYWx1ZSArIFwiKVwiO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJUZXh0U2VwYXJhdGVcIjpcblx0XHRcdFx0XHRcdFx0c0NvbXB1dGVkVmFsdWUgPSBzQ29kZVZhbHVlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNDb21wdXRlZFZhbHVlID0gc1RleHRWYWx1ZSArIFwiIChcIiArIHNDb2RlVmFsdWUgKyBcIilcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc0NvbXB1dGVkVmFsdWU7XG5cdH1cblxuXHRfSXNDb250cm9sSW5UYWJsZShvVGFibGU6IGFueSwgc0NvbnRyb2xJZDogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb0NvbnRyb2wgPSBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoc0NvbnRyb2xJZCk7XG5cdFx0aWYgKG9Db250cm9sICYmICFvQ29udHJvbC5pc0EoXCJzYXAudWkudGFibGUuVGFibGVcIikgJiYgIW9Db250cm9sLmlzQShcInNhcC5tLlRhYmxlXCIpKSB7XG5cdFx0XHRyZXR1cm4gb1RhYmxlLmZpbmRFbGVtZW50cyh0cnVlLCBmdW5jdGlvbihvRWxlbTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvRWxlbS5nZXRJZCgpID09PSBvQ29udHJvbDtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRfSXNDb250cm9sUGFydE9mQ3JlYXRpb25Sb3cob0NvbnRyb2w6IGFueSkge1xuXHRcdGxldCBvUGFyZW50Q29udHJvbCA9IG9Db250cm9sLmdldFBhcmVudCgpO1xuXHRcdHdoaWxlIChcblx0XHRcdG9QYXJlbnRDb250cm9sICYmXG5cdFx0XHQhb1BhcmVudENvbnRyb2wuaXNBKFwic2FwLnVpLnRhYmxlLlJvd1wiKSAmJlxuXHRcdFx0IW9QYXJlbnRDb250cm9sLmlzQShcInNhcC51aS50YWJsZS5DcmVhdGlvblJvd1wiKSAmJlxuXHRcdFx0IW9QYXJlbnRDb250cm9sLmlzQShcInNhcC5tLkNvbHVtbkxpc3RJdGVtXCIpXG5cdFx0KSB7XG5cdFx0XHRvUGFyZW50Q29udHJvbCA9IG9QYXJlbnRDb250cm9sLmdldFBhcmVudCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiAhIW9QYXJlbnRDb250cm9sICYmIG9QYXJlbnRDb250cm9sLmlzQShcInNhcC51aS50YWJsZS5DcmVhdGlvblJvd1wiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIHRvIHJldHJpdmUgdGhlIGNvbHVtbiBpbmZvIGZvciBhc3NvY2lhdGVkIG1lc3NhZ2VzIGluIG1lc3NhZ2UgcG9wb3Zlci5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtvTWVzc2FnZX0gb01lc3NhZ2UgTWVzc2FnZSBvYmplY3Rcblx0ICogQHBhcmFtIHtvVGFibGV9IG9UYWJsZSBNREMgVGFibGVcblx0ICogQHJldHVybnMge29Db2xGcm9tVGFibGVTZXR0aW5nc30gUmV0dXJucyB0aGUgY29sdW1uIGluZm8uXG5cdCAqL1xuXHRfZmV0Y2hDb2x1bW5JbmZvKG9NZXNzYWdlOiBhbnksIG9UYWJsZTogYW55KSB7XG5cdFx0Y29uc3Qgc0NvbE5hbWVGcm9tTWVzc2FnZU9iaiA9IG9NZXNzYWdlXG5cdFx0XHQuZ2V0QmluZGluZ0NvbnRleHQoXCJtZXNzYWdlXCIpXG5cdFx0XHQuZ2V0T2JqZWN0KClcblx0XHRcdC5nZXRUYXJnZXQoKVxuXHRcdFx0LnNwbGl0KFwiL1wiKVxuXHRcdFx0LnBvcCgpO1xuXHRcdGNvbnN0IG9Db2xGcm9tVGFibGVTZXR0aW5ncyA9IG9UYWJsZVxuXHRcdFx0LmdldFBhcmVudCgpXG5cdFx0XHQuZ2V0VGFibGVEZWZpbml0aW9uKClcblx0XHRcdC5jb2x1bW5zLmZpbmQoZnVuY3Rpb24ob0NvbHVtbjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ29sdW1uLmtleS5zcGxpdChcIjo6XCIpLnBvcCgpID09PSBzQ29sTmFtZUZyb21NZXNzYWdlT2JqO1xuXHRcdFx0fSk7XG5cdFx0cmV0dXJuIG9Db2xGcm9tVGFibGVTZXR0aW5ncztcblx0fVxuXG5cdF9zZXRNZXNzYWdlU3VidGl0bGUoXG5cdFx0bWVzc2FnZTogYW55LFxuXHRcdG9UYWJsZVJvd0JpbmRpbmdDb250ZXh0czogYW55LFxuXHRcdG9UYWJsZVJvd0NvbnRleHQ6IGFueSxcblx0XHRzVGFibGVUYXJnZXRDb2xOYW1lOiBzdHJpbmcsXG5cdFx0b1Jlc291cmNlQnVuZGxlOiBhbnksXG5cdFx0c1RhYmxlVGFyZ2V0UHJvcGVydHk6IHN0cmluZyxcblx0XHRvVGFibGU6IGFueSxcblx0XHRiSXNDcmVhdGlvblJvdzogYm9vbGVhblxuXHQpIHtcblx0XHRsZXQgc01lc3NhZ2VTdWJ0aXRsZTtcblx0XHRsZXQgc1Jvd1N1YnRpdGxlVmFsdWUsIHNDb2x1bW5TdWJ0aXRsZVRleHQ7XG5cdFx0Y29uc3Qgc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSA9IHRoaXMuX2dldFRhYmxlRmlyc3RDb2xQcm9wZXJ0eShvVGFibGUpO1xuXHRcdGNvbnN0IG9Db2xGcm9tVGFibGVTZXR0aW5ncyA9IHRoaXMuX2ZldGNoQ29sdW1uSW5mbyhtZXNzYWdlLCBvVGFibGUpO1xuXHRcdGlmIChiSXNDcmVhdGlvblJvdykge1xuXHRcdFx0c01lc3NhZ2VTdWJ0aXRsZSA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9NRVNTQUdFX0lURU1fU1VCVElUTEVcIiwgb1Jlc291cmNlQnVuZGxlLCBbXG5cdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0lURU1fU1VCVElUTEVfQ1JFQVRJT05fUk9XX0lORElDQVRPUlwiKSxcblx0XHRcdFx0c1RhYmxlVGFyZ2V0Q29sTmFtZSA/IHNUYWJsZVRhcmdldENvbE5hbWUgOiBvQ29sRnJvbVRhYmxlU2V0dGluZ3MubGFiZWxcblx0XHRcdF0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvVGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0VGV4dEFubm90YXRpb24gPSB0aGlzLl9nZXRUYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRGb3JUZXh0QW5ub3RhdGlvbihcblx0XHRcdFx0b1RhYmxlLFxuXHRcdFx0XHRvVGFibGVSb3dDb250ZXh0LFxuXHRcdFx0XHRzVGFibGVGaXJzdENvbFByb3BlcnR5XG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgc1RhYmxlRmlyc3RDb2xUZXh0QW5ub3RhdGlvblBhdGggPSBvVGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0VGV4dEFubm90YXRpb25cblx0XHRcdFx0PyBvVGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0VGV4dEFubm90YXRpb24uZ2V0T2JqZWN0KFwiJFBhdGhcIilcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBzVGFibGVGaXJzdENvbFRleHRBcnJhbmdlbWVudCA9XG5cdFx0XHRcdHNUYWJsZUZpcnN0Q29sVGV4dEFubm90YXRpb25QYXRoICYmIG9UYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRUZXh0QW5ub3RhdGlvblxuXHRcdFx0XHRcdD8gb1RhYmxlRmlyc3RDb2xCaW5kaW5nQ29udGV4dFRleHRBbm5vdGF0aW9uLmdldE9iamVjdChcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnQvJEVudW1NZW1iZXJcIilcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGlmIChvVGFibGVSb3dCaW5kaW5nQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHQvLyBzZXQgUm93IHN1YnRpdGxlIHRleHRcblx0XHRcdFx0aWYgKG9UYWJsZVJvd0NvbnRleHQgJiYgc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdHNSb3dTdWJ0aXRsZVZhbHVlID0gdGhpcy5fZ2V0VGFibGVGaXJzdENvbFZhbHVlKFxuXHRcdFx0XHRcdFx0c1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdG9UYWJsZVJvd0NvbnRleHQsXG5cdFx0XHRcdFx0XHRzVGFibGVGaXJzdENvbFRleHRBbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0XHRcdHNUYWJsZUZpcnN0Q29sVGV4dEFycmFuZ2VtZW50XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzUm93U3VidGl0bGVWYWx1ZSA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0lURU1fU1VCVElUTEVfSU5ESUNBVE9SX1VOS05PV05cIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gc2V0IHRoZSBtZXNzYWdlIHN1YnRpdGxlXG5cdFx0XHRcdGlmIChzVGFibGVUYXJnZXRDb2xOYW1lKSB7XG5cdFx0XHRcdFx0Ly8gaWYgY29sdW1uIGlzIHByZXNlbnQgaW4gdGFibGUgZGVmaW5pdGlvblxuXHRcdFx0XHRcdHNNZXNzYWdlU3VidGl0bGUgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIlRfTUVTU0FHRV9JVEVNX1NVQlRJVExFXCIsIG9SZXNvdXJjZUJ1bmRsZSwgW1xuXHRcdFx0XHRcdFx0c1Jvd1N1YnRpdGxlVmFsdWUsXG5cdFx0XHRcdFx0XHRzVGFibGVUYXJnZXRDb2xOYW1lXG5cdFx0XHRcdFx0XSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAob0NvbEZyb21UYWJsZVNldHRpbmdzKSB7XG5cdFx0XHRcdFx0Ly8gaWYgY29sdW1uIGlzIG5laXRoZXIgaW4gdGFibGUgZGVmaW5pdGlvbiBub3IgcGVyc29uYWxpemF0aW9uLCBzaG93IG9ubHkgcm93IHN1YnRpdGxlIHRleHRcblx0XHRcdFx0XHRpZiAob0NvbEZyb21UYWJsZVNldHRpbmdzLmF2YWlsYWJpbGl0eSA9PT0gXCJIaWRkZW5cIikge1xuXHRcdFx0XHRcdFx0c01lc3NhZ2VTdWJ0aXRsZSA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0dST1VQX0RFU0NSSVBUSU9OX1RBQkxFX1JPV1wiKSArIFwiOiBcIiArIHNSb3dTdWJ0aXRsZVZhbHVlO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvL2lmIGNvbHVtbiBpcyBpbiB0YWJsZSBwZXJzb25hbGl6YXRpb24gYnV0IG5vdCBpbiB0YWJsZSBkZWZpbml0aW9uLCBzaG93IENvbHVtbiAoSGlkZGVuKSA6IDxjb2xOYW1lPlxuXHRcdFx0XHRcdFx0c0NvbHVtblN1YnRpdGxlVGV4dCA9XG5cdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0dST1VQX0RFU0NSSVBUSU9OX1RBQkxFX0NPTFVNTlwiKSArXG5cdFx0XHRcdFx0XHRcdFwiIChcIiArXG5cdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9DT0xVTU5fSU5ESUNBVE9SX0lOX1RBQkxFX0RFRklOSVRJT05cIikgK1xuXHRcdFx0XHRcdFx0XHRcIik6IFwiICtcblx0XHRcdFx0XHRcdFx0b0NvbEZyb21UYWJsZVNldHRpbmdzLmxhYmVsO1xuXHRcdFx0XHRcdFx0c01lc3NhZ2VTdWJ0aXRsZSA9XG5cdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0dST1VQX0RFU0NSSVBUSU9OX1RBQkxFX1JPV1wiKSArXG5cdFx0XHRcdFx0XHRcdFwiOiBcIiArXG5cdFx0XHRcdFx0XHRcdHNSb3dTdWJ0aXRsZVZhbHVlICtcblx0XHRcdFx0XHRcdFx0XCIsIFwiICtcblx0XHRcdFx0XHRcdFx0c0NvbHVtblN1YnRpdGxlVGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c01lc3NhZ2VTdWJ0aXRsZSA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9NRVNTQUdFX0lURU1fU1VCVElUTEVcIiwgb1Jlc291cmNlQnVuZGxlLCBbXG5cdFx0XHRcdFx0XHRzUm93U3VidGl0bGVWYWx1ZSxcblx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0lURU1fU1VCVElUTEVfSU5ESUNBVE9SX1VOS05PV05cIilcblx0XHRcdFx0XHRdKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c01lc3NhZ2VTdWJ0aXRsZSA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vc2V0IHRoZSBzdWJ0aXRsZVxuXHRcdG1lc3NhZ2Uuc2V0U3VidGl0bGUoc01lc3NhZ2VTdWJ0aXRsZSk7XG5cdFx0Y29uc3Qgb1RhYmxlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKFxuXHRcdFx0b1RhYmxlXG5cdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHQuZ2V0T2JqZWN0KG9UYWJsZS5kYXRhKFwiZW50aXR5VHlwZVwiKSlcblx0XHQpO1xuXHRcdC8vIFRPRE86IHRoaXMgbG9naWMgd291bGQgYmUgbW92ZWQgdG8gY2hlY2sgdGhlIHNhbWUgYXQgdGhlIHRlbXBsYXRlIHRpbWUgdG8gYXZvaWQgdGhlIHNhbWUgY2hlY2sgaGFwcGVuaW5nIG11bHRpcGxlIHRpbWVzXG5cdFx0Y29uc3Qgb0NvbXBvbmVudCA9IHNhcC51aS5yZXF1aXJlKFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCIpO1xuXHRcdGNvbnN0IG9OYXZPYmplY3QgPSBvVGFibGUgJiYgb0NvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcihvVGFibGUpICYmIG9Db21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3Iob1RhYmxlKS5nZXROYXZpZ2F0aW9uKCk7XG5cdFx0bGV0IGJTdWJPUENvbmZpZ3VyZWQgPSBmYWxzZTtcblx0XHRpZiAob05hdk9iamVjdCAmJiBPYmplY3Qua2V5cyhvTmF2T2JqZWN0KS5pbmRleE9mKG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkuc1BhdGgpICE9IC0xKSB7XG5cdFx0XHRiU3ViT1BDb25maWd1cmVkID1cblx0XHRcdFx0b05hdk9iamVjdFtvVGFibGUuZ2V0Um93QmluZGluZygpLnNQYXRoXSAmJlxuXHRcdFx0XHRvTmF2T2JqZWN0W29UYWJsZS5nZXRSb3dCaW5kaW5nKCkuc1BhdGhdLmRldGFpbCAmJlxuXHRcdFx0XHRvTmF2T2JqZWN0W29UYWJsZS5nZXRSb3dCaW5kaW5nKCkuc1BhdGhdLmRldGFpbC5yb3V0ZVxuXHRcdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHRcdDogZmFsc2U7XG5cdFx0fVxuXHRcdGNvbnN0IGJJc05hdmlnYXRpb25Db25maWd1cmVkID1cblx0XHRcdGJTdWJPUENvbmZpZ3VyZWQgJiZcblx0XHRcdG9UYWJsZS5nZXRSb3dBY3Rpb24oKSAmJlxuXHRcdFx0b1RhYmxlLmdldFJvd0FjdGlvbigpLmluZGV4T2YoXCJOYXZpZ2F0aW9uXCIpICE9IC0xICYmXG5cdFx0XHRvVGFibGVQcm9wZXJ0aWVzLmluZGV4T2Yoc1RhYmxlVGFyZ2V0UHJvcGVydHkpICE9IC0xXG5cdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHQ6IGZhbHNlO1xuXHRcdC8vIERlYWN0aXZhdGlvbiBvZiB0aGUgZXJyb3IgbGluayB3aGVuIHRoZSBlcnJvciBjb2x1bW4gaXMgbm90IGRpc3BsYXllZFxuXHRcdC8vIGJ1dCBUaGUgTGluayBzaG91bGQgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIG5vIHN1YnRpdGxlXG5cdFx0bWVzc2FnZS5zZXRBY3RpdmVUaXRsZShcblx0XHRcdCFzTWVzc2FnZVN1YnRpdGxlIHx8XG5cdFx0XHRcdGJJc05hdmlnYXRpb25Db25maWd1cmVkIHx8XG5cdFx0XHRcdGJJc0NyZWF0aW9uUm93IHx8XG5cdFx0XHRcdCghIXNUYWJsZVRhcmdldENvbE5hbWUgPyAhIW9UYWJsZVJvd0NvbnRleHQgOiAhIXNUYWJsZVRhcmdldENvbE5hbWUpXG5cdFx0KTtcblx0XHRyZXR1cm4gc01lc3NhZ2VTdWJ0aXRsZTtcblx0fVxuXG5cdF9yZW1vdmVNZXNzYWdlKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRjb25zdCBvVGVtcCA9IHNhcC51aVxuXHRcdFx0LmdldENvcmUoKVxuXHRcdFx0LmdldE1lc3NhZ2VNYW5hZ2VyKClcblx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0LmdldERhdGEoKTtcblx0XHRzYXAudWlcblx0XHRcdC5nZXRDb3JlKClcblx0XHRcdC5nZXRNZXNzYWdlTWFuYWdlcigpXG5cdFx0XHQucmVtb3ZlQWxsTWVzc2FnZXMoKTtcblx0XHRvVGVtcC5mb3JFYWNoKGZ1bmN0aW9uKG1lc3NhZ2U6IGFueSkge1xuXHRcdFx0aWYgKG1lc3NhZ2UgIT09IG9NZXNzYWdlKSB7XG5cdFx0XHRcdHNhcC51aVxuXHRcdFx0XHRcdC5nZXRDb3JlKClcblx0XHRcdFx0XHQuZ2V0TWVzc2FnZU1hbmFnZXIoKVxuXHRcdFx0XHRcdC5hZGRNZXNzYWdlcyhbbWVzc2FnZV0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1lc3NhZ2VCdXR0b247XG4iXX0=