@sapui5/sap.fe.core 1.131.0 → 1.133.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 (317) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +17 -23
  4. package/src/sap/fe/core/AppComponent.js +74 -36
  5. package/src/sap/fe/core/AppComponent.ts +70 -3
  6. package/src/sap/fe/core/AppStateHandler.js +44 -13
  7. package/src/sap/fe/core/AppStateHandler.ts +38 -0
  8. package/src/sap/fe/core/BaseController.js +3 -3
  9. package/src/sap/fe/core/CommonUtils.js +30 -37
  10. package/src/sap/fe/core/CommonUtils.ts +15 -13
  11. package/src/sap/fe/core/ExtensionAPI.js +29 -34
  12. package/src/sap/fe/core/ExtensionAPI.ts +3 -0
  13. package/src/sap/fe/core/InsightsFormattersExtension.js +2 -2
  14. package/src/sap/fe/core/PageController.js +40 -31
  15. package/src/sap/fe/core/PageController.ts +14 -1
  16. package/src/sap/fe/core/ResourceModel.js +4 -4
  17. package/src/sap/fe/core/ReuseComponent.js +27 -13
  18. package/src/sap/fe/core/ReuseComponent.ts +18 -0
  19. package/src/sap/fe/core/TemplateComponent.js +102 -89
  20. package/src/sap/fe/core/TemplateComponent.ts +20 -1
  21. package/src/sap/fe/core/TemplateModel.js +6 -7
  22. package/src/sap/fe/core/UIProvider.js +1 -1
  23. package/src/sap/fe/core/UIProvider.ts +2 -9
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +63 -48
  25. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +56 -27
  26. package/src/sap/fe/core/buildingBlocks/IBuildingBlockOwnerComponent.js +9 -0
  27. package/src/sap/fe/core/buildingBlocks/IBuildingBlockOwnerComponent.ts +48 -0
  28. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +4 -6
  29. package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +2 -2
  30. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +2 -3
  31. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +32 -18
  32. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +30 -3
  33. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +9 -13
  34. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +2 -1
  35. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlock.js +2 -2
  36. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +19 -25
  37. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +1 -1
  38. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +3 -4
  39. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +20 -24
  40. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +10 -15
  41. package/src/sap/fe/core/controllerextensions/ContextSharing.js +3 -3
  42. package/src/sap/fe/core/controllerextensions/EditFlow.js +296 -246
  43. package/src/sap/fe/core/controllerextensions/EditFlow.ts +253 -175
  44. package/src/sap/fe/core/controllerextensions/Feedback.js +10 -11
  45. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +6 -6
  46. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -0
  47. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +27 -36
  48. package/src/sap/fe/core/controllerextensions/InternalRouting.js +57 -78
  49. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +42 -50
  50. package/src/sap/fe/core/controllerextensions/KPIManagement.js +12 -19
  51. package/src/sap/fe/core/controllerextensions/MessageHandler.js +23 -17
  52. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -7
  53. package/src/sap/fe/core/controllerextensions/PageReady.js +15 -21
  54. package/src/sap/fe/core/controllerextensions/Paginator.js +3 -3
  55. package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -3
  56. package/src/sap/fe/core/controllerextensions/Recommendations.js +23 -36
  57. package/src/sap/fe/core/controllerextensions/Recommendations.ts +1 -1
  58. package/src/sap/fe/core/controllerextensions/Routing.js +3 -3
  59. package/src/sap/fe/core/controllerextensions/Share.js +19 -28
  60. package/src/sap/fe/core/controllerextensions/SideEffects.js +68 -32
  61. package/src/sap/fe/core/controllerextensions/SideEffects.ts +58 -6
  62. package/src/sap/fe/core/controllerextensions/Telemetry.js +4 -5
  63. package/src/sap/fe/core/controllerextensions/ViewState.js +23 -24
  64. package/src/sap/fe/core/controllerextensions/ViewState.ts +6 -1
  65. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +13 -10
  66. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +13 -8
  67. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  68. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +15 -16
  69. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +3 -4
  70. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.js +288 -0
  71. package/src/sap/fe/core/controllerextensions/dialog/{OperationsDialog.block.tsx → OperationsDialog.tsx} +27 -29
  72. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +41 -5
  73. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +61 -8
  74. package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.js +404 -0
  75. package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.ts +502 -0
  76. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +35 -43
  77. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +34 -14
  78. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -27
  79. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +27 -15
  80. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +51 -39
  81. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +75 -34
  82. package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +4 -4
  83. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +88 -427
  84. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +82 -620
  85. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +9 -5
  86. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +6 -5
  87. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +116 -79
  88. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +87 -13
  89. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +4 -6
  90. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +5 -7
  91. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +6 -7
  92. package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +4 -4
  93. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +58 -20
  94. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +55 -4
  95. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +1 -1
  96. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.ts +1 -1
  97. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributorMixin.js +9 -12
  98. package/src/sap/fe/core/controls/CommandExecution.js +2 -2
  99. package/src/sap/fe/core/controls/ComponentLoader.js +20 -21
  100. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +250 -0
  101. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/{DraftDataLossDialog.block.tsx → DraftDataLossDialog.tsx} +31 -19
  102. package/src/sap/fe/core/controls/FormElementWrapper.js +19 -21
  103. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +114 -0
  104. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +115 -0
  105. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +454 -0
  106. package/src/sap/fe/core/controls/Recommendations/{ConfirmRecommendationDialog.block.tsx → ConfirmRecommendationDialog.tsx} +5 -9
  107. package/src/sap/fe/core/converters/ConverterContext.js +17 -18
  108. package/src/sap/fe/core/converters/ConverterContext.ts +10 -15
  109. package/src/sap/fe/core/converters/ManifestSettings.js +29 -28
  110. package/src/sap/fe/core/converters/ManifestSettings.ts +22 -1
  111. package/src/sap/fe/core/converters/ManifestWrapper.js +26 -48
  112. package/src/sap/fe/core/converters/MetaModelConverter.js +21 -28
  113. package/src/sap/fe/core/converters/MetaModelConverter.ts +2 -0
  114. package/src/sap/fe/core/converters/TemplateConverter.js +17 -21
  115. package/src/sap/fe/core/converters/TemplateConverter.ts +5 -3
  116. package/src/sap/fe/core/converters/annotations/DataField.js +69 -66
  117. package/src/sap/fe/core/converters/annotations/DataField.ts +30 -0
  118. package/src/sap/fe/core/converters/common/AnnotationConverter.js +20 -23
  119. package/src/sap/fe/core/converters/controls/Common/Action.js +178 -43
  120. package/src/sap/fe/core/converters/controls/Common/Action.ts +202 -19
  121. package/src/sap/fe/core/converters/controls/Common/Chart.js +47 -22
  122. package/src/sap/fe/core/converters/controls/Common/Chart.ts +50 -5
  123. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +16 -23
  124. package/src/sap/fe/core/converters/controls/Common/Form.js +25 -38
  125. package/src/sap/fe/core/converters/controls/Common/Form.ts +3 -0
  126. package/src/sap/fe/core/converters/controls/Common/KPI.js +32 -47
  127. package/src/sap/fe/core/converters/controls/Common/Table.js +464 -506
  128. package/src/sap/fe/core/converters/controls/Common/Table.ts +335 -219
  129. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +17 -28
  130. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +1 -2
  131. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +66 -90
  132. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +10 -1
  133. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +49 -73
  134. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +6 -10
  135. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +35 -50
  136. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +110 -60
  137. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +137 -41
  138. package/src/sap/fe/core/converters/helpers/Aggregation.js +19 -30
  139. package/src/sap/fe/core/converters/helpers/Aggregation.ts +5 -5
  140. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +11 -14
  141. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +14 -21
  142. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +4 -6
  143. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -7
  144. package/src/sap/fe/core/converters/helpers/Key.js +1 -1
  145. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -3
  146. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +18 -52
  147. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -34
  148. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +103 -74
  149. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +111 -39
  150. package/src/sap/fe/core/converters/templates/ListReportConverter.js +28 -31
  151. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +17 -9
  152. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +61 -52
  153. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +60 -21
  154. package/src/sap/fe/core/definition/FEDefinition.js +104 -44
  155. package/src/sap/fe/core/designtime/AppComponent.designtime.js +37 -7
  156. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +42 -2
  157. package/src/sap/fe/core/formatters/CollaborationFormatter.js +4 -5
  158. package/src/sap/fe/core/formatters/FiscalFormat.js +24 -24
  159. package/src/sap/fe/core/formatters/ValueFormatter.js +4 -23
  160. package/src/sap/fe/core/formatters/ValueFormatter.ts +0 -18
  161. package/src/sap/fe/core/fpm/Component.js +12 -14
  162. package/src/sap/fe/core/fpm/manifest.json +1 -1
  163. package/src/sap/fe/core/helpers/AppStartupHelper.js +20 -15
  164. package/src/sap/fe/core/helpers/AppStartupHelper.ts +22 -13
  165. package/src/sap/fe/core/helpers/BindingHelper.js +3 -3
  166. package/src/sap/fe/core/helpers/BindingHelper.ts +1 -1
  167. package/src/sap/fe/core/helpers/DeleteHelper.js +55 -62
  168. package/src/sap/fe/core/helpers/DeleteHelper.ts +48 -51
  169. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +4 -7
  170. package/src/sap/fe/core/helpers/FPMHelper.js +4 -7
  171. package/src/sap/fe/core/helpers/HTTP503Handler.js +2 -1
  172. package/src/sap/fe/core/helpers/HTTP503Handler.ts +4 -3
  173. package/src/sap/fe/core/helpers/KeepAliveHelper.js +5 -5
  174. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +6 -6
  175. package/src/sap/fe/core/helpers/LoaderUtils.js +8 -3
  176. package/src/sap/fe/core/helpers/LoaderUtils.ts +15 -4
  177. package/src/sap/fe/core/helpers/MessageStrip.js +3 -4
  178. package/src/sap/fe/core/helpers/MetaModelFunction.js +26 -40
  179. package/src/sap/fe/core/helpers/MetaPath.js +9 -7
  180. package/src/sap/fe/core/helpers/MetaPath.ts +9 -3
  181. package/src/sap/fe/core/helpers/ModelHelper.js +33 -57
  182. package/src/sap/fe/core/helpers/ModelHelper.ts +3 -3
  183. package/src/sap/fe/core/helpers/PasteHelper.js +11 -19
  184. package/src/sap/fe/core/helpers/PromiseKeeper.js +1 -1
  185. package/src/sap/fe/core/helpers/RecommendationHelper.js +3 -4
  186. package/src/sap/fe/core/helpers/ResourceModelHelper.js +3 -5
  187. package/src/sap/fe/core/helpers/SizeHelper.js +3 -5
  188. package/src/sap/fe/core/helpers/StableIdHelper.js +13 -11
  189. package/src/sap/fe/core/helpers/StableIdHelper.ts +5 -1
  190. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +28 -38
  191. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  192. package/src/sap/fe/core/helpers/TitleHelper.js +19 -40
  193. package/src/sap/fe/core/helpers/TitleHelper.ts +5 -25
  194. package/src/sap/fe/core/helpers/TypeGuards.js +25 -18
  195. package/src/sap/fe/core/helpers/TypeGuards.ts +7 -0
  196. package/src/sap/fe/core/helpers/WebSocket.js +4 -4
  197. package/src/sap/fe/core/library.js +8 -7
  198. package/src/sap/fe/core/library.ts +2 -0
  199. package/src/sap/fe/core/manifestMerger/AddNewPage.js +9 -11
  200. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +14 -25
  201. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +15 -17
  202. package/src/sap/fe/core/messagebundle.properties +21 -0
  203. package/src/sap/fe/core/messagebundle_ar.properties +5 -1
  204. package/src/sap/fe/core/messagebundle_bg.properties +4 -0
  205. package/src/sap/fe/core/messagebundle_ca.properties +4 -0
  206. package/src/sap/fe/core/messagebundle_cnr.properties +4 -0
  207. package/src/sap/fe/core/messagebundle_cs.properties +8 -4
  208. package/src/sap/fe/core/messagebundle_cy.properties +4 -0
  209. package/src/sap/fe/core/messagebundle_da.properties +4 -0
  210. package/src/sap/fe/core/messagebundle_de.properties +4 -0
  211. package/src/sap/fe/core/messagebundle_el.properties +4 -0
  212. package/src/sap/fe/core/messagebundle_en.properties +4 -0
  213. package/src/sap/fe/core/messagebundle_en_GB.properties +4 -0
  214. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +4 -0
  215. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +249 -231
  216. package/src/sap/fe/core/messagebundle_es.properties +5 -1
  217. package/src/sap/fe/core/messagebundle_es_MX.properties +4 -0
  218. package/src/sap/fe/core/messagebundle_et.properties +4 -0
  219. package/src/sap/fe/core/messagebundle_fi.properties +4 -0
  220. package/src/sap/fe/core/messagebundle_fr.properties +6 -2
  221. package/src/sap/fe/core/messagebundle_fr_CA.properties +4 -0
  222. package/src/sap/fe/core/messagebundle_hi.properties +4 -0
  223. package/src/sap/fe/core/messagebundle_hr.properties +4 -0
  224. package/src/sap/fe/core/messagebundle_hu.properties +4 -0
  225. package/src/sap/fe/core/messagebundle_id.properties +4 -0
  226. package/src/sap/fe/core/messagebundle_it.properties +4 -0
  227. package/src/sap/fe/core/messagebundle_iw.properties +4 -0
  228. package/src/sap/fe/core/messagebundle_ja.properties +4 -0
  229. package/src/sap/fe/core/messagebundle_kk.properties +4 -0
  230. package/src/sap/fe/core/messagebundle_ko.properties +4 -0
  231. package/src/sap/fe/core/messagebundle_lt.properties +4 -0
  232. package/src/sap/fe/core/messagebundle_lv.properties +4 -0
  233. package/src/sap/fe/core/messagebundle_mk.properties +4 -0
  234. package/src/sap/fe/core/messagebundle_ms.properties +4 -0
  235. package/src/sap/fe/core/messagebundle_nl.properties +4 -0
  236. package/src/sap/fe/core/messagebundle_no.properties +4 -0
  237. package/src/sap/fe/core/messagebundle_pl.properties +4 -0
  238. package/src/sap/fe/core/messagebundle_pt.properties +4 -0
  239. package/src/sap/fe/core/messagebundle_pt_PT.properties +4 -0
  240. package/src/sap/fe/core/messagebundle_ro.properties +4 -0
  241. package/src/sap/fe/core/messagebundle_ru.properties +4 -0
  242. package/src/sap/fe/core/messagebundle_sh.properties +4 -0
  243. package/src/sap/fe/core/messagebundle_sk.properties +4 -0
  244. package/src/sap/fe/core/messagebundle_sl.properties +4 -0
  245. package/src/sap/fe/core/messagebundle_sr.properties +4 -0
  246. package/src/sap/fe/core/messagebundle_sv.properties +4 -0
  247. package/src/sap/fe/core/messagebundle_th.properties +4 -0
  248. package/src/sap/fe/core/messagebundle_tr.properties +5 -1
  249. package/src/sap/fe/core/messagebundle_uk.properties +4 -0
  250. package/src/sap/fe/core/messagebundle_vi.properties +4 -0
  251. package/src/sap/fe/core/messagebundle_zh_CN.properties +4 -0
  252. package/src/sap/fe/core/messagebundle_zh_TW.properties +4 -0
  253. package/src/sap/fe/core/operationsHelper.js +23 -27
  254. package/src/sap/fe/core/operationsHelper.ts +6 -7
  255. package/src/sap/fe/core/rootView/Fcl.controller.js +53 -40
  256. package/src/sap/fe/core/rootView/Fcl.controller.ts +42 -7
  257. package/src/sap/fe/core/rootView/NavContainer.controller.js +7 -10
  258. package/src/sap/fe/core/rootView/RootViewBaseController.js +22 -21
  259. package/src/sap/fe/core/rootView/RootViewBaseController.ts +10 -2
  260. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
  261. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +4 -3
  262. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +1 -0
  263. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +12 -10
  264. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +6 -2
  265. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +8 -13
  266. package/src/sap/fe/core/services/ContextSharingServiceFactory.js +5 -7
  267. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +31 -8
  268. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +31 -5
  269. package/src/sap/fe/core/services/InlineEditServiceFactory.js +190 -0
  270. package/src/sap/fe/core/services/InlineEditServiceFactory.ts +226 -0
  271. package/src/sap/fe/core/services/NavigationServiceFactory.js +10 -15
  272. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
  273. package/src/sap/fe/core/services/RoutingServiceFactory.js +76 -56
  274. package/src/sap/fe/core/services/RoutingServiceFactory.ts +47 -14
  275. package/src/sap/fe/core/services/ShellServicesFactory.js +32 -34
  276. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +75 -60
  277. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +58 -12
  278. package/src/sap/fe/core/services/TelemetryServiceFactory.js +8 -9
  279. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +13 -18
  280. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +3 -0
  281. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +7 -9
  282. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +12 -16
  283. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +1 -1
  284. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +4 -7
  285. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +5 -6
  286. package/src/sap/fe/core/support/CommonHelper.js +2 -3
  287. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  288. package/src/sap/fe/core/templating/ActionHelper.js +3 -4
  289. package/src/sap/fe/core/templating/CommonFormatters.js +6 -8
  290. package/src/sap/fe/core/templating/CommonFormatters.ts +2 -2
  291. package/src/sap/fe/core/templating/CriticalityFormatters.js +53 -5
  292. package/src/sap/fe/core/templating/CriticalityFormatters.ts +129 -7
  293. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -11
  294. package/src/sap/fe/core/templating/DataFieldFormatters.ts +1 -1
  295. package/src/sap/fe/core/templating/DataModelPathHelper.js +33 -56
  296. package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
  297. package/src/sap/fe/core/templating/EntitySetHelper.js +11 -19
  298. package/src/sap/fe/core/templating/EntityTypeHelper.js +4 -5
  299. package/src/sap/fe/core/templating/FieldControlHelper.js +13 -20
  300. package/src/sap/fe/core/templating/FilterTemplating.js +6 -9
  301. package/src/sap/fe/core/templating/PropertyHelper.js +33 -63
  302. package/src/sap/fe/core/templating/PropertyHelper.ts +0 -1
  303. package/src/sap/fe/core/templating/SemanticObjectHelper.js +13 -21
  304. package/src/sap/fe/core/templating/UIFormatters.js +57 -78
  305. package/src/sap/fe/core/templating/UIFormatters.ts +2 -1
  306. package/src/sap/fe/core/type/Date.js +2 -2
  307. package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -3
  308. package/src/sap/fe/core/type/EDM.js +3 -5
  309. package/src/sap/fe/core/type/Email.js +17 -6
  310. package/src/sap/fe/core/type/Email.ts +23 -4
  311. package/src/sap/fe/core/type/FiscalDate.js +8 -9
  312. package/src/sap/fe/core/type/InputMask.js +3 -4
  313. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +0 -299
  314. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +0 -87
  315. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +0 -43
  316. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +0 -251
  317. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +0 -471
@@ -5,13 +5,13 @@
5
5
  sap.ui.define([], function () {
6
6
  "use strict";
7
7
 
8
- var NavigationReason;
9
- (function (NavigationReason) {
8
+ var NavigationReason = /*#__PURE__*/function (NavigationReason) {
10
9
  NavigationReason["RowPress"] = "RowPress";
11
10
  NavigationReason["AppStateChanged"] = "AppStateChanged";
12
11
  NavigationReason["RestoreHistory"] = "RestoreHistory";
13
12
  NavigationReason["EditFlowAction"] = "EditFlowAction";
14
- })(NavigationReason || (NavigationReason = {}));
13
+ return NavigationReason;
14
+ }(NavigationReason || {});
15
15
  return NavigationReason;
16
16
  }, false);
17
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZpZ2F0aW9uUmVhc29uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJOYXZpZ2F0aW9uUmVhc29uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImVudW0gTmF2aWdhdGlvblJlYXNvbiB7XG5cdFJvd1ByZXNzID0gXCJSb3dQcmVzc1wiLFxuXHRBcHBTdGF0ZUNoYW5nZWQgPSBcIkFwcFN0YXRlQ2hhbmdlZFwiLFxuXHRSZXN0b3JlSGlzdG9yeSA9IFwiUmVzdG9yZUhpc3RvcnlcIixcblx0RWRpdEZsb3dBY3Rpb24gPSBcIkVkaXRGbG93QWN0aW9uXCJcbn1cblxuZXhwb3J0IGRlZmF1bHQgTmF2aWdhdGlvblJlYXNvbjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztNQUFLQSxnQkFBZ0I7RUFBQSxXQUFoQkEsZ0JBQWdCO0lBQWhCQSxnQkFBZ0I7SUFBaEJBLGdCQUFnQjtJQUFoQkEsZ0JBQWdCO0lBQWhCQSxnQkFBZ0I7RUFBQSxHQUFoQkEsZ0JBQWdCLEtBQWhCQSxnQkFBZ0I7RUFBQSxPQU9OQSxnQkFBZ0I7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
17
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZpZ2F0aW9uUmVhc29uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJOYXZpZ2F0aW9uUmVhc29uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImVudW0gTmF2aWdhdGlvblJlYXNvbiB7XG5cdFJvd1ByZXNzID0gXCJSb3dQcmVzc1wiLFxuXHRBcHBTdGF0ZUNoYW5nZWQgPSBcIkFwcFN0YXRlQ2hhbmdlZFwiLFxuXHRSZXN0b3JlSGlzdG9yeSA9IFwiUmVzdG9yZUhpc3RvcnlcIixcblx0RWRpdEZsb3dBY3Rpb24gPSBcIkVkaXRGbG93QWN0aW9uXCJcbn1cblxuZXhwb3J0IGRlZmF1bHQgTmF2aWdhdGlvblJlYXNvbjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztNQUFLQSxnQkFBZ0IsMEJBQWhCQSxnQkFBZ0I7SUFBaEJBLGdCQUFnQjtJQUFoQkEsZ0JBQWdCO0lBQWhCQSxnQkFBZ0I7SUFBaEJBLGdCQUFnQjtJQUFBLE9BQWhCQSxnQkFBZ0I7RUFBQSxFQUFoQkEsZ0JBQWdCO0VBQUEsT0FPTkEsZ0JBQWdCO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -42,7 +42,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
42
42
  return sHash.replace(new RegExp(`[&?]*${enumURLParams.IAPPSTATEPARAM}=[^&]*`), "");
43
43
  }
