@sapui5/sap.fe.core 1.127.2 → 1.129.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 (393) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +3 -9
  4. package/src/sap/fe/core/ActionRuntime.ts +3 -7
  5. package/src/sap/fe/core/AppComponent.js +9 -19
  6. package/src/sap/fe/core/AppComponent.ts +2 -12
  7. package/src/sap/fe/core/AppStateHandler.js +3 -11
  8. package/src/sap/fe/core/AppStateHandler.ts +0 -7
  9. package/src/sap/fe/core/BaseController.js +4 -8
  10. package/src/sap/fe/core/BaseController.ts +0 -5
  11. package/src/sap/fe/core/CommonUtils.js +1 -9
  12. package/src/sap/fe/core/CommonUtils.ts +4 -8
  13. package/src/sap/fe/core/ExtensionAPI.js +10 -25
  14. package/src/sap/fe/core/ExtensionAPI.ts +4 -19
  15. package/src/sap/fe/core/InsightsFormattersExtension.js +5 -3
  16. package/src/sap/fe/core/PageController.js +7 -10
  17. package/src/sap/fe/core/PageController.ts +0 -3
  18. package/src/sap/fe/core/ResourceModel.js +3 -5
  19. package/src/sap/fe/core/ResourceModel.ts +0 -2
  20. package/src/sap/fe/core/ReuseComponent.js +8 -14
  21. package/src/sap/fe/core/ReuseComponent.ts +0 -6
  22. package/src/sap/fe/core/TemplateComponent.js +37 -9
  23. package/src/sap/fe/core/TemplateComponent.ts +3 -2
  24. package/src/sap/fe/core/TemplateModel.js +5 -5
  25. package/src/sap/fe/core/TemplateModel.ts +0 -1
  26. package/src/sap/fe/core/UIProvider.js +1 -1
  27. package/src/sap/fe/core/UIProvider.ts +44 -1
  28. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +7 -12
  29. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +0 -5
  30. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +61 -65
  31. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +60 -63
  32. package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +3 -3
  33. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockFormatter.js +1 -1
  34. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +21 -5
  35. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +0 -4
  36. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +6 -18
  37. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -20
  38. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +5 -11
  39. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +0 -6
  40. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlock.js +3 -3
  41. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +11 -10
  42. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +0 -1
  43. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +5 -7
  44. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +0 -1
  45. package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
  46. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +3 -10
  47. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +0 -7
  48. package/src/sap/fe/core/controllerextensions/ContextSharing.js +5 -8
  49. package/src/sap/fe/core/controllerextensions/ContextSharing.ts +0 -2
  50. package/src/sap/fe/core/controllerextensions/EditFlow.js +225 -155
  51. package/src/sap/fe/core/controllerextensions/EditFlow.ts +248 -164
  52. package/src/sap/fe/core/controllerextensions/Feedback.js +1 -3
  53. package/src/sap/fe/core/controllerextensions/Feedback.ts +0 -2
  54. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +4 -7
  55. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +0 -3
  56. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +8 -25
  57. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +2 -21
  58. package/src/sap/fe/core/controllerextensions/InternalRouting.js +22 -34
  59. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +25 -31
  60. package/src/sap/fe/core/controllerextensions/KPIManagement.js +8 -21
  61. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +4 -15
  62. package/src/sap/fe/core/controllerextensions/MessageHandler.js +68 -31
  63. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +78 -32
  64. package/src/sap/fe/core/controllerextensions/PageReady.js +4 -4
  65. package/src/sap/fe/core/controllerextensions/Paginator.js +4 -8
  66. package/src/sap/fe/core/controllerextensions/Paginator.ts +0 -4
  67. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -4
  68. package/src/sap/fe/core/controllerextensions/Recommendations.js +15 -24
  69. package/src/sap/fe/core/controllerextensions/Recommendations.ts +13 -20
  70. package/src/sap/fe/core/controllerextensions/Routing.js +4 -10
  71. package/src/sap/fe/core/controllerextensions/Routing.ts +0 -6
  72. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  73. package/src/sap/fe/core/controllerextensions/Share.js +17 -11
  74. package/src/sap/fe/core/controllerextensions/Share.ts +10 -5
  75. package/src/sap/fe/core/controllerextensions/SideEffects.js +49 -45
  76. package/src/sap/fe/core/controllerextensions/SideEffects.ts +54 -41
  77. package/src/sap/fe/core/controllerextensions/Telemetry.js +4 -4
  78. package/src/sap/fe/core/controllerextensions/ViewState.js +10 -34
  79. package/src/sap/fe/core/controllerextensions/ViewState.ts +3 -49
  80. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +6 -8
  81. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +0 -1
  82. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -2
  83. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +0 -1
  84. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +4 -3
  85. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +1 -1
  86. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +16 -12
  87. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +4 -1
  88. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
  89. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +126 -74
  90. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +158 -91
  91. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +1 -22
  92. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +0 -20
  93. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -20
  94. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +11 -17
  95. package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +1 -1
  96. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +191 -767
  97. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +277 -1024
  98. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
  99. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -6
  100. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +0 -5
  101. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +381 -250
  102. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +467 -301
  103. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +2 -6
  104. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +0 -5
  105. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +2 -6
  106. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.ts +4 -6
  107. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +1 -6
  108. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.ts +0 -4
  109. package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +1 -1
  110. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +4 -41
  111. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +1 -37
  112. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +1 -1
  113. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.ts +0 -1
  114. package/src/sap/fe/core/controls/Any.js +1 -2
  115. package/src/sap/fe/core/controls/Any.ts +0 -1
  116. package/src/sap/fe/core/controls/AnyElement.js +1 -2
  117. package/src/sap/fe/core/controls/AnyElement.ts +0 -1
  118. package/src/sap/fe/core/controls/CommandExecution.js +3 -3
  119. package/src/sap/fe/core/controls/ComponentLoader.js +23 -10
  120. package/src/sap/fe/core/controls/ComponentLoader.ts +0 -1
  121. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +10 -13
  122. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +0 -6
  123. package/src/sap/fe/core/controls/EventDelegateHook.js +8 -9
  124. package/src/sap/fe/core/controls/FormElementWrapper.js +7 -7
  125. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -1
  126. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +140 -24
  127. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +141 -10
  128. package/src/sap/fe/core/converters/ConverterContext.js +8 -30
  129. package/src/sap/fe/core/converters/ConverterContext.ts +7 -29
  130. package/src/sap/fe/core/converters/ManifestSettings.js +37 -1
  131. package/src/sap/fe/core/converters/ManifestSettings.ts +12 -3
  132. package/src/sap/fe/core/converters/ManifestWrapper.js +12 -40
  133. package/src/sap/fe/core/converters/ManifestWrapper.ts +13 -46
  134. package/src/sap/fe/core/converters/MetaModelConverter.js +44 -48
  135. package/src/sap/fe/core/converters/MetaModelConverter.ts +50 -48
  136. package/src/sap/fe/core/converters/TemplateConverter.js +3 -2
  137. package/src/sap/fe/core/converters/TemplateConverter.ts +0 -1
  138. package/src/sap/fe/core/converters/annotations/DataField.js +1 -28
  139. package/src/sap/fe/core/converters/annotations/DataField.ts +0 -26
  140. package/src/sap/fe/core/converters/common/AnnotationConverter.js +24 -19
  141. package/src/sap/fe/core/converters/controls/Common/Action.js +13 -26
  142. package/src/sap/fe/core/converters/controls/Common/Action.ts +13 -31
  143. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -6
  144. package/src/sap/fe/core/converters/controls/Common/Chart.ts +0 -5
  145. package/src/sap/fe/core/converters/controls/Common/Criticality.js +2 -4
  146. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +1 -2
  147. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -5
  148. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +0 -4
  149. package/src/sap/fe/core/converters/controls/Common/Form.js +3 -2
  150. package/src/sap/fe/core/converters/controls/Common/Form.ts +2 -1
  151. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -7
  152. package/src/sap/fe/core/converters/controls/Common/KPI.ts +11 -6
  153. package/src/sap/fe/core/converters/controls/Common/Table.js +159 -141
  154. package/src/sap/fe/core/converters/controls/Common/Table.ts +166 -122
  155. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +5 -30
  156. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +3 -29
  157. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +43 -55
  158. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +43 -47
  159. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -4
  160. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +0 -3
  161. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
  162. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +3 -8
  163. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +2 -7
  164. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +1 -11
  165. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +0 -9
  166. package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -10
  167. package/src/sap/fe/core/converters/helpers/Aggregation.ts +0 -9
  168. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -7
  169. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +0 -6
  170. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -9
  171. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +0 -8
  172. package/src/sap/fe/core/converters/helpers/ID.js +1 -2
  173. package/src/sap/fe/core/converters/helpers/ID.ts +0 -1
  174. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +1 -2
  175. package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +0 -1
  176. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  177. package/src/sap/fe/core/converters/helpers/Key.js +1 -5
  178. package/src/sap/fe/core/converters/helpers/Key.ts +0 -4
  179. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -2
  180. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +0 -1
  181. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  182. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -7
  183. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +0 -6
  184. package/src/sap/fe/core/converters/templates/ListReportConverter.js +6 -27
  185. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +9 -26
  186. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -16
  187. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +0 -15
  188. package/src/sap/fe/core/definition/FEDefinition.js +2550 -0
  189. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -12
  190. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +9 -10
  191. package/src/sap/fe/core/formatters/CollaborationFormatter.js +8 -2
  192. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +0 -2
  193. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  194. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -2
  195. package/src/sap/fe/core/formatters/FPMFormatter.ts +0 -1
  196. package/src/sap/fe/core/formatters/FiscalFormat.js +9 -14
  197. package/src/sap/fe/core/formatters/FiscalFormat.ts +0 -11
  198. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -4
  199. package/src/sap/fe/core/formatters/KPIFormatter.ts +0 -3
  200. package/src/sap/fe/core/formatters/StandardFormatter.js +6 -3
  201. package/src/sap/fe/core/formatters/StandardFormatter.ts +6 -2
  202. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -4
  203. package/src/sap/fe/core/formatters/ValueFormatter.ts +0 -3
  204. package/src/sap/fe/core/fpm/Component.js +14 -17
  205. package/src/sap/fe/core/fpm/Component.ts +7 -10
  206. package/src/sap/fe/core/fpm/manifest.json +1 -1
  207. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.js +3 -10
  208. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.ts +0 -9
  209. package/src/sap/fe/core/helpers/AppStartupHelper.js +1 -13
  210. package/src/sap/fe/core/helpers/AppStartupHelper.ts +0 -11
  211. package/src/sap/fe/core/helpers/BindingHelper.js +1 -4
  212. package/src/sap/fe/core/helpers/BindingHelper.ts +0 -3
  213. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.js +1 -2
  214. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.ts +0 -1
  215. package/src/sap/fe/core/helpers/DeleteHelper.js +61 -32
  216. package/src/sap/fe/core/helpers/DeleteHelper.ts +79 -33
  217. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -2
  218. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +0 -1
  219. package/src/sap/fe/core/helpers/EditState.js +1 -1
  220. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -2
  221. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +0 -1
  222. package/src/sap/fe/core/helpers/FPMHelper.js +1 -2
  223. package/src/sap/fe/core/helpers/FPMHelper.ts +0 -1
  224. package/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -8
  225. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +0 -7
  226. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +7 -1
  227. package/src/sap/fe/core/helpers/LoaderUtils.js +1 -1
  228. package/src/sap/fe/core/helpers/ManifestHelper.js +1 -3
  229. package/src/sap/fe/core/helpers/ManifestHelper.ts +0 -2
  230. package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
  231. package/src/sap/fe/core/helpers/MetaModelFunction.js +3 -8
  232. package/src/sap/fe/core/helpers/MetaModelFunction.ts +0 -5
  233. package/src/sap/fe/core/helpers/MetaPath.js +1 -7
  234. package/src/sap/fe/core/helpers/MetaPath.ts +0 -6
  235. package/src/sap/fe/core/helpers/ModelHelper.js +55 -35
  236. package/src/sap/fe/core/helpers/ModelHelper.ts +64 -38
  237. package/src/sap/fe/core/helpers/PasteHelper.js +77 -24
  238. package/src/sap/fe/core/helpers/PasteHelper.ts +105 -23
  239. package/src/sap/fe/core/helpers/PromiseKeeper.js +1 -3
  240. package/src/sap/fe/core/helpers/PromiseKeeper.ts +0 -2
  241. package/src/sap/fe/core/helpers/RecommendationHelper.js +1 -4
  242. package/src/sap/fe/core/helpers/RecommendationHelper.ts +0 -3
  243. package/src/sap/fe/core/helpers/ResourceModelHelper.js +1 -3
  244. package/src/sap/fe/core/helpers/ResourceModelHelper.ts +3 -4
  245. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -2
  246. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +0 -1
  247. package/src/sap/fe/core/helpers/SizeHelper.js +1 -2
  248. package/src/sap/fe/core/helpers/SizeHelper.ts +0 -1
  249. package/src/sap/fe/core/helpers/StableIdHelper.js +7 -17
  250. package/src/sap/fe/core/helpers/StableIdHelper.ts +7 -17
  251. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +1 -12
  252. package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +0 -11
  253. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  254. package/src/sap/fe/core/helpers/TitleHelper.js +1 -10
  255. package/src/sap/fe/core/helpers/TitleHelper.ts +0 -9
  256. package/src/sap/fe/core/helpers/ToES6Promise.js +1 -2
  257. package/src/sap/fe/core/helpers/ToES6Promise.ts +0 -1
  258. package/src/sap/fe/core/helpers/TypeGuards.js +1 -15
  259. package/src/sap/fe/core/helpers/TypeGuards.ts +0 -14
  260. package/src/sap/fe/core/helpers/WebSocket.js +1 -1
  261. package/src/sap/fe/core/library.js +10 -44
  262. package/src/sap/fe/core/library.support.js +1 -1
  263. package/src/sap/fe/core/library.ts +8 -45
  264. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -6
  265. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +0 -5
  266. package/src/sap/fe/core/messagebundle.properties +12 -1
  267. package/src/sap/fe/core/messagebundle_ar.properties +8 -0
  268. package/src/sap/fe/core/messagebundle_bg.properties +8 -0
  269. package/src/sap/fe/core/messagebundle_ca.properties +8 -0
  270. package/src/sap/fe/core/messagebundle_cnr.properties +8 -0
  271. package/src/sap/fe/core/messagebundle_cs.properties +9 -1
  272. package/src/sap/fe/core/messagebundle_cy.properties +8 -0
  273. package/src/sap/fe/core/messagebundle_da.properties +8 -0
  274. package/src/sap/fe/core/messagebundle_de.properties +8 -0
  275. package/src/sap/fe/core/messagebundle_el.properties +8 -0
  276. package/src/sap/fe/core/messagebundle_en.properties +8 -0
  277. package/src/sap/fe/core/messagebundle_en_GB.properties +8 -0
  278. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +144 -65
  279. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +8 -0
  280. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +273 -194
  281. package/src/sap/fe/core/messagebundle_es.properties +9 -1
  282. package/src/sap/fe/core/messagebundle_es_MX.properties +8 -0
  283. package/src/sap/fe/core/messagebundle_et.properties +8 -0
  284. package/src/sap/fe/core/messagebundle_fi.properties +8 -0
  285. package/src/sap/fe/core/messagebundle_fr.properties +8 -0
  286. package/src/sap/fe/core/messagebundle_fr_CA.properties +8 -0
  287. package/src/sap/fe/core/messagebundle_hi.properties +9 -1
  288. package/src/sap/fe/core/messagebundle_hr.properties +8 -0
  289. package/src/sap/fe/core/messagebundle_hu.properties +8 -0
  290. package/src/sap/fe/core/messagebundle_id.properties +12 -4
  291. package/src/sap/fe/core/messagebundle_it.properties +8 -0
  292. package/src/sap/fe/core/messagebundle_iw.properties +8 -0
  293. package/src/sap/fe/core/messagebundle_ja.properties +8 -0
  294. package/src/sap/fe/core/messagebundle_kk.properties +8 -0
  295. package/src/sap/fe/core/messagebundle_ko.properties +8 -0
  296. package/src/sap/fe/core/messagebundle_lt.properties +8 -0
  297. package/src/sap/fe/core/messagebundle_lv.properties +8 -0
  298. package/src/sap/fe/core/messagebundle_mk.properties +8 -0
  299. package/src/sap/fe/core/messagebundle_ms.properties +8 -0
  300. package/src/sap/fe/core/messagebundle_nl.properties +16 -8
  301. package/src/sap/fe/core/messagebundle_no.properties +8 -0
  302. package/src/sap/fe/core/messagebundle_pl.properties +8 -0
  303. package/src/sap/fe/core/messagebundle_pt.properties +8 -0
  304. package/src/sap/fe/core/messagebundle_pt_PT.properties +8 -0
  305. package/src/sap/fe/core/messagebundle_ro.properties +8 -0
  306. package/src/sap/fe/core/messagebundle_ru.properties +8 -0
  307. package/src/sap/fe/core/messagebundle_sh.properties +8 -0
  308. package/src/sap/fe/core/messagebundle_sk.properties +8 -0
  309. package/src/sap/fe/core/messagebundle_sl.properties +8 -0
  310. package/src/sap/fe/core/messagebundle_sr.properties +8 -0
  311. package/src/sap/fe/core/messagebundle_sv.properties +8 -0
  312. package/src/sap/fe/core/messagebundle_th.properties +12 -4
  313. package/src/sap/fe/core/messagebundle_tr.properties +8 -0
  314. package/src/sap/fe/core/messagebundle_uk.properties +10 -2
  315. package/src/sap/fe/core/messagebundle_vi.properties +8 -0
  316. package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -0
  317. package/src/sap/fe/core/messagebundle_zh_TW.properties +8 -0
  318. package/src/sap/fe/core/operationsHelper.js +22 -7
  319. package/src/sap/fe/core/operationsHelper.ts +24 -5
  320. package/src/sap/fe/core/rootView/Fcl.controller.js +7 -27
  321. package/src/sap/fe/core/rootView/Fcl.controller.ts +0 -18
  322. package/src/sap/fe/core/rootView/NavContainer.controller.js +7 -12
  323. package/src/sap/fe/core/rootView/NavContainer.controller.ts +0 -5
  324. package/src/sap/fe/core/rootView/RootViewBaseController.js +10 -24
  325. package/src/sap/fe/core/rootView/RootViewBaseController.ts +3 -16
  326. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
  327. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +3 -3
  328. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +4 -4
  329. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +3 -3
  330. package/src/sap/fe/core/services/ContextSharingServiceFactory.js +3 -4
  331. package/src/sap/fe/core/services/ContextSharingServiceFactory.ts +0 -1
  332. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +13 -20
  333. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +11 -17
  334. package/src/sap/fe/core/services/NavigationServiceFactory.js +11 -21
  335. package/src/sap/fe/core/services/NavigationServiceFactory.ts +4 -17
  336. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
  337. package/src/sap/fe/core/services/RoutingServiceFactory.js +7 -19
  338. package/src/sap/fe/core/services/RoutingServiceFactory.ts +0 -12
  339. package/src/sap/fe/core/services/ShellServicesFactory.js +8 -44
  340. package/src/sap/fe/core/services/ShellServicesFactory.ts +1 -41
  341. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +19 -60
  342. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +14 -57
  343. package/src/sap/fe/core/services/TelemetryServiceFactory.js +6 -14
  344. package/src/sap/fe/core/services/TelemetryServiceFactory.ts +2 -10
  345. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +17 -7
  346. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +17 -3
  347. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +11 -24
  348. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +0 -19
  349. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +3 -31
  350. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +0 -27
  351. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +1 -4
  352. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.ts +0 -3
  353. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +7 -7
  354. package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
  355. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
  356. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
  357. package/src/sap/fe/core/support/CommonHelper.js +4 -1
  358. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  359. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
  360. package/src/sap/fe/core/templating/ActionHelper.js +1 -2
  361. package/src/sap/fe/core/templating/ActionHelper.ts +0 -1
  362. package/src/sap/fe/core/templating/CommonFormatters.js +1 -2
  363. package/src/sap/fe/core/templating/CommonFormatters.ts +0 -1
  364. package/src/sap/fe/core/templating/CriticalityFormatters.js +1 -6
  365. package/src/sap/fe/core/templating/CriticalityFormatters.ts +0 -5
  366. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -2
  367. package/src/sap/fe/core/templating/DataFieldFormatters.ts +0 -1
  368. package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -18
  369. package/src/sap/fe/core/templating/DataModelPathHelper.ts +0 -17
  370. package/src/sap/fe/core/templating/DisplayModeFormatter.js +6 -1
  371. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -4
  372. package/src/sap/fe/core/templating/EntitySetHelper.ts +0 -3
  373. package/src/sap/fe/core/templating/EntityTypeHelper.js +4 -5
  374. package/src/sap/fe/core/templating/EntityTypeHelper.ts +3 -4
  375. package/src/sap/fe/core/templating/FieldControlHelper.js +4 -9
  376. package/src/sap/fe/core/templating/FieldControlHelper.ts +3 -9
  377. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  378. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  379. package/src/sap/fe/core/templating/PropertyHelper.js +1 -31
  380. package/src/sap/fe/core/templating/PropertyHelper.ts +0 -30
  381. package/src/sap/fe/core/templating/SemanticObjectHelper.js +1 -7
  382. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +0 -6
  383. package/src/sap/fe/core/templating/UIFormatters.js +18 -14
  384. package/src/sap/fe/core/templating/UIFormatters.ts +30 -18
  385. package/src/sap/fe/core/type/Date.js +3 -6
  386. package/src/sap/fe/core/type/Date.ts +0 -3
  387. package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -3
  388. package/src/sap/fe/core/type/EDM.js +1 -1
  389. package/src/sap/fe/core/type/Email.js +3 -3
  390. package/src/sap/fe/core/type/FiscalDate.js +3 -9
  391. package/src/sap/fe/core/type/FiscalDate.ts +0 -6
  392. package/src/sap/fe/core/type/InputMask.js +3 -7
  393. package/src/sap/fe/core/type/InputMask.ts +0 -4
