@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
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/formatters/ValueFormatter", "sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templating/FieldControlHelper", "sap/fe/core/templating/PropertyHelper"], function (BindingHelper, MetaModelConverter, valueFormatters, BindingExpression, DataModelPathHelper, DisplayModeFormatter, FieldControlHelper, PropertyHelper) {
5
+ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/formatters/ValueFormatter", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templating/FieldControlHelper", "sap/fe/core/templating/PropertyHelper"], function (BindingHelper, MetaModelConverter, valueFormatters, BindingToolkit, DataModelPathHelper, DisplayModeFormatter, FieldControlHelper, PropertyHelper) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
@@ -21,19 +21,21 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
21
21
  var isPathUpdatable = DataModelPathHelper.isPathUpdatable;
22
22
  var getTargetObjectPath = DataModelPathHelper.getTargetObjectPath;
23
23
  var getPathRelativeLocation = DataModelPathHelper.getPathRelativeLocation;
24
- var or = BindingExpression.or;
25
- var not = BindingExpression.not;
26
- var isTruthy = BindingExpression.isTruthy;
27
- var isConstant = BindingExpression.isConstant;
28
- var ifElse = BindingExpression.ifElse;
29
- var formatResult = BindingExpression.formatResult;
30
- var equal = BindingExpression.equal;
31
- var constant = BindingExpression.constant;
32
- var compileBinding = BindingExpression.compileBinding;
33
- var bindingExpression = BindingExpression.bindingExpression;
34
- var annotationExpression = BindingExpression.annotationExpression;
35
- var and = BindingExpression.and;
36
- var addTypeInformation = BindingExpression.addTypeInformation;
24
+ var getContextRelativeTargetObjectPath = DataModelPathHelper.getContextRelativeTargetObjectPath;
25
+ var pathInModel = BindingToolkit.pathInModel;
26
+ var or = BindingToolkit.or;
27
+ var notEqual = BindingToolkit.notEqual;
28
+ var not = BindingToolkit.not;
29
+ var isTruthy = BindingToolkit.isTruthy;
30
+ var isConstant = BindingToolkit.isConstant;
31
+ var ifElse = BindingToolkit.ifElse;
32
+ var getExpressionFromAnnotation = BindingToolkit.getExpressionFromAnnotation;
33
+ var formatResult = BindingToolkit.formatResult;
34
+ var equal = BindingToolkit.equal;
35
+ var constant = BindingToolkit.constant;
36
+ var compileExpression = BindingToolkit.compileExpression;
37
+ var and = BindingToolkit.and;
38
+ var addTypeInformation = BindingToolkit.addTypeInformation;
37
39
  var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
38
40
  var convertMetaModelContext = MetaModelConverter.convertMetaModelContext;
39
41
  var UI = BindingHelper.UI;
@@ -57,19 +59,28 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
57
59
  var getDisplayMode = function (oDataModelObjectPath) {
58
60
  return DisplayModeFormatter.getDisplayMode(oDataModelObjectPath.targetObject, oDataModelObjectPath);
59
61
  };
62
+
63
+ _exports.getDisplayMode = getDisplayMode;
64
+
65
+ var getEditableExpressionAsObject = function (oPropertyPath) {
66
+ var oDataFieldConverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
67
+ var oDataModelObjectPath = arguments.length > 2 ? arguments[2] : undefined;
68
+ var isEditable = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : UI.IsEditable;
69
+ return getEditableExpression(oPropertyPath, oDataFieldConverted, oDataModelObjectPath, true, isEditable);
70
+ };
60
71
  /**
61
72
  * Create the expression to generate an "editable" boolean value.
62
73
  *
63
- * @param {PropertyPath} oPropertyPath The input property
64
- * @param {object} oDataFieldConverted The DataFieldConverted object to read the fieldControl annotation
65
- * @param {DataModelObjectPath} oDataModelObjectPath The path to this property object
66
- * @param {boolean} bAsObject Whether or not this should be returned as an object or a binding string
67
- * @param {boolean} isEditable Whether or not UI.IsEditable be considered.
68
- * @returns {string} The binding expression used to determine if a property is editable or not
74
+ * @param oPropertyPath The input property
75
+ * @param oDataFieldConverted The DataFieldConverted object to read the fieldControl annotation
76
+ * @param oDataModelObjectPath The path to this property object
77
+ * @param bAsObject Whether or not this should be returned as an object or a binding string
78
+ * @param isEditable Whether or not UI.IsEditable be considered.
79
+ * @returns The binding expression used to determine if a property is editable or not
69
80
  */
70
81
 
71
82
 
72
- _exports.getDisplayMode = getDisplayMode;
83
+ _exports.getEditableExpressionAsObject = getEditableExpressionAsObject;
73
84
 
74
85
  var getEditableExpression = function (oPropertyPath) {
75
86
  var oDataFieldConverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
@@ -78,10 +89,10 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
78
89
  var isEditable = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : UI.IsEditable;
79
90
 
80
91
  if (!oPropertyPath || typeof oPropertyPath === "string") {
81
- return compileBinding(false);
92
+ return compileExpression(false);
82
93
  }
83
94
 
84
- var dataFieldEditableExpression = true;
95
+ var dataFieldEditableExpression = constant(true);
85
96
 
86
97
  if (oDataFieldConverted !== null) {
87
98
  dataFieldEditableExpression = ifElse(isNonEditableExpression(oDataFieldConverted), false, isEditable);
@@ -110,7 +121,7 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
110
121
  return and(editableExpression, dataFieldEditableExpression);
111
122
  }
112
123
 
113
- return compileBinding(and(editableExpression, dataFieldEditableExpression));
124
+ return compileExpression(and(editableExpression, dataFieldEditableExpression));
114
125
  };
115
126
 
116
127
  _exports.getEditableExpression = getEditableExpression;
@@ -119,35 +130,41 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
119
130
  var _dataModelObjectPath$;
120
131
 
121
132
  var objectPath = getTargetObjectPath(dataModelObjectPath);
122
- var activityExpression = bindingExpression("/collaboration/activities" + objectPath, "internal");
133
+ var activityExpression = pathInModel("/collaboration/activities".concat(objectPath), "internal");
123
134
  var keys = dataModelObjectPath === null || dataModelObjectPath === void 0 ? void 0 : (_dataModelObjectPath$ = dataModelObjectPath.targetEntityType) === null || _dataModelObjectPath$ === void 0 ? void 0 : _dataModelObjectPath$.keys;
124
135
  var keysExpressions = [];
125
136
  keys === null || keys === void 0 ? void 0 : keys.forEach(function (key) {
126
- var keyExpression = bindingExpression(key.name);
137
+ var keyExpression = pathInModel(key.name);
127
138
  keysExpressions.push(keyExpression);
128
139
  });
129
140
  return formatResult([activityExpression].concat(keysExpressions), formatter);
130
141
  };
142
+
143
+ _exports.getCollaborationExpression = getCollaborationExpression;
144
+
145
+ var getEnabledExpressionAsObject = function (oPropertyPath, oDataFieldConverted) {
146
+ return getEnabledExpression(oPropertyPath, oDataFieldConverted, true);
147
+ };
131
148
  /**
132
149
  * Create the expression to generate an "enabled" boolean value.
133
150
  *
134
- * @param {PropertyPath} oPropertyPath The input property
135
- * @param {any} oDataFieldConverted The DataFieldConverted Object to read the fieldControl annotation
136
- * @param {boolean} bAsObject Whether or not this should be returned as an object or a binding string
137
- * @returns {string} The binding expression to determine if a property is enabled or not
151
+ * @param oPropertyPath The input property
152
+ * @param oDataFieldConverted The DataFieldConverted Object to read the fieldControl annotation
153
+ * @param bAsObject Whether or not this should be returned as an object or a binding string
154
+ * @returns The binding expression to determine if a property is enabled or not
138
155
  */
139
156
 
140
157
 
141
- _exports.getCollaborationExpression = getCollaborationExpression;
158
+ _exports.getEnabledExpressionAsObject = getEnabledExpressionAsObject;
142
159
 
143
160
  var getEnabledExpression = function (oPropertyPath, oDataFieldConverted) {
144
161
  var bAsObject = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
145
162
 
146
163
  if (!oPropertyPath || typeof oPropertyPath === "string") {
147
- return compileBinding(true);
164
+ return compileExpression(true);
148
165
  }
149
166
 
150
- var dataFieldEnabledExpression = true;
167
+ var dataFieldEnabledExpression = constant(true);
151
168
 
152
169
  if (oDataFieldConverted !== null) {
153
170
  dataFieldEnabledExpression = ifElse(isDisabledExpression(oDataFieldConverted), false, true);
@@ -162,18 +179,18 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
162
179
  return and(enabledExpression, dataFieldEnabledExpression);
163
180
  }
164
181
 
165
- return compileBinding(and(enabledExpression, dataFieldEnabledExpression));
182
+ return compileExpression(and(enabledExpression, dataFieldEnabledExpression));
166
183
  };
167
184
  /**
168
185
  * Create the expression to generate an "editMode" enum value.
169
186
  *
170
- * @param {PropertyPath} oPropertyPath The input property
171
- * @param {DataModelObjectPath} oDataModelObjectPath The list of data model objects that are involved to reach that property
172
- * @param {boolean} bMeasureReadOnly Whether we should set UoM / currency field mode to read only
173
- * @param {boolean} bAsObject Whether we should return this as an expression or as a string
174
- * @param {object} oDataFieldConverted The dataField object
175
- * @param {boolean} isEditable Whether or not UI.IsEditable be considered.
176
- * @returns {BindingExpression<string> | ExpressionOrPrimitive<string>} The binding expression representing the current property edit mode, compliant with the MDC Field definition of editMode.
187
+ * @param oPropertyPath The input property
188
+ * @param oDataModelObjectPath The list of data model objects that are involved to reach that property
189
+ * @param bMeasureReadOnly Whether we should set UoM / currency field mode to read only
190
+ * @param bAsObject Whether we should return this as an expression or as a string
191
+ * @param oDataFieldConverted The dataField object
192
+ * @param isEditable Whether or not UI.IsEditable be considered.
193
+ * @returns The binding expression representing the current property edit mode, compliant with the MDC Field definition of editMode.
177
194
  */
178
195
 
179
196
 
@@ -196,11 +213,11 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
196
213
  // if the unit field control is readonly -> EditableReadOnly
197
214
  // otherwise -> Editable
198
215
 
199
- var editableExpression = getEditableExpression(oPropertyPath, oDataFieldConverted, oDataModelObjectPath, true, isEditable);
200
- var enabledExpression = getEnabledExpression(oPropertyPath, oDataFieldConverted, true);
216
+ var editableExpression = getEditableExpressionAsObject(oPropertyPath, oDataFieldConverted, oDataModelObjectPath, isEditable);
217
+ var enabledExpression = getEnabledExpressionAsObject(oPropertyPath, oDataFieldConverted);
201
218
  var associatedCurrencyProperty = getAssociatedCurrencyProperty(oProperty);
202
219
  var unitProperty = associatedCurrencyProperty || getAssociatedUnitProperty(oProperty);
203
- var resultExpression = "Editable";
220
+ var resultExpression = constant("Editable");
204
221
 
205
222
  if (unitProperty) {
206
223
  resultExpression = ifElse(or(isReadOnlyExpression(unitProperty), isComputed(unitProperty), bMeasureReadOnly), "EditableReadOnly", "Editable");
@@ -215,7 +232,7 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
215
232
  return editModeExpression;
216
233
  }
217
234
 
218
- return compileBinding(editModeExpression);
235
+ return compileExpression(editModeExpression);
219
236
  };
220
237
 
221
238
  _exports.getEditMode = getEditMode;
@@ -228,9 +245,9 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
228
245
  var measure = currency ? currency : (_oPropertyDefinition$3 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$3 === void 0 ? void 0 : (_oPropertyDefinition$4 = _oPropertyDefinition$3.Measures) === null || _oPropertyDefinition$4 === void 0 ? void 0 : _oPropertyDefinition$4.Unit;
229
246
 
230
247
  if (measure) {
231
- return compileBinding(or(isTruthy(annotationExpression(measure)), not(UI.IsTotal)));
248
+ return compileExpression(or(isTruthy(getExpressionFromAnnotation(measure)), not(UI.IsTotal)));
232
249
  } else {
233
- return compileBinding(constant(true));
250
+ return compileExpression(constant(true));
234
251
  }
235
252
  };
236
253
 
@@ -241,18 +258,18 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
241
258
  var unitProperty = getAssociatedCurrencyProperty(oProperty) || getAssociatedUnitProperty(oProperty);
242
259
 
243
260
  if (!unitProperty) {
244
- return compileBinding(sNonEditableValue);
261
+ return compileExpression(sNonEditableValue);
245
262
  }
246
263
 
247
264
  var editableExpression = and(not(isReadOnlyExpression(unitProperty)), not(isComputed(unitProperty)));
248
- return compileBinding(ifElse(editableExpression, sEditableValue, sNonEditableValue));
265
+ return compileExpression(ifElse(editableExpression, sEditableValue, sNonEditableValue));
249
266
  };
250
267
 
251
268
  _exports.ifUnitEditable = ifUnitEditable;
252
269
 
253
270
  var getFieldDisplay = function (oPropertyPath, sTargetDisplayMode, oComputedEditMode) {
254
271
  var oProperty = isPathExpression(oPropertyPath) && oPropertyPath.$target || oPropertyPath;
255
- return hasValueHelp(oProperty) ? compileBinding(sTargetDisplayMode) : compileBinding(ifElse(equal(oComputedEditMode, "Editable"), "Value", sTargetDisplayMode));
272
+ return hasValueHelp(oProperty) ? compileExpression(sTargetDisplayMode) : compileExpression(ifElse(equal(oComputedEditMode, "Editable"), "Value", sTargetDisplayMode));
256
273
  };
257
274
 
258
275
  _exports.getFieldDisplay = getFieldDisplay;
@@ -285,7 +302,7 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
285
302
  outExpression.constraints.maxLength = oProperty.maxLength;
286
303
  }
287
304
 
288
- if (oTargetMapping.constraints.$Nullable && oProperty.nullable === false) {
305
+ if (oProperty.nullable === false) {
289
306
  outExpression.constraints.nullable = oProperty.nullable;
290
307
  }
291
308
 
@@ -296,6 +313,9 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
296
313
  if (oTargetMapping.constraints["@Org.OData.Validation.V1.Maximum/$Decimal"] && ((_oProperty$annotation3 = oProperty.annotations) === null || _oProperty$annotation3 === void 0 ? void 0 : (_oProperty$annotation4 = _oProperty$annotation3.Validation) === null || _oProperty$annotation4 === void 0 ? void 0 : _oProperty$annotation4.Maximum) !== undefined && !isNaN(oProperty.annotations.Validation.Maximum)) {
297
314
  outExpression.constraints.maximum = "".concat(oProperty.annotations.Validation.Maximum);
298
315
  }
316
+ } else if (oProperty.nullable === false) {
317
+ outExpression.constraints = {};
318
+ outExpression.constraints.nullable = oProperty.nullable;
299
319
  }
300
320
 
301
321
  if ((outExpression === null || outExpression === void 0 ? void 0 : (_outExpression$type = outExpression.type) === null || _outExpression$type === void 0 ? void 0 : _outExpression$type.indexOf("sap.ui.model.odata.type.Int")) === 0) {
@@ -356,7 +376,7 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
356
376
  };
357
377
 
358
378
  if (isProperty(oProperty)) {
359
- var _oTargetMapping$const2, _oTargetMapping$const3, _oTargetMapping$const4, _oTargetMapping$const5, _oTargetMapping$const6, _oProperty$annotation7, _oProperty$annotation8, _oProperty$annotation9, _oProperty$annotation10, _oTargetMapping$const7, _oProperty$annotation11, _oProperty$annotation12, _oProperty$annotation13, _oProperty$annotation14, _oTargetMapping$const8, _annotations, _annotations$Common, _oTargetMapping$const9;
379
+ var _oTargetMapping$const2, _oTargetMapping$const3, _oTargetMapping$const4, _oTargetMapping$const5, _oTargetMapping$const6, _oProperty$annotation7, _oProperty$annotation8, _oProperty$annotation9, _oProperty$annotation10, _oTargetMapping$const7, _oProperty$annotation11, _oProperty$annotation12, _oProperty$annotation13, _oProperty$annotation14, _oTargetMapping$const8, _oProperty$annotation15, _oProperty$annotation16, _oTargetMapping$const9;
360
380
 
361
381
  propertyTypeConfig.constraints = {
362
382
  scale: (_oTargetMapping$const2 = oTargetMapping.constraints) !== null && _oTargetMapping$const2 !== void 0 && _oTargetMapping$const2.$Scale ? oProperty.scale : undefined,
@@ -365,7 +385,7 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
365
385
  nullable: (_oTargetMapping$const5 = oTargetMapping.constraints) !== null && _oTargetMapping$const5 !== void 0 && _oTargetMapping$const5.$Nullable ? oProperty.nullable : undefined,
366
386
  minimum: (_oTargetMapping$const6 = oTargetMapping.constraints) !== null && _oTargetMapping$const6 !== void 0 && _oTargetMapping$const6["@Org.OData.Validation.V1.Minimum/$Decimal"] && !isNaN((_oProperty$annotation7 = oProperty.annotations) === null || _oProperty$annotation7 === void 0 ? void 0 : (_oProperty$annotation8 = _oProperty$annotation7.Validation) === null || _oProperty$annotation8 === void 0 ? void 0 : _oProperty$annotation8.Minimum) ? "".concat((_oProperty$annotation9 = oProperty.annotations) === null || _oProperty$annotation9 === void 0 ? void 0 : (_oProperty$annotation10 = _oProperty$annotation9.Validation) === null || _oProperty$annotation10 === void 0 ? void 0 : _oProperty$annotation10.Minimum) : undefined,
367
387
  maximum: (_oTargetMapping$const7 = oTargetMapping.constraints) !== null && _oTargetMapping$const7 !== void 0 && _oTargetMapping$const7["@Org.OData.Validation.V1.Maximum/$Decimal"] && !isNaN((_oProperty$annotation11 = oProperty.annotations) === null || _oProperty$annotation11 === void 0 ? void 0 : (_oProperty$annotation12 = _oProperty$annotation11.Validation) === null || _oProperty$annotation12 === void 0 ? void 0 : _oProperty$annotation12.Maximum) ? "".concat((_oProperty$annotation13 = oProperty.annotations) === null || _oProperty$annotation13 === void 0 ? void 0 : (_oProperty$annotation14 = _oProperty$annotation13.Validation) === null || _oProperty$annotation14 === void 0 ? void 0 : _oProperty$annotation14.Maximum) : undefined,
368
- isDigitSequence: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && (_oTargetMapping$const8 = oTargetMapping.constraints) !== null && _oTargetMapping$const8 !== void 0 && _oTargetMapping$const8["@com.sap.vocabularies.Common.v1.IsDigitSequence"] && (_annotations = oProperty.annotations) !== null && _annotations !== void 0 && (_annotations$Common = _annotations.Common) !== null && _annotations$Common !== void 0 && _annotations$Common.IsDigitSequence ? true : undefined,
388
+ isDigitSequence: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && (_oTargetMapping$const8 = oTargetMapping.constraints) !== null && _oTargetMapping$const8 !== void 0 && _oTargetMapping$const8["@com.sap.vocabularies.Common.v1.IsDigitSequence"] && (_oProperty$annotation15 = oProperty.annotations) !== null && _oProperty$annotation15 !== void 0 && (_oProperty$annotation16 = _oProperty$annotation15.Common) !== null && _oProperty$annotation16 !== void 0 && _oProperty$annotation16.IsDigitSequence ? true : undefined,
369
389
  V4: (_oTargetMapping$const9 = oTargetMapping.constraints) !== null && _oTargetMapping$const9 !== void 0 && _oTargetMapping$const9.$V4 ? true : undefined
370
390
  };
371
391
  }
