@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,119 +1,2305 @@
1
- sap.ui.define(["sap/fe/core/CommonUtils"], function(CommonUtils) {
2
- "use strict";
3
- describe("CommonUtils - normalizeSearchTerm() input ", function() {
4
- var aTests = [
5
- {
6
- title: "is an empty search string",
7
- input: "",
8
- expected: undefined
9
- },
10
- {
11
- title: "is an undefined search term",
12
- input: undefined,
13
- expected: undefined
14
- },
15
- {
16
- title: "is a double quote",
17
- input: '"',
18
- expected: undefined
19
- },
20
- {
21
- title: "is a single quote",
22
- input: "'",
23
- expected: '"\'"'
24
- },
25
- {
26
- title: "contains two words",
27
- input: "Wuthering Heights",
28
- expected: '"Wuthering" "Heights"'
29
- },
30
- {
31
- title: "contains a tab in between",
32
- input: "Word0 Word1\tWord2 Word3",
33
- expected: '"Word0" "Word1" "Word2" "Word3"'
34
- },
35
- {
36
- title: "contains a return in between",
37
- input: "Word0 Word1\nWord2\r\nWord3",
38
- expected: '"Word0" "Word1" "Word2" "Word3"'
39
- },
40
- {
41
- title: "contains multiple words with multiple spaces at the beginning",
42
- input: " Wuthering, Heights Part-II",
43
- expected: '"Wuthering," "Heights" "Part-II"'
44
- },
45
- {
46
- title: "contains multiple words with multiple spaces in between",
47
- input: "Wuthering, Heights Part- II",
48
- expected: '"Wuthering," "Heights" "Part-" "II"'
49
- },
50
- {
51
- title: "contains multiple words with multiple spaces at the end",
52
- input: "Wuthering, Heights Part-II ",
53
- expected: '"Wuthering," "Heights" "Part-II"'
54
- },
55
- {
56
- title: "contains double quotes at the beginning",
57
- input: '"Wuthering my Heights',
58
- expected: '"Wuthering" "my" "Heights"'
59
- },
60
- {
61
- title: "contains double quotes in between",
62
- input: 'Wuth"ering',
63
- expected: '"Wuth" "ering"'
64
- },
65
- {
66
- title: "contains double quotes at the end",
67
- input: 'Wuthering no heights"',
68
- expected: '"Wuthering" "no" "heights"'
69
- },
70
- {
71
- title: "contains multiple double quotes at the beginning",
72
- input: '""Wuth"ering Heig"hts',
73
- expected: '"Wuth" "ering" "Heig" "hts"'
74
- },
75
- {
76
- title: "contains multiple double quotes in between",
77
- input: 'Wuth"eri""ng Heig"hts',
78
- expected: '"Wuth" "eri" "ng" "Heig" "hts"'
79
- },
80
- {
81
- title: "contains multiple double quotes at the end",
82
- input: 'Wuth"ering He"ights""',
83
- expected: '"Wuth" "ering" "He" "ights"'
84
- },
85
- {
86
- title: "contains a special character in string",
87
- input: "Wuth)ering",
88
- expected: '"Wuth)ering"'
89
- },
90
- {
91
- title: "contains multiple special characters in string",
92
- input: "W!u$t^h)er&in*g(",
93
- expected: '"W!u$t^h)er&in*g("'
94
- },
95
- {
96
- title: "contains single quotes in string",
97
- input: "It's Apple's new iPhone",
98
- expected: '"It\'s" "Apple\'s" "new" "iPhone"'
99
- }
100
- ];
101
-
102
- aTests.forEach(test => {
103
- it(
104
- test.title,
105
- {
106
- "references": [
107
- {
108
- "type": "JIRA",
109
- "ID": "FIORITECHP1-21846"
110
- }
111
- ]
112
- },
113
- function() {
114
- expect(CommonUtils.normalizeSearchTerm(test.input)).toBe(test.expected);
115
- }
116
- );
117
- });
118
- });
119
- });
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["path", "sap/fe/core/CommonUtils", "sap/fe/navigation/SelectionVariant", "sap/fe/test/JestTemplatingHelper", "sap/m/MessageBox", "sap/fe/core/templating/FilterHelper", "sap/m/MessageView", "sap/fe/core/actions/messageHandling", "sap/m/Dialog"], function (path, CommonUtils, SelectionVariant, JestTemplatingHelper, MessageBox, FilterHelper, MessageView, MessageHandling, Dialog) {
6
+ "use strict";
7
+
8
+ var getMetaModel = JestTemplatingHelper.getMetaModel;
9
+ var compileCDS = JestTemplatingHelper.compileCDS;
10
+
11
+ var metaModel;
12
+ beforeAll(function () {
13
+ try {
14
+ var sMetadataUrl = compileCDS(path.join(__dirname, "./data/computedDefaultValueService.cds"));
15
+ return Promise.resolve(getMetaModel(sMetadataUrl)).then(function (_getMetaModel) {
16
+ metaModel = _getMetaModel;
17
+ });
18
+ } catch (e) {
19
+ return Promise.reject(e);
20
+ }
21
+ });
22
+ describe("CommonUtils", function () {
23
+ describe("getAdditionalParamsForCreate", function () {
24
+ it("getAdditionalParamsForCreate", function () {
25
+ try {
26
+ var oUriParams = {
27
+ "SalesOrderType": ["OR"],
28
+ "SalesOrganization": ["1"]
29
+ };
30
+ var oInbounds = {
31
+ "SalesOrderType": {
32
+ "useForCreate": true
33
+ },
34
+ "SalesOrganization": {
35
+ "useForCreate": true
36
+ },
37
+ "DistributionChannel": {
38
+ "useForCreate": true
39
+ }
40
+ };
41
+ var oExpectedOutput = {
42
+ SalesOrderType: "OR",
43
+ SalesOrganization: "1"
44
+ };
45
+ var actualOutput = CommonUtils.getAdditionalParamsForCreate(oUriParams, oInbounds);
46
+ expect(actualOutput).toEqual(oExpectedOutput);
47
+ return Promise.resolve();
48
+ } catch (e) {
49
+ return Promise.reject(e);
50
+ }
51
+ });
52
+ it("getAdditionalParamsForCreate - no start up parameters", function () {
53
+ try {
54
+ var oUriParams = {};
55
+ var oInbounds = {
56
+ "SalesOrderType": {
57
+ "useForCreate": true
58
+ },
59
+ "SalesOrganization": {
60
+ "useForCreate": true
61
+ },
62
+ "DistributionChannel": {
63
+ "useForCreate": true
64
+ }
65
+ };
66
+ var oExpectedOutput = undefined;
67
+ var actualOutput = CommonUtils.getAdditionalParamsForCreate(oUriParams, oInbounds);
68
+ expect(actualOutput).toEqual(oExpectedOutput);
69
+ return Promise.resolve();
70
+ } catch (e) {
71
+ return Promise.reject(e);
72
+ }
73
+ });
74
+ it("getAdditionalParamsForCreate - no Inbound Parameters", function () {
75
+ try {
76
+ var oUriParams = {
77
+ "SalesOrderType": ["OR"],
78
+ "SalesOrganization": ["1"]
79
+ };
80
+ var oInbounds = {};
81
+ var oExpectedOutput = undefined;
82
+ var actualOutput = CommonUtils.getAdditionalParamsForCreate(oUriParams, oInbounds);
83
+ expect(actualOutput).toEqual(oExpectedOutput);
84
+ return Promise.resolve();
85
+ } catch (e) {
86
+ return Promise.reject(e);
87
+ }
88
+ });
89
+ it("getAdditionalParamsForCreate - no Inbound and start up Parameters", function () {
90
+ try {
91
+ var oUriParams = {};
92
+ var oInbounds = {};
93
+ var oExpectedOutput = undefined;
94
+ var actualOutput = CommonUtils.getAdditionalParamsForCreate(oUriParams, oInbounds);
95
+ expect(actualOutput).toEqual(oExpectedOutput);
96
+ return Promise.resolve();
97
+ } catch (e) {
98
+ return Promise.reject(e);
99
+ }
100
+ });
101
+ });
102
+ describe("getNonComputedVisibleFields", function () {
103
+ it("getNonComputedVisibleFields - GUID ComputedDefaultValue key field with text annotation", function () {
104
+ try {
105
+ var aExpectedOutput = ["ID", "ImmutableNonKeyWithText", "ImmutableNonKeyWithoutText"];
106
+ var actualOutput = CommonUtils.getNonComputedVisibleFields(metaModel, "/EntityWithKeyFieldHavingText");
107
+ expect(actualOutput).toEqual(aExpectedOutput);
108
+ return Promise.resolve();
109
+ } catch (e) {
110
+ return Promise.reject(e);
111
+ }
112
+ });
113
+ it("getNonComputedVisibleFields - GUID ComputedDefaultValue key field without text annotation", function () {
114
+ try {
115
+ var aExpectedOutput = [];
116
+ var actualOutput = CommonUtils.getNonComputedVisibleFields(metaModel, "/EntityWithKeyFieldNotHavingText");
117
+ expect(actualOutput).toEqual(aExpectedOutput);
118
+ return Promise.resolve();
119
+ } catch (e) {
120
+ return Promise.reject(e);
121
+ }
122
+ });
123
+ it("getNonComputedVisibleFields - Hidden GUID ComputedDefaultValue key field", function () {
124
+ try {
125
+ var aExpectedOutput = [];
126
+ var actualOutput = CommonUtils.getNonComputedVisibleFields(metaModel, "/EntityWithHiddenKeyField");
127
+ expect(actualOutput).toEqual(aExpectedOutput);
128
+ return Promise.resolve();
129
+ } catch (e) {
130
+ return Promise.reject(e);
131
+ }
132
+ });
133
+ it("getNonComputedVisibleFields - ReadOnly GUID ComputedDefaultValue key field", function () {
134
+ try {
135
+ var aExpectedOutput = ["ID"];
136
+ var actualOutput = CommonUtils.getNonComputedVisibleFields(metaModel, "/EntityWithReadOnlyKeyFieldHavingText");
137
+ expect(actualOutput).toEqual(aExpectedOutput);
138
+ return Promise.resolve();
139
+ } catch (e) {
140
+ return Promise.reject(e);
141
+ }
142
+ });
143
+ it("getNonComputedVisibleFields - ReadOnly GUID ComputedDefaultValue key field", function () {
144
+ try {
145
+ var aExpectedOutput = [];
146
+ var actualOutput = CommonUtils.getNonComputedVisibleFields(metaModel, "/EntityWithReadOnlyKeyFieldNotHavingText");
147
+ expect(actualOutput).toEqual(aExpectedOutput);
148
+ return Promise.resolve();
149
+ } catch (e) {
150
+ return Promise.reject(e);
151
+ }
152
+ });
153
+ it("getNonComputedVisibleFields - GUID key field with both Computed and ComputeDefaultValue annotation without view", function () {
154
+ try {
155
+ var aExpectedOutput = [];
156
+ var actualOutput = CommonUtils.getNonComputedVisibleFields(metaModel, "/EntityWithComputedAndComputedDefaultValueKeyField");
157
+ expect(actualOutput).toEqual(aExpectedOutput);
158
+ return Promise.resolve();
159
+ } catch (e) {
160
+ return Promise.reject(e);
161
+ }
162
+ });
163
+ it("getNonComputedVisibleFields - GUID key field with both Computed and ComputeDefaultValue annotation", function () {
164
+ try {
165
+ var aExpectedOutput = [];
166
+ var oView = {
167
+ isA: jest.fn().mockReturnValue(true),
168
+ getDiagnostics: jest.fn().mockReturnValue({
169
+ addIssue: jest.fn().mockReturnValue("")
170
+ })
171
+ };
172
+ var actualOutput = CommonUtils.getNonComputedVisibleFields(metaModel, "/EntityWithComputedAndComputedDefaultValueKeyField", oView);
173
+ expect(oView.getDiagnostics().addIssue).toHaveBeenCalled();
174
+ expect(actualOutput).toEqual(aExpectedOutput);
175
+ return Promise.resolve();
176
+ } catch (e) {
177
+ return Promise.reject(e);
178
+ }
179
+ });
180
+ });
181
+ describe("getOperatorsForProperty", function () {
182
+ it("getOperatorsForProperty - Single Value Allowed Expressions", function () {
183
+ try {
184
+ [{
185
+ dataField: "SalesOrderDate",
186
+ oContext: {
187
+ getObject: function (path) {
188
+ // Edm type
189
+ if (path === "/dummy/SalesOrderDate/$Type") {
190
+ return "Edm.Date";
191
+ } else {
192
+ // Filter Annotations
193
+ return {
194
+ FilterExpressionRestrictions: [{
195
+ Property: {
196
+ $PropertyPath: "SalesOrderDate"
197
+ },
198
+ AllowedExpressions: "SingleValue"
199
+ }]
200
+ };
201
+ }
202
+ }
203
+ },
204
+ expectedValue: "DATE,TODAY,YESTERDAY,TOMORROW,FIRSTDAYWEEK,LASTDAYWEEK,FIRSTDAYMONTH,LASTDAYMONTH,FIRSTDAYQUARTER,LASTDAYQUARTER,FIRSTDAYYEAR,LASTDAYYEAR",
205
+ sMessage: "Edm.Date and Single Value Or Search Expressions"
206
+ }, {
207
+ dataField: "SalesOrderDate",
208
+ oContext: {
209
+ getObject: function (path) {
210
+ // Edm type
211
+ if (path === "/dummy/SalesOrderDate/$Type") {
212
+ return "Edm.String";
213
+ } else {
214
+ // Filter Annotations
215
+ return {
216
+ FilterExpressionRestrictions: [{
217
+ Property: {
218
+ $PropertyPath: "SalesOrderDate"
219
+ },
220
+ AllowedExpressions: "SingleValue"
221
+ }]
222
+ };
223
+ }
224
+ }
225
+ },
226
+ expectedValue: "EQ",
227
+ sMessage: "Edm.String and Single Value Or Search Expressions"
228
+ }].forEach(function (oProperty) {
229
+ var actualValue = CommonUtils.getOperatorsForProperty(oProperty.dataField, "/dummy", oProperty.oContext, oProperty.oContext.getObject("/dummy/" + oProperty.dataField + "/$Type"), true);
230
+ expect(actualValue).toEqual(oProperty.expectedValue);
231
+ });
232
+ return Promise.resolve();
233
+ } catch (e) {
234
+ return Promise.reject(e);
235
+ }
236
+ });
237
+ });
238
+ describe("CommonUtils - normalizeSearchTerm() input ", function () {
239
+ var aTests = [{
240
+ title: "is an empty search string",
241
+ input: "",
242
+ expected: undefined
243
+ }, {
244
+ title: "is an undefined search term",
245
+ input: undefined,
246
+ expected: undefined
247
+ }, {
248
+ title: "is a double quote",
249
+ input: '"',
250
+ expected: undefined
251
+ }, {
252
+ title: "is a single quote",
253
+ input: "'",
254
+ expected: '"\'"'
255
+ }, {
256
+ title: "contains two words",
257
+ input: "Wuthering Heights",
258
+ expected: '"Wuthering" "Heights"'
259
+ }, {
260
+ title: "contains a tab in between",
261
+ input: "Word0 Word1\tWord2 Word3",
262
+ expected: '"Word0" "Word1" "Word2" "Word3"'
263
+ }, {
264
+ title: "contains a return in between",
265
+ input: "Word0 Word1\nWord2\r\nWord3",
266
+ expected: '"Word0" "Word1" "Word2" "Word3"'
267
+ }, {
268
+ title: "contains multiple words with multiple spaces at the beginning",
269
+ input: " Wuthering, Heights Part-II",
270
+ expected: '"Wuthering," "Heights" "Part-II"'
271
+ }, {
272
+ title: "contains multiple words with multiple spaces in between",
273
+ input: "Wuthering, Heights Part- II",
274
+ expected: '"Wuthering," "Heights" "Part-" "II"'
275
+ }, {
276
+ title: "contains multiple words with multiple spaces at the end",
277
+ input: "Wuthering, Heights Part-II ",
278
+ expected: '"Wuthering," "Heights" "Part-II"'
279
+ }, {
280
+ title: "contains double quotes at the beginning",
281
+ input: '"Wuthering my Heights',
282
+ expected: '"Wuthering" "my" "Heights"'
283
+ }, {
284
+ title: "contains double quotes in between",
285
+ input: 'Wuth"ering',
286
+ expected: '"Wuth" "ering"'
287
+ }, {
288
+ title: "contains double quotes at the end",
289
+ input: 'Wuthering no heights"',
290
+ expected: '"Wuthering" "no" "heights"'
291
+ }, {
292
+ title: "contains multiple double quotes at the beginning",
293
+ input: '""Wuth"ering Heig"hts',
294
+ expected: '"Wuth" "ering" "Heig" "hts"'
295
+ }, {
296
+ title: "contains multiple double quotes in between",
297
+ input: 'Wuth"eri""ng Heig"hts',
298
+ expected: '"Wuth" "eri" "ng" "Heig" "hts"'
299
+ }, {
300
+ title: "contains multiple double quotes at the end",
301
+ input: 'Wuth"ering He"ights""',
302
+ expected: '"Wuth" "ering" "He" "ights"'
303
+ }, {
304
+ title: "contains a special character in string",
305
+ input: "Wuth)ering",
306
+ expected: '"Wuth)ering"'
307
+ }, {
308
+ title: "contains multiple special characters in string",
309
+ input: "W!u$t^h)er&in*g(",
310
+ expected: '"W!u$t^h)er&in*g("'
311
+ }, {
312
+ title: "contains single quotes in string",
313
+ input: "It's Apple's new iPhone",
314
+ expected: '"It\'s" "Apple\'s" "new" "iPhone"'
315
+ }];
316
+ aTests.forEach(function (test) {
317
+ it(test.title, {
318
+ "references": [{
319
+ "type": "JIRA",
320
+ "ID": "FIORITECHP1-21846"
321
+ }]
322
+ }, function () {
323
+ expect(CommonUtils.normalizeSearchTerm(test.input)).toBe(test.expected);
324
+ });
325
+ });
326
+ });
327
+ describe("Unit Test for isStickyEditMode", function () {
328
+ test("Unit test to check isStickyEditMode", function () {
329
+ [{
330
+ "oControl": {
331
+ getModel: function () {
332
+ return {
333
+ getMetaModel: function () {
334
+ return {
335
+ getObject: function (sParam) {
336
+ return sParam === "/" ? {
337
+ "rootEntitySet": {
338
+ $kind: "EntitySet"
339
+ }
340
+ } : {
341
+ "@com.sap.vocabularies.Session.v1.StickySessionSupported": true
342
+ };
343
+ }
344
+ };
345
+ },
346
+ getProperty: function () {
347
+ return true;
348
+ }
349
+ };
350
+ }
351
+ },
352
+ "expectedValue": true,
353
+ "sMessage": "Matched"
354
+ }, {
355
+ "oControl": {
356
+ getModel: function () {
357
+ return {
358
+ getMetaModel: function () {
359
+ return {
360
+ getObject: function (sParam) {
361
+ return sParam === "/" ? {
362
+ "rootEntitySet": {
363
+ $kind: "EntitySet"
364
+ }
365
+ } : null;
366
+ }
367
+ };
368
+ },
369
+ getProperty: function () {
370
+ return true;
371
+ }
372
+ };
373
+ }
374
+ },
375
+ "expectedValue": false,
376
+ "sMessage": "Matched"
377
+ }, {
378
+ "oControl": {
379
+ getModel: function () {
380
+ return {
381
+ getMetaModel: function () {
382
+ return {
383
+ getObject: function (sParam) {
384
+ return sParam === "/" ? {
385
+ "rootEntitySet": {
386
+ $kind: "EntitySet"
387
+ }
388
+ } : {
389
+ "@com.sap.vocabularies.Session.v1.StickySessionSupported": true
390
+ };
391
+ }
392
+ };
393
+ },
394
+ getProperty: function () {
395
+ return false;
396
+ }
397
+ };
398
+ }
399
+ },
400
+ "expectedValue": false,
401
+ "sMessage": "Matched"
402
+ }].forEach(function (oProperty) {
403
+ var actualValue = CommonUtils.isStickyEditMode(oProperty.oControl);
404
+ expect(actualValue).toEqual(oProperty.expectedValue); //, "Unit test to check isStickyEditMode() " + oProperty.sMessage + " : ok");
405
+ });
406
+ });
407
+ });
408
+ describe("Unit Test for isFieldControlPathInapplicable", function () {
409
+ test("Unit test to check isFieldControlPathInapplicable", function () {
410
+ [{
411
+ "attribute": {
412
+ "prop1": "A",
413
+ "prop2": "B",
414
+ "fieldControl": 0
415
+ },
416
+ "fieldControlPath": "fieldControl",
417
+ "expectedValue": true,
418
+ "message": "for inapplicable"
419
+ }, {
420
+ "attribute": {
421
+ "prop1": "A",
422
+ "prop2": "B",
423
+ "fieldControl": 7
424
+ },
425
+ "fieldControlPath": "fieldControl",
426
+ "expectedValue": false,
427
+ "message": "for different value"
428
+ }, {
429
+ "attribute": {
430
+ "prop1": "A",
431
+ "prop2": "B"
432
+ },
433
+ "fieldControlPath": "fieldControl",
434
+ "expectedValue": false,
435
+ "message": "when property doesn't exists"
436
+ }].forEach(function (oProperty) {
437
+ var actualValue = CommonUtils.isFieldControlPathInapplicable(oProperty.fieldControlPath, oProperty.attribute);
438
+ expect(actualValue).toEqual(oProperty.expectedValue); // ,"Unit test to check isFieldControlPathInapplicable() " + oProperty.message + " : ok"
439
+ });
440
+ });
441
+ });
442
+ describe("Unit Test for Remove Sensitive Data", function () {
443
+ test("Unit Test to check removeSensitiveData", function () {
444
+ var aAttributes = [{
445
+ "contextData": {
446
+ "%40odata.context": "yolo",
447
+ "SensitiveProp": "A",
448
+ "PublicationUUID": "00505691-8175-1ed8-9dbe-64c14268326b",
449
+ "FieldControlStatic": "D",
450
+ "fieldControl": 0
451
+ },
452
+ "entitySet": "SalesOrderManage"
453
+ }, {
454
+ "contextData": {
455
+ "%40odata.metadataEtag": "yolo",
456
+ "ExcludeNavProp": "B",
457
+ "PublicationUUID": "00505691-8175-1ed8-9dbe-64c14268326888",
458
+ "fieldControl": 7
459
+ },
460
+ "entitySet": "SalesOrderManage"
461
+ }, {
462
+ "contextData": {
463
+ "HasActiveEntity": false
464
+ },
465
+ "entitySet": "SalesOrderManage"
466
+ }],
467
+ oMetaModel = {
468
+ getObject: function (sPath) {
469
+ if (sPath.indexOf("PublicationUUID@") > -1) {
470
+ return {
471
+ "@com.sap.vocabularies.Common.v1.FieldControl": {
472
+ "$Path": "fieldControl"
473
+ }
474
+ };
475
+ } else if (sPath.indexOf("FieldControlStatic@") > -1) {
476
+ return {
477
+ "@com.sap.vocabularies.Common.v1.FieldControl": {
478
+ "$EnumMember": "@com.sap.vocabularies.Common.v1.FieldControl/Inapplicable"
479
+ }
480
+ };
481
+ } else if (sPath.indexOf("SensitiveProp@") > -1) {
482
+ return {
483
+ "@com.sap.vocabularies.PersonalData.v1.IsPotentiallySensitive": {
484
+ "$Path": "fieldControl"
485
+ }
486
+ };
487
+ } else if (sPath.indexOf("ExcludeNavProp@") > -1) {
488
+ return {
489
+ "@com.sap.vocabularies.UI.v1.ExcludeFromNavigationContext": {
490
+ "$Path": "fieldControl"
491
+ }
492
+ };
493
+ }
494
+ }
495
+ },
496
+ ExpectedResult = [{
497
+ "fieldControl": 0
498
+ }, {
499
+ "PublicationUUID": "00505691-8175-1ed8-9dbe-64c14268326888",
500
+ "fieldControl": 7
501
+ }, {
502
+ "HasActiveEntity": false
503
+ }];
504
+ var Result = CommonUtils.removeSensitiveData(aAttributes, oMetaModel);
505
+ expect(JSON.stringify(ExpectedResult)).toEqual(JSON.stringify(Result));
506
+ });
507
+ });
508
+ describe("Unit Test for isPropertyFilterable", function () {
509
+ test("Unit test to check isPropertyFilterable with hidden", function () {
510
+ var fnCreateModel = function (oModel) {
511
+ return Object.assign({
512
+ createBindingContext: function () {
513
+ return {
514
+ getProperty: oModel.getObject
515
+ };
516
+ },
517
+ getProperty: function (sPath) {
518
+ return sPath === "/parameterEntity/@com.sap.vocabularies.Common.v1.ResultContext";
519
+ },
520
+ getObject: function (sPath) {
521
+ return sPath === "/parameterEntity/@com.sap.vocabularies.Common.v1.ResultContext";
522
+ }
523
+ }, oModel);
524
+ };
525
+
526
+ [{
527
+ model: {
528
+ getObject: function (sPath) {
529
+ if (sPath === "@com.sap.vocabularies.UI.v1.Hidden") {
530
+ return true;
531
+ }
532
+
533
+ return {
534
+ "prop1": {}
535
+ };
536
+ }
537
+ },
538
+ entitySetPath: "/entitySet",
539
+ property: "prop1",
540
+ skipHiddenFilter: false,
541
+ expectedValue: false,
542
+ message: "full path and hidden"
543
+ }, {
544
+ model: {
545
+ getObject: function (sPath) {
546
+ if (sPath === "@com.sap.vocabularies.UI.v1.HiddenFilter") {
547
+ return true;
548
+ }
549
+
550
+ return {
551
+ "prop1": {}
552
+ };
553
+ }
554
+ },
555
+ entitySetPath: "/entitySet",
556
+ property: "prop1",
557
+ skipHiddenFilter: false,
558
+ expectedValue: false,
559
+ message: "full path and hidden filter"
560
+ }, {
561
+ model: {
562
+ getObject: function (sPath) {
563
+ if (sPath === "@com.sap.vocabularies.UI.v1.Hidden") {
564
+ return true;
565
+ }
566
+
567
+ return {
568
+ "prop1": {}
569
+ };
570
+ }
571
+ },
572
+ entitySetPath: "/entitySet",
573
+ property: "prop1",
574
+ skipHiddenFilter: false,
575
+ expectedValue: false,
576
+ message: "hidden"
577
+ }, {
578
+ model: {
579
+ getObject: function (sPath) {
580
+ if (sPath === "@com.sap.vocabularies.UI.v1.HiddenFilter") {
581
+ return true;
582
+ }
583
+
584
+ return {
585
+ "prop1": {}
586
+ };
587
+ }
588
+ },
589
+ entitySetPath: "/entitySet",
590
+ property: "prop1",
591
+ skipHiddenFilter: false,
592
+ expectedValue: false,
593
+ message: "hidden filter"
594
+ }, {
595
+ model: {
596
+ getObject: function (sPath) {
597
+ if (sPath === "/entitySet@Org.OData.Capabilities.V1.FilterRestrictions") {
598
+ return {
599
+ NonFilterableProperties: [{
600
+ $PropertyPath: "prop1"
601
+ }]
602
+ };
603
+ }
604
+
605
+ return {
606
+ "prop1": {}
607
+ };
608
+ }
609
+ },
610
+ entitySetPath: "/entitySet",
611
+ property: "prop1",
612
+ skipHiddenFilter: false,
613
+ expectedValue: false,
614
+ message: "non-filterable"
615
+ }, {
616
+ model: {
617
+ getObject: function (sPath) {
618
+ if (sPath === "/entitySet@Org.OData.Capabilities.V1.FilterRestrictions") {
619
+ return {
620
+ NonFilterableProperties: [{
621
+ $PropertyPath: "prop1"
622
+ }]
623
+ };
624
+ }
625
+
626
+ return {
627
+ "prop1": {}
628
+ };
629
+ }
630
+ },
631
+ entitySetPath: "/entitySet",
632
+ property: "prop1",
633
+ skipHiddenFilter: false,
634
+ expectedValue: false,
635
+ message: "full path and non-filterable"
636
+ }, {
637
+ model: {
638
+ getObject: function (sPath) {
639
+ if (!sPath) {
640
+ return {};
641
+ }
642
+
643
+ switch (sPath) {
644
+ case "/entitySet/prop1@com.sap.vocabularies.UI.v1.HiddenFilter":
645
+ return true;
646
+
647
+ case "$Type":
648
+ return "Edm.String";
649
+
650
+ case "$kind":
651
+ return "Property";
652
+
653
+ case "/entitySet/":
654
+ return {
655
+ "prop1": {}
656
+ };
657
+
658
+ default:
659
+ return undefined;
660
+ }
661
+ }
662
+ },
663
+ entitySetPath: "/entitySet",
664
+ property: "prop1",
665
+ skipHiddenFilter: true,
666
+ expectedValue: true,
667
+ message: "skip hidden filter"
668
+ }, {
669
+ model: {
670
+ getObject: function (sPath) {
671
+ if (!sPath) {
672
+ return {};
673
+ }
674
+
675
+ switch (sPath) {
676
+ case "$Type":
677
+ return "Edm.Stream";
678
+
679
+ case "$kind":
680
+ return "Property";
681
+
682
+ case "/entitySet/":
683
+ return {
684
+ "prop1": {}
685
+ };
686
+
687
+ default:
688
+ return undefined;
689
+ }
690
+ }
691
+ },
692
+ entitySetPath: "/entitySet",
693
+ property: "prop1",
694
+ skipHiddenFilter: false,
695
+ expectedValue: false,
696
+ message: "type not filterable"
697
+ }, {
698
+ model: {
699
+ getObject: function (sPath) {
700
+ if (!sPath) {
701
+ return {};
702
+ }
703
+
704
+ switch (sPath) {
705
+ case "$Type":
706
+ return "Edm.String";
707
+
708
+ case "$kind":
709
+ return "Property";
710
+
711
+ case "/entitySet/":
712
+ return {
713
+ "prop1": {}
714
+ };
715
+
716
+ default:
717
+ return undefined;
718
+ }
719
+ }
720
+ },
721
+ entitySetPath: "/entitySet",
722
+ property: "prop1",
723
+ skipHiddenFilter: false,
724
+ expectedValue: true,
725
+ message: "type filterable"
726
+ }, {
727
+ model: {
728
+ getObject: function (sPath) {
729
+ if (!sPath) {
730
+ return {};
731
+ }
732
+
733
+ switch (sPath) {
734
+ case "$Type":
735
+ return "com.sap.vocabularies.UI.v1.DataField";
736
+
737
+ case "Value/$Path/$Type":
738
+ return "Edm.Stream";
739
+
740
+ case "/entitySet/":
741
+ return {
742
+ "prop1": {}
743
+ };
744
+
745
+ default:
746
+ return undefined;
747
+ }
748
+ }
749
+ },
750
+ entitySetPath: "/entitySet",
751
+ property: "prop1",
752
+ skipHiddenFilter: false,
753
+ expectedValue: false,
754
+ message: "datafield type not filterable"
755
+ }, {
756
+ model: {
757
+ getObject: function (sPath) {
758
+ if (!sPath) {
759
+ return {};
760
+ }
761
+
762
+ switch (sPath) {
763
+ case "$Type":
764
+ return "com.sap.vocabularies.UI.v1.DataField";
765
+
766
+ case "Value/$Path/$Type":
767
+ return "Edm.String";
768
+
769
+ case "/entitySet/":
770
+ return {
771
+ "prop1": {}
772
+ };
773
+
774
+ default:
775
+ return undefined;
776
+ }
777
+ }
778
+ },
779
+ entitySetPath: "/entitySet",
780
+ property: "prop1",
781
+ skipHiddenFilter: false,
782
+ expectedValue: true,
783
+ message: "datafield type filterable"
784
+ }, {
785
+ model: {},
786
+ entitySetPath: "/parameterEntity",
787
+ property: "prop1",
788
+ skipHiddenFilter: false,
789
+ expectedValue: true,
790
+ message: "parameter"
791
+ }].forEach(function (oProperty) {
792
+ var actualValue = CommonUtils.isPropertyFilterable(fnCreateModel(oProperty.model), oProperty.entitySetPath, oProperty.property, oProperty.skipHiddenFilter);
793
+ expect(actualValue).toEqual(oProperty.expectedValue); // ,"Unit test to check isPropertyFilterable with " + oProperty.message + " : ok"
794
+ });
795
+ });
796
+ });
797
+ describe("Test CommonUtils : addSelectionVariantToConditions", function () {
798
+ var that = {};
799
+ beforeEach(function () {
800
+ //CREATE MOCK
801
+ that.getValueStub = jest.spyOn(FilterHelper, "getTypeCompliantValue").mockImplementation(function fakeFn(oValue) {
802
+ return oValue;
803
+ });
804
+ that.getOperatorStub = jest.spyOn(CommonUtils, "getOperatorsForProperty").mockImplementation(function fakeFn() {
805
+ return undefined;
806
+ });
807
+ that.getValidPropsStub = jest.spyOn(CommonUtils, "getContextPathProperties").mockImplementation(function fakeFn(oValue) {
808
+ return that.validProperties;
809
+ });
810
+ that.getFilterableStub = jest.spyOn(CommonUtils, "isPropertyFilterable").mockImplementation(function fakeFn(oValue) {
811
+ return true;
812
+ });
813
+ that.getParameterInfoStub = jest.spyOn(CommonUtils, "getParameterInfo").mockImplementation(function fakeFn(oValue) {
814
+ return that.parameterInfo;
815
+ });
816
+ });
817
+ afterEach(function () {
818
+ //RESTORE
819
+ that.getValueStub.mockRestore();
820
+ that.getOperatorStub.mockRestore();
821
+ that.getValidPropsStub.mockRestore();
822
+ that.getFilterableStub.mockRestore();
823
+ that.getParameterInfoStub.mockRestore();
824
+ });
825
+ test("Test convertion of Selection Variant to conditions without valid properties.", function () {
826
+ var oSV = new SelectionVariant(),
827
+ oConditions = {};
828
+ oSV.addSelectOption("attribute1", "I", "EQ", "value1");
829
+ that.validProperties = {};
830
+ that.parameterInfo = {};
831
+ CommonUtils.addSelectionVariantToConditions(oSV, oConditions, {}, ""); //CHECK
832
+
833
+ expect(Object.keys(oConditions).length).toEqual(0); //, "CommonUtils: No conditions are added without any valid properties.");
834
+ });
835
+ test("Test conversion of Selection Variant to conditions with empty SV.", function () {
836
+ var oSV = new SelectionVariant(),
837
+ oConditions = {};
838
+ that.validProperties = {
839
+ "attribute1": {
840
+ $Type: "Edm.Boolean"
841
+ },
842
+ "attribute2": {
843
+ $Type: "Edm.String"
844
+ }
845
+ };
846
+ that.parameterInfo = {};
847
+ CommonUtils.addSelectionVariantToConditions(oSV, oConditions, {}, ""); //CHECK
848
+
849
+ expect(Object.keys(oConditions).length).toEqual(0); // "CommonUtils: No conditions are added with empty SV.");
850
+ });
851
+ test("Test conversion of Selection Variant to conditions.", function () {
852
+ var oSV = new SelectionVariant();
853
+ var oConditions = {};
854
+ var iCount = 0;
855
+ that.validProperties = {
856
+ "attribute1": {
857
+ $Type: "Edm.Boolean"
858
+ },
859
+ "attribute2": {
860
+ $Type: "Edm.String"
861
+ },
862
+ "Material": {
863
+ $Type: "Edm.String"
864
+ },
865
+ "MaterialCategory": {
866
+ $Type: "Edm.String"
867
+ },
868
+ "ItemNumber": {
869
+ $Type: "Edm.String"
870
+ },
871
+ "CityName": {
872
+ $Type: "Edm.String"
873
+ }
874
+ };
875
+ that.parameterInfo = {};
876
+ var oMetaModel = {
877
+ getObject: function (sPath) {
878
+ if (sPath.includes("_Item")) {
879
+ return {
880
+ sPath: sPath,
881
+ $isCollection: true,
882
+ $Type: "Edm.String"
883
+ };
884
+ } else {
885
+ return {
886
+ sPath: sPath,
887
+ $Type: "Edm.String"
888
+ };
889
+ }
890
+ }
891
+ };
892
+ oSV.addSelectOption("attribute1", "I", "EQ", "true");
893
+ oSV.addSelectOption("attribute2", "I", "EQ", "value1");
894
+ oSV.addSelectOption("attribute2", "I", "EQ", "value2");
895
+ oSV.addSelectOption("SalesOrderManage._Item.Material", "I", "EQ", "VNG01");
896
+ oSV.addSelectOption("_MaterialDetails.MaterialCategory", "I", "EQ", "A");
897
+ oSV.addSelectOption("ItemDetails.ItemNumber", "I", "EQ", "10");
898
+ CommonUtils.addSelectionVariantToConditions(oSV, oConditions, oMetaModel, "/SalesOrderManage");
899
+ oSV = new SelectionVariant();
900
+ oSV.addSelectOption("Customer.Set.CityName", "I", "EQ", "ABC");
901
+ CommonUtils.addSelectionVariantToConditions(oSV, oConditions, oMetaModel, "/Customer/Set");
902
+ var aProperties = Object.keys(oConditions);
903
+ aProperties.forEach(function (sPropertyName) {
904
+ iCount += oConditions[sPropertyName].length;
905
+ }); //CHECK
906
+
907
+ expect(aProperties.length).toEqual(6); // "CommonUtils: Correct no. of propertyPath are added from SV.");
908
+
909
+ expect(iCount).toEqual(7); // "CommonUtils: Correct no. of conditions are added from SV.");
910
+
911
+ expect(oConditions["SalesOrderManage/_Item*/Material"][0].values[0]).toEqual("VNG01"); //, "Conditions for navigation path is added");
912
+
913
+ expect(oConditions["_MaterialDetails/MaterialCategory"][0].values[0]).toEqual("A"); //, "Conditions for navigation path is added");
914
+
915
+ expect(oConditions["ItemDetails/ItemNumber"][0].values[0]).toEqual("10"); //, "Conditions for navigation path is added");
916
+
917
+ expect(oConditions["Customer/Set/CityName"][0].values[0]).toEqual("ABC"); //"Conditions for navigation path in case of pamaterized service is added"
918
+ });
919
+ test("Test conversion of Selection Variant to conditions with parameters.", function () {
920
+ var oSV = new SelectionVariant(),
921
+ oConditions = {};
922
+ var iCount = 0;
923
+ that.validProperties = {
924
+ "attribute1": {
925
+ $Type: "Edm.String"
926
+ }
927
+ };
928
+ that.parameterInfo = {
929
+ contextPath: "/Customer/Set",
930
+ parameterProperties: {
931
+ "param1": {
932
+ $Type: "Edm.Boolean"
933
+ },
934
+ "param2": {
935
+ $Type: "Edm.String"
936
+ }
937
+ }
938
+ };
939
+ oSV.addSelectOption("attribute1", "I", "EQ", "value1");
940
+ oSV.addSelectOption("$Parameter.param1", "I", "EQ", "true");
941
+ oSV.addSelectOption("P_param2", "I", "EQ", "paramValue1");
942
+ CommonUtils.addSelectionVariantToConditions(oSV, oConditions, {}, "");
943
+ var aProperties = Object.keys(oConditions);
944
+ aProperties.forEach(function (sPropertyName) {
945
+ iCount += oConditions[sPropertyName].length;
946
+ }); //CHECK
947
+
948
+ expect(aProperties.length).toEqual(3); //, "CommonUtils: Correct no. of propertyPath are added from SV.");
949
+
950
+ expect(iCount).toEqual(3); //, "CommonUtils: Correct no. of conditions are added from SV.");
951
+ });
952
+ test("Test conversion of Selection Variant to conditions with conflicting parameters.", function () {
953
+ var oSV = new SelectionVariant(),
954
+ oConditions = {};
955
+ var iCount = 0;
956
+ that.validProperties = {
957
+ "attribute1": {
958
+ $Type: "Edm.String"
959
+ }
960
+ };
961
+ that.parameterInfo = {
962
+ contextPath: "/Customer/Set",
963
+ parameterProperties: {
964
+ "param1": {
965
+ $Type: "Edm.Boolean"
966
+ },
967
+ "param2": {
968
+ $Type: "Edm.String"
969
+ }
970
+ }
971
+ };
972
+ oSV.addSelectOption("attribute1", "I", "EQ", "value1");
973
+ oSV.addSelectOption("P_param1", "I", "EQ", "false");
974
+ oSV.addSelectOption("$Parameter.param1", "I", "EQ", "true");
975
+ oSV.addSelectOption("$Parameter.param2", "I", "EQ", "paramValue2_$");
976
+ oSV.addSelectOption("P_param2", "I", "EQ", "paramValue2_P");
977
+ CommonUtils.addSelectionVariantToConditions(oSV, oConditions, {}, "");
978
+ var aProperties = Object.keys(oConditions);
979
+ aProperties.forEach(function (sPropertyName) {
980
+ iCount += oConditions[sPropertyName].length;
981
+ });
982
+ var param1Value = oConditions["param1"][0].values[0] === true;
983
+ var param2Value = oConditions["param2"][0].values[0] === "paramValue2_$"; //CHECK
984
+
985
+ expect(param1Value && param2Value).toBe(true); //, "CommonUtils: Correct parameter values are added from SV.");
986
+
987
+ expect(aProperties.length).toEqual(3); // === 3, "CommonUtils: Correct no. of propertyPath are added from SV.");
988
+
989
+ expect(iCount).toEqual(3); // === 3, "CommonUtils: Correct no. of conditions are added from SV.");
990
+ });
991
+ test("Test conversion of Selection Variant to conditions with parameters case of 'param -> P_param'.", function () {
992
+ var oSV = new SelectionVariant(),
993
+ oConditions = {};
994
+ var iCount = 0;
995
+ that.validProperties = {
996
+ "attribute1": {
997
+ $Type: "Edm.String"
998
+ }
999
+ };
1000
+ that.parameterInfo = {
1001
+ contextPath: "/Customer/Set",
1002
+ parameterProperties: {
1003
+ "P_param1": {
1004
+ $Type: "Edm.String"
1005
+ }
1006
+ }
1007
+ };
1008
+ oSV.addSelectOption("attribute1", "I", "EQ", "value1");
1009
+ oSV.addSelectOption("param1", "I", "EQ", "paramValue1");
1010
+ CommonUtils.addSelectionVariantToConditions(oSV, oConditions, {}, "");
1011
+ var aProperties = Object.keys(oConditions);
1012
+ aProperties.forEach(function (sPropertyName) {
1013
+ iCount += oConditions[sPropertyName].length;
1014
+ });
1015
+ var param1Value = oConditions["P_param1"][0].values[0] === "paramValue1"; //CHECK
1016
+
1017
+ expect(param1Value).toBe(true); // "CommonUtils: Correct parameter values are added from SV.");
1018
+
1019
+ expect(aProperties.length).toEqual(2); // === 2, "CommonUtils: Correct no. of propertyPath are added from SV.");
1020
+
1021
+ expect(iCount).toEqual(2); // === 2, "CommonUtils: Correct no. of conditions are added from SV.");
1022
+ });
1023
+ test("Test conversion of Selection Variant to conditions with parameters case of fall back to filter field.", function () {
1024
+ var oSV = new SelectionVariant(),
1025
+ oConditions = {};
1026
+ var iCount = 0;
1027
+ that.validProperties = {
1028
+ "attribute1": {
1029
+ $Type: "Edm.String"
1030
+ },
1031
+ "param2": {
1032
+ $Type: "Edm.String"
1033
+ }
1034
+ };
1035
+ that.parameterInfo = {
1036
+ contextPath: "/Customer/Set",
1037
+ parameterProperties: {
1038
+ "P_param1": {
1039
+ $Type: "Edm.String"
1040
+ }
1041
+ }
1042
+ };
1043
+ oSV.addSelectOption("attribute1", "I", "EQ", "value1");
1044
+ oSV.addSelectOption("P_param2", "I", "EQ", "paramValue2");
1045
+ CommonUtils.addSelectionVariantToConditions(oSV, oConditions, {}, "");
1046
+ var aProperties = Object.keys(oConditions);
1047
+ aProperties.forEach(function (sPropertyName) {
1048
+ iCount += oConditions[sPropertyName].length;
1049
+ });
1050
+ var param2Value = oConditions["param2"][0].values[0] === "paramValue2"; //CHECK
1051
+
1052
+ expect(param2Value).toBe(true); //, "CommonUtils: Correct parameter values are added from SV.");
1053
+
1054
+ expect(aProperties.length).toEqual(2); //== 2, "CommonUtils: Correct no. of propertyPath are added from SV.");
1055
+
1056
+ expect(iCount).toEqual(2); //, "CommonUtils: Correct no. of conditions are added from SV.");
1057
+ });
1058
+ test("Test conversion of Selection Variant to conditions with already existing conditions.", function () {
1059
+ var oSV = new SelectionVariant(),
1060
+ oConditions = {
1061
+ "attribute2": [{
1062
+ "operator": "EQ",
1063
+ "values": ["value3"]
1064
+ }]
1065
+ };
1066
+ var iCount = 0;
1067
+ that.validProperties = {
1068
+ "attribute1": {
1069
+ $Type: "Edm.Boolean"
1070
+ },
1071
+ "attribute2": {
1072
+ $Type: "Edm.String"
1073
+ }
1074
+ };
1075
+ that.parameterInfo = {};
1076
+ oSV.addSelectOption("attribute1", "I", "EQ", "true");
1077
+ oSV.addSelectOption("attribute2", "I", "EQ", "value1");
1078
+ oSV.addSelectOption("attribute2", "I", "EQ", "value2");
1079
+ CommonUtils.addSelectionVariantToConditions(oSV, oConditions, {}, "");
1080
+ var aProperties = Object.keys(oConditions);
1081
+ aProperties.forEach(function (sPropertyName) {
1082
+ iCount += oConditions[sPropertyName].length;
1083
+ }); //CHECK
1084
+
1085
+ expect(aProperties.length).toEqual(2); // === 2, "CommonUtils: Correct no. of propertyPath are added from SV.");
1086
+
1087
+ expect(iCount).toEqual(4); // 4, "CommonUtils: Correct no. of conditions are added from SV.");
1088
+ });
1089
+ });
1090
+ describe("addExternalStateFiltersToSelectionVariant", function () {
1091
+ test("addExternalStateFiltersToSelectionVariant", function () {
1092
+ var oInputSelectionVariant = new SelectionVariant();
1093
+ var oTargetInfo = {
1094
+ "propertiesWithoutConflict": {
1095
+ "Material": ["SalesOrderManage.Material"]
1096
+ }
1097
+ };
1098
+ var mFilters = {
1099
+ "filterConditions": {
1100
+ "Date": [{
1101
+ "operator": "EQ",
1102
+ "values": ["2020-03-04"]
1103
+ }],
1104
+ "DateTimeOffset": [{
1105
+ "operator": "EQ",
1106
+ "values": ["2020-03-04T20:53:54+0530"]
1107
+ }],
1108
+ "TimeOfDay": [{
1109
+ "operator": "EQ",
1110
+ "values": ["16:51:51"]
1111
+ }],
1112
+ "String": [],
1113
+ "Boolean": [{
1114
+ "operator": "EEQ",
1115
+ "values": [true]
1116
+ }],
1117
+ "Byte": [{
1118
+ "operator": "EQ",
1119
+ "values": [4]
1120
+ }],
1121
+ "ByteMulti": [{
1122
+ "operator": "LE",
1123
+ "values": [5]
1124
+ }, {
1125
+ "operator": "GE",
1126
+ "values": [10]
1127
+ }],
1128
+ "DateTimeOffsetMulti": [{
1129
+ "operator": "NOTGT",
1130
+ "values": ["2020-03-25T20:55:42+0530"]
1131
+ }, {
1132
+ "operator": "NOTLT",
1133
+ "values": ["2020-02-01T20:55:51+0530"]
1134
+ }],
1135
+ "Decimal": [{
1136
+ "operator": "EQ",
1137
+ "values": ["4.45"]
1138
+ }],
1139
+ "DecimalMulti": [{
1140
+ "operator": "NE",
1141
+ "values": ["6.25"]
1142
+ }],
1143
+ "Double": [{
1144
+ "operator": "EQ",
1145
+ "values": [3.333333]
1146
+ }],
1147
+ "DoubleMulti": [{
1148
+ "operator": "NOTGE",
1149
+ "values": [6.666666666]
1150
+ }, {
1151
+ "operator": "NOTGT",
1152
+ "values": [10.0000099999]
1153
+ }],
1154
+ "Guid": [{
1155
+ "operator": "EQ",
1156
+ "values": ["11111182-aaaa-bbbb-cccc-ddddeeeeffff"]
1157
+ }],
1158
+ "GuidMulti": [{
1159
+ "operator": "EQ",
1160
+ "values": ["11111183-aaaa-bbbb-cccc-ddddeeeeffff"]
1161
+ }, {
1162
+ "operator": "EQ",
1163
+ "values": ["11111185-aaaa-bbbb-cccc-ddddeeeeffff"]
1164
+ }],
1165
+ "Int16": [{
1166
+ "operator": "EQ",
1167
+ "values": [10]
1168
+ }],
1169
+ "Empty": [{
1170
+ "operator": "Empty",
1171
+ "values": []
1172
+ }],
1173
+ "Int16Multi": [{
1174
+ "operator": "EQ",
1175
+ "values": [15]
1176
+ }, {
1177
+ "operator": "NOTGE",
1178
+ "values": [10000]
1179
+ }, {
1180
+ "operator": "NOTBT",
1181
+ "values": [100, 200]
1182
+ }, {
1183
+ "operator": "NOTLT",
1184
+ "values": [10]
1185
+ }],
1186
+ "Int32": [{
1187
+ "operator": "EQ",
1188
+ "values": [9999999]
1189
+ }],
1190
+ "Int32Multi": [{
1191
+ "operator": "BT",
1192
+ "values": [1000000, 1000000000]
1193
+ }],
1194
+ "Int64": [{
1195
+ "operator": "EQ",
1196
+ "values": ["99"]
1197
+ }],
1198
+ "Int64Multi": [{
1199
+ "operator": "NOTLT",
1200
+ "values": ["9999999"]
1201
+ }, {
1202
+ "operator": "NE",
1203
+ "values": ["99999"]
1204
+ }],
1205
+ "SByte": [{
1206
+ "operator": "EQ",
1207
+ "values": [1]
1208
+ }],
1209
+ "SByteMulti": [{
1210
+ "operator": "EQ",
1211
+ "values": [2]
1212
+ }, {
1213
+ "operator": "GT",
1214
+ "values": [3]
1215
+ }],
1216
+ "Single": [{
1217
+ "operator": "EQ",
1218
+ "values": [1]
1219
+ }],
1220
+ "SingleMulti": [{
1221
+ "operator": "EQ",
1222
+ "values": [2]
1223
+ }],
1224
+ "StringMulti": [{
1225
+ "operator": "EndsWith",
1226
+ "values": ["xyz"]
1227
+ }, {
1228
+ "operator": "StartsWith",
1229
+ "values": ["abc"]
1230
+ }, {
1231
+ "operator": "Contains",
1232
+ "values": ["def"]
1233
+ }, {
1234
+ "operator": "NotStartsWith",
1235
+ "values": ["ijk"]
1236
+ }, {
1237
+ "operator": "NotEndsWith",
1238
+ "values": ["uvw"]
1239
+ }, {
1240
+ "operator": "NotContains",
1241
+ "values": ["pqr"]
1242
+ }],
1243
+ "TimeOfDayMulti": [{
1244
+ "operator": "EQ",
1245
+ "values": ["22:00:39"]
1246
+ }, {
1247
+ "operator": "EQ",
1248
+ "values": ["17:00:43"]
1249
+ }]
1250
+ },
1251
+ "filterConditionsWithoutConflict": {
1252
+ "Material": ["SalesOrderManage._Item.Material"]
1253
+ }
1254
+ };
1255
+ var oOutPutSelectionVariant = CommonUtils.addExternalStateFiltersToSelectionVariant(oInputSelectionVariant, mFilters, oTargetInfo);
1256
+ var oActualSelectionVariant = {
1257
+ _mParameters: {},
1258
+ _mSelectOptions: {
1259
+ "Date": [{
1260
+ "Sign": "I",
1261
+ "Option": "EQ",
1262
+ "Low": "2020-03-04",
1263
+ "High": null
1264
+ }],
1265
+ "DateTimeOffset": [{
1266
+ "Sign": "I",
1267
+ "Option": "EQ",
1268
+ "Low": "2020-03-04T20:53:54+0530",
1269
+ "High": null
1270
+ }],
1271
+ "TimeOfDay": [{
1272
+ "Sign": "I",
1273
+ "Option": "EQ",
1274
+ "Low": "16:51:51",
1275
+ "High": null
1276
+ }],
1277
+ "Boolean": [{
1278
+ "Sign": "I",
1279
+ "Option": "EQ",
1280
+ "Low": "true",
1281
+ "High": null
1282
+ }],
1283
+ "Byte": [{
1284
+ "Sign": "I",
1285
+ "Option": "EQ",
1286
+ "Low": "4",
1287
+ "High": null
1288
+ }],
1289
+ "ByteMulti": [{
1290
+ "Sign": "I",
1291
+ "Option": "LE",
1292
+ "Low": "5",
1293
+ "High": null
1294
+ }],
1295
+ "DateTimeOffsetMulti": [{
1296
+ "Sign": "E",
1297
+ "Option": "GT",
1298
+ "Low": "2020-03-25T20:55:42+0530",
1299
+ "High": null
1300
+ }, {
1301
+ "Sign": "E",
1302
+ "Option": "LT",
1303
+ "Low": "2020-02-01T20:55:51+0530",
1304
+ "High": null
1305
+ }],
1306
+ "Decimal": [{
1307
+ "Sign": "I",
1308
+ "Option": "EQ",
1309
+ "Low": "4.45",
1310
+ "High": null
1311
+ }],
1312
+ "DecimalMulti": [{
1313
+ "Sign": "I",
1314
+ "Option": "NE",
1315
+ "Low": "6.25",
1316
+ "High": null
1317
+ }],
1318
+ "Double": [{
1319
+ "Sign": "I",
1320
+ "Option": "EQ",
1321
+ "Low": "3.333333",
1322
+ "High": null
1323
+ }],
1324
+ "DoubleMulti": [{
1325
+ "Sign": "E",
1326
+ "Option": "GE",
1327
+ "Low": "6.666666666",
1328
+ "High": null
1329
+ }, {
1330
+ "Sign": "E",
1331
+ "Option": "GT",
1332
+ "Low": "10.0000099999",
1333
+ "High": null
1334
+ }],
1335
+ "Empty": [{
1336
+ "High": null,
1337
+ "Low": "",
1338
+ "Option": "EQ",
1339
+ "Sign": "I"
1340
+ }],
1341
+ "Guid": [{
1342
+ "Sign": "I",
1343
+ "Option": "EQ",
1344
+ "Low": "11111182-aaaa-bbbb-cccc-ddddeeeeffff",
1345
+ "High": null
1346
+ }],
1347
+ "GuidMulti": [{
1348
+ "Sign": "I",
1349
+ "Option": "EQ",
1350
+ "Low": "11111183-aaaa-bbbb-cccc-ddddeeeeffff",
1351
+ "High": null
1352
+ }, {
1353
+ "Sign": "I",
1354
+ "Option": "EQ",
1355
+ "Low": "11111185-aaaa-bbbb-cccc-ddddeeeeffff",
1356
+ "High": null
1357
+ }],
1358
+ "Int16": [{
1359
+ "Sign": "I",
1360
+ "Option": "EQ",
1361
+ "Low": "10",
1362
+ "High": null
1363
+ }],
1364
+ "Int16Multi": [{
1365
+ "Sign": "I",
1366
+ "Option": "EQ",
1367
+ "Low": "15",
1368
+ "High": null
1369
+ }, {
1370
+ "Sign": "E",
1371
+ "Option": "GE",
1372
+ "Low": "10000",
1373
+ "High": null
1374
+ }, {
1375
+ "Sign": "E",
1376
+ "Option": "BT",
1377
+ "Low": "100",
1378
+ "High": "200"
1379
+ }, {
1380
+ "Sign": "E",
1381
+ "Option": "LT",
1382
+ "Low": "10",
1383
+ "High": null
1384
+ }],
1385
+ "Int32": [{
1386
+ "Sign": "I",
1387
+ "Option": "EQ",
1388
+ "Low": "9999999",
1389
+ "High": null
1390
+ }],
1391
+ "Int32Multi": [{
1392
+ "Sign": "I",
1393
+ "Option": "BT",
1394
+ "Low": "1000000",
1395
+ "High": "1000000000"
1396
+ }],
1397
+ "Int64": [{
1398
+ "Sign": "I",
1399
+ "Option": "EQ",
1400
+ "Low": "99",
1401
+ "High": null
1402
+ }],
1403
+ "Int64Multi": [{
1404
+ "Sign": "E",
1405
+ "Option": "LT",
1406
+ "Low": "9999999",
1407
+ "High": null
1408
+ }, {
1409
+ "Sign": "I",
1410
+ "Option": "NE",
1411
+ "Low": "99999",
1412
+ "High": null
1413
+ }],
1414
+ "SByte": [{
1415
+ "Sign": "I",
1416
+ "Option": "EQ",
1417
+ "Low": "1",
1418
+ "High": null
1419
+ }],
1420
+ "SByteMulti": [{
1421
+ "Sign": "I",
1422
+ "Option": "EQ",
1423
+ "Low": "2",
1424
+ "High": null
1425
+ }, {
1426
+ "Sign": "I",
1427
+ "Option": "GT",
1428
+ "Low": "3",
1429
+ "High": null
1430
+ }],
1431
+ "Single": [{
1432
+ "Sign": "I",
1433
+ "Option": "EQ",
1434
+ "Low": "1",
1435
+ "High": null
1436
+ }],
1437
+ "SingleMulti": [{
1438
+ "Sign": "I",
1439
+ "Option": "EQ",
1440
+ "Low": "2",
1441
+ "High": null
1442
+ }],
1443
+ "StringMulti": [{
1444
+ "Sign": "I",
1445
+ "Option": "CP",
1446
+ "Low": "*xyz",
1447
+ "High": null
1448
+ }, {
1449
+ "Sign": "I",
1450
+ "Option": "CP",
1451
+ "Low": "abc*",
1452
+ "High": null
1453
+ }, {
1454
+ "Sign": "I",
1455
+ "Option": "CP",
1456
+ "Low": "def",
1457
+ "High": null
1458
+ }, {
1459
+ "Sign": "E",
1460
+ "Option": "CP",
1461
+ "Low": "ijk*",
1462
+ "High": null
1463
+ }, {
1464
+ "Sign": "E",
1465
+ "Option": "CP",
1466
+ "Low": "*uvw",
1467
+ "High": null
1468
+ }, {
1469
+ "Sign": "E",
1470
+ "Option": "CP",
1471
+ "Low": "pqr",
1472
+ "High": null
1473
+ }],
1474
+ "TimeOfDayMulti": [{
1475
+ "Sign": "I",
1476
+ "Option": "EQ",
1477
+ "Low": "22:00:39",
1478
+ "High": null
1479
+ }, {
1480
+ "Sign": "I",
1481
+ "Option": "EQ",
1482
+ "Low": "17:00:43",
1483
+ "High": null
1484
+ }]
1485
+ },
1486
+ _sId: ""
1487
+ };
1488
+ expect(oActualSelectionVariant).toEqual(oOutPutSelectionVariant); //"the external state filters have been added to the selection variant correctly"
1489
+ });
1490
+ });
1491
+ describe("Unit Test check Operators", function () {
1492
+ test("Unit test to check Operators", function () {
1493
+ [{
1494
+ dataField: "LastChangedDateTime",
1495
+ oContext: {
1496
+ getObject: function (path) {
1497
+ // Edm Type
1498
+ if (path === "/dummy/LastChangedDateTime/$Type") {
1499
+ return "Edm.DateTime";
1500
+ } else {
1501
+ // Filter Annotations
1502
+ return {
1503
+ FilterExpressionRestrictions: [{
1504
+ Property: {
1505
+ $PropertyPath: "LastChangedDateTime"
1506
+ },
1507
+ AllowedExpressions: "SingleRange"
1508
+ }]
1509
+ };
1510
+ }
1511
+ }
1512
+ },
1513
+ expectedValue: "EQ,BT,LT,LE,GT,GE,NOTLT,NOTLE,NOTGT,NOTGE",
1514
+ sMessage: "Edm.String and Single Range"
1515
+ }, {
1516
+ dataField: "SalesOrderDate",
1517
+ oContext: {
1518
+ getObject: function (path) {
1519
+ // Edm Type
1520
+ if (path === "/dummy/SalesOrderDate/$Type") {
1521
+ return "Edm.Date";
1522
+ } else {
1523
+ // Filter Annotations
1524
+ return {
1525
+ FilterExpressionRestrictions: [{
1526
+ Property: {
1527
+ $PropertyPath: "SalesOrderDate"
1528
+ },
1529
+ AllowedExpressions: "SingleValue"
1530
+ }]
1531
+ };
1532
+ }
1533
+ }
1534
+ },
1535
+ expectedValue: "EQ",
1536
+ sMessage: "Edm.Date and Single Value"
1537
+ }, {
1538
+ dataField: "SalesOrderDate",
1539
+ oContext: {
1540
+ getObject: function (path) {
1541
+ // Edm Type
1542
+ if (path === "/dummy/SalesOrderDate/$Type") {
1543
+ return "Edm.Date";
1544
+ } else {
1545
+ // Filter Annotations
1546
+ return {
1547
+ FilterExpressionRestrictions: [{
1548
+ Property: {
1549
+ $PropertyPath: "SalesOrderDate"
1550
+ },
1551
+ AllowedExpressions: "MultiValue"
1552
+ }]
1553
+ };
1554
+ }
1555
+ }
1556
+ },
1557
+ expectedValue: "EQ",
1558
+ sMessage: "Edm.Date and Multi Value"
1559
+ }, {
1560
+ dataField: "NetAmount",
1561
+ oContext: {
1562
+ getObject: function (path) {
1563
+ // Edm Type
1564
+ if (path === "/dummy/NetAmount/$Type") {
1565
+ return "Edm.Decimal";
1566
+ } else {
1567
+ // Filter Annotations
1568
+ return {
1569
+ FilterExpressionRestrictions: [{
1570
+ Property: {
1571
+ $PropertyPath: "NetAmount"
1572
+ },
1573
+ AllowedExpressions: "MultiRange"
1574
+ }]
1575
+ };
1576
+ }
1577
+ }
1578
+ },
1579
+ expectedValue: "EQ,BT,LT,LE,GT,GE,NE,NOTBT,NOTLT,NOTLE,NOTGT,NOTGE",
1580
+ sMessage: "Edm.Decimal and Multi Range"
1581
+ }, {
1582
+ dataField: "SoldToParty",
1583
+ oContext: {
1584
+ getObject: function (path) {
1585
+ // Edm type
1586
+ if (path === "/dummy/SoldToParty/$Type") {
1587
+ return "Edm.String";
1588
+ } else {
1589
+ // Filter Annotations
1590
+ return {
1591
+ FilterExpressionRestrictions: [{
1592
+ Property: {
1593
+ $PropertyPath: "SoldToParty"
1594
+ },
1595
+ AllowedExpressions: "SearchExpression"
1596
+ }]
1597
+ };
1598
+ }
1599
+ }
1600
+ },
1601
+ expectedValue: "Contains,StartsWith,EndsWith,NotContains,NotStartsWith,NotEndsWith",
1602
+ sMessage: "Edm.String and Search Expressions"
1603
+ }, {
1604
+ dataField: "SoldToParty",
1605
+ oContext: {
1606
+ getObject: function (path) {
1607
+ // Edm type
1608
+ if (path === "/dummy/SoldToParty/$Type") {
1609
+ return "Edm.String";
1610
+ } else {
1611
+ // Filter Annotations
1612
+ return {
1613
+ FilterExpressionRestrictions: [{
1614
+ Property: {
1615
+ $PropertyPath: "SoldToParty"
1616
+ },
1617
+ AllowedExpressions: "MultiRangeOrSearchExpression"
1618
+ }]
1619
+ };
1620
+ }
1621
+ }
1622
+ },
1623
+ expectedValue: "Contains,EQ,BT,StartsWith,EndsWith,LT,LE,GT,GE,NotContains,NE,NOTBT,NotStartsWith,NotEndsWith,NOTLT,NOTLE,NOTGT,NOTGE",
1624
+ sMessage: "Edm.String and MultiRange Or Search Expressions"
1625
+ }].forEach(function (oProperty) {
1626
+ var actualValue = CommonUtils.getOperatorsForProperty(oProperty.dataField, "/dummy", oProperty.oContext, oProperty.oContext.getObject("/dummy/" + oProperty.dataField + "/$Type"));
1627
+ expect(actualValue).toEqual(oProperty.expectedValue); // , "Unit test to check Operators for " + oProperty.sMessage + ": ok");
1628
+ });
1629
+ });
1630
+ });
1631
+ describe("Test CommonUtils : addDefaultDisplayCurrency", function () {
1632
+ test("Test adding default display currency to SV.", function () {
1633
+ [{
1634
+ aMandatoryFields: [],
1635
+ oAppData: {},
1636
+ oExpectedValue: undefined
1637
+ }, {
1638
+ aMandatoryFields: [{
1639
+ $PropertyPath: "DisplayCurrency"
1640
+ }],
1641
+ oAppData: {},
1642
+ oExpectedValue: undefined,
1643
+ sMessage: "no SV in appData"
1644
+ }, {
1645
+ aMandatoryFields: [{
1646
+ $PropertyPath: "DisplayCurrency"
1647
+ }],
1648
+ oAppData: {
1649
+ oSelectionVariant: new SelectionVariant()
1650
+ },
1651
+ oExpectedValue: undefined,
1652
+ sMessage: "no Defaulted SV"
1653
+ }, {
1654
+ aMandatoryFields: [{
1655
+ $PropertyPath: "DisplayCurrency"
1656
+ }],
1657
+ oAppData: {
1658
+ oSelectionVariant: new SelectionVariant(),
1659
+ oDefaultedSelectionVariant: new SelectionVariant()
1660
+ },
1661
+ oExpectedValue: undefined,
1662
+ sMessage: "no DisplayCurrency in Defaulted SV"
1663
+ }, {
1664
+ aMandatoryFields: [{
1665
+ $PropertyPath: "DisplayCurrency"
1666
+ }],
1667
+ oAppData: {
1668
+ oSelectionVariant: new SelectionVariant(),
1669
+ oDefaultedSelectionVariant: new SelectionVariant({
1670
+ "SelectOptions": [{
1671
+ "PropertyName": "DisplayCurrency",
1672
+ "Ranges": [{
1673
+ "Sign": "I",
1674
+ "Option": "EQ",
1675
+ "Low": "EUR",
1676
+ "High": null
1677
+ }]
1678
+ }]
1679
+ })
1680
+ },
1681
+ oExpectedValue: "EUR",
1682
+ sMessage: "DisplayCurrency in Defaulted SV"
1683
+ }, {
1684
+ aMandatoryFields: [{
1685
+ $PropertyPath: "DisplayCurrency"
1686
+ }],
1687
+ oAppData: {
1688
+ oSelectionVariant: new SelectionVariant({
1689
+ "SelectOptions": [{
1690
+ "PropertyName": "DisplayCurrency",
1691
+ "Ranges": [{
1692
+ "Sign": "I",
1693
+ "Option": "EQ",
1694
+ "Low": "INR",
1695
+ "High": null
1696
+ }]
1697
+ }]
1698
+ }),
1699
+ oDefaultedSelectionVariant: new SelectionVariant({
1700
+ "SelectOptions": [{
1701
+ "PropertyName": "DisplayCurrency",
1702
+ "Ranges": [{
1703
+ "Sign": "I",
1704
+ "Option": "EQ",
1705
+ "Low": "EUR",
1706
+ "High": null
1707
+ }]
1708
+ }]
1709
+ })
1710
+ },
1711
+ oExpectedValue: "INR",
1712
+ sMessage: "DisplayCurrency in SV and Defaulted SV"
1713
+ }].forEach(function (oTestData) {
1714
+ CommonUtils.addDefaultDisplayCurrency(oTestData.aMandatoryFields, oTestData.oAppData.oSelectionVariant, oTestData.oAppData.oDefaultedSelectionVariant);
1715
+ expect(oTestData.oAppData && oTestData.oAppData.oSelectionVariant && oTestData.oAppData.oSelectionVariant.getSelectOption("DisplayCurrency") && oTestData.oAppData.oSelectionVariant.getSelectOption("DisplayCurrency")[0].Low).toEqual(oTestData.oExpectedValue); // ,"NavHelper: addDefaultDisplayCurrency works when " + oTestData.sMessage + "."
1716
+ });
1717
+ });
1718
+ });
1719
+ describe("Unit Test to check getNonComputedVisibleFields", function () {
1720
+ test("Unit Test to check getNonComputedVisibleFields", function () {
1721
+ [{
1722
+ metaModel: {
1723
+ getObject: function (sPath) {
1724
+ switch (sPath) {
1725
+ case "/SalesOrderItem/":
1726
+ return {
1727
+ "$Key": ["key1", "key2"],
1728
+ "key1": {
1729
+ $kind: "Property"
1730
+ },
1731
+ "key2": {
1732
+ $kind: "Property"
1733
+ },
1734
+ "prop1": {
1735
+ $kind: "Property"
1736
+ }
1737
+ };
1738
+
1739
+ case "/SalesOrderItem/key2@":
1740
+ return {
1741
+ "@Org.OData.Core.V1.Computed": false
1742
+ };
1743
+
1744
+ case "/SalesOrderItem/prop1@":
1745
+ return {
1746
+ "@Org.OData.Core.V1.Immutable": true
1747
+ };
1748
+
1749
+ default:
1750
+ return {};
1751
+ }
1752
+ }
1753
+ },
1754
+ path: "/SalesOrderItem",
1755
+ expectedValue: "key1,key2,prop1",
1756
+ message: "with technical keys and immutable prop"
1757
+ }, {
1758
+ metaModel: {
1759
+ getObject: function (sPath) {
1760
+ switch (sPath) {
1761
+ case "/SalesOrderItem/":
1762
+ return {
1763
+ "$Key": ["key1", "key2"],
1764
+ "key1": {
1765
+ $kind: "Property"
1766
+ },
1767
+ "key2": {
1768
+ $kind: "Property"
1769
+ },
1770
+ "prop1": {
1771
+ $kind: "Property"
1772
+ }
1773
+ };
1774
+
1775
+ default:
1776
+ return {};
1777
+ }
1778
+ }
1779
+ },
1780
+ path: "/SalesOrderItem",
1781
+ expectedValue: "key1,key2",
1782
+ message: "with technical keys and no immutable prop"
1783
+ }, {
1784
+ metaModel: {
1785
+ getObject: function (sPath) {
1786
+ switch (sPath) {
1787
+ case "/SalesOrderItem/":
1788
+ return {
1789
+ "$Key": ["key1", "key2"],
1790
+ "key1": {
1791
+ $kind: "Property"
1792
+ },
1793
+ "key2": {
1794
+ $kind: "Property"
1795
+ },
1796
+ "prop1": {
1797
+ $kind: "Property"
1798
+ }
1799
+ };
1800
+
1801
+ case "/SalesOrderItem/key2@":
1802
+ return {
1803
+ "@Org.OData.Core.V1.Computed": true
1804
+ };
1805
+
1806
+ case "/SalesOrderItem/prop1@":
1807
+ return {
1808
+ "@Org.OData.Core.V1.Immutable": true
1809
+ };
1810
+
1811
+ default:
1812
+ return {};
1813
+ }
1814
+ }
1815
+ },
1816
+ path: "/SalesOrderItem",
1817
+ expectedValue: "key1,prop1",
1818
+ message: "with a computed technical key"
1819
+ }, {
1820
+ metaModel: {
1821
+ getObject: function (sPath) {
1822
+ switch (sPath) {
1823
+ case "/SalesOrderItem/":
1824
+ return {
1825
+ "$Key": ["key1", "key2"],
1826
+ "key1": {
1827
+ $kind: "Property"
1828
+ },
1829
+ "key2": {
1830
+ $kind: "Property"
1831
+ },
1832
+ "prop1": {
1833
+ $kind: "Property"
1834
+ }
1835
+ };
1836
+
1837
+ case "/SalesOrderItem/key2@":
1838
+ return {
1839
+ "@com.sap.vocabularies.UI.v1.Hidden": true
1840
+ };
1841
+
1842
+ case "/SalesOrderItem/prop1@":
1843
+ return {
1844
+ "@Org.OData.Core.V1.Immutable": true
1845
+ };
1846
+
1847
+ default:
1848
+ return {};
1849
+ }
1850
+ }
1851
+ },
1852
+ path: "/SalesOrderItem",
1853
+ expectedValue: "key1,prop1",
1854
+ message: "with a hidden technical key"
1855
+ }, {
1856
+ metaModel: {
1857
+ getObject: function (sPath) {
1858
+ switch (sPath) {
1859
+ case "/SalesOrderItem/":
1860
+ return {
1861
+ "$Key": ["key1", "key2"],
1862
+ "key1": {
1863
+ $kind: "Property"
1864
+ },
1865
+ "key2": {
1866
+ $kind: "Property"
1867
+ },
1868
+ "prop1": {
1869
+ $kind: "Property"
1870
+ }
1871
+ };
1872
+
1873
+ case "/SalesOrderItem/prop1@":
1874
+ return {
1875
+ "@Org.OData.Core.V1.Immutable": true,
1876
+ "@com.sap.vocabularies.UI.v1.Hidden": true
1877
+ };
1878
+
1879
+ default:
1880
+ return {};
1881
+ }
1882
+ }
1883
+ },
1884
+ path: "/SalesOrderItem",
1885
+ expectedValue: "key1,key2",
1886
+ message: "with a hidden property"
1887
+ }, {
1888
+ metaModel: {
1889
+ getObject: function (sPath) {
1890
+ switch (sPath) {
1891
+ case "/SalesOrderItem/":
1892
+ return {
1893
+ "$Key": ["key1", "key2"],
1894
+ "key1": {
1895
+ $kind: "Property"
1896
+ },
1897
+ "key2": {
1898
+ $kind: "Property"
1899
+ },
1900
+ "prop1": {
1901
+ $kind: "Property"
1902
+ }
1903
+ };
1904
+
1905
+ case "/SalesOrderItem/prop1@":
1906
+ return {
1907
+ "@Org.OData.Core.V1.Immutable": true,
1908
+ "@Org.OData.Core.V1.Computed": true
1909
+ };
1910
+
1911
+ default:
1912
+ return {};
1913
+ }
1914
+ }
1915
+ },
1916
+ path: "/SalesOrderItem",
1917
+ expectedValue: "key1,key2",
1918
+ message: "with a computed property"
1919
+ }].forEach(function (oData) {
1920
+ var aKeyFields = CommonUtils.getNonComputedVisibleFields(oData.metaModel, oData.path);
1921
+ expect(aKeyFields.toString()).toEqual(oData.expectedValue); // ,"getNonComputedVisibleFields executed " + oData.message + " -- OK"
1922
+ });
1923
+ });
1924
+ });
1925
+ describe("Unit Test for checking Semantic Object Mappings", function () {
1926
+ test("Testing if semantic Object mappings are getting correcty replaced in the context or not", function () {
1927
+ var oSelectionVariant1 = new SelectionVariant();
1928
+ var oSelectionVariant2 = new SelectionVariant();
1929
+ oSelectionVariant1.addSelectOption("SalesOrder", "I", "EQ", "2919682", undefined);
1930
+ oSelectionVariant1.addSelectOption("Delivered", "I", "EQ", "false", undefined);
1931
+ oSelectionVariant2.addSelectOption("SalesOrder", "I", "EQ", "2919682", undefined);
1932
+ oSelectionVariant2.addSelectOption("Completed", "I", "EQ", "false", undefined);
1933
+ var sMapping1 = '[{"LocalProperty":{"$PropertyPath":"Delivered"},"SemanticObjectProperty":"Completed"}]'; // var sMapping2 = '[{"LocalProperty":{"$PropertyPath":"isImageUrl"},"SemanticObjectProperty":"ImageAddress"}]';
1934
+
1935
+ expect(JSON.stringify(CommonUtils.setSemanticObjectMappings(oSelectionVariant1, sMapping1))).toEqual(JSON.stringify(oSelectionVariant2));
1936
+ });
1937
+ test("Testing if SelectionVariant remains unchanged if no Mapping matches with any field in context", function () {
1938
+ var oSelectionVariant1 = new SelectionVariant();
1939
+ var oSelectionVariant2 = new SelectionVariant();
1940
+ oSelectionVariant1.addSelectOption("SalesOrder", "I", "EQ", "2919682", undefined);
1941
+ oSelectionVariant1.addSelectOption("Delivered", "I", "EQ", "false", undefined);
1942
+ oSelectionVariant2.addSelectOption("SalesOrder", "I", "EQ", "2919682", undefined);
1943
+ oSelectionVariant2.addSelectOption("Completed", "I", "EQ", "false", undefined); // var sMapping1 = '[{"LocalProperty":{"$PropertyPath":"Delivered"},"SemanticObjectProperty":"Completed"}]';
1944
+
1945
+ var sMapping2 = '[{"LocalProperty":{"$PropertyPath":"isImageUrl"},"SemanticObjectProperty":"ImageAddress"}]';
1946
+ expect(JSON.stringify(CommonUtils.setSemanticObjectMappings(oSelectionVariant1, sMapping2))).toEqual(JSON.stringify(oSelectionVariant1));
1947
+ });
1948
+ });
1949
+ describe("Unit Test for getHeaderFacetItemConfigForExternalNavigation", function () {
1950
+ test("Unit Test for getHeaderFacetItemConfigForExternalNavigation", function () {
1951
+ [{
1952
+ viewData: {
1953
+ controlConfiguration: {
1954
+ "@com.sap.vocabularies.UI.v1.DataPoint#dp1": {
1955
+ "navigation": {
1956
+ "targetOutbound": {
1957
+ "outbound": "outbound1"
1958
+ }
1959
+ }
1960
+ },
1961
+ "@com.sap.vocabularies.UI.v1.DataPoint#dp2": {
1962
+ "navigation": {
1963
+ "targetOutbound": {
1964
+ "outbound": "outbound1"
1965
+ },
1966
+ "targetSections": {
1967
+ "sectionId": "sectionID1"
1968
+ }
1969
+ }
1970
+ },
1971
+ "@com.sap.vocabularies.UI.v1.Chart#chart1": {
1972
+ "navigation": {
1973
+ "targetOutbound": {
1974
+ "outbound": "outbound1"
1975
+ },
1976
+ "targetSections": {
1977
+ "sectionId": "sectionID1"
1978
+ }
1979
+ }
1980
+ },
1981
+ "@com.sap.vocabularies.UI.v1.Chart#chart2": {
1982
+ "navigation": {
1983
+ "targetSections": {
1984
+ "sectionId": "sectionID1"
1985
+ }
1986
+ }
1987
+ },
1988
+ "_Partner/@com.sap.vocabularies.UI.v1.LineItem": {
1989
+ "tableSettings": {
1990
+ "personalization": false
1991
+ }
1992
+ }
1993
+ }
1994
+ },
1995
+ crossNav: {
1996
+ "outbound1": {
1997
+ semanticObject: "SO1",
1998
+ action: "action1"
1999
+ }
2000
+ },
2001
+ expectedValue: {
2002
+ "fe::HeaderDPLink::DataPoint::dp1": {
2003
+ "action": "action1",
2004
+ "semanticObject": "SO1",
2005
+ "semanticObjectMapping": []
2006
+ },
2007
+ "fe::HeaderDPLink::DataPoint::dp2": {
2008
+ "action": "action1",
2009
+ "semanticObject": "SO1",
2010
+ "semanticObjectMapping": []
2011
+ },
2012
+ "fe::MicroChartLink::Chart::chart1": {
2013
+ "action": "action1",
2014
+ "semanticObject": "SO1",
2015
+ "semanticObjectMapping": []
2016
+ }
2017
+ },
2018
+ message: "with target outbound configured with valid SO-action"
2019
+ }, {
2020
+ viewData: {
2021
+ controlConfiguration: {
2022
+ "@com.sap.vocabularies.UI.v1.DataPoint#dp1": {
2023
+ "navigation": {
2024
+ "targetOutbound": {
2025
+ "outbound": "outbound1"
2026
+ }
2027
+ }
2028
+ },
2029
+ "@com.sap.vocabularies.UI.v1.DataPoint#dp2": {
2030
+ "navigation": {
2031
+ "targetOutbound": {
2032
+ "outbound": "outbound1"
2033
+ },
2034
+ "targetSections": {
2035
+ "sectionId": "sectionID1"
2036
+ }
2037
+ }
2038
+ },
2039
+ "@com.sap.vocabularies.UI.v1.Chart#chart1": {
2040
+ "navigation": {
2041
+ "targetOutbound": {
2042
+ "outbound": "outbound1"
2043
+ },
2044
+ "targetSections": {
2045
+ "sectionId": "sectionID1"
2046
+ }
2047
+ }
2048
+ },
2049
+ "@com.sap.vocabularies.UI.v1.Chart#chart2": {
2050
+ "navigation": {
2051
+ "targetSections": {
2052
+ "sectionId": "sectionID1"
2053
+ }
2054
+ }
2055
+ },
2056
+ "_Partner/@com.sap.vocabularies.UI.v1.LineItem": {
2057
+ "tableSettings": {
2058
+ "personalization": false
2059
+ }
2060
+ }
2061
+ }
2062
+ },
2063
+ crossNav: {
2064
+ "outbound1": {}
2065
+ },
2066
+ expectedValue: {},
2067
+ message: "with target outbound configured with no SO-action"
2068
+ }, {
2069
+ viewData: {
2070
+ controlConfiguration: {
2071
+ "@com.sap.vocabularies.UI.v1.DataPoint#dp1": {
2072
+ "navigation": {
2073
+ "targetOutbound": {
2074
+ "outbound": "outbound1"
2075
+ }
2076
+ }
2077
+ },
2078
+ "@com.sap.vocabularies.UI.v1.Chart#chart1": {
2079
+ "navigation": {
2080
+ "targetOutbound": {
2081
+ "outbound": "outbound1"
2082
+ }
2083
+ }
2084
+ }
2085
+ }
2086
+ },
2087
+ crossNav: {
2088
+ "outbound1": {
2089
+ semanticObject: "SO1",
2090
+ action: "action1",
2091
+ parameters: {
2092
+ "mappedProperty1": {
2093
+ "value": {
2094
+ "value": "mainProperty1",
2095
+ "format": "binding"
2096
+ }
2097
+ },
2098
+ "mappedProperty2": {
2099
+ "value": {
2100
+ "value": "mainProperty2",
2101
+ "format": "plain"
2102
+ }
2103
+ },
2104
+ "mainProperty3": {
2105
+ "defaultValue": {
2106
+ "value": "UserDefault.GLAccount",
2107
+ "format": "reference"
2108
+ },
2109
+ "filter": {
2110
+ "value": "\\d+",
2111
+ "format": "regexp"
2112
+ }
2113
+ }
2114
+ }
2115
+ }
2116
+ },
2117
+ expectedValue: {
2118
+ "fe::HeaderDPLink::DataPoint::dp1": {
2119
+ "action": "action1",
2120
+ "semanticObject": "SO1",
2121
+ "semanticObjectMapping": [{
2122
+ "LocalProperty": {
2123
+ "$PropertyPath": "mainProperty1"
2124
+ },
2125
+ "SemanticObjectProperty": "mappedProperty1"
2126
+ }]
2127
+ },
2128
+ "fe::MicroChartLink::Chart::chart1": {
2129
+ "action": "action1",
2130
+ "semanticObject": "SO1",
2131
+ "semanticObjectMapping": [{
2132
+ "LocalProperty": {
2133
+ "$PropertyPath": "mainProperty1"
2134
+ },
2135
+ "SemanticObjectProperty": "mappedProperty1"
2136
+ }]
2137
+ }
2138
+ },
2139
+ message: "with target outbound configured with valid SO-action and semantic mapping"
2140
+ }].forEach(function (oData) {
2141
+ var oHeaderFacetItems = CommonUtils.getHeaderFacetItemConfigForExternalNavigation(oData.viewData, oData.crossNav);
2142
+ expect(oHeaderFacetItems).toEqual(oData.expectedValue); // , "Unit test to check getHeaderFacetItemConfigForExternalNavigation " + oData.message + ": ok"
2143
+ });
2144
+ });
2145
+ });
2146
+ describe("Unit Test for getSemanticObjectMapping", function () {
2147
+ test("Unit Test for getSemanticObjectMapping", function () {
2148
+ [{
2149
+ outbound: {
2150
+ "outbound1": {
2151
+ semanticObject: "SO1",
2152
+ action: "action1"
2153
+ }
2154
+ },
2155
+ expectedValue: [],
2156
+ message: "with target outbound configured no semanticobject mapping"
2157
+ }, {
2158
+ outbound: {
2159
+ semanticObject: "SO1",
2160
+ action: "action1",
2161
+ parameters: {
2162
+ "mappedProperty1": {
2163
+ "value": {
2164
+ "value": "mainProperty1",
2165
+ "format": "binding"
2166
+ }
2167
+ },
2168
+ "mappedProperty2": {
2169
+ "value": {
2170
+ "value": "mainProperty2",
2171
+ "format": "plain"
2172
+ }
2173
+ },
2174
+ "mainProperty3": {
2175
+ "defaultValue": {
2176
+ "value": "UserDefault.GLAccount",
2177
+ "format": "reference"
2178
+ },
2179
+ "filter": {
2180
+ "value": "\\d+",
2181
+ "format": "regexp"
2182
+ }
2183
+ },
2184
+ "mappedProperty4": {
2185
+ "value": {
2186
+ "value": "mainProperty4",
2187
+ "format": "binding"
2188
+ }
2189
+ }
2190
+ }
2191
+ },
2192
+ expectedValue: [{
2193
+ "LocalProperty": {
2194
+ "$PropertyPath": "mainProperty1"
2195
+ },
2196
+ "SemanticObjectProperty": "mappedProperty1"
2197
+ }, {
2198
+ "LocalProperty": {
2199
+ "$PropertyPath": "mainProperty4"
2200
+ },
2201
+ "SemanticObjectProperty": "mappedProperty4"
2202
+ }],
2203
+ message: "with target outbound configured with valid SO-action and semantic mapping"
2204
+ }].forEach(function (oData) {
2205
+ var oHeaderFacetItems = CommonUtils.getSemanticObjectMapping(oData.outbound);
2206
+ expect(oHeaderFacetItems).toEqual(oData.expectedValue); // ,"Unit test to check getSemanticObjectMapping " + oData.message + ": ok"
2207
+ });
2208
+ });
2209
+ describe("fnOnStrictHandlingFailed", function () {
2210
+ test("fnOnStrictHandlingFailed for unbound action and single 412 message from backend", function () {
2211
+ try {
2212
+ var confirmWarning;
2213
+ var confirmSelection = "UnboundAction";
2214
+ jest.spyOn(MessageBox, "warning").mockImplementation(function (msg, options) {
2215
+ return confirmWarning.call(null, msg, options);
2216
+ });
2217
+
2218
+ confirmWarning = function (msg, options) {
2219
+ expect(options.title).toEqual("Warning");
2220
+ expect(msg).toEqual("Unable to execute the action due to a warning" + "\n" + "Proceed anyway?");
2221
+ options.onClose(confirmSelection);
2222
+ };
2223
+
2224
+ var oModel = {
2225
+ submitBatch: jest.fn().mockReturnValue(Promise.resolve({}))
2226
+ };
2227
+ var aMessages = [{
2228
+ message: "Unable to execute the action due to a warning"
2229
+ }];
2230
+ return Promise.resolve(CommonUtils.fnOnStrictHandlingFailed("actionImport", "UnboundAction", oModel, aMessages)).then(function () {});
2231
+ } catch (e) {
2232
+ return Promise.reject(e);
2233
+ }
2234
+ });
2235
+ test("fnOnStrictHandlingFailed for unbound action and multiple 412 messages from backend - ignore warnings and continue", function () {
2236
+ try {
2237
+ var oMockprepareMessageViewForDialog = jest.spyOn(MessageHandling, "prepareMessageViewForDialog");
2238
+ oMockprepareMessageViewForDialog.mockImplementationOnce(function () {
2239
+ var oMessageView = new MessageView({
2240
+ showDetailsPageHeader: false
2241
+ });
2242
+ return {
2243
+ oMessageView: oMessageView,
2244
+ bhasEtagMessage: false
2245
+ };
2246
+ });
2247
+ var oDialogOpenStub = jest.spyOn(Dialog.prototype, "open");
2248
+ oDialogOpenStub.mockImplementation(function () {
2249
+ var oActionButton = this.getBeginButton();
2250
+ oActionButton.firePress();
2251
+ });
2252
+ var oModel = {
2253
+ submitBatch: jest.fn().mockReturnValue(Promise.resolve({}))
2254
+ };
2255
+ var aMessages = [{
2256
+ message: "Unable to execute the action due to a warning"
2257
+ }, {
2258
+ message: "Unable to execute the action due to a warning"
2259
+ }];
2260
+ return Promise.resolve(expect(CommonUtils.fnOnStrictHandlingFailed("actionImport", "UnboundAction", oModel, aMessages))).then(function () {
2261
+ expect(oMockprepareMessageViewForDialog).toHaveBeenCalledTimes(1);
2262
+ expect(oDialogOpenStub).toHaveBeenCalledTimes(1);
2263
+ });
2264
+ } catch (e) {
2265
+ return Promise.reject(e);
2266
+ }
2267
+ });
2268
+ test("fnOnStrictHandlingFailed for unbound action and multiple 412 messages from backend - cancel", function () {
2269
+ try {
2270
+ var oMockprepareMessageViewForDialog = jest.spyOn(MessageHandling, "prepareMessageViewForDialog");
2271
+ oMockprepareMessageViewForDialog.mockImplementationOnce(function () {
2272
+ var oMessageView = new MessageView({
2273
+ showDetailsPageHeader: false
2274
+ });
2275
+ return {
2276
+ oMessageView: oMessageView,
2277
+ bhasEtagMessage: false
2278
+ };
2279
+ });
2280
+ var oDialogOpenStub = jest.spyOn(Dialog.prototype, "open");
2281
+ oDialogOpenStub.mockImplementation(function () {
2282
+ var oActionButton = this.getEndButton();
2283
+ oActionButton.firePress();
2284
+ });
2285
+ var oModel = {
2286
+ submitBatch: jest.fn().mockReturnValue(Promise.resolve({}))
2287
+ };
2288
+ var aMessages = [{
2289
+ message: "Unable to execute the action due to a warning"
2290
+ }, {
2291
+ message: "Unable to execute the action due to a warning"
2292
+ }];
2293
+ return Promise.resolve(expect(CommonUtils.fnOnStrictHandlingFailed("actionImport", "UnboundAction", oModel, aMessages))).then(function () {
2294
+ expect(oMockprepareMessageViewForDialog).toHaveBeenCalledTimes(2);
2295
+ expect(oDialogOpenStub).toHaveBeenCalledTimes(2);
2296
+ });
2297
+ } catch (e) {
2298
+ return Promise.reject(e);
2299
+ }
2300
+ });
2301
+ });
2302
+ });
2303
+ });
2304
+ }, false);
2305
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbW1vblV0aWxzLnNwZWMudHMiXSwibmFtZXMiOlsibWV0YU1vZGVsIiwiYmVmb3JlQWxsIiwic01ldGFkYXRhVXJsIiwiY29tcGlsZUNEUyIsInBhdGgiLCJqb2luIiwiX19kaXJuYW1lIiwiZ2V0TWV0YU1vZGVsIiwiZGVzY3JpYmUiLCJpdCIsIm9VcmlQYXJhbXMiLCJvSW5ib3VuZHMiLCJvRXhwZWN0ZWRPdXRwdXQiLCJTYWxlc09yZGVyVHlwZSIsIlNhbGVzT3JnYW5pemF0aW9uIiwiYWN0dWFsT3V0cHV0IiwiQ29tbW9uVXRpbHMiLCJnZXRBZGRpdGlvbmFsUGFyYW1zRm9yQ3JlYXRlIiwiZXhwZWN0IiwidG9FcXVhbCIsInVuZGVmaW5lZCIsImFFeHBlY3RlZE91dHB1dCIsImdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyIsIm9WaWV3IiwiaXNBIiwiamVzdCIsImZuIiwibW9ja1JldHVyblZhbHVlIiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsInRvSGF2ZUJlZW5DYWxsZWQiLCJkYXRhRmllbGQiLCJvQ29udGV4dCIsImdldE9iamVjdCIsIkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMiLCJQcm9wZXJ0eSIsIiRQcm9wZXJ0eVBhdGgiLCJBbGxvd2VkRXhwcmVzc2lvbnMiLCJleHBlY3RlZFZhbHVlIiwic01lc3NhZ2UiLCJmb3JFYWNoIiwib1Byb3BlcnR5IiwiYWN0dWFsVmFsdWUiLCJnZXRPcGVyYXRvcnNGb3JQcm9wZXJ0eSIsImFUZXN0cyIsInRpdGxlIiwiaW5wdXQiLCJleHBlY3RlZCIsInRlc3QiLCJub3JtYWxpemVTZWFyY2hUZXJtIiwidG9CZSIsImdldE1vZGVsIiwic1BhcmFtIiwiJGtpbmQiLCJnZXRQcm9wZXJ0eSIsImlzU3RpY2t5RWRpdE1vZGUiLCJvQ29udHJvbCIsImlzRmllbGRDb250cm9sUGF0aEluYXBwbGljYWJsZSIsImZpZWxkQ29udHJvbFBhdGgiLCJhdHRyaWJ1dGUiLCJhQXR0cmlidXRlcyIsIm9NZXRhTW9kZWwiLCJzUGF0aCIsImluZGV4T2YiLCJFeHBlY3RlZFJlc3VsdCIsIlJlc3VsdCIsInJlbW92ZVNlbnNpdGl2ZURhdGEiLCJKU09OIiwic3RyaW5naWZ5IiwiZm5DcmVhdGVNb2RlbCIsIm9Nb2RlbCIsIk9iamVjdCIsImFzc2lnbiIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwibW9kZWwiLCJlbnRpdHlTZXRQYXRoIiwicHJvcGVydHkiLCJza2lwSGlkZGVuRmlsdGVyIiwibWVzc2FnZSIsIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiaXNQcm9wZXJ0eUZpbHRlcmFibGUiLCJ0aGF0IiwiYmVmb3JlRWFjaCIsImdldFZhbHVlU3R1YiIsInNweU9uIiwiRmlsdGVySGVscGVyIiwibW9ja0ltcGxlbWVudGF0aW9uIiwiZmFrZUZuIiwib1ZhbHVlIiwiZ2V0T3BlcmF0b3JTdHViIiwiZ2V0VmFsaWRQcm9wc1N0dWIiLCJ2YWxpZFByb3BlcnRpZXMiLCJnZXRGaWx0ZXJhYmxlU3R1YiIsImdldFBhcmFtZXRlckluZm9TdHViIiwicGFyYW1ldGVySW5mbyIsImFmdGVyRWFjaCIsIm1vY2tSZXN0b3JlIiwib1NWIiwiU2VsZWN0aW9uVmFyaWFudCIsIm9Db25kaXRpb25zIiwiYWRkU2VsZWN0T3B0aW9uIiwiYWRkU2VsZWN0aW9uVmFyaWFudFRvQ29uZGl0aW9ucyIsImtleXMiLCJsZW5ndGgiLCIkVHlwZSIsImlDb3VudCIsImluY2x1ZGVzIiwiJGlzQ29sbGVjdGlvbiIsImFQcm9wZXJ0aWVzIiwic1Byb3BlcnR5TmFtZSIsInZhbHVlcyIsImNvbnRleHRQYXRoIiwicGFyYW1ldGVyUHJvcGVydGllcyIsInBhcmFtMVZhbHVlIiwicGFyYW0yVmFsdWUiLCJvSW5wdXRTZWxlY3Rpb25WYXJpYW50Iiwib1RhcmdldEluZm8iLCJtRmlsdGVycyIsIm9PdXRQdXRTZWxlY3Rpb25WYXJpYW50IiwiYWRkRXh0ZXJuYWxTdGF0ZUZpbHRlcnNUb1NlbGVjdGlvblZhcmlhbnQiLCJvQWN0dWFsU2VsZWN0aW9uVmFyaWFudCIsIl9tUGFyYW1ldGVycyIsIl9tU2VsZWN0T3B0aW9ucyIsIl9zSWQiLCJhTWFuZGF0b3J5RmllbGRzIiwib0FwcERhdGEiLCJvRXhwZWN0ZWRWYWx1ZSIsIm9TZWxlY3Rpb25WYXJpYW50Iiwib0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQiLCJvVGVzdERhdGEiLCJhZGREZWZhdWx0RGlzcGxheUN1cnJlbmN5IiwiZ2V0U2VsZWN0T3B0aW9uIiwiTG93Iiwib0RhdGEiLCJhS2V5RmllbGRzIiwidG9TdHJpbmciLCJvU2VsZWN0aW9uVmFyaWFudDEiLCJvU2VsZWN0aW9uVmFyaWFudDIiLCJzTWFwcGluZzEiLCJzZXRTZW1hbnRpY09iamVjdE1hcHBpbmdzIiwic01hcHBpbmcyIiwidmlld0RhdGEiLCJjb250cm9sQ29uZmlndXJhdGlvbiIsImNyb3NzTmF2Iiwic2VtYW50aWNPYmplY3QiLCJhY3Rpb24iLCJwYXJhbWV0ZXJzIiwib0hlYWRlckZhY2V0SXRlbXMiLCJnZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24iLCJvdXRib3VuZCIsImdldFNlbWFudGljT2JqZWN0TWFwcGluZyIsImNvbmZpcm1XYXJuaW5nIiwiY29uZmlybVNlbGVjdGlvbiIsIk1lc3NhZ2VCb3giLCJtc2ciLCJvcHRpb25zIiwiY2FsbCIsIm9uQ2xvc2UiLCJzdWJtaXRCYXRjaCIsIlByb21pc2UiLCJyZXNvbHZlIiwiYU1lc3NhZ2VzIiwiZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkIiwib01vY2twcmVwYXJlTWVzc2FnZVZpZXdGb3JEaWFsb2ciLCJNZXNzYWdlSGFuZGxpbmciLCJtb2NrSW1wbGVtZW50YXRpb25PbmNlIiwib01lc3NhZ2VWaWV3IiwiTWVzc2FnZVZpZXciLCJzaG93RGV0YWlsc1BhZ2VIZWFkZXIiLCJiaGFzRXRhZ01lc3NhZ2UiLCJvRGlhbG9nT3BlblN0dWIiLCJEaWFsb2ciLCJwcm90b3R5cGUiLCJvQWN0aW9uQnV0dG9uIiwiZ2V0QmVnaW5C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QSxlQUFlLENBQUNwRixrQkFBaEIsQ0FBbUMsWUFBdUI7QUFDekQsa0JBQU11RixhQUFhLEdBQUcsS0FBS0ksWUFBTCxFQUF0QjtBQUNBSixjQUFBQSxhQUFhLENBQUNFLFNBQWQ7QUFDQSxhQUhEO0FBSUEsZ0JBQU16RyxNQUF3QixHQUFHO0FBQ2hDd0YsY0FBQUEsV0FBVyxFQUFFckksSUFBSSxDQUFDQyxFQUFMLEdBQVVDLGVBQVYsQ0FBMEJvSSxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsRUFBaEIsQ0FBMUI7QUFEbUIsYUFBakM7QUFHQSxnQkFBTUMsU0FBUyxHQUFHLENBQ2pCO0FBQ0NuRixjQUFBQSxPQUFPLEVBQUU7QUFEVixhQURpQixFQUlqQjtBQUNDQSxjQUFBQSxPQUFPLEVBQUU7QUFEVixhQUppQixDQUFsQjtBQW5Cb0gsbUNBMkI5RzVELE1BQU0sQ0FBQ0YsV0FBVyxDQUFDa0osd0JBQVosQ0FBcUMsY0FBckMsRUFBcUQsZUFBckQsRUFBc0U1RixNQUF0RSxFQUE4RTJGLFNBQTlFLENBQUQsQ0EzQndHO0FBNEJwSC9JLGNBQUFBLE1BQU0sQ0FBQ2lKLGdDQUFELENBQU4sQ0FBeUNhLHFCQUF6QyxDQUErRCxDQUEvRDtBQUNBOUosY0FBQUEsTUFBTSxDQUFDd0osZUFBRCxDQUFOLENBQXdCTSxxQkFBeEIsQ0FBOEMsQ0FBOUM7QUE3Qm9IO0FBOEJwSCxXQTlCRztBQUFBO0FBQUE7QUFBQSxVQUFKO0FBK0JBLE9BeEZPLENBQVI7QUF5RkEsS0EvSk8sQ0FBUjtBQWdLQSxHQWx4RU8sQ0FBUiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBTZWxlY3Rpb25WYXJpYW50IGZyb20gXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgeyBjb21waWxlQ0RTLCBnZXRNZXRhTW9kZWwgfSBmcm9tIFwic2FwL2ZlL3Rlc3QvSmVzdFRlbXBsYXRpbmdIZWxwZXJcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0ICogYXMgRmlsdGVySGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0ZpbHRlckhlbHBlclwiO1xuaW1wb3J0IE1lc3NhZ2VWaWV3IGZyb20gXCJzYXAvbS9NZXNzYWdlVmlld1wiO1xuaW1wb3J0IE1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvYWN0aW9ucy9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5cbmxldCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsO1xuYmVmb3JlQWxsKGFzeW5jIGZ1bmN0aW9uKCkge1xuXHRjb25zdCBzTWV0YWRhdGFVcmwgPSBjb21waWxlQ0RTKHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi9kYXRhL2NvbXB1dGVkRGVmYXVsdFZhbHVlU2VydmljZS5jZHNcIikpO1xuXHRtZXRhTW9kZWwgPSBhd2FpdCBnZXRNZXRhTW9kZWwoc01ldGFkYXRhVXJsKTtcbn0pO1xuXG5kZXNjcmliZShcIkNvbW1vblV0aWxzXCIsIGZ1bmN0aW9uKCkge1xuXHRkZXNjcmliZShcImdldEFkZGl0aW9uYWxQYXJhbXNGb3JDcmVhdGVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0aXQoXCJnZXRBZGRpdGlvbmFsUGFyYW1zRm9yQ3JlYXRlXCIsIGFzeW5jIGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29uc3Qgb1VyaVBhcmFtcyA9IHtcblx0XHRcdFx0XCJTYWxlc09yZGVyVHlwZVwiOiBbXCJPUlwiXSxcblx0XHRcdFx0XCJTYWxlc09yZ2FuaXphdGlvblwiOiBbXCIxXCJdXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3Qgb0luYm91bmRzID0ge1xuXHRcdFx0XHRcIlNhbGVzT3JkZXJUeXBlXCI6IHtcblx0XHRcdFx0XHRcInVzZUZvckNyZWF0ZVwiOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwiU2FsZXNPcmdhbml6YXRpb25cIjoge1xuXHRcdFx0XHRcdFwidXNlRm9yQ3JlYXRlXCI6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJEaXN0cmlidXRpb25DaGFubmVsXCI6IHtcblx0XHRcdFx0XHRcInVzZUZvckNyZWF0ZVwiOiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRjb25zdCBvRXhwZWN0ZWRPdXRwdXQgPSB7XG5cdFx0XHRcdFNhbGVzT3JkZXJUeXBlOiBcIk9SXCIsXG5cdFx0XHRcdFNhbGVzT3JnYW5pemF0aW9uOiBcIjFcIlxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IGFjdHVhbE91dHB1dCA9IENvbW1vblV0aWxzLmdldEFkZGl0aW9uYWxQYXJhbXNGb3JDcmVhdGUob1VyaVBhcmFtcywgb0luYm91bmRzKTtcblx0XHRcdGV4cGVjdChhY3R1YWxPdXRwdXQpLnRvRXF1YWwob0V4cGVjdGVkT3V0cHV0KTtcblx0XHR9KTtcblxuXHRcdGl0KFwiZ2V0QWRkaXRpb25hbFBhcmFtc0ZvckNyZWF0ZSAtIG5vIHN0YXJ0IHVwIHBhcmFtZXRlcnNcIiwgYXN5bmMgZnVuY3Rpb24oKSB7XG5cdFx0XHRjb25zdCBvVXJpUGFyYW1zID0ge307XG5cdFx0XHRjb25zdCBvSW5ib3VuZHMgPSB7XG5cdFx0XHRcdFwiU2FsZXNPcmRlclR5cGVcIjoge1xuXHRcdFx0XHRcdFwidXNlRm9yQ3JlYXRlXCI6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJTYWxlc09yZ2FuaXphdGlvblwiOiB7XG5cdFx0XHRcdFx0XCJ1c2VGb3JDcmVhdGVcIjogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRcIkRpc3RyaWJ1dGlvbkNoYW5uZWxcIjoge1xuXHRcdFx0XHRcdFwidXNlRm9yQ3JlYXRlXCI6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IG9FeHBlY3RlZE91dHB1dCA9IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGFjdHVhbE91dHB1dCA9IENvbW1vblV0aWxzLmdldEFkZGl0aW9uYWxQYXJhbXNGb3JDcmVhdGUob1VyaVBhcmFtcywgb0luYm91bmRzKTtcblx0XHRcdGV4cGVjdChhY3R1YWxPdXRwdXQpLnRvRXF1YWwob0V4cGVjdGVkT3V0cHV0KTtcblx0XHR9KTtcblxuXHRcdGl0KFwiZ2V0QWRkaXRpb25hbFBhcmFtc0ZvckNyZWF0ZSAtIG5vIEluYm91bmQgUGFyYW1ldGVyc1wiLCBhc3luYyBmdW5jdGlvbigpIHtcblx0XHRcdGNvbnN0IG9VcmlQYXJhbXMgPSB7XG5cdFx0XHRcdFwiU2FsZXNPcmRlclR5cGVcIjogW1wiT1JcIl0sXG5cdFx0XHRcdFwiU2FsZXNPcmdhbml6YXRpb25cIjogW1wiMVwiXVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IG9JbmJvdW5kcyA9IHt9O1xuXHRcdFx0Y29uc3Qgb0V4cGVjdGVkT3V0cHV0ID0gdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgYWN0dWFsT3V0cHV0ID0gQ29tbW9uVXRpbHMuZ2V0QWRkaXRpb25hbFBhcmFtc0ZvckNyZWF0ZShvVXJpUGFyYW1zLCBvSW5ib3VuZHMpO1xuXHRcdFx0ZXhwZWN0KGFjdHVhbE91dHB1dCkudG9FcXVhbChvRXhwZWN0ZWRPdXRwdXQpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJnZXRBZGRpdGlvbmFsUGFyYW1zRm9yQ3JlYXRlIC0gbm8gSW5ib3VuZCBhbmQgc3RhcnQgdXAgUGFyYW1ldGVyc1wiLCBhc3luYyBmdW5jdGlvbigpIHtcblx0XHRcdGNvbnN0IG9VcmlQYXJhbXMgPSB7fTtcblx0XHRcdGNvbnN0IG9JbmJvdW5kcyA9IHt9O1xuXHRcdFx0Y29uc3Qgb0V4cGVjdGVkT3V0cHV0ID0gdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgYWN0dWFsT3V0cHV0ID0gQ29tbW9uVXRpbHMuZ2V0QWRkaXRpb25hbFBhcmFtc0ZvckNyZWF0ZShvVXJpUGFyYW1zLCBvSW5ib3VuZHMpO1xuXHRcdFx0ZXhwZWN0KGFjdHVhbE91dHB1dCkudG9FcXVhbChvRXhwZWN0ZWRPdXRwdXQpO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcImdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkc1wiLCBmdW5jdGlvbigpIHtcblx0XHRpdChcImdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyAtIEdVSUQgQ29tcHV0ZWREZWZhdWx0VmFsdWUga2V5IGZpZWxkIHdpdGggdGV4dCBhbm5vdGF0aW9uXCIsIGFzeW5jIGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29uc3QgYUV4cGVjdGVkT3V0cHV0ID0gW1wiSURcIiwgXCJJbW11dGFibGVOb25LZXlXaXRoVGV4dFwiLCBcIkltbXV0YWJsZU5vbktleVdpdGhvdXRUZXh0XCJdO1xuXHRcdFx0Y29uc3QgYWN0dWFsT3V0cHV0ID0gQ29tbW9uVXRpbHMuZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzKG1ldGFNb2RlbCwgXCIvRW50aXR5V2l0aEtleUZpZWxkSGF2aW5nVGV4dFwiKTtcblx0XHRcdGV4cGVjdChhY3R1YWxPdXRwdXQpLnRvRXF1YWwoYUV4cGVjdGVkT3V0cHV0KTtcblx0XHR9KTtcblxuXHRcdGl0KFwiZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIC0gR1VJRCBDb21wdXRlZERlZmF1bHRWYWx1ZSBrZXkgZmllbGQgd2l0aG91dCB0ZXh0IGFubm90YXRpb25cIiwgYXN5bmMgZnVuY3Rpb24oKSB7XG5cdFx0XHRjb25zdCBhRXhwZWN0ZWRPdXRwdXQ6IGFueVtdID0gW107XG5cdFx0XHRjb25zdCBhY3R1YWxPdXRwdXQgPSBDb21tb25VdGlscy5nZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMobWV0YU1vZGVsLCBcIi9FbnRpdHlXaXRoS2V5RmllbGROb3RIYXZpbmdUZXh0XCIpO1xuXHRcdFx0ZXhwZWN0KGFjdHVhbE91dHB1dCkudG9FcXVhbChhRXhwZWN0ZWRPdXRwdXQpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMgLSBIaWRkZW4gR1VJRCBDb21wdXRlZERlZmF1bHRWYWx1ZSBrZXkgZmllbGRcIiwgYXN5bmMgZnVuY3Rpb24oKSB7XG5cdFx0XHRjb25zdCBhRXhwZWN0ZWRPdXRwdXQ6IGFueVtdID0gW107XG5cdFx0XHRjb25zdCBhY3R1YWxPdXRwdXQgPSBDb21tb25VdGlscy5nZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMobWV0YU1vZGVsLCBcIi9FbnRpdHlXaXRoSGlkZGVuS2V5RmllbGRcIik7XG5cdFx0XHRleHBlY3QoYWN0dWFsT3V0cHV0KS50b0VxdWFsKGFFeHBlY3RlZE91dHB1dCk7XG5cdFx0fSk7XG5cblx0XHRpdChcImdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyAtIFJlYWRPbmx5IEdVSUQgQ29tcHV0ZWREZWZhdWx0VmFsdWUga2V5IGZpZWxkXCIsIGFzeW5jIGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29uc3QgYUV4cGVjdGVkT3V0cHV0OiBhbnlbXSA9IFtcIklEXCJdO1xuXHRcdFx0Y29uc3QgYWN0dWFsT3V0cHV0ID0gQ29tbW9uVXRpbHMuZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzKG1ldGFNb2RlbCwgXCIvRW50aXR5V2l0aFJlYWRPbmx5S2V5RmllbGRIYXZpbmdUZXh0XCIpO1xuXHRcdFx0ZXhwZWN0KGFjdHVhbE91dHB1dCkudG9FcXVhbChhRXhwZWN0ZWRPdXRwdXQpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMgLSBSZWFkT25seSBHVUlEIENvbXB1dGVkRGVmYXVsdFZhbHVlIGtleSBmaWVsZFwiLCBhc3luYyBmdW5jdGlvbigpIHtcblx0XHRcdGNvbnN0IGFFeHBlY3RlZE91dHB1dDogYW55W10gPSBbXTtcblx0XHRcdGNvbnN0IGFjdHVhbE91dHB1dCA9IENvbW1vblV0aWxzLmdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyhtZXRhTW9kZWwsIFwiL0VudGl0eVdpdGhSZWFkT25seUtleUZpZWxkTm90SGF2aW5nVGV4dFwiKTtcblx0XHRcdGV4cGVjdChhY3R1YWxPdXRwdXQpLnRvRXF1YWwoYUV4cGVjdGVkT3V0cHV0KTtcblx0XHR9KTtcblxuXHRcdGl0KFwiZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIC0gR1VJRCBrZXkgZmllbGQgd2l0aCBib3RoIENvbXB1dGVkIGFuZCBDb21wdXRlRGVmYXVsdFZhbHVlIGFubm90YXRpb24gd2l0aG91dCB2aWV3XCIsIGFzeW5jIGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29uc3QgYUV4cGVjdGVkT3V0cHV0OiBhbnlbXSA9IFtdO1xuXHRcdFx0Y29uc3QgYWN0dWFsT3V0cHV0ID0gQ29tbW9uVXRpbHMuZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzKG1ldGFNb2RlbCwgXCIvRW50aXR5V2l0aENvbXB1dGVkQW5kQ29tcHV0ZWREZWZhdWx0VmFsdWVLZXlGaWVsZFwiKTtcblx0XHRcdGV4cGVjdChhY3R1YWxPdXRwdXQpLnRvRXF1YWwoYUV4cGVjdGVkT3V0cHV0KTtcblx0XHR9KTtcblxuXHRcdGl0KFwiZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIC0gR1VJRCBrZXkgZmllbGQgd2l0aCBib3RoIENvbXB1dGVkIGFuZCBDb21wdXRlRGVmYXVsdFZhbHVlIGFubm90YXRpb25cIiwgYXN5bmMgZnVuY3Rpb24oKSB7XG5cdFx0XHRjb25zdCBhRXhwZWN0ZWRPdXRwdXQ6IGFueVtdID0gW107XG5cdFx0XHRjb25zdCBvVmlldyA9IHtcblx0XHRcdFx0aXNBOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHRydWUpLFxuXHRcdFx0XHRnZXREaWFnbm9zdGljczogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7XG5cdFx0XHRcdFx0YWRkSXNzdWU6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoXCJcIilcblx0XHRcdFx0fSlcblx0XHRcdH07XG5cdFx0XHRjb25zdCBhY3R1YWxPdXRwdXQgPSBDb21tb25VdGlscy5nZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMoXG5cdFx0XHRcdG1ldGFNb2RlbCxcblx0XHRcdFx0XCIvRW50aXR5V2l0aENvbXB1dGVkQW5kQ29tcHV0ZWREZWZhdWx0VmFsdWVLZXlGaWVsZFwiLFxuXHRcdFx0XHRvVmlld1xuXHRcdFx0KTtcblx0XHRcdGV4cGVjdChvVmlldy5nZXREaWFnbm9zdGljcygpLmFkZElzc3VlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG5cdFx0XHRleHBlY3QoYWN0dWFsT3V0cHV0KS50b0VxdWFsKGFFeHBlY3RlZE91dHB1dCk7XG5cdFx0fSk7XG5cdH0pO1xuXHRkZXNjcmliZShcImdldE9wZXJhdG9yc0ZvclByb3BlcnR5XCIsIGZ1bmN0aW9uKCkge1xuXHRcdGl0KFwiZ2V0T3BlcmF0b3JzRm9yUHJvcGVydHkgLSBTaW5nbGUgVmFsdWUgQWxsb3dlZCBFeHByZXNzaW9uc1wiLCBhc3luYyBmdW5jdGlvbigpIHtcblx0XHRcdFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGRhdGFGaWVsZDogXCJTYWxlc09yZGVyRGF0ZVwiLFxuXHRcdFx0XHRcdG9Db250ZXh0OiB7XG5cdFx0XHRcdFx0XHRnZXRPYmplY3Q6IGZ1bmN0aW9uKHBhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHQvLyBFZG0gdHlwZVxuXHRcdFx0XHRcdFx0XHRpZiAocGF0aCA9PT0gXCIvZHVtbXkvU2FsZXNPcmRlckRhdGUvJFR5cGVcIikge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBcIkVkbS5EYXRlXCI7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmlsdGVyIEFubm90YXRpb25zXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdEZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnM6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFByb3BlcnR5OiB7ICRQcm9wZXJ0eVBhdGg6IFwiU2FsZXNPcmRlckRhdGVcIiB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdEFsbG93ZWRFeHByZXNzaW9uczogXCJTaW5nbGVWYWx1ZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRleHBlY3RlZFZhbHVlOlxuXHRcdFx0XHRcdFx0XCJEQVRFLFRPREFZLFlFU1RFUkRBWSxUT01PUlJPVyxGSVJTVERBWVdFRUssTEFTVERBWVdFRUssRklSU1REQVlNT05USCxMQVNUREFZTU9OVEgsRklSU1REQVlRVUFSVEVSLExBU1REQVlRVUFSVEVSLEZJUlNUREFZWUVBUixMQVNUREFZWUVBUlwiLFxuXHRcdFx0XHRcdHNNZXNzYWdlOiBcIkVkbS5EYXRlIGFuZCBTaW5nbGUgVmFsdWUgT3IgU2VhcmNoIEV4cHJlc3Npb25zXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGRhdGFGaWVsZDogXCJTYWxlc09yZGVyRGF0ZVwiLFxuXHRcdFx0XHRcdG9Db250ZXh0OiB7XG5cdFx0XHRcdFx0XHRnZXRPYmplY3Q6IGZ1bmN0aW9uKHBhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHQvLyBFZG0gdHlwZVxuXHRcdFx0XHRcdFx0XHRpZiAocGF0aCA9PT0gXCIvZHVtbXkvU2FsZXNPcmRlckRhdGUvJFR5cGVcIikge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBcIkVkbS5TdHJpbmdcIjtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBGaWx0ZXIgQW5ub3RhdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0RmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9uczogW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0UHJvcGVydHk6IHsgJFByb3BlcnR5UGF0aDogXCJTYWxlc09yZGVyRGF0ZVwiIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0QWxsb3dlZEV4cHJlc3Npb25zOiBcIlNpbmdsZVZhbHVlXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGV4cGVjdGVkVmFsdWU6IFwiRVFcIixcblx0XHRcdFx0XHRzTWVzc2FnZTogXCJFZG0uU3RyaW5nIGFuZCBTaW5nbGUgVmFsdWUgT3IgU2VhcmNoIEV4cHJlc3Npb25zXCJcblx0XHRcdFx0fVxuXHRcdFx0XS5mb3JFYWNoKGZ1bmN0aW9uKG9Qcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBhY3R1YWxWYWx1ZSA9IENvbW1vblV0aWxzLmdldE9wZXJhdG9yc0ZvclByb3BlcnR5KFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5kYXRhRmllbGQsXG5cdFx0XHRcdFx0XCIvZHVtbXlcIixcblx0XHRcdFx0XHRvUHJvcGVydHkub0NvbnRleHQsXG5cdFx0XHRcdFx0b1Byb3BlcnR5Lm9Db250ZXh0LmdldE9iamVjdChcIi9kdW1teS9cIiArIG9Qcm9wZXJ0eS5kYXRhRmllbGQgKyBcIi8kVHlwZVwiKSxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGV4cGVjdChhY3R1YWxWYWx1ZSkudG9FcXVhbChvUHJvcGVydHkuZXhwZWN0ZWRWYWx1ZSk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fSk7XG5cdGRlc2NyaWJlKFwiQ29tbW9uVXRpbHMgLSBub3JtYWxpemVTZWFyY2hUZXJtKCkgaW5wdXQgXCIsIGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGFUZXN0cyA9IFtcblx0XHRcdHtcblx0XHRcdFx0dGl0bGU6IFwiaXMgYW4gZW1wdHkgc2VhcmNoIHN0cmluZ1wiLFxuXHRcdFx0XHRpbnB1dDogXCJcIixcblx0XHRcdFx0ZXhwZWN0ZWQ6IHVuZGVmaW5lZFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGl0bGU6IFwiaXMgYW4gdW5kZWZpbmVkIHNlYXJjaCB0ZXJtXCIsXG5cdFx0XHRcdGlucHV0OiB1bmRlZmluZWQsXG5cdFx0XHRcdGV4cGVjdGVkOiB1bmRlZmluZWRcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiBcImlzIGEgZG91YmxlIHF1b3RlXCIsXG5cdFx0XHRcdGlucHV0OiAnXCInLFxuXHRcdFx0XHRleHBlY3RlZDogdW5kZWZpbmVkXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZTogXCJpcyBhIHNpbmdsZSBxdW90ZVwiLFxuXHRcdFx0XHRpbnB1dDogXCInXCIsXG5cdFx0XHRcdGV4cGVjdGVkOiAnXCJcXCdcIidcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiBcImNvbnRhaW5zIHR3byB3b3Jkc1wiLFxuXHRcdFx0XHRpbnB1dDogXCJXdXRoZXJpbmcgSGVpZ2h0c1wiLFxuXHRcdFx0XHRleHBlY3RlZDogJ1wiV3V0aGVyaW5nXCIgXCJIZWlnaHRzXCInXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZTogXCJjb250YWlucyBhIHRhYiBpbiBiZXR3ZWVuXCIsXG5cdFx0XHRcdGlucHV0OiBcIldvcmQwIFdvcmQxXFx0V29yZDIgV29yZDNcIixcblx0XHRcdFx0ZXhwZWN0ZWQ6ICdcIldvcmQwXCIgXCJXb3JkMVwiIFwiV29yZDJcIiBcIldvcmQzXCInXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZTogXCJjb250YWlucyBhIHJldHVybiBpbiBiZXR3ZWVuXCIsXG5cdFx0XHRcdGlucHV0OiBcIldvcmQwIFdvcmQxXFxuV29yZDJcXHJcXG5Xb3JkM1wiLFxuXHRcdFx0XHRleHBlY3RlZDogJ1wiV29yZDBcIiBcIldvcmQxXCIgXCJXb3JkMlwiIFwiV29yZDNcIidcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiBcImNvbnRhaW5zIG11bHRpcGxlIHdvcmRzIHdpdGggbXVsdGlwbGUgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmdcIixcblx0XHRcdFx0aW5wdXQ6IFwiICAgICBXdXRoZXJpbmcsIEhlaWdodHMgUGFydC1JSVwiLFxuXHRcdFx0XHRleHBlY3RlZDogJ1wiV3V0aGVyaW5nLFwiIFwiSGVpZ2h0c1wiIFwiUGFydC1JSVwiJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGl0bGU6IFwiY29udGFpbnMgbXVsdGlwbGUgd29yZHMgd2l0aCBtdWx0aXBsZSBzcGFjZXMgaW4gYmV0d2VlblwiLFxuXHRcdFx0XHRpbnB1dDogXCJXdXRoZXJpbmcsICAgIEhlaWdodHMgUGFydC0gIElJXCIsXG5cdFx0XHRcdGV4cGVjdGVkOiAnXCJXdXRoZXJpbmcsXCIgXCJIZWlnaHRzXCIgXCJQYXJ0LVwiIFwiSUlcIidcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiBcImNvbnRhaW5zIG11bHRpcGxlIHdvcmRzIHdpdGggbXVsdGlwbGUgc3BhY2VzIGF0IHRoZSBlbmRcIixcblx0XHRcdFx0aW5wdXQ6IFwiV3V0aGVyaW5nLCBIZWlnaHRzIFBhcnQtSUkgICAgXCIsXG5cdFx0XHRcdGV4cGVjdGVkOiAnXCJXdXRoZXJpbmcsXCIgXCJIZWlnaHRzXCIgXCJQYXJ0LUlJXCInXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZTogXCJjb250YWlucyBkb3VibGUgcXVvdGVzIGF0IHRoZSBiZWdpbm5pbmdcIixcblx0XHRcdFx0aW5wdXQ6ICdcIld1dGhlcmluZyBteSBIZWlnaHRzJyxcblx0XHRcdFx0ZXhwZWN0ZWQ6ICdcIld1dGhlcmluZ1wiIFwibXlcIiBcIkhlaWdodHNcIidcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiBcImNvbnRhaW5zIGRvdWJsZSBxdW90ZXMgaW4gYmV0d2VlblwiLFxuXHRcdFx0XHRpbnB1dDogJ1d1dGhcImVyaW5nJyxcblx0XHRcdFx0ZXhwZWN0ZWQ6ICdcIld1dGhcIiBcImVyaW5nXCInXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZTogXCJjb250YWlucyBkb3VibGUgcXVvdGVzIGF0IHRoZSBlbmRcIixcblx0XHRcdFx0aW5wdXQ6ICdXdXRoZXJpbmcgbm8gaGVpZ2h0c1wiJyxcblx0XHRcdFx0ZXhwZWN0ZWQ6ICdcIld1dGhlcmluZ1wiIFwibm9cIiBcImhlaWdodHNcIidcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiBcImNvbnRhaW5zIG11bHRpcGxlIGRvdWJsZSBxdW90ZXMgYXQgdGhlIGJlZ2lubmluZ1wiLFxuXHRcdFx0XHRpbnB1dDogJ1wiXCJXdXRoXCJlcmluZyBIZWlnXCJodHMnLFxuXHRcdFx0XHRleHBlY3RlZDogJ1wiV3V0aFwiIFwiZXJpbmdcIiBcIkhlaWdcIiBcImh0c1wiJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGl0bGU6IFwiY29udGFpbnMgbXVsdGlwbGUgZG91YmxlIHF1b3RlcyBpbiBiZXR3ZWVuXCIsXG5cdFx0XHRcdGlucHV0OiAnV3V0aFwiZXJpXCJcIm5nIEhlaWdcImh0cycsXG5cdFx0XHRcdGV4cGVjdGVkOiAnXCJXdXRoXCIgXCJlcmlcIiBcIm5nXCIgXCJIZWlnXCIgXCJodHNcIidcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiBcImNvbnRhaW5zIG11bHRpcGxlIGRvdWJsZSBxdW90ZXMgYXQgdGhlIGVuZFwiLFxuXHRcdFx0XHRpbnB1dDogJ1d1dGhcImVyaW5nIEhlXCJpZ2h0c1wiXCInLFxuXHRcdFx0XHRleHBlY3RlZDogJ1wiV3V0aFwiIFwiZXJpbmdcIiBcIkhlXCIgXCJpZ2h0c1wiJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGl0bGU6IFwiY29udGFpbnMgYSBzcGVjaWFsIGNoYXJhY3RlciBpbiBzdHJpbmdcIixcblx0XHRcdFx0aW5wdXQ6IFwiV3V0aCllcmluZ1wiLFxuXHRcdFx0XHRleHBlY3RlZDogJ1wiV3V0aCllcmluZ1wiJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGl0bGU6IFwiY29udGFpbnMgbXVsdGlwbGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHN0cmluZ1wiLFxuXHRcdFx0XHRpbnB1dDogXCJXIXUkdF5oKWVyJmluKmcoXCIsXG5cdFx0XHRcdGV4cGVjdGVkOiAnXCJXIXUkdF5oKWVyJmluKmcoXCInXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZTogXCJjb250YWlucyBzaW5nbGUgcXVvdGVzIGluIHN0cmluZ1wiLFxuXHRcdFx0XHRpbnB1dDogXCJJdCdzIEFwcGxlJ3MgbmV3IGlQaG9uZVwiLFxuXHRcdFx0XHRleHBlY3RlZDogJ1wiSXRcXCdzXCIgXCJBcHBsZVxcJ3NcIiBcIm5ld1wiIFwiaVBob25lXCInXG5cdFx0XHR9XG5cdFx0XTtcblxuXHRcdGFUZXN0cy5mb3JFYWNoKHRlc3QgPT4ge1xuXHRcdFx0aXQoXG5cdFx0XHRcdHRlc3QudGl0bGUsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcInJlZmVyZW5jZXNcIjogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcInR5cGVcIjogXCJKSVJBXCIsXG5cdFx0XHRcdFx0XHRcdFwiSURcIjogXCJGSU9SSVRFQ0hQMS0yMTg0NlwiXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRleHBlY3QoQ29tbW9uVXRpbHMubm9ybWFsaXplU2VhcmNoVGVybSh0ZXN0LmlucHV0IGFzIHN0cmluZykpLnRvQmUodGVzdC5leHBlY3RlZCk7XG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cdFx0fSk7XG5cdH0pO1xuXHRkZXNjcmliZShcIlVuaXQgVGVzdCBmb3IgaXNTdGlja3lFZGl0TW9kZVwiLCBmdW5jdGlvbigpIHtcblx0XHR0ZXN0KFwiVW5pdCB0ZXN0IHRvIGNoZWNrIGlzU3RpY2t5RWRpdE1vZGVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcIm9Db250cm9sXCI6IHtcblx0XHRcdFx0XHRcdGdldE1vZGVsOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRnZXRNZXRhTW9kZWw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Z2V0T2JqZWN0OiBmdW5jdGlvbihzUGFyYW06IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBzUGFyYW0gPT09IFwiL1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInJvb3RFbnRpdHlTZXRcIjogeyAka2luZDogXCJFbnRpdHlTZXRcIiB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFwiOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIH07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRnZXRQcm9wZXJ0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcImV4cGVjdGVkVmFsdWVcIjogdHJ1ZSxcblx0XHRcdFx0XHRcInNNZXNzYWdlXCI6IFwiTWF0Y2hlZFwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcIm9Db250cm9sXCI6IHtcblx0XHRcdFx0XHRcdGdldE1vZGVsOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRnZXRNZXRhTW9kZWw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Z2V0T2JqZWN0OiBmdW5jdGlvbihzUGFyYW06IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBzUGFyYW0gPT09IFwiL1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInJvb3RFbnRpdHlTZXRcIjogeyAka2luZDogXCJFbnRpdHlTZXRcIiB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogbnVsbDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdGdldFByb3BlcnR5OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFwiZXhwZWN0ZWRWYWx1ZVwiOiBmYWxzZSxcblx0XHRcdFx0XHRcInNNZXNzYWdlXCI6IFwiTWF0Y2hlZFwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcIm9Db250cm9sXCI6IHtcblx0XHRcdFx0XHRcdGdldE1vZGVsOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRnZXRNZXRhTW9kZWw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Z2V0T2JqZWN0OiBmdW5jdGlvbihzUGFyYW06IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBzUGFyYW0gPT09IFwiL1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInJvb3RFbnRpdHlTZXRcIjogeyAka2luZDogXCJFbnRpdHlTZXRcIiB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFwiOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIH07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRnZXRQcm9wZXJ0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XCJleHBlY3RlZFZhbHVlXCI6IGZhbHNlLFxuXHRcdFx0XHRcdFwic01lc3NhZ2VcIjogXCJNYXRjaGVkXCJcblx0XHRcdFx0fVxuXHRcdFx0XS5mb3JFYWNoKGZ1bmN0aW9uKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0XHRcdGNvbnN0IGFjdHVhbFZhbHVlID0gQ29tbW9uVXRpbHMuaXNTdGlja3lFZGl0TW9kZShvUHJvcGVydHkub0NvbnRyb2wpO1xuXHRcdFx0XHRleHBlY3QoYWN0dWFsVmFsdWUpLnRvRXF1YWwob1Byb3BlcnR5LmV4cGVjdGVkVmFsdWUpOyAvLywgXCJVbml0IHRlc3QgdG8gY2hlY2sgaXNTdGlja3lFZGl0TW9kZSgpIFwiICsgb1Byb3BlcnR5LnNNZXNzYWdlICsgXCIgOiBva1wiKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcIlVuaXQgVGVzdCBmb3IgaXNGaWVsZENvbnRyb2xQYXRoSW5hcHBsaWNhYmxlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdHRlc3QoXCJVbml0IHRlc3QgdG8gY2hlY2sgaXNGaWVsZENvbnRyb2xQYXRoSW5hcHBsaWNhYmxlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0W1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJhdHRyaWJ1dGVcIjoge1xuXHRcdFx0XHRcdFx0XCJwcm9wMVwiOiBcIkFcIixcblx0XHRcdFx0XHRcdFwicHJvcDJcIjogXCJCXCIsXG5cdFx0XHRcdFx0XHRcImZpZWxkQ29udHJvbFwiOiAwXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcImZpZWxkQ29udHJvbFBhdGhcIjogXCJmaWVsZENvbnRyb2xcIixcblx0XHRcdFx0XHRcImV4cGVjdGVkVmFsdWVcIjogdHJ1ZSxcblx0XHRcdFx0XHRcIm1lc3NhZ2VcIjogXCJmb3IgaW5hcHBsaWNhYmxlXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwiYXR0cmlidXRlXCI6IHtcblx0XHRcdFx0XHRcdFwicHJvcDFcIjogXCJBXCIsXG5cdFx0XHRcdFx0XHRcInByb3AyXCI6IFwiQlwiLFxuXHRcdFx0XHRcdFx0XCJmaWVsZENvbnRyb2xcIjogN1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XCJmaWVsZENvbnRyb2xQYXRoXCI6IFwiZmllbGRDb250cm9sXCIsXG5cdFx0XHRcdFx0XCJleHBlY3RlZFZhbHVlXCI6IGZhbHNlLFxuXHRcdFx0XHRcdFwibWVzc2FnZVwiOiBcImZvciBkaWZmZXJlbnQgdmFsdWVcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJhdHRyaWJ1dGVcIjoge1xuXHRcdFx0XHRcdFx0XCJwcm9wMVwiOiBcIkFcIixcblx0XHRcdFx0XHRcdFwicHJvcDJcIjogXCJCXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFwiZmllbGRDb250cm9sUGF0aFwiOiBcImZpZWxkQ29udHJvbFwiLFxuXHRcdFx0XHRcdFwiZXhwZWN0ZWRWYWx1ZVwiOiBmYWxzZSxcblx0XHRcdFx0XHRcIm1lc3NhZ2VcIjogXCJ3aGVuIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3RzXCJcblx0XHRcdFx0fVxuXHRcdFx0XS5mb3JFYWNoKGZ1bmN0aW9uKG9Qcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBhY3R1YWxWYWx1ZSA9IENvbW1vblV0aWxzLmlzRmllbGRDb250cm9sUGF0aEluYXBwbGljYWJsZShvUHJvcGVydHkuZmllbGRDb250cm9sUGF0aCwgb1Byb3BlcnR5LmF0dHJpYnV0ZSk7XG5cdFx0XHRcdGV4cGVjdChhY3R1YWxWYWx1ZSkudG9FcXVhbChvUHJvcGVydHkuZXhwZWN0ZWRWYWx1ZSk7IC8vICxcIlVuaXQgdGVzdCB0byBjaGVjayBpc0ZpZWxkQ29udHJvbFBhdGhJbmFwcGxpY2FibGUoKSBcIiArIG9Qcm9wZXJ0eS5tZXNzYWdlICsgXCIgOiBva1wiXG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fSk7XG5cblx0ZGVzY3JpYmUoXCJVbml0IFRlc3QgZm9yIFJlbW92ZSBTZW5zaXRpdmUgRGF0YVwiLCBmdW5jdGlvbigpIHtcblx0XHR0ZXN0KFwiVW5pdCBUZXN0IHRvIGNoZWNrIHJlbW92ZVNlbnNpdGl2ZURhdGFcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRjb25zdCBhQXR0cmlidXRlcyA9IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcImNvbnRleHREYXRhXCI6IHtcblx0XHRcdFx0XHRcdFx0XCIlNDBvZGF0YS5jb250ZXh0XCI6IFwieW9sb1wiLFxuXHRcdFx0XHRcdFx0XHRcIlNlbnNpdGl2ZVByb3BcIjogXCJBXCIsXG5cdFx0XHRcdFx0XHRcdFwiUHVibGljYXRpb25VVUlEXCI6IFwiMDA1MDU2OTEtODE3NS0xZWQ4LTlkYmUtNjRjMTQyNjgzMjZiXCIsXG5cdFx0XHRcdFx0XHRcdFwiRmllbGRDb250cm9sU3RhdGljXCI6IFwiRFwiLFxuXHRcdFx0XHRcdFx0XHRcImZpZWxkQ29udHJvbFwiOiAwXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XCJlbnRpdHlTZXRcIjogXCJTYWxlc09yZGVyTWFuYWdlXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFwiY29udGV4dERhdGFcIjoge1xuXHRcdFx0XHRcdFx0XHRcIiU0MG9kYXRhLm1ldGFkYXRhRXRhZ1wiOiBcInlvbG9cIixcblx0XHRcdFx0XHRcdFx0XCJFeGNsdWRlTmF2UHJvcFwiOiBcIkJcIixcblx0XHRcdFx0XHRcdFx0XCJQdWJsaWNhdGlvblVVSURcIjogXCIwMDUwNTY5MS04MTc1LTFlZDgtOWRiZS02NGMxNDI2ODMyNjg4OFwiLFxuXHRcdFx0XHRcdFx0XHRcImZpZWxkQ29udHJvbFwiOiA3XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XCJlbnRpdHlTZXRcIjogXCJTYWxlc09yZGVyTWFuYWdlXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFwiY29udGV4dERhdGFcIjoge1xuXHRcdFx0XHRcdFx0XHRcIkhhc0FjdGl2ZUVudGl0eVwiOiBmYWxzZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFwiZW50aXR5U2V0XCI6IFwiU2FsZXNPcmRlck1hbmFnZVwiXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRdLFxuXHRcdFx0XHRvTWV0YU1vZGVsID0ge1xuXHRcdFx0XHRcdGdldE9iamVjdDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0aWYgKHNQYXRoLmluZGV4T2YoXCJQdWJsaWNhdGlvblVVSURAXCIpID4gLTEpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwiJFBhdGhcIjogXCJmaWVsZENvbnRyb2xcIlxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoc1BhdGguaW5kZXhPZihcIkZpZWxkQ29udHJvbFN0YXRpY0BcIikgPiAtMSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XCIkRW51bU1lbWJlclwiOiBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sL0luYXBwbGljYWJsZVwiXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChzUGF0aC5pbmRleE9mKFwiU2Vuc2l0aXZlUHJvcEBcIikgPiAtMSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwiJFBhdGhcIjogXCJmaWVsZENvbnRyb2xcIlxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoc1BhdGguaW5kZXhPZihcIkV4Y2x1ZGVOYXZQcm9wQFwiKSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dFwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcIiRQYXRoXCI6IFwiZmllbGRDb250cm9sXCJcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRFeHBlY3RlZFJlc3VsdCA9IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcImZpZWxkQ29udHJvbFwiOiAwXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcIlB1YmxpY2F0aW9uVVVJRFwiOiBcIjAwNTA1NjkxLTgxNzUtMWVkOC05ZGJlLTY0YzE0MjY4MzI2ODg4XCIsXG5cdFx0XHRcdFx0XHRcImZpZWxkQ29udHJvbFwiOiA3XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcIkhhc0FjdGl2ZUVudGl0eVwiOiBmYWxzZVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XTtcblx0XHRcdGNvbnN0IFJlc3VsdCA9IENvbW1vblV0aWxzLnJlbW92ZVNlbnNpdGl2ZURhdGEoYUF0dHJpYnV0ZXMsIG9NZXRhTW9kZWwgYXMgYW55KTtcblx0XHRcdGV4cGVjdChKU09OLnN0cmluZ2lmeShFeHBlY3RlZFJlc3VsdCkpLnRvRXF1YWwoSlNPTi5zdHJpbmdpZnkoUmVzdWx0KSk7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdGRlc2NyaWJlKFwiVW5pdCBUZXN0IGZvciBpc1Byb3BlcnR5RmlsdGVyYWJsZVwiLCBmdW5jdGlvbigpIHtcblx0XHR0ZXN0KFwiVW5pdCB0ZXN0IHRvIGNoZWNrIGlzUHJvcGVydHlGaWx0ZXJhYmxlIHdpdGggaGlkZGVuXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29uc3QgZm5DcmVhdGVNb2RlbCA9IGZ1bmN0aW9uKG9Nb2RlbDogYW55KSB7XG5cdFx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNyZWF0ZUJpbmRpbmdDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRnZXRQcm9wZXJ0eTogb01vZGVsLmdldE9iamVjdFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldFByb3BlcnR5OiBmdW5jdGlvbihzUGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBzUGF0aCA9PT0gXCIvcGFyYW1ldGVyRW50aXR5L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVzdWx0Q29udGV4dFwiO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldE9iamVjdDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gc1BhdGggPT09IFwiL3BhcmFtZXRlckVudGl0eS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlc3VsdENvbnRleHRcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9Nb2RlbFxuXHRcdFx0XHQpO1xuXHRcdFx0fTtcblxuXHRcdFx0W1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bW9kZWw6IHtcblx0XHRcdFx0XHRcdGdldE9iamVjdDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRpZiAoc1BhdGggPT09IFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhpZGRlblwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgXCJwcm9wMVwiOiB7fSB9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZW50aXR5U2V0UGF0aDogXCIvZW50aXR5U2V0XCIsXG5cdFx0XHRcdFx0cHJvcGVydHk6IFwicHJvcDFcIixcblx0XHRcdFx0XHRza2lwSGlkZGVuRmlsdGVyOiBmYWxzZSxcblx0XHRcdFx0XHRleHBlY3RlZFZhbHVlOiBmYWxzZSxcblx0XHRcdFx0XHRtZXNzYWdlOiBcImZ1bGwgcGF0aCBhbmQgaGlkZGVuXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG1vZGVsOiB7XG5cdFx0XHRcdFx0XHRnZXRPYmplY3Q6IGZ1bmN0aW9uKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHNQYXRoID09PSBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5GaWx0ZXJcIikge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7IFwicHJvcDFcIjoge30gfTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGVudGl0eVNldFBhdGg6IFwiL2VudGl0eVNldFwiLFxuXHRcdFx0XHRcdHByb3BlcnR5OiBcInByb3AxXCIsXG5cdFx0XHRcdFx0c2tpcEhpZGRlbkZpbHRlcjogZmFsc2UsXG5cdFx0XHRcdFx0ZXhwZWN0ZWRWYWx1ZTogZmFsc2UsXG5cdFx0XHRcdFx0bWVzc2FnZTogXCJmdWxsIHBhdGggYW5kIGhpZGRlbiBmaWx0ZXJcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bW9kZWw6IHtcblx0XHRcdFx0XHRcdGdldE9iamVjdDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRpZiAoc1BhdGggPT09IFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhpZGRlblwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgXCJwcm9wMVwiOiB7fSB9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZW50aXR5U2V0UGF0aDogXCIvZW50aXR5U2V0XCIsXG5cdFx0XHRcdFx0cHJvcGVydHk6IFwicHJvcDFcIixcblx0XHRcdFx0XHRza2lwSGlkZGVuRmlsdGVyOiBmYWxzZSxcblx0XHRcdFx0XHRleHBlY3RlZFZhbHVlOiBmYWxzZSxcblx0XHRcdFx0XHRtZXNzYWdlOiBcImhpZGRlblwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRtb2RlbDoge1xuXHRcdFx0XHRcdFx0Z2V0T2JqZWN0OiBmdW5jdGlvbihzUGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChzUGF0aCA9PT0gXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuRmlsdGVyXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4geyBcInByb3AxXCI6IHt9IH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRlbnRpdHlTZXRQYXRoOiBcIi9lbnRpdHlTZXRcIixcblx0XHRcdFx0XHRwcm9wZXJ0eTogXCJwcm9wMVwiLFxuXHRcdFx0XHRcdHNraXBIaWRkZW5GaWx0ZXI6IGZhbHNlLFxuXHRcdFx0XHRcdGV4cGVjdGVkVmFsdWU6IGZhbHNlLFxuXHRcdFx0XHRcdG1lc3NhZ2U6IFwiaGlkZGVuIGZpbHRlclwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRtb2RlbDoge1xuXHRcdFx0XHRcdFx0Z2V0T2JqZWN0OiBmdW5jdGlvbihzUGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChzUGF0aCA9PT0gXCIvZW50aXR5U2V0QE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRmlsdGVyUmVzdHJpY3Rpb25zXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0Tm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCRQcm9wZXJ0eVBhdGg6IFwicHJvcDFcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4geyBcInByb3AxXCI6IHt9IH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRlbnRpdHlTZXRQYXRoOiBcIi9lbnRpdHlTZXRcIixcblx0XHRcdFx0XHRwcm9wZXJ0eTogXCJwcm9wMVwiLFxuXHRcdFx0XHRcdHNraXBIaWRkZW5GaWx0ZXI6IGZhbHNlLFxuXHRcdFx0XHRcdGV4cGVjdGVkVmFsdWU6IGZhbHNlLFxuXHRcdFx0XHRcdG1lc3NhZ2U6IFwibm9uLWZpbHRlcmFibGVcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bW9kZWw6IHtcblx0XHRcdFx0XHRcdGdldE9iamVjdDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRpZiAoc1BhdGggPT09IFwiL2VudGl0eVNldEBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkZpbHRlclJlc3RyaWN0aW9uc1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdE5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkUHJvcGVydHlQYXRoOiBcInByb3AxXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgXCJwcm9wMVwiOiB7fSB9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZW50aXR5U2V0UGF0aDogXCIvZW50aXR5U2V0XCIsXG5cdFx0XHRcdFx0cHJvcGVydHk6IFwicHJvcDFcIixcblx0XHRcdFx0XHRza2lwSGlkZGVuRmlsdGVyOiBmYWxzZSxcblx0XHRcdFx0XHRleHBlY3RlZFZhbHVlOiBmYWxzZSxcblx0XHRcdFx0XHRtZXNzYWdlOiBcImZ1bGwgcGF0aCBhbmQgbm9uLWZpbHRlcmFibGVcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bW9kZWw6IHtcblx0XHRcdFx0XHRcdGdldE9iamVjdDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRpZiAoIXNQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHN3aXRjaCAoc1BhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiL2VudGl0eVNldC9wcm9wMUBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5GaWx0ZXJcIjpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIkVHlwZVwiOlxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiRWRtLlN0cmluZ1wiO1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIka2luZFwiOlxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiUHJvcGVydHlcIjtcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiL2VudGl0eVNldC9cIjpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7IFwicHJvcDFcIjoge30gfTtcblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZW50aXR5U2V0UGF0aDogXCIvZW50aXR5U2V0XCIsXG5cdFx0XHRcdFx0cHJvcGVydHk6IFwicHJvcDFcIixcblx0XHRcdFx0XHRza2lwSGlkZGVuRmlsdGVyOiB0cnVlLFxuXHRcdFx0XHRcdGV4cGVjdGVkVmFsdWU6IHRydWUsXG5cdFx0XHRcdFx0bWVzc2FnZTogXCJza2lwIGhpZGRlbiBmaWx0ZXJcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bW9kZWw6IHtcblx0XHRcdFx0XHRcdGdldE9iamVjdDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRpZiAoIXNQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHN3aXRjaCAoc1BhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiJFR5cGVcIjpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBcIkVkbS5TdHJlYW1cIjtcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiJGtpbmRcIjpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBcIlByb3BlcnR5XCI7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIi9lbnRpdHlTZXQvXCI6XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4geyBcInByb3AxXCI6IHt9IH07XG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGVudGl0eVNldFBhdGg6IFwiL2VudGl0eVNldFwiLFxuXHRcdFx0XHRcdHByb3BlcnR5OiBcInByb3AxXCIsXG5cdFx0XHRcdFx0c2tpcEhpZGRlbkZpbHRlcjogZmFsc2UsXG5cdFx0XHRcdFx0ZXhwZWN0ZWRWYWx1ZTogZmFsc2UsXG5cdFx0XHRcdFx0bWVzc2FnZTogXCJ0eXBlIG5vdCBmaWx0ZXJhYmxlXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG1vZGVsOiB7XG5cdFx0XHRcdFx0XHRnZXRPYmplY3Q6IGZ1bmN0aW9uKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0aWYgKCFzUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7fTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHNQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIiRUeXBlXCI6XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJFZG0uU3RyaW5nXCI7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIiRraW5kXCI6XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJQcm9wZXJ0eVwiO1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIvZW50aXR5U2V0L1wiOlxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgXCJwcm9wMVwiOiB7fSB9O1xuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRlbnRpdHlTZXRQYXRoOiBcIi9lbnRpdHlTZXRcIixcblx0XHRcdFx0XHRwcm9wZXJ0eTogXCJwcm9wMVwiLFxuXHRcdFx0XHRcdHNraXBIaWRkZW5GaWx0ZXI6IGZhbHNlLFxuXHRcdFx0XHRcdGV4cGVjdGVkVmFsdWU6IHRydWUsXG5cdFx0XHRcdFx0bWVzc2FnZTogXCJ0eXBlIGZpbHRlcmFibGVcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bW9kZWw6IHtcblx0XHRcdFx0XHRcdGdldE9iamVjdDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRpZiAoIXNQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHN3aXRjaCAoc1BhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiJFR5cGVcIjpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFwiO1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJWYWx1ZS8kUGF0aC8kVHlwZVwiOlxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiRWRtLlN0cmVhbVwiO1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIvZW50aXR5U2V0L1wiOlxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgXCJwcm9wMVwiOiB7fSB9O1xuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRlbnRpdHlTZXRQYXRoOiBcIi9lbnRpdHlTZXRcIixcblx0XHRcdFx0XHRwcm9wZXJ0eTogXCJwcm9wMVwiLFxuXHRcdFx0XHRcdHNraXBIaWRkZW5GaWx0ZXI6IGZhbHNlLFxuXHRcdFx0XHRcdGV4cGVjdGVkVmFsdWU6IGZhbHNlLFxuXHRcdFx0XHRcdG1lc3NhZ2U6IFwiZGF0YWZpZWxkIHR5cGUgbm90IGZpbHRlcmFibGVcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bW9kZWw6IHtcblx0XHRcdFx0XHRcdGdldE9iamVjdDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRpZiAoIXNQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHN3aXRjaCAoc1BhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiJFR5cGVcIjpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFwiO1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJWYWx1ZS8kUGF0aC8kVHlwZVwiOlxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiRWRtLlN0cmluZ1wiO1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIvZW50aXR5U2V0L1wiOlxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgXCJwcm9wMVwiOiB7fSB9O1xuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRlbnRpdHlTZXRQYXRoOiBcIi9lbnRpdHlTZXRcIixcblx0XHRcdFx0XHRwcm9wZXJ0eTogXCJwcm9wMVwiLFxuXHRcdFx0XHRcdHNraXBIaWRkZW5GaWx0ZXI6IGZhbHNlLFxuXHRcdFx0XHRcdGV4cGVjdGVkVmFsdWU6IHRydWUsXG5cdFx0XHRcdFx0bWVzc2FnZTogXCJkYXRhZmllbGQgdHlwZSBmaWx0ZXJhYmxlXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG1vZGVsOiB7fSxcblx0XHRcdFx0XHRlbnRpdHlTZXRQYXRoOiBcIi9wYXJhbWV0ZXJFbnRpdHlcIixcblx0XHRcdFx0XHRwcm9wZXJ0eTogXCJwcm9wMVwiLFxuXHRcdFx0XHRcdHNraXBIaWRkZW5GaWx0ZXI6IGZhbHNlLFxuXHRcdFx0XHRcdGV4cGVjdGVkVmFsdWU6IHRydWUsXG5cdFx0XHRcdFx0bWVzc2FnZTogXCJwYXJhbWV0ZXJcIlxuXHRcdFx0XHR9XG5cdFx0XHRdLmZvckVhY2goZnVuY3Rpb24ob1Byb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IGFjdHVhbFZhbHVlID0gQ29tbW9uVXRpbHMuaXNQcm9wZXJ0eUZpbHRlcmFibGUoXG5cdFx0XHRcdFx0Zm5DcmVhdGVNb2RlbChvUHJvcGVydHkubW9kZWwpLFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5lbnRpdHlTZXRQYXRoLFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5wcm9wZXJ0eSxcblx0XHRcdFx0XHRvUHJvcGVydHkuc2tpcEhpZGRlbkZpbHRlclxuXHRcdFx0XHQpO1xuXHRcdFx0XHRleHBlY3QoYWN0dWFsVmFsdWUpLnRvRXF1YWwob1Byb3BlcnR5LmV4cGVjdGVkVmFsdWUpOyAvLyAsXCJVbml0IHRlc3QgdG8gY2hlY2sgaXNQcm9wZXJ0eUZpbHRlcmFibGUgd2l0aCBcIiArIG9Qcm9wZXJ0eS5tZXNzYWdlICsgXCIgOiBva1wiXG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fSk7XG5cblx0ZGVzY3JpYmUoXCJUZXN0IENvbW1vblV0aWxzIDogYWRkU2VsZWN0aW9uVmFyaWFudFRvQ29uZGl0aW9uc1wiLCBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB0aGF0OiBhbnkgPSB7fTtcblx0XHRiZWZvcmVFYWNoKCgpID0+IHtcblx0XHRcdC8vQ1JFQVRFIE1PQ0tcblx0XHRcdHRoYXQuZ2V0VmFsdWVTdHViID0gamVzdC5zcHlPbihGaWx0ZXJIZWxwZXIsIFwiZ2V0VHlwZUNvbXBsaWFudFZhbHVlXCIpLm1vY2tJbXBsZW1lbnRhdGlvbihmdW5jdGlvbiBmYWtlRm4ob1ZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiBvVmFsdWU7XG5cdFx0XHR9KTtcblx0XHRcdHRoYXQuZ2V0T3BlcmF0b3JTdHViID0gamVzdC5zcHlPbihDb21tb25VdGlscywgXCJnZXRPcGVyYXRvcnNGb3JQcm9wZXJ0eVwiKS5tb2NrSW1wbGVtZW50YXRpb24oZnVuY3Rpb24gZmFrZUZuKCkge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGF0LmdldFZhbGlkUHJvcHNTdHViID0gamVzdC5zcHlPbihDb21tb25VdGlscywgXCJnZXRDb250ZXh0UGF0aFByb3BlcnRpZXNcIikubW9ja0ltcGxlbWVudGF0aW9uKGZ1bmN0aW9uIGZha2VGbihvVmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIHRoYXQudmFsaWRQcm9wZXJ0aWVzO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGF0LmdldEZpbHRlcmFibGVTdHViID0gamVzdC5zcHlPbihDb21tb25VdGlscywgXCJpc1Byb3BlcnR5RmlsdGVyYWJsZVwiKS5tb2NrSW1wbGVtZW50YXRpb24oZnVuY3Rpb24gZmFrZUZuKG9WYWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0pO1xuXHRcdFx0dGhhdC5nZXRQYXJhbWV0ZXJJbmZvU3R1YiA9IGplc3Quc3B5T24oQ29tbW9uVXRpbHMsIFwiZ2V0UGFyYW1ldGVySW5mb1wiKS5tb2NrSW1wbGVtZW50YXRpb24oZnVuY3Rpb24gZmFrZUZuKG9WYWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhhdC5wYXJhbWV0ZXJJbmZvO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdFx0YWZ0ZXJFYWNoKCgpID0+IHtcblx0XHRcdC8vUkVTVE9SRVxuXHRcdFx0dGhhdC5nZXRWYWx1ZVN0dWIubW9ja1Jlc3RvcmUoKTtcblx0XHRcdHRoYXQuZ2V0T3BlcmF0b3JTdHViLm1vY2tSZXN0b3JlKCk7XG5cdFx0XHR0aGF0LmdldFZhbGlkUHJvcHNTdHViLm1vY2tSZXN0b3JlKCk7XG5cdFx0XHR0aGF0LmdldEZpbHRlcmFibGVTdHViLm1vY2tSZXN0b3JlKCk7XG5cdFx0XHR0aGF0LmdldFBhcmFtZXRlckluZm9TdHViLm1vY2tSZXN0b3JlKCk7XG5cdFx0fSk7XG5cblx0XHR0ZXN0KFwiVGVzdCBjb252ZXJ0aW9uIG9mIFNlbGVjdGlvbiBWYXJpYW50IHRvIGNvbmRpdGlvbnMgd2l0aG91dCB2YWxpZCBwcm9wZXJ0aWVzLlwiLCBmdW5jdGlvbigpIHtcblx0XHRcdGNvbnN0IG9TViA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdG9Db25kaXRpb25zID0ge307XG5cblx0XHRcdG9TVi5hZGRTZWxlY3RPcHRpb24oXCJhdHRyaWJ1dGUxXCIsIFwiSVwiLCBcIkVRXCIsIFwidmFsdWUxXCIpO1xuXHRcdFx0dGhhdC52YWxpZFByb3BlcnRpZXMgPSB7fTtcblx0XHRcdHRoYXQucGFyYW1ldGVySW5mbyA9IHt9O1xuXHRcdFx0Q29tbW9uVXRpbHMuYWRkU2VsZWN0aW9uVmFyaWFudFRvQ29uZGl0aW9ucyhvU1YsIG9Db25kaXRpb25zLCB7fSBhcyBhbnksIFwiXCIpO1xuXG5cdFx0XHQvL0NIRUNLXG5cdFx0XHRleHBlY3QoT2JqZWN0LmtleXMob0NvbmRpdGlvbnMpLmxlbmd0aCkudG9FcXVhbCgwKTsgLy8sIFwiQ29tbW9uVXRpbHM6IE5vIGNvbmRpdGlvbnMgYXJlIGFkZGVkIHdpdGhvdXQgYW55IHZhbGlkIHByb3BlcnRpZXMuXCIpO1xuXHRcdH0pO1xuXG5cdFx0dGVzdChcIlRlc3QgY29udmVyc2lvbiBvZiBTZWxlY3Rpb24gVmFyaWFudCB0byBjb25kaXRpb25zIHdpdGggZW1wdHkgU1YuXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29uc3Qgb1NWID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKSxcblx0XHRcdFx0b0NvbmRpdGlvbnMgPSB7fTtcblxuXHRcdFx0dGhhdC52YWxpZFByb3BlcnRpZXMgPSB7XG5cdFx0XHRcdFwiYXR0cmlidXRlMVwiOiB7XG5cdFx0XHRcdFx0JFR5cGU6IFwiRWRtLkJvb2xlYW5cIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHRcImF0dHJpYnV0ZTJcIjoge1xuXHRcdFx0XHRcdCRUeXBlOiBcIkVkbS5TdHJpbmdcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0dGhhdC5wYXJhbWV0ZXJJbmZvID0ge307XG5cblx0XHRcdENvbW1vblV0aWxzLmFkZFNlbGVjdGlvblZhcmlhbnRUb0NvbmRpdGlvbnMob1NWLCBvQ29uZGl0aW9ucywge30gYXMgYW55LCBcIlwiKTtcblxuXHRcdFx0Ly9DSEVDS1xuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKG9Db25kaXRpb25zKS5sZW5ndGgpLnRvRXF1YWwoMCk7IC8vIFwiQ29tbW9uVXRpbHM6IE5vIGNvbmRpdGlvbnMgYXJlIGFkZGVkIHdpdGggZW1wdHkgU1YuXCIpO1xuXHRcdH0pO1xuXG5cdFx0dGVzdChcIlRlc3QgY29udmVyc2lvbiBvZiBTZWxlY3Rpb24gVmFyaWFudCB0byBjb25kaXRpb25zLlwiLCBmdW5jdGlvbigpIHtcblx0XHRcdGxldCBvU1YgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHRcdFx0Y29uc3Qgb0NvbmRpdGlvbnM6IGFueSA9IHt9O1xuXHRcdFx0bGV0IGlDb3VudCA9IDA7XG5cblx0XHRcdHRoYXQudmFsaWRQcm9wZXJ0aWVzID0ge1xuXHRcdFx0XHRcImF0dHJpYnV0ZTFcIjoge1xuXHRcdFx0XHRcdCRUeXBlOiBcIkVkbS5Cb29sZWFuXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJhdHRyaWJ1dGUyXCI6IHtcblx0XHRcdFx0XHQkVHlwZTogXCJFZG0uU3RyaW5nXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJNYXRlcmlhbFwiOiB7XG5cdFx0XHRcdFx0JFR5cGU6IFwiRWRtLlN0cmluZ1wiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwiTWF0ZXJpYWxDYXRlZ29yeVwiOiB7XG5cdFx0XHRcdFx0JFR5cGU6IFwiRWRtLlN0cmluZ1wiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwiSXRlbU51bWJlclwiOiB7XG5cdFx0XHRcdFx0JFR5cGU6IFwiRWRtLlN0cmluZ1wiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwiQ2l0eU5hbWVcIjoge1xuXHRcdFx0XHRcdCRUeXBlOiBcIkVkbS5TdHJpbmdcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0dGhhdC5wYXJhbWV0ZXJJbmZvID0ge307XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0ge1xuXHRcdFx0XHRnZXRPYmplY3Q6IGZ1bmN0aW9uKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRpZiAoc1BhdGguaW5jbHVkZXMoXCJfSXRlbVwiKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHsgc1BhdGg6IHNQYXRoLCAkaXNDb2xsZWN0aW9uOiB0cnVlLCAkVHlwZTogXCJFZG0uU3RyaW5nXCIgfTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHsgc1BhdGg6IHNQYXRoLCAkVHlwZTogXCJFZG0uU3RyaW5nXCIgfTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0XHRvU1YuYWRkU2VsZWN0T3B0aW9uKFwiYXR0cmlidXRlMVwiLCBcIklcIiwgXCJFUVwiLCBcInRydWVcIik7XG5cdFx0XHRvU1YuYWRkU2VsZWN0T3B0aW9uKFwiYXR0cmlidXRlMlwiLCBcIklcIiwgXCJFUVwiLCBcInZhbHVlMVwiKTtcblx0XHRcdG9TVi5hZGRTZWxlY3RPcHRpb24oXCJhdHRyaWJ1dGUyXCIsIFwiSVwiLCBcIkVRXCIsIFwidmFsdWUyXCIpO1xuXHRcdFx0b1NWLmFkZFNlbGVjdE9wdGlvbihcIlNhbGVzT3JkZXJNYW5hZ2UuX0l0ZW0uTWF0ZXJpYWxcIiwgXCJJXCIsIFwiRVFcIiwgXCJWTkcwMVwiKTtcblx0XHRcdG9TVi5hZGRTZWxlY3RPcHRpb24oXCJfTWF0ZXJpYWxEZXRhaWxzLk1hdGVyaWFsQ2F0ZWdvcnlcIiwgXCJJXCIsIFwiRVFcIiwgXCJBXCIpO1xuXHRcdFx0b1NWLmFkZFNlbGVjdE9wdGlvbihcIkl0ZW1EZXRhaWxzLkl0ZW1OdW1iZXJcIiwgXCJJXCIsIFwiRVFcIiwgXCIxMFwiKTtcblxuXHRcdFx0Q29tbW9uVXRpbHMuYWRkU2VsZWN0aW9uVmFyaWFudFRvQ29uZGl0aW9ucyhvU1YsIG9Db25kaXRpb25zLCBvTWV0YU1vZGVsLCBcIi9TYWxlc09yZGVyTWFuYWdlXCIpO1xuXHRcdFx0b1NWID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0XHRcdG9TVi5hZGRTZWxlY3RPcHRpb24oXCJDdXN0b21lci5TZXQuQ2l0eU5hbWVcIiwgXCJJXCIsIFwiRVFcIiwgXCJBQkNcIik7XG5cdFx0XHRDb21tb25VdGlscy5hZGRTZWxlY3Rpb25WYXJpYW50VG9Db25kaXRpb25zKG9TViwgb0NvbmRpdGlvbnMsIG9NZXRhTW9kZWwsIFwiL0N1c3RvbWVyL1NldFwiKTtcblxuXHRcdFx0Y29uc3QgYVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhvQ29uZGl0aW9ucyk7XG5cdFx0XHRhUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKHNQcm9wZXJ0eU5hbWUpIHtcblx0XHRcdFx0aUNvdW50ICs9IG9Db25kaXRpb25zW3NQcm9wZXJ0eU5hbWVdLmxlbmd0aDtcblx0XHRcdH0pO1xuXG5cdFx0XHQvL0NIRUNLXG5cdFx0XHRleHBlY3QoYVByb3BlcnRpZXMubGVuZ3RoKS50b0VxdWFsKDYpOyAvLyBcIkNvbW1vblV0aWxzOiBDb3JyZWN0IG5vLiBvZiBwcm9wZXJ0eVBhdGggYXJlIGFkZGVkIGZyb20gU1YuXCIpO1xuXHRcdFx0ZXhwZWN0KGlDb3VudCkudG9FcXVhbCg3KTsgLy8gXCJDb21tb25VdGlsczogQ29ycmVjdCBuby4gb2YgY29uZGl0aW9ucyBhcmUgYWRkZWQgZnJvbSBTVi5cIik7XG5cdFx0XHRleHBlY3Qob0NvbmRpdGlvbnNbXCJTYWxlc09yZGVyTWFuYWdlL19JdGVtKi9NYXRlcmlhbFwiXVswXS52YWx1ZXNbMF0pLnRvRXF1YWwoXCJWTkcwMVwiKTsgLy8sIFwiQ29uZGl0aW9ucyBmb3IgbmF2aWdhdGlvbiBwYXRoIGlzIGFkZGVkXCIpO1xuXHRcdFx0ZXhwZWN0KG9Db25kaXRpb25zW1wiX01hdGVyaWFsRGV0YWlscy9NYXRlcmlhbENhdGVnb3J5XCJdWzBdLnZhbHVlc1swXSkudG9FcXVhbChcIkFcIik7IC8vLCBcIkNvbmRpdGlvbnMgZm9yIG5hdmlnYXRpb24gcGF0aCBpcyBhZGRlZFwiKTtcblx0XHRcdGV4cGVjdChvQ29uZGl0aW9uc1tcIkl0ZW1EZXRhaWxzL0l0ZW1OdW1iZXJcIl1bMF0udmFsdWVzWzBdKS50b0VxdWFsKFwiMTBcIik7IC8vLCBcIkNvbmRpdGlvbnMgZm9yIG5hdmlnYXRpb24gcGF0aCBpcyBhZGRlZFwiKTtcblx0XHRcdGV4cGVjdChvQ29uZGl0aW9uc1tcIkN1c3RvbWVyL1NldC9DaXR5TmFtZVwiXVswXS52YWx1ZXNbMF0pLnRvRXF1YWwoXCJBQkNcIik7IC8vXCJDb25kaXRpb25zIGZvciBuYXZpZ2F0aW9uIHBhdGggaW4gY2FzZSBvZiBwYW1hdGVyaXplZCBzZXJ2aWNlIGlzIGFkZGVkXCJcblx0XHR9KTtcblxuXHRcdHRlc3QoXCJUZXN0IGNvbnZlcnNpb24gb2YgU2VsZWN0aW9uIFZhcmlhbnQgdG8gY29uZGl0aW9ucyB3aXRoIHBhcmFtZXRlcnMuXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29uc3Qgb1NWID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKSxcblx0XHRcdFx0b0NvbmRpdGlvbnM6IGFueSA9IHt9O1xuXHRcdFx0bGV0IGlDb3VudCA9IDA7XG5cblx0XHRcdHRoYXQudmFsaWRQcm9wZXJ0aWVzID0ge1xuXHRcdFx0XHRcImF0dHJpYnV0ZTFcIjoge1xuXHRcdFx0XHRcdCRUeXBlOiBcIkVkbS5TdHJpbmdcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0dGhhdC5wYXJhbWV0ZXJJbmZvID0ge1xuXHRcdFx0XHRjb250ZXh0UGF0aDogXCIvQ3VzdG9tZXIvU2V0XCIsXG5cdFx0XHRcdHBhcmFtZXRlclByb3BlcnRpZXM6IHtcblx0XHRcdFx0XHRcInBhcmFtMVwiOiB7XG5cdFx0XHRcdFx0XHQkVHlwZTogXCJFZG0uQm9vbGVhblwiXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcInBhcmFtMlwiOiB7XG5cdFx0XHRcdFx0XHQkVHlwZTogXCJFZG0uU3RyaW5nXCJcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdG9TVi5hZGRTZWxlY3RPcHRpb24oXCJhdHRyaWJ1dGUxXCIsIFwiSVwiLCBcIkVRXCIsIFwidmFsdWUxXCIpO1xuXHRcdFx0b1NWLmFkZFNlbGVjdE9wdGlvbihcIiRQYXJhbWV0ZXIucGFyYW0xXCIsIFwiSVwiLCBcIkVRXCIsIFwidHJ1ZVwiKTtcblx0XHRcdG9TVi5hZGRTZWxlY3RPcHRpb24oXCJQX3BhcmFtMlwiLCBcIklcIiwgXCJFUVwiLCBcInBhcmFtVmFsdWUxXCIpO1xuXG5cdFx0XHRDb21tb25VdGlscy5hZGRTZWxlY3Rpb25WYXJpYW50VG9Db25kaXRpb25zKG9TViwgb0NvbmRpdGlvbnMsIHt9IGFzIGFueSwgXCJcIik7XG5cblx0XHRcdGNvbnN0IGFQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMob0NvbmRpdGlvbnMpO1xuXHRcdFx0YVByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbihzUHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdGlDb3VudCArPSBvQ29uZGl0aW9uc1tzUHJvcGVydHlOYW1lXS5sZW5ndGg7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly9DSEVDS1xuXHRcdFx0ZXhwZWN0KGFQcm9wZXJ0aWVzLmxlbmd0aCkudG9FcXVhbCgzKTsgLy8sIFwiQ29tbW9uVXRpbHM6IENvcnJlY3Qgbm8uIG9mIHByb3BlcnR5UGF0aCBhcmUgYWRkZWQgZnJvbSBTVi5cIik7XG5cdFx0XHRleHBlY3QoaUNvdW50KS50b0VxdWFsKDMpOyAvLywgXCJDb21tb25VdGlsczogQ29ycmVjdCBuby4gb2YgY29uZGl0aW9ucyBhcmUgYWRkZWQgZnJvbSBTVi5cIik7XG5cdFx0fSk7XG5cblx0XHR0ZXN0KFwiVGVzdCBjb252ZXJzaW9uIG9mIFNlbGVjdGlvbiBWYXJpYW50IHRvIGNvbmRpdGlvbnMgd2l0aCBjb25mbGljdGluZyBwYXJhbWV0ZXJzLlwiLCBmdW5jdGlvbigpIHtcblx0XHRcdGNvbnN0IG9TViA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdG9Db25kaXRpb25zOiBhbnkgPSB7fTtcblx0XHRcdGxldCBpQ291bnQgPSAwO1xuXG5cdFx0XHR0aGF0LnZhbGlkUHJvcGVydGllcyA9IHtcblx0XHRcdFx0XCJhdHRyaWJ1dGUxXCI6IHtcblx0XHRcdFx0XHQkVHlwZTogXCJFZG0uU3RyaW5nXCJcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdHRoYXQucGFyYW1ldGVySW5mbyA9IHtcblx0XHRcdFx0Y29udGV4dFBhdGg6IFwiL0N1c3RvbWVyL1NldFwiLFxuXHRcdFx0XHRwYXJhbWV0ZXJQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdFx0XCJwYXJhbTFcIjoge1xuXHRcdFx0XHRcdFx0JFR5cGU6IFwiRWRtLkJvb2xlYW5cIlxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XCJwYXJhbTJcIjoge1xuXHRcdFx0XHRcdFx0JFR5cGU6IFwiRWRtLlN0cmluZ1wiXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRvU1YuYWRkU2VsZWN0T3B0aW9uKFwiYXR0cmlidXRlMVwiLCBcIklcIiwgXCJFUVwiLCBcInZhbHVlMVwiKTtcblx0XHRcdG9TVi5hZGRTZWxlY3RPcHRpb24oXCJQX3BhcmFtMVwiLCBcIklcIiwgXCJFUVwiLCBcImZhbHNlXCIpO1xuXHRcdFx0b1NWLmFkZFNlbGVjdE9wdGlvbihcIiRQYXJhbWV0ZXIucGFyYW0xXCIsIFwiSVwiLCBcIkVRXCIsIFwidHJ1ZVwiKTtcblx0XHRcdG9TVi5hZGRTZWxlY3RPcHRpb24oXCIkUGFyYW1ldGVyLnBhcmFtMlwiLCBcIklcIiwgXCJFUVwiLCBcInBhcmFtVmFsdWUyXyRcIik7XG5cdFx0XHRvU1YuYWRkU2VsZWN0T3B0aW9uKFwiUF9wYXJhbTJcIiwgXCJJXCIsIFwiRVFcIiwgXCJwYXJhbVZhbHVlMl9QXCIpO1xuXG5cdFx0XHRDb21tb25VdGlscy5hZGRTZWxlY3Rpb25WYXJpYW50VG9Db25kaXRpb25zKG9TViwgb0NvbmRpdGlvbnMsIHt9IGFzIGFueSwgXCJcIik7XG5cblx0XHRcdGNvbnN0IGFQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMob0NvbmRpdGlvbnMpO1xuXHRcdFx0YVByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbihzUHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdGlDb3VudCArPSBvQ29uZGl0aW9uc1tzUHJvcGVydHlOYW1lXS5sZW5ndGg7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgcGFyYW0xVmFsdWUgPSBvQ29uZGl0aW9uc1tcInBhcmFtMVwiXVswXS52YWx1ZXNbMF0gPT09IHRydWU7XG5cdFx0XHRjb25zdCBwYXJhbTJWYWx1ZSA9IG9Db25kaXRpb25zW1wicGFyYW0yXCJdWzBdLnZhbHVlc1swXSA9PT0gXCJwYXJhbVZhbHVlMl8kXCI7XG5cdFx0XHQvL0NIRUNLXG5cdFx0XHRleHBlY3QocGFyYW0xVmFsdWUgJiYgcGFyYW0yVmFsdWUpLnRvQmUodHJ1ZSk7IC8vLCBcIkNvbW1vblV0aWxzOiBDb3JyZWN0IHBhcmFtZXRlciB2YWx1ZXMgYXJlIGFkZGVkIGZyb20gU1YuXCIpO1xuXHRcdFx0ZXhwZWN0KGFQcm9wZXJ0aWVzLmxlbmd0aCkudG9FcXVhbCgzKTsgLy8gPT09IDMsIFwiQ29tbW9uVXRpbHM6IENvcnJlY3Qgbm8uIG9mIHByb3BlcnR5UGF0aCBhcmUgYWRkZWQgZnJvbSBTVi5cIik7XG5cdFx0XHRleHBlY3QoaUNvdW50KS50b0VxdWFsKDMpOyAvLyA9PT0gMywgXCJDb21tb25VdGlsczogQ29ycmVjdCBuby4gb2YgY29uZGl0aW9ucyBhcmUgYWRkZWQgZnJvbSBTVi5cIik7XG5cdFx0fSk7XG5cblx0XHR0ZXN0KFwiVGVzdCBjb252ZXJzaW9uIG9mIFNlbGVjdGlvbiBWYXJpYW50IHRvIGNvbmRpdGlvbnMgd2l0aCBwYXJhbWV0ZXJzIGNhc2Ugb2YgJ3BhcmFtIC0+IFBfcGFyYW0nLlwiLCBmdW5jdGlvbigpIHtcblx0XHRcdGNvbnN0IG9TViA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdG9Db25kaXRpb25zOiBhbnkgPSB7fTtcblx0XHRcdGxldCBpQ291bnQgPSAwO1xuXG5cdFx0XHR0aGF0LnZhbGlkUHJvcGVydGllcyA9IHtcblx0XHRcdFx0XCJhdHRyaWJ1dGUxXCI6IHtcblx0XHRcdFx0XHQkVHlwZTogXCJFZG0uU3RyaW5nXCJcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdHRoYXQucGFyYW1ldGVySW5mbyA9IHtcblx0XHRcdFx0Y29udGV4dFBhdGg6IFwiL0N1c3RvbWVyL1NldFwiLFxuXHRcdFx0XHRwYXJhbWV0ZXJQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdFx0XCJQX3BhcmFtMVwiOiB7XG5cdFx0XHRcdFx0XHQkVHlwZTogXCJFZG0uU3RyaW5nXCJcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdG9TVi5hZGRTZWxlY3RPcHRpb24oXCJhdHRyaWJ1dGUxXCIsIFwiSVwiLCBcIkVRXCIsIFwidmFsdWUxXCIpO1xuXHRcdFx0b1NWLmFkZFNlbGVjdE9wdGlvbihcInBhcmFtMVwiLCBcIklcIiwgXCJFUVwiLCBcInBhcmFtVmFsdWUxXCIpO1xuXG5cdFx0XHRDb21tb25VdGlscy5hZGRTZWxlY3Rpb25WYXJpYW50VG9Db25kaXRpb25zKG9TViwgb0NvbmRpdGlvbnMsIHt9IGFzIGFueSwgXCJcIik7XG5cblx0XHRcdGNvbnN0IGFQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMob0NvbmRpdGlvbnMpO1xuXHRcdFx0YVByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbihzUHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdGlDb3VudCArPSBvQ29uZGl0aW9uc1tzUHJvcGVydHlOYW1lXS5sZW5ndGg7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgcGFyYW0xVmFsdWUgPSBvQ29uZGl0aW9uc1tcIlBfcGFyYW0xXCJdWzBdLnZhbHVlc1swXSA9PT0gXCJwYXJhbVZhbHVlMVwiO1xuXHRcdFx0Ly9DSEVDS1xuXHRcdFx0ZXhwZWN0KHBhcmFtMVZhbHVlKS50b0JlKHRydWUpOyAvLyBcIkNvbW1vblV0aWxzOiBDb3JyZWN0IHBhcmFtZXRlciB2YWx1ZXMgYXJlIGFkZGVkIGZyb20gU1YuXCIpO1xuXHRcdFx0ZXhwZWN0KGFQcm9wZXJ0aWVzLmxlbmd0aCkudG9FcXVhbCgyKTsgLy8gPT09IDIsIFwiQ29tbW9uVXRpbHM6IENvcnJlY3Qgbm8uIG9mIHByb3BlcnR5UGF0aCBhcmUgYWRkZWQgZnJvbSBTVi5cIik7XG5cdFx0XHRleHBlY3QoaUNvdW50KS50b0VxdWFsKDIpOyAvLyA9PT0gMiwgXCJDb21tb25VdGlsczogQ29ycmVjdCBuby4gb2YgY29uZGl0aW9ucyBhcmUgYWRkZWQgZnJvbSBTVi5cIik7XG5cdFx0fSk7XG5cblx0XHR0ZXN0KFwiVGVzdCBjb252ZXJzaW9uIG9mIFNlbGVjdGlvbiBWYXJpYW50IHRvIGNvbmRpdGlvbnMgd2l0aCBwYXJhbWV0ZXJzIGNhc2Ugb2YgZmFsbCBiYWNrIHRvIGZpbHRlciBmaWVsZC5cIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRjb25zdCBvU1YgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpLFxuXHRcdFx0XHRvQ29uZGl0aW9uczogYW55ID0ge307XG5cdFx0XHRsZXQgaUNvdW50ID0gMDtcblxuXHRcdFx0dGhhdC52YWxpZFByb3BlcnRpZXMgPSB7XG5cdFx0XHRcdFwiYXR0cmlidXRlMVwiOiB7XG5cdFx0XHRcdFx0JFR5cGU6IFwiRWRtLlN0cmluZ1wiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwicGFyYW0yXCI6IHtcblx0XHRcdFx0XHQkVHlwZTogXCJFZG0uU3RyaW5nXCJcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdHRoYXQucGFyYW1ldGVySW5mbyA9IHtcblx0XHRcdFx0Y29udGV4dFBhdGg6IFwiL0N1c3RvbWVyL1NldFwiLFxuXHRcdFx0XHRwYXJhbWV0ZXJQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdFx0XCJQX3BhcmFtMVwiOiB7XG5cdFx0XHRcdFx0XHQkVHlwZTogXCJFZG0uU3RyaW5nXCJcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdG9TVi5hZGRTZWxlY3RPcHRpb24oXCJhdHRyaWJ1dGUxXCIsIFwiSVwiLCBcIkVRXCIsIFwidmFsdWUxXCIpO1xuXHRcdFx0b1NWLmFkZFNlbGVjdE9wdGlvbihcIlBfcGFyYW0yXCIsIFwiSVwiLCBcIkVRXCIsIFwicGFyYW1WYWx1ZTJcIik7XG5cblx0XHRcdENvbW1vblV0aWxzLmFkZFNlbGVjdGlvblZhcmlhbnRUb0NvbmRpdGlvbnMob1NWLCBvQ29uZGl0aW9ucywge30gYXMgYW55LCBcIlwiKTtcblxuXHRcdFx0Y29uc3QgYVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhvQ29uZGl0aW9ucyk7XG5cdFx0XHRhUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKHNQcm9wZXJ0eU5hbWUpIHtcblx0XHRcdFx0aUNvdW50ICs9IG9Db25kaXRpb25zW3NQcm9wZXJ0eU5hbWVdLmxlbmd0aDtcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCBwYXJhbTJWYWx1ZSA9IG9Db25kaXRpb25zW1wicGFyYW0yXCJdWzBdLnZhbHVlc1swXSA9PT0gXCJwYXJhbVZhbHVlMlwiO1xuXHRcdFx0Ly9DSEVDS1xuXHRcdFx0ZXhwZWN0KHBhcmFtMlZhbHVlKS50b0JlKHRydWUpOyAvLywgXCJDb21tb25VdGlsczogQ29ycmVjdCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBhZGRlZCBmcm9tIFNWLlwiKTtcblx0XHRcdGV4cGVjdChhUHJvcGVydGllcy5sZW5ndGgpLnRvRXF1YWwoMik7IC8vPT0gMiwgXCJDb21tb25VdGlsczogQ29ycmVjdCBuby4gb2YgcHJvcGVydHlQYXRoIGFyZSBhZGRlZCBmcm9tIFNWLlwiKTtcblx0XHRcdGV4cGVjdChpQ291bnQpLnRvRXF1YWwoMik7IC8vLCBcIkNvbW1vblV0aWxzOiBDb3JyZWN0IG5vLiBvZiBjb25kaXRpb25zIGFyZSBhZGRlZCBmcm9tIFNWLlwiKTtcblx0XHR9KTtcblxuXHRcdHRlc3QoXCJUZXN0IGNvbnZlcnNpb24gb2YgU2VsZWN0aW9uIFZhcmlhbnQgdG8gY29uZGl0aW9ucyB3aXRoIGFscmVhZHkgZXhpc3RpbmcgY29uZGl0aW9ucy5cIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRjb25zdCBvU1YgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpLFxuXHRcdFx0XHRvQ29uZGl0aW9uczogYW55ID0ge1xuXHRcdFx0XHRcdFwiYXR0cmlidXRlMlwiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwib3BlcmF0b3JcIjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcInZhbHVlc1wiOiBbXCJ2YWx1ZTNcIl1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdH07XG5cdFx0XHRsZXQgaUNvdW50ID0gMDtcblxuXHRcdFx0dGhhdC52YWxpZFByb3BlcnRpZXMgPSB7XG5cdFx0XHRcdFwiYXR0cmlidXRlMVwiOiB7XG5cdFx0XHRcdFx0JFR5cGU6IFwiRWRtLkJvb2xlYW5cIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHRcImF0dHJpYnV0ZTJcIjoge1xuXHRcdFx0XHRcdCRUeXBlOiBcIkVkbS5TdHJpbmdcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0dGhhdC5wYXJhbWV0ZXJJbmZvID0ge307XG5cblx0XHRcdG9TVi5hZGRTZWxlY3RPcHRpb24oXCJhdHRyaWJ1dGUxXCIsIFwiSVwiLCBcIkVRXCIsIFwidHJ1ZVwiKTtcblx0XHRcdG9TVi5hZGRTZWxlY3RPcHRpb24oXCJhdHRyaWJ1dGUyXCIsIFwiSVwiLCBcIkVRXCIsIFwidmFsdWUxXCIpO1xuXHRcdFx0b1NWLmFkZFNlbGVjdE9wdGlvbihcImF0dHJpYnV0ZTJcIiwgXCJJXCIsIFwiRVFcIiwgXCJ2YWx1ZTJcIik7XG5cblx0XHRcdENvbW1vblV0aWxzLmFkZFNlbGVjdGlvblZhcmlhbnRUb0NvbmRpdGlvbnMob1NWLCBvQ29uZGl0aW9ucywge30gYXMgYW55LCBcIlwiKTtcblxuXHRcdFx0Y29uc3QgYVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhvQ29uZGl0aW9ucyk7XG5cdFx0XHRhUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKHNQcm9wZXJ0eU5hbWUpIHtcblx0XHRcdFx0aUNvdW50ICs9IG9Db25kaXRpb25zW3NQcm9wZXJ0eU5hbWVdLmxlbmd0aDtcblx0XHRcdH0pO1xuXG5cdFx0XHQvL0NIRUNLXG5cdFx0XHRleHBlY3QoYVByb3BlcnRpZXMubGVuZ3RoKS50b0VxdWFsKDIpOyAvLyA9PT0gMiwgXCJDb21tb25VdGlsczogQ29ycmVjdCBuby4gb2YgcHJvcGVydHlQYXRoIGFyZSBhZGRlZCBmcm9tIFNWLlwiKTtcblx0XHRcdGV4cGVjdChpQ291bnQpLnRvRXF1YWwoNCk7IC8vIDQsIFwiQ29tbW9uVXRpbHM6IENvcnJlY3Qgbm8uIG9mIGNvbmRpdGlvbnMgYXJlIGFkZGVkIGZyb20gU1YuXCIpO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcImFkZEV4dGVybmFsU3RhdGVGaWx0ZXJzVG9TZWxlY3Rpb25WYXJpYW50XCIsIGZ1bmN0aW9uKCkge1xuXHRcdHRlc3QoXCJhZGRFeHRlcm5hbFN0YXRlRmlsdGVyc1RvU2VsZWN0aW9uVmFyaWFudFwiLCBmdW5jdGlvbigpIHtcblx0XHRcdGNvbnN0IG9JbnB1dFNlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHRcdFx0Y29uc3Qgb1RhcmdldEluZm8gPSB7XG5cdFx0XHRcdFwicHJvcGVydGllc1dpdGhvdXRDb25mbGljdFwiOiB7XG5cdFx0XHRcdFx0XCJNYXRlcmlhbFwiOiBbXCJTYWxlc09yZGVyTWFuYWdlLk1hdGVyaWFsXCJdXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRjb25zdCBtRmlsdGVycyA9IHtcblx0XHRcdFx0XCJmaWx0ZXJDb25kaXRpb25zXCI6IHtcblx0XHRcdFx0XHRcIkRhdGVcIjogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcIm9wZXJhdG9yXCI6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0XCJ2YWx1ZXNcIjogW1wiMjAyMC0wMy0wNFwiXVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJEYXRlVGltZU9mZnNldFwiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwib3BlcmF0b3JcIjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcInZhbHVlc1wiOiBbXCIyMDIwLTAzLTA0VDIwOjUzOjU0KzA1MzBcIl1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFwiVGltZU9mRGF5XCI6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFtcIjE2OjUxOjUxXCJdXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcIlN0cmluZ1wiOiBbXSxcblx0XHRcdFx0XHRcIkJvb2xlYW5cIjogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcIm9wZXJhdG9yXCI6IFwiRUVRXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFt0cnVlXVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJCeXRlXCI6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFs0XVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJCeXRlTXVsdGlcIjogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcIm9wZXJhdG9yXCI6IFwiTEVcIixcblx0XHRcdFx0XHRcdFx0XCJ2YWx1ZXNcIjogWzVdXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcIm9wZXJhdG9yXCI6IFwiR0VcIixcblx0XHRcdFx0XHRcdFx0XCJ2YWx1ZXNcIjogWzEwXVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJEYXRlVGltZU9mZnNldE11bHRpXCI6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIk5PVEdUXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFtcIjIwMjAtMDMtMjVUMjA6NTU6NDIrMDUzMFwiXVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIk5PVExUXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFtcIjIwMjAtMDItMDFUMjA6NTU6NTErMDUzMFwiXVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJEZWNpbWFsXCI6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFtcIjQuNDVcIl1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFwiRGVjaW1hbE11bHRpXCI6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIk5FXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFtcIjYuMjVcIl1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFwiRG91YmxlXCI6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFszLjMzMzMzM11cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFwiRG91YmxlTXVsdGlcIjogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcIm9wZXJhdG9yXCI6IFwiTk9UR0VcIixcblx0XHRcdFx0XHRcdFx0XCJ2YWx1ZXNcIjogWzYuNjY2NjY2NjY2XVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIk5PVEdUXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFsxMC4wMDAwMDk5OTk5XVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJHdWlkXCI6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFtcIjExMTExMTgyLWFhYWEtYmJiYi1jY2NjLWRkZGRlZWVlZmZmZlwiXVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJHdWlkTXVsdGlcIjogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcIm9wZXJhdG9yXCI6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0XCJ2YWx1ZXNcIjogW1wiMTExMTExODMtYWFhYS1iYmJiLWNjY2MtZGRkZGVlZWVmZmZmXCJdXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcIm9wZXJhdG9yXCI6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0XCJ2YWx1ZXNcIjogW1wiMTExMTExODUtYWFhYS1iYmJiLWNjY2MtZGRkZGVlZWVmZmZmXCJdXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcIkludDE2XCI6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFsxMF1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFwiRW1wdHlcIjogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcIm9wZXJhdG9yXCI6IFwiRW1wdHlcIixcblx0XHRcdFx0XHRcdFx0XCJ2YWx1ZXNcIjogW11cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFwiSW50MTZNdWx0aVwiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwib3BlcmF0b3JcIjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcInZhbHVlc1wiOiBbMTVdXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcIm9wZXJhdG9yXCI6IFwiTk9UR0VcIixcblx0XHRcdFx0XHRcdFx0XCJ2YWx1ZXNcIjogWzEwMDAwXVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIk5PVEJUXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFsxMDAsIDIwMF1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwib3BlcmF0b3JcIjogXCJOT1RMVFwiLFxuXHRcdFx0XHRcdFx0XHRcInZhbHVlc1wiOiBbMTBdXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcIkludDMyXCI6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFs5OTk5OTk5XVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJJbnQzMk11bHRpXCI6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIkJUXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFsxMDAwMDAwLCAxMDAwMDAwMDAwXVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJJbnQ2NFwiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwib3BlcmF0b3JcIjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcInZhbHVlc1wiOiBbXCI5OVwiXVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJJbnQ2NE11bHRpXCI6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIk5PVExUXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFtcIjk5OTk5OTlcIl1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwib3BlcmF0b3JcIjogXCJORVwiLFxuXHRcdFx0XHRcdFx0XHRcInZhbHVlc1wiOiBbXCI5OTk5OVwiXVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJTQnl0ZVwiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwib3BlcmF0b3JcIjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcInZhbHVlc1wiOiBbMV1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFwiU0J5dGVNdWx0aVwiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwib3BlcmF0b3JcIjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcInZhbHVlc1wiOiBbMl1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwib3BlcmF0b3JcIjogXCJHVFwiLFxuXHRcdFx0XHRcdFx0XHRcInZhbHVlc1wiOiBbM11cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFwiU2luZ2xlXCI6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFsxXVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJTaW5nbGVNdWx0aVwiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwib3BlcmF0b3JcIjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcInZhbHVlc1wiOiBbMl1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFwiU3RyaW5nTXVsdGlcIjogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcIm9wZXJhdG9yXCI6IFwiRW5kc1dpdGhcIixcblx0XHRcdFx0XHRcdFx0XCJ2YWx1ZXNcIjogW1wieHl6XCJdXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcIm9wZXJhdG9yXCI6IFwiU3RhcnRzV2l0aFwiLFxuXHRcdFx0XHRcdFx0XHRcInZhbHVlc1wiOiBbXCJhYmNcIl1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwib3BlcmF0b3JcIjogXCJDb250YWluc1wiLFxuXHRcdFx0XHRcdFx0XHRcInZhbHVlc1wiOiBbXCJkZWZcIl1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwib3BlcmF0b3JcIjogXCJOb3RTdGFydHNXaXRoXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFtcImlqa1wiXVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIk5vdEVuZHNXaXRoXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFtcInV2d1wiXVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIk5vdENvbnRhaW5zXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFtcInBxclwiXVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJUaW1lT2ZEYXlNdWx0aVwiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwib3BlcmF0b3JcIjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcInZhbHVlc1wiOiBbXCIyMjowMDozOVwiXVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJvcGVyYXRvclwiOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdFwidmFsdWVzXCI6IFtcIjE3OjAwOjQzXCJdXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRcImZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3RcIjoge1xuXHRcdFx0XHRcdFwiTWF0ZXJpYWxcIjogW1wiU2FsZXNPcmRlck1hbmFnZS5fSXRlbS5NYXRlcmlhbFwiXVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3Qgb091dFB1dFNlbGVjdGlvblZhcmlhbnQgPSBDb21tb25VdGlscy5hZGRFeHRlcm5hbFN0YXRlRmlsdGVyc1RvU2VsZWN0aW9uVmFyaWFudChcblx0XHRcdFx0b0lucHV0U2VsZWN0aW9uVmFyaWFudCxcblx0XHRcdFx0bUZpbHRlcnMsXG5cdFx0XHRcdG9UYXJnZXRJbmZvXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgb0FjdHVhbFNlbGVjdGlvblZhcmlhbnQgPSB7XG5cdFx0XHRcdF9tUGFyYW1ldGVyczoge30sXG5cdFx0XHRcdF9tU2VsZWN0T3B0aW9uczoge1xuXHRcdFx0XHRcdFwiRGF0ZVwiOiBbeyBcIlNpZ25cIjogXCJJXCIsIFwiT3B0aW9uXCI6IFwiRVFcIiwgXCJMb3dcIjogXCIyMDIwLTAzLTA0XCIsIFwiSGlnaFwiOiBudWxsIH1dLFxuXHRcdFx0XHRcdFwiRGF0ZVRpbWVPZmZzZXRcIjogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcIlNpZ25cIjogXCJJXCIsXG5cdFx0XHRcdFx0XHRcdFwiT3B0aW9uXCI6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0XCJMb3dcIjogXCIyMDIwLTAzLTA0VDIwOjUzOjU0KzA1MzBcIixcblx0XHRcdFx0XHRcdFx0XCJIaWdoXCI6IG51bGxcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFwiVGltZU9mRGF5XCI6IFt7IFwiU2lnblwiOiBcIklcIiwgXCJPcHRpb25cIjogXCJFUVwiLCBcIkxvd1wiOiBcIjE2OjUxOjUxXCIsIFwiSGlnaFwiOiBudWxsIH1dLFxuXHRcdFx0XHRcdFwiQm9vbGVhblwiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwiU2lnblwiOiBcIklcIixcblx0XHRcdFx0XHRcdFx0XCJPcHRpb25cIjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcIkxvd1wiOiBcInRydWVcIixcblx0XHRcdFx0XHRcdFx0XCJIaWdoXCI6IG51bGxcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFwiQnl0ZVwiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwiU2lnblwiOiBcIklcIixcblx0XHRcdFx0XHRcdFx0XCJPcHRpb25cIjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcIkxvd1wiOiBcIjRcIixcblx0XHRcdFx0XHRcdFx0XCJIaWdoXCI6IG51bGxcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFwiQnl0ZU11bHRpXCI6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJTaWduXCI6IFwiSVwiLFxuXHRcdFx0XHRcdFx0XHRcIk9wdGlvblwiOiBcIkxFXCIsXG5cdFx0XHRcdFx0XHRcdFwiTG93XCI6IFwiNVwiLFxuXHRcdFx0XHRcdFx0XHRcIkhpZ2hcIjogbnVsbFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJEYXRlVGltZU9mZnNldE11bHRpXCI6IFtcblx0XHRcdFx0XHRcdHsgXCJTaWduXCI6IFwiRVwiLCBcIk9wdGlvblwiOiBcIkdUXCIsIFwiTG93XCI6IFwiMjAyMC0wMy0yNVQyMDo1NTo0MiswNTMwXCIsIFwiSGlnaFwiOiBudWxsIH0sXG5cdFx0XHRcdFx0XHR7IFwiU2lnblwiOiBcIkVcIiwgXCJPcHRpb25cIjogXCJMVFwiLCBcIkxvd1wiOiBcIjIwMjAtMDItMDFUMjA6NTU6NTErMDUzMFwiLCBcIkhpZ2hcIjogbnVsbCB9XG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcIkRlY2ltYWxcIjogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcIlNpZ25cIjogXCJJXCIsXG5cdFx0XHRcdFx0XHRcdFwiT3B0aW9uXCI6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0XCJMb3dcIjogXCI0LjQ1XCIsXG5cdFx0XHRcdFx0XHRcdFwiSGlnaFwiOiBudWxsXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcIkRlY2ltYWxNdWx0aVwiOiBbeyBcIlNpZ25cIjogXCJJXCIsIFwiT3B0aW9uXCI6IFwiTkVcIiwgXCJMb3dcIjogXCI2LjI1XCIsIFwiSGlnaFwiOiBudWxsIH1dLFxuXHRcdFx0XHRcdFwiRG91YmxlXCI6IFt7IFwiU2lnblwiOiBcIklcIiwgXCJPcHRpb25cIjogXCJFUVwiLCBcIkxvd1wiOiBcIjMuMzMzMzMzXCIsIFwiSGlnaFwiOiBudWxsIH1dLFxuXHRcdFx0XHRcdFwiRG91YmxlTXVsdGlcIjogW1xuXHRcdFx0XHRcdFx0eyBcIlNpZ25cIjogXCJFXCIsIFwiT3B0aW9uXCI6IFwiR0VcIiwgXCJMb3dcIjogXCI2LjY2NjY2NjY2NlwiLCBcIkhpZ2hcIjogbnVsbCB9LFxuXHRcdFx0XHRcdFx0eyBcIlNpZ25cIjogXCJFXCIsIFwiT3B0aW9uXCI6IFwiR1RcIiwgXCJMb3dcIjogXCIxMC4wMDAwMDk5OTk5XCIsIFwiSGlnaFwiOiBudWxsIH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFwiRW1wdHlcIjogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcIkhpZ2hcIjogbnVsbCxcblx0XHRcdFx0XHRcdFx0XCJMb3dcIjogXCJcIixcblx0XHRcdFx0XHRcdFx0XCJPcHRpb25cIjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcIlNpZ25cIjogXCJJXCJcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFwiR3VpZFwiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwiU2lnblwiOiBcIklcIixcblx0XHRcdFx0XHRcdFx0XCJPcHRpb25cIjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcIkxvd1wiOiBcIjExMTExMTgyLWFhYWEtYmJiYi1jY2NjLWRkZGRlZWVlZmZmZlwiLFxuXHRcdFx0XHRcdFx0XHRcIkhpZ2hcIjogbnVsbFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJHdWlkTXVsdGlcIjogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcIlNpZ25cIjogXCJJXCIsXG5cdFx0XHRcdFx0XHRcdFwiT3B0aW9uXCI6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0XCJMb3dcIjogXCIxMTExMTE4My1hYWFhLWJiYmItY2NjYy1kZGRkZWVlZWZmZmZcIixcblx0XHRcdFx0XHRcdFx0XCJIaWdoXCI6IG51bGxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwiU2lnblwiOiBcIklcIixcblx0XHRcdFx0XHRcdFx0XCJPcHRpb25cIjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcIkxvd1wiOiBcIjExMTExMTg1LWFhYWEtYmJiYi1jY2NjLWRkZGRlZWVlZmZmZlwiLFxuXHRcdFx0XHRcdFx0XHRcIkhpZ2hcIjogbnVsbFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJJbnQxNlwiOiBbeyBcIlNpZ25cIjogXCJJXCIsIFwiT3B0aW9uXCI6IFwiRVFcIiwgXCJMb3dcIjogXCIxMFwiLCBcIkhpZ2hcIjogbnVsbCB9XSxcblx0XHRcdFx0XHRcIkludDE2TXVsdGlcIjogW1xuXHRcdFx0XHRcdFx0eyBcIlNpZ25cIjogXCJJXCIsIFwiT3B0aW9uXCI6IFwiRVFcIiwgXCJMb3dcIjogXCIxNVwiLCBcIkhpZ2hcIjogbnVsbCB9LFxuXHRcdFx0XHRcdFx0eyBcIlNpZ25cIjogXCJFXCIsIFwiT3B0aW9uXCI6IFwiR0VcIiwgXCJMb3dcIjogXCIxMDAwMFwiLCBcIkhpZ2hcIjogbnVsbCB9LFxuXHRcdFx0XHRcdFx0eyBcIlNpZ25cIjogXCJFXCIsIFwiT3B0aW9uXCI6IFwiQlRcIiwgXCJMb3dcIjogXCIxMDBcIiwgXCJIaWdoXCI6IFwiMjAwXCIgfSxcblx0XHRcdFx0XHRcdHsgXCJTaWduXCI6IFwiRVwiLCBcIk9wdGlvblwiOiBcIkxUXCIsIFwiTG93XCI6IFwiMTBcIiwgXCJIaWdoXCI6IG51bGwgfVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJJbnQzMlwiOiBbeyBcIlNpZ25cIjogXCJJXCIsIFwiT3B0aW9uXCI6IFwiRVFcIiwgXCJMb3dcIjogXCI5OTk5OTk5XCIsIFwiSGlnaFwiOiBudWxsIH1dLFxuXHRcdFx0XHRcdFwiSW50MzJNdWx0aVwiOiBbeyBcIlNpZ25cIjogXCJJXCIsIFwiT3B0aW9uXCI6IFwiQlRcIiwgXCJMb3dcIjogXCIxMDAwMDAwXCIsIFwiSGlnaFwiOiBcIjEwMDAwMDAwMDBcIiB9XSxcblx0XHRcdFx0XHRcIkludDY0XCI6IFt7IFwiU2lnblwiOiBcIklcIiwgXCJPcHRpb25cIjogXCJFUVwiLCBcIkxvd1wiOiBcIjk5XCIsIFwiSGlnaFwiOiBudWxsIH1dLFxuXHRcdFx0XHRcdFwiSW50NjRNdWx0aVwiOiBbXG5cdFx0XHRcdFx0XHR7IFwiU2lnblwiOiBcIkVcIiwgXCJPcHRpb25cIjogXCJMVFwiLCBcIkxvd1wiOiBcIjk5OTk5OTlcIiwgXCJIaWdoXCI6IG51bGwgfSxcblx0XHRcdFx0XHRcdHsgXCJTaWduXCI6IFwiSVwiLCBcIk9wdGlvblwiOiBcIk5FXCIsIFwiTG93XCI6IFwiOTk5OTlcIiwgXCJIaWdoXCI6IG51bGwgfVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XCJTQnl0ZVwiOiBbeyBcIlNpZ25cIjogXCJJXCIsIFwiT3B0aW9uXCI6IFwiRVFcIiwgXCJMb3dcIjogXCIxXCIsIFwiSGlnaFwiOiBudWxsIH1dLFxuXHRcdFx0XHRcdFwiU0J5dGVNdWx0aVwiOiBbXG5cdFx0XHRcdFx0XHR7IFwiU2lnblwiOiBcIklcIiwgXCJPcHRpb25cIjogXCJFUVwiLCBcIkxvd1wiOiBcIjJcIiwgXCJIaWdoXCI6IG51bGwgfSxcblx0XHRcdFx0XHRcdHsgXCJTaWduXCI6IFwiSVwiLCBcIk9wdGlvblwiOiBcIkdUXCIsIFwiTG93XCI6IFwiM1wiLCBcIkhpZ2hcIjogbnVsbCB9XG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcIlNpbmdsZVwiOiBbeyBcIlNpZ25cIjogXCJJXCIsIFwiT3B0aW9uXCI6IFwiRVFcIiwgXCJMb3dcIjogXCIxXCIsIFwiSGlnaFwiOiBudWxsIH1dLFxuXHRcdFx0XHRcdFwiU2luZ2xlTXVsdGlcIjogW3sgXCJTaWduXCI6IFwiSVwiLCBcIk9wdGlvblwiOiBcIkVRXCIsIFwiTG93XCI6IFwiMlwiLCBcIkhpZ2hcIjogbnVsbCB9XSxcblx0XHRcdFx0XHRcIlN0cmluZ011bHRpXCI6IFtcblx0XHRcdFx0XHRcdHsgXCJTaWduXCI6IFwiSVwiLCBcIk9wdGlvblwiOiBcIkNQXCIsIFwiTG93XCI6IFwiKnh5elwiLCBcIkhpZ2hcIjogbnVsbCB9LFxuXHRcdFx0XHRcdFx0eyBcIlNpZ25cIjogXCJJXCIsIFwiT3B0aW9uXCI6IFwiQ1BcIiwgXCJMb3dcIjogXCJhYmMqXCIsIFwiSGlnaFwiOiBudWxsIH0sXG5cdFx0XHRcdFx0XHR7IFwiU2lnblwiOiBcIklcIiwgXCJPcHRpb25cIjogXCJDUFwiLCBcIkxvd1wiOiBcImRlZlwiLCBcIkhpZ2hcIjogbnVsbCB9LFxuXHRcdFx0XHRcdFx0eyBcIlNpZ25cIjogXCJFXCIsIFwiT3B0aW9uXCI6IFwiQ1BcIiwgXCJMb3dcIjogXCJpamsqXCIsIFwiSGlnaFwiOiBudWxsIH0sXG5cdFx0XHRcdFx0XHR7IFwiU2lnblwiOiBcIkVcIiwgXCJPcHRpb25cIjogXCJDUFwiLCBcIkxvd1wiOiBcIip1dndcIiwgXCJIaWdoXCI6IG51bGwgfSxcblx0XHRcdFx0XHRcdHsgXCJTaWduXCI6IFwiRVwiLCBcIk9wdGlvblwiOiBcIkNQXCIsIFwiTG93XCI6IFwicHFyXCIsIFwiSGlnaFwiOiBudWxsIH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFwiVGltZU9mRGF5TXVsdGlcIjogW1xuXHRcdFx0XHRcdFx0eyBcIlNpZ25cIjogXCJJXCIsIFwiT3B0aW9uXCI6IFwiRVFcIiwgXCJMb3dcIjogXCIyMjowMDozOVwiLCBcIkhpZ2hcIjogbnVsbCB9LFxuXHRcdFx0XHRcdFx0eyBcIlNpZ25cIjogXCJJXCIsIFwiT3B0aW9uXCI6IFwiRVFcIiwgXCJMb3dcIjogXCIxNzowMDo0M1wiLCBcIkhpZ2hcIjogbnVsbCB9XG5cdFx0XHRcdFx0XVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRfc0lkOiBcIlwiXG5cdFx0XHR9O1xuXHRcdFx0ZXhwZWN0KG9BY3R1YWxTZWxlY3Rpb25WYXJpYW50KS50b0VxdWFsKG9PdXRQdXRTZWxlY3Rpb25WYXJpYW50KTsgLy9cInRoZSBleHRlcm5hbCBzdGF0ZSBmaWx0ZXJzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgY29ycmVjdGx5XCJcblx0XHR9KTtcblx0fSk7XG5cdGRlc2NyaWJlKFwiVW5pdCBUZXN0IGNoZWNrIE9wZXJhdG9yc1wiLCBmdW5jdGlvbigpIHtcblx0XHR0ZXN0KFwiVW5pdCB0ZXN0IHRvIGNoZWNrIE9wZXJhdG9yc1wiLCBmdW5jdGlvbigpIHtcblx0XHRcdFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGRhdGFGaWVsZDogXCJMYXN0Q2hhbmdlZERhdGVUaW1lXCIsXG5cdFx0XHRcdFx0b0NvbnRleHQ6IHtcblx0XHRcdFx0XHRcdGdldE9iamVjdDogZnVuY3Rpb24ocGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEVkbSBUeXBlXG5cdFx0XHRcdFx0XHRcdGlmIChwYXRoID09PSBcIi9kdW1teS9MYXN0Q2hhbmdlZERhdGVUaW1lLyRUeXBlXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJFZG0uRGF0ZVRpbWVcIjtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBGaWx0ZXIgQW5ub3RhdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0RmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9uczogW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0UHJvcGVydHk6IHsgJFByb3BlcnR5UGF0aDogXCJMYXN0Q2hhbmdlZERhdGVUaW1lXCIgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRBbGxvd2VkRXhwcmVzc2lvbnM6IFwiU2luZ2xlUmFuZ2VcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZXhwZWN0ZWRWYWx1ZTogXCJFUSxCVCxMVCxMRSxHVCxHRSxOT1RMVCxOT1RMRSxOT1RHVCxOT1RHRVwiLFxuXHRcdFx0XHRcdHNNZXNzYWdlOiBcIkVkbS5TdHJpbmcgYW5kIFNpbmdsZSBSYW5nZVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRkYXRhRmllbGQ6IFwiU2FsZXNPcmRlckRhdGVcIixcblx0XHRcdFx0XHRvQ29udGV4dDoge1xuXHRcdFx0XHRcdFx0Z2V0T2JqZWN0OiBmdW5jdGlvbihwYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0Ly8gRWRtIFR5cGVcblx0XHRcdFx0XHRcdFx0aWYgKHBhdGggPT09IFwiL2R1bW15L1NhbGVzT3JkZXJEYXRlLyRUeXBlXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJFZG0uRGF0ZVwiO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIEZpbHRlciBBbm5vdGF0aW9uc1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zOiBbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRQcm9wZXJ0eTogeyAkUHJvcGVydHlQYXRoOiBcIlNhbGVzT3JkZXJEYXRlXCIgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRBbGxvd2VkRXhwcmVzc2lvbnM6IFwiU2luZ2xlVmFsdWVcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZXhwZWN0ZWRWYWx1ZTogXCJFUVwiLFxuXHRcdFx0XHRcdHNNZXNzYWdlOiBcIkVkbS5EYXRlIGFuZCBTaW5nbGUgVmFsdWVcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZGF0YUZpZWxkOiBcIlNhbGVzT3JkZXJEYXRlXCIsXG5cdFx0XHRcdFx0b0NvbnRleHQ6IHtcblx0XHRcdFx0XHRcdGdldE9iamVjdDogZnVuY3Rpb24ocGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEVkbSBUeXBlXG5cdFx0XHRcdFx0XHRcdGlmIChwYXRoID09PSBcIi9kdW1teS9TYWxlc09yZGVyRGF0ZS8kVHlwZVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiRWRtLkRhdGVcIjtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBGaWx0ZXIgQW5ub3RhdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0RmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9uczogW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0UHJvcGVydHk6IHsgJFByb3BlcnR5UGF0aDogXCJTYWxlc09yZGVyRGF0ZVwiIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0QWxsb3dlZEV4cHJlc3Npb25zOiBcIk11bHRpVmFsdWVcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZXhwZWN0ZWRWYWx1ZTogXCJFUVwiLFxuXHRcdFx0XHRcdHNNZXNzYWdlOiBcIkVkbS5EYXRlIGFuZCBNdWx0aSBWYWx1ZVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRkYXRhRmllbGQ6IFwiTmV0QW1vdW50XCIsXG5cdFx0XHRcdFx0b0NvbnRleHQ6IHtcblx0XHRcdFx0XHRcdGdldE9iamVjdDogZnVuY3Rpb24ocGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEVkbSBUeXBlXG5cdFx0XHRcdFx0XHRcdGlmIChwYXRoID09PSBcIi9kdW1teS9OZXRBbW91bnQvJFR5cGVcIikge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBcIkVkbS5EZWNpbWFsXCI7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmlsdGVyIEFubm90YXRpb25zXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdEZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnM6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFByb3BlcnR5OiB7ICRQcm9wZXJ0eVBhdGg6IFwiTmV0QW1vdW50XCIgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRBbGxvd2VkRXhwcmVzc2lvbnM6IFwiTXVsdGlSYW5nZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRleHBlY3RlZFZhbHVlOiBcIkVRLEJULExULExFLEdULEdFLE5FLE5PVEJULE5PVExULE5PVExFLE5PVEdULE5PVEdFXCIsXG5cdFx0XHRcdFx0c01lc3NhZ2U6IFwiRWRtLkRlY2ltYWwgYW5kIE11bHRpIFJhbmdlXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGRhdGFGaWVsZDogXCJTb2xkVG9QYXJ0eVwiLFxuXHRcdFx0XHRcdG9Db250ZXh0OiB7XG5cdFx0XHRcdFx0XHRnZXRPYmplY3Q6IGZ1bmN0aW9uKHBhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHQvLyBFZG0gdHlwZVxuXHRcdFx0XHRcdFx0XHRpZiAocGF0aCA9PT0gXCIvZHVtbXkvU29sZFRvUGFydHkvJFR5cGVcIikge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBcIkVkbS5TdHJpbmdcIjtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBGaWx0ZXIgQW5ub3RhdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0RmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9uczogW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0UHJvcGVydHk6IHsgJFByb3BlcnR5UGF0aDogXCJTb2xkVG9QYXJ0eVwiIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0QWxsb3dlZEV4cHJlc3Npb25zOiBcIlNlYXJjaEV4cHJlc3Npb25cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZXhwZWN0ZWRWYWx1ZTogXCJDb250YWlucyxTdGFydHNXaXRoLEVuZHNXaXRoLE5vdENvbnRhaW5zLE5vdFN0YXJ0c1dpdGgsTm90RW5kc1dpdGhcIixcblx0XHRcdFx0XHRzTWVzc2FnZTogXCJFZG0uU3RyaW5nIGFuZCBTZWFyY2ggRXhwcmVzc2lvbnNcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZGF0YUZpZWxkOiBcIlNvbGRUb1BhcnR5XCIsXG5cdFx0XHRcdFx0b0NvbnRleHQ6IHtcblx0XHRcdFx0XHRcdGdldE9iamVjdDogZnVuY3Rpb24ocGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEVkbSB0eXBlXG5cdFx0XHRcdFx0XHRcdGlmIChwYXRoID09PSBcIi9kdW1teS9Tb2xkVG9QYXJ0eS8kVHlwZVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiRWRtLlN0cmluZ1wiO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIEZpbHRlciBBbm5vdGF0aW9uc1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zOiBbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRQcm9wZXJ0eTogeyAkUHJvcGVydHlQYXRoOiBcIlNvbGRUb1BhcnR5XCIgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRBbGxvd2VkRXhwcmVzc2lvbnM6IFwiTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRleHBlY3RlZFZhbHVlOlxuXHRcdFx0XHRcdFx0XCJDb250YWlucyxFUSxCVCxTdGFydHNXaXRoLEVuZHNXaXRoLExULExFLEdULEdFLE5vdENvbnRhaW5zLE5FLE5PVEJULE5vdFN0YXJ0c1dpdGgsTm90RW5kc1dpdGgsTk9UTFQsTk9UTEUsTk9UR1QsTk9UR0VcIixcblx0XHRcdFx0XHRzTWVzc2FnZTogXCJFZG0uU3RyaW5nIGFuZCBNdWx0aVJhbmdlIE9yIFNlYXJjaCBFeHByZXNzaW9uc1wiXG5cdFx0XHRcdH1cblx0XHRcdF0uZm9yRWFjaChmdW5jdGlvbihvUHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3QgYWN0dWFsVmFsdWUgPSBDb21tb25VdGlscy5nZXRPcGVyYXRvcnNGb3JQcm9wZXJ0eShcblx0XHRcdFx0XHRvUHJvcGVydHkuZGF0YUZpZWxkLFxuXHRcdFx0XHRcdFwiL2R1bW15XCIsXG5cdFx0XHRcdFx0b1Byb3BlcnR5Lm9Db250ZXh0LFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5vQ29udGV4dC5nZXRPYmplY3QoXCIvZHVtbXkvXCIgKyBvUHJvcGVydHkuZGF0YUZpZWxkICsgXCIvJFR5cGVcIilcblx0XHRcdFx0KTtcblx0XHRcdFx0ZXhwZWN0KGFjdHVhbFZhbHVlKS50b0VxdWFsKG9Qcm9wZXJ0eS5leHBlY3RlZFZhbHVlKTsgLy8gLCBcIlVuaXQgdGVzdCB0byBjaGVjayBPcGVyYXRvcnMgZm9yIFwiICsgb1Byb3BlcnR5LnNNZXNzYWdlICsgXCI6ICBva1wiKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcIlRlc3QgQ29tbW9uVXRpbHMgOiBhZGREZWZhdWx0RGlzcGxheUN1cnJlbmN5XCIsIGZ1bmN0aW9uKCkge1xuXHRcdHRlc3QoXCJUZXN0IGFkZGluZyBkZWZhdWx0IGRpc3BsYXkgY3VycmVuY3kgdG8gU1YuXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0W1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0YU1hbmRhdG9yeUZpZWxkczogW10sXG5cdFx0XHRcdFx0b0FwcERhdGE6IHt9LFxuXHRcdFx0XHRcdG9FeHBlY3RlZFZhbHVlOiB1bmRlZmluZWRcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGFNYW5kYXRvcnlGaWVsZHM6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0JFByb3BlcnR5UGF0aDogXCJEaXNwbGF5Q3VycmVuY3lcIlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0b0FwcERhdGE6IHt9LFxuXHRcdFx0XHRcdG9FeHBlY3RlZFZhbHVlOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0c01lc3NhZ2U6IFwibm8gU1YgaW4gYXBwRGF0YVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRhTWFuZGF0b3J5RmllbGRzOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdCRQcm9wZXJ0eVBhdGg6IFwiRGlzcGxheUN1cnJlbmN5XCJcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdG9BcHBEYXRhOiB7XG5cdFx0XHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudDogbmV3IFNlbGVjdGlvblZhcmlhbnQoKVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b0V4cGVjdGVkVmFsdWU6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRzTWVzc2FnZTogXCJubyBEZWZhdWx0ZWQgU1ZcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0YU1hbmRhdG9yeUZpZWxkczogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHQkUHJvcGVydHlQYXRoOiBcIkRpc3BsYXlDdXJyZW5jeVwiXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRvQXBwRGF0YToge1xuXHRcdFx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQ6IG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdFx0XHRvRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudDogbmV3IFNlbGVjdGlvblZhcmlhbnQoKVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b0V4cGVjdGVkVmFsdWU6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRzTWVzc2FnZTogXCJubyBEaXNwbGF5Q3VycmVuY3kgaW4gRGVmYXVsdGVkIFNWXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGFNYW5kYXRvcnlGaWVsZHM6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0JFByb3BlcnR5UGF0aDogXCJEaXNwbGF5Q3VycmVuY3lcIlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0b0FwcERhdGE6IHtcblx0XHRcdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50OiBuZXcgU2VsZWN0aW9uVmFyaWFudCgpLFxuXHRcdFx0XHRcdFx0b0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQ6IG5ldyBTZWxlY3Rpb25WYXJpYW50KHtcblx0XHRcdFx0XHRcdFx0XCJTZWxlY3RPcHRpb25zXCI6IFtcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcIlByb3BlcnR5TmFtZVwiOiBcIkRpc3BsYXlDdXJyZW5jeVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJSYW5nZXNcIjogW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJTaWduXCI6IFwiSVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiT3B0aW9uXCI6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkxvd1wiOiBcIkVVUlwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiSGlnaFwiOiBudWxsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvRXhwZWN0ZWRWYWx1ZTogXCJFVVJcIixcblx0XHRcdFx0XHRzTWVzc2FnZTogXCJEaXNwbGF5Q3VycmVuY3kgaW4gRGVmYXVsdGVkIFNWXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGFNYW5kYXRvcnlGaWVsZHM6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0JFByb3BlcnR5UGF0aDogXCJEaXNwbGF5Q3VycmVuY3lcIlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0b0FwcERhdGE6IHtcblx0XHRcdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50OiBuZXcgU2VsZWN0aW9uVmFyaWFudCh7XG5cdFx0XHRcdFx0XHRcdFwiU2VsZWN0T3B0aW9uc1wiOiBbXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJQcm9wZXJ0eU5hbWVcIjogXCJEaXNwbGF5Q3VycmVuY3lcIixcblx0XHRcdFx0XHRcdFx0XHRcdFwiUmFuZ2VzXCI6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiU2lnblwiOiBcIklcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIk9wdGlvblwiOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJMb3dcIjogXCJJTlJcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkhpZ2hcIjogbnVsbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdG9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50OiBuZXcgU2VsZWN0aW9uVmFyaWFudCh7XG5cdFx0XHRcdFx0XHRcdFwiU2VsZWN0T3B0aW9uc1wiOiBbXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJQcm9wZXJ0eU5hbWVcIjogXCJEaXNwbGF5Q3VycmVuY3lcIixcblx0XHRcdFx0XHRcdFx0XHRcdFwiUmFuZ2VzXCI6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiU2lnblwiOiBcIklcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIk9wdGlvblwiOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJMb3dcIjogXCJFVVJcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkhpZ2hcIjogbnVsbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b0V4cGVjdGVkVmFsdWU6IFwiSU5SXCIsXG5cdFx0XHRcdFx0c01lc3NhZ2U6IFwiRGlzcGxheUN1cnJlbmN5IGluIFNWIGFuZCBEZWZhdWx0ZWQgU1ZcIlxuXHRcdFx0XHR9XG5cdFx0XHRdLmZvckVhY2goZnVuY3Rpb24ob1Rlc3REYXRhKSB7XG5cdFx0XHRcdENvbW1vblV0aWxzLmFkZERlZmF1bHREaXNwbGF5Q3VycmVuY3koXG5cdFx0XHRcdFx0b1Rlc3REYXRhLmFNYW5kYXRvcnlGaWVsZHMsXG5cdFx0XHRcdFx0b1Rlc3REYXRhLm9BcHBEYXRhLm9TZWxlY3Rpb25WYXJpYW50LFxuXHRcdFx0XHRcdG9UZXN0RGF0YS5vQXBwRGF0YS5vRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRleHBlY3QoXG5cdFx0XHRcdFx0b1Rlc3REYXRhLm9BcHBEYXRhICYmXG5cdFx0XHRcdFx0XHRvVGVzdERhdGEub0FwcERhdGEub1NlbGVjdGlvblZhcmlhbnQgJiZcblx0XHRcdFx0XHRcdG9UZXN0RGF0YS5vQXBwRGF0YS5vU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oXCJEaXNwbGF5Q3VycmVuY3lcIikgJiZcblx0XHRcdFx0XHRcdG9UZXN0RGF0YS5vQXBwRGF0YS5vU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oXCJEaXNwbGF5Q3VycmVuY3lcIilbMF0uTG93XG5cdFx0XHRcdCkudG9FcXVhbChvVGVzdERhdGEub0V4cGVjdGVkVmFsdWUpOyAvLyAsXCJOYXZIZWxwZXI6IGFkZERlZmF1bHREaXNwbGF5Q3VycmVuY3kgd29ya3Mgd2hlbiBcIiArIG9UZXN0RGF0YS5zTWVzc2FnZSArIFwiLlwiXG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fSk7XG5cblx0ZGVzY3JpYmUoXCJVbml0IFRlc3QgdG8gY2hlY2sgZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzXCIsIGZ1bmN0aW9uKCkge1xuXHRcdHRlc3QoXCJVbml0IFRlc3QgdG8gY2hlY2sgZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0W1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bWV0YU1vZGVsOiB7XG5cdFx0XHRcdFx0XHRnZXRPYmplY3Q6IGZ1bmN0aW9uKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0c3dpdGNoIChzUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIvU2FsZXNPcmRlckl0ZW0vXCI6XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIiRLZXlcIjogW1wia2V5MVwiLCBcImtleTJcIl0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwia2V5MVwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JGtpbmQ6IFwiUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImtleTJcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCRraW5kOiBcIlByb3BlcnR5XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJwcm9wMVwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JGtpbmQ6IFwiUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIvU2FsZXNPcmRlckl0ZW0va2V5MkBcIjpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCI6IGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIvU2FsZXNPcmRlckl0ZW0vcHJvcDFAXCI6XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIjogdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRwYXRoOiBcIi9TYWxlc09yZGVySXRlbVwiLFxuXHRcdFx0XHRcdGV4cGVjdGVkVmFsdWU6IFwia2V5MSxrZXkyLHByb3AxXCIsXG5cdFx0XHRcdFx0bWVzc2FnZTogXCJ3aXRoIHRlY2huaWNhbCBrZXlzIGFuZCBpbW11dGFibGUgcHJvcFwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRtZXRhTW9kZWw6IHtcblx0XHRcdFx0XHRcdGdldE9iamVjdDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHNQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIi9TYWxlc09yZGVySXRlbS9cIjpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiJEtleVwiOiBbXCJrZXkxXCIsIFwia2V5MlwiXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJrZXkxXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQka2luZDogXCJQcm9wZXJ0eVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwia2V5MlwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JGtpbmQ6IFwiUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcInByb3AxXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQka2luZDogXCJQcm9wZXJ0eVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7fTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0cGF0aDogXCIvU2FsZXNPcmRlckl0ZW1cIixcblx0XHRcdFx0XHRleHBlY3RlZFZhbHVlOiBcImtleTEsa2V5MlwiLFxuXHRcdFx0XHRcdG1lc3NhZ2U6IFwid2l0aCB0ZWNobmljYWwga2V5cyBhbmQgbm8gaW1tdXRhYmxlIHByb3BcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bWV0YU1vZGVsOiB7XG5cdFx0XHRcdFx0XHRnZXRPYmplY3Q6IGZ1bmN0aW9uKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0c3dpdGNoIChzUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIvU2FsZXNPcmRlckl0ZW0vXCI6XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIiRLZXlcIjogW1wia2V5MVwiLCBcImtleTJcIl0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwia2V5MVwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JGtpbmQ6IFwiUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImtleTJcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCRraW5kOiBcIlByb3BlcnR5XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJwcm9wMVwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JGtpbmQ6IFwiUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIvU2FsZXNPcmRlckl0ZW0va2V5MkBcIjpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCI6IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIi9TYWxlc09yZGVySXRlbS9wcm9wMUBcIjpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQE9yZy5PRGF0YS5Db3JlLlYxLkltbXV0YWJsZVwiOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge307XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHBhdGg6IFwiL1NhbGVzT3JkZXJJdGVtXCIsXG5cdFx0XHRcdFx0ZXhwZWN0ZWRWYWx1ZTogXCJrZXkxLHByb3AxXCIsXG5cdFx0XHRcdFx0bWVzc2FnZTogXCJ3aXRoIGEgY29tcHV0ZWQgdGVjaG5pY2FsIGtleVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRtZXRhTW9kZWw6IHtcblx0XHRcdFx0XHRcdGdldE9iamVjdDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHNQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIi9TYWxlc09yZGVySXRlbS9cIjpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiJEtleVwiOiBbXCJrZXkxXCIsIFwia2V5MlwiXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJrZXkxXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQka2luZDogXCJQcm9wZXJ0eVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwia2V5MlwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JGtpbmQ6IFwiUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcInByb3AxXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQka2luZDogXCJQcm9wZXJ0eVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIi9TYWxlc09yZGVySXRlbS9rZXkyQFwiOlxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCI6IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIi9TYWxlc09yZGVySXRlbS9wcm9wMUBcIjpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQE9yZy5PRGF0YS5Db3JlLlYxLkltbXV0YWJsZVwiOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge307XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHBhdGg6IFwiL1NhbGVzT3JkZXJJdGVtXCIsXG5cdFx0XHRcdFx0ZXhwZWN0ZWRWYWx1ZTogXCJrZXkxLHByb3AxXCIsXG5cdFx0XHRcdFx0bWVzc2FnZTogXCJ3aXRoIGEgaGlkZGVuIHRlY2huaWNhbCBrZXlcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bWV0YU1vZGVsOiB7XG5cdFx0XHRcdFx0XHRnZXRPYmplY3Q6IGZ1bmN0aW9uKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0c3dpdGNoIChzUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIvU2FsZXNPcmRlckl0ZW0vXCI6XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIiRLZXlcIjogW1wia2V5MVwiLCBcImtleTJcIl0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwia2V5MVwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JGtpbmQ6IFwiUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImtleTJcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCRraW5kOiBcIlByb3BlcnR5XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJwcm9wMVwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JGtpbmQ6IFwiUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIvU2FsZXNPcmRlckl0ZW0vcHJvcDFAXCI6XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCI6IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7fTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0cGF0aDogXCIvU2FsZXNPcmRlckl0ZW1cIixcblx0XHRcdFx0XHRleHBlY3RlZFZhbHVlOiBcImtleTEsa2V5MlwiLFxuXHRcdFx0XHRcdG1lc3NhZ2U6IFwid2l0aCBhIGhpZGRlbiBwcm9wZXJ0eVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRtZXRhTW9kZWw6IHtcblx0XHRcdFx0XHRcdGdldE9iamVjdDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHNQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIi9TYWxlc09yZGVySXRlbS9cIjpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiJEtleVwiOiBbXCJrZXkxXCIsIFwia2V5MlwiXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJrZXkxXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQka2luZDogXCJQcm9wZXJ0eVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwia2V5MlwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JGtpbmQ6IFwiUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcInByb3AxXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQka2luZDogXCJQcm9wZXJ0eVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIi9TYWxlc09yZGVySXRlbS9wcm9wMUBcIjpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQE9yZy5PRGF0YS5Db3JlLlYxLkltbXV0YWJsZVwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkBPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZFwiOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge307XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHBhdGg6IFwiL1NhbGVzT3JkZXJJdGVtXCIsXG5cdFx0XHRcdFx0ZXhwZWN0ZWRWYWx1ZTogXCJrZXkxLGtleTJcIixcblx0XHRcdFx0XHRtZXNzYWdlOiBcIndpdGggYSBjb21wdXRlZCBwcm9wZXJ0eVwiXG5cdFx0XHRcdH1cblx0XHRcdF0uZm9yRWFjaChmdW5jdGlvbihvRGF0YSkge1xuXHRcdFx0XHRjb25zdCBhS2V5RmllbGRzID0gQ29tbW9uVXRpbHMuZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzKG9EYXRhLm1ldGFNb2RlbCBhcyBPRGF0YU1ldGFNb2RlbCwgb0RhdGEucGF0aCk7XG5cdFx0XHRcdGV4cGVjdChhS2V5RmllbGRzLnRvU3RyaW5nKCkpLnRvRXF1YWwob0RhdGEuZXhwZWN0ZWRWYWx1ZSk7IC8vICxcImdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyBleGVjdXRlZCBcIiArIG9EYXRhLm1lc3NhZ2UgKyBcIiAtLSBPS1wiXG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fSk7XG5cblx0ZGVzY3JpYmUoXCJVbml0IFRlc3QgZm9yIGNoZWNraW5nIFNlbWFudGljIE9iamVjdCBNYXBwaW5nc1wiLCBmdW5jdGlvbigpIHtcblx0XHR0ZXN0KFwiVGVzdGluZyBpZiBzZW1hbnRpYyBPYmplY3QgbWFwcGluZ3MgYXJlIGdldHRpbmcgY29ycmVjdHkgcmVwbGFjZWQgaW4gdGhlIGNvbnRleHQgb3Igbm90XCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29uc3Qgb1NlbGVjdGlvblZhcmlhbnQxID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0XHRcdGNvbnN0IG9TZWxlY3Rpb25WYXJpYW50MiA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KCk7XG5cblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50MS5hZGRTZWxlY3RPcHRpb24oXCJTYWxlc09yZGVyXCIsIFwiSVwiLCBcIkVRXCIsIFwiMjkxOTY4MlwiLCB1bmRlZmluZWQpO1xuXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQxLmFkZFNlbGVjdE9wdGlvbihcIkRlbGl2ZXJlZFwiLCBcIklcIiwgXCJFUVwiLCBcImZhbHNlXCIsIHVuZGVmaW5lZCk7XG5cblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50Mi5hZGRTZWxlY3RPcHRpb24oXCJTYWxlc09yZGVyXCIsIFwiSVwiLCBcIkVRXCIsIFwiMjkxOTY4MlwiLCB1bmRlZmluZWQpO1xuXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQyLmFkZFNlbGVjdE9wdGlvbihcIkNvbXBsZXRlZFwiLCBcIklcIiwgXCJFUVwiLCBcImZhbHNlXCIsIHVuZGVmaW5lZCk7XG5cblx0XHRcdGNvbnN0IHNNYXBwaW5nMSA9ICdbe1wiTG9jYWxQcm9wZXJ0eVwiOntcIiRQcm9wZXJ0eVBhdGhcIjpcIkRlbGl2ZXJlZFwifSxcIlNlbWFudGljT2JqZWN0UHJvcGVydHlcIjpcIkNvbXBsZXRlZFwifV0nO1xuXHRcdFx0Ly8gdmFyIHNNYXBwaW5nMiA9ICdbe1wiTG9jYWxQcm9wZXJ0eVwiOntcIiRQcm9wZXJ0eVBhdGhcIjpcImlzSW1hZ2VVcmxcIn0sXCJTZW1hbnRpY09iamVjdFByb3BlcnR5XCI6XCJJbWFnZUFkZHJlc3NcIn1dJztcblx0XHRcdGV4cGVjdChKU09OLnN0cmluZ2lmeShDb21tb25VdGlscy5zZXRTZW1hbnRpY09iamVjdE1hcHBpbmdzKG9TZWxlY3Rpb25WYXJpYW50MSwgc01hcHBpbmcxIGFzIGFueSkpKS50b0VxdWFsKFxuXHRcdFx0XHRKU09OLnN0cmluZ2lmeShvU2VsZWN0aW9uVmFyaWFudDIpXG5cdFx0XHQpO1xuXHRcdH0pO1xuXHRcdHRlc3QoXCJUZXN0aW5nIGlmIFNlbGVjdGlvblZhcmlhbnQgcmVtYWlucyB1bmNoYW5nZWQgaWYgbm8gTWFwcGluZyBtYXRjaGVzIHdpdGggYW55IGZpZWxkIGluIGNvbnRleHRcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRjb25zdCBvU2VsZWN0aW9uVmFyaWFudDEgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHRcdFx0Y29uc3Qgb1NlbGVjdGlvblZhcmlhbnQyID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblxuXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQxLmFkZFNlbGVjdE9wdGlvbihcIlNhbGVzT3JkZXJcIiwgXCJJXCIsIFwiRVFcIiwgXCIyOTE5NjgyXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHRvU2VsZWN0aW9uVmFyaWFudDEuYWRkU2VsZWN0T3B0aW9uKFwiRGVsaXZlcmVkXCIsIFwiSVwiLCBcIkVRXCIsIFwiZmFsc2VcIiwgdW5kZWZpbmVkKTtcblxuXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQyLmFkZFNlbGVjdE9wdGlvbihcIlNhbGVzT3JkZXJcIiwgXCJJXCIsIFwiRVFcIiwgXCIyOTE5NjgyXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHRvU2VsZWN0aW9uVmFyaWFudDIuYWRkU2VsZWN0T3B0aW9uKFwiQ29tcGxldGVkXCIsIFwiSVwiLCBcIkVRXCIsIFwiZmFsc2VcIiwgdW5kZWZpbmVkKTtcblxuXHRcdFx0Ly8gdmFyIHNNYXBwaW5nMSA9ICdbe1wiTG9jYWxQcm9wZXJ0eVwiOntcIiRQcm9wZXJ0eVBhdGhcIjpcIkRlbGl2ZXJlZFwifSxcIlNlbWFudGljT2JqZWN0UHJvcGVydHlcIjpcIkNvbXBsZXRlZFwifV0nO1xuXHRcdFx0Y29uc3Qgc01hcHBpbmcyID0gJ1t7XCJMb2NhbFByb3BlcnR5XCI6e1wiJFByb3BlcnR5UGF0aFwiOlwiaXNJbWFnZVVybFwifSxcIlNlbWFudGljT2JqZWN0UHJvcGVydHlcIjpcIkltYWdlQWRkcmVzc1wifV0nO1xuXHRcdFx0ZXhwZWN0KEpTT04uc3RyaW5naWZ5KENvbW1vblV0aWxzLnNldFNlbWFudGljT2JqZWN0TWFwcGluZ3Mob1NlbGVjdGlvblZhcmlhbnQxLCBzTWFwcGluZzIgYXMgYW55KSkpLnRvRXF1YWwoXG5cdFx0XHRcdEpTT04uc3RyaW5naWZ5KG9TZWxlY3Rpb25WYXJpYW50MSlcblx0XHRcdCk7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdGRlc2NyaWJlKFwiVW5pdCBUZXN0IGZvciBnZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb25cIiwgZnVuY3Rpb24oKSB7XG5cdFx0dGVzdChcIlVuaXQgVGVzdCBmb3IgZ2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0W1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dmlld0RhdGE6IHtcblx0XHRcdFx0XHRcdGNvbnRyb2xDb25maWd1cmF0aW9uOiB7XG5cdFx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludCNkcDFcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFwibmF2aWdhdGlvblwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcInRhcmdldE91dGJvdW5kXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJvdXRib3VuZFwiOiBcIm91dGJvdW5kMVwiXG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnQjZHAyXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcIm5hdmlnYXRpb25cIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJ0YXJnZXRPdXRib3VuZFwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwib3V0Ym91bmRcIjogXCJvdXRib3VuZDFcIlxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFwidGFyZ2V0U2VjdGlvbnNcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcInNlY3Rpb25JZFwiOiBcInNlY3Rpb25JRDFcIlxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnQjY2hhcnQxXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcIm5hdmlnYXRpb25cIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJ0YXJnZXRPdXRib3VuZFwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwib3V0Ym91bmRcIjogXCJvdXRib3VuZDFcIlxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFwidGFyZ2V0U2VjdGlvbnNcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcInNlY3Rpb25JZFwiOiBcInNlY3Rpb25JRDFcIlxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnQjY2hhcnQyXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcIm5hdmlnYXRpb25cIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJ0YXJnZXRTZWN0aW9uc1wiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwic2VjdGlvbklkXCI6IFwic2VjdGlvbklEMVwiXG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcIl9QYXJ0bmVyL0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5MaW5lSXRlbVwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XCJ0YWJsZVNldHRpbmdzXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwicGVyc29uYWxpemF0aW9uXCI6IGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRjcm9zc05hdjoge1xuXHRcdFx0XHRcdFx0XCJvdXRib3VuZDFcIjoge1xuXHRcdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogXCJTTzFcIixcblx0XHRcdFx0XHRcdFx0YWN0aW9uOiBcImFjdGlvbjFcIlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZXhwZWN0ZWRWYWx1ZToge1xuXHRcdFx0XHRcdFx0XCJmZTo6SGVhZGVyRFBMaW5rOjpEYXRhUG9pbnQ6OmRwMVwiOiB7XG5cdFx0XHRcdFx0XHRcdFwiYWN0aW9uXCI6IFwiYWN0aW9uMVwiLFxuXHRcdFx0XHRcdFx0XHRcInNlbWFudGljT2JqZWN0XCI6IFwiU08xXCIsXG5cdFx0XHRcdFx0XHRcdFwic2VtYW50aWNPYmplY3RNYXBwaW5nXCI6IFtdXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XCJmZTo6SGVhZGVyRFBMaW5rOjpEYXRhUG9pbnQ6OmRwMlwiOiB7XG5cdFx0XHRcdFx0XHRcdFwiYWN0aW9uXCI6IFwiYWN0aW9uMVwiLFxuXHRcdFx0XHRcdFx0XHRcInNlbWFudGljT2JqZWN0XCI6IFwiU08xXCIsXG5cdFx0XHRcdFx0XHRcdFwic2VtYW50aWNPYmplY3RNYXBwaW5nXCI6IFtdXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XCJmZTo6TWljcm9DaGFydExpbms6OkNoYXJ0OjpjaGFydDFcIjoge1xuXHRcdFx0XHRcdFx0XHRcImFjdGlvblwiOiBcImFjdGlvbjFcIixcblx0XHRcdFx0XHRcdFx0XCJzZW1hbnRpY09iamVjdFwiOiBcIlNPMVwiLFxuXHRcdFx0XHRcdFx0XHRcInNlbWFudGljT2JqZWN0TWFwcGluZ1wiOiBbXVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bWVzc2FnZTogXCJ3aXRoIHRhcmdldCBvdXRib3VuZCBjb25maWd1cmVkIHdpdGggdmFsaWQgU08tYWN0aW9uXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHZpZXdEYXRhOiB7XG5cdFx0XHRcdFx0XHRjb250cm9sQ29uZmlndXJhdGlvbjoge1xuXHRcdFx0XHRcdFx0XHRcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnQjZHAxXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcIm5hdmlnYXRpb25cIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJ0YXJnZXRPdXRib3VuZFwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwib3V0Ym91bmRcIjogXCJvdXRib3VuZDFcIlxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YVBvaW50I2RwMlwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XCJuYXZpZ2F0aW9uXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwidGFyZ2V0T3V0Ym91bmRcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIm91dGJvdW5kXCI6IFwib3V0Ym91bmQxXCJcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcInRhcmdldFNlY3Rpb25zXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJzZWN0aW9uSWRcIjogXCJzZWN0aW9uSUQxXCJcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0I2NoYXJ0MVwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XCJuYXZpZ2F0aW9uXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwidGFyZ2V0T3V0Ym91bmRcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIm91dGJvdW5kXCI6IFwib3V0Ym91bmQxXCJcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcInRhcmdldFNlY3Rpb25zXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJzZWN0aW9uSWRcIjogXCJzZWN0aW9uSUQxXCJcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0I2NoYXJ0MlwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XCJuYXZpZ2F0aW9uXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwidGFyZ2V0U2VjdGlvbnNcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcInNlY3Rpb25JZFwiOiBcInNlY3Rpb25JRDFcIlxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XCJfUGFydG5lci9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTGluZUl0ZW1cIjoge1xuXHRcdFx0XHRcdFx0XHRcdFwidGFibGVTZXR0aW5nc1wiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcInBlcnNvbmFsaXphdGlvblwiOiBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Y3Jvc3NOYXY6IHtcblx0XHRcdFx0XHRcdFwib3V0Ym91bmQxXCI6IHt9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRleHBlY3RlZFZhbHVlOiB7fSxcblx0XHRcdFx0XHRtZXNzYWdlOiBcIndpdGggdGFyZ2V0IG91dGJvdW5kIGNvbmZpZ3VyZWQgd2l0aCBubyBTTy1hY3Rpb25cIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dmlld0RhdGE6IHtcblx0XHRcdFx0XHRcdGNvbnRyb2xDb25maWd1cmF0aW9uOiB7XG5cdFx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludCNkcDFcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFwibmF2aWdhdGlvblwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcInRhcmdldE91dGJvdW5kXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJvdXRib3VuZFwiOiBcIm91dGJvdW5kMVwiXG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydCNjaGFydDFcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFwibmF2aWdhdGlvblwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcInRhcmdldE91dGJvdW5kXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJvdXRib3VuZFwiOiBcIm91dGJvdW5kMVwiXG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRjcm9zc05hdjoge1xuXHRcdFx0XHRcdFx0XCJvdXRib3VuZDFcIjoge1xuXHRcdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogXCJTTzFcIixcblx0XHRcdFx0XHRcdFx0YWN0aW9uOiBcImFjdGlvbjFcIixcblx0XHRcdFx0XHRcdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0XHRcdFx0XHRcdFwibWFwcGVkUHJvcGVydHkxXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwidmFsdWVcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcInZhbHVlXCI6IFwibWFpblByb3BlcnR5MVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImZvcm1hdFwiOiBcImJpbmRpbmdcIlxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XCJtYXBwZWRQcm9wZXJ0eTJcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJ2YWx1ZVwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwidmFsdWVcIjogXCJtYWluUHJvcGVydHkyXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiZm9ybWF0XCI6IFwicGxhaW5cIlxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XCJtYWluUHJvcGVydHkzXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwiZGVmYXVsdFZhbHVlXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJ2YWx1ZVwiOiBcIlVzZXJEZWZhdWx0LkdMQWNjb3VudFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImZvcm1hdFwiOiBcInJlZmVyZW5jZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJmaWx0ZXJcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcInZhbHVlXCI6IFwiXFxcXGQrXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiZm9ybWF0XCI6IFwicmVnZXhwXCJcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGV4cGVjdGVkVmFsdWU6IHtcblx0XHRcdFx0XHRcdFwiZmU6OkhlYWRlckRQTGluazo6RGF0YVBvaW50OjpkcDFcIjoge1xuXHRcdFx0XHRcdFx0XHRcImFjdGlvblwiOiBcImFjdGlvbjFcIixcblx0XHRcdFx0XHRcdFx0XCJzZW1hbnRpY09iamVjdFwiOiBcIlNPMVwiLFxuXHRcdFx0XHRcdFx0XHRcInNlbWFudGljT2JqZWN0TWFwcGluZ1wiOiBbXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJMb2NhbFByb3BlcnR5XCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCIkUHJvcGVydHlQYXRoXCI6IFwibWFpblByb3BlcnR5MVwiXG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJTZW1hbnRpY09iamVjdFByb3BlcnR5XCI6IFwibWFwcGVkUHJvcGVydHkxXCJcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcImZlOjpNaWNyb0NoYXJ0TGluazo6Q2hhcnQ6OmNoYXJ0MVwiOiB7XG5cdFx0XHRcdFx0XHRcdFwiYWN0aW9uXCI6IFwiYWN0aW9uMVwiLFxuXHRcdFx0XHRcdFx0XHRcInNlbWFudGljT2JqZWN0XCI6IFwiU08xXCIsXG5cdFx0XHRcdFx0XHRcdFwic2VtYW50aWNPYmplY3RNYXBwaW5nXCI6IFtcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcIkxvY2FsUHJvcGVydHlcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIiRQcm9wZXJ0eVBhdGhcIjogXCJtYWluUHJvcGVydHkxXCJcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcIlNlbWFudGljT2JqZWN0UHJvcGVydHlcIjogXCJtYXBwZWRQcm9wZXJ0eTFcIlxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bWVzc2FnZTogXCJ3aXRoIHRhcmdldCBvdXRib3VuZCBjb25maWd1cmVkIHdpdGggdmFsaWQgU08tYWN0aW9uIGFuZCBzZW1hbnRpYyBtYXBwaW5nXCJcblx0XHRcdFx0fVxuXHRcdFx0XS5mb3JFYWNoKGZ1bmN0aW9uKG9EYXRhKSB7XG5cdFx0XHRcdGNvbnN0IG9IZWFkZXJGYWNldEl0ZW1zID0gQ29tbW9uVXRpbHMuZ2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uKG9EYXRhLnZpZXdEYXRhLCBvRGF0YS5jcm9zc05hdik7XG5cdFx0XHRcdGV4cGVjdChvSGVhZGVyRmFjZXRJdGVtcykudG9FcXVhbChvRGF0YS5leHBlY3RlZFZhbHVlKTsgLy8gLCBcIlVuaXQgdGVzdCB0byBjaGVjayBnZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24gXCIgKyBvRGF0YS5tZXNzYWdlICsgXCI6ICBva1wiXG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fSk7XG5cdGRlc2NyaWJlKFwiVW5pdCBUZXN0IGZvciBnZXRTZW1hbnRpY09iamVjdE1hcHBpbmdcIiwgZnVuY3Rpb24oKSB7XG5cdFx0dGVzdChcIlVuaXQgVGVzdCBmb3IgZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0W1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0b3V0Ym91bmQ6IHtcblx0XHRcdFx0XHRcdFwib3V0Ym91bmQxXCI6IHtcblx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IFwiU08xXCIsXG5cdFx0XHRcdFx0XHRcdGFjdGlvbjogXCJhY3Rpb24xXCJcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGV4cGVjdGVkVmFsdWU6IFtdLFxuXHRcdFx0XHRcdG1lc3NhZ2U6IFwid2l0aCB0YXJnZXQgb3V0Ym91bmQgY29uZmlndXJlZCBubyBzZW1hbnRpY29iamVjdCBtYXBwaW5nXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG91dGJvdW5kOiB7XG5cdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogXCJTTzFcIixcblx0XHRcdFx0XHRcdGFjdGlvbjogXCJhY3Rpb24xXCIsXG5cdFx0XHRcdFx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRcdFx0XHRcdFwibWFwcGVkUHJvcGVydHkxXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcInZhbHVlXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwidmFsdWVcIjogXCJtYWluUHJvcGVydHkxXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcImZvcm1hdFwiOiBcImJpbmRpbmdcIlxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XCJtYXBwZWRQcm9wZXJ0eTJcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFwidmFsdWVcIjoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJ2YWx1ZVwiOiBcIm1haW5Qcm9wZXJ0eTJcIixcblx0XHRcdFx0XHRcdFx0XHRcdFwiZm9ybWF0XCI6IFwicGxhaW5cIlxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XCJtYWluUHJvcGVydHkzXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcImRlZmF1bHRWYWx1ZVwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcInZhbHVlXCI6IFwiVXNlckRlZmF1bHQuR0xBY2NvdW50XCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcImZvcm1hdFwiOiBcInJlZmVyZW5jZVwiXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcImZpbHRlclwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcInZhbHVlXCI6IFwiXFxcXGQrXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcImZvcm1hdFwiOiBcInJlZ2V4cFwiXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcIm1hcHBlZFByb3BlcnR5NFwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XCJ2YWx1ZVwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcInZhbHVlXCI6IFwibWFpblByb3BlcnR5NFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJmb3JtYXRcIjogXCJiaW5kaW5nXCJcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGV4cGVjdGVkVmFsdWU6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJMb2NhbFByb3BlcnR5XCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcIiRQcm9wZXJ0eVBhdGhcIjogXCJtYWluUHJvcGVydHkxXCJcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XCJTZW1hbnRpY09iamVjdFByb3BlcnR5XCI6IFwibWFwcGVkUHJvcGVydHkxXCJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwiTG9jYWxQcm9wZXJ0eVwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XCIkUHJvcGVydHlQYXRoXCI6IFwibWFpblByb3BlcnR5NFwiXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFwiU2VtYW50aWNPYmplY3RQcm9wZXJ0eVwiOiBcIm1hcHBlZFByb3BlcnR5NFwiXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRtZXNzYWdlOiBcIndpdGggdGFyZ2V0IG91dGJvdW5kIGNvbmZpZ3VyZWQgd2l0aCB2YWxpZCBTTy1hY3Rpb24gYW5kIHNlbWFudGljIG1hcHBpbmdcIlxuXHRcdFx0XHR9XG5cdFx0XHRdLmZvckVhY2goZnVuY3Rpb24ob0RhdGEpIHtcblx0XHRcdFx0Y29uc3Qgb0hlYWRlckZhY2V0SXRlbXMgPSBDb21tb25VdGlscy5nZXRTZW1hbnRpY09iamVjdE1hcHBpbmcob0RhdGEub3V0Ym91bmQpO1xuXHRcdFx0XHRleHBlY3Qob0hlYWRlckZhY2V0SXRlbXMpLnRvRXF1YWwob0RhdGEuZXhwZWN0ZWRWYWx1ZSk7IC8vICxcIlVuaXQgdGVzdCB0byBjaGVjayBnZXRTZW1hbnRpY09iamVjdE1hcHBpbmcgXCIgKyBvRGF0YS5tZXNzYWdlICsgXCI6ICBva1wiXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdGRlc2NyaWJlKFwiZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkXCIsICgpID0+IHtcblx0XHRcdHRlc3QoXCJmbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQgZm9yIHVuYm91bmQgYWN0aW9uIGFuZCBzaW5nbGUgNDEyIG1lc3NhZ2UgZnJvbSBiYWNrZW5kXCIsIGFzeW5jIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsZXQgY29uZmlybVdhcm5pbmc6IChtc2c6IHN0cmluZywgb3B0aW9ucz86IG9iamVjdCkgPT4gdm9pZDtcblx0XHRcdFx0bGV0IGNvbmZpcm1TZWxlY3Rpb246IHN0cmluZyA9IFwiVW5ib3VuZEFjdGlvblwiO1xuXHRcdFx0XHRqZXN0LnNweU9uKE1lc3NhZ2VCb3gsIFwid2FybmluZ1wiKS5tb2NrSW1wbGVtZW50YXRpb24oKG1zZzogc3RyaW5nLCBvcHRpb25zPzogYW55KSA9PlxuXHRcdFx0XHRcdGNvbmZpcm1XYXJuaW5nLmNhbGwobnVsbCwgbXNnLCBvcHRpb25zKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGNvbmZpcm1XYXJuaW5nID0gKG1zZzogc3RyaW5nLCBvcHRpb25zPzogYW55KSA9PiB7XG5cdFx0XHRcdFx0ZXhwZWN0KG9wdGlvbnMudGl0bGUpLnRvRXF1YWwoXCJXYXJuaW5nXCIpO1xuXHRcdFx0XHRcdGV4cGVjdChtc2cpLnRvRXF1YWwoXCJVbmFibGUgdG8gZXhlY3V0ZSB0aGUgYWN0aW9uIGR1ZSB0byBhIHdhcm5pbmdcIiArIFwiXFxuXCIgKyBcIlByb2NlZWQgYW55d2F5P1wiKTtcblx0XHRcdFx0XHRvcHRpb25zLm9uQ2xvc2UoY29uZmlybVNlbGVjdGlvbik7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y29uc3Qgb01vZGVsOiBPRGF0YU1vZGVsIHwgYW55ID0ge1xuXHRcdFx0XHRcdHN1Ym1pdEJhdGNoOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKFByb21pc2UucmVzb2x2ZSh7fSkpXG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbnN0IGFNZXNzYWdlcyA9IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRtZXNzYWdlOiBcIlVuYWJsZSB0byBleGVjdXRlIHRoZSBhY3Rpb24gZHVlIHRvIGEgd2FybmluZ1wiXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRdO1xuXHRcdFx0XHRhd2FpdCBDb21tb25VdGlscy5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQoXCJhY3Rpb25JbXBvcnRcIiwgXCJVbmJvdW5kQWN0aW9uXCIsIG9Nb2RlbCwgYU1lc3NhZ2VzKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0ZXN0KFwiZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkIGZvciB1bmJvdW5kIGFjdGlvbiBhbmQgbXVsdGlwbGUgNDEyIG1lc3NhZ2VzIGZyb20gYmFja2VuZCAtIGlnbm9yZSB3YXJuaW5ncyBhbmQgY29udGludWVcIiwgYXN5bmMgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxldCBvTW9ja3ByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZyA9IGplc3Quc3B5T24oTWVzc2FnZUhhbmRsaW5nLCBcInByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZ1wiKTtcblx0XHRcdFx0b01vY2twcmVwYXJlTWVzc2FnZVZpZXdGb3JEaWFsb2cubW9ja0ltcGxlbWVudGF0aW9uT25jZSgoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb01lc3NhZ2VWaWV3ID0gbmV3IE1lc3NhZ2VWaWV3KHtcblx0XHRcdFx0XHRcdHNob3dEZXRhaWxzUGFnZUhlYWRlcjogZmFsc2Vcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0b01lc3NhZ2VWaWV3OiBvTWVzc2FnZVZpZXcsXG5cdFx0XHRcdFx0XHRiaGFzRXRhZ01lc3NhZ2U6IGZhbHNlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGxldCBvRGlhbG9nT3BlblN0dWIgPSBqZXN0LnNweU9uKERpYWxvZy5wcm90b3R5cGUsIFwib3BlblwiKTtcblx0XHRcdFx0b0RpYWxvZ09wZW5TdHViLm1vY2tJbXBsZW1lbnRhdGlvbihmdW5jdGlvbih0aGlzOiBEaWFsb2cpIHtcblx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQnV0dG9uID0gdGhpcy5nZXRCZWdpbkJ1dHRvbigpO1xuXHRcdFx0XHRcdG9BY3Rpb25CdXR0b24uZmlyZVByZXNzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb25zdCBvTW9kZWw6IE9EYXRhTW9kZWwgfCBhbnkgPSB7XG5cdFx0XHRcdFx0c3VibWl0QmF0Y2g6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoUHJvbWlzZS5yZXNvbHZlKHt9KSlcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3QgYU1lc3NhZ2VzID0gW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG1lc3NhZ2U6IFwiVW5hYmxlIHRvIGV4ZWN1dGUgdGhlIGFjdGlvbiBkdWUgdG8gYSB3YXJuaW5nXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG1lc3NhZ2U6IFwiVW5hYmxlIHRvIGV4ZWN1dGUgdGhlIGFjdGlvbiBkdWUgdG8gYSB3YXJuaW5nXCJcblx0XHRcdFx0XHR9XG5cdFx0XHRcdF07XG5cdFx0XHRcdGF3YWl0IGV4cGVjdChDb21tb25VdGlscy5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQoXCJhY3Rpb25JbXBvcnRcIiwgXCJVbmJvdW5kQWN0aW9uXCIsIG9Nb2RlbCwgYU1lc3NhZ2VzKSk7XG5cdFx0XHRcdGV4cGVjdChvTW9ja3ByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZykudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuXHRcdFx0XHRleHBlY3Qob0RpYWxvZ09wZW5TdHViKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGVzdChcImZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZCBmb3IgdW5ib3VuZCBhY3Rpb24gYW5kIG11bHRpcGxlIDQxMiBtZXNzYWdlcyBmcm9tIGJhY2tlbmQgLSBjYW5jZWxcIiwgYXN5bmMgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxldCBvTW9ja3ByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZyA9IGplc3Quc3B5T24oTWVzc2FnZUhhbmRsaW5nLCBcInByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZ1wiKTtcblx0XHRcdFx0b01vY2twcmVwYXJlTWVzc2FnZVZpZXdGb3JEaWFsb2cubW9ja0ltcGxlbWVudGF0aW9uT25jZSgoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb01lc3NhZ2VWaWV3ID0gbmV3IE1lc3NhZ2VWaWV3KHtcblx0XHRcdFx0XHRcdHNob3dEZXRhaWxzUGFnZUhlYWRlcjogZmFsc2Vcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0b01lc3NhZ2VWaWV3OiBvTWVzc2FnZVZpZXcsXG5cdFx0XHRcdFx0XHRiaGFzRXRhZ01lc3NhZ2U6IGZhbHNlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGxldCBvRGlhbG9nT3BlblN0dWIgPSBqZXN0LnNweU9uKERpYWxvZy5wcm90b3R5cGUsIFwib3BlblwiKTtcblx0XHRcdFx0b0RpYWxvZ09wZW5TdHViLm1vY2tJbXBsZW1lbnRhdGlvbihmdW5jdGlvbih0aGlzOiBEaWFsb2cpIHtcblx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQnV0dG9uID0gdGhpcy5nZXRFbmRCdXR0b24oKTtcblx0XHRcdFx0XHRvQWN0aW9uQnV0dG9uLmZpcmVQcmVzcygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0Y29uc3Qgb01vZGVsOiBPRGF0YU1vZGVsIHwgYW55ID0ge1xuXHRcdFx0XHRcdHN1Ym1pdEJhdGNoOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKFByb21pc2UucmVzb2x2ZSh7fSkpXG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbnN0IGFNZXNzYWdlcyA9IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRtZXNzYWdlOiBcIlVuYWJsZSB0byBleGVjdXRlIHRoZSBhY3Rpb24gZHVlIHRvIGEgd2FybmluZ1wiXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRtZXNzYWdlOiBcIlVuYWJsZSB0byBleGVjdXRlIHRoZSBhY3Rpb24gZHVlIHRvIGEgd2FybmluZ1wiXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRdO1xuXHRcdFx0XHRhd2FpdCBleHBlY3QoQ29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkKFwiYWN0aW9uSW1wb3J0XCIsIFwiVW5ib3VuZEFjdGlvblwiLCBvTW9kZWwsIGFNZXNzYWdlcykpO1xuXHRcdFx0XHRleHBlY3Qob01vY2twcmVwYXJlTWVzc2FnZVZpZXdGb3JEaWFsb2cpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcblx0XHRcdFx0ZXhwZWN0KG9EaWFsb2dPcGVuU3R1YikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH0pO1xufSk7XG4iXX0=