@@ -18,7 +18,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
18
18
 
19
19
  /**
20
20
  * Static functions for the draft programming model
21
- *
22
21
  * @namespace
23
22
  * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
24
23
  * @since 1.54.0
@@ -26,7 +25,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
26
25
 
27
26
  /**
28
27
  * Determines the action name for a draft operation.
29
- *
30
28
  * @param oContext The context that should be bound to the operation
31
29
  * @param sOperation The operation name
32
30
  * @returns The name of the draft operation
@@ -39,7 +37,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
39
37
  }
40
38
  /**
41
39
  * Creates an operation context binding for the given context and operation.
42
- *
43
40
  * @param oContext The context that should be bound to the operation
44
41
  * @param sOperation The operation (action or function import)
45
42
  * @param oOptions Options to create the operation context
@@ -51,7 +48,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
51
48
  }
52
49
  /**
53
50
  * Determines the return type for a draft operation.
54
- *
55
51
  * @param oContext The context that should be bound to the operation
56
52
  * @param sOperation The operation name
57
53
  * @returns The return type of the draft operation
@@ -64,7 +60,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
64
60
  }
65
61
  /**
66
62
  * Check if optional draft prepare action exists.
67
- *
68
63
  * @param oContext The context that should be bound to the operation
69
64
  * @returns True if a a prepare action exists
70
65
  */
@@ -73,7 +68,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
73
68
  }
74
69
  /**
75
70
  * Creates a new draft from an active document.
76
- *
77
71
  * @param oContext Context for which the action should be performed
78
72
  * @param bPreserveChanges If true - existing changes from another user that are not locked are preserved and an error is sent from the backend, otherwise false - existing changes from another user that are not locked are overwritten</li>
79
73
  * @param oView If true - existing changes from another
@@ -108,7 +102,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
108
102
  /**
109
103
  * Executes the validation of the draft. The PrepareAction is triggered if the messages are annotated and entitySet gets a PreparationAction annotated.
110
104
  * If the operation succeeds and operation doesn't get a return type (RAP system) the messages are requested.
111
- *
112
105
  * @param context Context for which the PrepareAction should be performed
113
106
  * @param appComponent The AppComponent
114
107
  * @param ignoreETag If set to true, ETags are ignored when executing the action
@@ -141,7 +134,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
141
134
 
142
135
  /**
143
136
  * Activates a draft document. The draft will replace the sibling entity and will be deleted by the back end.
144
- *
145
137
  * @param oContext Context for which the action should be performed
146
138
  * @param oAppComponent The AppComponent
147
139
  * @param messageHandler
@@ -193,7 +185,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
193
185
 
194
186
  /**
195
187
  * Gets the supported message property path on the PrepareAction for a context.
196
- *
197
188
  * @param context Context to be checked
198
189
  * @returns Path to the message
199
190
  */
@@ -205,7 +196,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
205
196
 
206
197
  /**
207
198
  * Gets the supported message property path for a context.
208
- *
209
199
  * @param context Context to be checked
210
200
  * @returns Path to the message
211
201
  */
@@ -219,7 +209,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
219
209
 
220
210
  /**
221
211
  * Execute a preparation action.
222
- *
223
212
  * @param oContext Context for which the action should be performed
224
213
  * @param groupId The optional batch group in which we want to execute the operation
225
214
  * @param bMessages If set to true, the PREPARE action retrieves SAP_Messages
@@ -248,7 +237,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
248
237
 
249
238
  /**
250
239
  * Requests the messages if annotated for a given context.
251
- *
252
240
  * @param oContext Context for which the messages shall be requested
253
241
  * @param oSideEffectsService Service for the SideEffects on SAP Fiori elements
254
242
  * @returns Promise which is resolved once messages were requested
@@ -262,7 +250,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
262
250
  }
263
251
  /**
264
252
  * Executes discard of a draft function using HTTP Post.
265
- *
266
253
  * @param oContext Context for which the action should be performed
267
254
  * @param messageHandler The message handler controller extension
268
255
  * @param oAppComponent App Component
@@ -290,7 +277,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
290
277
  /**
291
278
  * This method creates a sibling context for a subobject page and calculates a sibling path for all intermediate paths
292
279
  * between the object page and the subobject page.
293
- *
294
280
  * @param rootCurrentContext The context for the root of the draft
295
281
  * @param rightmostCurrentContext The context of the subobject page
296
282
  * @param rootContextInfo The context info of root of the draft
@@ -374,7 +360,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
374
360
  } else {
375
361
  siblingPath = canonicalPath; // To manage parametrized entities
376
362
  }
377
-
378
363
  newPaths.unshift(siblingPath);
379
364
  });
380
365
  return {
@@ -400,7 +385,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
400
385
  * Creates a draft document from an existing document.
401
386
  *
402
387
  * The function supports several hooks as there is a certain coreography defined.
403
- *
404
388
  * @param oContext Context of the active document for the new draft
405
389
  * @param oAppComponent The AppComponent
406
390
  * @param mParameters The parameters
@@ -416,7 +400,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
416
400
 
417
401
  /**
418
402
  * Overwrite the existing change.
419
- *
420
403
  * @param response Context of the active document for the new draft or the error retrieved
421
404
  * @returns Resolves with result of {@link sap.fe.core.actions#executeDraftEditAction}
422
405
  */
@@ -487,7 +470,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
487
470
  * Creates an active document from a draft document.
488
471
  *
489
472
  * The function supports several hooks as there is a certain choreography defined.
490
- *
491
473
  * @param oContext Context of the active document for the new draft
492
474
  * @param oAppComponent The AppComponent
493
475
  * @param mParameters The parameters
@@ -543,8 +525,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
543
525
 
