@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
@@ -11,6 +11,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
11
11
  var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
12
12
  var convertTypes = MetaModelConverter.convertTypes;
13
13
  var compileExpression = BindingToolkit.compileExpression;
14
+ /* This class contains helpers to be used at runtime to retrieve further information on the model */
15
+ // TODO: Right now recommendations is not part of the UI vocabulary.
16
+ // hence we are adding it to the type.
17
+ // once this becomes part of the UI vocabulary then we can remove this.
18
+
14
19
  const ModelHelper = {
15
20
  // global switch to disable the collaboration draft by a private manifest flag
16
21
  // this allows customers to disable the collaboration draft in case we run into issues with the first delivery
@@ -18,7 +23,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
18
23
  disableCollaborationDraft: false,
19
24
  /**
20
25
  * Method to determine if the programming model is sticky.
21
- *
22
26
  * @param metaModel ODataModelMetaModel to check for sticky enabled entity
23
27
  * @returns Returns true if sticky, else false
24
28
  */
@@ -33,7 +37,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
33
37
  },
34
38
  /**
35
39
  * Method to determine if the programming model is draft.
36
- *
37
40
  * @param metaModel ODataModelMetaModel of the context for which draft support shall be checked
38
41
  * @param path Path for which draft support shall be checked
39
42
  * @returns Returns true if draft, else false
@@ -45,7 +48,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
45
48
  },
46
49
  /**
47
50
  * Checks if draft is supported for the data model object path.
48
- *
49
51
  * @param dataModelObjectPath
50
52
  * @returns `true` if it is supported
51
53
  */
@@ -59,14 +61,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
59
61
  },
60
62
  /**
61
63
  * Method to determine if the service, supports collaboration draft.
62
- *
63
64
  * @param metaObject MetaObject to be used for determination
64
65
  * @param templateInterface API provided by UI5 templating if used
65
66
  * @param templateInterface.context Context of the template
66
67
  * @returns Returns true if the service supports collaboration draft, else false
67
68
  */
68
69
  isCollaborationDraftSupported: function (metaObject, templateInterface) {
69
- if (!this.disableCollaborationDraft) {
70
+ if (!ModelHelper.disableCollaborationDraft) {
70
71
  var _templateInterface$co;
71
72
  const oMetaModel = (templateInterface === null || templateInterface === void 0 ? void 0 : (_templateInterface$co = templateInterface.context) === null || _templateInterface$co === void 0 ? void 0 : _templateInterface$co.getModel()) || metaObject;
72
73
  const oEntityContainer = oMetaModel.getObject("/");
@@ -80,7 +81,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
80
81
  },
81
82
  /**
82
83
  * Method to get the path of the DraftRoot path according to the provided context.
83
- *
84
84
  * @param oContext OdataModel context
85
85
  * @returns Returns the path of the draftRoot entity, or undefined if no draftRoot is found
86
86
  */
@@ -105,7 +105,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
105
105
  },
106
106
  /**
107
107
  * Method to get the path of the StickyRoot path according to the provided context.
108
- *
109
108
  * @param oContext OdataModel context
110
109
  * @returns Returns the path of the StickyRoot entity, or undefined if no StickyRoot is found
111
110
  */
@@ -119,7 +118,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
119
118
  var _mDataModel$targetEnt3, _mDataModel$targetEnt4, _mDataModel$targetEnt5;
120
119
  const sEntityPath = oMetaModel.getMetaPath(sIterationPath);
121
120
  const mDataModel = MetaModelConverter.getInvolvedDataModelObjects(oMetaModel.getContext(sEntityPath));
122
- if ((_mDataModel$targetEnt3 = mDataModel.targetEntitySet) !== null && _mDataModel$targetEnt3 !== void 0 && (_mDataModel$targetEnt4 = _mDataModel$targetEnt3.annotations) !== null && _mDataModel$targetEnt4 !== void 0 && (_mDataModel$targetEnt5 = _mDataModel$targetEnt4.Session) !== null && _mDataModel$targetEnt5 !== void 0 && _mDataModel$targetEnt5.StickySessionSupported) {
121
+ if (mDataModel.startingEntitySet === mDataModel.targetEntitySet && (_mDataModel$targetEnt3 = mDataModel.targetEntitySet) !== null && _mDataModel$targetEnt3 !== void 0 && (_mDataModel$targetEnt4 = _mDataModel$targetEnt3.annotations) !== null && _mDataModel$targetEnt4 !== void 0 && (_mDataModel$targetEnt5 = _mDataModel$targetEnt4.Session) !== null && _mDataModel$targetEnt5 !== void 0 && _mDataModel$targetEnt5.StickySessionSupported) {
123
122
  return sIterationPath;
124
123
  }
125
124
  return getRootPath(sIterationPath, model, false);
@@ -129,8 +128,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
129
128
  return getRootPath(oContext.getPath(), oContext.getModel());
130
129
  },
131
130
  /**
132
- * Returns the path to the target entity set via navigation property binding.
133
- *
131
+ * Returns the path to the target entity set with navigation property binding.
134
132
  * @param oContext Context for which the target entity set will be determined
135
133
  * @returns Returns the path to the target entity set
136
134
  */
@@ -144,7 +142,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
144
142
  },
145
143
  /**
146
144
  * Returns complete path to the entity set via using navigation property binding. Note: To be used only after the metamodel has loaded.
147
- *
148
145
  * @param path Path for which complete entitySet path needs to be determined from entityType path
149
146
  * @param odataMetaModel Metamodel to be used.(Optional in normal scenarios, but needed for parameterized service scenarios)
150
147
  * @returns Returns complete path to the entity set
@@ -191,7 +188,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
191
188
  },
192
189
  /**
193
190
  * Gets the path for the items property of MultiValueField parameters.
194
- *
195
191
  * @param oParameter Action Parameter
196
192
  * @returns Returns the complete model path for the items property of MultiValueField parameters
197
193
  */
@@ -203,7 +199,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
203
199
  },
204
200
  /**
205
201
  * Adds a setProperty to the created binding contexts of the internal JSON model.
206
- *
207
202
  * @param Internal JSON Model which is enhanced
208
203
  */
209
204
 
@@ -240,7 +235,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
240
235
  * Adds an handler on propertyChange.
241
236
  * The property "/editMode" is changed according to property '/isEditable' when this last one is set
242
237
  * in order to be compliant with former versions where building blocks use the property "/editMode"
243
- *
244
238
  * @param uiModel JSON Model which is enhanced
245
239
  * @param library Core library of SAP Fiori elements
246
240
  */
@@ -265,7 +259,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
265
259
  },
266
260
  /**
267
261
  * Returns whether filtering on the table is case sensitive.
268
- *
269
262
  * @param oMetaModel The instance of the meta model
270
263
  * @returns Returns 'false' if FilterFunctions annotation supports 'tolower', else 'true'
271
264
  */
@@ -279,7 +272,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
279
272
  },
280
273
  /**
281
274
  * Get MetaPath for the context.
282
- *
283
275
  * @param oContext Context to be used
284
276
  * @returns Returns the metapath for the context.
285
277
  */
@@ -291,7 +283,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
291
283
  },
292
284
  /**
293
285
  * Get MetaPath for the context.
294
- *
295
286
  * @param contextPath MetaPath to be used
296
287
  * @returns Returns the root entity set path.
297
288
  */
@@ -305,7 +296,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
305
296
  },
306
297
  /**
307
298
  * Get MetaPath for the listBinding.
308
- *
309
299
  * @param oView View of the control using listBinding
310
300
  * @param vListBinding ODataListBinding object or the binding path for a temporary list binding
311
301
  * @returns Returns the metapath for the listbinding.
@@ -341,7 +331,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
341
331
  },
342
332
  /**
343
333
  * Method to determine whether the argument is a draft root.
344
- *
345
334
  * @param entitySet EntitySet | Singleton | undefined
346
335
  * @returns Whether the argument is a draft root
347
336
  */
@@ -350,7 +339,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
350
339
  },
351
340
  /**
352
341
  * Method to determine whether the argument is a draft node.
353
- *
354
342
  * @param entitySet EntitySet | Singleton | undefined
355
343
  * @returns Whether the argument is a draft node
356
344
  */
@@ -359,7 +347,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
359
347
  },
360
348
  /**
361
349
  * Method to determine whether the argument is a sticky session root.
362
- *
363
350
  * @param entitySet EntitySet | Singleton | undefined
364
351
  * @returns Whether the argument is a sticky session root
365
352
  */
@@ -368,7 +355,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
368
355
  },
369
356
  /**
370
357
  * Method to determine if entity is updatable or not.
371
- *
372
358
  * @param entitySet EntitySet | Singleton | undefined
373
359
  * @param entityType EntityType
374
360
  * @returns True if updatable else false
@@ -381,7 +367,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
381
367
  },
382
368
  /**
383
369
  * Gets the @Common.DraftRoot annotation if the argument is an EntitySet.
384
- *
385
370
  * @param entitySet EntitySet | Singleton | undefined
386
371
  * @returns DraftRoot
387
372
  */
@@ -391,7 +376,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
391
376
  },
392
377
  /**
393
378
  * Gets the @Common.DraftNode annotation if the argument is an EntitySet.
394
- *
395
379
  * @param entitySet EntitySet | Singleton | undefined
396
380
  * @returns DraftRoot
397
381
  */
@@ -401,7 +385,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
401
385
  },
402
386
  /**
403
387
  * Helper method to get sticky session.
404
- *
405
388
  * @param entitySet EntitySet | Singleton | undefined
406
389
  * @returns Session StickySessionSupported
407
390
  */
@@ -411,7 +394,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
411
394
  },
412
395
  /**
413
396
  * Method to get the visibility state of delete button.
414
- *
415
397
  * @param entitySet EntitySet | Singleton | undefined
416
398
  * @param entityType EntityType
417
399
  * @returns True if delete button is hidden
@@ -424,7 +406,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
424
406
  },
425
407
  /**
426
408
  * This function will return metapath for the given list binding.
427
- *
428
409
  * @param listBinding ListBinding.
429
410
  * @returns MetaPath
430
411
  */
@@ -517,7 +498,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
517
498
  };
518
499
  function clearAnnotationType(annotationTypes, dataSet) {
519
500
  for (const contextPath in dataSet) {
520
- if (typeof dataSet[contextPath] === "object") {
501
+ // we added a context for accepting recommendations eventually.
502
+ // the context is a deeply nested object iterating over it cause the code the break
503
+ // hence we are skipping it here.
504
+ const isContext = dataSet[contextPath].isA && dataSet[contextPath].isA("sap.ui.model.odata.v4.Context");
505
+ if (typeof dataSet[contextPath] === "object" && !isContext) {
521
506
  dataSet[contextPath] = clearAnnotationType(annotationTypes, dataSet[contextPath]);
522
507
  if (Object.keys(dataSet[contextPath]).length === 0) {
523
508
  delete dataSet[contextPath];
@@ -617,11 +602,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
617
602
  },
618
603
  /**
619
604
  * Resolves a metadata binding to its text, either using the converterContext or the metaModel directly.
620
- *
621
605
  * @param path
622
606
  * @param converterContext
623
607
  * @param metaModel
624
- *
625
608
  * @returns The resolved text if possible, else the input value or an empty string if the path was undefined
626
609
  */
627
610
  fetchTextFromMetaModel(path, converterContext, metaModel) {
@@ -643,7 +626,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
643
626
  },
644
627
  /**
645
628
  * Method to retrieve the property path corresponding to state messages.
646
- *
647
629
  * @param metaModel The metamodel
648
630
  * @param contextPath Path for the context on which we what to retreive the message path
649
631
  * @returns Returns the property path, or undefined if no Messages annotation is defined
@@ -666,7 +648,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
666
648
  *
667
649
  * This function provides a workaround to overcome the above two short comings and
668
650
  * to support client side instance annotations for recommendations.
669
- *
670
651
  * @param odataModel The odata model instance.
671
652
  * @param fnBindProperty Original bind property of the oDataModel
672
653
  * @param path Binding path for which recommendation is being requested
@@ -676,6 +657,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
676
657
  setUpRecommendationLocalModelBinding: function (odataModel, fnBindProperty, path, context) {
677
658
  if (path.includes("ui5.fe.recommendations")) {
678
659
  const recommendationbinding = odataModel.getLocalAnnotationModel().bindProperty(path, context);
660
+ const setContextOnRecommendationBinding = odataPropertyBinding => {
661
+ //we make sure the parent context is set to the propertybinding
662
+ const fnSetContext = recommendationbinding.setContext;
663
+ if (fnSetContext) {
664
+ recommendationbinding.setContext = newContext => {
665
+ odataPropertyBinding === null || odataPropertyBinding === void 0 ? void 0 : odataPropertyBinding.setContext(newContext);
666
+ return fnSetContext.bind(odataPropertyBinding)(newContext);
667
+ };
668
+ }
669
+ };
679
670
  if (context) {
680
671
  const {
681
672
  recommendationComplexProperty,
@@ -704,6 +695,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
704
695
  if (currentContext) {
705
696
  const contextRecommendations = propertyBinding.getValue();
706
697
  ModelHelper.setRecommendationsOnLocalAnnotationModel(contextRecommendations, currentContext);
698
+ recommendationbinding.refresh();
707
699
  }
708
700
  });
709
701
  // reuestValue will add the recommendation property to the $select
@@ -711,6 +703,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
711
703
  odataPropertyBinding.requestValue().catch(error => {
712
704
  Log.error("Recommendations could not be resolved", error);
713
705
  });
706
+ setContextOnRecommendationBinding(odataPropertyBinding);
714
707
  }
715
708
  }
716
709
  }
@@ -731,7 +724,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
731
724
  },
732
725
  /**
733
726
  * Validates based on metadata whether a given binding should deal with recommendations or not.
734
- *
735
727
  * @param context Context where recommendation is being requested.
736
728
  * @param bindingPath Binding path for which recommendation is being requested.
737
729
  * @returns Recommendation property path for the entity related to the context and whether the bindingPath is relevant or not based on metadata.
@@ -760,7 +752,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
760
752
  },
761
753
  /**
762
754
  * Update recommendation client side instance annotations.
763
- *
764
755
  * @param contextRecommendations Updated recommendations.
765
756
  * @param currentContext Context where recommendation was updated.
766
757
  */
@@ -785,11 +776,40 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
785
776
  typeAheadValues.push(propertyRecommendation.RecommendedFieldValue);
786
777
  }
787
778
  }
779
+ if (!propertyRecommendations || !propertyRecommendations.length) {
780
+ const placeholderValueAnnotationPath = currentContext.getPath(localModelPath + "@$ui5.fe.recommendations.placeholderValue");
781
+ const placeholderDescriptionAnnotationPath = currentContext.getPath(localModelPath + "@$ui5.fe.recommendations.placeholderDescription");
782
+ localAnnotationModel.setProperty(placeholderValueAnnotationPath, null, currentContext, false);
783
+ localAnnotationModel.setProperty(placeholderDescriptionAnnotationPath, "", currentContext, false);
784
+ }
788
785
  localAnnotationModel.setProperty(currentContext.getPath(localModelPath + "@$ui5.fe.recommendations.typeAheadValues"), typeAheadValues, currentContext, false);
786
+ localAnnotationModel.setProperty(currentContext.getPath("recommendationContext"), currentContext);
789
787
  }
790
788
  }
789
+ },
790
+ /**
791
+ * Fetches the alternate keys from entitytype and entitySet.
792
+ * @param entityType Datamodel object of entityType
793
+ * @param entitySet Datamodel object of entitySet
794
+ * @returns An array of alternate keys
795
+ */
796
+ getAlternateKeys: (entityType, entitySet) => {
797
+ const alternateKeys = [];
798
+ const _fetchKeys = entityTypeOrSet => {
799
+ var _entityTypeOrSet$anno, _entityTypeOrSet$anno2, _entityTypeOrSet$anno3;
800
+ entityTypeOrSet === null || entityTypeOrSet === void 0 ? void 0 : (_entityTypeOrSet$anno = entityTypeOrSet.annotations) === null || _entityTypeOrSet$anno === void 0 ? void 0 : (_entityTypeOrSet$anno2 = _entityTypeOrSet$anno.Core) === null || _entityTypeOrSet$anno2 === void 0 ? void 0 : (_entityTypeOrSet$anno3 = _entityTypeOrSet$anno2.AlternateKeys) === null || _entityTypeOrSet$anno3 === void 0 ? void 0 : _entityTypeOrSet$anno3.forEach(alternateKey => {
801
+ alternateKey.Key.forEach(key => {
802
+ alternateKeys.push(key.Name.value);
803
+ });
804
+ });
805
+ };
806
+ _fetchKeys(entitySet);
807
+ if (!alternateKeys.length) {
808
+ _fetchKeys(entityType);
809
+ }
810
+ return alternateKeys;
791
811
  }
792
812
  };
793
813
  return ModelHelper;
794
814
  }, false);
