@sapui5/sap.fe.core 1.101.0 → 1.103.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 (339) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +66 -30
  4. package/src/sap/fe/core/AppComponent.ts +68 -51
  5. package/src/sap/fe/core/AppStateHandler.js +13 -13
  6. package/src/sap/fe/core/AppStateHandler.ts +18 -18
  7. package/src/sap/fe/core/BaseController.js +11 -9
  8. package/src/sap/fe/core/BaseController.ts +15 -13
  9. package/src/sap/fe/core/CommonUtils.js +279 -188
  10. package/src/sap/fe/core/CommonUtils.ts +306 -215
  11. package/src/sap/fe/core/ExtensionAPI.js +25 -30
  12. package/src/sap/fe/core/ExtensionAPI.ts +37 -41
  13. package/src/sap/fe/core/PageController.js +12 -7
  14. package/src/sap/fe/core/PageController.ts +10 -5
  15. package/src/sap/fe/core/TemplateComponent.js +6 -6
  16. package/src/sap/fe/core/TemplateComponent.ts +11 -11
  17. package/src/sap/fe/core/TemplateModel.js +2 -2
  18. package/src/sap/fe/core/TemplateModel.ts +3 -3
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +306 -78
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +280 -70
  23. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +27 -27
  24. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +28 -26
  25. package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
  26. package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
  27. package/src/sap/fe/core/controllerextensions/EditFlow.js +351 -229
  28. package/src/sap/fe/core/controllerextensions/EditFlow.ts +321 -246
  29. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
  30. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  31. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +59 -34
  32. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +71 -45
  33. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +72 -72
  34. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +82 -80
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +152 -131
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +171 -152
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  39. package/src/sap/fe/core/controllerextensions/MassEdit.js +11 -10
  40. package/src/sap/fe/core/controllerextensions/MassEdit.ts +31 -37
  41. package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -13
  42. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +30 -15
  43. package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
  44. package/src/sap/fe/core/controllerextensions/PageReady.ts +94 -34
  45. package/src/sap/fe/core/controllerextensions/Paginator.js +19 -11
  46. package/src/sap/fe/core/controllerextensions/Paginator.ts +22 -14
  47. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
  48. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  49. package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
  50. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  51. package/src/sap/fe/core/controllerextensions/Share.js +39 -21
  52. package/src/sap/fe/core/controllerextensions/Share.ts +45 -26
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +47 -51
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +58 -62
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +75 -62
  56. package/src/sap/fe/core/controllerextensions/ViewState.ts +78 -63
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
  58. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +99 -0
  59. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
  60. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +58 -112
  61. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.js +2 -2
  62. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +7 -7
  63. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +262 -0
  64. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +20 -21
  65. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ManageDialog.fragment.xml +0 -0
  66. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
  67. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1631 -0
  68. package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +270 -211
  69. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +772 -0
  70. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +240 -100
  71. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1199 -0
  72. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +364 -229
  73. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +188 -0
  74. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +185 -0
  75. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +626 -0
  76. package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +112 -69
  77. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +937 -0
  78. package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +72 -73
  79. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
  80. package/src/sap/fe/core/controls/Any.js +9 -5
  81. package/src/sap/fe/core/controls/Any.ts +10 -4
  82. package/src/sap/fe/core/controls/CommandExecution.js +21 -24
  83. package/src/sap/fe/core/controls/CommandExecution.ts +19 -24
  84. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  85. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  86. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +48 -43
  87. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +51 -46
  88. package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
  89. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +3 -2
  90. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +11 -3
  91. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +19 -9
  92. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +14 -8
  93. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  94. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  95. package/src/sap/fe/core/controls/FileWrapper.js +50 -3
  96. package/src/sap/fe/core/controls/FileWrapper.ts +45 -12
  97. package/src/sap/fe/core/controls/FilterBar.js +6 -2
  98. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  99. package/src/sap/fe/core/controls/FormElementWrapper.js +12 -2
  100. package/src/sap/fe/core/controls/FormElementWrapper.ts +14 -3
  101. package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
  102. package/src/sap/fe/core/controls/MassEditSelect.ts +41 -0
  103. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
  104. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
  105. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  106. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
  107. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  108. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +48 -48
  109. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +71 -76
  110. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +36 -65
  111. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
  112. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +551 -36
  113. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +605 -36
  114. package/src/sap/fe/core/converters/ConverterContext.js +26 -33
  115. package/src/sap/fe/core/converters/ConverterContext.ts +51 -60
  116. package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
  117. package/src/sap/fe/core/converters/ManifestSettings.ts +17 -14
  118. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  119. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  120. package/src/sap/fe/core/converters/MetaModelConverter.js +56 -67
  121. package/src/sap/fe/core/converters/MetaModelConverter.ts +183 -193
  122. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  123. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  124. package/src/sap/fe/core/converters/annotations/DataField.js +73 -37
  125. package/src/sap/fe/core/converters/annotations/DataField.ts +121 -77
  126. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
  127. package/src/sap/fe/core/converters/controls/Common/Action.js +51 -49
  128. package/src/sap/fe/core/converters/controls/Common/Action.ts +58 -54
  129. package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -15
  130. package/src/sap/fe/core/converters/controls/Common/Chart.ts +29 -27
  131. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  132. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  133. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +28 -28
  134. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +40 -36
  135. package/src/sap/fe/core/converters/controls/Common/Form.js +30 -34
  136. package/src/sap/fe/core/converters/controls/Common/Form.ts +48 -58
  137. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  138. package/src/sap/fe/core/converters/controls/Common/KPI.ts +35 -39
  139. package/src/sap/fe/core/converters/controls/Common/Table.js +318 -244
  140. package/src/sap/fe/core/converters/controls/Common/Table.ts +368 -297
  141. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +135 -125
  142. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +162 -148
  143. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +51 -45
  144. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +79 -67
  145. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  146. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  147. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  148. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  149. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
  150. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
  151. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +92 -89
  152. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +124 -120
  153. package/src/sap/fe/core/converters/helpers/Aggregation.js +11 -5
  154. package/src/sap/fe/core/converters/helpers/Aggregation.ts +25 -23
  155. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -30
  156. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +31 -29
  157. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
  158. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
  159. package/src/sap/fe/core/converters/helpers/ID.js +46 -46
  160. package/src/sap/fe/core/converters/helpers/ID.ts +25 -25
  161. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  162. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  163. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  164. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -4
  165. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  166. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  167. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
  168. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
  169. package/src/sap/fe/core/converters/templates/ListReportConverter.js +30 -29
  170. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +40 -40
  171. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +56 -55
  172. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +65 -77
  173. package/src/sap/fe/core/designtime/AppComponent.designtime.js +6 -6
  174. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +10 -8
  175. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  176. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  177. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  178. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  179. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  180. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  181. package/src/sap/fe/core/formatters/StandardFormatter.js +89 -0
  182. package/src/sap/fe/core/formatters/StandardFormatter.ts +64 -0
  183. package/src/sap/fe/core/formatters/TableFormatter.js +83 -22
  184. package/src/sap/fe/core/formatters/TableFormatter.ts +80 -25
  185. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  186. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  187. package/src/sap/fe/core/fpm/Component.js +2 -2
  188. package/src/sap/fe/core/fpm/Component.ts +1 -1
  189. package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
  190. package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
  191. package/src/sap/fe/core/helpers/BindingToolkit.js +1809 -0
  192. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +388 -285
  193. package/src/sap/fe/core/helpers/ClassSupport.js +20 -11
  194. package/src/sap/fe/core/helpers/ClassSupport.ts +15 -10
  195. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  196. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  197. package/src/sap/fe/core/helpers/EditState.js +1 -6
  198. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  199. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  200. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  201. package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
  202. package/src/sap/fe/core/helpers/FPMHelper.ts +10 -9
  203. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  204. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  205. package/src/sap/fe/core/helpers/MassEditHelper.js +532 -264
  206. package/src/sap/fe/core/helpers/MassEditHelper.ts +560 -289
  207. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  208. package/src/sap/fe/core/helpers/ModelHelper.ts +50 -58
  209. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  210. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  211. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  212. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  213. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  214. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  215. package/src/sap/fe/core/helpers/StableIdHelper.js +16 -12
  216. package/src/sap/fe/core/helpers/StableIdHelper.ts +20 -16
  217. package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
  218. package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
  219. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  220. package/src/sap/fe/core/jsx-runtime/jsx.ts +8 -8
  221. package/src/sap/fe/core/library.js +51 -3
  222. package/src/sap/fe/core/library.ts +47 -0
  223. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  224. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  225. package/src/sap/fe/core/messagebundle.properties +151 -197
  226. package/src/sap/fe/core/messagebundle_ar.properties +36 -63
  227. package/src/sap/fe/core/messagebundle_bg.properties +36 -63
  228. package/src/sap/fe/core/messagebundle_ca.properties +36 -63
  229. package/src/sap/fe/core/messagebundle_cs.properties +36 -63
  230. package/src/sap/fe/core/messagebundle_cy.properties +36 -63
  231. package/src/sap/fe/core/messagebundle_da.properties +37 -64
  232. package/src/sap/fe/core/messagebundle_de.properties +36 -63
  233. package/src/sap/fe/core/messagebundle_el.properties +38 -65
  234. package/src/sap/fe/core/messagebundle_en.properties +37 -64
  235. package/src/sap/fe/core/messagebundle_en_GB.properties +37 -64
  236. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +44 -73
  237. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +37 -64
  238. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +52 -81
  239. package/src/sap/fe/core/messagebundle_es.properties +36 -63
  240. package/src/sap/fe/core/messagebundle_es_MX.properties +36 -63
  241. package/src/sap/fe/core/messagebundle_et.properties +36 -63
  242. package/src/sap/fe/core/messagebundle_fi.properties +36 -63
  243. package/src/sap/fe/core/messagebundle_fr.properties +39 -66
  244. package/src/sap/fe/core/messagebundle_fr_CA.properties +36 -63
  245. package/src/sap/fe/core/messagebundle_hi.properties +36 -63
  246. package/src/sap/fe/core/messagebundle_hr.properties +36 -63
  247. package/src/sap/fe/core/messagebundle_hu.properties +35 -62
  248. package/src/sap/fe/core/messagebundle_id.properties +37 -64
  249. package/src/sap/fe/core/messagebundle_it.properties +54 -81
  250. package/src/sap/fe/core/messagebundle_iw.properties +36 -63
  251. package/src/sap/fe/core/messagebundle_ja.properties +36 -63
  252. package/src/sap/fe/core/messagebundle_kk.properties +36 -63
  253. package/src/sap/fe/core/messagebundle_ko.properties +36 -63
  254. package/src/sap/fe/core/messagebundle_lt.properties +36 -63
  255. package/src/sap/fe/core/messagebundle_lv.properties +36 -63
  256. package/src/sap/fe/core/messagebundle_ms.properties +37 -64
  257. package/src/sap/fe/core/messagebundle_nl.properties +37 -64
  258. package/src/sap/fe/core/messagebundle_no.properties +36 -63
  259. package/src/sap/fe/core/messagebundle_pl.properties +37 -64
  260. package/src/sap/fe/core/messagebundle_pt.properties +37 -64
  261. package/src/sap/fe/core/messagebundle_pt_PT.properties +36 -63
  262. package/src/sap/fe/core/messagebundle_ro.properties +36 -63
  263. package/src/sap/fe/core/messagebundle_ru.properties +36 -63
  264. package/src/sap/fe/core/messagebundle_sh.properties +36 -63
  265. package/src/sap/fe/core/messagebundle_sk.properties +36 -63
  266. package/src/sap/fe/core/messagebundle_sl.properties +38 -65
  267. package/src/sap/fe/core/messagebundle_sv.properties +36 -63
  268. package/src/sap/fe/core/messagebundle_th.properties +36 -63
  269. package/src/sap/fe/core/messagebundle_tr.properties +36 -63
  270. package/src/sap/fe/core/messagebundle_uk.properties +37 -64
  271. package/src/sap/fe/core/messagebundle_vi.properties +37 -64
  272. package/src/sap/fe/core/messagebundle_zh_CN.properties +36 -63
  273. package/src/sap/fe/core/messagebundle_zh_TW.properties +37 -64
  274. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  275. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  276. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +2 -2
  277. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +14 -14
  278. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +6 -3
  279. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +12 -10
  280. package/src/sap/fe/core/services/NavigationServiceFactory.js +54 -45
  281. package/src/sap/fe/core/services/NavigationServiceFactory.ts +61 -49
  282. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  283. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  284. package/src/sap/fe/core/services/RoutingServiceFactory.js +63 -60
  285. package/src/sap/fe/core/services/RoutingServiceFactory.ts +76 -73
  286. package/src/sap/fe/core/services/ShellServicesFactory.js +102 -71
  287. package/src/sap/fe/core/services/ShellServicesFactory.ts +109 -78
  288. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
  289. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  290. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +24 -18
  291. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +53 -50
  292. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  293. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  294. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  295. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  296. package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
  297. package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
  298. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  299. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  300. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  301. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  302. package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
  303. package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
  304. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  305. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +3 -4
  306. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -15
  307. package/src/sap/fe/core/templating/EntitySetHelper.ts +14 -18
  308. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  309. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  310. package/src/sap/fe/core/templating/FilterHelper.js +12 -11
  311. package/src/sap/fe/core/templating/FilterHelper.ts +17 -16
  312. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  313. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  314. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  315. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  316. package/src/sap/fe/core/templating/PropertyHelper.js +79 -56
  317. package/src/sap/fe/core/templating/PropertyHelper.ts +41 -27
  318. package/src/sap/fe/core/templating/UIFormatters.js +163 -97
  319. package/src/sap/fe/core/templating/UIFormatters.ts +210 -129
  320. package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
  321. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
  322. package/src/sap/fe/core/type/Email.js +2 -2
  323. package/src/sap/fe/core/type/Email.ts +2 -2
  324. package/src/sap/fe/core/AnnotationHelper.js +0 -331
  325. package/src/sap/fe/core/AnnotationHelper.ts +0 -321
  326. package/src/sap/fe/core/RouterProxy.js +0 -938
  327. package/src/sap/fe/core/TransactionHelper.js +0 -1577
  328. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -406
  329. package/src/sap/fe/core/actions/collaboration/Manage.js +0 -264
  330. package/src/sap/fe/core/actions/draft.js +0 -665
  331. package/src/sap/fe/core/actions/messageHandling.js +0 -579
  332. package/src/sap/fe/core/actions/nonDraft.js +0 -20
  333. package/src/sap/fe/core/actions/nonDraft.ts +0 -12
  334. package/src/sap/fe/core/actions/operations.js +0 -1096
  335. package/src/sap/fe/core/actions/sticky.js +0 -130
  336. package/src/sap/fe/core/actions/sticky.ts +0 -119
  337. package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
  338. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
  339. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1729