44
44
  let RouterProxy = (_dec = defineUI5Class("sap.fe.core.RouterProxy"), _dec(_class = /*#__PURE__*/function (_BaseObject) {
45
- _inheritsLoose(RouterProxy, _BaseObject);
46
45
  function RouterProxy() {
47
46
  var _this;
48
47
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
@@ -59,6 +58,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
59
58
  _this.restoreHistoryTriggered = false;
60
59
  return _this;
61
60
  }
61
+ _inheritsLoose(RouterProxy, _BaseObject);
62
62
  var _proto = RouterProxy.prototype;
63
63
  _proto.init = function init(oAppComponent, isfclEnabled) {
64
64
  // Save the name of the app (including startup parameters) for rebuilding full hashes later
@@ -153,8 +153,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
153
153
  _proto.getFullHash = function getFullHash() {
154
154
  const splitHash = this._oShellServices.splitHash(this.getDecodedWindowHash());
155
155
  if ("appSpecificRoute" in splitHash) {
156
- var _splitHash$appSpecifi;
157
- return ((_splitHash$appSpecifi = splitHash.appSpecificRoute) === null || _splitHash$appSpecifi === void 0 ? void 0 : _splitHash$appSpecifi.replace(/^&\//, "")) ?? ""; // remove the leading "&/"
156
+ return splitHash.appSpecificRoute?.replace(/^&\//, "") ?? ""; // remove the leading "&/"
158
157
  }
159
158
  return "";
160
159
  };
@@ -162,9 +161,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
162
161
  return this._oRouter.getHashChanger().getHash() ?? "";
163
162
  };
164
163
  _proto.getAppNameFromHash = function getAppNameFromHash(hash) {
165
- var _this$_oShellServices;
166
- const splitHash = (_this$_oShellServices = this._oShellServices) === null || _this$_oShellServices === void 0 ? void 0 : _this$_oShellServices.splitHash(hash);
167
- return (splitHash === null || splitHash === void 0 ? void 0 : splitHash.shellPart) ?? "";
164
+ const splitHash = this._oShellServices?.splitHash(hash);
165
+ return splitHash?.shellPart ?? "";
168
166
  };
169
167
  _proto.isFocusForced = function isFocusForced() {
170
168
  return this._bForceFocus;
@@ -311,7 +309,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
311
309
  */;
312
310
  _proto.navTo = async function navTo(sRouteName, oParameters) {
313
311
  const sHash = this._oRouter.getURL(sRouteName, oParameters);
314
- return this.navToHash(sHash, false, oParameters === null || oParameters === void 0 ? void 0 : oParameters.noPreservationCache, false, !(oParameters !== null && oParameters !== void 0 && oParameters.bIsStickyMode));
312
+ return this.navToHash(sHash, false, oParameters?.noPreservationCache, false, !oParameters?.bIsStickyMode);
315
313
  }
316
314
 
317
315
  /**
@@ -468,8 +466,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
468
466
  * @final
469
467
  */;
470
468
  _proto._pushNewState = function _pushNewState(oNewState, bRebuildOnly, bPreserveHistory, bDisableHistoryPreservation) {
471
- const segments = RouterProxy.splitAppSpecificRoute(this.getFullHash());
472
- const sCurrentHash = segments[0] ?? "";
469
+ const sCurrentHash = this.getHash();
473
470
  let lastIndex = this._oManagedHistory.length - 1;
474
471
  let iPopCount = bRebuildOnly ? 1 : 0;
475
472
 
@@ -536,7 +533,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
536
533
  this._oManagedHistory.push(oNewState);
537
534
  if (oLastRemovedItem && removeAppStateInHash(oLastRemovedItem.hash) === removeAppStateInHash(oNewState.hash)) {
538
535
  oNewState.focusControlId = oLastRemovedItem.focusControlId;
536
+ oNewState.secondaryFocusControlId = oLastRemovedItem.secondaryFocusControlId;
539
537
  oNewState.focusInfo = oLastRemovedItem.focusInfo;
538
+ oNewState.secondaryFocusInfo = oLastRemovedItem.secondaryFocusInfo;
540
539
  }
541
540
  }
542
541
 
@@ -598,7 +597,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
598
597
  // eslint-disable-next-line @typescript-eslint/no-this-alias
599
598
  const that = this;
600
599
  return new Promise(resolve => {
601
- var _history$state;
602
600
  this.bIsRebuildHistoryRunning = true;
603
601
  const oTargetState = this._oManagedHistory[this._oManagedHistory.length - 1],
604
602
  newLevel = this._oManagedHistory.length - 1;
@@ -637,7 +635,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
637
635
  that._bIgnoreRestore = true;
638
636
  switch (oHistoryAction.type) {
639
637
  case "replace":
640
- const focusInfo = (_history$state = history.state) === null || _history$state === void 0 ? void 0 : _history$state.focusInfo;
638
+ const focusInfo = history.state?.focusInfo;
641
639
  that._oRouter.getHashChanger().replaceHash(oTargetState.hash);
642
640
  history.replaceState(Object.assign({
643
641
  feLevel: newLevel,
@@ -762,7 +760,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
762
760
  * @returns An array of app-specific route segments.
763
761
  */;
764
762
  RouterProxy.splitAppSpecificRoute = function splitAppSpecificRoute(appSpecificRoute) {
765
- const routeSplit = (appSpecificRoute === null || appSpecificRoute === void 0 ? void 0 : appSpecificRoute.split("&/")) ?? [];
763
+ const routeSplit = appSpecificRoute?.split("&/") ?? [];
766
764
  if (!routeSplit[0]) {
767
765
  routeSplit.shift(); // remove the leading empty segment (the app-specific route starts with "&/")
768
766
  }
@@ -797,6 +795,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
797
795
  return false;
798
796
  }
799
797
 
798
+ /**
799
+ * Checks if a back navigation will exit the app.
800
+ * @returns True if back exits the app
801
+ */;
802
+ _proto.checkIfBackExitsApp = function checkIfBackExitsApp() {
803
+ const splitHash = this.getFullHash();
804
+ const segments = RouterProxy.splitAppSpecificRoute(splitHash);
805
+ if (segments.length > 1) {
806
+ // there is a nested route involved -> assume we are still inside the app
807
+ return false;
808
+ }
809
+
810
+ // If the current hash is the first one in the history, then a navback will exit the app
811
+ const hash = segments[0] ?? "";
812
+ return this._oManagedHistory.length > 0 && this._oManagedHistory[0].hash === hash;
813
+ }
814
+
800
815
  /**
801
816
  * Checks if the last 2 entries in the history share the same context.
802
817
  * @returns `true` if they share the same context.
@@ -820,9 +835,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
820
835
  return removeAppStateInHash(state.hash) === currentHash;
821
836
  });
822
837
  let focusApplied = false;
823
- if (stateForHash !== null && stateForHash !== void 0 && stateForHash.focusControlId) {
824
- const focusControl = Element.getElementById(stateForHash.focusControlId);
825
- focusControl === null || focusControl === void 0 ? void 0 : focusControl.focus(stateForHash.focusInfo);
838
+ if (stateForHash?.focusControlId) {
839
+ let focusControl = Element.getElementById(stateForHash.focusControlId);
840
+ let focusInfo = stateForHash.focusInfo;
841
+ if ((!focusControl || !focusControl.getFocusDomRef()) && stateForHash.secondaryFocusControlId) {
842
+ // The control for focus is either not found or is not displayed on screen (no focusDomRef)
843
+ // --> try the secondary control if there's one
844
+ focusControl = Element.getElementById(stateForHash.secondaryFocusControlId);
845
+ focusInfo = stateForHash.secondaryFocusInfo;
846
+ }
847
+ if (
848
+ // if the control is a busy table, we don't want to focus it.
849
+ // tables have their own handling to restore focus, so we don't want to interfere with that
850
+ focusControl?.getParent()?.isA("sap.ui.mdc.Table") && focusControl.getBusy()) {
851
+ return false;
852
+ }
853
+ focusControl?.focus(focusInfo);
826
854
  focusApplied = focusControl !== undefined;
827
855
  }
828
856
  return focusApplied;
@@ -839,8 +867,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
839
867
  });
840
868
  if (stateForHash) {
841
869
  const focusControl = Element.getActiveElement();
842
- stateForHash.focusControlId = focusControl === null || focusControl === void 0 ? void 0 : focusControl.getId();
843
- stateForHash.focusInfo = focusControl === null || focusControl === void 0 ? void 0 : focusControl.getFocusInfo();
870
+ stateForHash.focusControlId = focusControl?.getId();
871
+ if (focusControl) {
872
+ // The secondary focus control is the parent table if there's one
873
+ let parentTable = focusControl.getParent();
874
+ while (parentTable && !parentTable.isA("sap.ui.table.Table") && !parentTable.isA("sap.m.Table")) {
875
+ parentTable = parentTable.getParent();
876
+ }
877
+ stateForHash.secondaryFocusControlId = parentTable?.getId();
878
+ stateForHash.secondaryFocusInfo = {
879
+ preventScroll: true
880
+ };
881
+ }
882
+ stateForHash.focusInfo = focusControl?.getFocusInfo();
844
883
  }
845
884
  }
846
885
 
@@ -850,7 +889,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
850
889
  * @returns A layout value if it could be found, undefined otherwise.
851
890
  */;
852
891
  _proto.findLayoutForHash = function findLayoutForHash(hash) {
853
- var _targetState;
854
892
  if (!this.fclEnabled) {
855
893
  return undefined;
856
894
  }
@@ -865,10 +903,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
865
903
  targetState = this._oManagedHistory[index];
866
904
  }
867
905
  }
868
- return (_targetState = targetState) === null || _targetState === void 0 ? void 0 : _targetState.sLayout;
906
+ return targetState?.sLayout;
869
907
  };
870
908
  return RouterProxy;
871
909
  }(BaseObject)) || _class);
872
910
  return RouterProxy;
873
911
  }, false);
874
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnVtU3RhdGUiLCJFUVVBTCIsIkNPTVBBVElCTEUiLCJBTkNFU1RPUiIsIkRJRkZFUkVOVCIsImVudW1VUkxQYXJhbXMiLCJMQVlPVVRQQVJBTSIsIklBUFBTVEFURVBBUkFNIiwiY3JlYXRlR3VhcmRGcm9tSGFzaCIsInNHdWFyZEhhc2giLCJfZ3VhcmRIYXNoIiwicmVwbGFjZSIsImNoZWNrIiwic0hhc2giLCJpbmRleE9mIiwicmVtb3ZlQXBwU3RhdGVJbkhhc2giLCJSZWdFeHAiLCJSb3V0ZXJQcm94eSIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9jbGFzcyIsIl9CYXNlT2JqZWN0IiwiX2luaGVyaXRzTG9vc2UiLCJfdGhpcyIsIl9sZW4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY2FsbCIsImJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyIsImJJc0NvbXB1dGluZ1RpdGxlSGllcmFjaHkiLCJiSXNHdWFyZENyb3NzQWxsb3dlZCIsInNJQXBwU3RhdGVLZXkiLCJfYkFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm8iLCJfYkFwcGx5UmVzdG9yZSIsIl9wYXRoTWFwcGluZ3MiLCJyZXN0b3JlSGlzdG9yeVRyaWdnZXJlZCIsIl9wcm90byIsInByb3RvdHlwZSIsImluaXQiLCJvQXBwQ29tcG9uZW50IiwiaXNmY2xFbmFibGVkIiwiZ2V0U2VydmljZSIsInRoZW4iLCJhc3luY0luaXQiLCJjYXRjaCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiX2ZuSGFzaEd1YXJkIiwiaGFzaEd1YXJkIiwiYmluZCIsIndpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJfYkRpc2FibGVPbkhhc2hDaGFuZ2UiLCJfYklnbm9yZVJlc3RvcmUiLCJfYkZvcmNlRm9jdXMiLCJfb1NoZWxsU2VydmljZXMiLCJnZXRTaGVsbFNlcnZpY2VzIiwiaW5pdFJhdyIsImdldFJvdXRlciIsIndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbiIsImhpc3RvcnkiLCJyZXBsYWNlU3RhdGUiLCJPYmplY3QiLCJhc3NpZ24iLCJmZUxldmVsIiwic3RhdGUiLCJsb2NhdGlvbiIsImZjbEVuYWJsZWQiLCJfZm5CbG9ja2luZ05hdkZpbHRlciIsIl9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIiLCJyZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJkZXN0cm95IiwidW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic2V0QXBwU3RhdGVJbkhhc2giLCJzQXBwU3RhdGVLZXkiLCJzTmV3SGFzaCIsImluY2x1ZGVzIiwiZmluZEFwcFN0YXRlSW5IYXNoIiwiYUFwcFN0YXRlIiwibWF0Y2giLCJnZXREZWNvZGVkV2luZG93SGFzaCIsImRlY29kZVVSSSIsImhhc2giLCJvUm91dGVyIiwiX29Sb3V0ZXIiLCJfb01hbmFnZWRIaXN0b3J5IiwiX29OYXZpZ2F0aW9uR3VhcmQiLCJzQ3VycmVudEFwcEhhc2giLCJnZXRIYXNoIiwicHVzaCIsIl9leHRyYWN0U3RhdGVGcm9tSGFzaCIsImFwcE5hbWUiLCJnZXRBcHBOYW1lRnJvbUhhc2giLCJnZXRGdWxsSGFzaCIsInNwbGl0SGFzaCIsIl9zcGxpdEhhc2gkYXBwU3BlY2lmaSIsImFwcFNwZWNpZmljUm91dGUiLCJnZXRIYXNoQ2hhbmdlciIsIl90aGlzJF9vU2hlbGxTZXJ2aWNlcyIsInNoZWxsUGFydCIsImlzRm9jdXNGb3JjZWQiLCJzZXRGb2N1c0ZvcmNlZCIsImJGb3JjZWQiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJuYXZUb0hhc2giLCJiUHJlc2VydmVIaXN0b3J5IiwiYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSIsImJGb3JjZUZvY3VzIiwiYlByZXNlcnZlU2hlbGxCYWNrTmF2aWdhdGlvbkhhbmRsZXIiLCJzZXRCYWNrTmF2aWdhdGlvbiIsIl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsIndhaXRGb3IiLCJ1bmRlZmluZWQiLCJfaW50ZXJuYWxOYXZUb0hhc2giLCJjaGVja0hhc2hXaXRoR3VhcmQiLCJvUmVzb3VyY2VCdW5kbGUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJjb25maXJtIiwiZ2V0VGV4dCIsIlByb21pc2UiLCJyZXNvbHZlIiwib05ld1N0YXRlIiwiYUN1cnJlbnRIYXNoS2V5cyIsIl9leHRyYWN0RW50aXR5U2V0c0Zyb21IYXNoIiwia2V5cyIsImV2ZXJ5Iiwia2V5IiwiaW5kZXgiLCJvSGlzdG9yeUFjdGlvbiIsIl9wdXNoTmV3U3RhdGUiLCJzdG9yZUZvY3VzSW5mb0ZvckN1cnJlbnRIYXNoIiwiX3JlYnVpbGRCcm93c2VySGlzdG9yeSIsInJlc3RvcmVIaXN0b3J5Iiwic1RhcmdldEhhc2giLCJjaGVja1Jlc3RvcmVIaXN0b3J5V2FzVHJpZ2dlcmVkIiwicmVzZXRSZXN0b3JlSGlzdG9yeUZsYWciLCJuYXZCYWNrIiwic0N1cnJlbnRIYXNoIiwic1ByZXZpb3VzSGFzaCIsImkiLCJiYWNrIiwibmF2VG8iLCJzUm91dGVOYW1lIiwib1BhcmFtZXRlcnMiLCJnZXRVUkwiLCJub1ByZXNlcnZhdGlvbkNhY2hlIiwiYklzU3RpY2t5TW9kZSIsImV4aXRGcm9tQXBwIiwiYmFja1RvUHJldmlvdXNBcHAiLCJpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkiLCJzdWJzdHJpbmciLCJvTG9jYWxHdWFyZCIsImlzTmF2aWdhdGlvbkZpbmFsaXplZCIsInNldE5hdmlnYXRpb25HdWFyZCIsImRpc2NhcmROYXZpZ2F0aW9uR3VhcmQiLCJoYXNOYXZpZ2F0aW9uR3VhcmQiLCJpc0d1YXJkQ3Jvc3NBbGxvd2VkQnlVc2VyIiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwicmVzb2x2ZVJvdXRlTWF0Y2giLCJTeW5jaHJvbml6YXRpb24iLCJzSGFzaE5vUGFyYW1zIiwic3BsaXQiLCJhVG9rZW5zIiwibmFtZXMiLCJmb3JFYWNoIiwic1Rva2VuIiwib1N0YXRlIiwic2NyZWVuTW9kZSIsImFMYXlvdXQiLCJzTGF5b3V0IiwiYlJlYnVpbGRPbmx5IiwiYkRpc2FibGVIaXN0b3J5UHJlc2VydmF0aW9uIiwic2VnbWVudHMiLCJzcGxpdEFwcFNwZWNpZmljUm91dGUiLCJsYXN0SW5kZXgiLCJpUG9wQ291bnQiLCJwb3AiLCJwcmVzZXJ2ZWQiLCJvTGFzdFJlbW92ZWRJdGVtIiwib1RvcFN0YXRlIiwiX2NvbXBhcmVDYWNoZVN0YXRlcyIsInNQcmV2aW91c0lBcHBTdGF0ZUtleSIsIm9Db21wYXJpc29uU3RhdGVSZXN1bHQiLCJiSGFzU2FtZUhhc2giLCJmb2N1c0NvbnRyb2xJZCIsImZvY3VzSW5mbyIsInR5cGUiLCJzdGVwcyIsIl9kaXNhYmxlRXZlbnRPbkhhc2hDaGFuZ2UiLCJzdG9wIiwiX2VuYWJsZUV2ZW50T25IYXNoQ2hhbmdlIiwiYklnbm9yZUN1cnJlbnRIYXNoIiwiaW5pdGlhbGl6ZSIsInRoYXQiLCJfaGlzdG9yeSRzdGF0ZSIsIm9UYXJnZXRTdGF0ZSIsIm5ld0xldmVsIiwicmVwbGFjZUFzeW5jIiwicmVwbGFjZUhhc2giLCJzZXRUaW1lb3V0IiwiYmFja1JlcGxhY2VBc3luYyIsImJhY2tBc3luYyIsInNldEhhc2giLCJnbyIsImdldExhc3RIaXN0b3J5RW50cnkiLCJzZXRQYXRoTWFwcGluZyIsIm1hcHBpbmdzIiwiZmlsdGVyIiwibWFwcGluZyIsIm9sZFBhdGgiLCJuZXdQYXRoIiwiY3VycmVudEFwcE5hbWUiLCJmaW5kIiwibSIsImVuY29kZVVSSSIsImFIYXNoU3BsaXQiLCJzQXBwSGFzaCIsIm9TdGF0ZTEiLCJvU3RhdGUyIiwiZXF1YWwiLCJyb3V0ZVNwbGl0Iiwic2hpZnQiLCJjaGVja0lmQmFja0lzT3V0T2ZHdWFyZCIsInByZXZpb3VzSGFzaCIsImNoZWNrSWZCYWNrSGFzU2FtZUNvbnRleHQiLCJvQ3VycmVudFN0YXRlIiwib1ByZXZpb3VzU3RhdGUiLCJyZXN0b3JlRm9jdXNGb3JDdXJyZW50SGFzaCIsImN1cnJlbnRIYXNoIiwic3RhdGVGb3JIYXNoIiwiZm9jdXNBcHBsaWVkIiwiZm9jdXNDb250cm9sIiwiRWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwiZm9jdXMiLCJnZXRBY3RpdmVFbGVtZW50IiwiZ2V0SWQiLCJnZXRGb2N1c0luZm8iLCJmaW5kTGF5b3V0Rm9ySGFzaCIsIl90YXJnZXRTdGF0ZSIsImhhc2hOb1BhcmFtIiwidGFyZ2V0U3RhdGUiLCJCYXNlT2JqZWN0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJSb3V0ZXJQcm94eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcyB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgU3luY2hyb25pemF0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N5bmNocm9uaXphdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBJU2hlbGxTZXJ2aWNlcyB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaGVsbFNlcnZpY2VzRmFjdG9yeVwiO1xuaW1wb3J0IEJhc2VPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL09iamVjdFwiO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCB0eXBlIFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcblxuY29uc3QgZW51bVN0YXRlID0ge1xuXHRFUVVBTDogMCxcblx0Q09NUEFUSUJMRTogMSxcblx0QU5DRVNUT1I6IDIsXG5cdERJRkZFUkVOVDogM1xufTtcbmNvbnN0IGVudW1VUkxQYXJhbXMgPSB7XG5cdExBWU9VVFBBUkFNOiBcImxheW91dFwiLFxuXHRJQVBQU1RBVEVQQVJBTTogXCJzYXAtaWFwcC1zdGF0ZVwiXG59O1xuXG50eXBlIFJvdXRlclN0YXRlID0ge1xuXHRrZXlzOiBzdHJpbmdbXTtcblx0aGFzaDogc3RyaW5nO1xuXHRwcmVzZXJ2ZWQ/OiBib29sZWFuO1xuXHRzTGF5b3V0Pzogc3RyaW5nO1xuXHRzY3JlZW5Nb2RlOiBudW1iZXI7XG5cdGZvY3VzQ29udHJvbElkPzogc3RyaW5nO1xuXHRmb2N1c0luZm8/OiB7XG5cdFx0cHJldmVudFNjcm9sbD86IGJvb2xlYW47XG5cdFx0dGFyZ2V0SW5mbz86IHVua25vd247XG5cdH07XG59O1xuXG50eXBlIE90aGVySGlzdG9yeUFjdGlvbiA9IHsgdHlwZTogXCJhcHBlbmRcIiB8IFwibm9uZVwiIHwgXCJyZXBsYWNlXCIgfTtcbmV4cG9ydCB0eXBlIEJhY2tIaXN0b3J5QWN0aW9uID0geyB0eXBlOiBcImJhY2tcIiB8IFwiYmFjay1yZXBsYWNlXCI7IHN0ZXBzOiBudW1iZXIgfTtcbnR5cGUgSHlzdG9yeUFjdGlvbiA9IEJhY2tIaXN0b3J5QWN0aW9uIHwgT3RoZXJIaXN0b3J5QWN0aW9uO1xuXG50eXBlIE5hdmlnYXRpb25HdWFyZCA9IHsgX2d1YXJkSGFzaDogc3RyaW5nOyBjaGVjazogKGhhc2g6IHN0cmluZykgPT4gYm9vbGVhbiB9O1xuLyoqXG4gKiBDcmVhdGVzIGEgSGFzaEd1YXJkIG9iamVjdC5cbiAqIEBwYXJhbSBzR3VhcmRIYXNoIFRoZSBoYXNoIHVzZWQgZm9yIHRoZSBndWFyZFxuICogQHJldHVybnMgVGhlIGNyZWF0ZWQgaGFzaCBndWFyZFxuICovXG5mdW5jdGlvbiBjcmVhdGVHdWFyZEZyb21IYXNoKHNHdWFyZEhhc2g6IHN0cmluZyk6IE5hdmlnYXRpb25HdWFyZCB7XG5cdHJldHVybiB7XG5cdFx0X2d1YXJkSGFzaDogc0d1YXJkSGFzaC5yZXBsYWNlKC9cXD9bXj9dKiQvLCBcIlwiKSwgLy8gUmVtb3ZlIHF1ZXJ5IHBhcnRcblx0XHRjaGVjazogZnVuY3Rpb24gKHNIYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdHJldHVybiBzSGFzaC5pbmRleE9mKHRoaXMuX2d1YXJkSGFzaCkgPT09IDA7XG5cdFx0fVxuXHR9O1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgaGFzaCB3aXRob3V0IGl0cyBpQXBwU3RhdGUgcGFydC5cbiAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaFxuICogQHJldHVybnMgVGhlIGhhc2ggd2l0aG91dCB0aGUgaUFwcFN0YXRlXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUFwcFN0YXRlSW5IYXNoKHNIYXNoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gc0hhc2gucmVwbGFjZShuZXcgUmVnRXhwKGBbJj9dKiR7ZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTX09W14mXSpgKSwgXCJcIik7XG59XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLlJvdXRlclByb3h5XCIpXG5jbGFzcyBSb3V0ZXJQcm94eSBleHRlbmRzIEJhc2VPYmplY3Qge1xuXHRiSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblxuXHRiSXNDb21wdXRpbmdUaXRsZUhpZXJhY2h5ID0gZmFsc2U7XG5cblx0YklzR3VhcmRDcm9zc0FsbG93ZWQgPSBmYWxzZTtcblxuXHRzSUFwcFN0YXRlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuXHRfb1NoZWxsU2VydmljZXMhOiBJU2hlbGxTZXJ2aWNlcztcblxuXHRmY2xFbmFibGVkITogYm9vbGVhbjtcblxuXHRfZm5CbG9ja2luZ05hdkZpbHRlciE6IEZ1bmN0aW9uO1xuXG5cdF9mbkhhc2hHdWFyZCE6ICh0aGlzOiBXaW5kb3csIHBvcFN0YXRlRXZlbnQ6IFBvcFN0YXRlRXZlbnQpID0+IHVua25vd247XG5cblx0X2JEaXNhYmxlT25IYXNoQ2hhbmdlITogYm9vbGVhbjtcblxuXHRfYklnbm9yZVJlc3RvcmUhOiBib29sZWFuO1xuXG5cdF9iRm9yY2VGb2N1cyE6IGJvb2xlYW47XG5cblx0X29Sb3V0ZXIhOiBSb3V0ZXI7XG5cblx0X29NYW5hZ2VkSGlzdG9yeSE6IFJvdXRlclN0YXRlW107XG5cblx0X29OYXZpZ2F0aW9uR3VhcmQhOiBOYXZpZ2F0aW9uR3VhcmQgfCBudWxsO1xuXG5cdG9SZXNvdXJjZUJ1bmRsZT86IFJlc291cmNlQnVuZGxlO1xuXG5cdF9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbj86IFN5bmNocm9uaXphdGlvbjtcblxuXHRfYkFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm8gPSBmYWxzZTtcblxuXHRfYkFwcGx5UmVzdG9yZSA9IGZhbHNlO1xuXG5cdF9wYXRoTWFwcGluZ3M6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdID0gW107XG5cblx0cmVzdG9yZUhpc3RvcnlUcmlnZ2VyZWQgPSBmYWxzZTtcblxuXHRhcHBOYW1lITogc3RyaW5nO1xuXG5cdGluaXQob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBpc2ZjbEVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHQvLyBTYXZlIHRoZSBuYW1lIG9mIHRoZSBhcHAgKGluY2x1ZGluZyBzdGFydHVwIHBhcmFtZXRlcnMpIGZvciByZWJ1aWxkaW5nIGZ1bGwgaGFzaGVzIGxhdGVyXG5cdFx0b0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFNlcnZpY2UoXCJzaGVsbFNlcnZpY2VzXCIpXG5cdFx0XHQudGhlbigoKSA9PiB0aGlzLmFzeW5jSW5pdChvQXBwQ29tcG9uZW50LCBpc2ZjbEVuYWJsZWQpKVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIHRoZSBzaGVsbCBzZXJ2aWNlc1wiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH0pO1xuXHRcdHRoaXMuX2ZuSGFzaEd1YXJkID0gdGhpcy5oYXNoR3VhcmQuYmluZCh0aGlzKTtcblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIHRoaXMuX2ZuSGFzaEd1YXJkKTtcblx0XHR0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA9IGZhbHNlO1xuXHRcdHRoaXMuX2JJZ25vcmVSZXN0b3JlID0gZmFsc2U7XG5cdFx0dGhpcy5fYkZvcmNlRm9jdXMgPSB0cnVlOyAvLyBUcmlnZ2VyIHRoZSBmb2N1cyBtZWNoYW5pc20gZm9yIHRoZSBmaXJzdCB2aWV3IGRpc3BsYXllZCBieSB0aGUgYXBwXG5cdH1cblxuXHRhc3luY0luaXQob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBpc2ZjbEVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLl9vU2hlbGxTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXG5cdFx0dGhpcy5pbml0UmF3KG9BcHBDb21wb25lbnQuZ2V0Um91dGVyKCkpO1xuXHRcdC8vIFdlIHdhbnQgdG8gd2FpdCB1bnRpbCB0aGUgaW5pdGlhbCByb3V0ZU1hdGNoZWQgaXMgZG9uZSBiZWZvcmUgZG9pbmcgYW55IG5hdmlnYXRpb25cblx0XHR0aGlzLndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbigpO1xuXG5cdFx0Ly8gU2V0IGZlTGV2ZWw9MCBmb3IgdGhlIGZpcnN0IEFwcGxpY2F0aW9uIHBhZ2UgaW4gdGhlIGhpc3Rvcnlcblx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShcblx0XHRcdE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmZUxldmVsOiAwXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGhpc3Rvcnkuc3RhdGVcblx0XHRcdCksXG5cdFx0XHRcIlwiLFxuXHRcdFx0d2luZG93LmxvY2F0aW9uIGFzIHVua25vd24gYXMgc3RyaW5nXG5cdFx0KTtcblx0XHR0aGlzLmZjbEVuYWJsZWQgPSBpc2ZjbEVuYWJsZWQ7XG5cblx0XHR0aGlzLl9mbkJsb2NraW5nTmF2RmlsdGVyID0gdGhpcy5fYmxvY2tpbmdOYXZpZ2F0aW9uRmlsdGVyLmJpbmQodGhpcyk7XG5cdFx0dGhpcy5fb1NoZWxsU2VydmljZXMucmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKHRoaXMuX2ZuQmxvY2tpbmdOYXZGaWx0ZXIpO1xuXHR9XG5cblx0ZGVzdHJveSgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fb1NoZWxsU2VydmljZXMpIHtcblx0XHRcdHRoaXMuX29TaGVsbFNlcnZpY2VzLnVucmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKHRoaXMuX2ZuQmxvY2tpbmdOYXZGaWx0ZXIpO1xuXHRcdH1cblx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIHRoaXMuX2ZuSGFzaEd1YXJkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGFuIGlBcHBTdGF0ZSBpbnNpZGUgYSBoYXNoIChvciByZXBsYWNlcyBhbiBleGlzdGluZyBvbmUpLlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2hcblx0ICogQHBhcmFtIHNBcHBTdGF0ZUtleSBUaGUgaUFwcFN0YXRlIHRvIGFkZFxuXHQgKiBAcmV0dXJucyBUaGUgaGFzaCB3aXRoIHRoZSBhcHAgc3RhdGVcblx0ICovXG5cdHNldEFwcFN0YXRlSW5IYXNoKHNIYXNoOiBzdHJpbmcsIHNBcHBTdGF0ZUtleTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRsZXQgc05ld0hhc2g6IHN0cmluZztcblxuXHRcdGlmIChzSGFzaC5pbmNsdWRlcyhlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNKSkge1xuXHRcdFx0Ly8gSWYgdGhlcmUncyBhbHJlYWR5IGFuIGlBcHBTdGF0ZSBwYXJhbWV0ZXIgaW4gdGhlIGhhc2gsIHJlcGxhY2UgaXRcblx0XHRcdHNOZXdIYXNoID0gc0hhc2gucmVwbGFjZShcblx0XHRcdFx0bmV3IFJlZ0V4cChgJHtlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNfT1bXiZdKmApLFxuXHRcdFx0XHRgJHtlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNfT0ke3NBcHBTdGF0ZUtleX1gXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBBZGQgdGhlIGlBcHBTdGF0ZSBwYXJhbWV0ZXIgaW4gdGhlIGhhc2hcblx0XHRcdGlmICghc0hhc2guaW5jbHVkZXMoXCI/XCIpKSB7XG5cdFx0XHRcdHNOZXdIYXNoID0gYCR7c0hhc2h9P2A7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzTmV3SGFzaCA9IGAke3NIYXNofSZgO1xuXHRcdFx0fVxuXHRcdFx0c05ld0hhc2ggKz0gYCR7ZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTX09JHtzQXBwU3RhdGVLZXl9YDtcblx0XHR9XG5cblx0XHRyZXR1cm4gc05ld0hhc2g7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgaUFwcFN0YXRlIHBhcnQgZnJvbSBhIGhhc2ggKG9yIG51bGwgaWYgbm90IGZvdW5kKS5cblx0ICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoXG5cdCAqIEByZXR1cm5zIFRoZSBpQXBwU3RhdGUgcGFydCBvZiB0aGUgaGFzaFxuXHQgKi9cblx0ZmluZEFwcFN0YXRlSW5IYXNoKHNIYXNoOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcblx0XHRjb25zdCBhQXBwU3RhdGUgPSBzSGFzaC5tYXRjaChuZXcgUmVnRXhwKGBcXFxcPy4qJHtlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNfT0oW14mXSopYCkpO1xuXHRcdHJldHVybiBhQXBwU3RhdGUgJiYgYUFwcFN0YXRlLmxlbmd0aCA+IDEgPyBhQXBwU3RhdGVbMV0gOiBudWxsO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXREZWNvZGVkV2luZG93SGFzaCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiBkZWNvZGVVUkkod2luZG93LmxvY2F0aW9uLmhhc2gpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJhdyBpbml0aWFsaXphdGlvbiAoZm9yIHVuaXQgdGVzdHMpLlxuXHQgKiBAcGFyYW0gb1JvdXRlciBUaGUgcm91dGVyIHVzZWQgYnkgdGhpcyBwcm94eVxuXHQgKi9cblx0aW5pdFJhdyhvUm91dGVyOiBSb3V0ZXIpOiB2b2lkIHtcblx0XHR0aGlzLl9vUm91dGVyID0gb1JvdXRlcjtcblx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkgPSBbXTtcblx0XHR0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID0gbnVsbDtcblxuXHRcdGNvbnN0IHNDdXJyZW50QXBwSGFzaCA9IHRoaXMuZ2V0SGFzaCgpO1xuXHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wdXNoKHRoaXMuX2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNDdXJyZW50QXBwSGFzaCkpO1xuXG5cdFx0dGhpcy5hcHBOYW1lID0gdGhpcy5nZXRBcHBOYW1lRnJvbUhhc2godGhpcy5nZXREZWNvZGVkV2luZG93SGFzaCgpKTtcblxuXHRcdC8vIFNldCB0aGUgaUFwcFN0YXRlIGlmIHRoZSBpbml0aWFsIGhhc2ggY29udGFpbnMgb25lXG5cdFx0dGhpcy5zSUFwcFN0YXRlS2V5ID0gdGhpcy5maW5kQXBwU3RhdGVJbkhhc2goc0N1cnJlbnRBcHBIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm4gdGhlIGZ1bGwgYXBwLXNwZWNpZmljIGhhc2ggcGFydCBmcm9tIHdpbmRvdy5sb2NhdGlvbi5oYXNoLlxuXHQgKlxuXHQgKiBDb21wYXJlZCB0byB7QGxpbmsgZ2V0SGFzaH0gdGhpcyBmdW5jdGlvbiBpbmNsdWRlcyBzdWItcm91dGVzIG9mIG5lc3RlZCBjb21wb25lbnRzLlxuXHQgKiBAcmV0dXJucyBUaGUgYXBwLXNwZWNpZmljIGhhc2ggcGFydCAoaS5lLiwgd2l0aG91dCB0aGUgc2hlbGwgcGFydCksIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVyZSBpcyBub25lLlxuXHQgKi9cblx0Z2V0RnVsbEhhc2goKTogc3RyaW5nIHtcblx0XHRjb25zdCBzcGxpdEhhc2ggPSB0aGlzLl9vU2hlbGxTZXJ2aWNlcy5zcGxpdEhhc2godGhpcy5nZXREZWNvZGVkV2luZG93SGFzaCgpKTtcblxuXHRcdGlmIChcImFwcFNwZWNpZmljUm91dGVcIiBpbiBzcGxpdEhhc2gpIHtcblx0XHRcdHJldHVybiBzcGxpdEhhc2guYXBwU3BlY2lmaWNSb3V0ZT8ucmVwbGFjZSgvXiZcXC8vLCBcIlwiKSA/PyBcIlwiOyAvLyByZW1vdmUgdGhlIGxlYWRpbmcgXCImL1wiXG5cdFx0fVxuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cblx0Z2V0SGFzaCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkuZ2V0SGFzaCgpID8/IFwiXCI7XG5cdH1cblxuXHRwcm90ZWN0ZWQgZ2V0QXBwTmFtZUZyb21IYXNoKGhhc2g6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc3BsaXRIYXNoID0gdGhpcy5fb1NoZWxsU2VydmljZXM/LnNwbGl0SGFzaChoYXNoKSBhcyB7IHNoZWxsUGFydDogc3RyaW5nOyBhcHBTcGVjaWZpY1JvdXRlOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcblx0XHRyZXR1cm4gc3BsaXRIYXNoPy5zaGVsbFBhcnQgPz8gXCJcIjtcblx0fVxuXG5cdGlzRm9jdXNGb3JjZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2JGb3JjZUZvY3VzO1xuXHR9XG5cblx0c2V0Rm9jdXNGb3JjZWQoYkZvcmNlZDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuX2JGb3JjZUZvY3VzID0gYkZvcmNlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNldHMgdGhlIGludGVybmFsIHZhcmlhYmxlIHNJQXBwU3RhdGVLZXkuXG5cdCAqXG5cdCAqL1xuXHRyZW1vdmVJQXBwU3RhdGVLZXkoKTogdm9pZCB7XG5cdFx0dGhpcy5zSUFwcFN0YXRlS2V5ID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSBzcGVjaWZpYyBoYXNoLlxuXHQgKiBAcGFyYW0gc0hhc2ggSGFzaCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIGJQcmVzZXJ2ZUhpc3RvcnkgSWYgc2V0IHRvIHRydWUsIG5vbi1hbmNlc3RvciBlbnRyaWVzIGluIGhpc3Rvcnkgd2lsbCBiZSByZXRhaW5lZFxuXHQgKiBAcGFyYW0gYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSBJZiBzZXQgdG8gdHJ1ZSwgY2FjaGUgcHJlc2VydmF0aW9uIG1lY2hhbmlzbSBpcyBkaXNhYmxlZCBmb3IgdGhlIGN1cnJlbnQgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gYkZvcmNlRm9jdXMgSWYgc2V0IHRvIHRydWUsIHRoZSBsb2dpYyB0byBzZXQgdGhlIGZvY3VzIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkIHdpbGwgYmUgdHJpZ2dlcmVkIChvblBhZ2VSZWFkeSlcblx0ICogQHBhcmFtIGJQcmVzZXJ2ZVNoZWxsQmFja05hdmlnYXRpb25IYW5kbGVyIElmIG5vdCBzZXQgdG8gZmFsc2UsIHRoZSBiYWNrIG5hdmlnYXRpb24gaXMgc2V0IHRvIHVuZGVmaW5lZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIChyZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZCkgdGhhdCByZXR1cm5zICd0cnVlJyBpZiBhIG5hdmlnYXRpb24gdG9vayBwbGFjZSwgJ2ZhbHNlJyBpZiB0aGUgbmF2aWdhdGlvbiBkaWRuJ3QgaGFwcGVuXG5cdCAqL1xuXHRhc3luYyBuYXZUb0hhc2goXG5cdFx0c0hhc2g6IHN0cmluZyxcblx0XHRiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbixcblx0XHRiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlPzogYm9vbGVhbixcblx0XHRiRm9yY2VGb2N1cz86IGJvb2xlYW4sXG5cdFx0YlByZXNlcnZlU2hlbGxCYWNrTmF2aWdhdGlvbkhhbmRsZXI/OiBib29sZWFuXG5cdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmIChiUHJlc2VydmVTaGVsbEJhY2tOYXZpZ2F0aW9uSGFuZGxlciAhPT0gZmFsc2UpIHtcblx0XHRcdGF3YWl0IHRoaXMuX29TaGVsbFNlcnZpY2VzLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbikge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uLndhaXRGb3IoKS50aGVuKGFzeW5jICgpID0+IHtcblx0XHRcdFx0dGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9pbnRlcm5hbE5hdlRvSGFzaChzSGFzaCwgYlByZXNlcnZlSGlzdG9yeSwgYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSwgYkZvcmNlRm9jdXMpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0aGlzLl9iQWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hybykge1xuXHRcdFx0XHR0aGlzLndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuX2ludGVybmFsTmF2VG9IYXNoKHNIYXNoLCBiUHJlc2VydmVIaXN0b3J5LCBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlLCBiRm9yY2VGb2N1cyk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgX2ludGVybmFsTmF2VG9IYXNoKFxuXHRcdHNIYXNoOiBzdHJpbmcsXG5cdFx0YlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4sXG5cdFx0YkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZT86IGJvb2xlYW4sXG5cdFx0YkZvcmNlRm9jdXM/OiBib29sZWFuXG5cdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdC8vIEFkZCB0aGUgYXBwIHN0YXRlIGluIHRoZSBoYXNoIGlmIG5lZWRlZFxuXHRcdGlmICh0aGlzLmZjbEVuYWJsZWQgJiYgdGhpcy5zSUFwcFN0YXRlS2V5ICYmICF0aGlzLmZpbmRBcHBTdGF0ZUluSGFzaChzSGFzaCkpIHtcblx0XHRcdHNIYXNoID0gdGhpcy5zZXRBcHBTdGF0ZUluSGFzaChzSGFzaCwgdGhpcy5zSUFwcFN0YXRlS2V5KTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuY2hlY2tIYXNoV2l0aEd1YXJkKHNIYXNoKSkge1xuXHRcdFx0aWYgKCF0aGlzLm9SZXNvdXJjZUJ1bmRsZSkge1xuXHRcdFx0XHR0aGlzLm9SZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlIGhhdmUgdG8gdXNlIGEgY29uZmlybSBoZXJlIGZvciBVSSBjb25zaXN0ZW5jeSByZWFzb25zLCBhcyB3aXRoIHNvbWUgc2NlbmFyaW9zXG5cdFx0XHQvLyBpbiB0aGUgRWRpdEZsb3cgd2UgcmVseSBvbiBhIFVJNSBtZWNoYW5pc20gdGhhdCBkaXNwbGF5cyBhIGNvbmZpcm0gZGlhbG9nLlxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFsZXJ0XG5cdFx0XHRpZiAoIWNvbmZpcm0odGhpcy5vUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfUk9VVEVSX1BST1hZX1NBUEZFX0VYSVRfTk9UU0FWRURfTUVTU0FHRVwiKSkpIHtcblx0XHRcdFx0Ly8gVGhlIHVzZXIgY2xpY2tlZCBvbiBDYW5jZWwgLS0+IGNhbmNlbCBuYXZpZ2F0aW9uXG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5iSXNHdWFyZENyb3NzQWxsb3dlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gSW4gY2FzZSB0aGUgbmF2aWdhdGlvbiB3aWxsIGNhdXNlIGEgbmV3IHZpZXcgdG8gYmUgZGlzcGxheWVkLCB3ZSBmb3JjZSB0aGUgZm9jdXNcblx0XHQvLyBJLmUuIGlmIHRoZSBrZXlzIGZvciB0aGUgaGFzaCB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGlzIGEgc3VwZXJzZXQgb2YgdGhlIGN1cnJlbnQgaGFzaCBrZXlzLlxuXHRcdGNvbnN0IG9OZXdTdGF0ZSA9IHRoaXMuX2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNIYXNoKTtcblx0XHRpZiAoIXRoaXMuX2JGb3JjZUZvY3VzKSB7XG5cdFx0XHQvLyBJZiB0aGUgZm9jdXMgd2FzIGFscmVhZHkgZm9yY2VkLCBrZWVwIGl0XG5cdFx0XHRjb25zdCBhQ3VycmVudEhhc2hLZXlzID0gdGhpcy5fZXh0cmFjdEVudGl0eVNldHNGcm9tSGFzaCh0aGlzLmdldEhhc2goKSk7XG5cdFx0XHR0aGlzLl9iRm9yY2VGb2N1cyA9XG5cdFx0XHRcdGJGb3JjZUZvY3VzIHx8XG5cdFx0XHRcdChhQ3VycmVudEhhc2hLZXlzLmxlbmd0aCA8IG9OZXdTdGF0ZS5rZXlzLmxlbmd0aCAmJlxuXHRcdFx0XHRcdGFDdXJyZW50SGFzaEtleXMuZXZlcnkoZnVuY3Rpb24gKGtleTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ga2V5ID09PSBvTmV3U3RhdGUua2V5c1tpbmRleF07XG5cdFx0XHRcdFx0fSkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9IaXN0b3J5QWN0aW9uID0gdGhpcy5fcHVzaE5ld1N0YXRlKG9OZXdTdGF0ZSwgZmFsc2UsIGJQcmVzZXJ2ZUhpc3RvcnksIGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUpO1xuXHRcdHRoaXMuc3RvcmVGb2N1c0luZm9Gb3JDdXJyZW50SGFzaCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX3JlYnVpbGRCcm93c2VySGlzdG9yeShvSGlzdG9yeUFjdGlvbiwgZmFsc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFycyBicm93c2VyIGhpc3RvcnkgaWYgZW50cmllcyBoYXZlIGJlZW4gYWRkZWQgd2l0aG91dCB1c2luZyB0aGUgUm91dGVyUHJveHkuXG5cdCAqIFVwZGF0ZXMgdGhlIGludGVybmFsIGhpc3RvcnkgYWNjb3JkaW5nbHkuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvbmNlIHRoZSBoaXN0b3J5IGlzIHJlYnVpbHRcblx0ICovXG5cdGFzeW5jIHJlc3RvcmVIaXN0b3J5KCk6IFByb21pc2U8dm9pZCB8IGJvb2xlYW4+IHtcblx0XHRpZiAodGhpcy5fYkFwcGx5UmVzdG9yZSkge1xuXHRcdFx0dGhpcy5fYkFwcGx5UmVzdG9yZSA9IGZhbHNlO1xuXHRcdFx0bGV0IHNUYXJnZXRIYXNoID0gdGhpcy5nZXRIYXNoKCk7XG5cdFx0XHRzVGFyZ2V0SGFzaCA9IHNUYXJnZXRIYXNoLnJlcGxhY2UoLyhcXD98JilyZXN0b3JlSGlzdG9yeT10cnVlLywgXCJcIik7XG5cdFx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzVGFyZ2V0SGFzaCk7XG5cblx0XHRcdGNvbnN0IG9IaXN0b3J5QWN0aW9uID0gdGhpcy5fcHVzaE5ld1N0YXRlKG9OZXdTdGF0ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpO1xuXG5cdFx0XHR0aGlzLnJlc3RvcmVIaXN0b3J5VHJpZ2dlcmVkID0gdHJ1ZTtcblx0XHRcdHJldHVybiB0aGlzLl9yZWJ1aWxkQnJvd3Nlckhpc3Rvcnkob0hpc3RvcnlBY3Rpb24sIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBSZXN0b3JlSGlzdG9yeSBoYXMgYmVlbiB0cmlnZ2VyZWQgb24gdGhlIFJvdXRlclByb3h5LlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGl0IGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0Y2hlY2tSZXN0b3JlSGlzdG9yeVdhc1RyaWdnZXJlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5yZXN0b3JlSGlzdG9yeVRyaWdnZXJlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNldHMgdGhlIGZsYWcgdGhhdCBzYXlzIGlmIFJlc3RvcmVIaXN0b3J5IGhhcyBiZWVuIHRyaWdnZXJlZCBvbiB0aGUgUm91dGVyUHJveHkuXG5cdCAqL1xuXHRyZXNldFJlc3RvcmVIaXN0b3J5RmxhZygpOiB2b2lkIHtcblx0XHR0aGlzLnJlc3RvcmVIaXN0b3J5VHJpZ2dlcmVkID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gdGhlIGhpc3RvcnkuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZFxuXHQgKi9cblx0YXN5bmMgbmF2QmFjaygpOiBQcm9taXNlPHZvaWQgfCBib29sZWFuPiB7XG5cdFx0Y29uc3Qgc0N1cnJlbnRIYXNoID0gdGhpcy5nZXRIYXNoKCk7XG5cdFx0bGV0IHNQcmV2aW91c0hhc2g7XG5cblx0XHQvLyBMb29rIGZvciB0aGUgY3VycmVudCBoYXNoIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnlcblx0XHRmb3IgKGxldCBpID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcblx0XHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaV0uaGFzaCA9PT0gc0N1cnJlbnRIYXNoKSB7XG5cdFx0XHRcdHNQcmV2aW91c0hhc2ggPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaSAtIDFdLmhhc2g7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChzUHJldmlvdXNIYXNoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5uYXZUb0hhc2goc1ByZXZpb3VzSGFzaCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFdlIGNvdWxkbid0IGZpbmQgYSBwcmV2aW91cyBoYXNoIGluIGhpc3Rvcnlcblx0XHRcdC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIG5hdmlnYXRpbmcgZnJvbSBhIHRyYW5zaWVudCBoYXNoIGluIGEgY3JlYXRlIGFwcCwgYW5kXG5cdFx0XHQvLyBpbiB0aGF0IGNhc2UgaGlzdG9yeS5iYWNrIHdvdWxkIGdvIGJhY2sgdG8gdGhlIEZMUFxuXHRcdFx0d2luZG93Lmhpc3RvcnkuYmFjaygpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSByb3V0ZSB3aXRoIHBhcmFtZXRlcnMuXG5cdCAqIEBwYXJhbSBzUm91dGVOYW1lIFRoZSByb3V0ZSBuYW1lIHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gb1BhcmFtZXRlcnMgUGFyYW1ldGVycyBmb3IgdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIG9QYXJhbWV0ZXJzLm5vUHJlc2VydmF0aW9uQ2FjaGVcblx0ICogQHBhcmFtIG9QYXJhbWV0ZXJzLmJJc1N0aWNreU1vZGVcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqL1xuXHRhc3luYyBuYXZUbyhzUm91dGVOYW1lOiBzdHJpbmcsIG9QYXJhbWV0ZXJzPzogeyBub1ByZXNlcnZhdGlvbkNhY2hlPzogYm9vbGVhbjsgYklzU3RpY2t5TW9kZT86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IHNIYXNoID0gdGhpcy5fb1JvdXRlci5nZXRVUkwoc1JvdXRlTmFtZSwgb1BhcmFtZXRlcnMpO1xuXHRcdHJldHVybiB0aGlzLm5hdlRvSGFzaChzSGFzaCEsIGZhbHNlLCBvUGFyYW1ldGVycz8ubm9QcmVzZXJ2YXRpb25DYWNoZSwgZmFsc2UsICFvUGFyYW1ldGVycz8uYklzU3RpY2t5TW9kZSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhpdHMgdGhlIGN1cnJlbnQgYXBwIGJ5IG5hdmlnYXRpbmcgYmFja1xuXHQgKiB0byB0aGUgcHJldmlvdXMgYXBwIChpZiBhbnkpIG9yIHRoZSBGTFAuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHdlIGV4aXQgdGhlIGFwcFxuXHQgKi9cblx0ZXhpdEZyb21BcHAoKTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaGVsbFNlcnZpY2VzLmJhY2tUb1ByZXZpb3VzQXBwKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBoYXNoIGNhbiBoYXZlIGFuIGltcGFjdCBvbiB0aGUgY3VycmVudCBzdGF0ZVxuXHQgKiBpLmUuIGlmIHRoZSBoYXNoIGlzIGVxdWFsLCBjb21wYXRpYmxlIG9yIGFuIGFuY2VzdG9yIG9mIHRoZSBjdXJyZW50IHN0YXRlLlxuXHQgKiBAcGFyYW0gc0hhc2ggYHRydWVgIGlmIHRoZXJlIGlzIGFuIGltcGFjdFxuXHQgKiBAcmV0dXJucyBJZiB0aGVyZSBpcyBhbiBpbXBhY3Rcblx0ICovXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShzSGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0aWYgKHNIYXNoWzBdID09PSBcIi9cIikge1xuXHRcdFx0c0hhc2ggPSBzSGFzaC5zdWJzdHJpbmcoMSk7XG5cdFx0fVxuXHRcdGNvbnN0IG9Mb2NhbEd1YXJkID0gY3JlYXRlR3VhcmRGcm9tSGFzaChzSGFzaCk7XG5cdFx0cmV0dXJuIG9Mb2NhbEd1YXJkLmNoZWNrKHRoaXMuZ2V0SGFzaCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBuYXZpZ2F0aW9uIGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuXG5cdCAqIEByZXR1cm5zIGBmYWxzZWAgaWYgYSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBpbiB0aGUgUm91dGVyUHJveHkgYW5kIGlzIG5vdCB5ZXQgZmluYWxpemVkXG5cdCAqL1xuXHRpc05hdmlnYXRpb25GaW5hbGl6ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICF0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBsYXN0IHN0YXRlIGFzIGEgZ3VhcmQuXG5cdCAqIEVhY2ggZnV0dXJlIG5hdmlnYXRpb24gd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgdGhpcyBndWFyZCwgYW5kIGEgY29uZmlybWF0aW9uIGRpYWxvZyB3aWxsXG5cdCAqIGJlIGRpc3BsYXllZCBiZWZvcmUgdGhlIG5hdmlnYXRpb24gY3Jvc3NlcyB0aGUgZ3VhcmQgKGkuZS4gZ29lcyB0byBhbiBhbmNlc3RvciBvZiB0aGUgZ3VhcmQpLlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2ggZm9yIHRoZSBndWFyZFxuXHQgKi9cblx0c2V0TmF2aWdhdGlvbkd1YXJkKHNIYXNoOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID0gY3JlYXRlR3VhcmRGcm9tSGFzaChzSGFzaCk7XG5cdFx0dGhpcy5iSXNHdWFyZENyb3NzQWxsb3dlZCA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2FibGVzIHRoZSBuYXZpZ2F0aW9uIGd1YXJkLlxuXHQgKi9cblx0ZGlzY2FyZE5hdmlnYXRpb25HdWFyZCgpOiB2b2lkIHtcblx0XHR0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIG5hdmlnYXRpb24gZ3VhcmQuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBuYXZpZ2F0aW5nIGd1YXJkIGlzIGF2YWlsYWJsZVxuXHQgKi9cblx0aGFzTmF2aWdhdGlvbkd1YXJkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9vTmF2aWdhdGlvbkd1YXJkICE9PSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRlc3RzIGEgaGFzaCBhZ2FpbnN0IHRoZSBuYXZpZ2F0aW9uIGd1YXJkLlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2ggdG8gYmUgdGVzdGVkXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBuYXZpZ2F0aW5nIHRvIHRoZSBoYXNoIGRvZXNuJ3QgY3Jvc3MgdGhlIGd1YXJkXG5cdCAqL1xuXHRjaGVja0hhc2hXaXRoR3VhcmQoc0hhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID09PSBudWxsIHx8IHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQuY2hlY2soc0hhc2gpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgdXNlciBhbGxvd2VkIHRoZSBuYXZpZ2F0aW9uIGd1YXJkIHRvIGJlIGNyb3NzZWQuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBjcm9zc2luZyB0aGUgZ3VhcmQgaGFzIGJlZW4gYWxsb3dlZCBieSB0aGUgdXNlclxuXHQgKi9cblx0aXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlcigpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5iSXNHdWFyZENyb3NzQWxsb3dlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBBY3RpdmF0ZXMgdGhlIHN5bmNocm9uaXphdGlvbiBmb3Igcm91dGVNYXRjaGVkRXZlbnQuXG5cdCAqIFRoZSBuZXh0IE5hdlRvSGFzaCBjYWxsIHdpbGwgY3JlYXRlIGEgU3luY2hyb25pemF0aW9uIG9iamVjdCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWRcblx0ICogYnkgdGhlIGNvcnJlc3BvbmRpbmcgb25Sb3V0ZU1hdGNoZWQgZXZlbnQsIHByZXZlbnRpbmcgYW5vdGhlciBOYXZUb0hhc2ggdG8gaGFwcGVuIGluIHBhcmFsbGVsLlxuXHQgKi9cblx0YWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKCk6IHZvaWQge1xuXHRcdHRoaXMuX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvID0gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNvbHZlIHRoZSByb3V0ZU1hdGNoIHN5bmNocm9uaXphdGlvbiBvYmplY3QsIHVubG9ja2luZyBwb3RlbnRpYWwgcGVuZGluZyBOYXZUb0hhc2ggY2FsbHMuXG5cdCAqL1xuXHRyZXNvbHZlUm91dGVNYXRjaCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24pIHtcblx0XHRcdHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWFrZXMgc3VyZSBubyBuYXZpZ2F0aW9uIGNhbiBoYXBwZW4gYmVmb3JlIGEgcm91dGVNYXRjaCBoYXBwZW5lZC5cblx0ICovXG5cdHdhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbigpOiB2b2lkIHtcblx0XHR0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiA9IG5ldyBTeW5jaHJvbml6YXRpb24oKTtcblx0XHR0aGlzLl9iQWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hybyA9IGZhbHNlO1xuXHR9XG5cblx0X2V4dHJhY3RFbnRpdHlTZXRzRnJvbUhhc2goc0hhc2g6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcblx0XHRpZiAoc0hhc2ggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c0hhc2ggPSBcIlwiO1xuXHRcdH1cblx0XHRjb25zdCBzSGFzaE5vUGFyYW1zID0gc0hhc2guc3BsaXQoXCI/XCIpWzBdOyAvLyByZW1vdmUgcGFyYW1zXG5cdFx0Y29uc3QgYVRva2VucyA9IHNIYXNoTm9QYXJhbXMuc3BsaXQoXCIvXCIpO1xuXHRcdGNvbnN0IG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0YVRva2Vucy5mb3JFYWNoKChzVG9rZW4pID0+IHtcblx0XHRcdGlmIChzVG9rZW4ubGVuZ3RoKSB7XG5cdFx0XHRcdG5hbWVzLnB1c2goc1Rva2VuLnNwbGl0KFwiKFwiKVswXSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gbmFtZXM7XG5cdH1cblxuXHQvKipcblx0ICogQnVpbGRzIGEgc3RhdGUgZnJvbSBhIGhhc2guXG5cdCAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaCB0byBiZSB1c2VkIGFzIGVudHJ5XG5cdCAqIEByZXR1cm5zIFRoZSBzdGF0ZVxuXHQgKi9cblx0X2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNIYXNoOiBzdHJpbmcpOiBSb3V0ZXJTdGF0ZSB7XG5cdFx0aWYgKHNIYXNoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHNIYXNoID0gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBvU3RhdGU6IFJvdXRlclN0YXRlID0ge1xuXHRcdFx0a2V5czogdGhpcy5fZXh0cmFjdEVudGl0eVNldHNGcm9tSGFzaChzSGFzaCksXG5cdFx0XHRoYXNoOiBzSGFzaCxcblx0XHRcdHNjcmVlbk1vZGU6IDAgLy8gd2lsbCBiZSB1cGRhdGVkIGluIGEgc2VjXG5cdFx0fTtcblxuXHRcdC8vIFJldHJpZXZlIGxheW91dCAoaWYgYW55KVxuXHRcdGNvbnN0IGFMYXlvdXQgPSBzSGFzaC5tYXRjaChuZXcgUmVnRXhwKGBcXFxcPy4qJHtlbnVtVVJMUGFyYW1zLkxBWU9VVFBBUkFNfT0oW14mXSopYCkpO1xuXHRcdG9TdGF0ZS5zTGF5b3V0ID0gYUxheW91dCAmJiBhTGF5b3V0Lmxlbmd0aCA+IDEgPyBhTGF5b3V0WzFdIDogdW5kZWZpbmVkO1xuXHRcdGlmIChvU3RhdGUuc0xheW91dCA9PT0gXCJNaWRDb2x1bW5GdWxsU2NyZWVuXCIpIHtcblx0XHRcdG9TdGF0ZS5zY3JlZW5Nb2RlID0gMTtcblx0XHR9IGVsc2UgaWYgKG9TdGF0ZS5zTGF5b3V0ID09PSBcIkVuZENvbHVtbkZ1bGxTY3JlZW5cIikge1xuXHRcdFx0b1N0YXRlLnNjcmVlbk1vZGUgPSAyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvU3RhdGUuc2NyZWVuTW9kZSA9IDA7XG5cdFx0fVxuXHRcdHJldHVybiBvU3RhdGU7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIG5ldyBzdGF0ZSBpbnRvIHRoZSBpbnRlcm5hbCBoaXN0b3J5IHN0cnVjdHVyZS5cblx0ICogTWFrZXMgc3VyZSB0aGlzIG5ldyBzdGF0ZSBpcyBhZGRlZCBhZnRlciBhbiBhbmNlc3Rvci5cblx0ICogQWxzbyBzZXRzIHRoZSBpQXBwU3RhdGUga2V5IGluIHRoZSB3aG9sZSBoaXN0b3J5LlxuXHQgKiBAcGFyYW0gb05ld1N0YXRlIFRoZSBuZXcgc3RhdGUgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIGJSZWJ1aWxkT25seSBgdHJ1ZWAgaWYgd2UncmUgcmVidWlsZGluZyB0aGUgaGlzdG9yeSBhZnRlciBhIHNoZWxsIG1lbnUgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBJZiBzZXQgdG8gdHJ1ZSwgbm9uLWFuY2VzdG9yIGVudHJpZXMgaW4gaGlzdG9yeSB3aWxsIGJlIHJldGFpbmVkXG5cdCAqIEBwYXJhbSBiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb24gRGlzYWJsZSB0aGUgbWVjaGFuaXNtIHRvIHJldGFpbmVkIG1hcmtlZCBlbnRyaWVzIGluIGNhY2hlXG5cdCAqIEByZXR1cm5zIFRoZSBuZXcgc3RhdGVcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfcHVzaE5ld1N0YXRlKFxuXHRcdG9OZXdTdGF0ZTogUm91dGVyU3RhdGUsXG5cdFx0YlJlYnVpbGRPbmx5OiBib29sZWFuLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbj86IGJvb2xlYW5cblx0KTogSHlzdG9yeUFjdGlvbiB7XG5cdFx0Y29uc3Qgc2VnbWVudHMgPSBSb3V0ZXJQcm94eS5zcGxpdEFwcFNwZWNpZmljUm91dGUodGhpcy5nZXRGdWxsSGFzaCgpKTtcblx0XHRjb25zdCBzQ3VycmVudEhhc2ggPSBzZWdtZW50c1swXSA/PyBcIlwiO1xuXHRcdGxldCBsYXN0SW5kZXggPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTtcblx0XHRsZXQgaVBvcENvdW50ID0gYlJlYnVpbGRPbmx5ID8gMSA6IDA7XG5cblx0XHQvLyAxLiBEbyBzb21lIGNsZWFudXAgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSA6IGluIGNhc2UgdGhlIHVzZXIgaGFzIG5hdmlnYXRlZCBiYWNrIGluIHRoZSBicm93c2VyIGhpc3RvcnksIHdlIG5lZWQgdG8gcmVtb3ZlXG5cdFx0Ly8gdGhlIHN0YXRlcyBhaGVhZCBpbiBoaXN0b3J5IGFuZCBtYWtlIHN1cmUgdGhlIHRvcCBzdGF0ZSBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBwYWdlXG5cdFx0Ly8gV2UgZG9uJ3QgZG8gdGhhdCB3aGVuIHJlc3RvcmluZyB0aGUgaGlzdG9yeSwgYXMgdGhlIGN1cnJlbnQgc3RhdGUgaGFzIGJlZW4gYWRkZWQgb24gdG9wIG9mIHRoZSBicm93c2VyIGhpc3Rvcnlcblx0XHQvLyBhbmQgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5XG5cdFx0aWYgKCFiUmVidWlsZE9ubHkpIHtcblx0XHRcdHdoaWxlIChsYXN0SW5kZXggPj0gMCAmJiB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbbGFzdEluZGV4XS5oYXNoICE9PSBzQ3VycmVudEhhc2gpIHtcblx0XHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnBvcCgpO1xuXHRcdFx0XHRsYXN0SW5kZXgtLTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Ly8gV2UgY291bGRuJ3QgZmluZCB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgaGlzdG9yeS4gVGhpcyBjYW4gaGFwcGVuIGlmIGEgYnJvd3NlciByZWxvYWRcblx0XHRcdFx0Ly8gaGFwcGVuZWQsIGNhdXNpbmcgYSByZWluaXRpYWxpemF0aW9uIG9mIHRoZSBtYW5hZ2VkIGhpc3RvcnkuXG5cdFx0XHRcdC8vIEluIHRoYXQgY2FzZSwgd2UgdXNlIHRoZSBjdXJyZW50IGxvY2F0aW9uIGFzIHRoZSBuZXcgc3RhcnRpbmcgcG9pbnQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdFx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkucHVzaCh0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzQ3VycmVudEhhc2gpKTtcblx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoT2JqZWN0LmFzc2lnbih7IGZlTGV2ZWw6IDAgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDIuIE1hcmsgdGhlIHRvcCBzdGF0ZSBhcyBwcmVzZXJ2ZWQgaWYgcmVxdWlyZWRcblx0XHRpZiAoYlByZXNlcnZlSGlzdG9yeSAmJiAhYkRpc2FibGVIaXN0b3J5UHJlc2VydmF0aW9uKSB7XG5cdFx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdLnByZXNlcnZlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gMy4gVGhlbiBwb3AgYWxsIHN0YXRlcyB1bnRpbCB3ZSBmaW5kIGFuIGFuY2VzdG9yIG9mIHRoZSBuZXcgc3RhdGUsIG9yIHdlIGZpbmQgYSBzdGF0ZSB0aGF0IG5lZWQgdG8gYmUgcHJlc2VydmVkXG5cdFx0bGV0IG9MYXN0UmVtb3ZlZEl0ZW07XG5cdFx0d2hpbGUgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBvVG9wU3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoYkRpc2FibGVIaXN0b3J5UHJlc2VydmF0aW9uIHx8ICFvVG9wU3RhdGUucHJlc2VydmVkKSAmJlxuXHRcdFx0XHR0aGlzLl9jb21wYXJlQ2FjaGVTdGF0ZXMob1RvcFN0YXRlLCBvTmV3U3RhdGUpICE9PSBlbnVtU3RhdGUuQU5DRVNUT1Jcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGUgdG9wIHN0YXRlIGlzIG5vdCBhbiBhbmNlc3RvciBvZiBvTmV3U3RhdGUgYW5kIGlzIG5vdCBwcmVzZXJ2ZWQgLS0+IHdlIGNhbiBwb3AgaXRcblx0XHRcdFx0b0xhc3RSZW1vdmVkSXRlbSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wb3AoKTtcblx0XHRcdFx0aVBvcENvdW50Kys7XG5cdFx0XHR9IGVsc2UgaWYgKG9Ub3BTdGF0ZS5wcmVzZXJ2ZWQgJiYgcmVtb3ZlQXBwU3RhdGVJbkhhc2gob1RvcFN0YXRlLmhhc2gpID09PSByZW1vdmVBcHBTdGF0ZUluSGFzaChvTmV3U3RhdGUuaGFzaCkpIHtcblx0XHRcdFx0Ly8gV2UgdHJ5IHRvIGFkZCBhIHN0YXRlIHRoYXQgaXMgYWxyZWFkeSBpbiBjYWNoZSAoZHVlIHRvIHByZXNlcnZlZCBmbGFnKSBidXQgd2l0aCBhIGRpZmZlcmVudCBpYXBwLXN0YXRlXG5cdFx0XHRcdC8vIC0tPiB3ZSBzaG91bGQgZGVsZXRlIHRoZSBwcmV2aW91cyBlbnRyeSAoaXQgd2lsbCBiZSBsYXRlciByZXBsYWNlZCBieSB0aGUgbmV3IG9uZSkgYW5kIHN0b3AgcG9wcGluZ1xuXHRcdFx0XHRvTGFzdFJlbW92ZWRJdGVtID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5LnBvcCgpO1xuXHRcdFx0XHRpUG9wQ291bnQrKztcblx0XHRcdFx0b05ld1N0YXRlLnByZXNlcnZlZCA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnJlYWs7IC8vIEFuY2VzdG9yIG9yIHByZXNlcnZlZCBzdGF0ZSBmb3VuZCAtLT4gd2Ugc3RvcCBwb3BwaW5nIG91dCBzdGF0ZXNcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyA0LiBpQXBwU3RhdGUgbWFuYWdlbWVudFxuXHRcdHRoaXMuc0lBcHBTdGF0ZUtleSA9IHRoaXMuZmluZEFwcFN0YXRlSW5IYXNoKG9OZXdTdGF0ZS5oYXNoKTtcblx0XHRpZiAoIXRoaXMuZmNsRW5hYmxlZCAmJiBvTGFzdFJlbW92ZWRJdGVtKSB7XG5cdFx0XHRjb25zdCBzUHJldmlvdXNJQXBwU3RhdGVLZXkgPSB0aGlzLmZpbmRBcHBTdGF0ZUluSGFzaChvTGFzdFJlbW92ZWRJdGVtLmhhc2gpO1xuXHRcdFx0Y29uc3Qgb0NvbXBhcmlzb25TdGF0ZVJlc3VsdCA9IHRoaXMuX2NvbXBhcmVDYWNoZVN0YXRlcyhvTGFzdFJlbW92ZWRJdGVtLCBvTmV3U3RhdGUpO1xuXHRcdFx0Ly8gaWYgY3VycmVudCBzdGF0ZSBkb2Vzbid0IGNvbnRhaW4gYSBpLWFwcHN0YXRlIGFuZCB0aGlzIHN0YXRlIHNob3VsZCByZXBsYWNlIGEgc3RhdGUgY29udGFpbmluZyBhIGlBcHBTdGF0ZVxuXHRcdFx0Ly8gdGhlbiB0aGUgcHJldmlvdXMgaUFwcFN0YXRlIGlzIHByZXNlcnZlZFxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhdGhpcy5zSUFwcFN0YXRlS2V5ICYmXG5cdFx0XHRcdHNQcmV2aW91c0lBcHBTdGF0ZUtleSAmJlxuXHRcdFx0XHQob0NvbXBhcmlzb25TdGF0ZVJlc3VsdCA9PT0gZW51bVN0YXRlLkVRVUFMIHx8IG9Db21wYXJpc29uU3RhdGVSZXN1bHQgPT09IGVudW1TdGF0ZS5DT01QQVRJQkxFKVxuXHRcdFx0KSB7XG5cdFx0XHRcdG9OZXdTdGF0ZS5oYXNoID0gdGhpcy5zZXRBcHBTdGF0ZUluSGFzaChvTmV3U3RhdGUuaGFzaCwgc1ByZXZpb3VzSUFwcFN0YXRlS2V5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyA1LiBOb3cgd2UgY2FuIHB1c2ggdGhlIHN0YXRlIGF0IHRoZSB0b3Agb2YgdGhlIGludGVybmFsIGhpc3Rvcnlcblx0XHRjb25zdCBiSGFzU2FtZUhhc2ggPSBvTGFzdFJlbW92ZWRJdGVtICYmIG9OZXdTdGF0ZS5oYXNoID09PSBvTGFzdFJlbW92ZWRJdGVtLmhhc2g7XG5cdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPT09IDAgfHwgdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXS5oYXNoICE9PSBvTmV3U3RhdGUuaGFzaCkge1xuXHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnB1c2gob05ld1N0YXRlKTtcblx0XHRcdGlmIChvTGFzdFJlbW92ZWRJdGVtICYmIHJlbW92ZUFwcFN0YXRlSW5IYXNoKG9MYXN0UmVtb3ZlZEl0ZW0uaGFzaCkgPT09IHJlbW92ZUFwcFN0YXRlSW5IYXNoKG9OZXdTdGF0ZS5oYXNoKSkge1xuXHRcdFx0XHRvTmV3U3RhdGUuZm9jdXNDb250cm9sSWQgPSBvTGFzdFJlbW92ZWRJdGVtLmZvY3VzQ29udHJvbElkO1xuXHRcdFx0XHRvTmV3U3RhdGUuZm9jdXNJbmZvID0gb0xhc3RSZW1vdmVkSXRlbS5mb2N1c0luZm87XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gNi4gRGV0ZXJtaW5lIHdoaWNoIGFjdGlvbnMgdG8gZG8gb24gdGhlIGhpc3Rvcnlcblx0XHRpZiAoaVBvcENvdW50ID09PSAwKSB7XG5cdFx0XHQvLyBObyBzdGF0ZSB3YXMgcG9wcGVkIC0tPiBhcHBlbmRcblx0XHRcdHJldHVybiB7IHR5cGU6IFwiYXBwZW5kXCIgfTtcblx0XHR9IGVsc2UgaWYgKGlQb3BDb3VudCA9PT0gMSkge1xuXHRcdFx0Ly8gT25seSAxIHN0YXRlIHdhcyBwb3BwZWQgLS0+IHJlcGxhY2UgY3VycmVudCBoYXNoIHVubGVzcyBoYXNoIGlzIHRoZSBzYW1lICh0aGVuIG5vdGhpbmcgdG8gZG8pXG5cdFx0XHRyZXR1cm4gYkhhc1NhbWVIYXNoID8geyB0eXBlOiBcIm5vbmVcIiB9IDogeyB0eXBlOiBcInJlcGxhY2VcIiB9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBNb3JlIHRoYW4gMSBzdGF0ZSB3YXMgcG9wcGVkIC0tPiBnbyBiYWtjIGluIGhpc3RvcnkgYW5kIHJlcGxhY2UgaGFzaCBpZiBuZWNlc3Nhcnlcblx0XHRcdHJldHVybiBiSGFzU2FtZUhhc2ggPyB7IHR5cGU6IFwiYmFja1wiLCBzdGVwczogaVBvcENvdW50IC0gMSB9IDogeyB0eXBlOiBcImJhY2stcmVwbGFjZVwiLCBzdGVwczogaVBvcENvdW50IC0gMSB9O1xuXHRcdH1cblx0fVxuXG5cdF9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIoKTogXCJDdXN0b21cIiB8IFwiQ29udGludWVcIiB7XG5cdFx0cmV0dXJuIHRoaXMuX2JEaXNhYmxlT25IYXNoQ2hhbmdlID8gXCJDdXN0b21cIiA6IFwiQ29udGludWVcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlIHRoZSByb3V0aW5nIGJ5IGNhbGxpbmcgdGhlIHJvdXRlciBzdG9wIG1ldGhvZC5cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZGlzYWJsZUV2ZW50T25IYXNoQ2hhbmdlKCk6IHZvaWQge1xuXHRcdHRoaXMuX2JEaXNhYmxlT25IYXNoQ2hhbmdlID0gdHJ1ZTtcblx0XHR0aGlzLl9vUm91dGVyLnN0b3AoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbmFibGUgdGhlIHJvdXRpbmcgYnkgY2FsbGluZyB0aGUgcm91dGVyIGluaXRpYWxpemUgbWV0aG9kLlxuXHQgKiBAcGFyYW0gW2JJZ25vcmVDdXJyZW50SGFzaF0gSWdub3JlIHRoZSBsYXN0IGhhc2ggZXZlbnQgdHJpZ2dlcmVkIGJlZm9yZSB0aGUgcm91dGVyIGhhcyBpbml0aWFsaXplZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9lbmFibGVFdmVudE9uSGFzaENoYW5nZShiSWdub3JlQ3VycmVudEhhc2g6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHR0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA9IGZhbHNlO1xuXHRcdHRoaXMuX29Sb3V0ZXIuaW5pdGlhbGl6ZShiSWdub3JlQ3VycmVudEhhc2gpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN5bmNocm9uaXplcyB0aGUgYnJvd3NlciBoaXN0b3J5IHdpdGggdGhlIGludGVybmFsIGhpc3Rvcnkgb2YgdGhlIHJvdXRlclByb3h5LCBhbmQgdHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIGlmIG5lZWRlZC5cblx0ICogQHBhcmFtIG9IaXN0b3J5QWN0aW9uIFNwZWNpZmllcyB0aGUgbmF2aWdhdGlvbiBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkXG5cdCAqIEBwYXJhbSBiUmVidWlsZE9ubHkgYHRydWVgIGlmIGludGVybmFsIGhpc3RvcnkgaXMgY3VycmVudGx5IGJlaW5nIHJlYnVpbHRcblx0ICogQHJldHVybnMgUHJvbWlzZSAocmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWQpIHRoYXQgcmV0dXJucyAndHJ1ZScgaWYgYSBuYXZpZ2F0aW9uIHRvb2sgcGxhY2UsICdmYWxzZScgaWYgdGhlIG5hdmlnYXRpb24gZGlkbid0IGhhcHBlblxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIF9yZWJ1aWxkQnJvd3Nlckhpc3Rvcnkob0hpc3RvcnlBY3Rpb246IEh5c3RvcnlBY3Rpb24sIGJSZWJ1aWxkT25seTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0dGhpcy5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSB0cnVlO1xuXHRcdFx0Y29uc3Qgb1RhcmdldFN0YXRlID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXSxcblx0XHRcdFx0bmV3TGV2ZWwgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTtcblxuXHRcdFx0ZnVuY3Rpb24gcmVwbGFjZUFzeW5jKCk6IHZvaWQge1xuXHRcdFx0XHRpZiAoIWJSZWJ1aWxkT25seSkge1xuXHRcdFx0XHRcdHRoYXQuX2VuYWJsZUV2ZW50T25IYXNoQ2hhbmdlKHRydWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0KHRoYXQuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5yZXBsYWNlSGFzaCBhcyBGdW5jdGlvbikob1RhcmdldFN0YXRlLmhhc2gpO1xuXHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHsgZmVMZXZlbDogbmV3TGV2ZWwgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXG5cdFx0XHRcdGlmIChiUmVidWlsZE9ubHkpIHtcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdC8vIFRpbWVvdXQgdG8gbGV0ICdoYXNoY2hhbmdlJyBldmVudCBiZSBwcm9jZXNzZWQgYmVmb3JlIGJ5IHRoZSBIYXNoQ2hhbmdlciwgc28gdGhhdFxuXHRcdFx0XHRcdFx0Ly8gb25Sb3V0ZU1hdGNoZWQgbm90aWZpY2F0aW9uIGlzbid0IHJhaXNlZFxuXHRcdFx0XHRcdFx0dGhhdC5fZW5hYmxlRXZlbnRPbkhhc2hDaGFuZ2UodHJ1ZSk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGF0LmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IGZhbHNlO1xuXHRcdFx0XHRyZXNvbHZlKHRydWUpOyAvLyBhIG5hdmlnYXRpb24gb2NjdXJyZWRcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXN5bmMgY2FsbGJhY2tzIHdoZW4gbmF2aWdhdGluZyBiYWNrLCBpbiBvcmRlciB0byBsZXQgYWxsIG5vdGlmaWNhdGlvbnMgYW5kIGV2ZW50cyBnZXQgcHJvY2Vzc2VkXG5cdFx0XHRmdW5jdGlvbiBiYWNrUmVwbGFjZUFzeW5jKCk6IHZvaWQge1xuXHRcdFx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tSZXBsYWNlQXN5bmMpO1xuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQvLyBUaW1lb3V0IHRvIGxldCAnaGFzaGNoYW5nZScgZXZlbnQgYmUgcHJvY2Vzc2VkIGJlZm9yZSBieSB0aGUgSGFzaENoYW5nZXJcblx0XHRcdFx0XHRyZXBsYWNlQXN5bmMoKTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGJhY2tBc3luYygpOiB2b2lkIHtcblx0XHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBiYWNrQXN5bmMpO1xuXHRcdFx0XHR0aGF0LmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IGZhbHNlO1xuXHRcdFx0XHRyZXNvbHZlKHRydWUpOyAvLyBhIG5hdmlnYXRpb24gb2NjdXJyZWRcblx0XHRcdH1cblxuXHRcdFx0dGhhdC5fYklnbm9yZVJlc3RvcmUgPSB0cnVlO1xuXG5cdFx0XHRzd2l0Y2ggKG9IaXN0b3J5QWN0aW9uLnR5cGUpIHtcblx0XHRcdFx0Y2FzZSBcInJlcGxhY2VcIjpcblx0XHRcdFx0XHRjb25zdCBmb2N1c0luZm8gPSBoaXN0b3J5LnN0YXRlPy5mb2N1c0luZm87XG5cdFx0XHRcdFx0KHRoYXQuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5yZXBsYWNlSGFzaCBhcyBGdW5jdGlvbikob1RhcmdldFN0YXRlLmhhc2gpO1xuXHRcdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKFxuXHRcdFx0XHRcdFx0T2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGZlTGV2ZWw6IG5ld0xldmVsLFxuXHRcdFx0XHRcdFx0XHRcdGZvY3VzSW5mbzogZm9jdXNJbmZvXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGhpc3Rvcnkuc3RhdGVcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcIlwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR0aGF0LmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7IC8vIGEgbmF2aWdhdGlvbiBvY2N1cnJlZFxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJhcHBlbmRcIjpcblx0XHRcdFx0XHR0aGF0Ll9vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkuc2V0SGFzaChvVGFyZ2V0U3RhdGUuaGFzaCk7XG5cdFx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoT2JqZWN0LmFzc2lnbih7IGZlTGV2ZWw6IG5ld0xldmVsIH0sIGhpc3Rvcnkuc3RhdGUpLCBcIlwiKTtcblx0XHRcdFx0XHR0aGF0LmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7IC8vIGEgbmF2aWdhdGlvbiBvY2N1cnJlZFxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJiYWNrXCI6XG5cdFx0XHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBiYWNrQXN5bmMpO1xuXHRcdFx0XHRcdGhpc3RvcnkuZ28oLW9IaXN0b3J5QWN0aW9uLnN0ZXBzKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiYmFjay1yZXBsYWNlXCI6XG5cdFx0XHRcdFx0dGhpcy5fZGlzYWJsZUV2ZW50T25IYXNoQ2hhbmdlKCk7XG5cdFx0XHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBiYWNrUmVwbGFjZUFzeW5jKTtcblx0XHRcdFx0XHRoaXN0b3J5LmdvKC1vSGlzdG9yeUFjdGlvbi5zdGVwcyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHQvLyBObyBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0dGhpcy5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0XHRyZXNvbHZlKGZhbHNlKTsgLy8gbm8gbmF2aWdhdGlvbiAtLT4gcmVzb2x2ZSB0byBmYWxzZVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Z2V0TGFzdEhpc3RvcnlFbnRyeSgpOiBSb3V0ZXJTdGF0ZSB7XG5cdFx0cmV0dXJuIHRoaXMuX29NYW5hZ2VkSGlzdG9yeVt0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMV07XG5cdH1cblxuXHRzZXRQYXRoTWFwcGluZyhtYXBwaW5nczogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W10pOiB2b2lkIHtcblx0XHR0aGlzLl9wYXRoTWFwcGluZ3MgPSBtYXBwaW5ncy5maWx0ZXIoKG1hcHBpbmcpID0+IHtcblx0XHRcdHJldHVybiBtYXBwaW5nLm9sZFBhdGggIT09IG1hcHBpbmcubmV3UGF0aDtcblx0XHR9KTtcblx0fVxuXG5cdGhhc2hHdWFyZCgpOiB2b2lkIHtcblx0XHRsZXQgc0hhc2ggPSB0aGlzLmdldERlY29kZWRXaW5kb3dIYXNoKCk7XG5cdFx0Y29uc3QgY3VycmVudEFwcE5hbWUgPSB0aGlzLmdldEFwcE5hbWVGcm9tSGFzaChzSGFzaCk7XG5cdFx0aWYgKGN1cnJlbnRBcHBOYW1lICE9IHRoaXMuYXBwTmFtZSkge1xuXHRcdFx0Ly8gV2hlbiBkb2luZyBleHRlcm5hbCBuYXZpZ2F0aW9uIGluIGFub3RoZXIgd2luZG93LCB0aGUgY3VycmVudCB3aW5kb3cgbG9jYXRpb24gaXMgdGVtcG9yYXJpbHkgbW9kaWZpZWQgd2l0aCB0aGUgVVJMIG9mIHRoZSB0YXJnZXQgYXBwXG5cdFx0XHQvLyBJbiB0aGlzIGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gdXBkYXRlIHRoZSBpbnRlcm5hbGx5IG1hbmFnZWQgaGlzdG9yeSwgc28gd2Ugc2ltcGx5IGRvIG5vdGhpbmdcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoc0hhc2guaW5jbHVkZXMoXCJyZXN0b3JlSGlzdG9yeT10cnVlXCIpKSB7XG5cdFx0XHR0aGlzLl9iQXBwbHlSZXN0b3JlID0gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKCF0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZykge1xuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIGhhc2ggbmVlZHMgdG8gYmUgY2hhbmdlZCAodGhpcyBoYXBwZW5zIGluIEZDTCB3aGVuIHN3aXRjaGluZyBiL3cgZWRpdCBhbmQgcmVhZC1vbmx5IHdpdGggMyBjb2x1bW5zIG9wZW4pXG5cdFx0XHRjb25zdCBtYXBwaW5nID0gdGhpcy5fcGF0aE1hcHBpbmdzLmZpbmQoKG0pID0+IHtcblx0XHRcdFx0cmV0dXJuIHNIYXNoLmluY2x1ZGVzKG0ub2xkUGF0aCk7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChtYXBwaW5nKSB7XG5cdFx0XHRcdC8vIFJlcGxhY2UgdGhlIGN1cnJlbnQgaGFzaFxuXHRcdFx0XHRzSGFzaCA9IHNIYXNoLnJlcGxhY2UobWFwcGluZy5vbGRQYXRoLCBtYXBwaW5nLm5ld1BhdGgpO1xuXHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHt9LCBoaXN0b3J5LnN0YXRlKSwgXCJcIiwgZW5jb2RlVVJJKHNIYXNoKSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGFIYXNoU3BsaXQgPSBzSGFzaC5zcGxpdChcIiYvXCIpO1xuXHRcdFx0Y29uc3Qgc0FwcEhhc2ggPSBhSGFzaFNwbGl0WzFdID8gYUhhc2hTcGxpdFsxXSA6IFwiXCI7XG5cdFx0XHRpZiAodGhpcy5jaGVja0hhc2hXaXRoR3VhcmQoc0FwcEhhc2gpKSB7XG5cdFx0XHRcdGNvbnN0IG9OZXdTdGF0ZSA9IHRoaXMuX2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNBcHBIYXNoKTtcblx0XHRcdFx0dGhpcy5fcHVzaE5ld1N0YXRlKG9OZXdTdGF0ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ29tcGFyZXMgMiBzdGF0ZXMuXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU3RhdGUxXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU3RhdGUyXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb246XG5cdCAqICAgICAgICAtIGVudW1TdGF0ZS5FUVVBTCBpZiBvU3RhdGUxIGFuZCBvU3RhdGUyIGFyZSBlcXVhbFxuXHQgKiAgICAgICAgLSBlbnVtU3RhdGUuQ09NUEFUSUJMRSBpZiBvU3RhdGUxIGFuZCBvU3RhdGUyIGFyZSBjb21wYXRpYmxlXG5cdCAqICAgICAgICAtIGVudW1TdGF0ZS5BTkNFU1RPUiBpZiBvU3RhdGUxIGlzIGFuIGFuY2VzdG9yIG9mIG9TdGF0ZTJcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkRJRkZFUkVOVCBpZiB0aGUgMiBzdGF0ZXMgYXJlIGRpZmZlcmVudFxuXHQgKi9cblxuXHRfY29tcGFyZUNhY2hlU3RhdGVzKG9TdGF0ZTE6IFJvdXRlclN0YXRlLCBvU3RhdGUyOiBSb3V0ZXJTdGF0ZSk6IG51bWJlciB7XG5cdFx0Ly8gRmlyc3QgY29tcGFyZSBvYmplY3Qga2V5c1xuXHRcdGlmIChvU3RhdGUxLmtleXMubGVuZ3RoID4gb1N0YXRlMi5rZXlzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGVudW1TdGF0ZS5ESUZGRVJFTlQ7XG5cdFx0fVxuXHRcdGxldCBlcXVhbCA9IHRydWU7XG5cdFx0bGV0IGluZGV4O1xuXHRcdGZvciAoaW5kZXggPSAwOyBlcXVhbCAmJiBpbmRleCA8IG9TdGF0ZTEua2V5cy5sZW5ndGg7IGluZGV4KyspIHtcblx0XHRcdGlmIChvU3RhdGUxLmtleXNbaW5kZXhdICE9PSBvU3RhdGUyLmtleXNbaW5kZXhdKSB7XG5cdFx0XHRcdGVxdWFsID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghZXF1YWwpIHtcblx0XHRcdC8vIFNvbWUgb2JqZWN0cyBrZXlzIGFyZSBkaWZmZXJlbnRcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuRElGRkVSRU5UO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBrZXlzIGZyb20gb1N0YXRlMSBhcmUgaW4gb1N0YXRlMiAtLT4gY2hlY2sgaWYgYW5jZXN0b3Jcblx0XHRpZiAob1N0YXRlMS5rZXlzLmxlbmd0aCA8IG9TdGF0ZTIua2V5cy5sZW5ndGggfHwgb1N0YXRlMS5zY3JlZW5Nb2RlIDwgb1N0YXRlMi5zY3JlZW5Nb2RlKSB7XG5cdFx0XHRyZXR1cm4gZW51bVN0YXRlLkFOQ0VTVE9SO1xuXHRcdH1cblx0XHRpZiAob1N0YXRlMS5zY3JlZW5Nb2RlID4gb1N0YXRlMi5zY3JlZW5Nb2RlKSB7XG5cdFx0XHRyZXR1cm4gZW51bVN0YXRlLkRJRkZFUkVOVDsgLy8gTm90IHN1cmUgdGhpcyBjYXNlIGNhbiBoYXBwZW4uLi5cblx0XHR9XG5cblx0XHQvLyBBdCB0aGlzIHN0YWdlLCB0aGUgMiBzdGF0ZXMgaGF2ZSB0aGUgc2FtZSBvYmplY3Qga2V5cyAoaW4gdGhlIHNhbWUgb3JkZXIpIGFuZCBzYW1lIHNjcmVlbm1vZGVcblx0XHQvLyBUaGV5IGNhbiBiZSBlaXRoZXIgY29tcGF0aWJsZSBvciBlcXVhbFxuXHRcdHJldHVybiBvU3RhdGUxLnNMYXlvdXQgPT09IG9TdGF0ZTIuc0xheW91dCA/IGVudW1TdGF0ZS5FUVVBTCA6IGVudW1TdGF0ZS5DT01QQVRJQkxFO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNwbGl0IHRoZSBhcHAtc3BlY2lmaWMgcm91dGUgYXQgdGhlIFwiJi9cIiBzZXBhcmF0b3IuXG5cdCAqXG5cdCAqIFRoZSBhcHAtc3BlY2lmaWMgcm91dGUgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUgc2VnbWVudHMgc2VwYXJhdGVkIGJ5IFwiJi9cIi5cblx0ICogQGV4YW1wbGVcblx0ICogc3BsaXRBcHBTcGVjaWZpY1JvdXRlKFwiJi9FbnRpdHkoJ2FiYycpL05leHRFbnRpdHkoJ3h5eicpXCIpO1xuXHQgKiAvLyBbXCJFbnRpdHkoJ2FiYycpL05leHRFbnRpdHkoJ3h5eicpXCJdXG5cdCAqXG5cdCAqIHNwbGl0QXBwU3BlY2lmaWNSb3V0ZShcIiYvRW50aXR5KCdhYmMnKS9OZXh0RW50aXR5KCd4eXonKSYvUHJlZml4L05lc3RlZFJvdXRlXCIpO1xuXHQgKiAvLyBbXCJFbnRpdHkoJ2FiYycpL05leHRFbnRpdHkoJ3h5eicpXCIsIFwiUHJlZml4L05lc3RlZFJvdXRlXCJdXG5cdCAqIEBwYXJhbSBhcHBTcGVjaWZpY1JvdXRlXHRUaGUgYXBwLXNwZWNpZmljIHJvdXRlLlxuXHQgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhcHAtc3BlY2lmaWMgcm91dGUgc2VnbWVudHMuXG5cdCAqL1xuXHRwcml2YXRlIHN0YXRpYyBzcGxpdEFwcFNwZWNpZmljUm91dGUoYXBwU3BlY2lmaWNSb3V0ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IHJvdXRlU3BsaXQgPSBhcHBTcGVjaWZpY1JvdXRlPy5zcGxpdChcIiYvXCIpID8/IFtdO1xuXHRcdGlmICghcm91dGVTcGxpdFswXSkge1xuXHRcdFx0cm91dGVTcGxpdC5zaGlmdCgpOyAvLyByZW1vdmUgdGhlIGxlYWRpbmcgZW1wdHkgc2VnbWVudCAodGhlIGFwcC1zcGVjaWZpYyByb3V0ZSBzdGFydHMgd2l0aCBcIiYvXCIpXG5cdFx0fVxuXHRcdHJldHVybiByb3V0ZVNwbGl0O1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBiYWNrIGV4aXRzIHRoZSBwcmVzZW50IGd1YXJkIHNldC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGJhY2sgZXhpdHMgdGhlIGd1YXJkXG5cdCAqL1xuXHRjaGVja0lmQmFja0lzT3V0T2ZHdWFyZCgpOiBib29sZWFuIHtcblx0XHQvLyBXZSB1c2Ugd2luZG93LmxvY2F0aW9uLmhhc2ggaW5zdGVhZCBvZiBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpLmdldEhhc2goKSBiZWNhdXNlIHRoZSBsYXR0ZXJcblx0XHQvLyByZXBsYWNlcyBjaGFyYWN0ZXJzIGluIHRoZSBVUkwgKGUuZy4gJTI0IHJlcGxhY2VkIGJ5ICQpIGFuZCBpdCBjYXVzZXMgaXNzdWVzIHdoZW4gY29tcGFyaW5nXG5cdFx0Ly8gd2l0aCB0aGUgVVJMcyBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5XG5cdFx0Y29uc3Qgc3BsaXRIYXNoID0gdGhpcy5nZXRGdWxsSGFzaCgpO1xuXG5cdFx0Y29uc3Qgc2VnbWVudHMgPSBSb3V0ZXJQcm94eS5zcGxpdEFwcFNwZWNpZmljUm91dGUoc3BsaXRIYXNoKTtcblxuXHRcdGlmIChzZWdtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0XHQvLyB0aGVyZSBpcyBhIG5lc3RlZCByb3V0ZSBpbnZvbHZlZCAtPiBhc3N1bWUgd2UgYXJlIHN0aWxsIGluc2lkZSB0aGUgZ3VhcmRcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRjb25zdCBoYXNoID0gc2VnbWVudHNbMF0gPz8gXCJcIjtcblxuXHRcdGxldCBwcmV2aW91c0hhc2g7XG5cdFx0aWYgKHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQpIHtcblx0XHRcdGZvciAobGV0IGkgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuXHRcdFx0XHRpZiAodGhpcy5fb01hbmFnZWRIaXN0b3J5W2ldLmhhc2ggPT09IGhhc2gpIHtcblx0XHRcdFx0XHRwcmV2aW91c0hhc2ggPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaSAtIDFdLmhhc2g7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuICFwcmV2aW91c0hhc2ggfHwgIXRoaXMuY2hlY2tIYXNoV2l0aEd1YXJkKHByZXZpb3VzSGFzaCk7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIGxhc3QgMiBlbnRyaWVzIGluIHRoZSBoaXN0b3J5IHNoYXJlIHRoZSBzYW1lIGNvbnRleHQuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGV5IHNoYXJlIHRoZSBzYW1lIGNvbnRleHQuXG5cdCAqL1xuXHRjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0KCk6IGJvb2xlYW4ge1xuXHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIDwgMikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9DdXJyZW50U3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHRcdGNvbnN0IG9QcmV2aW91c1N0YXRlID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAyXTtcblxuXHRcdHJldHVybiBvQ3VycmVudFN0YXRlLmhhc2guc3BsaXQoXCI/XCIpWzBdID09PSBvUHJldmlvdXNTdGF0ZS5oYXNoLnNwbGl0KFwiP1wiKVswXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXN0b3JlcyB0aGUgZm9jdXMgZm9yIHRoZSBjdXJyZW50IGhhc2gsIGlmIHdlIGNhbiBmaW5kIGl0IGluIHRoZSBoaXN0b3J5LlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGZvY3VzIHdhcyBzZXQsIGZhbHNlIG90aGVyd2lzZS5cblx0ICovXG5cdHJlc3RvcmVGb2N1c0ZvckN1cnJlbnRIYXNoKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGN1cnJlbnRIYXNoID0gcmVtb3ZlQXBwU3RhdGVJbkhhc2godGhpcy5nZXRIYXNoKCkpO1xuXHRcdGNvbnN0IHN0YXRlRm9ySGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5maW5kKChzdGF0ZSkgPT4ge1xuXHRcdFx0cmV0dXJuIHJlbW92ZUFwcFN0YXRlSW5IYXNoKHN0YXRlLmhhc2gpID09PSBjdXJyZW50SGFzaDtcblx0XHR9KTtcblxuXHRcdGxldCBmb2N1c0FwcGxpZWQgPSBmYWxzZTtcblx0XHRpZiAoc3RhdGVGb3JIYXNoPy5mb2N1c0NvbnRyb2xJZCkge1xuXHRcdFx0Y29uc3QgZm9jdXNDb250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChzdGF0ZUZvckhhc2guZm9jdXNDb250cm9sSWQpO1xuXHRcdFx0Zm9jdXNDb250cm9sPy5mb2N1cyhzdGF0ZUZvckhhc2guZm9jdXNJbmZvKTtcblx0XHRcdGZvY3VzQXBwbGllZCA9IGZvY3VzQ29udHJvbCAhPT0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBmb2N1c0FwcGxpZWQ7XG5cdH1cblxuXHQvKipcblx0ICogU3RvcmVzIHRoZSBJRCBvZiB0aGUgY3VycmVudGx5IGZvY3VzZWQgY29udHJvbCBpbiB0aGUgaGlzdG9yeSBmb3IgdGhlIGN1cnJlbnQgaGFzaC5cblx0ICpcblx0ICovXG5cdHByaXZhdGUgc3RvcmVGb2N1c0luZm9Gb3JDdXJyZW50SGFzaCgpOiB2b2lkIHtcblx0XHRjb25zdCBjdXJyZW50SGFzaCA9IHJlbW92ZUFwcFN0YXRlSW5IYXNoKHRoaXMuZ2V0SGFzaCgpKTtcblx0XHRjb25zdCBzdGF0ZUZvckhhc2ggPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkuZmluZCgoc3RhdGUpID0+IHtcblx0XHRcdHJldHVybiByZW1vdmVBcHBTdGF0ZUluSGFzaChzdGF0ZS5oYXNoKSA9PT0gY3VycmVudEhhc2g7XG5cdFx0fSk7XG5cdFx0aWYgKHN0YXRlRm9ySGFzaCkge1xuXHRcdFx0Y29uc3QgZm9jdXNDb250cm9sID0gRWxlbWVudC5nZXRBY3RpdmVFbGVtZW50KCk7XG5cdFx0XHRzdGF0ZUZvckhhc2guZm9jdXNDb250cm9sSWQgPSBmb2N1c0NvbnRyb2w/LmdldElkKCk7XG5cdFx0XHRzdGF0ZUZvckhhc2guZm9jdXNJbmZvID0gZm9jdXNDb250cm9sPy5nZXRGb2N1c0luZm8oKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRmluZHMgYSBsYXlvdXQgdmFsdWUgZm9yIGEgaGFzaCBpbiB0aGUgaGlzdG9yeS5cblx0ICogQHBhcmFtIGhhc2ggVGhlIGhhc2ggdG8gbG9vayBmb3IgaW4gdGhlIGhpc3RvcnkuXG5cdCAqIEByZXR1cm5zIEEgbGF5b3V0IHZhbHVlIGlmIGl0IGNvdWxkIGJlIGZvdW5kLCB1bmRlZmluZWQgb3RoZXJ3aXNlLlxuXHQgKi9cblx0ZmluZExheW91dEZvckhhc2goaGFzaDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoIXRoaXMuZmNsRW5hYmxlZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgYWxsIHF1ZXJ5IHBhcmFtZXRlcnMgZnJvbSB0aGUgaGFzaFxuXHRcdGNvbnN0IGhhc2hOb1BhcmFtID0gaGFzaC5zcGxpdChcIj9cIilbMF07XG5cblx0XHQvLyBMb29rIGZvciB0aGUgc3RhdGUgYmFja3dhcmRzLCBzbyB0aGF0IHdlIGZpbmQgdGhlIGxhc3Qgc3RhdGUgaW4gdGhlIGhpc3RvcnkgKGUuZy4gaWYgd2UgaGF2ZSAyIHN0YXRlcyB3aXRoIHRoZSBzYW1lIGhhc2ggYnV0IDIgZGlmZmVyZW50IGxheW91dHMpXG5cdFx0bGV0IHRhcmdldFN0YXRlOiBSb3V0ZXJTdGF0ZSB8IHVuZGVmaW5lZDtcblx0XHRmb3IgKGxldCBpbmRleCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxOyBpbmRleCA+PSAwICYmIHRhcmdldFN0YXRlID09PSB1bmRlZmluZWQ7IGluZGV4LS0pIHtcblx0XHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaW5kZXhdLmhhc2guc3BsaXQoXCI/XCIpWzBdID09PSBoYXNoTm9QYXJhbSkge1xuXHRcdFx0XHR0YXJnZXRTdGF0ZSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpbmRleF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldFN0YXRlPy5zTGF5b3V0O1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRlclByb3h5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztFQVdBLE1BQU1BLFNBQVMsR0FBRztJQUNqQkMsS0FBSyxFQUFFLENBQUM7SUFDUkMsVUFBVSxFQUFFLENBQUM7SUFDYkMsUUFBUSxFQUFFLENBQUM7SUFDWEMsU0FBUyxFQUFFO0VBQ1osQ0FBQztFQUNELE1BQU1DLGFBQWEsR0FBRztJQUNyQkMsV0FBVyxFQUFFLFFBQVE7SUFDckJDLGNBQWMsRUFBRTtFQUNqQixDQUFDO0VBb0JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTQyxtQkFBbUJBLENBQUNDLFVBQWtCLEVBQW1CO0lBQ2pFLE9BQU87TUFDTkMsVUFBVSxFQUFFRCxVQUFVLENBQUNFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO01BQUU7TUFD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
912
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnVtU3RhdGUiLCJFUVVBTCIsIkNPTVBBVElCTEUiLCJBTkNFU1RPUiIsIkRJRkZFUkVOVCIsImVudW1VUkxQYXJhbXMiLCJMQVlPVVRQQVJBTSIsIklBUFBTVEFURVBBUkFNIiwiY3JlYXRlR3VhcmRGcm9tSGFzaCIsInNHdWFyZEhhc2giLCJfZ3VhcmRIYXNoIiwicmVwbGFjZSIsImNoZWNrIiwic0hhc2giLCJpbmRleE9mIiwicmVtb3ZlQXBwU3RhdGVJbkhhc2giLCJSZWdFeHAiLCJSb3V0ZXJQcm94eSIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9jbGFzcyIsIl9CYXNlT2JqZWN0IiwiX3RoaXMiLCJfbGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImNhbGwiLCJiSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmciLCJiSXNDb21wdXRpbmdUaXRsZUhpZXJhY2h5IiwiYklzR3VhcmRDcm9zc0FsbG93ZWQiLCJzSUFwcFN0YXRlS2V5IiwiX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvIiwiX2JBcHBseVJlc3RvcmUiLCJfcGF0aE1hcHBpbmdzIiwicmVzdG9yZUhpc3RvcnlUcmlnZ2VyZWQiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsImluaXQiLCJvQXBwQ29tcG9uZW50IiwiaXNmY2xFbmFibGVkIiwiZ2V0U2VydmljZSIsInRoZW4iLCJhc3luY0luaXQiLCJjYXRjaCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiX2ZuSGFzaEd1YXJkIiwiaGFzaEd1YXJkIiwiYmluZCIsIndpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJfYkRpc2FibGVPbkhhc2hDaGFuZ2UiLCJfYklnbm9yZVJlc3RvcmUiLCJfYkZvcmNlRm9jdXMiLCJfb1NoZWxsU2VydmljZXMiLCJnZXRTaGVsbFNlcnZpY2VzIiwiaW5pdFJhdyIsImdldFJvdXRlciIsIndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbiIsImhpc3RvcnkiLCJyZXBsYWNlU3RhdGUiLCJPYmplY3QiLCJhc3NpZ24iLCJmZUxldmVsIiwic3RhdGUiLCJsb2NhdGlvbiIsImZjbEVuYWJsZWQiLCJfZm5CbG9ja2luZ05hdkZpbHRlciIsIl9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIiLCJyZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJkZXN0cm95IiwidW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic2V0QXBwU3RhdGVJbkhhc2giLCJzQXBwU3RhdGVLZXkiLCJzTmV3SGFzaCIsImluY2x1ZGVzIiwiZmluZEFwcFN0YXRlSW5IYXNoIiwiYUFwcFN0YXRlIiwibWF0Y2giLCJnZXREZWNvZGVkV2luZG93SGFzaCIsImRlY29kZVVSSSIsImhhc2giLCJvUm91dGVyIiwiX29Sb3V0ZXIiLCJfb01hbmFnZWRIaXN0b3J5IiwiX29OYXZpZ2F0aW9uR3VhcmQiLCJzQ3VycmVudEFwcEhhc2giLCJnZXRIYXNoIiwicHVzaCIsIl9leHRyYWN0U3RhdGVGcm9tSGFzaCIsImFwcE5hbWUiLCJnZXRBcHBOYW1lRnJvbUhhc2giLCJnZXRGdWxsSGFzaCIsInNwbGl0SGFzaCIsImFwcFNwZWNpZmljUm91dGUiLCJnZXRIYXNoQ2hhbmdlciIsInNoZWxsUGFydCIsImlzRm9jdXNGb3JjZWQiLCJzZXRGb2N1c0ZvcmNlZCIsImJGb3JjZWQiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJuYXZUb0hhc2giLCJiUHJlc2VydmVIaXN0b3J5IiwiYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSIsImJGb3JjZUZvY3VzIiwiYlByZXNlcnZlU2hlbGxCYWNrTmF2aWdhdGlvbkhhbmRsZXIiLCJzZXRCYWNrTmF2aWdhdGlvbiIsIl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsIndhaXRGb3IiLCJ1bmRlZmluZWQiLCJfaW50ZXJuYWxOYXZUb0hhc2giLCJjaGVja0hhc2hXaXRoR3VhcmQiLCJvUmVzb3VyY2VCdW5kbGUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJjb25maXJtIiwiZ2V0VGV4dCIsIlByb21pc2UiLCJyZXNvbHZlIiwib05ld1N0YXRlIiwiYUN1cnJlbnRIYXNoS2V5cyIsIl9leHRyYWN0RW50aXR5U2V0c0Zyb21IYXNoIiwia2V5cyIsImV2ZXJ5Iiwia2V5IiwiaW5kZXgiLCJvSGlzdG9yeUFjdGlvbiIsIl9wdXNoTmV3U3RhdGUiLCJzdG9yZUZvY3VzSW5mb0ZvckN1cnJlbnRIYXNoIiwiX3JlYnVpbGRCcm93c2VySGlzdG9yeSIsInJlc3RvcmVIaXN0b3J5Iiwic1RhcmdldEhhc2giLCJjaGVja1Jlc3RvcmVIaXN0b3J5V2FzVHJpZ2dlcmVkIiwicmVzZXRSZXN0b3JlSGlzdG9yeUZsYWciLCJuYXZCYWNrIiwic0N1cnJlbnRIYXNoIiwic1ByZXZpb3VzSGFzaCIsImkiLCJiYWNrIiwibmF2VG8iLCJzUm91dGVOYW1lIiwib1BhcmFtZXRlcnMiLCJnZXRVUkwiLCJub1ByZXNlcnZhdGlvbkNhY2hlIiwiYklzU3RpY2t5TW9kZSIsImV4aXRGcm9tQXBwIiwiYmFja1RvUHJldmlvdXNBcHAiLCJpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkiLCJzdWJzdHJpbmciLCJvTG9jYWxHdWFyZCIsImlzTmF2aWdhdGlvbkZpbmFsaXplZCIsInNldE5hdmlnYXRpb25HdWFyZCIsImRpc2NhcmROYXZpZ2F0aW9uR3VhcmQiLCJoYXNOYXZpZ2F0aW9uR3VhcmQiLCJpc0d1YXJkQ3Jvc3NBbGxvd2VkQnlVc2VyIiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwicmVzb2x2ZVJvdXRlTWF0Y2giLCJTeW5jaHJvbml6YXRpb24iLCJzSGFzaE5vUGFyYW1zIiwic3BsaXQiLCJhVG9rZW5zIiwibmFtZXMiLCJmb3JFYWNoIiwic1Rva2VuIiwib1N0YXRlIiwic2NyZWVuTW9kZSIsImFMYXlvdXQiLCJzTGF5b3V0IiwiYlJlYnVpbGRPbmx5IiwiYkRpc2FibGVIaXN0b3J5UHJlc2VydmF0aW9uIiwibGFzdEluZGV4IiwiaVBvcENvdW50IiwicG9wIiwicHJlc2VydmVkIiwib0xhc3RSZW1vdmVkSXRlbSIsIm9Ub3BTdGF0ZSIsIl9jb21wYXJlQ2FjaGVTdGF0ZXMiLCJzUHJldmlvdXNJQXBwU3RhdGVLZXkiLCJvQ29tcGFyaXNvblN0YXRlUmVzdWx0IiwiYkhhc1NhbWVIYXNoIiwiZm9jdXNDb250cm9sSWQiLCJzZWNvbmRhcnlGb2N1c0NvbnRyb2xJZCIsImZvY3VzSW5mbyIsInNlY29uZGFyeUZvY3VzSW5mbyIsInR5cGUiLCJzdGVwcyIsIl9kaXNhYmxlRXZlbnRPbkhhc2hDaGFuZ2UiLCJzdG9wIiwiX2VuYWJsZUV2ZW50T25IYXNoQ2hhbmdlIiwiYklnbm9yZUN1cnJlbnRIYXNoIiwiaW5pdGlhbGl6ZSIsInRoYXQiLCJvVGFyZ2V0U3RhdGUiLCJuZXdMZXZlbCIsInJlcGxhY2VBc3luYyIsInJlcGxhY2VIYXNoIiwic2V0VGltZW91dCIsImJhY2tSZXBsYWNlQXN5bmMiLCJiYWNrQXN5bmMiLCJzZXRIYXNoIiwiZ28iLCJnZXRMYXN0SGlzdG9yeUVudHJ5Iiwic2V0UGF0aE1hcHBpbmciLCJtYXBwaW5ncyIsImZpbHRlciIsIm1hcHBpbmciLCJvbGRQYXRoIiwibmV3UGF0aCIsImN1cnJlbnRBcHBOYW1lIiwiZmluZCIsIm0iLCJlbmNvZGVVUkkiLCJhSGFzaFNwbGl0Iiwic0FwcEhhc2giLCJvU3RhdGUxIiwib1N0YXRlMiIsImVxdWFsIiwic3BsaXRBcHBTcGVjaWZpY1JvdXRlIiwicm91dGVTcGxpdCIsInNoaWZ0IiwiY2hlY2tJZkJhY2tJc091dE9mR3VhcmQiLCJzZWdtZW50cyIsInByZXZpb3VzSGFzaCIsImNoZWNrSWZCYWNrRXhpdHNBcHAiLCJjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0Iiwib0N1cnJlbnRTdGF0ZSIsIm9QcmV2aW91c1N0YXRlIiwicmVzdG9yZUZvY3VzRm9yQ3VycmVudEhhc2giLCJjdXJyZW50SGFzaCIsInN0YXRlRm9ySGFzaCIsImZvY3VzQXBwbGllZCIsImZvY3VzQ29udHJvbCIsIkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdldEZvY3VzRG9tUmVmIiwiZ2V0UGFyZW50IiwiaXNBIiwiZ2V0QnVzeSIsImZvY3VzIiwiZ2V0QWN0aXZlRWxlbWVudCIsImdldElkIiwicGFyZW50VGFibGUiLCJwcmV2ZW50U2Nyb2xsIiwiZ2V0Rm9jdXNJbmZvIiwiZmluZExheW91dEZvckhhc2giLCJoYXNoTm9QYXJhbSIsInRhcmdldFN0YXRlIiwiQmFzZU9iamVjdCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiUm91dGVyUHJveHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IFN5bmNocm9uaXphdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TeW5jaHJvbml6YXRpb25cIjtcbmltcG9ydCB0eXBlIHsgSVNoZWxsU2VydmljZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2hlbGxTZXJ2aWNlc0ZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIE1UYWJsZSBmcm9tIFwic2FwL20vVGFibGVcIjtcbmltcG9ydCBCYXNlT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9PYmplY3RcIjtcbmltcG9ydCBFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgVUlUYWJsZSBmcm9tIFwic2FwL3VpL3RhYmxlL1RhYmxlXCI7XG5cbmNvbnN0IGVudW1TdGF0ZSA9IHtcblx0RVFVQUw6IDAsXG5cdENPTVBBVElCTEU6IDEsXG5cdEFOQ0VTVE9SOiAyLFxuXHRESUZGRVJFTlQ6IDNcbn07XG5jb25zdCBlbnVtVVJMUGFyYW1zID0ge1xuXHRMQVlPVVRQQVJBTTogXCJsYXlvdXRcIixcblx0SUFQUFNUQVRFUEFSQU06IFwic2FwLWlhcHAtc3RhdGVcIlxufTtcblxudHlwZSBSb3V0ZXJTdGF0ZSA9IHtcblx0a2V5czogc3RyaW5nW107XG5cdGhhc2g6IHN0cmluZztcblx0cHJlc2VydmVkPzogYm9vbGVhbjtcblx0c0xheW91dD86IHN0cmluZztcblx0c2NyZWVuTW9kZTogbnVtYmVyO1xuXHRmb2N1c0NvbnRyb2xJZD86IHN0cmluZztcblx0c2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQ/OiBzdHJpbmc7XG5cdGZvY3VzSW5mbz86IHtcblx0XHRwcmV2ZW50U2Nyb2xsPzogYm9vbGVhbjtcblx0XHR0YXJnZXRJbmZvPzogdW5rbm93bjtcblx0fTtcblx0c2Vjb25kYXJ5Rm9jdXNJbmZvPzoge1xuXHRcdHByZXZlbnRTY3JvbGw/OiBib29sZWFuO1xuXHR9O1xufTtcblxudHlwZSBPdGhlckhpc3RvcnlBY3Rpb24gPSB7IHR5cGU6IFwiYXBwZW5kXCIgfCBcIm5vbmVcIiB8IFwicmVwbGFjZVwiIH07XG5leHBvcnQgdHlwZSBCYWNrSGlzdG9yeUFjdGlvbiA9IHsgdHlwZTogXCJiYWNrXCIgfCBcImJhY2stcmVwbGFjZVwiOyBzdGVwczogbnVtYmVyIH07XG50eXBlIEh5c3RvcnlBY3Rpb24gPSBCYWNrSGlzdG9yeUFjdGlvbiB8IE90aGVySGlzdG9yeUFjdGlvbjtcblxudHlwZSBOYXZpZ2F0aW9uR3VhcmQgPSB7IF9ndWFyZEhhc2g6IHN0cmluZzsgY2hlY2s6IChoYXNoOiBzdHJpbmcpID0+IGJvb2xlYW4gfTtcbi8qKlxuICogQ3JlYXRlcyBhIEhhc2hHdWFyZCBvYmplY3QuXG4gKiBAcGFyYW0gc0d1YXJkSGFzaCBUaGUgaGFzaCB1c2VkIGZvciB0aGUgZ3VhcmRcbiAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGhhc2ggZ3VhcmRcbiAqL1xuZnVuY3Rpb24gY3JlYXRlR3VhcmRGcm9tSGFzaChzR3VhcmRIYXNoOiBzdHJpbmcpOiBOYXZpZ2F0aW9uR3VhcmQge1xuXHRyZXR1cm4ge1xuXHRcdF9ndWFyZEhhc2g6IHNHdWFyZEhhc2gucmVwbGFjZSgvXFw/W14/XSokLywgXCJcIiksIC8vIFJlbW92ZSBxdWVyeSBwYXJ0XG5cdFx0Y2hlY2s6IGZ1bmN0aW9uIChzSGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRyZXR1cm4gc0hhc2guaW5kZXhPZih0aGlzLl9ndWFyZEhhc2gpID09PSAwO1xuXHRcdH1cblx0fTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGhhc2ggd2l0aG91dCBpdHMgaUFwcFN0YXRlIHBhcnQuXG4gKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2hcbiAqIEByZXR1cm5zIFRoZSBoYXNoIHdpdGhvdXQgdGhlIGlBcHBTdGF0ZVxuICovXG5mdW5jdGlvbiByZW1vdmVBcHBTdGF0ZUluSGFzaChzSGFzaDogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHNIYXNoLnJlcGxhY2UobmV3IFJlZ0V4cChgWyY/XSoke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PVteJl0qYCksIFwiXCIpO1xufVxuXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5Sb3V0ZXJQcm94eVwiKVxuY2xhc3MgUm91dGVyUHJveHkgZXh0ZW5kcyBCYXNlT2JqZWN0IHtcblx0YklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cblx0YklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeSA9IGZhbHNlO1xuXG5cdGJJc0d1YXJkQ3Jvc3NBbGxvd2VkID0gZmFsc2U7XG5cblx0c0lBcHBTdGF0ZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cblx0X29TaGVsbFNlcnZpY2VzITogSVNoZWxsU2VydmljZXM7XG5cblx0ZmNsRW5hYmxlZCE6IGJvb2xlYW47XG5cblx0X2ZuQmxvY2tpbmdOYXZGaWx0ZXIhOiBGdW5jdGlvbjtcblxuXHRfZm5IYXNoR3VhcmQhOiAodGhpczogV2luZG93LCBwb3BTdGF0ZUV2ZW50OiBQb3BTdGF0ZUV2ZW50KSA9PiB1bmtub3duO1xuXG5cdF9iRGlzYWJsZU9uSGFzaENoYW5nZSE6IGJvb2xlYW47XG5cblx0X2JJZ25vcmVSZXN0b3JlITogYm9vbGVhbjtcblxuXHRfYkZvcmNlRm9jdXMhOiBib29sZWFuO1xuXG5cdF9vUm91dGVyITogUm91dGVyO1xuXG5cdF9vTWFuYWdlZEhpc3RvcnkhOiBSb3V0ZXJTdGF0ZVtdO1xuXG5cdF9vTmF2aWdhdGlvbkd1YXJkITogTmF2aWdhdGlvbkd1YXJkIHwgbnVsbDtcblxuXHRvUmVzb3VyY2VCdW5kbGU/OiBSZXNvdXJjZUJ1bmRsZTtcblxuXHRfb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24/OiBTeW5jaHJvbml6YXRpb247XG5cblx0X2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvID0gZmFsc2U7XG5cblx0X2JBcHBseVJlc3RvcmUgPSBmYWxzZTtcblxuXHRfcGF0aE1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSA9IFtdO1xuXG5cdHJlc3RvcmVIaXN0b3J5VHJpZ2dlcmVkID0gZmFsc2U7XG5cblx0YXBwTmFtZSE6IHN0cmluZztcblxuXHRpbml0KG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgaXNmY2xFbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Ly8gU2F2ZSB0aGUgbmFtZSBvZiB0aGUgYXBwIChpbmNsdWRpbmcgc3RhcnR1cCBwYXJhbWV0ZXJzKSBmb3IgcmVidWlsZGluZyBmdWxsIGhhc2hlcyBsYXRlclxuXHRcdG9BcHBDb21wb25lbnRcblx0XHRcdC5nZXRTZXJ2aWNlKFwic2hlbGxTZXJ2aWNlc1wiKVxuXHRcdFx0LnRoZW4oKCkgPT4gdGhpcy5hc3luY0luaXQob0FwcENvbXBvbmVudCwgaXNmY2xFbmFibGVkKSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSB0aGUgc2hlbGwgc2VydmljZXNcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9KTtcblx0XHR0aGlzLl9mbkhhc2hHdWFyZCA9IHRoaXMuaGFzaEd1YXJkLmJpbmQodGhpcyk7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCB0aGlzLl9mbkhhc2hHdWFyZCk7XG5cdFx0dGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPSBmYWxzZTtcblx0XHR0aGlzLl9iSWdub3JlUmVzdG9yZSA9IGZhbHNlO1xuXHRcdHRoaXMuX2JGb3JjZUZvY3VzID0gdHJ1ZTsgLy8gVHJpZ2dlciB0aGUgZm9jdXMgbWVjaGFuaXNtIGZvciB0aGUgZmlyc3QgdmlldyBkaXNwbGF5ZWQgYnkgdGhlIGFwcFxuXHR9XG5cblx0YXN5bmNJbml0KG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgaXNmY2xFbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5fb1NoZWxsU2VydmljZXMgPSBvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKTtcblxuXHRcdHRoaXMuaW5pdFJhdyhvQXBwQ29tcG9uZW50LmdldFJvdXRlcigpKTtcblx0XHQvLyBXZSB3YW50IHRvIHdhaXQgdW50aWwgdGhlIGluaXRpYWwgcm91dGVNYXRjaGVkIGlzIGRvbmUgYmVmb3JlIGRvaW5nIGFueSBuYXZpZ2F0aW9uXG5cdFx0dGhpcy53YWl0Rm9yUm91dGVNYXRjaEJlZm9yZU5hdmlnYXRpb24oKTtcblxuXHRcdC8vIFNldCBmZUxldmVsPTAgZm9yIHRoZSBmaXJzdCBBcHBsaWNhdGlvbiBwYWdlIGluIHRoZSBoaXN0b3J5XG5cdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoXG5cdFx0XHRPYmplY3QuYXNzaWduKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZmVMZXZlbDogMFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRoaXN0b3J5LnN0YXRlXG5cdFx0XHQpLFxuXHRcdFx0XCJcIixcblx0XHRcdHdpbmRvdy5sb2NhdGlvbiBhcyB1bmtub3duIGFzIHN0cmluZ1xuXHRcdCk7XG5cdFx0dGhpcy5mY2xFbmFibGVkID0gaXNmY2xFbmFibGVkO1xuXG5cdFx0dGhpcy5fZm5CbG9ja2luZ05hdkZpbHRlciA9IHRoaXMuX2Jsb2NraW5nTmF2aWdhdGlvbkZpbHRlci5iaW5kKHRoaXMpO1xuXHRcdHRoaXMuX29TaGVsbFNlcnZpY2VzLnJlZ2lzdGVyTmF2aWdhdGlvbkZpbHRlcih0aGlzLl9mbkJsb2NraW5nTmF2RmlsdGVyKTtcblx0fVxuXG5cdGRlc3Ryb3koKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX29TaGVsbFNlcnZpY2VzKSB7XG5cdFx0XHR0aGlzLl9vU2hlbGxTZXJ2aWNlcy51bnJlZ2lzdGVyTmF2aWdhdGlvbkZpbHRlcih0aGlzLl9mbkJsb2NraW5nTmF2RmlsdGVyKTtcblx0XHR9XG5cdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCB0aGlzLl9mbkhhc2hHdWFyZCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhbiBpQXBwU3RhdGUgaW5zaWRlIGEgaGFzaCAob3IgcmVwbGFjZXMgYW4gZXhpc3Rpbmcgb25lKS5cblx0ICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoXG5cdCAqIEBwYXJhbSBzQXBwU3RhdGVLZXkgVGhlIGlBcHBTdGF0ZSB0byBhZGRcblx0ICogQHJldHVybnMgVGhlIGhhc2ggd2l0aCB0aGUgYXBwIHN0YXRlXG5cdCAqL1xuXHRzZXRBcHBTdGF0ZUluSGFzaChzSGFzaDogc3RyaW5nLCBzQXBwU3RhdGVLZXk6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0bGV0IHNOZXdIYXNoOiBzdHJpbmc7XG5cblx0XHRpZiAoc0hhc2guaW5jbHVkZXMoZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTSkpIHtcblx0XHRcdC8vIElmIHRoZXJlJ3MgYWxyZWFkeSBhbiBpQXBwU3RhdGUgcGFyYW1ldGVyIGluIHRoZSBoYXNoLCByZXBsYWNlIGl0XG5cdFx0XHRzTmV3SGFzaCA9IHNIYXNoLnJlcGxhY2UoXG5cdFx0XHRcdG5ldyBSZWdFeHAoYCR7ZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTX09W14mXSpgKSxcblx0XHRcdFx0YCR7ZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTX09JHtzQXBwU3RhdGVLZXl9YFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gQWRkIHRoZSBpQXBwU3RhdGUgcGFyYW1ldGVyIGluIHRoZSBoYXNoXG5cdFx0XHRpZiAoIXNIYXNoLmluY2x1ZGVzKFwiP1wiKSkge1xuXHRcdFx0XHRzTmV3SGFzaCA9IGAke3NIYXNofT9gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c05ld0hhc2ggPSBgJHtzSGFzaH0mYDtcblx0XHRcdH1cblx0XHRcdHNOZXdIYXNoICs9IGAke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PSR7c0FwcFN0YXRlS2V5fWA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNOZXdIYXNoO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGlBcHBTdGF0ZSBwYXJ0IGZyb20gYSBoYXNoIChvciBudWxsIGlmIG5vdCBmb3VuZCkuXG5cdCAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaFxuXHQgKiBAcmV0dXJucyBUaGUgaUFwcFN0YXRlIHBhcnQgb2YgdGhlIGhhc2hcblx0ICovXG5cdGZpbmRBcHBTdGF0ZUluSGFzaChzSGFzaDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG5cdFx0Y29uc3QgYUFwcFN0YXRlID0gc0hhc2gubWF0Y2gobmV3IFJlZ0V4cChgXFxcXD8uKiR7ZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTX09KFteJl0qKWApKTtcblx0XHRyZXR1cm4gYUFwcFN0YXRlICYmIGFBcHBTdGF0ZS5sZW5ndGggPiAxID8gYUFwcFN0YXRlWzFdIDogbnVsbDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0RGVjb2RlZFdpbmRvd0hhc2goKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gZGVjb2RlVVJJKHdpbmRvdy5sb2NhdGlvbi5oYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSYXcgaW5pdGlhbGl6YXRpb24gKGZvciB1bml0IHRlc3RzKS5cblx0ICogQHBhcmFtIG9Sb3V0ZXIgVGhlIHJvdXRlciB1c2VkIGJ5IHRoaXMgcHJveHlcblx0ICovXG5cdGluaXRSYXcob1JvdXRlcjogUm91dGVyKTogdm9pZCB7XG5cdFx0dGhpcy5fb1JvdXRlciA9IG9Sb3V0ZXI7XG5cdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5ID0gW107XG5cdFx0dGhpcy5fb05hdmlnYXRpb25HdWFyZCA9IG51bGw7XG5cblx0XHRjb25zdCBzQ3VycmVudEFwcEhhc2ggPSB0aGlzLmdldEhhc2goKTtcblx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkucHVzaCh0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzQ3VycmVudEFwcEhhc2gpKTtcblxuXHRcdHRoaXMuYXBwTmFtZSA9IHRoaXMuZ2V0QXBwTmFtZUZyb21IYXNoKHRoaXMuZ2V0RGVjb2RlZFdpbmRvd0hhc2goKSk7XG5cblx0XHQvLyBTZXQgdGhlIGlBcHBTdGF0ZSBpZiB0aGUgaW5pdGlhbCBoYXNoIGNvbnRhaW5zIG9uZVxuXHRcdHRoaXMuc0lBcHBTdGF0ZUtleSA9IHRoaXMuZmluZEFwcFN0YXRlSW5IYXNoKHNDdXJyZW50QXBwSGFzaCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJuIHRoZSBmdWxsIGFwcC1zcGVjaWZpYyBoYXNoIHBhcnQgZnJvbSB3aW5kb3cubG9jYXRpb24uaGFzaC5cblx0ICpcblx0ICogQ29tcGFyZWQgdG8ge0BsaW5rIGdldEhhc2h9IHRoaXMgZnVuY3Rpb24gaW5jbHVkZXMgc3ViLXJvdXRlcyBvZiBuZXN0ZWQgY29tcG9uZW50cy5cblx0ICogQHJldHVybnMgVGhlIGFwcC1zcGVjaWZpYyBoYXNoIHBhcnQgKGkuZS4sIHdpdGhvdXQgdGhlIHNoZWxsIHBhcnQpLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgaXMgbm9uZS5cblx0ICovXG5cdGdldEZ1bGxIYXNoKCk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc3BsaXRIYXNoID0gdGhpcy5fb1NoZWxsU2VydmljZXMuc3BsaXRIYXNoKHRoaXMuZ2V0RGVjb2RlZFdpbmRvd0hhc2goKSk7XG5cblx0XHRpZiAoXCJhcHBTcGVjaWZpY1JvdXRlXCIgaW4gc3BsaXRIYXNoKSB7XG5cdFx0XHRyZXR1cm4gc3BsaXRIYXNoLmFwcFNwZWNpZmljUm91dGU/LnJlcGxhY2UoL14mXFwvLywgXCJcIikgPz8gXCJcIjsgLy8gcmVtb3ZlIHRoZSBsZWFkaW5nIFwiJi9cIlxuXHRcdH1cblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXG5cdGdldEhhc2goKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLmdldEhhc2goKSA/PyBcIlwiO1xuXHR9XG5cblx0cHJvdGVjdGVkIGdldEFwcE5hbWVGcm9tSGFzaChoYXNoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNwbGl0SGFzaCA9IHRoaXMuX29TaGVsbFNlcnZpY2VzPy5zcGxpdEhhc2goaGFzaCkgYXMgeyBzaGVsbFBhcnQ6IHN0cmluZzsgYXBwU3BlY2lmaWNSb3V0ZTogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cdFx0cmV0dXJuIHNwbGl0SGFzaD8uc2hlbGxQYXJ0ID8/IFwiXCI7XG5cdH1cblxuXHRpc0ZvY3VzRm9yY2VkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9iRm9yY2VGb2N1cztcblx0fVxuXG5cdHNldEZvY3VzRm9yY2VkKGJGb3JjZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLl9iRm9yY2VGb2N1cyA9IGJGb3JjZWQ7XG5cdH1cblxuXHQvKipcblx0ICogUmVzZXRzIHRoZSBpbnRlcm5hbCB2YXJpYWJsZSBzSUFwcFN0YXRlS2V5LlxuXHQgKlxuXHQgKi9cblx0cmVtb3ZlSUFwcFN0YXRlS2V5KCk6IHZvaWQge1xuXHRcdHRoaXMuc0lBcHBTdGF0ZUtleSA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIGEgc3BlY2lmaWMgaGFzaC5cblx0ICogQHBhcmFtIHNIYXNoIEhhc2ggdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBiUHJlc2VydmVIaXN0b3J5IElmIHNldCB0byB0cnVlLCBub24tYW5jZXN0b3IgZW50cmllcyBpbiBoaXN0b3J5IHdpbGwgYmUgcmV0YWluZWRcblx0ICogQHBhcmFtIGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUgSWYgc2V0IHRvIHRydWUsIGNhY2hlIHByZXNlcnZhdGlvbiBtZWNoYW5pc20gaXMgZGlzYWJsZWQgZm9yIHRoZSBjdXJyZW50IG5hdmlnYXRpb25cblx0ICogQHBhcmFtIGJGb3JjZUZvY3VzIElmIHNldCB0byB0cnVlLCB0aGUgbG9naWMgdG8gc2V0IHRoZSBmb2N1cyBvbmNlIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZCB3aWxsIGJlIHRyaWdnZXJlZCAob25QYWdlUmVhZHkpXG5cdCAqIEBwYXJhbSBiUHJlc2VydmVTaGVsbEJhY2tOYXZpZ2F0aW9uSGFuZGxlciBJZiBub3Qgc2V0IHRvIGZhbHNlLCB0aGUgYmFjayBuYXZpZ2F0aW9uIGlzIHNldCB0byB1bmRlZmluZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSAocmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWQpIHRoYXQgcmV0dXJucyAndHJ1ZScgaWYgYSBuYXZpZ2F0aW9uIHRvb2sgcGxhY2UsICdmYWxzZScgaWYgdGhlIG5hdmlnYXRpb24gZGlkbid0IGhhcHBlblxuXHQgKi9cblx0YXN5bmMgbmF2VG9IYXNoKFxuXHRcdHNIYXNoOiBzdHJpbmcsXG5cdFx0YlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4sXG5cdFx0YkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZT86IGJvb2xlYW4sXG5cdFx0YkZvcmNlRm9jdXM/OiBib29sZWFuLFxuXHRcdGJQcmVzZXJ2ZVNoZWxsQmFja05hdmlnYXRpb25IYW5kbGVyPzogYm9vbGVhblxuXHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoYlByZXNlcnZlU2hlbGxCYWNrTmF2aWdhdGlvbkhhbmRsZXIgIT09IGZhbHNlKSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9vU2hlbGxTZXJ2aWNlcy5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24pIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbi53YWl0Rm9yKCkudGhlbihhc3luYyAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5faW50ZXJuYWxOYXZUb0hhc2goc0hhc2gsIGJQcmVzZXJ2ZUhpc3RvcnksIGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUsIGJGb3JjZUZvY3VzKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodGhpcy5fYkFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm8pIHtcblx0XHRcdFx0dGhpcy53YWl0Rm9yUm91dGVNYXRjaEJlZm9yZU5hdmlnYXRpb24oKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLl9pbnRlcm5hbE5hdlRvSGFzaChzSGFzaCwgYlByZXNlcnZlSGlzdG9yeSwgYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSwgYkZvcmNlRm9jdXMpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIF9pbnRlcm5hbE5hdlRvSGFzaChcblx0XHRzSGFzaDogc3RyaW5nLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGU/OiBib29sZWFuLFxuXHRcdGJGb3JjZUZvY3VzPzogYm9vbGVhblxuXHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHQvLyBBZGQgdGhlIGFwcCBzdGF0ZSBpbiB0aGUgaGFzaCBpZiBuZWVkZWRcblx0XHRpZiAodGhpcy5mY2xFbmFibGVkICYmIHRoaXMuc0lBcHBTdGF0ZUtleSAmJiAhdGhpcy5maW5kQXBwU3RhdGVJbkhhc2goc0hhc2gpKSB7XG5cdFx0XHRzSGFzaCA9IHRoaXMuc2V0QXBwU3RhdGVJbkhhc2goc0hhc2gsIHRoaXMuc0lBcHBTdGF0ZUtleSk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmNoZWNrSGFzaFdpdGhHdWFyZChzSGFzaCkpIHtcblx0XHRcdGlmICghdGhpcy5vUmVzb3VyY2VCdW5kbGUpIHtcblx0XHRcdFx0dGhpcy5vUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZSBoYXZlIHRvIHVzZSBhIGNvbmZpcm0gaGVyZSBmb3IgVUkgY29uc2lzdGVuY3kgcmVhc29ucywgYXMgd2l0aCBzb21lIHNjZW5hcmlvc1xuXHRcdFx0Ly8gaW4gdGhlIEVkaXRGbG93IHdlIHJlbHkgb24gYSBVSTUgbWVjaGFuaXNtIHRoYXQgZGlzcGxheXMgYSBjb25maXJtIGRpYWxvZy5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hbGVydFxuXHRcdFx0aWYgKCFjb25maXJtKHRoaXMub1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX1JPVVRFUl9QUk9YWV9TQVBGRV9FWElUX05PVFNBVkVEX01FU1NBR0VcIikpKSB7XG5cdFx0XHRcdC8vIFRoZSB1c2VyIGNsaWNrZWQgb24gQ2FuY2VsIC0tPiBjYW5jZWwgbmF2aWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuYklzR3VhcmRDcm9zc0FsbG93ZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIEluIGNhc2UgdGhlIG5hdmlnYXRpb24gd2lsbCBjYXVzZSBhIG5ldyB2aWV3IHRvIGJlIGRpc3BsYXllZCwgd2UgZm9yY2UgdGhlIGZvY3VzXG5cdFx0Ly8gSS5lLiBpZiB0aGUga2V5cyBmb3IgdGhlIGhhc2ggd2UncmUgbmF2aWdhdGluZyB0byBpcyBhIHN1cGVyc2V0IG9mIHRoZSBjdXJyZW50IGhhc2gga2V5cy5cblx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzSGFzaCk7XG5cdFx0aWYgKCF0aGlzLl9iRm9yY2VGb2N1cykge1xuXHRcdFx0Ly8gSWYgdGhlIGZvY3VzIHdhcyBhbHJlYWR5IGZvcmNlZCwga2VlcCBpdFxuXHRcdFx0Y29uc3QgYUN1cnJlbnRIYXNoS2V5cyA9IHRoaXMuX2V4dHJhY3RFbnRpdHlTZXRzRnJvbUhhc2godGhpcy5nZXRIYXNoKCkpO1xuXHRcdFx0dGhpcy5fYkZvcmNlRm9jdXMgPVxuXHRcdFx0XHRiRm9yY2VGb2N1cyB8fFxuXHRcdFx0XHQoYUN1cnJlbnRIYXNoS2V5cy5sZW5ndGggPCBvTmV3U3RhdGUua2V5cy5sZW5ndGggJiZcblx0XHRcdFx0XHRhQ3VycmVudEhhc2hLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXk6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGtleSA9PT0gb05ld1N0YXRlLmtleXNbaW5kZXhdO1xuXHRcdFx0XHRcdH0pKTtcblx0XHR9XG5cblx0XHRjb25zdCBvSGlzdG9yeUFjdGlvbiA9IHRoaXMuX3B1c2hOZXdTdGF0ZShvTmV3U3RhdGUsIGZhbHNlLCBiUHJlc2VydmVIaXN0b3J5LCBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlKTtcblx0XHR0aGlzLnN0b3JlRm9jdXNJbmZvRm9yQ3VycmVudEhhc2goKTtcblxuXHRcdHJldHVybiB0aGlzLl9yZWJ1aWxkQnJvd3Nlckhpc3Rvcnkob0hpc3RvcnlBY3Rpb24sIGZhbHNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhcnMgYnJvd3NlciBoaXN0b3J5IGlmIGVudHJpZXMgaGF2ZSBiZWVuIGFkZGVkIHdpdGhvdXQgdXNpbmcgdGhlIFJvdXRlclByb3h5LlxuXHQgKiBVcGRhdGVzIHRoZSBpbnRlcm5hbCBoaXN0b3J5IGFjY29yZGluZ2x5LlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSB0aGUgaGlzdG9yeSBpcyByZWJ1aWx0XG5cdCAqL1xuXHRhc3luYyByZXN0b3JlSGlzdG9yeSgpOiBQcm9taXNlPHZvaWQgfCBib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX2JBcHBseVJlc3RvcmUpIHtcblx0XHRcdHRoaXMuX2JBcHBseVJlc3RvcmUgPSBmYWxzZTtcblx0XHRcdGxldCBzVGFyZ2V0SGFzaCA9IHRoaXMuZ2V0SGFzaCgpO1xuXHRcdFx0c1RhcmdldEhhc2ggPSBzVGFyZ2V0SGFzaC5yZXBsYWNlKC8oXFw/fCYpcmVzdG9yZUhpc3Rvcnk9dHJ1ZS8sIFwiXCIpO1xuXHRcdFx0Y29uc3Qgb05ld1N0YXRlID0gdGhpcy5fZXh0cmFjdFN0YXRlRnJvbUhhc2goc1RhcmdldEhhc2gpO1xuXG5cdFx0XHRjb25zdCBvSGlzdG9yeUFjdGlvbiA9IHRoaXMuX3B1c2hOZXdTdGF0ZShvTmV3U3RhdGUsIHRydWUsIGZhbHNlLCB0cnVlKTtcblxuXHRcdFx0dGhpcy5yZXN0b3JlSGlzdG9yeVRyaWdnZXJlZCA9IHRydWU7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcmVidWlsZEJyb3dzZXJIaXN0b3J5KG9IaXN0b3J5QWN0aW9uLCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgUmVzdG9yZUhpc3RvcnkgaGFzIGJlZW4gdHJpZ2dlcmVkIG9uIHRoZSBSb3V0ZXJQcm94eS5cblx0ICogQHJldHVybnMgVHJ1ZSBpZiBpdCBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICovXG5cdGNoZWNrUmVzdG9yZUhpc3RvcnlXYXNUcmlnZ2VyZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMucmVzdG9yZUhpc3RvcnlUcmlnZ2VyZWQ7XG5cdH1cblxuXHQvKipcblx0ICogUmVzZXRzIHRoZSBmbGFnIHRoYXQgc2F5cyBpZiBSZXN0b3JlSGlzdG9yeSBoYXMgYmVlbiB0cmlnZ2VyZWQgb24gdGhlIFJvdXRlclByb3h5LlxuXHQgKi9cblx0cmVzZXRSZXN0b3JlSGlzdG9yeUZsYWcoKTogdm9pZCB7XG5cdFx0dGhpcy5yZXN0b3JlSGlzdG9yeVRyaWdnZXJlZCA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBiYWNrIGluIHRoZSBoaXN0b3J5LlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICovXG5cdGFzeW5jIG5hdkJhY2soKTogUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4ge1xuXHRcdGNvbnN0IHNDdXJyZW50SGFzaCA9IHRoaXMuZ2V0SGFzaCgpO1xuXHRcdGxldCBzUHJldmlvdXNIYXNoO1xuXG5cdFx0Ly8gTG9vayBmb3IgdGhlIGN1cnJlbnQgaGFzaCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5XG5cdFx0Zm9yIChsZXQgaSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG5cdFx0XHRpZiAodGhpcy5fb01hbmFnZWRIaXN0b3J5W2ldLmhhc2ggPT09IHNDdXJyZW50SGFzaCkge1xuXHRcdFx0XHRzUHJldmlvdXNIYXNoID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W2kgLSAxXS5oYXNoO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoc1ByZXZpb3VzSGFzaCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubmF2VG9IYXNoKHNQcmV2aW91c0hhc2gpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXZSBjb3VsZG4ndCBmaW5kIGEgcHJldmlvdXMgaGFzaCBpbiBoaXN0b3J5XG5cdFx0XHQvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBuYXZpZ2F0aW5nIGZyb20gYSB0cmFuc2llbnQgaGFzaCBpbiBhIGNyZWF0ZSBhcHAsIGFuZFxuXHRcdFx0Ly8gaW4gdGhhdCBjYXNlIGhpc3RvcnkuYmFjayB3b3VsZCBnbyBiYWNrIHRvIHRoZSBGTFBcblx0XHRcdHdpbmRvdy5oaXN0b3J5LmJhY2soKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIGEgcm91dGUgd2l0aCBwYXJhbWV0ZXJzLlxuXHQgKiBAcGFyYW0gc1JvdXRlTmFtZSBUaGUgcm91dGUgbmFtZSB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIG9QYXJhbWV0ZXJzIFBhcmFtZXRlcnMgZm9yIHRoZSBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBvUGFyYW1ldGVycy5ub1ByZXNlcnZhdGlvbkNhY2hlXG5cdCAqIEBwYXJhbSBvUGFyYW1ldGVycy5iSXNTdGlja3lNb2RlXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZFxuXHQgKi9cblx0YXN5bmMgbmF2VG8oc1JvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVycz86IHsgbm9QcmVzZXJ2YXRpb25DYWNoZT86IGJvb2xlYW47IGJJc1N0aWNreU1vZGU/OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCBzSGFzaCA9IHRoaXMuX29Sb3V0ZXIuZ2V0VVJMKHNSb3V0ZU5hbWUsIG9QYXJhbWV0ZXJzKTtcblx0XHRyZXR1cm4gdGhpcy5uYXZUb0hhc2goc0hhc2ghLCBmYWxzZSwgb1BhcmFtZXRlcnM/Lm5vUHJlc2VydmF0aW9uQ2FjaGUsIGZhbHNlLCAhb1BhcmFtZXRlcnM/LmJJc1N0aWNreU1vZGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4aXRzIHRoZSBjdXJyZW50IGFwcCBieSBuYXZpZ2F0aW5nIGJhY2tcblx0ICogdG8gdGhlIHByZXZpb3VzIGFwcCAoaWYgYW55KSBvciB0aGUgRkxQLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB3ZSBleGl0IHRoZSBhcHBcblx0ICovXG5cdGV4aXRGcm9tQXBwKCk6IHZvaWQge1xuXHRcdHJldHVybiB0aGlzLl9vU2hlbGxTZXJ2aWNlcy5iYWNrVG9QcmV2aW91c0FwcCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gaGFzaCBjYW4gaGF2ZSBhbiBpbXBhY3Qgb24gdGhlIGN1cnJlbnQgc3RhdGVcblx0ICogaS5lLiBpZiB0aGUgaGFzaCBpcyBlcXVhbCwgY29tcGF0aWJsZSBvciBhbiBhbmNlc3RvciBvZiB0aGUgY3VycmVudCBzdGF0ZS5cblx0ICogQHBhcmFtIHNIYXNoIGB0cnVlYCBpZiB0aGVyZSBpcyBhbiBpbXBhY3Rcblx0ICogQHJldHVybnMgSWYgdGhlcmUgaXMgYW4gaW1wYWN0XG5cdCAqL1xuXHRpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkoc0hhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGlmIChzSGFzaFswXSA9PT0gXCIvXCIpIHtcblx0XHRcdHNIYXNoID0gc0hhc2guc3Vic3RyaW5nKDEpO1xuXHRcdH1cblx0XHRjb25zdCBvTG9jYWxHdWFyZCA9IGNyZWF0ZUd1YXJkRnJvbUhhc2goc0hhc2gpO1xuXHRcdHJldHVybiBvTG9jYWxHdWFyZC5jaGVjayh0aGlzLmdldEhhc2goKSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgbmF2aWdhdGlvbiBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLlxuXHQgKiBAcmV0dXJucyBgZmFsc2VgIGlmIGEgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgaW4gdGhlIFJvdXRlclByb3h5IGFuZCBpcyBub3QgeWV0IGZpbmFsaXplZFxuXHQgKi9cblx0aXNOYXZpZ2F0aW9uRmluYWxpemVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhdGhpcy5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmc7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgbGFzdCBzdGF0ZSBhcyBhIGd1YXJkLlxuXHQgKiBFYWNoIGZ1dHVyZSBuYXZpZ2F0aW9uIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IHRoaXMgZ3VhcmQsIGFuZCBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgd2lsbFxuXHQgKiBiZSBkaXNwbGF5ZWQgYmVmb3JlIHRoZSBuYXZpZ2F0aW9uIGNyb3NzZXMgdGhlIGd1YXJkIChpLmUuIGdvZXMgdG8gYW4gYW5jZXN0b3Igb2YgdGhlIGd1YXJkKS5cblx0ICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoIGZvciB0aGUgZ3VhcmRcblx0ICovXG5cdHNldE5hdmlnYXRpb25HdWFyZChzSGFzaDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5fb05hdmlnYXRpb25HdWFyZCA9IGNyZWF0ZUd1YXJkRnJvbUhhc2goc0hhc2gpO1xuXHRcdHRoaXMuYklzR3VhcmRDcm9zc0FsbG93ZWQgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlcyB0aGUgbmF2aWdhdGlvbiBndWFyZC5cblx0ICovXG5cdGRpc2NhcmROYXZpZ2F0aW9uR3VhcmQoKTogdm9pZCB7XG5cdFx0dGhpcy5fb05hdmlnYXRpb25HdWFyZCA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBuYXZpZ2F0aW9uIGd1YXJkLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbmF2aWdhdGluZyBndWFyZCBpcyBhdmFpbGFibGVcblx0ICovXG5cdGhhc05hdmlnYXRpb25HdWFyZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fb05hdmlnYXRpb25HdWFyZCAhPT0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUZXN0cyBhIGhhc2ggYWdhaW5zdCB0aGUgbmF2aWdhdGlvbiBndWFyZC5cblx0ICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoIHRvIGJlIHRlc3RlZFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbmF2aWdhdGluZyB0byB0aGUgaGFzaCBkb2Vzbid0IGNyb3NzIHRoZSBndWFyZFxuXHQgKi9cblx0Y2hlY2tIYXNoV2l0aEd1YXJkKHNIYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fb05hdmlnYXRpb25HdWFyZCA9PT0gbnVsbCB8fCB0aGlzLl9vTmF2aWdhdGlvbkd1YXJkLmNoZWNrKHNIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIHVzZXIgYWxsb3dlZCB0aGUgbmF2aWdhdGlvbiBndWFyZCB0byBiZSBjcm9zc2VkLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgY3Jvc3NpbmcgdGhlIGd1YXJkIGhhcyBiZWVuIGFsbG93ZWQgYnkgdGhlIHVzZXJcblx0ICovXG5cdGlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuYklzR3VhcmRDcm9zc0FsbG93ZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQWN0aXZhdGVzIHRoZSBzeW5jaHJvbml6YXRpb24gZm9yIHJvdXRlTWF0Y2hlZEV2ZW50LlxuXHQgKiBUaGUgbmV4dCBOYXZUb0hhc2ggY2FsbCB3aWxsIGNyZWF0ZSBhIFN5bmNocm9uaXphdGlvbiBvYmplY3QgdGhhdCB3aWxsIGJlIHJlc29sdmVkXG5cdCAqIGJ5IHRoZSBjb3JyZXNwb25kaW5nIG9uUm91dGVNYXRjaGVkIGV2ZW50LCBwcmV2ZW50aW5nIGFub3RoZXIgTmF2VG9IYXNoIHRvIGhhcHBlbiBpbiBwYXJhbGxlbC5cblx0ICovXG5cdGFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpOiB2b2lkIHtcblx0XHR0aGlzLl9iQWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hybyA9IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogUmVzb2x2ZSB0aGUgcm91dGVNYXRjaCBzeW5jaHJvbml6YXRpb24gb2JqZWN0LCB1bmxvY2tpbmcgcG90ZW50aWFsIHBlbmRpbmcgTmF2VG9IYXNoIGNhbGxzLlxuXHQgKi9cblx0cmVzb2x2ZVJvdXRlTWF0Y2goKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKSB7XG5cdFx0XHR0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbi5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ha2VzIHN1cmUgbm8gbmF2aWdhdGlvbiBjYW4gaGFwcGVuIGJlZm9yZSBhIHJvdXRlTWF0Y2ggaGFwcGVuZWQuXG5cdCAqL1xuXHR3YWl0Rm9yUm91dGVNYXRjaEJlZm9yZU5hdmlnYXRpb24oKTogdm9pZCB7XG5cdFx0dGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24gPSBuZXcgU3luY2hyb25pemF0aW9uKCk7XG5cdFx0dGhpcy5fYkFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm8gPSBmYWxzZTtcblx0fVxuXG5cdF9leHRyYWN0RW50aXR5U2V0c0Zyb21IYXNoKHNIYXNoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG5cdFx0aWYgKHNIYXNoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHNIYXNoID0gXCJcIjtcblx0XHR9XG5cdFx0Y29uc3Qgc0hhc2hOb1BhcmFtcyA9IHNIYXNoLnNwbGl0KFwiP1wiKVswXTsgLy8gcmVtb3ZlIHBhcmFtc1xuXHRcdGNvbnN0IGFUb2tlbnMgPSBzSGFzaE5vUGFyYW1zLnNwbGl0KFwiL1wiKTtcblx0XHRjb25zdCBuYW1lczogc3RyaW5nW10gPSBbXTtcblxuXHRcdGFUb2tlbnMuZm9yRWFjaCgoc1Rva2VuKSA9PiB7XG5cdFx0XHRpZiAoc1Rva2VuLmxlbmd0aCkge1xuXHRcdFx0XHRuYW1lcy5wdXNoKHNUb2tlbi5zcGxpdChcIihcIilbMF0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG5hbWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJ1aWxkcyBhIHN0YXRlIGZyb20gYSBoYXNoLlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2ggdG8gYmUgdXNlZCBhcyBlbnRyeVxuXHQgKiBAcmV0dXJucyBUaGUgc3RhdGVcblx0ICovXG5cdF9leHRyYWN0U3RhdGVGcm9tSGFzaChzSGFzaDogc3RyaW5nKTogUm91dGVyU3RhdGUge1xuXHRcdGlmIChzSGFzaCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzSGFzaCA9IFwiXCI7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb1N0YXRlOiBSb3V0ZXJTdGF0ZSA9IHtcblx0XHRcdGtleXM6IHRoaXMuX2V4dHJhY3RFbnRpdHlTZXRzRnJvbUhhc2goc0hhc2gpLFxuXHRcdFx0aGFzaDogc0hhc2gsXG5cdFx0XHRzY3JlZW5Nb2RlOiAwIC8vIHdpbGwgYmUgdXBkYXRlZCBpbiBhIHNlY1xuXHRcdH07XG5cblx0XHQvLyBSZXRyaWV2ZSBsYXlvdXQgKGlmIGFueSlcblx0XHRjb25zdCBhTGF5b3V0ID0gc0hhc2gubWF0Y2gobmV3IFJlZ0V4cChgXFxcXD8uKiR7ZW51bVVSTFBhcmFtcy5MQVlPVVRQQVJBTX09KFteJl0qKWApKTtcblx0XHRvU3RhdGUuc0xheW91dCA9IGFMYXlvdXQgJiYgYUxheW91dC5sZW5ndGggPiAxID8gYUxheW91dFsxXSA6IHVuZGVmaW5lZDtcblx0XHRpZiAob1N0YXRlLnNMYXlvdXQgPT09IFwiTWlkQ29sdW1uRnVsbFNjcmVlblwiKSB7XG5cdFx0XHRvU3RhdGUuc2NyZWVuTW9kZSA9IDE7XG5cdFx0fSBlbHNlIGlmIChvU3RhdGUuc0xheW91dCA9PT0gXCJFbmRDb2x1bW5GdWxsU2NyZWVuXCIpIHtcblx0XHRcdG9TdGF0ZS5zY3JlZW5Nb2RlID0gMjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1N0YXRlLnNjcmVlbk1vZGUgPSAwO1xuXHRcdH1cblx0XHRyZXR1cm4gb1N0YXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBuZXcgc3RhdGUgaW50byB0aGUgaW50ZXJuYWwgaGlzdG9yeSBzdHJ1Y3R1cmUuXG5cdCAqIE1ha2VzIHN1cmUgdGhpcyBuZXcgc3RhdGUgaXMgYWRkZWQgYWZ0ZXIgYW4gYW5jZXN0b3IuXG5cdCAqIEFsc28gc2V0cyB0aGUgaUFwcFN0YXRlIGtleSBpbiB0aGUgd2hvbGUgaGlzdG9yeS5cblx0ICogQHBhcmFtIG9OZXdTdGF0ZSBUaGUgbmV3IHN0YXRlIHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSBiUmVidWlsZE9ubHkgYHRydWVgIGlmIHdlJ3JlIHJlYnVpbGRpbmcgdGhlIGhpc3RvcnkgYWZ0ZXIgYSBzaGVsbCBtZW51IG5hdmlnYXRpb25cblx0ICogQHBhcmFtIGJQcmVzZXJ2ZUhpc3RvcnkgSWYgc2V0IHRvIHRydWUsIG5vbi1hbmNlc3RvciBlbnRyaWVzIGluIGhpc3Rvcnkgd2lsbCBiZSByZXRhaW5lZFxuXHQgKiBAcGFyYW0gYkRpc2FibGVIaXN0b3J5UHJlc2VydmF0aW9uIERpc2FibGUgdGhlIG1lY2hhbmlzbSB0byByZXRhaW5lZCBtYXJrZWQgZW50cmllcyBpbiBjYWNoZVxuXHQgKiBAcmV0dXJucyBUaGUgbmV3IHN0YXRlXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X3B1c2hOZXdTdGF0ZShcblx0XHRvTmV3U3RhdGU6IFJvdXRlclN0YXRlLFxuXHRcdGJSZWJ1aWxkT25seTogYm9vbGVhbixcblx0XHRiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbixcblx0XHRiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb24/OiBib29sZWFuXG5cdCk6IEh5c3RvcnlBY3Rpb24ge1xuXHRcdGNvbnN0IHNDdXJyZW50SGFzaCA9IHRoaXMuZ2V0SGFzaCgpO1xuXHRcdGxldCBsYXN0SW5kZXggPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTtcblx0XHRsZXQgaVBvcENvdW50ID0gYlJlYnVpbGRPbmx5ID8gMSA6IDA7XG5cblx0XHQvLyAxLiBEbyBzb21lIGNsZWFudXAgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSA6IGluIGNhc2UgdGhlIHVzZXIgaGFzIG5hdmlnYXRlZCBiYWNrIGluIHRoZSBicm93c2VyIGhpc3RvcnksIHdlIG5lZWQgdG8gcmVtb3ZlXG5cdFx0Ly8gdGhlIHN0YXRlcyBhaGVhZCBpbiBoaXN0b3J5IGFuZCBtYWtlIHN1cmUgdGhlIHRvcCBzdGF0ZSBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBwYWdlXG5cdFx0Ly8gV2UgZG9uJ3QgZG8gdGhhdCB3aGVuIHJlc3RvcmluZyB0aGUgaGlzdG9yeSwgYXMgdGhlIGN1cnJlbnQgc3RhdGUgaGFzIGJlZW4gYWRkZWQgb24gdG9wIG9mIHRoZSBicm93c2VyIGhpc3Rvcnlcblx0XHQvLyBhbmQgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5XG5cdFx0aWYgKCFiUmVidWlsZE9ubHkpIHtcblx0XHRcdHdoaWxlIChsYXN0SW5kZXggPj0gMCAmJiB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbbGFzdEluZGV4XS5oYXNoICE9PSBzQ3VycmVudEhhc2gpIHtcblx0XHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnBvcCgpO1xuXHRcdFx0XHRsYXN0SW5kZXgtLTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Ly8gV2UgY291bGRuJ3QgZmluZCB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgaGlzdG9yeS4gVGhpcyBjYW4gaGFwcGVuIGlmIGEgYnJvd3NlciByZWxvYWRcblx0XHRcdFx0Ly8gaGFwcGVuZWQsIGNhdXNpbmcgYSByZWluaXRpYWxpemF0aW9uIG9mIHRoZSBtYW5hZ2VkIGhpc3RvcnkuXG5cdFx0XHRcdC8vIEluIHRoYXQgY2FzZSwgd2UgdXNlIHRoZSBjdXJyZW50IGxvY2F0aW9uIGFzIHRoZSBuZXcgc3RhcnRpbmcgcG9pbnQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdFx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkucHVzaCh0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzQ3VycmVudEhhc2gpKTtcblx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoT2JqZWN0LmFzc2lnbih7IGZlTGV2ZWw6IDAgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDIuIE1hcmsgdGhlIHRvcCBzdGF0ZSBhcyBwcmVzZXJ2ZWQgaWYgcmVxdWlyZWRcblx0XHRpZiAoYlByZXNlcnZlSGlzdG9yeSAmJiAhYkRpc2FibGVIaXN0b3J5UHJlc2VydmF0aW9uKSB7XG5cdFx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdLnByZXNlcnZlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gMy4gVGhlbiBwb3AgYWxsIHN0YXRlcyB1bnRpbCB3ZSBmaW5kIGFuIGFuY2VzdG9yIG9mIHRoZSBuZXcgc3RhdGUsIG9yIHdlIGZpbmQgYSBzdGF0ZSB0aGF0IG5lZWQgdG8gYmUgcHJlc2VydmVkXG5cdFx0bGV0IG9MYXN0UmVtb3ZlZEl0ZW07XG5cdFx0d2hpbGUgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBvVG9wU3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoYkRpc2FibGVIaXN0b3J5UHJlc2VydmF0aW9uIHx8ICFvVG9wU3RhdGUucHJlc2VydmVkKSAmJlxuXHRcdFx0XHR0aGlzLl9jb21wYXJlQ2FjaGVTdGF0ZXMob1RvcFN0YXRlLCBvTmV3U3RhdGUpICE9PSBlbnVtU3RhdGUuQU5DRVNUT1Jcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGUgdG9wIHN0YXRlIGlzIG5vdCBhbiBhbmNlc3RvciBvZiBvTmV3U3RhdGUgYW5kIGlzIG5vdCBwcmVzZXJ2ZWQgLS0+IHdlIGNhbiBwb3AgaXRcblx0XHRcdFx0b0xhc3RSZW1vdmVkSXRlbSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wb3AoKTtcblx0XHRcdFx0aVBvcENvdW50Kys7XG5cdFx0XHR9IGVsc2UgaWYgKG9Ub3BTdGF0ZS5wcmVzZXJ2ZWQgJiYgcmVtb3ZlQXBwU3RhdGVJbkhhc2gob1RvcFN0YXRlLmhhc2gpID09PSByZW1vdmVBcHBTdGF0ZUluSGFzaChvTmV3U3RhdGUuaGFzaCkpIHtcblx0XHRcdFx0Ly8gV2UgdHJ5IHRvIGFkZCBhIHN0YXRlIHRoYXQgaXMgYWxyZWFkeSBpbiBjYWNoZSAoZHVlIHRvIHByZXNlcnZlZCBmbGFnKSBidXQgd2l0aCBhIGRpZmZlcmVudCBpYXBwLXN0YXRlXG5cdFx0XHRcdC8vIC0tPiB3ZSBzaG91bGQgZGVsZXRlIHRoZSBwcmV2aW91cyBlbnRyeSAoaXQgd2lsbCBiZSBsYXRlciByZXBsYWNlZCBieSB0aGUgbmV3IG9uZSkgYW5kIHN0b3AgcG9wcGluZ1xuXHRcdFx0XHRvTGFzdFJlbW92ZWRJdGVtID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5LnBvcCgpO1xuXHRcdFx0XHRpUG9wQ291bnQrKztcblx0XHRcdFx0b05ld1N0YXRlLnByZXNlcnZlZCA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnJlYWs7IC8vIEFuY2VzdG9yIG9yIHByZXNlcnZlZCBzdGF0ZSBmb3VuZCAtLT4gd2Ugc3RvcCBwb3BwaW5nIG91dCBzdGF0ZXNcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyA0LiBpQXBwU3RhdGUgbWFuYWdlbWVudFxuXHRcdHRoaXMuc0lBcHBTdGF0ZUtleSA9IHRoaXMuZmluZEFwcFN0YXRlSW5IYXNoKG9OZXdTdGF0ZS5oYXNoKTtcblx0XHRpZiAoIXRoaXMuZmNsRW5hYmxlZCAmJiBvTGFzdFJlbW92ZWRJdGVtKSB7XG5cdFx0XHRjb25zdCBzUHJldmlvdXNJQXBwU3RhdGVLZXkgPSB0aGlzLmZpbmRBcHBTdGF0ZUluSGFzaChvTGFzdFJlbW92ZWRJdGVtLmhhc2gpO1xuXHRcdFx0Y29uc3Qgb0NvbXBhcmlzb25TdGF0ZVJlc3VsdCA9IHRoaXMuX2NvbXBhcmVDYWNoZVN0YXRlcyhvTGFzdFJlbW92ZWRJdGVtLCBvTmV3U3RhdGUpO1xuXHRcdFx0Ly8gaWYgY3VycmVudCBzdGF0ZSBkb2Vzbid0IGNvbnRhaW4gYSBpLWFwcHN0YXRlIGFuZCB0aGlzIHN0YXRlIHNob3VsZCByZXBsYWNlIGEgc3RhdGUgY29udGFpbmluZyBhIGlBcHBTdGF0ZVxuXHRcdFx0Ly8gdGhlbiB0aGUgcHJldmlvdXMgaUFwcFN0YXRlIGlzIHByZXNlcnZlZFxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhdGhpcy5zSUFwcFN0YXRlS2V5ICYmXG5cdFx0XHRcdHNQcmV2aW91c0lBcHBTdGF0ZUtleSAmJlxuXHRcdFx0XHQob0NvbXBhcmlzb25TdGF0ZVJlc3VsdCA9PT0gZW51bVN0YXRlLkVRVUFMIHx8IG9Db21wYXJpc29uU3RhdGVSZXN1bHQgPT09IGVudW1TdGF0ZS5DT01QQVRJQkxFKVxuXHRcdFx0KSB7XG5cdFx0XHRcdG9OZXdTdGF0ZS5oYXNoID0gdGhpcy5zZXRBcHBTdGF0ZUluSGFzaChvTmV3U3RhdGUuaGFzaCwgc1ByZXZpb3VzSUFwcFN0YXRlS2V5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyA1LiBOb3cgd2UgY2FuIHB1c2ggdGhlIHN0YXRlIGF0IHRoZSB0b3Agb2YgdGhlIGludGVybmFsIGhpc3Rvcnlcblx0XHRjb25zdCBiSGFzU2FtZUhhc2ggPSBvTGFzdFJlbW92ZWRJdGVtICYmIG9OZXdTdGF0ZS5oYXNoID09PSBvTGFzdFJlbW92ZWRJdGVtLmhhc2g7XG5cdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPT09IDAgfHwgdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXS5oYXNoICE9PSBvTmV3U3RhdGUuaGFzaCkge1xuXHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnB1c2gob05ld1N0YXRlKTtcblx0XHRcdGlmIChvTGFzdFJlbW92ZWRJdGVtICYmIHJlbW92ZUFwcFN0YXRlSW5IYXNoKG9MYXN0UmVtb3ZlZEl0ZW0uaGFzaCkgPT09IHJlbW92ZUFwcFN0YXRlSW5IYXNoKG9OZXdTdGF0ZS5oYXNoKSkge1xuXHRcdFx0XHRvTmV3U3RhdGUuZm9jdXNDb250cm9sSWQgPSBvTGFzdFJlbW92ZWRJdGVtLmZvY3VzQ29udHJvbElkO1xuXHRcdFx0XHRvTmV3U3RhdGUuc2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQgPSBvTGFzdFJlbW92ZWRJdGVtLnNlY29uZGFyeUZvY3VzQ29udHJvbElkO1xuXHRcdFx0XHRvTmV3U3RhdGUuZm9jdXNJbmZvID0gb0xhc3RSZW1vdmVkSXRlbS5mb2N1c0luZm87XG5cdFx0XHRcdG9OZXdTdGF0ZS5zZWNvbmRhcnlGb2N1c0luZm8gPSBvTGFzdFJlbW92ZWRJdGVtLnNlY29uZGFyeUZvY3VzSW5mbztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyA2LiBEZXRlcm1pbmUgd2hpY2ggYWN0aW9ucyB0byBkbyBvbiB0aGUgaGlzdG9yeVxuXHRcdGlmIChpUG9wQ291bnQgPT09IDApIHtcblx0XHRcdC8vIE5vIHN0YXRlIHdhcyBwb3BwZWQgLS0+IGFwcGVuZFxuXHRcdFx0cmV0dXJuIHsgdHlwZTogXCJhcHBlbmRcIiB9O1xuXHRcdH0gZWxzZSBpZiAoaVBvcENvdW50ID09PSAxKSB7XG5cdFx0XHQvLyBPbmx5IDEgc3RhdGUgd2FzIHBvcHBlZCAtLT4gcmVwbGFjZSBjdXJyZW50IGhhc2ggdW5sZXNzIGhhc2ggaXMgdGhlIHNhbWUgKHRoZW4gbm90aGluZyB0byBkbylcblx0XHRcdHJldHVybiBiSGFzU2FtZUhhc2ggPyB7IHR5cGU6IFwibm9uZVwiIH0gOiB7IHR5cGU6IFwicmVwbGFjZVwiIH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE1vcmUgdGhhbiAxIHN0YXRlIHdhcyBwb3BwZWQgLS0+IGdvIGJha2MgaW4gaGlzdG9yeSBhbmQgcmVwbGFjZSBoYXNoIGlmIG5lY2Vzc2FyeVxuXHRcdFx0cmV0dXJuIGJIYXNTYW1lSGFzaCA/IHsgdHlwZTogXCJiYWNrXCIsIHN0ZXBzOiBpUG9wQ291bnQgLSAxIH0gOiB7IHR5cGU6IFwiYmFjay1yZXBsYWNlXCIsIHN0ZXBzOiBpUG9wQ291bnQgLSAxIH07XG5cdFx0fVxuXHR9XG5cblx0X2Jsb2NraW5nTmF2aWdhdGlvbkZpbHRlcigpOiBcIkN1c3RvbVwiIHwgXCJDb250aW51ZVwiIHtcblx0XHRyZXR1cm4gdGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPyBcIkN1c3RvbVwiIDogXCJDb250aW51ZVwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2FibGUgdGhlIHJvdXRpbmcgYnkgY2FsbGluZyB0aGUgcm91dGVyIHN0b3AgbWV0aG9kLlxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9kaXNhYmxlRXZlbnRPbkhhc2hDaGFuZ2UoKTogdm9pZCB7XG5cdFx0dGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPSB0cnVlO1xuXHRcdHRoaXMuX29Sb3V0ZXIuc3RvcCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVuYWJsZSB0aGUgcm91dGluZyBieSBjYWxsaW5nIHRoZSByb3V0ZXIgaW5pdGlhbGl6ZSBtZXRob2QuXG5cdCAqIEBwYXJhbSBbYklnbm9yZUN1cnJlbnRIYXNoXSBJZ25vcmUgdGhlIGxhc3QgaGFzaCBldmVudCB0cmlnZ2VyZWQgYmVmb3JlIHRoZSByb3V0ZXIgaGFzIGluaXRpYWxpemVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2VuYWJsZUV2ZW50T25IYXNoQ2hhbmdlKGJJZ25vcmVDdXJyZW50SGFzaDogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdHRoaXMuX2JEaXNhYmxlT25IYXNoQ2hhbmdlID0gZmFsc2U7XG5cdFx0dGhpcy5fb1JvdXRlci5pbml0aWFsaXplKGJJZ25vcmVDdXJyZW50SGFzaCk7XG5cdH1cblxuXHQvKipcblx0ICogU3luY2hyb25pemVzIHRoZSBicm93c2VyIGhpc3Rvcnkgd2l0aCB0aGUgaW50ZXJuYWwgaGlzdG9yeSBvZiB0aGUgcm91dGVyUHJveHksIGFuZCB0cmlnZ2VycyBhIG5hdmlnYXRpb24gaWYgbmVlZGVkLlxuXHQgKiBAcGFyYW0gb0hpc3RvcnlBY3Rpb24gU3BlY2lmaWVzIHRoZSBuYXZpZ2F0aW9uIGFjdGlvbiB0byBiZSBwZXJmb3JtZWRcblx0ICogQHBhcmFtIGJSZWJ1aWxkT25seSBgdHJ1ZWAgaWYgaW50ZXJuYWwgaGlzdG9yeSBpcyBjdXJyZW50bHkgYmVpbmcgcmVidWlsdFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIChyZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZCkgdGhhdCByZXR1cm5zICd0cnVlJyBpZiBhIG5hdmlnYXRpb24gdG9vayBwbGFjZSwgJ2ZhbHNlJyBpZiB0aGUgbmF2aWdhdGlvbiBkaWRuJ3QgaGFwcGVuXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgX3JlYnVpbGRCcm93c2VySGlzdG9yeShvSGlzdG9yeUFjdGlvbjogSHlzdG9yeUFjdGlvbiwgYlJlYnVpbGRPbmx5OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHR0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IHRydWU7XG5cdFx0XHRjb25zdCBvVGFyZ2V0U3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdLFxuXHRcdFx0XHRuZXdMZXZlbCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxO1xuXG5cdFx0XHRmdW5jdGlvbiByZXBsYWNlQXN5bmMoKTogdm9pZCB7XG5cdFx0XHRcdGlmICghYlJlYnVpbGRPbmx5KSB7XG5cdFx0XHRcdFx0dGhhdC5fZW5hYmxlRXZlbnRPbkhhc2hDaGFuZ2UodHJ1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQodGhhdC5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnJlcGxhY2VIYXNoIGFzIEZ1bmN0aW9uKShvVGFyZ2V0U3RhdGUuaGFzaCk7XG5cdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKE9iamVjdC5hc3NpZ24oeyBmZUxldmVsOiBuZXdMZXZlbCB9LCBoaXN0b3J5LnN0YXRlKSwgXCJcIik7XG5cblx0XHRcdFx0aWYgKGJSZWJ1aWxkT25seSkge1xuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Ly8gVGltZW91dCB0byBsZXQgJ2hhc2hjaGFuZ2UnIGV2ZW50IGJlIHByb2Nlc3NlZCBiZWZvcmUgYnkgdGhlIEhhc2hDaGFuZ2VyLCBzbyB0aGF0XG5cdFx0XHRcdFx0XHQvLyBvblJvdXRlTWF0Y2hlZCBub3RpZmljYXRpb24gaXNuJ3QgcmFpc2VkXG5cdFx0XHRcdFx0XHR0aGF0Ll9lbmFibGVFdmVudE9uSGFzaENoYW5nZSh0cnVlKTtcblx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdHJlc29sdmUodHJ1ZSk7IC8vIGEgbmF2aWdhdGlvbiBvY2N1cnJlZFxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBc3luYyBjYWxsYmFja3Mgd2hlbiBuYXZpZ2F0aW5nIGJhY2ssIGluIG9yZGVyIHRvIGxldCBhbGwgbm90aWZpY2F0aW9ucyBhbmQgZXZlbnRzIGdldCBwcm9jZXNzZWRcblx0XHRcdGZ1bmN0aW9uIGJhY2tSZXBsYWNlQXN5bmMoKTogdm9pZCB7XG5cdFx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgYmFja1JlcGxhY2VBc3luYyk7XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdC8vIFRpbWVvdXQgdG8gbGV0ICdoYXNoY2hhbmdlJyBldmVudCBiZSBwcm9jZXNzZWQgYmVmb3JlIGJ5IHRoZSBIYXNoQ2hhbmdlclxuXHRcdFx0XHRcdHJlcGxhY2VBc3luYygpO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gYmFja0FzeW5jKCk6IHZvaWQge1xuXHRcdFx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tBc3luYyk7XG5cdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdHJlc29sdmUodHJ1ZSk7IC8vIGEgbmF2aWdhdGlvbiBvY2N1cnJlZFxuXHRcdFx0fVxuXG5cdFx0XHR0aGF0Ll9iSWdub3JlUmVzdG9yZSA9IHRydWU7XG5cblx0XHRcdHN3aXRjaCAob0hpc3RvcnlBY3Rpb24udHlwZSkge1xuXHRcdFx0XHRjYXNlIFwicmVwbGFjZVwiOlxuXHRcdFx0XHRcdGNvbnN0IGZvY3VzSW5mbyA9IGhpc3Rvcnkuc3RhdGU/LmZvY3VzSW5mbztcblx0XHRcdFx0XHQodGhhdC5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnJlcGxhY2VIYXNoIGFzIEZ1bmN0aW9uKShvVGFyZ2V0U3RhdGUuaGFzaCk7XG5cdFx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoXG5cdFx0XHRcdFx0XHRPYmplY3QuYXNzaWduKFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0ZmVMZXZlbDogbmV3TGV2ZWwsXG5cdFx0XHRcdFx0XHRcdFx0Zm9jdXNJbmZvOiBmb2N1c0luZm9cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0aGlzdG9yeS5zdGF0ZVxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImFwcGVuZFwiOlxuXHRcdFx0XHRcdHRoYXQuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5zZXRIYXNoKG9UYXJnZXRTdGF0ZS5oYXNoKTtcblx0XHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHsgZmVMZXZlbDogbmV3TGV2ZWwgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXHRcdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImJhY2tcIjpcblx0XHRcdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tBc3luYyk7XG5cdFx0XHRcdFx0aGlzdG9yeS5nbygtb0hpc3RvcnlBY3Rpb24uc3RlcHMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJiYWNrLXJlcGxhY2VcIjpcblx0XHRcdFx0XHR0aGlzLl9kaXNhYmxlRXZlbnRPbkhhc2hDaGFuZ2UoKTtcblx0XHRcdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tSZXBsYWNlQXN5bmMpO1xuXHRcdFx0XHRcdGhpc3RvcnkuZ28oLW9IaXN0b3J5QWN0aW9uLnN0ZXBzKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdC8vIE5vIG5hdmlnYXRpb25cblx0XHRcdFx0XHR0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdHJlc29sdmUoZmFsc2UpOyAvLyBubyBuYXZpZ2F0aW9uIC0tPiByZXNvbHZlIHRvIGZhbHNlXG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRnZXRMYXN0SGlzdG9yeUVudHJ5KCk6IFJvdXRlclN0YXRlIHtcblx0XHRyZXR1cm4gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXTtcblx0fVxuXG5cdHNldFBhdGhNYXBwaW5nKG1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSk6IHZvaWQge1xuXHRcdHRoaXMuX3BhdGhNYXBwaW5ncyA9IG1hcHBpbmdzLmZpbHRlcigobWFwcGluZykgPT4ge1xuXHRcdFx0cmV0dXJuIG1hcHBpbmcub2xkUGF0aCAhPT0gbWFwcGluZy5uZXdQYXRoO1xuXHRcdH0pO1xuXHR9XG5cblx0aGFzaEd1YXJkKCk6IHZvaWQge1xuXHRcdGxldCBzSGFzaCA9IHRoaXMuZ2V0RGVjb2RlZFdpbmRvd0hhc2goKTtcblx0XHRjb25zdCBjdXJyZW50QXBwTmFtZSA9IHRoaXMuZ2V0QXBwTmFtZUZyb21IYXNoKHNIYXNoKTtcblx0XHRpZiAoY3VycmVudEFwcE5hbWUgIT0gdGhpcy5hcHBOYW1lKSB7XG5cdFx0XHQvLyBXaGVuIGRvaW5nIGV4dGVybmFsIG5hdmlnYXRpb24gaW4gYW5vdGhlciB3aW5kb3csIHRoZSBjdXJyZW50IHdpbmRvdyBsb2NhdGlvbiBpcyB0ZW1wb3JhcmlseSBtb2RpZmllZCB3aXRoIHRoZSBVUkwgb2YgdGhlIHRhcmdldCBhcHBcblx0XHRcdC8vIEluIHRoaXMgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byB1cGRhdGUgdGhlIGludGVybmFsbHkgbWFuYWdlZCBoaXN0b3J5LCBzbyB3ZSBzaW1wbHkgZG8gbm90aGluZ1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChzSGFzaC5pbmNsdWRlcyhcInJlc3RvcmVIaXN0b3J5PXRydWVcIikpIHtcblx0XHRcdHRoaXMuX2JBcHBseVJlc3RvcmUgPSB0cnVlO1xuXHRcdH0gZWxzZSBpZiAoIXRoaXMuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nKSB7XG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgaGFzaCBuZWVkcyB0byBiZSBjaGFuZ2VkICh0aGlzIGhhcHBlbnMgaW4gRkNMIHdoZW4gc3dpdGNoaW5nIGIvdyBlZGl0IGFuZCByZWFkLW9ubHkgd2l0aCAzIGNvbHVtbnMgb3Blbilcblx0XHRcdGNvbnN0IG1hcHBpbmcgPSB0aGlzLl9wYXRoTWFwcGluZ3MuZmluZCgobSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gc0hhc2guaW5jbHVkZXMobS5vbGRQYXRoKTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKG1hcHBpbmcpIHtcblx0XHRcdFx0Ly8gUmVwbGFjZSB0aGUgY3VycmVudCBoYXNoXG5cdFx0XHRcdHNIYXNoID0gc0hhc2gucmVwbGFjZShtYXBwaW5nLm9sZFBhdGgsIG1hcHBpbmcubmV3UGF0aCk7XG5cdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKE9iamVjdC5hc3NpZ24oe30sIGhpc3Rvcnkuc3RhdGUpLCBcIlwiLCBlbmNvZGVVUkkoc0hhc2gpKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYUhhc2hTcGxpdCA9IHNIYXNoLnNwbGl0KFwiJi9cIik7XG5cdFx0XHRjb25zdCBzQXBwSGFzaCA9IGFIYXNoU3BsaXRbMV0gPyBhSGFzaFNwbGl0WzFdIDogXCJcIjtcblx0XHRcdGlmICh0aGlzLmNoZWNrSGFzaFdpdGhHdWFyZChzQXBwSGFzaCkpIHtcblx0XHRcdFx0Y29uc3Qgb05ld1N0YXRlID0gdGhpcy5fZXh0cmFjdFN0YXRlRnJvbUhhc2goc0FwcEhhc2gpO1xuXHRcdFx0XHR0aGlzLl9wdXNoTmV3U3RhdGUob05ld1N0YXRlLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb21wYXJlcyAyIHN0YXRlcy5cblx0ICogQHBhcmFtIHtvYmplY3R9IG9TdGF0ZTFcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TdGF0ZTJcblx0ICogQHJldHVybnMge251bWJlcn0gVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbjpcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkVRVUFMIGlmIG9TdGF0ZTEgYW5kIG9TdGF0ZTIgYXJlIGVxdWFsXG5cdCAqICAgICAgICAtIGVudW1TdGF0ZS5DT01QQVRJQkxFIGlmIG9TdGF0ZTEgYW5kIG9TdGF0ZTIgYXJlIGNvbXBhdGlibGVcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkFOQ0VTVE9SIGlmIG9TdGF0ZTEgaXMgYW4gYW5jZXN0b3Igb2Ygb1N0YXRlMlxuXHQgKiAgICAgICAgLSBlbnVtU3RhdGUuRElGRkVSRU5UIGlmIHRoZSAyIHN0YXRlcyBhcmUgZGlmZmVyZW50XG5cdCAqL1xuXG5cdF9jb21wYXJlQ2FjaGVTdGF0ZXMob1N0YXRlMTogUm91dGVyU3RhdGUsIG9TdGF0ZTI6IFJvdXRlclN0YXRlKTogbnVtYmVyIHtcblx0XHQvLyBGaXJzdCBjb21wYXJlIG9iamVjdCBrZXlzXG5cdFx0aWYgKG9TdGF0ZTEua2V5cy5sZW5ndGggPiBvU3RhdGUyLmtleXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gZW51bVN0YXRlLkRJRkZFUkVOVDtcblx0XHR9XG5cdFx0bGV0IGVxdWFsID0gdHJ1ZTtcblx0XHRsZXQgaW5kZXg7XG5cdFx0Zm9yIChpbmRleCA9IDA7IGVxdWFsICYmIGluZGV4IDwgb1N0YXRlMS5rZXlzLmxlbmd0aDsgaW5kZXgrKykge1xuXHRcdFx0aWYgKG9TdGF0ZTEua2V5c1tpbmRleF0gIT09IG9TdGF0ZTIua2V5c1tpbmRleF0pIHtcblx0XHRcdFx0ZXF1YWwgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCFlcXVhbCkge1xuXHRcdFx0Ly8gU29tZSBvYmplY3RzIGtleXMgYXJlIGRpZmZlcmVudFxuXHRcdFx0cmV0dXJuIGVudW1TdGF0ZS5ESUZGRVJFTlQ7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGtleXMgZnJvbSBvU3RhdGUxIGFyZSBpbiBvU3RhdGUyIC0tPiBjaGVjayBpZiBhbmNlc3RvclxuXHRcdGlmIChvU3RhdGUxLmtleXMubGVuZ3RoIDwgb1N0YXRlMi5rZXlzLmxlbmd0aCB8fCBvU3RhdGUxLnNjcmVlbk1vZGUgPCBvU3RhdGUyLnNjcmVlbk1vZGUpIHtcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuQU5DRVNUT1I7XG5cdFx0fVxuXHRcdGlmIChvU3RhdGUxLnNjcmVlbk1vZGUgPiBvU3RhdGUyLnNjcmVlbk1vZGUpIHtcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuRElGRkVSRU5UOyAvLyBOb3Qgc3VyZSB0aGlzIGNhc2UgY2FuIGhhcHBlbi4uLlxuXHRcdH1cblxuXHRcdC8vIEF0IHRoaXMgc3RhZ2UsIHRoZSAyIHN0YXRlcyBoYXZlIHRoZSBzYW1lIG9iamVjdCBrZXlzIChpbiB0aGUgc2FtZSBvcmRlcikgYW5kIHNhbWUgc2NyZWVubW9kZVxuXHRcdC8vIFRoZXkgY2FuIGJlIGVpdGhlciBjb21wYXRpYmxlIG9yIGVxdWFsXG5cdFx0cmV0dXJuIG9TdGF0ZTEuc0xheW91dCA9PT0gb1N0YXRlMi5zTGF5b3V0ID8gZW51bVN0YXRlLkVRVUFMIDogZW51bVN0YXRlLkNPTVBBVElCTEU7XG5cdH1cblxuXHQvKipcblx0ICogU3BsaXQgdGhlIGFwcC1zcGVjaWZpYyByb3V0ZSBhdCB0aGUgXCImL1wiIHNlcGFyYXRvci5cblx0ICpcblx0ICogVGhlIGFwcC1zcGVjaWZpYyByb3V0ZSBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBzZWdtZW50cyBzZXBhcmF0ZWQgYnkgXCImL1wiLlxuXHQgKiBAZXhhbXBsZVxuXHQgKiBzcGxpdEFwcFNwZWNpZmljUm91dGUoXCImL0VudGl0eSgnYWJjJykvTmV4dEVudGl0eSgneHl6JylcIik7XG5cdCAqIC8vIFtcIkVudGl0eSgnYWJjJykvTmV4dEVudGl0eSgneHl6JylcIl1cblx0ICpcblx0ICogc3BsaXRBcHBTcGVjaWZpY1JvdXRlKFwiJi9FbnRpdHkoJ2FiYycpL05leHRFbnRpdHkoJ3h5eicpJi9QcmVmaXgvTmVzdGVkUm91dGVcIik7XG5cdCAqIC8vIFtcIkVudGl0eSgnYWJjJykvTmV4dEVudGl0eSgneHl6JylcIiwgXCJQcmVmaXgvTmVzdGVkUm91dGVcIl1cblx0ICogQHBhcmFtIGFwcFNwZWNpZmljUm91dGVcdFRoZSBhcHAtc3BlY2lmaWMgcm91dGUuXG5cdCAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFwcC1zcGVjaWZpYyByb3V0ZSBzZWdtZW50cy5cblx0ICovXG5cdHByaXZhdGUgc3RhdGljIHNwbGl0QXBwU3BlY2lmaWNSb3V0ZShhcHBTcGVjaWZpY1JvdXRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3Qgcm91dGVTcGxpdCA9IGFwcFNwZWNpZmljUm91dGU/LnNwbGl0KFwiJi9cIikgPz8gW107XG5cdFx0aWYgKCFyb3V0ZVNwbGl0WzBdKSB7XG5cdFx0XHRyb3V0ZVNwbGl0LnNoaWZ0KCk7IC8vIHJlbW92ZSB0aGUgbGVhZGluZyBlbXB0eSBzZWdtZW50ICh0aGUgYXBwLXNwZWNpZmljIHJvdXRlIHN0YXJ0cyB3aXRoIFwiJi9cIilcblx0XHR9XG5cdFx0cmV0dXJuIHJvdXRlU3BsaXQ7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGJhY2sgZXhpdHMgdGhlIHByZXNlbnQgZ3VhcmQgc2V0LlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYmFjayBleGl0cyB0aGUgZ3VhcmRcblx0ICovXG5cdGNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkKCk6IGJvb2xlYW4ge1xuXHRcdC8vIFdlIHVzZSB3aW5kb3cubG9jYXRpb24uaGFzaCBpbnN0ZWFkIG9mIEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkuZ2V0SGFzaCgpIGJlY2F1c2UgdGhlIGxhdHRlclxuXHRcdC8vIHJlcGxhY2VzIGNoYXJhY3RlcnMgaW4gdGhlIFVSTCAoZS5nLiAlMjQgcmVwbGFjZWQgYnkgJCkgYW5kIGl0IGNhdXNlcyBpc3N1ZXMgd2hlbiBjb21wYXJpbmdcblx0XHQvLyB3aXRoIHRoZSBVUkxzIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnlcblx0XHRjb25zdCBzcGxpdEhhc2ggPSB0aGlzLmdldEZ1bGxIYXNoKCk7XG5cblx0XHRjb25zdCBzZWdtZW50cyA9IFJvdXRlclByb3h5LnNwbGl0QXBwU3BlY2lmaWNSb3V0ZShzcGxpdEhhc2gpO1xuXG5cdFx0aWYgKHNlZ21lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIHRoZXJlIGlzIGEgbmVzdGVkIHJvdXRlIGludm9sdmVkIC0+IGFzc3VtZSB3ZSBhcmUgc3RpbGwgaW5zaWRlIHRoZSBndWFyZFxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGhhc2ggPSBzZWdtZW50c1swXSA/PyBcIlwiO1xuXG5cdFx0bGV0IHByZXZpb3VzSGFzaDtcblx0XHRpZiAodGhpcy5fb05hdmlnYXRpb25HdWFyZCkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaV0uaGFzaCA9PT0gaGFzaCkge1xuXHRcdFx0XHRcdHByZXZpb3VzSGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpIC0gMV0uaGFzaDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gIXByZXZpb3VzSGFzaCB8fCAhdGhpcy5jaGVja0hhc2hXaXRoR3VhcmQocHJldmlvdXNIYXNoKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGJhY2sgbmF2aWdhdGlvbiB3aWxsIGV4aXQgdGhlIGFwcC5cblx0ICogQHJldHVybnMgVHJ1ZSBpZiBiYWNrIGV4aXRzIHRoZSBhcHBcblx0ICovXG5cdGNoZWNrSWZCYWNrRXhpdHNBcHAoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3Qgc3BsaXRIYXNoID0gdGhpcy5nZXRGdWxsSGFzaCgpO1xuXG5cdFx0Y29uc3Qgc2VnbWVudHMgPSBSb3V0ZXJQcm94eS5zcGxpdEFwcFNwZWNpZmljUm91dGUoc3BsaXRIYXNoKTtcblxuXHRcdGlmIChzZWdtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0XHQvLyB0aGVyZSBpcyBhIG5lc3RlZCByb3V0ZSBpbnZvbHZlZCAtPiBhc3N1bWUgd2UgYXJlIHN0aWxsIGluc2lkZSB0aGUgYXBwXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIGN1cnJlbnQgaGFzaCBpcyB0aGUgZmlyc3Qgb25lIGluIHRoZSBoaXN0b3J5LCB0aGVuIGEgbmF2YmFjayB3aWxsIGV4aXQgdGhlIGFwcFxuXHRcdGNvbnN0IGhhc2ggPSBzZWdtZW50c1swXSA/PyBcIlwiO1xuXHRcdHJldHVybiB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoID4gMCAmJiB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbMF0uaGFzaCA9PT0gaGFzaDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIGxhc3QgMiBlbnRyaWVzIGluIHRoZSBoaXN0b3J5IHNoYXJlIHRoZSBzYW1lIGNvbnRleHQuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGV5IHNoYXJlIHRoZSBzYW1lIGNvbnRleHQuXG5cdCAqL1xuXHRjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0KCk6IGJvb2xlYW4ge1xuXHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIDwgMikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9DdXJyZW50U3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHRcdGNvbnN0IG9QcmV2aW91c1N0YXRlID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAyXTtcblxuXHRcdHJldHVybiBvQ3VycmVudFN0YXRlLmhhc2guc3BsaXQoXCI/XCIpWzBdID09PSBvUHJldmlvdXNTdGF0ZS5oYXNoLnNwbGl0KFwiP1wiKVswXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXN0b3JlcyB0aGUgZm9jdXMgZm9yIHRoZSBjdXJyZW50IGhhc2gsIGlmIHdlIGNhbiBmaW5kIGl0IGluIHRoZSBoaXN0b3J5LlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGZvY3VzIHdhcyBzZXQsIGZhbHNlIG90aGVyd2lzZS5cblx0ICovXG5cdHJlc3RvcmVGb2N1c0ZvckN1cnJlbnRIYXNoKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGN1cnJlbnRIYXNoID0gcmVtb3ZlQXBwU3RhdGVJbkhhc2godGhpcy5nZXRIYXNoKCkpO1xuXHRcdGNvbnN0IHN0YXRlRm9ySGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5maW5kKChzdGF0ZSkgPT4ge1xuXHRcdFx0cmV0dXJuIHJlbW92ZUFwcFN0YXRlSW5IYXNoKHN0YXRlLmhhc2gpID09PSBjdXJyZW50SGFzaDtcblx0XHR9KTtcblxuXHRcdGxldCBmb2N1c0FwcGxpZWQgPSBmYWxzZTtcblx0XHRpZiAoc3RhdGVGb3JIYXNoPy5mb2N1c0NvbnRyb2xJZCkge1xuXHRcdFx0bGV0IGZvY3VzQ29udHJvbCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3RhdGVGb3JIYXNoLmZvY3VzQ29udHJvbElkKTtcblx0XHRcdGxldCBmb2N1c0luZm8gPSBzdGF0ZUZvckhhc2guZm9jdXNJbmZvO1xuXHRcdFx0aWYgKCghZm9jdXNDb250cm9sIHx8ICFmb2N1c0NvbnRyb2wuZ2V0Rm9jdXNEb21SZWYoKSkgJiYgc3RhdGVGb3JIYXNoLnNlY29uZGFyeUZvY3VzQ29udHJvbElkKSB7XG5cdFx0XHRcdC8vIFRoZSBjb250cm9sIGZvciBmb2N1cyBpcyBlaXRoZXIgbm90IGZvdW5kIG9yIGlzIG5vdCBkaXNwbGF5ZWQgb24gc2NyZWVuIChubyBmb2N1c0RvbVJlZilcblx0XHRcdFx0Ly8gLS0+IHRyeSB0aGUgc2Vjb25kYXJ5IGNvbnRyb2wgaWYgdGhlcmUncyBvbmVcblx0XHRcdFx0Zm9jdXNDb250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChzdGF0ZUZvckhhc2guc2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQpO1xuXHRcdFx0XHRmb2N1c0luZm8gPSBzdGF0ZUZvckhhc2guc2Vjb25kYXJ5Rm9jdXNJbmZvO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFxuXHRcdFx0XHQvLyBpZiB0aGUgY29udHJvbCBpcyBhIGJ1c3kgdGFibGUsIHdlIGRvbid0IHdhbnQgdG8gZm9jdXMgaXQuXG5cdFx0XHRcdC8vIHRhYmxlcyBoYXZlIHRoZWlyIG93biBoYW5kbGluZyB0byByZXN0b3JlIGZvY3VzLCBzbyB3ZSBkb24ndCB3YW50IHRvIGludGVyZmVyZSB3aXRoIHRoYXRcblx0XHRcdFx0Zm9jdXNDb250cm9sPy5nZXRQYXJlbnQoKT8uaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikgJiZcblx0XHRcdFx0KGZvY3VzQ29udHJvbCBhcyBNVGFibGUgfCBVSVRhYmxlKS5nZXRCdXN5KClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRmb2N1c0NvbnRyb2w/LmZvY3VzKGZvY3VzSW5mbyk7XG5cdFx0XHRmb2N1c0FwcGxpZWQgPSBmb2N1c0NvbnRyb2wgIT09IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZm9jdXNBcHBsaWVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN0b3JlcyB0aGUgSUQgb2YgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGNvbnRyb2wgaW4gdGhlIGhpc3RvcnkgZm9yIHRoZSBjdXJyZW50IGhhc2guXG5cdCAqXG5cdCAqL1xuXHRwcml2YXRlIHN0b3JlRm9jdXNJbmZvRm9yQ3VycmVudEhhc2goKTogdm9pZCB7XG5cdFx0Y29uc3QgY3VycmVudEhhc2ggPSByZW1vdmVBcHBTdGF0ZUluSGFzaCh0aGlzLmdldEhhc2goKSk7XG5cdFx0Y29uc3Qgc3RhdGVGb3JIYXNoID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5LmZpbmQoKHN0YXRlKSA9PiB7XG5cdFx0XHRyZXR1cm4gcmVtb3ZlQXBwU3RhdGVJbkhhc2goc3RhdGUuaGFzaCkgPT09IGN1cnJlbnRIYXNoO1xuXHRcdH0pO1xuXHRcdGlmIChzdGF0ZUZvckhhc2gpIHtcblx0XHRcdGNvbnN0IGZvY3VzQ29udHJvbCA9IEVsZW1lbnQuZ2V0QWN0aXZlRWxlbWVudCgpO1xuXHRcdFx0c3RhdGVGb3JIYXNoLmZvY3VzQ29udHJvbElkID0gZm9jdXNDb250cm9sPy5nZXRJZCgpO1xuXHRcdFx0aWYgKGZvY3VzQ29udHJvbCkge1xuXHRcdFx0XHQvLyBUaGUgc2Vjb25kYXJ5IGZvY3VzIGNvbnRyb2wgaXMgdGhlIHBhcmVudCB0YWJsZSBpZiB0aGVyZSdzIG9uZVxuXHRcdFx0XHRsZXQgcGFyZW50VGFibGUgPSBmb2N1c0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdHdoaWxlIChwYXJlbnRUYWJsZSAmJiAhcGFyZW50VGFibGUuaXNBPFVJVGFibGU+KFwic2FwLnVpLnRhYmxlLlRhYmxlXCIpICYmICFwYXJlbnRUYWJsZS5pc0E8TVRhYmxlPihcInNhcC5tLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0cGFyZW50VGFibGUgPSBwYXJlbnRUYWJsZS5nZXRQYXJlbnQoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzdGF0ZUZvckhhc2guc2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQgPSBwYXJlbnRUYWJsZT8uZ2V0SWQoKTtcblx0XHRcdFx0c3RhdGVGb3JIYXNoLnNlY29uZGFyeUZvY3VzSW5mbyA9IHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9O1xuXHRcdFx0fVxuXHRcdFx0c3RhdGVGb3JIYXNoLmZvY3VzSW5mbyA9IGZvY3VzQ29udHJvbD8uZ2V0Rm9jdXNJbmZvKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZpbmRzIGEgbGF5b3V0IHZhbHVlIGZvciBhIGhhc2ggaW4gdGhlIGhpc3RvcnkuXG5cdCAqIEBwYXJhbSBoYXNoIFRoZSBoYXNoIHRvIGxvb2sgZm9yIGluIHRoZSBoaXN0b3J5LlxuXHQgKiBAcmV0dXJucyBBIGxheW91dCB2YWx1ZSBpZiBpdCBjb3VsZCBiZSBmb3VuZCwgdW5kZWZpbmVkIG90aGVyd2lzZS5cblx0ICovXG5cdGZpbmRMYXlvdXRGb3JIYXNoKGhhc2g6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKCF0aGlzLmZjbEVuYWJsZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIGFsbCBxdWVyeSBwYXJhbWV0ZXJzIGZyb20gdGhlIGhhc2hcblx0XHRjb25zdCBoYXNoTm9QYXJhbSA9IGhhc2guc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0Ly8gTG9vayBmb3IgdGhlIHN0YXRlIGJhY2t3YXJkcywgc28gdGhhdCB3ZSBmaW5kIHRoZSBsYXN0IHN0YXRlIGluIHRoZSBoaXN0b3J5IChlLmcuIGlmIHdlIGhhdmUgMiBzdGF0ZXMgd2l0aCB0aGUgc2FtZSBoYXNoIGJ1dCAyIGRpZmZlcmVudCBsYXlvdXRzKVxuXHRcdGxldCB0YXJnZXRTdGF0ZTogUm91dGVyU3RhdGUgfCB1bmRlZmluZWQ7XG5cdFx0Zm9yIChsZXQgaW5kZXggPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTsgaW5kZXggPj0gMCAmJiB0YXJnZXRTdGF0ZSA9PT0gdW5kZWZpbmVkOyBpbmRleC0tKSB7XG5cdFx0XHRpZiAodGhpcy5fb01hbmFnZWRIaXN0b3J5W2luZGV4XS5oYXNoLnNwbGl0KFwiP1wiKVswXSA9PT0gaGFzaE5vUGFyYW0pIHtcblx0XHRcdFx0dGFyZ2V0U3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaW5kZXhdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXRTdGF0ZT8uc0xheW91dDtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBSb3V0ZXJQcm94eTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7RUFjQSxNQUFNQSxTQUFTLEdBQUc7SUFDakJDLEtBQUssRUFBRSxDQUFDO0lBQ1JDLFVBQVUsRUFBRSxDQUFDO0lBQ2JDLFFBQVEsRUFBRSxDQUFDO0lBQ1hDLFNBQVMsRUFBRTtFQUNaLENBQUM7RUFDRCxNQUFNQyxhQUFhLEdBQUc7SUFDckJDLFdBQVcsRUFBRSxRQUFRO0lBQ3JCQyxjQUFjLEVBQUU7RUFDakIsQ0FBQztFQXdCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU0MsbUJBQW1CQSxDQUFDQyxVQUFrQixFQUFtQjtJQUNqRSxPQUFPO01BQ05DLFVBQVUsRUFBRUQsVUFBVSxDQUFDRSxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztNQUFFO01BQ2hEQyxLQUFLLEVBQUUsU0FBQUEsQ0FBVUMsS0FBYSxFQUFXO1FBQ3hDLE9BQU9BLEtBQUssQ0FBQ0MsT0FBTyxDQUFDLElBQUksQ0FBQ0osVUFBVSxDQUFDLEtBQUssQ0FBQztNQUM1QztJQUNELENBQUM7RUFDRjtFQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTSyxvQkFBb0JBLENBQUNGLEtBQWEsRUFBVTtJQUNwRCxPQUFPQSxLQUFLLENBQUNGLE9BQU8sQ0FBQyxJQUFJSyxNQUFNLENBQUMsUUFBUVgsYUFBYSxDQUFDRSxjQUFjLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUNuRjtFQUFDLElBR0tVLFdBQVcsSUFBQUMsSUFBQSxHQURoQkMsY0FBYyxDQUFDLHlCQUF5QixDQUFDLEVBQUFELElBQUEsQ0FBQUUsTUFBQSwwQkFBQUMsV0FBQTtJQUFBLFNBQUFKLFlBQUE7TUFBQSxJQUFB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