From 4124b7c210c4527d42dca663c9d61afe2359bf98 Mon Sep 17 00:00:00 2001 From: Aditya Hegde Date: Thu, 21 May 2026 11:18:19 +0530 Subject: [PATCH 1/8] fix: rilltime syntax in comparison time range in citation urls --- .../messages/text/AssistantMessage.svelte | 15 +- .../messages/text/citation-url-mapper.spec.ts | 4 +- .../core/messages/text/citation-url-mapper.ts | 23 +- .../messages/text/enhance-citation-links.ts | 15 +- .../text/rewrite-citation-urls.spec.ts | 72 ++ .../messages/text/rewrite-citation-urls.ts | 65 ++ .../url-state/time-ranges/RillTime.ts | 23 + .../url-state/time-ranges/rill-time.js | 988 +++--------------- .../url-state/time-ranges/rill-time.ne | 11 +- .../url-state/time-ranges/rill-time.spec.ts | 59 ++ ...map-metrics-resolver-query-to-dashboard.ts | 20 +- .../features/explore-mappers/open-query.ts | 3 +- 12 files changed, 460 insertions(+), 838 deletions(-) create mode 100644 web-common/src/features/chat/core/messages/text/rewrite-citation-urls.spec.ts create mode 100644 web-common/src/features/chat/core/messages/text/rewrite-citation-urls.ts diff --git a/web-common/src/features/chat/core/messages/text/AssistantMessage.svelte b/web-common/src/features/chat/core/messages/text/AssistantMessage.svelte index 4dbc4a391b6e..36218bd3c8d9 100644 --- a/web-common/src/features/chat/core/messages/text/AssistantMessage.svelte +++ b/web-common/src/features/chat/core/messages/text/AssistantMessage.svelte @@ -1,6 +1,8 @@
- + {#await contentPromise} + + {:then content} + + {/await}
{ ]; for (const { title, url, expectedUrl } of testCases) { - it(title, () => { - const result = mapMetricsResolverQueryToUrl( + it(title, async () => { + const result = await mapMetricsResolverQueryToUrl( "", new URL(url), mockPage, diff --git a/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts b/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts index 845fa7931b66..a8dcf7dcd9a1 100644 --- a/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts +++ b/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts @@ -18,9 +18,11 @@ import { MessageType, ToolName, } from "@rilldata/web-common/features/chat/core/types.ts"; +import { RuntimeClient } from "@rilldata/web-common/runtime-client/v2"; -const LEGACY_DASHBOARD_CITATION_URL_PATHNAME_REGEX = /\/-\/open-query\/?$/; -const DASHBOARD_CITATION_URL_PATHNAME_REGEX = +export const LEGACY_DASHBOARD_CITATION_URL_PATHNAME_REGEX = + /\/-\/open-query\/?$/; +export const DASHBOARD_CITATION_URL_PATHNAME_REGEX = /\/-\/ai\/[^/]+\/message\/([^/]+)\/-\/open\/?$/; /** @@ -34,7 +36,7 @@ export function getMetricsResolverQueryToUrlMapperStore( ): Readable<{ error: Error | null; isLoading: boolean; - data?: (url: URL) => string; + data?: (url: URL) => Promise; }> { const resourcesQuery = createQuery( getMetricsViewAndExploreSpecsQueryOptions(conversation.runtimeClient), @@ -58,9 +60,9 @@ export function getMetricsResolverQueryToUrlMapperStore( const metricsViewAndExploreSpecs = resourcesResp.data; const messages = conversationResp.data?.messages ?? []; - const mapper = (url: URL): string => + const mapper = (url: URL): Promise => mapMetricsResolverQueryToUrl( - conversation.runtimeClient.instanceId, + conversation.runtimeClient, url, page, metricsViewAndExploreSpecs, @@ -76,8 +78,8 @@ export function getMetricsResolverQueryToUrlMapperStore( ); } -export function mapMetricsResolverQueryToUrl( - instanceId: string, +export async function mapMetricsResolverQueryToUrl( + runtimeClient: RuntimeClient, url: URL, pageState: Page, { @@ -86,7 +88,7 @@ export function mapMetricsResolverQueryToUrl( exploreSpecsMap, }: MetricsViewAndExploreSpecs, messages: V1Message[], -) { +): Promise { let query: MetricsResolverQuery; const isLegacyCitationUrl = LEGACY_DASHBOARD_CITATION_URL_PATHNAME_REGEX.test(url.pathname) && @@ -121,14 +123,15 @@ export function mapMetricsResolverQueryToUrl( const exploreSpec = exploreSpecsMap.get(exploreName); if (!exploreSpec) return url.href; - const partialExploreState = mapMetricsResolverQueryToDashboard( + const partialExploreState = await mapMetricsResolverQueryToDashboard( + runtimeClient, metricsViewSpec, exploreSpec, query, ); const urlSearchParams = maybeGetExplorePageUrlSearchParams( - instanceId, + runtimeClient.instanceId, partialExploreState, metricsViewSpec, exploreSpec, diff --git a/web-common/src/features/chat/core/messages/text/enhance-citation-links.ts b/web-common/src/features/chat/core/messages/text/enhance-citation-links.ts index 79eaf153af2a..d0abc0774427 100644 --- a/web-common/src/features/chat/core/messages/text/enhance-citation-links.ts +++ b/web-common/src/features/chat/core/messages/text/enhance-citation-links.ts @@ -29,16 +29,21 @@ export function enhanceCitationLinks( const href = e.target.getAttribute("href") ?? ""; const parsedUrl = URL.parse(href); - const mapper = get(mapperStore).data; - const mappedHref = parsedUrl && mapper ? mapper(parsedUrl) : href; - const isLocalLink = window.location.origin === parsedUrl?.origin; - const isPartialLink = mappedHref.startsWith("/"); + const isPartialLink = href.startsWith("/"); const shouldUseGoto = isLocalLink || isPartialLink; if (!shouldUseGoto) return; + // Fallback path for clicks that land before the async content rewrite completes: + // map the citation URL on demand. After the rewrite, the mapper is a no-op on + // the already-translated href. e.preventDefault(); - void goto(mappedHref); + void (async () => { + const mapper = get(mapperStore).data; + const mappedHref = + parsedUrl && mapper ? await mapper(parsedUrl) : href; + void goto(mappedHref); + })(); } node.addEventListener("click", handleClick); diff --git a/web-common/src/features/chat/core/messages/text/rewrite-citation-urls.spec.ts b/web-common/src/features/chat/core/messages/text/rewrite-citation-urls.spec.ts new file mode 100644 index 000000000000..f1aeaf880d89 --- /dev/null +++ b/web-common/src/features/chat/core/messages/text/rewrite-citation-urls.spec.ts @@ -0,0 +1,72 @@ +import { describe, it, expect, vi } from "vitest"; +import { rewriteCitationUrls } from "@rilldata/web-common/features/chat/core/messages/text/rewrite-citation-urls.ts"; + +const MAPPED = "http://localhost:3000/explore/AdBids_explore?view=explore"; + +describe("rewriteCitationUrls", () => { + it("returns content unchanged when there are no citation URLs", async () => { + const mapper = vi.fn(async (u: URL) => u.href); + const content = "no links here, just text and a code `snippet`."; + const result = await rewriteCitationUrls(content, mapper); + expect(result).toBe(content); + expect(mapper).not.toHaveBeenCalled(); + }); + + it("rewrites a single absolute citation URL inside a markdown link", async () => { + const mapper = vi.fn(async () => MAPPED); + const content = + "See [chart](http://localhost:3000/-/ai/sess/message/abc/-/open) for details."; + const result = await rewriteCitationUrls(content, mapper); + expect(result).toBe(`See [chart](${MAPPED}) for details.`); + expect(mapper).toHaveBeenCalledTimes(1); + }); + + it("rewrites a relative citation URL and preserves relativity", async () => { + const mapper = vi.fn( + async () => "http://localhost/explore/foo?view=explore", + ); + const content = "Click [here](/-/ai/sess/message/abc/-/open)."; + const result = await rewriteCitationUrls(content, mapper); + expect(result).toBe("Click [here](/explore/foo?view=explore)."); + }); + + it("rewrites legacy /-/open-query citation URLs", async () => { + const mapper = vi.fn(async () => MAPPED); + const content = + "[legacy](http://localhost:3000/-/open-query?query=%7B%7D)"; + const result = await rewriteCitationUrls(content, mapper); + expect(result).toBe(`[legacy](${MAPPED})`); + }); + + it("rewrites multiple citation URLs in parallel", async () => { + const mapper = vi.fn(async (url: URL) => `${MAPPED}#${url.pathname}`); + const content = + "First [a](http://localhost:3000/-/ai/s/message/one/-/open) and " + + "second [b](http://localhost:3000/-/ai/s/message/two/-/open)."; + const result = await rewriteCitationUrls(content, mapper); + expect(mapper).toHaveBeenCalledTimes(2); + expect(result).toBe( + `First [a](${MAPPED}#/-/ai/s/message/one/-/open) and ` + + `second [b](${MAPPED}#/-/ai/s/message/two/-/open).`, + ); + }); + + it("leaves non-citation URLs untouched", async () => { + const mapper = vi.fn(async () => MAPPED); + const content = + "Visit [docs](https://docs.rilldata.com/intro) or [home](/dashboards)."; + const result = await rewriteCitationUrls(content, mapper); + expect(result).toBe(content); + expect(mapper).not.toHaveBeenCalled(); + }); + + it("handles a mix of citation and non-citation URLs", async () => { + const mapper = vi.fn(async () => MAPPED); + const content = + "[docs](https://docs.rilldata.com) then " + + "[chart](http://localhost:3000/-/ai/sess/message/abc/-/open)."; + const result = await rewriteCitationUrls(content, mapper); + expect(mapper).toHaveBeenCalledTimes(1); + expect(result).toBe(`[docs](https://docs.rilldata.com) then [chart](${MAPPED}).`); + }); +}); diff --git a/web-common/src/features/chat/core/messages/text/rewrite-citation-urls.ts b/web-common/src/features/chat/core/messages/text/rewrite-citation-urls.ts new file mode 100644 index 000000000000..6c1448aad20b --- /dev/null +++ b/web-common/src/features/chat/core/messages/text/rewrite-citation-urls.ts @@ -0,0 +1,65 @@ +import { + DASHBOARD_CITATION_URL_PATHNAME_REGEX, + LEGACY_DASHBOARD_CITATION_URL_PATHNAME_REGEX, +} from "@rilldata/web-common/features/chat/core/messages/text/citation-url-mapper.ts"; + +// Matches absolute http(s) URLs and root-relative paths that contain `/-/`. +// Citation URLs always include `/-/` (either `/-/open-query` or `/-/ai/.../-/open`), +// so we use it as a cheap pre-filter before parsing. +const CITATION_URL_DETECT_REGEX = /https?:\/\/[^\s)<>"`]+|\/-\/[^\s)<>"`]+/g; + +const FALLBACK_BASE = "http://localhost"; + +/** + * Rewrites citation URLs in the given markdown content using the provided async mapper. + * Non-citation URLs and non-URL text are left untouched. Per-URL mapper calls run in + * parallel; replacements are applied in reverse index order so earlier offsets remain valid. + */ +export async function rewriteCitationUrls( + content: string, + mapper: (url: URL) => Promise, +): Promise { + const matches = [...content.matchAll(CITATION_URL_DETECT_REGEX)]; + if (matches.length === 0) return content; + + const base = + typeof window !== "undefined" ? window.location.origin : FALLBACK_BASE; + + const replacements = await Promise.all( + matches.map(async (match) => { + const raw = match[0]; + let url: URL; + try { + url = new URL(raw, base); + } catch { + return null; + } + const isCitation = + DASHBOARD_CITATION_URL_PATHNAME_REGEX.test(url.pathname) || + LEGACY_DASHBOARD_CITATION_URL_PATHNAME_REGEX.test(url.pathname); + if (!isCitation) return null; + + const mapped = await mapper(url); + // Preserve relativity: if the source was a relative path and the mapper + // returned an absolute URL on the synthetic base, strip the base back off. + const wasRelative = raw.startsWith("/"); + const replacement = + wasRelative && mapped.startsWith(base) + ? mapped.slice(base.length) + : mapped; + return { index: match.index ?? 0, length: raw.length, replacement }; + }), + ); + + const valid = replacements + .filter((r): r is { index: number; length: number; replacement: string } => + r !== null, + ) + .sort((a, b) => b.index - a.index); + + let result = content; + for (const { index, length, replacement } of valid) { + result = result.slice(0, index) + replacement + result.slice(index + length); + } + return result; +} diff --git a/web-common/src/features/dashboards/url-state/time-ranges/RillTime.ts b/web-common/src/features/dashboards/url-state/time-ranges/RillTime.ts index 3af3bb43de4a..94b0e54b2785 100644 --- a/web-common/src/features/dashboards/url-state/time-ranges/RillTime.ts +++ b/web-common/src/features/dashboards/url-state/time-ranges/RillTime.ts @@ -32,10 +32,13 @@ export type RillTimeAsOfLabel = { offset: number; }; +export type RillOffset = RillPreviousPeriodOffset | RillGrainPointInTimePart; + export class RillTime { public isComplete: boolean = false; public timezone: string | undefined; public anchorOverrides: RillPointInTime[] = []; + public offset: RillOffset | undefined; public readonly rangeGrain: V1TimeGrain | undefined; public byGrain: V1TimeGrain | undefined; @@ -67,6 +70,11 @@ export class RillTime { return this; } + public withOffset(offset: RillOffset) { + this.offset = offset; + return this; + } + public withAnchorOverrides(anchorOverrides: RillPointInTime[]) { this.anchorOverrides = anchorOverrides; this.asOfLabel = this.getAsOfLabel(); @@ -116,6 +124,10 @@ export class RillTime { timeRange += ` tz ${this.timezone}`; } + if (this.offset) { + timeRange += ` offset ${this.offset.toString()}`; + } + return timeRange; } @@ -731,6 +743,17 @@ export class RillAbsoluteTime implements RillPointInTimeVariant { } } +export class RillPreviousPeriodOffset { + public constructor( + public readonly prefix: string, + public readonly num: number, + ) {} + + public toString() { + return `${this.prefix}${this.num}P`; + } +} + type RillGrain = { grain: string; num?: number; diff --git a/web-common/src/features/dashboards/url-state/time-ranges/rill-time.js b/web-common/src/features/dashboards/url-state/time-ranges/rill-time.js index 1cb7cc16435f..4413773c351b 100644 --- a/web-common/src/features/dashboards/url-state/time-ranges/rill-time.js +++ b/web-common/src/features/dashboards/url-state/time-ranges/rill-time.js @@ -1,823 +1,181 @@ // Generated automatically by nearley, version 2.20.1 // http://github.com/Hardmath123/nearley -function id(x) { - return x[0]; -} +function id(x) { return x[0]; } -import { - RillTime, - RillShorthandInterval, - RillPeriodToGrainInterval, - RillTimeStartEndInterval, - RillTimeOrdinalInterval, - RillIsoInterval, - RillLegacyIsoInterval, - RillLegacyDaxInterval, - RillAllTimeInterval, - RillPointInTime, - RillPointInTimeWithSnap, - RillLabelledPointInTime, - RillGrainPointInTime, - RillGrainPointInTimePart, - RillAbsoluteTime, -} from "./RillTime.ts"; + import { + RillTime, + + RillShorthandInterval, + RillPeriodToGrainInterval, + RillTimeStartEndInterval, + RillTimeOrdinalInterval, + RillIsoInterval, + RillLegacyIsoInterval, + RillLegacyDaxInterval, + RillAllTimeInterval, + + RillPointInTime, + RillPointInTimeWithSnap, + RillLabelledPointInTime, + RillGrainPointInTime, + RillGrainPointInTimePart, + RillAbsoluteTime, + RillPreviousPeriodOffset, + } from "./RillTime.ts" let Lexer = undefined; let ParserRules = [ - { name: "_$ebnf$1", symbols: [] }, - { - name: "_$ebnf$1", - symbols: ["_$ebnf$1", "wschar"], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { - name: "_", - symbols: ["_$ebnf$1"], - postprocess: function (d) { - return null; - }, - }, - { name: "__$ebnf$1", symbols: ["wschar"] }, - { - name: "__$ebnf$1", - symbols: ["__$ebnf$1", "wschar"], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { - name: "__", - symbols: ["__$ebnf$1"], - postprocess: function (d) { - return null; - }, - }, - { name: "wschar", symbols: [/[ \t\n\v\f]/], postprocess: id }, - { name: "dqstring$ebnf$1", symbols: [] }, - { - name: "dqstring$ebnf$1", - symbols: ["dqstring$ebnf$1", "dstrchar"], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { - name: "dqstring", - symbols: [{ literal: '"' }, "dqstring$ebnf$1", { literal: '"' }], - postprocess: function (d) { - return d[1].join(""); - }, - }, - { name: "sqstring$ebnf$1", symbols: [] }, - { - name: "sqstring$ebnf$1", - symbols: ["sqstring$ebnf$1", "sstrchar"], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { - name: "sqstring", - symbols: [{ literal: "'" }, "sqstring$ebnf$1", { literal: "'" }], - postprocess: function (d) { - return d[1].join(""); - }, - }, - { name: "btstring$ebnf$1", symbols: [] }, - { - name: "btstring$ebnf$1", - symbols: ["btstring$ebnf$1", /[^`]/], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { - name: "btstring", - symbols: [{ literal: "`" }, "btstring$ebnf$1", { literal: "`" }], - postprocess: function (d) { - return d[1].join(""); - }, - }, - { name: "dstrchar", symbols: [/[^\\"\n]/], postprocess: id }, - { - name: "dstrchar", - symbols: [{ literal: "\\" }, "strescape"], - postprocess: function (d) { - return JSON.parse('"' + d.join("") + '"'); - }, - }, - { name: "sstrchar", symbols: [/[^\\'\n]/], postprocess: id }, - { - name: "sstrchar", - symbols: [{ literal: "\\" }, "strescape"], - postprocess: function (d) { - return JSON.parse('"' + d.join("") + '"'); - }, - }, - { - name: "sstrchar$string$1", - symbols: [{ literal: "\\" }, { literal: "'" }], - postprocess: function joiner(d) { - return d.join(""); - }, - }, - { - name: "sstrchar", - symbols: ["sstrchar$string$1"], - postprocess: function (d) { - return "'"; - }, - }, - { name: "strescape", symbols: [/["\\/bfnrt]/], postprocess: id }, - { - name: "strescape", - symbols: [ - { literal: "u" }, - /[a-fA-F0-9]/, - /[a-fA-F0-9]/, - /[a-fA-F0-9]/, - /[a-fA-F0-9]/, - ], - postprocess: function (d) { - return d.join(""); - }, - }, - { name: "rill_time", symbols: ["new_rill_time"], postprocess: id }, - { name: "rill_time", symbols: ["old_rill_time"], postprocess: id }, - { name: "new_rill_time", symbols: ["interval_with_grain"], postprocess: id }, - { - name: "new_rill_time$string$1", - symbols: [{ literal: "t" }, { literal: "z" }], - postprocess: function joiner(d) { - return d.join(""); - }, - }, - { - name: "new_rill_time", - symbols: [ - "interval_with_grain", - "_", - "new_rill_time$string$1", - "_", - "timezone_modifier", - ], - postprocess: ([rt, , , , tz]) => rt.withTimezone(tz), - }, - { - name: "interval_with_grain$subexpression$1", - symbols: [/[bB]/, /[yY]/], - postprocess: function (d) { - return d.join(""); - }, - }, - { - name: "interval_with_grain", - symbols: [ - "interval_with_anchor_override", - "_", - "interval_with_grain$subexpression$1", - "_", - "grain", - ], - postprocess: ([rt, , , , grain]) => rt.withGrain(grain), - }, - { - name: "interval_with_grain", - symbols: ["interval_with_anchor_override"], - postprocess: id, - }, - { name: "interval_with_anchor_override$ebnf$1", symbols: [] }, - { - name: "interval_with_anchor_override$ebnf$1", - symbols: ["interval_with_anchor_override$ebnf$1", "anchor_override"], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { - name: "interval_with_anchor_override", - symbols: ["interval", "interval_with_anchor_override$ebnf$1"], - postprocess: ([interval, anchorOverrides]) => - new RillTime(interval).withAnchorOverrides(anchorOverrides), - }, - { - name: "anchor_override$subexpression$1", - symbols: [/[aA]/, /[sS]/], - postprocess: function (d) { - return d.join(""); - }, - }, - { - name: "anchor_override$subexpression$2", - symbols: [/[oO]/, /[fF]/], - postprocess: function (d) { - return d.join(""); - }, - }, - { - name: "anchor_override", - symbols: [ - "_", - "anchor_override$subexpression$1", - "_", - "anchor_override$subexpression$2", - "_", - "point_in_time", - ], - postprocess: ([, , , , , pointInTime]) => pointInTime, - }, - { name: "interval", symbols: ["shorthand_interval"], postprocess: id }, - { name: "interval", symbols: ["period_to_grain_interval"], postprocess: id }, - { name: "interval", symbols: ["start_end_interval"], postprocess: id }, - { name: "interval", symbols: ["ordinal_interval"], postprocess: id }, - { name: "interval", symbols: ["iso_interval"], postprocess: id }, - { - name: "interval$subexpression$1", - symbols: [/[iI]/, /[nN]/, /[fF]/], - postprocess: function (d) { - return d.join(""); - }, - }, - { - name: "interval", - symbols: ["interval$subexpression$1"], - postprocess: () => new RillAllTimeInterval(), - }, - { - name: "shorthand_interval", - symbols: ["grain_duration"], - postprocess: ([parts]) => new RillShorthandInterval(parts), - }, - { - name: "period_to_grain_interval", - symbols: ["period_to_grain"], - postprocess: ([grain]) => new RillPeriodToGrainInterval(grain), - }, - { name: "ordinal_interval$ebnf$1", symbols: [] }, - { - name: "ordinal_interval$ebnf$1$subexpression$1$subexpression$1", - symbols: [/[oO]/, /[fF]/], - postprocess: function (d) { - return d.join(""); - }, - }, - { - name: "ordinal_interval$ebnf$1$subexpression$1", - symbols: [ - "_", - "ordinal_interval$ebnf$1$subexpression$1$subexpression$1", - "_", - "ordinal", - ], - }, - { - name: "ordinal_interval$ebnf$1", - symbols: [ - "ordinal_interval$ebnf$1", - "ordinal_interval$ebnf$1$subexpression$1", - ], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { - name: "ordinal_interval", - symbols: ["ordinal", "ordinal_interval$ebnf$1"], - postprocess: ([part, rest]) => - new RillTimeOrdinalInterval([part, ...rest.map(([, , , p]) => p)]), - }, - { - name: "start_end_interval$subexpression$1", - symbols: [/[tT]/, /[oO]/], - postprocess: function (d) { - return d.join(""); - }, - }, - { - name: "start_end_interval", - symbols: [ - "point_in_time", - "_", - "start_end_interval$subexpression$1", - "_", - "point_in_time", - ], - postprocess: ([start, , , , end]) => - new RillTimeStartEndInterval(start, end), - }, - { - name: "iso_interval$subexpression$1", - symbols: [/[tT]/, /[oO]/], - postprocess: function (d) { - return d.join(""); - }, - }, - { - name: "iso_interval", - symbols: ["abs_time", "_", "iso_interval$subexpression$1", "_", "abs_time"], - postprocess: ([start, , , , end]) => new RillIsoInterval(start, end), - }, - { - name: "iso_interval", - symbols: ["abs_time", "_", { literal: "/" }, "_", "abs_time"], - postprocess: ([start, , , , end]) => new RillIsoInterval(start, end), - }, - { - name: "iso_interval", - symbols: ["abs_time", "_", { literal: "," }, "_", "abs_time"], - postprocess: ([start, , , , end]) => new RillIsoInterval(start, end), - }, - { - name: "iso_interval", - symbols: ["abs_time"], - postprocess: ([start]) => new RillIsoInterval(start, undefined), - }, - { name: "point_in_time$ebnf$1", symbols: [] }, - { - name: "point_in_time$ebnf$1", - symbols: ["point_in_time$ebnf$1", "point_in_time_with_snap"], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { - name: "point_in_time", - symbols: ["point_in_time$ebnf$1", "point_in_time_without_snap"], - postprocess: ([points, last]) => new RillPointInTime([...points, last]), - }, - { - name: "point_in_time", - symbols: ["point_in_time_with_snap"], - postprocess: ([point]) => new RillPointInTime([point]), - }, - { - name: "point_in_time_with_snap", - symbols: [ - "point_in_time_variants", - "_", - { literal: "/" }, - "_", - "grain", - "_", - { literal: "/" }, - "_", - "grain", - ], - postprocess: ([point, , , , firstGrain, , , , secondGrain]) => - new RillPointInTimeWithSnap(point, [firstGrain, secondGrain]), - }, - { - name: "point_in_time_with_snap", - symbols: ["point_in_time_variants", "_", { literal: "/" }, "_", "grain"], - postprocess: ([point, , , , grain]) => - new RillPointInTimeWithSnap(point, [grain]), - }, - { - name: "point_in_time_without_snap", - symbols: ["point_in_time_variants"], - postprocess: ([point]) => new RillPointInTimeWithSnap(point, []), - }, - { - name: "point_in_time_variants", - symbols: ["grain_point_in_time"], - postprocess: id, - }, - { - name: "point_in_time_variants", - symbols: ["labeled_point_in_time"], - postprocess: id, - }, - { name: "point_in_time_variants", symbols: ["abs_time"], postprocess: id }, - { name: "grain_point_in_time$ebnf$1", symbols: ["grain_point_in_time_part"] }, - { - name: "grain_point_in_time$ebnf$1", - symbols: ["grain_point_in_time$ebnf$1", "grain_point_in_time_part"], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { - name: "grain_point_in_time", - symbols: ["grain_point_in_time$ebnf$1"], - postprocess: ([parts]) => new RillGrainPointInTime([...parts]), - }, - { - name: "grain_point_in_time_part", - symbols: ["prefix", "_", "grain_duration"], - postprocess: ([prefix, _, grains]) => - new RillGrainPointInTimePart(prefix, grains), - }, - { - name: "labeled_point_in_time$subexpression$1", - symbols: [/[eE]/, /[aA]/, /[rR]/, /[lL]/, /[iI]/, /[eE]/, /[sS]/, /[tT]/], - postprocess: function (d) { - return d.join(""); - }, - }, - { - name: "labeled_point_in_time", - symbols: ["labeled_point_in_time$subexpression$1"], - postprocess: RillLabelledPointInTime.postProcessor, - }, - { - name: "labeled_point_in_time$subexpression$2", - symbols: [/[lL]/, /[aA]/, /[tT]/, /[eE]/, /[sS]/, /[tT]/], - postprocess: function (d) { - return d.join(""); - }, - }, - { - name: "labeled_point_in_time", - symbols: ["labeled_point_in_time$subexpression$2"], - postprocess: RillLabelledPointInTime.postProcessor, - }, - { - name: "labeled_point_in_time$subexpression$3", - symbols: [/[nN]/, /[oO]/, /[wW]/], - postprocess: function (d) { - return d.join(""); - }, - }, - { - name: "labeled_point_in_time", - symbols: ["labeled_point_in_time$subexpression$3"], - postprocess: RillLabelledPointInTime.postProcessor, - }, - { - name: "labeled_point_in_time$subexpression$4", - symbols: [ - /[wW]/, - /[aA]/, - /[tT]/, - /[eE]/, - /[rR]/, - /[mM]/, - /[aA]/, - /[rR]/, - /[kK]/, - ], - postprocess: function (d) { - return d.join(""); - }, - }, - { - name: "labeled_point_in_time", - symbols: ["labeled_point_in_time$subexpression$4"], - postprocess: RillLabelledPointInTime.postProcessor, - }, - { - name: "labeled_point_in_time$subexpression$5", - symbols: [/[rR]/, /[eE]/, /[fF]/], - postprocess: function (d) { - return d.join(""); - }, - }, - { - name: "labeled_point_in_time", - symbols: ["labeled_point_in_time$subexpression$5"], - postprocess: RillLabelledPointInTime.postProcessor, - }, - { - name: "ordinal", - symbols: ["grain", "num"], - postprocess: ([grain, num]) => ({ num, grain }), - }, - { name: "grain_duration$ebnf$1", symbols: ["grain_duration_part"] }, - { - name: "grain_duration$ebnf$1", - symbols: ["grain_duration$ebnf$1", "grain_duration_part"], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { - name: "grain_duration", - symbols: ["grain_duration$ebnf$1"], - postprocess: ([parts]) => parts, - }, - { - name: "grain_duration_part", - symbols: ["num", "grain"], - postprocess: ([num, grain]) => ({ num, grain }), - }, - { - name: "period_to_grain$string$1", - symbols: [{ literal: "T" }, { literal: "D" }], - postprocess: function joiner(d) { - return d.join(""); - }, - }, - { - name: "period_to_grain", - symbols: ["grain", "period_to_grain$string$1"], - postprocess: ([grain]) => grain, - }, - { name: "abs_time$ebnf$1", symbols: [/[\d]/] }, - { - name: "abs_time$ebnf$1", - symbols: ["abs_time$ebnf$1", /[\d]/], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { - name: "abs_time", - symbols: [ - /[\d]/, - /[\d]/, - /[\d]/, - /[\d]/, - /[\-]/, - /[\d]/, - /[\d]/, - /[\-]/, - /[\d]/, - /[\d]/, - { literal: "T" }, - /[\d]/, - /[\d]/, - /[:]/, - /[\d]/, - /[\d]/, - /[:]/, - /[\d]/, - /[\d]/, - /[.]/, - "abs_time$ebnf$1", - { literal: "Z" }, - ], - postprocess: RillAbsoluteTime.postProcessor, - }, - { - name: "abs_time", - symbols: [ - /[\d]/, - /[\d]/, - /[\d]/, - /[\d]/, - /[\-]/, - /[\d]/, - /[\d]/, - /[\-]/, - /[\d]/, - /[\d]/, - { literal: "T" }, - /[\d]/, - /[\d]/, - /[:]/, - /[\d]/, - /[\d]/, - /[:]/, - /[\d]/, - /[\d]/, - { literal: "Z" }, - ], - postprocess: RillAbsoluteTime.postProcessor, - }, - { - name: "abs_time", - symbols: [ - /[\d]/, - /[\d]/, - /[\d]/, - /[\d]/, - /[\-]/, - /[\d]/, - /[\d]/, - /[\-]/, - /[\d]/, - /[\d]/, - { literal: "T" }, - /[\d]/, - /[\d]/, - /[:]/, - /[\d]/, - /[\d]/, - ], - postprocess: RillAbsoluteTime.postProcessor, - }, - { - name: "abs_time", - symbols: [ - /[\d]/, - /[\d]/, - /[\d]/, - /[\d]/, - /[\-]/, - /[\d]/, - /[\d]/, - /[\-]/, - /[\d]/, - /[\d]/, - { literal: "T" }, - /[\d]/, - /[\d]/, - ], - postprocess: RillAbsoluteTime.postProcessor, - }, - { - name: "abs_time", - symbols: [ - /[\d]/, - /[\d]/, - /[\d]/, - /[\d]/, - /[\-]/, - /[\d]/, - /[\d]/, - /[\-]/, - /[\d]/, - /[\d]/, - ], - postprocess: RillAbsoluteTime.postProcessor, - }, - { - name: "abs_time", - symbols: [/[\d]/, /[\d]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/], - postprocess: RillAbsoluteTime.postProcessor, - }, - { - name: "abs_time", - symbols: [/[\d]/, /[\d]/, /[\d]/, /[\d]/], - postprocess: RillAbsoluteTime.postProcessor, - }, - { name: "timezone_modifier$ebnf$1", symbols: [/[0-9a-zA-Z/+\-_]/] }, - { - name: "timezone_modifier$ebnf$1", - symbols: ["timezone_modifier$ebnf$1", /[0-9a-zA-Z/+\-_]/], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { - name: "timezone_modifier", - symbols: ["timezone_modifier$ebnf$1"], - postprocess: ([args]) => args.join(""), - }, - { - name: "old_rill_time", - symbols: ["iso_time"], - postprocess: ([legacyIso]) => new RillTime(legacyIso), - }, - { - name: "old_rill_time", - symbols: ["dax_time"], - postprocess: ([legacyDax]) => - new RillTime(new RillLegacyDaxInterval(legacyDax)), - }, - { name: "iso_time$ebnf$1", symbols: ["iso_date_part"] }, - { - name: "iso_time$ebnf$1", - symbols: ["iso_time$ebnf$1", "iso_date_part"], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { name: "iso_time$ebnf$2", symbols: ["iso_time_part"] }, - { - name: "iso_time$ebnf$2", - symbols: ["iso_time$ebnf$2", "iso_time_part"], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { - name: "iso_time", - symbols: [ - { literal: "P" }, - "iso_time$ebnf$1", - { literal: "T" }, - "iso_time$ebnf$2", - ], - postprocess: ([, dateGrains, , timeGrains]) => - new RillLegacyIsoInterval(dateGrains, timeGrains), - }, - { name: "iso_time$ebnf$3", symbols: ["iso_date_part"] }, - { - name: "iso_time$ebnf$3", - symbols: ["iso_time$ebnf$3", "iso_date_part"], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { - name: "iso_time", - symbols: [{ literal: "P" }, "iso_time$ebnf$3"], - postprocess: ([, dateGrains]) => new RillLegacyIsoInterval(dateGrains, []), - }, - { - name: "iso_time$string$1", - symbols: [{ literal: "P" }, { literal: "T" }], - postprocess: function joiner(d) { - return d.join(""); - }, - }, - { name: "iso_time$ebnf$4", symbols: ["iso_time_part"] }, - { - name: "iso_time$ebnf$4", - symbols: ["iso_time$ebnf$4", "iso_time_part"], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { - name: "iso_time", - symbols: ["iso_time$string$1", "iso_time$ebnf$4"], - postprocess: ([, timeGrains]) => new RillLegacyIsoInterval([], timeGrains), - }, - { - name: "iso_date_part", - symbols: ["num", "date_grains"], - postprocess: ([num, grain]) => ({ num, grain }), - }, - { - name: "iso_time_part", - symbols: ["num", "time_grains"], - postprocess: ([num, grain]) => ({ num, grain }), - }, - { - name: "dax_time$string$1", - symbols: [ - { literal: "r" }, - { literal: "i" }, - { literal: "l" }, - { literal: "l" }, - { literal: "-" }, - ], - postprocess: function joiner(d) { - return d.join(""); - }, - }, - { - name: "dax_time", - symbols: ["dax_time$string$1", "dax_notations"], - postprocess: (args) => args.join(""), - }, - { - name: "dax_notations$string$1", - symbols: [{ literal: "T" }, { literal: "D" }], - postprocess: function joiner(d) { - return d.join(""); - }, - }, - { - name: "dax_notations", - symbols: ["dax_to_date", "dax_notations$string$1"], - postprocess: (args) => args.join(""), - }, - { - name: "dax_notations$string$2", - symbols: [{ literal: "T" }, { literal: "D" }], - postprocess: function joiner(d) { - return d.join(""); - }, - }, - { - name: "dax_notations", - symbols: ["dax_notations$string$2"], - postprocess: id, - }, - { - name: "dax_notations", - symbols: [{ literal: "P" }, "date_grains", { literal: "C" }], - postprocess: (args) => args.join(""), - }, - { - name: "dax_notations$string$3", - symbols: [{ literal: "P" }, { literal: "P" }], - postprocess: function joiner(d) { - return d.join(""); - }, - }, - { - name: "dax_notations", - symbols: ["dax_notations$string$3"], - postprocess: id, - }, - { - name: "dax_notations", - symbols: [{ literal: "P" }, "date_grains"], - postprocess: (args) => args.join(""), - }, - { name: "prefix", symbols: [/[+\-]/], postprocess: id }, - { name: "num$ebnf$1", symbols: [/[0-9]/] }, - { - name: "num$ebnf$1", - symbols: ["num$ebnf$1", /[0-9]/], - postprocess: function arrpush(d) { - return d[0].concat([d[1]]); - }, - }, - { - name: "num", - symbols: ["num$ebnf$1"], - postprocess: ([args]) => Number(args.join("")), - }, - { name: "grain", symbols: [/[sSmhHdDwWqQMyY]/], postprocess: id }, - { name: "date_grains", symbols: [/[DWQMY]/], postprocess: id }, - { name: "time_grains", symbols: [/[SMH]/], postprocess: id }, - { name: "dax_to_date", symbols: [/[WQMY]/], postprocess: id }, + {"name": "_$ebnf$1", "symbols": []}, + {"name": "_$ebnf$1", "symbols": ["_$ebnf$1", "wschar"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "_", "symbols": ["_$ebnf$1"], "postprocess": function(d) {return null;}}, + {"name": "__$ebnf$1", "symbols": ["wschar"]}, + {"name": "__$ebnf$1", "symbols": ["__$ebnf$1", "wschar"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "__", "symbols": ["__$ebnf$1"], "postprocess": function(d) {return null;}}, + {"name": "wschar", "symbols": [/[ \t\n\v\f]/], "postprocess": id}, + {"name": "dqstring$ebnf$1", "symbols": []}, + {"name": "dqstring$ebnf$1", "symbols": ["dqstring$ebnf$1", "dstrchar"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "dqstring", "symbols": [{"literal":"\""}, "dqstring$ebnf$1", {"literal":"\""}], "postprocess": function(d) {return d[1].join(""); }}, + {"name": "sqstring$ebnf$1", "symbols": []}, + {"name": "sqstring$ebnf$1", "symbols": ["sqstring$ebnf$1", "sstrchar"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "sqstring", "symbols": [{"literal":"'"}, "sqstring$ebnf$1", {"literal":"'"}], "postprocess": function(d) {return d[1].join(""); }}, + {"name": "btstring$ebnf$1", "symbols": []}, + {"name": "btstring$ebnf$1", "symbols": ["btstring$ebnf$1", /[^`]/], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "btstring", "symbols": [{"literal":"`"}, "btstring$ebnf$1", {"literal":"`"}], "postprocess": function(d) {return d[1].join(""); }}, + {"name": "dstrchar", "symbols": [/[^\\"\n]/], "postprocess": id}, + {"name": "dstrchar", "symbols": [{"literal":"\\"}, "strescape"], "postprocess": + function(d) { + return JSON.parse("\""+d.join("")+"\""); + } + }, + {"name": "sstrchar", "symbols": [/[^\\'\n]/], "postprocess": id}, + {"name": "sstrchar", "symbols": [{"literal":"\\"}, "strescape"], "postprocess": function(d) { return JSON.parse("\""+d.join("")+"\""); }}, + {"name": "sstrchar$string$1", "symbols": [{"literal":"\\"}, {"literal":"'"}], "postprocess": function joiner(d) {return d.join('');}}, + {"name": "sstrchar", "symbols": ["sstrchar$string$1"], "postprocess": function(d) {return "'"; }}, + {"name": "strescape", "symbols": [/["\\/bfnrt]/], "postprocess": id}, + {"name": "strescape", "symbols": [{"literal":"u"}, /[a-fA-F0-9]/, /[a-fA-F0-9]/, /[a-fA-F0-9]/, /[a-fA-F0-9]/], "postprocess": + function(d) { + return d.join(""); + } + }, + {"name": "rill_time", "symbols": ["new_rill_time"], "postprocess": id}, + {"name": "rill_time", "symbols": ["old_rill_time"], "postprocess": id}, + {"name": "new_rill_time$ebnf$1", "symbols": []}, + {"name": "new_rill_time$ebnf$1", "symbols": ["new_rill_time$ebnf$1", "trailing_modifier"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "new_rill_time", "symbols": ["interval_with_grain", "new_rill_time$ebnf$1"], "postprocess": ([rt, modifiers]) => modifiers.reduce((acc, mod) => mod(acc), rt)}, + {"name": "trailing_modifier$string$1", "symbols": [{"literal":"t"}, {"literal":"z"}], "postprocess": function joiner(d) {return d.join('');}}, + {"name": "trailing_modifier", "symbols": ["_", "trailing_modifier$string$1", "_", "timezone_modifier"], "postprocess": ([, , , tz]) => (rt) => rt.withTimezone(tz)}, + {"name": "trailing_modifier$subexpression$1", "symbols": [/[oO]/, /[fF]/, /[fF]/, /[sS]/, /[eE]/, /[tT]/], "postprocess": function(d) {return d.join(""); }}, + {"name": "trailing_modifier", "symbols": ["_", "trailing_modifier$subexpression$1", "_", "offset_value"], "postprocess": ([, , , offset]) => (rt) => rt.withOffset(offset)}, + {"name": "interval_with_grain$subexpression$1", "symbols": [/[bB]/, /[yY]/], "postprocess": function(d) {return d.join(""); }}, + {"name": "interval_with_grain", "symbols": ["interval_with_anchor_override", "_", "interval_with_grain$subexpression$1", "_", "grain"], "postprocess": ([rt, , , , grain]) => rt.withGrain(grain)}, + {"name": "interval_with_grain", "symbols": ["interval_with_anchor_override"], "postprocess": id}, + {"name": "interval_with_anchor_override$ebnf$1", "symbols": []}, + {"name": "interval_with_anchor_override$ebnf$1", "symbols": ["interval_with_anchor_override$ebnf$1", "anchor_override"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "interval_with_anchor_override", "symbols": ["interval", "interval_with_anchor_override$ebnf$1"], "postprocess": ([interval, anchorOverrides]) => new RillTime(interval).withAnchorOverrides(anchorOverrides)}, + {"name": "anchor_override$subexpression$1", "symbols": [/[aA]/, /[sS]/], "postprocess": function(d) {return d.join(""); }}, + {"name": "anchor_override$subexpression$2", "symbols": [/[oO]/, /[fF]/], "postprocess": function(d) {return d.join(""); }}, + {"name": "anchor_override", "symbols": ["_", "anchor_override$subexpression$1", "_", "anchor_override$subexpression$2", "_", "point_in_time"], "postprocess": ([, , , , , pointInTime]) => pointInTime}, + {"name": "interval", "symbols": ["shorthand_interval"], "postprocess": id}, + {"name": "interval", "symbols": ["period_to_grain_interval"], "postprocess": id}, + {"name": "interval", "symbols": ["start_end_interval"], "postprocess": id}, + {"name": "interval", "symbols": ["ordinal_interval"], "postprocess": id}, + {"name": "interval", "symbols": ["iso_interval"], "postprocess": id}, + {"name": "interval$subexpression$1", "symbols": [/[iI]/, /[nN]/, /[fF]/], "postprocess": function(d) {return d.join(""); }}, + {"name": "interval", "symbols": ["interval$subexpression$1"], "postprocess": () => new RillAllTimeInterval()}, + {"name": "shorthand_interval", "symbols": ["grain_duration"], "postprocess": ([parts]) => new RillShorthandInterval(parts)}, + {"name": "period_to_grain_interval", "symbols": ["period_to_grain"], "postprocess": ([grain]) => new RillPeriodToGrainInterval(grain)}, + {"name": "ordinal_interval$ebnf$1", "symbols": []}, + {"name": "ordinal_interval$ebnf$1$subexpression$1$subexpression$1", "symbols": [/[oO]/, /[fF]/], "postprocess": function(d) {return d.join(""); }}, + {"name": "ordinal_interval$ebnf$1$subexpression$1", "symbols": ["_", "ordinal_interval$ebnf$1$subexpression$1$subexpression$1", "_", "ordinal"]}, + {"name": "ordinal_interval$ebnf$1", "symbols": ["ordinal_interval$ebnf$1", "ordinal_interval$ebnf$1$subexpression$1"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "ordinal_interval", "symbols": ["ordinal", "ordinal_interval$ebnf$1"], "postprocess": ([part, rest]) => new RillTimeOrdinalInterval([part, ...rest.map(([, , , p]) => p)])}, + {"name": "start_end_interval$subexpression$1", "symbols": [/[tT]/, /[oO]/], "postprocess": function(d) {return d.join(""); }}, + {"name": "start_end_interval", "symbols": ["point_in_time", "_", "start_end_interval$subexpression$1", "_", "point_in_time"], "postprocess": ([start, , , , end]) => new RillTimeStartEndInterval(start, end)}, + {"name": "iso_interval$subexpression$1", "symbols": [/[tT]/, /[oO]/], "postprocess": function(d) {return d.join(""); }}, + {"name": "iso_interval", "symbols": ["abs_time", "_", "iso_interval$subexpression$1", "_", "abs_time"], "postprocess": ([start, , , , end]) => new RillIsoInterval(start, end)}, + {"name": "iso_interval", "symbols": ["abs_time", "_", {"literal":"/"}, "_", "abs_time"], "postprocess": ([start, , , , end]) => new RillIsoInterval(start, end)}, + {"name": "iso_interval", "symbols": ["abs_time", "_", {"literal":","}, "_", "abs_time"], "postprocess": ([start, , , , end]) => new RillIsoInterval(start, end)}, + {"name": "iso_interval", "symbols": ["abs_time"], "postprocess": ([start]) => new RillIsoInterval(start, undefined)}, + {"name": "point_in_time$ebnf$1", "symbols": []}, + {"name": "point_in_time$ebnf$1", "symbols": ["point_in_time$ebnf$1", "point_in_time_with_snap"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "point_in_time", "symbols": ["point_in_time$ebnf$1", "point_in_time_without_snap"], "postprocess": ([points, last]) => new RillPointInTime([...points, last])}, + {"name": "point_in_time", "symbols": ["point_in_time_with_snap"], "postprocess": ([point]) => new RillPointInTime([point])}, + {"name": "point_in_time_with_snap", "symbols": ["point_in_time_variants", "_", {"literal":"/"}, "_", "grain", "_", {"literal":"/"}, "_", "grain"], "postprocess": ([point, , , , firstGrain, , , , secondGrain]) => new RillPointInTimeWithSnap(point, [firstGrain, secondGrain])}, + {"name": "point_in_time_with_snap", "symbols": ["point_in_time_variants", "_", {"literal":"/"}, "_", "grain"], "postprocess": ([point, , , , grain]) => new RillPointInTimeWithSnap(point, [grain])}, + {"name": "point_in_time_without_snap", "symbols": ["point_in_time_variants"], "postprocess": ([point]) => new RillPointInTimeWithSnap(point, [])}, + {"name": "point_in_time_variants", "symbols": ["grain_point_in_time"], "postprocess": id}, + {"name": "point_in_time_variants", "symbols": ["labeled_point_in_time"], "postprocess": id}, + {"name": "point_in_time_variants", "symbols": ["abs_time"], "postprocess": id}, + {"name": "grain_point_in_time$ebnf$1", "symbols": ["grain_point_in_time_part"]}, + {"name": "grain_point_in_time$ebnf$1", "symbols": ["grain_point_in_time$ebnf$1", "grain_point_in_time_part"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "grain_point_in_time", "symbols": ["grain_point_in_time$ebnf$1"], "postprocess": ([parts]) => new RillGrainPointInTime([...parts])}, + {"name": "grain_point_in_time_part", "symbols": ["prefix", "_", "grain_duration"], "postprocess": ([prefix, _, grains]) => new RillGrainPointInTimePart(prefix, grains)}, + {"name": "offset_value", "symbols": ["previous_period"], "postprocess": id}, + {"name": "offset_value", "symbols": ["grain_point_in_time_part"], "postprocess": id}, + {"name": "previous_period$subexpression$1", "symbols": [/[pP]/], "postprocess": function(d) {return d.join(""); }}, + {"name": "previous_period", "symbols": ["prefix", "_", "num", "previous_period$subexpression$1"], "postprocess": ([prefix, _, num]) => new RillPreviousPeriodOffset(prefix, num)}, + {"name": "labeled_point_in_time$subexpression$1", "symbols": [/[eE]/, /[aA]/, /[rR]/, /[lL]/, /[iI]/, /[eE]/, /[sS]/, /[tT]/], "postprocess": function(d) {return d.join(""); }}, + {"name": "labeled_point_in_time", "symbols": ["labeled_point_in_time$subexpression$1"], "postprocess": RillLabelledPointInTime.postProcessor}, + {"name": "labeled_point_in_time$subexpression$2", "symbols": [/[lL]/, /[aA]/, /[tT]/, /[eE]/, /[sS]/, /[tT]/], "postprocess": function(d) {return d.join(""); }}, + {"name": "labeled_point_in_time", "symbols": ["labeled_point_in_time$subexpression$2"], "postprocess": RillLabelledPointInTime.postProcessor}, + {"name": "labeled_point_in_time$subexpression$3", "symbols": [/[nN]/, /[oO]/, /[wW]/], "postprocess": function(d) {return d.join(""); }}, + {"name": "labeled_point_in_time", "symbols": ["labeled_point_in_time$subexpression$3"], "postprocess": RillLabelledPointInTime.postProcessor}, + {"name": "labeled_point_in_time$subexpression$4", "symbols": [/[wW]/, /[aA]/, /[tT]/, /[eE]/, /[rR]/, /[mM]/, /[aA]/, /[rR]/, /[kK]/], "postprocess": function(d) {return d.join(""); }}, + {"name": "labeled_point_in_time", "symbols": ["labeled_point_in_time$subexpression$4"], "postprocess": RillLabelledPointInTime.postProcessor}, + {"name": "labeled_point_in_time$subexpression$5", "symbols": [/[rR]/, /[eE]/, /[fF]/], "postprocess": function(d) {return d.join(""); }}, + {"name": "labeled_point_in_time", "symbols": ["labeled_point_in_time$subexpression$5"], "postprocess": RillLabelledPointInTime.postProcessor}, + {"name": "ordinal", "symbols": ["grain", "num"], "postprocess": ([grain, num]) => ({num, grain})}, + {"name": "grain_duration$ebnf$1", "symbols": ["grain_duration_part"]}, + {"name": "grain_duration$ebnf$1", "symbols": ["grain_duration$ebnf$1", "grain_duration_part"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "grain_duration", "symbols": ["grain_duration$ebnf$1"], "postprocess": ([parts]) => parts}, + {"name": "grain_duration_part", "symbols": ["num", "grain"], "postprocess": ([num, grain]) => ({num, grain})}, + {"name": "period_to_grain$string$1", "symbols": [{"literal":"T"}, {"literal":"D"}], "postprocess": function joiner(d) {return d.join('');}}, + {"name": "period_to_grain", "symbols": ["grain", "period_to_grain$string$1"], "postprocess": ([grain]) => grain}, + {"name": "abs_time$ebnf$1", "symbols": [/[\d]/]}, + {"name": "abs_time$ebnf$1", "symbols": ["abs_time$ebnf$1", /[\d]/], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "abs_time", "symbols": [/[\d]/, /[\d]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, {"literal":"T"}, /[\d]/, /[\d]/, /[:]/, /[\d]/, /[\d]/, /[:]/, /[\d]/, /[\d]/, /[.]/, "abs_time$ebnf$1", {"literal":"Z"}], "postprocess": RillAbsoluteTime.postProcessor}, + {"name": "abs_time", "symbols": [/[\d]/, /[\d]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, {"literal":"T"}, /[\d]/, /[\d]/, /[:]/, /[\d]/, /[\d]/, /[:]/, /[\d]/, /[\d]/, {"literal":"Z"}], "postprocess": RillAbsoluteTime.postProcessor}, + {"name": "abs_time", "symbols": [/[\d]/, /[\d]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, {"literal":"T"}, /[\d]/, /[\d]/, /[:]/, /[\d]/, /[\d]/], "postprocess": RillAbsoluteTime.postProcessor}, + {"name": "abs_time", "symbols": [/[\d]/, /[\d]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, {"literal":"T"}, /[\d]/, /[\d]/], "postprocess": RillAbsoluteTime.postProcessor}, + {"name": "abs_time", "symbols": [/[\d]/, /[\d]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/], "postprocess": RillAbsoluteTime.postProcessor}, + {"name": "abs_time", "symbols": [/[\d]/, /[\d]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/], "postprocess": RillAbsoluteTime.postProcessor}, + {"name": "abs_time", "symbols": [/[\d]/, /[\d]/, /[\d]/, /[\d]/], "postprocess": RillAbsoluteTime.postProcessor}, + {"name": "timezone_modifier$ebnf$1", "symbols": [/[0-9a-zA-Z/+\-_]/]}, + {"name": "timezone_modifier$ebnf$1", "symbols": ["timezone_modifier$ebnf$1", /[0-9a-zA-Z/+\-_]/], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "timezone_modifier", "symbols": ["timezone_modifier$ebnf$1"], "postprocess": ([args]) => args.join("")}, + {"name": "old_rill_time", "symbols": ["iso_time"], "postprocess": ([legacyIso]) => new RillTime(legacyIso)}, + {"name": "old_rill_time", "symbols": ["dax_time"], "postprocess": ([legacyDax]) => new RillTime(new RillLegacyDaxInterval(legacyDax))}, + {"name": "iso_time$ebnf$1", "symbols": ["iso_date_part"]}, + {"name": "iso_time$ebnf$1", "symbols": ["iso_time$ebnf$1", "iso_date_part"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "iso_time$ebnf$2", "symbols": ["iso_time_part"]}, + {"name": "iso_time$ebnf$2", "symbols": ["iso_time$ebnf$2", "iso_time_part"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "iso_time", "symbols": [{"literal":"P"}, "iso_time$ebnf$1", {"literal":"T"}, "iso_time$ebnf$2"], "postprocess": ([, dateGrains, , timeGrains]) => new RillLegacyIsoInterval(dateGrains, timeGrains)}, + {"name": "iso_time$ebnf$3", "symbols": ["iso_date_part"]}, + {"name": "iso_time$ebnf$3", "symbols": ["iso_time$ebnf$3", "iso_date_part"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "iso_time", "symbols": [{"literal":"P"}, "iso_time$ebnf$3"], "postprocess": ([, dateGrains]) => new RillLegacyIsoInterval(dateGrains, [])}, + {"name": "iso_time$string$1", "symbols": [{"literal":"P"}, {"literal":"T"}], "postprocess": function joiner(d) {return d.join('');}}, + {"name": "iso_time$ebnf$4", "symbols": ["iso_time_part"]}, + {"name": "iso_time$ebnf$4", "symbols": ["iso_time$ebnf$4", "iso_time_part"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "iso_time", "symbols": ["iso_time$string$1", "iso_time$ebnf$4"], "postprocess": ([, timeGrains]) => new RillLegacyIsoInterval([], timeGrains)}, + {"name": "iso_date_part", "symbols": ["num", "date_grains"], "postprocess": ([num, grain]) => ({num, grain})}, + {"name": "iso_time_part", "symbols": ["num", "time_grains"], "postprocess": ([num, grain]) => ({num, grain})}, + {"name": "dax_time$string$1", "symbols": [{"literal":"r"}, {"literal":"i"}, {"literal":"l"}, {"literal":"l"}, {"literal":"-"}], "postprocess": function joiner(d) {return d.join('');}}, + {"name": "dax_time", "symbols": ["dax_time$string$1", "dax_notations"], "postprocess": (args) => args.join("")}, + {"name": "dax_notations$string$1", "symbols": [{"literal":"T"}, {"literal":"D"}], "postprocess": function joiner(d) {return d.join('');}}, + {"name": "dax_notations", "symbols": ["dax_to_date", "dax_notations$string$1"], "postprocess": (args) => args.join("")}, + {"name": "dax_notations$string$2", "symbols": [{"literal":"T"}, {"literal":"D"}], "postprocess": function joiner(d) {return d.join('');}}, + {"name": "dax_notations", "symbols": ["dax_notations$string$2"], "postprocess": id}, + {"name": "dax_notations", "symbols": [{"literal":"P"}, "date_grains", {"literal":"C"}], "postprocess": (args) => args.join("")}, + {"name": "dax_notations$string$3", "symbols": [{"literal":"P"}, {"literal":"P"}], "postprocess": function joiner(d) {return d.join('');}}, + {"name": "dax_notations", "symbols": ["dax_notations$string$3"], "postprocess": id}, + {"name": "dax_notations", "symbols": [{"literal":"P"}, "date_grains"], "postprocess": (args) => args.join("")}, + {"name": "prefix", "symbols": [/[+\-]/], "postprocess": id}, + {"name": "num$ebnf$1", "symbols": [/[0-9]/]}, + {"name": "num$ebnf$1", "symbols": ["num$ebnf$1", /[0-9]/], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, + {"name": "num", "symbols": ["num$ebnf$1"], "postprocess": ([args]) => Number(args.join(""))}, + {"name": "grain", "symbols": [/[sSmhHdDwWqQMyY]/], "postprocess": id}, + {"name": "date_grains", "symbols": [/[DWQMY]/], "postprocess": id}, + {"name": "time_grains", "symbols": [/[SMH]/], "postprocess": id}, + {"name": "dax_to_date", "symbols": [/[WQMY]/], "postprocess": id} ]; let ParserStart = "rill_time"; export default { Lexer, ParserRules, ParserStart }; diff --git a/web-common/src/features/dashboards/url-state/time-ranges/rill-time.ne b/web-common/src/features/dashboards/url-state/time-ranges/rill-time.ne index d9449d058241..c82ec3c0815c 100644 --- a/web-common/src/features/dashboards/url-state/time-ranges/rill-time.ne +++ b/web-common/src/features/dashboards/url-state/time-ranges/rill-time.ne @@ -21,14 +21,17 @@ RillGrainPointInTime, RillGrainPointInTimePart, RillAbsoluteTime, + RillPreviousPeriodOffset, } from "./RillTime.ts" %} rill_time => new_rill_time {% id %} | old_rill_time {% id %} -new_rill_time => interval_with_grain {% id %} - | interval_with_grain _ "tz" _ timezone_modifier {% ([rt, , , , tz]) => rt.withTimezone(tz) %} +new_rill_time => interval_with_grain trailing_modifier:* {% ([rt, modifiers]) => modifiers.reduce((acc, mod) => mod(acc), rt) %} + +trailing_modifier => _ "tz" _ timezone_modifier {% ([, , , tz]) => (rt) => rt.withTimezone(tz) %} + | _ "offset"i _ offset_value {% ([, , , offset]) => (rt) => rt.withOffset(offset) %} interval_with_grain => interval_with_anchor_override _ "by"i _ grain {% ([rt, , , , grain]) => rt.withGrain(grain) %} | interval_with_anchor_override {% id %} @@ -69,6 +72,10 @@ point_in_time_variants => grain_point_in_time {% id %} grain_point_in_time => grain_point_in_time_part:+ {% ([parts]) => new RillGrainPointInTime([...parts]) %} grain_point_in_time_part => prefix _ grain_duration {% ([prefix, _, grains]) => new RillGrainPointInTimePart(prefix, grains) %} +offset_value => previous_period {% id %} + | grain_point_in_time_part {% id %} +previous_period => prefix _ num "P"i {% ([prefix, _, num]) => new RillPreviousPeriodOffset(prefix, num) %} + labeled_point_in_time => "earliest"i {% RillLabelledPointInTime.postProcessor %} | "latest"i {% RillLabelledPointInTime.postProcessor %} | "now"i {% RillLabelledPointInTime.postProcessor %} diff --git a/web-common/src/features/dashboards/url-state/time-ranges/rill-time.spec.ts b/web-common/src/features/dashboards/url-state/time-ranges/rill-time.spec.ts index afe981842c32..cf01cb3ede59 100644 --- a/web-common/src/features/dashboards/url-state/time-ranges/rill-time.spec.ts +++ b/web-common/src/features/dashboards/url-state/time-ranges/rill-time.spec.ts @@ -220,6 +220,49 @@ describe("rill time", () => { ], ["inf", "All time", false, undefined, undefined], + + [ + "7D offset -1P", + "Last 7 days", + false, + V1TimeGrain.TIME_GRAIN_DAY, + undefined, + ], + [ + "7D offset -1M", + "Last 7 days", + false, + V1TimeGrain.TIME_GRAIN_DAY, + undefined, + ], + [ + "7D as of watermark/D offset -1P", + "Last 7 days", + true, + V1TimeGrain.TIME_GRAIN_DAY, + undefined, + ], + [ + "7D as of watermark/D+1D offset -1M", + "Last 7 days", + false, + V1TimeGrain.TIME_GRAIN_DAY, + undefined, + ], + [ + "7D tz UTC offset -1P", + "Last 7 days", + false, + V1TimeGrain.TIME_GRAIN_DAY, + undefined, + ], + [ + "2025-02-20T01:23:45Z,2025-07-15T02:34:50Z offset -1P", + "Custom", + false, + V1TimeGrain.TIME_GRAIN_SECOND, + undefined, + ], ]; const compiledGrammar = nearley.Grammar.fromCompiled(grammar); @@ -264,6 +307,22 @@ describe("rill time", () => { } }); + describe("offset and tz ordering", () => { + const Cases: [rillTime: string, serialized: string][] = [ + ["7D tz UTC offset -1P", "7D tz UTC offset -1P"], + ["7D offset -1P tz UTC", "7D tz UTC offset -1P"], + ["7D offset +2D", "7D offset +2D"], + ["7D offset -1P", "7D offset -1P"], + ]; + + for (const [rillTime, serialized] of Cases) { + it(rillTime, () => { + const rt = parseRillTime(rillTime); + expect(rt.toString()).toEqual(serialized); + }); + } + }); + describe("as of label", () => { const Cases: [ rillTime: string, diff --git a/web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.ts b/web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.ts index be8f40f90ced..d082d99bb481 100644 --- a/web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.ts +++ b/web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.ts @@ -37,8 +37,11 @@ import type { TimeRange, } from "@rilldata/web-common/runtime-client/gen/resolvers/metrics/schema.ts"; import type { SortingState } from "tanstack-table-8-svelte-5"; +import { resolveTimeRanges } from "@rilldata/web-common/features/dashboards/time-controls/rill-time-ranges.ts"; +import { RuntimeClient } from "@rilldata/web-common/runtime-client/v2"; -export function mapMetricsResolverQueryToDashboard( +export async function mapMetricsResolverQueryToDashboard( + runtimeClient: RuntimeClient, metricsViewSpec: V1MetricsViewSpec, exploreSpec: V1ExploreSpec, query: MetricsResolverQuery, @@ -84,6 +87,21 @@ export function mapMetricsResolverQueryToDashboard( mapResolverTimeRangeToDashboardControls(query.comparison_time_range); partialExploreState.showTimeComparison = true; } + // Resolve start/end by making a network call. + [ + partialExploreState.selectedTimeRange, + partialExploreState.selectedComparisonTimeRange, + ] = await resolveTimeRanges( + runtimeClient, + exploreSpec, + [ + partialExploreState.selectedTimeRange, + partialExploreState.selectedComparisonTimeRange, + ], + partialExploreState.selectedTimezone, + undefined, + partialExploreState.selectedTimeDimension, + ); // Convert where filter if (query.where) { diff --git a/web-common/src/features/explore-mappers/open-query.ts b/web-common/src/features/explore-mappers/open-query.ts index 5543633ff69b..aa739603e1b3 100644 --- a/web-common/src/features/explore-mappers/open-query.ts +++ b/web-common/src/features/explore-mappers/open-query.ts @@ -54,7 +54,8 @@ export async function openQuery({ ); // Convert query to ExploreState - const exploreState = mapMetricsResolverQueryToDashboard( + const exploreState = await mapMetricsResolverQueryToDashboard( + client, metricsViewSpec, exploreSpec, query, From 9093d40612d2ce9ad5e402a890e299d0564f676b Mon Sep 17 00:00:00 2001 From: Aditya Hegde Date: Thu, 21 May 2026 19:35:34 +0530 Subject: [PATCH 2/8] Convert to custom --- .../messages/text/citation-url-mapper.spec.ts | 3 +- ...map-metrics-resolver-query-to-dashboard.ts | 61 ++++++++++++------- 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/web-common/src/features/chat/core/messages/text/citation-url-mapper.spec.ts b/web-common/src/features/chat/core/messages/text/citation-url-mapper.spec.ts index 753695ad549b..b9b750b8b187 100644 --- a/web-common/src/features/chat/core/messages/text/citation-url-mapper.spec.ts +++ b/web-common/src/features/chat/core/messages/text/citation-url-mapper.spec.ts @@ -18,6 +18,7 @@ import { MessageType, ToolName, } from "@rilldata/web-common/features/chat/core/types.ts"; +import { RuntimeClient } from "@rilldata/web-common/runtime-client/v2"; const MetricsResolverQuery = { metrics_view: "AdBids_metrics", @@ -134,7 +135,7 @@ describe("mapMetricsResolverQueryToUrlParams", () => { for (const { title, url, expectedUrl } of testCases) { it(title, async () => { const result = await mapMetricsResolverQueryToUrl( - "", + { instanceId: "" } as RuntimeClient, new URL(url), mockPage, MockMetricsViewAndExploreSpecs, diff --git a/web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.ts b/web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.ts index d082d99bb481..9b990e7df6b8 100644 --- a/web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.ts +++ b/web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.ts @@ -80,28 +80,7 @@ export async function mapMetricsResolverQueryToDashboard( } // Convert time ranges - partialExploreState.selectedTimeRange = - mapResolverTimeRangeToDashboardControls(query.time_range); - if (query.comparison_time_range) { - partialExploreState.selectedComparisonTimeRange = - mapResolverTimeRangeToDashboardControls(query.comparison_time_range); - partialExploreState.showTimeComparison = true; - } - // Resolve start/end by making a network call. - [ - partialExploreState.selectedTimeRange, - partialExploreState.selectedComparisonTimeRange, - ] = await resolveTimeRanges( - runtimeClient, - exploreSpec, - [ - partialExploreState.selectedTimeRange, - partialExploreState.selectedComparisonTimeRange, - ], - partialExploreState.selectedTimezone, - undefined, - partialExploreState.selectedTimeDimension, - ); + await mapTimeRanges(runtimeClient, exploreSpec, partialExploreState, query); // Convert where filter if (query.where) { @@ -208,6 +187,44 @@ function getValidDimensions( }; } +async function mapTimeRanges( + runtimeClient: RuntimeClient, + exploreSpec: V1ExploreSpec, + partialExploreState: Partial, + query: MetricsResolverQuery, +) { + partialExploreState.selectedTimeRange = + mapResolverTimeRangeToDashboardControls(query.time_range); + if (query.comparison_time_range) { + partialExploreState.selectedComparisonTimeRange = + mapResolverTimeRangeToDashboardControls(query.comparison_time_range); + partialExploreState.showTimeComparison = true; + } + // Resolve start/end by making a network call. + [ + partialExploreState.selectedTimeRange, + partialExploreState.selectedComparisonTimeRange, + ] = await resolveTimeRanges( + runtimeClient, + exploreSpec, + [ + partialExploreState.selectedTimeRange, + partialExploreState.selectedComparisonTimeRange, + ], + partialExploreState.selectedTimezone, + undefined, + partialExploreState.selectedTimeDimension, + ); + // Set time ranges to custom so that + if (partialExploreState.selectedTimeRange) { + partialExploreState.selectedTimeRange.name = TimeRangePreset.CUSTOM; + } + if (partialExploreState.selectedComparisonTimeRange) { + partialExploreState.selectedComparisonTimeRange.name = + TimeRangePreset.CUSTOM; + } +} + function mapResolverTimeRangeToDashboardControls( timeRange: TimeRange | undefined, ): DashboardTimeControls { From 36c34468bb7f3f3529e1069c8c4c9c95abbfdbaf Mon Sep 17 00:00:00 2001 From: Aditya Hegde Date: Mon, 25 May 2026 10:46:30 +0530 Subject: [PATCH 3/8] Record the resolved time ranges for metrics view tool call --- runtime/ai/metrics_view_get.go | 39 ++++++----- runtime/ai/metrics_view_query.go | 108 +++++++++++++++++++++++++++++-- 2 files changed, 125 insertions(+), 22 deletions(-) diff --git a/runtime/ai/metrics_view_get.go b/runtime/ai/metrics_view_get.go index ebdc1868f639..659dbd922e18 100644 --- a/runtime/ai/metrics_view_get.go +++ b/runtime/ai/metrics_view_get.go @@ -53,39 +53,48 @@ func (t *GetMetricsView) CheckAccess(ctx context.Context) (bool, error) { func (t *GetMetricsView) Handler(ctx context.Context, args *GetMetricsViewArgs) (*GetMetricsViewResult, error) { session := GetSession(ctx) - ctrl, err := t.Runtime.Controller(ctx, session.InstanceID()) + mvSpec, err := resolveMetricsView(ctx, t.Runtime, session, args.MetricsView) if err != nil { return nil, err } - r, err := ctrl.Get(ctx, &runtimev1.ResourceName{Kind: runtime.ResourceKindMetricsView, Name: args.MetricsView}, false) + specJSON, err := protojson.Marshal(mvSpec) if err != nil { return nil, err } - - r, access, err := t.Runtime.ApplySecurityPolicy(ctx, session.InstanceID(), session.Claims(), r) + var specMap map[string]any + err = json.Unmarshal(specJSON, &specMap) if err != nil { return nil, err } - if !access { - return nil, fmt.Errorf("resource not found") - } - if r.GetMetricsView().State.ValidSpec == nil { - return nil, fmt.Errorf("metrics view %q is invalid", args.MetricsView) + return &GetMetricsViewResult{ + Spec: specMap, + }, nil +} + +func resolveMetricsView(ctx context.Context, rt *runtime.Runtime, session *Session, metricsView string) (*runtimev1.MetricsViewSpec, error) { + ctrl, err := rt.Controller(ctx, session.InstanceID()) + if err != nil { + return nil, err } - specJSON, err := protojson.Marshal(r.GetMetricsView().State.ValidSpec) + r, err := ctrl.Get(ctx, &runtimev1.ResourceName{Kind: runtime.ResourceKindMetricsView, Name: metricsView}, false) if err != nil { return nil, err } - var specMap map[string]any - err = json.Unmarshal(specJSON, &specMap) + + r, access, err := rt.ApplySecurityPolicy(ctx, session.InstanceID(), session.Claims(), r) if err != nil { return nil, err } + if !access { + return nil, fmt.Errorf("resource not found") + } - return &GetMetricsViewResult{ - Spec: specMap, - }, nil + if r.GetMetricsView().State.ValidSpec == nil { + return nil, fmt.Errorf("metrics view %q is invalid", metricsView) + } + + return r.GetMetricsView().State.ValidSpec, nil } diff --git a/runtime/ai/metrics_view_query.go b/runtime/ai/metrics_view_query.go index 61f45fcf7e7d..61c273deb67a 100644 --- a/runtime/ai/metrics_view_query.go +++ b/runtime/ai/metrics_view_query.go @@ -12,6 +12,10 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/rilldata/rill/runtime" "github.com/rilldata/rill/runtime/metricsview" + "github.com/rilldata/rill/runtime/pkg/mapstructureutil" + "github.com/rilldata/rill/runtime/pkg/rilltime" + "github.com/rilldata/rill/runtime/pkg/timeutil" + "github.com/rilldata/rill/runtime/queries" ) const QueryMetricsViewName = "query_metrics_view" @@ -25,10 +29,11 @@ var _ Tool[QueryMetricsViewArgs, *QueryMetricsViewResult] = (*QueryMetricsView)( type QueryMetricsViewArgs map[string]any type QueryMetricsViewResult struct { - Schema []SchemaField `json:"schema"` - Data [][]any `json:"data"` - OpenURL string `json:"open_url,omitempty"` - TruncationWarning string `json:"truncation_warning,omitempty"` + Schema []SchemaField `json:"schema"` + Data [][]any `json:"data"` + ResolvedTimeRanges []metricsview.TimeRange `json:"resolved_time_ranges,omitempty"` + OpenURL string `json:"open_url,omitempty"` + TruncationWarning string `json:"truncation_warning,omitempty"` } func (t *QueryMetricsView) Spec() *mcp.Tool { @@ -273,6 +278,12 @@ func (t *QueryMetricsView) Handler(ctx context.Context, args QueryMetricsViewArg return nil, err } + // Resolve time ranges and store them in the result to record the exact resolved time ranges for this tool call + resolvedTimeRanges, err := t.resolveTimeRanges(ctx, session, args) + if err != nil { + return nil, err + } + // Generate an open URL for the query openURL, err := t.generateOpenURL(ctx, session.InstanceID(), session.ID(), session.ParentID) if err != nil { @@ -281,9 +292,10 @@ func (t *QueryMetricsView) Handler(ctx context.Context, args QueryMetricsViewArg // Build the result result := &QueryMetricsViewResult{ - Schema: schema, - Data: data, - OpenURL: openURL, + Schema: schema, + Data: data, + OpenURL: openURL, + ResolvedTimeRanges: resolvedTimeRanges, } if isSystemLimit && int64(len(data)) >= limit { // Add a warning if we hit the system limit msg := fmt.Sprintf("The system truncated the result to %d rows", limit) @@ -321,3 +333,85 @@ func (t *QueryMetricsView) generateOpenURL(ctx context.Context, instanceID, sess return openURL.String(), nil } + +func (t *QueryMetricsView) resolveTimeRanges(ctx context.Context, session *Session, args map[string]any) ([]metricsview.TimeRange, error) { + qry := &metricsview.Query{} + if err := mapstructureutil.WeakDecode(args, qry); err != nil { + return nil, err + } + + if qry.TimeRange == nil { + return nil, nil + } + + mvSpec, err := resolveMetricsView(ctx, t.Runtime, session, qry.MetricsView) + if err != nil { + return nil, err + } + + ts, err := queries.ResolveTimestampResult(ctx, t.Runtime, session.InstanceID(), qry.MetricsView, qry.TimeRange.TimeDimension, session.Claims(), 0) + if err != nil { + return nil, err + } + + var tz *time.Location + if qry.TimeZone != "" { + tz, err = time.LoadLocation(qry.TimeZone) + if err != nil { + return nil, err + } + } + + now := time.Now().In(tz) + + var resolvedTimeRanges []metricsview.TimeRange + if qry.TimeRange.Expression != "" { + expr, err := rilltime.Parse(qry.TimeRange.Expression, rilltime.ParseOptions{ + TimeZoneOverride: tz, + SmallestGrain: timeutil.TimeGrainFromAPI(mvSpec.SmallestTimeGrain), + }) + if err != nil { + return nil, fmt.Errorf("error parsing time range %s: %w", qry.TimeRange.Expression, err) + } + + start, end, _ := expr.Eval(rilltime.EvalOptions{ + Now: now, + MinTime: ts.Min, + MaxTime: ts.Max, + Watermark: ts.Watermark, + FirstDay: int(mvSpec.FirstDayOfWeek), + FirstMonth: int(mvSpec.FirstMonthOfYear), + }) + resolvedTimeRanges = append(resolvedTimeRanges, metricsview.TimeRange{ + Expression: qry.TimeRange.Expression, + Start: start, + End: end, + }) + } + + if qry.ComparisonTimeRange != nil && qry.ComparisonTimeRange.Expression != "" { + expr, err := rilltime.Parse(qry.ComparisonTimeRange.Expression, rilltime.ParseOptions{ + TimeZoneOverride: tz, + SmallestGrain: timeutil.TimeGrainFromAPI(mvSpec.SmallestTimeGrain), + }) + if err != nil { + return nil, fmt.Errorf("error parsing time range %s: %w", qry.TimeRange.Expression, err) + } + + start, end, _ := expr.Eval(rilltime.EvalOptions{ + Now: now, + MinTime: ts.Min, + MaxTime: ts.Max, + Watermark: ts.Watermark, + FirstDay: int(mvSpec.FirstDayOfWeek), + FirstMonth: int(mvSpec.FirstMonthOfYear), + }) + resolvedTimeRanges = append(resolvedTimeRanges, metricsview.TimeRange{ + Expression: qry.ComparisonTimeRange.Expression, + Start: start, + End: end, + }) + } + + return resolvedTimeRanges, nil +} From 4afbf90dd2f6ea1b59255e6567953b58d149423a Mon Sep 17 00:00:00 2001 From: Aditya Hegde Date: Tue, 26 May 2026 19:15:07 +0530 Subject: [PATCH 4/8] Use resolved time ranges --- .../messages/text/AssistantMessage.svelte | 15 +--- .../messages/text/citation-url-mapper.spec.ts | 7 +- .../core/messages/text/citation-url-mapper.ts | 42 +++++++---- .../messages/text/enhance-citation-links.ts | 12 ++-- .../text/rewrite-citation-urls.spec.ts | 72 ------------------- .../messages/text/rewrite-citation-urls.ts | 65 ----------------- ...map-metrics-resolver-query-to-dashboard.ts | 57 +++++++-------- .../features/explore-mappers/open-query.ts | 4 +- 8 files changed, 67 insertions(+), 207 deletions(-) delete mode 100644 web-common/src/features/chat/core/messages/text/rewrite-citation-urls.spec.ts delete mode 100644 web-common/src/features/chat/core/messages/text/rewrite-citation-urls.ts diff --git a/web-common/src/features/chat/core/messages/text/AssistantMessage.svelte b/web-common/src/features/chat/core/messages/text/AssistantMessage.svelte index 36218bd3c8d9..4dbc4a391b6e 100644 --- a/web-common/src/features/chat/core/messages/text/AssistantMessage.svelte +++ b/web-common/src/features/chat/core/messages/text/AssistantMessage.svelte @@ -1,8 +1,6 @@
- {#await contentPromise} - - {:then content} - - {/await} +
{ ]; for (const { title, url, expectedUrl } of testCases) { - it(title, async () => { - const result = await mapMetricsResolverQueryToUrl( - { instanceId: "" } as RuntimeClient, + it(title, () => { + const result = mapMetricsResolverQueryToUrl( + "", new URL(url), mockPage, MockMetricsViewAndExploreSpecs, diff --git a/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts b/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts index a8dcf7dcd9a1..9606d605fcdb 100644 --- a/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts +++ b/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts @@ -5,7 +5,10 @@ import { type MetricsViewAndExploreSpecs, } from "@rilldata/web-common/features/entity-management/resource-selectors.ts"; import { queryClient } from "@rilldata/web-common/lib/svelte-query/globalQueryClient.ts"; -import type { Schema as MetricsResolverQuery } from "@rilldata/web-common/runtime-client/gen/resolvers/metrics/schema.ts"; +import type { + Schema as MetricsResolverQuery, + TimeRange, +} from "@rilldata/web-common/runtime-client/gen/resolvers/metrics/schema.ts"; import { getQueryFromUrl } from "@rilldata/web-common/features/chat/core/citation-url-utils.ts"; import { mapMetricsResolverQueryToDashboard } from "@rilldata/web-common/features/explore-mappers/map-metrics-resolver-query-to-dashboard.ts"; import { maybeGetExplorePageUrlSearchParams } from "@rilldata/web-common/features/explore-mappers/utils.ts"; @@ -18,11 +21,9 @@ import { MessageType, ToolName, } from "@rilldata/web-common/features/chat/core/types.ts"; -import { RuntimeClient } from "@rilldata/web-common/runtime-client/v2"; -export const LEGACY_DASHBOARD_CITATION_URL_PATHNAME_REGEX = - /\/-\/open-query\/?$/; -export const DASHBOARD_CITATION_URL_PATHNAME_REGEX = +const LEGACY_DASHBOARD_CITATION_URL_PATHNAME_REGEX = /\/-\/open-query\/?$/; +const DASHBOARD_CITATION_URL_PATHNAME_REGEX = /\/-\/ai\/[^/]+\/message\/([^/]+)\/-\/open\/?$/; /** @@ -36,7 +37,7 @@ export function getMetricsResolverQueryToUrlMapperStore( ): Readable<{ error: Error | null; isLoading: boolean; - data?: (url: URL) => Promise; + data?: (url: URL) => string; }> { const resourcesQuery = createQuery( getMetricsViewAndExploreSpecsQueryOptions(conversation.runtimeClient), @@ -60,9 +61,9 @@ export function getMetricsResolverQueryToUrlMapperStore( const metricsViewAndExploreSpecs = resourcesResp.data; const messages = conversationResp.data?.messages ?? []; - const mapper = (url: URL): Promise => + const mapper = (url: URL): string => mapMetricsResolverQueryToUrl( - conversation.runtimeClient, + conversation.runtimeClient.instanceId, url, page, metricsViewAndExploreSpecs, @@ -78,8 +79,8 @@ export function getMetricsResolverQueryToUrlMapperStore( ); } -export async function mapMetricsResolverQueryToUrl( - runtimeClient: RuntimeClient, +export function mapMetricsResolverQueryToUrl( + instanceId: string, url: URL, pageState: Page, { @@ -88,11 +89,14 @@ export async function mapMetricsResolverQueryToUrl( exploreSpecsMap, }: MetricsViewAndExploreSpecs, messages: V1Message[], -): Promise { +): string { let query: MetricsResolverQuery; const isLegacyCitationUrl = LEGACY_DASHBOARD_CITATION_URL_PATHNAME_REGEX.test(url.pathname) && url.searchParams.has("query"); + + const resolvedTimeRanges: TimeRange[] = []; + if (isLegacyCitationUrl) { try { query = getQueryFromUrl(url); @@ -114,6 +118,16 @@ export async function mapMetricsResolverQueryToUrl( callMessage.tool === ToolName.QUERY_METRICS_VIEW; if (!isMetricsQueryCall) return url.href; query = callMessage.content?.[0]?.toolCall?.input; + + const resultMessage = messages.find((m) => m.parentId === callId); + if (resultMessage?.contentData) { + try { + const resultData = JSON.parse(resultMessage.contentData); + resolvedTimeRanges.push(...resultData.resolved_time_ranges); + } catch (e) { + console.error("Failed to parse result message JSON", e); + } + } } const metricsViewName = query.metrics_view ?? ""; @@ -123,15 +137,15 @@ export async function mapMetricsResolverQueryToUrl( const exploreSpec = exploreSpecsMap.get(exploreName); if (!exploreSpec) return url.href; - const partialExploreState = await mapMetricsResolverQueryToDashboard( - runtimeClient, + const partialExploreState = mapMetricsResolverQueryToDashboard( metricsViewSpec, exploreSpec, query, + resolvedTimeRanges, ); const urlSearchParams = maybeGetExplorePageUrlSearchParams( - runtimeClient.instanceId, + instanceId, partialExploreState, metricsViewSpec, exploreSpec, diff --git a/web-common/src/features/chat/core/messages/text/enhance-citation-links.ts b/web-common/src/features/chat/core/messages/text/enhance-citation-links.ts index d0abc0774427..402f1a14b340 100644 --- a/web-common/src/features/chat/core/messages/text/enhance-citation-links.ts +++ b/web-common/src/features/chat/core/messages/text/enhance-citation-links.ts @@ -29,8 +29,11 @@ export function enhanceCitationLinks( const href = e.target.getAttribute("href") ?? ""; const parsedUrl = URL.parse(href); + const mapper = get(mapperStore).data; + const mappedHref = parsedUrl && mapper ? mapper(parsedUrl) : href; + const isLocalLink = window.location.origin === parsedUrl?.origin; - const isPartialLink = href.startsWith("/"); + const isPartialLink = mappedHref.startsWith("/"); const shouldUseGoto = isLocalLink || isPartialLink; if (!shouldUseGoto) return; @@ -38,12 +41,7 @@ export function enhanceCitationLinks( // map the citation URL on demand. After the rewrite, the mapper is a no-op on // the already-translated href. e.preventDefault(); - void (async () => { - const mapper = get(mapperStore).data; - const mappedHref = - parsedUrl && mapper ? await mapper(parsedUrl) : href; - void goto(mappedHref); - })(); + void goto(mappedHref); } node.addEventListener("click", handleClick); diff --git a/web-common/src/features/chat/core/messages/text/rewrite-citation-urls.spec.ts b/web-common/src/features/chat/core/messages/text/rewrite-citation-urls.spec.ts deleted file mode 100644 index f1aeaf880d89..000000000000 --- a/web-common/src/features/chat/core/messages/text/rewrite-citation-urls.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { describe, it, expect, vi } from "vitest"; -import { rewriteCitationUrls } from "@rilldata/web-common/features/chat/core/messages/text/rewrite-citation-urls.ts"; - -const MAPPED = "http://localhost:3000/explore/AdBids_explore?view=explore"; - -describe("rewriteCitationUrls", () => { - it("returns content unchanged when there are no citation URLs", async () => { - const mapper = vi.fn(async (u: URL) => u.href); - const content = "no links here, just text and a code `snippet`."; - const result = await rewriteCitationUrls(content, mapper); - expect(result).toBe(content); - expect(mapper).not.toHaveBeenCalled(); - }); - - it("rewrites a single absolute citation URL inside a markdown link", async () => { - const mapper = vi.fn(async () => MAPPED); - const content = - "See [chart](http://localhost:3000/-/ai/sess/message/abc/-/open) for details."; - const result = await rewriteCitationUrls(content, mapper); - expect(result).toBe(`See [chart](${MAPPED}) for details.`); - expect(mapper).toHaveBeenCalledTimes(1); - }); - - it("rewrites a relative citation URL and preserves relativity", async () => { - const mapper = vi.fn( - async () => "http://localhost/explore/foo?view=explore", - ); - const content = "Click [here](/-/ai/sess/message/abc/-/open)."; - const result = await rewriteCitationUrls(content, mapper); - expect(result).toBe("Click [here](/explore/foo?view=explore)."); - }); - - it("rewrites legacy /-/open-query citation URLs", async () => { - const mapper = vi.fn(async () => MAPPED); - const content = - "[legacy](http://localhost:3000/-/open-query?query=%7B%7D)"; - const result = await rewriteCitationUrls(content, mapper); - expect(result).toBe(`[legacy](${MAPPED})`); - }); - - it("rewrites multiple citation URLs in parallel", async () => { - const mapper = vi.fn(async (url: URL) => `${MAPPED}#${url.pathname}`); - const content = - "First [a](http://localhost:3000/-/ai/s/message/one/-/open) and " + - "second [b](http://localhost:3000/-/ai/s/message/two/-/open)."; - const result = await rewriteCitationUrls(content, mapper); - expect(mapper).toHaveBeenCalledTimes(2); - expect(result).toBe( - `First [a](${MAPPED}#/-/ai/s/message/one/-/open) and ` + - `second [b](${MAPPED}#/-/ai/s/message/two/-/open).`, - ); - }); - - it("leaves non-citation URLs untouched", async () => { - const mapper = vi.fn(async () => MAPPED); - const content = - "Visit [docs](https://docs.rilldata.com/intro) or [home](/dashboards)."; - const result = await rewriteCitationUrls(content, mapper); - expect(result).toBe(content); - expect(mapper).not.toHaveBeenCalled(); - }); - - it("handles a mix of citation and non-citation URLs", async () => { - const mapper = vi.fn(async () => MAPPED); - const content = - "[docs](https://docs.rilldata.com) then " + - "[chart](http://localhost:3000/-/ai/sess/message/abc/-/open)."; - const result = await rewriteCitationUrls(content, mapper); - expect(mapper).toHaveBeenCalledTimes(1); - expect(result).toBe(`[docs](https://docs.rilldata.com) then [chart](${MAPPED}).`); - }); -}); diff --git a/web-common/src/features/chat/core/messages/text/rewrite-citation-urls.ts b/web-common/src/features/chat/core/messages/text/rewrite-citation-urls.ts deleted file mode 100644 index 6c1448aad20b..000000000000 --- a/web-common/src/features/chat/core/messages/text/rewrite-citation-urls.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { - DASHBOARD_CITATION_URL_PATHNAME_REGEX, - LEGACY_DASHBOARD_CITATION_URL_PATHNAME_REGEX, -} from "@rilldata/web-common/features/chat/core/messages/text/citation-url-mapper.ts"; - -// Matches absolute http(s) URLs and root-relative paths that contain `/-/`. -// Citation URLs always include `/-/` (either `/-/open-query` or `/-/ai/.../-/open`), -// so we use it as a cheap pre-filter before parsing. -const CITATION_URL_DETECT_REGEX = /https?:\/\/[^\s)<>"`]+|\/-\/[^\s)<>"`]+/g; - -const FALLBACK_BASE = "http://localhost"; - -/** - * Rewrites citation URLs in the given markdown content using the provided async mapper. - * Non-citation URLs and non-URL text are left untouched. Per-URL mapper calls run in - * parallel; replacements are applied in reverse index order so earlier offsets remain valid. - */ -export async function rewriteCitationUrls( - content: string, - mapper: (url: URL) => Promise, -): Promise { - const matches = [...content.matchAll(CITATION_URL_DETECT_REGEX)]; - if (matches.length === 0) return content; - - const base = - typeof window !== "undefined" ? window.location.origin : FALLBACK_BASE; - - const replacements = await Promise.all( - matches.map(async (match) => { - const raw = match[0]; - let url: URL; - try { - url = new URL(raw, base); - } catch { - return null; - } - const isCitation = - DASHBOARD_CITATION_URL_PATHNAME_REGEX.test(url.pathname) || - LEGACY_DASHBOARD_CITATION_URL_PATHNAME_REGEX.test(url.pathname); - if (!isCitation) return null; - - const mapped = await mapper(url); - // Preserve relativity: if the source was a relative path and the mapper - // returned an absolute URL on the synthetic base, strip the base back off. - const wasRelative = raw.startsWith("/"); - const replacement = - wasRelative && mapped.startsWith(base) - ? mapped.slice(base.length) - : mapped; - return { index: match.index ?? 0, length: raw.length, replacement }; - }), - ); - - const valid = replacements - .filter((r): r is { index: number; length: number; replacement: string } => - r !== null, - ) - .sort((a, b) => b.index - a.index); - - let result = content; - for (const { index, length, replacement } of valid) { - result = result.slice(0, index) + replacement + result.slice(index + length); - } - return result; -} diff --git a/web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.ts b/web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.ts index 9b990e7df6b8..f23d3f07fad2 100644 --- a/web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.ts +++ b/web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.ts @@ -37,14 +37,12 @@ import type { TimeRange, } from "@rilldata/web-common/runtime-client/gen/resolvers/metrics/schema.ts"; import type { SortingState } from "tanstack-table-8-svelte-5"; -import { resolveTimeRanges } from "@rilldata/web-common/features/dashboards/time-controls/rill-time-ranges.ts"; -import { RuntimeClient } from "@rilldata/web-common/runtime-client/v2"; -export async function mapMetricsResolverQueryToDashboard( - runtimeClient: RuntimeClient, +export function mapMetricsResolverQueryToDashboard( metricsViewSpec: V1MetricsViewSpec, exploreSpec: V1ExploreSpec, query: MetricsResolverQuery, + resolvedTimeRanges: TimeRange[], ) { // Build partial ExploreState directly from Query const partialExploreState: Partial = {}; @@ -80,7 +78,7 @@ export async function mapMetricsResolverQueryToDashboard( } // Convert time ranges - await mapTimeRanges(runtimeClient, exploreSpec, partialExploreState, query); + mapTimeRanges(partialExploreState, query, resolvedTimeRanges); // Convert where filter if (query.where) { @@ -187,44 +185,43 @@ function getValidDimensions( }; } -async function mapTimeRanges( - runtimeClient: RuntimeClient, - exploreSpec: V1ExploreSpec, +function mapTimeRanges( partialExploreState: Partial, query: MetricsResolverQuery, + resolvedTimeRanges: TimeRange[], ) { partialExploreState.selectedTimeRange = mapResolverTimeRangeToDashboardControls(query.time_range); + fillInResolvedTimeRange( + partialExploreState.selectedTimeRange, + resolvedTimeRanges, + ); + if (query.comparison_time_range) { partialExploreState.selectedComparisonTimeRange = mapResolverTimeRangeToDashboardControls(query.comparison_time_range); partialExploreState.showTimeComparison = true; - } - // Resolve start/end by making a network call. - [ - partialExploreState.selectedTimeRange, - partialExploreState.selectedComparisonTimeRange, - ] = await resolveTimeRanges( - runtimeClient, - exploreSpec, - [ - partialExploreState.selectedTimeRange, + + fillInResolvedTimeRange( partialExploreState.selectedComparisonTimeRange, - ], - partialExploreState.selectedTimezone, - undefined, - partialExploreState.selectedTimeDimension, - ); - // Set time ranges to custom so that - if (partialExploreState.selectedTimeRange) { - partialExploreState.selectedTimeRange.name = TimeRangePreset.CUSTOM; - } - if (partialExploreState.selectedComparisonTimeRange) { - partialExploreState.selectedComparisonTimeRange.name = - TimeRangePreset.CUSTOM; + resolvedTimeRanges, + ); } } +function fillInResolvedTimeRange( + dashboardTimeRange: DashboardTimeControls, + resolvedTimeRanges: TimeRange[], +) { + const resolvedTimeRange = resolvedTimeRanges.find( + (tr) => tr.expression === dashboardTimeRange.name, + ); + if (!resolvedTimeRange) return; + dashboardTimeRange.name = TimeRangePreset.CUSTOM; + dashboardTimeRange.start = new Date(resolvedTimeRange.start!); + dashboardTimeRange.end = new Date(resolvedTimeRange.end!); +} + function mapResolverTimeRangeToDashboardControls( timeRange: TimeRange | undefined, ): DashboardTimeControls { diff --git a/web-common/src/features/explore-mappers/open-query.ts b/web-common/src/features/explore-mappers/open-query.ts index aa739603e1b3..88d14c2ae8a3 100644 --- a/web-common/src/features/explore-mappers/open-query.ts +++ b/web-common/src/features/explore-mappers/open-query.ts @@ -54,11 +54,11 @@ export async function openQuery({ ); // Convert query to ExploreState - const exploreState = await mapMetricsResolverQueryToDashboard( - client, + const exploreState = mapMetricsResolverQueryToDashboard( metricsViewSpec, exploreSpec, query, + [], // TODO ); // Generate the final explore URL From c197e1a01784a13e18268ec9cc05af694bfcd69d Mon Sep 17 00:00:00 2001 From: Aditya Hegde Date: Tue, 26 May 2026 19:19:02 +0530 Subject: [PATCH 5/8] cleanup --- .../core/messages/text/citation-url-mapper.ts | 2 +- .../messages/text/enhance-citation-links.ts | 3 - .../url-state/time-ranges/RillTime.ts | 23 - .../url-state/time-ranges/rill-time.js | 988 +++++++++++++++--- .../url-state/time-ranges/rill-time.ne | 11 +- .../url-state/time-ranges/rill-time.spec.ts | 59 -- 6 files changed, 818 insertions(+), 268 deletions(-) diff --git a/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts b/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts index 9606d605fcdb..bc03aabda9db 100644 --- a/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts +++ b/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts @@ -89,7 +89,7 @@ export function mapMetricsResolverQueryToUrl( exploreSpecsMap, }: MetricsViewAndExploreSpecs, messages: V1Message[], -): string { +) { let query: MetricsResolverQuery; const isLegacyCitationUrl = LEGACY_DASHBOARD_CITATION_URL_PATHNAME_REGEX.test(url.pathname) && diff --git a/web-common/src/features/chat/core/messages/text/enhance-citation-links.ts b/web-common/src/features/chat/core/messages/text/enhance-citation-links.ts index 402f1a14b340..79eaf153af2a 100644 --- a/web-common/src/features/chat/core/messages/text/enhance-citation-links.ts +++ b/web-common/src/features/chat/core/messages/text/enhance-citation-links.ts @@ -37,9 +37,6 @@ export function enhanceCitationLinks( const shouldUseGoto = isLocalLink || isPartialLink; if (!shouldUseGoto) return; - // Fallback path for clicks that land before the async content rewrite completes: - // map the citation URL on demand. After the rewrite, the mapper is a no-op on - // the already-translated href. e.preventDefault(); void goto(mappedHref); } diff --git a/web-common/src/features/dashboards/url-state/time-ranges/RillTime.ts b/web-common/src/features/dashboards/url-state/time-ranges/RillTime.ts index 94b0e54b2785..3af3bb43de4a 100644 --- a/web-common/src/features/dashboards/url-state/time-ranges/RillTime.ts +++ b/web-common/src/features/dashboards/url-state/time-ranges/RillTime.ts @@ -32,13 +32,10 @@ export type RillTimeAsOfLabel = { offset: number; }; -export type RillOffset = RillPreviousPeriodOffset | RillGrainPointInTimePart; - export class RillTime { public isComplete: boolean = false; public timezone: string | undefined; public anchorOverrides: RillPointInTime[] = []; - public offset: RillOffset | undefined; public readonly rangeGrain: V1TimeGrain | undefined; public byGrain: V1TimeGrain | undefined; @@ -70,11 +67,6 @@ export class RillTime { return this; } - public withOffset(offset: RillOffset) { - this.offset = offset; - return this; - } - public withAnchorOverrides(anchorOverrides: RillPointInTime[]) { this.anchorOverrides = anchorOverrides; this.asOfLabel = this.getAsOfLabel(); @@ -124,10 +116,6 @@ export class RillTime { timeRange += ` tz ${this.timezone}`; } - if (this.offset) { - timeRange += ` offset ${this.offset.toString()}`; - } - return timeRange; } @@ -743,17 +731,6 @@ export class RillAbsoluteTime implements RillPointInTimeVariant { } } -export class RillPreviousPeriodOffset { - public constructor( - public readonly prefix: string, - public readonly num: number, - ) {} - - public toString() { - return `${this.prefix}${this.num}P`; - } -} - type RillGrain = { grain: string; num?: number; diff --git a/web-common/src/features/dashboards/url-state/time-ranges/rill-time.js b/web-common/src/features/dashboards/url-state/time-ranges/rill-time.js index 4413773c351b..1cb7cc16435f 100644 --- a/web-common/src/features/dashboards/url-state/time-ranges/rill-time.js +++ b/web-common/src/features/dashboards/url-state/time-ranges/rill-time.js @@ -1,181 +1,823 @@ // Generated automatically by nearley, version 2.20.1 // http://github.com/Hardmath123/nearley -function id(x) { return x[0]; } +function id(x) { + return x[0]; +} - import { - RillTime, - - RillShorthandInterval, - RillPeriodToGrainInterval, - RillTimeStartEndInterval, - RillTimeOrdinalInterval, - RillIsoInterval, - RillLegacyIsoInterval, - RillLegacyDaxInterval, - RillAllTimeInterval, - - RillPointInTime, - RillPointInTimeWithSnap, - RillLabelledPointInTime, - RillGrainPointInTime, - RillGrainPointInTimePart, - RillAbsoluteTime, - RillPreviousPeriodOffset, - } from "./RillTime.ts" +import { + RillTime, + RillShorthandInterval, + RillPeriodToGrainInterval, + RillTimeStartEndInterval, + RillTimeOrdinalInterval, + RillIsoInterval, + RillLegacyIsoInterval, + RillLegacyDaxInterval, + RillAllTimeInterval, + RillPointInTime, + RillPointInTimeWithSnap, + RillLabelledPointInTime, + RillGrainPointInTime, + RillGrainPointInTimePart, + RillAbsoluteTime, +} from "./RillTime.ts"; let Lexer = undefined; let ParserRules = [ - {"name": "_$ebnf$1", "symbols": []}, - {"name": "_$ebnf$1", "symbols": ["_$ebnf$1", "wschar"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "_", "symbols": ["_$ebnf$1"], "postprocess": function(d) {return null;}}, - {"name": "__$ebnf$1", "symbols": ["wschar"]}, - {"name": "__$ebnf$1", "symbols": ["__$ebnf$1", "wschar"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "__", "symbols": ["__$ebnf$1"], "postprocess": function(d) {return null;}}, - {"name": "wschar", "symbols": [/[ \t\n\v\f]/], "postprocess": id}, - {"name": "dqstring$ebnf$1", "symbols": []}, - {"name": "dqstring$ebnf$1", "symbols": ["dqstring$ebnf$1", "dstrchar"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "dqstring", "symbols": [{"literal":"\""}, "dqstring$ebnf$1", {"literal":"\""}], "postprocess": function(d) {return d[1].join(""); }}, - {"name": "sqstring$ebnf$1", "symbols": []}, - {"name": "sqstring$ebnf$1", "symbols": ["sqstring$ebnf$1", "sstrchar"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "sqstring", "symbols": [{"literal":"'"}, "sqstring$ebnf$1", {"literal":"'"}], "postprocess": function(d) {return d[1].join(""); }}, - {"name": "btstring$ebnf$1", "symbols": []}, - {"name": "btstring$ebnf$1", "symbols": ["btstring$ebnf$1", /[^`]/], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "btstring", "symbols": [{"literal":"`"}, "btstring$ebnf$1", {"literal":"`"}], "postprocess": function(d) {return d[1].join(""); }}, - {"name": "dstrchar", "symbols": [/[^\\"\n]/], "postprocess": id}, - {"name": "dstrchar", "symbols": [{"literal":"\\"}, "strescape"], "postprocess": - function(d) { - return JSON.parse("\""+d.join("")+"\""); - } - }, - {"name": "sstrchar", "symbols": [/[^\\'\n]/], "postprocess": id}, - {"name": "sstrchar", "symbols": [{"literal":"\\"}, "strescape"], "postprocess": function(d) { return JSON.parse("\""+d.join("")+"\""); }}, - {"name": "sstrchar$string$1", "symbols": [{"literal":"\\"}, {"literal":"'"}], "postprocess": function joiner(d) {return d.join('');}}, - {"name": "sstrchar", "symbols": ["sstrchar$string$1"], "postprocess": function(d) {return "'"; }}, - {"name": "strescape", "symbols": [/["\\/bfnrt]/], "postprocess": id}, - {"name": "strescape", "symbols": [{"literal":"u"}, /[a-fA-F0-9]/, /[a-fA-F0-9]/, /[a-fA-F0-9]/, /[a-fA-F0-9]/], "postprocess": - function(d) { - return d.join(""); - } - }, - {"name": "rill_time", "symbols": ["new_rill_time"], "postprocess": id}, - {"name": "rill_time", "symbols": ["old_rill_time"], "postprocess": id}, - {"name": "new_rill_time$ebnf$1", "symbols": []}, - {"name": "new_rill_time$ebnf$1", "symbols": ["new_rill_time$ebnf$1", "trailing_modifier"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "new_rill_time", "symbols": ["interval_with_grain", "new_rill_time$ebnf$1"], "postprocess": ([rt, modifiers]) => modifiers.reduce((acc, mod) => mod(acc), rt)}, - {"name": "trailing_modifier$string$1", "symbols": [{"literal":"t"}, {"literal":"z"}], "postprocess": function joiner(d) {return d.join('');}}, - {"name": "trailing_modifier", "symbols": ["_", "trailing_modifier$string$1", "_", "timezone_modifier"], "postprocess": ([, , , tz]) => (rt) => rt.withTimezone(tz)}, - {"name": "trailing_modifier$subexpression$1", "symbols": [/[oO]/, /[fF]/, /[fF]/, /[sS]/, /[eE]/, /[tT]/], "postprocess": function(d) {return d.join(""); }}, - {"name": "trailing_modifier", "symbols": ["_", "trailing_modifier$subexpression$1", "_", "offset_value"], "postprocess": ([, , , offset]) => (rt) => rt.withOffset(offset)}, - {"name": "interval_with_grain$subexpression$1", "symbols": [/[bB]/, /[yY]/], "postprocess": function(d) {return d.join(""); }}, - {"name": "interval_with_grain", "symbols": ["interval_with_anchor_override", "_", "interval_with_grain$subexpression$1", "_", "grain"], "postprocess": ([rt, , , , grain]) => rt.withGrain(grain)}, - {"name": "interval_with_grain", "symbols": ["interval_with_anchor_override"], "postprocess": id}, - {"name": "interval_with_anchor_override$ebnf$1", "symbols": []}, - {"name": "interval_with_anchor_override$ebnf$1", "symbols": ["interval_with_anchor_override$ebnf$1", "anchor_override"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "interval_with_anchor_override", "symbols": ["interval", "interval_with_anchor_override$ebnf$1"], "postprocess": ([interval, anchorOverrides]) => new RillTime(interval).withAnchorOverrides(anchorOverrides)}, - {"name": "anchor_override$subexpression$1", "symbols": [/[aA]/, /[sS]/], "postprocess": function(d) {return d.join(""); }}, - {"name": "anchor_override$subexpression$2", "symbols": [/[oO]/, /[fF]/], "postprocess": function(d) {return d.join(""); }}, - {"name": "anchor_override", "symbols": ["_", "anchor_override$subexpression$1", "_", "anchor_override$subexpression$2", "_", "point_in_time"], "postprocess": ([, , , , , pointInTime]) => pointInTime}, - {"name": "interval", "symbols": ["shorthand_interval"], "postprocess": id}, - {"name": "interval", "symbols": ["period_to_grain_interval"], "postprocess": id}, - {"name": "interval", "symbols": ["start_end_interval"], "postprocess": id}, - {"name": "interval", "symbols": ["ordinal_interval"], "postprocess": id}, - {"name": "interval", "symbols": ["iso_interval"], "postprocess": id}, - {"name": "interval$subexpression$1", "symbols": [/[iI]/, /[nN]/, /[fF]/], "postprocess": function(d) {return d.join(""); }}, - {"name": "interval", "symbols": ["interval$subexpression$1"], "postprocess": () => new RillAllTimeInterval()}, - {"name": "shorthand_interval", "symbols": ["grain_duration"], "postprocess": ([parts]) => new RillShorthandInterval(parts)}, - {"name": "period_to_grain_interval", "symbols": ["period_to_grain"], "postprocess": ([grain]) => new RillPeriodToGrainInterval(grain)}, - {"name": "ordinal_interval$ebnf$1", "symbols": []}, - {"name": "ordinal_interval$ebnf$1$subexpression$1$subexpression$1", "symbols": [/[oO]/, /[fF]/], "postprocess": function(d) {return d.join(""); }}, - {"name": "ordinal_interval$ebnf$1$subexpression$1", "symbols": ["_", "ordinal_interval$ebnf$1$subexpression$1$subexpression$1", "_", "ordinal"]}, - {"name": "ordinal_interval$ebnf$1", "symbols": ["ordinal_interval$ebnf$1", "ordinal_interval$ebnf$1$subexpression$1"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "ordinal_interval", "symbols": ["ordinal", "ordinal_interval$ebnf$1"], "postprocess": ([part, rest]) => new RillTimeOrdinalInterval([part, ...rest.map(([, , , p]) => p)])}, - {"name": "start_end_interval$subexpression$1", "symbols": [/[tT]/, /[oO]/], "postprocess": function(d) {return d.join(""); }}, - {"name": "start_end_interval", "symbols": ["point_in_time", "_", "start_end_interval$subexpression$1", "_", "point_in_time"], "postprocess": ([start, , , , end]) => new RillTimeStartEndInterval(start, end)}, - {"name": "iso_interval$subexpression$1", "symbols": [/[tT]/, /[oO]/], "postprocess": function(d) {return d.join(""); }}, - {"name": "iso_interval", "symbols": ["abs_time", "_", "iso_interval$subexpression$1", "_", "abs_time"], "postprocess": ([start, , , , end]) => new RillIsoInterval(start, end)}, - {"name": "iso_interval", "symbols": ["abs_time", "_", {"literal":"/"}, "_", "abs_time"], "postprocess": ([start, , , , end]) => new RillIsoInterval(start, end)}, - {"name": "iso_interval", "symbols": ["abs_time", "_", {"literal":","}, "_", "abs_time"], "postprocess": ([start, , , , end]) => new RillIsoInterval(start, end)}, - {"name": "iso_interval", "symbols": ["abs_time"], "postprocess": ([start]) => new RillIsoInterval(start, undefined)}, - {"name": "point_in_time$ebnf$1", "symbols": []}, - {"name": "point_in_time$ebnf$1", "symbols": ["point_in_time$ebnf$1", "point_in_time_with_snap"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "point_in_time", "symbols": ["point_in_time$ebnf$1", "point_in_time_without_snap"], "postprocess": ([points, last]) => new RillPointInTime([...points, last])}, - {"name": "point_in_time", "symbols": ["point_in_time_with_snap"], "postprocess": ([point]) => new RillPointInTime([point])}, - {"name": "point_in_time_with_snap", "symbols": ["point_in_time_variants", "_", {"literal":"/"}, "_", "grain", "_", {"literal":"/"}, "_", "grain"], "postprocess": ([point, , , , firstGrain, , , , secondGrain]) => new RillPointInTimeWithSnap(point, [firstGrain, secondGrain])}, - {"name": "point_in_time_with_snap", "symbols": ["point_in_time_variants", "_", {"literal":"/"}, "_", "grain"], "postprocess": ([point, , , , grain]) => new RillPointInTimeWithSnap(point, [grain])}, - {"name": "point_in_time_without_snap", "symbols": ["point_in_time_variants"], "postprocess": ([point]) => new RillPointInTimeWithSnap(point, [])}, - {"name": "point_in_time_variants", "symbols": ["grain_point_in_time"], "postprocess": id}, - {"name": "point_in_time_variants", "symbols": ["labeled_point_in_time"], "postprocess": id}, - {"name": "point_in_time_variants", "symbols": ["abs_time"], "postprocess": id}, - {"name": "grain_point_in_time$ebnf$1", "symbols": ["grain_point_in_time_part"]}, - {"name": "grain_point_in_time$ebnf$1", "symbols": ["grain_point_in_time$ebnf$1", "grain_point_in_time_part"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "grain_point_in_time", "symbols": ["grain_point_in_time$ebnf$1"], "postprocess": ([parts]) => new RillGrainPointInTime([...parts])}, - {"name": "grain_point_in_time_part", "symbols": ["prefix", "_", "grain_duration"], "postprocess": ([prefix, _, grains]) => new RillGrainPointInTimePart(prefix, grains)}, - {"name": "offset_value", "symbols": ["previous_period"], "postprocess": id}, - {"name": "offset_value", "symbols": ["grain_point_in_time_part"], "postprocess": id}, - {"name": "previous_period$subexpression$1", "symbols": [/[pP]/], "postprocess": function(d) {return d.join(""); }}, - {"name": "previous_period", "symbols": ["prefix", "_", "num", "previous_period$subexpression$1"], "postprocess": ([prefix, _, num]) => new RillPreviousPeriodOffset(prefix, num)}, - {"name": "labeled_point_in_time$subexpression$1", "symbols": [/[eE]/, /[aA]/, /[rR]/, /[lL]/, /[iI]/, /[eE]/, /[sS]/, /[tT]/], "postprocess": function(d) {return d.join(""); }}, - {"name": "labeled_point_in_time", "symbols": ["labeled_point_in_time$subexpression$1"], "postprocess": RillLabelledPointInTime.postProcessor}, - {"name": "labeled_point_in_time$subexpression$2", "symbols": [/[lL]/, /[aA]/, /[tT]/, /[eE]/, /[sS]/, /[tT]/], "postprocess": function(d) {return d.join(""); }}, - {"name": "labeled_point_in_time", "symbols": ["labeled_point_in_time$subexpression$2"], "postprocess": RillLabelledPointInTime.postProcessor}, - {"name": "labeled_point_in_time$subexpression$3", "symbols": [/[nN]/, /[oO]/, /[wW]/], "postprocess": function(d) {return d.join(""); }}, - {"name": "labeled_point_in_time", "symbols": ["labeled_point_in_time$subexpression$3"], "postprocess": RillLabelledPointInTime.postProcessor}, - {"name": "labeled_point_in_time$subexpression$4", "symbols": [/[wW]/, /[aA]/, /[tT]/, /[eE]/, /[rR]/, /[mM]/, /[aA]/, /[rR]/, /[kK]/], "postprocess": function(d) {return d.join(""); }}, - {"name": "labeled_point_in_time", "symbols": ["labeled_point_in_time$subexpression$4"], "postprocess": RillLabelledPointInTime.postProcessor}, - {"name": "labeled_point_in_time$subexpression$5", "symbols": [/[rR]/, /[eE]/, /[fF]/], "postprocess": function(d) {return d.join(""); }}, - {"name": "labeled_point_in_time", "symbols": ["labeled_point_in_time$subexpression$5"], "postprocess": RillLabelledPointInTime.postProcessor}, - {"name": "ordinal", "symbols": ["grain", "num"], "postprocess": ([grain, num]) => ({num, grain})}, - {"name": "grain_duration$ebnf$1", "symbols": ["grain_duration_part"]}, - {"name": "grain_duration$ebnf$1", "symbols": ["grain_duration$ebnf$1", "grain_duration_part"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "grain_duration", "symbols": ["grain_duration$ebnf$1"], "postprocess": ([parts]) => parts}, - {"name": "grain_duration_part", "symbols": ["num", "grain"], "postprocess": ([num, grain]) => ({num, grain})}, - {"name": "period_to_grain$string$1", "symbols": [{"literal":"T"}, {"literal":"D"}], "postprocess": function joiner(d) {return d.join('');}}, - {"name": "period_to_grain", "symbols": ["grain", "period_to_grain$string$1"], "postprocess": ([grain]) => grain}, - {"name": "abs_time$ebnf$1", "symbols": [/[\d]/]}, - {"name": "abs_time$ebnf$1", "symbols": ["abs_time$ebnf$1", /[\d]/], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "abs_time", "symbols": [/[\d]/, /[\d]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, {"literal":"T"}, /[\d]/, /[\d]/, /[:]/, /[\d]/, /[\d]/, /[:]/, /[\d]/, /[\d]/, /[.]/, "abs_time$ebnf$1", {"literal":"Z"}], "postprocess": RillAbsoluteTime.postProcessor}, - {"name": "abs_time", "symbols": [/[\d]/, /[\d]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, {"literal":"T"}, /[\d]/, /[\d]/, /[:]/, /[\d]/, /[\d]/, /[:]/, /[\d]/, /[\d]/, {"literal":"Z"}], "postprocess": RillAbsoluteTime.postProcessor}, - {"name": "abs_time", "symbols": [/[\d]/, /[\d]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, {"literal":"T"}, /[\d]/, /[\d]/, /[:]/, /[\d]/, /[\d]/], "postprocess": RillAbsoluteTime.postProcessor}, - {"name": "abs_time", "symbols": [/[\d]/, /[\d]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, {"literal":"T"}, /[\d]/, /[\d]/], "postprocess": RillAbsoluteTime.postProcessor}, - {"name": "abs_time", "symbols": [/[\d]/, /[\d]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/], "postprocess": RillAbsoluteTime.postProcessor}, - {"name": "abs_time", "symbols": [/[\d]/, /[\d]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/], "postprocess": RillAbsoluteTime.postProcessor}, - {"name": "abs_time", "symbols": [/[\d]/, /[\d]/, /[\d]/, /[\d]/], "postprocess": RillAbsoluteTime.postProcessor}, - {"name": "timezone_modifier$ebnf$1", "symbols": [/[0-9a-zA-Z/+\-_]/]}, - {"name": "timezone_modifier$ebnf$1", "symbols": ["timezone_modifier$ebnf$1", /[0-9a-zA-Z/+\-_]/], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "timezone_modifier", "symbols": ["timezone_modifier$ebnf$1"], "postprocess": ([args]) => args.join("")}, - {"name": "old_rill_time", "symbols": ["iso_time"], "postprocess": ([legacyIso]) => new RillTime(legacyIso)}, - {"name": "old_rill_time", "symbols": ["dax_time"], "postprocess": ([legacyDax]) => new RillTime(new RillLegacyDaxInterval(legacyDax))}, - {"name": "iso_time$ebnf$1", "symbols": ["iso_date_part"]}, - {"name": "iso_time$ebnf$1", "symbols": ["iso_time$ebnf$1", "iso_date_part"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "iso_time$ebnf$2", "symbols": ["iso_time_part"]}, - {"name": "iso_time$ebnf$2", "symbols": ["iso_time$ebnf$2", "iso_time_part"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "iso_time", "symbols": [{"literal":"P"}, "iso_time$ebnf$1", {"literal":"T"}, "iso_time$ebnf$2"], "postprocess": ([, dateGrains, , timeGrains]) => new RillLegacyIsoInterval(dateGrains, timeGrains)}, - {"name": "iso_time$ebnf$3", "symbols": ["iso_date_part"]}, - {"name": "iso_time$ebnf$3", "symbols": ["iso_time$ebnf$3", "iso_date_part"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "iso_time", "symbols": [{"literal":"P"}, "iso_time$ebnf$3"], "postprocess": ([, dateGrains]) => new RillLegacyIsoInterval(dateGrains, [])}, - {"name": "iso_time$string$1", "symbols": [{"literal":"P"}, {"literal":"T"}], "postprocess": function joiner(d) {return d.join('');}}, - {"name": "iso_time$ebnf$4", "symbols": ["iso_time_part"]}, - {"name": "iso_time$ebnf$4", "symbols": ["iso_time$ebnf$4", "iso_time_part"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "iso_time", "symbols": ["iso_time$string$1", "iso_time$ebnf$4"], "postprocess": ([, timeGrains]) => new RillLegacyIsoInterval([], timeGrains)}, - {"name": "iso_date_part", "symbols": ["num", "date_grains"], "postprocess": ([num, grain]) => ({num, grain})}, - {"name": "iso_time_part", "symbols": ["num", "time_grains"], "postprocess": ([num, grain]) => ({num, grain})}, - {"name": "dax_time$string$1", "symbols": [{"literal":"r"}, {"literal":"i"}, {"literal":"l"}, {"literal":"l"}, {"literal":"-"}], "postprocess": function joiner(d) {return d.join('');}}, - {"name": "dax_time", "symbols": ["dax_time$string$1", "dax_notations"], "postprocess": (args) => args.join("")}, - {"name": "dax_notations$string$1", "symbols": [{"literal":"T"}, {"literal":"D"}], "postprocess": function joiner(d) {return d.join('');}}, - {"name": "dax_notations", "symbols": ["dax_to_date", "dax_notations$string$1"], "postprocess": (args) => args.join("")}, - {"name": "dax_notations$string$2", "symbols": [{"literal":"T"}, {"literal":"D"}], "postprocess": function joiner(d) {return d.join('');}}, - {"name": "dax_notations", "symbols": ["dax_notations$string$2"], "postprocess": id}, - {"name": "dax_notations", "symbols": [{"literal":"P"}, "date_grains", {"literal":"C"}], "postprocess": (args) => args.join("")}, - {"name": "dax_notations$string$3", "symbols": [{"literal":"P"}, {"literal":"P"}], "postprocess": function joiner(d) {return d.join('');}}, - {"name": "dax_notations", "symbols": ["dax_notations$string$3"], "postprocess": id}, - {"name": "dax_notations", "symbols": [{"literal":"P"}, "date_grains"], "postprocess": (args) => args.join("")}, - {"name": "prefix", "symbols": [/[+\-]/], "postprocess": id}, - {"name": "num$ebnf$1", "symbols": [/[0-9]/]}, - {"name": "num$ebnf$1", "symbols": ["num$ebnf$1", /[0-9]/], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "num", "symbols": ["num$ebnf$1"], "postprocess": ([args]) => Number(args.join(""))}, - {"name": "grain", "symbols": [/[sSmhHdDwWqQMyY]/], "postprocess": id}, - {"name": "date_grains", "symbols": [/[DWQMY]/], "postprocess": id}, - {"name": "time_grains", "symbols": [/[SMH]/], "postprocess": id}, - {"name": "dax_to_date", "symbols": [/[WQMY]/], "postprocess": id} + { name: "_$ebnf$1", symbols: [] }, + { + name: "_$ebnf$1", + symbols: ["_$ebnf$1", "wschar"], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { + name: "_", + symbols: ["_$ebnf$1"], + postprocess: function (d) { + return null; + }, + }, + { name: "__$ebnf$1", symbols: ["wschar"] }, + { + name: "__$ebnf$1", + symbols: ["__$ebnf$1", "wschar"], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { + name: "__", + symbols: ["__$ebnf$1"], + postprocess: function (d) { + return null; + }, + }, + { name: "wschar", symbols: [/[ \t\n\v\f]/], postprocess: id }, + { name: "dqstring$ebnf$1", symbols: [] }, + { + name: "dqstring$ebnf$1", + symbols: ["dqstring$ebnf$1", "dstrchar"], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { + name: "dqstring", + symbols: [{ literal: '"' }, "dqstring$ebnf$1", { literal: '"' }], + postprocess: function (d) { + return d[1].join(""); + }, + }, + { name: "sqstring$ebnf$1", symbols: [] }, + { + name: "sqstring$ebnf$1", + symbols: ["sqstring$ebnf$1", "sstrchar"], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { + name: "sqstring", + symbols: [{ literal: "'" }, "sqstring$ebnf$1", { literal: "'" }], + postprocess: function (d) { + return d[1].join(""); + }, + }, + { name: "btstring$ebnf$1", symbols: [] }, + { + name: "btstring$ebnf$1", + symbols: ["btstring$ebnf$1", /[^`]/], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { + name: "btstring", + symbols: [{ literal: "`" }, "btstring$ebnf$1", { literal: "`" }], + postprocess: function (d) { + return d[1].join(""); + }, + }, + { name: "dstrchar", symbols: [/[^\\"\n]/], postprocess: id }, + { + name: "dstrchar", + symbols: [{ literal: "\\" }, "strescape"], + postprocess: function (d) { + return JSON.parse('"' + d.join("") + '"'); + }, + }, + { name: "sstrchar", symbols: [/[^\\'\n]/], postprocess: id }, + { + name: "sstrchar", + symbols: [{ literal: "\\" }, "strescape"], + postprocess: function (d) { + return JSON.parse('"' + d.join("") + '"'); + }, + }, + { + name: "sstrchar$string$1", + symbols: [{ literal: "\\" }, { literal: "'" }], + postprocess: function joiner(d) { + return d.join(""); + }, + }, + { + name: "sstrchar", + symbols: ["sstrchar$string$1"], + postprocess: function (d) { + return "'"; + }, + }, + { name: "strescape", symbols: [/["\\/bfnrt]/], postprocess: id }, + { + name: "strescape", + symbols: [ + { literal: "u" }, + /[a-fA-F0-9]/, + /[a-fA-F0-9]/, + /[a-fA-F0-9]/, + /[a-fA-F0-9]/, + ], + postprocess: function (d) { + return d.join(""); + }, + }, + { name: "rill_time", symbols: ["new_rill_time"], postprocess: id }, + { name: "rill_time", symbols: ["old_rill_time"], postprocess: id }, + { name: "new_rill_time", symbols: ["interval_with_grain"], postprocess: id }, + { + name: "new_rill_time$string$1", + symbols: [{ literal: "t" }, { literal: "z" }], + postprocess: function joiner(d) { + return d.join(""); + }, + }, + { + name: "new_rill_time", + symbols: [ + "interval_with_grain", + "_", + "new_rill_time$string$1", + "_", + "timezone_modifier", + ], + postprocess: ([rt, , , , tz]) => rt.withTimezone(tz), + }, + { + name: "interval_with_grain$subexpression$1", + symbols: [/[bB]/, /[yY]/], + postprocess: function (d) { + return d.join(""); + }, + }, + { + name: "interval_with_grain", + symbols: [ + "interval_with_anchor_override", + "_", + "interval_with_grain$subexpression$1", + "_", + "grain", + ], + postprocess: ([rt, , , , grain]) => rt.withGrain(grain), + }, + { + name: "interval_with_grain", + symbols: ["interval_with_anchor_override"], + postprocess: id, + }, + { name: "interval_with_anchor_override$ebnf$1", symbols: [] }, + { + name: "interval_with_anchor_override$ebnf$1", + symbols: ["interval_with_anchor_override$ebnf$1", "anchor_override"], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { + name: "interval_with_anchor_override", + symbols: ["interval", "interval_with_anchor_override$ebnf$1"], + postprocess: ([interval, anchorOverrides]) => + new RillTime(interval).withAnchorOverrides(anchorOverrides), + }, + { + name: "anchor_override$subexpression$1", + symbols: [/[aA]/, /[sS]/], + postprocess: function (d) { + return d.join(""); + }, + }, + { + name: "anchor_override$subexpression$2", + symbols: [/[oO]/, /[fF]/], + postprocess: function (d) { + return d.join(""); + }, + }, + { + name: "anchor_override", + symbols: [ + "_", + "anchor_override$subexpression$1", + "_", + "anchor_override$subexpression$2", + "_", + "point_in_time", + ], + postprocess: ([, , , , , pointInTime]) => pointInTime, + }, + { name: "interval", symbols: ["shorthand_interval"], postprocess: id }, + { name: "interval", symbols: ["period_to_grain_interval"], postprocess: id }, + { name: "interval", symbols: ["start_end_interval"], postprocess: id }, + { name: "interval", symbols: ["ordinal_interval"], postprocess: id }, + { name: "interval", symbols: ["iso_interval"], postprocess: id }, + { + name: "interval$subexpression$1", + symbols: [/[iI]/, /[nN]/, /[fF]/], + postprocess: function (d) { + return d.join(""); + }, + }, + { + name: "interval", + symbols: ["interval$subexpression$1"], + postprocess: () => new RillAllTimeInterval(), + }, + { + name: "shorthand_interval", + symbols: ["grain_duration"], + postprocess: ([parts]) => new RillShorthandInterval(parts), + }, + { + name: "period_to_grain_interval", + symbols: ["period_to_grain"], + postprocess: ([grain]) => new RillPeriodToGrainInterval(grain), + }, + { name: "ordinal_interval$ebnf$1", symbols: [] }, + { + name: "ordinal_interval$ebnf$1$subexpression$1$subexpression$1", + symbols: [/[oO]/, /[fF]/], + postprocess: function (d) { + return d.join(""); + }, + }, + { + name: "ordinal_interval$ebnf$1$subexpression$1", + symbols: [ + "_", + "ordinal_interval$ebnf$1$subexpression$1$subexpression$1", + "_", + "ordinal", + ], + }, + { + name: "ordinal_interval$ebnf$1", + symbols: [ + "ordinal_interval$ebnf$1", + "ordinal_interval$ebnf$1$subexpression$1", + ], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { + name: "ordinal_interval", + symbols: ["ordinal", "ordinal_interval$ebnf$1"], + postprocess: ([part, rest]) => + new RillTimeOrdinalInterval([part, ...rest.map(([, , , p]) => p)]), + }, + { + name: "start_end_interval$subexpression$1", + symbols: [/[tT]/, /[oO]/], + postprocess: function (d) { + return d.join(""); + }, + }, + { + name: "start_end_interval", + symbols: [ + "point_in_time", + "_", + "start_end_interval$subexpression$1", + "_", + "point_in_time", + ], + postprocess: ([start, , , , end]) => + new RillTimeStartEndInterval(start, end), + }, + { + name: "iso_interval$subexpression$1", + symbols: [/[tT]/, /[oO]/], + postprocess: function (d) { + return d.join(""); + }, + }, + { + name: "iso_interval", + symbols: ["abs_time", "_", "iso_interval$subexpression$1", "_", "abs_time"], + postprocess: ([start, , , , end]) => new RillIsoInterval(start, end), + }, + { + name: "iso_interval", + symbols: ["abs_time", "_", { literal: "/" }, "_", "abs_time"], + postprocess: ([start, , , , end]) => new RillIsoInterval(start, end), + }, + { + name: "iso_interval", + symbols: ["abs_time", "_", { literal: "," }, "_", "abs_time"], + postprocess: ([start, , , , end]) => new RillIsoInterval(start, end), + }, + { + name: "iso_interval", + symbols: ["abs_time"], + postprocess: ([start]) => new RillIsoInterval(start, undefined), + }, + { name: "point_in_time$ebnf$1", symbols: [] }, + { + name: "point_in_time$ebnf$1", + symbols: ["point_in_time$ebnf$1", "point_in_time_with_snap"], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { + name: "point_in_time", + symbols: ["point_in_time$ebnf$1", "point_in_time_without_snap"], + postprocess: ([points, last]) => new RillPointInTime([...points, last]), + }, + { + name: "point_in_time", + symbols: ["point_in_time_with_snap"], + postprocess: ([point]) => new RillPointInTime([point]), + }, + { + name: "point_in_time_with_snap", + symbols: [ + "point_in_time_variants", + "_", + { literal: "/" }, + "_", + "grain", + "_", + { literal: "/" }, + "_", + "grain", + ], + postprocess: ([point, , , , firstGrain, , , , secondGrain]) => + new RillPointInTimeWithSnap(point, [firstGrain, secondGrain]), + }, + { + name: "point_in_time_with_snap", + symbols: ["point_in_time_variants", "_", { literal: "/" }, "_", "grain"], + postprocess: ([point, , , , grain]) => + new RillPointInTimeWithSnap(point, [grain]), + }, + { + name: "point_in_time_without_snap", + symbols: ["point_in_time_variants"], + postprocess: ([point]) => new RillPointInTimeWithSnap(point, []), + }, + { + name: "point_in_time_variants", + symbols: ["grain_point_in_time"], + postprocess: id, + }, + { + name: "point_in_time_variants", + symbols: ["labeled_point_in_time"], + postprocess: id, + }, + { name: "point_in_time_variants", symbols: ["abs_time"], postprocess: id }, + { name: "grain_point_in_time$ebnf$1", symbols: ["grain_point_in_time_part"] }, + { + name: "grain_point_in_time$ebnf$1", + symbols: ["grain_point_in_time$ebnf$1", "grain_point_in_time_part"], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { + name: "grain_point_in_time", + symbols: ["grain_point_in_time$ebnf$1"], + postprocess: ([parts]) => new RillGrainPointInTime([...parts]), + }, + { + name: "grain_point_in_time_part", + symbols: ["prefix", "_", "grain_duration"], + postprocess: ([prefix, _, grains]) => + new RillGrainPointInTimePart(prefix, grains), + }, + { + name: "labeled_point_in_time$subexpression$1", + symbols: [/[eE]/, /[aA]/, /[rR]/, /[lL]/, /[iI]/, /[eE]/, /[sS]/, /[tT]/], + postprocess: function (d) { + return d.join(""); + }, + }, + { + name: "labeled_point_in_time", + symbols: ["labeled_point_in_time$subexpression$1"], + postprocess: RillLabelledPointInTime.postProcessor, + }, + { + name: "labeled_point_in_time$subexpression$2", + symbols: [/[lL]/, /[aA]/, /[tT]/, /[eE]/, /[sS]/, /[tT]/], + postprocess: function (d) { + return d.join(""); + }, + }, + { + name: "labeled_point_in_time", + symbols: ["labeled_point_in_time$subexpression$2"], + postprocess: RillLabelledPointInTime.postProcessor, + }, + { + name: "labeled_point_in_time$subexpression$3", + symbols: [/[nN]/, /[oO]/, /[wW]/], + postprocess: function (d) { + return d.join(""); + }, + }, + { + name: "labeled_point_in_time", + symbols: ["labeled_point_in_time$subexpression$3"], + postprocess: RillLabelledPointInTime.postProcessor, + }, + { + name: "labeled_point_in_time$subexpression$4", + symbols: [ + /[wW]/, + /[aA]/, + /[tT]/, + /[eE]/, + /[rR]/, + /[mM]/, + /[aA]/, + /[rR]/, + /[kK]/, + ], + postprocess: function (d) { + return d.join(""); + }, + }, + { + name: "labeled_point_in_time", + symbols: ["labeled_point_in_time$subexpression$4"], + postprocess: RillLabelledPointInTime.postProcessor, + }, + { + name: "labeled_point_in_time$subexpression$5", + symbols: [/[rR]/, /[eE]/, /[fF]/], + postprocess: function (d) { + return d.join(""); + }, + }, + { + name: "labeled_point_in_time", + symbols: ["labeled_point_in_time$subexpression$5"], + postprocess: RillLabelledPointInTime.postProcessor, + }, + { + name: "ordinal", + symbols: ["grain", "num"], + postprocess: ([grain, num]) => ({ num, grain }), + }, + { name: "grain_duration$ebnf$1", symbols: ["grain_duration_part"] }, + { + name: "grain_duration$ebnf$1", + symbols: ["grain_duration$ebnf$1", "grain_duration_part"], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { + name: "grain_duration", + symbols: ["grain_duration$ebnf$1"], + postprocess: ([parts]) => parts, + }, + { + name: "grain_duration_part", + symbols: ["num", "grain"], + postprocess: ([num, grain]) => ({ num, grain }), + }, + { + name: "period_to_grain$string$1", + symbols: [{ literal: "T" }, { literal: "D" }], + postprocess: function joiner(d) { + return d.join(""); + }, + }, + { + name: "period_to_grain", + symbols: ["grain", "period_to_grain$string$1"], + postprocess: ([grain]) => grain, + }, + { name: "abs_time$ebnf$1", symbols: [/[\d]/] }, + { + name: "abs_time$ebnf$1", + symbols: ["abs_time$ebnf$1", /[\d]/], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { + name: "abs_time", + symbols: [ + /[\d]/, + /[\d]/, + /[\d]/, + /[\d]/, + /[\-]/, + /[\d]/, + /[\d]/, + /[\-]/, + /[\d]/, + /[\d]/, + { literal: "T" }, + /[\d]/, + /[\d]/, + /[:]/, + /[\d]/, + /[\d]/, + /[:]/, + /[\d]/, + /[\d]/, + /[.]/, + "abs_time$ebnf$1", + { literal: "Z" }, + ], + postprocess: RillAbsoluteTime.postProcessor, + }, + { + name: "abs_time", + symbols: [ + /[\d]/, + /[\d]/, + /[\d]/, + /[\d]/, + /[\-]/, + /[\d]/, + /[\d]/, + /[\-]/, + /[\d]/, + /[\d]/, + { literal: "T" }, + /[\d]/, + /[\d]/, + /[:]/, + /[\d]/, + /[\d]/, + /[:]/, + /[\d]/, + /[\d]/, + { literal: "Z" }, + ], + postprocess: RillAbsoluteTime.postProcessor, + }, + { + name: "abs_time", + symbols: [ + /[\d]/, + /[\d]/, + /[\d]/, + /[\d]/, + /[\-]/, + /[\d]/, + /[\d]/, + /[\-]/, + /[\d]/, + /[\d]/, + { literal: "T" }, + /[\d]/, + /[\d]/, + /[:]/, + /[\d]/, + /[\d]/, + ], + postprocess: RillAbsoluteTime.postProcessor, + }, + { + name: "abs_time", + symbols: [ + /[\d]/, + /[\d]/, + /[\d]/, + /[\d]/, + /[\-]/, + /[\d]/, + /[\d]/, + /[\-]/, + /[\d]/, + /[\d]/, + { literal: "T" }, + /[\d]/, + /[\d]/, + ], + postprocess: RillAbsoluteTime.postProcessor, + }, + { + name: "abs_time", + symbols: [ + /[\d]/, + /[\d]/, + /[\d]/, + /[\d]/, + /[\-]/, + /[\d]/, + /[\d]/, + /[\-]/, + /[\d]/, + /[\d]/, + ], + postprocess: RillAbsoluteTime.postProcessor, + }, + { + name: "abs_time", + symbols: [/[\d]/, /[\d]/, /[\d]/, /[\d]/, /[\-]/, /[\d]/, /[\d]/], + postprocess: RillAbsoluteTime.postProcessor, + }, + { + name: "abs_time", + symbols: [/[\d]/, /[\d]/, /[\d]/, /[\d]/], + postprocess: RillAbsoluteTime.postProcessor, + }, + { name: "timezone_modifier$ebnf$1", symbols: [/[0-9a-zA-Z/+\-_]/] }, + { + name: "timezone_modifier$ebnf$1", + symbols: ["timezone_modifier$ebnf$1", /[0-9a-zA-Z/+\-_]/], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { + name: "timezone_modifier", + symbols: ["timezone_modifier$ebnf$1"], + postprocess: ([args]) => args.join(""), + }, + { + name: "old_rill_time", + symbols: ["iso_time"], + postprocess: ([legacyIso]) => new RillTime(legacyIso), + }, + { + name: "old_rill_time", + symbols: ["dax_time"], + postprocess: ([legacyDax]) => + new RillTime(new RillLegacyDaxInterval(legacyDax)), + }, + { name: "iso_time$ebnf$1", symbols: ["iso_date_part"] }, + { + name: "iso_time$ebnf$1", + symbols: ["iso_time$ebnf$1", "iso_date_part"], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { name: "iso_time$ebnf$2", symbols: ["iso_time_part"] }, + { + name: "iso_time$ebnf$2", + symbols: ["iso_time$ebnf$2", "iso_time_part"], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { + name: "iso_time", + symbols: [ + { literal: "P" }, + "iso_time$ebnf$1", + { literal: "T" }, + "iso_time$ebnf$2", + ], + postprocess: ([, dateGrains, , timeGrains]) => + new RillLegacyIsoInterval(dateGrains, timeGrains), + }, + { name: "iso_time$ebnf$3", symbols: ["iso_date_part"] }, + { + name: "iso_time$ebnf$3", + symbols: ["iso_time$ebnf$3", "iso_date_part"], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { + name: "iso_time", + symbols: [{ literal: "P" }, "iso_time$ebnf$3"], + postprocess: ([, dateGrains]) => new RillLegacyIsoInterval(dateGrains, []), + }, + { + name: "iso_time$string$1", + symbols: [{ literal: "P" }, { literal: "T" }], + postprocess: function joiner(d) { + return d.join(""); + }, + }, + { name: "iso_time$ebnf$4", symbols: ["iso_time_part"] }, + { + name: "iso_time$ebnf$4", + symbols: ["iso_time$ebnf$4", "iso_time_part"], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { + name: "iso_time", + symbols: ["iso_time$string$1", "iso_time$ebnf$4"], + postprocess: ([, timeGrains]) => new RillLegacyIsoInterval([], timeGrains), + }, + { + name: "iso_date_part", + symbols: ["num", "date_grains"], + postprocess: ([num, grain]) => ({ num, grain }), + }, + { + name: "iso_time_part", + symbols: ["num", "time_grains"], + postprocess: ([num, grain]) => ({ num, grain }), + }, + { + name: "dax_time$string$1", + symbols: [ + { literal: "r" }, + { literal: "i" }, + { literal: "l" }, + { literal: "l" }, + { literal: "-" }, + ], + postprocess: function joiner(d) { + return d.join(""); + }, + }, + { + name: "dax_time", + symbols: ["dax_time$string$1", "dax_notations"], + postprocess: (args) => args.join(""), + }, + { + name: "dax_notations$string$1", + symbols: [{ literal: "T" }, { literal: "D" }], + postprocess: function joiner(d) { + return d.join(""); + }, + }, + { + name: "dax_notations", + symbols: ["dax_to_date", "dax_notations$string$1"], + postprocess: (args) => args.join(""), + }, + { + name: "dax_notations$string$2", + symbols: [{ literal: "T" }, { literal: "D" }], + postprocess: function joiner(d) { + return d.join(""); + }, + }, + { + name: "dax_notations", + symbols: ["dax_notations$string$2"], + postprocess: id, + }, + { + name: "dax_notations", + symbols: [{ literal: "P" }, "date_grains", { literal: "C" }], + postprocess: (args) => args.join(""), + }, + { + name: "dax_notations$string$3", + symbols: [{ literal: "P" }, { literal: "P" }], + postprocess: function joiner(d) { + return d.join(""); + }, + }, + { + name: "dax_notations", + symbols: ["dax_notations$string$3"], + postprocess: id, + }, + { + name: "dax_notations", + symbols: [{ literal: "P" }, "date_grains"], + postprocess: (args) => args.join(""), + }, + { name: "prefix", symbols: [/[+\-]/], postprocess: id }, + { name: "num$ebnf$1", symbols: [/[0-9]/] }, + { + name: "num$ebnf$1", + symbols: ["num$ebnf$1", /[0-9]/], + postprocess: function arrpush(d) { + return d[0].concat([d[1]]); + }, + }, + { + name: "num", + symbols: ["num$ebnf$1"], + postprocess: ([args]) => Number(args.join("")), + }, + { name: "grain", symbols: [/[sSmhHdDwWqQMyY]/], postprocess: id }, + { name: "date_grains", symbols: [/[DWQMY]/], postprocess: id }, + { name: "time_grains", symbols: [/[SMH]/], postprocess: id }, + { name: "dax_to_date", symbols: [/[WQMY]/], postprocess: id }, ]; let ParserStart = "rill_time"; export default { Lexer, ParserRules, ParserStart }; diff --git a/web-common/src/features/dashboards/url-state/time-ranges/rill-time.ne b/web-common/src/features/dashboards/url-state/time-ranges/rill-time.ne index c82ec3c0815c..d9449d058241 100644 --- a/web-common/src/features/dashboards/url-state/time-ranges/rill-time.ne +++ b/web-common/src/features/dashboards/url-state/time-ranges/rill-time.ne @@ -21,17 +21,14 @@ RillGrainPointInTime, RillGrainPointInTimePart, RillAbsoluteTime, - RillPreviousPeriodOffset, } from "./RillTime.ts" %} rill_time => new_rill_time {% id %} | old_rill_time {% id %} -new_rill_time => interval_with_grain trailing_modifier:* {% ([rt, modifiers]) => modifiers.reduce((acc, mod) => mod(acc), rt) %} - -trailing_modifier => _ "tz" _ timezone_modifier {% ([, , , tz]) => (rt) => rt.withTimezone(tz) %} - | _ "offset"i _ offset_value {% ([, , , offset]) => (rt) => rt.withOffset(offset) %} +new_rill_time => interval_with_grain {% id %} + | interval_with_grain _ "tz" _ timezone_modifier {% ([rt, , , , tz]) => rt.withTimezone(tz) %} interval_with_grain => interval_with_anchor_override _ "by"i _ grain {% ([rt, , , , grain]) => rt.withGrain(grain) %} | interval_with_anchor_override {% id %} @@ -72,10 +69,6 @@ point_in_time_variants => grain_point_in_time {% id %} grain_point_in_time => grain_point_in_time_part:+ {% ([parts]) => new RillGrainPointInTime([...parts]) %} grain_point_in_time_part => prefix _ grain_duration {% ([prefix, _, grains]) => new RillGrainPointInTimePart(prefix, grains) %} -offset_value => previous_period {% id %} - | grain_point_in_time_part {% id %} -previous_period => prefix _ num "P"i {% ([prefix, _, num]) => new RillPreviousPeriodOffset(prefix, num) %} - labeled_point_in_time => "earliest"i {% RillLabelledPointInTime.postProcessor %} | "latest"i {% RillLabelledPointInTime.postProcessor %} | "now"i {% RillLabelledPointInTime.postProcessor %} diff --git a/web-common/src/features/dashboards/url-state/time-ranges/rill-time.spec.ts b/web-common/src/features/dashboards/url-state/time-ranges/rill-time.spec.ts index cf01cb3ede59..afe981842c32 100644 --- a/web-common/src/features/dashboards/url-state/time-ranges/rill-time.spec.ts +++ b/web-common/src/features/dashboards/url-state/time-ranges/rill-time.spec.ts @@ -220,49 +220,6 @@ describe("rill time", () => { ], ["inf", "All time", false, undefined, undefined], - - [ - "7D offset -1P", - "Last 7 days", - false, - V1TimeGrain.TIME_GRAIN_DAY, - undefined, - ], - [ - "7D offset -1M", - "Last 7 days", - false, - V1TimeGrain.TIME_GRAIN_DAY, - undefined, - ], - [ - "7D as of watermark/D offset -1P", - "Last 7 days", - true, - V1TimeGrain.TIME_GRAIN_DAY, - undefined, - ], - [ - "7D as of watermark/D+1D offset -1M", - "Last 7 days", - false, - V1TimeGrain.TIME_GRAIN_DAY, - undefined, - ], - [ - "7D tz UTC offset -1P", - "Last 7 days", - false, - V1TimeGrain.TIME_GRAIN_DAY, - undefined, - ], - [ - "2025-02-20T01:23:45Z,2025-07-15T02:34:50Z offset -1P", - "Custom", - false, - V1TimeGrain.TIME_GRAIN_SECOND, - undefined, - ], ]; const compiledGrammar = nearley.Grammar.fromCompiled(grammar); @@ -307,22 +264,6 @@ describe("rill time", () => { } }); - describe("offset and tz ordering", () => { - const Cases: [rillTime: string, serialized: string][] = [ - ["7D tz UTC offset -1P", "7D tz UTC offset -1P"], - ["7D offset -1P tz UTC", "7D tz UTC offset -1P"], - ["7D offset +2D", "7D offset +2D"], - ["7D offset -1P", "7D offset -1P"], - ]; - - for (const [rillTime, serialized] of Cases) { - it(rillTime, () => { - const rt = parseRillTime(rillTime); - expect(rt.toString()).toEqual(serialized); - }); - } - }); - describe("as of label", () => { const Cases: [ rillTime: string, From be231dcb90d1389e2a188b6ffddab06c3425076d Mon Sep 17 00:00:00 2001 From: Aditya Hegde Date: Tue, 26 May 2026 19:41:24 +0530 Subject: [PATCH 6/8] Update open links and add a test --- proto/gen/rill/runtime/v1/api.pb.go | 1582 +++++++++-------- proto/gen/rill/runtime/v1/api.pb.validate.go | 29 + .../gen/rill/runtime/v1/runtime.swagger.yaml | 2 + proto/rill/runtime/v1/api.proto | 1 + runtime/server/chat.go | 11 + .../message/[messageId]/+layout.ts | 7 +- .../message/[messageId]/-/open/+page.ts | 9 +- .../[project]/-/open-query/+page.ts | 3 +- .../features/chat/core/citation-url-utils.ts | 22 +- ...etrics-resolver-query-to-dashboard.spec.ts | 82 +- .../features/explore-mappers/open-query.ts | 9 +- .../src/proto/gen/rill/runtime/v1/api_pb.ts | 6 + .../src/runtime-client/gen/index.schemas.ts | 1 + .../message/[messageId]/+layout.ts | 3 +- .../message/[messageId]/-/open/+page.ts | 9 +- .../src/routes/(viz)/-/open-query/+page.ts | 1 + 16 files changed, 980 insertions(+), 797 deletions(-) diff --git a/proto/gen/rill/runtime/v1/api.pb.go b/proto/gen/rill/runtime/v1/api.pb.go index 190bf1330b66..b5270c38b7b6 100644 --- a/proto/gen/rill/runtime/v1/api.pb.go +++ b/proto/gen/rill/runtime/v1/api.pb.go @@ -6433,6 +6433,7 @@ type GetAIMessageResponse struct { unknownFields protoimpl.UnknownFields Message *Message `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + Result *Message `protobuf:"bytes,2,opt,name=result,proto3" json:"result,omitempty"` } func (x *GetAIMessageResponse) Reset() { @@ -6474,6 +6475,13 @@ func (x *GetAIMessageResponse) GetMessage() *Message { return nil } +func (x *GetAIMessageResponse) GetResult() *Message { + if x != nil { + return x.Result + } + return nil +} + // Request message for RuntimeService.IssueDevJWT type IssueDevJWTRequest struct { state protoimpl.MessageState @@ -9218,713 +9226,716 @@ var file_rill_runtime_v1_api_proto_rawDesc = []byte{ 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x49, 0x64, 0x22, 0x4a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x49, 0x4d, 0x65, + 0x61, 0x67, 0x65, 0x49, 0x64, 0x22, 0x7c, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x49, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x12, 0x49, 0x73, 0x73, 0x75, 0x65, 0x44, 0x65, 0x76, 0x4a, 0x57, - 0x54, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x12, 0x37, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, - 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x22, 0x27, 0x0a, 0x13, 0x49, - 0x73, 0x73, 0x75, 0x65, 0x44, 0x65, 0x76, 0x4a, 0x57, 0x54, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6a, 0x77, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6a, 0x77, 0x74, 0x22, 0x3a, 0x0a, 0x17, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x56, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, - 0x22, 0x5b, 0x0a, 0x18, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x09, - 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x64, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x83, 0x01, - 0x0a, 0x10, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x64, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x75, - 0x73, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x64, 0x42, 0x79, 0x22, 0x8e, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, - 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5f, 0x5c, 0x2d, - 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x52, 0x0a, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x76, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, - 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, - 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, - 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xc7, 0x01, 0x0a, - 0x09, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x68, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x3d, 0x0a, - 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x12, 0x18, 0x0a, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x72, 0x0a, 0x10, 0x47, 0x69, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0b, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5f, 0x5c, 0x2d, 0x61, 0x2d, 0x7a, - 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, - 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0xf6, 0x01, 0x0a, 0x11, 0x47, - 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x55, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x70, 0x61, 0x74, - 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x67, 0x69, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, - 0x69, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0e, - 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x73, 0x22, 0x53, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, 0x42, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, - 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5f, 0x5c, 0x2d, - 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x52, 0x0a, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0x78, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, - 0x47, 0x69, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x08, 0x62, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x69, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x08, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x65, 0x73, 0x22, 0x77, 0x0a, 0x09, 0x47, 0x69, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x68, 0x61, 0x73, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x65, 0x64, - 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x64, 0x69, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x74, 0x0a, 0x10, 0x47, - 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x65, 0x12, 0x30, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x22, 0xb7, 0x01, 0x0a, 0x12, 0x49, 0x73, 0x73, 0x75, 0x65, 0x44, 0x65, 0x76, + 0x4a, 0x57, 0x54, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x12, 0x37, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x22, 0x27, 0x0a, + 0x13, 0x49, 0x73, 0x73, 0x75, 0x65, 0x44, 0x65, 0x76, 0x4a, 0x57, 0x54, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6a, 0x77, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6a, 0x77, 0x74, 0x22, 0x3a, 0x0a, 0x17, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, + 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x49, 0x64, 0x22, 0x5b, 0x0a, 0x18, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x56, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, + 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x64, 0x56, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, + 0x83, 0x01, 0x0a, 0x10, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x64, 0x56, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x36, 0x0a, + 0x07, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x06, 0x75, + 0x73, 0x65, 0x64, 0x42, 0x79, 0x22, 0x8e, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, + 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5f, 0x5c, 0x2d, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x52, 0x0a, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0x32, 0x0a, 0x11, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x5f, 0x73, 0x68, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x53, 0x68, 0x61, 0x22, 0x7c, 0x0a, 0x17, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x39, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, - 0x5f, 0x5c, 0x2d, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x52, - 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x53, 0x68, 0x61, 0x22, 0x40, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x47, 0x69, - 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x24, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x73, 0x68, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x53, 0x68, 0x61, 0x22, 0x82, 0x01, 0x0a, 0x17, 0x47, 0x69, 0x74, 0x4d, 0x65, 0x72, - 0x67, 0x65, 0x54, 0x6f, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x76, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, + 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x34, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x07, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xc7, + 0x01, 0x0a, 0x09, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x68, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, + 0x3d, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x72, 0x0a, 0x10, 0x47, 0x69, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0b, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5f, 0x5c, 0x2d, 0x61, + 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x52, 0x0a, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0xf6, 0x01, 0x0a, + 0x11, 0x47, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x55, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x70, + 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x67, + 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x64, 0x47, 0x69, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x25, + 0x0a, 0x0e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x22, 0x53, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x39, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5f, + 0x5c, 0x2d, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x52, 0x0a, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0x78, 0x0a, 0x17, 0x4c, 0x69, + 0x73, 0x74, 0x47, 0x69, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x08, + 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x69, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x08, 0x62, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x65, 0x73, 0x22, 0x77, 0x0a, 0x09, 0x47, 0x69, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x68, + 0x61, 0x73, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x13, + 0x65, 0x64, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x64, 0x69, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x74, 0x0a, + 0x10, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5f, 0x5c, 0x2d, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, - 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x32, 0x0a, 0x18, 0x47, 0x69, - 0x74, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xb5, - 0x01, 0x0a, 0x16, 0x47, 0x69, 0x74, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x72, 0x61, 0x6e, - 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0b, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, - 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5f, 0x5c, 0x2d, 0x61, 0x2d, 0x7a, 0x41, - 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x12, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x69, 0x74, 0x53, 0x77, 0x69, - 0x74, 0x63, 0x68, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x70, 0x0a, 0x0e, 0x47, 0x69, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, - 0x11, 0x5e, 0x5b, 0x5f, 0x5c, 0x2d, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, - 0x2b, 0x24, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, - 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x4c, 0x6f, - 0x63, 0x61, 0x6c, 0x22, 0x4e, 0x0a, 0x0f, 0x47, 0x69, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x23, - 0x0a, 0x0d, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x42, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x22, 0x88, 0x01, 0x0a, 0x0e, 0x47, 0x69, 0x74, 0x50, 0x75, 0x73, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, - 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5f, 0x5c, 0x2d, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, - 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, - 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x11, - 0x0a, 0x0f, 0x47, 0x69, 0x74, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x4b, 0x0a, 0x0e, 0x50, 0x75, 0x73, 0x68, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x75, + 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0x32, 0x0a, 0x11, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x68, 0x61, 0x22, 0x7c, 0x0a, 0x17, 0x52, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, + 0x5e, 0x5b, 0x5f, 0x5c, 0x2d, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x2b, + 0x24, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, + 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x53, 0x68, 0x61, 0x22, 0x40, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, + 0x73, 0x68, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x68, 0x61, 0x22, 0x82, 0x01, 0x0a, 0x17, 0x47, 0x69, 0x74, 0x4d, + 0x65, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5f, 0x5c, 0x2d, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, - 0x2b, 0x24, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0x57, - 0x0a, 0x0f, 0x50, 0x75, 0x73, 0x68, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x2a, 0x54, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x16, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x14, 0x0a, 0x10, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x57, - 0x52, 0x49, 0x54, 0x45, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x2a, 0x8c, 0x01, - 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x4f, - 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, - 0x45, 0x4c, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x4f, - 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x08, 0x12, 0x12, - 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x57, 0x41, 0x52, 0x4e, - 0x10, 0x0c, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x10, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, - 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x46, 0x41, 0x54, 0x41, 0x4c, 0x10, 0x14, 0x2a, 0x64, 0x0a, 0x0d, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, - 0x1a, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, - 0x14, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, - 0x10, 0x02, 0x32, 0xba, 0x3c, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x55, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x2e, + 0x2b, 0x24, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x32, 0x0a, 0x18, + 0x47, 0x69, 0x74, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0xb5, 0x01, 0x0a, 0x16, 0x47, 0x69, 0x74, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0b, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5f, 0x5c, 0x2d, 0x61, 0x2d, + 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x16, + 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, + 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x69, 0x74, 0x53, + 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x70, 0x0a, 0x0e, 0x47, 0x69, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, + 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5f, 0x5c, 0x2d, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, + 0x39, 0x5d, 0x2b, 0x24, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, + 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x4e, 0x0a, 0x0f, 0x47, 0x69, 0x74, 0x50, 0x75, 0x6c, 0x6c, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x88, 0x01, 0x0a, 0x0e, 0x47, 0x69, 0x74, 0x50, 0x75, 0x73, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xfa, + 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5f, 0x5c, 0x2d, 0x61, 0x2d, 0x7a, 0x41, 0x2d, + 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x69, 0x74, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x0a, 0x0e, 0x50, 0x75, 0x73, 0x68, 0x45, 0x6e, 0x76, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, + 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5f, 0x5c, 0x2d, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, + 0x39, 0x5d, 0x2b, 0x24, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, + 0x22, 0x57, 0x0a, 0x0f, 0x50, 0x75, 0x73, 0x68, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x65, 0x64, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x2a, 0x54, 0x0a, 0x09, 0x46, 0x69, 0x6c, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x16, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x46, 0x49, 0x4c, 0x45, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x2a, + 0x8c, 0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x0a, 0x15, + 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, + 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, + 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x08, + 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x57, 0x41, + 0x52, 0x4e, 0x10, 0x0c, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, + 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x10, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, + 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x46, 0x41, 0x54, 0x41, 0x4c, 0x10, 0x14, 0x2a, 0x64, + 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x1e, 0x0a, 0x1a, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x18, 0x0a, 0x14, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x45, + 0x54, 0x45, 0x10, 0x02, 0x32, 0xba, 0x3c, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x55, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, + 0x1c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x5d, 0x0a, 0x06, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, - 0x0a, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x8d, 0x01, 0x0a, 0x0e, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x26, + 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x10, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x5d, + 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0c, 0x12, 0x0a, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x8d, 0x01, + 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x68, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, + 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x75, 0x0a, + 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x75, 0x0a, 0x0d, 0x4c, - 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x73, 0x12, 0x7d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x12, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x7d, 0x12, 0x7b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, - 0x0d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x83, - 0x01, 0x0a, 0x0c, 0x45, 0x64, 0x69, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, - 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x32, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, - 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, - 0x12, 0x91, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x73, 0x12, 0x7d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x12, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x7d, 0x12, 0x7b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, + 0x2a, 0x22, 0x0d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x12, 0x83, 0x01, 0x0a, 0x0c, 0x45, 0x64, 0x69, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x12, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x3a, 0x01, 0x2a, 0x22, 0x29, 0x2f, 0x76, 0x31, 0x2f, 0x69, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x32, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x7d, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x12, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, - 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, - 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x0a, 0x57, 0x61, 0x74, 0x63, 0x68, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x77, 0x61, 0x74, 0x63, 0x68, 0x30, 0x01, 0x12, 0x7d, - 0x0a, 0x07, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x7d, 0x12, 0x91, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x3a, 0x01, 0x2a, 0x22, 0x29, 0x2f, 0x76, 0x31, + 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x2d, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x7d, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x23, 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x0a, 0x57, 0x61, 0x74, 0x63, 0x68, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x77, 0x61, 0x74, 0x63, 0x68, 0x30, 0x01, + 0x12, 0x7d, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x80, 0x01, 0x0a, 0x07, 0x50, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x96, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x7d, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x80, 0x01, - 0x0a, 0x07, 0x50, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x46, - 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, - 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, + 0x7d, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x64, 0x69, 0x72, 0x12, 0x86, 0x01, 0x0a, 0x0a, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x2a, 0x27, 0x2f, 0x76, 0x31, + 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x8a, 0x01, 0x0a, 0x0a, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x46, + 0x69, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x96, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x72, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x71, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x73, 0x12, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0d, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x45, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x45, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, - 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x3a, 0x01, 0x2a, + 0x22, 0x30, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, + 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x2f, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x2d, 0x65, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x12, 0x93, 0x01, 0x0a, 0x0b, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x3a, 0x01, 0x2a, 0x22, 0x2e, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x2d, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0xc0, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x46, 0x69, 0x6c, 0x65, 0x12, 0x2f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x3a, + 0x01, 0x2a, 0x22, 0x37, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x64, 0x69, 0x72, 0x12, 0x86, 0x01, 0x0a, 0x0a, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x2a, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x8a, 0x01, 0x0a, 0x0a, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x46, 0x69, 0x6c, - 0x65, 0x12, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x46, 0x69, - 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2d, 0x76, 0x69, 0x65, 0x77, 0x12, 0xab, 0x01, 0x0a, 0x12, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x46, 0x69, + 0x6c, 0x65, 0x12, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6e, + 0x76, 0x61, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x46, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x36, 0x3a, 0x01, 0x2a, 0x22, 0x31, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x2d, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x12, 0x95, 0x01, 0x0a, 0x0d, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x12, 0x25, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x71, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, - 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0d, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x45, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x45, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, - 0x70, 0x61, 0x63, 0x6b, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x3a, 0x01, 0x2a, 0x22, 0x30, - 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x2f, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x2d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x12, 0x93, 0x01, 0x0a, 0x0b, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x12, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x33, 0x3a, 0x01, 0x2a, 0x22, 0x2e, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, + 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x72, 0x12, 0x76, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x1f, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x84, 0x01, 0x0a, 0x09, 0x57, 0x61, + 0x74, 0x63, 0x68, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x4c, + 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, + 0x63, 0x68, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x12, 0x26, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, - 0x2d, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0xc0, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, - 0x6c, 0x65, 0x12, 0x2f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x3a, 0x01, 0x2a, - 0x22, 0x37, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, - 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x2d, 0x76, 0x69, 0x65, 0x77, 0x12, 0xab, 0x01, 0x0a, 0x12, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x46, 0x69, 0x6c, 0x65, - 0x12, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, - 0x73, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x72, + 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x77, 0x61, 0x74, 0x63, 0x68, 0x30, 0x01, + 0x12, 0x8d, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x12, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x12, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x12, 0x9a, 0x01, 0x0a, 0x0e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, + 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x76, + 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x2f, 0x2d, 0x2f, 0x77, 0x61, 0x74, 0x63, 0x68, 0x30, 0x01, 0x12, 0x86, 0x01, + 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x23, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, + 0x12, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, + 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x8c, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x45, 0x78, + 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x12, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x70, 0x6c, 0x6f, + 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x45, + 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x65, 0x78, + 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x12, 0xac, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x36, 0x3a, 0x01, 0x2a, 0x22, 0x31, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x7d, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x2d, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x12, 0x95, 0x01, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x12, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, - 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x12, - 0x76, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x1f, 0x2e, 0x72, 0x69, 0x6c, + 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, + 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x73, 0x2f, 0x7b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x7d, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x3a, 0x01, 0x2a, + 0x22, 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, + 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x74, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x90, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x12, 0x2c, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x44, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x44, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x12, 0xa2, 0x01, 0x0a, 0x11, 0x41, 0x6e, 0x61, + 0x6c, 0x79, 0x7a, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x29, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, + 0x79, 0x7a, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x12, 0x2e, 0x2f, + 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x12, 0xb3, 0x01, + 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x32, 0x12, 0x30, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, + 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x69, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xac, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x84, 0x01, 0x0a, 0x09, 0x57, 0x61, 0x74, 0x63, - 0x68, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x6f, 0x67, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, - 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x28, 0x12, 0x26, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x7d, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x77, 0x61, 0x74, 0x63, 0x68, 0x30, 0x01, 0x12, 0x8d, - 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x12, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x12, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x9a, - 0x01, 0x0a, 0x0e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, - 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x76, 0x31, 0x2f, + 0x64, 0x7d, 0x2f, 0x61, 0x69, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xbb, 0x01, 0x0a, 0x11, 0x53, 0x68, 0x61, 0x72, 0x65, 0x43, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, + 0x61, 0x72, 0x65, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x65, 0x43, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x4f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x3a, 0x01, 0x2a, 0x22, 0x44, 0x2f, + 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x69, 0x2f, 0x63, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x68, + 0x61, 0x72, 0x65, 0x12, 0xb7, 0x01, 0x0a, 0x10, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x43, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x48, 0x3a, 0x01, 0x2a, 0x22, 0x43, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x69, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x6f, 0x72, 0x6b, 0x12, 0x80, 0x01, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x21, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x2f, 0x2d, 0x2f, 0x77, 0x61, 0x74, 0x63, 0x68, 0x30, 0x01, 0x12, 0x86, 0x01, 0x0a, 0x0b, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x23, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, - 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x8c, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x45, 0x78, 0x70, 0x6c, - 0x6f, 0x72, 0x65, 0x12, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x70, - 0x6c, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x65, 0x78, 0x70, 0x6c, - 0x6f, 0x72, 0x65, 0x12, 0xac, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, - 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x76, 0x31, - 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, - 0x7b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x7d, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x12, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x3a, 0x01, 0x2a, 0x22, 0x23, - 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x74, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x12, 0x90, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x44, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x15, 0x12, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x12, 0xa2, 0x01, 0x0a, 0x11, 0x41, 0x6e, 0x61, 0x6c, 0x79, - 0x7a, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x29, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x69, 0x2f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, + 0x12, 0x83, 0x01, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, + 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x69, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xa7, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x29, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, - 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x12, 0x2e, 0x2f, 0x76, 0x31, - 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x12, 0xb3, 0x01, 0x0a, 0x16, - 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x12, - 0x30, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x69, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xac, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x61, 0x69, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x7d, 0x12, 0xbb, 0x01, 0x0a, 0x11, 0x53, 0x68, 0x61, 0x72, 0x65, 0x43, 0x6f, 0x6e, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x61, 0x72, - 0x65, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x65, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x4f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x3a, 0x01, 0x2a, 0x22, 0x44, 0x2f, 0x76, 0x31, - 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x69, 0x2f, 0x63, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x12, 0xb7, 0x01, 0x0a, 0x10, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x6f, 0x6e, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x48, 0x3a, 0x01, 0x2a, 0x22, 0x43, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x3a, 0x01, 0x2a, 0x22, 0x2e, + 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x69, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x30, 0x01, + 0x12, 0xb9, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x41, 0x49, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x49, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x49, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5c, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x56, 0x12, 0x54, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x69, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x6f, 0x72, 0x6b, 0x12, 0x80, 0x01, 0x0a, 0x09, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x69, 0x2f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x83, - 0x01, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x70, 0x0a, 0x0b, + 0x49, 0x73, 0x73, 0x75, 0x65, 0x44, 0x65, 0x76, 0x4a, 0x57, 0x54, 0x12, 0x23, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, + 0x73, 0x75, 0x65, 0x44, 0x65, 0x76, 0x4a, 0x57, 0x54, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x44, 0x65, 0x76, 0x4a, 0x57, 0x54, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, + 0x2a, 0x22, 0x0b, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x2d, 0x6a, 0x77, 0x74, 0x12, 0x9e, + 0x01, 0x0a, 0x10, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x56, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x76, 0x31, + 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, + 0x12, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, + 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x76, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x12, + 0x92, 0x01, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x73, 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x69, 0x2f, 0x63, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x74, 0x65, 0x12, 0xa7, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x29, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x3a, 0x01, 0x2a, 0x22, 0x2e, 0x2f, 0x76, - 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x69, 0x2f, 0x63, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x30, 0x01, 0x12, 0xb9, - 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x41, 0x49, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x49, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x49, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5c, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x56, 0x12, 0x54, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x7d, 0x2f, 0x61, 0x69, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x7b, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x70, 0x0a, 0x0b, 0x49, 0x73, - 0x73, 0x75, 0x65, 0x44, 0x65, 0x76, 0x4a, 0x57, 0x54, 0x12, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x73, 0x75, - 0x65, 0x44, 0x65, 0x76, 0x4a, 0x57, 0x54, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x44, 0x65, 0x76, 0x4a, 0x57, 0x54, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, - 0x0b, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x2d, 0x6a, 0x77, 0x74, 0x12, 0x9e, 0x01, 0x0a, - 0x10, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, - 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, - 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x76, 0x61, 0x72, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x12, 0x92, 0x01, - 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, - 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, - 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x69, 0x74, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x09, 0x47, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x69, 0x74, 0x2f, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x09, 0x47, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x28, 0x12, 0x26, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, + 0x69, 0x74, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x0f, 0x4c, 0x69, + 0x73, 0x74, 0x47, 0x69, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x27, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x69, 0x74, 0x2f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x65, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x09, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x12, - 0x26, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, + 0x01, 0x2a, 0x22, 0x26, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x67, 0x69, 0x74, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0xa8, 0x01, 0x0a, 0x10, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, + 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x3a, 0x01, 0x2a, 0x22, + 0x34, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x69, 0x74, - 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, - 0x47, 0x69, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x27, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x47, 0x69, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, 0x42, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x69, 0x74, 0x2f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, - 0x12, 0x85, 0x01, 0x0a, 0x09, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x21, + 0x2f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x7b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x5f, 0x73, 0x68, 0x61, 0x7d, 0x12, 0x99, 0x01, 0x0a, 0x10, 0x47, 0x69, 0x74, 0x4d, 0x65, 0x72, + 0x67, 0x65, 0x54, 0x6f, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, + 0x4d, 0x65, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x54, + 0x6f, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x76, 0x31, 0x2f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x69, 0x74, 0x2f, 0x6d, 0x65, 0x72, 0x67, + 0x65, 0x12, 0xa0, 0x01, 0x0a, 0x0f, 0x47, 0x69, 0x74, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x53, 0x77, 0x69, 0x74, 0x63, + 0x68, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, - 0x22, 0x26, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, - 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x69, - 0x74, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0xa8, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x28, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x47, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x3a, 0x01, 0x2a, 0x22, 0x34, 0x2f, + 0x2e, 0x47, 0x69, 0x74, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, + 0x3a, 0x01, 0x2a, 0x22, 0x2f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x67, 0x69, 0x74, 0x2f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x2f, 0x73, 0x77, + 0x69, 0x74, 0x63, 0x68, 0x12, 0x7d, 0x0a, 0x07, 0x47, 0x69, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x12, + 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x69, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x69, 0x74, 0x2f, 0x72, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x7b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x73, - 0x68, 0x61, 0x7d, 0x12, 0x99, 0x01, 0x0a, 0x10, 0x47, 0x69, 0x74, 0x4d, 0x65, 0x72, 0x67, 0x65, - 0x54, 0x6f, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x4d, 0x65, - 0x72, 0x67, 0x65, 0x54, 0x6f, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x69, 0x74, 0x2f, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x12, - 0xa0, 0x01, 0x0a, 0x0f, 0x47, 0x69, 0x74, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x69, 0x74, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x3a, 0x01, - 0x2a, 0x22, 0x2f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, - 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, - 0x69, 0x74, 0x2f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x2f, 0x73, 0x77, 0x69, 0x74, - 0x63, 0x68, 0x12, 0x7d, 0x0a, 0x07, 0x47, 0x69, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x12, 0x1f, 0x2e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x69, 0x74, 0x2f, 0x70, + 0x75, 0x6c, 0x6c, 0x12, 0x7d, 0x0a, 0x07, 0x47, 0x69, 0x74, 0x50, 0x75, 0x73, 0x68, 0x12, 0x1f, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x69, 0x74, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x69, 0x74, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x76, + 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x69, 0x74, 0x2f, 0x70, 0x75, + 0x73, 0x68, 0x12, 0x7d, 0x0a, 0x07, 0x50, 0x75, 0x73, 0x68, 0x45, 0x6e, 0x76, 0x12, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x69, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, + 0x50, 0x75, 0x73, 0x68, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x69, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x50, 0x75, 0x73, 0x68, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x69, 0x74, 0x2f, 0x70, 0x75, 0x6c, - 0x6c, 0x12, 0x7d, 0x0a, 0x07, 0x47, 0x69, 0x74, 0x50, 0x75, 0x73, 0x68, 0x12, 0x1f, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x69, 0x74, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x69, 0x74, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x76, 0x31, 0x2f, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x69, 0x74, 0x2f, 0x70, 0x75, 0x73, 0x68, - 0x12, 0x7d, 0x0a, 0x07, 0x50, 0x75, 0x73, 0x68, 0x45, 0x6e, 0x76, 0x12, 0x1f, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, - 0x73, 0x68, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x75, 0x73, 0x68, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x6e, 0x76, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x42, - 0xbb, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x08, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x50, 0x01, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x72, 0x69, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x2f, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x76, - 0x31, 0xa2, 0x02, 0x03, 0x52, 0x52, 0x58, 0xaa, 0x02, 0x0f, 0x52, 0x69, 0x6c, 0x6c, 0x2e, 0x52, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0f, 0x52, 0x69, 0x6c, 0x6c, - 0x5c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1b, 0x52, 0x69, - 0x6c, 0x6c, 0x5c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, - 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x11, 0x52, 0x69, 0x6c, 0x6c, - 0x3a, 0x3a, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x6e, 0x76, 0x2f, 0x70, 0x75, 0x73, + 0x68, 0x42, 0xbb, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x08, 0x41, 0x70, 0x69, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x2f, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x52, 0x58, 0xaa, 0x02, 0x0f, 0x52, 0x69, 0x6c, 0x6c, + 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0f, 0x52, 0x69, + 0x6c, 0x6c, 0x5c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1b, + 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5c, 0x56, 0x31, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x11, 0x52, 0x69, + 0x6c, 0x6c, 0x3a, 0x3a, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10179,126 +10190,127 @@ var file_rill_runtime_v1_api_proto_depIdxs = []int32{ 83, // 84: rill.runtime.v1.CompleteStreamingRequest.feedback_agent_context:type_name -> rill.runtime.v1.FeedbackAgentContext 80, // 85: rill.runtime.v1.CompleteStreamingResponse.message:type_name -> rill.runtime.v1.Message 80, // 86: rill.runtime.v1.GetAIMessageResponse.message:type_name -> rill.runtime.v1.Message - 140, // 87: rill.runtime.v1.IssueDevJWTRequest.attributes:type_name -> google.protobuf.Struct - 104, // 88: rill.runtime.v1.AnalyzeVariablesResponse.variables:type_name -> rill.runtime.v1.AnalyzedVariable - 143, // 89: rill.runtime.v1.AnalyzedVariable.used_by:type_name -> rill.runtime.v1.ResourceName - 107, // 90: rill.runtime.v1.ListGitCommitsResponse.commits:type_name -> rill.runtime.v1.GitCommit - 139, // 91: rill.runtime.v1.GitCommit.committed_on:type_name -> google.protobuf.Timestamp - 112, // 92: rill.runtime.v1.ListGitBranchesResponse.branches:type_name -> rill.runtime.v1.GitBranch - 10, // 93: rill.runtime.v1.HealthResponse.InstancesHealthEntry.value:type_name -> rill.runtime.v1.InstanceHealth - 3, // 94: rill.runtime.v1.ConnectorDriver.Property.type:type_name -> rill.runtime.v1.ConnectorDriver.Property.Type - 146, // 95: rill.runtime.v1.AnalystAgentContext.WherePerMetricsViewEntry.value:type_name -> rill.runtime.v1.Expression - 4, // 96: rill.runtime.v1.RuntimeService.Ping:input_type -> rill.runtime.v1.PingRequest - 6, // 97: rill.runtime.v1.RuntimeService.Health:input_type -> rill.runtime.v1.HealthRequest - 8, // 98: rill.runtime.v1.RuntimeService.InstanceHealth:input_type -> rill.runtime.v1.InstanceHealthRequest - 13, // 99: rill.runtime.v1.RuntimeService.ListInstances:input_type -> rill.runtime.v1.ListInstancesRequest - 15, // 100: rill.runtime.v1.RuntimeService.GetInstance:input_type -> rill.runtime.v1.GetInstanceRequest - 17, // 101: rill.runtime.v1.RuntimeService.CreateInstance:input_type -> rill.runtime.v1.CreateInstanceRequest - 21, // 102: rill.runtime.v1.RuntimeService.EditInstance:input_type -> rill.runtime.v1.EditInstanceRequest - 19, // 103: rill.runtime.v1.RuntimeService.DeleteInstance:input_type -> rill.runtime.v1.DeleteInstanceRequest - 23, // 104: rill.runtime.v1.RuntimeService.ReloadConfig:input_type -> rill.runtime.v1.ReloadConfigRequest - 25, // 105: rill.runtime.v1.RuntimeService.ListFiles:input_type -> rill.runtime.v1.ListFilesRequest - 28, // 106: rill.runtime.v1.RuntimeService.WatchFiles:input_type -> rill.runtime.v1.WatchFilesRequest - 30, // 107: rill.runtime.v1.RuntimeService.GetFile:input_type -> rill.runtime.v1.GetFileRequest - 32, // 108: rill.runtime.v1.RuntimeService.PutFile:input_type -> rill.runtime.v1.PutFileRequest - 34, // 109: rill.runtime.v1.RuntimeService.CreateDirectory:input_type -> rill.runtime.v1.CreateDirectoryRequest - 36, // 110: rill.runtime.v1.RuntimeService.DeleteFile:input_type -> rill.runtime.v1.DeleteFileRequest - 38, // 111: rill.runtime.v1.RuntimeService.RenameFile:input_type -> rill.runtime.v1.RenameFileRequest - 41, // 112: rill.runtime.v1.RuntimeService.ListExamples:input_type -> rill.runtime.v1.ListExamplesRequest - 43, // 113: rill.runtime.v1.RuntimeService.UnpackExample:input_type -> rill.runtime.v1.UnpackExampleRequest - 45, // 114: rill.runtime.v1.RuntimeService.UnpackEmpty:input_type -> rill.runtime.v1.UnpackEmptyRequest - 47, // 115: rill.runtime.v1.RuntimeService.GenerateMetricsViewFile:input_type -> rill.runtime.v1.GenerateMetricsViewFileRequest - 49, // 116: rill.runtime.v1.RuntimeService.GenerateCanvasFile:input_type -> rill.runtime.v1.GenerateCanvasFileRequest - 51, // 117: rill.runtime.v1.RuntimeService.QueryResolver:input_type -> rill.runtime.v1.QueryResolverRequest - 55, // 118: rill.runtime.v1.RuntimeService.GetLogs:input_type -> rill.runtime.v1.GetLogsRequest - 57, // 119: rill.runtime.v1.RuntimeService.WatchLogs:input_type -> rill.runtime.v1.WatchLogsRequest - 59, // 120: rill.runtime.v1.RuntimeService.ListResources:input_type -> rill.runtime.v1.ListResourcesRequest - 61, // 121: rill.runtime.v1.RuntimeService.WatchResources:input_type -> rill.runtime.v1.WatchResourcesRequest - 63, // 122: rill.runtime.v1.RuntimeService.GetResource:input_type -> rill.runtime.v1.GetResourceRequest - 65, // 123: rill.runtime.v1.RuntimeService.GetExplore:input_type -> rill.runtime.v1.GetExploreRequest - 67, // 124: rill.runtime.v1.RuntimeService.GetModelPartitions:input_type -> rill.runtime.v1.GetModelPartitionsRequest - 69, // 125: rill.runtime.v1.RuntimeService.CreateTrigger:input_type -> rill.runtime.v1.CreateTriggerRequest - 73, // 126: rill.runtime.v1.RuntimeService.ListConnectorDrivers:input_type -> rill.runtime.v1.ListConnectorDriversRequest - 75, // 127: rill.runtime.v1.RuntimeService.AnalyzeConnectors:input_type -> rill.runtime.v1.AnalyzeConnectorsRequest - 77, // 128: rill.runtime.v1.RuntimeService.ListNotifierConnectors:input_type -> rill.runtime.v1.ListNotifierConnectorsRequest - 84, // 129: rill.runtime.v1.RuntimeService.ListConversations:input_type -> rill.runtime.v1.ListConversationsRequest - 86, // 130: rill.runtime.v1.RuntimeService.GetConversation:input_type -> rill.runtime.v1.GetConversationRequest - 88, // 131: rill.runtime.v1.RuntimeService.ShareConversation:input_type -> rill.runtime.v1.ShareConversationRequest - 90, // 132: rill.runtime.v1.RuntimeService.ForkConversation:input_type -> rill.runtime.v1.ForkConversationRequest - 92, // 133: rill.runtime.v1.RuntimeService.ListTools:input_type -> rill.runtime.v1.ListToolsRequest - 94, // 134: rill.runtime.v1.RuntimeService.Complete:input_type -> rill.runtime.v1.CompleteRequest - 96, // 135: rill.runtime.v1.RuntimeService.CompleteStreaming:input_type -> rill.runtime.v1.CompleteStreamingRequest - 98, // 136: rill.runtime.v1.RuntimeService.GetAIMessage:input_type -> rill.runtime.v1.GetAIMessageRequest - 100, // 137: rill.runtime.v1.RuntimeService.IssueDevJWT:input_type -> rill.runtime.v1.IssueDevJWTRequest - 102, // 138: rill.runtime.v1.RuntimeService.AnalyzeVariables:input_type -> rill.runtime.v1.AnalyzeVariablesRequest - 105, // 139: rill.runtime.v1.RuntimeService.ListGitCommits:input_type -> rill.runtime.v1.ListGitCommitsRequest - 108, // 140: rill.runtime.v1.RuntimeService.GitStatus:input_type -> rill.runtime.v1.GitStatusRequest - 110, // 141: rill.runtime.v1.RuntimeService.ListGitBranches:input_type -> rill.runtime.v1.ListGitBranchesRequest - 113, // 142: rill.runtime.v1.RuntimeService.GitCommit:input_type -> rill.runtime.v1.GitCommitRequest - 115, // 143: rill.runtime.v1.RuntimeService.RestoreGitCommit:input_type -> rill.runtime.v1.RestoreGitCommitRequest - 117, // 144: rill.runtime.v1.RuntimeService.GitMergeToBranch:input_type -> rill.runtime.v1.GitMergeToBranchRequest - 119, // 145: rill.runtime.v1.RuntimeService.GitSwitchBranch:input_type -> rill.runtime.v1.GitSwitchBranchRequest - 121, // 146: rill.runtime.v1.RuntimeService.GitPull:input_type -> rill.runtime.v1.GitPullRequest - 123, // 147: rill.runtime.v1.RuntimeService.GitPush:input_type -> rill.runtime.v1.GitPushRequest - 125, // 148: rill.runtime.v1.RuntimeService.PushEnv:input_type -> rill.runtime.v1.PushEnvRequest - 5, // 149: rill.runtime.v1.RuntimeService.Ping:output_type -> rill.runtime.v1.PingResponse - 7, // 150: rill.runtime.v1.RuntimeService.Health:output_type -> rill.runtime.v1.HealthResponse - 9, // 151: rill.runtime.v1.RuntimeService.InstanceHealth:output_type -> rill.runtime.v1.InstanceHealthResponse - 14, // 152: rill.runtime.v1.RuntimeService.ListInstances:output_type -> rill.runtime.v1.ListInstancesResponse - 16, // 153: rill.runtime.v1.RuntimeService.GetInstance:output_type -> rill.runtime.v1.GetInstanceResponse - 18, // 154: rill.runtime.v1.RuntimeService.CreateInstance:output_type -> rill.runtime.v1.CreateInstanceResponse - 22, // 155: rill.runtime.v1.RuntimeService.EditInstance:output_type -> rill.runtime.v1.EditInstanceResponse - 20, // 156: rill.runtime.v1.RuntimeService.DeleteInstance:output_type -> rill.runtime.v1.DeleteInstanceResponse - 24, // 157: rill.runtime.v1.RuntimeService.ReloadConfig:output_type -> rill.runtime.v1.ReloadConfigResponse - 26, // 158: rill.runtime.v1.RuntimeService.ListFiles:output_type -> rill.runtime.v1.ListFilesResponse - 29, // 159: rill.runtime.v1.RuntimeService.WatchFiles:output_type -> rill.runtime.v1.WatchFilesResponse - 31, // 160: rill.runtime.v1.RuntimeService.GetFile:output_type -> rill.runtime.v1.GetFileResponse - 33, // 161: rill.runtime.v1.RuntimeService.PutFile:output_type -> rill.runtime.v1.PutFileResponse - 35, // 162: rill.runtime.v1.RuntimeService.CreateDirectory:output_type -> rill.runtime.v1.CreateDirectoryResponse - 37, // 163: rill.runtime.v1.RuntimeService.DeleteFile:output_type -> rill.runtime.v1.DeleteFileResponse - 39, // 164: rill.runtime.v1.RuntimeService.RenameFile:output_type -> rill.runtime.v1.RenameFileResponse - 42, // 165: rill.runtime.v1.RuntimeService.ListExamples:output_type -> rill.runtime.v1.ListExamplesResponse - 44, // 166: rill.runtime.v1.RuntimeService.UnpackExample:output_type -> rill.runtime.v1.UnpackExampleResponse - 46, // 167: rill.runtime.v1.RuntimeService.UnpackEmpty:output_type -> rill.runtime.v1.UnpackEmptyResponse - 48, // 168: rill.runtime.v1.RuntimeService.GenerateMetricsViewFile:output_type -> rill.runtime.v1.GenerateMetricsViewFileResponse - 50, // 169: rill.runtime.v1.RuntimeService.GenerateCanvasFile:output_type -> rill.runtime.v1.GenerateCanvasFileResponse - 52, // 170: rill.runtime.v1.RuntimeService.QueryResolver:output_type -> rill.runtime.v1.QueryResolverResponse - 56, // 171: rill.runtime.v1.RuntimeService.GetLogs:output_type -> rill.runtime.v1.GetLogsResponse - 58, // 172: rill.runtime.v1.RuntimeService.WatchLogs:output_type -> rill.runtime.v1.WatchLogsResponse - 60, // 173: rill.runtime.v1.RuntimeService.ListResources:output_type -> rill.runtime.v1.ListResourcesResponse - 62, // 174: rill.runtime.v1.RuntimeService.WatchResources:output_type -> rill.runtime.v1.WatchResourcesResponse - 64, // 175: rill.runtime.v1.RuntimeService.GetResource:output_type -> rill.runtime.v1.GetResourceResponse - 66, // 176: rill.runtime.v1.RuntimeService.GetExplore:output_type -> rill.runtime.v1.GetExploreResponse - 68, // 177: rill.runtime.v1.RuntimeService.GetModelPartitions:output_type -> rill.runtime.v1.GetModelPartitionsResponse - 70, // 178: rill.runtime.v1.RuntimeService.CreateTrigger:output_type -> rill.runtime.v1.CreateTriggerResponse - 74, // 179: rill.runtime.v1.RuntimeService.ListConnectorDrivers:output_type -> rill.runtime.v1.ListConnectorDriversResponse - 76, // 180: rill.runtime.v1.RuntimeService.AnalyzeConnectors:output_type -> rill.runtime.v1.AnalyzeConnectorsResponse - 78, // 181: rill.runtime.v1.RuntimeService.ListNotifierConnectors:output_type -> rill.runtime.v1.ListNotifierConnectorsResponse - 85, // 182: rill.runtime.v1.RuntimeService.ListConversations:output_type -> rill.runtime.v1.ListConversationsResponse - 87, // 183: rill.runtime.v1.RuntimeService.GetConversation:output_type -> rill.runtime.v1.GetConversationResponse - 89, // 184: rill.runtime.v1.RuntimeService.ShareConversation:output_type -> rill.runtime.v1.ShareConversationResponse - 91, // 185: rill.runtime.v1.RuntimeService.ForkConversation:output_type -> rill.runtime.v1.ForkConversationResponse - 93, // 186: rill.runtime.v1.RuntimeService.ListTools:output_type -> rill.runtime.v1.ListToolsResponse - 95, // 187: rill.runtime.v1.RuntimeService.Complete:output_type -> rill.runtime.v1.CompleteResponse - 97, // 188: rill.runtime.v1.RuntimeService.CompleteStreaming:output_type -> rill.runtime.v1.CompleteStreamingResponse - 99, // 189: rill.runtime.v1.RuntimeService.GetAIMessage:output_type -> rill.runtime.v1.GetAIMessageResponse - 101, // 190: rill.runtime.v1.RuntimeService.IssueDevJWT:output_type -> rill.runtime.v1.IssueDevJWTResponse - 103, // 191: rill.runtime.v1.RuntimeService.AnalyzeVariables:output_type -> rill.runtime.v1.AnalyzeVariablesResponse - 106, // 192: rill.runtime.v1.RuntimeService.ListGitCommits:output_type -> rill.runtime.v1.ListGitCommitsResponse - 109, // 193: rill.runtime.v1.RuntimeService.GitStatus:output_type -> rill.runtime.v1.GitStatusResponse - 111, // 194: rill.runtime.v1.RuntimeService.ListGitBranches:output_type -> rill.runtime.v1.ListGitBranchesResponse - 114, // 195: rill.runtime.v1.RuntimeService.GitCommit:output_type -> rill.runtime.v1.GitCommitResponse - 116, // 196: rill.runtime.v1.RuntimeService.RestoreGitCommit:output_type -> rill.runtime.v1.RestoreGitCommitResponse - 118, // 197: rill.runtime.v1.RuntimeService.GitMergeToBranch:output_type -> rill.runtime.v1.GitMergeToBranchResponse - 120, // 198: rill.runtime.v1.RuntimeService.GitSwitchBranch:output_type -> rill.runtime.v1.GitSwitchBranchResponse - 122, // 199: rill.runtime.v1.RuntimeService.GitPull:output_type -> rill.runtime.v1.GitPullResponse - 124, // 200: rill.runtime.v1.RuntimeService.GitPush:output_type -> rill.runtime.v1.GitPushResponse - 126, // 201: rill.runtime.v1.RuntimeService.PushEnv:output_type -> rill.runtime.v1.PushEnvResponse - 149, // [149:202] is the sub-list for method output_type - 96, // [96:149] is the sub-list for method input_type - 96, // [96:96] is the sub-list for extension type_name - 96, // [96:96] is the sub-list for extension extendee - 0, // [0:96] is the sub-list for field type_name + 80, // 87: rill.runtime.v1.GetAIMessageResponse.result:type_name -> rill.runtime.v1.Message + 140, // 88: rill.runtime.v1.IssueDevJWTRequest.attributes:type_name -> google.protobuf.Struct + 104, // 89: rill.runtime.v1.AnalyzeVariablesResponse.variables:type_name -> rill.runtime.v1.AnalyzedVariable + 143, // 90: rill.runtime.v1.AnalyzedVariable.used_by:type_name -> rill.runtime.v1.ResourceName + 107, // 91: rill.runtime.v1.ListGitCommitsResponse.commits:type_name -> rill.runtime.v1.GitCommit + 139, // 92: rill.runtime.v1.GitCommit.committed_on:type_name -> google.protobuf.Timestamp + 112, // 93: rill.runtime.v1.ListGitBranchesResponse.branches:type_name -> rill.runtime.v1.GitBranch + 10, // 94: rill.runtime.v1.HealthResponse.InstancesHealthEntry.value:type_name -> rill.runtime.v1.InstanceHealth + 3, // 95: rill.runtime.v1.ConnectorDriver.Property.type:type_name -> rill.runtime.v1.ConnectorDriver.Property.Type + 146, // 96: rill.runtime.v1.AnalystAgentContext.WherePerMetricsViewEntry.value:type_name -> rill.runtime.v1.Expression + 4, // 97: rill.runtime.v1.RuntimeService.Ping:input_type -> rill.runtime.v1.PingRequest + 6, // 98: rill.runtime.v1.RuntimeService.Health:input_type -> rill.runtime.v1.HealthRequest + 8, // 99: rill.runtime.v1.RuntimeService.InstanceHealth:input_type -> rill.runtime.v1.InstanceHealthRequest + 13, // 100: rill.runtime.v1.RuntimeService.ListInstances:input_type -> rill.runtime.v1.ListInstancesRequest + 15, // 101: rill.runtime.v1.RuntimeService.GetInstance:input_type -> rill.runtime.v1.GetInstanceRequest + 17, // 102: rill.runtime.v1.RuntimeService.CreateInstance:input_type -> rill.runtime.v1.CreateInstanceRequest + 21, // 103: rill.runtime.v1.RuntimeService.EditInstance:input_type -> rill.runtime.v1.EditInstanceRequest + 19, // 104: rill.runtime.v1.RuntimeService.DeleteInstance:input_type -> rill.runtime.v1.DeleteInstanceRequest + 23, // 105: rill.runtime.v1.RuntimeService.ReloadConfig:input_type -> rill.runtime.v1.ReloadConfigRequest + 25, // 106: rill.runtime.v1.RuntimeService.ListFiles:input_type -> rill.runtime.v1.ListFilesRequest + 28, // 107: rill.runtime.v1.RuntimeService.WatchFiles:input_type -> rill.runtime.v1.WatchFilesRequest + 30, // 108: rill.runtime.v1.RuntimeService.GetFile:input_type -> rill.runtime.v1.GetFileRequest + 32, // 109: rill.runtime.v1.RuntimeService.PutFile:input_type -> rill.runtime.v1.PutFileRequest + 34, // 110: rill.runtime.v1.RuntimeService.CreateDirectory:input_type -> rill.runtime.v1.CreateDirectoryRequest + 36, // 111: rill.runtime.v1.RuntimeService.DeleteFile:input_type -> rill.runtime.v1.DeleteFileRequest + 38, // 112: rill.runtime.v1.RuntimeService.RenameFile:input_type -> rill.runtime.v1.RenameFileRequest + 41, // 113: rill.runtime.v1.RuntimeService.ListExamples:input_type -> rill.runtime.v1.ListExamplesRequest + 43, // 114: rill.runtime.v1.RuntimeService.UnpackExample:input_type -> rill.runtime.v1.UnpackExampleRequest + 45, // 115: rill.runtime.v1.RuntimeService.UnpackEmpty:input_type -> rill.runtime.v1.UnpackEmptyRequest + 47, // 116: rill.runtime.v1.RuntimeService.GenerateMetricsViewFile:input_type -> rill.runtime.v1.GenerateMetricsViewFileRequest + 49, // 117: rill.runtime.v1.RuntimeService.GenerateCanvasFile:input_type -> rill.runtime.v1.GenerateCanvasFileRequest + 51, // 118: rill.runtime.v1.RuntimeService.QueryResolver:input_type -> rill.runtime.v1.QueryResolverRequest + 55, // 119: rill.runtime.v1.RuntimeService.GetLogs:input_type -> rill.runtime.v1.GetLogsRequest + 57, // 120: rill.runtime.v1.RuntimeService.WatchLogs:input_type -> rill.runtime.v1.WatchLogsRequest + 59, // 121: rill.runtime.v1.RuntimeService.ListResources:input_type -> rill.runtime.v1.ListResourcesRequest + 61, // 122: rill.runtime.v1.RuntimeService.WatchResources:input_type -> rill.runtime.v1.WatchResourcesRequest + 63, // 123: rill.runtime.v1.RuntimeService.GetResource:input_type -> rill.runtime.v1.GetResourceRequest + 65, // 124: rill.runtime.v1.RuntimeService.GetExplore:input_type -> rill.runtime.v1.GetExploreRequest + 67, // 125: rill.runtime.v1.RuntimeService.GetModelPartitions:input_type -> rill.runtime.v1.GetModelPartitionsRequest + 69, // 126: rill.runtime.v1.RuntimeService.CreateTrigger:input_type -> rill.runtime.v1.CreateTriggerRequest + 73, // 127: rill.runtime.v1.RuntimeService.ListConnectorDrivers:input_type -> rill.runtime.v1.ListConnectorDriversRequest + 75, // 128: rill.runtime.v1.RuntimeService.AnalyzeConnectors:input_type -> rill.runtime.v1.AnalyzeConnectorsRequest + 77, // 129: rill.runtime.v1.RuntimeService.ListNotifierConnectors:input_type -> rill.runtime.v1.ListNotifierConnectorsRequest + 84, // 130: rill.runtime.v1.RuntimeService.ListConversations:input_type -> rill.runtime.v1.ListConversationsRequest + 86, // 131: rill.runtime.v1.RuntimeService.GetConversation:input_type -> rill.runtime.v1.GetConversationRequest + 88, // 132: rill.runtime.v1.RuntimeService.ShareConversation:input_type -> rill.runtime.v1.ShareConversationRequest + 90, // 133: rill.runtime.v1.RuntimeService.ForkConversation:input_type -> rill.runtime.v1.ForkConversationRequest + 92, // 134: rill.runtime.v1.RuntimeService.ListTools:input_type -> rill.runtime.v1.ListToolsRequest + 94, // 135: rill.runtime.v1.RuntimeService.Complete:input_type -> rill.runtime.v1.CompleteRequest + 96, // 136: rill.runtime.v1.RuntimeService.CompleteStreaming:input_type -> rill.runtime.v1.CompleteStreamingRequest + 98, // 137: rill.runtime.v1.RuntimeService.GetAIMessage:input_type -> rill.runtime.v1.GetAIMessageRequest + 100, // 138: rill.runtime.v1.RuntimeService.IssueDevJWT:input_type -> rill.runtime.v1.IssueDevJWTRequest + 102, // 139: rill.runtime.v1.RuntimeService.AnalyzeVariables:input_type -> rill.runtime.v1.AnalyzeVariablesRequest + 105, // 140: rill.runtime.v1.RuntimeService.ListGitCommits:input_type -> rill.runtime.v1.ListGitCommitsRequest + 108, // 141: rill.runtime.v1.RuntimeService.GitStatus:input_type -> rill.runtime.v1.GitStatusRequest + 110, // 142: rill.runtime.v1.RuntimeService.ListGitBranches:input_type -> rill.runtime.v1.ListGitBranchesRequest + 113, // 143: rill.runtime.v1.RuntimeService.GitCommit:input_type -> rill.runtime.v1.GitCommitRequest + 115, // 144: rill.runtime.v1.RuntimeService.RestoreGitCommit:input_type -> rill.runtime.v1.RestoreGitCommitRequest + 117, // 145: rill.runtime.v1.RuntimeService.GitMergeToBranch:input_type -> rill.runtime.v1.GitMergeToBranchRequest + 119, // 146: rill.runtime.v1.RuntimeService.GitSwitchBranch:input_type -> rill.runtime.v1.GitSwitchBranchRequest + 121, // 147: rill.runtime.v1.RuntimeService.GitPull:input_type -> rill.runtime.v1.GitPullRequest + 123, // 148: rill.runtime.v1.RuntimeService.GitPush:input_type -> rill.runtime.v1.GitPushRequest + 125, // 149: rill.runtime.v1.RuntimeService.PushEnv:input_type -> rill.runtime.v1.PushEnvRequest + 5, // 150: rill.runtime.v1.RuntimeService.Ping:output_type -> rill.runtime.v1.PingResponse + 7, // 151: rill.runtime.v1.RuntimeService.Health:output_type -> rill.runtime.v1.HealthResponse + 9, // 152: rill.runtime.v1.RuntimeService.InstanceHealth:output_type -> rill.runtime.v1.InstanceHealthResponse + 14, // 153: rill.runtime.v1.RuntimeService.ListInstances:output_type -> rill.runtime.v1.ListInstancesResponse + 16, // 154: rill.runtime.v1.RuntimeService.GetInstance:output_type -> rill.runtime.v1.GetInstanceResponse + 18, // 155: rill.runtime.v1.RuntimeService.CreateInstance:output_type -> rill.runtime.v1.CreateInstanceResponse + 22, // 156: rill.runtime.v1.RuntimeService.EditInstance:output_type -> rill.runtime.v1.EditInstanceResponse + 20, // 157: rill.runtime.v1.RuntimeService.DeleteInstance:output_type -> rill.runtime.v1.DeleteInstanceResponse + 24, // 158: rill.runtime.v1.RuntimeService.ReloadConfig:output_type -> rill.runtime.v1.ReloadConfigResponse + 26, // 159: rill.runtime.v1.RuntimeService.ListFiles:output_type -> rill.runtime.v1.ListFilesResponse + 29, // 160: rill.runtime.v1.RuntimeService.WatchFiles:output_type -> rill.runtime.v1.WatchFilesResponse + 31, // 161: rill.runtime.v1.RuntimeService.GetFile:output_type -> rill.runtime.v1.GetFileResponse + 33, // 162: rill.runtime.v1.RuntimeService.PutFile:output_type -> rill.runtime.v1.PutFileResponse + 35, // 163: rill.runtime.v1.RuntimeService.CreateDirectory:output_type -> rill.runtime.v1.CreateDirectoryResponse + 37, // 164: rill.runtime.v1.RuntimeService.DeleteFile:output_type -> rill.runtime.v1.DeleteFileResponse + 39, // 165: rill.runtime.v1.RuntimeService.RenameFile:output_type -> rill.runtime.v1.RenameFileResponse + 42, // 166: rill.runtime.v1.RuntimeService.ListExamples:output_type -> rill.runtime.v1.ListExamplesResponse + 44, // 167: rill.runtime.v1.RuntimeService.UnpackExample:output_type -> rill.runtime.v1.UnpackExampleResponse + 46, // 168: rill.runtime.v1.RuntimeService.UnpackEmpty:output_type -> rill.runtime.v1.UnpackEmptyResponse + 48, // 169: rill.runtime.v1.RuntimeService.GenerateMetricsViewFile:output_type -> rill.runtime.v1.GenerateMetricsViewFileResponse + 50, // 170: rill.runtime.v1.RuntimeService.GenerateCanvasFile:output_type -> rill.runtime.v1.GenerateCanvasFileResponse + 52, // 171: rill.runtime.v1.RuntimeService.QueryResolver:output_type -> rill.runtime.v1.QueryResolverResponse + 56, // 172: rill.runtime.v1.RuntimeService.GetLogs:output_type -> rill.runtime.v1.GetLogsResponse + 58, // 173: rill.runtime.v1.RuntimeService.WatchLogs:output_type -> rill.runtime.v1.WatchLogsResponse + 60, // 174: rill.runtime.v1.RuntimeService.ListResources:output_type -> rill.runtime.v1.ListResourcesResponse + 62, // 175: rill.runtime.v1.RuntimeService.WatchResources:output_type -> rill.runtime.v1.WatchResourcesResponse + 64, // 176: rill.runtime.v1.RuntimeService.GetResource:output_type -> rill.runtime.v1.GetResourceResponse + 66, // 177: rill.runtime.v1.RuntimeService.GetExplore:output_type -> rill.runtime.v1.GetExploreResponse + 68, // 178: rill.runtime.v1.RuntimeService.GetModelPartitions:output_type -> rill.runtime.v1.GetModelPartitionsResponse + 70, // 179: rill.runtime.v1.RuntimeService.CreateTrigger:output_type -> rill.runtime.v1.CreateTriggerResponse + 74, // 180: rill.runtime.v1.RuntimeService.ListConnectorDrivers:output_type -> rill.runtime.v1.ListConnectorDriversResponse + 76, // 181: rill.runtime.v1.RuntimeService.AnalyzeConnectors:output_type -> rill.runtime.v1.AnalyzeConnectorsResponse + 78, // 182: rill.runtime.v1.RuntimeService.ListNotifierConnectors:output_type -> rill.runtime.v1.ListNotifierConnectorsResponse + 85, // 183: rill.runtime.v1.RuntimeService.ListConversations:output_type -> rill.runtime.v1.ListConversationsResponse + 87, // 184: rill.runtime.v1.RuntimeService.GetConversation:output_type -> rill.runtime.v1.GetConversationResponse + 89, // 185: rill.runtime.v1.RuntimeService.ShareConversation:output_type -> rill.runtime.v1.ShareConversationResponse + 91, // 186: rill.runtime.v1.RuntimeService.ForkConversation:output_type -> rill.runtime.v1.ForkConversationResponse + 93, // 187: rill.runtime.v1.RuntimeService.ListTools:output_type -> rill.runtime.v1.ListToolsResponse + 95, // 188: rill.runtime.v1.RuntimeService.Complete:output_type -> rill.runtime.v1.CompleteResponse + 97, // 189: rill.runtime.v1.RuntimeService.CompleteStreaming:output_type -> rill.runtime.v1.CompleteStreamingResponse + 99, // 190: rill.runtime.v1.RuntimeService.GetAIMessage:output_type -> rill.runtime.v1.GetAIMessageResponse + 101, // 191: rill.runtime.v1.RuntimeService.IssueDevJWT:output_type -> rill.runtime.v1.IssueDevJWTResponse + 103, // 192: rill.runtime.v1.RuntimeService.AnalyzeVariables:output_type -> rill.runtime.v1.AnalyzeVariablesResponse + 106, // 193: rill.runtime.v1.RuntimeService.ListGitCommits:output_type -> rill.runtime.v1.ListGitCommitsResponse + 109, // 194: rill.runtime.v1.RuntimeService.GitStatus:output_type -> rill.runtime.v1.GitStatusResponse + 111, // 195: rill.runtime.v1.RuntimeService.ListGitBranches:output_type -> rill.runtime.v1.ListGitBranchesResponse + 114, // 196: rill.runtime.v1.RuntimeService.GitCommit:output_type -> rill.runtime.v1.GitCommitResponse + 116, // 197: rill.runtime.v1.RuntimeService.RestoreGitCommit:output_type -> rill.runtime.v1.RestoreGitCommitResponse + 118, // 198: rill.runtime.v1.RuntimeService.GitMergeToBranch:output_type -> rill.runtime.v1.GitMergeToBranchResponse + 120, // 199: rill.runtime.v1.RuntimeService.GitSwitchBranch:output_type -> rill.runtime.v1.GitSwitchBranchResponse + 122, // 200: rill.runtime.v1.RuntimeService.GitPull:output_type -> rill.runtime.v1.GitPullResponse + 124, // 201: rill.runtime.v1.RuntimeService.GitPush:output_type -> rill.runtime.v1.GitPushResponse + 126, // 202: rill.runtime.v1.RuntimeService.PushEnv:output_type -> rill.runtime.v1.PushEnvResponse + 150, // [150:203] is the sub-list for method output_type + 97, // [97:150] is the sub-list for method input_type + 97, // [97:97] is the sub-list for extension type_name + 97, // [97:97] is the sub-list for extension extendee + 0, // [0:97] is the sub-list for field type_name } func init() { file_rill_runtime_v1_api_proto_init() } diff --git a/proto/gen/rill/runtime/v1/api.pb.validate.go b/proto/gen/rill/runtime/v1/api.pb.validate.go index f0bace1a9ec8..36e60e933c25 100644 --- a/proto/gen/rill/runtime/v1/api.pb.validate.go +++ b/proto/gen/rill/runtime/v1/api.pb.validate.go @@ -12830,6 +12830,35 @@ func (m *GetAIMessageResponse) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetResult()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, GetAIMessageResponseValidationError{ + field: "Result", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, GetAIMessageResponseValidationError{ + field: "Result", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetResult()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return GetAIMessageResponseValidationError{ + field: "Result", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return GetAIMessageResponseMultiError(errors) } diff --git a/proto/gen/rill/runtime/v1/runtime.swagger.yaml b/proto/gen/rill/runtime/v1/runtime.swagger.yaml index d167787798e6..963324b7bd03 100644 --- a/proto/gen/rill/runtime/v1/runtime.swagger.yaml +++ b/proto/gen/rill/runtime/v1/runtime.swagger.yaml @@ -5432,6 +5432,8 @@ definitions: properties: message: $ref: '#/definitions/v1Message' + result: + $ref: '#/definitions/v1Message' title: Response message for RuntimeService.GetAIMessage v1GetConversationResponse: type: object diff --git a/proto/rill/runtime/v1/api.proto b/proto/rill/runtime/v1/api.proto index a1a3871b2e83..fb658139cfdf 100644 --- a/proto/rill/runtime/v1/api.proto +++ b/proto/rill/runtime/v1/api.proto @@ -1216,6 +1216,7 @@ message GetAIMessageRequest { // Response message for RuntimeService.GetAIMessage message GetAIMessageResponse { Message message = 1; + Message result = 2; } // ********** diff --git a/runtime/server/chat.go b/runtime/server/chat.go index 42801bd55466..d7384bebd24b 100644 --- a/runtime/server/chat.go +++ b/runtime/server/chat.go @@ -558,8 +558,19 @@ func (s *Server) GetAIMessage(ctx context.Context, req *runtimev1.GetAIMessageRe return nil, status.Errorf(codes.Internal, "failed to convert message to protobuf: %v", err) } + resMsg, ok := session.Message(ai.FilterByParent(req.MessageId)) + if !ok { + return nil, status.Errorf(codes.NotFound, "result message for %q not found in conversation %q", req.MessageId, req.ConversationId) + } + + resPbMsg, err := messageToPB(session, resMsg) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to convert message to protobuf: %v", err) + } + return &runtimev1.GetAIMessageResponse{ Message: pbMsg, + Result: resPbMsg, }, nil } diff --git a/web-admin/src/routes/[organization]/[project]/-/ai/[conversationId]/message/[messageId]/+layout.ts b/web-admin/src/routes/[organization]/[project]/-/ai/[conversationId]/message/[messageId]/+layout.ts index fa2b57fac95b..b75cf13d424b 100644 --- a/web-admin/src/routes/[organization]/[project]/-/ai/[conversationId]/message/[messageId]/+layout.ts +++ b/web-admin/src/routes/[organization]/[project]/-/ai/[conversationId]/message/[messageId]/+layout.ts @@ -3,9 +3,14 @@ import { fetchMessage } from "@rilldata/web-common/features/chat/core/citation-u export async function load({ params: { conversationId, messageId }, parent }) { const { runtime } = await parent(); - const message = await fetchMessage(runtime, conversationId, messageId); + const { message, result } = await fetchMessage( + runtime, + conversationId, + messageId, + ); return { message, + result, }; } diff --git a/web-admin/src/routes/[organization]/[project]/-/ai/[conversationId]/message/[messageId]/-/open/+page.ts b/web-admin/src/routes/[organization]/[project]/-/ai/[conversationId]/message/[messageId]/-/open/+page.ts index 8ff3118f8e13..f763e0633b18 100644 --- a/web-admin/src/routes/[organization]/[project]/-/ai/[conversationId]/message/[messageId]/-/open/+page.ts +++ b/web-admin/src/routes/[organization]/[project]/-/ai/[conversationId]/message/[messageId]/-/open/+page.ts @@ -1,15 +1,20 @@ -import { maybeGetMetricsResolverQueryFromMessage } from "@rilldata/web-common/features/chat/core/citation-url-utils.ts"; +import { + getResolvedTimeRangesFromMessage, + maybeGetMetricsResolverQueryFromMessage, +} from "@rilldata/web-common/features/chat/core/citation-url-utils.ts"; import { openQuery } from "@rilldata/web-common/features/explore-mappers/open-query.ts"; import { getCloudRuntimeClient } from "@rilldata/web-admin/lib/runtime-client"; export async function load({ parent, params: { organization, project } }) { - const { runtime, message } = await parent(); + const { runtime, message, result } = await parent(); const client = getCloudRuntimeClient(runtime); const query = maybeGetMetricsResolverQueryFromMessage(message); + const resolvedTimeRanges = getResolvedTimeRangesFromMessage(result); await openQuery({ query, + resolvedTimeRanges, client, organization, project, diff --git a/web-admin/src/routes/[organization]/[project]/-/open-query/+page.ts b/web-admin/src/routes/[organization]/[project]/-/open-query/+page.ts index 11bc0dd7d8ca..6630223dea0e 100644 --- a/web-admin/src/routes/[organization]/[project]/-/open-query/+page.ts +++ b/web-admin/src/routes/[organization]/[project]/-/open-query/+page.ts @@ -5,12 +5,13 @@ import { getQueryFromUrl } from "@rilldata/web-common/features/chat/core/citatio export const load: PageLoad = async ({ params, url, parent }) => { const { runtime } = await parent(); - const client = getCloudRuntimeClient(runtime!); + const client = getCloudRuntimeClient(runtime); const query = getQueryFromUrl(url); await openQuery({ query, + resolvedTimeRanges: [], organization: params.organization, project: params.project, client, diff --git a/web-common/src/features/chat/core/citation-url-utils.ts b/web-common/src/features/chat/core/citation-url-utils.ts index 6a3db1bfade9..bf5e14019ae5 100644 --- a/web-common/src/features/chat/core/citation-url-utils.ts +++ b/web-common/src/features/chat/core/citation-url-utils.ts @@ -2,7 +2,10 @@ import { type V1GetAIMessageResponse, type V1Message, } from "@rilldata/web-common/runtime-client"; -import type { Schema as MetricsResolverQuery } from "@rilldata/web-common/runtime-client/gen/resolvers/metrics/schema.ts"; +import type { + Schema as MetricsResolverQuery, + TimeRange, +} from "@rilldata/web-common/runtime-client/gen/resolvers/metrics/schema.ts"; import { MessageType, ToolName, @@ -36,7 +39,10 @@ export async function fetchMessage( const toolCallResp = (await resp.json()) as V1GetAIMessageResponse; // 200 response should always have a message. - return toolCallResp.message!; + return { + message: toolCallResp.message!, + result: toolCallResp.result!, + }; } catch (e) { const apiError = e.response?.data?.message; // Rethrow api error. Top level message will just be InternalError @@ -71,6 +77,18 @@ export function maybeGetMetricsResolverQueryFromMessage(message: V1Message) { return rawJson as MetricsResolverQuery; } +export function getResolvedTimeRangesFromMessage( + message: V1Message, +): TimeRange[] { + try { + const resultData = JSON.parse(message.contentData ?? "{}"); + return resultData.resolved_time_ranges; + } catch (e) { + console.error("Failed to parse result message JSON", e); + } + return []; +} + const closingRoundBracketRegex = /\)$/; const closingCurlyBracketRegex = /}$/; diff --git a/web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.spec.ts b/web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.spec.ts index d8ef6a67267a..36c828058eaf 100644 --- a/web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.spec.ts +++ b/web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.spec.ts @@ -33,6 +33,7 @@ import { import type { Expression, Schema as MetricsResolverQuery, + TimeRange as ResolverTimeRange, } from "@rilldata/web-common/runtime-client/gen/resolvers/metrics/schema.ts"; import { describe, expect, it } from "vitest"; @@ -40,6 +41,7 @@ describe("mapMetricsResolverQueryToDashboard", () => { const TestCases: { title: string; query: MetricsResolverQuery; + resolvedTimeRanges?: ResolverTimeRange[]; expectedPartialExplore: Partial; }[] = [ { @@ -84,6 +86,78 @@ describe("mapMetricsResolverQueryToDashboard", () => { }, }, + { + title: + "rilltime expressions in time range and comparison time range are resolved from resolvedTimeRanges", + query: { + time_range: { expression: "rill-PDC" }, + comparison_time_range: { expression: "rill-PPC" }, + measures: [{ name: AD_BIDS_IMPRESSIONS_MEASURE }], + dimensions: [{ name: AD_BIDS_PUBLISHER_DIMENSION }], + }, + resolvedTimeRanges: [ + { + expression: "rill-PDC", + start: "2026-05-25T00:00:00.000Z", + end: "2026-05-26T00:00:00.000Z", + }, + { + expression: "rill-PPC", + start: "2026-05-24T00:00:00.000Z", + end: "2026-05-25T00:00:00.000Z", + }, + ], + expectedPartialExplore: { + activePage: DashboardState_ActivePage.DIMENSION_TABLE, + selectedTimeRange: { + name: TimeRangePreset.CUSTOM, + start: new Date("2026-05-25T00:00:00.000Z"), + end: new Date("2026-05-26T00:00:00.000Z"), + }, + selectedComparisonTimeRange: { + name: TimeRangePreset.CUSTOM, + start: new Date("2026-05-24T00:00:00.000Z"), + end: new Date("2026-05-25T00:00:00.000Z"), + }, + showTimeComparison: true, + + visibleMeasures: [AD_BIDS_IMPRESSIONS_MEASURE], + allMeasuresVisible: false, + visibleDimensions: [AD_BIDS_PUBLISHER_DIMENSION], + allDimensionsVisible: false, + selectedDimensionName: AD_BIDS_PUBLISHER_DIMENSION, + }, + }, + + { + title: + "rilltime expression in time range is preserved when not present in resolvedTimeRanges", + query: { + time_range: { expression: "rill-PDC" }, + measures: [{ name: AD_BIDS_IMPRESSIONS_MEASURE }], + dimensions: [{ name: AD_BIDS_PUBLISHER_DIMENSION }], + }, + resolvedTimeRanges: [ + { + expression: "rill-PWC", + start: "2026-05-18T00:00:00.000Z", + end: "2026-05-25T00:00:00.000Z", + }, + ], + expectedPartialExplore: { + activePage: DashboardState_ActivePage.DIMENSION_TABLE, + selectedTimeRange: { + name: "rill-PDC", + } as DashboardTimeControls, + + visibleMeasures: [AD_BIDS_IMPRESSIONS_MEASURE], + allMeasuresVisible: false, + visibleDimensions: [AD_BIDS_PUBLISHER_DIMENSION], + allDimensionsVisible: false, + selectedDimensionName: AD_BIDS_PUBLISHER_DIMENSION, + }, + }, + { title: "single measure and dimensions with additional time dimension", query: { @@ -316,13 +390,19 @@ describe("mapMetricsResolverQueryToDashboard", () => { }, ]; - for (const { title, query, expectedPartialExplore } of TestCases) { + for (const { + title, + query, + resolvedTimeRanges, + expectedPartialExplore, + } of TestCases) { it(title, () => { expect( mapMetricsResolverQueryToDashboard( AD_BIDS_METRICS_3_MEASURES_DIMENSIONS_WITH_TIME, AD_BIDS_EXPLORE_WITH_3_MEASURES_DIMENSIONS_TIME_DIMENSION, query, + resolvedTimeRanges ?? [], ), ).toEqual(expectedPartialExplore); }); diff --git a/web-common/src/features/explore-mappers/open-query.ts b/web-common/src/features/explore-mappers/open-query.ts index 88d14c2ae8a3..5566a279d1bb 100644 --- a/web-common/src/features/explore-mappers/open-query.ts +++ b/web-common/src/features/explore-mappers/open-query.ts @@ -15,7 +15,10 @@ import { type V1MetricsViewTimeRangeResponse, } from "@rilldata/web-common/runtime-client"; import type { RuntimeClient } from "@rilldata/web-common/runtime-client/v2"; -import type { Schema as MetricsResolverQuery } from "@rilldata/web-common/runtime-client/gen/resolvers/metrics/schema.ts"; +import type { + Schema as MetricsResolverQuery, + TimeRange, +} from "@rilldata/web-common/runtime-client/gen/resolvers/metrics/schema.ts"; import { error, redirect } from "@sveltejs/kit"; import { getTimeControlState } from "@rilldata/web-common/features/dashboards/time-controls/time-control-store.ts"; import { convertPartialExploreStateToUrlParams } from "@rilldata/web-common/features/dashboards/url-state/convert-partial-explore-state-to-url-params.ts"; @@ -24,11 +27,13 @@ import { ExploreLinkErrorType } from "@rilldata/web-common/features/explore-mapp export async function openQuery({ query, + resolvedTimeRanges, organization, project, client, }: { query: MetricsResolverQuery; + resolvedTimeRanges: TimeRange[]; client: RuntimeClient; organization?: string; project?: string; @@ -58,7 +63,7 @@ export async function openQuery({ metricsViewSpec, exploreSpec, query, - [], // TODO + resolvedTimeRanges, ); // Generate the final explore URL diff --git a/web-common/src/proto/gen/rill/runtime/v1/api_pb.ts b/web-common/src/proto/gen/rill/runtime/v1/api_pb.ts index b4dcba772052..5f475c87b8e1 100644 --- a/web-common/src/proto/gen/rill/runtime/v1/api_pb.ts +++ b/web-common/src/proto/gen/rill/runtime/v1/api_pb.ts @@ -5311,6 +5311,11 @@ export class GetAIMessageResponse extends Message$1 { */ message?: Message; + /** + * @generated from field: rill.runtime.v1.Message result = 2; + */ + result?: Message; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -5320,6 +5325,7 @@ export class GetAIMessageResponse extends Message$1 { static readonly typeName = "rill.runtime.v1.GetAIMessageResponse"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "message", kind: "message", T: Message }, + { no: 2, name: "result", kind: "message", T: Message }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): GetAIMessageResponse { diff --git a/web-common/src/runtime-client/gen/index.schemas.ts b/web-common/src/runtime-client/gen/index.schemas.ts index 96ab9c038b9c..aad2f8be5e35 100644 --- a/web-common/src/runtime-client/gen/index.schemas.ts +++ b/web-common/src/runtime-client/gen/index.schemas.ts @@ -1101,6 +1101,7 @@ export interface V1GenerateResolverResponse { export interface V1GetAIMessageResponse { message?: V1Message; + result?: V1Message; } export interface V1GetConversationResponse { diff --git a/web-local/src/routes/(viz)/-/ai/[conversationId]/message/[messageId]/+layout.ts b/web-local/src/routes/(viz)/-/ai/[conversationId]/message/[messageId]/+layout.ts index 16ad8fa4c436..b1dc8f7f97f5 100644 --- a/web-local/src/routes/(viz)/-/ai/[conversationId]/message/[messageId]/+layout.ts +++ b/web-local/src/routes/(viz)/-/ai/[conversationId]/message/[messageId]/+layout.ts @@ -4,7 +4,7 @@ import { fetchMessage } from "@rilldata/web-common/features/chat/core/citation-u export async function load({ params: { conversationId, messageId } }) { const client = getLocalRuntimeClient(); - const message = await fetchMessage( + const { message, result } = await fetchMessage( { host: client.host, instanceId: client.instanceId }, conversationId, messageId, @@ -12,5 +12,6 @@ export async function load({ params: { conversationId, messageId } }) { return { message, + result, }; } diff --git a/web-local/src/routes/(viz)/-/ai/[conversationId]/message/[messageId]/-/open/+page.ts b/web-local/src/routes/(viz)/-/ai/[conversationId]/message/[messageId]/-/open/+page.ts index fa42b7b8da62..46aa30bc6e84 100644 --- a/web-local/src/routes/(viz)/-/ai/[conversationId]/message/[messageId]/-/open/+page.ts +++ b/web-local/src/routes/(viz)/-/ai/[conversationId]/message/[messageId]/-/open/+page.ts @@ -1,15 +1,20 @@ import { getLocalRuntimeClient } from "../../../../../../../../../lib/runtime-client"; -import { maybeGetMetricsResolverQueryFromMessage } from "@rilldata/web-common/features/chat/core/citation-url-utils.ts"; +import { + getResolvedTimeRangesFromMessage, + maybeGetMetricsResolverQueryFromMessage, +} from "@rilldata/web-common/features/chat/core/citation-url-utils.ts"; import { openQuery } from "@rilldata/web-common/features/explore-mappers/open-query.ts"; export async function load({ parent }) { - const { message } = await parent(); + const { message, result } = await parent(); const query = maybeGetMetricsResolverQueryFromMessage(message); + const resolvedTimeRanges = getResolvedTimeRangesFromMessage(result); const client = getLocalRuntimeClient(); await openQuery({ query, + resolvedTimeRanges, client, }); } diff --git a/web-local/src/routes/(viz)/-/open-query/+page.ts b/web-local/src/routes/(viz)/-/open-query/+page.ts index 4d45ec195c77..6913e8bc82d6 100644 --- a/web-local/src/routes/(viz)/-/open-query/+page.ts +++ b/web-local/src/routes/(viz)/-/open-query/+page.ts @@ -7,6 +7,7 @@ export async function load({ url }) { await openQuery({ query, + resolvedTimeRanges: [], client: getLocalRuntimeClient(), }); } From c3d252654d6a3859521a876309d2365e5ac33e48 Mon Sep 17 00:00:00 2001 From: Aditya Hegde Date: Tue, 26 May 2026 20:19:11 +0530 Subject: [PATCH 7/8] self review --- runtime/ai/metrics_view_query.go | 99 +++++++++---------- runtime/server/chat.go | 16 +-- .../message/[messageId]/-/open/+page.ts | 4 +- .../features/chat/core/citation-url-utils.ts | 8 +- .../core/messages/text/citation-url-mapper.ts | 12 +-- .../message/[messageId]/-/open/+page.ts | 4 +- 6 files changed, 70 insertions(+), 73 deletions(-) diff --git a/runtime/ai/metrics_view_query.go b/runtime/ai/metrics_view_query.go index 61c273deb67a..6fcb4c55c15a 100644 --- a/runtime/ai/metrics_view_query.go +++ b/runtime/ai/metrics_view_query.go @@ -10,6 +10,7 @@ import ( "github.com/google/jsonschema-go/jsonschema" "github.com/modelcontextprotocol/go-sdk/mcp" + runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" "github.com/rilldata/rill/runtime" "github.com/rilldata/rill/runtime/metricsview" "github.com/rilldata/rill/runtime/pkg/mapstructureutil" @@ -29,11 +30,11 @@ var _ Tool[QueryMetricsViewArgs, *QueryMetricsViewResult] = (*QueryMetricsView)( type QueryMetricsViewArgs map[string]any type QueryMetricsViewResult struct { - Schema []SchemaField `json:"schema"` - Data [][]any `json:"data"` - ResolvedTimeRanges []metricsview.TimeRange `json:"resolved_time_ranges,omitempty"` - OpenURL string `json:"open_url,omitempty"` - TruncationWarning string `json:"truncation_warning,omitempty"` + Schema []SchemaField `json:"schema"` + Data [][]any `json:"data"` + ResolvedTimeRanges []*metricsview.TimeRange `json:"resolved_time_ranges,omitempty"` + OpenURL string `json:"open_url,omitempty"` + TruncationWarning string `json:"truncation_warning,omitempty"` } func (t *QueryMetricsView) Spec() *mcp.Tool { @@ -334,7 +335,7 @@ func (t *QueryMetricsView) generateOpenURL(ctx context.Context, instanceID, sess return openURL.String(), nil } -func (t *QueryMetricsView) resolveTimeRanges(ctx context.Context, session *Session, args map[string]any) ([]metricsview.TimeRange, error) { +func (t *QueryMetricsView) resolveTimeRanges(ctx context.Context, session *Session, args map[string]any) ([]*metricsview.TimeRange, error) { qry := &metricsview.Query{} if err := mapstructureutil.WeakDecode(args, qry); err != nil { return nil, err @@ -362,56 +363,50 @@ func (t *QueryMetricsView) resolveTimeRanges(ctx context.Context, session *Sessi } } - now := time.Now().In(tz) - - var resolvedTimeRanges []metricsview.TimeRange - if qry.TimeRange.Expression != "" { - expr, err := rilltime.Parse(qry.TimeRange.Expression, rilltime.ParseOptions{ - TimeZoneOverride: tz, - SmallestGrain: timeutil.TimeGrainFromAPI(mvSpec.SmallestTimeGrain), - }) - if err != nil { - return nil, fmt.Errorf("error parsing time range %s: %w", qry.TimeRange.Expression, err) - } + var resolvedTimeRanges []*metricsview.TimeRange + tr, err := evalTimeRangeExpr(mvSpec, qry.TimeRange, ts, tz) + if err != nil { + return nil, err + } + if tr != nil { + resolvedTimeRanges = append(resolvedTimeRanges, tr) + } - start, end, _ := expr.Eval(rilltime.EvalOptions{ - Now: now, - MinTime: ts.Min, - MaxTime: ts.Max, - Watermark: ts.Watermark, - FirstDay: int(mvSpec.FirstDayOfWeek), - FirstMonth: int(mvSpec.FirstMonthOfYear), - }) - resolvedTimeRanges = append(resolvedTimeRanges, metricsview.TimeRange{ - Expression: qry.TimeRange.Expression, - Start: start, - End: end, - }) + ctr, err := evalTimeRangeExpr(mvSpec, qry.ComparisonTimeRange, ts, tz) + if err != nil { + return nil, err + } + if ctr != nil { + resolvedTimeRanges = append(resolvedTimeRanges, ctr) } - if qry.ComparisonTimeRange != nil && qry.ComparisonTimeRange.Expression != "" { - expr, err := rilltime.Parse(qry.ComparisonTimeRange.Expression, rilltime.ParseOptions{ - TimeZoneOverride: tz, - SmallestGrain: timeutil.TimeGrainFromAPI(mvSpec.SmallestTimeGrain), - }) - if err != nil { - return nil, fmt.Errorf("error parsing time range %s: %w", qry.TimeRange.Expression, err) - } + return resolvedTimeRanges, nil +} - start, end, _ := expr.Eval(rilltime.EvalOptions{ - Now: now, - MinTime: ts.Min, - MaxTime: ts.Max, - Watermark: ts.Watermark, - FirstDay: int(mvSpec.FirstDayOfWeek), - FirstMonth: int(mvSpec.FirstMonthOfYear), - }) - resolvedTimeRanges = append(resolvedTimeRanges, metricsview.TimeRange{ - Expression: qry.ComparisonTimeRange.Expression, - Start: start, - End: end, - }) +func evalTimeRangeExpr(mvSpec *runtimev1.MetricsViewSpec, timeRange *metricsview.TimeRange, ts metricsview.TimestampsResult, tz *time.Location) (*metricsview.TimeRange, error) { + if timeRange == nil || timeRange.Expression == "" { + return nil, nil } - return resolvedTimeRanges, nil + expr, err := rilltime.Parse(timeRange.Expression, rilltime.ParseOptions{ + TimeZoneOverride: tz, + SmallestGrain: timeutil.TimeGrainFromAPI(mvSpec.SmallestTimeGrain), + }) + if err != nil { + return nil, fmt.Errorf("error parsing time range %s: %w", timeRange.Expression, err) + } + + start, end, _ := expr.Eval(rilltime.EvalOptions{ + Now: time.Now(), + MinTime: ts.Min, + MaxTime: ts.Max, + Watermark: ts.Watermark, + FirstDay: int(mvSpec.FirstDayOfWeek), + FirstMonth: int(mvSpec.FirstMonthOfYear), + }) + return &metricsview.TimeRange{ + Expression: timeRange.Expression, + Start: start, + End: end, + }, nil } diff --git a/runtime/server/chat.go b/runtime/server/chat.go index d7384bebd24b..61467379b994 100644 --- a/runtime/server/chat.go +++ b/runtime/server/chat.go @@ -558,14 +558,14 @@ func (s *Server) GetAIMessage(ctx context.Context, req *runtimev1.GetAIMessageRe return nil, status.Errorf(codes.Internal, "failed to convert message to protobuf: %v", err) } - resMsg, ok := session.Message(ai.FilterByParent(req.MessageId)) - if !ok { - return nil, status.Errorf(codes.NotFound, "result message for %q not found in conversation %q", req.MessageId, req.ConversationId) - } - - resPbMsg, err := messageToPB(session, resMsg) - if err != nil { - return nil, status.Errorf(codes.Internal, "failed to convert message to protobuf: %v", err) + var resPbMsg *runtimev1.Message + resMsg, ok := session.Message(ai.FilterByParent(req.MessageId), ai.FilterByType(ai.MessageTypeResult)) + // Don't throw if there is no result message. + if ok { + resPbMsg, err = messageToPB(session, resMsg) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to convert message to protobuf: %v", err) + } } return &runtimev1.GetAIMessageResponse{ diff --git a/web-admin/src/routes/[organization]/[project]/-/ai/[conversationId]/message/[messageId]/-/open/+page.ts b/web-admin/src/routes/[organization]/[project]/-/ai/[conversationId]/message/[messageId]/-/open/+page.ts index f763e0633b18..ed7a5f49f36c 100644 --- a/web-admin/src/routes/[organization]/[project]/-/ai/[conversationId]/message/[messageId]/-/open/+page.ts +++ b/web-admin/src/routes/[organization]/[project]/-/ai/[conversationId]/message/[messageId]/-/open/+page.ts @@ -10,7 +10,9 @@ export async function load({ parent, params: { organization, project } }) { const client = getCloudRuntimeClient(runtime); const query = maybeGetMetricsResolverQueryFromMessage(message); - const resolvedTimeRanges = getResolvedTimeRangesFromMessage(result); + const resolvedTimeRanges = result + ? getResolvedTimeRangesFromMessage(result) + : []; await openQuery({ query, diff --git a/web-common/src/features/chat/core/citation-url-utils.ts b/web-common/src/features/chat/core/citation-url-utils.ts index bf5e14019ae5..0cbc329caae9 100644 --- a/web-common/src/features/chat/core/citation-url-utils.ts +++ b/web-common/src/features/chat/core/citation-url-utils.ts @@ -41,7 +41,7 @@ export async function fetchMessage( // 200 response should always have a message. return { message: toolCallResp.message!, - result: toolCallResp.result!, + result: toolCallResp.result, }; } catch (e) { const apiError = e.response?.data?.message; @@ -78,11 +78,11 @@ export function maybeGetMetricsResolverQueryFromMessage(message: V1Message) { } export function getResolvedTimeRangesFromMessage( - message: V1Message, + resultMessage: V1Message, ): TimeRange[] { try { - const resultData = JSON.parse(message.contentData ?? "{}"); - return resultData.resolved_time_ranges; + const resultData = JSON.parse(resultMessage.contentData ?? "{}"); + return resultData.resolved_time_ranges ?? []; } catch (e) { console.error("Failed to parse result message JSON", e); } diff --git a/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts b/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts index bc03aabda9db..f652132ebfbe 100644 --- a/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts +++ b/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts @@ -9,7 +9,10 @@ import type { Schema as MetricsResolverQuery, TimeRange, } from "@rilldata/web-common/runtime-client/gen/resolvers/metrics/schema.ts"; -import { getQueryFromUrl } from "@rilldata/web-common/features/chat/core/citation-url-utils.ts"; +import { + getQueryFromUrl, + getResolvedTimeRangesFromMessage, +} from "@rilldata/web-common/features/chat/core/citation-url-utils.ts"; import { mapMetricsResolverQueryToDashboard } from "@rilldata/web-common/features/explore-mappers/map-metrics-resolver-query-to-dashboard.ts"; import { maybeGetExplorePageUrlSearchParams } from "@rilldata/web-common/features/explore-mappers/utils.ts"; import { getUrlForExplore } from "@rilldata/web-common/features/explore-mappers/generate-explore-link.ts"; @@ -121,12 +124,7 @@ export function mapMetricsResolverQueryToUrl( const resultMessage = messages.find((m) => m.parentId === callId); if (resultMessage?.contentData) { - try { - const resultData = JSON.parse(resultMessage.contentData); - resolvedTimeRanges.push(...resultData.resolved_time_ranges); - } catch (e) { - console.error("Failed to parse result message JSON", e); - } + resolvedTimeRanges.push(...getResolvedTimeRangesFromMessage(resultMessage)); } } diff --git a/web-local/src/routes/(viz)/-/ai/[conversationId]/message/[messageId]/-/open/+page.ts b/web-local/src/routes/(viz)/-/ai/[conversationId]/message/[messageId]/-/open/+page.ts index 46aa30bc6e84..e87dbfa0638c 100644 --- a/web-local/src/routes/(viz)/-/ai/[conversationId]/message/[messageId]/-/open/+page.ts +++ b/web-local/src/routes/(viz)/-/ai/[conversationId]/message/[messageId]/-/open/+page.ts @@ -9,7 +9,9 @@ export async function load({ parent }) { const { message, result } = await parent(); const query = maybeGetMetricsResolverQueryFromMessage(message); - const resolvedTimeRanges = getResolvedTimeRangesFromMessage(result); + const resolvedTimeRanges = result + ? getResolvedTimeRangesFromMessage(result) + : []; const client = getLocalRuntimeClient(); await openQuery({ From fdcf97ce3206bf71532485c0a894f2bc077fc3b5 Mon Sep 17 00:00:00 2001 From: Aditya Hegde Date: Wed, 27 May 2026 09:54:35 +0530 Subject: [PATCH 8/8] Add a couple of backend tests --- runtime/ai/metrics_view_query_test.go | 79 +++++++++++++++++++ runtime/server/chat_test.go | 1 + .../core/messages/text/citation-url-mapper.ts | 4 +- 3 files changed, 83 insertions(+), 1 deletion(-) diff --git a/runtime/ai/metrics_view_query_test.go b/runtime/ai/metrics_view_query_test.go index bb5b2fb7b414..7860f3998fb0 100644 --- a/runtime/ai/metrics_view_query_test.go +++ b/runtime/ai/metrics_view_query_test.go @@ -175,3 +175,82 @@ cache: require.Equal(t, nil, res.Data[0][0]) require.Equal(t, nil, res.Data[0][1]) } + +func TestMetricsViewQueryResolvedTimeRanges(t *testing.T) { + // Setup a metrics view with a time dimension. The watermark defaults to the max event_time, i.e. 2025-05-13T00:00:00Z. + rt, instanceID := testruntime.NewInstanceWithOptions(t, testruntime.InstanceOptions{ + Files: map[string]string{ + "test_data.sql": ` +SELECT '2025-05-10T00:00:00Z'::TIMESTAMP AS event_time, 'US' AS country, 100 AS revenue +UNION ALL +SELECT '2025-05-11T00:00:00Z'::TIMESTAMP AS event_time, 'US' AS country, 200 AS revenue +UNION ALL +SELECT '2025-05-12T00:00:00Z'::TIMESTAMP AS event_time, 'US' AS country, 300 AS revenue +UNION ALL +SELECT '2025-05-13T00:00:00Z'::TIMESTAMP AS event_time, 'US' AS country, 400 AS revenue +`, + "test_metrics.yaml": ` +type: metrics_view +model: test_data +timeseries: event_time +dimensions: +- column: country +measures: +- name: total_revenue + expression: SUM(revenue) +explore: + skip: true +`, + }, + Variables: map[string]string{ + "rill.ai.require_time_range": "false", + }, + }) + testruntime.RequireReconcileState(t, rt, instanceID, 3, 0, 0) + + s := newSession(t, rt, instanceID) + + baseArgs := func() ai.QueryMetricsViewArgs { + return ai.QueryMetricsViewArgs{ + "metrics_view": "test_metrics", + "dimensions": []map[string]any{{"name": "country"}}, + "measures": []map[string]any{{"name": "total_revenue"}}, + } + } + + t.Run("no time range", func(t *testing.T) { + var res *ai.QueryMetricsViewResult + _, err := s.CallTool(t.Context(), ai.RoleUser, ai.QueryMetricsViewName, &res, baseArgs()) + require.NoError(t, err) + require.Nil(t, res.ResolvedTimeRanges) + }) + + t.Run("literal start/end time range", func(t *testing.T) { + args := baseArgs() + args["time_range"] = map[string]any{ + "start": "2025-05-10T00:00:00Z", + "end": "2025-05-14T00:00:00Z", + } + var res *ai.QueryMetricsViewResult + _, err := s.CallTool(t.Context(), ai.RoleUser, ai.QueryMetricsViewName, &res, args) + require.NoError(t, err) + // Only expression-based time ranges are recorded in ResolvedTimeRanges. + require.Nil(t, res.ResolvedTimeRanges) + }) + + t.Run("expression time range and comparison", func(t *testing.T) { + args := baseArgs() + args["time_range"] = map[string]any{"expression": "1D as of watermark/D"} + args["comparison_time_range"] = map[string]any{"expression": "1D as of watermark/D offset -1D"} + var res *ai.QueryMetricsViewResult + _, err := s.CallTool(t.Context(), ai.RoleUser, ai.QueryMetricsViewName, &res, args) + require.NoError(t, err) + require.Len(t, res.ResolvedTimeRanges, 2) + require.Equal(t, "1D as of watermark/D", res.ResolvedTimeRanges[0].Expression) + require.Equal(t, parseTestTime(t, "2025-05-12T00:00:00Z"), res.ResolvedTimeRanges[0].Start) + require.Equal(t, parseTestTime(t, "2025-05-13T00:00:00Z"), res.ResolvedTimeRanges[0].End) + require.Equal(t, "1D as of watermark/D offset -1D", res.ResolvedTimeRanges[1].Expression) + require.Equal(t, parseTestTime(t, "2025-05-11T00:00:00Z"), res.ResolvedTimeRanges[1].Start) + require.Equal(t, parseTestTime(t, "2025-05-12T00:00:00Z"), res.ResolvedTimeRanges[1].End) + }) +} diff --git a/runtime/server/chat_test.go b/runtime/server/chat_test.go index 05d066877ccf..b0ad06dc633c 100644 --- a/runtime/server/chat_test.go +++ b/runtime/server/chat_test.go @@ -159,6 +159,7 @@ measures: }) require.NoError(t, err) require.Equal(t, res1.Messages[0], msgRes.Message) + require.Equal(t, res1.Messages[5], msgRes.Result) // Check it errors if completing a conversation that doesn't exist _, err = srv.Complete(fooCtx, &runtimev1.CompleteRequest{ diff --git a/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts b/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts index f652132ebfbe..f61765b133fa 100644 --- a/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts +++ b/web-common/src/features/chat/core/messages/text/citation-url-mapper.ts @@ -124,7 +124,9 @@ export function mapMetricsResolverQueryToUrl( const resultMessage = messages.find((m) => m.parentId === callId); if (resultMessage?.contentData) { - resolvedTimeRanges.push(...getResolvedTimeRangesFromMessage(resultMessage)); + resolvedTimeRanges.push( + ...getResolvedTimeRangesFromMessage(resultMessage), + ); } }