544
526
  /**
545
527
  * Display the confirmation dialog box after pressing the edit button of an object page with unsaved changes.
546
- *
547
- *
548
528
  * @param sUnsavedChangesMsg Dialog box message informing the user that if he starts editing, the previous unsaved changes will be lost
549
529
  * @param oContext Context of the active document for the new draft
550
530
  * @returns Promise resolves
@@ -585,7 +565,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
585
565
  /**
586
566
  * HTTP POST call when DraftAction is present for Draft Delete; HTTP DELETE call when there is no DraftAction
587
567
  * and Active Instance always uses DELETE.
588
- *
589
568
  * @param oContext Context of the document to be discarded
590
569
  * @param messageHandler The message handler controller extension
591
570
  * @param oAppComponent Context of the document to be discarded
@@ -641,4 +620,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
641
620
  };
642
621
  return draft;
643
622
  }, false);
644
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkcmFmdE9wZXJhdGlvbnMiLCJFRElUIiwiQUNUSVZBVElPTiIsIkRJU0NBUkQiLCJQUkVQQVJFIiwiZ2V0QWN0aW9uTmFtZSIsIm9Db250ZXh0Iiwic09wZXJhdGlvbiIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiY3JlYXRlT3BlcmF0aW9uIiwib09wdGlvbnMiLCJzT3BlcmF0aW9uTmFtZSIsImJpbmRDb250ZXh0IiwiZ2V0UmV0dXJuVHlwZSIsImhhc1ByZXBhcmVBY3Rpb24iLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiYlByZXNlcnZlQ2hhbmdlcyIsIm9WaWV3IiwiZ3JvdXBJZCIsIm1lc3NhZ2VIYW5kbGVyIiwib3ZlcndyaXRlQ2hhbmdlIiwiZ2V0UHJvcGVydHkiLCIkJGluaGVyaXRFeHBhbmRTZWxlY3QiLCJvT3BlcmF0aW9uIiwiZHJhZnQiLCJzZXRQYXJhbWV0ZXIiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0UmVzb3VyY2VNb2RlbCIsInNBY3Rpb25OYW1lIiwiZ2V0VGV4dCIsIm9FZGl0UHJvbWlzZSIsImV4ZWN1dGUiLCJ1bmRlZmluZWQiLCJvcGVyYXRpb25zSGVscGVyIiwiZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkIiwiYmluZCIsImxhYmVsIiwibW9kZWwiLCJnZXRCaW5kaW5nIiwiaXNBIiwic3VibWl0QmF0Y2giLCJFcnJvciIsImV4ZWN1dGVEcmFmdFZhbGlkYXRpb24iLCJjb250ZXh0IiwiYXBwQ29tcG9uZW50IiwiaWdub3JlRVRhZyIsIk1vZGVsSGVscGVyIiwiZ2V0TWVzc2FnZXNQYXRoIiwiaXNLZWVwQWxpdmUiLCJyZXF1ZXN0T2JqZWN0Iiwib3BlcmF0aW9uIiwiZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24iLCJnZXRVcGRhdGVHcm91cElkIiwicmVxdWVzdE1lc3NhZ2VzIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZXJyb3IiLCJMb2ciLCJleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uIiwib0FwcENvbXBvbmVudCIsInNHcm91cElkIiwiYkhhc1ByZXBhcmVBY3Rpb24iLCJiSWdub3JlRXRhZyIsImUiLCJhY3Rpb25OYW1lIiwib1NpZGVFZmZlY3RzU2VydmljZSIsIm9CaW5kaW5nUGFyYW1ldGVycyIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJhVGFyZ2V0UGF0aHMiLCJwYXRoRXhwcmVzc2lvbnMiLCJsZW5ndGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJvRXJyb3IiLCJnZXRNZXNzYWdlUGF0aEZvclByZXBhcmUiLCJnZXRNZXNzYWdlUGF0aEZvckNvbnRleHQiLCJtZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0IiwiY29udmVydGVkQ29udGV4dCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsIm1lc3NhZ2VzIiwidGFyZ2V0RW50aXR5VHlwZSIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiTWVzc2FnZXMiLCJpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsInBhdGgiLCJiTWVzc2FnZXMiLCJzTWVzc2FnZXNQYXRoIiwiJHNlbGVjdCIsImdldEdyb3VwSWQiLCJ0aGVuIiwiY2F0Y2giLCJleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uIiwiYkVuYWJsZVN0cmljdEhhbmRsaW5nIiwib0Rpc2NhcmRPcGVyYXRpb24iLCJvRGlzY2FyZFByb21pc2UiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJyb290Q29udGV4dEluZm8iLCJzdGFydHNXaXRoIiwiYWRkaXRpb25hbFBhdGgiLCJyZXBsYWNlIiwic2VnbWVudHMiLCJzdWJzdHJpbmciLCJzcGxpdCIsInVuc2hpZnQiLCJvbGRQYXRocyIsIm5ld1BhdGhzIiwiY3VycmVudFBhdGgiLCJwYXRocyIsInJvb3RTaWJsaW5nUGF0aFByb21pc2UiLCJzaGlmdCIsImNhbm9uaWNhbFBhdGhQcm9taXNlcyIsIm1hcCIsInNlZ21lbnQiLCJlbmRzV2l0aCIsInNpYmxpbmdDb250ZXh0IiwiJCRncm91cElkIiwiZ2V0Qm91bmRDb250ZXh0IiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNhbm9uaWNhbFBhdGhzIiwiYWxsIiwicm9vdFNpYmxpbmdQYXRoIiwicHVzaCIsInNpYmxpbmdQYXRoIiwiZm9yRWFjaCIsImNhbm9uaWNhbFBhdGgiLCJpbmRleCIsIm5hdmlnYXRpb24iLCJrZXlzIiwidGFyZ2V0Q29udGV4dCIsInBhdGhNYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm1QYXJhbWV0ZXJzIiwibVBhcmFtIiwiYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3ciLCJyZXNwb25zZSIsImRyYWZ0RGF0YUNvbnRleHQiLCJkcmFmdEFkbWluRGF0YSIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJzSW5mbyIsIkluUHJvY2Vzc0J5VXNlckRlc2NyaXB0aW9uIiwiSW5Qcm9jZXNzQnlVc2VyIiwic0VudGl0eVNldCIsImdldFZpZXdEYXRhIiwiZW50aXR5U2V0Iiwic0xvY2tlZEJ5VXNlck1zZyIsIk1lc3NhZ2VCb3giLCJDcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24iLCJDcmVhdGVkQnlVc2VyIiwic1Vuc2F2ZWRDaGFuZ2VzTXNnIiwic2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94IiwibWVzc2FnZSIsIm9EcmFmdENvbnRleHQiLCJvUmVzcG9uc2UiLCJzdGF0dXMiLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsInNpYmxpbmdJbmZvIiwiQ29tbW9uVXRpbHMiLCJ3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZCIsImNhbmNlbGVkIiwic0VkaXRBY3Rpb25OYW1lIiwib1NpZGVFZmZlY3RzIiwidHJpZ2dlckFjdGlvbnMiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbiIsImFjdGl2YXRlRG9jdW1lbnQiLCJiRXhlY3V0ZSIsImZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudCIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJzQmF0Y2hHcm91cCIsImlnbm9yZUV0YWciLCJoYXNQZW5kaW5nQ2hhbmdlcyIsIm9QcmVwYXJlUHJvbWlzZSIsIm9BY3RpdmF0ZVByb21pc2UiLCJ2YWx1ZXMiLCJlcnIiLCJkYXRhIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwiZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQiLCJsb2NhbEkxOG5SZWYiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJyZWplY3QiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwidGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidHlwZSIsInByZXNzIiwiY2xvc2UiLCJlbmRCdXR0b24iLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsImFkZFN0eWxlQ2xhc3MiLCJvcGVuIiwiZGVsZXRlRHJhZnQiLCJzRGlzY2FyZEFjdGlvbiIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiaXNJbmFjdGl2ZSIsInJlc2V0Q2hhbmdlcyIsImRlbGV0ZSIsImlzRHJhZnRSb290IiwidGFyZ2V0RW50aXR5U2V0IiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJkcmFmdERhdGFMb3NzUG9wdXAiLCJzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24iLCJOYXZpZ2F0aW9uVHlwZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiZHJhZnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IGRyYWZ0RGF0YUxvc3NQb3B1cCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnREYXRhTG9zc1BvcHVwXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHR5cGUgeyBTaWRlRWZmZWN0c1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHRFcnJvclR5cGUgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCIuLi8uLi9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCIuLi8uLi9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgb3BlcmF0aW9uc0hlbHBlciBmcm9tIFwiLi4vLi4vb3BlcmF0aW9uc0hlbHBlclwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcIi4uL01lc3NhZ2VIYW5kbGVyXCI7XG5cbmV4cG9ydCB0eXBlIFNpYmxpbmdJbmZvcm1hdGlvbiA9IHtcblx0dGFyZ2V0Q29udGV4dDogQ29udGV4dDtcblx0cGF0aE1hcHBpbmc6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdO1xufTtcblxuZXhwb3J0IHR5cGUgUm9vdENvbnRleHRJbmZvID0ge1xuXHRyb290U2libGluZ1BhdGhQcm9taXNlOiBQcm9taXNlPENvbnRleHQgfCB1bmRlZmluZWQ+O1xufTtcblxuZXhwb3J0IHR5cGUgQmluZENvbnRleHRQYXJhbWV0ZXJzID0ge1xuXHQvKipcblx0ICogVGhlIHZhbHVlIGZvciB0aGUgXCI1LjEuMiBTeXN0ZW0gUXVlcnkgT3B0aW9uICRleHBhbmRcIiBvciBhbiBvYmplY3Qgd2hpY2ggZGV0ZXJtaW5lcyB0aGF0IHZhbHVlLiBUaGUgb2JqZWN0XG5cdCAqIGlzIGEgbWFwIGZyb20gZXhwYW5kIHBhdGggdG8gZXhwYW5kIG9wdGlvbnMsIHdoZXJlIHRoZSBvcHRpb25zIGFyZSBhZ2FpbiBtYXBzIG9mIHN5c3RlbSBxdWVyeSBvcHRpb25zLFxuXHQgKiB0eXBpY2FsbHkgd2l0aCBzdHJpbmcgdmFsdWVzLiAkY291bnQgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgYSBgYm9vbGVhbmAgdmFsdWUsICRleHBhbmQgY2FuIHJlY3Vyc2l2ZWx5XG5cdCAqIGJlIGdpdmVuIGFzIGEgbWFwLCAkbGV2ZWxzIGNhbiBhbHNvIGJlIGdpdmVuIGFzIGEgYG51bWJlcmAgdmFsdWUsIGFuZCAkc2VsZWN0IGNhbiBhbHNvIGJlIGdpdmVuIGFzIGFuXG5cdCAqIGFycmF5IChidXQgd2l0aG91dCBuYXZpZ2F0aW9uIHBhdGhzKS4gQW4gZW1wdHkgbWFwIGNhbiBhbHNvIGJlIGdpdmVuIGFzIGBudWxsYCBvciBgdHJ1ZWAuIFNlZSBhbHNvIHtAbGluayBodHRwczovL3VpNS5zYXAuY29tLyMvdG9waWMvMWFiNGY2MmRlNmFiNDY3MDk2YTJhOThiMzYzYTEzNzMgUGFyYW1ldGVyc30uXG5cdCAqL1xuXHQkZXhwYW5kPzogc3RyaW5nIHwgb2JqZWN0O1xuXHQvKipcblx0ICogQSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvciBhbiBhcnJheSBvZiBpdGVtcyB3aGljaCBkZXRlcm1pbmUgdGhlIHZhbHVlIGZvciB0aGUgXCI1LjEuMyBTeXN0ZW0gUXVlcnkgT3B0aW9uXG5cdCAqICRzZWxlY3RcIi4gU2luY2UgMS43NS4wLCB3aGVuIHVzaW5nIHRoZSBcImF1dG9FeHBhbmRTZWxlY3RcIiBtb2RlbCBwYXJhbWV0ZXIgKHNlZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWwjY29uc3RydWN0b3J9KSxcblx0ICogcGF0aHMgd2l0aCBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgY2FuIGJlIGluY2x1ZGVkIGFuZCB3aWxsIGNvbnRyaWJ1dGUgdG8gdGhlIFwiNS4xLjIgU3lzdGVtIFF1ZXJ5IE9wdGlvblxuXHQgKiAkZXhwYW5kXCIuXG5cdCAqL1xuXHQkc2VsZWN0Pzogc3RyaW5nO1xuXHQvKipcblx0ICogV2hldGhlciBhIGJpbmRpbmcgcmVsYXRpdmUgdG8gYW4ge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSB1c2VzIHRoZSBjYW5vbmljYWwgcGF0aCBjb21wdXRlZFxuXHQgKiBmcm9tIGl0cyBjb250ZXh0J3MgcGF0aCBmb3IgZGF0YSBzZXJ2aWNlIHJlcXVlc3RzOyBvbmx5IHRoZSB2YWx1ZSBgdHJ1ZWAgaXMgYWxsb3dlZC5cblx0ICovXG5cdCQkY2Fub25pY2FsUGF0aD86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgKipyZWFkKiogcmVxdWVzdHMgdHJpZ2dlcmVkIGJ5IHRoaXMgYmluZGluZzsgaWYgbm90IHNwZWNpZmllZCwgZWl0aGVyIHRoZVxuXHQgKiBwYXJlbnQgYmluZGluZydzIGdyb3VwIElEIChpZiB0aGUgYmluZGluZyBpcyByZWxhdGl2ZSkgb3IgdGhlIG1vZGVsJ3MgZ3JvdXAgSUQgaXMgdXNlZCwgc2VlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbCNjb25zdHJ1Y3Rvcn0uXG5cdCAqIFZhbGlkIHZhbHVlcyBhcmUgYHVuZGVmaW5lZGAsICckYXV0bycsICckYXV0by4qJywgJyRkaXJlY3QnIG9yIGFwcGxpY2F0aW9uIGdyb3VwIElEcyBhcyBzcGVjaWZpZWQgaW5cblx0ICoge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfS5cblx0ICovXG5cdCQkZ3JvdXBJZD86IHN0cmluZztcblx0LyoqXG5cdCAqIEZvciBvcGVyYXRpb24gYmluZGluZ3Mgb25seTogV2hldGhlciAkZXhwYW5kIGFuZCAkc2VsZWN0IGZyb20gdGhlIHBhcmVudCBiaW5kaW5nIGFyZSB1c2VkIGluIHRoZSByZXF1ZXN0XG5cdCAqIHNlbnQgb24ge0BsaW5rICNleGVjdXRlfS4gSWYgc2V0IHRvIGB0cnVlYCwgdGhlIGJpbmRpbmcgbXVzdCBub3Qgc2V0IHRoZSAkZXhwYW5kIGl0c2VsZiwgdGhlIG9wZXJhdGlvblxuXHQgKiBtdXN0IGJlIGJvdW5kLCBhbmQgdGhlIHJldHVybiB2YWx1ZSBhbmQgdGhlIGJpbmRpbmcgcGFyYW1ldGVyIG11c3QgYmVsb25nIHRvIHRoZSBzYW1lIGVudGl0eSBzZXQuXG5cdCAqL1xuXHQkJGluaGVyaXRFeHBhbmRTZWxlY3Q/OiBib29sZWFuO1xuXHQvKipcblx0ICogV2hldGhlciB0aGUgYmluZGluZyBhbHdheXMgdXNlcyBhbiBvd24gc2VydmljZSByZXF1ZXN0IHRvIHJlYWQgaXRzIGRhdGE7IG9ubHkgdGhlIHZhbHVlIGB0cnVlYCBpcyBhbGxvd2VkLlxuXHQgKi9cblx0JCRvd25SZXF1ZXN0PzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFdoZXRoZXIgaW1wbGljaXQgbG9hZGluZyBvZiBzaWRlIGVmZmVjdHMgdmlhIFBBVENIIHJlcXVlc3RzIGlzIHN3aXRjaGVkIG9mZjsgb25seSB0aGUgdmFsdWUgYHRydWVgIGlzXG5cdCAqIGFsbG93ZWQuIFRoaXMgc2V0cyB0aGUgcHJlZmVyZW5jZSBcInJldHVybj1taW5pbWFsXCIgYW5kIHJlcXVpcmVzIHRoZSBzZXJ2aWNlIHRvIHJldHVybiBhbiBFVGFnIGhlYWRlclxuXHQgKiBmb3IgXCIyMDQgTm8gQ29udGVudFwiIHJlc3BvbnNlcy4gSWYgbm90IHNwZWNpZmllZCwgdGhlIHZhbHVlIG9mIHRoZSBwYXJlbnQgYmluZGluZyBpcyB1c2VkLlxuXHQgKi9cblx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgKip1cGRhdGUqKiByZXF1ZXN0cyB0cmlnZ2VyZWQgYnkgdGhpcyBiaW5kaW5nOyBpZiBub3Qgc3BlY2lmaWVkLCBlaXRoZXIgdGhlXG5cdCAqIHBhcmVudCBiaW5kaW5nJ3MgdXBkYXRlIGdyb3VwIElEIChpZiB0aGUgYmluZGluZyBpcyByZWxhdGl2ZSkgb3IgdGhlIG1vZGVsJ3MgdXBkYXRlIGdyb3VwIElEIGlzIHVzZWQsXG5cdCAqIHNlZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWwjY29uc3RydWN0b3J9LiBGb3IgdmFsaWQgdmFsdWVzLCBzZWUgcGFyYW1ldGVyIFwiJCRncm91cElkXCIuXG5cdCAqL1xuXHQkJHVwZGF0ZUdyb3VwSWQ/OiBzdHJpbmc7XG59O1xuXG4vKiBDb25zdGFudHMgZm9yIGRyYWZ0IG9wZXJhdGlvbnMgKi9cbmNvbnN0IGRyYWZ0T3BlcmF0aW9ucyA9IHtcblx0RURJVDogXCJFZGl0QWN0aW9uXCIsXG5cdEFDVElWQVRJT046IFwiQWN0aXZhdGlvbkFjdGlvblwiLFxuXHRESVNDQVJEOiBcIkRpc2NhcmRBY3Rpb25cIixcblx0UFJFUEFSRTogXCJQcmVwYXJhdGlvbkFjdGlvblwiXG59O1xuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgZm9yIHRoZSBkcmFmdCBwcm9ncmFtbWluZyBtb2RlbFxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41NC4wXG4gKi9cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBhY3Rpb24gbmFtZSBmb3IgYSBkcmFmdCBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBzT3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gbmFtZVxuICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIGRyYWZ0IG9wZXJhdGlvblxuICovXG5mdW5jdGlvbiBnZXRBY3Rpb25OYW1lKG9Db250ZXh0OiBDb250ZXh0LCBzT3BlcmF0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290LyR7c09wZXJhdGlvbn1gKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBvcGVyYXRpb24gY29udGV4dCBiaW5kaW5nIGZvciB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIChhY3Rpb24gb3IgZnVuY3Rpb24gaW1wb3J0KVxuICogQHBhcmFtIG9PcHRpb25zIE9wdGlvbnMgdG8gY3JlYXRlIHRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHJldHVybnMgVGhlIGNvbnRleHQgYmluZGluZyBvZiB0aGUgYm91bmQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dDogQ29udGV4dCwgc09wZXJhdGlvbjogc3RyaW5nLCBvT3B0aW9ucz86IEJpbmRDb250ZXh0UGFyYW1ldGVycyk6IE9EYXRhQ29udGV4dEJpbmRpbmcge1xuXHRjb25zdCBzT3BlcmF0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIHNPcGVyYXRpb24pO1xuXG5cdHJldHVybiBvQ29udGV4dC5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KGAke3NPcGVyYXRpb25OYW1lfSguLi4pYCwgb0NvbnRleHQsIG9PcHRpb25zKTtcbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgcmV0dXJuIHR5cGUgZm9yIGEgZHJhZnQgb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIG5hbWVcbiAqIEByZXR1cm5zIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldFJldHVyblR5cGUob0NvbnRleHQ6IENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZyk6IHVua25vd24ge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290LyR7c09wZXJhdGlvbn0vJFJldHVyblR5cGVgKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgb3B0aW9uYWwgZHJhZnQgcHJlcGFyZSBhY3Rpb24gZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcmV0dXJucyBUcnVlIGlmIGEgYSBwcmVwYXJlIGFjdGlvbiBleGlzdHNcbiAqL1xuZnVuY3Rpb24gaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gISFnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZHJhZnQgZnJvbSBhbiBhY3RpdmUgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIGJQcmVzZXJ2ZUNoYW5nZXMgSWYgdHJ1ZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyIHVzZXIgdGhhdCBhcmUgbm90IGxvY2tlZCBhcmUgcHJlc2VydmVkIGFuZCBhbiBlcnJvciBpcyBzZW50IGZyb20gdGhlIGJhY2tlbmQsIG90aGVyd2lzZSBmYWxzZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyIHVzZXIgdGhhdCBhcmUgbm90IGxvY2tlZCBhcmUgb3ZlcndyaXR0ZW48L2xpPlxuICogQHBhcmFtIG9WaWV3IElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlclxuICogQHBhcmFtIGdyb3VwSWQgVGhlIGJhdGNoIGdyb3VwSWQgZm9yIHBvc3QgY2FsbCBvZiBlZGl0IGFjdGlvblxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyICBUaGUgbWVzc2FnZSBoYW5kbGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG4gKiBAcGFyYW0gb3ZlcndyaXRlQ2hhbmdlXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uKFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0YlByZXNlcnZlQ2hhbmdlczogYm9vbGVhbixcblx0b1ZpZXc6IFZpZXcsXG5cdGdyb3VwSWQ6IHN0cmluZyxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRvdmVyd3JpdGVDaGFuZ2U/OiBib29sZWFuXG4pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0aWYgKG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvT3B0aW9ucyA9IHsgJCRpbmhlcml0RXhwYW5kU2VsZWN0OiB0cnVlIH07XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGRyYWZ0LmNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQsIG9PcHRpb25zKTtcblx0XHRvT3BlcmF0aW9uLnNldFBhcmFtZXRlcihcIlByZXNlcnZlQ2hhbmdlc1wiLCBiUHJlc2VydmVDaGFuZ2VzKTtcblxuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG9WaWV3KTtcblx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0VESVRcIik7XG5cdFx0Ly9JZiB0aGUgY29udGV4dCBpcyBjb21pbmcgZnJvbSBhIGxpc3QgYmluZGluZyB3ZSBwYXNzIHRoZSBmbGFnIHRydWUgdG8gcmVwbGFjZSB0aGUgY29udGV4dCBieSB0aGUgYWN0aXZlIG9uZVxuXHRcdGNvbnN0IG9FZGl0UHJvbWlzZSA9IG9PcGVyYXRpb24uZXhlY3V0ZShcblx0XHRcdGdyb3VwSWQsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRvcGVyYXRpb25zSGVscGVyLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKFxuXHRcdFx0XHRkcmFmdCxcblx0XHRcdFx0Z3JvdXBJZCxcblx0XHRcdFx0eyBsYWJlbDogc0FjdGlvbk5hbWUsIG1vZGVsOiBvQ29udGV4dC5nZXRNb2RlbCgpIH0sXG5cdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHR1bmRlZmluZWRcblx0XHRcdCksXG5cdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIilcblx0XHQpO1xuXHRcdGlmIChvdmVyd3JpdGVDaGFuZ2UpIHtcblx0XHRcdG9PcGVyYXRpb24uZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChncm91cElkKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9FZGl0UHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2Fubm90IGVkaXQgdGhpcyBkcmFmdCBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBkcmFmdC4gVGhlIFByZXBhcmVBY3Rpb24gaXMgdHJpZ2dlcmVkIGlmIHRoZSBtZXNzYWdlcyBhcmUgYW5ub3RhdGVkIGFuZCBlbnRpdHlTZXQgZ2V0cyBhIFByZXBhcmF0aW9uQWN0aW9uIGFubm90YXRlZC5cbiAqIElmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgYW5kIG9wZXJhdGlvbiBkb2Vzbid0IGdldCBhIHJldHVybiB0eXBlIChSQVAgc3lzdGVtKSB0aGUgbWVzc2FnZXMgYXJlIHJlcXVlc3RlZC5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgUHJlcGFyZUFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBpZ25vcmVFVGFnIElmIHNldCB0byB0cnVlLCBFVGFncyBhcmUgaWdub3JlZCB3aGVuIGV4ZWN1dGluZyB0aGUgYWN0aW9uXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnNcbiAqICAtIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb24gaWYgdGhlIGFjdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZXhlY3V0ZWRcbiAqICAtIHZvaWQgaWYgdGhlIGFjdGlvbiBoYXMgZmFpbGVkXG4gKiAgLSB1bmRlZmluZWQgaWYgdGhlIGFjdGlvbiBoYXMgbm90IGJlZW4gdHJpZ2dlcmVkIHNpbmNlIHRoZSBwcmVyZXF1aXNpdGVzIGFyZSBub3QgbWV0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVEcmFmdFZhbGlkYXRpb24oXG5cdGNvbnRleHQ6IENvbnRleHQsXG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRpZ25vcmVFVGFnOiBib29sZWFuXG4pOiBQcm9taXNlPE9EYXRhQ29udGV4dEJpbmRpbmcgfCB2b2lkIHwgdW5kZWZpbmVkPiB7XG5cdGlmIChNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgoY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLCBjb250ZXh0LmdldFBhdGgoKSkgJiYgZHJhZnQuaGFzUHJlcGFyZUFjdGlvbihjb250ZXh0KSkge1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoIWlnbm9yZUVUYWcgJiYgIWNvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0XHQvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBlbnRpdHkgcmVsYXRlZCB0byB0aGUgY29udGV4dCB0byBwb3N0IHRoZSBhY3Rpb24gd2l0aCB0aGUgSWYtTWF0Y2ggaGVhZGVyXG5cdFx0XHRcdC8vIFNvbWUgdHJpZ2dlcnMgKGVudGVyIG9uIHRhYmxlKSBjYW4gZ2VuZXJhdGUgYSBwcm9taXNlIGluIHRoZSBjYWNoZSBzbyBpZiB3ZSBkb24ndCB3YWl0IGZvciB0aGUgZW50aXR5XG5cdFx0XHRcdC8vIHRoZSBQT1NUIHdpbGwgYmUgc2VudCB3aXRob3V0IElmLU1hdGNoIGFuZCB3aWxsIGdlbmVyYXRlIGFuIGVycm9yIG9uIGJhY2tlbmQgc2lkZS5cblx0XHRcdFx0YXdhaXQgKGNvbnRleHQuZ2V0QmluZGluZygpIGFzIE9EYXRhQ29udGV4dEJpbmRpbmcpLnJlcXVlc3RPYmplY3QoXCJcIik7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvcGVyYXRpb24gPSBhd2FpdCBkcmFmdC5leGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihjb250ZXh0LCBjb250ZXh0LmdldFVwZGF0ZUdyb3VwSWQoKSwgdHJ1ZSwgaWdub3JlRVRhZyk7XG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBubyByZXR1cm5lZCBvcGVyYXRpb24gYnkgZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24gLT4gdGhlIGFjdGlvbiBoYXMgZmFpbGVkXG5cdFx0XHRpZiAob3BlcmF0aW9uICYmICFnZXRSZXR1cm5UeXBlKGNvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSkge1xuXHRcdFx0XHRyZXF1ZXN0TWVzc2FnZXMoY29udGV4dCwgYXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvcGVyYXRpb247XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVzc2FnZXNcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEFjdGl2YXRlcyBhIGRyYWZ0IGRvY3VtZW50LiBUaGUgZHJhZnQgd2lsbCByZXBsYWNlIHRoZSBzaWJsaW5nIGVudGl0eSBhbmQgd2lsbCBiZSBkZWxldGVkIGJ5IHRoZSBiYWNrIGVuZC5cbiAqXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcbiAqIEBwYXJhbSBbc0dyb3VwSWRdIFRoZSBvcHRpb25hbCBiYXRjaCBncm91cCBpbiB3aGljaCB0aGUgb3BlcmF0aW9uIGlzIHRvIGJlIGV4ZWN1dGVkXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdHNHcm91cElkPzogc3RyaW5nXG4pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0Y29uc3QgYkhhc1ByZXBhcmVBY3Rpb24gPSBoYXNQcmVwYXJlQWN0aW9uKG9Db250ZXh0KTtcblx0Ly8gQWNjb3JkaW5nIHRvIHRoZSBkcmFmdCBzcGVjIGlmIHRoZSBzZXJ2aWNlIGNvbnRhaW5zIGEgcHJlcGFyZSBhY3Rpb24gYW5kIHdlIHRyaWdnZXIgYm90aCBwcmVwYXJlIGFuZFxuXHQvLyBhY3RpdmF0ZSBpbiBvbmUgJGJhdGNoIHRoZSBhY3RpdmF0ZSBhY3Rpb24gaXMgY2FsbGVkIHdpdGggaUYtTWF0Y2g9KlxuXHRjb25zdCBiSWdub3JlRXRhZyA9IGJIYXNQcmVwYXJlQWN0aW9uO1xuXG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5BQ1RJVkFUSU9OLCB7ICQkaW5oZXJpdEV4cGFuZFNlbGVjdDogdHJ1ZSB9KTtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbChvQXBwQ29tcG9uZW50KTtcblx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfT1BfT0JKRUNUX1BBR0VfU0FWRVwiKTtcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGF3YWl0IG9PcGVyYXRpb24uZXhlY3V0ZShcblx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdGJJZ25vcmVFdGFnLFxuXHRcdFx0XHRzR3JvdXBJZFxuXHRcdFx0XHRcdD8gb3BlcmF0aW9uc0hlbHBlci5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChcblx0XHRcdFx0XHRcdFx0ZHJhZnQsXG5cdFx0XHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzQWN0aW9uTmFtZSwgbW9kZWw6IG9Db250ZXh0LmdldE1vZGVsKCkgfSxcblx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRcdHVuZGVmaW5lZFxuXHRcdFx0XHRcdCAgKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIilcblx0XHRcdCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0aWYgKGJIYXNQcmVwYXJlQWN0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IGFjdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSksXG5cdFx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCksXG5cdFx0XHRcdFx0b0JpbmRpbmdQYXJhbWV0ZXJzID0gb1NpZGVFZmZlY3RzU2VydmljZS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKGFjdGlvbk5hbWUsIG9Db250ZXh0KSxcblx0XHRcdFx0XHRhVGFyZ2V0UGF0aHMgPSBvQmluZGluZ1BhcmFtZXRlcnMgJiYgb0JpbmRpbmdQYXJhbWV0ZXJzLnBhdGhFeHByZXNzaW9ucztcblx0XHRcdFx0aWYgKGFUYXJnZXRQYXRocyAmJiBhVGFyZ2V0UGF0aHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0UGF0aHMsIG9Db250ZXh0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgcmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlKTtcblx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVzc2FnZXNcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgYWN0aXZhdGlvbiBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIEdldHMgdGhlIHN1cHBvcnRlZCBtZXNzYWdlIHByb3BlcnR5IHBhdGggb24gdGhlIFByZXBhcmVBY3Rpb24gZm9yIGEgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIFBhdGggdG8gdGhlIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZVBhdGhGb3JQcmVwYXJlKGNvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHQvLyBJZiB0aGVyZSBpcyBubyByZXR1cm4gcGFyYW1ldGVyLCBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVxdWVzdCBNZXNzYWdlcy5cblx0Ly8gUkFQIGRyYWZ0IHByZXBhcmUgaGFzIG5vIHJldHVybiBwYXJhbWV0ZXJcblx0cmV0dXJuIGdldFJldHVyblR5cGUoY29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpID8gZ2V0TWVzc2FnZVBhdGhGb3JDb250ZXh0KGNvbnRleHQpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHN1cHBvcnRlZCBtZXNzYWdlIHByb3BlcnR5IHBhdGggZm9yIGEgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIFBhdGggdG8gdGhlIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZVBhdGhGb3JDb250ZXh0KGNvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBtZXRhQ29udGV4dCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdGNvbnN0IGNvbnZlcnRlZENvbnRleHQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpO1xuXHRjb25zdCBtZXNzYWdlcyA9IGNvbnZlcnRlZENvbnRleHQudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/Lk1lc3NhZ2VzO1xuXHRyZXR1cm4gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24obWVzc2FnZXMpID8gbWVzc2FnZXMucGF0aCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBFeGVjdXRlIGEgcHJlcGFyYXRpb24gYWN0aW9uLlxuICpcbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBncm91cElkIFRoZSBvcHRpb25hbCBiYXRjaCBncm91cCBpbiB3aGljaCB3ZSB3YW50IHRvIGV4ZWN1dGUgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIGJNZXNzYWdlcyBJZiBzZXQgdG8gdHJ1ZSwgdGhlIFBSRVBBUkUgYWN0aW9uIHJldHJpZXZlcyBTQVBfTWVzc2FnZXNcbiAqIEBwYXJhbSBpZ25vcmVFVGFnIElmIHNldCB0byB0cnVlLCBFVGFnIGluZm9ybWF0aW9uIGlzIGlnbm9yZWQgd2hlbiB0aGUgYWN0aW9uIGlzIGV4ZWN1dGVkXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdGdyb3VwSWQ/OiBzdHJpbmcsXG5cdGJNZXNzYWdlcz86IGJvb2xlYW4sXG5cdGlnbm9yZUVUYWc/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQgfCBPRGF0YUNvbnRleHRCaW5kaW5nPiB7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBiTWVzc2FnZXMgPyBnZXRNZXNzYWdlUGF0aEZvclByZXBhcmUob0NvbnRleHQpIDogdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFLCBzTWVzc2FnZXNQYXRoID8geyAkc2VsZWN0OiBzTWVzc2FnZXNQYXRoIH0gOiB1bmRlZmluZWQpO1xuXG5cdFx0Ly8gVE9ETzogc2lkZSBlZmZlY3RzIHF1YWxpZmllciBzaGFsbCBiZSBldmVuIGRlcHJlY2F0ZWQgdG8gYmUgY2hlY2tlZFxuXHRcdG9PcGVyYXRpb24uc2V0UGFyYW1ldGVyKFwiU2lkZUVmZmVjdHNRdWFsaWZpZXJcIiwgXCJcIik7XG5cblx0XHRjb25zdCBzR3JvdXBJZCA9IGdyb3VwSWQgfHwgb09wZXJhdGlvbi5nZXRHcm91cElkKCk7XG5cdFx0cmV0dXJuIG9PcGVyYXRpb25cblx0XHRcdC5leGVjdXRlKHNHcm91cElkLCBpZ25vcmVFVGFnKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gb09wZXJhdGlvbjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvblwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBwcmVwYXJhdGlvbiBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIFJlcXVlc3RzIHRoZSBtZXNzYWdlcyBpZiBhbm5vdGF0ZWQgZm9yIGEgZ2l2ZW4gY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIG1lc3NhZ2VzIHNoYWxsIGJlIHJlcXVlc3RlZFxuICogQHBhcmFtIG9TaWRlRWZmZWN0c1NlcnZpY2UgU2VydmljZSBmb3IgdGhlIFNpZGVFZmZlY3RzIG9uIFNBUCBGaW9yaSBlbGVtZW50c1xuICogQHJldHVybnMgUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIG1lc3NhZ2VzIHdlcmUgcmVxdWVzdGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RNZXNzYWdlcyhvQ29udGV4dDogQ29udGV4dCwgb1NpZGVFZmZlY3RzU2VydmljZTogU2lkZUVmZmVjdHNTZXJ2aWNlKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSwgb0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRyZXR1cm4gb1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3NNZXNzYWdlc1BhdGhdLCBvQ29udGV4dCk7XG5cdH1cblx0cmV0dXJuO1xufVxuLyoqXG4gKiBFeGVjdXRlcyBkaXNjYXJkIG9mIGEgZHJhZnQgZnVuY3Rpb24gdXNpbmcgSFRUUCBQb3N0LlxuICpcbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBBcHAgQ29tcG9uZW50XG4gKiBAcGFyYW0gYkVuYWJsZVN0cmljdEhhbmRsaW5nXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRvQXBwQ29tcG9uZW50PzogQXBwQ29tcG9uZW50LFxuXHRiRW5hYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb0Rpc2NhcmRPcGVyYXRpb24gPSBkcmFmdC5jcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5ESVNDQVJEKTtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gb0FwcENvbXBvbmVudCAmJiBnZXRSZXNvdXJjZU1vZGVsKG9BcHBDb21wb25lbnQpO1xuXHRcdGNvbnN0IHNHcm91cElkID0gXCJkaXJlY3RcIjtcblx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IHJlc291cmNlTW9kZWw/LmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX0JVVFRPTlwiKSB8fCBcIlwiO1xuXHRcdC8vIGFzIHRoZSBkaXNjYXJkIGFjdGlvbiBkb2VzbnQnIHNlbmQgdGhlIGFjdGl2ZSB2ZXJzaW9uIGluIHRoZSByZXNwb25zZSB3ZSBkbyBub3QgdXNlIHRoZSByZXBsYWNlIGluIGNhY2hlXG5cdFx0Y29uc3Qgb0Rpc2NhcmRQcm9taXNlID0gIWJFbmFibGVTdHJpY3RIYW5kbGluZ1xuXHRcdFx0PyBvRGlzY2FyZE9wZXJhdGlvbi5leGVjdXRlKHNHcm91cElkKVxuXHRcdFx0OiBvRGlzY2FyZE9wZXJhdGlvbi5leGVjdXRlKFxuXHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRvcGVyYXRpb25zSGVscGVyLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKFxuXHRcdFx0XHRcdFx0ZHJhZnQsXG5cdFx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRcdHsgbGFiZWw6IHNBY3Rpb25OYW1lLCBtb2RlbDogb0NvbnRleHQuZ2V0TW9kZWwoKSB9LFxuXHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0dW5kZWZpbmVkXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRmYWxzZVxuXHRcdFx0ICApO1xuXHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRcdGF3YWl0IG9EaXNjYXJkUHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGlzY2FyZCBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGggZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHNcbiAqIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG4gKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdCBwYWdlXG4gKiBAcGFyYW0gcm9vdENvbnRleHRJbmZvIFRoZSBjb250ZXh0IGluZm8gb2Ygcm9vdCBvZiB0aGUgZHJhZnRcbiAqIEBwYXJhbSBncm91cElkXG4gKiBAcmV0dXJucyBUaGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRyb290Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0LFxuXHRyb290Q29udGV4dEluZm8/OiBSb290Q29udGV4dEluZm8sXG5cdGdyb3VwSWQ/OiBzdHJpbmdcbik6IFByb21pc2U8U2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkPiB7XG5cdGlmICghcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdExvZy5lcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0fVxuXG5cdGlmIChcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZSAmJlxuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZVxuXHQpIHtcblx0XHQvLyBXZSBhbHJlYWR5IGtub3cgdGhlIHNpYmxpbmcgZm9yIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IGRvZXNuJ3QgZXhpc3Rcblx0XHQvLyAtLT4gTm8gbmVlZCB0byBjaGVjayBjYW5vbmljYWwgcGF0aHMgZXRjLi4uXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnN0IG1vZGVsID0gcm9vdEN1cnJlbnRDb250ZXh0LmdldE1vZGVsKCk7XG5cdHRyeSB7XG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gMS4gRmluZCBhbGwgc2VnbWVudHMgYmV0d2VlbiB0aGUgcm9vdCBvYmplY3QgYW5kIHRoZSBzdWItb2JqZWN0XG5cdFx0Ly8gRXhhbXBsZTogZm9yIHJvb3QgPSAvUGFyYW0oYWEpL0VudGl0eShiYikgYW5kIHJpZ2h0TW9zdCA9IC9QYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9fU3ViTmF2KGRkKVxuXHRcdC8vIC0tLT4gW1wiUGFyYW0oYWEpL0VudGl0eShiYilcIiwgXCJfTmF2KGNjKVwiLCBcIl9TdWJOYXYoZGQpXCJdXG5cblx0XHQvLyBGaW5kIGFsbCBzZWdtZW50cyBpbiB0aGUgcmlnaHRtb3N0IHBhdGhcblx0XHRjb25zdCBhZGRpdGlvbmFsUGF0aCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5yZXBsYWNlKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCksIFwiXCIpO1xuXHRcdGNvbnN0IHNlZ21lbnRzID0gYWRkaXRpb25hbFBhdGggPyBhZGRpdGlvbmFsUGF0aC5zdWJzdHJpbmcoMSkuc3BsaXQoXCIvXCIpIDogW107XG5cdFx0Ly8gRmlyc3Qgc2VnbWVudCBpcyBhbHdheXMgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgcm9vdCBvYmplY3QsIHdoaWNoIGNhbiBjb250YWluICcvJyBpbiBjYXNlIG9mIGEgcGFyYW1ldHJpemVkIGVudGl0eVxuXHRcdHNlZ21lbnRzLnVuc2hpZnQocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMSkpO1xuXG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gMi4gUmVxdWVzdCBjYW5vbmljYWwgcGF0aHMgb2YgdGhlIHNpYmxpbmcgZW50aXR5IGZvciBlYWNoIHNlZ21lbnRcblx0XHQvLyBFeGFtcGxlOiBmb3IgW1wiUGFyYW0oYWEpL0VudGl0eShiYilcIiwgXCJfTmF2KGNjKVwiLCBcIl9TdWJOYXYoZGQpXCJdXG5cdFx0Ly8gLS0+IHJlcXVlc3QgY2Fub25pY2FsIHBhdGhzIGZvciBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL1NpYmxpbmdFbnRpdHlcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9TaWJsaW5nRW50aXR5XCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvX1N1Yk5hdihkZCkvU2libGluZ0VudGl0eVwiXG5cdFx0Y29uc3Qgb2xkUGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3QgbmV3UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0bGV0IGN1cnJlbnRQYXRoID0gXCJcIjtcblxuXHRcdC8vIENvbXB1dGluZyBzaWJsaW5nIGVudGl0eSBvZiByb290IG9mIHRoZSBkcmFmdCBjb250ZXh0IGlzIG5vdCByZXF1aXJlZCBpZiB0aGUgY29udGV4dCBpcyBhbHJlYWR5IGluIHRoZSBzdWItT1Bcblx0XHQvLyBFeGFtcGxlOiBFZGl0IGluIFN1Yi1PUCB3aGVyZSBuZXcgY29udGV4dCBpcyBhbHJlYWR5IGF2YWlsYWJsZVxuXHRcdGNvbnN0IHBhdGhzID0gWy4uLnNlZ21lbnRzXTtcblx0XHRpZiAocm9vdENvbnRleHRJbmZvPy5yb290U2libGluZ1BhdGhQcm9taXNlKSB7XG5cdFx0XHRwYXRocy5zaGlmdCgpO1xuXHRcdFx0Y3VycmVudFBhdGggPSBcIi9cIiArIHJvb3RDdXJyZW50Q29udGV4dD8uZ2V0UGF0aCgpPy5zdWJzdHJpbmcoMSk7XG5cdFx0fVxuXHRcdGNvbnN0IGNhbm9uaWNhbFBhdGhQcm9taXNlcyA9IHBhdGhzLm1hcChhc3luYyAoc2VnbWVudCkgPT4ge1xuXHRcdFx0Y3VycmVudFBhdGggKz0gYC8ke3NlZ21lbnR9YDtcblx0XHRcdG9sZFBhdGhzLnVuc2hpZnQoY3VycmVudFBhdGgpO1xuXHRcdFx0aWYgKGN1cnJlbnRQYXRoLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0XHRjb25zdCBzaWJsaW5nQ29udGV4dCA9IG1vZGVsXG5cdFx0XHRcdFx0LmJpbmRDb250ZXh0KGAke2N1cnJlbnRQYXRofS9TaWJsaW5nRW50aXR5YCwgdW5kZWZpbmVkLCBncm91cElkID8geyAkJGdyb3VwSWQ6IGdyb3VwSWQgfSA6IHVuZGVmaW5lZClcblx0XHRcdFx0XHQuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdHJldHVybiBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpOyAvLyAxLTEgcmVsYXRpb25cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDMuIFJlY29uc3RydWN0IHRoZSBmdWxsIHBhdGhzIGZyb20gY2Fub25pY2FsIHBhdGhzIChmb3IgcGF0aCBtYXBwaW5nKVxuXHRcdC8vIEV4YW1wbGU6IGZvciBjYW5vbmljYWwgcGF0aHMgXCIvUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKVwiLCBcIi9FbnRpdHkyKGNjLXNpYmxpbmcpXCIsIFwiL0VudGl0eTMoZGQtc2libGluZylcIlxuXHRcdC8vIC0tPiBbXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpL19TdWJOYXYoZGQtc2libGluZylcIl1cblx0XHRjb25zdCBjYW5vbmljYWxQYXRocyA9IChhd2FpdCBQcm9taXNlLmFsbChjYW5vbmljYWxQYXRoUHJvbWlzZXMpKSBhcyBzdHJpbmdbXTtcblxuXHRcdGlmIChyb290Q29udGV4dEluZm8/LnJvb3RTaWJsaW5nUGF0aFByb21pc2UpIHtcblx0XHRcdGNvbnN0IHJvb3RTaWJsaW5nUGF0aCA9IChhd2FpdCByb290Q29udGV4dEluZm8ucm9vdFNpYmxpbmdQYXRoUHJvbWlzZSk/LmdldFBhdGgoKSBhcyBzdHJpbmc7XG5cdFx0XHRjYW5vbmljYWxQYXRocy51bnNoaWZ0KHJvb3RTaWJsaW5nUGF0aCk7XG5cdFx0XHRvbGRQYXRocy5wdXNoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdH1cblx0XHRsZXQgc2libGluZ1BhdGggPSBcIlwiO1xuXHRcdGNhbm9uaWNhbFBhdGhzLmZvckVhY2goKGNhbm9uaWNhbFBhdGgsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoaW5kZXggIT09IDApIHtcblx0XHRcdFx0aWYgKHNlZ21lbnRzW2luZGV4XS5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdFx0XHRjb25zdCBuYXZpZ2F0aW9uID0gc2VnbWVudHNbaW5kZXhdLnJlcGxhY2UoL1xcKC4qJC8sIFwiXCIpOyAvLyBLZWVwIG9ubHkgbmF2aWdhdGlvbiBuYW1lIGZyb20gdGhlIHNlZ21lbnQsIGkuZS4gYWFhKHh4eCkgLS0+IGFhYVxuXHRcdFx0XHRcdGNvbnN0IGtleXMgPSBjYW5vbmljYWxQYXRoLnJlcGxhY2UoLy4qXFwoLywgXCIoXCIpOyAvLyBLZWVwIG9ubHkgdGhlIGtleXMgZnJvbSB0aGUgY2Fub25pY2FsIHBhdGgsIGkuZS4gYWFhKHh4eCkgLS0+ICh4eHgpXG5cdFx0XHRcdFx0c2libGluZ1BhdGggKz0gYC8ke25hdmlnYXRpb259JHtrZXlzfWA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c2libGluZ1BhdGggKz0gYC8ke3NlZ21lbnRzW2luZGV4XX1gOyAvLyAxLTEgcmVsYXRpb25cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2libGluZ1BhdGggPSBjYW5vbmljYWxQYXRoOyAvLyBUbyBtYW5hZ2UgcGFyYW1ldHJpemVkIGVudGl0aWVzXG5cdFx0XHR9XG5cdFx0XHRuZXdQYXRocy51bnNoaWZ0KHNpYmxpbmdQYXRoKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRDb250ZXh0OiBtb2RlbFxuXHRcdFx0XHQuYmluZENvbnRleHQoc2libGluZ1BhdGgsIHVuZGVmaW5lZCwge1xuXHRcdFx0XHRcdCRzZWxlY3Q6IGdldE1lc3NhZ2VQYXRoRm9yQ29udGV4dChyaWdodG1vc3RDdXJyZW50Q29udGV4dCksXG5cdFx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiXG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5nZXRCb3VuZENvbnRleHQoKSwgLy8gQ3JlYXRlIHRoZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0IGZyb20gaXRzIHBhdGhcblx0XHRcdHBhdGhNYXBwaW5nOiBvbGRQYXRocy5tYXAoKG9sZFBhdGgsIGluZGV4KSA9PiB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0b2xkUGF0aCxcblx0XHRcdFx0XHRuZXdQYXRoOiBuZXdQYXRoc1tpbmRleF1cblx0XHRcdFx0fTtcblx0XHRcdH0pXG5cdFx0fTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBBIGNhbm9uaWNhbCBwYXRoIGNvdWxkbid0IGJlIHJlc29sdmVkIChiZWNhdXNlIGEgc2libGluZyBkb2Vzbid0IGV4aXN0KVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZnJvbSBhbiBleGlzdGluZyBkb2N1bWVudC5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gc3VwcG9ydHMgc2V2ZXJhbCBob29rcyBhcyB0aGVyZSBpcyBhIGNlcnRhaW4gY29yZW9ncmFwaHkgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMub1ZpZXddIFRoZSB2aWV3XG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmJQcmVzZXJ2ZUNoYW5nZXNdIFByZXNlcnZlIGNoYW5nZXMgb2YgYW4gZXhpc3RpbmcgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKiBAcGFyYW0gZ3JvdXBJZCBUaGUgYmF0Y2ggZ3JvdXBJZCBmb3IgcG9zdCBjYWxsIG9mIGVkaXQgYWN0aW9uXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IHtcblx0XHRvVmlldzogRkVWaWV3O1xuXHRcdGJQcmVzZXJ2ZUNoYW5nZXM/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHR9LFxuXHRncm91cElkOiBzdHJpbmcsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlclxuKTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9LFxuXHRcdGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93ID1cblx0XHRcdHR5cGVvZiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyA9PT0gXCJ1bmRlZmluZWRcIiB8fCAodHlwZW9mIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzID09PSBcImJvb2xlYW5cIiAmJiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyk7IC8vZGVmYXVsdCB0cnVlXG5cblx0LyoqXG5cdCAqIE92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgY2hhbmdlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0IG9yIHRoZSBlcnJvciByZXRyaWV2ZWRcblx0ICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCByZXN1bHQgb2Yge0BsaW5rIHNhcC5mZS5jb3JlLmFjdGlvbnMjZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbn1cblx0ICovXG5cdGFzeW5jIGZ1bmN0aW9uIG92ZXJ3cml0ZUNoYW5nZShyZXNwb25zZTogQ29udGV4dCB8IENvbnRleHRFcnJvclR5cGUpOiBQcm9taXNlPENvbnRleHQgfCBDb250ZXh0RXJyb3JUeXBlIHwgdW5kZWZpbmVkPiB7XG5cdFx0Ly9PdmVyd3JpdGUgZXhpc3RpbmcgY2hhbmdlc1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgZHJhZnREYXRhQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhYCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IGdldFJlc291cmNlTW9kZWwobVBhcmFtZXRlcnMub1ZpZXcpO1xuXHRcdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gYXdhaXQgZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHQvLyByZW1vdmUgYWxsIHVuYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcyB3ZSBzaG93IGEgc3BlY2lhbCBkaWFsb2dcblx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRsZXQgc0luZm8gPSBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gbVBhcmFtZXRlcnMub1ZpZXcuZ2V0Vmlld0RhdGEoKS5lbnRpdHlTZXQ7XG5cdFx0XHRpZiAoc0luZm8pIHtcblx0XHRcdFx0Y29uc3Qgc0xvY2tlZEJ5VXNlck1zZyA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfTE9DS0VEX0JZX1VTRVJcIiwgc0luZm8sIHNFbnRpdHlTZXQpO1xuXHRcdFx0XHRNZXNzYWdlQm94LmVycm9yKHNMb2NrZWRCeVVzZXJNc2cpO1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzSW5mbyA9IGRyYWZ0QWRtaW5EYXRhLkNyZWF0ZWRCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyO1xuXHRcdFx0XHRjb25zdCBzVW5zYXZlZENoYW5nZXNNc2cgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0RSQUZUX09CSkVDVF9QQUdFX0RSQUZUX1VOU0FWRURfQ0hBTkdFU1wiLCBzSW5mbywgc0VudGl0eVNldCk7XG5cdFx0XHRcdGF3YWl0IGRyYWZ0LnNob3dFZGl0Q29uZmlybWF0aW9uTWVzc2FnZUJveChzVW5zYXZlZENoYW5nZXNNc2csIG9Db250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIGRyYWZ0LmV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGZhbHNlLCBtUGFyYW1ldGVycy5vVmlldywgZ3JvdXBJZCwgbWVzc2FnZUhhbmRsZXIsIHRydWUpOyAvLyB0cnVlIGJlY2F1c2Ugd2Ugb3ZlcndyaXRlIGNoYW5nZXNcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKChyZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKT8ubWVzc2FnZSkge1xuXHRcdFx0TWVzc2FnZUJveC5lcnJvcigocmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSkubWVzc2FnZSk7XG5cdFx0fVxuXHRcdHRocm93IG5ldyBFcnJvcihgRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHR9XG5cblx0aWYgKCFvQ29udGV4dCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIik7XG5cdH1cblx0bGV0IG9EcmFmdENvbnRleHQ6IENvbnRleHQgfCBDb250ZXh0RXJyb3JUeXBlIHwgdW5kZWZpbmVkO1xuXHR0cnkge1xuXHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBkcmFmdC5leGVjdXRlRHJhZnRFZGl0QWN0aW9uKG9Db250ZXh0LCBiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdywgbVBhcmFtZXRlcnMub1ZpZXcsIGdyb3VwSWQsIG1lc3NhZ2VIYW5kbGVyKTtcblx0fSBjYXRjaCAob1Jlc3BvbnNlKSB7XG5cdFx0aWYgKChvUmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSkuc3RhdHVzID09PSA0MDkgfHwgKG9SZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKS5zdGF0dXMgPT09IDQyMykge1xuXHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0Y29uc3Qgc2libGluZ0luZm8gPSBhd2FpdCBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCBvQ29udGV4dCk7XG5cdFx0XHRpZiAoc2libGluZ0luZm8/LnRhcmdldENvbnRleHQpIHtcblx0XHRcdFx0Ly90aGVyZSBpcyBhIGNvbnRleHQgYXV0aG9yaXplZCB0byBiZSBlZGl0ZWQgYnkgdGhlIGN1cnJlbnQgdXNlclxuXHRcdFx0XHRhd2FpdCBDb21tb25VdGlscy53YWl0Rm9yQ29udGV4dFJlcXVlc3RlZChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvL3RoZXJlIGlzIG5vIGRyYWZ0IG93bmVkIGJ5IHRoZSBjdXJyZW50IHVzZXJcblx0XHRcdFx0b0RyYWZ0Q29udGV4dCA9IGF3YWl0IG92ZXJ3cml0ZUNoYW5nZShvUmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghKG9SZXNwb25zZSAmJiAob1Jlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpLmNhbmNlbGVkKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKG9SZXNwb25zZSBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdGlmIChvRHJhZnRDb250ZXh0KSB7XG5cdFx0Y29uc3Qgc0VkaXRBY3Rpb25OYW1lID0gZHJhZnQuZ2V0QWN0aW9uTmFtZShvRHJhZnRDb250ZXh0IGFzIENvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5FRElUKTtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHMgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0VkaXRBY3Rpb25OYW1lLCBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdGlmIChvU2lkZUVmZmVjdHM/LnRyaWdnZXJBY3Rpb25zPy5sZW5ndGgpIHtcblx0XHRcdGF3YWl0IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24ob1NpZGVFZmZlY3RzLCBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQgYXMgQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQgYXMgQ29udGV4dDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGFjdGl2ZSBkb2N1bWVudCBmcm9tIGEgZHJhZnQgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNob3Jlb2dyYXBoeSBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBtUGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnRdIENhbGxiYWNrIHRoYXQgYWxsb3dzIGEgdmV0byBiZWZvcmUgdGhlICdDcmVhdGUnIHJlcXVlc3QgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZm5BZnRlckFjdGl2YXRlRG9jdW1lbnRdIENhbGxiYWNrIGZvciBwb3N0cHJvY2Vzc2luZyBhZnRlciBkb2N1bWVudCB3YXMgYWN0aXZhdGVkLlxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgY29udHJvbGxlciBleHRlbnNpb25cbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0IGNvbnRleHR9IG9mIHRoZSBuZXcgZHJhZnQgZG9jdW1lbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWN0aXZhdGVEb2N1bWVudChcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IHsgZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50PzogRnVuY3Rpb247IGZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50PzogRnVuY3Rpb24gfSxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG4pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0Y29uc3QgbVBhcmFtID0gbVBhcmFtZXRlcnMgfHwge307XG5cdGlmICghb0NvbnRleHQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gZHJhZnQgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIik7XG5cdH1cblxuXHRjb25zdCBiRXhlY3V0ZSA9IG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQgPyBhd2FpdCBtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0KSA6IHRydWU7XG5cdGlmICghYkV4ZWN1dGUpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYEFjdGl2YXRpb24gb2YgdGhlIGRvY3VtZW50IHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHR9XG5cblx0bGV0IG9BY3RpdmVEb2N1bWVudENvbnRleHQ6IENvbnRleHQ7XG5cdGlmICghaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCkpIHtcblx0XHRvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihvQ29udGV4dCwgb0FwcENvbXBvbmVudCwgbWVzc2FnZUhhbmRsZXIpO1xuXHR9IGVsc2Uge1xuXHRcdC8qIGFjdGl2YXRpb24gcmVxdWlyZXMgcHJlcGFyYXRpb24gKi9cblx0XHRjb25zdCBzQmF0Y2hHcm91cCA9IFwiJGF1dG9cIjtcblx0XHQvL3doZW4gdGhlcmUgYXJlIHBlbmRpbmcgY2hhbmdlcyB0aGVyZSB3aWxsIGJlIGEgcGF0Y2ggcmVxdWVzdCBtZXJnZWQgdG9nZXRoZXIgd2l0aCB0aGUgZHJhZnRQcmVwYXJlIGFuZCBkcmFmdEFjaXZhdGUuXG5cdFx0Ly9UaGUgcGF0Y2ggY2hhbmdlcyB0aGUgRXRhZywgdGhlcmZvcmUgdGhlIHByZXBhcmUgbmVlZHMgdG8gaWdub3JlIEV0YWdzXG5cdFx0Y29uc3QgaWdub3JlRXRhZzogYm9vbGVhbiA9IG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSA/IHRydWUgOiBmYWxzZTtcblx0XHQvLyB3ZSB1c2UgdGhlIHNhbWUgYmF0Y2hHcm91cCB0byBmb3JjZSBwcmVwYXJlIGFuZCBhY3RpdmF0ZSBpbiBhIHNhbWUgYmF0Y2ggYnV0IHdpdGggZGlmZmVyZW50IGNoYW5nZXNldFxuXHRcdGxldCBvUHJlcGFyZVByb21pc2UgPSBkcmFmdC5leGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihvQ29udGV4dCwgc0JhdGNoR3JvdXAsIHVuZGVmaW5lZCwgaWdub3JlRXRhZyk7XG5cdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzQmF0Y2hHcm91cCk7XG5cdFx0Y29uc3Qgb0FjdGl2YXRlUHJvbWlzZSA9IGRyYWZ0LmV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQsIG9BcHBDb21wb25lbnQsIG1lc3NhZ2VIYW5kbGVyLCBzQmF0Y2hHcm91cCk7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKFtvUHJlcGFyZVByb21pc2UsIG9BY3RpdmF0ZVByb21pc2VdKTtcblx0XHRcdG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSB2YWx1ZXNbMV07XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHQvLyBCQ1AgMjI3MDA4NDA3NVxuXHRcdFx0Ly8gaWYgdGhlIEFjdGl2YXRpb24gZmFpbHMsIHRoZW4gdGhlIG1lc3NhZ2VzIGFyZSByZXRyaWV2ZWQgZnJvbSBQUkVQQVJBVElPTiBhY3Rpb25cblx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBnZXRNZXNzYWdlUGF0aEZvclByZXBhcmUob0NvbnRleHQpO1xuXHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0b1ByZXBhcmVQcm9taXNlID0gZHJhZnQuZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0NvbnRleHQsIHNCYXRjaEdyb3VwLCB0cnVlKTtcblx0XHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzQmF0Y2hHcm91cCk7XG5cdFx0XHRcdGF3YWl0IG9QcmVwYXJlUHJvbWlzZTtcblx0XHRcdFx0Y29uc3QgZGF0YSA9IGF3YWl0IG9Db250ZXh0LnJlcXVlc3RPYmplY3QoKTtcblx0XHRcdFx0aWYgKGRhdGFbc01lc3NhZ2VzUGF0aF0ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdC8vaWYgbWVzc2FnZXMgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBQUkVQQVJBVElPTiBhY3Rpb24sIHRoZW4gcHJldmlvdXMgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcmUgcmVtb3ZlZFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyPy5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoZmFsc2UsIGZhbHNlLCBvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpIDogb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcbn1cblxuLyoqXG4gKiBEaXNwbGF5IHRoZSBjb25maXJtYXRpb24gZGlhbG9nIGJveCBhZnRlciBwcmVzc2luZyB0aGUgZWRpdCBidXR0b24gb2YgYW4gb2JqZWN0IHBhZ2Ugd2l0aCB1bnNhdmVkIGNoYW5nZXMuXG4gKlxuICpcbiAqIEBwYXJhbSBzVW5zYXZlZENoYW5nZXNNc2cgRGlhbG9nIGJveCBtZXNzYWdlIGluZm9ybWluZyB0aGUgdXNlciB0aGF0IGlmIGhlIHN0YXJ0cyBlZGl0aW5nLCB0aGUgcHJldmlvdXMgdW5zYXZlZCBjaGFuZ2VzIHdpbGwgYmUgbG9zdFxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlc1xuICovXG5hc3luYyBmdW5jdGlvbiBzaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnOiBzdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGNvbnN0IGxvY2FsSTE4blJlZiA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiB1bmtub3duKSA9PiB2b2lkKSB7XG5cdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0dGl0bGU6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfV0FSTklOR1wiKSxcblx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHtcblx0XHRcdFx0dGV4dDogc1Vuc2F2ZWRDaGFuZ2VzTXNnXG5cdFx0XHR9KSxcblx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9FRElUXCIpLFxuXHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0NBTkNFTFwiKSxcblx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0cmVqZWN0KGBEcmFmdCBjcmVhdGlvbiBhYm9ydGVkIGZvciBkb2N1bWVudDogJHtvQ29udGV4dC5nZXRQYXRoKCl9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRvRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdG9EaWFsb2cub3BlbigpO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBIVFRQIFBPU1QgY2FsbCB3aGVuIERyYWZ0QWN0aW9uIGlzIHByZXNlbnQgZm9yIERyYWZ0IERlbGV0ZTsgSFRUUCBERUxFVEUgY2FsbCB3aGVuIHRoZXJlIGlzIG5vIERyYWZ0QWN0aW9uXG4gKiBhbmQgQWN0aXZlIEluc3RhbmNlIGFsd2F5cyB1c2VzIERFTEVURS5cbiAqXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgZGlzY2FyZGVkXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgZGlzY2FyZGVkXG4gKiBAcGFyYW0gYkVuYWJsZVN0cmljdEhhbmRsaW5nXG4gKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgY29udGV4dCBpcyBkZWxldGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZURyYWZ0KFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRvQXBwQ29tcG9uZW50PzogQXBwQ29tcG9uZW50LFxuXHRiRW5hYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Y29uc3Qgc0Rpc2NhcmRBY3Rpb24gPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRElTQ0FSRCksXG5cdFx0YklzQWN0aXZlRW50aXR5ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCkuSXNBY3RpdmVFbnRpdHk7XG5cblx0aWYgKGJJc0FjdGl2ZUVudGl0eSB8fCAoIWJJc0FjdGl2ZUVudGl0eSAmJiAhc0Rpc2NhcmRBY3Rpb24pKSB7XG5cdFx0Ly9Vc2UgRGVsZXRlIGluIGNhc2Ugb2YgYWN0aXZlIGVudGl0eSBhbmQgbm8gZGlzY2FyZCBhY3Rpb24gYXZhaWxhYmxlIGZvciBkcmFmdFxuXHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpICYmICFvQ29udGV4dC5pc0luYWN0aXZlKCkpIHtcblx0XHRcdHJldHVybiBvQ29udGV4dFxuXHRcdFx0XHQuZ2V0QmluZGluZygpXG5cdFx0XHRcdC5yZXNldENoYW5nZXMoKVxuXHRcdFx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXaGVuIGNhbmNlbGxpbmcgYW4gZWRpdCBkcmFmdCByb290IG5vZGUsIHVzZSBtb2RlbC5kZWxldGUgaW5zdGVhZCBvZiBjb250ZXh0LmRlbGV0ZSwgdG8gb25seSBzZW5kIGRlbGV0aW9uIHRvIGJhY2tlbmQsXG5cdFx0XHQvLyBidXQga2VlcCBjb250ZXh0IGFsaXZlIChpbmNsdWRpbmcgYmluZGluZ3MpLiBUaHVzLCB3ZSBjYW4gZW5zdXJlIHNlYW1sZXNzIHRyYW5zaXN0aW9uIGZyb20gZHJhZnQgdG8gYWN0aXZlIGluc3RhbmNlXG5cdFx0XHQvLyAod2l0aG91dCBpbnRlcm1lZGlhdGUgdW5kZWZpbmVkIGJpbmRpbmdzIGUuZy4gbGVhZGluZyB0byBmbGlja2VyaW5nKS5cblx0XHRcdC8vIEluIG90aGVyIGNhc2VzIChkZWxldGluZyBhY3RpdmUsIGRpc2NhcmRpbmcgY3JlYXRlIGRyYWZ0IG9yIGRpc2NhcmRpbmcgZHJhZnQgbm9kZSksIHN0YXkgd2l0aCBjb250ZXh0LmRlbGV0ZS5cblx0XHRcdC8vIFdoZW4gY2FuY2VsbGluZyBhIGNyZWF0ZSBkcmFmdCwgcGFnZSBpcyBjbG9zZWQsIHRodXMgdGhlIHByb2JsZW0gb2YgZmxpY2tlcmluZyBjYW5ub3Qgb2NjdXIuXG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRpc2NhcmRpbmcgYSBkcmFmdCBub2RlLCB0aGVvcmV0aWNhbGx5IHRoZSBzYW1lIHByb2JsZW0gY291bGRcblx0XHRcdC8vIG9jY3VyLCBidXQgbmVlZHMgcXVpdGUgc3BlY2lmaWMgbW9kZWxsaW5nIChidXR0b24gdmlzaWJpbGl0eSBvbiBpdGVtIGxldmVsIGJvdW5kIGFnYWluc3Qgc2VydmljZSBwcm9wZXJ0eSBpbiBhbiBGQ0wgYXBwKVxuXHRcdFx0Ly8gYW5kIGFjdGluZyAobG9va2luZyBhdCBidXR0b24gb24gdGhpcmQgY29sdW1uIHdoaWxlIGRpc2NhcmRpbmcgb24gMm5kIGNvbHVtbikuIEN1cnJlbnRseSwgbW9kZWwgc2VlbXMgbm90IHRvIGJlIHByZXBhcmVkXG5cdFx0XHQvLyBmb3IgdGhhdCBjYXNlLCB0aHVzIGR1ZSB0byB0aGUgbWluaW1hbCBpbXBhY3QgKG9ubHkgaW50ZXJtZWRpYXRlIHZpc3VhbCBzdGF0ZSksIGFjY2VwdGluZyB0aGlzIGZvciB0aGUgdGltZSBiZWluZy5cblx0XHRcdHJldHVybiAhb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSAmJlxuXHRcdFx0XHRNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChcblx0XHRcdFx0XHRnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCkpKT8udGFyZ2V0RW50aXR5U2V0XG5cdFx0XHRcdClcblx0XHRcdFx0PyBvQ29udGV4dC5nZXRNb2RlbCgpLmRlbGV0ZShvQ29udGV4dClcblx0XHRcdFx0OiBvQ29udGV4dC5kZWxldGUoKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly9Vc2UgRGlzY2FyZCBQb3N0IEFjdGlvbiBpZiBpdCBpcyBhIGRyYWZ0IGVudGl0eSBhbmQgZGlzY2FyZCBhY3Rpb24gZXhpc3RzXG5cdFx0YXdhaXQgZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihvQ29udGV4dCwgbWVzc2FnZUhhbmRsZXIsIG9BcHBDb21wb25lbnQsIGJFbmFibGVTdHJpY3RIYW5kbGluZyk7XG5cdH1cbn1cblxuY29uc3QgZHJhZnQgPSB7XG5cdGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50OiBjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCxcblx0YWN0aXZhdGVEb2N1bWVudDogYWN0aXZhdGVEb2N1bWVudCxcblx0ZGVsZXRlRHJhZnQ6IGRlbGV0ZURyYWZ0LFxuXHRleGVjdXRlRHJhZnRFZGl0QWN0aW9uOiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uLFxuXHRleGVjdXRlRHJhZnRWYWxpZGF0aW9uOiBleGVjdXRlRHJhZnRWYWxpZGF0aW9uLFxuXHRleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbjogZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24sXG5cdGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb246IGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24sXG5cdGhhc1ByZXBhcmVBY3Rpb246IGhhc1ByZXBhcmVBY3Rpb24sXG5cdGNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb246IGNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24sXG5cdHByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uOiBkcmFmdERhdGFMb3NzUG9wdXAucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24sXG5cdHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbjogZHJhZnREYXRhTG9zc1BvcHVwLnNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbixcblx0Y3JlYXRlT3BlcmF0aW9uOiBjcmVhdGVPcGVyYXRpb24sXG5cdGV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb246IGV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24sXG5cdE5hdmlnYXRpb25UeXBlOiBkcmFmdERhdGFMb3NzUG9wdXAuTmF2aWdhdGlvblR5cGUsXG5cdGdldEFjdGlvbk5hbWU6IGdldEFjdGlvbk5hbWUsXG5cdHNob3dFZGl0Q29uZmlybWF0aW9uTWVzc2FnZUJveDogc2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94XG59O1xuXG5leHBvcnQgZGVmYXVsdCBkcmFmdDtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7OztFQW9GQTtFQUNBLE1BQU1BLGVBQWUsR0FBRztJQUN2QkMsSUFBSSxFQUFFLFlBQVk7SUFDbEJDLFVBQVUsRUFBRSxrQkFBa0I7SUFDOUJDLE9BQU8sRUFBRSxlQUFlO0lBQ3hCQyxPQUFPLEVBQUU7RUFDVixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU0MsYUFBYSxDQUFDQyxRQUFpQixFQUFFQyxVQUFrQixFQUFVO0lBQ3JFLE1BQU1DLE1BQU0sR0FBR0YsUUFBUSxDQUFDRyxRQUFRLEVBQUU7TUFDakNDLFVBQVUsR0FBR0YsTUFBTSxDQUFDRyxZQUFZLEVBQUU7TUFDbENDLGNBQWMsR0FBR0YsVUFBVSxDQUFDRyxXQUFXLENBQUNQLFFBQVEsQ0FBQ1EsT0FBTyxFQUFFLENBQUM7SUFFNUQsT0FBT0osVUFBVSxDQUFDSyxTQUFTLENBQUUsR0FBRUgsY0FBZSw2Q0FBNENMLFVBQVcsRUFBQyxDQUFDO0VBQ3hHO0VBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNTLGVBQWUsQ0FBQ1YsUUFBaUIsRUFBRUMsVUFBa0IsRUFBRVUsUUFBZ0MsRUFBdUI7SUFDdEgsTUFBTUMsY0FBYyxHQUFHYixhQUFhLENBQUNDLFFBQVEsRUFBRUMsVUFBVSxDQUFDO0lBRTFELE9BQU9ELFFBQVEsQ0FBQ0csUUFBUSxFQUFFLENBQUNVLFdBQVcsQ0FBRSxHQUFFRCxjQUFlLE9BQU0sRUFBRVosUUFBUSxFQUFFVyxR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
623
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkcmFmdE9wZXJhdGlvbnMiLCJFRElUIiwiQUNUSVZBVElPTiIsIkRJU0NBUkQiLCJQUkVQQVJFIiwiZ2V0QWN0aW9uTmFtZSIsIm9Db250ZXh0Iiwic09wZXJhdGlvbiIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiY3JlYXRlT3BlcmF0aW9uIiwib09wdGlvbnMiLCJzT3BlcmF0aW9uTmFtZSIsImJpbmRDb250ZXh0IiwiZ2V0UmV0dXJuVHlwZSIsImhhc1ByZXBhcmVBY3Rpb24iLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiYlByZXNlcnZlQ2hhbmdlcyIsIm9WaWV3IiwiZ3JvdXBJZCIsIm1lc3NhZ2VIYW5kbGVyIiwib3ZlcndyaXRlQ2hhbmdlIiwiZ2V0UHJvcGVydHkiLCIkJGluaGVyaXRFeHBhbmRTZWxlY3QiLCJvT3BlcmF0aW9uIiwiZHJhZnQiLCJzZXRQYXJhbWV0ZXIiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0UmVzb3VyY2VNb2RlbCIsInNBY3Rpb25OYW1lIiwiZ2V0VGV4dCIsIm9FZGl0UHJvbWlzZSIsImV4ZWN1dGUiLCJ1bmRlZmluZWQiLCJvcGVyYXRpb25zSGVscGVyIiwiZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkIiwiYmluZCIsImxhYmVsIiwibW9kZWwiLCJnZXRCaW5kaW5nIiwiaXNBIiwic3VibWl0QmF0Y2giLCJFcnJvciIsImV4ZWN1dGVEcmFmdFZhbGlkYXRpb24iLCJjb250ZXh0IiwiYXBwQ29tcG9uZW50IiwiaWdub3JlRVRhZyIsIk1vZGVsSGVscGVyIiwiZ2V0TWVzc2FnZXNQYXRoIiwiaXNLZWVwQWxpdmUiLCJyZXF1ZXN0T2JqZWN0Iiwib3BlcmF0aW9uIiwiZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24iLCJnZXRVcGRhdGVHcm91cElkIiwicmVxdWVzdE1lc3NhZ2VzIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZXJyb3IiLCJMb2ciLCJleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uIiwib0FwcENvbXBvbmVudCIsInNHcm91cElkIiwiYkhhc1ByZXBhcmVBY3Rpb24iLCJiSWdub3JlRXRhZyIsImUiLCJhY3Rpb25OYW1lIiwib1NpZGVFZmZlY3RzU2VydmljZSIsIm9CaW5kaW5nUGFyYW1ldGVycyIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJhVGFyZ2V0UGF0aHMiLCJwYXRoRXhwcmVzc2lvbnMiLCJsZW5ndGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJvRXJyb3IiLCJnZXRNZXNzYWdlUGF0aEZvclByZXBhcmUiLCJnZXRNZXNzYWdlUGF0aEZvckNvbnRleHQiLCJfY29udmVydGVkQ29udGV4dCR0YXIiLCJtZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0IiwiY29udmVydGVkQ29udGV4dCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsIm1lc3NhZ2VzIiwidGFyZ2V0RW50aXR5VHlwZSIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiTWVzc2FnZXMiLCJpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsInBhdGgiLCJiTWVzc2FnZXMiLCJzTWVzc2FnZXNQYXRoIiwiJHNlbGVjdCIsImdldEdyb3VwSWQiLCJ0aGVuIiwiY2F0Y2giLCJleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uIiwiYkVuYWJsZVN0cmljdEhhbmRsaW5nIiwib0Rpc2NhcmRPcGVyYXRpb24iLCJvRGlzY2FyZFByb21pc2UiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJyb290Q29udGV4dEluZm8iLCJzdGFydHNXaXRoIiwiYWRkaXRpb25hbFBhdGgiLCJyZXBsYWNlIiwic2VnbWVudHMiLCJzdWJzdHJpbmciLCJzcGxpdCIsInVuc2hpZnQiLCJvbGRQYXRocyIsIm5ld1BhdGhzIiwiY3VycmVudFBhdGgiLCJwYXRocyIsInJvb3RTaWJsaW5nUGF0aFByb21pc2UiLCJfcm9vdEN1cnJlbnRDb250ZXh0JGciLCJzaGlmdCIsImNhbm9uaWNhbFBhdGhQcm9taXNlcyIsIm1hcCIsInNlZ21lbnQiLCJlbmRzV2l0aCIsInNpYmxpbmdDb250ZXh0IiwiJCRncm91cElkIiwiZ2V0Qm91bmRDb250ZXh0IiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNhbm9uaWNhbFBhdGhzIiwiYWxsIiwiX2F3YWl0JHJvb3RDb250ZXh0SW5mIiwicm9vdFNpYmxpbmdQYXRoIiwicHVzaCIsInNpYmxpbmdQYXRoIiwiZm9yRWFjaCIsImNhbm9uaWNhbFBhdGgiLCJpbmRleCIsIm5hdmlnYXRpb24iLCJrZXlzIiwidGFyZ2V0Q29udGV4dCIsInBhdGhNYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm1QYXJhbWV0ZXJzIiwibVBhcmFtIiwiYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3ciLCJyZXNwb25zZSIsImRyYWZ0RGF0YUNvbnRleHQiLCJkcmFmdEFkbWluRGF0YSIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJzSW5mbyIsIkluUHJvY2Vzc0J5VXNlckRlc2NyaXB0aW9uIiwiSW5Qcm9jZXNzQnlVc2VyIiwic0VudGl0eVNldCIsImdldFZpZXdEYXRhIiwiZW50aXR5U2V0Iiwic0xvY2tlZEJ5VXNlck1zZyIsIk1lc3NhZ2VCb3giLCJDcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24iLCJDcmVhdGVkQnlVc2VyIiwic1Vuc2F2ZWRDaGFuZ2VzTXNnIiwic2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94IiwibWVzc2FnZSIsIm9EcmFmdENvbnRleHQiLCJvUmVzcG9uc2UiLCJzdGF0dXMiLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsInNpYmxpbmdJbmZvIiwiQ29tbW9uVXRpbHMiLCJ3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZCIsImNhbmNlbGVkIiwiX29TaWRlRWZmZWN0cyR0cmlnZ2VyIiwic0VkaXRBY3Rpb25OYW1lIiwib1NpZGVFZmZlY3RzIiwidHJpZ2dlckFjdGlvbnMiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbiIsImFjdGl2YXRlRG9jdW1lbnQiLCJiRXhlY3V0ZSIsImZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudCIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJzQmF0Y2hHcm91cCIsImlnbm9yZUV0YWciLCJoYXNQZW5kaW5nQ2hhbmdlcyIsIm9QcmVwYXJlUHJvbWlzZSIsIm9BY3RpdmF0ZVByb21pc2UiLCJ2YWx1ZXMiLCJlcnIiLCJkYXRhIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwiZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQiLCJsb2NhbEkxOG5SZWYiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJyZWplY3QiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwidGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidHlwZSIsInByZXNzIiwiY2xvc2UiLCJlbmRCdXR0b24iLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsImFkZFN0eWxlQ2xhc3MiLCJvcGVuIiwiZGVsZXRlRHJhZnQiLCJzRGlzY2FyZEFjdGlvbiIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiaXNJbmFjdGl2ZSIsInJlc2V0Q2hhbmdlcyIsImRlbGV0ZSIsIl9nZXRJbnZvbHZlZERhdGFNb2RlbCIsImlzRHJhZnRSb290IiwidGFyZ2V0RW50aXR5U2V0IiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJkcmFmdERhdGFMb3NzUG9wdXAiLCJzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24iLCJOYXZpZ2F0aW9uVHlwZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiZHJhZnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IGRyYWZ0RGF0YUxvc3NQb3B1cCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnREYXRhTG9zc1BvcHVwXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHR5cGUgeyBTaWRlRWZmZWN0c1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHRFcnJvclR5cGUgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCIuLi8uLi9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCIuLi8uLi9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgb3BlcmF0aW9uc0hlbHBlciBmcm9tIFwiLi4vLi4vb3BlcmF0aW9uc0hlbHBlclwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcIi4uL01lc3NhZ2VIYW5kbGVyXCI7XG5cbmV4cG9ydCB0eXBlIFNpYmxpbmdJbmZvcm1hdGlvbiA9IHtcblx0dGFyZ2V0Q29udGV4dDogQ29udGV4dDtcblx0cGF0aE1hcHBpbmc6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdO1xufTtcblxuZXhwb3J0IHR5cGUgUm9vdENvbnRleHRJbmZvID0ge1xuXHRyb290U2libGluZ1BhdGhQcm9taXNlOiBQcm9taXNlPENvbnRleHQgfCB1bmRlZmluZWQ+O1xufTtcblxuZXhwb3J0IHR5cGUgQmluZENvbnRleHRQYXJhbWV0ZXJzID0ge1xuXHQvKipcblx0ICogVGhlIHZhbHVlIGZvciB0aGUgXCI1LjEuMiBTeXN0ZW0gUXVlcnkgT3B0aW9uICRleHBhbmRcIiBvciBhbiBvYmplY3Qgd2hpY2ggZGV0ZXJtaW5lcyB0aGF0IHZhbHVlLiBUaGUgb2JqZWN0XG5cdCAqIGlzIGEgbWFwIGZyb20gZXhwYW5kIHBhdGggdG8gZXhwYW5kIG9wdGlvbnMsIHdoZXJlIHRoZSBvcHRpb25zIGFyZSBhZ2FpbiBtYXBzIG9mIHN5c3RlbSBxdWVyeSBvcHRpb25zLFxuXHQgKiB0eXBpY2FsbHkgd2l0aCBzdHJpbmcgdmFsdWVzLiAkY291bnQgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgYSBgYm9vbGVhbmAgdmFsdWUsICRleHBhbmQgY2FuIHJlY3Vyc2l2ZWx5XG5cdCAqIGJlIGdpdmVuIGFzIGEgbWFwLCAkbGV2ZWxzIGNhbiBhbHNvIGJlIGdpdmVuIGFzIGEgYG51bWJlcmAgdmFsdWUsIGFuZCAkc2VsZWN0IGNhbiBhbHNvIGJlIGdpdmVuIGFzIGFuXG5cdCAqIGFycmF5IChidXQgd2l0aG91dCBuYXZpZ2F0aW9uIHBhdGhzKS4gQW4gZW1wdHkgbWFwIGNhbiBhbHNvIGJlIGdpdmVuIGFzIGBudWxsYCBvciBgdHJ1ZWAuIFNlZSBhbHNvIHtAbGluayBodHRwczovL3VpNS5zYXAuY29tLyMvdG9waWMvMWFiNGY2MmRlNmFiNDY3MDk2YTJhOThiMzYzYTEzNzMgUGFyYW1ldGVyc30uXG5cdCAqL1xuXHQkZXhwYW5kPzogc3RyaW5nIHwgb2JqZWN0O1xuXHQvKipcblx0ICogQSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvciBhbiBhcnJheSBvZiBpdGVtcyB3aGljaCBkZXRlcm1pbmUgdGhlIHZhbHVlIGZvciB0aGUgXCI1LjEuMyBTeXN0ZW0gUXVlcnkgT3B0aW9uXG5cdCAqICRzZWxlY3RcIi4gU2luY2UgMS43NS4wLCB3aGVuIHVzaW5nIHRoZSBcImF1dG9FeHBhbmRTZWxlY3RcIiBtb2RlbCBwYXJhbWV0ZXIgKHNlZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWwjY29uc3RydWN0b3J9KSxcblx0ICogcGF0aHMgd2l0aCBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgY2FuIGJlIGluY2x1ZGVkIGFuZCB3aWxsIGNvbnRyaWJ1dGUgdG8gdGhlIFwiNS4xLjIgU3lzdGVtIFF1ZXJ5IE9wdGlvblxuXHQgKiAkZXhwYW5kXCIuXG5cdCAqL1xuXHQkc2VsZWN0Pzogc3RyaW5nO1xuXHQvKipcblx0ICogV2hldGhlciBhIGJpbmRpbmcgcmVsYXRpdmUgdG8gYW4ge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSB1c2VzIHRoZSBjYW5vbmljYWwgcGF0aCBjb21wdXRlZFxuXHQgKiBmcm9tIGl0cyBjb250ZXh0J3MgcGF0aCBmb3IgZGF0YSBzZXJ2aWNlIHJlcXVlc3RzOyBvbmx5IHRoZSB2YWx1ZSBgdHJ1ZWAgaXMgYWxsb3dlZC5cblx0ICovXG5cdCQkY2Fub25pY2FsUGF0aD86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgKipyZWFkKiogcmVxdWVzdHMgdHJpZ2dlcmVkIGJ5IHRoaXMgYmluZGluZzsgaWYgbm90IHNwZWNpZmllZCwgZWl0aGVyIHRoZVxuXHQgKiBwYXJlbnQgYmluZGluZydzIGdyb3VwIElEIChpZiB0aGUgYmluZGluZyBpcyByZWxhdGl2ZSkgb3IgdGhlIG1vZGVsJ3MgZ3JvdXAgSUQgaXMgdXNlZCwgc2VlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbCNjb25zdHJ1Y3Rvcn0uXG5cdCAqIFZhbGlkIHZhbHVlcyBhcmUgYHVuZGVmaW5lZGAsICckYXV0bycsICckYXV0by4qJywgJyRkaXJlY3QnIG9yIGFwcGxpY2F0aW9uIGdyb3VwIElEcyBhcyBzcGVjaWZpZWQgaW5cblx0ICoge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfS5cblx0ICovXG5cdCQkZ3JvdXBJZD86IHN0cmluZztcblx0LyoqXG5cdCAqIEZvciBvcGVyYXRpb24gYmluZGluZ3Mgb25seTogV2hldGhlciAkZXhwYW5kIGFuZCAkc2VsZWN0IGZyb20gdGhlIHBhcmVudCBiaW5kaW5nIGFyZSB1c2VkIGluIHRoZSByZXF1ZXN0XG5cdCAqIHNlbnQgb24ge0BsaW5rICNleGVjdXRlfS4gSWYgc2V0IHRvIGB0cnVlYCwgdGhlIGJpbmRpbmcgbXVzdCBub3Qgc2V0IHRoZSAkZXhwYW5kIGl0c2VsZiwgdGhlIG9wZXJhdGlvblxuXHQgKiBtdXN0IGJlIGJvdW5kLCBhbmQgdGhlIHJldHVybiB2YWx1ZSBhbmQgdGhlIGJpbmRpbmcgcGFyYW1ldGVyIG11c3QgYmVsb25nIHRvIHRoZSBzYW1lIGVudGl0eSBzZXQuXG5cdCAqL1xuXHQkJGluaGVyaXRFeHBhbmRTZWxlY3Q/OiBib29sZWFuO1xuXHQvKipcblx0ICogV2hldGhlciB0aGUgYmluZGluZyBhbHdheXMgdXNlcyBhbiBvd24gc2VydmljZSByZXF1ZXN0IHRvIHJlYWQgaXRzIGRhdGE7IG9ubHkgdGhlIHZhbHVlIGB0cnVlYCBpcyBhbGxvd2VkLlxuXHQgKi9cblx0JCRvd25SZXF1ZXN0PzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFdoZXRoZXIgaW1wbGljaXQgbG9hZGluZyBvZiBzaWRlIGVmZmVjdHMgdmlhIFBBVENIIHJlcXVlc3RzIGlzIHN3aXRjaGVkIG9mZjsgb25seSB0aGUgdmFsdWUgYHRydWVgIGlzXG5cdCAqIGFsbG93ZWQuIFRoaXMgc2V0cyB0aGUgcHJlZmVyZW5jZSBcInJldHVybj1taW5pbWFsXCIgYW5kIHJlcXVpcmVzIHRoZSBzZXJ2aWNlIHRvIHJldHVybiBhbiBFVGFnIGhlYWRlclxuXHQgKiBmb3IgXCIyMDQgTm8gQ29udGVudFwiIHJlc3BvbnNlcy4gSWYgbm90IHNwZWNpZmllZCwgdGhlIHZhbHVlIG9mIHRoZSBwYXJlbnQgYmluZGluZyBpcyB1c2VkLlxuXHQgKi9cblx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgKip1cGRhdGUqKiByZXF1ZXN0cyB0cmlnZ2VyZWQgYnkgdGhpcyBiaW5kaW5nOyBpZiBub3Qgc3BlY2lmaWVkLCBlaXRoZXIgdGhlXG5cdCAqIHBhcmVudCBiaW5kaW5nJ3MgdXBkYXRlIGdyb3VwIElEIChpZiB0aGUgYmluZGluZyBpcyByZWxhdGl2ZSkgb3IgdGhlIG1vZGVsJ3MgdXBkYXRlIGdyb3VwIElEIGlzIHVzZWQsXG5cdCAqIHNlZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWwjY29uc3RydWN0b3J9LiBGb3IgdmFsaWQgdmFsdWVzLCBzZWUgcGFyYW1ldGVyIFwiJCRncm91cElkXCIuXG5cdCAqL1xuXHQkJHVwZGF0ZUdyb3VwSWQ/OiBzdHJpbmc7XG59O1xuXG4vKiBDb25zdGFudHMgZm9yIGRyYWZ0IG9wZXJhdGlvbnMgKi9cbmNvbnN0IGRyYWZ0T3BlcmF0aW9ucyA9IHtcblx0RURJVDogXCJFZGl0QWN0aW9uXCIsXG5cdEFDVElWQVRJT046IFwiQWN0aXZhdGlvbkFjdGlvblwiLFxuXHRESVNDQVJEOiBcIkRpc2NhcmRBY3Rpb25cIixcblx0UFJFUEFSRTogXCJQcmVwYXJhdGlvbkFjdGlvblwiXG59O1xuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgZm9yIHRoZSBkcmFmdCBwcm9ncmFtbWluZyBtb2RlbFxuICogQG5hbWVzcGFjZVxuICogQGV4cGVyaW1lbnRhbCBUaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBleHBlcmltZW50YWwgdXNlISA8YnIvPjxiPlRoaXMgaXMgb25seSBhIFBPQyBhbmQgbWF5YmUgZGVsZXRlZDwvYj5cbiAqIEBzaW5jZSAxLjU0LjBcbiAqL1xuXG4vKipcbiAqIERldGVybWluZXMgdGhlIGFjdGlvbiBuYW1lIGZvciBhIGRyYWZ0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIG5hbWVcbiAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSBkcmFmdCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0QWN0aW9uTmFtZShvQ29udGV4dDogQ29udGV4dCwgc09wZXJhdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXG5cdHJldHVybiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC8ke3NPcGVyYXRpb259YCk7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gb3BlcmF0aW9uIGNvbnRleHQgYmluZGluZyBmb3IgdGhlIGdpdmVuIGNvbnRleHQgYW5kIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIChhY3Rpb24gb3IgZnVuY3Rpb24gaW1wb3J0KVxuICogQHBhcmFtIG9PcHRpb25zIE9wdGlvbnMgdG8gY3JlYXRlIHRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHJldHVybnMgVGhlIGNvbnRleHQgYmluZGluZyBvZiB0aGUgYm91bmQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dDogQ29udGV4dCwgc09wZXJhdGlvbjogc3RyaW5nLCBvT3B0aW9ucz86IEJpbmRDb250ZXh0UGFyYW1ldGVycyk6IE9EYXRhQ29udGV4dEJpbmRpbmcge1xuXHRjb25zdCBzT3BlcmF0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIHNPcGVyYXRpb24pO1xuXG5cdHJldHVybiBvQ29udGV4dC5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KGAke3NPcGVyYXRpb25OYW1lfSguLi4pYCwgb0NvbnRleHQsIG9PcHRpb25zKTtcbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgcmV0dXJuIHR5cGUgZm9yIGEgZHJhZnQgb3BlcmF0aW9uLlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBzT3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gbmFtZVxuICogQHJldHVybnMgVGhlIHJldHVybiB0eXBlIG9mIHRoZSBkcmFmdCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0UmV0dXJuVHlwZShvQ29udGV4dDogQ29udGV4dCwgc09wZXJhdGlvbjogc3RyaW5nKTogdW5rbm93biB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvJHtzT3BlcmF0aW9ufS8kUmV0dXJuVHlwZWApO1xufVxuLyoqXG4gKiBDaGVjayBpZiBvcHRpb25hbCBkcmFmdCBwcmVwYXJlIGFjdGlvbiBleGlzdHMuXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHJldHVybnMgVHJ1ZSBpZiBhIGEgcHJlcGFyZSBhY3Rpb24gZXhpc3RzXG4gKi9cbmZ1bmN0aW9uIGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0cmV0dXJuICEhZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGRyYWZ0IGZyb20gYW4gYWN0aXZlIGRvY3VtZW50LlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIGJQcmVzZXJ2ZUNoYW5nZXMgSWYgdHJ1ZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyIHVzZXIgdGhhdCBhcmUgbm90IGxvY2tlZCBhcmUgcHJlc2VydmVkIGFuZCBhbiBlcnJvciBpcyBzZW50IGZyb20gdGhlIGJhY2tlbmQsIG90aGVyd2lzZSBmYWxzZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyIHVzZXIgdGhhdCBhcmUgbm90IGxvY2tlZCBhcmUgb3ZlcndyaXR0ZW48L2xpPlxuICogQHBhcmFtIG9WaWV3IElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlclxuICogQHBhcmFtIGdyb3VwSWQgVGhlIGJhdGNoIGdyb3VwSWQgZm9yIHBvc3QgY2FsbCBvZiBlZGl0IGFjdGlvblxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyICBUaGUgbWVzc2FnZSBoYW5kbGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG4gKiBAcGFyYW0gb3ZlcndyaXRlQ2hhbmdlXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uKFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0YlByZXNlcnZlQ2hhbmdlczogYm9vbGVhbixcblx0b1ZpZXc6IFZpZXcsXG5cdGdyb3VwSWQ6IHN0cmluZyxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRvdmVyd3JpdGVDaGFuZ2U/OiBib29sZWFuXG4pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0aWYgKG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvT3B0aW9ucyA9IHsgJCRpbmhlcml0RXhwYW5kU2VsZWN0OiB0cnVlIH07XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGRyYWZ0LmNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQsIG9PcHRpb25zKTtcblx0XHRvT3BlcmF0aW9uLnNldFBhcmFtZXRlcihcIlByZXNlcnZlQ2hhbmdlc1wiLCBiUHJlc2VydmVDaGFuZ2VzKTtcblxuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG9WaWV3KTtcblx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0VESVRcIik7XG5cdFx0Ly9JZiB0aGUgY29udGV4dCBpcyBjb21pbmcgZnJvbSBhIGxpc3QgYmluZGluZyB3ZSBwYXNzIHRoZSBmbGFnIHRydWUgdG8gcmVwbGFjZSB0aGUgY29udGV4dCBieSB0aGUgYWN0aXZlIG9uZVxuXHRcdGNvbnN0IG9FZGl0UHJvbWlzZSA9IG9PcGVyYXRpb24uZXhlY3V0ZShcblx0XHRcdGdyb3VwSWQsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRvcGVyYXRpb25zSGVscGVyLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKFxuXHRcdFx0XHRkcmFmdCxcblx0XHRcdFx0Z3JvdXBJZCxcblx0XHRcdFx0eyBsYWJlbDogc0FjdGlvbk5hbWUsIG1vZGVsOiBvQ29udGV4dC5nZXRNb2RlbCgpIH0sXG5cdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHR1bmRlZmluZWRcblx0XHRcdCksXG5cdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIilcblx0XHQpO1xuXHRcdGlmIChvdmVyd3JpdGVDaGFuZ2UpIHtcblx0XHRcdG9PcGVyYXRpb24uZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChncm91cElkKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9FZGl0UHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2Fubm90IGVkaXQgdGhpcyBkcmFmdCBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBkcmFmdC4gVGhlIFByZXBhcmVBY3Rpb24gaXMgdHJpZ2dlcmVkIGlmIHRoZSBtZXNzYWdlcyBhcmUgYW5ub3RhdGVkIGFuZCBlbnRpdHlTZXQgZ2V0cyBhIFByZXBhcmF0aW9uQWN0aW9uIGFubm90YXRlZC5cbiAqIElmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgYW5kIG9wZXJhdGlvbiBkb2Vzbid0IGdldCBhIHJldHVybiB0eXBlIChSQVAgc3lzdGVtKSB0aGUgbWVzc2FnZXMgYXJlIHJlcXVlc3RlZC5cbiAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBQcmVwYXJlQWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIGlnbm9yZUVUYWcgSWYgc2V0IHRvIHRydWUsIEVUYWdzIGFyZSBpZ25vcmVkIHdoZW4gZXhlY3V0aW5nIHRoZSBhY3Rpb25cbiAqIEByZXR1cm5zIFJlc29sdmUgZnVuY3Rpb24gcmV0dXJuc1xuICogIC0gdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvbiBpZiB0aGUgYWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleGVjdXRlZFxuICogIC0gdm9pZCBpZiB0aGUgYWN0aW9uIGhhcyBmYWlsZWRcbiAqICAtIHVuZGVmaW5lZCBpZiB0aGUgYWN0aW9uIGhhcyBub3QgYmVlbiB0cmlnZ2VyZWQgc2luY2UgdGhlIHByZXJlcXVpc2l0ZXMgYXJlIG5vdCBtZXRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0VmFsaWRhdGlvbihcblx0Y29udGV4dDogQ29udGV4dCxcblx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdGlnbm9yZUVUYWc6IGJvb2xlYW5cbik6IFByb21pc2U8T0RhdGFDb250ZXh0QmluZGluZyB8IHZvaWQgfCB1bmRlZmluZWQ+IHtcblx0aWYgKE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksIGNvbnRleHQuZ2V0UGF0aCgpKSAmJiBkcmFmdC5oYXNQcmVwYXJlQWN0aW9uKGNvbnRleHQpKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmICghaWdub3JlRVRhZyAmJiAhY29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIGVudGl0eSByZWxhdGVkIHRvIHRoZSBjb250ZXh0IHRvIHBvc3QgdGhlIGFjdGlvbiB3aXRoIHRoZSBJZi1NYXRjaCBoZWFkZXJcblx0XHRcdFx0Ly8gU29tZSB0cmlnZ2VycyAoZW50ZXIgb24gdGFibGUpIGNhbiBnZW5lcmF0ZSBhIHByb21pc2UgaW4gdGhlIGNhY2hlIHNvIGlmIHdlIGRvbid0IHdhaXQgZm9yIHRoZSBlbnRpdHlcblx0XHRcdFx0Ly8gdGhlIFBPU1Qgd2lsbCBiZSBzZW50IHdpdGhvdXQgSWYtTWF0Y2ggYW5kIHdpbGwgZ2VuZXJhdGUgYW4gZXJyb3Igb24gYmFja2VuZCBzaWRlLlxuXHRcdFx0XHRhd2FpdCAoY29udGV4dC5nZXRCaW5kaW5nKCkgYXMgT0RhdGFDb250ZXh0QmluZGluZykucmVxdWVzdE9iamVjdChcIlwiKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG9wZXJhdGlvbiA9IGF3YWl0IGRyYWZ0LmV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uKGNvbnRleHQsIGNvbnRleHQuZ2V0VXBkYXRlR3JvdXBJZCgpLCB0cnVlLCBpZ25vcmVFVGFnKTtcblx0XHRcdC8vIGlmIHRoZXJlIGlzIG5vIHJldHVybmVkIG9wZXJhdGlvbiBieSBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbiAtPiB0aGUgYWN0aW9uIGhhcyBmYWlsZWRcblx0XHRcdGlmIChvcGVyYXRpb24gJiYgIWdldFJldHVyblR5cGUoY29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpKSB7XG5cdFx0XHRcdHJlcXVlc3RNZXNzYWdlcyhjb250ZXh0LCBhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9wZXJhdGlvbjtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZXNzYWdlc1wiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQWN0aXZhdGVzIGEgZHJhZnQgZG9jdW1lbnQuIFRoZSBkcmFmdCB3aWxsIHJlcGxhY2UgdGhlIHNpYmxpbmcgZW50aXR5IGFuZCB3aWxsIGJlIGRlbGV0ZWQgYnkgdGhlIGJhY2sgZW5kLlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG4gKiBAcGFyYW0gW3NHcm91cElkXSBUaGUgb3B0aW9uYWwgYmF0Y2ggZ3JvdXAgaW4gd2hpY2ggdGhlIG9wZXJhdGlvbiBpcyB0byBiZSBleGVjdXRlZFxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRzR3JvdXBJZD86IHN0cmluZ1xuKTogUHJvbWlzZTxDb250ZXh0PiB7XG5cdGNvbnN0IGJIYXNQcmVwYXJlQWN0aW9uID0gaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCk7XG5cdC8vIEFjY29yZGluZyB0byB0aGUgZHJhZnQgc3BlYyBpZiB0aGUgc2VydmljZSBjb250YWlucyBhIHByZXBhcmUgYWN0aW9uIGFuZCB3ZSB0cmlnZ2VyIGJvdGggcHJlcGFyZSBhbmRcblx0Ly8gYWN0aXZhdGUgaW4gb25lICRiYXRjaCB0aGUgYWN0aXZhdGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRoIGlGLU1hdGNoPSpcblx0Y29uc3QgYklnbm9yZUV0YWcgPSBiSGFzUHJlcGFyZUFjdGlvbjtcblxuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuQUNUSVZBVElPTiwgeyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUgfSk7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IGdldFJlc291cmNlTW9kZWwob0FwcENvbXBvbmVudCk7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX09QX09CSkVDVF9QQUdFX1NBVkVcIik7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBhd2FpdCBvT3BlcmF0aW9uLmV4ZWN1dGUoXG5cdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRiSWdub3JlRXRhZyxcblx0XHRcdFx0c0dyb3VwSWRcblx0XHRcdFx0XHQ/IG9wZXJhdGlvbnNIZWxwZXIuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoXG5cdFx0XHRcdFx0XHRcdGRyYWZ0LFxuXHRcdFx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRcdFx0eyBsYWJlbDogc0FjdGlvbk5hbWUsIG1vZGVsOiBvQ29udGV4dC5nZXRNb2RlbCgpIH0sXG5cdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHR1bmRlZmluZWRcblx0XHRcdFx0XHQgIClcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpXG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGlmIChiSGFzUHJlcGFyZUFjdGlvbikge1xuXHRcdFx0XHRjb25zdCBhY3Rpb25OYW1lID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpLFxuXHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLFxuXHRcdFx0XHRcdG9CaW5kaW5nUGFyYW1ldGVycyA9IG9TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhhY3Rpb25OYW1lLCBvQ29udGV4dCksXG5cdFx0XHRcdFx0YVRhcmdldFBhdGhzID0gb0JpbmRpbmdQYXJhbWV0ZXJzICYmIG9CaW5kaW5nUGFyYW1ldGVycy5wYXRoRXhwcmVzc2lvbnM7XG5cdFx0XHRcdGlmIChhVGFyZ2V0UGF0aHMgJiYgYVRhcmdldFBhdGhzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgb1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoYVRhcmdldFBhdGhzLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1wiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IHJlcXVlc3RNZXNzYWdlcyhvQ29udGV4dCwgb1NpZGVFZmZlY3RzU2VydmljZSk7XG5cdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIG1lc3NhZ2VzXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIGFjdGl2YXRpb24gYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzdXBwb3J0ZWQgbWVzc2FnZSBwcm9wZXJ0eSBwYXRoIG9uIHRoZSBQcmVwYXJlQWN0aW9uIGZvciBhIGNvbnRleHQuXG4gKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIFBhdGggdG8gdGhlIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZVBhdGhGb3JQcmVwYXJlKGNvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHQvLyBJZiB0aGVyZSBpcyBubyByZXR1cm4gcGFyYW1ldGVyLCBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVxdWVzdCBNZXNzYWdlcy5cblx0Ly8gUkFQIGRyYWZ0IHByZXBhcmUgaGFzIG5vIHJldHVybiBwYXJhbWV0ZXJcblx0cmV0dXJuIGdldFJldHVyblR5cGUoY29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpID8gZ2V0TWVzc2FnZVBhdGhGb3JDb250ZXh0KGNvbnRleHQpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHN1cHBvcnRlZCBtZXNzYWdlIHByb3BlcnR5IHBhdGggZm9yIGEgY29udGV4dC5cbiAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgUGF0aCB0byB0aGUgbWVzc2FnZVxuICovXG5mdW5jdGlvbiBnZXRNZXNzYWdlUGF0aEZvckNvbnRleHQoY29udGV4dDogQ29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IG1ldGFDb250ZXh0ID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0Y29uc3QgY29udmVydGVkQ29udGV4dCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCk7XG5cdGNvbnN0IG1lc3NhZ2VzID0gY29udmVydGVkQ29udGV4dC50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uTWVzc2FnZXM7XG5cdHJldHVybiBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihtZXNzYWdlcykgPyBtZXNzYWdlcy5wYXRoIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEV4ZWN1dGUgYSBwcmVwYXJhdGlvbiBhY3Rpb24uXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gZ3JvdXBJZCBUaGUgb3B0aW9uYWwgYmF0Y2ggZ3JvdXAgaW4gd2hpY2ggd2Ugd2FudCB0byBleGVjdXRlIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBiTWVzc2FnZXMgSWYgc2V0IHRvIHRydWUsIHRoZSBQUkVQQVJFIGFjdGlvbiByZXRyaWV2ZXMgU0FQX01lc3NhZ2VzXG4gKiBAcGFyYW0gaWdub3JlRVRhZyBJZiBzZXQgdG8gdHJ1ZSwgRVRhZyBpbmZvcm1hdGlvbiBpcyBpZ25vcmVkIHdoZW4gdGhlIGFjdGlvbiBpcyBleGVjdXRlZFxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24oXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRncm91cElkPzogc3RyaW5nLFxuXHRiTWVzc2FnZXM/OiBib29sZWFuLFxuXHRpZ25vcmVFVGFnPzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkIHwgT0RhdGFDb250ZXh0QmluZGluZz4ge1xuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gYk1lc3NhZ2VzID8gZ2V0TWVzc2FnZVBhdGhGb3JQcmVwYXJlKG9Db250ZXh0KSA6IHVuZGVmaW5lZDtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSwgc01lc3NhZ2VzUGF0aCA/IHsgJHNlbGVjdDogc01lc3NhZ2VzUGF0aCB9IDogdW5kZWZpbmVkKTtcblxuXHRcdC8vIFRPRE86IHNpZGUgZWZmZWN0cyBxdWFsaWZpZXIgc2hhbGwgYmUgZXZlbiBkZXByZWNhdGVkIHRvIGJlIGNoZWNrZWRcblx0XHRvT3BlcmF0aW9uLnNldFBhcmFtZXRlcihcIlNpZGVFZmZlY3RzUXVhbGlmaWVyXCIsIFwiXCIpO1xuXG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBncm91cElkIHx8IG9PcGVyYXRpb24uZ2V0R3JvdXBJZCgpO1xuXHRcdHJldHVybiBvT3BlcmF0aW9uXG5cdFx0XHQuZXhlY3V0ZShzR3JvdXBJZCwgaWdub3JlRVRhZylcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIG9PcGVyYXRpb247XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb25cIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJlcGFyYXRpb24gYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBSZXF1ZXN0cyB0aGUgbWVzc2FnZXMgaWYgYW5ub3RhdGVkIGZvciBhIGdpdmVuIGNvbnRleHQuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIG1lc3NhZ2VzIHNoYWxsIGJlIHJlcXVlc3RlZFxuICogQHBhcmFtIG9TaWRlRWZmZWN0c1NlcnZpY2UgU2VydmljZSBmb3IgdGhlIFNpZGVFZmZlY3RzIG9uIFNBUCBGaW9yaSBlbGVtZW50c1xuICogQHJldHVybnMgUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIG1lc3NhZ2VzIHdlcmUgcmVxdWVzdGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RNZXNzYWdlcyhvQ29udGV4dDogQ29udGV4dCwgb1NpZGVFZmZlY3RzU2VydmljZTogU2lkZUVmZmVjdHNTZXJ2aWNlKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSwgb0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRyZXR1cm4gb1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3NNZXNzYWdlc1BhdGhdLCBvQ29udGV4dCk7XG5cdH1cblx0cmV0dXJuO1xufVxuLyoqXG4gKiBFeGVjdXRlcyBkaXNjYXJkIG9mIGEgZHJhZnQgZnVuY3Rpb24gdXNpbmcgSFRUUCBQb3N0LlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgY29udHJvbGxlciBleHRlbnNpb25cbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IEFwcCBDb21wb25lbnRcbiAqIEBwYXJhbSBiRW5hYmxlU3RyaWN0SGFuZGxpbmdcbiAqIEByZXR1cm5zIFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24oXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdG9BcHBDb21wb25lbnQ/OiBBcHBDb21wb25lbnQsXG5cdGJFbmFibGVTdHJpY3RIYW5kbGluZz86IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvRGlzY2FyZE9wZXJhdGlvbiA9IGRyYWZ0LmNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkRJU0NBUkQpO1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBvQXBwQ29tcG9uZW50ICYmIGdldFJlc291cmNlTW9kZWwob0FwcENvbXBvbmVudCk7XG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBcImRpcmVjdFwiO1xuXHRcdGNvbnN0IHNBY3Rpb25OYW1lID0gcmVzb3VyY2VNb2RlbD8uZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIpIHx8IFwiXCI7XG5cdFx0Ly8gYXMgdGhlIGRpc2NhcmQgYWN0aW9uIGRvZXNudCcgc2VuZCB0aGUgYWN0aXZlIHZlcnNpb24gaW4gdGhlIHJlc3BvbnNlIHdlIGRvIG5vdCB1c2UgdGhlIHJlcGxhY2UgaW4gY2FjaGVcblx0XHRjb25zdCBvRGlzY2FyZFByb21pc2UgPSAhYkVuYWJsZVN0cmljdEhhbmRsaW5nXG5cdFx0XHQ/IG9EaXNjYXJkT3BlcmF0aW9uLmV4ZWN1dGUoc0dyb3VwSWQpXG5cdFx0XHQ6IG9EaXNjYXJkT3BlcmF0aW9uLmV4ZWN1dGUoXG5cdFx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdG9wZXJhdGlvbnNIZWxwZXIuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoXG5cdFx0XHRcdFx0XHRkcmFmdCxcblx0XHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdFx0eyBsYWJlbDogc0FjdGlvbk5hbWUsIG1vZGVsOiBvQ29udGV4dC5nZXRNb2RlbCgpIH0sXG5cdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHR1bmRlZmluZWRcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGZhbHNlXG5cdFx0XHQgICk7XG5cdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0YXdhaXQgb0Rpc2NhcmRQcm9taXNlO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBkaXNjYXJkIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHNpYmxpbmcgY29udGV4dCBmb3IgYSBzdWJvYmplY3QgcGFnZSBhbmQgY2FsY3VsYXRlcyBhIHNpYmxpbmcgcGF0aCBmb3IgYWxsIGludGVybWVkaWF0ZSBwYXRoc1xuICogYmV0d2VlbiB0aGUgb2JqZWN0IHBhZ2UgYW5kIHRoZSBzdWJvYmplY3QgcGFnZS5cbiAqIEBwYXJhbSByb290Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSByb290IG9mIHRoZSBkcmFmdFxuICogQHBhcmFtIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBzdWJvYmplY3QgcGFnZVxuICogQHBhcmFtIHJvb3RDb250ZXh0SW5mbyBUaGUgY29udGV4dCBpbmZvIG9mIHJvb3Qgb2YgdGhlIGRyYWZ0XG4gKiBAcGFyYW0gZ3JvdXBJZFxuICogQHJldHVybnMgVGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0cm9vdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0LFxuXHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0cm9vdENvbnRleHRJbmZvPzogUm9vdENvbnRleHRJbmZvLFxuXHRncm91cElkPzogc3RyaW5nXG4pOiBQcm9taXNlPFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZD4ge1xuXHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0Ly8gV3JvbmcgdXNhZ2UgISFcblx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdH1cblxuXHRpZiAoXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2UgJiZcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2Vcblx0KSB7XG5cdFx0Ly8gV2UgYWxyZWFkeSBrbm93IHRoZSBzaWJsaW5nIGZvciByaWdodG1vc3RDdXJyZW50Q29udGV4dCBkb2Vzbid0IGV4aXN0XG5cdFx0Ly8gLS0+IE5vIG5lZWQgdG8gY2hlY2sgY2Fub25pY2FsIHBhdGhzIGV0Yy4uLlxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRjb25zdCBtb2RlbCA9IHJvb3RDdXJyZW50Q29udGV4dC5nZXRNb2RlbCgpO1xuXHR0cnkge1xuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDEuIEZpbmQgYWxsIHNlZ21lbnRzIGJldHdlZW4gdGhlIHJvb3Qgb2JqZWN0IGFuZCB0aGUgc3ViLW9iamVjdFxuXHRcdC8vIEV4YW1wbGU6IGZvciByb290ID0gL1BhcmFtKGFhKS9FbnRpdHkoYmIpIGFuZCByaWdodE1vc3QgPSAvUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvX1N1Yk5hdihkZClcblx0XHQvLyAtLS0+IFtcIlBhcmFtKGFhKS9FbnRpdHkoYmIpXCIsIFwiX05hdihjYylcIiwgXCJfU3ViTmF2KGRkKVwiXVxuXG5cdFx0Ly8gRmluZCBhbGwgc2VnbWVudHMgaW4gdGhlIHJpZ2h0bW9zdCBwYXRoXG5cdFx0Y29uc3QgYWRkaXRpb25hbFBhdGggPSByaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkucmVwbGFjZShyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLCBcIlwiKTtcblx0XHRjb25zdCBzZWdtZW50cyA9IGFkZGl0aW9uYWxQYXRoID8gYWRkaXRpb25hbFBhdGguc3Vic3RyaW5nKDEpLnNwbGl0KFwiL1wiKSA6IFtdO1xuXHRcdC8vIEZpcnN0IHNlZ21lbnQgaXMgYWx3YXlzIHRoZSBmdWxsIHBhdGggb2YgdGhlIHJvb3Qgb2JqZWN0LCB3aGljaCBjYW4gY29udGFpbiAnLycgaW4gY2FzZSBvZiBhIHBhcmFtZXRyaXplZCBlbnRpdHlcblx0XHRzZWdtZW50cy51bnNoaWZ0KHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDIuIFJlcXVlc3QgY2Fub25pY2FsIHBhdGhzIG9mIHRoZSBzaWJsaW5nIGVudGl0eSBmb3IgZWFjaCBzZWdtZW50XG5cdFx0Ly8gRXhhbXBsZTogZm9yIFtcIlBhcmFtKGFhKS9FbnRpdHkoYmIpXCIsIFwiX05hdihjYylcIiwgXCJfU3ViTmF2KGRkKVwiXVxuXHRcdC8vIC0tPiByZXF1ZXN0IGNhbm9uaWNhbCBwYXRocyBmb3IgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9TaWJsaW5nRW50aXR5XCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvU2libGluZ0VudGl0eVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL19TdWJOYXYoZGQpL1NpYmxpbmdFbnRpdHlcIlxuXHRcdGNvbnN0IG9sZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IG5ld1BhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGxldCBjdXJyZW50UGF0aCA9IFwiXCI7XG5cblx0XHQvLyBDb21wdXRpbmcgc2libGluZyBlbnRpdHkgb2Ygcm9vdCBvZiB0aGUgZHJhZnQgY29udGV4dCBpcyBub3QgcmVxdWlyZWQgaWYgdGhlIGNvbnRleHQgaXMgYWxyZWFkeSBpbiB0aGUgc3ViLU9QXG5cdFx0Ly8gRXhhbXBsZTogRWRpdCBpbiBTdWItT1Agd2hlcmUgbmV3IGNvbnRleHQgaXMgYWxyZWFkeSBhdmFpbGFibGVcblx0XHRjb25zdCBwYXRocyA9IFsuLi5zZWdtZW50c107XG5cdFx0aWYgKHJvb3RDb250ZXh0SW5mbz8ucm9vdFNpYmxpbmdQYXRoUHJvbWlzZSkge1xuXHRcdFx0cGF0aHMuc2hpZnQoKTtcblx0XHRcdGN1cnJlbnRQYXRoID0gXCIvXCIgKyByb290Q3VycmVudENvbnRleHQ/LmdldFBhdGgoKT8uc3Vic3RyaW5nKDEpO1xuXHRcdH1cblx0XHRjb25zdCBjYW5vbmljYWxQYXRoUHJvbWlzZXMgPSBwYXRocy5tYXAoYXN5bmMgKHNlZ21lbnQpID0+IHtcblx0XHRcdGN1cnJlbnRQYXRoICs9IGAvJHtzZWdtZW50fWA7XG5cdFx0XHRvbGRQYXRocy51bnNoaWZ0KGN1cnJlbnRQYXRoKTtcblx0XHRcdGlmIChjdXJyZW50UGF0aC5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBtb2RlbFxuXHRcdFx0XHRcdC5iaW5kQ29udGV4dChgJHtjdXJyZW50UGF0aH0vU2libGluZ0VudGl0eWAsIHVuZGVmaW5lZCwgZ3JvdXBJZCA/IHsgJCRncm91cElkOiBncm91cElkIH0gOiB1bmRlZmluZWQpXG5cdFx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRyZXR1cm4gc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTsgLy8gMS0xIHJlbGF0aW9uXG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAzLiBSZWNvbnN0cnVjdCB0aGUgZnVsbCBwYXRocyBmcm9tIGNhbm9uaWNhbCBwYXRocyAoZm9yIHBhdGggbWFwcGluZylcblx0XHQvLyBFeGFtcGxlOiBmb3IgY2Fub25pY2FsIHBhdGhzIFwiL1BhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZylcIiwgXCIvRW50aXR5MihjYy1zaWJsaW5nKVwiLCBcIi9FbnRpdHkzKGRkLXNpYmxpbmcpXCJcblx0XHQvLyAtLT4gW1wiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZykvX05hdihjYy1zaWJsaW5nKVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZykvX05hdihjYy1zaWJsaW5nKS9fU3ViTmF2KGRkLXNpYmxpbmcpXCJdXG5cdFx0Y29uc3QgY2Fub25pY2FsUGF0aHMgPSAoYXdhaXQgUHJvbWlzZS5hbGwoY2Fub25pY2FsUGF0aFByb21pc2VzKSkgYXMgc3RyaW5nW107XG5cblx0XHRpZiAocm9vdENvbnRleHRJbmZvPy5yb290U2libGluZ1BhdGhQcm9taXNlKSB7XG5cdFx0XHRjb25zdCByb290U2libGluZ1BhdGggPSAoYXdhaXQgcm9vdENvbnRleHRJbmZvLnJvb3RTaWJsaW5nUGF0aFByb21pc2UpPy5nZXRQYXRoKCkgYXMgc3RyaW5nO1xuXHRcdFx0Y2Fub25pY2FsUGF0aHMudW5zaGlmdChyb290U2libGluZ1BhdGgpO1xuXHRcdFx0b2xkUGF0aHMucHVzaChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHR9XG5cdFx0bGV0IHNpYmxpbmdQYXRoID0gXCJcIjtcblx0XHRjYW5vbmljYWxQYXRocy5mb3JFYWNoKChjYW5vbmljYWxQYXRoLCBpbmRleCkgPT4ge1xuXHRcdFx0aWYgKGluZGV4ICE9PSAwKSB7XG5cdFx0XHRcdGlmIChzZWdtZW50c1tpbmRleF0uZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvbiA9IHNlZ21lbnRzW2luZGV4XS5yZXBsYWNlKC9cXCguKiQvLCBcIlwiKTsgLy8gS2VlcCBvbmx5IG5hdmlnYXRpb24gbmFtZSBmcm9tIHRoZSBzZWdtZW50LCBpLmUuIGFhYSh4eHgpIC0tPiBhYWFcblx0XHRcdFx0XHRjb25zdCBrZXlzID0gY2Fub25pY2FsUGF0aC5yZXBsYWNlKC8uKlxcKC8sIFwiKFwiKTsgLy8gS2VlcCBvbmx5IHRoZSBrZXlzIGZyb20gdGhlIGNhbm9uaWNhbCBwYXRoLCBpLmUuIGFhYSh4eHgpIC0tPiAoeHh4KVxuXHRcdFx0XHRcdHNpYmxpbmdQYXRoICs9IGAvJHtuYXZpZ2F0aW9ufSR7a2V5c31gO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNpYmxpbmdQYXRoICs9IGAvJHtzZWdtZW50c1tpbmRleF19YDsgLy8gMS0xIHJlbGF0aW9uXG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNpYmxpbmdQYXRoID0gY2Fub25pY2FsUGF0aDsgLy8gVG8gbWFuYWdlIHBhcmFtZXRyaXplZCBlbnRpdGllc1xuXHRcdFx0fVxuXHRcdFx0bmV3UGF0aHMudW5zaGlmdChzaWJsaW5nUGF0aCk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0Q29udGV4dDogbW9kZWxcblx0XHRcdFx0LmJpbmRDb250ZXh0KHNpYmxpbmdQYXRoLCB1bmRlZmluZWQsIHtcblx0XHRcdFx0XHQkc2VsZWN0OiBnZXRNZXNzYWdlUGF0aEZvckNvbnRleHQocmlnaHRtb3N0Q3VycmVudENvbnRleHQpLFxuXHRcdFx0XHRcdCQkZ3JvdXBJZDogXCIkYXV0by5IZXJvZXNcIlxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZ2V0Qm91bmRDb250ZXh0KCksIC8vIENyZWF0ZSB0aGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dCBmcm9tIGl0cyBwYXRoXG5cdFx0XHRwYXRoTWFwcGluZzogb2xkUGF0aHMubWFwKChvbGRQYXRoLCBpbmRleCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG9sZFBhdGgsXG5cdFx0XHRcdFx0bmV3UGF0aDogbmV3UGF0aHNbaW5kZXhdXG5cdFx0XHRcdH07XG5cdFx0XHR9KVxuXHRcdH07XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gQSBjYW5vbmljYWwgcGF0aCBjb3VsZG4ndCBiZSByZXNvbHZlZCAoYmVjYXVzZSBhIHNpYmxpbmcgZG9lc24ndCBleGlzdClcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRyYWZ0IGRvY3VtZW50IGZyb20gYW4gZXhpc3RpbmcgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNvcmVvZ3JhcGh5IGRlZmluZWQuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMub1ZpZXddIFRoZSB2aWV3XG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmJQcmVzZXJ2ZUNoYW5nZXNdIFByZXNlcnZlIGNoYW5nZXMgb2YgYW4gZXhpc3RpbmcgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKiBAcGFyYW0gZ3JvdXBJZCBUaGUgYmF0Y2ggZ3JvdXBJZCBmb3IgcG9zdCBjYWxsIG9mIGVkaXQgYWN0aW9uXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IHtcblx0XHRvVmlldzogRkVWaWV3O1xuXHRcdGJQcmVzZXJ2ZUNoYW5nZXM/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHR9LFxuXHRncm91cElkOiBzdHJpbmcsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlclxuKTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9LFxuXHRcdGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93ID1cblx0XHRcdHR5cGVvZiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyA9PT0gXCJ1bmRlZmluZWRcIiB8fCAodHlwZW9mIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzID09PSBcImJvb2xlYW5cIiAmJiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyk7IC8vZGVmYXVsdCB0cnVlXG5cblx0LyoqXG5cdCAqIE92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgY2hhbmdlLlxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0IG9yIHRoZSBlcnJvciByZXRyaWV2ZWRcblx0ICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCByZXN1bHQgb2Yge0BsaW5rIHNhcC5mZS5jb3JlLmFjdGlvbnMjZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbn1cblx0ICovXG5cdGFzeW5jIGZ1bmN0aW9uIG92ZXJ3cml0ZUNoYW5nZShyZXNwb25zZTogQ29udGV4dCB8IENvbnRleHRFcnJvclR5cGUpOiBQcm9taXNlPENvbnRleHQgfCBDb250ZXh0RXJyb3JUeXBlIHwgdW5kZWZpbmVkPiB7XG5cdFx0Ly9PdmVyd3JpdGUgZXhpc3RpbmcgY2hhbmdlc1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgZHJhZnREYXRhQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhYCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IGdldFJlc291cmNlTW9kZWwobVBhcmFtZXRlcnMub1ZpZXcpO1xuXHRcdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gYXdhaXQgZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHQvLyByZW1vdmUgYWxsIHVuYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcyB3ZSBzaG93IGEgc3BlY2lhbCBkaWFsb2dcblx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRsZXQgc0luZm8gPSBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gbVBhcmFtZXRlcnMub1ZpZXcuZ2V0Vmlld0RhdGEoKS5lbnRpdHlTZXQ7XG5cdFx0XHRpZiAoc0luZm8pIHtcblx0XHRcdFx0Y29uc3Qgc0xvY2tlZEJ5VXNlck1zZyA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfTE9DS0VEX0JZX1VTRVJcIiwgc0luZm8sIHNFbnRpdHlTZXQpO1xuXHRcdFx0XHRNZXNzYWdlQm94LmVycm9yKHNMb2NrZWRCeVVzZXJNc2cpO1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzSW5mbyA9IGRyYWZ0QWRtaW5EYXRhLkNyZWF0ZWRCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyO1xuXHRcdFx0XHRjb25zdCBzVW5zYXZlZENoYW5nZXNNc2cgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0RSQUZUX09CSkVDVF9QQUdFX0RSQUZUX1VOU0FWRURfQ0hBTkdFU1wiLCBzSW5mbywgc0VudGl0eVNldCk7XG5cdFx0XHRcdGF3YWl0IGRyYWZ0LnNob3dFZGl0Q29uZmlybWF0aW9uTWVzc2FnZUJveChzVW5zYXZlZENoYW5nZXNNc2csIG9Db250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIGRyYWZ0LmV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGZhbHNlLCBtUGFyYW1ldGVycy5vVmlldywgZ3JvdXBJZCwgbWVzc2FnZUhhbmRsZXIsIHRydWUpOyAvLyB0cnVlIGJlY2F1c2Ugd2Ugb3ZlcndyaXRlIGNoYW5nZXNcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKChyZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKT8ubWVzc2FnZSkge1xuXHRcdFx0TWVzc2FnZUJveC5lcnJvcigocmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSkubWVzc2FnZSk7XG5cdFx0fVxuXHRcdHRocm93IG5ldyBFcnJvcihgRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHR9XG5cblx0aWYgKCFvQ29udGV4dCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIik7XG5cdH1cblx0bGV0IG9EcmFmdENvbnRleHQ6IENvbnRleHQgfCBDb250ZXh0RXJyb3JUeXBlIHwgdW5kZWZpbmVkO1xuXHR0cnkge1xuXHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBkcmFmdC5leGVjdXRlRHJhZnRFZGl0QWN0aW9uKG9Db250ZXh0LCBiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdywgbVBhcmFtZXRlcnMub1ZpZXcsIGdyb3VwSWQsIG1lc3NhZ2VIYW5kbGVyKTtcblx0fSBjYXRjaCAob1Jlc3BvbnNlKSB7XG5cdFx0aWYgKChvUmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSkuc3RhdHVzID09PSA0MDkgfHwgKG9SZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKS5zdGF0dXMgPT09IDQyMykge1xuXHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0Y29uc3Qgc2libGluZ0luZm8gPSBhd2FpdCBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCBvQ29udGV4dCk7XG5cdFx0XHRpZiAoc2libGluZ0luZm8/LnRhcmdldENvbnRleHQpIHtcblx0XHRcdFx0Ly90aGVyZSBpcyBhIGNvbnRleHQgYXV0aG9yaXplZCB0byBiZSBlZGl0ZWQgYnkgdGhlIGN1cnJlbnQgdXNlclxuXHRcdFx0XHRhd2FpdCBDb21tb25VdGlscy53YWl0Rm9yQ29udGV4dFJlcXVlc3RlZChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvL3RoZXJlIGlzIG5vIGRyYWZ0IG93bmVkIGJ5IHRoZSBjdXJyZW50IHVzZXJcblx0XHRcdFx0b0RyYWZ0Q29udGV4dCA9IGF3YWl0IG92ZXJ3cml0ZUNoYW5nZShvUmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghKG9SZXNwb25zZSAmJiAob1Jlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpLmNhbmNlbGVkKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKG9SZXNwb25zZSBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdGlmIChvRHJhZnRDb250ZXh0KSB7XG5cdFx0Y29uc3Qgc0VkaXRBY3Rpb25OYW1lID0gZHJhZnQuZ2V0QWN0aW9uTmFtZShvRHJhZnRDb250ZXh0IGFzIENvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5FRElUKTtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHMgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0VkaXRBY3Rpb25OYW1lLCBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdGlmIChvU2lkZUVmZmVjdHM/LnRyaWdnZXJBY3Rpb25zPy5sZW5ndGgpIHtcblx0XHRcdGF3YWl0IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24ob1NpZGVFZmZlY3RzLCBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQgYXMgQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQgYXMgQ29udGV4dDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGFjdGl2ZSBkb2N1bWVudCBmcm9tIGEgZHJhZnQgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNob3Jlb2dyYXBoeSBkZWZpbmVkLlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudF0gQ2FsbGJhY2sgdGhhdCBhbGxvd3MgYSB2ZXRvIGJlZm9yZSB0aGUgJ0NyZWF0ZScgcmVxdWVzdCBpcyBleGVjdXRlZFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudF0gQ2FsbGJhY2sgZm9yIHBvc3Rwcm9jZXNzaW5nIGFmdGVyIGRvY3VtZW50IHdhcyBhY3RpdmF0ZWQuXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICovXG5hc3luYyBmdW5jdGlvbiBhY3RpdmF0ZURvY3VtZW50KFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtUGFyYW1ldGVyczogeyBmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQ/OiBGdW5jdGlvbjsgZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQ/OiBGdW5jdGlvbiB9LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcbik6IFByb21pc2U8Q29udGV4dD4ge1xuXHRjb25zdCBtUGFyYW0gPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0aWYgKCFvQ29udGV4dCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBkcmFmdCBkb2N1bWVudCBpcyByZXF1aXJlZFwiKTtcblx0fVxuXG5cdGNvbnN0IGJFeGVjdXRlID0gbVBhcmFtLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudCA/IGF3YWl0IG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQpIDogdHJ1ZTtcblx0aWYgKCFiRXhlY3V0ZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgQWN0aXZhdGlvbiBvZiB0aGUgZG9jdW1lbnQgd2FzIGFib3J0ZWQgYnkgZXh0ZW5zaW9uIGZvciBkb2N1bWVudDogJHtvQ29udGV4dC5nZXRQYXRoKCl9YCk7XG5cdH1cblxuXHRsZXQgb0FjdGl2ZURvY3VtZW50Q29udGV4dDogQ29udGV4dDtcblx0aWYgKCFoYXNQcmVwYXJlQWN0aW9uKG9Db250ZXh0KSkge1xuXHRcdG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSBhd2FpdCBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50LCBtZXNzYWdlSGFuZGxlcik7XG5cdH0gZWxzZSB7XG5cdFx0LyogYWN0aXZhdGlvbiByZXF1aXJlcyBwcmVwYXJhdGlvbiAqL1xuXHRcdGNvbnN0IHNCYXRjaEdyb3VwID0gXCIkYXV0b1wiO1xuXHRcdC8vd2hlbiB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIHRoZXJlIHdpbGwgYmUgYSBwYXRjaCByZXF1ZXN0IG1lcmdlZCB0b2dldGhlciB3aXRoIHRoZSBkcmFmdFByZXBhcmUgYW5kIGRyYWZ0QWNpdmF0ZS5cblx0XHQvL1RoZSBwYXRjaCBjaGFuZ2VzIHRoZSBFdGFnLCB0aGVyZm9yZSB0aGUgcHJlcGFyZSBuZWVkcyB0byBpZ25vcmUgRXRhZ3Ncblx0XHRjb25zdCBpZ25vcmVFdGFnOiBib29sZWFuID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdC8vIHdlIHVzZSB0aGUgc2FtZSBiYXRjaEdyb3VwIHRvIGZvcmNlIHByZXBhcmUgYW5kIGFjdGl2YXRlIGluIGEgc2FtZSBiYXRjaCBidXQgd2l0aCBkaWZmZXJlbnQgY2hhbmdlc2V0XG5cdFx0bGV0IG9QcmVwYXJlUHJvbWlzZSA9IGRyYWZ0LmV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uKG9Db250ZXh0LCBzQmF0Y2hHcm91cCwgdW5kZWZpbmVkLCBpZ25vcmVFdGFnKTtcblx0XHRvQ29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKHNCYXRjaEdyb3VwKTtcblx0XHRjb25zdCBvQWN0aXZhdGVQcm9taXNlID0gZHJhZnQuZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihvQ29udGV4dCwgb0FwcENvbXBvbmVudCwgbWVzc2FnZUhhbmRsZXIsIHNCYXRjaEdyb3VwKTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdmFsdWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoW29QcmVwYXJlUHJvbWlzZSwgb0FjdGl2YXRlUHJvbWlzZV0pO1xuXHRcdFx0b0FjdGl2ZURvY3VtZW50Q29udGV4dCA9IHZhbHVlc1sxXTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdC8vIEJDUCAyMjcwMDg0MDc1XG5cdFx0XHQvLyBpZiB0aGUgQWN0aXZhdGlvbiBmYWlscywgdGhlbiB0aGUgbWVzc2FnZXMgYXJlIHJldHJpZXZlZCBmcm9tIFBSRVBBUkFUSU9OIGFjdGlvblxuXHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IGdldE1lc3NhZ2VQYXRoRm9yUHJlcGFyZShvQ29udGV4dCk7XG5cdFx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0XHRvUHJlcGFyZVByb21pc2UgPSBkcmFmdC5leGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihvQ29udGV4dCwgc0JhdGNoR3JvdXAsIHRydWUpO1xuXHRcdFx0XHRvQ29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKHNCYXRjaEdyb3VwKTtcblx0XHRcdFx0YXdhaXQgb1ByZXBhcmVQcm9taXNlO1xuXHRcdFx0XHRjb25zdCBkYXRhID0gYXdhaXQgb0NvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdFx0XHRpZiAoZGF0YVtzTWVzc2FnZXNQYXRoXS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Ly9pZiBtZXNzYWdlcyBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIFBSRVBBUkFUSU9OIGFjdGlvbiwgdGhlbiBwcmV2aW91cyB0cmFuc2l0aW9uIG1lc3NhZ2VzIGFyZSByZW1vdmVkXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI/LnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyhmYWxzZSwgZmFsc2UsIG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRocm93IGVycjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1QYXJhbS5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudCA/IG1QYXJhbS5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudChvQ29udGV4dCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCkgOiBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xufVxuXG4vKipcbiAqIERpc3BsYXkgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgYm94IGFmdGVyIHByZXNzaW5nIHRoZSBlZGl0IGJ1dHRvbiBvZiBhbiBvYmplY3QgcGFnZSB3aXRoIHVuc2F2ZWQgY2hhbmdlcy5cbiAqIEBwYXJhbSBzVW5zYXZlZENoYW5nZXNNc2cgRGlhbG9nIGJveCBtZXNzYWdlIGluZm9ybWluZyB0aGUgdXNlciB0aGF0IGlmIGhlIHN0YXJ0cyBlZGl0aW5nLCB0aGUgcHJldmlvdXMgdW5zYXZlZCBjaGFuZ2VzIHdpbGwgYmUgbG9zdFxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlc1xuICovXG5hc3luYyBmdW5jdGlvbiBzaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnOiBzdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGNvbnN0IGxvY2FsSTE4blJlZiA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiB1bmtub3duKSA9PiB2b2lkKSB7XG5cdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0dGl0bGU6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfV0FSTklOR1wiKSxcblx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHtcblx0XHRcdFx0dGV4dDogc1Vuc2F2ZWRDaGFuZ2VzTXNnXG5cdFx0XHR9KSxcblx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9FRElUXCIpLFxuXHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0NBTkNFTFwiKSxcblx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0cmVqZWN0KGBEcmFmdCBjcmVhdGlvbiBhYm9ydGVkIGZvciBkb2N1bWVudDogJHtvQ29udGV4dC5nZXRQYXRoKCl9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRvRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdG9EaWFsb2cub3BlbigpO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBIVFRQIFBPU1QgY2FsbCB3aGVuIERyYWZ0QWN0aW9uIGlzIHByZXNlbnQgZm9yIERyYWZ0IERlbGV0ZTsgSFRUUCBERUxFVEUgY2FsbCB3aGVuIHRoZXJlIGlzIG5vIERyYWZ0QWN0aW9uXG4gKiBhbmQgQWN0aXZlIEluc3RhbmNlIGFsd2F5cyB1c2VzIERFTEVURS5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBkaXNjYXJkZWRcbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBkaXNjYXJkZWRcbiAqIEBwYXJhbSBiRW5hYmxlU3RyaWN0SGFuZGxpbmdcbiAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGRlbGV0ZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlRHJhZnQoXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdG9BcHBDb21wb25lbnQ/OiBBcHBDb21wb25lbnQsXG5cdGJFbmFibGVTdHJpY3RIYW5kbGluZz86IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBzRGlzY2FyZEFjdGlvbiA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5ESVNDQVJEKSxcblx0XHRiSXNBY3RpdmVFbnRpdHkgPSBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eTtcblxuXHRpZiAoYklzQWN0aXZlRW50aXR5IHx8ICghYklzQWN0aXZlRW50aXR5ICYmICFzRGlzY2FyZEFjdGlvbikpIHtcblx0XHQvL1VzZSBEZWxldGUgaW4gY2FzZSBvZiBhY3RpdmUgZW50aXR5IGFuZCBubyBkaXNjYXJkIGFjdGlvbiBhdmFpbGFibGUgZm9yIGRyYWZ0XG5cdFx0aWYgKG9Db250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkgJiYgIW9Db250ZXh0LmlzSW5hY3RpdmUoKSkge1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0XG5cdFx0XHRcdC5nZXRCaW5kaW5nKClcblx0XHRcdFx0LnJlc2V0Q2hhbmdlcygpXG5cdFx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFdoZW4gY2FuY2VsbGluZyBhbiBlZGl0IGRyYWZ0IHJvb3Qgbm9kZSwgdXNlIG1vZGVsLmRlbGV0ZSBpbnN0ZWFkIG9mIGNvbnRleHQuZGVsZXRlLCB0byBvbmx5IHNlbmQgZGVsZXRpb24gdG8gYmFja2VuZCxcblx0XHRcdC8vIGJ1dCBrZWVwIGNvbnRleHQgYWxpdmUgKGluY2x1ZGluZyBiaW5kaW5ncykuIFRodXMsIHdlIGNhbiBlbnN1cmUgc2VhbWxlc3MgdHJhbnNpc3Rpb24gZnJvbSBkcmFmdCB0byBhY3RpdmUgaW5zdGFuY2Vcblx0XHRcdC8vICh3aXRob3V0IGludGVybWVkaWF0ZSB1bmRlZmluZWQgYmluZGluZ3MgZS5nLiBsZWFkaW5nIHRvIGZsaWNrZXJpbmcpLlxuXHRcdFx0Ly8gSW4gb3RoZXIgY2FzZXMgKGRlbGV0aW5nIGFjdGl2ZSwgZGlzY2FyZGluZyBjcmVhdGUgZHJhZnQgb3IgZGlzY2FyZGluZyBkcmFmdCBub2RlKSwgc3RheSB3aXRoIGNvbnRleHQuZGVsZXRlLlxuXHRcdFx0Ly8gV2hlbiBjYW5jZWxsaW5nIGEgY3JlYXRlIGRyYWZ0LCBwYWdlIGlzIGNsb3NlZCwgdGh1cyB0aGUgcHJvYmxlbSBvZiBmbGlja2VyaW5nIGNhbm5vdCBvY2N1ci5cblx0XHRcdC8vIEluIGNhc2Ugb2YgZGlzY2FyZGluZyBhIGRyYWZ0IG5vZGUsIHRoZW9yZXRpY2FsbHkgdGhlIHNhbWUgcHJvYmxlbSBjb3VsZFxuXHRcdFx0Ly8gb2NjdXIsIGJ1dCBuZWVkcyBxdWl0ZSBzcGVjaWZpYyBtb2RlbGxpbmcgKGJ1dHRvbiB2aXNpYmlsaXR5IG9uIGl0ZW0gbGV2ZWwgYm91bmQgYWdhaW5zdCBzZXJ2aWNlIHByb3BlcnR5IGluIGFuIEZDTCBhcHApXG5cdFx0XHQvLyBhbmQgYWN0aW5nIChsb29raW5nIGF0IGJ1dHRvbiBvbiB0aGlyZCBjb2x1bW4gd2hpbGUgZGlzY2FyZGluZyBvbiAybmQgY29sdW1uKS4gQ3VycmVudGx5LCBtb2RlbCBzZWVtcyBub3QgdG8gYmUgcHJlcGFyZWRcblx0XHRcdC8vIGZvciB0aGF0IGNhc2UsIHRodXMgZHVlIHRvIHRoZSBtaW5pbWFsIGltcGFjdCAob25seSBpbnRlcm1lZGlhdGUgdmlzdWFsIHN0YXRlKSwgYWNjZXB0aW5nIHRoaXMgZm9yIHRoZSB0aW1lIGJlaW5nLlxuXHRcdFx0cmV0dXJuICFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpICYmXG5cdFx0XHRcdE1vZGVsSGVscGVyLmlzRHJhZnRSb290KFxuXHRcdFx0XHRcdGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkpPy50YXJnZXRFbnRpdHlTZXRcblx0XHRcdFx0KVxuXHRcdFx0XHQ/IG9Db250ZXh0LmdldE1vZGVsKCkuZGVsZXRlKG9Db250ZXh0KVxuXHRcdFx0XHQ6IG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvL1VzZSBEaXNjYXJkIFBvc3QgQWN0aW9uIGlmIGl0IGlzIGEgZHJhZnQgZW50aXR5IGFuZCBkaXNjYXJkIGFjdGlvbiBleGlzdHNcblx0XHRhd2FpdCBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKG9Db250ZXh0LCBtZXNzYWdlSGFuZGxlciwgb0FwcENvbXBvbmVudCwgYkVuYWJsZVN0cmljdEhhbmRsaW5nKTtcblx0fVxufVxuXG5jb25zdCBkcmFmdCA9IHtcblx0Y3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ6IGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50LFxuXHRhY3RpdmF0ZURvY3VtZW50OiBhY3RpdmF0ZURvY3VtZW50LFxuXHRkZWxldGVEcmFmdDogZGVsZXRlRHJhZnQsXG5cdGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb246IGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24sXG5cdGV4ZWN1dGVEcmFmdFZhbGlkYXRpb246IGV4ZWN1dGVEcmFmdFZhbGlkYXRpb24sXG5cdGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uOiBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbixcblx0ZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbjogZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbixcblx0aGFzUHJlcGFyZUFjdGlvbjogaGFzUHJlcGFyZUFjdGlvbixcblx0Y29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbjogY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbixcblx0cHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb246IGRyYWZ0RGF0YUxvc3NQb3B1cC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbixcblx0c2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uOiBkcmFmdERhdGFMb3NzUG9wdXAuc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uLFxuXHRjcmVhdGVPcGVyYXRpb246IGNyZWF0ZU9wZXJhdGlvbixcblx0ZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbjogZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbixcblx0TmF2aWdhdGlvblR5cGU6IGRyYWZ0RGF0YUxvc3NQb3B1cC5OYXZpZ2F0aW9uVHlwZSxcblx0Z2V0QWN0aW9uTmFtZTogZ2V0QWN0aW9uTmFtZSxcblx0c2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94OiBzaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3hcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRyYWZ0O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0VBb0ZBO0VBQ0EsTUFBTUEsZUFBZSxHQUFHO0lBQ3ZCQyxJQUFJLEVBQUUsWUFBWTtJQUNsQkMsVUFBVSxFQUFFLGtCQUFrQjtJQUM5QkMsT0FBTyxFQUFFLGVBQWU7SUFDeEJDLE9BQU8sRUFBRTtFQUNWLENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNDLGFBQWFBLENBQUNDLFFBQWlCLEVBQUVDLFVBQWtCLEVBQVU7SUFDckUsTUFBTUMsTUFBTSxHQUFHRixRQUFRLENBQUNHLFFBQVEsQ0FBQyxDQUFDO01BQ2pDQyxVQUFVLEdBQUdGLE1BQU0sQ0FBQ0csWUFBWSxDQUFDLENBQUM7TUFDbENDLGNBQWMsR0FBR0YsVUFBVSxDQUFDRyxXQUFXLENBQUNQLFFBQVEsQ0FBQ1EsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUU1RCxPQUFPSixVQUFVLENBQUNLLFNBQVMsQ0FBQyxHQUFHSCxjQUFjLDZDQUE2Q0wsVUFBVSxFQUFFLENBQUM7RUFDeEc7RUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNTLGVBQWVBLENBQUNWLFFBQWlCLEVBQUVDLFVBQWtCLEVBQUVVLFFBQWdDLEVBQXVCO0lBQ3RILE1BQU1DLGNBQWMsR0FBR2IsYUFBYSxDQUFDQyxRQUFRLEVBQUVDLFVBQVUsQ0FBQztJQUUxRCxPQUFPRCxRQUFRLENBQUNHLFFBQVEsQ0FBQyxDQUFDLENBQUNVLFdBQVcsQ0FBQyxH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