diff --git a/public/app/features/alerting/unified/hooks/useFilteredRules.ts b/public/app/features/alerting/unified/hooks/useFilteredRules.ts index fb78380b180..c7cc01818be 100644 --- a/public/app/features/alerting/unified/hooks/useFilteredRules.ts +++ b/public/app/features/alerting/unified/hooks/useFilteredRules.ts @@ -8,7 +8,12 @@ import { CombinedRuleGroup, CombinedRuleNamespace, Rule } from 'app/types/unifie import { PromRuleType, RulerGrafanaRuleDTO, isPromAlertingRuleState } from 'app/types/unified-alerting-dto'; import { logError } from '../Analytics'; -import { RulesFilter, applySearchFilterToQuery, getSearchFilterFromQuery } from '../search/rulesSearchParser'; +import { + RuleSource, + RulesFilter, + applySearchFilterToQuery, + getSearchFilterFromQuery, +} from '../search/rulesSearchParser'; import { labelsMatchMatchers, matcherToMatcherField } from '../utils/alertmanager'; import { Annotation } from '../utils/constants'; import { isCloudRulesSource } from '../utils/datasource'; @@ -183,6 +188,15 @@ const reduceGroups = (filterState: RulesFilter) => { filteredRules = fuzzyFilter(filteredRules, (r) => r.name, ruleNameQuery); } + // Filter by rule source at rule-level (Grafana-managed vs datasource-managed) + if (filterState.ruleSource) { + const grafanaSelected = filterState.ruleSource === RuleSource.Grafana; + filteredRules = filteredRules.filter((rule) => { + const isGrafana = !!(rule.rulerRule && rulerRuleType.grafana.rule(rule.rulerRule)); + return grafanaSelected && isGrafana; + }); + } + filteredRules = filteredRules.filter((rule) => { const promRuleDefition = rule.promRule; @@ -201,6 +215,7 @@ const reduceGroups = (filterState: RulesFilter) => { 'dashboardUid', 'plugins', 'contactPoint', + 'ruleSource', ]) .omitBy(isEmpty) .mapValues(() => false) @@ -332,6 +347,7 @@ const RULES_FILTER_KEYS: Set = new Set([ 'dashboardUid', 'plugins', 'contactPoint', + 'ruleSource', ]); const isRuleFilterKey = (key: string): key is keyof RulesFilter => RULES_FILTER_KEYS.has(key as keyof RulesFilter); diff --git a/public/app/features/alerting/unified/rule-list/filter/RulesFilter.v2.tsx b/public/app/features/alerting/unified/rule-list/filter/RulesFilter.v2.tsx index e2bda7ee725..6991a36b3dd 100644 --- a/public/app/features/alerting/unified/rule-list/filter/RulesFilter.v2.tsx +++ b/public/app/features/alerting/unified/rule-list/filter/RulesFilter.v2.tsx @@ -40,7 +40,7 @@ import { useNamespaceAndGroupOptions, } from '../../components/rules/Filter/useRuleFilterAutocomplete'; import { useRulesFilter } from '../../hooks/useFilteredRules'; -import { RuleHealth, getSearchFilterFromQuery } from '../../search/rulesSearchParser'; +import { RuleHealth, RuleSource, getSearchFilterFromQuery } from '../../search/rulesSearchParser'; import { RulesFilterProps } from './RulesFilter'; import { @@ -53,6 +53,8 @@ import { const canRenderContactPointSelector = contextSrv.hasPermission(AccessControlAction.AlertingReceiversRead); +const radioGroupCompactClass = css({ width: 'max-content' }); + type SearchQueryForm = { query: string; }; @@ -298,6 +300,7 @@ const FilterOptions = ({ onSubmit, onClear, pluginsFilterEnabled }: FilterOption /> {canRenderContactPointSelector && } + @@ -570,6 +573,8 @@ function RuleStateField() { ]} value={field.value} onChange={field.onChange} + fullWidth={false} + className={radioGroupCompactClass} /> )} /> @@ -596,6 +601,39 @@ function RuleTypeField() { ]} value={field.value} onChange={field.onChange} + fullWidth={false} + className={radioGroupCompactClass} + /> + )} + /> + + ); +} + +function RuleSourceField() { + const { control } = useFormContext(); + return ( + <> + + ( + + options={[ + { label: t('common.all', 'All'), value: null }, + { label: t('alerting.rules-filter.rule-source.grafana', 'Grafana managed'), value: RuleSource.Grafana }, + { + label: t('alerting.rules-filter.rule-source.datasource', 'Data source managed'), + value: RuleSource.DataSource, + }, + ]} + value={field.value} + onChange={field.onChange} + fullWidth={false} + className={radioGroupCompactClass} /> )} /> @@ -623,6 +661,8 @@ function RuleHealthField() { ]} value={field.value} onChange={field.onChange} + fullWidth={false} + className={radioGroupCompactClass} /> )} /> @@ -648,6 +688,8 @@ function PluginsField() { ]} value={field.value} onChange={field.onChange} + fullWidth={false} + className={radioGroupCompactClass} /> )} /> diff --git a/public/app/features/alerting/unified/rule-list/filter/types.ts b/public/app/features/alerting/unified/rule-list/filter/types.ts index dbfa6ad59db..a42b2a6cc75 100644 --- a/public/app/features/alerting/unified/rule-list/filter/types.ts +++ b/public/app/features/alerting/unified/rule-list/filter/types.ts @@ -1,6 +1,6 @@ import { PromAlertingRuleState, PromRuleType } from 'app/types/unified-alerting-dto'; -import type { RuleHealth } from '../../search/rulesSearchParser'; +import type { RuleHealth, RuleSource } from '../../search/rulesSearchParser'; export type AdvancedFilters = { namespace?: string | null; @@ -14,4 +14,5 @@ export type AdvancedFilters = { dashboardUid?: string; plugins?: 'show' | 'hide'; contactPoint?: string | null; + ruleSource?: RuleSource | null; }; diff --git a/public/app/features/alerting/unified/rule-list/filter/utils.ts b/public/app/features/alerting/unified/rule-list/filter/utils.ts index 798a4b0bade..7d370b75bfa 100644 --- a/public/app/features/alerting/unified/rule-list/filter/utils.ts +++ b/public/app/features/alerting/unified/rule-list/filter/utils.ts @@ -16,6 +16,7 @@ export function formAdvancedFiltersToRuleFilter(values: AdvancedFilters): RulesF ruleState: values.ruleState === '*' ? undefined : values.ruleState, ruleType: values.ruleType === '*' ? undefined : values.ruleType, plugins: values.plugins === 'show' ? undefined : 'hide', + ruleSource: values.ruleSource ?? undefined, }; } @@ -31,6 +32,7 @@ export const emptyAdvancedFilters: AdvancedFilters = { dashboardUid: undefined, plugins: 'show', contactPoint: null, + ruleSource: null, }; export function searchQueryToDefaultValues(filterState: RulesFilter): AdvancedFilters { @@ -46,6 +48,7 @@ export function searchQueryToDefaultValues(filterState: RulesFilter): AdvancedFi dashboardUid: filterState.dashboardUid, plugins: filterState.plugins ?? 'show', contactPoint: filterState.contactPoint ?? null, + ruleSource: filterState.ruleSource ?? null, }; } diff --git a/public/app/features/alerting/unified/rule-list/hooks/useFilteredRulesIterator.ts b/public/app/features/alerting/unified/rule-list/hooks/useFilteredRulesIterator.ts index 216d59c10a7..4139e4e2a62 100644 --- a/public/app/features/alerting/unified/rule-list/hooks/useFilteredRulesIterator.ts +++ b/public/app/features/alerting/unified/rule-list/hooks/useFilteredRulesIterator.ts @@ -1,7 +1,7 @@ -import { AsyncIterableX, empty, from } from 'ix/asynciterable'; +import { AsyncIterableX, from } from 'ix/asynciterable'; +import { empty } from 'ix/asynciterable/empty'; import { merge } from 'ix/asynciterable/merge'; import { catchError, concatMap, withAbort } from 'ix/asynciterable/operators'; -import { isEmpty } from 'lodash'; import { DataSourceRuleGroupIdentifier, @@ -15,7 +15,7 @@ import { PromRuleGroupDTO, } from 'app/types/unified-alerting-dto'; -import { RulesFilter } from '../../search/rulesSearchParser'; +import { RuleSource, RulesFilter } from '../../search/rulesSearchParser'; import { getDataSourceByUid, getDatasourceAPIUid, @@ -63,7 +63,7 @@ export function useFilteredRulesIteratorProvider() { const normalizedFilterState = normalizeFilterState(filterState); const hasDataSourceFilterActive = Boolean(filterState.dataSourceNames.length); - const grafanaRulesGenerator = from( + const grafanaRulesGenerator: AsyncIterableX = from( grafanaGroupsGenerator(groupLimit, { contactPoint: filterState.contactPoint ?? undefined, health: filterState.ruleHealth ? [filterState.ruleHealth] : [], @@ -74,9 +74,9 @@ export function useFilteredRulesIteratorProvider() { concatMap((groups) => groups .filter((group) => groupFilter(group, normalizedFilterState)) - .flatMap((group) => group.rules.map((rule) => [group, rule] as const)) - .filter(([, rule]) => ruleFilter(rule, normalizedFilterState)) - .map(([group, rule]) => mapGrafanaRuleToRuleWithOrigin(group, rule)) + .flatMap((group) => group.rules.map((rule) => ({ group, rule }))) + .filter(({ rule }) => ruleFilter(rule, normalizedFilterState)) + .map(({ group, rule }) => mapGrafanaRuleToRuleWithOrigin(group, rule)) ), catchError(() => empty()) ); @@ -86,38 +86,57 @@ export function useFilteredRulesIteratorProvider() { ? getRulesSourcesFromFilter(filterState) : allExternalRulesSources; - // If no data sources, just return Grafana rules - if (isEmpty(externalRulesSourcesToFetchFrom)) { + if (filterState.ruleSource === RuleSource.Grafana) { return { iterable: grafanaRulesGenerator, abortController }; } - // Create a generator for each data source - const dataSourceGenerators = externalRulesSourcesToFetchFrom.map((dataSourceIdentifier) => { - const promGroupsGenerator = from(prometheusGroupsGenerator(dataSourceIdentifier, groupLimit)).pipe( - withAbort(abortController.signal), - concatMap((groups) => - groups - .filter((group) => groupFilter(group, normalizedFilterState)) - .flatMap((group) => group.rules.map((rule) => [group, rule] as const)) - .filter(([, rule]) => ruleFilter(rule, normalizedFilterState)) - .map(([group, rule]) => mapRuleToRuleWithOrigin(dataSourceIdentifier, group, rule)) - ), - catchError(() => empty()) - ); + const dataSourceGenerators: Array> = externalRulesSourcesToFetchFrom.map( + (dataSourceIdentifier) => { + const promGroupsGenerator: AsyncIterableX = from( + prometheusGroupsGenerator(dataSourceIdentifier, groupLimit) + ).pipe( + withAbort(abortController.signal), + concatMap((groups) => + groups + .filter((group) => groupFilter(group, normalizedFilterState)) + .flatMap((group) => group.rules.map((rule) => ({ group, rule }))) + .filter(({ rule }) => ruleFilter(rule, normalizedFilterState)) + .map(({ group, rule }) => mapRuleToRuleWithOrigin(dataSourceIdentifier, group, rule)) + ), + catchError(() => empty()) + ); - return promGroupsGenerator; - }); + return promGroupsGenerator; + } + ); - // Merge all generators - return { - iterable: merge(grafanaRulesGenerator, ...dataSourceGenerators), - abortController, - }; + const iterablesToMerge: Array> = []; + const includeGrafana = filterState.ruleSource !== 'datasource'; + const includeExternal = true; + + if (includeGrafana) { + iterablesToMerge.push(grafanaRulesGenerator); + } + if (includeExternal) { + iterablesToMerge.push(...dataSourceGenerators); + } + + const iterable = mergeIterables(iterablesToMerge); + + return { iterable, abortController }; }; return getFilteredRulesIterable; } +function mergeIterables(iterables: Array>): AsyncIterableX { + if (iterables.length === 0) { + return empty(); + } + const [firstIterable, ...rest] = iterables; + return merge(firstIterable, ...rest); +} + /** * Finds all data sources that the user might want to filter by. * Only allows Prometheus and Loki data source types. diff --git a/public/app/features/alerting/unified/search/rulesSearchParser.ts b/public/app/features/alerting/unified/search/rulesSearchParser.ts index 49ef0d8fbb4..192ef6e368d 100644 --- a/public/app/features/alerting/unified/search/rulesSearchParser.ts +++ b/public/app/features/alerting/unified/search/rulesSearchParser.ts @@ -1,5 +1,5 @@ import { PromAlertingRuleState, PromRuleType, isPromAlertingRuleState } from '../../../../types/unified-alerting-dto'; -import { getRuleHealth, isPromRuleType } from '../utils/rules'; +import { getRuleHealth, getRuleSource, isPromRuleType } from '../utils/rules'; import * as terms from './search.terms'; import { @@ -23,6 +23,7 @@ export interface RulesFilter { dashboardUid?: string; plugins?: 'hide'; contactPoint?: string | null; + ruleSource?: RuleSource; } const filterSupportedTerms: FilterSupportedTerm[] = [ @@ -37,6 +38,7 @@ const filterSupportedTerms: FilterSupportedTerm[] = [ FilterSupportedTerm.dashboard, FilterSupportedTerm.plugins, FilterSupportedTerm.contactPoint, + FilterSupportedTerm.source, ]; export enum RuleHealth { @@ -46,6 +48,11 @@ export enum RuleHealth { Unknown = 'unknown', } +export enum RuleSource { + Grafana = 'grafana', + DataSource = 'datasource', +} + // Define how to map parsed tokens into the filter object export function getSearchFilterFromQuery(query: string): RulesFilter { const filter: RulesFilter = { labels: [], freeFormWords: [], dataSourceNames: [] }; @@ -62,6 +69,7 @@ export function getSearchFilterFromQuery(query: string): RulesFilter { [terms.DashboardToken]: (value) => (filter.dashboardUid = value), [terms.PluginsToken]: (value) => (filter.plugins = value === 'hide' ? value : undefined), [terms.ContactPointToken]: (value) => (filter.contactPoint = value), + [terms.RuleSourceToken]: (value) => (filter.ruleSource = getRuleSource(value)), [terms.FreeFormExpression]: (value) => filter.freeFormWords.push(value), }; @@ -107,6 +115,9 @@ export function applySearchFilterToQuery(query: string, filter: RulesFilter): st if (filter.plugins) { filterStateArray.push({ type: terms.PluginsToken, value: filter.plugins }); } + if (filter.ruleSource) { + filterStateArray.push({ type: terms.RuleSourceToken, value: filter.ruleSource }); + } if (filter.freeFormWords) { filterStateArray.push(...filter.freeFormWords.map((word) => ({ type: terms.FreeFormExpression, value: word }))); } diff --git a/public/app/features/alerting/unified/search/search.grammar b/public/app/features/alerting/unified/search/search.grammar index 6561fc84788..01d8ce8211f 100644 --- a/public/app/features/alerting/unified/search/search.grammar +++ b/public/app/features/alerting/unified/search/search.grammar @@ -1,6 +1,6 @@ @top AlertRuleSearch { expression+ } -@dialects { dataSourceFilter, nameSpaceFilter, labelFilter, groupFilter, ruleFilter, stateFilter, typeFilter, healthFilter, dashboardFilter, pluginsFilter, contactPointFilter } +@dialects { dataSourceFilter, nameSpaceFilter, labelFilter, groupFilter, ruleFilter, stateFilter, typeFilter, healthFilter, dashboardFilter, pluginsFilter, contactPointFilter, sourceFilter } expression { (FilterExpression | FreeFormExpression) expression } @@ -17,7 +17,8 @@ FilterExpression { filter | filter | filter | - filter + filter | + filter } filter { token FilterValue } @@ -47,6 +48,7 @@ filter { token FilterValue } DashboardToken[@dialect=dashboardFilter] { filterToken<"dashboard"> } PluginsToken[@dialect=pluginsFilter] { filterToken<"plugins"> } ContactPointToken[@dialect=contactPointFilter] { filterToken<"contactPoint"> } + RuleSourceToken[@dialect=sourceFilter] { filterToken<"source"> } @precedence { DataSourceToken, word } @precedence { NameSpaceToken, word } @@ -59,5 +61,6 @@ filter { token FilterValue } @precedence { DashboardToken, word } @precedence { PluginsToken, word } @precedence { ContactPointToken, word } + @precedence { RuleSourceToken, word } } diff --git a/public/app/features/alerting/unified/search/search.js b/public/app/features/alerting/unified/search/search.js index b9b51e632d5..00eab88313f 100644 --- a/public/app/features/alerting/unified/search/search.js +++ b/public/app/features/alerting/unified/search/search.js @@ -3,31 +3,32 @@ import { LRParser } from '@lezer/lr'; export const parser = LRParser.deserialize({ version: 14, states: - "!vOQOPOOO{OPO'#CkOOOO'#Ck'#CkOQOPO'#CoOOOO'#Cl'#ClQQOPOOO!yOQO'#C^O#OOPO'#CmO#TOPO,59VOOOO,59Z,59ZOOOO-E6j-E6jOOOO,58x,58xOOOO,59X,59XOOOO-E6k-E6k", + "!vOQOPOOO!OOPO'#ClOOOO'#Cl'#ClOQOPO'#CpOOOO'#Cm'#CmQQOPOOO#POQO'#C^O#UOPO'#CnO#ZOPO,59WOOOO,59[,59[OOOO-E6k-E6kOOOO,58x,58xOOOO,59Y,59YOOOO-E6l-E6l", stateData: - '$t~ORUOTUOUUOVUOWUOXUOYUOZUO[UO]UO^UOdPOfQO~OeVOR_XT_XU_XV_XW_XX_XY_XZ_X[_X]_X^_Xd_Xf_X~OSZO~Od[O~OeVOR_aT_aU_aV_aW_aX_aY_aZ_a[_a]_a^_ad_af_a~OR~T~U~V~W~Y~Z~[~]~^~R^][ZYXWVUTd~', - goto: '}dPPePPPPPPPPPPPPejpPvVRORTQTORYTQWPR]WSSOTRXR', + '%Q~ORUOTUOUUOVUOWUOXUOYUOZUO[UO]UO^UO_UOePOgQO~OfVOR`XT`XU`XV`XW`XX`XY`XZ`X[`X]`X^`X_`Xe`Xg`X~OSZO~Oe[O~OfVOR`aT`aU`aV`aW`aX`aY`aZ`a[`a]`a^`a_`ae`ag`a~OR~T~U~V~W~Y~Z~[~]~^~_~R_^][ZYXWVUTe~', + goto: '!OePPfPPPPPPPPPPPPPfkqPwVRORTQTORYTQWPR]WSSOTRXR', nodeNames: - '⚠ AlertRuleSearch FilterExpression DataSourceToken FilterValue NameSpaceToken LabelToken GroupToken RuleToken StateToken TypeToken HealthToken DashboardToken PluginsToken ContactPointToken FreeFormExpression', - maxTerm: 22, + '⚠ AlertRuleSearch FilterExpression DataSourceToken FilterValue NameSpaceToken LabelToken GroupToken RuleToken StateToken TypeToken HealthToken DashboardToken PluginsToken ContactPointToken RuleSourceToken FreeFormExpression', + maxTerm: 23, skippedNodes: [0], repeatNodeCount: 2, tokenData: - "$ nRRtqr#crs&ost#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]+q!]#V#c#V#W-T#W#X@m#X#Z#c#Z#[!/S#[#]!7|#]#`#c#`#a!B`#a#b#c#b#c!KY#c#d#c#d#e#,W#e#f#c#f#g#8S#g#h#?d#h#i#H^#i$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#jcSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cQ$zcSQqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uQ&YP;=`<%l$uQ&`P;=`;NQ$uR&fP;=`<%l#cR&lP;=`;NQ#cR&rrX^(|pq(|qr(|st(|tu(|uv(|vw(|wx(|xy(|yz(|z{(|{|(||!P(|!P!Q(|!Q![(|![!](|!]#y(|#y#z(|#z$f(|$f$g(|$g#BY(|#BY#BZ(|#BZ$Ch(|$IS$I_(|$I|$JO(|$JT$JU(|$JU$KV(|$KV$KW(|$KW&FU(|&FU&FV(|&FV;'S(|;'S;(d+e;(d;(e+k<%lO(|R)PsX^(|pq(|qr(|rs+^st(|tu(|uv(|vw(|wx(|xy(|yz(|z{(|{|(||!P(|!P!Q(|!Q![(|![!](|!]#y(|#y#z(|#z$f(|$f$g(|$g#BY(|#BY#BZ(|#BZ$Ch(|$IS$I_(|$I|$JO(|$JT$JU(|$JU$KV(|$KV$KW(|$KW&FU(|&FU&FV(|&FV;'S(|;'S;(d+e;(d;(e+k<%lO(|R+eOSQfPR+hP;=`<%l(|R+nP;=`;NQ(|R+xcSQePqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR-[eSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#c#c#c#d.m#d$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR.teSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#b#c#b#c0V#c$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR0^eSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#h#c#h#i1o#i$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR1veSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#U3X#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR3`eSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#V#c#V#W4q#W$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR4xeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#h#c#h#i6Z#i$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR6beSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]!r#c!r!s7s!s$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR7zeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#c#c#c#d9]#d$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR9deSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#]#c#]#^:u#^$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR:|eSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#b#c#b#c<_#c$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cROcSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]?Z!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR?bcSQ^Pqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR@teSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#UBV#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cRB^fSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#g#c#g#hCr#h#i! n#i$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cRCyeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#[#c#[#]E[#]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cREceSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#U#c#U#VFt#V$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cRF{eSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#c#c#c#dH^#d$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cRHeeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#UIv#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cRI}eSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#f#c#f#gK`#g$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cRKgeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#W#c#W#XLx#X$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cRMPcSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]N[!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cRNccSQ[Pqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR! ueSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#U!#W#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!#_eSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#g#c#g#h!$p#h$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!$weSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#c#c#c#d!&Y#d$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!&aeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#i#c#i#j!'r#j$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!'yeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#f#c#f#g!)[#g$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!)ceSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#V#c#V#W!*t#W$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!*{eSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y!,^#Y$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!,ecSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]!-p!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!-wcSQRPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR!/ZeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#f#c#f#g!0l#g$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!0seSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#c#c#c#d!2U#d$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!2]eSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#i#c#i#j!3n#j$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!3ueSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#d#c#d#e!5W#e$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!5_cSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]!6j!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!6qcSQVPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR!8TeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y!9f#Y$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!9meSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#U!;O#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!;VeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#`#c#`#a!Q#i$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!>XeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#[#c#[#]!?j#]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!?qcSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]!@|!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!ATcSQZPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR!BgeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#U!Cx#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!DPeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#U#c#U#V!Eb#V$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!EieSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y!Fz#Y$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!GReSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#`#c#`#a!Hd#a$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!HkcSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]!Iv!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!I}cSQUPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR!KaeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#U!Lr#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!LyeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#a#c#a#b!N[#b$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!NceSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y# t#Y$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR# {eSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#g#c#g#h##^#h$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR##eeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#d#c#d#e#$v#e$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#$}eSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#U#&`#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#&geSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#V#c#V#W#'x#W$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#(PeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y#)b#Y$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#)icSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]#*t!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#*{cSQTPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR#,_eSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#`#c#`#a#-p#a$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#-weSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#i#c#i#j#/Y#j$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#/aeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#Z#c#Z#[#0r#[$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#0yeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#]#c#]#^#2[#^$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#2ceSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#b#c#b#c#3t#c$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#3{eSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#g#c#g#h#5^#h$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#5ecSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]#6p!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#6wcSQ]Pqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR#8ZeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#i#c#i#j#9l#j$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#9seSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#`#c#`#a#;U#a$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#;]eSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y#Q!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#>XcSQWPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR#?keSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#h#c#h#i#@|#i$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#ATeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#U#Bf#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#BmeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#h#c#h#i#DO#i$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#DVeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y#Eh#Y$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#EocSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]#Fz!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#GRcSQXPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR#HeeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#m#c#m#n#Iv#n$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#I}eSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#d#c#d#e#K`#e$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#KgeSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y#Lx#Y$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#MPcSQdPqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]#N[!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#NccSQYPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$u", + "$*nRRtqr#crs&ost#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]+q!]#V#c#V#W-T#W#X@m#X#Z#c#Z#[!/S#[#]!7|#]#`#c#`#a!B`#a#b#c#b#c!KY#c#d#c#d#e#,W#e#f#c#f#g#8S#g#h#?d#h#i$#^#i$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#jcSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cQ$zcSQqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uQ&YP;=`<%l$uQ&`P;=`;NQ$uR&fP;=`<%l#cR&lP;=`;NQ#cR&rrX^(|pq(|qr(|st(|tu(|uv(|vw(|wx(|xy(|yz(|z{(|{|(||!P(|!P!Q(|!Q![(|![!](|!]#y(|#y#z(|#z$f(|$f$g(|$g#BY(|#BY#BZ(|#BZ$Ch(|$IS$I_(|$I|$JO(|$JT$JU(|$JU$KV(|$KV$KW(|$KW&FU(|&FU&FV(|&FV;'S(|;'S;(d+e;(d;(e+k<%lO(|R)PsX^(|pq(|qr(|rs+^st(|tu(|uv(|vw(|wx(|xy(|yz(|z{(|{|(||!P(|!P!Q(|!Q![(|![!](|!]#y(|#y#z(|#z$f(|$f$g(|$g#BY(|#BY#BZ(|#BZ$Ch(|$IS$I_(|$I|$JO(|$JT$JU(|$JU$KV(|$KV$KW(|$KW&FU(|&FU&FV(|&FV;'S(|;'S;(d+e;(d;(e+k<%lO(|R+eOSQgPR+hP;=`<%l(|R+nP;=`;NQ(|R+xcSQfPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR-[eSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#c#c#c#d.m#d$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR.teSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#b#c#b#c0V#c$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR0^eSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#h#c#h#i1o#i$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR1veSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#U3X#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR3`eSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#V#c#V#W4q#W$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR4xeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#h#c#h#i6Z#i$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR6beSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]!r#c!r!s7s!s$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR7zeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#c#c#c#d9]#d$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR9deSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#]#c#]#^:u#^$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR:|eSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#b#c#b#c<_#c$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cROcSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]?Z!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR?bcSQ^Pqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR@teSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#UBV#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cRB^fSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#g#c#g#hCr#h#i! n#i$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cRCyeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#[#c#[#]E[#]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cREceSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#U#c#U#VFt#V$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cRF{eSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#c#c#c#dH^#d$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cRHeeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#UIv#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cRI}eSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#f#c#f#gK`#g$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cRKgeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#W#c#W#XLx#X$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cRMPcSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]N[!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cRNccSQ[Pqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR! ueSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#U!#W#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!#_eSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#g#c#g#h!$p#h$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!$weSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#c#c#c#d!&Y#d$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!&aeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#i#c#i#j!'r#j$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!'yeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#f#c#f#g!)[#g$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!)ceSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#V#c#V#W!*t#W$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!*{eSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y!,^#Y$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!,ecSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]!-p!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!-wcSQRPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR!/ZeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#f#c#f#g!0l#g$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!0seSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#c#c#c#d!2U#d$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!2]eSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#i#c#i#j!3n#j$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!3ueSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#d#c#d#e!5W#e$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!5_cSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]!6j!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!6qcSQVPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR!8TeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y!9f#Y$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!9meSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#U!;O#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!;VeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#`#c#`#a!Q#i$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!>XeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#[#c#[#]!?j#]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!?qcSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]!@|!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!ATcSQZPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR!BgeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#U!Cx#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!DPeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#U#c#U#V!Eb#V$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!EieSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y!Fz#Y$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!GReSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#`#c#`#a!Hd#a$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!HkcSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]!Iv!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!I}cSQUPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR!KaeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#U!Lr#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!LyeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#a#c#a#b!N[#b$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR!NceSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y# t#Y$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR# {eSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#g#c#g#h##^#h$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR##eeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#d#c#d#e#$v#e$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#$}eSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#U#&`#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#&geSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#V#c#V#W#'x#W$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#(PeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y#)b#Y$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#)icSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]#*t!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#*{cSQTPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR#,_eSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#`#c#`#a#-p#a$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#-weSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#i#c#i#j#/Y#j$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#/aeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#Z#c#Z#[#0r#[$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#0yeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#]#c#]#^#2[#^$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#2ceSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#b#c#b#c#3t#c$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#3{eSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#g#c#g#h#5^#h$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#5ecSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]#6p!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#6wcSQ]Pqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR#8ZeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#i#c#i#j#9l#j$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#9seSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#`#c#`#a#;U#a$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#;]eSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y#Q!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#>XcSQWPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR#?kgSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#c#c#c#d#AS#d#h#c#h#i#I|#i$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#AZeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#i#c#i#j#Bl#j$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#BseSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#f#c#f#g#DU#g$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#D]eSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#V#c#V#W#En#W$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#EueSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y#GW#Y$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#G_cSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]#Hj!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#HqcSQ_Pqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR#JTeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#T#c#T#U#Kf#U$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#KmeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#h#c#h#i#MO#i$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#MVeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y#Nh#Y$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR#NocSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$ z!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR$!RcSQXPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$uR$#eeSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#m#c#m#n$$v#n$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR$$}eSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#d#c#d#e$&`#e$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR$&geSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$u!]#X#c#X#Y$'x#Y$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR$(PcSQePqr#cst#ctu#cuv#cvw#cwx#cxy#cyz#cz{#c{|#c|!P#c!P!Q#c!Q![#c![!]$)[!]$Ch#c$JU;'S#c;'S;(d&c;(d;(e&i<%lO#cR$)ccSQYPqr$ust$utu$uuv$uvw$uwx$uxy$uyz$uz{$u{|$u|!P$u!P!Q$u!Q![$u![!]$u!]$Ch$u$JU;'S$u;'S;(d&V;(d;(e&]<%lO$u", tokenizers: [0, 1], topRules: { AlertRuleSearch: [0, 1] }, dialects: { - dataSourceFilter: 141, - nameSpaceFilter: 143, - labelFilter: 145, - groupFilter: 147, - ruleFilter: 149, - stateFilter: 84, - typeFilter: 151, - healthFilter: 153, - dashboardFilter: 155, - pluginsFilter: 157, - contactPointFilter: 159, + dataSourceFilter: 150, + nameSpaceFilter: 152, + labelFilter: 154, + groupFilter: 156, + ruleFilter: 158, + stateFilter: 90, + typeFilter: 160, + healthFilter: 162, + dashboardFilter: 164, + pluginsFilter: 166, + contactPointFilter: 168, + sourceFilter: 170, }, - tokenPrec: 161, + tokenPrec: 172, }); diff --git a/public/app/features/alerting/unified/search/search.terms.js b/public/app/features/alerting/unified/search/search.terms.js index 553a2c1f1a5..cd23fa535cf 100644 --- a/public/app/features/alerting/unified/search/search.terms.js +++ b/public/app/features/alerting/unified/search/search.terms.js @@ -13,7 +13,8 @@ export const AlertRuleSearch = 1, DashboardToken = 12, PluginsToken = 13, ContactPointToken = 14, - FreeFormExpression = 15, + RuleSourceToken = 15, + FreeFormExpression = 16, Dialect_dataSourceFilter = 0, Dialect_nameSpaceFilter = 1, Dialect_labelFilter = 2, @@ -24,4 +25,5 @@ export const AlertRuleSearch = 1, Dialect_healthFilter = 7, Dialect_dashboardFilter = 8, Dialect_pluginsFilter = 9, - Dialect_contactPointFilter = 10; + Dialect_contactPointFilter = 10, + Dialect_sourceFilter = 11; diff --git a/public/app/features/alerting/unified/search/searchParser.ts b/public/app/features/alerting/unified/search/searchParser.ts index d1e4391f4f0..86ef2727216 100644 --- a/public/app/features/alerting/unified/search/searchParser.ts +++ b/public/app/features/alerting/unified/search/searchParser.ts @@ -16,6 +16,7 @@ const filterTokenToTypeMap: Record = { [terms.DashboardToken]: 'dashboard', [terms.PluginsToken]: 'plugins', [terms.ContactPointToken]: 'contactPoint', + [terms.RuleSourceToken]: 'source', }; // This enum allows to configure parser behavior @@ -33,6 +34,7 @@ export enum FilterSupportedTerm { dashboard = 'dashboardFilter', plugins = 'pluginsFilter', contactPoint = 'contactPointFilter', + source = 'sourceFilter', } export type QueryFilterMapper = Record void>; diff --git a/public/app/features/alerting/unified/utils/rules.ts b/public/app/features/alerting/unified/utils/rules.ts index 033be738e49..0778bcc2903 100644 --- a/public/app/features/alerting/unified/utils/rules.ts +++ b/public/app/features/alerting/unified/utils/rules.ts @@ -44,7 +44,7 @@ import { import { CombinedRuleNamespace } from '../../../../types/unified-alerting'; import { State } from '../components/StateTag'; -import { RuleHealth } from '../search/rulesSearchParser'; +import { RuleHealth, RuleSource } from '../search/rulesSearchParser'; import { RuleFormType, RuleFormValues } from '../types/rule-form'; import { RULER_NOT_SUPPORTED_MSG } from './constants'; @@ -192,6 +192,16 @@ export function getRuleHealth(health: string): RuleHealth | undefined { } } +export function getRuleSource(source: string): RuleSource | undefined { + if (source === 'grafana') { + return RuleSource.Grafana; + } + if (source === 'datasource') { + return RuleSource.DataSource; + } + return undefined; +} + export function getPendingPeriod(rule: CombinedRule): string | undefined { if (rulerRuleType.any.recordingRule(rule.rulerRule)) { return undefined; diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index 1bb2e7623a2..91ea7aa9120 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -2643,6 +2643,10 @@ "placeholder-data-sources": "Select data sources", "placeholder-labels": "Select labels", "plugin-rules": "Plugin rules", + "rule-source": { + "datasource": "Data source managed", + "grafana": "Grafana managed" + }, "rule-type": "Rule type", "rulesSearchInput-placeholder-search": "Search", "search": "Search", @@ -2664,6 +2668,7 @@ "namespace": "Folder / Namespace", "rule-health": "Health", "rule-name": "Rule name", + "rule-source": "Rule source", "rule-type": "Type", "state": "State" }