@@ -380,7 +400,7 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
380
400
 
381
401
  _exports.getTypeConfig = getTypeConfig;
382
402
 
383
- var getBindingWithUnitOrCurrency = function (oPropertyDataModelPath, propertyBindingExpression, ignoreUnitConstraint) {
403
+ var getBindingWithUnitOrCurrency = function (oPropertyDataModelPath, propertyBindingExpression, ignoreUnitConstraint, formatOptions) {
384
404
  var _oPropertyDefinition$5, _oPropertyDefinition$6, _unit, _oPropertyDefinition$7, _oPropertyDefinition$8;
385
405
 
386
406
  var oPropertyDefinition = oPropertyDataModelPath.targetObject;
@@ -396,24 +416,59 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
396
416
 
397
417
  var complexType = unit ? "sap.ui.model.odata.type.Unit" : "sap.ui.model.odata.type.Currency";
398
418
  unit = unit ? unit : (_oPropertyDefinition$7 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$7 === void 0 ? void 0 : (_oPropertyDefinition$8 = _oPropertyDefinition$7.Measures) === null || _oPropertyDefinition$8 === void 0 ? void 0 : _oPropertyDefinition$8.ISOCurrency;
399
- var unitBindingExpression = unit.$target ? formatWithTypeInformation(unit.$target, annotationExpression(unit, relativeLocation), ignoreUnitConstraint) : annotationExpression(unit, relativeLocation);
400
- return addTypeInformation([propertyBindingExpression, unitBindingExpression], complexType);
419
+ var unitBindingExpression = unit.$target ? formatWithTypeInformation(unit.$target, getExpressionFromAnnotation(unit, relativeLocation), ignoreUnitConstraint) : getExpressionFromAnnotation(unit, relativeLocation);
420
+ return addTypeInformation([propertyBindingExpression, unitBindingExpression], complexType, undefined, formatOptions);
401
421
  };
402
422
 
403
423
  _exports.getBindingWithUnitOrCurrency = getBindingWithUnitOrCurrency;
404
424
 
405
- var getBindingWithTimezone = function (oPropertyDataModelPath, propertyBindingExpression, ignoreUnitConstraint) {
406
- var _oPropertyDefinition$9, _oPropertyDefinition$10;
425
+ var getBindingForUnitOrCurrency = function (oPropertyDataModelPath) {
426
+ var _oPropertyDefinition$9, _oPropertyDefinition$10, _unit2, _oPropertyDefinition$11, _oPropertyDefinition$12;
407
427
 
408
428
  var oPropertyDefinition = oPropertyDataModelPath.targetObject;
409
- var timezone = (_oPropertyDefinition$9 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$9 === void 0 ? void 0 : (_oPropertyDefinition$10 = _oPropertyDefinition$9.Common) === null || _oPropertyDefinition$10 === void 0 ? void 0 : _oPropertyDefinition$10.Timezone;
429
+ var unit = (_oPropertyDefinition$9 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$9 === void 0 ? void 0 : (_oPropertyDefinition$10 = _oPropertyDefinition$9.Measures) === null || _oPropertyDefinition$10 === void 0 ? void 0 : _oPropertyDefinition$10.Unit;
430
+
431
+ if (((_unit2 = unit) === null || _unit2 === void 0 ? void 0 : _unit2.toString()) === "%") {
432
+ return constant("%");
433
+ }
434
+
435
+ var relativeLocation = getPathRelativeLocation(oPropertyDataModelPath.contextLocation, oPropertyDataModelPath.navigationProperties).map(function (np) {
436
+ return np.name;
437
+ });
438
+ var complexType = unit ? "sap.ui.model.odata.type.Unit" : "sap.ui.model.odata.type.Currency";
439
+ unit = unit ? unit : (_oPropertyDefinition$11 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$11 === void 0 ? void 0 : (_oPropertyDefinition$12 = _oPropertyDefinition$11.Measures) === null || _oPropertyDefinition$12 === void 0 ? void 0 : _oPropertyDefinition$12.ISOCurrency;
440
+ var unitBindingExpression = unit.$target ? formatWithTypeInformation(unit.$target, getExpressionFromAnnotation(unit, relativeLocation)) : getExpressionFromAnnotation(unit, relativeLocation);
441
+ var propertyBindingExpression = pathInModel(getContextRelativeTargetObjectPath(oPropertyDataModelPath));
442
+ propertyBindingExpression = formatWithTypeInformation(oPropertyDefinition, propertyBindingExpression, true);
443
+ return addTypeInformation([propertyBindingExpression, unitBindingExpression], complexType, undefined, {
444
+ parseKeepsEmptyString: true,
445
+ emptyString: "",
446
+ showNumber: false
447
+ });
448
+ };
449
+
450
+ _exports.getBindingForUnitOrCurrency = getBindingForUnitOrCurrency;
451
+
452
+ var getBindingWithTimezone = function (oPropertyDataModelPath, propertyBindingExpression, ignoreUnitConstraint, hideTimezoneForEmptyValues) {
453
+ var _oPropertyDefinition$13, _oPropertyDefinition$14;
454
+
455
+ var oPropertyDefinition = oPropertyDataModelPath.targetObject;
456
+ var timezone = (_oPropertyDefinition$13 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$13 === void 0 ? void 0 : (_oPropertyDefinition$14 = _oPropertyDefinition$13.Common) === null || _oPropertyDefinition$14 === void 0 ? void 0 : _oPropertyDefinition$14.Timezone;
410
457
  var relativeLocation = getPathRelativeLocation(oPropertyDataModelPath.contextLocation, oPropertyDataModelPath.navigationProperties).map(function (np) {
411
458
  return np.name;
412
459
  });
413
460
  propertyBindingExpression = formatWithTypeInformation(oPropertyDefinition, propertyBindingExpression);
414
- var complexType = "sap.ui.model.odata.type.DateTimeWithTimezone";
415
- var unitBindingExpression = timezone.$target ? formatWithTypeInformation(timezone.$target, annotationExpression(timezone, relativeLocation), ignoreUnitConstraint) : annotationExpression(timezone, relativeLocation);
416
- return addTypeInformation([propertyBindingExpression, unitBindingExpression], complexType);
461
+ var complexType = "sap.fe.core.type.DateTimeWithTimezone";
462
+ var unitBindingExpression = timezone.$target ? formatWithTypeInformation(timezone.$target, getExpressionFromAnnotation(timezone, relativeLocation), ignoreUnitConstraint) : getExpressionFromAnnotation(timezone, relativeLocation);
463
+ var formatOptions;
464
+
465
+ if (hideTimezoneForEmptyValues) {
466
+ formatOptions = {
467
+ showTimezoneForEmptyValues: false
468
+ };
469
+ }
470
+
471
+ return addTypeInformation([propertyBindingExpression, unitBindingExpression], complexType, undefined, formatOptions);
417
472
  };
418
473
 
419
474
  _exports.getBindingWithTimezone = getBindingWithTimezone;
@@ -421,14 +476,14 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
421
476
  var getAlignmentExpression = function (oComputedEditMode) {
422
477
  var sAlignDisplay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "Begin";
423
478
  var sAlignEdit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "Begin";
424
- return compileBinding(ifElse(equal(oComputedEditMode, "Display"), sAlignDisplay, sAlignEdit));
479
+ return compileExpression(ifElse(equal(oComputedEditMode, "Display"), sAlignDisplay, sAlignEdit));
425
480
  };
426
481
  /**
427
482
  * Formatter helper to retrieve the converterContext from the metamodel context.
428
483
  *
429
- * @param {Context} oContext The original metamodel context
430
- * @param {ComputedAnnotationInterface} oInterface The current templating context
431
- * @returns {object} The ConverterContext representing that object
484
+ * @param oContext The original metamodel context
485
+ * @param oInterface The current templating context
486
+ * @returns The ConverterContext representing that object
432
487
  */
433
488
 
434
489
 
@@ -446,9 +501,9 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
446
501
  /**
447
502
  * Formatter helper to retrieve the data model objects that are involved from the metamodel context.
448
503
  *
449
- * @param {Context} oContext The original ODataMetaModel context
450
- * @param {ComputedAnnotationInterface} oInterface The current templating context
451
- * @returns {object[]} An array of entitysets and navproperties that are involved to get to a specific object in the metamodel
504
+ * @param oContext The original ODataMetaModel context
505
+ * @param oInterface The current templating context
506
+ * @returns An array of entitysets and navproperties that are involved to get to a specific object in the metamodel
452
507
  */
453
508
 
454
509
  _exports.getConverterContext = getConverterContext;
@@ -462,21 +517,8 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
462
517
  };
463
518
 
464
519
  getDataModelObjectPath.requiresIContext = true;
465
- /**
466
- * Retrieves the expressionBinding created out of a binding expression.
467
- *
468
- * @param {Expression<any>} expression The expression which needs to be compiled
469
- * @returns {BindingExpression<string>} The expression-binding string
470
- */
471
-
472
520
  _exports.getDataModelObjectPath = getDataModelObjectPath;
473
521
 
474
- var getExpressionBinding = function (expression) {
475
- return compileBinding(expression);
476
- };
477
-
478
- _exports.getExpressionBinding = getExpressionBinding;
479
-
480
522
  var isCollectionField = function (oDataModelPath) {
481
523
  var _oDataModelPath$navig;
482
524
 
@@ -510,31 +552,54 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
510
552
 
511
553
  _exports.isCollectionField = isCollectionField;
512
554
 
555
+ var getRequiredExpressionAsObject = function (oPropertyPath, oDataFieldConverted) {
556
+ var forceEditMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
557
+ return getRequiredExpression(oPropertyPath, oDataFieldConverted, forceEditMode, true);
558
+ };
559
+
560
+ _exports.getRequiredExpressionAsObject = getRequiredExpressionAsObject;
561
+
513
562
  var getRequiredExpression = function (oPropertyPath, oDataFieldConverted) {
514
563
  var forceEditMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
515
564
  var bAsObject = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
565
+ var oRequiredProperties = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
566
+ var returnExpression;
567
+ var aRequiredPropertiesFromInsertRestrictions = oRequiredProperties.requiredPropertiesFromInsertRestrictions || [];
568
+ var aRequiredPropertiesFromUpdateRestrictions = oRequiredProperties.requiredPropertiesFromUpdateRestrictions || [];
516
569
 
517
570
  if (!oPropertyPath || typeof oPropertyPath === "string") {
518
- return compileBinding(false);
519
- }
571
+ returnExpression = constant(false);
572
+ } else {
573
+ var dataFieldRequiredExpression = constant(true);
520
574
 
521
- var dataFieldRequiredExpression = true;
575
+ if (oDataFieldConverted !== null) {
576
+ dataFieldRequiredExpression = isRequiredExpression(oDataFieldConverted);
577
+ }
522
578
 
523
- if (oDataFieldConverted !== null) {
524
- dataFieldRequiredExpression = isRequiredExpression(oDataFieldConverted);
525
- }
579
+ var requiredPropertyFromInsertRestrictionsExpression = constant(false);
580
+ var requiredPropertyFromUpdateRestrictionsExpression = constant(false);
581
+ var oProperty = isPathExpression(oPropertyPath) && oPropertyPath.$target || oPropertyPath; // Enablement depends on the field control expression
582
+ // If the Field control is statically in Inapplicable (disabled) -> not enabled
526
583
 
527
- var oProperty = isPathExpression(oPropertyPath) && oPropertyPath.$target || oPropertyPath; // Enablement depends on the field control expression
528
- // If the Field control is statically in Inapplicable (disabled) -> not enabled
584
+ var requiredExpression = isRequiredExpression(oProperty);
585
+ var editMode = forceEditMode || UI.IsEditable;
586
+
587
+ if (aRequiredPropertiesFromInsertRestrictions.length && aRequiredPropertiesFromInsertRestrictions.includes(oPropertyPath.name)) {
588
+ requiredPropertyFromInsertRestrictionsExpression = and(constant(true), UI.IsCreateMode);
589
+ }
529
590
 
530
- var requiredExpression = isRequiredExpression(oProperty);
531
- var editMode = forceEditMode || UI.IsEditable;
591
+ if (aRequiredPropertiesFromUpdateRestrictions.length && aRequiredPropertiesFromUpdateRestrictions.includes(oPropertyPath.name)) {
592
+ requiredPropertyFromUpdateRestrictionsExpression = and(constant(true), notEqual(UI.IsCreateMode, true));
593
+ }
594
+
595
+ returnExpression = or(and(or(requiredExpression, dataFieldRequiredExpression), editMode), requiredPropertyFromInsertRestrictionsExpression, requiredPropertyFromUpdateRestrictionsExpression);
596
+ }
532
597
 
533
598
  if (bAsObject) {
534
- return and(or(requiredExpression, dataFieldRequiredExpression), editMode);
599
+ return returnExpression;
535
600
  }
536
601
 
537
- return compileBinding(and(or(requiredExpression, dataFieldRequiredExpression), editMode));
602
+ return compileExpression(returnExpression);
538
603
  };
539
604
 
540
605
  _exports.getRequiredExpression = getRequiredExpression;
@@ -587,15 +652,16 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
587
652
  }
588
653
 
589
654
  break;
655
+ // no default
590
656
  }
591
657
 
592
- isRequiredExpressions.push(getRequiredExpression(propertyPath, dataField, false, true));
658
+ isRequiredExpressions.push(getRequiredExpressionAsObject(propertyPath, dataField, false));
593
659
  }
594
660
 
595
- return compileBinding(or.apply(void 0, _toConsumableArray(isRequiredExpressions)));
661
+ return compileExpression(or.apply(void 0, _toConsumableArray(isRequiredExpressions)));
596
662
  };
597
663
 
598
664
  _exports.getRequiredExpressionForConnectedDataField = getRequiredExpressionForConnectedDataField;
599
665
  return _exports;
600
666
  }, false);
