@grafana/scenes 8.12.1 → 8.13.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.
- package/CHANGELOG.md +12 -0
- package/dist/esm/querying/SceneQueryRunner.js +1 -28
- package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
- package/dist/esm/variables/datasourceVariableRef.js +51 -0
- package/dist/esm/variables/datasourceVariableRef.js.map +1 -0
- package/dist/esm/variables/variants/query/QueryVariable.js +72 -58
- package/dist/esm/variables/variants/query/QueryVariable.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +107 -75
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
# v8.13.0 (Mon Jul 13 2026)
|
|
2
|
+
|
|
3
|
+
#### 🚀 Enhancement
|
|
4
|
+
|
|
5
|
+
- QueryVariable: fan out metric-find across multi-value datasource variables [#1573](https://github.com/grafana/scenes/pull/1573) ([@harisrozajac](https://github.com/harisrozajac))
|
|
6
|
+
|
|
7
|
+
#### Authors: 1
|
|
8
|
+
|
|
9
|
+
- Haris Rozajac ([@harisrozajac](https://github.com/harisrozajac))
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
1
13
|
# v8.12.1 (Mon Jul 13 2026)
|
|
2
14
|
|
|
3
15
|
#### 🐛 Bug Fix
|
|
@@ -23,6 +23,7 @@ import { DataLayersMerger } from './DataLayersMerger.js';
|
|
|
23
23
|
import { interpolate } from '../core/sceneGraph/sceneGraph.js';
|
|
24
24
|
import { wrapInSafeSerializableSceneObject } from '../utils/wrapInSafeSerializableSceneObject.js';
|
|
25
25
|
import { DrilldownDependenciesManager } from '../variables/DrilldownDependenciesManager.js';
|
|
26
|
+
import { getSimpleVariableNameFromDatasourceUid, getDatasourceVariableSelectionCount } from '../variables/datasourceVariableRef.js';
|
|
26
27
|
|
|
27
28
|
let counter$1 = 100;
|
|
28
29
|
const MIXED_DATASOURCE_UID = "-- Mixed --";
|
|
@@ -39,34 +40,6 @@ function isTemplatedDatasourceUid(uid) {
|
|
|
39
40
|
function isTemplatedDatasourceRef(datasource) {
|
|
40
41
|
return isTemplatedDatasourceUid(datasource == null ? void 0 : datasource.uid);
|
|
41
42
|
}
|
|
42
|
-
function getSimpleVariableNameFromDatasourceUid(uid) {
|
|
43
|
-
if (!uid) {
|
|
44
|
-
return void 0;
|
|
45
|
-
}
|
|
46
|
-
const shortMatch = uid.match(/^\$([A-Za-z0-9_]+)$/);
|
|
47
|
-
if (shortMatch) {
|
|
48
|
-
return shortMatch[1];
|
|
49
|
-
}
|
|
50
|
-
const bracketMatch = uid.match(/^\$\{([A-Za-z0-9_]+)\}$/);
|
|
51
|
-
if (bracketMatch) {
|
|
52
|
-
return bracketMatch[1];
|
|
53
|
-
}
|
|
54
|
-
return void 0;
|
|
55
|
-
}
|
|
56
|
-
function getDatasourceVariableSelectionCount(sceneObject, variableName) {
|
|
57
|
-
const variable = sceneGraph.lookupVariable(variableName, sceneObject);
|
|
58
|
-
if (!variable) {
|
|
59
|
-
return void 0;
|
|
60
|
-
}
|
|
61
|
-
const value = variable.getValue();
|
|
62
|
-
if (Array.isArray(value)) {
|
|
63
|
-
return value.filter((item) => item !== "default").length;
|
|
64
|
-
}
|
|
65
|
-
if (value === null || value === void 0) {
|
|
66
|
-
return void 0;
|
|
67
|
-
}
|
|
68
|
-
return value === "default" ? 0 : 1;
|
|
69
|
-
}
|
|
70
43
|
function shouldUseMixedRuntimeDatasource(sceneObject, datasource, queries) {
|
|
71
44
|
const refs = [datasource, ...queries.map((query) => query.datasource)];
|
|
72
45
|
for (const ref of refs) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneQueryRunner.js","sources":["../../../src/querying/SceneQueryRunner.ts"],"sourcesContent":["import { cloneDeep, isEqual } from 'lodash';\nimport { combineLatest, ReplaySubject, Unsubscribable } from 'rxjs';\n\nimport { DataQuery, DataSourceRef, LoadingState } from '@grafana/schema';\n\nimport {\n AlertStateInfo,\n compareArrayValues,\n DataFrame,\n DataFrameView,\n DataQueryRequest,\n DataSourceApi,\n DataTopic,\n PanelData,\n preProcessPanelData,\n rangeUtil,\n} from '@grafana/data';\n\n// TODO: Remove this ignore annotation when the grafana runtime dependency has been updated\n// @ts-ignore\nimport { config, getRunRequest, isExpressionReference, toDataQueryError } from '@grafana/runtime';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport {\n DataLayerFilter,\n SceneDataProvider,\n SceneDataProviderResult,\n SceneDataQuery,\n SceneObjectState,\n SceneTimeRangeLike,\n} from '../core/types';\nimport { getDataSource } from '../utils/getDataSource';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { VariableValueRecorder } from '../variables/VariableValueRecorder';\nimport { emptyPanelData } from '../core/SceneDataNode';\nimport { getClosest } from '../core/sceneGraph/utils';\nimport { ExtraQueryDataProcessor, ExtraQueryProvider, isExtraQueryProvider } from './ExtraQueryProvider';\nimport { extraQueryProcessingOperator, passthroughProcessor } from './extraQueryProcessingOperator';\nimport { filterAnnotations } from './layers/annotations/filterAnnotations';\nimport { getEnrichedDataRequest } from './getEnrichedDataRequest';\nimport { QueryProfilerLike, registerQueryWithController } from './registerQueryWithController';\nimport { findPanelProfiler } from '../utils/findPanelProfiler';\nimport { AdHocFiltersVariable } from '../variables/adhoc/AdHocFiltersVariable';\nimport { GroupByVariable } from '../variables/groupby/GroupByVariable';\nimport { SceneVariable } from '../variables/types';\nimport { DataLayersMerger } from './DataLayersMerger';\nimport { interpolate } from '../core/sceneGraph/sceneGraph';\nimport { wrapInSafeSerializableSceneObject } from '../utils/wrapInSafeSerializableSceneObject';\nimport { DrilldownDependenciesManager } from '../variables/DrilldownDependenciesManager';\n\nlet counter = 100;\nconst MIXED_DATASOURCE_UID = '-- Mixed --';\nconst MIXED_DATASOURCE_REF: DataSourceRef = { type: 'mixed', uid: MIXED_DATASOURCE_UID };\n\nexport function getNextRequestId(prefix = 'SQR') {\n return prefix + counter++;\n}\n\nexport interface QueryRunnerState extends SceneObjectState {\n data?: PanelData;\n queries: SceneDataQuery[];\n datasource?: DataSourceRef;\n minInterval?: string;\n maxDataPoints?: number;\n liveStreaming?: boolean;\n maxDataPointsFromWidth?: boolean;\n cacheTimeout?: DataQueryRequest['cacheTimeout'];\n queryCachingTTL?: DataQueryRequest['queryCachingTTL'];\n /**\n * When set to auto (the default) query runner will issue queries on activate (when variable dependencies are ready) or when time range change.\n * Set to manual to have full manual control over when queries are issued. Try not to set this. This is mainly useful for unit tests, or special edge case workflows.\n */\n runQueriesMode?: 'auto' | 'manual';\n // Filters to be applied to data layer results before combining them with SQR results\n dataLayerFilter?: DataLayerFilter;\n /**\n * Optional prefix for the requestId. When set, request IDs will be formatted as `{requestIdPrefix}{counter}`.\n * Useful for identifying requests from specific panels or components.\n */\n requestIdPrefix?: string;\n // Private runtime state\n _hasFetchedData?: boolean;\n}\n\nfunction isTemplatedDatasourceUid(uid: string | undefined): boolean {\n if (!uid) {\n return false;\n }\n\n // Detect any variable template usage in a datasource UID so we can evaluate runtime fan-out.\n return /^(?:\\$[A-Za-z0-9_]+|\\$\\{[^}]+\\})/.test(uid);\n}\n\nfunction isTemplatedDatasourceRef(datasource: DataSourceRef | null | undefined): boolean {\n return isTemplatedDatasourceUid(datasource?.uid);\n}\n\nfunction getSimpleVariableNameFromDatasourceUid(uid: string | undefined): string | undefined {\n if (!uid) {\n return undefined;\n }\n const shortMatch = uid.match(/^\\$([A-Za-z0-9_]+)$/);\n if (shortMatch) {\n return shortMatch[1];\n }\n\n const bracketMatch = uid.match(/^\\$\\{([A-Za-z0-9_]+)\\}$/);\n if (bracketMatch) {\n return bracketMatch[1];\n }\n\n return undefined;\n}\n\nfunction getDatasourceVariableSelectionCount(sceneObject: SceneQueryRunner, variableName: string): number | undefined {\n const variable = sceneGraph.lookupVariable(variableName, sceneObject);\n if (!variable) {\n return undefined;\n }\n\n const value = variable.getValue();\n if (Array.isArray(value)) {\n return value.filter((item) => item !== 'default').length;\n }\n\n if (value === null || value === undefined) {\n return undefined;\n }\n\n return value === 'default' ? 0 : 1;\n}\n\nfunction shouldUseMixedRuntimeDatasource(\n sceneObject: SceneQueryRunner,\n datasource: DataSourceRef | null | undefined,\n queries: SceneDataQuery[]\n) {\n // Check both panel datasource and per-query datasources.\n const refs: Array<DataSourceRef | null | undefined> = [datasource, ...queries.map((query) => query.datasource)];\n\n for (const ref of refs) {\n const uid = ref?.uid;\n if (!uid) {\n continue;\n }\n\n const variableName = getSimpleVariableNameFromDatasourceUid(uid);\n if (variableName) {\n const selectionCount = getDatasourceVariableSelectionCount(sceneObject, variableName);\n\n if (selectionCount !== undefined && selectionCount > 1) {\n return true;\n }\n\n continue;\n }\n }\n\n return false;\n}\n\nfunction parseRefsFromMathExpression(input: string): string[] {\n const bracket = /\\$\\{([A-Za-z0-9_ ]+?)\\}/gm;\n const simple = /\\$([A-Za-z0-9_]+)/gm;\n const found = new Set<string>();\n let match: RegExpExecArray | null;\n while ((match = bracket.exec(input)) !== null) {\n found.add(match[1]);\n }\n while ((match = simple.exec(input)) !== null) {\n found.add(match[1]);\n }\n return Array.from(found);\n}\n\n// Returns the refIds a server-side expression query depends on.\nfunction getExpressionReferences(query: DataQueryExtended): string[] {\n const { type, expression, conditions } = query;\n if (type === 'math' || type === 'sql') {\n return parseRefsFromMathExpression(expression ?? '');\n }\n if (type === 'classic_conditions') {\n return (conditions ?? [])\n .map((condition: { query?: { params?: string[] } }) => condition.query?.params?.[0])\n .filter((refId: string | undefined): refId is string => Boolean(refId));\n }\n // reduce / resample / threshold: the whole `expression` is a single refId\n return expression ? [expression] : [];\n}\n\n// Renames the refIds a server-side expression references, according to renameMap.\nfunction rewriteExpressionReferences(query: DataQueryExtended, renameMap: Record<string, string>): void {\n const { type } = query;\n if (type === 'math' || type === 'sql') {\n let expression: string = query.expression ?? '';\n for (const oldRef of Object.keys(renameMap)) {\n const pattern = new RegExp('(\\\\$' + oldRef + '\\\\b)|(\\\\$\\\\{' + oldRef + '\\\\})', 'gm');\n expression = expression.replace(pattern, '${' + renameMap[oldRef] + '}');\n }\n query.expression = expression;\n } else if (type === 'classic_conditions') {\n (query.conditions ?? []).forEach((condition: { query?: { params?: string[] } }) => {\n const params = condition.query?.params;\n if (params && params[0] && renameMap[params[0]]) {\n params[0] = renameMap[params[0]];\n }\n });\n } else if (query.expression && renameMap[query.expression]) {\n query.expression = renameMap[query.expression];\n }\n}\n\n/**\n * When a data query using a multi-value datasource variable feeds a server-side expression, the\n * whole graph must be evaluated once per selected datasource. We fan out by cloning the data query\n * (pinned to a concrete datasource) and its dependent expression subgraph once per selected value,\n * rewriting refIds so each replica is self-contained. Queries and expressions that do not depend on\n * the multi-value variable are left untouched (they run once).\n *\n * Only a single multi-value datasource variable shared by the data queries is supported.\n */\nfunction expandExpressionFanOut(sceneObject: SceneQueryRunner, targets: DataQueryExtended[]): DataQueryExtended[] {\n const isExpression = (query: DataQueryExtended) =>\n Boolean(isExpressionReference && isExpressionReference(query.datasource));\n\n if (!targets.some(isExpression)) {\n return targets;\n }\n\n // Find the multi-value datasource variable used by a data query (if any).\n let variableName: string | undefined;\n let uids: string[] | undefined;\n for (const target of targets) {\n if (isExpression(target)) {\n continue;\n }\n const candidate = getSimpleVariableNameFromDatasourceUid(target.datasource?.uid);\n if (!candidate) {\n continue;\n }\n const value = sceneGraph.lookupVariable(candidate, sceneObject)?.getValue();\n if (Array.isArray(value)) {\n const selected = value.filter((item) => item !== 'default').map(String);\n if (selected.length > 1) {\n variableName = candidate;\n uids = selected;\n break;\n }\n }\n }\n\n if (!variableName || !uids) {\n return targets;\n }\n\n // Data queries using the multi-value variable are the fan-out roots.\n const fannedRootRefIds = new Set<string>();\n for (const target of targets) {\n if (!isExpression(target) && getSimpleVariableNameFromDatasourceUid(target.datasource?.uid) === variableName) {\n fannedRootRefIds.add(target.refId);\n }\n }\n\n // Transitive closure of expressions that (transitively) depend on a fan-out root.\n const dependentRefIds = new Set<string>(fannedRootRefIds);\n let changed = true;\n while (changed) {\n changed = false;\n for (const target of targets) {\n if (!isExpression(target) || dependentRefIds.has(target.refId)) {\n continue;\n }\n if (getExpressionReferences(target).some((refId) => dependentRefIds.has(refId))) {\n dependentRefIds.add(target.refId);\n changed = true;\n }\n }\n }\n\n const expanded: DataQueryExtended[] = targets.filter((target) => !dependentRefIds.has(target.refId));\n const toFanOut = targets.filter((target) => dependentRefIds.has(target.refId));\n\n uids.forEach((uid, index) => {\n const renameMap: Record<string, string> = {};\n for (const target of toFanOut) {\n renameMap[target.refId] = `${target.refId}_${index}`;\n }\n for (const target of toFanOut) {\n const clone = cloneDeep(target);\n clone.refId = renameMap[target.refId];\n if (fannedRootRefIds.has(target.refId)) {\n clone.datasource = { ...clone.datasource, uid };\n } else {\n rewriteExpressionReferences(clone, renameMap);\n }\n expanded.push(clone);\n }\n });\n\n return expanded;\n}\n\nexport interface DataQueryExtended extends DataQuery {\n [key: string]: any;\n\n // Opt this query out of time window comparison\n timeRangeCompare?: boolean;\n}\n\n// The requests that will be run by the query runner.\n//\n// Generally the query runner will run a single primary request.\n// If the scene graph contains implementations of\n// `ExtraQueryProvider`, the requests created by these\n// implementations will be added to the list of secondary requests,\n// and these will be executed at the same time as the primary request.\n//\n// The results of each secondary request will be passed to an associated\n// processor function (along with the results of the primary request),\n// which can transform the results as desired.\ninterface PreparedRequests {\n // The primary request to run.\n primary: DataQueryRequest;\n // A possibly empty list of secondary requests to run alongside\n // the primary request.\n secondaries: DataQueryRequest[];\n // A map from `requestId` of secondary requests to processors\n // for those requests. Provided by the `ExtraQueryProvider`.\n processors: Map<string, ExtraQueryDataProcessor>;\n}\n\nexport class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> implements SceneDataProvider {\n private _querySub?: Unsubscribable;\n private _dataLayersSub?: Unsubscribable;\n private _dataLayersMerger = new DataLayersMerger();\n private _timeSub?: Unsubscribable;\n private _timeSubRange?: SceneTimeRangeLike;\n private _containerWidth?: number;\n private _variableValueRecorder = new VariableValueRecorder();\n private _results = new ReplaySubject<SceneDataProviderResult>(1);\n private _scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };\n private _layerAnnotations?: DataFrame[];\n private _resultAnnotations?: DataFrame[];\n private _isInView = true;\n private _bypassIsInView = false;\n private _queryNotExecutedWhenOutOfView = false;\n\n public getResultsStream() {\n return this._results;\n }\n\n protected _variableDependency: VariableDependencyConfig<QueryRunnerState> = new VariableDependencyConfig(this, {\n statePaths: ['queries', 'datasource', 'minInterval'],\n onVariableUpdateCompleted: this.onVariableUpdatesCompleted.bind(this),\n onAnyVariableChanged: this.onAnyVariableChanged.bind(this),\n dependsOnScopes: true,\n });\n\n private _drilldownDependenciesManager: DrilldownDependenciesManager<QueryRunnerState> =\n new DrilldownDependenciesManager(this._variableDependency);\n\n public constructor(initialState: QueryRunnerState) {\n super(initialState);\n\n this.addActivationHandler(() => this._onActivate());\n }\n\n private _onActivate() {\n if (this.isQueryModeAuto()) {\n const timeRange = sceneGraph.getTimeRange(this);\n\n // Add subscriptions to any extra providers so that they rerun queries\n // when their state changes and they should rerun.\n const providers = this.getClosestExtraQueryProviders();\n for (const provider of providers) {\n this._subs.add(\n provider.subscribeToState((n, p) => {\n if (provider.shouldRerun(p, n, this.state.queries)) {\n this.runQueries();\n }\n })\n );\n }\n\n this.subscribeToTimeRangeChanges(timeRange);\n\n if (this.shouldRunQueriesOnActivate()) {\n this.runQueries();\n }\n }\n\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n return () => this._onDeactivate();\n }\n\n // This method subscribes to all SceneDataLayers up until the root, and combines the results into data provided from SceneQueryRunner\n private _handleDataLayers() {\n const dataLayers = sceneGraph.getDataLayers(this);\n\n if (dataLayers.length === 0) {\n return;\n }\n\n this._dataLayersSub = this._dataLayersMerger\n .getMergedStream(dataLayers)\n .subscribe(this._onLayersReceived.bind(this));\n }\n\n private _onLayersReceived(results: Iterable<SceneDataProviderResult>) {\n const timeRange = sceneGraph.getTimeRange(this);\n const { dataLayerFilter } = this.state;\n\n let annotations: DataFrame[] = [];\n let alertStates: DataFrame[] = [];\n let alertState: AlertStateInfo | undefined;\n\n for (const result of results) {\n for (let frame of result.data.series) {\n if (frame.meta?.dataTopic === DataTopic.Annotations) {\n annotations = annotations.concat(frame);\n }\n if (frame.meta?.dataTopic === DataTopic.AlertStates) {\n alertStates = alertStates.concat(frame);\n }\n }\n }\n\n if (dataLayerFilter?.panelId) {\n if (annotations.length > 0) {\n annotations = filterAnnotations(annotations, dataLayerFilter);\n }\n\n if (alertStates.length > 0) {\n for (const frame of alertStates) {\n const frameView = new DataFrameView<AlertStateInfo>(frame);\n\n for (const row of frameView) {\n if (row.panelId === dataLayerFilter.panelId) {\n alertState = row;\n break;\n }\n }\n }\n }\n }\n\n // Skip unnessary state updates\n if (\n allFramesEmpty(annotations) &&\n allFramesEmpty(this._layerAnnotations) &&\n isEqual(alertState, this.state.data?.alertState)\n ) {\n return;\n }\n\n this._layerAnnotations = annotations;\n\n const baseStateUpdate = this.state.data ? this.state.data : { ...emptyPanelData, timeRange: timeRange.state.value };\n\n this.setState({\n data: {\n ...baseStateUpdate,\n annotations: [...(this._resultAnnotations ?? []), ...annotations],\n alertState: alertState ?? this.state.data?.alertState,\n },\n });\n }\n\n /**\n * This tries to start a new query whenever a variable completes or is changed.\n *\n * We care about variable update completions even when the variable has not changed and even when it is not a direct dependency.\n * Example: Variables A and B (B depends on A). A update depends on time range. So when time change query runner will\n * find that variable A is loading which is a dependency on of variable B so will set _isWaitingForVariables to true and\n * not issue any query.\n *\n * When A completes it's loading (with no value change, so B never updates) it will cause a call of this function letting\n * the query runner know that A has completed, and in case _isWaitingForVariables we try to run the query. The query will\n * only run if all variables are in a non loading state so in other scenarios where a query depends on many variables this will\n * be called many times until all dependencies are in a non loading state. *\n */\n private onVariableUpdatesCompleted() {\n if (this.isQueryModeAuto()) {\n this.runQueries();\n }\n }\n\n /**\n * Check if value changed is an adhoc filter or group by variable that did not exist when we issued the last query\n */\n private onAnyVariableChanged(variable: SceneVariable) {\n if (\n this._drilldownDependenciesManager.adHocFiltersVar === variable ||\n this._drilldownDependenciesManager.groupByVar === variable ||\n !this.isQueryModeAuto()\n ) {\n return;\n }\n\n if (variable instanceof AdHocFiltersVariable && this._isRelevantAutoVariable(variable)) {\n this.runQueries();\n }\n\n if (variable instanceof GroupByVariable && this._isRelevantAutoVariable(variable)) {\n this.runQueries();\n }\n }\n\n private _isRelevantAutoVariable(variable: AdHocFiltersVariable | GroupByVariable) {\n const datasource = this.state.datasource ?? findFirstDatasource(this.state.queries);\n return variable.state.applyMode === 'auto' && datasource?.uid === variable.state.datasource?.uid;\n }\n\n private shouldRunQueriesOnActivate() {\n if (this._variableValueRecorder.hasDependenciesChanged(this)) {\n writeSceneLog(\n 'SceneQueryRunner',\n 'Variable dependency changed while inactive, shouldRunQueriesOnActivate returns true'\n );\n return true;\n }\n\n // If we don't have any data we should run queries\n if (!this.state.data) {\n return true;\n }\n\n // If time range is stale / different we should run queries\n if (this._isDataTimeRangeStale(this.state.data)) {\n return true;\n }\n\n return false;\n }\n\n private _isDataTimeRangeStale(data: PanelData) {\n const timeRange = sceneGraph.getTimeRange(this);\n\n const stateTimeRange = timeRange.state.value;\n const dataTimeRange = data.timeRange;\n\n if (\n stateTimeRange.from.unix() === dataTimeRange.from.unix() &&\n stateTimeRange.to.unix() === dataTimeRange.to.unix()\n ) {\n return false;\n }\n writeSceneLog('SceneQueryRunner', 'Data time range is stale');\n return true;\n }\n\n private _onDeactivate(): void {\n if (this._querySub) {\n this._querySub.unsubscribe();\n this._querySub = undefined;\n }\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n this._timeSub?.unsubscribe();\n this._timeSub = undefined;\n this._timeSubRange = undefined;\n\n // Reset data to its initial state unless it reached a terminal state (Done or Error).\n // Incomplete data is discarded so reactivation starts with a clean state.\n if (this.state.data && ![LoadingState.Done, LoadingState.Error].includes(this.state.data.state)) {\n this.setState({ data: undefined });\n }\n\n this._drilldownDependenciesManager.cleanup();\n }\n\n public setContainerWidth(width: number) {\n // If we don't have a width we should run queries\n if (!this._containerWidth && width > 0) {\n this._containerWidth = width;\n\n // If we don't have maxDataPoints specifically set and maxDataPointsFromWidth is true\n if (this.state.maxDataPointsFromWidth && !this.state.maxDataPoints) {\n // As this is called from render path we need to wait for next tick before running queries\n setTimeout(() => {\n if (this.isActive && !this.state._hasFetchedData) {\n this.runQueries();\n }\n }, 0);\n }\n } else {\n // if the updated container width is bigger than 0 let's remember the width until next query issue\n if (width > 0) {\n this._containerWidth = width;\n }\n }\n }\n\n public isDataReadyToDisplay() {\n return Boolean(this.state._hasFetchedData);\n }\n\n private subscribeToTimeRangeChanges(timeRange: SceneTimeRangeLike) {\n if (this._timeSubRange === timeRange) {\n // Nothing to do, already subscribed\n return;\n }\n\n if (this._timeSub) {\n this._timeSub.unsubscribe();\n }\n\n this._timeSubRange = timeRange;\n this._timeSub = timeRange.subscribeToState(() => {\n // setTimeout to let SceneVariableSet also respond to time range change\n // So that variables that depend on time range have time to switch to loading state\n setTimeout(() => this.runWithTimeRange(timeRange), 0);\n });\n }\n\n public runQueries() {\n const timeRange = sceneGraph.getTimeRange(this);\n\n if (this.isQueryModeAuto()) {\n this.subscribeToTimeRangeChanges(timeRange);\n }\n\n this.runWithTimeRange(timeRange);\n }\n\n private getMaxDataPoints() {\n if (this.state.maxDataPoints) {\n return this.state.maxDataPoints;\n }\n\n return this.state.maxDataPointsFromWidth ? this._containerWidth ?? 500 : 500;\n }\n\n public cancelQuery() {\n this._querySub?.unsubscribe();\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n this.setState({\n data: { ...(this.state.data ?? emptyPanelData), state: LoadingState.Done },\n });\n }\n\n private async runWithTimeRange(timeRange: SceneTimeRangeLike) {\n // If no maxDataPoints specified we might need to wait for container width to be set from the outside\n if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {\n return;\n }\n\n if (this.isQueryModeAuto() && !this._isInView && !this._bypassIsInView) {\n this._queryNotExecutedWhenOutOfView = true;\n return;\n }\n\n this._queryNotExecutedWhenOutOfView = false;\n\n // If data layers subscription doesn't exist, create one\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n // Cancel any running queries\n this._querySub?.unsubscribe();\n\n // Skip executing queries if variable dependency is in loading state\n if (this._variableDependency.hasDependencyInLoadingState()) {\n writeSceneLog('SceneQueryRunner', 'Variable dependency is in loading state, skipping query execution');\n this.setState({ data: { ...(this.state.data ?? emptyPanelData), state: LoadingState.Loading } });\n return;\n }\n\n this._variableValueRecorder.recordCurrentDependencyValuesForSceneObject(this);\n\n const { queries } = this.state;\n\n // Simple path when no queries exist\n if (!queries?.length) {\n this._setNoDataState();\n return;\n }\n\n try {\n const datasource = this.state.datasource ?? findFirstDatasource(queries);\n const runtimeDatasource = shouldUseMixedRuntimeDatasource(this, datasource, queries)\n ? MIXED_DATASOURCE_REF\n : datasource;\n const ds = await getDataSource(runtimeDatasource, this._scopedVars);\n\n this._drilldownDependenciesManager.findAndSubscribeToDrilldowns(ds.uid, this);\n\n const runRequest = getRunRequest();\n const { primary, secondaries, processors } = this.prepareRequests(timeRange, ds);\n\n writeSceneLog('SceneQueryRunner', 'Starting runRequest', this.state.key);\n\n let stream = runRequest(ds, primary);\n\n if (secondaries.length > 0) {\n // Submit all secondary requests in parallel.\n const secondaryStreams = secondaries.map((r) => runRequest(ds, r));\n // Create the rxjs operator which will combine the primary and secondary responses\n // by calling the correct processor functions provided by the\n // extra request providers.\n const op = extraQueryProcessingOperator(processors);\n // Combine the primary and secondary streams into a single stream, and apply the operator.\n // Use combineLatest so intermediate loading/error states from the primary and secondary requests are emitted as\n // they arrive, instead of only a single combined emission once every request has completed.\n stream = combineLatest([stream, ...secondaryStreams]).pipe(op);\n }\n\n const panelProfiler: QueryProfilerLike | undefined = findPanelProfiler(this);\n\n stream = stream.pipe(\n registerQueryWithController(\n {\n type: 'SceneQueryRunner/runQueries',\n request: primary,\n origin: this,\n cancel: () => this.cancelQuery(),\n },\n panelProfiler\n )\n );\n\n this._querySub = stream.subscribe(this.onDataReceived);\n } catch (err) {\n console.error('PanelQueryRunner Error', err);\n\n this.onDataReceived({\n ...emptyPanelData,\n ...this.state.data,\n state: LoadingState.Error,\n errors: [toDataQueryError(err)],\n });\n }\n }\n\n public clone(withState?: Partial<QueryRunnerState>) {\n const clone = super.clone(withState);\n\n if (this._resultAnnotations) {\n clone['_resultAnnotations'] = this._resultAnnotations.map((frame) => ({ ...frame }));\n }\n\n if (this._layerAnnotations) {\n clone['_layerAnnotations'] = this._layerAnnotations.map((frame) => ({ ...frame }));\n }\n\n clone['_variableValueRecorder'] = this._variableValueRecorder.cloneAndRecordCurrentValuesForSceneObject(this);\n clone['_containerWidth'] = this._containerWidth;\n clone['_results'].next({ origin: this, data: this.state.data ?? emptyPanelData });\n\n return clone;\n }\n\n private prepareRequests(timeRange: SceneTimeRangeLike, ds: DataSourceApi): PreparedRequests {\n const { minInterval, queries, requestIdPrefix } = this.state;\n\n let request: DataQueryRequest<DataQueryExtended> = {\n app: 'scenes',\n requestId: getNextRequestId(requestIdPrefix),\n timezone: timeRange.getTimeZone(),\n range: timeRange.state.value,\n interval: '1s',\n intervalMs: 1000,\n targets: cloneDeep(queries),\n maxDataPoints: this.getMaxDataPoints(),\n scopedVars: this._scopedVars,\n startTime: Date.now(),\n liveStreaming: this.state.liveStreaming,\n rangeRaw: {\n from: timeRange.state.from,\n to: timeRange.state.to,\n },\n cacheTimeout: this.state.cacheTimeout,\n queryCachingTTL: this.state.queryCachingTTL,\n scopes: sceneGraph.getScopes(this),\n // This asks the scene root to provide context properties like app, panel and dashboardUID\n ...getEnrichedDataRequest(this),\n };\n\n const filters = this._drilldownDependenciesManager.getFilters();\n const groupByKeys = this._drilldownDependenciesManager.getGroupByKeys();\n\n if (filters) {\n request.filters = filters;\n }\n\n if (groupByKeys) {\n request.groupByKeys = groupByKeys;\n }\n\n request.targets = request.targets.map((query) => {\n if (\n !query.datasource ||\n (query.datasource.uid !== ds.uid &&\n !ds.meta?.mixed &&\n isExpressionReference /* TODO: Remove this check when isExpressionReference is properly exported from grafan runtime */ &&\n !isExpressionReference(query.datasource))\n ) {\n if (!query.datasource && ds.meta?.mixed && isTemplatedDatasourceRef(this.state.datasource)) {\n query.datasource = this.state.datasource;\n } else {\n query.datasource = ds.getRef();\n }\n }\n return query;\n });\n\n request.targets = expandExpressionFanOut(this, request.targets);\n\n const lowerIntervalLimit = minInterval ? interpolate(this, minInterval) : ds.interval;\n const norm = rangeUtil.calculateInterval(timeRange.state.value, request.maxDataPoints!, lowerIntervalLimit);\n\n // make shallow copy of scoped vars,\n // and add built in variables interval and interval_ms\n request.scopedVars = Object.assign({}, request.scopedVars, {\n __interval: { text: norm.interval, value: norm.interval },\n __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs },\n });\n\n request.interval = norm.interval;\n request.intervalMs = norm.intervalMs;\n\n // If there are any extra request providers, we need to add a new request for each\n // and map the request's ID to the processor function given by the provider, to ensure that\n // the processor is called with the correct response data.\n const primaryTimeRange = timeRange.state.value;\n let secondaryRequests: DataQueryRequest[] = [];\n let secondaryProcessors = new Map();\n for (const provider of this.getClosestExtraQueryProviders() ?? []) {\n for (const { req, processor } of provider.getExtraQueries(request)) {\n const requestId = getNextRequestId(requestIdPrefix);\n secondaryRequests.push({ ...req, requestId });\n secondaryProcessors.set(requestId, processor ?? passthroughProcessor);\n }\n }\n request.range = primaryTimeRange;\n return { primary: request, secondaries: secondaryRequests, processors: secondaryProcessors };\n }\n\n private onDataReceived = (data: PanelData) => {\n const preProcessedData = preProcessPanelData(data, this.state.data);\n\n this._resultAnnotations = data.annotations;\n\n const dataWithLayersApplied = this._combineDataLayers(preProcessedData);\n\n const last = this.state.data;\n\n // Restore referential identity of series/annotations when frames haven't changed,\n // preventing panels from reprocessing unchanged data. Brings back logic that existed in PanelQueryRunner in core.\n if (last != null && dataWithLayersApplied.state !== LoadingState.Streaming) {\n const sameSeries = compareArrayValues(last.series ?? [], dataWithLayersApplied.series ?? [], (a, b) => a === b);\n const sameAnnotations = compareArrayValues(\n last.annotations ?? [],\n dataWithLayersApplied.annotations ?? [],\n (a, b) => a === b\n );\n const sameState = last.state === dataWithLayersApplied.state;\n const sameErrors = compareArrayValues(last.errors ?? [], dataWithLayersApplied.errors ?? [], (a, b) =>\n isEqual(a, b)\n );\n\n if (sameSeries) {\n dataWithLayersApplied.series = last.series;\n }\n\n if (sameAnnotations) {\n dataWithLayersApplied.annotations = last.annotations;\n }\n\n if (sameSeries && sameAnnotations && sameState && sameErrors) {\n if (last.request?.requestId === dataWithLayersApplied.request?.requestId) {\n return;\n }\n }\n }\n\n let hasFetchedData = this.state._hasFetchedData;\n\n if (!hasFetchedData && preProcessedData.state !== LoadingState.Loading) {\n hasFetchedData = true;\n }\n\n this.setState({ data: dataWithLayersApplied, _hasFetchedData: hasFetchedData });\n this._results.next({ origin: this, data: dataWithLayersApplied });\n };\n\n private _combineDataLayers(data: PanelData) {\n if (this._layerAnnotations && this._layerAnnotations.length > 0) {\n data.annotations = (data.annotations || []).concat(this._layerAnnotations);\n }\n\n if (this.state.data && this.state.data.alertState) {\n data.alertState = this.state.data.alertState;\n }\n\n return data;\n }\n\n private _setNoDataState() {\n if (this.state.data !== emptyPanelData) {\n this.setState({ data: emptyPanelData });\n }\n }\n\n /**\n * Walk up the scene graph and find any ExtraQueryProviders.\n *\n * This will return an array of the closest provider of each type.\n */\n private getClosestExtraQueryProviders(): Array<ExtraQueryProvider<any>> {\n // Maintain a map from provider constructor to provider object. The constructor\n // is used as a unique key for each class, to ensure we have no more than one\n // type of each type of provider.\n const found = new Map();\n if (!this.parent) {\n return [];\n }\n getClosest(this.parent, (s) => {\n if (isExtraQueryProvider(s) && !found.has(s.constructor)) {\n found.set(s.constructor, s);\n }\n s.forEachChild((child) => {\n if (isExtraQueryProvider(child) && !found.has(child.constructor)) {\n found.set(child.constructor, child);\n }\n });\n // Always return null so that the search continues to the top of\n // the scene graph.\n return null;\n });\n return Array.from(found.values());\n }\n\n private isQueryModeAuto(): boolean {\n return (this.state.runQueriesMode ?? 'auto') === 'auto';\n }\n\n public isInViewChanged(isInView: boolean): void {\n writeSceneLog('SceneQueryRunner', `isInViewChanged: ${isInView}`, this.state.key);\n this._isInView = isInView;\n\n if (isInView && this._queryNotExecutedWhenOutOfView) {\n this.runQueries();\n }\n }\n\n public bypassIsInViewChanged(bypassIsInView: boolean): void {\n writeSceneLog('SceneQueryRunner', `bypassIsInViewChanged: ${bypassIsInView}`, this.state.key);\n this._bypassIsInView = bypassIsInView;\n\n if (bypassIsInView && this._queryNotExecutedWhenOutOfView) {\n this.runQueries();\n }\n }\n}\n\nexport function findFirstDatasource(targets: DataQuery[]): DataSourceRef | undefined {\n return targets.find((t) => t.datasource !== null)?.datasource ?? undefined;\n}\n\nfunction allFramesEmpty(frames?: DataFrame[]) {\n if (!frames) {\n return true;\n }\n\n for (let i = 0; i < frames.length; i++) {\n if (frames[i].length > 0) {\n return false;\n }\n }\n\n return true;\n}\n"],"names":["counter","getNextRequestId","_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SceneQueryRunner.js","sources":["../../../src/querying/SceneQueryRunner.ts"],"sourcesContent":["import { cloneDeep, isEqual } from 'lodash';\nimport { combineLatest, ReplaySubject, Unsubscribable } from 'rxjs';\n\nimport { DataQuery, DataSourceRef, LoadingState } from '@grafana/schema';\n\nimport {\n AlertStateInfo,\n compareArrayValues,\n DataFrame,\n DataFrameView,\n DataQueryRequest,\n DataSourceApi,\n DataTopic,\n PanelData,\n preProcessPanelData,\n rangeUtil,\n} from '@grafana/data';\n\n// TODO: Remove this ignore annotation when the grafana runtime dependency has been updated\n// @ts-ignore\nimport { config, getRunRequest, isExpressionReference, toDataQueryError } from '@grafana/runtime';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport {\n DataLayerFilter,\n SceneDataProvider,\n SceneDataProviderResult,\n SceneDataQuery,\n SceneObjectState,\n SceneTimeRangeLike,\n} from '../core/types';\nimport { getDataSource } from '../utils/getDataSource';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { VariableValueRecorder } from '../variables/VariableValueRecorder';\nimport { emptyPanelData } from '../core/SceneDataNode';\nimport { getClosest } from '../core/sceneGraph/utils';\nimport { ExtraQueryDataProcessor, ExtraQueryProvider, isExtraQueryProvider } from './ExtraQueryProvider';\nimport { extraQueryProcessingOperator, passthroughProcessor } from './extraQueryProcessingOperator';\nimport { filterAnnotations } from './layers/annotations/filterAnnotations';\nimport { getEnrichedDataRequest } from './getEnrichedDataRequest';\nimport { QueryProfilerLike, registerQueryWithController } from './registerQueryWithController';\nimport { findPanelProfiler } from '../utils/findPanelProfiler';\nimport { AdHocFiltersVariable } from '../variables/adhoc/AdHocFiltersVariable';\nimport { GroupByVariable } from '../variables/groupby/GroupByVariable';\nimport { SceneVariable } from '../variables/types';\nimport { DataLayersMerger } from './DataLayersMerger';\nimport { interpolate } from '../core/sceneGraph/sceneGraph';\nimport { wrapInSafeSerializableSceneObject } from '../utils/wrapInSafeSerializableSceneObject';\nimport { DrilldownDependenciesManager } from '../variables/DrilldownDependenciesManager';\nimport {\n getDatasourceVariableSelectionCount,\n getSimpleVariableNameFromDatasourceUid,\n} from '../variables/datasourceVariableRef';\n\nlet counter = 100;\nconst MIXED_DATASOURCE_UID = '-- Mixed --';\nconst MIXED_DATASOURCE_REF: DataSourceRef = { type: 'mixed', uid: MIXED_DATASOURCE_UID };\n\nexport function getNextRequestId(prefix = 'SQR') {\n return prefix + counter++;\n}\n\nexport interface QueryRunnerState extends SceneObjectState {\n data?: PanelData;\n queries: SceneDataQuery[];\n datasource?: DataSourceRef;\n minInterval?: string;\n maxDataPoints?: number;\n liveStreaming?: boolean;\n maxDataPointsFromWidth?: boolean;\n cacheTimeout?: DataQueryRequest['cacheTimeout'];\n queryCachingTTL?: DataQueryRequest['queryCachingTTL'];\n /**\n * When set to auto (the default) query runner will issue queries on activate (when variable dependencies are ready) or when time range change.\n * Set to manual to have full manual control over when queries are issued. Try not to set this. This is mainly useful for unit tests, or special edge case workflows.\n */\n runQueriesMode?: 'auto' | 'manual';\n // Filters to be applied to data layer results before combining them with SQR results\n dataLayerFilter?: DataLayerFilter;\n /**\n * Optional prefix for the requestId. When set, request IDs will be formatted as `{requestIdPrefix}{counter}`.\n * Useful for identifying requests from specific panels or components.\n */\n requestIdPrefix?: string;\n // Private runtime state\n _hasFetchedData?: boolean;\n}\n\nfunction isTemplatedDatasourceUid(uid: string | undefined): boolean {\n if (!uid) {\n return false;\n }\n\n // Detect any variable template usage in a datasource UID so we can evaluate runtime fan-out.\n return /^(?:\\$[A-Za-z0-9_]+|\\$\\{[^}]+\\})/.test(uid);\n}\n\nfunction isTemplatedDatasourceRef(datasource: DataSourceRef | null | undefined): boolean {\n return isTemplatedDatasourceUid(datasource?.uid);\n}\n\nfunction shouldUseMixedRuntimeDatasource(\n sceneObject: SceneQueryRunner,\n datasource: DataSourceRef | null | undefined,\n queries: SceneDataQuery[]\n) {\n // Check both panel datasource and per-query datasources.\n const refs: Array<DataSourceRef | null | undefined> = [datasource, ...queries.map((query) => query.datasource)];\n\n for (const ref of refs) {\n const uid = ref?.uid;\n if (!uid) {\n continue;\n }\n\n const variableName = getSimpleVariableNameFromDatasourceUid(uid);\n if (variableName) {\n const selectionCount = getDatasourceVariableSelectionCount(sceneObject, variableName);\n\n if (selectionCount !== undefined && selectionCount > 1) {\n return true;\n }\n\n continue;\n }\n }\n\n return false;\n}\n\nfunction parseRefsFromMathExpression(input: string): string[] {\n const bracket = /\\$\\{([A-Za-z0-9_ ]+?)\\}/gm;\n const simple = /\\$([A-Za-z0-9_]+)/gm;\n const found = new Set<string>();\n let match: RegExpExecArray | null;\n while ((match = bracket.exec(input)) !== null) {\n found.add(match[1]);\n }\n while ((match = simple.exec(input)) !== null) {\n found.add(match[1]);\n }\n return Array.from(found);\n}\n\n// Returns the refIds a server-side expression query depends on.\nfunction getExpressionReferences(query: DataQueryExtended): string[] {\n const { type, expression, conditions } = query;\n if (type === 'math' || type === 'sql') {\n return parseRefsFromMathExpression(expression ?? '');\n }\n if (type === 'classic_conditions') {\n return (conditions ?? [])\n .map((condition: { query?: { params?: string[] } }) => condition.query?.params?.[0])\n .filter((refId: string | undefined): refId is string => Boolean(refId));\n }\n // reduce / resample / threshold: the whole `expression` is a single refId\n return expression ? [expression] : [];\n}\n\n// Renames the refIds a server-side expression references, according to renameMap.\nfunction rewriteExpressionReferences(query: DataQueryExtended, renameMap: Record<string, string>): void {\n const { type } = query;\n if (type === 'math' || type === 'sql') {\n let expression: string = query.expression ?? '';\n for (const oldRef of Object.keys(renameMap)) {\n const pattern = new RegExp('(\\\\$' + oldRef + '\\\\b)|(\\\\$\\\\{' + oldRef + '\\\\})', 'gm');\n expression = expression.replace(pattern, '${' + renameMap[oldRef] + '}');\n }\n query.expression = expression;\n } else if (type === 'classic_conditions') {\n (query.conditions ?? []).forEach((condition: { query?: { params?: string[] } }) => {\n const params = condition.query?.params;\n if (params && params[0] && renameMap[params[0]]) {\n params[0] = renameMap[params[0]];\n }\n });\n } else if (query.expression && renameMap[query.expression]) {\n query.expression = renameMap[query.expression];\n }\n}\n\n/**\n * When a data query using a multi-value datasource variable feeds a server-side expression, the\n * whole graph must be evaluated once per selected datasource. We fan out by cloning the data query\n * (pinned to a concrete datasource) and its dependent expression subgraph once per selected value,\n * rewriting refIds so each replica is self-contained. Queries and expressions that do not depend on\n * the multi-value variable are left untouched (they run once).\n *\n * Only a single multi-value datasource variable shared by the data queries is supported.\n */\nfunction expandExpressionFanOut(sceneObject: SceneQueryRunner, targets: DataQueryExtended[]): DataQueryExtended[] {\n const isExpression = (query: DataQueryExtended) =>\n Boolean(isExpressionReference && isExpressionReference(query.datasource));\n\n if (!targets.some(isExpression)) {\n return targets;\n }\n\n // Find the multi-value datasource variable used by a data query (if any).\n let variableName: string | undefined;\n let uids: string[] | undefined;\n for (const target of targets) {\n if (isExpression(target)) {\n continue;\n }\n const candidate = getSimpleVariableNameFromDatasourceUid(target.datasource?.uid);\n if (!candidate) {\n continue;\n }\n const value = sceneGraph.lookupVariable(candidate, sceneObject)?.getValue();\n if (Array.isArray(value)) {\n const selected = value.filter((item) => item !== 'default').map(String);\n if (selected.length > 1) {\n variableName = candidate;\n uids = selected;\n break;\n }\n }\n }\n\n if (!variableName || !uids) {\n return targets;\n }\n\n // Data queries using the multi-value variable are the fan-out roots.\n const fannedRootRefIds = new Set<string>();\n for (const target of targets) {\n if (!isExpression(target) && getSimpleVariableNameFromDatasourceUid(target.datasource?.uid) === variableName) {\n fannedRootRefIds.add(target.refId);\n }\n }\n\n // Transitive closure of expressions that (transitively) depend on a fan-out root.\n const dependentRefIds = new Set<string>(fannedRootRefIds);\n let changed = true;\n while (changed) {\n changed = false;\n for (const target of targets) {\n if (!isExpression(target) || dependentRefIds.has(target.refId)) {\n continue;\n }\n if (getExpressionReferences(target).some((refId) => dependentRefIds.has(refId))) {\n dependentRefIds.add(target.refId);\n changed = true;\n }\n }\n }\n\n const expanded: DataQueryExtended[] = targets.filter((target) => !dependentRefIds.has(target.refId));\n const toFanOut = targets.filter((target) => dependentRefIds.has(target.refId));\n\n uids.forEach((uid, index) => {\n const renameMap: Record<string, string> = {};\n for (const target of toFanOut) {\n renameMap[target.refId] = `${target.refId}_${index}`;\n }\n for (const target of toFanOut) {\n const clone = cloneDeep(target);\n clone.refId = renameMap[target.refId];\n if (fannedRootRefIds.has(target.refId)) {\n clone.datasource = { ...clone.datasource, uid };\n } else {\n rewriteExpressionReferences(clone, renameMap);\n }\n expanded.push(clone);\n }\n });\n\n return expanded;\n}\n\nexport interface DataQueryExtended extends DataQuery {\n [key: string]: any;\n\n // Opt this query out of time window comparison\n timeRangeCompare?: boolean;\n}\n\n// The requests that will be run by the query runner.\n//\n// Generally the query runner will run a single primary request.\n// If the scene graph contains implementations of\n// `ExtraQueryProvider`, the requests created by these\n// implementations will be added to the list of secondary requests,\n// and these will be executed at the same time as the primary request.\n//\n// The results of each secondary request will be passed to an associated\n// processor function (along with the results of the primary request),\n// which can transform the results as desired.\ninterface PreparedRequests {\n // The primary request to run.\n primary: DataQueryRequest;\n // A possibly empty list of secondary requests to run alongside\n // the primary request.\n secondaries: DataQueryRequest[];\n // A map from `requestId` of secondary requests to processors\n // for those requests. Provided by the `ExtraQueryProvider`.\n processors: Map<string, ExtraQueryDataProcessor>;\n}\n\nexport class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> implements SceneDataProvider {\n private _querySub?: Unsubscribable;\n private _dataLayersSub?: Unsubscribable;\n private _dataLayersMerger = new DataLayersMerger();\n private _timeSub?: Unsubscribable;\n private _timeSubRange?: SceneTimeRangeLike;\n private _containerWidth?: number;\n private _variableValueRecorder = new VariableValueRecorder();\n private _results = new ReplaySubject<SceneDataProviderResult>(1);\n private _scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };\n private _layerAnnotations?: DataFrame[];\n private _resultAnnotations?: DataFrame[];\n private _isInView = true;\n private _bypassIsInView = false;\n private _queryNotExecutedWhenOutOfView = false;\n\n public getResultsStream() {\n return this._results;\n }\n\n protected _variableDependency: VariableDependencyConfig<QueryRunnerState> = new VariableDependencyConfig(this, {\n statePaths: ['queries', 'datasource', 'minInterval'],\n onVariableUpdateCompleted: this.onVariableUpdatesCompleted.bind(this),\n onAnyVariableChanged: this.onAnyVariableChanged.bind(this),\n dependsOnScopes: true,\n });\n\n private _drilldownDependenciesManager: DrilldownDependenciesManager<QueryRunnerState> =\n new DrilldownDependenciesManager(this._variableDependency);\n\n public constructor(initialState: QueryRunnerState) {\n super(initialState);\n\n this.addActivationHandler(() => this._onActivate());\n }\n\n private _onActivate() {\n if (this.isQueryModeAuto()) {\n const timeRange = sceneGraph.getTimeRange(this);\n\n // Add subscriptions to any extra providers so that they rerun queries\n // when their state changes and they should rerun.\n const providers = this.getClosestExtraQueryProviders();\n for (const provider of providers) {\n this._subs.add(\n provider.subscribeToState((n, p) => {\n if (provider.shouldRerun(p, n, this.state.queries)) {\n this.runQueries();\n }\n })\n );\n }\n\n this.subscribeToTimeRangeChanges(timeRange);\n\n if (this.shouldRunQueriesOnActivate()) {\n this.runQueries();\n }\n }\n\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n return () => this._onDeactivate();\n }\n\n // This method subscribes to all SceneDataLayers up until the root, and combines the results into data provided from SceneQueryRunner\n private _handleDataLayers() {\n const dataLayers = sceneGraph.getDataLayers(this);\n\n if (dataLayers.length === 0) {\n return;\n }\n\n this._dataLayersSub = this._dataLayersMerger\n .getMergedStream(dataLayers)\n .subscribe(this._onLayersReceived.bind(this));\n }\n\n private _onLayersReceived(results: Iterable<SceneDataProviderResult>) {\n const timeRange = sceneGraph.getTimeRange(this);\n const { dataLayerFilter } = this.state;\n\n let annotations: DataFrame[] = [];\n let alertStates: DataFrame[] = [];\n let alertState: AlertStateInfo | undefined;\n\n for (const result of results) {\n for (let frame of result.data.series) {\n if (frame.meta?.dataTopic === DataTopic.Annotations) {\n annotations = annotations.concat(frame);\n }\n if (frame.meta?.dataTopic === DataTopic.AlertStates) {\n alertStates = alertStates.concat(frame);\n }\n }\n }\n\n if (dataLayerFilter?.panelId) {\n if (annotations.length > 0) {\n annotations = filterAnnotations(annotations, dataLayerFilter);\n }\n\n if (alertStates.length > 0) {\n for (const frame of alertStates) {\n const frameView = new DataFrameView<AlertStateInfo>(frame);\n\n for (const row of frameView) {\n if (row.panelId === dataLayerFilter.panelId) {\n alertState = row;\n break;\n }\n }\n }\n }\n }\n\n // Skip unnessary state updates\n if (\n allFramesEmpty(annotations) &&\n allFramesEmpty(this._layerAnnotations) &&\n isEqual(alertState, this.state.data?.alertState)\n ) {\n return;\n }\n\n this._layerAnnotations = annotations;\n\n const baseStateUpdate = this.state.data ? this.state.data : { ...emptyPanelData, timeRange: timeRange.state.value };\n\n this.setState({\n data: {\n ...baseStateUpdate,\n annotations: [...(this._resultAnnotations ?? []), ...annotations],\n alertState: alertState ?? this.state.data?.alertState,\n },\n });\n }\n\n /**\n * This tries to start a new query whenever a variable completes or is changed.\n *\n * We care about variable update completions even when the variable has not changed and even when it is not a direct dependency.\n * Example: Variables A and B (B depends on A). A update depends on time range. So when time change query runner will\n * find that variable A is loading which is a dependency on of variable B so will set _isWaitingForVariables to true and\n * not issue any query.\n *\n * When A completes it's loading (with no value change, so B never updates) it will cause a call of this function letting\n * the query runner know that A has completed, and in case _isWaitingForVariables we try to run the query. The query will\n * only run if all variables are in a non loading state so in other scenarios where a query depends on many variables this will\n * be called many times until all dependencies are in a non loading state. *\n */\n private onVariableUpdatesCompleted() {\n if (this.isQueryModeAuto()) {\n this.runQueries();\n }\n }\n\n /**\n * Check if value changed is an adhoc filter or group by variable that did not exist when we issued the last query\n */\n private onAnyVariableChanged(variable: SceneVariable) {\n if (\n this._drilldownDependenciesManager.adHocFiltersVar === variable ||\n this._drilldownDependenciesManager.groupByVar === variable ||\n !this.isQueryModeAuto()\n ) {\n return;\n }\n\n if (variable instanceof AdHocFiltersVariable && this._isRelevantAutoVariable(variable)) {\n this.runQueries();\n }\n\n if (variable instanceof GroupByVariable && this._isRelevantAutoVariable(variable)) {\n this.runQueries();\n }\n }\n\n private _isRelevantAutoVariable(variable: AdHocFiltersVariable | GroupByVariable) {\n const datasource = this.state.datasource ?? findFirstDatasource(this.state.queries);\n return variable.state.applyMode === 'auto' && datasource?.uid === variable.state.datasource?.uid;\n }\n\n private shouldRunQueriesOnActivate() {\n if (this._variableValueRecorder.hasDependenciesChanged(this)) {\n writeSceneLog(\n 'SceneQueryRunner',\n 'Variable dependency changed while inactive, shouldRunQueriesOnActivate returns true'\n );\n return true;\n }\n\n // If we don't have any data we should run queries\n if (!this.state.data) {\n return true;\n }\n\n // If time range is stale / different we should run queries\n if (this._isDataTimeRangeStale(this.state.data)) {\n return true;\n }\n\n return false;\n }\n\n private _isDataTimeRangeStale(data: PanelData) {\n const timeRange = sceneGraph.getTimeRange(this);\n\n const stateTimeRange = timeRange.state.value;\n const dataTimeRange = data.timeRange;\n\n if (\n stateTimeRange.from.unix() === dataTimeRange.from.unix() &&\n stateTimeRange.to.unix() === dataTimeRange.to.unix()\n ) {\n return false;\n }\n writeSceneLog('SceneQueryRunner', 'Data time range is stale');\n return true;\n }\n\n private _onDeactivate(): void {\n if (this._querySub) {\n this._querySub.unsubscribe();\n this._querySub = undefined;\n }\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n this._timeSub?.unsubscribe();\n this._timeSub = undefined;\n this._timeSubRange = undefined;\n\n // Reset data to its initial state unless it reached a terminal state (Done or Error).\n // Incomplete data is discarded so reactivation starts with a clean state.\n if (this.state.data && ![LoadingState.Done, LoadingState.Error].includes(this.state.data.state)) {\n this.setState({ data: undefined });\n }\n\n this._drilldownDependenciesManager.cleanup();\n }\n\n public setContainerWidth(width: number) {\n // If we don't have a width we should run queries\n if (!this._containerWidth && width > 0) {\n this._containerWidth = width;\n\n // If we don't have maxDataPoints specifically set and maxDataPointsFromWidth is true\n if (this.state.maxDataPointsFromWidth && !this.state.maxDataPoints) {\n // As this is called from render path we need to wait for next tick before running queries\n setTimeout(() => {\n if (this.isActive && !this.state._hasFetchedData) {\n this.runQueries();\n }\n }, 0);\n }\n } else {\n // if the updated container width is bigger than 0 let's remember the width until next query issue\n if (width > 0) {\n this._containerWidth = width;\n }\n }\n }\n\n public isDataReadyToDisplay() {\n return Boolean(this.state._hasFetchedData);\n }\n\n private subscribeToTimeRangeChanges(timeRange: SceneTimeRangeLike) {\n if (this._timeSubRange === timeRange) {\n // Nothing to do, already subscribed\n return;\n }\n\n if (this._timeSub) {\n this._timeSub.unsubscribe();\n }\n\n this._timeSubRange = timeRange;\n this._timeSub = timeRange.subscribeToState(() => {\n // setTimeout to let SceneVariableSet also respond to time range change\n // So that variables that depend on time range have time to switch to loading state\n setTimeout(() => this.runWithTimeRange(timeRange), 0);\n });\n }\n\n public runQueries() {\n const timeRange = sceneGraph.getTimeRange(this);\n\n if (this.isQueryModeAuto()) {\n this.subscribeToTimeRangeChanges(timeRange);\n }\n\n this.runWithTimeRange(timeRange);\n }\n\n private getMaxDataPoints() {\n if (this.state.maxDataPoints) {\n return this.state.maxDataPoints;\n }\n\n return this.state.maxDataPointsFromWidth ? this._containerWidth ?? 500 : 500;\n }\n\n public cancelQuery() {\n this._querySub?.unsubscribe();\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n this.setState({\n data: { ...(this.state.data ?? emptyPanelData), state: LoadingState.Done },\n });\n }\n\n private async runWithTimeRange(timeRange: SceneTimeRangeLike) {\n // If no maxDataPoints specified we might need to wait for container width to be set from the outside\n if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {\n return;\n }\n\n if (this.isQueryModeAuto() && !this._isInView && !this._bypassIsInView) {\n this._queryNotExecutedWhenOutOfView = true;\n return;\n }\n\n this._queryNotExecutedWhenOutOfView = false;\n\n // If data layers subscription doesn't exist, create one\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n // Cancel any running queries\n this._querySub?.unsubscribe();\n\n // Skip executing queries if variable dependency is in loading state\n if (this._variableDependency.hasDependencyInLoadingState()) {\n writeSceneLog('SceneQueryRunner', 'Variable dependency is in loading state, skipping query execution');\n this.setState({ data: { ...(this.state.data ?? emptyPanelData), state: LoadingState.Loading } });\n return;\n }\n\n this._variableValueRecorder.recordCurrentDependencyValuesForSceneObject(this);\n\n const { queries } = this.state;\n\n // Simple path when no queries exist\n if (!queries?.length) {\n this._setNoDataState();\n return;\n }\n\n try {\n const datasource = this.state.datasource ?? findFirstDatasource(queries);\n const runtimeDatasource = shouldUseMixedRuntimeDatasource(this, datasource, queries)\n ? MIXED_DATASOURCE_REF\n : datasource;\n const ds = await getDataSource(runtimeDatasource, this._scopedVars);\n\n this._drilldownDependenciesManager.findAndSubscribeToDrilldowns(ds.uid, this);\n\n const runRequest = getRunRequest();\n const { primary, secondaries, processors } = this.prepareRequests(timeRange, ds);\n\n writeSceneLog('SceneQueryRunner', 'Starting runRequest', this.state.key);\n\n let stream = runRequest(ds, primary);\n\n if (secondaries.length > 0) {\n // Submit all secondary requests in parallel.\n const secondaryStreams = secondaries.map((r) => runRequest(ds, r));\n // Create the rxjs operator which will combine the primary and secondary responses\n // by calling the correct processor functions provided by the\n // extra request providers.\n const op = extraQueryProcessingOperator(processors);\n // Combine the primary and secondary streams into a single stream, and apply the operator.\n // Use combineLatest so intermediate loading/error states from the primary and secondary requests are emitted as\n // they arrive, instead of only a single combined emission once every request has completed.\n stream = combineLatest([stream, ...secondaryStreams]).pipe(op);\n }\n\n const panelProfiler: QueryProfilerLike | undefined = findPanelProfiler(this);\n\n stream = stream.pipe(\n registerQueryWithController(\n {\n type: 'SceneQueryRunner/runQueries',\n request: primary,\n origin: this,\n cancel: () => this.cancelQuery(),\n },\n panelProfiler\n )\n );\n\n this._querySub = stream.subscribe(this.onDataReceived);\n } catch (err) {\n console.error('PanelQueryRunner Error', err);\n\n this.onDataReceived({\n ...emptyPanelData,\n ...this.state.data,\n state: LoadingState.Error,\n errors: [toDataQueryError(err)],\n });\n }\n }\n\n public clone(withState?: Partial<QueryRunnerState>) {\n const clone = super.clone(withState);\n\n if (this._resultAnnotations) {\n clone['_resultAnnotations'] = this._resultAnnotations.map((frame) => ({ ...frame }));\n }\n\n if (this._layerAnnotations) {\n clone['_layerAnnotations'] = this._layerAnnotations.map((frame) => ({ ...frame }));\n }\n\n clone['_variableValueRecorder'] = this._variableValueRecorder.cloneAndRecordCurrentValuesForSceneObject(this);\n clone['_containerWidth'] = this._containerWidth;\n clone['_results'].next({ origin: this, data: this.state.data ?? emptyPanelData });\n\n return clone;\n }\n\n private prepareRequests(timeRange: SceneTimeRangeLike, ds: DataSourceApi): PreparedRequests {\n const { minInterval, queries, requestIdPrefix } = this.state;\n\n let request: DataQueryRequest<DataQueryExtended> = {\n app: 'scenes',\n requestId: getNextRequestId(requestIdPrefix),\n timezone: timeRange.getTimeZone(),\n range: timeRange.state.value,\n interval: '1s',\n intervalMs: 1000,\n targets: cloneDeep(queries),\n maxDataPoints: this.getMaxDataPoints(),\n scopedVars: this._scopedVars,\n startTime: Date.now(),\n liveStreaming: this.state.liveStreaming,\n rangeRaw: {\n from: timeRange.state.from,\n to: timeRange.state.to,\n },\n cacheTimeout: this.state.cacheTimeout,\n queryCachingTTL: this.state.queryCachingTTL,\n scopes: sceneGraph.getScopes(this),\n // This asks the scene root to provide context properties like app, panel and dashboardUID\n ...getEnrichedDataRequest(this),\n };\n\n const filters = this._drilldownDependenciesManager.getFilters();\n const groupByKeys = this._drilldownDependenciesManager.getGroupByKeys();\n\n if (filters) {\n request.filters = filters;\n }\n\n if (groupByKeys) {\n request.groupByKeys = groupByKeys;\n }\n\n request.targets = request.targets.map((query) => {\n if (\n !query.datasource ||\n (query.datasource.uid !== ds.uid &&\n !ds.meta?.mixed &&\n isExpressionReference /* TODO: Remove this check when isExpressionReference is properly exported from grafan runtime */ &&\n !isExpressionReference(query.datasource))\n ) {\n if (!query.datasource && ds.meta?.mixed && isTemplatedDatasourceRef(this.state.datasource)) {\n query.datasource = this.state.datasource;\n } else {\n query.datasource = ds.getRef();\n }\n }\n return query;\n });\n\n request.targets = expandExpressionFanOut(this, request.targets);\n\n const lowerIntervalLimit = minInterval ? interpolate(this, minInterval) : ds.interval;\n const norm = rangeUtil.calculateInterval(timeRange.state.value, request.maxDataPoints!, lowerIntervalLimit);\n\n // make shallow copy of scoped vars,\n // and add built in variables interval and interval_ms\n request.scopedVars = Object.assign({}, request.scopedVars, {\n __interval: { text: norm.interval, value: norm.interval },\n __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs },\n });\n\n request.interval = norm.interval;\n request.intervalMs = norm.intervalMs;\n\n // If there are any extra request providers, we need to add a new request for each\n // and map the request's ID to the processor function given by the provider, to ensure that\n // the processor is called with the correct response data.\n const primaryTimeRange = timeRange.state.value;\n let secondaryRequests: DataQueryRequest[] = [];\n let secondaryProcessors = new Map();\n for (const provider of this.getClosestExtraQueryProviders() ?? []) {\n for (const { req, processor } of provider.getExtraQueries(request)) {\n const requestId = getNextRequestId(requestIdPrefix);\n secondaryRequests.push({ ...req, requestId });\n secondaryProcessors.set(requestId, processor ?? passthroughProcessor);\n }\n }\n request.range = primaryTimeRange;\n return { primary: request, secondaries: secondaryRequests, processors: secondaryProcessors };\n }\n\n private onDataReceived = (data: PanelData) => {\n const preProcessedData = preProcessPanelData(data, this.state.data);\n\n this._resultAnnotations = data.annotations;\n\n const dataWithLayersApplied = this._combineDataLayers(preProcessedData);\n\n const last = this.state.data;\n\n // Restore referential identity of series/annotations when frames haven't changed,\n // preventing panels from reprocessing unchanged data. Brings back logic that existed in PanelQueryRunner in core.\n if (last != null && dataWithLayersApplied.state !== LoadingState.Streaming) {\n const sameSeries = compareArrayValues(last.series ?? [], dataWithLayersApplied.series ?? [], (a, b) => a === b);\n const sameAnnotations = compareArrayValues(\n last.annotations ?? [],\n dataWithLayersApplied.annotations ?? [],\n (a, b) => a === b\n );\n const sameState = last.state === dataWithLayersApplied.state;\n const sameErrors = compareArrayValues(last.errors ?? [], dataWithLayersApplied.errors ?? [], (a, b) =>\n isEqual(a, b)\n );\n\n if (sameSeries) {\n dataWithLayersApplied.series = last.series;\n }\n\n if (sameAnnotations) {\n dataWithLayersApplied.annotations = last.annotations;\n }\n\n if (sameSeries && sameAnnotations && sameState && sameErrors) {\n if (last.request?.requestId === dataWithLayersApplied.request?.requestId) {\n return;\n }\n }\n }\n\n let hasFetchedData = this.state._hasFetchedData;\n\n if (!hasFetchedData && preProcessedData.state !== LoadingState.Loading) {\n hasFetchedData = true;\n }\n\n this.setState({ data: dataWithLayersApplied, _hasFetchedData: hasFetchedData });\n this._results.next({ origin: this, data: dataWithLayersApplied });\n };\n\n private _combineDataLayers(data: PanelData) {\n if (this._layerAnnotations && this._layerAnnotations.length > 0) {\n data.annotations = (data.annotations || []).concat(this._layerAnnotations);\n }\n\n if (this.state.data && this.state.data.alertState) {\n data.alertState = this.state.data.alertState;\n }\n\n return data;\n }\n\n private _setNoDataState() {\n if (this.state.data !== emptyPanelData) {\n this.setState({ data: emptyPanelData });\n }\n }\n\n /**\n * Walk up the scene graph and find any ExtraQueryProviders.\n *\n * This will return an array of the closest provider of each type.\n */\n private getClosestExtraQueryProviders(): Array<ExtraQueryProvider<any>> {\n // Maintain a map from provider constructor to provider object. The constructor\n // is used as a unique key for each class, to ensure we have no more than one\n // type of each type of provider.\n const found = new Map();\n if (!this.parent) {\n return [];\n }\n getClosest(this.parent, (s) => {\n if (isExtraQueryProvider(s) && !found.has(s.constructor)) {\n found.set(s.constructor, s);\n }\n s.forEachChild((child) => {\n if (isExtraQueryProvider(child) && !found.has(child.constructor)) {\n found.set(child.constructor, child);\n }\n });\n // Always return null so that the search continues to the top of\n // the scene graph.\n return null;\n });\n return Array.from(found.values());\n }\n\n private isQueryModeAuto(): boolean {\n return (this.state.runQueriesMode ?? 'auto') === 'auto';\n }\n\n public isInViewChanged(isInView: boolean): void {\n writeSceneLog('SceneQueryRunner', `isInViewChanged: ${isInView}`, this.state.key);\n this._isInView = isInView;\n\n if (isInView && this._queryNotExecutedWhenOutOfView) {\n this.runQueries();\n }\n }\n\n public bypassIsInViewChanged(bypassIsInView: boolean): void {\n writeSceneLog('SceneQueryRunner', `bypassIsInViewChanged: ${bypassIsInView}`, this.state.key);\n this._bypassIsInView = bypassIsInView;\n\n if (bypassIsInView && this._queryNotExecutedWhenOutOfView) {\n this.runQueries();\n }\n }\n}\n\nexport function findFirstDatasource(targets: DataQuery[]): DataSourceRef | undefined {\n return targets.find((t) => t.datasource !== null)?.datasource ?? undefined;\n}\n\nfunction allFramesEmpty(frames?: DataFrame[]) {\n if (!frames) {\n return true;\n }\n\n for (let i = 0; i < frames.length; i++) {\n if (frames[i].length > 0) {\n return false;\n }\n }\n\n return true;\n}\n"],"names":["counter","getNextRequestId","_a"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDA,IAAIA,SAAA,GAAU,GAAA;AACd,MAAM,oBAAA,GAAuB,aAAA;AAC7B,MAAM,oBAAA,GAAsC,EAAE,IAAA,EAAM,OAAA,EAAS,KAAK,oBAAA,EAAqB;AAEhF,SAASC,kBAAA,CAAiB,SAAS,KAAA,EAAO;AAC/C,EAAA,OAAO,MAAA,GAASD,SAAA,EAAA;AAClB;AA4BA,SAAS,yBAAyB,GAAA,EAAkC;AAClE,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,OAAO,kCAAA,CAAmC,KAAK,GAAG,CAAA;AACpD;AAEA,SAAS,yBAAyB,UAAA,EAAuD;AACvF,EAAA,OAAO,wBAAA,CAAyB,yCAAY,GAAG,CAAA;AACjD;AAEA,SAAS,+BAAA,CACP,WAAA,EACA,UAAA,EACA,OAAA,EACA;AAEA,EAAA,MAAM,IAAA,GAAgD,CAAC,UAAA,EAAY,GAAG,OAAA,CAAQ,IAAI,CAAC,KAAA,KAAU,KAAA,CAAM,UAAU,CAAC,CAAA;AAE9G,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,MAAM,GAAA,IAAA,IAAA,GAAA,MAAA,GAAA,GAAA,CAAK,GAAA;AACjB,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,uCAAuC,GAAG,CAAA;AAC/D,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,cAAA,GAAiB,mCAAA,CAAoC,WAAA,EAAa,YAAY,CAAA;AAEpF,MAAA,IAAI,cAAA,KAAmB,MAAA,IAAa,cAAA,GAAiB,CAAA,EAAG;AACtD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,4BAA4B,KAAA,EAAyB;AAC5D,EAAA,MAAM,OAAA,GAAU,2BAAA;AAChB,EAAA,MAAM,MAAA,GAAS,qBAAA;AACf,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,IAAI,KAAA;AACJ,EAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,KAAK,OAAO,IAAA,EAAM;AAC7C,IAAA,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACpB;AACA,EAAA,OAAA,CAAQ,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,OAAO,IAAA,EAAM;AAC5C,IAAA,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACpB;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AACzB;AAGA,SAAS,wBAAwB,KAAA,EAAoC;AACnE,EAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,UAAA,EAAW,GAAI,KAAA;AACzC,EAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,KAAA,EAAO;AACrC,IAAA,OAAO,2BAAA,CAA4B,kCAAc,EAAE,CAAA;AAAA,EACrD;AACA,EAAA,IAAI,SAAS,oBAAA,EAAsB;AACjC,IAAA,OAAA,CAAQ,UAAA,IAAA,IAAA,GAAA,UAAA,GAAc,EAAC,EACpB,GAAA,CAAI,CAAC,SAAA,KAA8C;AA1J1D,MAAA,IAAA,EAAA,EAAA,EAAA;AA0J6D,MAAA,OAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,SAAA,CAAU,KAAA,KAAV,IAAA,GAAA,MAAA,GAAA,EAAA,CAAiB,MAAA,KAAjB,IAAA,GAAA,MAAA,GAAA,EAAA,CAA0B,CAAA,CAAA;AAAA,IAAA,CAAE,EAClF,MAAA,CAAO,CAAC,KAAA,KAA+C,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,UAAA,GAAa,CAAC,UAAU,CAAA,GAAI,EAAC;AACtC;AAGA,SAAS,2BAAA,CAA4B,OAA0B,SAAA,EAAyC;AAlKxG,EAAA,IAAA,EAAA,EAAA,EAAA;AAmKE,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,EAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,KAAA,EAAO;AACrC,IAAA,IAAI,UAAA,GAAA,CAAqB,EAAA,GAAA,KAAA,CAAM,UAAA,KAAN,IAAA,GAAA,EAAA,GAAoB,EAAA;AAC7C,IAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AAC3C,MAAA,MAAM,OAAA,GAAU,IAAI,MAAA,CAAO,MAAA,GAAS,SAAS,cAAA,GAAiB,MAAA,GAAS,QAAQ,IAAI,CAAA;AACnF,MAAA,UAAA,GAAa,WAAW,OAAA,CAAQ,OAAA,EAAS,OAAO,SAAA,CAAU,MAAM,IAAI,GAAG,CAAA;AAAA,IACzE;AACA,IAAA,KAAA,CAAM,UAAA,GAAa,UAAA;AAAA,EACrB,CAAA,MAAA,IAAW,SAAS,oBAAA,EAAsB;AACxC,IAAA,CAAA,CAAC,WAAM,UAAA,KAAN,IAAA,GAAA,EAAA,GAAoB,EAAC,EAAG,OAAA,CAAQ,CAAC,SAAA,KAAiD;AA5KvF,MAAA,IAAAE,GAAAA;AA6KM,MAAA,MAAM,MAAA,GAAA,CAASA,GAAAA,GAAA,SAAA,CAAU,KAAA,KAAV,gBAAAA,GAAAA,CAAiB,MAAA;AAChC,MAAA,IAAI,MAAA,IAAU,OAAO,CAAC,CAAA,IAAK,UAAU,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG;AAC/C,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,SAAA,CAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MACjC;AAAA,IACF,CAAC,CAAA;AAAA,EACH,WAAW,KAAA,CAAM,UAAA,IAAc,SAAA,CAAU,KAAA,CAAM,UAAU,CAAA,EAAG;AAC1D,IAAA,KAAA,CAAM,UAAA,GAAa,SAAA,CAAU,KAAA,CAAM,UAAU,CAAA;AAAA,EAC/C;AACF;AAWA,SAAS,sBAAA,CAAuB,aAA+B,OAAA,EAAmD;AAhMlH,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAiME,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KACpB,OAAA,CAAQ,yBAAyB,qBAAA,CAAsB,KAAA,CAAM,UAAU,CAAC,CAAA;AAE1E,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,YAAY,CAAA,EAAG;AAC/B,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,IAAA;AACJ,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,YAAA,CAAa,MAAM,CAAA,EAAG;AACxB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,sCAAA,CAAA,CAAuC,EAAA,GAAA,MAAA,CAAO,UAAA,KAAP,mBAAmB,GAAG,CAAA;AAC/E,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAQ,EAAA,GAAA,UAAA,CAAW,cAAA,CAAe,SAAA,EAAW,WAAW,MAAhD,IAAA,GAAA,MAAA,GAAA,EAAA,CAAmD,QAAA,EAAA;AACjE,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,CAAC,SAAS,IAAA,KAAS,SAAS,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACtE,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,YAAA,GAAe,SAAA;AACf,QAAA,IAAA,GAAO,QAAA;AACP,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,IAAA,EAAM;AAC1B,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAY;AACzC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,CAAC,YAAA,CAAa,MAAM,CAAA,IAAK,sCAAA,CAAA,CAAuC,YAAO,UAAA,KAAP,IAAA,GAAA,MAAA,GAAA,EAAA,CAAmB,GAAG,CAAA,KAAM,YAAA,EAAc;AAC5G,MAAA,gBAAA,CAAiB,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,IACnC;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAY,gBAAgB,CAAA;AACxD,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,OAAO,OAAA,EAAS;AACd,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,CAAC,aAAa,MAAM,CAAA,IAAK,gBAAgB,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,EAAG;AAC9D,QAAA;AAAA,MACF;AACA,MAAA,IAAI,uBAAA,CAAwB,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,UAAU,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAC,CAAA,EAAG;AAC/E,QAAA,eAAA,CAAgB,GAAA,CAAI,OAAO,KAAK,CAAA;AAChC,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAgC,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,CAAC,eAAA,CAAgB,GAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA;AACnG,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAA,CAAO,CAAC,WAAW,eAAA,CAAgB,GAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA;AAE7E,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AAC3B,IAAA,MAAM,YAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,MAAA,SAAA,CAAU,OAAO,KAAK,CAAA,GAAI,GAAG,MAAA,CAAO,KAAK,IAAI,KAAK,CAAA,CAAA;AAAA,IACpD;AACA,IAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,KAAA,GAAQ,UAAU,MAAM,CAAA;AAC9B,MAAA,KAAA,CAAM,KAAA,GAAQ,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA;AACpC,MAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,EAAG;AACtC,QAAA,KAAA,CAAM,UAAA,GAAa,EAAE,GAAG,KAAA,CAAM,YAAY,GAAA,EAAI;AAAA,MAChD,CAAA,MAAO;AACL,QAAA,2BAAA,CAA4B,OAAO,SAAS,CAAA;AAAA,MAC9C;AACA,MAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,IACrB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,QAAA;AACT;AA+BO,MAAM,yBAAyB,eAAA,CAA+D;AAAA,EA8B5F,YAAY,YAAA,EAAgC;AACjD,IAAA,KAAA,CAAM,YAAY,CAAA;AA5BpB,IAAA,IAAA,CAAQ,iBAAA,GAAoB,IAAI,gBAAA,EAAiB;AAIjD,IAAA,IAAA,CAAQ,sBAAA,GAAyB,IAAI,qBAAA,EAAsB;AAC3D,IAAA,IAAA,CAAQ,QAAA,GAAW,IAAI,aAAA,CAAuC,CAAC,CAAA;AAC/D,IAAA,IAAA,CAAQ,WAAA,GAAc,EAAE,aAAA,EAAe,iCAAA,CAAkC,IAAI,CAAA,EAAE;AAG/E,IAAA,IAAA,CAAQ,SAAA,GAAY,IAAA;AACpB,IAAA,IAAA,CAAQ,eAAA,GAAkB,KAAA;AAC1B,IAAA,IAAA,CAAQ,8BAAA,GAAiC,KAAA;AAMzC,IAAA,IAAA,CAAU,mBAAA,GAAkE,IAAI,wBAAA,CAAyB,IAAA,EAAM;AAAA,MAC7G,UAAA,EAAY,CAAC,SAAA,EAAW,YAAA,EAAc,aAAa,CAAA;AAAA,MACnD,yBAAA,EAA2B,IAAA,CAAK,0BAAA,CAA2B,IAAA,CAAK,IAAI,CAAA;AAAA,MACpE,oBAAA,EAAsB,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA;AAAA,MACzD,eAAA,EAAiB;AAAA,KAClB,CAAA;AAED,IAAA,IAAA,CAAQ,6BAAA,GACN,IAAI,4BAAA,CAA6B,IAAA,CAAK,mBAAmB,CAAA;AA4e3D,IAAA,IAAA,CAAQ,cAAA,GAAiB,CAAC,IAAA,KAAoB;AAtzBhD,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAuzBI,MAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,IAAA,EAAM,IAAA,CAAK,MAAM,IAAI,CAAA;AAElE,MAAA,IAAA,CAAK,qBAAqB,IAAA,CAAK,WAAA;AAE/B,MAAA,MAAM,qBAAA,GAAwB,IAAA,CAAK,kBAAA,CAAmB,gBAAgB,CAAA;AAEtE,MAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,IAAA;AAIxB,MAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,qBAAA,CAAsB,KAAA,KAAU,aAAa,SAAA,EAAW;AAC1E,QAAA,MAAM,aAAa,kBAAA,CAAA,CAAmB,EAAA,GAAA,IAAA,CAAK,MAAA,KAAL,IAAA,GAAA,EAAA,GAAe,EAAC,EAAA,CAAG,EAAA,GAAA,qBAAA,CAAsB,MAAA,KAAtB,IAAA,GAAA,EAAA,GAAgC,EAAC,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,CAAC,CAAA;AAC9G,QAAA,MAAM,eAAA,GAAkB,kBAAA;AAAA,UAAA,CACtB,EAAA,GAAA,IAAA,CAAK,WAAA,KAAL,IAAA,GAAA,EAAA,GAAoB,EAAC;AAAA,UAAA,CACrB,EAAA,GAAA,qBAAA,CAAsB,WAAA,KAAtB,IAAA,GAAA,EAAA,GAAqC,EAAC;AAAA,UACtC,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM;AAAA,SAClB;AACA,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,KAAU,qBAAA,CAAsB,KAAA;AACvD,QAAA,MAAM,UAAA,GAAa,kBAAA;AAAA,UAAA,CAAmB,EAAA,GAAA,IAAA,CAAK,MAAA,KAAL,IAAA,GAAA,EAAA,GAAe,EAAC;AAAA,UAAA,CAAG,EAAA,GAAA,qBAAA,CAAsB,MAAA,KAAtB,IAAA,GAAA,EAAA,GAAgC,EAAC;AAAA,UAAG,CAAC,CAAA,EAAG,CAAA,KAC/F,OAAA,CAAQ,GAAG,CAAC;AAAA,SACd;AAEA,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,qBAAA,CAAsB,SAAS,IAAA,CAAK,MAAA;AAAA,QACtC;AAEA,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,qBAAA,CAAsB,cAAc,IAAA,CAAK,WAAA;AAAA,QAC3C;AAEA,QAAA,IAAI,UAAA,IAAc,eAAA,IAAmB,SAAA,IAAa,UAAA,EAAY;AAC5D,UAAA,IAAA,CAAA,CAAI,UAAK,OAAA,KAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAc,iBAAc,EAAA,GAAA,qBAAA,CAAsB,OAAA,KAAtB,mBAA+B,SAAA,CAAA,EAAW;AACxE,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,cAAA,GAAiB,KAAK,KAAA,CAAM,eAAA;AAEhC,MAAA,IAAI,CAAC,cAAA,IAAkB,gBAAA,CAAiB,KAAA,KAAU,aAAa,OAAA,EAAS;AACtE,QAAA,cAAA,GAAiB,IAAA;AAAA,MACnB;AAEA,MAAA,IAAA,CAAK,SAAS,EAAE,IAAA,EAAM,qBAAA,EAAuB,eAAA,EAAiB,gBAAgB,CAAA;AAC9E,MAAA,IAAA,CAAK,SAAS,IAAA,CAAK,EAAE,QAAQ,IAAA,EAAM,IAAA,EAAM,uBAAuB,CAAA;AAAA,IAClE,CAAA;AArhBE,IAAA,IAAA,CAAK,oBAAA,CAAqB,MAAM,IAAA,CAAK,WAAA,EAAa,CAAA;AAAA,EACpD;AAAA,EAlBO,gBAAA,GAAmB;AACxB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAkBQ,WAAA,GAAc;AACpB,IAAA,IAAI,IAAA,CAAK,iBAAgB,EAAG;AAC1B,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,YAAA,CAAa,IAAI,CAAA;AAI9C,MAAA,MAAM,SAAA,GAAY,KAAK,6BAAA,EAA8B;AACrD,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,IAAA,CAAK,KAAA,CAAM,GAAA;AAAA,UACT,QAAA,CAAS,gBAAA,CAAiB,CAAC,CAAA,EAAG,CAAA,KAAM;AAClC,YAAA,IAAI,SAAS,WAAA,CAAY,CAAA,EAAG,GAAG,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AAClD,cAAA,IAAA,CAAK,UAAA,EAAW;AAAA,YAClB;AAAA,UACF,CAAC;AAAA,SACH;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,4BAA4B,SAAS,CAAA;AAE1C,MAAA,IAAI,IAAA,CAAK,4BAA2B,EAAG;AACrC,QAAA,IAAA,CAAK,UAAA,EAAW;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,IACzB;AAEA,IAAA,OAAO,MAAM,KAAK,aAAA,EAAc;AAAA,EAClC;AAAA;AAAA,EAGQ,iBAAA,GAAoB;AAC1B,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,aAAA,CAAc,IAAI,CAAA;AAEhD,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,iBAAA,CACxB,eAAA,CAAgB,UAAU,CAAA,CAC1B,SAAA,CAAU,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAChD;AAAA,EAEQ,kBAAkB,OAAA,EAA4C;AA9XxE,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA+XI,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,YAAA,CAAa,IAAI,CAAA;AAC9C,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,IAAA,CAAK,KAAA;AAEjC,IAAA,IAAI,cAA2B,EAAC;AAChC,IAAA,IAAI,cAA2B,EAAC;AAChC,IAAA,IAAI,UAAA;AAEJ,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,KAAA,IAAS,KAAA,IAAS,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ;AACpC,QAAA,IAAA,CAAA,CAAI,EAAA,GAAA,KAAA,CAAM,IAAA,KAAN,IAAA,GAAA,MAAA,GAAA,EAAA,CAAY,SAAA,MAAc,UAAU,WAAA,EAAa;AACnD,UAAA,WAAA,GAAc,WAAA,CAAY,OAAO,KAAK,CAAA;AAAA,QACxC;AACA,QAAA,IAAA,CAAA,CAAI,EAAA,GAAA,KAAA,CAAM,IAAA,KAAN,IAAA,GAAA,MAAA,GAAA,EAAA,CAAY,SAAA,MAAc,UAAU,WAAA,EAAa;AACnD,UAAA,WAAA,GAAc,WAAA,CAAY,OAAO,KAAK,CAAA;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,mDAAiB,OAAA,EAAS;AAC5B,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,QAAA,WAAA,GAAc,iBAAA,CAAkB,aAAa,eAAe,CAAA;AAAA,MAC9D;AAEA,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,QAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,UAAA,MAAM,SAAA,GAAY,IAAI,aAAA,CAA8B,KAAK,CAAA;AAEzD,UAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,YAAA,IAAI,GAAA,CAAI,OAAA,KAAY,eAAA,CAAgB,OAAA,EAAS;AAC3C,cAAA,UAAA,GAAa,GAAA;AACb,cAAA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IACE,cAAA,CAAe,WAAW,CAAA,IAC1B,cAAA,CAAe,KAAK,iBAAiB,CAAA,IACrC,OAAA,CAAQ,UAAA,EAAA,CAAY,EAAA,GAAA,IAAA,CAAK,KAAA,CAAM,IAAA,KAAX,IAAA,GAAA,MAAA,GAAA,EAAA,CAAiB,UAAU,CAAA,EAC/C;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,iBAAA,GAAoB,WAAA;AAEzB,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,EAAE,GAAG,cAAA,EAAgB,SAAA,EAAW,SAAA,CAAU,MAAM,KAAA,EAAM;AAElH,IAAA,IAAA,CAAK,QAAA,CAAS;AAAA,MACZ,IAAA,EAAM;AAAA,QACJ,GAAG,eAAA;AAAA,QACH,WAAA,EAAa,CAAC,GAAA,CAAI,EAAA,GAAA,IAAA,CAAK,uBAAL,IAAA,GAAA,EAAA,GAA2B,EAAC,EAAI,GAAG,WAAW,CAAA;AAAA,QAChE,UAAA,EAAY,UAAA,IAAA,IAAA,GAAA,UAAA,GAAA,CAAc,EAAA,GAAA,IAAA,CAAK,KAAA,CAAM,SAAX,IAAA,GAAA,MAAA,GAAA,EAAA,CAAiB;AAAA;AAC7C,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeQ,0BAAA,GAA6B;AACnC,IAAA,IAAI,IAAA,CAAK,iBAAgB,EAAG;AAC1B,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,QAAA,EAAyB;AACpD,IAAA,IACE,IAAA,CAAK,6BAAA,CAA8B,eAAA,KAAoB,QAAA,IACvD,IAAA,CAAK,6BAAA,CAA8B,UAAA,KAAe,QAAA,IAClD,CAAC,IAAA,CAAK,eAAA,EAAgB,EACtB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,YAAoB,oBAAA,IAAwB,IAAA,CAAK,uBAAA,CAAwB,QAAQ,CAAA,EAAG;AACtF,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB;AAEA,IAAA,IAAI,QAAA,YAAoB,eAAA,IAAmB,IAAA,CAAK,uBAAA,CAAwB,QAAQ,CAAA,EAAG;AACjF,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,wBAAwB,QAAA,EAAkD;AAlepF,IAAA,IAAA,EAAA,EAAA,EAAA;AAmeI,IAAA,MAAM,UAAA,GAAA,CAAa,UAAK,KAAA,CAAM,UAAA,KAAX,YAAyB,mBAAA,CAAoB,IAAA,CAAK,MAAM,OAAO,CAAA;AAClF,IAAA,OAAO,QAAA,CAAS,MAAM,SAAA,KAAc,MAAA,IAAA,CAAU,yCAAY,GAAA,OAAA,CAAQ,EAAA,GAAA,QAAA,CAAS,KAAA,CAAM,UAAA,KAAf,IAAA,GAAA,MAAA,GAAA,EAAA,CAA2B,GAAA,CAAA;AAAA,EAC/F;AAAA,EAEQ,0BAAA,GAA6B;AACnC,IAAA,IAAI,IAAA,CAAK,sBAAA,CAAuB,sBAAA,CAAuB,IAAI,CAAA,EAAG;AAC5D,MAAA,aAAA;AAAA,QACE,kBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM;AACpB,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AAC/C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,sBAAsB,IAAA,EAAiB;AAC7C,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,YAAA,CAAa,IAAI,CAAA;AAE9C,IAAA,MAAM,cAAA,GAAiB,UAAU,KAAA,CAAM,KAAA;AACvC,IAAA,MAAM,gBAAgB,IAAA,CAAK,SAAA;AAE3B,IAAA,IACE,cAAA,CAAe,IAAA,CAAK,IAAA,EAAK,KAAM,cAAc,IAAA,CAAK,IAAA,EAAK,IACvD,cAAA,CAAe,GAAG,IAAA,EAAK,KAAM,aAAA,CAAc,EAAA,CAAG,MAAK,EACnD;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,aAAA,CAAc,oBAAoB,0BAA0B,CAAA;AAC5D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,aAAA,GAAsB;AA7gBhC,IAAA,IAAA,EAAA;AA8gBI,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,UAAU,WAAA,EAAY;AAC3B,MAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AAAA,IACnB;AAEA,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,IAAA,CAAK,eAAe,WAAA,EAAY;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AAAA,IACxB;AAEA,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,aAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,WAAA,EAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA;AAChB,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AAIrB,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,IAAQ,CAAC,CAAC,YAAA,CAAa,IAAA,EAAM,YAAA,CAAa,KAAK,EAAE,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AAC/F,MAAA,IAAA,CAAK,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAW,CAAA;AAAA,IACnC;AAEA,IAAA,IAAA,CAAK,8BAA8B,OAAA,EAAQ;AAAA,EAC7C;AAAA,EAEO,kBAAkB,KAAA,EAAe;AAEtC,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,IAAmB,KAAA,GAAQ,CAAA,EAAG;AACtC,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AAGvB,MAAA,IAAI,KAAK,KAAA,CAAM,sBAAA,IAA0B,CAAC,IAAA,CAAK,MAAM,aAAA,EAAe;AAElE,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,IAAI,IAAA,CAAK,QAAA,IAAY,CAAC,IAAA,CAAK,MAAM,eAAA,EAAiB;AAChD,YAAA,IAAA,CAAK,UAAA,EAAW;AAAA,UAClB;AAAA,QACF,GAAG,CAAC,CAAA;AAAA,MACN;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAI,QAAQ,CAAA,EAAG;AACb,QAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA,EAEO,oBAAA,GAAuB;AAC5B,IAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AAAA,EAC3C;AAAA,EAEQ,4BAA4B,SAAA,EAA+B;AACjE,IAAA,IAAI,IAAA,CAAK,kBAAkB,SAAA,EAAW;AAEpC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,IAAA,CAAK,SAAS,WAAA,EAAY;AAAA,IAC5B;AAEA,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAA;AACrB,IAAA,IAAA,CAAK,QAAA,GAAW,SAAA,CAAU,gBAAA,CAAiB,MAAM;AAG/C,MAAA,UAAA,CAAW,MAAM,IAAA,CAAK,gBAAA,CAAiB,SAAS,GAAG,CAAC,CAAA;AAAA,IACtD,CAAC,CAAA;AAAA,EACH;AAAA,EAEO,UAAA,GAAa;AAClB,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,YAAA,CAAa,IAAI,CAAA;AAE9C,IAAA,IAAI,IAAA,CAAK,iBAAgB,EAAG;AAC1B,MAAA,IAAA,CAAK,4BAA4B,SAAS,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAAA,EACjC;AAAA,EAEQ,gBAAA,GAAmB;AA3lB7B,IAAA,IAAA,EAAA;AA4lBI,IAAA,IAAI,IAAA,CAAK,MAAM,aAAA,EAAe;AAC5B,MAAA,OAAO,KAAK,KAAA,CAAM,aAAA;AAAA,IACpB;AAEA,IAAA,OAAO,KAAK,KAAA,CAAM,sBAAA,GAAA,CAAyB,EAAA,GAAA,IAAA,CAAK,eAAA,KAAL,YAAwB,GAAA,GAAM,GAAA;AAAA,EAC3E;AAAA,EAEO,WAAA,GAAc;AAnmBvB,IAAA,IAAA,EAAA,EAAA,EAAA;AAomBI,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,cAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAgB,WAAA,EAAA;AAEhB,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,IAAA,CAAK,eAAe,WAAA,EAAY;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AAAA,IACxB;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS;AAAA,MACZ,IAAA,EAAM,EAAE,GAAA,CAAI,EAAA,GAAA,IAAA,CAAK,KAAA,CAAM,SAAX,IAAA,GAAA,EAAA,GAAmB,cAAA,EAAiB,KAAA,EAAO,YAAA,CAAa,IAAA;AAAK,KAC1E,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,iBAAiB,SAAA,EAA+B;AAhnBhE,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAknBI,IAAA,IAAI,CAAC,KAAK,KAAA,CAAM,aAAA,IAAiB,KAAK,KAAA,CAAM,sBAAA,IAA0B,CAAC,IAAA,CAAK,eAAA,EAAiB;AAC3F,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,iBAAgB,IAAK,CAAC,KAAK,SAAA,IAAa,CAAC,KAAK,eAAA,EAAiB;AACtE,MAAA,IAAA,CAAK,8BAAA,GAAiC,IAAA;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,8BAAA,GAAiC,KAAA;AAGtC,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,IACzB;AAGA,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,cAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAgB,WAAA,EAAA;AAGhB,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,2BAAA,EAA4B,EAAG;AAC1D,MAAA,aAAA,CAAc,oBAAoB,mEAAmE,CAAA;AACrG,MAAA,IAAA,CAAK,QAAA,CAAS,EAAE,IAAA,EAAM,EAAE,IAAI,EAAA,GAAA,IAAA,CAAK,KAAA,CAAM,IAAA,KAAX,IAAA,GAAA,EAAA,GAAmB,cAAA,EAAiB,KAAA,EAAO,YAAA,CAAa,OAAA,IAAW,CAAA;AAC/F,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,sBAAA,CAAuB,4CAA4C,IAAI,CAAA;AAE5E,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,KAAA;AAGzB,IAAA,IAAI,EAAC,mCAAS,MAAA,CAAA,EAAQ;AACpB,MAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,cAAa,EAAA,GAAA,IAAA,CAAK,KAAA,CAAM,UAAA,KAAX,IAAA,GAAA,EAAA,GAAyB,oBAAoB,OAAO,CAAA;AACvE,MAAA,MAAM,oBAAoB,+BAAA,CAAgC,IAAA,EAAM,UAAA,EAAY,OAAO,IAC/E,oBAAA,GACA,UAAA;AACJ,MAAA,MAAM,EAAA,GAAK,MAAM,aAAA,CAAc,iBAAA,EAAmB,KAAK,WAAW,CAAA;AAElE,MAAA,IAAA,CAAK,6BAAA,CAA8B,4BAAA,CAA6B,EAAA,CAAG,GAAA,EAAK,IAAI,CAAA;AAE5E,MAAA,MAAM,aAAa,aAAA,EAAc;AACjC,MAAA,MAAM,EAAE,SAAS,WAAA,EAAa,UAAA,KAAe,IAAA,CAAK,eAAA,CAAgB,WAAW,EAAE,CAAA;AAE/E,MAAA,aAAA,CAAc,kBAAA,EAAoB,qBAAA,EAAuB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAEvE,MAAA,IAAI,MAAA,GAAS,UAAA,CAAW,EAAA,EAAI,OAAO,CAAA;AAEnC,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAE1B,QAAA,MAAM,gBAAA,GAAmB,YAAY,GAAA,CAAI,CAAC,MAAM,UAAA,CAAW,EAAA,EAAI,CAAC,CAAC,CAAA;AAIjE,QAAA,MAAM,EAAA,GAAK,6BAA6B,UAAU,CAAA;AAIlD,QAAA,MAAA,GAAS,aAAA,CAAc,CAAC,MAAA,EAAQ,GAAG,gBAAgB,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,MAC/D;AAEA,MAAA,MAAM,aAAA,GAA+C,kBAAkB,IAAI,CAAA;AAE3E,MAAA,MAAA,GAAS,MAAA,CAAO,IAAA;AAAA,QACd,2BAAA;AAAA,UACE;AAAA,YACE,IAAA,EAAM,6BAAA;AAAA,YACN,OAAA,EAAS,OAAA;AAAA,YACT,MAAA,EAAQ,IAAA;AAAA,YACR,MAAA,EAAQ,MAAM,IAAA,CAAK,WAAA;AAAY,WACjC;AAAA,UACA;AAAA;AACF,OACF;AAEA,MAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,cAAc,CAAA;AAAA,IACvD,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,GAAG,CAAA;AAE3C,MAAA,IAAA,CAAK,cAAA,CAAe;AAAA,QAClB,GAAG,cAAA;AAAA,QACH,GAAG,KAAK,KAAA,CAAM,IAAA;AAAA,QACd,OAAO,YAAA,CAAa,KAAA;AAAA,QACpB,MAAA,EAAQ,CAAC,gBAAA,CAAiB,GAAG,CAAC;AAAA,OAC/B,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEO,MAAM,SAAA,EAAuC;AA9sBtD,IAAA,IAAA,EAAA;AA+sBI,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AAEnC,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,KAAA,CAAM,oBAAoB,CAAA,GAAI,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,GAAG,KAAA,EAAM,CAAE,CAAA;AAAA,IACrF;AAEA,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,KAAA,CAAM,mBAAmB,CAAA,GAAI,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,GAAG,KAAA,EAAM,CAAE,CAAA;AAAA,IACnF;AAEA,IAAA,KAAA,CAAM,wBAAwB,CAAA,GAAI,IAAA,CAAK,sBAAA,CAAuB,0CAA0C,IAAI,CAAA;AAC5G,IAAA,KAAA,CAAM,iBAAiB,IAAI,IAAA,CAAK,eAAA;AAChC,IAAA,KAAA,CAAM,UAAU,CAAA,CAAE,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAA,CAAM,EAAA,GAAA,IAAA,CAAK,KAAA,CAAM,IAAA,KAAX,IAAA,GAAA,EAAA,GAAmB,cAAA,EAAgB,CAAA;AAEhF,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,eAAA,CAAgB,WAA+B,EAAA,EAAqC;AAhuB9F,IAAA,IAAA,EAAA;AAiuBI,IAAA,MAAM,EAAE,WAAA,EAAa,OAAA,EAAS,eAAA,KAAoB,IAAA,CAAK,KAAA;AAEvD,IAAA,IAAI,OAAA,GAA+C;AAAA,MACjD,GAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAWD,mBAAiB,eAAe,CAAA;AAAA,MAC3C,QAAA,EAAU,UAAU,WAAA,EAAY;AAAA,MAChC,KAAA,EAAO,UAAU,KAAA,CAAM,KAAA;AAAA,MACvB,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,GAAA;AAAA,MACZ,OAAA,EAAS,UAAU,OAAO,CAAA;AAAA,MAC1B,aAAA,EAAe,KAAK,gBAAA,EAAiB;AAAA,MACrC,YAAY,IAAA,CAAK,WAAA;AAAA,MACjB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,aAAA,EAAe,KAAK,KAAA,CAAM,aAAA;AAAA,MAC1B,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,UAAU,KAAA,CAAM,IAAA;AAAA,QACtB,EAAA,EAAI,UAAU,KAAA,CAAM;AAAA,OACtB;AAAA,MACA,YAAA,EAAc,KAAK,KAAA,CAAM,YAAA;AAAA,MACzB,eAAA,EAAiB,KAAK,KAAA,CAAM,eAAA;AAAA,MAC5B,MAAA,EAAQ,UAAA,CAAW,SAAA,CAAU,IAAI,CAAA;AAAA;AAAA,MAEjC,GAAG,uBAAuB,IAAI;AAAA,KAChC;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,6BAAA,CAA8B,UAAA,EAAW;AAC9D,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,6BAAA,CAA8B,cAAA,EAAe;AAEtE,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,OAAA,GAAU,OAAA;AAAA,IACpB;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,WAAA,GAAc,WAAA;AAAA,IACxB;AAEA,IAAA,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AArwBrD,MAAA,IAAAC,GAAAA,EAAA,EAAA;AAswBM,MAAA,IACE,CAAC,MAAM,UAAA,IACN,KAAA,CAAM,WAAW,GAAA,KAAQ,EAAA,CAAG,OAC3B,EAAA,CAACA,GAAAA,GAAA,GAAG,IAAA,KAAH,IAAA,GAAA,MAAA,GAAAA,IAAS,KAAA,CAAA,IACV,qBAAA,IACA,CAAC,qBAAA,CAAsB,KAAA,CAAM,UAAU,CAAA,EACzC;AACA,QAAA,IAAI,CAAC,KAAA,CAAM,UAAA,KAAA,CAAc,EAAA,GAAA,EAAA,CAAG,IAAA,KAAH,IAAA,GAAA,MAAA,GAAA,EAAA,CAAS,KAAA,CAAA,IAAS,wBAAA,CAAyB,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AAC1F,UAAA,KAAA,CAAM,UAAA,GAAa,KAAK,KAAA,CAAM,UAAA;AAAA,QAChC,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,UAAA,GAAa,GAAG,MAAA,EAAO;AAAA,QAC/B;AAAA,MACF;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,OAAA,GAAU,sBAAA,CAAuB,IAAA,EAAM,OAAA,CAAQ,OAAO,CAAA;AAE9D,IAAA,MAAM,qBAAqB,WAAA,GAAc,WAAA,CAAY,IAAA,EAAM,WAAW,IAAI,EAAA,CAAG,QAAA;AAC7E,IAAA,MAAM,IAAA,GAAO,UAAU,iBAAA,CAAkB,SAAA,CAAU,MAAM,KAAA,EAAO,OAAA,CAAQ,eAAgB,kBAAkB,CAAA;AAI1G,IAAA,OAAA,CAAQ,aAAa,MAAA,CAAO,MAAA,CAAO,EAAC,EAAG,QAAQ,UAAA,EAAY;AAAA,MACzD,YAAY,EAAE,IAAA,EAAM,KAAK,QAAA,EAAU,KAAA,EAAO,KAAK,QAAA,EAAS;AAAA,MACxD,aAAA,EAAe,EAAE,IAAA,EAAM,IAAA,CAAK,WAAW,QAAA,EAAS,EAAG,KAAA,EAAO,IAAA,CAAK,UAAA;AAAW,KAC3E,CAAA;AAED,IAAA,OAAA,CAAQ,WAAW,IAAA,CAAK,QAAA;AACxB,IAAA,OAAA,CAAQ,aAAa,IAAA,CAAK,UAAA;AAK1B,IAAA,MAAM,gBAAA,GAAmB,UAAU,KAAA,CAAM,KAAA;AACzC,IAAA,IAAI,oBAAwC,EAAC;AAC7C,IAAA,IAAI,mBAAA,uBAA0B,GAAA,EAAI;AAClC,IAAA,KAAA,MAAW,aAAY,EAAA,GAAA,IAAA,CAAK,6BAAA,EAA8B,KAAnC,IAAA,GAAA,EAAA,GAAwC,EAAC,EAAG;AACjE,MAAA,KAAA,MAAW,EAAE,GAAA,EAAK,SAAA,MAAe,QAAA,CAAS,eAAA,CAAgB,OAAO,CAAA,EAAG;AAClE,QAAA,MAAM,SAAA,GAAYD,mBAAiB,eAAe,CAAA;AAClD,QAAA,iBAAA,CAAkB,IAAA,CAAK,EAAE,GAAG,GAAA,EAAK,WAAW,CAAA;AAC5C,QAAA,mBAAA,CAAoB,GAAA,CAAI,SAAA,EAAW,SAAA,IAAA,IAAA,GAAA,SAAA,GAAa,oBAAoB,CAAA;AAAA,MACtE;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,KAAA,GAAQ,gBAAA;AAChB,IAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,WAAA,EAAa,iBAAA,EAAmB,YAAY,mBAAA,EAAoB;AAAA,EAC7F;AAAA,EAkDQ,mBAAmB,IAAA,EAAiB;AAC1C,IAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAC/D,MAAA,IAAA,CAAK,eAAe,IAAA,CAAK,WAAA,IAAe,EAAC,EAAG,MAAA,CAAO,KAAK,iBAAiB,CAAA;AAAA,IAC3E;AAEA,IAAA,IAAI,KAAK,KAAA,CAAM,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,UAAA,EAAY;AACjD,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAA;AAAA,IACpC;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,eAAA,GAAkB;AACxB,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,KAAS,cAAA,EAAgB;AACtC,MAAA,IAAA,CAAK,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,CAAA;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,6BAAA,GAAgE;AAItE,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAI;AACtB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,UAAA,CAAW,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA,KAAM;AAC7B,MAAA,IAAI,oBAAA,CAAqB,CAAC,CAAA,IAAK,CAAC,MAAM,GAAA,CAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACxD,QAAA,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AAAA,MAC5B;AACA,MAAA,CAAA,CAAE,YAAA,CAAa,CAAC,KAAA,KAAU;AACxB,QAAA,IAAI,oBAAA,CAAqB,KAAK,CAAA,IAAK,CAAC,MAAM,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAChE,UAAA,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,WAAA,EAAa,KAAK,CAAA;AAAA,QACpC;AAAA,MACF,CAAC,CAAA;AAGD,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAA;AAAA,EAClC;AAAA,EAEQ,eAAA,GAA2B;AAr5BrC,IAAA,IAAA,EAAA;AAs5BI,IAAA,OAAA,CAAA,CAAQ,EAAA,GAAA,IAAA,CAAK,KAAA,CAAM,cAAA,KAAX,IAAA,GAAA,EAAA,GAA6B,MAAA,MAAY,MAAA;AAAA,EACnD;AAAA,EAEO,gBAAgB,QAAA,EAAyB;AAC9C,IAAA,aAAA,CAAc,oBAAoB,CAAA,iBAAA,EAAoB,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AAChF,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AAEjB,IAAA,IAAI,QAAA,IAAY,KAAK,8BAAA,EAAgC;AACnD,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEO,sBAAsB,cAAA,EAA+B;AAC1D,IAAA,aAAA,CAAc,oBAAoB,CAAA,uBAAA,EAA0B,cAAc,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AAC5F,IAAA,IAAA,CAAK,eAAA,GAAkB,cAAA;AAEvB,IAAA,IAAI,cAAA,IAAkB,KAAK,8BAAA,EAAgC;AACzD,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,OAAA,EAAiD;AA56BrF,EAAA,IAAA,EAAA,EAAA,EAAA;AA66BE,EAAA,OAAA,CAAO,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,IAAI,CAAA,KAAzC,IAAA,GAAA,MAAA,GAAA,EAAA,CAA4C,UAAA,KAA5C,IAAA,GAAA,EAAA,GAA0D,MAAA;AACnE;AAEA,SAAS,eAAe,MAAA,EAAsB;AAC5C,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,IAAI,MAAA,CAAO,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG;AACxB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;;;;"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { sceneGraph } from '../core/sceneGraph/index.js';
|
|
2
|
+
|
|
3
|
+
function getSimpleVariableNameFromDatasourceUid(uid) {
|
|
4
|
+
if (!uid) {
|
|
5
|
+
return void 0;
|
|
6
|
+
}
|
|
7
|
+
const shortMatch = uid.match(/^\$([A-Za-z0-9_]+)$/);
|
|
8
|
+
if (shortMatch) {
|
|
9
|
+
return shortMatch[1];
|
|
10
|
+
}
|
|
11
|
+
const bracketMatch = uid.match(/^\$\{([A-Za-z0-9_]+)\}$/);
|
|
12
|
+
if (bracketMatch) {
|
|
13
|
+
return bracketMatch[1];
|
|
14
|
+
}
|
|
15
|
+
return void 0;
|
|
16
|
+
}
|
|
17
|
+
function getDatasourceVariableSelectedUids(sceneObject, variableName) {
|
|
18
|
+
const variable = sceneGraph.lookupVariable(variableName, sceneObject);
|
|
19
|
+
if (!variable) {
|
|
20
|
+
return void 0;
|
|
21
|
+
}
|
|
22
|
+
const value = variable.getValue();
|
|
23
|
+
if (Array.isArray(value)) {
|
|
24
|
+
return value.filter((item) => item !== "default").map(String);
|
|
25
|
+
}
|
|
26
|
+
if (value === null || value === void 0) {
|
|
27
|
+
return void 0;
|
|
28
|
+
}
|
|
29
|
+
if (value === "default") {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
return [String(value)];
|
|
33
|
+
}
|
|
34
|
+
function getDatasourceVariableSelectionCount(sceneObject, variableName) {
|
|
35
|
+
const uids = getDatasourceVariableSelectedUids(sceneObject, variableName);
|
|
36
|
+
return uids == null ? void 0 : uids.length;
|
|
37
|
+
}
|
|
38
|
+
function expandMultiValueDatasourceUids(sceneObject, datasource) {
|
|
39
|
+
const variableName = getSimpleVariableNameFromDatasourceUid(datasource == null ? void 0 : datasource.uid);
|
|
40
|
+
if (!variableName) {
|
|
41
|
+
return void 0;
|
|
42
|
+
}
|
|
43
|
+
const uids = getDatasourceVariableSelectedUids(sceneObject, variableName);
|
|
44
|
+
if (!uids || uids.length <= 1) {
|
|
45
|
+
return void 0;
|
|
46
|
+
}
|
|
47
|
+
return uids;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export { expandMultiValueDatasourceUids, getDatasourceVariableSelectedUids, getDatasourceVariableSelectionCount, getSimpleVariableNameFromDatasourceUid };
|
|
51
|
+
//# sourceMappingURL=datasourceVariableRef.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasourceVariableRef.js","sources":["../../../src/variables/datasourceVariableRef.ts"],"sourcesContent":["import { DataSourceRef } from '@grafana/schema';\n\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObject } from '../core/types';\n\n/**\n * Parses a simple templated datasource UID (`$ds` or `${ds}`) into the variable name.\n * Returns undefined for non-template UIDs or unsupported formats.\n */\nexport function getSimpleVariableNameFromDatasourceUid(uid: string | undefined): string | undefined {\n if (!uid) {\n return undefined;\n }\n const shortMatch = uid.match(/^\\$([A-Za-z0-9_]+)$/);\n if (shortMatch) {\n return shortMatch[1];\n }\n\n const bracketMatch = uid.match(/^\\$\\{([A-Za-z0-9_]+)\\}$/);\n if (bracketMatch) {\n return bracketMatch[1];\n }\n\n return undefined;\n}\n\n/**\n * Selected datasource UIDs for a named variable, excluding the sentinel `default`.\n * Returns undefined when the variable is missing or has no value yet.\n */\nexport function getDatasourceVariableSelectedUids(\n sceneObject: SceneObject,\n variableName: string\n): string[] | undefined {\n const variable = sceneGraph.lookupVariable(variableName, sceneObject);\n if (!variable) {\n return undefined;\n }\n\n const value = variable.getValue();\n if (Array.isArray(value)) {\n return value.filter((item) => item !== 'default').map(String);\n }\n\n if (value === null || value === undefined) {\n return undefined;\n }\n\n if (value === 'default') {\n return [];\n }\n\n return [String(value)];\n}\n\nexport function getDatasourceVariableSelectionCount(\n sceneObject: SceneObject,\n variableName: string\n): number | undefined {\n const uids = getDatasourceVariableSelectedUids(sceneObject, variableName);\n return uids?.length;\n}\n\n/**\n * When `datasource` is a multi-value template variable with more than one selected UID,\n * returns those concrete UIDs for fan-out. Otherwise returns undefined so the caller\n * keeps the normal single getDataSource path (including first-value interpolation).\n */\nexport function expandMultiValueDatasourceUids(\n sceneObject: SceneObject,\n datasource: DataSourceRef | null | undefined\n): string[] | undefined {\n const variableName = getSimpleVariableNameFromDatasourceUid(datasource?.uid);\n if (!variableName) {\n return undefined;\n }\n\n const uids = getDatasourceVariableSelectedUids(sceneObject, variableName);\n if (!uids || uids.length <= 1) {\n return undefined;\n }\n\n return uids;\n}\n"],"names":[],"mappings":";;AASO,SAAS,uCAAuC,GAAA,EAA6C;AAClG,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,KAAA,CAAM,qBAAqB,CAAA;AAClD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,WAAW,CAAC,CAAA;AAAA,EACrB;AAEA,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,KAAA,CAAM,yBAAyB,CAAA;AACxD,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,aAAa,CAAC,CAAA;AAAA,EACvB;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,iCAAA,CACd,aACA,YAAA,EACsB;AACtB,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,cAAA,CAAe,YAAA,EAAc,WAAW,CAAA;AACpE,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,SAAS,QAAA,EAAS;AAChC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,OAAO,CAAC,IAAA,KAAS,SAAS,SAAS,CAAA,CAAE,IAAI,MAAM,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAU,SAAA,EAAW;AACvB,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO,CAAC,MAAA,CAAO,KAAK,CAAC,CAAA;AACvB;AAEO,SAAS,mCAAA,CACd,aACA,YAAA,EACoB;AACpB,EAAA,MAAM,IAAA,GAAO,iCAAA,CAAkC,WAAA,EAAa,YAAY,CAAA;AACxE,EAAA,OAAO,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,MAAA;AACf;AAOO,SAAS,8BAAA,CACd,aACA,UAAA,EACsB;AACtB,EAAA,MAAM,YAAA,GAAe,sCAAA,CAAuC,UAAA,IAAA,IAAA,GAAA,MAAA,GAAA,UAAA,CAAY,GAAG,CAAA;AAC3E,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,iCAAA,CAAkC,WAAA,EAAa,YAAY,CAAA;AACxE,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,IAAU,CAAA,EAAG;AAC7B,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { lastValueFrom, of, from, mergeMap,
|
|
1
|
+
import { lastValueFrom, of, from, mergeMap, catchError, forkJoin, throwError, filter, take } from 'rxjs';
|
|
2
2
|
import { v4 } from 'uuid';
|
|
3
3
|
import { VariableSort, VariableRefresh, LoadingState, CoreApp } from '@grafana/data';
|
|
4
4
|
import { sceneGraph } from '../../../core/sceneGraph/index.js';
|
|
@@ -14,6 +14,7 @@ import { SEARCH_FILTER_VARIABLE } from '../../constants.js';
|
|
|
14
14
|
import { debounce } from 'lodash';
|
|
15
15
|
import { registerQueryWithController } from '../../../querying/registerQueryWithController.js';
|
|
16
16
|
import { wrapInSafeSerializableSceneObject } from '../../../utils/wrapInSafeSerializableSceneObject.js';
|
|
17
|
+
import { expandMultiValueDatasourceUids } from '../../datasourceVariableRef.js';
|
|
17
18
|
import React from 'react';
|
|
18
19
|
|
|
19
20
|
class QueryVariable extends MultiValueVariable {
|
|
@@ -51,66 +52,79 @@ class QueryVariable extends MultiValueVariable {
|
|
|
51
52
|
return of([]);
|
|
52
53
|
}
|
|
53
54
|
this.setState({ loading: true, error: null });
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}),
|
|
79
|
-
toMetricFindValues(),
|
|
80
|
-
mergeMap((values) => {
|
|
81
|
-
let regex = "";
|
|
82
|
-
if (this.state.regex) {
|
|
83
|
-
regex = sceneGraph.interpolate(this, this.state.regex, void 0, "regex");
|
|
84
|
-
}
|
|
85
|
-
let options = metricNamesToVariableValues({
|
|
86
|
-
variableRegEx: regex,
|
|
87
|
-
variableRegexApplyTo: this.state.regexApplyTo,
|
|
88
|
-
sort: this.state.sort,
|
|
89
|
-
metricNames: values
|
|
90
|
-
});
|
|
91
|
-
if (this.state.staticOptions) {
|
|
92
|
-
const customOptions = this.state.staticOptions;
|
|
93
|
-
options = options.filter((option) => !customOptions.find((custom) => custom.value === option.value));
|
|
94
|
-
if (this.state.staticOptionsOrder === "after") {
|
|
95
|
-
options.push(...customOptions);
|
|
96
|
-
} else if (this.state.staticOptionsOrder === "sorted") {
|
|
97
|
-
options = sortVariableValues(options.concat(customOptions), this.state.sort);
|
|
98
|
-
} else {
|
|
99
|
-
options.unshift(...customOptions);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return of(options);
|
|
103
|
-
}),
|
|
104
|
-
catchError((error) => {
|
|
105
|
-
if (error.cancelled) {
|
|
106
|
-
return of([]);
|
|
107
|
-
}
|
|
108
|
-
return throwError(() => error);
|
|
109
|
-
})
|
|
110
|
-
);
|
|
55
|
+
const fanOutUids = expandMultiValueDatasourceUids(this, this.state.datasource);
|
|
56
|
+
const datasourceRefs = fanOutUids ? fanOutUids.map((uid) => ({ ...this.state.datasource, uid })) : [this.state.datasource];
|
|
57
|
+
const scopedSceneObject = {
|
|
58
|
+
__sceneObject: wrapInSafeSerializableSceneObject(this)
|
|
59
|
+
};
|
|
60
|
+
const perDatasource = datasourceRefs.map(
|
|
61
|
+
(datasource) => from(getDataSource(datasource, scopedSceneObject)).pipe(
|
|
62
|
+
mergeMap((ds) => this.runMetricFindForDatasource(ds, args)),
|
|
63
|
+
catchError((error) => {
|
|
64
|
+
if (error == null ? void 0 : error.cancelled) {
|
|
65
|
+
return of({ values: [], error: void 0 });
|
|
66
|
+
}
|
|
67
|
+
return of({ values: [], error });
|
|
68
|
+
})
|
|
69
|
+
)
|
|
70
|
+
);
|
|
71
|
+
return forkJoin(perDatasource).pipe(
|
|
72
|
+
mergeMap((results) => {
|
|
73
|
+
const values = results.flatMap((result) => result.values);
|
|
74
|
+
const errors = results.map((result) => result.error).filter(Boolean);
|
|
75
|
+
if (values.length === 0 && errors.length > 0) {
|
|
76
|
+
return throwError(() => errors[0]);
|
|
77
|
+
}
|
|
78
|
+
return of(this.metricFindValuesToOptions(values));
|
|
111
79
|
})
|
|
112
80
|
);
|
|
113
81
|
}
|
|
82
|
+
runMetricFindForDatasource(ds, args) {
|
|
83
|
+
const runner = createQueryVariableRunner(ds);
|
|
84
|
+
const target = runner.getTarget(this);
|
|
85
|
+
const request = this.getRequest(target, args.searchFilter);
|
|
86
|
+
return runner.runRequest({ variable: this, searchFilter: args.searchFilter }, request).pipe(
|
|
87
|
+
registerQueryWithController({
|
|
88
|
+
type: "QueryVariable/getValueOptions",
|
|
89
|
+
request,
|
|
90
|
+
origin: this
|
|
91
|
+
}),
|
|
92
|
+
filter((data) => data.state === LoadingState.Done || data.state === LoadingState.Error),
|
|
93
|
+
take(1),
|
|
94
|
+
mergeMap((data) => {
|
|
95
|
+
if (data.state === LoadingState.Error) {
|
|
96
|
+
return throwError(() => data.error);
|
|
97
|
+
}
|
|
98
|
+
return of(data);
|
|
99
|
+
}),
|
|
100
|
+
toMetricFindValues(),
|
|
101
|
+
mergeMap((values) => of({ values, error: void 0 }))
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
metricFindValuesToOptions(values) {
|
|
105
|
+
let regex = "";
|
|
106
|
+
if (this.state.regex) {
|
|
107
|
+
regex = sceneGraph.interpolate(this, this.state.regex, void 0, "regex");
|
|
108
|
+
}
|
|
109
|
+
let options = metricNamesToVariableValues({
|
|
110
|
+
variableRegEx: regex,
|
|
111
|
+
variableRegexApplyTo: this.state.regexApplyTo,
|
|
112
|
+
sort: this.state.sort,
|
|
113
|
+
metricNames: values
|
|
114
|
+
});
|
|
115
|
+
if (this.state.staticOptions) {
|
|
116
|
+
const customOptions = this.state.staticOptions;
|
|
117
|
+
options = options.filter((option) => !customOptions.find((custom) => custom.value === option.value));
|
|
118
|
+
if (this.state.staticOptionsOrder === "after") {
|
|
119
|
+
options.push(...customOptions);
|
|
120
|
+
} else if (this.state.staticOptionsOrder === "sorted") {
|
|
121
|
+
options = sortVariableValues(options.concat(customOptions), this.state.sort);
|
|
122
|
+
} else {
|
|
123
|
+
options.unshift(...customOptions);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return options;
|
|
127
|
+
}
|
|
114
128
|
getRequest(target, searchFilter) {
|
|
115
129
|
const scopedVars = {
|
|
116
130
|
__sceneObject: wrapInSafeSerializableSceneObject(this)
|