@sapui5/sap.fe.core 1.124.2 → 1.126.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 (300) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +5 -1
  3. package/src/sap/fe/core/ActionRuntime.js +2 -2
  4. package/src/sap/fe/core/ActionRuntime.ts +4 -4
  5. package/src/sap/fe/core/AppComponent.js +2 -2
  6. package/src/sap/fe/core/AppComponent.ts +1 -1
  7. package/src/sap/fe/core/AppStateHandler.js +2 -2
  8. package/src/sap/fe/core/AppStateHandler.ts +1 -1
  9. package/src/sap/fe/core/BaseController.js +2 -2
  10. package/src/sap/fe/core/BaseController.ts +1 -1
  11. package/src/sap/fe/core/CommonUtils.js +3 -3
  12. package/src/sap/fe/core/CommonUtils.ts +12 -15
  13. package/src/sap/fe/core/ExtensionAPI.js +2 -2
  14. package/src/sap/fe/core/ExtensionAPI.ts +4 -3
  15. package/src/sap/fe/core/PageController.js +2 -2
  16. package/src/sap/fe/core/PageController.ts +1 -1
  17. package/src/sap/fe/core/ResourceModel.js +2 -2
  18. package/src/sap/fe/core/ResourceModel.ts +1 -1
  19. package/src/sap/fe/core/ReuseComponent.js +172 -0
  20. package/src/sap/fe/core/ReuseComponent.ts +165 -0
  21. package/src/sap/fe/core/TemplateComponent.js +2 -2
  22. package/src/sap/fe/core/TemplateComponent.ts +5 -1
  23. package/src/sap/fe/core/TemplateModel.js +2 -2
  24. package/src/sap/fe/core/TemplateModel.ts +1 -1
  25. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +92 -6
  26. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +90 -10
  27. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
  28. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +1 -1
  29. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +30 -3
  30. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +28 -4
  31. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +10 -16
  32. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +19 -16
  33. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +3 -3
  34. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +5 -5
  35. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +2 -2
  36. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +1 -1
  37. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +17 -5
  38. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +14 -6
  39. package/src/sap/fe/core/controllerextensions/ContextSharing.js +2 -2
  40. package/src/sap/fe/core/controllerextensions/ContextSharing.ts +1 -1
  41. package/src/sap/fe/core/controllerextensions/EditFlow.js +57 -43
  42. package/src/sap/fe/core/controllerextensions/EditFlow.ts +61 -46
  43. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +2 -2
  44. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -1
  45. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +8 -11
  46. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +8 -16
  47. package/src/sap/fe/core/controllerextensions/InternalRouting.js +10 -7
  48. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +5 -5
  49. package/src/sap/fe/core/controllerextensions/KPIManagement.js +22 -18
  50. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +28 -23
  51. package/src/sap/fe/core/controllerextensions/MessageHandler.js +4 -4
  52. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +4 -1
  53. package/src/sap/fe/core/controllerextensions/PageReady.js +21 -15
  54. package/src/sap/fe/core/controllerextensions/PageReady.ts +29 -20
  55. package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
  56. package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
  57. package/src/sap/fe/core/controllerextensions/Placeholder.js +12 -6
  58. package/src/sap/fe/core/controllerextensions/Placeholder.ts +15 -1
  59. package/src/sap/fe/core/controllerextensions/Recommendations.js +26 -8
  60. package/src/sap/fe/core/controllerextensions/Recommendations.ts +29 -3
  61. package/src/sap/fe/core/controllerextensions/Routing.js +5 -7
  62. package/src/sap/fe/core/controllerextensions/Routing.ts +4 -4
  63. package/src/sap/fe/core/controllerextensions/Share.js +4 -4
  64. package/src/sap/fe/core/controllerextensions/Share.ts +10 -6
  65. package/src/sap/fe/core/controllerextensions/SideEffects.js +20 -5
  66. package/src/sap/fe/core/controllerextensions/SideEffects.ts +22 -2
  67. package/src/sap/fe/core/controllerextensions/Telemetry.js +2 -2
  68. package/src/sap/fe/core/controllerextensions/Telemetry.ts +1 -1
  69. package/src/sap/fe/core/controllerextensions/ViewState.js +79 -81
  70. package/src/sap/fe/core/controllerextensions/ViewState.ts +117 -105
  71. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +3 -3
  72. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +1 -1
  73. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
  74. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +2 -2
  75. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +17 -8
  76. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +8 -2
  77. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
  78. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +10 -9
  79. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +15 -10
  80. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +2 -2
  81. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +1 -1
  82. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +130 -158
  83. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +240 -275
  84. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +2 -2
  85. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +1 -1
  86. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +46 -28
  87. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +60 -32
  88. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +2 -2
  89. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +1 -1
  90. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +2 -2
  91. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.ts +27 -3
  92. package/src/sap/fe/core/controls/CommandExecution.js +2 -2
  93. package/src/sap/fe/core/controls/CommandExecution.ts +2 -2
  94. package/src/sap/fe/core/controls/ComponentLoader.js +3 -3
  95. package/src/sap/fe/core/controls/ComponentLoader.ts +2 -2
  96. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +3 -3
  97. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +2 -2
  98. package/src/sap/fe/core/controls/EventDelegateHook.js +2 -2
  99. package/src/sap/fe/core/controls/EventDelegateHook.ts +2 -2
  100. package/src/sap/fe/core/controls/FormElementWrapper.js +51 -6
  101. package/src/sap/fe/core/controls/FormElementWrapper.ts +43 -2
  102. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +3 -3
  103. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +3 -3
  104. package/src/sap/fe/core/converters/ConverterContext.js +4 -2
  105. package/src/sap/fe/core/converters/ConverterContext.ts +5 -2
  106. package/src/sap/fe/core/converters/ManifestSettings.js +8 -2
  107. package/src/sap/fe/core/converters/ManifestSettings.ts +25 -3
  108. package/src/sap/fe/core/converters/ManifestWrapper.js +12 -3
  109. package/src/sap/fe/core/converters/ManifestWrapper.ts +11 -1
  110. package/src/sap/fe/core/converters/MetaModelConverter.js +7 -6
  111. package/src/sap/fe/core/converters/MetaModelConverter.ts +6 -2
  112. package/src/sap/fe/core/converters/annotations/DataField.js +56 -16
  113. package/src/sap/fe/core/converters/annotations/DataField.ts +74 -25
  114. package/src/sap/fe/core/converters/common/AnnotationConverter.js +19 -18
  115. package/src/sap/fe/core/converters/controls/Common/Action.js +5 -5
  116. package/src/sap/fe/core/converters/controls/Common/Action.ts +14 -14
  117. package/src/sap/fe/core/converters/controls/Common/Chart.js +40 -7
  118. package/src/sap/fe/core/converters/controls/Common/Chart.ts +56 -20
  119. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +8 -11
  120. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +23 -27
  121. package/src/sap/fe/core/converters/controls/Common/Form.js +10 -3
  122. package/src/sap/fe/core/converters/controls/Common/Form.ts +13 -4
  123. package/src/sap/fe/core/converters/controls/Common/KPI.js +3 -2
  124. package/src/sap/fe/core/converters/controls/Common/KPI.ts +6 -2
  125. package/src/sap/fe/core/converters/controls/Common/Table.js +137 -48
  126. package/src/sap/fe/core/converters/controls/Common/Table.ts +174 -52
  127. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +73 -21
  128. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +91 -20
  129. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +4 -4
  130. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +2 -2
  131. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +2 -2
  132. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +2 -2
  133. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +3 -3
  134. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +1 -1
  135. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -16
  136. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +18 -17
  137. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +2 -2
  138. package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +1 -1
  139. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +9 -9
  140. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +12 -12
  141. package/src/sap/fe/core/converters/templates/ListReportConverter.js +13 -7
  142. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -5
  143. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +9 -73
  144. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +4 -74
  145. package/src/sap/fe/core/designtime/AppComponent.designtime.js +5 -10
  146. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +3 -12
  147. package/src/sap/fe/core/formatters/CriticalityFormatter.js +4 -7
  148. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +3 -3
  149. package/src/sap/fe/core/formatters/FiscalFormat.js +5 -3
  150. package/src/sap/fe/core/formatters/FiscalFormat.ts +4 -2
  151. package/src/sap/fe/core/formatters/StandardFormatter.js +2 -2
  152. package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -3
  153. package/src/sap/fe/core/fpm/Component.js +3 -3
  154. package/src/sap/fe/core/fpm/Component.ts +3 -3
  155. package/src/sap/fe/core/fpm/manifest.json +1 -1
  156. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.js +2 -2
  157. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.ts +1 -1
  158. package/src/sap/fe/core/helpers/BindingHelper.js +2 -2
  159. package/src/sap/fe/core/helpers/BindingHelper.ts +2 -2
  160. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.js +2 -2
  161. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.ts +2 -2
  162. package/src/sap/fe/core/helpers/DeleteHelper.js +7 -4
  163. package/src/sap/fe/core/helpers/DeleteHelper.ts +9 -3
  164. package/src/sap/fe/core/helpers/MetaModelFunction.js +5 -5
  165. package/src/sap/fe/core/helpers/MetaModelFunction.ts +2 -2
  166. package/src/sap/fe/core/helpers/MetaPath.js +9 -3
  167. package/src/sap/fe/core/helpers/MetaPath.ts +8 -2
  168. package/src/sap/fe/core/helpers/ModelHelper.js +149 -3
  169. package/src/sap/fe/core/helpers/ModelHelper.ts +202 -6
  170. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +3 -3
  171. package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +2 -2
  172. package/src/sap/fe/core/helpers/TitleHelper.js +4 -4
  173. package/src/sap/fe/core/helpers/TitleHelper.ts +4 -4
  174. package/src/sap/fe/core/library.js +4 -4
  175. package/src/sap/fe/core/library.ts +2 -1
  176. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +11 -3
  177. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +10 -2
  178. package/src/sap/fe/core/messagebundle.properties +8 -57
  179. package/src/sap/fe/core/messagebundle_ar.properties +2 -0
  180. package/src/sap/fe/core/messagebundle_bg.properties +2 -0
  181. package/src/sap/fe/core/messagebundle_ca.properties +2 -0
  182. package/src/sap/fe/core/messagebundle_cnr.properties +2 -0
  183. package/src/sap/fe/core/messagebundle_cs.properties +2 -0
  184. package/src/sap/fe/core/messagebundle_cy.properties +4 -2
  185. package/src/sap/fe/core/messagebundle_da.properties +2 -0
  186. package/src/sap/fe/core/messagebundle_de.properties +2 -0
  187. package/src/sap/fe/core/messagebundle_el.properties +2 -0
  188. package/src/sap/fe/core/messagebundle_en.properties +6 -57
  189. package/src/sap/fe/core/messagebundle_en_GB.properties +2 -0
  190. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +3 -36
  191. package/src/sap/fe/core/messagebundle_es.properties +2 -0
  192. package/src/sap/fe/core/messagebundle_es_MX.properties +2 -0
  193. package/src/sap/fe/core/messagebundle_et.properties +2 -0
  194. package/src/sap/fe/core/messagebundle_fi.properties +2 -0
  195. package/src/sap/fe/core/messagebundle_fr.properties +2 -0
  196. package/src/sap/fe/core/messagebundle_fr_CA.properties +3 -1
  197. package/src/sap/fe/core/messagebundle_hi.properties +2 -0
  198. package/src/sap/fe/core/messagebundle_hr.properties +2 -0
  199. package/src/sap/fe/core/messagebundle_hu.properties +3 -1
  200. package/src/sap/fe/core/messagebundle_id.properties +2 -0
  201. package/src/sap/fe/core/messagebundle_it.properties +2 -0
  202. package/src/sap/fe/core/messagebundle_iw.properties +3 -1
  203. package/src/sap/fe/core/messagebundle_ja.properties +2 -0
  204. package/src/sap/fe/core/messagebundle_kk.properties +2 -0
  205. package/src/sap/fe/core/messagebundle_ko.properties +2 -0
  206. package/src/sap/fe/core/messagebundle_lt.properties +2 -0
  207. package/src/sap/fe/core/messagebundle_lv.properties +2 -0
  208. package/src/sap/fe/core/messagebundle_mk.properties +2 -0
  209. package/src/sap/fe/core/messagebundle_ms.properties +2 -0
  210. package/src/sap/fe/core/messagebundle_nl.properties +2 -0
  211. package/src/sap/fe/core/messagebundle_no.properties +2 -0
  212. package/src/sap/fe/core/messagebundle_pl.properties +2 -0
  213. package/src/sap/fe/core/messagebundle_pt.properties +2 -0
  214. package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -0
  215. package/src/sap/fe/core/messagebundle_ro.properties +2 -0
  216. package/src/sap/fe/core/messagebundle_ru.properties +2 -0
  217. package/src/sap/fe/core/messagebundle_sh.properties +64 -62
  218. package/src/sap/fe/core/messagebundle_sk.properties +2 -0
  219. package/src/sap/fe/core/messagebundle_sl.properties +2 -0
  220. package/src/sap/fe/core/messagebundle_sr.properties +2 -0
  221. package/src/sap/fe/core/messagebundle_sv.properties +2 -0
  222. package/src/sap/fe/core/messagebundle_th.properties +2 -0
  223. package/src/sap/fe/core/messagebundle_tr.properties +2 -0
  224. package/src/sap/fe/core/messagebundle_uk.properties +3 -1
  225. package/src/sap/fe/core/messagebundle_vi.properties +2 -0
  226. package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -0
  227. package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -0
  228. package/src/sap/fe/core/operationsHelper.js +3 -3
  229. package/src/sap/fe/core/operationsHelper.ts +2 -2
  230. package/src/sap/fe/core/rootView/Fcl.controller.js +3 -3
  231. package/src/sap/fe/core/rootView/Fcl.controller.ts +2 -2
  232. package/src/sap/fe/core/rootView/NavContainer.controller.js +2 -2
  233. package/src/sap/fe/core/rootView/NavContainer.controller.ts +1 -1
  234. package/src/sap/fe/core/rootView/RootViewBaseController.js +114 -92
  235. package/src/sap/fe/core/rootView/RootViewBaseController.ts +120 -106
  236. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +2 -2
  237. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.ts +1 -1
  238. package/src/sap/fe/core/services/NavigationServiceFactory.js +6 -4
  239. package/src/sap/fe/core/services/NavigationServiceFactory.ts +4 -3
  240. package/src/sap/fe/core/services/RoutingServiceFactory.js +2 -2
  241. package/src/sap/fe/core/services/RoutingServiceFactory.ts +1 -1
  242. package/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
  243. package/src/sap/fe/core/services/ShellServicesFactory.ts +12 -2
  244. package/src/sap/fe/core/services/TelemetryServiceFactory.js +8 -2
  245. package/src/sap/fe/core/services/TelemetryServiceFactory.ts +7 -1
  246. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +16 -9
  247. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +22 -11
  248. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +2 -2
  249. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +1 -1
  250. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
  251. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
  252. package/src/sap/fe/core/templating/ActionHelper.js +2 -2
  253. package/src/sap/fe/core/templating/ActionHelper.ts +2 -2
  254. package/src/sap/fe/core/templating/CommonFormatters.js +2 -2
  255. package/src/sap/fe/core/templating/CommonFormatters.ts +3 -3
  256. package/src/sap/fe/core/templating/CriticalityFormatters.js +2 -2
  257. package/src/sap/fe/core/templating/CriticalityFormatters.ts +2 -2
  258. package/src/sap/fe/core/templating/DataFieldFormatters.js +4 -4
  259. package/src/sap/fe/core/templating/DataFieldFormatters.ts +2 -2
  260. package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -2
  261. package/src/sap/fe/core/templating/DataModelPathHelper.ts +2 -2
  262. package/src/sap/fe/core/templating/EntityTypeHelper.js +2 -2
  263. package/src/sap/fe/core/templating/EntityTypeHelper.ts +2 -2
  264. package/src/sap/fe/core/templating/FieldControlHelper.js +2 -2
  265. package/src/sap/fe/core/templating/FieldControlHelper.ts +2 -2
  266. package/src/sap/fe/core/templating/SemanticObjectHelper.js +2 -2
  267. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +2 -2
  268. package/src/sap/fe/core/templating/UIFormatters.js +7 -7
  269. package/src/sap/fe/core/templating/UIFormatters.ts +6 -6
  270. package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
  271. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +1 -1
  272. package/src/sap/fe/core/type/Email.js +2 -2
  273. package/src/sap/fe/core/type/Email.ts +1 -1
  274. package/src/sap/fe/core/type/FiscalDate.js +2 -2
  275. package/src/sap/fe/core/type/FiscalDate.ts +1 -1
  276. package/src/sap/fe/core/type/InputMask.js +124 -0
  277. package/src/sap/fe/core/type/InputMask.ts +131 -0
  278. package/ui5.yaml +19 -0
  279. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js +0 -81
  280. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.ts +0 -117
  281. package/src/sap/fe/core/helpers/AnnotationEnum.js +0 -33
  282. package/src/sap/fe/core/helpers/AnnotationEnum.ts +0 -21
  283. package/src/sap/fe/core/helpers/BindingToolkit.js +0 -1813
  284. package/src/sap/fe/core/helpers/BindingToolkit.ts +0 -2450
  285. package/src/sap/fe/core/helpers/ClassSupport.js +0 -584
  286. package/src/sap/fe/core/helpers/ClassSupport.ts +0 -697
  287. package/src/sap/fe/core/jsx-runtime/Fragment.js +0 -14
  288. package/src/sap/fe/core/jsx-runtime/Fragment.ts +0 -3
  289. package/src/sap/fe/core/jsx-runtime/ViewLoader.js +0 -93
  290. package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +0 -86
  291. package/src/sap/fe/core/jsx-runtime/jsx-control.js +0 -177
  292. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +0 -197
  293. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +0 -237
  294. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +0 -246
  295. package/src/sap/fe/core/jsx-runtime/jsx.js +0 -47
  296. package/src/sap/fe/core/jsx-runtime/jsx.ts +0 -71
  297. package/src/sap/fe/core/jsx-runtime/jsxs.js +0 -10
  298. package/src/sap/fe/core/jsx-runtime/jsxs.ts +0 -3
  299. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +0 -172
  300. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +0 -194
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/ManifestHelper", "sap/fe/core/helpers/SizeHelper", "sap/ui/base/BindingParser", "sap/ui/core/Element", "sap/ui/core/routing/HashChanger", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/AnnotationHelper", "sap/ui/thirdparty/URI"], function (Log, BaseController, CommonUtils, Placeholder, ViewState, ClassSupport, ManifestHelper, SizeHelper, BindingParser, Element, HashChanger, JSONModel, AnnotationHelper, URI) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/BaseController", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ManifestHelper", "sap/fe/core/helpers/SizeHelper", "sap/ui/base/BindingParser", "sap/ui/core/Element", "sap/ui/core/routing/HashChanger", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/AnnotationHelper", "sap/ui/thirdparty/URI", "../controls/Any"], function (Log, ClassSupport, BaseController, CommonUtils, Placeholder, ViewState, ManifestHelper, SizeHelper, BindingParser, Element, HashChanger, JSONModel, AnnotationHelper, URI, Any) {
6
6
  "use strict";
7
7
 
8
8
  var _dec, _dec2, _dec3, _class, _class2, _descriptor, _descriptor2;
@@ -175,7 +175,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/Common
175
175
  const oAppComponent = this.getAppComponent();
176
176
  this._scrollTablesToLastNavigatedItems();
177
177
  if (oAppComponent.getEnvironmentCapabilities().getCapabilities().UShell) {
178
- this._computeTitleHierarchy(oView);
178
+ this.computeTitleHierarchy(oView);
179
179
  }
180
180
  const bForceFocus = oAppComponent.getRouterProxy().isFocusForced();
181
181
  oAppComponent.getRouterProxy().setFocusForced(false); // reset
@@ -261,68 +261,86 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/Common
261
261
  /**
262
262
  * Fetches the value of the HeaderInfo title for a given path.
263
263
  *
264
- * @param sPath The path to the entity
264
+ * @param path The path to the entity
265
265
  * @returns A promise containing the formatted title, or an empty string if no HeaderInfo title annotation is available
266
266
  */;