601
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJRm9ybWF0dGVycy50cyJdLCJuYW1lcyI6WyJFRE1fVFlQRV9NQVBQSU5HIiwiRGlzcGxheU1vZGVGb3JtYXR0ZXIiLCJnZXREaXNwbGF5TW9kZSIsIm9EYXRhTW9kZWxPYmplY3RQYXRoIiwidGFyZ2V0T2JqZWN0IiwiZ2V0RWRpdGFibGVFeHByZXNzaW9uIiwib1Byb3BlcnR5UGF0aCIsIm9EYXRhRmllbGRDb252ZXJ0ZWQiLCJiQXNPYmplY3QiLCJpc0VkaXRhYmxlIiwiVUkiLCJJc0VkaXRhYmxlIiwiY29tcGlsZUJpbmRpbmciLCJkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb24iLCJpZkVsc2UiLCJpc05vbkVkaXRhYmxlRXhwcmVzc2lvbiIsIm9Qcm9wZXJ0eSIsImlzUGF0aEV4cHJlc3Npb24iLCIkdGFyZ2V0IiwiaXNQYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiIsImlzUGF0aFVwZGF0YWJsZSIsInByb3BlcnR5UGF0aCIsInBhdGhWaXNpdG9yIiwicGF0aCIsIm5hdmlnYXRpb25QYXRocyIsInNpbmdsZXRvblBhdGhWaXNpdG9yIiwiY29udmVydGVkVHlwZXMiLCJlZGl0YWJsZUV4cHJlc3Npb24iLCJvciIsIm5vdCIsImlzQ29tcHV0ZWQiLCJpc0tleSIsImlzSW1tdXRhYmxlIiwiSXNUcmFuc2llbnRCaW5kaW5nIiwiYW5kIiwiZ2V0Q29sbGFib3JhdGlvbkV4cHJlc3Npb24iLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiZm9ybWF0dGVyIiwib2JqZWN0UGF0aCIsImdldFRhcmdldE9iamVjdFBhdGgiLCJhY3Rpdml0eUV4cHJlc3Npb24iLCJiaW5kaW5nRXhwcmVzc2lvbiIsImtleXMiLCJ0YXJnZXRFbnRpdHlUeXBlIiwia2V5c0V4cHJlc3Npb25zIiwiZm9yRWFjaCIsImtleSIsImtleUV4cHJlc3Npb24iLCJuYW1lIiwicHVzaCIsImZvcm1hdFJlc3VsdCIsImdldEVuYWJsZWRFeHByZXNzaW9uIiwiZGF0YUZpZWxkRW5hYmxlZEV4cHJlc3Npb24iLCJpc0Rpc2FibGVkRXhwcmVzc2lvbiIsImVuYWJsZWRFeHByZXNzaW9uIiwiZ2V0RWRpdE1vZGUiLCJiTWVhc3VyZVJlYWRPbmx5IiwiYXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsInVuaXRQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJyZXN1bHRFeHByZXNzaW9uIiwiaXNSZWFkT25seUV4cHJlc3Npb24iLCJyZWFkT25seUV4cHJlc3Npb24iLCJlZGl0TW9kZUV4cHJlc3Npb24iLCJpc0NvbnN0YW50IiwiaGFzVmFsaWRBbmFseXRpY2FsQ3VycmVuY3lPclVuaXQiLCJvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwib1Byb3BlcnR5RGVmaW5pdGlvbiIsImN1cnJlbmN5IiwiYW5ub3RhdGlvbnMiLCJNZWFzdXJlcyIsIklTT0N1cnJlbmN5IiwibWVhc3VyZSIsIlVuaXQiLCJpc1RydXRoeSIsImFubm90YXRpb25FeHByZXNzaW9uIiwiSXNUb3RhbCIsImNvbnN0YW50IiwiaWZVbml0RWRpdGFibGUiLCJzRWRpdGFibGVWYWx1ZSIsInNOb25FZGl0YWJsZVZhbHVlIiwiZ2V0RmllbGREaXNwbGF5Iiwic1RhcmdldERpc3BsYXlNb2RlIiwib0NvbXB1dGVkRWRpdE1vZGUiLCJoYXNWYWx1ZUhlbHAiLCJlcXVhbCIsImZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24iLCJwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uIiwiaWdub3JlQ29uc3RyYWludHMiLCJvdXRFeHByZXNzaW9uIiwiX3R5cGUiLCJvVGFyZ2V0TWFwcGluZyIsInR5cGUiLCJjb25zdHJhaW50cyIsIiRTY2FsZSIsInNjYWxlIiwidW5kZWZpbmVkIiwiJFByZWNpc2lvbiIsInByZWNpc2lvbiIsIiRNYXhMZW5ndGgiLCJtYXhMZW5ndGgiLCIkTnVsbGFibGUiLCJudWxsYWJsZSIsIlZhbGlkYXRpb24iLCJNaW5pbXVtIiwiaXNOYU4iLCJtaW5pbXVtIiwiTWF4aW11bSIsIm1heGltdW0iLCJpbmRleE9mIiwiZm9ybWF0T3B0aW9ucyIsIk9iamVjdCIsImFzc2lnbiIsInBhcnNlQXNTdHJpbmciLCJlbXB0eVN0cmluZyIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsIkNvbW1vbiIsIklzRGlnaXRTZXF1ZW5jZSIsImlzRGlnaXRTZXF1ZW5jZSIsIlY0IiwiZ2V0VHlwZUNvbmZpZyIsImRhdGFUeXBlIiwicHJvcGVydHlUeXBlQ29uZmlnIiwiaXNQcm9wZXJ0eSIsIiRWNCIsImdldEJpbmRpbmdXaXRoVW5pdE9yQ3VycmVuY3kiLCJvUHJvcGVydHlEYXRhTW9kZWxQYXRoIiwiaWdub3JlVW5pdENvbnN0cmFpbnQiLCJ1bml0IiwicmVsYXRpdmVMb2NhdGlvbiIsImdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uIiwiY29udGV4dExvY2F0aW9uIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJtYXAiLCJucCIsInRvU3RyaW5nIiwidmFsdWVGb3JtYXR0ZXJzIiwiZm9ybWF0V2l0aFBlcmNlbnRhZ2UiLCJjb21wbGV4VHlwZSIsInVuaXRCaW5kaW5nRXhwcmVzc2lvbiIsImFkZFR5cGVJbmZvcm1hdGlvbiIsImdldEJpbmRpbmdXaXRoVGltZXpvbmUiLCJ0aW1lem9uZSIsIlRpbWV6b25lIiwiZ2V0QWxpZ25tZW50RXhwcmVzc2lvbiIsInNBbGlnbkRpc3BsYXkiLCJzQWxpZ25FZGl0IiwiZ2V0Q29udmVydGVyQ29udGV4dCIsIm9Db250ZXh0Iiwib0ludGVyZmFjZSIsImNvbnRleHQiLCJjb252ZXJ0TWV0YU1vZGVsQ29udGV4dCIsInJlcXVpcmVzSUNvbnRleHQiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0RXhwcmVzc2lvbkJpbmRpbmciLCJleHByZXNzaW9uIiwiaXNDb2xsZWN0aW9uRmllbGQiLCJvRGF0YU1vZGVsUGF0aCIsImxlbmd0aCIsImhhc09uZVRvTWFueU5hdmlnYXRpb24iLCJmaW5kSW5kZXgiLCJvTmF2IiwiaXNDb2xsZWN0aW9uIiwib0NvbnRleHROYXYiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJmb3JjZUVkaXRNb2RlIiwiZGF0YUZpZWxkUmVxdWlyZWRFeHByZXNzaW9uIiwiaXNSZXF1aXJlZEV4cHJlc3Npb24iLCJyZXF1aXJlZEV4cHJlc3Npb24iLCJlZGl0TW9kZSIsImdldFJlcXVpcmVkRXhwcmVzc2lvbkZvckNvbm5lY3RlZERhdGFGaWVsZCIsImRhdGFGaWVsZE9iamVjdFBhdGgiLCJkYXRhIiwiRGF0YSIsImRhdGFGaWVsZHMiLCJpc1JlcXVpcmVkRXhwcmVzc2lvbnMiLCJkYXRhRmllbGQiLCIkVHlwZSIsIlZhbHVlIiwiVGFyZ2V0Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9ETyxNQUFNQSxnQkFBZ0IsR0FBR0Msb0JBQW9CLENBQUNELGdCQUE5Qzs7O0FBbUNBLE1BQU1FLGNBQWMsR0FBRyxVQUFVQyxvQkFBVixFQUFrRTtBQUMvRixXQUFPRixvQkFBb0IsQ0FBQ0MsY0FBckIsQ0FBb0NDLG9CQUFvQixDQUFDQyxZQUF6RCxFQUF1RUQsb0JBQXZFLENBQVA7QUFDQSxHQUZNO0FBSVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sTUFBTUUscUJBQXFCLEdBQUcsVUFDcENDLGFBRG9DLEVBTTBCO0FBQUEsUUFKOURDLG1CQUk4RCx1RUFKbkMsSUFJbUM7QUFBQSxRQUg5REosb0JBRzhEO0FBQUEsUUFGOURLLFNBRThELHVFQUZ6QyxLQUV5QztBQUFBLFFBRDlEQyxVQUM4RCx1RUFEakJDLEVBQUUsQ0FBQ0MsVUFDYzs7QUFDOUQsUUFBSSxDQUFDTCxhQUFELElBQWtCLE9BQU9BLGFBQVAsS0FBeUIsUUFBL0MsRUFBeUQ7QUFDeEQsYUFBT00sY0FBYyxDQUFDLEtBQUQsQ0FBckI7QUFDQTs7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RCxTQUFTLENBQUNHLE1BQVYsQ0FBaUJuSyxPQUFqQixDQUF5QmlLLEtBQXpCLCtDQUZELEVBR0U7QUFDRCxrQkFBSSxPQUFPRCxTQUFTLENBQUNHLE1BQVYsQ0FBaUJuSyxPQUFqQixDQUF5QmtLLEtBQWhDLEtBQTBDLFFBQTlDLEVBQXdEO0FBQ3ZEL0osZ0JBQUFBLFlBQVksR0FBRzZKLFNBQVMsQ0FBQ0csTUFBVixDQUFpQm5LLE9BQWpCLENBQXlCa0ssS0FBekIsQ0FBK0JsSyxPQUE5QztBQUNBO0FBQ0QsYUFQRCxNQU9PO0FBQ04sa0JBQUksT0FBT2dLLFNBQVMsQ0FBQ0csTUFBakIsS0FBNEIsUUFBaEMsRUFBMEM7QUFDekNoSyxnQkFBQUEsWUFBWSxHQUFHNkosU0FBUyxDQUFDRyxNQUFWLENBQWlCbkssT0FBaEM7QUFDQTs7QUFDRDtBQUNBO0FBQ0Q7O0FBQ0Q7QUExQkY7O0FBNEJBK0osTUFBQUEscUJBQXFCLENBQUNoSSxJQUF0QixDQUEyQnFILHFCQUFxQixDQUFDakosWUFBRCxFQUFlNkosU0FBZixFQUEwQixLQUExQixFQUFpQyxJQUFqQyxDQUFoRDtBQUNBOztBQUNELFdBQU90SyxjQUFjLENBQUNnQixFQUFFLE1BQUYsNEJBQU9xSixxQkFBUCxFQUFELENBQXJCO0FBQ0EsR0EzQ00iLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlclwiO1xuaW1wb3J0IHsgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgUGF0aEFubm90YXRpb25FeHByZXNzaW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3R5cGVzL0VkbVwiO1xuaW1wb3J0IHsgVUlBbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdHlwZXMvZ2VuZXJhdGVkL1VJXCI7XG5pbXBvcnQgeyBzaW5nbGV0b25QYXRoVmlzaXRvciwgVUkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0JpbmRpbmdIZWxwZXJcIjtcbmltcG9ydCB7IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0LCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB2YWx1ZUZvcm1hdHRlcnMgZnJvbSBcInNhcC9mZS9jb3JlL2Zvcm1hdHRlcnMvVmFsdWVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7XG5cdGFkZFR5cGVJbmZvcm1hdGlvbixcblx0YW5kLFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0YmluZGluZ0V4cHJlc3Npb24sXG5cdEJpbmRpbmdFeHByZXNzaW9uLFxuXHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb24sXG5cdGNvbXBpbGVCaW5kaW5nLFxuXHRjb25zdGFudCxcblx0ZXF1YWwsXG5cdEV4cHJlc3Npb24sXG5cdEV4cHJlc3Npb25PclByaW1pdGl2ZSxcblx0Zm9ybWF0UmVzdWx0LFxuXHRpZkVsc2UsXG5cdGlzQ29uc3RhbnQsXG5cdGlzVHJ1dGh5LFxuXHRub3QsXG5cdG9yXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQge1xuXHREYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRnZXRQYXRoUmVsYXRpdmVMb2NhdGlvbixcblx0Z2V0VGFyZ2V0T2JqZWN0UGF0aCxcblx0aXNQYXRoVXBkYXRhYmxlXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCAqIGFzIERpc3BsYXlNb2RlRm9ybWF0dGVyIGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQge1xuXHRpc0Rpc2FibGVkRXhwcmVzc2lvbixcblx0aXNOb25FZGl0YWJsZUV4cHJlc3Npb24sXG5cdGlzUmVhZE9ubHlFeHByZXNzaW9uLFxuXHRpc1JlcXVpcmVkRXhwcmVzc2lvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9GaWVsZENvbnRyb2xIZWxwZXJcIjtcbmltcG9ydCB7XG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5LFxuXHRoYXNWYWx1ZUhlbHAsXG5cdGlzQ29tcHV0ZWQsXG5cdGlzSW1tdXRhYmxlLFxuXHRpc0tleSxcblx0aXNQYXRoRXhwcmVzc2lvbixcblx0aXNQcm9wZXJ0eVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5cbi8vIEltcG9ydC1leHBvcnQgbWV0aG9kIHVzZWQgYnkgdGhlIGNvbnZlcnRlciB0byB1c2UgdGhlbSBpbiB0aGUgdGVtcGxhdGluZyB0aHJvdWdoIHRoZSBVSUZvcm1hdHRlcnMuXG5leHBvcnQgdHlwZSBEaXNwbGF5TW9kZSA9IERpc3BsYXlNb2RlRm9ybWF0dGVyLkRpc3BsYXlNb2RlO1xuXG5leHBvcnQgY29uc3QgRURNX1RZUEVfTUFQUElORyA9IERpc3BsYXlNb2RlRm9ybWF0dGVyLkVETV9UWVBFX01BUFBJTkc7XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5T3JQYXRoPFA+ID0gc3RyaW5nIHwgUCB8IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPjtcbmV4cG9ydCB0eXBlIE1ldGFNb2RlbENvbnRleHQgPSB7XG5cdCRraW5kOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlID0ge1xuXHRjb250ZXh0OiBDb250ZXh0O1xuXHRhcmd1bWVudHM/OiBhbnlbXTtcblx0JCR2YWx1ZUFzUHJvbWlzZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlQ29uc3RyYWludHMgPSB7XG5cdHNjYWxlPzogbnVtYmVyO1xuXHRwcmVjaXNpb24/OiBudW1iZXI7XG5cdG1heExlbmd0aD86IG51bWJlcjtcblx0bnVsbGFibGU/OiBib29sZWFuO1xuXHRtaW5pbXVtPzogc3RyaW5nO1xuXHRtYXhpbXVtPzogc3RyaW5nO1xuXHRpc0RpZ2l0U2VxdWVuY2U/OiBib29sZWFuO1xuXHRWND86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlZm9ybWF0T3B0aW9ucyA9IHtcblx0cGFyc2VBc1N0cmluZz86IGJvb2xlYW47XG5cdGVtcHR5U3RyaW5nPzogc3RyaW5nO1xuXHRwYXJzZUtlZXBzRW1wdHlTdHJpbmc/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZSA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRjb25zdHJhaW50czogY29uZmlnVHlwZUNvbnN0cmFpbnRzO1xuXHRmb3JtYXRPcHRpb25zOiBjb25maWdUeXBlZm9ybWF0T3B0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREaXNwbGF5TW9kZSA9IGZ1bmN0aW9uIChvRGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IERpc3BsYXlNb2RlIHtcblx0cmV0dXJuIERpc3BsYXlNb2RlRm9ybWF0dGVyLmdldERpc3BsYXlNb2RlKG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCwgb0RhdGFNb2RlbE9iamVjdFBhdGgpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24gdG8gZ2VuZXJhdGUgYW4gXCJlZGl0YWJsZVwiIGJvb2xlYW4gdmFsdWUuXG4gKlxuICogQHBhcmFtIHtQcm9wZXJ0eVBhdGh9IG9Qcm9wZXJ0eVBhdGggVGhlIGlucHV0IHByb3BlcnR5XG4gKiBAcGFyYW0ge29iamVjdH0gb0RhdGFGaWVsZENvbnZlcnRlZCBUaGUgRGF0YUZpZWxkQ29udmVydGVkIG9iamVjdCB0byByZWFkIHRoZSBmaWVsZENvbnRyb2wgYW5ub3RhdGlvblxuICogQHBhcmFtIHtEYXRhTW9kZWxPYmplY3RQYXRofSBvRGF0YU1vZGVsT2JqZWN0UGF0aCBUaGUgcGF0aCB0byB0aGlzIHByb3BlcnR5IG9iamVjdFxuICogQHBhcmFtIHtib29sZWFufSBiQXNPYmplY3QgV2hldGhlciBvciBub3QgdGhpcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYW4gb2JqZWN0IG9yIGEgYmluZGluZyBzdHJpbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFZGl0YWJsZSBXaGV0aGVyIG9yIG5vdCBVSS5Jc0VkaXRhYmxlIGJlIGNvbnNpZGVyZWQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYmluZGluZyBleHByZXNzaW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgcHJvcGVydHkgaXMgZWRpdGFibGUgb3Igbm90XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFZGl0YWJsZUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFGaWVsZENvbnZlcnRlZDogYW55ID0gbnVsbCxcblx0b0RhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGJBc09iamVjdDogYm9vbGVhbiA9IGZhbHNlLFxuXHRpc0VkaXRhYmxlOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj4gPSBVSS5Jc0VkaXRhYmxlXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPiB8IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPiB7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhmYWxzZSk7XG5cdH1cblx0bGV0IGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbjogQmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj4gPSB0cnVlO1xuXHRpZiAob0RhdGFGaWVsZENvbnZlcnRlZCAhPT0gbnVsbCkge1xuXHRcdGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbiA9IGlmRWxzZShpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSwgZmFsc2UsIGlzRWRpdGFibGUpO1xuXHR9XG5cblx0Y29uc3Qgb1Byb3BlcnR5OiBQcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHQvLyBFZGl0YWJpbGl0eSBkZXBlbmRzIG9uIHRoZSBmaWVsZCBjb250cm9sIGV4cHJlc3Npb25cblx0Ly8gSWYgdGhlIEZpZWxkIGNvbnRyb2wgaXMgc3RhdGljYWxseSBpbiBSZWFkT25seSBvciBJbmFwcGxpY2FibGUgKGRpc2FibGVkKSAtPiBub3QgZWRpdGFibGVcblx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIGEga2V5IC0+IG5vdCBlZGl0YWJsZSBleGNlcHQgaW4gY3JlYXRpb24gaWYgbm90IGNvbXB1dGVkXG5cdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBjb21wdXRlZCAtPiBub3QgZWRpdGFibGVcblx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIG5vdCB1cGRhdGFibGUgLT4gbm90IGVkaXRhYmxlXG5cdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBpbW11dGFibGUgLT4gbm90IGVkaXRhYmxlIGV4Y2VwdCBpbiBjcmVhdGlvblxuXHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBhIHBhdGggcmVzb2x2aW5nIHRvIFJlYWRPbmx5IG9yIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpICg8PSAxKSAtPiBub3QgZWRpdGFibGVcblx0Ly8gRWxzZSwgdG8gYmUgZWRpdGFibGUgeW91IG5lZWRcblx0Ly8gaW1tdXRhYmxlIGFuZCBrZXkgd2hpbGUgaW4gdGhlIGNyZWF0aW9uIHJvd1xuXHQvLyB1aS9pc0VkaXRhYmxlXG5cdGNvbnN0IGlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24gPSBpc1BhdGhVcGRhdGFibGUob0RhdGFNb2RlbE9iamVjdFBhdGgsIHtcblx0XHRwcm9wZXJ0eVBhdGg6IG9Qcm9wZXJ0eVBhdGgsXG5cdFx0cGF0aFZpc2l0b3I6IChwYXRoOiBzdHJpbmcsIG5hdmlnYXRpb25QYXRoczogc3RyaW5nW10pID0+XG5cdFx0XHRzaW5nbGV0b25QYXRoVmlzaXRvcihwYXRoLCBvRGF0YU1vZGVsT2JqZWN0UGF0aC5jb252ZXJ0ZWRUeXBlcywgbmF2aWdhdGlvblBhdGhzKVxuXHR9KTtcblx0Y29uc3QgZWRpdGFibGVFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdG9yKFxuXHRcdFx0bm90KGlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24pLFxuXHRcdFx0aXNDb21wdXRlZChvUHJvcGVydHkpLFxuXHRcdFx0aXNLZXkob1Byb3BlcnR5KSxcblx0XHRcdGlzSW1tdXRhYmxlKG9Qcm9wZXJ0eSksXG5cdFx0XHRpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvUHJvcGVydHkpXG5cdFx0KSxcblx0XHRpZkVsc2Uob3IoaXNDb21wdXRlZChvUHJvcGVydHkpLCBpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvUHJvcGVydHkpKSwgZmFsc2UsIFVJLklzVHJhbnNpZW50QmluZGluZyksXG5cdFx0aXNFZGl0YWJsZVxuXHQpO1xuXHRpZiAoYkFzT2JqZWN0KSB7XG5cdFx0cmV0dXJuIGFuZChlZGl0YWJsZUV4cHJlc3Npb24sIGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbik7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGFuZChlZGl0YWJsZUV4cHJlc3Npb24sIGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbikpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbGxhYm9yYXRpb25FeHByZXNzaW9uID0gZnVuY3Rpb24gKGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsIGZvcm1hdHRlcjogYW55KTogQmluZGluZ0V4cHJlc3Npb248YW55PiB7XG5cdGNvbnN0IG9iamVjdFBhdGggPSBnZXRUYXJnZXRPYmplY3RQYXRoKGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRjb25zdCBhY3Rpdml0eUV4cHJlc3Npb24gPSBiaW5kaW5nRXhwcmVzc2lvbihcIi9jb2xsYWJvcmF0aW9uL2FjdGl2aXRpZXNcIiArIG9iamVjdFBhdGgsIFwiaW50ZXJuYWxcIik7XG5cdGNvbnN0IGtleXMgPSBkYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRFbnRpdHlUeXBlPy5rZXlzO1xuXHRjb25zdCBrZXlzRXhwcmVzc2lvbnM6IEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxhbnk+W10gPSBbXTtcblx0a2V5cz8uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0Y29uc3Qga2V5RXhwcmVzc2lvbiA9IGJpbmRpbmdFeHByZXNzaW9uKGtleS5uYW1lKSBhcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248YW55Pjtcblx0XHRrZXlzRXhwcmVzc2lvbnMucHVzaChrZXlFeHByZXNzaW9uKTtcblx0fSk7XG5cdHJldHVybiBmb3JtYXRSZXN1bHQoW2FjdGl2aXR5RXhwcmVzc2lvbiwgLi4ua2V5c0V4cHJlc3Npb25zXSwgZm9ybWF0dGVyKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGFuIFwiZW5hYmxlZFwiIGJvb2xlYW4gdmFsdWUuXG4gKlxuICogQHBhcmFtIHtQcm9wZXJ0eVBhdGh9IG9Qcm9wZXJ0eVBhdGggVGhlIGlucHV0IHByb3BlcnR5XG4gKiBAcGFyYW0ge2FueX0gb0RhdGFGaWVsZENvbnZlcnRlZCBUaGUgRGF0YUZpZWxkQ29udmVydGVkIE9iamVjdCB0byByZWFkIHRoZSBmaWVsZENvbnRyb2wgYW5ub3RhdGlvblxuICogQHBhcmFtIHtib29sZWFufSBiQXNPYmplY3QgV2hldGhlciBvciBub3QgdGhpcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYW4gb2JqZWN0IG9yIGEgYmluZGluZyBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdG8gZGV0ZXJtaW5lIGlmIGEgcHJvcGVydHkgaXMgZW5hYmxlZCBvciBub3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVuYWJsZWRFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ/OiBhbnksXG5cdGJBc09iamVjdDogYm9vbGVhbiA9IGZhbHNlXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPiB8IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPiB7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyh0cnVlKTtcblx0fVxuXHRsZXQgZGF0YUZpZWxkRW5hYmxlZEV4cHJlc3Npb246IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+ID0gdHJ1ZTtcblx0aWYgKG9EYXRhRmllbGRDb252ZXJ0ZWQgIT09IG51bGwpIHtcblx0XHRkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbiA9IGlmRWxzZShpc0Rpc2FibGVkRXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSwgZmFsc2UsIHRydWUpO1xuXHR9XG5cblx0Y29uc3Qgb1Byb3BlcnR5OiBQcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHQvLyBFbmFibGVtZW50IGRlcGVuZHMgb24gdGhlIGZpZWxkIGNvbnRyb2wgZXhwcmVzc2lvblxuXHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBzdGF0aWNhbGx5IGluIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpIC0+IG5vdCBlbmFibGVkXG5cdGNvbnN0IGVuYWJsZWRFeHByZXNzaW9uID0gaWZFbHNlKGlzRGlzYWJsZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eSksIGZhbHNlLCB0cnVlKTtcblx0aWYgKGJBc09iamVjdCkge1xuXHRcdHJldHVybiBhbmQoZW5hYmxlZEV4cHJlc3Npb24sIGRhdGFGaWVsZEVuYWJsZWRFeHByZXNzaW9uKTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoYW5kKGVuYWJsZWRFeHByZXNzaW9uLCBkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbikpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24gdG8gZ2VuZXJhdGUgYW4gXCJlZGl0TW9kZVwiIGVudW0gdmFsdWUuXG4gKlxuICogQHBhcmFtIHtQcm9wZXJ0eVBhdGh9IG9Qcm9wZXJ0eVBhdGggVGhlIGlucHV0IHByb3BlcnR5XG4gKiBAcGFyYW0ge0RhdGFNb2RlbE9iamVjdFBhdGh9IG9EYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBsaXN0IG9mIGRhdGEgbW9kZWwgb2JqZWN0cyB0aGF0IGFyZSBpbnZvbHZlZCB0byByZWFjaCB0aGF0IHByb3BlcnR5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJNZWFzdXJlUmVhZE9ubHkgV2hldGhlciB3ZSBzaG91bGQgc2V0IFVvTSAvIGN1cnJlbmN5IGZpZWxkIG1vZGUgdG8gcmVhZCBvbmx5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJBc09iamVjdCBXaGV0aGVyIHdlIHNob3VsZCByZXR1cm4gdGhpcyBhcyBhbiBleHByZXNzaW9uIG9yIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge29iamVjdH0gb0RhdGFGaWVsZENvbnZlcnRlZCBUaGUgZGF0YUZpZWxkIG9iamVjdFxuICogQHBhcmFtIHtib29sZWFufSBpc0VkaXRhYmxlIFdoZXRoZXIgb3Igbm90IFVJLklzRWRpdGFibGUgYmUgY29uc2lkZXJlZC5cbiAqIEByZXR1cm5zIHtCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPHN0cmluZz59IFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHByb3BlcnR5IGVkaXQgbW9kZSwgY29tcGxpYW50IHdpdGggdGhlIE1EQyBGaWVsZCBkZWZpbml0aW9uIG9mIGVkaXRNb2RlLlxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdE1vZGUgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGJNZWFzdXJlUmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcblx0YkFzT2JqZWN0OiBib29sZWFuID0gZmFsc2UsXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSA9IG51bGwsXG5cdGlzRWRpdGFibGU6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPiA9IFVJLklzRWRpdGFibGVcbik6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8c3RyaW5nPiB7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBcIkRpc3BsYXlcIjtcblx0fVxuXHRjb25zdCBvUHJvcGVydHk6IFByb3BlcnR5ID0gKGlzUGF0aEV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgJiYgb1Byb3BlcnR5UGF0aC4kdGFyZ2V0KSB8fCAob1Byb3BlcnR5UGF0aCBhcyBQcm9wZXJ0eSk7XG5cdC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZW5hYmxlZCA9PiBEaXNhYmxlZFxuXHQvLyBpZiB0aGUgcHJvcGVydHkgaXMgZW5hYmxlZCAmJiBub3QgZWRpdGFibGUgPT4gUmVhZE9ubHlcblx0Ly8gaWYgdGhlIHByb3BlcnR5IGlzIGVuYWJsZWQgJiYgZWRpdGFibGUgPT4gRWRpdGFibGVcblx0Ly8gSWYgdGhlcmUgaXMgYW4gYXNzb2NpYXRlZCB1bml0LCBhbmQgaXQgaGFzIGEgZmllbGQgY29udHJvbCBhbHNvIHVzZSBjb25zaWRlciB0aGUgZm9sbG93aW5nXG5cdC8vIGlmIHRoZSB1bml0IGZpZWxkIGNvbnRyb2wgaXMgcmVhZG9ubHkgLT4gRWRpdGFibGVSZWFkT25seVxuXHQvLyBvdGhlcndpc2UgLT4gRWRpdGFibGVcblx0Y29uc3QgZWRpdGFibGVFeHByZXNzaW9uID0gZ2V0RWRpdGFibGVFeHByZXNzaW9uKFxuXHRcdG9Qcm9wZXJ0eVBhdGgsXG5cdFx0b0RhdGFGaWVsZENvbnZlcnRlZCxcblx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHR0cnVlLFxuXHRcdGlzRWRpdGFibGVcblx0KSBhcyBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj47XG5cblx0Y29uc3QgZW5hYmxlZEV4cHJlc3Npb24gPSBnZXRFbmFibGVkRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlKSBhcyBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj47XG5cdGNvbnN0IGFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkob1Byb3BlcnR5KTtcblx0Y29uc3QgdW5pdFByb3BlcnR5ID0gYXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkgfHwgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShvUHJvcGVydHkpO1xuXHRsZXQgcmVzdWx0RXhwcmVzc2lvbjogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPHN0cmluZz4gPSBcIkVkaXRhYmxlXCI7XG5cdGlmICh1bml0UHJvcGVydHkpIHtcblx0XHRyZXN1bHRFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdFx0b3IoaXNSZWFkT25seUV4cHJlc3Npb24odW5pdFByb3BlcnR5KSwgaXNDb21wdXRlZCh1bml0UHJvcGVydHkpLCBiTWVhc3VyZVJlYWRPbmx5KSxcblx0XHRcdFwiRWRpdGFibGVSZWFkT25seVwiLFxuXHRcdFx0XCJFZGl0YWJsZVwiXG5cdFx0KTtcblx0fVxuXHRjb25zdCByZWFkT25seUV4cHJlc3Npb24gPSBvcihpc1JlYWRPbmx5RXhwcmVzc2lvbihvUHJvcGVydHkpLCBpc1JlYWRPbmx5RXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSk7XG5cblx0Ly8gaWYgdGhlIHByb3BlcnR5IGlzIGZyb20gYSBub24tdXBkYXRhYmxlIGVudGl0eSA9PiBSZWFkIG9ubHkgbW9kZSwgcHJldmlvdXNseSBjYWxjdWxhdGVkIGVkaXQgTW9kZSBpcyBpZ25vcmVkXG5cdC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBmcm9tIGFuIHVwZGF0YWJsZSBlbnRpdHkgPT4gcHJldmlvdXNseSBjYWxjdWxhdGVkIGVkaXQgTW9kZSBleHByZXNzaW9uXG5cdGNvbnN0IGVkaXRNb2RlRXhwcmVzc2lvbiA9IGlmRWxzZShcblx0XHRlbmFibGVkRXhwcmVzc2lvbixcblx0XHRpZkVsc2UoXG5cdFx0XHRlZGl0YWJsZUV4cHJlc3Npb24sXG5cdFx0XHRyZXN1bHRFeHByZXNzaW9uLFxuXHRcdFx0aWZFbHNlKGFuZCghaXNDb25zdGFudChyZWFkT25seUV4cHJlc3Npb24pICYmIHJlYWRPbmx5RXhwcmVzc2lvbiwgaXNFZGl0YWJsZSksIFwiUmVhZE9ubHlcIiwgXCJEaXNwbGF5XCIpXG5cdFx0KSxcblx0XHRpZkVsc2UoaXNFZGl0YWJsZSwgXCJEaXNhYmxlZFwiLCBcIkRpc3BsYXlcIilcblx0KTtcblx0aWYgKGJBc09iamVjdCkge1xuXHRcdHJldHVybiBlZGl0TW9kZUV4cHJlc3Npb247XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGVkaXRNb2RlRXhwcmVzc2lvbik7XG59O1xuXG5leHBvcnQgY29uc3QgaGFzVmFsaWRBbmFseXRpY2FsQ3VycmVuY3lPclVuaXQgPSBmdW5jdGlvbiAob1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gb1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHk7XG5cdGNvbnN0IGN1cnJlbmN5ID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5O1xuXHRjb25zdCBtZWFzdXJlID0gY3VycmVuY3kgPyBjdXJyZW5jeSA6IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRpZiAobWVhc3VyZSkge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhvcihpc1RydXRoeShhbm5vdGF0aW9uRXhwcmVzc2lvbihtZWFzdXJlKSBhcyBFeHByZXNzaW9uPHN0cmluZz4pLCBub3QoVUkuSXNUb3RhbCkpKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoY29uc3RhbnQodHJ1ZSkpO1xuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgaWZVbml0RWRpdGFibGUgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0c0VkaXRhYmxlVmFsdWU6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxzdHJpbmc+LFxuXHRzTm9uRWRpdGFibGVWYWx1ZTogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPHN0cmluZz5cbik6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHkgPSAoaXNQYXRoRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSAmJiBvUHJvcGVydHlQYXRoLiR0YXJnZXQpIHx8IChvUHJvcGVydHlQYXRoIGFzIFByb3BlcnR5KTtcblx0Y29uc3QgdW5pdFByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkob1Byb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KG9Qcm9wZXJ0eSk7XG5cdGlmICghdW5pdFByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKHNOb25FZGl0YWJsZVZhbHVlKTtcblx0fVxuXHRjb25zdCBlZGl0YWJsZUV4cHJlc3Npb24gPSBhbmQobm90KGlzUmVhZE9ubHlFeHByZXNzaW9uKHVuaXRQcm9wZXJ0eSkpLCBub3QoaXNDb21wdXRlZCh1bml0UHJvcGVydHkpKSk7XG5cdHJldHVybiBjb21waWxlQmluZGluZyhpZkVsc2UoZWRpdGFibGVFeHByZXNzaW9uLCBzRWRpdGFibGVWYWx1ZSwgc05vbkVkaXRhYmxlVmFsdWUpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWVsZERpc3BsYXkgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0c1RhcmdldERpc3BsYXlNb2RlOiBzdHJpbmcsXG5cdG9Db21wdXRlZEVkaXRNb2RlOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8c3RyaW5nPlxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXG5cdHJldHVybiBoYXNWYWx1ZUhlbHAob1Byb3BlcnR5KVxuXHRcdD8gY29tcGlsZUJpbmRpbmcoc1RhcmdldERpc3BsYXlNb2RlKVxuXHRcdDogY29tcGlsZUJpbmRpbmcoaWZFbHNlKGVxdWFsKG9Db21wdXRlZEVkaXRNb2RlLCBcIkVkaXRhYmxlXCIpLCBcIlZhbHVlXCIsIHNUYXJnZXREaXNwbGF5TW9kZSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24gPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eTogUHJvcGVydHksXG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb246IEV4cHJlc3Npb248c3RyaW5nPixcblx0aWdub3JlQ29uc3RyYWludHM/OiBib29sZWFuXG4pOiBFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvdXRFeHByZXNzaW9uOiBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248YW55PiA9IHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24gYXMgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPGFueT47XG5cdGlmIChvUHJvcGVydHkuX3R5cGUgPT09IFwiUHJvcGVydHlcIikge1xuXHRcdGNvbnN0IG9UYXJnZXRNYXBwaW5nID0gRURNX1RZUEVfTUFQUElOR1sob1Byb3BlcnR5IGFzIFByb3BlcnR5KS50eXBlXTtcblx0XHRpZiAob1RhcmdldE1hcHBpbmcpIHtcblx0XHRcdG91dEV4cHJlc3Npb24udHlwZSA9IG9UYXJnZXRNYXBwaW5nLnR5cGU7XG5cdFx0XHRpZiAob1RhcmdldE1hcHBpbmcuY29uc3RyYWludHMgJiYgIWlnbm9yZUNvbnN0cmFpbnRzKSB7XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMgPSB7fTtcblx0XHRcdFx0aWYgKG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzLiRTY2FsZSAmJiBvUHJvcGVydHkuc2NhbGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMuc2NhbGUgPSBvUHJvcGVydHkuc2NhbGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzLiRQcmVjaXNpb24gJiYgb1Byb3BlcnR5LnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5wcmVjaXNpb24gPSBvUHJvcGVydHkucHJlY2lzaW9uO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cy4kTWF4TGVuZ3RoICYmIG9Qcm9wZXJ0eS5tYXhMZW5ndGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMubWF4TGVuZ3RoID0gb1Byb3BlcnR5Lm1heExlbmd0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob1RhcmdldE1hcHBpbmcuY29uc3RyYWludHMuJE51bGxhYmxlICYmIG9Qcm9wZXJ0eS5udWxsYWJsZSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHRvdXRFeHByZXNzaW9uLmNvbnN0cmFpbnRzLm51bGxhYmxlID0gb1Byb3BlcnR5Lm51bGxhYmxlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50c1tcIkBPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NaW5pbXVtLyREZWNpbWFsXCJdICYmXG5cdFx0XHRcdFx0b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zLlZhbGlkYXRpb24uTWluaW11bSlcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5taW5pbXVtID0gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zLlZhbGlkYXRpb24uTWluaW11bX1gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50c1tcIkBPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NYXhpbXVtLyREZWNpbWFsXCJdICYmXG5cdFx0XHRcdFx0b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zLlZhbGlkYXRpb24uTWF4aW11bSlcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5tYXhpbXVtID0gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zLlZhbGlkYXRpb24uTWF4aW11bX1gO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0RXhwcmVzc2lvbj8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCkge1xuXHRcdFx0XHRpZiAoIW91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zLCB7XG5cdFx0XHRcdFx0cGFyc2VBc1N0cmluZzogZmFsc2UsXG5cdFx0XHRcdFx0ZW1wdHlTdHJpbmc6IFwiXCJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0RXhwcmVzc2lvbi50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiKSB7XG5cdFx0XHRcdGlmICghb3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zID0ge307XG5cdFx0XHRcdH1cblx0XHRcdFx0b3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zLnBhcnNlS2VlcHNFbXB0eVN0cmluZyA9IHRydWU7XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGlnaXRTZXF1ZW5jZVwiXSAmJlxuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5Jc0RpZ2l0U2VxdWVuY2Vcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5pc0RpZ2l0U2VxdWVuY2UgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0RXhwcmVzc2lvbj8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMCkge1xuXHRcdFx0XHRpZiAoIW91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zLCB7XG5cdFx0XHRcdFx0cGFyc2VBc1N0cmluZzogZmFsc2UsXG5cdFx0XHRcdFx0ZW1wdHlTdHJpbmc6IFwiXCJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0RXhwcmVzc2lvbj8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRhdGVUaW1lT2Zmc2V0XCIpID09PSAwKSB7XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMuVjQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gb3V0RXhwcmVzc2lvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUeXBlQ29uZmlnID0gZnVuY3Rpb24gKG9Qcm9wZXJ0eTogUHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLCBkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYW55IHtcblx0Y29uc3Qgb1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWyhvUHJvcGVydHkgYXMgUHJvcGVydHkpPy50eXBlXSB8fCAoZGF0YVR5cGUgPyBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXSA6IHVuZGVmaW5lZCk7XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZzogY29uZmlnVHlwZSA9IHtcblx0XHR0eXBlOiBvVGFyZ2V0TWFwcGluZy50eXBlLFxuXHRcdGNvbnN0cmFpbnRzOiB7fSxcblx0XHRmb3JtYXRPcHRpb25zOiB7fVxuXHR9O1xuXHRpZiAoaXNQcm9wZXJ0eShvUHJvcGVydHkpKSB7XG5cdFx0cHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzID0ge1xuXHRcdFx0c2NhbGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kU2NhbGUgPyBvUHJvcGVydHkuc2NhbGUgOiB1bmRlZmluZWQsXG5cdFx0XHRwcmVjaXNpb246IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kUHJlY2lzaW9uID8gb1Byb3BlcnR5LnByZWNpc2lvbiA6IHVuZGVmaW5lZCxcblx0XHRcdG1heExlbmd0aDogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRNYXhMZW5ndGggPyBvUHJvcGVydHkubWF4TGVuZ3RoIDogdW5kZWZpbmVkLFxuXHRcdFx0bnVsbGFibGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kTnVsbGFibGUgPyBvUHJvcGVydHkubnVsbGFibGUgOiB1bmRlZmluZWQsXG5cdFx0XHRtaW5pbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1pbmltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRtYXhpbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heGltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRpc0RpZ2l0U2VxdWVuY2U6XG5cdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiICYmXG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGlnaXRTZXF1ZW5jZVwiXSAmJlxuXHRcdFx0XHQob1Byb3BlcnR5IGFzIFByb3BlcnR5KS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5Jc0RpZ2l0U2VxdWVuY2Vcblx0XHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdFY0OiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJFY0ID8gdHJ1ZSA6IHVuZGVmaW5lZFxuXHRcdH07XG5cdH1cblx0cHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0cGFyc2VBc1N0cmluZzpcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCB8fFxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRG91YmxlXCIpID09PSAwXG5cdFx0XHRcdD8gZmFsc2Vcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0ZW1wdHlTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nOiBwcm9wZXJ0eVR5cGVDb25maWcudHlwZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIiA/IHRydWUgOiB1bmRlZmluZWRcblx0fTtcblx0cmV0dXJuIHByb3BlcnR5VHlwZUNvbmZpZztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nV2l0aFVuaXRPckN1cnJlbmN5ID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBFeHByZXNzaW9uPHN0cmluZz4sXG5cdGlnbm9yZVVuaXRDb25zdHJhaW50PzogYm9vbGVhblxuKTogRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3Qgb1Byb3BlcnR5RGVmaW5pdGlvbiA9IG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5O1xuXHRsZXQgdW5pdCA9IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRjb25zdCByZWxhdGl2ZUxvY2F0aW9uID0gZ2V0UGF0aFJlbGF0aXZlTG9jYXRpb24oXG5cdFx0b1Byb3BlcnR5RGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb24sXG5cdFx0b1Byb3BlcnR5RGF0YU1vZGVsUGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllc1xuXHQpLm1hcCgobnApID0+IG5wLm5hbWUpO1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uID0gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihvUHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uKTtcblx0aWYgKHVuaXQ/LnRvU3RyaW5nKCkgPT09IFwiJVwiKSB7XG5cdFx0cmV0dXJuIGZvcm1hdFJlc3VsdChbcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbl0sIHZhbHVlRm9ybWF0dGVycy5mb3JtYXRXaXRoUGVyY2VudGFnZSk7XG5cdH1cblx0Y29uc3QgY29tcGxleFR5cGUgPSB1bml0ID8gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Vbml0XCIgOiBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkN1cnJlbmN5XCI7XG5cdHVuaXQgPSB1bml0ID8gdW5pdCA6IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeTtcblx0Y29uc3QgdW5pdEJpbmRpbmdFeHByZXNzaW9uID0gKHVuaXQgYXMgYW55KS4kdGFyZ2V0XG5cdFx0PyBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKFxuXHRcdFx0XHQodW5pdCBhcyBhbnkpLiR0YXJnZXQsXG5cdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKHVuaXQsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEV4cHJlc3Npb248c3RyaW5nPixcblx0XHRcdFx0aWdub3JlVW5pdENvbnN0cmFpbnRcblx0XHQgIClcblx0XHQ6IChhbm5vdGF0aW9uRXhwcmVzc2lvbih1bml0LCByZWxhdGl2ZUxvY2F0aW9uKSBhcyBFeHByZXNzaW9uPHN0cmluZz4pO1xuXG5cdHJldHVybiBhZGRUeXBlSW5mb3JtYXRpb24oW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIHVuaXRCaW5kaW5nRXhwcmVzc2lvbl0sIGNvbXBsZXhUeXBlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nV2l0aFRpbWV6b25lID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBFeHByZXNzaW9uPHN0cmluZz4sXG5cdGlnbm9yZVVuaXRDb25zdHJhaW50PzogYm9vbGVhblxuKTogRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3Qgb1Byb3BlcnR5RGVmaW5pdGlvbiA9IG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5O1xuXHRjb25zdCB0aW1lem9uZSA9IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGltZXpvbmU7XG5cdGNvbnN0IHJlbGF0aXZlTG9jYXRpb24gPSBnZXRQYXRoUmVsYXRpdmVMb2NhdGlvbihcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbixcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzXG5cdCkubWFwKChucCkgPT4gbnAubmFtZSk7XG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24gPSBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKG9Qcm9wZXJ0eURlZmluaXRpb24sIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24pO1xuXG5cdGNvbnN0IGNvbXBsZXhUeXBlID0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5EYXRlVGltZVdpdGhUaW1lem9uZVwiO1xuXHRjb25zdCB1bml0QmluZGluZ0V4cHJlc3Npb24gPSAodGltZXpvbmUgYXMgYW55KS4kdGFyZ2V0XG5cdFx0PyBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKFxuXHRcdFx0XHQodGltZXpvbmUgYXMgYW55KS4kdGFyZ2V0LFxuXHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbih0aW1lem9uZSwgcmVsYXRpdmVMb2NhdGlvbikgYXMgRXhwcmVzc2lvbjxzdHJpbmc+LFxuXHRcdFx0XHRpZ25vcmVVbml0Q29uc3RyYWludFxuXHRcdCAgKVxuXHRcdDogKGFubm90YXRpb25FeHByZXNzaW9uKHRpbWV6b25lLCByZWxhdGl2ZUxvY2F0aW9uKSBhcyBFeHByZXNzaW9uPHN0cmluZz4pO1xuXG5cdHJldHVybiBhZGRUeXBlSW5mb3JtYXRpb24oW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIHVuaXRCaW5kaW5nRXhwcmVzc2lvbl0sIGNvbXBsZXhUeXBlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBbGlnbm1lbnRFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvQ29tcHV0ZWRFZGl0TW9kZTogRXhwcmVzc2lvbjxzdHJpbmc+LFxuXHRzQWxpZ25EaXNwbGF5OiBzdHJpbmcgPSBcIkJlZ2luXCIsXG5cdHNBbGlnbkVkaXQ6IHN0cmluZyA9IFwiQmVnaW5cIlxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB8IEV4cHJlc3Npb248c3RyaW5nPiB7XG5cdHJldHVybiBjb21waWxlQmluZGluZyhpZkVsc2UoZXF1YWwob0NvbXB1dGVkRWRpdE1vZGUsIFwiRGlzcGxheVwiKSwgc0FsaWduRGlzcGxheSwgc0FsaWduRWRpdCkpO1xufTtcblxuLyoqXG4gKiBGb3JtYXR0ZXIgaGVscGVyIHRvIHJldHJpZXZlIHRoZSBjb252ZXJ0ZXJDb250ZXh0IGZyb20gdGhlIG1ldGFtb2RlbCBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSB7Q29udGV4dH0gb0NvbnRleHQgVGhlIG9yaWdpbmFsIG1ldGFtb2RlbCBjb250ZXh0XG4gKiBAcGFyYW0ge0NvbXB1dGVkQW5ub3RhdGlvbkludGVyZmFjZX0gb0ludGVyZmFjZSBUaGUgY3VycmVudCB0ZW1wbGF0aW5nIGNvbnRleHRcbiAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBDb252ZXJ0ZXJDb250ZXh0IHJlcHJlc2VudGluZyB0aGF0IG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgZ2V0Q29udmVydGVyQ29udGV4dCA9IGZ1bmN0aW9uIChvQ29udGV4dDogTWV0YU1vZGVsQ29udGV4dCwgb0ludGVyZmFjZTogQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlKTogb2JqZWN0IHwgbnVsbCB7XG5cdGlmIChvSW50ZXJmYWNlICYmIG9JbnRlcmZhY2UuY29udGV4dCkge1xuXHRcdHJldHVybiBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dChvSW50ZXJmYWNlLmNvbnRleHQpO1xuXHR9XG5cdHJldHVybiBudWxsO1xufTtcbmdldENvbnZlcnRlckNvbnRleHQucmVxdWlyZXNJQ29udGV4dCA9IHRydWU7XG5cbi8qKlxuICogRm9ybWF0dGVyIGhlbHBlciB0byByZXRyaWV2ZSB0aGUgZGF0YSBtb2RlbCBvYmplY3RzIHRoYXQgYXJlIGludm9sdmVkIGZyb20gdGhlIG1ldGFtb2RlbCBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSB7Q29udGV4dH0gb0NvbnRleHQgVGhlIG9yaWdpbmFsIE9EYXRhTWV0YU1vZGVsIGNvbnRleHRcbiAqIEBwYXJhbSB7Q29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlfSBvSW50ZXJmYWNlIFRoZSBjdXJyZW50IHRlbXBsYXRpbmcgY29udGV4dFxuICogQHJldHVybnMge29iamVjdFtdfSBBbiBhcnJheSBvZiBlbnRpdHlzZXRzIGFuZCBuYXZwcm9wZXJ0aWVzIHRoYXQgYXJlIGludm9sdmVkIHRvIGdldCB0byBhIHNwZWNpZmljIG9iamVjdCBpbiB0aGUgbWV0YW1vZGVsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXREYXRhTW9kZWxPYmplY3RQYXRoID0gZnVuY3Rpb24gKFxuXHRvQ29udGV4dDogTWV0YU1vZGVsQ29udGV4dCxcblx0b0ludGVyZmFjZTogQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlXG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHwgbnVsbCB7XG5cdGlmIChvSW50ZXJmYWNlICYmIG9JbnRlcmZhY2UuY29udGV4dCkge1xuXHRcdHJldHVybiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob0ludGVyZmFjZS5jb250ZXh0KTtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn07XG5nZXREYXRhTW9kZWxPYmplY3RQYXRoLnJlcXVpcmVzSUNvbnRleHQgPSB0cnVlO1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZXhwcmVzc2lvbkJpbmRpbmcgY3JlYXRlZCBvdXQgb2YgYSBiaW5kaW5nIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIHtFeHByZXNzaW9uPGFueT59IGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gd2hpY2ggbmVlZHMgdG8gYmUgY29tcGlsZWRcbiAqIEByZXR1cm5zIHtCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+fSBUaGUgZXhwcmVzc2lvbi1iaW5kaW5nIHN0cmluZ1xuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkJpbmRpbmcgPSBmdW5jdGlvbiAoZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxhbnk+KTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdHJldHVybiBjb21waWxlQmluZGluZyhleHByZXNzaW9uKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0NvbGxlY3Rpb25GaWVsZCA9IGZ1bmN0aW9uIChvRGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IGJvb2xlYW4ge1xuXHRpZiAob0RhdGFNb2RlbFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdGNvbnN0IGhhc09uZVRvTWFueU5hdmlnYXRpb24gPVxuXHRcdFx0b0RhdGFNb2RlbFBhdGg/Lm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbmRJbmRleCgob05hdjogTmF2aWdhdGlvblByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdGlmIChvTmF2LmlzQ29sbGVjdGlvbikge1xuXHRcdFx0XHRcdGlmIChvRGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb24/Lm5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vd2UgY2hlY2sgdGhlIG9uZSB0byBtYW55IG5hdiBpcyBub3QgYWxyZWFkeSBwYXJ0IG9mIHRoZSBjb250ZXh0XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRvRGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb24/Lm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbmRJbmRleChcblx0XHRcdFx0XHRcdFx0XHQob0NvbnRleHROYXY6IE5hdmlnYXRpb25Qcm9wZXJ0eSkgPT4gb0NvbnRleHROYXYubmFtZSA9PT0gb05hdi5uYW1lXG5cdFx0XHRcdFx0XHRcdCkgPT09IC0xXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9KSA+IC0xO1xuXHRcdGlmIChoYXNPbmVUb01hbnlOYXZpZ2F0aW9uKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFJlcXVpcmVkRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YUZpZWxkQ29udmVydGVkPzogYW55LFxuXHRmb3JjZUVkaXRNb2RlOiBib29sZWFuID0gZmFsc2UsXG5cdGJBc09iamVjdDogYm9vbGVhbiA9IGZhbHNlXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPiB8IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPiB7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhmYWxzZSk7XG5cdH1cblxuXHRsZXQgZGF0YUZpZWxkUmVxdWlyZWRFeHByZXNzaW9uOiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPiB8IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPiA9IHRydWU7XG5cdGlmIChvRGF0YUZpZWxkQ29udmVydGVkICE9PSBudWxsKSB7XG5cdFx0ZGF0YUZpZWxkUmVxdWlyZWRFeHByZXNzaW9uID0gaXNSZXF1aXJlZEV4cHJlc3Npb24ob0RhdGFGaWVsZENvbnZlcnRlZCk7XG5cdH1cblxuXHRjb25zdCBvUHJvcGVydHk6IFByb3BlcnR5ID0gKGlzUGF0aEV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgJiYgb1Byb3BlcnR5UGF0aC4kdGFyZ2V0KSB8fCAob1Byb3BlcnR5UGF0aCBhcyBQcm9wZXJ0eSk7XG5cdC8vIEVuYWJsZW1lbnQgZGVwZW5kcyBvbiB0aGUgZmllbGQgY29udHJvbCBleHByZXNzaW9uXG5cdC8vIElmIHRoZSBGaWVsZCBjb250cm9sIGlzIHN0YXRpY2FsbHkgaW4gSW5hcHBsaWNhYmxlIChkaXNhYmxlZCkgLT4gbm90IGVuYWJsZWRcblx0Y29uc3QgcmVxdWlyZWRFeHByZXNzaW9uID0gaXNSZXF1aXJlZEV4cHJlc3Npb24ob1Byb3BlcnR5KTtcblx0Y29uc3QgZWRpdE1vZGUgPSBmb3JjZUVkaXRNb2RlIHx8IFVJLklzRWRpdGFibGU7XG5cdGlmIChiQXNPYmplY3QpIHtcblx0XHRyZXR1cm4gYW5kKG9yKHJlcXVpcmVkRXhwcmVzc2lvbiwgZGF0YUZpZWxkUmVxdWlyZWRFeHByZXNzaW9uKSwgZWRpdE1vZGUpO1xuXHR9XG5cdHJldHVybiBjb21waWxlQmluZGluZyhhbmQob3IocmVxdWlyZWRFeHByZXNzaW9uLCBkYXRhRmllbGRSZXF1aXJlZEV4cHJlc3Npb24pLCBlZGl0TW9kZSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFJlcXVpcmVkRXhwcmVzc2lvbkZvckNvbm5lY3RlZERhdGFGaWVsZCA9IGZ1bmN0aW9uIChkYXRhRmllbGRPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IGRhdGEgPSBkYXRhRmllbGRPYmplY3RQYXRoPy50YXJnZXRPYmplY3Q/LiR0YXJnZXQ/LkRhdGE7XG5cdGNvbnN0IGtleXM6IEFycmF5PHN0cmluZz4gPSBPYmplY3Qua2V5cyhkYXRhKTtcblx0Y29uc3QgZGF0YUZpZWxkcyA9IFtdO1xuXHRsZXQgcHJvcGVydHlQYXRoO1xuXHRjb25zdCBpc1JlcXVpcmVkRXhwcmVzc2lvbnM6IChCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPiB8IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPilbXSB8IHVuZGVmaW5lZCA9IFtdO1xuXHRmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG5cdFx0aWYgKGRhdGFba2V5XVtcIiRUeXBlXCJdICYmIGRhdGFba2V5XVtcIiRUeXBlXCJdLmluZGV4T2YoXCJEYXRhRmllbGRcIikgPiAtMSkge1xuXHRcdFx0ZGF0YUZpZWxkcy5wdXNoKGRhdGFba2V5XSk7XG5cdFx0fVxuXHR9XG5cdGZvciAoY29uc3QgZGF0YUZpZWxkIG9mIGRhdGFGaWVsZHMpIHtcblx0XHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdFx0aWYgKHR5cGVvZiBkYXRhRmllbGQuVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGggPSBkYXRhRmllbGQuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdFx0aWYgKGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldCkge1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkIHx8XG5cdFx0XHRcdFx0XHRkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGVcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LlZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5UGF0aCA9IGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIGRhdGFGaWVsZC5UYXJnZXQgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlQYXRoID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRpc1JlcXVpcmVkRXhwcmVzc2lvbnMucHVzaChnZXRSZXF1aXJlZEV4cHJlc3Npb24ocHJvcGVydHlQYXRoLCBkYXRhRmllbGQsIGZhbHNlLCB0cnVlKSk7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKG9yKC4uLihpc1JlcXVpcmVkRXhwcmVzc2lvbnMgYXMgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+W10pKSk7XG59O1xuIl19
667
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJRm9ybWF0dGVycy50cyJdLCJuYW1lcyI6WyJFRE1fVFlQRV9NQVBQSU5HIiwiRGlzcGxheU1vZGVGb3JtYXR0ZXIiLCJnZXREaXNwbGF5TW9kZSIsIm9EYXRhTW9kZWxPYmplY3RQYXRoIiwidGFyZ2V0T2JqZWN0IiwiZ2V0RWRpdGFibGVFeHByZXNzaW9uQXNPYmplY3QiLCJvUHJvcGVydHlQYXRoIiwib0RhdGFGaWVsZENvbnZlcnRlZCIsImlzRWRpdGFibGUiLCJVSSIsIklzRWRpdGFibGUiLCJnZXRFZGl0YWJsZUV4cHJlc3Npb24iLCJiQXNPYmplY3QiLCJjb21waWxlRXhwcmVzc2lvbiIsImRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbiIsImNvbnN0YW50IiwiaWZFbHNlIiwiaXNOb25FZGl0YWJsZUV4cHJlc3Npb24iLCJvUHJvcGVydHkiLCJpc1BhdGhFeHByZXNzaW9uIiwiJHRhcmdldCIsImlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24iLCJpc1BhdGhVcGRhdGFibGUiLCJwcm9wZXJ0eVBhdGgiLCJwYXRoVmlzaXRvciIsInBhdGgiLCJuYXZpZ2F0aW9uUGF0aHMiLCJzaW5nbGV0b25QYXRoVmlzaXRvciIsImNvbnZlcnRlZFR5cGVzIiwiZWRpdGFibGVFeHByZXNzaW9uIiwib3IiLCJub3QiLCJpc0NvbXB1dGVkIiwiaXNLZXkiLCJpc0ltbXV0YWJsZSIsIklzVHJhbnNpZW50QmluZGluZyIsImFuZCIsImdldENvbGxhYm9yYXRpb25FeHByZXNzaW9uIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImZvcm1hdHRlciIsIm9iamVjdFBhdGgiLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwiYWN0aXZpdHlFeHByZXNzaW9uIiwicGF0aEluTW9kZWwiLCJrZXlzIiwidGFyZ2V0RW50aXR5VHlwZSIsImtleXNFeHByZXNzaW9ucyIsImZvckVhY2giLCJrZXkiLCJrZXlFeHByZXNzaW9uIiwibmFtZSIsInB1c2giLCJmb3JtYXRSZXN1bHQiLCJnZXRFbmFibGVkRXhwcmVzc2lvbkFzT2JqZWN0IiwiZ2V0RW5hYmxlZEV4cHJlc3Npb24iLCJkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbiIsImlzRGlzYWJsZWRFeHByZXNzaW9uIiwiZW5hYmxlZEV4cHJlc3Npb24iLCJnZXRFZGl0TW9kZSIsImJNZWFzdXJlUmVhZE9ubHkiLCJhc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5IiwidW5pdFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSIsInJlc3VsdEV4cHJlc3Npb24iLCJpc1JlYWRPbmx5RXhwcmVzc2lvbiIsInJlYWRPbmx5RXhwcmVzc2lvbiIsImVkaXRNb2RlRXhwcmVzc2lvbiIsImlzQ29uc3RhbnQiLCJoYXNWYWxpZEFuYWx5dGljYWxDdXJyZW5jeU9yVW5pdCIsIm9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJvUHJvcGVydHlEZWZpbml0aW9uIiwiY3VycmVuY3kiLCJhbm5vdGF0aW9ucyIsIk1lYXN1cmVzIiwiSVNPQ3VycmVuY3kiLCJtZWFzdXJlIiwiVW5pdCIsImlzVHJ1dGh5IiwiZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIiwiSXNUb3RhbCIsImlmVW5pdEVkaXRhYmxlIiwic0VkaXRhYmxlVmFsdWUiLCJzTm9uRWRpdGFibGVWYWx1ZSIsImdldEZpZWxkRGlzcGxheSIsInNUYXJnZXREaXNwbGF5TW9kZSIsIm9Db21wdXRlZEVkaXRNb2RlIiwiaGFzVmFsdWVIZWxwIiwiZXF1YWwiLCJmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uIiwicHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiIsImlnbm9yZUNvbnN0cmFpbnRzIiwib3V0RXhwcmVzc2lvbiIsIl90eXBlIiwib1RhcmdldE1hcHBpbmciLCJ0eXBlIiwiY29uc3RyYWludHMiLCIkU2NhbGUiLCJzY2FsZSIsInVuZGVmaW5lZCIsIiRQcmVjaXNpb24iLCJwcmVjaXNpb24iLCIkTWF4TGVuZ3RoIiwibWF4TGVuZ3RoIiwibnVsbGFibGUiLCJWYWxpZGF0aW9uIiwiTWluaW11bSIsImlzTmFOIiwibWluaW11bSIsIk1heGltdW0iLCJtYXhpbXVtIiwiaW5kZXhPZiIsImZvcm1hdE9wdGlvbnMiLCJPYmplY3QiLCJhc3NpZ24iLCJwYXJzZUFzU3RyaW5nIiwiZW1wdHlTdHJpbmciLCJwYXJzZUtlZXBzRW1wdHlTdHJpbmciLCJDb21tb24iLCJJc0RpZ2l0U2VxdWVuY2UiLCJpc0RpZ2l0U2VxdWVuY2UiLCJWNCIsImdldFR5cGVDb25maWciLCJkYXRhVHlwZSIsInByb3BlcnR5VHlwZUNvbmZpZyIsImlzUHJvcGVydHkiLCIkTnVsbGFibGUiLCIkVjQiLCJnZXRCaW5kaW5nV2l0aFVuaXRPckN1cnJlbmN5Iiwib1Byb3BlcnR5RGF0YU1vZGVsUGF0aCIsImlnbm9yZVVuaXRDb25zdHJhaW50IiwidW5pdCIsInJlbGF0aXZlTG9jYXRpb24iLCJnZXRQYXRoUmVsYXRpdmVMb2NhdGlvbiIsImNvbnRleHRMb2NhdGlvbiIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwibWFwIiwibnAiLCJ0b1N0cmluZyIsInZhbHVlRm9ybWF0dGVycyIsImZvcm1hdFdpdGhQZXJjZW50YWdlIiwiY29tcGxleFR5cGUiLCJ1bml0QmluZGluZ0V4cHJlc3Npb24iLCJhZGRUeXBlSW5mb3JtYXRpb24iLCJnZXRCaW5kaW5nRm9yVW5pdE9yQ3VycmVuY3kiLCJnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoIiwic2hvd051bWJlciIsImdldEJpbmRpbmdXaXRoVGltZXpvbmUiLCJoaWRlVGltZXpvbmVGb3JFbXB0eVZhbHVlcyIsInRpbWV6b25lIiwiVGltZXpvbmUiLCJzaG93VGltZXpvbmVGb3JFbXB0eVZhbHVlcyIsImdldEFsaWdubWVudEV4cHJlc3Npb24iLCJzQWxpZ25EaXNwbGF5Iiwic0FsaWduRWRpdCIsImdldENvbnZlcnRlckNvbnRleHQiLCJvQ29udGV4dCIsIm9JbnRlcmZhY2UiLCJjb250ZXh0IiwiY29udmVydE1ldGFNb2RlbENvbnRleHQiLCJyZXF1aXJlc0lDb250ZXh0IiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImlzQ29sbGVjdGlvbkZpZWxkIiwib0RhdGFNb2RlbFBhdGgiLCJsZW5ndGgiLCJoYXNPbmVUb01hbnlOYXZpZ2F0aW9uIiwiZmluZEluZGV4Iiwib05hdiIsImlzQ29sbGVjdGlvbiIsIm9Db250ZXh0TmF2IiwiZ2V0UmVxdWlyZWRFeHByZXNzaW9uQXNPYmplY3QiLCJmb3JjZUVkaXRNb2RlIiwiZ2V0UmVxdWlyZWRFeHByZXNzaW9uIiwib1JlcXVpcmVkUHJvcGVydGllcyIsInJldHVybkV4cHJlc3Npb24iLCJhUmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyIsInJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMiLCJhUmVxdWlyZWRQcm9wZXJ0aWVzRnJvbVVwZGF0ZVJlc3RyaWN0aW9ucyIsInJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnMiLCJkYXRhRmllbGRSZXF1aXJlZEV4cHJlc3Npb24iLCJpc1JlcXVpcmVkRXhwcmVzc2lvbiIsInJlcXVpcmVkUHJvcGVydHlGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zRXhwcmVzc2lvbiIsInJlcXVpcmVkUHJvcGVydHlGcm9tVXBkYXRlUmVzdHJpY3Rpb25zRXhwcmVzc2lvbiIsInJlcXVpcmVkRXhwcmVzc2lvbiIsImVkaXRNb2RlIiwiaW5jbHVkZXMiLCJJc0NyZWF0ZU1vZGUiLCJub3RFcXVhbCIsImdldFJlcXVpcmVkRXhwcmVzc2lvbkZvckNvbm5lY3RlZERhdGFGaWVsZCIsImRhdGFGaWVsZE9iamVjdFBhdGgiLCJkYXRhIiwiRGF0YSIsImRhdGFGaWVsZHMiLCJpc1JlcXVpcmVkRXhwcmVzc2lvbnMiLCJkYXRhRmllbGQiLCIkVHlwZSIsIlZhbHVlIiwiVGFyZ2V0Il0sIm1hcHBpbmdzIjoi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QUEzQkQ7O0FBNkJBOEssTUFBQUEscUJBQXFCLENBQUMvSSxJQUF0QixDQUEyQndILDZCQUE2QixDQUFDcEosWUFBRCxFQUFlNEssU0FBZixFQUEwQixLQUExQixDQUF4RDtBQUNBOztBQUNELFdBQU90TCxpQkFBaUIsQ0FBQ2lCLEVBQUUsTUFBRiw0QkFBT29LLHFCQUFQLEVBQUQsQ0FBeEI7QUFDQSxHQTlDTSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBOYXZpZ2F0aW9uUHJvcGVydHksIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHsgc2luZ2xldG9uUGF0aFZpc2l0b3IsIFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dCwgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdmFsdWVGb3JtYXR0ZXJzIGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1ZhbHVlRm9ybWF0dGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIFBhdGhJbk1vZGVsRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQge1xuXHRhZGRUeXBlSW5mb3JtYXRpb24sXG5cdGFuZCxcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRlcXVhbCxcblx0Zm9ybWF0UmVzdWx0LFxuXHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24sXG5cdGlmRWxzZSxcblx0aXNDb25zdGFudCxcblx0aXNUcnV0aHksXG5cdG5vdCxcblx0bm90RXF1YWwsXG5cdG9yLFxuXHRwYXRoSW5Nb2RlbFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHtcblx0RGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0Z2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCxcblx0Z2V0UGF0aFJlbGF0aXZlTG9jYXRpb24sXG5cdGdldFRhcmdldE9iamVjdFBhdGgsXG5cdGlzUGF0aFVwZGF0YWJsZVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgKiBhcyBEaXNwbGF5TW9kZUZvcm1hdHRlciBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHtcblx0aXNEaXNhYmxlZEV4cHJlc3Npb24sXG5cdGlzTm9uRWRpdGFibGVFeHByZXNzaW9uLFxuXHRpc1JlYWRPbmx5RXhwcmVzc2lvbixcblx0aXNSZXF1aXJlZEV4cHJlc3Npb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQge1xuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0aGFzVmFsdWVIZWxwLFxuXHRpc0NvbXB1dGVkLFxuXHRpc0ltbXV0YWJsZSxcblx0aXNLZXksXG5cdGlzUGF0aEV4cHJlc3Npb24sXG5cdGlzUHJvcGVydHlcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5cbi8vIEltcG9ydC1leHBvcnQgbWV0aG9kIHVzZWQgYnkgdGhlIGNvbnZlcnRlciB0byB1c2UgdGhlbSBpbiB0aGUgdGVtcGxhdGluZyB0aHJvdWdoIHRoZSBVSUZvcm1hdHRlcnMuXG5leHBvcnQgdHlwZSBEaXNwbGF5TW9kZSA9IERpc3BsYXlNb2RlRm9ybWF0dGVyLkRpc3BsYXlNb2RlO1xuXG5leHBvcnQgY29uc3QgRURNX1RZUEVfTUFQUElORyA9IERpc3BsYXlNb2RlRm9ybWF0dGVyLkVETV9UWVBFX01BUFBJTkc7XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5T3JQYXRoPFA+ID0gc3RyaW5nIHwgUCB8IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPjtcbmV4cG9ydCB0eXBlIE1ldGFNb2RlbENvbnRleHQgPSB7XG5cdCRraW5kOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlID0ge1xuXHRjb250ZXh0OiBDb250ZXh0O1xuXHRhcmd1bWVudHM/OiBhbnlbXTtcblx0JCR2YWx1ZUFzUHJvbWlzZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlQ29uc3RyYWludHMgPSB7XG5cdHNjYWxlPzogbnVtYmVyO1xuXHRwcmVjaXNpb24/OiBudW1iZXI7XG5cdG1heExlbmd0aD86IG51bWJlcjtcblx0bnVsbGFibGU/OiBib29sZWFuO1xuXHRtaW5pbXVtPzogc3RyaW5nO1xuXHRtYXhpbXVtPzogc3RyaW5nO1xuXHRpc0RpZ2l0U2VxdWVuY2U/OiBib29sZWFuO1xuXHRWND86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlZm9ybWF0T3B0aW9ucyA9IHtcblx0cGFyc2VBc1N0cmluZz86IGJvb2xlYW47XG5cdGVtcHR5U3RyaW5nPzogc3RyaW5nO1xuXHRwYXJzZUtlZXBzRW1wdHlTdHJpbmc/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZSA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRjb25zdHJhaW50czogY29uZmlnVHlwZUNvbnN0cmFpbnRzO1xuXHRmb3JtYXRPcHRpb25zOiBjb25maWdUeXBlZm9ybWF0T3B0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREaXNwbGF5TW9kZSA9IGZ1bmN0aW9uIChvRGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IERpc3BsYXlNb2RlIHtcblx0cmV0dXJuIERpc3BsYXlNb2RlRm9ybWF0dGVyLmdldERpc3BsYXlNb2RlKG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCwgb0RhdGFNb2RlbE9iamVjdFBhdGgpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRFZGl0YWJsZUV4cHJlc3Npb25Bc09iamVjdCA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YUZpZWxkQ29udmVydGVkOiBhbnkgPSBudWxsLFxuXHRvRGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0aXNFZGl0YWJsZTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gVUkuSXNFZGl0YWJsZVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGdldEVkaXRhYmxlRXhwcmVzc2lvbihcblx0XHRvUHJvcGVydHlQYXRoLFxuXHRcdG9EYXRhRmllbGRDb252ZXJ0ZWQsXG5cdFx0b0RhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0dHJ1ZSxcblx0XHRpc0VkaXRhYmxlXG5cdCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xufTtcbi8qKlxuICogQ3JlYXRlIHRoZSBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGFuIFwiZWRpdGFibGVcIiBib29sZWFuIHZhbHVlLlxuICpcbiAqIEBwYXJhbSBvUHJvcGVydHlQYXRoIFRoZSBpbnB1dCBwcm9wZXJ0eVxuICogQHBhcmFtIG9EYXRhRmllbGRDb252ZXJ0ZWQgVGhlIERhdGFGaWVsZENvbnZlcnRlZCBvYmplY3QgdG8gcmVhZCB0aGUgZmllbGRDb250cm9sIGFubm90YXRpb25cbiAqIEBwYXJhbSBvRGF0YU1vZGVsT2JqZWN0UGF0aCBUaGUgcGF0aCB0byB0aGlzIHByb3BlcnR5IG9iamVjdFxuICogQHBhcmFtIGJBc09iamVjdCBXaGV0aGVyIG9yIG5vdCB0aGlzIHNob3VsZCBiZSByZXR1cm5lZCBhcyBhbiBvYmplY3Qgb3IgYSBiaW5kaW5nIHN0cmluZ1xuICogQHBhcmFtIGlzRWRpdGFibGUgV2hldGhlciBvciBub3QgVUkuSXNFZGl0YWJsZSBiZSBjb25zaWRlcmVkLlxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB1c2VkIHRvIGRldGVybWluZSBpZiBhIHByb3BlcnR5IGlzIGVkaXRhYmxlIG9yIG5vdFxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdGFibGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSA9IG51bGwsXG5cdG9EYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRiQXNPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0aXNFZGl0YWJsZTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gVUkuSXNFZGl0YWJsZVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRpZiAoIW9Qcm9wZXJ0eVBhdGggfHwgdHlwZW9mIG9Qcm9wZXJ0eVBhdGggPT09IFwic3RyaW5nXCIpIHtcblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oZmFsc2UpO1xuXHR9XG5cdGxldCBkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IGNvbnN0YW50KHRydWUpO1xuXHRpZiAob0RhdGFGaWVsZENvbnZlcnRlZCAhPT0gbnVsbCkge1xuXHRcdGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbiA9IGlmRWxzZShpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSwgZmFsc2UsIGlzRWRpdGFibGUpO1xuXHR9XG5cblx0Y29uc3Qgb1Byb3BlcnR5OiBQcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHQvLyBFZGl0YWJpbGl0eSBkZXBlbmRzIG9uIHRoZSBmaWVsZCBjb250cm9sIGV4cHJlc3Npb25cblx0Ly8gSWYgdGhlIEZpZWxkIGNvbnRyb2wgaXMgc3RhdGljYWxseSBpbiBSZWFkT25seSBvciBJbmFwcGxpY2FibGUgKGRpc2FibGVkKSAtPiBub3QgZWRpdGFibGVcblx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIGEga2V5IC0+IG5vdCBlZGl0YWJsZSBleGNlcHQgaW4gY3JlYXRpb24gaWYgbm90IGNvbXB1dGVkXG5cdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBjb21wdXRlZCAtPiBub3QgZWRpdGFibGVcblx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIG5vdCB1cGRhdGFibGUgLT4gbm90IGVkaXRhYmxlXG5cdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBpbW11dGFibGUgLT4gbm90IGVkaXRhYmxlIGV4Y2VwdCBpbiBjcmVhdGlvblxuXHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBhIHBhdGggcmVzb2x2aW5nIHRvIFJlYWRPbmx5IG9yIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpICg8PSAxKSAtPiBub3QgZWRpdGFibGVcblx0Ly8gRWxzZSwgdG8gYmUgZWRpdGFibGUgeW91IG5lZWRcblx0Ly8gaW1tdXRhYmxlIGFuZCBrZXkgd2hpbGUgaW4gdGhlIGNyZWF0aW9uIHJvd1xuXHQvLyB1aS9pc0VkaXRhYmxlXG5cdGNvbnN0IGlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24gPSBpc1BhdGhVcGRhdGFibGUob0RhdGFNb2RlbE9iamVjdFBhdGgsIHtcblx0XHRwcm9wZXJ0eVBhdGg6IG9Qcm9wZXJ0eVBhdGgsXG5cdFx0cGF0aFZpc2l0b3I6IChwYXRoOiBzdHJpbmcsIG5hdmlnYXRpb25QYXRoczogc3RyaW5nW10pID0+XG5cdFx0XHRzaW5nbGV0b25QYXRoVmlzaXRvcihwYXRoLCBvRGF0YU1vZGVsT2JqZWN0UGF0aC5jb252ZXJ0ZWRUeXBlcywgbmF2aWdhdGlvblBhdGhzKVxuXHR9KTtcblx0Y29uc3QgZWRpdGFibGVFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdG9yKFxuXHRcdFx0bm90KGlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24pLFxuXHRcdFx0aXNDb21wdXRlZChvUHJvcGVydHkpLFxuXHRcdFx0aXNLZXkob1Byb3BlcnR5KSxcblx0XHRcdGlzSW1tdXRhYmxlKG9Qcm9wZXJ0eSksXG5cdFx0XHRpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvUHJvcGVydHkpXG5cdFx0KSxcblx0XHRpZkVsc2Uob3IoaXNDb21wdXRlZChvUHJvcGVydHkpLCBpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvUHJvcGVydHkpKSwgZmFsc2UsIFVJLklzVHJhbnNpZW50QmluZGluZyksXG5cdFx0aXNFZGl0YWJsZVxuXHQpO1xuXHRpZiAoYkFzT2JqZWN0KSB7XG5cdFx0cmV0dXJuIGFuZChlZGl0YWJsZUV4cHJlc3Npb24sIGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbik7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGFuZChlZGl0YWJsZUV4cHJlc3Npb24sIGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbikpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbGxhYm9yYXRpb25FeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRmb3JtYXR0ZXI6IGFueVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGFueT4ge1xuXHRjb25zdCBvYmplY3RQYXRoID0gZ2V0VGFyZ2V0T2JqZWN0UGF0aChkYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0Y29uc3QgYWN0aXZpdHlFeHByZXNzaW9uID0gcGF0aEluTW9kZWwoYC9jb2xsYWJvcmF0aW9uL2FjdGl2aXRpZXMke29iamVjdFBhdGh9YCwgXCJpbnRlcm5hbFwiKTtcblx0Y29uc3Qga2V5cyA9IGRhdGFNb2RlbE9iamVjdFBhdGg/LnRhcmdldEVudGl0eVR5cGU/LmtleXM7XG5cdGNvbnN0IGtleXNFeHByZXNzaW9uczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGFueT5bXSA9IFtdO1xuXHRrZXlzPy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcblx0XHRjb25zdCBrZXlFeHByZXNzaW9uID0gcGF0aEluTW9kZWwoa2V5Lm5hbWUpO1xuXHRcdGtleXNFeHByZXNzaW9ucy5wdXNoKGtleUV4cHJlc3Npb24pO1xuXHR9KTtcblx0cmV0dXJuIGZvcm1hdFJlc3VsdChbYWN0aXZpdHlFeHByZXNzaW9uLCAuLi5rZXlzRXhwcmVzc2lvbnNdLCBmb3JtYXR0ZXIpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRFbmFibGVkRXhwcmVzc2lvbkFzT2JqZWN0ID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ/OiBhbnlcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBnZXRFbmFibGVkRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG59O1xuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24gdG8gZ2VuZXJhdGUgYW4gXCJlbmFibGVkXCIgYm9vbGVhbiB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gb1Byb3BlcnR5UGF0aCBUaGUgaW5wdXQgcHJvcGVydHlcbiAqIEBwYXJhbSBvRGF0YUZpZWxkQ29udmVydGVkIFRoZSBEYXRhRmllbGRDb252ZXJ0ZWQgT2JqZWN0IHRvIHJlYWQgdGhlIGZpZWxkQ29udHJvbCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gYkFzT2JqZWN0IFdoZXRoZXIgb3Igbm90IHRoaXMgc2hvdWxkIGJlIHJldHVybmVkIGFzIGFuIG9iamVjdCBvciBhIGJpbmRpbmcgc3RyaW5nXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIHRvIGRldGVybWluZSBpZiBhIHByb3BlcnR5IGlzIGVuYWJsZWQgb3Igbm90XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFbmFibGVkRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YUZpZWxkQ29udmVydGVkPzogYW55LFxuXHRiQXNPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRpZiAoIW9Qcm9wZXJ0eVBhdGggfHwgdHlwZW9mIG9Qcm9wZXJ0eVBhdGggPT09IFwic3RyaW5nXCIpIHtcblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24odHJ1ZSk7XG5cdH1cblx0bGV0IGRhdGFGaWVsZEVuYWJsZWRFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudCh0cnVlKTtcblx0aWYgKG9EYXRhRmllbGRDb252ZXJ0ZWQgIT09IG51bGwpIHtcblx0XHRkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbiA9IGlmRWxzZShpc0Rpc2FibGVkRXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSwgZmFsc2UsIHRydWUpO1xuXHR9XG5cblx0Y29uc3Qgb1Byb3BlcnR5OiBQcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHQvLyBFbmFibGVtZW50IGRlcGVuZHMgb24gdGhlIGZpZWxkIGNvbnRyb2wgZXhwcmVzc2lvblxuXHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBzdGF0aWNhbGx5IGluIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpIC0+IG5vdCBlbmFibGVkXG5cdGNvbnN0IGVuYWJsZWRFeHByZXNzaW9uID0gaWZFbHNlKGlzRGlzYWJsZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eSksIGZhbHNlLCB0cnVlKTtcblx0aWYgKGJBc09iamVjdCkge1xuXHRcdHJldHVybiBhbmQoZW5hYmxlZEV4cHJlc3Npb24sIGRhdGFGaWVsZEVuYWJsZWRFeHByZXNzaW9uKTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oYW5kKGVuYWJsZWRFeHByZXNzaW9uLCBkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbikpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24gdG8gZ2VuZXJhdGUgYW4gXCJlZGl0TW9kZVwiIGVudW0gdmFsdWUuXG4gKlxuICogQHBhcmFtIG9Qcm9wZXJ0eVBhdGggVGhlIGlucHV0IHByb3BlcnR5XG4gKiBAcGFyYW0gb0RhdGFNb2RlbE9iamVjdFBhdGggVGhlIGxpc3Qgb2YgZGF0YSBtb2RlbCBvYmplY3RzIHRoYXQgYXJlIGludm9sdmVkIHRvIHJlYWNoIHRoYXQgcHJvcGVydHlcbiAqIEBwYXJhbSBiTWVhc3VyZVJlYWRPbmx5IFdoZXRoZXIgd2Ugc2hvdWxkIHNldCBVb00gLyBjdXJyZW5jeSBmaWVsZCBtb2RlIHRvIHJlYWQgb25seVxuICogQHBhcmFtIGJBc09iamVjdCBXaGV0aGVyIHdlIHNob3VsZCByZXR1cm4gdGhpcyBhcyBhbiBleHByZXNzaW9uIG9yIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0gb0RhdGFGaWVsZENvbnZlcnRlZCBUaGUgZGF0YUZpZWxkIG9iamVjdFxuICogQHBhcmFtIGlzRWRpdGFibGUgV2hldGhlciBvciBub3QgVUkuSXNFZGl0YWJsZSBiZSBjb25zaWRlcmVkLlxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgcHJvcGVydHkgZWRpdCBtb2RlLCBjb21wbGlhbnQgd2l0aCB0aGUgTURDIEZpZWxkIGRlZmluaXRpb24gb2YgZWRpdE1vZGUuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFZGl0TW9kZSA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0Yk1lYXN1cmVSZWFkT25seTogYm9vbGVhbiA9IGZhbHNlLFxuXHRiQXNPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0b0RhdGFGaWVsZENvbnZlcnRlZDogYW55ID0gbnVsbCxcblx0aXNFZGl0YWJsZTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gVUkuSXNFZGl0YWJsZVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBcIkRpc3BsYXlcIjtcblx0fVxuXHRjb25zdCBvUHJvcGVydHk6IFByb3BlcnR5ID0gKGlzUGF0aEV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgJiYgb1Byb3BlcnR5UGF0aC4kdGFyZ2V0KSB8fCAob1Byb3BlcnR5UGF0aCBhcyBQcm9wZXJ0eSk7XG5cdC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZW5hYmxlZCA9PiBEaXNhYmxlZFxuXHQvLyBpZiB0aGUgcHJvcGVydHkgaXMgZW5hYmxlZCAmJiBub3QgZWRpdGFibGUgPT4gUmVhZE9ubHlcblx0Ly8gaWYgdGhlIHByb3BlcnR5IGlzIGVuYWJsZWQgJiYgZWRpdGFibGUgPT4gRWRpdGFibGVcblx0Ly8gSWYgdGhlcmUgaXMgYW4gYXNzb2NpYXRlZCB1bml0LCBhbmQgaXQgaGFzIGEgZmllbGQgY29udHJvbCBhbHNvIHVzZSBjb25zaWRlciB0aGUgZm9sbG93aW5nXG5cdC8vIGlmIHRoZSB1bml0IGZpZWxkIGNvbnRyb2wgaXMgcmVhZG9ubHkgLT4gRWRpdGFibGVSZWFkT25seVxuXHQvLyBvdGhlcndpc2UgLT4gRWRpdGFibGVcblx0Y29uc3QgZWRpdGFibGVFeHByZXNzaW9uID0gZ2V0RWRpdGFibGVFeHByZXNzaW9uQXNPYmplY3Qob1Byb3BlcnR5UGF0aCwgb0RhdGFGaWVsZENvbnZlcnRlZCwgb0RhdGFNb2RlbE9iamVjdFBhdGgsIGlzRWRpdGFibGUpO1xuXG5cdGNvbnN0IGVuYWJsZWRFeHByZXNzaW9uID0gZ2V0RW5hYmxlZEV4cHJlc3Npb25Bc09iamVjdChvUHJvcGVydHlQYXRoLCBvRGF0YUZpZWxkQ29udmVydGVkKTtcblx0Y29uc3QgYXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShvUHJvcGVydHkpO1xuXHRjb25zdCB1bml0UHJvcGVydHkgPSBhc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KG9Qcm9wZXJ0eSk7XG5cdGxldCByZXN1bHRFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiA9IGNvbnN0YW50KFwiRWRpdGFibGVcIik7XG5cdGlmICh1bml0UHJvcGVydHkpIHtcblx0XHRyZXN1bHRFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdFx0b3IoaXNSZWFkT25seUV4cHJlc3Npb24odW5pdFByb3BlcnR5KSwgaXNDb21wdXRlZCh1bml0UHJvcGVydHkpLCBiTWVhc3VyZVJlYWRPbmx5KSxcblx0XHRcdFwiRWRpdGFibGVSZWFkT25seVwiLFxuXHRcdFx0XCJFZGl0YWJsZVwiXG5cdFx0KTtcblx0fVxuXHRjb25zdCByZWFkT25seUV4cHJlc3Npb24gPSBvcihpc1JlYWRPbmx5RXhwcmVzc2lvbihvUHJvcGVydHkpLCBpc1JlYWRPbmx5RXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSk7XG5cblx0Ly8gaWYgdGhlIHByb3BlcnR5IGlzIGZyb20gYSBub24tdXBkYXRhYmxlIGVudGl0eSA9PiBSZWFkIG9ubHkgbW9kZSwgcHJldmlvdXNseSBjYWxjdWxhdGVkIGVkaXQgTW9kZSBpcyBpZ25vcmVkXG5cdC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBmcm9tIGFuIHVwZGF0YWJsZSBlbnRpdHkgPT4gcHJldmlvdXNseSBjYWxjdWxhdGVkIGVkaXQgTW9kZSBleHByZXNzaW9uXG5cdGNvbnN0IGVkaXRNb2RlRXhwcmVzc2lvbiA9IGlmRWxzZShcblx0XHRlbmFibGVkRXhwcmVzc2lvbixcblx0XHRpZkVsc2UoXG5cdFx0XHRlZGl0YWJsZUV4cHJlc3Npb24sXG5cdFx0XHRyZXN1bHRFeHByZXNzaW9uLFxuXHRcdFx0aWZFbHNlKGFuZCghaXNDb25zdGFudChyZWFkT25seUV4cHJlc3Npb24pICYmIHJlYWRPbmx5RXhwcmVzc2lvbiwgaXNFZGl0YWJsZSksIFwiUmVhZE9ubHlcIiwgXCJEaXNwbGF5XCIpXG5cdFx0KSxcblx0XHRpZkVsc2UoaXNFZGl0YWJsZSwgXCJEaXNhYmxlZFwiLCBcIkRpc3BsYXlcIilcblx0KTtcblx0aWYgKGJBc09iamVjdCkge1xuXHRcdHJldHVybiBlZGl0TW9kZUV4cHJlc3Npb247XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGVkaXRNb2RlRXhwcmVzc2lvbik7XG59O1xuXG5leHBvcnQgY29uc3QgaGFzVmFsaWRBbmFseXRpY2FsQ3VycmVuY3lPclVuaXQgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGhcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3Qgb1Byb3BlcnR5RGVmaW5pdGlvbiA9IG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5O1xuXHRjb25zdCBjdXJyZW5jeSA9IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeTtcblx0Y29uc3QgbWVhc3VyZSA9IGN1cnJlbmN5ID8gY3VycmVuY3kgOiBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5NZWFzdXJlcz8uVW5pdDtcblx0aWYgKG1lYXN1cmUpIHtcblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24ob3IoaXNUcnV0aHkoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKG1lYXN1cmUpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+KSwgbm90KFVJLklzVG90YWwpKSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGNvbnN0YW50KHRydWUpKTtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGlmVW5pdEVkaXRhYmxlID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdHNFZGl0YWJsZVZhbHVlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB8IHN0cmluZyxcblx0c05vbkVkaXRhYmxlVmFsdWU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+IHwgc3RyaW5nXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHRjb25zdCB1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShvUHJvcGVydHkpIHx8IGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkob1Byb3BlcnR5KTtcblx0aWYgKCF1bml0UHJvcGVydHkpIHtcblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oc05vbkVkaXRhYmxlVmFsdWUpO1xuXHR9XG5cdGNvbnN0IGVkaXRhYmxlRXhwcmVzc2lvbiA9IGFuZChub3QoaXNSZWFkT25seUV4cHJlc3Npb24odW5pdFByb3BlcnR5KSksIG5vdChpc0NvbXB1dGVkKHVuaXRQcm9wZXJ0eSkpKTtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShlZGl0YWJsZUV4cHJlc3Npb24sIHNFZGl0YWJsZVZhbHVlLCBzTm9uRWRpdGFibGVWYWx1ZSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZpZWxkRGlzcGxheSA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRzVGFyZ2V0RGlzcGxheU1vZGU6IHN0cmluZyxcblx0b0NvbXB1dGVkRWRpdE1vZGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+XG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXG5cdHJldHVybiBoYXNWYWx1ZUhlbHAob1Byb3BlcnR5KVxuXHRcdD8gY29tcGlsZUV4cHJlc3Npb24oc1RhcmdldERpc3BsYXlNb2RlKVxuXHRcdDogY29tcGlsZUV4cHJlc3Npb24oaWZFbHNlKGVxdWFsKG9Db21wdXRlZEVkaXRNb2RlLCBcIkVkaXRhYmxlXCIpLCBcIlZhbHVlXCIsIHNUYXJnZXREaXNwbGF5TW9kZSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24gPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eTogUHJvcGVydHksXG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+LFxuXHRpZ25vcmVDb25zdHJhaW50cz86IGJvb2xlYW5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3Qgb3V0RXhwcmVzc2lvbjogUGF0aEluTW9kZWxFeHByZXNzaW9uPGFueT4gPSBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uIGFzIFBhdGhJbk1vZGVsRXhwcmVzc2lvbjxhbnk+O1xuXHRpZiAob1Byb3BlcnR5Ll90eXBlID09PSBcIlByb3BlcnR5XCIpIHtcblx0XHRjb25zdCBvVGFyZ2V0TWFwcGluZyA9IEVETV9UWVBFX01BUFBJTkdbb1Byb3BlcnR5LnR5cGVdO1xuXHRcdGlmIChvVGFyZ2V0TWFwcGluZykge1xuXHRcdFx0b3V0RXhwcmVzc2lvbi50eXBlID0gb1RhcmdldE1hcHBpbmcudHlwZTtcblx0XHRcdGlmIChvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cyAmJiAhaWdub3JlQ29uc3RyYWludHMpIHtcblx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cyA9IHt9O1xuXHRcdFx0XHRpZiAob1RhcmdldE1hcHBpbmcuY29uc3RyYWludHMuJFNjYWxlICYmIG9Qcm9wZXJ0eS5zY2FsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5zY2FsZSA9IG9Qcm9wZXJ0eS5zY2FsZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob1RhcmdldE1hcHBpbmcuY29uc3RyYWludHMuJFByZWNpc2lvbiAmJiBvUHJvcGVydHkucHJlY2lzaW9uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRvdXRFeHByZXNzaW9uLmNvbnN0cmFpbnRzLnByZWNpc2lvbiA9IG9Qcm9wZXJ0eS5wcmVjaXNpb247XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzLiRNYXhMZW5ndGggJiYgb1Byb3BlcnR5Lm1heExlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5tYXhMZW5ndGggPSBvUHJvcGVydHkubWF4TGVuZ3RoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvUHJvcGVydHkubnVsbGFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5udWxsYWJsZSA9IG9Qcm9wZXJ0eS5udWxsYWJsZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHNbXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWluaW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5WYWxpZGF0aW9uLk1pbmltdW0pXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMubWluaW11bSA9IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5WYWxpZGF0aW9uLk1pbmltdW19YDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHNbXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWF4aW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5WYWxpZGF0aW9uLk1heGltdW0pXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMubWF4aW11bSA9IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5WYWxpZGF0aW9uLk1heGltdW19YDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvUHJvcGVydHkubnVsbGFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMgPSB7fTtcblx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5udWxsYWJsZSA9IG9Qcm9wZXJ0eS5udWxsYWJsZTtcblx0XHRcdH1cblx0XHRcdGlmIChvdXRFeHByZXNzaW9uPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwKSB7XG5cdFx0XHRcdGlmICghb3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zID0ge307XG5cdFx0XHRcdH1cblx0XHRcdFx0b3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zID0gT2JqZWN0LmFzc2lnbihvdXRFeHByZXNzaW9uLmZvcm1hdE9wdGlvbnMsIHtcblx0XHRcdFx0XHRwYXJzZUFzU3RyaW5nOiBmYWxzZSxcblx0XHRcdFx0XHRlbXB0eVN0cmluZzogXCJcIlxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmIChvdXRFeHByZXNzaW9uLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIpIHtcblx0XHRcdFx0aWYgKCFvdXRFeHByZXNzaW9uLmZvcm1hdE9wdGlvbnMpIHtcblx0XHRcdFx0XHRvdXRFeHByZXNzaW9uLmZvcm1hdE9wdGlvbnMgPSB7fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvdXRFeHByZXNzaW9uLmZvcm1hdE9wdGlvbnMucGFyc2VLZWVwc0VtcHR5U3RyaW5nID0gdHJ1ZTtcblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LltcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEaWdpdFNlcXVlbmNlXCJdICYmXG5cdFx0XHRcdFx0b1Byb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LklzRGlnaXRTZXF1ZW5jZVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRvdXRFeHByZXNzaW9uLmNvbnN0cmFpbnRzLmlzRGlnaXRTZXF1ZW5jZSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvdXRFeHByZXNzaW9uPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRG91YmxlXCIpID09PSAwKSB7XG5cdFx0XHRcdGlmICghb3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zID0ge307XG5cdFx0XHRcdH1cblx0XHRcdFx0b3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zID0gT2JqZWN0LmFzc2lnbihvdXRFeHByZXNzaW9uLmZvcm1hdE9wdGlvbnMsIHtcblx0XHRcdFx0XHRwYXJzZUFzU3RyaW5nOiBmYWxzZSxcblx0XHRcdFx0XHRlbXB0eVN0cmluZzogXCJcIlxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmIChvdXRFeHByZXNzaW9uPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRGF0ZVRpbWVPZmZzZXRcIikgPT09IDApIHtcblx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5WNCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvdXRFeHByZXNzaW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFR5cGVDb25maWcgPSBmdW5jdGlvbiAob1Byb3BlcnR5OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhbnkge1xuXHRjb25zdCBvVGFyZ2V0TWFwcGluZyA9IEVETV9UWVBFX01BUFBJTkdbKG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSk/LnR5cGVdIHx8IChkYXRhVHlwZSA/IEVETV9UWVBFX01BUFBJTkdbZGF0YVR5cGVdIDogdW5kZWZpbmVkKTtcblx0Y29uc3QgcHJvcGVydHlUeXBlQ29uZmlnOiBjb25maWdUeXBlID0ge1xuXHRcdHR5cGU6IG9UYXJnZXRNYXBwaW5nLnR5cGUsXG5cdFx0Y29uc3RyYWludHM6IHt9LFxuXHRcdGZvcm1hdE9wdGlvbnM6IHt9XG5cdH07XG5cdGlmIChpc1Byb3BlcnR5KG9Qcm9wZXJ0eSkpIHtcblx0XHRwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHMgPSB7XG5cdFx0XHRzY2FsZTogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRTY2FsZSA/IG9Qcm9wZXJ0eS5zY2FsZSA6IHVuZGVmaW5lZCxcblx0XHRcdHByZWNpc2lvbjogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRQcmVjaXNpb24gPyBvUHJvcGVydHkucHJlY2lzaW9uIDogdW5kZWZpbmVkLFxuXHRcdFx0bWF4TGVuZ3RoOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJE1heExlbmd0aCA/IG9Qcm9wZXJ0eS5tYXhMZW5ndGggOiB1bmRlZmluZWQsXG5cdFx0XHRudWxsYWJsZTogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiROdWxsYWJsZSA/IG9Qcm9wZXJ0eS5udWxsYWJsZSA6IHVuZGVmaW5lZCxcblx0XHRcdG1pbmltdW06XG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWluaW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtKVxuXHRcdFx0XHRcdD8gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtfWBcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdG1heGltdW06XG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWF4aW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtKVxuXHRcdFx0XHRcdD8gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtfWBcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdGlzRGlnaXRTZXF1ZW5jZTpcblx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgJiZcblx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LltcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEaWdpdFNlcXVlbmNlXCJdICYmXG5cdFx0XHRcdG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5Jc0RpZ2l0U2VxdWVuY2Vcblx0XHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdFY0OiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJFY0ID8gdHJ1ZSA6IHVuZGVmaW5lZFxuXHRcdH07XG5cdH1cblx0cHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0cGFyc2VBc1N0cmluZzpcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCB8fFxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRG91YmxlXCIpID09PSAwXG5cdFx0XHRcdD8gZmFsc2Vcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0ZW1wdHlTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nOiBwcm9wZXJ0eVR5cGVDb25maWcudHlwZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIiA/IHRydWUgOiB1bmRlZmluZWRcblx0fTtcblx0cmV0dXJuIHByb3BlcnR5VHlwZUNvbmZpZztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nV2l0aFVuaXRPckN1cnJlbmN5ID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPixcblx0aWdub3JlVW5pdENvbnN0cmFpbnQ/OiBib29sZWFuLFxuXHRmb3JtYXRPcHRpb25zPzogYW55XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eURlZmluaXRpb24gPSBvUHJvcGVydHlEYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eTtcblx0bGV0IHVuaXQgPSBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5NZWFzdXJlcz8uVW5pdDtcblx0Y29uc3QgcmVsYXRpdmVMb2NhdGlvbiA9IGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uKFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGguY29udGV4dExvY2F0aW9uLFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXNcblx0KS5tYXAoKG5wKSA9PiBucC5uYW1lKTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbik7XG5cdGlmICh1bml0Py50b1N0cmluZygpID09PSBcIiVcIikge1xuXHRcdHJldHVybiBmb3JtYXRSZXN1bHQoW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb25dLCB2YWx1ZUZvcm1hdHRlcnMuZm9ybWF0V2l0aFBlcmNlbnRhZ2UpO1xuXHR9XG5cdGNvbnN0IGNvbXBsZXhUeXBlID0gdW5pdCA/IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuVW5pdFwiIDogXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5DdXJyZW5jeVwiO1xuXHR1bml0ID0gdW5pdCA/IHVuaXQgOiBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3k7XG5cdGNvbnN0IHVuaXRCaW5kaW5nRXhwcmVzc2lvbiA9ICh1bml0IGFzIGFueSkuJHRhcmdldFxuXHRcdD8gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihcblx0XHRcdFx0KHVuaXQgYXMgYW55KS4kdGFyZ2V0LFxuXHRcdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odW5pdCwgcmVsYXRpdmVMb2NhdGlvbikgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4sXG5cdFx0XHRcdGlnbm9yZVVuaXRDb25zdHJhaW50XG5cdFx0ICApXG5cdFx0OiAoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHVuaXQsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+KTtcblxuXHRyZXR1cm4gYWRkVHlwZUluZm9ybWF0aW9uKFtwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLCB1bml0QmluZGluZ0V4cHJlc3Npb25dLCBjb21wbGV4VHlwZSwgdW5kZWZpbmVkLCBmb3JtYXRPcHRpb25zKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nRm9yVW5pdE9yQ3VycmVuY3kgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGhcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+IHwgc3RyaW5nIHtcblx0Y29uc3Qgb1Byb3BlcnR5RGVmaW5pdGlvbiA9IG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5O1xuXG5cdGxldCB1bml0ID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdGlmICh1bml0Py50b1N0cmluZygpID09PSBcIiVcIikge1xuXHRcdHJldHVybiBjb25zdGFudChcIiVcIik7XG5cdH1cblx0Y29uc3QgcmVsYXRpdmVMb2NhdGlvbiA9IGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uKFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGguY29udGV4dExvY2F0aW9uLFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXNcblx0KS5tYXAoKG5wKSA9PiBucC5uYW1lKTtcblxuXHRjb25zdCBjb21wbGV4VHlwZSA9IHVuaXQgPyBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlVuaXRcIiA6IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuQ3VycmVuY3lcIjtcblx0dW5pdCA9IHVuaXQgPyB1bml0IDogb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5O1xuXHRjb25zdCB1bml0QmluZGluZ0V4cHJlc3Npb24gPSAodW5pdCBhcyBhbnkpLiR0YXJnZXRcblx0XHQ/IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24oXG5cdFx0XHRcdCh1bml0IGFzIGFueSkuJHRhcmdldCxcblx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHVuaXQsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+XG5cdFx0ICApXG5cdFx0OiAoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHVuaXQsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+KTtcblxuXHRsZXQgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IHBhdGhJbk1vZGVsKFxuXHRcdGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgob1Byb3BlcnR5RGF0YU1vZGVsUGF0aClcblx0KSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPjtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiwgdHJ1ZSk7XG5cdHJldHVybiBhZGRUeXBlSW5mb3JtYXRpb24oW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIHVuaXRCaW5kaW5nRXhwcmVzc2lvbl0sIGNvbXBsZXhUeXBlLCB1bmRlZmluZWQsIHtcblx0XHRwYXJzZUtlZXBzRW1wdHlTdHJpbmc6IHRydWUsXG5cdFx0ZW1wdHlTdHJpbmc6IFwiXCIsXG5cdFx0c2hvd051bWJlcjogZmFsc2Vcblx0fSk7XG59O1xuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdXaXRoVGltZXpvbmUgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+LFxuXHRpZ25vcmVVbml0Q29uc3RyYWludD86IGJvb2xlYW4sXG5cdGhpZGVUaW1lem9uZUZvckVtcHR5VmFsdWVzPzogYm9vbGVhblxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gb1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHk7XG5cdGNvbnN0IHRpbWV6b25lID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UaW1lem9uZTtcblx0Y29uc3QgcmVsYXRpdmVMb2NhdGlvbiA9IGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uKFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGguY29udGV4dExvY2F0aW9uLFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXNcblx0KS5tYXAoKG5wKSA9PiBucC5uYW1lKTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbik7XG5cblx0Y29uc3QgY29tcGxleFR5cGUgPSBcInNhcC5mZS5jb3JlLnR5cGUuRGF0ZVRpbWVXaXRoVGltZXpvbmVcIjtcblx0Y29uc3QgdW5pdEJpbmRpbmdFeHByZXNzaW9uID0gKHRpbWV6b25lIGFzIGFueSkuJHRhcmdldFxuXHRcdD8gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihcblx0XHRcdFx0KHRpbWV6b25lIGFzIGFueSkuJHRhcmdldCxcblx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHRpbWV6b25lLCByZWxhdGl2ZUxvY2F0aW9uKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPixcblx0XHRcdFx0aWdub3JlVW5pdENvbnN0cmFpbnRcblx0XHQgIClcblx0XHQ6IChnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odGltZXpvbmUsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+KTtcblx0bGV0IGZvcm1hdE9wdGlvbnM7XG5cdGlmIChoaWRlVGltZXpvbmVGb3JFbXB0eVZhbHVlcykge1xuXHRcdGZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRzaG93VGltZXpvbmVGb3JFbXB0eVZhbHVlczogZmFsc2Vcblx0XHR9O1xuXHR9XG5cdHJldHVybiBhZGRUeXBlSW5mb3JtYXRpb24oW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIHVuaXRCaW5kaW5nRXhwcmVzc2lvbl0sIGNvbXBsZXhUeXBlLCB1bmRlZmluZWQsIGZvcm1hdE9wdGlvbnMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFsaWdubWVudEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdG9Db21wdXRlZEVkaXRNb2RlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPixcblx0c0FsaWduRGlzcGxheTogc3RyaW5nID0gXCJCZWdpblwiLFxuXHRzQWxpZ25FZGl0OiBzdHJpbmcgPSBcIkJlZ2luXCJcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oaWZFbHNlKGVxdWFsKG9Db21wdXRlZEVkaXRNb2RlLCBcIkRpc3BsYXlcIiksIHNBbGlnbkRpc3BsYXksIHNBbGlnbkVkaXQpKTtcbn07XG5cbi8qKlxuICogRm9ybWF0dGVyIGhlbHBlciB0byByZXRyaWV2ZSB0aGUgY29udmVydGVyQ29udGV4dCBmcm9tIHRoZSBtZXRhbW9kZWwgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIG9yaWdpbmFsIG1ldGFtb2RlbCBjb250ZXh0XG4gKiBAcGFyYW0gb0ludGVyZmFjZSBUaGUgY3VycmVudCB0ZW1wbGF0aW5nIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBDb252ZXJ0ZXJDb250ZXh0IHJlcHJlc2VudGluZyB0aGF0IG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgZ2V0Q29udmVydGVyQ29udGV4dCA9IGZ1bmN0aW9uIChvQ29udGV4dDogTWV0YU1vZGVsQ29udGV4dCwgb0ludGVyZmFjZTogQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlKTogb2JqZWN0IHwgbnVsbCB7XG5cdGlmIChvSW50ZXJmYWNlICYmIG9JbnRlcmZhY2UuY29udGV4dCkge1xuXHRcdHJldHVybiBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dChvSW50ZXJmYWNlLmNvbnRleHQpO1xuXHR9XG5cdHJldHVybiBudWxsO1xufTtcbmdldENvbnZlcnRlckNvbnRleHQucmVxdWlyZXNJQ29udGV4dCA9IHRydWU7XG5cbi8qKlxuICogRm9ybWF0dGVyIGhlbHBlciB0byByZXRyaWV2ZSB0aGUgZGF0YSBtb2RlbCBvYmplY3RzIHRoYXQgYXJlIGludm9sdmVkIGZyb20gdGhlIG1ldGFtb2RlbCBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgb3JpZ2luYWwgT0RhdGFNZXRhTW9kZWwgY29udGV4dFxuICogQHBhcmFtIG9JbnRlcmZhY2UgVGhlIGN1cnJlbnQgdGVtcGxhdGluZyBjb250ZXh0XG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBlbnRpdHlzZXRzIGFuZCBuYXZwcm9wZXJ0aWVzIHRoYXQgYXJlIGludm9sdmVkIHRvIGdldCB0byBhIHNwZWNpZmljIG9iamVjdCBpbiB0aGUgbWV0YW1vZGVsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXREYXRhTW9kZWxPYmplY3RQYXRoID0gZnVuY3Rpb24gKFxuXHRvQ29udGV4dDogTWV0YU1vZGVsQ29udGV4dCxcblx0b0ludGVyZmFjZTogQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlXG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHwgbnVsbCB7XG5cdGlmIChvSW50ZXJmYWNlICYmIG9JbnRlcmZhY2UuY29udGV4dCkge1xuXHRcdHJldHVybiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob0ludGVyZmFjZS5jb250ZXh0KTtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn07XG5nZXREYXRhTW9kZWxPYmplY3RQYXRoLnJlcXVpcmVzSUNvbnRleHQgPSB0cnVlO1xuXG5leHBvcnQgY29uc3QgaXNDb2xsZWN0aW9uRmllbGQgPSBmdW5jdGlvbiAob0RhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgpOiBib29sZWFuIHtcblx0aWYgKG9EYXRhTW9kZWxQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRjb25zdCBoYXNPbmVUb01hbnlOYXZpZ2F0aW9uID1cblx0XHRcdG9EYXRhTW9kZWxQYXRoPy5uYXZpZ2F0aW9uUHJvcGVydGllcy5maW5kSW5kZXgoKG9OYXY6IE5hdmlnYXRpb25Qcm9wZXJ0eSkgPT4ge1xuXHRcdFx0XHRpZiAob05hdi5pc0NvbGxlY3Rpb24pIHtcblx0XHRcdFx0XHRpZiAob0RhdGFNb2RlbFBhdGguY29udGV4dExvY2F0aW9uPy5uYXZpZ2F0aW9uUHJvcGVydGllcz8ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHQvL3dlIGNoZWNrIHRoZSBvbmUgdG8gbWFueSBuYXYgaXMgbm90IGFscmVhZHkgcGFydCBvZiB0aGUgY29udGV4dFxuXHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0b0RhdGFNb2RlbFBhdGguY29udGV4dExvY2F0aW9uPy5uYXZpZ2F0aW9uUHJvcGVydGllcy5maW5kSW5kZXgoXG5cdFx0XHRcdFx0XHRcdFx0KG9Db250ZXh0TmF2OiBOYXZpZ2F0aW9uUHJvcGVydHkpID0+IG9Db250ZXh0TmF2Lm5hbWUgPT09IG9OYXYubmFtZVxuXHRcdFx0XHRcdFx0XHQpID09PSAtMVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSkgPiAtMTtcblx0XHRpZiAoaGFzT25lVG9NYW55TmF2aWdhdGlvbikge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRFeHByZXNzaW9uQXNPYmplY3QgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFGaWVsZENvbnZlcnRlZD86IGFueSxcblx0Zm9yY2VFZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gZ2V0UmVxdWlyZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgsIG9EYXRhRmllbGRDb252ZXJ0ZWQsIGZvcmNlRWRpdE1vZGUsIHRydWUpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcbn07XG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ/OiBhbnksXG5cdGZvcmNlRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0YkFzT2JqZWN0OiBib29sZWFuID0gZmFsc2UsXG5cdG9SZXF1aXJlZFByb3BlcnRpZXM6IGFueSA9IHt9XG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGxldCByZXR1cm5FeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdGNvbnN0IGFSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zID0gb1JlcXVpcmVkUHJvcGVydGllcy5yZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zIHx8IFtdO1xuXHRjb25zdCBhUmVxdWlyZWRQcm9wZXJ0aWVzRnJvbVVwZGF0ZVJlc3RyaWN0aW9ucyA9IG9SZXF1aXJlZFByb3BlcnRpZXMucmVxdWlyZWRQcm9wZXJ0aWVzRnJvbVVwZGF0ZVJlc3RyaWN0aW9ucyB8fCBbXTtcblx0aWYgKCFvUHJvcGVydHlQYXRoIHx8IHR5cGVvZiBvUHJvcGVydHlQYXRoID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuRXhwcmVzc2lvbiA9IGNvbnN0YW50KGZhbHNlKTtcblx0fSBlbHNlIHtcblx0XHRsZXQgZGF0YUZpZWxkUmVxdWlyZWRFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudCh0cnVlKTtcblx0XHRpZiAob0RhdGFGaWVsZENvbnZlcnRlZCAhPT0gbnVsbCkge1xuXHRcdFx0ZGF0YUZpZWxkUmVxdWlyZWRFeHByZXNzaW9uID0gaXNSZXF1aXJlZEV4cHJlc3Npb24ob0RhdGFGaWVsZENvbnZlcnRlZCk7XG5cdFx0fVxuXHRcdGxldCByZXF1aXJlZFByb3BlcnR5RnJvbUluc2VydFJlc3RyaWN0aW9uc0V4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IGNvbnN0YW50KGZhbHNlKTtcblx0XHRsZXQgcmVxdWlyZWRQcm9wZXJ0eUZyb21VcGRhdGVSZXN0cmljdGlvbnNFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudChmYWxzZSk7XG5cblx0XHRjb25zdCBvUHJvcGVydHk6IFByb3BlcnR5ID0gKGlzUGF0aEV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgJiYgb1Byb3BlcnR5UGF0aC4kdGFyZ2V0KSB8fCAob1Byb3BlcnR5UGF0aCBhcyBQcm9wZXJ0eSk7XG5cdFx0Ly8gRW5hYmxlbWVudCBkZXBlbmRzIG9uIHRoZSBmaWVsZCBjb250cm9sIGV4cHJlc3Npb25cblx0XHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBzdGF0aWNhbGx5IGluIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpIC0+IG5vdCBlbmFibGVkXG5cdFx0Y29uc3QgcmVxdWlyZWRFeHByZXNzaW9uID0gaXNSZXF1aXJlZEV4cHJlc3Npb24ob1Byb3BlcnR5KTtcblx0XHRjb25zdCBlZGl0TW9kZSA9IGZvcmNlRWRpdE1vZGUgfHwgVUkuSXNFZGl0YWJsZTtcblx0XHRpZiAoXG5cdFx0XHRhUmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucy5sZW5ndGggJiZcblx0XHRcdGFSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zLmluY2x1ZGVzKChvUHJvcGVydHlQYXRoIGFzIGFueSkubmFtZSlcblx0XHQpIHtcblx0XHRcdHJlcXVpcmVkUHJvcGVydHlGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zRXhwcmVzc2lvbiA9IGFuZChjb25zdGFudCh0cnVlKSwgVUkuSXNDcmVhdGVNb2RlKTtcblx0XHR9XG5cdFx0aWYgKFxuXHRcdFx0YVJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnMubGVuZ3RoICYmXG5cdFx0XHRhUmVxdWlyZWRQcm9wZXJ0aWVzRnJvbVVwZGF0ZVJlc3RyaWN0aW9ucy5pbmNsdWRlcygob1Byb3BlcnR5UGF0aCBhcyBhbnkpLm5hbWUpXG5cdFx0KSB7XG5cdFx0XHRyZXF1aXJlZFByb3BlcnR5RnJvbVVwZGF0ZVJlc3RyaWN0aW9uc0V4cHJlc3Npb24gPSBhbmQoY29uc3RhbnQodHJ1ZSksIG5vdEVxdWFsKFVJLklzQ3JlYXRlTW9kZSwgdHJ1ZSkpO1xuXHRcdH1cblx0XHRyZXR1cm5FeHByZXNzaW9uID0gb3IoXG5cdFx0XHRhbmQob3IocmVxdWlyZWRFeHByZXNzaW9uLCBkYXRhRmllbGRSZXF1aXJlZEV4cHJlc3Npb24pLCBlZGl0TW9kZSksXG5cdFx0XHRyZXF1aXJlZFByb3BlcnR5RnJvbUluc2VydFJlc3RyaWN0aW9uc0V4cHJlc3Npb24sXG5cdFx0XHRyZXF1aXJlZFByb3BlcnR5RnJvbVVwZGF0ZVJlc3RyaWN0aW9uc0V4cHJlc3Npb25cblx0XHQpO1xuXHR9XG5cblx0aWYgKGJBc09iamVjdCkge1xuXHRcdHJldHVybiByZXR1cm5FeHByZXNzaW9uO1xuXHR9XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihyZXR1cm5FeHByZXNzaW9uKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXF1aXJlZEV4cHJlc3Npb25Gb3JDb25uZWN0ZWREYXRhRmllbGQgPSBmdW5jdGlvbiAoXG5cdGRhdGFGaWVsZE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGhcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3QgZGF0YSA9IGRhdGFGaWVsZE9iamVjdFBhdGg/LnRhcmdldE9iamVjdD8uJHRhcmdldD8uRGF0YTtcblx0Y29uc3Qga2V5czogQXJyYXk8c3RyaW5nPiA9IE9iamVjdC5rZXlzKGRhdGEpO1xuXHRjb25zdCBkYXRhRmllbGRzID0gW107XG5cdGxldCBwcm9wZXJ0eVBhdGg7XG5cdGNvbnN0IGlzUmVxdWlyZWRFeHByZXNzaW9uczogKENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+KVtdIHwgdW5kZWZpbmVkID0gW107XG5cdGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcblx0XHRpZiAoZGF0YVtrZXldW1wiJFR5cGVcIl0gJiYgZGF0YVtrZXldW1wiJFR5cGVcIl0uaW5kZXhPZihcIkRhdGFGaWVsZFwiKSA+IC0xKSB7XG5cdFx0XHRkYXRhRmllbGRzLnB1c2goZGF0YVtrZXldKTtcblx0XHR9XG5cdH1cblx0Zm9yIChjb25zdCBkYXRhRmllbGQgb2YgZGF0YUZpZWxkcykge1xuXHRcdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0XHRpZiAodHlwZW9mIGRhdGFGaWVsZC5WYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdHByb3BlcnR5UGF0aCA9IGRhdGFGaWVsZC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0XHRpZiAoZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0KSB7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQgfHxcblx0XHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQuVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlQYXRoID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgZGF0YUZpZWxkLlRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVBhdGggPSBkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHQvLyBubyBkZWZhdWx0XG5cdFx0fVxuXHRcdGlzUmVxdWlyZWRFeHByZXNzaW9ucy5wdXNoKGdldFJlcXVpcmVkRXhwcmVzc2lvbkFzT2JqZWN0KHByb3BlcnR5UGF0aCwgZGF0YUZpZWxkLCBmYWxzZSkpO1xuXHR9XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihvciguLi4oaXNSZXF1aXJlZEV4cHJlc3Npb25zIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdKSkpO1xufTtcbiJdfQ==