@grafana/scenes 6.7.0--canary.1091.14350229100.0 → 6.8.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 (331) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/esm/components/layout/CSSGrid/SceneCSSGridItem.js +33 -0
  3. package/dist/esm/dist/esm/behaviors/CursorSync.js +76 -0
  4. package/dist/esm/dist/esm/behaviors/LiveNowTimer.js +44 -0
  5. package/dist/esm/dist/esm/behaviors/SceneQueryController.js +14 -0
  6. package/dist/esm/dist/esm/components/EmbeddedScene.js +59 -0
  7. package/dist/esm/dist/esm/components/NestedScene.js +95 -0
  8. package/dist/esm/dist/esm/components/SceneApp/SceneApp.js +27 -0
  9. package/dist/esm/dist/esm/components/SceneApp/SceneAppPage.js +176 -0
  10. package/dist/esm/dist/esm/components/SceneApp/SceneAppPageView.js +104 -0
  11. package/dist/esm/dist/esm/components/SceneApp/utils.js +42 -0
  12. package/dist/esm/dist/esm/components/SceneByFrameRepeater.js +41 -0
  13. package/dist/esm/dist/esm/components/SceneByVariableRepeater.js +55 -0
  14. package/dist/esm/dist/esm/components/SceneCanvasText.js +32 -0
  15. package/dist/esm/dist/esm/components/SceneControlsSpacer.js +17 -0
  16. package/dist/esm/dist/esm/components/SceneDebugger/DebugDetails.js +82 -0
  17. package/dist/esm/dist/esm/components/SceneDebugger/DebugTreeNode.js +72 -0
  18. package/dist/esm/dist/esm/components/SceneDebugger/SceneDebugger.js +77 -0
  19. package/dist/esm/dist/esm/components/SceneReactObject.js +34 -0
  20. package/dist/esm/dist/esm/components/SceneRefreshPicker.js +205 -0
  21. package/dist/esm/dist/esm/components/SceneTimePicker.js +139 -0
  22. package/dist/esm/dist/esm/components/SceneTimeRangeCompare.js +240 -0
  23. package/dist/esm/dist/esm/components/SceneToolbarButton.js +33 -0
  24. package/dist/esm/dist/esm/components/VizPanel/VizPanel.js +406 -0
  25. package/dist/esm/dist/esm/components/VizPanel/VizPanelExploreButton.js +44 -0
  26. package/dist/esm/dist/esm/components/VizPanel/VizPanelMenu.js +59 -0
  27. package/dist/esm/dist/esm/components/VizPanel/VizPanelRenderer.js +285 -0
  28. package/dist/esm/dist/esm/components/VizPanel/VizPanelSeriesLimit.js +45 -0
  29. package/dist/esm/dist/esm/components/VizPanel/colorSeriesConfigFactory.js +72 -0
  30. package/dist/esm/dist/esm/components/VizPanel/registerRuntimePanelPlugin.js +11 -0
  31. package/dist/esm/dist/esm/components/VizPanel/seriesVisibilityConfigFactory.js +164 -0
  32. package/dist/esm/dist/esm/components/layout/CSSGrid/SceneCSSGridLayout.js +124 -0
  33. package/dist/esm/dist/esm/components/layout/LazyLoader.js +103 -0
  34. package/dist/esm/dist/esm/components/layout/SceneFlexLayout.js +135 -0
  35. package/dist/esm/dist/esm/components/layout/grid/SceneGridItem.js +30 -0
  36. package/dist/esm/dist/esm/components/layout/grid/SceneGridLayout.js +283 -0
  37. package/dist/esm/dist/esm/components/layout/grid/SceneGridLayoutRenderer.js +178 -0
  38. package/dist/esm/dist/esm/components/layout/grid/SceneGridRow.js +190 -0
  39. package/dist/esm/dist/esm/components/layout/grid/constants.js +7 -0
  40. package/dist/esm/dist/esm/components/layout/grid/utils.js +36 -0
  41. package/dist/esm/dist/esm/components/layout/split/SplitLayout.js +17 -0
  42. package/dist/esm/dist/esm/components/layout/split/SplitLayoutRenderer.js +29 -0
  43. package/dist/esm/dist/esm/components/layout/split/Splitter.js +386 -0
  44. package/dist/esm/dist/esm/core/SceneComponentWrapper.js +57 -0
  45. package/dist/esm/dist/esm/core/SceneDataNode.js +43 -0
  46. package/dist/esm/dist/esm/core/SceneObjectBase.js +286 -0
  47. package/dist/esm/dist/esm/core/SceneObjectRef.js +32 -0
  48. package/dist/esm/dist/esm/core/SceneTimeRange.js +231 -0
  49. package/dist/esm/dist/esm/core/events.js +11 -0
  50. package/dist/esm/dist/esm/core/sceneGraph/getTimeRange.js +10 -0
  51. package/dist/esm/dist/esm/core/sceneGraph/index.js +25 -0
  52. package/dist/esm/dist/esm/core/sceneGraph/sceneGraph.js +178 -0
  53. package/dist/esm/dist/esm/core/sceneGraph/utils.js +64 -0
  54. package/dist/esm/dist/esm/core/types.js +15 -0
  55. package/dist/esm/dist/esm/querying/DataLayersMerger.js +46 -0
  56. package/dist/esm/dist/esm/querying/ExtraQueryProvider.js +6 -0
  57. package/dist/esm/dist/esm/querying/RuntimeDataSource.js +6 -0
  58. package/dist/esm/dist/esm/querying/SceneDataLayerSet.js +100 -0
  59. package/dist/esm/dist/esm/querying/SceneQueryRunner.js +468 -0
  60. package/dist/esm/dist/esm/querying/extraQueryProcessingOperator.js +46 -0
  61. package/dist/esm/dist/esm/querying/getEnrichedDataRequest.js +12 -0
  62. package/dist/esm/dist/esm/querying/layers/SceneDataLayerBase.js +112 -0
  63. package/dist/esm/dist/esm/querying/layers/SceneDataLayerControls.js +51 -0
  64. package/dist/esm/dist/esm/querying/layers/annotations/AnnotationsDataLayer.js +130 -0
  65. package/dist/esm/dist/esm/querying/layers/annotations/filterAnnotations.js +85 -0
  66. package/dist/esm/dist/esm/querying/layers/annotations/standardAnnotationQuery.js +121 -0
  67. package/dist/esm/dist/esm/querying/layers/annotations/standardAnnotationsSupport.js +211 -0
  68. package/dist/esm/dist/esm/querying/layers/annotations/utils.js +77 -0
  69. package/dist/esm/dist/esm/querying/registerQueryWithController.js +41 -0
  70. package/dist/esm/dist/esm/services/SceneObjectUrlSyncConfig.js +30 -0
  71. package/dist/esm/dist/esm/services/UniqueUrlKeyMapper.js +45 -0
  72. package/dist/esm/dist/esm/services/UrlSyncManager.js +167 -0
  73. package/dist/esm/dist/esm/services/useUrlSync.js +29 -0
  74. package/dist/esm/dist/esm/services/utils.js +71 -0
  75. package/dist/esm/dist/esm/utils/ControlsLabel.js +107 -0
  76. package/dist/esm/dist/esm/utils/LoadingIndicator.js +19 -0
  77. package/dist/esm/dist/esm/utils/SafeSerializableSceneObject.js +39 -0
  78. package/dist/esm/dist/esm/utils/compatibility/setWindowGrafanaSceneContext.js +16 -0
  79. package/dist/esm/dist/esm/utils/date.js +15 -0
  80. package/dist/esm/dist/esm/utils/evaluateTimeRange.js +16 -0
  81. package/dist/esm/dist/esm/utils/explore.js +47 -0
  82. package/dist/esm/dist/esm/utils/getCompareSeriesRefId.js +4 -0
  83. package/dist/esm/dist/esm/utils/getDataSource.js +18 -0
  84. package/dist/esm/dist/esm/utils/getMessageFromError.js +24 -0
  85. package/dist/esm/dist/esm/utils/metricTree.js +53 -0
  86. package/dist/esm/dist/esm/utils/parseUrlParam.js +41 -0
  87. package/dist/esm/dist/esm/utils/utils.js +11 -0
  88. package/dist/esm/dist/esm/utils/wrapInSafeSerializableSceneObject.js +30 -0
  89. package/dist/esm/dist/esm/utils/writeSceneLog.js +12 -0
  90. package/dist/esm/dist/esm/variables/VariableDependencyConfig.js +150 -0
  91. package/dist/esm/dist/esm/variables/VariableValueRecorder.js +71 -0
  92. package/dist/esm/dist/esm/variables/adhoc/AdHocFilterBuilder.js +24 -0
  93. package/dist/esm/dist/esm/variables/adhoc/AdHocFilterRenderer.js +303 -0
  94. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFilterPill.js +162 -0
  95. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersAlwaysWipCombobox.js +20 -0
  96. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js +640 -0
  97. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js +65 -0
  98. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersCombobox/DropdownItem.js +146 -0
  99. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersCombobox/MultiValuePill.js +114 -0
  100. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersCombobox/useFloatingInteractions.js +68 -0
  101. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersCombobox/utils.js +146 -0
  102. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersVariable.js +289 -0
  103. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js +76 -0
  104. package/dist/esm/dist/esm/variables/adhoc/getAdhocOptionSearcher.js +13 -0
  105. package/dist/esm/dist/esm/variables/adhoc/patchGetAdhocFilters.js +47 -0
  106. package/dist/esm/dist/esm/variables/components/VariableValueControl.js +23 -0
  107. package/dist/esm/dist/esm/variables/components/VariableValueInput.js +33 -0
  108. package/dist/esm/dist/esm/variables/components/VariableValueSelect.js +228 -0
  109. package/dist/esm/dist/esm/variables/components/VariableValueSelectors.js +72 -0
  110. package/dist/esm/dist/esm/variables/components/getOptionSearcher.js +15 -0
  111. package/dist/esm/dist/esm/variables/constants.js +9 -0
  112. package/dist/esm/dist/esm/variables/getEnrichedFiltersRequest.js +12 -0
  113. package/dist/esm/dist/esm/variables/groupby/GroupByVariable.js +259 -0
  114. package/dist/esm/dist/esm/variables/groupby/GroupByVariableUrlSyncHandler.js +63 -0
  115. package/dist/esm/dist/esm/variables/groupby/findActiveGroupByVariablesByUid.js +13 -0
  116. package/dist/esm/dist/esm/variables/interpolation/ScopedVarsVariable.js +40 -0
  117. package/dist/esm/dist/esm/variables/interpolation/defaults.js +21 -0
  118. package/dist/esm/dist/esm/variables/interpolation/fieldAccessorCache.js +13 -0
  119. package/dist/esm/dist/esm/variables/interpolation/formatRegistry.js +296 -0
  120. package/dist/esm/dist/esm/variables/interpolation/sceneInterpolator.js +87 -0
  121. package/dist/esm/dist/esm/variables/lookupVariable.js +20 -0
  122. package/dist/esm/dist/esm/variables/macros/AllVariablesMacro.js +57 -0
  123. package/dist/esm/dist/esm/variables/macros/contextMacros.js +43 -0
  124. package/dist/esm/dist/esm/variables/macros/dataMacros.js +134 -0
  125. package/dist/esm/dist/esm/variables/macros/index.js +26 -0
  126. package/dist/esm/dist/esm/variables/macros/templateProxies.js +51 -0
  127. package/dist/esm/dist/esm/variables/macros/timeMacros.js +86 -0
  128. package/dist/esm/dist/esm/variables/macros/types.js +11 -0
  129. package/dist/esm/dist/esm/variables/macros/urlMacros.js +56 -0
  130. package/dist/esm/dist/esm/variables/sets/SceneVariableSet.js +254 -0
  131. package/dist/esm/dist/esm/variables/types.js +11 -0
  132. package/dist/esm/dist/esm/variables/utils.js +172 -0
  133. package/dist/esm/dist/esm/variables/variants/ConstantVariable.js +38 -0
  134. package/dist/esm/dist/esm/variables/variants/CustomVariable.js +60 -0
  135. package/dist/esm/dist/esm/variables/variants/DataSourceVariable.js +88 -0
  136. package/dist/esm/dist/esm/variables/variants/IntervalVariable.js +117 -0
  137. package/dist/esm/dist/esm/variables/variants/MultiValueVariable.js +295 -0
  138. package/dist/esm/dist/esm/variables/variants/TestVariable.js +117 -0
  139. package/dist/esm/dist/esm/variables/variants/TextBoxVariable.js +61 -0
  140. package/dist/esm/dist/esm/variables/variants/query/QueryVariable.js +139 -0
  141. package/dist/esm/dist/esm/variables/variants/query/createQueryVariableRunner.js +129 -0
  142. package/dist/esm/dist/esm/variables/variants/query/guards.js +28 -0
  143. package/dist/esm/dist/esm/variables/variants/query/toMetricFindValues.js +96 -0
  144. package/dist/esm/dist/esm/variables/variants/query/utils.js +124 -0
  145. package/dist/esm/index.js +1 -1
  146. package/dist/esm/index.js.map +1 -1
  147. package/dist/esm/querying/DataProviderSharer.js +39 -0
  148. package/dist/esm/src/behaviors/ActWhenVariableChanged.js +27 -0
  149. package/dist/esm/src/behaviors/CursorSync.js +76 -0
  150. package/dist/esm/src/behaviors/LiveNowTimer.js +44 -0
  151. package/dist/esm/src/behaviors/SceneQueryController.js +60 -0
  152. package/dist/esm/src/behaviors/index.js +5 -0
  153. package/dist/esm/src/components/EmbeddedScene.js +59 -0
  154. package/dist/esm/src/components/NestedScene.js +95 -0
  155. package/dist/esm/src/components/SceneApp/SceneApp.js +37 -0
  156. package/dist/esm/src/components/SceneApp/SceneAppPage.js +176 -0
  157. package/dist/esm/src/components/SceneApp/SceneAppPageView.js +104 -0
  158. package/dist/esm/src/components/SceneApp/utils.js +42 -0
  159. package/dist/esm/src/components/SceneByFrameRepeater.js +41 -0
  160. package/dist/esm/src/components/SceneByVariableRepeater.js +55 -0
  161. package/dist/esm/src/components/SceneCanvasText.js +32 -0
  162. package/dist/esm/src/components/SceneControlsSpacer.js +17 -0
  163. package/dist/esm/src/components/SceneDebugger/DebugDetails.js +82 -0
  164. package/dist/esm/src/components/SceneDebugger/DebugTreeNode.js +72 -0
  165. package/dist/esm/src/components/SceneDebugger/SceneDebugger.js +77 -0
  166. package/dist/esm/src/components/SceneReactObject.js +34 -0
  167. package/dist/esm/src/components/SceneRefreshPicker.js +205 -0
  168. package/dist/esm/src/components/SceneTimePicker.js +139 -0
  169. package/dist/esm/src/components/SceneTimeRangeCompare.js +240 -0
  170. package/dist/esm/src/components/SceneToolbarButton.js +33 -0
  171. package/dist/esm/src/components/VizPanel/VizPanel.js +406 -0
  172. package/dist/esm/src/components/VizPanel/VizPanelExploreButton.js +44 -0
  173. package/dist/esm/src/components/VizPanel/VizPanelMenu.js +59 -0
  174. package/dist/esm/src/components/VizPanel/VizPanelRenderer.js +285 -0
  175. package/dist/esm/src/components/VizPanel/VizPanelSeriesLimit.js +45 -0
  176. package/dist/esm/src/components/VizPanel/colorSeriesConfigFactory.js +72 -0
  177. package/dist/esm/src/components/VizPanel/registerRuntimePanelPlugin.js +56 -0
  178. package/dist/esm/src/components/VizPanel/seriesVisibilityConfigFactory.js +164 -0
  179. package/dist/esm/src/components/layout/CSSGrid/SceneCSSGridLayout.js +124 -0
  180. package/dist/esm/src/components/layout/LazyLoader.js +103 -0
  181. package/dist/esm/src/components/layout/SceneFlexLayout.js +135 -0
  182. package/dist/esm/src/components/layout/grid/SceneGridItem.js +30 -0
  183. package/dist/esm/src/components/layout/grid/SceneGridLayout.js +283 -0
  184. package/dist/esm/src/components/layout/grid/SceneGridLayoutRenderer.js +178 -0
  185. package/dist/esm/src/components/layout/grid/SceneGridRow.js +190 -0
  186. package/dist/esm/src/components/layout/grid/constants.js +7 -0
  187. package/dist/esm/src/components/layout/grid/utils.js +36 -0
  188. package/dist/esm/src/components/layout/split/SplitLayout.js +17 -0
  189. package/dist/esm/src/components/layout/split/SplitLayoutRenderer.js +29 -0
  190. package/dist/esm/src/components/layout/split/Splitter.js +386 -0
  191. package/dist/esm/src/core/PanelBuilders/FieldConfigBuilder.js +100 -0
  192. package/dist/esm/src/core/PanelBuilders/FieldConfigBuilders.js +75 -0
  193. package/dist/esm/src/core/PanelBuilders/FieldConfigOverridesBuilder.js +75 -0
  194. package/dist/esm/src/core/PanelBuilders/PanelOptionsBuilder.js +22 -0
  195. package/dist/esm/src/core/PanelBuilders/PanelOptionsBuilders.js +85 -0
  196. package/dist/esm/src/core/PanelBuilders/StandardFieldConfigBuilders.js +52 -0
  197. package/dist/esm/src/core/PanelBuilders/VizConfigBuilder.js +78 -0
  198. package/dist/esm/src/core/PanelBuilders/VizConfigBuilders.js +114 -0
  199. package/dist/esm/src/core/PanelBuilders/VizPanelBuilder.js +162 -0
  200. package/dist/esm/src/core/PanelBuilders/index.js +116 -0
  201. package/dist/esm/src/core/SceneComponentWrapper.js +57 -0
  202. package/dist/esm/src/core/SceneDataNode.js +43 -0
  203. package/dist/esm/src/core/SceneObjectBase.js +286 -0
  204. package/dist/esm/src/core/SceneObjectRef.js +32 -0
  205. package/dist/esm/src/core/SceneTimeRange.js +231 -0
  206. package/dist/esm/src/core/SceneTimeRangeTransformerBase.js +35 -0
  207. package/dist/esm/src/core/SceneTimeZoneOverride.js +63 -0
  208. package/dist/esm/src/core/events.js +11 -0
  209. package/dist/esm/src/core/sceneGraph/getTimeRange.js +10 -0
  210. package/dist/esm/src/core/sceneGraph/index.js +25 -0
  211. package/dist/esm/src/core/sceneGraph/sceneGraph.js +178 -0
  212. package/dist/esm/src/core/sceneGraph/utils.js +64 -0
  213. package/dist/esm/src/core/types.js +15 -0
  214. package/dist/esm/src/index.js +108 -0
  215. package/dist/esm/src/querying/DataLayersMerger.js +46 -0
  216. package/dist/esm/src/querying/DataProviderProxy.js +37 -0
  217. package/dist/esm/src/querying/DataProviderSharer.js +108 -0
  218. package/dist/esm/src/querying/ExtraQueryProvider.js +6 -0
  219. package/dist/esm/src/querying/RuntimeDataSource.js +49 -0
  220. package/dist/esm/src/querying/SceneDataLayerSet.js +100 -0
  221. package/dist/esm/src/querying/SceneDataTransformer.js +178 -0
  222. package/dist/esm/src/querying/SceneQueryRunner.js +468 -0
  223. package/dist/esm/src/querying/extraQueryProcessingOperator.js +46 -0
  224. package/dist/esm/src/querying/getEnrichedDataRequest.js +12 -0
  225. package/dist/esm/src/querying/layers/SceneDataLayerBase.js +112 -0
  226. package/dist/esm/src/querying/layers/SceneDataLayerControls.js +51 -0
  227. package/dist/esm/src/querying/layers/annotations/AnnotationsDataLayer.js +130 -0
  228. package/dist/esm/src/querying/layers/annotations/filterAnnotations.js +85 -0
  229. package/dist/esm/src/querying/layers/annotations/standardAnnotationQuery.js +121 -0
  230. package/dist/esm/src/querying/layers/annotations/standardAnnotationsSupport.js +211 -0
  231. package/dist/esm/src/querying/layers/annotations/utils.js +77 -0
  232. package/dist/esm/src/querying/layers/index.js +2 -0
  233. package/dist/esm/src/querying/registerQueryWithController.js +41 -0
  234. package/dist/esm/src/services/SceneObjectUrlSyncConfig.js +30 -0
  235. package/dist/esm/src/services/UniqueUrlKeyMapper.js +45 -0
  236. package/dist/esm/src/services/UrlSyncContextProvider.js +17 -0
  237. package/dist/esm/src/services/UrlSyncManager.js +167 -0
  238. package/dist/esm/src/services/useUrlSync.js +29 -0
  239. package/dist/esm/src/services/utils.js +75 -0
  240. package/dist/esm/src/utils/ControlsLabel.js +107 -0
  241. package/dist/esm/src/utils/LoadingIndicator.js +19 -0
  242. package/dist/esm/src/utils/SafeSerializableSceneObject.js +39 -0
  243. package/dist/esm/src/utils/compatibility/setWindowGrafanaSceneContext.js +16 -0
  244. package/dist/esm/src/utils/date.js +15 -0
  245. package/dist/esm/src/utils/evaluateTimeRange.js +16 -0
  246. package/dist/esm/src/utils/explore.js +47 -0
  247. package/dist/esm/src/utils/getCompareSeriesRefId.js +4 -0
  248. package/dist/esm/src/utils/getDataSource.js +18 -0
  249. package/dist/esm/src/utils/getMessageFromError.js +24 -0
  250. package/dist/esm/src/utils/metricTree.js +53 -0
  251. package/dist/esm/src/utils/parseUrlParam.js +41 -0
  252. package/dist/esm/src/utils/utils.js +11 -0
  253. package/dist/esm/src/utils/wrapInSafeSerializableSceneObject.js +30 -0
  254. package/dist/esm/src/utils/writeSceneLog.js +12 -0
  255. package/dist/esm/src/variables/VariableDependencyConfig.js +150 -0
  256. package/dist/esm/src/variables/VariableValueRecorder.js +71 -0
  257. package/dist/esm/src/variables/adhoc/AdHocFilterBuilder.js +24 -0
  258. package/dist/esm/src/variables/adhoc/AdHocFilterRenderer.js +303 -0
  259. package/dist/esm/src/variables/adhoc/AdHocFiltersCombobox/AdHocFilterPill.js +162 -0
  260. package/dist/esm/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersAlwaysWipCombobox.js +20 -0
  261. package/dist/esm/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js +640 -0
  262. package/dist/esm/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js +65 -0
  263. package/dist/esm/src/variables/adhoc/AdHocFiltersCombobox/DropdownItem.js +146 -0
  264. package/dist/esm/src/variables/adhoc/AdHocFiltersCombobox/MultiValuePill.js +114 -0
  265. package/dist/esm/src/variables/adhoc/AdHocFiltersCombobox/useFloatingInteractions.js +68 -0
  266. package/dist/esm/src/variables/adhoc/AdHocFiltersCombobox/utils.js +146 -0
  267. package/dist/esm/src/variables/adhoc/AdHocFiltersVariable.js +289 -0
  268. package/dist/esm/src/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js +76 -0
  269. package/dist/esm/src/variables/adhoc/getAdhocOptionSearcher.js +13 -0
  270. package/dist/esm/src/variables/adhoc/patchGetAdhocFilters.js +47 -0
  271. package/dist/esm/src/variables/components/VariableValueControl.js +23 -0
  272. package/dist/esm/src/variables/components/VariableValueInput.js +33 -0
  273. package/dist/esm/src/variables/components/VariableValueSelect.js +228 -0
  274. package/dist/esm/src/variables/components/VariableValueSelectors.js +72 -0
  275. package/dist/esm/src/variables/components/getOptionSearcher.js +15 -0
  276. package/dist/esm/src/variables/constants.js +9 -0
  277. package/dist/esm/src/variables/getEnrichedFiltersRequest.js +12 -0
  278. package/dist/esm/src/variables/groupby/GroupByVariable.js +259 -0
  279. package/dist/esm/src/variables/groupby/GroupByVariableUrlSyncHandler.js +63 -0
  280. package/dist/esm/src/variables/groupby/findActiveGroupByVariablesByUid.js +13 -0
  281. package/dist/esm/src/variables/interpolation/ScopedVarsVariable.js +40 -0
  282. package/dist/esm/src/variables/interpolation/defaults.js +21 -0
  283. package/dist/esm/src/variables/interpolation/fieldAccessorCache.js +13 -0
  284. package/dist/esm/src/variables/interpolation/formatRegistry.js +296 -0
  285. package/dist/esm/src/variables/interpolation/sceneInterpolator.js +87 -0
  286. package/dist/esm/src/variables/lookupVariable.js +20 -0
  287. package/dist/esm/src/variables/macros/AllVariablesMacro.js +57 -0
  288. package/dist/esm/src/variables/macros/contextMacros.js +43 -0
  289. package/dist/esm/src/variables/macros/dataMacros.js +134 -0
  290. package/dist/esm/src/variables/macros/index.js +35 -0
  291. package/dist/esm/src/variables/macros/templateProxies.js +51 -0
  292. package/dist/esm/src/variables/macros/timeMacros.js +86 -0
  293. package/dist/esm/src/variables/macros/types.js +11 -0
  294. package/dist/esm/src/variables/macros/urlMacros.js +56 -0
  295. package/dist/esm/src/variables/sets/SceneVariableSet.js +254 -0
  296. package/dist/esm/src/variables/types.js +11 -0
  297. package/dist/esm/src/variables/utils.js +172 -0
  298. package/dist/esm/src/variables/variants/ConstantVariable.js +38 -0
  299. package/dist/esm/src/variables/variants/CustomVariable.js +60 -0
  300. package/dist/esm/src/variables/variants/DataSourceVariable.js +88 -0
  301. package/dist/esm/src/variables/variants/IntervalVariable.js +117 -0
  302. package/dist/esm/src/variables/variants/JsonVariable.js +193 -0
  303. package/dist/esm/src/variables/variants/LocalValueVariable.js +56 -0
  304. package/dist/esm/src/variables/variants/MultiValueVariable.js +295 -0
  305. package/dist/esm/src/variables/variants/TestVariable.js +117 -0
  306. package/dist/esm/src/variables/variants/TextBoxVariable.js +61 -0
  307. package/dist/esm/src/variables/variants/guards.js +27 -0
  308. package/dist/esm/src/variables/variants/query/QueryVariable.js +139 -0
  309. package/dist/esm/src/variables/variants/query/createQueryVariableRunner.js +129 -0
  310. package/dist/esm/src/variables/variants/query/guards.js +28 -0
  311. package/dist/esm/src/variables/variants/query/toMetricFindValues.js +96 -0
  312. package/dist/esm/src/variables/variants/query/utils.js +124 -0
  313. package/dist/esm/variables/components/VariableValueSelect.js +13 -9
  314. package/dist/esm/variables/components/VariableValueSelect.js.map +1 -1
  315. package/dist/esm/variables/variants/ConstantVariable.js +22 -0
  316. package/dist/esm/variables/variants/ConstantVariable.js.map +1 -1
  317. package/dist/esm/variables/variants/CustomVariable.js +3 -2
  318. package/dist/esm/variables/variants/CustomVariable.js.map +1 -1
  319. package/dist/esm/variables/variants/DataSourceVariable.js +3 -2
  320. package/dist/esm/variables/variants/DataSourceVariable.js.map +1 -1
  321. package/dist/esm/variables/variants/JsonVariable.js +96 -0
  322. package/dist/esm/variables/variants/TestVariable.js +3 -2
  323. package/dist/esm/variables/variants/TestVariable.js.map +1 -1
  324. package/dist/esm/variables/variants/json/JsonVariable.js +95 -0
  325. package/dist/esm/variables/variants/json/JsonVariableOptionProviders.js +70 -0
  326. package/dist/esm/variables/variants/query/QueryVariable.js +3 -2
  327. package/dist/esm/variables/variants/query/QueryVariable.js.map +1 -1
  328. package/dist/index.d.ts +14 -6
  329. package/dist/index.js +35 -13
  330. package/dist/index.js.map +1 -1
  331. package/package.json +2 -2