267
- _proto._fetchTitleValue = async function _fetchTitleValue(sPath) {
268
- const oAppComponent = this.getAppComponent(),
269
- oModel = this.getView().getModel(),
270
- oMetaModel = oAppComponent.getMetaModel(),
271
- sMetaPath = oMetaModel.getMetaPath(sPath),
272
- oBindingViewContext = oModel.createBindingContext(sPath),
273
- sValueExpression = AnnotationHelper.format(oMetaModel.getObject(`${sMetaPath}/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value`), {
274
- context: oMetaModel.createBindingContext("/")
267
+ _proto._fetchTitleValue = async function _fetchTitleValue(path) {
268
+ const appComponent = this.getAppComponent(),
269
+ model = this.getView().getModel(),
270
+ metaModel = appComponent.getMetaModel(),
271
+ metaPath = metaModel.getMetaPath(path),
272
+ bindingViewContext = model.createBindingContext(path),
273
+ headerInfoTitleValueAnnotation = metaModel.getObject(`${metaPath}/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value`),
274
+ valueExpression = AnnotationHelper.format(headerInfoTitleValueAnnotation, {
275
+ context: metaModel.createBindingContext("/")
275
276
  });
276
- if (!sValueExpression) {
277
+ if (!valueExpression) {
277
278
  return Promise.resolve("");
278
279
  }
279
- const sTextExpression = AnnotationHelper.format(oMetaModel.getObject(`${sMetaPath}/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value/$Path@com.sap.vocabularies.Common.v1.Text`), {
280
- context: oMetaModel.createBindingContext("/")
280
+ if (headerInfoTitleValueAnnotation.$Function === "odata.concat") {
281
+ const anyObject = new Any({
282
+ any: valueExpression
283
+ });
284
+ anyObject.setModel(model);
285
+ anyObject.setBindingContext(bindingViewContext);
286
+ const textBinding = anyObject.getBinding("any");
287
+ if (textBinding !== null && textBinding !== void 0 && textBinding.isA("sap.ui.model.CompositeBinding")) {
288
+ await Promise.all(textBinding.getBindings().map(binding => {
289
+ var _binding$requestValue;
290
+ return (_binding$requestValue = binding.requestValue) === null || _binding$requestValue === void 0 ? void 0 : _binding$requestValue.call(binding);
291
+ }));
292
+ }
293
+ const infoTitle = anyObject.getAny();
294
+ anyObject.destroy();
295
+ return Promise.resolve(infoTitle);
296
+ }
297
+ const textExpression = AnnotationHelper.format(metaModel.getObject(`${metaPath}/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value/$Path@com.sap.vocabularies.Common.v1.Text`), {
298
+ context: metaModel.createBindingContext("/")
281
299
  }),
282
- oPropertyContext = oMetaModel.getObject(`${sMetaPath}/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value/$Path@`),
283
- aPromises = [],
284
- oValueExpression = BindingParser.complexParser(sValueExpression),
285
- oPromiseForDisplayMode = new Promise(function (resolve) {
286
- const displayMode = CommonUtils.computeDisplayMode(oPropertyContext);
300
+ propertyContext = metaModel.getObject(`${metaPath}/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value/$Path@`),
301
+ promises = [],
302
+ parsedvalueExpression = BindingParser.complexParser(valueExpression),
303
+ promiseForDisplayMode = new Promise(function (resolve) {
304
+ const displayMode = CommonUtils.computeDisplayMode(propertyContext);
287
305
  resolve(displayMode);
288
306
  });
289
- aPromises.push(oPromiseForDisplayMode);
290
- const sValuePath = oValueExpression.parts ? oValueExpression.parts[0].path : oValueExpression.path,
291
- fnValueFormatter = oValueExpression.formatter,
292
- oValueBinding = oModel.bindProperty(sValuePath, oBindingViewContext, {
307
+ promises.push(promiseForDisplayMode);
308
+ const valuePath = parsedvalueExpression.parts ? parsedvalueExpression.parts[0].path : parsedvalueExpression.path,
309
+ fnValueFormatter = parsedvalueExpression.formatter,
310
+ valueBinding = model.bindProperty(valuePath, bindingViewContext, {
293
311
  $$groupId: "$auto.Heroes"
294
312
  });
295
- oValueBinding.initialize();
296
- const oPromiseForTitleValue = new Promise(function (resolve) {
297
- const fnChange = function (oEvent) {
298
- const sTargetValue = fnValueFormatter ? fnValueFormatter(oEvent.getSource().getValue()) : oEvent.getSource().getValue();
299
- oValueBinding.detachChange(fnChange);
300
- resolve(sTargetValue);
313
+ valueBinding.initialize();
314
+ const promiseForTitleValue = new Promise(function (resolve) {
315
+ const fnChange = function (event) {
316
+ const targetValue = fnValueFormatter ? fnValueFormatter(event.getSource().getValue()) : event.getSource().getValue();
317
+ valueBinding.detachChange(fnChange);
318
+ resolve(targetValue);
301
319
  };
302
- oValueBinding.attachChange(fnChange);
320
+ valueBinding.attachChange(fnChange);
303
321
  });
304
- aPromises.push(oPromiseForTitleValue);
305
- if (sTextExpression) {
306
- const oTextExpression = BindingParser.complexParser(sTextExpression);
307
- let sTextPath = oTextExpression.parts ? oTextExpression.parts[0].path : oTextExpression.path;
308
- sTextPath = sValuePath.lastIndexOf("/") > -1 ? `${sValuePath.slice(0, sValuePath.lastIndexOf("/"))}/${sTextPath}` : sTextPath;
309
- const fnTextFormatter = oTextExpression.formatter,
310
- oTextBinding = oModel.bindProperty(sTextPath, oBindingViewContext, {
322
+ promises.push(promiseForTitleValue);
323
+ if (textExpression) {
324
+ const parsedTextExpression = BindingParser.complexParser(textExpression);
325
+ let textPath = parsedTextExpression.parts ? parsedTextExpression.parts[0].path : parsedTextExpression.path;
326
+ textPath = valuePath.lastIndexOf("/") > -1 ? `${valuePath.slice(0, valuePath.lastIndexOf("/"))}/${textPath}` : textPath;
327
+ const fnTextFormatter = parsedTextExpression.formatter,
328
+ textBinding = model.bindProperty(textPath, bindingViewContext, {
311
329
  $$groupId: "$auto.Heroes"
312
330
  });
313
- oTextBinding.initialize();
314
- const oPromiseForTitleText = new Promise(function (resolve) {
315
- const fnChange = function (oEvent) {
316
- const sTargetText = fnTextFormatter ? fnTextFormatter(oEvent.getSource().getValue()) : oEvent.getSource().getValue();
317
- oTextBinding.detachChange(fnChange);
318
- resolve(sTargetText);
331
+ textBinding.initialize();
332
+ const promiseForTitleText = new Promise(function (resolve) {
333
+ const fnChange = function (event) {
334
+ const targetText = fnTextFormatter ? fnTextFormatter(event.getSource().getValue()) : event.getSource().getValue();
335
+ textBinding.detachChange(fnChange);
336
+ resolve(targetText);
319
337
  };
320
- oTextBinding.attachChange(fnChange);
338
+ textBinding.attachChange(fnChange);
321
339
  });
322
- aPromises.push(oPromiseForTitleText);
340
+ promises.push(promiseForTitleText);
323
341
  }
324
342
  try {
325
- const titleInfo = await Promise.all(aPromises);
343
+ const titleInfo = await Promise.all(promises);
326
344
  let formattedTitle = "";
327
345
  if (typeof titleInfo !== "string") {
328
346
  formattedTitle = this._formatTitle(titleInfo[0], titleInfo[1], titleInfo[2]);
@@ -339,7 +357,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/Common
339
357
  *
340
358
  * @returns Decoded application-specific hash
341
359
  */;
342
- _proto._getAppSpecificHash = function _getAppSpecificHash() {
360
+ _proto.getAppSpecificHash = function getAppSpecificHash() {
343
361
  // HashChanged isShellNavigationHashChanger
344
362
  const hashChanger = HashChanger.getInstance();
345
363
  return hashChanger.hrefForAppSpecificHash ? URI.decode(hashChanger.hrefForAppSpecificHash("")) : "#/";
@@ -364,7 +382,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/Common
364
382
  const oMetaModel = this.getAppComponent().getMetaModel();
365
383
  const sEntityPath = oMetaModel.getMetaPath(sPath);
366
384
  const sTypeName = oMetaModel.getObject(`${sEntityPath}/@com.sap.vocabularies.UI.v1.HeaderInfo/TypeName`);
367
- const sAppSpecificHash = this._getAppSpecificHash();
385
+ const sAppSpecificHash = this.getAppSpecificHash();
368
386
  const sIntent = sAppSpecificHash + sPath.slice(1);
369
387
  return this._fetchTitleValue(sPath).then(sTitle => {
370
388
  const oTitleInfo = this._computeTitleInfo(sTypeName, sTitle, sIntent);
@@ -417,70 +435,74 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/Common
417
435
  /**
418
436
  * This function updates the shell title after each navigation.
419
437
  *
420
- * @param oView The current view
438
+ * @param view The current view
421
439
  * @returns A Promise that is resolved when the menu is filled properly
440
+ * @private
422
441
  */;
423
- _proto._computeTitleHierarchy = async function _computeTitleHierarchy(oView) {
424
- const oAppComponent = this.getAppComponent(),
425
- oContext = oView.getBindingContext(),
426
- oCurrentPage = oView.getParent(),
427
- aTitleInformationPromises = [],
428
- sAppSpecificHash = this._getAppSpecificHash(),
429
- manifestAppSettings = oAppComponent.getManifestEntry("sap.app"),
430
- sAppTitle = manifestAppSettings.title || "",
431
- sAppSubTitle = manifestAppSettings.subTitle || "",
442
+ _proto.computeTitleHierarchy = async function computeTitleHierarchy(view) {
443
+ const appComponent = this.getAppComponent(),
444
+ context = view.getBindingContext(),
445
+ currentPage = view.getParent(),
446
+ titleInformationPromises = [],
447
+ appSpecificHash = this.getAppSpecificHash(),
448
+ manifestAppSettings = appComponent.getManifestEntry("sap.app"),
449
+ appTitle = manifestAppSettings.title || "",
450
+ appSubTitle = manifestAppSettings.subTitle || "",
432
451
  appIcon = manifestAppSettings.icon || "";
433
- let oPageTitleInformation, sNewPath;
434
- if (oCurrentPage && oCurrentPage._getPageTitleInformation) {
435
- if (oContext) {
452
+ let pageTitleInformation, newPath;
453
+ if (currentPage && currentPage._getPageTitleInformation) {
454
+ if (context) {
436
455
  // If the first page of the application is a LR, use the title and subtitle from the manifest
437
456
  if (this._getTargetTypeFromHash("") === "sap.fe.templates.ListReport") {
438
- aTitleInformationPromises.push(Promise.resolve(this._computeTitleInfo(sAppTitle, sAppSubTitle, sAppSpecificHash, appIcon)));
457
+ titleInformationPromises.push(Promise.resolve(this._computeTitleInfo(appTitle, appSubTitle, appSpecificHash, appIcon)));
439
458
  }
440
459
 
441
460
  // Then manage other pages
442
- sNewPath = oContext.getPath();
443
- const aPathParts = sNewPath.split("/");
444
- let sPath = "";
445
- aPathParts.shift(); // Remove the first segment (empty string) as it has been managed above
446
- aPathParts.pop(); // Remove the last segment as it corresponds to the current page and shouldn't appear in the menu
447
-
448
- aPathParts.forEach(sPathPart => {
449
- sPath += `/${sPathPart}`;
450
- const oMetaModel = oAppComponent.getMetaModel(),
451
- sParameterPath = oMetaModel.getMetaPath(sPath),
452
- bIsParameterized = oMetaModel.getObject(`${sParameterPath}/@com.sap.vocabularies.Common.v1.ResultContext`);
453
- if (!bIsParameterized) {
454
- aTitleInformationPromises.push(this.getTitleInfoFromPath(sPath));
461
+ newPath = context.getPath();
462
+ const pathParts = newPath.split("/");
463
+ let path = "";
464
+ pathParts.shift(); // Remove the first segment (empty string) as it has been managed above
465
+ pathParts.pop(); // Remove the last segment as it corresponds to the current page and shouldn't appear in the menu
466
+ pathParts.forEach(pathPart => {
467
+ path += `/${pathPart}`;
468
+ //if the associated target is not declared in the routes, we skip it
469
+ if (!appComponent.getRouter().getRouteInfoByHash(path)) {
470
+ return;
471
+ }
472
+ const metaModel = appComponent.getMetaModel(),
473
+ parameterPath = metaModel.getMetaPath(path),
474
+ isParameterized = metaModel.getObject(`${parameterPath}/@com.sap.vocabularies.Common.v1.ResultContext`);
475
+ if (!isParameterized) {
476
+ titleInformationPromises.push(this.getTitleInfoFromPath(path));
455
477
  }
456
478
  });
457
479
  }
458
480
 
459
481
  // Current page
460
- oPageTitleInformation = oCurrentPage._getPageTitleInformation();
461
- oPageTitleInformation = this._computeTitleInfo(oPageTitleInformation.title ?? "", oPageTitleInformation.subtitle ?? "", sAppSpecificHash + this._getHash());
462
- if (oContext && sNewPath) {
463
- this._getTitleHierarchyCache()[sNewPath] = oPageTitleInformation;
482
+ pageTitleInformation = currentPage._getPageTitleInformation();
483
+ pageTitleInformation = this._computeTitleInfo(pageTitleInformation.title ?? "", pageTitleInformation.subtitle ?? "", appSpecificHash + this._getHash());
484
+ if (context && newPath) {
485
+ this._getTitleHierarchyCache()[newPath] = pageTitleInformation;
464
486
  } else {
465
- this._getTitleHierarchyCache()[sAppSpecificHash] = oPageTitleInformation;
487
+ this._getTitleHierarchyCache()[appSpecificHash] = pageTitleInformation;
466
488
  }
467
489
  } else {
468
- aTitleInformationPromises.push(Promise.reject("Title information missing in HeaderInfo"));
490
+ titleInformationPromises.push(Promise.reject("Title information missing in HeaderInfo"));
469
491
  }
470
- return Promise.all(aTitleInformationPromises).then(aTitleInfoHierarchy => {
492
+ return Promise.all(titleInformationPromises).then(titleInfoHierarchy => {
471
493
  // workaround for shell which is expecting all elements being of type string
472
- const aTitleInfoHierarchyShell = this._ensureHierarchyElementsAreStrings(aTitleInfoHierarchy),
473
- sTitle = oPageTitleInformation.title ?? "";
474
- aTitleInfoHierarchyShell.reverse();
475
- oAppComponent.getShellServices().setHierarchy(aTitleInfoHierarchyShell);
476
- this._setShellMenuTitle(oAppComponent, sTitle, sAppTitle);
494
+ const titleInfoHierarchyShell = this._ensureHierarchyElementsAreStrings(titleInfoHierarchy),
495
+ title = pageTitleInformation.title ?? "";
496
+ titleInfoHierarchyShell.reverse();
497
+ appComponent.getShellServices().setHierarchy(titleInfoHierarchyShell);
498
+ this._setShellMenuTitle(appComponent, title, appTitle);
477
499
  return;
478
- }).catch(function (sErrorMessage) {
479
- Log.error(sErrorMessage);
500
+ }).catch(function (errorMessage) {
501
+ Log.error(errorMessage);
480
502
  }).finally(() => {
481
503
  this.bIsComputingTitleHierachy = false;
482
- }).catch(function (sErrorMessage) {
483
- Log.error(sErrorMessage);
504
+ }).catch(function (errorMessage) {
505
+ Log.error(errorMessage);
484
506
  });
485
507
  }
486
508
 
@@ -565,4 +587,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/Common
565
587
  })), _class2)) || _class);
566
588
  return RootViewBaseController;
567
589
  }, false);
568
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSb290Vmlld0Jhc2VDb250cm9sbGVyIiwiZGVmaW5lVUk1Q2xhc3MiLCJ1c2luZ0V4dGVuc2lvbiIsIlBsYWNlaG9sZGVyIiwiVmlld1N0YXRlIiwiYklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeSIsIm9uSW5pdCIsIlNpemVIZWxwZXIiLCJpbml0IiwiX2FIZWxwZXJNb2RlbHMiLCJnZXRQbGFjZWhvbGRlciIsIm9QbGFjZWhvbGRlciIsImF0dGFjaFJvdXRlTWF0Y2hlcnMiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRSb3V0aW5nU2VydmljZSIsImF0dGFjaEFmdGVyUm91dGVNYXRjaGVkIiwiX29uQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJvbkV4aXQiLCJkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsIm9Sb3V0ZXIiLCJ1bmRlZmluZWQiLCJleGl0IiwiZm9yRWFjaCIsIm9Nb2RlbCIsImRlc3Ryb3kiLCJnZXRWaWV3RnJvbUNvbnRhaW5lciIsImNvbnRhaW5lciIsInJlc3VsdCIsImlzQSIsImdldENvbXBvbmVudEluc3RhbmNlIiwiZ2V0Um9vdENvbnRyb2wiLCJnZXRWaWV3c0Zyb21QYWdlcyIsInBhZ2VzIiwidmlld3MiLCJwYWdlIiwidmlldyIsInB1c2giLCJnZXRSZXNvdXJjZUJ1bmRsZSIsImdldE93bmVyQ29tcG9uZW50IiwiZ2V0TW9kZWwiLCJnZXRSb3V0ZXIiLCJfY3JlYXRlSGVscGVyTW9kZWwiLCJKU09OTW9kZWwiLCJyb3V0aW5nSXNDb21wbGV0ZSIsIl9vUm91dGVNYXRjaGVkUHJvbWlzZSIsIlByb21pc2UiLCJyZXNvbHZlIiwid2FpdEZvclJpZ2h0TW9zdFZpZXdSZWFkeSIsIm9FdmVudCIsImFDb250YWluZXJzIiwiZ2V0UGFyYW1ldGVyIiwiYUZFQ29udGFpbmVycyIsIm9Db250YWluZXIiLCJvVmlldyIsIm9Db21wb25lbnRJbnN0YW5jZSIsImdldENvbnRyb2xsZXIiLCJwYWdlUmVhZHkiLCJvUmlnaHRNb3N0RkVWaWV3IiwibGVuZ3RoIiwiaXNQYWdlUmVhZHkiLCJhdHRhY2hFdmVudE9uY2UiLCJyZXN0b3JlRm9jdXNGcm9tSGlzdG9yeSIsImhpc3RvcnkiLCJzdGF0ZSIsImZvY3VzSW5mbyIsInR5cGUiLCJ0YWJsZSIsIkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsInRhYmxlSWQiLCJwb3MiLCJnZXRSb3dCaW5kaW5nIiwiZ2V0Q3VycmVudENvbnRleHRzIiwiZmluZEluZGV4IiwiY29udGV4dCIsImdldFBhdGgiLCJjb250ZXh0UGF0aEZvY3VzIiwiZm9jdXNSb3ciLCJjb250cm9sSWQiLCJmb2N1cyIsInJlcGxhY2VTdGF0ZSIsIk9iamVjdCIsImFzc2lnbiIsInRoZW4iLCJvUm9vdENvbnRyb2wiLCJnZXRWaWV3IiwiZ2V0Q29udGVudCIsImdldEF1dG9Gb2N1cyIsInNldFByb3BlcnR5Iiwib0FwcENvbXBvbmVudCIsIl9zY3JvbGxUYWJsZXNUb0xhc3ROYXZpZ2F0ZWRJdGVtcyIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiVVNoZWxsIiwiX2NvbXB1dGVUaXRsZUhpZXJhcmNoeSIsImJGb3JjZUZvY3VzIiwiZ2V0Um91dGVyUHJveHkiLCJpc0ZvY3VzRm9yY2VkIiwic2V0Rm9jdXNGb3JjZWQiLCJvblBhZ2VSZWFkeSIsImdldFBhcmVudCIsImZvcmNlRm9jdXMiLCJyZXN0b3JlRm9jdXNGb3JDdXJyZW50SGFzaCIsIm9uQ29udGFpbmVyUmVhZHkiLCJjYXRjaCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiZmluYWxseSIsIl9nZXRUaXRsZUhpZXJhcmNoeUNhY2hlIiwib1RpdGxlSGllcmFyY2h5Q2FjaGUiLCJfY29tcHV0ZVRpdGxlSW5mbyIsInRpdGxlIiwic3VidGl0bGUiLCJzSW50ZW50IiwiaWNvbiIsImFQYXJ0cyIsInNwbGl0IiwiaW5jbHVkZXMiLCJpbnRlbnQiLCJfZm9ybWF0VGl0bGUiLCJkaXNwbGF5TW9kZSIsInRpdGxlVmFsdWUiLCJ0aXRsZURlc2NyaXB0aW9uIiwiZm9ybWF0dGVkVGl0bGUiLCJfZmV0Y2hUaXRsZVZhbHVlIiwic1BhdGgiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJvQmluZGluZ1ZpZXdDb250ZXh0IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJzVmFsdWVFeHByZXNzaW9uIiwiQW5ub3RhdGlvbkhlbHBlciIsImZvcm1hdCIsImdldE9iamVjdCIsInNUZXh0RXhwcmVzc2lvbiIsIm9Qcm9wZXJ0eUNvbnRleHQiLCJhUHJvbWlzZXMiLCJvVmFsdWVFeHByZXNzaW9uIiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJvUHJvbWlzZUZvckRpc3BsYXlNb2RlIiwiQ29tbW9uVXRpbHMiLCJjb21wdXRlRGlzcGxheU1vZGUiLCJzVmFsdWVQYXRoIiwicGFydHMiLCJwYXRoIiwiZm5WYWx1ZUZvcm1hdHRlciIsImZvcm1hdHRlciIsIm9WYWx1ZUJpbmRpbmciLCJiaW5kUHJvcGVydHkiLCIkJGdyb3VwSWQiLCJpbml0aWFsaXplIiwib1Byb21pc2VGb3JUaXRsZVZhbHVlIiwiZm5DaGFuZ2UiLCJzVGFyZ2V0VmFsdWUiLCJnZXRTb3VyY2UiLCJnZXRWYWx1ZSIsImRldGFjaENoYW5nZSIsImF0dGFjaENoYW5nZSIsIm9UZXh0RXhwcmVzc2lvbiIsInNUZXh0UGF0aCIsImxhc3RJbmRleE9mIiwic2xpY2UiLCJmblRleHRGb3JtYXR0ZXIiLCJvVGV4dEJpbmRpbmciLCJvUHJvbWlzZUZvclRpdGxlVGV4dCIsInNUYXJnZXRUZXh0IiwidGl0bGVJbmZvIiwiYWxsIiwiX2dldEFwcFNwZWNpZmljSGFzaCIsImhhc2hDaGFuZ2VyIiwiSGFzaENoYW5nZXIiLCJnZXRJbnN0YW5jZSIsImhyZWZGb3JBcHBTcGVjaWZpY0hhc2giLCJVUkkiLCJkZWNvZGUiLCJfZ2V0SGFzaCIsImdldEhhc2giLCJnZXRUaXRsZUluZm9Gcm9tUGF0aCIsInNFbnRpdHlQYXRoIiwic1R5cGVOYW1lIiwic0FwcFNwZWNpZmljSGFzaCIsInNUaXRsZSIsIm9UaXRsZUluZm8iLCJfZW5zdXJlSGllcmFyY2h5RWxlbWVudHNBcmVTdHJpbmdzIiwiYUhpZXJhcmNoeSIsImFIaWVyYXJjaHlTaGVsbCIsImxldmVsIiwib0hpZXJhcmNoeSIsIm9TaGVsbEhpZXJhcmNoeSIsImtleSIsIlN0cmluZyIsIl9nZXRUYXJnZXRUeXBlRnJvbUhhc2giLCJzSGFzaCIsInNUYXJnZXRUeXBlIiwiYVJvdXRlcyIsImdldE1hbmlmZXN0RW50cnkiLCJyb3V0aW5nIiwicm91dGVzIiwicm91dGUiLCJvUm91dGUiLCJnZXRSb3V0ZSIsIm5hbWUiLCJtYXRjaCIsInNUYXJnZXQiLCJnZXRSb3V0ZVRhcmdldE5hbWVzIiwidGFyZ2V0IiwiZ2V0VGFyZ2V0IiwiX29PcHRpb25zIiwib0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIm9DdXJyZW50UGFnZSIsImFUaXRsZUluZm9ybWF0aW9uUHJvbWlzZXMiLCJtYW5pZmVzdEFwcFNldHRpbmdzIiwic0FwcFRpdGxlIiwic0FwcFN1YlRpdGxlIiwic3ViVGl0bGUiLCJhcHBJY29uIiwib1BhZ2VUaXRsZUluZm9ybWF0aW9uIiwic05ld1BhdGgiLCJfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24iLCJhUGF0aFBhcnRzIiwic2hpZnQiLCJwb3AiLCJzUGF0aFBhcnQiLCJzUGFyYW1ldGVyUGF0aCIsImJJc1BhcmFtZXRlcml6ZWQiLCJyZWplY3QiLCJhVGl0bGVJbmZvSGllcmFyY2h5IiwiYVRpdGxlSW5mb0hpZXJhcmNoeVNoZWxsIiwicmV2ZXJzZSIsImdldFNoZWxsU2VydmljZXMiLCJzZXRIaWVyYXJjaHkiLCJfc2V0U2hlbGxNZW51VGl0bGUiLCJzRXJyb3JNZXNzYWdlIiwiY2FsY3VsYXRlTGF5b3V0IiwiaU5leHRGQ0xMZXZlbCIsInNQcm9wb3NlZExheW91dCIsImtlZXBDdXJyZW50TGF5b3V0Iiwib25Db250ZXh0Qm91bmRUb1ZpZXciLCJzRGVlcGVzdFBhdGgiLCJnZXRQcm9wZXJ0eSIsInNWaWV3Q29udGV4dFBhdGgiLCJpbmRleE9mIiwiZGlzcGxheUVycm9yUGFnZSIsIl9lcnJvck1lc3NhZ2UiLCJfcGFyYW1ldGVycyIsIl9GQ0xMZXZlbCIsInVwZGF0ZVVJU3RhdGVGb3JWaWV3IiwiRkNMTGV2ZWwiLCJnZXRJbnN0YW5jZWRWaWV3cyIsImdldFZpc2libGVWaWV3cyIsImlzRmNsRW5hYmxlZCIsInNldFRpdGxlIiwiZ2V0QXBwQ29udGVudENvbnRhaW5lciIsImFwcENvbnRlbnRJZCIsImNvbmZpZyIsImJ5SWQiLCJCYXNlQ29udHJvbGxlciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiUm9vdFZpZXdCYXNlQ29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgdHlwZSBGbGV4aWJsZUNvbHVtbkxheW91dCBmcm9tIFwic2FwL2YvRmxleGlibGVDb2x1bW5MYXlvdXRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQmFzZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFRlbXBsYXRlQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZUNvbXBvbmVudFwiO1xuaW1wb3J0IHsgdHlwZSBOYXZpZ2F0aW9uVG9FcnJvclBhZ2VSZXN1bHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCBQbGFjZWhvbGRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGxhY2Vob2xkZXJcIjtcbmltcG9ydCBWaWV3U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1ZpZXdTdGF0ZVwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIHVzaW5nRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBnZXRSb3V0ZVRhcmdldE5hbWVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTWFuaWZlc3RIZWxwZXJcIjtcbmltcG9ydCBTaXplSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1NpemVIZWxwZXJcIjtcbmltcG9ydCB0eXBlIEZjbENvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L0ZjbC5jb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBOYXZDb250YWluZXIgZnJvbSBcInNhcC9tL05hdkNvbnRhaW5lclwiO1xuaW1wb3J0IEJpbmRpbmdQYXJzZXIgZnJvbSBcInNhcC91aS9iYXNlL0JpbmRpbmdQYXJzZXJcIjtcbmltcG9ydCB0eXBlIENvbXBvbmVudENvbnRhaW5lciBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50Q29udGFpbmVyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBIYXNoQ2hhbmdlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9IYXNoQ2hhbmdlclwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0ZSRNYXRjaGVkRXZlbnQgfSBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZVwiO1xuaW1wb3J0IHR5cGUgUm91dGVyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL1JvdXRlclwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBBbm5vdGF0aW9uSGVscGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQW5ub3RhdGlvbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBPRGF0YVByb3BlcnR5QmluZGluZyRDaGFuZ2VFdmVudCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgVVJJIGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9VUklcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwiLi4vQXBwQ29tcG9uZW50XCI7XG5cbmV4cG9ydCB0eXBlIFRpdGxlSW5mb3JtYXRpb24gPSB7XG5cdHRpdGxlPzogc3RyaW5nO1xuXHRzdWJ0aXRsZT86IHN0cmluZztcblx0aWNvbj86IHN0cmluZztcblx0aW50ZW50Pzogc3RyaW5nO1xufTtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUucm9vdFZpZXcuUm9vdFZpZXdCYXNlQ29udHJvbGxlclwiKVxuY2xhc3MgUm9vdFZpZXdCYXNlQ29udHJvbGxlciBleHRlbmRzIEJhc2VDb250cm9sbGVyIHtcblx0QHVzaW5nRXh0ZW5zaW9uKFBsYWNlaG9sZGVyKVxuXHRvUGxhY2Vob2xkZXIhOiBQbGFjZWhvbGRlcjtcblxuXHRAdXNpbmdFeHRlbnNpb24oVmlld1N0YXRlKVxuXHR2aWV3U3RhdGUhOiBWaWV3U3RhdGU7XG5cblx0cHJpdmF0ZSBfYUhlbHBlck1vZGVscyE6IEpTT05Nb2RlbFtdO1xuXG5cdHByaXZhdGUgb1JvdXRlcj86IFJvdXRlcjtcblxuXHRwcml2YXRlIF9vUm91dGVNYXRjaGVkUHJvbWlzZT86IFByb21pc2U8dm9pZD47XG5cblx0cHJpdmF0ZSBvVGl0bGVIaWVyYXJjaHlDYWNoZT86IFJlY29yZDxzdHJpbmcsIFRpdGxlSW5mb3JtYXRpb24+O1xuXG5cdHByaXZhdGUgYklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeSA9IGZhbHNlO1xuXG5cdG9uSW5pdCgpOiB2b2lkIHtcblx0XHRTaXplSGVscGVyLmluaXQoKTtcblxuXHRcdHRoaXMuX2FIZWxwZXJNb2RlbHMgPSBbXTtcblx0fVxuXG5cdGdldFBsYWNlaG9sZGVyKCk6IFBsYWNlaG9sZGVyIHtcblx0XHRyZXR1cm4gdGhpcy5vUGxhY2Vob2xkZXI7XG5cdH1cblxuXHRhdHRhY2hSb3V0ZU1hdGNoZXJzKCk6IHZvaWQge1xuXHRcdHRoaXMub1BsYWNlaG9sZGVyLmF0dGFjaFJvdXRlTWF0Y2hlcnMoKTtcblx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuYXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQoe30sIHRoaXMuX29uQWZ0ZXJSb3V0ZU1hdGNoZWQsIHRoaXMpO1xuXHR9XG5cblx0b25FeGl0KCk6IHZvaWQge1xuXHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGluZ1NlcnZpY2UoKS5kZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCh0aGlzLl9vbkFmdGVyUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0XHR0aGlzLm9Sb3V0ZXIgPSB1bmRlZmluZWQ7XG5cblx0XHRTaXplSGVscGVyLmV4aXQoKTtcblxuXHRcdC8vIERlc3Ryb3kgYWxsIEpTT04gbW9kZWxzIGNyZWF0ZWQgZHluYW1pY2FsbHkgZm9yIHRoZSB2aWV3c1xuXHRcdHRoaXMuX2FIZWxwZXJNb2RlbHMuZm9yRWFjaChmdW5jdGlvbiAob01vZGVsOiBKU09OTW9kZWwpIHtcblx0XHRcdG9Nb2RlbC5kZXN0cm95KCk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgZ2V0Vmlld0Zyb21Db250YWluZXIoY29udGFpbmVyOiBDb250cm9sKTogVmlldyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gY29udGFpbmVyLmlzQTxDb21wb25lbnRDb250YWluZXI+KFwic2FwLnVpLmNvcmUuQ29tcG9uZW50Q29udGFpbmVyXCIpXG5cdFx0XHQ/IGNvbnRhaW5lci5nZXRDb21wb25lbnRJbnN0YW5jZSgpLmdldFJvb3RDb250cm9sKClcblx0XHRcdDogY29udGFpbmVyO1xuXG5cdFx0cmV0dXJuIHJlc3VsdD8uaXNBPFZpZXc+KFwic2FwLnVpLmNvcmUubXZjLlZpZXdcIikgPyByZXN1bHQgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQW5hbHl6ZSB0aGUgcGFnZXMgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB2aWV3cy5cblx0ICpcblx0ICogQHBhcmFtIHBhZ2VzIFRoZSBwYWdlcyB0byBiZSBhbmFseXplZC5cblx0ICogQHJldHVybnMgVGhlIHZpZXdzXG5cdCAqL1xuXHRwcm90ZWN0ZWQgZ2V0Vmlld3NGcm9tUGFnZXMocGFnZXM6IENvbnRyb2xbXSk6IFZpZXdbXSB7XG5cdFx0Y29uc3Qgdmlld3M6IFZpZXdbXSA9IFtdO1xuXG5cdFx0cGFnZXMuZm9yRWFjaCgocGFnZSkgPT4ge1xuXHRcdFx0Y29uc3QgdmlldyA9IHRoaXMuZ2V0Vmlld0Zyb21Db250YWluZXIocGFnZSk7XG5cblx0XHRcdGlmICh2aWV3ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dmlld3MucHVzaCh2aWV3KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiB2aWV3cztcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIHJlc291cmNlIGJ1bmRsZS5cblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKiBAcmV0dXJucyBUaGUgcmVzb3VyY2VNb2RlbCBvZiB0aGUgY29tcG9uZW50XG5cdCAqL1xuXHRnZXRSZXNvdXJjZUJ1bmRsZSgpOiBSZXNvdXJjZUJ1bmRsZSB8IFByb21pc2U8UmVzb3VyY2VCdW5kbGU+IHtcblx0XHRyZXR1cm4gKHRoaXMuZ2V0T3duZXJDb21wb25lbnQoKS5nZXRNb2RlbChcImkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0fVxuXG5cdGdldFJvdXRlcigpOiBSb3V0ZXIge1xuXHRcdGlmICghdGhpcy5vUm91dGVyKSB7XG5cdFx0XHR0aGlzLm9Sb3V0ZXIgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlcigpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLm9Sb3V0ZXI7XG5cdH1cblxuXHRfY3JlYXRlSGVscGVyTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHQvLyBXZSBrZWVwIGEgcmVmZXJlbmNlIG9uIHRoZSBtb2RlbHMgY3JlYXRlZCBkeW5hbWljYWxseSwgYXMgdGhleSBkb24ndCBnZXQgZGVzdHJveWVkXG5cdFx0Ly8gYXV0b21hdGljYWxseSB3aGVuIHRoZSB2aWV3IGlzIGRlc3Ryb3llZC5cblx0XHQvLyBUaGlzIGlzIGRvbmUgZHVyaW5nIG9uRXhpdFxuXHRcdGNvbnN0IG9Nb2RlbCA9IG5ldyBKU09OTW9kZWwoKTtcblx0XHR0aGlzLl9hSGVscGVyTW9kZWxzLnB1c2gob01vZGVsKTtcblxuXHRcdHJldHVybiBvTW9kZWw7XG5cdH1cblxuXHRhc3luYyByb3V0aW5nSXNDb21wbGV0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRhd2FpdCAodGhpcy5fb1JvdXRlTWF0Y2hlZFByb21pc2UgfHwgUHJvbWlzZS5yZXNvbHZlKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHdhaXRpbmcgZm9yIHRoZSBSaWdodCBtb3N0IHZpZXcgdG8gYmUgcmVhZHkuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnQgUmVmZXJlbmNlIGFuIEV2ZW50IHBhcmFtZXRlciBjb21pbmcgZnJvbSByb3V0ZU1hdGNoZWQgZXZlbnRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIGluZGljYXRpbmcgd2hlbiB0aGUgcmlnaHQgbW9zdCB2aWV3IGlzIHJlYWR5XG5cdCAqL1xuXHRhc3luYyB3YWl0Rm9yUmlnaHRNb3N0Vmlld1JlYWR5KG9FdmVudDogUm91dGUkTWF0Y2hlZEV2ZW50KTogUHJvbWlzZTxGRVZpZXc+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogRkVWaWV3KSA9PiB2b2lkKSB7XG5cdFx0XHRjb25zdCBhQ29udGFpbmVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJ2aWV3c1wiKSA/PyBbXSxcblx0XHRcdFx0Ly8gVGhlcmUgY2FuIGFsc28gYmUgcmV1c2UgY29tcG9uZW50cyBpbiB0aGUgdmlldywgcmVtb3ZlIHRoZW0gYmVmb3JlIHByb2Nlc3NpbmcuXG5cdFx0XHRcdGFGRUNvbnRhaW5lcnM6IEZFVmlld1tdID0gW107XG5cdFx0XHRhQ29udGFpbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChvQ29udGFpbmVyOiBWaWV3IHwgQ29tcG9uZW50Q29udGFpbmVyIHwgdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGxldCBvVmlldyA9IG9Db250YWluZXIgYXMgRkVWaWV3IHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAob0NvbnRhaW5lciAmJiAob0NvbnRhaW5lciBhcyBDb21wb25lbnRDb250YWluZXIpLmdldENvbXBvbmVudEluc3RhbmNlKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbXBvbmVudEluc3RhbmNlID0gKG9Db250YWluZXIgYXMgQ29tcG9uZW50Q29udGFpbmVyKS5nZXRDb21wb25lbnRJbnN0YW5jZSgpO1xuXHRcdFx0XHRcdG9WaWV3ID0gb0NvbXBvbmVudEluc3RhbmNlLmdldFJvb3RDb250cm9sKCkgYXMgRkVWaWV3O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvVmlldyAmJiBvVmlldy5nZXRDb250cm9sbGVyKCkgJiYgb1ZpZXcuZ2V0Q29udHJvbGxlcigpLnBhZ2VSZWFkeSkge1xuXHRcdFx0XHRcdGFGRUNvbnRhaW5lcnMucHVzaChvVmlldyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3Qgb1JpZ2h0TW9zdEZFVmlldyA9IGFGRUNvbnRhaW5lcnNbYUZFQ29udGFpbmVycy5sZW5ndGggLSAxXTtcblx0XHRcdGlmIChvUmlnaHRNb3N0RkVWaWV3ICYmIG9SaWdodE1vc3RGRVZpZXcuZ2V0Q29udHJvbGxlcigpLnBhZ2VSZWFkeS5pc1BhZ2VSZWFkeSgpKSB7XG5cdFx0XHRcdHJlc29sdmUob1JpZ2h0TW9zdEZFVmlldyk7XG5cdFx0XHR9IGVsc2UgaWYgKG9SaWdodE1vc3RGRVZpZXcpIHtcblx0XHRcdFx0b1JpZ2h0TW9zdEZFVmlldy5nZXRDb250cm9sbGVyKCkucGFnZVJlYWR5LmF0dGFjaEV2ZW50T25jZShcInBhZ2VSZWFkeVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZShvUmlnaHRNb3N0RkVWaWV3KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHJlc3RvcmUgdGhlIGZvY3VzSW5mb3JtYXRpb24gZnJvbSB0aGUgaGlzdG9yeSBPYmplY3QuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgcmVzdG9yZUZvY3VzRnJvbUhpc3RvcnkoKTogdm9pZCB7XG5cdFx0c3dpdGNoIChoaXN0b3J5LnN0YXRlLmZvY3VzSW5mby50eXBlKSB7XG5cdFx0XHRjYXNlIFwiUm93XCI6XG5cdFx0XHRcdGNvbnN0IHRhYmxlID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChoaXN0b3J5LnN0YXRlLmZvY3VzSW5mby50YWJsZUlkKSBhcyBUYWJsZTtcblx0XHRcdFx0Y29uc3QgcG9zID0gdGFibGVcblx0XHRcdFx0XHQuZ2V0Um93QmluZGluZygpXG5cdFx0XHRcdFx0LmdldEN1cnJlbnRDb250ZXh0cygpXG5cdFx0XHRcdFx0LmZpbmRJbmRleCgoY29udGV4dCkgPT4gY29udGV4dC5nZXRQYXRoKCkgPT09IGhpc3Rvcnkuc3RhdGUuZm9jdXNJbmZvLmNvbnRleHRQYXRoRm9jdXMpO1xuXHRcdFx0XHRpZiAocG9zICE9PSAtMSkge1xuXHRcdFx0XHRcdHRhYmxlLmZvY3VzUm93KHBvcyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRFbGVtZW50LmdldEVsZW1lbnRCeUlkKGhpc3Rvcnkuc3RhdGUuZm9jdXNJbmZvLmNvbnRyb2xJZCk/LmZvY3VzKCk7XG5cdFx0fVxuXHRcdC8vb25jZSBhcHBsaWVkLCB0aGUgZm9jdXMgaW5mbyBpcyByZW1vdmVkIHRvIHByZXZlbnQgZm9jdXNpbmcgb24gaXQgZWFjaCB0aW1lIHRoZSB1c2VyIGRvIGEgYmFjayBuYXZpZ2F0aW9uIHRvIHRoaXMgcGFnZVxuXHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKE9iamVjdC5hc3NpZ24oaGlzdG9yeS5zdGF0ZSwgeyBmb2N1c0luZm86IG51bGwgfSksIFwiXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxiYWNrIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZG9uZS5cblx0ICogIC0gdXBkYXRlIHRoZSBzaGVsbCB0aXRsZS5cblx0ICogIC0gdXBkYXRlIHRhYmxlIHNjcm9sbC5cblx0ICogIC0gY2FsbCBvblBhZ2VSZWFkeSBvbiB0aGUgcmlnaHRNb3N0Vmlldy5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKi9cblx0X29uQWZ0ZXJSb3V0ZU1hdGNoZWQob0V2ZW50OiBSb3V0ZSRNYXRjaGVkRXZlbnQpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMuX29Sb3V0ZU1hdGNoZWRQcm9taXNlKSB7XG5cdFx0XHR0aGlzLl9vUm91dGVNYXRjaGVkUHJvbWlzZSA9IHRoaXMud2FpdEZvclJpZ2h0TW9zdFZpZXdSZWFkeShvRXZlbnQpXG5cdFx0XHRcdC50aGVuKChvVmlldzogVmlldykgPT4ge1xuXHRcdFx0XHRcdC8vIFRoZSBhdXRvRm9jdXMgaXMgaW5pdGlhbGx5IGRpc2FibGVkIG9uIHRoZSBuYXZDb250YWluZXIgb3IgdGhlIEZDTCwgc28gdGhhdCB0aGUgZm9jdXMgc3RheXMgb24gdGhlIFNoZWxsIG1lbnVcblx0XHRcdFx0XHQvLyBldmVuIGlmIHRoZSBhcHAgdGFrZXMgYSBsb25nIHRpbWUgdG8gbGF1bmNoXG5cdFx0XHRcdFx0Ly8gVGhlIGZpcnN0IHRpbWUgdGhlIHZpZXcgaXMgZGlzcGxheWVkLCB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgYXV0b2ZvY3VzIHNvIHRoYXQgaXQncyBtYW5hZ2VkIHByb3Blcmx5IGR1cmluZyBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0Y29uc3Qgb1Jvb3RDb250cm9sID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udGVudCgpWzBdO1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdG9Sb290Q29udHJvbCAmJlxuXHRcdFx0XHRcdFx0KG9Sb290Q29udHJvbCBhcyBGbGV4aWJsZUNvbHVtbkxheW91dCkuZ2V0QXV0b0ZvY3VzICYmXG5cdFx0XHRcdFx0XHQhKG9Sb290Q29udHJvbCBhcyBGbGV4aWJsZUNvbHVtbkxheW91dCkuZ2V0QXV0b0ZvY3VzKClcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9Sb290Q29udHJvbC5zZXRQcm9wZXJ0eShcImF1dG9Gb2N1c1wiLCB0cnVlLCB0cnVlKTsgLy8gRG8gbm90IG1hcmsgdGhlIGNvbnRhaW5lciBhcyBpbnZhbGlkLCBvdGhlcndpc2UgaXQncyByZS1yZW5kZXJlZFxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdFx0XHRcdHRoaXMuX3Njcm9sbFRhYmxlc1RvTGFzdE5hdmlnYXRlZEl0ZW1zKCk7XG5cdFx0XHRcdFx0aWYgKG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKS5VU2hlbGwpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2NvbXB1dGVUaXRsZUhpZXJhcmNoeShvVmlldyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGJGb3JjZUZvY3VzID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmlzRm9jdXNGb3JjZWQoKTtcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0Rm9jdXNGb3JjZWQoZmFsc2UpOyAvLyByZXNldFxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdG9WaWV3LmdldENvbnRyb2xsZXIoKSAmJlxuXHRcdFx0XHRcdFx0KG9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikub25QYWdlUmVhZHkgJiZcblx0XHRcdFx0XHRcdChvVmlldy5nZXRQYXJlbnQoKSBhcyBUZW1wbGF0ZUNvbXBvbmVudCkub25QYWdlUmVhZHlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdChvVmlldy5nZXRQYXJlbnQoKSBhcyBUZW1wbGF0ZUNvbXBvbmVudCkub25QYWdlUmVhZHkoeyBmb3JjZUZvY3VzOiBiRm9yY2VGb2N1cyB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGhpc3Rvcnkuc3RhdGUuZm9jdXNJbmZvKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnJlc3RvcmVGb2N1c0Zyb21IaXN0b3J5KCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICghYkZvcmNlRm9jdXMpIHtcblx0XHRcdFx0XHRcdC8vIFRyeSB0byByZXN0b3JlIHRoZSBmb2N1cyBvbiB3aGVyZSBpdCB3YXMgd2hlbiB3ZSBsYXN0IHZpc2l0ZWQgdGhlIGN1cnJlbnQgaGFzaFxuXHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnJlc3RvcmVGb2N1c0ZvckN1cnJlbnRIYXNoKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh0aGlzLm9uQ29udGFpbmVyUmVhZHkpIHtcblx0XHRcdFx0XHRcdHRoaXMub25Db250YWluZXJSZWFkeSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNvbXB1dGluZyB0aGUgdGl0bGUgaGllcmFyY2h5IGFuZCBjYWxsaW5nIGZvY3VzIG1ldGhvZFwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX29Sb3V0ZU1hdGNoZWRQcm9taXNlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBUaXRsZUhpZXJhcmNoeSBjYWNoZSAoIG9yIGluaXRpYWxpemVzIGl0IGlmIHVuZGVmaW5lZCkuXG5cdCAqXG5cdCAqIEByZXR1cm5zICBUaGUgVGl0bGVIaWVyYXJjaHkgY2FjaGVcblx0ICovXG5cdF9nZXRUaXRsZUhpZXJhcmNoeUNhY2hlKCk6IFJlY29yZDxzdHJpbmcsIFRpdGxlSW5mb3JtYXRpb24+IHtcblx0XHRpZiAoIXRoaXMub1RpdGxlSGllcmFyY2h5Q2FjaGUpIHtcblx0XHRcdHRoaXMub1RpdGxlSGllcmFyY2h5Q2FjaGUgPSB7fTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMub1RpdGxlSGllcmFyY2h5Q2FjaGU7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgdGl0bGVJbmZvIG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIHRpdGxlIFRoZSBhcHBsaWNhdGlvbidzIHRpdGxlXG5cdCAqIEBwYXJhbSBzdWJ0aXRsZSBUaGUgYXBwbGljYXRpb24ncyBzdWJUaXRsZVxuXHQgKiBAcGFyYW0gc0ludGVudCBUaGUgaW50ZW50IHBhdGggdG8gYmUgcmVkaXJlY3RlZCB0b1xuXHQgKiBAcGFyYW0gaWNvbiBUaGUgYXBwbGljYXRpb24ncyBpY29uXG5cdCAqIEByZXR1cm5zIFRoZSB0aXRsZSBpbmZvcm1hdGlvblxuXHQgKi9cblx0X2NvbXB1dGVUaXRsZUluZm8odGl0bGU6IHN0cmluZywgc3VidGl0bGU6IHN0cmluZywgc0ludGVudDogc3RyaW5nLCBpY29uID0gXCJcIik6IFRpdGxlSW5mb3JtYXRpb24ge1xuXHRcdGNvbnN0IGFQYXJ0cyA9IHNJbnRlbnQuc3BsaXQoXCIvXCIpO1xuXHRcdGlmICghYVBhcnRzW2FQYXJ0cy5sZW5ndGggLSAxXS5pbmNsdWRlcyhcIj9cIikpIHtcblx0XHRcdHNJbnRlbnQgKz0gXCI/cmVzdG9yZUhpc3Rvcnk9dHJ1ZVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzSW50ZW50ICs9IFwiJnJlc3RvcmVIaXN0b3J5PXRydWVcIjtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRpdGxlOiB0aXRsZSxcblx0XHRcdHN1YnRpdGxlOiBzdWJ0aXRsZSxcblx0XHRcdGludGVudDogc0ludGVudCxcblx0XHRcdGljb246IGljb25cblx0XHR9O1xuXHR9XG5cblx0X2Zvcm1hdFRpdGxlKGRpc3BsYXlNb2RlOiBzdHJpbmcsIHRpdGxlVmFsdWU6IHN0cmluZywgdGl0bGVEZXNjcmlwdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRsZXQgZm9ybWF0dGVkVGl0bGUgPSBcIlwiO1xuXHRcdHN3aXRjaCAoZGlzcGxheU1vZGUpIHtcblx0XHRcdGNhc2UgXCJWYWx1ZVwiOlxuXHRcdFx0XHRmb3JtYXR0ZWRUaXRsZSA9IGAke3RpdGxlVmFsdWV9YDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiVmFsdWVEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRmb3JtYXR0ZWRUaXRsZSA9IGAke3RpdGxlVmFsdWV9ICgke3RpdGxlRGVzY3JpcHRpb259KWA7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uVmFsdWVcIjpcblx0XHRcdFx0Zm9ybWF0dGVkVGl0bGUgPSBgJHt0aXRsZURlc2NyaXB0aW9ufSAoJHt0aXRsZVZhbHVlfSlgO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRmb3JtYXR0ZWRUaXRsZSA9IGAke3RpdGxlRGVzY3JpcHRpb259YDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdH1cblx0XHRyZXR1cm4gZm9ybWF0dGVkVGl0bGU7XG5cdH1cblxuXHQvKipcblx0ICogRmV0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIEhlYWRlckluZm8gdGl0bGUgZm9yIGEgZ2l2ZW4gcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHNQYXRoIFRoZSBwYXRoIHRvIHRoZSBlbnRpdHlcblx0ICogQHJldHVybnMgQSBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIGZvcm1hdHRlZCB0aXRsZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vIEhlYWRlckluZm8gdGl0bGUgYW5ub3RhdGlvbiBpcyBhdmFpbGFibGVcblx0ICovXG5cdGFzeW5jIF9mZXRjaFRpdGxlVmFsdWUoc1BhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRvTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKSxcblx0XHRcdG9CaW5kaW5nVmlld0NvbnRleHQgPSBvTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc1BhdGgpLFxuXHRcdFx0c1ZhbHVlRXhwcmVzc2lvbiA9IEFubm90YXRpb25IZWxwZXIuZm9ybWF0KFxuXHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IZWFkZXJJbmZvL1RpdGxlL1ZhbHVlYCksXG5cdFx0XHRcdHsgY29udGV4dDogb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgfVxuXHRcdFx0KTtcblx0XHRpZiAoIXNWYWx1ZUV4cHJlc3Npb24pIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXCJcIik7XG5cdFx0fVxuXHRcdGNvbnN0IHNUZXh0RXhwcmVzc2lvbiA9IEFubm90YXRpb25IZWxwZXIuZm9ybWF0KFxuXHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChcblx0XHRcdFx0XHRgJHtzTWV0YVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IZWFkZXJJbmZvL1RpdGxlL1ZhbHVlLyRQYXRoQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0YFxuXHRcdFx0XHQpLFxuXHRcdFx0XHR7IGNvbnRleHQ6IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIH1cblx0XHRcdCksXG5cdFx0XHRvUHJvcGVydHlDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGVhZGVySW5mby9UaXRsZS9WYWx1ZS8kUGF0aEBgKSxcblx0XHRcdGFQcm9taXNlczogUHJvbWlzZTxzdHJpbmc+W10gPSBbXSxcblx0XHRcdG9WYWx1ZUV4cHJlc3Npb24gPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoc1ZhbHVlRXhwcmVzc2lvbiksXG5cdFx0XHRvUHJvbWlzZUZvckRpc3BsYXlNb2RlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkKSB7XG5cdFx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gQ29tbW9uVXRpbHMuY29tcHV0ZURpc3BsYXlNb2RlKG9Qcm9wZXJ0eUNvbnRleHQpO1xuXHRcdFx0XHRyZXNvbHZlKGRpc3BsYXlNb2RlKTtcblx0XHRcdH0pO1xuXHRcdGFQcm9taXNlcy5wdXNoKG9Qcm9taXNlRm9yRGlzcGxheU1vZGUpO1xuXHRcdGNvbnN0IHNWYWx1ZVBhdGggPSBvVmFsdWVFeHByZXNzaW9uLnBhcnRzID8gb1ZhbHVlRXhwcmVzc2lvbi5wYXJ0c1swXS5wYXRoIDogb1ZhbHVlRXhwcmVzc2lvbi5wYXRoLFxuXHRcdFx0Zm5WYWx1ZUZvcm1hdHRlciA9IG9WYWx1ZUV4cHJlc3Npb24uZm9ybWF0dGVyLFxuXHRcdFx0b1ZhbHVlQmluZGluZyA9IG9Nb2RlbC5iaW5kUHJvcGVydHkoc1ZhbHVlUGF0aCwgb0JpbmRpbmdWaWV3Q29udGV4dCwgeyAkJGdyb3VwSWQ6IFwiJGF1dG8uSGVyb2VzXCIgfSk7XG5cdFx0b1ZhbHVlQmluZGluZy5pbml0aWFsaXplKCk7XG5cdFx0Y29uc3Qgb1Byb21pc2VGb3JUaXRsZVZhbHVlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkKSB7XG5cdFx0XHRjb25zdCBmbkNoYW5nZSA9IGZ1bmN0aW9uIChvRXZlbnQ6IE9EYXRhUHJvcGVydHlCaW5kaW5nJENoYW5nZUV2ZW50KTogdm9pZCB7XG5cdFx0XHRcdGNvbnN0IHNUYXJnZXRWYWx1ZSA9IGZuVmFsdWVGb3JtYXR0ZXIgPyBmblZhbHVlRm9ybWF0dGVyKG9FdmVudC5nZXRTb3VyY2UoKS5nZXRWYWx1ZSgpKSA6IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRWYWx1ZSgpO1xuXG5cdFx0XHRcdG9WYWx1ZUJpbmRpbmcuZGV0YWNoQ2hhbmdlKGZuQ2hhbmdlKTtcblx0XHRcdFx0cmVzb2x2ZShzVGFyZ2V0VmFsdWUpO1xuXHRcdFx0fTtcblx0XHRcdG9WYWx1ZUJpbmRpbmcuYXR0YWNoQ2hhbmdlKGZuQ2hhbmdlKTtcblx0XHR9KTtcblx0XHRhUHJvbWlzZXMucHVzaChvUHJvbWlzZUZvclRpdGxlVmFsdWUpO1xuXG5cdFx0aWYgKHNUZXh0RXhwcmVzc2lvbikge1xuXHRcdFx0Y29uc3Qgb1RleHRFeHByZXNzaW9uID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKHNUZXh0RXhwcmVzc2lvbik7XG5cdFx0XHRsZXQgc1RleHRQYXRoID0gb1RleHRFeHByZXNzaW9uLnBhcnRzID8gb1RleHRFeHByZXNzaW9uLnBhcnRzWzBdLnBhdGggOiBvVGV4dEV4cHJlc3Npb24ucGF0aDtcblx0XHRcdHNUZXh0UGF0aCA9IHNWYWx1ZVBhdGgubGFzdEluZGV4T2YoXCIvXCIpID4gLTEgPyBgJHtzVmFsdWVQYXRoLnNsaWNlKDAsIHNWYWx1ZVBhdGgubGFzdEluZGV4T2YoXCIvXCIpKX0vJHtzVGV4dFBhdGh9YCA6IHNUZXh0UGF0aDtcblxuXHRcdFx0Y29uc3QgZm5UZXh0Rm9ybWF0dGVyID0gb1RleHRFeHByZXNzaW9uLmZvcm1hdHRlcixcblx0XHRcdFx0b1RleHRCaW5kaW5nID0gb01vZGVsLmJpbmRQcm9wZXJ0eShzVGV4dFBhdGgsIG9CaW5kaW5nVmlld0NvbnRleHQsIHsgJCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiIH0pO1xuXHRcdFx0b1RleHRCaW5kaW5nLmluaXRpYWxpemUoKTtcblx0XHRcdGNvbnN0IG9Qcm9taXNlRm9yVGl0bGVUZXh0ID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6IChkZXNjcmlwdGlvbjogc3RyaW5nKSA9PiB2b2lkKSB7XG5cdFx0XHRcdGNvbnN0IGZuQ2hhbmdlID0gZnVuY3Rpb24gKG9FdmVudDogT0RhdGFQcm9wZXJ0eUJpbmRpbmckQ2hhbmdlRXZlbnQpOiB2b2lkIHtcblx0XHRcdFx0XHRjb25zdCBzVGFyZ2V0VGV4dCA9IGZuVGV4dEZvcm1hdHRlciA/IGZuVGV4dEZvcm1hdHRlcihvRXZlbnQuZ2V0U291cmNlKCkuZ2V0VmFsdWUoKSkgOiBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0VmFsdWUoKTtcblxuXHRcdFx0XHRcdG9UZXh0QmluZGluZy5kZXRhY2hDaGFuZ2UoZm5DaGFuZ2UpO1xuXHRcdFx0XHRcdHJlc29sdmUoc1RhcmdldFRleHQpO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdG9UZXh0QmluZGluZy5hdHRhY2hDaGFuZ2UoZm5DaGFuZ2UpO1xuXHRcdFx0fSk7XG5cdFx0XHRhUHJvbWlzZXMucHVzaChvUHJvbWlzZUZvclRpdGxlVGV4dCk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB0aXRsZUluZm86IHN0cmluZ1tdID0gYXdhaXQgUHJvbWlzZS5hbGwoYVByb21pc2VzKTtcblx0XHRcdGxldCBmb3JtYXR0ZWRUaXRsZSA9IFwiXCI7XG5cdFx0XHRpZiAodHlwZW9mIHRpdGxlSW5mbyAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRmb3JtYXR0ZWRUaXRsZSA9IHRoaXMuX2Zvcm1hdFRpdGxlKHRpdGxlSW5mb1swXSwgdGl0bGVJbmZvWzFdLCB0aXRsZUluZm9bMl0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZvcm1hdHRlZFRpdGxlO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBmZXRjaGluZyB0aGUgdGl0bGUgZnJvbSB0aGUgaGVhZGVyIGluZm8gOlwiICsgZXJyb3IpO1xuXHRcdH1cblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiByZXR1cm5pbmcgdGhlIGRlY29kZWQgYXBwbGljYXRpb24tc3BlY2lmaWMgaGFzaC5cblx0ICpcblx0ICogQHJldHVybnMgRGVjb2RlZCBhcHBsaWNhdGlvbi1zcGVjaWZpYyBoYXNoXG5cdCAqL1xuXHRfZ2V0QXBwU3BlY2lmaWNIYXNoKCk6IHN0cmluZyB7XG5cdFx0Ly8gSGFzaENoYW5nZWQgaXNTaGVsbE5hdmlnYXRpb25IYXNoQ2hhbmdlclxuXHRcdGNvbnN0IGhhc2hDaGFuZ2VyID0gSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRyZXR1cm4gaGFzaENoYW5nZXIuaHJlZkZvckFwcFNwZWNpZmljSGFzaCA/IFVSSS5kZWNvZGUoaGFzaENoYW5nZXIuaHJlZkZvckFwcFNwZWNpZmljSGFzaChcIlwiKSkgOiBcIiMvXCI7XG5cdH1cblxuXHRfZ2V0SGFzaCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpLmdldEhhc2goKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGl0bGVJbmZvcm1hdGlvbiBmcm9tIGEgcGF0aC5cblx0ICogSXQgdXBkYXRlcyB0aGUgY2FjaGUgdG8gc3RvcmUgdGl0bGUgaW5mb3JtYXRpb24gaWYgbmVjZXNzYXJ5XG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gc1BhdGggcGF0aCBvZiB0aGUgY29udGV4dCB0byByZXRyaWV2ZSB0aXRsZSBpbmZvcm1hdGlvbiBmcm9tIE1ldGFNb2RlbFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gIG9UaXRsZWluZm9ybWF0aW9uIHJldHVybmVkIGFzIHByb21pc2Vcblx0ICovXG5cblx0YXN5bmMgZ2V0VGl0bGVJbmZvRnJvbVBhdGgoc1BhdGg6IHN0cmluZyk6IFByb21pc2U8VGl0bGVJbmZvcm1hdGlvbj4ge1xuXHRcdGNvbnN0IG9UaXRsZUhpZXJhcmNoeUNhY2hlID0gdGhpcy5fZ2V0VGl0bGVIaWVyYXJjaHlDYWNoZSgpO1xuXG5cdFx0aWYgKG9UaXRsZUhpZXJhcmNoeUNhY2hlW3NQYXRoXSkge1xuXHRcdFx0Ly8gVGhlIHRpdGxlIGluZm8gaXMgYWxyZWFkeSBzdG9yZWQgaW4gdGhlIGNhY2hlXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9UaXRsZUhpZXJhcmNoeUNhY2hlW3NQYXRoXSk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgc0VudGl0eVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKTtcblx0XHRjb25zdCBzVHlwZU5hbWUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm8vVHlwZU5hbWVgKTtcblx0XHRjb25zdCBzQXBwU3BlY2lmaWNIYXNoID0gdGhpcy5fZ2V0QXBwU3BlY2lmaWNIYXNoKCk7XG5cdFx0Y29uc3Qgc0ludGVudCA9IHNBcHBTcGVjaWZpY0hhc2ggKyBzUGF0aC5zbGljZSgxKTtcblx0XHRyZXR1cm4gdGhpcy5fZmV0Y2hUaXRsZVZhbHVlKHNQYXRoKS50aGVuKChzVGl0bGU6IHN0cmluZykgPT4ge1xuXHRcdFx0Y29uc3Qgb1RpdGxlSW5mbyA9IHRoaXMuX2NvbXB1dGVUaXRsZUluZm8oc1R5cGVOYW1lLCBzVGl0bGUsIHNJbnRlbnQpO1xuXHRcdFx0b1RpdGxlSGllcmFyY2h5Q2FjaGVbc1BhdGhdID0gb1RpdGxlSW5mbztcblx0XHRcdHJldHVybiBvVGl0bGVJbmZvO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVuc3VyZSB0aGF0IHRoZSB1c2hlbGwgc2VydmljZSByZWNlaXZlcyBhbGwgZWxlbWVudHNcblx0ICogKHRpdGxlLCBzdWJ0aXRsZSwgaW50ZW50LCBpY29uKSBhcyBzdHJpbmdzLlxuXHQgKlxuXHQgKiBBbm5vdGF0aW9uIEhlYWRlckluZm8gYWxsb3dzIGZvciBiaW5kaW5nIG9mIHRpdGxlIGFuZCBkZXNjcmlwdGlvblxuXHQgKiAod2hpY2ggYXJlIHVzZWQgaGVyZSBhcyB0aXRsZSBhbmQgc3VidGl0bGUpIHRvIGFueSBlbGVtZW50IGluIHRoZSBlbnRpdHlcblx0ICogKGJlaW5nIHBvc3NpYmx5IHR5cGVzIGxpa2UgYm9vbGVhbiwgdGltZXN0YW1wLCBkb3VibGUsIGV0Yy4pXG5cdCAqXG5cdCAqIENyZWF0ZXMgYSBuZXcgaGllcmFyY2h5IGFuZCBjb252ZXJ0cyBub24tc3RyaW5nIHR5cGVzIHRvIHN0cmluZy5cblx0ICpcblx0ICogQHBhcmFtIGFIaWVyYXJjaHkgU2hlbGwgdGl0bGUgaGllcmFyY2h5XG5cdCAqIEByZXR1cm5zIENvcHkgb2Ygc2hlbGwgdGl0bGUgaGllcmFyY2h5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGFzIHN0cmluZ3Ncblx0ICovXG5cdF9lbnN1cmVIaWVyYXJjaHlFbGVtZW50c0FyZVN0cmluZ3MoYUhpZXJhcmNoeTogVGl0bGVJbmZvcm1hdGlvbltdKTogb2JqZWN0W10ge1xuXHRcdGNvbnN0IGFIaWVyYXJjaHlTaGVsbCA9IFtdO1xuXHRcdGZvciAoY29uc3QgbGV2ZWwgaW4gYUhpZXJhcmNoeSkge1xuXHRcdFx0Y29uc3Qgb0hpZXJhcmNoeSA9IGFIaWVyYXJjaHlbbGV2ZWxdO1xuXHRcdFx0Y29uc3Qgb1NoZWxsSGllcmFyY2h5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBvSGllcmFyY2h5KSB7XG5cdFx0XHRcdG9TaGVsbEhpZXJhcmNoeVtrZXldID0gKFxuXHRcdFx0XHRcdHR5cGVvZiBvSGllcmFyY2h5W2tleSBhcyBrZXlvZiBUaXRsZUluZm9ybWF0aW9uXSAhPT0gXCJzdHJpbmdcIlxuXHRcdFx0XHRcdFx0PyBTdHJpbmcob0hpZXJhcmNoeVtrZXkgYXMga2V5b2YgVGl0bGVJbmZvcm1hdGlvbl0pXG5cdFx0XHRcdFx0XHQ6IG9IaWVyYXJjaHlba2V5IGFzIGtleW9mIFRpdGxlSW5mb3JtYXRpb25dXG5cdFx0XHRcdCkgYXMgc3RyaW5nO1xuXHRcdFx0fVxuXHRcdFx0YUhpZXJhcmNoeVNoZWxsLnB1c2gob1NoZWxsSGllcmFyY2h5KTtcblx0XHR9XG5cdFx0cmV0dXJuIGFIaWVyYXJjaHlTaGVsbDtcblx0fVxuXG5cdF9nZXRUYXJnZXRUeXBlRnJvbUhhc2goc0hhc2g6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0bGV0IHNUYXJnZXRUeXBlID0gXCJcIjtcblxuXHRcdGNvbnN0IGFSb3V0ZXMgPSBvQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0RW50cnkoXCJzYXAudWk1XCIpLnJvdXRpbmc/LnJvdXRlcyA/PyBbXTtcblx0XHRmb3IgKGNvbnN0IHJvdXRlIG9mIGFSb3V0ZXMpIHtcblx0XHRcdGNvbnN0IG9Sb3V0ZSA9IG9BcHBDb21wb25lbnQuZ2V0Um91dGVyKCkuZ2V0Um91dGUocm91dGUubmFtZSk7XG5cdFx0XHRpZiAob1JvdXRlPy5tYXRjaChzSGFzaCkpIHtcblx0XHRcdFx0Y29uc3Qgc1RhcmdldCA9IGdldFJvdXRlVGFyZ2V0TmFtZXMocm91dGUudGFyZ2V0KVswXTtcblx0XHRcdFx0c1RhcmdldFR5cGUgPSAob0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKS5nZXRUYXJnZXQoc1RhcmdldCkgYXMgdW5rbm93biBhcyB7IF9vT3B0aW9uczogeyBuYW1lOiBzdHJpbmcgfSB9KS5fb09wdGlvbnMubmFtZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNUYXJnZXRUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgc2hlbGwgdGl0bGUgYWZ0ZXIgZWFjaCBuYXZpZ2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gb1ZpZXcgVGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBtZW51IGlzIGZpbGxlZCBwcm9wZXJseVxuXHQgKi9cblx0YXN5bmMgX2NvbXB1dGVUaXRsZUhpZXJhcmNoeShvVmlldzogVmlldyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0b0NvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0b0N1cnJlbnRQYWdlID0gb1ZpZXcuZ2V0UGFyZW50KCksXG5cdFx0XHRhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzID0gW10sXG5cdFx0XHRzQXBwU3BlY2lmaWNIYXNoID0gdGhpcy5fZ2V0QXBwU3BlY2lmaWNIYXNoKCksXG5cdFx0XHRtYW5pZmVzdEFwcFNldHRpbmdzID0gb0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdEVudHJ5KFwic2FwLmFwcFwiKSxcblx0XHRcdHNBcHBUaXRsZSA9IG1hbmlmZXN0QXBwU2V0dGluZ3MudGl0bGUgfHwgXCJcIixcblx0XHRcdHNBcHBTdWJUaXRsZSA9IG1hbmlmZXN0QXBwU2V0dGluZ3Muc3ViVGl0bGUgfHwgXCJcIixcblx0XHRcdGFwcEljb24gPSBtYW5pZmVzdEFwcFNldHRpbmdzLmljb24gfHwgXCJcIjtcblx0XHRsZXQgb1BhZ2VUaXRsZUluZm9ybWF0aW9uOiBUaXRsZUluZm9ybWF0aW9uLCBzTmV3UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdFx0aWYgKG9DdXJyZW50UGFnZSAmJiAob0N1cnJlbnRQYWdlIGFzIFRlbXBsYXRlQ29tcG9uZW50KS5fZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24pIHtcblx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHQvLyBJZiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgYXBwbGljYXRpb24gaXMgYSBMUiwgdXNlIHRoZSB0aXRsZSBhbmQgc3VidGl0bGUgZnJvbSB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0aWYgKHRoaXMuX2dldFRhcmdldFR5cGVGcm9tSGFzaChcIlwiKSA9PT0gXCJzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnRcIikge1xuXHRcdFx0XHRcdGFUaXRsZUluZm9ybWF0aW9uUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRcdFByb21pc2UucmVzb2x2ZSh0aGlzLl9jb21wdXRlVGl0bGVJbmZvKHNBcHBUaXRsZSwgc0FwcFN1YlRpdGxlLCBzQXBwU3BlY2lmaWNIYXNoLCBhcHBJY29uKSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVGhlbiBtYW5hZ2Ugb3RoZXIgcGFnZXNcblx0XHRcdFx0c05ld1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRcdGNvbnN0IGFQYXRoUGFydHMgPSBzTmV3UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRcdGxldCBzUGF0aCA9IFwiXCI7XG5cblx0XHRcdFx0YVBhdGhQYXJ0cy5zaGlmdCgpOyAvLyBSZW1vdmUgdGhlIGZpcnN0IHNlZ21lbnQgKGVtcHR5IHN0cmluZykgYXMgaXQgaGFzIGJlZW4gbWFuYWdlZCBhYm92ZVxuXHRcdFx0XHRhUGF0aFBhcnRzLnBvcCgpOyAvLyBSZW1vdmUgdGhlIGxhc3Qgc2VnbWVudCBhcyBpdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBwYWdlIGFuZCBzaG91bGRuJ3QgYXBwZWFyIGluIHRoZSBtZW51XG5cblx0XHRcdFx0YVBhdGhQYXJ0cy5mb3JFYWNoKChzUGF0aFBhcnQ6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdHNQYXRoICs9IGAvJHtzUGF0aFBhcnR9YDtcblx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRcdHNQYXJhbWV0ZXJQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCksXG5cdFx0XHRcdFx0XHRiSXNQYXJhbWV0ZXJpemVkID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhcmFtZXRlclBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVzdWx0Q29udGV4dGApO1xuXHRcdFx0XHRcdGlmICghYklzUGFyYW1ldGVyaXplZCkge1xuXHRcdFx0XHRcdFx0YVRpdGxlSW5mb3JtYXRpb25Qcm9taXNlcy5wdXNoKHRoaXMuZ2V0VGl0bGVJbmZvRnJvbVBhdGgoc1BhdGgpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDdXJyZW50IHBhZ2Vcblx0XHRcdG9QYWdlVGl0bGVJbmZvcm1hdGlvbiA9IChvQ3VycmVudFBhZ2UgYXMgVGVtcGxhdGVDb21wb25lbnQpLl9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbigpO1xuXHRcdFx0b1BhZ2VUaXRsZUluZm9ybWF0aW9uID0gdGhpcy5fY29tcHV0ZVRpdGxlSW5mbyhcblx0XHRcdFx0b1BhZ2VUaXRsZUluZm9ybWF0aW9uLnRpdGxlID8/IFwiXCIsXG5cdFx0XHRcdG9QYWdlVGl0bGVJbmZvcm1hdGlvbi5zdWJ0aXRsZSA/PyBcIlwiLFxuXHRcdFx0XHRzQXBwU3BlY2lmaWNIYXNoICsgdGhpcy5fZ2V0SGFzaCgpXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAob0NvbnRleHQgJiYgc05ld1BhdGgpIHtcblx0XHRcdFx0dGhpcy5fZ2V0VGl0bGVIaWVyYXJjaHlDYWNoZSgpW3NOZXdQYXRoXSA9IG9QYWdlVGl0bGVJbmZvcm1hdGlvbjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX2dldFRpdGxlSGllcmFyY2h5Q2FjaGUoKVtzQXBwU3BlY2lmaWNIYXNoXSA9IG9QYWdlVGl0bGVJbmZvcm1hdGlvbjtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YVRpdGxlSW5mb3JtYXRpb25Qcm9taXNlcy5wdXNoKFByb21pc2UucmVqZWN0KFwiVGl0bGUgaW5mb3JtYXRpb24gbWlzc2luZyBpbiBIZWFkZXJJbmZvXCIpKTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKGFUaXRsZUluZm9ybWF0aW9uUHJvbWlzZXMpXG5cdFx0XHQudGhlbigoYVRpdGxlSW5mb0hpZXJhcmNoeTogVGl0bGVJbmZvcm1hdGlvbltdKTogdm9pZCA9PiB7XG5cdFx0XHRcdC8vIHdvcmthcm91bmQgZm9yIHNoZWxsIHdoaWNoIGlzIGV4cGVjdGluZyBhbGwgZWxlbWVudHMgYmVpbmcgb2YgdHlwZSBzdHJpbmdcblx0XHRcdFx0Y29uc3QgYVRpdGxlSW5mb0hpZXJhcmNoeVNoZWxsID0gdGhpcy5fZW5zdXJlSGllcmFyY2h5RWxlbWVudHNBcmVTdHJpbmdzKGFUaXRsZUluZm9IaWVyYXJjaHkpLFxuXHRcdFx0XHRcdHNUaXRsZSA9IG9QYWdlVGl0bGVJbmZvcm1hdGlvbi50aXRsZSA/PyBcIlwiO1xuXHRcdFx0XHRhVGl0bGVJbmZvSGllcmFyY2h5U2hlbGwucmV2ZXJzZSgpO1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRIaWVyYXJjaHkoYVRpdGxlSW5mb0hpZXJhcmNoeVNoZWxsKTtcblxuXHRcdFx0XHR0aGlzLl9zZXRTaGVsbE1lbnVUaXRsZShvQXBwQ29tcG9uZW50LCBzVGl0bGUsIHNBcHBUaXRsZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKHNFcnJvck1lc3NhZ2U6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKHNFcnJvck1lc3NhZ2UgYXMgc3RyaW5nKTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuYklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeSA9IGZhbHNlO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoc0Vycm9yTWVzc2FnZTogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3Ioc0Vycm9yTWVzc2FnZSBhcyBzdHJpbmcpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGNhbGN1bGF0ZUxheW91dChpTmV4dEZDTExldmVsOiBudW1iZXIsIHNIYXNoOiBzdHJpbmcsIHNQcm9wb3NlZExheW91dDogc3RyaW5nIHwgdW5kZWZpbmVkLCBrZWVwQ3VycmVudExheW91dCA9IGZhbHNlKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsYmFjayBhZnRlciBhIHZpZXcgaGFzIGJlZW4gYm91bmQgdG8gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBoYXMgYmVlbiBib3VuZCB0byBhIHZpZXdcblx0ICovXG5cdG9uQ29udGV4dEJvdW5kVG9WaWV3KG9Db250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkIHwgbnVsbCk6IHZvaWQge1xuXHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0Y29uc3Qgc0RlZXBlc3RQYXRoID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKS5nZXRQcm9wZXJ0eShcIi9kZWVwZXN0UGF0aFwiKSxcblx0XHRcdFx0c1ZpZXdDb250ZXh0UGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblxuXHRcdFx0aWYgKCFzRGVlcGVzdFBhdGggfHwgc0RlZXBlc3RQYXRoLmluZGV4T2Yoc1ZpZXdDb250ZXh0UGF0aCkgIT09IDApIHtcblx0XHRcdFx0Ly8gVGhlcmUgd2FzIG5vIHByZXZpb3VzIHZhbHVlIGZvciB0aGUgZGVlcGVzdCByZWFjaGVkIHBhdGgsIG9yIHRoZSBwYXRoXG5cdFx0XHRcdC8vIGZvciB0aGUgdmlldyBpc24ndCBhIHN1YnBhdGggb2YgdGhlIHByZXZpb3VzIGRlZXBlc3QgcGF0aCAtLT4gdXBkYXRlXG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikuc2V0UHJvcGVydHkoXCIvZGVlcGVzdFBhdGhcIiwgc1ZpZXdDb250ZXh0UGF0aCwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRhc3luYyBkaXNwbGF5RXJyb3JQYWdlKF9lcnJvck1lc3NhZ2U6IHN0cmluZywgX3BhcmFtZXRlcnM6IE5hdmlnYXRpb25Ub0Vycm9yUGFnZVJlc3VsdCwgX0ZDTExldmVsID0gMCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdC8vIFRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHR1cGRhdGVVSVN0YXRlRm9yVmlldyhvVmlldzogRkVWaWV3LCBGQ0xMZXZlbDogbnVtYmVyKTogdm9pZCB7XG5cdFx0Ly8gVG8gYmUgb3ZlcnJpZGVuXG5cdH1cblxuXHRnZXRJbnN0YW5jZWRWaWV3cygpOiBWaWV3W10ge1xuXHRcdHJldHVybiBbXTtcblx0XHQvLyBUbyBiZSBvdmVycmlkZW5cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm4gYWxsIHZpc2libGUgdmlld3MuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSB2aXNpYmxlIHZpZXdzXG5cdCAqL1xuXHRnZXRWaXNpYmxlVmlld3MoKTogVmlld1tdIHtcblx0XHRyZXR1cm4gW107XG5cdFx0Ly8gVG8gYmUgb3ZlcnJpZGVuXG5cdH1cblxuXHRfc2Nyb2xsVGFibGVzVG9MYXN0TmF2aWdhdGVkSXRlbXMoKTogdm9pZCB7XG5cdFx0Ly8gVG8gYmUgb3ZlcnJpZGVuXG5cdH1cblxuXHRpc0ZjbEVuYWJsZWQoKTogdGhpcyBpcyBGY2xDb250cm9sbGVyIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdF9zZXRTaGVsbE1lbnVUaXRsZShvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIHNUaXRsZTogc3RyaW5nLCBzQXBwVGl0bGU6IHN0cmluZyk6IHZvaWQge1xuXHRcdC8vIFRvIGJlIG92ZXJyaWRlbiBieSBGY2xDb250cm9sbGVyXG5cdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0VGl0bGUoc1RpdGxlKTtcblx0fVxuXG5cdGdldEFwcENvbnRlbnRDb250YWluZXIoKTogTmF2Q29udGFpbmVyIHwgRmxleGlibGVDb2x1bW5MYXlvdXQge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IGFwcENvbnRlbnRJZCA9IG9BcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC51aTVcIikucm91dGluZz8uY29uZmlnPy5jb250cm9sSWQgPz8gXCJhcHBDb250ZW50XCI7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmJ5SWQoYXBwQ29udGVudElkKSBhcyBOYXZDb250YWluZXIgfCBGbGV4aWJsZUNvbHVtbkxheW91dDtcblx0fVxufVxuaW50ZXJmYWNlIFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIge1xuXHRvbkNvbnRhaW5lclJlYWR5PygpOiB2b2lkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBSb290Vmlld0Jhc2VDb250cm9sbGVyO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7OztNQXlDTUEsc0JBQXNCLFdBRDNCQyxjQUFjLENBQUMsNkNBQTZDLENBQUMsVUFFNURDLGNBQWMsQ0FBQ0MsV0FBVyxDQUFDLFVBRzNCRCxjQUFjLENBQUNFLFNBQVMsQ0FBQztJQUFBO0lBQUE7TUFBQTtNQUFBO1FBQUE7TUFBQTtNQUFBO01BQUE7TUFBQTtNQUFBLE1BV2xCQyx5QkFBeUIsR0FBRyxLQUFLO01BQUE7SUFBQTtJQUFBO0lBQUEsT0FFekNDLE1BQU0sR0FBTixrQkFBZTtNQUNkQyxVQUFVLENBQUNDLElBQUksRUFBRTtNQUVqQixJQUFJLENBQUNDLGNBQWMsR0FBRyxFQUFFO0lBQ3pCLENBQUM7SUFBQSxPQUVEQyxjQUFjLEdBQWQsMEJBQThCO01BQzdCLE9BQU8sSUFBSSxDQUFDQyxZQUFZO0lBQ3pCLENBQUM7SUFBQSxPQUVEQyxtQkFBbUIsR0FBbkIsK0JBQTRCO01BQzNCLElBQUksQ0FBQ0QsWUFBWSxDQUFDQyxtQkFBbUIsRUFBRTtNQUN2QyxJQUFJLENBQUNDLGVBQWUsRUFBRSxDQUFDQyxpQkFBaUIsRUFB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
590
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSb290Vmlld0Jhc2VDb250cm9sbGVyIiwiZGVmaW5lVUk1Q2xhc3MiLCJ1c2luZ0V4dGVuc2lvbiIsIlBsYWNlaG9sZGVyIiwiVmlld1N0YXRlIiwiYklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeSIsIm9uSW5pdCIsIlNpemVIZWxwZXIiLCJpbml0IiwiX2FIZWxwZXJNb2RlbHMiLCJnZXRQbGFjZWhvbGRlciIsIm9QbGFjZWhvbGRlciIsImF0dGFjaFJvdXRlTWF0Y2hlcnMiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRSb3V0aW5nU2VydmljZSIsImF0dGFjaEFmdGVyUm91dGVNYXRjaGVkIiwiX29uQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJvbkV4aXQiLCJkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsIm9Sb3V0ZXIiLCJ1bmRlZmluZWQiLCJleGl0IiwiZm9yRWFjaCIsIm9Nb2RlbCIsImRlc3Ryb3kiLCJnZXRWaWV3RnJvbUNvbnRhaW5lciIsImNvbnRhaW5lciIsInJlc3VsdCIsImlzQSIsImdldENvbXBvbmVudEluc3RhbmNlIiwiZ2V0Um9vdENvbnRyb2wiLCJnZXRWaWV3c0Zyb21QYWdlcyIsInBhZ2VzIiwidmlld3MiLCJwYWdlIiwidmlldyIsInB1c2giLCJnZXRSZXNvdXJjZUJ1bmRsZSIsImdldE93bmVyQ29tcG9uZW50IiwiZ2V0TW9kZWwiLCJnZXRSb3V0ZXIiLCJfY3JlYXRlSGVscGVyTW9kZWwiLCJKU09OTW9kZWwiLCJyb3V0aW5nSXNDb21wbGV0ZSIsIl9vUm91dGVNYXRjaGVkUHJvbWlzZSIsIlByb21pc2UiLCJyZXNvbHZlIiwid2FpdEZvclJpZ2h0TW9zdFZpZXdSZWFkeSIsIm9FdmVudCIsImFDb250YWluZXJzIiwiZ2V0UGFyYW1ldGVyIiwiYUZFQ29udGFpbmVycyIsIm9Db250YWluZXIiLCJvVmlldyIsIm9Db21wb25lbnRJbnN0YW5jZSIsImdldENvbnRyb2xsZXIiLCJwYWdlUmVhZHkiLCJvUmlnaHRNb3N0RkVWaWV3IiwibGVuZ3RoIiwiaXNQYWdlUmVhZHkiLCJhdHRhY2hFdmVudE9uY2UiLCJyZXN0b3JlRm9jdXNGcm9tSGlzdG9yeSIsImhpc3RvcnkiLCJzdGF0ZSIsImZvY3VzSW5mbyIsInR5cGUiLCJ0YWJsZSIsIkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsInRhYmxlSWQiLCJwb3MiLCJnZXRSb3dCaW5kaW5nIiwiZ2V0Q3VycmVudENvbnRleHRzIiwiZmluZEluZGV4IiwiY29udGV4dCIsImdldFBhdGgiLCJjb250ZXh0UGF0aEZvY3VzIiwiZm9jdXNSb3ciLCJjb250cm9sSWQiLCJmb2N1cyIsInJlcGxhY2VTdGF0ZSIsIk9iamVjdCIsImFzc2lnbiIsInRoZW4iLCJvUm9vdENvbnRyb2wiLCJnZXRWaWV3IiwiZ2V0Q29udGVudCIsImdldEF1dG9Gb2N1cyIsInNldFByb3BlcnR5Iiwib0FwcENvbXBvbmVudCIsIl9zY3JvbGxUYWJsZXNUb0xhc3ROYXZpZ2F0ZWRJdGVtcyIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiVVNoZWxsIiwiY29tcHV0ZVRpdGxlSGllcmFyY2h5IiwiYkZvcmNlRm9jdXMiLCJnZXRSb3V0ZXJQcm94eSIsImlzRm9jdXNGb3JjZWQiLCJzZXRGb2N1c0ZvcmNlZCIsIm9uUGFnZVJlYWR5IiwiZ2V0UGFyZW50IiwiZm9yY2VGb2N1cyIsInJlc3RvcmVGb2N1c0ZvckN1cnJlbnRIYXNoIiwib25Db250YWluZXJSZWFkeSIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJmaW5hbGx5IiwiX2dldFRpdGxlSGllcmFyY2h5Q2FjaGUiLCJvVGl0bGVIaWVyYXJjaHlDYWNoZSIsIl9jb21wdXRlVGl0bGVJbmZvIiwidGl0bGUiLCJzdWJ0aXRsZSIsInNJbnRlbnQiLCJpY29uIiwiYVBhcnRzIiwic3BsaXQiLCJpbmNsdWRlcyIsImludGVudCIsIl9mb3JtYXRUaXRsZSIsImRpc3BsYXlNb2RlIiwidGl0bGVWYWx1ZSIsInRpdGxlRGVzY3JpcHRpb24iLCJmb3JtYXR0ZWRUaXRsZSIsIl9mZXRjaFRpdGxlVmFsdWUiLCJwYXRoIiwiYXBwQ29tcG9uZW50IiwibW9kZWwiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJtZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiYmluZGluZ1ZpZXdDb250ZXh0IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJoZWFkZXJJbmZvVGl0bGVWYWx1ZUFubm90YXRpb24iLCJnZXRPYmplY3QiLCJ2YWx1ZUV4cHJlc3Npb24iLCJBbm5vdGF0aW9uSGVscGVyIiwiZm9ybWF0IiwiJEZ1bmN0aW9uIiwiYW55T2JqZWN0IiwiQW55IiwiYW55Iiwic2V0TW9kZWwiLCJzZXRCaW5kaW5nQ29udGV4dCIsInRleHRCaW5kaW5nIiwiZ2V0QmluZGluZyIsImFsbCIsImdldEJpbmRpbmdzIiwibWFwIiwiYmluZGluZyIsInJlcXVlc3RWYWx1ZSIsImluZm9UaXRsZSIsImdldEFueSIsInRleHRFeHByZXNzaW9uIiwicHJvcGVydHlDb250ZXh0IiwicHJvbWlzZXMiLCJwYXJzZWR2YWx1ZUV4cHJlc3Npb24iLCJCaW5kaW5nUGFyc2VyIiwiY29tcGxleFBhcnNlciIsInByb21pc2VGb3JEaXNwbGF5TW9kZSIsIkNvbW1vblV0aWxzIiwiY29tcHV0ZURpc3BsYXlNb2RlIiwidmFsdWVQYXRoIiwicGFydHMiLCJmblZhbHVlRm9ybWF0dGVyIiwiZm9ybWF0dGVyIiwidmFsdWVCaW5kaW5nIiwiYmluZFByb3BlcnR5IiwiJCRncm91cElkIiwiaW5pdGlhbGl6ZSIsInByb21pc2VGb3JUaXRsZVZhbHVlIiwiZm5DaGFuZ2UiLCJldmVudCIsInRhcmdldFZhbHVlIiwiZ2V0U291cmNlIiwiZ2V0VmFsdWUiLCJkZXRhY2hDaGFuZ2UiLCJhdHRhY2hDaGFuZ2UiLCJwYXJzZWRUZXh0RXhwcmVzc2lvbiIsInRleHRQYXRoIiwibGFzdEluZGV4T2YiLCJzbGljZSIsImZuVGV4dEZvcm1hdHRlciIsInByb21pc2VGb3JUaXRsZVRleHQiLCJ0YXJnZXRUZXh0IiwidGl0bGVJbmZvIiwiZ2V0QXBwU3BlY2lmaWNIYXNoIiwiaGFzaENoYW5nZXIiLCJIYXNoQ2hhbmdlciIsImdldEluc3RhbmNlIiwiaHJlZkZvckFwcFNwZWNpZmljSGFzaCIsIlVSSSIsImRlY29kZSIsIl9nZXRIYXNoIiwiZ2V0SGFzaCIsImdldFRpdGxlSW5mb0Zyb21QYXRoIiwic1BhdGgiLCJvTWV0YU1vZGVsIiwic0VudGl0eVBhdGgiLCJzVHlwZU5hbWUiLCJzQXBwU3BlY2lmaWNIYXNoIiwic1RpdGxlIiwib1RpdGxlSW5mbyIsIl9lbnN1cmVIaWVyYXJjaHlFbGVtZW50c0FyZVN0cmluZ3MiLCJhSGllcmFyY2h5IiwiYUhpZXJhcmNoeVNoZWxsIiwibGV2ZWwiLCJvSGllcmFyY2h5Iiwib1NoZWxsSGllcmFyY2h5Iiwia2V5IiwiU3RyaW5nIiwiX2dldFRhcmdldFR5cGVGcm9tSGFzaCIsInNIYXNoIiwic1RhcmdldFR5cGUiLCJhUm91dGVzIiwiZ2V0TWFuaWZlc3RFbnRyeSIsInJvdXRpbmciLCJyb3V0ZXMiLCJyb3V0ZSIsIm9Sb3V0ZSIsImdldFJvdXRlIiwibmFtZSIsIm1hdGNoIiwic1RhcmdldCIsImdldFJvdXRlVGFyZ2V0TmFtZXMiLCJ0YXJnZXQiLCJnZXRUYXJnZXQiLCJfb09wdGlvbnMiLCJnZXRCaW5kaW5nQ29udGV4dCIsImN1cnJlbnRQYWdlIiwidGl0bGVJbmZvcm1hdGlvblByb21pc2VzIiwiYXBwU3BlY2lmaWNIYXNoIiwibWFuaWZlc3RBcHBTZXR0aW5ncyIsImFwcFRpdGxlIiwiYXBwU3ViVGl0bGUiLCJzdWJUaXRsZSIsImFwcEljb24iLCJwYWdlVGl0bGVJbmZvcm1hdGlvbiIsIm5ld1BhdGgiLCJfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24iLCJwYXRoUGFydHMiLCJzaGlmdCIsInBvcCIsInBhdGhQYXJ0IiwiZ2V0Um91dGVJbmZvQnlIYXNoIiwicGFyYW1ldGVyUGF0aCIsImlzUGFyYW1ldGVyaXplZCIsInJlamVjdCIsInRpdGxlSW5mb0hpZXJhcmNoeSIsInRpdGxlSW5mb0hpZXJhcmNoeVNoZWxsIiwicmV2ZXJzZSIsImdldFNoZWxsU2VydmljZXMiLCJzZXRIaWVyYXJjaHkiLCJfc2V0U2hlbGxNZW51VGl0bGUiLCJlcnJvck1lc3NhZ2UiLCJjYWxjdWxhdGVMYXlvdXQiLCJpTmV4dEZDTExldmVsIiwic1Byb3Bvc2VkTGF5b3V0Iiwia2VlcEN1cnJlbnRMYXlvdXQiLCJvbkNvbnRleHRCb3VuZFRvVmlldyIsIm9Db250ZXh0Iiwic0RlZXBlc3RQYXRoIiwiZ2V0UHJvcGVydHkiLCJzVmlld0NvbnRleHRQYXRoIiwiaW5kZXhPZiIsImRpc3BsYXlFcnJvclBhZ2UiLCJfZXJyb3JNZXNzYWdlIiwiX3BhcmFtZXRlcnMiLCJfRkNMTGV2ZWwiLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsIkZDTExldmVsIiwiZ2V0SW5zdGFuY2VkVmlld3MiLCJnZXRWaXNpYmxlVmlld3MiLCJpc0ZjbEVuYWJsZWQiLCJzQXBwVGl0bGUiLCJzZXRUaXRsZSIsImdldEFwcENvbnRlbnRDb250YWluZXIiLCJhcHBDb250ZW50SWQiLCJjb25maWciLCJieUlkIiwiQmFzZUNvbnRyb2xsZXIiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlJvb3RWaWV3QmFzZUNvbnRyb2xsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IHR5cGUgRmxleGlibGVDb2x1bW5MYXlvdXQgZnJvbSBcInNhcC9mL0ZsZXhpYmxlQ29sdW1uTGF5b3V0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgdXNpbmdFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IEJhc2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCB7IHR5cGUgTmF2aWdhdGlvblRvRXJyb3JQYWdlUmVzdWx0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgUGxhY2Vob2xkZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BsYWNlaG9sZGVyXCI7XG5pbXBvcnQgVmlld1N0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCB7IGdldFJvdXRlVGFyZ2V0TmFtZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9NYW5pZmVzdEhlbHBlclwiO1xuaW1wb3J0IFNpemVIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2l6ZUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgRmNsQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvcm9vdFZpZXcvRmNsLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIE5hdkNvbnRhaW5lciBmcm9tIFwic2FwL20vTmF2Q29udGFpbmVyXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IHR5cGUgQ29tcG9uZW50Q29udGFpbmVyIGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRDb250YWluZXJcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IEhhc2hDaGFuZ2VyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL0hhc2hDaGFuZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRlJE1hdGNoZWRFdmVudCB9IGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL1JvdXRlXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ29tcG9zaXRlQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0NvbXBvc2l0ZUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBBbm5vdGF0aW9uSGVscGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQW5ub3RhdGlvbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBPRGF0YVByb3BlcnR5QmluZGluZyRDaGFuZ2VFdmVudCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgVVJJIGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9VUklcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwiLi4vQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQW55IGZyb20gXCIuLi9jb250cm9scy9BbnlcIjtcblxuZXhwb3J0IHR5cGUgVGl0bGVJbmZvcm1hdGlvbiA9IHtcblx0dGl0bGU/OiBzdHJpbmc7XG5cdHN1YnRpdGxlPzogc3RyaW5nO1xuXHRpY29uPzogc3RyaW5nO1xuXHRpbnRlbnQ/OiBzdHJpbmc7XG59O1xuXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5yb290Vmlldy5Sb290Vmlld0Jhc2VDb250cm9sbGVyXCIpXG5jbGFzcyBSb290Vmlld0Jhc2VDb250cm9sbGVyIGV4dGVuZHMgQmFzZUNvbnRyb2xsZXIge1xuXHRAdXNpbmdFeHRlbnNpb24oUGxhY2Vob2xkZXIpXG5cdG9QbGFjZWhvbGRlciE6IFBsYWNlaG9sZGVyO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihWaWV3U3RhdGUpXG5cdHZpZXdTdGF0ZSE6IFZpZXdTdGF0ZTtcblxuXHRwcml2YXRlIF9hSGVscGVyTW9kZWxzITogSlNPTk1vZGVsW107XG5cblx0cHJpdmF0ZSBvUm91dGVyPzogUm91dGVyO1xuXG5cdHByaXZhdGUgX29Sb3V0ZU1hdGNoZWRQcm9taXNlPzogUHJvbWlzZTx2b2lkPjtcblxuXHRwcml2YXRlIG9UaXRsZUhpZXJhcmNoeUNhY2hlPzogUmVjb3JkPHN0cmluZywgVGl0bGVJbmZvcm1hdGlvbj47XG5cblx0cHJpdmF0ZSBiSXNDb21wdXRpbmdUaXRsZUhpZXJhY2h5ID0gZmFsc2U7XG5cblx0b25Jbml0KCk6IHZvaWQge1xuXHRcdFNpemVIZWxwZXIuaW5pdCgpO1xuXG5cdFx0dGhpcy5fYUhlbHBlck1vZGVscyA9IFtdO1xuXHR9XG5cblx0Z2V0UGxhY2Vob2xkZXIoKTogUGxhY2Vob2xkZXIge1xuXHRcdHJldHVybiB0aGlzLm9QbGFjZWhvbGRlcjtcblx0fVxuXG5cdGF0dGFjaFJvdXRlTWF0Y2hlcnMoKTogdm9pZCB7XG5cdFx0dGhpcy5vUGxhY2Vob2xkZXIuYXR0YWNoUm91dGVNYXRjaGVycygpO1xuXHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGluZ1NlcnZpY2UoKS5hdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCh7fSwgdGhpcy5fb25BZnRlclJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdH1cblxuXHRvbkV4aXQoKTogdm9pZCB7XG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmRldGFjaEFmdGVyUm91dGVNYXRjaGVkKHRoaXMuX29uQWZ0ZXJSb3V0ZU1hdGNoZWQsIHRoaXMpO1xuXHRcdHRoaXMub1JvdXRlciA9IHVuZGVmaW5lZDtcblxuXHRcdFNpemVIZWxwZXIuZXhpdCgpO1xuXG5cdFx0Ly8gRGVzdHJveSBhbGwgSlNPTiBtb2RlbHMgY3JlYXRlZCBkeW5hbWljYWxseSBmb3IgdGhlIHZpZXdzXG5cdFx0dGhpcy5fYUhlbHBlck1vZGVscy5mb3JFYWNoKGZ1bmN0aW9uIChvTW9kZWw6IEpTT05Nb2RlbCkge1xuXHRcdFx0b01vZGVsLmRlc3Ryb3koKTtcblx0XHR9KTtcblx0fVxuXG5cdHByb3RlY3RlZCBnZXRWaWV3RnJvbUNvbnRhaW5lcihjb250YWluZXI6IENvbnRyb2wpOiBWaWV3IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCByZXN1bHQgPSBjb250YWluZXIuaXNBPENvbXBvbmVudENvbnRhaW5lcj4oXCJzYXAudWkuY29yZS5Db21wb25lbnRDb250YWluZXJcIilcblx0XHRcdD8gY29udGFpbmVyLmdldENvbXBvbmVudEluc3RhbmNlKCkuZ2V0Um9vdENvbnRyb2woKVxuXHRcdFx0OiBjb250YWluZXI7XG5cblx0XHRyZXR1cm4gcmVzdWx0Py5pc0E8Vmlldz4oXCJzYXAudWkuY29yZS5tdmMuVmlld1wiKSA/IHJlc3VsdCA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBBbmFseXplIHRoZSBwYWdlcyBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHZpZXdzLlxuXHQgKlxuXHQgKiBAcGFyYW0gcGFnZXMgVGhlIHBhZ2VzIHRvIGJlIGFuYWx5emVkLlxuXHQgKiBAcmV0dXJucyBUaGUgdmlld3Ncblx0ICovXG5cdHByb3RlY3RlZCBnZXRWaWV3c0Zyb21QYWdlcyhwYWdlczogQ29udHJvbFtdKTogVmlld1tdIHtcblx0XHRjb25zdCB2aWV3czogVmlld1tdID0gW107XG5cblx0XHRwYWdlcy5mb3JFYWNoKChwYWdlKSA9PiB7XG5cdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3RnJvbUNvbnRhaW5lcihwYWdlKTtcblxuXHRcdFx0aWYgKHZpZXcgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR2aWV3cy5wdXNoKHZpZXcpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHZpZXdzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgcmVzb3VyY2UgYnVuZGxlLlxuXHQgKlxuXHQgKiBAcHVibGljXG5cdCAqIEByZXR1cm5zIFRoZSByZXNvdXJjZU1vZGVsIG9mIHRoZSBjb21wb25lbnRcblx0ICovXG5cdGdldFJlc291cmNlQnVuZGxlKCk6IFJlc291cmNlQnVuZGxlIHwgUHJvbWlzZTxSZXNvdXJjZUJ1bmRsZT4ge1xuXHRcdHJldHVybiAodGhpcy5nZXRPd25lckNvbXBvbmVudCgpLmdldE1vZGVsKFwiaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpO1xuXHR9XG5cblx0Z2V0Um91dGVyKCk6IFJvdXRlciB7XG5cdFx0aWYgKCF0aGlzLm9Sb3V0ZXIpIHtcblx0XHRcdHRoaXMub1JvdXRlciA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMub1JvdXRlcjtcblx0fVxuXG5cdF9jcmVhdGVIZWxwZXJNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdC8vIFdlIGtlZXAgYSByZWZlcmVuY2Ugb24gdGhlIG1vZGVscyBjcmVhdGVkIGR5bmFtaWNhbGx5LCBhcyB0aGV5IGRvbid0IGdldCBkZXN0cm95ZWRcblx0XHQvLyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHZpZXcgaXMgZGVzdHJveWVkLlxuXHRcdC8vIFRoaXMgaXMgZG9uZSBkdXJpbmcgb25FeGl0XG5cdFx0Y29uc3Qgb01vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdHRoaXMuX2FIZWxwZXJNb2RlbHMucHVzaChvTW9kZWwpO1xuXG5cdFx0cmV0dXJuIG9Nb2RlbDtcblx0fVxuXG5cdGFzeW5jIHJvdXRpbmdJc0NvbXBsZXRlKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGF3YWl0ICh0aGlzLl9vUm91dGVNYXRjaGVkUHJvbWlzZSB8fCBQcm9taXNlLnJlc29sdmUoKSk7XG5cdH1cblxuXHQvKipcblx0ICogRnVuY3Rpb24gd2FpdGluZyBmb3IgdGhlIFJpZ2h0IG1vc3QgdmlldyB0byBiZSByZWFkeS5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudCBSZWZlcmVuY2UgYW4gRXZlbnQgcGFyYW1ldGVyIGNvbWluZyBmcm9tIHJvdXRlTWF0Y2hlZCBldmVudFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgaW5kaWNhdGluZyB3aGVuIHRoZSByaWdodCBtb3N0IHZpZXcgaXMgcmVhZHlcblx0ICovXG5cdGFzeW5jIHdhaXRGb3JSaWdodE1vc3RWaWV3UmVhZHkob0V2ZW50OiBSb3V0ZSRNYXRjaGVkRXZlbnQpOiBQcm9taXNlPEZFVmlldz4ge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBGRVZpZXcpID0+IHZvaWQpIHtcblx0XHRcdGNvbnN0IGFDb250YWluZXJzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInZpZXdzXCIpID8/IFtdLFxuXHRcdFx0XHQvLyBUaGVyZSBjYW4gYWxzbyBiZSByZXVzZSBjb21wb25lbnRzIGluIHRoZSB2aWV3LCByZW1vdmUgdGhlbSBiZWZvcmUgcHJvY2Vzc2luZy5cblx0XHRcdFx0YUZFQ29udGFpbmVyczogRkVWaWV3W10gPSBbXTtcblx0XHRcdGFDb250YWluZXJzLmZvckVhY2goZnVuY3Rpb24gKG9Db250YWluZXI6IFZpZXcgfCBDb21wb25lbnRDb250YWluZXIgfCB1bmRlZmluZWQpIHtcblx0XHRcdFx0bGV0IG9WaWV3ID0gb0NvbnRhaW5lciBhcyBGRVZpZXcgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChvQ29udGFpbmVyICYmIChvQ29udGFpbmVyIGFzIENvbXBvbmVudENvbnRhaW5lcikuZ2V0Q29tcG9uZW50SW5zdGFuY2UpIHtcblx0XHRcdFx0XHRjb25zdCBvQ29tcG9uZW50SW5zdGFuY2UgPSAob0NvbnRhaW5lciBhcyBDb21wb25lbnRDb250YWluZXIpLmdldENvbXBvbmVudEluc3RhbmNlKCk7XG5cdFx0XHRcdFx0b1ZpZXcgPSBvQ29tcG9uZW50SW5zdGFuY2UuZ2V0Um9vdENvbnRyb2woKSBhcyBGRVZpZXc7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9WaWV3ICYmIG9WaWV3LmdldENvbnRyb2xsZXIoKSAmJiBvVmlldy5nZXRDb250cm9sbGVyKCkucGFnZVJlYWR5KSB7XG5cdFx0XHRcdFx0YUZFQ29udGFpbmVycy5wdXNoKG9WaWV3KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBvUmlnaHRNb3N0RkVWaWV3ID0gYUZFQ29udGFpbmVyc1thRkVDb250YWluZXJzLmxlbmd0aCAtIDFdO1xuXHRcdFx0aWYgKG9SaWdodE1vc3RGRVZpZXcgJiYgb1JpZ2h0TW9zdEZFVmlldy5nZXRDb250cm9sbGVyKCkucGFnZVJlYWR5LmlzUGFnZVJlYWR5KCkpIHtcblx0XHRcdFx0cmVzb2x2ZShvUmlnaHRNb3N0RkVWaWV3KTtcblx0XHRcdH0gZWxzZSBpZiAob1JpZ2h0TW9zdEZFVmlldykge1xuXHRcdFx0XHRvUmlnaHRNb3N0RkVWaWV3LmdldENvbnRyb2xsZXIoKS5wYWdlUmVhZHkuYXR0YWNoRXZlbnRPbmNlKFwicGFnZVJlYWR5XCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXNvbHZlKG9SaWdodE1vc3RGRVZpZXcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gcmVzdG9yZSB0aGUgZm9jdXNJbmZvcm1hdGlvbiBmcm9tIHRoZSBoaXN0b3J5IE9iamVjdC5cblx0ICovXG5cdHByb3RlY3RlZCByZXN0b3JlRm9jdXNGcm9tSGlzdG9yeSgpOiB2b2lkIHtcblx0XHRzd2l0Y2ggKGhpc3Rvcnkuc3RhdGUuZm9jdXNJbmZvLnR5cGUpIHtcblx0XHRcdGNhc2UgXCJSb3dcIjpcblx0XHRcdFx0Y29uc3QgdGFibGUgPSBFbGVtZW50LmdldEVsZW1lbnRCeUlkKGhpc3Rvcnkuc3RhdGUuZm9jdXNJbmZvLnRhYmxlSWQpIGFzIFRhYmxlO1xuXHRcdFx0XHRjb25zdCBwb3MgPSB0YWJsZVxuXHRcdFx0XHRcdC5nZXRSb3dCaW5kaW5nKClcblx0XHRcdFx0XHQuZ2V0Q3VycmVudENvbnRleHRzKClcblx0XHRcdFx0XHQuZmluZEluZGV4KChjb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSA9PT0gaGlzdG9yeS5zdGF0ZS5mb2N1c0luZm8uY29udGV4dFBhdGhGb2N1cyk7XG5cdFx0XHRcdGlmIChwb3MgIT09IC0xKSB7XG5cdFx0XHRcdFx0dGFibGUuZm9jdXNSb3cocG9zKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoaGlzdG9yeS5zdGF0ZS5mb2N1c0luZm8uY29udHJvbElkKT8uZm9jdXMoKTtcblx0XHR9XG5cdFx0Ly9vbmNlIGFwcGxpZWQsIHRoZSBmb2N1cyBpbmZvIGlzIHJlbW92ZWQgdG8gcHJldmVudCBmb2N1c2luZyBvbiBpdCBlYWNoIHRpbWUgdGhlIHVzZXIgZG8gYSBiYWNrIG5hdmlnYXRpb24gdG8gdGhpcyBwYWdlXG5cdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoT2JqZWN0LmFzc2lnbihoaXN0b3J5LnN0YXRlLCB7IGZvY3VzSW5mbzogbnVsbCB9KSwgXCJcIik7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGJhY2sgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBkb25lLlxuXHQgKiAgLSB1cGRhdGUgdGhlIHNoZWxsIHRpdGxlLlxuXHQgKiAgLSB1cGRhdGUgdGFibGUgc2Nyb2xsLlxuXHQgKiAgLSBjYWxsIG9uUGFnZVJlYWR5IG9uIHRoZSByaWdodE1vc3RWaWV3LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50XG5cdCAqL1xuXHRfb25BZnRlclJvdXRlTWF0Y2hlZChvRXZlbnQ6IFJvdXRlJE1hdGNoZWRFdmVudCk6IHZvaWQge1xuXHRcdGlmICghdGhpcy5fb1JvdXRlTWF0Y2hlZFByb21pc2UpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZU1hdGNoZWRQcm9taXNlID0gdGhpcy53YWl0Rm9yUmlnaHRNb3N0Vmlld1JlYWR5KG9FdmVudClcblx0XHRcdFx0LnRoZW4oKG9WaWV3OiBWaWV3KSA9PiB7XG5cdFx0XHRcdFx0Ly8gVGhlIGF1dG9Gb2N1cyBpcyBpbml0aWFsbHkgZGlzYWJsZWQgb24gdGhlIG5hdkNvbnRhaW5lciBvciB0aGUgRkNMLCBzbyB0aGF0IHRoZSBmb2N1cyBzdGF5cyBvbiB0aGUgU2hlbGwgbWVudVxuXHRcdFx0XHRcdC8vIGV2ZW4gaWYgdGhlIGFwcCB0YWtlcyBhIGxvbmcgdGltZSB0byBsYXVuY2hcblx0XHRcdFx0XHQvLyBUaGUgZmlyc3QgdGltZSB0aGUgdmlldyBpcyBkaXNwbGF5ZWQsIHdlIG5lZWQgdG8gZW5hYmxlIHRoZSBhdXRvZm9jdXMgc28gdGhhdCBpdCdzIG1hbmFnZWQgcHJvcGVybHkgZHVyaW5nIG5hdmlnYXRpb25cblx0XHRcdFx0XHRjb25zdCBvUm9vdENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250ZW50KClbMF07XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0b1Jvb3RDb250cm9sICYmXG5cdFx0XHRcdFx0XHQob1Jvb3RDb250cm9sIGFzIEZsZXhpYmxlQ29sdW1uTGF5b3V0KS5nZXRBdXRvRm9jdXMgJiZcblx0XHRcdFx0XHRcdCEob1Jvb3RDb250cm9sIGFzIEZsZXhpYmxlQ29sdW1uTGF5b3V0KS5nZXRBdXRvRm9jdXMoKVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b1Jvb3RDb250cm9sLnNldFByb3BlcnR5KFwiYXV0b0ZvY3VzXCIsIHRydWUsIHRydWUpOyAvLyBEbyBub3QgbWFyayB0aGUgY29udGFpbmVyIGFzIGludmFsaWQsIG90aGVyd2lzZSBpdCdzIHJlLXJlbmRlcmVkXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0dGhpcy5fc2Nyb2xsVGFibGVzVG9MYXN0TmF2aWdhdGVkSXRlbXMoKTtcblx0XHRcdFx0XHRpZiAob0FwcENvbXBvbmVudC5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpLmdldENhcGFiaWxpdGllcygpLlVTaGVsbCkge1xuXHRcdFx0XHRcdFx0dGhpcy5jb21wdXRlVGl0bGVIaWVyYXJjaHkob1ZpZXcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBiRm9yY2VGb2N1cyA9IG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5pc0ZvY3VzRm9yY2VkKCk7XG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldEZvY3VzRm9yY2VkKGZhbHNlKTsgLy8gcmVzZXRcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvVmlldy5nZXRDb250cm9sbGVyKCkgJiZcblx0XHRcdFx0XHRcdChvVmlldy5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLm9uUGFnZVJlYWR5ICYmXG5cdFx0XHRcdFx0XHQob1ZpZXcuZ2V0UGFyZW50KCkgYXMgVGVtcGxhdGVDb21wb25lbnQpLm9uUGFnZVJlYWR5XG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHQob1ZpZXcuZ2V0UGFyZW50KCkgYXMgVGVtcGxhdGVDb21wb25lbnQpLm9uUGFnZVJlYWR5KHsgZm9yY2VGb2N1czogYkZvcmNlRm9jdXMgfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChoaXN0b3J5LnN0YXRlLmZvY3VzSW5mbykge1xuXHRcdFx0XHRcdFx0dGhpcy5yZXN0b3JlRm9jdXNGcm9tSGlzdG9yeSgpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIWJGb3JjZUZvY3VzKSB7XG5cdFx0XHRcdFx0XHQvLyBUcnkgdG8gcmVzdG9yZSB0aGUgZm9jdXMgb24gd2hlcmUgaXQgd2FzIHdoZW4gd2UgbGFzdCB2aXNpdGVkIHRoZSBjdXJyZW50IGhhc2hcblx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5yZXN0b3JlRm9jdXNGb3JDdXJyZW50SGFzaCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodGhpcy5vbkNvbnRhaW5lclJlYWR5KSB7XG5cdFx0XHRcdFx0XHR0aGlzLm9uQ29udGFpbmVyUmVhZHkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkFuIGVycm9yIG9jY3VycyB3aGlsZSBjb21wdXRpbmcgdGhlIHRpdGxlIGhpZXJhcmNoeSBhbmQgY2FsbGluZyBmb2N1cyBtZXRob2RcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9vUm91dGVNYXRjaGVkUHJvbWlzZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgVGl0bGVIaWVyYXJjaHkgY2FjaGUgKCBvciBpbml0aWFsaXplcyBpdCBpZiB1bmRlZmluZWQpLlxuXHQgKlxuXHQgKiBAcmV0dXJucyAgVGhlIFRpdGxlSGllcmFyY2h5IGNhY2hlXG5cdCAqL1xuXHRfZ2V0VGl0bGVIaWVyYXJjaHlDYWNoZSgpOiBSZWNvcmQ8c3RyaW5nLCBUaXRsZUluZm9ybWF0aW9uPiB7XG5cdFx0aWYgKCF0aGlzLm9UaXRsZUhpZXJhcmNoeUNhY2hlKSB7XG5cdFx0XHR0aGlzLm9UaXRsZUhpZXJhcmNoeUNhY2hlID0ge307XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLm9UaXRsZUhpZXJhcmNoeUNhY2hlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHRpdGxlSW5mbyBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSB0aXRsZSBUaGUgYXBwbGljYXRpb24ncyB0aXRsZVxuXHQgKiBAcGFyYW0gc3VidGl0bGUgVGhlIGFwcGxpY2F0aW9uJ3Mgc3ViVGl0bGVcblx0ICogQHBhcmFtIHNJbnRlbnQgVGhlIGludGVudCBwYXRoIHRvIGJlIHJlZGlyZWN0ZWQgdG9cblx0ICogQHBhcmFtIGljb24gVGhlIGFwcGxpY2F0aW9uJ3MgaWNvblxuXHQgKiBAcmV0dXJucyBUaGUgdGl0bGUgaW5mb3JtYXRpb25cblx0ICovXG5cdF9jb21wdXRlVGl0bGVJbmZvKHRpdGxlOiBzdHJpbmcsIHN1YnRpdGxlOiBzdHJpbmcsIHNJbnRlbnQ6IHN0cmluZywgaWNvbiA9IFwiXCIpOiBUaXRsZUluZm9ybWF0aW9uIHtcblx0XHRjb25zdCBhUGFydHMgPSBzSW50ZW50LnNwbGl0KFwiL1wiKTtcblx0XHRpZiAoIWFQYXJ0c1thUGFydHMubGVuZ3RoIC0gMV0uaW5jbHVkZXMoXCI/XCIpKSB7XG5cdFx0XHRzSW50ZW50ICs9IFwiP3Jlc3RvcmVIaXN0b3J5PXRydWVcIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c0ludGVudCArPSBcIiZyZXN0b3JlSGlzdG9yeT10cnVlXCI7XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHR0aXRsZTogdGl0bGUsXG5cdFx0XHRzdWJ0aXRsZTogc3VidGl0bGUsXG5cdFx0XHRpbnRlbnQ6IHNJbnRlbnQsXG5cdFx0XHRpY29uOiBpY29uXG5cdFx0fTtcblx0fVxuXG5cdF9mb3JtYXRUaXRsZShkaXNwbGF5TW9kZTogc3RyaW5nLCB0aXRsZVZhbHVlOiBzdHJpbmcsIHRpdGxlRGVzY3JpcHRpb246IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0bGV0IGZvcm1hdHRlZFRpdGxlID0gXCJcIjtcblx0XHRzd2l0Y2ggKGRpc3BsYXlNb2RlKSB7XG5cdFx0XHRjYXNlIFwiVmFsdWVcIjpcblx0XHRcdFx0Zm9ybWF0dGVkVGl0bGUgPSBgJHt0aXRsZVZhbHVlfWA7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIlZhbHVlRGVzY3JpcHRpb25cIjpcblx0XHRcdFx0Zm9ybWF0dGVkVGl0bGUgPSBgJHt0aXRsZVZhbHVlfSAoJHt0aXRsZURlc2NyaXB0aW9ufSlgO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblZhbHVlXCI6XG5cdFx0XHRcdGZvcm1hdHRlZFRpdGxlID0gYCR7dGl0bGVEZXNjcmlwdGlvbn0gKCR7dGl0bGVWYWx1ZX0pYDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRGVzY3JpcHRpb25cIjpcblx0XHRcdFx0Zm9ybWF0dGVkVGl0bGUgPSBgJHt0aXRsZURlc2NyaXB0aW9ufWA7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHR9XG5cdFx0cmV0dXJuIGZvcm1hdHRlZFRpdGxlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZldGNoZXMgdGhlIHZhbHVlIG9mIHRoZSBIZWFkZXJJbmZvIHRpdGxlIGZvciBhIGdpdmVuIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHRoZSBlbnRpdHlcblx0ICogQHJldHVybnMgQSBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIGZvcm1hdHRlZCB0aXRsZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vIEhlYWRlckluZm8gdGl0bGUgYW5ub3RhdGlvbiBpcyBhdmFpbGFibGVcblx0ICovXG5cdGFzeW5jIF9mZXRjaFRpdGxlVmFsdWUocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0bW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLFxuXHRcdFx0bWV0YU1vZGVsID0gYXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0bWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgocGF0aCksXG5cdFx0XHRiaW5kaW5nVmlld0NvbnRleHQgPSBtb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChwYXRoKSxcblx0XHRcdGhlYWRlckluZm9UaXRsZVZhbHVlQW5ub3RhdGlvbiA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7bWV0YVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IZWFkZXJJbmZvL1RpdGxlL1ZhbHVlYCksXG5cdFx0XHR2YWx1ZUV4cHJlc3Npb24gPSBBbm5vdGF0aW9uSGVscGVyLmZvcm1hdChoZWFkZXJJbmZvVGl0bGVWYWx1ZUFubm90YXRpb24sIHsgY29udGV4dDogbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSB9KTtcblx0XHRpZiAoIXZhbHVlRXhwcmVzc2lvbikge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcIlwiKTtcblx0XHR9XG5cdFx0aWYgKGhlYWRlckluZm9UaXRsZVZhbHVlQW5ub3RhdGlvbi4kRnVuY3Rpb24gPT09IFwib2RhdGEuY29uY2F0XCIpIHtcblx0XHRcdGNvbnN0IGFueU9iamVjdCA9IG5ldyBBbnkoeyBhbnk6IHZhbHVlRXhwcmVzc2lvbiB9KTtcblx0XHRcdGFueU9iamVjdC5zZXRNb2RlbChtb2RlbCk7XG5cdFx0XHRhbnlPYmplY3Quc2V0QmluZGluZ0NvbnRleHQoYmluZGluZ1ZpZXdDb250ZXh0KTtcblx0XHRcdGNvbnN0IHRleHRCaW5kaW5nID0gYW55T2JqZWN0LmdldEJpbmRpbmcoXCJhbnlcIik7XG5cdFx0XHRpZiAodGV4dEJpbmRpbmc/LmlzQTxDb21wb3NpdGVCaW5kaW5nPihcInNhcC51aS5tb2RlbC5Db21wb3NpdGVCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGF3YWl0IFByb21pc2UuYWxsKHRleHRCaW5kaW5nLmdldEJpbmRpbmdzKCkubWFwKChiaW5kaW5nKSA9PiBiaW5kaW5nLnJlcXVlc3RWYWx1ZT8uKCkpKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGluZm9UaXRsZSA9IGFueU9iamVjdC5nZXRBbnkoKTtcblx0XHRcdGFueU9iamVjdC5kZXN0cm95KCk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGluZm9UaXRsZSBhcyBzdHJpbmcpO1xuXHRcdH1cblx0XHRjb25zdCB0ZXh0RXhwcmVzc2lvbiA9IEFubm90YXRpb25IZWxwZXIuZm9ybWF0KFxuXHRcdFx0XHRtZXRhTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRcdGAke21ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGVhZGVySW5mby9UaXRsZS9WYWx1ZS8kUGF0aEBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dGBcblx0XHRcdFx0KSxcblx0XHRcdFx0eyBjb250ZXh0OiBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIH1cblx0XHRcdCksXG5cdFx0XHRwcm9wZXJ0eUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAke21ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGVhZGVySW5mby9UaXRsZS9WYWx1ZS8kUGF0aEBgKSxcblx0XHRcdHByb21pc2VzOiBQcm9taXNlPHN0cmluZz5bXSA9IFtdLFxuXHRcdFx0cGFyc2VkdmFsdWVFeHByZXNzaW9uID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKHZhbHVlRXhwcmVzc2lvbiksXG5cdFx0XHRwcm9taXNlRm9yRGlzcGxheU1vZGUgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQpIHtcblx0XHRcdFx0Y29uc3QgZGlzcGxheU1vZGUgPSBDb21tb25VdGlscy5jb21wdXRlRGlzcGxheU1vZGUocHJvcGVydHlDb250ZXh0KTtcblx0XHRcdFx0cmVzb2x2ZShkaXNwbGF5TW9kZSk7XG5cdFx0XHR9KTtcblx0XHRwcm9taXNlcy5wdXNoKHByb21pc2VGb3JEaXNwbGF5TW9kZSk7XG5cdFx0Y29uc3QgdmFsdWVQYXRoID0gcGFyc2VkdmFsdWVFeHByZXNzaW9uLnBhcnRzID8gcGFyc2VkdmFsdWVFeHByZXNzaW9uLnBhcnRzWzBdLnBhdGggOiBwYXJzZWR2YWx1ZUV4cHJlc3Npb24ucGF0aCxcblx0XHRcdGZuVmFsdWVGb3JtYXR0ZXIgPSBwYXJzZWR2YWx1ZUV4cHJlc3Npb24uZm9ybWF0dGVyLFxuXHRcdFx0dmFsdWVCaW5kaW5nID0gbW9kZWwuYmluZFByb3BlcnR5KHZhbHVlUGF0aCwgYmluZGluZ1ZpZXdDb250ZXh0LCB7ICQkZ3JvdXBJZDogXCIkYXV0by5IZXJvZXNcIiB9KTtcblx0XHR2YWx1ZUJpbmRpbmcuaW5pdGlhbGl6ZSgpO1xuXHRcdGNvbnN0IHByb21pc2VGb3JUaXRsZVZhbHVlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkKSB7XG5cdFx0XHRjb25zdCBmbkNoYW5nZSA9IGZ1bmN0aW9uIChldmVudDogT0RhdGFQcm9wZXJ0eUJpbmRpbmckQ2hhbmdlRXZlbnQpOiB2b2lkIHtcblx0XHRcdFx0Y29uc3QgdGFyZ2V0VmFsdWUgPSBmblZhbHVlRm9ybWF0dGVyID8gZm5WYWx1ZUZvcm1hdHRlcihldmVudC5nZXRTb3VyY2UoKS5nZXRWYWx1ZSgpKSA6IGV2ZW50LmdldFNvdXJjZSgpLmdldFZhbHVlKCk7XG5cblx0XHRcdFx0dmFsdWVCaW5kaW5nLmRldGFjaENoYW5nZShmbkNoYW5nZSk7XG5cdFx0XHRcdHJlc29sdmUodGFyZ2V0VmFsdWUpO1xuXHRcdFx0fTtcblx0XHRcdHZhbHVlQmluZGluZy5hdHRhY2hDaGFuZ2UoZm5DaGFuZ2UpO1xuXHRcdH0pO1xuXHRcdHByb21pc2VzLnB1c2gocHJvbWlzZUZvclRpdGxlVmFsdWUpO1xuXG5cdFx0aWYgKHRleHRFeHByZXNzaW9uKSB7XG5cdFx0XHRjb25zdCBwYXJzZWRUZXh0RXhwcmVzc2lvbiA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcih0ZXh0RXhwcmVzc2lvbik7XG5cdFx0XHRsZXQgdGV4dFBhdGggPSBwYXJzZWRUZXh0RXhwcmVzc2lvbi5wYXJ0cyA/IHBhcnNlZFRleHRFeHByZXNzaW9uLnBhcnRzWzBdLnBhdGggOiBwYXJzZWRUZXh0RXhwcmVzc2lvbi5wYXRoO1xuXHRcdFx0dGV4dFBhdGggPSB2YWx1ZVBhdGgubGFzdEluZGV4T2YoXCIvXCIpID4gLTEgPyBgJHt2YWx1ZVBhdGguc2xpY2UoMCwgdmFsdWVQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSl9LyR7dGV4dFBhdGh9YCA6IHRleHRQYXRoO1xuXG5cdFx0XHRjb25zdCBmblRleHRGb3JtYXR0ZXIgPSBwYXJzZWRUZXh0RXhwcmVzc2lvbi5mb3JtYXR0ZXIsXG5cdFx0XHRcdHRleHRCaW5kaW5nID0gbW9kZWwuYmluZFByb3BlcnR5KHRleHRQYXRoLCBiaW5kaW5nVmlld0NvbnRleHQsIHsgJCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiIH0pO1xuXHRcdFx0dGV4dEJpbmRpbmcuaW5pdGlhbGl6ZSgpO1xuXHRcdFx0Y29uc3QgcHJvbWlzZUZvclRpdGxlVGV4dCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAoZGVzY3JpcHRpb246IHN0cmluZykgPT4gdm9pZCkge1xuXHRcdFx0XHRjb25zdCBmbkNoYW5nZSA9IGZ1bmN0aW9uIChldmVudDogT0RhdGFQcm9wZXJ0eUJpbmRpbmckQ2hhbmdlRXZlbnQpOiB2b2lkIHtcblx0XHRcdFx0XHRjb25zdCB0YXJnZXRUZXh0ID0gZm5UZXh0Rm9ybWF0dGVyID8gZm5UZXh0Rm9ybWF0dGVyKGV2ZW50LmdldFNvdXJjZSgpLmdldFZhbHVlKCkpIDogZXZlbnQuZ2V0U291cmNlKCkuZ2V0VmFsdWUoKTtcblxuXHRcdFx0XHRcdHRleHRCaW5kaW5nLmRldGFjaENoYW5nZShmbkNoYW5nZSk7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0YXJnZXRUZXh0KTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHR0ZXh0QmluZGluZy5hdHRhY2hDaGFuZ2UoZm5DaGFuZ2UpO1xuXHRcdFx0fSk7XG5cdFx0XHRwcm9taXNlcy5wdXNoKHByb21pc2VGb3JUaXRsZVRleHQpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdGl0bGVJbmZvOiBzdHJpbmdbXSA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblx0XHRcdGxldCBmb3JtYXR0ZWRUaXRsZSA9IFwiXCI7XG5cdFx0XHRpZiAodHlwZW9mIHRpdGxlSW5mbyAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRmb3JtYXR0ZWRUaXRsZSA9IHRoaXMuX2Zvcm1hdFRpdGxlKHRpdGxlSW5mb1swXSwgdGl0bGVJbmZvWzFdLCB0aXRsZUluZm9bMl0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZvcm1hdHRlZFRpdGxlO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBmZXRjaGluZyB0aGUgdGl0bGUgZnJvbSB0aGUgaGVhZGVyIGluZm8gOlwiICsgZXJyb3IpO1xuXHRcdH1cblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiByZXR1cm5pbmcgdGhlIGRlY29kZWQgYXBwbGljYXRpb24tc3BlY2lmaWMgaGFzaC5cblx0ICpcblx0ICogQHJldHVybnMgRGVjb2RlZCBhcHBsaWNhdGlvbi1zcGVjaWZpYyBoYXNoXG5cdCAqL1xuXHRnZXRBcHBTcGVjaWZpY0hhc2goKTogc3RyaW5nIHtcblx0XHQvLyBIYXNoQ2hhbmdlZCBpc1NoZWxsTmF2aWdhdGlvbkhhc2hDaGFuZ2VyXG5cdFx0Y29uc3QgaGFzaENoYW5nZXIgPSBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdHJldHVybiBoYXNoQ2hhbmdlci5ocmVmRm9yQXBwU3BlY2lmaWNIYXNoID8gVVJJLmRlY29kZShoYXNoQ2hhbmdlci5ocmVmRm9yQXBwU3BlY2lmaWNIYXNoKFwiXCIpKSA6IFwiIy9cIjtcblx0fVxuXG5cdF9nZXRIYXNoKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkuZ2V0SGFzaCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aXRsZUluZm9ybWF0aW9uIGZyb20gYSBwYXRoLlxuXHQgKiBJdCB1cGRhdGVzIHRoZSBjYWNoZSB0byBzdG9yZSB0aXRsZSBpbmZvcm1hdGlvbiBpZiBuZWNlc3Nhcnlcblx0ICpcblx0ICogQHBhcmFtIHsqfSBzUGF0aCBwYXRoIG9mIHRoZSBjb250ZXh0IHRvIHJldHJpZXZlIHRpdGxlIGluZm9ybWF0aW9uIGZyb20gTWV0YU1vZGVsXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSAgb1RpdGxlaW5mb3JtYXRpb24gcmV0dXJuZWQgYXMgcHJvbWlzZVxuXHQgKi9cblxuXHRhc3luYyBnZXRUaXRsZUluZm9Gcm9tUGF0aChzUGF0aDogc3RyaW5nKTogUHJvbWlzZTxUaXRsZUluZm9ybWF0aW9uPiB7XG5cdFx0Y29uc3Qgb1RpdGxlSGllcmFyY2h5Q2FjaGUgPSB0aGlzLl9nZXRUaXRsZUhpZXJhcmNoeUNhY2hlKCk7XG5cblx0XHRpZiAob1RpdGxlSGllcmFyY2h5Q2FjaGVbc1BhdGhdKSB7XG5cdFx0XHQvLyBUaGUgdGl0bGUgaW5mbyBpcyBhbHJlYWR5IHN0b3JlZCBpbiB0aGUgY2FjaGVcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUob1RpdGxlSGllcmFyY2h5Q2FjaGVbc1BhdGhdKTtcblx0XHR9XG5cblx0XHRjb25zdCBvTWV0YU1vZGVsID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBzRW50aXR5UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXHRcdGNvbnN0IHNUeXBlTmFtZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGVhZGVySW5mby9UeXBlTmFtZWApO1xuXHRcdGNvbnN0IHNBcHBTcGVjaWZpY0hhc2ggPSB0aGlzLmdldEFwcFNwZWNpZmljSGFzaCgpO1xuXHRcdGNvbnN0IHNJbnRlbnQgPSBzQXBwU3BlY2lmaWNIYXNoICsgc1BhdGguc2xpY2UoMSk7XG5cdFx0cmV0dXJuIHRoaXMuX2ZldGNoVGl0bGVWYWx1ZShzUGF0aCkudGhlbigoc1RpdGxlOiBzdHJpbmcpID0+IHtcblx0XHRcdGNvbnN0IG9UaXRsZUluZm8gPSB0aGlzLl9jb21wdXRlVGl0bGVJbmZvKHNUeXBlTmFtZSwgc1RpdGxlLCBzSW50ZW50KTtcblx0XHRcdG9UaXRsZUhpZXJhcmNoeUNhY2hlW3NQYXRoXSA9IG9UaXRsZUluZm87XG5cdFx0XHRyZXR1cm4gb1RpdGxlSW5mbztcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbnN1cmUgdGhhdCB0aGUgdXNoZWxsIHNlcnZpY2UgcmVjZWl2ZXMgYWxsIGVsZW1lbnRzXG5cdCAqICh0aXRsZSwgc3VidGl0bGUsIGludGVudCwgaWNvbikgYXMgc3RyaW5ncy5cblx0ICpcblx0ICogQW5ub3RhdGlvbiBIZWFkZXJJbmZvIGFsbG93cyBmb3IgYmluZGluZyBvZiB0aXRsZSBhbmQgZGVzY3JpcHRpb25cblx0ICogKHdoaWNoIGFyZSB1c2VkIGhlcmUgYXMgdGl0bGUgYW5kIHN1YnRpdGxlKSB0byBhbnkgZWxlbWVudCBpbiB0aGUgZW50aXR5XG5cdCAqIChiZWluZyBwb3NzaWJseSB0eXBlcyBsaWtlIGJvb2xlYW4sIHRpbWVzdGFtcCwgZG91YmxlLCBldGMuKVxuXHQgKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGhpZXJhcmNoeSBhbmQgY29udmVydHMgbm9uLXN0cmluZyB0eXBlcyB0byBzdHJpbmcuXG5cdCAqXG5cdCAqIEBwYXJhbSBhSGllcmFyY2h5IFNoZWxsIHRpdGxlIGhpZXJhcmNoeVxuXHQgKiBAcmV0dXJucyBDb3B5IG9mIHNoZWxsIHRpdGxlIGhpZXJhcmNoeSBjb250YWluaW5nIGFsbCBlbGVtZW50cyBhcyBzdHJpbmdzXG5cdCAqL1xuXHRfZW5zdXJlSGllcmFyY2h5RWxlbWVudHNBcmVTdHJpbmdzKGFIaWVyYXJjaHk6IFRpdGxlSW5mb3JtYXRpb25bXSk6IG9iamVjdFtdIHtcblx0XHRjb25zdCBhSGllcmFyY2h5U2hlbGwgPSBbXTtcblx0XHRmb3IgKGNvbnN0IGxldmVsIGluIGFIaWVyYXJjaHkpIHtcblx0XHRcdGNvbnN0IG9IaWVyYXJjaHkgPSBhSGllcmFyY2h5W2xldmVsXTtcblx0XHRcdGNvbnN0IG9TaGVsbEhpZXJhcmNoeTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gb0hpZXJhcmNoeSkge1xuXHRcdFx0XHRvU2hlbGxIaWVyYXJjaHlba2V5XSA9IChcblx0XHRcdFx0XHR0eXBlb2Ygb0hpZXJhcmNoeVtrZXkgYXMga2V5b2YgVGl0bGVJbmZvcm1hdGlvbl0gIT09IFwic3RyaW5nXCJcblx0XHRcdFx0XHRcdD8gU3RyaW5nKG9IaWVyYXJjaHlba2V5IGFzIGtleW9mIFRpdGxlSW5mb3JtYXRpb25dKVxuXHRcdFx0XHRcdFx0OiBvSGllcmFyY2h5W2tleSBhcyBrZXlvZiBUaXRsZUluZm9ybWF0aW9uXVxuXHRcdFx0XHQpIGFzIHN0cmluZztcblx0XHRcdH1cblx0XHRcdGFIaWVyYXJjaHlTaGVsbC5wdXNoKG9TaGVsbEhpZXJhcmNoeSk7XG5cdFx0fVxuXHRcdHJldHVybiBhSGllcmFyY2h5U2hlbGw7XG5cdH1cblxuXHRfZ2V0VGFyZ2V0VHlwZUZyb21IYXNoKHNIYXNoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGxldCBzVGFyZ2V0VHlwZSA9IFwiXCI7XG5cblx0XHRjb25zdCBhUm91dGVzID0gb0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdEVudHJ5KFwic2FwLnVpNVwiKS5yb3V0aW5nPy5yb3V0ZXMgPz8gW107XG5cdFx0Zm9yIChjb25zdCByb3V0ZSBvZiBhUm91dGVzKSB7XG5cdFx0XHRjb25zdCBvUm91dGUgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlcigpLmdldFJvdXRlKHJvdXRlLm5hbWUpO1xuXHRcdFx0aWYgKG9Sb3V0ZT8ubWF0Y2goc0hhc2gpKSB7XG5cdFx0XHRcdGNvbnN0IHNUYXJnZXQgPSBnZXRSb3V0ZVRhcmdldE5hbWVzKHJvdXRlLnRhcmdldClbMF07XG5cdFx0XHRcdHNUYXJnZXRUeXBlID0gKG9BcHBDb21wb25lbnQuZ2V0Um91dGVyKCkuZ2V0VGFyZ2V0KHNUYXJnZXQpIGFzIHVua25vd24gYXMgeyBfb09wdGlvbnM6IHsgbmFtZTogc3RyaW5nIH0gfSkuX29PcHRpb25zLm5hbWU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBzVGFyZ2V0VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHNoZWxsIHRpdGxlIGFmdGVyIGVhY2ggbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHZpZXcgVGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBtZW51IGlzIGZpbGxlZCBwcm9wZXJseVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0YXN5bmMgY29tcHV0ZVRpdGxlSGllcmFyY2h5KHZpZXc6IFZpZXcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0Y29udGV4dCA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdGN1cnJlbnRQYWdlID0gdmlldy5nZXRQYXJlbnQoKSxcblx0XHRcdHRpdGxlSW5mb3JtYXRpb25Qcm9taXNlcyA9IFtdLFxuXHRcdFx0YXBwU3BlY2lmaWNIYXNoID0gdGhpcy5nZXRBcHBTcGVjaWZpY0hhc2goKSxcblx0XHRcdG1hbmlmZXN0QXBwU2V0dGluZ3MgPSBhcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC5hcHBcIiksXG5cdFx0XHRhcHBUaXRsZSA9IG1hbmlmZXN0QXBwU2V0dGluZ3MudGl0bGUgfHwgXCJcIixcblx0XHRcdGFwcFN1YlRpdGxlID0gbWFuaWZlc3RBcHBTZXR0aW5ncy5zdWJUaXRsZSB8fCBcIlwiLFxuXHRcdFx0YXBwSWNvbiA9IG1hbmlmZXN0QXBwU2V0dGluZ3MuaWNvbiB8fCBcIlwiO1xuXHRcdGxldCBwYWdlVGl0bGVJbmZvcm1hdGlvbjogVGl0bGVJbmZvcm1hdGlvbiwgbmV3UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdFx0aWYgKGN1cnJlbnRQYWdlICYmIChjdXJyZW50UGFnZSBhcyBUZW1wbGF0ZUNvbXBvbmVudCkuX2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uKSB7XG5cdFx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0XHQvLyBJZiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgYXBwbGljYXRpb24gaXMgYSBMUiwgdXNlIHRoZSB0aXRsZSBhbmQgc3VidGl0bGUgZnJvbSB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0aWYgKHRoaXMuX2dldFRhcmdldFR5cGVGcm9tSGFzaChcIlwiKSA9PT0gXCJzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnRcIikge1xuXHRcdFx0XHRcdHRpdGxlSW5mb3JtYXRpb25Qcm9taXNlcy5wdXNoKFByb21pc2UucmVzb2x2ZSh0aGlzLl9jb21wdXRlVGl0bGVJbmZvKGFwcFRpdGxlLCBhcHBTdWJUaXRsZSwgYXBwU3BlY2lmaWNIYXNoLCBhcHBJY29uKSkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVGhlbiBtYW5hZ2Ugb3RoZXIgcGFnZXNcblx0XHRcdFx0bmV3UGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0XHRjb25zdCBwYXRoUGFydHMgPSBuZXdQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdFx0bGV0IHBhdGggPSBcIlwiO1xuXG5cdFx0XHRcdHBhdGhQYXJ0cy5zaGlmdCgpOyAvLyBSZW1vdmUgdGhlIGZpcnN0IHNlZ21lbnQgKGVtcHR5IHN0cmluZykgYXMgaXQgaGFzIGJlZW4gbWFuYWdlZCBhYm92ZVxuXHRcdFx0XHRwYXRoUGFydHMucG9wKCk7IC8vIFJlbW92ZSB0aGUgbGFzdCBzZWdtZW50IGFzIGl0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IHBhZ2UgYW5kIHNob3VsZG4ndCBhcHBlYXIgaW4gdGhlIG1lbnVcblx0XHRcdFx0cGF0aFBhcnRzLmZvckVhY2goKHBhdGhQYXJ0OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRwYXRoICs9IGAvJHtwYXRoUGFydH1gO1xuXHRcdFx0XHRcdC8vaWYgdGhlIGFzc29jaWF0ZWQgdGFyZ2V0IGlzIG5vdCBkZWNsYXJlZCBpbiB0aGUgcm91dGVzLCB3ZSBza2lwIGl0XG5cdFx0XHRcdFx0aWYgKCFhcHBDb21wb25lbnQuZ2V0Um91dGVyKCkuZ2V0Um91dGVJbmZvQnlIYXNoKHBhdGgpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGFwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRcdHBhcmFtZXRlclBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgocGF0aCksXG5cdFx0XHRcdFx0XHRpc1BhcmFtZXRlcml6ZWQgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3BhcmFtZXRlclBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVzdWx0Q29udGV4dGApO1xuXHRcdFx0XHRcdGlmICghaXNQYXJhbWV0ZXJpemVkKSB7XG5cdFx0XHRcdFx0XHR0aXRsZUluZm9ybWF0aW9uUHJvbWlzZXMucHVzaCh0aGlzLmdldFRpdGxlSW5mb0Zyb21QYXRoKHBhdGgpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDdXJyZW50IHBhZ2Vcblx0XHRcdHBhZ2VUaXRsZUluZm9ybWF0aW9uID0gKGN1cnJlbnRQYWdlIGFzIFRlbXBsYXRlQ29tcG9uZW50KS5fZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24oKTtcblx0XHRcdHBhZ2VUaXRsZUluZm9ybWF0aW9uID0gdGhpcy5fY29tcHV0ZVRpdGxlSW5mbyhcblx0XHRcdFx0cGFnZVRpdGxlSW5mb3JtYXRpb24udGl0bGUgPz8gXCJcIixcblx0XHRcdFx0cGFnZVRpdGxlSW5mb3JtYXRpb24uc3VidGl0bGUgPz8gXCJcIixcblx0XHRcdFx0YXBwU3BlY2lmaWNIYXNoICsgdGhpcy5fZ2V0SGFzaCgpXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoY29udGV4dCAmJiBuZXdQYXRoKSB7XG5cdFx0XHRcdHRoaXMuX2dldFRpdGxlSGllcmFyY2h5Q2FjaGUoKVtuZXdQYXRoXSA9IHBhZ2VUaXRsZUluZm9ybWF0aW9uO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fZ2V0VGl0bGVIaWVyYXJjaHlDYWNoZSgpW2FwcFNwZWNpZmljSGFzaF0gPSBwYWdlVGl0bGVJbmZvcm1hdGlvbjtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGl0bGVJbmZvcm1hdGlvblByb21pc2VzLnB1c2goUHJvbWlzZS5yZWplY3QoXCJUaXRsZSBpbmZvcm1hdGlvbiBtaXNzaW5nIGluIEhlYWRlckluZm9cIikpO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwodGl0bGVJbmZvcm1hdGlvblByb21pc2VzKVxuXHRcdFx0LnRoZW4oKHRpdGxlSW5mb0hpZXJhcmNoeTogVGl0bGVJbmZvcm1hdGlvbltdKTogdm9pZCA9PiB7XG5cdFx0XHRcdC8vIHdvcmthcm91bmQgZm9yIHNoZWxsIHdoaWNoIGlzIGV4cGVjdGluZyBhbGwgZWxlbWVudHMgYmVpbmcgb2YgdHlwZSBzdHJpbmdcblx0XHRcdFx0Y29uc3QgdGl0bGVJbmZvSGllcmFyY2h5U2hlbGwgPSB0aGlzLl9lbnN1cmVIaWVyYXJjaHlFbGVtZW50c0FyZVN0cmluZ3ModGl0bGVJbmZvSGllcmFyY2h5KSxcblx0XHRcdFx0XHR0aXRsZSA9IHBhZ2VUaXRsZUluZm9ybWF0aW9uLnRpdGxlID8/IFwiXCI7XG5cdFx0XHRcdHRpdGxlSW5mb0hpZXJhcmNoeVNoZWxsLnJldmVyc2UoKTtcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRIaWVyYXJjaHkodGl0bGVJbmZvSGllcmFyY2h5U2hlbGwpO1xuXG5cdFx0XHRcdHRoaXMuX3NldFNoZWxsTWVudVRpdGxlKGFwcENvbXBvbmVudCwgdGl0bGUsIGFwcFRpdGxlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3JNZXNzYWdlOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihlcnJvck1lc3NhZ2UgYXMgc3RyaW5nKTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuYklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeSA9IGZhbHNlO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3JNZXNzYWdlOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihlcnJvck1lc3NhZ2UgYXMgc3RyaW5nKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRjYWxjdWxhdGVMYXlvdXQoaU5leHRGQ0xMZXZlbDogbnVtYmVyLCBzSGFzaDogc3RyaW5nLCBzUHJvcG9zZWRMYXlvdXQ6IHN0cmluZyB8IHVuZGVmaW5lZCwga2VlcEN1cnJlbnRMYXlvdXQgPSBmYWxzZSk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGJhY2sgYWZ0ZXIgYSB2aWV3IGhhcyBiZWVuIGJvdW5kIHRvIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgaGFzIGJlZW4gYm91bmQgdG8gYSB2aWV3XG5cdCAqL1xuXHRvbkNvbnRleHRCb3VuZFRvVmlldyhvQ29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZCB8IG51bGwpOiB2b2lkIHtcblx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdGNvbnN0IHNEZWVwZXN0UGF0aCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikuZ2V0UHJvcGVydHkoXCIvZGVlcGVzdFBhdGhcIiksXG5cdFx0XHRcdHNWaWV3Q29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cblx0XHRcdGlmICghc0RlZXBlc3RQYXRoIHx8IHNEZWVwZXN0UGF0aC5pbmRleE9mKHNWaWV3Q29udGV4dFBhdGgpICE9PSAwKSB7XG5cdFx0XHRcdC8vIFRoZXJlIHdhcyBubyBwcmV2aW91cyB2YWx1ZSBmb3IgdGhlIGRlZXBlc3QgcmVhY2hlZCBwYXRoLCBvciB0aGUgcGF0aFxuXHRcdFx0XHQvLyBmb3IgdGhlIHZpZXcgaXNuJ3QgYSBzdWJwYXRoIG9mIHRoZSBwcmV2aW91cyBkZWVwZXN0IHBhdGggLS0+IHVwZGF0ZVxuXHRcdFx0XHR0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpLnNldFByb3BlcnR5KFwiL2RlZXBlc3RQYXRoXCIsIHNWaWV3Q29udGV4dFBhdGgsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgZGlzcGxheUVycm9yUGFnZShfZXJyb3JNZXNzYWdlOiBzdHJpbmcsIF9wYXJhbWV0ZXJzOiBOYXZpZ2F0aW9uVG9FcnJvclBhZ2VSZXN1bHQsIF9GQ0xMZXZlbCA9IDApOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHQvLyBUbyBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0fVxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0dXBkYXRlVUlTdGF0ZUZvclZpZXcob1ZpZXc6IEZFVmlldywgRkNMTGV2ZWw6IG51bWJlcik6IHZvaWQge1xuXHRcdC8vIFRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0Z2V0SW5zdGFuY2VkVmlld3MoKTogVmlld1tdIHtcblx0XHRyZXR1cm4gW107XG5cdFx0Ly8gVG8gYmUgb3ZlcnJpZGVuXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJuIGFsbCB2aXNpYmxlIHZpZXdzLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgdmlzaWJsZSB2aWV3c1xuXHQgKi9cblx0Z2V0VmlzaWJsZVZpZXdzKCk6IFZpZXdbXSB7XG5cdFx0cmV0dXJuIFtdO1xuXHRcdC8vIFRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0X3Njcm9sbFRhYmxlc1RvTGFzdE5hdmlnYXRlZEl0ZW1zKCk6IHZvaWQge1xuXHRcdC8vIFRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0aXNGY2xFbmFibGVkKCk6IHRoaXMgaXMgRmNsQ29udHJvbGxlciB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRfc2V0U2hlbGxNZW51VGl0bGUob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBzVGl0bGU6IHN0cmluZywgc0FwcFRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHQvLyBUbyBiZSBvdmVycmlkZW4gYnkgRmNsQ29udHJvbGxlclxuXHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldFRpdGxlKHNUaXRsZSk7XG5cdH1cblxuXHRnZXRBcHBDb250ZW50Q29udGFpbmVyKCk6IE5hdkNvbnRhaW5lciB8IEZsZXhpYmxlQ29sdW1uTGF5b3V0IHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRjb25zdCBhcHBDb250ZW50SWQgPSBvQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0RW50cnkoXCJzYXAudWk1XCIpLnJvdXRpbmc/LmNvbmZpZz8uY29udHJvbElkID8/IFwiYXBwQ29udGVudFwiO1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5ieUlkKGFwcENvbnRlbnRJZCkgYXMgTmF2Q29udGFpbmVyIHwgRmxleGlibGVDb2x1bW5MYXlvdXQ7XG5cdH1cbn1cbmludGVyZmFjZSBSb290Vmlld0Jhc2VDb250cm9sbGVyIHtcblx0b25Db250YWluZXJSZWFkeT8oKTogdm9pZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUm9vdFZpZXdCYXNlQ29udHJvbGxlcjtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7TUEyQ01BLHNCQUFzQixXQUQzQkMsY0FBYyxDQUFDLDZDQUE2QyxDQUFDLFVBRTVEQyxjQUFjLENBQUNDLFdBQVcsQ0FBQyxVQUczQkQsY0FBYyxDQUFDRSxTQUFTLENBQUM7SUFBQTtJQUFBO01BQUE7TUFBQTtRQUFBO01BQUE7TUFBQTtNQUFBO01BQUE7TUFBQSxNQVdsQkMseUJBQXlCLEdBQUcsS0FBSztNQUFBO0lBQUE7SUFBQTtJQUFBLE9BRXpDQyxNQUFNLEdBQU4sa0JBQWU7TUFDZEMsVUFBVSxDQUFDQyxJQUFJLEVBQUU7TUFFakIsSUFBSSxDQUFDQyxjQUFjLEdBQUcsRUFBRTtJQUN6QixDQUFDO0lBQUEs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