@@ -1,1729 +0,0 @@
1
- /*!
2
- * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
- */
5
- sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
6
- "use strict";
7
-
8
- var _exports = {};
9
- var resolveEnumValue = AnnotationEnum.resolveEnumValue;
10
-
11
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
12
-
13
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
14
-
15
- function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
16
-
17
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
18
-
19
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
20
-
21
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
22
-
23
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
24
-
25
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
26
-
27
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
28
-
29
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
30
-
31
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
32
-
33
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
34
-
35
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
36
-
37
- var unresolveableExpression = {
38
- _type: "Unresolvable"
39
- };
40
- _exports.unresolveableExpression = unresolveableExpression;
41
-
42
- function escapeXmlAttribute(inputString) {
43
- return inputString.replace(/'/g, "\\'");
44
- }
45
-
46
- function hasUnresolveableExpression() {
47
- for (var _len = arguments.length, expressions = new Array(_len), _key = 0; _key < _len; _key++) {
48
- expressions[_key] = arguments[_key];
49
- }
50
-
51
- return expressions.find(function (expr) {
52
- return expr._type === "Unresolvable";
53
- }) !== undefined;
54
- }
55
- /**
56
- * Check two expressions for (deep) equality.
57
- *
58
- * @param a
59
- * @param b
60
- * @returns {boolean} `true` if the two expressions are equal
61
- */
62
-
63
-
64
- _exports.hasUnresolveableExpression = hasUnresolveableExpression;
65
-
66
- function _checkExpressionsAreEqual(a, b) {
67
- if (a._type !== b._type) {
68
- return false;
69
- }
70
-
71
- switch (a._type) {
72
- case "Unresolvable":
73
- return false;
74
- // Unresolvable is never equal to anything even itself
75
-
76
- case "Constant":
77
- case "EmbeddedBinding":
78
- case "EmbeddedExpressionBinding":
79
- return a.value === b.value;
80
-
81
- case "Not":
82
- return _checkExpressionsAreEqual(a.operand, b.operand);
83
-
84
- case "Truthy":
85
- return _checkExpressionsAreEqual(a.operand, b.operand);
86
-
87
- case "Set":
88
- return a.operator === b.operator && a.operands.length === b.operands.length && a.operands.every(function (expression) {
89
- return b.operands.some(function (otherExpression) {
90
- return _checkExpressionsAreEqual(expression, otherExpression);
91
- });
92
- });
93
-
94
- case "IfElse":
95
- return _checkExpressionsAreEqual(a.condition, b.condition) && _checkExpressionsAreEqual(a.onTrue, b.onTrue) && _checkExpressionsAreEqual(a.onFalse, b.onFalse);
96
-
97
- case "Comparison":
98
- return a.operator === b.operator && _checkExpressionsAreEqual(a.operand1, b.operand1) && _checkExpressionsAreEqual(a.operand2, b.operand2);
99
-
100
- case "Concat":
101
- var aExpressions = a.expressions;
102
- var bExpressions = b.expressions;
103
-
104
- if (aExpressions.length !== bExpressions.length) {
105
- return false;
106
- }
107
-
108
- return aExpressions.every(function (expression, index) {
109
- return _checkExpressionsAreEqual(expression, bExpressions[index]);
110
- });
111
-
112
- case "Length":
113
- return _checkExpressionsAreEqual(a.bindingExpression, b.bindingExpression);
114
-
115
- case "Binding":
116
- return a.modelName === b.modelName && a.path === b.path && a.targetEntitySet === b.targetEntitySet;
117
-
118
- case "DefaultBinding":
119
- return a.modelName === b.modelName && a.path === b.path;
120
-
121
- case "Formatter":
122
- return a.fn === b.fn && a.parameters.length === b.parameters.length && a.parameters.every(function (value, index) {
123
- return _checkExpressionsAreEqual(b.parameters[index], value);
124
- });
125
-
126
- case "ComplexType":
127
- return a.type === b.type && a.bindingParameters.length === b.bindingParameters.length && a.bindingParameters.every(function (value, index) {
128
- return _checkExpressionsAreEqual(b.bindingParameters[index], value);
129
- });
130
-
131
- case "Function":
132
- var otherFunction = b;
133
-
134
- if (a.obj === undefined || otherFunction.obj === undefined) {
135
- return a.obj === otherFunction;
136
- }
137
-
138
- return a.fn === otherFunction.fn && _checkExpressionsAreEqual(a.obj, otherFunction.obj) && a.parameters.length === otherFunction.parameters.length && a.parameters.every(function (value, index) {
139
- return _checkExpressionsAreEqual(otherFunction.parameters[index], value);
140
- });
141
-
142
- case "Ref":
143
- return a.ref === b.ref;
144
- }
145
-
146
- return false;
147
- }
148
- /**
149
- * Converts a nested SetExpression by inlining operands of type SetExpression with the same operator.
150
- *
151
- * @param expression The expression to flatten
152
- * @returns {SetExpression} A new SetExpression with the same operator
153
- */
154
-
155
-
156
- _exports._checkExpressionsAreEqual = _checkExpressionsAreEqual;
157
-
158
- function flattenSetExpression(expression) {
159
- return expression.operands.reduce(function (result, operand) {
160
- var candidatesForFlattening = operand._type === "Set" && operand.operator === expression.operator ? operand.operands : [operand];
161
- candidatesForFlattening.forEach(function (candidate) {
162
- if (result.operands.every(function (e) {
163
- return !_checkExpressionsAreEqual(e, candidate);
164
- })) {
165
- result.operands.push(candidate);
166
- }
167
- });
168
- return result;
169
- }, {
170
- _type: "Set",
171
- operator: expression.operator,
172
- operands: []
173
- });
174
- }
175
- /**
176
- * Detects whether an array of boolean expressions contains an expression and its negation.
177
- *
178
- * @param expressions Array of expressions
179
- * @returns {boolean} `true` if the set of expressions contains an expression and its negation
180
- */
181
-
182
-
183
- function hasOppositeExpressions(expressions) {
184
- var negatedExpressions = expressions.map(not);
185
- return expressions.some(function (expression, index) {
186
- for (var i = index + 1; i < negatedExpressions.length; i++) {
187
- if (_checkExpressionsAreEqual(expression, negatedExpressions[i])) {
188
- return true;
189
- }
190
- }
191
-
192
- return false;
193
- });
194
- }
195
- /**
196
- * Logical `and` expression.
197
- *
198
- * The expression is simplified to false if this can be decided statically (that is, if one operand is a constant
199
- * false or if the expression contains an operand and its negation).
200
- *
201
- * @param operands Expressions to connect by `and`
202
- * @returns {Expression<boolean>} Expression evaluating to boolean
203
- */
204
-
205
-
206
- function and() {
207
- for (var _len2 = arguments.length, operands = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
208
- operands[_key2] = arguments[_key2];
209
- }
210
-
211
- var expressions = flattenSetExpression({
212
- _type: "Set",
213
- operator: "&&",
214
- operands: operands.map(wrapPrimitive)
215
- }).operands;
216
-
217
- if (hasUnresolveableExpression.apply(void 0, _toConsumableArray(expressions))) {
218
- return unresolveableExpression;
219
- }
220
-
221
- var isStaticFalse = false;
222
- var nonTrivialExpression = expressions.filter(function (expression) {
223
- if (isFalse(expression)) {
224
- isStaticFalse = true;
225
- }
226
-
227
- return !isConstant(expression);
228
- });
229
-
230
- if (isStaticFalse) {
231
- return constant(false);
232
- } else if (nonTrivialExpression.length === 0) {
233
- // Resolve the constant then
234
- var isValid = expressions.reduce(function (result, expression) {
235
- return result && isTrue(expression);
236
- }, true);
237
- return constant(isValid);
238
- } else if (nonTrivialExpression.length === 1) {
239
- return nonTrivialExpression[0];
240
- } else if (hasOppositeExpressions(nonTrivialExpression)) {
241
- return constant(false);
242
- } else {
243
- return {
244
- _type: "Set",
245
- operator: "&&",
246
- operands: nonTrivialExpression
247
- };
248
- }
249
- }
250
- /**
251
- * Logical `or` expression.
252
- *
253
- * The expression is simplified to true if this can be decided statically (that is, if one operand is a constant
254
- * true or if the expression contains an operand and its negation).
255
- *
256
- * @param operands Expressions to connect by `or`
257
- * @returns {Expression<boolean>} Expression evaluating to boolean
258
- */
259
-
260
-
261
- _exports.and = and;
262
-
263
- function or() {
264
- for (var _len3 = arguments.length, operands = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
265
- operands[_key3] = arguments[_key3];
266
- }
267
-
268
- var expressions = flattenSetExpression({
269
- _type: "Set",
270
- operator: "||",
271
- operands: operands.map(wrapPrimitive)
272
- }).operands;
273
-
274
- if (hasUnresolveableExpression.apply(void 0, _toConsumableArray(expressions))) {
275
- return unresolveableExpression;
276
- }
277
-
278
- var isStaticTrue = false;
279
- var nonTrivialExpression = expressions.filter(function (expression) {
280
- if (isTrue(expression)) {
281
- isStaticTrue = true;
282
- }
283
-
284
- return !isConstant(expression) || expression.value;
285
- });
286
-
287
- if (isStaticTrue) {
288
- return constant(true);
289
- } else if (nonTrivialExpression.length === 0) {
290
- // Resolve the constant then
291
- var isValid = expressions.reduce(function (result, expression) {
292
- return result && isTrue(expression);
293
- }, true);
294
- return constant(isValid);
295
- } else if (nonTrivialExpression.length === 1) {
296
- return nonTrivialExpression[0];
297
- } else if (hasOppositeExpressions(nonTrivialExpression)) {
298
- return constant(true);
299
- } else {
300
- return {
301
- _type: "Set",
302
- operator: "||",
303
- operands: nonTrivialExpression
304
- };
305
- }
306
- }
307
- /**
308
- * Logical `not` operator.
309
- *
310
- * @param operand The expression to reverse
311
- * @returns {Expression<boolean>} The resulting expression that evaluates to boolean
312
- */
313
-
314
-
315
- _exports.or = or;
316
-
317
- function not(operand) {
318
- operand = wrapPrimitive(operand);
319
-
320
- if (hasUnresolveableExpression(operand)) {
321
- return unresolveableExpression;
322
- } else if (isConstant(operand)) {
323
- return constant(!operand.value);
324
- } else if (typeof operand === "object" && operand._type === "Set" && operand.operator === "||" && operand.operands.every(function (expression) {
325
- return isConstant(expression) || isComparison(expression);
326
- })) {
327
- return and.apply(void 0, _toConsumableArray(operand.operands.map(function (expression) {
328
- return not(expression);
329
- })));
330
- } else if (typeof operand === "object" && operand._type === "Set" && operand.operator === "&&" && operand.operands.every(function (expression) {
331
- return isConstant(expression) || isComparison(expression);
332
- })) {
333
- return or.apply(void 0, _toConsumableArray(operand.operands.map(function (expression) {
334
- return not(expression);
335
- })));
336
- } else if (isComparison(operand)) {
337
- // Create the reverse comparison
338
- switch (operand.operator) {
339
- case "!==":
340
- return _objectSpread(_objectSpread({}, operand), {}, {
341
- operator: "==="
342
- });
343
-
344
- case "<":
345
- return _objectSpread(_objectSpread({}, operand), {}, {
346
- operator: ">="
347
- });
348
-
349
- case "<=":
350
- return _objectSpread(_objectSpread({}, operand), {}, {
351
- operator: ">"
352
- });
353
-
354
- case "===":
355
- return _objectSpread(_objectSpread({}, operand), {}, {
356
- operator: "!=="
357
- });
358
-
359
- case ">":
360
- return _objectSpread(_objectSpread({}, operand), {}, {
361
- operator: "<="
362
- });
363
-
364
- case ">=":
365
- return _objectSpread(_objectSpread({}, operand), {}, {
366
- operator: "<"
367
- });
368
- }
369
- } else if (operand._type === "Not") {
370
- return operand.operand;
371
- }
372
-
373
- return {
374
- _type: "Not",
375
- operand: operand
376
- };
377
- }
378
- /**
379
- * Evaluates whether a binding expression is equal to true with a loose equality.
380
- *
381
- * @param operand The expression to check
382
- * @returns {Expression<boolean>} The resulting expression that evaluates to boolean
383
- */
384
-
385
-
386
- _exports.not = not;
387
-
388
- function isTruthy(operand) {
389
- if (isConstant(operand)) {
390
- return constant(!!operand.value);
391
- } else {
392
- return {
393
- _type: "Truthy",
394
- operand: operand
395
- };
396
- }
397
- }
398
- /**
399
- * Creates a binding expression that will be evaluated by the corresponding model.
400
- *
401
- * @template TargetType
402
- * @param path The path on the model
403
- * @param [modelName] The name of the model
404
- * @param [visitedNavigationPaths] The paths from the root entitySet
405
- * @param [pathVisitor] A function to modify the resulting path
406
- * @returns {BindingExpressionExpression<TargetType>} The default binding expression
407
- */
408
-
409
-
410
- _exports.isTruthy = isTruthy;
411
-
412
- function bindingExpression(path, modelName) {
413
- var visitedNavigationPaths = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
414
- var pathVisitor = arguments.length > 3 ? arguments[3] : undefined;
415
-
416
- if (path === undefined) {
417
- return unresolveableExpression;
418
- }
419
-
420
- var targetPath;
421
-
422
- if (pathVisitor) {
423
- targetPath = pathVisitor(path);
424
-
425
- if (targetPath === undefined) {
426
- return unresolveableExpression;
427
- }
428
- } else {
429
- var localPath = visitedNavigationPaths.concat();
430
- localPath.push(path);
431
- targetPath = localPath.join("/");
432
- }
433
-
434
- return {
435
- _type: "Binding",
436
- modelName: modelName,
437
- path: targetPath
438
- };
439
- }
440
-
441
- _exports.bindingExpression = bindingExpression;
442
-
443
- /**
444
- * Creates a constant expression based on a primitive value.
445
- *
446
- * @template T
447
- * @param value The constant to wrap in an expression
448
- * @returns {ConstantExpression<T>} The constant expression
449
- */
450
- function constant(value) {
451
- var constantValue;
452
-
453
- if (typeof value === "object" && value !== null && value !== undefined) {
454
- if (Array.isArray(value)) {
455
- constantValue = value.map(wrapPrimitive);
456
- } else if (isPrimitiveObject(value)) {
457
- constantValue = value.valueOf();
458
- } else {
459
- constantValue = Object.entries(value).reduce(function (plainExpression, _ref) {
460
- var _ref2 = _slicedToArray(_ref, 2),
461
- key = _ref2[0],
462
- val = _ref2[1];
463
-
464
- var wrappedValue = wrapPrimitive(val);
465
-
466
- if (wrappedValue._type !== "Constant" || wrappedValue.value !== undefined) {
467
- plainExpression[key] = wrappedValue;
468
- }
469
-
470
- return plainExpression;
471
- }, {});
472
- }
473
- } else {
474
- constantValue = value;
475
- }
476
-
477
- return {
478
- _type: "Constant",
479
- value: constantValue
480
- };
481
- }
482
-
483
- _exports.constant = constant;
484
-
485
- function resolveBindingString(value, targetType) {
486
- if (value !== undefined && typeof value === "string" && value.startsWith("{")) {
487
- if (value.startsWith("{=")) {
488
- // Expression binding, we can just remove the outer binding things
489
- return {
490
- _type: "EmbeddedExpressionBinding",
491
- value: value
492
- };
493
- } else {
494
- return {
495
- _type: "EmbeddedBinding",
496
- value: value
497
- };
498
- }
499
- } else if (targetType === "boolean" && typeof value === "string" && (value === "true" || value === "false")) {
500
- return constant(value === "true");
501
- } else {
502
- return constant(value);
503
- }
504
- }
505
- /**
506
- * A named reference.
507
- *
508
- * @see fn
509
- *
510
- * @param reference Reference
511
- * @returns {ReferenceExpression} The object reference binding part
512
- */
513
-
514
-
515
- _exports.resolveBindingString = resolveBindingString;
516
-
517
- function ref(reference) {
518
- return {
519
- _type: "Ref",
520
- ref: reference
521
- };
522
- }
523
- /**
524
- * Determine whether the type is an expression.
525
- *
526
- * Every object having a property named `_type` of some value is considered an expression, even if there is actually
527
- * no such expression type supported.
528
- *
529
- * @param something Type to check
530
- * @returns {boolean} `true` if the type is considered to be an expression
531
- */
532
-
533
-
534
- _exports.ref = ref;
535
-
536
- function isExpression(something) {
537
- return something !== null && typeof something === "object" && something._type !== undefined;
538
- }
539
- /**
540
- * Wrap a primitive into a constant expression if it is not already an expression.
541
- *
542
- * @template T
543
- * @param something The object to wrap in a Constant expression
544
- * @returns {Expression<T>} Either the original object or the wrapped one depending on the case
545
- */
546
-
547
-
548
- function wrapPrimitive(something) {
549
- if (isExpression(something)) {
550
- return something;
551
- }
552
-
553
- return constant(something);
554
- }
555
- /**
556
- * Checks if the expression or value provided is constant or not.
557
- *
558
- * @template T The target type
559
- * @param maybeConstant The expression or primitive value that is to be checked
560
- * @returns {boolean} `true` if it is constant
561
- */
562
-
563
-
564
- function isConstant(maybeConstant) {
565
- return typeof maybeConstant !== "object" || maybeConstant._type === "Constant";
566
- }
567
-
568
- _exports.isConstant = isConstant;
569
-
570
- function isTrue(expression) {
571
- return isConstant(expression) && expression.value === true;
572
- }
573
-
574
- function isFalse(expression) {
575
- return isConstant(expression) && expression.value === false;
576
- }
577
- /**
578
- * Checks if the expression or value provided is binding or not.
579
- *
580
- * @template T The target type
581
- * @param maybeBinding The expression or primitive value that is to be checked
582
- * @returns {boolean} `true` if it is binding
583
- */
584
-
585
-
586
- function isBinding(maybeBinding) {
587
- return typeof maybeBinding === "object" && maybeBinding._type === "Binding";
588
- }
589
- /**
590
- * Checks if the expression provided is a comparison or not.
591
- *
592
- * @template T The target type
593
- * @param expression The expression
594
- * @returns {boolean} `true` if the expression is a ComparisonExpression
595
- */
596
-
597
-
598
- _exports.isBinding = isBinding;
599
-
600
- function isComparison(expression) {
601
- return expression._type === "Comparison";
602
- }
603
-
604
- function isPrimitiveObject(objectType) {
605
- switch (objectType.constructor.name) {
606
- case "String":
607
- case "Number":
608
- case "Boolean":
609
- return true;
610
-
611
- default:
612
- return false;
613
- }
614
- }
615
- /**
616
- * Check if the passed annotation annotationValue is a ComplexAnnotationExpression.
617
- *
618
- * @template T The target type
619
- * @param annotationValue The annotation annotationValue to evaluate
620
- * @returns {boolean} `true` if the object is a {ComplexAnnotationExpression}
621
- */
622
-
623
-
624
- function isComplexAnnotationExpression(annotationValue) {
625
- return typeof annotationValue === "object" && !isPrimitiveObject(annotationValue);
626
- }
627
- /**
628
- * Generate the corresponding annotationValue for a given annotation annotationValue.
629
- *
630
- * @template T The target type
631
- * @param annotationValue The source annotation annotationValue
632
- * @param visitedNavigationPaths The path from the root entity set
633
- * @param defaultValue Default value if the annotationValue is undefined
634
- * @param pathVisitor A function to modify the resulting path
635
- * @returns {Expression<T>} The annotationValue equivalent to that annotation annotationValue
636
- */
637
-
638
-
639
- function annotationExpression(annotationValue) {
640
- var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
641
- var defaultValue = arguments.length > 2 ? arguments[2] : undefined;
642
- var pathVisitor = arguments.length > 3 ? arguments[3] : undefined;
643
-
644
- if (annotationValue === undefined) {
645
- return wrapPrimitive(defaultValue);
646
- }
647
-
648
- if (!isComplexAnnotationExpression(annotationValue)) {
649
- return constant(annotationValue);
650
- }
651
-
652
- switch (annotationValue.type) {
653
- case "Path":
654
- return bindingExpression(annotationValue.path, undefined, visitedNavigationPaths, pathVisitor);
655
-
656
- case "If":
657
- return annotationIfExpression(annotationValue.If, visitedNavigationPaths, pathVisitor);
658
-
659
- case "Not":
660
- return not(parseAnnotationCondition(annotationValue.Not, visitedNavigationPaths, pathVisitor));
661
-
662
- case "Eq":
663
- return equal(parseAnnotationCondition(annotationValue.Eq[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Eq[1], visitedNavigationPaths, pathVisitor));
664
-
665
- case "Ne":
666
- return notEqual(parseAnnotationCondition(annotationValue.Ne[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Ne[1], visitedNavigationPaths, pathVisitor));
667
-
668
- case "Gt":
669
- return greaterThan(parseAnnotationCondition(annotationValue.Gt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Gt[1], visitedNavigationPaths, pathVisitor));
670
-
671
- case "Ge":
672
- return greaterOrEqual(parseAnnotationCondition(annotationValue.Ge[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Ge[1], visitedNavigationPaths, pathVisitor));
673
-
674
- case "Lt":
675
- return lessThan(parseAnnotationCondition(annotationValue.Lt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Lt[1], visitedNavigationPaths, pathVisitor));
676
-
677
- case "Le":
678
- return lessOrEqual(parseAnnotationCondition(annotationValue.Le[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Le[1], visitedNavigationPaths, pathVisitor));
679
-
680
- case "Or":
681
- return or.apply(void 0, _toConsumableArray(annotationValue.Or.map(function (orCondition) {
682
- return parseAnnotationCondition(orCondition, visitedNavigationPaths, pathVisitor);
683
- })));
684
-
685
- case "And":
686
- return and.apply(void 0, _toConsumableArray(annotationValue.And.map(function (andCondition) {
687
- return parseAnnotationCondition(andCondition, visitedNavigationPaths, pathVisitor);
688
- })));
689
-
690
- case "Apply":
691
- return annotationApplyExpression(annotationValue, visitedNavigationPaths, pathVisitor);
692
- }
693
-
694
- return unresolveableExpression;
695
- }
696
- /**
697
- * Parse the annotation condition into an expression.
698
- *
699
- * @template T The target type
700
- * @param annotationValue The condition or value from the annotation
701
- * @param visitedNavigationPaths The path from the root entity set
702
- * @param pathVisitor A function to modify the resulting path
703
- * @returns {Expression<T>} An equivalent expression
704
- */
705
-
706
-
707
- _exports.annotationExpression = annotationExpression;
708
-
709
- function parseAnnotationCondition(annotationValue) {
710
- var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
711
- var pathVisitor = arguments.length > 2 ? arguments[2] : undefined;
712
-
713
- if (annotationValue === null || typeof annotationValue !== "object") {
714
- return constant(annotationValue);
715
- } else if (annotationValue.hasOwnProperty("$Or")) {
716
- return or.apply(void 0, _toConsumableArray(annotationValue.$Or.map(function (orCondition) {
717
- return parseAnnotationCondition(orCondition, visitedNavigationPaths, pathVisitor);
718
- })));
719
- } else if (annotationValue.hasOwnProperty("$And")) {
720
- return and.apply(void 0, _toConsumableArray(annotationValue.$And.map(function (andCondition) {
721
- return parseAnnotationCondition(andCondition, visitedNavigationPaths, pathVisitor);
722
- })));
723
- } else if (annotationValue.hasOwnProperty("$Not")) {
724
- return not(parseAnnotationCondition(annotationValue.$Not[0], visitedNavigationPaths, pathVisitor));
725
- } else if (annotationValue.hasOwnProperty("$Eq")) {
726
- return equal(parseAnnotationCondition(annotationValue.$Eq[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Eq[1], visitedNavigationPaths, pathVisitor));
727
- } else if (annotationValue.hasOwnProperty("$Ne")) {
728
- return notEqual(parseAnnotationCondition(annotationValue.$Ne[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Ne[1], visitedNavigationPaths, pathVisitor));
729
- } else if (annotationValue.hasOwnProperty("$Gt")) {
730
- return greaterThan(parseAnnotationCondition(annotationValue.$Gt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Gt[1], visitedNavigationPaths, pathVisitor));
731
- } else if (annotationValue.hasOwnProperty("$Ge")) {
732
- return greaterOrEqual(parseAnnotationCondition(annotationValue.$Ge[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Ge[1], visitedNavigationPaths, pathVisitor));
733
- } else if (annotationValue.hasOwnProperty("$Lt")) {
734
- return lessThan(parseAnnotationCondition(annotationValue.$Lt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Lt[1], visitedNavigationPaths, pathVisitor));
735
- } else if (annotationValue.hasOwnProperty("$Le")) {
736
- return lessOrEqual(parseAnnotationCondition(annotationValue.$Le[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Le[1], visitedNavigationPaths, pathVisitor));
737
- } else if (annotationValue.hasOwnProperty("$Path")) {
738
- return bindingExpression(annotationValue.$Path, undefined, visitedNavigationPaths, pathVisitor);
739
- } else if (annotationValue.hasOwnProperty("$Apply")) {
740
- return annotationExpression({
741
- type: "Apply",
742
- Function: annotationValue.$Function,
743
- Apply: annotationValue.$Apply
744
- }, visitedNavigationPaths, undefined, pathVisitor);
745
- } else if (annotationValue.hasOwnProperty("$If")) {
746
- return annotationExpression({
747
- type: "If",
748
- If: annotationValue.$If
749
- }, visitedNavigationPaths, undefined, pathVisitor);
750
- } else if (annotationValue.hasOwnProperty("$EnumMember")) {
751
- return constant(resolveEnumValue(annotationValue.$EnumMember));
752
- }
753
-
754
- return constant(false);
755
- }
756
- /**
757
- * Process the {IfAnnotationExpressionValue} into an expression.
758
- *
759
- * @template T The target type
760
- * @param annotationValue An If expression returning the type T
761
- * @param visitedNavigationPaths The path from the root entity set
762
- * @param pathVisitor A function to modify the resulting path
763
- * @returns {Expression<T>} The equivalent ifElse expression
764
- */
765
-
766
-
767
- function annotationIfExpression(annotationValue) {
768
- var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
769
- var pathVisitor = arguments.length > 2 ? arguments[2] : undefined;
770
- return ifElse(parseAnnotationCondition(annotationValue[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue[1], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue[2], visitedNavigationPaths, pathVisitor));
771
- }
772
-
773
- _exports.annotationIfExpression = annotationIfExpression;
774
-
775
- function annotationApplyExpression(applyExpression) {
776
- var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
777
- var pathVisitor = arguments.length > 2 ? arguments[2] : undefined;
778
-
779
- switch (applyExpression.Function) {
780
- case "odata.concat":
781
- return concat.apply(void 0, _toConsumableArray(applyExpression.Apply.map(function (applyParam) {
782
- var applyParamConverted = applyParam;
783
-
784
- if (applyParam.hasOwnProperty("$Path")) {
785
- applyParamConverted = {
786
- type: "Path",
787
- path: applyParam.$Path
788
- };
789
- } else if (applyParam.hasOwnProperty("$If")) {
790
- applyParamConverted = {
791
- type: "If",
792
- If: applyParam.$If
793
- };
794
- } else if (applyParam.hasOwnProperty("$Apply")) {
795
- applyParamConverted = {
796
- type: "Apply",
797
- Function: applyParam.$Function,
798
- Apply: applyParam.$Apply
799
- };
800
- }
801
-
802
- return annotationExpression(applyParamConverted, visitedNavigationPaths, undefined, pathVisitor);
803
- })));
804
- }
805
-
806
- return unresolveableExpression;
807
- }
808
- /**
809
- * Generic helper for the comparison operations (equal, notEqual, ...).
810
- *
811
- * @template T The target type
812
- * @param operator The operator to apply
813
- * @param leftOperand The operand on the left side of the operator
814
- * @param rightOperand The operand on the right side of the operator
815
- * @returns {Expression<boolean>} An expression representing the comparison
816
- */
817
-
818
-
819
- _exports.annotationApplyExpression = annotationApplyExpression;
820
-
821
- function comparison(operator, leftOperand, rightOperand) {
822
- var leftExpression = wrapPrimitive(leftOperand);
823
- var rightExpression = wrapPrimitive(rightOperand);
824
-
825
- if (hasUnresolveableExpression(leftExpression, rightExpression)) {
826
- return unresolveableExpression;
827
- }
828
-
829
- if (isConstant(leftExpression) && isConstant(rightExpression)) {
830
- switch (operator) {
831
- case "!==":
832
- return constant(leftExpression.value !== rightExpression.value);
833
-
834
- case "<":
835
- return constant(leftExpression.value < rightExpression.value);
836
-
837
- case "<=":
838
- return constant(leftExpression.value <= rightExpression.value);
839
-
840
- case ">":
841
- return constant(leftExpression.value > rightExpression.value);
842
-
843
- case ">=":
844
- return constant(leftExpression.value >= rightExpression.value);
845
-
846
- case "===":
847
- return constant(leftExpression.value === rightExpression.value);
848
- }
849
- } else {
850
- return {
851
- _type: "Comparison",
852
- operator: operator,
853
- operand1: leftExpression,
854
- operand2: rightExpression
855
- };
856
- }
857
- }
858
-
859
- function length(expression) {
860
- if (expression._type === "Unresolvable") {
861
- return expression;
862
- }
863
-
864
- return {
865
- _type: "Length",
866
- bindingExpression: expression
867
- };
868
- }
869
- /**
870
- * Comparison: "equal" (===).
871
- *
872
- * @template T The target type
873
- * @param leftOperand The operand on the left side
874
- * @param rightOperand The operand on the right side of the comparison
875
- * @returns {Expression<boolean>} An expression representing the comparison
876
- */
877
-
878
-
879
- _exports.length = length;
880
-
881
- function equal(leftOperand, rightOperand) {
882
- var _reduce;
883
-
884
- var leftExpression = wrapPrimitive(leftOperand);
885
- var rightExpression = wrapPrimitive(rightOperand);
886
-
887
- if (hasUnresolveableExpression(leftExpression, rightExpression)) {
888
- return unresolveableExpression;
889
- }
890
-
891
- if (_checkExpressionsAreEqual(leftExpression, rightExpression)) {
892
- return constant(true);
893
- }
894
-
895
- function reduce(left, right) {
896
- if (left._type === "Comparison" && isTrue(right)) {
897
- // compare(a, b) === true ~~> compare(a, b)
898
- return left;
899
- } else if (left._type === "Comparison" && isFalse(right)) {
900
- // compare(a, b) === false ~~> !compare(a, b)
901
- return not(left);
902
- } else if (left._type === "IfElse" && _checkExpressionsAreEqual(left.onTrue, right)) {
903
- // (if (x) { a } else { b }) === a ~~> x || (b === a)
904
- return or(left.condition, equal(left.onFalse, right));
905
- } else if (left._type === "IfElse" && _checkExpressionsAreEqual(left.onFalse, right)) {
906
- // (if (x) { a } else { b }) === b ~~> !x || (a === b)
907
- return or(not(left.condition), equal(left.onTrue, right));
908
- } else if (left._type === "IfElse" && isConstant(left.onTrue) && isConstant(left.onFalse) && isConstant(right) && !_checkExpressionsAreEqual(left.onTrue, right) && !_checkExpressionsAreEqual(left.onFalse, right)) {
909
- return constant(false);
910
- }
911
-
912
- return undefined;
913
- } // exploit symmetry: a === b <~> b === a
914
-
915
-
916
- var reduced = (_reduce = reduce(leftExpression, rightExpression)) !== null && _reduce !== void 0 ? _reduce : reduce(rightExpression, leftExpression);
917
- return reduced !== null && reduced !== void 0 ? reduced : comparison("===", leftExpression, rightExpression);
918
- }
919
- /**
920
- * Comparison: "not equal" (!==).
921
- *
922
- * @template T The target type
923
- * @param leftOperand The operand on the left side
924
- * @param rightOperand The operand on the right side of the comparison
925
- * @returns {Expression<boolean>} An expression representing the comparison
926
- */
927
-
928
-
929
- _exports.equal = equal;
930
-
931
- function notEqual(leftOperand, rightOperand) {
932
- return not(equal(leftOperand, rightOperand));
933
- }
934
- /**
935
- * Comparison: "greater or equal" (>=).
936
- *
937
- * @template T The target type
938
- * @param leftOperand The operand on the left side
939
- * @param rightOperand The operand on the right side of the comparison
940
- * @returns {Expression<boolean>} An expression representing the comparison
941
- */
942
-
943
-
944
- _exports.notEqual = notEqual;
945
-
946
- function greaterOrEqual(leftOperand, rightOperand) {
947
- return comparison(">=", leftOperand, rightOperand);
948
- }
949
- /**
950
- * Comparison: "greater than" (>).
951
- *
952
- * @template T The target type
953
- * @param leftOperand The operand on the left side
954
- * @param rightOperand The operand on the right side of the comparison
955
- * @returns {Expression<boolean>} An expression representing the comparison
956
- */
957
-
958
-
959
- _exports.greaterOrEqual = greaterOrEqual;
960
-
961
- function greaterThan(leftOperand, rightOperand) {
962
- return comparison(">", leftOperand, rightOperand);
963
- }
964
- /**
965
- * Comparison: "less or equal" (<=).
966
- *
967
- * @template T The target type
968
- * @param leftOperand The operand on the left side
969
- * @param rightOperand The operand on the right side of the comparison
970
- * @returns {Expression<boolean>} An expression representing the comparison
971
- */
972
-
973
-
974
- _exports.greaterThan = greaterThan;
975
-
976
- function lessOrEqual(leftOperand, rightOperand) {
977
- return comparison("<=", leftOperand, rightOperand);
978
- }
979
- /**
980
- * Comparison: "less than" (<).
981
- *
982
- * @template T The target type
983
- * @param leftOperand The operand on the left side
984
- * @param rightOperand The operand on the right side of the comparison
985
- * @returns {Expression<boolean>} An expression representing the comparison
986
- */
987
-
988
-
989
- _exports.lessOrEqual = lessOrEqual;
990
-
991
- function lessThan(leftOperand, rightOperand) {
992
- return comparison("<", leftOperand, rightOperand);
993
- }
994
- /**
995
- * If-then-else expression.
996
- *
997
- * Evaluates to onTrue if the condition evaluates to true, else evaluates to onFalse.
998
- *
999
- * @template T The target type
1000
- * @param condition The condition to evaluate
1001
- * @param onTrue Expression result if the condition evaluates to true
1002
- * @param onFalse Expression result if the condition evaluates to false
1003
- * @returns {Expression<T>} The expression that represents this conditional check
1004
- */
1005
-
1006
-
1007
- _exports.lessThan = lessThan;
1008
-
1009
- function ifElse(condition, onTrue, onFalse) {
1010
- var conditionExpression = wrapPrimitive(condition);
1011
- var onTrueExpression = wrapPrimitive(onTrue);
1012
- var onFalseExpression = wrapPrimitive(onFalse);
1013
-
1014
- if (hasUnresolveableExpression(conditionExpression, onTrueExpression, onFalseExpression)) {
1015
- return unresolveableExpression;
1016
- } // swap branches if the condition is a negation
1017
-
1018
-
1019
- if (conditionExpression._type === "Not") {
1020
- // ifElse(not(X), a, b) --> ifElse(X, b, a)
1021
- var _ref3 = [onFalseExpression, onTrueExpression];
1022
- onTrueExpression = _ref3[0];
1023
- onFalseExpression = _ref3[1];
1024
- conditionExpression = not(conditionExpression);
1025
- } // inline nested if-else expressions: onTrue branch
1026
- // ifElse(X, ifElse(X, a, b), c) ==> ifElse(X, a, c)
1027
-
1028
-
1029
- if (onTrueExpression._type === "IfElse" && _checkExpressionsAreEqual(conditionExpression, onTrueExpression.condition)) {
1030
- onTrueExpression = onTrueExpression.onTrue;
1031
- } // inline nested if-else expressions: onFalse branch
1032
- // ifElse(X, a, ifElse(X, b, c)) ==> ifElse(X, a, c)
1033
-
1034
-
1035
- if (onFalseExpression._type === "IfElse" && _checkExpressionsAreEqual(conditionExpression, onFalseExpression.condition)) {
1036
- onFalseExpression = onFalseExpression.onFalse;
1037
- } // (if true then a else b) ~~> a
1038
- // (if false then a else b) ~~> b
1039
-
1040
-
1041
- if (isConstant(conditionExpression)) {
1042
- return conditionExpression.value ? onTrueExpression : onFalseExpression;
1043
- } // if (isConstantBoolean(onTrueExpression) || isConstantBoolean(onFalseExpression)) {
1044
- // return or(and(condition, onTrueExpression as Expression<boolean>), and(not(condition), onFalseExpression as Expression<boolean>)) as Expression<T>
1045
- // }
1046
- // (if X then a else a) ~~> a
1047
-
1048
-
1049
- if (_checkExpressionsAreEqual(onTrueExpression, onFalseExpression)) {
1050
- return onTrueExpression;
1051
- } // if X then a else false ~~> X && a
1052
-
1053
-
1054
- if (isFalse(onFalseExpression)) {
1055
- return and(conditionExpression, onTrueExpression);
1056
- } // if X then a else true ~~> !X || a
1057
-
1058
-
1059
- if (isTrue(onFalseExpression)) {
1060
- return or(not(conditionExpression), onTrueExpression);
1061
- } // if X then false else a ~~> !X && a
1062
-
1063
-
1064
- if (isFalse(onTrueExpression)) {
1065
- return and(not(conditionExpression), onFalseExpression);
1066
- } // if X then true else a ~~> X || a
1067
-
1068
-
1069
- if (isTrue(onTrueExpression)) {
1070
- return or(conditionExpression, onFalseExpression);
1071
- }
1072
-
1073
- return {
1074
- _type: "IfElse",
1075
- condition: conditionExpression,
1076
- onTrue: onTrueExpression,
1077
- onFalse: onFalseExpression
1078
- };
1079
- }
1080
- /**
1081
- * Checks whether the current expression has a reference to the default model (undefined).
1082
- *
1083
- * @param expression The expression to evaluate
1084
- * @returns {boolean} `true` if there is a reference to the default context
1085
- */
1086
-
1087
-
1088
- _exports.ifElse = ifElse;
1089
-
1090
- function hasReferenceToDefaultContext(expression) {
1091
- switch (expression._type) {
1092
- case "Constant":
1093
- case "Formatter":
1094
- case "ComplexType":
1095
- return false;
1096
-
1097
- case "Set":
1098
- return expression.operands.some(hasReferenceToDefaultContext);
1099
-
1100
- case "Binding":
1101
- return expression.modelName === undefined;
1102
-
1103
- case "Comparison":
1104
- return hasReferenceToDefaultContext(expression.operand1) || hasReferenceToDefaultContext(expression.operand2);
1105
-
1106
- case "DefaultBinding":
1107
- return true;
1108
-
1109
- case "IfElse":
1110
- return hasReferenceToDefaultContext(expression.condition) || hasReferenceToDefaultContext(expression.onTrue) || hasReferenceToDefaultContext(expression.onFalse);
1111
-
1112
- case "Not":
1113
- case "Truthy":
1114
- return hasReferenceToDefaultContext(expression.operand);
1115
-
1116
- default:
1117
- return false;
1118
- }
1119
- }
1120
-
1121
- /**
1122
- * Calls a formatter function to process the parameters.
1123
- * If requireContext is set to true and no context is passed a default context will be added automatically.
1124
- *
1125
- * @template T
1126
- * @template U
1127
- * @param parameters The list of parameter that should match the type and number of the formatter function
1128
- * @param formatterFunction The function to call
1129
- * @param [contextEntityType] The context entity type to consider
1130
- * @returns {Expression<T>} The corresponding expression
1131
- */
1132
- function formatResult(parameters, formatterFunction, contextEntityType) {
1133
- var parameterExpressions = parameters.map(wrapPrimitive);
1134
-
1135
- if (hasUnresolveableExpression.apply(void 0, _toConsumableArray(parameterExpressions))) {
1136
- return unresolveableExpression;
1137
- }
1138
-
1139
- if (!!contextEntityType) {
1140
- // Otherwise, if the context is required and no context is provided make sure to add the default binding
1141
- if (!parameterExpressions.some(hasReferenceToDefaultContext)) {
1142
- contextEntityType.keys.forEach(function (key) {
1143
- return parameterExpressions.push(bindingExpression(key.name, ""));
1144
- });
1145
- }
1146
- } // FormatterName can be of format sap.fe.core.xxx#methodName to have multiple formatter in one class
1147
-
1148
-
1149
- var _formatterFunction$__ = formatterFunction.__functionName.split("#"),
1150
- _formatterFunction$__2 = _slicedToArray(_formatterFunction$__, 2),
1151
- formatterClass = _formatterFunction$__2[0],
1152
- formatterName = _formatterFunction$__2[1];
1153
-
1154
- if (!!formatterName && formatterName.length > 0) {
1155
- parameterExpressions.unshift(constant(formatterName));
1156
- }
1157
-
1158
- return {
1159
- _type: "Formatter",
1160
- fn: formatterClass,
1161
- parameters: parameterExpressions
1162
- };
1163
- }
1164
- /**
1165
- * Calls a complex type to process the parameters.
1166
- * If requireContext is set to true and no context is passed a default context will be added automatically.
1167
- *
1168
- * @template T
1169
- * @template U
1170
- * @param parameters The list of parameter that should match the type for the compplex type
1171
- * @param type The complex type to use
1172
- * @param [contextEntityType] The context entity type to consider
1173
- * @returns {Expression<T>} The corresponding expression
1174
- */
1175
-
1176
-
1177
- _exports.formatResult = formatResult;
1178
-
1179
- function addTypeInformation(parameters, type, contextEntityType) {
1180
- var _parameters$, _parameters$$type;
1181
-
1182
- var parameterExpressions = parameters.map(wrapPrimitive);
1183
-
1184
- if (hasUnresolveableExpression.apply(void 0, _toConsumableArray(parameterExpressions))) {
1185
- return unresolveableExpression;
1186
- } // If there is only one parameter and it is a constant and we don't expect the context then return the constant
1187
-
1188
-
1189
- if (parameterExpressions.length === 1 && isConstant(parameterExpressions[0]) && !contextEntityType) {
1190
- return parameterExpressions[0];
1191
- } else if (!!contextEntityType) {
1192
- // Otherwise, if the context is required and no context is provided make sure to add the default binding
1193
- if (!parameterExpressions.some(hasReferenceToDefaultContext)) {
1194
- contextEntityType.keys.forEach(function (key) {
1195
- return parameterExpressions.push(bindingExpression(key.name, ""));
1196
- });
1197
- }
1198
- }
1199
-
1200
- var oFormatOptions = ((_parameters$ = parameters[0]) === null || _parameters$ === void 0 ? void 0 : (_parameters$$type = _parameters$.type) === null || _parameters$$type === void 0 ? void 0 : _parameters$$type.indexOf("sap.ui.model.odata.type.Int")) === 0 ? {
1201
- parseAsString: false,
1202
- emptyString: ""
1203
- } : {};
1204
- return {
1205
- _type: "ComplexType",
1206
- type: type,
1207
- formatOptions: oFormatOptions,
1208
- parameters: {},
1209
- bindingParameters: parameterExpressions
1210
- };
1211
- }
1212
- /**
1213
- * Function call, optionally with arguments.
1214
- *
1215
- * @param func Function name or reference to function
1216
- * @param parameters Arguments
1217
- * @param on Object to call the function on
1218
- * @returns {FunctionExpression<T>} Expression representing the function call (not the result of the function call!)
1219
- */
1220
-
1221
-
1222
- _exports.addTypeInformation = addTypeInformation;
1223
-
1224
- function fn(func, parameters, on) {
1225
- var functionName = typeof func === "string" ? func : func.__functionName;
1226
- return {
1227
- _type: "Function",
1228
- obj: on !== undefined ? wrapPrimitive(on) : undefined,
1229
- fn: functionName,
1230
- parameters: parameters.map(wrapPrimitive)
1231
- };
1232
- }
1233
- /**
1234
- * Shortcut function to determine if a binding value is null, undefined or empty.
1235
- *
1236
- * @param expression
1237
- * @returns A boolean expression evaluating the fact that the current element is empty
1238
- */
1239
-
1240
-
1241
- _exports.fn = fn;
1242
-
1243
- function isEmpty(expression) {
1244
- if (expression._type === "Concat") {
1245
- return or.apply(void 0, _toConsumableArray(expression.expressions.map(isEmpty)));
1246
- }
1247
-
1248
- return or(equal(expression, ""), equal(expression, undefined), equal(expression, null));
1249
- }
1250
-
1251
- _exports.isEmpty = isEmpty;
1252
-
1253
- function concat() {
1254
- for (var _len4 = arguments.length, inExpressions = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
1255
- inExpressions[_key4] = arguments[_key4];
1256
- }
1257
-
1258
- var expressions = inExpressions.map(wrapPrimitive);
1259
-
1260
- if (hasUnresolveableExpression.apply(void 0, _toConsumableArray(expressions))) {
1261
- return unresolveableExpression;
1262
- }
1263
-
1264
- if (expressions.every(isConstant)) {
1265
- return constant(expressions.reduce(function (concatenated, value) {
1266
- return concatenated + value.value.toString();
1267
- }, ""));
1268
- }
1269
-
1270
- return {
1271
- _type: "Concat",
1272
- expressions: expressions
1273
- };
1274
- }
1275
-
1276
- _exports.concat = concat;
1277
-
1278
- function transformRecursively(inExpression, expressionType, transformFunction) {
1279
- var includeAllExpression = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
1280
- var expression = inExpression;
1281
-
1282
- switch (expression._type) {
1283
- case "Function":
1284
- case "Formatter":
1285
- expression.parameters = expression.parameters.map(function (parameter) {
1286
- return transformRecursively(parameter, expressionType, transformFunction, includeAllExpression);
1287
- });
1288
- break;
1289
-
1290
- case "Concat":
1291
- expression.expressions = expression.expressions.map(function (subExpression) {
1292
- return transformRecursively(subExpression, expressionType, transformFunction, includeAllExpression);
1293
- });
1294
- break;
1295
-
1296
- case "ComplexType":
1297
- expression.bindingParameters = expression.bindingParameters.map(function (bindingParameter) {
1298
- return transformRecursively(bindingParameter, expressionType, transformFunction, includeAllExpression);
1299
- });
1300
- break;
1301
-
1302
- case "IfElse":
1303
- var onTrue = transformRecursively(expression.onTrue, expressionType, transformFunction, includeAllExpression);
1304
- var onFalse = transformRecursively(expression.onFalse, expressionType, transformFunction, includeAllExpression);
1305
- var condition = expression.condition;
1306
-
1307
- if (includeAllExpression) {
1308
- condition = transformRecursively(expression.condition, expressionType, transformFunction, includeAllExpression);
1309
- }
1310
-
1311
- expression = ifElse(condition, onTrue, onFalse);
1312
- break;
1313
-
1314
- case "Not":
1315
- if (includeAllExpression) {
1316
- var operand = transformRecursively(expression.operand, expressionType, transformFunction, includeAllExpression);
1317
- expression = not(operand);
1318
- }
1319
-
1320
- break;
1321
-
1322
- case "Truthy":
1323
- break;
1324
-
1325
- case "Set":
1326
- if (includeAllExpression) {
1327
- expression.operands = expression.operands.map(function (operand) {
1328
- return transformRecursively(operand, expressionType, transformFunction, includeAllExpression);
1329
- });
1330
- }
1331
-
1332
- break;
1333
-
1334
- case "Comparison":
1335
- if (includeAllExpression) {
1336
- var operand1 = transformRecursively(expression.operand1, expressionType, transformFunction, includeAllExpression);
1337
- var operand2 = transformRecursively(expression.operand2, expressionType, transformFunction, includeAllExpression);
1338
- expression = comparison(expression.operator, operand1, operand2);
1339
- }
1340
-
1341
- break;
1342
-
1343
- case "DefaultBinding":
1344
- case "Ref":
1345
- case "Length":
1346
- case "Binding":
1347
- case "Constant":
1348
- // Do nothing
1349
- break;
1350
- }
1351
-
1352
- if (expressionType === expression._type) {
1353
- expression = transformFunction(inExpression);
1354
- }
1355
-
1356
- return expression;
1357
- }
1358
-
1359
- _exports.transformRecursively = transformRecursively;
1360
-
1361
- var needParenthesis = function (expr) {
1362
- return !isConstant(expr) && !isBinding(expr) && isExpression(expr) && expr._type !== "IfElse" && expr._type !== "Function";
1363
- };
1364
- /**
1365
- * Compiles a constant object to a string.
1366
- * @param expr
1367
- * @param isNullable
1368
- * @returns {string} The compiled string
1369
- */
1370
-
1371
-
1372
- function compileConstantObject(expr) {
1373
- var isNullable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1374
-
1375
- if (isNullable && Object.keys(expr.value).length === 0) {
1376
- return "";
1377
- } // Objects
1378
-
1379
-
1380
- var o = expr.value;
1381
- var properties = [];
1382
- Object.keys(o).forEach(function (key) {
1383
- var value = o[key];
1384
- var childResult = compileBinding(value, true, false, true);
1385
-
1386
- if (childResult && childResult.length > 0) {
1387
- properties.push("".concat(key, ": ").concat(childResult));
1388
- }
1389
- });
1390
- return "{".concat(properties.join(", "), "}");
1391
- }
1392
- /**
1393
- * Compiles a Constant Binding Expression.
1394
- * @param expr
1395
- * @param embeddedInBinding
1396
- * @param isNullable
1397
- * @returns {string} The compiled string
1398
- */
1399
-
1400
-
1401
- function compileConstant(expr, embeddedInBinding) {
1402
- var isNullable = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1403
-
1404
- if (expr.value === null) {
1405
- return "null";
1406
- }
1407
-
1408
- if (expr.value === undefined) {
1409
- return "undefined";
1410
- }
1411
-
1412
- if (typeof expr.value === "object") {
1413
- if (Array.isArray(expr.value)) {
1414
- var entries = expr.value.map(function (expression) {
1415
- return compileBinding(expression, true);
1416
- });
1417
- return "[".concat(entries.join(", "), "]");
1418
- } else {
1419
- return compileConstantObject(expr, isNullable);
1420
- }
1421
- }
1422
-
1423
- if (embeddedInBinding) {
1424
- switch (typeof expr.value) {
1425
- case "number":
1426
- case "bigint":
1427
- case "boolean":
1428
- return expr.value.toString();
1429
-
1430
- case "string":
1431
- return "'".concat(escapeXmlAttribute(expr.value.toString()), "'");
1432
-
1433
- default:
1434
- return "";
1435
- }
1436
- } else {
1437
- return expr.value.toString();
1438
- }
1439
- }
1440
- /**
1441
- * Generates the binding string for a Binding expression.
1442
- *
1443
- * @param expressionForBinding The expression to compile
1444
- * @param embeddedInBinding Whether the expression to compile is embedded into another expression
1445
- * @param embeddedSeparator The binding value evaluator ($ or % depending on whether we want to force the type or not)
1446
- * @returns {BindingExpression<T>} The corresponding expression binding
1447
- */
1448
-
1449
-
1450
- function compileBindingForBinding(expressionForBinding, embeddedInBinding, embeddedSeparator) {
1451
- if (expressionForBinding.type || expressionForBinding.parameters || expressionForBinding.targetType || expressionForBinding.formatOptions || expressionForBinding.constraints) {
1452
- // This is now a complex binding definition, let's prepare for it
1453
- var complexBindingDefinition = {
1454
- path: compileBindingPath(expressionForBinding),
1455
- type: expressionForBinding.type,
1456
- targetType: expressionForBinding.targetType,
1457
- parameters: expressionForBinding.parameters,
1458
- formatOptions: expressionForBinding.formatOptions,
1459
- constraints: expressionForBinding.constraints
1460
- };
1461
- var outBinding = compileBinding(complexBindingDefinition);
1462
-
1463
- if (embeddedInBinding) {
1464
- outBinding = "".concat(embeddedSeparator) + outBinding;
1465
- }
1466
-
1467
- return outBinding;
1468
- } else if (embeddedInBinding) {
1469
- return "".concat(embeddedSeparator, "{").concat(compileBindingPath(expressionForBinding), "}");
1470
- } else {
1471
- return "{".concat(compileBindingPath(expressionForBinding), "}");
1472
- }
1473
- }
1474
-
1475
- function compileComplexTypeExpression(expression) {
1476
- if (expression.bindingParameters.length === 1) {
1477
- return "{".concat(compilePathParameter(expression.bindingParameters[0], true), ", type: '").concat(expression.type, "'}");
1478
- }
1479
-
1480
- var outputEnd; // this code is based on sap.ui.model.odata.v4._AnnotationHelperExpression.fetchCurrencyOrUnit
1481
-
1482
- switch (expression.type) {
1483
- case "sap.ui.model.odata.type.Unit":
1484
- outputEnd = ",{mode:'OneTime',path:'/##@@requestUnitsOfMeasure',targetType:'any'}],type:'sap.ui.model.odata.type.Unit'";
1485
- break;
1486
-
1487
- case "sap.ui.model.odata.type.Currency":
1488
- outputEnd = ",{mode:'OneTime',path:'/##@@requestCurrencyCodes',targetType:'any'}],type:'sap.ui.model.odata.type.Currency'";
1489
- break;
1490
-
1491
- default:
1492
- outputEnd = "], type: '".concat(expression.type, "'");
1493
- }
1494
-
1495
- if (hasElements(expression.formatOptions)) {
1496
- outputEnd += ", formatOptions: ".concat(compileBinding(expression.formatOptions));
1497
- }
1498
-
1499
- if (hasElements(expression.parameters)) {
1500
- outputEnd += ", parameters: ".concat(compileBinding(expression.parameters));
1501
- }
1502
-
1503
- outputEnd += "}";
1504
- return "{mode:'TwoWay', parts:[".concat(expression.bindingParameters.map(function (param) {
1505
- return compilePathParameter(param);
1506
- }).join(",")).concat(outputEnd);
1507
- }
1508
- /**
1509
- * Wrap the compiled binding string as required dependening on its context.
1510
- *
1511
- * @param expression The compiled expression
1512
- * @param embeddedInBinding True if the compiled expression is to be embedded in a binding
1513
- * @param parenthesisRequired True if the embedded binding needs to be wrapped in parethesis so that it is evaluated as one
1514
- * @returns {BindingExpression<string>} Finalized compiled expression
1515
- */
1516
-
1517
-
1518
- function wrapBindingExpression(expression, embeddedInBinding) {
1519
- var parenthesisRequired = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1520
-
1521
- if (embeddedInBinding) {
1522
- if (parenthesisRequired) {
1523
- return "(".concat(expression, ")");
1524
- } else {
1525
- return expression;
1526
- }
1527
- } else {
1528
- return "{= ".concat(expression, "}");
1529
- }
1530
- }
1531
- /**
1532
- * Compile an expression into an expression binding.
1533
- *
1534
- * @template T The target type
1535
- * @param expression The expression to compile
1536
- * @param embeddedInBinding Whether the expression to compile is embedded into another expression
1537
- * @param keepTargetType Keep the target type of the embedded bindings instead of casting them to any
1538
- * @param isNullable Whether binding expression can resolve to empty string or not
1539
- * @returns {BindingExpression<T>} The corresponding expression binding
1540
- */
1541
-
1542
-
1543
- function compileBinding(expression) {
1544
- var embeddedInBinding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1545
- var keepTargetType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1546
- var isNullable = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
1547
- var expr = wrapPrimitive(expression);
1548
- var embeddedSeparator = keepTargetType ? "$" : "%";
1549
-
1550
- switch (expr._type) {
1551
- case "Unresolvable":
1552
- return undefined;
1553
-
1554
- case "Constant":
1555
- return compileConstant(expr, embeddedInBinding, isNullable);
1556
-
1557
- case "Ref":
1558
- return expr.ref || "null";
1559
-
1560
- case "Function":
1561
- var argumentString = "".concat(expr.parameters.map(function (arg) {
1562
- return compileBinding(arg, true);
1563
- }).join(", "));
1564
- return expr.obj === undefined ? "".concat(expr.fn, "(").concat(argumentString, ")") : "".concat(compileBinding(expr.obj, true), ".").concat(expr.fn, "(").concat(argumentString, ")");
1565
-
1566
- case "EmbeddedExpressionBinding":
1567
- return embeddedInBinding ? "(".concat(expr.value.substr(2, expr.value.length - 3), ")") : "".concat(expr.value);
1568
-
1569
- case "EmbeddedBinding":
1570
- return embeddedInBinding ? "".concat(embeddedSeparator).concat(expr.value) : "".concat(expr.value);
1571
-
1572
- case "DefaultBinding":
1573
- case "Binding":
1574
- return compileBindingForBinding(expr, embeddedInBinding, embeddedSeparator);
1575
-
1576
- case "Comparison":
1577
- var comparisonExpression = compileComparisonExpression(expr);
1578
- return wrapBindingExpression(comparisonExpression, embeddedInBinding);
1579
-
1580
- case "IfElse":
1581
- var ifElseExpression = "".concat(compileBinding(expr.condition, true), " ? ").concat(compileBinding(expr.onTrue, true), " : ").concat(compileBinding(expr.onFalse, true));
1582
- return wrapBindingExpression(ifElseExpression, embeddedInBinding, true);
1583
-
1584
- case "Set":
1585
- var setExpression = expr.operands.map(function (operand) {
1586
- return compileBinding(operand, true);
1587
- }).join(" ".concat(expr.operator, " "));
1588
- return wrapBindingExpression(setExpression, embeddedInBinding, true);
1589
-
1590
- case "Concat":
1591
- var concatExpression = expr.expressions.map(function (nestedExpression) {
1592
- return compileBinding(nestedExpression, true, true);
1593
- }).join(" + ");
1594
- return wrapBindingExpression(concatExpression, embeddedInBinding);
1595
-
1596
- case "Length":
1597
- var lengthExpression = "".concat(compileBinding(expr.bindingExpression, true), ".length");
1598
- return wrapBindingExpression(lengthExpression, embeddedInBinding);
1599
-
1600
- case "Not":
1601
- var notExpression = "!".concat(compileBinding(expr.operand, true));
1602
- return wrapBindingExpression(notExpression, embeddedInBinding);
1603
-
1604
- case "Truthy":
1605
- var truthyExpression = "!!".concat(compileBinding(expr.operand, true));
1606
- return wrapBindingExpression(truthyExpression, embeddedInBinding);
1607
-
1608
- case "Formatter":
1609
- var formatterExpression = compileFormatterExpression(expr);
1610
- return embeddedInBinding ? "$".concat(formatterExpression) : formatterExpression;
1611
-
1612
- case "ComplexType":
1613
- var complexTypeExpression = compileComplexTypeExpression(expr);
1614
- return embeddedInBinding ? "$".concat(complexTypeExpression) : complexTypeExpression;
1615
-
1616
- default:
1617
- return "";
1618
- }
1619
- }
1620
- /**
1621
- * Compile a comparison expression.
1622
- *
1623
- * @param expression The comparison expression.
1624
- * @returns The compiled expression. Needs wrapping before it can be used as an expression binding.
1625
- */
1626
-
1627
-
1628
- _exports.compileBinding = compileBinding;
1629
-
1630
- function compileComparisonExpression(expression) {
1631
- function compileOperand(operand) {
1632
- var _compileBinding;
1633
-
1634
- var compiledOperand = (_compileBinding = compileBinding(operand, true)) !== null && _compileBinding !== void 0 ? _compileBinding : "undefined";
1635
- return wrapBindingExpression(compiledOperand, true, needParenthesis(operand));
1636
- }
1637
-
1638
- return "".concat(compileOperand(expression.operand1), " ").concat(expression.operator, " ").concat(compileOperand(expression.operand2));
1639
- }
1640
- /**
1641
- * Compile a formatter expression.
1642
- *
1643
- * @param expression The formatter expression.
1644
- * @returns The compiled expression.
1645
- */
1646
-
1647
-
1648
- function compileFormatterExpression(expression) {
1649
- if (expression.parameters.length === 1) {
1650
- return "{".concat(compilePathParameter(expression.parameters[0], true), ", formatter: '").concat(expression.fn, "'}");
1651
- } else {
1652
- var parts = expression.parameters.map(function (param) {
1653
- return compilePathParameter(param);
1654
- });
1655
- return "{parts: [".concat(parts.join(", "), "], formatter: '").concat(expression.fn, "'}");
1656
- }
1657
- }
1658
- /**
1659
- * Compile the path parameter of a formatter call.
1660
- *
1661
- * @param expression The binding part to evaluate
1662
- * @param singlePath Whether there is one or multiple path to consider
1663
- * @returns {string} The string snippet to include in the overall binding definition
1664
- */
1665
-
1666
-
1667
- function compilePathParameter(expression) {
1668
- var singlePath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1669
- var outValue = "";
1670
-
1671
- if (expression._type === "Constant") {
1672
- switch (typeof expression.value) {
1673
- case "number":
1674
- case "bigint":
1675
- outValue = "value: ".concat(expression.value.toString());
1676
- break;
1677
-
1678
- case "string":
1679
- outValue = "value: '".concat(escapeXmlAttribute(expression.value.toString()), "'");
1680
- break;
1681
-
1682
- case "boolean":
1683
- outValue = "value: '".concat(expression.value.toString(), "'");
1684
- break;
1685
-
1686
- default:
1687
- outValue = "value: ''";
1688
- break;
1689
- }
1690
- } else if (expression._type === "DefaultBinding" || expression._type === "Binding") {
1691
- outValue = "path: '".concat(compileBindingPath(expression), "'");
1692
- outValue += expression.type ? ", type: '".concat(expression.type, "'") : ", targetType: 'any'";
1693
-
1694
- if (hasElements(expression.constraints)) {
1695
- outValue += ", constraints: ".concat(compileBinding(expression.constraints));
1696
- }
1697
-
1698
- if (hasElements(expression.formatOptions)) {
1699
- outValue += ", formatOptions: ".concat(compileBinding(expression.formatOptions));
1700
- }
1701
-
1702
- if (hasElements(expression.parameters)) {
1703
- outValue += ", parameters: ".concat(compileBinding(expression.parameters));
1704
- }
1705
- } else {
1706
- return "";
1707
- }
1708
-
1709
- return singlePath ? outValue : "{".concat(outValue, "}");
1710
- }
1711
-
1712
- function hasElements(obj) {
1713
- return obj && Object.keys(obj).length > 0;
1714
- }
1715
- /**
1716
- * Compile a binding expression path.
1717
- *
1718
- * @param expression The expression to compile.
1719
- * @returns The compiled path.
1720
- */
1721
-
1722
-
1723
- function compileBindingPath(expression) {
1724
- return "".concat(expression.modelName ? expression.modelName + ">" : "").concat(expression.path);
1725
- }
1726
-
1727
- return _exports;
1728
- }, false);
1729
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJpbmRpbmdFeHByZXNzaW9uLnRzIl0sIm5hbWVzIjpbInVucmVzb2x2ZWFibGVFeHByZXNzaW9uIiwiX3R5cGUiLCJlc2NhcGVYbWxBdHRyaWJ1dGUiLCJpbnB1dFN0cmluZyIsInJlcGxhY2UiLCJoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiIsImV4cHJlc3Npb25zIiwiZmluZCIsImV4cHIiLCJ1bmRlZmluZWQiLCJfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsIiwiYSIsImIiLCJ2YWx1ZSIsIm9wZXJhbmQiLCJvcGVyYXRvciIsIm9wZXJhbmRzIiwibGVuZ3RoIiwiZXZlcnkiLCJleHByZXNzaW9uIiwic29tZSIsIm90aGVyRXhwcmVzc2lvbiIsImNvbmRpdGlvbiIsIm9uVHJ1ZSIsIm9uRmFsc2UiLCJvcGVyYW5kMSIsIm9wZXJhbmQyIiwiYUV4cHJlc3Npb25zIiwiYkV4cHJlc3Npb25zIiwiaW5kZXgiLCJiaW5kaW5nRXhwcmVzc2lvbiIsIm1vZGVsTmFtZSIsInBhdGgiLCJ0YXJnZXRFbnRpdHlTZXQiLCJmbiIsInBhcmFtZXRlcnMiLCJ0eXBlIiwiYmluZGluZ1BhcmFtZXRlcnMiLCJvdGhlckZ1bmN0aW9uIiwib2JqIiwicmVmIiwiZmxhdHRlblNldEV4cHJlc3Npb24iLCJyZWR1Y2UiLCJyZXN1bHQiLCJjYW5kaWRhdGVzRm9yRmxhdHRlbmluZyIsImZvckVhY2giLCJjYW5kaWRhdGUiLCJlIiwicHVzaCIsImhhc09wcG9zaXRlRXhwcmVzc2lvbnMiLCJuZWdhdGVkRXhwcmVzc2lvbnMiLCJtYXAiLCJub3QiLCJpIiwiYW5kIiwid3JhcFByaW1pdGl2ZSIsImlzU3RhdGljRmFsc2UiLCJub25Ucml2aWFsRXhwcmVzc2lvbiIsImZpbHRlciIsImlzRmFsc2UiLCJpc0NvbnN0YW50IiwiY29uc3RhbnQiLCJpc1ZhbGlkIiwiaXNUcnVlIiwib3IiLCJpc1N0YXRpY1RydWUiLCJpc0NvbXBhcmlzb24iLCJpc1RydXRoeSIsInZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMiLCJwYXRoVmlzaXRvciIsInRhcmdldFBhdGgiLCJsb2NhbFBhdGgiLCJjb25jYXQiLCJqb2luIiwiY29uc3RhbnRWYWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsImlzUHJpbWl0aXZlT2JqZWN0IiwidmFsdWVPZiIsIk9iamVjdCIsImVudHJpZXMiLCJwbGFpbkV4cHJlc3Npb24iLCJrZXkiLCJ2YWwiLCJ3cmFwcGVkVmFsdWUiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsInRhcmdldFR5cGUiLCJzdGFydHNXaXRoIiwicmVmZXJlbmNlIiwiaXNFeHByZXNzaW9uIiwic29tZXRoaW5nIiwibWF5YmVDb25zdGFudCIsImlzQmluZGluZyIsIm1heWJlQmluZGluZyIsIm9iamVjdFR5cGUiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJpc0NvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsImFubm90YXRpb25WYWx1ZSIsImFubm90YXRpb25FeHByZXNzaW9uIiwiZGVmYXVsdFZhbHVlIiwiYW5ub3RhdGlvbklmRXhwcmVzc2lvbiIsIklmIiwicGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uIiwiTm90IiwiZXF1YWwiLCJFcSIsIm5vdEVxdWFsIiwiTmUiLCJncmVhdGVyVGhhbiIsIkd0IiwiZ3JlYXRlck9yRXF1YWwiLCJHZSIsImxlc3NUaGFuIiwiTHQiLCJsZXNzT3JFcXVhbCIsIkxlIiwiT3IiLCJvckNvbmRpdGlvbiIsIkFuZCIsImFuZENvbmRpdGlvbiIsImFubm90YXRpb25BcHBseUV4cHJlc3Npb24iLCJoYXNPd25Qcm9wZXJ0eSIsIiRPciIsIiRBbmQiLCIkTm90IiwiJEVxIiwiJE5lIiwiJEd0IiwiJEdlIiwiJEx0IiwiJExlIiwiJFBhdGgiLCJGdW5jdGlvbiIsIiRGdW5jdGlvbiIsIkFwcGx5IiwiJEFwcGx5IiwiJElmIiwicmVzb2x2ZUVudW1WYWx1ZSIsIiRFbnVtTWVtYmVyIiwiaWZFbHNlIiwiYXBwbHlFeHByZXNzaW9uIiwiYXBwbHlQYXJhbSIsImFwcGx5UGFyYW1Db252ZXJ0ZWQiLCJjb21wYXJpc29uIiwibGVmdE9wZXJhbmQiLCJyaWdodE9wZXJhbmQiLCJsZWZ0RXhwcmVzc2lvbiIsInJpZ2h0RXhwcmVzc2lvbiIsImxlZnQiLCJyaWdodCIsInJlZHVjZWQiLCJjb25kaXRpb25FeHByZXNzaW9uIiwib25UcnVlRXhwcmVzc2lvbiIsIm9uRmFsc2VFeHByZXNzaW9uIiwiaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dCIsImZvcm1hdFJlc3VsdCIsImZvcm1hdHRlckZ1bmN0aW9uIiwiY29udGV4dEVudGl0eVR5cGUiLCJwYXJhbWV0ZXJFeHByZXNzaW9ucyIsImtleXMiLCJfX2Z1bmN0aW9uTmFtZSIsInNwbGl0IiwiZm9ybWF0dGVyQ2xhc3MiLCJmb3JtYXR0ZXJOYW1lIiwidW5zaGlmdCIsImFkZFR5cGVJbmZvcm1hdGlvbiIsIm9Gb3JtYXRPcHRpb25zIiwiaW5kZXhPZiIsInBhcnNlQXNTdHJpbmciLCJlbXB0eVN0cmluZyIsImZvcm1hdE9wdGlvbnMiLCJmdW5jIiwib24iLCJmdW5jdGlvbk5hbWUiLCJpc0VtcHR5IiwiaW5FeHByZXNzaW9ucyIsImNvbmNhdGVuYXRlZCIsInRvU3RyaW5nIiwidHJhbnNmb3JtUmVjdXJzaXZlbHkiLCJpbkV4cHJlc3Npb24iLCJleHByZXNzaW9uVHlwZSIsInRyYW5zZm9ybUZ1bmN0aW9uIiwiaW5jbHVkZUFsbEV4cHJlc3Npb24iLCJwYXJhbWV0ZXIiLCJzdWJFeHByZXNzaW9uIiwiYmluZGluZ1BhcmFtZXRlciIsIm5lZWRQYXJlbnRoZXNpcyIsImNvbXBpbGVDb25zdGFudE9iamVjdCIsImlzTnVsbGFibGUiLCJvIiwicHJvcGVydGllcyIsImNoaWxkUmVzdWx0IiwiY29tcGlsZUJpbmRpbmciLCJjb21waWxlQ29uc3RhbnQiLCJlbWJlZGRlZEluQmluZGluZyIsImNvbXBpbGVCaW5kaW5nRm9yQmluZGluZyIsImV4cHJlc3Npb25Gb3JCaW5kaW5nIiwiZW1iZWRkZWRTZXBhcmF0b3IiLCJjb25zdHJhaW50cyIsImNvbXBsZXhCaW5kaW5nRGVmaW5pdGlvbiIsImNvbXBpbGVCaW5kaW5nUGF0aCIsIm91dEJpbmRpbmciLCJjb21waWxlQ29tcGxleFR5cGVFeHByZXNzaW9uIiwiY29tcGlsZVBhdGhQYXJhbWV0ZXIiLCJvdXRwdXRFbmQiLCJoYXNFbGVtZW50cyIsInBhcmFtIiwid3JhcEJpbmRpbmdFeHByZXNzaW9uIiwicGFyZW50aGVzaXNSZXF1aXJlZCIsImtlZXBUYXJnZXRUeXBlIiwiYXJndW1lbnRTdHJpbmciLCJhcmciLCJzdWJzdHIiLCJjb21wYXJpc29uRXhwcmVzc2lvbiIsImNvbXBpbGVDb21wYXJpc29uRXhwcmVzc2lvbiIsImlmRWxzZUV4cHJlc3Npb24iLCJzZXRFeHByZXNzaW9uIiwiY29uY2F0RXhwcmVzc2lvbiIsIm5lc3RlZEV4cHJlc3Npb24iLCJsZW5ndGhFeHByZXNzaW9uIiwibm90RXhwcmVzc2lvbiIsInRydXRoeUV4cHJlc3Npb24iLCJmb3JtYXR0ZXJFeHByZXNzaW9uIiwiY29tcGlsZUZvcm1hdHRlckV4cHJlc3Npb24iLCJjb21wbGV4VHlwZUV4cHJlc3Npb24iLCJjb21waWxlT3BlcmFuZCIsImNvbXBpbGVkT3BlcmFuZCIsInBhcnRzIiwic2luZ2xlUGF0aCIsIm91dFZhbHVlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnTE8sTUFBTUEsdUJBQXVELEdBQUc7QUFDdEVDLElBQUFBLEtBQUssRUFBRTtBQUQrRCxHQUFoRTs7O0FBSVAsV0FBU0Msa0JBQVQsQ0FBNEJDLFdBQTVCLEVBQWlEO0FBQ2hELFdBQU9BLFdBQVcsQ0FBQ0MsT0FBWixDQUFvQixJQUFwQixFQUEwQixLQUExQixDQUFQO0FBQ0E7O0FBRU0sV0FBU0MsMEJBQVQsR0FBZ0Y7QUFBQSxzQ0FBekNDLFdBQXlDO0FBQXpDQSxNQUFBQSxXQUF5QztBQUFBOztBQUN0RixXQUFPQSxXQUFXLENBQUNDLElBQVosQ0FBaUIsVUFBQUMsSUFBSTtBQUFB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QXFCckMsY0FBYyxDQUFDOUssVUFBVSxDQUFDZ0IsVUFBWixDQUFuQyxDQUFSO0FBQ0E7QUFDRCxLQWRNLE1BY0E7QUFDTixhQUFPLEVBQVA7QUFDQTs7QUFDRCxXQUFPa00sVUFBVSxHQUFHQyxRQUFILGNBQWtCQSxRQUFsQixNQUFqQjtBQUNBOztBQUVELFdBQVN4QixXQUFULENBQXFCdkssR0FBckIsRUFBK0I7QUFDOUIsV0FBT0EsR0FBRyxJQUFJd0MsTUFBTSxDQUFDaUYsSUFBUCxDQUFZekgsR0FBWixFQUFpQnRCLE1BQWpCLEdBQTBCLENBQXhDO0FBQ0E7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFdBQVN3TCxrQkFBVCxDQUFxRHRMLFVBQXJELEVBQXlJO0FBQ3hJLHFCQUFVQSxVQUFVLENBQUNZLFNBQVgsR0FBdUJaLFVBQVUsQ0FBQ1ksU0FBWCxHQUF1QixHQUE5QyxHQUFvRCxFQUE5RCxTQUFtRVosVUFBVSxDQUFDYSxJQUE5RTtBQUNBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRBbmRBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0QW5kQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRDb25kaXRpb25hbENoZWNrT3JWYWx1ZSxcblx0RW50aXR5VHlwZSxcblx0RXFBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0RXFDb25kaXRpb25hbEV4cHJlc3Npb24sXG5cdEdlQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdEdlQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRHdEFubm90YXRpb25FeHByZXNzaW9uLFxuXHRHdENvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0SWZBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0SWZBbm5vdGF0aW9uRXhwcmVzc2lvblZhbHVlLFxuXHRMZUFubm90YXRpb25FeHByZXNzaW9uLFxuXHRMZUNvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0THRBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0THRDb25kaXRpb25hbEV4cHJlc3Npb24sXG5cdE5lQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdE5lQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHROb3RBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0Tm90Q29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRPckFubm90YXRpb25FeHByZXNzaW9uLFxuXHRPckNvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0UGF0aENvbmRpdGlvbkV4cHJlc3Npb24sXG5cdFByb3BlcnR5QW5ub3RhdGlvblZhbHVlXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgQXBwbHlBbm5vdGF0aW9uRXhwcmVzc2lvbiwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3R5cGVzL0VkbVwiO1xuaW1wb3J0IHsgRW50aXR5U2V0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvQ29udmVydGVyXCI7XG5pbXBvcnQgeyByZXNvbHZlRW51bVZhbHVlIH0gZnJvbSBcIi4vQW5ub3RhdGlvbkVudW1cIjtcblxudHlwZSBQcmltaXRpdmVUeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHwgYm9vbGVhbiB8IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbnR5cGUgQmFzZUV4cHJlc3Npb248VD4gPSB7XG5cdF90eXBlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDb25zdGFudEV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiQ29uc3RhbnRcIjtcblx0dmFsdWU6IFQ7XG59O1xuXG50eXBlIFNldE9wZXJhdG9yID0gXCImJlwiIHwgXCJ8fFwiO1xuZXhwb3J0IHR5cGUgU2V0RXhwcmVzc2lvbiA9IEJhc2VFeHByZXNzaW9uPGJvb2xlYW4+ICYge1xuXHRfdHlwZTogXCJTZXRcIjtcblx0b3BlcmF0b3I6IFNldE9wZXJhdG9yO1xuXHRvcGVyYW5kczogRXhwcmVzc2lvbjxib29sZWFuPltdO1xufTtcblxuZXhwb3J0IHR5cGUgTm90RXhwcmVzc2lvbiA9IEJhc2VFeHByZXNzaW9uPGJvb2xlYW4+ICYge1xuXHRfdHlwZTogXCJOb3RcIjtcblx0b3BlcmFuZDogRXhwcmVzc2lvbjxib29sZWFuPjtcbn07XG5cbmV4cG9ydCB0eXBlIFRydXRoeUV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxib29sZWFuPiAmIHtcblx0X3R5cGU6IFwiVHJ1dGh5XCI7XG5cdG9wZXJhbmQ6IEV4cHJlc3Npb248c3RyaW5nPjtcbn07XG5cbmV4cG9ydCB0eXBlIFJlZmVyZW5jZUV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxvYmplY3Q+ICYge1xuXHRfdHlwZTogXCJSZWZcIjtcblx0cmVmOiBzdHJpbmcgfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgRm9ybWF0dGVyRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJGb3JtYXR0ZXJcIjtcblx0Zm46IHN0cmluZztcblx0cGFyYW1ldGVyczogRXhwcmVzc2lvbjxhbnk+W107XG59O1xuXG5leHBvcnQgdHlwZSBDb21wbGV4VHlwZUV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiQ29tcGxleFR5cGVcIjtcblx0dHlwZTogc3RyaW5nO1xuXHRmb3JtYXRPcHRpb25zOiBvYmplY3Q7XG5cdHBhcmFtZXRlcnM6IG9iamVjdDtcblx0YmluZGluZ1BhcmFtZXRlcnM6IEV4cHJlc3Npb248YW55PltdO1xufTtcblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25FeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkZ1bmN0aW9uXCI7XG5cdG9iaj86IEV4cHJlc3Npb248b2JqZWN0Pjtcblx0Zm46IHN0cmluZztcblx0cGFyYW1ldGVyczogRXhwcmVzc2lvbjxhbnk+W107XG59O1xuXG5leHBvcnQgdHlwZSBDb25jYXRFeHByZXNzaW9uID0gQmFzZUV4cHJlc3Npb248c3RyaW5nPiAmIHtcblx0X3R5cGU6IFwiQ29uY2F0XCI7XG5cdGV4cHJlc3Npb25zOiBFeHByZXNzaW9uPHN0cmluZz5bXTtcbn07XG5cbmV4cG9ydCB0eXBlIExlbmd0aEV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxzdHJpbmc+ICYge1xuXHRfdHlwZTogXCJMZW5ndGhcIjtcblx0YmluZGluZ0V4cHJlc3Npb246IEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxhbnk+O1xufTtcblxuZXhwb3J0IHR5cGUgVW5yZXNvbHZlYWJsZUJpbmRpbmdFeHByZXNzaW9uID0gQmFzZUV4cHJlc3Npb248c3RyaW5nPiAmIHtcblx0X3R5cGU6IFwiVW5yZXNvbHZhYmxlXCI7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvblxuICovXG5leHBvcnQgdHlwZSBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiQmluZGluZ1wiO1xuXHRtb2RlbE5hbWU/OiBzdHJpbmc7XG5cdHBhdGg6IHN0cmluZztcblx0dGFyZ2V0RW50aXR5U2V0PzogRW50aXR5U2V0O1xuXHR0eXBlPzogc3RyaW5nO1xuXHRjb25zdHJhaW50cz86IGFueTtcblx0cGFyYW1ldGVycz86IGFueTtcblx0dGFyZ2V0VHlwZT86IHN0cmluZztcblx0Zm9ybWF0T3B0aW9ucz86IGFueTtcbn07XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiRGVmYXVsdEJpbmRpbmdcIjtcblx0bW9kZWxOYW1lPzogc3RyaW5nO1xuXHRwYXRoOiBzdHJpbmc7XG5cdHR5cGU/OiBzdHJpbmc7XG5cdGNvbnN0cmFpbnRzPzogb2JqZWN0O1xuXHRwYXJhbWV0ZXJzPzogYW55O1xuXHR0YXJnZXRUeXBlPzogc3RyaW5nO1xuXHRmb3JtYXRPcHRpb25zPzogb2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgRW1iZWRkZWRCaW5kaW5nRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJFbWJlZGRlZEJpbmRpbmdcIjtcblx0dmFsdWU6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEVtYmVkZGVkRXhwcmVzc2lvbkJpbmRpbmdFeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkVtYmVkZGVkRXhwcmVzc2lvbkJpbmRpbmdcIjtcblx0dmFsdWU6IHN0cmluZztcbn07XG5cbnR5cGUgQ29tcGFyaXNvbk9wZXJhdG9yID0gXCI9PT1cIiB8IFwiIT09XCIgfCBcIj49XCIgfCBcIj5cIiB8IFwiPD1cIiB8IFwiPFwiO1xuZXhwb3J0IHR5cGUgQ29tcGFyaXNvbkV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxib29sZWFuPiAmIHtcblx0X3R5cGU6IFwiQ29tcGFyaXNvblwiO1xuXHRvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yO1xuXHRvcGVyYW5kMTogRXhwcmVzc2lvbjxhbnk+O1xuXHRvcGVyYW5kMjogRXhwcmVzc2lvbjxhbnk+O1xufTtcblxuZXhwb3J0IHR5cGUgSWZFbHNlRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJJZkVsc2VcIjtcblx0Y29uZGl0aW9uOiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRvblRydWU6IEV4cHJlc3Npb248VD47XG5cdG9uRmFsc2U6IEV4cHJlc3Npb248VD47XG59O1xuXG4vKipcbiAqIEFuIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gdHlwZSBULlxuICpcbiAqIEB0eXBlZGVmIEV4cHJlc3Npb25cbiAqL1xuZXhwb3J0IHR5cGUgRXhwcmVzc2lvbjxUPiA9XG5cdHwgVW5yZXNvbHZlYWJsZUJpbmRpbmdFeHByZXNzaW9uXG5cdHwgQ29uc3RhbnRFeHByZXNzaW9uPFQ+XG5cdHwgU2V0RXhwcmVzc2lvblxuXHR8IE5vdEV4cHJlc3Npb25cblx0fCBUcnV0aHlFeHByZXNzaW9uXG5cdHwgQ29uY2F0RXhwcmVzc2lvblxuXHR8IExlbmd0aEV4cHJlc3Npb25cblx0fCBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD5cblx0fCBFbWJlZGRlZEJpbmRpbmdFeHByZXNzaW9uPFQ+XG5cdHwgRW1iZWRkZWRFeHByZXNzaW9uQmluZGluZ0V4cHJlc3Npb248VD5cblx0fCBEZWZhdWx0QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+XG5cdHwgQ29tcGFyaXNvbkV4cHJlc3Npb25cblx0fCBJZkVsc2VFeHByZXNzaW9uPFQ+XG5cdHwgRm9ybWF0dGVyRXhwcmVzc2lvbjxUPlxuXHR8IENvbXBsZXhUeXBlRXhwcmVzc2lvbjxUPlxuXHR8IFJlZmVyZW5jZUV4cHJlc3Npb25cblx0fCBGdW5jdGlvbkV4cHJlc3Npb248VD47XG5cbi8qKlxuICogQW4gZXhwcmVzc2lvbiB0aGF0IGV2YWx1YXRlcyB0byB0eXBlIFQsIG9yIGEgY29uc3RhbnQgdmFsdWUgb2YgdHlwZSBUXG4gKi9cbmV4cG9ydCB0eXBlIEV4cHJlc3Npb25PclByaW1pdGl2ZTxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4gPSBFeHByZXNzaW9uPFQ+IHwgVDtcblxuZXhwb3J0IGNvbnN0IHVucmVzb2x2ZWFibGVFeHByZXNzaW9uOiBVbnJlc29sdmVhYmxlQmluZGluZ0V4cHJlc3Npb24gPSB7XG5cdF90eXBlOiBcIlVucmVzb2x2YWJsZVwiXG59O1xuXG5mdW5jdGlvbiBlc2NhcGVYbWxBdHRyaWJ1dGUoaW5wdXRTdHJpbmc6IHN0cmluZykge1xuXHRyZXR1cm4gaW5wdXRTdHJpbmcucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4uZXhwcmVzc2lvbnM6IEV4cHJlc3Npb248YW55PltdKTogYm9vbGVhbiB7XG5cdHJldHVybiBleHByZXNzaW9ucy5maW5kKGV4cHIgPT4gZXhwci5fdHlwZSA9PT0gXCJVbnJlc29sdmFibGVcIikgIT09IHVuZGVmaW5lZDtcbn1cbi8qKlxuICogQ2hlY2sgdHdvIGV4cHJlc3Npb25zIGZvciAoZGVlcCkgZXF1YWxpdHkuXG4gKlxuICogQHBhcmFtIGFcbiAqIEBwYXJhbSBiXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB0d28gZXhwcmVzc2lvbnMgYXJlIGVxdWFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsPFQ+KGE6IEV4cHJlc3Npb248VD4sIGI6IEV4cHJlc3Npb248VD4pOiBib29sZWFuIHtcblx0aWYgKGEuX3R5cGUgIT09IGIuX3R5cGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRzd2l0Y2ggKGEuX3R5cGUpIHtcblx0XHRjYXNlIFwiVW5yZXNvbHZhYmxlXCI6XG5cdFx0XHRyZXR1cm4gZmFsc2U7IC8vIFVucmVzb2x2YWJsZSBpcyBuZXZlciBlcXVhbCB0byBhbnl0aGluZyBldmVuIGl0c2VsZlxuXHRcdGNhc2UgXCJDb25zdGFudFwiOlxuXHRcdGNhc2UgXCJFbWJlZGRlZEJpbmRpbmdcIjpcblx0XHRjYXNlIFwiRW1iZWRkZWRFeHByZXNzaW9uQmluZGluZ1wiOlxuXHRcdFx0cmV0dXJuIGEudmFsdWUgPT09IChiIGFzIENvbnN0YW50RXhwcmVzc2lvbjxUPikudmFsdWU7XG5cblx0XHRjYXNlIFwiTm90XCI6XG5cdFx0XHRyZXR1cm4gX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChhLm9wZXJhbmQsIChiIGFzIE5vdEV4cHJlc3Npb24pLm9wZXJhbmQpO1xuXHRcdGNhc2UgXCJUcnV0aHlcIjpcblx0XHRcdHJldHVybiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub3BlcmFuZCwgKGIgYXMgVHJ1dGh5RXhwcmVzc2lvbikub3BlcmFuZCk7XG5cdFx0Y2FzZSBcIlNldFwiOlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0YS5vcGVyYXRvciA9PT0gKGIgYXMgU2V0RXhwcmVzc2lvbikub3BlcmF0b3IgJiZcblx0XHRcdFx0YS5vcGVyYW5kcy5sZW5ndGggPT09IChiIGFzIFNldEV4cHJlc3Npb24pLm9wZXJhbmRzLmxlbmd0aCAmJlxuXHRcdFx0XHRhLm9wZXJhbmRzLmV2ZXJ5KGV4cHJlc3Npb24gPT5cblx0XHRcdFx0XHQoYiBhcyBTZXRFeHByZXNzaW9uKS5vcGVyYW5kcy5zb21lKG90aGVyRXhwcmVzc2lvbiA9PiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGV4cHJlc3Npb24sIG90aGVyRXhwcmVzc2lvbikpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cblx0XHRjYXNlIFwiSWZFbHNlXCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEuY29uZGl0aW9uLCAoYiBhcyBJZkVsc2VFeHByZXNzaW9uPFQ+KS5jb25kaXRpb24pICYmXG5cdFx0XHRcdF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vblRydWUsIChiIGFzIElmRWxzZUV4cHJlc3Npb248VD4pLm9uVHJ1ZSkgJiZcblx0XHRcdFx0X2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChhLm9uRmFsc2UsIChiIGFzIElmRWxzZUV4cHJlc3Npb248VD4pLm9uRmFsc2UpXG5cdFx0XHQpO1xuXG5cdFx0Y2FzZSBcIkNvbXBhcmlzb25cIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGEub3BlcmF0b3IgPT09IChiIGFzIENvbXBhcmlzb25FeHByZXNzaW9uKS5vcGVyYXRvciAmJlxuXHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub3BlcmFuZDEsIChiIGFzIENvbXBhcmlzb25FeHByZXNzaW9uKS5vcGVyYW5kMSkgJiZcblx0XHRcdFx0X2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChhLm9wZXJhbmQyLCAoYiBhcyBDb21wYXJpc29uRXhwcmVzc2lvbikub3BlcmFuZDIpXG5cdFx0XHQpO1xuXG5cdFx0Y2FzZSBcIkNvbmNhdFwiOlxuXHRcdFx0Y29uc3QgYUV4cHJlc3Npb25zID0gYS5leHByZXNzaW9ucztcblx0XHRcdGNvbnN0IGJFeHByZXNzaW9ucyA9IChiIGFzIENvbmNhdEV4cHJlc3Npb24pLmV4cHJlc3Npb25zO1xuXHRcdFx0aWYgKGFFeHByZXNzaW9ucy5sZW5ndGggIT09IGJFeHByZXNzaW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFFeHByZXNzaW9ucy5ldmVyeSgoZXhwcmVzc2lvbiwgaW5kZXgpID0+IHtcblx0XHRcdFx0cmV0dXJuIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoZXhwcmVzc2lvbiwgYkV4cHJlc3Npb25zW2luZGV4XSk7XG5cdFx0XHR9KTtcblxuXHRcdGNhc2UgXCJMZW5ndGhcIjpcblx0XHRcdHJldHVybiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEuYmluZGluZ0V4cHJlc3Npb24sIChiIGFzIExlbmd0aEV4cHJlc3Npb24pLmJpbmRpbmdFeHByZXNzaW9uKTtcblxuXHRcdGNhc2UgXCJCaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLm1vZGVsTmFtZSA9PT0gKGIgYXMgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+KS5tb2RlbE5hbWUgJiZcblx0XHRcdFx0YS5wYXRoID09PSAoYiBhcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4pLnBhdGggJiZcblx0XHRcdFx0YS50YXJnZXRFbnRpdHlTZXQgPT09IChiIGFzIEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPikudGFyZ2V0RW50aXR5U2V0XG5cdFx0XHQpO1xuXG5cdFx0Y2FzZSBcIkRlZmF1bHRCaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLm1vZGVsTmFtZSA9PT0gKGIgYXMgRGVmYXVsdEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPikubW9kZWxOYW1lICYmXG5cdFx0XHRcdGEucGF0aCA9PT0gKGIgYXMgRGVmYXVsdEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPikucGF0aFxuXHRcdFx0KTtcblxuXHRcdGNhc2UgXCJGb3JtYXR0ZXJcIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGEuZm4gPT09IChiIGFzIEZvcm1hdHRlckV4cHJlc3Npb248VD4pLmZuICYmXG5cdFx0XHRcdGEucGFyYW1ldGVycy5sZW5ndGggPT09IChiIGFzIEZvcm1hdHRlckV4cHJlc3Npb248VD4pLnBhcmFtZXRlcnMubGVuZ3RoICYmXG5cdFx0XHRcdGEucGFyYW1ldGVycy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKChiIGFzIEZvcm1hdHRlckV4cHJlc3Npb248VD4pLnBhcmFtZXRlcnNbaW5kZXhdLCB2YWx1ZSkpXG5cdFx0XHQpO1xuXHRcdGNhc2UgXCJDb21wbGV4VHlwZVwiOlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0YS50eXBlID09PSAoYiBhcyBDb21wbGV4VHlwZUV4cHJlc3Npb248VD4pLnR5cGUgJiZcblx0XHRcdFx0YS5iaW5kaW5nUGFyYW1ldGVycy5sZW5ndGggPT09IChiIGFzIENvbXBsZXhUeXBlRXhwcmVzc2lvbjxUPikuYmluZGluZ1BhcmFtZXRlcnMubGVuZ3RoICYmXG5cdFx0XHRcdGEuYmluZGluZ1BhcmFtZXRlcnMuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT5cblx0XHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKChiIGFzIENvbXBsZXhUeXBlRXhwcmVzc2lvbjxUPikuYmluZGluZ1BhcmFtZXRlcnNbaW5kZXhdLCB2YWx1ZSlcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHRjYXNlIFwiRnVuY3Rpb25cIjpcblx0XHRcdGNvbnN0IG90aGVyRnVuY3Rpb24gPSBiIGFzIEZ1bmN0aW9uRXhwcmVzc2lvbjxUPjtcblx0XHRcdGlmIChhLm9iaiA9PT0gdW5kZWZpbmVkIHx8IG90aGVyRnVuY3Rpb24ub2JqID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGEub2JqID09PSBvdGhlckZ1bmN0aW9uO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLmZuID09PSBvdGhlckZ1bmN0aW9uLmZuICYmXG5cdFx0XHRcdF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vYmosIG90aGVyRnVuY3Rpb24ub2JqKSAmJlxuXHRcdFx0XHRhLnBhcmFtZXRlcnMubGVuZ3RoID09PSBvdGhlckZ1bmN0aW9uLnBhcmFtZXRlcnMubGVuZ3RoICYmXG5cdFx0XHRcdGEucGFyYW1ldGVycy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKG90aGVyRnVuY3Rpb24ucGFyYW1ldGVyc1tpbmRleF0sIHZhbHVlKSlcblx0XHRcdCk7XG5cblx0XHRjYXNlIFwiUmVmXCI6XG5cdFx0XHRyZXR1cm4gYS5yZWYgPT09IChiIGFzIFJlZmVyZW5jZUV4cHJlc3Npb24pLnJlZjtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBuZXN0ZWQgU2V0RXhwcmVzc2lvbiBieSBpbmxpbmluZyBvcGVyYW5kcyBvZiB0eXBlIFNldEV4cHJlc3Npb24gd2l0aCB0aGUgc2FtZSBvcGVyYXRvci5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBmbGF0dGVuXG4gKiBAcmV0dXJucyB7U2V0RXhwcmVzc2lvbn0gQSBuZXcgU2V0RXhwcmVzc2lvbiB3aXRoIHRoZSBzYW1lIG9wZXJhdG9yXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5TZXRFeHByZXNzaW9uKGV4cHJlc3Npb246IFNldEV4cHJlc3Npb24pOiBTZXRFeHByZXNzaW9uIHtcblx0cmV0dXJuIGV4cHJlc3Npb24ub3BlcmFuZHMucmVkdWNlKFxuXHRcdChyZXN1bHQ6IFNldEV4cHJlc3Npb24sIG9wZXJhbmQpID0+IHtcblx0XHRcdGNvbnN0IGNhbmRpZGF0ZXNGb3JGbGF0dGVuaW5nID1cblx0XHRcdFx0b3BlcmFuZC5fdHlwZSA9PT0gXCJTZXRcIiAmJiBvcGVyYW5kLm9wZXJhdG9yID09PSBleHByZXNzaW9uLm9wZXJhdG9yID8gb3BlcmFuZC5vcGVyYW5kcyA6IFtvcGVyYW5kXTtcblx0XHRcdGNhbmRpZGF0ZXNGb3JGbGF0dGVuaW5nLmZvckVhY2goY2FuZGlkYXRlID0+IHtcblx0XHRcdFx0aWYgKHJlc3VsdC5vcGVyYW5kcy5ldmVyeShlID0+ICFfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGUsIGNhbmRpZGF0ZSkpKSB7XG5cdFx0XHRcdFx0cmVzdWx0Lm9wZXJhbmRzLnB1c2goY2FuZGlkYXRlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH0sXG5cdFx0eyBfdHlwZTogXCJTZXRcIiwgb3BlcmF0b3I6IGV4cHJlc3Npb24ub3BlcmF0b3IsIG9wZXJhbmRzOiBbXSB9XG5cdCk7XG59XG5cbi8qKlxuICogRGV0ZWN0cyB3aGV0aGVyIGFuIGFycmF5IG9mIGJvb2xlYW4gZXhwcmVzc2lvbnMgY29udGFpbnMgYW4gZXhwcmVzc2lvbiBhbmQgaXRzIG5lZ2F0aW9uLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9ucyBBcnJheSBvZiBleHByZXNzaW9uc1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgc2V0IG9mIGV4cHJlc3Npb25zIGNvbnRhaW5zIGFuIGV4cHJlc3Npb24gYW5kIGl0cyBuZWdhdGlvblxuICovXG5mdW5jdGlvbiBoYXNPcHBvc2l0ZUV4cHJlc3Npb25zKGV4cHJlc3Npb25zOiBFeHByZXNzaW9uPGJvb2xlYW4+W10pOiBib29sZWFuIHtcblx0Y29uc3QgbmVnYXRlZEV4cHJlc3Npb25zID0gZXhwcmVzc2lvbnMubWFwKG5vdCk7XG5cdHJldHVybiBleHByZXNzaW9ucy5zb21lKChleHByZXNzaW9uLCBpbmRleCkgPT4ge1xuXHRcdGZvciAobGV0IGkgPSBpbmRleCArIDE7IGkgPCBuZWdhdGVkRXhwcmVzc2lvbnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGV4cHJlc3Npb24sIG5lZ2F0ZWRFeHByZXNzaW9uc1tpXSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSk7XG59XG5cbi8qKlxuICogTG9naWNhbCBgYW5kYCBleHByZXNzaW9uLlxuICpcbiAqIFRoZSBleHByZXNzaW9uIGlzIHNpbXBsaWZpZWQgdG8gZmFsc2UgaWYgdGhpcyBjYW4gYmUgZGVjaWRlZCBzdGF0aWNhbGx5ICh0aGF0IGlzLCBpZiBvbmUgb3BlcmFuZCBpcyBhIGNvbnN0YW50XG4gKiBmYWxzZSBvciBpZiB0aGUgZXhwcmVzc2lvbiBjb250YWlucyBhbiBvcGVyYW5kIGFuZCBpdHMgbmVnYXRpb24pLlxuICpcbiAqIEBwYXJhbSBvcGVyYW5kcyBFeHByZXNzaW9ucyB0byBjb25uZWN0IGJ5IGBhbmRgXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gRXhwcmVzc2lvbiBldmFsdWF0aW5nIHRvIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuZCguLi5vcGVyYW5kczogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+W10pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgZXhwcmVzc2lvbnMgPSBmbGF0dGVuU2V0RXhwcmVzc2lvbih7XG5cdFx0X3R5cGU6IFwiU2V0XCIsXG5cdFx0b3BlcmF0b3I6IFwiJiZcIixcblx0XHRvcGVyYW5kczogb3BlcmFuZHMubWFwKHdyYXBQcmltaXRpdmUpXG5cdH0pLm9wZXJhbmRzO1xuXG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiguLi5leHByZXNzaW9ucykpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0bGV0IGlzU3RhdGljRmFsc2UgPSBmYWxzZTtcblx0Y29uc3Qgbm9uVHJpdmlhbEV4cHJlc3Npb24gPSBleHByZXNzaW9ucy5maWx0ZXIoZXhwcmVzc2lvbiA9PiB7XG5cdFx0aWYgKGlzRmFsc2UoZXhwcmVzc2lvbikpIHtcblx0XHRcdGlzU3RhdGljRmFsc2UgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gIWlzQ29uc3RhbnQoZXhwcmVzc2lvbik7XG5cdH0pO1xuXHRpZiAoaXNTdGF0aWNGYWxzZSkge1xuXHRcdHJldHVybiBjb25zdGFudChmYWxzZSk7XG5cdH0gZWxzZSBpZiAobm9uVHJpdmlhbEV4cHJlc3Npb24ubGVuZ3RoID09PSAwKSB7XG5cdFx0Ly8gUmVzb2x2ZSB0aGUgY29uc3RhbnQgdGhlblxuXHRcdGNvbnN0IGlzVmFsaWQgPSBleHByZXNzaW9ucy5yZWR1Y2UoKHJlc3VsdCwgZXhwcmVzc2lvbikgPT4gcmVzdWx0ICYmIGlzVHJ1ZShleHByZXNzaW9uKSwgdHJ1ZSk7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGlzVmFsaWQpO1xuXHR9IGVsc2UgaWYgKG5vblRyaXZpYWxFeHByZXNzaW9uLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBub25Ucml2aWFsRXhwcmVzc2lvblswXTtcblx0fSBlbHNlIGlmIChoYXNPcHBvc2l0ZUV4cHJlc3Npb25zKG5vblRyaXZpYWxFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBjb25zdGFudChmYWxzZSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdF90eXBlOiBcIlNldFwiLFxuXHRcdFx0b3BlcmF0b3I6IFwiJiZcIixcblx0XHRcdG9wZXJhbmRzOiBub25Ucml2aWFsRXhwcmVzc2lvblxuXHRcdH07XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpY2FsIGBvcmAgZXhwcmVzc2lvbi5cbiAqXG4gKiBUaGUgZXhwcmVzc2lvbiBpcyBzaW1wbGlmaWVkIHRvIHRydWUgaWYgdGhpcyBjYW4gYmUgZGVjaWRlZCBzdGF0aWNhbGx5ICh0aGF0IGlzLCBpZiBvbmUgb3BlcmFuZCBpcyBhIGNvbnN0YW50XG4gKiB0cnVlIG9yIGlmIHRoZSBleHByZXNzaW9uIGNvbnRhaW5zIGFuIG9wZXJhbmQgYW5kIGl0cyBuZWdhdGlvbikuXG4gKlxuICogQHBhcmFtIG9wZXJhbmRzIEV4cHJlc3Npb25zIHRvIGNvbm5lY3QgYnkgYG9yYFxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IEV4cHJlc3Npb24gZXZhbHVhdGluZyB0byBib29sZWFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvciguLi5vcGVyYW5kczogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+W10pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgZXhwcmVzc2lvbnMgPSBmbGF0dGVuU2V0RXhwcmVzc2lvbih7XG5cdFx0X3R5cGU6IFwiU2V0XCIsXG5cdFx0b3BlcmF0b3I6IFwifHxcIixcblx0XHRvcGVyYW5kczogb3BlcmFuZHMubWFwKHdyYXBQcmltaXRpdmUpXG5cdH0pLm9wZXJhbmRzO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4uZXhwcmVzc2lvbnMpKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGxldCBpc1N0YXRpY1RydWUgPSBmYWxzZTtcblx0Y29uc3Qgbm9uVHJpdmlhbEV4cHJlc3Npb24gPSBleHByZXNzaW9ucy5maWx0ZXIoZXhwcmVzc2lvbiA9PiB7XG5cdFx0aWYgKGlzVHJ1ZShleHByZXNzaW9uKSkge1xuXHRcdFx0aXNTdGF0aWNUcnVlID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuICFpc0NvbnN0YW50KGV4cHJlc3Npb24pIHx8IGV4cHJlc3Npb24udmFsdWU7XG5cdH0pO1xuXHRpZiAoaXNTdGF0aWNUcnVlKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xuXHR9IGVsc2UgaWYgKG5vblRyaXZpYWxFeHByZXNzaW9uLmxlbmd0aCA9PT0gMCkge1xuXHRcdC8vIFJlc29sdmUgdGhlIGNvbnN0YW50IHRoZW5cblx0XHRjb25zdCBpc1ZhbGlkID0gZXhwcmVzc2lvbnMucmVkdWNlKChyZXN1bHQsIGV4cHJlc3Npb24pID0+IHJlc3VsdCAmJiBpc1RydWUoZXhwcmVzc2lvbiksIHRydWUpO1xuXHRcdHJldHVybiBjb25zdGFudChpc1ZhbGlkKTtcblx0fSBlbHNlIGlmIChub25Ucml2aWFsRXhwcmVzc2lvbi5sZW5ndGggPT09IDEpIHtcblx0XHRyZXR1cm4gbm9uVHJpdmlhbEV4cHJlc3Npb25bMF07XG5cdH0gZWxzZSBpZiAoaGFzT3Bwb3NpdGVFeHByZXNzaW9ucyhub25Ucml2aWFsRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdF90eXBlOiBcIlNldFwiLFxuXHRcdFx0b3BlcmF0b3I6IFwifHxcIixcblx0XHRcdG9wZXJhbmRzOiBub25Ucml2aWFsRXhwcmVzc2lvblxuXHRcdH07XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpY2FsIGBub3RgIG9wZXJhdG9yLlxuICpcbiAqIEBwYXJhbSBvcGVyYW5kIFRoZSBleHByZXNzaW9uIHRvIHJldmVyc2VcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBUaGUgcmVzdWx0aW5nIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gYm9vbGVhblxuICovXG5leHBvcnQgZnVuY3Rpb24gbm90KG9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRvcGVyYW5kID0gd3JhcFByaW1pdGl2ZShvcGVyYW5kKTtcblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKG9wZXJhbmQpKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9IGVsc2UgaWYgKGlzQ29uc3RhbnQob3BlcmFuZCkpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoIW9wZXJhbmQudmFsdWUpO1xuXHR9IGVsc2UgaWYgKFxuXHRcdHR5cGVvZiBvcGVyYW5kID09PSBcIm9iamVjdFwiICYmXG5cdFx0b3BlcmFuZC5fdHlwZSA9PT0gXCJTZXRcIiAmJlxuXHRcdG9wZXJhbmQub3BlcmF0b3IgPT09IFwifHxcIiAmJlxuXHRcdG9wZXJhbmQub3BlcmFuZHMuZXZlcnkoZXhwcmVzc2lvbiA9PiBpc0NvbnN0YW50KGV4cHJlc3Npb24pIHx8IGlzQ29tcGFyaXNvbihleHByZXNzaW9uKSlcblx0KSB7XG5cdFx0cmV0dXJuIGFuZCguLi5vcGVyYW5kLm9wZXJhbmRzLm1hcChleHByZXNzaW9uID0+IG5vdChleHByZXNzaW9uKSkpO1xuXHR9IGVsc2UgaWYgKFxuXHRcdHR5cGVvZiBvcGVyYW5kID09PSBcIm9iamVjdFwiICYmXG5cdFx0b3BlcmFuZC5fdHlwZSA9PT0gXCJTZXRcIiAmJlxuXHRcdG9wZXJhbmQub3BlcmF0b3IgPT09IFwiJiZcIiAmJlxuXHRcdG9wZXJhbmQub3BlcmFuZHMuZXZlcnkoZXhwcmVzc2lvbiA9PiBpc0NvbnN0YW50KGV4cHJlc3Npb24pIHx8IGlzQ29tcGFyaXNvbihleHByZXNzaW9uKSlcblx0KSB7XG5cdFx0cmV0dXJuIG9yKC4uLm9wZXJhbmQub3BlcmFuZHMubWFwKGV4cHJlc3Npb24gPT4gbm90KGV4cHJlc3Npb24pKSk7XG5cdH0gZWxzZSBpZiAoaXNDb21wYXJpc29uKG9wZXJhbmQpKSB7XG5cdFx0Ly8gQ3JlYXRlIHRoZSByZXZlcnNlIGNvbXBhcmlzb25cblx0XHRzd2l0Y2ggKG9wZXJhbmQub3BlcmF0b3IpIHtcblx0XHRcdGNhc2UgXCIhPT1cIjpcblx0XHRcdFx0cmV0dXJuIHsgLi4ub3BlcmFuZCwgb3BlcmF0b3I6IFwiPT09XCIgfTtcblx0XHRcdGNhc2UgXCI8XCI6XG5cdFx0XHRcdHJldHVybiB7IC4uLm9wZXJhbmQsIG9wZXJhdG9yOiBcIj49XCIgfTtcblx0XHRcdGNhc2UgXCI8PVwiOlxuXHRcdFx0XHRyZXR1cm4geyAuLi5vcGVyYW5kLCBvcGVyYXRvcjogXCI+XCIgfTtcblx0XHRcdGNhc2UgXCI9PT1cIjpcblx0XHRcdFx0cmV0dXJuIHsgLi4ub3BlcmFuZCwgb3BlcmF0b3I6IFwiIT09XCIgfTtcblx0XHRcdGNhc2UgXCI+XCI6XG5cdFx0XHRcdHJldHVybiB7IC4uLm9wZXJhbmQsIG9wZXJhdG9yOiBcIjw9XCIgfTtcblx0XHRcdGNhc2UgXCI+PVwiOlxuXHRcdFx0XHRyZXR1cm4geyAuLi5vcGVyYW5kLCBvcGVyYXRvcjogXCI8XCIgfTtcblx0XHR9XG5cdH0gZWxzZSBpZiAob3BlcmFuZC5fdHlwZSA9PT0gXCJOb3RcIikge1xuXHRcdHJldHVybiBvcGVyYW5kLm9wZXJhbmQ7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdF90eXBlOiBcIk5vdFwiLFxuXHRcdG9wZXJhbmQ6IG9wZXJhbmRcblx0fTtcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZXMgd2hldGhlciBhIGJpbmRpbmcgZXhwcmVzc2lvbiBpcyBlcXVhbCB0byB0cnVlIHdpdGggYSBsb29zZSBlcXVhbGl0eS5cbiAqXG4gKiBAcGFyYW0gb3BlcmFuZCBUaGUgZXhwcmVzc2lvbiB0byBjaGVja1xuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IFRoZSByZXN1bHRpbmcgZXhwcmVzc2lvbiB0aGF0IGV2YWx1YXRlcyB0byBib29sZWFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RydXRoeShvcGVyYW5kOiBFeHByZXNzaW9uPHN0cmluZz4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0aWYgKGlzQ29uc3RhbnQob3BlcmFuZCkpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoISFvcGVyYW5kLnZhbHVlKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0X3R5cGU6IFwiVHJ1dGh5XCIsXG5cdFx0XHRvcGVyYW5kOiBvcGVyYW5kXG5cdFx0fTtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBiaW5kaW5nIGV4cHJlc3Npb24gdGhhdCB3aWxsIGJlIGV2YWx1YXRlZCBieSB0aGUgY29ycmVzcG9uZGluZyBtb2RlbC5cbiAqXG4gKiBAdGVtcGxhdGUgVGFyZ2V0VHlwZVxuICogQHBhcmFtIHBhdGggVGhlIHBhdGggb24gdGhlIG1vZGVsXG4gKiBAcGFyYW0gW21vZGVsTmFtZV0gVGhlIG5hbWUgb2YgdGhlIG1vZGVsXG4gKiBAcGFyYW0gW3Zpc2l0ZWROYXZpZ2F0aW9uUGF0aHNdIFRoZSBwYXRocyBmcm9tIHRoZSByb290IGVudGl0eVNldFxuICogQHBhcmFtIFtwYXRoVmlzaXRvcl0gQSBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIHJlc3VsdGluZyBwYXRoXG4gKiBAcmV0dXJucyB7QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFRhcmdldFR5cGU+fSBUaGUgZGVmYXVsdCBiaW5kaW5nIGV4cHJlc3Npb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmRpbmdFeHByZXNzaW9uPFRhcmdldFR5cGUgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0cGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRtb2RlbE5hbWU/OiBzdHJpbmcsXG5cdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdID0gW10sXG5cdHBhdGhWaXNpdG9yPzogRnVuY3Rpb25cbik6IEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUYXJnZXRUeXBlPiB8IFVucmVzb2x2ZWFibGVCaW5kaW5nRXhwcmVzc2lvbiB7XG5cdGlmIChwYXRoID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0bGV0IHRhcmdldFBhdGg7XG5cdGlmIChwYXRoVmlzaXRvcikge1xuXHRcdHRhcmdldFBhdGggPSBwYXRoVmlzaXRvcihwYXRoKTtcblx0XHRpZiAodGFyZ2V0UGF0aCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGxvY2FsUGF0aCA9IHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMuY29uY2F0KCk7XG5cdFx0bG9jYWxQYXRoLnB1c2gocGF0aCk7XG5cdFx0dGFyZ2V0UGF0aCA9IGxvY2FsUGF0aC5qb2luKFwiL1wiKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdF90eXBlOiBcIkJpbmRpbmdcIixcblx0XHRtb2RlbE5hbWU6IG1vZGVsTmFtZSxcblx0XHRwYXRoOiB0YXJnZXRQYXRoXG5cdH07XG59XG5cbnR5cGUgUGxhaW5FeHByZXNzaW9uT2JqZWN0ID0geyBbaW5kZXg6IHN0cmluZ106IEV4cHJlc3Npb248YW55PiB9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb25zdGFudCBleHByZXNzaW9uIGJhc2VkIG9uIGEgcHJpbWl0aXZlIHZhbHVlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0gdmFsdWUgVGhlIGNvbnN0YW50IHRvIHdyYXAgaW4gYW4gZXhwcmVzc2lvblxuICogQHJldHVybnMge0NvbnN0YW50RXhwcmVzc2lvbjxUPn0gVGhlIGNvbnN0YW50IGV4cHJlc3Npb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0YW50PFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPih2YWx1ZTogVCk6IENvbnN0YW50RXhwcmVzc2lvbjxUPiB7XG5cdGxldCBjb25zdGFudFZhbHVlOiBUO1xuXG5cdGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0Y29uc3RhbnRWYWx1ZSA9IHZhbHVlLm1hcCh3cmFwUHJpbWl0aXZlKSBhcyBUO1xuXHRcdH0gZWxzZSBpZiAoaXNQcmltaXRpdmVPYmplY3QodmFsdWUpKSB7XG5cdFx0XHRjb25zdGFudFZhbHVlID0gdmFsdWUudmFsdWVPZigpIGFzIFQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0YW50VmFsdWUgPSBPYmplY3QuZW50cmllcyh2YWx1ZSkucmVkdWNlKChwbGFpbkV4cHJlc3Npb24sIFtrZXksIHZhbF0pID0+IHtcblx0XHRcdFx0Y29uc3Qgd3JhcHBlZFZhbHVlID0gd3JhcFByaW1pdGl2ZSh2YWwpO1xuXHRcdFx0XHRpZiAod3JhcHBlZFZhbHVlLl90eXBlICE9PSBcIkNvbnN0YW50XCIgfHwgd3JhcHBlZFZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRwbGFpbkV4cHJlc3Npb25ba2V5XSA9IHdyYXBwZWRWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcGxhaW5FeHByZXNzaW9uO1xuXHRcdFx0fSwge30gYXMgUGxhaW5FeHByZXNzaW9uT2JqZWN0KSBhcyBUO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb25zdGFudFZhbHVlID0gdmFsdWU7XG5cdH1cblxuXHRyZXR1cm4geyBfdHlwZTogXCJDb25zdGFudFwiLCB2YWx1ZTogY29uc3RhbnRWYWx1ZSB9O1xufVxuXG50eXBlIEV2YWx1YXRpb25UeXBlID0gXCJib29sZWFuXCI7XG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJpbmRpbmdTdHJpbmc8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHR2YWx1ZTogc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcixcblx0dGFyZ2V0VHlwZT86IEV2YWx1YXRpb25UeXBlXG4pOiBDb25zdGFudEV4cHJlc3Npb248VD4gfCBFbWJlZGRlZEJpbmRpbmdFeHByZXNzaW9uPFQ+IHwgRW1iZWRkZWRFeHByZXNzaW9uQmluZGluZ0V4cHJlc3Npb248VD4ge1xuXHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUuc3RhcnRzV2l0aChcIntcIikpIHtcblx0XHRpZiAodmFsdWUuc3RhcnRzV2l0aChcIns9XCIpKSB7XG5cdFx0XHQvLyBFeHByZXNzaW9uIGJpbmRpbmcsIHdlIGNhbiBqdXN0IHJlbW92ZSB0aGUgb3V0ZXIgYmluZGluZyB0aGluZ3Ncblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdF90eXBlOiBcIkVtYmVkZGVkRXhwcmVzc2lvbkJpbmRpbmdcIixcblx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRfdHlwZTogXCJFbWJlZGRlZEJpbmRpbmdcIixcblx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIGlmICh0YXJnZXRUeXBlID09PSBcImJvb2xlYW5cIiAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgKHZhbHVlID09PSBcInRydWVcIiB8fCB2YWx1ZSA9PT0gXCJmYWxzZVwiKSkge1xuXHRcdHJldHVybiBjb25zdGFudCh2YWx1ZSA9PT0gXCJ0cnVlXCIpIGFzIENvbnN0YW50RXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gY29uc3RhbnQodmFsdWUpIGFzIENvbnN0YW50RXhwcmVzc2lvbjxUPjtcblx0fVxufVxuXG4vKipcbiAqIEEgbmFtZWQgcmVmZXJlbmNlLlxuICpcbiAqIEBzZWUgZm5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlIFJlZmVyZW5jZVxuICogQHJldHVybnMge1JlZmVyZW5jZUV4cHJlc3Npb259IFRoZSBvYmplY3QgcmVmZXJlbmNlIGJpbmRpbmcgcGFydFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmKHJlZmVyZW5jZTogc3RyaW5nIHwgbnVsbCk6IFJlZmVyZW5jZUV4cHJlc3Npb24ge1xuXHRyZXR1cm4geyBfdHlwZTogXCJSZWZcIiwgcmVmOiByZWZlcmVuY2UgfTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgdHlwZSBpcyBhbiBleHByZXNzaW9uLlxuICpcbiAqIEV2ZXJ5IG9iamVjdCBoYXZpbmcgYSBwcm9wZXJ0eSBuYW1lZCBgX3R5cGVgIG9mIHNvbWUgdmFsdWUgaXMgY29uc2lkZXJlZCBhbiBleHByZXNzaW9uLCBldmVuIGlmIHRoZXJlIGlzIGFjdHVhbGx5XG4gKiBubyBzdWNoIGV4cHJlc3Npb24gdHlwZSBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHNvbWV0aGluZyBUeXBlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB0eXBlIGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gZXhwcmVzc2lvblxuICovXG5mdW5jdGlvbiBpc0V4cHJlc3Npb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KHNvbWV0aGluZzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+KTogc29tZXRoaW5nIGlzIEV4cHJlc3Npb248VD4ge1xuXHRyZXR1cm4gc29tZXRoaW5nICE9PSBudWxsICYmIHR5cGVvZiBzb21ldGhpbmcgPT09IFwib2JqZWN0XCIgJiYgKHNvbWV0aGluZyBhcyBCYXNlRXhwcmVzc2lvbjxUPikuX3R5cGUgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXcmFwIGEgcHJpbWl0aXZlIGludG8gYSBjb25zdGFudCBleHByZXNzaW9uIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGFuIGV4cHJlc3Npb24uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSBzb21ldGhpbmcgVGhlIG9iamVjdCB0byB3cmFwIGluIGEgQ29uc3RhbnQgZXhwcmVzc2lvblxuICogQHJldHVybnMge0V4cHJlc3Npb248VD59IEVpdGhlciB0aGUgb3JpZ2luYWwgb2JqZWN0IG9yIHRoZSB3cmFwcGVkIG9uZSBkZXBlbmRpbmcgb24gdGhlIGNhc2VcbiAqL1xuZnVuY3Rpb24gd3JhcFByaW1pdGl2ZTxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oc29tZXRoaW5nOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4pOiBFeHByZXNzaW9uPFQ+IHtcblx0aWYgKGlzRXhwcmVzc2lvbihzb21ldGhpbmcpKSB7XG5cdFx0cmV0dXJuIHNvbWV0aGluZztcblx0fVxuXG5cdHJldHVybiBjb25zdGFudChzb21ldGhpbmcpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZXhwcmVzc2lvbiBvciB2YWx1ZSBwcm92aWRlZCBpcyBjb25zdGFudCBvciBub3QuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gIG1heWJlQ29uc3RhbnQgVGhlIGV4cHJlc3Npb24gb3IgcHJpbWl0aXZlIHZhbHVlIHRoYXQgaXMgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBpdCBpcyBjb25zdGFudFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb25zdGFudDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4obWF5YmVDb25zdGFudDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+KTogbWF5YmVDb25zdGFudCBpcyBDb25zdGFudEV4cHJlc3Npb248VD4ge1xuXHRyZXR1cm4gdHlwZW9mIG1heWJlQ29uc3RhbnQgIT09IFwib2JqZWN0XCIgfHwgKG1heWJlQ29uc3RhbnQgYXMgQmFzZUV4cHJlc3Npb248VD4pLl90eXBlID09PSBcIkNvbnN0YW50XCI7XG59XG5cbmZ1bmN0aW9uIGlzVHJ1ZShleHByZXNzaW9uOiBFeHByZXNzaW9uPFByaW1pdGl2ZVR5cGU+KSB7XG5cdHJldHVybiBpc0NvbnN0YW50KGV4cHJlc3Npb24pICYmIGV4cHJlc3Npb24udmFsdWUgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzRmFsc2UoZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxQcmltaXRpdmVUeXBlPikge1xuXHRyZXR1cm4gaXNDb25zdGFudChleHByZXNzaW9uKSAmJiBleHByZXNzaW9uLnZhbHVlID09PSBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGV4cHJlc3Npb24gb3IgdmFsdWUgcHJvdmlkZWQgaXMgYmluZGluZyBvciBub3QuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gIG1heWJlQmluZGluZyBUaGUgZXhwcmVzc2lvbiBvciBwcmltaXRpdmUgdmFsdWUgdGhhdCBpcyB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGl0IGlzIGJpbmRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQmluZGluZzxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4obWF5YmVCaW5kaW5nOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4pOiBtYXliZUJpbmRpbmcgaXMgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+IHtcblx0cmV0dXJuIHR5cGVvZiBtYXliZUJpbmRpbmcgPT09IFwib2JqZWN0XCIgJiYgKG1heWJlQmluZGluZyBhcyBCYXNlRXhwcmVzc2lvbjxUPikuX3R5cGUgPT09IFwiQmluZGluZ1wiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZXhwcmVzc2lvbiBwcm92aWRlZCBpcyBhIGNvbXBhcmlzb24gb3Igbm90LlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb25cbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGV4cHJlc3Npb24gaXMgYSBDb21wYXJpc29uRXhwcmVzc2lvblxuICovXG5mdW5jdGlvbiBpc0NvbXBhcmlzb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KGV4cHJlc3Npb246IEV4cHJlc3Npb248VD4pOiBleHByZXNzaW9uIGlzIENvbXBhcmlzb25FeHByZXNzaW9uIHtcblx0cmV0dXJuIGV4cHJlc3Npb24uX3R5cGUgPT09IFwiQ29tcGFyaXNvblwiO1xufVxuXG50eXBlIENvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPiA9XG5cdHwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgQXBwbHlBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IElmQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBPckFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgQW5kQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBOZUFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgRXFBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IE5vdEFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgR3RBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IEdlQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBMZUFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgTHRBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmVPYmplY3Qob2JqZWN0VHlwZTogb2JqZWN0KTogYm9vbGVhbiB7XG5cdHN3aXRjaCAob2JqZWN0VHlwZS5jb25zdHJ1Y3Rvci5uYW1lKSB7XG5cdFx0Y2FzZSBcIlN0cmluZ1wiOlxuXHRcdGNhc2UgXCJOdW1iZXJcIjpcblx0XHRjYXNlIFwiQm9vbGVhblwiOlxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuLyoqXG4gKiBDaGVjayBpZiB0aGUgcGFzc2VkIGFubm90YXRpb24gYW5ub3RhdGlvblZhbHVlIGlzIGEgQ29tcGxleEFubm90YXRpb25FeHByZXNzaW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtICBhbm5vdGF0aW9uVmFsdWUgVGhlIGFubm90YXRpb24gYW5ub3RhdGlvblZhbHVlIHRvIGV2YWx1YXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBvYmplY3QgaXMgYSB7Q29tcGxleEFubm90YXRpb25FeHByZXNzaW9ufVxuICovXG5mdW5jdGlvbiBpc0NvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbjxUPihhbm5vdGF0aW9uVmFsdWU6IFByb3BlcnR5QW5ub3RhdGlvblZhbHVlPFQ+KTogYW5ub3RhdGlvblZhbHVlIGlzIENvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbjxUPiB7XG5cdHJldHVybiB0eXBlb2YgYW5ub3RhdGlvblZhbHVlID09PSBcIm9iamVjdFwiICYmICFpc1ByaW1pdGl2ZU9iamVjdChhbm5vdGF0aW9uVmFsdWUgYXMgb2JqZWN0KTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSB0aGUgY29ycmVzcG9uZGluZyBhbm5vdGF0aW9uVmFsdWUgZm9yIGEgZ2l2ZW4gYW5ub3RhdGlvbiBhbm5vdGF0aW9uVmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gYW5ub3RhdGlvblZhbHVlIFRoZSBzb3VyY2UgYW5ub3RhdGlvbiBhbm5vdGF0aW9uVmFsdWVcbiAqIEBwYXJhbSB2aXNpdGVkTmF2aWdhdGlvblBhdGhzIFRoZSBwYXRoIGZyb20gdGhlIHJvb3QgZW50aXR5IHNldFxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZhbHVlIGlmIHRoZSBhbm5vdGF0aW9uVmFsdWUgaXMgdW5kZWZpbmVkXG4gKiBAcGFyYW0gcGF0aFZpc2l0b3IgQSBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIHJlc3VsdGluZyBwYXRoXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxUPn0gVGhlIGFubm90YXRpb25WYWx1ZSBlcXVpdmFsZW50IHRvIHRoYXQgYW5ub3RhdGlvbiBhbm5vdGF0aW9uVmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFubm90YXRpb25FeHByZXNzaW9uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0YW5ub3RhdGlvblZhbHVlOiBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxUPixcblx0dmlzaXRlZE5hdmlnYXRpb25QYXRoczogc3RyaW5nW10gPSBbXSxcblx0ZGVmYXVsdFZhbHVlPzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRwYXRoVmlzaXRvcj86IEZ1bmN0aW9uXG4pOiBFeHByZXNzaW9uPFQ+IHtcblx0aWYgKGFubm90YXRpb25WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHdyYXBQcmltaXRpdmUoZGVmYXVsdFZhbHVlIGFzIFQpO1xuXHR9XG5cblx0aWYgKCFpc0NvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbihhbm5vdGF0aW9uVmFsdWUpKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGFubm90YXRpb25WYWx1ZSk7XG5cdH1cblxuXHRzd2l0Y2ggKGFubm90YXRpb25WYWx1ZS50eXBlKSB7XG5cdFx0Y2FzZSBcIlBhdGhcIjpcblx0XHRcdHJldHVybiBiaW5kaW5nRXhwcmVzc2lvbihhbm5vdGF0aW9uVmFsdWUucGF0aCwgdW5kZWZpbmVkLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcik7XG5cdFx0Y2FzZSBcIklmXCI6XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbklmRXhwcmVzc2lvbihhbm5vdGF0aW9uVmFsdWUuSWYsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcblx0XHRjYXNlIFwiTm90XCI6XG5cdFx0XHRyZXR1cm4gbm90KHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuTm90LCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcikpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0Y2FzZSBcIkVxXCI6XG5cdFx0XHRyZXR1cm4gZXF1YWwoXG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuRXFbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5FcVsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0Y2FzZSBcIk5lXCI6XG5cdFx0XHRyZXR1cm4gbm90RXF1YWwoXG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuTmVbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5OZVsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0Y2FzZSBcIkd0XCI6XG5cdFx0XHRyZXR1cm4gZ3JlYXRlclRoYW4oXG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuR3RbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5HdFsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0Y2FzZSBcIkdlXCI6XG5cdFx0XHRyZXR1cm4gZ3JlYXRlck9yRXF1YWwoXG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuR2VbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5HZVsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0Y2FzZSBcIkx0XCI6XG5cdFx0XHRyZXR1cm4gbGVzc1RoYW4oXG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuTHRbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5MdFsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0Y2FzZSBcIkxlXCI6XG5cdFx0XHRyZXR1cm4gbGVzc09yRXF1YWwoXG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuTGVbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5MZVsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0Y2FzZSBcIk9yXCI6XG5cdFx0XHRyZXR1cm4gb3IoXG5cdFx0XHRcdC4uLihhbm5vdGF0aW9uVmFsdWUuT3IubWFwKGZ1bmN0aW9uKG9yQ29uZGl0aW9uKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihvckNvbmRpdGlvbiwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHRcdFx0XHR9KSBhcyBFeHByZXNzaW9uPGJvb2xlYW4+W10pXG5cdFx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0Y2FzZSBcIkFuZFwiOlxuXHRcdFx0cmV0dXJuIGFuZChcblx0XHRcdFx0Li4uKGFubm90YXRpb25WYWx1ZS5BbmQubWFwKGZ1bmN0aW9uKGFuZENvbmRpdGlvbikge1xuXHRcdFx0XHRcdHJldHVybiBwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5kQ29uZGl0aW9uLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcik7XG5cdFx0XHRcdH0pIGFzIEV4cHJlc3Npb248Ym9vbGVhbj5bXSlcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiQXBwbHlcIjpcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uQXBwbHlFeHByZXNzaW9uKFxuXHRcdFx0XHRhbm5vdGF0aW9uVmFsdWUgYXMgQXBwbHlBbm5vdGF0aW9uRXhwcmVzc2lvbjxzdHJpbmc+LFxuXHRcdFx0XHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzLFxuXHRcdFx0XHRwYXRoVmlzaXRvclxuXHRcdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9XG5cdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgYW5ub3RhdGlvbiBjb25kaXRpb24gaW50byBhbiBleHByZXNzaW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGFubm90YXRpb25WYWx1ZSBUaGUgY29uZGl0aW9uIG9yIHZhbHVlIGZyb20gdGhlIGFubm90YXRpb25cbiAqIEBwYXJhbSB2aXNpdGVkTmF2aWdhdGlvblBhdGhzIFRoZSBwYXRoIGZyb20gdGhlIHJvb3QgZW50aXR5IHNldFxuICogQHBhcmFtIHBhdGhWaXNpdG9yIEEgZnVuY3Rpb24gdG8gbW9kaWZ5IHRoZSByZXN1bHRpbmcgcGF0aFxuICogQHJldHVybnMge0V4cHJlc3Npb248VD59IEFuIGVxdWl2YWxlbnQgZXhwcmVzc2lvblxuICovXG5mdW5jdGlvbiBwYXJzZUFubm90YXRpb25Db25kaXRpb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRhbm5vdGF0aW9uVmFsdWU6IENvbmRpdGlvbmFsQ2hlY2tPclZhbHVlLFxuXHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSA9IFtdLFxuXHRwYXRoVmlzaXRvcj86IEZ1bmN0aW9uXG4pOiBFeHByZXNzaW9uPFQ+IHtcblx0aWYgKGFubm90YXRpb25WYWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgYW5ub3RhdGlvblZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGFubm90YXRpb25WYWx1ZSBhcyBUKTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkT3JcIikpIHtcblx0XHRyZXR1cm4gb3IoXG5cdFx0XHQuLi4oKChhbm5vdGF0aW9uVmFsdWUgYXMgT3JDb25kaXRpb25hbEV4cHJlc3Npb24pLiRPci5tYXAoZnVuY3Rpb24ob3JDb25kaXRpb24pIHtcblx0XHRcdFx0cmV0dXJuIHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihvckNvbmRpdGlvbiwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHRcdFx0fSkgYXMgdW5rbm93bikgYXMgRXhwcmVzc2lvbjxib29sZWFuPltdKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkQW5kXCIpKSB7XG5cdFx0cmV0dXJuIGFuZChcblx0XHRcdC4uLigoKGFubm90YXRpb25WYWx1ZSBhcyBBbmRDb25kaXRpb25hbEV4cHJlc3Npb24pLiRBbmQubWFwKGZ1bmN0aW9uKGFuZENvbmRpdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gcGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFuZENvbmRpdGlvbiwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHRcdFx0fSkgYXMgdW5rbm93bikgYXMgRXhwcmVzc2lvbjxib29sZWFuPltdKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkTm90XCIpKSB7XG5cdFx0cmV0dXJuIG5vdChcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIE5vdENvbmRpdGlvbmFsRXhwcmVzc2lvbikuJE5vdFswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRFcVwiKSkge1xuXHRcdHJldHVybiBlcXVhbChcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEVxQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kRXFbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEVxQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kRXFbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkTmVcIikpIHtcblx0XHRyZXR1cm4gbm90RXF1YWwoXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBOZUNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJE5lWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBOZUNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJE5lWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJEd0XCIpKSB7XG5cdFx0cmV0dXJuIGdyZWF0ZXJUaGFuKFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgR3RDb25kaXRpb25hbEV4cHJlc3Npb24pLiRHdFswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgR3RDb25kaXRpb25hbEV4cHJlc3Npb24pLiRHdFsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRHZVwiKSkge1xuXHRcdHJldHVybiBncmVhdGVyT3JFcXVhbChcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEdlQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kR2VbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEdlQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kR2VbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkTHRcIikpIHtcblx0XHRyZXR1cm4gbGVzc1RoYW4oXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBMdENvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEx0WzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBMdENvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEx0WzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJExlXCIpKSB7XG5cdFx0cmV0dXJuIGxlc3NPckVxdWFsKFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgTGVDb25kaXRpb25hbEV4cHJlc3Npb24pLiRMZVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgTGVDb25kaXRpb25hbEV4cHJlc3Npb24pLiRMZVsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRQYXRoXCIpKSB7XG5cdFx0cmV0dXJuIGJpbmRpbmdFeHByZXNzaW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgUGF0aENvbmRpdGlvbkV4cHJlc3Npb248VD4pLiRQYXRoLCB1bmRlZmluZWQsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkQXBwbHlcIikpIHtcblx0XHRyZXR1cm4gYW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHR7XG5cdFx0XHRcdHR5cGU6IFwiQXBwbHlcIixcblx0XHRcdFx0RnVuY3Rpb246IChhbm5vdGF0aW9uVmFsdWUgYXMgYW55KS4kRnVuY3Rpb24sXG5cdFx0XHRcdEFwcGx5OiAoYW5ub3RhdGlvblZhbHVlIGFzIGFueSkuJEFwcGx5XG5cdFx0XHR9IGFzIFQsXG5cdFx0XHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0cGF0aFZpc2l0b3Jcblx0XHQpO1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRJZlwiKSkge1xuXHRcdHJldHVybiBhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogXCJJZlwiLFxuXHRcdFx0XHRJZjogKGFubm90YXRpb25WYWx1ZSBhcyBhbnkpLiRJZlxuXHRcdFx0fSBhcyBULFxuXHRcdFx0dmlzaXRlZE5hdmlnYXRpb25QYXRocyxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHBhdGhWaXNpdG9yXG5cdFx0KTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkRW51bU1lbWJlclwiKSkge1xuXHRcdHJldHVybiBjb25zdGFudChyZXNvbHZlRW51bVZhbHVlKChhbm5vdGF0aW9uVmFsdWUgYXMgYW55KS4kRW51bU1lbWJlcikgYXMgVCk7XG5cdH1cblx0cmV0dXJuIGNvbnN0YW50KGZhbHNlIGFzIFQpO1xufVxuXG4vKipcbiAqIFByb2Nlc3MgdGhlIHtJZkFubm90YXRpb25FeHByZXNzaW9uVmFsdWV9IGludG8gYW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBhbm5vdGF0aW9uVmFsdWUgQW4gSWYgZXhwcmVzc2lvbiByZXR1cm5pbmcgdGhlIHR5cGUgVFxuICogQHBhcmFtIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMgVGhlIHBhdGggZnJvbSB0aGUgcm9vdCBlbnRpdHkgc2V0XG4gKiBAcGFyYW0gcGF0aFZpc2l0b3IgQSBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIHJlc3VsdGluZyBwYXRoXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxUPn0gVGhlIGVxdWl2YWxlbnQgaWZFbHNlIGV4cHJlc3Npb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFubm90YXRpb25JZkV4cHJlc3Npb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRhbm5vdGF0aW9uVmFsdWU6IElmQW5ub3RhdGlvbkV4cHJlc3Npb25WYWx1ZTxUPixcblx0dmlzaXRlZE5hdmlnYXRpb25QYXRoczogc3RyaW5nW10gPSBbXSxcblx0cGF0aFZpc2l0b3I/OiBGdW5jdGlvblxuKTogRXhwcmVzc2lvbjxUPiB7XG5cdHJldHVybiBpZkVsc2UoXG5cdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWVbMV0gYXMgYW55LCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZVsyXSBhcyBhbnksIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYW5ub3RhdGlvbkFwcGx5RXhwcmVzc2lvbihcblx0YXBwbHlFeHByZXNzaW9uOiBBcHBseUFubm90YXRpb25FeHByZXNzaW9uPHN0cmluZz4sXG5cdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdID0gW10sXG5cdHBhdGhWaXNpdG9yPzogRnVuY3Rpb25cbik6IEV4cHJlc3Npb248c3RyaW5nPiB7XG5cdHN3aXRjaCAoYXBwbHlFeHByZXNzaW9uLkZ1bmN0aW9uKSB7XG5cdFx0Y2FzZSBcIm9kYXRhLmNvbmNhdFwiOlxuXHRcdFx0cmV0dXJuIGNvbmNhdChcblx0XHRcdFx0Li4uYXBwbHlFeHByZXNzaW9uLkFwcGx5Lm1hcCgoYXBwbHlQYXJhbTogYW55KSA9PiB7XG5cdFx0XHRcdFx0bGV0IGFwcGx5UGFyYW1Db252ZXJ0ZWQgPSBhcHBseVBhcmFtO1xuXHRcdFx0XHRcdGlmIChhcHBseVBhcmFtLmhhc093blByb3BlcnR5KFwiJFBhdGhcIikpIHtcblx0XHRcdFx0XHRcdGFwcGx5UGFyYW1Db252ZXJ0ZWQgPSB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiUGF0aFwiLFxuXHRcdFx0XHRcdFx0XHRwYXRoOiBhcHBseVBhcmFtLiRQYXRoXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYXBwbHlQYXJhbS5oYXNPd25Qcm9wZXJ0eShcIiRJZlwiKSkge1xuXHRcdFx0XHRcdFx0YXBwbHlQYXJhbUNvbnZlcnRlZCA9IHtcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJJZlwiLFxuXHRcdFx0XHRcdFx0XHRJZjogYXBwbHlQYXJhbS4kSWZcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhcHBseVBhcmFtLmhhc093blByb3BlcnR5KFwiJEFwcGx5XCIpKSB7XG5cdFx0XHRcdFx0XHRhcHBseVBhcmFtQ29udmVydGVkID0ge1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBcIkFwcGx5XCIsXG5cdFx0XHRcdFx0XHRcdEZ1bmN0aW9uOiBhcHBseVBhcmFtLiRGdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0QXBwbHk6IGFwcGx5UGFyYW0uJEFwcGx5XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gYW5ub3RhdGlvbkV4cHJlc3Npb24oYXBwbHlQYXJhbUNvbnZlcnRlZCwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgdW5kZWZpbmVkLCBwYXRoVmlzaXRvcik7XG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHR9XG5cdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcbn1cblxuLyoqXG4gKiBHZW5lcmljIGhlbHBlciBmb3IgdGhlIGNvbXBhcmlzb24gb3BlcmF0aW9ucyAoZXF1YWwsIG5vdEVxdWFsLCAuLi4pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIG9wZXJhdG9yIFRoZSBvcGVyYXRvciB0byBhcHBseVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIG9wZXJhdG9yXG4gKiBAcGFyYW0gcmlnaHRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBvcGVyYXRvclxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IEFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb21wYXJpc29uXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmlzb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGxlZnRFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShsZWZ0T3BlcmFuZCk7XG5cdGNvbnN0IHJpZ2h0RXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUocmlnaHRPcGVyYW5kKTtcblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGlmIChpc0NvbnN0YW50KGxlZnRFeHByZXNzaW9uKSAmJiBpc0NvbnN0YW50KHJpZ2h0RXhwcmVzc2lvbikpIHtcblx0XHRzd2l0Y2ggKG9wZXJhdG9yKSB7XG5cdFx0XHRjYXNlIFwiIT09XCI6XG5cdFx0XHRcdHJldHVybiBjb25zdGFudChsZWZ0RXhwcmVzc2lvbi52YWx1ZSAhPT0gcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHRcdGNhc2UgXCI8XCI6XG5cdFx0XHRcdHJldHVybiBjb25zdGFudChsZWZ0RXhwcmVzc2lvbi52YWx1ZSA8IHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSk7XG5cdFx0XHRjYXNlIFwiPD1cIjpcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KGxlZnRFeHByZXNzaW9uLnZhbHVlIDw9IHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSk7XG5cdFx0XHRjYXNlIFwiPlwiOlxuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQobGVmdEV4cHJlc3Npb24udmFsdWUgPiByaWdodEV4cHJlc3Npb24udmFsdWUpO1xuXHRcdFx0Y2FzZSBcIj49XCI6XG5cdFx0XHRcdHJldHVybiBjb25zdGFudChsZWZ0RXhwcmVzc2lvbi52YWx1ZSA+PSByaWdodEV4cHJlc3Npb24udmFsdWUpO1xuXHRcdFx0Y2FzZSBcIj09PVwiOlxuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQobGVmdEV4cHJlc3Npb24udmFsdWUgPT09IHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB7XG5cdFx0XHRfdHlwZTogXCJDb21wYXJpc29uXCIsXG5cdFx0XHRvcGVyYXRvcjogb3BlcmF0b3IsXG5cdFx0XHRvcGVyYW5kMTogbGVmdEV4cHJlc3Npb24sXG5cdFx0XHRvcGVyYW5kMjogcmlnaHRFeHByZXNzaW9uXG5cdFx0fTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbGVuZ3RoKGV4cHJlc3Npb246IEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxhbnk+IHwgVW5yZXNvbHZlYWJsZUJpbmRpbmdFeHByZXNzaW9uKTogRXhwcmVzc2lvbjxudW1iZXI+IHtcblx0aWYgKGV4cHJlc3Npb24uX3R5cGUgPT09IFwiVW5yZXNvbHZhYmxlXCIpIHtcblx0XHRyZXR1cm4gZXhwcmVzc2lvbjtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdF90eXBlOiBcIkxlbmd0aFwiLFxuXHRcdGJpbmRpbmdFeHByZXNzaW9uOiBleHByZXNzaW9uXG5cdH07XG59XG5cbi8qKlxuICogQ29tcGFyaXNvbjogXCJlcXVhbFwiICg9PT0pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWw8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGxlZnRFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShsZWZ0T3BlcmFuZCk7XG5cdGNvbnN0IHJpZ2h0RXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUocmlnaHRPcGVyYW5kKTtcblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGlmIChfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcmVkdWNlKGxlZnQ6IEV4cHJlc3Npb248VD4sIHJpZ2h0OiBFeHByZXNzaW9uPFQ+KSB7XG5cdFx0aWYgKGxlZnQuX3R5cGUgPT09IFwiQ29tcGFyaXNvblwiICYmIGlzVHJ1ZShyaWdodCkpIHtcblx0XHRcdC8vIGNvbXBhcmUoYSwgYikgPT09IHRydWUgfn4+IGNvbXBhcmUoYSwgYilcblx0XHRcdHJldHVybiBsZWZ0O1xuXHRcdH0gZWxzZSBpZiAobGVmdC5fdHlwZSA9PT0gXCJDb21wYXJpc29uXCIgJiYgaXNGYWxzZShyaWdodCkpIHtcblx0XHRcdC8vIGNvbXBhcmUoYSwgYikgPT09IGZhbHNlIH5+PiAhY29tcGFyZShhLCBiKVxuXHRcdFx0cmV0dXJuIG5vdChsZWZ0KTtcblx0XHR9IGVsc2UgaWYgKGxlZnQuX3R5cGUgPT09IFwiSWZFbHNlXCIgJiYgX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChsZWZ0Lm9uVHJ1ZSwgcmlnaHQpKSB7XG5cdFx0XHQvLyAoaWYgKHgpIHsgYSB9IGVsc2UgeyBiIH0pID09PSBhIH5+PiB4IHx8IChiID09PSBhKVxuXHRcdFx0cmV0dXJuIG9yKGxlZnQuY29uZGl0aW9uLCBlcXVhbChsZWZ0Lm9uRmFsc2UsIHJpZ2h0KSk7XG5cdFx0fSBlbHNlIGlmIChsZWZ0Ll90eXBlID09PSBcIklmRWxzZVwiICYmIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdC5vbkZhbHNlLCByaWdodCkpIHtcblx0XHRcdC8vIChpZiAoeCkgeyBhIH0gZWxzZSB7IGIgfSkgPT09IGIgfn4+ICF4IHx8IChhID09PSBiKVxuXHRcdFx0cmV0dXJuIG9yKG5vdChsZWZ0LmNvbmRpdGlvbiksIGVxdWFsKGxlZnQub25UcnVlLCByaWdodCkpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRsZWZ0Ll90eXBlID09PSBcIklmRWxzZVwiICYmXG5cdFx0XHRpc0NvbnN0YW50KGxlZnQub25UcnVlKSAmJlxuXHRcdFx0aXNDb25zdGFudChsZWZ0Lm9uRmFsc2UpICYmXG5cdFx0XHRpc0NvbnN0YW50KHJpZ2h0KSAmJlxuXHRcdFx0IV9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdC5vblRydWUsIHJpZ2h0KSAmJlxuXHRcdFx0IV9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdC5vbkZhbHNlLCByaWdodClcblx0XHQpIHtcblx0XHRcdHJldHVybiBjb25zdGFudChmYWxzZSk7XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBleHBsb2l0IHN5bW1ldHJ5OiBhID09PSBiIDx+PiBiID09PSBhXG5cdGNvbnN0IHJlZHVjZWQgPSByZWR1Y2UobGVmdEV4cHJlc3Npb24sIHJpZ2h0RXhwcmVzc2lvbikgPz8gcmVkdWNlKHJpZ2h0RXhwcmVzc2lvbiwgbGVmdEV4cHJlc3Npb24pO1xuXHRyZXR1cm4gcmVkdWNlZCA/PyBjb21wYXJpc29uKFwiPT09XCIsIGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pO1xufVxuXG4vKipcbiAqIENvbXBhcmlzb246IFwibm90IGVxdWFsXCIgKCE9PSkuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gbGVmdE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIGxlZnQgc2lkZVxuICogQHBhcmFtIHJpZ2h0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgY29tcGFyaXNvblxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IEFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3RFcXVhbDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGxlZnRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHJpZ2h0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIG5vdChlcXVhbChsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKSk7XG59XG5cbi8qKlxuICogQ29tcGFyaXNvbjogXCJncmVhdGVyIG9yIGVxdWFsXCIgKD49KS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBsZWZ0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgbGVmdCBzaWRlXG4gKiBAcGFyYW0gcmlnaHRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjb21wYXJpc29uXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gQW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGNvbXBhcmlzb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyZWF0ZXJPckVxdWFsPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0bGVmdE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cmlnaHRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gY29tcGFyaXNvbihcIj49XCIsIGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQpO1xufVxuXG4vKipcbiAqIENvbXBhcmlzb246IFwiZ3JlYXRlciB0aGFuXCIgKD4pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JlYXRlclRoYW48VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjb21wYXJpc29uKFwiPlwiLCBsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKTtcbn1cblxuLyoqXG4gKiBDb21wYXJpc29uOiBcImxlc3Mgb3IgZXF1YWxcIiAoPD0pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVzc09yRXF1YWw8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjb21wYXJpc29uKFwiPD1cIiwgbGVmdE9wZXJhbmQsIHJpZ2h0T3BlcmFuZCk7XG59XG5cbi8qKlxuICogQ29tcGFyaXNvbjogXCJsZXNzIHRoYW5cIiAoPCkuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gbGVmdE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIGxlZnQgc2lkZVxuICogQHBhcmFtIHJpZ2h0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgY29tcGFyaXNvblxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IEFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZXNzVGhhbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGxlZnRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHJpZ2h0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGNvbXBhcmlzb24oXCI8XCIsIGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQpO1xufVxuXG4vKipcbiAqIElmLXRoZW4tZWxzZSBleHByZXNzaW9uLlxuICpcbiAqIEV2YWx1YXRlcyB0byBvblRydWUgaWYgdGhlIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZSwgZWxzZSBldmFsdWF0ZXMgdG8gb25GYWxzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBjb25kaXRpb24gVGhlIGNvbmRpdGlvbiB0byBldmFsdWF0ZVxuICogQHBhcmFtIG9uVHJ1ZSBFeHByZXNzaW9uIHJlc3VsdCBpZiB0aGUgY29uZGl0aW9uIGV2YWx1YXRlcyB0byB0cnVlXG4gKiBAcGFyYW0gb25GYWxzZSBFeHByZXNzaW9uIHJlc3VsdCBpZiB0aGUgY29uZGl0aW9uIGV2YWx1YXRlcyB0byBmYWxzZVxuICogQHJldHVybnMge0V4cHJlc3Npb248VD59IFRoZSBleHByZXNzaW9uIHRoYXQgcmVwcmVzZW50cyB0aGlzIGNvbmRpdGlvbmFsIGNoZWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZkVsc2U8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRjb25kaXRpb246IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPixcblx0b25UcnVlOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdG9uRmFsc2U6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxUPiB7XG5cdGxldCBjb25kaXRpb25FeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShjb25kaXRpb24pO1xuXHRsZXQgb25UcnVlRXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUob25UcnVlKTtcblx0bGV0IG9uRmFsc2VFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShvbkZhbHNlKTtcblxuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oY29uZGl0aW9uRXhwcmVzc2lvbiwgb25UcnVlRXhwcmVzc2lvbiwgb25GYWxzZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdC8vIHN3YXAgYnJhbmNoZXMgaWYgdGhlIGNvbmRpdGlvbiBpcyBhIG5lZ2F0aW9uXG5cdGlmIChjb25kaXRpb25FeHByZXNzaW9uLl90eXBlID09PSBcIk5vdFwiKSB7XG5cdFx0Ly8gaWZFbHNlKG5vdChYKSwgYSwgYikgLS0+IGlmRWxzZShYLCBiLCBhKVxuXHRcdFtvblRydWVFeHByZXNzaW9uLCBvbkZhbHNlRXhwcmVzc2lvbl0gPSBbb25GYWxzZUV4cHJlc3Npb24sIG9uVHJ1ZUV4cHJlc3Npb25dO1xuXHRcdGNvbmRpdGlvbkV4cHJlc3Npb24gPSBub3QoY29uZGl0aW9uRXhwcmVzc2lvbik7XG5cdH1cblxuXHQvLyBpbmxpbmUgbmVzdGVkIGlmLWVsc2UgZXhwcmVzc2lvbnM6IG9uVHJ1ZSBicmFuY2hcblx0Ly8gaWZFbHNlKFgsIGlmRWxzZShYLCBhLCBiKSwgYykgPT0+IGlmRWxzZShYLCBhLCBjKVxuXHRpZiAob25UcnVlRXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJJZkVsc2VcIiAmJiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGNvbmRpdGlvbkV4cHJlc3Npb24sIG9uVHJ1ZUV4cHJlc3Npb24uY29uZGl0aW9uKSkge1xuXHRcdG9uVHJ1ZUV4cHJlc3Npb24gPSBvblRydWVFeHByZXNzaW9uLm9uVHJ1ZTtcblx0fVxuXG5cdC8vIGlubGluZSBuZXN0ZWQgaWYtZWxzZSBleHByZXNzaW9uczogb25GYWxzZSBicmFuY2hcblx0Ly8gaWZFbHNlKFgsIGEsIGlmRWxzZShYLCBiLCBjKSkgPT0+IGlmRWxzZShYLCBhLCBjKVxuXHRpZiAob25GYWxzZUV4cHJlc3Npb24uX3R5cGUgPT09IFwiSWZFbHNlXCIgJiYgX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChjb25kaXRpb25FeHByZXNzaW9uLCBvbkZhbHNlRXhwcmVzc2lvbi5jb25kaXRpb24pKSB7XG5cdFx0b25GYWxzZUV4cHJlc3Npb24gPSBvbkZhbHNlRXhwcmVzc2lvbi5vbkZhbHNlO1xuXHR9XG5cblx0Ly8gKGlmIHRydWUgdGhlbiBhIGVsc2UgYikgIH5+PiBhXG5cdC8vIChpZiBmYWxzZSB0aGVuIGEgZWxzZSBiKSB+fj4gYlxuXHRpZiAoaXNDb25zdGFudChjb25kaXRpb25FeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBjb25kaXRpb25FeHByZXNzaW9uLnZhbHVlID8gb25UcnVlRXhwcmVzc2lvbiA6IG9uRmFsc2VFeHByZXNzaW9uO1xuXHR9XG5cblx0Ly8gaWYgKGlzQ29uc3RhbnRCb29sZWFuKG9uVHJ1ZUV4cHJlc3Npb24pIHx8IGlzQ29uc3RhbnRCb29sZWFuKG9uRmFsc2VFeHByZXNzaW9uKSkge1xuXHQvLyBcdHJldHVybiBvcihhbmQoY29uZGl0aW9uLCBvblRydWVFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pLCBhbmQobm90KGNvbmRpdGlvbiksIG9uRmFsc2VFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pKSBhcyBFeHByZXNzaW9uPFQ+XG5cdC8vIH1cblx0Ly8gKGlmIFggdGhlbiBhIGVsc2UgYSkgfn4+IGFcblx0aWYgKF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwob25UcnVlRXhwcmVzc2lvbiwgb25GYWxzZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIG9uVHJ1ZUV4cHJlc3Npb247XG5cdH1cblxuXHQvLyBpZiBYIHRoZW4gYSBlbHNlIGZhbHNlIH5+PiBYICYmIGFcblx0aWYgKGlzRmFsc2Uob25GYWxzZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGFuZChjb25kaXRpb25FeHByZXNzaW9uLCBvblRydWVFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pIGFzIEV4cHJlc3Npb248VD47XG5cdH1cblxuXHQvLyBpZiBYIHRoZW4gYSBlbHNlIHRydWUgfn4+ICFYIHx8IGFcblx0aWYgKGlzVHJ1ZShvbkZhbHNlRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gb3Iobm90KGNvbmRpdGlvbkV4cHJlc3Npb24pLCBvblRydWVFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pIGFzIEV4cHJlc3Npb248VD47XG5cdH1cblxuXHQvLyBpZiBYIHRoZW4gZmFsc2UgZWxzZSBhIH5+PiAhWCAmJiBhXG5cdGlmIChpc0ZhbHNlKG9uVHJ1ZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGFuZChub3QoY29uZGl0aW9uRXhwcmVzc2lvbiksIG9uRmFsc2VFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pIGFzIEV4cHJlc3Npb248VD47XG5cdH1cblxuXHQvLyBpZiBYIHRoZW4gdHJ1ZSBlbHNlIGEgfn4+IFggfHwgYVxuXHRpZiAoaXNUcnVlKG9uVHJ1ZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIG9yKGNvbmRpdGlvbkV4cHJlc3Npb24sIG9uRmFsc2VFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pIGFzIEV4cHJlc3Npb248VD47XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdF90eXBlOiBcIklmRWxzZVwiLFxuXHRcdGNvbmRpdGlvbjogY29uZGl0aW9uRXhwcmVzc2lvbixcblx0XHRvblRydWU6IG9uVHJ1ZUV4cHJlc3Npb24sXG5cdFx0b25GYWxzZTogb25GYWxzZUV4cHJlc3Npb25cblx0fTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBleHByZXNzaW9uIGhhcyBhIHJlZmVyZW5jZSB0byB0aGUgZGVmYXVsdCBtb2RlbCAodW5kZWZpbmVkKS5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBldmFsdWF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGVyZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgZGVmYXVsdCBjb250ZXh0XG4gKi9cbmZ1bmN0aW9uIGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxhbnk+KTogYm9vbGVhbiB7XG5cdHN3aXRjaCAoZXhwcmVzc2lvbi5fdHlwZSkge1xuXHRcdGNhc2UgXCJDb25zdGFudFwiOlxuXHRcdGNhc2UgXCJGb3JtYXR0ZXJcIjpcblx0XHRjYXNlIFwiQ29tcGxleFR5cGVcIjpcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRjYXNlIFwiU2V0XCI6XG5cdFx0XHRyZXR1cm4gZXhwcmVzc2lvbi5vcGVyYW5kcy5zb21lKGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQpO1xuXHRcdGNhc2UgXCJCaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gZXhwcmVzc2lvbi5tb2RlbE5hbWUgPT09IHVuZGVmaW5lZDtcblx0XHRjYXNlIFwiQ29tcGFyaXNvblwiOlxuXHRcdFx0cmV0dXJuIGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5vcGVyYW5kMSkgfHwgaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dChleHByZXNzaW9uLm9wZXJhbmQyKTtcblx0XHRjYXNlIFwiRGVmYXVsdEJpbmRpbmdcIjpcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGNhc2UgXCJJZkVsc2VcIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5jb25kaXRpb24pIHx8XG5cdFx0XHRcdGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5vblRydWUpIHx8XG5cdFx0XHRcdGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5vbkZhbHNlKVxuXHRcdFx0KTtcblx0XHRjYXNlIFwiTm90XCI6XG5cdFx0Y2FzZSBcIlRydXRoeVwiOlxuXHRcdFx0cmV0dXJuIGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5vcGVyYW5kKTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbnR5cGUgRm48VD4gPSAoKC4uLnBhcmFtczogYW55KSA9PiBUKSAmIHtcblx0X19mdW5jdGlvbk5hbWU6IHN0cmluZztcbn07XG5cbi8qKlxuICogQHR5cGVkZWYgV3JhcHBlZFR1cGxlXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbnR5cGUgV3JhcHBlZFR1cGxlPFQ+ID0geyBbSyBpbiBrZXlvZiBUXTogV3JhcHBlZFR1cGxlPFRbS10+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFRbS10+IH07XG5cbi8vIFNvLCB0aGlzIHdvcmtzIGJ1dCBJIGNhbm5vdCBnZXQgaXQgdG8gY29tcGlsZSA6RCwgYnV0IGl0IHN0aWxsIGRvZXMgd2hhdCBpcyBleHBlY3RlZC4uLlxuXG4vKipcbiAqIEEgZnVuY3Rpb24gcmVmZXJlbmNlIG9yIGEgZnVuY3Rpb24gbmFtZS5cbiAqL1xudHlwZSBGdW5jdGlvbk9yTmFtZTxUPiA9IEZuPFQ+IHwgc3RyaW5nO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHBhcmFtZXRlcnMsIGVpdGhlciBkZXJpdmVkIGZyb20gdGhlIGZ1bmN0aW9uIG9yIGFuIHVudHlwZWQgYXJyYXkuXG4gKi9cbnR5cGUgRnVuY3Rpb25QYXJhbWV0ZXJzPFQsIEYgZXh0ZW5kcyBGdW5jdGlvbk9yTmFtZTxUPj4gPSBGIGV4dGVuZHMgRm48VD4gPyBQYXJhbWV0ZXJzPEY+IDogYW55W107XG5cbi8qKlxuICogQ2FsbHMgYSBmb3JtYXR0ZXIgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgcGFyYW1ldGVycy5cbiAqIElmIHJlcXVpcmVDb250ZXh0IGlzIHNldCB0byB0cnVlIGFuZCBubyBjb250ZXh0IGlzIHBhc3NlZCBhIGRlZmF1bHQgY29udGV4dCB3aWxsIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBVXG4gKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgbGlzdCBvZiBwYXJhbWV0ZXIgdGhhdCBzaG91bGQgbWF0Y2ggdGhlIHR5cGUgYW5kIG51bWJlciBvZiB0aGUgZm9ybWF0dGVyIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZm9ybWF0dGVyRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGNhbGxcbiAqIEBwYXJhbSBbY29udGV4dEVudGl0eVR5cGVdIFRoZSBjb250ZXh0IGVudGl0eSB0eXBlIHRvIGNvbnNpZGVyXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxUPn0gVGhlIGNvcnJlc3BvbmRpbmcgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UmVzdWx0PFQsIFUgZXh0ZW5kcyBGbjxUPj4oXG5cdHBhcmFtZXRlcnM6IFdyYXBwZWRUdXBsZTxQYXJhbWV0ZXJzPFU+Pixcblx0Zm9ybWF0dGVyRnVuY3Rpb246IFUsXG5cdGNvbnRleHRFbnRpdHlUeXBlPzogRW50aXR5VHlwZVxuKTogRXhwcmVzc2lvbjxUPiB7XG5cdGNvbnN0IHBhcmFtZXRlckV4cHJlc3Npb25zID0gKHBhcmFtZXRlcnMgYXMgYW55W10pLm1hcCh3cmFwUHJpbWl0aXZlKTtcblxuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4ucGFyYW1ldGVyRXhwcmVzc2lvbnMpKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGlmICghIWNvbnRleHRFbnRpdHlUeXBlKSB7XG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiB0aGUgY29udGV4dCBpcyByZXF1aXJlZCBhbmQgbm8gY29udGV4dCBpcyBwcm92aWRlZCBtYWtlIHN1cmUgdG8gYWRkIHRoZSBkZWZhdWx0IGJpbmRpbmdcblx0XHRpZiAoIXBhcmFtZXRlckV4cHJlc3Npb25zLnNvbWUoaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dCkpIHtcblx0XHRcdGNvbnRleHRFbnRpdHlUeXBlLmtleXMuZm9yRWFjaChrZXkgPT4gcGFyYW1ldGVyRXhwcmVzc2lvbnMucHVzaChiaW5kaW5nRXhwcmVzc2lvbihrZXkubmFtZSwgXCJcIikpKTtcblx0XHR9XG5cdH1cblxuXHQvLyBGb3JtYXR0ZXJOYW1lIGNhbiBiZSBvZiBmb3JtYXQgc2FwLmZlLmNvcmUueHh4I21ldGhvZE5hbWUgdG8gaGF2ZSBtdWx0aXBsZSBmb3JtYXR0ZXIgaW4gb25lIGNsYXNzXG5cdGNvbnN0IFtmb3JtYXR0ZXJDbGFzcywgZm9ybWF0dGVyTmFtZV0gPSBmb3JtYXR0ZXJGdW5jdGlvbi5fX2Z1bmN0aW9uTmFtZS5zcGxpdChcIiNcIik7XG5cblx0aWYgKCEhZm9ybWF0dGVyTmFtZSAmJiBmb3JtYXR0ZXJOYW1lLmxlbmd0aCA+IDApIHtcblx0XHRwYXJhbWV0ZXJFeHByZXNzaW9ucy51bnNoaWZ0KGNvbnN0YW50KGZvcm1hdHRlck5hbWUpKTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0X3R5cGU6IFwiRm9ybWF0dGVyXCIsXG5cdFx0Zm46IGZvcm1hdHRlckNsYXNzLFxuXHRcdHBhcmFtZXRlcnM6IHBhcmFtZXRlckV4cHJlc3Npb25zXG5cdH07XG59XG5cbi8qKlxuICogQ2FsbHMgYSBjb21wbGV4IHR5cGUgIHRvIHByb2Nlc3MgdGhlIHBhcmFtZXRlcnMuXG4gKiBJZiByZXF1aXJlQ29udGV4dCBpcyBzZXQgdG8gdHJ1ZSBhbmQgbm8gY29udGV4dCBpcyBwYXNzZWQgYSBkZWZhdWx0IGNvbnRleHQgd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgVVxuICogQHBhcmFtIHBhcmFtZXRlcnMgVGhlIGxpc3Qgb2YgcGFyYW1ldGVyIHRoYXQgc2hvdWxkIG1hdGNoIHRoZSB0eXBlIGZvciB0aGUgY29tcHBsZXggdHlwZVxuICogQHBhcmFtIHR5cGUgVGhlIGNvbXBsZXggdHlwZSB0byB1c2VcbiAqIEBwYXJhbSBbY29udGV4dEVudGl0eVR5cGVdIFRoZSBjb250ZXh0IGVudGl0eSB0eXBlIHRvIGNvbnNpZGVyXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxUPn0gVGhlIGNvcnJlc3BvbmRpbmcgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkVHlwZUluZm9ybWF0aW9uPFQsIFUgZXh0ZW5kcyBGbjxUPj4oXG5cdHBhcmFtZXRlcnM6IFdyYXBwZWRUdXBsZTxQYXJhbWV0ZXJzPFU+Pixcblx0dHlwZTogc3RyaW5nLFxuXHRjb250ZXh0RW50aXR5VHlwZT86IEVudGl0eVR5cGVcbik6IEV4cHJlc3Npb248VD4ge1xuXHRjb25zdCBwYXJhbWV0ZXJFeHByZXNzaW9ucyA9IChwYXJhbWV0ZXJzIGFzIGFueVtdKS5tYXAod3JhcFByaW1pdGl2ZSk7XG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiguLi5wYXJhbWV0ZXJFeHByZXNzaW9ucykpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0Ly8gSWYgdGhlcmUgaXMgb25seSBvbmUgcGFyYW1ldGVyIGFuZCBpdCBpcyBhIGNvbnN0YW50IGFuZCB3ZSBkb24ndCBleHBlY3QgdGhlIGNvbnRleHQgdGhlbiByZXR1cm4gdGhlIGNvbnN0YW50XG5cdGlmIChwYXJhbWV0ZXJFeHByZXNzaW9ucy5sZW5ndGggPT09IDEgJiYgaXNDb25zdGFudChwYXJhbWV0ZXJFeHByZXNzaW9uc1swXSkgJiYgIWNvbnRleHRFbnRpdHlUeXBlKSB7XG5cdFx0cmV0dXJuIHBhcmFtZXRlckV4cHJlc3Npb25zWzBdO1xuXHR9IGVsc2UgaWYgKCEhY29udGV4dEVudGl0eVR5cGUpIHtcblx0XHQvLyBPdGhlcndpc2UsIGlmIHRoZSBjb250ZXh0IGlzIHJlcXVpcmVkIGFuZCBubyBjb250ZXh0IGlzIHByb3ZpZGVkIG1ha2Ugc3VyZSB0byBhZGQgdGhlIGRlZmF1bHQgYmluZGluZ1xuXHRcdGlmICghcGFyYW1ldGVyRXhwcmVzc2lvbnMuc29tZShoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KSkge1xuXHRcdFx0Y29udGV4dEVudGl0eVR5cGUua2V5cy5mb3JFYWNoKGtleSA9PiBwYXJhbWV0ZXJFeHByZXNzaW9ucy5wdXNoKGJpbmRpbmdFeHByZXNzaW9uKGtleS5uYW1lLCBcIlwiKSkpO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IG9Gb3JtYXRPcHRpb25zID1cblx0XHQocGFyYW1ldGVyc1swXSBhcyBhbnkpPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwID8geyBwYXJzZUFzU3RyaW5nOiBmYWxzZSwgZW1wdHlTdHJpbmc6IFwiXCIgfSA6IHt9O1xuXHRyZXR1cm4ge1xuXHRcdF90eXBlOiBcIkNvbXBsZXhUeXBlXCIsXG5cdFx0dHlwZTogdHlwZSxcblx0XHRmb3JtYXRPcHRpb25zOiBvRm9ybWF0T3B0aW9ucyxcblx0XHRwYXJhbWV0ZXJzOiB7fSxcblx0XHRiaW5kaW5nUGFyYW1ldGVyczogcGFyYW1ldGVyRXhwcmVzc2lvbnNcblx0fTtcbn1cbi8qKlxuICogRnVuY3Rpb24gY2FsbCwgb3B0aW9uYWxseSB3aXRoIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZnVuYyBGdW5jdGlvbiBuYW1lIG9yIHJlZmVyZW5jZSB0byBmdW5jdGlvblxuICogQHBhcmFtIHBhcmFtZXRlcnMgQXJndW1lbnRzXG4gKiBAcGFyYW0gb24gT2JqZWN0IHRvIGNhbGwgdGhlIGZ1bmN0aW9uIG9uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb25FeHByZXNzaW9uPFQ+fSBFeHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgZnVuY3Rpb24gY2FsbCAobm90IHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwhKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm48VCwgVSBleHRlbmRzIEZ1bmN0aW9uT3JOYW1lPFQ+Pihcblx0ZnVuYzogVSxcblx0cGFyYW1ldGVyczogV3JhcHBlZFR1cGxlPEZ1bmN0aW9uUGFyYW1ldGVyczxULCBVPj4sXG5cdG9uPzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPG9iamVjdD5cbik6IEZ1bmN0aW9uRXhwcmVzc2lvbjxUPiB7XG5cdGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHR5cGVvZiBmdW5jID09PSBcInN0cmluZ1wiID8gZnVuYyA6IChmdW5jIGFzIEZuPFQ+KS5fX2Z1bmN0aW9uTmFtZTtcblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJGdW5jdGlvblwiLFxuXHRcdG9iajogb24gIT09IHVuZGVmaW5lZCA/IHdyYXBQcmltaXRpdmUob24pIDogdW5kZWZpbmVkLFxuXHRcdGZuOiBmdW5jdGlvbk5hbWUsXG5cdFx0cGFyYW1ldGVyczogKHBhcmFtZXRlcnMgYXMgYW55W10pLm1hcCh3cmFwUHJpbWl0aXZlKVxuXHR9O1xufVxuXG4vKipcbiAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGJpbmRpbmcgdmFsdWUgaXMgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gZXhwcmVzc2lvbiBldmFsdWF0aW5nIHRoZSBmYWN0IHRoYXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBlbXB0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShleHByZXNzaW9uOiBFeHByZXNzaW9uPHN0cmluZz4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0aWYgKGV4cHJlc3Npb24uX3R5cGUgPT09IFwiQ29uY2F0XCIpIHtcblx0XHRyZXR1cm4gb3IoLi4uZXhwcmVzc2lvbi5leHByZXNzaW9ucy5tYXAoaXNFbXB0eSkpO1xuXHR9XG5cdHJldHVybiBvcihlcXVhbChleHByZXNzaW9uLCBcIlwiKSwgZXF1YWwoZXhwcmVzc2lvbiwgdW5kZWZpbmVkKSwgZXF1YWwoZXhwcmVzc2lvbiwgbnVsbCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0KC4uLmluRXhwcmVzc2lvbnM6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxzdHJpbmc+W10pOiBFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBleHByZXNzaW9ucyA9IGluRXhwcmVzc2lvbnMubWFwKHdyYXBQcmltaXRpdmUpO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4uZXhwcmVzc2lvbnMpKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGlmIChleHByZXNzaW9ucy5ldmVyeShpc0NvbnN0YW50KSkge1xuXHRcdHJldHVybiBjb25zdGFudChcblx0XHRcdGV4cHJlc3Npb25zLnJlZHVjZSgoY29uY2F0ZW5hdGVkOiBzdHJpbmcsIHZhbHVlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBjb25jYXRlbmF0ZWQgKyAodmFsdWUgYXMgQ29uc3RhbnRFeHByZXNzaW9uPGFueT4pLnZhbHVlLnRvU3RyaW5nKCk7XG5cdFx0XHR9LCBcIlwiKVxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJDb25jYXRcIixcblx0XHRleHByZXNzaW9uczogZXhwcmVzc2lvbnNcblx0fTtcbn1cblxuZXhwb3J0IHR5cGUgVHJhbnNmb3JtRnVuY3Rpb24gPSA8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGUgfCB1bmtub3duPihleHByZXNzaW9uUGFydDogYW55KSA9PiBFeHByZXNzaW9uPFQ+O1xuZXhwb3J0IHR5cGUgRXhwcmVzc2lvblR5cGUgPSBQaWNrPEV4cHJlc3Npb248YW55PiwgXCJfdHlwZVwiPltcIl90eXBlXCJdO1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVJlY3Vyc2l2ZWx5PFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlIHwgdW5rbm93bj4oXG5cdGluRXhwcmVzc2lvbjogRXhwcmVzc2lvbjxUPixcblx0ZXhwcmVzc2lvblR5cGU6IEV4cHJlc3Npb25UeXBlLFxuXHR0cmFuc2Zvcm1GdW5jdGlvbjogVHJhbnNmb3JtRnVuY3Rpb24sXG5cdGluY2x1ZGVBbGxFeHByZXNzaW9uID0gZmFsc2Vcbik6IEV4cHJlc3Npb248VD4ge1xuXHRsZXQgZXhwcmVzc2lvbiA9IGluRXhwcmVzc2lvbjtcblx0c3dpdGNoIChleHByZXNzaW9uLl90eXBlKSB7XG5cdFx0Y2FzZSBcIkZ1bmN0aW9uXCI6XG5cdFx0Y2FzZSBcIkZvcm1hdHRlclwiOlxuXHRcdFx0ZXhwcmVzc2lvbi5wYXJhbWV0ZXJzID0gZXhwcmVzc2lvbi5wYXJhbWV0ZXJzLm1hcChwYXJhbWV0ZXIgPT5cblx0XHRcdFx0dHJhbnNmb3JtUmVjdXJzaXZlbHkocGFyYW1ldGVyLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKVxuXHRcdFx0KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJDb25jYXRcIjpcblx0XHRcdGV4cHJlc3Npb24uZXhwcmVzc2lvbnMgPSBleHByZXNzaW9uLmV4cHJlc3Npb25zLm1hcChzdWJFeHByZXNzaW9uID0+XG5cdFx0XHRcdHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KHN1YkV4cHJlc3Npb24sIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pXG5cdFx0XHQpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkNvbXBsZXhUeXBlXCI6XG5cdFx0XHRleHByZXNzaW9uLmJpbmRpbmdQYXJhbWV0ZXJzID0gZXhwcmVzc2lvbi5iaW5kaW5nUGFyYW1ldGVycy5tYXAoYmluZGluZ1BhcmFtZXRlciA9PlxuXHRcdFx0XHR0cmFuc2Zvcm1SZWN1cnNpdmVseShiaW5kaW5nUGFyYW1ldGVyLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKVxuXHRcdFx0KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJJZkVsc2VcIjpcblx0XHRcdGNvbnN0IG9uVHJ1ZSA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24ub25UcnVlLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKTtcblx0XHRcdGNvbnN0IG9uRmFsc2UgPSB0cmFuc2Zvcm1SZWN1cnNpdmVseShleHByZXNzaW9uLm9uRmFsc2UsIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pO1xuXHRcdFx0bGV0IGNvbmRpdGlvbiA9IGV4cHJlc3Npb24uY29uZGl0aW9uO1xuXHRcdFx0aWYgKGluY2x1ZGVBbGxFeHByZXNzaW9uKSB7XG5cdFx0XHRcdGNvbmRpdGlvbiA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24uY29uZGl0aW9uLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKTtcblx0XHRcdH1cblx0XHRcdGV4cHJlc3Npb24gPSBpZkVsc2UoY29uZGl0aW9uLCBvblRydWUsIG9uRmFsc2UpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiTm90XCI6XG5cdFx0XHRpZiAoaW5jbHVkZUFsbEV4cHJlc3Npb24pIHtcblx0XHRcdFx0Y29uc3Qgb3BlcmFuZCA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24ub3BlcmFuZCwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHRcdGV4cHJlc3Npb24gPSBub3Qob3BlcmFuZCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJUcnV0aHlcIjpcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJTZXRcIjpcblx0XHRcdGlmIChpbmNsdWRlQWxsRXhwcmVzc2lvbikge1xuXHRcdFx0XHRleHByZXNzaW9uLm9wZXJhbmRzID0gZXhwcmVzc2lvbi5vcGVyYW5kcy5tYXAob3BlcmFuZCA9PlxuXHRcdFx0XHRcdHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KG9wZXJhbmQsIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiQ29tcGFyaXNvblwiOlxuXHRcdFx0aWYgKGluY2x1ZGVBbGxFeHByZXNzaW9uKSB7XG5cdFx0XHRcdGNvbnN0IG9wZXJhbmQxID0gdHJhbnNmb3JtUmVjdXJzaXZlbHkoZXhwcmVzc2lvbi5vcGVyYW5kMSwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHRcdGNvbnN0IG9wZXJhbmQyID0gdHJhbnNmb3JtUmVjdXJzaXZlbHkoZXhwcmVzc2lvbi5vcGVyYW5kMiwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHRcdGV4cHJlc3Npb24gPSBjb21wYXJpc29uKGV4cHJlc3Npb24ub3BlcmF0b3IsIG9wZXJhbmQxLCBvcGVyYW5kMikgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJEZWZhdWx0QmluZGluZ1wiOlxuXHRcdGNhc2UgXCJSZWZcIjpcblx0XHRjYXNlIFwiTGVuZ3RoXCI6XG5cdFx0Y2FzZSBcIkJpbmRpbmdcIjpcblx0XHRjYXNlIFwiQ29uc3RhbnRcIjpcblx0XHRcdC8vIERvIG5vdGhpbmdcblx0XHRcdGJyZWFrO1xuXHR9XG5cdGlmIChleHByZXNzaW9uVHlwZSA9PT0gZXhwcmVzc2lvbi5fdHlwZSkge1xuXHRcdGV4cHJlc3Npb24gPSB0cmFuc2Zvcm1GdW5jdGlvbihpbkV4cHJlc3Npb24pO1xuXHR9XG5cdHJldHVybiBleHByZXNzaW9uO1xufVxuXG5leHBvcnQgdHlwZSBCaW5kaW5nRXhwcmVzc2lvbjxUPiA9IFQgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmNvbnN0IG5lZWRQYXJlbnRoZXNpcyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihleHByOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4pOiBib29sZWFuIHtcblx0cmV0dXJuICFpc0NvbnN0YW50KGV4cHIpICYmICFpc0JpbmRpbmcoZXhwcikgJiYgaXNFeHByZXNzaW9uKGV4cHIpICYmIGV4cHIuX3R5cGUgIT09IFwiSWZFbHNlXCIgJiYgZXhwci5fdHlwZSAhPT0gXCJGdW5jdGlvblwiO1xufTtcblxuLyoqXG4gKiBDb21waWxlcyBhIGNvbnN0YW50IG9iamVjdCB0byBhIHN0cmluZy5cbiAqIEBwYXJhbSBleHByXG4gKiBAcGFyYW0gaXNOdWxsYWJsZVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbXBpbGVkIHN0cmluZ1xuICovXG5mdW5jdGlvbiBjb21waWxlQ29uc3RhbnRPYmplY3Q8VD4oZXhwcjogQ29uc3RhbnRFeHByZXNzaW9uPG9iamVjdD4sIGlzTnVsbGFibGUgPSBmYWxzZSkge1xuXHRpZiAoaXNOdWxsYWJsZSAmJiBPYmplY3Qua2V5cyhleHByLnZhbHVlKS5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXHQvLyBPYmplY3RzXG5cdGNvbnN0IG8gPSBleHByLnZhbHVlIGFzIFBsYWluRXhwcmVzc2lvbk9iamVjdDtcblx0Y29uc3QgcHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0T2JqZWN0LmtleXMobykuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNvbnN0IHZhbHVlID0gb1trZXldO1xuXHRcdGNvbnN0IGNoaWxkUmVzdWx0ID0gY29tcGlsZUJpbmRpbmcodmFsdWUsIHRydWUsIGZhbHNlLCB0cnVlKTtcblx0XHRpZiAoY2hpbGRSZXN1bHQgJiYgY2hpbGRSZXN1bHQubGVuZ3RoID4gMCkge1xuXHRcdFx0cHJvcGVydGllcy5wdXNoKGAke2tleX06ICR7Y2hpbGRSZXN1bHR9YCk7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGB7JHtwcm9wZXJ0aWVzLmpvaW4oXCIsIFwiKX19YDtcbn1cblxuLyoqXG4gKiBDb21waWxlcyBhIENvbnN0YW50IEJpbmRpbmcgRXhwcmVzc2lvbi5cbiAqIEBwYXJhbSBleHByXG4gKiBAcGFyYW0gZW1iZWRkZWRJbkJpbmRpbmdcbiAqIEBwYXJhbSBpc051bGxhYmxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tcGlsZWQgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVDb25zdGFudDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oZXhwcjogQ29uc3RhbnRFeHByZXNzaW9uPFQ+LCBlbWJlZGRlZEluQmluZGluZzogYm9vbGVhbiwgaXNOdWxsYWJsZSA9IGZhbHNlKSB7XG5cdGlmIChleHByLnZhbHVlID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIFwibnVsbFwiO1xuXHR9XG5cdGlmIChleHByLnZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gXCJ1bmRlZmluZWRcIjtcblx0fVxuXHRpZiAodHlwZW9mIGV4cHIudmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShleHByLnZhbHVlKSkge1xuXHRcdFx0Y29uc3QgZW50cmllcyA9IGV4cHIudmFsdWUubWFwKGV4cHJlc3Npb24gPT4gY29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbiwgdHJ1ZSkpO1xuXHRcdFx0cmV0dXJuIGBbJHtlbnRyaWVzLmpvaW4oXCIsIFwiKX1dYDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVDb25zdGFudE9iamVjdChleHByIGFzIENvbnN0YW50RXhwcmVzc2lvbjxvYmplY3Q+LCBpc051bGxhYmxlKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoZW1iZWRkZWRJbkJpbmRpbmcpIHtcblx0XHRzd2l0Y2ggKHR5cGVvZiBleHByLnZhbHVlKSB7XG5cdFx0XHRjYXNlIFwibnVtYmVyXCI6XG5cdFx0XHRjYXNlIFwiYmlnaW50XCI6XG5cdFx0XHRjYXNlIFwiYm9vbGVhblwiOlxuXHRcdFx0XHRyZXR1cm4gZXhwci52YWx1ZS50b1N0cmluZygpO1xuXHRcdFx0Y2FzZSBcInN0cmluZ1wiOlxuXHRcdFx0XHRyZXR1cm4gYCcke2VzY2FwZVhtbEF0dHJpYnV0ZShleHByLnZhbHVlLnRvU3RyaW5nKCkpfSdgO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBleHByLnZhbHVlLnRvU3RyaW5nKCk7XG5cdH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIGJpbmRpbmcgc3RyaW5nIGZvciBhIEJpbmRpbmcgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbkZvckJpbmRpbmcgVGhlIGV4cHJlc3Npb24gdG8gY29tcGlsZVxuICogQHBhcmFtIGVtYmVkZGVkSW5CaW5kaW5nIFdoZXRoZXIgdGhlIGV4cHJlc3Npb24gdG8gY29tcGlsZSBpcyBlbWJlZGRlZCBpbnRvIGFub3RoZXIgZXhwcmVzc2lvblxuICogQHBhcmFtIGVtYmVkZGVkU2VwYXJhdG9yIFRoZSBiaW5kaW5nIHZhbHVlIGV2YWx1YXRvciAoJCBvciAlIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIHdhbnQgdG8gZm9yY2UgdGhlIHR5cGUgb3Igbm90KVxuICogQHJldHVybnMge0JpbmRpbmdFeHByZXNzaW9uPFQ+fSBUaGUgY29ycmVzcG9uZGluZyBleHByZXNzaW9uIGJpbmRpbmdcbiAqL1xuZnVuY3Rpb24gY29tcGlsZUJpbmRpbmdGb3JCaW5kaW5nPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0ZXhwcmVzc2lvbkZvckJpbmRpbmc6IEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPiB8IERlZmF1bHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4sXG5cdGVtYmVkZGVkSW5CaW5kaW5nOiBib29sZWFuLFxuXHRlbWJlZGRlZFNlcGFyYXRvcjogc3RyaW5nXG4pIHtcblx0aWYgKFxuXHRcdGV4cHJlc3Npb25Gb3JCaW5kaW5nLnR5cGUgfHxcblx0XHRleHByZXNzaW9uRm9yQmluZGluZy5wYXJhbWV0ZXJzIHx8XG5cdFx0ZXhwcmVzc2lvbkZvckJpbmRpbmcudGFyZ2V0VHlwZSB8fFxuXHRcdGV4cHJlc3Npb25Gb3JCaW5kaW5nLmZvcm1hdE9wdGlvbnMgfHxcblx0XHRleHByZXNzaW9uRm9yQmluZGluZy5jb25zdHJhaW50c1xuXHQpIHtcblx0XHQvLyBUaGlzIGlzIG5vdyBhIGNvbXBsZXggYmluZGluZyBkZWZpbml0aW9uLCBsZXQncyBwcmVwYXJlIGZvciBpdFxuXHRcdGNvbnN0IGNvbXBsZXhCaW5kaW5nRGVmaW5pdGlvbiA9IHtcblx0XHRcdHBhdGg6IGNvbXBpbGVCaW5kaW5nUGF0aChleHByZXNzaW9uRm9yQmluZGluZyksXG5cdFx0XHR0eXBlOiBleHByZXNzaW9uRm9yQmluZGluZy50eXBlLFxuXHRcdFx0dGFyZ2V0VHlwZTogZXhwcmVzc2lvbkZvckJpbmRpbmcudGFyZ2V0VHlwZSxcblx0XHRcdHBhcmFtZXRlcnM6IGV4cHJlc3Npb25Gb3JCaW5kaW5nLnBhcmFtZXRlcnMsXG5cdFx0XHRmb3JtYXRPcHRpb25zOiBleHByZXNzaW9uRm9yQmluZGluZy5mb3JtYXRPcHRpb25zLFxuXHRcdFx0Y29uc3RyYWludHM6IGV4cHJlc3Npb25Gb3JCaW5kaW5nLmNvbnN0cmFpbnRzXG5cdFx0fTtcblx0XHRsZXQgb3V0QmluZGluZyA9IGNvbXBpbGVCaW5kaW5nKGNvbXBsZXhCaW5kaW5nRGVmaW5pdGlvbik7XG5cdFx0aWYgKGVtYmVkZGVkSW5CaW5kaW5nKSB7XG5cdFx0XHRvdXRCaW5kaW5nID0gYCR7ZW1iZWRkZWRTZXBhcmF0b3J9YCArIG91dEJpbmRpbmc7XG5cdFx0fVxuXHRcdHJldHVybiBvdXRCaW5kaW5nO1xuXHR9IGVsc2UgaWYgKGVtYmVkZGVkSW5CaW5kaW5nKSB7XG5cdFx0cmV0dXJuIGAke2VtYmVkZGVkU2VwYXJhdG9yfXske2NvbXBpbGVCaW5kaW5nUGF0aChleHByZXNzaW9uRm9yQmluZGluZyl9fWA7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGB7JHtjb21waWxlQmluZGluZ1BhdGgoZXhwcmVzc2lvbkZvckJpbmRpbmcpfX1gO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVDb21wbGV4VHlwZUV4cHJlc3Npb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KGV4cHJlc3Npb246IENvbXBsZXhUeXBlRXhwcmVzc2lvbjxUPikge1xuXHRpZiAoZXhwcmVzc2lvbi5iaW5kaW5nUGFyYW1ldGVycy5sZW5ndGggPT09IDEpIHtcblx0XHRyZXR1cm4gYHske2NvbXBpbGVQYXRoUGFyYW1ldGVyKGV4cHJlc3Npb24uYmluZGluZ1BhcmFtZXRlcnNbMF0sIHRydWUpfSwgdHlwZTogJyR7ZXhwcmVzc2lvbi50eXBlfSd9YDtcblx0fVxuXG5cdGxldCBvdXRwdXRFbmQ7XG5cdC8vIHRoaXMgY29kZSBpcyBiYXNlZCBvbiBzYXAudWkubW9kZWwub2RhdGEudjQuX0Fubm90YXRpb25IZWxwZXJFeHByZXNzaW9uLmZldGNoQ3VycmVuY3lPclVuaXRcblx0c3dpdGNoIChleHByZXNzaW9uLnR5cGUpIHtcblx0XHRjYXNlIFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuVW5pdFwiOlxuXHRcdFx0b3V0cHV0RW5kID0gYCx7bW9kZTonT25lVGltZScscGF0aDonLyMjQEByZXF1ZXN0VW5pdHNPZk1lYXN1cmUnLHRhcmdldFR5cGU6J2FueSd9XSx0eXBlOidzYXAudWkubW9kZWwub2RhdGEudHlwZS5Vbml0J2A7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuQ3VycmVuY3lcIjpcblx0XHRcdG91dHB1dEVuZCA9IGAse21vZGU6J09uZVRpbWUnLHBhdGg6Jy8jI0BAcmVxdWVzdEN1cnJlbmN5Q29kZXMnLHRhcmdldFR5cGU6J2FueSd9XSx0eXBlOidzYXAudWkubW9kZWwub2RhdGEudHlwZS5DdXJyZW5jeSdgO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdG91dHB1dEVuZCA9IGBdLCB0eXBlOiAnJHtleHByZXNzaW9uLnR5cGV9J2A7XG5cdH1cblx0aWYgKGhhc0VsZW1lbnRzKGV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucykpIHtcblx0XHRvdXRwdXRFbmQgKz0gYCwgZm9ybWF0T3B0aW9uczogJHtjb21waWxlQmluZGluZyhleHByZXNzaW9uLmZvcm1hdE9wdGlvbnMpfWA7XG5cdH1cblx0aWYgKGhhc0VsZW1lbnRzKGV4cHJlc3Npb24ucGFyYW1ldGVycykpIHtcblx0XHRvdXRwdXRFbmQgKz0gYCwgcGFyYW1ldGVyczogJHtjb21waWxlQmluZGluZyhleHByZXNzaW9uLnBhcmFtZXRlcnMpfWA7XG5cdH1cblx0b3V0cHV0RW5kICs9IFwifVwiO1xuXG5cdHJldHVybiBge21vZGU6J1R3b1dheScsIHBhcnRzOlske2V4cHJlc3Npb24uYmluZGluZ1BhcmFtZXRlcnMubWFwKChwYXJhbTogYW55KSA9PiBjb21waWxlUGF0aFBhcmFtZXRlcihwYXJhbSkpLmpvaW4oXCIsXCIpfSR7b3V0cHV0RW5kfWA7XG59XG5cbi8qKlxuICogV3JhcCB0aGUgY29tcGlsZWQgYmluZGluZyBzdHJpbmcgYXMgcmVxdWlyZWQgZGVwZW5kZW5pbmcgb24gaXRzIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGNvbXBpbGVkIGV4cHJlc3Npb25cbiAqIEBwYXJhbSBlbWJlZGRlZEluQmluZGluZyBUcnVlIGlmIHRoZSBjb21waWxlZCBleHByZXNzaW9uIGlzIHRvIGJlIGVtYmVkZGVkIGluIGEgYmluZGluZ1xuICogQHBhcmFtIHBhcmVudGhlc2lzUmVxdWlyZWQgVHJ1ZSBpZiB0aGUgZW1iZWRkZWQgYmluZGluZyBuZWVkcyB0byBiZSB3cmFwcGVkIGluIHBhcmV0aGVzaXMgc28gdGhhdCBpdCBpcyBldmFsdWF0ZWQgYXMgb25lXG4gKiBAcmV0dXJucyB7QmluZGluZ0V4cHJlc3Npb248c3RyaW5nPn0gRmluYWxpemVkIGNvbXBpbGVkIGV4cHJlc3Npb25cbiAqL1xuZnVuY3Rpb24gd3JhcEJpbmRpbmdFeHByZXNzaW9uKGV4cHJlc3Npb246IHN0cmluZywgZW1iZWRkZWRJbkJpbmRpbmc6IGJvb2xlYW4sIHBhcmVudGhlc2lzUmVxdWlyZWQgPSBmYWxzZSk6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRpZiAoZW1iZWRkZWRJbkJpbmRpbmcpIHtcblx0XHRpZiAocGFyZW50aGVzaXNSZXF1aXJlZCkge1xuXHRcdFx0cmV0dXJuIGAoJHtleHByZXNzaW9ufSlgO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZXhwcmVzc2lvbjtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGB7PSAke2V4cHJlc3Npb259fWA7XG5cdH1cbn1cblxuLyoqXG4gKiBDb21waWxlIGFuIGV4cHJlc3Npb24gaW50byBhbiBleHByZXNzaW9uIGJpbmRpbmcuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBjb21waWxlXG4gKiBAcGFyYW0gZW1iZWRkZWRJbkJpbmRpbmcgV2hldGhlciB0aGUgZXhwcmVzc2lvbiB0byBjb21waWxlIGlzIGVtYmVkZGVkIGludG8gYW5vdGhlciBleHByZXNzaW9uXG4gKiBAcGFyYW0ga2VlcFRhcmdldFR5cGUgS2VlcCB0aGUgdGFyZ2V0IHR5cGUgb2YgdGhlIGVtYmVkZGVkIGJpbmRpbmdzIGluc3RlYWQgb2YgY2FzdGluZyB0aGVtIHRvIGFueVxuICogQHBhcmFtIGlzTnVsbGFibGUgV2hldGhlciBiaW5kaW5nIGV4cHJlc3Npb24gY2FuIHJlc29sdmUgdG8gZW1wdHkgc3RyaW5nIG9yIG5vdFxuICogQHJldHVybnMge0JpbmRpbmdFeHByZXNzaW9uPFQ+fSBUaGUgY29ycmVzcG9uZGluZyBleHByZXNzaW9uIGJpbmRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVCaW5kaW5nPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0ZXhwcmVzc2lvbjogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRlbWJlZGRlZEluQmluZGluZyA9IGZhbHNlLFxuXHRrZWVwVGFyZ2V0VHlwZSA9IGZhbHNlLFxuXHRpc051bGxhYmxlID0gZmFsc2Vcbik6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBleHByID0gd3JhcFByaW1pdGl2ZShleHByZXNzaW9uKTtcblx0Y29uc3QgZW1iZWRkZWRTZXBhcmF0b3IgPSBrZWVwVGFyZ2V0VHlwZSA/IFwiJFwiIDogXCIlXCI7XG5cblx0c3dpdGNoIChleHByLl90eXBlKSB7XG5cdFx0Y2FzZSBcIlVucmVzb2x2YWJsZVwiOlxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdGNhc2UgXCJDb25zdGFudFwiOlxuXHRcdFx0cmV0dXJuIGNvbXBpbGVDb25zdGFudChleHByLCBlbWJlZGRlZEluQmluZGluZywgaXNOdWxsYWJsZSk7XG5cblx0XHRjYXNlIFwiUmVmXCI6XG5cdFx0XHRyZXR1cm4gZXhwci5yZWYgfHwgXCJudWxsXCI7XG5cblx0XHRjYXNlIFwiRnVuY3Rpb25cIjpcblx0XHRcdGNvbnN0IGFyZ3VtZW50U3RyaW5nID0gYCR7ZXhwci5wYXJhbWV0ZXJzLm1hcChhcmcgPT4gY29tcGlsZUJpbmRpbmcoYXJnLCB0cnVlKSkuam9pbihcIiwgXCIpfWA7XG5cdFx0XHRyZXR1cm4gZXhwci5vYmogPT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IGAke2V4cHIuZm59KCR7YXJndW1lbnRTdHJpbmd9KWBcblx0XHRcdFx0OiBgJHtjb21waWxlQmluZGluZyhleHByLm9iaiwgdHJ1ZSl9LiR7ZXhwci5mbn0oJHthcmd1bWVudFN0cmluZ30pYDtcblxuXHRcdGNhc2UgXCJFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gZW1iZWRkZWRJbkJpbmRpbmcgPyBgKCR7ZXhwci52YWx1ZS5zdWJzdHIoMiwgZXhwci52YWx1ZS5sZW5ndGggLSAzKX0pYCA6IGAke2V4cHIudmFsdWV9YDtcblxuXHRcdGNhc2UgXCJFbWJlZGRlZEJpbmRpbmdcIjpcblx0XHRcdHJldHVybiBlbWJlZGRlZEluQmluZGluZyA/IGAke2VtYmVkZGVkU2VwYXJhdG9yfSR7ZXhwci52YWx1ZX1gIDogYCR7ZXhwci52YWx1ZX1gO1xuXG5cdFx0Y2FzZSBcIkRlZmF1bHRCaW5kaW5nXCI6XG5cdFx0Y2FzZSBcIkJpbmRpbmdcIjpcblx0XHRcdHJldHVybiBjb21waWxlQmluZGluZ0ZvckJpbmRpbmcoZXhwciwgZW1iZWRkZWRJbkJpbmRpbmcsIGVtYmVkZGVkU2VwYXJhdG9yKTtcblxuXHRcdGNhc2UgXCJDb21wYXJpc29uXCI6XG5cdFx0XHRjb25zdCBjb21wYXJpc29uRXhwcmVzc2lvbiA9IGNvbXBpbGVDb21wYXJpc29uRXhwcmVzc2lvbihleHByKTtcblx0XHRcdHJldHVybiB3cmFwQmluZGluZ0V4cHJlc3Npb24oY29tcGFyaXNvbkV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nKTtcblxuXHRcdGNhc2UgXCJJZkVsc2VcIjpcblx0XHRcdGNvbnN0IGlmRWxzZUV4cHJlc3Npb24gPSBgJHtjb21waWxlQmluZGluZyhleHByLmNvbmRpdGlvbiwgdHJ1ZSl9ID8gJHtjb21waWxlQmluZGluZyhleHByLm9uVHJ1ZSwgdHJ1ZSl9IDogJHtjb21waWxlQmluZGluZyhcblx0XHRcdFx0ZXhwci5vbkZhbHNlLFxuXHRcdFx0XHR0cnVlXG5cdFx0XHQpfWA7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKGlmRWxzZUV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nLCB0cnVlKTtcblxuXHRcdGNhc2UgXCJTZXRcIjpcblx0XHRcdGNvbnN0IHNldEV4cHJlc3Npb24gPSBleHByLm9wZXJhbmRzLm1hcChvcGVyYW5kID0+IGNvbXBpbGVCaW5kaW5nKG9wZXJhbmQsIHRydWUpKS5qb2luKGAgJHtleHByLm9wZXJhdG9yfSBgKTtcblx0XHRcdHJldHVybiB3cmFwQmluZGluZ0V4cHJlc3Npb24oc2V0RXhwcmVzc2lvbiwgZW1iZWRkZWRJbkJpbmRpbmcsIHRydWUpO1xuXG5cdFx0Y2FzZSBcIkNvbmNhdFwiOlxuXHRcdFx0Y29uc3QgY29uY2F0RXhwcmVzc2lvbiA9IGV4cHIuZXhwcmVzc2lvbnMubWFwKG5lc3RlZEV4cHJlc3Npb24gPT4gY29tcGlsZUJpbmRpbmcobmVzdGVkRXhwcmVzc2lvbiwgdHJ1ZSwgdHJ1ZSkpLmpvaW4oXCIgKyBcIik7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKGNvbmNhdEV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nKTtcblxuXHRcdGNhc2UgXCJMZW5ndGhcIjpcblx0XHRcdGNvbnN0IGxlbmd0aEV4cHJlc3Npb24gPSBgJHtjb21waWxlQmluZGluZyhleHByLmJpbmRpbmdFeHByZXNzaW9uLCB0cnVlKX0ubGVuZ3RoYDtcblx0XHRcdHJldHVybiB3cmFwQmluZGluZ0V4cHJlc3Npb24obGVuZ3RoRXhwcmVzc2lvbiwgZW1iZWRkZWRJbkJpbmRpbmcpO1xuXG5cdFx0Y2FzZSBcIk5vdFwiOlxuXHRcdFx0Y29uc3Qgbm90RXhwcmVzc2lvbiA9IGAhJHtjb21waWxlQmluZGluZyhleHByLm9wZXJhbmQsIHRydWUpfWA7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKG5vdEV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nKTtcblxuXHRcdGNhc2UgXCJUcnV0aHlcIjpcblx0XHRcdGNvbnN0IHRydXRoeUV4cHJlc3Npb24gPSBgISEke2NvbXBpbGVCaW5kaW5nKGV4cHIub3BlcmFuZCwgdHJ1ZSl9YDtcblx0XHRcdHJldHVybiB3cmFwQmluZGluZ0V4cHJlc3Npb24odHJ1dGh5RXhwcmVzc2lvbiwgZW1iZWRkZWRJbkJpbmRpbmcpO1xuXG5cdFx0Y2FzZSBcIkZvcm1hdHRlclwiOlxuXHRcdFx0Y29uc3QgZm9ybWF0dGVyRXhwcmVzc2lvbiA9IGNvbXBpbGVGb3JtYXR0ZXJFeHByZXNzaW9uKGV4cHIpO1xuXHRcdFx0cmV0dXJuIGVtYmVkZGVkSW5CaW5kaW5nID8gYFxcJCR7Zm9ybWF0dGVyRXhwcmVzc2lvbn1gIDogZm9ybWF0dGVyRXhwcmVzc2lvbjtcblxuXHRcdGNhc2UgXCJDb21wbGV4VHlwZVwiOlxuXHRcdFx0Y29uc3QgY29tcGxleFR5cGVFeHByZXNzaW9uID0gY29tcGlsZUNvbXBsZXhUeXBlRXhwcmVzc2lvbihleHByKTtcblx0XHRcdHJldHVybiBlbWJlZGRlZEluQmluZGluZyA/IGBcXCQke2NvbXBsZXhUeXBlRXhwcmVzc2lvbn1gIDogY29tcGxleFR5cGVFeHByZXNzaW9uO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBcIlwiO1xuXHR9XG59XG5cbi8qKlxuICogQ29tcGlsZSBhIGNvbXBhcmlzb24gZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgY29tcGFyaXNvbiBleHByZXNzaW9uLlxuICogQHJldHVybnMgVGhlIGNvbXBpbGVkIGV4cHJlc3Npb24uIE5lZWRzIHdyYXBwaW5nIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBhcyBhbiBleHByZXNzaW9uIGJpbmRpbmcuXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVDb21wYXJpc29uRXhwcmVzc2lvbihleHByZXNzaW9uOiBDb21wYXJpc29uRXhwcmVzc2lvbikge1xuXHRmdW5jdGlvbiBjb21waWxlT3BlcmFuZChvcGVyYW5kOiBFeHByZXNzaW9uPGFueT4pIHtcblx0XHRjb25zdCBjb21waWxlZE9wZXJhbmQgPSBjb21waWxlQmluZGluZyhvcGVyYW5kLCB0cnVlKSA/PyBcInVuZGVmaW5lZFwiO1xuXHRcdHJldHVybiB3cmFwQmluZGluZ0V4cHJlc3Npb24oY29tcGlsZWRPcGVyYW5kLCB0cnVlLCBuZWVkUGFyZW50aGVzaXMob3BlcmFuZCkpO1xuXHR9XG5cblx0cmV0dXJuIGAke2NvbXBpbGVPcGVyYW5kKGV4cHJlc3Npb24ub3BlcmFuZDEpfSAke2V4cHJlc3Npb24ub3BlcmF0b3J9ICR7Y29tcGlsZU9wZXJhbmQoZXhwcmVzc2lvbi5vcGVyYW5kMil9YDtcbn1cblxuLyoqXG4gKiBDb21waWxlIGEgZm9ybWF0dGVyIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGZvcm1hdHRlciBleHByZXNzaW9uLlxuICogQHJldHVybnMgVGhlIGNvbXBpbGVkIGV4cHJlc3Npb24uXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVGb3JtYXR0ZXJFeHByZXNzaW9uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihleHByZXNzaW9uOiBGb3JtYXR0ZXJFeHByZXNzaW9uPFQ+KSB7XG5cdGlmIChleHByZXNzaW9uLnBhcmFtZXRlcnMubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIGB7JHtjb21waWxlUGF0aFBhcmFtZXRlcihleHByZXNzaW9uLnBhcmFtZXRlcnNbMF0sIHRydWUpfSwgZm9ybWF0dGVyOiAnJHtleHByZXNzaW9uLmZufSd9YDtcblx0fSBlbHNlIHtcblx0XHRjb25zdCBwYXJ0cyA9IGV4cHJlc3Npb24ucGFyYW1ldGVycy5tYXAocGFyYW0gPT4gY29tcGlsZVBhdGhQYXJhbWV0ZXIocGFyYW0pKTtcblx0XHRyZXR1cm4gYHtwYXJ0czogWyR7cGFydHMuam9pbihcIiwgXCIpfV0sIGZvcm1hdHRlcjogJyR7ZXhwcmVzc2lvbi5mbn0nfWA7XG5cdH1cbn1cblxuLyoqXG4gKiBDb21waWxlIHRoZSBwYXRoIHBhcmFtZXRlciBvZiBhIGZvcm1hdHRlciBjYWxsLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBiaW5kaW5nIHBhcnQgdG8gZXZhbHVhdGVcbiAqIEBwYXJhbSBzaW5nbGVQYXRoIFdoZXRoZXIgdGhlcmUgaXMgb25lIG9yIG11bHRpcGxlIHBhdGggdG8gY29uc2lkZXJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzdHJpbmcgc25pcHBldCB0byBpbmNsdWRlIGluIHRoZSBvdmVyYWxsIGJpbmRpbmcgZGVmaW5pdGlvblxuICovXG5mdW5jdGlvbiBjb21waWxlUGF0aFBhcmFtZXRlcihleHByZXNzaW9uOiBFeHByZXNzaW9uPGFueT4sIHNpbmdsZVBhdGggPSBmYWxzZSk6IHN0cmluZyB7XG5cdGxldCBvdXRWYWx1ZSA9IFwiXCI7XG5cdGlmIChleHByZXNzaW9uLl90eXBlID09PSBcIkNvbnN0YW50XCIpIHtcblx0XHRzd2l0Y2ggKHR5cGVvZiBleHByZXNzaW9uLnZhbHVlKSB7XG5cdFx0XHRjYXNlIFwibnVtYmVyXCI6XG5cdFx0XHRjYXNlIFwiYmlnaW50XCI6XG5cdFx0XHRcdG91dFZhbHVlID0gYHZhbHVlOiAke2V4cHJlc3Npb24udmFsdWUudG9TdHJpbmcoKX1gO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJzdHJpbmdcIjpcblx0XHRcdFx0b3V0VmFsdWUgPSBgdmFsdWU6ICcke2VzY2FwZVhtbEF0dHJpYnV0ZShleHByZXNzaW9uLnZhbHVlLnRvU3RyaW5nKCkpfSdgO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJib29sZWFuXCI6XG5cdFx0XHRcdG91dFZhbHVlID0gYHZhbHVlOiAnJHtleHByZXNzaW9uLnZhbHVlLnRvU3RyaW5nKCl9J2A7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0b3V0VmFsdWUgPSBcInZhbHVlOiAnJ1wiO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJEZWZhdWx0QmluZGluZ1wiIHx8IGV4cHJlc3Npb24uX3R5cGUgPT09IFwiQmluZGluZ1wiKSB7XG5cdFx0b3V0VmFsdWUgPSBgcGF0aDogJyR7Y29tcGlsZUJpbmRpbmdQYXRoKGV4cHJlc3Npb24pfSdgO1xuXG5cdFx0b3V0VmFsdWUgKz0gZXhwcmVzc2lvbi50eXBlID8gYCwgdHlwZTogJyR7ZXhwcmVzc2lvbi50eXBlfSdgIDogYCwgdGFyZ2V0VHlwZTogJ2FueSdgO1xuXG5cdFx0aWYgKGhhc0VsZW1lbnRzKGV4cHJlc3Npb24uY29uc3RyYWludHMpKSB7XG5cdFx0XHRvdXRWYWx1ZSArPSBgLCBjb25zdHJhaW50czogJHtjb21waWxlQmluZGluZyhleHByZXNzaW9uLmNvbnN0cmFpbnRzKX1gO1xuXHRcdH1cblx0XHRpZiAoaGFzRWxlbWVudHMoZXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zKSkge1xuXHRcdFx0b3V0VmFsdWUgKz0gYCwgZm9ybWF0T3B0aW9uczogJHtjb21waWxlQmluZGluZyhleHByZXNzaW9uLmZvcm1hdE9wdGlvbnMpfWA7XG5cdFx0fVxuXHRcdGlmIChoYXNFbGVtZW50cyhleHByZXNzaW9uLnBhcmFtZXRlcnMpKSB7XG5cdFx0XHRvdXRWYWx1ZSArPSBgLCBwYXJhbWV0ZXJzOiAke2NvbXBpbGVCaW5kaW5nKGV4cHJlc3Npb24ucGFyYW1ldGVycyl9YDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblx0cmV0dXJuIHNpbmdsZVBhdGggPyBvdXRWYWx1ZSA6IGB7JHtvdXRWYWx1ZX19YDtcbn1cblxuZnVuY3Rpb24gaGFzRWxlbWVudHMob2JqOiBhbnkpIHtcblx0cmV0dXJuIG9iaiAmJiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogQ29tcGlsZSBhIGJpbmRpbmcgZXhwcmVzc2lvbiBwYXRoLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGNvbXBpbGUuXG4gKiBAcmV0dXJucyBUaGUgY29tcGlsZWQgcGF0aC5cbiAqL1xuZnVuY3Rpb24gY29tcGlsZUJpbmRpbmdQYXRoPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihleHByZXNzaW9uOiBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4gfCBEZWZhdWx0QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+KSB7XG5cdHJldHVybiBgJHtleHByZXNzaW9uLm1vZGVsTmFtZSA/IGV4cHJlc3Npb24ubW9kZWxOYW1lICsgXCI+XCIgOiBcIlwifSR7ZXhwcmVzc2lvbi5wYXRofWA7XG59XG4iXX0=