795
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNb2RlbEhlbHBlciIsImRpc2FibGVDb2xsYWJvcmF0aW9uRHJhZnQiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJtZXRhTW9kZWwiLCJlbnRpdHlDb250YWluZXIiLCJnZXRPYmplY3QiLCJlbnRpdHlTZXROYW1lIiwiJGtpbmQiLCJpc0RyYWZ0U3VwcG9ydGVkIiwicGF0aCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJvYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiY3VycmVudEVudGl0eVNldCIsInRhcmdldEVudGl0eVNldCIsImJJc0RyYWZ0Um9vdCIsImlzRHJhZnRSb290IiwiYklzRHJhZnROb2RlIiwiaXNEcmFmdE5vZGUiLCJiSXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50IiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJ0YXJnZXRPYmplY3QiLCJjb250YWluc1RhcmdldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJEcmFmdE5vZGUiLCJpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCIsIm1ldGFPYmplY3QiLCJ0ZW1wbGF0ZUludGVyZmFjZSIsIm9NZXRhTW9kZWwiLCJjb250ZXh0IiwiZ2V0TW9kZWwiLCJvRW50aXR5Q29udGFpbmVyIiwic0VudGl0eVNldCIsImdldERyYWZ0Um9vdFBhdGgiLCJvQ29udGV4dCIsImdldE1ldGFNb2RlbCIsImdldFJvb3RQYXRoIiwic1BhdGgiLCJtb2RlbCIsImZpcnN0SXRlcmF0aW9uIiwic0l0ZXJhdGlvblBhdGgiLCJSZWdFeHAiLCJleGVjIiwic0VudGl0eVBhdGgiLCJnZXRNZXRhUGF0aCIsIm1EYXRhTW9kZWwiLCJNZXRhTW9kZWxDb252ZXJ0ZXIiLCJnZXRDb250ZXh0IiwidW5kZWZpbmVkIiwiZ2V0UGF0aCIsImdldFN0aWNreVJvb3RQYXRoIiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJnZXRUYXJnZXRFbnRpdHlTZXQiLCJzRW50aXR5U2V0UGF0aCIsImdldEVudGl0eVNldFBhdGgiLCJvZGF0YU1ldGFNb2RlbCIsImVudGl0eVNldFBhdGgiLCJzcGxpdCIsImZpbHRlciIsImZpbHRlck91dE5hdlByb3BCaW5kaW5nIiwiam9pbiIsInBhdGhQYXJ0cyIsImxlbmd0aCIsImluaXRpYWxQYXRoT2JqZWN0IiwiZ3Jvd2luZ1BhdGgiLCJwZW5kaW5nTmF2UHJvcEJpbmRpbmciLCJwYXRoT2JqZWN0IiwicmVkdWNlIiwicGF0aFVuZGVyQ29uc3RydWN0aW9uIiwicGF0aFBhcnQiLCJpZHgiLCJkZWxpbWl0ZXIiLCJ0ZW1wUGF0aCIsIm5hdlByb3BCaW5kaW5ncyIsIm5hdlByb3BCaW5kaW5nVG9DaGVjayIsIk9iamVjdCIsImtleXMiLCJoYXNPd25Qcm9wZXJ0eSIsInJlcGxhY2UiLCJnZXRBY3Rpb25QYXJhbWV0ZXJJdGVtc01vZGVsUGF0aCIsIm9QYXJhbWV0ZXIiLCIkTmFtZSIsInNQYXRoUGFydCIsImVuaGFuY2VJbnRlcm5hbEpTT05Nb2RlbCIsIm9JbnRlcm5hbE1vZGVsIiwiZm5CaW5kQ29udGV4dCIsImJpbmRDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvRXZlbnRzIiwiY29udGV4dEJpbmRpbmciLCJhcHBseSIsImZuR2V0Qm91bmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0Iiwib0JvdW5kQ29udGV4dCIsInNldFByb3BlcnR5IiwicHJvcGVydHlQYXRoIiwidmFsdWUiLCJwcm9wZXJ0eVBhdGhTcGxpdCIsImkiLCJlbmhhbmNlVWlKU09OTW9kZWwiLCJ1aU1vZGVsIiwibGlicmFyeSIsImZuU2V0UHJvcGVydHkiLCJhc3luY1VwZGF0ZSIsIkVkaXRNb2RlIiwiRWRpdGFibGUiLCJEaXNwbGF5IiwiZW5oYW5jZVZpZXdKU09OTW9kZWwiLCJ2aWV3TW9kZWwiLCJmbkdldE9iamVjdCIsIl9nZXRPYmplY3QiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJhRmlsdGVyRnVuY3Rpb25zIiwiaW5kZXhPZiIsImdldE1ldGFQYXRoRm9yQ29udGV4dCIsIm9Nb2RlbCIsImdldFJvb3RFbnRpdHlTZXRQYXRoIiwiY29udGV4dFBhdGgiLCJyb290RW50aXR5U2V0UGF0aCIsImFQYXRocyIsImdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyIsIm9WaWV3Iiwidkxpc3RCaW5kaW5nIiwic01ldGFQYXRoIiwic3RhcnRzV2l0aCIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwic1Jvb3RDb250ZXh0UGF0aCIsIm9CaW5kaW5nIiwib1Jvb3RCaW5kaW5nIiwiZ2V0Um9vdEJpbmRpbmciLCJzUm9vdEJpbmRpbmdQYXRoIiwic1JlbGF0aXZlUGF0aCIsImVudGl0eVNldCIsImdldERyYWZ0Um9vdCIsImdldERyYWZ0Tm9kZSIsImlzU3RpY2t5IiwiZ2V0U3RpY2t5U2Vzc2lvbiIsImlzVXBkYXRlSGlkZGVuIiwiZW50aXR5VHlwZSIsImlzRW50aXR5U2V0IiwiVUkiLCJVcGRhdGVIaWRkZW4iLCJnZXREZWxldGVIaWRkZW4iLCJEZWxldGVIaWRkZW4iLCJnZXRBYnNvbHV0ZVBhdGhGcm9tTGlzdEJpbmRpbmciLCJsaXN0QmluZGluZyIsIm1ldGFtb2RlbCIsIm1ldGFQYXRoIiwicm9vdEJpbmRpbmciLCJyb290QmluZGluZ1BhdGgiLCJyZWxhdGl2ZVBhdGgiLCJlbmhhbmNlT0RhdGFNb2RlbCIsIm9kYXRhTW9kZWwiLCJ2aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkiLCJBcnJheSIsImZuTWVzc2FnZSIsInNldE1lc3NhZ2VzIiwibG9jYWxBbm5vdGF0aW9uTW9kZWwiLCJKU09OTW9kZWwiLCJzZXREZWZhdWx0QmluZGluZ01vZGUiLCJCaW5kaW5nTW9kZSIsIk9uZVdheSIsImJhc2VTZXRQcm9wZXJ0eSIsImJhc2VHZXRQcm9wZXJ0eSIsImdldFByb3BlcnR5IiwicHJvcGVydHlOYW1lIiwiYW5ub3RhdGlvblR5cGUiLCJpc1RyYW5zaWVudCIsImNvbnRleHRPYmplY3QiLCJNZXRhUGF0aCIsImNvbnZlcnRUeXBlcyIsImV4dGVybmFsSWRQcm9wZXJ0eSIsImdldE1ldGFQYXRoRm9yUGF0aCIsImdldFRhcmdldCIsIkV4dGVybmFsSUQiLCJpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsImZ1bGxQYXRoIiwiX3JlZnJlc2hMb2NhbE1vZGVsIiwicmVmcmVzaCIsImV4dGVybmFsSWRQcm9wUGF0aCIsInByb3BlcnRpZXNUb1JlcXVlc3QiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsInRleHRQcm9wZXJ0eSIsIlRleHQiLCJ0ZXh0UHJvcFBhdGgiLCJpbmNsdWRlcyIsInB1c2giLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJ0aGVuIiwiY2F0Y2giLCJlcnIiLCJMb2ciLCJlcnJvciIsInBhdGhGcm9tUm9vdCIsImNsZWFyQW5ub3RhdGlvblR5cGUiLCJhbm5vdGF0aW9uVHlwZXMiLCJkYXRhU2V0IiwiZW5kc1dpdGgiLCJfbG9jYWxBbm5vdGF0aW9uTW9kZWwiLCJnZXRMb2NhbEFubm90YXRpb25Nb2RlbCIsIm1lc3NhZ2VzIiwiY2xlYW5lZERhdGEiLCJnZXREYXRhIiwic2V0RGF0YSIsIm1lc3NhZ2VUYXJnZXQiLCJnZXRUeXBlIiwiZ2V0TWVzc2FnZSIsImZuQmluZFByb3BlcnR5IiwiYmluZFByb3BlcnR5IiwiYmluZCIsInBhcmFtZXRlcnMiLCJyZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZyIsInNldFVwUmVjb21tZW5kYXRpb25Mb2NhbE1vZGVsQmluZGluZyIsImludGVybmFsSWRCaW5kaW5nIiwiZXh0ZXJuYWxJZEJpbmRpbmciLCJhdHRhY2hDaGFuZ2UiLCJyZXF1ZXN0VmFsdWUiLCJwcm9wQmluZGluZyIsInVwZGF0ZVJlcXVpcmVkIiwiZXhwcmVzc2lvbiIsImdldFZpcnR1YWxCaW5kaW5nRXhwcmVzc2lvbiIsImdob3N0Q29udHJvbCIsIkFueSIsImFueSIsImNvbXBpbGVFeHByZXNzaW9uIiwiYmluZEJhY2tQcm9wZXJ0eSIsImZuRGVzdHJveVByb3BlcnR5QmluZGluZyIsImRlc3Ryb3kiLCJmblNldENvbnRleHQiLCJzZXRDb250ZXh0IiwibmV3Q29udGV4dCIsInNldEJpbmRpbmdDb250ZXh0Iiwic2V0TW9kZWwiLCJnaG9zdEJpbmRpbmciLCJnZXRCaW5kaW5nSW5mbyIsImJpbmRpbmciLCJmbkNoZWNrVXBkYXRlIiwiY2hlY2tVcGRhdGUiLCJmbkRlc3Ryb3kiLCJ2cEJpbmRpbmciLCJmZXRjaFRleHRGcm9tTWV0YU1vZGVsIiwiY29udmVydGVyQ29udGV4dCIsInRleHQiLCJtZXRhTW9kZWxQYXRoIiwiZ2V0RW50aXR5VHlwZUFubm90YXRpb24iLCJhbm5vdGF0aW9uIiwidG9TdHJpbmciLCJlIiwiaW5mbyIsImdldE1lc3NhZ2VzUGF0aCIsInRhcmdldEVudGl0eVR5cGUiLCJNZXNzYWdlcyIsInJlY29tbWVuZGF0aW9uYmluZGluZyIsInJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5IiwiaXNSZWNvbW1lbmRlZFByb3BlcnR5IiwidmFsaWRhdGVSZWNvbW1lbmRhdGlvbkJpbmRpbmdQYXRoIiwiYWxyZWFkeUJvdW5kIiwic29tZSIsImV4aXN0aW5nQmluZGluZyIsIm9kYXRhUHJvcGVydHlCaW5kaW5nIiwic2V0VHlwZSIsIlJhdyIsInNldEJpbmRpbmdNb2RlIiwiZXZlbnQiLCJwcm9wZXJ0eUJpbmRpbmciLCJnZXRTb3VyY2UiLCJjdXJyZW50Q29udGV4dCIsImNvbnRleHRSZWNvbW1lbmRhdGlvbnMiLCJnZXRWYWx1ZSIsInNldFJlY29tbWVuZGF0aW9uc09uTG9jYWxBbm5vdGF0aW9uTW9kZWwiLCJiaW5kaW5nUGF0aCIsImNvbnRleHRNZXRhUGF0aCIsIlJlY29tbWVuZGF0aW9ucyIsImVudGl0eVByb3BlcnRpZXMiLCJlbnRpdHlQcm9wZXJ0eSIsIm5hbWUiLCJ0YXJnZXRUeXBlIiwicHJvcGVydGllcyIsInByb3BlcnR5IiwicmVjb21tZW5kZWRQcm9wZXJ0eSIsInByb3BlcnR5UmVjb21tZW5kYXRpb25zIiwibG9jYWxNb2RlbFBhdGgiLCJ0eXBlQWhlYWRWYWx1ZXMiLCJwcm9wZXJ0eVJlY29tbWVuZGF0aW9uIiwiUmVjb21tZW5kZWRGaWVsZElzU3VnZ2VzdGlvbiIsInBsYWNlaG9sZGVyVmFsdWVBbm5vdGF0aW9uUGF0aCIsInBsYWNlaG9sZGVyRGVzY3JpcHRpb25Bbm5vdGF0aW9uUGF0aCIsIlJlY29tbWVuZGVkRmllbGRWYWx1ZSIsIlJlY29tbWVuZGVkRmllbGREZXNjcmlwdGlvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTW9kZWxIZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXJzIHRvIGJlIHVzZWQgYXQgcnVudGltZSB0byByZXRyaWV2ZSBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIHRoZSBtb2RlbCAqL1xuaW1wb3J0IHR5cGUgeyBDb21wbGV4VHlwZSwgRW50aXR5U2V0LCBFbnRpdHlUeXBlLCBQcm9wZXJ0eSwgU2luZ2xldG9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IERyYWZ0Tm9kZSwgRHJhZnRSb290IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB0eXBlIHsgU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvU2Vzc2lvblwiO1xuaW1wb3J0IHR5cGUgeyBEZWxldGVIaWRkZW4sIFVwZGF0ZUhpZGRlbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5VHlwZUFubm90YXRpb25zX1VJIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSV9FZG1cIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHsgY29tcGlsZUV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQW55IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9scy9BbnlcIjtcbmltcG9ydCB0eXBlIENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxBY3Rpb25QYXJhbWV0ZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCAqIGFzIE1ldGFNb2RlbENvbnZlcnRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IFBhZ2VDb250ZXh0UGF0aFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgTWV0YVBhdGggZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTWV0YVBhdGhcIjtcbmltcG9ydCB7IGlzRW50aXR5U2V0LCBpc05hdmlnYXRpb25Qcm9wZXJ0eSwgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBCaW5kaW5nTW9kZSBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdNb2RlXCI7XG5pbXBvcnQgdHlwZSBCYXNlQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIENvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvUHJvcGVydHlCaW5kaW5nXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBSYXcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS90eXBlL1Jhd1wiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIENvbnRleHQsIGRlZmF1bHQgYXMgT0RhdGFWNENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPRGF0YUxpc3RCaW5kaW5nIH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YVByb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBPRGF0YVByb3BlcnR5QmluZGluZyRDaGFuZ2VFdmVudCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcblxuLy8gVE9ETzogUmlnaHQgbm93IHJlY29tbWVuZGF0aW9ucyBpcyBub3QgcGFydCBvZiB0aGUgVUkgdm9jYWJ1bGFyeS5cbi8vIGhlbmNlIHdlIGFyZSBhZGRpbmcgaXQgdG8gdGhlIHR5cGUuXG4vLyBvbmNlIHRoaXMgYmVjb21lcyBwYXJ0IG9mIHRoZSBVSSB2b2NhYnVsYXJ5IHRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzLlxuZXhwb3J0IHR5cGUgRW50aXR5VHlwZUFubm90YXRpb25zX1VJX1dpdGhfUmVjb21tZW5kYXRpb25zID0gRW50aXR5VHlwZUFubm90YXRpb25zX1VJICYge1xuXHRSZWNvbW1lbmRhdGlvbnM/OiB7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHR9O1xufTtcblxuY29uc3QgTW9kZWxIZWxwZXIgPSB7XG5cdC8vIGdsb2JhbCBzd2l0Y2ggdG8gZGlzYWJsZSB0aGUgY29sbGFib3JhdGlvbiBkcmFmdCBieSBhIHByaXZhdGUgbWFuaWZlc3QgZmxhZ1xuXHQvLyB0aGlzIGFsbG93cyBjdXN0b21lcnMgdG8gZGlzYWJsZSB0aGUgY29sbGFib3JhdGlvbiBkcmFmdCBpbiBjYXNlIHdlIHJ1biBpbnRvIGlzc3VlcyB3aXRoIHRoZSBmaXJzdCBkZWxpdmVyeVxuXHQvLyB0aGlzIHdpbGwgYmUgcmVtb3ZlZCB3aXRoIHRoZSBuZXh0IFMvNCByZWxlYXNlXG5cdGRpc2FibGVDb2xsYWJvcmF0aW9uRHJhZnQ6IGZhbHNlLFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgcHJvZ3JhbW1pbmcgbW9kZWwgaXMgc3RpY2t5LlxuXHQgKlxuXHQgKiBAcGFyYW0gbWV0YU1vZGVsIE9EYXRhTW9kZWxNZXRhTW9kZWwgdG8gY2hlY2sgZm9yIHN0aWNreSBlbmFibGVkIGVudGl0eVxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgc3RpY2t5LCBlbHNlIGZhbHNlXG5cdCAqL1xuXHRpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQ6IGZ1bmN0aW9uIChtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZW50aXR5Q29udGFpbmVyID0gbWV0YU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdFx0Zm9yIChjb25zdCBlbnRpdHlTZXROYW1lIGluIGVudGl0eUNvbnRhaW5lcikge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRlbnRpdHlDb250YWluZXJbZW50aXR5U2V0TmFtZV0uJGtpbmQgPT09IFwiRW50aXR5U2V0XCIgJiZcblx0XHRcdFx0bWV0YU1vZGVsLmdldE9iamVjdChgLyR7ZW50aXR5U2V0TmFtZX1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkYClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBpcyBkcmFmdC5cblx0ICpcblx0ICogQHBhcmFtIG1ldGFNb2RlbCBPRGF0YU1vZGVsTWV0YU1vZGVsIG9mIHRoZSBjb250ZXh0IGZvciB3aGljaCBkcmFmdCBzdXBwb3J0IHNoYWxsIGJlIGNoZWNrZWRcblx0ICogQHBhcmFtIHBhdGggUGF0aCBmb3Igd2hpY2ggZHJhZnQgc3VwcG9ydCBzaGFsbCBiZSBjaGVja2VkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiBkcmFmdCwgZWxzZSBmYWxzZVxuXHQgKi9cblx0aXNEcmFmdFN1cHBvcnRlZDogZnVuY3Rpb24gKG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KHBhdGgpO1xuXHRcdGNvbnN0IG9iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHM8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PihtZXRhQ29udGV4dCk7XG5cdFx0cmV0dXJuIHRoaXMuaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQob2JqZWN0UGF0aCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBkcmFmdCBpcyBzdXBwb3J0ZWQgZm9yIHRoZSBkYXRhIG1vZGVsIG9iamVjdCBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gZGF0YU1vZGVsT2JqZWN0UGF0aFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgc3VwcG9ydGVkXG5cdCAqL1xuXHRpc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZDogZnVuY3Rpb24gKGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj4pOiBib29sZWFuIHtcblx0XHRjb25zdCBjdXJyZW50RW50aXR5U2V0ID0gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdGNvbnN0IGJJc0RyYWZ0Um9vdCA9IE1vZGVsSGVscGVyLmlzRHJhZnRSb290KGN1cnJlbnRFbnRpdHlTZXQpO1xuXHRcdGNvbnN0IGJJc0RyYWZ0Tm9kZSA9IE1vZGVsSGVscGVyLmlzRHJhZnROb2RlKGN1cnJlbnRFbnRpdHlTZXQpO1xuXHRcdGNvbnN0IGJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQgPVxuXHRcdFx0aXNOYXZpZ2F0aW9uUHJvcGVydHkoZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QpICYmXG5cdFx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdD8uY29udGFpbnNUYXJnZXQgJiZcblx0XHRcdCgoZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQpPy5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QgfHxcblx0XHRcdFx0KGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0KT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnROb2RlKVxuXHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0OiBmYWxzZTtcblxuXHRcdHJldHVybiBiSXNEcmFmdFJvb3QgfHwgYklzRHJhZnROb2RlIHx8ICghY3VycmVudEVudGl0eVNldCAmJiBiSXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50KTtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgc2VydmljZSwgc3VwcG9ydHMgY29sbGFib3JhdGlvbiBkcmFmdC5cblx0ICpcblx0ICogQHBhcmFtIG1ldGFPYmplY3QgTWV0YU9iamVjdCB0byBiZSB1c2VkIGZvciBkZXRlcm1pbmF0aW9uXG5cdCAqIEBwYXJhbSB0ZW1wbGF0ZUludGVyZmFjZSBBUEkgcHJvdmlkZWQgYnkgVUk1IHRlbXBsYXRpbmcgaWYgdXNlZFxuXHQgKiBAcGFyYW0gdGVtcGxhdGVJbnRlcmZhY2UuY29udGV4dCBDb250ZXh0IG9mIHRoZSB0ZW1wbGF0ZVxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZpY2Ugc3VwcG9ydHMgY29sbGFib3JhdGlvbiBkcmFmdCwgZWxzZSBmYWxzZVxuXHQgKi9cblx0aXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQ6IGZ1bmN0aW9uIChtZXRhT2JqZWN0OiB1bmtub3duLCB0ZW1wbGF0ZUludGVyZmFjZT86IHsgY29udGV4dDogQ29udGV4dCB9KTogYm9vbGVhbiB7XG5cdFx0aWYgKCF0aGlzLmRpc2FibGVDb2xsYWJvcmF0aW9uRHJhZnQpIHtcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSAodGVtcGxhdGVJbnRlcmZhY2U/LmNvbnRleHQ/LmdldE1vZGVsKCkgfHwgbWV0YU9iamVjdCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0XHRjb25zdCBvRW50aXR5Q29udGFpbmVyID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvXCIpO1xuXHRcdFx0Zm9yIChjb25zdCBzRW50aXR5U2V0IGluIG9FbnRpdHlDb250YWluZXIpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9FbnRpdHlDb250YWluZXJbc0VudGl0eVNldF0uJGtpbmQgPT09IFwiRW50aXR5U2V0XCIgJiZcblx0XHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7c0VudGl0eVNldH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9TaGFyZUFjdGlvbmApXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB0aGUgcGF0aCBvZiB0aGUgRHJhZnRSb290IHBhdGggYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgT2RhdGFNb2RlbCBjb250ZXh0XG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHBhdGggb2YgdGhlIGRyYWZ0Um9vdCBlbnRpdHksIG9yIHVuZGVmaW5lZCBpZiBubyBkcmFmdFJvb3QgaXMgZm91bmRcblx0ICovXG5cdGdldERyYWZ0Um9vdFBhdGg6IGZ1bmN0aW9uIChvQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgZ2V0Um9vdFBhdGggPSBmdW5jdGlvbiAoc1BhdGg6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIGZpcnN0SXRlcmF0aW9uID0gdHJ1ZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0XHRjb25zdCBzSXRlcmF0aW9uUGF0aCA9IGZpcnN0SXRlcmF0aW9uID8gc1BhdGggOiBuZXcgUmVnRXhwKC8uKig/PVxcLykvKS5leGVjKHNQYXRoKT8uWzBdOyAvLyAqUmVnZXggdG8gZ2V0IHRoZSBhbmNlc3RvclxuXHRcdFx0aWYgKHNJdGVyYXRpb25QYXRoICYmIHNJdGVyYXRpb25QYXRoICE9PSBcIi9cIikge1xuXHRcdFx0XHRjb25zdCBzRW50aXR5UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc0l0ZXJhdGlvblBhdGgpO1xuXHRcdFx0XHRjb25zdCBtRGF0YU1vZGVsID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvTWV0YU1vZGVsLmdldENvbnRleHQoc0VudGl0eVBhdGgpKTtcblx0XHRcdFx0aWYgKChtRGF0YU1vZGVsLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQpPy5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Um9vdCkge1xuXHRcdFx0XHRcdHJldHVybiBzSXRlcmF0aW9uUGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZ2V0Um9vdFBhdGgoc0l0ZXJhdGlvblBhdGgsIG1vZGVsLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH07XG5cdFx0cmV0dXJuIGdldFJvb3RQYXRoKG9Db250ZXh0LmdldFBhdGgoKSwgb0NvbnRleHQuZ2V0TW9kZWwoKSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBnZXQgdGhlIHBhdGggb2YgdGhlIFN0aWNreVJvb3QgcGF0aCBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBPZGF0YU1vZGVsIGNvbnRleHRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgU3RpY2t5Um9vdCBlbnRpdHksIG9yIHVuZGVmaW5lZCBpZiBubyBTdGlja3lSb290IGlzIGZvdW5kXG5cdCAqL1xuXHRnZXRTdGlja3lSb290UGF0aDogZnVuY3Rpb24gKG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBnZXRSb290UGF0aCA9IGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCwgZmlyc3RJdGVyYXRpb24gPSB0cnVlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRcdGNvbnN0IHNJdGVyYXRpb25QYXRoID0gZmlyc3RJdGVyYXRpb24gPyBzUGF0aCA6IG5ldyBSZWdFeHAoLy4qKD89XFwvKS8pLmV4ZWMoc1BhdGgpPy5bMF07IC8vICpSZWdleCB0byBnZXQgdGhlIGFuY2VzdG9yXG5cdFx0XHRpZiAoc0l0ZXJhdGlvblBhdGggJiYgc0l0ZXJhdGlvblBhdGggIT09IFwiL1wiKSB7XG5cdFx0XHRcdGNvbnN0IHNFbnRpdHlQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzSXRlcmF0aW9uUGF0aCk7XG5cdFx0XHRcdGNvbnN0IG1EYXRhTW9kZWwgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzRW50aXR5UGF0aCkpO1xuXHRcdFx0XHRpZiAoKG1EYXRhTW9kZWwudGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldCk/LmFubm90YXRpb25zPy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHNJdGVyYXRpb25QYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBnZXRSb290UGF0aChzSXRlcmF0aW9uUGF0aCwgbW9kZWwsIGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fTtcblx0XHRyZXR1cm4gZ2V0Um9vdFBhdGgob0NvbnRleHQuZ2V0UGF0aCgpLCBvQ29udGV4dC5nZXRNb2RlbCgpKTtcblx0fSxcblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHRhcmdldCBlbnRpdHkgc2V0IHZpYSBuYXZpZ2F0aW9uIHByb3BlcnR5IGJpbmRpbmcuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgd2lsbCBiZSBkZXRlcm1pbmVkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHRhcmdldCBlbnRpdHkgc2V0XG5cdCAqL1xuXHRnZXRUYXJnZXRFbnRpdHlTZXQ6IGZ1bmN0aW9uIChvQ29udGV4dDogQmFzZUNvbnRleHQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGlmIChcblx0XHRcdG9Db250ZXh0LmdldE9iamVjdChcIiRraW5kXCIpID09PSBcIkVudGl0eVNldFwiIHx8XG5cdFx0XHRvQ29udGV4dC5nZXRPYmplY3QoXCIka2luZFwiKSA9PT0gXCJBY3Rpb25cIiB8fFxuXHRcdFx0b0NvbnRleHQuZ2V0T2JqZWN0KFwiMC8ka2luZFwiKSA9PT0gXCJBY3Rpb25cIlxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHNQYXRoO1xuXHRcdH1cblx0XHRjb25zdCBzRW50aXR5U2V0UGF0aCA9IE1vZGVsSGVscGVyLmdldEVudGl0eVNldFBhdGgoc1BhdGgpO1xuXHRcdHJldHVybiBgLyR7b0NvbnRleHQuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoKX1gO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGNvbXBsZXRlIHBhdGggdG8gdGhlIGVudGl0eSBzZXQgdmlhIHVzaW5nIG5hdmlnYXRpb24gcHJvcGVydHkgYmluZGluZy4gTm90ZTogVG8gYmUgdXNlZCBvbmx5IGFmdGVyIHRoZSBtZXRhbW9kZWwgaGFzIGxvYWRlZC5cblx0ICpcblx0ICogQHBhcmFtIHBhdGggUGF0aCBmb3Igd2hpY2ggY29tcGxldGUgZW50aXR5U2V0IHBhdGggbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCBmcm9tIGVudGl0eVR5cGUgcGF0aFxuXHQgKiBAcGFyYW0gb2RhdGFNZXRhTW9kZWwgTWV0YW1vZGVsIHRvIGJlIHVzZWQuKE9wdGlvbmFsIGluIG5vcm1hbCBzY2VuYXJpb3MsIGJ1dCBuZWVkZWQgZm9yIHBhcmFtZXRlcml6ZWQgc2VydmljZSBzY2VuYXJpb3MpXG5cdCAqIEByZXR1cm5zIFJldHVybnMgY29tcGxldGUgcGF0aCB0byB0aGUgZW50aXR5IHNldFxuXHQgKi9cblx0Z2V0RW50aXR5U2V0UGF0aDogZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgb2RhdGFNZXRhTW9kZWw/OiBPRGF0YU1ldGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0bGV0IGVudGl0eVNldFBhdGggPSBcIlwiO1xuXHRcdGlmICghb2RhdGFNZXRhTW9kZWwpIHtcblx0XHRcdC8vIFByZXZpb3VzIGltcGxlbWVudGF0aW9uIGZvciBnZXR0aW5nIGVudGl0eVNldFBhdGggZnJvbSBlbnRpdHlUeXBlUGF0aFxuXHRcdFx0ZW50aXR5U2V0UGF0aCA9IGAvJHtwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpLmpvaW4oXCIvJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcvXCIpfWA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIENhbGN1bGF0aW5nIHRoZSBlbnRpdHlTZXRQYXRoIGZyb20gTWV0YU1vZGVsLlxuXHRcdFx0Y29uc3QgcGF0aFBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKE1vZGVsSGVscGVyLmZpbHRlck91dE5hdlByb3BCaW5kaW5nKTtcblx0XHRcdGlmIChwYXRoUGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRjb25zdCBpbml0aWFsUGF0aE9iamVjdCA9IHtcblx0XHRcdFx0XHRncm93aW5nUGF0aDogXCIvXCIsXG5cdFx0XHRcdFx0cGVuZGluZ05hdlByb3BCaW5kaW5nOiBcIlwiXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y29uc3QgcGF0aE9iamVjdCA9IHBhdGhQYXJ0cy5yZWR1Y2UoXG5cdFx0XHRcdFx0KHBhdGhVbmRlckNvbnN0cnVjdGlvbjogeyBncm93aW5nUGF0aDogc3RyaW5nOyBwZW5kaW5nTmF2UHJvcEJpbmRpbmc6IHN0cmluZyB9LCBwYXRoUGFydDogc3RyaW5nLCBpZHg6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgZGVsaW1pdGVyID0gKCEhaWR4ICYmIFwiLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nL1wiKSB8fCBcIlwiO1xuXHRcdFx0XHRcdFx0bGV0IHsgZ3Jvd2luZ1BhdGgsIHBlbmRpbmdOYXZQcm9wQmluZGluZyB9ID0gcGF0aFVuZGVyQ29uc3RydWN0aW9uO1xuXHRcdFx0XHRcdFx0Y29uc3QgdGVtcFBhdGggPSBncm93aW5nUGF0aCArIGRlbGltaXRlcjtcblx0XHRcdFx0XHRcdGNvbnN0IG5hdlByb3BCaW5kaW5ncyA9IG9kYXRhTWV0YU1vZGVsLmdldE9iamVjdCh0ZW1wUGF0aCk7XG5cdFx0XHRcdFx0XHRjb25zdCBuYXZQcm9wQmluZGluZ1RvQ2hlY2sgPSBwZW5kaW5nTmF2UHJvcEJpbmRpbmcgPyBgJHtwZW5kaW5nTmF2UHJvcEJpbmRpbmd9LyR7cGF0aFBhcnR9YCA6IHBhdGhQYXJ0O1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRuYXZQcm9wQmluZGluZ3MgJiZcblx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMobmF2UHJvcEJpbmRpbmdzKS5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0XHRcdG5hdlByb3BCaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShuYXZQcm9wQmluZGluZ1RvQ2hlY2spXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Z3Jvd2luZ1BhdGggPSB0ZW1wUGF0aCArIG5hdlByb3BCaW5kaW5nVG9DaGVjay5yZXBsYWNlKFwiL1wiLCBcIiUyRlwiKTtcblx0XHRcdFx0XHRcdFx0cGVuZGluZ05hdlByb3BCaW5kaW5nID0gXCJcIjtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHBlbmRpbmdOYXZQcm9wQmluZGluZyArPSBwZW5kaW5nTmF2UHJvcEJpbmRpbmcgPyBgLyR7cGF0aFBhcnR9YCA6IHBhdGhQYXJ0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIHsgZ3Jvd2luZ1BhdGgsIHBlbmRpbmdOYXZQcm9wQmluZGluZyB9O1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0aW5pdGlhbFBhdGhPYmplY3Rcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRlbnRpdHlTZXRQYXRoID0gcGF0aE9iamVjdC5ncm93aW5nUGF0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVudGl0eVNldFBhdGggPSBgLyR7cGF0aFBhcnRzWzBdfWA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVudGl0eVNldFBhdGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHBhdGggZm9yIHRoZSBpdGVtcyBwcm9wZXJ0eSBvZiBNdWx0aVZhbHVlRmllbGQgcGFyYW1ldGVycy5cblx0ICpcblx0ICogQHBhcmFtIG9QYXJhbWV0ZXIgQWN0aW9uIFBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb21wbGV0ZSBtb2RlbCBwYXRoIGZvciB0aGUgaXRlbXMgcHJvcGVydHkgb2YgTXVsdGlWYWx1ZUZpZWxkIHBhcmFtZXRlcnNcblx0ICovXG5cdGdldEFjdGlvblBhcmFtZXRlckl0ZW1zTW9kZWxQYXRoOiBmdW5jdGlvbiAob1BhcmFtZXRlcjogTWV0YU1vZGVsQWN0aW9uUGFyYW1ldGVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gb1BhcmFtZXRlciAmJiBvUGFyYW1ldGVyLiROYW1lID8gYHtwYXRoOiAnbXZmdmlldz4vJHtvUGFyYW1ldGVyLiROYW1lfSd9YCA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHRmaWx0ZXJPdXROYXZQcm9wQmluZGluZzogZnVuY3Rpb24gKHNQYXRoUGFydDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNQYXRoUGFydCAhPT0gXCJcIiAmJiBzUGF0aFBhcnQgIT09IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0fSxcblxuXHQvKipcblx0ICogQWRkcyBhIHNldFByb3BlcnR5IHRvIHRoZSBjcmVhdGVkIGJpbmRpbmcgY29udGV4dHMgb2YgdGhlIGludGVybmFsIEpTT04gbW9kZWwuXG5cdCAqXG5cdCAqIEBwYXJhbSBJbnRlcm5hbCBKU09OIE1vZGVsIHdoaWNoIGlzIGVuaGFuY2VkXG5cdCAqL1xuXG5cdGVuaGFuY2VJbnRlcm5hbEpTT05Nb2RlbDogZnVuY3Rpb24gKG9JbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwpOiB2b2lkIHtcblx0XHRjb25zdCBmbkJpbmRDb250ZXh0ID0gb0ludGVybmFsTW9kZWwuYmluZENvbnRleHQ7XG5cdFx0b0ludGVybmFsTW9kZWwuYmluZENvbnRleHQgPSBmdW5jdGlvbiAoXG5cdFx0XHRzUGF0aDogc3RyaW5nLFxuXHRcdFx0Y29udGV4dDogQmFzZUNvbnRleHQsXG5cdFx0XHRtUGFyYW1ldGVyczogb2JqZWN0IHwgdW5kZWZpbmVkLFxuXHRcdFx0b0V2ZW50czogb2JqZWN0IHwgdW5kZWZpbmVkXG5cdFx0KTogQ29udGV4dEJpbmRpbmcge1xuXHRcdFx0Y29uc3QgY29udGV4dEJpbmRpbmcgPSBmbkJpbmRDb250ZXh0LmFwcGx5KHRoaXMsIFtzUGF0aCwgY29udGV4dCwgbVBhcmFtZXRlcnMsIG9FdmVudHNdKTtcblx0XHRcdGNvbnN0IGZuR2V0Qm91bmRDb250ZXh0ID0gY29udGV4dEJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0O1xuXG5cdFx0XHRjb250ZXh0QmluZGluZy5nZXRCb3VuZENvbnRleHQgPSBmdW5jdGlvbiAoKTogQmFzZUNvbnRleHQgfCBudWxsIHtcblx0XHRcdFx0Y29uc3Qgb0JvdW5kQ29udGV4dCA9IGZuR2V0Qm91bmRDb250ZXh0LmFwcGx5KHRoaXMpO1xuXHRcdFx0XHRpZiAob0JvdW5kQ29udGV4dCkge1xuXHRcdFx0XHRcdG9Cb3VuZENvbnRleHQuc2V0UHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHlQYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5nZXRPYmplY3QoKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGluaXRpYWxpemVcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHRoaXMuZ2V0UGF0aCgpLCB7fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGhTcGxpdCA9IHByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRcdFx0XHQvLyBsZXQncyBlbnN1cmUgdGhhdCBzdWIgb2JqZWN0cyBhcmUgaW5pdGlhbGl6ZWRcblx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydHlQYXRoU3BsaXQubGVuZ3RoIC0gMTsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmdldE9iamVjdChwcm9wZXJ0eVBhdGhTcGxpdFtpXSkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIGluaXRpYWxpemVcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldE1vZGVsKCkuc2V0UHJvcGVydHkodGhpcy5nZXRQYXRoKHByb3BlcnR5UGF0aFNwbGl0W2ldKSwge30pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLmdldE1vZGVsKCkuc2V0UHJvcGVydHkocHJvcGVydHlQYXRoLCB2YWx1ZSwgdGhpcyk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gb0JvdW5kQ29udGV4dDtcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gY29udGV4dEJpbmRpbmc7XG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogQWRkcyBhbiBoYW5kbGVyIG9uIHByb3BlcnR5Q2hhbmdlLlxuXHQgKiBUaGUgcHJvcGVydHkgXCIvZWRpdE1vZGVcIiBpcyBjaGFuZ2VkIGFjY29yZGluZyB0byBwcm9wZXJ0eSAnL2lzRWRpdGFibGUnIHdoZW4gdGhpcyBsYXN0IG9uZSBpcyBzZXRcblx0ICogaW4gb3JkZXIgdG8gYmUgY29tcGxpYW50IHdpdGggZm9ybWVyIHZlcnNpb25zIHdoZXJlIGJ1aWxkaW5nIGJsb2NrcyB1c2UgdGhlIHByb3BlcnR5IFwiL2VkaXRNb2RlXCJcblx0ICpcblx0ICogQHBhcmFtIHVpTW9kZWwgSlNPTiBNb2RlbCB3aGljaCBpcyBlbmhhbmNlZFxuXHQgKiBAcGFyYW0gbGlicmFyeSBDb3JlIGxpYnJhcnkgb2YgU0FQIEZpb3JpIGVsZW1lbnRzXG5cdCAqL1xuXG5cdGVuaGFuY2VVaUpTT05Nb2RlbDogZnVuY3Rpb24gKHVpTW9kZWw6IEpTT05Nb2RlbCwgbGlicmFyeTogeyBFZGl0TW9kZTogeyBFZGl0YWJsZTogc3RyaW5nOyBEaXNwbGF5OiBzdHJpbmcgfSB9KTogdm9pZCB7XG5cdFx0Y29uc3QgZm5TZXRQcm9wZXJ0eSA9IHVpTW9kZWwuc2V0UHJvcGVydHk7XG5cdFx0dWlNb2RlbC5zZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0XHRcdHBhdGg6IHN0cmluZyxcblx0XHRcdHZhbHVlOiB1bmtub3duLFxuXHRcdFx0Y29udGV4dDogQmFzZUNvbnRleHQgfCB1bmRlZmluZWQsXG5cdFx0XHRhc3luY1VwZGF0ZTogYm9vbGVhbiB8IHVuZGVmaW5lZFxuXHRcdCk6IGJvb2xlYW4ge1xuXHRcdFx0aWYgKHBhdGggPT09IFwiL2lzRWRpdGFibGVcIikge1xuXHRcdFx0XHR1aU1vZGVsLnNldFByb3BlcnR5KFwiL2VkaXRNb2RlXCIsIHZhbHVlID8gbGlicmFyeS5FZGl0TW9kZS5FZGl0YWJsZSA6IGxpYnJhcnkuRWRpdE1vZGUuRGlzcGxheSwgY29udGV4dCwgYXN5bmNVcGRhdGUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZuU2V0UHJvcGVydHkuYXBwbHkodGhpcywgW3BhdGgsIHZhbHVlLCBjb250ZXh0LCBhc3luY1VwZGF0ZV0pO1xuXHRcdH07XG5cdH0sXG5cblx0ZW5oYW5jZVZpZXdKU09OTW9kZWw6IGZ1bmN0aW9uICh2aWV3TW9kZWw6IEpTT05Nb2RlbCAmIHsgX2dldE9iamVjdDogRnVuY3Rpb24gfSk6IHZvaWQge1xuXHRcdGNvbnN0IGZuR2V0T2JqZWN0ID0gdmlld01vZGVsLl9nZXRPYmplY3Q7XG5cdFx0dmlld01vZGVsLl9nZXRPYmplY3QgPSBmdW5jdGlvbiAoc1BhdGg6IHN0cmluZywgb0NvbnRleHQ/OiBDb250ZXh0KTogdW5rbm93biB7XG5cdFx0XHRpZiAoc1BhdGggPT09IHVuZGVmaW5lZCB8fCBzUGF0aCA9PT0gXCJcIikge1xuXHRcdFx0XHRzUGF0aCA9IFwiL1wiO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZuR2V0T2JqZWN0LmFwcGx5KHRoaXMsIFtzUGF0aCwgb0NvbnRleHRdKTtcblx0XHR9O1xuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIGZpbHRlcmluZyBvbiB0aGUgdGFibGUgaXMgY2FzZSBzZW5zaXRpdmUuXG5cdCAqXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBpbnN0YW5jZSBvZiB0aGUgbWV0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zICdmYWxzZScgaWYgRmlsdGVyRnVuY3Rpb25zIGFubm90YXRpb24gc3VwcG9ydHMgJ3RvbG93ZXInLCBlbHNlICd0cnVlJ1xuXHQgKi9cblx0aXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlOiBmdW5jdGlvbiAob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpOiB1bmRlZmluZWQgfCBib29sZWFuIHtcblx0XHRpZiAoIW9NZXRhTW9kZWwpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGNvbnN0IGFGaWx0ZXJGdW5jdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi9AT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJGdW5jdGlvbnNcIik7XG5cdFx0Ly8gR2V0IGZpbHRlciBmdW5jdGlvbnMgZGVmaW5lZCBhdCBFbnRpdHlDb250YWluZXIgYW5kIGNoZWNrIGZvciBleGlzdGVuY2Ugb2YgJ3RvbG93ZXInXG5cdFx0cmV0dXJuIGFGaWx0ZXJGdW5jdGlvbnMgPyBhRmlsdGVyRnVuY3Rpb25zLmluZGV4T2YoXCJ0b2xvd2VyXCIpID09PSAtMSA6IHRydWU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBNZXRhUGF0aCBmb3IgdGhlIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIHVzZWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgbWV0YXBhdGggZm9yIHRoZSBjb250ZXh0LlxuXHQgKi9cblx0Z2V0TWV0YVBhdGhGb3JDb250ZXh0OiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0cmV0dXJuIG9NZXRhTW9kZWwgJiYgc1BhdGggJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBNZXRhUGF0aCBmb3IgdGhlIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0UGF0aCBNZXRhUGF0aCB0byBiZSB1c2VkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHJvb3QgZW50aXR5IHNldCBwYXRoLlxuXHQgKi9cblx0Z2V0Um9vdEVudGl0eVNldFBhdGg6IGZ1bmN0aW9uIChjb250ZXh0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRsZXQgcm9vdEVudGl0eVNldFBhdGggPSBcIlwiO1xuXHRcdGNvbnN0IGFQYXRocyA9IGNvbnRleHRQYXRoID8gY29udGV4dFBhdGguc3BsaXQoXCIvXCIpIDogW107XG5cdFx0aWYgKGFQYXRocy5sZW5ndGggPiAxKSB7XG5cdFx0XHRyb290RW50aXR5U2V0UGF0aCA9IGFQYXRoc1sxXTtcblx0XHR9XG5cdFx0cmV0dXJuIHJvb3RFbnRpdHlTZXRQYXRoO1xuXHR9LFxuXHQvKipcblx0ICogR2V0IE1ldGFQYXRoIGZvciB0aGUgbGlzdEJpbmRpbmcuXG5cdCAqXG5cdCAqIEBwYXJhbSBvVmlldyBWaWV3IG9mIHRoZSBjb250cm9sIHVzaW5nIGxpc3RCaW5kaW5nXG5cdCAqIEBwYXJhbSB2TGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyBvYmplY3Qgb3IgdGhlIGJpbmRpbmcgcGF0aCBmb3IgYSB0ZW1wb3JhcnkgbGlzdCBiaW5kaW5nXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIG1ldGFwYXRoIGZvciB0aGUgbGlzdGJpbmRpbmcuXG5cdCAqL1xuXHRnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmc6IGZ1bmN0aW9uIChvVmlldzogRkVWaWV3LCB2TGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzTWV0YVBhdGg7XG5cblx0XHRpZiAodHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0aWYgKHZMaXN0QmluZGluZy5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHQvLyBhYnNvbHV0ZSBwYXRoXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgodkxpc3RCaW5kaW5nKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHJlbGF0aXZlIHBhdGhcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7c1Jvb3RDb250ZXh0UGF0aH0vJHt2TGlzdEJpbmRpbmd9YCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHdlIGFscmVhZHkgZ2V0IGEgbGlzdCBiaW5kaW5nIHVzZSB0aGlzIG9uZVxuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBvUm9vdEJpbmRpbmcgPSBvQmluZGluZy5nZXRSb290QmluZGluZygpO1xuXHRcdFx0aWYgKG9CaW5kaW5nID09PSBvUm9vdEJpbmRpbmcpIHtcblx0XHRcdFx0Ly8gYWJzb2x1dGUgcGF0aFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9CaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRcdGNvbnN0IHNSb290QmluZGluZ1BhdGggPSBvUm9vdEJpbmRpbmchLmdldFBhdGgoKTtcblx0XHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9IG9CaW5kaW5nLmdldFBhdGgoKTtcblx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChgJHtzUm9vdEJpbmRpbmdQYXRofS8ke3NSZWxhdGl2ZVBhdGh9YCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBzTWV0YVBhdGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBkcmFmdCByb290LlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZFxuXHQgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIGRyYWZ0IHJvb3Rcblx0ICovXG5cdGlzRHJhZnRSb290OiBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmtub3duIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0RHJhZnRSb290KGVudGl0eVNldCkgIT09IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIGRyYWZ0IG5vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgZHJhZnQgbm9kZVxuXHQgKi9cblx0aXNEcmFmdE5vZGU6IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVua25vd24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXREcmFmdE5vZGUoZW50aXR5U2V0KSAhPT0gdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgc3RpY2t5IHNlc3Npb24gcm9vdC5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgV2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBzdGlja3kgc2Vzc2lvbiByb290XG5cdCAqL1xuXHRpc1N0aWNreTogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U3RpY2t5U2Vzc2lvbihlbnRpdHlTZXQpICE9PSB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgZW50aXR5IGlzIHVwZGF0YWJsZSBvciBub3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIEVudGl0eVR5cGVcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB1cGRhdGFibGUgZWxzZSBmYWxzZVxuXHQgKi9cblx0aXNVcGRhdGVIaWRkZW46IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZCwgZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IFVwZGF0ZUhpZGRlbiB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGlzRW50aXR5U2V0KGVudGl0eVNldCkpIHtcblx0XHRcdHJldHVybiBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuVUk/LlVwZGF0ZUhpZGRlbiA/PyBlbnRpdHlUeXBlPy5hbm5vdGF0aW9ucy5VST8uVXBkYXRlSGlkZGVuO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEdldHMgdGhlIEBDb21tb24uRHJhZnRSb290IGFubm90YXRpb24gaWYgdGhlIGFyZ3VtZW50IGlzIGFuIEVudGl0eVNldC5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgRHJhZnRSb290XG5cdCAqL1xuXHRnZXREcmFmdFJvb3Q6IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVua25vd24gfCB1bmRlZmluZWQpOiBEcmFmdFJvb3QgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiBpc0VudGl0eVNldChlbnRpdHlTZXQpID8gZW50aXR5U2V0LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290IDogdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBAQ29tbW9uLkRyYWZ0Tm9kZSBhbm5vdGF0aW9uIGlmIHRoZSBhcmd1bWVudCBpcyBhbiBFbnRpdHlTZXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIERyYWZ0Um9vdFxuXHQgKi9cblx0Z2V0RHJhZnROb2RlOiBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmtub3duIHwgdW5kZWZpbmVkKTogRHJhZnROb2RlIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gaXNFbnRpdHlTZXQoZW50aXR5U2V0KSA/IGVudGl0eVNldC5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Tm9kZSA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogSGVscGVyIG1ldGhvZCB0byBnZXQgc3RpY2t5IHNlc3Npb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIFNlc3Npb24gU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHQgKi9cblx0Z2V0U3RpY2t5U2Vzc2lvbjogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5rbm93biB8IHVuZGVmaW5lZCk6IFN0aWNreVNlc3Npb25TdXBwb3J0ZWQgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiBpc0VudGl0eVNldChlbnRpdHlTZXQpID8gZW50aXR5U2V0LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBnZXQgdGhlIHZpc2liaWxpdHkgc3RhdGUgb2YgZGVsZXRlIGJ1dHRvbi5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgRW50aXR5VHlwZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGRlbGV0ZSBidXR0b24gaXMgaGlkZGVuXG5cdCAqL1xuXHRnZXREZWxldGVIaWRkZW46IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZCwgZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IERlbGV0ZUhpZGRlbiB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGlzRW50aXR5U2V0KGVudGl0eVNldCkpIHtcblx0XHRcdHJldHVybiBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuVUk/LkRlbGV0ZUhpZGRlbiA/PyBlbnRpdHlUeXBlLmFubm90YXRpb25zLlVJPy5EZWxldGVIaWRkZW47XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBtZXRhcGF0aCBmb3IgdGhlIGdpdmVuIGxpc3QgYmluZGluZy5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3RCaW5kaW5nLlxuXHQgKiBAcmV0dXJucyBNZXRhUGF0aFxuXHQgKi9cblx0Z2V0QWJzb2x1dGVQYXRoRnJvbUxpc3RCaW5kaW5nKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBtZXRhbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBtZXRhUGF0aDtcblx0XHRjb25zdCByb290QmluZGluZyA9IGxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCk7XG5cdFx0aWYgKGxpc3RCaW5kaW5nID09PSByb290QmluZGluZykge1xuXHRcdFx0bWV0YVBhdGggPSBtZXRhbW9kZWwuZ2V0TWV0YVBhdGgobGlzdEJpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgcm9vdEJpbmRpbmdQYXRoID0gcm9vdEJpbmRpbmc/LmdldFBhdGgoKTtcblx0XHRcdGNvbnN0IHJlbGF0aXZlUGF0aCA9IGxpc3RCaW5kaW5nLmdldFBhdGgoKTtcblx0XHRcdG1ldGFQYXRoID0gbWV0YW1vZGVsLmdldE1ldGFQYXRoKGAke3Jvb3RCaW5kaW5nUGF0aH0vJHtyZWxhdGl2ZVBhdGh9YCk7XG5cdFx0fVxuXHRcdHJldHVybiBtZXRhUGF0aDtcblx0fSxcblxuXHRlbmhhbmNlT0RhdGFNb2RlbChvZGF0YU1vZGVsOiBPRGF0YU1vZGVsKTogdm9pZCB7XG5cdFx0b2RhdGFNb2RlbC52aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkgPSBuZXcgQXJyYXk8T0RhdGFQcm9wZXJ0eUJpbmRpbmc+KCk7XG5cdFx0Y29uc3QgZm5NZXNzYWdlID0gb2RhdGFNb2RlbC5zZXRNZXNzYWdlcztcblx0XHRjb25zdCBsb2NhbEFubm90YXRpb25Nb2RlbCA9IG5ldyBKU09OTW9kZWwoe30pO1xuXHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldERlZmF1bHRCaW5kaW5nTW9kZShCaW5kaW5nTW9kZS5PbmVXYXkpO1xuXHRcdGNvbnN0IGJhc2VTZXRQcm9wZXJ0eSA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5O1xuXHRcdGNvbnN0IGJhc2VHZXRQcm9wZXJ0eSA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldFByb3BlcnR5O1xuXHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldFByb3BlcnR5ID0gZnVuY3Rpb24gKHBhdGgsIGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogdW5rbm93biB7XG5cdFx0XHRjb25zdCBbcHJvcGVydHlOYW1lLCBhbm5vdGF0aW9uVHlwZV0gPSBwYXRoLnNwbGl0KFwiQCR1aTUuZmUuXCIpO1xuXG5cdFx0XHRpZiAoY29udGV4dCAmJiBjb250ZXh0LmlzVHJhbnNpZW50KCkgIT09IHRydWUgJiYgYW5ub3RhdGlvblR5cGUgPT09IFwiQENvbW1vbi9FeHRlcm5hbElEXCIpIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dE9iamVjdCA9IGNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGlmIChjb250ZXh0T2JqZWN0KSB7XG5cdFx0XHRcdFx0Y29uc3QgbWV0YVBhdGggPSBuZXcgTWV0YVBhdGg8RW50aXR5U2V0Pihcblx0XHRcdFx0XHRcdGNvbnZlcnRUeXBlcyhvZGF0YU1vZGVsLmdldE1ldGFNb2RlbCgpKSxcblx0XHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpLFxuXHRcdFx0XHRcdFx0b2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGNvbnN0IGV4dGVybmFsSWRQcm9wZXJ0eSA9IG1ldGFQYXRoLmdldE1ldGFQYXRoRm9yUGF0aDxQcm9wZXJ0eT4ocHJvcGVydHlOYW1lKS5nZXRUYXJnZXQoKS5hbm5vdGF0aW9ucy5Db21tb25cblx0XHRcdFx0XHRcdD8uRXh0ZXJuYWxJRDtcblx0XHRcdFx0XHRpZiAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24oZXh0ZXJuYWxJZFByb3BlcnR5KSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0T2JqZWN0KGV4dGVybmFsSWRQcm9wZXJ0eS5wYXRoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5TmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoY29udGV4dCAmJiBhbm5vdGF0aW9uVHlwZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LmdldFBhdGgoKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGJhc2VHZXRQcm9wZXJ0eS5hcHBseSh0aGlzLCBbcGF0aCwgY29udGV4dF0pO1xuXHRcdH07XG5cblx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwYXRoLCB2YWx1ZSwgY29udGV4dCwgYXN5bmNVcGRhdGUpOiBib29sZWFuIHtcblx0XHRcdGxldCBmdWxsUGF0aCA9IHBhdGg7XG5cdFx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0XHRmdWxsUGF0aCA9IGNvbnRleHQuZ2V0UGF0aChwYXRoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IF9yZWZyZXNoTG9jYWxNb2RlbCA9ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0dGhpcy5yZWZyZXNoKCk7XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgW3Byb3BlcnR5TmFtZSwgYW5ub3RhdGlvblR5cGVdID0gcGF0aC5zcGxpdChcIkAkdWk1LmZlLlwiKTtcblx0XHRcdGlmIChjb250ZXh0ICYmIGFubm90YXRpb25UeXBlID09PSBcIkBDb21tb24vRXh0ZXJuYWxJRFwiKSB7XG5cdFx0XHRcdGNvbnRleHQuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSk7XG5cdFx0XHRcdC8vIHJlZnJlc2hpbmcgRXh0ZXJuYWxJRCBhbmQgdGV4dCBwcm9wZXJ0aWVzIChwYXRocyBuZWVkIHRvIGJlIGRldGVybWluZWQgZ2VuZXJpY2FsbHkpXG5cdFx0XHRcdGNvbnN0IG1ldGFQYXRoID0gbmV3IE1ldGFQYXRoPEVudGl0eVNldD4oXG5cdFx0XHRcdFx0Y29udmVydFR5cGVzKG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkpLFxuXHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpLFxuXHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IGV4dGVybmFsSWRQcm9wZXJ0eSA9IG1ldGFQYXRoLmdldE1ldGFQYXRoRm9yUGF0aDxQcm9wZXJ0eT4ocHJvcGVydHlOYW1lKS5nZXRUYXJnZXQoKS5hbm5vdGF0aW9ucy5Db21tb24/LkV4dGVybmFsSUQ7XG5cdFx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihleHRlcm5hbElkUHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZFByb3BQYXRoID0gZXh0ZXJuYWxJZFByb3BlcnR5LnBhdGg7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydGllc1RvUmVxdWVzdCA9IFtleHRlcm5hbElkUHJvcFBhdGguc3Vic3RyaW5nKDAsIGV4dGVybmFsSWRQcm9wUGF0aC5sYXN0SW5kZXhPZihcIi9cIikpXTtcblx0XHRcdFx0XHRjb25zdCB0ZXh0UHJvcGVydHkgPSBtZXRhUGF0aC5nZXRNZXRhUGF0aEZvclBhdGg8UHJvcGVydHk+KGV4dGVybmFsSWRQcm9wUGF0aCkuZ2V0VGFyZ2V0KCkuYW5ub3RhdGlvbnMuQ29tbW9uPy5UZXh0O1xuXHRcdFx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0ZXh0UHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0ZXh0UHJvcFBhdGggPSB0ZXh0UHJvcGVydHkucGF0aDtcblx0XHRcdFx0XHRcdGlmICh0ZXh0UHJvcFBhdGguaW5jbHVkZXMoXCIvXCIpKSB7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnRpZXNUb1JlcXVlc3QucHVzaCh0ZXh0UHJvcFBhdGgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQoY29udGV4dCBhcyBPRGF0YVY0Q29udGV4dClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMocHJvcGVydGllc1RvUmVxdWVzdClcblx0XHRcdFx0XHRcdC50aGVuKF9yZWZyZXNoTG9jYWxNb2RlbClcblx0XHRcdFx0XHRcdC5jYXRjaCgoZXJyKSA9PiB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnIgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGhTcGxpdCA9IGZ1bGxQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdC8vIGxldCdzIGVuc3VyZSB0aGF0IHN1YiBvYmplY3RzIGFyZSBpbml0aWFsaXplZFxuXHRcdFx0bGV0IHBhdGhGcm9tUm9vdCA9IFwiXCI7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnR5UGF0aFNwbGl0Lmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRwYXRoRnJvbVJvb3QgKz0gXCIvXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cGF0aEZyb21Sb290ICs9IHByb3BlcnR5UGF0aFNwbGl0W2ldO1xuXHRcdFx0XHRpZiAodGhpcy5nZXRPYmplY3QocGF0aEZyb21Sb290KSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Ly8gaW5pdGlhbGl6ZVxuXHRcdFx0XHRcdHRoaXMuc2V0UHJvcGVydHkocGF0aEZyb21Sb290LCB7fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBiYXNlU2V0UHJvcGVydHkuYXBwbHkodGhpcywgW3BhdGgsIHZhbHVlLCBjb250ZXh0LCBhc3luY1VwZGF0ZV0pO1xuXHRcdH07XG5cdFx0ZnVuY3Rpb24gY2xlYXJBbm5vdGF0aW9uVHlwZShhbm5vdGF0aW9uVHlwZXM6IHN0cmluZ1tdLCBkYXRhU2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IG9iamVjdCB7XG5cdFx0XHRmb3IgKGNvbnN0IGNvbnRleHRQYXRoIGluIGRhdGFTZXQpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBkYXRhU2V0W2NvbnRleHRQYXRoXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdGRhdGFTZXRbY29udGV4dFBhdGhdID0gY2xlYXJBbm5vdGF0aW9uVHlwZShhbm5vdGF0aW9uVHlwZXMsIGRhdGFTZXRbY29udGV4dFBhdGhdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcblx0XHRcdFx0XHRpZiAoT2JqZWN0LmtleXMoZGF0YVNldFtjb250ZXh0UGF0aF0gYXMgb2JqZWN0KS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBkYXRhU2V0W2NvbnRleHRQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChjb25zdCBhbm5vdGF0aW9uVHlwZSBvZiBhbm5vdGF0aW9uVHlwZXMpIHtcblx0XHRcdFx0XHRpZiAoY29udGV4dFBhdGguZW5kc1dpdGgoYW5ub3RhdGlvblR5cGUpKSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgZGF0YVNldFtjb250ZXh0UGF0aF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZGF0YVNldDtcblx0XHR9XG5cdFx0b2RhdGFNb2RlbC5fbG9jYWxBbm5vdGF0aW9uTW9kZWwgPSBsb2NhbEFubm90YXRpb25Nb2RlbDtcblx0XHRvZGF0YU1vZGVsLmdldExvY2FsQW5ub3RhdGlvbk1vZGVsID0gZnVuY3Rpb24gKCk6IEpTT05Nb2RlbCB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWw7XG5cdFx0fTtcblx0XHRvZGF0YU1vZGVsLnNldE1lc3NhZ2VzID0gZnVuY3Rpb24gKG1lc3NhZ2VzOiBSZWNvcmQ8c3RyaW5nLCBNZXNzYWdlW10+KTogdm9pZCB7XG5cdFx0XHRjb25zdCBjbGVhbmVkRGF0YSA9IGNsZWFyQW5ub3RhdGlvblR5cGUoW1wiQCR1aTUuZmUubWVzc2FnZVR5cGVcIiwgXCJAJHVpNS5mZS5tZXNzYWdlVGV4dFwiXSwgdGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuZ2V0RGF0YSgpKTtcblx0XHRcdHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsLnNldERhdGEoY2xlYW5lZERhdGEpO1xuXHRcdFx0Zm9yIChjb25zdCBtZXNzYWdlVGFyZ2V0IGluIG1lc3NhZ2VzKSB7XG5cdFx0XHRcdHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KGAke21lc3NhZ2VUYXJnZXR9QCR1aTUuZmUubWVzc2FnZVR5cGVgLCBtZXNzYWdlc1ttZXNzYWdlVGFyZ2V0XVswXS5nZXRUeXBlKCkpO1xuXHRcdFx0XHR0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShgJHttZXNzYWdlVGFyZ2V0fUAkdWk1LmZlLm1lc3NhZ2VUZXh0YCwgbWVzc2FnZXNbbWVzc2FnZVRhcmdldF1bMF0uZ2V0TWVzc2FnZSgpKTtcblx0XHRcdH1cblx0XHRcdGZuTWVzc2FnZS5hcHBseSh0aGlzLCBbbWVzc2FnZXNdKTtcblx0XHR9O1xuXHRcdGNvbnN0IGZuQmluZFByb3BlcnR5ID0gb2RhdGFNb2RlbC5iaW5kUHJvcGVydHkuYmluZChvZGF0YU1vZGVsKTtcblx0XHRvZGF0YU1vZGVsLmJpbmRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwYXRoOiBzdHJpbmcsIGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBwYXJhbWV0ZXJzKTogT0RhdGFQcm9wZXJ0eUJpbmRpbmcge1xuXHRcdFx0Y29uc3QgcmVjb21tZW5kYXRpb25Qcm9wZXJ0eUJpbmRpbmcgPSBNb2RlbEhlbHBlci5zZXRVcFJlY29tbWVuZGF0aW9uTG9jYWxNb2RlbEJpbmRpbmcodGhpcywgZm5CaW5kUHJvcGVydHksIHBhdGgsIGNvbnRleHQpO1xuXHRcdFx0aWYgKHJlY29tbWVuZGF0aW9uUHJvcGVydHlCaW5kaW5nKSB7XG5cdFx0XHRcdHJldHVybiByZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZyBhcyBPRGF0YVByb3BlcnR5QmluZGluZztcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoLmVuZHNXaXRoKFwiQCR1aTUuZmUuQENvbW1vbi9FeHRlcm5hbElEXCIpICYmIGNvbnRleHQpIHtcblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxJZEJpbmRpbmcgPSBmbkJpbmRQcm9wZXJ0eShwYXRoLCBjb250ZXh0KTtcblx0XHRcdFx0b2RhdGFNb2RlbC52aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkucHVzaChpbnRlcm5hbElkQmluZGluZyk7XG5cdFx0XHRcdGNvbnN0IGV4dGVybmFsSWRCaW5kaW5nID0gdGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuYmluZFByb3BlcnR5KHBhdGgsIGNvbnRleHQpIGFzIHVua25vd24gYXMgT0RhdGFQcm9wZXJ0eUJpbmRpbmc7XG5cblx0XHRcdFx0aW50ZXJuYWxJZEJpbmRpbmcuYXR0YWNoQ2hhbmdlKCgpID0+IHtcblx0XHRcdFx0XHRleHRlcm5hbElkQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpbnRlcm5hbElkQmluZGluZ1xuXHRcdFx0XHRcdC5yZXF1ZXN0VmFsdWUoKVxuXHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdGV4dGVybmFsSWRCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgoZXJyKSA9PiB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBleHRlcm5hbElkQmluZGluZztcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoLmluY2x1ZGVzKFwiQCR1aTUuZmUuXCIpKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BCaW5kaW5nID0gdGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuYmluZFByb3BlcnR5KHBhdGgsIGNvbnRleHQpIGFzIE9EYXRhUHJvcGVydHlCaW5kaW5nICYge1xuXHRcdFx0XHRcdHNldENvbnRleHQ/OiBGdW5jdGlvbjtcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKHBhdGguZW5kc1dpdGgoXCJAJHVpNS5mZS5AQ29tbW9uL0V4dGVybmFsSURcIikpIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvcEJpbmRpbmc7XG5cdFx0XHRcdH1cblx0XHRcdFx0cHJvcEJpbmRpbmcudXBkYXRlUmVxdWlyZWQgPSBmdW5jdGlvbiAobW9kZWw6IG9iamVjdCk6IGJvb2xlYW4ge1xuXHRcdFx0XHRcdHJldHVybiBtb2RlbCAmJiBtb2RlbCA9PT0gb2RhdGFNb2RlbDtcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKHBhdGguaW5jbHVkZXMoXCJAJHVpNS5mZS52aXJ0dWFsLlwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IGV4cHJlc3Npb24gPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0VmlydHVhbEJpbmRpbmdFeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0cGF0aCxcblx0XHRcdFx0XHRcdE1ldGFNb2RlbENvbnZlcnRlci5jb252ZXJ0VHlwZXModGhpcy5nZXRNZXRhTW9kZWwoKSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGNvbnN0IGdob3N0Q29udHJvbCA9IG5ldyBBbnkoeyBhbnk6IGNvbXBpbGVFeHByZXNzaW9uKGV4cHJlc3Npb24pLCBiaW5kQmFja1Byb3BlcnR5OiBwYXRoIH0pO1xuXHRcdFx0XHRcdGNvbnN0IGZuRGVzdHJveVByb3BlcnR5QmluZGluZyA9IHByb3BCaW5kaW5nLmRlc3Ryb3kuYmluZChwcm9wQmluZGluZyk7XG5cdFx0XHRcdFx0cHJvcEJpbmRpbmcuZGVzdHJveSA9ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdGdob3N0Q29udHJvbD8uZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuRGVzdHJveVByb3BlcnR5QmluZGluZygpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y29uc3QgZm5TZXRDb250ZXh0ID0gcHJvcEJpbmRpbmcuc2V0Q29udGV4dDtcblx0XHRcdFx0XHRpZiAoZm5TZXRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRwcm9wQmluZGluZy5zZXRDb250ZXh0ID0gKG5ld0NvbnRleHQ6IENvbnRleHQpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDb250cm9sPy5zZXRCaW5kaW5nQ29udGV4dChuZXdDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZuU2V0Q29udGV4dC5iaW5kKHByb3BCaW5kaW5nKShuZXdDb250ZXh0KTtcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Z2hvc3RDb250cm9sLnNldE1vZGVsKHRoaXMpO1xuXHRcdFx0XHRcdGNvbnN0IGdob3N0QmluZGluZyA9IGdob3N0Q29udHJvbC5nZXRCaW5kaW5nSW5mbyhcImFueVwiKT8uYmluZGluZztcblx0XHRcdFx0XHRjb25zdCBmbkNoZWNrVXBkYXRlID0gZ2hvc3RCaW5kaW5nPy5jaGVja1VwZGF0ZTtcblx0XHRcdFx0XHRpZiAoZm5DaGVja1VwZGF0ZSkge1xuXHRcdFx0XHRcdFx0Z2hvc3RDb250cm9sLmdldEJpbmRpbmdJbmZvKFwiYW55XCIpLmJpbmRpbmcuY2hlY2tVcGRhdGUgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmbkNoZWNrVXBkYXRlLmJpbmQoZ2hvc3RCaW5kaW5nKSh0cnVlKTtcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGdob3N0Q29udHJvbC5zZXRCaW5kaW5nQ29udGV4dChjb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcHJvcEJpbmRpbmc7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZm5CaW5kUHJvcGVydHkocGF0aCwgY29udGV4dCwgcGFyYW1ldGVycyk7XG5cdFx0fTtcblx0XHRjb25zdCBmbkRlc3Ryb3kgPSBvZGF0YU1vZGVsLmRlc3Ryb3kuYmluZChvZGF0YU1vZGVsKTtcblx0XHRvZGF0YU1vZGVsLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRmb3IgKGNvbnN0IHZwQmluZGluZyBvZiBvZGF0YU1vZGVsLnZpcnR1YWxQcm9wZXJ0eUJpbmRpbmdSZWdpc3RyeSkge1xuXHRcdFx0XHR2cEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuZGVzdHJveSgpO1xuXHRcdFx0cmV0dXJuIGZuRGVzdHJveS5hcHBseSh0aGlzKTtcblx0XHR9O1xuXHR9LFxuXHQvKipcblx0ICogUmVzb2x2ZXMgYSBtZXRhZGF0YSBiaW5kaW5nIHRvIGl0cyB0ZXh0LCBlaXRoZXIgdXNpbmcgdGhlIGNvbnZlcnRlckNvbnRleHQgb3IgdGhlIG1ldGFNb2RlbCBkaXJlY3RseS5cblx0ICpcblx0ICogQHBhcmFtIHBhdGhcblx0ICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcblx0ICogQHBhcmFtIG1ldGFNb2RlbFxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgdGV4dCBpZiBwb3NzaWJsZSwgZWxzZSB0aGUgaW5wdXQgdmFsdWUgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBwYXRoIHdhcyB1bmRlZmluZWRcblx0ICovXG5cdGZldGNoVGV4dEZyb21NZXRhTW9kZWwocGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLCBjb252ZXJ0ZXJDb250ZXh0PzogQ29udmVydGVyQ29udGV4dDx1bmtub3duPiwgbWV0YU1vZGVsPzogTWV0YU1vZGVsKTogc3RyaW5nIHtcblx0XHRsZXQgdGV4dCA9IHBhdGggIT09IHVuZGVmaW5lZCA/IHBhdGggOiBcIlwiO1xuXHRcdGlmIChwYXRoPy5zdGFydHNXaXRoKFwie21ldGFNb2RlbD5cIikpIHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbFBhdGggPSBwYXRoLnN1YnN0cmluZygxMSwgcGF0aC5sZW5ndGggLSAxKTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0KSB7XG5cdFx0XHRcdFx0dGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZUFubm90YXRpb24obWV0YU1vZGVsUGF0aCkuYW5ub3RhdGlvbj8udG9TdHJpbmcoKSA/PyBcIlwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRleHQgPSBtZXRhTW9kZWw/LmdldE9iamVjdChtZXRhTW9kZWxQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRMb2cuaW5mbyhgVW5hYmxlIHRvIHJldHJpZXZlIHRleHQgZnJvbSBtZXRhIG1vZGVsIHVzaW5nIHBhdGggJHttZXRhTW9kZWxQYXRofWApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGV4dDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHJldHJpZXZlIHRoZSBwcm9wZXJ0eSBwYXRoIGNvcnJlc3BvbmRpbmcgdG8gc3RhdGUgbWVzc2FnZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBtZXRhTW9kZWwgVGhlIG1ldGFtb2RlbFxuXHQgKiBAcGFyYW0gY29udGV4dFBhdGggUGF0aCBmb3IgdGhlIGNvbnRleHQgb24gd2hpY2ggd2Ugd2hhdCB0byByZXRyZWl2ZSB0aGUgbWVzc2FnZSBwYXRoXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGgsIG9yIHVuZGVmaW5lZCBpZiBubyBNZXNzYWdlcyBhbm5vdGF0aW9uIGlzIGRlZmluZWRcblx0ICovXG5cdGdldE1lc3NhZ2VzUGF0aDogZnVuY3Rpb24gKG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIGNvbnRleHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHRQYXRoKTtcblx0XHRjb25zdCBvYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KTtcblx0XHRjb25zdCBtZXNzYWdlcyA9IG9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/Lk1lc3NhZ2VzO1xuXHRcdHJldHVybiBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihtZXNzYWdlcykgPyBtZXNzYWdlcy5wYXRoIDogdW5kZWZpbmVkO1xuXHR9LFxuXHQvKipcblx0ICogU2V0dXAgcmVjb21tZW5kYXRpb24gbG9jYWwgYmluZGluZyB0byBtYWtlIHJlY29tbWVuZGF0aW9ucyBhY2Nlc3NpYmxlIHZpYSBjbGllbnQgc2lkZSBpbnN0YW5jZSBhbm5vdGF0aW9ucy5cblx0ICpcblx0ICogUmVjb21tZW5kYXRpb25zIGlzIGEgY29tcGxleCBwcm9wZXJ0eS5cblx0ICogTW9kZWwgZG9lcyBub3QgcHJvdmlkZSBhbiBlYXN5IHdheSB0byBiaW5kIHRvIGNvbXBsZXggcHJvcGVydGllcy4gSXQgaGFzIDIgbWFqb3IgbGltaXRhdGlvbnMuXG5cdCAqXG5cdCAqIEl0IG9ubHkgc3VwcG9ydHMgb25lIHRpbWUgYmluZGluZyB0byBjb21wbGV4IHByb3BlcnRpZXMuIFRoaXMgaXMgbmVlZGVkIHRvIHNob3cgdXBkYXRlZCByZWNvbW1lbmRhdGlvbnMgb24gdGhlIFVJLlxuXHQgKiBJdCBkb2VzIG5vdCBzdXBwb3J0IGJpbmRpbmdzIHRvIHByb3BlcnRpZXMgaW5zaWRlIGEgY29tcGxleCBwcm9wZXJ0eSB3aGljaCBpcyBuZWVkZWQgZm9yIHJlY29tbWVuZGF0aW9ucy5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIHdvcmthcm91bmQgdG8gb3ZlcmNvbWUgdGhlIGFib3ZlIHR3byBzaG9ydCBjb21pbmdzIGFuZFxuXHQgKiB0byBzdXBwb3J0IGNsaWVudCBzaWRlIGluc3RhbmNlIGFubm90YXRpb25zIGZvciByZWNvbW1lbmRhdGlvbnMuXG5cdCAqXG5cdCAqIEBwYXJhbSBvZGF0YU1vZGVsIFRoZSBvZGF0YSBtb2RlbCBpbnN0YW5jZS5cblx0ICogQHBhcmFtIGZuQmluZFByb3BlcnR5IE9yaWdpbmFsIGJpbmQgcHJvcGVydHkgb2YgdGhlIG9EYXRhTW9kZWxcblx0ICogQHBhcmFtIHBhdGggQmluZGluZyBwYXRoIGZvciB3aGljaCByZWNvbW1lbmRhdGlvbiBpcyBiZWluZyByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB3aGVyZSByZWNvbW1lbmRhdGlvbiBpcyBiZWluZyByZXF1ZXN0ZWRcblx0ICogQHJldHVybnMgUmVjb21tZW5kYXRpb24gcHJvcGVydHkgcGF0aCBmb3IgdGhlIGVudGl0eSByZWxhdGVkIHRvIHRoZSBjb250ZXh0IGFuZCB3aGV0aGVyIHRoZSBiaW5kaW5nUGF0aCBpcyByZWxldmFudCBvciBub3QgYmFzZWQgb24gbWV0YWRhdGEuXG5cdCAqL1xuXHRzZXRVcFJlY29tbWVuZGF0aW9uTG9jYWxNb2RlbEJpbmRpbmc6IGZ1bmN0aW9uIChcblx0XHRvZGF0YU1vZGVsOiBPRGF0YU1vZGVsLFxuXHRcdGZuQmluZFByb3BlcnR5OiBGdW5jdGlvbixcblx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHRcblx0KTogUHJvcGVydHlCaW5kaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAocGF0aC5pbmNsdWRlcyhcInVpNS5mZS5yZWNvbW1lbmRhdGlvbnNcIikpIHtcblx0XHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uYmluZGluZyA9IG9kYXRhTW9kZWxcblx0XHRcdFx0LmdldExvY2FsQW5ub3RhdGlvbk1vZGVsKClcblx0XHRcdFx0LmJpbmRQcm9wZXJ0eShwYXRoLCBjb250ZXh0KSBhcyB1bmtub3duIGFzIE9EYXRhUHJvcGVydHlCaW5kaW5nO1xuXHRcdFx0aWYgKGNvbnRleHQpIHtcblx0XHRcdFx0Y29uc3QgeyByZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSwgaXNSZWNvbW1lbmRlZFByb3BlcnR5IH0gPSBNb2RlbEhlbHBlci52YWxpZGF0ZVJlY29tbWVuZGF0aW9uQmluZGluZ1BhdGgoXG5cdFx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0XHRwYXRoXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChyZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSAmJiBpc1JlY29tbWVuZGVkUHJvcGVydHkpIHtcblx0XHRcdFx0XHRjb25zdCBhbHJlYWR5Qm91bmQgPSBvZGF0YU1vZGVsLnZpcnR1YWxQcm9wZXJ0eUJpbmRpbmdSZWdpc3RyeS5zb21lKChleGlzdGluZ0JpbmRpbmcpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdC8vIGJpbmRpbmcgZXhpc3RzIGJ1dCB0aGUgY29udGV4dCBjYW4gYmUgZGVzdHJveWVkIHNvbWV0aW1lcyBiZWNhdXNlIG9mIGRpc2NhcmQgYW5kIGRlbGV0ZS5cblx0XHRcdFx0XHRcdFx0Ly8gaGVuY2Ugd2UgbmVlZCB0byBjaGVjayBpZiBjb250ZXh0IGV4aXN0cyBvciBub3QgYmVmb3JlIGRlY2lkaW5nIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGJpbmRpbmcgb3Igbm90LlxuXHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBXZSBtaWdodCB3YW50IHRvIGNsZWFyIHRoZSBwcm9wZXJ0eSBiaW5kaW5nIHdoZW4gdGhlIGNvbnRleCBpcyBkZXN0cm95ZWQuXG5cdFx0XHRcdFx0XHRcdGNvbnRleHQuZ2V0UGF0aCgpID09PSBleGlzdGluZ0JpbmRpbmcuZ2V0Q29udGV4dCgpPy5nZXRQYXRoKCkgJiZcblx0XHRcdFx0XHRcdFx0cmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkgPT09IGV4aXN0aW5nQmluZGluZy5nZXRQYXRoKClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aWYgKCFhbHJlYWR5Qm91bmQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9kYXRhUHJvcGVydHlCaW5kaW5nID0gZm5CaW5kUHJvcGVydHkocmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHksIGNvbnRleHQpIGFzIE9EYXRhUHJvcGVydHlCaW5kaW5nO1xuXHRcdFx0XHRcdFx0Ly8gQmVjdWFzZSByZWNvbW1lbmRhdGlvbnMgaXMgYSBjb21wbGV4IHByb3BlcnR5IGFuZCBub3QgYSBwcmltaXRpdmUgdHlwZSBoZW5jZSB1c2UgYSByYXcgdHlwZS5cblx0XHRcdFx0XHRcdG9kYXRhUHJvcGVydHlCaW5kaW5nLnNldFR5cGUobmV3IFJhdygpLCBcImFueVwiKTtcblx0XHRcdFx0XHRcdG9kYXRhUHJvcGVydHlCaW5kaW5nLnNldEJpbmRpbmdNb2RlKEJpbmRpbmdNb2RlLk9uZVdheSk7XG5cdFx0XHRcdFx0XHRvZGF0YU1vZGVsLnZpcnR1YWxQcm9wZXJ0eUJpbmRpbmdSZWdpc3RyeS5wdXNoKG9kYXRhUHJvcGVydHlCaW5kaW5nKTtcblx0XHRcdFx0XHRcdG9kYXRhUHJvcGVydHlCaW5kaW5nLmF0dGFjaENoYW5nZSgoZXZlbnQ6IE9EYXRhUHJvcGVydHlCaW5kaW5nJENoYW5nZUV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRcdC8vIHJlZnJlc2ggdGhlIGxvY2FsIGFubm90YXRpb24gYmluZGluZyBvbmNlIHJlY29tbWVuZGF0aW9uIGJpbmRpbmcgaXMgdXBkYXRlZC5cblx0XHRcdFx0XHRcdFx0Y29uc3QgcHJvcGVydHlCaW5kaW5nID0gZXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRDb250ZXh0ID0gZXZlbnQuZ2V0U291cmNlKCkuZ2V0Q29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0XHRcdFx0XHRpZiAoY3VycmVudENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjb250ZXh0UmVjb21tZW5kYXRpb25zID0gcHJvcGVydHlCaW5kaW5nLmdldFZhbHVlKCk7XG5cdFx0XHRcdFx0XHRcdFx0TW9kZWxIZWxwZXIuc2V0UmVjb21tZW5kYXRpb25zT25Mb2NhbEFubm90YXRpb25Nb2RlbChjb250ZXh0UmVjb21tZW5kYXRpb25zLCBjdXJyZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0Ly8gcmV1ZXN0VmFsdWUgd2lsbCBhZGQgdGhlIHJlY29tbWVuZGF0aW9uIHByb3BlcnR5IHRvIHRoZSAkc2VsZWN0XG5cdFx0XHRcdFx0XHQvLyBoZW5jZSB3ZSBkbyBub3QgbmVlZCB0byBhZGQgaXQgdG8gdGhlICRzZWxlY3Qgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGJpbmRpbmcgYXQgdmFyaW91cyBwbGFjZXMgKGZvcm1zLCB0YWJsZSBldGMuKVxuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmcucmVxdWVzdFZhbHVlKCkuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIlJlY29tbWVuZGF0aW9ucyBjb3VsZCBub3QgYmUgcmVzb2x2ZWRcIiwgZXJyb3IpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBiaW5kaW5nIGJlY29tZXMgaW52YWxpZCBhbmQgYSBuZXcgYmluZGluZyBpcyBjcmVhdGVkIHNvIHRoZSByZWNvbW1lbmRhdGlvbiBwcm9wZXJ0eSBiaW5kaW5nIGNhbiBiZSBjcmVhdGVkLlxuXHRcdFx0Ly9cblx0XHRcdC8vIEZvciB0aGlzIHdlIG5lZWQgdG8gb3ZlcnJpZGUgdXBkYXRlUmVxdWlyZWQgc28gdGhhdCB0aGUgYmluZGluZyBpcyB1cGRhdGVkIHVudGlsIGl0IGhhcyBub3QgcmVjZWl2ZWQgYSBjb250ZXh0XG5cdFx0XHQvLyBwb3N0IHRoYXQgd2UgZG8gbm90IG5lZWQgdGhlIGJpbmRpbmcgdG8gYmUgdXBkYXRlZC5cblx0XHRcdC8vIElmIHdlIHJlbW92ZSB0aGUgdXBkYXRlUmVxdWlyZWQgb3ZlcnJpZGUgdGhlbiByZWNvbW1lbmRhdGlvbnMgd29yayBmaW5lIGJ5IGR1cmluZyBzYXZlIG9mIGEgbmV3bHkgY3JlYXRlZCBkb2N1bWVudFxuXHRcdFx0Ly8gd2UgZ2V0IGJpbmRpbmcgcmVsYXRlZCBpc3N1ZXMuXG5cdFx0XHQvL1xuXHRcdFx0Ly8gVXBkYXRpbmcgdGhlIGJpbmRpbmcgdG8gcmVjb21tZW5kYXRpb25zIHdpbGwgYmUgZG9uZSBieSBzZXRQcm9wZXJ0eSBvbiB0aGUgbG9jYWxBbm5vdGF0aW9uTW9kZWxcblx0XHRcdC8vIHdoZW4gdGhlIHJlY29tbWVuZGF0aW9uIHByb3BlcnR5IGlzIGFjdHVhbGx5IHVwZGF0ZWQuXG5cdFx0XHRyZWNvbW1lbmRhdGlvbmJpbmRpbmcudXBkYXRlUmVxdWlyZWQgPSBmdW5jdGlvbiAobW9kZWw6IG9iamVjdCk6IGJvb2xlYW4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRDb250ZXh0KCkgPyBtb2RlbCAmJiBtb2RlbCA9PT0gb2RhdGFNb2RlbCA6IG1vZGVsICYmIHRoaXMuZ2V0TW9kZWwoKSA9PT0gbW9kZWw7XG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIHJlY29tbWVuZGF0aW9uYmluZGluZztcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgYmFzZWQgb24gbWV0YWRhdGEgd2hldGhlciBhIGdpdmVuIGJpbmRpbmcgc2hvdWxkIGRlYWwgd2l0aCByZWNvbW1lbmRhdGlvbnMgb3Igbm90LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIHJlY29tbWVuZGF0aW9uIGlzIGJlaW5nIHJlcXVlc3RlZC5cblx0ICogQHBhcmFtIGJpbmRpbmdQYXRoIEJpbmRpbmcgcGF0aCBmb3Igd2hpY2ggcmVjb21tZW5kYXRpb24gaXMgYmVpbmcgcmVxdWVzdGVkLlxuXHQgKiBAcmV0dXJucyBSZWNvbW1lbmRhdGlvbiBwcm9wZXJ0eSBwYXRoIGZvciB0aGUgZW50aXR5IHJlbGF0ZWQgdG8gdGhlIGNvbnRleHQgYW5kIHdoZXRoZXIgdGhlIGJpbmRpbmdQYXRoIGlzIHJlbGV2YW50IG9yIG5vdCBiYXNlZCBvbiBtZXRhZGF0YS5cblx0ICovXG5cdHZhbGlkYXRlUmVjb21tZW5kYXRpb25CaW5kaW5nUGF0aDogZnVuY3Rpb24gKFxuXHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdGJpbmRpbmdQYXRoOiBzdHJpbmdcblx0KTogeyByZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eTogc3RyaW5nIHwgdW5kZWZpbmVkOyBpc1JlY29tbWVuZGVkUHJvcGVydHk6IGJvb2xlYW4gfSB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGNvbnRleHRNZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dE1ldGFQYXRoKTtcblx0XHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS50YXJnZXRFbnRpdHlUeXBlO1xuXHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5ID0gKHRhcmdldEVudGl0eVR5cGU/LmFubm90YXRpb25zPy5VSSBhcyBFbnRpdHlUeXBlQW5ub3RhdGlvbnNfVUlfV2l0aF9SZWNvbW1lbmRhdGlvbnMpXG5cdFx0XHQ/LlJlY29tbWVuZGF0aW9ucz8ucGF0aDtcblx0XHQvLyBzYW1wbGUgYmluZGluZyAtIFNoaXBwaW5nQ29uZGl0aW9uQCR1aTUuZmUucmVjb21tZW5kYXRpb25zLnBsYWNlaG9sZGVyVmFsdWVcblx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSBiaW5kaW5nUGF0aC5zcGxpdChcIkAkdWk1LmZlLnJlY29tbWVuZGF0aW9uc1wiKVswXTtcblx0XHRjb25zdCBpc1JlY29tbWVuZGVkUHJvcGVydHkgPSB0YXJnZXRFbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuc29tZSgoZW50aXR5UHJvcGVydHkpID0+IHtcblx0XHRcdGlmIChlbnRpdHlQcm9wZXJ0eS5uYW1lID09PSByZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSkge1xuXHRcdFx0XHRyZXR1cm4gKGVudGl0eVByb3BlcnR5Py50YXJnZXRUeXBlIGFzIENvbXBsZXhUeXBlKT8ucHJvcGVydGllcy5zb21lKChwcm9wZXJ0eSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBwcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5Lm5hbWU7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRyZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSxcblx0XHRcdGlzUmVjb21tZW5kZWRQcm9wZXJ0eVxuXHRcdH07XG5cdH0sXG5cdC8qKlxuXHQgKiBVcGRhdGUgcmVjb21tZW5kYXRpb24gY2xpZW50IHNpZGUgaW5zdGFuY2UgYW5ub3RhdGlvbnMuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0UmVjb21tZW5kYXRpb25zIFVwZGF0ZWQgcmVjb21tZW5kYXRpb25zLlxuXHQgKiBAcGFyYW0gY3VycmVudENvbnRleHQgQ29udGV4dCB3aGVyZSByZWNvbW1lbmRhdGlvbiB3YXMgdXBkYXRlZC5cblx0ICovXG5cdHNldFJlY29tbWVuZGF0aW9uc09uTG9jYWxBbm5vdGF0aW9uTW9kZWw6IGZ1bmN0aW9uIChjb250ZXh0UmVjb21tZW5kYXRpb25zOiBSZWNvbW1lbmRhdGlvbnMsIGN1cnJlbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IHZvaWQge1xuXHRcdGlmIChjb250ZXh0UmVjb21tZW5kYXRpb25zKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHJlY29tbWVuZGVkUHJvcGVydHkgaW4gY29udGV4dFJlY29tbWVuZGF0aW9ucykge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eVJlY29tbWVuZGF0aW9ucyA9IGNvbnRleHRSZWNvbW1lbmRhdGlvbnNbcmVjb21tZW5kZWRQcm9wZXJ0eV07XG5cdFx0XHRcdGNvbnN0IGxvY2FsTW9kZWxQYXRoID0gcmVjb21tZW5kZWRQcm9wZXJ0eTtcblx0XHRcdFx0Y29uc3QgbG9jYWxBbm5vdGF0aW9uTW9kZWwgPSBjdXJyZW50Q29udGV4dC5nZXRNb2RlbCgpLmdldExvY2FsQW5ub3RhdGlvbk1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IHR5cGVBaGVhZFZhbHVlcyA9IFtdO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHByb3BlcnR5UmVjb21tZW5kYXRpb24gb2YgcHJvcGVydHlSZWNvbW1lbmRhdGlvbnMpIHtcblx0XHRcdFx0XHRpZiAocHJvcGVydHlSZWNvbW1lbmRhdGlvbi5SZWNvbW1lbmRlZEZpZWxkSXNTdWdnZXN0aW9uKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBwbGFjZWhvbGRlclZhbHVlQW5ub3RhdGlvblBhdGggPSBjdXJyZW50Q29udGV4dC5nZXRQYXRoKFxuXHRcdFx0XHRcdFx0XHRsb2NhbE1vZGVsUGF0aCArIFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zLnBsYWNlaG9sZGVyVmFsdWVcIlxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyRGVzY3JpcHRpb25Bbm5vdGF0aW9uUGF0aCA9IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoXG5cdFx0XHRcdFx0XHRcdGxvY2FsTW9kZWxQYXRoICsgXCJAJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMucGxhY2Vob2xkZXJEZXNjcmlwdGlvblwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0bG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyVmFsdWVBbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlSZWNvbW1lbmRhdGlvbi5SZWNvbW1lbmRlZEZpZWxkVmFsdWUsXG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRmYWxzZVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRwbGFjZWhvbGRlckRlc2NyaXB0aW9uQW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5UmVjb21tZW5kYXRpb24uUmVjb21tZW5kZWRGaWVsZERlc2NyaXB0aW9uLFxuXHRcdFx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHQvLyBzZXQgcGxhY2Vob2xkZXIgZGVzY3JpcHRpb24gYW5kIHZhbHVlc1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvL2xvY2FsQW5ub3RhdGlvbk1vZGVsLlxuXHRcdFx0XHRcdC8vIHB1c2ggdG9wIDMgcmVjb21tZW5kYXRpb24gdmFsdWVzXG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5UmVjb21tZW5kYXRpb24uUmVjb21tZW5kZWRGaWVsZFZhbHVlKSB7XG5cdFx0XHRcdFx0XHR0eXBlQWhlYWRWYWx1ZXMucHVzaChwcm9wZXJ0eVJlY29tbWVuZGF0aW9uLlJlY29tbWVuZGVkRmllbGRWYWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0LmdldFBhdGgobG9jYWxNb2RlbFBhdGggKyBcIkAkdWk1LmZlLnJlY29tbWVuZGF0aW9ucy50eXBlQWhlYWRWYWx1ZXNcIiksXG5cdFx0XHRcdFx0dHlwZUFoZWFkVmFsdWVzLFxuXHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdGZhbHNlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG50eXBlIFJlY29tbWVuZGF0aW9ucyA9IFJlY29yZDxzdHJpbmcsIFJlY29tbWVuZGF0aW9uRGV0YWlsc1tdPjtcbnR5cGUgUmVjb21tZW5kYXRpb25EZXRhaWxzID0ge1xuXHRSZWNvbW1lbmRlZEZpZWxkVmFsdWU6IHN0cmluZztcblx0UmVjb21tZW5kZWRGaWVsZElzU3VnZ2VzdGlvbjogYm9vbGVhbjtcblx0UmVjb21tZW5kZWRGaWVsZERlc2NyaXB0aW9uOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBJbnRlcm5hbE1vZGVsQ29udGV4dCA9IHsgZ2V0TW9kZWwoKTogSlNPTk1vZGVsIH0gJiBCYXNlQ29udGV4dCAmIHtcblx0XHRzZXRQcm9wZXJ0eShzUGF0aDogc3RyaW5nLCB2VmFsdWU6IHVua25vd24pOiB2b2lkO1xuXHR9O1xuXG5leHBvcnQgZGVmYXVsdCBNb2RlbEhlbHBlcjtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7OztFQTBDQSxNQUFNQSxXQUFXLEdBQUc7SUFDbkI7SUFDQTtJQUNBO0lBQ0FDLHlCQUF5QixFQUFFLEtBQUs7SUFDaEM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLHdCQUF3QixFQUFFLFVBQVVDLFNBQXlCLEVBQVc7TUFDdkUsTUFBTUMsZUFBZSxHQUFHRCxTQUFTLENBQUNFLFNBQVMsQ0FBQyxHQUFHLENBQUM7TUFDaEQsS0FBSyxNQUFNQyxhQUFhLElBQUlGLGVBQWUsRUFBRTtRQUM1QyxJQUNDQSxlQUFlLENBQUNFLGFBQWEsQ0FBQyxDQUFDQyxLQUFLLEtBQUssV0FBVyxJQUNwREosU0FBUyxDQUFDRSxTQUFTLENBQUUsSUFBR0MsYUFBYyx5REFBd0QsQ0FBQyxFQUM5RjtVQUNELE9BQU8sSUFBSTtRQUNaO01BQ0Q7TUFDQSxPQUFPLEtBQUs7SUFDYixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0UsZ0JBQWdCLEVBQUUsVUFBVUwsU0FBeUIsRUFBRU0sSUFBWSxFQUFXO01BQzdFLE1BQU1DLFdBQVcsR0FBR1AsU0FBUyxDQUFDUSxjQUFjLENBQUNGLElBQUksQ0FBQztNQUNsRCxNQUFNRyxVQUFVLEdBQUdDLDJCQUEyQixDQUF3QkgsV0FBVyxDQUFDO01BQ2xGLE9BQU8sSUFBSSxDQUFDSSwwQkFBMEIsQ0FBQ0YsVUFBVSxDQUFDO0lBQ25ELENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0UsMEJBQTBCLEVBQUUsVUFBVUMsbUJBQWlELEVBQVc7TUFB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
815
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNb2RlbEhlbHBlciIsImRpc2FibGVDb2xsYWJvcmF0aW9uRHJhZnQiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJtZXRhTW9kZWwiLCJlbnRpdHlDb250YWluZXIiLCJnZXRPYmplY3QiLCJlbnRpdHlTZXROYW1lIiwiJGtpbmQiLCJpc0RyYWZ0U3VwcG9ydGVkIiwicGF0aCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJvYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiX2RhdGFNb2RlbE9iamVjdFBhdGgkIiwiX2RhdGFNb2RlbE9iamVjdFBhdGgkMiIsIl9kYXRhTW9kZWxPYmplY3RQYXRoJDMiLCJfZGF0YU1vZGVsT2JqZWN0UGF0aCQ0IiwiX2RhdGFNb2RlbE9iamVjdFBhdGgkNSIsIl9kYXRhTW9kZWxPYmplY3RQYXRoJDYiLCJfZGF0YU1vZGVsT2JqZWN0UGF0aCQ3IiwiY3VycmVudEVudGl0eVNldCIsInRhcmdldEVudGl0eVNldCIsImJJc0RyYWZ0Um9vdCIsImlzRHJhZnRSb290IiwiYklzRHJhZnROb2RlIiwiaXNEcmFmdE5vZGUiLCJiSXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50IiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJ0YXJnZXRPYmplY3QiLCJjb250YWluc1RhcmdldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJEcmFmdE5vZGUiLCJpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCIsIm1ldGFPYmplY3QiLCJ0ZW1wbGF0ZUludGVyZmFjZSIsIl90ZW1wbGF0ZUludGVyZmFjZSRjbyIsIm9NZXRhTW9kZWwiLCJjb250ZXh0IiwiZ2V0TW9kZWwiLCJvRW50aXR5Q29udGFpbmVyIiwic0VudGl0eVNldCIsImdldERyYWZ0Um9vdFBhdGgiLCJvQ29udGV4dCIsImdldE1ldGFNb2RlbCIsImdldFJvb3RQYXRoIiwic1BhdGgiLCJtb2RlbCIsIl9SZWdFeHAkZXhlYyIsImZpcnN0SXRlcmF0aW9uIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwic0l0ZXJhdGlvblBhdGgiLCJSZWdFeHAiLCJleGVjIiwiX21EYXRhTW9kZWwkdGFyZ2V0RW50IiwiX21EYXRhTW9kZWwkdGFyZ2V0RW50MiIsInNFbnRpdHlQYXRoIiwiZ2V0TWV0YVBhdGgiLCJtRGF0YU1vZGVsIiwiTWV0YU1vZGVsQ29udmVydGVyIiwiZ2V0Q29udGV4dCIsImdldFBhdGgiLCJnZXRTdGlja3lSb290UGF0aCIsIl9SZWdFeHAkZXhlYzIiLCJfbURhdGFNb2RlbCR0YXJnZXRFbnQzIiwiX21EYXRhTW9kZWwkdGFyZ2V0RW50NCIsIl9tRGF0YU1vZGVsJHRhcmdldEVudDUiLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsImdldFRhcmdldEVudGl0eVNldCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0RW50aXR5U2V0UGF0aCIsIm9kYXRhTWV0YU1vZGVsIiwiZW50aXR5U2V0UGF0aCIsInNwbGl0IiwiZmlsdGVyIiwiZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmciLCJqb2luIiwicGF0aFBhcnRzIiwiaW5pdGlhbFBhdGhPYmplY3QiLCJncm93aW5nUGF0aCIsInBlbmRpbmdOYXZQcm9wQmluZGluZyIsInBhdGhPYmplY3QiLCJyZWR1Y2UiLCJwYXRoVW5kZXJDb25zdHJ1Y3Rpb24iLCJwYXRoUGFydCIsImlkeCIsImRlbGltaXRlciIsInRlbXBQYXRoIiwibmF2UHJvcEJpbmRpbmdzIiwibmF2UHJvcEJpbmRpbmdUb0NoZWNrIiwiT2JqZWN0Iiwia2V5cyIsImhhc093blByb3BlcnR5IiwicmVwbGFjZSIsImdldEFjdGlvblBhcmFtZXRlckl0ZW1zTW9kZWxQYXRoIiwib1BhcmFtZXRlciIsIiROYW1lIiwic1BhdGhQYXJ0IiwiZW5oYW5jZUludGVybmFsSlNPTk1vZGVsIiwib0ludGVybmFsTW9kZWwiLCJmbkJpbmRDb250ZXh0IiwiYmluZENvbnRleHQiLCJtUGFyYW1ldGVycyIsIm9FdmVudHMiLCJjb250ZXh0QmluZGluZyIsImFwcGx5IiwiZm5HZXRCb3VuZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJvQm91bmRDb250ZXh0Iiwic2V0UHJvcGVydHkiLCJwcm9wZXJ0eVBhdGgiLCJ2YWx1ZSIsInByb3BlcnR5UGF0aFNwbGl0IiwiaSIsImVuaGFuY2VVaUpTT05Nb2RlbCIsInVpTW9kZWwiLCJsaWJyYXJ5IiwiZm5TZXRQcm9wZXJ0eSIsImFzeW5jVXBkYXRlIiwiRWRpdE1vZGUiLCJFZGl0YWJsZSIsIkRpc3BsYXkiLCJlbmhhbmNlVmlld0pTT05Nb2RlbCIsInZpZXdNb2RlbCIsImZuR2V0T2JqZWN0IiwiX2dldE9iamVjdCIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImFGaWx0ZXJGdW5jdGlvbnMiLCJpbmRleE9mIiwiZ2V0TWV0YVBhdGhGb3JDb250ZXh0Iiwib01vZGVsIiwiZ2V0Um9vdEVudGl0eVNldFBhdGgiLCJjb250ZXh0UGF0aCIsInJvb3RFbnRpdHlTZXRQYXRoIiwiYVBhdGhzIiwiZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nIiwib1ZpZXciLCJ2TGlzdEJpbmRpbmciLCJzTWV0YVBhdGgiLCJzdGFydHNXaXRoIiwib0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJzUm9vdENvbnRleHRQYXRoIiwib0JpbmRpbmciLCJvUm9vdEJpbmRpbmciLCJnZXRSb290QmluZGluZyIsInNSb290QmluZGluZ1BhdGgiLCJzUmVsYXRpdmVQYXRoIiwiZW50aXR5U2V0IiwiZ2V0RHJhZnRSb290IiwiZ2V0RHJhZnROb2RlIiwiaXNTdGlja3kiLCJnZXRTdGlja3lTZXNzaW9uIiwiaXNVcGRhdGVIaWRkZW4iLCJlbnRpdHlUeXBlIiwiaXNFbnRpdHlTZXQiLCJfZW50aXR5U2V0JGFubm90YXRpb24iLCJfZW50aXR5VHlwZSRhbm5vdGF0aW8iLCJVSSIsIlVwZGF0ZUhpZGRlbiIsIl9lbnRpdHlTZXQkYW5ub3RhdGlvbjIiLCJfZW50aXR5U2V0JGFubm90YXRpb24zIiwiX2VudGl0eVNldCRhbm5vdGF0aW9uNCIsImdldERlbGV0ZUhpZGRlbiIsIl9lbnRpdHlTZXQkYW5ub3RhdGlvbjUiLCJfZW50aXR5VHlwZSRhbm5vdGF0aW8yIiwiRGVsZXRlSGlkZGVuIiwiZ2V0QWJzb2x1dGVQYXRoRnJvbUxpc3RCaW5kaW5nIiwibGlzdEJpbmRpbmciLCJtZXRhbW9kZWwiLCJtZXRhUGF0aCIsInJvb3RCaW5kaW5nIiwicm9vdEJpbmRpbmdQYXRoIiwicmVsYXRpdmVQYXRoIiwiZW5oYW5jZU9EYXRhTW9kZWwiLCJvZGF0YU1vZGVsIiwidmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5IiwiQXJyYXkiLCJmbk1lc3NhZ2UiLCJzZXRNZXNzYWdlcyIsImxvY2FsQW5ub3RhdGlvbk1vZGVsIiwiSlNPTk1vZGVsIiwic2V0RGVmYXVsdEJpbmRpbmdNb2RlIiwiQmluZGluZ01vZGUiLCJPbmVXYXkiLCJiYXNlU2V0UHJvcGVydHkiLCJiYXNlR2V0UHJvcGVydHkiLCJnZXRQcm9wZXJ0eSIsInByb3BlcnR5TmFtZSIsImFubm90YXRpb25UeXBlIiwiaXNUcmFuc2llbnQiLCJjb250ZXh0T2JqZWN0IiwiX21ldGFQYXRoJGdldE1ldGFQYXRoIiwiTWV0YVBhdGgiLCJjb252ZXJ0VHlwZXMiLCJleHRlcm5hbElkUHJvcGVydHkiLCJnZXRNZXRhUGF0aEZvclBhdGgiLCJnZXRUYXJnZXQiLCJFeHRlcm5hbElEIiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJmdWxsUGF0aCIsIl9yZWZyZXNoTG9jYWxNb2RlbCIsInJlZnJlc2giLCJfbWV0YVBhdGgkZ2V0TWV0YVBhdGgyIiwiX21ldGFQYXRoJGdldE1ldGFQYXRoMyIsImV4dGVybmFsSWRQcm9wUGF0aCIsInByb3BlcnRpZXNUb1JlcXVlc3QiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsInRleHRQcm9wZXJ0eSIsIlRleHQiLCJ0ZXh0UHJvcFBhdGgiLCJpbmNsdWRlcyIsInB1c2giLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJ0aGVuIiwiY2F0Y2giLCJlcnIiLCJMb2ciLCJlcnJvciIsInBhdGhGcm9tUm9vdCIsImNsZWFyQW5ub3RhdGlvblR5cGUiLCJhbm5vdGF0aW9uVHlwZXMiLCJkYXRhU2V0IiwiaXNDb250ZXh0IiwiaXNBIiwiZW5kc1dpdGgiLCJfbG9jYWxBbm5vdGF0aW9uTW9kZWwiLCJnZXRMb2NhbEFubm90YXRpb25Nb2RlbCIsIm1lc3NhZ2VzIiwiY2xlYW5lZERhdGEiLCJnZXREYXRhIiwic2V0RGF0YSIsIm1lc3NhZ2VUYXJnZXQiLCJnZXRUeXBlIiwiZ2V0TWVzc2FnZSIsImZuQmluZFByb3BlcnR5IiwiYmluZFByb3BlcnR5IiwiYmluZCIsInBhcmFtZXRlcnMiLCJyZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZyIsInNldFVwUmVjb21tZW5kYXRpb25Mb2NhbE1vZGVsQmluZGluZyIsImludGVybmFsSWRCaW5kaW5nIiwiZXh0ZXJuYWxJZEJpbmRpbmciLCJhdHRhY2hDaGFuZ2UiLCJyZXF1ZXN0VmFsdWUiLCJwcm9wQmluZGluZyIsInVwZGF0ZVJlcXVpcmVkIiwiX2dob3N0Q29udHJvbCRnZXRCaW5kIiwiZXhwcmVzc2lvbiIsImdldFZpcnR1YWxCaW5kaW5nRXhwcmVzc2lvbiIsImdob3N0Q29udHJvbCIsIkFueSIsImFueSIsImNvbXBpbGVFeHByZXNzaW9uIiwiYmluZEJhY2tQcm9wZXJ0eSIsImZuRGVzdHJveVByb3BlcnR5QmluZGluZyIsImRlc3Ryb3kiLCJmblNldENvbnRleHQiLCJzZXRDb250ZXh0IiwibmV3Q29udGV4dCIsInNldEJpbmRpbmdDb250ZXh0Iiwic2V0TW9kZWwiLCJnaG9zdEJpbmRpbmciLCJnZXRCaW5kaW5nSW5mbyIsImJpbmRpbmciLCJmbkNoZWNrVXBkYXRlIiwiY2hlY2tVcGRhdGUiLCJmbkRlc3Ryb3kiLCJ2cEJpbmRpbmciLCJmZXRjaFRleHRGcm9tTWV0YU1vZGVsIiwiY29udmVydGVyQ29udGV4dCIsInRleHQiLCJtZXRhTW9kZWxQYXRoIiwiX2NvbnZlcnRlckNvbnRleHQkZ2V0IiwiZ2V0RW50aXR5VHlwZUFubm90YXRpb24iLCJhbm5vdGF0aW9uIiwidG9TdHJpbmciLCJlIiwiaW5mbyIsImdldE1lc3NhZ2VzUGF0aCIsIl9vYmplY3RQYXRoJHRhcmdldEVudCIsInRhcmdldEVudGl0eVR5cGUiLCJNZXNzYWdlcyIsInJlY29tbWVuZGF0aW9uYmluZGluZyIsInNldENvbnRleHRPblJlY29tbWVuZGF0aW9uQmluZGluZyIsIm9kYXRhUHJvcGVydHlCaW5kaW5nIiwicmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkiLCJpc1JlY29tbWVuZGVkUHJvcGVydHkiLCJ2YWxpZGF0ZVJlY29tbWVuZGF0aW9uQmluZGluZ1BhdGgiLCJhbHJlYWR5Qm91bmQiLCJzb21lIiwiZXhpc3RpbmdCaW5kaW5nIiwiX2V4aXN0aW5nQmluZGluZyRnZXRDIiwic2V0VHlwZSIsIlJhdyIsInNldEJpbmRpbmdNb2RlIiwiZXZlbnQiLCJwcm9wZXJ0eUJpbmRpbmciLCJnZXRTb3VyY2UiLCJjdXJyZW50Q29udGV4dCIsImNvbnRleHRSZWNvbW1lbmRhdGlvbnMiLCJnZXRWYWx1ZSIsInNldFJlY29tbWVuZGF0aW9uc09uTG9jYWxBbm5vdGF0aW9uTW9kZWwiLCJiaW5kaW5nUGF0aCIsIl90YXJnZXRFbnRpdHlUeXBlJGFubiIsIl90YXJnZXRFbnRpdHlUeXBlJGFubjIiLCJfdGFyZ2V0RW50aXR5VHlwZSRhbm4zIiwiY29udGV4dE1ldGFQYXRoIiwiUmVjb21tZW5kYXRpb25zIiwiZW50aXR5UHJvcGVydGllcyIsImVudGl0eVByb3BlcnR5IiwibmFtZSIsIl9lbnRpdHlQcm9wZXJ0eSR0YXJnZSIsInRhcmdldFR5cGUiLCJwcm9wZXJ0aWVzIiwicHJvcGVydHkiLCJyZWNvbW1lbmRlZFByb3BlcnR5IiwicHJvcGVydHlSZWNvbW1lbmRhdGlvbnMiLCJsb2NhbE1vZGVsUGF0aCIsInR5cGVBaGVhZFZhbHVlcyIsInByb3BlcnR5UmVjb21tZW5kYXRpb24iLCJSZWNvbW1lbmRlZEZpZWxkSXNTdWdnZXN0aW9uIiwicGxhY2Vob2xkZXJWYWx1ZUFubm90YXRpb25QYXRoIiwicGxhY2Vob2xkZXJEZXNjcmlwdGlvbkFubm90YXRpb25QYXRoIiwiUmVjb21tZW5kZWRGaWVsZFZhbHVlIiwiUmVjb21tZW5kZWRGaWVsZERlc2NyaXB0aW9uIiwiZ2V0QWx0ZXJuYXRlS2V5cyIsImFsdGVybmF0ZUtleXMiLCJfZmV0Y2hLZXlzIiwiZW50aXR5VHlwZU9yU2V0IiwiX2VudGl0eVR5cGVPclNldCRhbm5vIiwiX2VudGl0eVR5cGVPclNldCRhbm5vMiIsIl9lbnRpdHlUeXBlT3JTZXQkYW5ubzMiLCJDb3JlIiwiQWx0ZXJuYXRlS2V5cyIsImZvckVhY2giLCJhbHRlcm5hdGVLZXkiLCJLZXkiLCJrZXkiLCJOYW1lIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJNb2RlbEhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlcnMgdG8gYmUgdXNlZCBhdCBydW50aW1lIHRvIHJldHJpZXZlIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gdGhlIG1vZGVsICovXG5pbXBvcnQgdHlwZSB7IENvbXBsZXhUeXBlLCBFbnRpdHlTZXQsIEVudGl0eVR5cGUsIFByb3BlcnR5LCBTaW5nbGV0b24gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRHJhZnROb2RlLCBEcmFmdFJvb3QgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBBbHRlcm5hdGVLZXksIFByb3BlcnR5UmVmIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db3JlXCI7XG5pbXBvcnQgdHlwZSB7IFN0aWNreVNlc3Npb25TdXBwb3J0ZWQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1Nlc3Npb25cIjtcbmltcG9ydCB0eXBlIHsgRGVsZXRlSGlkZGVuLCBVcGRhdGVIaWRkZW4gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVR5cGVBbm5vdGF0aW9uc19VSSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlfRWRtXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IEFueSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbHMvQW55XCI7XG5pbXBvcnQgdHlwZSBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsQWN0aW9uUGFyYW1ldGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBQYWdlQ29udGV4dFBhdGhUYXJnZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IE1ldGFQYXRoIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01ldGFQYXRoXCI7XG5pbXBvcnQgeyBpc0VudGl0eVNldCwgaXNOYXZpZ2F0aW9uUHJvcGVydHksIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgQmluZGluZ01vZGUgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nTW9kZVwiO1xuaW1wb3J0IHR5cGUgQmFzZUNvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9NZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIFByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL1Byb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgUmF3IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdHlwZS9SYXdcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBDb250ZXh0LCBkZWZhdWx0IGFzIE9EYXRhVjRDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT0RhdGFMaXN0QmluZGluZyB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFQcm9wZXJ0eUJpbmRpbmckQ2hhbmdlRXZlbnQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhUHJvcGVydHlCaW5kaW5nXCI7XG5cbi8vIFRPRE86IFJpZ2h0IG5vdyByZWNvbW1lbmRhdGlvbnMgaXMgbm90IHBhcnQgb2YgdGhlIFVJIHZvY2FidWxhcnkuXG4vLyBoZW5jZSB3ZSBhcmUgYWRkaW5nIGl0IHRvIHRoZSB0eXBlLlxuLy8gb25jZSB0aGlzIGJlY29tZXMgcGFydCBvZiB0aGUgVUkgdm9jYWJ1bGFyeSB0aGVuIHdlIGNhbiByZW1vdmUgdGhpcy5cbmV4cG9ydCB0eXBlIEVudGl0eVR5cGVBbm5vdGF0aW9uc19VSV9XaXRoX1JlY29tbWVuZGF0aW9ucyA9IEVudGl0eVR5cGVBbm5vdGF0aW9uc19VSSAmIHtcblx0UmVjb21tZW5kYXRpb25zPzoge1xuXHRcdHBhdGg6IHN0cmluZztcblx0fTtcbn07XG5cbmNvbnN0IE1vZGVsSGVscGVyID0ge1xuXHQvLyBnbG9iYWwgc3dpdGNoIHRvIGRpc2FibGUgdGhlIGNvbGxhYm9yYXRpb24gZHJhZnQgYnkgYSBwcml2YXRlIG1hbmlmZXN0IGZsYWdcblx0Ly8gdGhpcyBhbGxvd3MgY3VzdG9tZXJzIHRvIGRpc2FibGUgdGhlIGNvbGxhYm9yYXRpb24gZHJhZnQgaW4gY2FzZSB3ZSBydW4gaW50byBpc3N1ZXMgd2l0aCB0aGUgZmlyc3QgZGVsaXZlcnlcblx0Ly8gdGhpcyB3aWxsIGJlIHJlbW92ZWQgd2l0aCB0aGUgbmV4dCBTLzQgcmVsZWFzZVxuXHRkaXNhYmxlQ29sbGFib3JhdGlvbkRyYWZ0OiBmYWxzZSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIHByb2dyYW1taW5nIG1vZGVsIGlzIHN0aWNreS5cblx0ICogQHBhcmFtIG1ldGFNb2RlbCBPRGF0YU1vZGVsTWV0YU1vZGVsIHRvIGNoZWNrIGZvciBzdGlja3kgZW5hYmxlZCBlbnRpdHlcblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHN0aWNreSwgZWxzZSBmYWxzZVxuXHQgKi9cblx0aXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkOiBmdW5jdGlvbiAobWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGVudGl0eUNvbnRhaW5lciA9IG1ldGFNb2RlbC5nZXRPYmplY3QoXCIvXCIpO1xuXHRcdGZvciAoY29uc3QgZW50aXR5U2V0TmFtZSBpbiBlbnRpdHlDb250YWluZXIpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0ZW50aXR5Q29udGFpbmVyW2VudGl0eVNldE5hbWVdLiRraW5kID09PSBcIkVudGl0eVNldFwiICYmXG5cdFx0XHRcdG1ldGFNb2RlbC5nZXRPYmplY3QoYC8ke2VudGl0eVNldE5hbWV9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZGApXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgcHJvZ3JhbW1pbmcgbW9kZWwgaXMgZHJhZnQuXG5cdCAqIEBwYXJhbSBtZXRhTW9kZWwgT0RhdGFNb2RlbE1ldGFNb2RlbCBvZiB0aGUgY29udGV4dCBmb3Igd2hpY2ggZHJhZnQgc3VwcG9ydCBzaGFsbCBiZSBjaGVja2VkXG5cdCAqIEBwYXJhbSBwYXRoIFBhdGggZm9yIHdoaWNoIGRyYWZ0IHN1cHBvcnQgc2hhbGwgYmUgY2hlY2tlZFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgZHJhZnQsIGVsc2UgZmFsc2Vcblx0ICovXG5cdGlzRHJhZnRTdXBwb3J0ZWQ6IGZ1bmN0aW9uIChtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChwYXRoKTtcblx0XHRjb25zdCBvYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzPFBhZ2VDb250ZXh0UGF0aFRhcmdldD4obWV0YUNvbnRleHQpO1xuXHRcdHJldHVybiB0aGlzLmlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkKG9iamVjdFBhdGgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgZHJhZnQgaXMgc3VwcG9ydGVkIGZvciB0aGUgZGF0YSBtb2RlbCBvYmplY3QgcGF0aC5cblx0ICogQHBhcmFtIGRhdGFNb2RlbE9iamVjdFBhdGhcblx0ICogQHJldHVybnMgYHRydWVgIGlmIGl0IGlzIHN1cHBvcnRlZFxuXHQgKi9cblx0aXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQ6IGZ1bmN0aW9uIChkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPHVua25vd24+KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldDtcblx0XHRjb25zdCBiSXNEcmFmdFJvb3QgPSBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChjdXJyZW50RW50aXR5U2V0KTtcblx0XHRjb25zdCBiSXNEcmFmdE5vZGUgPSBNb2RlbEhlbHBlci5pc0RyYWZ0Tm9kZShjdXJyZW50RW50aXR5U2V0KTtcblx0XHRjb25zdCBiSXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50ID1cblx0XHRcdGlzTmF2aWdhdGlvblByb3BlcnR5KGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0KSAmJlxuXHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q/LmNvbnRhaW5zVGFyZ2V0ICYmXG5cdFx0XHQoKGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0KT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290IHx8XG5cdFx0XHRcdChkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldCk/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Tm9kZSlcblx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdDogZmFsc2U7XG5cblx0XHRyZXR1cm4gYklzRHJhZnRSb290IHx8IGJJc0RyYWZ0Tm9kZSB8fCAoIWN1cnJlbnRFbnRpdHlTZXQgJiYgYklzRHJhZnRQYXJlbnRFbnRpdHlGb3JDb250YWlubWVudCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIHNlcnZpY2UsIHN1cHBvcnRzIGNvbGxhYm9yYXRpb24gZHJhZnQuXG5cdCAqIEBwYXJhbSBtZXRhT2JqZWN0IE1ldGFPYmplY3QgdG8gYmUgdXNlZCBmb3IgZGV0ZXJtaW5hdGlvblxuXHQgKiBAcGFyYW0gdGVtcGxhdGVJbnRlcmZhY2UgQVBJIHByb3ZpZGVkIGJ5IFVJNSB0ZW1wbGF0aW5nIGlmIHVzZWRcblx0ICogQHBhcmFtIHRlbXBsYXRlSW50ZXJmYWNlLmNvbnRleHQgQ29udGV4dCBvZiB0aGUgdGVtcGxhdGVcblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2aWNlIHN1cHBvcnRzIGNvbGxhYm9yYXRpb24gZHJhZnQsIGVsc2UgZmFsc2Vcblx0ICovXG5cdGlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkOiBmdW5jdGlvbiAobWV0YU9iamVjdDogdW5rbm93biwgdGVtcGxhdGVJbnRlcmZhY2U/OiB7IGNvbnRleHQ6IENvbnRleHQgfSk6IGJvb2xlYW4ge1xuXHRcdGlmICghTW9kZWxIZWxwZXIuZGlzYWJsZUNvbGxhYm9yYXRpb25EcmFmdCkge1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9ICh0ZW1wbGF0ZUludGVyZmFjZT8uY29udGV4dD8uZ2V0TW9kZWwoKSB8fCBtZXRhT2JqZWN0KSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdGNvbnN0IG9FbnRpdHlDb250YWluZXIgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdFx0XHRmb3IgKGNvbnN0IHNFbnRpdHlTZXQgaW4gb0VudGl0eUNvbnRhaW5lcikge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b0VudGl0eUNvbnRhaW5lcltzRW50aXR5U2V0XS4ka2luZCA9PT0gXCJFbnRpdHlTZXRcIiAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtzRW50aXR5U2V0fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L1NoYXJlQWN0aW9uYClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZ2V0IHRoZSBwYXRoIG9mIHRoZSBEcmFmdFJvb3QgcGF0aCBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBPZGF0YU1vZGVsIGNvbnRleHRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgZHJhZnRSb290IGVudGl0eSwgb3IgdW5kZWZpbmVkIGlmIG5vIGRyYWZ0Um9vdCBpcyBmb3VuZFxuXHQgKi9cblx0Z2V0RHJhZnRSb290UGF0aDogZnVuY3Rpb24gKG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBnZXRSb290UGF0aCA9IGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCwgZmlyc3RJdGVyYXRpb24gPSB0cnVlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRcdGNvbnN0IHNJdGVyYXRpb25QYXRoID0gZmlyc3RJdGVyYXRpb24gPyBzUGF0aCA6IG5ldyBSZWdFeHAoLy4qKD89XFwvKS8pLmV4ZWMoc1BhdGgpPy5bMF07IC8vICpSZWdleCB0byBnZXQgdGhlIGFuY2VzdG9yXG5cdFx0XHRpZiAoc0l0ZXJhdGlvblBhdGggJiYgc0l0ZXJhdGlvblBhdGggIT09IFwiL1wiKSB7XG5cdFx0XHRcdGNvbnN0IHNFbnRpdHlQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzSXRlcmF0aW9uUGF0aCk7XG5cdFx0XHRcdGNvbnN0IG1EYXRhTW9kZWwgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzRW50aXR5UGF0aCkpO1xuXHRcdFx0XHRpZiAoKG1EYXRhTW9kZWwudGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldCk/LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHNJdGVyYXRpb25QYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBnZXRSb290UGF0aChzSXRlcmF0aW9uUGF0aCwgbW9kZWwsIGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fTtcblx0XHRyZXR1cm4gZ2V0Um9vdFBhdGgob0NvbnRleHQuZ2V0UGF0aCgpLCBvQ29udGV4dC5nZXRNb2RlbCgpKTtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB0aGUgcGF0aCBvZiB0aGUgU3RpY2t5Um9vdCBwYXRoIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQgY29udGV4dC5cblx0ICogQHBhcmFtIG9Db250ZXh0IE9kYXRhTW9kZWwgY29udGV4dFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBTdGlja3lSb290IGVudGl0eSwgb3IgdW5kZWZpbmVkIGlmIG5vIFN0aWNreVJvb3QgaXMgZm91bmRcblx0ICovXG5cdGdldFN0aWNreVJvb3RQYXRoOiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGdldFJvb3RQYXRoID0gZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBmaXJzdEl0ZXJhdGlvbiA9IHRydWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdFx0Y29uc3Qgc0l0ZXJhdGlvblBhdGggPSBmaXJzdEl0ZXJhdGlvbiA/IHNQYXRoIDogbmV3IFJlZ0V4cCgvLiooPz1cXC8pLykuZXhlYyhzUGF0aCk/LlswXTsgLy8gKlJlZ2V4IHRvIGdldCB0aGUgYW5jZXN0b3Jcblx0XHRcdGlmIChzSXRlcmF0aW9uUGF0aCAmJiBzSXRlcmF0aW9uUGF0aCAhPT0gXCIvXCIpIHtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNJdGVyYXRpb25QYXRoKTtcblx0XHRcdFx0Y29uc3QgbURhdGFNb2RlbCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob01ldGFNb2RlbC5nZXRDb250ZXh0KHNFbnRpdHlQYXRoKSk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRtRGF0YU1vZGVsLnN0YXJ0aW5nRW50aXR5U2V0ID09PSBtRGF0YU1vZGVsLnRhcmdldEVudGl0eVNldCAmJlxuXHRcdFx0XHRcdChtRGF0YU1vZGVsLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQpPy5hbm5vdGF0aW9ucz8uU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gc0l0ZXJhdGlvblBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGdldFJvb3RQYXRoKHNJdGVyYXRpb25QYXRoLCBtb2RlbCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9O1xuXHRcdHJldHVybiBnZXRSb290UGF0aChvQ29udGV4dC5nZXRQYXRoKCksIG9Db250ZXh0LmdldE1vZGVsKCkpO1xuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgd2l0aCBuYXZpZ2F0aW9uIHByb3BlcnR5IGJpbmRpbmcuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgd2lsbCBiZSBkZXRlcm1pbmVkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHRhcmdldCBlbnRpdHkgc2V0XG5cdCAqL1xuXHRnZXRUYXJnZXRFbnRpdHlTZXQ6IGZ1bmN0aW9uIChvQ29udGV4dDogQmFzZUNvbnRleHQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGlmIChcblx0XHRcdG9Db250ZXh0LmdldE9iamVjdChcIiRraW5kXCIpID09PSBcIkVudGl0eVNldFwiIHx8XG5cdFx0XHRvQ29udGV4dC5nZXRPYmplY3QoXCIka2luZFwiKSA9PT0gXCJBY3Rpb25cIiB8fFxuXHRcdFx0b0NvbnRleHQuZ2V0T2JqZWN0KFwiMC8ka2luZFwiKSA9PT0gXCJBY3Rpb25cIlxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHNQYXRoO1xuXHRcdH1cblx0XHRjb25zdCBzRW50aXR5U2V0UGF0aCA9IE1vZGVsSGVscGVyLmdldEVudGl0eVNldFBhdGgoc1BhdGgpO1xuXHRcdHJldHVybiBgLyR7b0NvbnRleHQuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoKX1gO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGNvbXBsZXRlIHBhdGggdG8gdGhlIGVudGl0eSBzZXQgdmlhIHVzaW5nIG5hdmlnYXRpb24gcHJvcGVydHkgYmluZGluZy4gTm90ZTogVG8gYmUgdXNlZCBvbmx5IGFmdGVyIHRoZSBtZXRhbW9kZWwgaGFzIGxvYWRlZC5cblx0ICogQHBhcmFtIHBhdGggUGF0aCBmb3Igd2hpY2ggY29tcGxldGUgZW50aXR5U2V0IHBhdGggbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCBmcm9tIGVudGl0eVR5cGUgcGF0aFxuXHQgKiBAcGFyYW0gb2RhdGFNZXRhTW9kZWwgTWV0YW1vZGVsIHRvIGJlIHVzZWQuKE9wdGlvbmFsIGluIG5vcm1hbCBzY2VuYXJpb3MsIGJ1dCBuZWVkZWQgZm9yIHBhcmFtZXRlcml6ZWQgc2VydmljZSBzY2VuYXJpb3MpXG5cdCAqIEByZXR1cm5zIFJldHVybnMgY29tcGxldGUgcGF0aCB0byB0aGUgZW50aXR5IHNldFxuXHQgKi9cblx0Z2V0RW50aXR5U2V0UGF0aDogZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgb2RhdGFNZXRhTW9kZWw/OiBPRGF0YU1ldGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0bGV0IGVudGl0eVNldFBhdGggPSBcIlwiO1xuXHRcdGlmICghb2RhdGFNZXRhTW9kZWwpIHtcblx0XHRcdC8vIFByZXZpb3VzIGltcGxlbWVudGF0aW9uIGZvciBnZXR0aW5nIGVudGl0eVNldFBhdGggZnJvbSBlbnRpdHlUeXBlUGF0aFxuXHRcdFx0ZW50aXR5U2V0UGF0aCA9IGAvJHtwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpLmpvaW4oXCIvJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcvXCIpfWA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIENhbGN1bGF0aW5nIHRoZSBlbnRpdHlTZXRQYXRoIGZyb20gTWV0YU1vZGVsLlxuXHRcdFx0Y29uc3QgcGF0aFBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKE1vZGVsSGVscGVyLmZpbHRlck91dE5hdlByb3BCaW5kaW5nKTtcblx0XHRcdGlmIChwYXRoUGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRjb25zdCBpbml0aWFsUGF0aE9iamVjdCA9IHtcblx0XHRcdFx0XHRncm93aW5nUGF0aDogXCIvXCIsXG5cdFx0XHRcdFx0cGVuZGluZ05hdlByb3BCaW5kaW5nOiBcIlwiXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y29uc3QgcGF0aE9iamVjdCA9IHBhdGhQYXJ0cy5yZWR1Y2UoXG5cdFx0XHRcdFx0KHBhdGhVbmRlckNvbnN0cnVjdGlvbjogeyBncm93aW5nUGF0aDogc3RyaW5nOyBwZW5kaW5nTmF2UHJvcEJpbmRpbmc6IHN0cmluZyB9LCBwYXRoUGFydDogc3RyaW5nLCBpZHg6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgZGVsaW1pdGVyID0gKCEhaWR4ICYmIFwiLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nL1wiKSB8fCBcIlwiO1xuXHRcdFx0XHRcdFx0bGV0IHsgZ3Jvd2luZ1BhdGgsIHBlbmRpbmdOYXZQcm9wQmluZGluZyB9ID0gcGF0aFVuZGVyQ29uc3RydWN0aW9uO1xuXHRcdFx0XHRcdFx0Y29uc3QgdGVtcFBhdGggPSBncm93aW5nUGF0aCArIGRlbGltaXRlcjtcblx0XHRcdFx0XHRcdGNvbnN0IG5hdlByb3BCaW5kaW5ncyA9IG9kYXRhTWV0YU1vZGVsLmdldE9iamVjdCh0ZW1wUGF0aCk7XG5cdFx0XHRcdFx0XHRjb25zdCBuYXZQcm9wQmluZGluZ1RvQ2hlY2sgPSBwZW5kaW5nTmF2UHJvcEJpbmRpbmcgPyBgJHtwZW5kaW5nTmF2UHJvcEJpbmRpbmd9LyR7cGF0aFBhcnR9YCA6IHBhdGhQYXJ0O1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRuYXZQcm9wQmluZGluZ3MgJiZcblx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMobmF2UHJvcEJpbmRpbmdzKS5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0XHRcdG5hdlByb3BCaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShuYXZQcm9wQmluZGluZ1RvQ2hlY2spXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Z3Jvd2luZ1BhdGggPSB0ZW1wUGF0aCArIG5hdlByb3BCaW5kaW5nVG9DaGVjay5yZXBsYWNlKFwiL1wiLCBcIiUyRlwiKTtcblx0XHRcdFx0XHRcdFx0cGVuZGluZ05hdlByb3BCaW5kaW5nID0gXCJcIjtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHBlbmRpbmdOYXZQcm9wQmluZGluZyArPSBwZW5kaW5nTmF2UHJvcEJpbmRpbmcgPyBgLyR7cGF0aFBhcnR9YCA6IHBhdGhQYXJ0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIHsgZ3Jvd2luZ1BhdGgsIHBlbmRpbmdOYXZQcm9wQmluZGluZyB9O1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0aW5pdGlhbFBhdGhPYmplY3Rcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRlbnRpdHlTZXRQYXRoID0gcGF0aE9iamVjdC5ncm93aW5nUGF0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVudGl0eVNldFBhdGggPSBgLyR7cGF0aFBhcnRzWzBdfWA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVudGl0eVNldFBhdGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHBhdGggZm9yIHRoZSBpdGVtcyBwcm9wZXJ0eSBvZiBNdWx0aVZhbHVlRmllbGQgcGFyYW1ldGVycy5cblx0ICogQHBhcmFtIG9QYXJhbWV0ZXIgQWN0aW9uIFBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb21wbGV0ZSBtb2RlbCBwYXRoIGZvciB0aGUgaXRlbXMgcHJvcGVydHkgb2YgTXVsdGlWYWx1ZUZpZWxkIHBhcmFtZXRlcnNcblx0ICovXG5cdGdldEFjdGlvblBhcmFtZXRlckl0ZW1zTW9kZWxQYXRoOiBmdW5jdGlvbiAob1BhcmFtZXRlcjogTWV0YU1vZGVsQWN0aW9uUGFyYW1ldGVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gb1BhcmFtZXRlciAmJiBvUGFyYW1ldGVyLiROYW1lID8gYHtwYXRoOiAnbXZmdmlldz4vJHtvUGFyYW1ldGVyLiROYW1lfSd9YCA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHRmaWx0ZXJPdXROYXZQcm9wQmluZGluZzogZnVuY3Rpb24gKHNQYXRoUGFydDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNQYXRoUGFydCAhPT0gXCJcIiAmJiBzUGF0aFBhcnQgIT09IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0fSxcblxuXHQvKipcblx0ICogQWRkcyBhIHNldFByb3BlcnR5IHRvIHRoZSBjcmVhdGVkIGJpbmRpbmcgY29udGV4dHMgb2YgdGhlIGludGVybmFsIEpTT04gbW9kZWwuXG5cdCAqIEBwYXJhbSBJbnRlcm5hbCBKU09OIE1vZGVsIHdoaWNoIGlzIGVuaGFuY2VkXG5cdCAqL1xuXG5cdGVuaGFuY2VJbnRlcm5hbEpTT05Nb2RlbDogZnVuY3Rpb24gKG9JbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwpOiB2b2lkIHtcblx0XHRjb25zdCBmbkJpbmRDb250ZXh0ID0gb0ludGVybmFsTW9kZWwuYmluZENvbnRleHQ7XG5cdFx0b0ludGVybmFsTW9kZWwuYmluZENvbnRleHQgPSBmdW5jdGlvbiAoXG5cdFx0XHRzUGF0aDogc3RyaW5nLFxuXHRcdFx0Y29udGV4dDogQmFzZUNvbnRleHQsXG5cdFx0XHRtUGFyYW1ldGVyczogb2JqZWN0IHwgdW5kZWZpbmVkLFxuXHRcdFx0b0V2ZW50czogb2JqZWN0IHwgdW5kZWZpbmVkXG5cdFx0KTogQ29udGV4dEJpbmRpbmcge1xuXHRcdFx0Y29uc3QgY29udGV4dEJpbmRpbmcgPSBmbkJpbmRDb250ZXh0LmFwcGx5KHRoaXMsIFtzUGF0aCwgY29udGV4dCwgbVBhcmFtZXRlcnMsIG9FdmVudHNdKTtcblx0XHRcdGNvbnN0IGZuR2V0Qm91bmRDb250ZXh0ID0gY29udGV4dEJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0O1xuXG5cdFx0XHRjb250ZXh0QmluZGluZy5nZXRCb3VuZENvbnRleHQgPSBmdW5jdGlvbiAoKTogQmFzZUNvbnRleHQgfCBudWxsIHtcblx0XHRcdFx0Y29uc3Qgb0JvdW5kQ29udGV4dCA9IGZuR2V0Qm91bmRDb250ZXh0LmFwcGx5KHRoaXMpO1xuXHRcdFx0XHRpZiAob0JvdW5kQ29udGV4dCkge1xuXHRcdFx0XHRcdG9Cb3VuZENvbnRleHQuc2V0UHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHlQYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5nZXRPYmplY3QoKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGluaXRpYWxpemVcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHRoaXMuZ2V0UGF0aCgpLCB7fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGhTcGxpdCA9IHByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRcdFx0XHQvLyBsZXQncyBlbnN1cmUgdGhhdCBzdWIgb2JqZWN0cyBhcmUgaW5pdGlhbGl6ZWRcblx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydHlQYXRoU3BsaXQubGVuZ3RoIC0gMTsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmdldE9iamVjdChwcm9wZXJ0eVBhdGhTcGxpdFtpXSkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIGluaXRpYWxpemVcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldE1vZGVsKCkuc2V0UHJvcGVydHkodGhpcy5nZXRQYXRoKHByb3BlcnR5UGF0aFNwbGl0W2ldKSwge30pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLmdldE1vZGVsKCkuc2V0UHJvcGVydHkocHJvcGVydHlQYXRoLCB2YWx1ZSwgdGhpcyk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gb0JvdW5kQ29udGV4dDtcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gY29udGV4dEJpbmRpbmc7XG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogQWRkcyBhbiBoYW5kbGVyIG9uIHByb3BlcnR5Q2hhbmdlLlxuXHQgKiBUaGUgcHJvcGVydHkgXCIvZWRpdE1vZGVcIiBpcyBjaGFuZ2VkIGFjY29yZGluZyB0byBwcm9wZXJ0eSAnL2lzRWRpdGFibGUnIHdoZW4gdGhpcyBsYXN0IG9uZSBpcyBzZXRcblx0ICogaW4gb3JkZXIgdG8gYmUgY29tcGxpYW50IHdpdGggZm9ybWVyIHZlcnNpb25zIHdoZXJlIGJ1aWxkaW5nIGJsb2NrcyB1c2UgdGhlIHByb3BlcnR5IFwiL2VkaXRNb2RlXCJcblx0ICogQHBhcmFtIHVpTW9kZWwgSlNPTiBNb2RlbCB3aGljaCBpcyBlbmhhbmNlZFxuXHQgKiBAcGFyYW0gbGlicmFyeSBDb3JlIGxpYnJhcnkgb2YgU0FQIEZpb3JpIGVsZW1lbnRzXG5cdCAqL1xuXG5cdGVuaGFuY2VVaUpTT05Nb2RlbDogZnVuY3Rpb24gKHVpTW9kZWw6IEpTT05Nb2RlbCwgbGlicmFyeTogeyBFZGl0TW9kZTogeyBFZGl0YWJsZTogc3RyaW5nOyBEaXNwbGF5OiBzdHJpbmcgfSB9KTogdm9pZCB7XG5cdFx0Y29uc3QgZm5TZXRQcm9wZXJ0eSA9IHVpTW9kZWwuc2V0UHJvcGVydHk7XG5cdFx0dWlNb2RlbC5zZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0XHRcdHBhdGg6IHN0cmluZyxcblx0XHRcdHZhbHVlOiB1bmtub3duLFxuXHRcdFx0Y29udGV4dDogQmFzZUNvbnRleHQgfCB1bmRlZmluZWQsXG5cdFx0XHRhc3luY1VwZGF0ZTogYm9vbGVhbiB8IHVuZGVmaW5lZFxuXHRcdCk6IGJvb2xlYW4ge1xuXHRcdFx0aWYgKHBhdGggPT09IFwiL2lzRWRpdGFibGVcIikge1xuXHRcdFx0XHR1aU1vZGVsLnNldFByb3BlcnR5KFwiL2VkaXRNb2RlXCIsIHZhbHVlID8gbGlicmFyeS5FZGl0TW9kZS5FZGl0YWJsZSA6IGxpYnJhcnkuRWRpdE1vZGUuRGlzcGxheSwgY29udGV4dCwgYXN5bmNVcGRhdGUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZuU2V0UHJvcGVydHkuYXBwbHkodGhpcywgW3BhdGgsIHZhbHVlLCBjb250ZXh0LCBhc3luY1VwZGF0ZV0pO1xuXHRcdH07XG5cdH0sXG5cblx0ZW5oYW5jZVZpZXdKU09OTW9kZWw6IGZ1bmN0aW9uICh2aWV3TW9kZWw6IEpTT05Nb2RlbCAmIHsgX2dldE9iamVjdDogRnVuY3Rpb24gfSk6IHZvaWQge1xuXHRcdGNvbnN0IGZuR2V0T2JqZWN0ID0gdmlld01vZGVsLl9nZXRPYmplY3Q7XG5cdFx0dmlld01vZGVsLl9nZXRPYmplY3QgPSBmdW5jdGlvbiAoc1BhdGg6IHN0cmluZywgb0NvbnRleHQ/OiBDb250ZXh0KTogdW5rbm93biB7XG5cdFx0XHRpZiAoc1BhdGggPT09IHVuZGVmaW5lZCB8fCBzUGF0aCA9PT0gXCJcIikge1xuXHRcdFx0XHRzUGF0aCA9IFwiL1wiO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZuR2V0T2JqZWN0LmFwcGx5KHRoaXMsIFtzUGF0aCwgb0NvbnRleHRdKTtcblx0XHR9O1xuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIGZpbHRlcmluZyBvbiB0aGUgdGFibGUgaXMgY2FzZSBzZW5zaXRpdmUuXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBpbnN0YW5jZSBvZiB0aGUgbWV0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zICdmYWxzZScgaWYgRmlsdGVyRnVuY3Rpb25zIGFubm90YXRpb24gc3VwcG9ydHMgJ3RvbG93ZXInLCBlbHNlICd0cnVlJ1xuXHQgKi9cblx0aXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlOiBmdW5jdGlvbiAob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpOiB1bmRlZmluZWQgfCBib29sZWFuIHtcblx0XHRpZiAoIW9NZXRhTW9kZWwpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGNvbnN0IGFGaWx0ZXJGdW5jdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi9AT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJGdW5jdGlvbnNcIik7XG5cdFx0Ly8gR2V0IGZpbHRlciBmdW5jdGlvbnMgZGVmaW5lZCBhdCBFbnRpdHlDb250YWluZXIgYW5kIGNoZWNrIGZvciBleGlzdGVuY2Ugb2YgJ3RvbG93ZXInXG5cdFx0cmV0dXJuIGFGaWx0ZXJGdW5jdGlvbnMgPyBhRmlsdGVyRnVuY3Rpb25zLmluZGV4T2YoXCJ0b2xvd2VyXCIpID09PSAtMSA6IHRydWU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBNZXRhUGF0aCBmb3IgdGhlIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIHVzZWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgbWV0YXBhdGggZm9yIHRoZSBjb250ZXh0LlxuXHQgKi9cblx0Z2V0TWV0YVBhdGhGb3JDb250ZXh0OiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0cmV0dXJuIG9NZXRhTW9kZWwgJiYgc1BhdGggJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBNZXRhUGF0aCBmb3IgdGhlIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0UGF0aCBNZXRhUGF0aCB0byBiZSB1c2VkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHJvb3QgZW50aXR5IHNldCBwYXRoLlxuXHQgKi9cblx0Z2V0Um9vdEVudGl0eVNldFBhdGg6IGZ1bmN0aW9uIChjb250ZXh0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRsZXQgcm9vdEVudGl0eVNldFBhdGggPSBcIlwiO1xuXHRcdGNvbnN0IGFQYXRocyA9IGNvbnRleHRQYXRoID8gY29udGV4dFBhdGguc3BsaXQoXCIvXCIpIDogW107XG5cdFx0aWYgKGFQYXRocy5sZW5ndGggPiAxKSB7XG5cdFx0XHRyb290RW50aXR5U2V0UGF0aCA9IGFQYXRoc1sxXTtcblx0XHR9XG5cdFx0cmV0dXJuIHJvb3RFbnRpdHlTZXRQYXRoO1xuXHR9LFxuXHQvKipcblx0ICogR2V0IE1ldGFQYXRoIGZvciB0aGUgbGlzdEJpbmRpbmcuXG5cdCAqIEBwYXJhbSBvVmlldyBWaWV3IG9mIHRoZSBjb250cm9sIHVzaW5nIGxpc3RCaW5kaW5nXG5cdCAqIEBwYXJhbSB2TGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyBvYmplY3Qgb3IgdGhlIGJpbmRpbmcgcGF0aCBmb3IgYSB0ZW1wb3JhcnkgbGlzdCBiaW5kaW5nXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIG1ldGFwYXRoIGZvciB0aGUgbGlzdGJpbmRpbmcuXG5cdCAqL1xuXHRnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmc6IGZ1bmN0aW9uIChvVmlldzogRkVWaWV3LCB2TGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzTWV0YVBhdGg7XG5cblx0XHRpZiAodHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0aWYgKHZMaXN0QmluZGluZy5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHQvLyBhYnNvbHV0ZSBwYXRoXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgodkxpc3RCaW5kaW5nKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHJlbGF0aXZlIHBhdGhcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7c1Jvb3RDb250ZXh0UGF0aH0vJHt2TGlzdEJpbmRpbmd9YCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHdlIGFscmVhZHkgZ2V0IGEgbGlzdCBiaW5kaW5nIHVzZSB0aGlzIG9uZVxuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBvUm9vdEJpbmRpbmcgPSBvQmluZGluZy5nZXRSb290QmluZGluZygpO1xuXHRcdFx0aWYgKG9CaW5kaW5nID09PSBvUm9vdEJpbmRpbmcpIHtcblx0XHRcdFx0Ly8gYWJzb2x1dGUgcGF0aFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9CaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRcdGNvbnN0IHNSb290QmluZGluZ1BhdGggPSBvUm9vdEJpbmRpbmchLmdldFBhdGgoKTtcblx0XHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9IG9CaW5kaW5nLmdldFBhdGgoKTtcblx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChgJHtzUm9vdEJpbmRpbmdQYXRofS8ke3NSZWxhdGl2ZVBhdGh9YCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBzTWV0YVBhdGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBkcmFmdCByb290LlxuXHQgKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZFxuXHQgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIGRyYWZ0IHJvb3Rcblx0ICovXG5cdGlzRHJhZnRSb290OiBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmtub3duIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0RHJhZnRSb290KGVudGl0eVNldCkgIT09IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIGRyYWZ0IG5vZGUuXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgZHJhZnQgbm9kZVxuXHQgKi9cblx0aXNEcmFmdE5vZGU6IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVua25vd24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXREcmFmdE5vZGUoZW50aXR5U2V0KSAhPT0gdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgc3RpY2t5IHNlc3Npb24gcm9vdC5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgV2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBzdGlja3kgc2Vzc2lvbiByb290XG5cdCAqL1xuXHRpc1N0aWNreTogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U3RpY2t5U2Vzc2lvbihlbnRpdHlTZXQpICE9PSB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgZW50aXR5IGlzIHVwZGF0YWJsZSBvciBub3QuXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIEVudGl0eVR5cGVcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB1cGRhdGFibGUgZWxzZSBmYWxzZVxuXHQgKi9cblx0aXNVcGRhdGVIaWRkZW46IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZCwgZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IFVwZGF0ZUhpZGRlbiB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGlzRW50aXR5U2V0KGVudGl0eVNldCkpIHtcblx0XHRcdHJldHVybiBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuVUk/LlVwZGF0ZUhpZGRlbiA/PyBlbnRpdHlUeXBlPy5hbm5vdGF0aW9ucy5VST8uVXBkYXRlSGlkZGVuO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEdldHMgdGhlIEBDb21tb24uRHJhZnRSb290IGFubm90YXRpb24gaWYgdGhlIGFyZ3VtZW50IGlzIGFuIEVudGl0eVNldC5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgRHJhZnRSb290XG5cdCAqL1xuXHRnZXREcmFmdFJvb3Q6IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVua25vd24gfCB1bmRlZmluZWQpOiBEcmFmdFJvb3QgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiBpc0VudGl0eVNldChlbnRpdHlTZXQpID8gZW50aXR5U2V0LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290IDogdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBAQ29tbW9uLkRyYWZ0Tm9kZSBhbm5vdGF0aW9uIGlmIHRoZSBhcmd1bWVudCBpcyBhbiBFbnRpdHlTZXQuXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIERyYWZ0Um9vdFxuXHQgKi9cblx0Z2V0RHJhZnROb2RlOiBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmtub3duIHwgdW5kZWZpbmVkKTogRHJhZnROb2RlIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gaXNFbnRpdHlTZXQoZW50aXR5U2V0KSA/IGVudGl0eVNldC5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Tm9kZSA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogSGVscGVyIG1ldGhvZCB0byBnZXQgc3RpY2t5IHNlc3Npb24uXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIFNlc3Npb24gU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHQgKi9cblx0Z2V0U3RpY2t5U2Vzc2lvbjogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5rbm93biB8IHVuZGVmaW5lZCk6IFN0aWNreVNlc3Npb25TdXBwb3J0ZWQgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiBpc0VudGl0eVNldChlbnRpdHlTZXQpID8gZW50aXR5U2V0LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBnZXQgdGhlIHZpc2liaWxpdHkgc3RhdGUgb2YgZGVsZXRlIGJ1dHRvbi5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgRW50aXR5VHlwZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGRlbGV0ZSBidXR0b24gaXMgaGlkZGVuXG5cdCAqL1xuXHRnZXREZWxldGVIaWRkZW46IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZCwgZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IERlbGV0ZUhpZGRlbiB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGlzRW50aXR5U2V0KGVudGl0eVNldCkpIHtcblx0XHRcdHJldHVybiBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuVUk/LkRlbGV0ZUhpZGRlbiA/PyBlbnRpdHlUeXBlLmFubm90YXRpb25zLlVJPy5EZWxldGVIaWRkZW47XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBtZXRhcGF0aCBmb3IgdGhlIGdpdmVuIGxpc3QgYmluZGluZy5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3RCaW5kaW5nLlxuXHQgKiBAcmV0dXJucyBNZXRhUGF0aFxuXHQgKi9cblx0Z2V0QWJzb2x1dGVQYXRoRnJvbUxpc3RCaW5kaW5nKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBtZXRhbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBtZXRhUGF0aDtcblx0XHRjb25zdCByb290QmluZGluZyA9IGxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCk7XG5cdFx0aWYgKGxpc3RCaW5kaW5nID09PSByb290QmluZGluZykge1xuXHRcdFx0bWV0YVBhdGggPSBtZXRhbW9kZWwuZ2V0TWV0YVBhdGgobGlzdEJpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgcm9vdEJpbmRpbmdQYXRoID0gcm9vdEJpbmRpbmc/LmdldFBhdGgoKTtcblx0XHRcdGNvbnN0IHJlbGF0aXZlUGF0aCA9IGxpc3RCaW5kaW5nLmdldFBhdGgoKTtcblx0XHRcdG1ldGFQYXRoID0gbWV0YW1vZGVsLmdldE1ldGFQYXRoKGAke3Jvb3RCaW5kaW5nUGF0aH0vJHtyZWxhdGl2ZVBhdGh9YCk7XG5cdFx0fVxuXHRcdHJldHVybiBtZXRhUGF0aDtcblx0fSxcblxuXHRlbmhhbmNlT0RhdGFNb2RlbChvZGF0YU1vZGVsOiBPRGF0YU1vZGVsKTogdm9pZCB7XG5cdFx0b2RhdGFNb2RlbC52aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkgPSBuZXcgQXJyYXk8T0RhdGFQcm9wZXJ0eUJpbmRpbmc+KCk7XG5cdFx0Y29uc3QgZm5NZXNzYWdlID0gb2RhdGFNb2RlbC5zZXRNZXNzYWdlcztcblx0XHRjb25zdCBsb2NhbEFubm90YXRpb25Nb2RlbCA9IG5ldyBKU09OTW9kZWwoe30pO1xuXHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldERlZmF1bHRCaW5kaW5nTW9kZShCaW5kaW5nTW9kZS5PbmVXYXkpO1xuXHRcdGNvbnN0IGJhc2VTZXRQcm9wZXJ0eSA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5O1xuXHRcdGNvbnN0IGJhc2VHZXRQcm9wZXJ0eSA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldFByb3BlcnR5O1xuXHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldFByb3BlcnR5ID0gZnVuY3Rpb24gKHBhdGgsIGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogdW5rbm93biB7XG5cdFx0XHRjb25zdCBbcHJvcGVydHlOYW1lLCBhbm5vdGF0aW9uVHlwZV0gPSBwYXRoLnNwbGl0KFwiQCR1aTUuZmUuXCIpO1xuXG5cdFx0XHRpZiAoY29udGV4dCAmJiBjb250ZXh0LmlzVHJhbnNpZW50KCkgIT09IHRydWUgJiYgYW5ub3RhdGlvblR5cGUgPT09IFwiQENvbW1vbi9FeHRlcm5hbElEXCIpIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dE9iamVjdCA9IGNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGlmIChjb250ZXh0T2JqZWN0KSB7XG5cdFx0XHRcdFx0Y29uc3QgbWV0YVBhdGggPSBuZXcgTWV0YVBhdGg8RW50aXR5U2V0Pihcblx0XHRcdFx0XHRcdGNvbnZlcnRUeXBlcyhvZGF0YU1vZGVsLmdldE1ldGFNb2RlbCgpKSxcblx0XHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpLFxuXHRcdFx0XHRcdFx0b2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGNvbnN0IGV4dGVybmFsSWRQcm9wZXJ0eSA9IG1ldGFQYXRoLmdldE1ldGFQYXRoRm9yUGF0aDxQcm9wZXJ0eT4ocHJvcGVydHlOYW1lKS5nZXRUYXJnZXQoKS5hbm5vdGF0aW9ucy5Db21tb25cblx0XHRcdFx0XHRcdD8uRXh0ZXJuYWxJRDtcblx0XHRcdFx0XHRpZiAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24oZXh0ZXJuYWxJZFByb3BlcnR5KSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0T2JqZWN0KGV4dGVybmFsSWRQcm9wZXJ0eS5wYXRoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5TmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoY29udGV4dCAmJiBhbm5vdGF0aW9uVHlwZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LmdldFBhdGgoKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGJhc2VHZXRQcm9wZXJ0eS5hcHBseSh0aGlzLCBbcGF0aCwgY29udGV4dF0pO1xuXHRcdH07XG5cblx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwYXRoLCB2YWx1ZSwgY29udGV4dCwgYXN5bmNVcGRhdGUpOiBib29sZWFuIHtcblx0XHRcdGxldCBmdWxsUGF0aCA9IHBhdGg7XG5cdFx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0XHRmdWxsUGF0aCA9IGNvbnRleHQuZ2V0UGF0aChwYXRoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IF9yZWZyZXNoTG9jYWxNb2RlbCA9ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0dGhpcy5yZWZyZXNoKCk7XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgW3Byb3BlcnR5TmFtZSwgYW5ub3RhdGlvblR5cGVdID0gcGF0aC5zcGxpdChcIkAkdWk1LmZlLlwiKTtcblx0XHRcdGlmIChjb250ZXh0ICYmIGFubm90YXRpb25UeXBlID09PSBcIkBDb21tb24vRXh0ZXJuYWxJRFwiKSB7XG5cdFx0XHRcdGNvbnRleHQuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSk7XG5cdFx0XHRcdC8vIHJlZnJlc2hpbmcgRXh0ZXJuYWxJRCBhbmQgdGV4dCBwcm9wZXJ0aWVzIChwYXRocyBuZWVkIHRvIGJlIGRldGVybWluZWQgZ2VuZXJpY2FsbHkpXG5cdFx0XHRcdGNvbnN0IG1ldGFQYXRoID0gbmV3IE1ldGFQYXRoPEVudGl0eVNldD4oXG5cdFx0XHRcdFx0Y29udmVydFR5cGVzKG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkpLFxuXHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpLFxuXHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IGV4dGVybmFsSWRQcm9wZXJ0eSA9IG1ldGFQYXRoLmdldE1ldGFQYXRoRm9yUGF0aDxQcm9wZXJ0eT4ocHJvcGVydHlOYW1lKS5nZXRUYXJnZXQoKS5hbm5vdGF0aW9ucy5Db21tb24/LkV4dGVybmFsSUQ7XG5cdFx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihleHRlcm5hbElkUHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZFByb3BQYXRoID0gZXh0ZXJuYWxJZFByb3BlcnR5LnBhdGg7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydGllc1RvUmVxdWVzdCA9IFtleHRlcm5hbElkUHJvcFBhdGguc3Vic3RyaW5nKDAsIGV4dGVybmFsSWRQcm9wUGF0aC5sYXN0SW5kZXhPZihcIi9cIikpXTtcblx0XHRcdFx0XHRjb25zdCB0ZXh0UHJvcGVydHkgPSBtZXRhUGF0aC5nZXRNZXRhUGF0aEZvclBhdGg8UHJvcGVydHk+KGV4dGVybmFsSWRQcm9wUGF0aCkuZ2V0VGFyZ2V0KCkuYW5ub3RhdGlvbnMuQ29tbW9uPy5UZXh0O1xuXHRcdFx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0ZXh0UHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0ZXh0UHJvcFBhdGggPSB0ZXh0UHJvcGVydHkucGF0aDtcblx0XHRcdFx0XHRcdGlmICh0ZXh0UHJvcFBhdGguaW5jbHVkZXMoXCIvXCIpKSB7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnRpZXNUb1JlcXVlc3QucHVzaCh0ZXh0UHJvcFBhdGgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQoY29udGV4dCBhcyBPRGF0YVY0Q29udGV4dClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMocHJvcGVydGllc1RvUmVxdWVzdClcblx0XHRcdFx0XHRcdC50aGVuKF9yZWZyZXNoTG9jYWxNb2RlbClcblx0XHRcdFx0XHRcdC5jYXRjaCgoZXJyKSA9PiB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnIgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGhTcGxpdCA9IGZ1bGxQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdC8vIGxldCdzIGVuc3VyZSB0aGF0IHN1YiBvYmplY3RzIGFyZSBpbml0aWFsaXplZFxuXHRcdFx0bGV0IHBhdGhGcm9tUm9vdCA9IFwiXCI7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnR5UGF0aFNwbGl0Lmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRwYXRoRnJvbVJvb3QgKz0gXCIvXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cGF0aEZyb21Sb290ICs9IHByb3BlcnR5UGF0aFNwbGl0W2ldO1xuXHRcdFx0XHRpZiAodGhpcy5nZXRPYmplY3QocGF0aEZyb21Sb290KSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Ly8gaW5pdGlhbGl6ZVxuXHRcdFx0XHRcdHRoaXMuc2V0UHJvcGVydHkocGF0aEZyb21Sb290LCB7fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBiYXNlU2V0UHJvcGVydHkuYXBwbHkodGhpcywgW3BhdGgsIHZhbHVlLCBjb250ZXh0LCBhc3luY1VwZGF0ZV0pO1xuXHRcdH07XG5cdFx0ZnVuY3Rpb24gY2xlYXJBbm5vdGF0aW9uVHlwZShhbm5vdGF0aW9uVHlwZXM6IHN0cmluZ1tdLCBkYXRhU2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IG9iamVjdCB7XG5cdFx0XHRmb3IgKGNvbnN0IGNvbnRleHRQYXRoIGluIGRhdGFTZXQpIHtcblx0XHRcdFx0Ly8gd2UgYWRkZWQgYSBjb250ZXh0IGZvciBhY2NlcHRpbmcgcmVjb21tZW5kYXRpb25zIGV2ZW50dWFsbHkuXG5cdFx0XHRcdC8vIHRoZSBjb250ZXh0IGlzIGEgZGVlcGx5IG5lc3RlZCBvYmplY3QgaXRlcmF0aW5nIG92ZXIgaXQgY2F1c2UgdGhlIGNvZGUgdGhlIGJyZWFrXG5cdFx0XHRcdC8vIGhlbmNlIHdlIGFyZSBza2lwcGluZyBpdCBoZXJlLlxuXHRcdFx0XHRjb25zdCBpc0NvbnRleHQgPVxuXHRcdFx0XHRcdChkYXRhU2V0W2NvbnRleHRQYXRoXSBhcyBPRGF0YVY0Q29udGV4dCkuaXNBICYmXG5cdFx0XHRcdFx0KGRhdGFTZXRbY29udGV4dFBhdGhdIGFzIE9EYXRhVjRDb250ZXh0KS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKTtcblx0XHRcdFx0aWYgKHR5cGVvZiBkYXRhU2V0W2NvbnRleHRQYXRoXSA9PT0gXCJvYmplY3RcIiAmJiAhaXNDb250ZXh0KSB7XG5cdFx0XHRcdFx0ZGF0YVNldFtjb250ZXh0UGF0aF0gPSBjbGVhckFubm90YXRpb25UeXBlKGFubm90YXRpb25UeXBlcywgZGF0YVNldFtjb250ZXh0UGF0aF0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXHRcdFx0XHRcdGlmIChPYmplY3Qua2V5cyhkYXRhU2V0W2NvbnRleHRQYXRoXSBhcyBvYmplY3QpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIGRhdGFTZXRbY29udGV4dFBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGNvbnN0IGFubm90YXRpb25UeXBlIG9mIGFubm90YXRpb25UeXBlcykge1xuXHRcdFx0XHRcdGlmIChjb250ZXh0UGF0aC5lbmRzV2l0aChhbm5vdGF0aW9uVHlwZSkpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBkYXRhU2V0W2NvbnRleHRQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBkYXRhU2V0O1xuXHRcdH1cblx0XHRvZGF0YU1vZGVsLl9sb2NhbEFubm90YXRpb25Nb2RlbCA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsO1xuXHRcdG9kYXRhTW9kZWwuZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwgPSBmdW5jdGlvbiAoKTogSlNPTk1vZGVsIHtcblx0XHRcdHJldHVybiB0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbDtcblx0XHR9O1xuXHRcdG9kYXRhTW9kZWwuc2V0TWVzc2FnZXMgPSBmdW5jdGlvbiAobWVzc2FnZXM6IFJlY29yZDxzdHJpbmcsIE1lc3NhZ2VbXT4pOiB2b2lkIHtcblx0XHRcdGNvbnN0IGNsZWFuZWREYXRhID0gY2xlYXJBbm5vdGF0aW9uVHlwZShbXCJAJHVpNS5mZS5tZXNzYWdlVHlwZVwiLCBcIkAkdWk1LmZlLm1lc3NhZ2VUZXh0XCJdLCB0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5nZXREYXRhKCkpO1xuXHRcdFx0dGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0RGF0YShjbGVhbmVkRGF0YSk7XG5cdFx0XHRmb3IgKGNvbnN0IG1lc3NhZ2VUYXJnZXQgaW4gbWVzc2FnZXMpIHtcblx0XHRcdFx0dGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkoYCR7bWVzc2FnZVRhcmdldH1AJHVpNS5mZS5tZXNzYWdlVHlwZWAsIG1lc3NhZ2VzW21lc3NhZ2VUYXJnZXRdWzBdLmdldFR5cGUoKSk7XG5cdFx0XHRcdHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KGAke21lc3NhZ2VUYXJnZXR9QCR1aTUuZmUubWVzc2FnZVRleHRgLCBtZXNzYWdlc1ttZXNzYWdlVGFyZ2V0XVswXS5nZXRNZXNzYWdlKCkpO1xuXHRcdFx0fVxuXHRcdFx0Zm5NZXNzYWdlLmFwcGx5KHRoaXMsIFttZXNzYWdlc10pO1xuXHRcdH07XG5cdFx0Y29uc3QgZm5CaW5kUHJvcGVydHkgPSBvZGF0YU1vZGVsLmJpbmRQcm9wZXJ0eS5iaW5kKG9kYXRhTW9kZWwpO1xuXHRcdG9kYXRhTW9kZWwuYmluZFByb3BlcnR5ID0gZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgY29udGV4dDogT0RhdGFWNENvbnRleHQsIHBhcmFtZXRlcnMpOiBPRGF0YVByb3BlcnR5QmluZGluZyB7XG5cdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZyA9IE1vZGVsSGVscGVyLnNldFVwUmVjb21tZW5kYXRpb25Mb2NhbE1vZGVsQmluZGluZyh0aGlzLCBmbkJpbmRQcm9wZXJ0eSwgcGF0aCwgY29udGV4dCk7XG5cdFx0XHRpZiAocmVjb21tZW5kYXRpb25Qcm9wZXJ0eUJpbmRpbmcpIHtcblx0XHRcdFx0cmV0dXJuIHJlY29tbWVuZGF0aW9uUHJvcGVydHlCaW5kaW5nIGFzIE9EYXRhUHJvcGVydHlCaW5kaW5nO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhdGguZW5kc1dpdGgoXCJAJHVpNS5mZS5AQ29tbW9uL0V4dGVybmFsSURcIikgJiYgY29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBpbnRlcm5hbElkQmluZGluZyA9IGZuQmluZFByb3BlcnR5KHBhdGgsIGNvbnRleHQpO1xuXHRcdFx0XHRvZGF0YU1vZGVsLnZpcnR1YWxQcm9wZXJ0eUJpbmRpbmdSZWdpc3RyeS5wdXNoKGludGVybmFsSWRCaW5kaW5nKTtcblx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZEJpbmRpbmcgPSB0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5iaW5kUHJvcGVydHkocGF0aCwgY29udGV4dCkgYXMgdW5rbm93biBhcyBPRGF0YVByb3BlcnR5QmluZGluZztcblxuXHRcdFx0XHRpbnRlcm5hbElkQmluZGluZy5hdHRhY2hDaGFuZ2UoKCkgPT4ge1xuXHRcdFx0XHRcdGV4dGVybmFsSWRCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGludGVybmFsSWRCaW5kaW5nXG5cdFx0XHRcdFx0LnJlcXVlc3RWYWx1ZSgpXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0ZXh0ZXJuYWxJZEJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKChlcnIpID0+IHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnIgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIGV4dGVybmFsSWRCaW5kaW5nO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhdGguaW5jbHVkZXMoXCJAJHVpNS5mZS5cIikpIHtcblx0XHRcdFx0Y29uc3QgcHJvcEJpbmRpbmcgPSB0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5iaW5kUHJvcGVydHkocGF0aCwgY29udGV4dCkgYXMgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgJiB7XG5cdFx0XHRcdFx0c2V0Q29udGV4dD86IEZ1bmN0aW9uO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAocGF0aC5lbmRzV2l0aChcIkAkdWk1LmZlLkBDb21tb24vRXh0ZXJuYWxJRFwiKSkge1xuXHRcdFx0XHRcdHJldHVybiBwcm9wQmluZGluZztcblx0XHRcdFx0fVxuXHRcdFx0XHRwcm9wQmluZGluZy51cGRhdGVSZXF1aXJlZCA9IGZ1bmN0aW9uIChtb2RlbDogb2JqZWN0KTogYm9vbGVhbiB7XG5cdFx0XHRcdFx0cmV0dXJuIG1vZGVsICYmIG1vZGVsID09PSBvZGF0YU1vZGVsO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAocGF0aC5pbmNsdWRlcyhcIkAkdWk1LmZlLnZpcnR1YWwuXCIpKSB7XG5cdFx0XHRcdFx0Y29uc3QgZXhwcmVzc2lvbiA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRWaXJ0dWFsQmluZGluZ0V4cHJlc3Npb24oXG5cdFx0XHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRcdFx0TWV0YU1vZGVsQ29udmVydGVyLmNvbnZlcnRUeXBlcyh0aGlzLmdldE1ldGFNb2RlbCgpKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Y29uc3QgZ2hvc3RDb250cm9sID0gbmV3IEFueSh7IGFueTogY29tcGlsZUV4cHJlc3Npb24oZXhwcmVzc2lvbiksIGJpbmRCYWNrUHJvcGVydHk6IHBhdGggfSk7XG5cdFx0XHRcdFx0Y29uc3QgZm5EZXN0cm95UHJvcGVydHlCaW5kaW5nID0gcHJvcEJpbmRpbmcuZGVzdHJveS5iaW5kKHByb3BCaW5kaW5nKTtcblx0XHRcdFx0XHRwcm9wQmluZGluZy5kZXN0cm95ID0gKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0Z2hvc3RDb250cm9sPy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm5EZXN0cm95UHJvcGVydHlCaW5kaW5nKCk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBmblNldENvbnRleHQgPSBwcm9wQmluZGluZy5zZXRDb250ZXh0O1xuXHRcdFx0XHRcdGlmIChmblNldENvbnRleHQpIHtcblx0XHRcdFx0XHRcdHByb3BCaW5kaW5nLnNldENvbnRleHQgPSAobmV3Q29udGV4dDogQ29udGV4dCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHRnaG9zdENvbnRyb2w/LnNldEJpbmRpbmdDb250ZXh0KG5ld0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZm5TZXRDb250ZXh0LmJpbmQocHJvcEJpbmRpbmcpKG5ld0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRnaG9zdENvbnRyb2wuc2V0TW9kZWwodGhpcyk7XG5cdFx0XHRcdFx0Y29uc3QgZ2hvc3RCaW5kaW5nID0gZ2hvc3RDb250cm9sLmdldEJpbmRpbmdJbmZvKFwiYW55XCIpPy5iaW5kaW5nO1xuXHRcdFx0XHRcdGNvbnN0IGZuQ2hlY2tVcGRhdGUgPSBnaG9zdEJpbmRpbmc/LmNoZWNrVXBkYXRlO1xuXHRcdFx0XHRcdGlmIChmbkNoZWNrVXBkYXRlKSB7XG5cdFx0XHRcdFx0XHRnaG9zdENvbnRyb2wuZ2V0QmluZGluZ0luZm8oXCJhbnlcIikuYmluZGluZy5jaGVja1VwZGF0ZSA9ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZuQ2hlY2tVcGRhdGUuYmluZChnaG9zdEJpbmRpbmcpKHRydWUpO1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Z2hvc3RDb250cm9sLnNldEJpbmRpbmdDb250ZXh0KGNvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBwcm9wQmluZGluZztcblx0XHRcdH1cblx0XHRcdHJldHVybiBmbkJpbmRQcm9wZXJ0eShwYXRoLCBjb250ZXh0LCBwYXJhbWV0ZXJzKTtcblx0XHR9O1xuXHRcdGNvbnN0IGZuRGVzdHJveSA9IG9kYXRhTW9kZWwuZGVzdHJveS5iaW5kKG9kYXRhTW9kZWwpO1xuXHRcdG9kYXRhTW9kZWwuZGVzdHJveSA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdGZvciAoY29uc3QgdnBCaW5kaW5nIG9mIG9kYXRhTW9kZWwudmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5KSB7XG5cdFx0XHRcdHZwQmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5kZXN0cm95KCk7XG5cdFx0XHRyZXR1cm4gZm5EZXN0cm95LmFwcGx5KHRoaXMpO1xuXHRcdH07XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXNvbHZlcyBhIG1ldGFkYXRhIGJpbmRpbmcgdG8gaXRzIHRleHQsIGVpdGhlciB1c2luZyB0aGUgY29udmVydGVyQ29udGV4dCBvciB0aGUgbWV0YU1vZGVsIGRpcmVjdGx5LlxuXHQgKiBAcGFyYW0gcGF0aFxuXHQgKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuXHQgKiBAcGFyYW0gbWV0YU1vZGVsXG5cdCAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCB0ZXh0IGlmIHBvc3NpYmxlLCBlbHNlIHRoZSBpbnB1dCB2YWx1ZSBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHBhdGggd2FzIHVuZGVmaW5lZFxuXHQgKi9cblx0ZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbChwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvbnZlcnRlckNvbnRleHQ/OiBDb252ZXJ0ZXJDb250ZXh0PHVua25vd24+LCBtZXRhTW9kZWw/OiBNZXRhTW9kZWwpOiBzdHJpbmcge1xuXHRcdGxldCB0ZXh0ID0gcGF0aCAhPT0gdW5kZWZpbmVkID8gcGF0aCA6IFwiXCI7XG5cdFx0aWYgKHBhdGg/LnN0YXJ0c1dpdGgoXCJ7bWV0YU1vZGVsPlwiKSkge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsUGF0aCA9IHBhdGguc3Vic3RyaW5nKDExLCBwYXRoLmxlbmd0aCAtIDEpO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKGNvbnZlcnRlckNvbnRleHQpIHtcblx0XHRcdFx0XHR0ZXh0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihtZXRhTW9kZWxQYXRoKS5hbm5vdGF0aW9uPy50b1N0cmluZygpID8/IFwiXCI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGV4dCA9IG1ldGFNb2RlbD8uZ2V0T2JqZWN0KG1ldGFNb2RlbFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdExvZy5pbmZvKGBVbmFibGUgdG8gcmV0cmlldmUgdGV4dCBmcm9tIG1ldGEgbW9kZWwgdXNpbmcgcGF0aCAke21ldGFNb2RlbFBhdGh9YCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB0ZXh0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gcmV0cmlldmUgdGhlIHByb3BlcnR5IHBhdGggY29ycmVzcG9uZGluZyB0byBzdGF0ZSBtZXNzYWdlcy5cblx0ICogQHBhcmFtIG1ldGFNb2RlbCBUaGUgbWV0YW1vZGVsXG5cdCAqIEBwYXJhbSBjb250ZXh0UGF0aCBQYXRoIGZvciB0aGUgY29udGV4dCBvbiB3aGljaCB3ZSB3aGF0IHRvIHJldHJlaXZlIHRoZSBtZXNzYWdlIHBhdGhcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCwgb3IgdW5kZWZpbmVkIGlmIG5vIE1lc3NhZ2VzIGFubm90YXRpb24gaXMgZGVmaW5lZFxuXHQgKi9cblx0Z2V0TWVzc2FnZXNQYXRoOiBmdW5jdGlvbiAobWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgY29udGV4dFBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dFBhdGgpO1xuXHRcdGNvbnN0IG9iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpO1xuXHRcdGNvbnN0IG1lc3NhZ2VzID0gb2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uTWVzc2FnZXM7XG5cdFx0cmV0dXJuIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKG1lc3NhZ2VzKSA/IG1lc3NhZ2VzLnBhdGggOiB1bmRlZmluZWQ7XG5cdH0sXG5cdC8qKlxuXHQgKiBTZXR1cCByZWNvbW1lbmRhdGlvbiBsb2NhbCBiaW5kaW5nIHRvIG1ha2UgcmVjb21tZW5kYXRpb25zIGFjY2Vzc2libGUgdmlhIGNsaWVudCBzaWRlIGluc3RhbmNlIGFubm90YXRpb25zLlxuXHQgKlxuXHQgKiBSZWNvbW1lbmRhdGlvbnMgaXMgYSBjb21wbGV4IHByb3BlcnR5LlxuXHQgKiBNb2RlbCBkb2VzIG5vdCBwcm92aWRlIGFuIGVhc3kgd2F5IHRvIGJpbmQgdG8gY29tcGxleCBwcm9wZXJ0aWVzLiBJdCBoYXMgMiBtYWpvciBsaW1pdGF0aW9ucy5cblx0ICpcblx0ICogSXQgb25seSBzdXBwb3J0cyBvbmUgdGltZSBiaW5kaW5nIHRvIGNvbXBsZXggcHJvcGVydGllcy4gVGhpcyBpcyBuZWVkZWQgdG8gc2hvdyB1cGRhdGVkIHJlY29tbWVuZGF0aW9ucyBvbiB0aGUgVUkuXG5cdCAqIEl0IGRvZXMgbm90IHN1cHBvcnQgYmluZGluZ3MgdG8gcHJvcGVydGllcyBpbnNpZGUgYSBjb21wbGV4IHByb3BlcnR5IHdoaWNoIGlzIG5lZWRlZCBmb3IgcmVjb21tZW5kYXRpb25zLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgd29ya2Fyb3VuZCB0byBvdmVyY29tZSB0aGUgYWJvdmUgdHdvIHNob3J0IGNvbWluZ3MgYW5kXG5cdCAqIHRvIHN1cHBvcnQgY2xpZW50IHNpZGUgaW5zdGFuY2UgYW5ub3RhdGlvbnMgZm9yIHJlY29tbWVuZGF0aW9ucy5cblx0ICogQHBhcmFtIG9kYXRhTW9kZWwgVGhlIG9kYXRhIG1vZGVsIGluc3RhbmNlLlxuXHQgKiBAcGFyYW0gZm5CaW5kUHJvcGVydHkgT3JpZ2luYWwgYmluZCBwcm9wZXJ0eSBvZiB0aGUgb0RhdGFNb2RlbFxuXHQgKiBAcGFyYW0gcGF0aCBCaW5kaW5nIHBhdGggZm9yIHdoaWNoIHJlY29tbWVuZGF0aW9uIGlzIGJlaW5nIHJlcXVlc3RlZFxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIHJlY29tbWVuZGF0aW9uIGlzIGJlaW5nIHJlcXVlc3RlZFxuXHQgKiBAcmV0dXJucyBSZWNvbW1lbmRhdGlvbiBwcm9wZXJ0eSBwYXRoIGZvciB0aGUgZW50aXR5IHJlbGF0ZWQgdG8gdGhlIGNvbnRleHQgYW5kIHdoZXRoZXIgdGhlIGJpbmRpbmdQYXRoIGlzIHJlbGV2YW50IG9yIG5vdCBiYXNlZCBvbiBtZXRhZGF0YS5cblx0ICovXG5cdHNldFVwUmVjb21tZW5kYXRpb25Mb2NhbE1vZGVsQmluZGluZzogZnVuY3Rpb24gKFxuXHRcdG9kYXRhTW9kZWw6IE9EYXRhTW9kZWwsXG5cdFx0Zm5CaW5kUHJvcGVydHk6IEZ1bmN0aW9uLFxuXHRcdHBhdGg6IHN0cmluZyxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dFxuXHQpOiBQcm9wZXJ0eUJpbmRpbmcgfCB1bmRlZmluZWQge1xuXHRcdGlmIChwYXRoLmluY2x1ZGVzKFwidWk1LmZlLnJlY29tbWVuZGF0aW9uc1wiKSkge1xuXHRcdFx0Y29uc3QgcmVjb21tZW5kYXRpb25iaW5kaW5nID0gb2RhdGFNb2RlbC5nZXRMb2NhbEFubm90YXRpb25Nb2RlbCgpLmJpbmRQcm9wZXJ0eShwYXRoLCBjb250ZXh0KSBhcyBPRGF0YVByb3BlcnR5QmluZGluZyAmIHtcblx0XHRcdFx0c2V0Q29udGV4dDogRnVuY3Rpb247XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3Qgc2V0Q29udGV4dE9uUmVjb21tZW5kYXRpb25CaW5kaW5nID0gKG9kYXRhUHJvcGVydHlCaW5kaW5nOiBPRGF0YVByb3BlcnR5QmluZGluZyAmIHsgc2V0Q29udGV4dDogRnVuY3Rpb24gfSk6IHZvaWQgPT4ge1xuXHRcdFx0XHQvL3dlIG1ha2Ugc3VyZSB0aGUgcGFyZW50IGNvbnRleHQgaXMgc2V0IHRvIHRoZSBwcm9wZXJ0eWJpbmRpbmdcblx0XHRcdFx0Y29uc3QgZm5TZXRDb250ZXh0ID0gcmVjb21tZW5kYXRpb25iaW5kaW5nLnNldENvbnRleHQ7XG5cdFx0XHRcdGlmIChmblNldENvbnRleHQpIHtcblx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbmJpbmRpbmcuc2V0Q29udGV4dCA9IChuZXdDb250ZXh0OiBDb250ZXh0KTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRvZGF0YVByb3BlcnR5QmluZGluZz8uc2V0Q29udGV4dChuZXdDb250ZXh0KTtcblx0XHRcdFx0XHRcdHJldHVybiBmblNldENvbnRleHQuYmluZChvZGF0YVByb3BlcnR5QmluZGluZykobmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGlmIChjb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IHsgcmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHksIGlzUmVjb21tZW5kZWRQcm9wZXJ0eSB9ID0gTW9kZWxIZWxwZXIudmFsaWRhdGVSZWNvbW1lbmRhdGlvbkJpbmRpbmdQYXRoKFxuXHRcdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdFx0cGF0aFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAocmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkgJiYgaXNSZWNvbW1lbmRlZFByb3BlcnR5KSB7XG5cdFx0XHRcdFx0Y29uc3QgYWxyZWFkeUJvdW5kID0gb2RhdGFNb2RlbC52aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkuc29tZSgoZXhpc3RpbmdCaW5kaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHQvLyBiaW5kaW5nIGV4aXN0cyBidXQgdGhlIGNvbnRleHQgY2FuIGJlIGRlc3Ryb3llZCBzb21ldGltZXMgYmVjYXVzZSBvZiBkaXNjYXJkIGFuZCBkZWxldGUuXG5cdFx0XHRcdFx0XHRcdC8vIGhlbmNlIHdlIG5lZWQgdG8gY2hlY2sgaWYgY29udGV4dCBleGlzdHMgb3Igbm90IGJlZm9yZSBkZWNpZGluZyBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBiaW5kaW5nIG9yIG5vdC5cblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogV2UgbWlnaHQgd2FudCB0byBjbGVhciB0aGUgcHJvcGVydHkgYmluZGluZyB3aGVuIHRoZSBjb250ZXggaXMgZGVzdHJveWVkLlxuXHRcdFx0XHRcdFx0XHRjb250ZXh0LmdldFBhdGgoKSA9PT0gZXhpc3RpbmdCaW5kaW5nLmdldENvbnRleHQoKT8uZ2V0UGF0aCgpICYmXG5cdFx0XHRcdFx0XHRcdHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5ID09PSBleGlzdGluZ0JpbmRpbmcuZ2V0UGF0aCgpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGlmICghYWxyZWFkeUJvdW5kKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvZGF0YVByb3BlcnR5QmluZGluZyA9IGZuQmluZFByb3BlcnR5KHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5LCBjb250ZXh0KSBhcyBPRGF0YVByb3BlcnR5QmluZGluZyAmIHtcblx0XHRcdFx0XHRcdFx0c2V0Q29udGV4dDogRnVuY3Rpb247XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0Ly8gQmVjdWFzZSByZWNvbW1lbmRhdGlvbnMgaXMgYSBjb21wbGV4IHByb3BlcnR5IGFuZCBub3QgYSBwcmltaXRpdmUgdHlwZSBoZW5jZSB1c2UgYSByYXcgdHlwZS5cblx0XHRcdFx0XHRcdG9kYXRhUHJvcGVydHlCaW5kaW5nLnNldFR5cGUobmV3IFJhdygpLCBcImFueVwiKTtcblx0XHRcdFx0XHRcdG9kYXRhUHJvcGVydHlCaW5kaW5nLnNldEJpbmRpbmdNb2RlKEJpbmRpbmdNb2RlLk9uZVdheSk7XG5cdFx0XHRcdFx0XHRvZGF0YU1vZGVsLnZpcnR1YWxQcm9wZXJ0eUJpbmRpbmdSZWdpc3RyeS5wdXNoKG9kYXRhUHJvcGVydHlCaW5kaW5nKTtcblx0XHRcdFx0XHRcdG9kYXRhUHJvcGVydHlCaW5kaW5nLmF0dGFjaENoYW5nZSgoZXZlbnQ6IE9EYXRhUHJvcGVydHlCaW5kaW5nJENoYW5nZUV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRcdC8vIHJlZnJlc2ggdGhlIGxvY2FsIGFubm90YXRpb24gYmluZGluZyBvbmNlIHJlY29tbWVuZGF0aW9uIGJpbmRpbmcgaXMgdXBkYXRlZC5cblx0XHRcdFx0XHRcdFx0Y29uc3QgcHJvcGVydHlCaW5kaW5nID0gZXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRDb250ZXh0ID0gZXZlbnQuZ2V0U291cmNlKCkuZ2V0Q29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0XHRcdFx0XHRpZiAoY3VycmVudENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjb250ZXh0UmVjb21tZW5kYXRpb25zID0gcHJvcGVydHlCaW5kaW5nLmdldFZhbHVlKCk7XG5cdFx0XHRcdFx0XHRcdFx0TW9kZWxIZWxwZXIuc2V0UmVjb21tZW5kYXRpb25zT25Mb2NhbEFubm90YXRpb25Nb2RlbChjb250ZXh0UmVjb21tZW5kYXRpb25zLCBjdXJyZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0cmVjb21tZW5kYXRpb25iaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHQvLyByZXVlc3RWYWx1ZSB3aWxsIGFkZCB0aGUgcmVjb21tZW5kYXRpb24gcHJvcGVydHkgdG8gdGhlICRzZWxlY3Rcblx0XHRcdFx0XHRcdC8vIGhlbmNlIHdlIGRvIG5vdCBuZWVkIHRvIGFkZCBpdCB0byB0aGUgJHNlbGVjdCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgYmluZGluZyBhdCB2YXJpb3VzIHBsYWNlcyAoZm9ybXMsIHRhYmxlIGV0Yy4pXG5cdFx0XHRcdFx0XHRvZGF0YVByb3BlcnR5QmluZGluZy5yZXF1ZXN0VmFsdWUoKS5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiUmVjb21tZW5kYXRpb25zIGNvdWxkIG5vdCBiZSByZXNvbHZlZFwiLCBlcnJvcik7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdHNldENvbnRleHRPblJlY29tbWVuZGF0aW9uQmluZGluZyhvZGF0YVByb3BlcnR5QmluZGluZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBiaW5kaW5nIGJlY29tZXMgaW52YWxpZCBhbmQgYSBuZXcgYmluZGluZyBpcyBjcmVhdGVkIHNvIHRoZSByZWNvbW1lbmRhdGlvbiBwcm9wZXJ0eSBiaW5kaW5nIGNhbiBiZSBjcmVhdGVkLlxuXHRcdFx0Ly9cblx0XHRcdC8vIEZvciB0aGlzIHdlIG5lZWQgdG8gb3ZlcnJpZGUgdXBkYXRlUmVxdWlyZWQgc28gdGhhdCB0aGUgYmluZGluZyBpcyB1cGRhdGVkIHVudGlsIGl0IGhhcyBub3QgcmVjZWl2ZWQgYSBjb250ZXh0XG5cdFx0XHQvLyBwb3N0IHRoYXQgd2UgZG8gbm90IG5lZWQgdGhlIGJpbmRpbmcgdG8gYmUgdXBkYXRlZC5cblx0XHRcdC8vIElmIHdlIHJlbW92ZSB0aGUgdXBkYXRlUmVxdWlyZWQgb3ZlcnJpZGUgdGhlbiByZWNvbW1lbmRhdGlvbnMgd29yayBmaW5lIGJ5IGR1cmluZyBzYXZlIG9mIGEgbmV3bHkgY3JlYXRlZCBkb2N1bWVudFxuXHRcdFx0Ly8gd2UgZ2V0IGJpbmRpbmcgcmVsYXRlZCBpc3N1ZXMuXG5cdFx0XHQvL1xuXHRcdFx0Ly8gVXBkYXRpbmcgdGhlIGJpbmRpbmcgdG8gcmVjb21tZW5kYXRpb25zIHdpbGwgYmUgZG9uZSBieSBzZXRQcm9wZXJ0eSBvbiB0aGUgbG9jYWxBbm5vdGF0aW9uTW9kZWxcblx0XHRcdC8vIHdoZW4gdGhlIHJlY29tbWVuZGF0aW9uIHByb3BlcnR5IGlzIGFjdHVhbGx5IHVwZGF0ZWQuXG5cdFx0XHRyZWNvbW1lbmRhdGlvbmJpbmRpbmcudXBkYXRlUmVxdWlyZWQgPSBmdW5jdGlvbiAobW9kZWw6IG9iamVjdCk6IGJvb2xlYW4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRDb250ZXh0KCkgPyBtb2RlbCAmJiBtb2RlbCA9PT0gb2RhdGFNb2RlbCA6IG1vZGVsICYmIHRoaXMuZ2V0TW9kZWwoKSA9PT0gbW9kZWw7XG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIHJlY29tbWVuZGF0aW9uYmluZGluZztcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgYmFzZWQgb24gbWV0YWRhdGEgd2hldGhlciBhIGdpdmVuIGJpbmRpbmcgc2hvdWxkIGRlYWwgd2l0aCByZWNvbW1lbmRhdGlvbnMgb3Igbm90LlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIHJlY29tbWVuZGF0aW9uIGlzIGJlaW5nIHJlcXVlc3RlZC5cblx0ICogQHBhcmFtIGJpbmRpbmdQYXRoIEJpbmRpbmcgcGF0aCBmb3Igd2hpY2ggcmVjb21tZW5kYXRpb24gaXMgYmVpbmcgcmVxdWVzdGVkLlxuXHQgKiBAcmV0dXJucyBSZWNvbW1lbmRhdGlvbiBwcm9wZXJ0eSBwYXRoIGZvciB0aGUgZW50aXR5IHJlbGF0ZWQgdG8gdGhlIGNvbnRleHQgYW5kIHdoZXRoZXIgdGhlIGJpbmRpbmdQYXRoIGlzIHJlbGV2YW50IG9yIG5vdCBiYXNlZCBvbiBtZXRhZGF0YS5cblx0ICovXG5cdHZhbGlkYXRlUmVjb21tZW5kYXRpb25CaW5kaW5nUGF0aDogZnVuY3Rpb24gKFxuXHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdGJpbmRpbmdQYXRoOiBzdHJpbmdcblx0KTogeyByZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eTogc3RyaW5nIHwgdW5kZWZpbmVkOyBpc1JlY29tbWVuZGVkUHJvcGVydHk6IGJvb2xlYW4gfSB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGNvbnRleHRNZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dE1ldGFQYXRoKTtcblx0XHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS50YXJnZXRFbnRpdHlUeXBlO1xuXHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5ID0gKHRhcmdldEVudGl0eVR5cGU/LmFubm90YXRpb25zPy5VSSBhcyBFbnRpdHlUeXBlQW5ub3RhdGlvbnNfVUlfV2l0aF9SZWNvbW1lbmRhdGlvbnMpXG5cdFx0XHQ/LlJlY29tbWVuZGF0aW9ucz8ucGF0aDtcblx0XHQvLyBzYW1wbGUgYmluZGluZyAtIFNoaXBwaW5nQ29uZGl0aW9uQCR1aTUuZmUucmVjb21tZW5kYXRpb25zLnBsYWNlaG9sZGVyVmFsdWVcblx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSBiaW5kaW5nUGF0aC5zcGxpdChcIkAkdWk1LmZlLnJlY29tbWVuZGF0aW9uc1wiKVswXTtcblx0XHRjb25zdCBpc1JlY29tbWVuZGVkUHJvcGVydHkgPSB0YXJnZXRFbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuc29tZSgoZW50aXR5UHJvcGVydHkpID0+IHtcblx0XHRcdGlmIChlbnRpdHlQcm9wZXJ0eS5uYW1lID09PSByZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSkge1xuXHRcdFx0XHRyZXR1cm4gKGVudGl0eVByb3BlcnR5Py50YXJnZXRUeXBlIGFzIENvbXBsZXhUeXBlKT8ucHJvcGVydGllcy5zb21lKChwcm9wZXJ0eSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBwcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5Lm5hbWU7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRyZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSxcblx0XHRcdGlzUmVjb21tZW5kZWRQcm9wZXJ0eVxuXHRcdH07XG5cdH0sXG5cdC8qKlxuXHQgKiBVcGRhdGUgcmVjb21tZW5kYXRpb24gY2xpZW50IHNpZGUgaW5zdGFuY2UgYW5ub3RhdGlvbnMuXG5cdCAqIEBwYXJhbSBjb250ZXh0UmVjb21tZW5kYXRpb25zIFVwZGF0ZWQgcmVjb21tZW5kYXRpb25zLlxuXHQgKiBAcGFyYW0gY3VycmVudENvbnRleHQgQ29udGV4dCB3aGVyZSByZWNvbW1lbmRhdGlvbiB3YXMgdXBkYXRlZC5cblx0ICovXG5cdHNldFJlY29tbWVuZGF0aW9uc09uTG9jYWxBbm5vdGF0aW9uTW9kZWw6IGZ1bmN0aW9uIChjb250ZXh0UmVjb21tZW5kYXRpb25zOiBSZWNvbW1lbmRhdGlvbnMsIGN1cnJlbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IHZvaWQge1xuXHRcdGlmIChjb250ZXh0UmVjb21tZW5kYXRpb25zKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHJlY29tbWVuZGVkUHJvcGVydHkgaW4gY29udGV4dFJlY29tbWVuZGF0aW9ucykge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eVJlY29tbWVuZGF0aW9ucyA9IGNvbnRleHRSZWNvbW1lbmRhdGlvbnNbcmVjb21tZW5kZWRQcm9wZXJ0eV07XG5cdFx0XHRcdGNvbnN0IGxvY2FsTW9kZWxQYXRoID0gcmVjb21tZW5kZWRQcm9wZXJ0eTtcblx0XHRcdFx0Y29uc3QgbG9jYWxBbm5vdGF0aW9uTW9kZWwgPSBjdXJyZW50Q29udGV4dC5nZXRNb2RlbCgpLmdldExvY2FsQW5ub3RhdGlvbk1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IHR5cGVBaGVhZFZhbHVlcyA9IFtdO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHByb3BlcnR5UmVjb21tZW5kYXRpb24gb2YgcHJvcGVydHlSZWNvbW1lbmRhdGlvbnMpIHtcblx0XHRcdFx0XHRpZiAocHJvcGVydHlSZWNvbW1lbmRhdGlvbi5SZWNvbW1lbmRlZEZpZWxkSXNTdWdnZXN0aW9uKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBwbGFjZWhvbGRlclZhbHVlQW5ub3RhdGlvblBhdGggPSBjdXJyZW50Q29udGV4dC5nZXRQYXRoKFxuXHRcdFx0XHRcdFx0XHRsb2NhbE1vZGVsUGF0aCArIFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zLnBsYWNlaG9sZGVyVmFsdWVcIlxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyRGVzY3JpcHRpb25Bbm5vdGF0aW9uUGF0aCA9IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoXG5cdFx0XHRcdFx0XHRcdGxvY2FsTW9kZWxQYXRoICsgXCJAJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMucGxhY2Vob2xkZXJEZXNjcmlwdGlvblwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0bG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyVmFsdWVBbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlSZWNvbW1lbmRhdGlvbi5SZWNvbW1lbmRlZEZpZWxkVmFsdWUsXG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRmYWxzZVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRwbGFjZWhvbGRlckRlc2NyaXB0aW9uQW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5UmVjb21tZW5kYXRpb24uUmVjb21tZW5kZWRGaWVsZERlc2NyaXB0aW9uLFxuXHRcdFx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHQvLyBzZXQgcGxhY2Vob2xkZXIgZGVzY3JpcHRpb24gYW5kIHZhbHVlc1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvL2xvY2FsQW5ub3RhdGlvbk1vZGVsLlxuXHRcdFx0XHRcdC8vIHB1c2ggdG9wIDMgcmVjb21tZW5kYXRpb24gdmFsdWVzXG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5UmVjb21tZW5kYXRpb24uUmVjb21tZW5kZWRGaWVsZFZhbHVlKSB7XG5cdFx0XHRcdFx0XHR0eXBlQWhlYWRWYWx1ZXMucHVzaChwcm9wZXJ0eVJlY29tbWVuZGF0aW9uLlJlY29tbWVuZGVkRmllbGRWYWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghcHJvcGVydHlSZWNvbW1lbmRhdGlvbnMgfHwgIXByb3BlcnR5UmVjb21tZW5kYXRpb25zLmxlbmd0aCkge1xuXHRcdFx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyVmFsdWVBbm5vdGF0aW9uUGF0aCA9IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoXG5cdFx0XHRcdFx0XHRsb2NhbE1vZGVsUGF0aCArIFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zLnBsYWNlaG9sZGVyVmFsdWVcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Y29uc3QgcGxhY2Vob2xkZXJEZXNjcmlwdGlvbkFubm90YXRpb25QYXRoID0gY3VycmVudENvbnRleHQuZ2V0UGF0aChcblx0XHRcdFx0XHRcdGxvY2FsTW9kZWxQYXRoICsgXCJAJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMucGxhY2Vob2xkZXJEZXNjcmlwdGlvblwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShwbGFjZWhvbGRlclZhbHVlQW5ub3RhdGlvblBhdGgsIG51bGwsIGN1cnJlbnRDb250ZXh0LCBmYWxzZSk7XG5cdFx0XHRcdFx0bG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkocGxhY2Vob2xkZXJEZXNjcmlwdGlvbkFubm90YXRpb25QYXRoLCBcIlwiLCBjdXJyZW50Q29udGV4dCwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0LmdldFBhdGgobG9jYWxNb2RlbFBhdGggKyBcIkAkdWk1LmZlLnJlY29tbWVuZGF0aW9ucy50eXBlQWhlYWRWYWx1ZXNcIiksXG5cdFx0XHRcdFx0dHlwZUFoZWFkVmFsdWVzLFxuXHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdGZhbHNlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KGN1cnJlbnRDb250ZXh0LmdldFBhdGgoXCJyZWNvbW1lbmRhdGlvbkNvbnRleHRcIiksIGN1cnJlbnRDb250ZXh0KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBGZXRjaGVzIHRoZSBhbHRlcm5hdGUga2V5cyBmcm9tIGVudGl0eXR5cGUgYW5kIGVudGl0eVNldC5cblx0ICogQHBhcmFtIGVudGl0eVR5cGUgRGF0YW1vZGVsIG9iamVjdCBvZiBlbnRpdHlUeXBlXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRGF0YW1vZGVsIG9iamVjdCBvZiBlbnRpdHlTZXRcblx0ICogQHJldHVybnMgQW4gYXJyYXkgb2YgYWx0ZXJuYXRlIGtleXNcblx0ICovXG5cdGdldEFsdGVybmF0ZUtleXM6IChlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBlbnRpdHlTZXQ6IEVudGl0eVNldCk6IHN0cmluZ1tdID0+IHtcblx0XHRjb25zdCBhbHRlcm5hdGVLZXlzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IF9mZXRjaEtleXMgPSAoZW50aXR5VHlwZU9yU2V0OiBFbnRpdHlTZXQgfCBFbnRpdHlUeXBlKTogdm9pZCA9PiB7XG5cdFx0XHRlbnRpdHlUeXBlT3JTZXQ/LmFubm90YXRpb25zPy5Db3JlPy5BbHRlcm5hdGVLZXlzPy5mb3JFYWNoKChhbHRlcm5hdGVLZXk6IEFsdGVybmF0ZUtleSkgPT4ge1xuXHRcdFx0XHRhbHRlcm5hdGVLZXkuS2V5LmZvckVhY2goKGtleTogUHJvcGVydHlSZWYpID0+IHtcblx0XHRcdFx0XHRhbHRlcm5hdGVLZXlzLnB1c2goa2V5Lk5hbWUudmFsdWUpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH07XG5cdFx0X2ZldGNoS2V5cyhlbnRpdHlTZXQpO1xuXHRcdGlmICghYWx0ZXJuYXRlS2V5cy5sZW5ndGgpIHtcblx0XHRcdF9mZXRjaEtleXMoZW50aXR5VHlwZSk7XG5cdFx0fVxuXHRcdHJldHVybiBhbHRlcm5hdGVLZXlzO1xuXHR9XG59O1xuXG50eXBlIFJlY29tbWVuZGF0aW9ucyA9IFJlY29yZDxzdHJpbmcsIFJlY29tbWVuZGF0aW9uRGV0YWlsc1tdPjtcbnR5cGUgUmVjb21tZW5kYXRpb25EZXRhaWxzID0ge1xuXHRSZWNvbW1lbmRlZEZpZWxkVmFsdWU6IHN0cmluZztcblx0UmVjb21tZW5kZWRGaWVsZElzU3VnZ2VzdGlvbjogYm9vbGVhbjtcblx0UmVjb21tZW5kZWRGaWVsZERlc2NyaXB0aW9uOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBJbnRlcm5hbE1vZGVsQ29udGV4dCA9IHsgZ2V0TW9kZWwoKTogSlNPTk1vZGVsIH0gJiBCYXNlQ29udGV4dCAmIHtcblx0XHRzZXRQcm9wZXJ0eShzUGF0aDogc3RyaW5nLCB2VmFsdWU6IHVua25vd24pOiB2b2lkO1xuXHR9O1xuXG5leHBvcnQgZGVmYXVsdCBNb2RlbEhlbHBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztFQUFBO0VBa0NBO0VBQ0E7RUFDQTs7RUFPQSxNQUFNQSxXQUFXLEdBQUc7SUFDbkI7SUFDQTtJQUNBO0lBQ0FDLHlCQUF5QixFQUFFLEtBQUs7SUFDaEM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDQyx3QkFBd0IsRUFBRSxTQUFBQSxDQUFVQyxTQUF5QixFQUFXO01BQ3ZFLE1BQU1DLGVBQWUsR0FBR0QsU0FBUyxDQUFDRSxTQUFTLENBQUMsR0FBRyxDQUFDO01BQ2hELEtBQUssTUFBTUMsYUFBYSxJQUFJRixlQUFlLEVBQUU7UUFDNUMsSUFDQ0EsZUFBZSxDQUFDRSxhQUFhLENBQUMsQ0FBQ0MsS0FBSyxLQUFLLFdBQVcsSUFDcERKLFNBQVMsQ0FBQ0UsU0FBUyxDQUFDLElBQUlDLGFBQWEseURBQXlELENBQUMsRUFDOUY7VUFDRCxPQUFPLElBQUk7UUFDWjtNQUNEO01BQ0EsT0FBTyxLQUFLO0lBQ2IsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDRSxnQkFBZ0IsRUFBRSxTQUFBQSxDQUFVTCxTQUF5QixFQUFFTSxJQUFZLEVBQVc7TUFDN0UsTUFBTUMsV0FBVyxHQUFHUCxTQUFTLENBQUNRLGNBQWMsQ0FBQ0YsSUFBSSxDQUFDO01BQ2xELE1BQU1HLFVBQVUsR0FBR0MsMkJBQTJCLENBQXdCSCxXQUFXLENBQUM7TUFDbEYsT0FBTyxJQUFJLENBQUNJLDBCQUEwQixDQUFDRixVQUFVLENBQUM7SUFDbkQsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7SUFDQ0UsMEJBQTBCLEVBQUUsU0FBQUEsQ0FBVUMsbUJBQWlELEVBQVc7TUFBQSxJQUFBQyxxQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQTtNQUNqRyxNQUFNQyxnQkFBZ0IsR0FBR1IsbUJBQW1CLENBQUNTLGVBQTRCO01BQ3pFLE1BQU1DLFlBQVksR0FBR3pCLFdBQVcsQ0FBQzBCLFdBQVcsQ0FBQ0gsZ0JBQWdCLENBQUM7TUFDOUQsTUFBTUksWUFBWSxHQUFHM0IsV0FBVyxDQUFDNEIsV0FBVyxDQUFDTCxnQkFBZ0IsQ0FBQztNQUM5RCxNQUFNTSxrQ0FBa0MsR0FDdkNDLG9CQUFvQixDQUFDZixtQkFBbUIsQ0FBQ2dCLFlBQVksQ0FBQyxLQUFBZixxQkFBQSxHQUN0REQsbUJBQW1CLENBQUNnQixZQUFZLGNBQUFmLHFCQUFBLGVBQWhDQSxxQkFBQSxDQUFrQ2dCLGNBQWMsS0FDL0MsQ0FBQWYsc0JBQUEsR0FBQ0YsbUJBQW1CLENBQUNrQixpQkFBaUIsY0FBQWhCLHNCQUFBLGdCQUFBQyxzQkFBQSxHQUF0Q0Qsc0JBQUEsQ0FBc0RpQixXQUFXLGNBQUFoQixzQkFBQSxnQkFBQUMsc0JBQUEsR0FBakVELHNCQUFBLENBQW1FaUIsTUFBTSxjQUFBaEIsc0JBQUEsZUFBekVBLHNCQUFBLENBQTJFaUIsU0FBUyxLQUFBaEIsc0JBQUEsR0FDbkZMLG1CQUFtQixDQUFDa0IsaUJBQWlCLGNBQUFiLHNCQUFBLGdCQUFBQyxzQkFBQSxHQUF0Q0Qsc0JBQUEsQ0FBc0RjLFdBQVcsY0FBQWIsc0JBQUEsZ0JBQUFDLHNCQUFBLEdBQWpFRCxzQkFBQSxDQUFtRWMsTUFBTSxjQUFBYixzQkFBQSxlQUF6RUEsc0JBQUEsQ0FBMkVlLFNBQVMsQ0FBQyxHQUNuRixJQUFJLEdBQ0osS0FBSztNQUVULE9BQU9aLFlBQVksSUFBSUUsWUFBWSxJQUFLLENBQUNKLGdCQUFnQixJQUFJTSxrQ0FBbUM7SUFDakcsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NTLDZCQUE2QixFQUFFLFNBQUFBLENBQVVDLFVBQW1CLEVBQUVDLGlCQUF3QyxFQUFXO01BQ2hILElBQUksQ0FBQ3hDLFdBQVcsQ0FBQ0MseUJBQXlCLEVBQUU7UUFBQSxJQUFBd0MscUJBQUE7UUFDM0MsTUFBTUMsVUFBVSxHQUFJLENBQUFGLGlCQUFpQixhQUFqQkEsaUJBQWlCLHdCQUFBQyxxQkFBQSxHQUFqQkQsaUJBQWlCLENBQUVHLE9BQU8sY0FBQUYscUJBQUEsdUJBQTFCQSxxQkFBQSxDQUE0QkcsUUFBUSxDQUFDLENBQUMsS0FBSUwsVUFBNkI7UUFDM0YsTUFBTU0sZ0JBQWdCLEdBQUdILFVBQVUsQ0FBQ3JDLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDbEQsS0FBSyxNQUFNeUMsVUFBVSxJQUFJRCxnQkFBZ0IsRUFBRTtVQUMxQyxJQUNDQSxnQkFBZ0IsQ0FBQ0MsVUFBVSxDQUFDLENBQUN2QyxLQUFLLEtBQUssV0FBVyxJQUNsRG1DLFVBQVUsQ0FBQ3JDLFNBQVMsQ0FBQyxJQUFJeUMsVUFBVSx1REFBdUQsQ0FBQyxFQUMxRjtZQUNELE9BQU8sSUFBSTtVQUNaO1FBQ0Q7TUFDRDtNQUNBLE9BQU8sS0FBSztJQUNiLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLGdCQUFnQixFQUFFLFNBQUFBLENBQVVDLFFBQWlCLEVBQXNCO01BQ2xFLE1BQU1OLFVBQVUsR0FBR00sUUFBUSxDQUFDSixRQUFRLENBQUMsQ0FBQyxDQUFDSyxZQUFZLENBQUMsQ0FBQztNQUNyRCxNQUFNQyxXQUFXLEdBQUcsU0FBQUEsQ0FBVUMsS0FBYSxFQUFFQyxLQUFpQixFQUE2QztRQUFBLElBQUFDLFlBQUE7UUFBQSxJQUEzQ0MsY0FBYyxHQUFBQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFJO1FBQ3BGLE1BQU1HLGNBQWMsR0FBR0osY0FBYyxHQUFHSCxLQUFLLElBQUFFLFlBQUEsR0FBRyxJQUFJTSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUNDLElBQUksQ0FBQ1QsS0FBSyxDQUFDLGNBQUFFLFlBQUEsdUJBQWxDQSxZQUFBLENBQXFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekYsSUFBSUssY0FBYyxJQUFJQSxjQUFjLEtBQUssR0FBRyxFQUFFO1VBQUEsSUFBQUcscUJBQUEsRUFBQUMsc0JBQUE7VUFDN0MsTUFBTUMsV0FBVyxHQUFHckIsVUFBVSxDQUFDc0IsV0FBVyxDQUFDTixjQUFjLENBQUM7VUFDMUQsTUFBTU8sVUFBVSxHQUFHQyxrQkFBa0IsQ0FBQ3JELDJCQUEyQixDQUFDNkIsVUFBVSxDQUFDeUIsVUFBVSxDQUFDSixXQUFXLENBQUMsQ0FBQztVQUNyRyxLQUFBRixxQkFBQSxHQUFLSSxVQUFVLENBQUN6QyxlQUFlLGNBQUFxQyxxQkFBQSxnQkFBQUMsc0JBQUEsR0FBM0JELHFCQUFBLENBQTJDM0IsV0FBVyxDQUFDQyxNQUFNLGNBQUEyQixzQkFBQSxlQUE3REEsc0JBQUEsQ0FBK0QxQixTQUFTLEVBQUU7WUFDN0UsT0FBT3NCLGNBQWM7VUFDdEI7VUFDQSxPQUFPUixXQUFXLENBQUNRLGNBQWMsRUFBRU4sS0FBSyxFQUFFLEtBQUssQ0FBQztRQUNqRDtRQUNBLE9BQU9LLFNBQVM7TUFDakIsQ0FBQztNQUNELE9BQU9QLFdBQVcsQ0FBQ0YsUUFBUSxDQUFDb0IsT0FBTyxDQUFDLENBQUMsRUFBRXBCLFFBQVEsQ0FBQ0osUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDeUIsaUJBQWlCLEVBQUUsU0FBQUEsQ0FBVXJCLFFBQWlCLEVBQXNCO01BQ25FLE1BQU1OLFVBQVUsR0FBR00sUUFBUSxDQUFDSixRQUFRLENBQUMsQ0FBQyxDQUFDSyxZQUFZLENBQUMsQ0FBQztNQUNyRCxNQUFNQyxXQUFXLEdBQUcsU0FBQUEsQ0FBVUMsS0FBYSxFQUFFQyxLQUFpQixFQUE2QztRQUFBLElBQUFrQixhQUFBO1FBQUEsSUFBM0NoQixjQUFjLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLElBQUk7UUFDcEYsTUFBTUcsY0FBYyxHQUFHSixjQUFjLEdBQUdILEtBQUssSUFBQW1CLGFBQUEsR0FBRyxJQUFJWCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUNDLElBQUksQ0FBQ1QsS0FBSyxDQUFDLGNBQUFtQixhQUFBLHVCQUFsQ0EsYUFBQSxDQUFxQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLElBQUlaLGNBQWMsSUFBSUEsY0FBYyxLQUFLLEdBQUcsRUFBRTtVQUFBLElBQUFhLHNCQUFBLEVBQUFDLHNCQUFBLEVBQUFDLHNCQUFBO1VBQzdDLE1BQU1WLFdBQVcsR0FBR3JCLFVBQVUsQ0FBQ3NCLFdBQVcsQ0FBQ04sY0FBYyxDQUFDO1VBQzFELE1BQU1PLFVBQVUsR0FBR0Msa0JBQWtCLENBQUNyRCwyQkFBMkIsQ0FBQzZCLFVBQVUsQ0FBQ3lCLFVBQVUsQ0FBQ0osV0FBVyxDQUFDLENBQUM7VUFDckcsSUFDQ0UsVUFBVSxDQUFDaEMsaUJBQWlCLEtBQUtnQyxVQUFVLENBQUN6QyxlQUFlLEtBQUErQyxzQkFBQSxHQUMxRE4sVUFBVSxDQUFDekMsZUFBZSxjQUFBK0Msc0JBQUEsZ0JBQUFDLHNCQUFBLEdBQTNCRCxzQkFBQSxDQUEyQ3JDLFdBQVcsY0FBQXNDLHNCQUFBLGdCQUFBQyxzQkFBQSxHQUF0REQsc0JBQUEsQ0FBd0RFLE9BQU8sY0FBQUQsc0JBQUEsZUFBL0RBLHNCQUFBLENBQWlFRSxzQkFBc0IsRUFDdEY7WUFDRCxPQUFPakIsY0FBYztVQUN0QjtVQUNBLE9BQU9SLFdBQVcsQ0FBQ1EsY0FBYyxFQUFFTixLQUFLLEVBQUUsS0FBSyxDQUFDO1FBQ2pEO1FBQ0EsT0FBT0ssU0FBUztNQUNqQixDQUFDO01BQ0QsT0FBT1AsV0FBVyxDQUFDRixRQUFRLENBQUNvQixPQUFPLENBQUMsQ0FBQyxFQUFFcEIsUUFBUSxDQUFDSixRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NnQyxrQkFBa0IsRUFBRSxTQUFBQSxDQUFVNUIsUUFBcUIsRUFBVTtNQUM1RCxNQUFNRyxLQUFLLEdBQUdILFFBQVEsQ0FBQ29CLE9BQU8sQ0FBQyxDQUFDO01BQ2hDLElBQ0NwQixRQUFRLENBQUMzQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssV0FBVyxJQUMzQzJDLFFBQVEsQ0FBQzNDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLElBQ3hDMkMsUUFBUSxDQUFDM0MsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLFFBQVEsRUFDekM7UUFDRCxPQUFPOEMsS0FBSztNQUNiO01BQ0EsTUFBTTBCLGNBQWMsR0FBRzdFLFdBQVcsQ0FBQzhFLGdCQUFnQixDQUFDM0IsS0FBSyxDQUFDO01BQzFELE9BQU8sSUFBSUgsUUFBUSxDQUFDM0MsU0FBUyxDQUFDd0UsY0FBYyxDQUFDLEVBQUU7SUFDaEQsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDQyxnQkFBZ0IsRUFBRSxTQUFBQSxDQUFVckUsSUFBWSxFQUFFc0UsY0FBK0IsRUFBVTtNQUNsRixJQUFJQyxhQUFhLEdBQUcsRUFBRTtNQUN0QixJQUFJLENBQUNELGNBQWMsRUFBRTtRQUNwQjtRQUNBQyxhQUFhLEdBQUcsSUFBSXZFLElBQUksQ0FBQ3dFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ0MsTUFBTSxDQUFDbEYsV0FBVyxDQUFDbUYsdUJBQXVCLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLDhCQUE4QixDQUFDLEVBQUU7TUFDdkgsQ0FBQyxNQUFNO1FBQ047UUFDQSxNQUFNQyxTQUFTLEdBQUc1RSxJQUFJLENBQUN3RSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUNDLE1BQU0sQ0FBQ2xGLFdBQVcsQ0FBQ21GLHVCQUF1QixDQUFDO1FBQzdFLElBQUlFLFNBQVMsQ0FBQzdCLE1BQU0sR0FBRyxDQUFDLEVBQUU7VUFDekIsTUFBTThCLGlCQUFpQixHQUFHO1lBQ3pCQyxXQUFXLEVBQUUsR0FBRztZQUNoQkMscUJBQXFCLEVBQUU7VUFDeEIsQ0FBQztVQUVELE1BQU1DLFVBQVUsR0FBR0osU0FBUyxDQUFDSyxNQUFNLENBQ2xDLENBQUNDLHFCQUE2RSxFQUFFQyxRQUFnQixFQUFFQyxHQUFXLEtBQUs7WUFDakgsTUFBTUMsU0FBUyxHQUFJLENBQUMsQ0FBQ0QsR0FBRyxJQUFJLDhCQUE4QixJQUFLLEVBQUU7WUFDakUsSUFBSTtjQUFFTixXQUFXO2NBQUVDO1lBQXNCLENBQUMsR0FBR0cscUJBQXFCO1lBQ2xFLE1BQU1JLFFBQVEsR0FBR1IsV0FBVyxHQUFHTyxTQUFTO1lBQ3hDLE1BQU1FLGVBQWUsR0FBR2pCLGNBQWMsQ0FBQzFFLFNBQVMsQ0FBQzBGLFFBQVEsQ0FBQztZQUMxRCxNQUFNRSxxQkFBcUIsR0FBR1QscUJBQXFCLEdBQUcsR0FBR0EscUJBQXFCLElBQUlJLFFBQVEsRUFBRSxHQUFHQSxRQUFRO1lBQ3ZHLElBQ0NJLGVBQWUsSUFDZkUsTUFBTSxDQUFDQyxJQUFJLENBQUNILGVBQWUsQ0FBQyxDQUFDeEMsTUFBTSxHQUFHLENBQUMsSUFDdkN3QyxlQUFlLENBQUNJLGNBQWMsQ0FBQ0gscUJBQXFCLENBQUMsRUFDcEQ7Y0FDRFYsV0FBVyxHQUFHUSxRQUFRLEdBQUdFLHFCQUFxQixDQUFDSSxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQztjQUNsRWIscUJBQXFCLEdBQUcsRUFBRTtZQUMzQixDQUFDLE1BQU07Y0FDTkEscUJBQXFCLElBQUlBLHFCQUFxQixHQUFHLElBQUlJLFFBQVEsRUFBRSxHQUFHQSxRQUFRO1lBQzNFO1lBQ0EsT0FBTztjQUFFTCxXQUFXO2NBQUVDO1lBQXNCLENBQUM7VUFDOUMsQ0FBQyxFQUNERixpQkFDRCxDQUFDO1VBRUROLGFBQWEsR0FBR1MsVUFBVSxDQUFDRixXQUFXO1FBQ3ZDLENBQUMsTUFBTTtVQUNOUCxhQUFhLEdBQUcsSUFBSUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ25DO01BQ0Q7TUFFQSxPQUFPTCxhQUFhO0lBQ3JCLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NzQixnQ0FBZ0MsRUFBRSxTQUFBQSxDQUFVQyxVQUFvQyxFQUFzQjtNQUNyRyxPQUFPQSxVQUFVLElBQUlBLFVBQVUsQ0FBQ0MsS0FBSyxHQUFHLG9CQUFvQkQsVUFBVSxDQUFDQyxLQUFLLElBQUksR0FBRy9DLFNBQVM7SUFDN0YsQ0FBQztJQUVEMEIsdUJBQXVCLEVBQUUsU0FBQUEsQ0FBVXNCLFNBQWlCLEVBQVc7TUFDOUQsT0FBT0EsU0FBUyxLQUFLLEVBQUUsSUFBSUEsU0FBUyxLQUFLLDRCQUE0QjtJQUN0RSxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7O0lBRUNDLHdCQUF3QixFQUFFLFNBQUFBLENBQVVDLGNBQXlCLEVBQVE7TUFDcEUsTUFBTUMsYUFBYSxHQUFHRCxjQUFjLENBQUNFLFdBQVc7TUFDaERGLGNBQWMsQ0FBQ0UsV0FBVyxHQUFHLFVBQzVCMUQsS0FBYSxFQUNiUixPQUFvQixFQUNwQm1FLFdBQStCLEVBQy9CQyxPQUEyQixFQUNWO1FBQ2pCLE1BQU1DLGNBQWMsR0FBR0osYUFBYSxDQUFDSyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM5RCxLQUFLLEVBQUVSLE9BQU8sRUFBRW1FLFdBQVcsRUFBRUMsT0FBTyxDQUFDLENBQUM7UUFDeEYsTUFBTUcsaUJBQWlCLEdBQUdGLGNBQWMsQ0FBQ0csZUFBZTtRQUV4REgsY0FBYyxDQUFDRyxlQUFlLEdBQUcsWUFBZ0M7VUFDaEUsTUFBTUMsYUFBYSxHQUFHRixpQkFBaUIsQ0FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQztVQUNuRCxJQUFJRyxhQUFhLEVBQUU7WUFDbEJBLGFBQWEsQ0FBQ0MsV0FBVyxHQUFHLFVBQVVDLFlBQW9CLEVBQUVDLEtBQWMsRUFBUTtjQUNqRixJQUFJLElBQUksQ0FBQ2xILFNBQVMsQ0FBQyxDQUFDLEtBQUtvRCxTQUFTLEVBQUU7Z0JBQ25DO2dCQUNBLElBQUksQ0FBQ2IsUUFBUSxDQUFDLENBQUMsQ0FBQ3lFLFdBQVcsQ0FBQyxJQUFJLENBQUNqRCxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2NBQ2hEO2NBQ0EsTUFBTW9ELGlCQUFpQixHQUFHRixZQUFZLENBQUNyQyxLQUFLLENBQUMsR0FBRyxDQUFDO2NBQ2pEO2NBQ0EsS0FBSyxJQUFJd0MsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHRCxpQkFBaUIsQ0FBQ2hFLE1BQU0sR0FBRyxDQUFDLEVBQUVpRSxDQUFDLEVBQUUsRUFBRTtnQkFDdEQsSUFBSSxJQUFJLENBQUNwSCxTQUFTLENBQUNtSCxpQkFBaUIsQ0FBQ0MsQ0FBQyxDQUFDLENBQUMsS0FBS2hFLFNBQVMsRUFBRTtrQkFDdkQ7a0JBQ0EsSUFBSSxDQUFDYixRQUFRLENBQUMsQ0FBQyxDQUFDeUUsV0FBVyxDQUFDLElBQUksQ0FBQ2pELE9BQU8sQ0FBQ29ELGlCQUFpQixDQUFDQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNwRTtjQUNEO2NBQ0EsSUFBSSxDQUFDN0UsUUFBUSxDQUFDLENBQUMsQ0FBQ3lFLFdBQVcsQ0FBQ0MsWUFBWSxFQUFFQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1lBQ3ZELENBQUM7VUFDRjtVQUNBLE9BQU9ILGFBQWE7UUFDckIsQ0FBQztRQUNELE9BQU9KLGNBQWM7TUFDdEIsQ0FBQztJQUNGLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7SUFFQ1Usa0JBQWtCLEVBQUUsU0FBQUEsQ0FBVUMsT0FBa0IsRUFBRUMsT0FBNEQsRUFBUTtNQUNySCxNQUFNQyxhQUFhLEdBQUdGLE9BQU8sQ0FBQ04sV0FBVztNQUN6Q00sT0FBTyxDQUFDTixXQUFXLEdBQUcsVUFDckI1RyxJQUFZLEVBQ1o4RyxLQUFjLEVBQ2Q1RSxPQUFnQyxFQUNoQ21GLFdBQWdDLEVBQ3RCO1FBQ1YsSUFBSXJILElBQUksS0FBSyxhQUFhLEVBQUU7VUFDM0JrSCxPQUFPLENBQUNOLFdBQVcsQ0FBQyxXQUFXLEVBQUVFLEtBQUssR0FBR0ssT0FBTyxDQUFDRyxRQUFRLENBQUNDLFFBQVEsR0FBR0osT0FBTyxDQUFDRyxRQUFRLENBQUNFLE9BQU8sRUFBRXRGLE9BQU8sRUFBRW1GLFdBQVcsQ0FBQztRQUNySDtRQUNBLE9BQU9ELGFBQWEsQ0FBQ1osS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDeEcsSUFBSSxFQUFFOEcsS0FBSyxFQUFFNUUsT0FBTyxFQUFFbUYsV0FBVyxDQUFDLENBQUM7TUFDdEUsQ0FBQztJQUNGLENBQUM7SUFFREksb0JBQW9CLEVBQUUsU0FBQUEsQ0FBVUMsU0FBK0MsRUFBUTtNQUN0RixNQUFNQyxXQUFXLEdBQUdELFNBQVMsQ0FBQ0UsVUFBVTtNQUN4Q0YsU0FBUyxDQUFDRSxVQUFVLEdBQUcsVUFBVWxGLEtBQWEsRUFBRUgsUUFBa0IsRUFBVztRQUM1RSxJQUFJRyxLQUFLLEtBQUtNLFNBQVMsSUFBSU4sS0FBSyxLQUFLLEVBQUUsRUFBRTtVQUN4Q0EsS0FBSyxHQUFHLEdBQUc7UUFDWjtRQUNBLE9BQU9pRixXQUFXLENBQUNuQixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM5RCxLQUFLLEVBQUVILFFBQVEsQ0FBQyxDQUFDO01BQ2xELENBQUM7SUFDRixDQUFDO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDc0Ysd0JBQXdCLEVBQUUsU0FBQUEsQ0FBVTVGLFVBQTBCLEVBQXVCO01BQ3BGLElBQUksQ0FBQ0EsVUFBVSxFQUFFO1FBQ2hCLE9BQU9lLFNBQVM7TUFDakI7TUFDQSxNQUFNOEUsZ0JBQWdCLEdBQUc3RixVQUFVLENBQUNyQyxTQUFTLENBQUMsNkNBQTZDLENBQUM7TUFDNUY7TUFDQSxPQUFPa0ksZ0JBQWdCLEdBQUdBLGdCQUFnQixDQUFDQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSTtJQUM1RSxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDQyxxQkFBcUIsRUFBRSxTQUFBQSxDQUFVekYsUUFBaUIsRUFBVTtNQUMzRCxNQUFNMEYsTUFBTSxHQUFHMUYsUUFBUSxDQUFDSixRQUFRLENBQUMsQ0FBQztRQUNqQ0YsVUFBVSxHQUFHZ0csTUFBTSxDQUFDekYsWUFBWSxDQUFDLENBQUM7UUFDbENFLEtBQUssR0FBR0gsUUFBUSxDQUFDb0IsT0FBTyxDQUFDLENBQUM7TUFDM0IsT0FBTzFCLFVBQVUsSUFBSVMsS0FBSyxJQUFJVCxVQUFVLENBQUNzQixXQUFXLENBQUNiLEtBQUssQ0FBQztJQUM1RCxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDd0Ysb0JBQW9CLEVBQUUsU0FBQUEsQ0FBVUMsV0FBbUIsRUFBVTtNQUM1RCxJQUFJQyxpQkFBaUIsR0FBRyxFQUFFO01BQzFCLE1BQU1DLE1BQU0sR0FBR0YsV0FBVyxHQUFHQSxXQUFXLENBQUMzRCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtNQUN4RCxJQUFJNkQsTUFBTSxDQUFDdEYsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN0QnFGLGlCQUFpQixHQUFHQyxNQUFNLENBQUMsQ0FBQyxDQUFDO01BQzlCO01BQ0EsT0FBT0QsaUJBQWlCO0lBQ3pCLENBQUM7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0UsaUNBQWlDLEVBQUUsU0FBQUEsQ0FBVUMsS0FBYSxFQUFFQyxZQUF1QyxFQUFVO01BQzVHLE1BQU12RyxVQUFVLEdBQUdzRyxLQUFLLENBQUNwRyxRQUFRLENBQUMsQ0FBQyxDQUFDSyxZQUFZLENBQUMsQ0FBQztNQUNsRCxJQUFJaUcsU0FBUztNQUViLElBQUksT0FBT0QsWUFBWSxLQUFLLFFBQVEsRUFBRTtRQUNyQyxJQUFJQSxZQUFZLENBQUNFLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtVQUNqQztVQUNBRCxTQUFTLEdBQUd4RyxVQUFVLENBQUNzQixXQUFXLENBQUNpRixZQUFZLENBQUM7UUFDakQsQ0FBQyxNQUFNO1VBQ047VUFDQSxNQUFNRyxlQUFlLEdBQUdKLEtBQUssQ0FBQ0ssaUJBQWlCLENBQUMsQ0FBQztVQUNqRCxNQUFNQyxnQkFBZ0IsR0FBR0YsZUFBZSxDQUFDaEYsT0FBTyxDQUFDLENBQUM7VUFDbEQ4RSxTQUFTLEdBQUd4RyxVQUFVLENBQUNzQixXQUFXLENBQUMsR0FBR3NGLGdCQUFnQixJQUFJTCxZQUFZLEVBQUUsQ0FBQztRQUMxRTtNQUNELENBQUMsTUFBTTtRQUNOO1FBQ0EsTUFBTU0sUUFBUSxHQUFHTixZQUFZO1FBQzdCLE1BQU1PLFlBQVksR0FBR0QsUUFBUSxDQUFDRSxjQUFjLENBQUMsQ0FBQztRQUM5QyxJQUFJRixRQUFRLEtBQUtDLFlBQVksRUFBRTtVQUM5QjtVQUNBTixTQUFTLEdBQUd4RyxVQUFVLENBQUNzQixXQUFXLENBQUN1RixRQUFRLENBQUNuRixPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsTUFBTTtVQUNOO1VBQ0EsTUFBTXNGLGdCQUFnQixHQUFHRixZQUFZLENBQUVwRixPQUFPLENBQUMsQ0FBQztVQUNoRCxNQUFNdUYsYUFBYSxHQUFHSixRQUFRLENBQUNuRixPQUFPLENBQUMsQ0FBQztVQUN4QzhFLFNBQVMsR0FBR3hHLFVBQVUsQ0FBQ3NCLFdBQVcsQ0FBQyxHQUFHMEYsZ0JBQWdCLElBQUlDLGFBQWEsRUFBRSxDQUFDO1FBQzNFO01BQ0Q7TUFDQSxPQUFPVCxTQUFTO0lBQ2pCLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0N4SCxXQUFXLEVBQUUsU0FBQUEsQ0FBVWtJLFNBQXNELEVBQVc7TUFDdkYsT0FBTyxJQUFJLENBQUNDLFlBQVksQ0FBQ0QsU0FBUyxDQUFDLEtBQUtuRyxTQUFTO0lBQ2xELENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0M3QixXQUFXLEVBQUUsU0FBQUEsQ0FBVWdJLFNBQXNELEVBQVc7TUFDdkYsT0FBTyxJQUFJLENBQUNFLFlBQVksQ0FBQ0YsU0FBUyxDQUFDLEtBQUtuRyxTQUFTO0lBQ2xELENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NzRyxRQUFRLEVBQUUsU0FBQUEsQ0FBVUgsU0FBNEMsRUFBVztNQUMxRSxPQUFPLElBQUksQ0FBQ0ksZ0JBQWdCLENBQUNKLFNBQVMsQ0FBQyxLQUFLbkcsU0FBUztJQUN0RCxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0N3RyxjQUFjLEVBQUUsU0FBQUEsQ0FBVUwsU0FBNEMsRUFBRU0sVUFBc0IsRUFBNEI7TUFDekgsSUFBSUMsV0FBVyxDQUFDUCxTQUFTLENBQUMsRUFBRTtRQUFBLElBQUFRLHFCQUFBLEVBQUFDLHFCQUFBO1FBQzNCLE9BQU8sRUFBQUQscUJBQUEsR0FBQVIsU0FBUyxDQUFDMUgsV0FBVyxDQUFDb0ksRUFBRSxjQUFBRixxQkFBQSx1QkFBeEJBLHFCQUFBLENBQTBCRyxZQUFZLE1BQUlMLFVBQVUsYUFBVkEsVUFBVSx3QkFBQUcscUJBQUEsR0FBVkgsVUFBVSxDQUFFaEksV0FBVyxDQUFDb0ksRUFBRSxjQUFBRCxxQkFBQSx1QkFBMUJBLHFCQUFBLENBQTRCRSxZQUFZO01BQzFGO0lBQ0QsQ0FBQztJQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7SUFDQ1YsWUFBWSxFQUFFLFNBQUFBLENBQVVELFNBQXNELEVBQXlCO01BQUEsSUFBQVksc0JBQUE7TUFDdEcsT0FBT0wsV0FBVyxDQUFDUCxTQUFTLENBQUMsSUFBQVksc0JBQUEsR0FBR1osU0FBUyxDQUFDMUgsV0FBVyxDQUFDQyxNQUFNLGNBQUFxSSxzQkFBQSx1QkFBNUJBLHNCQUFBLENBQThCcEksU0FBUyxHQUFHcUIsU0FBUztJQUNwRixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDcUcsWUFBWSxFQUFFLFNBQUFBLENBQVVGLFNBQXNELEVBQXlCO01BQUEsSUFBQWEsc0JBQUE7TUFDdEcsT0FBT04sV0FBVyxDQUFDUCxTQUFTLENBQUMsSUFBQWEsc0JBQUEsR0FBR2IsU0FBUyxDQUFDMUgsV0FBVyxDQUFDQyxNQUFNLGNBQUFzSSxzQkFBQSx1QkFBNUJBLHNCQUFBLENBQThCcEksU0FBUyxHQUFHb0IsU0FBUztJQUNwRixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDdUcsZ0JBQWdCLEVBQUUsU0FBQUEsQ0FBVUosU0FBc0QsRUFBc0M7TUFBQSxJQUFBYyxzQkFBQTtNQUN2SCxPQUFPUCxXQUFXLENBQUNQLFNBQVMsQ0FBQyxJQUFBYyxzQkFBQSxHQUFHZCxTQUFTLENBQUMxSCxXQUFXLENBQUN3QyxPQUFPLGNBQUFnRyxzQkFBQSx1QkFBN0JBLHNCQUFBLENBQStCL0Ysc0JBQXNCLEdBQUdsQixTQUFTO0lBQ2xHLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ2tILGVBQWUsRUFBRSxTQUFBQSxDQUFVZixTQUE0QyxFQUFFTSxVQUFzQixFQUE0QjtNQUMxSCxJQUFJQyxXQUFXLENBQUNQLFNBQVMsQ0FBQyxFQUFFO1FBQUEsSUFBQWdCLHNCQUFBLEVBQUFDLHNCQUFBO1FBQzNCLE9BQU8sRUFBQUQsc0JBQUEsR0FBQWhCLFNBQVMsQ0FBQzFILFdBQVcsQ0FBQ29JLEVBQUUsY0FBQU0sc0JBQUEsdUJBQXhCQSxzQkFBQSxDQUEwQkUsWUFBWSxPQUFBRCxzQkFBQSxHQUFJWCxVQUFVLENBQUNoSSxXQUFXLENBQUNvSSxFQUFFLGNBQUFPLHNCQUFBLHVCQUF6QkEsc0JBQUEsQ0FBMkJDLFlBQVk7TUFDekY7SUFDRCxDQUFDO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDQyw4QkFBOEJBLENBQUNDLFdBQTZCLEVBQVU7TUFDckUsTUFBTUMsU0FBUyxHQUFHRCxXQUFXLENBQUNwSSxRQUFRLENBQUMsQ0FBQyxDQUFDSyxZQUFZLENBQUMsQ0FBQztNQUN2RCxJQUFJaUksUUFBUTtNQUNaLE1BQU1DLFdBQVcsR0FBR0gsV0FBVyxDQUFDdkIsY0FBYyxDQUFDLENBQUM7TUFDaEQsSUFBSXVCLFdBQVcsS0FBS0csV0FBVyxFQUFFO1FBQ2hDRCxRQUFRLEdBQUdELFNBQVMsQ0FBQ2pILFdBQVcsQ0FBQ2dILFdBQVcsQ0FBQzVHLE9BQU8sQ0FBQyxDQUFDLENBQUM7TUFDeEQsQ0FBQyxNQUFNO1FBQ04sTUFBTWdILGVBQWUsR0FBR0QsV0FBVyxhQUFYQSxXQUFXLHVCQUFYQSxXQUFXLENBQUUvRyxPQUFPLENBQUMsQ0FBQztRQUM5QyxNQUFNaUgsWUFBWSxHQUFHTCxXQUFXLENBQUM1RyxPQUFPLENBQUMsQ0FBQztRQUMxQzhHLFFBQVEsR0FBR0QsU0FBUyxDQUFDakgsV0FBVyxDQUFDLEdBQUdvSCxlQUFlLElBQUlDLFlBQVksRUFBRSxDQUFDO01BQ3ZFO01BQ0EsT0FBT0gsUUFBUTtJQUNoQixDQUFDO0lBRURJLGlCQUFpQkEsQ0FBQ0MsVUFBc0IsRUFBUTtNQUMvQ0EsVUFBVSxDQUFDQyw4QkFBOEIsR0FBRyxJQUFJQyxLQUFLLENBQXVCLENBQUM7TUFDN0UsTUFBTUMsU0FBUyxHQUFHSCxVQUFVLENBQUNJLFdBQVc7TUFDeEMsTUFBTUMsb0JBQW9CLEdBQUcsSUFBSUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQzlDRCxvQkFBb0IsQ0FBQ0UscUJBQXFCLENBQUNDLFdBQVcsQ0FBQ0MsTUFBTSxDQUFDO01BQzlELE1BQU1DLGVBQWUsR0FBR0wsb0JBQW9CLENBQUN2RSxXQUFXO01BQ3hELE1BQU02RSxlQUFlLEdBQUdOLG9CQUFvQixDQUFDTyxXQUFXO01BQ3hEUCxvQkFBb0IsQ0FBQ08sV0FBVyxHQUFHLFVBQVUxTCxJQUFJLEVBQUVrQyxPQUF1QixFQUFXO1FBQ3BGLE1BQU0sQ0FBQ3lKLFlBQVksRUFBRUMsY0FBYyxDQUFDLEdBQUc1TCxJQUFJLENBQUN3RSxLQUFLLENBQUMsV0FBVyxDQUFDO1FBRTlELElBQUl0QyxPQUFPLElBQUlBLE9BQU8sQ0FBQzJKLFdBQVcsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJRCxjQUFjLEtBQUssb0JBQW9CLEVBQUU7VUFDekYsTUFBTUUsYUFBYSxHQUFHNUosT0FBTyxDQUFDdEMsU0FBUyxDQUFDLENBQUM7VUFDekMsSUFBSWtNLGFBQWEsRUFBRTtZQUFBLElBQUFDLHFCQUFBO1lBQ2xCLE1BQU10QixRQUFRLEdBQUcsSUFBSXVCLFFBQVEsQ0FDNUJDLFlBQVksQ0FBQ25CLFVBQVUsQ0FBQ3RJLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDdkNzSSxVQUFVLENBQUN0SSxZQUFZLENBQUMsQ0FBQyxDQUFDZSxXQUFXLENBQUNyQixPQUFPLENBQUN5QixPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQ3hEbUgsVUFBVSxDQUFDdEksWUFBWSxDQUFDLENBQUMsQ0FBQ2UsV0FBVyxDQUFDckIsT0FBTyxDQUFDeUIsT0FBTyxDQUFDLENBQUMsQ0FDeEQsQ0FBQztZQUNELE1BQU11SSxrQkFBa0IsSUFBQUgscUJBQUEsR0FBR3RCLFFBQVEsQ0FBQzBCLGtCQUFrQixDQUFXUixZQUFZLENBQUMsQ0FBQ1MsU0FBUyxDQUFDLENBQUMsQ0FBQzNLLFdBQVcsQ0FBQ0MsTUFBTSxjQUFBcUsscUJBQUEsdUJBQWxGQSxxQkFBQSxDQUN4Qk0sVUFBVTtZQUNiLElBQUlDLDBCQUEwQixDQUFDSixrQkFBa0IsQ0FBQyxFQUFFO2NBQ25ELE9BQU9oSyxPQUFPLENBQUN0QyxTQUFTLENBQUNzTSxrQkFBa0IsQ0FBQ2xNLElBQUksQ0FBQztZQUNsRCxDQUFDLE1BQU07Y0FDTixPQUFPa0MsT0FBTyxDQUFDdEMsU0FBUyxDQUFDK0wsWUFBWSxDQUFDO1lBQ3ZDO1VBQ0QsQ0FBQyxNQUFNO1lBQ04sT0FBTzNJLFNBQVM7VUFDakI7UUFDRCxDQUFDLE1BQU0sSUFBSWQsT0FBTyxJQUFJMEosY0FBYyxLQUFLLGFBQWEsRUFBRTtVQUN2RCxPQUFPMUosT0FBTyxDQUFDeUIsT0FBTyxDQUFDLENBQUM7UUFDekI7UUFFQSxPQUFPOEgsZUFBZSxDQUFDakYsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDeEcsSUFBSSxFQUFFa0MsT0FBTyxDQUFDLENBQUM7TUFDcEQsQ0FBQztNQUVEaUosb0JBQW9CLENBQUN2RSxXQUFXLEdBQUcsVUFBVTVHLElBQUksRUFBRThHLEtBQUssRUFBRTVFLE9BQU8sRUFBRW1GLFdBQVcsRUFBVztRQUN4RixJQUFJa0YsUUFBUSxHQUFHdk0sSUFBSTtRQUNuQixJQUFJa0MsT0FBTyxFQUFFO1VBQ1pxSyxRQUFRLEdBQUdySyxPQUFPLENBQUN5QixPQUFPLENBQUMzRCxJQUFJLENBQUM7UUFDakM7UUFDQSxNQUFNd00sa0JBQWtCLEdBQUdBLENBQUEsS0FBWTtVQUN0QyxJQUFJLENBQUNDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sQ0FBQ2QsWUFBWSxFQUFFQyxjQUFjLENBQUMsR0FBRzVMLElBQUksQ0FBQ3dFLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDOUQsSUFBSXRDLE9BQU8sSUFBSTBKLGNBQWMsS0FBSyxvQkFBb0IsRUFBRTtVQUFBLElBQUFjLHNCQUFBO1VBQ3ZEeEssT0FBTyxDQUFDMEUsV0FBVyxDQUFDK0UsWUFBWSxFQUFFN0UsS0FBSyxDQUFDO1VBQ3hDO1VBQ0EsTUFBTTJELFFBQVEsR0FBRyxJQUFJdUIsUUFBUSxDQUM1QkMsWUFBWSxDQUFDbkIsVUFBVSxDQUFDdEksWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUN2Q3NJLFVBQVUsQ0FBQ3RJLFlBQVksQ0FBQyxDQUFDLENBQUNlLFdBQVcsQ0FBQ3JCLE9BQU8sQ0FBQ3lCLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFDeERtSCxVQUFVLENBQUN0SSxZQUFZLENBQUMsQ0FBQyxDQUFDZSxXQUFXLENBQUNyQixPQUFPLENBQUN5QixPQUFPLENBQUMsQ0FBQyxDQUN4RCxDQUFDO1VBQ0QsTUFBTXVJLGtCQUFrQixJQUFBUSxzQkFBQSxHQUFHakMsUUFBUSxDQUFDMEIsa0JBQWtCLENBQVdSLFlBQVksQ0FBQyxDQUFDUyxTQUFTLENBQUMsQ0FBQyxDQUFDM0ssV0FBVyxDQUFDQyxNQUFNLGNBQUFnTCxzQkFBQSx1QkFBbEZBLHNCQUFBLENBQW9GTCxVQUFVO1VBQ3pILElBQUlDLDBCQUEwQixDQUFDSixrQkFBa0IsQ0FBQyxFQUFFO1lBQUEsSUFBQVMsc0JBQUE7WUFDbkQsTUFBTUMsa0JBQWtCLEdBQUdWLGtCQUFrQixDQUFDbE0sSUFBSTtZQUNsRCxNQUFNNk0sbUJBQW1CLEdBQUcsQ0FBQ0Qsa0JBQWtCLENBQUNFLFNBQVMsQ0FBQyxDQUFDLEVBQUVGLGtCQUFrQixDQUFDRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsRyxNQUFNQyxZQUFZLElBQUFMLHNCQUFBLEdBQUdsQyxRQUFRLENBQUMwQixrQkFBa0IsQ0FBV1Msa0JBQWtCLENBQUMsQ0FBQ1IsU0FBUyxDQUFDLENBQUMsQ0FBQzNLLFdBQVcsQ0FBQ0MsTUFBTSxjQUFBaUwsc0JBQUEsdUJBQXhGQSxzQkFBQSxDQUEwRk0sSUFBSTtZQUNuSCxJQUFJWCwwQkFBMEIsQ0FBQ1UsWUFBWSxDQUFDLEVBQUU7Y0FDN0MsTUFBTUUsWUFBWSxHQUFHRixZQUFZLENBQUNoTixJQUFJO2NBQ3RDLElBQUlrTixZQUFZLENBQUNDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDL0JOLG1CQUFtQixDQUFDTyxJQUFJLENBQUNGLFlBQVksQ0FBQztjQUN2QztZQUNEO1lBQ0NoTCxPQUFPLENBQ05tTCxrQkFBa0IsQ0FBQ1IsbUJBQW1CLENBQUMsQ0FDdkNTLElBQUksQ0FBQ2Qsa0JBQWtCLENBQUMsQ0FDeEJlLEtBQUssQ0FBRUMsR0FBRyxJQUFLO2NBQ2ZDLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDRixHQUFhLENBQUM7WUFDekIsQ0FBQyxDQUFDO1VBQ0o7UUFDRDtRQUNBLE1BQU16RyxpQkFBaUIsR0FBR3dGLFFBQVEsQ0FBQy9ILEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDN0M7UUFDQSxJQUFJbUosWUFBWSxHQUFHLEVBQUU7UUFDckIsS0FBSyxJQUFJM0csQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHRCxpQkFBaUIsQ0FBQ2hFLE1BQU0sR0FBRyxDQUFDLEVBQUVpRSxDQUFDLEVBQUUsRUFBRTtVQUN0RCxJQUFJQSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ1YyRyxZQUFZLElBQUksR0FBRztVQUNwQjtVQUNBQSxZQUFZLElBQUk1RyxpQkFBaUIsQ0FBQ0MsQ0FBQyxDQUFDO1VBQ3BDLElBQUksSUFBSSxDQUFDcEgsU0FBUyxDQUFDK04sWUFBWSxDQUFDLEtBQUszSyxTQUFTLEVBQUU7WUFDL0M7WUFDQSxJQUFJLENBQUM0RCxXQUFXLENBQUMrRyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7VUFDbkM7UUFDRDtRQUNBLE9BQU9uQyxlQUFlLENBQUNoRixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUN4RyxJQUFJLEVBQUU4RyxLQUFLLEVBQUU1RSxPQUFPLEVBQUVtRixXQUFXLENBQUMsQ0FBQztNQUN4RSxDQUFDO01BQ0QsU0FBU3VHLG1CQUFtQkEsQ0FBQ0MsZUFBeUIsRUFBRUMsT0FBZ0MsRUFBVTtRQUNqRyxLQUFLLE1BQU0zRixXQUFXLElBQUkyRixPQUFPLEVBQUU7VUFDbEM7VUFDQTtVQUNBO1VBQ0EsTUFBTUMsU0FBUyxHQUNiRCxPQUFPLENBQUMzRixXQUFXLENBQUMsQ0FBb0I2RixHQUFHLElBQzNDRixPQUFPLENBQUMzRixXQUFXLENBQUMsQ0FBb0I2RixHQUFHLENBQUMsK0JBQStCLENBQUM7VUFDOUUsSUFBSSxPQUFPRixPQUFPLENBQUMzRixXQUFXLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQzRGLFNBQVMsRUFBRTtZQUMzREQsT0FBTyxDQUFDM0YsV0FBVyxDQUFDLEdBQUd5RixtQkFBbUIsQ0FBQ0MsZUFBZSxFQUFFQyxPQUFPLENBQUMzRixXQUFXLENBQTRCLENBQUM7WUFDNUcsSUFBSTFDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDb0ksT0FBTyxDQUFDM0YsV0FBVyxDQUFXLENBQUMsQ0FBQ3BGLE1BQU0sS0FBSyxDQUFDLEVBQUU7Y0FDN0QsT0FBTytLLE9BQU8sQ0FBQzNGLFdBQVcsQ0FBQztZQUM1QjtVQUNEO1VBQ0EsS0FBSyxNQUFNeUQsY0FBYyxJQUFJaUMsZUFBZSxFQUFFO1lBQzdDLElBQUkxRixXQUFXLENBQUM4RixRQUFRLENBQUNyQyxjQUFjLENBQUMsRUFBRTtjQUN6QyxPQUFPa0MsT0FBTyxDQUFDM0YsV0FBVyxDQUFDO1lBQzVCO1VBQ0Q7UUFDRDtRQUNBLE9BQU8yRixPQUFPO01BQ2Y7TUFDQWhELFVBQVUsQ0FBQ29ELHFCQUFxQixHQUFHL0Msb0JBQW9CO01BQ3ZETCxVQUFVLENBQUNxRCx1QkFBdUIsR0FBRyxZQUF1QjtRQUMzRCxPQUFPLElBQUksQ0FBQ0QscUJBQXFCO01BQ2xDLENBQUM7TUFDRHBELFVBQVUsQ0FBQ0ksV0FBVyxHQUFHLFVBQVVrRCxRQUFtQyxFQUFRO1FBQzdFLE1BQU1DLFdBQVcsR0FBR1QsbUJBQW1CLENBQUMsQ0FBQyxzQkFBc0IsRUFBRSxzQkFBc0IsQ0FBQyxFQUFFLElBQUksQ0FBQ00scUJBQXFCLENBQUNJLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDL0gsSUFBSSxDQUFDSixxQkFBcUIsQ0FBQ0ssT0FBTyxDQUFDRixXQUFXLENBQUM7UUFDL0MsS0FBSyxNQUFNRyxhQUFhLElBQUlKLFFBQVEsRUFBRTtVQUNyQyxJQUFJLENBQUNGLHFCQUFxQixDQUFDdEgsV0FBVyxDQUFDLEdBQUc0SCxhQUFhLHNCQUFzQixFQUFFSixRQUFRLENBQUNJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1VBQ3BILElBQUksQ0FBQ1AscUJBQXFCLENBQUN0SCxXQUFXLENBQUMsR0FBRzRILGFBQWEsc0JBQXNCLEVBQUVKLFFBQVEsQ0FBQ0ksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDeEg7UUFDQXpELFNBQVMsQ0FBQ3pFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzRILFFBQVEsQ0FBQyxDQUFDO01BQ2xDLENBQUM7TUFDRCxNQUFNTyxjQUFjLEdBQUc3RCxVQUFVLENBQUM4RCxZQUFZLENBQUNDLElBQUksQ0FBQy9ELFVBQVUsQ0FBQztNQUMvREEsVUFBVSxDQUFDOEQsWUFBWSxHQUFHLFVBQVU1TyxJQUFZLEVBQUVrQyxPQUF1QixFQUFFNE0sVUFBVSxFQUF3QjtRQUM1RyxNQUFNQyw2QkFBNkIsR0FBR3hQLFdBQVcsQ0FBQ3lQLG9DQUFvQyxDQUFDLElBQUksRUFBRUwsY0FBYyxFQUFFM08sSUFBSSxFQUFFa0MsT0FBTyxDQUFDO1FBQzNILElBQUk2TSw2QkFBNkIsRUFBRTtVQUNsQyxPQUFPQSw2QkFBNkI7UUFDckM7UUFDQSxJQUFJL08sSUFBSSxDQUFDaU8sUUFBUSxDQUFDLDZCQUE2QixDQUFDLElBQUkvTCxPQUFPLEVBQUU7VUFDNUQsTUFBTStNLGlCQUFpQixHQUFHTixjQUFjLENBQUMzTyxJQUFJLEVBQUVrQyxPQUFPLENBQUM7VUFDdkQ0SSxVQUFVLENBQUNDLDhCQUE4QixDQUFDcUMsSUFBSSxDQUFDNkIsaUJBQWlCLENBQUM7VUFDakUsTUFBTUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDaEIscUJBQXFCLENBQUNVLFlBQVksQ0FBQzVPLElBQUksRUFBRWtDLE9BQU8sQ0FBb0M7VUFFbkgrTSxpQkFBaUIsQ0FBQ0UsWUFBWSxDQUFDLE1BQU07WUFDcENELGlCQUFpQixDQUFDekMsT0FBTyxDQUFDLENBQUM7VUFDNUIsQ0FBQyxDQUFDO1VBQ0Z3QyxpQkFBaUIsQ0FDZkcsWUFBWSxDQUFDLENBQUMsQ0FDZDlCLElBQUksQ0FBQyxNQUFNO1lBQ1g0QixpQkFBaUIsQ0FBQ3pDLE9BQU8sQ0FBQyxDQUFDO1lBQzNCO1VBQ0QsQ0FBQyxDQUFDLENBQ0RjLEtBQUssQ0FBRUMsR0FBRyxJQUFLO1lBQ2ZDLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDRixHQUFhLENBQUM7VUFDekIsQ0FBQyxDQUFDO1VBQ0gsT0FBTzBCLGlCQUFpQjtRQUN6QjtRQUNBLElBQUlsUCxJQUFJLENBQUNtTixRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUU7VUFDL0IsTUFBTWtDLFdBQVcsR0FBRyxJQUFJLENBQUNuQixxQkFBcUIsQ0FBQ1UsWUFBWSxDQUFDNU8sSUFBSSxFQUFFa0MsT0FBTyxDQUV4RTtVQUNELElBQUlsQyxJQUFJLENBQUNpTyxRQUFRLENBQUMsNkJBQTZCLENBQUMsRUFBRTtZQUNqRCxPQUFPb0IsV0FBVztVQUNuQjtVQUNBQSxXQUFXLENBQUNDLGNBQWMsR0FBRyxVQUFVM00sS0FBYSxFQUFXO1lBQzlELE9BQU9BLEtBQUssSUFBSUEsS0FBSyxLQUFLbUksVUFBVTtVQUNyQyxDQUFDO1VBQ0QsSUFBSTlLLElBQUksQ0FBQ21OLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQUEsSUFBQW9DLHFCQUFBO1lBQ3ZDLE1BQU1DLFVBQVUsR0FBRy9MLGtCQUFrQixDQUFDZ00sMkJBQTJCLENBQ2hFelAsSUFBSSxFQUNKeUQsa0JBQWtCLENBQUN3SSxZQUFZLENBQUMsSUFBSSxDQUFDekosWUFBWSxDQUFDLENBQUMsQ0FDcEQsQ0FBQztZQUNELE1BQU1rTixZQUFZLEdBQUcsSUFBSUMsR0FBRyxDQUFDO2NBQUVDLEdBQUcsRUFBRUMsaUJBQWlCLENBQUNMLFVBQVUsQ0FBQztjQUFFTSxnQkFBZ0IsRUFBRTlQO1lBQUssQ0FBQyxDQUFDO1lBQzVGLE1BQU0rUCx3QkFBd0IsR0FBR1YsV0FBVyxDQUFDVyxPQUFPLENBQUNuQixJQUFJLENBQUNRLFdBQVcsQ0FBQztZQUN0RUEsV0FBVyxDQUFDVyxPQUFPLEdBQUcsTUFBWTtjQUNqQ04sWUFBWSxhQUFaQSxZQUFZLHVCQUFaQSxZQUFZLENBQUVNLE9BQU8sQ0FBQyxDQUFDO2NBQ3ZCLE9BQU9ELHdCQUF3QixDQUFDLENBQUM7WUFDbEMsQ0FBQztZQUNELE1BQU1FLFlBQVksR0FBR1osV0FBVyxDQUFDYSxVQUFVO1lBQzNDLElBQUlELFlBQVksRUFBRTtjQUNqQlosV0FBVyxDQUFDYSxVQUFVLEdBQUlDLFVBQW1CLElBQVc7Z0JBQ3ZEVCxZQUFZLGFBQVpBLFlBQVksdUJBQVpBLFlBQVksQ0FBRVUsaUJBQWlCLENBQUNELFVBQVUsQ0FBQztnQkFDM0MsT0FBT0YsWUFBWSxDQUFDcEIsSUFBSSxDQUFDUSxXQUFXLENBQUMsQ0FBQ2MsVUFBVSxDQUFDO2NBQ2xELENBQUM7WUFDRjtZQUVBVCxZQUFZLENBQUNXLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDM0IsTUFBTUMsWUFBWSxJQUFBZixxQkFBQSxHQUFHRyxZQUFZLENBQUNhLGNBQWMsQ0FBQyxLQUFLLENBQUMsY0FBQWhCLHFCQUFBLHVCQUFsQ0EscUJBQUEsQ0FBb0NpQixPQUFPO1lBQ2hFLE1BQU1DLGFBQWEsR0FBR0gsWUFBWSxhQUFaQSxZQUFZLHVCQUFaQSxZQUFZLENBQUVJLFdBQVc7WUFDL0MsSUFBSUQsYUFBYSxFQUFFO2NBQ2xCZixZQUFZLENBQUNhLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQ0MsT0FBTyxDQUFDRSxXQUFXLEdBQUcsTUFBWTtnQkFDcEUsT0FBT0QsYUFBYSxDQUFDNUIsSUFBSSxDQUFDeUIsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDO2NBQzlDLENBQUM7WUFDRjtZQUNBWixZQUFZLENBQUNVLGlCQUFpQixDQUFDbE8sT0FBTyxDQUFDO1VBQ3hDO1VBQ0EsT0FBT21OLFdBQVc7UUFDbkI7UUFDQSxPQUFPVixjQUFjLENBQUMzTyxJQUFJLEVBQUVrQyxPQUFPLEVBQUU0TSxVQUFVLENBQUM7TUFDakQsQ0FBQztNQUNELE1BQU02QixTQUFTLEdBQUc3RixVQUFVLENBQUNrRixPQUFPLENBQUNuQixJQUFJLENBQUMvRCxVQUFVLENBQUM7TUFDckRBLFVBQVUsQ0FBQ2tGLE9BQU8sR0FBRyxZQUFrQjtRQUN0QyxLQUFLLE1BQU1ZLFNBQVMsSUFBSTlGLFVBQVUsQ0FBQ0MsOEJBQThCLEVBQUU7VUFDbEU2RixTQUFTLENBQUNaLE9BQU8sQ0FBQyxDQUFDO1FBQ3BCO1FBQ0EsSUFBSSxDQUFDOUIscUJBQXFCLENBQUM4QixPQUFPLENBQUMsQ0FBQztRQUNwQyxPQUFPVyxTQUFTLENBQUNuSyxLQUFLLENBQUMsSUFBSSxDQUFDO01BQzdCLENBQUM7SUFDRixDQUFDO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ3FLLHNCQUFzQkEsQ0FBQzdRLElBQXdCLEVBQUU4USxnQkFBNEMsRUFBRXBSLFNBQXFCLEVBQVU7TUFDN0gsSUFBSXFSLElBQUksR0FBRy9RLElBQUksS0FBS2dELFNBQVMsR0FBR2hELElBQUksR0FBRyxFQUFFO01BQ3pDLElBQUlBLElBQUksYUFBSkEsSUFBSSxlQUFKQSxJQUFJLENBQUUwSSxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUU7UUFDcEMsTUFBTXNJLGFBQWEsR0FBR2hSLElBQUksQ0FBQzhNLFNBQVMsQ0FBQyxFQUFFLEVBQUU5TSxJQUFJLENBQUMrQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELElBQUk7VUFDSCxJQUFJK04sZ0JBQWdCLEVBQUU7WUFBQSxJQUFBRyxxQkFBQTtZQUNyQkYsSUFBSSxHQUFHLEVBQUFFLHFCQUFBLEdBQUFILGdCQUFnQixDQUFDSSx1QkFBdUIsQ0FBQ0YsYUFBYSxDQUFDLENBQUNHLFVBQVUsY0FBQUYscUJBQUEsdUJBQWxFQSxxQkFBQSxDQUFvRUcsUUFBUSxDQUFDLENBQUMsS0FBSSxFQUFFO1VBQzVGLENBQUMsTUFBTTtZQUNOTCxJQUFJLEdBQUdyUixTQUFTLGFBQVRBLFNBQVMsdUJBQVRBLFNBQVMsQ0FBRUUsU0FBUyxDQUFDb1IsYUFBYSxDQUFDO1VBQzNDO1FBQ0QsQ0FBQyxDQUFDLE9BQU9LLENBQUMsRUFBRTtVQUNYNUQsR0FBRyxDQUFDNkQsSUFBSSxDQUFDLHNEQUFzRE4sYUFBYSxFQUFFLENBQUM7UUFDaEY7TUFDRDtNQUNBLE9BQU9ELElBQUk7SUFDWixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NRLGVBQWUsRUFBRSxTQUFBQSxDQUFVN1IsU0FBeUIsRUFBRXlJLFdBQW1CLEVBQXNCO01BQUEsSUFBQXFKLHFCQUFBO01BQzlGLE1BQU12UixXQUFXLEdBQUdQLFNBQVMsQ0FBQ1EsY0FBYyxDQUFDaUksV0FBVyxDQUFDO01BQ3pELE1BQU1oSSxVQUFVLEdBQUdDLDJCQUEyQixDQUFDSCxXQUFXLENBQUM7TUFDM0QsTUFBTW1PLFFBQVEsSUFBQW9ELHFCQUFBLEdBQUdyUixVQUFVLENBQUNzUixnQkFBZ0IsQ0FBQ2hRLFdBQVcsQ0FBQ0MsTUFBTSxjQUFBOFAscUJBQUEsdUJBQTlDQSxxQkFBQSxDQUFnREUsUUFBUTtNQUN6RSxPQUFPcEYsMEJBQTBCLENBQUM4QixRQUFRLENBQUMsR0FBR0EsUUFBUSxDQUFDcE8sSUFBSSxHQUFHZ0QsU0FBUztJQUN4RSxDQUFDO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDZ00sb0NBQW9DLEVBQUUsU0FBQUEsQ0FDckNsRSxVQUFzQixFQUN0QjZELGNBQXdCLEVBQ3hCM08sSUFBWSxFQUNaa0MsT0FBdUIsRUFDTztNQUM5QixJQUFJbEMsSUFBSSxDQUFDbU4sUUFBUSxDQUFDLHdCQUF3QixDQUFDLEVBQUU7UUFDNUMsTUFBTXdFLHFCQUFxQixHQUFHN0csVUFBVSxDQUFDcUQsdUJBQXVCLENBQUMsQ0FBQyxDQUFDUyxZQUFZLENBQUM1TyxJQUFJLEVBQUVrQyxPQUFPLENBRTVGO1FBQ0QsTUFBTTBQLGlDQUFpQyxHQUFJQyxvQkFBcUUsSUFBVztVQUMxSDtVQUNBLE1BQU01QixZQUFZLEdBQUcwQixxQkFBcUIsQ0FBQ3pCLFVBQVU7VUFDckQsSUFBSUQsWUFBWSxFQUFFO1lBQ2pCMEIscUJBQXFCLENBQUN6QixVQUFVLEdBQUlDLFVBQW1CLElBQVc7Y0FDakUwQixvQkFBb0IsYUFBcEJBLG9CQUFvQix1QkFBcEJBLG9CQUFvQixDQUFFM0IsVUFBVSxDQUFDQyxVQUFVLENBQUM7Y0FDNUMsT0FBT0YsWUFBWSxDQUFDcEIsSUFBSSxDQUFDZ0Qsb0JBQW9CLENBQUMsQ0FBQzFCLFVBQVUsQ0FBQztZQUMzRCxDQUFDO1VBQ0Y7UUFDRCxDQUFDO1FBQ0QsSUFBSWpPLE9BQU8sRUFBRTtVQUNaLE1BQU07WUFBRTRQLDZCQUE2QjtZQUFFQztVQUFzQixDQUFDLEdBQUd4UyxXQUFXLENBQUN5UyxpQ0FBaUMsQ0FDN0c5UCxPQUFPLEVBQ1BsQyxJQUNELENBQUM7VUFDRCxJQUFJOFIsNkJBQTZCLElBQUlDLHFCQUFxQixFQUFFO1lBQzNELE1BQU1FLFlBQVksR0FBR25ILFVBQVUsQ0FBQ0MsOEJBQThCLENBQUNtSCxJQUFJLENBQUVDLGVBQWUsSUFBSztjQUFBLElBQUFDLHFCQUFBO2NBQ3hGO2dCQUNDO2dCQUNBO2dCQUNBO2dCQUNBbFEsT0FBTyxDQUFDeUIsT0FBTyxDQUFDLENBQUMsT0FBQXlPLHFCQUFBLEdBQUtELGVBQWUsQ0FBQ3pPLFVBQVUsQ0FBQyxDQUFDLGNBQUEwTyxxQkFBQSx1QkFBNUJBLHFCQUFBLENBQThCek8sT0FBTyxDQUFDLENBQUMsS0FDN0RtTyw2QkFBNkIsS0FBS0ssZUFBZSxDQUFDeE8sT0FBTyxDQUFDO2NBQUM7WUFFN0QsQ0FBQyxDQUFDO1lBQ0YsSUFBSSxDQUFDc08sWUFBWSxFQUFFO2NBQ2xCLE1BQU1KLG9CQUFvQixHQUFHbEQsY0FBYyxDQUFDbUQsNkJBQTZCLEVBQUU1UCxPQUFPLENBRWpGO2NBQ0Q7Y0FDQTJQLG9CQUFvQixDQUFDUSxPQUFPLENBQUMsSUFBSUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7Y0FDOUNULG9CQUFvQixDQUFDVSxjQUFjLENBQUNqSCxXQUFXLENBQUNDLE1BQU0sQ0FBQztjQUN2RFQsVUFBVSxDQUFDQyw4QkFBOEIsQ0FBQ3FDLElBQUksQ0FBQ3lFLG9CQUFvQixDQUFDO2NBQ3BFQSxvQkFBb0IsQ0FBQzFDLFlBQVksQ0FBRXFELEtBQXVDLElBQUs7Z0JBQzlFO2dCQUNBLE1BQU1DLGVBQWUsR0FBR0QsS0FBSyxDQUFDRSxTQUFTLENBQUMsQ0FBQztnQkFDekMsTUFBTUMsY0FBYyxHQUFHSCxLQUFLLENBQUNFLFNBQVMsQ0FBQyxDQUFDLENBQUNoUCxVQUFVLENBQUMsQ0FBbUI7Z0JBQ3ZFLElBQUlpUCxjQUFjLEVBQUU7a0JBQ25CLE1BQU1DLHNCQUFzQixHQUFHSCxlQUFlLENBQUNJLFFBQVEsQ0FBQyxDQUFDO2tCQUN6RHRULFdBQVcsQ0FBQ3VULHdDQUF3QyxDQUFDRixzQkFBc0IsRUFBRUQsY0FBYyxDQUFDO2tCQUM1RmhCLHFCQUFxQixDQUFDbEYsT0FBTyxDQUFDLENBQUM7Z0JBQ2hDO2NBQ0QsQ0FBQyxDQUFDO2NBQ0Y7Y0FDQTtjQUNBb0Ysb0JBQW9CLENBQUN6QyxZQUFZLENBQUMsQ0FBQyxDQUFDN0IsS0FBSyxDQUFFRyxLQUFLLElBQUs7Z0JBQ3BERCxHQUFHLENBQUNDLEtBQUssQ0FBQyx1Q0FBdUMsRUFBRUEsS0FBSyxDQUFDO2NBQzFELENBQUMsQ0FBQztjQUNGa0UsaUNBQWlDLENBQUNDLG9CQUFvQixDQUFDO1lBQ3hEO1VBQ0Q7UUFDRDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBRixxQkFBcUIsQ0FBQ3JDLGNBQWMsR0FBRyxVQUFVM00sS0FBYSxFQUFXO1VBQ3hFLE9BQU8sSUFBSSxDQUFDZSxVQUFVLENBQUMsQ0FBQyxHQUFHZixLQUFLLElBQUlBLEtBQUssS0FBS21JLFVBQVUsR0FBR25JLEtBQUssSUFBSSxJQUFJLENBQUNSLFFBQVEsQ0FBQyxDQUFDLEtBQUtRLEtBQUs7UUFDOUYsQ0FBQztRQUNELE9BQU9nUCxxQkFBcUI7TUFDN0I7SUFDRCxDQUFDO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NLLGlDQUFpQyxFQUFFLFNBQUFBLENBQ2xDOVAsT0FBdUIsRUFDdkI2USxXQUFtQixFQUNxRTtNQUFBLElBQUFDLHFCQUFBLEVBQUFDLHNCQUFBLEVBQUFDLHNCQUFBO01BQ3hGLE1BQU14VCxTQUFTLEdBQUd3QyxPQUFPLENBQUNDLFFBQVEsQ0FBQyxDQUFDLENBQUNLLFlBQVksQ0FBQyxDQUFDO01BQ25ELE1BQU0yUSxlQUFlLEdBQUd6VCxTQUFTLENBQUM2RCxXQUFXLENBQUNyQixPQUFPLENBQUN5QixPQUFPLENBQUMsQ0FBQyxDQUFDO01BQ2hFLE1BQU0xRCxXQUFXLEdBQUdQLFNBQVMsQ0FBQ1EsY0FBYyxDQUFDaVQsZUFBZSxDQUFDO01BQzdELE1BQU0xQixnQkFBZ0IsR0FBR3JSLDJCQUEyQixDQUFDSCxXQUFXLENBQUMsQ0FBQ3dSLGdCQUFnQjtNQUNsRixNQUFNSyw2QkFBNkIsR0FBSUwsZ0JBQWdCLGFBQWhCQSxnQkFBZ0Isd0JBQUF1QixxQkFBQSxHQUFoQnZCLGdCQUFnQixDQUFFaFEsV0FBVyxjQUFBdVIscUJBQUEsd0JBQUFDLHNCQUFBLEdBQTdCRCxxQkFBQSxDQUErQm5KLEVBQUUsY0FBQW9KLHNCQUFBLHdCQUFBQyxzQkFBQSxHQUFsQ0Qsc0JBQUEsQ0FDbkNHLGVBQWUsY0FBQUYsc0JBQUEsdUJBRG9CQSxzQkFBQSxDQUNsQmxULElBQUk7TUFDeEI7TUFDQSxNQUFNNkcsWUFBWSxHQUFHa00sV0FBVyxDQUFDdk8sS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ3JFLE1BQU11TixxQkFBcUIsR0FBR04sZ0JBQWdCLENBQUM0QixnQkFBZ0IsQ0FBQ25CLElBQUksQ0FBRW9CLGNBQWMsSUFBSztRQUN4RixJQUFJQSxjQUFjLENBQUNDLElBQUksS0FBS3pCLDZCQUE2QixFQUFFO1VBQUEsSUFBQTBCLHFCQUFBO1VBQzFELE9BQVFGLGNBQWMsYUFBZEEsY0FBYyx3QkFBQUUscUJBQUEsR0FBZEYsY0FBYyxDQUFFRyxVQUFVLGNBQUFELHFCQUFBLHVCQUEzQkEscUJBQUEsQ0FBNkNFLFVBQVUsQ0FBQ3hCLElBQUksQ0FBRXlCLFFBQVEsSUFBSztZQUNqRixPQUFPOU0sWUFBWSxLQUFLOE0sUUFBUSxDQUFDSixJQUFJO1VBQ3RDLENBQUMsQ0FBQztRQUNIO01BQ0QsQ0FBQyxDQUFDO01BQ0YsT0FBTztRQUNOekIsNkJBQTZCO1FBQzdCQztNQUNELENBQUM7SUFDRixDQUFDO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDZSx3Q0FBd0MsRUFBRSxTQUFBQSxDQUFVRixzQkFBdUMsRUFBRUQsY0FBOEIsRUFBUTtNQUNsSSxJQUFJQyxzQkFBc0IsRUFBRTtRQUMzQixLQUFLLE1BQU1nQixtQkFBbUIsSUFBSWhCLHNCQUFzQixFQUFFO1VBQ3pELE1BQU1pQix1QkFBdUIsR0FBR2pCLHNCQUFzQixDQUFDZ0IsbUJBQW1CLENBQUM7VUFDM0UsTUFBTUUsY0FBYyxHQUFHRixtQkFBbUI7VUFDMUMsTUFBTXpJLG9CQUFvQixHQUFHd0gsY0FBYyxDQUFDeFEsUUFBUSxDQUFDLENBQUMsQ0FBQ2dNLHVCQUF1QixDQUFDLENBQUM7VUFDaEYsTUFBTTRGLGVBQWUsR0FBRyxFQUFFO1VBQzFCLEtBQUssTUFBTUMsc0JBQXNCLElBQUlILHVCQUF1QixFQUFFO1lBQzdELElBQUlHLHNCQUFzQixDQUFDQyw0QkFBNEIsRUFBRTtjQUN4RCxNQUFNQyw4QkFBOEIsR0FBR3ZCLGNBQWMsQ0FBQ2hQLE9BQU8sQ0FDNURtUSxjQUFjLEdBQUcsMkNBQ2xCLENBQUM7Y0FDRCxNQUFNSyxvQ0FBb0MsR0FBR3hCLGNBQWMsQ0FBQ2hQLE9BQU8sQ0FDbEVtUSxjQUFjLEdBQUcsaURBQ2xCLENBQUM7Y0FDRDNJLG9CQUFvQixDQUFDdkUsV0FBVyxDQUMvQnNOLDhCQUE4QixFQUM5QkYsc0JBQXNCLENBQUNJLHFCQUFxQixFQUM1Q3pCLGNBQWMsRUFDZCxLQUNELENBQUM7Y0FDRHhILG9CQUFvQixDQUFDdkUsV0FBVyxDQUMvQnVOLG9DQUFvQyxFQUNwQ0gsc0JBQXNCLENBQUNLLDJCQUEyQixFQUNsRDFCLGNBQWMsRUFDZCxLQUNELENBQUM7Y0FDRDtZQUNEO1lBQ0E7WUFDQTtZQUNBLElBQUlxQixzQkFBc0IsQ0FBQ0kscUJBQXFCLEVBQUU7Y0FDakRMLGVBQWUsQ0FBQzNHLElBQUksQ0FBQzRHLHNCQUFzQixDQUFDSSxxQkFBcUIsQ0FBQztZQUNuRTtVQUNEO1VBQ0EsSUFBSSxDQUFDUCx1QkFBdUIsSUFBSSxDQUFDQSx1QkFBdUIsQ0FBQzlRLE1BQU0sRUFBRTtZQUNoRSxNQUFNbVIsOEJBQThCLEdBQUd2QixjQUFjLENBQUNoUCxPQUFPLENBQzVEbVEsY0FBYyxHQUFHLDJDQUNsQixDQUFDO1lBQ0QsTUFBTUssb0NBQW9DLEdBQUd4QixjQUFjLENBQUNoUCxPQUFPLENBQ2xFbVEsY0FBYyxHQUFHLGlEQUNsQixDQUFDO1lBQ0QzSSxvQkFBb0IsQ0FBQ3ZFLFdBQVcsQ0FBQ3NOLDhCQUE4QixFQUFFLElBQUksRUFBRXZCLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDN0Z4SCxvQkFBb0IsQ0FBQ3ZFLFdBQVcsQ0FBQ3VOLG9DQUFvQyxFQUFFLEVBQUUsRUFBRXhCLGNBQWMsRUFBRSxLQUFLLENBQUM7VUFDbEc7VUFDQXhILG9CQUFvQixDQUFDdkUsV0FBVyxDQUMvQitMLGNBQWMsQ0FBQ2hQLE9BQU8sQ0FBQ21RLGNBQWMsR0FBRywwQ0FBMEMsQ0FBQyxFQUNuRkMsZUFBZSxFQUNmcEIsY0FBYyxFQUNkLEtBQ0QsQ0FBQztVQUNEeEgsb0JBQW9CLENBQUN2RSxXQUFXLENBQUMrTCxjQUFjLENBQUNoUCxPQUFPLENBQUMsdUJBQXVCLENBQUMsRUFBRWdQLGNBQWMsQ0FBQztRQUNsRztNQUNEO0lBQ0QsQ0FBQztJQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDMkIsZ0JBQWdCLEVBQUVBLENBQUM3SyxVQUFzQixFQUFFTixTQUFvQixLQUFlO01BQzdFLE1BQU1vTCxhQUF1QixHQUFHLEVBQUU7TUFDbEMsTUFBTUMsVUFBVSxHQUFJQyxlQUF1QyxJQUFXO1FBQUEsSUFBQUMscUJBQUEsRUFBQUMsc0JBQUEsRUFBQUMsc0JBQUE7UUFDckVILGVBQWUsYUFBZkEsZUFBZSx3QkFBQUMscUJBQUEsR0FBZkQsZUFBZSxDQUFFaFQsV0FBVyxjQUFBaVQscUJBQUEsd0JBQUFDLHNCQUFBLEdBQTVCRCxxQkFBQSxDQUE4QkcsSUFBSSxjQUFBRixzQkFBQSx3QkFBQUMsc0JBQUEsR0FBbENELHNCQUFBLENBQW9DRyxhQUFhLGNBQUFGLHNCQUFBLHVCQUFqREEsc0JBQUEsQ0FBbURHLE9BQU8sQ0FBRUMsWUFBMEIsSUFBSztVQUMxRkEsWUFBWSxDQUFDQyxHQUFHLENBQUNGLE9BQU8sQ0FBRUcsR0FBZ0IsSUFBSztZQUM5Q1gsYUFBYSxDQUFDbkgsSUFBSSxDQUFDOEgsR0FBRyxDQUFDQyxJQUFJLENBQUNyTyxLQUFLLENBQUM7VUFDbkMsQ0FBQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDO01BQ0gsQ0FBQztNQUNEME4sVUFBVSxDQUFDckwsU0FBUyxDQUFDO01BQ3JCLElBQUksQ0FBQ29MLGFBQWEsQ0FBQ3hSLE1BQU0sRUFBRTtRQUMxQnlSLFVBQVUsQ0FBQy9LLFVBQVUsQ0FBQztNQUN2QjtNQUNBLE9BQU84SyxhQUFhO0lBQ3JCO0VBQ0QsQ0FBQztFQUFDLE9BYWFoVixXQUFXO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=