@@ -0,0 +1,468 @@
1
+ import { isEqual, cloneDeep } from 'lodash';
2
+ import { ReplaySubject, forkJoin } from 'rxjs';
3
+ import { LoadingState } from '@grafana/schema';
4
+ import { preProcessPanelData, DataTopic, DataFrameView, rangeUtil } from '@grafana/data';
5
+ import { getRunRequest, toDataQueryError, isExpressionReference } from '@grafana/runtime';
6
+ import { SceneObjectBase } from '../core/SceneObjectBase.js';
7
+ import { sceneGraph } from '../core/sceneGraph/index.js';
8
+ import { getDataSource } from '../utils/getDataSource.js';
9
+ import { VariableDependencyConfig } from '../variables/VariableDependencyConfig.js';
10
+ import { writeSceneLog } from '../utils/writeSceneLog.js';
11
+ import { VariableValueRecorder } from '../variables/VariableValueRecorder.js';
12
+ import { emptyPanelData } from '../core/SceneDataNode.js';
13
+ import { getClosest } from '../core/sceneGraph/utils.js';
14
+ import { isExtraQueryProvider } from './ExtraQueryProvider.js';
15
+ import { extraQueryProcessingOperator, passthroughProcessor } from './extraQueryProcessingOperator.js';
16
+ import { filterAnnotations } from './layers/annotations/filterAnnotations.js';
17
+ import { getEnrichedDataRequest } from './getEnrichedDataRequest.js';
18
+ import { findActiveAdHocFilterVariableByUid } from '../variables/adhoc/patchGetAdhocFilters.js';
19
+ import { registerQueryWithController } from './registerQueryWithController.js';
20
+ import { findActiveGroupByVariablesByUid } from '../variables/groupby/findActiveGroupByVariablesByUid.js';
21
+ import { GroupByVariable } from '../variables/groupby/GroupByVariable.js';
22
+ import { AdHocFiltersVariable, isFilterComplete } from '../variables/adhoc/AdHocFiltersVariable.js';
23
+ import { DataLayersMerger } from './DataLayersMerger.js';
24
+ import { interpolate } from '../core/sceneGraph/sceneGraph.js';
25
+ import { wrapInSafeSerializableSceneObject } from '../utils/wrapInSafeSerializableSceneObject.js';
26
+
27
+ var __defProp = Object.defineProperty;
28
+ var __defProps = Object.defineProperties;
29
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
30
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
31
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
32
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
33
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
34
+ var __spreadValues = (a, b) => {
35
+ for (var prop in b || (b = {}))
36
+ if (__hasOwnProp.call(b, prop))
37
+ __defNormalProp(a, prop, b[prop]);
38
+ if (__getOwnPropSymbols)
39
+ for (var prop of __getOwnPropSymbols(b)) {
40
+ if (__propIsEnum.call(b, prop))
41
+ __defNormalProp(a, prop, b[prop]);
42
+ }
43
+ return a;
44
+ };
45
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
46
+ let counter = 100;
47
+ function getNextRequestId() {
48
+ return "SQR" + counter++;
49
+ }
50
+ class SceneQueryRunner extends SceneObjectBase {
51
+ constructor(initialState) {
52
+ super(initialState);
53
+ this._dataLayersMerger = new DataLayersMerger();
54
+ this._variableValueRecorder = new VariableValueRecorder();
55
+ this._results = new ReplaySubject(1);
56
+ this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
57
+ this._variableDependency = new VariableDependencyConfig(this, {
58
+ statePaths: ["queries", "datasource"],
59
+ onVariableUpdateCompleted: this.onVariableUpdatesCompleted.bind(this),
60
+ onAnyVariableChanged: this.onAnyVariableChanged.bind(this)
61
+ });
62
+ this.onDataReceived = (data) => {
63
+ const preProcessedData = preProcessPanelData(data, this.state.data);
64
+ this._resultAnnotations = data.annotations;
65
+ const dataWithLayersApplied = this._combineDataLayers(preProcessedData);
66
+ let hasFetchedData = this.state._hasFetchedData;
67
+ if (!hasFetchedData && preProcessedData.state !== LoadingState.Loading) {
68
+ hasFetchedData = true;
69
+ }
70
+ this.setState({ data: dataWithLayersApplied, _hasFetchedData: hasFetchedData });
71
+ this._results.next({ origin: this, data: dataWithLayersApplied });
72
+ };
73
+ this.addActivationHandler(() => this._onActivate());
74
+ }
75
+ getResultsStream() {
76
+ return this._results;
77
+ }
78
+ _onActivate() {
79
+ if (this.isQueryModeAuto()) {
80
+ const timeRange = sceneGraph.getTimeRange(this);
81
+ const providers = this.getClosestExtraQueryProviders();
82
+ for (const provider of providers) {
83
+ this._subs.add(
84
+ provider.subscribeToState((n, p) => {
85
+ if (provider.shouldRerun(p, n, this.state.queries)) {
86
+ this.runQueries();
87
+ }
88
+ })
89
+ );
90
+ }
91
+ this.subscribeToTimeRangeChanges(timeRange);
92
+ if (this.shouldRunQueriesOnActivate()) {
93
+ this.runQueries();
94
+ }
95
+ }
96
+ if (!this._dataLayersSub) {
97
+ this._handleDataLayers();
98
+ }
99
+ return () => this._onDeactivate();
100
+ }
101
+ _handleDataLayers() {
102
+ const dataLayers = sceneGraph.getDataLayers(this);
103
+ if (dataLayers.length === 0) {
104
+ return;
105
+ }
106
+ this._dataLayersSub = this._dataLayersMerger.getMergedStream(dataLayers).subscribe(this._onLayersReceived.bind(this));
107
+ }
108
+ _onLayersReceived(results) {
109
+ var _a, _b, _c, _d, _e;
110
+ const timeRange = sceneGraph.getTimeRange(this);
111
+ const { dataLayerFilter } = this.state;
112
+ let annotations = [];
113
+ let alertStates = [];
114
+ let alertState;
115
+ for (const result of results) {
116
+ for (let frame of result.data.series) {
117
+ if (((_a = frame.meta) == null ? void 0 : _a.dataTopic) === DataTopic.Annotations) {
118
+ annotations = annotations.concat(frame);
119
+ }
120
+ if (((_b = frame.meta) == null ? void 0 : _b.dataTopic) === DataTopic.AlertStates) {
121
+ alertStates = alertStates.concat(frame);
122
+ }
123
+ }
124
+ }
125
+ if (dataLayerFilter == null ? void 0 : dataLayerFilter.panelId) {
126
+ if (annotations.length > 0) {
127
+ annotations = filterAnnotations(annotations, dataLayerFilter);
128
+ }
129
+ if (alertStates.length > 0) {
130
+ for (const frame of alertStates) {
131
+ const frameView = new DataFrameView(frame);
132
+ for (const row of frameView) {
133
+ if (row.panelId === dataLayerFilter.panelId) {
134
+ alertState = row;
135
+ break;
136
+ }
137
+ }
138
+ }
139
+ }
140
+ }
141
+ if (allFramesEmpty(annotations) && allFramesEmpty(this._layerAnnotations) && isEqual(alertState, (_c = this.state.data) == null ? void 0 : _c.alertState)) {
142
+ return;
143
+ }
144
+ this._layerAnnotations = annotations;
145
+ const baseStateUpdate = this.state.data ? this.state.data : __spreadProps(__spreadValues({}, emptyPanelData), { timeRange: timeRange.state.value });
146
+ this.setState({
147
+ data: __spreadProps(__spreadValues({}, baseStateUpdate), {
148
+ annotations: [...(_d = this._resultAnnotations) != null ? _d : [], ...annotations],
149
+ alertState: alertState != null ? alertState : (_e = this.state.data) == null ? void 0 : _e.alertState
150
+ })
151
+ });
152
+ }
153
+ onVariableUpdatesCompleted() {
154
+ if (this.isQueryModeAuto()) {
155
+ this.runQueries();
156
+ }
157
+ }
158
+ onAnyVariableChanged(variable) {
159
+ if (this._adhocFiltersVar === variable || this._groupByVar === variable || !this.isQueryModeAuto()) {
160
+ return;
161
+ }
162
+ if (variable instanceof AdHocFiltersVariable && this._isRelevantAutoVariable(variable)) {
163
+ this.runQueries();
164
+ }
165
+ if (variable instanceof GroupByVariable && this._isRelevantAutoVariable(variable)) {
166
+ this.runQueries();
167
+ }
168
+ }
169
+ _isRelevantAutoVariable(variable) {
170
+ var _a, _b;
171
+ const datasource = (_a = this.state.datasource) != null ? _a : findFirstDatasource(this.state.queries);
172
+ return variable.state.applyMode === "auto" && (datasource == null ? void 0 : datasource.uid) === ((_b = variable.state.datasource) == null ? void 0 : _b.uid);
173
+ }
174
+ shouldRunQueriesOnActivate() {
175
+ if (this._variableValueRecorder.hasDependenciesChanged(this)) {
176
+ writeSceneLog(
177
+ "SceneQueryRunner",
178
+ "Variable dependency changed while inactive, shouldRunQueriesOnActivate returns true"
179
+ );
180
+ return true;
181
+ }
182
+ if (!this.state.data) {
183
+ return true;
184
+ }
185
+ if (this._isDataTimeRangeStale(this.state.data)) {
186
+ return true;
187
+ }
188
+ return false;
189
+ }
190
+ _isDataTimeRangeStale(data) {
191
+ const timeRange = sceneGraph.getTimeRange(this);
192
+ const stateTimeRange = timeRange.state.value;
193
+ const dataTimeRange = data.timeRange;
194
+ if (stateTimeRange.from.unix() === dataTimeRange.from.unix() && stateTimeRange.to.unix() === dataTimeRange.to.unix()) {
195
+ return false;
196
+ }
197
+ writeSceneLog("SceneQueryRunner", "Data time range is stale");
198
+ return true;
199
+ }
200
+ _onDeactivate() {
201
+ var _a;
202
+ if (this._querySub) {
203
+ this._querySub.unsubscribe();
204
+ this._querySub = void 0;
205
+ }
206
+ if (this._dataLayersSub) {
207
+ this._dataLayersSub.unsubscribe();
208
+ this._dataLayersSub = void 0;
209
+ }
210
+ (_a = this._timeSub) == null ? void 0 : _a.unsubscribe();
211
+ this._timeSub = void 0;
212
+ this._timeSubRange = void 0;
213
+ this._adhocFiltersVar = void 0;
214
+ this._groupByVar = void 0;
215
+ this._variableValueRecorder.recordCurrentDependencyValuesForSceneObject(this);
216
+ }
217
+ setContainerWidth(width) {
218
+ if (!this._containerWidth && width > 0) {
219
+ this._containerWidth = width;
220
+ if (this.state.maxDataPointsFromWidth && !this.state.maxDataPoints) {
221
+ setTimeout(() => {
222
+ if (this.isActive && !this.state._hasFetchedData) {
223
+ this.runQueries();
224
+ }
225
+ }, 0);
226
+ }
227
+ } else {
228
+ if (width > 0) {
229
+ this._containerWidth = width;
230
+ }
231
+ }
232
+ }
233
+ isDataReadyToDisplay() {
234
+ return Boolean(this.state._hasFetchedData);
235
+ }
236
+ subscribeToTimeRangeChanges(timeRange) {
237
+ if (this._timeSubRange === timeRange) {
238
+ return;
239
+ }
240
+ if (this._timeSub) {
241
+ this._timeSub.unsubscribe();
242
+ }
243
+ this._timeSubRange = timeRange;
244
+ this._timeSub = timeRange.subscribeToState(() => {
245
+ this.runWithTimeRange(timeRange);
246
+ });
247
+ }
248
+ runQueries() {
249
+ const timeRange = sceneGraph.getTimeRange(this);
250
+ if (this.isQueryModeAuto()) {
251
+ this.subscribeToTimeRangeChanges(timeRange);
252
+ }
253
+ this.runWithTimeRange(timeRange);
254
+ }
255
+ getMaxDataPoints() {
256
+ var _a;
257
+ if (this.state.maxDataPoints) {
258
+ return this.state.maxDataPoints;
259
+ }
260
+ return this.state.maxDataPointsFromWidth ? (_a = this._containerWidth) != null ? _a : 500 : 500;
261
+ }
262
+ cancelQuery() {
263
+ var _a;
264
+ (_a = this._querySub) == null ? void 0 : _a.unsubscribe();
265
+ if (this._dataLayersSub) {
266
+ this._dataLayersSub.unsubscribe();
267
+ this._dataLayersSub = void 0;
268
+ }
269
+ this.setState({
270
+ data: __spreadProps(__spreadValues({}, this.state.data), { state: LoadingState.Done })
271
+ });
272
+ }
273
+ async runWithTimeRange(timeRange) {
274
+ var _a, _b, _c;
275
+ if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {
276
+ return;
277
+ }
278
+ if (!this._dataLayersSub) {
279
+ this._handleDataLayers();
280
+ }
281
+ (_a = this._querySub) == null ? void 0 : _a.unsubscribe();
282
+ if (this._variableDependency.hasDependencyInLoadingState()) {
283
+ writeSceneLog("SceneQueryRunner", "Variable dependency is in loading state, skipping query execution");
284
+ this.setState({ data: __spreadProps(__spreadValues({}, (_b = this.state.data) != null ? _b : emptyPanelData), { state: LoadingState.Loading }) });
285
+ return;
286
+ }
287
+ const { queries } = this.state;
288
+ if (!(queries == null ? void 0 : queries.length)) {
289
+ this._setNoDataState();
290
+ return;
291
+ }
292
+ try {
293
+ const datasource = (_c = this.state.datasource) != null ? _c : findFirstDatasource(queries);
294
+ const ds = await getDataSource(datasource, this._scopedVars);
295
+ this.findAndSubscribeToAdHocFilters(datasource == null ? void 0 : datasource.uid);
296
+ const runRequest = getRunRequest();
297
+ const { primary, secondaries, processors } = this.prepareRequests(timeRange, ds);
298
+ writeSceneLog("SceneQueryRunner", "Starting runRequest", this.state.key);
299
+ let stream = runRequest(ds, primary);
300
+ if (secondaries.length > 0) {
301
+ const secondaryStreams = secondaries.map((r) => runRequest(ds, r));
302
+ const op = extraQueryProcessingOperator(processors);
303
+ stream = forkJoin([stream, ...secondaryStreams]).pipe(op);
304
+ }
305
+ stream = stream.pipe(
306
+ registerQueryWithController({
307
+ type: "data",
308
+ request: primary,
309
+ origin: this,
310
+ cancel: () => this.cancelQuery()
311
+ })
312
+ );
313
+ this._querySub = stream.subscribe(this.onDataReceived);
314
+ } catch (err) {
315
+ console.error("PanelQueryRunner Error", err);
316
+ this.onDataReceived(__spreadProps(__spreadValues(__spreadValues({}, emptyPanelData), this.state.data), {
317
+ state: LoadingState.Error,
318
+ errors: [toDataQueryError(err)]
319
+ }));
320
+ }
321
+ }
322
+ clone(withState) {
323
+ var _a;
324
+ const clone = super.clone(withState);
325
+ if (this._resultAnnotations) {
326
+ clone["_resultAnnotations"] = this._resultAnnotations.map((frame) => __spreadValues({}, frame));
327
+ }
328
+ if (this._layerAnnotations) {
329
+ clone["_layerAnnotations"] = this._layerAnnotations.map((frame) => __spreadValues({}, frame));
330
+ }
331
+ clone["_variableValueRecorder"] = this._variableValueRecorder.cloneAndRecordCurrentValuesForSceneObject(this);
332
+ clone["_containerWidth"] = this._containerWidth;
333
+ clone["_results"].next({ origin: this, data: (_a = this.state.data) != null ? _a : emptyPanelData });
334
+ return clone;
335
+ }
336
+ prepareRequests(timeRange, ds) {
337
+ var _a;
338
+ const { minInterval, queries } = this.state;
339
+ let request = __spreadValues({
340
+ app: "scenes",
341
+ requestId: getNextRequestId(),
342
+ timezone: timeRange.getTimeZone(),
343
+ range: timeRange.state.value,
344
+ interval: "1s",
345
+ intervalMs: 1e3,
346
+ targets: cloneDeep(queries),
347
+ maxDataPoints: this.getMaxDataPoints(),
348
+ scopedVars: this._scopedVars,
349
+ startTime: Date.now(),
350
+ liveStreaming: this.state.liveStreaming,
351
+ rangeRaw: {
352
+ from: timeRange.state.from,
353
+ to: timeRange.state.to
354
+ },
355
+ cacheTimeout: this.state.cacheTimeout,
356
+ queryCachingTTL: this.state.queryCachingTTL
357
+ }, getEnrichedDataRequest(this));
358
+ if (this._adhocFiltersVar) {
359
+ request.filters = this._adhocFiltersVar.state.filters.filter(isFilterComplete);
360
+ }
361
+ if (this._groupByVar) {
362
+ request.groupByKeys = this._groupByVar.state.value;
363
+ }
364
+ request.targets = request.targets.map((query) => {
365
+ var _a2;
366
+ if (!query.datasource || query.datasource.uid !== ds.uid && !((_a2 = ds.meta) == null ? void 0 : _a2.mixed) && isExpressionReference && !isExpressionReference(query.datasource)) {
367
+ query.datasource = ds.getRef();
368
+ }
369
+ return query;
370
+ });
371
+ const lowerIntervalLimit = minInterval ? interpolate(this, minInterval) : ds.interval;
372
+ const norm = rangeUtil.calculateInterval(timeRange.state.value, request.maxDataPoints, lowerIntervalLimit);
373
+ request.scopedVars = Object.assign({}, request.scopedVars, {
374
+ __interval: { text: norm.interval, value: norm.interval },
375
+ __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs }
376
+ });
377
+ request.interval = norm.interval;
378
+ request.intervalMs = norm.intervalMs;
379
+ const primaryTimeRange = timeRange.state.value;
380
+ let secondaryRequests = [];
381
+ let secondaryProcessors = /* @__PURE__ */ new Map();
382
+ for (const provider of (_a = this.getClosestExtraQueryProviders()) != null ? _a : []) {
383
+ for (const { req, processor } of provider.getExtraQueries(request)) {
384
+ const requestId = getNextRequestId();
385
+ secondaryRequests.push(__spreadProps(__spreadValues({}, req), { requestId }));
386
+ secondaryProcessors.set(requestId, processor != null ? processor : passthroughProcessor);
387
+ }
388
+ }
389
+ request.range = primaryTimeRange;
390
+ return { primary: request, secondaries: secondaryRequests, processors: secondaryProcessors };
391
+ }
392
+ _combineDataLayers(data) {
393
+ if (this._layerAnnotations && this._layerAnnotations.length > 0) {
394
+ data.annotations = (data.annotations || []).concat(this._layerAnnotations);
395
+ }
396
+ if (this.state.data && this.state.data.alertState) {
397
+ data.alertState = this.state.data.alertState;
398
+ }
399
+ return data;
400
+ }
401
+ _setNoDataState() {
402
+ if (this.state.data !== emptyPanelData) {
403
+ this.setState({ data: emptyPanelData });
404
+ }
405
+ }
406
+ getClosestExtraQueryProviders() {
407
+ const found = /* @__PURE__ */ new Map();
408
+ if (!this.parent) {
409
+ return [];
410
+ }
411
+ getClosest(this.parent, (s) => {
412
+ if (isExtraQueryProvider(s) && !found.has(s.constructor)) {
413
+ found.set(s.constructor, s);
414
+ }
415
+ s.forEachChild((child) => {
416
+ if (isExtraQueryProvider(child) && !found.has(child.constructor)) {
417
+ found.set(child.constructor, child);
418
+ }
419
+ });
420
+ return null;
421
+ });
422
+ return Array.from(found.values());
423
+ }
424
+ findAndSubscribeToAdHocFilters(uid) {
425
+ const filtersVar = findActiveAdHocFilterVariableByUid(uid);
426
+ if (this._adhocFiltersVar !== filtersVar) {
427
+ this._adhocFiltersVar = filtersVar;
428
+ this._updateExplicitVariableDependencies();
429
+ }
430
+ const groupByVar = findActiveGroupByVariablesByUid(uid);
431
+ if (this._groupByVar !== groupByVar) {
432
+ this._groupByVar = groupByVar;
433
+ this._updateExplicitVariableDependencies();
434
+ }
435
+ }
436
+ _updateExplicitVariableDependencies() {
437
+ const explicitDependencies = [];
438
+ if (this._adhocFiltersVar) {
439
+ explicitDependencies.push(this._adhocFiltersVar.state.name);
440
+ }
441
+ if (this._groupByVar) {
442
+ explicitDependencies.push(this._groupByVar.state.name);
443
+ }
444
+ this._variableDependency.setVariableNames(explicitDependencies);
445
+ }
446
+ isQueryModeAuto() {
447
+ var _a;
448
+ return ((_a = this.state.runQueriesMode) != null ? _a : "auto") === "auto";
449
+ }
450
+ }
451
+ function findFirstDatasource(targets) {
452
+ var _a, _b;
453
+ return (_b = (_a = targets.find((t) => t.datasource !== null)) == null ? void 0 : _a.datasource) != null ? _b : void 0;
454
+ }
455
+ function allFramesEmpty(frames) {
456
+ if (!frames) {
457
+ return true;
458
+ }
459
+ for (let i = 0; i < frames.length; i++) {
460
+ if (frames[i].length > 0) {
461
+ return false;
462
+ }
463
+ }
464
+ return true;
465
+ }
466
+
467
+ export { SceneQueryRunner, findFirstDatasource, getNextRequestId };
468
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NlbmVRdWVyeVJ1bm5lci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3F1ZXJ5aW5nL1NjZW5lUXVlcnlSdW5uZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2xvbmVEZWVwLCBpc0VxdWFsIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZvcmtKb2luLCBSZXBsYXlTdWJqZWN0LCBVbnN1YnNjcmliYWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBEYXRhUXVlcnksIERhdGFTb3VyY2VSZWYsIExvYWRpbmdTdGF0ZSB9IGZyb20gJ0BncmFmYW5hL3NjaGVtYSc7XG5cbmltcG9ydCB7XG4gIEFsZXJ0U3RhdGVJbmZvLFxuICBEYXRhRnJhbWUsXG4gIERhdGFGcmFtZVZpZXcsXG4gIERhdGFRdWVyeVJlcXVlc3QsXG4gIERhdGFTb3VyY2VBcGksXG4gIERhdGFUb3BpYyxcbiAgUGFuZWxEYXRhLFxuICBwcmVQcm9jZXNzUGFuZWxEYXRhLFxuICByYW5nZVV0aWwsXG59IGZyb20gJ0BncmFmYW5hL2RhdGEnO1xuXG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBpZ25vcmUgYW5ub3RhdGlvbiB3aGVuIHRoZSBncmFmYW5hIHJ1bnRpbWUgZGVwZW5kZW5jeSBoYXMgYmVlbiB1cGRhdGVkXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBnZXRSdW5SZXF1ZXN0LCB0b0RhdGFRdWVyeUVycm9yLCBpc0V4cHJlc3Npb25SZWZlcmVuY2UsIGNvbmZpZyB9IGZyb20gJ0BncmFmYW5hL3J1bnRpbWUnO1xuXG5pbXBvcnQgeyBTY2VuZU9iamVjdEJhc2UgfSBmcm9tICcuLi9jb3JlL1NjZW5lT2JqZWN0QmFzZSc7XG5pbXBvcnQgeyBzY2VuZUdyYXBoIH0gZnJvbSAnLi4vY29yZS9zY2VuZUdyYXBoJztcbmltcG9ydCB7XG4gIERhdGFMYXllckZpbHRlcixcbiAgU2NlbmVEYXRhUHJvdmlkZXIsXG4gIFNjZW5lRGF0YVByb3ZpZGVyUmVzdWx0LFxuICBTY2VuZURhdGFRdWVyeSxcbiAgU2NlbmVPYmplY3RTdGF0ZSxcbiAgU2NlbmVUaW1lUmFuZ2VMaWtlLFxufSBmcm9tICcuLi9jb3JlL3R5cGVzJztcbmltcG9ydCB7IGdldERhdGFTb3VyY2UgfSBmcm9tICcuLi91dGlscy9nZXREYXRhU291cmNlJztcbmltcG9ydCB7IFZhcmlhYmxlRGVwZW5kZW5jeUNvbmZpZyB9IGZyb20gJy4uL3ZhcmlhYmxlcy9WYXJpYWJsZURlcGVuZGVuY3lDb25maWcnO1xuaW1wb3J0IHsgd3JpdGVTY2VuZUxvZyB9IGZyb20gJy4uL3V0aWxzL3dyaXRlU2NlbmVMb2cnO1xuaW1wb3J0IHsgVmFyaWFibGVWYWx1ZVJlY29yZGVyIH0gZnJvbSAnLi4vdmFyaWFibGVzL1ZhcmlhYmxlVmFsdWVSZWNvcmRlcic7XG5pbXBvcnQgeyBlbXB0eVBhbmVsRGF0YSB9IGZyb20gJy4uL2NvcmUvU2NlbmVEYXRhTm9kZSc7XG5pbXBvcnQgeyBnZXRDbG9zZXN0IH0gZnJvbSAnLi4vY29yZS9zY2VuZUdyYXBoL3V0aWxzJztcbmltcG9ydCB7IGlzRXh0cmFRdWVyeVByb3ZpZGVyLCBFeHRyYVF1ZXJ5RGF0YVByb2Nlc3NvciwgRXh0cmFRdWVyeVByb3ZpZGVyIH0gZnJvbSAnLi9FeHRyYVF1ZXJ5UHJvdmlkZXInO1xuaW1wb3J0IHsgcGFzc3Rocm91Z2hQcm9jZXNzb3IsIGV4dHJhUXVlcnlQcm9jZXNzaW5nT3BlcmF0b3IgfSBmcm9tICcuL2V4dHJhUXVlcnlQcm9jZXNzaW5nT3BlcmF0b3InO1xuaW1wb3J0IHsgZmlsdGVyQW5ub3RhdGlvbnMgfSBmcm9tICcuL2xheWVycy9hbm5vdGF0aW9ucy9maWx0ZXJBbm5vdGF0aW9ucyc7XG5pbXBvcnQgeyBnZXRFbnJpY2hlZERhdGFSZXF1ZXN0IH0gZnJvbSAnLi9nZXRFbnJpY2hlZERhdGFSZXF1ZXN0JztcbmltcG9ydCB7IGZpbmRBY3RpdmVBZEhvY0ZpbHRlclZhcmlhYmxlQnlVaWQgfSBmcm9tICcuLi92YXJpYWJsZXMvYWRob2MvcGF0Y2hHZXRBZGhvY0ZpbHRlcnMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJRdWVyeVdpdGhDb250cm9sbGVyIH0gZnJvbSAnLi9yZWdpc3RlclF1ZXJ5V2l0aENvbnRyb2xsZXInO1xuaW1wb3J0IHsgZmluZEFjdGl2ZUdyb3VwQnlWYXJpYWJsZXNCeVVpZCB9IGZyb20gJy4uL3ZhcmlhYmxlcy9ncm91cGJ5L2ZpbmRBY3RpdmVHcm91cEJ5VmFyaWFibGVzQnlVaWQnO1xuaW1wb3J0IHsgR3JvdXBCeVZhcmlhYmxlIH0gZnJvbSAnLi4vdmFyaWFibGVzL2dyb3VwYnkvR3JvdXBCeVZhcmlhYmxlJztcbmltcG9ydCB7IEFkSG9jRmlsdGVyc1ZhcmlhYmxlLCBpc0ZpbHRlckNvbXBsZXRlIH0gZnJvbSAnLi4vdmFyaWFibGVzL2FkaG9jL0FkSG9jRmlsdGVyc1ZhcmlhYmxlJztcbmltcG9ydCB7IFNjZW5lVmFyaWFibGUgfSBmcm9tICcuLi92YXJpYWJsZXMvdHlwZXMnO1xuaW1wb3J0IHsgRGF0YUxheWVyc01lcmdlciB9IGZyb20gJy4vRGF0YUxheWVyc01lcmdlcic7XG5pbXBvcnQgeyBpbnRlcnBvbGF0ZSB9IGZyb20gJy4uL2NvcmUvc2NlbmVHcmFwaC9zY2VuZUdyYXBoJztcbmltcG9ydCB7IHdyYXBJblNhZmVTZXJpYWxpemFibGVTY2VuZU9iamVjdCB9IGZyb20gJy4uL3V0aWxzL3dyYXBJblNhZmVTZXJpYWxpemFibGVTY2VuZU9iamVjdCc7XG5cbmxldCBjb3VudGVyID0gMTAwO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV4dFJlcXVlc3RJZCgpIHtcbiAgcmV0dXJuICdTUVInICsgY291bnRlcisrO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5UnVubmVyU3RhdGUgZXh0ZW5kcyBTY2VuZU9iamVjdFN0YXRlIHtcbiAgZGF0YT86IFBhbmVsRGF0YTtcbiAgcXVlcmllczogU2NlbmVEYXRhUXVlcnlbXTtcbiAgZGF0YXNvdXJjZT86IERhdGFTb3VyY2VSZWY7XG4gIG1pbkludGVydmFsPzogc3RyaW5nO1xuICBtYXhEYXRhUG9pbnRzPzogbnVtYmVyO1xuICBsaXZlU3RyZWFtaW5nPzogYm9vbGVhbjtcbiAgbWF4RGF0YVBvaW50c0Zyb21XaWR0aD86IGJvb2xlYW47XG4gIGNhY2hlVGltZW91dD86IERhdGFRdWVyeVJlcXVlc3RbJ2NhY2hlVGltZW91dCddO1xuICBxdWVyeUNhY2hpbmdUVEw/OiBEYXRhUXVlcnlSZXF1ZXN0WydxdWVyeUNhY2hpbmdUVEwnXTtcbiAgLyoqXG4gICAqIFdoZW4gc2V0IHRvIGF1dG8gKHRoZSBkZWZhdWx0KSBxdWVyeSBydW5uZXIgd2lsbCBpc3N1ZSBxdWVyaWVzIG9uIGFjdGl2YXRlICh3aGVuIHZhcmlhYmxlIGRlcGVuZGVuY2llcyBhcmUgcmVhZHkpIG9yIHdoZW4gdGltZSByYW5nZSBjaGFuZ2UuXG4gICAqIFNldCB0byBtYW51YWwgdG8gaGF2ZSBmdWxsIG1hbnVhbCBjb250cm9sIG92ZXIgd2hlbiBxdWVyaWVzIGFyZSBpc3N1ZWQuIFRyeSBub3QgdG8gc2V0IHRoaXMuIFRoaXMgaXMgbWFpbmx5IHVzZWZ1bCBmb3IgdW5pdCB0ZXN0cywgb3Igc3BlY2lhbCBlZGdlIGNhc2Ugd29ya2Zsb3dzLlxuICAgKi9cbiAgcnVuUXVlcmllc01vZGU/OiAnYXV0bycgfCAnbWFudWFsJztcbiAgLy8gRmlsdGVycyB0byBiZSBhcHBsaWVkIHRvIGRhdGEgbGF5ZXIgcmVzdWx0cyBiZWZvcmUgY29tYmluaW5nIHRoZW0gd2l0aCBTUVIgcmVzdWx0c1xuICBkYXRhTGF5ZXJGaWx0ZXI/OiBEYXRhTGF5ZXJGaWx0ZXI7XG4gIC8vIFByaXZhdGUgcnVudGltZSBzdGF0ZVxuICBfaGFzRmV0Y2hlZERhdGE/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFRdWVyeUV4dGVuZGVkIGV4dGVuZHMgRGF0YVF1ZXJ5IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuXG4gIC8vIE9wdCB0aGlzIHF1ZXJ5IG91dCBvZiB0aW1lIHdpbmRvdyBjb21wYXJpc29uXG4gIHRpbWVSYW5nZUNvbXBhcmU/OiBib29sZWFuO1xufVxuXG4vLyBUaGUgcmVxdWVzdHMgdGhhdCB3aWxsIGJlIHJ1biBieSB0aGUgcXVlcnkgcnVubmVyLlxuLy9cbi8vIEdlbmVyYWxseSB0aGUgcXVlcnkgcnVubmVyIHdpbGwgcnVuIGEgc2luZ2xlIHByaW1hcnkgcmVxdWVzdC5cbi8vIElmIHRoZSBzY2VuZSBncmFwaCBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2Zcbi8vIGBFeHRyYVF1ZXJ5UHJvdmlkZXJgLCB0aGUgcmVxdWVzdHMgY3JlYXRlZCBieSB0aGVzZVxuLy8gaW1wbGVtZW50YXRpb25zIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2Ygc2Vjb25kYXJ5IHJlcXVlc3RzLFxuLy8gYW5kIHRoZXNlIHdpbGwgYmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgcHJpbWFyeSByZXF1ZXN0LlxuLy9cbi8vIFRoZSByZXN1bHRzIG9mIGVhY2ggc2Vjb25kYXJ5IHJlcXVlc3Qgd2lsbCBiZSBwYXNzZWQgdG8gYW4gYXNzb2NpYXRlZFxuLy8gcHJvY2Vzc29yIGZ1bmN0aW9uIChhbG9uZyB3aXRoIHRoZSByZXN1bHRzIG9mIHRoZSBwcmltYXJ5IHJlcXVlc3QpLFxuLy8gd2hpY2ggY2FuIHRyYW5zZm9ybSB0aGUgcmVzdWx0cyBhcyBkZXNpcmVkLlxuaW50ZXJmYWNlIFByZXBhcmVkUmVxdWVzdHMge1xuICAvLyBUaGUgcHJpbWFyeSByZXF1ZXN0IHRvIHJ1bi5cbiAgcHJpbWFyeTogRGF0YVF1ZXJ5UmVxdWVzdDtcbiAgLy8gQSBwb3NzaWJseSBlbXB0eSBsaXN0IG9mIHNlY29uZGFyeSByZXF1ZXN0cyB0byBydW4gYWxvbmdzaWRlXG4gIC8vIHRoZSBwcmltYXJ5IHJlcXVlc3QuXG4gIHNlY29uZGFyaWVzOiBEYXRhUXVlcnlSZXF1ZXN0W107XG4gIC8vIEEgbWFwIGZyb20gYHJlcXVlc3RJZGAgb2Ygc2Vjb25kYXJ5IHJlcXVlc3RzIHRvIHByb2Nlc3NvcnNcbiAgLy8gZm9yIHRob3NlIHJlcXVlc3RzLiBQcm92aWRlZCBieSB0aGUgYEV4dHJhUXVlcnlQcm92aWRlcmAuXG4gIHByb2Nlc3NvcnM6IE1hcDxzdHJpbmcsIEV4dHJhUXVlcnlEYXRhUHJvY2Vzc29yPjtcbn1cblxuZXhwb3J0IGNsYXNzIFNjZW5lUXVlcnlSdW5uZXIgZXh0ZW5kcyBTY2VuZU9iamVjdEJhc2U8UXVlcnlSdW5uZXJTdGF0ZT4gaW1wbGVtZW50cyBTY2VuZURhdGFQcm92aWRlciB7XG4gIHByaXZhdGUgX3F1ZXJ5U3ViPzogVW5zdWJzY3JpYmFibGU7XG4gIHByaXZhdGUgX2RhdGFMYXllcnNTdWI/OiBVbnN1YnNjcmliYWJsZTtcbiAgcHJpdmF0ZSBfZGF0YUxheWVyc01lcmdlciA9IG5ldyBEYXRhTGF5ZXJzTWVyZ2VyKCk7XG4gIHByaXZhdGUgX3RpbWVTdWI/OiBVbnN1YnNjcmliYWJsZTtcbiAgcHJpdmF0ZSBfdGltZVN1YlJhbmdlPzogU2NlbmVUaW1lUmFuZ2VMaWtlO1xuICBwcml2YXRlIF9jb250YWluZXJXaWR0aD86IG51bWJlcjtcbiAgcHJpdmF0ZSBfdmFyaWFibGVWYWx1ZVJlY29yZGVyID0gbmV3IFZhcmlhYmxlVmFsdWVSZWNvcmRlcigpO1xuICBwcml2YXRlIF9yZXN1bHRzID0gbmV3IFJlcGxheVN1YmplY3Q8U2NlbmVEYXRhUHJvdmlkZXJSZXN1bHQ+KDEpO1xuICBwcml2YXRlIF9zY29wZWRWYXJzID0geyBfX3NjZW5lT2JqZWN0OiB3cmFwSW5TYWZlU2VyaWFsaXphYmxlU2NlbmVPYmplY3QodGhpcykgfTtcbiAgcHJpdmF0ZSBfbGF5ZXJBbm5vdGF0aW9ucz86IERhdGFGcmFtZVtdO1xuICBwcml2YXRlIF9yZXN1bHRBbm5vdGF0aW9ucz86IERhdGFGcmFtZVtdO1xuXG4gIHByaXZhdGUgX2FkaG9jRmlsdGVyc1Zhcj86IEFkSG9jRmlsdGVyc1ZhcmlhYmxlO1xuICBwcml2YXRlIF9ncm91cEJ5VmFyPzogR3JvdXBCeVZhcmlhYmxlO1xuXG4gIHB1YmxpYyBnZXRSZXN1bHRzU3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXN1bHRzO1xuICB9XG5cbiAgcHJvdGVjdGVkIF92YXJpYWJsZURlcGVuZGVuY3k6IFZhcmlhYmxlRGVwZW5kZW5jeUNvbmZpZzxRdWVyeVJ1bm5lclN0YXRlPiA9IG5ldyBWYXJpYWJsZURlcGVuZGVuY3lDb25maWcodGhpcywge1xuICAgIHN0YXRlUGF0aHM6IFsncXVlcmllcycsICdkYXRhc291cmNlJ10sXG4gICAgb25WYXJpYWJsZVVwZGF0ZUNvbXBsZXRlZDogdGhpcy5vblZhcmlhYmxlVXBkYXRlc0NvbXBsZXRlZC5iaW5kKHRoaXMpLFxuICAgIG9uQW55VmFyaWFibGVDaGFuZ2VkOiB0aGlzLm9uQW55VmFyaWFibGVDaGFuZ2VkLmJpbmQodGhpcyksXG4gIH0pO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihpbml0aWFsU3RhdGU6IFF1ZXJ5UnVubmVyU3RhdGUpIHtcbiAgICBzdXBlcihpbml0aWFsU3RhdGUpO1xuXG4gICAgdGhpcy5hZGRBY3RpdmF0aW9uSGFuZGxlcigoKSA9PiB0aGlzLl9vbkFjdGl2YXRlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25BY3RpdmF0ZSgpIHtcbiAgICBpZiAodGhpcy5pc1F1ZXJ5TW9kZUF1dG8oKSkge1xuICAgICAgY29uc3QgdGltZVJhbmdlID0gc2NlbmVHcmFwaC5nZXRUaW1lUmFuZ2UodGhpcyk7XG5cbiAgICAgIC8vIEFkZCBzdWJzY3JpcHRpb25zIHRvIGFueSBleHRyYSBwcm92aWRlcnMgc28gdGhhdCB0aGV5IHJlcnVuIHF1ZXJpZXNcbiAgICAgIC8vIHdoZW4gdGhlaXIgc3RhdGUgY2hhbmdlcyBhbmQgdGhleSBzaG91bGQgcmVydW4uXG4gICAgICBjb25zdCBwcm92aWRlcnMgPSB0aGlzLmdldENsb3Nlc3RFeHRyYVF1ZXJ5UHJvdmlkZXJzKCk7XG4gICAgICBmb3IgKGNvbnN0IHByb3ZpZGVyIG9mIHByb3ZpZGVycykge1xuICAgICAgICB0aGlzLl9zdWJzLmFkZChcbiAgICAgICAgICBwcm92aWRlci5zdWJzY3JpYmVUb1N0YXRlKChuLCBwKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXIuc2hvdWxkUmVydW4ocCwgbiwgdGhpcy5zdGF0ZS5xdWVyaWVzKSkge1xuICAgICAgICAgICAgICB0aGlzLnJ1blF1ZXJpZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN1YnNjcmliZVRvVGltZVJhbmdlQ2hhbmdlcyh0aW1lUmFuZ2UpO1xuXG4gICAgICBpZiAodGhpcy5zaG91bGRSdW5RdWVyaWVzT25BY3RpdmF0ZSgpKSB7XG4gICAgICAgIHRoaXMucnVuUXVlcmllcygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5fZGF0YUxheWVyc1N1Yikge1xuICAgICAgdGhpcy5faGFuZGxlRGF0YUxheWVycygpO1xuICAgIH1cblxuICAgIHJldHVybiAoKSA9PiB0aGlzLl9vbkRlYWN0aXZhdGUoKTtcbiAgfVxuXG4gIC8vIFRoaXMgbWV0aG9kIHN1YnNjcmliZXMgdG8gYWxsIFNjZW5lRGF0YUxheWVycyB1cCB1bnRpbCB0aGUgcm9vdCwgYW5kIGNvbWJpbmVzIHRoZSByZXN1bHRzIGludG8gZGF0YSBwcm92aWRlZCBmcm9tIFNjZW5lUXVlcnlSdW5uZXJcbiAgcHJpdmF0ZSBfaGFuZGxlRGF0YUxheWVycygpIHtcbiAgICBjb25zdCBkYXRhTGF5ZXJzID0gc2NlbmVHcmFwaC5nZXREYXRhTGF5ZXJzKHRoaXMpO1xuXG4gICAgaWYgKGRhdGFMYXllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0YUxheWVyc1N1YiA9IHRoaXMuX2RhdGFMYXllcnNNZXJnZXJcbiAgICAgIC5nZXRNZXJnZWRTdHJlYW0oZGF0YUxheWVycylcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5fb25MYXllcnNSZWNlaXZlZC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uTGF5ZXJzUmVjZWl2ZWQocmVzdWx0czogSXRlcmFibGU8U2NlbmVEYXRhUHJvdmlkZXJSZXN1bHQ+KSB7XG4gICAgY29uc3QgdGltZVJhbmdlID0gc2NlbmVHcmFwaC5nZXRUaW1lUmFuZ2UodGhpcyk7XG4gICAgY29uc3QgeyBkYXRhTGF5ZXJGaWx0ZXIgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICBsZXQgYW5ub3RhdGlvbnM6IERhdGFGcmFtZVtdID0gW107XG4gICAgbGV0IGFsZXJ0U3RhdGVzOiBEYXRhRnJhbWVbXSA9IFtdO1xuICAgIGxldCBhbGVydFN0YXRlOiBBbGVydFN0YXRlSW5mbyB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgIGZvciAobGV0IGZyYW1lIG9mIHJlc3VsdC5kYXRhLnNlcmllcykge1xuICAgICAgICBpZiAoZnJhbWUubWV0YT8uZGF0YVRvcGljID09PSBEYXRhVG9waWMuQW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICBhbm5vdGF0aW9ucyA9IGFubm90YXRpb25zLmNvbmNhdChmcmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZyYW1lLm1ldGE/LmRhdGFUb3BpYyA9PT0gRGF0YVRvcGljLkFsZXJ0U3RhdGVzKSB7XG4gICAgICAgICAgYWxlcnRTdGF0ZXMgPSBhbGVydFN0YXRlcy5jb25jYXQoZnJhbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRhdGFMYXllckZpbHRlcj8ucGFuZWxJZCkge1xuICAgICAgaWYgKGFubm90YXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYW5ub3RhdGlvbnMgPSBmaWx0ZXJBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucywgZGF0YUxheWVyRmlsdGVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFsZXJ0U3RhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCBmcmFtZSBvZiBhbGVydFN0YXRlcykge1xuICAgICAgICAgIGNvbnN0IGZyYW1lVmlldyA9IG5ldyBEYXRhRnJhbWVWaWV3PEFsZXJ0U3RhdGVJbmZvPihmcmFtZSk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiBmcmFtZVZpZXcpIHtcbiAgICAgICAgICAgIGlmIChyb3cucGFuZWxJZCA9PT0gZGF0YUxheWVyRmlsdGVyLnBhbmVsSWQpIHtcbiAgICAgICAgICAgICAgYWxlcnRTdGF0ZSA9IHJvdztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2tpcCB1bm5lc3Nhcnkgc3RhdGUgdXBkYXRlc1xuICAgIGlmIChcbiAgICAgIGFsbEZyYW1lc0VtcHR5KGFubm90YXRpb25zKSAmJlxuICAgICAgYWxsRnJhbWVzRW1wdHkodGhpcy5fbGF5ZXJBbm5vdGF0aW9ucykgJiZcbiAgICAgIGlzRXF1YWwoYWxlcnRTdGF0ZSwgdGhpcy5zdGF0ZS5kYXRhPy5hbGVydFN0YXRlKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xheWVyQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucztcblxuICAgIGNvbnN0IGJhc2VTdGF0ZVVwZGF0ZSA9IHRoaXMuc3RhdGUuZGF0YSA/IHRoaXMuc3RhdGUuZGF0YSA6IHsgLi4uZW1wdHlQYW5lbERhdGEsIHRpbWVSYW5nZTogdGltZVJhbmdlLnN0YXRlLnZhbHVlIH07XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgLi4uYmFzZVN0YXRlVXBkYXRlLFxuICAgICAgICBhbm5vdGF0aW9uczogWy4uLih0aGlzLl9yZXN1bHRBbm5vdGF0aW9ucyA/PyBbXSksIC4uLmFubm90YXRpb25zXSxcbiAgICAgICAgYWxlcnRTdGF0ZTogYWxlcnRTdGF0ZSA/PyB0aGlzLnN0YXRlLmRhdGE/LmFsZXJ0U3RhdGUsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgdHJpZXMgdG8gc3RhcnQgYSBuZXcgcXVlcnkgd2hlbmV2ZXIgYSB2YXJpYWJsZSBjb21wbGV0ZXMgb3IgaXMgY2hhbmdlZC5cbiAgICpcbiAgICogV2UgY2FyZSBhYm91dCB2YXJpYWJsZSB1cGRhdGUgY29tcGxldGlvbnMgZXZlbiB3aGVuIHRoZSB2YXJpYWJsZSBoYXMgbm90IGNoYW5nZWQgYW5kIGV2ZW4gd2hlbiBpdCBpcyBub3QgYSBkaXJlY3QgZGVwZW5kZW5jeS5cbiAgICogRXhhbXBsZTogVmFyaWFibGVzIEEgYW5kIEIgKEIgZGVwZW5kcyBvbiBBKS4gQSB1cGRhdGUgZGVwZW5kcyBvbiB0aW1lIHJhbmdlLiBTbyB3aGVuIHRpbWUgY2hhbmdlIHF1ZXJ5IHJ1bm5lciB3aWxsXG4gICAqIGZpbmQgdGhhdCB2YXJpYWJsZSBBIGlzIGxvYWRpbmcgd2hpY2ggaXMgYSBkZXBlbmRlbmN5IG9uIG9mIHZhcmlhYmxlIEIgc28gd2lsbCBzZXQgX2lzV2FpdGluZ0ZvclZhcmlhYmxlcyB0byB0cnVlIGFuZFxuICAgKiBub3QgaXNzdWUgYW55IHF1ZXJ5LlxuICAgKlxuICAgKiBXaGVuIEEgY29tcGxldGVzIGl0J3MgbG9hZGluZyAod2l0aCBubyB2YWx1ZSBjaGFuZ2UsIHNvIEIgbmV2ZXIgdXBkYXRlcykgaXQgd2lsbCBjYXVzZSBhIGNhbGwgb2YgdGhpcyBmdW5jdGlvbiBsZXR0aW5nXG4gICAqIHRoZSBxdWVyeSBydW5uZXIga25vdyB0aGF0IEEgaGFzIGNvbXBsZXRlZCwgYW5kIGluIGNhc2UgX2lzV2FpdGluZ0ZvclZhcmlhYmxlcyB3ZSB0cnkgdG8gcnVuIHRoZSBxdWVyeS4gVGhlIHF1ZXJ5IHdpbGxcbiAgICogb25seSBydW4gaWYgYWxsIHZhcmlhYmxlcyBhcmUgaW4gYSBub24gbG9hZGluZyBzdGF0ZSBzbyBpbiBvdGhlciBzY2VuYXJpb3Mgd2hlcmUgYSBxdWVyeSBkZXBlbmRzIG9uIG1hbnkgdmFyaWFibGVzIHRoaXMgd2lsbFxuICAgKiBiZSBjYWxsZWQgbWFueSB0aW1lcyB1bnRpbCBhbGwgZGVwZW5kZW5jaWVzIGFyZSBpbiBhIG5vbiBsb2FkaW5nIHN0YXRlLiAgICpcbiAgICovXG4gIHByaXZhdGUgb25WYXJpYWJsZVVwZGF0ZXNDb21wbGV0ZWQoKSB7XG4gICAgaWYgKHRoaXMuaXNRdWVyeU1vZGVBdXRvKCkpIHtcbiAgICAgIHRoaXMucnVuUXVlcmllcygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB2YWx1ZSBjaGFuZ2VkIGlzIGEgYWRob2MgZmlsdGVyIG8gZ3JvdXAgYnkgdmFyaWFibGUgdGhhdCBkaWQgbm90IGV4aXN0IHdoZW4gd2UgaXNzdWVkIHRoZSBsYXN0IHF1ZXJ5XG4gICAqL1xuICBwcml2YXRlIG9uQW55VmFyaWFibGVDaGFuZ2VkKHZhcmlhYmxlOiBTY2VuZVZhcmlhYmxlKSB7XG4gICAgLy8gSWYgdGhpcyB2YXJpYWJsZSBoYXMgYWxyZWFkeSBiZWVuIGRldGVjdGVkIHRoaXMgdmFyaWFibGUgYXMgYSBkZXBlbmRlbmN5IG9uVmFyaWFibGVVcGRhdGVzQ29tcGxldGVkIGFib3ZlIHdpbGwgaGFuZGxlIHZhbHVlIGNoYW5nZXNcbiAgICBpZiAodGhpcy5fYWRob2NGaWx0ZXJzVmFyID09PSB2YXJpYWJsZSB8fCB0aGlzLl9ncm91cEJ5VmFyID09PSB2YXJpYWJsZSB8fCAhdGhpcy5pc1F1ZXJ5TW9kZUF1dG8oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2YXJpYWJsZSBpbnN0YW5jZW9mIEFkSG9jRmlsdGVyc1ZhcmlhYmxlICYmIHRoaXMuX2lzUmVsZXZhbnRBdXRvVmFyaWFibGUodmFyaWFibGUpKSB7XG4gICAgICB0aGlzLnJ1blF1ZXJpZXMoKTtcbiAgICB9XG5cbiAgICBpZiAodmFyaWFibGUgaW5zdGFuY2VvZiBHcm91cEJ5VmFyaWFibGUgJiYgdGhpcy5faXNSZWxldmFudEF1dG9WYXJpYWJsZSh2YXJpYWJsZSkpIHtcbiAgICAgIHRoaXMucnVuUXVlcmllcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2lzUmVsZXZhbnRBdXRvVmFyaWFibGUodmFyaWFibGU6IEFkSG9jRmlsdGVyc1ZhcmlhYmxlIHwgR3JvdXBCeVZhcmlhYmxlKSB7XG4gICAgY29uc3QgZGF0YXNvdXJjZSA9IHRoaXMuc3RhdGUuZGF0YXNvdXJjZSA/PyBmaW5kRmlyc3REYXRhc291cmNlKHRoaXMuc3RhdGUucXVlcmllcyk7XG4gICAgcmV0dXJuIHZhcmlhYmxlLnN0YXRlLmFwcGx5TW9kZSA9PT0gJ2F1dG8nICYmIGRhdGFzb3VyY2U/LnVpZCA9PT0gdmFyaWFibGUuc3RhdGUuZGF0YXNvdXJjZT8udWlkO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSdW5RdWVyaWVzT25BY3RpdmF0ZSgpIHtcbiAgICBpZiAodGhpcy5fdmFyaWFibGVWYWx1ZVJlY29yZGVyLmhhc0RlcGVuZGVuY2llc0NoYW5nZWQodGhpcykpIHtcbiAgICAgIHdyaXRlU2NlbmVMb2coXG4gICAgICAgICdTY2VuZVF1ZXJ5UnVubmVyJyxcbiAgICAgICAgJ1ZhcmlhYmxlIGRlcGVuZGVuY3kgY2hhbmdlZCB3aGlsZSBpbmFjdGl2ZSwgc2hvdWxkUnVuUXVlcmllc09uQWN0aXZhdGUgcmV0dXJucyB0cnVlJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IGRhdGEgd2Ugc2hvdWxkIHJ1biBxdWVyaWVzXG4gICAgaWYgKCF0aGlzLnN0YXRlLmRhdGEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIElmIHRpbWUgcmFuZ2UgaXMgc3RhbGUgLyBkaWZmZXJlbnQgd2Ugc2hvdWxkIHJ1biBxdWVyaWVzXG4gICAgaWYgKHRoaXMuX2lzRGF0YVRpbWVSYW5nZVN0YWxlKHRoaXMuc3RhdGUuZGF0YSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzRGF0YVRpbWVSYW5nZVN0YWxlKGRhdGE6IFBhbmVsRGF0YSkge1xuICAgIGNvbnN0IHRpbWVSYW5nZSA9IHNjZW5lR3JhcGguZ2V0VGltZVJhbmdlKHRoaXMpO1xuXG4gICAgY29uc3Qgc3RhdGVUaW1lUmFuZ2UgPSB0aW1lUmFuZ2Uuc3RhdGUudmFsdWU7XG4gICAgY29uc3QgZGF0YVRpbWVSYW5nZSA9IGRhdGEudGltZVJhbmdlO1xuXG4gICAgaWYgKFxuICAgICAgc3RhdGVUaW1lUmFuZ2UuZnJvbS51bml4KCkgPT09IGRhdGFUaW1lUmFuZ2UuZnJvbS51bml4KCkgJiZcbiAgICAgIHN0YXRlVGltZVJhbmdlLnRvLnVuaXgoKSA9PT0gZGF0YVRpbWVSYW5nZS50by51bml4KClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgd3JpdGVTY2VuZUxvZygnU2NlbmVRdWVyeVJ1bm5lcicsICdEYXRhIHRpbWUgcmFuZ2UgaXMgc3RhbGUnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX29uRGVhY3RpdmF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcXVlcnlTdWIpIHtcbiAgICAgIHRoaXMuX3F1ZXJ5U3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLl9xdWVyeVN1YiA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZGF0YUxheWVyc1N1Yikge1xuICAgICAgdGhpcy5fZGF0YUxheWVyc1N1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5fZGF0YUxheWVyc1N1YiA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLl90aW1lU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3RpbWVTdWIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdGltZVN1YlJhbmdlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2FkaG9jRmlsdGVyc1ZhciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9ncm91cEJ5VmFyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3ZhcmlhYmxlVmFsdWVSZWNvcmRlci5yZWNvcmRDdXJyZW50RGVwZW5kZW5jeVZhbHVlc0ZvclNjZW5lT2JqZWN0KHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHNldENvbnRhaW5lcldpZHRoKHdpZHRoOiBudW1iZXIpIHtcbiAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgd2lkdGggd2Ugc2hvdWxkIHJ1biBxdWVyaWVzXG4gICAgaWYgKCF0aGlzLl9jb250YWluZXJXaWR0aCAmJiB3aWR0aCA+IDApIHtcbiAgICAgIHRoaXMuX2NvbnRhaW5lcldpZHRoID0gd2lkdGg7XG5cbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgbWF4RGF0YVBvaW50cyBzcGVjaWZpY2FsbHkgc2V0IGFuZCBtYXhEYXRhUG9pbnRzRnJvbVdpZHRoIGlzIHRydWVcbiAgICAgIGlmICh0aGlzLnN0YXRlLm1heERhdGFQb2ludHNGcm9tV2lkdGggJiYgIXRoaXMuc3RhdGUubWF4RGF0YVBvaW50cykge1xuICAgICAgICAvLyBBcyB0aGlzIGlzIGNhbGxlZCBmcm9tIHJlbmRlciBwYXRoIHdlIG5lZWQgdG8gd2FpdCBmb3IgbmV4dCB0aWNrIGJlZm9yZSBydW5uaW5nIHF1ZXJpZXNcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNBY3RpdmUgJiYgIXRoaXMuc3RhdGUuX2hhc0ZldGNoZWREYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnJ1blF1ZXJpZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiB0aGUgdXBkYXRlZCBjb250YWluZXIgd2lkdGggaXMgYmlnZ2VyIHRoYW4gMCBsZXQncyByZW1lbWJlciB0aGUgd2lkdGggdW50aWwgbmV4dCBxdWVyeSBpc3N1ZVxuICAgICAgaWYgKHdpZHRoID4gMCkge1xuICAgICAgICB0aGlzLl9jb250YWluZXJXaWR0aCA9IHdpZHRoO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0RhdGFSZWFkeVRvRGlzcGxheSgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnN0YXRlLl9oYXNGZXRjaGVkRGF0YSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvVGltZVJhbmdlQ2hhbmdlcyh0aW1lUmFuZ2U6IFNjZW5lVGltZVJhbmdlTGlrZSkge1xuICAgIGlmICh0aGlzLl90aW1lU3ViUmFuZ2UgPT09IHRpbWVSYW5nZSkge1xuICAgICAgLy8gTm90aGluZyB0byBkbywgYWxyZWFkeSBzdWJzY3JpYmVkXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3RpbWVTdWIpIHtcbiAgICAgIHRoaXMuX3RpbWVTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLl90aW1lU3ViUmFuZ2UgPSB0aW1lUmFuZ2U7XG4gICAgdGhpcy5fdGltZVN1YiA9IHRpbWVSYW5nZS5zdWJzY3JpYmVUb1N0YXRlKCgpID0+IHtcbiAgICAgIHRoaXMucnVuV2l0aFRpbWVSYW5nZSh0aW1lUmFuZ2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJ1blF1ZXJpZXMoKSB7XG4gICAgY29uc3QgdGltZVJhbmdlID0gc2NlbmVHcmFwaC5nZXRUaW1lUmFuZ2UodGhpcyk7XG4gICAgaWYgKHRoaXMuaXNRdWVyeU1vZGVBdXRvKCkpIHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlVG9UaW1lUmFuZ2VDaGFuZ2VzKHRpbWVSYW5nZSk7XG4gICAgfVxuXG4gICAgdGhpcy5ydW5XaXRoVGltZVJhbmdlKHRpbWVSYW5nZSk7XG4gIH1cblxuICBwcml2YXRlIGdldE1heERhdGFQb2ludHMoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUubWF4RGF0YVBvaW50cykge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUubWF4RGF0YVBvaW50cztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5tYXhEYXRhUG9pbnRzRnJvbVdpZHRoID8gdGhpcy5fY29udGFpbmVyV2lkdGggPz8gNTAwIDogNTAwO1xuICB9XG5cbiAgcHVibGljIGNhbmNlbFF1ZXJ5KCkge1xuICAgIHRoaXMuX3F1ZXJ5U3ViPy51bnN1YnNjcmliZSgpO1xuXG4gICAgaWYgKHRoaXMuX2RhdGFMYXllcnNTdWIpIHtcbiAgICAgIHRoaXMuX2RhdGFMYXllcnNTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuX2RhdGFMYXllcnNTdWIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkYXRhOiB7IC4uLnRoaXMuc3RhdGUuZGF0YSEsIHN0YXRlOiBMb2FkaW5nU3RhdGUuRG9uZSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5XaXRoVGltZVJhbmdlKHRpbWVSYW5nZTogU2NlbmVUaW1lUmFuZ2VMaWtlKSB7XG4gICAgLy8gSWYgbm8gbWF4RGF0YVBvaW50cyBzcGVjaWZpZWQgd2UgbWlnaHQgbmVlZCB0byB3YWl0IGZvciBjb250YWluZXIgd2lkdGggdG8gYmUgc2V0IGZyb20gdGhlIG91dHNpZGVcbiAgICBpZiAoIXRoaXMuc3RhdGUubWF4RGF0YVBvaW50cyAmJiB0aGlzLnN0YXRlLm1heERhdGFQb2ludHNGcm9tV2lkdGggJiYgIXRoaXMuX2NvbnRhaW5lcldpZHRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgZGF0YSBsYXllcnMgc3Vic2NyaXB0aW9uIGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBvbmVcbiAgICBpZiAoIXRoaXMuX2RhdGFMYXllcnNTdWIpIHtcbiAgICAgIHRoaXMuX2hhbmRsZURhdGFMYXllcnMoKTtcbiAgICB9XG5cbiAgICAvLyBDYW5jZWwgYW55IHJ1bm5pbmcgcXVlcmllc1xuICAgIHRoaXMuX3F1ZXJ5U3ViPy51bnN1YnNjcmliZSgpO1xuXG4gICAgLy8gU2tpcCBleGVjdXRpbmcgcXVlcmllcyBpZiB2YXJpYWJsZSBkZXBlbmRlbmN5IGlzIGluIGxvYWRpbmcgc3RhdGVcbiAgICBpZiAodGhpcy5fdmFyaWFibGVEZXBlbmRlbmN5Lmhhc0RlcGVuZGVuY3lJbkxvYWRpbmdTdGF0ZSgpKSB7XG4gICAgICB3cml0ZVNjZW5lTG9nKCdTY2VuZVF1ZXJ5UnVubmVyJywgJ1ZhcmlhYmxlIGRlcGVuZGVuY3kgaXMgaW4gbG9hZGluZyBzdGF0ZSwgc2tpcHBpbmcgcXVlcnkgZXhlY3V0aW9uJyk7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgZGF0YTogeyAuLi4odGhpcy5zdGF0ZS5kYXRhID8/IGVtcHR5UGFuZWxEYXRhKSwgc3RhdGU6IExvYWRpbmdTdGF0ZS5Mb2FkaW5nIH0gfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBxdWVyaWVzIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgLy8gU2ltcGxlIHBhdGggd2hlbiBubyBxdWVyaWVzIGV4aXN0XG4gICAgaWYgKCFxdWVyaWVzPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3NldE5vRGF0YVN0YXRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGFzb3VyY2UgPSB0aGlzLnN0YXRlLmRhdGFzb3VyY2UgPz8gZmluZEZpcnN0RGF0YXNvdXJjZShxdWVyaWVzKTtcbiAgICAgIGNvbnN0IGRzID0gYXdhaXQgZ2V0RGF0YVNvdXJjZShkYXRhc291cmNlLCB0aGlzLl9zY29wZWRWYXJzKTtcblxuICAgICAgdGhpcy5maW5kQW5kU3Vic2NyaWJlVG9BZEhvY0ZpbHRlcnMoZGF0YXNvdXJjZT8udWlkKTtcblxuICAgICAgY29uc3QgcnVuUmVxdWVzdCA9IGdldFJ1blJlcXVlc3QoKTtcbiAgICAgIGNvbnN0IHsgcHJpbWFyeSwgc2Vjb25kYXJpZXMsIHByb2Nlc3NvcnMgfSA9IHRoaXMucHJlcGFyZVJlcXVlc3RzKHRpbWVSYW5nZSwgZHMpO1xuXG4gICAgICB3cml0ZVNjZW5lTG9nKCdTY2VuZVF1ZXJ5UnVubmVyJywgJ1N0YXJ0aW5nIHJ1blJlcXVlc3QnLCB0aGlzLnN0YXRlLmtleSk7XG5cbiAgICAgIGxldCBzdHJlYW0gPSBydW5SZXF1ZXN0KGRzLCBwcmltYXJ5KTtcblxuICAgICAgaWYgKHNlY29uZGFyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gU3VibWl0IGFsbCBzZWNvbmRhcnkgcmVxdWVzdHMgaW4gcGFyYWxsZWwuXG4gICAgICAgIGNvbnN0IHNlY29uZGFyeVN0cmVhbXMgPSBzZWNvbmRhcmllcy5tYXAoKHIpID0+IHJ1blJlcXVlc3QoZHMsIHIpKTtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSByeGpzIG9wZXJhdG9yIHdoaWNoIHdpbGwgY29tYmluZSB0aGUgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IHJlc3BvbnNlc1xuICAgICAgICAvLyBieSBjYWxsaW5nIHRoZSBjb3JyZWN0IHByb2Nlc3NvciBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgdGhlXG4gICAgICAgIC8vIGV4dHJhIHJlcXVlc3QgcHJvdmlkZXJzLlxuICAgICAgICBjb25zdCBvcCA9IGV4dHJhUXVlcnlQcm9jZXNzaW5nT3BlcmF0b3IocHJvY2Vzc29ycyk7XG4gICAgICAgIC8vIENvbWJpbmUgdGhlIHByaW1hcnkgYW5kIHNlY29uZGFyeSBzdHJlYW1zIGludG8gYSBzaW5nbGUgc3RyZWFtLCBhbmQgYXBwbHkgdGhlIG9wZXJhdG9yLlxuICAgICAgICBzdHJlYW0gPSBmb3JrSm9pbihbc3RyZWFtLCAuLi5zZWNvbmRhcnlTdHJlYW1zXSkucGlwZShvcCk7XG4gICAgICB9XG5cbiAgICAgIHN0cmVhbSA9IHN0cmVhbS5waXBlKFxuICAgICAgICByZWdpc3RlclF1ZXJ5V2l0aENvbnRyb2xsZXIoe1xuICAgICAgICAgIHR5cGU6ICdkYXRhJyxcbiAgICAgICAgICByZXF1ZXN0OiBwcmltYXJ5LFxuICAgICAgICAgIG9yaWdpbjogdGhpcyxcbiAgICAgICAgICBjYW5jZWw6ICgpID0+IHRoaXMuY2FuY2VsUXVlcnkoKSxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX3F1ZXJ5U3ViID0gc3RyZWFtLnN1YnNjcmliZSh0aGlzLm9uRGF0YVJlY2VpdmVkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1BhbmVsUXVlcnlSdW5uZXIgRXJyb3InLCBlcnIpO1xuXG4gICAgICB0aGlzLm9uRGF0YVJlY2VpdmVkKHtcbiAgICAgICAgLi4uZW1wdHlQYW5lbERhdGEsXG4gICAgICAgIC4uLnRoaXMuc3RhdGUuZGF0YSxcbiAgICAgICAgc3RhdGU6IExvYWRpbmdTdGF0ZS5FcnJvcixcbiAgICAgICAgZXJyb3JzOiBbdG9EYXRhUXVlcnlFcnJvcihlcnIpXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbG9uZSh3aXRoU3RhdGU/OiBQYXJ0aWFsPFF1ZXJ5UnVubmVyU3RhdGU+KSB7XG4gICAgY29uc3QgY2xvbmUgPSBzdXBlci5jbG9uZSh3aXRoU3RhdGUpO1xuXG4gICAgaWYgKHRoaXMuX3Jlc3VsdEFubm90YXRpb25zKSB7XG4gICAgICBjbG9uZVsnX3Jlc3VsdEFubm90YXRpb25zJ10gPSB0aGlzLl9yZXN1bHRBbm5vdGF0aW9ucy5tYXAoKGZyYW1lKSA9PiAoeyAuLi5mcmFtZSB9KSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xheWVyQW5ub3RhdGlvbnMpIHtcbiAgICAgIGNsb25lWydfbGF5ZXJBbm5vdGF0aW9ucyddID0gdGhpcy5fbGF5ZXJBbm5vdGF0aW9ucy5tYXAoKGZyYW1lKSA9PiAoeyAuLi5mcmFtZSB9KSk7XG4gICAgfVxuXG4gICAgY2xvbmVbJ192YXJpYWJsZVZhbHVlUmVjb3JkZXInXSA9IHRoaXMuX3ZhcmlhYmxlVmFsdWVSZWNvcmRlci5jbG9uZUFuZFJlY29yZEN1cnJlbnRWYWx1ZXNGb3JTY2VuZU9iamVjdCh0aGlzKTtcbiAgICBjbG9uZVsnX2NvbnRhaW5lcldpZHRoJ10gPSB0aGlzLl9jb250YWluZXJXaWR0aDtcbiAgICBjbG9uZVsnX3Jlc3VsdHMnXS5uZXh0KHsgb3JpZ2luOiB0aGlzLCBkYXRhOiB0aGlzLnN0YXRlLmRhdGEgPz8gZW1wdHlQYW5lbERhdGEgfSk7XG5cbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVSZXF1ZXN0cyh0aW1lUmFuZ2U6IFNjZW5lVGltZVJhbmdlTGlrZSwgZHM6IERhdGFTb3VyY2VBcGkpOiBQcmVwYXJlZFJlcXVlc3RzIHtcbiAgICBjb25zdCB7IG1pbkludGVydmFsLCBxdWVyaWVzIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgbGV0IHJlcXVlc3Q6IERhdGFRdWVyeVJlcXVlc3Q8RGF0YVF1ZXJ5RXh0ZW5kZWQ+ID0ge1xuICAgICAgYXBwOiAnc2NlbmVzJyxcbiAgICAgIHJlcXVlc3RJZDogZ2V0TmV4dFJlcXVlc3RJZCgpLFxuICAgICAgdGltZXpvbmU6IHRpbWVSYW5nZS5nZXRUaW1lWm9uZSgpLFxuICAgICAgcmFuZ2U6IHRpbWVSYW5nZS5zdGF0ZS52YWx1ZSxcbiAgICAgIGludGVydmFsOiAnMXMnLFxuICAgICAgaW50ZXJ2YWxNczogMTAwMCxcbiAgICAgIHRhcmdldHM6IGNsb25lRGVlcChxdWVyaWVzKSxcbiAgICAgIG1heERhdGFQb2ludHM6IHRoaXMuZ2V0TWF4RGF0YVBvaW50cygpLFxuICAgICAgc2NvcGVkVmFyczogdGhpcy5fc2NvcGVkVmFycyxcbiAgICAgIHN0YXJ0VGltZTogRGF0ZS5ub3coKSxcbiAgICAgIGxpdmVTdHJlYW1pbmc6IHRoaXMuc3RhdGUubGl2ZVN0cmVhbWluZyxcbiAgICAgIHJhbmdlUmF3OiB7XG4gICAgICAgIGZyb206IHRpbWVSYW5nZS5zdGF0ZS5mcm9tLFxuICAgICAgICB0bzogdGltZVJhbmdlLnN0YXRlLnRvLFxuICAgICAgfSxcbiAgICAgIGNhY2hlVGltZW91dDogdGhpcy5zdGF0ZS5jYWNoZVRpbWVvdXQsXG4gICAgICBxdWVyeUNhY2hpbmdUVEw6IHRoaXMuc3RhdGUucXVlcnlDYWNoaW5nVFRMLFxuICAgICAgLy8gVGhpcyBhc2tzIHRoZSBzY2VuZSByb290IHRvIHByb3ZpZGUgY29udGV4dCBwcm9wZXJ0aWVzIGxpa2UgYXBwLCBwYW5lbCBhbmQgZGFzaGJvYXJkVUlEXG4gICAgICAuLi5nZXRFbnJpY2hlZERhdGFSZXF1ZXN0KHRoaXMpLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5fYWRob2NGaWx0ZXJzVmFyKSB7XG4gICAgICAvLyBvbmx5IHBhc3MgZmlsdGVycyB0aGF0IGhhdmUgYm90aCBrZXkgYW5kIHZhbHVlXG4gICAgICAvLyBAdHMtaWdub3JlIChUZW1wb3JhcnkgaWdub3JlIHVudGlsIHdlIHVwZGF0ZSBAZ3JhZmFuYS9kYXRhKVxuICAgICAgcmVxdWVzdC5maWx0ZXJzID0gdGhpcy5fYWRob2NGaWx0ZXJzVmFyLnN0YXRlLmZpbHRlcnMuZmlsdGVyKGlzRmlsdGVyQ29tcGxldGUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ncm91cEJ5VmFyKSB7XG4gICAgICAvLyBAdHMtaWdub3JlIChUZW1wb3JhcnkgaWdub3JlIHVudGlsIHdlIHVwZGF0ZSBAZ3JhZmFuYS9kYXRhKVxuICAgICAgcmVxdWVzdC5ncm91cEJ5S2V5cyA9IHRoaXMuX2dyb3VwQnlWYXIuc3RhdGUudmFsdWU7XG4gICAgfVxuXG4gICAgcmVxdWVzdC50YXJnZXRzID0gcmVxdWVzdC50YXJnZXRzLm1hcCgocXVlcnkpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIXF1ZXJ5LmRhdGFzb3VyY2UgfHxcbiAgICAgICAgKHF1ZXJ5LmRhdGFzb3VyY2UudWlkICE9PSBkcy51aWQgJiZcbiAgICAgICAgICAhZHMubWV0YT8ubWl4ZWQgJiZcbiAgICAgICAgICBpc0V4cHJlc3Npb25SZWZlcmVuY2UgLyogVE9ETzogUmVtb3ZlIHRoaXMgY2hlY2sgd2hlbiBpc0V4cHJlc3Npb25SZWZlcmVuY2UgaXMgcHJvcGVybHkgZXhwb3J0ZWQgZnJvbSBncmFmYW4gcnVudGltZSAqLyAmJlxuICAgICAgICAgICFpc0V4cHJlc3Npb25SZWZlcmVuY2UocXVlcnkuZGF0YXNvdXJjZSkpXG4gICAgICApIHtcbiAgICAgICAgcXVlcnkuZGF0YXNvdXJjZSA9IGRzLmdldFJlZigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgIH0pO1xuXG4gICAgY29uc3QgbG93ZXJJbnRlcnZhbExpbWl0ID0gbWluSW50ZXJ2YWwgPyBpbnRlcnBvbGF0ZSh0aGlzLCBtaW5JbnRlcnZhbCkgOiBkcy5pbnRlcnZhbDtcbiAgICBjb25zdCBub3JtID0gcmFuZ2VVdGlsLmNhbGN1bGF0ZUludGVydmFsKHRpbWVSYW5nZS5zdGF0ZS52YWx1ZSwgcmVxdWVzdC5tYXhEYXRhUG9pbnRzISwgbG93ZXJJbnRlcnZhbExpbWl0KTtcblxuICAgIC8vIG1ha2Ugc2hhbGxvdyBjb3B5IG9mIHNjb3BlZCB2YXJzLFxuICAgIC8vIGFuZCBhZGQgYnVpbHQgaW4gdmFyaWFibGVzIGludGVydmFsIGFuZCBpbnRlcnZhbF9tc1xuICAgIHJlcXVlc3Quc2NvcGVkVmFycyA9IE9iamVjdC5hc3NpZ24oe30sIHJlcXVlc3Quc2NvcGVkVmFycywge1xuICAgICAgX19pbnRlcnZhbDogeyB0ZXh0OiBub3JtLmludGVydmFsLCB2YWx1ZTogbm9ybS5pbnRlcnZhbCB9LFxuICAgICAgX19pbnRlcnZhbF9tczogeyB0ZXh0OiBub3JtLmludGVydmFsTXMudG9TdHJpbmcoKSwgdmFsdWU6IG5vcm0uaW50ZXJ2YWxNcyB9LFxuICAgIH0pO1xuXG4gICAgcmVxdWVzdC5pbnRlcnZhbCA9IG5vcm0uaW50ZXJ2YWw7XG4gICAgcmVxdWVzdC5pbnRlcnZhbE1zID0gbm9ybS5pbnRlcnZhbE1zO1xuXG4gICAgLy8gSWYgdGhlcmUgYXJlIGFueSBleHRyYSByZXF1ZXN0IHByb3ZpZGVycywgd2UgbmVlZCB0byBhZGQgYSBuZXcgcmVxdWVzdCBmb3IgZWFjaFxuICAgIC8vIGFuZCBtYXAgdGhlIHJlcXVlc3QncyBJRCB0byB0aGUgcHJvY2Vzc29yIGZ1bmN0aW9uIGdpdmVuIGJ5IHRoZSBwcm92aWRlciwgdG8gZW5zdXJlIHRoYXRcbiAgICAvLyB0aGUgcHJvY2Vzc29yIGlzIGNhbGxlZCB3aXRoIHRoZSBjb3JyZWN0IHJlc3BvbnNlIGRhdGEuXG4gICAgY29uc3QgcHJpbWFyeVRpbWVSYW5nZSA9IHRpbWVSYW5nZS5zdGF0ZS52YWx1ZTtcbiAgICBsZXQgc2Vjb25kYXJ5UmVxdWVzdHM6IERhdGFRdWVyeVJlcXVlc3RbXSA9IFtdO1xuICAgIGxldCBzZWNvbmRhcnlQcm9jZXNzb3JzID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgcHJvdmlkZXIgb2YgdGhpcy5nZXRDbG9zZXN0RXh0cmFRdWVyeVByb3ZpZGVycygpID8/IFtdKSB7XG4gICAgICBmb3IgKGNvbnN0IHsgcmVxLCBwcm9jZXNzb3IgfSBvZiBwcm92aWRlci5nZXRFeHRyYVF1ZXJpZXMocmVxdWVzdCkpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gZ2V0TmV4dFJlcXVlc3RJZCgpO1xuICAgICAgICBzZWNvbmRhcnlSZXF1ZXN0cy5wdXNoKHsgLi4ucmVxLCByZXF1ZXN0SWQgfSk7XG4gICAgICAgIHNlY29uZGFyeVByb2Nlc3NvcnMuc2V0KHJlcXVlc3RJZCwgcHJvY2Vzc29yID8/IHBhc3N0aHJvdWdoUHJvY2Vzc29yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdC5yYW5nZSA9IHByaW1hcnlUaW1lUmFuZ2U7XG4gICAgcmV0dXJuIHsgcHJpbWFyeTogcmVxdWVzdCwgc2Vjb25kYXJpZXM6IHNlY29uZGFyeVJlcXVlc3RzLCBwcm9jZXNzb3JzOiBzZWNvbmRhcnlQcm9jZXNzb3JzIH07XG4gIH1cblxuICBwcml2YXRlIG9uRGF0YVJlY2VpdmVkID0gKGRhdGE6IFBhbmVsRGF0YSkgPT4ge1xuICAgIC8vIFdpbGwgY29tYmluZSBhbm5vdGF0aW9ucyBmcm9tIFNRUiBxdWVyaWVzIChmcmFtZXMgd2l0aCBtZXRhLmRhdGFUb3BpYyA9PT0gRGF0YVRvcGljLkFubm90YXRpb25zKVxuICAgIGNvbnN0IHByZVByb2Nlc3NlZERhdGEgPSBwcmVQcm9jZXNzUGFuZWxEYXRhKGRhdGEsIHRoaXMuc3RhdGUuZGF0YSk7XG5cbiAgICAvLyBTYXZlIHF1ZXJ5IGFubm90YXRpb25zXG4gICAgdGhpcy5fcmVzdWx0QW5ub3RhdGlvbnMgPSBkYXRhLmFubm90YXRpb25zO1xuXG4gICAgLy8gV2lsbCBjb21iaW5lIGFubm90YXRpb25zICYgYWxlcnQgc3RhdGUgZnJvbSBkYXRhIGxheWVyIHByb3ZpZGVyc1xuICAgIGNvbnN0IGRhdGFXaXRoTGF5ZXJzQXBwbGllZCA9IHRoaXMuX2NvbWJpbmVEYXRhTGF5ZXJzKHByZVByb2Nlc3NlZERhdGEpO1xuXG4gICAgbGV0IGhhc0ZldGNoZWREYXRhID0gdGhpcy5zdGF0ZS5faGFzRmV0Y2hlZERhdGE7XG5cbiAgICBpZiAoIWhhc0ZldGNoZWREYXRhICYmIHByZVByb2Nlc3NlZERhdGEuc3RhdGUgIT09IExvYWRpbmdTdGF0ZS5Mb2FkaW5nKSB7XG4gICAgICBoYXNGZXRjaGVkRGF0YSA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7IGRhdGE6IGRhdGFXaXRoTGF5ZXJzQXBwbGllZCwgX2hhc0ZldGNoZWREYXRhOiBoYXNGZXRjaGVkRGF0YSB9KTtcbiAgICB0aGlzLl9yZXN1bHRzLm5leHQoeyBvcmlnaW46IHRoaXMsIGRhdGE6IGRhdGFXaXRoTGF5ZXJzQXBwbGllZCB9KTtcbiAgfTtcblxuICBwcml2YXRlIF9jb21iaW5lRGF0YUxheWVycyhkYXRhOiBQYW5lbERhdGEpIHtcbiAgICBpZiAodGhpcy5fbGF5ZXJBbm5vdGF0aW9ucyAmJiB0aGlzLl9sYXllckFubm90YXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGRhdGEuYW5ub3RhdGlvbnMgPSAoZGF0YS5hbm5vdGF0aW9ucyB8fCBbXSkuY29uY2F0KHRoaXMuX2xheWVyQW5ub3RhdGlvbnMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLmRhdGEgJiYgdGhpcy5zdGF0ZS5kYXRhLmFsZXJ0U3RhdGUpIHtcbiAgICAgIGRhdGEuYWxlcnRTdGF0ZSA9IHRoaXMuc3RhdGUuZGF0YS5hbGVydFN0YXRlO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Tm9EYXRhU3RhdGUoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZGF0YSAhPT0gZW1wdHlQYW5lbERhdGEpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBkYXRhOiBlbXB0eVBhbmVsRGF0YSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2FsayB1cCB0aGUgc2NlbmUgZ3JhcGggYW5kIGZpbmQgYW55IEV4dHJhUXVlcnlQcm92aWRlcnMuXG4gICAqXG4gICAqIFRoaXMgd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGNsb3Nlc3QgcHJvdmlkZXIgb2YgZWFjaCB0eXBlLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDbG9zZXN0RXh0cmFRdWVyeVByb3ZpZGVycygpOiBBcnJheTxFeHRyYVF1ZXJ5UHJvdmlkZXI8YW55Pj4ge1xuICAgIC8vIE1haW50YWluIGEgbWFwIGZyb20gcHJvdmlkZXIgY29uc3RydWN0b3IgdG8gcHJvdmlkZXIgb2JqZWN0LiBUaGUgY29uc3RydWN0b3JcbiAgICAvLyBpcyB1c2VkIGFzIGEgdW5pcXVlIGtleSBmb3IgZWFjaCBjbGFzcywgdG8gZW5zdXJlIHdlIGhhdmUgbm8gbW9yZSB0aGFuIG9uZVxuICAgIC8vIHR5cGUgb2YgZWFjaCB0eXBlIG9mIHByb3ZpZGVyLlxuICAgIGNvbnN0IGZvdW5kID0gbmV3IE1hcCgpO1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgZ2V0Q2xvc2VzdCh0aGlzLnBhcmVudCwgKHMpID0+IHtcbiAgICAgIGlmIChpc0V4dHJhUXVlcnlQcm92aWRlcihzKSAmJiAhZm91bmQuaGFzKHMuY29uc3RydWN0b3IpKSB7XG4gICAgICAgIGZvdW5kLnNldChzLmNvbnN0cnVjdG9yLCBzKTtcbiAgICAgIH1cbiAgICAgIHMuZm9yRWFjaENoaWxkKChjaGlsZCkgPT4ge1xuICAgICAgICBpZiAoaXNFeHRyYVF1ZXJ5UHJvdmlkZXIoY2hpbGQpICYmICFmb3VuZC5oYXMoY2hpbGQuY29uc3RydWN0b3IpKSB7XG4gICAgICAgICAgZm91bmQuc2V0KGNoaWxkLmNvbnN0cnVjdG9yLCBjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQWx3YXlzIHJldHVybiBudWxsIHNvIHRoYXQgdGhlIHNlYXJjaCBjb250aW51ZXMgdG8gdGhlIHRvcCBvZlxuICAgICAgLy8gdGhlIHNjZW5lIGdyYXBoLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oZm91bmQudmFsdWVzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhbGsgdXAgc2NlbmUgZ3JhcGggYW5kIGZpbmQgdGhlIGNsb3Nlc3QgZmlsdGVyc2V0IHdpdGggbWF0Y2hpbmcgZGF0YSBzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgZmluZEFuZFN1YnNjcmliZVRvQWRIb2NGaWx0ZXJzKHVpZDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZmlsdGVyc1ZhciA9IGZpbmRBY3RpdmVBZEhvY0ZpbHRlclZhcmlhYmxlQnlVaWQodWlkKTtcblxuICAgIGlmICh0aGlzLl9hZGhvY0ZpbHRlcnNWYXIgIT09IGZpbHRlcnNWYXIpIHtcbiAgICAgIHRoaXMuX2FkaG9jRmlsdGVyc1ZhciA9IGZpbHRlcnNWYXI7XG4gICAgICB0aGlzLl91cGRhdGVFeHBsaWNpdFZhcmlhYmxlRGVwZW5kZW5jaWVzKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXBCeVZhciA9IGZpbmRBY3RpdmVHcm91cEJ5VmFyaWFibGVzQnlVaWQodWlkKTtcbiAgICBpZiAodGhpcy5fZ3JvdXBCeVZhciAhPT0gZ3JvdXBCeVZhcikge1xuICAgICAgdGhpcy5fZ3JvdXBCeVZhciA9IGdyb3VwQnlWYXI7XG4gICAgICB0aGlzLl91cGRhdGVFeHBsaWNpdFZhcmlhYmxlRGVwZW5kZW5jaWVzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlRXhwbGljaXRWYXJpYWJsZURlcGVuZGVuY2llcygpIHtcbiAgICBjb25zdCBleHBsaWNpdERlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICh0aGlzLl9hZGhvY0ZpbHRlcnNWYXIpIHtcbiAgICAgIGV4cGxpY2l0RGVwZW5kZW5jaWVzLnB1c2godGhpcy5fYWRob2NGaWx0ZXJzVmFyLnN0YXRlLm5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ncm91cEJ5VmFyKSB7XG4gICAgICBleHBsaWNpdERlcGVuZGVuY2llcy5wdXNoKHRoaXMuX2dyb3VwQnlWYXIuc3RhdGUubmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdmFyaWFibGVEZXBlbmRlbmN5LnNldFZhcmlhYmxlTmFtZXMoZXhwbGljaXREZXBlbmRlbmNpZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1F1ZXJ5TW9kZUF1dG8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLnN0YXRlLnJ1blF1ZXJpZXNNb2RlID8/ICdhdXRvJykgPT09ICdhdXRvJztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEZpcnN0RGF0YXNvdXJjZSh0YXJnZXRzOiBEYXRhUXVlcnlbXSk6IERhdGFTb3VyY2VSZWYgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdGFyZ2V0cy5maW5kKCh0KSA9PiB0LmRhdGFzb3VyY2UgIT09IG51bGwpPy5kYXRhc291cmNlID8/IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYWxsRnJhbWVzRW1wdHkoZnJhbWVzPzogRGF0YUZyYW1lW10pIHtcbiAgaWYgKCFmcmFtZXMpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZnJhbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyYW1lc1tpXS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iXSwibmFtZXMiOlsiX2EiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1EQSxJQUFJLE9BQVUsR0FBQSxHQUFBLENBQUE7QUFFUCxTQUFTLGdCQUFtQixHQUFBO0FBQ2pDLEVBQUEsT0FBTyxLQUFRLEdBQUEsT0FBQSxFQUFBLENBQUE7QUFDakIsQ0FBQTtBQW9ETyxNQUFNLHlCQUF5QixlQUErRCxDQUFBO0FBQUEsRUEwQjVGLFlBQVksWUFBZ0MsRUFBQTtBQUNqRCxJQUFBLEtBQUEsQ0FBTSxZQUFZLENBQUEsQ0FBQTtBQXhCcEIsSUFBUSxJQUFBLENBQUEsaUJBQUEsR0FBb0IsSUFBSSxnQkFBaUIsRUFBQSxDQUFBO0FBSWpELElBQVEsSUFBQSxDQUFBLHNCQUFBLEdBQXlCLElBQUkscUJBQXNCLEVBQUEsQ0FBQTtBQUMzRCxJQUFRLElBQUEsQ0FBQSxRQUFBLEdBQVcsSUFBSSxhQUFBLENBQXVDLENBQUMsQ0FBQSxDQUFBO0FBQy9ELElBQUEsSUFBQSxDQUFRLFdBQWMsR0FBQSxFQUFFLGFBQWUsRUFBQSxpQ0FBQSxDQUFrQyxJQUFJLENBQUUsRUFBQSxDQUFBO0FBVy9FLElBQVUsSUFBQSxDQUFBLG1CQUFBLEdBQWtFLElBQUksd0JBQUEsQ0FBeUIsSUFBTSxFQUFBO0FBQUEsTUFDN0csVUFBQSxFQUFZLENBQUMsU0FBQSxFQUFXLFlBQVksQ0FBQTtBQUFBLE1BQ3BDLHlCQUEyQixFQUFBLElBQUEsQ0FBSywwQkFBMkIsQ0FBQSxJQUFBLENBQUssSUFBSSxDQUFBO0FBQUEsTUFDcEUsb0JBQXNCLEVBQUEsSUFBQSxDQUFLLG9CQUFxQixDQUFBLElBQUEsQ0FBSyxJQUFJLENBQUE7QUFBQSxLQUMxRCxDQUFBLENBQUE7QUF1Y0QsSUFBUSxJQUFBLENBQUEsY0FBQSxHQUFpQixDQUFDLElBQW9CLEtBQUE7QUFFNUMsTUFBQSxNQUFNLGdCQUFtQixHQUFBLG1CQUFBLENBQW9CLElBQU0sRUFBQSxJQUFBLENBQUssTUFBTSxJQUFJLENBQUEsQ0FBQTtBQUdsRSxNQUFBLElBQUEsQ0FBSyxxQkFBcUIsSUFBSyxDQUFBLFdBQUEsQ0FBQTtBQUcvQixNQUFNLE1BQUEscUJBQUEsR0FBd0IsSUFBSyxDQUFBLGtCQUFBLENBQW1CLGdCQUFnQixDQUFBLENBQUE7QUFFdEUsTUFBSSxJQUFBLGNBQUEsR0FBaUIsS0FBSyxLQUFNLENBQUEsZUFBQSxDQUFBO0FBRWhDLE1BQUEsSUFBSSxDQUFDLGNBQUEsSUFBa0IsZ0JBQWlCLENBQUEsS0FBQSxLQUFVLGFBQWEsT0FBUyxFQUFBO0FBQ3RFLFFBQWlCLGNBQUEsR0FBQSxJQUFBLENBQUE7QUFBQSxPQUNuQjtBQUVBLE1BQUEsSUFBQSxDQUFLLFNBQVMsRUFBRSxJQUFBLEVBQU0scUJBQXVCLEVBQUEsZUFBQSxFQUFpQixnQkFBZ0IsQ0FBQSxDQUFBO0FBQzlFLE1BQUEsSUFBQSxDQUFLLFNBQVMsSUFBSyxDQUFBLEVBQUUsUUFBUSxJQUFNLEVBQUEsSUFBQSxFQUFNLHVCQUF1QixDQUFBLENBQUE7QUFBQSxLQUNsRSxDQUFBO0FBcGRFLElBQUEsSUFBQSxDQUFLLG9CQUFxQixDQUFBLE1BQU0sSUFBSyxDQUFBLFdBQUEsRUFBYSxDQUFBLENBQUE7QUFBQSxHQUNwRDtBQUFBLEVBZE8sZ0JBQW1CLEdBQUE7QUFDeEIsSUFBQSxPQUFPLElBQUssQ0FBQSxRQUFBLENBQUE7QUFBQSxHQUNkO0FBQUEsRUFjUSxXQUFjLEdBQUE7QUFDcEIsSUFBSSxJQUFBLElBQUEsQ0FBSyxpQkFBbUIsRUFBQTtBQUMxQixNQUFNLE1BQUEsU0FBQSxHQUFZLFVBQVcsQ0FBQSxZQUFBLENBQWEsSUFBSSxDQUFBLENBQUE7QUFJOUMsTUFBTSxNQUFBLFNBQUEsR0FBWSxLQUFLLDZCQUE4QixFQUFBLENBQUE7QUFDckQsTUFBQSxLQUFBLE1BQVcsWUFBWSxTQUFXLEVBQUE7QUFDaEMsUUFBQSxJQUFBLENBQUssS0FBTSxDQUFBLEdBQUE7QUFBQSxVQUNULFFBQVMsQ0FBQSxnQkFBQSxDQUFpQixDQUFDLENBQUEsRUFBRyxDQUFNLEtBQUE7QUFDbEMsWUFBQSxJQUFJLFNBQVMsV0FBWSxDQUFBLENBQUEsRUFBRyxHQUFHLElBQUssQ0FBQSxLQUFBLENBQU0sT0FBTyxDQUFHLEVBQUE7QUFDbEQsY0FBQSxJQUFBLENBQUssVUFBVyxFQUFBLENBQUE7QUFBQSxhQUNsQjtBQUFBLFdBQ0QsQ0FBQTtBQUFBLFNBQ0gsQ0FBQTtBQUFBLE9BQ0Y7QUFFQSxNQUFBLElBQUEsQ0FBSyw0QkFBNEIsU0FBUyxDQUFBLENBQUE7QUFFMUMsTUFBSSxJQUFBLElBQUEsQ0FBSyw0QkFBOEIsRUFBQTtBQUNyQyxRQUFBLElBQUEsQ0FBSyxVQUFXLEVBQUEsQ0FBQTtBQUFBLE9BQ2xCO0FBQUEsS0FDRjtBQUVBLElBQUksSUFBQSxDQUFDLEtBQUssY0FBZ0IsRUFBQTtBQUN4QixNQUFBLElBQUEsQ0FBSyxpQkFBa0IsRUFBQSxDQUFBO0FBQUEsS0FDekI7QUFFQSxJQUFPLE9BQUEsTUFBTSxLQUFLLGFBQWMsRUFBQSxDQUFBO0FBQUEsR0FDbEM7QUFBQSxFQUdRLGlCQUFvQixHQUFBO0FBQzFCLElBQU0sTUFBQSxVQUFBLEdBQWEsVUFBVyxDQUFBLGFBQUEsQ0FBYyxJQUFJLENBQUEsQ0FBQTtBQUVoRCxJQUFJLElBQUEsVUFBQSxDQUFXLFdBQVcsQ0FBRyxFQUFBO0FBQzNCLE1BQUEsT0FBQTtBQUFBLEtBQ0Y7QUFFQSxJQUFLLElBQUEsQ0FBQSxjQUFBLEdBQWlCLElBQUssQ0FBQSxpQkFBQSxDQUN4QixlQUFnQixDQUFBLFVBQVUsQ0FDMUIsQ0FBQSxTQUFBLENBQVUsSUFBSyxDQUFBLGlCQUFBLENBQWtCLElBQUssQ0FBQSxJQUFJLENBQUMsQ0FBQSxDQUFBO0FBQUEsR0FDaEQ7QUFBQSxFQUVRLGtCQUFrQixPQUE0QyxFQUFBO0FBdkx4RSxJQUFBLElBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsQ0FBQTtBQXdMSSxJQUFNLE1BQUEsU0FBQSxHQUFZLFVBQVcsQ0FBQSxZQUFBLENBQWEsSUFBSSxDQUFBLENBQUE7QUFDOUMsSUFBTSxNQUFBLEVBQUUsZUFBZ0IsRUFBQSxHQUFJLElBQUssQ0FBQSxLQUFBLENBQUE7QUFFakMsSUFBQSxJQUFJLGNBQTJCLEVBQUMsQ0FBQTtBQUNoQyxJQUFBLElBQUksY0FBMkIsRUFBQyxDQUFBO0FBQ2hDLElBQUksSUFBQSxVQUFBLENBQUE7QUFFSixJQUFBLEtBQUEsTUFBVyxVQUFVLE9BQVMsRUFBQTtBQUM1QixNQUFTLEtBQUEsSUFBQSxLQUFBLElBQVMsTUFBTyxDQUFBLElBQUEsQ0FBSyxNQUFRLEVBQUE7QUFDcEMsUUFBQSxJQUFBLENBQUEsQ0FBSSxFQUFNLEdBQUEsS0FBQSxDQUFBLElBQUEsS0FBTixJQUFZLEdBQUEsS0FBQSxDQUFBLEdBQUEsRUFBQSxDQUFBLFNBQUEsTUFBYyxVQUFVLFdBQWEsRUFBQTtBQUNuRCxVQUFjLFdBQUEsR0FBQSxXQUFBLENBQVksT0FBTyxLQUFLLENBQUEsQ0FBQTtBQUFBLFNBQ3hDO0FBQ0EsUUFBQSxJQUFBLENBQUEsQ0FBSSxFQUFNLEdBQUEsS0FBQSxDQUFBLElBQUEsS0FBTixJQUFZLEdBQUEsS0FBQSxDQUFBLEdBQUEsRUFBQSxDQUFBLFNBQUEsTUFBYyxVQUFVLFdBQWEsRUFBQTtBQUNuRCxVQUFjLFdBQUEsR0FBQSxXQUFBLENBQVksT0FBTyxLQUFLLENBQUEsQ0FBQTtBQUFBLFNBQ3hDO0FBQUEsT0FDRjtBQUFBLEtBQ0Y7QUFFQSxJQUFBLElBQUksbURBQWlCLE9BQVMsRUFBQTtBQUM1QixNQUFJLElBQUEsV0FBQSxDQUFZLFNBQVMsQ0FBRyxFQUFBO0FBQzFCLFFBQWMsV0FBQSxHQUFBLGlCQUFBLENBQWtCLGFBQWEsZUFBZSxDQUFBLENBQUE7QUFBQSxPQUM5RDtBQUVBLE1BQUksSUFBQSxXQUFBLENBQVksU0FBUyxDQUFHLEVBQUE7QUFDMUIsUUFBQSxLQUFBLE1BQVcsU0FBUyxXQUFhLEVBQUE7QUFDL0IsVUFBTSxNQUFBLFNBQUEsR0FBWSxJQUFJLGFBQUEsQ0FBOEIsS0FBSyxDQUFBLENBQUE7QUFFekQsVUFBQSxLQUFBLE1BQVcsT0FBTyxTQUFXLEVBQUE7QUFDM0IsWUFBSSxJQUFBLEdBQUEsQ0FBSSxPQUFZLEtBQUEsZUFBQSxDQUFnQixPQUFTLEVBQUE7QUFDM0MsY0FBYSxVQUFBLEdBQUEsR0FBQSxDQUFBO0FBQ2IsY0FBQSxNQUFBO0FBQUEsYUFDRjtBQUFBLFdBQ0Y7QUFBQSxTQUNGO0FBQUEsT0FDRjtBQUFBLEtBQ0Y7QUFHQSxJQUFBLElBQ0UsY0FBZSxDQUFBLFdBQVcsQ0FDMUIsSUFBQSxjQUFBLENBQWUsS0FBSyxpQkFBaUIsQ0FBQSxJQUNyQyxPQUFRLENBQUEsVUFBQSxFQUFBLENBQVksRUFBSyxHQUFBLElBQUEsQ0FBQSxLQUFBLENBQU0sSUFBWCxLQUFBLElBQUEsR0FBQSxLQUFBLENBQUEsR0FBQSxFQUFBLENBQWlCLFVBQVUsQ0FDL0MsRUFBQTtBQUNBLE1BQUEsT0FBQTtBQUFBLEtBQ0Y7QUFFQSxJQUFBLElBQUEsQ0FBSyxpQkFBb0IsR0FBQSxXQUFBLENBQUE7QUFFekIsSUFBQSxNQUFNLGVBQWtCLEdBQUEsSUFBQSxDQUFLLEtBQU0sQ0FBQSxJQUFBLEdBQU8sSUFBSyxDQUFBLEtBQUEsQ0FBTSxJQUFPLEdBQUEsYUFBQSxDQUFBLGNBQUEsQ0FBQSxFQUFBLEVBQUssY0FBTCxDQUFBLEVBQUEsRUFBcUIsU0FBVyxFQUFBLFNBQUEsQ0FBVSxNQUFNLEtBQU0sRUFBQSxDQUFBLENBQUE7QUFFbEgsSUFBQSxJQUFBLENBQUssUUFBUyxDQUFBO0FBQUEsTUFDWixJQUFBLEVBQU0saUNBQ0QsZUFEQyxDQUFBLEVBQUE7QUFBQSxRQUVKLFdBQUEsRUFBYSxDQUFDLEdBQUksQ0FBQSxFQUFBLEdBQUEsSUFBQSxDQUFLLHVCQUFMLElBQTJCLEdBQUEsRUFBQSxHQUFBLEVBQUssRUFBQSxHQUFHLFdBQVcsQ0FBQTtBQUFBLFFBQ2hFLFVBQVksRUFBQSxVQUFBLElBQUEsSUFBQSxHQUFBLFVBQUEsR0FBQSxDQUFjLEVBQUssR0FBQSxJQUFBLENBQUEsS0FBQSxDQUFNLFNBQVgsSUFBaUIsR0FBQSxLQUFBLENBQUEsR0FBQSxFQUFBLENBQUEsVUFBQTtBQUFBLE9BQzdDLENBQUE7QUFBQSxLQUNELENBQUEsQ0FBQTtBQUFBLEdBQ0g7QUFBQSxFQWVRLDBCQUE2QixHQUFBO0FBQ25DLElBQUksSUFBQSxJQUFBLENBQUssaUJBQW1CLEVBQUE7QUFDMUIsTUFBQSxJQUFBLENBQUssVUFBVyxFQUFBLENBQUE7QUFBQSxLQUNsQjtBQUFBLEdBQ0Y7QUFBQSxFQUtRLHFCQUFxQixRQUF5QixFQUFBO0FBRXBELElBQUksSUFBQSxJQUFBLENBQUsscUJBQXFCLFFBQVksSUFBQSxJQUFBLENBQUssZ0JBQWdCLFFBQVksSUFBQSxDQUFDLElBQUssQ0FBQSxlQUFBLEVBQW1CLEVBQUE7QUFDbEcsTUFBQSxPQUFBO0FBQUEsS0FDRjtBQUVBLElBQUEsSUFBSSxRQUFvQixZQUFBLG9CQUFBLElBQXdCLElBQUssQ0FBQSx1QkFBQSxDQUF3QixRQUFRLENBQUcsRUFBQTtBQUN0RixNQUFBLElBQUEsQ0FBSyxVQUFXLEVBQUEsQ0FBQTtBQUFBLEtBQ2xCO0FBRUEsSUFBQSxJQUFJLFFBQW9CLFlBQUEsZUFBQSxJQUFtQixJQUFLLENBQUEsdUJBQUEsQ0FBd0IsUUFBUSxDQUFHLEVBQUE7QUFDakYsTUFBQSxJQUFBLENBQUssVUFBVyxFQUFBLENBQUE7QUFBQSxLQUNsQjtBQUFBLEdBQ0Y7QUFBQSxFQUVRLHdCQUF3QixRQUFrRCxFQUFBO0FBeFJwRixJQUFBLElBQUEsRUFBQSxFQUFBLEVBQUEsQ0FBQTtBQXlSSSxJQUFNLE1BQUEsVUFBQSxHQUFBLENBQWEsVUFBSyxLQUFNLENBQUEsVUFBQSxLQUFYLFlBQXlCLG1CQUFvQixDQUFBLElBQUEsQ0FBSyxNQUFNLE9BQU8sQ0FBQSxDQUFBO0FBQ2xGLElBQU8sT0FBQSxRQUFBLENBQVMsTUFBTSxTQUFjLEtBQUEsTUFBQSxJQUFBLENBQVUseUNBQVksR0FBUSxPQUFBLENBQUEsRUFBQSxHQUFBLFFBQUEsQ0FBUyxLQUFNLENBQUEsVUFBQSxLQUFmLElBQTJCLEdBQUEsS0FBQSxDQUFBLEdBQUEsRUFBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBO0FBQUEsR0FDL0Y7QUFBQSxFQUVRLDBCQUE2QixHQUFBO0FBQ25DLElBQUEsSUFBSSxJQUFLLENBQUEsc0JBQUEsQ0FBdUIsc0JBQXVCLENBQUEsSUFBSSxDQUFHLEVBQUE7QUFDNUQsTUFBQSxhQUFBO0FBQUEsUUFDRSxrQkFBQTtBQUFBLFFBQ0EscUZBQUE7QUFBQSxPQUNGLENBQUE7QUFDQSxNQUFPLE9BQUEsSUFBQSxDQUFBO0FBQUEsS0FDVDtBQUdBLElBQUksSUFBQSxDQUFDLElBQUssQ0FBQSxLQUFBLENBQU0sSUFBTSxFQUFBO0FBQ3BCLE1BQU8sT0FBQSxJQUFBLENBQUE7QUFBQSxLQUNUO0FBR0EsSUFBQSxJQUFJLElBQUssQ0FBQSxxQkFBQSxDQUFzQixJQUFLLENBQUEsS0FBQSxDQUFNLElBQUksQ0FBRyxFQUFBO0FBQy9DLE1BQU8sT0FBQSxJQUFBLENBQUE7QUFBQSxLQUNUO0FBRUEsSUFBTyxPQUFBLEtBQUEsQ0FBQTtBQUFBLEdBQ1Q7QUFBQSxFQUVRLHNCQUFzQixJQUFpQixFQUFBO0FBQzdDLElBQU0sTUFBQSxTQUFBLEdBQVksVUFBVyxDQUFBLFlBQUEsQ0FBYSxJQUFJLENBQUEsQ0FBQTtBQUU5QyxJQUFNLE1BQUEsY0FBQSxHQUFpQixVQUFVLEtBQU0sQ0FBQSxLQUFBLENBQUE7QUFDdkMsSUFBQSxNQUFNLGdCQUFnQixJQUFLLENBQUEsU0FBQSxDQUFBO0FBRTNCLElBQUEsSUFDRSxjQUFlLENBQUEsSUFBQSxDQUFLLElBQUssRUFBQSxLQUFNLGNBQWMsSUFBSyxDQUFBLElBQUEsRUFDbEQsSUFBQSxjQUFBLENBQWUsR0FBRyxJQUFLLEVBQUEsS0FBTSxhQUFjLENBQUEsRUFBQSxDQUFHLE1BQzlDLEVBQUE7QUFDQSxNQUFPLE9BQUEsS0FBQSxDQUFBO0FBQUEsS0FDVDtBQUNBLElBQUEsYUFBQSxDQUFjLG9CQUFvQiwwQkFBMEIsQ0FBQSxDQUFBO0FBQzVELElBQU8sT0FBQSxJQUFBLENBQUE7QUFBQSxHQUNUO0FBQUEsRUFFUSxhQUFzQixHQUFBO0FBblVoQyxJQUFBLElBQUEsRUFBQSxDQUFBO0FBb1VJLElBQUEsSUFBSSxLQUFLLFNBQVcsRUFBQTtBQUNsQixNQUFBLElBQUEsQ0FBSyxVQUFVLFdBQVksRUFBQSxDQUFBO0FBQzNCLE1BQUEsSUFBQSxDQUFLLFNBQVksR0FBQSxLQUFBLENBQUEsQ0FBQTtBQUFBLEtBQ25CO0FBRUEsSUFBQSxJQUFJLEtBQUssY0FBZ0IsRUFBQTtBQUN2QixNQUFBLElBQUEsQ0FBSyxlQUFlLFdBQVksRUFBQSxDQUFBO0FBQ2hDLE1BQUEsSUFBQSxDQUFLLGNBQWlCLEdBQUEsS0FBQSxDQUFBLENBQUE7QUFBQSxLQUN4QjtBQUVBLElBQUEsQ0FBQSxFQUFBLEdBQUEsSUFBQSxDQUFLLGFBQUwsSUFBZSxHQUFBLEtBQUEsQ0FBQSxHQUFBLEVBQUEsQ0FBQSxXQUFBLEVBQUEsQ0FBQTtBQUNmLElBQUEsSUFBQSxDQUFLLFFBQVcsR0FBQSxLQUFBLENBQUEsQ0FBQTtBQUNoQixJQUFBLElBQUEsQ0FBSyxhQUFnQixHQUFBLEtBQUEsQ0FBQSxDQUFBO0FBQ3JCLElBQUEsSUFBQSxDQUFLLGdCQUFtQixHQUFBLEtBQUEsQ0FBQSxDQUFBO0FBQ3hCLElBQUEsSUFBQSxDQUFLLFdBQWMsR0FBQSxLQUFBLENBQUEsQ0FBQTtBQUNuQixJQUFLLElBQUEsQ0FBQSxzQkFBQSxDQUF1Qiw0Q0FBNEMsSUFBSSxDQUFBLENBQUE7QUFBQSxHQUM5RTtBQUFBLEVBRU8sa0JBQWtCLEtBQWUsRUFBQTtBQUV0QyxJQUFBLElBQUksQ0FBQyxJQUFBLENBQUssZUFBbUIsSUFBQSxLQUFBLEdBQVEsQ0FBRyxFQUFBO0FBQ3RDLE1BQUEsSUFBQSxDQUFLLGVBQWtCLEdBQUEsS0FBQSxDQUFBO0FBR3ZCLE1BQUEsSUFBSSxLQUFLLEtBQU0sQ0FBQSxzQkFBQSxJQUEwQixDQUFDLElBQUEsQ0FBSyxNQUFNLGFBQWUsRUFBQTtBQUVsRSxRQUFBLFVBQUEsQ0FBVyxNQUFNO0FBQ2YsVUFBQSxJQUFJLElBQUssQ0FBQSxRQUFBLElBQVksQ0FBQyxJQUFBLENBQUssTUFBTSxlQUFpQixFQUFBO0FBQ2hELFlBQUEsSUFBQSxDQUFLLFVBQVcsRUFBQSxDQUFBO0FBQUEsV0FDbEI7QUFBQSxXQUNDLENBQUMsQ0FBQSxDQUFBO0FBQUEsT0FDTjtBQUFBLEtBQ0ssTUFBQTtBQUVMLE1BQUEsSUFBSSxRQUFRLENBQUcsRUFBQTtBQUNiLFFBQUEsSUFBQSxDQUFLLGVBQWtCLEdBQUEsS0FBQSxDQUFBO0FBQUEsT0FDekI7QUFBQSxLQUNGO0FBQUEsR0FDRjtBQUFBLEVBRU8sb0JBQXVCLEdBQUE7QUFDNUIsSUFBTyxPQUFBLE9BQUEsQ0FBUSxJQUFLLENBQUEsS0FBQSxDQUFNLGVBQWUsQ0FBQSxDQUFBO0FBQUEsR0FDM0M7QUFBQSxFQUVRLDRCQUE0QixTQUErQixFQUFBO0FBQ2pFLElBQUksSUFBQSxJQUFBLENBQUssa0JBQWtCLFNBQVcsRUFBQTtBQUVwQyxNQUFBLE9BQUE7QUFBQSxLQUNGO0FBRUEsSUFBQSxJQUFJLEtBQUssUUFBVSxFQUFBO0FBQ2pCLE1BQUEsSUFBQSxDQUFLLFNBQVMsV0FBWSxFQUFBLENBQUE7QUFBQSxLQUM1QjtBQUVBLElBQUEsSUFBQSxDQUFLLGFBQWdCLEdBQUEsU0FBQSxDQUFBO0FBQ3JCLElBQUssSUFBQSxDQUFBLFFBQUEsR0FBVyxTQUFVLENBQUEsZ0JBQUEsQ0FBaUIsTUFBTTtBQUMvQyxNQUFBLElBQUEsQ0FBSyxpQkFBaUIsU0FBUyxDQUFBLENBQUE7QUFBQSxLQUNoQyxDQUFBLENBQUE7QUFBQSxHQUNIO0FBQUEsRUFFTyxVQUFhLEdBQUE7QUFDbEIsSUFBTSxNQUFBLFNBQUEsR0FBWSxVQUFXLENBQUEsWUFBQSxDQUFhLElBQUksQ0FBQSxDQUFBO0FBQzlDLElBQUksSUFBQSxJQUFBLENBQUssaUJBQW1CLEVBQUE7QUFDMUIsTUFBQSxJQUFBLENBQUssNEJBQTRCLFNBQVMsQ0FBQSxDQUFBO0FBQUEsS0FDNUM7QUFFQSxJQUFBLElBQUEsQ0FBSyxpQkFBaUIsU0FBUyxDQUFBLENBQUE7QUFBQSxHQUNqQztBQUFBLEVBRVEsZ0JBQW1CLEdBQUE7QUF6WTdCLElBQUEsSUFBQSxFQUFBLENBQUE7QUEwWUksSUFBSSxJQUFBLElBQUEsQ0FBSyxNQUFNLGFBQWUsRUFBQTtBQUM1QixNQUFBLE9BQU8sS0FBSyxLQUFNLENBQUEsYUFBQSxDQUFBO0FBQUEsS0FDcEI7QUFFQSxJQUFBLE9BQU8sS0FBSyxLQUFNLENBQUEsc0JBQUEsR0FBQSxDQUF5QixFQUFLLEdBQUEsSUFBQSxDQUFBLGVBQUEsS0FBTCxZQUF3QixHQUFNLEdBQUEsR0FBQSxDQUFBO0FBQUEsR0FDM0U7QUFBQSxFQUVPLFdBQWMsR0FBQTtBQWpadkIsSUFBQSxJQUFBLEVBQUEsQ0FBQTtBQWtaSSxJQUFBLENBQUEsRUFBQSxHQUFBLElBQUEsQ0FBSyxjQUFMLElBQWdCLEdBQUEsS0FBQSxDQUFBLEdBQUEsRUFBQSxDQUFBLFdBQUEsRUFBQSxDQUFBO0FBRWhCLElBQUEsSUFBSSxLQUFLLGNBQWdCLEVBQUE7QUFDdkIsTUFBQSxJQUFBLENBQUssZUFBZSxXQUFZLEVBQUEsQ0FBQTtBQUNoQyxNQUFBLElBQUEsQ0FBSyxjQUFpQixHQUFBLEtBQUEsQ0FBQSxDQUFBO0FBQUEsS0FDeEI7QUFFQSxJQUFBLElBQUEsQ0FBSyxRQUFTLENBQUE7QUFBQSxNQUNaLElBQUEsRUFBTSxpQ0FBSyxJQUFLLENBQUEsS0FBQSxDQUFNLE9BQWhCLEVBQXVCLEtBQUEsRUFBTyxhQUFhLElBQUssRUFBQSxDQUFBO0FBQUEsS0FDdkQsQ0FBQSxDQUFBO0FBQUEsR0FDSDtBQUFBLEVBRUEsTUFBYyxpQkFBaUIsU0FBK0IsRUFBQTtBQTlaaEUsSUFBQSxJQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxDQUFBO0FBZ2FJLElBQUksSUFBQSxDQUFDLEtBQUssS0FBTSxDQUFBLGFBQUEsSUFBaUIsS0FBSyxLQUFNLENBQUEsc0JBQUEsSUFBMEIsQ0FBQyxJQUFBLENBQUssZUFBaUIsRUFBQTtBQUMzRixNQUFBLE9BQUE7QUFBQSxLQUNGO0FBR0EsSUFBSSxJQUFBLENBQUMsS0FBSyxjQUFnQixFQUFBO0FBQ3hCLE1BQUEsSUFBQSxDQUFLLGlCQUFrQixFQUFBLENBQUE7QUFBQSxLQUN6QjtBQUdBLElBQUEsQ0FBQSxFQUFBLEdBQUEsSUFBQSxDQUFLLGNBQUwsSUFBZ0IsR0FBQSxLQUFBLENBQUEsR0FBQSxFQUFBLENBQUEsV0FBQSxFQUFBLENBQUE7QUFHaEIsSUFBSSxJQUFBLElBQUEsQ0FBSyxtQkFBb0IsQ0FBQSwyQkFBQSxFQUErQixFQUFBO0FBQzFELE1BQUEsYUFBQSxDQUFjLG9CQUFvQixtRUFBbUUsQ0FBQSxDQUFBO0FBQ3JHLE1BQUEsSUFBQSxDQUFLLFFBQVMsQ0FBQSxFQUFFLElBQU0sRUFBQSxhQUFBLENBQUEsY0FBQSxDQUFBLEVBQUEsRUFBQSxDQUFNLFVBQUssS0FBTSxDQUFBLElBQUEsS0FBWCxJQUFtQixHQUFBLEVBQUEsR0FBQSxjQUFBLENBQUEsRUFBekIsRUFBMEMsS0FBQSxFQUFPLFlBQWEsQ0FBQSxPQUFBLEtBQVcsQ0FBQSxDQUFBO0FBQy9GLE1BQUEsT0FBQTtBQUFBLEtBQ0Y7QUFFQSxJQUFNLE1BQUEsRUFBRSxPQUFRLEVBQUEsR0FBSSxJQUFLLENBQUEsS0FBQSxDQUFBO0FBR3pCLElBQUksSUFBQSxFQUFDLG1DQUFTLE1BQVEsQ0FBQSxFQUFBO0FBQ3BCLE1BQUEsSUFBQSxDQUFLLGVBQWdCLEVBQUEsQ0FBQTtBQUNyQixNQUFBLE9BQUE7QUFBQSxLQUNGO0FBRUEsSUFBSSxJQUFBO0FBQ0YsTUFBQSxNQUFNLGNBQWEsRUFBSyxHQUFBLElBQUEsQ0FBQSxLQUFBLENBQU0sVUFBWCxLQUFBLElBQUEsR0FBQSxFQUFBLEdBQXlCLG9CQUFvQixPQUFPLENBQUEsQ0FBQTtBQUN2RSxNQUFBLE1BQU0sRUFBSyxHQUFBLE1BQU0sYUFBYyxDQUFBLFVBQUEsRUFBWSxLQUFLLFdBQVcsQ0FBQSxDQUFBO0FBRTNELE1BQUssSUFBQSxDQUFBLDhCQUFBLENBQStCLHlDQUFZLEdBQUcsQ0FBQSxDQUFBO0FBRW5ELE1BQUEsTUFBTSxhQUFhLGFBQWMsRUFBQSxDQUFBO0FBQ2pDLE1BQU0sTUFBQSxFQUFFLFNBQVMsV0FBYSxFQUFBLFVBQUEsS0FBZSxJQUFLLENBQUEsZUFBQSxDQUFnQixXQUFXLEVBQUUsQ0FBQSxDQUFBO0FBRS9FLE1BQUEsYUFBQSxDQUFjLGtCQUFvQixFQUFBLHFCQUFBLEVBQXVCLElBQUssQ0FBQSxLQUFBLENBQU0sR0FBRyxDQUFBLENBQUE7QUFFdkUsTUFBSSxJQUFBLE1BQUEsR0FBUyxVQUFXLENBQUEsRUFBQSxFQUFJLE9BQU8sQ0FBQSxDQUFBO0FBRW5DLE1BQUksSUFBQSxXQUFBLENBQVksU0FBUyxDQUFHLEVBQUE7QUFFMUIsUUFBTSxNQUFBLGdCQUFBLEdBQW1CLFlBQVksR0FBSSxDQUFBLENBQUMsTUFBTSxVQUFXLENBQUEsRUFBQSxFQUFJLENBQUMsQ0FBQyxDQUFBLENBQUE7QUFJakUsUUFBTSxNQUFBLEVBQUEsR0FBSyw2QkFBNkIsVUFBVSxDQUFBLENBQUE7QUFFbEQsUUFBUyxNQUFBLEdBQUEsUUFBQSxDQUFTLENBQUMsTUFBUSxFQUFBLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQSxDQUFFLEtBQUssRUFBRSxDQUFBLENBQUE7QUFBQSxPQUMxRDtBQUVBLE1BQUEsTUFBQSxHQUFTLE1BQU8sQ0FBQSxJQUFBO0FBQUEsUUFDZCwyQkFBNEIsQ0FBQTtBQUFBLFVBQzFCLElBQU0sRUFBQSxNQUFBO0FBQUEsVUFDTixPQUFTLEVBQUEsT0FBQTtBQUFBLFVBQ1QsTUFBUSxFQUFBLElBQUE7QUFBQSxVQUNSLE1BQUEsRUFBUSxNQUFNLElBQUEsQ0FBSyxXQUFZLEVBQUE7QUFBQSxTQUNoQyxDQUFBO0FBQUEsT0FDSCxDQUFBO0FBRUEsTUFBQSxJQUFBLENBQUssU0FBWSxHQUFBLE1BQUEsQ0FBTyxTQUFVLENBQUEsSUFBQSxDQUFLLGNBQWMsQ0FBQSxDQUFBO0FBQUEsYUFDOUMsR0FBUCxFQUFBO0FBQ0EsTUFBUSxPQUFBLENBQUEsS0FBQSxDQUFNLDBCQUEwQixHQUFHLENBQUEsQ0FBQTtBQUUzQyxNQUFBLElBQUEsQ0FBSyxjQUFlLENBQUEsYUFBQSxDQUFBLGNBQUEsQ0FBQSxjQUFBLENBQUEsRUFBQSxFQUNmLGNBQ0EsQ0FBQSxFQUFBLElBQUEsQ0FBSyxNQUFNLElBRkksQ0FBQSxFQUFBO0FBQUEsUUFHbEIsT0FBTyxZQUFhLENBQUEsS0FBQTtBQUFBLFFBQ3BCLE1BQVEsRUFBQSxDQUFDLGdCQUFpQixDQUFBLEdBQUcsQ0FBQyxDQUFBO0FBQUEsT0FDL0IsQ0FBQSxDQUFBLENBQUE7QUFBQSxLQUNIO0FBQUEsR0FDRjtBQUFBLEVBRU8sTUFBTSxTQUF1QyxFQUFBO0FBemV0RCxJQUFBLElBQUEsRUFBQSxDQUFBO0FBMGVJLElBQU0sTUFBQSxLQUFBLEdBQVEsS0FBTSxDQUFBLEtBQUEsQ0FBTSxTQUFTLENBQUEsQ0FBQTtBQUVuQyxJQUFBLElBQUksS0FBSyxrQkFBb0IsRUFBQTtBQUMzQixNQUFBLEtBQUEsQ0FBTSx3QkFBd0IsSUFBSyxDQUFBLGtCQUFBLENBQW1CLElBQUksQ0FBQyxLQUFBLEtBQVcsbUJBQUssS0FBUSxDQUFBLENBQUEsQ0FBQTtBQUFBLEtBQ3JGO0FBRUEsSUFBQSxJQUFJLEtBQUssaUJBQW1CLEVBQUE7QUFDMUIsTUFBQSxLQUFBLENBQU0sdUJBQXVCLElBQUssQ0FBQSxpQkFBQSxDQUFrQixJQUFJLENBQUMsS0FBQSxLQUFXLG1CQUFLLEtBQVEsQ0FBQSxDQUFBLENBQUE7QUFBQSxLQUNuRjtBQUVBLElBQUEsS0FBQSxDQUFNLHdCQUE0QixDQUFBLEdBQUEsSUFBQSxDQUFLLHNCQUF1QixDQUFBLHlDQUFBLENBQTBDLElBQUksQ0FBQSxDQUFBO0FBQzVHLElBQUEsS0FBQSxDQUFNLHFCQUFxQixJQUFLLENBQUEsZUFBQSxDQUFBO0FBQ2hDLElBQU0sS0FBQSxDQUFBLFVBQUEsQ0FBQSxDQUFZLElBQUssQ0FBQSxFQUFFLE1BQVEsRUFBQSxJQUFBLEVBQU0sSUFBTSxFQUFBLENBQUEsRUFBQSxHQUFBLElBQUEsQ0FBSyxLQUFNLENBQUEsSUFBQSxLQUFYLElBQW1CLEdBQUEsRUFBQSxHQUFBLGNBQUEsRUFBZ0IsQ0FBQSxDQUFBO0FBRWhGLElBQU8sT0FBQSxLQUFBLENBQUE7QUFBQSxHQUNUO0FBQUEsRUFFUSxlQUFBLENBQWdCLFdBQStCLEVBQXFDLEVBQUE7QUEzZjlGLElBQUEsSUFBQSxFQUFBLENBQUE7QUE0ZkksSUFBQSxNQUFNLEVBQUUsV0FBQSxFQUFhLE9BQVEsRUFBQSxHQUFJLElBQUssQ0FBQSxLQUFBLENBQUE7QUFFdEMsSUFBQSxJQUFJLE9BQStDLEdBQUEsY0FBQSxDQUFBO0FBQUEsTUFDakQsR0FBSyxFQUFBLFFBQUE7QUFBQSxNQUNMLFdBQVcsZ0JBQWlCLEVBQUE7QUFBQSxNQUM1QixRQUFBLEVBQVUsVUFBVSxXQUFZLEVBQUE7QUFBQSxNQUNoQyxLQUFBLEVBQU8sVUFBVSxLQUFNLENBQUEsS0FBQTtBQUFBLE1BQ3ZCLFFBQVUsRUFBQSxJQUFBO0FBQUEsTUFDVixVQUFZLEVBQUEsR0FBQTtBQUFBLE1BQ1osT0FBQSxFQUFTLFVBQVUsT0FBTyxDQUFBO0FBQUEsTUFDMUIsYUFBQSxFQUFlLEtBQUssZ0JBQWlCLEVBQUE7QUFBQSxNQUNyQyxZQUFZLElBQUssQ0FBQSxXQUFBO0FBQUEsTUFDakIsU0FBQSxFQUFXLEtBQUssR0FBSSxFQUFBO0FBQUEsTUFDcEIsYUFBQSxFQUFlLEtBQUssS0FBTSxDQUFBLGFBQUE7QUFBQSxNQUMxQixRQUFVLEVBQUE7QUFBQSxRQUNSLElBQUEsRUFBTSxVQUFVLEtBQU0sQ0FBQSxJQUFBO0FBQUEsUUFDdEIsRUFBQSxFQUFJLFVBQVUsS0FBTSxDQUFBLEVBQUE7QUFBQSxPQUN0QjtBQUFBLE1BQ0EsWUFBQSxFQUFjLEtBQUssS0FBTSxDQUFBLFlBQUE7QUFBQSxNQUN6QixlQUFBLEVBQWlCLEtBQUssS0FBTSxDQUFBLGVBQUE7QUFBQSxLQUFBLEVBRXpCLHVCQUF1QixJQUFJLENBQUEsQ0FBQSxDQUFBO0FBR2hDLElBQUEsSUFBSSxLQUFLLGdCQUFrQixFQUFBO0FBR3pCLE1BQUEsT0FBQSxDQUFRLFVBQVUsSUFBSyxDQUFBLGdCQUFBLENBQWlCLEtBQU0sQ0FBQSxPQUFBLENBQVEsT0FBTyxnQkFBZ0IsQ0FBQSxDQUFBO0FBQUEsS0FDL0U7QUFFQSxJQUFBLElBQUksS0FBSyxXQUFhLEVBQUE7QUFFcEIsTUFBUSxPQUFBLENBQUEsV0FBQSxHQUFjLElBQUssQ0FBQSxXQUFBLENBQVksS0FBTSxDQUFBLEtBQUEsQ0FBQTtBQUFBLEtBQy9DO0FBRUEsSUFBQSxPQUFBLENBQVEsT0FBVSxHQUFBLE9BQUEsQ0FBUSxPQUFRLENBQUEsR0FBQSxDQUFJLENBQUMsS0FBVSxLQUFBO0FBL2hCckQsTUFBQUEsSUFBQUEsR0FBQUEsQ0FBQUE7QUFnaUJNLE1BQ0UsSUFBQSxDQUFDLE1BQU0sVUFDTixJQUFBLEtBQUEsQ0FBTSxXQUFXLEdBQVEsS0FBQSxFQUFBLENBQUcsT0FDM0IsRUFBQ0EsQ0FBQUEsR0FBQUEsR0FBQSxHQUFHLElBQUgsS0FBQSxJQUFBLEdBQUEsS0FBQSxDQUFBLEdBQUFBLElBQVMsS0FDVixDQUFBLElBQUEscUJBQUEsSUFDQSxDQUFDLHFCQUFzQixDQUFBLEtBQUEsQ0FBTSxVQUFVLENBQ3pDLEVBQUE7QUFDQSxRQUFNLEtBQUEsQ0FBQSxVQUFBLEdBQWEsR0FBRyxNQUFPLEVBQUEsQ0FBQTtBQUFBLE9BQy9CO0FBQ0EsTUFBTyxPQUFBLEtBQUEsQ0FBQTtBQUFBLEtBQ1IsQ0FBQSxDQUFBO0FBRUQsSUFBQSxNQUFNLHFCQUFxQixXQUFjLEdBQUEsV0FBQSxDQUFZLElBQU0sRUFBQSxXQUFXLElBQUksRUFBRyxDQUFBLFFBQUEsQ0FBQTtBQUM3RSxJQUFNLE1BQUEsSUFBQSxHQUFPLFVBQVUsaUJBQWtCLENBQUEsU0FBQSxDQUFVLE1BQU0sS0FBTyxFQUFBLE9BQUEsQ0FBUSxlQUFnQixrQkFBa0IsQ0FBQSxDQUFBO0FBSTFHLElBQUEsT0FBQSxDQUFRLGFBQWEsTUFBTyxDQUFBLE1BQUEsQ0FBTyxFQUFDLEVBQUcsUUFBUSxVQUFZLEVBQUE7QUFBQSxNQUN6RCxZQUFZLEVBQUUsSUFBQSxFQUFNLEtBQUssUUFBVSxFQUFBLEtBQUEsRUFBTyxLQUFLLFFBQVMsRUFBQTtBQUFBLE1BQ3hELGFBQUEsRUFBZSxFQUFFLElBQU0sRUFBQSxJQUFBLENBQUssV0FBVyxRQUFTLEVBQUEsRUFBRyxLQUFPLEVBQUEsSUFBQSxDQUFLLFVBQVcsRUFBQTtBQUFBLEtBQzNFLENBQUEsQ0FBQTtBQUVELElBQUEsT0FBQSxDQUFRLFdBQVcsSUFBSyxDQUFBLFFBQUEsQ0FBQTtBQUN4QixJQUFBLE9BQUEsQ0FBUSxhQUFhLElBQUssQ0FBQSxVQUFBLENBQUE7QUFLMUIsSUFBTSxNQUFBLGdCQUFBLEdBQW1CLFVBQVUsS0FBTSxDQUFBLEtBQUEsQ0FBQTtBQUN6QyxJQUFBLElBQUksb0JBQXdDLEVBQUMsQ0FBQTtBQUM3QyxJQUFJLElBQUEsbUJBQUEsdUJBQTBCLEdBQUksRUFBQSxDQUFBO0FBQ2xDLElBQUEsS0FBQSxNQUFXLGFBQVksRUFBSyxHQUFBLElBQUEsQ0FBQSw2QkFBQSxFQUFMLEtBQUEsSUFBQSxHQUFBLEVBQUEsR0FBd0MsRUFBSSxFQUFBO0FBQ2pFLE1BQUEsS0FBQSxNQUFXLEVBQUUsR0FBSyxFQUFBLFNBQUEsTUFBZSxRQUFTLENBQUEsZUFBQSxDQUFnQixPQUFPLENBQUcsRUFBQTtBQUNsRSxRQUFBLE1BQU0sWUFBWSxnQkFBaUIsRUFBQSxDQUFBO0FBQ25DLFFBQUEsaUJBQUEsQ0FBa0IsSUFBSyxDQUFBLGFBQUEsQ0FBQSxjQUFBLENBQUEsRUFBQSxFQUFLLEdBQUwsQ0FBQSxFQUFBLEVBQVUsV0FBVyxDQUFBLENBQUEsQ0FBQTtBQUM1QyxRQUFvQixtQkFBQSxDQUFBLEdBQUEsQ0FBSSxTQUFXLEVBQUEsU0FBQSxJQUFBLElBQUEsR0FBQSxTQUFBLEdBQWEsb0JBQW9CLENBQUEsQ0FBQTtBQUFBLE9BQ3RFO0FBQUEsS0FDRjtBQUNBLElBQUEsT0FBQSxDQUFRLEtBQVEsR0FBQSxnQkFBQSxDQUFBO0FBQ2hCLElBQUEsT0FBTyxFQUFFLE9BQVMsRUFBQSxPQUFBLEVBQVMsV0FBYSxFQUFBLGlCQUFBLEVBQW1CLFlBQVksbUJBQW9CLEVBQUEsQ0FBQTtBQUFBLEdBQzdGO0FBQUEsRUFzQlEsbUJBQW1CLElBQWlCLEVBQUE7QUFDMUMsSUFBQSxJQUFJLElBQUssQ0FBQSxpQkFBQSxJQUFxQixJQUFLLENBQUEsaUJBQUEsQ0FBa0IsU0FBUyxDQUFHLEVBQUE7QUFDL0QsTUFBQSxJQUFBLENBQUssZUFBZSxJQUFLLENBQUEsV0FBQSxJQUFlLEVBQUksRUFBQSxNQUFBLENBQU8sS0FBSyxpQkFBaUIsQ0FBQSxDQUFBO0FBQUEsS0FDM0U7QUFFQSxJQUFBLElBQUksS0FBSyxLQUFNLENBQUEsSUFBQSxJQUFRLElBQUssQ0FBQSxLQUFBLENBQU0sS0FBSyxVQUFZLEVBQUE7QUFDakQsTUFBSyxJQUFBLENBQUEsVUFBQSxHQUFhLElBQUssQ0FBQSxLQUFBLENBQU0sSUFBSyxDQUFBLFVBQUEsQ0FBQTtBQUFBLEtBQ3BDO0FBRUEsSUFBTyxPQUFBLElBQUEsQ0FBQTtBQUFBLEdBQ1Q7QUFBQSxFQUVRLGVBQWtCLEdBQUE7QUFDeEIsSUFBSSxJQUFBLElBQUEsQ0FBSyxLQUFNLENBQUEsSUFBQSxLQUFTLGNBQWdCLEVBQUE7QUFDdEMsTUFBQSxJQUFBLENBQUssUUFBUyxDQUFBLEVBQUUsSUFBTSxFQUFBLGNBQUEsRUFBZ0IsQ0FBQSxDQUFBO0FBQUEsS0FDeEM7QUFBQSxHQUNGO0FBQUEsRUFPUSw2QkFBZ0UsR0FBQTtBQUl0RSxJQUFNLE1BQUEsS0FBQSx1QkFBWSxHQUFJLEVBQUEsQ0FBQTtBQUN0QixJQUFJLElBQUEsQ0FBQyxLQUFLLE1BQVEsRUFBQTtBQUNoQixNQUFBLE9BQU8sRUFBQyxDQUFBO0FBQUEsS0FDVjtBQUNBLElBQVcsVUFBQSxDQUFBLElBQUEsQ0FBSyxNQUFRLEVBQUEsQ0FBQyxDQUFNLEtBQUE7QUFDN0IsTUFBSSxJQUFBLG9CQUFBLENBQXFCLENBQUMsQ0FBSyxJQUFBLENBQUMsTUFBTSxHQUFJLENBQUEsQ0FBQSxDQUFFLFdBQVcsQ0FBRyxFQUFBO0FBQ3hELFFBQU0sS0FBQSxDQUFBLEdBQUEsQ0FBSSxDQUFFLENBQUEsV0FBQSxFQUFhLENBQUMsQ0FBQSxDQUFBO0FBQUEsT0FDNUI7QUFDQSxNQUFFLENBQUEsQ0FBQSxZQUFBLENBQWEsQ0FBQyxLQUFVLEtBQUE7QUFDeEIsUUFBSSxJQUFBLG9CQUFBLENBQXFCLEtBQUssQ0FBSyxJQUFBLENBQUMsTUFBTSxHQUFJLENBQUEsS0FBQSxDQUFNLFdBQVcsQ0FBRyxFQUFBO0FBQ2hFLFVBQU0sS0FBQSxDQUFBLEdBQUEsQ0FBSSxLQUFNLENBQUEsV0FBQSxFQUFhLEtBQUssQ0FBQSxDQUFBO0FBQUEsU0FDcEM7QUFBQSxPQUNELENBQUEsQ0FBQTtBQUdELE1BQU8sT0FBQSxJQUFBLENBQUE7QUFBQSxLQUNSLENBQUEsQ0FBQTtBQUNELElBQUEsT0FBTyxLQUFNLENBQUEsSUFBQSxDQUFLLEtBQU0sQ0FBQSxNQUFBLEVBQVEsQ0FBQSxDQUFBO0FBQUEsR0FDbEM7QUFBQSxFQUtRLCtCQUErQixHQUF5QixFQUFBO0FBQzlELElBQU0sTUFBQSxVQUFBLEdBQWEsbUNBQW1DLEdBQUcsQ0FBQSxDQUFBO0FBRXpELElBQUksSUFBQSxJQUFBLENBQUsscUJBQXFCLFVBQVksRUFBQTtBQUN4QyxNQUFBLElBQUEsQ0FBSyxnQkFBbUIsR0FBQSxVQUFBLENBQUE7QUFDeEIsTUFBQSxJQUFBLENBQUssbUNBQW9DLEVBQUEsQ0FBQTtBQUFBLEtBQzNDO0FBRUEsSUFBTSxNQUFBLFVBQUEsR0FBYSxnQ0FBZ0MsR0FBRyxDQUFBLENBQUE7QUFDdEQsSUFBSSxJQUFBLElBQUEsQ0FBSyxnQkFBZ0IsVUFBWSxFQUFBO0FBQ25DLE1BQUEsSUFBQSxDQUFLLFdBQWMsR0FBQSxVQUFBLENBQUE7QUFDbkIsTUFBQSxJQUFBLENBQUssbUNBQW9DLEVBQUEsQ0FBQTtBQUFBLEtBQzNDO0FBQUEsR0FDRjtBQUFBLEVBRVEsbUNBQXNDLEdBQUE7QUFDNUMsSUFBQSxNQUFNLHVCQUFpQyxFQUFDLENBQUE7QUFFeEMsSUFBQSxJQUFJLEtBQUssZ0JBQWtCLEVBQUE7QUFDekIsTUFBQSxvQkFBQSxDQUFxQixJQUFLLENBQUEsSUFBQSxDQUFLLGdCQUFpQixDQUFBLEtBQUEsQ0FBTSxJQUFJLENBQUEsQ0FBQTtBQUFBLEtBQzVEO0FBRUEsSUFBQSxJQUFJLEtBQUssV0FBYSxFQUFBO0FBQ3BCLE1BQUEsb0JBQUEsQ0FBcUIsSUFBSyxDQUFBLElBQUEsQ0FBSyxXQUFZLENBQUEsS0FBQSxDQUFNLElBQUksQ0FBQSxDQUFBO0FBQUEsS0FDdkQ7QUFFQSxJQUFLLElBQUEsQ0FBQSxtQkFBQSxDQUFvQixpQkFBaUIsb0JBQW9CLENBQUEsQ0FBQTtBQUFBLEdBQ2hFO0FBQUEsRUFFUSxlQUEyQixHQUFBO0FBN3FCckMsSUFBQSxJQUFBLEVBQUEsQ0FBQTtBQThxQkksSUFBQSxPQUFBLENBQUEsQ0FBUSxFQUFLLEdBQUEsSUFBQSxDQUFBLEtBQUEsQ0FBTSxjQUFYLEtBQUEsSUFBQSxHQUFBLEVBQUEsR0FBNkIsTUFBWSxNQUFBLE1BQUEsQ0FBQTtBQUFBLEdBQ25EO0FBQ0YsQ0FBQTtBQUVPLFNBQVMsb0JBQW9CLE9BQWlELEVBQUE7QUFsckJyRixFQUFBLElBQUEsRUFBQSxFQUFBLEVBQUEsQ0FBQTtBQW1yQkUsRUFBTyxPQUFBLENBQUEsRUFBQSxHQUFBLENBQUEsRUFBQSxHQUFBLE9BQUEsQ0FBUSxJQUFLLENBQUEsQ0FBQyxDQUFNLEtBQUEsQ0FBQSxDQUFFLGVBQWUsSUFBSSxDQUFBLEtBQXpDLElBQTRDLEdBQUEsS0FBQSxDQUFBLEdBQUEsRUFBQSxDQUFBLFVBQUEsS0FBNUMsSUFBMEQsR0FBQSxFQUFBLEdBQUEsS0FBQSxDQUFBLENBQUE7QUFDbkUsQ0FBQTtBQUVBLFNBQVMsZUFBZSxNQUFzQixFQUFBO0FBQzVDLEVBQUEsSUFBSSxDQUFDLE1BQVEsRUFBQTtBQUNYLElBQU8sT0FBQSxJQUFBLENBQUE7QUFBQSxHQUNUO0FBRUEsRUFBQSxLQUFBLElBQVMsQ0FBSSxHQUFBLENBQUEsRUFBRyxDQUFJLEdBQUEsTUFBQSxDQUFPLFFBQVEsQ0FBSyxFQUFBLEVBQUE7QUFDdEMsSUFBSSxJQUFBLE1BQUEsQ0FBTyxDQUFHLENBQUEsQ0FBQSxNQUFBLEdBQVMsQ0FBRyxFQUFBO0FBQ3hCLE1BQU8sT0FBQSxLQUFBLENBQUE7QUFBQSxLQUNUO0FBQUEsR0FDRjtBQUVBLEVBQU8sT0FBQSxJQUFBLENBQUE7QUFDVDs7OzsifQ==
@@ -0,0 +1,46 @@
1
+ import { of, mergeMap, forkJoin, map } from 'rxjs';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __defProps = Object.defineProperties;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
9
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __spreadValues = (a, b) => {
11
+ for (var prop in b || (b = {}))
12
+ if (__hasOwnProp.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ if (__getOwnPropSymbols)
15
+ for (var prop of __getOwnPropSymbols(b)) {
16
+ if (__propIsEnum.call(b, prop))
17
+ __defNormalProp(a, prop, b[prop]);
18
+ }
19
+ return a;
20
+ };
21
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
22
+ const passthroughProcessor = (_, secondary) => of(secondary);
23
+ const extraQueryProcessingOperator = (processors) => (data) => {
24
+ return data.pipe(
25
+ mergeMap(([primary, ...secondaries]) => {
26
+ const processedSecondaries = secondaries.flatMap((s) => {
27
+ var _a, _b;
28
+ return (_b = (_a = processors.get(s.request.requestId)) == null ? void 0 : _a(primary, s)) != null ? _b : of(s);
29
+ });
30
+ return forkJoin([of(primary), ...processedSecondaries]);
31
+ }),
32
+ map(([primary, ...processedSecondaries]) => {
33
+ var _a;
34
+ return __spreadProps(__spreadValues({}, primary), {
35
+ series: [...primary.series, ...processedSecondaries.flatMap((s) => s.series)],
36
+ annotations: [...(_a = primary.annotations) != null ? _a : [], ...processedSecondaries.flatMap((s) => {
37
+ var _a2;
38
+ return (_a2 = s.annotations) != null ? _a2 : [];
39
+ })]
40
+ });
41
+ })
42
+ );
43
+ };
44
+
45
+ export { extraQueryProcessingOperator, passthroughProcessor };
46
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0cmFRdWVyeVByb2Nlc3NpbmdPcGVyYXRvci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3F1ZXJ5aW5nL2V4dHJhUXVlcnlQcm9jZXNzaW5nT3BlcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFuZWxEYXRhIH0gZnJvbSAnQGdyYWZhbmEvZGF0YSc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgb2YsIG1hcCwgbWVyZ2VNYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEV4dHJhUXVlcnlEYXRhUHJvY2Vzc29yIH0gZnJvbSAnLi9FeHRyYVF1ZXJ5UHJvdmlkZXInO1xuXG4vLyBQYXNzdGhyb3VnaCBwcm9jZXNzb3IgZm9yIHVzZSB3aXRoIEV4dHJhUXVlcnlzLlxuZXhwb3J0IGNvbnN0IHBhc3N0aHJvdWdoUHJvY2Vzc29yOiBFeHRyYVF1ZXJ5RGF0YVByb2Nlc3NvciA9IChfLCBzZWNvbmRhcnkpID0+IG9mKHNlY29uZGFyeSk7XG5cbi8vIEZhY3RvcnkgZnVuY3Rpb24gd2hpY2ggdGFrZXMgYSBtYXAgZnJvbSByZXF1ZXN0IElEIHRvIHByb2Nlc3NvciBmdW5jdGlvbnMgYW5kXG4vLyByZXR1cm5zIGFuIHJ4anMgb3BlcmF0b3Igd2hpY2ggb3BlcmF0ZXMgb24gYW4gYXJyYXkgb2YgcGFuZWwgZGF0YSByZXNwb25zZXMuXG4vL1xuLy8gRWFjaCBzZWNvbmRhcnkgcmVzcG9uc2UgaXMgdHJhbnNmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBwcm9jZXNzb3IgZnVuY3Rpb25cbi8vIGlkZW50aWZpZWQgYnkgaXQncyByZXF1ZXN0IElELiBUaGUgcHJvY2Vzc29yIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgcHJpbWFyeVxuLy8gcmVzcG9uc2UgYW5kIHRoZSBzZWNvbmRhcnkgcmVzcG9uc2UgdG8gYmUgcHJvY2Vzc2VkLlxuLy9cbi8vIFRoZSBvdXRwdXQgaXMgYSBzaW5nbGUgZnJhbWUgd2l0aCB0aGUgcHJpbWFyeSBzZXJpZXMgYW5kIGFsbCBwcm9jZXNzZWRcbi8vIHNlY29uZGFyeSBzZXJpZXMgY29tYmluZWQuXG5leHBvcnQgY29uc3QgZXh0cmFRdWVyeVByb2Nlc3NpbmdPcGVyYXRvciA9XG4gIChwcm9jZXNzb3JzOiBNYXA8c3RyaW5nLCBFeHRyYVF1ZXJ5RGF0YVByb2Nlc3Nvcj4pID0+IChkYXRhOiBPYnNlcnZhYmxlPFtQYW5lbERhdGEsIC4uLlBhbmVsRGF0YVtdXT4pID0+IHtcbiAgICByZXR1cm4gZGF0YS5waXBlKFxuICAgICAgbWVyZ2VNYXAoKFtwcmltYXJ5LCAuLi5zZWNvbmRhcmllc10pID0+IHtcbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkU2Vjb25kYXJpZXMgPSBzZWNvbmRhcmllcy5mbGF0TWFwKChzKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHByb2Nlc3NvcnMuZ2V0KHMucmVxdWVzdCEucmVxdWVzdElkKT8uKHByaW1hcnksIHMpID8/IG9mKHMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKFtvZihwcmltYXJ5KSwgLi4ucHJvY2Vzc2VkU2Vjb25kYXJpZXNdKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKChbcHJpbWFyeSwgLi4ucHJvY2Vzc2VkU2Vjb25kYXJpZXNdKSA9PiAoe1xuICAgICAgICAuLi5wcmltYXJ5LFxuICAgICAgICBzZXJpZXM6IFsuLi5wcmltYXJ5LnNlcmllcywgLi4ucHJvY2Vzc2VkU2Vjb25kYXJpZXMuZmxhdE1hcCgocykgPT4gcy5zZXJpZXMpXSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IFsuLi4ocHJpbWFyeS5hbm5vdGF0aW9ucyA/PyBbXSksIC4uLnByb2Nlc3NlZFNlY29uZGFyaWVzLmZsYXRNYXAoKHMpID0+IHMuYW5ub3RhdGlvbnMgPz8gW10pXSxcbiAgICAgIH0pKVxuICAgICk7XG4gIH07XG4iXSwibmFtZXMiOlsiX2EiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtPLE1BQU0sb0JBQWdELEdBQUEsQ0FBQyxDQUFHLEVBQUEsU0FBQSxLQUFjLEdBQUcsU0FBUyxFQUFBO0FBV3BGLE1BQU0sNEJBQ1gsR0FBQSxDQUFDLFVBQXFELEtBQUEsQ0FBQyxJQUFrRCxLQUFBO0FBQ3ZHLEVBQUEsT0FBTyxJQUFLLENBQUEsSUFBQTtBQUFBLElBQ1YsUUFBUyxDQUFBLENBQUMsQ0FBQyxPQUFBLEVBQUEsR0FBWSxXQUFXLENBQU0sS0FBQTtBQUN0QyxNQUFBLE1BQU0sb0JBQXVCLEdBQUEsV0FBQSxDQUFZLE9BQVEsQ0FBQSxDQUFDLENBQU0sS0FBQTtBQXBCaEUsUUFBQSxJQUFBLEVBQUEsRUFBQSxFQUFBLENBQUE7QUFxQlUsUUFBTyxPQUFBLENBQUEsRUFBQSxHQUFBLENBQUEsRUFBQSxHQUFBLFVBQUEsQ0FBVyxHQUFJLENBQUEsQ0FBQSxDQUFFLE9BQVMsQ0FBQSxTQUFTLENBQW5DLEtBQUEsSUFBQSxHQUFBLEtBQUEsQ0FBQSxHQUFBLEVBQUEsQ0FBdUMsT0FBUyxFQUFBLENBQUEsQ0FBQSxLQUFoRCxJQUFzRCxHQUFBLEVBQUEsR0FBQSxFQUFBLENBQUcsQ0FBQyxDQUFBLENBQUE7QUFBQSxPQUNsRSxDQUFBLENBQUE7QUFDRCxNQUFBLE9BQU8sU0FBUyxDQUFDLEVBQUEsQ0FBRyxPQUFPLENBQUcsRUFBQSxHQUFHLG9CQUFvQixDQUFDLENBQUEsQ0FBQTtBQUFBLEtBQ3ZELENBQUE7QUFBQSxJQUNELEdBQUksQ0FBQSxDQUFDLENBQUMsT0FBQSxFQUFBLEdBQVksb0JBQW9CLENBQUcsS0FBQTtBQXpCL0MsTUFBQSxJQUFBLEVBQUEsQ0FBQTtBQXlCbUQsTUFBQSxPQUFBLGFBQUEsQ0FBQSxjQUFBLENBQUEsRUFBQSxFQUN4QyxPQUR3QyxDQUFBLEVBQUE7QUFBQSxRQUUzQyxNQUFRLEVBQUEsQ0FBQyxHQUFHLE9BQUEsQ0FBUSxNQUFRLEVBQUEsR0FBRyxvQkFBcUIsQ0FBQSxPQUFBLENBQVEsQ0FBQyxDQUFBLEtBQU0sQ0FBRSxDQUFBLE1BQU0sQ0FBQyxDQUFBO0FBQUEsUUFDNUUsV0FBYSxFQUFBLENBQUMsR0FBSSxDQUFBLEVBQUEsR0FBQSxPQUFBLENBQVEsV0FBUixLQUFBLElBQUEsR0FBQSxFQUFBLEdBQXVCLEVBQUMsRUFBSSxHQUFHLG9CQUFBLENBQXFCLE9BQVEsQ0FBQSxDQUFDLENBQUcsS0FBQTtBQTVCMUYsVUFBQUEsSUFBQUEsR0FBQUEsQ0FBQUE7QUE0QjZGLFVBQUEsT0FBQSxDQUFBQSxHQUFBLEdBQUEsQ0FBQSxDQUFFLFdBQUYsS0FBQSxJQUFBLEdBQUFBLE1BQWlCLEVBQUMsQ0FBQTtBQUFBLFNBQUMsQ0FBQyxDQUFBO0FBQUEsT0FDM0csQ0FBQSxDQUFBO0FBQUEsS0FBRSxDQUFBO0FBQUEsR0FDSixDQUFBO0FBQ0Y7Ozs7In0=
@@ -0,0 +1,12 @@
1
+ import { isDataRequestEnricher } from '../core/types.js';
2
+
3
+ function getEnrichedDataRequest(sourceRunner) {
4
+ const root = sourceRunner.getRoot();
5
+ if (isDataRequestEnricher(root)) {
6
+ return root.enrichDataRequest(sourceRunner);
7
+ }
8
+ return null;
9
+ }
10
+
11
+ export { getEnrichedDataRequest };
12
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0RW5yaWNoZWREYXRhUmVxdWVzdC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3F1ZXJ5aW5nL2dldEVucmljaGVkRGF0YVJlcXVlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVF1ZXJ5UmVxdWVzdCB9IGZyb20gJ0BncmFmYW5hL2RhdGEnO1xuaW1wb3J0IHsgaXNEYXRhUmVxdWVzdEVucmljaGVyLCBTY2VuZU9iamVjdCB9IGZyb20gJy4uL2NvcmUvdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW5yaWNoZWREYXRhUmVxdWVzdChzb3VyY2VSdW5uZXI6IFNjZW5lT2JqZWN0KTogUGFydGlhbDxEYXRhUXVlcnlSZXF1ZXN0PiB8IG51bGwge1xuICBjb25zdCByb290ID0gc291cmNlUnVubmVyLmdldFJvb3QoKTtcblxuICBpZiAoaXNEYXRhUmVxdWVzdEVucmljaGVyKHJvb3QpKSB7XG4gICAgcmV0dXJuIHJvb3QuZW5yaWNoRGF0YVJlcXVlc3Qoc291cmNlUnVubmVyKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR08sU0FBUyx1QkFBdUIsWUFBNkQsRUFBQTtBQUNsRyxFQUFNLE1BQUEsSUFBQSxHQUFPLGFBQWEsT0FBUSxFQUFBLENBQUE7QUFFbEMsRUFBSSxJQUFBLHFCQUFBLENBQXNCLElBQUksQ0FBRyxFQUFBO0FBQy9CLElBQU8sT0FBQSxJQUFBLENBQUssa0JBQWtCLFlBQVksQ0FBQSxDQUFBO0FBQUEsR0FDNUM7QUFFQSxFQUFPLE9BQUEsSUFBQSxDQUFBO0FBQ1Q7Ozs7In0=